ZGlmZiAtLWdpdCBhLy5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLm1kIGIvLmdpdGh1Yi9QVUxMX1JFUVVFU1RfVEVNUExBVEUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlODBkOAotLS0gL2Rldi9udWxsCisrKyBiLy5naXRodWIvUFVMTF9SRVFVRVNUX1RFTVBMQVRFLm1kCkBAIC0wLDAgKzEsOSBAQAorIyMgQ1B5dGhvbiBNaXJyb3IKKworaHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi9jcHl0aG9uIGlzIGEgY3B5dGhvbiBtaXJyb3IgcmVwb3NpdG9yeS4gUHVsbCByZXF1ZXN0cworYXJlIG5vdCBhY2NlcHRlZCBvbiB0aGlzIHJlcG8gYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBjbG9zZWQuCisKKyMjIyBTdWJtaXQgcGF0Y2hlcyBhdCBodHRwczovL2J1Z3MucHl0aG9uLm9yZworCitGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBjb250cmlidXRpbmcgdG8gQ1B5dGhvbiwgc2VlIHRoZQorW2RldmVsb3BlcidzIGd1aWRlXShodHRwczovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8jY29udHJpYnV0aW5nKS4KZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IGMyYjRmYzcuLmE5NDY1OTYgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtOTMsMyArOTMsNCBAQAogVG9vbHMvbXNpL29iagogVG9vbHMvc3NsL2FtZDY0CiBUb29scy9zc2wvd2luMzIKKy52c2NvZGUvCmRpZmYgLS1naXQgYS8uaGdpZ25vcmUgYi8uaGdpZ25vcmUKaW5kZXggNThjNzNmYy4uMTUyNzljZCAxMDA2NDQKLS0tIGEvLmhnaWdub3JlCisrKyBiLy5oZ2lnbm9yZQpAQCAtMiw2ICsyLDcgQEAKIC5wdXJpZnkKIC5zdm4vCiBeLmlkZWEvCiteLnZzY29kZS8KIC5EU19TdG9yZQogTWFrZWZpbGUkCiBNYWtlZmlsZS5wcmUkCmRpZmYgLS1naXQgYS8uaGd0YWdzIGIvLmhndGFncwppbmRleCBlZDRmYzkyLi5hMDcwYmVhIDEwMDY0NAotLS0gYS8uaGd0YWdzCisrKyBiLy5oZ3RhZ3MKQEAgLTE0OCw2ICsxNDgsNyBAQAogNzM3ZWZjYWRmNWE2NzhiMTg0ZTBmYTQzMWFhZTExMjc2YmYwNjY0OCB2My40LjQKIDM2MzFiYjRhMjQ5MDI5MmViZjgxZDNlOTQ3YWUzNmRhMTQ1ZGE1NjQgdjMuNC41cmMxCiA2MTliNjFlNTA1ZDBlMmNjYzg1MTZiMzY2ZTRkZGQxOTcxYjQ2YTZmIHYzLjQuNQorMzYzMWJiNGEyNDkwMjkyZWJmODFkM2U5NDdhZTM2ZGExNDVkYTU2NCB2My40LjVyYzEKIDVkNGI2YTU3ZDVmZDc1NjRiZjczZjNkYjBlNDZmZTVlZWIwMGJjZDggdjMuNS4wYTEKIDAzMzdiZDdlYmNiNjU1OWQ2OTY3OWJjNzAyNTA1OWFkMWNlNGY0MzIgdjMuNS4wYTIKIDgyNjU2ZTI4YjVlNWM0YWU0OGQ4ZGQ4YjVmMGQ3OTY4OTA4YTgyYjYgdjMuNS4wYTMKQEAgLTE2NSwzICsxNjYsNiBAQAogMzdhMDdjZWU1OTY5ZTZkMzY3MjU4MzE4N2E3M2NmNjM2ZmYyOGUxYiB2My41LjEKIDY4ZmVlYzY0ODhiMjYzMjdhODVhNjM0NjA1ZGQyOGVjYTRkYWE1ZjEgdjMuNS4ycmMxCiA0ZGVmMmEyOTAxYTU2MThlYTQ1YmNjOGYyYTE0MTFlZjMzYWYxOGFkIHYzLjUuMgorNTg5NmRhMzcyZmIwNDRlMzg1OTVmYjc0NDk1ZGUxZTFlN2M4ZmIzYyB2My42LjBhMQorMzc4ODkzNDIzNTUyMjNlMmZjMTQzOGRlM2RjN2ZmY2Q2MjVjNjBmNyB2My42LjBhMgorZjNlZGYxM2RjMzM5Yjg5NDJhZTZiMzA5NzcxYWIxOTdkZDhjZTZmYSB2My42LjBhMwpkaWZmIC0tZ2l0IGEvRG9jL01ha2VmaWxlIGIvRG9jL01ha2VmaWxlCmluZGV4IDg3ODY4NWQuLjIwMmU4ZTEgMTAwNjQ0Ci0tLSBhL0RvYy9NYWtlZmlsZQorKysgYi9Eb2MvTWFrZWZpbGUKQEAgLTE1Myw3ICsxNTMsNyBAQAogCWNwIC1wUFIgYnVpbGQvZXB1Yi9QeXRob24uZXB1YiBkaXN0L3B5dGhvbi0kKERJU1RWRVJTSU9OKS1kb2NzLmVwdWIKIAogY2hlY2s6Ci0JJChQWVRIT04pIHRvb2xzL3JzdGxpbnQucHkgLWkgdG9vbHMKKwkkKFBZVEhPTikgdG9vbHMvcnN0bGludC5weSAtaSB0b29scyAtaSB2ZW52CiAKIHNlcnZlOgogCS4uL1Rvb2xzL3NjcmlwdHMvc2VydmUucHkgYnVpbGQvaHRtbApkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2FyZy5yc3QgYi9Eb2MvYy1hcGkvYXJnLnJzdAppbmRleCA2ZDQ5M2FhLi4xNzg5MmQ2IDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvYXJnLnJzdAorKysgYi9Eb2MvYy1hcGkvYXJnLnJzdApAQCAtMjE4LDggKzIxOCw3IEBACiAgICA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlYCB3aWxsIHVzZSB0aGlzIGxvY2F0aW9uIGFzIHRoZSBidWZmZXIgYW5kIGludGVycHJldCB0aGUKICAgIGluaXRpYWwgdmFsdWUgb2YgKlwqYnVmZmVyX2xlbmd0aCogYXMgdGhlIGJ1ZmZlciBzaXplLiAgSXQgd2lsbCB0aGVuIGNvcHkgdGhlCiAgICBlbmNvZGVkIGRhdGEgaW50byB0aGUgYnVmZmVyIGFuZCBOVUwtdGVybWluYXRlIGl0LiAgSWYgdGhlIGJ1ZmZlciBpcyBub3QgbGFyZ2UKLSAgIGVub3VnaCwgYSA6ZXhjOmBUeXBlRXJyb3JgIHdpbGwgYmUgc2V0LgotICAgTm90ZTogc3RhcnRpbmcgZnJvbSBQeXRob24gMy42IGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSBzZXQuCisgICBlbm91Z2gsIGEgOmV4YzpgVmFsdWVFcnJvcmAgd2lsbCBiZSBzZXQuCiAKICAgIEluIGJvdGggY2FzZXMsICpcKmJ1ZmZlcl9sZW5ndGgqIGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIGRhdGEKICAgIHdpdGhvdXQgdGhlIHRyYWlsaW5nIE5VTCBieXRlLgpAQCAtNDE5LDggKzQxOCwxNSBAQAogLi4gYzpmdW5jdGlvbjo6IGludCBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdywgY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyICprZXl3b3Jkc1tdLCAuLi4pCiAKICAgIFBhcnNlIHRoZSBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBib3RoIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQKLSAgIHBhcmFtZXRlcnMgaW50byBsb2NhbCB2YXJpYWJsZXMuICBSZXR1cm5zIHRydWUgb24gc3VjY2Vzczsgb24gZmFpbHVyZSwgaXQKLSAgIHJldHVybnMgZmFsc2UgYW5kIHJhaXNlcyB0aGUgYXBwcm9wcmlhdGUgZXhjZXB0aW9uLgorICAgcGFyYW1ldGVycyBpbnRvIGxvY2FsIHZhcmlhYmxlcy4gIFRoZSAqa2V5d29yZHMqIGFyZ3VtZW50IGlzIGEKKyAgICpOVUxMKi10ZXJtaW5hdGVkIGFycmF5IG9mIGtleXdvcmQgcGFyYW1ldGVyIG5hbWVzLiAgRW1wdHkgbmFtZXMgZGVub3RlCisgICA6cmVmOmBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycyA8cG9zaXRpb25hbC1vbmx5X3BhcmFtZXRlcj5gLgorICAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3M7IG9uIGZhaWx1cmUsIGl0IHJldHVybnMgZmFsc2UgYW5kIHJhaXNlcyB0aGUKKyAgIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIDpyZWY6YHBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzCisgICAgICA8cG9zaXRpb25hbC1vbmx5X3BhcmFtZXRlcj5gLgogCiAKIC4uIGM6ZnVuY3Rpb246OiBpbnQgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdywgY29uc3QgY2hhciAqZm9ybWF0LCBjaGFyICprZXl3b3Jkc1tdLCB2YV9saXN0IHZhcmdzKQpkaWZmIC0tZ2l0IGEvRG9jL2MtYXBpL2V4Y2VwdGlvbnMucnN0IGIvRG9jL2MtYXBpL2V4Y2VwdGlvbnMucnN0CmluZGV4IDE5Y2JiM2IuLjIyNmI2MTkgMTAwNjQ0Ci0tLSBhL0RvYy9jLWFwaS9leGNlcHRpb25zLnJzdAorKysgYi9Eb2MvYy1hcGkvZXhjZXB0aW9ucy5yc3QKQEAgLTMzNCw2ICszMzQsMTQgQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCiAKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlFcnJfUmVzb3VyY2VXYXJuaW5nKFB5T2JqZWN0ICpzb3VyY2UsIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCisgICBGdW5jdGlvbiBzaW1pbGFyIHRvIDpjOmZ1bmM6YFB5RXJyX1dhcm5Gb3JtYXRgLCBidXQgKmNhdGVnb3J5KiBpcworICAgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCBhbmQgcGFzcyAqc291cmNlKiB0byA6ZnVuYzpgd2FybmluZ3MuV2FybmluZ01lc3NhZ2VgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCiBRdWVyeWluZyB0aGUgZXJyb3IgaW5kaWNhdG9yCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9pbXBvcnQucnN0IGIvRG9jL2MtYXBpL2ltcG9ydC5yc3QKaW5kZXggMjkzNmY0Zi4uNWEwODNjZSAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2ltcG9ydC5yc3QKKysrIGIvRG9jL2MtYXBpL2ltcG9ydC5yc3QKQEAgLTIwNywxMyArMjA3LDEzIEBACiAKIC4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlJbXBvcnRfR2V0SW1wb3J0ZXIoUHlPYmplY3QgKnBhdGgpCiAKLSAgIFJldHVybiBhbiBpbXBvcnRlciBvYmplY3QgZm9yIGEgOmRhdGE6YHN5cy5wYXRoYC86YXR0cjpgcGtnLl9fcGF0aF9fYCBpdGVtCisgICBSZXR1cm4gYSBmaW5kZXIgb2JqZWN0IGZvciBhIDpkYXRhOmBzeXMucGF0aGAvOmF0dHI6YHBrZy5fX3BhdGhfX2AgaXRlbQogICAgKnBhdGgqLCBwb3NzaWJseSBieSBmZXRjaGluZyBpdCBmcm9tIHRoZSA6ZGF0YTpgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgCiAgICBkaWN0LiAgSWYgaXQgd2Fzbid0IHlldCBjYWNoZWQsIHRyYXZlcnNlIDpkYXRhOmBzeXMucGF0aF9ob29rc2AgdW50aWwgYSBob29rCiAgICBpcyBmb3VuZCB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhdGggaXRlbS4gIFJldHVybiBgYE5vbmVgYCBpZiBubyBob29rIGNvdWxkOwotICAgdGhpcyB0ZWxscyBvdXIgY2FsbGVyIGl0IHNob3VsZCBmYWxsIGJhY2sgdG8gdGhlIGJ1aWx0LWluIGltcG9ydCBtZWNoYW5pc20uCi0gICBDYWNoZSB0aGUgcmVzdWx0IGluIDpkYXRhOmBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWAuICBSZXR1cm4gYSBuZXcgcmVmZXJlbmNlCi0gICB0byB0aGUgaW1wb3J0ZXIgb2JqZWN0LgorICAgdGhpcyB0ZWxscyBvdXIgY2FsbGVyIHRoYXQgdGhlIDp0ZXJtOmBwYXRoIGJhc2VkIGZpbmRlcmAgY291bGQgbm90IGZpbmQgYQorICAgZmluZGVyIGZvciB0aGlzIHBhdGggaXRlbS4gQ2FjaGUgdGhlIHJlc3VsdCBpbiA6ZGF0YTpgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgLgorICAgUmV0dXJuIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgZmluZGVyIG9iamVjdC4KIAogCiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBfUHlJbXBvcnRfSW5pdCgpCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvaW5pdC5yc3QgYi9Eb2MvYy1hcGkvaW5pdC5yc3QKaW5kZXggNjM5ODE5Yy4uZDc3ODM2YSAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL2luaXQucnN0CisrKyBiL0RvYy9jLWFwaS9pbml0LnJzdApAQCAtMjUsNyArMjUsNyBAQAogICAgICAgdHJpcGxlOiBtb2R1bGU7IHNlYXJjaDsgcGF0aAogICAgICAgc2luZ2xlOiBQeVN5c19TZXRBcmd2KCkKICAgICAgIHNpbmdsZTogUHlTeXNfU2V0QXJndkV4KCkKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKIAogICAgSW5pdGlhbGl6ZSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgSW4gYW4gYXBwbGljYXRpb24gZW1iZWRkaW5nICBQeXRob24sIHRoaXMKICAgIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIGFueSBvdGhlciBQeXRob24vQyBBUEkgZnVuY3Rpb25zOyB3aXRoIHRoZQpAQCAtMzQsNyArMzQsNyBAQAogICAgbW9kdWxlcyA6bW9kOmBidWlsdGluc2AsIDptb2Q6YF9fbWFpbl9fYCBhbmQgOm1vZDpgc3lzYC4gIEl0IGFsc28gaW5pdGlhbGl6ZXMKICAgIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggKGBgc3lzLnBhdGhgYCkuIEl0IGRvZXMgbm90IHNldCBgYHN5cy5hcmd2YGA7IHVzZQogICAgOmM6ZnVuYzpgUHlTeXNfU2V0QXJndkV4YCBmb3IgdGhhdC4gIFRoaXMgaXMgYSBuby1vcCB3aGVuIGNhbGxlZCBmb3IgYSBzZWNvbmQgdGltZQotICAgKHdpdGhvdXQgY2FsbGluZyA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgZmlyc3QpLiAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlOyBpdCBpcyBhCisgICAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGZpcnN0KS4gIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZTsgaXQgaXMgYQogICAgZmF0YWwgZXJyb3IgaWYgdGhlIGluaXRpYWxpemF0aW9uIGZhaWxzLgogCiAKQEAgLTQ4LDE5ICs0OCwyMCBAQAogLi4gYzpmdW5jdGlvbjo6IGludCBQeV9Jc0luaXRpYWxpemVkKCkKIAogICAgUmV0dXJuIHRydWUgKG5vbnplcm8pIHdoZW4gdGhlIFB5dGhvbiBpbnRlcnByZXRlciBoYXMgYmVlbiBpbml0aWFsaXplZCwgZmFsc2UKLSAgICh6ZXJvKSBpZiBub3QuICBBZnRlciA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgaXMgY2FsbGVkLCB0aGlzIHJldHVybnMgZmFsc2UgdW50aWwKKyAgICh6ZXJvKSBpZiBub3QuICBBZnRlciA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBpcyBjYWxsZWQsIHRoaXMgcmV0dXJucyBmYWxzZSB1bnRpbAogICAgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgaXMgY2FsbGVkIGFnYWluLgogCiAKLS4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5X0ZpbmFsaXplKCkKKy4uIGM6ZnVuY3Rpb246OiBpbnQgUHlfRmluYWxpemVFeCgpCiAKICAgIFVuZG8gYWxsIGluaXRpYWxpemF0aW9ucyBtYWRlIGJ5IDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFuZCBzdWJzZXF1ZW50IHVzZSBvZgogICAgUHl0aG9uL0MgQVBJIGZ1bmN0aW9ucywgYW5kIGRlc3Ryb3kgYWxsIHN1Yi1pbnRlcnByZXRlcnMgKHNlZQogICAgOmM6ZnVuYzpgUHlfTmV3SW50ZXJwcmV0ZXJgIGJlbG93KSB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgbm90IHlldCBkZXN0cm95ZWQgc2luY2UKICAgIHRoZSBsYXN0IGNhbGwgdG8gOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuICBJZGVhbGx5LCB0aGlzIGZyZWVzIGFsbCBtZW1vcnkKICAgIGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLiAgVGhpcyBpcyBhIG5vLW9wIHdoZW4gY2FsbGVkIGZvciBhIHNlY29uZAotICAgdGltZSAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFnYWluIGZpcnN0KS4gIFRoZXJlIGlzIG5vIHJldHVybgotICAgdmFsdWU7IGVycm9ycyBkdXJpbmcgZmluYWxpemF0aW9uIGFyZSBpZ25vcmVkLgorICAgdGltZSAod2l0aG91dCBjYWxsaW5nIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgIGFnYWluIGZpcnN0KS4gIE5vcm1hbGx5IHRoZQorICAgcmV0dXJuIHZhbHVlIGlzIDAuICBJZiB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgZmluYWxpemF0aW9uCisgICAoZmx1c2hpbmcgYnVmZmVyZWQgZGF0YSksIC0xIGlzIHJldHVybmVkLgogCiAgICBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBhIG51bWJlciBvZiByZWFzb25zLiAgQW4gZW1iZWRkaW5nIGFwcGxpY2F0aW9uCiAgICBtaWdodCB3YW50IHRvIHJlc3RhcnQgUHl0aG9uIHdpdGhvdXQgaGF2aW5nIHRvIHJlc3RhcnQgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZi4KQEAgLTc5LDcgKzgwLDE1IEBACiAgICBmcmVlZC4gIFNvbWUgbWVtb3J5IGFsbG9jYXRlZCBieSBleHRlbnNpb24gbW9kdWxlcyBtYXkgbm90IGJlIGZyZWVkLiAgU29tZQogICAgZXh0ZW5zaW9ucyBtYXkgbm90IHdvcmsgcHJvcGVybHkgaWYgdGhlaXIgaW5pdGlhbGl6YXRpb24gcm91dGluZSBpcyBjYWxsZWQgbW9yZQogICAgdGhhbiBvbmNlOyB0aGlzIGNhbiBoYXBwZW4gaWYgYW4gYXBwbGljYXRpb24gY2FsbHMgOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgYW5kCi0gICA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgbW9yZSB0aGFuIG9uY2UuCisgICA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBtb3JlIHRoYW4gb25jZS4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKworLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlfRmluYWxpemUoKQorCisgICBUaGlzIGlzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgdmVyc2lvbiBvZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCB0aGF0CisgICBkaXNyZWdhcmRzIHRoZSByZXR1cm4gdmFsdWUuCiAKIAogUHJvY2Vzcy13aWRlIHBhcmFtZXRlcnMKQEAgLTEwNyw3ICsxMTYsNyBAQAogICAgTm90ZSB0aGF0IDpkYXRhOmBzeXMuc3RkZXJyYCBhbHdheXMgdXNlcyB0aGUgImJhY2tzbGFzaHJlcGxhY2UiIGVycm9yCiAgICBoYW5kbGVyLCByZWdhcmRsZXNzIG9mIHRoaXMgKG9yIGFueSBvdGhlcikgc2V0dGluZy4KIAotICAgSWYgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGlzIGNhbGxlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIG5lZWQgdG8gYmUgY2FsbGVkCisgICBJZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBpcyBjYWxsZWQsIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIHRvIGJlIGNhbGxlZAogICAgYWdhaW4gaW4gb3JkZXIgdG8gYWZmZWN0IHN1YnNlcXVlbnQgY2FsbHMgdG8gOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAuCiAKICAgIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBhIG5vbnplcm8gdmFsdWUgb24gZXJyb3IgKGUuZy4gY2FsbGluZyBhZnRlciB0aGUKQEAgLTkxOCw3ICs5MjcsNyBAQAogICAgZW50cnkuKQogCiAgICAuLiBpbmRleDo6Ci0gICAgICBzaW5nbGU6IFB5X0ZpbmFsaXplKCkKKyAgICAgIHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAgICAgICBzaW5nbGU6IFB5X0luaXRpYWxpemUoKQogCiAgICBFeHRlbnNpb24gbW9kdWxlcyBhcmUgc2hhcmVkIGJldHdlZW4gKHN1Yi0paW50ZXJwcmV0ZXJzIGFzIGZvbGxvd3M6IHRoZSBmaXJzdApAQCAtOTI4LDcgKzkzNyw3IEBACiAgICBhbmQgZmlsbGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoaXMgY29weTsgdGhlIGV4dGVuc2lvbidzIGBgaW5pdGBgIGZ1bmN0aW9uIGlzCiAgICBub3QgY2FsbGVkLiAgTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gd2hhdCBoYXBwZW5zIHdoZW4gYW4gZXh0ZW5zaW9uIGlzCiAgICBpbXBvcnRlZCBhZnRlciB0aGUgaW50ZXJwcmV0ZXIgaGFzIGJlZW4gY29tcGxldGVseSByZS1pbml0aWFsaXplZCBieSBjYWxsaW5nCi0gICA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAgYW5kIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgOyBpbiB0aGF0IGNhc2UsIHRoZSBleHRlbnNpb24ncworICAgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAgYW5kIDpjOmZ1bmM6YFB5X0luaXRpYWxpemVgOyBpbiB0aGF0IGNhc2UsIHRoZSBleHRlbnNpb24ncwogICAgYGBpbml0bW9kdWxlYGAgZnVuY3Rpb24gKmlzKiBjYWxsZWQgYWdhaW4uCiAKICAgIC4uIGluZGV4Ojogc2luZ2xlOiBjbG9zZSgpIChpbiBtb2R1bGUgb3MpCkBAIC05MzYsMTQgKzk0NSwxNCBAQAogCiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9FbmRJbnRlcnByZXRlcihQeVRocmVhZFN0YXRlICp0c3RhdGUpCiAKLSAgIC4uIGluZGV4Ojogc2luZ2xlOiBQeV9GaW5hbGl6ZSgpCisgICAuLiBpbmRleDo6IHNpbmdsZTogUHlfRmluYWxpemVFeCgpCiAKICAgIERlc3Ryb3kgdGhlIChzdWItKWludGVycHJldGVyIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB0aHJlYWQgc3RhdGUuIFRoZSBnaXZlbgogICAgdGhyZWFkIHN0YXRlIG11c3QgYmUgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlLiAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHRocmVhZAogICAgc3RhdGVzIGJlbG93LiAgV2hlbiB0aGUgY2FsbCByZXR1cm5zLCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgaXMgKk5VTEwqLiAgQWxsCiAgICB0aHJlYWQgc3RhdGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGludGVycHJldGVyIGFyZSBkZXN0cm95ZWQuICAoVGhlIGdsb2JhbAogICAgaW50ZXJwcmV0ZXIgbG9jayBtdXN0IGJlIGhlbGQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhbmQgaXMgc3RpbGwgaGVsZAotICAgd2hlbiBpdCByZXR1cm5zLikgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCB3aWxsIGRlc3Ryb3kgYWxsIHN1Yi1pbnRlcnByZXRlcnMgdGhhdAorICAgd2hlbiBpdCByZXR1cm5zLikgIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIHdpbGwgZGVzdHJveSBhbGwgc3ViLWludGVycHJldGVycyB0aGF0CiAgICBoYXZlbid0IGJlZW4gZXhwbGljaXRseSBkZXN0cm95ZWQgYXQgdGhhdCBwb2ludC4KIAogCmRpZmYgLS1naXQgYS9Eb2MvYy1hcGkvaW50cm8ucnN0IGIvRG9jL2MtYXBpL2ludHJvLnJzdAppbmRleCBiYzNhNzUyLi43NDY4MWQyIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvaW50cm8ucnN0CisrKyBiL0RvYy9jLWFwaS9pbnRyby5yc3QKQEAgLTY0LDkgKzY0LDEwIEBACiBsb2NhdGVkIGluIHRoZSBkaXJlY3RvcmllcyA6ZmlsZTpge3ByZWZpeH0vaW5jbHVkZS9weXRob252ZXJzaW9uL2AgYW5kCiA6ZmlsZTpge2V4ZWNfcHJlZml4fS9pbmNsdWRlL3B5dGhvbnZlcnNpb24vYCwgd2hlcmUgOmVudnZhcjpgcHJlZml4YCBhbmQKIDplbnZ2YXI6YGV4ZWNfcHJlZml4YCBhcmUgZGVmaW5lZCBieSB0aGUgY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzIHRvIFB5dGhvbidzCi06cHJvZ3JhbTpgY29uZmlndXJlYCBzY3JpcHQgYW5kICp2ZXJzaW9uKiBpcyBgYHN5cy52ZXJzaW9uWzozXWBgLiAgT24gV2luZG93cywKLXRoZSBoZWFkZXJzIGFyZSBpbnN0YWxsZWQgaW4gOmZpbGU6YHtwcmVmaXh9L2luY2x1ZGVgLCB3aGVyZSA6ZW52dmFyOmBwcmVmaXhgIGlzCi10aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBzcGVjaWZpZWQgdG8gdGhlIGluc3RhbGxlci4KKzpwcm9ncmFtOmBjb25maWd1cmVgIHNjcmlwdCBhbmQgKnZlcnNpb24qIGlzCitgYCclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXWBgLiAgT24gV2luZG93cywgdGhlIGhlYWRlcnMgYXJlIGluc3RhbGxlZAoraW4gOmZpbGU6YHtwcmVmaXh9L2luY2x1ZGVgLCB3aGVyZSA6ZW52dmFyOmBwcmVmaXhgIGlzIHRoZSBpbnN0YWxsYXRpb24KK2RpcmVjdG9yeSBzcGVjaWZpZWQgdG8gdGhlIGluc3RhbGxlci4KIAogVG8gaW5jbHVkZSB0aGUgaGVhZGVycywgcGxhY2UgYm90aCBkaXJlY3RvcmllcyAoaWYgZGlmZmVyZW50KSBvbiB5b3VyIGNvbXBpbGVyJ3MKIHNlYXJjaCBwYXRoIGZvciBpbmNsdWRlcy4gIERvICpub3QqIHBsYWNlIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgb24gdGhlIHNlYXJjaApAQCAtNTc4LDkgKzU3OSw5IEBACiBhcHBsaWNhdGlvbiBtYXkgd2FudCB0byBzdGFydCBvdmVyIChtYWtlIGFub3RoZXIgY2FsbCB0bwogOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWApIG9yIHRoZSBhcHBsaWNhdGlvbiBpcyBzaW1wbHkgZG9uZSB3aXRoIGl0cyAgdXNlIG9mCiBQeXRob24gYW5kIHdhbnRzIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBQeXRob24uICBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQKLWJ5IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVgLiAgVGhlIGZ1bmN0aW9uIDpjOmZ1bmM6YFB5X0lzSW5pdGlhbGl6ZWRgIHJldHVybnMKK2J5IGNhbGxpbmcgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAuICBUaGUgZnVuY3Rpb24gOmM6ZnVuYzpgUHlfSXNJbml0aWFsaXplZGAgcmV0dXJucwogdHJ1ZSBpZiBQeXRob24gaXMgY3VycmVudGx5IGluIHRoZSBpbml0aWFsaXplZCBzdGF0ZS4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQKLXRoZXNlIGZ1bmN0aW9ucyBpcyBnaXZlbiBpbiBhIGxhdGVyIGNoYXB0ZXIuIE5vdGljZSB0aGF0IDpjOmZ1bmM6YFB5X0ZpbmFsaXplYAordGhlc2UgZnVuY3Rpb25zIGlzIGdpdmVuIGluIGEgbGF0ZXIgY2hhcHRlci4gTm90aWNlIHRoYXQgOmM6ZnVuYzpgUHlfRmluYWxpemVFeGAKIGRvZXMgKm5vdCogZnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLCBlLmcuIG1lbW9yeQogYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzIGN1cnJlbnRseSBjYW5ub3QgYmUgcmVsZWFzZWQuCiAKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9tZW1vcnkucnN0IGIvRG9jL2MtYXBpL21lbW9yeS5yc3QKaW5kZXggMjkwZWYwOS4uM2ZmNTQ1MiAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL21lbW9yeS5yc3QKKysrIGIvRG9jL2MtYXBpL21lbW9yeS5yc3QKQEAgLTg1LDkgKzg1LDEyIEBACiAKIC4uIHNlZWFsc286OgogCisgICBUaGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUKKyAgIHRoZSBtZW1vcnkgYWxsb2NhdG9ycyB1c2VkIGJ5IFB5dGhvbi4KKwogICAgVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ1NUQVRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBwcmludAotICAgbWVtb3J5IGFsbG9jYXRpb24gc3RhdGlzdGljcyBldmVyeSB0aW1lIGEgbmV3IG9iamVjdCBhcmVuYSBpcyBjcmVhdGVkLCBhbmQKLSAgIG9uIHNodXRkb3duLgorICAgc3RhdGlzdGljcyBvZiB0aGUgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvciA8cHltYWxsb2M+YCBldmVyeSB0aW1lIGEKKyAgIG5ldyBweW1hbGxvYyBvYmplY3QgYXJlbmEgaXMgY3JlYXRlZCwgYW5kIG9uIHNodXRkb3duLgogCiAKIFJhdyBNZW1vcnkgSW50ZXJmYWNlCkBAIC0xNjIsMTUgKzE2NSwxNyBAQAogYmVoYXZpb3Igd2hlbiByZXF1ZXN0aW5nIHplcm8gYnl0ZXMsIGFyZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpbmcgYW5kIHJlbGVhc2luZwogbWVtb3J5IGZyb20gdGhlIFB5dGhvbiBoZWFwLgogCi1UaGUgZGVmYXVsdCBtZW1vcnkgYmxvY2sgYWxsb2NhdG9yIHVzZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6Ci06YzpmdW5jOmBtYWxsb2NgLCA6YzpmdW5jOmBjYWxsb2NgLCA6YzpmdW5jOmByZWFsbG9jYCBhbmQgOmM6ZnVuYzpgZnJlZWA7IGNhbGwKLWBgbWFsbG9jKDEpYGAgKG9yIGBgY2FsbG9jKDEsIDEpYGApIHdoZW4gcmVxdWVzdGluZyB6ZXJvIGJ5dGVzLgorQnkgZGVmYXVsdCwgdGhlc2UgZnVuY3Rpb25zIHVzZSA6cmVmOmBweW1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yIDxweW1hbGxvYz5gLgogCiAuLiB3YXJuaW5nOjoKIAogICAgVGhlIDp0ZXJtOmBHSUwgPGdsb2JhbCBpbnRlcnByZXRlciBsb2NrPmAgbXVzdCBiZSBoZWxkIHdoZW4gdXNpbmcgdGhlc2UKICAgIGZ1bmN0aW9ucy4KIAorLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKworICAgVGhlIGRlZmF1bHQgYWxsb2NhdG9yIGlzIG5vdyBweW1hbGxvYyBpbnN0ZWFkIG9mIHN5c3RlbSA6YzpmdW5jOmBtYWxsb2NgLgorCiAuLiBjOmZ1bmN0aW9uOjogdm9pZCogUHlNZW1fTWFsbG9jKHNpemVfdCBuKQogCiAgICBBbGxvY2F0ZXMgKm4qIGJ5dGVzIGFuZCByZXR1cm5zIGEgcG9pbnRlciBvZiB0eXBlIDpjOnR5cGU6YHZvaWRcKmAgdG8gdGhlCkBAIC0yOTIsMTUgKzI5NywzMiBAQAogCiAgICBFbnVtIHVzZWQgdG8gaWRlbnRpZnkgYW4gYWxsb2NhdG9yIGRvbWFpbi4gRG9tYWluczoKIAotICAgKiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fUkFXYDogZnVuY3Rpb25zIDpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5TWVtX1Jhd1JlYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9SYXdDYWxsb2NgIGFuZAotICAgICA6YzpmdW5jOmBQeU1lbV9SYXdGcmVlYAotICAgKiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYDogZnVuY3Rpb25zIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5TWVtX1JlYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9DYWxsb2NgIGFuZCA6YzpmdW5jOmBQeU1lbV9GcmVlYAotICAgKiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYDogZnVuY3Rpb25zIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5T2JqZWN0X1JlYWxsb2NgLCA6YzpmdW5jOmBQeU9iamVjdF9DYWxsb2NgIGFuZAotICAgICA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYAorICAgLi4gYzp2YXI6OiBQWU1FTV9ET01BSU5fUkFXCiAKKyAgICAgIEZ1bmN0aW9uczoKKworICAgICAgKiA6YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX1Jhd1JlYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX1Jhd0NhbGxvY2AKKyAgICAgICogOmM6ZnVuYzpgUHlNZW1fUmF3RnJlZWAKKworICAgLi4gYzp2YXI6OiBQWU1FTV9ET01BSU5fTUVNCisKKyAgICAgIEZ1bmN0aW9uczoKKworICAgICAgKiA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgLAorICAgICAgKiA6YzpmdW5jOmBQeU1lbV9SZWFsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU1lbV9DYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5TWVtX0ZyZWVgCisKKyAgIC4uIGM6dmFyOjogUFlNRU1fRE9NQUlOX09CSgorCisgICAgICBGdW5jdGlvbnM6CisKKyAgICAgICogOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU9iamVjdF9SZWFsbG9jYAorICAgICAgKiA6YzpmdW5jOmBQeU9iamVjdF9DYWxsb2NgCisgICAgICAqIDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgCiAKIC4uIGM6ZnVuY3Rpb246OiB2b2lkIFB5TWVtX0dldEFsbG9jYXRvcihQeU1lbUFsbG9jYXRvckRvbWFpbiBkb21haW4sIFB5TWVtQWxsb2NhdG9yRXggKmFsbG9jYXRvcikKIApAQCAtMzI1LDQzICszNDcsNjIgQEAKIAogLi4gYzpmdW5jdGlvbjo6IHZvaWQgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzKHZvaWQpCiAKLSAgIFNldHVwIGhvb2tzIHRvIGRldGVjdCBidWdzIGluIHRoZSBmb2xsb3dpbmcgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IKLSAgIGZ1bmN0aW9uczoKLQotICAgLSA6YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgLCA6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCwKLSAgICAgOmM6ZnVuYzpgUHlNZW1fUmF3Q2FsbG9jYCwgOmM6ZnVuYzpgUHlNZW1fUmF3RnJlZWAKLSAgIC0gOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCwgOmM6ZnVuYzpgUHlNZW1fUmVhbGxvY2AsIDpjOmZ1bmM6YFB5TWVtX0NhbGxvY2AsCi0gICAgIDpjOmZ1bmM6YFB5TWVtX0ZyZWVgCi0gICAtIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AsIDpjOmZ1bmM6YFB5T2JqZWN0X1JlYWxsb2NgLAotICAgICA6YzpmdW5jOmBQeU9iamVjdF9DYWxsb2NgLCA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYAorICAgU2V0dXAgaG9va3MgdG8gZGV0ZWN0IGJ1Z3MgaW4gdGhlIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yIGZ1bmN0aW9ucy4KIAogICAgTmV3bHkgYWxsb2NhdGVkIG1lbW9yeSBpcyBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4Q0JgYCwgZnJlZWQgbWVtb3J5IGlzCi0gICBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4REJgYC4gQWRkaXRpb25hbCBjaGVja3M6CisgICBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4REJgYC4KIAotICAgLSBkZXRlY3QgQVBJIHZpb2xhdGlvbnMsIGV4OiA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYCBjYWxsZWQgb24gYSBidWZmZXIKKyAgIFJ1bnRpbWUgY2hlY2tzOgorCisgICAtIERldGVjdCBBUEkgdmlvbGF0aW9ucywgZXg6IDpjOmZ1bmM6YFB5T2JqZWN0X0ZyZWVgIGNhbGxlZCBvbiBhIGJ1ZmZlcgogICAgICBhbGxvY2F0ZWQgYnkgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYAotICAgLSBkZXRlY3Qgd3JpdGUgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIChidWZmZXIgdW5kZXJmbG93KQotICAgLSBkZXRlY3Qgd3JpdGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIChidWZmZXIgb3ZlcmZsb3cpCisgICAtIERldGVjdCB3cml0ZSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKGJ1ZmZlciB1bmRlcmZsb3cpCisgICAtIERldGVjdCB3cml0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKGJ1ZmZlciBvdmVyZmxvdykKKyAgIC0gQ2hlY2sgdGhhdCB0aGUgOnRlcm06YEdJTCA8Z2xvYmFsIGludGVycHJldGVyIGxvY2s+YCBpcyBoZWxkIHdoZW4KKyAgICAgYWxsb2NhdG9yIGZ1bmN0aW9ucyBvZiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCAoZXg6CisgICAgIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApIGFuZCA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCAoZXg6CisgICAgIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2ApIGRvbWFpbnMgYXJlIGNhbGxlZAogCi0gICBUaGUgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIFB5dGhvbiBpcyBub3QgY29tcGlsZWQgaXMgZGVidWcgbW9kZS4KKyAgIE9uIGVycm9yLCB0aGUgZGVidWcgaG9va3MgdXNlIHRoZSA6bW9kOmB0cmFjZW1hbGxvY2AgbW9kdWxlIHRvIGdldCB0aGUKKyAgIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMgYWxsb2NhdGVkLiBUaGUgdHJhY2ViYWNrIGlzIG9ubHkKKyAgIGRpc3BsYXllZCBpZiA6bW9kOmB0cmFjZW1hbGxvY2AgaXMgdHJhY2luZyBQeXRob24gbWVtb3J5IGFsbG9jYXRpb25zIGFuZCB0aGUKKyAgIG1lbW9yeSBibG9jayB3YXMgdHJhY2VkLgorCisgICBUaGVzZSBob29rcyBhcmUgaW5zdGFsbGVkIGJ5IGRlZmF1bHQgaWYgUHl0aG9uIGlzIGNvbXBpbGVkIGluIGRlYnVnCisgICBtb2RlLiBUaGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsCisgICBkZWJ1ZyBob29rcyBvbiBhIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGlzIGZ1bmN0aW9uIG5vdyBhbHNvIHdvcmtzIG9uIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisgICAgICBPbiBlcnJvciwgdGhlIGRlYnVnIGhvb2tzIG5vdyB1c2UgOm1vZDpgdHJhY2VtYWxsb2NgIHRvIGdldCB0aGUgdHJhY2ViYWNrCisgICAgICB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMgYWxsb2NhdGVkLiBUaGUgZGVidWcgaG9va3Mgbm93IGFsc28gY2hlY2sKKyAgICAgIGlmIHRoZSBHSUwgaXMgaGVsZCB3aGVuIGZ1bmN0aW9ucyBvZiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCBhbmQKKyAgICAgIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9NRU1gIGRvbWFpbnMgYXJlIGNhbGxlZC4KIAogCi1DdXN0b21pemUgUHlPYmplY3QgQXJlbmEgQWxsb2NhdG9yCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisuLiBfcHltYWxsb2M6CiAKLVB5dGhvbiBoYXMgYSAqcHltYWxsb2MqIGFsbG9jYXRvciBmb3IgYWxsb2NhdGlvbnMgc21hbGxlciB0aGFuIDUxMiBieXRlcy4gVGhpcwotYWxsb2NhdG9yIGlzIG9wdGltaXplZCBmb3Igc21hbGwgb2JqZWN0cyB3aXRoIGEgc2hvcnQgbGlmZXRpbWUuIEl0IHVzZXMgbWVtb3J5Ci1tYXBwaW5ncyBjYWxsZWQgImFyZW5hcyIgd2l0aCBhIGZpeGVkIHNpemUgb2YgMjU2IEtCLiBJdCBmYWxscyBiYWNrIHRvCi06YzpmdW5jOmBQeU1lbV9SYXdNYWxsb2NgIGFuZCA6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCBmb3IgYWxsb2NhdGlvbnMgbGFyZ2VyCi10aGFuIDUxMiBieXRlcy4gICpweW1hbGxvYyogaXMgdGhlIGRlZmF1bHQgYWxsb2NhdG9yIHVzZWQgYnkKLTpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2AuCitUaGUgcHltYWxsb2MgYWxsb2NhdG9yCis9PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSBkZWZhdWx0IGFyZW5hIGFsbG9jYXRvciB1c2VzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorUHl0aG9uIGhhcyBhICpweW1hbGxvYyogYWxsb2NhdG9yIG9wdGltaXplZCBmb3Igc21hbGwgb2JqZWN0cyAoc21hbGxlciBvciBlcXVhbAordG8gNTEyIGJ5dGVzKSB3aXRoIGEgc2hvcnQgbGlmZXRpbWUuIEl0IHVzZXMgbWVtb3J5IG1hcHBpbmdzIGNhbGxlZCAiYXJlbmFzIgord2l0aCBhIGZpeGVkIHNpemUgb2YgMjU2IEtCLiBJdCBmYWxscyBiYWNrIHRvIDpjOmZ1bmM6YFB5TWVtX1Jhd01hbGxvY2AgYW5kCis6YzpmdW5jOmBQeU1lbV9SYXdSZWFsbG9jYCBmb3IgYWxsb2NhdGlvbnMgbGFyZ2VyIHRoYW4gNTEyIGJ5dGVzLgorCisqcHltYWxsb2MqIGlzIHRoZSBkZWZhdWx0IGFsbG9jYXRvciBvZiB0aGUgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWAgKGV4OgorOmM6ZnVuYzpgUHlPYmplY3RfTWFsbG9jYCkgYW5kIDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9PQkpgIChleDoKKzpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApIGRvbWFpbnMuCisKK1RoZSBhcmVuYSBhbGxvY2F0b3IgdXNlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKIAogKiA6YzpmdW5jOmBWaXJ0dWFsQWxsb2NgIGFuZCA6YzpmdW5jOmBWaXJ0dWFsRnJlZWAgb24gV2luZG93cywKICogOmM6ZnVuYzpgbW1hcGAgYW5kIDpjOmZ1bmM6YG11bm1hcGAgaWYgYXZhaWxhYmxlLAogKiA6YzpmdW5jOmBtYWxsb2NgIGFuZCA6YzpmdW5jOmBmcmVlYCBvdGhlcndpc2UuCiAKK0N1c3RvbWl6ZSBweW1hbGxvYyBBcmVuYSBBbGxvY2F0b3IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKIC4uIGM6dHlwZTo6IFB5T2JqZWN0QXJlbmFBbGxvY2F0b3IKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zdHJ1Y3R1cmVzLnJzdCBiL0RvYy9jLWFwaS9zdHJ1Y3R1cmVzLnJzdAppbmRleCBjYzg0MzE0Li5lOWU4YWRkIDEwMDY0NAotLS0gYS9Eb2MvYy1hcGkvc3RydWN0dXJlcy5yc3QKKysrIGIvRG9jL2MtYXBpL3N0cnVjdHVyZXMucnN0CkBAIC0xNTAsOCArMTUwLDkgQEAKIFRoZSA6YXR0cjpgbWxfZmxhZ3NgIGZpZWxkIGlzIGEgYml0ZmllbGQgd2hpY2ggY2FuIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBmbGFncy4KIFRoZSBpbmRpdmlkdWFsIGZsYWdzIGluZGljYXRlIGVpdGhlciBhIGNhbGxpbmcgY29udmVudGlvbiBvciBhIGJpbmRpbmcKIGNvbnZlbnRpb24uICBPZiB0aGUgY2FsbGluZyBjb252ZW50aW9uIGZsYWdzLCBvbmx5IDpjb25zdDpgTUVUSF9WQVJBUkdTYCBhbmQKLTpjb25zdDpgTUVUSF9LRVlXT1JEU2AgY2FuIGJlIGNvbWJpbmVkLiBBbnkgb2YgdGhlIGNhbGxpbmcgY29udmVudGlvbiBmbGFncwotY2FuIGJlIGNvbWJpbmVkIHdpdGggYSBiaW5kaW5nIGZsYWcuCis6Y29uc3Q6YE1FVEhfS0VZV09SRFNgIGNhbiBiZSBjb21iaW5lZCAoYnV0IG5vdGUgdGhhdCA6Y29uc3Q6YE1FVEhfS0VZV09SRFNgCithbG9uZSBpcyBlcXVpdmFsZW50IHRvIGBgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEU2BgKS4gQW55IG9mIHRoZSBjYWxsaW5nCitjb252ZW50aW9uIGZsYWdzIGNhbiBiZSBjb21iaW5lZCB3aXRoIGEgYmluZGluZyBmbGFnLgogCiAKIC4uIGRhdGE6OiBNRVRIX1ZBUkFSR1MKZGlmZiAtLWdpdCBhL0RvYy9jLWFwaS9zeXMucnN0IGIvRG9jL2MtYXBpL3N5cy5yc3QKaW5kZXggM2Q4M2IyNy4uMDM1Y2RjMSAxMDA2NDQKLS0tIGEvRG9jL2MtYXBpL3N5cy5yc3QKKysrIGIvRG9jL2MtYXBpL3N5cy5yc3QKQEAgLTUsNiArNSwxNyBAQAogT3BlcmF0aW5nIFN5c3RlbSBVdGlsaXRpZXMKID09PT09PT09PT09PT09PT09PT09PT09PT09CiAKKy4uIGM6ZnVuY3Rpb246OiBQeU9iamVjdCogUHlPU19GU1BhdGgoUHlPYmplY3QgKnBhdGgpCisKKyAgIFJldHVybiB0aGUgZmlsZSBzeXN0ZW0gcmVwcmVzZW50YXRpb24gZm9yICpwYXRoKi4gSWYgdGhlIG9iamVjdCBpcyBhCisgICA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2Agb2JqZWN0LCB0aGVuIGl0cyByZWZlcmVuY2UgY291bnQgaXMKKyAgIGluY3JlbWVudGVkLiBJZiB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZSwKKyAgIHRoZW4gOm1ldGg6YH5vcy5QYXRoTGlrZS5fX2ZzcGF0aF9fYCBpcyByZXR1cm5lZCBhcyBsb25nIGFzIGl0IGlzIGEKKyAgIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QuIE90aGVyd2lzZSA6ZXhjOmBUeXBlRXJyb3JgIGlzIHJhaXNlZAorICAgYW5kIGBgTlVMTGBgIGlzIHJldHVybmVkLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0ZkSXNJbnRlcmFjdGl2ZShGSUxFICpmcCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiAKQEAgLTIxMiwyMCArMjIzLDI0IEBACiAuLiBjOmZ1bmN0aW9uOjogdm9pZCBQeV9FeGl0KGludCBzdGF0dXMpCiAKICAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKICAgICAgIHNpbmdsZTogZXhpdCgpCiAKLSAgIEV4aXQgdGhlIGN1cnJlbnQgcHJvY2Vzcy4gIFRoaXMgY2FsbHMgOmM6ZnVuYzpgUHlfRmluYWxpemVgIGFuZCB0aGVuIGNhbGxzIHRoZQotICAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9uIGBgZXhpdChzdGF0dXMpYGAuCisgICBFeGl0IHRoZSBjdXJyZW50IHByb2Nlc3MuICBUaGlzIGNhbGxzIDpjOmZ1bmM6YFB5X0ZpbmFsaXplRXhgIGFuZCB0aGVuIGNhbGxzIHRoZQorICAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9uIGBgZXhpdChzdGF0dXMpYGAuICBJZiA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YAorICAgaW5kaWNhdGVzIGFuIGVycm9yLCB0aGUgZXhpdCBzdGF0dXMgaXMgc2V0IHRvIDEyMC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEVycm9ycyBmcm9tIGZpbmFsaXphdGlvbiBubyBsb25nZXIgaWdub3JlZC4KIAogCiAuLiBjOmZ1bmN0aW9uOjogaW50IFB5X0F0RXhpdCh2b2lkICgqZnVuYykgKCkpCiAKICAgIC4uIGluZGV4OjoKLSAgICAgIHNpbmdsZTogUHlfRmluYWxpemUoKQorICAgICAgc2luZ2xlOiBQeV9GaW5hbGl6ZUV4KCkKICAgICAgIHNpbmdsZTogY2xlYW51cCBmdW5jdGlvbnMKIAotICAgUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSA6YzpmdW5jOmBQeV9GaW5hbGl6ZWAuICBUaGUgY2xlYW51cAorICAgUmVnaXN0ZXIgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBieSA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YC4gIFRoZSBjbGVhbnVwCiAgICBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyBhbmQgc2hvdWxkIHJldHVybiBubyB2YWx1ZS4gIEF0IG1vc3QKICAgIDMyIGNsZWFudXAgZnVuY3Rpb25zIGNhbiBiZSByZWdpc3RlcmVkLiAgV2hlbiB0aGUgcmVnaXN0cmF0aW9uIGlzIHN1Y2Nlc3NmdWwsCiAgICA6YzpmdW5jOmBQeV9BdEV4aXRgIHJldHVybnMgYGAwYGA7IG9uIGZhaWx1cmUsIGl0IHJldHVybnMgYGAtMWBgLiAgVGhlIGNsZWFudXAKZGlmZiAtLWdpdCBhL0RvYy9kYXRhL3JlZmNvdW50cy5kYXQgYi9Eb2MvZGF0YS9yZWZjb3VudHMuZGF0CmluZGV4IGUzODgxOTUuLjhiNDY5ZjQgMTAwNjQ0Ci0tLSBhL0RvYy9kYXRhL3JlZmNvdW50cy5kYXQKKysrIGIvRG9jL2RhdGEvcmVmY291bnRzLmRhdApAQCAtOTIxLDYgKzkyMSw5IEBACiBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yOmludDo6OgogUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcjpQeU9iamVjdCo6bzowOgogCitQeU9TX0ZTUGF0aDpQeU9iamVjdCo6OisxOgorUHlPU19GU1BhdGg6UHlPYmplY3QqOnBhdGg6MDoKKwogUHlPYmplY3RfQ2FsbDpQeU9iamVjdCo6OisxOgogUHlPYmplY3RfQ2FsbDpQeU9iamVjdCo6Y2FsbGFibGVfb2JqZWN0OjA6CiBQeU9iamVjdF9DYWxsOlB5T2JqZWN0KjphcmdzOjA6CmRpZmYgLS1naXQgYS9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QgYi9Eb2MvZXh0ZW5kaW5nL2VtYmVkZGluZy5yc3QKaW5kZXggYWNkNjBhZS4uMTU0NmIxYSAxMDA2NDQKLS0tIGEvRG9jL2V4dGVuZGluZy9lbWJlZGRpbmcucnN0CisrKyBiL0RvYy9leHRlbmRpbmcvZW1iZWRkaW5nLnJzdApAQCAtNjcsNyArNjcsOSBAQAogICAgICAgIFB5X0luaXRpYWxpemUoKTsKICAgICAgICBQeVJ1bl9TaW1wbGVTdHJpbmcoImZyb20gdGltZSBpbXBvcnQgdGltZSxjdGltZVxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAicHJpbnQoJ1RvZGF5IGlzJywgY3RpbWUodGltZSgpKSlcbiIpOwotICAgICAgIFB5X0ZpbmFsaXplKCk7CisgICAgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgICAgZXhpdCgxMjApOworICAgICAgIH0KICAgICAgICBQeU1lbV9SYXdGcmVlKHByb2dyYW0pOwogICAgICAgIHJldHVybiAwOwogICAgfQpAQCAtNzYsNyArNzgsNyBAQAogOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAgdG8gaW5mb3JtIHRoZSBpbnRlcnByZXRlciBhYm91dCBwYXRocyB0byBQeXRob24gcnVuLXRpbWUKIGxpYnJhcmllcy4gIE5leHQsIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aAogOmM6ZnVuYzpgUHlfSW5pdGlhbGl6ZWAsIGZvbGxvd2VkIGJ5IHRoZSBleGVjdXRpb24gb2YgYSBoYXJkLWNvZGVkIFB5dGhvbiBzY3JpcHQKLXRoYXQgcHJpbnRzIHRoZSBkYXRlIGFuZCB0aW1lLiAgQWZ0ZXJ3YXJkcywgdGhlIDpjOmZ1bmM6YFB5X0ZpbmFsaXplYCBjYWxsIHNodXRzCit0aGF0IHByaW50cyB0aGUgZGF0ZSBhbmQgdGltZS4gIEFmdGVyd2FyZHMsIHRoZSA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBjYWxsIHNodXRzCiB0aGUgaW50ZXJwcmV0ZXIgZG93biwgZm9sbG93ZWQgYnkgdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbS4gIEluIGEgcmVhbCBwcm9ncmFtLAogeW91IG1heSB3YW50IHRvIGdldCB0aGUgUHl0aG9uIHNjcmlwdCBmcm9tIGFub3RoZXIgc291cmNlLCBwZXJoYXBzIGEgdGV4dC1lZGl0b3IKIHJvdXRpbmUsIGEgZmlsZSwgb3IgYSBkYXRhYmFzZS4gIEdldHRpbmcgdGhlIFB5dGhvbiBjb2RlIGZyb20gYSBmaWxlIGNhbiBiZXR0ZXIKZGlmZiAtLWdpdCBhL0RvYy9mYXEvcHJvZ3JhbW1pbmcucnN0IGIvRG9jL2ZhcS9wcm9ncmFtbWluZy5yc3QKaW5kZXggNjk0NzUzZS4uOWM1ZTIwZCAxMDA2NDQKLS0tIGEvRG9jL2ZhcS9wcm9ncmFtbWluZy5yc3QKKysrIGIvRG9jL2ZhcS9wcm9ncmFtbWluZy5yc3QKQEAgLTgzOCw3ICs4MzgsOCBAQAogVG8gY29udmVydCwgZS5nLiwgdGhlIG51bWJlciAxNDQgdG8gdGhlIHN0cmluZyAnMTQ0JywgdXNlIHRoZSBidWlsdC1pbiB0eXBlCiBjb25zdHJ1Y3RvciA6ZnVuYzpgc3RyYC4gIElmIHlvdSB3YW50IGEgaGV4YWRlY2ltYWwgb3Igb2N0YWwgcmVwcmVzZW50YXRpb24sIHVzZQogdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyA6ZnVuYzpgaGV4YCBvciA6ZnVuYzpgb2N0YC4gIEZvciBmYW5jeSBmb3JtYXR0aW5nLCBzZWUKLXRoZSA6cmVmOmBmb3JtYXRzdHJpbmdzYCBzZWN0aW9uLCBlLmcuIGBgIns6MDRkfSIuZm9ybWF0KDE0NClgYCB5aWVsZHMKK3RoZSA6cmVmOmBmLXN0cmluZ3NgIGFuZCA6cmVmOmBmb3JtYXRzdHJpbmdzYCBzZWN0aW9ucywKK2UuZy4gYGAiezowNGR9Ii5mb3JtYXQoMTQ0KWBgIHlpZWxkcwogYGAnMDE0NCdgYCBhbmQgYGAiezouM2Z9Ii5mb3JtYXQoMS4wLzMuMClgYCB5aWVsZHMgYGAnMC4zMzMnYGAuCiAKIApkaWZmIC0tZ2l0IGEvRG9jL2dsb3NzYXJ5LnJzdCBiL0RvYy9nbG9zc2FyeS5yc3QKaW5kZXggNDViNzk0Zi4uM2QwNWMxNCAxMDA2NDQKLS0tIGEvRG9jL2dsb3NzYXJ5LnJzdAorKysgYi9Eb2MvZ2xvc3NhcnkucnN0CkBAIC03MTgsNiArNzE4LDggQEAKIAogICAgICAgICAgICBkZWYgZnVuYyhmb28sIGJhcj1Ob25lKTogLi4uCiAKKyAgICAgIC4uIF9wb3NpdGlvbmFsLW9ubHlfcGFyYW1ldGVyOgorCiAgICAgICAqIDpkZm46YHBvc2l0aW9uYWwtb25seWA6IHNwZWNpZmllcyBhbiBhcmd1bWVudCB0aGF0IGNhbiBiZSBzdXBwbGllZCBvbmx5CiAgICAgICAgIGJ5IHBvc2l0aW9uLiAgUHl0aG9uIGhhcyBubyBzeW50YXggZm9yIGRlZmluaW5nIHBvc2l0aW9uYWwtb25seQogICAgICAgICBwYXJhbWV0ZXJzLiAgSG93ZXZlciwgc29tZSBidWlsdC1pbiBmdW5jdGlvbnMgaGF2ZSBwb3NpdGlvbmFsLW9ubHkKQEAgLTc3Niw2ICs3NzgsMTYgQEAKICAgICAgIE9uZSBvZiB0aGUgZGVmYXVsdCA6dGVybTpgbWV0YSBwYXRoIGZpbmRlcnMgPG1ldGEgcGF0aCBmaW5kZXI+YCB3aGljaAogICAgICAgc2VhcmNoZXMgYW4gOnRlcm06YGltcG9ydCBwYXRoYCBmb3IgbW9kdWxlcy4KIAorICAgcGF0aC1saWtlIG9iamVjdAorICAgICAgQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgc3lzdGVtIHBhdGguIEEgcGF0aC1saWtlIG9iamVjdCBpcyBlaXRoZXIKKyAgICAgIGEgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIG9iamVjdCByZXByZXNlbnRpbmcgYSBwYXRoLCBvciBhbiBvYmplY3QKKyAgICAgIGltcGxlbWVudGluZyB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgcHJvdG9jb2wuIEFuIG9iamVjdCB0aGF0IHN1cHBvcnRzCisgICAgICB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgcHJvdG9jb2wgY2FuIGJlIGNvbnZlcnRlZCB0byBhIDpjbGFzczpgc3RyYCBvcgorICAgICAgOmNsYXNzOmBieXRlc2AgZmlsZSBzeXN0ZW0gcGF0aCBieSBjYWxsaW5nIHRoZSA6ZnVuYzpgb3MuZnNwYXRoYCBmdW5jdGlvbjsKKyAgICAgIDpmdW5jOmBvcy5mc2RlY29kZWAgYW5kIDpmdW5jOmBvcy5mc2VuY29kZWAgY2FuIGJlIHVzZWQgdG8gZ3VhcmFudGVlIGEKKyAgICAgIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCByZXN1bHQgaW5zdGVhZCwgcmVzcGVjdGl2ZWx5LiBJbnRyb2R1Y2VkCisgICAgICBieSA6cGVwOmA1MTlgLgorCiAgICBwb3J0aW9uCiAgICAgICBBIHNldCBvZiBmaWxlcyBpbiBhIHNpbmdsZSBkaXJlY3RvcnkgKHBvc3NpYmx5IHN0b3JlZCBpbiBhIHppcCBmaWxlKQogICAgICAgdGhhdCBjb250cmlidXRlIHRvIGEgbmFtZXNwYWNlIHBhY2thZ2UsIGFzIGRlZmluZWQgaW4gOnBlcDpgNDIwYC4KQEAgLTk1OCw3ICs5NzAsNyBAQAogICAgICAgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIHRoZSBiZWhhdmlvdXIgb2Ygb3RoZXIgUHl0aG9uIGFwcGxpY2F0aW9ucwogICAgICAgcnVubmluZyBvbiB0aGUgc2FtZSBzeXN0ZW0uCiAKLSAgICAgIFNlZSBhbHNvIDpyZWY6YHNjcmlwdHMtcHl2ZW52YC4KKyAgICAgIFNlZSBhbHNvIDptb2Q6YHZlbnZgLgogCiAgICB2aXJ0dWFsIG1hY2hpbmUKICAgICAgIEEgY29tcHV0ZXIgZGVmaW5lZCBlbnRpcmVseSBpbiBzb2Z0d2FyZS4gIFB5dGhvbidzIHZpcnR1YWwgbWFjaGluZQpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdCBiL0RvYy9ob3d0by9hcmdwYXJzZS5yc3QKaW5kZXggY2ZlOTg2OC4uN2E2MDE2NSAxMDA2NDQKLS0tIGEvRG9jL2hvd3RvL2FyZ3BhcnNlLnJzdAorKysgYi9Eb2MvaG93dG8vYXJncGFyc2UucnN0CkBAIC01NDcsNyArNTQ3LDggQEAKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgRmlsZSAicHJvZy5weSIsIGxpbmUgMTEsIGluIDxtb2R1bGU+CiAgICAgICAgaWYgYXJncy52ZXJib3NpdHkgPj0gMjoKLSAgIFR5cGVFcnJvcjogdW5vcmRlcmFibGUgdHlwZXM6IE5vbmVUeXBlKCkgPj0gaW50KCkKKyAgIFR5cGVFcnJvcjogJz49JyBub3Qgc3VwcG9ydGVkIGJldHdlZW4gaW5zdGFuY2VzIG9mICdOb25lVHlwZScgYW5kICdpbnQnCisKIAogKiBGaXJzdCBvdXRwdXQgd2VudCB3ZWxsLCBhbmQgZml4ZXMgdGhlIGJ1ZyB3ZSBoYWQgYmVmb3JlLgogICBUaGF0IGlzLCB3ZSB3YW50IGFueSB2YWx1ZSA+PSAyIHRvIGJlIGFzIHZlcmJvc2UgYXMgcG9zc2libGUuCmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvcnVuLWZ1bmMuYyBiL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCmluZGV4IDk4NmQ2NzAuLmVhZDdiZGQgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCisrKyBiL0RvYy9pbmNsdWRlcy9ydW4tZnVuYy5jCkBAIC02Myw2ICs2Myw4IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgXCIlc1wiXG4iLCBhcmd2WzFdKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIFB5X0ZpbmFsaXplKCk7CisgICAgaWYgKFB5X0ZpbmFsaXplRXgoKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIDEyMDsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9Eb2MvaW5jbHVkZXMvdGVzdC5weSBiL0RvYy9pbmNsdWRlcy90ZXN0LnB5CmluZGV4IDdlYmY0NmEuLjllOWQ0YTYgMTAwNjQ0Ci0tLSBhL0RvYy9pbmNsdWRlcy90ZXN0LnB5CisrKyBiL0RvYy9pbmNsdWRlcy90ZXN0LnB5CkBAIC0yMDQsNyArMjA0LDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCi1QTEFUX1NQRUMgPSAiJXMtJXMiICUgKGdldF9wbGF0Zm9ybSgpLCBzeXMudmVyc2lvblswOjNdKQorUExBVF9TUEVDID0gIiVzLSVkLiVkIiAlIChnZXRfcGxhdGZvcm0oKSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKQogc3JjID0gb3MucGF0aC5qb2luKCJidWlsZCIsICJsaWIuJXMiICUgUExBVF9TUEVDKQogc3lzLnBhdGguYXBwZW5kKHNyYykKIApkaWZmIC0tZ2l0IGEvRG9jL2luc3RhbGxpbmcvaW5kZXgucnN0IGIvRG9jL2luc3RhbGxpbmcvaW5kZXgucnN0CmluZGV4IDFlZjMxNDkuLmIyMjQ2NWQgMTAwNjQ0Ci0tLSBhL0RvYy9pbnN0YWxsaW5nL2luZGV4LnJzdAorKysgYi9Eb2MvaW5zdGFsbGluZy9pbmRleC5yc3QKQEAgLTIsOSArMiw5IEBACiAKIC4uIF9pbnN0YWxsaW5nLWluZGV4OgogCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICBJbnN0YWxsaW5nIFB5dGhvbiBNb2R1bGVzCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioqKioqKioqKioqKioqKioqKioqKioqKgorSW5zdGFsbGluZyBQeXRob24gTW9kdWxlcworKioqKioqKioqKioqKioqKioqKioqKioqKgogCiA6RW1haWw6IGRpc3R1dGlscy1zaWdAcHl0aG9uLm9yZwogCkBAIC0zNCwyNCArMzQsMjQgQEAKIAogKiBgYHBpcGBgIGlzIHRoZSBwcmVmZXJyZWQgaW5zdGFsbGVyIHByb2dyYW0uIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDMuNCwgaXQKICAgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCB3aXRoIHRoZSBQeXRob24gYmluYXJ5IGluc3RhbGxlcnMuCi0qIGEgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBhIHNlbWktaXNvbGF0ZWQgUHl0aG9uIGVudmlyb25tZW50IHRoYXQgYWxsb3dzCisqIEEgKnZpcnR1YWwgZW52aXJvbm1lbnQqIGlzIGEgc2VtaS1pc29sYXRlZCBQeXRob24gZW52aXJvbm1lbnQgdGhhdCBhbGxvd3MKICAgcGFja2FnZXMgdG8gYmUgaW5zdGFsbGVkIGZvciB1c2UgYnkgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLCByYXRoZXIgdGhhbgotICBiZWluZyBpbnN0YWxsZWQgc3lzdGVtIHdpZGUKLSogYGBweXZlbnZgYCBpcyB0aGUgc3RhbmRhcmQgdG9vbCBmb3IgY3JlYXRpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMsIGFuZCBoYXMKKyAgYmVpbmcgaW5zdGFsbGVkIHN5c3RlbSB3aWRlLgorKiBgYHZlbnZgYCBpcyB0aGUgc3RhbmRhcmQgdG9vbCBmb3IgY3JlYXRpbmcgdmlydHVhbCBlbnZpcm9ubWVudHMsIGFuZCBoYXMKICAgYmVlbiBwYXJ0IG9mIFB5dGhvbiBzaW5jZSBQeXRob24gMy4zLiBTdGFydGluZyB3aXRoIFB5dGhvbiAzLjQsIGl0Ci0gIGRlZmF1bHRzIHRvIGluc3RhbGxpbmcgYGBwaXBgYCBpbnRvIGFsbCBjcmVhdGVkIHZpcnR1YWwgZW52aXJvbm1lbnRzCisgIGRlZmF1bHRzIHRvIGluc3RhbGxpbmcgYGBwaXBgYCBpbnRvIGFsbCBjcmVhdGVkIHZpcnR1YWwgZW52aXJvbm1lbnRzLgogKiBgYHZpcnR1YWxlbnZgYCBpcyBhIHRoaXJkIHBhcnR5IGFsdGVybmF0aXZlIChhbmQgcHJlZGVjZXNzb3IpIHRvCi0gIGBgcHl2ZW52YGAuIEl0IGFsbG93cyB2aXJ0dWFsIGVudmlyb25tZW50cyB0byBiZSB1c2VkIG9uIHZlcnNpb25zIG9mCi0gIFB5dGhvbiBwcmlvciB0byAzLjQsIHdoaWNoIGVpdGhlciBkb24ndCBwcm92aWRlIGBgcHl2ZW52YGAgYXQgYWxsLCBvcgorICBgYHZlbnZgYC4gSXQgYWxsb3dzIHZpcnR1YWwgZW52aXJvbm1lbnRzIHRvIGJlIHVzZWQgb24gdmVyc2lvbnMgb2YKKyAgUHl0aG9uIHByaW9yIHRvIDMuNCwgd2hpY2ggZWl0aGVyIGRvbid0IHByb3ZpZGUgYGB2ZW52YGAgYXQgYWxsLCBvcgogICBhcmVuJ3QgYWJsZSB0byBhdXRvbWF0aWNhbGx5IGluc3RhbGwgYGBwaXBgYCBpbnRvIGNyZWF0ZWQgZW52aXJvbm1lbnRzLgotKiB0aGUgYFB5dGhvbiBQYWNrYWdpbmcgSW5kZXggPGh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGk+YF9fIGlzIGEgcHVibGljCisqIFRoZSBgUHl0aG9uIFBhY2thZ2luZyBJbmRleCA8aHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT5gX18gaXMgYSBwdWJsaWMKICAgcmVwb3NpdG9yeSBvZiBvcGVuIHNvdXJjZSBsaWNlbnNlZCBwYWNrYWdlcyBtYWRlIGF2YWlsYWJsZSBmb3IgdXNlIGJ5Ci0gIG90aGVyIFB5dGhvbiB1c2VycworICBvdGhlciBQeXRob24gdXNlcnMuCiAqIHRoZSBgUHl0aG9uIFBhY2thZ2luZyBBdXRob3JpdHkKICAgPGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0Lz5gX18gYXJlIHRoZSBncm91cCBvZgogICBkZXZlbG9wZXJzIGFuZCBkb2N1bWVudGF0aW9uIGF1dGhvcnMgcmVzcG9uc2libGUgZm9yIHRoZSBtYWludGVuYW5jZSBhbmQKICAgZXZvbHV0aW9uIG9mIHRoZSBzdGFuZGFyZCBwYWNrYWdpbmcgdG9vbHMgYW5kIHRoZSBhc3NvY2lhdGVkIG1ldGFkYXRhIGFuZAotICBmaWxlIGZvcm1hdCBzdGFuZGFyZHMuIFRoZXkgbWFpbnRhaW4gYSB2YXJpZXR5IG9mIHRvb2xzLCBkb2N1bWVudGF0aW9uCisgIGZpbGUgZm9ybWF0IHN0YW5kYXJkcy4gVGhleSBtYWludGFpbiBhIHZhcmlldHkgb2YgdG9vbHMsIGRvY3VtZW50YXRpb24sCiAgIGFuZCBpc3N1ZSB0cmFja2VycyBvbiBib3RoIGBHaXRIdWIgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhPmBfXyBhbmQKICAgYEJpdEJ1Y2tldCA8aHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvPmBfXy4KICogYGBkaXN0dXRpbHNgYCBpcyB0aGUgb3JpZ2luYWwgYnVpbGQgYW5kIGRpc3RyaWJ1dGlvbiBzeXN0ZW0gZmlyc3QgYWRkZWQgdG8KQEAgLTYyLDYgKzYyLDE5IEBACiAgIG9mIHRoZSBtYWlsaW5nIGxpc3QgdXNlZCB0byBjb29yZGluYXRlIFB5dGhvbiBwYWNrYWdpbmcgc3RhbmRhcmRzCiAgIGRldmVsb3BtZW50KS4KIAorLi4gZGVwcmVjYXRlZDo6IDMuNgorICAgYGBweXZlbnZgYCB3YXMgdGhlIHJlY29tbWVuZGVkIHRvb2wgZm9yIGNyZWF0aW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzIGZvcgorICAgUHl0aG9uIDMuMyBhbmQgMy40LCBhbmQgaXMgYGRlcHJlY2F0ZWQgaW4gUHl0aG9uIDMuNgorICAgPGh0dHBzOi8vZG9jcy5weXRob24ub3JnL2Rldi93aGF0c25ldy8zLjYuaHRtbCNkZXByZWNhdGVkLWZlYXR1cmVzPmBfLgorCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQorICAgVGhlIHVzZSBvZiBgYHZlbnZgYCBpcyBub3cgcmVjb21tZW5kZWQgZm9yIGNyZWF0aW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzLgorCisuLiBzZWVhbHNvOjoKKworICAgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZTogQ3JlYXRpbmcgYW5kIHVzaW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzCisgICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLyNjcmVhdGluZy12aXJ0dWFsLWVudmlyb25tZW50cz5gX18KKwogCiBCYXNpYyB1c2FnZQogPT09PT09PT09PT0KQEAgLTEwMCwxMyArMTEzLDE0IEBACiBNb3JlIGluZm9ybWF0aW9uIGFuZCByZXNvdXJjZXMgcmVnYXJkaW5nIGBgcGlwYGAgYW5kIGl0cyBjYXBhYmlsaXRpZXMgY2FuIGJlCiBmb3VuZCBpbiB0aGUgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZSA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZz5gX18uCiAKLWBgcHl2ZW52YGAgaGFzIGl0cyBvd24gZG9jdW1lbnRhdGlvbiBhdCA6cmVmOmBzY3JpcHRzLXB5dmVudmAuIEluc3RhbGxpbmcKLWludG8gYW4gYWN0aXZlIHZpcnR1YWwgZW52aXJvbm1lbnQgdXNlcyB0aGUgY29tbWFuZHMgc2hvd24gYWJvdmUuCitDcmVhdGlvbiBvZiB2aXJ0dWFsIGVudmlyb25tZW50cyBpcyBkb25lIHRocm91Z2ggdGhlIDptb2Q6YHZlbnZgIG1vZHVsZS4KK0luc3RhbGxpbmcgcGFja2FnZXMgaW50byBhbiBhY3RpdmUgdmlydHVhbCBlbnZpcm9ubWVudCB1c2VzIHRoZSBjb21tYW5kcyBzaG93bgorYWJvdmUuCiAKIC4uIHNlZWFsc286OgogCiAgICAgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZTogSW5zdGFsbGluZyBQeXRob24gRGlzdHJpYnV0aW9uIFBhY2thZ2VzCi0gICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L2luc3RhbGxpbmcvPmBfXworICAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvPmBfXwogCiAKIEhvdyBkbyBJIC4uLj8KQEAgLTEyNCw3ICsxMzgsNyBAQAogLi4gc2VlYWxzbzo6CiAKICAgIGBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGU6IFJlcXVpcmVtZW50cyBmb3IgSW5zdGFsbGluZyBQYWNrYWdlcwotICAgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L2luc3RhbGxpbmcvI3JlcXVpcmVtZW50cy1mb3ItaW5zdGFsbGluZy1wYWNrYWdlcz5gX18KKyAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2luc3RhbGxpbmcvI3JlcXVpcmVtZW50cy1mb3ItaW5zdGFsbGluZy1wYWNrYWdlcz5gX18KIAogCiAuLiBpbnN0YWxsaW5nLXBlci11c2VyLWluc3RhbGxhdGlvbjoKQEAgLTE0MiwyMCArMTU2LDE5IEBACiBBIG51bWJlciBvZiBzY2llbnRpZmljIFB5dGhvbiBwYWNrYWdlcyBoYXZlIGNvbXBsZXggYmluYXJ5IGRlcGVuZGVuY2llcywgYW5kCiBhcmVuJ3QgY3VycmVudGx5IGVhc3kgdG8gaW5zdGFsbCB1c2luZyBgYHBpcGBgIGRpcmVjdGx5LiBBdCB0aGlzIHBvaW50IGluCiB0aW1lLCBpdCB3aWxsIG9mdGVuIGJlIGVhc2llciBmb3IgdXNlcnMgdG8gaW5zdGFsbCB0aGVzZSBwYWNrYWdlcyBieQotYG90aGVyIG1lYW5zCi08aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc2NpZW5jZS8+YF9fCitgb3RoZXIgbWVhbnMgPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvc2NpZW5jZS8+YF9fCiByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGluc3RhbGwgdGhlbSB3aXRoIGBgcGlwYGAuCiAKIC4uIHNlZWFsc286OgogCiAgICBgUHl0aG9uIFBhY2thZ2luZyBVc2VyIEd1aWRlOiBJbnN0YWxsaW5nIFNjaWVudGlmaWMgUGFja2FnZXMKLSAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9zY2llbmNlLz5gX18KKyAgIDxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL3NjaWVuY2UvPmBfXwogCiAKIC4uLiB3b3JrIHdpdGggbXVsdGlwbGUgdmVyc2lvbnMgb2YgUHl0aG9uIGluc3RhbGxlZCBpbiBwYXJhbGxlbD8KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotT24gTGludXgsIE1hYyBPUyBYIGFuZCBvdGhlciBQT1NJWCBzeXN0ZW1zLCB1c2UgdGhlIHZlcnNpb25lZCBQeXRob24gY29tbWFuZHMKK09uIExpbnV4LCBNYWMgT1MgWCwgYW5kIG90aGVyIFBPU0lYIHN5c3RlbXMsIHVzZSB0aGUgdmVyc2lvbmVkIFB5dGhvbiBjb21tYW5kcwogaW4gY29tYmluYXRpb24gd2l0aCB0aGUgYGAtbWBgIHN3aXRjaCB0byBydW4gdGhlIGFwcHJvcHJpYXRlIGNvcHkgb2YKIGBgcGlwYGA6OgogCkBAIC0xNjQsNyArMTc3LDcgQEAKICAgIHB5dGhvbjMgICAtbSBwaXAgaW5zdGFsbCBTb21lUGFja2FnZSAgIyBkZWZhdWx0IFB5dGhvbiAzCiAgICBweXRob24zLjQgLW0gcGlwIGluc3RhbGwgU29tZVBhY2thZ2UgICMgc3BlY2lmaWNhbGx5IFB5dGhvbiAzLjQKIAotKGFwcHJvcHJpYXRlbHkgdmVyc2lvbmVkIGBgcGlwYGAgY29tbWFuZHMgbWF5IGFsc28gYmUgYXZhaWxhYmxlKQorQXBwcm9wcmlhdGVseSB2ZXJzaW9uZWQgYGBwaXBgYCBjb21tYW5kcyBtYXkgYWxzbyBiZSBhdmFpbGFibGUuCiAKIE9uIFdpbmRvd3MsIHVzZSB0aGUgYGBweWBgIFB5dGhvbiBsYXVuY2hlciBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBgYC1tYGAKIHN3aXRjaDo6CkBAIC0yMTIsMTEgKzIyNSwxMSBAQAogdGhhbiBuZWVkaW5nIHRvIGJ1aWxkIHRoZW0gdGhlbXNlbHZlcy4KIAogU29tZSBvZiB0aGUgc29sdXRpb25zIGZvciBpbnN0YWxsaW5nIGBzY2llbnRpZmljIHNvZnR3YXJlCi08aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3Qvc2NpZW5jZS8+YF9fCi10aGF0IGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGFzIHByZS1idWlsdCBgYHdoZWVsYGAgZmlsZXMgbWF5IGFsc28gaGVscCB3aXRoCis8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9zY2llbmNlLz5gX18KK3RoYXQgYXJlIG5vdCB5ZXQgYXZhaWxhYmxlIGFzIHByZS1idWlsdCBgYHdoZWVsYGAgZmlsZXMgbWF5IGFsc28gaGVscCB3aXRoCiBvYnRhaW5pbmcgb3RoZXIgYmluYXJ5IGV4dGVuc2lvbnMgd2l0aG91dCBuZWVkaW5nIHRvIGJ1aWxkIHRoZW0gbG9jYWxseS4KIAogLi4gc2VlYWxzbzo6CiAKICAgIGBQeXRob24gUGFja2FnaW5nIFVzZXIgR3VpZGU6IEJpbmFyeSBFeHRlbnNpb25zCi0gICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvZXh0ZW5zaW9ucy8+YF9fCisgICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9leHRlbnNpb25zLz5gX18KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2FzeW5jaGF0LnJzdCBiL0RvYy9saWJyYXJ5L2FzeW5jaGF0LnJzdAppbmRleCBhZTcyZDI2Li5lMDIzNjBjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9hc3luY2hhdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvYXN5bmNoYXQucnN0CkBAIC01OCwxMyArNTgsMTMgQEAKICAgICAgIFRoZSBhc3luY2hyb25vdXMgb3V0cHV0IGJ1ZmZlciBzaXplIChkZWZhdWx0IGBgNDA5NmBgKS4KIAogICAgVW5saWtlIDpjbGFzczpgYXN5bmNvcmUuZGlzcGF0Y2hlcmAsIDpjbGFzczpgYXN5bmNfY2hhdGAgYWxsb3dzIHlvdSB0bwotICAgZGVmaW5lIGEgZmlyc3QtaW4tZmlyc3Qtb3V0IHF1ZXVlIChmaWZvKSBvZiAqcHJvZHVjZXJzKi4gQSBwcm9kdWNlciBuZWVkCisgICBkZWZpbmUgYSA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlIG9mICpwcm9kdWNlcnMqLiBBIHByb2R1Y2VyIG5lZWQKICAgIGhhdmUgb25seSBvbmUgbWV0aG9kLCA6bWV0aDpgbW9yZWAsIHdoaWNoIHNob3VsZCByZXR1cm4gZGF0YSB0byBiZQogICAgdHJhbnNtaXR0ZWQgb24gdGhlIGNoYW5uZWwuCiAgICBUaGUgcHJvZHVjZXIgaW5kaWNhdGVzIGV4aGF1c3Rpb24gKCppLmUuKiB0aGF0IGl0IGNvbnRhaW5zIG5vIG1vcmUgZGF0YSkgYnkKICAgIGhhdmluZyBpdHMgOm1ldGg6YG1vcmVgIG1ldGhvZCByZXR1cm4gdGhlIGVtcHR5IGJ5dGVzIG9iamVjdC4gQXQgdGhpcyBwb2ludAotICAgdGhlIDpjbGFzczpgYXN5bmNfY2hhdGAgb2JqZWN0IHJlbW92ZXMgdGhlIHByb2R1Y2VyIGZyb20gdGhlIGZpZm8gYW5kIHN0YXJ0cwotICAgdXNpbmcgdGhlIG5leHQgcHJvZHVjZXIsIGlmIGFueS4gV2hlbiB0aGUgcHJvZHVjZXIgZmlmbyBpcyBlbXB0eSB0aGUKKyAgIHRoZSA6Y2xhc3M6YGFzeW5jX2NoYXRgIG9iamVjdCByZW1vdmVzIHRoZSBwcm9kdWNlciBmcm9tIHRoZSBxdWV1ZSBhbmQgc3RhcnRzCisgICB1c2luZyB0aGUgbmV4dCBwcm9kdWNlciwgaWYgYW55LiBXaGVuIHRoZSBwcm9kdWNlciBxdWV1ZSBpcyBlbXB0eSB0aGUKICAgIDptZXRoOmBoYW5kbGVfd3JpdGVgIG1ldGhvZCBkb2VzIG5vdGhpbmcuIFlvdSB1c2UgdGhlIGNoYW5uZWwgb2JqZWN0J3MKICAgIDptZXRoOmBzZXRfdGVybWluYXRvcmAgbWV0aG9kIHRvIGRlc2NyaWJlIGhvdyB0byByZWNvZ25pemUgdGhlIGVuZCBvZiwgb3IKICAgIGFuIGltcG9ydGFudCBicmVha3BvaW50IGluLCBhbiBpbmNvbWluZyB0cmFuc21pc3Npb24gZnJvbSB0aGUgcmVtb3RlCkBAIC03OCw4ICs3OCw4IEBACiAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQuY2xvc2Vfd2hlbl9kb25lKCkKIAotICAgUHVzaGVzIGEgYGBOb25lYGAgb24gdG8gdGhlIHByb2R1Y2VyIGZpZm8uIFdoZW4gdGhpcyBwcm9kdWNlciBpcyBwb3BwZWQgb2ZmCi0gICB0aGUgZmlmbyBpdCBjYXVzZXMgdGhlIGNoYW5uZWwgdG8gYmUgY2xvc2VkLgorICAgUHVzaGVzIGEgYGBOb25lYGAgb24gdG8gdGhlIHByb2R1Y2VyIHF1ZXVlLiBXaGVuIHRoaXMgcHJvZHVjZXIgaXMgcG9wcGVkIG9mZgorICAgdGhlIHF1ZXVlIGl0IGNhdXNlcyB0aGUgY2hhbm5lbCB0byBiZSBjbG9zZWQuCiAKIAogLi4gbWV0aG9kOjogYXN5bmNfY2hhdC5jb2xsZWN0X2luY29taW5nX2RhdGEoZGF0YSkKQEAgLTkyLDcgKzkyLDcgQEAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQuZGlzY2FyZF9idWZmZXJzKCkKIAogICAgSW4gZW1lcmdlbmNpZXMgdGhpcyBtZXRob2Qgd2lsbCBkaXNjYXJkIGFueSBkYXRhIGhlbGQgaW4gdGhlIGlucHV0IGFuZC9vcgotICAgb3V0cHV0IGJ1ZmZlcnMgYW5kIHRoZSBwcm9kdWNlciBmaWZvLgorICAgb3V0cHV0IGJ1ZmZlcnMgYW5kIHRoZSBwcm9kdWNlciBxdWV1ZS4KIAogCiAuLiBtZXRob2Q6OiBhc3luY19jaGF0LmZvdW5kX3Rlcm1pbmF0b3IoKQpAQCAtMTEwLDcgKzExMCw3IEBACiAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQucHVzaChkYXRhKQogCi0gICBQdXNoZXMgZGF0YSBvbiB0byB0aGUgY2hhbm5lbCdzIGZpZm8gdG8gZW5zdXJlIGl0cyB0cmFuc21pc3Npb24uCisgICBQdXNoZXMgZGF0YSBvbiB0byB0aGUgY2hhbm5lbCdzIHF1ZXVlIHRvIGVuc3VyZSBpdHMgdHJhbnNtaXNzaW9uLgogICAgVGhpcyBpcyBhbGwgeW91IG5lZWQgdG8gZG8gdG8gaGF2ZSB0aGUgY2hhbm5lbCB3cml0ZSB0aGUgZGF0YSBvdXQgdG8gdGhlCiAgICBuZXR3b3JrLCBhbHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgeW91ciBvd24gcHJvZHVjZXJzIGluIG1vcmUgY29tcGxleAogICAgc2NoZW1lcyB0byBpbXBsZW1lbnQgZW5jcnlwdGlvbiBhbmQgY2h1bmtpbmcsIGZvciBleGFtcGxlLgpAQCAtMTE4LDcgKzExOCw3IEBACiAKIC4uIG1ldGhvZDo6IGFzeW5jX2NoYXQucHVzaF93aXRoX3Byb2R1Y2VyKHByb2R1Y2VyKQogCi0gICBUYWtlcyBhIHByb2R1Y2VyIG9iamVjdCBhbmQgYWRkcyBpdCB0byB0aGUgcHJvZHVjZXIgZmlmbyBhc3NvY2lhdGVkIHdpdGgKKyAgIFRha2VzIGEgcHJvZHVjZXIgb2JqZWN0IGFuZCBhZGRzIGl0IHRvIHRoZSBwcm9kdWNlciBxdWV1ZSBhc3NvY2lhdGVkIHdpdGgKICAgIHRoZSBjaGFubmVsLiAgV2hlbiBhbGwgY3VycmVudGx5LXB1c2hlZCBwcm9kdWNlcnMgaGF2ZSBiZWVuIGV4aGF1c3RlZCB0aGUKICAgIGNoYW5uZWwgd2lsbCBjb25zdW1lIHRoaXMgcHJvZHVjZXIncyBkYXRhIGJ5IGNhbGxpbmcgaXRzIDptZXRoOmBtb3JlYAogICAgbWV0aG9kIGFuZCBzZW5kIHRoZSBkYXRhIHRvIHRoZSByZW1vdGUgZW5kcG9pbnQuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9hc3luY2lvLWV2ZW50bG9vcC5yc3QgYi9Eb2MvbGlicmFyeS9hc3luY2lvLWV2ZW50bG9vcC5yc3QKaW5kZXggN2VjM2FhMS4uODA5YTNlNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYXN5bmNpby1ldmVudGxvb3AucnN0CisrKyBiL0RvYy9saWJyYXJ5L2FzeW5jaW8tZXZlbnRsb29wLnJzdApAQCAtMTAxLDggKzEwMSw5IEBACiAgICBjYWxsZWQgYWZ0ZXIgOm1ldGg6YGNhbGxfc29vbmAgcmV0dXJucywgd2hlbiBjb250cm9sIHJldHVybnMgdG8gdGhlIGV2ZW50CiAgICBsb29wLgogCi0gICBUaGlzIG9wZXJhdGVzIGFzIGEgRklGTyBxdWV1ZSwgY2FsbGJhY2tzIGFyZSBjYWxsZWQgaW4gdGhlIG9yZGVyIGluCi0gICB3aGljaCB0aGV5IGFyZSByZWdpc3RlcmVkLiAgRWFjaCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCisgICBUaGlzIG9wZXJhdGVzIGFzIGEgOmFiYnI6YEZJRk8gKGZpcnN0LWluLCBmaXJzdC1vdXQpYCBxdWV1ZSwgY2FsbGJhY2tzCisgICBhcmUgY2FsbGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSByZWdpc3RlcmVkLiAgRWFjaCBjYWxsYmFjaworICAgd2lsbCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLgogCiAgICBBbnkgcG9zaXRpb25hbCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRvIHRoZQogICAgY2FsbGJhY2sgd2hlbiBpdCBpcyBjYWxsZWQuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QgYi9Eb2MvbGlicmFyeS9iaW5hc2NpaS5yc3QKaW5kZXggODc4ZDhkYi4uNGY1ZjBmMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvYmluYXNjaWkucnN0CisrKyBiL0RvYy9saWJyYXJ5L2JpbmFzY2lpLnJzdApAQCAtNTMsMTMgKzUzLDE0IEBACiAgICB0aGFuIG9uZSBsaW5lIG1heSBiZSBwYXNzZWQgYXQgYSB0aW1lLgogCiAKLS4uIGZ1bmN0aW9uOjogYjJhX2Jhc2U2NChkYXRhKQorLi4gZnVuY3Rpb246OiBiMmFfYmFzZTY0KGRhdGEsIFwqLCBuZXdsaW5lPVRydWUpCiAKICAgIENvbnZlcnQgYmluYXJ5IGRhdGEgdG8gYSBsaW5lIG9mIEFTQ0lJIGNoYXJhY3RlcnMgaW4gYmFzZTY0IGNvZGluZy4gVGhlIHJldHVybgotICAgdmFsdWUgaXMgdGhlIGNvbnZlcnRlZCBsaW5lLCBpbmNsdWRpbmcgYSBuZXdsaW5lIGNoYXIuICBUaGUgbmV3bGluZSBpcwotICAgYWRkZWQgYmVjYXVzZSB0aGUgb3JpZ2luYWwgdXNlIGNhc2UgZm9yIHRoaXMgZnVuY3Rpb24gd2FzIHRvIGZlZWQgaXQgYQotICAgc2VyaWVzIG9mIDU3IGJ5dGUgaW5wdXQgbGluZXMgdG8gZ2V0IG91dHB1dCBsaW5lcyB0aGF0IGNvbmZvcm0gdG8gdGhlCi0gICBNSU1FLWJhc2U2NCBzdGFuZGFyZC4gIE90aGVyd2lzZSB0aGUgb3V0cHV0IGNvbmZvcm1zIHRvIDpyZmM6YDM1NDhgLgorICAgdmFsdWUgaXMgdGhlIGNvbnZlcnRlZCBsaW5lLCBpbmNsdWRpbmcgYSBuZXdsaW5lIGNoYXIgaWYgKm5ld2xpbmUqIGlzCisgICB0cnVlLiAgVGhlIG91dHB1dCBvZiB0aGlzIGZ1bmN0aW9uIGNvbmZvcm1zIHRvIDpyZmM6YDM1NDhgLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICpuZXdsaW5lKiBwYXJhbWV0ZXIuCiAKIAogLi4gZnVuY3Rpb246OiBhMmJfcXAoZGF0YSwgaGVhZGVyPUZhbHNlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMuYWJjLnJzdCBiL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLmFiYy5yc3QKaW5kZXggYWViNmE3My4uMzkxNDk1NiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMuYWJjLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5hYmMucnN0CkBAIC00MSwxMiArNDEsMTMgQEAKIDpjbGFzczpgSGFzaGFibGVgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGBfX2hhc2hfX2BgCiA6Y2xhc3M6YEl0ZXJhYmxlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19pdGVyX19gYAogOmNsYXNzOmBJdGVyYXRvcmAgICAgICAgICAgOmNsYXNzOmBJdGVyYWJsZWAgICAgICBgYF9fbmV4dF9fYGAgICAgICAgICAgICBgYF9faXRlcl9fYGAKKzpjbGFzczpgUmV2ZXJzaWJsZWAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgICAgICAgYGBfX3JldmVyc2VkX19gYAogOmNsYXNzOmBHZW5lcmF0b3JgICAgICAgICAgOmNsYXNzOmBJdGVyYXRvcmAgICAgICBgYHNlbmRgYCwgYGB0aHJvd2BgICAgICBgYGNsb3NlYGAsIGBgX19pdGVyX19gYCwgYGBfX25leHRfX2BgCiA6Y2xhc3M6YFNpemVkYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19sZW5fX2BgCiA6Y2xhc3M6YENhbGxhYmxlYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBgX19jYWxsX19gYAogCiA6Y2xhc3M6YFNlcXVlbmNlYCAgICAgICAgICA6Y2xhc3M6YFNpemVkYCwgICAgICAgIGBgX19nZXRpdGVtX19gYCwgICAgICAgIGBgX19jb250YWluc19fYGAsIGBgX19pdGVyX19gYCwgYGBfX3JldmVyc2VkX19gYCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjbGFzczpgSXRlcmFibGVgLCAgICAgYGBfX2xlbl9fYGAgICAgICAgICAgICAgYGBpbmRleGBgLCBhbmQgYGBjb3VudGBgCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhc3M6YFJldmVyc2libGVgLCAgIGBgX19sZW5fX2BgICAgICAgICAgICAgIGBgaW5kZXhgYCwgYW5kIGBgY291bnRgYAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNsYXNzOmBDb250YWluZXJgCiAKIDpjbGFzczpgTXV0YWJsZVNlcXVlbmNlYCAgIDpjbGFzczpgU2VxdWVuY2VgICAgICAgYGBfX2dldGl0ZW1fX2BgLCAgICAgICAgSW5oZXJpdGVkIDpjbGFzczpgU2VxdWVuY2VgIG1ldGhvZHMgYW5kCkBAIC0xMTEsNiArMTEyLDEyIEBACiAgICA6bWV0aDpgfml0ZXJhdG9yLl9fbmV4dF9fYCBtZXRob2RzLiAgU2VlIGFsc28gdGhlIGRlZmluaXRpb24gb2YKICAgIDp0ZXJtOmBpdGVyYXRvcmAuCiAKKy4uIGNsYXNzOjogUmV2ZXJzaWJsZQorCisgICBBQkMgZm9yIGNsYXNzZXMgdGhhdCBwcm92aWRlIHRoZSA6bWV0aDpgX19yZXZlcnNlZF9fYCBtZXRob2QuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCiAuLiBjbGFzczo6IEdlbmVyYXRvcgogCiAgICBBQkMgZm9yIGdlbmVyYXRvciBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoZSBwcm90b2NvbCBkZWZpbmVkIGluCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QgYi9Eb2MvbGlicmFyeS9jb2xsZWN0aW9ucy5yc3QKaW5kZXggNDkzNmIzYS4uMTc1OGYzMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY29sbGVjdGlvbnMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbGxlY3Rpb25zLnJzdApAQCAtOTY0LDYgKzk2NCw5IEBACiAgICAgICBjb25zdHJ1Y3RvciB0aGF0IGlzIGNvbnZlbmllbnQgZm9yIHVzZSBjYXNlcyB3aGVyZSBuYW1lZCB0dXBsZXMgYXJlIGJlaW5nCiAgICAgICBzdWJjbGFzc2VkLgogCisgICAgKiA6bWV0aDpgdHlwZXMuU2ltcGxlTmFtZXNwYWNlYCBmb3IgYSBtdXRhYmxlIG5hbWVzcGFjZSBiYXNlZCBvbiBhbiB1bmRlcmx5aW5nCisgICAgICBkaWN0aW9uYXJ5IGluc3RlYWQgb2YgYSB0dXBsZS4KKwogCiA6Y2xhc3M6YE9yZGVyZWREaWN0YCBvYmplY3RzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05ODUsOCArOTg4LDkgQEAKICAgICAuLiBtZXRob2Q6OiBwb3BpdGVtKGxhc3Q9VHJ1ZSkKIAogICAgICAgICBUaGUgOm1ldGg6YHBvcGl0ZW1gIG1ldGhvZCBmb3Igb3JkZXJlZCBkaWN0aW9uYXJpZXMgcmV0dXJucyBhbmQgcmVtb3ZlcyBhCi0gICAgICAgIChrZXksIHZhbHVlKSBwYWlyLiAgVGhlIHBhaXJzIGFyZSByZXR1cm5lZCBpbiBMSUZPIG9yZGVyIGlmICpsYXN0KiBpcyB0cnVlCi0gICAgICAgIG9yIEZJRk8gb3JkZXIgaWYgZmFsc2UuCisgICAgICAgIChrZXksIHZhbHVlKSBwYWlyLiAgVGhlIHBhaXJzIGFyZSByZXR1cm5lZCBpbgorICAgICAgICA6YWJicjpgTElGTyAobGFzdC1pbiwgZmlyc3Qtb3V0KWAgb3JkZXIgaWYgKmxhc3QqIGlzIHRydWUKKyAgICAgICAgb3IgOmFiYnI6YEZJRk8gKGZpcnN0LWluLCBmaXJzdC1vdXQpYCBvcmRlciBpZiBmYWxzZS4KIAogICAgIC4uIG1ldGhvZDo6IG1vdmVfdG9fZW5kKGtleSwgbGFzdD1UcnVlKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9jb21waWxlYWxsLnJzdCBiL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CmluZGV4IDUxMWM1ODEuLjkxYmRkMTggMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CisrKyBiL0RvYy9saWJyYXJ5L2NvbXBpbGVhbGwucnN0CkBAIC0xMDIsNyArMTAyLDggQEAKIC4uIGZ1bmN0aW9uOjogY29tcGlsZV9kaXIoZGlyLCBtYXhsZXZlbHM9MTAsIGRkaXI9Tm9uZSwgZm9yY2U9RmFsc2UsIHJ4PU5vbmUsIHF1aWV0PTAsIGxlZ2FjeT1GYWxzZSwgb3B0aW1pemU9LTEsIHdvcmtlcnM9MSkKIAogICAgUmVjdXJzaXZlbHkgZGVzY2VuZCB0aGUgZGlyZWN0b3J5IHRyZWUgbmFtZWQgYnkgKmRpciosIGNvbXBpbGluZyBhbGwgOmZpbGU6YC5weWAKLSAgIGZpbGVzIGFsb25nIHRoZSB3YXkuCisgICBmaWxlcyBhbG9uZyB0aGUgd2F5LiBSZXR1cm4gYSB0cnVlIHZhbHVlIGlmIGFsbCB0aGUgZmlsZXMgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5LAorICAgYW5kIGEgZmFsc2UgdmFsdWUgb3RoZXJ3aXNlLgogCiAgICBUaGUgKm1heGxldmVscyogcGFyYW1ldGVyIGlzIHVzZWQgdG8gbGltaXQgdGhlIGRlcHRoIG9mIHRoZSByZWN1cnNpb247IGl0CiAgICBkZWZhdWx0cyB0byBgYDEwYGAuCkBAIC0xNTQsNyArMTU1LDggQEAKIAogLi4gZnVuY3Rpb246OiBjb21waWxlX2ZpbGUoZnVsbG5hbWUsIGRkaXI9Tm9uZSwgZm9yY2U9RmFsc2UsIHJ4PU5vbmUsIHF1aWV0PTAsIGxlZ2FjeT1GYWxzZSwgb3B0aW1pemU9LTEpCiAKLSAgIENvbXBpbGUgdGhlIGZpbGUgd2l0aCBwYXRoICpmdWxsbmFtZSouCisgICBDb21waWxlIHRoZSBmaWxlIHdpdGggcGF0aCAqZnVsbG5hbWUqLiBSZXR1cm4gYSB0cnVlIHZhbHVlIGlmIHRoZSBmaWxlCisgICBjb21waWxlZCBzdWNjZXNzZnVsbHksIGFuZCBhIGZhbHNlIHZhbHVlIG90aGVyd2lzZS4KIAogICAgSWYgKmRkaXIqIGlzIGdpdmVuLCBpdCBpcyBwcmVwZW5kZWQgdG8gdGhlIHBhdGggdG8gdGhlIGZpbGUgYmVpbmcgY29tcGlsZWQKICAgIGZvciB1c2UgaW4gY29tcGlsYXRpb24gdGltZSB0cmFjZWJhY2tzLCBhbmQgaXMgYWxzbyBjb21waWxlZCBpbiB0byB0aGUKQEAgLTE5MCw4ICsxOTIsMTAgQEAKIAogLi4gZnVuY3Rpb246OiBjb21waWxlX3BhdGgoc2tpcF9jdXJkaXI9VHJ1ZSwgbWF4bGV2ZWxzPTAsIGZvcmNlPUZhbHNlLCBxdWlldD0wLCBsZWdhY3k9RmFsc2UsIG9wdGltaXplPS0xKQogCi0gICBCeXRlLWNvbXBpbGUgYWxsIHRoZSA6ZmlsZTpgLnB5YCBmaWxlcyBmb3VuZCBhbG9uZyBgYHN5cy5wYXRoYGAuIElmCi0gICAqc2tpcF9jdXJkaXIqIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIG5vdCBpbmNsdWRlZAorICAgQnl0ZS1jb21waWxlIGFsbCB0aGUgOmZpbGU6YC5weWAgZmlsZXMgZm91bmQgYWxvbmcgYGBzeXMucGF0aGBgLiBSZXR1cm4gYQorICAgdHJ1ZSB2YWx1ZSBpZiBhbGwgdGhlIGZpbGVzIGNvbXBpbGVkIHN1Y2Nlc3NmdWxseSwgYW5kIGEgZmFsc2UgdmFsdWUgb3RoZXJ3aXNlLgorCisgICBJZiAqc2tpcF9jdXJkaXIqIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIG5vdCBpbmNsdWRlZAogICAgaW4gdGhlIHNlYXJjaC4gIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdG8gdGhlIDpmdW5jOmBjb21waWxlX2RpcmAKICAgIGZ1bmN0aW9uLiAgTm90ZSB0aGF0IHVubGlrZSB0aGUgb3RoZXIgY29tcGlsZSBmdW5jdGlvbnMsIGBgbWF4bGV2ZWxzYGAKICAgIGRlZmF1bHRzIHRvIGBgMGBgLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY29udGV4dGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9jb250ZXh0bGliLnJzdAppbmRleCBjZjg1ZmNkLi44MTBjZWE4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9jb250ZXh0bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jb250ZXh0bGliLnJzdApAQCAtMTgsNiArMTgsMTggQEAKIAogRnVuY3Rpb25zIGFuZCBjbGFzc2VzIHByb3ZpZGVkOgogCisuLiBjbGFzczo6IEFic3RyYWN0Q29udGV4dE1hbmFnZXIKKworICAgQW4gOnRlcm06YGFic3RyYWN0IGJhc2UgY2xhc3NgIGZvciBjbGFzc2VzIHRoYXQgaW1wbGVtZW50CisgICA6bWV0aDpgb2JqZWN0Ll9fZW50ZXJfX2AgYW5kIDptZXRoOmBvYmplY3QuX19leGl0X19gLiBBIGRlZmF1bHQKKyAgIGltcGxlbWVudGF0aW9uIGZvciA6bWV0aDpgb2JqZWN0Ll9fZW50ZXJfX2AgaXMgcHJvdmlkZWQgd2hpY2ggcmV0dXJucworICAgYGBzZWxmYGAgd2hpbGUgOm1ldGg6YG9iamVjdC5fX2V4aXRfX2AgaXMgYW4gYWJzdHJhY3QgbWV0aG9kIHdoaWNoIGJ5IGRlZmF1bHQKKyAgIHJldHVybnMgYGBOb25lYGAuIFNlZSBhbHNvIHRoZSBkZWZpbml0aW9uIG9mIDpyZWY6YHR5cGVjb250ZXh0bWFuYWdlcmAuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKKwogLi4gZGVjb3JhdG9yOjogY29udGV4dG1hbmFnZXIKIAogICAgVGhpcyBmdW5jdGlvbiBpcyBhIDp0ZXJtOmBkZWNvcmF0b3JgIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGEgZmFjdG9yeQpAQCAtNDQ3LDkgKzQ1OSw5IEBACiBhY3F1aXNpdGlvbiBhbmQgcmVsZWFzZSBmdW5jdGlvbnMsIGFsb25nIHdpdGggYW4gb3B0aW9uYWwgdmFsaWRhdGlvbiBmdW5jdGlvbiwKIGFuZCBtYXBzIHRoZW0gdG8gdGhlIGNvbnRleHQgbWFuYWdlbWVudCBwcm90b2NvbDo6CiAKLSAgIGZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIsIEV4aXRTdGFjaworICAgZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlciwgQWJzdHJhY3RDb250ZXh0TWFuYWdlciwgRXhpdFN0YWNrCiAKLSAgIGNsYXNzIFJlc291cmNlTWFuYWdlcjoKKyAgIGNsYXNzIFJlc291cmNlTWFuYWdlcihBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKIAogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhY3F1aXJlX3Jlc291cmNlLCByZWxlYXNlX3Jlc291cmNlLCBjaGVja19yZXNvdXJjZV9vaz1Ob25lKToKICAgICAgICAgICAgc2VsZi5hY3F1aXJlX3Jlc291cmNlID0gYWNxdWlyZV9yZXNvdXJjZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3J5cHQucnN0IGIvRG9jL2xpYnJhcnkvY3J5cHQucnN0CmluZGV4IGEyMWMxZTcuLmRiZDQyNzQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2NyeXB0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9jcnlwdC5yc3QKQEAgLTY4LDcgKzY4LDcgQEAKIAogICAgQSBsaXN0IG9mIGF2YWlsYWJsZSBwYXNzd29yZCBoYXNoaW5nIGFsZ29yaXRobXMsIGFzCiAgICBgYGNyeXB0Lk1FVEhPRF8qYGAgb2JqZWN0cy4gIFRoaXMgbGlzdCBpcyBzb3J0ZWQgZnJvbSBzdHJvbmdlc3QgdG8KLSAgIHdlYWtlc3QsIGFuZCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3QgYGBjcnlwdC5NRVRIT0RfQ1JZUFRgYC4KKyAgIHdlYWtlc3QuCiAKIAogTW9kdWxlIEZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvY3J5cHRvLnJzdCBiL0RvYy9saWJyYXJ5L2NyeXB0by5yc3QKaW5kZXggMWVkZGZkYy4uYWU0NTU0OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvY3J5cHRvLnJzdAorKysgYi9Eb2MvbGlicmFyeS9jcnlwdG8ucnN0CkBAIC0xNiwzICsxNiw0IEBACiAKICAgIGhhc2hsaWIucnN0CiAgICBobWFjLnJzdAorICAgc2VjcmV0cy5yc3QKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdCBiL0RvYy9saWJyYXJ5L2RhdGV0aW1lLnJzdAppbmRleCA5MjU0YWU4Li5jZDc4NzUwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9kYXRldGltZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGF0ZXRpbWUucnN0CkBAIC02MTAsNyArNjEwLDggQEAKIC4uIG1ldGhvZDo6IGRhdGUuX19mb3JtYXRfXyhmb3JtYXQpCiAKICAgIFNhbWUgYXMgOm1ldGg6YC5kYXRlLnN0cmZ0aW1lYC4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgZm9ybWF0Ci0gICBzdHJpbmcgZm9yIGEgOmNsYXNzOmAuZGF0ZWAgb2JqZWN0IHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLiBGb3IgYQorICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGVgIG9iamVjdCBpbiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nCisgICBsaXRlcmFscyA8Zi1zdHJpbmdzPmAgYW5kIHdoZW4gdXNpbmcgOm1ldGg6YHN0ci5mb3JtYXRgLiBGb3IgYQogICAgY29tcGxldGUgbGlzdCBvZiBmb3JtYXR0aW5nIGRpcmVjdGl2ZXMsIHNlZQogICAgOnJlZjpgc3RyZnRpbWUtc3RycHRpbWUtYmVoYXZpb3JgLgogCkBAIC0xMTM4LDcgKzExMzksNyBAQAogICAgYGBzZWxmLmRhdGUoKS5pc29jYWxlbmRhcigpYGAuCiAKIAotLi4gbWV0aG9kOjogZGF0ZXRpbWUuaXNvZm9ybWF0KHNlcD0nVCcpCisuLiBtZXRob2Q6OiBkYXRldGltZS5pc29mb3JtYXQoc2VwPSdUJywgdGltZXNwZWM9J2F1dG8nKQogCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkYXRlIGFuZCB0aW1lIGluIElTTyA4NjAxIGZvcm1hdCwKICAgIFlZWVktTU0tRERUSEg6TU06U1MubW1tbW1tIG9yLCBpZiA6YXR0cjpgbWljcm9zZWNvbmRgIGlzIDAsCkBAIC0xMTU5LDYgKzExNjAsMzcgQEAKICAgICAgID4+PiBkYXRldGltZSgyMDAyLCAxMiwgMjUsIHR6aW5mbz1UWigpKS5pc29mb3JtYXQoJyAnKQogICAgICAgJzIwMDItMTItMjUgMDA6MDA6MDAtMDY6MzknCiAKKyAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqdGltZXNwZWMqIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgIGNvbXBvbmVudHMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZSAodGhlIGRlZmF1bHQgaXMgYGAnYXV0bydgYCkuCisgICBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgIC0gYGAnYXV0bydgYDogU2FtZSBhcyBgYCdzZWNvbmRzJ2BgIGlmIDphdHRyOmBtaWNyb3NlY29uZGAgaXMgMCwKKyAgICAgc2FtZSBhcyBgYCdtaWNyb3NlY29uZHMnYGAgb3RoZXJ3aXNlLgorICAgLSBgYCdob3VycydgYDogSW5jbHVkZSB0aGUgOmF0dHI6YGhvdXJgIGluIHRoZSB0d28tZGlnaXQgSEggZm9ybWF0LgorICAgLSBgYCdtaW51dGVzJ2BgOiBJbmNsdWRlIDphdHRyOmBob3VyYCBhbmQgOmF0dHI6YG1pbnV0ZWAgaW4gSEg6TU0gZm9ybWF0LgorICAgLSBgYCdzZWNvbmRzJ2BgOiBJbmNsdWRlIDphdHRyOmBob3VyYCwgOmF0dHI6YG1pbnV0ZWAsIGFuZCA6YXR0cjpgc2Vjb25kYAorICAgICBpbiBISDpNTTpTUyBmb3JtYXQuCisgICAtIGBgJ21pbGxpc2Vjb25kcydgYDogSW5jbHVkZSBmdWxsIHRpbWUsIGJ1dCB0cnVuY2F0ZSBmcmFjdGlvbmFsIHNlY29uZAorICAgICBwYXJ0IHRvIG1pbGxpc2Vjb25kcy4gSEg6TU06U1Muc3NzIGZvcm1hdC4KKyAgIC0gYGAnbWljcm9zZWNvbmRzJ2BgOiBJbmNsdWRlIGZ1bGwgdGltZSBpbiBISDpNTTpTUy5tbW1tbW0gZm9ybWF0LgorCisgICAuLiBub3RlOjoKKworICAgICAgRXhjbHVkZWQgdGltZSBjb21wb25lbnRzIGFyZSB0cnVuY2F0ZWQsIG5vdCByb3VuZGVkLgorCisgICA6ZXhjOmBWYWx1ZUVycm9yYCB3aWxsIGJlIHJhaXNlZCBvbiBhbiBpbnZhbGlkICp0aW1lc3BlYyogYXJndW1lbnQuCisKKworICAgICAgPj4+IGZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCisgICAgICA+Pj4gZGF0ZXRpbWUubm93KCkuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaW51dGVzJykKKyAgICAgICcyMDAyLTEyLTI1VDAwOjAwJworICAgICAgPj4+IGR0ID0gZGF0ZXRpbWUoMjAxNSwgMSwgMSwgMTIsIDMwLCA1OSwgMCkKKyAgICAgID4+PiBkdC5pc29mb3JtYXQodGltZXNwZWM9J21pY3Jvc2Vjb25kcycpCisgICAgICAnMjAxNS0wMS0wMVQxMjozMDo1OS4wMDAwMDAnCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgdGhlICp0aW1lc3BlYyogYXJndW1lbnQuCisKIAogLi4gbWV0aG9kOjogZGF0ZXRpbWUuX19zdHJfXygpCiAKQEAgLTExODUsNyArMTIxNyw4IEBACiAuLiBtZXRob2Q6OiBkYXRldGltZS5fX2Zvcm1hdF9fKGZvcm1hdCkKIAogICAgU2FtZSBhcyA6bWV0aDpgLmRhdGV0aW1lLnN0cmZ0aW1lYC4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gc3BlY2lmeSBhIGZvcm1hdAotICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3Qgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuICBGb3IgYQorICAgc3RyaW5nIGZvciBhIDpjbGFzczpgLmRhdGV0aW1lYCBvYmplY3QgaW4gOnJlZjpgZm9ybWF0dGVkIHN0cmluZworICAgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIGFuZCB3aGVuIHVzaW5nIDptZXRoOmBzdHIuZm9ybWF0YC4gIEZvciBhCiAgICBjb21wbGV0ZSBsaXN0IG9mIGZvcm1hdHRpbmcgZGlyZWN0aXZlcywgc2VlCiAgICA6cmVmOmBzdHJmdGltZS1zdHJwdGltZS1iZWhhdmlvcmAuCiAKQEAgLTE0MDcsMTMgKzE0NDAsNDYgQEAKICAgIGF3YXJlIDpjbGFzczpgLnRpbWVgLCB3aXRob3V0IGNvbnZlcnNpb24gb2YgdGhlIHRpbWUgZGF0YS4KIAogCi0uLiBtZXRob2Q6OiB0aW1lLmlzb2Zvcm1hdCgpCisuLiBtZXRob2Q6OiB0aW1lLmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpCiAKICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRpbWUgaW4gSVNPIDg2MDEgZm9ybWF0LCBISDpNTTpTUy5tbW1tbW0gb3IsIGlmCi0gICBzZWxmLm1pY3Jvc2Vjb25kIGlzIDAsIEhIOk1NOlNTIElmIDptZXRoOmB1dGNvZmZzZXRgIGRvZXMgbm90IHJldHVybiBgYE5vbmVgYCwgYQorICAgOmF0dHI6YG1pY3Jvc2Vjb25kYCBpcyAwLCBISDpNTTpTUyBJZiA6bWV0aDpgdXRjb2Zmc2V0YCBkb2VzIG5vdCByZXR1cm4gYGBOb25lYGAsIGEKICAgIDYtY2hhcmFjdGVyIHN0cmluZyBpcyBhcHBlbmRlZCwgZ2l2aW5nIHRoZSBVVEMgb2Zmc2V0IGluIChzaWduZWQpIGhvdXJzIGFuZAogICAgbWludXRlczogSEg6TU06U1MubW1tbW1tK0hIOk1NIG9yLCBpZiBzZWxmLm1pY3Jvc2Vjb25kIGlzIDAsIEhIOk1NOlNTK0hIOk1NCiAKKyAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqdGltZXNwZWMqIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgIGNvbXBvbmVudHMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZSAodGhlIGRlZmF1bHQgaXMgYGAnYXV0bydgYCkuCisgICBJdCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgIC0gYGAnYXV0bydgYDogU2FtZSBhcyBgYCdzZWNvbmRzJ2BgIGlmIDphdHRyOmBtaWNyb3NlY29uZGAgaXMgMCwKKyAgICAgc2FtZSBhcyBgYCdtaWNyb3NlY29uZHMnYGAgb3RoZXJ3aXNlLgorICAgLSBgYCdob3VycydgYDogSW5jbHVkZSB0aGUgOmF0dHI6YGhvdXJgIGluIHRoZSB0d28tZGlnaXQgSEggZm9ybWF0LgorICAgLSBgYCdtaW51dGVzJ2BgOiBJbmNsdWRlIDphdHRyOmBob3VyYCBhbmQgOmF0dHI6YG1pbnV0ZWAgaW4gSEg6TU0gZm9ybWF0LgorICAgLSBgYCdzZWNvbmRzJ2BgOiBJbmNsdWRlIDphdHRyOmBob3VyYCwgOmF0dHI6YG1pbnV0ZWAsIGFuZCA6YXR0cjpgc2Vjb25kYAorICAgICBpbiBISDpNTTpTUyBmb3JtYXQuCisgICAtIGBgJ21pbGxpc2Vjb25kcydgYDogSW5jbHVkZSBmdWxsIHRpbWUsIGJ1dCB0cnVuY2F0ZSBmcmFjdGlvbmFsIHNlY29uZAorICAgICBwYXJ0IHRvIG1pbGxpc2Vjb25kcy4gSEg6TU06U1Muc3NzIGZvcm1hdC4KKyAgIC0gYGAnbWljcm9zZWNvbmRzJ2BgOiBJbmNsdWRlIGZ1bGwgdGltZSBpbiBISDpNTTpTUy5tbW1tbW0gZm9ybWF0LgorCisgICAuLiBub3RlOjoKKworICAgICAgRXhjbHVkZWQgdGltZSBjb21wb25lbnRzIGFyZSB0cnVuY2F0ZWQsIG5vdCByb3VuZGVkLgorCisgICA6ZXhjOmBWYWx1ZUVycm9yYCB3aWxsIGJlIHJhaXNlZCBvbiBhbiBpbnZhbGlkICp0aW1lc3BlYyogYXJndW1lbnQuCisKKworICAgICAgPj4+IGZyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWUKKyAgICAgID4+PiB0aW1lKGhvdXI9MTIsIG1pbnV0ZT0zNCwgc2Vjb25kPTU2LCBtaWNyb3NlY29uZD0xMjM0NTYpLmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWludXRlcycpCisgICAgICAnMTI6MzQnCisgICAgICA+Pj4gZHQgPSB0aW1lKGhvdXI9MTIsIG1pbnV0ZT0zNCwgc2Vjb25kPTU2LCBtaWNyb3NlY29uZD0wKQorICAgICAgPj4+IGR0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJykKKyAgICAgICcxMjozNDo1Ni4wMDAwMDAnCisgICAgICA+Pj4gZHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdhdXRvJykKKyAgICAgICcxMjozNDo1NicKKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICAgICBBZGRlZCB0aGUgKnRpbWVzcGVjKiBhcmd1bWVudC4KKwogCiAuLiBtZXRob2Q6OiB0aW1lLl9fc3RyX18oKQogCkBAIC0xNDMwLDcgKzE0OTYsOCBAQAogLi4gbWV0aG9kOjogdGltZS5fX2Zvcm1hdF9fKGZvcm1hdCkKIAogICAgU2FtZSBhcyA6bWV0aDpgLnRpbWUuc3RyZnRpbWVgLiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBmb3JtYXQgc3RyaW5nCi0gICBmb3IgYSA6Y2xhc3M6YC50aW1lYCBvYmplY3Qgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuICBGb3IgYQorICAgZm9yIGEgOmNsYXNzOmAudGltZWAgb2JqZWN0IGluIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcKKyAgIGxpdGVyYWxzIDxmLXN0cmluZ3M+YCBhbmQgd2hlbiB1c2luZyA6bWV0aDpgc3RyLmZvcm1hdGAuICBGb3IgYQogICAgY29tcGxldGUgbGlzdCBvZiBmb3JtYXR0aW5nIGRpcmVjdGl2ZXMsIHNlZQogICAgOnJlZjpgc3RyZnRpbWUtc3RycHRpbWUtYmVoYXZpb3JgLgogCkBAIC0xNzQxLDEwICsxODA4LDcgQEAKICAgb3RoZXJ3aXNlIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZC4KIAogICBUaGUgKm5hbWUqIGFyZ3VtZW50IGlzIG9wdGlvbmFsLiAgSWYgc3BlY2lmaWVkIGl0IG11c3QgYmUgYSBzdHJpbmcgdGhhdAotICBpcyB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYGB0em5hbWUoZHQpYGAgbWV0aG9kLiAgT3RoZXJ3aXNlLAotICBgYHR6bmFtZShkdClgYCByZXR1cm5zIGEgc3RyaW5nICdVVENzSEg6TU0nLCB3aGVyZSBzIGlzIHRoZSBzaWduIG9mCi0gICpvZmZzZXQqLCBISCBhbmQgTU0gYXJlIHR3byBkaWdpdHMgb2YgYGBvZmZzZXQuaG91cnNgYCBhbmQKLSAgYGBvZmZzZXQubWludXRlc2BgIHJlc3BlY3RpdmVseS4KKyAgd2lsbCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgOm1ldGg6YGRhdGV0aW1lLnR6bmFtZWAgbWV0aG9kLgogCiAgIC4uIHZlcnNpb25hZGRlZDo6IDMuMgogCkBAIC0xNzU3LDExICsxODIxLDE5IEBACiAKIC4uIG1ldGhvZDo6IHRpbWV6b25lLnR6bmFtZShkdCkKIAotICBSZXR1cm4gdGhlIGZpeGVkIHZhbHVlIHNwZWNpZmllZCB3aGVuIHRoZSA6Y2xhc3M6YHRpbWV6b25lYCBpbnN0YW5jZSBpcwotICBjb25zdHJ1Y3RlZCBvciBhIHN0cmluZyAnVVRDc0hIOk1NJywgd2hlcmUgcyBpcyB0aGUgc2lnbiBvZgotICAqb2Zmc2V0KiwgSEggYW5kIE1NIGFyZSB0d28gZGlnaXRzIG9mIGBgb2Zmc2V0LmhvdXJzYGAgYW5kCisgIFJldHVybiB0aGUgZml4ZWQgdmFsdWUgc3BlY2lmaWVkIHdoZW4gdGhlIDpjbGFzczpgdGltZXpvbmVgIGluc3RhbmNlCisgIGlzIGNvbnN0cnVjdGVkLiAgSWYgKm5hbWUqIGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZQorICBuYW1lIHJldHVybmVkIGJ5IGBgdHpuYW1lKGR0KWBgIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUKKyAgYGBvZmZzZXRgYCBhcyBmb2xsb3dzLiAgSWYgKm9mZnNldCogaXMgYGB0aW1lZGVsdGEoMClgYCwgdGhlIG5hbWUKKyAgaXMgIlVUQyIsIG90aGVyd2lzZSBpdCBpcyBhIHN0cmluZyAnVVRDwrFISDpNTScsIHdoZXJlIMKxIGlzIHRoZSBzaWduCisgIG9mIGBgb2Zmc2V0YGAsIEhIIGFuZCBNTSBhcmUgdHdvIGRpZ2l0cyBvZiBgYG9mZnNldC5ob3Vyc2BgIGFuZAogICBgYG9mZnNldC5taW51dGVzYGAgcmVzcGVjdGl2ZWx5LgogCisgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgIE5hbWUgZ2VuZXJhdGVkIGZyb20gYGBvZmZzZXQ9dGltZWRlbHRhKDApYGAgaXMgbm93IHBsYWluICdVVEMnLCBub3QKKyAgICAgJ1VUQyswMDowMCcuCisKKwogLi4gbWV0aG9kOjogdGltZXpvbmUuZHN0KGR0KQogCiAgIEFsd2F5cyByZXR1cm5zIGBgTm9uZWBgLgpAQCAtMTkxMSw2ICsxOTgzLDM0IEBACiB8IGBgJSVgYCAgICB8IEEgbGl0ZXJhbCBgYCclJ2BgIGNoYXJhY3Rlci4gICB8ICUgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8CiArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rCiAKK1NldmVyYWwgYWRkaXRpb25hbCBkaXJlY3RpdmVzIG5vdCByZXF1aXJlZCBieSB0aGUgQzg5IHN0YW5kYXJkIGFyZSBpbmNsdWRlZCBmb3IKK2NvbnZlbmllbmNlLiBUaGVzZSBwYXJhbWV0ZXJzIGFsbCBjb3JyZXNwb25kIHRvIElTTyA4NjAxIGRhdGUgdmFsdWVzLiBUaGVzZQorbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtcyB3aGVuIHVzZWQgd2l0aCB0aGUgOm1ldGg6YHN0cmZ0aW1lYAorbWV0aG9kLiBUaGUgSVNPIDg2MDEgeWVhciBhbmQgSVNPIDg2MDEgd2VlayBkaXJlY3RpdmVzIGFyZSBub3QgaW50ZXJjaGFuZ2VhYmxlCit3aXRoIHRoZSB5ZWFyIGFuZCB3ZWVrIG51bWJlciBkaXJlY3RpdmVzIGFib3ZlLiBDYWxsaW5nIDptZXRoOmBzdHJwdGltZWAgd2l0aAoraW5jb21wbGV0ZSBvciBhbWJpZ3VvdXMgSVNPIDg2MDEgZGlyZWN0aXZlcyB3aWxsIHJhaXNlIGEgOmV4YzpgVmFsdWVFcnJvcmAuCisKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgRGlyZWN0aXZlIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgICAgICB8IE5vdGVzIHwKKys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PSsKK3wgYGAlR2BgICAgIHwgSVNPIDg2MDEgeWVhciB3aXRoIGNlbnR1cnkgICAgIHwgMDAwMSwgMDAwMiwgLi4uLCAyMDEzLCB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgcmVwcmVzZW50aW5nIHRoZSB5ZWFyIHRoYXQgICAgIHwgMjAxNCwgLi4uLCA5OTk4LCA5OTk5ICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgY29udGFpbnMgdGhlIGdyZWF0ZXIgcGFydCBvZiAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIElTTyB3ZWVrIChgYCVWYGApLiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAldWBgICAgIHwgSVNPIDg2MDEgd2Vla2RheSBhcyBhIGRlY2ltYWwgIHwgMSwgMiwgLi4uLCA3ICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdoZXJlIDEgaXMgTW9uZGF5LiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKK3wgYGAlVmBgICAgIHwgSVNPIDg2MDEgd2VlayBhcyBhIGRlY2ltYWwgICAgIHwgMDEsIDAyLCAuLi4sIDUzICAgICAgICB8IFwoOCkgIHwKK3wgICAgICAgICAgIHwgbnVtYmVyIHdpdGggTW9uZGF5IGFzICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2Vlay4gICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgV2VlayAwMSBpcyB0aGUgd2VlayBjb250YWluaW5nIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKK3wgICAgICAgICAgIHwgSmFuIDQuICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHwKKystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSsKKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisgICBgYCVHYGAsIGBgJXVgYCBhbmQgYGAlVmBgIHdlcmUgYWRkZWQuCisKIE5vdGVzOgogCiAoMSkKQEAgLTE5NzUsNyArMjA3NSwxNCBAQAogCiAoNykKICAgIFdoZW4gdXNlZCB3aXRoIHRoZSA6bWV0aDpgc3RycHRpbWVgIG1ldGhvZCwgYGAlVWBgIGFuZCBgYCVXYGAgYXJlIG9ubHkgdXNlZAotICAgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlIGRheSBvZiB0aGUgd2VlayBhbmQgdGhlIHllYXIgYXJlIHNwZWNpZmllZC4KKyAgIGluIGNhbGN1bGF0aW9ucyB3aGVuIHRoZSBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBjYWxlbmRhciB5ZWFyIChgYCVZYGApCisgICBhcmUgc3BlY2lmaWVkLgorCisoOCkKKyAgIFNpbWlsYXIgdG8gYGAlVWBgIGFuZCBgYCVXYGAsIGBgJVZgYCBpcyBvbmx5IHVzZWQgaW4gY2FsY3VsYXRpb25zIHdoZW4gdGhlCisgICBkYXkgb2YgdGhlIHdlZWsgYW5kIHRoZSBJU08geWVhciAoYGAlR2BgKSBhcmUgc3BlY2lmaWVkIGluIGEKKyAgIDptZXRoOmBzdHJwdGltZWAgZm9ybWF0IHN0cmluZy4gQWxzbyBub3RlIHRoYXQgYGAlR2BgIGFuZCBgYCVZYGAgYXJlIG5vdAorICAgaW50ZXJjaGFuZ2VhYmxlLgogCiAuLiBydWJyaWM6OiBGb290bm90ZXMKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZGJtLnJzdCBiL0RvYy9saWJyYXJ5L2RibS5yc3QKaW5kZXggMmExZGI5MS4uMzJlODBiMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGJtLnJzdAorKysgYi9Eb2MvbGlicmFyeS9kYm0ucnN0CkBAIC0zNTEsNiArMzUxLDEwIEBACiAgICAgICA6ZnVuYzpgLm9wZW5gIGFsd2F5cyBjcmVhdGVzIGEgbmV3IGRhdGFiYXNlIHdoZW4gdGhlIGZsYWcgaGFzIHRoZSB2YWx1ZQogICAgICAgYGAnbidgYC4KIAorICAgLi4gZGVwcmVjYXRlZC1yZW1vdmVkOjogMy42IDMuOAorICAgICAgQ3JlYXRpbmcgZGF0YWJhc2UgaW4gYGAncidgYCBhbmQgYGAndydgYCBtb2Rlcy4gIE1vZGlmeWluZyBkYXRhYmFzZSBpbgorICAgICAgYGAncidgYCBtb2RlLgorCiAgICBJbiBhZGRpdGlvbiB0byB0aGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUKICAgIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLk11dGFibGVNYXBwaW5nYCBjbGFzcywgOmNsYXNzOmBkdW1iZGJtYCBvYmplY3RzCiAgICBwcm92aWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2RlY2ltYWwucnN0IGIvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKaW5kZXggNTI4Zjk3Yi4uOWVkYzY5NiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGVjaW1hbC5yc3QKQEAgLTQ0Nyw2ICs0NDcsMTkgQEAKICAgICAgIGBgRGVjaW1hbCgnMzIxZSs1JykuYWRqdXN0ZWQoKWBgIHJldHVybnMgc2V2ZW4uICBVc2VkIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgIHBvc2l0aW9uIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0IHdpdGggcmVzcGVjdCB0byB0aGUgZGVjaW1hbCBwb2ludC4KIAorICAgLi4gbWV0aG9kOjogYXNfaW50ZWdlcl9yYXRpbygpCisKKyAgICAgIFJldHVybiBhIHBhaXIgYGAobiwgZClgYCBvZiBpbnRlZ2VycyB0aGF0IHJlcHJlc2VudCB0aGUgZ2l2ZW4KKyAgICAgIDpjbGFzczpgRGVjaW1hbGAgaW5zdGFuY2UgYXMgYSBmcmFjdGlvbiwgaW4gbG93ZXN0IHRlcm1zIGFuZAorICAgICAgd2l0aCBhIHBvc2l0aXZlIGRlbm9taW5hdG9yOjoKKworICAgICAgICAgID4+PiBEZWNpbWFsKCctMy4xNCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAgICgtMTU3LCA1MCkKKworICAgICAgVGhlIGNvbnZlcnNpb24gaXMgZXhhY3QuICBSYWlzZSBPdmVyZmxvd0Vycm9yIG9uIGluZmluaXRpZXMgYW5kIFZhbHVlRXJyb3IKKyAgICAgIG9uIE5hTnMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgogCiAgICAuLiBtZXRob2Q6OiBhc190dXBsZSgpCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2Rpcy5yc3QgYi9Eb2MvbGlicmFyeS9kaXMucnN0CmluZGV4IGQyZDhhYzcuLjI0NWI0ZDIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2Rpcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZGlzLnJzdApAQCAtMzEsOSArMzEsOSBAQAogCiAgICA+Pj4gZGlzLmRpcyhteWZ1bmMpCiAgICAgIDIgICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKGxlbikKLSAgICAgICAgICAgICAgICAgMyBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYWxpc3QpCi0gICAgICAgICAgICAgICAgIDYgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKLSAgICAgICAgICAgICAgICAgOSBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgICAgMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYWxpc3QpCisgICAgICAgICAgICAgICAgIDQgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgNiBSRVRVUk5fVkFMVUUKIAogKFRoZSAiMiIgaXMgYSBsaW5lIG51bWJlcikuCiAKQEAgLTY4Miw4ICs2ODIsNyBAQAogICAgLi4gWFhYIGV4cGxhaW4gdGhlIFdIWSBzdHVmZiEKIAogCi1BbGwgb2YgdGhlIGZvbGxvd2luZyBvcGNvZGVzIGV4cGVjdCBhcmd1bWVudHMuICBBbiBhcmd1bWVudCBpcyB0d28gYnl0ZXMsIHdpdGgKLXRoZSBtb3JlIHNpZ25pZmljYW50IGJ5dGUgbGFzdC4KK0FsbCBvZiB0aGUgZm9sbG93aW5nIG9wY29kZXMgdXNlIHRoZWlyIGFyZ3VtZW50cy4KIAogLi4gb3Bjb2RlOjogU1RPUkVfTkFNRSAobmFtZWkpCiAKQEAgLTc2OSw2ICs3NjgsMTUgQEAKICAgIHRvIGhvbGQgKmNvdW50KiBlbnRyaWVzLgogCiAKKy4uIG9wY29kZTo6IEJVSUxEX0NPTlNUX0tFWV9NQVAgKGNvdW50KQorCisgICBUaGUgdmVyc2lvbiBvZiA6b3Bjb2RlOmBCVUlMRF9NQVBgIHNwZWNpYWxpemVkIGZvciBjb25zdGFudCBrZXlzLiAgKmNvdW50KgorICAgdmFsdWVzIGFyZSBjb25zdW1lZCBmcm9tIHRoZSBzdGFjay4gIFRoZSB0b3AgZWxlbWVudCBvbiB0aGUgc3RhY2sgY29udGFpbnMKKyAgIGEgdHVwbGUgb2Yga2V5cy4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogLi4gb3Bjb2RlOjogTE9BRF9BVFRSIChuYW1laSkKIAogICAgUmVwbGFjZXMgVE9TIHdpdGggYGBnZXRhdHRyKFRPUywgY29fbmFtZXNbbmFtZWldKWBgLgpAQCAtOTI5LDI3ICs5MzcsMTYgQEAKIC4uIG9wY29kZTo6IE1BS0VfRlVOQ1RJT04gKGFyZ2MpCiAKICAgIFB1c2hlcyBhIG5ldyBmdW5jdGlvbiBvYmplY3Qgb24gdGhlIHN0YWNrLiAgRnJvbSBib3R0b20gdG8gdG9wLCB0aGUgY29uc3VtZWQKLSAgIHN0YWNrIG11c3QgY29uc2lzdCBvZgorICAgc3RhY2sgbXVzdCBjb25zaXN0IG9mIHZhbHVlcyBpZiB0aGUgYXJndW1lbnQgY2FycmllcyBhIHNwZWNpZmllZCBmbGFnIHZhbHVlCiAKLSAgICogYGBhcmdjICYgMHhGRmBgIGRlZmF1bHQgYXJndW1lbnQgb2JqZWN0cyBpbiBwb3NpdGlvbmFsIG9yZGVyCi0gICAqIGBgKGFyZ2MgPj4gOCkgJiAweEZGYGAgcGFpcnMgb2YgbmFtZSBhbmQgZGVmYXVsdCBhcmd1bWVudCwgd2l0aCB0aGUgbmFtZQotICAgICBqdXN0IGJlbG93IHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrLCBmb3Iga2V5d29yZC1vbmx5IHBhcmFtZXRlcnMKLSAgICogYGAoYXJnYyA+PiAxNikgJiAweDdGRkZgYCBwYXJhbWV0ZXIgYW5ub3RhdGlvbiBvYmplY3RzCi0gICAqIGEgdHVwbGUgbGlzdGluZyB0aGUgcGFyYW1ldGVyIG5hbWVzIGZvciB0aGUgYW5ub3RhdGlvbnMgKG9ubHkgaWYgdGhlcmUgYXJlCi0gICAgIG9ueSBhbm5vdGF0aW9uIG9iamVjdHMpCisgICAqIGBgMHgwMWBgIGEgdHVwbGUgb2YgZGVmYXVsdCBhcmd1bWVudCBvYmplY3RzIGluIHBvc2l0aW9uYWwgb3JkZXIKKyAgICogYGAweDAyYGAgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQtb25seSBwYXJhbWV0ZXJzJyBkZWZhdWx0IHZhbHVlcworICAgKiBgYDB4MDRgYCBhbiBhbm5vdGF0aW9uIGRpY3Rpb25hcnkKKyAgICogYGAweDA4YGAgYSB0dXBsZSBjb250YWluaW5nIGNlbGxzIGZvciBmcmVlIHZhcmlhYmxlcywgbWFraW5nIGEgY2xvc3VyZQogICAgKiB0aGUgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uIChhdCBUT1MxKQogICAgKiB0aGUgOnRlcm06YHF1YWxpZmllZCBuYW1lYCBvZiB0aGUgZnVuY3Rpb24gKGF0IFRPUykKIAogCi0uLiBvcGNvZGU6OiBNQUtFX0NMT1NVUkUgKGFyZ2MpCi0KLSAgIENyZWF0ZXMgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LCBzZXRzIGl0cyAqX19jbG9zdXJlX18qIHNsb3QsIGFuZCBwdXNoZXMgaXQgb24KLSAgIHRoZSBzdGFjay4gIFRPUyBpcyB0aGUgOnRlcm06YHF1YWxpZmllZCBuYW1lYCBvZiB0aGUgZnVuY3Rpb24sIFRPUzEgaXMgdGhlCi0gICBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnVuY3Rpb24sIGFuZCBUT1MyIGlzIHRoZSB0dXBsZSBjb250YWluaW5nIGNlbGxzIGZvcgotICAgdGhlIGNsb3N1cmUncyBmcmVlIHZhcmlhYmxlcy4gICphcmdjKiBpcyBpbnRlcnByZXRlZCBhcyBpbiBgYE1BS0VfRlVOQ1RJT05gYDsKLSAgIHRoZSBhbm5vdGF0aW9ucyBhbmQgZGVmYXVsdHMgYXJlIGFsc28gaW4gdGhlIHNhbWUgb3JkZXIgYmVsb3cgVE9TMi4KLQotCiAuLiBvcGNvZGU6OiBCVUlMRF9TTElDRSAoYXJnYykKIAogICAgLi4gaW5kZXg6OiBidWlsdGluOiBzbGljZQpAQCAtOTg5LDYgKzk4NiwyOCBAQAogICAgYXJndW1lbnRzLgogCiAKKy4uIG9wY29kZTo6IEZPUk1BVF9WQUxVRSAoZmxhZ3MpCisKKyAgIFVzZWQgZm9yIGltcGxlbWVudGluZyBmb3JtYXR0ZWQgbGl0ZXJhbCBzdHJpbmdzIChmLXN0cmluZ3MpLiAgUG9wcworICAgYW4gb3B0aW9uYWwgKmZtdF9zcGVjKiBmcm9tIHRoZSBzdGFjaywgdGhlbiBhIHJlcXVpcmVkICp2YWx1ZSouCisgICAqZmxhZ3MqIGlzIGludGVycHJldGVkIGFzIGZvbGxvd3M6CisKKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAwYGA6ICp2YWx1ZSogaXMgZm9ybWF0dGVkIGFzLWlzLgorICAgKiBgYChmbGFncyAmIDB4MDMpID09IDB4MDFgYDogY2FsbCA6ZnVuYzpgc3RyYCBvbiAqdmFsdWUqIGJlZm9yZQorICAgICBmb3JtYXR0aW5nIGl0LgorICAgKiBgYChmbGFncyAmIDB4MDMpID09IDB4MDJgYDogY2FsbCA6ZnVuYzpgcmVwcmAgb24gKnZhbHVlKiBiZWZvcmUKKyAgICAgZm9ybWF0dGluZyBpdC4KKyAgICogYGAoZmxhZ3MgJiAweDAzKSA9PSAweDAzYGA6IGNhbGwgOmZ1bmM6YGFzY2lpYCBvbiAqdmFsdWUqIGJlZm9yZQorICAgICBmb3JtYXR0aW5nIGl0LgorICAgKiBgYChmbGFncyAmIDB4MDQpID09IDB4MDRgYDogcG9wICpmbXRfc3BlYyogZnJvbSB0aGUgc3RhY2sgYW5kIHVzZQorICAgICBpdCwgZWxzZSB1c2UgYW4gZW1wdHkgKmZtdF9zcGVjKi4KKworICAgRm9ybWF0dGluZyBpcyBwZXJmb3JtZWQgdXNpbmcgOmM6ZnVuYzpgUHlPYmplY3RfRm9ybWF0YC4gIFRoZQorICAgcmVzdWx0IGlzIHB1c2hlZCBvbiB0aGUgc3RhY2suCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKIC4uIG9wY29kZTo6IEhBVkVfQVJHVU1FTlQKIAogICAgVGhpcyBpcyBub3QgcmVhbGx5IGFuIG9wY29kZS4gIEl0IGlkZW50aWZpZXMgdGhlIGRpdmlkaW5nIGxpbmUgYmV0d2VlbgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZW51bS5yc3QgYi9Eb2MvbGlicmFyeS9lbnVtLnJzdAppbmRleCBhM2Q1YWZjLi4yMTExZDFjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9lbnVtLnJzdAorKysgYi9Eb2MvbGlicmFyeS9lbnVtLnJzdApAQCAtNTU4LDcgKzU1OCw4IEBACiA0LiAlLXN0eWxlIGZvcm1hdHRpbmc6ICBgJXNgIGFuZCBgJXJgIGNhbGwgdGhlIDpjbGFzczpgRW51bWAgY2xhc3MncwogICAgOm1ldGg6YF9fc3RyX19gIGFuZCA6bWV0aDpgX19yZXByX19gIHJlc3BlY3RpdmVseTsgb3RoZXIgY29kZXMgKHN1Y2ggYXMKICAgIGAlaWAgb3IgYCVoYCBmb3IgSW50RW51bSkgdHJlYXQgdGhlIGVudW0gbWVtYmVyIGFzIGl0cyBtaXhlZC1pbiB0eXBlLgotNS4gOm1ldGg6YHN0ci5mb3JtYXRgIChvciA6ZnVuYzpgZm9ybWF0YCkgd2lsbCB1c2UgdGhlIG1peGVkLWluCis1LiA6cmVmOmBGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIDxmLXN0cmluZ3M+YCwgOm1ldGg6YHN0ci5mb3JtYXRgLAorICAgYW5kIDpmdW5jOmBmb3JtYXRgIHdpbGwgdXNlIHRoZSBtaXhlZC1pbgogICAgdHlwZSdzIDptZXRoOmBfX2Zvcm1hdF9fYC4gIElmIHRoZSA6Y2xhc3M6YEVudW1gIGNsYXNzJ3MgOmZ1bmM6YHN0cmAgb3IKICAgIDpmdW5jOmByZXByYCBpcyBkZXNpcmVkLCB1c2UgdGhlIGAhc2Agb3IgYCFyYCBmb3JtYXQgY29kZXMuCiAKQEAgLTc0Nyw2ICs3NDgsMTUgQEAKIAogLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKIAorQm9vbGVhbiBldmFsdWF0aW9uOiBFbnVtIGNsYXNzZXMgdGhhdCBhcmUgbWl4ZWQgd2l0aCBub24tRW51bSB0eXBlcyAoc3VjaCBhcworOmNsYXNzOmBpbnRgLCA6Y2xhc3M6YHN0cmAsIGV0Yy4pIGFyZSBldmFsdWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBtaXhlZC1pbgordHlwZSdzIHJ1bGVzOyBvdGhlcndpc2UsIGFsbCBtZW1iZXJzIGV2YWx1YXRlIGFzIGBgVHJ1ZWBgLiAgVG8gbWFrZSB5b3VyIG93bgorRW51bSdzIGJvb2xlYW4gZXZhbHVhdGlvbiBkZXBlbmQgb24gdGhlIG1lbWJlcidzIHZhbHVlIGFkZCB0aGUgZm9sbG93aW5nIHRvCit5b3VyIGNsYXNzOjoKKworICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi52YWx1ZSkKKwogVGhlIDphdHRyOmBfX21lbWJlcnNfX2AgYXR0cmlidXRlIGlzIG9ubHkgYXZhaWxhYmxlIG9uIHRoZSBjbGFzcy4KIAogSWYgeW91IGdpdmUgeW91ciA6Y2xhc3M6YEVudW1gIHN1YmNsYXNzIGV4dHJhIG1ldGhvZHMsIGxpa2UgdGhlIGBQbGFuZXRgXwpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZmF1bHRoYW5kbGVyLnJzdCBiL0RvYy9saWJyYXJ5L2ZhdWx0aGFuZGxlci5yc3QKaW5kZXggZGVlZGVhMS4uZDBjNGNkMCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZmF1bHRoYW5kbGVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9mYXVsdGhhbmRsZXIucnN0CkBAIC03MCw2ICs3MCw5IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcGFzc2luZyBmaWxlIGRlc2NyaXB0b3IgdG8gdGhpcyBmdW5jdGlvbi4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIE9uIFdpbmRvd3MsIGEgaGFuZGxlciBmb3IgV2luZG93cyBleGNlcHRpb24gaXMgYWxzbyBpbnN0YWxsZWQuCisKIC4uIGZ1bmN0aW9uOjogZGlzYWJsZSgpCiAKICAgIERpc2FibGUgdGhlIGZhdWx0IGhhbmRsZXI6IHVuaW5zdGFsbCB0aGUgc2lnbmFsIGhhbmRsZXJzIGluc3RhbGxlZCBieQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZmlsZWlucHV0LnJzdCBiL0RvYy9saWJyYXJ5L2ZpbGVpbnB1dC5yc3QKaW5kZXggYWE0YzUyOS4uNTg4MWZlZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZmlsZWlucHV0LnJzdAorKysgYi9Eb2MvbGlicmFyeS9maWxlaW5wdXQucnN0CkBAIC03Miw5ICs3Miw4IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgQ2FuIGJlIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIuCiAKLSAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41LjIKLSAgICAgIFRoZSAqYnVmc2l6ZSogcGFyYW1ldGVyIGlzIG5vIGxvbmdlciB1c2VkLgotCisgICAuLiBkZXByZWNhdGVkLXJlbW92ZWQ6OiAzLjYgMy44CisgICAgICBUaGUgKmJ1ZnNpemUqIHBhcmFtZXRlci4KIAogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdXNlIHRoZSBnbG9iYWwgc3RhdGUgY3JlYXRlZCBieSA6ZnVuYzpgZmlsZWlucHV0LmlucHV0YDsKIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBzdGF0ZSwgOmV4YzpgUnVudGltZUVycm9yYCBpcyByYWlzZWQuCkBAIC0xNjcsOCArMTY2LDggQEAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjQKICAgICAgIFRoZSBgYCdyVSdgYCBhbmQgYGAnVSdgYCBtb2Rlcy4KIAotICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUuMgotICAgICAgVGhlICpidWZzaXplKiBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIHVzZWQuCisgICAuLiBkZXByZWNhdGVkLXJlbW92ZWQ6OiAzLjYgMy44CisgICAgICBUaGUgKmJ1ZnNpemUqIHBhcmFtZXRlci4KIAogCiAqKk9wdGlvbmFsIGluLXBsYWNlIGZpbHRlcmluZzoqKiBpZiB0aGUga2V5d29yZCBhcmd1bWVudCBgYGlucGxhY2U9VHJ1ZWBgIGlzCkBAIC0xOTUsMTAgKzE5NCwxNCBAQAogICAgVXNhZ2UgZXhhbXBsZTogIGBgZmkgPSBmaWxlaW5wdXQuRmlsZUlucHV0KG9wZW5ob29rPWZpbGVpbnB1dC5ob29rX2NvbXByZXNzZWQpYGAKIAogCi0uLiBmdW5jdGlvbjo6IGhvb2tfZW5jb2RlZChlbmNvZGluZykKKy4uIGZ1bmN0aW9uOjogaG9va19lbmNvZGVkKGVuY29kaW5nLCBlcnJvcnM9Tm9uZSkKIAogICAgUmV0dXJucyBhIGhvb2sgd2hpY2ggb3BlbnMgZWFjaCBmaWxlIHdpdGggOmZ1bmM6YG9wZW5gLCB1c2luZyB0aGUgZ2l2ZW4KLSAgICplbmNvZGluZyogdG8gcmVhZCB0aGUgZmlsZS4KKyAgICplbmNvZGluZyogYW5kICplcnJvcnMqIHRvIHJlYWQgdGhlIGZpbGUuCiAKICAgIFVzYWdlIGV4YW1wbGU6IGBgZmkgPQotICAgZmlsZWlucHV0LkZpbGVJbnB1dChvcGVuaG9vaz1maWxlaW5wdXQuaG9va19lbmNvZGVkKCJpc28tODg1OS0xIikpYGAKKyAgIGZpbGVpbnB1dC5GaWxlSW5wdXQob3Blbmhvb2s9ZmlsZWlucHV0Lmhvb2tfZW5jb2RlZCgidXRmLTgiLAorICAgInN1cnJvZ2F0ZWVzY2FwZSIpKWBgCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCB0aGUgb3B0aW9uYWwgKmVycm9ycyogcGFyYW1ldGVyLgpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvZnVuY3Rpb25zLnJzdCBiL0RvYy9saWJyYXJ5L2Z1bmN0aW9ucy5yc3QKaW5kZXggZWZhNWJkMy4uNzIxNmYxZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvZnVuY3Rpb25zLnJzdAorKysgYi9Eb2MvbGlicmFyeS9mdW5jdGlvbnMucnN0CkBAIC04NzgsMTEgKzg3OCwxMSBAQAogICAgT3BlbiAqZmlsZSogYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgOnRlcm06YGZpbGUgb2JqZWN0YC4gIElmIHRoZSBmaWxlCiAgICBjYW5ub3QgYmUgb3BlbmVkLCBhbiA6ZXhjOmBPU0Vycm9yYCBpcyByYWlzZWQuCiAKLSAgICpmaWxlKiBpcyBlaXRoZXIgYSBzdHJpbmcgb3IgYnl0ZXMgb2JqZWN0IGdpdmluZyB0aGUgcGF0aG5hbWUgKGFic29sdXRlIG9yCi0gICByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkgb2YgdGhlIGZpbGUgdG8gYmUgb3BlbmVkIG9yCi0gICBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBiZSB3cmFwcGVkLiAgKElmIGEgZmlsZSBkZXNjcmlwdG9yCi0gICBpcyBnaXZlbiwgaXQgaXMgY2xvc2VkIHdoZW4gdGhlIHJldHVybmVkIEkvTyBvYmplY3QgaXMgY2xvc2VkLCB1bmxlc3MKLSAgICpjbG9zZWZkKiBpcyBzZXQgdG8gYGBGYWxzZWBgLikKKyAgICpmaWxlKiBpcyBlaXRoZXIgYSBzdHJpbmcsIGJ5dGVzLCBvciA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBvYmplY3QgZ2l2aW5nIHRoZQorICAgcGF0aG5hbWUgKGFic29sdXRlIG9yIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5KSBvZiB0aGUgZmlsZQorICAgdG8gYmUgb3BlbmVkIG9yIGFuIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWxlIHRvIGJlIHdyYXBwZWQuICAoSWYgYQorICAgZmlsZSBkZXNjcmlwdG9yIGlzIGdpdmVuLCBpdCBpcyBjbG9zZWQgd2hlbiB0aGUgcmV0dXJuZWQgSS9PIG9iamVjdCBpcworICAgY2xvc2VkLCB1bmxlc3MgKmNsb3NlZmQqIGlzIHNldCB0byBgYEZhbHNlYGAuKQogCiAgICAqbW9kZSogaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIHRoZSBtb2RlIGluIHdoaWNoIHRoZSBmaWxlIGlzCiAgICBvcGVuZWQuICBJdCBkZWZhdWx0cyB0byBgYCdyJ2BgIHdoaWNoIG1lYW5zIG9wZW4gZm9yIHJlYWRpbmcgaW4gdGV4dCBtb2RlLgpAQCAtMTA3Nyw2ICsxMDc3LDkgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICBUaGUgYGAnbmFtZXJlcGxhY2UnYGAgZXJyb3IgaGFuZGxlciB3YXMgYWRkZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBTdXBwb3J0IGFkZGVkIHRvIGFjY2VwdCBvYmplY3RzIGltcGxlbWVudGluZyA6Y2xhc3M6YG9zLlBhdGhMaWtlYC4KKwogLi4gZnVuY3Rpb246OiBvcmQoYykKIAogICAgR2l2ZW4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIG9uZSBVbmljb2RlIGNoYXJhY3RlciwgcmV0dXJuIGFuIGludGVnZXIKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2dycC5yc3QgYi9Eb2MvbGlicmFyeS9ncnAucnN0CmluZGV4IGEzMGU2MjIuLjc0ZGUzZjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2dycC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvZ3JwLnJzdApAQCAtNDMsNiArNDMsOSBAQAogICAgUmV0dXJuIHRoZSBncm91cCBkYXRhYmFzZSBlbnRyeSBmb3IgdGhlIGdpdmVuIG51bWVyaWMgZ3JvdXAgSUQuIDpleGM6YEtleUVycm9yYAogICAgaXMgcmFpc2VkIGlmIHRoZSBlbnRyeSBhc2tlZCBmb3IgY2Fubm90IGJlIGZvdW5kLgogCisgICAuLiBkZXByZWNhdGVkOjogMy42CisgICAgICBTaW5jZSBQeXRob24gMy42IHRoZSBzdXBwb3J0IG9mIG5vbi1pbnRlZ2VyIGFyZ3VtZW50cyBsaWtlIGZsb2F0cyBvcgorICAgICAgc3RyaW5ncyBpbiA6ZnVuYzpgZ2V0Z3JnaWRgIGlzIGRlcHJlY2F0ZWQuCiAKIC4uIGZ1bmN0aW9uOjogZ2V0Z3JuYW0obmFtZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaGFzaGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9oYXNobGliLnJzdAppbmRleCAzMGJlMzM1Li45M2JjYzkxIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9oYXNobGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9oYXNobGliLnJzdApAQCAtMzksOCArMzksOCBAQAogLS0tLS0tLS0tLS0tLS0tCiAKIFRoZXJlIGlzIG9uZSBjb25zdHJ1Y3RvciBtZXRob2QgbmFtZWQgZm9yIGVhY2ggdHlwZSBvZiA6ZGZuOmBoYXNoYC4gIEFsbCByZXR1cm4KLWEgaGFzaCBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaW1wbGUgaW50ZXJmYWNlLiBGb3IgZXhhbXBsZTogdXNlIDpmdW5jOmBzaGExYCB0bwotY3JlYXRlIGEgU0hBMSBoYXNoIG9iamVjdC4gWW91IGNhbiBub3cgZmVlZCB0aGlzIG9iamVjdCB3aXRoIDp0ZXJtOmBieXRlcy1saWtlCithIGhhc2ggb2JqZWN0IHdpdGggdGhlIHNhbWUgc2ltcGxlIGludGVyZmFjZS4gRm9yIGV4YW1wbGU6IHVzZSA6ZnVuYzpgc2hhMjU2YCB0bworY3JlYXRlIGEgU0hBLTI1NiBoYXNoIG9iamVjdC4gWW91IGNhbiBub3cgZmVlZCB0aGlzIG9iamVjdCB3aXRoIDp0ZXJtOmBieXRlcy1saWtlCiBvYmplY3RzIDxieXRlcy1saWtlIG9iamVjdD5gIChub3JtYWxseSA6Y2xhc3M6YGJ5dGVzYCkgdXNpbmcgdGhlIDptZXRoOmB1cGRhdGVgIG1ldGhvZC4KIEF0IGFueSBwb2ludCB5b3UgY2FuIGFzayBpdCBmb3IgdGhlIDpkZm46YGRpZ2VzdGAgb2YgdGhlCiBjb25jYXRlbmF0aW9uIG9mIHRoZSBkYXRhIGZlZCB0byBpdCBzbyBmYXIgdXNpbmcgdGhlIDptZXRoOmBkaWdlc3RgIG9yCkBAIC01OSwyMSArNTksMjMgQEAKIC4uIGluZGV4Ojogc2luZ2xlOiBPcGVuU1NMOyAodXNlIGluIG1vZHVsZSBoYXNobGliKQogCiBDb25zdHJ1Y3RvcnMgZm9yIGhhc2ggYWxnb3JpdGhtcyB0aGF0IGFyZSBhbHdheXMgcHJlc2VudCBpbiB0aGlzIG1vZHVsZSBhcmUKLTpmdW5jOmBtZDVgLCA6ZnVuYzpgc2hhMWAsIDpmdW5jOmBzaGEyMjRgLCA6ZnVuYzpgc2hhMjU2YCwgOmZ1bmM6YHNoYTM4NGAsCi1hbmQgOmZ1bmM6YHNoYTUxMmAuIEFkZGl0aW9uYWwgYWxnb3JpdGhtcyBtYXkgYWxzbyBiZSBhdmFpbGFibGUgZGVwZW5kaW5nIHVwb24KLXRoZSBPcGVuU1NMIGxpYnJhcnkgdGhhdCBQeXRob24gdXNlcyBvbiB5b3VyIHBsYXRmb3JtLgorOmZ1bmM6YHNoYTFgLCA6ZnVuYzpgc2hhMjI0YCwgOmZ1bmM6YHNoYTI1NmAsIDpmdW5jOmBzaGEzODRgLAorYW5kIDpmdW5jOmBzaGE1MTJgLiAgOmZ1bmM6YG1kNWAgaXMgbm9ybWFsbHkgYXZhaWxhYmxlIGFzIHdlbGwsIHRob3VnaCBpdAorbWF5IGJlIG1pc3NpbmcgaWYgeW91IGFyZSB1c2luZyBhIHJhcmUgIkZJUFMgY29tcGxpYW50IiBidWlsZCBvZiBQeXRob24uCitBZGRpdGlvbmFsIGFsZ29yaXRobXMgbWF5IGFsc28gYmUgYXZhaWxhYmxlIGRlcGVuZGluZyB1cG9uIHRoZSBPcGVuU1NMCitsaWJyYXJ5IHRoYXQgUHl0aG9uIHVzZXMgb24geW91ciBwbGF0Zm9ybS4KIAogRm9yIGV4YW1wbGUsIHRvIG9idGFpbiB0aGUgZGlnZXN0IG9mIHRoZSBieXRlIHN0cmluZyBgYGInTm9ib2R5IGluc3BlY3RzIHRoZQogc3BhbW1pc2ggcmVwZXRpdGlvbidgYDo6CiAKICAgID4+PiBpbXBvcnQgaGFzaGxpYgotICAgPj4+IG0gPSBoYXNobGliLm1kNSgpCisgICA+Pj4gbSA9IGhhc2hsaWIuc2hhMjU2KCkKICAgID4+PiBtLnVwZGF0ZShiIk5vYm9keSBpbnNwZWN0cyIpCiAgICA+Pj4gbS51cGRhdGUoYiIgdGhlIHNwYW1taXNoIHJlcGV0aXRpb24iKQogICAgPj4+IG0uZGlnZXN0KCkKLSAgIGInXHhiYmRceDljXHg4M1x4ZGRceDFlXHhhNVx4YzlceGQ5XHhkZVx4YzlceGExXHg4ZFx4ZjBceGZmXHhlOScKKyAgIGInXHgwM1x4MWVceGRkfUFlXHgxNVx4OTNceGM1XHhmZVxcXHgwMG9ceGE1dSs3XHhmZFx4ZGZceGY3XHhiY05ceDg0Olx4YTZceGFmXHgwY1x4OTVceDBmS1x4OTRceDA2JwogICAgPj4+IG0uZGlnZXN0X3NpemUKLSAgIDE2CisgICAzMgogICAgPj4+IG0uYmxvY2tfc2l6ZQogICAgNjQKIApAQCAtMTAyLDcgKzEwNCw5IEBACiAuLiBkYXRhOjogYWxnb3JpdGhtc19ndWFyYW50ZWVkCiAKICAgIEEgc2V0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBoYXNoIGFsZ29yaXRobXMgZ3VhcmFudGVlZCB0byBiZSBzdXBwb3J0ZWQKLSAgIGJ5IHRoaXMgbW9kdWxlIG9uIGFsbCBwbGF0Zm9ybXMuCisgICBieSB0aGlzIG1vZHVsZSBvbiBhbGwgcGxhdGZvcm1zLiAgTm90ZSB0aGF0ICdtZDUnIGlzIGluIHRoaXMgbGlzdCBkZXNwaXRlCisgICBzb21lIHVwc3RyZWFtIHZlbmRvcnMgb2ZmZXJpbmcgYW4gb2RkICJGSVBTIGNvbXBsaWFudCIgUHl0aG9uIGJ1aWxkIHRoYXQKKyAgIGV4Y2x1ZGVzIGl0LgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaHR0cC5zZXJ2ZXIucnN0IGIvRG9jL2xpYnJhcnkvaHR0cC5zZXJ2ZXIucnN0CmluZGV4IDE2YzRmYWMuLmMxZWE4NzMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L2h0dHAuc2VydmVyLnJzdAorKysgYi9Eb2MvbGlicmFyeS9odHRwLnNlcnZlci5yc3QKQEAgLTk4LDggKzk4LDggQEAKIAogICAgLi4gYXR0cmlidXRlOjogcmZpbGUKIAotICAgICAgQ29udGFpbnMgYW4gaW5wdXQgc3RyZWFtLCBwb3NpdGlvbmVkIGF0IHRoZSBzdGFydCBvZiB0aGUgb3B0aW9uYWwgaW5wdXQKLSAgICAgIGRhdGEuCisgICAgICBBbiA6Y2xhc3M6YGlvLkJ1ZmZlcmVkSU9CYXNlYCBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgZnJvbQorICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBvcHRpb25hbCBpbnB1dCBkYXRhLgogCiAgICAuLiBhdHRyaWJ1dGU6OiB3ZmlsZQogCkBAIC0xMDcsNiArMTA3LDkgQEAKICAgICAgIGNsaWVudC4gUHJvcGVyIGFkaGVyZW5jZSB0byB0aGUgSFRUUCBwcm90b2NvbCBtdXN0IGJlIHVzZWQgd2hlbiB3cml0aW5nIHRvCiAgICAgICB0aGlzIHN0cmVhbS4KIAorICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgIFRoaXMgaXMgYW4gOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgc3RyZWFtLgorCiAgICA6Y2xhc3M6YEJhc2VIVFRQUmVxdWVzdEhhbmRsZXJgIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CiAKICAgIC4uIGF0dHJpYnV0ZTo6IHNlcnZlcl92ZXJzaW9uCkBAIC0zNjksMTAgKzM3Miw5IEBACiAKICAgIEhhbmRsZXIgPSBodHRwLnNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIKIAotICAgaHR0cGQgPSBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKCgiIiwgUE9SVCksIEhhbmRsZXIpCi0KLSAgIHByaW50KCJzZXJ2aW5nIGF0IHBvcnQiLCBQT1JUKQotICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisgICB3aXRoIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKCIiLCBQT1JUKSwgSGFuZGxlcikgYXMgaHR0cGQ6CisgICAgICAgcHJpbnQoInNlcnZpbmcgYXQgcG9ydCIsIFBPUlQpCisgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCiAKIC4uIF9odHRwLXNlcnZlci1jbGk6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2ltYXBsaWIucnN0IGIvRG9jL2xpYnJhcnkvaW1hcGxpYi5yc3QKaW5kZXggYzI1ZTdkOC4uYjliM2I5MSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1hcGxpYi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW1hcGxpYi5yc3QKQEAgLTUwMCw2ICs1MDAsMTcgQEAKICAgICAgICAgIE0uc3RvcmUobnVtLCAnK0ZMQUdTJywgJ1xcRGVsZXRlZCcpCiAgICAgICBNLmV4cHVuZ2UoKQogCisgICAuLiBub3RlOjoKKworICAgICAgQ3JlYXRpbmcgZmxhZ3MgY29udGFpbmluZyAnXScgKGZvciBleGFtcGxlOiAiW3Rlc3RdIikgdmlvbGF0ZXMKKyAgICAgIDpyZmM6YDM1MDFgICh0aGUgSU1BUCBwcm90b2NvbCkuICBIb3dldmVyLCBpbWFwbGliIGhhcyBoaXN0b3JpY2FsbHkKKyAgICAgIGFsbG93ZWQgY3JlYXRpb24gb2Ygc3VjaCB0YWdzLCBhbmQgcG9wdWxhciBJTUFQIHNlcnZlcnMsIHN1Y2ggYXMgR21haWwsCisgICAgICBhY2NlcHQgYW5kIHByb2R1Y2Ugc3VjaCBmbGFncy4gIFRoZXJlIGFyZSBub24tUHl0aG9uIHByb2dyYW1zIHdoaWNoIGFsc28KKyAgICAgIGNyZWF0ZSBzdWNoIHRhZ3MuICBBbHRob3VnaCBpdCBpcyBhbiBSRkMgdmlvbGF0aW9uIGFuZCBJTUFQIGNsaWVudHMgYW5kCisgICAgICBzZXJ2ZXJzIGFyZSBzdXBwb3NlZCB0byBiZSBzdHJpY3QsIGltYXBsaWIgbm9uZXRoZWxlc3MgY29udGludWVzIHRvIGFsbG93CisgICAgICBzdWNoIHRhZ3MgdG8gYmUgY3JlYXRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zLCBhbmQgYXMgb2YKKyAgICAgIHB5dGhvbiAzLjYsIGhhbmRsZXMgdGhlbSBpZiB0aGV5IGFyZSBzZW50IGZyb20gdGhlIHNlcnZlciwgc2luY2UgdGhpcworICAgICAgaW1wcm92ZXMgcmVhbC13b3JsZCBjb21wYXRpYmlsaXR5LgogCiAuLiBtZXRob2Q6OiBJTUFQNC5zdWJzY3JpYmUobWFpbGJveCkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW1wLnJzdCBiL0RvYy9saWJyYXJ5L2ltcC5yc3QKaW5kZXggOTgyOGJhNi4uY2NmNWY5MiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1wLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbXAucnN0CkBAIC04NSw3ICs4NSw5IEBACiAgICAuLiBkZXByZWNhdGVkOjogMy4zCiAgICAgICBVc2UgOmZ1bmM6YGltcG9ydGxpYi51dGlsLmZpbmRfc3BlY2AgaW5zdGVhZCB1bmxlc3MgUHl0aG9uIDMuMwogICAgICAgY29tcGF0aWJpbGl0eSBpcyByZXF1aXJlZCwgaW4gd2hpY2ggY2FzZSB1c2UKLSAgICAgIDpmdW5jOmBpbXBvcnRsaWIuZmluZF9sb2FkZXJgLgorICAgICAgOmZ1bmM6YGltcG9ydGxpYi5maW5kX2xvYWRlcmAuIEZvciBleGFtcGxlIHVzYWdlIG9mIHRoZSBmb3JtZXIgY2FzZSwKKyAgICAgIHNlZSB0aGUgOnJlZjpgaW1wb3J0bGliLWV4YW1wbGVzYCBzZWN0aW9uIG9mIHRoZSA6bW9kOmBpbXBvcnRsaWJgCisgICAgICBkb2N1bWVudGF0aW9uLgogCiAKIC4uIGZ1bmN0aW9uOjogbG9hZF9tb2R1bGUobmFtZSwgZmlsZSwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uKQpAQCAtMTEyLDkgKzExNCwxMiBAQAogICAgICAgSWYgcHJldmlvdXNseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggOmZ1bmM6YGltcC5maW5kX21vZHVsZWAgdGhlbgogICAgICAgY29uc2lkZXIgdXNpbmcgOmZ1bmM6YGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlYCwgb3RoZXJ3aXNlIHVzZSB0aGUgbG9hZGVyCiAgICAgICByZXR1cm5lZCBieSB0aGUgcmVwbGFjZW1lbnQgeW91IGNob3NlIGZvciA6ZnVuYzpgaW1wLmZpbmRfbW9kdWxlYC4gSWYgeW91Ci0gICAgICBjYWxsZWQgOmZ1bmM6YGltcC5sb2FkX21vZHVsZWAgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIGRpcmVjdGx5IHRoZW4gdXNlIHRoZQotICAgICAgY2xhc3NlcyBpbiA6bW9kOmBpbXBvcnRsaWIubWFjaGluZXJ5YCwgZS5nLgotICAgICAgYGBpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIobmFtZSwgcGF0aCkubG9hZF9tb2R1bGUoKWBgLgorICAgICAgY2FsbGVkIDpmdW5jOmBpbXAubG9hZF9tb2R1bGVgIGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBkaXJlY3RseSB3aXRoIGZpbGUKKyAgICAgIHBhdGggYXJndW1lbnRzIHRoZW4gdXNlIGEgY29tYmluYXRpb24gb2YKKyAgICAgIDpmdW5jOmBpbXBvcnRsaWIudXRpbC5zcGVjX2Zyb21fZmlsZV9sb2NhdGlvbmAgYW5kCisgICAgICA6ZnVuYzpgaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlY2AuIFNlZSB0aGUgOnJlZjpgaW1wb3J0bGliLWV4YW1wbGVzYAorICAgICAgc2VjdGlvbiBvZiB0aGUgOm1vZDpgaW1wb3J0bGliYCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9mIHRoZSB2YXJpb3VzCisgICAgICBhcHByb2FjaGVzLgogCiAKIC4uIGZ1bmN0aW9uOjogbmV3X21vZHVsZShuYW1lKQpAQCAtMTIzLDcgKzEyOCw3IEBACiAgICBpbiBgYHN5cy5tb2R1bGVzYGAuCiAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjQKLSAgICAgIFVzZSA6Y2xhc3M6YHR5cGVzLk1vZHVsZVR5cGVgIGluc3RlYWQuCisgICAgICBVc2UgOmZ1bmM6YGltcG9ydGxpYi51dGlsLm1vZHVsZV9mcm9tX3NwZWNgIGluc3RlYWQuCiAKIAogLi4gZnVuY3Rpb246OiByZWxvYWQobW9kdWxlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdCBiL0RvYy9saWJyYXJ5L2ltcG9ydGxpYi5yc3QKaW5kZXggZmY3Y2M5MS4uYzFjM2IxMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW1wb3J0bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9pbXBvcnRsaWIucnN0CkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICAgIG1vZHVsZSBhbmQgKnBhdGgqIHdpbGwgYmUgdGhlIHZhbHVlIG9mIDphdHRyOmBfX3BhdGhfX2AgZnJvbSB0aGUKICAgICAgIHBhcmVudCBwYWNrYWdlLiBJZiBhIHNwZWMgY2Fubm90IGJlIGZvdW5kLCBgYE5vbmVgYCBpcyByZXR1cm5lZC4KICAgICAgIFdoZW4gcGFzc2VkIGluLCBgYHRhcmdldGBgIGlzIGEgbW9kdWxlIG9iamVjdCB0aGF0IHRoZSBmaW5kZXIgbWF5Ci0gICAgICB1c2UgdG8gbWFrZSBhIG1vcmUgZWR1Y2F0ZWQgYWJvdXQgd2hhdCBzcGVjIHRvIHJldHVybi4KKyAgICAgIHVzZSB0byBtYWtlIGEgbW9yZSBlZHVjYXRlZCBndWVzcyBhYm91dCB3aGF0IHNwZWMgdG8gcmV0dXJuLgogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIApAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICB3aXRoaW4gdGhlIDp0ZXJtOmBwYXRoIGVudHJ5YCB0byB3aGljaCBpdCBpcyBhc3NpZ25lZC4gIElmIGEgc3BlYwogICAgICAgY2Fubm90IGJlIGZvdW5kLCBgYE5vbmVgYCBpcyByZXR1cm5lZC4gIFdoZW4gcGFzc2VkIGluLCBgYHRhcmdldGBgCiAgICAgICBpcyBhIG1vZHVsZSBvYmplY3QgdGhhdCB0aGUgZmluZGVyIG1heSB1c2UgdG8gbWFrZSBhIG1vcmUgZWR1Y2F0ZWQKLSAgICAgIGFib3V0IHdoYXQgc3BlYyB0byByZXR1cm4uCisgICAgICBndWVzcyBhYm91dCB3aGF0IHNwZWMgdG8gcmV0dXJuLgogCiAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKIApAQCAtMzc5LDEwICszNzksMTQgQEAKIAogICAgICAgIEFuIGFic3RyYWN0IG1ldGhvZCB0aGF0IGV4ZWN1dGVzIHRoZSBtb2R1bGUgaW4gaXRzIG93biBuYW1lc3BhY2UKICAgICAgICB3aGVuIGEgbW9kdWxlIGlzIGltcG9ydGVkIG9yIHJlbG9hZGVkLiAgVGhlIG1vZHVsZSBzaG91bGQgYWxyZWFkeQotICAgICAgIGJlIGluaXRpYWxpemVkIHdoZW4gZXhlY19tb2R1bGUoKSBpcyBjYWxsZWQuCisgICAgICAgYmUgaW5pdGlhbGl6ZWQgd2hlbiBgYGV4ZWNfbW9kdWxlKClgYCBpcyBjYWxsZWQuIFdoZW4gdGhpcyBtZXRob2QgZXhpc3RzLAorICAgICAgIDptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgbXVzdCBiZSBkZWZpbmVkLgogCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKKyAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgIDptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgbXVzdCBhbHNvIGJlIGRlZmluZWQuCisKICAgICAuLiBtZXRob2Q6OiBsb2FkX21vZHVsZShmdWxsbmFtZSkKIAogICAgICAgICBBIGxlZ2FjeSBtZXRob2QgZm9yIGxvYWRpbmcgYSBtb2R1bGUuIElmIHRoZSBtb2R1bGUgY2Fubm90IGJlCkBAIC05MzYsNiArOTQwLDEwIEBACiAgICAgICBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIubG9hZF9tb2R1bGVgIHdoZXJlCiAgICAgICBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbG9hZCBpcyBvcHRpb25hbC4KIAorICAgICAgLi4gZGVwcmVjYXRlZDo6IDMuNgorCisgICAgICAgICBVc2UgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYCBpbnN0ZWFkLgorCiAKIC4uIGNsYXNzOjogU291cmNlbGVzc0ZpbGVMb2FkZXIoZnVsbG5hbWUsIHBhdGgpCiAKQEAgLTk3NSw2ICs5ODMsMTAgQEAKICAgIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZWAgd2hlcmUKICAgIHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsb2FkIGlzIG9wdGlvbmFsLgogCisgICAuLiBkZXByZWNhdGVkOjogMy42CisKKyAgICAgIFVzZSA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgIGluc3RlYWQuCisKIAogLi4gY2xhc3M6OiBFeHRlbnNpb25GaWxlTG9hZGVyKGZ1bGxuYW1lLCBwYXRoKQogCkBAIC0xMTkyLDEyICsxMjA0LDEzIEBACiAKIC4uIGZ1bmN0aW9uOjogbW9kdWxlX2Zyb21fc3BlYyhzcGVjKQogCi0gICBDcmVhdGUgYSBuZXcgbW9kdWxlIGJhc2VkIG9uICoqc3BlYyoqIGFuZCBgYHNwZWMubG9hZGVyLmNyZWF0ZV9tb2R1bGUoKWBgLgorICAgQ3JlYXRlIGEgbmV3IG1vZHVsZSBiYXNlZCBvbiAqKnNwZWMqKiBhbmQKKyAgIDptZXRoOmBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlIDxpbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlPmAuCiAKLSAgIElmIGBgc3BlYy5sb2FkZXIuY3JlYXRlX21vZHVsZSgpYGAgZG9lcyBub3QgcmV0dXJuIGBgTm9uZWBgLCB0aGVuIGFueQotICAgcHJlLWV4aXN0aW5nIGF0dHJpYnV0ZXMgd2lsbCBub3QgYmUgcmVzZXQuIEFsc28sIG5vIDpleGM6YEF0dHJpYnV0ZUVycm9yYAotICAgd2lsbCBiZSByYWlzZWQgaWYgdHJpZ2dlcmVkIHdoaWxlIGFjY2Vzc2luZyAqKnNwZWMqKiBvciBzZXR0aW5nIGFuIGF0dHJpYnV0ZQotICAgb24gdGhlIG1vZHVsZS4KKyAgIElmIDptZXRoOmBzcGVjLmxvYWRlci5jcmVhdGVfbW9kdWxlIDxpbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlPmAKKyAgIGRvZXMgbm90IHJldHVybiBgYE5vbmVgYCwgdGhlbiBhbnkgcHJlLWV4aXN0aW5nIGF0dHJpYnV0ZXMgd2lsbCBub3QgYmUgcmVzZXQuCisgICBBbHNvLCBubyA6ZXhjOmBBdHRyaWJ1dGVFcnJvcmAgd2lsbCBiZSByYWlzZWQgaWYgdHJpZ2dlcmVkIHdoaWxlIGFjY2Vzc2luZworICAgKipzcGVjKiogb3Igc2V0dGluZyBhbiBhdHRyaWJ1dGUgb24gdGhlIG1vZHVsZS4KIAogICAgVGhpcyBmdW5jdGlvbiBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyA6Y2xhc3M6YHR5cGVzLk1vZHVsZVR5cGVgIHRvIGNyZWF0ZSBhCiAgICBuZXcgbW9kdWxlIGFzICoqc3BlYyoqIGlzIHVzZWQgdG8gc2V0IGFzIG1hbnkgaW1wb3J0LWNvbnRyb2xsZWQgYXR0cmlidXRlcyBvbgpAQCAtMTI1OSw3ICsxMjcyLDggQEAKIAogLi4gZGVjb3JhdG9yOjogc2V0X3BhY2thZ2UKIAotICAgQSA6dGVybTpgZGVjb3JhdG9yYCBmb3IgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCB0byBzZXQgdGhlIDphdHRyOmBfX3BhY2thZ2VfX2AgYXR0cmlidXRlIG9uIHRoZSByZXR1cm5lZCBtb2R1bGUuIElmIDphdHRyOmBfX3BhY2thZ2VfX2AKKyAgIEEgOnRlcm06YGRlY29yYXRvcmAgZm9yIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZWAgdG8gc2V0IHRoZQorICAgOmF0dHI6YF9fcGFja2FnZV9fYCBhdHRyaWJ1dGUgb24gdGhlIHJldHVybmVkIG1vZHVsZS4gSWYgOmF0dHI6YF9fcGFja2FnZV9fYAogICAgaXMgc2V0IGFuZCBoYXMgYSB2YWx1ZSBvdGhlciB0aGFuIGBgTm9uZWBgIGl0IHdpbGwgbm90IGJlIGNoYW5nZWQuCiAKICAgIC4uIGRlcHJlY2F0ZWQ6OiAzLjQKQEAgLTEyOTIsMTMgKzEzMDYsMTIgQEAKICAgIFRoaXMgY2xhc3MgKipvbmx5Kiogd29ya3Mgd2l0aCBsb2FkZXJzIHRoYXQgZGVmaW5lCiAgICA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmV4ZWNfbW9kdWxlYCBhcyBjb250cm9sIG92ZXIgd2hhdCBtb2R1bGUgdHlwZQogICAgaXMgdXNlZCBmb3IgdGhlIG1vZHVsZSBpcyByZXF1aXJlZC4gRm9yIHRob3NlIHNhbWUgcmVhc29ucywgdGhlIGxvYWRlcidzCi0gICA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgIG1ldGhvZCB3aWxsIGJlIGlnbm9yZWQgKGkuZS4sIHRoZQotICAgbG9hZGVyJ3MgbWV0aG9kIHNob3VsZCBvbmx5IHJldHVybiBgYE5vbmVgYDsgdGhpcyBleGNsdWRlcwotICAgOmNsYXNzOmBCdWlsdGluSW1wb3J0ZXJgIGFuZCA6Y2xhc3M6YEV4dGVuc2lvbkZpbGVMb2FkZXJgKS4gRmluYWxseSwKLSAgIG1vZHVsZXMgd2hpY2ggc3Vic3RpdHV0ZSB0aGUgb2JqZWN0IHBsYWNlZCBpbnRvIDphdHRyOmBzeXMubW9kdWxlc2Agd2lsbAotICAgbm90IHdvcmsgYXMgdGhlcmUgaXMgbm8gd2F5IHRvIHByb3Blcmx5IHJlcGxhY2UgdGhlIG1vZHVsZSByZWZlcmVuY2VzCi0gICB0aHJvdWdob3V0IHRoZSBpbnRlcnByZXRlciBzYWZlbHk7IDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZCBpZiBzdWNoIGEKLSAgIHN1YnN0aXR1dGlvbiBpcyBkZXRlY3RlZC4KKyAgIDptZXRoOmB+aW1wb3J0bGliLmFiYy5Mb2FkZXIuY3JlYXRlX21vZHVsZWAgbWV0aG9kIG11c3QgcmV0dXJuIGBgTm9uZWBgIG9yIGEKKyAgIHR5cGUgZm9yIHdoaWNoIGl0cyBgYF9fY2xhc3NfX2BgIGF0dHJpYnV0ZSBjYW4gYmUgbXV0YXRlZCBhbG9uZyB3aXRoIG5vdAorICAgdXNpbmcgOnRlcm06YHNsb3RzIDxfX3Nsb3RzX18+YC4gRmluYWxseSwgbW9kdWxlcyB3aGljaCBzdWJzdGl0dXRlIHRoZSBvYmplY3QKKyAgIHBsYWNlZCBpbnRvIDphdHRyOmBzeXMubW9kdWxlc2Agd2lsbCBub3Qgd29yayBhcyB0aGVyZSBpcyBubyB3YXkgdG8gcHJvcGVybHkKKyAgIHJlcGxhY2UgdGhlIG1vZHVsZSByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhlIGludGVycHJldGVyIHNhZmVseTsKKyAgIDpleGM6YFZhbHVlRXJyb3JgIGlzIHJhaXNlZCBpZiBzdWNoIGEgc3Vic3RpdHV0aW9uIGlzIGRldGVjdGVkLgogCiAgICAuLiBub3RlOjoKICAgICAgIEZvciBwcm9qZWN0cyB3aGVyZSBzdGFydHVwIHRpbWUgaXMgY3JpdGljYWwsIHRoaXMgY2xhc3MgYWxsb3dzIGZvcgpAQCAtMTMwOSw2ICsxMzIyLDExIEBACiAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQmVnYW4gY2FsbGluZyA6bWV0aDpgfmltcG9ydGxpYi5hYmMuTG9hZGVyLmNyZWF0ZV9tb2R1bGVgLCByZW1vdmluZyB0aGUKKyAgICAgIGNvbXBhdGliaWxpdHkgd2FybmluZyBmb3IgOmNsYXNzOmBpbXBvcnRsaWIubWFjaGluZXJ5LkJ1aWx0aW5JbXBvcnRlcmAgYW5kCisgICAgICA6Y2xhc3M6YGltcG9ydGxpYi5tYWNoaW5lcnkuRXh0ZW5zaW9uRmlsZUxvYWRlcmAuCisKICAgIC4uIGNsYXNzbWV0aG9kOjogZmFjdG9yeShsb2FkZXIpCiAKICAgICAgIEEgc3RhdGljIG1ldGhvZCB3aGljaCByZXR1cm5zIGEgY2FsbGFibGUgdGhhdCBjcmVhdGVzIGEgbGF6eSBsb2FkZXIuIFRoaXMKQEAgLTEzMjAsMyArMTMzOCwxMjAgQEAKICAgICAgICAgbG9hZGVyID0gaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VGaWxlTG9hZGVyCiAgICAgICAgIGxhenlfbG9hZGVyID0gaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlci5mYWN0b3J5KGxvYWRlcikKICAgICAgICAgZmluZGVyID0gaW1wb3J0bGliLm1hY2hpbmVyeS5GaWxlRmluZGVyKHBhdGgsIChsYXp5X2xvYWRlciwgc3VmZml4ZXMpKQorCisuLiBfaW1wb3J0bGliLWV4YW1wbGVzOgorCitFeGFtcGxlcworLS0tLS0tLS0KKworVG8gcHJvZ3JhbW1hdGljYWxseSBpbXBvcnQgYSBtb2R1bGUsIHVzZSA6ZnVuYzpgaW1wb3J0bGliLmltcG9ydF9tb2R1bGVgLgorOjoKKworICBpbXBvcnQgaW1wb3J0bGliCisKKyAgaXRlcnRvb2xzID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJ2l0ZXJ0b29scycpCisKK0lmIHlvdSBuZWVkIHRvIGZpbmQgb3V0IGlmIGEgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZCB3aXRob3V0IGFjdHVhbGx5IGRvaW5nIHRoZQoraW1wb3J0LCB0aGVuIHlvdSBzaG91bGQgdXNlIDpmdW5jOmBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWNgLgorOjoKKworICBpbXBvcnQgaW1wb3J0bGliLnV0aWwKKyAgaW1wb3J0IHN5cworCisgICMgRm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KKyAgbmFtZSA9ICdpdGVydG9vbHMnCisKKyAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhuYW1lKQorICBpZiBzcGVjIGlzIE5vbmU6CisgICAgICBwcmludCgiY2FuJ3QgZmluZCB0aGUgaXRlcnRvb2xzIG1vZHVsZSIpCisgIGVsc2U6CisgICAgICAjIElmIHlvdSBjaG9zZSB0byBwZXJmb3JtIHRoZSBhY3R1YWwgaW1wb3J0IC4uLgorICAgICAgbW9kdWxlID0gaW1wb3J0bGliLnV0aWwubW9kdWxlX2Zyb21fc3BlYyhzcGVjKQorICAgICAgc3BlYy5sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQorICAgICAgIyBBZGRpbmcgdGhlIG1vZHVsZSB0byBzeXMubW9kdWxlcyBpcyBvcHRpb25hbC4KKyAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gbW9kdWxlCisKK1RvIGltcG9ydCBhIFB5dGhvbiBzb3VyY2UgZmlsZSBkaXJlY3RseSwgdXNlIHRoZSBmb2xsb3dpbmcgcmVjaXBlCisoUHl0aG9uIDMuNCBhbmQgbmV3ZXIgb25seSk6OgorCisgIGltcG9ydCBpbXBvcnRsaWIudXRpbAorICBpbXBvcnQgc3lzCisKKyAgIyBGb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorICBpbXBvcnQgdG9rZW5pemUKKyAgZmlsZV9wYXRoID0gdG9rZW5pemUuX19maWxlX18KKyAgbW9kdWxlX25hbWUgPSB0b2tlbml6ZS5fX25hbWVfXworCisgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5zcGVjX2Zyb21fZmlsZV9sb2NhdGlvbihtb2R1bGVfbmFtZSwgZmlsZV9wYXRoKQorICBtb2R1bGUgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKHNwZWMpCisgIHNwZWMubG9hZGVyLmV4ZWNfbW9kdWxlKG1vZHVsZSkKKyAgIyBPcHRpb25hbDsgb25seSBuZWNlc3NhcnkgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBpbXBvcnQgdGhlIG1vZHVsZQorICAjIGJ5IG5hbWUgbGF0ZXIuCisgIHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXSA9IG1vZHVsZQorCitGb3IgZGVlcCBjdXN0b21pemF0aW9ucyBvZiBpbXBvcnQsIHlvdSB0eXBpY2FsbHkgd2FudCB0byBpbXBsZW1lbnQgYW4KKzp0ZXJtOmBpbXBvcnRlcmAuIFRoaXMgbWVhbnMgbWFuYWdpbmcgYm90aCB0aGUgOnRlcm06YGZpbmRlcmAgYW5kIDp0ZXJtOmBsb2FkZXJgCitzaWRlIG9mIHRoaW5ncy4gRm9yIGZpbmRlcnMgdGhlcmUgYXJlIHR3byBmbGF2b3VycyB0byBjaG9vc2UgZnJvbSBkZXBlbmRpbmcgb24KK3lvdXIgbmVlZHM6IGEgOnRlcm06YG1ldGEgcGF0aCBmaW5kZXJgIG9yIGEgOnRlcm06YHBhdGggZW50cnkgZmluZGVyYC4gVGhlCitmb3JtZXIgaXMgd2hhdCB5b3Ugd291bGQgcHV0IG9uIDphdHRyOmBzeXMubWV0YV9wYXRoYCB3aGlsZSB0aGUgbGF0dGVyIGlzIHdoYXQKK3lvdSBjcmVhdGUgdXNpbmcgYSA6dGVybTpgcGF0aCBlbnRyeSBob29rYCBvbiA6YXR0cjpgc3lzLnBhdGhfaG9va3NgIHdoaWNoIHdvcmtzCit3aXRoIDphdHRyOmBzeXMucGF0aGAgZW50cmllcyB0byBwb3RlbnRpYWxseSBjcmVhdGUgYSBmaW5kZXIuIFRoaXMgZXhhbXBsZSB3aWxsCitzaG93IHlvdSBob3cgdG8gcmVnaXN0ZXIgeW91ciBvd24gaW1wb3J0ZXJzIHNvIHRoYXQgaW1wb3J0IHdpbGwgdXNlIHRoZW0gKGZvcgorY3JlYXRpbmcgYW4gaW1wb3J0ZXIgZm9yIHlvdXJzZWxmLCByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYXBwcm9wcmlhdGUKK2NsYXNzZXMgZGVmaW5lZCB3aXRoaW4gdGhpcyBwYWNrYWdlKTo6CisKKyAgaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKKyAgaW1wb3J0IHN5cworCisgICMgRm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3NlcyBvbmx5LgorICBTcGFtTWV0YVBhdGhGaW5kZXIgPSBpbXBvcnRsaWIubWFjaGluZXJ5LlBhdGhGaW5kZXIKKyAgU3BhbVBhdGhFbnRyeUZpbmRlciA9IGltcG9ydGxpYi5tYWNoaW5lcnkuRmlsZUZpbmRlcgorICBsb2FkZXJfZGV0YWlscyA9IChpbXBvcnRsaWIubWFjaGluZXJ5LlNvdXJjZUZpbGVMb2FkZXIsCisgICAgICAgICAgICAgICAgICAgIGltcG9ydGxpYi5tYWNoaW5lcnkuU09VUkNFX1NVRkZJWEVTKQorCisgICMgU2V0dGluZyB1cCBhIG1ldGEgcGF0aCBmaW5kZXIuCisgICMgTWFrZSBzdXJlIHRvIHB1dCB0aGUgZmluZGVyIGluIHRoZSBwcm9wZXIgbG9jYXRpb24gaW4gdGhlIGxpc3QgaW4gdGVybXMgb2YKKyAgIyBwcmlvcml0eS4KKyAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoU3BhbU1ldGFQYXRoRmluZGVyKQorCisgICMgU2V0dGluZyB1cCBhIHBhdGggZW50cnkgZmluZGVyLgorICAjIE1ha2Ugc3VyZSB0byBwdXQgdGhlIHBhdGggaG9vayBpbiB0aGUgcHJvcGVyIGxvY2F0aW9uIGluIHRoZSBsaXN0IGluIHRlcm1zCisgICMgb2YgcHJpb3JpdHkuCisgIHN5cy5wYXRoX2hvb2tzLmFwcGVuZChTcGFtUGF0aEVudHJ5RmluZGVyLnBhdGhfaG9vayhsb2FkZXJfZGV0YWlscykpCisKK0ltcG9ydCBpdHNlbGYgaXMgaW1wbGVtZW50ZWQgaW4gUHl0aG9uIGNvZGUsIG1ha2luZyBpdCBwb3NzaWJsZSB0bworZXhwb3NlIG1vc3Qgb2YgdGhlIGltcG9ydCBtYWNoaW5lcnkgdGhyb3VnaCBpbXBvcnRsaWIuIFRoZSBmb2xsb3dpbmcKK2hlbHBzIGlsbHVzdHJhdGUgdGhlIHZhcmlvdXMgQVBJcyB0aGF0IGltcG9ydGxpYiBleHBvc2VzIGJ5IHByb3ZpZGluZyBhbgorYXBwcm94aW1hdGUgaW1wbGVtZW50YXRpb24gb2YKKzpmdW5jOmBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZWAgKFB5dGhvbiAzLjQgYW5kIG5ld2VyIGZvciB0aGUgaW1wb3J0bGliIHVzYWdlLAorUHl0aG9uIDMuNiBhbmQgbmV3ZXIgZm9yIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlKS4KKzo6CisKKyAgaW1wb3J0IGltcG9ydGxpYi51dGlsCisgIGltcG9ydCBzeXMKKworICBkZWYgaW1wb3J0X21vZHVsZShuYW1lLCBwYWNrYWdlPU5vbmUpOgorICAgICAgIiIiQW4gYXBwcm94aW1hdGUgaW1wbGVtZW50YXRpb24gb2YgaW1wb3J0LiIiIgorICAgICAgYWJzb2x1dGVfbmFtZSA9IGltcG9ydGxpYi51dGlsLnJlc29sdmVfbmFtZShuYW1lLCBwYWNrYWdlKQorICAgICAgdHJ5OgorICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1thYnNvbHV0ZV9uYW1lXQorICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgIHBhc3MKKworICAgICAgcGF0aCA9IE5vbmUKKyAgICAgIGlmICcuJyBpbiBhYnNvbHV0ZV9uYW1lOgorICAgICAgICAgIHBhcmVudF9uYW1lLCBfLCBjaGlsZF9uYW1lID0gYWJzb2x1dGVfbmFtZS5ycGFydGl0aW9uKCcuJykKKyAgICAgICAgICBwYXJlbnRfbW9kdWxlID0gaW1wb3J0X21vZHVsZShwYXJlbnRfbmFtZSkKKyAgICAgICAgICBwYXRoID0gcGFyZW50X21vZHVsZS5zcGVjLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zCisgICAgICBmb3IgZmluZGVyIGluIHN5cy5tZXRhX3BhdGg6CisgICAgICAgICAgc3BlYyA9IGZpbmRlci5maW5kX3NwZWMoYWJzb2x1dGVfbmFtZSwgcGF0aCkKKyAgICAgICAgICBpZiBzcGVjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICBicmVhaworICAgICAgZWxzZToKKyAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcihmJ05vIG1vZHVsZSBuYW1lZCB7YWJzb2x1dGVfbmFtZSFyfScpCisgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKHNwZWMpCisgICAgICBzcGVjLmxvYWRlci5leGVjX21vZHVsZShtb2R1bGUpCisgICAgICBzeXMubW9kdWxlc1thYnNvbHV0ZV9uYW1lXSA9IG1vZHVsZQorICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICBzZXRhdHRyKHBhcmVudF9tb2R1bGUsIGNoaWxkX25hbWUsIG1vZHVsZSkKKyAgICAgIHJldHVybiBtb2R1bGUKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2luc3BlY3QucnN0IGIvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QKaW5kZXggOGU3ZWQxOS4uNWNiN2MyMiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QKQEAgLTIzNSwyNCArMjM1LDYgQEAKICAgICAgIGxpc3RlZCBpbiB0aGUgbWV0YWNsYXNzJyBjdXN0b20gOm1ldGg6YF9fZGlyX19gLgogCiAKLS4uIGZ1bmN0aW9uOjogZ2V0bW9kdWxlaW5mbyhwYXRoKQotCi0gICBSZXR1cm5zIGEgOnRlcm06YG5hbWVkIHR1cGxlYCBgYE1vZHVsZUluZm8obmFtZSwgc3VmZml4LCBtb2RlLCBtb2R1bGVfdHlwZSlgYAotICAgb2YgdmFsdWVzIHRoYXQgZGVzY3JpYmUgaG93IFB5dGhvbiB3aWxsIGludGVycHJldCB0aGUgZmlsZSBpZGVudGlmaWVkIGJ5Ci0gICAqcGF0aCogaWYgaXQgaXMgYSBtb2R1bGUsIG9yIGBgTm9uZWBgIGlmIGl0IHdvdWxkIG5vdCBiZSBpZGVudGlmaWVkIGFzIGEKLSAgIG1vZHVsZS4gIEluIHRoYXQgdHVwbGUsICpuYW1lKiBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdpdGhvdXQgdGhlIG5hbWUgb2YKLSAgIGFueSBlbmNsb3NpbmcgcGFja2FnZSwgKnN1ZmZpeCogaXMgdGhlIHRyYWlsaW5nIHBhcnQgb2YgdGhlIGZpbGUgbmFtZSAod2hpY2gKLSAgIG1heSBub3QgYmUgYSBkb3QtZGVsaW1pdGVkIGV4dGVuc2lvbiksICptb2RlKiBpcyB0aGUgOmZ1bmM6YG9wZW5gIG1vZGUgdGhhdAotICAgd291bGQgYmUgdXNlZCAoYGAncidgYCBvciBgYCdyYidgYCksIGFuZCAqbW9kdWxlX3R5cGUqIGlzIGFuIGludGVnZXIgZ2l2aW5nCi0gICB0aGUgdHlwZSBvZiB0aGUgbW9kdWxlLiAgKm1vZHVsZV90eXBlKiB3aWxsIGhhdmUgYSB2YWx1ZSB3aGljaCBjYW4gYmUKLSAgIGNvbXBhcmVkIHRvIHRoZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGUgOm1vZDpgaW1wYCBtb2R1bGU7IHNlZSB0aGUKLSAgIGRvY3VtZW50YXRpb24gZm9yIHRoYXQgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIG1vZHVsZSB0eXBlcy4KLQotICAgLi4gZGVwcmVjYXRlZDo6IDMuMwotICAgICAgWW91IG1heSBjaGVjayB0aGUgZmlsZSBwYXRoJ3Mgc3VmZml4IGFnYWluc3QgdGhlIHN1cHBvcnRlZCBzdWZmaXhlcwotICAgICAgbGlzdGVkIGluIDptb2Q6YGltcG9ydGxpYi5tYWNoaW5lcnlgIHRvIGluZmVyIHRoZSBzYW1lIGluZm9ybWF0aW9uLgotCi0KIC4uIGZ1bmN0aW9uOjogZ2V0bW9kdWxlbmFtZShwYXRoKQogCiAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBuYW1lZCBieSB0aGUgZmlsZSAqcGF0aCosIHdpdGhvdXQgaW5jbHVkaW5nIHRoZQpAQCAtMjY2LDggKzI0OCw3IEBACiAgICBzdGlsbCByZXR1cm4gYGBOb25lYGAuCiAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCi0gICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdyBiYXNlZCBkaXJlY3RseSBvbiA6bW9kOmBpbXBvcnRsaWJgIHJhdGhlciB0aGFuIHRoZQotICAgICAgZGVwcmVjYXRlZCA6ZnVuYzpgZ2V0bW9kdWxlaW5mb2AuCisgICAgICBUaGUgZnVuY3Rpb24gaXMgYmFzZWQgZGlyZWN0bHkgb24gOm1vZDpgaW1wb3J0bGliYC4KIAogCiAuLiBmdW5jdGlvbjo6IGlzbW9kdWxlKG9iamVjdCkKQEAgLTY0Niw2ICs2MjcsMTYgQEAKICAgICAgIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgYXMgYSBzdHJpbmcuICBUaGUgbmFtZSBtdXN0IGJlIGEgdmFsaWQKICAgICAgIFB5dGhvbiBpZGVudGlmaWVyLgogCisgICAgICAuLiBpbXBsLWRldGFpbDo6CisKKyAgICAgICAgIENQeXRob24gZ2VuZXJhdGVzIGltcGxpY2l0IHBhcmFtZXRlciBuYW1lcyBvZiB0aGUgZm9ybSBgYC4wYGAgb24gdGhlCisgICAgICAgICBjb2RlIG9iamVjdHMgdXNlZCB0byBpbXBsZW1lbnQgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvcgorICAgICAgICAgZXhwcmVzc2lvbnMuCisKKyAgICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAgICAgICBUaGVzZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUgYXMgbmFtZXMgbGlrZQorICAgICAgICAgICAgYGBpbXBsaWNpdDBgYC4KKwogICAgLi4gYXR0cmlidXRlOjogUGFyYW1ldGVyLmRlZmF1bHQKIAogICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIuICBJZiB0aGUgcGFyYW1ldGVyIGhhcyBubyBkZWZhdWx0CkBAIC04NTQsOCArODQ1LDYgQEAKICAgIGZyb20ga3dvbmx5YXJncyB0byBkZWZhdWx0cy4gICphbm5vdGF0aW9ucyogaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYXJndW1lbnQKICAgIG5hbWVzIHRvIGFubm90YXRpb25zLgogCi0gICBUaGUgZmlyc3QgZm91ciBpdGVtcyBpbiB0aGUgdHVwbGUgY29ycmVzcG9uZCB0byA6ZnVuYzpgZ2V0YXJnc3BlY2AuCi0KICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy40CiAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG5vdyBiYXNlZCBvbiA6ZnVuYzpgc2lnbmF0dXJlYCwgYnV0IHN0aWxsIGlnbm9yZXMKICAgICAgIGBgX193cmFwcGVkX19gYCBhdHRyaWJ1dGVzIGFuZCBpbmNsdWRlcyB0aGUgYWxyZWFkeSBib3VuZCBmaXJzdApAQCAtODg0LDcgKzg3Myw3IEBACiAuLiBmdW5jdGlvbjo6IGZvcm1hdGFyZ3NwZWMoYXJnc1ssIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywga3dvbmx5YXJncywga3dvbmx5ZGVmYXVsdHMsIGFubm90YXRpb25zWywgZm9ybWF0YXJnLCBmb3JtYXR2YXJhcmdzLCBmb3JtYXR2YXJrdywgZm9ybWF0dmFsdWUsIGZvcm1hdHJldHVybnMsIGZvcm1hdGFubm90YXRpb25zXV0pCiAKICAgIEZvcm1hdCBhIHByZXR0eSBhcmd1bWVudCBzcGVjIGZyb20gdGhlIHZhbHVlcyByZXR1cm5lZCBieQotICAgOmZ1bmM6YGdldGFyZ3NwZWNgIG9yIDpmdW5jOmBnZXRmdWxsYXJnc3BlY2AuCisgICA6ZnVuYzpgZ2V0ZnVsbGFyZ3NwZWNgLgogCiAgICBUaGUgZmlyc3Qgc2V2ZW4gYXJndW1lbnRzIGFyZSAoYGBhcmdzYGAsIGBgdmFyYXJnc2BgLCBgYHZhcmt3YGAsCiAgICBgYGRlZmF1bHRzYGAsIGBga3dvbmx5YXJnc2BgLCBgYGt3b25seWRlZmF1bHRzYGAsIGBgYW5ub3RhdGlvbnNgYCkuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9pdGVydG9vbHMucnN0IGIvRG9jL2xpYnJhcnkvaXRlcnRvb2xzLnJzdAppbmRleCBkZmMxZGRjLi5iMGQwYThjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9pdGVydG9vbHMucnN0CisrKyBiL0RvYy9saWJyYXJ5L2l0ZXJ0b29scy5yc3QKQEAgLTU5MSw3ICs1OTEsMTMgQEAKIAogLi4gZnVuY3Rpb246OiB0ZWUoaXRlcmFibGUsIG49MikKIAotICAgUmV0dXJuICpuKiBpbmRlcGVuZGVudCBpdGVyYXRvcnMgZnJvbSBhIHNpbmdsZSBpdGVyYWJsZS4gIFJvdWdobHkgZXF1aXZhbGVudCB0bzo6CisgICBSZXR1cm4gKm4qIGluZGVwZW5kZW50IGl0ZXJhdG9ycyBmcm9tIGEgc2luZ2xlIGl0ZXJhYmxlLgorCisgICBUaGUgZm9sbG93aW5nIFB5dGhvbiBjb2RlIGhlbHBzIGV4cGxhaW4gd2hhdCAqdGVlKiBkb2VzIChhbHRob3VnaCB0aGUgYWN0dWFsCisgICBpbXBsZW1lbnRhdGlvbiBpcyBtb3JlIGNvbXBsZXggYW5kIHVzZXMgb25seSBhIHNpbmdsZSB1bmRlcmx5aW5nCisgICA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlKS4KKworICAgUm91Z2hseSBlcXVpdmFsZW50IHRvOjoKIAogICAgICAgICBkZWYgdGVlKGl0ZXJhYmxlLCBuPTIpOgogICAgICAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvanNvbi5yc3QgYi9Eb2MvbGlicmFyeS9qc29uLnJzdAppbmRleCBlZTU4MjY2Li43MzgyNGY4IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9qc29uLnJzdAorKysgYi9Eb2MvbGlicmFyeS9qc29uLnJzdApAQCAtMTI2LDcgKzEyNiw3IEBACiBCYXNpYyBVc2FnZQogLS0tLS0tLS0tLS0KIAotLi4gZnVuY3Rpb246OiBkdW1wKG9iaiwgZnAsIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgXAorLi4gZnVuY3Rpb246OiBkdW1wKG9iaiwgZnAsICosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgXAogICAgICAgICAgICAgICAgICAgIGNoZWNrX2NpcmN1bGFyPVRydWUsIGFsbG93X25hbj1UcnVlLCBjbHM9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGRlZmF1bHQ9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgIHNvcnRfa2V5cz1GYWxzZSwgKiprdykKQEAgLTE4Nyw4ICsxODcsMTEgQEAKICAgIDptZXRoOmBkZWZhdWx0YCBtZXRob2QgdG8gc2VyaWFsaXplIGFkZGl0aW9uYWwgdHlwZXMpLCBzcGVjaWZ5IGl0IHdpdGggdGhlCiAgICAqY2xzKiBrd2FyZzsgb3RoZXJ3aXNlIDpjbGFzczpgSlNPTkVuY29kZXJgIGlzIHVzZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBbGwgb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgbm93IDpyZWY6YGtleXdvcmQtb25seSA8a2V5d29yZC1vbmx5X3BhcmFtZXRlcj5gLgogCi0uLiBmdW5jdGlvbjo6IGR1bXBzKG9iaiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBcCisKKy4uIGZ1bmN0aW9uOjogZHVtcHMob2JqLCAqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIFwKICAgICAgICAgICAgICAgICAgICAgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBcCiAgICAgICAgICAgICAgICAgICAgIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGRlZmF1bHQ9Tm9uZSwgXAogICAgICAgICAgICAgICAgICAgICBzb3J0X2tleXM9RmFsc2UsICoqa3cpCkBAIC0yMTIsNyArMjE1LDcgQEAKICAgICAgIHRoZSBvcmlnaW5hbCBvbmUuIFRoYXQgaXMsIGBgbG9hZHMoZHVtcHMoeCkpICE9IHhgYCBpZiB4IGhhcyBub24tc3RyaW5nCiAgICAgICBrZXlzLgogCi0uLiBmdW5jdGlvbjo6IGxvYWQoZnAsIGNscz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLCBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSwgKiprdykKKy4uIGZ1bmN0aW9uOjogbG9hZChmcCwgKiwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KQogCiAgICBEZXNlcmlhbGl6ZSAqZnAqIChhIGBgLnJlYWQoKWBgLXN1cHBvcnRpbmcgOnRlcm06YGZpbGUtbGlrZSBvYmplY3RgCiAgICBjb250YWluaW5nIGEgSlNPTiBkb2N1bWVudCkgdG8gYSBQeXRob24gb2JqZWN0IHVzaW5nIHRoaXMgOnJlZjpgY29udmVyc2lvbgpAQCAtMjYwLDcgKzI2MywxMCBAQAogICAgSWYgdGhlIGRhdGEgYmVpbmcgZGVzZXJpYWxpemVkIGlzIG5vdCBhIHZhbGlkIEpTT04gZG9jdW1lbnQsIGEKICAgIDpleGM6YEpTT05EZWNvZGVFcnJvcmAgd2lsbCBiZSByYWlzZWQuCiAKLS4uIGZ1bmN0aW9uOjogbG9hZHMocywgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KQorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBub3cgOnJlZjpga2V5d29yZC1vbmx5IDxrZXl3b3JkLW9ubHlfcGFyYW1ldGVyPmAuCisKKy4uIGZ1bmN0aW9uOjogbG9hZHMocywgKiwgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KQogCiAgICBEZXNlcmlhbGl6ZSAqcyogKGEgOmNsYXNzOmBzdHJgIGluc3RhbmNlIGNvbnRhaW5pbmcgYSBKU09OIGRvY3VtZW50KSB0byBhCiAgICBQeXRob24gb2JqZWN0IHVzaW5nIHRoaXMgOnJlZjpgY29udmVyc2lvbiB0YWJsZSA8anNvbi10by1weS10YWJsZT5gLgpAQCAtMjc0LDcgKzI4MCw3IEBACiBFbmNvZGVycyBhbmQgRGVjb2RlcnMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0uLiBjbGFzczo6IEpTT05EZWNvZGVyKG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBzdHJpY3Q9VHJ1ZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSkKKy4uIGNsYXNzOjogSlNPTkRlY29kZXIoKiwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIHN0cmljdD1UcnVlLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lKQogCiAgICBTaW1wbGUgSlNPTiBkZWNvZGVyLgogCkBAIC0zNDQsNiArMzUwLDkgQEAKICAgIElmIHRoZSBkYXRhIGJlaW5nIGRlc2VyaWFsaXplZCBpcyBub3QgYSB2YWxpZCBKU09OIGRvY3VtZW50LCBhCiAgICA6ZXhjOmBKU09ORGVjb2RlRXJyb3JgIHdpbGwgYmUgcmFpc2VkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWxsIHBhcmFtZXRlcnMgYXJlIG5vdyA6cmVmOmBrZXl3b3JkLW9ubHkgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KKwogICAgLi4gbWV0aG9kOjogZGVjb2RlKHMpCiAKICAgICAgIFJldHVybiB0aGUgUHl0aG9uIHJlcHJlc2VudGF0aW9uIG9mICpzKiAoYSA6Y2xhc3M6YHN0cmAgaW5zdGFuY2UKQEAgLTM2Miw3ICszNzEsNyBAQAogICAgICAgZXh0cmFuZW91cyBkYXRhIGF0IHRoZSBlbmQuCiAKIAotLi4gY2xhc3M6OiBKU09ORW5jb2Rlcihza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIGNoZWNrX2NpcmN1bGFyPVRydWUsIGFsbG93X25hbj1UcnVlLCBzb3J0X2tleXM9RmFsc2UsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsIGRlZmF1bHQ9Tm9uZSkKKy4uIGNsYXNzOjogSlNPTkVuY29kZXIoKiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgc29ydF9rZXlzPUZhbHNlLCBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLCBkZWZhdWx0PU5vbmUpCiAKICAgIEV4dGVuc2libGUgSlNPTiBlbmNvZGVyIGZvciBQeXRob24gZGF0YSBzdHJ1Y3R1cmVzLgogCkBAIC00NDIsNiArNDUxLDkgQEAKICAgIHRoZSBvYmplY3Qgb3IgcmFpc2UgYSA6ZXhjOmBUeXBlRXJyb3JgLiAgSWYgbm90IHNwZWNpZmllZCwgOmV4YzpgVHlwZUVycm9yYAogICAgaXMgcmFpc2VkLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgQWxsIHBhcmFtZXRlcnMgYXJlIG5vdyA6cmVmOmBrZXl3b3JkLW9ubHkgPGtleXdvcmQtb25seV9wYXJhbWV0ZXI+YC4KKwogCiAgICAuLiBtZXRob2Q6OiBkZWZhdWx0KG8pCiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L2xvZ2dpbmcuaGFuZGxlcnMucnN0IGIvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QKaW5kZXggODU1YWRhYi4uNGVhZWEwOSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbG9nZ2luZy5oYW5kbGVycy5yc3QKQEAgLTE2MSwxMSArMTYxLDE5IEBACiAgICBmaXJzdCBjYWxsIHRvIDptZXRoOmBlbWl0YC4gIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGdyb3dzIGluZGVmaW5pdGVseS4KIAogCisgICAuLiBtZXRob2Q6OiByZW9wZW5JZk5lZWRlZCgpCisKKyAgICAgIENoZWNrcyB0byBzZWUgaWYgdGhlIGZpbGUgaGFzIGNoYW5nZWQuICBJZiBpdCBoYXMsIHRoZSBleGlzdGluZyBzdHJlYW0gaXMKKyAgICAgIGZsdXNoZWQgYW5kIGNsb3NlZCBhbmQgdGhlIGZpbGUgb3BlbmVkIGFnYWluLCB0eXBpY2FsbHkgYXMgYSBwcmVjdXJzb3IgdG8KKyAgICAgIG91dHB1dHRpbmcgdGhlIHJlY29yZCB0byB0aGUgZmlsZS4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKwogICAgLi4gbWV0aG9kOjogZW1pdChyZWNvcmQpCiAKLSAgICAgIE91dHB1dHMgdGhlIHJlY29yZCB0byB0aGUgZmlsZSwgYnV0IGZpcnN0IGNoZWNrcyB0byBzZWUgaWYgdGhlIGZpbGUgaGFzCi0gICAgICBjaGFuZ2VkLiAgSWYgaXQgaGFzLCB0aGUgZXhpc3Rpbmcgc3RyZWFtIGlzIGZsdXNoZWQgYW5kIGNsb3NlZCBhbmQgdGhlCi0gICAgICBmaWxlIG9wZW5lZCBhZ2FpbiwgYmVmb3JlIG91dHB1dHRpbmcgdGhlIHJlY29yZCB0byB0aGUgZmlsZS4KKyAgICAgIE91dHB1dHMgdGhlIHJlY29yZCB0byB0aGUgZmlsZSwgYnV0IGZpcnN0IGNhbGxzIDptZXRoOmByZW9wZW5JZk5lZWRlZGAgdG8KKyAgICAgIHJlb3BlbiB0aGUgZmlsZSBpZiBpdCBoYXMgY2hhbmdlZC4KIAogLi4gX2Jhc2Utcm90YXRpbmctaGFuZGxlcjoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvbW1hcC5yc3QgYi9Eb2MvbGlicmFyeS9tbWFwLnJzdAppbmRleCA4ZjUzODMzLi5jNTQ0YzgwIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tbWFwLnJzdAorKysgYi9Eb2MvbGlicmFyeS9tbWFwLnJzdApAQCAtMjY0LDEzICsyNjQsMTggQEAKICAgIC4uIG1ldGhvZDo6IHdyaXRlKGJ5dGVzKQogCiAgICAgICBXcml0ZSB0aGUgYnl0ZXMgaW4gKmJ5dGVzKiBpbnRvIG1lbW9yeSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUKLSAgICAgIGZpbGUgcG9pbnRlcjsgdGhlIGZpbGUgcG9zaXRpb24gaXMgdXBkYXRlZCB0byBwb2ludCBhZnRlciB0aGUgYnl0ZXMgdGhhdAotICAgICAgd2VyZSB3cml0dGVuLiBJZiB0aGUgbW1hcCB3YXMgY3JlYXRlZCB3aXRoIDpjb25zdDpgQUNDRVNTX1JFQURgLCB0aGVuCisgICAgICBmaWxlIHBvaW50ZXIgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gKG5ldmVyIGxlc3MgdGhhbgorICAgICAgYGBsZW4oYnl0ZXMpYGAsIHNpbmNlIGlmIHRoZSB3cml0ZSBmYWlscywgYSA6ZXhjOmBWYWx1ZUVycm9yYCB3aWxsIGJlCisgICAgICByYWlzZWQpLiAgVGhlIGZpbGUgcG9zaXRpb24gaXMgdXBkYXRlZCB0byBwb2ludCBhZnRlciB0aGUgYnl0ZXMgdGhhdAorICAgICAgd2VyZSB3cml0dGVuLiAgSWYgdGhlIG1tYXAgd2FzIGNyZWF0ZWQgd2l0aCA6Y29uc3Q6YEFDQ0VTU19SRUFEYCwgdGhlbgogICAgICAgd3JpdGluZyB0byBpdCB3aWxsIHJhaXNlIGEgOmV4YzpgVHlwZUVycm9yYCBleGNlcHRpb24uCiAKICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy41CiAgICAgICAgICBXcml0YWJsZSA6dGVybTpgYnl0ZXMtbGlrZSBvYmplY3RgIGlzIG5vdyBhY2NlcHRlZC4KIAorICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBpcyBub3cgcmV0dXJuZWQuCisKIAogICAgLi4gbWV0aG9kOjogd3JpdGVfYnl0ZShieXRlKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0IGIvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdAppbmRleCBkMjAwOThmLi5mODg2ZWNiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0CisrKyBiL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QKQEAgLTY0Nyw4ICs2NDcsOSBAQAogRm9yIHBhc3NpbmcgbWVzc2FnZXMgb25lIGNhbiB1c2UgOmZ1bmM6YFBpcGVgIChmb3IgYSBjb25uZWN0aW9uIGJldHdlZW4gdHdvCiBwcm9jZXNzZXMpIG9yIGEgcXVldWUgKHdoaWNoIGFsbG93cyBtdWx0aXBsZSBwcm9kdWNlcnMgYW5kIGNvbnN1bWVycykuCiAKLVRoZSA6Y2xhc3M6YFF1ZXVlYCwgOmNsYXNzOmBTaW1wbGVRdWV1ZWAgYW5kIDpjbGFzczpgSm9pbmFibGVRdWV1ZWAgdHlwZXMgYXJlIG11bHRpLXByb2R1Y2VyLAotbXVsdGktY29uc3VtZXIgRklGTyBxdWV1ZXMgbW9kZWxsZWQgb24gdGhlIDpjbGFzczpgcXVldWUuUXVldWVgIGNsYXNzIGluIHRoZQorVGhlIDpjbGFzczpgUXVldWVgLCA6Y2xhc3M6YFNpbXBsZVF1ZXVlYCBhbmQgOmNsYXNzOmBKb2luYWJsZVF1ZXVlYCB0eXBlcworYXJlIG11bHRpLXByb2R1Y2VyLCBtdWx0aS1jb25zdW1lciA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgCitxdWV1ZXMgbW9kZWxsZWQgb24gdGhlIDpjbGFzczpgcXVldWUuUXVldWVgIGNsYXNzIGluIHRoZQogc3RhbmRhcmQgbGlicmFyeS4gIFRoZXkgZGlmZmVyIGluIHRoYXQgOmNsYXNzOmBRdWV1ZWAgbGFja3MgdGhlCiA6bWV0aDpgfnF1ZXVlLlF1ZXVlLnRhc2tfZG9uZWAgYW5kIDptZXRoOmB+cXVldWUuUXVldWUuam9pbmAgbWV0aG9kcyBpbnRyb2R1Y2VkCiBpbnRvIFB5dGhvbiAyLjUncyA6Y2xhc3M6YHF1ZXVlLlF1ZXVlYCBjbGFzcy4KQEAgLTg4Niw4ICs4ODcsMTMgQEAKIAogLi4gZnVuY3Rpb246OiBjcHVfY291bnQoKQogCi0gICBSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW0uICBNYXkgcmFpc2UKLSAgIDpleGM6YE5vdEltcGxlbWVudGVkRXJyb3JgLgorICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtLgorCisgICBUaGlzIG51bWJlciBpcyBub3QgZXF1aXZhbGVudCB0byB0aGUgbnVtYmVyIG9mIENQVXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBjYW4KKyAgIHVzZS4gIFRoZSBudW1iZXIgb2YgdXNhYmxlIENQVXMgY2FuIGJlIG9idGFpbmVkIHdpdGgKKyAgIGBgbGVuKG9zLnNjaGVkX2dldGFmZmluaXR5KDApKWBgCisKKyAgIE1heSByYWlzZSA6ZXhjOmBOb3RJbXBsZW1lbnRlZEVycm9yYC4KIAogICAgLi4gc2VlYWxzbzo6CiAgICAgICA6ZnVuYzpgb3MuY3B1X2NvdW50YApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvb3MucnN0IGIvRG9jL2xpYnJhcnkvb3MucnN0CmluZGV4IGU3M2Q4ZWUuLmVhZTcyNDkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L29zLnJzdAorKysgYi9Eb2MvbGlicmFyeS9vcy5yc3QKQEAgLTE3MSwyMyArMTcxLDYwIEBACiAKIC4uIGZ1bmN0aW9uOjogZnNlbmNvZGUoZmlsZW5hbWUpCiAKLSAgIEVuY29kZSAqZmlsZW5hbWUqIHRvIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggYGAnc3Vycm9nYXRlZXNjYXBlJ2BgCi0gICBlcnJvciBoYW5kbGVyLCBvciBgYCdzdHJpY3QnYGAgb24gV2luZG93czsgcmV0dXJuIDpjbGFzczpgYnl0ZXNgIHVuY2hhbmdlZC4KKyAgIEVuY29kZSA6dGVybTpgcGF0aC1saWtlIDxwYXRoLWxpa2Ugb2JqZWN0PmAgKmZpbGVuYW1lKiB0byB0aGUgZmlsZXN5c3RlbQorICAgZW5jb2Rpbmcgd2l0aCBgYCdzdXJyb2dhdGVlc2NhcGUnYGAgZXJyb3IgaGFuZGxlciwgb3IgYGAnc3RyaWN0J2BgIG9uCisgICBXaW5kb3dzOyByZXR1cm4gOmNsYXNzOmBieXRlc2AgdW5jaGFuZ2VkLgogCiAgICA6ZnVuYzpgZnNkZWNvZGVgIGlzIHRoZSByZXZlcnNlIGZ1bmN0aW9uLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjIKIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFN1cHBvcnQgYWRkZWQgdG8gYWNjZXB0IG9iamVjdHMgaW1wbGVtZW50aW5nIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYAorICAgICAgaW50ZXJmYWNlLgorCiAKIC4uIGZ1bmN0aW9uOjogZnNkZWNvZGUoZmlsZW5hbWUpCiAKLSAgIERlY29kZSAqZmlsZW5hbWUqIGZyb20gdGhlIGZpbGVzeXN0ZW0gZW5jb2Rpbmcgd2l0aCBgYCdzdXJyb2dhdGVlc2NhcGUnYGAKLSAgIGVycm9yIGhhbmRsZXIsIG9yIGBgJ3N0cmljdCdgYCBvbiBXaW5kb3dzOyByZXR1cm4gOmNsYXNzOmBzdHJgIHVuY2hhbmdlZC4KKyAgIERlY29kZSB0aGUgOnRlcm06YHBhdGgtbGlrZSA8cGF0aC1saWtlIG9iamVjdD5gICpmaWxlbmFtZSogZnJvbSB0aGUKKyAgIGZpbGVzeXN0ZW0gZW5jb2Rpbmcgd2l0aCBgYCdzdXJyb2dhdGVlc2NhcGUnYGAgZXJyb3IgaGFuZGxlciwgb3IgYGAnc3RyaWN0J2BgCisgICBvbiBXaW5kb3dzOyByZXR1cm4gOmNsYXNzOmBzdHJgIHVuY2hhbmdlZC4KIAogICAgOmZ1bmM6YGZzZW5jb2RlYCBpcyB0aGUgcmV2ZXJzZSBmdW5jdGlvbi4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy4yCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBTdXBwb3J0IGFkZGVkIHRvIGFjY2VwdCBvYmplY3RzIGltcGxlbWVudGluZyB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAKKyAgICAgIGludGVyZmFjZS4KKworCisuLiBmdW5jdGlvbjo6IGZzcGF0aChwYXRoKQorCisgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXRoLgorCisgICBJZiA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2AgaXMgcGFzc2VkIGluLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCisgICBPdGhlcndpc2UgOm1ldGg6YH5vcy5QYXRoTGlrZS5fX2ZzcGF0aF9fYCBpcyBjYWxsZWQgYW5kIGl0cyB2YWx1ZSBpcworICAgcmV0dXJuZWQgYXMgbG9uZyBhcyBpdCBpcyBhIDpjbGFzczpgc3RyYCBvciA6Y2xhc3M6YGJ5dGVzYCBvYmplY3QuCisgICBJbiBhbGwgb3RoZXIgY2FzZXMsIDpleGM6YFR5cGVFcnJvcmAgaXMgcmFpc2VkLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCisuLiBjbGFzczo6IFBhdGhMaWtlCisKKyAgIEFuIDp0ZXJtOmBhYnN0cmFjdCBiYXNlIGNsYXNzYCBmb3Igb2JqZWN0cyByZXByZXNlbnRpbmcgYSBmaWxlIHN5c3RlbSBwYXRoLAorICAgZS5nLiA6Y2xhc3M6YHBhdGhsaWIuUHVyZVBhdGhgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworICAgLi4gYWJzdHJhY3RtZXRob2Q6OiBfX2ZzcGF0aF9fKCkKKworICAgICAgUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisKKyAgICAgIFRoZSBtZXRob2Qgc2hvdWxkIG9ubHkgcmV0dXJuIGEgOmNsYXNzOmBzdHJgIG9yIDpjbGFzczpgYnl0ZXNgIG9iamVjdCwKKyAgICAgIHdpdGggdGhlIHByZWZlcmVuY2UgYmVpbmcgZm9yIDpjbGFzczpgc3RyYC4KKwogCiAuLiBmdW5jdGlvbjo6IGdldGVudihrZXksIGRlZmF1bHQ9Tm9uZSkKIApAQCAtMTg4MywzNSArMTkyMCw1MSBAQAogCiAuLiBmdW5jdGlvbjo6IHNjYW5kaXIocGF0aD0nLicpCiAKLSAgIFJldHVybiBhbiBpdGVyYXRvciBvZiA6Y2xhc3M6YERpckVudHJ5YCBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVudHJpZXMKLSAgIGluIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgKnBhdGgqLiBUaGUgZW50cmllcyBhcmUgeWllbGRlZCBpbiBhcmJpdHJhcnkKLSAgIG9yZGVyLCBhbmQgdGhlIHNwZWNpYWwgZW50cmllcyBgYCcuJ2BgIGFuZCBgYCcuLidgYCBhcmUgbm90IGluY2x1ZGVkLgorICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIDpjbGFzczpgb3MuRGlyRW50cnlgIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgIGVudHJpZXMgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieSAqcGF0aCouIFRoZSBlbnRyaWVzIGFyZSB5aWVsZGVkIGluCisgICBhcmJpdHJhcnkgb3JkZXIsIGFuZCB0aGUgc3BlY2lhbCBlbnRyaWVzIGBgJy4nYGAgYW5kIGBgJy4uJ2BgIGFyZSBub3QKKyAgIGluY2x1ZGVkLgogCiAgICBVc2luZyA6ZnVuYzpgc2NhbmRpcmAgaW5zdGVhZCBvZiA6ZnVuYzpgbGlzdGRpcmAgY2FuIHNpZ25pZmljYW50bHkKICAgIGluY3JlYXNlIHRoZSBwZXJmb3JtYW5jZSBvZiBjb2RlIHRoYXQgYWxzbyBuZWVkcyBmaWxlIHR5cGUgb3IgZmlsZQotICAgYXR0cmlidXRlIGluZm9ybWF0aW9uLCBiZWNhdXNlIDpjbGFzczpgRGlyRW50cnlgIG9iamVjdHMgZXhwb3NlIHRoaXMKKyAgIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiwgYmVjYXVzZSA6Y2xhc3M6YG9zLkRpckVudHJ5YCBvYmplY3RzIGV4cG9zZSB0aGlzCiAgICBpbmZvcm1hdGlvbiBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBwcm92aWRlcyBpdCB3aGVuIHNjYW5uaW5nIGEgZGlyZWN0b3J5LgotICAgQWxsIDpjbGFzczpgRGlyRW50cnlgIG1ldGhvZHMgbWF5IHBlcmZvcm0gYSBzeXN0ZW0gY2FsbCwgYnV0Ci0gICA6ZnVuYzpgfkRpckVudHJ5LmlzX2RpcmAgYW5kIDpmdW5jOmB+RGlyRW50cnkuaXNfZmlsZWAgdXN1YWxseSBvbmx5Ci0gICByZXF1aXJlIGEgc3lzdGVtIGNhbGwgZm9yIHN5bWJvbGljIGxpbmtzOyA6ZnVuYzpgRGlyRW50cnkuc3RhdGAKKyAgIEFsbCA6Y2xhc3M6YG9zLkRpckVudHJ5YCBtZXRob2RzIG1heSBwZXJmb3JtIGEgc3lzdGVtIGNhbGwsIGJ1dAorICAgOmZ1bmM6YH5vcy5EaXJFbnRyeS5pc19kaXJgIGFuZCA6ZnVuYzpgfm9zLkRpckVudHJ5LmlzX2ZpbGVgIHVzdWFsbHkgb25seQorICAgcmVxdWlyZSBhIHN5c3RlbSBjYWxsIGZvciBzeW1ib2xpYyBsaW5rczsgOmZ1bmM6YG9zLkRpckVudHJ5LnN0YXRgCiAgICBhbHdheXMgcmVxdWlyZXMgYSBzeXN0ZW0gY2FsbCBvbiBVbml4IGJ1dCBvbmx5IHJlcXVpcmVzIG9uZSBmb3IKICAgIHN5bWJvbGljIGxpbmtzIG9uIFdpbmRvd3MuCiAKICAgIE9uIFVuaXgsICpwYXRoKiBjYW4gYmUgb2YgdHlwZSA6Y2xhc3M6YHN0cmAgb3IgOmNsYXNzOmBieXRlc2AgKHVzZQogICAgOmZ1bmM6YH5vcy5mc2VuY29kZWAgYW5kIDpmdW5jOmB+b3MuZnNkZWNvZGVgIHRvIGVuY29kZSBhbmQgZGVjb2RlCiAgICA6Y2xhc3M6YGJ5dGVzYCBwYXRocykuIE9uIFdpbmRvd3MsICpwYXRoKiBtdXN0IGJlIG9mIHR5cGUgOmNsYXNzOmBzdHJgLgotICAgT24gYm90aCBzeXRlbXMsIHRoZSB0eXBlIG9mIHRoZSA6YXR0cjpgfkRpckVudHJ5Lm5hbWVgIGFuZAotICAgOmF0dHI6YH5EaXJFbnRyeS5wYXRoYCBhdHRyaWJ1dGVzIG9mIGVhY2ggOmNsYXNzOmBEaXJFbnRyeWAgd2lsbCBiZSBvZgorICAgT24gYm90aCBzeXRlbXMsIHRoZSB0eXBlIG9mIHRoZSA6YXR0cjpgfm9zLkRpckVudHJ5Lm5hbWVgIGFuZAorICAgOmF0dHI6YH5vcy5EaXJFbnRyeS5wYXRoYCBhdHRyaWJ1dGVzIG9mIGVhY2ggOmNsYXNzOmBvcy5EaXJFbnRyeWAgd2lsbCBiZSBvZgogICAgdGhlIHNhbWUgdHlwZSBhcyAqcGF0aCouCiAKKyAgIFRoZSA6ZnVuYzpgc2NhbmRpcmAgaXRlcmF0b3Igc3VwcG9ydHMgdGhlIDp0ZXJtOmBjb250ZXh0IG1hbmFnZXJgIHByb3RvY29sCisgICBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kOgorCisgICAuLiBtZXRob2Q6OiBzY2FuZGlyLmNsb3NlKCkKKworICAgICAgQ2xvc2UgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIGFjcXVpcmVkIHJlc291cmNlcy4KKworICAgICAgVGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQgb3IgZ2FyYmFnZQorICAgICAgY29sbGVjdGVkLCBvciB3aGVuIGFuIGVycm9yIGhhcHBlbnMgZHVyaW5nIGl0ZXJhdGluZy4gIEhvd2V2ZXIgaXQKKyAgICAgIGlzIGFkdmlzYWJsZSB0byBjYWxsIGl0IGV4cGxpY2l0bHkgb3IgdXNlIHRoZSA6a2V5d29yZDpgd2l0aGAKKyAgICAgIHN0YXRlbWVudC4KKworICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbXBsZSB1c2Ugb2YgOmZ1bmM6YHNjYW5kaXJgIHRvIGRpc3BsYXkgYWxsCiAgICB0aGUgZmlsZXMgKGV4Y2x1ZGluZyBkaXJlY3RvcmllcykgaW4gdGhlIGdpdmVuICpwYXRoKiB0aGF0IGRvbid0IHN0YXJ0IHdpdGgKICAgIGBgJy4nYGAuIFRoZSBgYGVudHJ5LmlzX2ZpbGUoKWBgIGNhbGwgd2lsbCBnZW5lcmFsbHkgbm90IG1ha2UgYW4gYWRkaXRpb25hbAogICAgc3lzdGVtIGNhbGw6OgogCi0gICAgICBmb3IgZW50cnkgaW4gb3Muc2NhbmRpcihwYXRoKToKLSAgICAgICAgIGlmIG5vdCBlbnRyeS5uYW1lLnN0YXJ0c3dpdGgoJy4nKSBhbmQgZW50cnkuaXNfZmlsZSgpOgotICAgICAgICAgICAgIHByaW50KGVudHJ5Lm5hbWUpCisgICAgICB3aXRoIG9zLnNjYW5kaXIocGF0aCkgYXMgaXQ6CisgICAgICAgICAgZm9yIGVudHJ5IGluIGl0OgorICAgICAgICAgICAgICBpZiBub3QgZW50cnkubmFtZS5zdGFydHN3aXRoKCcuJykgYW5kIGVudHJ5LmlzX2ZpbGUoKToKKyAgICAgICAgICAgICAgICAgIHByaW50KGVudHJ5Lm5hbWUpCiAKICAgIC4uIG5vdGU6OgogCkBAIC0xOTI3LDYgKzE5ODAsMTIgQEAKIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIDp0ZXJtOmBjb250ZXh0IG1hbmFnZXJgIHByb3RvY29sIGFuZCB0aGUKKyAgICAgIDpmdW5jOmB+c2NhbmRpci5jbG9zZSgpYCBtZXRob2QuICBJZiBhIDpmdW5jOmBzY2FuZGlyYCBpdGVyYXRvciBpcyBuZWl0aGVyCisgICAgICBleGhhdXN0ZWQgbm9yIGV4cGxpY2l0bHkgY2xvc2VkIGEgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCB3aWxsIGJlIGVtaXR0ZWQKKyAgICAgIGluIGl0cyBkZXN0cnVjdG9yLgorCiAKIC4uIGNsYXNzOjogRGlyRW50cnkKIApAQCAtMTkzNSwxOSArMTk5NCwyMiBAQAogCiAgICA6ZnVuYzpgc2NhbmRpcmAgd2lsbCBwcm92aWRlIGFzIG11Y2ggb2YgdGhpcyBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSB3aXRob3V0CiAgICBtYWtpbmcgYWRkaXRpb25hbCBzeXN0ZW0gY2FsbHMuIFdoZW4gYSBgYHN0YXQoKWBgIG9yIGBgbHN0YXQoKWBgIHN5c3RlbSBjYWxsCi0gICBpcyBtYWRlLCB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdCB3aWxsIGNhY2hlIHRoZSByZXN1bHQuCisgICBpcyBtYWRlLCB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdCB3aWxsIGNhY2hlIHRoZSByZXN1bHQuCiAKLSAgIGBgRGlyRW50cnlgYCBpbnN0YW5jZXMgYXJlIG5vdCBpbnRlbmRlZCB0byBiZSBzdG9yZWQgaW4gbG9uZy1saXZlZCBkYXRhCisgICBgYG9zLkRpckVudHJ5YGAgaW5zdGFuY2VzIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgc3RvcmVkIGluIGxvbmctbGl2ZWQgZGF0YQogICAgc3RydWN0dXJlczsgaWYgeW91IGtub3cgdGhlIGZpbGUgbWV0YWRhdGEgaGFzIGNoYW5nZWQgb3IgaWYgYSBsb25nIHRpbWUgaGFzCiAgICBlbGFwc2VkIHNpbmNlIGNhbGxpbmcgOmZ1bmM6YHNjYW5kaXJgLCBjYWxsIGBgb3Muc3RhdChlbnRyeS5wYXRoKWBgIHRvIGZldGNoCiAgICB1cC10by1kYXRlIGluZm9ybWF0aW9uLgogCi0gICBCZWNhdXNlIHRoZSBgYERpckVudHJ5YGAgbWV0aG9kcyBjYW4gbWFrZSBvcGVyYXRpbmcgc3lzdGVtIGNhbGxzLCB0aGV5IG1heQorICAgQmVjYXVzZSB0aGUgYGBvcy5EaXJFbnRyeWBgIG1ldGhvZHMgY2FuIG1ha2Ugb3BlcmF0aW5nIHN5c3RlbSBjYWxscywgdGhleSBtYXkKICAgIGFsc28gcmFpc2UgOmV4YzpgT1NFcnJvcmAuIElmIHlvdSBuZWVkIHZlcnkgZmluZS1ncmFpbmVkCiAgICBjb250cm9sIG92ZXIgZXJyb3JzLCB5b3UgY2FuIGNhdGNoIDpleGM6YE9TRXJyb3JgIHdoZW4gY2FsbGluZyBvbmUgb2YgdGhlCi0gICBgYERpckVudHJ5YGAgbWV0aG9kcyBhbmQgaGFuZGxlIGFzIGFwcHJvcHJpYXRlLgorICAgYGBvcy5EaXJFbnRyeWBgIG1ldGhvZHMgYW5kIGhhbmRsZSBhcyBhcHByb3ByaWF0ZS4KIAotICAgQXR0cmlidXRlcyBhbmQgbWV0aG9kcyBvbiBhIGBgRGlyRW50cnlgYCBpbnN0YW5jZSBhcmUgYXMgZm9sbG93czoKKyAgIFRvIGJlIGRpcmVjdGx5IHVzYWJsZSBhcyBhIDp0ZXJtOmBwYXRoLWxpa2Ugb2JqZWN0YCwgYGBvcy5EaXJFbnRyeWBgCisgICBpbXBsZW1lbnRzIHRoZSA6Y2xhc3M6YG9zLlBhdGhMaWtlYCBpbnRlcmZhY2UuCisKKyAgIEF0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgb24gYSBgYG9zLkRpckVudHJ5YGAgaW5zdGFuY2UgYXJlIGFzIGZvbGxvd3M6CiAKICAgIC4uIGF0dHJpYnV0ZTo6IG5hbWUKIApAQCAtMTk3Myw4ICsyMDM1LDkgQEAKIAogICAgICAgUmV0dXJuIHRoZSBpbm9kZSBudW1iZXIgb2YgdGhlIGVudHJ5LgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdC4gVXNlIGBgb3Muc3RhdChlbnRyeS5wYXRoLAotICAgICAgZm9sbG93X3N5bWxpbmtzPUZhbHNlKS5zdF9pbm9gYCB0byBmZXRjaCB1cC10by1kYXRlIGluZm9ybWF0aW9uLgorICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3QuIFVzZQorICAgICAgYGBvcy5zdGF0KGVudHJ5LnBhdGgsIGZvbGxvd19zeW1saW5rcz1GYWxzZSkuc3RfaW5vYGAgdG8gZmV0Y2ggdXAtdG8tZGF0ZQorICAgICAgaW5mb3JtYXRpb24uCiAKICAgICAgIE9uIHRoZSBmaXJzdCwgdW5jYWNoZWQgY2FsbCwgYSBzeXN0ZW0gY2FsbCBpcyByZXF1aXJlZCBvbiBXaW5kb3dzIGJ1dAogICAgICAgbm90IG9uIFVuaXguCkBAIC0xOTg5LDcgKzIwNTIsNyBAQAogICAgICAgaXMgYSBkaXJlY3RvcnkgKHdpdGhvdXQgZm9sbG93aW5nIHN5bWxpbmtzKTsgcmV0dXJuIGBgRmFsc2VgYCBpZiB0aGUKICAgICAgIGVudHJ5IGlzIGFueSBvdGhlciBraW5kIG9mIGZpbGUgb3IgaWYgaXQgZG9lc24ndCBleGlzdCBhbnltb3JlLgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdCwgd2l0aCBhIHNlcGFyYXRlIGNhY2hlCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdCwgd2l0aCBhIHNlcGFyYXRlIGNhY2hlCiAgICAgICBmb3IgKmZvbGxvd19zeW1saW5rcyogYGBUcnVlYGAgYW5kIGBgRmFsc2VgYC4gQ2FsbCA6ZnVuYzpgb3Muc3RhdGAgYWxvbmcKICAgICAgIHdpdGggOmZ1bmM6YHN0YXQuU19JU0RJUmAgdG8gZmV0Y2ggdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KIApAQCAtMjAxMyw4ICsyMDc2LDggQEAKICAgICAgIGlzIGEgZmlsZSAod2l0aG91dCBmb2xsb3dpbmcgc3ltbGlua3MpOyByZXR1cm4gYGBGYWxzZWBgIGlmIHRoZSBlbnRyeSBpcwogICAgICAgYSBkaXJlY3Rvcnkgb3Igb3RoZXIgbm9uLWZpbGUgZW50cnksIG9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW55bW9yZS4KIAotICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgRGlyRW50cnlgYCBvYmplY3QuIENhY2hpbmcsIHN5c3RlbSBjYWxscwotICAgICAgbWFkZSwgYW5kIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBhcyBwZXIgOmZ1bmM6YH5EaXJFbnRyeS5pc19kaXJgLgorICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3QuIENhY2hpbmcsIHN5c3RlbSBjYWxscworICAgICAgbWFkZSwgYW5kIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBhcyBwZXIgOmZ1bmM6YH5vcy5EaXJFbnRyeS5pc19kaXJgLgogCiAgICAuLiBtZXRob2Q6OiBpc19zeW1saW5rKCkKIApAQCAtMjAyMiw3ICsyMDg1LDcgQEAKICAgICAgIHJldHVybiBgYEZhbHNlYGAgaWYgdGhlIGVudHJ5IHBvaW50cyB0byBhIGRpcmVjdG9yeSBvciBhbnkga2luZCBvZiBmaWxlLAogICAgICAgb3IgaWYgaXQgZG9lc24ndCBleGlzdCBhbnltb3JlLgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdC4gQ2FsbAorICAgICAgVGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIGBgb3MuRGlyRW50cnlgYCBvYmplY3QuIENhbGwKICAgICAgIDpmdW5jOmBvcy5wYXRoLmlzbGlua2AgdG8gZmV0Y2ggdXAtdG8tZGF0ZSBpbmZvcm1hdGlvbi4KIAogICAgICAgT24gdGhlIGZpcnN0LCB1bmNhY2hlZCBjYWxsLCBubyBzeXN0ZW0gY2FsbCBpcyByZXF1aXJlZCBpbiBtb3N0IGNhc2VzLgpAQCAtMjA0NywxNyArMjExMCwyMSBAQAogICAgICAgOmNsYXNzOmBzdGF0X3Jlc3VsdGAgYXJlIGFsd2F5cyBzZXQgdG8gemVyby4gQ2FsbCA6ZnVuYzpgb3Muc3RhdGAgdG8KICAgICAgIGdldCB0aGVzZSBhdHRyaWJ1dGVzLgogCi0gICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBEaXJFbnRyeWBgIG9iamVjdCwgd2l0aCBhIHNlcGFyYXRlIGNhY2hlCisgICAgICBUaGUgcmVzdWx0IGlzIGNhY2hlZCBvbiB0aGUgYGBvcy5EaXJFbnRyeWBgIG9iamVjdCwgd2l0aCBhIHNlcGFyYXRlIGNhY2hlCiAgICAgICBmb3IgKmZvbGxvd19zeW1saW5rcyogYGBUcnVlYGAgYW5kIGBgRmFsc2VgYC4gQ2FsbCA6ZnVuYzpgb3Muc3RhdGAgdG8KICAgICAgIGZldGNoIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24uCiAKICAgIE5vdGUgdGhhdCB0aGVyZSBpcyBhIG5pY2UgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBzZXZlcmFsIGF0dHJpYnV0ZXMKLSAgIGFuZCBtZXRob2RzIG9mIGBgRGlyRW50cnlgYCBhbmQgb2YgOmNsYXNzOmBwYXRobGliLlBhdGhgLiAgSW4KLSAgIHBhcnRpY3VsYXIsIHRoZSBgYG5hbWVgYCBhdHRyaWJ1dGUgaGFzIHRoZSBzYW1lIG1lYW5pbmcsIGFzIGRvIHRoZQotICAgYGBpc19kaXIoKWBgLCBgYGlzX2ZpbGUoKWBgLCBgYGlzX3N5bWxpbmsoKWBgIGFuZCBgYHN0YXQoKWBgIG1ldGhvZHMuCisgICBhbmQgbWV0aG9kcyBvZiBgYG9zLkRpckVudHJ5YGAgYW5kIG9mIDpjbGFzczpgcGF0aGxpYi5QYXRoYC4gIEluCisgICBwYXJ0aWN1bGFyLCB0aGUgYGBuYW1lYGAgYXR0cmlidXRlIGhhcyB0aGUgc2FtZQorICAgbWVhbmluZywgYXMgZG8gdGhlIGBgaXNfZGlyKClgYCwgYGBpc19maWxlKClgYCwgYGBpc19zeW1saW5rKClgYAorICAgYW5kIGBgc3RhdCgpYGAgbWV0aG9kcy4KIAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy41CiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgaW50ZXJmYWNlLgorCiAKIC4uIGZ1bmN0aW9uOjogc3RhdChwYXRoLCBcKiwgZGlyX2ZkPU5vbmUsIGZvbGxvd19zeW1saW5rcz1UcnVlKQogCkBAIC0zNjE4LDYgKzM2ODUsMTEgQEAKIAogICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtLiBSZXR1cm5zIE5vbmUgaWYgdW5kZXRlcm1pbmVkLgogCisgICBUaGlzIG51bWJlciBpcyBub3QgZXF1aXZhbGVudCB0byB0aGUgbnVtYmVyIG9mIENQVXMgdGhlIGN1cnJlbnQgcHJvY2VzcyBjYW4KKyAgIHVzZS4gIFRoZSBudW1iZXIgb2YgdXNhYmxlIENQVXMgY2FuIGJlIG9idGFpbmVkIHdpdGgKKyAgIGBgbGVuKG9zLnNjaGVkX2dldGFmZmluaXR5KDApKWBgCisKKwogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvcGF0aGxpYi5yc3QgYi9Eb2MvbGlicmFyeS9wYXRobGliLnJzdAppbmRleCA1N2E2YTg0Li43MzdiYzg1IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9wYXRobGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS9wYXRobGliLnJzdApAQCAtMzUsMTIgKzM1LDYgQEAKICAgIGFjY2Vzc2luZyB0aGUgT1MuIEluIHRoaXMgY2FzZSwgaW5zdGFudGlhdGluZyBvbmUgb2YgdGhlIHB1cmUgY2xhc3NlcyBtYXkgYmUKICAgIHVzZWZ1bCBzaW5jZSB0aG9zZSBzaW1wbHkgZG9uJ3QgaGF2ZSBhbnkgT1MtYWNjZXNzaW5nIG9wZXJhdGlvbnMuCiAKLS4uIG5vdGU6OgotICAgVGhpcyBtb2R1bGUgaGFzIGJlZW4gaW5jbHVkZWQgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkgb24gYQotICAgOnRlcm06YHByb3Zpc2lvbmFsIGJhc2lzIDxwcm92aXNpb25hbCBwYWNrYWdlPmAuIEJhY2t3YXJkcyBpbmNvbXBhdGlibGUKLSAgIGNoYW5nZXMgKHVwIHRvIGFuZCBpbmNsdWRpbmcgcmVtb3ZhbCBvZiB0aGUgcGFja2FnZSkgbWF5IG9jY3VyIGlmIGRlZW1lZAotICAgbmVjZXNzYXJ5IGJ5IHRoZSBjb3JlIGRldmVsb3BlcnMuCi0KIC4uIHNlZWFsc286OgogICAgOnBlcDpgNDI4YDogVGhlIHBhdGhsaWIgbW9kdWxlIC0tIG9iamVjdC1vcmllbnRlZCBmaWxlc3lzdGVtIHBhdGhzLgogCkBAIC0xMTEsNyArMTA1LDggQEAKICAgICAgIFB1cmVQb3NpeFBhdGgoJ3NldHVwLnB5JykKIAogICAgRWFjaCBlbGVtZW50IG9mICpwYXRoc2VnbWVudHMqIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEKLSAgIHBhdGggc2VnbWVudCwgb3IgYW5vdGhlciBwYXRoIG9iamVjdDo6CisgICBwYXRoIHNlZ21lbnQsIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIDpjbGFzczpgb3MuUGF0aExpa2VgIGludGVyZmFjZQorICAgd2hpY2ggcmV0dXJucyBhIHN0cmluZywgb3IgYW5vdGhlciBwYXRoIG9iamVjdDo6CiAKICAgICAgID4+PiBQdXJlUGF0aCgnZm9vJywgJ3NvbWUvcGF0aCcsICdiYXInKQogICAgICAgUHVyZVBvc2l4UGF0aCgnZm9vL3NvbWUvcGF0aC9iYXInKQpAQCAtMTUyLDYgKzE0NywxMiBAQAogICAgdG8gYGBQdXJlUG9zaXhQYXRoKCdiYXInKWBgLCB3aGljaCBpcyB3cm9uZyBpZiBgYGZvb2BgIGlzIGEgc3ltYm9saWMgbGluawogICAgdG8gYW5vdGhlciBkaXJlY3RvcnkpCiAKKyAgIFB1cmUgcGF0aCBvYmplY3RzIGltcGxlbWVudCB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgaW50ZXJmYWNlLCBhbGxvd2luZyB0aGVtCisgICB0byBiZSB1c2VkIGFueXdoZXJlIHRoZSBpbnRlcmZhY2UgaXMgYWNjZXB0ZWQuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCBzdXBwb3J0IGZvciB0aGUgOmNsYXNzOmBvcy5QYXRoTGlrZWAgaW50ZXJmYWNlLgorCiAuLiBjbGFzczo6IFB1cmVQb3NpeFBhdGgoKnBhdGhzZWdtZW50cykKIAogICAgQSBzdWJjbGFzcyBvZiA6Y2xhc3M6YFB1cmVQYXRoYCwgdGhpcyBwYXRoIGZsYXZvdXIgcmVwcmVzZW50cyBub24tV2luZG93cwpAQCAtMTk5LDcgKzIwMCw3IEBACiAgICA+Pj4gUHVyZVdpbmRvd3NQYXRoKCdmb28nKSA8IFB1cmVQb3NpeFBhdGgoJ2ZvbycpCiAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+Ci0gICBUeXBlRXJyb3I6IHVub3JkZXJhYmxlIHR5cGVzOiBQdXJlV2luZG93c1BhdGgoKSA8IFB1cmVQb3NpeFBhdGgoKQorICAgVHlwZUVycm9yOiAnPCcgbm90IHN1cHBvcnRlZCBiZXR3ZWVuIGluc3RhbmNlcyBvZiAnUHVyZVdpbmRvd3NQYXRoJyBhbmQgJ1B1cmVQb3NpeFBhdGgnCiAKIAogT3BlcmF0b3JzCkBAIC0yMTYsNiArMjE3LDE0IEBACiAgICA+Pj4gJy91c3InIC8gcQogICAgUHVyZVBvc2l4UGF0aCgnL3Vzci9iaW4nKQogCitBIHBhdGggb2JqZWN0IGNhbiBiZSB1c2VkIGFueXdoZXJlIGFuIG9iamVjdCBpbXBsZW1lbnRpbmcgOmNsYXNzOmBvcy5QYXRoTGlrZWAKK2lzIGFjY2VwdGVkOjoKKworICAgPj4+IGltcG9ydCBvcworICAgPj4+IHAgPSBQdXJlUGF0aCgnL2V0YycpCisgICA+Pj4gb3MuZnNwYXRoKHApCisgICAnL2V0YycKKwogVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHBhdGggaXMgdGhlIHJhdyBmaWxlc3lzdGVtIHBhdGggaXRzZWxmCiAoaW4gbmF0aXZlIGZvcm0sIGUuZy4gd2l0aCBiYWNrc2xhc2hlcyB1bmRlciBXaW5kb3dzKSwgd2hpY2ggeW91IGNhbgogcGFzcyB0byBhbnkgZnVuY3Rpb24gdGFraW5nIGEgZmlsZSBwYXRoIGFzIGEgc3RyaW5nOjoKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QgYi9Eb2MvbGlicmFyeS9waWNrbGUucnN0CmluZGV4IDBkNjQxOTEuLjZlODQzMGYgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3BpY2tsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcGlja2xlLnJzdApAQCAtNDkyLDcgKzQ5Miw3IEBACiAKIC4uIG1ldGhvZDo6IG9iamVjdC5fX2dldG5ld2FyZ3NfZXhfXygpCiAKLSAgIEluIHByb3RvY29scyA0IGFuZCBuZXdlciwgY2xhc3NlcyB0aGF0IGltcGxlbWVudHMgdGhlCisgICBJbiBwcm90b2NvbHMgMiBhbmQgbmV3ZXIsIGNsYXNzZXMgdGhhdCBpbXBsZW1lbnRzIHRoZQogICAgOm1ldGg6YF9fZ2V0bmV3YXJnc19leF9fYCBtZXRob2QgY2FuIGRpY3RhdGUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gdGhlCiAgICA6bWV0aDpgX19uZXdfX2AgbWV0aG9kIHVwb24gdW5waWNrbGluZy4gIFRoZSBtZXRob2QgbXVzdCByZXR1cm4gYSBwYWlyCiAgICBgYChhcmdzLCBrd2FyZ3MpYGAgd2hlcmUgKmFyZ3MqIGlzIGEgdHVwbGUgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMKQEAgLTUwNCwxNSArNTA0LDIyIEBACiAgICBjbGFzcyByZXF1aXJlcyBrZXl3b3JkLW9ubHkgYXJndW1lbnRzLiAgT3RoZXJ3aXNlLCBpdCBpcyByZWNvbW1lbmRlZCBmb3IKICAgIGNvbXBhdGliaWxpdHkgdG8gaW1wbGVtZW50IDptZXRoOmBfX2dldG5ld2FyZ3NfX2AuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6bWV0aDpgX19nZXRuZXdhcmdzX2V4X19gIGlzIG5vdyB1c2VkIGluIHByb3RvY29scyAyIGFuZCAzLgorCiAKIC4uIG1ldGhvZDo6IG9iamVjdC5fX2dldG5ld2FyZ3NfXygpCiAKLSAgIFRoaXMgbWV0aG9kIHNlcnZlIGEgc2ltaWxhciBwdXJwb3NlIGFzIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgYnV0Ci0gICBmb3IgcHJvdG9jb2xzIDIgYW5kIG5ld2VyLiAgSXQgbXVzdCByZXR1cm4gYSB0dXBsZSBvZiBhcmd1bWVudHMgYGBhcmdzYGAKLSAgIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSA6bWV0aDpgX19uZXdfX2AgbWV0aG9kIHVwb24gdW5waWNrbGluZy4KKyAgIFRoaXMgbWV0aG9kIHNlcnZlIGEgc2ltaWxhciBwdXJwb3NlIGFzIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AsIGJ1dAorICAgc3VwcG9ydHMgb25seSBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gIEl0IG11c3QgcmV0dXJuIGEgdHVwbGUgb2YgYXJndW1lbnRzCisgICBgYGFyZ3NgYCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgOm1ldGg6YF9fbmV3X19gIG1ldGhvZCB1cG9uIHVucGlja2xpbmcuCiAKLSAgIEluIHByb3RvY29scyA0IGFuZCBuZXdlciwgOm1ldGg6YF9fZ2V0bmV3YXJnc19fYCB3aWxsIG5vdCBiZSBjYWxsZWQgaWYKLSAgIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgaXMgZGVmaW5lZC4KKyAgIDptZXRoOmBfX2dldG5ld2FyZ3NfX2Agd2lsbCBub3QgYmUgY2FsbGVkIGlmIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgaXMKKyAgIGRlZmluZWQuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBCZWZvcmUgUHl0aG9uIDMuNiwgOm1ldGg6YF9fZ2V0bmV3YXJnc19fYCB3YXMgY2FsbGVkIGluc3RlYWQgb2YKKyAgICAgIDptZXRoOmBfX2dldG5ld2FyZ3NfZXhfX2AgaW4gcHJvdG9jb2xzIDIgYW5kIDMuCiAKIAogLi4gbWV0aG9kOjogb2JqZWN0Ll9fZ2V0c3RhdGVfXygpCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9wa2d1dGlsLnJzdCBiL0RvYy9saWJyYXJ5L3BrZ3V0aWwucnN0CmluZGV4IDI2YzVhYzAuLjFmMTFhMmQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3BrZ3V0aWwucnN0CisrKyBiL0RvYy9saWJyYXJ5L3BrZ3V0aWwucnN0CkBAIC00NiwxMCArNDYsMTAgQEAKIAogLi4gY2xhc3M6OiBJbXBJbXBvcnRlcihkaXJuYW1lPU5vbmUpCiAKLSAgIDpwZXA6YDMwMmAgSW1wb3J0ZXIgdGhhdCB3cmFwcyBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IGFsZ29yaXRobS4KKyAgIDpwZXA6YDMwMmAgRmluZGVyIHRoYXQgd3JhcHMgUHl0aG9uJ3MgImNsYXNzaWMiIGltcG9ydCBhbGdvcml0aG0uCiAKLSAgIElmICpkaXJuYW1lKiBpcyBhIHN0cmluZywgYSA6cGVwOmAzMDJgIGltcG9ydGVyIGlzIGNyZWF0ZWQgdGhhdCBzZWFyY2hlcyB0aGF0Ci0gICBkaXJlY3RvcnkuICBJZiAqZGlybmFtZSogaXMgYGBOb25lYGAsIGEgOnBlcDpgMzAyYCBpbXBvcnRlciBpcyBjcmVhdGVkIHRoYXQKKyAgIElmICpkaXJuYW1lKiBpcyBhIHN0cmluZywgYSA6cGVwOmAzMDJgIGZpbmRlciBpcyBjcmVhdGVkIHRoYXQgc2VhcmNoZXMgdGhhdAorICAgZGlyZWN0b3J5LiAgSWYgKmRpcm5hbWUqIGlzIGBgTm9uZWBgLCBhIDpwZXA6YDMwMmAgZmluZGVyIGlzIGNyZWF0ZWQgdGhhdAogICAgc2VhcmNoZXMgdGhlIGN1cnJlbnQgOmRhdGE6YHN5cy5wYXRoYCwgcGx1cyBhbnkgbW9kdWxlcyB0aGF0IGFyZSBmcm96ZW4gb3IKICAgIGJ1aWx0LWluLgogCkBAIC04OCw5ICs4OCw5IEBACiAKIC4uIGZ1bmN0aW9uOjogZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKIAotICAgUmV0cmlldmUgYSA6cGVwOmAzMDJgIGltcG9ydGVyIGZvciB0aGUgZ2l2ZW4gKnBhdGhfaXRlbSouCisgICBSZXRyaWV2ZSBhIDpwZXA6YDMwMmAgZmluZGVyIGZvciB0aGUgZ2l2ZW4gKnBhdGhfaXRlbSouCiAKLSAgIFRoZSByZXR1cm5lZCBpbXBvcnRlciBpcyBjYWNoZWQgaW4gOmRhdGE6YHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlYCBpZiBpdCB3YXMKKyAgIFRoZSByZXR1cm5lZCBmaW5kZXIgaXMgY2FjaGVkIGluIDpkYXRhOmBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWAgaWYgaXQgd2FzCiAgICBuZXdseSBjcmVhdGVkIGJ5IGEgcGF0aCBob29rLgogCiAgICBUaGUgY2FjaGUgKG9yIHBhcnQgb2YgaXQpIGNhbiBiZSBjbGVhcmVkIG1hbnVhbGx5IGlmIGEgcmVzY2FuIG9mCkBAIC0xMjEsMTYgKzEyMSwxNiBAQAogCiAuLiBmdW5jdGlvbjo6IGl0ZXJfaW1wb3J0ZXJzKGZ1bGxuYW1lPScnKQogCi0gICBZaWVsZCA6cGVwOmAzMDJgIGltcG9ydGVycyBmb3IgdGhlIGdpdmVuIG1vZHVsZSBuYW1lLgorICAgWWllbGQgOnBlcDpgMzAyYCBmaW5kZXJzIGZvciB0aGUgZ2l2ZW4gbW9kdWxlIG5hbWUuCiAKLSAgIElmIGZ1bGxuYW1lIGNvbnRhaW5zIGEgJy4nLCB0aGUgaW1wb3J0ZXJzIHdpbGwgYmUgZm9yIHRoZSBwYWNrYWdlCisgICBJZiBmdWxsbmFtZSBjb250YWlucyBhICcuJywgdGhlIGZpbmRlcnMgd2lsbCBiZSBmb3IgdGhlIHBhY2thZ2UKICAgIGNvbnRhaW5pbmcgZnVsbG5hbWUsIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgYWxsIHJlZ2lzdGVyZWQgdG9wIGxldmVsCi0gICBpbXBvcnRlcnMgKGkuZS4gdGhvc2Ugb24gYm90aCBzeXMubWV0YV9wYXRoIGFuZCBzeXMucGF0aF9ob29rcykuCisgICBmaW5kZXJzIChpLmUuIHRob3NlIG9uIGJvdGggc3lzLm1ldGFfcGF0aCBhbmQgc3lzLnBhdGhfaG9va3MpLgogCiAgICBJZiB0aGUgbmFtZWQgbW9kdWxlIGlzIGluIGEgcGFja2FnZSwgdGhhdCBwYWNrYWdlIGlzIGltcG9ydGVkIGFzIGEgc2lkZQogICAgZWZmZWN0IG9mIGludm9raW5nIHRoaXMgZnVuY3Rpb24uCiAKLSAgIElmIG5vIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCwgYWxsIHRvcCBsZXZlbCBpbXBvcnRlcnMgYXJlIHByb2R1Y2VkLgorICAgSWYgbm8gbW9kdWxlIG5hbWUgaXMgc3BlY2lmaWVkLCBhbGwgdG9wIGxldmVsIGZpbmRlcnMgYXJlIHByb2R1Y2VkLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMwogICAgICAgVXBkYXRlZCB0byBiZSBiYXNlZCBkaXJlY3RseSBvbiA6bW9kOmBpbXBvcnRsaWJgIHJhdGhlciB0aGFuIHJlbHlpbmcKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3F1ZXVlLnJzdCBiL0RvYy9saWJyYXJ5L3F1ZXVlLnJzdAppbmRleCAxY2IwOTM1Li5lM2VhYTNmIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9xdWV1ZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcXVldWUucnN0CkBAIC0xNiw4ICsxNiw5IEBACiBtb2R1bGUuCiAKIFRoZSBtb2R1bGUgaW1wbGVtZW50cyB0aHJlZSB0eXBlcyBvZiBxdWV1ZSwgd2hpY2ggZGlmZmVyIG9ubHkgaW4gdGhlIG9yZGVyIGluCi13aGljaCB0aGUgZW50cmllcyBhcmUgcmV0cmlldmVkLiAgSW4gYSBGSUZPIHF1ZXVlLCB0aGUgZmlyc3QgdGFza3MgYWRkZWQgYXJlCi10aGUgZmlyc3QgcmV0cmlldmVkLiBJbiBhIExJRk8gcXVldWUsIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGVudHJ5IGlzCit3aGljaCB0aGUgZW50cmllcyBhcmUgcmV0cmlldmVkLiAgSW4gYSA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgCitxdWV1ZSwgdGhlIGZpcnN0IHRhc2tzIGFkZGVkIGFyZSB0aGUgZmlyc3QgcmV0cmlldmVkLiBJbiBhCis6YWJicjpgTElGTyAobGFzdC1pbiwgZmlyc3Qtb3V0KWAgcXVldWUsIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIGVudHJ5IGlzCiB0aGUgZmlyc3QgcmV0cmlldmVkIChvcGVyYXRpbmcgbGlrZSBhIHN0YWNrKS4gIFdpdGggYSBwcmlvcml0eSBxdWV1ZSwKIHRoZSBlbnRyaWVzIGFyZSBrZXB0IHNvcnRlZCAodXNpbmcgdGhlIDptb2Q6YGhlYXBxYCBtb2R1bGUpIGFuZCB0aGUKIGxvd2VzdCB2YWx1ZWQgZW50cnkgaXMgcmV0cmlldmVkIGZpcnN0LgpAQCAtMjcsMTQgKzI4LDE2IEBACiAKIC4uIGNsYXNzOjogUXVldWUobWF4c2l6ZT0wKQogCi0gICBDb25zdHJ1Y3RvciBmb3IgYSBGSUZPIHF1ZXVlLiAgKm1heHNpemUqIGlzIGFuIGludGVnZXIgdGhhdCBzZXRzIHRoZSB1cHBlcmJvdW5kCisgICBDb25zdHJ1Y3RvciBmb3IgYSA6YWJicjpgRklGTyAoZmlyc3QtaW4sIGZpcnN0LW91dClgIHF1ZXVlLiAgKm1heHNpemUqIGlzCisgICBhbiBpbnRlZ2VyIHRoYXQgc2V0cyB0aGUgdXBwZXJib3VuZAogICAgbGltaXQgb24gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBwbGFjZWQgaW4gdGhlIHF1ZXVlLiAgSW5zZXJ0aW9uIHdpbGwKICAgIGJsb2NrIG9uY2UgdGhpcyBzaXplIGhhcyBiZWVuIHJlYWNoZWQsIHVudGlsIHF1ZXVlIGl0ZW1zIGFyZSBjb25zdW1lZC4gIElmCiAgICAqbWF4c2l6ZSogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIHRoZSBxdWV1ZSBzaXplIGlzIGluZmluaXRlLgogCiAuLiBjbGFzczo6IExpZm9RdWV1ZShtYXhzaXplPTApCiAKLSAgIENvbnN0cnVjdG9yIGZvciBhIExJRk8gcXVldWUuICAqbWF4c2l6ZSogaXMgYW4gaW50ZWdlciB0aGF0IHNldHMgdGhlIHVwcGVyYm91bmQKKyAgIENvbnN0cnVjdG9yIGZvciBhIDphYmJyOmBMSUZPIChsYXN0LWluLCBmaXJzdC1vdXQpYCBxdWV1ZS4gICptYXhzaXplKiBpcworICAgYW4gaW50ZWdlciB0aGF0IHNldHMgdGhlIHVwcGVyYm91bmQKICAgIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgcGxhY2VkIGluIHRoZSBxdWV1ZS4gIEluc2VydGlvbiB3aWxsCiAgICBibG9jayBvbmNlIHRoaXMgc2l6ZSBoYXMgYmVlbiByZWFjaGVkLCB1bnRpbCBxdWV1ZSBpdGVtcyBhcmUgY29uc3VtZWQuICBJZgogICAgKm1heHNpemUqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3JhbmRvbS5yc3QgYi9Eb2MvbGlicmFyeS9yYW5kb20ucnN0CmluZGV4IGRmNTAyYTAuLmU3YjgxYWQgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3JhbmRvbS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcmFuZG9tLnJzdApAQCAtNDYsNyArNDYsOCBAQAogLi4gd2FybmluZzo6CiAKICAgIFRoZSBwc2V1ZG8tcmFuZG9tIGdlbmVyYXRvcnMgb2YgdGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSB1c2VkIGZvcgotICAgc2VjdXJpdHkgcHVycG9zZXMuCisgICBzZWN1cml0eSBwdXJwb3Nlcy4gIEZvciBzZWN1cml0eSBvciBjcnlwdG9ncmFwaGljIHVzZXMsIHNlZSB0aGUKKyAgIDptb2Q6YHNlY3JldHNgIG1vZHVsZS4KIAogCiBCb29ra2VlcGluZyBmdW5jdGlvbnM6CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9yZS5yc3QgYi9Eb2MvbGlicmFyeS9yZS5yc3QKaW5kZXggNTY5YjUyMi4uZGZiZWRkNCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvcmUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3JlLnJzdApAQCAtMzIxLDggKzMyMSw5IEBACiAKIAogVGhlIHNwZWNpYWwgc2VxdWVuY2VzIGNvbnNpc3Qgb2YgYGAnXCdgYCBhbmQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgbGlzdCBiZWxvdy4KLUlmIHRoZSBvcmRpbmFyeSBjaGFyYWN0ZXIgaXMgbm90IG9uIHRoZSBsaXN0LCB0aGVuIHRoZSByZXN1bHRpbmcgUkUgd2lsbCBtYXRjaAotdGhlIHNlY29uZCBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSwgYGBcJGBgIG1hdGNoZXMgdGhlIGNoYXJhY3RlciBgYCckJ2BgLgorSWYgdGhlIG9yZGluYXJ5IGNoYXJhY3RlciBpcyBub3QgYW4gQVNDSUkgZGlnaXQgb3IgYW4gQVNDSUkgbGV0dGVyLCB0aGVuIHRoZQorcmVzdWx0aW5nIFJFIHdpbGwgbWF0Y2ggdGhlIHNlY29uZCBjaGFyYWN0ZXIuICBGb3IgZXhhbXBsZSwgYGBcJGBgIG1hdGNoZXMgdGhlCitjaGFyYWN0ZXIgYGAnJCdgYC4KIAogYGBcbnVtYmVyYGAKICAgIE1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBncm91cCBvZiB0aGUgc2FtZSBudW1iZXIuICBHcm91cHMgYXJlIG51bWJlcmVkCkBAIC00NDIsOSArNDQzLDggQEAKIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4zCiAgICBUaGUgYGAnXHUnYGAgYW5kIGBgJ1xVJ2BgIGVzY2FwZSBzZXF1ZW5jZXMgaGF2ZSBiZWVuIGFkZGVkLgogCi0uLiBkZXByZWNhdGVkLXJlbW92ZWQ6OiAzLjUgMy42Ci0gICBVbmtub3duIGVzY2FwZXMgY29uc2lzdGluZyBvZiBgYCdcJ2BgIGFuZCBBU0NJSSBsZXR0ZXIgbm93IHJhaXNlIGEKLSAgIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHdpbGwgYmUgZm9yYmlkZGVuIGluIFB5dGhvbiAzLjYuCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgVW5rbm93biBlc2NhcGVzIGNvbnNpc3Rpbmcgb2YgYGAnXCdgYCBhbmQgYW4gQVNDSUkgbGV0dGVyIG5vdyBhcmUgZXJyb3JzLgogCiAKIC4uIHNlZWFsc286OgpAQCAtNTMyLDExICs1MzIsMTEgQEAKICAgIGN1cnJlbnQgbG9jYWxlLiBUaGUgdXNlIG9mIHRoaXMgZmxhZyBpcyBkaXNjb3VyYWdlZCBhcyB0aGUgbG9jYWxlIG1lY2hhbmlzbQogICAgaXMgdmVyeSB1bnJlbGlhYmxlLCBhbmQgaXQgb25seSBoYW5kbGVzIG9uZSAiY3VsdHVyZSIgYXQgYSB0aW1lIGFueXdheTsKICAgIHlvdSBzaG91bGQgdXNlIFVuaWNvZGUgbWF0Y2hpbmcgaW5zdGVhZCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgaW4gUHl0aG9uIDMKLSAgIGZvciBVbmljb2RlIChzdHIpIHBhdHRlcm5zLiBUaGlzIGZsYWcgbWFrZXMgc2Vuc2Ugb25seSB3aXRoIGJ5dGVzIHBhdHRlcm5zLgorICAgZm9yIFVuaWNvZGUgKHN0cikgcGF0dGVybnMuIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBvbmx5IHdpdGggYnl0ZXMgcGF0dGVybnMuCiAKLSAgIC4uIGRlcHJlY2F0ZWQtcmVtb3ZlZDo6IDMuNSAzLjYKLSAgICAgIERlcHJlY2F0ZWQgdGhlIHVzZSBvZiAgOmNvbnN0OmByZS5MT0NBTEVgIHdpdGggc3RyaW5nIHBhdHRlcm5zIG9yCi0gICAgICA6Y29uc3Q6YHJlLkFTQ0lJYC4KKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICA6Y29uc3Q6YHJlLkxPQ0FMRWAgY2FuIGJlIHVzZWQgb25seSB3aXRoIGJ5dGVzIHBhdHRlcm5zIGFuZCBpcworICAgICAgbm90IGNvbXBhdGlibGUgd2l0aCA6Y29uc3Q6YHJlLkFTQ0lJYC4KIAogCiAuLiBkYXRhOjogTQpAQCAtNzQyLDkgKzc0Miw4IEBACiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQogICAgICAgVW5tYXRjaGVkIGdyb3VwcyBhcmUgcmVwbGFjZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcuCiAKLSAgIC4uIGRlcHJlY2F0ZWQtcmVtb3ZlZDo6IDMuNSAzLjYKLSAgICAgIFVua25vd24gZXNjYXBlcyBjb25zaXN0IG9mIGBgJ1wnYGAgYW5kIEFTQ0lJIGxldHRlciBub3cgcmFpc2UgYQotICAgICAgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgd2lsbCBiZSBmb3JiaWRkZW4gaW4gUHl0aG9uIDMuNi4KKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBVbmtub3duIGVzY2FwZXMgY29uc2lzdGluZyBvZiBgYCdcJ2BgIGFuZCBhbiBBU0NJSSBsZXR0ZXIgbm93IGFyZSBlcnJvcnMuCiAKIAogLi4gZnVuY3Rpb246OiBzdWJuKHBhdHRlcm4sIHJlcGwsIHN0cmluZywgY291bnQ9MCwgZmxhZ3M9MCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3JlYWRsaW5lLnJzdCBiL0RvYy9saWJyYXJ5L3JlYWRsaW5lLnJzdAppbmRleCA0ZDNjMDk5Li4zN2U0MDBlIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9yZWFkbGluZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvcmVhZGxpbmUucnN0CkBAIC0xNjcsNiArMTY3LDIwIEBACiAgICBUaGlzIGNhbGxzIDpjOmZ1bmM6YGFkZF9oaXN0b3J5YCBpbiB0aGUgdW5kZXJseWluZyBsaWJyYXJ5LgogCiAKKy4uIGZ1bmN0aW9uOjogc2V0X2F1dG9faGlzdG9yeShlbmFibGVkKQorCisgICBFbmFibGUgb3IgZGlzYWJsZSBhdXRvbWF0aWMgY2FsbHMgdG8gOmM6ZnVuYzpgYWRkX2hpc3RvcnlgIHdoZW4gcmVhZGluZworICAgaW5wdXQgdmlhIHJlYWRsaW5lLiAgVGhlICplbmFibGVkKiBhcmd1bWVudCBzaG91bGQgYmUgYSBCb29sZWFuIHZhbHVlCisgICB0aGF0IHdoZW4gdHJ1ZSwgZW5hYmxlcyBhdXRvIGhpc3RvcnksIGFuZCB0aGF0IHdoZW4gRmFsc2UsIGRpc2FibGVzCisgICBhdXRvIGhpc3RvcnkuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisgICAuLiBpbXBsLWRldGFpbDo6CisgICAgICBBdXRvIGhpc3RvcnkgaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBhbmQgY2hhbmdlcyB0byB0aGlzIGRvIG5vdCBwZXJzaXN0CisgICAgICBhY3Jvc3MgbXVsdGlwbGUgc2Vzc2lvbnMuCisKKwogU3RhcnR1cCBob29rcwogLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zZWNyZXRzLnJzdCBiL0RvYy9saWJyYXJ5L3NlY3JldHMucnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZjg0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGlicmFyeS9zZWNyZXRzLnJzdApAQCAtMCwwICsxLDE5OCBAQAorOm1vZDpgc2VjcmV0c2AgLS0tIEdlbmVyYXRlIHNlY3VyZSByYW5kb20gbnVtYmVycyBmb3IgbWFuYWdpbmcgc2VjcmV0cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisuLiBtb2R1bGU6OiBzZWNyZXRzCisgICA6c3lub3BzaXM6IEdlbmVyYXRlIHNlY3VyZSByYW5kb20gbnVtYmVycyBmb3IgbWFuYWdpbmcgc2VjcmV0cy4KKworLi4gbW9kdWxlYXV0aG9yOjogU3RldmVuIEQnQXByYW5vIDxzdGV2ZStweXRob25AcGVhcndvb2QuaW5mbz4KKy4uIHNlY3Rpb25hdXRob3I6OiBTdGV2ZW4gRCdBcHJhbm8gPHN0ZXZlK3B5dGhvbkBwZWFyd29vZC5pbmZvPgorLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKy4uIHRlc3RzZXR1cDo6CisKKyAgIGZyb20gc2VjcmV0cyBpbXBvcnQgKgorICAgX19uYW1lX18gPSAnPGRvY3Rlc3Q+JworCisqKlNvdXJjZSBjb2RlOioqIDpzb3VyY2U6YExpYi9zZWNyZXRzLnB5YAorCistLS0tLS0tLS0tLS0tCisKK1RoZSA6bW9kOmBzZWNyZXRzYCBtb2R1bGUgaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcKK3JhbmRvbSBudW1iZXJzIHN1aXRhYmxlIGZvciBtYW5hZ2luZyBkYXRhIHN1Y2ggYXMgcGFzc3dvcmRzLCBhY2NvdW50CithdXRoZW50aWNhdGlvbiwgc2VjdXJpdHkgdG9rZW5zLCBhbmQgcmVsYXRlZCBzZWNyZXRzLgorCitJbiBwYXJ0aWN1bGFybHksIDptb2Q6YHNlY3JldHNgIHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gdGhlCitkZWZhdWx0IHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvciBpbiB0aGUgOm1vZDpgcmFuZG9tYCBtb2R1bGUsIHdoaWNoCitpcyBkZXNpZ25lZCBmb3IgbW9kZWxsaW5nIGFuZCBzaW11bGF0aW9uLCBub3Qgc2VjdXJpdHkgb3IgY3J5cHRvZ3JhcGh5LgorCisuLiBzZWVhbHNvOjoKKworICAgOnBlcDpgNTA2YAorCisKK1JhbmRvbSBudW1iZXJzCistLS0tLS0tLS0tLS0tLQorCitUaGUgOm1vZDpgc2VjcmV0c2AgbW9kdWxlIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbW9zdCBzZWN1cmUgc291cmNlIG9mCityYW5kb21uZXNzIHRoYXQgeW91ciBvcGVyYXRpbmcgc3lzdGVtIHByb3ZpZGVzLgorCisuLiBjbGFzczo6IFN5c3RlbVJhbmRvbQorCisgICBBIGNsYXNzIGZvciBnZW5lcmF0aW5nIHJhbmRvbSBudW1iZXJzIHVzaW5nIHRoZSBoaWdoZXN0LXF1YWxpdHkKKyAgIHNvdXJjZXMgcHJvdmlkZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0uICBTZWUKKyAgIDpjbGFzczpgcmFuZG9tLlN5c3RlbVJhbmRvbWAgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKworLi4gZnVuY3Rpb246OiBjaG9pY2Uoc2VxdWVuY2UpCisKKyAgIFJldHVybiBhIHJhbmRvbWx5LWNob3NlbiBlbGVtZW50IGZyb20gYSBub24tZW1wdHkgc2VxdWVuY2UuCisKKy4uIGZ1bmN0aW9uOjogcmFuZGJlbG93KG4pCisKKyAgIFJldHVybiBhIHJhbmRvbSBpbnQgaW4gdGhlIHJhbmdlIFswLCAqbiopLgorCisuLiBmdW5jdGlvbjo6IHJhbmRiaXRzKGspCisKKyAgIFJldHVybiBhbiBpbnQgd2l0aCAqayogcmFuZG9tIGJpdHMuCisKKworR2VuZXJhdGluZyB0b2tlbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSA6bW9kOmBzZWNyZXRzYCBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHNlY3VyZQordG9rZW5zLCBzdWl0YWJsZSBmb3IgYXBwbGljYXRpb25zIHN1Y2ggYXMgcGFzc3dvcmQgcmVzZXRzLAoraGFyZC10by1ndWVzcyBVUkxzLCBhbmQgc2ltaWxhci4KKworLi4gZnVuY3Rpb246OiB0b2tlbl9ieXRlcyhbbmJ5dGVzPU5vbmVdKQorCisgICBSZXR1cm4gYSByYW5kb20gYnl0ZSBzdHJpbmcgY29udGFpbmluZyAqbmJ5dGVzKiBudW1iZXIgb2YgYnl0ZXMuCisgICBJZiAqbmJ5dGVzKiBpcyBgYE5vbmVgYCBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzCisgICB1c2VkLgorCisgICAuLiBkb2N0ZXN0OjoKKworICAgICAgPj4+IHRva2VuX2J5dGVzKDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICAgIGInXHhlYnJceDE3RCp0XHhhZVx4ZDRceGUzU1x4YjZceGUyXHhlYlAxXHg4YicKKworCisuLiBmdW5jdGlvbjo6IHRva2VuX2hleChbbmJ5dGVzPU5vbmVdKQorCisgICBSZXR1cm4gYSByYW5kb20gdGV4dCBzdHJpbmcsIGluIGhleGFkZWNpbWFsLiAgVGhlIHN0cmluZyBoYXMgKm5ieXRlcyoKKyAgIHJhbmRvbSBieXRlcywgZWFjaCBieXRlIGNvbnZlcnRlZCB0byB0d28gaGV4IGRpZ2l0cy4gIElmICpuYnl0ZXMqIGlzCisgICBgYE5vbmVgYCBvciBub3Qgc3VwcGxpZWQsIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCisKKyAgIC4uIGRvY3Rlc3Q6OgorCisgICAgICA+Pj4gdG9rZW5faGV4KDE2KSAgI2RvY3Rlc3Q6K1NLSVAKKyAgICAgICdmOWJmNzhiOWExOGNlNmQ0NmEwY2QyYjBiODZkZjlkYScKKworLi4gZnVuY3Rpb246OiB0b2tlbl91cmxzYWZlKFtuYnl0ZXM9Tm9uZV0pCisKKyAgIFJldHVybiBhIHJhbmRvbSBVUkwtc2FmZSB0ZXh0IHN0cmluZywgY29udGFpbmluZyAqbmJ5dGVzKiByYW5kb20KKyAgIGJ5dGVzLiAgVGhlIHRleHQgaXMgQmFzZTY0IGVuY29kZWQsIHNvIG9uIGF2ZXJhZ2UgZWFjaCBieXRlIHJlc3VsdHMKKyAgIGluIGFwcHJveGltYXRlbHkgMS4zIGNoYXJhY3RlcnMuICBJZiAqbmJ5dGVzKiBpcyBgYE5vbmVgYCBvciBub3QKKyAgIHN1cHBsaWVkLCBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLgorCisgICAuLiBkb2N0ZXN0OjoKKworICAgICAgPj4+IHRva2VuX3VybHNhZmUoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICAgJ0RybWh6ZTZFUGN2MGZOXzgxQmotbkEnCisKKworSG93IG1hbnkgYnl0ZXMgc2hvdWxkIHRva2VucyB1c2U/CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworVG8gYmUgc2VjdXJlIGFnYWluc3QKK2BicnV0ZS1mb3JjZSBhdHRhY2tzIDxodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcnV0ZS1mb3JjZV9hdHRhY2s+YF8sCit0b2tlbnMgbmVlZCB0byBoYXZlIHN1ZmZpY2llbnQgcmFuZG9tbmVzcy4gIFVuZm9ydHVuYXRlbHksIHdoYXQgaXMKK2NvbnNpZGVyZWQgc3VmZmljaWVudCB3aWxsIG5lY2Vzc2FyaWx5IGluY3JlYXNlIGFzIGNvbXB1dGVycyBnZXQgbW9yZQorcG93ZXJmdWwgYW5kIGFibGUgdG8gbWFrZSBtb3JlIGd1ZXNzZXMgaW4gYSBzaG9ydGVyIHBlcmlvZC4gIEFzIG9mIDIwMTUsCitpdCBpcyBiZWxpZXZlZCB0aGF0IDMyIGJ5dGVzICgyNTYgYml0cykgb2YgcmFuZG9tbmVzcyBpcyBzdWZmaWNpZW50IGZvcgordGhlIHR5cGljYWwgdXNlLWNhc2UgZXhwZWN0ZWQgZm9yIHRoZSA6bW9kOmBzZWNyZXRzYCBtb2R1bGUuCisKK0ZvciB0aG9zZSB3aG8gd2FudCB0byBtYW5hZ2UgdGhlaXIgb3duIHRva2VuIGxlbmd0aCwgeW91IGNhbiBleHBsaWNpdGx5CitzcGVjaWZ5IGhvdyBtdWNoIHJhbmRvbW5lc3MgaXMgdXNlZCBmb3IgdG9rZW5zIGJ5IGdpdmluZyBhbiA6Y2xhc3M6YGludGAKK2FyZ3VtZW50IHRvIHRoZSB2YXJpb3VzIGBgdG9rZW5fKmBgIGZ1bmN0aW9ucy4gIFRoYXQgYXJndW1lbnQgaXMgdGFrZW4KK2FzIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcmFuZG9tbmVzcyB0byB1c2UuCisKK090aGVyd2lzZSwgaWYgbm8gYXJndW1lbnQgaXMgcHJvdmlkZWQsIG9yIGlmIHRoZSBhcmd1bWVudCBpcyBgYE5vbmVgYCwKK3RoZSBgYHRva2VuXypgYCBmdW5jdGlvbnMgd2lsbCB1c2UgYSByZWFzb25hYmxlIGRlZmF1bHQgaW5zdGVhZC4KKworLi4gbm90ZTo6CisKKyAgIFRoYXQgZGVmYXVsdCBpcyBzdWJqZWN0IHRvIGNoYW5nZSBhdCBhbnkgdGltZSwgaW5jbHVkaW5nIGR1cmluZworICAgbWFpbnRlbmFuY2UgcmVsZWFzZXMuCisKKworT3RoZXIgZnVuY3Rpb25zCistLS0tLS0tLS0tLS0tLS0KKworLi4gZnVuY3Rpb246OiBjb21wYXJlX2RpZ2VzdChhLCBiKQorCisgICBSZXR1cm4gYGBUcnVlYGAgaWYgc3RyaW5ncyAqYSogYW5kICpiKiBhcmUgZXF1YWwsIG90aGVyd2lzZSBgYEZhbHNlYGAsCisgICBpbiBzdWNoIGEgd2F5IGFzIHRvIHJlZHVjZSB0aGUgcmlzayBvZgorICAgYHRpbWluZyBhdHRhY2tzIDxodHRwOi8vY29kYWhhbGUuY29tL2EtbGVzc29uLWluLXRpbWluZy1hdHRhY2tzLz5gXy4KKyAgIFNlZSA6ZnVuYzpgaG1hYy5jb21wYXJlX2RpZ2VzdGAgZm9yIGFkZGl0aW9uYWwgZGV0YWlscy4KKworCitSZWNpcGVzIGFuZCBiZXN0IHByYWN0aWNlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBzZWN0aW9uIHNob3dzIHJlY2lwZXMgYW5kIGJlc3QgcHJhY3RpY2VzIGZvciB1c2luZyA6bW9kOmBzZWNyZXRzYAordG8gbWFuYWdlIGEgYmFzaWMgbGV2ZWwgb2Ygc2VjdXJpdHkuCisKK0dlbmVyYXRlIGFuIGVpZ2h0LWNoYXJhY3RlciBhbHBoYW51bWVyaWMgcGFzc3dvcmQ6CisKKy4uIHRlc3Rjb2RlOjoKKworICAgaW1wb3J0IHN0cmluZworICAgYWxwaGFiZXQgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMKKyAgIHBhc3N3b3JkID0gJycuam9pbihjaG9pY2UoYWxwaGFiZXQpIGZvciBpIGluIHJhbmdlKDgpKQorCisKKy4uIG5vdGU6OgorCisgICBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdAorICAgYHN0b3JlIHBhc3N3b3JkcyBpbiBhIHJlY292ZXJhYmxlIGZvcm1hdCA8aHR0cDovL2N3ZS5taXRyZS5vcmcvZGF0YS9kZWZpbml0aW9ucy8yNTcuaHRtbD5gXywKKyAgIHdoZXRoZXIgcGxhaW4gdGV4dCBvciBlbmNyeXB0ZWQuICBUaGV5IHNob3VsZCBiZSBzYWx0ZWQgYW5kIGhhc2hlZAorICAgdXNpbmcgYSBjcnlwdG9ncmFwaGljYWxseS1zdHJvbmcgb25lLXdheSAoaXJyZXZlcnNpYmxlKSBoYXNoIGZ1bmN0aW9uLgorCisKK0dlbmVyYXRlIGEgdGVuLWNoYXJhY3RlciBhbHBoYW51bWVyaWMgcGFzc3dvcmQgd2l0aCBhdCBsZWFzdCBvbmUKK2xvd2VyY2FzZSBjaGFyYWN0ZXIsIGF0IGxlYXN0IG9uZSB1cHBlcmNhc2UgY2hhcmFjdGVyLCBhbmQgYXQgbGVhc3QKK3RocmVlIGRpZ2l0czoKKworLi4gdGVzdGNvZGU6OgorCisgICBpbXBvcnQgc3RyaW5nCisgICBhbHBoYWJldCA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cworICAgd2hpbGUgVHJ1ZToKKyAgICAgICBwYXNzd29yZCA9ICcnLmpvaW4oY2hvaWNlKGFscGhhYmV0KSBmb3IgaSBpbiByYW5nZSgxMCkpCisgICAgICAgaWYgKGFueShjLmlzbG93ZXIoKSBmb3IgYyBpbiBwYXNzd29yZCkKKyAgICAgICAgICAgICAgIGFuZCBhbnkoYy5pc3VwcGVyKCkgZm9yIGMgaW4gcGFzc3dvcmQpCisgICAgICAgICAgICAgICBhbmQgc3VtKGMuaXNkaWdpdCgpIGZvciBjIGluIHBhc3N3b3JkKSA+PSAzKToKKyAgICAgICAgICAgYnJlYWsKKworCitHZW5lcmF0ZSBhbiBgWEtDRC1zdHlsZSBwYXNzcGhyYXNlIDxodHRwOi8veGtjZC5jb20vOTM2Lz5gXzoKKworLi4gdGVzdGNvZGU6OgorCisgICAjIE9uIHN0YW5kYXJkIExpbnV4IHN5c3RlbXMsIHVzZSBhIGNvbnZlbmllbnQgZGljdGlvbmFyeSBmaWxlLgorICAgIyBPdGhlciBwbGF0Zm9ybXMgbWF5IG5lZWQgdG8gcHJvdmlkZSB0aGVpciBvd24gd29yZC1saXN0LgorICAgd2l0aCBvcGVuKCcvdXNyL3NoYXJlL2RpY3Qvd29yZHMnKSBhcyBmOgorICAgICAgIHdvcmRzID0gW3dvcmQuc3RyaXAoKSBmb3Igd29yZCBpbiBmXQorICAgICAgIHBhc3N3b3JkID0gJyAnLmpvaW4oY2hvaWNlKHdvcmRzKSBmb3IgaSBpbiByYW5nZSg0KSkKKworCitHZW5lcmF0ZSBhIGhhcmQtdG8tZ3Vlc3MgdGVtcG9yYXJ5IFVSTCBjb250YWluaW5nIGEgc2VjdXJpdHkgdG9rZW4KK3N1aXRhYmxlIGZvciBwYXNzd29yZCByZWNvdmVyeSBhcHBsaWNhdGlvbnM6CisKKy4uIHRlc3Rjb2RlOjoKKworICAgdXJsID0gJ2h0dHBzOi8vbXlkb21haW4uY29tL3Jlc2V0PScgKyB0b2tlbl91cmxzYWZlKCkKKworCisKKy4uCisgICAjIFRoaXMgbW9kZWxpbmUgbXVzdCBhcHBlYXIgd2l0aGluIHRoZSBsYXN0IHRlbiBsaW5lcyBvZiB0aGUgZmlsZS4KKyAgIGthdGU6IGluZGVudC13aWR0aCAzOyByZW1vdmUtdHJhaWxpbmctc3BhY2Ugb247IHJlcGxhY2UtdGFicyBvbjsgZW5jb2RpbmcgdXRmLTg7CmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zaXRlLnJzdCBiL0RvYy9saWJyYXJ5L3NpdGUucnN0CmluZGV4IDBhNzNmNWEuLjQzZGFmNzkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NpdGUucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NpdGUucnN0CkBAIC01Miw3ICs1Miw4IEBACiBBIHBhdGggY29uZmlndXJhdGlvbiBmaWxlIGlzIGEgZmlsZSB3aG9zZSBuYW1lIGhhcyB0aGUgZm9ybSA6ZmlsZTpge25hbWV9LnB0aGAKIGFuZCBleGlzdHMgaW4gb25lIG9mIHRoZSBmb3VyIGRpcmVjdG9yaWVzIG1lbnRpb25lZCBhYm92ZTsgaXRzIGNvbnRlbnRzIGFyZQogYWRkaXRpb25hbCBpdGVtcyAob25lIHBlciBsaW5lKSB0byBiZSBhZGRlZCB0byBgYHN5cy5wYXRoYGAuICBOb24tZXhpc3RpbmcgaXRlbXMKLWFyZSBuZXZlciBhZGRlZCB0byBgYHN5cy5wYXRoYGAuICBObyBpdGVtIGlzIGFkZGVkIHRvIGBgc3lzLnBhdGhgYCBtb3JlIHRoYW4KK2FyZSBuZXZlciBhZGRlZCB0byBgYHN5cy5wYXRoYGAsIGFuZCBubyBjaGVjayBpcyBtYWRlIHRoYXQgdGhlIGl0ZW0gcmVmZXJzIHRvIGEKK2RpcmVjdG9yeSByYXRoZXIgdGhhbiBhIGZpbGUuICBObyBpdGVtIGlzIGFkZGVkIHRvIGBgc3lzLnBhdGhgYCBtb3JlIHRoYW4KIG9uY2UuICBCbGFuayBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGggYGAjYGAgYXJlIHNraXBwZWQuICBMaW5lcyBzdGFydGluZwogd2l0aCBgYGltcG9ydGBgIChmb2xsb3dlZCBieSBzcGFjZSBvciB0YWIpIGFyZSBleGVjdXRlZC4KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc210cGQucnN0IGIvRG9jL2xpYnJhcnkvc210cGQucnN0CmluZGV4IDk3N2Y5YTguLmFkNmJkM2MgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NtdHBkLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zbXRwZC5yc3QKQEAgLTI5LDcgKzI5LDcgQEAKIAogCiAuLiBjbGFzczo6IFNNVFBTZXJ2ZXIobG9jYWxhZGRyLCByZW1vdGVhZGRyLCBkYXRhX3NpemVfbGltaXQ9MzM1NTQ0MzIsXAotICAgICAgICAgICAgICAgICAgICAgIG1hcD1Ob25lLCBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPVRydWUpCisgICAgICAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9RmFsc2UpCiAKICAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YFNNVFBTZXJ2ZXJgIG9iamVjdCwgd2hpY2ggYmluZHMgdG8gbG9jYWwgYWRkcmVzcwogICAgKmxvY2FsYWRkciouICBJdCB3aWxsIHRyZWF0ICpyZW1vdGVhZGRyKiBhcyBhbiB1cHN0cmVhbSBTTVRQIHJlbGF5ZXIuICBJdApAQCAtNDUsMjAgKzQ1LDE5IEBACiAgICBnbG9iYWwgc29ja2V0IG1hcCBpcyB1c2VkLgogCiAgICAqZW5hYmxlX1NNVFBVVEY4KiBkZXRlcm1pbnMgd2hldGhlciB0aGUgYGBTTVRQVVRGOGBgIGV4dGVuc2lvbiAoYXMgZGVmaW5lZAotICAgaW4gOlJGQzpgNjUzMWApIHNob3VsZCBiZSBlbmFibGVkLiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLiAgSWYgc2V0IHRvCi0gICBgYFRydWVgYCwgKmRlY29kZV9kYXRhKiBtdXN0IGJlIGBgRmFsc2VgYCAob3RoZXJ3aXNlIGFuIGVycm9yIGlzIHJhaXNlZCkuCisgICBpbiA6UkZDOmA2NTMxYCkgc2hvdWxkIGJlIGVuYWJsZWQuICBUaGUgZGVmYXVsdCBpcyBgYEZhbHNlYGAuCiAgICBXaGVuIGBgVHJ1ZWBgLCBgYFNNVFBVVEY4YGAgaXMgYWNjZXB0ZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIGBgTUFJTGBgCiAgICBjb21tYW5kIGFuZCB3aGVuIHByZXNlbnQgaXMgcGFzc2VkIHRvIDptZXRoOmBwcm9jZXNzX21lc3NhZ2VgIGluIHRoZQotICAgYGBrd2FyZ3NbJ21haWxfb3B0aW9ucyddYGAgbGlzdC4KKyAgIGBga3dhcmdzWydtYWlsX29wdGlvbnMnXWBgIGxpc3QuICAqZGVjb2RlX2RhdGEqIGFuZCAqZW5hYmxlX1NNVFBVVEY4KgorICAgY2Fubm90IGJlIHNldCB0byBgYFRydWVgYCBhdCB0aGUgc2FtZSB0aW1lLgogCiAgICAqZGVjb2RlX2RhdGEqIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIFNNVFAgdHJhbnNhY3Rpb24KLSAgIHNob3VsZCBiZSBkZWNvZGVkIHVzaW5nIFVURi04LiAgVGhlIGRlZmF1bHQgaXMgYGBUcnVlYGAgZm9yIGJhY2t3YXJkCi0gICBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIGJ1dCB3aWxsIGNoYW5nZSB0byBgYEZhbHNlYGAgaW4gUHl0aG9uIDMuNjsgc3BlY2lmeQotICAgdGhlIGtleXdvcmQgdmFsdWUgZXhwbGljaXRseSB0byBhdm9pZCB0aGUgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYC4gIFdoZW4KLSAgICpkZWNvZGVfZGF0YSogaXMgc2V0IHRvIGBgRmFsc2VgYCB0aGUgc2VydmVyIGFkdmVydGlzZXMgdGhlIGBgOEJJVE1JTUVgYAorICAgc2hvdWxkIGJlIGRlY29kZWQgdXNpbmcgVVRGLTguICBXaGVuICpkZWNvZGVfZGF0YSogaXMgYGBGYWxzZWBgICh0aGUKKyAgIGRlZmF1bHQpLCB0aGUgc2VydmVyIGFkdmVydGlzZXMgdGhlIGBgOEJJVE1JTUVgYAogICAgZXh0ZW5zaW9uICg6cmZjOmA2MTUyYCksIGFjY2VwdHMgdGhlIGBgQk9EWT04QklUTUlNRWBgIHBhcmFtZXRlciB0bwogICAgdGhlIGBgTUFJTGBgIGNvbW1hbmQsIGFuZCB3aGVuIHByZXNlbnQgcGFzc2VzIGl0IHRvIDptZXRoOmBwcm9jZXNzX21lc3NhZ2VgCi0gICBpbiB0aGUgYGBrd2FyZ3NbJ21haWxfb3B0aW9ucyddYGAgbGlzdC4KKyAgIGluIHRoZSBgYGt3YXJnc1snbWFpbF9vcHRpb25zJ11gYCBsaXN0LiAqZGVjb2RlX2RhdGEqIGFuZCAqZW5hYmxlX1NNVFBVVEY4KgorICAgY2Fubm90IGJlIHNldCB0byBgYFRydWVgYCBhdCB0aGUgc2FtZSB0aW1lLgogCiAgICAuLiBtZXRob2Q6OiBwcm9jZXNzX21lc3NhZ2UocGVlciwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEsICoqa3dhcmdzKQogCkBAIC03NSw5ICs3NCw4IEBACiAgICAgICB3aWxsIGJlIGEgYnl0ZXMgb2JqZWN0LgogCiAgICAgICAqa3dhcmdzKiBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiBJdCBpcyBlbXB0eQotICAgICAgdW5sZXNzIGF0IGxlYXN0IG9uZSBvZiBgYGRlY29kZV9kYXRhPUZhbHNlYGAgb3IgYGBlbmFibGVfU01UUFVURjg9VHJ1ZWBgCi0gICAgICB3YXMgZ2l2ZW4gYXMgYW4gaW5pdCBwYXJhbWV0ZXIsIGluIHdoaWNoIGNhc2UgaXQgY29udGFpbnMgdGhlIGZvbGxvd2luZwotICAgICAga2V5czoKKyAgICAgIGlmIGBgZGVjb2RlX2RhdGE9VHJ1ZWBgIHdhcyBnaXZlbiBhcyBhbiBpbml0IGFyZ3VtZW50LCBvdGhlcndpc2UKKyAgICAgIGl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcga2V5czoKIAogICAgICAgICAgICptYWlsX29wdGlvbnMqOgogICAgICAgICAgICAgIGEgbGlzdCBvZiBhbGwgcmVjZWl2ZWQgcGFyYW1ldGVycyB0byB0aGUgYGBNQUlMYGAKQEAgLTEwOCw5ICsxMDYsMTIgQEAKICAgICAgICpsb2NhbGFkZHIqIGFuZCAqcmVtb3RlYWRkciogbWF5IG5vdyBjb250YWluIElQdjYgYWRkcmVzc2VzLgogCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKLSAgICAgIHRoZSAqZGVjb2RlX2RhdGEqIGFuZCAqZW5hYmxlX1NNVFBVVEY4KiBjb25zdHJ1Y3RvciBhcmd1bWVudHMsIGFuZCB0aGUKLSAgICAgICprd2FyZ3MqIGFyZ3VtZW50IHRvIDptZXRoOmBwcm9jZXNzX21lc3NhZ2VgIHdoZW4gb25lIG9yIG1vcmUgb2YgdGhlc2UgaXMKLSAgICAgIHNwZWNpZmllZC4KKyAgICAgIFRoZSAqZGVjb2RlX2RhdGEqIGFuZCAqZW5hYmxlX1NNVFBVVEY4KiBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLCBhbmQgdGhlCisgICAgICAqa3dhcmdzKiBwYXJhbWV0ZXIgdG8gOm1ldGg6YHByb2Nlc3NfbWVzc2FnZWAgd2hlbiAqZGVjb2RlX2RhdGEqIGlzCisgICAgICBgYEZhbHNlYGAuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAqZGVjb2RlX2RhdGEqIGlzIG5vdyBgYEZhbHNlYGAgYnkgZGVmYXVsdC4KIAogCiBEZWJ1Z2dpbmdTZXJ2ZXIgT2JqZWN0cwpAQCAtMTUwLDcgKzE1MSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC4uIGNsYXNzOjogU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyLCBkYXRhX3NpemVfbGltaXQ9MzM1NTQ0MzIsXAotICAgICAgICAgICAgICAgICAgICAgICBtYXA9Tm9uZSwgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1UcnVlKQorICAgICAgICAgICAgICAgICAgICAgICBtYXA9Tm9uZSwgZW5hYmxlX1NNVFBVVEY4PUZhbHNlLCBkZWNvZGVfZGF0YT1GYWxzZSkKIAogICAgQ3JlYXRlIGEgbmV3IDpjbGFzczpgU01UUENoYW5uZWxgIG9iamVjdCB3aGljaCBtYW5hZ2VzIHRoZSBjb21tdW5pY2F0aW9uCiAgICBiZXR3ZWVuIHRoZSBzZXJ2ZXIgYW5kIGEgc2luZ2xlIFNNVFAgY2xpZW50LgpAQCAtMTYyLDIyICsxNjMsMjUgQEAKICAgIGxpbWl0LgogCiAgICAqZW5hYmxlX1NNVFBVVEY4KiBkZXRlcm1pbnMgd2hldGhlciB0aGUgYGBTTVRQVVRGOGBgIGV4dGVuc2lvbiAoYXMgZGVmaW5lZAotICAgaW4gOlJGQzpgNjUzMWApIHNob3VsZCBiZSBlbmFibGVkLiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLiAgQQotICAgOmV4YzpgVmFsdWVFcnJvcmAgaXMgcmFpc2VkIGlmIGJvdGggKmVuYWJsZV9TTVRQVVRGOCogYW5kICpkZWNvZGVfZGF0YSogYXJlCi0gICBzZXQgdG8gYGBUcnVlYGAgYXQgdGhlIHNhbWUgdGltZS4KKyAgIGluIDpSRkM6YDY1MzFgKSBzaG91bGQgYmUgZW5hYmxlZC4gIFRoZSBkZWZhdWx0IGlzIGBgRmFsc2VgYC4KKyAgICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqIGNhbm5vdCBiZSBzZXQgdG8gYGBUcnVlYGAgYXQgdGhlIHNhbWUKKyAgIHRpbWUuCiAKICAgIEEgZGljdGlvbmFyeSBjYW4gYmUgc3BlY2lmaWVkIGluICptYXAqIHRvIGF2b2lkIHVzaW5nIGEgZ2xvYmFsIHNvY2tldCBtYXAuCiAKICAgICpkZWNvZGVfZGF0YSogc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGRhdGEgcG9ydGlvbiBvZiB0aGUgU01UUCB0cmFuc2FjdGlvbgotICAgc2hvdWxkIGJlIGRlY29kZWQgdXNpbmcgVVRGLTguICBUaGUgZGVmYXVsdCBpcyBgYFRydWVgYCBmb3IgYmFja3dhcmQKLSAgIGNvbXBhdGliaWxpdHkgcmVhc29ucywgYnV0IHdpbGwgY2hhbmdlIHRvIGBgRmFsc2VgYCBpbiBQeXRob24gMy42LiAgU3BlY2lmeQotICAgdGhlIGtleXdvcmQgdmFsdWUgZXhwbGljaXRseSB0byBhdm9pZCB0aGUgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYC4KKyAgIHNob3VsZCBiZSBkZWNvZGVkIHVzaW5nIFVURi04LiAgVGhlIGRlZmF1bHQgaXMgYGBGYWxzZWBgLgorICAgKmRlY29kZV9kYXRhKiBhbmQgKmVuYWJsZV9TTVRQVVRGOCogY2Fubm90IGJlIHNldCB0byBgYFRydWVgYCBhdCB0aGUgc2FtZQorICAgdGltZS4KIAogICAgVG8gdXNlIGEgY3VzdG9tIFNNVFBDaGFubmVsIGltcGxlbWVudGF0aW9uIHlvdSBuZWVkIHRvIG92ZXJyaWRlIHRoZQogICAgOmF0dHI6YFNNVFBTZXJ2ZXIuY2hhbm5lbF9jbGFzc2Agb2YgeW91ciA6Y2xhc3M6YFNNVFBTZXJ2ZXJgLgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQotICAgICAgdGhlICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqIGFyZ3VtZW50cyB3ZXJlIGFkZGVkLgorICAgICAgVGhlICpkZWNvZGVfZGF0YSogYW5kICplbmFibGVfU01UUFVURjgqIHBhcmFtZXRlcnMgd2VyZSBhZGRlZC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICpkZWNvZGVfZGF0YSogaXMgbm93IGBgRmFsc2VgYCBieSBkZWZhdWx0LgogCiAgICBUaGUgOmNsYXNzOmBTTVRQQ2hhbm5lbGAgaGFzIHRoZSBmb2xsb3dpbmcgaW5zdGFuY2UgdmFyaWFibGVzOgogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zb2NrZXQucnN0IGIvRG9jL2xpYnJhcnkvc29ja2V0LnJzdAppbmRleCA0ODMxMWM1Li5jNjNjNzNhIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS9zb2NrZXQucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NvY2tldC5yc3QKQEAgLTMyOSwxMiArMzI5LDE3IEBACiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjMKIAogCi0uLiBkYXRhOjogU0lPXyoKKy4uIGRhdGE6OiBTSU9fUkNWQUxMCisgICAgICAgICAgU0lPX0tFRVBBTElWRV9WQUxTCisgICAgICAgICAgU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSAogICAgICAgICAgIFJDVkFMTF8qCiAKICAgIENvbnN0YW50cyBmb3IgV2luZG93cycgV1NBSW9jdGwoKS4gVGhlIGNvbnN0YW50cyBhcmUgdXNlZCBhcyBhcmd1bWVudHMgdG8gdGhlCiAgICA6bWV0aDpgfnNvY2tldC5zb2NrZXQuaW9jdGxgIG1ldGhvZCBvZiBzb2NrZXQgb2JqZWN0cy4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIGBgU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSGBgIHdhcyBhZGRlZC4KKwogCiAuLiBkYXRhOjogVElQQ18qCiAKQEAgLTg3Miw2ICs4NzcsMTAgQEAKICAgIGl0IGlzIHJlY29tbWVuZGVkIHRvIDptZXRoOmBjbG9zZWAgdGhlbSBleHBsaWNpdGx5LCBvciB0byB1c2UgYQogICAgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudCBhcm91bmQgdGhlbS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIDpleGM6YE9TRXJyb3JgIGlzIG5vdyByYWlzZWQgaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gdGhlIHVuZGVybHlpbmcKKyAgICAgIDpjOmZ1bmM6YGNsb3NlYCBjYWxsIGlzIG1hZGUuCisKICAgIC4uIG5vdGU6OgogCiAgICAgICA6bWV0aDpgY2xvc2UoKWAgcmVsZWFzZXMgdGhlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIGNvbm5lY3Rpb24gYnV0CkBAIC05OTIsNiArMTAwMSwxMiBAQAogICAgT24gb3RoZXIgcGxhdGZvcm1zLCB0aGUgZ2VuZXJpYyA6ZnVuYzpgZmNudGwuZmNudGxgIGFuZCA6ZnVuYzpgZmNudGwuaW9jdGxgCiAgICBmdW5jdGlvbnMgbWF5IGJlIHVzZWQ7IHRoZXkgYWNjZXB0IGEgc29ja2V0IG9iamVjdCBhcyB0aGVpciBmaXJzdCBhcmd1bWVudC4KIAorICAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBjb250cm9sIGNvZGVzIGFyZSBzdXBwb3J0ZWQ6CisgICBgYFNJT19SQ1ZBTExgYCwgYGBTSU9fS0VFUEFMSVZFX1ZBTFNgYCwgYW5kIGBgU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSGBgLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgYGBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIYGAgd2FzIGFkZGVkLgorCiAuLiBtZXRob2Q6OiBzb2NrZXQubGlzdGVuKFtiYWNrbG9nXSkKIAogICAgRW5hYmxlIGEgc2VydmVyIHRvIGFjY2VwdCBjb25uZWN0aW9ucy4gIElmICpiYWNrbG9nKiBpcyBzcGVjaWZpZWQsIGl0IG11c3QKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3NvY2tldHNlcnZlci5yc3QgYi9Eb2MvbGlicmFyeS9zb2NrZXRzZXJ2ZXIucnN0CmluZGV4IDk4ZDJjNDYuLjNlYjI3ZTMgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NvY2tldHNlcnZlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc29ja2V0c2VydmVyLnJzdApAQCAtNTIsMTEgKzUyLDEyIEBACiBvdmVycmlkaW5nIGl0cyA6bWV0aDpgfkJhc2VSZXF1ZXN0SGFuZGxlci5oYW5kbGVgIG1ldGhvZDsKIHRoaXMgbWV0aG9kIHdpbGwgcHJvY2VzcyBpbmNvbWluZwogcmVxdWVzdHMuICBTZWNvbmQsIHlvdSBtdXN0IGluc3RhbnRpYXRlIG9uZSBvZiB0aGUgc2VydmVyIGNsYXNzZXMsIHBhc3NpbmcgaXQKLXRoZSBzZXJ2ZXIncyBhZGRyZXNzIGFuZCB0aGUgcmVxdWVzdCBoYW5kbGVyIGNsYXNzLiAgVGhlbiBjYWxsIHRoZQordGhlIHNlcnZlcidzIGFkZHJlc3MgYW5kIHRoZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQordGhlIHNlcnZlciBpbiBhIDprZXl3b3JkOmB3aXRoYCBzdGF0ZW1lbnQuIFRoZW4gY2FsbCB0aGUKIDptZXRoOmB+QmFzZVNlcnZlci5oYW5kbGVfcmVxdWVzdGAgb3IKIDptZXRoOmB+QmFzZVNlcnZlci5zZXJ2ZV9mb3JldmVyYCBtZXRob2Qgb2YgdGhlIHNlcnZlciBvYmplY3QgdG8KIHByb2Nlc3Mgb25lIG9yIG1hbnkgcmVxdWVzdHMuICBGaW5hbGx5LCBjYWxsIDptZXRoOmB+QmFzZVNlcnZlci5zZXJ2ZXJfY2xvc2VgCi10byBjbG9zZSB0aGUgc29ja2V0LgordG8gY2xvc2UgdGhlIHNvY2tldCAodW5sZXNzIHlvdSB1c2VkIGEgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudCkuCiAKIFdoZW4gaW5oZXJpdGluZyBmcm9tIDpjbGFzczpgVGhyZWFkaW5nTWl4SW5gIGZvciB0aHJlYWRlZCBjb25uZWN0aW9uIGJlaGF2aW9yLAogeW91IHNob3VsZCBleHBsaWNpdGx5IGRlY2xhcmUgaG93IHlvdSB3YW50IHlvdXIgdGhyZWFkcyB0byBiZWhhdmUgb24gYW4gYWJydXB0CkBAIC0xMTEsNiArMTEyLDggQEAKICAgIDpjbGFzczpgVURQU2VydmVyYC4gIFNldHRpbmcgdGhlIHZhcmlvdXMgYXR0cmlidXRlcyBhbHNvIGNoYW5nZXMgdGhlCiAgICBiZWhhdmlvciBvZiB0aGUgdW5kZXJseWluZyBzZXJ2ZXIgbWVjaGFuaXNtLgogCisgICA6Y2xhc3M6YEZvcmtpbmdNaXhJbmAgYW5kIHRoZSBGb3JraW5nIGNsYXNzZXMgbWVudGlvbmVkIGJlbG93IGFyZQorICAgb25seSBhdmFpbGFibGUgb24gUE9TSVggcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCA6ZnVuYzpgfm9zLmZvcmtgLgogCiAuLiBjbGFzczo6IEZvcmtpbmdUQ1BTZXJ2ZXIKICAgICAgICAgICAgRm9ya2luZ1VEUFNlcnZlcgpAQCAtMzA0LDcgKzMwNywxMSBAQAogICAgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgdGhlIDptZXRoOmB+QmFzZVJlcXVlc3RIYW5kbGVyLmhhbmRsZWAKICAgICAgIG1ldGhvZCBvZiBhIDphdHRyOmBSZXF1ZXN0SGFuZGxlckNsYXNzYCBpbnN0YW5jZSByYWlzZXMKICAgICAgIGFuIGV4Y2VwdGlvbi4gIFRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCB0aGUgdHJhY2ViYWNrIHRvCi0gICAgICBzdGFuZGFyZCBvdXRwdXQgYW5kIGNvbnRpbnVlIGhhbmRsaW5nIGZ1cnRoZXIgcmVxdWVzdHMuCisgICAgICBzdGFuZGFyZCBlcnJvciBhbmQgY29udGludWUgaGFuZGxpbmcgZnVydGhlciByZXF1ZXN0cy4KKworICAgICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgICAgIE5vdyBvbmx5IGNhbGxlZCBmb3IgZXhjZXB0aW9ucyBkZXJpdmVkIGZyb20gdGhlIDpleGM6YEV4Y2VwdGlvbmAKKyAgICAgICAgIGNsYXNzLgogCiAKICAgIC4uIG1ldGhvZDo6IGhhbmRsZV90aW1lb3V0KCkKQEAgLTM0OSw2ICszNTYsMTEgQEAKICAgICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgOmNvbnN0OmBUcnVlYC4KIAogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgU3VwcG9ydCBmb3IgdGhlIDp0ZXJtOmBjb250ZXh0IG1hbmFnZXJgIHByb3RvY29sIHdhcyBhZGRlZC4gIEV4aXRpbmcgdGhlCisgICAgICBjb250ZXh0IG1hbmFnZXIgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIDptZXRoOmBzZXJ2ZXJfY2xvc2VgLgorCisKIFJlcXVlc3QgSGFuZGxlciBPYmplY3RzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zOTcsNiArNDA5LDE1IEBACiAgICByZWFkIG9yIHdyaXR0ZW4sIHJlc3BlY3RpdmVseSwgdG8gZ2V0IHRoZSByZXF1ZXN0IGRhdGEgb3IgcmV0dXJuIGRhdGEKICAgIHRvIHRoZSBjbGllbnQuCiAKKyAgIFRoZSA6YXR0cjpgcmZpbGVgIGF0dHJpYnV0ZXMgb2YgYm90aCBjbGFzc2VzIHN1cHBvcnQgdGhlCisgICA6Y2xhc3M6YGlvLkJ1ZmZlcmVkSU9CYXNlYCByZWFkYWJsZSBpbnRlcmZhY2UsIGFuZAorICAgOmF0dHI6YERhdGFncmFtUmVxdWVzdEhhbmRsZXIud2ZpbGVgIHN1cHBvcnRzIHRoZQorICAgOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgd3JpdGFibGUgaW50ZXJmYWNlLgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgOmF0dHI6YFN0cmVhbVJlcXVlc3RIYW5kbGVyLndmaWxlYCBhbHNvIHN1cHBvcnRzIHRoZQorICAgICAgOmNsYXNzOmBpby5CdWZmZXJlZElPQmFzZWAgd3JpdGFibGUgaW50ZXJmYWNlLgorCiAKIEV4YW1wbGVzCiAtLS0tLS0tLQpAQCAtNDI5LDExICs0NTAsMTAgQEAKICAgICAgICBIT1NULCBQT1JUID0gImxvY2FsaG9zdCIsIDk5OTkKIAogICAgICAgICMgQ3JlYXRlIHRoZSBzZXJ2ZXIsIGJpbmRpbmcgdG8gbG9jYWxob3N0IG9uIHBvcnQgOTk5OQotICAgICAgIHNlcnZlciA9IHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBNeVRDUEhhbmRsZXIpCi0KLSAgICAgICAjIEFjdGl2YXRlIHRoZSBzZXJ2ZXI7IHRoaXMgd2lsbCBrZWVwIHJ1bm5pbmcgdW50aWwgeW91Ci0gICAgICAgIyBpbnRlcnJ1cHQgdGhlIHByb2dyYW0gd2l0aCBDdHJsLUMKLSAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCBQT1JUKSwgTXlUQ1BIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgICMgQWN0aXZhdGUgdGhlIHNlcnZlcjsgdGhpcyB3aWxsIGtlZXAgcnVubmluZyB1bnRpbCB5b3UKKyAgICAgICAgICAgIyBpbnRlcnJ1cHQgdGhlIHByb2dyYW0gd2l0aCBDdHJsLUMKKyAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQogCiBBbiBhbHRlcm5hdGl2ZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MgdGhhdCBtYWtlcyB1c2Ugb2Ygc3RyZWFtcyAoZmlsZS1saWtlCiBvYmplY3RzIHRoYXQgc2ltcGxpZnkgY29tbXVuaWNhdGlvbiBieSBwcm92aWRpbmcgdGhlIHN0YW5kYXJkIGZpbGUgaW50ZXJmYWNlKTo6CkBAIC01MjEsOCArNTQxLDggQEAKIAogICAgaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICAgICBIT1NULCBQT1JUID0gImxvY2FsaG9zdCIsIDk5OTkKLSAgICAgICBzZXJ2ZXIgPSBzb2NrZXRzZXJ2ZXIuVURQU2VydmVyKChIT1NULCBQT1JUKSwgTXlVRFBIYW5kbGVyKQotICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICB3aXRoIHNvY2tldHNlcnZlci5VRFBTZXJ2ZXIoKEhPU1QsIFBPUlQpLCBNeVVEUEhhbmRsZXIpIGFzIHNlcnZlcjoKKyAgICAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQogCiBUaGlzIGlzIHRoZSBjbGllbnQgc2lkZTo6CiAKQEAgLTU4MSwyMiArNjAxLDIyIEBACiAgICAgICAgSE9TVCwgUE9SVCA9ICJsb2NhbGhvc3QiLCAwCiAKICAgICAgICBzZXJ2ZXIgPSBUaHJlYWRlZFRDUFNlcnZlcigoSE9TVCwgUE9SVCksIFRocmVhZGVkVENQUmVxdWVzdEhhbmRsZXIpCi0gICAgICAgaXAsIHBvcnQgPSBzZXJ2ZXIuc2VydmVyX2FkZHJlc3MKKyAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgaXAsIHBvcnQgPSBzZXJ2ZXIuc2VydmVyX2FkZHJlc3MKIAotICAgICAgICMgU3RhcnQgYSB0aHJlYWQgd2l0aCB0aGUgc2VydmVyIC0tIHRoYXQgdGhyZWFkIHdpbGwgdGhlbiBzdGFydCBvbmUKLSAgICAgICAjIG1vcmUgdGhyZWFkIGZvciBlYWNoIHJlcXVlc3QKLSAgICAgICBzZXJ2ZXJfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLnNlcnZlX2ZvcmV2ZXIpCi0gICAgICAgIyBFeGl0IHRoZSBzZXJ2ZXIgdGhyZWFkIHdoZW4gdGhlIG1haW4gdGhyZWFkIHRlcm1pbmF0ZXMKLSAgICAgICBzZXJ2ZXJfdGhyZWFkLmRhZW1vbiA9IFRydWUKLSAgICAgICBzZXJ2ZXJfdGhyZWFkLnN0YXJ0KCkKLSAgICAgICBwcmludCgiU2VydmVyIGxvb3AgcnVubmluZyBpbiB0aHJlYWQ6Iiwgc2VydmVyX3RocmVhZC5uYW1lKQorICAgICAgICAgICAjIFN0YXJ0IGEgdGhyZWFkIHdpdGggdGhlIHNlcnZlciAtLSB0aGF0IHRocmVhZCB3aWxsIHRoZW4gc3RhcnQgb25lCisgICAgICAgICAgICMgbW9yZSB0aHJlYWQgZm9yIGVhY2ggcmVxdWVzdAorICAgICAgICAgICBzZXJ2ZXJfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLnNlcnZlX2ZvcmV2ZXIpCisgICAgICAgICAgICMgRXhpdCB0aGUgc2VydmVyIHRocmVhZCB3aGVuIHRoZSBtYWluIHRocmVhZCB0ZXJtaW5hdGVzCisgICAgICAgICAgIHNlcnZlcl90aHJlYWQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICBzZXJ2ZXJfdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgICAgcHJpbnQoIlNlcnZlciBsb29wIHJ1bm5pbmcgaW4gdGhyZWFkOiIsIHNlcnZlcl90aHJlYWQubmFtZSkKIAotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDEiKQotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDIiKQotICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDMiKQorICAgICAgICAgICBjbGllbnQoaXAsIHBvcnQsICJIZWxsbyBXb3JsZCAxIikKKyAgICAgICAgICAgY2xpZW50KGlwLCBwb3J0LCAiSGVsbG8gV29ybGQgMiIpCisgICAgICAgICAgIGNsaWVudChpcCwgcG9ydCwgIkhlbGxvIFdvcmxkIDMiKQogCi0gICAgICAgc2VydmVyLnNodXRkb3duKCkKLSAgICAgICBzZXJ2ZXIuc2VydmVyX2Nsb3NlKCkKKyAgICAgICAgICAgc2VydmVyLnNodXRkb3duKCkKIAogCiBUaGUgb3V0cHV0IG9mIHRoZSBleGFtcGxlIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6OgpAQCAtNjEwLDMgKzYzMCw1IEBACiAKIFRoZSA6Y2xhc3M6YEZvcmtpbmdNaXhJbmAgY2xhc3MgaXMgdXNlZCBpbiB0aGUgc2FtZSB3YXksIGV4Y2VwdCB0aGF0IHRoZSBzZXJ2ZXIKIHdpbGwgc3Bhd24gYSBuZXcgcHJvY2VzcyBmb3IgZWFjaCByZXF1ZXN0LgorQXZhaWxhYmxlIG9ubHkgb24gUE9TSVggcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCA6ZnVuYzpgfm9zLmZvcmtgLgorCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zcHdkLnJzdCBiL0RvYy9saWJyYXJ5L3Nwd2QucnN0CmluZGV4IGZkM2M5YWQuLmM2Y2FkMmEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3Nwd2QucnN0CisrKyBiL0RvYy9saWJyYXJ5L3Nwd2QucnN0CkBAIC01NSw2ICs1NSw5IEBACiAKICAgIFJldHVybiB0aGUgc2hhZG93IHBhc3N3b3JkIGRhdGFiYXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gdXNlciBuYW1lLgogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgUmFpc2VzIGEgOmV4YzpgUGVybWlzc2lvbkVycm9yYCBpbnN0ZWFkIG9mIDpleGM6YEtleUVycm9yYCBpZiB0aGUgdXNlcgorICAgICAgZG9lc24ndCBoYXZlIHByaXZpbGVnZXMuCiAKIC4uIGZ1bmN0aW9uOjogZ2V0c3BhbGwoKQogCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS9zcWxpdGUzLnJzdCBiL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CmluZGV4IDYwNWQ4ZDMuLjJjZDgyM2UgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CisrKyBiL0RvYy9saWJyYXJ5L3NxbGl0ZTMucnN0CkBAIC02MjksOSArNjI5LDE2IEBACiAgICAuLiBhdHRyaWJ1dGU6OiBsYXN0cm93aWQKIAogICAgICAgVGhpcyByZWFkLW9ubHkgYXR0cmlidXRlIHByb3ZpZGVzIHRoZSByb3dpZCBvZiB0aGUgbGFzdCBtb2RpZmllZCByb3cuIEl0IGlzCi0gICAgICBvbmx5IHNldCBpZiB5b3UgaXNzdWVkIGFuIGBgSU5TRVJUYGAgc3RhdGVtZW50IHVzaW5nIHRoZSA6bWV0aDpgZXhlY3V0ZWAKLSAgICAgIG1ldGhvZC4gRm9yIG9wZXJhdGlvbnMgb3RoZXIgdGhhbiBgYElOU0VSVGBgIG9yIHdoZW4gOm1ldGg6YGV4ZWN1dGVtYW55YCBpcwotICAgICAgY2FsbGVkLCA6YXR0cjpgbGFzdHJvd2lkYCBpcyBzZXQgdG8gOmNvbnN0OmBOb25lYC4KKyAgICAgIG9ubHkgc2V0IGlmIHlvdSBpc3N1ZWQgYW4gYGBJTlNFUlRgYCBvciBhIGBgUkVQTEFDRWBgIHN0YXRlbWVudCB1c2luZyB0aGUKKyAgICAgIDptZXRoOmBleGVjdXRlYCBtZXRob2QuICBGb3Igb3BlcmF0aW9ucyBvdGhlciB0aGFuIGBgSU5TRVJUYGAgb3IKKyAgICAgIGBgUkVQTEFDRWBgIG9yIHdoZW4gOm1ldGg6YGV4ZWN1dGVtYW55YCBpcyBjYWxsZWQsIDphdHRyOmBsYXN0cm93aWRgIGlzCisgICAgICBzZXQgdG8gOmNvbnN0OmBOb25lYC4KKworICAgICAgSWYgdGhlIGBgSU5TRVJUYGAgb3IgYGBSRVBMQUNFYGAgc3RhdGVtZW50IGZhaWxlZCB0byBpbnNlcnQgdGhlIHByZXZpb3VzCisgICAgICBzdWNjZXNzZnVsIHJvd2lkIGlzIHJldHVybmVkLgorCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIGBgUkVQTEFDRWBgIHN0YXRlbWVudC4KIAogICAgLi4gYXR0cmlidXRlOjogZGVzY3JpcHRpb24KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0IGIvRG9jL2xpYnJhcnkvc3RkdHlwZXMucnN0CmluZGV4IGRiMWMyZDAuLjBhZGUxNzIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N0ZHR5cGVzLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zdGR0eXBlcy5yc3QKQEAgLTE0NTMsOCArMTQ1Myw4IEBACiAKICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBgYHN0cmBgIGNsYXNzIGFuZCBpdHMgbWV0aG9kcywgc2VlCiAgICA6cmVmOmB0ZXh0c2VxYCBhbmQgdGhlIDpyZWY6YHN0cmluZy1tZXRob2RzYCBzZWN0aW9uIGJlbG93LiAgVG8gb3V0cHV0Ci0gICBmb3JtYXR0ZWQgc3RyaW5ncywgc2VlIHRoZSA6cmVmOmBmb3JtYXRzdHJpbmdzYCBzZWN0aW9uLiAgSW4gYWRkaXRpb24sCi0gICBzZWUgdGhlIDpyZWY6YHN0cmluZ3NlcnZpY2VzYCBzZWN0aW9uLgorICAgZm9ybWF0dGVkIHN0cmluZ3MsIHNlZSB0aGUgOnJlZjpgZi1zdHJpbmdzYCBhbmQgOnJlZjpgZm9ybWF0c3RyaW5nc2AKKyAgIHNlY3Rpb25zLiAgSW4gYWRkaXRpb24sIHNlZSB0aGUgOnJlZjpgc3RyaW5nc2VydmljZXNgIHNlY3Rpb24uCiAKIAogLi4gaW5kZXg6OgpAQCAtMjA1Niw4ICsyMDU2LDggQEAKIC4uIGluZGV4OjoKICAgIHNpbmdsZTogZm9ybWF0dGluZywgc3RyaW5nICglKQogICAgc2luZ2xlOiBpbnRlcnBvbGF0aW9uLCBzdHJpbmcgKCUpCi0gICBzaW5nbGU6IHN0cmluZzsgZm9ybWF0dGluZwotICAgc2luZ2xlOiBzdHJpbmc7IGludGVycG9sYXRpb24KKyAgIHNpbmdsZTogc3RyaW5nOyBmb3JtYXR0aW5nLCBwcmludGYKKyAgIHNpbmdsZTogc3RyaW5nOyBpbnRlcnBvbGF0aW9uLCBwcmludGYKICAgIHNpbmdsZTogcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcKICAgIHNpbmdsZTogc3ByaW50Zi1zdHlsZSBmb3JtYXR0aW5nCiAgICBzaW5nbGU6ICUgZm9ybWF0dGluZwpAQCAtMjA2Nyw5ICsyMDY3LDEwIEBACiAKICAgIFRoZSBmb3JtYXR0aW5nIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGhlcmUgZXhoaWJpdCBhIHZhcmlldHkgb2YgcXVpcmtzIHRoYXQKICAgIGxlYWQgdG8gYSBudW1iZXIgb2YgY29tbW9uIGVycm9ycyAoc3VjaCBhcyBmYWlsaW5nIHRvIGRpc3BsYXkgdHVwbGVzIGFuZAotICAgZGljdGlvbmFyaWVzIGNvcnJlY3RseSkuICBVc2luZyB0aGUgbmV3ZXIgOm1ldGg6YHN0ci5mb3JtYXRgIGludGVyZmFjZQotICAgaGVscHMgYXZvaWQgdGhlc2UgZXJyb3JzLCBhbmQgYWxzbyBwcm92aWRlcyBhIGdlbmVyYWxseSBtb3JlIHBvd2VyZnVsLAotICAgZmxleGlibGUgYW5kIGV4dGVuc2libGUgYXBwcm9hY2ggdG8gZm9ybWF0dGluZyB0ZXh0LgorICAgZGljdGlvbmFyaWVzIGNvcnJlY3RseSkuICBVc2luZyB0aGUgbmV3ZXIgOnJlZjpgZm9ybWF0dGVkCisgICBzdHJpbmcgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gIG9yIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgaW50ZXJmYWNlCisgICBoZWxwcyBhdm9pZCB0aGVzZSBlcnJvcnMuICBUaGVzZSBhbHRlcm5hdGl2ZXMgYWxzbyBwcm92aWRlIG1vcmUgcG93ZXJmdWwsCisgICBmbGV4aWJsZSBhbmQgZXh0ZW5zaWJsZSBhcHByb2FjaGVzIHRvIGZvcm1hdHRpbmcgdGV4dC4KIAogU3RyaW5nIG9iamVjdHMgaGF2ZSBvbmUgdW5pcXVlIGJ1aWx0LWluIG9wZXJhdGlvbjogdGhlIGBgJWBgIG9wZXJhdG9yIChtb2R1bG8pLgogVGhpcyBpcyBhbHNvIGtub3duIGFzIHRoZSBzdHJpbmcgKmZvcm1hdHRpbmcqIG9yICppbnRlcnBvbGF0aW9uKiBvcGVyYXRvci4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QgYi9Eb2MvbGlicmFyeS9zdHJpbmcucnN0CmluZGV4IGQ1ZDI0MzAuLmM0MjFjNzIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N0cmluZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3RyaW5nLnJzdApAQCAtMTg4LDcgKzE4OCw5IEBACiAKIFRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kIGFuZCB0aGUgOmNsYXNzOmBGb3JtYXR0ZXJgIGNsYXNzIHNoYXJlIHRoZSBzYW1lCiBzeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiA6Y2xhc3M6YEZvcm1hdHRlcmAsCi1zdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS4KK3N1YmNsYXNzZXMgY2FuIGRlZmluZSB0aGVpciBvd24gZm9ybWF0IHN0cmluZyBzeW50YXgpLiAgVGhlIHN5bnRheCBpcworcmVsYXRlZCB0byB0aGF0IG9mIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gLCBidXQKK3RoZXJlIGFyZSBkaWZmZXJlbmNlcy4KIAogRm9ybWF0IHN0cmluZ3MgY29udGFpbiAicmVwbGFjZW1lbnQgZmllbGRzIiBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcyBgYHt9YGAuCiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzIGNvbnNpZGVyZWQgbGl0ZXJhbCB0ZXh0LCB3aGljaCBpcwpAQCAtMjgzLDcgKzI4NSw4IEBACiAKICJGb3JtYXQgc3BlY2lmaWNhdGlvbnMiIGFyZSB1c2VkIHdpdGhpbiByZXBsYWNlbWVudCBmaWVsZHMgY29udGFpbmVkIHdpdGhpbiBhCiBmb3JtYXQgc3RyaW5nIHRvIGRlZmluZSBob3cgaW5kaXZpZHVhbCB2YWx1ZXMgYXJlIHByZXNlbnRlZCAoc2VlCi06cmVmOmBmb3JtYXRzdHJpbmdzYCkuICBUaGV5IGNhbiBhbHNvIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgYnVpbHQtaW4KKzpyZWY6YGZvcm1hdHN0cmluZ3NgIGFuZCA6cmVmOmBmLXN0cmluZ3NgKS4KK1RoZXkgY2FuIGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBidWlsdC1pbgogOmZ1bmM6YGZvcm1hdGAgZnVuY3Rpb24uICBFYWNoIGZvcm1hdHRhYmxlIHR5cGUgbWF5IGRlZmluZSBob3cgdGhlIGZvcm1hdAogc3BlY2lmaWNhdGlvbiBpcyB0byBiZSBpbnRlcnByZXRlZC4KIApAQCAtMzA4LDcgKzMxMSw4IEBACiBJZiBhIHZhbGlkICphbGlnbiogdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBjYW4gYmUgcHJlY2VkZWQgYnkgYSAqZmlsbCoKIGNoYXJhY3RlciB0aGF0IGNhbiBiZSBhbnkgY2hhcmFjdGVyIGFuZCBkZWZhdWx0cyB0byBhIHNwYWNlIGlmIG9taXR0ZWQuCiBJdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIGEgbGl0ZXJhbCBjdXJseSBicmFjZSAoImBge2BgIiBvciAiYGB9YGAiKSBhcwotdGhlICpmaWxsKiBjaGFyYWN0ZXIgd2hlbiB1c2luZyB0aGUgOm1ldGg6YHN0ci5mb3JtYXRgCit0aGUgKmZpbGwqIGNoYXJhY3RlciBpbiBhIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbAorPGYtc3RyaW5ncz5gIG9yIHdoZW4gdXNpbmcgdGhlIDptZXRoOmBzdHIuZm9ybWF0YAogbWV0aG9kLiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IGEgY3VybHkgYnJhY2UKIHdpdGggYSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGQuICBUaGlzIGxpbWl0YXRpb24gZG9lc24ndAogYWZmZWN0IHRoZSA6ZnVuYzpgZm9ybWF0YCBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N1YnByb2Nlc3MucnN0IGIvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKaW5kZXggZjQ2OTEwNy4uM2RhNDU3NCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3VicHJvY2Vzcy5yc3QKQEAgLTUwMiw2ICs1MDIsMTAgQEAKICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy4yCiAgICAgICBBZGRlZCBjb250ZXh0IG1hbmFnZXIgc3VwcG9ydC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFBvcGVuIGRlc3RydWN0b3Igbm93IGVtaXRzIGEgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCB3YXJuaW5nIGlmIHRoZSBjaGlsZAorICAgICAgcHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nLgorCiAKIEV4Y2VwdGlvbnMKIF5eXl5eXl5eXl4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3N5cy5yc3QgYi9Eb2MvbGlicmFyeS9zeXMucnN0CmluZGV4IDlmNzBhMTMuLmFlN2FmN2MgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3N5cy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvc3lzLnJzdApAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAoZGVmYXVsdGluZyB0byB6ZXJvKSwgb3IgYW5vdGhlciB0eXBlIG9mIG9iamVjdC4gIElmIGl0IGlzIGFuIGludGVnZXIsIHplcm8KICAgIGlzIGNvbnNpZGVyZWQgInN1Y2Nlc3NmdWwgdGVybWluYXRpb24iIGFuZCBhbnkgbm9uemVybyB2YWx1ZSBpcyBjb25zaWRlcmVkCiAgICAiYWJub3JtYWwgdGVybWluYXRpb24iIGJ5IHNoZWxscyBhbmQgdGhlIGxpa2UuICBNb3N0IHN5c3RlbXMgcmVxdWlyZSBpdCB0byBiZQotICAgaW4gdGhlIHJhbmdlIDAtMTI3LCBhbmQgcHJvZHVjZSB1bmRlZmluZWQgcmVzdWx0cyBvdGhlcndpc2UuICBTb21lIHN5c3RlbXMKKyAgIGluIHRoZSByYW5nZSAwLS0xMjcsIGFuZCBwcm9kdWNlIHVuZGVmaW5lZCByZXN1bHRzIG90aGVyd2lzZS4gIFNvbWUgc3lzdGVtcwogICAgaGF2ZSBhIGNvbnZlbnRpb24gZm9yIGFzc2lnbmluZyBzcGVjaWZpYyBtZWFuaW5ncyB0byBzcGVjaWZpYyBleGl0IGNvZGVzLCBidXQKICAgIHRoZXNlIGFyZSBnZW5lcmFsbHkgdW5kZXJkZXZlbG9wZWQ7IFVuaXggcHJvZ3JhbXMgZ2VuZXJhbGx5IHVzZSAyIGZvciBjb21tYW5kCiAgICBsaW5lIHN5bnRheCBlcnJvcnMgYW5kIDEgZm9yIGFsbCBvdGhlciBraW5kIG9mIGVycm9ycy4gIElmIGFub3RoZXIgdHlwZSBvZgpAQCAtMjY5LDYgKzI2OSwxMSBAQAogICAgdGhlIHByb2Nlc3Mgd2hlbiBjYWxsZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQsIGFuZCB0aGUgZXhjZXB0aW9uIGlzIG5vdAogICAgaW50ZXJjZXB0ZWQuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBJZiBhbiBlcnJvciBvY2N1cnMgaW4gdGhlIGNsZWFudXAgYWZ0ZXIgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgorICAgICAgaGFzIGNhdWdodCA6ZXhjOmBTeXN0ZW1FeGl0YCAoc3VjaCBhcyBhbiBlcnJvciBmbHVzaGluZyBidWZmZXJlZCBkYXRhCisgICAgICBpbiB0aGUgc3RhbmRhcmQgc3RyZWFtcyksIHRoZSBleGl0IHN0YXR1cyBpcyBjaGFuZ2VkIHRvIDEyMC4KKwogCiAuLiBkYXRhOjogZmxhZ3MKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvc3lzY29uZmlnLnJzdCBiL0RvYy9saWJyYXJ5L3N5c2NvbmZpZy5yc3QKaW5kZXggMGIwZGY5Yi4uYTExNWJlYSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvc3lzY29uZmlnLnJzdAorKysgYi9Eb2MvbGlicmFyeS9zeXNjb25maWcucnN0CkBAIC0xNjQsNyArMTY0LDcgQEAKIC4uIGZ1bmN0aW9uOjogZ2V0X3B5dGhvbl92ZXJzaW9uKCkKIAogICAgUmV0dXJuIHRoZSBgYE1BSk9SLk1JTk9SYGAgUHl0aG9uIHZlcnNpb24gbnVtYmVyIGFzIGEgc3RyaW5nLiAgU2ltaWxhciB0bwotICAgYGBzeXMudmVyc2lvbls6M11gYC4KKyAgIGBgJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdYGAuCiAKIAogLi4gZnVuY3Rpb246OiBnZXRfcGxhdGZvcm0oKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdCBiL0RvYy9saWJyYXJ5L3RlbG5ldGxpYi5yc3QKaW5kZXggYjk1MGU0MS4uZjljNTE1MyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGVsbmV0bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS90ZWxuZXRsaWIucnN0CkBAIC00Myw2ICs0MywxNyBAQAogICAgOmV4YzpgRU9GRXJyb3JgIHdoZW4gdGhlIGVuZCBvZiB0aGUgY29ubmVjdGlvbiBpcyByZWFkLCBiZWNhdXNlIHRoZXkgY2FuIHJldHVybgogICAgYW4gZW1wdHkgc3RyaW5nIGZvciBvdGhlciByZWFzb25zLiAgU2VlIHRoZSBpbmRpdmlkdWFsIGRlc2NyaXB0aW9ucyBiZWxvdy4KIAorICAgQSA6Y2xhc3M6YFRlbG5ldGAgb2JqZWN0IGlzIGEgY29udGV4dCBtYW5hZ2VyIGFuZCBjYW4gYmUgdXNlZCBpbiBhCisgICA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50LiAgV2hlbiB0aGUgOmtleXdvcmQ6YHdpdGhgIGJsb2NrIGVuZHMsIHRoZQorICAgOm1ldGg6YGNsb3NlYCBtZXRob2QgaXMgY2FsbGVkOjoKKworICAgICAgID4+PiBmcm9tIHRlbG5ldGxpYiBpbXBvcnQgVGVsbmV0CisgICAgICAgPj4+IHdpdGggVGVsbmV0KCdsb2NhbGhvc3QnLCAyMykgYXMgdG46CisgICAgICAgLi4uICAgICB0bi5pbnRlcmFjdCgpCisgICAgICAgLi4uCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42IENvbnRleHQgbWFuYWdlciBzdXBwb3J0IGFkZGVkCisKIAogLi4gc2VlYWxzbzo6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3Rlc3QucnN0IGIvRG9jL2xpYnJhcnkvdGVzdC5yc3QKaW5kZXggMmVhOWMyNy4uNzExNGNkZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdGVzdC5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdGVzdC5yc3QKQEAgLTU4Miw2ICs1ODIsNDggQEAKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNQogCiAKKy4uIGZ1bmN0aW9uOjogY2hlY2tfX2FsbF9fKHRlc3RfY2FzZSwgbW9kdWxlLCBuYW1lX29mX21vZHVsZT1Ob25lLCBleHRyYT0oKSwgYmxhY2tsaXN0PSgpKQorCisgICBBc3NlcnQgdGhhdCB0aGUgYGBfX2FsbF9fYGAgdmFyaWFibGUgb2YgKm1vZHVsZSogY29udGFpbnMgYWxsIHB1YmxpYyBuYW1lcy4KKworICAgVGhlIG1vZHVsZSdzIHB1YmxpYyBuYW1lcyAoaXRzIEFQSSkgYXJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkKKyAgIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBtYXRjaCB0aGUgcHVibGljIG5hbWUgY29udmVudGlvbiBhbmQgd2VyZSBkZWZpbmVkIGluCisgICAqbW9kdWxlKi4KKworICAgVGhlICpuYW1lX29mX21vZHVsZSogYXJndW1lbnQgY2FuIHNwZWNpZnkgKGFzIGEgc3RyaW5nIG9yIHR1cGxlIHRoZXJlb2YpIHdoYXQKKyAgIG1vZHVsZShzKSBhbiBBUEkgY291bGQgYmUgZGVmaW5lZCBpbiBpbiBvcmRlciB0byBiZSBkZXRlY3RlZCBhcyBhIHB1YmxpYworICAgQVBJLiBPbmUgY2FzZSBmb3IgdGhpcyBpcyB3aGVuICptb2R1bGUqIGltcG9ydHMgcGFydCBvZiBpdHMgcHVibGljIEFQSSBmcm9tCisgICBvdGhlciBtb2R1bGVzLCBwb3NzaWJseSBhIEMgYmFja2VuZCAobGlrZSBgYGNzdmBgIGFuZCBpdHMgYGBfY3N2YGApLgorCisgICBUaGUgKmV4dHJhKiBhcmd1bWVudCBjYW4gYmUgYSBzZXQgb2YgbmFtZXMgdGhhdCB3b3VsZG4ndCBvdGhlcndpc2UgYmUgYXV0b21hdGljYWxseQorICAgZGV0ZWN0ZWQgYXMgInB1YmxpYyIsIGxpa2Ugb2JqZWN0cyB3aXRob3V0IGEgcHJvcGVyIGBgX19tb2R1bGVfX2BgCisgICBhdHRyaWJ1dGUuIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG9uZXMuCisKKyAgIFRoZSAqYmxhY2tsaXN0KiBhcmd1bWVudCBjYW4gYmUgYSBzZXQgb2YgbmFtZXMgdGhhdCBtdXN0IG5vdCBiZSB0cmVhdGVkIGFzIHBhcnQgb2YKKyAgIHRoZSBwdWJsaWMgQVBJIGV2ZW4gdGhvdWdoIHRoZWlyIG5hbWVzIGluZGljYXRlIG90aGVyd2lzZS4KKworICAgRXhhbXBsZSB1c2U6OgorCisgICAgICBpbXBvcnQgYmFyCisgICAgICBpbXBvcnQgZm9vCisgICAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisgICAgICBjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZm9vKQorCisgICAgICBjbGFzcyBPdGhlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICAgIGV4dHJhID0geydCQVJfQ09OU1QnLCAnRk9PX0NPTlNUJ30KKyAgICAgICAgICAgICAgYmxhY2tsaXN0ID0geydiYXonfSAgIyBVbmRvY3VtZW50ZWQgbmFtZS4KKyAgICAgICAgICAgICAgIyBiYXIgaW1wb3J0cyBwYXJ0IG9mIGl0cyBBUEkgZnJvbSBfYmFyLgorICAgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBiYXIsICgnYmFyJywgJ19iYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE9ZXh0cmEsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKIFRoZSA6bW9kOmB0ZXN0LnN1cHBvcnRgIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKIAogLi4gY2xhc3M6OiBUcmFuc2llbnRSZXNvdXJjZShleGMsICoqa3dhcmdzKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdGltZS5yc3QgYi9Eb2MvbGlicmFyeS90aW1lLnJzdAppbmRleCBlNjYyNmYyLi43YzgxY2U3IDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90aW1lLnJzdAorKysgYi9Eb2MvbGlicmFyeS90aW1lLnJzdApAQCAtNjM3LDExICs2MzcsMTEgQEAKICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIHJlZmVyIHRvIEZlYnJ1YXJ5IDI5LgogCiAgICAgICA6c2FtcDpgTXttfS57bn0ue2R9YAotICAgICAgICAgVGhlICpkKid0aCBkYXkgKDAgPD0gKmQqIDw9IDYpIG9yIHdlZWsgKm4qIG9mIG1vbnRoICptKiBvZiB0aGUgeWVhciAoMQorICAgICAgICAgVGhlICpkKid0aCBkYXkgKDAgPD0gKmQqIDw9IDYpIG9mIHdlZWsgKm4qIG9mIG1vbnRoICptKiBvZiB0aGUgeWVhciAoMQogICAgICAgICAgPD0gKm4qIDw9IDUsIDEgPD0gKm0qIDw9IDEyLCB3aGVyZSB3ZWVrIDUgbWVhbnMgInRoZSBsYXN0ICpkKiBkYXkgaW4KICAgICAgICAgIG1vbnRoICptKiIgd2hpY2ggbWF5IG9jY3VyIGluIGVpdGhlciB0aGUgZm91cnRoIG9yIHRoZSBmaWZ0aAogICAgICAgICAgd2VlaykuIFdlZWsgMSBpcyB0aGUgZmlyc3Qgd2VlayBpbiB3aGljaCB0aGUgKmQqJ3RoIGRheSBvY2N1cnMuIERheQotICAgICAgICAgemVybyBpcyBTdW5kYXkuCisgICAgICAgICB6ZXJvIGlzIGEgU3VuZGF5LgogCiAgICAgICBgYHRpbWVgYCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIGBgb2Zmc2V0YGAgZXhjZXB0IHRoYXQgbm8gbGVhZGluZyBzaWduCiAgICAgICAoJy0nIG9yICcrJykgaXMgYWxsb3dlZC4gVGhlIGRlZmF1bHQsIGlmIHRpbWUgaXMgbm90IGdpdmVuLCBpcyAwMjowMDowMC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3RyYWNlbWFsbG9jLnJzdCBiL0RvYy9saWJyYXJ5L3RyYWNlbWFsbG9jLnJzdAppbmRleCAzYTBiMWUwLi5mNTZmMjdiIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS90cmFjZW1hbGxvYy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdHJhY2VtYWxsb2MucnN0CkBAIC0zNTksMTAgKzM1OSwzMiBAQAogICAgU2VlIGFsc28gdGhlIDpmdW5jOmBnZXRfb2JqZWN0X3RyYWNlYmFja2AgZnVuY3Rpb24uCiAKIAorRG9tYWluRmlsdGVyCiteXl5eXl5eXl5eXl4KKworLi4gY2xhc3M6OiBEb21haW5GaWx0ZXIoaW5jbHVzaXZlOiBib29sLCBkb21haW46IGludCkKKworICAgRmlsdGVyIHRyYWNlcyBvZiBtZW1vcnkgYmxvY2tzIGJ5IHRoZWlyIGFkZHJlc3Mgc3BhY2UgKGRvbWFpbikuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisgICAuLiBhdHRyaWJ1dGU6OiBpbmNsdXNpdmUKKworICAgICAgSWYgKmluY2x1c2l2ZSogaXMgYGBUcnVlYGAgKGluY2x1ZGUpLCBtYXRjaCBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZAorICAgICAgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgOmF0dHI6YGRvbWFpbmAuCisKKyAgICAgIElmICppbmNsdXNpdmUqIGlzIGBgRmFsc2VgYCAoZXhjbHVkZSksIG1hdGNoIG1lbW9yeSBibG9ja3Mgbm90IGFsbG9jYXRlZAorICAgICAgaW4gdGhlIGFkZHJlc3Mgc3BhY2UgOmF0dHI6YGRvbWFpbmAuCisKKyAgIC4uIGF0dHJpYnV0ZTo6IGRvbWFpbgorCisgICAgICBBZGRyZXNzIHNwYWNlIG9mIGEgbWVtb3J5IGJsb2NrIChgYGludGBgKS4gUmVhZC1vbmx5IHByb3BlcnR5LgorCisKIEZpbHRlcgogXl5eXl5eCiAKLS4uIGNsYXNzOjogRmlsdGVyKGluY2x1c2l2ZTogYm9vbCwgZmlsZW5hbWVfcGF0dGVybjogc3RyLCBsaW5lbm86IGludD1Ob25lLCBhbGxfZnJhbWVzOiBib29sPUZhbHNlKQorLi4gY2xhc3M6OiBGaWx0ZXIoaW5jbHVzaXZlOiBib29sLCBmaWxlbmFtZV9wYXR0ZXJuOiBzdHIsIGxpbmVubzogaW50PU5vbmUsIGFsbF9mcmFtZXM6IGJvb2w9RmFsc2UsIGRvbWFpbjogaW50PU5vbmUpCiAKICAgIEZpbHRlciBvbiB0cmFjZXMgb2YgbWVtb3J5IGJsb2Nrcy4KIApAQCAtMzgyLDkgKzQwNCwxNyBAQAogICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjUKICAgICAgIFRoZSBgYCcucHlvJ2BgIGZpbGUgZXh0ZW5zaW9uIGlzIG5vIGxvbmdlciByZXBsYWNlZCB3aXRoIGBgJy5weSdgYC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIEFkZGVkIHRoZSA6YXR0cjpgZG9tYWluYCBhdHRyaWJ1dGUuCisKKworICAgLi4gYXR0cmlidXRlOjogZG9tYWluCisKKyAgICAgIEFkZHJlc3Mgc3BhY2Ugb2YgYSBtZW1vcnkgYmxvY2sgKGBgaW50YGAgb3IgYGBOb25lYGApLgorCiAgICAuLiBhdHRyaWJ1dGU6OiBpbmNsdXNpdmUKIAotICAgICAgSWYgKmluY2x1c2l2ZSogaXMgYGBUcnVlYGAgKGluY2x1ZGUpLCBvbmx5IHRyYWNlIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkCisgICAgICBJZiAqaW5jbHVzaXZlKiBpcyBgYFRydWVgYCAoaW5jbHVkZSksIG9ubHkgbWF0Y2ggbWVtb3J5IGJsb2NrcyBhbGxvY2F0ZWQKICAgICAgIGluIGEgZmlsZSB3aXRoIGEgbmFtZSBtYXRjaGluZyA6YXR0cjpgZmlsZW5hbWVfcGF0dGVybmAgYXQgbGluZSBudW1iZXIKICAgICAgIDphdHRyOmBsaW5lbm9gLgogCkBAIC0zOTksNyArNDI5LDcgQEAKIAogICAgLi4gYXR0cmlidXRlOjogZmlsZW5hbWVfcGF0dGVybgogCi0gICAgICBGaWxlbmFtZSBwYXR0ZXJuIG9mIHRoZSBmaWx0ZXIgKGBgc3RyYGApLgorICAgICAgRmlsZW5hbWUgcGF0dGVybiBvZiB0aGUgZmlsdGVyIChgYHN0cmBgKS4gUmVhZC1vbmx5IHByb3BlcnR5LgogCiAgICAuLiBhdHRyaWJ1dGU6OiBhbGxfZnJhbWVzCiAKQEAgLTQ2MiwxNCArNDkyLDE3IEBACiAgICAuLiBtZXRob2Q6OiBmaWx0ZXJfdHJhY2VzKGZpbHRlcnMpCiAKICAgICAgIENyZWF0ZSBhIG5ldyA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgZmlsdGVyZWQgOmF0dHI6YHRyYWNlc2AKLSAgICAgIHNlcXVlbmNlLCAqZmlsdGVycyogaXMgYSBsaXN0IG9mIDpjbGFzczpgRmlsdGVyYCBpbnN0YW5jZXMuICBJZiAqZmlsdGVycyoKLSAgICAgIGlzIGFuIGVtcHR5IGxpc3QsIHJldHVybiBhIG5ldyA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgY29weSBvZgotICAgICAgdGhlIHRyYWNlcy4KKyAgICAgIHNlcXVlbmNlLCAqZmlsdGVycyogaXMgYSBsaXN0IG9mIDpjbGFzczpgRG9tYWluRmlsdGVyYCBhbmQKKyAgICAgIDpjbGFzczpgRmlsdGVyYCBpbnN0YW5jZXMuICBJZiAqZmlsdGVycyogaXMgYW4gZW1wdHkgbGlzdCwgcmV0dXJuIGEgbmV3CisgICAgICA6Y2xhc3M6YFNuYXBzaG90YCBpbnN0YW5jZSB3aXRoIGEgY29weSBvZiB0aGUgdHJhY2VzLgogCiAgICAgICBBbGwgaW5jbHVzaXZlIGZpbHRlcnMgYXJlIGFwcGxpZWQgYXQgb25jZSwgYSB0cmFjZSBpcyBpZ25vcmVkIGlmIG5vCiAgICAgICBpbmNsdXNpdmUgZmlsdGVycyBtYXRjaCBpdC4gQSB0cmFjZSBpcyBpZ25vcmVkIGlmIGF0IGxlYXN0IG9uZSBleGNsdXNpdmUKICAgICAgIGZpbHRlciBtYXRjaGVzIGl0LgogCisgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgOmNsYXNzOmBEb21haW5GaWx0ZXJgIGluc3RhbmNlcyBhcmUgbm93IGFsc28gYWNjZXB0ZWQgaW4gKmZpbHRlcnMqLgorCiAKICAgIC4uIGNsYXNzbWV0aG9kOjogbG9hZChmaWxlbmFtZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdHlwaW5nLnJzdCBiL0RvYy9saWJyYXJ5L3R5cGluZy5yc3QKaW5kZXggMzE3MjI5ZC4uOWZhNTQzYyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdHlwaW5nLnJzdAorKysgYi9Eb2MvbGlicmFyeS90eXBpbmcucnN0CkBAIC0zNDcsMTEgKzM0NywxNSBAQAogCiAuLiBjbGFzczo6IEl0ZXJhYmxlKEdlbmVyaWNbVF9jb10pCiAKLSAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiB0aGUgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuSXRlcmFibGVgLgorICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgY29sbGVjdGlvbnMuYWJjLkl0ZXJhYmxlYC4KIAogLi4gY2xhc3M6OiBJdGVyYXRvcihJdGVyYWJsZVtUX2NvXSkKIAotICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIHRoZSA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5JdGVyYXRvcmAuCisgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuSXRlcmF0b3JgLgorCisuLiBjbGFzczo6IFJldmVyc2libGUoSXRlcmFibGVbVF9jb10pCisKKyAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5SZXZlcnNpYmxlYC4KIAogLi4gY2xhc3M6OiBTdXBwb3J0c0ludAogCkBAIC0zNzEsMTEgKzM3NSw2IEBACiAgICAgQW4gQUJDIHdpdGggb25lIGFic3RyYWN0IG1ldGhvZCBgYF9fcm91bmRfX2BgCiAgICAgdGhhdCBpcyBjb3ZhcmlhbnQgaW4gaXRzIHJldHVybiB0eXBlLgogCi0uLiBjbGFzczo6IFJldmVyc2libGUKLQotICAgIEFuIEFCQyB3aXRoIG9uZSBhYnN0cmFjdCBtZXRob2QgYGBfX3JldmVyc2VkX19gYCByZXR1cm5pbmcKLSAgICBhbiBgYEl0ZXJhdG9yW1RfY29dYGAuCi0KIC4uIGNsYXNzOjogQ29udGFpbmVyKEdlbmVyaWNbVF9jb10pCiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5Db250YWluZXJgLgpAQCAtMzk2LDcgKzM5NSw3IEBACiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlTWFwcGluZ2AuCiAKLS4uIGNsYXNzOjogU2VxdWVuY2UoU2l6ZWQsIEl0ZXJhYmxlW1RfY29dLCBDb250YWluZXJbVF9jb10pCisuLiBjbGFzczo6IFNlcXVlbmNlKFNpemVkLCBSZXZlcnNpYmxlW1RfY29dLCBDb250YWluZXJbVF9jb10pCiAKICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiA6Y2xhc3M6YGNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZWAuCiAKQEAgLTQ1MSw2ICs0NTAsMTIgQEAKIAogICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb2xsZWN0aW9ucy5hYmMuVmFsdWVzVmlld2AuCiAKKy4uIGNsYXNzOjogQ29udGV4dE1hbmFnZXIoR2VuZXJpY1tUX2NvXSkKKworICAgQSBnZW5lcmljIHZlcnNpb24gb2YgOmNsYXNzOmBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXJgLgorCisgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKwogLi4gY2xhc3M6OiBEaWN0KGRpY3QsIE11dGFibGVNYXBwaW5nW0tULCBWVF0pCiAKICAgIEEgZ2VuZXJpYyB2ZXJzaW9uIG9mIDpjbGFzczpgZGljdGAuCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS91bml0dGVzdC5tb2NrLnJzdCBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CmluZGV4IDVjOTE3N2EuLmY1NTlkNzEgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CisrKyBiL0RvYy9saWJyYXJ5L3VuaXR0ZXN0Lm1vY2sucnN0CkBAIC0yNjIsNiArMjYyLDM0IEBACiAgICAgdXNlZCB0byBzZXQgYXR0cmlidXRlcyBvbiB0aGUgbW9jayBhZnRlciBpdCBpcyBjcmVhdGVkLiBTZWUgdGhlCiAgICAgOm1ldGg6YGNvbmZpZ3VyZV9tb2NrYCBtZXRob2QgZm9yIGRldGFpbHMuCiAKKyAgICAuLiBtZXRob2Q6OiBhc3NlcnRfY2FsbGVkKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBBc3NlcnQgdGhhdCB0aGUgbW9jayB3YXMgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCisKKyAgICAgICAgICAgID4+PiBtb2NrID0gTW9jaygpCisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QoKQorICAgICAgICAgICAgPE1vY2sgbmFtZT0nbW9jay5tZXRob2QoKScgaWQ9Jy4uLic+CisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QuYXNzZXJ0X2NhbGxlZCgpCisKKyAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKKyAgICAuLiBtZXRob2Q6OiBhc3NlcnRfY2FsbGVkX29uY2UoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIEFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgZXhhY3RseSBvbmNlLgorCisgICAgICAgICAgICA+Pj4gbW9jayA9IE1vY2soKQorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kKCkKKyAgICAgICAgICAgIDxNb2NrIG5hbWU9J21vY2subWV0aG9kKCknIGlkPScuLi4nPgorICAgICAgICAgICAgPj4+IG1vY2subWV0aG9kLmFzc2VydF9jYWxsZWRfb25jZSgpCisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QoKQorICAgICAgICAgICAgPE1vY2sgbmFtZT0nbW9jay5tZXRob2QoKScgaWQ9Jy4uLic+CisgICAgICAgICAgICA+Pj4gbW9jay5tZXRob2QuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKyAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgQXNzZXJ0aW9uRXJyb3I6IEV4cGVjdGVkICdtZXRob2QnIHRvIGhhdmUgYmVlbiBjYWxsZWQgb25jZS4gQ2FsbGVkIDIgdGltZXMuCisKKyAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIAogICAgIC4uIG1ldGhvZDo6IGFzc2VydF9jYWxsZWRfd2l0aCgqYXJncywgKiprd2FyZ3MpCiAKQEAgLTMzOSw3ICszNjcsNyBAQAogICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjUKIAogCi0gICAgLi4gbWV0aG9kOjogcmVzZXRfbW9jaygpCisgICAgLi4gbWV0aG9kOjogcmVzZXRfbW9jaygqLCByZXR1cm5fdmFsdWU9RmFsc2UsIHNpZGVfZWZmZWN0PUZhbHNlKQogCiAgICAgICAgIFRoZSByZXNldF9tb2NrIG1ldGhvZCByZXNldHMgYWxsIHRoZSBjYWxsIGF0dHJpYnV0ZXMgb24gYSBtb2NrIG9iamVjdDoKIApAQCAtMzUxLDEyICszNzksMjAgQEAKICAgICAgICAgICAgID4+PiBtb2NrLmNhbGxlZAogICAgICAgICAgICAgRmFsc2UKIAorICAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgICAgICBBZGRlZCB0d28ga2V5d29yZCBvbmx5IGFyZ3VtZW50IHRvIHRoZSByZXNldF9tb2NrIGZ1bmN0aW9uLgorCiAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVyZSB5b3Ugd2FudCB0byBtYWtlIGEgc2VyaWVzIG9mIGFzc2VydGlvbnMgdGhhdAogICAgICAgICByZXVzZSB0aGUgc2FtZSBvYmplY3QuIE5vdGUgdGhhdCA6bWV0aDpgcmVzZXRfbW9ja2AgKmRvZXNuJ3QqIGNsZWFyIHRoZQogICAgICAgICByZXR1cm4gdmFsdWUsIDphdHRyOmBzaWRlX2VmZmVjdGAgb3IgYW55IGNoaWxkIGF0dHJpYnV0ZXMgeW91IGhhdmUKLSAgICAgICAgc2V0IHVzaW5nIG5vcm1hbCBhc3NpZ25tZW50LiBDaGlsZCBtb2NrcyBhbmQgdGhlIHJldHVybiB2YWx1ZSBtb2NrCisgICAgICAgIHNldCB1c2luZyBub3JtYWwgYXNzaWdubWVudCBieSBkZWZhdWx0LiBJbiBjYXNlIHlvdSB3YW50IHRvIHJlc2V0CisgICAgICAgICpyZXR1cm5fdmFsdWUqIG9yIDphdHRyOmBzaWRlX2VmZmVjdGAsIHRoZW4gcGFzcyB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBwYXJhbWV0ZXIgYXMgYGBUcnVlYGAuIENoaWxkIG1vY2tzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIG1vY2sKICAgICAgICAgKGlmIGFueSkgYXJlIHJlc2V0IGFzIHdlbGwuCiAKKyAgICAgICAgLi4gbm90ZTo6ICpyZXR1cm5fdmFsdWUqLCBhbmQgOmF0dHI6YHNpZGVfZWZmZWN0YCBhcmUga2V5d29yZCBvbmx5CisgICAgICAgICAgICAgICAgICBhcmd1bWVudC4KKwogCiAgICAgLi4gbWV0aG9kOjogbW9ja19hZGRfc3BlYyhzcGVjLCBzcGVjX3NldD1GYWxzZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0IGIvRG9jL2xpYnJhcnkvdW5pdHRlc3QucnN0CmluZGV4IDBmYzAyYzQuLjFkNWY4NjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VuaXR0ZXN0LnJzdAorKysgYi9Eb2MvbGlicmFyeS91bml0dGVzdC5yc3QKQEAgLTEzOTMsOSArMTM5Myw5IEBACiAKICAgICAgIEFkZCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciA6bWV0aDpgdGVhckRvd25gIHRvIGNsZWFudXAgcmVzb3VyY2VzCiAgICAgICB1c2VkIGR1cmluZyB0aGUgdGVzdC4gRnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIGluIHJldmVyc2Ugb3JkZXIgdG8gdGhlCi0gICAgICBvcmRlciB0aGV5IGFyZSBhZGRlZCAoTElGTykuIFRoZXkgYXJlIGNhbGxlZCB3aXRoIGFueSBhcmd1bWVudHMgYW5kCi0gICAgICBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgaW50byA6bWV0aDpgYWRkQ2xlYW51cGAgd2hlbiB0aGV5IGFyZQotICAgICAgYWRkZWQuCisgICAgICBvcmRlciB0aGV5IGFyZSBhZGRlZCAoOmFiYnI6YExJRk8gKGxhc3QtaW4sIGZpcnN0LW91dClgKS4gIFRoZXkKKyAgICAgIGFyZSBjYWxsZWQgd2l0aCBhbnkgYXJndW1lbnRzIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgaW50bworICAgICAgOm1ldGg6YGFkZENsZWFudXBgIHdoZW4gdGhleSBhcmUgYWRkZWQuCiAKICAgICAgIElmIDptZXRoOmBzZXRVcGAgZmFpbHMsIG1lYW5pbmcgdGhhdCA6bWV0aDpgdGVhckRvd25gIGlzIG5vdCBjYWxsZWQsCiAgICAgICB0aGVuIGFueSBjbGVhbnVwIGZ1bmN0aW9ucyBhZGRlZCB3aWxsIHN0aWxsIGJlIGNhbGxlZC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QgYi9Eb2MvbGlicmFyeS91cmxsaWIucGFyc2UucnN0CmluZGV4IGM2ZGUyMzAuLmQ3OWQ4ZjAgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VybGxpYi5wYXJzZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdXJsbGliLnBhcnNlLnJzdApAQCAtMTE0LDggKzExNCw5IEBACiAgICB8ICAgICAgICAgICAgICAgICAgfCAgICAgICB8IGlmIHByZXNlbnQgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwKICAgICstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCi0gICBTZWUgc2VjdGlvbiA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0Ci0gICBvYmplY3QuCisgICBSZWFkaW5nIHRoZSA6YXR0cjpgcG9ydGAgYXR0cmlidXRlIHdpbGwgcmFpc2UgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpZgorICAgYW4gaW52YWxpZCBwb3J0IGlzIHNwZWNpZmllZCBpbiB0aGUgVVJMLiAgU2VlIHNlY3Rpb24KKyAgIDpyZWY6YHVybHBhcnNlLXJlc3VsdC1vYmplY3RgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgogCiAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuMgogICAgICAgQWRkZWQgSVB2NiBVUkwgcGFyc2luZyBjYXBhYmlsaXRpZXMuCkBAIC0xMjUsNiArMTI2LDEwIEBACiAgICAgICBmYWxzZSksIGluIGFjY29yZGFuY2Ugd2l0aCA6cmZjOmAzOTg2YC4gIFByZXZpb3VzbHksIGEgd2hpdGVsaXN0IG9mCiAgICAgICBzY2hlbWVzIHRoYXQgc3VwcG9ydCBmcmFnbWVudHMgZXhpc3RlZC4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIE91dC1vZi1yYW5nZSBwb3J0IG51bWJlcnMgbm93IHJhaXNlIDpleGM6YFZhbHVlRXJyb3JgLCBpbnN0ZWFkIG9mCisgICAgICByZXR1cm5pbmcgOmNvbnN0OmBOb25lYC4KKwogCiAuLiBmdW5jdGlvbjo6IHBhcnNlX3FzKHFzLCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSwgc3RyaWN0X3BhcnNpbmc9RmFsc2UsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0ncmVwbGFjZScpCiAKQEAgLTIyNyw4ICsyMzIsMTMgQEAKICAgIHwgICAgICAgICAgICAgICAgICB8ICAgICAgIHwgaWYgcHJlc2VudCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8CiAgICArLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCi0gICBTZWUgc2VjdGlvbiA6cmVmOmB1cmxwYXJzZS1yZXN1bHQtb2JqZWN0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVzdWx0Ci0gICBvYmplY3QuCisgICBSZWFkaW5nIHRoZSA6YXR0cjpgcG9ydGAgYXR0cmlidXRlIHdpbGwgcmFpc2UgYSA6ZXhjOmBWYWx1ZUVycm9yYCBpZgorICAgYW4gaW52YWxpZCBwb3J0IGlzIHNwZWNpZmllZCBpbiB0aGUgVVJMLiAgU2VlIHNlY3Rpb24KKyAgIDpyZWY6YHVybHBhcnNlLXJlc3VsdC1vYmplY3RgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSByZXN1bHQgb2JqZWN0LgorCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgT3V0LW9mLXJhbmdlIHBvcnQgbnVtYmVycyBub3cgcmFpc2UgOmV4YzpgVmFsdWVFcnJvcmAsIGluc3RlYWQgb2YKKyAgICAgIHJldHVybmluZyA6Y29uc3Q6YE5vbmVgLgogCiAKIC4uIGZ1bmN0aW9uOjogdXJsdW5zcGxpdChwYXJ0cykKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QgYi9Eb2MvbGlicmFyeS91cmxsaWIucm9ib3RwYXJzZXIucnN0CmluZGV4IGJhNzAxYzMuLjdkMzE5MzIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L3VybGxpYi5yb2JvdHBhcnNlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdXJsbGliLnJvYm90cGFyc2VyLnJzdApAQCAtNTcsMTUgKzU3LDQxIEBACiAgICAgICBTZXRzIHRoZSB0aW1lIHRoZSBgYHJvYm90cy50eHRgYCBmaWxlIHdhcyBsYXN0IGZldGNoZWQgdG8gdGhlIGN1cnJlbnQKICAgICAgIHRpbWUuCiAKKyAgIC4uIG1ldGhvZDo6IGNyYXdsX2RlbGF5KHVzZXJhZ2VudCkKIAotVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBiYXNpYyB1c2Ugb2YgdGhlIFJvYm90RmlsZVBhcnNlciBjbGFzcy4KKyAgICAgIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBgYENyYXdsLWRlbGF5YGAgcGFyYW1ldGVyIGZyb20gYGByb2JvdHMudHh0YGAKKyAgICAgIGZvciB0aGUgKnVzZXJhZ2VudCogaW4gcXVlc3Rpb24uICBJZiB0aGVyZSBpcyBubyBzdWNoIHBhcmFtZXRlciBvciBpdAorICAgICAgZG9lc24ndCBhcHBseSB0byB0aGUgKnVzZXJhZ2VudCogc3BlY2lmaWVkIG9yIHRoZSBgYHJvYm90cy50eHRgYCBlbnRyeQorICAgICAgZm9yIHRoaXMgcGFyYW1ldGVyIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIGBgTm9uZWBgLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworICAgLi4gbWV0aG9kOjogcmVxdWVzdF9yYXRlKHVzZXJhZ2VudCkKKworICAgICAgUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhlIGBgUmVxdWVzdC1yYXRlYGAgcGFyYW1ldGVyIGZyb20KKyAgICAgIGBgcm9ib3RzLnR4dGBgIGluIHRoZSBmb3JtIG9mIGEgOmZ1bmM6YH5jb2xsZWN0aW9ucy5uYW1lZHR1cGxlYAorICAgICAgYGAocmVxdWVzdHMsIHNlY29uZHMpYGAuICBJZiB0aGVyZSBpcyBubyBzdWNoIHBhcmFtZXRlciBvciBpdCBkb2Vzbid0CisgICAgICBhcHBseSB0byB0aGUgKnVzZXJhZ2VudCogc3BlY2lmaWVkIG9yIHRoZSBgYHJvYm90cy50eHRgYCBlbnRyeSBmb3IgdGhpcworICAgICAgcGFyYW1ldGVyIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIGBgTm9uZWBgLgorCisgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjYKKworCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGJhc2ljIHVzZSBvZiB0aGUgOmNsYXNzOmBSb2JvdEZpbGVQYXJzZXJgCitjbGFzczo6CiAKICAgID4+PiBpbXBvcnQgdXJsbGliLnJvYm90cGFyc2VyCiAgICA+Pj4gcnAgPSB1cmxsaWIucm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyKCkKICAgID4+PiBycC5zZXRfdXJsKCJodHRwOi8vd3d3Lm11c2ktY2FsLmNvbS9yb2JvdHMudHh0IikKICAgID4+PiBycC5yZWFkKCkKKyAgID4+PiBycmF0ZSA9IHJwLnJlcXVlc3RfcmF0ZSgiKiIpCisgICA+Pj4gcnJhdGUucmVxdWVzdHMKKyAgIDMKKyAgID4+PiBycmF0ZS5zZWNvbmRzCisgICAyMAorICAgPj4+IHJwLmNyYXdsX2RlbGF5KCIqIikKKyAgIDYKICAgID4+PiBycC5jYW5fZmV0Y2goIioiLCAiaHR0cDovL3d3dy5tdXNpLWNhbC5jb20vY2dpLWJpbi9zZWFyY2g/Y2l0eT1TYW4rRnJhbmNpc2NvIikKICAgIEZhbHNlCiAgICA+Pj4gcnAuY2FuX2ZldGNoKCIqIiwgImh0dHA6Ly93d3cubXVzaS1jYWwuY29tLyIpCiAgICBUcnVlCi0KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3ZlbnYucnN0IGIvRG9jL2xpYnJhcnkvdmVudi5yc3QKaW5kZXggYWY0YTZkMS4uMDJlMzZmZCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvdmVudi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvdmVudi5yc3QKQEAgLTMxLDQ0ICszMSw1MCBAQAogCiAuLiBfdmVudi1kZWY6CiAKLS4uIG5vdGU6OiBBIHZpcnR1YWwgZW52aXJvbm1lbnQgKGFsc28gY2FsbGVkIGEgYGB2ZW52YGApIGlzIGEgUHl0aG9uCi0gICBlbnZpcm9ubWVudCBzdWNoIHRoYXQgdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgbGlicmFyaWVzIGFuZCBzY3JpcHRzCi0gICBpbnN0YWxsZWQgaW50byBpdCBhcmUgaXNvbGF0ZWQgZnJvbSB0aG9zZSBpbnN0YWxsZWQgaW4gb3RoZXIgdmlydHVhbAotICAgZW52aXJvbm1lbnRzLCBhbmQgKGJ5IGRlZmF1bHQpIGFueSBsaWJyYXJpZXMgaW5zdGFsbGVkIGluIGEgInN5c3RlbSIgUHl0aG9uLAotICAgaS5lLiBvbmUgd2hpY2ggaXMgaW5zdGFsbGVkIGFzIHBhcnQgb2YgeW91ciBvcGVyYXRpbmcgc3lzdGVtLgorLi4gbm90ZTo6IEEgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBhIFB5dGhvbiBlbnZpcm9ubWVudCBzdWNoIHRoYXQgdGhlIFB5dGhvbgorICAgaW50ZXJwcmV0ZXIsIGxpYnJhcmllcyBhbmQgc2NyaXB0cyBpbnN0YWxsZWQgaW50byBpdCBhcmUgaXNvbGF0ZWQgZnJvbSB0aG9zZQorICAgaW5zdGFsbGVkIGluIG90aGVyIHZpcnR1YWwgZW52aXJvbm1lbnRzLCBhbmQgKGJ5IGRlZmF1bHQpIGFueSBsaWJyYXJpZXMKKyAgIGluc3RhbGxlZCBpbiBhICJzeXN0ZW0iIFB5dGhvbiwgaS5lLiwgb25lIHdoaWNoIGlzIGluc3RhbGxlZCBhcyBwYXJ0IG9mIHlvdXIKKyAgIG9wZXJhdGluZyBzeXN0ZW0uCiAKLSAgIEEgdmVudiBpcyBhIGRpcmVjdG9yeSB0cmVlIHdoaWNoIGNvbnRhaW5zIFB5dGhvbiBleGVjdXRhYmxlIGZpbGVzIGFuZAotICAgb3RoZXIgZmlsZXMgd2hpY2ggaW5kaWNhdGUgdGhhdCBpdCBpcyBhIHZlbnYuCisgICBBIHZpcnR1YWwgZW52aXJvbm1lbnQgaXMgYSBkaXJlY3RvcnkgdHJlZSB3aGljaCBjb250YWlucyBQeXRob24gZXhlY3V0YWJsZQorICAgZmlsZXMgYW5kIG90aGVyIGZpbGVzIHdoaWNoIGluZGljYXRlIHRoYXQgaXQgaXMgYSB2aXJ0dWFsIGVudmlyb25tZW50LgogCiAgICBDb21tb24gaW5zdGFsbGF0aW9uIHRvb2xzIHN1Y2ggYXMgYGBTZXR1cHRvb2xzYGAgYW5kIGBgcGlwYGAgd29yayBhcwotICAgZXhwZWN0ZWQgd2l0aCB2ZW52cyAtIGkuZS4gd2hlbiBhIHZlbnYgaXMgYWN0aXZlLCB0aGV5IGluc3RhbGwgUHl0aG9uCi0gICBwYWNrYWdlcyBpbnRvIHRoZSB2ZW52IHdpdGhvdXQgbmVlZGluZyB0byBiZSB0b2xkIHRvIGRvIHNvIGV4cGxpY2l0bHkuCisgICBleHBlY3RlZCB3aXRoIHZpcnR1YWwgZW52aXJvbm1lbnRzLiBJbiBvdGhlciB3b3Jkcywgd2hlbiBhIHZpcnR1YWwKKyAgIGVudmlyb25tZW50IGlzIGFjdGl2ZSwgdGhleSBpbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyBpbnRvIHRoZSB2aXJ0dWFsCisgICBlbnZpcm9ubWVudCB3aXRob3V0IG5lZWRpbmcgdG8gYmUgdG9sZCB0byBkbyBzbyBleHBsaWNpdGx5LgogCi0gICBXaGVuIGEgdmVudiBpcyBhY3RpdmUgKGkuZS4gdGhlIHZlbnYncyBQeXRob24gaW50ZXJwcmV0ZXIgaXMgcnVubmluZyksIHRoZQotICAgYXR0cmlidXRlcyA6YXR0cjpgc3lzLnByZWZpeGAgYW5kIDphdHRyOmBzeXMuZXhlY19wcmVmaXhgIHBvaW50IHRvIHRoZSBiYXNlCi0gICBkaXJlY3Rvcnkgb2YgdGhlIHZlbnYsIHdoZXJlYXMgOmF0dHI6YHN5cy5iYXNlX3ByZWZpeGAgYW5kCi0gICA6YXR0cjpgc3lzLmJhc2VfZXhlY19wcmVmaXhgIHBvaW50IHRvIHRoZSBub24tdmVudiBQeXRob24gaW5zdGFsbGF0aW9uCi0gICB3aGljaCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIHZlbnYuIElmIGEgdmVudiBpcyBub3QgYWN0aXZlLCB0aGVuCi0gICA6YXR0cjpgc3lzLnByZWZpeGAgaXMgdGhlIHNhbWUgYXMgOmF0dHI6YHN5cy5iYXNlX3ByZWZpeGAgYW5kCi0gICA6YXR0cjpgc3lzLmV4ZWNfcHJlZml4YCBpcyB0aGUgc2FtZSBhcyA6YXR0cjpgc3lzLmJhc2VfZXhlY19wcmVmaXhgICh0aGV5Ci0gICBhbGwgcG9pbnQgdG8gYSBub24tdmVudiBQeXRob24gaW5zdGFsbGF0aW9uKS4KKyAgIFdoZW4gYSB2aXJ0dWFsIGVudmlyb25tZW50IGlzIGFjdGl2ZSAoaS5lLiwgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQncyBQeXRob24KKyAgIGludGVycHJldGVyIGlzIHJ1bm5pbmcpLCB0aGUgYXR0cmlidXRlcyA6YXR0cjpgc3lzLnByZWZpeGAgYW5kCisgICA6YXR0cjpgc3lzLmV4ZWNfcHJlZml4YCBwb2ludCB0byB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHZpcnR1YWwKKyAgIGVudmlyb25tZW50LCB3aGVyZWFzIDphdHRyOmBzeXMuYmFzZV9wcmVmaXhgIGFuZAorICAgOmF0dHI6YHN5cy5iYXNlX2V4ZWNfcHJlZml4YCBwb2ludCB0byB0aGUgbm9uLXZpcnR1YWwgZW52aXJvbm1lbnQgUHl0aG9uCisgICBpbnN0YWxsYXRpb24gd2hpY2ggd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LiBJZiBhIHZpcnR1YWwKKyAgIGVudmlyb25tZW50IGlzIG5vdCBhY3RpdmUsIHRoZW4gOmF0dHI6YHN5cy5wcmVmaXhgIGlzIHRoZSBzYW1lIGFzCisgICA6YXR0cjpgc3lzLmJhc2VfcHJlZml4YCBhbmQgOmF0dHI6YHN5cy5leGVjX3ByZWZpeGAgaXMgdGhlIHNhbWUgYXMKKyAgIDphdHRyOmBzeXMuYmFzZV9leGVjX3ByZWZpeGAgKHRoZXkgYWxsIHBvaW50IHRvIGEgbm9uLXZpcnR1YWwgZW52aXJvbm1lbnQKKyAgIFB5dGhvbiBpbnN0YWxsYXRpb24pLgogCi0gICBXaGVuIGEgdmVudiBpcyBhY3RpdmUsIGFueSBvcHRpb25zIHRoYXQgY2hhbmdlIHRoZSBpbnN0YWxsYXRpb24gcGF0aCB3aWxsIGJlCi0gICBpZ25vcmVkIGZyb20gYWxsIGRpc3R1dGlscyBjb25maWd1cmF0aW9uIGZpbGVzIHRvIHByZXZlbnQgcHJvamVjdHMgYmVpbmcKLSAgIGluYWR2ZXJ0ZW50bHkgaW5zdGFsbGVkIG91dHNpZGUgb2YgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuCisgICBXaGVuIGEgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBhY3RpdmUsIGFueSBvcHRpb25zIHRoYXQgY2hhbmdlIHRoZQorICAgaW5zdGFsbGF0aW9uIHBhdGggd2lsbCBiZSBpZ25vcmVkIGZyb20gYWxsIGRpc3R1dGlscyBjb25maWd1cmF0aW9uIGZpbGVzIHRvCisgICBwcmV2ZW50IHByb2plY3RzIGJlaW5nIGluYWR2ZXJ0ZW50bHkgaW5zdGFsbGVkIG91dHNpZGUgb2YgdGhlIHZpcnR1YWwKKyAgIGVudmlyb25tZW50LgogCi0gICBXaGVuIHdvcmtpbmcgaW4gYSBjb21tYW5kIHNoZWxsLCB1c2VycyBjYW4gbWFrZSBhIHZlbnYgYWN0aXZlIGJ5IHJ1bm5pbmcgYW4KLSAgIGBgYWN0aXZhdGVgYCBzY3JpcHQgaW4gdGhlIHZlbnYncyBleGVjdXRhYmxlcyBkaXJlY3RvcnkgKHRoZSBwcmVjaXNlIGZpbGVuYW1lCi0gICBpcyBzaGVsbC1kZXBlbmRlbnQpLCB3aGljaCBwcmVwZW5kcyB0aGUgdmVudidzIGRpcmVjdG9yeSBmb3IgZXhlY3V0YWJsZXMgdG8KLSAgIHRoZSBgYFBBVEhgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgdGhlIHJ1bm5pbmcgc2hlbGwuIFRoZXJlIHNob3VsZCBiZSBubwotICAgbmVlZCBpbiBvdGhlciBjaXJjdW1zdGFuY2VzIHRvIGFjdGl2YXRlIGEgdmVudiAtLSBzY3JpcHRzIGluc3RhbGxlZCBpbnRvCi0gICB2ZW52cyBoYXZlIGEgc2hlYmFuZyBsaW5lIHdoaWNoIHBvaW50cyB0byB0aGUgdmVudidzIFB5dGhvbiBpbnRlcnByZXRlci4gVGhpcwotICAgbWVhbnMgdGhhdCB0aGUgc2NyaXB0IHdpbGwgcnVuIHdpdGggdGhhdCBpbnRlcnByZXRlciByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZQotICAgb2YgYGBQQVRIYGAuIE9uIFdpbmRvd3MsIHNoZWJhbmcgbGluZSBwcm9jZXNzaW5nIGlzIHN1cHBvcnRlZCBpZiB5b3UgaGF2ZSB0aGUKLSAgIFB5dGhvbiBMYXVuY2hlciBmb3IgV2luZG93cyBpbnN0YWxsZWQgKHRoaXMgd2FzIGFkZGVkIHRvIFB5dGhvbiBpbiAzLjMgLSBzZWUKLSAgIDpwZXA6YDM5N2AgZm9yIG1vcmUgZGV0YWlscykuIFRodXMsIGRvdWJsZS1jbGlja2luZyBhbiBpbnN0YWxsZWQgc2NyaXB0IGluCi0gICBhIFdpbmRvd3MgRXhwbG9yZXIgd2luZG93IHNob3VsZCBydW4gdGhlIHNjcmlwdCB3aXRoIHRoZSBjb3JyZWN0IGludGVycHJldGVyCi0gICB3aXRob3V0IHRoZXJlIG5lZWRpbmcgdG8gYmUgYW55IHJlZmVyZW5jZSB0byBpdHMgdmVudiBpbiBgYFBBVEhgYC4KKyAgIFdoZW4gd29ya2luZyBpbiBhIGNvbW1hbmQgc2hlbGwsIHVzZXJzIGNhbiBtYWtlIGEgdmlydHVhbCBlbnZpcm9ubWVudCBhY3RpdmUKKyAgIGJ5IHJ1bm5pbmcgYW4gYGBhY3RpdmF0ZWBgIHNjcmlwdCBpbiB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCdzIGV4ZWN1dGFibGVzCisgICBkaXJlY3RvcnkgKHRoZSBwcmVjaXNlIGZpbGVuYW1lIGlzIHNoZWxsLWRlcGVuZGVudCksIHdoaWNoIHByZXBlbmRzIHRoZQorICAgdmlydHVhbCBlbnZpcm9ubWVudCdzIGRpcmVjdG9yeSBmb3IgZXhlY3V0YWJsZXMgdG8gdGhlIGBgUEFUSGBgIGVudmlyb25tZW50CisgICB2YXJpYWJsZSBmb3IgdGhlIHJ1bm5pbmcgc2hlbGwuIFRoZXJlIHNob3VsZCBiZSBubyBuZWVkIGluIG90aGVyCisgICBjaXJjdW1zdGFuY2VzIHRvIGFjdGl2YXRlIGEgdmlydHVhbCBlbnZpcm9ubWVudOKAlHNjcmlwdHMgaW5zdGFsbGVkIGludG8KKyAgIHZpcnR1YWwgZW52aXJvbm1lbnRzIGhhdmUgYSAic2hlYmFuZyIgbGluZSB3aGljaCBwb2ludHMgdG8gdGhlIHZpcnR1YWwKKyAgIGVudmlyb25tZW50J3MgUHl0aG9uIGludGVycHJldGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHNjcmlwdCB3aWxsIHJ1biB3aXRoCisgICB0aGF0IGludGVycHJldGVyIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIGBgUEFUSGBgLiBPbiBXaW5kb3dzLCAic2hlYmFuZyIKKyAgIGxpbmUgcHJvY2Vzc2luZyBpcyBzdXBwb3J0ZWQgaWYgeW91IGhhdmUgdGhlIFB5dGhvbiBMYXVuY2hlciBmb3IgV2luZG93cworICAgaW5zdGFsbGVkICh0aGlzIHdhcyBhZGRlZCB0byBQeXRob24gaW4gMy4zIC0gc2VlIDpwZXA6YDM5N2AgZm9yIG1vcmUKKyAgIGRldGFpbHMpLiBUaHVzLCBkb3VibGUtY2xpY2tpbmcgYW4gaW5zdGFsbGVkIHNjcmlwdCBpbiBhIFdpbmRvd3MgRXhwbG9yZXIKKyAgIHdpbmRvdyBzaG91bGQgcnVuIHRoZSBzY3JpcHQgd2l0aCB0aGUgY29ycmVjdCBpbnRlcnByZXRlciB3aXRob3V0IHRoZXJlCisgICBuZWVkaW5nIHRvIGJlIGFueSByZWZlcmVuY2UgdG8gaXRzIHZpcnR1YWwgZW52aXJvbm1lbnQgaW4gYGBQQVRIYGAuCiAKIAogLi4gX3ZlbnYtYXBpOgpAQCAtMjE5LDcgKzIyNSw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgZm9sbG93aW5nIHNjcmlwdCBzaG93cyBob3cgdG8gZXh0ZW5kIDpjbGFzczpgRW52QnVpbGRlcmAgYnkgaW1wbGVtZW50aW5nIGEKLXN1YmNsYXNzIHdoaWNoIGluc3RhbGxzIHNldHVwdG9vbHMgYW5kIHBpcCBpbnRvIGEgY3JlYXRlZCB2ZW52OjoKK3N1YmNsYXNzIHdoaWNoIGluc3RhbGxzIHNldHVwdG9vbHMgYW5kIHBpcCBpbnRvIGEgY3JlYXRlZCB2aXJ0dWFsIGVudmlyb25tZW50OjoKIAogICAgIGltcG9ydCBvcwogICAgIGltcG9ydCBvcy5wYXRoCkBAIC0yMzMsMTIgKzIzOSwxMiBAQAogICAgIGNsYXNzIEV4dGVuZGVkRW52QnVpbGRlcih2ZW52LkVudkJ1aWxkZXIpOgogICAgICAgICAiIiIKICAgICAgICAgVGhpcyBidWlsZGVyIGluc3RhbGxzIHNldHVwdG9vbHMgYW5kIHBpcCBzbyB0aGF0IHlvdSBjYW4gcGlwIG9yCi0gICAgICAgIGVhc3lfaW5zdGFsbCBvdGhlciBwYWNrYWdlcyBpbnRvIHRoZSBjcmVhdGVkIGVudmlyb25tZW50LgorICAgICAgICBlYXN5X2luc3RhbGwgb3RoZXIgcGFja2FnZXMgaW50byB0aGUgY3JlYXRlZCB2aXJ0dWFsIGVudmlyb25tZW50LgogCiAgICAgICAgIDpwYXJhbSBub2Rpc3Q6IElmIFRydWUsIHNldHVwdG9vbHMgYW5kIHBpcCBhcmUgbm90IGluc3RhbGxlZCBpbnRvIHRoZQotICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIHZpcnR1YWwgZW52aXJvbm1lbnQuCiAgICAgICAgIDpwYXJhbSBub3BpcDogSWYgVHJ1ZSwgcGlwIGlzIG5vdCBpbnN0YWxsZWQgaW50byB0aGUgY3JlYXRlZAotICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50LgorICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgZW52aXJvbm1lbnQuCiAgICAgICAgIDpwYXJhbSBwcm9ncmVzczogSWYgc2V0dXB0b29scyBvciBwaXAgYXJlIGluc3RhbGxlZCwgdGhlIHByb2dyZXNzIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxhdGlvbiBjYW4gYmUgbW9uaXRvcmVkIGJ5IHBhc3NpbmcgYSBwcm9ncmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlLiBJZiBzcGVjaWZpZWQsIGl0IGlzIGNhbGxlZCB3aXRoIHR3bwpAQCAtMjY0LDEwICsyNzAsMTAgQEAKICAgICAgICAgZGVmIHBvc3Rfc2V0dXAoc2VsZiwgY29udGV4dCk6CiAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgIFNldCB1cCBhbnkgcGFja2FnZXMgd2hpY2ggbmVlZCB0byBiZSBwcmUtaW5zdGFsbGVkIGludG8gdGhlCi0gICAgICAgICAgICBlbnZpcm9ubWVudCBiZWluZyBjcmVhdGVkLgorICAgICAgICAgICAgdmlydHVhbCBlbnZpcm9ubWVudCBiZWluZyBjcmVhdGVkLgogCi0gICAgICAgICAgICA6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZW52aXJvbm1lbnQgY3JlYXRpb24gcmVxdWVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgICAgICAgIDpwYXJhbSBjb250ZXh0OiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgIG9zLmVudmlyb25bJ1ZJUlRVQUxfRU5WJ10gPSBjb250ZXh0LmVudl9kaXIKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLm5vZGlzdDoKQEAgLTMwMSw3ICszMDcsNyBAQAogICAgICAgICAgICAgZm4gPSBvcy5wYXRoLnNwbGl0KHBhdGgpWy0xXQogICAgICAgICAgICAgYmlucGF0aCA9IGNvbnRleHQuYmluX3BhdGgKICAgICAgICAgICAgIGRpc3RwYXRoID0gb3MucGF0aC5qb2luKGJpbnBhdGgsIGZuKQotICAgICAgICAgICAgIyBEb3dubG9hZCBzY3JpcHQgaW50byB0aGUgZW52J3MgYmluYXJpZXMgZm9sZGVyCisgICAgICAgICAgICAjIERvd25sb2FkIHNjcmlwdCBpbnRvIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50J3MgYmluYXJpZXMgZm9sZGVyCiAgICAgICAgICAgICB1cmxyZXRyaWV2ZSh1cmwsIGRpc3RwYXRoKQogICAgICAgICAgICAgcHJvZ3Jlc3MgPSBzZWxmLnByb2dyZXNzCiAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CkBAIC0zMTMsNyArMzE5LDcgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnSW5zdGFsbGluZyAlcyAuLi4lcycgJSAobmFtZSwgdGVybSkpCiAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgICAgICAgICAjIEluc3RhbGwgaW4gdGhlIGVudgorICAgICAgICAgICAgIyBJbnN0YWxsIGluIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50CiAgICAgICAgICAgICBhcmdzID0gW2NvbnRleHQuZW52X2V4ZSwgZm5dCiAgICAgICAgICAgICBwID0gUG9wZW4oYXJncywgc3Rkb3V0PVBJUEUsIHN0ZGVycj1QSVBFLCBjd2Q9YmlucGF0aCkKICAgICAgICAgICAgIHQxID0gVGhyZWFkKHRhcmdldD1zZWxmLnJlYWRlciwgYXJncz0ocC5zdGRvdXQsICdzdGRvdXQnKSkKQEAgLTMzMiwxMCArMzM4LDEwIEBACiAKICAgICAgICAgZGVmIGluc3RhbGxfc2V0dXB0b29scyhzZWxmLCBjb250ZXh0KToKICAgICAgICAgICAgICIiIgotICAgICAgICAgICAgSW5zdGFsbCBzZXR1cHRvb2xzIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgIEluc3RhbGwgc2V0dXB0b29scyBpbiB0aGUgdmlydHVhbCBlbnZpcm9ubWVudC4KIAotICAgICAgICAgICAgOnBhcmFtIGNvbnRleHQ6IFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGVudmlyb25tZW50IGNyZWF0aW9uIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBwcm9jZXNzZWQuCisgICAgICAgICAgICA6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgdmlydHVhbCBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uIHJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkLgogICAgICAgICAgICAgIiIiCiAgICAgICAgICAgICB1cmwgPSAnaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvc2V0dXB0b29scy9kb3dubG9hZHMvZXpfc2V0dXAucHknCiAgICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0KGNvbnRleHQsICdzZXR1cHRvb2xzJywgdXJsKQpAQCAtMzQ4LDEwICszNTQsMTAgQEAKIAogICAgICAgICBkZWYgaW5zdGFsbF9waXAoc2VsZiwgY29udGV4dCk6CiAgICAgICAgICAgICAiIiIKLSAgICAgICAgICAgIEluc3RhbGwgcGlwIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgIEluc3RhbGwgcGlwIGluIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50LgogCi0gICAgICAgICAgICA6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZW52aXJvbm1lbnQgY3JlYXRpb24gcmVxdWVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgICAgICAgIDpwYXJhbSBjb250ZXh0OiBUaGUgaW5mb3JtYXRpb24gZm9yIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24gcmVxdWVzdCBiZWluZyBwcm9jZXNzZWQuCiAgICAgICAgICAgICAiIiIKICAgICAgICAgICAgIHVybCA9ICdodHRwczovL3Jhdy5naXRodWIuY29tL3B5cGEvcGlwL21hc3Rlci9jb250cmliL2dldC1waXAucHknCiAgICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0KGNvbnRleHQsICdwaXAnLCB1cmwpCkBAIC0zNzQsNyArMzgwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb3JlIHRhcmdldCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlyZWN0b3JpZXMuJykKICAgICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2RpcnMnLCBtZXRhdmFyPSdFTlZfRElSJywgbmFyZ3M9JysnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdBIGRpcmVjdG9yeSB0byBjcmVhdGUgdGhlIGVudmlyb25tZW50IGluLicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0EgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlydHVhbCBlbnZpcm9ubWVudC4nKQogICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uby1zZXR1cHRvb2xzJywgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nbm9kaXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRG9uJ3QgaW5zdGFsbCBzZXR1cHRvb2xzIG9yIHBpcCBpbiB0aGUgIgpAQCAtMzk4LDE0ICs0MDUsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIHBsYXRmb3JtLicpCiAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNsZWFyJywgZGVmYXVsdD1GYWxzZSwgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0nY2xlYXInLCBoZWxwPSdEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgZGlyZWN0b3J5IGlmIGl0ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbHJlYWR5IGV4aXN0cywgYmVmb3JlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aXJ0dWFsIGVudmlyb25tZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXJlY3RvcnkgaWYgaXQgYWxyZWFkeSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhpc3RzLCBiZWZvcmUgdmlydHVhbCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgY3JlYXRpb24uJykKICAgICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdXBncmFkZScsIGRlZmF1bHQ9RmFsc2UsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VwZ3JhZGUnLCBoZWxwPSdVcGdyYWRlIHRoZSBlbnZpcm9ubWVudCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlyZWN0b3J5IHRvIHVzZSB0aGlzIHZlcnNpb24gJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIFB5dGhvbiwgYXNzdW1pbmcgUHl0aG9uICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiB1cGdyYWRlZCBpbi1wbGFjZS4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd1cGdyYWRlJywgaGVscD0nVXBncmFkZSB0aGUgdmlydHVhbCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbnZpcm9ubWVudCBkaXJlY3RvcnkgdG8gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIHRoaXMgdmVyc2lvbiBvZiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQeXRob24sIGFzc3VtaW5nIFB5dGhvbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiB1cGdyYWRlZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbi1wbGFjZS4nKQogICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywgZGVmYXVsdD1GYWxzZSwgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ndmVyYm9zZScsIGhlbHA9J0Rpc3BsYXkgdGhlIG91dHB1dCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSB0aGUgc2NyaXB0cyB3aGljaCAnCmRpZmYgLS1naXQgYS9Eb2MvbGlicmFyeS93YXJuaW5ncy5yc3QgYi9Eb2MvbGlicmFyeS93YXJuaW5ncy5yc3QKaW5kZXggNTIxMjEzMS4uZmE0Nzk2NSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvd2FybmluZ3MucnN0CisrKyBiL0RvYy9saWJyYXJ5L3dhcm5pbmdzLnJzdApAQCAtMzAwLDcgKzMwMCw3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAotLi4gZnVuY3Rpb246OiB3YXJuKG1lc3NhZ2UsIGNhdGVnb3J5PU5vbmUsIHN0YWNrbGV2ZWw9MSkKKy4uIGZ1bmN0aW9uOjogd2FybihtZXNzYWdlLCBjYXRlZ29yeT1Ob25lLCBzdGFja2xldmVsPTEsIHNvdXJjZT1Ob25lKQogCiAgICBJc3N1ZSBhIHdhcm5pbmcsIG9yIG1heWJlIGlnbm9yZSBpdCBvciByYWlzZSBhbiBleGNlcHRpb24uICBUaGUgKmNhdGVnb3J5KgogICAgYXJndW1lbnQsIGlmIGdpdmVuLCBtdXN0IGJlIGEgd2FybmluZyBjYXRlZ29yeSBjbGFzcyAoc2VlIGFib3ZlKTsgaXQgZGVmYXVsdHMgdG8KQEAgLTMxOCw4ICszMTgsMTQgQEAKICAgIHNvdXJjZSBvZiA6ZnVuYzpgZGVwcmVjYXRpb25gIGl0c2VsZiAoc2luY2UgdGhlIGxhdHRlciB3b3VsZCBkZWZlYXQgdGhlIHB1cnBvc2UKICAgIG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2UpLgogCisgICAqc291cmNlKiwgaWYgc3VwcGxpZWQsIGlzIHRoZSBkZXN0cm95ZWQgb2JqZWN0IHdoaWNoIGVtaXR0ZWQgYQorICAgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYC4KIAotLi4gZnVuY3Rpb246OiB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGU9Tm9uZSwgcmVnaXN0cnk9Tm9uZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSkKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGRlZCAqc291cmNlKiBwYXJhbWV0ZXIuCisKKworLi4gZnVuY3Rpb246OiB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGU9Tm9uZSwgcmVnaXN0cnk9Tm9uZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSwgc291cmNlPU5vbmUpCiAKICAgIFRoaXMgaXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBmdW5jdGlvbmFsaXR5IG9mIDpmdW5jOmB3YXJuYCwgcGFzc2luZyBpbgogICAgZXhwbGljaXRseSB0aGUgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lIGFuZCBsaW5lIG51bWJlciwgYW5kIG9wdGlvbmFsbHkgdGhlCkBAIC0zMzUsNiArMzQxLDEyIEBACiAgICBzb3VyY2UgZm9yIG1vZHVsZXMgZm91bmQgaW4gemlwZmlsZXMgb3Igb3RoZXIgbm9uLWZpbGVzeXN0ZW0gaW1wb3J0CiAgICBzb3VyY2VzKS4KIAorICAgKnNvdXJjZSosIGlmIHN1cHBsaWVkLCBpcyB0aGUgZGVzdHJveWVkIG9iamVjdCB3aGljaCBlbWl0dGVkIGEKKyAgIDpleGM6YFJlc291cmNlV2FybmluZ2AuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBBZGQgdGhlICpzb3VyY2UqIHBhcmFtZXRlci4KKwogCiAuLiBmdW5jdGlvbjo6IHNob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsIGxpbmU9Tm9uZSkKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvd2lucmVnLnJzdCBiL0RvYy9saWJyYXJ5L3dpbnJlZy5yc3QKaW5kZXggNTJkNTkxYS4uNDhiZGYxNCAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvd2lucmVnLnJzdAorKysgYi9Eb2MvbGlicmFyeS93aW5yZWcucnN0CkBAIC02MzUsNyArNjM1LDcgQEAKIAogLi4gZGF0YTo6IFJFR19EV09SRF9MSVRUTEVfRU5ESUFOCiAKLSAgIEEgMzItYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAgIEEgMzItYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gRXF1aXZhbGVudCB0byA6Y29uc3Q6YFJFR19EV09SRGAuCiAKIC4uIGRhdGE6OiBSRUdfRFdPUkRfQklHX0VORElBTgogCkBAIC02NTksNiArNjU5LDE4IEBACiAKICAgIE5vIGRlZmluZWQgdmFsdWUgdHlwZS4KIAorLi4gZGF0YTo6IFJFR19RV09SRAorCisgICBBIDY0LWJpdCBudW1iZXIuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisuLiBkYXRhOjogUkVHX1FXT1JEX0xJVFRMRV9FTkRJQU4KKworICAgQSA2NC1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBFcXVpdmFsZW50IHRvIDpjb25zdDpgUkVHX1FXT1JEYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKIC4uIGRhdGE6OiBSRUdfUkVTT1VSQ0VfTElTVAogCiAgICBBIGRldmljZS1kcml2ZXIgcmVzb3VyY2UgbGlzdC4KZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3dzZ2lyZWYucnN0IGIvRG9jL2xpYnJhcnkvd3NnaXJlZi5yc3QKaW5kZXggYWFkMjdhOC4uYTFkNDQ2OSAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvd3NnaXJlZi5yc3QKKysrIGIvRG9jL2xpYnJhcnkvd3NnaXJlZi5yc3QKQEAgLTEzMyw5ICsxMzMsOSBAQAogICAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBlbnZpcm9uLml0ZW1zKCldCiAgICAgICAgICAgcmV0dXJuIHJldAogCi0gICAgICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBzaW1wbGVfYXBwKQotICAgICAgcHJpbnQoIlNlcnZpbmcgb24gcG9ydCA4MDAwLi4uIikKLSAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgc2ltcGxlX2FwcCkgYXMgaHR0cGQ6CisgICAgICAgICAgcHJpbnQoIlNlcnZpbmcgb24gcG9ydCA4MDAwLi4uIikKKyAgICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKIAogCiBJbiBhZGRpdGlvbiB0byB0aGUgZW52aXJvbm1lbnQgZnVuY3Rpb25zIGFib3ZlLCB0aGUgOm1vZDpgd3NnaXJlZi51dGlsYCBtb2R1bGUKQEAgLTI4NSwxNCArMjg1LDE0IEBACiAKICAgICAgIGZyb20gd3NnaXJlZi5zaW1wbGVfc2VydmVyIGltcG9ydCBtYWtlX3NlcnZlciwgZGVtb19hcHAKIAotICAgICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApCi0gICAgICBwcmludCgiU2VydmluZyBIVFRQIG9uIHBvcnQgODAwMC4uLiIpCisgICAgICB3aXRoIG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkgYXMgaHR0cGQ6CisgICAgICAgICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiBwb3J0IDgwMDAuLi4iKQogCi0gICAgICAjIFJlc3BvbmQgdG8gcmVxdWVzdHMgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKLSAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICAgICMgUmVzcG9uZCB0byByZXF1ZXN0cyB1bnRpbCBwcm9jZXNzIGlzIGtpbGxlZAorICAgICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQogCi0gICAgICAjIEFsdGVybmF0aXZlOiBzZXJ2ZSBvbmUgcmVxdWVzdCwgdGhlbiBleGl0Ci0gICAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgICAgIyBBbHRlcm5hdGl2ZTogc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAorICAgICAgICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkKIAogCiAuLiBmdW5jdGlvbjo6IGRlbW9fYXBwKGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlKQpAQCAtNDMyLDkgKzQzMiw5IEBACiAgICAgICAjIFRoaXMgaXMgdGhlIGFwcGxpY2F0aW9uIHdyYXBwZWQgaW4gYSB2YWxpZGF0b3IKICAgICAgIHZhbGlkYXRvcl9hcHAgPSB2YWxpZGF0b3Ioc2ltcGxlX2FwcCkKIAotICAgICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgdmFsaWRhdG9yX2FwcCkKLSAgICAgIHByaW50KCJMaXN0ZW5pbmcgb24gcG9ydCA4MDAwLi4uLiIpCi0gICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgIHdpdGggbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIHZhbGlkYXRvcl9hcHApIGFzIGh0dHBkOgorICAgICAgICAgIHByaW50KCJMaXN0ZW5pbmcgb24gcG9ydCA4MDAwLi4uLiIpCisgICAgICAgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCiAKIAogOm1vZDpgd3NnaXJlZi5oYW5kbGVyc2AgLS0gc2VydmVyL2dhdGV3YXkgYmFzZSBjbGFzc2VzCkBAIC03NzQsOCArNzc0LDggQEAKICAgICAgICAjIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgZ29pbmcgdG8gYmUgcHJpbnRlZAogICAgICAgIHJldHVybiBbYiJIZWxsbyBXb3JsZCJdCiAKLSAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGhlbGxvX3dvcmxkX2FwcCkKLSAgIHByaW50KCJTZXJ2aW5nIG9uIHBvcnQgODAwMC4uLiIpCisgICB3aXRoIG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBoZWxsb193b3JsZF9hcHApIGFzIGh0dHBkOgorICAgICAgIHByaW50KCJTZXJ2aW5nIG9uIHBvcnQgODAwMC4uLiIpCiAKLSAgICMgU2VydmUgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKLSAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICMgU2VydmUgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKKyAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3htbHJwYy5zZXJ2ZXIucnN0IGIvRG9jL2xpYnJhcnkveG1scnBjLnNlcnZlci5yc3QKaW5kZXggMWM3N2U4NC4uMDUxMWRkZiAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkveG1scnBjLnNlcnZlci5yc3QKKysrIGIvRG9jL2xpYnJhcnkveG1scnBjLnNlcnZlci5yc3QKQEAgLTE0OCwyOSArMTQ4LDI5IEBACiAgICAgICAgcnBjX3BhdGhzID0gKCcvUlBDMicsKQogCiAgICAjIENyZWF0ZSBzZXJ2ZXIKLSAgIHNlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyPVJlcXVlc3RIYW5kbGVyKQotICAgc2VydmVyLnJlZ2lzdGVyX2ludHJvc3BlY3Rpb25fZnVuY3Rpb25zKCkKKyAgIHdpdGggU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcj1SZXF1ZXN0SGFuZGxlcikgYXMgc2VydmVyOgorICAgICAgIHNlcnZlci5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCiAKLSAgICMgUmVnaXN0ZXIgcG93KCkgZnVuY3Rpb247IHRoaXMgd2lsbCB1c2UgdGhlIHZhbHVlIG9mCi0gICAjIHBvdy5fX25hbWVfXyBhcyB0aGUgbmFtZSwgd2hpY2ggaXMganVzdCAncG93Jy4KLSAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgICAgIyBSZWdpc3RlciBwb3coKSBmdW5jdGlvbjsgdGhpcyB3aWxsIHVzZSB0aGUgdmFsdWUgb2YKKyAgICAgICAjIHBvdy5fX25hbWVfXyBhcyB0aGUgbmFtZSwgd2hpY2ggaXMganVzdCAncG93Jy4KKyAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQogCi0gICAjIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdW5kZXIgYSBkaWZmZXJlbnQgbmFtZQotICAgZGVmIGFkZGVyX2Z1bmN0aW9uKHgseSk6Ci0gICAgICAgcmV0dXJuIHggKyB5Ci0gICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24oYWRkZXJfZnVuY3Rpb24sICdhZGQnKQorICAgICAgICMgUmVnaXN0ZXIgYSBmdW5jdGlvbiB1bmRlciBhIGRpZmZlcmVudCBuYW1lCisgICAgICAgZGVmIGFkZGVyX2Z1bmN0aW9uKHgseSk6CisgICAgICAgICAgIHJldHVybiB4ICsgeQorICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihhZGRlcl9mdW5jdGlvbiwgJ2FkZCcpCiAKLSAgICMgUmVnaXN0ZXIgYW4gaW5zdGFuY2U7IGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgaW5zdGFuY2UgYXJlCi0gICAjIHB1Ymxpc2hlZCBhcyBYTUwtUlBDIG1ldGhvZHMgKGluIHRoaXMgY2FzZSwganVzdCAnbXVsJykuCi0gICBjbGFzcyBNeUZ1bmNzOgotICAgICAgIGRlZiBtdWwoc2VsZiwgeCwgeSk6Ci0gICAgICAgICAgIHJldHVybiB4ICogeQorICAgICAgICMgUmVnaXN0ZXIgYW4gaW5zdGFuY2U7IGFsbCB0aGUgbWV0aG9kcyBvZiB0aGUgaW5zdGFuY2UgYXJlCisgICAgICAgIyBwdWJsaXNoZWQgYXMgWE1MLVJQQyBtZXRob2RzIChpbiB0aGlzIGNhc2UsIGp1c3QgJ211bCcpLgorICAgICAgIGNsYXNzIE15RnVuY3M6CisgICAgICAgICAgIGRlZiBtdWwoc2VsZiwgeCwgeSk6CisgICAgICAgICAgICAgICByZXR1cm4geCAqIHkKIAotICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKE15RnVuY3MoKSkKKyAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoTXlGdW5jcygpKQogCi0gICAjIFJ1biB0aGUgc2VydmVyJ3MgbWFpbiBsb29wCi0gICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgIyBSdW4gdGhlIHNlcnZlcidzIG1haW4gbG9vcAorICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKIAogVGhlIGZvbGxvd2luZyBjbGllbnQgY29kZSB3aWxsIGNhbGwgdGhlIG1ldGhvZHMgbWFkZSBhdmFpbGFibGUgYnkgdGhlIHByZWNlZGluZwogc2VydmVyOjoKQEAgLTIwNywxOCArMjA3LDE3IEBACiAgICAgICAgICAgICBkZWYgZ2V0Q3VycmVudFRpbWUoKToKICAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKIAotICAgIHNlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKQotICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCi0gICAgc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKEV4YW1wbGVTZXJ2aWNlKCksIGFsbG93X2RvdHRlZF9uYW1lcz1UcnVlKQotICAgIHNlcnZlci5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKLSAgICBwcmludCgnU2VydmluZyBYTUwtUlBDIG9uIGxvY2FsaG9zdCBwb3J0IDgwMDAnKQotICAgIHRyeToKLSAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCi0gICAgICAgIHNlcnZlci5zZXJ2ZXJfY2xvc2UoKQotICAgICAgICBzeXMuZXhpdCgwKQorICAgIHdpdGggU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpIGFzIHNlcnZlcjoKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShFeGFtcGxlU2VydmljZSgpLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSkKKyAgICAgICAgc2VydmVyLnJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoKQorICAgICAgICBwcmludCgnU2VydmluZyBYTUwtUlBDIG9uIGxvY2FsaG9zdCBwb3J0IDgwMDAnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKIAogVGhpcyBFeGFtcGxlU2VydmljZSBkZW1vIGNhbiBiZSBpbnZva2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZTo6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L3ppcGZpbGUucnN0IGIvRG9jL2xpYnJhcnkvemlwZmlsZS5yc3QKaW5kZXggYWJlMzhjNC4uNmM5ZDIwNyAxMDA2NDQKLS0tIGEvRG9jL2xpYnJhcnkvemlwZmlsZS5yc3QKKysrIGIvRG9jL2xpYnJhcnkvemlwZmlsZS5yc3QKQEAgLTIwNSwxOCArMjA1LDEzIEBACiAgICBSZXR1cm4gYSBsaXN0IG9mIGFyY2hpdmUgbWVtYmVycyBieSBuYW1lLgogCiAKLS4uIGluZGV4OjoKLSAgIHNpbmdsZTogdW5pdmVyc2FsIG5ld2xpbmVzOyB6aXBmaWxlLlppcEZpbGUub3BlbiBtZXRob2QKKy4uIG1ldGhvZDo6IFppcEZpbGUub3BlbihuYW1lLCBtb2RlPSdyJywgcHdkPU5vbmUsICosIGZvcmNlX3ppcDY0PUZhbHNlKQogCi0uLiBtZXRob2Q6OiBaaXBGaWxlLm9wZW4obmFtZSwgbW9kZT0ncicsIHB3ZD1Ob25lKQotCi0gICBFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgYXMgYSBmaWxlLWxpa2Ugb2JqZWN0IChaaXBFeHRGaWxlKS4gKm5hbWUqCi0gICBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZSwgb3IgYSA6Y2xhc3M6YFppcEluZm9gIG9iamVjdC4gVGhlCi0gICAqbW9kZSogcGFyYW1ldGVyLCBpZiBpbmNsdWRlZCwgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogYGAncidgYCAodGhlCi0gICBkZWZhdWx0KSwgYGAnVSdgYCwgb3IgYGAnclUnYGAuIENob29zaW5nIGBgJ1UnYGAgb3IgIGBgJ3JVJ2BgIHdpbGwgZW5hYmxlCi0gICA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBzdXBwb3J0IGluIHRoZSByZWFkLW9ubHkgb2JqZWN0LiAgKnB3ZCogaXMgdGhlCi0gICBwYXNzd29yZCB1c2VkIGZvciBlbmNyeXB0ZWQgZmlsZXMuICBDYWxsaW5nICA6bWV0aDpgLm9wZW5gIG9uIGEgY2xvc2VkCi0gICBaaXBGaWxlIHdpbGwgcmFpc2UgYSAgOmV4YzpgUnVudGltZUVycm9yYC4KKyAgIEFjY2VzcyBhIG1lbWJlciBvZiB0aGUgYXJjaGl2ZSBhcyBhIGJpbmFyeSBmaWxlLWxpa2Ugb2JqZWN0LiAgKm5hbWUqCisgICBjYW4gYmUgZWl0aGVyIHRoZSBuYW1lIG9mIGEgZmlsZSB3aXRoaW4gdGhlIGFyY2hpdmUgb3IgYSA6Y2xhc3M6YFppcEluZm9gCisgICBvYmplY3QuICBUaGUgKm1vZGUqIHBhcmFtZXRlciwgaWYgaW5jbHVkZWQsIG11c3QgYmUgYGAncidgYCAodGhlIGRlZmF1bHQpCisgICBvciBgYCd3J2BgLiAgKnB3ZCogaXMgdGhlIHBhc3N3b3JkIHVzZWQgdG8gZGVjcnlwdCBlbmNyeXB0ZWQgWklQIGZpbGVzLgorICAgQ2FsbGluZyA6bWV0aDpgLm9wZW5gIG9uIGEgY2xvc2VkIFppcEZpbGUgd2lsbCByYWlzZSBhIDpleGM6YFJ1bnRpbWVFcnJvcmAuCiAKICAgIDptZXRoOmB+WmlwRmlsZS5vcGVuYCBpcyBhbHNvIGEgY29udGV4dCBtYW5hZ2VyIGFuZCB0aGVyZWZvcmUgc3VwcG9ydHMgdGhlCiAgICA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50OjoKQEAgLTIyNSwxNyArMjIwLDIzIEBACiAgICAgICAgICAgd2l0aCBteXppcC5vcGVuKCdlZ2dzLnR4dCcpIGFzIG15ZmlsZToKICAgICAgICAgICAgICAgcHJpbnQobXlmaWxlLnJlYWQoKSkKIAotICAgLi4gbm90ZTo6CisgICBXaXRoICptb2RlKiBgYCdyJ2BgIHRoZSBmaWxlLWxpa2Ugb2JqZWN0CisgICAoYGBaaXBFeHRGaWxlYGApIGlzIHJlYWQtb25seSBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICAgOm1ldGg6YH5pby5CdWZmZXJlZElPQmFzZS5yZWFkYCwgOm1ldGg6YH5pby5JT0Jhc2UucmVhZGxpbmVgLAorICAgOm1ldGg6YH5pby5JT0Jhc2UucmVhZGxpbmVzYCwgOm1ldGg6YF9faXRlcl9fYCwKKyAgIDptZXRoOmB+aXRlcmF0b3IuX19uZXh0X19gLiAgVGhlc2Ugb2JqZWN0cyBjYW4gb3BlcmF0ZSBpbmRlcGVuZGVudGx5IG9mCisgICB0aGUgWmlwRmlsZS4KIAotICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgcmVhZC1vbmx5IGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gICAgICA6bWV0aDpgfmlvLkJ1ZmZlcmVkSU9CYXNlLnJlYWRgLCA6bWV0aDpgfmlvLklPQmFzZS5yZWFkbGluZWAsCi0gICAgICA6bWV0aDpgfmlvLklPQmFzZS5yZWFkbGluZXNgLCA6bWV0aDpgX19pdGVyX19gLAotICAgICAgOm1ldGg6YH5pdGVyYXRvci5fX25leHRfX2AuCisgICBXaXRoIGBgbW9kZT0ndydgYCwgYSB3cml0YWJsZSBmaWxlIGhhbmRsZSBpcyByZXR1cm5lZCwgd2hpY2ggc3VwcG9ydHMgdGhlCisgICA6bWV0aDpgfmlvLkJ1ZmZlcmVkSU9CYXNlLndyaXRlYCBtZXRob2QuICBXaGlsZSBhIHdyaXRhYmxlIGZpbGUgaGFuZGxlIGlzIG9wZW4sCisgICBhdHRlbXB0aW5nIHRvIHJlYWQgb3Igd3JpdGUgb3RoZXIgZmlsZXMgaW4gdGhlIFpJUCBmaWxlIHdpbGwgcmFpc2UgYQorICAgOmV4YzpgUnVudGltZUVycm9yYC4KIAotICAgLi4gbm90ZTo6Ci0KLSAgICAgIE9iamVjdHMgcmV0dXJuZWQgYnkgOm1ldGg6YC5vcGVuYCBjYW4gb3BlcmF0ZSBpbmRlcGVuZGVudGx5IG9mIHRoZQotICAgICAgWmlwRmlsZS4KKyAgIFdoZW4gd3JpdGluZyBhIGZpbGUsIGlmIHRoZSBmaWxlIHNpemUgaXMgbm90IGtub3duIGluIGFkdmFuY2UgYnV0IG1heSBleGNlZWQKKyAgIDIgR2lCLCBwYXNzIGBgZm9yY2VfemlwNjQ9VHJ1ZWBgIHRvIGVuc3VyZSB0aGF0IHRoZSBoZWFkZXIgZm9ybWF0IGlzCisgICBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgbGFyZ2UgZmlsZXMuICBJZiB0aGUgZmlsZSBzaXplIGlzIGtub3duIGluIGFkdmFuY2UsCisgICBjb25zdHJ1Y3QgYSA6Y2xhc3M6YFppcEluZm9gIG9iamVjdCB3aXRoIDphdHRyOmB+WmlwSW5mby5maWxlX3NpemVgIHNldCwgYW5kCisgICB1c2UgdGhhdCBhcyB0aGUgKm5hbWUqIHBhcmFtZXRlci4KIAogICAgLi4gbm90ZTo6CiAKQEAgLTI0MywxMCArMjQ0LDE0IEBACiAgICAgICBvciBhIDpjbGFzczpgWmlwSW5mb2Agb2JqZWN0LiAgWW91IHdpbGwgYXBwcmVjaWF0ZSB0aGlzIHdoZW4gdHJ5aW5nIHRvIHJlYWQgYQogICAgICAgWklQIGZpbGUgdGhhdCBjb250YWlucyBtZW1iZXJzIHdpdGggZHVwbGljYXRlIG5hbWVzLgogCi0gICAuLiBkZXByZWNhdGVkLXJlbW92ZWQ6OiAzLjQgMy42Ci0gICAgICBUaGUgYGAnVSdgYCBvciAgYGAnclUnYGAgbW9kZS4gIFVzZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGZvciByZWFkaW5nCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgUmVtb3ZlZCBzdXBwb3J0IG9mIGBgbW9kZT0nVSdgYC4gIFVzZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGZvciByZWFkaW5nCiAgICAgICBjb21wcmVzc2VkIHRleHQgZmlsZXMgaW4gOnRlcm06YHVuaXZlcnNhbCBuZXdsaW5lc2AgbW9kZS4KIAorICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIDptZXRoOmBvcGVuYCBjYW4gbm93IGJlIHVzZWQgdG8gd3JpdGUgZmlsZXMgaW50byB0aGUgYXJjaGl2ZSB3aXRoIHRoZQorICAgICAgYGBtb2RlPSd3J2BgIG9wdGlvbi4KKwogLi4gbWV0aG9kOjogWmlwRmlsZS5leHRyYWN0KG1lbWJlciwgcGF0aD1Ob25lLCBwd2Q9Tm9uZSkKIAogICAgRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OyAqbWVtYmVyKgpAQCAtNDY1LDcgKzQ3MCwzMSBAQAogOm1ldGg6YC5pbmZvbGlzdGAgbWV0aG9kcyBvZiA6Y2xhc3M6YFppcEZpbGVgIG9iamVjdHMuICBFYWNoIG9iamVjdCBzdG9yZXMKIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIG1lbWJlciBvZiB0aGUgWklQIGFyY2hpdmUuCiAKLUluc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKK1RoZXJlIGlzIG9uZSBjbGFzc21ldGhvZCB0byBtYWtlIGEgOmNsYXNzOmBaaXBJbmZvYCBpbnN0YW5jZSBmb3IgYSBmaWxlc3lzdGVtCitmaWxlOgorCisuLiBjbGFzc21ldGhvZDo6IFppcEluZm8uZnJvbV9maWxlKGZpbGVuYW1lLCBhcmNuYW1lPU5vbmUpCisKKyAgIENvbnN0cnVjdCBhIDpjbGFzczpgWmlwSW5mb2AgaW5zdGFuY2UgZm9yIGEgZmlsZSBvbiB0aGUgZmlsZXN5c3RlbSwgaW4KKyAgIHByZXBhcmF0aW9uIGZvciBhZGRpbmcgaXQgdG8gYSB6aXAgZmlsZS4KKworICAgKmZpbGVuYW1lKiBzaG91bGQgYmUgdGhlIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSBvbiB0aGUgZmlsZXN5c3RlbS4KKworICAgSWYgKmFyY25hbWUqIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyB0aGUgbmFtZSB3aXRoaW4gdGhlIGFyY2hpdmUuCisgICBJZiAqYXJjbmFtZSogaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgd2lsbCBiZSB0aGUgc2FtZSBhcyAqZmlsZW5hbWUqLCBidXQKKyAgIHdpdGggYW55IGRyaXZlIGxldHRlciBhbmQgbGVhZGluZyBwYXRoIHNlcGFyYXRvcnMgcmVtb3ZlZC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CisKK0luc3RhbmNlcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhbmQgYXR0cmlidXRlczoKKworLi4gbWV0aG9kOjogWmlwSW5mby5pc19kaXIoKQorCisgICBSZXR1cm4gVHJ1ZSBpZiB0aGlzIGFyY2hpdmUgbWVtYmVyIGlzIGEgZGlyZWN0b3J5LgorCisgICBUaGlzIHVzZXMgdGhlIGVudHJ5J3MgbmFtZTogZGlyZWN0b3JpZXMgc2hvdWxkIGFsd2F5cyBlbmQgd2l0aCBgYC9gYC4KKworICAgLi4gdmVyc2lvbmFkZGVkOjogMy42CiAKIAogLi4gYXR0cmlidXRlOjogWmlwSW5mby5maWxlbmFtZQpAQCAtNTc0LDQgKzYwMyw1IEBACiAKICAgIFNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBmaWxlLgogCisKIC4uIF9QS1pJUCBBcHBsaWNhdGlvbiBOb3RlOiBodHRwczovL3Brd2FyZS5jYWNoZWZseS5uZXQvd2ViZG9jcy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVApkaWZmIC0tZ2l0IGEvRG9jL2xpYnJhcnkvemxpYi5yc3QgYi9Eb2MvbGlicmFyeS96bGliLnJzdAppbmRleCAxZGU3YmFlLi44NDYwMjBjIDEwMDY0NAotLS0gYS9Eb2MvbGlicmFyeS96bGliLnJzdAorKysgYi9Eb2MvbGlicmFyeS96bGliLnJzdApAQCAtNDcsMTQgKzQ3LDE5IEBACiAgICAgICBwbGF0Zm9ybXMsIHVzZSBgYGFkbGVyMzIoZGF0YSkgJiAweGZmZmZmZmZmYGAuCiAKIAotLi4gZnVuY3Rpb246OiBjb21wcmVzcyhkYXRhWywgbGV2ZWxdKQorLi4gZnVuY3Rpb246OiBjb21wcmVzcyhkYXRhLCBsZXZlbD0tMSkKIAogICAgQ29tcHJlc3NlcyB0aGUgYnl0ZXMgaW4gKmRhdGEqLCByZXR1cm5pbmcgYSBieXRlcyBvYmplY3QgY29udGFpbmluZyBjb21wcmVzc2VkIGRhdGEuCi0gICAqbGV2ZWwqIGlzIGFuIGludGVnZXIgZnJvbSBgYDBgYCB0byBgYDlgYCBjb250cm9sbGluZyB0aGUgbGV2ZWwgb2YgY29tcHJlc3Npb247CisgICAqbGV2ZWwqIGlzIGFuIGludGVnZXIgZnJvbSBgYDBgYCB0byBgYDlgYCBvciBgYC0xYGAgY29udHJvbGxpbmcgdGhlIGxldmVsIG9mIGNvbXByZXNzaW9uOwogICAgYGAxYGAgaXMgZmFzdGVzdCBhbmQgcHJvZHVjZXMgdGhlIGxlYXN0IGNvbXByZXNzaW9uLCBgYDlgYCBpcyBzbG93ZXN0IGFuZAotICAgcHJvZHVjZXMgdGhlIG1vc3QuICBgYDBgYCBpcyBubyBjb21wcmVzc2lvbi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgNmBgLgorICAgcHJvZHVjZXMgdGhlIG1vc3QuICBgYDBgYCBpcyBubyBjb21wcmVzc2lvbi4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgLTFgYAorICAgKFpfREVGQVVMVF9DT01QUkVTU0lPTikuICBaX0RFRkFVTFRfQ09NUFJFU1NJT04gcmVwcmVzZW50cyBhIGRlZmF1bHQKKyAgIGNvbXByb21pc2UgYmV0d2VlbiBzcGVlZCBhbmQgY29tcHJlc3Npb24gKGN1cnJlbnRseSBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgogICAgUmFpc2VzIHRoZSA6ZXhjOmBlcnJvcmAgZXhjZXB0aW9uIGlmIGFueSBlcnJvciBvY2N1cnMuCiAKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICAqbGV2ZWwqIGNhbiBub3cgYmUgdXNlZCBhcyBhIGtleXdvcmQgcGFyYW1ldGVyLgorCiAKIC4uIGZ1bmN0aW9uOjogY29tcHJlc3NvYmoobGV2ZWw9LTEsIG1ldGhvZD1ERUZMQVRFRCwgd2JpdHM9MTUsIG1lbUxldmVsPTgsIHN0cmF0ZWd5PVpfREVGQVVMVF9TVFJBVEVHWVssIHpkaWN0XSkKIApkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9jb21wb3VuZF9zdG10cy5yc3QgYi9Eb2MvcmVmZXJlbmNlL2NvbXBvdW5kX3N0bXRzLnJzdAppbmRleCAyNDY5NDIyLi5lMWE3ZjU3IDEwMDY0NAotLS0gYS9Eb2MvcmVmZXJlbmNlL2NvbXBvdW5kX3N0bXRzLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2NvbXBvdW5kX3N0bXRzLnJzdApAQCAtNDcxLDEwICs0NzEsMTAgQEAKICAgIGRlY29yYXRvcnM6IGBkZWNvcmF0b3JgKwogICAgZGVjb3JhdG9yOiAiQCIgYGRvdHRlZF9uYW1lYCBbIigiIFtgYXJndW1lbnRfbGlzdGAgWyIsIl1dICIpIl0gTkVXTElORQogICAgZG90dGVkX25hbWU6IGBpZGVudGlmaWVyYCAoIi4iIGBpZGVudGlmaWVyYCkqCi0gICBwYXJhbWV0ZXJfbGlzdDogKGBkZWZwYXJhbWV0ZXJgICIsIikqCi0gICAgICAgICAgICAgICAgIDogfCAiKiIgW2BwYXJhbWV0ZXJgXSAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiAiKioiIGBwYXJhbWV0ZXJgXQotICAgICAgICAgICAgICAgICA6IHwgIioqIiBgcGFyYW1ldGVyYAotICAgICAgICAgICAgICAgICA6IHwgYGRlZnBhcmFtZXRlcmAgWyIsIl0gKQorICAgcGFyYW1ldGVyX2xpc3Q6IGBkZWZwYXJhbWV0ZXJgICgiLCIgYGRlZnBhcmFtZXRlcmApKiBbIiwiIFtgcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NgXV0KKyAgICAgICAgICAgICAgICAgOiB8IGBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc2AKKyAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzOiAiKiIgW2BwYXJhbWV0ZXJgXSAoIiwiIGBkZWZwYXJhbWV0ZXJgKSogWyIsIiBbIioqIiBgcGFyYW1ldGVyYCBbIiwiXV1dCisgICAgICAgICAgICAgICAgICAgICAgICAgOiB8ICIqKiIgYHBhcmFtZXRlcmAgWyIsIl0KICAgIHBhcmFtZXRlcjogYGlkZW50aWZpZXJgIFsiOiIgYGV4cHJlc3Npb25gXQogICAgZGVmcGFyYW1ldGVyOiBgcGFyYW1ldGVyYCBbIj0iIGBleHByZXNzaW9uYF0KICAgIGZ1bmNuYW1lOiBgaWRlbnRpZmllcmAKZGlmZiAtLWdpdCBhL0RvYy9yZWZlcmVuY2UvZGF0YW1vZGVsLnJzdCBiL0RvYy9yZWZlcmVuY2UvZGF0YW1vZGVsLnJzdAppbmRleCBmOTdlYjA4Li40Yzg4ZTM4IDEwMDY0NAotLS0gYS9Eb2MvcmVmZXJlbmNlL2RhdGFtb2RlbC5yc3QKKysrIGIvRG9jL3JlZmVyZW5jZS9kYXRhbW9kZWwucnN0CkBAIC0xMjMzLDggKzEyMzMsOSBAQAogCiAuLiBtZXRob2Q6OiBvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYykKIAotICAgQ2FsbGVkIGJ5IHRoZSA6ZnVuYzpgZm9ybWF0YCBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlCi0gICA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kIG9mIGNsYXNzIDpjbGFzczpgc3RyYCkgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiCisgICBDYWxsZWQgYnkgdGhlIDpmdW5jOmBmb3JtYXRgIGJ1aWx0LWluIGZ1bmN0aW9uLAorICAgYW5kIGJ5IGV4dGVuc2lvbiwgZXZhbHVhdGlvbiBvZiA6cmVmOmBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzCisgICA8Zi1zdHJpbmdzPmAgYW5kIHRoZSA6bWV0aDpgc3RyLmZvcm1hdGAgbWV0aG9kLCB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCIKICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFRoZSBgYGZvcm1hdF9zcGVjYGAgYXJndW1lbnQgaXMKICAgIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGRlc2lyZWQuCiAgICBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGBgZm9ybWF0X3NwZWNgYCBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZQpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9pbXBvcnQucnN0IGIvRG9jL3JlZmVyZW5jZS9pbXBvcnQucnN0CmluZGV4IDIxNDRjMWYuLjU2MDQ5Y2UgMTAwNjQ0Ci0tLSBhL0RvYy9yZWZlcmVuY2UvaW1wb3J0LnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2ltcG9ydC5yc3QKQEAgLTU1NCwxOSArNTU0LDMwIEBACiAgICBkZXRhaWxzLgogCiAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQgb2YgYGBfX25hbWVfX2BgIHRvIGNhbGN1bGF0ZSBleHBsaWNpdAotICAgcmVsYXRpdmUgaW1wb3J0cyBmb3IgbWFpbiBtb2R1bGVzLCBhcyBkZWZpbmVkIGluIDpwZXA6YDM2NmAuCisgICByZWxhdGl2ZSBpbXBvcnRzIGZvciBtYWluIG1vZHVsZXMsIGFzIGRlZmluZWQgaW4gOnBlcDpgMzY2YC4gSXQgaXMKKyAgIGV4cGVjdGVkIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYGBfX3NwZWNfXy5wYXJlbnRgYC4KKworICAgLi4gdmVyc2lvbmNoYW5nZWQ6OiAzLjYKKyAgICAgIFRoZSB2YWx1ZSBvZiBgYF9fcGFja2FnZV9fYGAgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIHNhbWUgYXMKKyAgICAgIGBgX19zcGVjX18ucGFyZW50YGAuCiAKIC4uIGF0dHJpYnV0ZTo6IF9fc3BlY19fCiAKICAgIFRoZSBgYF9fc3BlY19fYGAgYXR0cmlidXRlIG11c3QgYmUgc2V0IHRvIHRoZSBtb2R1bGUgc3BlYyB0aGF0IHdhcwotICAgdXNlZCB3aGVuIGltcG9ydGluZyB0aGUgbW9kdWxlLiAgVGhpcyBpcyB1c2VkIHByaW1hcmlseSBmb3IKLSAgIGludHJvc3BlY3Rpb24gYW5kIGR1cmluZyByZWxvYWRpbmcuICBTZXR0aW5nIGBgX19zcGVjX19gYAorICAgdXNlZCB3aGVuIGltcG9ydGluZyB0aGUgbW9kdWxlLiBTZXR0aW5nIGBgX19zcGVjX19gYAogICAgYXBwcm9wcmlhdGVseSBhcHBsaWVzIGVxdWFsbHkgdG8gOnJlZjpgbW9kdWxlcyBpbml0aWFsaXplZCBkdXJpbmcKICAgIGludGVycHJldGVyIHN0YXJ0dXAgPHByb2dyYW1zPmAuICBUaGUgb25lIGV4Y2VwdGlvbiBpcyBgYF9fbWFpbl9fYGAsCiAgICB3aGVyZSBgYF9fc3BlY19fYGAgaXMgOnJlZjpgc2V0IHRvIE5vbmUgaW4gc29tZSBjYXNlcyA8bWFpbl9zcGVjPmAuCiAKKyAgIFdoZW4gYGBfX3BhY2thZ2VfX2BgIGlzIG5vdCBkZWZpbmVkLCBgYF9fc3BlY19fLnBhcmVudGBgIGlzIHVzZWQgYXMKKyAgIGEgZmFsbGJhY2suCisKICAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNAogCisgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNgorICAgICAgYGBfX3NwZWNfXy5wYXJlbnRgYCBpcyB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBgYF9fcGFja2FnZV9fYGAgaXMKKyAgICAgIG5vdCBkZWZpbmVkLgorCiAuLiBhdHRyaWJ1dGU6OiBfX3BhdGhfXwogCiAgICBJZiB0aGUgbW9kdWxlIGlzIGEgcGFja2FnZSAoZWl0aGVyIHJlZ3VsYXIgb3IgbmFtZXNwYWNlKSwgdGhlIG1vZHVsZQpkaWZmIC0tZ2l0IGEvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdCBiL0RvYy9yZWZlcmVuY2UvbGV4aWNhbF9hbmFseXNpcy5yc3QKaW5kZXggNzE5NjRkNy4uN2FmMWIyOCAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9sZXhpY2FsX2FuYWx5c2lzLnJzdAorKysgYi9Eb2MvcmVmZXJlbmNlL2xleGljYWxfYW5hbHlzaXMucnN0CkBAIC00MDUsNyArNDA1LDggQEAKIAogLi4gcHJvZHVjdGlvbmxpc3Q6OgogICAgc3RyaW5nbGl0ZXJhbDogW2BzdHJpbmdwcmVmaXhgXShgc2hvcnRzdHJpbmdgIHwgYGxvbmdzdHJpbmdgKQotICAgc3RyaW5ncHJlZml4OiAiciIgfCAidSIgfCAiUiIgfCAiVSIKKyAgIHN0cmluZ3ByZWZpeDogInIiIHwgInUiIHwgIlIiIHwgIlUiIHwgImYiIHwgIkYiCisgICAgICAgICAgICAgICA6IHwgImZyIiB8ICJGciIgfCAiZlIiIHwgIkZSIiB8ICJyZiIgfCAickYiIHwgIlJmIiB8ICJSRiIKICAgIHNob3J0c3RyaW5nOiAiJyIgYHNob3J0c3RyaW5naXRlbWAqICInIiB8ICciJyBgc2hvcnRzdHJpbmdpdGVtYCogJyInCiAgICBsb25nc3RyaW5nOiAiJycnIiBgbG9uZ3N0cmluZ2l0ZW1gKiAiJycnIiB8ICciIiInIGBsb25nc3RyaW5naXRlbWAqICciIiInCiAgICBzaG9ydHN0cmluZ2l0ZW06IGBzaG9ydHN0cmluZ2NoYXJgIHwgYHN0cmluZ2VzY2FwZXNlcWAKQEAgLTQ2NCw2ICs0NjUsMTEgQEAKICAgIHRvIHNpbXBsaWZ5IHRoZSBtYWludGVuYW5jZSBvZiBkdWFsIFB5dGhvbiAyLnggYW5kIDMueCBjb2RlYmFzZXMuCiAgICBTZWUgOnBlcDpgNDE0YCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIAorQSBzdHJpbmcgbGl0ZXJhbCB3aXRoIGBgJ2YnYGAgb3IgYGAnRidgYCBpbiBpdHMgcHJlZml4IGlzIGEKKzpkZm46YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbGA7IHNlZSA6cmVmOmBmLXN0cmluZ3NgLiAgVGhlIGBgJ2YnYGAgbWF5IGJlCitjb21iaW5lZCB3aXRoIGBgJ3InYGAsIGJ1dCBub3Qgd2l0aCBgYCdiJ2BgIG9yIGBgJ3UnYGAsIHRoZXJlZm9yZSByYXcKK2Zvcm1hdHRlZCBzdHJpbmdzIGFyZSBwb3NzaWJsZSwgYnV0IGZvcm1hdHRlZCBieXRlcyBsaXRlcmFscyBhcmUgbm90LgorCiBJbiB0cmlwbGUtcXVvdGVkIGxpdGVyYWxzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZCAoYW5kIGFyZQogcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93IHRlcm1pbmF0ZSB0aGUgbGl0ZXJhbC4gIChBCiAicXVvdGUiIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuIHRoZSBsaXRlcmFsLCBpLmUuIGVpdGhlciBgYCdgYCBvciBgYCJgYC4pCkBAIC01ODMsNyArNTg5LDEwNiBAQAogTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBkZWZpbmVkIGF0IHRoZSBzeW50YWN0aWNhbCBsZXZlbCwgYnV0IGltcGxlbWVudGVkIGF0CiBjb21waWxlIHRpbWUuICBUaGUgJysnIG9wZXJhdG9yIG11c3QgYmUgdXNlZCB0byBjb25jYXRlbmF0ZSBzdHJpbmcgZXhwcmVzc2lvbnMKIGF0IHJ1biB0aW1lLiAgQWxzbyBub3RlIHRoYXQgbGl0ZXJhbCBjb25jYXRlbmF0aW9uIGNhbiB1c2UgZGlmZmVyZW50IHF1b3RpbmcKLXN0eWxlcyBmb3IgZWFjaCBjb21wb25lbnQgKGV2ZW4gbWl4aW5nIHJhdyBzdHJpbmdzIGFuZCB0cmlwbGUgcXVvdGVkIHN0cmluZ3MpLgorc3R5bGVzIGZvciBlYWNoIGNvbXBvbmVudCAoZXZlbiBtaXhpbmcgcmF3IHN0cmluZ3MgYW5kIHRyaXBsZSBxdW90ZWQgc3RyaW5ncyksCithbmQgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyBtYXkgYmUgY29uY2F0ZW5hdGVkIHdpdGggcGxhaW4gc3RyaW5nIGxpdGVyYWxzLgorCisKKy4uIGluZGV4OjoKKyAgIHNpbmdsZTogZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsCisgICBzaW5nbGU6IGludGVycG9sYXRlZCBzdHJpbmcgbGl0ZXJhbAorICAgc2luZ2xlOiBzdHJpbmc7IGZvcm1hdHRlZCBsaXRlcmFsCisgICBzaW5nbGU6IHN0cmluZzsgaW50ZXJwb2xhdGVkIGxpdGVyYWwKKyAgIHNpbmdsZTogZi1zdHJpbmcKKy4uIF9mLXN0cmluZ3M6CisKK0Zvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4gdmVyc2lvbmFkZGVkOjogMy42CisKK0EgOmRmbjpgZm9ybWF0dGVkIHN0cmluZyBsaXRlcmFsYCBvciA6ZGZuOmBmLXN0cmluZ2AgaXMgYSBzdHJpbmcgbGl0ZXJhbAordGhhdCBpcyBwcmVmaXhlZCB3aXRoIGBgJ2YnYGAgb3IgYGAnRidgYC4gIFRoZXNlIHN0cmluZ3MgbWF5IGNvbnRhaW4KK3JlcGxhY2VtZW50IGZpZWxkcywgd2hpY2ggYXJlIGV4cHJlc3Npb25zIGRlbGltaXRlZCBieSBjdXJseSBicmFjZXMgYGB7fWBgLgorV2hpbGUgb3RoZXIgc3RyaW5nIGxpdGVyYWxzIGFsd2F5cyBoYXZlIGEgY29uc3RhbnQgdmFsdWUsIGZvcm1hdHRlZCBzdHJpbmdzCithcmUgcmVhbGx5IGV4cHJlc3Npb25zIGV2YWx1YXRlZCBhdCBydW4gdGltZS4KKworRXNjYXBlIHNlcXVlbmNlcyBhcmUgZGVjb2RlZCBsaWtlIGluIG9yZGluYXJ5IHN0cmluZyBsaXRlcmFscyAoZXhjZXB0IHdoZW4KK2EgbGl0ZXJhbCBpcyBhbHNvIG1hcmtlZCBhcyBhIHJhdyBzdHJpbmcpLiAgQWZ0ZXIgZGVjb2RpbmcsIHRoZSBncmFtbWFyCitmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcgaXM6CisKKy4uIHByb2R1Y3Rpb25saXN0OjoKKyAgIGZfc3RyaW5nOiAoYGxpdGVyYWxfY2hhcmAgfCAie3siIHwgIn19IiB8IGByZXBsYWNlbWVudF9maWVsZGApKgorICAgcmVwbGFjZW1lbnRfZmllbGQ6ICJ7IiBgZl9leHByZXNzaW9uYCBbIiEiIGBjb252ZXJzaW9uYF0gWyI6IiBgZm9ybWF0X3NwZWNgXSAifSIKKyAgIGZfZXhwcmVzc2lvbjogKGBjb25kaXRpb25hbF9leHByZXNzaW9uYCB8ICIqIiBgb3JfZXhwcmApCisgICAgICAgICAgICAgICA6ICAgKCIsIiBgY29uZGl0aW9uYWxfZXhwcmVzc2lvbmAgfCAiLCIgIioiIGBvcl9leHByYCkqIFsiLCJdCisgICAgICAgICAgICAgICA6IHwgYHlpZWxkX2V4cHJlc3Npb25gCisgICBjb252ZXJzaW9uOiAicyIgfCAiciIgfCAiYSIKKyAgIGZvcm1hdF9zcGVjOiAoYGxpdGVyYWxfY2hhcmAgfCBOVUxMIHwgYHJlcGxhY2VtZW50X2ZpZWxkYCkqCisgICBsaXRlcmFsX2NoYXI6IDxhbnkgY29kZSBwb2ludCBleGNlcHQgInsiLCAifSIgb3IgTlVMTD4KKworVGhlIHBhcnRzIG9mIHRoZSBzdHJpbmcgb3V0c2lkZSBjdXJseSBicmFjZXMgYXJlIHRyZWF0ZWQgbGl0ZXJhbGx5LAorZXhjZXB0IHRoYXQgYW55IGRvdWJsZWQgY3VybHkgYnJhY2VzIGBgJ3t7J2BgIG9yIGBgJ319J2BgIGFyZSByZXBsYWNlZAord2l0aCB0aGUgY29ycmVzcG9uZGluZyBzaW5nbGUgY3VybHkgYnJhY2UuICBBIHNpbmdsZSBvcGVuaW5nIGN1cmx5CiticmFja2V0IGBgJ3snYGAgbWFya3MgYSByZXBsYWNlbWVudCBmaWVsZCwgd2hpY2ggc3RhcnRzIHdpdGggYQorUHl0aG9uIGV4cHJlc3Npb24uICBBZnRlciB0aGUgZXhwcmVzc2lvbiwgdGhlcmUgbWF5IGJlIGEgY29udmVyc2lvbiBmaWVsZCwKK2ludHJvZHVjZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgYGAnISdgYC4gIEEgZm9ybWF0IHNwZWNpZmllciBtYXkgYWxzbworYmUgYXBwZW5kZWQsIGludHJvZHVjZWQgYnkgYSBjb2xvbiBgYCc6J2BgLiAgQSByZXBsYWNlbWVudCBmaWVsZCBlbmRzCit3aXRoIGEgY2xvc2luZyBjdXJseSBicmFja2V0IGBgJ30nYGAuCisKK0V4cHJlc3Npb25zIGluIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgYXJlIHRyZWF0ZWQgbGlrZSByZWd1bGFyCitQeXRob24gZXhwcmVzc2lvbnMgc3Vycm91bmRlZCBieSBwYXJlbnRoZXNlcywgd2l0aCBhIGZldyBleGNlcHRpb25zLgorQW4gZW1wdHkgZXhwcmVzc2lvbiBpcyBub3QgYWxsb3dlZCwgYW5kIGEgOmtleXdvcmQ6YGxhbWJkYWAgZXhwcmVzc2lvbgorbXVzdCBiZSBzdXJyb3VuZGVkIGJ5IGV4cGxpY2l0IHBhcmVudGhlc2VzLiAgUmVwbGFjZW1lbnQgZXhwcmVzc2lvbnMKK2NhbiBjb250YWluIGxpbmUgYnJlYWtzIChlLmcuIGluIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyksIGJ1dCB0aGV5CitjYW5ub3QgY29udGFpbiBjb21tZW50cy4gIEVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgaW4gdGhlIGNvbnRleHQKK3doZXJlIHRoZSBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWwgYXBwZWFycywgaW4gb3JkZXIgZnJvbSBsZWZ0IHRvIHJpZ2h0LgorCitJZiBhIGNvbnZlcnNpb24gaXMgc3BlY2lmaWVkLCB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24KK2lzIGNvbnZlcnRlZCBiZWZvcmUgZm9ybWF0dGluZy4gIENvbnZlcnNpb24gYGAnIXMnYGAgY2FsbHMgOmZ1bmM6YHN0cmAgb24KK3RoZSByZXN1bHQsIGBgJyFyJ2BgIGNhbGxzIDpmdW5jOmByZXByYCwgYW5kIGBgJyFhJ2BgIGNhbGxzIDpmdW5jOmBhc2NpaWAuCisKK1RoZSByZXN1bHQgaXMgdGhlbiBmb3JtYXR0ZWQgdXNpbmcgdGhlIDpmdW5jOmBmb3JtYXRgIHByb3RvY29sLiAgVGhlCitmb3JtYXQgc3BlY2lmaWVyIGlzIHBhc3NlZCB0byB0aGUgOm1ldGg6YF9fZm9ybWF0X19gIG1ldGhvZCBvZiB0aGUKK2V4cHJlc3Npb24gb3IgY29udmVyc2lvbiByZXN1bHQuICBBbiBlbXB0eSBzdHJpbmcgaXMgcGFzc2VkIHdoZW4gdGhlCitmb3JtYXQgc3BlY2lmaWVyIGlzIG9taXR0ZWQuICBUaGUgZm9ybWF0dGVkIHJlc3VsdCBpcyB0aGVuIGluY2x1ZGVkIGluCit0aGUgZmluYWwgdmFsdWUgb2YgdGhlIHdob2xlIHN0cmluZy4KKworVG9wLWxldmVsIGZvcm1hdCBzcGVjaWZpZXJzIG1heSBpbmNsdWRlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMuCitUaGVzZSBuZXN0ZWQgZmllbGRzIG1heSBpbmNsdWRlIHRoZWlyIG93biBjb252ZXJzaW9uIGZpZWxkcyBhbmQKK2Zvcm1hdCBzcGVjaWZpZXJzLCBidXQgbWF5IG5vdCBpbmNsdWRlIG1vcmUgZGVlcGx5LW5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMuCisKK0Zvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgbWF5IGJlIGNvbmNhdGVuYXRlZCwgYnV0IHJlcGxhY2VtZW50IGZpZWxkcworY2Fubm90IGJlIHNwbGl0IGFjcm9zcyBsaXRlcmFscy4KKworU29tZSBleGFtcGxlcyBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzOjoKKworICAgPj4+IG5hbWUgPSAiRnJlZCIKKyAgID4+PiBmIkhlIHNhaWQgaGlzIG5hbWUgaXMge25hbWUhcn0uIgorICAgIkhlIHNhaWQgaGlzIG5hbWUgaXMgJ0ZyZWQnLiIKKyAgID4+PiBmIkhlIHNhaWQgaGlzIG5hbWUgaXMge3JlcHIobmFtZSl9LiIgICMgcmVwcigpIGlzIGVxdWl2YWxlbnQgdG8gIXIKKyAgICJIZSBzYWlkIGhpcyBuYW1lIGlzICdGcmVkJy4iCisgICA+Pj4gd2lkdGggPSAxMAorICAgPj4+IHByZWNpc2lvbiA9IDQKKyAgID4+PiB2YWx1ZSA9IGRlY2ltYWwuRGVjaW1hbCgiMTIuMzQ1NjciKQorICAgPj4+IGYicmVzdWx0OiB7dmFsdWU6e3dpZHRofS57cHJlY2lzaW9ufX0iICAjIG5lc3RlZCBmaWVsZHMKKyAgICdyZXN1bHQ6ICAgICAgMTIuMzUnCisKK0EgY29uc2VxdWVuY2Ugb2Ygc2hhcmluZyB0aGUgc2FtZSBzeW50YXggYXMgcmVndWxhciBzdHJpbmcgbGl0ZXJhbHMgaXMKK3RoYXQgY2hhcmFjdGVycyBpbiB0aGUgcmVwbGFjZW1lbnQgZmllbGRzIG11c3Qgbm90IGNvbmZsaWN0IHdpdGggdGhlCitxdW90aW5nIHVzZWQgaW4gdGhlIG91dGVyIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbC4gIEFsc28sIGVzY2FwZQorc2VxdWVuY2VzIG5vcm1hbGx5IGFwcGx5IHRvIHRoZSBvdXRlciBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWwsCityYXRoZXIgdGhhbiBpbm5lciBzdHJpbmcgbGl0ZXJhbHM6OgorCisgICBmImFiYyB7YVsieCJdfSBkZWYiICAgICMgZXJyb3I6IG91dGVyIHN0cmluZyBsaXRlcmFsIGVuZGVkIHByZW1hdHVyZWx5CisgICBmImFiYyB7YVtcInhcIl19IGRlZiIgICMgd29ya2Fyb3VuZDogZXNjYXBlIHRoZSBpbm5lciBxdW90ZXMKKyAgIGYiYWJjIHthWyd4J119IGRlZiIgICAgIyB3b3JrYXJvdW5kOiB1c2UgZGlmZmVyZW50IHF1b3RpbmcKKworICAgZiJuZXdsaW5lOiB7b3JkKCdcbicpfSIgICAjIGVycm9yOiBsaXRlcmFsIGxpbmUgYnJlYWsgaW4gaW5uZXIgc3RyaW5nCisgICBmIm5ld2xpbmU6IHtvcmQoJ1xcbicpfSIgICMgd29ya2Fyb3VuZDogZG91YmxlIGVzY2FwaW5nCisgICBmciJuZXdsaW5lOiB7b3JkKCdcbicpfSIgICMgd29ya2Fyb3VuZDogcmF3IG91dGVyIHN0cmluZworCitTZWUgYWxzbyA6cGVwOmA0OThgIGZvciB0aGUgcHJvcG9zYWwgdGhhdCBhZGRlZCBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzLAorYW5kIDptZXRoOmBzdHIuZm9ybWF0YCwgd2hpY2ggdXNlcyBhIHJlbGF0ZWQgZm9ybWF0IHN0cmluZyBtZWNoYW5pc20uCiAKIAogLi4gX251bWJlcnM6CmRpZmYgLS1naXQgYS9Eb2MvcmVmZXJlbmNlL3NpbXBsZV9zdG10cy5yc3QgYi9Eb2MvcmVmZXJlbmNlL3NpbXBsZV9zdG10cy5yc3QKaW5kZXggZDQwM2M0ZC4uZWVlM2Y0MyAxMDA2NDQKLS0tIGEvRG9jL3JlZmVyZW5jZS9zaW1wbGVfc3RtdHMucnN0CisrKyBiL0RvYy9yZWZlcmVuY2Uvc2ltcGxlX3N0bXRzLnJzdApAQCAtODQsNyArODQsNyBAQAogICAgYXNzaWdubWVudF9zdG10OiAoYHRhcmdldF9saXN0YCAiPSIpKyAoYHN0YXJyZWRfZXhwcmVzc2lvbmAgfCBgeWllbGRfZXhwcmVzc2lvbmApCiAgICB0YXJnZXRfbGlzdDogYHRhcmdldGAgKCIsIiBgdGFyZ2V0YCkqIFsiLCJdCiAgICB0YXJnZXQ6IGBpZGVudGlmaWVyYAotICAgICAgICAgOiB8ICIoIiBgdGFyZ2V0X2xpc3RgICIpIgorICAgICAgICAgOiB8ICIoIiBbYHRhcmdldF9saXN0YF0gIikiCiAgICAgICAgICA6IHwgIlsiIFtgdGFyZ2V0X2xpc3RgXSAiXSIKICAgICAgICAgIDogfCBgYXR0cmlidXRlcmVmYAogICAgICAgICAgOiB8IGBzdWJzY3JpcHRpb25gCmRpZmYgLS1naXQgYS9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5IGIvRG9jL3Rvb2xzL2V4dGVuc2lvbnMvcHlzcGVjaWZpYy5weQppbmRleCA2MzExMjgzLi43OTg2MDE3IDEwMDY0NAotLS0gYS9Eb2MvdG9vbHMvZXh0ZW5zaW9ucy9weXNwZWNpZmljLnB5CisrKyBiL0RvYy90b29scy9leHRlbnNpb25zL3B5c3BlY2lmaWMucHkKQEAgLTM0LDcgKzM0LDcgQEAKIAogCiBJU1NVRV9VUkkgPSAnaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUlcycKLVNPVVJDRV9VUkkgPSAnaHR0cHM6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS8zLjUvJXMnCitTT1VSQ0VfVVJJID0gJ2h0dHBzOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvZGVmYXVsdC8lcycKIAogIyBtb25rZXktcGF0Y2ggcmVTVCBwYXJzZXIgdG8gZGlzYWJsZSBhbHBoYWJldGljIGFuZCByb21hbiBlbnVtZXJhdGVkIGxpc3RzCiBmcm9tIGRvY3V0aWxzLnBhcnNlcnMucnN0LnN0YXRlcyBpbXBvcnQgQm9keQpkaWZmIC0tZ2l0IGEvRG9jL3Rvb2xzL3N1c3AtaWdub3JlZC5jc3YgYi9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgppbmRleCBkYmE5M2JmLi40YWVlMmQ2IDEwMDY0NAotLS0gYS9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgorKysgYi9Eb2MvdG9vbHMvc3VzcC1pZ25vcmVkLmNzdgpAQCAtMjA1LDcgKzIwNSw3IEBACiBsaWJyYXJ5L3ZlbnYsLDpwYXJhbSwiOnBhcmFtIG5vZGlzdDogSWYgVHJ1ZSwgc2V0dXB0b29scyBhbmQgcGlwIGFyZSBub3QgaW5zdGFsbGVkIGludG8gdGhlIgogbGlicmFyeS92ZW52LCw6cGFyYW0sIjpwYXJhbSBwcm9ncmVzczogSWYgc2V0dXB0b29scyBvciBwaXAgYXJlIGluc3RhbGxlZCwgdGhlIHByb2dyZXNzIG9mIHRoZSIKIGxpYnJhcnkvdmVudiwsOnBhcmFtLCI6cGFyYW0gbm9waXA6IElmIFRydWUsIHBpcCBpcyBub3QgaW5zdGFsbGVkIGludG8gdGhlIGNyZWF0ZWQiCi1saWJyYXJ5L3ZlbnYsLDpwYXJhbSw6cGFyYW0gY29udGV4dDogVGhlIGluZm9ybWF0aW9uIGZvciB0aGUgZW52aXJvbm1lbnQgY3JlYXRpb24gcmVxdWVzdAorbGlicmFyeS92ZW52LCw6cGFyYW0sOnBhcmFtIGNvbnRleHQ6IFRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQKIGxpYnJhcnkveG1scnBjLmNsaWVudCwsOnBhc3MsaHR0cDovL3VzZXI6cGFzc0Bob3N0OnBvcnQvcGF0aAogbGlicmFyeS94bWxycGMuY2xpZW50LCw6cGFzcyx1c2VyOnBhc3MKIGxpYnJhcnkveG1scnBjLmNsaWVudCwsOnBvcnQsaHR0cDovL3VzZXI6cGFzc0Bob3N0OnBvcnQvcGF0aApAQCAtMjcyLDYgKzI3Miw3IEBACiB3aGF0c25ldy8zLjIsLDpneiwiPj4+IHdpdGggdGFyZmlsZS5vcGVuKG5hbWU9J215YXJjaGl2ZS50YXIuZ3onLCBtb2RlPSd3Omd6JykgYXMgdGY6Igogd2hhdHNuZXcvMy4yLCw6bG9jYXRpb24sem9wZTktbG9jYXRpb24gPSAke3pvcGU5OmxvY2F0aW9ufQogd2hhdHNuZXcvMy4yLCw6cHJlZml4LHpvcGUtY29uZiA9ICR7Y3VzdG9tOnByZWZpeH0vZXRjL3pvcGUuY29uZgord2hhdHNuZXcvY2hhbmdlbG9nLCw6dmVyc2lvbixpbXBvcnQgc3lzOyBJID0gdmVyc2lvbls6dmVyc2lvbi5pbmRleCgnICcpXQogd2hhdHNuZXcvY2hhbmdlbG9nLCw6Z3osIjogVGFyRmlsZSBvcGVuZWQgd2l0aCBleHRlcm5hbCBmaWxlb2JqIGFuZCAiInc6Z3oiIiBtb2RlIGRpZG4ndCIKIHdoYXRzbmV3L2NoYW5nZWxvZywsOjosIjogVXNlICIiMTI3LjAuMC4xIiIgb3IgIiI6OjEiIiBpbnN0ZWFkIG9mICIibG9jYWxob3N0IiIgYXMgbXVjaCBhcyIKIGxpYnJhcnkvdGFyZmlsZSwxNDksOnh6LCd4Onh6JwpAQCAtMjkwLDcgKzI5MSw2IEBACiBsaWJyYXJ5L3ppcGFwcCwxNTUsOmNhbGxhYmxlLCIiInBrZy5tb2R1bGU6Y2FsbGFibGUiIiBhbmQgdGhlIGFyY2hpdmUgd2lsbCBiZSBydW4gYnkgaW1wb3J0aW5nIgogbGlicmFyeS9zdGR0eXBlcywsOjosPj4+IG1bOjoyXS50b2xpc3QoKQogbGlicmFyeS9zeXMsLGAsIyBgYHdyYXBwZXJgYCBjcmVhdGVzIGEgYGB3cmFwKGNvcm8pYGAgY29yb3V0aW5lOgotdHV0b3JpYWwvdmVudiw3Nyw6YzdiOTY0NWE2ZjM1LCJQeXRob24gMy40LjMrICgzLjQ6YzdiOTY0NWE2ZjM1KywgTWF5IDIyIDIwMTUsIDA5OjMxOjI1KSIKIHdoYXRzbmV3LzMuNSwsOnJvb3QsJ1dBUk5JTkc6cm9vdDp3YXJuaW5nXG4nCiB3aGF0c25ldy8zLjUsLDp3YXJuaW5nLCdXQVJOSU5HOnJvb3Q6d2FybmluZ1xuJwogd2hhdHNuZXcvMy41LCw6Oiw+Pj4gYWRkcjYgPSBpcGFkZHJlc3MuSVB2NkFkZHJlc3MoJzo6MScpCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvY29udHJvbGZsb3cucnN0IGIvRG9jL3R1dG9yaWFsL2NvbnRyb2xmbG93LnJzdAppbmRleCBkZGMwODU1Li5iMDNiNTUzIDEwMDY0NAotLS0gYS9Eb2MvdHV0b3JpYWwvY29udHJvbGZsb3cucnN0CisrKyBiL0RvYy90dXRvcmlhbC9jb250cm9sZmxvdy5yc3QKQEAgLTc4LDYgKzc4LDkgQEAKICAgID4+PiB3b3JkcwogICAgWydkZWZlbmVzdHJhdGUnLCAnY2F0JywgJ3dpbmRvdycsICdkZWZlbmVzdHJhdGUnXQogCitXaXRoIGBgZm9yIHcgaW4gd29yZHM6YGAsIHRoZSBleGFtcGxlIHdvdWxkIGF0dGVtcHQgdG8gY3JlYXRlIGFuIGluZmluaXRlIGxpc3QsCitpbnNlcnRpbmcgYGBkZWZlbmVzdHJhdGVgYCBvdmVyIGFuZCBvdmVyIGFnYWluLgorCiAKIC4uIF90dXQtcmFuZ2U6CiAKZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9pbnB1dG91dHB1dC5yc3QgYi9Eb2MvdHV0b3JpYWwvaW5wdXRvdXRwdXQucnN0CmluZGV4IGRkOWM3Y2QuLmJlZWFhYzMgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9pbnB1dG91dHB1dC5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL2lucHV0b3V0cHV0LnJzdApAQCAtMjUsNyArMjUsOCBAQAogY29uY2F0ZW5hdGlvbiBvcGVyYXRpb25zIHlvdSBjYW4gY3JlYXRlIGFueSBsYXlvdXQgeW91IGNhbiBpbWFnaW5lLiAgVGhlCiBzdHJpbmcgdHlwZSBoYXMgc29tZSBtZXRob2RzIHRoYXQgcGVyZm9ybSB1c2VmdWwgb3BlcmF0aW9ucyBmb3IgcGFkZGluZwogc3RyaW5ncyB0byBhIGdpdmVuIGNvbHVtbiB3aWR0aDsgdGhlc2Ugd2lsbCBiZSBkaXNjdXNzZWQgc2hvcnRseS4gIFRoZSBzZWNvbmQKLXdheSBpcyB0byB1c2UgdGhlIDptZXRoOmBzdHIuZm9ybWF0YCBtZXRob2QuCit3YXkgaXMgdG8gdXNlIDpyZWY6YGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgPGYtc3RyaW5ncz5gLCBvciB0aGUKKzptZXRoOmBzdHIuZm9ybWF0YCBtZXRob2QuCiAKIFRoZSA6bW9kOmBzdHJpbmdgIG1vZHVsZSBjb250YWlucyBhIDpjbGFzczpgfnN0cmluZy5UZW1wbGF0ZWAgY2xhc3Mgd2hpY2ggb2ZmZXJzCiB5ZXQgYW5vdGhlciB3YXkgdG8gc3Vic3RpdHV0ZSB2YWx1ZXMgaW50byBzdHJpbmdzLgpkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdCBiL0RvYy90dXRvcmlhbC9pbnRlcnByZXRlci5yc3QKaW5kZXggZTk2NjA4NS4uYzg5ZmFlMyAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2ludGVycHJldGVyLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvaW50ZXJwcmV0ZXIucnN0CkBAIC0xMCwxMyArMTAsMTMgQEAKIEludm9raW5nIHRoZSBJbnRlcnByZXRlcgogPT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgdXN1YWxseSBpbnN0YWxsZWQgYXMgOmZpbGU6YC91c3IvbG9jYWwvYmluL3B5dGhvbjMuNWAKK1RoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXMgdXN1YWxseSBpbnN0YWxsZWQgYXMgOmZpbGU6YC91c3IvbG9jYWwvYmluL3B5dGhvbjMuNmAKIG9uIHRob3NlIG1hY2hpbmVzIHdoZXJlIGl0IGlzIGF2YWlsYWJsZTsgcHV0dGluZyA6ZmlsZTpgL3Vzci9sb2NhbC9iaW5gIGluIHlvdXIKIFVuaXggc2hlbGwncyBzZWFyY2ggcGF0aCBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdGFydCBpdCBieSB0eXBpbmcgdGhlIGNvbW1hbmQ6CiAKIC4uIGNvZGUtYmxvY2s6OiB0ZXh0CiAKLSAgIHB5dGhvbjMuNQorICAgcHl0aG9uMy42CiAKIHRvIHRoZSBzaGVsbC4gWyNdXyBTaW5jZSB0aGUgY2hvaWNlIG9mIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGludGVycHJldGVyIGxpdmVzCiBpcyBhbiBpbnN0YWxsYXRpb24gb3B0aW9uLCBvdGhlciBwbGFjZXMgYXJlIHBvc3NpYmxlOyBjaGVjayB3aXRoIHlvdXIgbG9jYWwKQEAgLTI0LDExICsyNCwxMSBAQAogcG9wdWxhciBhbHRlcm5hdGl2ZSBsb2NhdGlvbi4pCiAKIE9uIFdpbmRvd3MgbWFjaGluZXMsIHRoZSBQeXRob24gaW5zdGFsbGF0aW9uIGlzIHVzdWFsbHkgcGxhY2VkIGluCi06ZmlsZTpgQzpcXFB5dGhvbjM1YCwgdGhvdWdoIHlvdSBjYW4gY2hhbmdlIHRoaXMgd2hlbiB5b3UncmUgcnVubmluZyB0aGUKKzpmaWxlOmBDOlxcUHl0aG9uMzZgLCB0aG91Z2ggeW91IGNhbiBjaGFuZ2UgdGhpcyB3aGVuIHlvdSdyZSBydW5uaW5nIHRoZQogaW5zdGFsbGVyLiAgVG8gYWRkIHRoaXMgZGlyZWN0b3J5IHRvIHlvdXIgcGF0aCwgIHlvdSBjYW4gdHlwZSB0aGUgZm9sbG93aW5nCiBjb21tYW5kIGludG8gdGhlIGNvbW1hbmQgcHJvbXB0IGluIGEgRE9TIGJveDo6CiAKLSAgIHNldCBwYXRoPSVwYXRoJTtDOlxweXRob24zNQorICAgc2V0IHBhdGg9JXBhdGglO0M6XHB5dGhvbjM2CiAKIFR5cGluZyBhbiBlbmQtb2YtZmlsZSBjaGFyYWN0ZXIgKDprYmQ6YENvbnRyb2wtRGAgb24gVW5peCwgOmtiZDpgQ29udHJvbC1aYCBvbgogV2luZG93cykgYXQgdGhlIHByaW1hcnkgcHJvbXB0IGNhdXNlcyB0aGUgaW50ZXJwcmV0ZXIgdG8gZXhpdCB3aXRoIGEgemVybyBleGl0CkBAIC05Niw4ICs5Niw4IEBACiBwcmludHMgYSB3ZWxjb21lIG1lc3NhZ2Ugc3RhdGluZyBpdHMgdmVyc2lvbiBudW1iZXIgYW5kIGEgY29weXJpZ2h0IG5vdGljZQogYmVmb3JlIHByaW50aW5nIHRoZSBmaXJzdCBwcm9tcHQ6OgogCi0gICAkIHB5dGhvbjMuNQotICAgUHl0aG9uIDMuNSAoZGVmYXVsdCwgU2VwIDE2IDIwMTUsIDA5OjI1OjA0KQorICAgJCBweXRob24zLjYKKyAgIFB5dGhvbiAzLjYgKGRlZmF1bHQsIFNlcCAxNiAyMDE1LCAwOToyNTowNCkKICAgIFtHQ0MgNC44LjJdIG9uIGxpbnV4CiAgICBUeXBlICJoZWxwIiwgImNvcHlyaWdodCIsICJjcmVkaXRzIiBvciAibGljZW5zZSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICA+Pj4KZGlmZiAtLWdpdCBhL0RvYy90dXRvcmlhbC9pbnRyb2R1Y3Rpb24ucnN0IGIvRG9jL3R1dG9yaWFsL2ludHJvZHVjdGlvbi5yc3QKaW5kZXggMjE0MDMyOS4uN2U4ZWUzZSAxMDA2NDQKLS0tIGEvRG9jL3R1dG9yaWFsL2ludHJvZHVjdGlvbi5yc3QKKysrIGIvRG9jL3R1dG9yaWFsL2ludHJvZHVjdGlvbi5yc3QKQEAgLTM1Miw2ICszNTIsOSBAQAogICAgICAgU3RyaW5ncyBzdXBwb3J0IGEgbGFyZ2UgbnVtYmVyIG9mIG1ldGhvZHMgZm9yCiAgICAgICBiYXNpYyB0cmFuc2Zvcm1hdGlvbnMgYW5kIHNlYXJjaGluZy4KIAorICAgOnJlZjpgZi1zdHJpbmdzYAorICAgICAgU3RyaW5nIGxpdGVyYWxzIHRoYXQgaGF2ZSBlbWJlZGRlZCBleHByZXNzaW9ucy4KKwogICAgOnJlZjpgZm9ybWF0c3RyaW5nc2AKICAgICAgIEluZm9ybWF0aW9uIGFib3V0IHN0cmluZyBmb3JtYXR0aW5nIHdpdGggOm1ldGg6YHN0ci5mb3JtYXRgLgogCmRpZmYgLS1naXQgYS9Eb2MvdHV0b3JpYWwvc3RkbGliLnJzdCBiL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CmluZGV4IDUyZmZkYmUuLjFkZDA2YzIgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CisrKyBiL0RvYy90dXRvcmlhbC9zdGRsaWIucnN0CkBAIC0xNSw3ICsxNSw3IEBACiAKICAgID4+PiBpbXBvcnQgb3MKICAgID4+PiBvcy5nZXRjd2QoKSAgICAgICMgUmV0dXJuIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Ci0gICAnQzpcXFB5dGhvbjM1JworICAgJ0M6XFxQeXRob24zNicKICAgID4+PiBvcy5jaGRpcignL3NlcnZlci9hY2Nlc3Nsb2dzJykgICAjIENoYW5nZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5CiAgICA+Pj4gb3Muc3lzdGVtKCdta2RpciB0b2RheScpICAgIyBSdW4gdGhlIGNvbW1hbmQgbWtkaXIgaW4gdGhlIHN5c3RlbSBzaGVsbAogICAgMApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0IGIvRG9jL3R1dG9yaWFsL3N0ZGxpYjIucnN0CmluZGV4IDM3MTQzODQuLmJmNGNmODcgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC9zdGRsaWIyLnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvc3RkbGliMi5yc3QKQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgICAgIGRbJ3ByaW1hcnknXSAgICAgICAgICAgICAgICAjIGVudHJ5IHdhcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKLSAgICAgRmlsZSAiQzovcHl0aG9uMzUvbGliL3dlYWtyZWYucHkiLCBsaW5lIDQ2LCBpbiBfX2dldGl0ZW1fXworICAgICBGaWxlICJDOi9weXRob24zNi9saWIvd2Vha3JlZi5weSIsIGxpbmUgNDYsIGluIF9fZ2V0aXRlbV9fCiAgICAgICAgbyA9IHNlbGYuZGF0YVtrZXldKCkKICAgIEtleUVycm9yOiAncHJpbWFyeScKIApkaWZmIC0tZ2l0IGEvRG9jL3R1dG9yaWFsL3ZlbnYucnN0IGIvRG9jL3R1dG9yaWFsL3ZlbnYucnN0CmluZGV4IDNiMmVlMmUuLmUyZGQ1N2QgMTAwNjQ0Ci0tLSBhL0RvYy90dXRvcmlhbC92ZW52LnJzdAorKysgYi9Eb2MvdHV0b3JpYWwvdmVudi5yc3QKQEAgLTIwLDE1ICsyMCwxNCBAQAogdGhlIHJlcXVpcmVtZW50cyBhcmUgaW4gY29uZmxpY3QgYW5kIGluc3RhbGxpbmcgZWl0aGVyIHZlcnNpb24gMS4wIG9yIDIuMAogd2lsbCBsZWF2ZSBvbmUgYXBwbGljYXRpb24gdW5hYmxlIHRvIHJ1bi4KIAotVGhlIHNvbHV0aW9uIGZvciB0aGlzIHByb2JsZW0gaXMgdG8gY3JlYXRlIGEgOnRlcm06YHZpcnR1YWwKLWVudmlyb25tZW50YCAob2Z0ZW4gc2hvcnRlbmVkIHRvICJ2aXJ0dWFsZW52IiksIGEgc2VsZi1jb250YWluZWQKLWRpcmVjdG9yeSB0cmVlIHRoYXQgY29udGFpbnMgYSBQeXRob24gaW5zdGFsbGF0aW9uIGZvciBhIHBhcnRpY3VsYXIKLXZlcnNpb24gb2YgUHl0aG9uLCBwbHVzIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFja2FnZXMuCitUaGUgc29sdXRpb24gZm9yIHRoaXMgcHJvYmxlbSBpcyB0byBjcmVhdGUgYSA6dGVybTpgdmlydHVhbCBlbnZpcm9ubWVudGAsIGEKK3NlbGYtY29udGFpbmVkIGRpcmVjdG9yeSB0cmVlIHRoYXQgY29udGFpbnMgYSBQeXRob24gaW5zdGFsbGF0aW9uIGZvciBhCitwYXJ0aWN1bGFyIHZlcnNpb24gb2YgUHl0aG9uLCBwbHVzIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgcGFja2FnZXMuCiAKIERpZmZlcmVudCBhcHBsaWNhdGlvbnMgY2FuIHRoZW4gdXNlIGRpZmZlcmVudCB2aXJ0dWFsIGVudmlyb25tZW50cy4KIFRvIHJlc29sdmUgdGhlIGVhcmxpZXIgZXhhbXBsZSBvZiBjb25mbGljdGluZyByZXF1aXJlbWVudHMsCiBhcHBsaWNhdGlvbiBBIGNhbiBoYXZlIGl0cyBvd24gdmlydHVhbCBlbnZpcm9ubWVudCB3aXRoIHZlcnNpb24gMS4wCi1pbnN0YWxsZWQgd2hpbGUgYXBwbGljYXRpb24gQiBoYXMgYW5vdGhlciB2aXJ0dWFsZW52IHdpdGggdmVyc2lvbiAyLjAuCitpbnN0YWxsZWQgd2hpbGUgYXBwbGljYXRpb24gQiBoYXMgYW5vdGhlciB2aXJ0dWFsIGVudmlyb25tZW50IHdpdGggdmVyc2lvbiAyLjAuCiBJZiBhcHBsaWNhdGlvbiBCIHJlcXVpcmVzIGEgbGlicmFyeSBiZSB1cGdyYWRlZCB0byB2ZXJzaW9uIDMuMCwgdGhpcyB3aWxsCiBub3QgYWZmZWN0IGFwcGxpY2F0aW9uIEEncyBlbnZpcm9ubWVudC4KIApAQCAtMzYsMjkgKzM1LDI2IEBACiBDcmVhdGluZyBWaXJ0dWFsIEVudmlyb25tZW50cwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlIHNjcmlwdCB1c2VkIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHZpcnR1YWwgZW52aXJvbm1lbnRzIGlzIGNhbGxlZAotOnByb2dyYW06YHB5dmVudmAuICA6cHJvZ3JhbTpgcHl2ZW52YCB3aWxsIHVzdWFsbHkgaW5zdGFsbCB0aGUgbW9zdAotcmVjZW50IHZlcnNpb24gb2YgUHl0aG9uIHRoYXQgeW91IGhhdmUgYXZhaWxhYmxlOyB0aGUgc2NyaXB0IGlzIGFsc28KLWluc3RhbGxlZCB3aXRoIGEgdmVyc2lvbiBudW1iZXIsIHNvIGlmIHlvdSBoYXZlIG11bHRpcGxlIHZlcnNpb25zIG9mCi1QeXRob24gb24geW91ciBzeXN0ZW0geW91IGNhbiBzZWxlY3QgYSBzcGVjaWZpYyBQeXRob24gdmVyc2lvbiBieQotcnVubmluZyBgYHB5dmVudi0zLjRgYCBvciB3aGljaGV2ZXIgdmVyc2lvbiB5b3Ugd2FudC4KK1RoZSBtb2R1bGUgdXNlZCB0byBjcmVhdGUgYW5kIG1hbmFnZSB2aXJ0dWFsIGVudmlyb25tZW50cyBpcyBjYWxsZWQKKzptb2Q6YHZlbnZgLiAgOm1vZDpgdmVudmAgd2lsbCB1c3VhbGx5IGluc3RhbGwgdGhlIG1vc3QgcmVjZW50IHZlcnNpb24gb2YKK1B5dGhvbiB0aGF0IHlvdSBoYXZlIGF2YWlsYWJsZS4gSWYgeW91IGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgUHl0aG9uIG9uIHlvdXIKK3N5c3RlbSwgeW91IGNhbiBzZWxlY3QgYSBzcGVjaWZpYyBQeXRob24gdmVyc2lvbiBieSBydW5uaW5nIGBgcHl0aG9uM2BgIG9yCit3aGljaGV2ZXIgdmVyc2lvbiB5b3Ugd2FudC4KIAotVG8gY3JlYXRlIGEgdmlydHVhbGVudiwgZGVjaWRlIHVwb24gYSBkaXJlY3RvcnkKLXdoZXJlIHlvdSB3YW50IHRvIHBsYWNlIGl0IGFuZCBydW4gOnByb2dyYW06YHB5dmVudmAgd2l0aCB0aGUKLWRpcmVjdG9yeSBwYXRoOjoKK1RvIGNyZWF0ZSBhIHZpcnR1YWwgZW52aXJvbm1lbnQsIGRlY2lkZSB1cG9uIGEgZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRvCitwbGFjZSBpdCwgYW5kIHJ1biB0aGUgOm1vZDpgdmVudmAgbW9kdWxlIGFzIGEgc2NyaXB0IHdpdGggdGhlIGRpcmVjdG9yeSBwYXRoOjoKIAotICAgcHl2ZW52IHR1dG9yaWFsLWVudgorICAgcHl0aG9uMyAtbSB2ZW52IHR1dG9yaWFsLWVudgogCiBUaGlzIHdpbGwgY3JlYXRlIHRoZSBgYHR1dG9yaWFsLWVudmBgIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0LAogYW5kIGFsc28gY3JlYXRlIGRpcmVjdG9yaWVzIGluc2lkZSBpdCBjb250YWluaW5nIGEgY29weSBvZiB0aGUgUHl0aG9uCiBpbnRlcnByZXRlciwgdGhlIHN0YW5kYXJkIGxpYnJhcnksIGFuZCB2YXJpb3VzIHN1cHBvcnRpbmcgZmlsZXMuCiAKLU9uY2UgeW91J3ZlIGNyZWF0ZWQgYSB2aXJ0dWFsIGVudmlyb25tZW50LCB5b3UgbmVlZCB0bwotYWN0aXZhdGUgaXQuCitPbmNlIHlvdSd2ZSBjcmVhdGVkIGEgdmlydHVhbCBlbnZpcm9ubWVudCwgeW91IG1heSBhY3RpdmF0ZSBpdC4KIAogT24gV2luZG93cywgcnVuOjoKIAotICB0dXRvcmlhbC1lbnYvU2NyaXB0cy9hY3RpdmF0ZQorICB0dXRvcmlhbC1lbnZcU2NyaXB0c1xhY3RpdmF0ZS5iYXQKIAogT24gVW5peCBvciBNYWNPUywgcnVuOjoKIApAQCAtNjksMzMgKzY1LDM2IEBACiBgYGFjdGl2YXRlLmNzaGBgIGFuZCBgYGFjdGl2YXRlLmZpc2hgYCBzY3JpcHRzIHlvdSBzaG91bGQgdXNlCiBpbnN0ZWFkLikKIAotQWN0aXZhdGluZyB0aGUgdmlydHVhbGVudiB3aWxsIGNoYW5nZSB5b3VyIHNoZWxsJ3MgcHJvbXB0IHRvIHNob3cgd2hhdAotdmlydHVhbGVudiB5b3UncmUgdXNpbmcsIGFuZCBtb2RpZnkgdGhlIGVudmlyb25tZW50IHNvIHRoYXQgcnVubmluZwotYGBweXRob25gYCB3aWxsIGdldCB5b3UgdGhhdCBwYXJ0aWN1bGFyIHZlcnNpb24gYW5kIGluc3RhbGxhdGlvbiBvZgotUHl0aG9uLiAgRm9yIGV4YW1wbGU6OgorQWN0aXZhdGluZyB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCB3aWxsIGNoYW5nZSB5b3VyIHNoZWxsJ3MgcHJvbXB0IHRvIHNob3cgd2hhdAordmlydHVhbCBlbnZpcm9ubWVudCB5b3UncmUgdXNpbmcsIGFuZCBtb2RpZnkgdGhlIGVudmlyb25tZW50IHNvIHRoYXQgcnVubmluZworYGBweXRob25gYCB3aWxsIGdldCB5b3UgdGhhdCBwYXJ0aWN1bGFyIHZlcnNpb24gYW5kIGluc3RhbGxhdGlvbiBvZiBQeXRob24uCitGb3IgZXhhbXBsZToKIAotICAtPiBzb3VyY2Ugfi9lbnZzL3R1dG9yaWFsLWVudi9iaW4vYWN0aXZhdGUKLSAgKHR1dG9yaWFsLWVudikgLT4gcHl0aG9uCi0gIFB5dGhvbiAzLjQuMysgKDMuNDpjN2I5NjQ1YTZmMzUrLCBNYXkgMjIgMjAxNSwgMDk6MzE6MjUpCisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICQgc291cmNlIH4vZW52cy90dXRvcmlhbC1lbnYvYmluL2FjdGl2YXRlCisgICh0dXRvcmlhbC1lbnYpICQgcHl0aG9uCisgIFB5dGhvbiAzLjUuMSAoZGVmYXVsdCwgTWF5ICA2IDIwMTYsIDEwOjU5OjM2KQogICAgIC4uLgogICA+Pj4gaW1wb3J0IHN5cwogICA+Pj4gc3lzLnBhdGgKLSAgWycnLCAnL3Vzci9sb2NhbC9saWIvcHl0aG9uMzQuemlwJywgLi4uLAotICAnfi9lbnZzL3R1dG9yaWFsLWVudi9saWIvcHl0aG9uMy40L3NpdGUtcGFja2FnZXMnXQorICBbJycsICcvdXNyL2xvY2FsL2xpYi9weXRob24zNS56aXAnLCAuLi4sCisgICd+L2VudnMvdHV0b3JpYWwtZW52L2xpYi9weXRob24zLjUvc2l0ZS1wYWNrYWdlcyddCiAgID4+PgogCiAKIE1hbmFnaW5nIFBhY2thZ2VzIHdpdGggcGlwCiA9PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1PbmNlIHlvdSd2ZSBhY3RpdmF0ZWQgYSB2aXJ0dWFsIGVudmlyb25tZW50LCB5b3UgY2FuIGluc3RhbGwsIHVwZ3JhZGUsCi1hbmQgcmVtb3ZlIHBhY2thZ2VzIHVzaW5nIGEgcHJvZ3JhbSBjYWxsZWQgOnByb2dyYW06YHBpcGAuICBCeSBkZWZhdWx0Ci1gYHBpcGBgIHdpbGwgaW5zdGFsbCBwYWNrYWdlcyBmcm9tIHRoZSBQeXRob24gUGFja2FnZSBJbmRleCwKLTxodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpPi4gIFlvdSBjYW4gYnJvd3NlIHRoZSBQeXRob24gUGFja2FnZSBJbmRleAotYnkgZ29pbmcgdG8gaXQgaW4geW91ciB3ZWIgYnJvd3Nlciwgb3IgeW91IGNhbiB1c2UgYGBwaXBgYCdzCi1saW1pdGVkIHNlYXJjaCBmZWF0dXJlOjoKK1lvdSBjYW4gaW5zdGFsbCwgdXBncmFkZSwgYW5kIHJlbW92ZSBwYWNrYWdlcyB1c2luZyBhIHByb2dyYW0gY2FsbGVkCis6cHJvZ3JhbTpgcGlwYC4gIEJ5IGRlZmF1bHQgYGBwaXBgYCB3aWxsIGluc3RhbGwgcGFja2FnZXMgZnJvbSB0aGUgUHl0aG9uCitQYWNrYWdlIEluZGV4LCA8aHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaT4uICBZb3UgY2FuIGJyb3dzZSB0aGUgUHl0aG9uCitQYWNrYWdlIEluZGV4IGJ5IGdvaW5nIHRvIGl0IGluIHlvdXIgd2ViIGJyb3dzZXIsIG9yIHlvdSBjYW4gdXNlIGBgcGlwYGAncworbGltaXRlZCBzZWFyY2ggZmVhdHVyZToKIAotICAodHV0b3JpYWwtZW52KSAtPiBwaXAgc2VhcmNoIGFzdHJvbm9teQorLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAodHV0b3JpYWwtZW52KSAkIHBpcCBzZWFyY2ggYXN0cm9ub215CiAgIHNreWZpZWxkICAgICAgICAgICAgICAgLSBFbGVnYW50IGFzdHJvbm9teSBmb3IgUHl0aG9uCiAgIGdhcnkgICAgICAgICAgICAgICAgICAgLSBHYWxhY3RpYyBhc3Ryb25vbXkgYW5kIGdyYXZpdGF0aW9uYWwgZHluYW1pY3MuCiAgIG5vdmFzICAgICAgICAgICAgICAgICAgLSBUaGUgVW5pdGVkIFN0YXRlcyBOYXZhbCBPYnNlcnZhdG9yeSBOT1ZBUyBhc3Ryb25vbXkgbGlicmFyeQpAQCAtMTA3LDkgKzEwNiwxMSBAQAogImZyZWV6ZSIsIGV0Yy4gIChDb25zdWx0IHRoZSA6cmVmOmBpbnN0YWxsaW5nLWluZGV4YCBndWlkZSBmb3IKIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gZm9yIGBgcGlwYGAuKQogCi1Zb3UgY2FuIGluc3RhbGwgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGEgcGFja2FnZSBieSBzcGVjaWZ5aW5nIGEgcGFja2FnZSdzIG5hbWU6OgorWW91IGNhbiBpbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhIHBhY2thZ2UgYnkgc3BlY2lmeWluZyBhIHBhY2thZ2UncyBuYW1lOgogCi0gIC0+IHBpcCBpbnN0YWxsIG5vdmFzCisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICh0dXRvcmlhbC1lbnYpICQgcGlwIGluc3RhbGwgbm92YXMKICAgQ29sbGVjdGluZyBub3ZhcwogICAgIERvd25sb2FkaW5nIG5vdmFzLTMuMS4xLjMudGFyLmd6ICgxMzZrQikKICAgSW5zdGFsbGluZyBjb2xsZWN0ZWQgcGFja2FnZXM6IG5vdmFzCkBAIC0xMTcsOSArMTE4LDExIEBACiAgIFN1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgbm92YXMtMy4xLjEuMwogCiBZb3UgY2FuIGFsc28gaW5zdGFsbCBhIHNwZWNpZmljIHZlcnNpb24gb2YgYSBwYWNrYWdlIGJ5IGdpdmluZyB0aGUKLXBhY2thZ2UgbmFtZSAgZm9sbG93ZWQgYnkgYGA9PWBgIGFuZCB0aGUgdmVyc2lvbiBudW1iZXI6OgorcGFja2FnZSBuYW1lICBmb2xsb3dlZCBieSBgYD09YGAgYW5kIHRoZSB2ZXJzaW9uIG51bWJlcjoKIAotICAtPiBwaXAgaW5zdGFsbCByZXF1ZXN0cz09Mi42LjAKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgaW5zdGFsbCByZXF1ZXN0cz09Mi42LjAKICAgQ29sbGVjdGluZyByZXF1ZXN0cz09Mi42LjAKICAgICBVc2luZyBjYWNoZWQgcmVxdWVzdHMtMi42LjAtcHkyLnB5My1ub25lLWFueS53aGwKICAgSW5zdGFsbGluZyBjb2xsZWN0ZWQgcGFja2FnZXM6IHJlcXVlc3RzCkBAIC0xMjgsOSArMTMxLDExIEBACiBJZiB5b3UgcmUtcnVuIHRoaXMgY29tbWFuZCwgYGBwaXBgYCB3aWxsIG5vdGljZSB0aGF0IHRoZSByZXF1ZXN0ZWQKIHZlcnNpb24gaXMgYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGRvIG5vdGhpbmcuICBZb3UgY2FuIHN1cHBseSBhCiBkaWZmZXJlbnQgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IHRoYXQgdmVyc2lvbiwgb3IgeW91IGNhbiBydW4gYGBwaXAKLWluc3RhbGwgLS11cGdyYWRlYGAgdG8gdXBncmFkZSB0aGUgcGFja2FnZSB0byB0aGUgbGF0ZXN0IHZlcnNpb246OgoraW5zdGFsbCAtLXVwZ3JhZGVgYCB0byB1cGdyYWRlIHRoZSBwYWNrYWdlIHRvIHRoZSBsYXRlc3QgdmVyc2lvbjoKIAotICAtPiBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcmVxdWVzdHMKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgcmVxdWVzdHMKICAgQ29sbGVjdGluZyByZXF1ZXN0cwogICBJbnN0YWxsaW5nIGNvbGxlY3RlZCBwYWNrYWdlczogcmVxdWVzdHMKICAgICBGb3VuZCBleGlzdGluZyBpbnN0YWxsYXRpb246IHJlcXVlc3RzIDIuNi4wCkBAIC0xNDEsOSArMTQ2LDExIEBACiBgYHBpcCB1bmluc3RhbGxgYCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwYWNrYWdlIG5hbWVzIHdpbGwgcmVtb3ZlIHRoZQogcGFja2FnZXMgZnJvbSB0aGUgdmlydHVhbCBlbnZpcm9ubWVudC4KIAotYGBwaXAgc2hvd2BgIHdpbGwgZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgcGFja2FnZTo6CitgYHBpcCBzaG93YGAgd2lsbCBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgcGFydGljdWxhciBwYWNrYWdlOgogCi0gICh0dXRvcmlhbC1lbnYpIC0+IHBpcCBzaG93IHJlcXVlc3RzCisuLiBjb2RlLWJsb2NrOjogYmFzaAorCisgICh0dXRvcmlhbC1lbnYpICQgcGlwIHNob3cgcmVxdWVzdHMKICAgLS0tCiAgIE1ldGFkYXRhLVZlcnNpb246IDIuMAogICBOYW1lOiByZXF1ZXN0cwpAQCAtMTU3LDkgKzE2NCwxMSBAQAogICBSZXF1aXJlczoKIAogYGBwaXAgbGlzdGBgIHdpbGwgZGlzcGxheSBhbGwgb2YgdGhlIHBhY2thZ2VzIGluc3RhbGxlZCBpbiB0aGUgdmlydHVhbAotZW52aXJvbm1lbnQ6OgorZW52aXJvbm1lbnQ6CiAKLSAgKHR1dG9yaWFsLWVudikgLT4gcGlwIGxpc3QKKy4uIGNvZGUtYmxvY2s6OiBiYXNoCisKKyAgKHR1dG9yaWFsLWVudikgJCBwaXAgbGlzdAogICBub3ZhcyAoMy4xLjEuMykKICAgbnVtcHkgKDEuOS4yKQogICBwaXAgKDcuMC4zKQpAQCAtMTY4LDE5ICsxNzcsMjMgQEAKIAogYGBwaXAgZnJlZXplYGAgd2lsbCBwcm9kdWNlIGEgc2ltaWxhciBsaXN0IG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZXMsCiBidXQgdGhlIG91dHB1dCB1c2VzIHRoZSBmb3JtYXQgdGhhdCBgYHBpcCBpbnN0YWxsYGAgZXhwZWN0cy4KLUEgY29tbW9uIGNvbnZlbnRpb24gaXMgdG8gcHV0IHRoaXMgbGlzdCBpbiBhIGBgcmVxdWlyZW1lbnRzLnR4dGBgIGZpbGU6OgorQSBjb21tb24gY29udmVudGlvbiBpcyB0byBwdXQgdGhpcyBsaXN0IGluIGEgYGByZXF1aXJlbWVudHMudHh0YGAgZmlsZToKIAotICAodHV0b3JpYWwtZW52KSAtPiBwaXAgZnJlZXplID4gcmVxdWlyZW1lbnRzLnR4dAotICAodHV0b3JpYWwtZW52KSAtPiBjYXQgcmVxdWlyZW1lbnRzLnR4dAorLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAodHV0b3JpYWwtZW52KSAkIHBpcCBmcmVlemUgPiByZXF1aXJlbWVudHMudHh0CisgICh0dXRvcmlhbC1lbnYpICQgY2F0IHJlcXVpcmVtZW50cy50eHQKICAgbm92YXM9PTMuMS4xLjMKICAgbnVtcHk9PTEuOS4yCiAgIHJlcXVlc3RzPT0yLjcuMAogCiBUaGUgYGByZXF1aXJlbWVudHMudHh0YGAgY2FuIHRoZW4gYmUgY29tbWl0dGVkIHRvIHZlcnNpb24gY29udHJvbCBhbmQKIHNoaXBwZWQgYXMgcGFydCBvZiBhbiBhcHBsaWNhdGlvbi4gIFVzZXJzIGNhbiB0aGVuIGluc3RhbGwgYWxsIHRoZQotbmVjZXNzYXJ5IHBhY2thZ2VzIHdpdGggYGBpbnN0YWxsIC1yYGA6OgorbmVjZXNzYXJ5IHBhY2thZ2VzIHdpdGggYGBpbnN0YWxsIC1yYGA6CiAKLSAgLT4gcGlwIGluc3RhbGwgLXIgcmVxdWlyZW1lbnRzLnR4dAorLi4gY29kZS1ibG9jazo6IGJhc2gKKworICAodHV0b3JpYWwtZW52KSAkIHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHQKICAgQ29sbGVjdGluZyBub3Zhcz09My4xLjEuMyAoZnJvbSAtciByZXF1aXJlbWVudHMudHh0IChsaW5lIDEpKQogICAgIC4uLgogICBDb2xsZWN0aW5nIG51bXB5PT0xLjkuMiAoZnJvbSAtciByZXF1aXJlbWVudHMudHh0IChsaW5lIDIpKQpkaWZmIC0tZ2l0IGEvRG9jL3VzaW5nL2NtZGxpbmUucnN0IGIvRG9jL3VzaW5nL2NtZGxpbmUucnN0CmluZGV4IGVjNzQ0YTMuLjkwNWYxNGQgMTAwNjQ0Ci0tLSBhL0RvYy91c2luZy9jbWRsaW5lLnJzdAorKysgYi9Eb2MvdXNpbmcvY21kbGluZS5yc3QKQEAgLTM5Nyw2ICszOTcsOCBAQAogICAgICBzdG9yZWQgaW4gYSB0cmFjZWJhY2sgb2YgYSB0cmFjZS4gVXNlIGBgLVggdHJhY2VtYWxsb2M9TkZSQU1FYGAgdG8gc3RhcnQKICAgICAgdHJhY2luZyB3aXRoIGEgdHJhY2ViYWNrIGxpbWl0IG9mICpORlJBTUUqIGZyYW1lcy4gU2VlIHRoZQogICAgICA6ZnVuYzpgdHJhY2VtYWxsb2Muc3RhcnRgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgKiBgYC1YIHNob3dhbGxvY2NvdW50YGAgdG8gZW5hYmxlIHRoZSBvdXRwdXQgb2YgdGhlIHRvdGFsIGNvdW50IG9mIGFsbG9jYXRlZAorICAgICBvYmplY3RzIGZvciBlYWNoIHR5cGUgKG9ubHkgd29ya3Mgd2hlbiBidWlsdCB3aXRoIGBgQ09VTlRfQUxMT0NTYGAgZGVmaW5lZCk7CiAKICAgIEl0IGFsc28gYWxsb3dzIHBhc3NpbmcgYXJiaXRyYXJ5IHZhbHVlcyBhbmQgcmV0cmlldmluZyB0aGVtIHRocm91Z2ggdGhlCiAgICA6ZGF0YTpgc3lzLl94b3B0aW9uc2AgZGljdGlvbmFyeS4KQEAgLTQxMCw2ICs0MTIsOSBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAgICAgICBUaGUgYGAtWCBzaG93cmVmY291bnRgYCBhbmQgYGAtWCB0cmFjZW1hbGxvY2BgIG9wdGlvbnMuCiAKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorICAgICAgVGhlIGBgLVggc2hvd2FsbG9jY291bnRgYCBvcHRpb24uCisKIAogT3B0aW9ucyB5b3Ugc2hvdWxkbid0IHVzZQogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpAQCAtNjIxLDYgKzYyNiw1NCBAQAogICAgLi4gdmVyc2lvbmFkZGVkOjogMy40CiAKIAorLi4gZW52dmFyOjogUFlUSE9OTUFMTE9DCisKKyAgIFNldCB0aGUgUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzIGFuZC9vciBpbnN0YWxsIGRlYnVnIGhvb2tzLgorCisgICBTZXQgdGhlIGZhbWlseSBvZiBtZW1vcnkgYWxsb2NhdG9ycyB1c2VkIGJ5IFB5dGhvbjoKKworICAgKiBgYG1hbGxvY2BgOiB1c2UgdGhlIDpjOmZ1bmM6YG1hbGxvY2AgZnVuY3Rpb24gb2YgdGhlIEMgbGlicmFyeQorICAgICBmb3IgYWxsIGRvbWFpbnMgKDpjOmRhdGE6YFBZTUVNX0RPTUFJTl9SQVdgLCA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCwKKyAgICAgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmApLgorICAgKiBgYHB5bWFsbG9jYGA6IHVzZSB0aGUgOnJlZjpgcHltYWxsb2MgYWxsb2NhdG9yIDxweW1hbGxvYz5gIGZvcgorICAgICA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCBhbmQgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX09CSmAgZG9tYWlucyBhbmQgdXNlCisgICAgIHRoZSA6YzpmdW5jOmBtYWxsb2NgIGZ1bmN0aW9uIGZvciB0aGUgOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX1JBV2AgZG9tYWluLgorCisgICBJbnN0YWxsIGRlYnVnIGhvb2tzOgorCisgICAqIGBgZGVidWdgYDogaW5zdGFsbCBkZWJ1ZyBob29rcyBvbiB0b3Agb2YgdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRvcgorICAgKiBgYG1hbGxvY19kZWJ1Z2BgOiBzYW1lIGFzIGBgbWFsbG9jYGAgYnV0IGFsc28gaW5zdGFsbCBkZWJ1ZyBob29rcworICAgKiBgYHB5bWFsbG9jX2RlYnVnYGA6IHNhbWUgYXMgYGBweW1hbGxvY2BgIGJ1dCBhbHNvIGluc3RhbGwgZGVidWcgaG9va3MKKworICAgV2hlbiBQeXRob24gaXMgY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLCB0aGUgZGVmYXVsdCBpcyBgYHB5bWFsbG9jYGAuIFdoZW4KKyAgIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUsIHRoZSBkZWZhdWx0IGlzIGBgcHltYWxsb2NfZGVidWdgYCBhbmQgdGhlIGRlYnVnIGhvb2tzCisgICBhcmUgdXNlZCBhdXRvbWF0aWNhbGx5LgorCisgICBJZiBQeXRob24gaXMgY29uZmlndXJlZCB3aXRob3V0IGBgcHltYWxsb2NgYCBzdXBwb3J0LCBgYHB5bWFsbG9jYGAgYW5kCisgICBgYHB5bWFsbG9jX2RlYnVnYGAgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBkZWZhdWx0IGlzIGBgbWFsbG9jYGAgaW4gcmVsZWFzZQorICAgbW9kZSBhbmQgYGBtYWxsb2NfZGVidWdgYCBpbiBkZWJ1ZyBtb2RlLgorCisgICBTZWUgdGhlIDpjOmZ1bmM6YFB5TWVtX1NldHVwRGVidWdIb29rc2AgZnVuY3Rpb24gZm9yIGRlYnVnIGhvb2tzIG9uIFB5dGhvbgorICAgbWVtb3J5IGFsbG9jYXRvcnMuCisKKyAgIC4uIHZlcnNpb25hZGRlZDo6IDMuNgorCisKKy4uIGVudnZhcjo6IFBZVEhPTk1BTExPQ1NUQVRTCisKKyAgIElmIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcsIFB5dGhvbiB3aWxsIHByaW50IHN0YXRpc3RpY3Mgb2YgdGhlCisgICA6cmVmOmBweW1hbGxvYyBtZW1vcnkgYWxsb2NhdG9yIDxweW1hbGxvYz5gIGV2ZXJ5IHRpbWUgYSBuZXcgcHltYWxsb2Mgb2JqZWN0CisgICBhcmVuYSBpcyBjcmVhdGVkLCBhbmQgb24gc2h1dGRvd24uCisKKyAgIFRoaXMgdmFyaWFibGUgaXMgaWdub3JlZCBpZiB0aGUgOmVudnZhcjpgUFlUSE9OTUFMTE9DYCBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgaXMgdXNlZCB0byBmb3JjZSB0aGUgOmM6ZnVuYzpgbWFsbG9jYCBhbGxvY2F0b3Igb2YgdGhlIEMgbGlicmFyeSwgb3IgaWYKKyAgIFB5dGhvbiBpcyBjb25maWd1cmVkIHdpdGhvdXQgYGBweW1hbGxvY2BgIHN1cHBvcnQuCisKKyAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisgICAgICBUaGlzIHZhcmlhYmxlIGNhbiBub3cgYWxzbyBiZSB1c2VkIG9uIFB5dGhvbiBjb21waWxlZCBpbiByZWxlYXNlIG1vZGUuCisgICAgICBJdCBub3cgaGFzIG5vIGVmZmVjdCBpZiBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLgorCisKIERlYnVnLW1vZGUgdmFyaWFibGVzCiB+fn5+fn5+fn5+fn5+fn5+fn5+fgogCkBAIC02MzYsOSArNjg5LDMgQEAKIAogICAgSWYgc2V0LCBQeXRob24gd2lsbCBkdW1wIG9iamVjdHMgYW5kIHJlZmVyZW5jZSBjb3VudHMgc3RpbGwgYWxpdmUgYWZ0ZXIKICAgIHNodXR0aW5nIGRvd24gdGhlIGludGVycHJldGVyLgotCi0KLS4uIGVudnZhcjo6IFBZVEhPTk1BTExPQ1NUQVRTCi0KLSAgIElmIHNldCwgUHl0aG9uIHdpbGwgcHJpbnQgbWVtb3J5IGFsbG9jYXRpb24gc3RhdGlzdGljcyBldmVyeSB0aW1lIGEgbmV3Ci0gICBvYmplY3QgYXJlbmEgaXMgY3JlYXRlZCwgYW5kIG9uIHNodXRkb3duLgpkaWZmIC0tZ2l0IGEvRG9jL3VzaW5nL2luZGV4LnJzdCBiL0RvYy91c2luZy9pbmRleC5yc3QKaW5kZXggNTAyYWZhOS4uYTVkZjcxMyAxMDA2NDQKLS0tIGEvRG9jL3VzaW5nL2luZGV4LnJzdAorKysgYi9Eb2MvdXNpbmcvaW5kZXgucnN0CkBAIC0xNyw0ICsxNywzIEBACiAgICB1bml4LnJzdAogICAgd2luZG93cy5yc3QKICAgIG1hYy5yc3QKLSAgIHNjcmlwdHMucnN0CmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvbWFjLnJzdCBiL0RvYy91c2luZy9tYWMucnN0CmluZGV4IDA1YzkxYmIuLjhmMWFjM2YgMTAwNjQ0Ci0tLSBhL0RvYy91c2luZy9tYWMucnN0CisrKyBiL0RvYy91c2luZy9tYWMucnN0CkBAIC0yNSw3ICsyNSw3IEBACiAKIFdoYXQgeW91IGdldCBhZnRlciBpbnN0YWxsaW5nIGlzIGEgbnVtYmVyIG9mIHRoaW5nczoKIAotKiBBIDpmaWxlOmBNYWNQeXRob24gMy41YCBmb2xkZXIgaW4geW91ciA6ZmlsZTpgQXBwbGljYXRpb25zYCBmb2xkZXIuIEluIGhlcmUKKyogQSA6ZmlsZTpgTWFjUHl0aG9uIDMuNmAgZm9sZGVyIGluIHlvdXIgOmZpbGU6YEFwcGxpY2F0aW9uc2AgZm9sZGVyLiBJbiBoZXJlCiAgIHlvdSBmaW5kIElETEUsIHRoZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCB0aGF0IGlzIGEgc3RhbmRhcmQgcGFydCBvZiBvZmZpY2lhbAogICBQeXRob24gZGlzdHJpYnV0aW9uczsgUHl0aG9uTGF1bmNoZXIsIHdoaWNoIGhhbmRsZXMgZG91YmxlLWNsaWNraW5nIFB5dGhvbgogICBzY3JpcHRzIGZyb20gdGhlIEZpbmRlcjsgYW5kIHRoZSAiQnVpbGQgQXBwbGV0IiB0b29sLCB3aGljaCBhbGxvd3MgeW91IHRvCkBAIC05Myw3ICs5Myw3IEBACiBhbnl0aGluZyB0aGF0IGhhcyBhIEdVSSkgbmVlZCB0byBiZSBydW4gaW4gYSBzcGVjaWFsIHdheS4gVXNlIDpwcm9ncmFtOmBweXRob253YAogaW5zdGVhZCBvZiA6cHJvZ3JhbTpgcHl0aG9uYCB0byBzdGFydCBzdWNoIHNjcmlwdHMuCiAKLVdpdGggUHl0aG9uIDMuNSwgeW91IGNhbiB1c2UgZWl0aGVyIDpwcm9ncmFtOmBweXRob25gIG9yIDpwcm9ncmFtOmBweXRob253YC4KK1dpdGggUHl0aG9uIDMuNiwgeW91IGNhbiB1c2UgZWl0aGVyIDpwcm9ncmFtOmBweXRob25gIG9yIDpwcm9ncmFtOmBweXRob253YC4KIAogCiBDb25maWd1cmF0aW9uCkBAIC0xNTksNyArMTU5LDcgQEAKIERpc3RyaWJ1dGluZyBQeXRob24gQXBwbGljYXRpb25zIG9uIHRoZSBNYWMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotVGhlICJCdWlsZCBBcHBsZXQiIHRvb2wgdGhhdCBpcyBwbGFjZWQgaW4gdGhlIE1hY1B5dGhvbiAzLjUgZm9sZGVyIGlzIGZpbmUgZm9yCitUaGUgIkJ1aWxkIEFwcGxldCIgdG9vbCB0aGF0IGlzIHBsYWNlZCBpbiB0aGUgTWFjUHl0aG9uIDMuNiBmb2xkZXIgaXMgZmluZSBmb3IKIHBhY2thZ2luZyBzbWFsbCBQeXRob24gc2NyaXB0cyBvbiB5b3VyIG93biBtYWNoaW5lIHRvIHJ1biBhcyBhIHN0YW5kYXJkIE1hYwogYXBwbGljYXRpb24uIFRoaXMgdG9vbCwgaG93ZXZlciwgaXMgbm90IHJvYnVzdCBlbm91Z2ggdG8gZGlzdHJpYnV0ZSBQeXRob24KIGFwcGxpY2F0aW9ucyB0byBvdGhlciB1c2Vycy4KZGlmZiAtLWdpdCBhL0RvYy91c2luZy9zY3JpcHRzLnJzdCBiL0RvYy91c2luZy9zY3JpcHRzLnJzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4NzQxNi4uMDAwMDAwMAotLS0gYS9Eb2MvdXNpbmcvc2NyaXB0cy5yc3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0uLiBfdG9vbHMtYW5kLXNjcmlwdHM6Ci0KLUFkZGl0aW9uYWwgVG9vbHMgYW5kIFNjcmlwdHMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLi4gX3NjcmlwdHMtcHl2ZW52OgotCi1weXZlbnYgLSBDcmVhdGluZyB2aXJ0dWFsIGVudmlyb25tZW50cwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLi4gaW5jbHVkZTo6IHZlbnYtY3JlYXRlLmluYwotCmRpZmYgLS1naXQgYS9Eb2MvdXNpbmcvdmVudi1jcmVhdGUuaW5jIGIvRG9jL3VzaW5nL3ZlbnYtY3JlYXRlLmluYwppbmRleCA3YWQzMDA4Li41M2Y0MzFiIDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvdmVudi1jcmVhdGUuaW5jCisrKyBiL0RvYy91c2luZy92ZW52LWNyZWF0ZS5pbmMKQEAgLTEsMzEgKzEsMzkgQEAKIENyZWF0aW9uIG9mIDpyZWY6YHZpcnR1YWwgZW52aXJvbm1lbnRzIDx2ZW52LWRlZj5gIGlzIGRvbmUgYnkgZXhlY3V0aW5nIHRoZQotYGBweXZlbnZgYCBzY3JpcHQ6OgorY29tbWFuZCBgYHZlbnZgYDo6CiAKLSAgICBweXZlbnYgL3BhdGgvdG8vbmV3L3ZpcnR1YWwvZW52aXJvbm1lbnQKKyAgICBweXRob24zIC1tIHZlbnYgL3BhdGgvdG8vbmV3L3ZpcnR1YWwvZW52aXJvbm1lbnQKIAogUnVubmluZyB0aGlzIGNvbW1hbmQgY3JlYXRlcyB0aGUgdGFyZ2V0IGRpcmVjdG9yeSAoY3JlYXRpbmcgYW55IHBhcmVudAogZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBleGlzdCBhbHJlYWR5KSBhbmQgcGxhY2VzIGEgYGBweXZlbnYuY2ZnYGAgZmlsZSBpbiBpdAotd2l0aCBhIGBgaG9tZWBgIGtleSBwb2ludGluZyB0byB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiB0aGUgY29tbWFuZCB3YXMgcnVuCi1mcm9tLiAgSXQgYWxzbyBjcmVhdGVzIGEgYGBiaW5gYCAob3IgYGBTY3JpcHRzYGAgb24gV2luZG93cykgc3ViZGlyZWN0b3J5Cit3aXRoIGEgYGBob21lYGAga2V5IHBvaW50aW5nIHRvIHRoZSBQeXRob24gaW5zdGFsbGF0aW9uIGZyb20gd2hpY2ggdGhlIGNvbW1hbmQKK3dhcyBydW4uICBJdCBhbHNvIGNyZWF0ZXMgYSBgYGJpbmBgIChvciBgYFNjcmlwdHNgYCBvbiBXaW5kb3dzKSBzdWJkaXJlY3RvcnkKIGNvbnRhaW5pbmcgYSBjb3B5IG9mIHRoZSBgYHB5dGhvbmBgIGJpbmFyeSAob3IgYmluYXJpZXMsIGluIHRoZSBjYXNlIG9mCiBXaW5kb3dzKS4gIEl0IGFsc28gY3JlYXRlcyBhbiAoaW5pdGlhbGx5IGVtcHR5KSBgYGxpYi9weXRob25YLlkvc2l0ZS1wYWNrYWdlc2BgCiBzdWJkaXJlY3RvcnkgKG9uIFdpbmRvd3MsIHRoaXMgaXMgYGBMaWJcc2l0ZS1wYWNrYWdlc2BgKS4KIAorLi4gZGVwcmVjYXRlZDo6IDMuNgorICAgYGBweXZlbnZgYCB3YXMgdGhlIHJlY29tbWVuZGVkIHRvb2wgZm9yIGNyZWF0aW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzIGZvcgorICAgUHl0aG9uIDMuMyBhbmQgMy40LCBhbmQgaXMgYGRlcHJlY2F0ZWQgaW4gUHl0aG9uIDMuNgorICAgPGh0dHBzOi8vZG9jcy5weXRob24ub3JnL2Rldi93aGF0c25ldy8zLjYuaHRtbCNkZXByZWNhdGVkLWZlYXR1cmVzPmBfLgorCisuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNQorICAgVGhlIHVzZSBvZiBgYHZlbnZgYCBpcyBub3cgcmVjb21tZW5kZWQgZm9yIGNyZWF0aW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzLgorCiAuLiBzZWVhbHNvOjoKIAogICAgYFB5dGhvbiBQYWNrYWdpbmcgVXNlciBHdWlkZTogQ3JlYXRpbmcgYW5kIHVzaW5nIHZpcnR1YWwgZW52aXJvbm1lbnRzCi0gICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvaW5zdGFsbGluZy8jY3JlYXRpbmctdmlydHVhbC1lbnZpcm9ubWVudHM+YF9fCisgICA8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9pbnN0YWxsaW5nLyNjcmVhdGluZy12aXJ0dWFsLWVudmlyb25tZW50cz5gX18KIAogLi4gaGlnaGxpZ2h0Ojogbm9uZQogCi1PbiBXaW5kb3dzLCB5b3UgbWF5IGhhdmUgdG8gaW52b2tlIHRoZSBgYHB5dmVudmBgIHNjcmlwdCBhcyBmb2xsb3dzLCBpZiB5b3UKLWRvbid0IGhhdmUgdGhlIHJlbGV2YW50IFBBVEggYW5kIFBBVEhFWFQgc2V0dGluZ3M6OgorT24gV2luZG93cywgaW52b2tlIHRoZSBgYHZlbnZgYCBjb21tYW5kIGFzIGZvbGxvd3M6OgogCi0gICAgYzpcVGVtcD5jOlxQeXRob24zNVxweXRob24gYzpcUHl0aG9uMzVcVG9vbHNcU2NyaXB0c1xweXZlbnYucHkgbXllbnYKKyAgICBjOlw+YzpcUHl0aG9uMzVccHl0aG9uIC1tIHZlbnYgYzpccGF0aFx0b1xteWVudgogCi1vciBlcXVpdmFsZW50bHk6OgorQWx0ZXJuYXRpdmVseSwgaWYgeW91IGNvbmZpZ3VyZWQgdGhlIGBgUEFUSGBgIGFuZCBgYFBBVEhFWFRgYCB2YXJpYWJsZXMgZm9yCit5b3VyIDpyZWY6YFB5dGhvbiBpbnN0YWxsYXRpb24gPHVzaW5nLW9uLXdpbmRvd3M+YDo6CiAKLSAgICBjOlxUZW1wPmM6XFB5dGhvbjM1XHB5dGhvbiAtbSB2ZW52IG15ZW52CisgICAgYzpcPnB5dGhvbiAtbSB2ZW52IG15ZW52IGM6XHBhdGhcdG9cbXllbnYKIAogVGhlIGNvbW1hbmQsIGlmIHJ1biB3aXRoIGBgLWhgYCwgd2lsbCBzaG93IHRoZSBhdmFpbGFibGUgb3B0aW9uczo6CiAKQEAgLTM2LDI1ICs0NCwyNiBAQAogICAgIENyZWF0ZXMgdmlydHVhbCBQeXRob24gZW52aXJvbm1lbnRzIGluIG9uZSBvciBtb3JlIHRhcmdldCBkaXJlY3Rvcmllcy4KIAogICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgotICAgICAgRU5WX0RJUiAgICAgICAgICAgICBBIGRpcmVjdG9yeSB0byBjcmVhdGUgdGhlIGVudmlyb25tZW50IGluLgorICAgICAgRU5WX0RJUiAgICAgICAgICAgICAgIEEgZGlyZWN0b3J5IHRvIGNyZWF0ZSB0aGUgZW52aXJvbm1lbnQgaW4uCiAKICAgICBvcHRpb25hbCBhcmd1bWVudHM6Ci0gICAgICAtaCwgLS1oZWxwICAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgICAgIC0tc3lzdGVtLXNpdGUtcGFja2FnZXMgR2l2ZSB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCBhY2Nlc3MgdG8gdGhlIHN5c3RlbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlLXBhY2thZ2VzIGRpci4KLSAgICAgIC0tc3ltbGlua3MgICAgICAgICAgICAgVHJ5IHRvIHVzZSBzeW1saW5rcyByYXRoZXIgdGhhbiBjb3BpZXMsIHdoZW4gc3ltbGlua3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIG5vdCB0aGUgZGVmYXVsdCBmb3IgdGhlIHBsYXRmb3JtLgotICAgICAgLS1jb3BpZXMgICAgICAgICAgICAgICBUcnkgdG8gdXNlIGNvcGllcyByYXRoZXIgdGhhbiBzeW1saW5rcywgZXZlbiB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWxpbmtzIGFyZSB0aGUgZGVmYXVsdCBmb3IgdGhlIHBsYXRmb3JtLgotICAgICAgLS1jbGVhciAgICAgICAgICAgICAgICBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnZpcm9ubWVudCBkaXJlY3RvcnkgaWYgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBleGlzdHMsIGJlZm9yZSBlbnZpcm9ubWVudCBjcmVhdGlvbi4KLSAgICAgIC0tdXBncmFkZSAgICAgICAgICAgICAgVXBncmFkZSB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IHRvIHVzZSB0aGlzIHZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgUHl0aG9uLCBhc3N1bWluZyBQeXRob24gaGFzIGJlZW4gdXBncmFkZWQgaW4tcGxhY2UuCi0gICAgICAtLXdpdGhvdXQtcGlwICAgICAgICAgIFNraXBzIGluc3RhbGxpbmcgb3IgdXBncmFkaW5nIHBpcCBpbiB0aGUgdmlydHVhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCAocGlwIGlzIGJvb3RzdHJhcHBlZCBieSBkZWZhdWx0KQorICAgICAgLWgsIC0taGVscCAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgIC0tc3lzdGVtLXNpdGUtcGFja2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHaXZlIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50IGFjY2VzcyB0byB0aGUgc3lzdGVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZS1wYWNrYWdlcyBkaXIuCisgICAgICAtLXN5bWxpbmtzICAgICAgICAgICAgVHJ5IHRvIHVzZSBzeW1saW5rcyByYXRoZXIgdGhhbiBjb3BpZXMsIHdoZW4gc3ltbGlua3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbm90IHRoZSBkZWZhdWx0IGZvciB0aGUgcGxhdGZvcm0uCisgICAgICAtLWNvcGllcyAgICAgICAgICAgICAgVHJ5IHRvIHVzZSBjb3BpZXMgcmF0aGVyIHRoYW4gc3ltbGlua3MsIGV2ZW4gd2hlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bWxpbmtzIGFyZSB0aGUgZGVmYXVsdCBmb3IgdGhlIHBsYXRmb3JtLgorICAgICAgLS1jbGVhciAgICAgICAgICAgICAgIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSBpZiBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3RzLCBiZWZvcmUgZW52aXJvbm1lbnQgY3JlYXRpb24uCisgICAgICAtLXVwZ3JhZGUgICAgICAgICAgICAgVXBncmFkZSB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IHRvIHVzZSB0aGlzIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBQeXRob24sIGFzc3VtaW5nIFB5dGhvbiBoYXMgYmVlbiB1cGdyYWRlZCBpbi1wbGFjZS4KKyAgICAgIC0td2l0aG91dC1waXAgICAgICAgICBTa2lwcyBpbnN0YWxsaW5nIG9yIHVwZ3JhZGluZyBwaXAgaW4gdGhlIHZpcnR1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCAocGlwIGlzIGJvb3RzdHJhcHBlZCBieSBkZWZhdWx0KQogCi1EZXBlbmRpbmcgb24gaG93IHRoZSBgYHZlbnZgYCBmdW5jdGlvbmFsaXR5IGhhcyBiZWVuIGludm9rZWQsIHRoZSB1c2FnZSBtZXNzYWdlCi1tYXkgdmFyeSBzbGlnaHRseSwgZS5nLiByZWZlcmVuY2luZyBgYHB5dmVudmBgIHJhdGhlciB0aGFuIGBgdmVudmBgLgorICAgIE9uY2UgYW4gZW52aXJvbm1lbnQgaGFzIGJlZW4gY3JlYXRlZCwgeW91IG1heSB3aXNoIHRvIGFjdGl2YXRlIGl0LCBlLmcuIGJ5CisgICAgc291cmNpbmcgYW4gYWN0aXZhdGUgc2NyaXB0IGluIGl0cyBiaW4gZGlyZWN0b3J5LgogCiAuLiB2ZXJzaW9uY2hhbmdlZDo6IDMuNAogICAgSW5zdGFsbHMgcGlwIGJ5IGRlZmF1bHQsIGFkZGVkIHRoZSBgYC0td2l0aG91dC1waXBgYCAgYW5kIGBgLS1jb3BpZXNgYApAQCAtNzMsMTIgKzgyLDEzIEBACiBVbmxlc3MgdGhlIGBgLS13aXRob3V0LXBpcGBgIG9wdGlvbiBpcyBnaXZlbiwgOm1vZDpgZW5zdXJlcGlwYCB3aWxsIGJlCiBpbnZva2VkIHRvIGJvb3RzdHJhcCBgYHBpcGBgIGludG8gdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuCiAKLU11bHRpcGxlIHBhdGhzIGNhbiBiZSBnaXZlbiB0byBgYHB5dmVudmBgLCBpbiB3aGljaCBjYXNlIGFuIGlkZW50aWNhbAotdmlydHVhbGVudiB3aWxsIGJlIGNyZWF0ZWQsIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gb3B0aW9ucywgYXQgZWFjaAotcHJvdmlkZWQgcGF0aC4KK011bHRpcGxlIHBhdGhzIGNhbiBiZSBnaXZlbiB0byBgYHZlbnZgYCwgaW4gd2hpY2ggY2FzZSBhbiBpZGVudGljYWwgdmlydHVhbAorZW52aXJvbm1lbnQgd2lsbCBiZSBjcmVhdGVkLCBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIG9wdGlvbnMsIGF0IGVhY2ggcHJvdmlkZWQKK3BhdGguCiAKLU9uY2UgYSB2ZW52IGhhcyBiZWVuIGNyZWF0ZWQsIGl0IGNhbiBiZSAiYWN0aXZhdGVkIiB1c2luZyBhIHNjcmlwdCBpbiB0aGUKLXZlbnYncyBiaW5hcnkgZGlyZWN0b3J5LiBUaGUgaW52b2NhdGlvbiBvZiB0aGUgc2NyaXB0IGlzIHBsYXRmb3JtLXNwZWNpZmljOgorT25jZSBhIHZpcnR1YWwgZW52aXJvbm1lbnQgaGFzIGJlZW4gY3JlYXRlZCwgaXQgY2FuIGJlICJhY3RpdmF0ZWQiIHVzaW5nIGEKK3NjcmlwdCBpbiB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCdzIGJpbmFyeSBkaXJlY3RvcnkuIFRoZSBpbnZvY2F0aW9uIG9mIHRoZQorc2NyaXB0IGlzIHBsYXRmb3JtLXNwZWNpZmljOgogCiArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIHwgUGxhdGZvcm0gICAgfCBTaGVsbCAgICAgICAgICAgfCBDb21tYW5kIHRvIGFjdGl2YXRlIHZpcnR1YWwgZW52aXJvbm1lbnQgfApAQCAtOTUsMTYgKzEwNSwxNyBAQAogKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAKIFlvdSBkb24ndCBzcGVjaWZpY2FsbHkgKm5lZWQqIHRvIGFjdGl2YXRlIGFuIGVudmlyb25tZW50OyBhY3RpdmF0aW9uIGp1c3QKLXByZXBlbmRzIHRoZSB2ZW52J3MgYmluYXJ5IGRpcmVjdG9yeSB0byB5b3VyIHBhdGgsIHNvIHRoYXQgInB5dGhvbiIgaW52b2tlcyB0aGUKLXZlbnYncyBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIHlvdSBjYW4gcnVuIGluc3RhbGxlZCBzY3JpcHRzIHdpdGhvdXQgaGF2aW5nIHRvCi11c2UgdGhlaXIgZnVsbCBwYXRoLiBIb3dldmVyLCBhbGwgc2NyaXB0cyBpbnN0YWxsZWQgaW4gYSB2ZW52IHNob3VsZCBiZQotcnVubmFibGUgd2l0aG91dCBhY3RpdmF0aW5nIGl0LCBhbmQgcnVuIHdpdGggdGhlIHZlbnYncyBQeXRob24gYXV0b21hdGljYWxseS4KK3ByZXBlbmRzIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50J3MgYmluYXJ5IGRpcmVjdG9yeSB0byB5b3VyIHBhdGgsIHNvIHRoYXQKKyJweXRob24iIGludm9rZXMgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQncyBQeXRob24gaW50ZXJwcmV0ZXIgYW5kIHlvdSBjYW4gcnVuCitpbnN0YWxsZWQgc2NyaXB0cyB3aXRob3V0IGhhdmluZyB0byB1c2UgdGhlaXIgZnVsbCBwYXRoLiBIb3dldmVyLCBhbGwgc2NyaXB0cworaW5zdGFsbGVkIGluIGEgdmlydHVhbCBlbnZpcm9ubWVudCBzaG91bGQgYmUgcnVubmFibGUgd2l0aG91dCBhY3RpdmF0aW5nIGl0LAorYW5kIHJ1biB3aXRoIHRoZSB2aXJ0dWFsIGVudmlyb25tZW50J3MgUHl0aG9uIGF1dG9tYXRpY2FsbHkuCiAKLVlvdSBjYW4gZGVhY3RpdmF0ZSBhIHZlbnYgYnkgdHlwaW5nICJkZWFjdGl2YXRlIiBpbiB5b3VyIHNoZWxsLiBUaGUgZXhhY3QKLW1lY2hhbmlzbSBpcyBwbGF0Zm9ybS1zcGVjaWZpYzogZm9yIGV4YW1wbGUsIHRoZSBCYXNoIGFjdGl2YXRpb24gc2NyaXB0IGRlZmluZXMKLWEgImRlYWN0aXZhdGUiIGZ1bmN0aW9uLCB3aGVyZWFzIG9uIFdpbmRvd3MgdGhlcmUgYXJlIHNlcGFyYXRlIHNjcmlwdHMgY2FsbGVkCi1gYGRlYWN0aXZhdGUuYmF0YGAgYW5kIGBgRGVhY3RpdmF0ZS5wczFgYCB3aGljaCBhcmUgaW5zdGFsbGVkIHdoZW4gdGhlIHZlbnYgaXMKLWNyZWF0ZWQuCitZb3UgY2FuIGRlYWN0aXZhdGUgYSB2aXJ0dWFsIGVudmlyb25tZW50IGJ5IHR5cGluZyAiZGVhY3RpdmF0ZSIgaW4geW91ciBzaGVsbC4KK1RoZSBleGFjdCBtZWNoYW5pc20gaXMgcGxhdGZvcm0tc3BlY2lmaWM6IGZvciBleGFtcGxlLCB0aGUgQmFzaCBhY3RpdmF0aW9uCitzY3JpcHQgZGVmaW5lcyBhICJkZWFjdGl2YXRlIiBmdW5jdGlvbiwgd2hlcmVhcyBvbiBXaW5kb3dzIHRoZXJlIGFyZSBzZXBhcmF0ZQorc2NyaXB0cyBjYWxsZWQgYGBkZWFjdGl2YXRlLmJhdGBgIGFuZCBgYERlYWN0aXZhdGUucHMxYGAgd2hpY2ggYXJlIGluc3RhbGxlZAord2hlbiB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCBpcyBjcmVhdGVkLgogCiAuLiB2ZXJzaW9uYWRkZWQ6OiAzLjQKICAgIGBgZmlzaGBgIGFuZCBgYGNzaGBgIGFjdGl2YXRpb24gc2NyaXB0cy4KZGlmZiAtLWdpdCBhL0RvYy91c2luZy93aW5kb3dzLnJzdCBiL0RvYy91c2luZy93aW5kb3dzLnJzdAppbmRleCA3NTIwZDYwLi4yMzk5Mjc4IDEwMDY0NAotLS0gYS9Eb2MvdXNpbmcvd2luZG93cy5yc3QKKysrIGIvRG9jL3VzaW5nL3dpbmRvd3MucnN0CkBAIC00MTgsNiArNDE4LDggQEAKIEZyb20gdGhlIGNvbW1hbmQtbGluZQogXl5eXl5eXl5eXl5eXl5eXl5eXl5eCiAKKy4uIHZlcnNpb25jaGFuZ2VkOjogMy42CisKIFN5c3RlbS13aWRlIGluc3RhbGxhdGlvbnMgb2YgUHl0aG9uIDMuMyBhbmQgbGF0ZXIgd2lsbCBwdXQgdGhlIGxhdW5jaGVyIG9uIHlvdXIKIDplbnZ2YXI6YFBBVEhgLiBUaGUgbGF1bmNoZXIgaXMgY29tcGF0aWJsZSB3aXRoIGFsbCBhdmFpbGFibGUgdmVyc2lvbnMgb2YKIFB5dGhvbiwgc28gaXQgZG9lcyBub3QgbWF0dGVyIHdoaWNoIHZlcnNpb24gaXMgaW5zdGFsbGVkLiBUbyBjaGVjayB0aGF0IHRoZQpAQCAtNDI3LDI1ICs0MjksMjYgQEAKIAogICBweQogCi1Zb3Ugc2hvdWxkIGZpbmQgdGhhdCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgUHl0aG9uIDIueCB5b3UgaGF2ZSBpbnN0YWxsZWQgaXMKK1lvdSBzaG91bGQgZmluZCB0aGF0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBQeXRob24geW91IGhhdmUgaW5zdGFsbGVkIGlzCiBzdGFydGVkIC0gaXQgY2FuIGJlIGV4aXRlZCBhcyBub3JtYWwsIGFuZCBhbnkgYWRkaXRpb25hbCBjb21tYW5kLWxpbmUKIGFyZ3VtZW50cyBzcGVjaWZpZWQgd2lsbCBiZSBzZW50IGRpcmVjdGx5IHRvIFB5dGhvbi4KIAotSWYgeW91IGhhdmUgbXVsdGlwbGUgdmVyc2lvbnMgb2YgUHl0aG9uIDIueCBpbnN0YWxsZWQgKGUuZy4sIDIuNiBhbmQgMi43KSB5b3UKLXdpbGwgaGF2ZSBub3RpY2VkIHRoYXQgUHl0aG9uIDIuNyB3YXMgc3RhcnRlZCAtIHRvIGxhdW5jaCBQeXRob24gMi42LCB0cnkgdGhlCitJZiB5b3UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBQeXRob24gaW5zdGFsbGVkIChlLmcuLCAyLjcgYW5kIDMuNikgeW91Cit3aWxsIGhhdmUgbm90aWNlZCB0aGF0IFB5dGhvbiAzLjYgd2FzIHN0YXJ0ZWQgLSB0byBsYXVuY2ggUHl0aG9uIDIuNywgdHJ5IHRoZQogY29tbWFuZDoKIAogOjoKIAotICBweSAtMi42CisgIHB5IC0yLjcKIAotSWYgeW91IGhhdmUgYSBQeXRob24gMy54IGluc3RhbGxlZCwgdHJ5IHRoZSBjb21tYW5kOgorSWYgeW91IHdhbnQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiAyLnggeW91IGhhdmUgaW5zdGFsbGVkLCB0cnkgdGhlCitjb21tYW5kOgogCiA6OgogCi0gIHB5IC0zCisgIHB5IC0yCiAKLVlvdSBzaG91bGQgZmluZCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgUHl0aG9uIDMueCBzdGFydHMuCitZb3Ugc2hvdWxkIGZpbmQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFB5dGhvbiAyLnggc3RhcnRzLgogCiBJZiB5b3Ugc2VlIHRoZSBmb2xsb3dpbmcgZXJyb3IsIHlvdSBkbyBub3QgaGF2ZSB0aGUgbGF1bmNoZXIgaW5zdGFsbGVkOgogCkBAIC01MDAsNiArNTAzLDExIEBACiBmaXJzdCBsaW5lIHRvIGBgIyEgcHl0aG9uMi42YGAgYW5kIHlvdSBzaG91bGQgZmluZCB0aGUgMi42IHZlcnNpb24KIGluZm9ybWF0aW9uIHByaW50ZWQuCiAKK05vdGUgdGhhdCB1bmxpa2UgaW50ZXJhY3RpdmUgdXNlLCBhIGJhcmUgInB5dGhvbiIgd2lsbCB1c2UgdGhlIGxhdGVzdAordmVyc2lvbiBvZiBQeXRob24gMi54IHRoYXQgeW91IGhhdmUgaW5zdGFsbGVkLiAgVGhpcyBpcyBmb3IgYmFja3dhcmQKK2NvbXBhdGliaWxpdHkgYW5kIGZvciBjb21wYXRpYmlsaXR5IHdpdGggVW5peCwgd2hlcmUgdGhlIGNvbW1hbmQgYGBweXRob25gYAordHlwaWNhbGx5IHJlZmVycyB0byBQeXRob24gMi4KKwogRnJvbSBmaWxlIGFzc29jaWF0aW9ucwogXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvMi4xLnJzdCBiL0RvYy93aGF0c25ldy8yLjEucnN0CmluZGV4IDA2MzY2YjguLjZhYWU3MjYgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy8yLjEucnN0CisrKyBiL0RvYy93aGF0c25ldy8yLjEucnN0CkBAIC0zNjcsNyArMzY3LDcgQEAKIAogVGhpcyB2ZXJzaW9uIHdvcmtzIGZvciBzaW1wbGUgdGhpbmdzIHN1Y2ggYXMgaW50ZWdlcnMsIGJ1dCBpdCBoYXMgYSBzaWRlIGVmZmVjdDsKIHRoZSBgYF9jYWNoZWBgIGRpY3Rpb25hcnkgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIHJldHVybiB2YWx1ZXMsIHNvIHRoZXknbGwKLW5ldmVyIGJlIGRlYWxsb2NhdGVkIHVudGlsIHRoZSBQeXRob24gcHJvY2VzcyBleGl0cyBhbmQgY2xlYW5zIHVwIFRoaXMgaXNuJ3QKK25ldmVyIGJlIGRlYWxsb2NhdGVkIHVudGlsIHRoZSBQeXRob24gcHJvY2VzcyBleGl0cyBhbmQgY2xlYW5zIHVwLiBUaGlzIGlzbid0CiB2ZXJ5IG5vdGljZWFibGUgZm9yIGludGVnZXJzLCBidXQgaWYgOmZ1bmM6YGZgIHJldHVybnMgYW4gb2JqZWN0LCBvciBhIGRhdGEKIHN0cnVjdHVyZSB0aGF0IHRha2VzIHVwIGEgbG90IG9mIG1lbW9yeSwgdGhpcyBjYW4gYmUgYSBwcm9ibGVtLgogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvMy4zLnJzdCBiL0RvYy93aGF0c25ldy8zLjMucnN0CmluZGV4IDIwOTZiMGIuLjkyMjBiYzcgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy8zLjMucnN0CisrKyBiL0RvYy93aGF0c25ldy8zLjMucnN0CkBAIC0xMDgsNyArMTA4LDcgQEAKIHdpdGggdGhlIGludGVycHJldGVyIGNvcmUuCiAKIFRoaXMgUEVQIGFkZHMgdGhlIDptb2Q6YHZlbnZgIG1vZHVsZSBmb3IgcHJvZ3JhbW1hdGljIGFjY2VzcywgYW5kIHRoZQotOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIHNjcmlwdCBmb3IgY29tbWFuZC1saW5lIGFjY2VzcyBhbmQKK2BgcHl2ZW52YGAgc2NyaXB0IGZvciBjb21tYW5kLWxpbmUgYWNjZXNzIGFuZAogYWRtaW5pc3RyYXRpb24uICBUaGUgUHl0aG9uIGludGVycHJldGVyIGNoZWNrcyBmb3IgYSBgYHB5dmVudi5jZmdgYCwKIGZpbGUgd2hvc2UgZXhpc3RlbmNlIHNpZ25hbHMgdGhlIGJhc2Ugb2YgYSB2aXJ0dWFsIGVudmlyb25tZW50J3MgZGlyZWN0b3J5CiB0cmVlLgpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3LzMuNC5yc3QgYi9Eb2Mvd2hhdHNuZXcvMy40LnJzdAppbmRleCAxZTVjOWQxLi4yYTIzY2JjIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvMy40LnJzdAorKysgYi9Eb2Mvd2hhdHNuZXcvMy40LnJzdApAQCAtMTk3LDcgKzE5Nyw3IEBACiBgYHBpcGBgIGNvbW1hbmQgdHlwaWNhbGx5IHJlZmVycyB0byB0aGUgc2VwYXJhdGVseSBpbnN0YWxsZWQgUHl0aG9uIDIKIHZlcnNpb24uCiAKLVRoZSA6cmVmOmBweXZlbnYgPHNjcmlwdHMtcHl2ZW52PmAgY29tbWFuZCBsaW5lIHV0aWxpdHkgYW5kIHRoZSA6bW9kOmB2ZW52YAorVGhlIGBgcHl2ZW52YGAgY29tbWFuZCBsaW5lIHV0aWxpdHkgYW5kIHRoZSA6bW9kOmB2ZW52YAogbW9kdWxlIG1ha2UgdXNlIG9mIHRoZSA6bW9kOmBlbnN1cmVwaXBgIG1vZHVsZSB0byBtYWtlIGBgcGlwYGAgcmVhZGlseQogYXZhaWxhYmxlIGluIHZpcnR1YWwgZW52aXJvbm1lbnRzLiBXaGVuIHVzaW5nIHRoZSBjb21tYW5kIGxpbmUgdXRpbGl0eSwKIGBgcGlwYGAgaXMgaW5zdGFsbGVkIGJ5IGRlZmF1bHQsIHdoaWxlIHdoZW4gdXNpbmcgdGhlIDptb2Q6YHZlbnZgIG1vZHVsZQpAQCAtMTk4OSwxMSArMTk4OSwxMSBAQAogICBTdGlubmVyIHVzaW5nIGhpcyA6cGVwOmA0NDVgLWJhc2VkIGBgcHlmYWlsbWFsbG9jYGAgdG9vbCAoOmlzc3VlOmAxODQwOGAsCiAgIDppc3N1ZTpgMTg1MjBgKS4KIAotKiBUaGUgOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIGNvbW1hbmQgbm93IGFjY2VwdHMgYSBgYC0tY29waWVzYGAgb3B0aW9uCisqIFRoZSBgYHB5dmVudmBgIGNvbW1hbmQgbm93IGFjY2VwdHMgYSBgYC0tY29waWVzYGAgb3B0aW9uCiAgIHRvIHVzZSBjb3BpZXMgcmF0aGVyIHRoYW4gc3ltbGlua3MgZXZlbiBvbiBzeXN0ZW1zIHdoZXJlIHN5bWxpbmtzIGFyZSB0aGUKICAgZGVmYXVsdC4gIChDb250cmlidXRlZCBieSBWaW5heSBTYWppcCBpbiA6aXNzdWU6YDE4ODA3YC4pCiAKLSogVGhlIDpyZWY6YHB5dmVudiA8c2NyaXB0cy1weXZlbnY+YCBjb21tYW5kIGFsc28gYWNjZXB0cyBhIGBgLS13aXRob3V0LXBpcGBgCisqIFRoZSBgYHB5dmVudmBgIGNvbW1hbmQgYWxzbyBhY2NlcHRzIGEgYGAtLXdpdGhvdXQtcGlwYGAKICAgb3B0aW9uIHRvIHN1cHByZXNzIHRoZSBvdGhlcndpc2UtYXV0b21hdGljIGJvb3RzdHJhcHBpbmcgb2YgcGlwIGludG8KICAgdGhlIHZpcnR1YWwgZW52aXJvbm1lbnQuICAoQ29udHJpYnV0ZWQgYnkgTmljayBDb2dobGFuIGluIDppc3N1ZTpgMTk1NTJgCiAgIGFzIHBhcnQgb2YgdGhlIDpwZXA6YDQ1M2AgaW1wbGVtZW50YXRpb24uKQpAQCAtMjQ1OSw3ICsyNDU5LDcgQEAKICAgc3RyZWFtIGluIDptb2Q6YH5pby5UZXh0SU9XcmFwcGVyYCB0byB1c2UgaXRzICpuZXdsaW5lKiBhcmd1bWVudAogICAoOmlzc3VlOmAxNTIwNGApLgogCi0qIElmIHlvdSB1c2UgOnJlZjpgcHl2ZW52IDxzY3JpcHRzLXB5dmVudj5gIGluIGEgc2NyaXB0IGFuZCBkZXNpcmUgdGhhdCBwaXAKKyogSWYgeW91IHVzZSBgYHB5dmVudmBgIGluIGEgc2NyaXB0IGFuZCBkZXNpcmUgdGhhdCBwaXAKICAgKm5vdCogYmUgaW5zdGFsbGVkLCB5b3UgbXVzdCBhZGQgYGAtLXdpdGhvdXQtcGlwYGAgdG8geW91ciBjb21tYW5kCiAgIGludm9jYXRpb24uCiAKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy8zLjYucnN0IGIvRG9jL3doYXRzbmV3LzMuNi5yc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzODAwYwotLS0gL2Rldi9udWxsCisrKyBiL0RvYy93aGF0c25ldy8zLjYucnN0CkBAIC0wLDAgKzEsNzUzIEBACisqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFdoYXQncyBOZXcgSW4gUHl0aG9uIDMuNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis6UmVsZWFzZTogfHJlbGVhc2V8Cis6RGF0ZTogfHRvZGF5fAorCisuLiBSdWxlcyBmb3IgbWFpbnRlbmFuY2U6CisKKyAgICogQW55b25lIGNhbiBhZGQgdGV4dCB0byB0aGlzIGRvY3VtZW50LiAgRG8gbm90IHNwZW5kIHZlcnkgbXVjaCB0aW1lCisgICBvbiB0aGUgd29yZGluZyBvZiB5b3VyIGNoYW5nZXMsIGJlY2F1c2UgeW91ciB0ZXh0IHdpbGwgcHJvYmFibHkKKyAgIGdldCByZXdyaXR0ZW4gdG8gc29tZSBkZWdyZWUuCisKKyAgICogVGhlIG1haW50YWluZXIgd2lsbCBnbyB0aHJvdWdoIE1pc2MvTkVXUyBwZXJpb2RpY2FsbHkgYW5kIGFkZAorICAgY2hhbmdlczsgaXQncyB0aGVyZWZvcmUgbW9yZSBpbXBvcnRhbnQgdG8gYWRkIHlvdXIgY2hhbmdlcyB0bworICAgTWlzYy9ORVdTIHRoYW4gdG8gdGhpcyBmaWxlLgorCisgICAqIFRoaXMgaXMgbm90IGEgY29tcGxldGUgbGlzdCBvZiBldmVyeSBzaW5nbGUgY2hhbmdlOyBjb21wbGV0ZW5lc3MKKyAgIGlzIHRoZSBwdXJwb3NlIG9mIE1pc2MvTkVXUy4gIFNvbWUgY2hhbmdlcyBJIGNvbnNpZGVyIHRvbyBzbWFsbAorICAgb3IgZXNvdGVyaWMgdG8gaW5jbHVkZS4gIElmIHN1Y2ggYSBjaGFuZ2UgaXMgYWRkZWQgdG8gdGhlIHRleHQsCisgICBJJ2xsIGp1c3QgcmVtb3ZlIGl0LiAgKFRoaXMgaXMgYW5vdGhlciByZWFzb24geW91IHNob3VsZG4ndCBzcGVuZAorICAgdG9vIG11Y2ggdGltZSBvbiB3cml0aW5nIHlvdXIgYWRkaXRpb24uKQorCisgICAqIElmIHlvdSB3YW50IHRvIGRyYXcgeW91ciBuZXcgdGV4dCB0byB0aGUgYXR0ZW50aW9uIG9mIHRoZQorICAgbWFpbnRhaW5lciwgYWRkICdYWFgnIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcmFncmFwaCBvcgorICAgc2VjdGlvbi4KKworICAgKiBJdCdzIE9LIHRvIGp1c3QgYWRkIGEgZnJhZ21lbnRhcnkgbm90ZSBhYm91dCBhIGNoYW5nZS4gIEZvcgorICAgZXhhbXBsZTogIlhYWCBEZXNjcmliZSB0aGUgdHJhbnNtb2dyaWZ5KCkgZnVuY3Rpb24gYWRkZWQgdG8gdGhlCisgICBzb2NrZXQgbW9kdWxlLiIgIFRoZSBtYWludGFpbmVyIHdpbGwgcmVzZWFyY2ggdGhlIGNoYW5nZSBhbmQKKyAgIHdyaXRlIHRoZSBuZWNlc3NhcnkgdGV4dC4KKworICAgKiBZb3UgY2FuIGNvbW1lbnQgb3V0IHlvdXIgYWRkaXRpb25zIGlmIHlvdSBsaWtlLCBidXQgaXQncyBub3QKKyAgIG5lY2Vzc2FyeSAoZXNwZWNpYWxseSB3aGVuIGEgZmluYWwgcmVsZWFzZSBpcyBzb21lIG1vbnRocyBhd2F5KS4KKworICAgKiBDcmVkaXQgdGhlIGF1dGhvciBvZiBhIHBhdGNoIG9yIGJ1Z2ZpeC4gICBKdXN0IHRoZSBuYW1lIGlzCisgICBzdWZmaWNpZW50OyB0aGUgZS1tYWlsIGFkZHJlc3MgaXNuJ3QgbmVjZXNzYXJ5LgorCisgICAqIEl0J3MgaGVscGZ1bCB0byBhZGQgdGhlIGJ1Zy9wYXRjaCBudW1iZXIgYXMgYSBjb21tZW50OgorCisgICBYWFggRGVzY3JpYmUgdGhlIHRyYW5zbW9ncmlmeSgpIGZ1bmN0aW9uIGFkZGVkIHRvIHRoZSBzb2NrZXQKKyAgIG1vZHVsZS4KKyAgIChDb250cmlidXRlZCBieSBQLlkuIERldmVsb3BlciBpbiA6aXNzdWU6YDEyMzQ1YC4pCisKKyAgIFRoaXMgc2F2ZXMgdGhlIG1haW50YWluZXIgdGhlIGVmZm9ydCBvZiBnb2luZyB0aHJvdWdoIHRoZSBNZXJjdXJpYWwgbG9nCisgICB3aGVuIHJlc2VhcmNoaW5nIGEgY2hhbmdlLgorCitUaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIG5ldyBmZWF0dXJlcyBpbiBQeXRob24gMy42LCBjb21wYXJlZCB0byAzLjUuCisKK0ZvciBmdWxsIGRldGFpbHMsIHNlZSB0aGUgOnNvdXJjZTpgTWlzYy9ORVdTYCBmaWxlLgorCisuLiBub3RlOjoKKworICAgUHJlcmVsZWFzZSB1c2VycyBzaG91bGQgYmUgYXdhcmUgdGhhdCB0aGlzIGRvY3VtZW50IGlzIGN1cnJlbnRseSBpbiBkcmFmdAorICAgZm9ybS4gSXQgd2lsbCBiZSB1cGRhdGVkIHN1YnN0YW50aWFsbHkgYXMgUHl0aG9uIDMuNiBtb3ZlcyB0b3dhcmRzIHJlbGVhc2UsCisgICBzbyBpdCdzIHdvcnRoIGNoZWNraW5nIGJhY2sgZXZlbiBhZnRlciByZWFkaW5nIGVhcmxpZXIgdmVyc2lvbnMuCisKKworU3VtbWFyeSAtLSBSZWxlYXNlIGhpZ2hsaWdodHMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy4uIFRoaXMgc2VjdGlvbiBzaW5nbGVzIG91dCB0aGUgbW9zdCBpbXBvcnRhbnQgY2hhbmdlcyBpbiBQeXRob24gMy42LgorICAgQnJldml0eSBpcyBrZXkuCisKK05ldyBzeW50YXggZmVhdHVyZXM6CisKKyogUEVQIDQ5ODogOnJlZjpgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscyA8d2hhdHNuZXctZnN0cmluZ3M+YAorCitXaW5kb3dzIGltcHJvdmVtZW50czoKKworKiBUaGUgYGBweS5leGVgYCBsYXVuY2hlciwgd2hlbiB1c2VkIGludGVyYWN0aXZlbHksIG5vIGxvbmdlciBwcmVmZXJzCisgIFB5dGhvbiAyIG92ZXIgUHl0aG9uIDMgd2hlbiB0aGUgdXNlciBkb2Vzbid0IHNwZWNpZnkgYSB2ZXJzaW9uICh2aWEKKyAgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBvciBhIGNvbmZpZyBmaWxlKS4gIEhhbmRsaW5nIG9mIHNoZWJhbmcgbGluZXMKKyAgcmVtYWlucyB1bmNoYW5nZWQgLSAicHl0aG9uIiByZWZlcnMgdG8gUHl0aG9uIDIgaW4gdGhhdCBjYXNlLgorCisuLiBQRVAtc2l6ZWQgaXRlbXMgbmV4dC4KKworLi4gX3BlcC00WFg6CisKKy4uIFBFUCA0WFg6IFZpcnR1YWwgRW52aXJvbm1lbnRzCisuLiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKy4uIChJbXBsZW1lbnRlZCBieSBGb28gQmFyLikKKworLi4gLi4gc2VlYWxzbzo6CisKKyAgICA6cGVwOmA0WFhgIC0gUHl0aG9uIFZpcnR1YWwgRW52aXJvbm1lbnRzCisgICAgICAgUEVQIHdyaXR0ZW4gYnkgQ2FybCBNZXllcgorCisKK05ldyBGZWF0dXJlcworPT09PT09PT09PT09CisKKy4uIF93aGF0c25ldy1mc3RyaW5nczoKKworUEVQIDQ5ODogRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFyZSBhIG5ldyBraW5kIG9mIHN0cmluZyBsaXRlcmFsLCBwcmVmaXhlZAord2l0aCBgYCdmJ2BgLiAgVGhleSBhcmUgc2ltaWxhciB0byB0aGUgZm9ybWF0IHN0cmluZ3MgYWNjZXB0ZWQgYnkKKzptZXRoOmBzdHIuZm9ybWF0YC4gIFRoZXkgY29udGFpbiByZXBsYWNlbWVudCBmaWVsZHMgc3Vycm91bmRlZCBieQorY3VybHkgYnJhY2VzLiAgVGhlIHJlcGxhY2VtZW50IGZpZWxkcyBhcmUgZXhwcmVzc2lvbnMsIHdoaWNoIGFyZQorZXZhbHVhdGVkIGF0IHJ1biB0aW1lLCBhbmQgdGhlbiBmb3JtYXR0ZWQgdXNpbmcgdGhlIDpmdW5jOmBmb3JtYXRgIHByb3RvY29sLgorCisgICAgPj4+IG5hbWUgPSAiRnJlZCIKKyAgICA+Pj4gZiJIZSBzYWlkIGhpcyBuYW1lIGlzIHtuYW1lfS4iCisgICAgJ0hlIHNhaWQgaGlzIG5hbWUgaXMgRnJlZC4nCisKK1NlZSA6cGVwOmA0OThgIGFuZCB0aGUgbWFpbiBkb2N1bWVudGF0aW9uIGF0IDpyZWY6YGYtc3RyaW5nc2AuCisKKworUFlUSE9OTUFMTE9DIGVudmlyb25tZW50IHZhcmlhYmxlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG5ldyA6ZW52dmFyOmBQWVRIT05NQUxMT0NgIGVudmlyb25tZW50IHZhcmlhYmxlIGFsbG93cyBzZXR0aW5nIHRoZSBQeXRob24KK21lbW9yeSBhbGxvY2F0b3JzIGFuZC9vciBpbnN0YWxsIGRlYnVnIGhvb2tzLgorCitJdCBpcyBub3cgcG9zc2libGUgdG8gaW5zdGFsbCBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgb24gUHl0aG9uCitjb21waWxlZCBpbiByZWxlYXNlIG1vZGUgdXNpbmcgYGBQWVRIT05NQUxMT0M9ZGVidWdgYC4gRWZmZWN0cyBvZiBkZWJ1ZyBob29rczoKKworKiBOZXdseSBhbGxvY2F0ZWQgbWVtb3J5IGlzIGZpbGxlZCB3aXRoIHRoZSBieXRlIGBgMHhDQmBgCisqIEZyZWVkIG1lbW9yeSBpcyBmaWxsZWQgd2l0aCB0aGUgYnl0ZSBgYDB4REJgYAorKiBEZXRlY3QgdmlvbGF0aW9ucyBvZiBQeXRob24gbWVtb3J5IGFsbG9jYXRvciBBUEkuIEZvciBleGFtcGxlLAorICA6YzpmdW5jOmBQeU9iamVjdF9GcmVlYCBjYWxsZWQgb24gYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGJ5CisgIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AuCisqIERldGVjdCB3cml0ZSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKGJ1ZmZlciB1bmRlcmZsb3cpCisqIERldGVjdCB3cml0ZSBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKGJ1ZmZlciBvdmVyZmxvdykKKyogQ2hlY2sgdGhhdCB0aGUgOnRlcm06YEdJTCA8Z2xvYmFsIGludGVycHJldGVyIGxvY2s+YCBpcyBoZWxkIHdoZW4gYWxsb2NhdG9yCisgIGZ1bmN0aW9ucyBvZiA6YzpkYXRhOmBQWU1FTV9ET01BSU5fT0JKYCAoZXg6IDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2ApIGFuZAorICA6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCAoZXg6IDpjOmZ1bmM6YFB5TWVtX01hbGxvY2ApIGRvbWFpbnMgYXJlIGNhbGxlZC4KKworQ2hlY2tpbmcgaWYgdGhlIEdJTCBpcyBoZWxkIGlzIGFsc28gYSBuZXcgZmVhdHVyZSBvZiBQeXRob24gMy42LgorCitTZWUgdGhlIDpjOmZ1bmM6YFB5TWVtX1NldHVwRGVidWdIb29rc2AgZnVuY3Rpb24gZm9yIGRlYnVnIGhvb2tzIG9uIFB5dGhvbgorbWVtb3J5IGFsbG9jYXRvcnMuCisKK0l0IGlzIG5vdyBhbHNvIHBvc3NpYmxlIHRvIGZvcmNlIHRoZSB1c2FnZSBvZiB0aGUgOmM6ZnVuYzpgbWFsbG9jYCBhbGxvY2F0b3Igb2YKK3RoZSBDIGxpYnJhcnkgZm9yIGFsbCBQeXRob24gbWVtb3J5IGFsbG9jYXRpb25zIHVzaW5nIGBgUFlUSE9OTUFMTE9DPW1hbGxvY2BgLgorSXQgaGVscHMgdG8gdXNlIGV4dGVybmFsIG1lbW9yeSBkZWJ1Z2dlcnMgbGlrZSBWYWxncmluZCBvbiBhIFB5dGhvbiBjb21waWxlZCBpbgorcmVsZWFzZSBtb2RlLgorCitPbiBlcnJvciwgdGhlIGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9ycyBub3cgdXNlIHRoZQorOm1vZDpgdHJhY2VtYWxsb2NgIG1vZHVsZSB0byBnZXQgdGhlIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMKK2FsbG9jYXRlZC4KKworRXhhbXBsZSBvZiBmYXRhbCBlcnJvciBvbiBidWZmZXIgb3ZlcmZsb3cgdXNpbmcKK2BgcHl0aG9uMy42IC1YIHRyYWNlbWFsbG9jPTVgYCAoc3RvcmUgNSBmcmFtZXMgaW4gdHJhY2VzKTo6CisKKyAgICBEZWJ1ZyBtZW1vcnkgYmxvY2sgYXQgYWRkcmVzcyBwPTB4N2ZiY2Q0MTY2NmY4OiBBUEkgJ28nCisgICAgICAgIDQgYnl0ZXMgb3JpZ2luYWxseSByZXF1ZXN0ZWQKKyAgICAgICAgVGhlIDcgcGFkIGJ5dGVzIGF0IHAtNyBhcmUgRk9SQklEREVOQllURSwgYXMgZXhwZWN0ZWQuCisgICAgICAgIFRoZSA4IHBhZCBieXRlcyBhdCB0YWlsPTB4N2ZiY2Q0MTY2NmZjIGFyZSBub3QgYWxsIEZPUkJJRERFTkJZVEUgKDB4ZmIpOgorICAgICAgICAgICAgYXQgdGFpbCswOiAweDAyICoqKiBPVUNICisgICAgICAgICAgICBhdCB0YWlsKzE6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrMjogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCszOiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzQ6IDB4ZmIKKyAgICAgICAgICAgIGF0IHRhaWwrNTogMHhmYgorICAgICAgICAgICAgYXQgdGFpbCs2OiAweGZiCisgICAgICAgICAgICBhdCB0YWlsKzc6IDB4ZmIKKyAgICAgICAgVGhlIGJsb2NrIHdhcyBtYWRlIGJ5IGNhbGwgIzEyMzMzMjkgdG8gZGVidWcgbWFsbG9jL3JlYWxsb2MuCisgICAgICAgIERhdGEgYXQgcDogMWEgMmIgMzAgMDAKKworICAgIE1lbW9yeSBibG9jayBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOgorICAgICAgRmlsZSAidGVzdC90ZXN0X2J5dGVzLnB5IiwgbGluZSAzMjMKKyAgICAgIEZpbGUgInVuaXR0ZXN0L2Nhc2UucHkiLCBsaW5lIDYwMAorICAgICAgRmlsZSAidW5pdHRlc3QvY2FzZS5weSIsIGxpbmUgNjQ4CisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgMTIyCisgICAgICBGaWxlICJ1bml0dGVzdC9zdWl0ZS5weSIsIGxpbmUgODQKKworICAgIEZhdGFsIFB5dGhvbiBlcnJvcjogYmFkIHRyYWlsaW5nIHBhZCBieXRlCisKKyAgICBDdXJyZW50IHRocmVhZCAweDAwMDA3ZmJjZGJkMzI3MDAgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOgorICAgICAgRmlsZSAidGVzdC90ZXN0X2J5dGVzLnB5IiwgbGluZSAzMjMgaW4gdGVzdF9oZXgKKyAgICAgIEZpbGUgInVuaXR0ZXN0L2Nhc2UucHkiLCBsaW5lIDYwMCBpbiBydW4KKyAgICAgIEZpbGUgInVuaXR0ZXN0L2Nhc2UucHkiLCBsaW5lIDY0OCBpbiBfX2NhbGxfXworICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDEyMiBpbiBydW4KKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSA4NCBpbiBfX2NhbGxfXworICAgICAgRmlsZSAidW5pdHRlc3Qvc3VpdGUucHkiLCBsaW5lIDEyMiBpbiBydW4KKyAgICAgIEZpbGUgInVuaXR0ZXN0L3N1aXRlLnB5IiwgbGluZSA4NCBpbiBfX2NhbGxfXworICAgICAgLi4uCisKKyhDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbiA6aXNzdWU6YDI2NTE2YCBhbmQgOmlzc3VlOmAyNjU2NGAuKQorCisKK090aGVyIExhbmd1YWdlIENoYW5nZXMKKz09PT09PT09PT09PT09PT09PT09PT0KKworKiBOb25lIHlldC4KKworCitOZXcgTW9kdWxlcworPT09PT09PT09PT0KKworKiBOb25lIHlldC4KKworCitJbXByb3ZlZCBNb2R1bGVzCis9PT09PT09PT09PT09PT09CisKKworYXN5bmNpbworLS0tLS0tLQorCitTaW5jZSB0aGUgOm1vZDpgYXN5bmNpb2AgbW9kdWxlIGlzIDp0ZXJtOmBwcm92aXNpb25hbCA8cHJvdmlzaW9uYWwgYXBpPmAsCithbGwgY2hhbmdlcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjYgaGF2ZSBhbHNvIGJlZW4gYmFja3BvcnRlZCB0byBQeXRob24KKzMuNS54LgorCitOb3RhYmxlIGNoYW5nZXMgaW4gdGhlIDptb2Q6YGFzeW5jaW9gIG1vZHVsZSBzaW5jZSBQeXRob24gMy41LjA6CisKKyogVGhlIDpmdW5jOmB+YXN5bmNpby5lbnN1cmVfZnV0dXJlYCBmdW5jdGlvbiBhbmQgYWxsIGZ1bmN0aW9ucyB0aGF0CisgIHVzZSBpdCwgc3VjaCBhcyA6bWV0aDpgbG9vcC5ydW5fdW50aWxfY29tcGxldGUoKSA8YXN5bmNpby5CYXNlRXZlbnRMb29wLnJ1bl91bnRpbF9jb21wbGV0ZT5gLAorICBub3cgYWNjZXB0IGFsbCBraW5kcyBvZiA6dGVybTpgYXdhaXRhYmxlIG9iamVjdHMgPGF3YWl0YWJsZT5gLgorICAoQ29udHJpYnV0ZWQgYnkgWXVyeSBTZWxpdmFub3YuKQorCisqIE5ldyA6ZnVuYzpgfmFzeW5jaW8ucnVuX2Nvcm91dGluZV90aHJlYWRzYWZlYCBmdW5jdGlvbiB0byBzdWJtaXQKKyAgY29yb3V0aW5lcyB0byBldmVudCBsb29wcyBmcm9tIG90aGVyIHRocmVhZHMuCisgIChDb250cmlidXRlZCBieSBWaW5jZW50IE1pY2hlbC4pCisKKyogTmV3IDptZXRoOmBUcmFuc3BvcnQuaXNfY2xvc2luZygpIDxhc3luY2lvLkJhc2VUcmFuc3BvcnQuaXNfY2xvc2luZz5gCisgIG1ldGhvZCB0byBjaGVjayBpZiB0aGUgdHJhbnNwb3J0IGlzIGNsb3Npbmcgb3IgY2xvc2VkLgorICAoQ29udHJpYnV0ZWQgYnkgWXVyeSBTZWxpdmFub3YuKQorCisqIFRoZSA6bWV0aDpgbG9vcC5jcmVhdGVfc2VydmVyKCkgPGFzeW5jaW8uQmFzZUV2ZW50TG9vcC5jcmVhdGVfc2VydmVyPmAKKyAgbWV0aG9kIGNhbiBub3cgYWNjZXB0IGEgbGlzdCBvZiBob3N0cy4KKyAgKENvbnRyaWJ1dGVkIGJ5IFlhbm4gU2lvbm5lYXUuKQorCisqIE5ldyA6bWV0aDpgbG9vcC5jcmVhdGVfZnV0dXJlKCkgPGFzeW5jaW8uQmFzZUV2ZW50TG9vcC5jcmVhdGVfZnV0dXJlPmAKKyAgbWV0aG9kIHRvIGNyZWF0ZSBGdXR1cmUgb2JqZWN0cy4gIFRoaXMgYWxsb3dzIGFsdGVybmF0aXZlIGV2ZW50CisgIGxvb3AgaW1wbGVtZW50YXRpb25zLCBzdWNoIGFzCisgIGB1dmxvb3AgPGh0dHBzOi8vZ2l0aHViLmNvbS9NYWdpY1N0YWNrL3V2bG9vcD5gXywgdG8gcHJvdmlkZSBhIGZhc3RlcgorICA6Y2xhc3M6YGFzeW5jaW8uRnV0dXJlYCBpbXBsZW1lbnRhdGlvbi4KKyAgKENvbnRyaWJ1dGVkIGJ5IFl1cnkgU2VsaXZhbm92LikKKworKiBOZXcgOm1ldGg6YGxvb3AuZ2V0X2V4Y2VwdGlvbl9oYW5kbGVyKCkgPGFzeW5jaW8uQmFzZUV2ZW50TG9vcC5nZXRfZXhjZXB0aW9uX2hhbmRsZXI+YAorICBtZXRob2QgdG8gZ2V0IHRoZSBjdXJyZW50IGV4Y2VwdGlvbiBoYW5kbGVyLgorICAoQ29udHJpYnV0ZWQgYnkgWXVyeSBTZWxpdmFub3YuKQorCisqIE5ldyA6ZnVuYzpgfmFzeW5jaW8udGltZW91dGAgY29udGV4dCBtYW5hZ2VyIHRvIHNpbXBsaWZ5IHRpbWVvdXRzCisgIGhhbmRsaW5nIGNvZGUuCisgIChDb250cmlidXRlZCBieSBBbmRyZXcgU3ZldGxvdi4pCisKKyogTmV3IDptZXRoOmBTdHJlYW1SZWFkZXIucmVhZHVudGlsKCkgPGFzeW5jaW8uU3RyZWFtUmVhZGVyLnJlYWR1bnRpbD5gCisgIG1ldGhvZCB0byByZWFkIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHVudGlsIGEgc2VwYXJhdG9yIGJ5dGVzCisgIHNlcXVlbmNlIGFwcGVhcnMuCisgIChDb250cmlidXRlZCBieSBNYXJrIEtvcmVuYmVyZy4pCisKKyogVGhlIDptZXRoOmBsb29wLmdldGFkZHJpbmZvKCkgPGFzeW5jaW8uQmFzZUV2ZW50TG9vcC5nZXRhZGRyaW5mbz5gCisgIG1ldGhvZCBpcyBvcHRpbWl6ZWQgdG8gYXZvaWQgY2FsbGluZyB0aGUgc3lzdGVtIGBgZ2V0YWRkcmluZm9gYAorICBmdW5jdGlvbiBpZiB0aGUgYWRkcmVzcyBpcyBhbHJlYWR5IHJlc29sdmVkLgorICAoQ29udHJpYnV0ZWQgYnkgQS4gSmVzc2UgSmlyeXUgRGF2aXMuKQorCisKK2NvbnRleHRsaWIKKy0tLS0tLS0tLS0KKworVGhlIDpjbGFzczpgY29udGV4dGxpYi5BYnN0cmFjdENvbnRleHRNYW5hZ2VyYCBjbGFzcyBoYXMgYmVlbiBhZGRlZCB0bworcHJvdmlkZSBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb250ZXh0IG1hbmFnZXJzLiBJdCBwcm92aWRlcyBhCitzZW5zaWJsZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBgX19lbnRlcl9fKClgIHdoaWNoIHJldHVybnMKK2Bgc2VsZmBgIGFuZCBsZWF2ZXMgYF9fZXhpdF9fKClgIGFuIGFic3RyYWN0IG1ldGhvZC4gQSBtYXRjaGluZworY2xhc3MgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIDptb2Q6YHR5cGluZ2AgbW9kdWxlIGFzCis6Y2xhc3M6YHR5cGluZy5Db250ZXh0TWFuYWdlcmAuCisoQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uIGluIDppc3N1ZTpgMjU2MDlgLikKKworCitkYXRldGltZQorLS0tLS0tLS0KKworVGhlIDptZXRoOmBkYXRldGltZS5zdHJmdGltZSgpIDxkYXRldGltZS5kYXRldGltZS5zdHJmdGltZT5gIGFuZAorOm1ldGg6YGRhdGUuc3RyZnRpbWUoKSA8ZGF0ZXRpbWUuZGF0ZS5zdHJmdGltZT5gIG1ldGhvZHMgbm93IHN1cHBvcnQgSVNPIDg2MDEgZGF0ZQorZGlyZWN0aXZlcyBgYCVHYGAsIGBgJXVgYCBhbmQgYGAlVmBgLgorKENvbnRyaWJ1dGVkIGJ5IEFzaGxleSBBbmRlcnNvbiBpbiA6aXNzdWU6YDEyMDA2YC4pCisKKworZmF1bHRoYW5kbGVyCistLS0tLS0tLS0tLS0KKworT24gV2luZG93cywgdGhlIDptb2Q6YGZhdWx0aGFuZGxlcmAgbW9kdWxlIG5vdyBpbnN0YWxscyBhIGhhbmRsZXIgZm9yIFdpbmRvd3MKK2V4Y2VwdGlvbnM6IHNlZSA6ZnVuYzpgZmF1bHRoYW5kbGVyLmVuYWJsZWAuIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorOmlzc3VlOmAyMzg0OGAuKQorCisKK2lkbGVsaWIgYW5kIElETEUKKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGlkbGVsaWIgcGFja2FnZSBpcyBiZWluZyBtb2Rlcm5pemVkIGFuZCByZWZhY3RvcmVkIHRvIG1ha2UgSURMRSBsb29rIGFuZCB3b3JrIGJldHRlciBhbmQgdG8gbWFrZSB0aGUgY29kZSBlYXNpZXIgdG8gdW5kZXJzdGFuZCwgdGVzdCwgYW5kIGltcHJvdmUuIFBhcnQgb2YgbWFraW5nIElETEUgbG9vayBiZXR0ZXIsIGVzcGVjaWFsbHkgb24gTGludXggYW5kIE1hYywgaXMgdXNpbmcgdHRrIHdpZGdldHMsIG1vc3RseSBpbiB0aGUgZGlhbG9ncy4gIEFzIGEgcmVzdWx0LCBJRExFIG5vIGxvbmdlciBydW5zIHdpdGggdGNsL3RrIDguNC4gIEl0IG5vdyByZXF1aXJlcyB0Y2wvdGsgOC41IG9yIDguNi4gIFdlIHJlY29tbWVuZCBydW5uaW5nIHRoZSBsYXRlc3QgcmVsZWFzZSBvZiBlaXRoZXIuCisKKydNb2Rlcm5pemluZycgaW5jbHVkZXMgcmVuYW1pbmcgYW5kIGNvbnNvbGlkYXRpb24gb2YgaWRsZWxpYiBtb2R1bGVzLiBUaGUgcmVuYW1pbmcgb2YgZmlsZXMgd2l0aCBwYXJ0aWFsIHVwcGVyY2FzZSBuYW1lcyBpcyBzaW1pbGFyIHRvIHRoZSByZW5hbWluZyBvZiwgZm9yIGluc3RhbmNlLCBUa2ludGVyIGFuZCBUa0ZvbnQgdG8gdGtpbnRlciBhbmQgdGtpbnRlci5mb250IGluIDMuMC4gIEFzIGEgcmVzdWx0LCBpbXBvcnRzIG9mIGlkbGVsaWIgZmlsZXMgdGhhdCB3b3JrZWQgaW4gMy41IHdpbGwgdXN1YWxseSBub3Qgd29yayBpbiAzLjYuICBBdCBsZWFzdCBhIG1vZHVsZSBuYW1lIGNoYW5nZSB3aWxsIGJlIG5lZWRlZCAoc2VlIGlkbGVsaWIvUkVBRE1FLnR4dCksIHNvbWV0aW1lcyBtb3JlLiAgKE5hbWUgY2hhbmdlcyBjb250cmlidXRlZCBieSBBbCBTd2llZ2FydCBhbmQgVGVycnkgUmVlZHkgaW4gOmlzc3VlOmAyNDIyNWAuICBNb3N0IGlkbGVsaWIgcGF0Y2hlcyBzaW5jZSBoYXZlIGJlZW4gYW5kIHdpbGwgYmUgcGFydCBvZiB0aGUgcHJvY2Vzcy4pCisKK0luIGNvbXBlbnNhdGlvbiwgdGhlIGV2ZW50dWFsIHJlc3VsdCB3aXRoIGJlIHRoYXQgc29tZSBpZGxlbGliIGNsYXNzZXMgd2lsbCBiZSBlYXNpZXIgdG8gdXNlLCB3aXRoIGJldHRlciBBUElzIGFuZCBkb2NzdHJpbmdzIGV4cGxhaW5pbmcgdGhlbS4gIEFkZGl0aW9uYWwgdXNlZnVsIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8gaWRsZWxpYiB3aGVuIGF2YWlsYWJsZS4KKworCitpbXBvcnRsaWIKKy0tLS0tLS0tLQorCis6Y2xhc3M6YGltcG9ydGxpYi51dGlsLkxhenlMb2FkZXJgIG5vdyBjYWxscworOm1ldGg6YH5pbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlYCBvbiB0aGUgd3JhcHBlZCBsb2FkZXIsIHJlbW92aW5nIHRoZQorcmVzdHJpY3Rpb24gdGhhdCA6Y2xhc3M6YGltcG9ydGxpYi5tYWNoaW5lcnkuQnVpbHRpbkltcG9ydGVyYCBhbmQKKzpjbGFzczpgaW1wb3J0bGliLm1hY2hpbmVyeS5FeHRlbnNpb25GaWxlTG9hZGVyYCBjb3VsZG4ndCBiZSB1c2VkIHdpdGgKKzpjbGFzczpgaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlcmAuCisKKworb3MKKy0tCisKK0EgbmV3IDptZXRoOmB+b3Muc2NhbmRpci5jbG9zZWAgbWV0aG9kIGFsbG93cyBleHBsaWNpdGx5IGNsb3NpbmcgYQorOmZ1bmM6YH5vcy5zY2FuZGlyYCBpdGVyYXRvci4gIFRoZSA6ZnVuYzpgfm9zLnNjYW5kaXJgIGl0ZXJhdG9yIG5vdworc3VwcG9ydHMgdGhlIDp0ZXJtOmBjb250ZXh0IG1hbmFnZXJgIHByb3RvY29sLiAgSWYgYSA6ZnVuYzpgc2NhbmRpcmAKK2l0ZXJhdG9yIGlzIG5laXRoZXIgZXhoYXVzdGVkIG5vciBleHBsaWNpdGx5IGNsb3NlZCBhIDpleGM6YFJlc291cmNlV2FybmluZ2AKK3dpbGwgYmUgZW1pdHRlZCBpbiBpdHMgZGVzdHJ1Y3Rvci4KKyhDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjU5OTRgLikKKworCitwaWNrbGUKKy0tLS0tLQorCitPYmplY3RzIHRoYXQgbmVlZCBjYWxsaW5nIGBgX19uZXdfX2BgIHdpdGgga2V5d29yZCBhcmd1bWVudHMgY2FuIG5vdyBiZSBwaWNrbGVkCit1c2luZyA6cmVmOmBwaWNrbGUgcHJvdG9jb2xzIDxwaWNrbGUtcHJvdG9jb2xzPmAgb2xkZXIgdGhhbiBwcm90b2NvbCB2ZXJzaW9uIDQuCitQcm90b2NvbCB2ZXJzaW9uIDQgYWxyZWFkeSBzdXBwb3J0cyB0aGlzIGNhc2UuICAoQ29udHJpYnV0ZWQgYnkgU2VyaGl5CitTdG9yY2hha2EgaW4gOmlzc3VlOmAyNDE2NGAuKQorCisKK3JlYWRsaW5lCistLS0tLS0tLQorCitBZGRlZCA6ZnVuYzpgfnJlYWRsaW5lLnNldF9hdXRvX2hpc3RvcnlgIHRvIGVuYWJsZSBvciBkaXNhYmxlCithdXRvbWF0aWMgYWRkaXRpb24gb2YgaW5wdXQgdG8gdGhlIGhpc3RvcnkgbGlzdC4gIChDb250cmlidXRlZCBieQorVHlsZXIgQ3JvbXB0b24gaW4gOmlzc3VlOmAyNjg3MGAuKQorCisKK3JsY29tcGxldGVyCistLS0tLS0tLS0tLQorCitQcml2YXRlIGFuZCBzcGVjaWFsIGF0dHJpYnV0ZSBuYW1lcyBub3cgYXJlIG9taXR0ZWQgdW5sZXNzIHRoZSBwcmVmaXggc3RhcnRzCit3aXRoIHVuZGVyc2NvcmVzLiAgQSBzcGFjZSBvciBhIGNvbG9uIGlzIGFkZGVkIGFmdGVyIHNvbWUgY29tcGxldGVkIGtleXdvcmRzLgorKENvbnRyaWJ1dGVkIGJ5IFNlcmhpeSBTdG9yY2hha2EgaW4gOmlzc3VlOmAyNTAxMWAgYW5kIDppc3N1ZTpgMjUyMDlgLikKKworTmFtZXMgb2YgbW9zdCBhdHRyaWJ1dGVzIGxpc3RlZCBieSA6ZnVuYzpgZGlyYCBhcmUgbm93IGNvbXBsZXRlZC4KK1ByZXZpb3VzbHksIG5hbWVzIG9mIHByb3BlcnRpZXMgYW5kIHNsb3RzIHdoaWNoIHdlcmUgbm90IHlldCBjcmVhdGVkIG9uCithbiBpbnN0YW5jZSB3ZXJlIGV4Y2x1ZGVkLiAgKENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBQYW50ZXIgaW4gOmlzc3VlOmAyNTU5MGAuKQorCisKK3NpdGUKKy0tLS0KKworV2hlbiBzcGVjaWZ5aW5nIHBhdGhzIHRvIGFkZCB0byA6YXR0cjpgc3lzLnBhdGhgIGluIGEgYC5wdGhgIGZpbGUsCit5b3UgbWF5IG5vdyBzcGVjaWZ5IGZpbGUgcGF0aHMgb24gdG9wIG9mIGRpcmVjdG9yaWVzIChlLmcuIHppcCBmaWxlcykuCisoQ29udHJpYnV0ZWQgYnkgV29sZmdhbmcgTGFuZ25lciBpbiA6aXNzdWU6YDI2NTg3YCkuCisKKworc3FsaXRlMworLS0tLS0tLQorCisqIDphdHRyOmBzcWxpdGUzLkN1cnNvci5sYXN0cm93aWRgIG5vdyBzdXBwb3J0cyB0aGUgYGBSRVBMQUNFYGAgc3RhdGVtZW50LgorICAoQ29udHJpYnV0ZWQgYnkgQWxleCBMb3JkVGhvcnNlbiBpbiA6aXNzdWU6YDE2ODY0YC4pCisKKworc29ja2V0CistLS0tLS0KKworVGhlIDpmdW5jOmB+c29ja2V0LnNvY2tldC5pb2N0bGAgZnVuY3Rpb24gbm93IHN1cHBvcnRzIHRoZSA6ZGF0YTpgfnNvY2tldC5TSU9fTE9PUEJBQ0tfRkFTVF9QQVRIYAorY29udHJvbCBjb2RlLgorKENvbnRyaWJ1dGVkIGJ5IERhbmllbCBTdG9rZXMgaW4gOmlzc3VlOmAyNjUzNmAuKQorCisKK3NvY2tldHNlcnZlcgorLS0tLS0tLS0tLS0tCisKK1NlcnZlcnMgYmFzZWQgb24gdGhlIDptb2Q6YHNvY2tldHNlcnZlcmAgbW9kdWxlLCBpbmNsdWRpbmcgdGhvc2UKK2RlZmluZWQgaW4gOm1vZDpgaHR0cC5zZXJ2ZXJgLCA6bW9kOmB4bWxycGMuc2VydmVyYCBhbmQKKzptb2Q6YHdzZ2lyZWYuc2ltcGxlX3NlcnZlcmAsIG5vdyBzdXBwb3J0IHRoZSA6dGVybTpgY29udGV4dCBtYW5hZ2VyYAorcHJvdG9jb2wuCisoQ29udHJpYnV0ZWQgYnkgQXZpdiBQYWxpdm9kYSBpbiA6aXNzdWU6YDI2NDA0YC4pCisKK1RoZSA6YXR0cjpgfnNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlci53ZmlsZWAgYXR0cmlidXRlIG9mCis6Y2xhc3M6YH5zb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXJgIGNsYXNzZXMgbm93IGltcGxlbWVudHMKK3RoZSA6Y2xhc3M6YGlvLkJ1ZmZlcmVkSU9CYXNlYCB3cml0YWJsZSBpbnRlcmZhY2UuICBJbiBwYXJ0aWN1bGFyLAorY2FsbGluZyA6bWV0aDpgfmlvLkJ1ZmZlcmVkSU9CYXNlLndyaXRlYCBpcyBub3cgZ3VhcmFudGVlZCB0byBzZW5kIHRoZQorZGF0YSBpbiBmdWxsLiAgKENvbnRyaWJ1dGVkIGJ5IE1hcnRpbiBQYW50ZXIgaW4gOmlzc3VlOmAyNjcyMWAuKQorCisKK3N1YnByb2Nlc3MKKy0tLS0tLS0tLS0KKworOmNsYXNzOmBzdWJwcm9jZXNzLlBvcGVuYCBkZXN0cnVjdG9yIG5vdyBlbWl0cyBhIDpleGM6YFJlc291cmNlV2FybmluZ2Agd2FybmluZworaWYgdGhlIGNoaWxkIHByb2Nlc3MgaXMgc3RpbGwgcnVubmluZy4gVXNlIHRoZSBjb250ZXh0IG1hbmFnZXIgcHJvdG9jb2wgKGBgd2l0aAorcHJvYzogLi4uYGApIG9yIGNhbGwgZXhwbGljaXRseSB0aGUgOm1ldGg6YH5zdWJwcm9jZXNzLlBvcGVuLndhaXRgIG1ldGhvZCB0bworcmVhZCB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MgKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyIGluCis6aXNzdWU6YDI2NzQxYCkuCisKKwordGVsbmV0bGliCistLS0tLS0tLS0KKworOmNsYXNzOmB+dGVsbmV0bGliLlRlbG5ldGAgaXMgbm93IGEgY29udGV4dCBtYW5hZ2VyIChjb250cmlidXRlZCBieQorU3TDqXBoYW5lIFdpcnRlbCBpbiA6aXNzdWU6YDI1NDg1YCkuCisKKwordGtpbnRlcgorLS0tLS0tLQorCitBZGRlZCBtZXRob2RzIDptZXRoOmB+dGtpbnRlci5WYXJpYWJsZS50cmFjZV9hZGRgLAorOm1ldGg6YH50a2ludGVyLlZhcmlhYmxlLnRyYWNlX3JlbW92ZWAgYW5kIDptZXRoOmB+dGtpbnRlci5WYXJpYWJsZS50cmFjZV9pbmZvYAoraW4gdGhlIDpjbGFzczpgdGtpbnRlci5WYXJpYWJsZWAgY2xhc3MuICBUaGV5IHJlcGxhY2Ugb2xkIG1ldGhvZHMKKzptZXRoOmB+dGtpbnRlci5WYXJpYWJsZS50cmFjZV92YXJpYWJsZWAsIDptZXRoOmB+dGtpbnRlci5WYXJpYWJsZS50cmFjZWAsCis6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfdmRlbGV0ZWAgYW5kCis6bWV0aDpgfnRraW50ZXIuVmFyaWFibGUudHJhY2VfdmluZm9gIHRoYXQgdXNlIG9ic29sZXRlIFRjbCBjb21tYW5kcyBhbmQgbWlnaHQKK25vdCB3b3JrIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBUY2wuCisoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDIyMTE1YCkuCisKKwordHlwaW5nCistLS0tLS0KKworVGhlIDpjbGFzczpgdHlwaW5nLkNvbnRleHRNYW5hZ2VyYCBjbGFzcyBoYXMgYmVlbiBhZGRlZCBmb3IKK3JlcHJlc2VudGluZyA6Y2xhc3M6YGNvbnRleHRsaWIuQWJzdHJhY3RDb250ZXh0TWFuYWdlcmAuCisoQ29udHJpYnV0ZWQgYnkgQnJldHQgQ2Fubm9uIGluIDppc3N1ZTpgMjU2MDlgLikKKworCit1bml0dGVzdC5tb2NrCistLS0tLS0tLS0tLS0tCisKK1RoZSA6Y2xhc3M6YH51bml0dGVzdC5tb2NrLk1vY2tgIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIGltcHJvdmVtZW50czoKKworKiBUd28gbmV3IG1ldGhvZHMsIDptZXRoOmBNb2NrLmFzc2VydF9jYWxsZWQoKQorICA8dW5pdHRlc3QubW9jay5Nb2NrLmFzc2VydF9jYWxsZWQ+YCBhbmQgOm1ldGg6YE1vY2suYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKyAgPHVuaXR0ZXN0Lm1vY2suTW9jay5hc3NlcnRfY2FsbGVkX29uY2U+YCB0byBjaGVjayBpZiB0aGUgbW9jayBvYmplY3QKKyAgd2FzIGNhbGxlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEFtaXQgU2FoYSBpbiA6aXNzdWU6YDI2MzIzYC4pCisKKwordXJsbGliLnJvYm90cGFyc2VyCistLS0tLS0tLS0tLS0tLS0tLS0KKworOmNsYXNzOmB+dXJsbGliLnJvYm90cGFyc2VyLlJvYm90RmlsZVBhcnNlcmAgbm93IHN1cHBvcnRzIHRoZSBgYENyYXdsLWRlbGF5YGAgYW5kCitgYFJlcXVlc3QtcmF0ZWBgIGV4dGVuc2lvbnMuCisoQ29udHJpYnV0ZWQgYnkgTmlrb2xheSBCb2dveWNoZXYgaW4gOmlzc3VlOmAxNjA5OWAuKQorCisKK3dhcm5pbmdzCistLS0tLS0tLQorCitBIG5ldyBvcHRpb25hbCAqc291cmNlKiBwYXJhbWV0ZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlCis6ZnVuYzpgd2FybmluZ3Mud2Fybl9leHBsaWNpdGAgZnVuY3Rpb246IHRoZSBkZXN0cm95ZWQgb2JqZWN0IHdoaWNoIGVtaXR0ZWQgYQorOmV4YzpgUmVzb3VyY2VXYXJuaW5nYC4gQSAqc291cmNlKiBhdHRyaWJ1dGUgaGFzIGFsc28gYmVlbiBhZGRlZCB0bworOmNsYXNzOmB3YXJuaW5ncy5XYXJuaW5nTWVzc2FnZWAgKGNvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyIGluCis6aXNzdWU6YDI2NTY4YCBhbmQgOmlzc3VlOmAyNjU2N2ApLgorCitXaGVuIGEgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCB3YXJuaW5nIGlzIGxvZ2dlZCwgdGhlIDptb2Q6YHRyYWNlbWFsbG9jYCBpcyBub3cKK3VzZWQgdG8gdHJ5IHRvIHJldHJpZXZlIHRoZSB0cmFjZWJhY2sgd2hlcmUgdGhlIGRldHJveWVkIG9iamVjdCB3YXMgYWxsb2NhdGVkLgorCitFeGFtcGxlIHdpdGggdGhlIHNjcmlwdCBgYGV4YW1wbGUucHlgYDo6CisKKyAgICBpbXBvcnQgd2FybmluZ3MKKworICAgIGRlZiBmdW5jKCk6CisgICAgICAgIHJldHVybiBvcGVuKF9fZmlsZV9fKQorCisgICAgZiA9IGZ1bmMoKQorICAgIGYgPSBOb25lCisKK091dHB1dCBvZiB0aGUgY29tbWFuZCBgYHB5dGhvbjMuNiAtV2QgLVggdHJhY2VtYWxsb2M9NSBleGFtcGxlLnB5YGA6OgorCisgICAgZXhhbXBsZS5weTo3OiBSZXNvdXJjZVdhcm5pbmc6IHVuY2xvc2VkIGZpbGUgPF9pby5UZXh0SU9XcmFwcGVyIG5hbWU9J2V4YW1wbGUucHknIG1vZGU9J3InIGVuY29kaW5nPSdVVEYtOCc+CisgICAgICBmID0gTm9uZQorICAgIE9iamVjdCBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOgorICAgICAgRmlsZSAiZXhhbXBsZS5weSIsIGxpbmVubyA0CisgICAgICAgIHJldHVybiBvcGVuKF9fZmlsZV9fKQorICAgICAgRmlsZSAiZXhhbXBsZS5weSIsIGxpbmVubyA2CisgICAgICAgIGYgPSBmdW5jKCkKKworVGhlICJPYmplY3QgYWxsb2NhdGVkIGF0IiB0cmFjZWJhY2sgaXMgbmV3IGFuZCBvbmx5IGRpc3BsYXllZCBpZgorOm1vZDpgdHJhY2VtYWxsb2NgIGlzIHRyYWNpbmcgUHl0aG9uIG1lbW9yeSBhbGxvY2F0aW9ucyBhbmQgaWYgdGhlCis6bW9kOmB3YXJuaW5nc2Agd2FzIGFscmVhZHkgaW1wb3J0ZWQuCisKKword2lucmVnCistLS0tLS0KKworQWRkZWQgdGhlIDY0LWJpdCBpbnRlZ2VyIHR5cGUgOmRhdGE6YFJFR19RV09SRCA8d2lucmVnLlJFR19RV09SRD5gLgorKENvbnRyaWJ1dGVkIGJ5IENsZW1lbnQgUm91YXVsdCBpbiA6aXNzdWU6YDIzMDI2YC4pCisKKworemlwZmlsZQorLS0tLS0tLQorCitBIG5ldyA6bWV0aDpgWmlwSW5mby5mcm9tX2ZpbGUoKSA8emlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZT5gIGNsYXNzIG1ldGhvZAorYWxsb3dzIG1ha2luZyBhIDpjbGFzczpgfnppcGZpbGUuWmlwSW5mb2AgaW5zdGFuY2UgZnJvbSBhIGZpbGVzeXN0ZW0gZmlsZS4KK0EgbmV3IDptZXRoOmBaaXBJbmZvLmlzX2RpcigpIDx6aXBmaWxlLlppcEluZm8uaXNfZGlyPmAgbWV0aG9kIGNhbiBiZSB1c2VkCit0byBjaGVjayBpZiB0aGUgOmNsYXNzOmB+emlwZmlsZS5aaXBJbmZvYCBpbnN0YW5jZSByZXByZXNlbnRzIGEgZGlyZWN0b3J5LgorKENvbnRyaWJ1dGVkIGJ5IFRob21hcyBLbHV5dmVyIGluIDppc3N1ZTpgMjYwMzlgLikKKworVGhlIDptZXRoOmBaaXBGaWxlLm9wZW4oKSA8emlwZmlsZS5aaXBGaWxlLm9wZW4+YCBtZXRob2QgY2FuIG5vdyBiZSB1c2VkIHRvCit3cml0ZSBkYXRhIGludG8gYSBaSVAgZmlsZSwgYXMgd2VsbCBhcyBmb3IgZXh0cmFjdGluZyBkYXRhLgorKENvbnRyaWJ1dGVkIGJ5IFRob21hcyBLbHV5dmVyIGluIDppc3N1ZTpgMjYwMzlgLikKKworCit6bGliCistLS0tCisKK1RoZSA6ZnVuYzpgfnpsaWIuY29tcHJlc3NgIGZ1bmN0aW9uIG5vdyBhY2NlcHRzIGtleXdvcmQgYXJndW1lbnRzLgorKENvbnRyaWJ1dGVkIGJ5IEF2aXYgUGFsaXZvZGEgaW4gOmlzc3VlOmAyNjI0M2AuKQorCisKK2ZpbGVpbnB1dAorLS0tLS0tLS0tCisKKzpmdW5jOmB+ZmlsZWlucHV0Lmhvb2tfZW5jb2RlZGAgbm93IHN1cHBvcnRzIHRoZSAqZXJyb3JzKiBhcmd1bWVudC4KKyhDb250cmlidXRlZCBieSBKb3NlcGggSGFja21hbiBpbiA6aXNzdWU6YDI1Nzg4YC4pCisKKworT3B0aW1pemF0aW9ucworPT09PT09PT09PT09PQorCisqIFRoZSBBU0NJSSBkZWNvZGVyIGlzIG5vdyB1cCB0byA2MCB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYHN1cnJvZ2F0ZWVzY2FwZWBgLCBgYGlnbm9yZWBgIGFuZCBgYHJlcGxhY2VgYCAoQ29udHJpYnV0ZWQKKyAgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNDg3MGApLgorCisqIFRoZSBBU0NJSSBhbmQgdGhlIExhdGluMSBlbmNvZGVycyBhcmUgbm93IHVwIHRvIDMgdGltZXMgYXMgZmFzdCBmb3IgdGhlCisgIGVycm9yIGhhbmRsZXIgYGBzdXJyb2dhdGVlc2NhcGVgYCAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTIyN2ApLgorCisqIFRoZSBVVEYtOCBlbmNvZGVyIGlzIG5vdyB1cCB0byA3NSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvciBoYW5kbGVycworICBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCwgYGBzdXJyb2dhdGVlc2NhcGVgYCwgYGBzdXJyb2dhdGVwYXNzYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUyNjdgKS4KKworKiBUaGUgVVRGLTggZGVjb2RlciBpcyBub3cgdXAgdG8gMTUgdGltZXMgYXMgZmFzdCBmb3IgZXJyb3IgaGFuZGxlcnMKKyAgYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAgYW5kIGBgc3Vycm9nYXRlZXNjYXBlYGAgKENvbnRyaWJ1dGVkCisgIGJ5IFZpY3RvciBTdGlubmVyIGluIDppc3N1ZTpgMjUzMDFgKS4KKworKiBgYGJ5dGVzICUgYXJnc2BgIGlzIG5vdyB1cCB0byAyIHRpbWVzIGZhc3Rlci4gKENvbnRyaWJ1dGVkIGJ5IFZpY3RvciBTdGlubmVyCisgIGluIDppc3N1ZTpgMjUzNDlgKS4KKworKiBgYGJ5dGVhcnJheSAlIGFyZ3NgYCBpcyBub3cgYmV0d2VlbiAyLjUgYW5kIDUgdGltZXMgZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkKKyAgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTM5OWApLgorCisqIE9wdGltaXplIDptZXRoOmBieXRlcy5mcm9taGV4YCBhbmQgOm1ldGg6YGJ5dGVhcnJheS5mcm9taGV4YDogdGhleSBhcmUgbm93CisgIGJldHdlZW4gMnggYW5kIDMuNXggZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNTQwMWApLgorCisqIE9wdGltaXplIGBgYnl0ZXMucmVwbGFjZShiJycsIGInLicpYGAgYW5kIGBgYnl0ZWFycmF5LnJlcGxhY2UoYicnLCBiJy4nKWBgOgorICB1cCB0byA4MCUgZmFzdGVyLiAoQ29udHJpYnV0ZWQgYnkgSm9zaCBTbmlkZXIgaW4gOmlzc3VlOmAyNjU3NGApLgorCisqIEFsbG9jYXRvciBmdW5jdGlvbnMgb2YgdGhlIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2AgZG9tYWluCisgICg6YzpkYXRhOmBQWU1FTV9ET01BSU5fTUVNYCkgbm93IHVzZSB0aGUgOnJlZjpgcHltYWxsb2MgbWVtb3J5IGFsbG9jYXRvcgorICA8cHltYWxsb2M+YCBpbnN0ZWFkIG9mIDpjOmZ1bmM6YG1hbGxvY2AgZnVuY3Rpb24gb2YgdGhlIEMgbGlicmFyeS4gVGhlCisgIHB5bWFsbG9jIGFsbG9jYXRvciBpcyBvcHRpbWl6ZWQgZm9yIG9iamVjdHMgc21hbGxlciBvciBlcXVhbCB0byA1MTIgYnl0ZXMKKyAgd2l0aCBhIHNob3J0IGxpZmV0aW1lLCBhbmQgdXNlIDpjOmZ1bmM6YG1hbGxvY2AgZm9yIGxhcmdlciBtZW1vcnkgYmxvY2tzLgorICAoQ29udHJpYnV0ZWQgYnkgVmljdG9yIFN0aW5uZXIgaW4gOmlzc3VlOmAyNjI0OWApLgorCisqIDpmdW5jOmBwaWNrbGUubG9hZGAgYW5kIDpmdW5jOmBwaWNrbGUubG9hZHNgIGFyZSBub3cgdXAgdG8gMTAlIGZhc3RlciB3aGVuCisgIGRlc2VyaWFsaXppbmcgbWFueSBzbWFsbCBvYmplY3RzIChDb250cmlidXRlZCBieSBWaWN0b3IgU3Rpbm5lciBpbgorICA6aXNzdWU6YDI3MDU2YCkuCisKK0J1aWxkIGFuZCBDIEFQSSBDaGFuZ2VzCis9PT09PT09PT09PT09PT09PT09PT09PQorCisqIE5ldyA6YzpmdW5jOmBQeV9GaW5hbGl6ZUV4YCBBUEkgd2hpY2ggaW5kaWNhdGVzIGlmIGZsdXNoaW5nIGJ1ZmZlcmVkIGRhdGEKKyAgZmFpbGVkICg6aXNzdWU6YDUzMTlgKS4KKworKiA6YzpmdW5jOmBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNgIG5vdyBzdXBwb3J0cyA6cmVmOmBwb3NpdGlvbmFsLW9ubHkKKyAgcGFyYW1ldGVycyA8cG9zaXRpb25hbC1vbmx5X3BhcmFtZXRlcj5gLiAgUG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMgYXJlCisgIGRlZmluZWQgYnkgZW1wdHkgbmFtZXMuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjYyODJgKS4KKworCitEZXByZWNhdGVkCis9PT09PT09PT09CisKK05ldyBLZXl3b3JkcworLS0tLS0tLS0tLS0tCisKK2BgYXN5bmNgYCBhbmQgYGBhd2FpdGBgIGFyZSBub3QgcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBhcyB2YXJpYWJsZSwgY2xhc3MsCitmdW5jdGlvbiBvciBtb2R1bGUgbmFtZXMuICBJbnRyb2R1Y2VkIGJ5IDpwZXA6YDQ5MmAgaW4gUHl0aG9uIDMuNSwgdGhleSB3aWxsCitiZWNvbWUgcHJvcGVyIGtleXdvcmRzIGluIFB5dGhvbiAzLjcuCisKKworRGVwcmVjYXRlZCBQeXRob24gbW9kdWxlcywgZnVuY3Rpb25zIGFuZCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiA6bWV0aDpgaW1wb3J0bGliLm1hY2hpbmVyeS5Tb3VyY2VGaWxlTG9hZGVyLmxvYWRfbW9kdWxlYCBhbmQKKyAgOm1ldGg6YGltcG9ydGxpYi5tYWNoaW5lcnkuU291cmNlbGVzc0ZpbGVMb2FkZXIubG9hZF9tb2R1bGVgIGFyZSBub3cKKyAgZGVwcmVjYXRlZC4gVGhleSB3ZXJlIHRoZSBvbmx5IHJlbWFpbmluZyBpbXBsZW1lbnRhdGlvbnMgb2YKKyAgOm1ldGg6YGltcG9ydGxpYi5hYmMuTG9hZGVyLmxvYWRfbW9kdWxlYCBpbiA6bW9kOmBpbXBvcnRsaWJgIHRoYXQgaGFkIG5vdAorICBiZWVuIGRlcHJlY2F0ZWQgaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uIGluIGZhdm91ciBvZgorICA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgLgorCisKK0RlcHJlY2F0ZWQgZnVuY3Rpb25zIGFuZCB0eXBlcyBvZiB0aGUgQyBBUEkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBOb25lIHlldC4KKworCitEZXByZWNhdGVkIGZlYXR1cmVzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogVGhlIGBgcHl2ZW52YGAgc2NyaXB0IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGBgcHl0aG9uMyAtbSB2ZW52YGAuCisgIFRoaXMgcHJldmVudHMgY29uZnVzaW9uIGFzIHRvIHdoYXQgUHl0aG9uIGludGVycHJldGVyIGBgcHl2ZW52YGAgaXMKKyAgY29ubmVjdGVkIHRvIGFuZCB0aHVzIHdoYXQgUHl0aG9uIGludGVycHJldGVyIHdpbGwgYmUgdXNlZCBieSB0aGUgdmlydHVhbAorICBlbnZpcm9ubWVudC4gKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1MTU0YC4pCisKKyogV2hlbiBwZXJmb3JtaW5nIGEgcmVsYXRpdmUgaW1wb3J0LCBmYWxsaW5nIGJhY2sgb24gYGBfX25hbWVfX2BgIGFuZAorICBgYF9fcGF0aF9fYGAgZnJvbSB0aGUgY2FsbGluZyBtb2R1bGUgd2hlbiBgYF9fc3BlY19fYGAgb3IKKyAgYGBfX3BhY2thZ2VfX2BgIGFyZSBub3QgZGVmaW5lZCBub3cgcmFpc2VzIGFuIDpleGM6YEltcG9ydFdhcm5pbmdgLgorICAoQ29udHJpYnV0ZWQgYnkgUm9zZSBBbWVzIGluIDppc3N1ZTpgMjU3OTFgLikKKworKiBVbmxpa2UgdG8gb3RoZXIgOm1vZDpgZGJtYCBpbXBsZW1lbnRhdGlvbnMsIHRoZSA6bW9kOmBkYm0uZHVtYmAgbW9kdWxlCisgIGNyZWF0ZXMgZGF0YWJhc2UgaW4gYGAncidgYCBhbmQgYGAndydgYCBtb2RlcyBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZAorICBhbGxvd3MgbW9kaWZ5aW5nIGRhdGFiYXNlIGluIGBgJ3InYGAgbW9kZS4gIFRoaXMgYmVoYXZpb3IgaXMgbm93IGRlcHJlY2F0ZWQKKyAgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjguCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjE3MDhgLikKKworRGVwcmVjYXRlZCBQeXRob24gYmVoYXZpb3IKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogUmFpc2luZyB0aGUgOmV4YzpgU3RvcEl0ZXJhdGlvbmAgZXhjZXB0aW9uIGluc2lkZSBhIGdlbmVyYXRvciB3aWxsIG5vdyBnZW5lcmF0ZSBhCisgIDpleGM6YERlcHJlY2F0aW9uV2FybmluZ2AsIGFuZCB3aWxsIHRyaWdnZXIgYSA6ZXhjOmBSdW50aW1lRXJyb3JgIGluIFB5dGhvbiAzLjcuCisgIFNlZSA6cmVmOmB3aGF0c25ldy1wZXAtNDc5YCBmb3IgZGV0YWlscy4KKworCitSZW1vdmVkCis9PT09PT09CisKK0FQSSBhbmQgRmVhdHVyZSBSZW1vdmFscworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogYGBpbnNwZWN0LmdldG1vZHVsZWluZm8oKWBgIHdhcyByZW1vdmVkICh3YXMgZGVwcmVjYXRlZCBzaW5jZSBDUHl0aG9uIDMuMykuCisgIDpmdW5jOmBpbnNwZWN0LmdldG1vZHVsZW5hbWVgIHNob3VsZCBiZSB1c2VkIGZvciBvYnRhaW5pbmcgdGhlIG1vZHVsZQorICBuYW1lIGZvciBhIGdpdmVuIHBhdGguCisKKyogYGB0cmFjZWJhY2suSWdub3JlYGAgY2xhc3MgYW5kIGBgdHJhY2ViYWNrLnVzYWdlYGAsIGBgdHJhY2ViYWNrLm1vZG5hbWVgYCwKKyAgYGB0cmFjZWJhY2suZnVsbG1vZG5hbWVgYCwgYGB0cmFjZWJhY2suZmluZF9saW5lc19mcm9tX2NvZGVgYCwKKyAgYGB0cmFjZWJhY2suZmluZF9saW5lc2BgLCBgYHRyYWNlYmFjay5maW5kX3N0cmluZ3NgYCwKKyAgYGB0cmFjZWJhY2suZmluZF9leGVjdXRhYmxlX2xpbmVzYGAgbWV0aG9kcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgOm1vZDpgdHJhY2ViYWNrYCBtb2R1bGUuIFRoZXkgd2VyZSB1bmRvY3VtZW50ZWQgbWV0aG9kcyBkZXByZWNhdGVkIHNpbmNlCisgIFB5dGhvbiAzLjIgYW5kIGVxdWl2YWxlbnQgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgZnJvbSBwcml2YXRlIG1ldGhvZHMuCisKKyogVGhlIGBgdGtfbWVudUJhcigpYGAgYW5kIGBgdGtfYmluZEZvclRyYXZlcnNhbCgpYGAgZHVtbXkgbWV0aG9kcyBpbgorICA6bW9kOmB0a2ludGVyYCB3aWRnZXQgY2xhc3NlcyB3ZXJlIHJlbW92ZWQgKGNvcnJlc3BvbmRpbmcgVGsgY29tbWFuZHMKKyAgd2VyZSBvYnNvbGV0ZSBzaW5jZSBUayA0LjApLgorCisqIFRoZSA6bWV0aDpgfnppcGZpbGUuWmlwRmlsZS5vcGVuYCBtZXRob2Qgb2YgdGhlIDpjbGFzczpgemlwZmlsZS5aaXBGaWxlYAorICBjbGFzcyBubyBsb25nZXIgc3VwcG9ydHMgdGhlIGBgJ1UnYGAgbW9kZSAod2FzIGRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDMuNCkuCisgIFVzZSA6Y2xhc3M6YGlvLlRleHRJT1dyYXBwZXJgIGZvciByZWFkaW5nIGNvbXByZXNzZWQgdGV4dCBmaWxlcyBpbgorICA6dGVybTpgdW5pdmVyc2FsIG5ld2xpbmVzYCBtb2RlLgorCisKK1BvcnRpbmcgdG8gUHl0aG9uIDMuNgorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgc2VjdGlvbiBsaXN0cyBwcmV2aW91c2x5IGRlc2NyaWJlZCBjaGFuZ2VzIGFuZCBvdGhlciBidWdmaXhlcwordGhhdCBtYXkgcmVxdWlyZSBjaGFuZ2VzIHRvIHlvdXIgY29kZS4KKworQ2hhbmdlcyBpbiAncHl0aG9uJyBDb21tYW5kIEJlaGF2aW9yCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKiBUaGUgb3V0cHV0IG9mIGEgc3BlY2lhbCBQeXRob24gYnVpbGQgd2l0aCBkZWZpbmVkIGBgQ09VTlRfQUxMT0NTYGAsCisgIGBgU0hPV19BTExPQ19DT1VOVGBgIG9yIGBgU0hPV19UUkFDS19DT1VOVGBgIG1hY3JvcyBpcyBub3cgb2ZmIGJ5CisgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmUtZW5hYmxlZCB1c2luZyB0aGUgYGAtWCBzaG93YWxsb2Njb3VudGBgIG9wdGlvbi4KKyAgSXQgbm93IG91dHB1dHMgdG8gYGBzdGRlcnJgYCBpbnN0ZWFkIG9mIGBgc3Rkb3V0YGAuCisgIChDb250cmlidXRlZCBieSBTZXJoaXkgU3RvcmNoYWthIGluIDppc3N1ZTpgMjMwMzRgLikKKworCitDaGFuZ2VzIGluIHRoZSBQeXRob24gQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogV2hlbiA6bWV0aDpgaW1wb3J0bGliLmFiYy5Mb2FkZXIuZXhlY19tb2R1bGVgIGlzIGRlZmluZWQsCisgIDptZXRoOmBpbXBvcnRsaWIuYWJjLkxvYWRlci5jcmVhdGVfbW9kdWxlYCBtdXN0IGFsc28gYmUgZGVmaW5lZC4KKworKiBUaGUgZm9ybWF0IG9mIHRoZSBgYGNvX2xub3RhYmBgIGF0dHJpYnV0ZSBvZiBjb2RlIG9iamVjdHMgY2hhbmdlZCB0byBzdXBwb3J0CisgIG5lZ2F0aXZlIGxpbmUgbnVtYmVyIGRlbHRhLiBCeSBkZWZhdWx0LCBQeXRob24gZG9lcyBub3QgZW1pdCBieXRlY29kZSB3aXRoCisgIG5lZ2F0aXZlIGxpbmUgbnVtYmVyIGRlbHRhLiBGdW5jdGlvbnMgdXNpbmcgYGBmcmFtZS5mX2xpbmVub2BgLAorICBgYFB5RnJhbWVfR2V0TGluZU51bWJlcigpYGAgb3IgYGBQeUNvZGVfQWRkcjJMaW5lKClgYCBhcmUgbm90IGFmZmVjdGVkLgorICBGdW5jdGlvbnMgZGVjb2RpbmcgZGlyZWN0bHkgYGBjb19sbm90YWJgYCBzaG91bGQgYmUgdXBkYXRlZCB0byB1c2UgYSBzaWduZWQKKyAgOC1iaXQgaW50ZWdlciB0eXBlIGZvciB0aGUgbGluZSBudW1iZXIgZGVsdGEsIGJ1dCBpdCdzIG9ubHkgcmVxdWlyZWQgdG8KKyAgc3VwcG9ydCBhcHBsaWNhdGlvbnMgdXNpbmcgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuIFNlZQorICBgYE9iamVjdHMvbG5vdGFiX25vdGVzLnR4dGBgIGZvciB0aGUgYGBjb19sbm90YWJgYCBmb3JtYXQgYW5kIGhvdyB0byBkZWNvZGUKKyAgaXQsIGFuZCBzZWUgdGhlIDpwZXA6YDUxMWAgZm9yIHRoZSByYXRpb25hbGUuCisKKyogVGhlIGZ1bmN0aW9ucyBpbiB0aGUgOm1vZDpgY29tcGlsZWFsbGAgbW9kdWxlIG5vdyByZXR1cm4gYm9vbGVhbnMgaW5zdGVhZAorICBvZiBgYDFgYCBvciBgYDBgYCB0byByZXByZXNlbnQgc3VjY2VzcyBvciBmYWlsdXJlLCByZXNwZWN0aXZlbHkuIFRoYW5rcyB0bworICBib29sZWFucyBiZWluZyBhIHN1YmNsYXNzIG9mIGludGVnZXJzLCB0aGlzIHNob3VsZCBvbmx5IGJlIGFuIGlzc3VlIGlmIHlvdQorICB3ZXJlIGRvaW5nIGlkZW50aXR5IGNoZWNrcyBmb3IgYGAxYGAgb3IgYGAwYGAuIFNlZSA6aXNzdWU6YDI1NzY4YC4KKworKiBSZWFkaW5nIHRoZSA6YXR0cjpgfnVybGxpYi5wYXJzZS5TcGxpdFJlc3VsdC5wb3J0YCBhdHRyaWJ1dGUgb2YKKyAgOmZ1bmM6YHVybGxpYi5wYXJzZS51cmxzcGxpdGAgYW5kIDpmdW5jOmB+dXJsbGliLnBhcnNlLnVybHBhcnNlYCByZXN1bHRzCisgIG5vdyByYWlzZXMgOmV4YzpgVmFsdWVFcnJvcmAgZm9yIG91dC1vZi1yYW5nZSB2YWx1ZXMsIHJhdGhlciB0aGFuCisgIHJldHVybmluZyA6Y29uc3Q6YE5vbmVgLiAgU2VlIDppc3N1ZTpgMjAwNTlgLgorCisqIFRoZSA6bW9kOmBpbXBgIG1vZHVsZSBub3cgcmFpc2VzIGEgOmV4YzpgRGVwcmVjYXRpb25XYXJuaW5nYCBpbnN0ZWFkIG9mCisgIDpleGM6YFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmdgLgorCisqIFRoZSBmb2xsb3dpbmcgbW9kdWxlcyBoYXZlIGhhZCBtaXNzaW5nIEFQSXMgYWRkZWQgdG8gdGhlaXIgOmF0dHI6YF9fYWxsX19gCisgIGF0dHJpYnV0ZXMgdG8gbWF0Y2ggdGhlIGRvY3VtZW50ZWQgQVBJczoKKyAgOm1vZDpgY2FsZW5kYXJgLCA6bW9kOmBjZ2lgLCA6bW9kOmBjc3ZgLAorICA6bW9kOmB+eG1sLmV0cmVlLkVsZW1lbnRUcmVlYCwgOm1vZDpgZW51bWAsCisgIDptb2Q6YGZpbGVpbnB1dGAsIDptb2Q6YGZ0cGxpYmAsIDptb2Q6YGxvZ2dpbmdgLCA6bW9kOmBtYWlsYm94YCwKKyAgOm1vZDpgbWltZXR5cGVzYCwgOm1vZDpgb3B0cGFyc2VgLCA6bW9kOmBwbGlzdGxpYmAsIDptb2Q6YHNtdHBkYCwKKyAgOm1vZDpgc3VicHJvY2Vzc2AsIDptb2Q6YHRhcmZpbGVgLCA6bW9kOmB0aHJlYWRpbmdgIGFuZAorICA6bW9kOmB3YXZlYC4gIFRoaXMgbWVhbnMgdGhleSB3aWxsIGV4cG9ydCBuZXcgc3ltYm9scyB3aGVuIGBgaW1wb3J0ICpgYAorICBpcyB1c2VkLiAgU2VlIDppc3N1ZTpgMjM4ODNgLgorCisqIFdoZW4gcGVyZm9ybWluZyBhIHJlbGF0aXZlIGltcG9ydCwgaWYgYGBfX3BhY2thZ2VfX2BgIGRvZXMgbm90IGNvbXBhcmUgZXF1YWwKKyAgdG8gYGBfX3NwZWNfXy5wYXJlbnRgYCB0aGVuIDpleGM6YEltcG9ydFdhcm5pbmdgIGlzIHJhaXNlZC4KKyAgKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDI1NzkxYC4pCisKKyogV2hlbiBhIHJlbGF0aXZlIGltcG9ydCBpcyBwZXJmb3JtZWQgYW5kIG5vIHBhcmVudCBwYWNrYWdlIGlzIGtub3duLCB0aGVuCisgIDpleGM6YEltcG9ydEVycm9yYCB3aWxsIGJlIHJhaXNlZC4gUHJldmlvdXNseSwgOmV4YzpgU3lzdGVtRXJyb3JgIGNvdWxkIGJlCisgIHJhaXNlZC4gKENvbnRyaWJ1dGVkIGJ5IEJyZXR0IENhbm5vbiBpbiA6aXNzdWU6YDE4MDE4YC4pCisKKyogU2VydmVycyBiYXNlZCBvbiB0aGUgOm1vZDpgc29ja2V0c2VydmVyYCBtb2R1bGUsIGluY2x1ZGluZyB0aG9zZQorICBkZWZpbmVkIGluIDptb2Q6YGh0dHAuc2VydmVyYCwgOm1vZDpgeG1scnBjLnNlcnZlcmAgYW5kCisgIDptb2Q6YHdzZ2lyZWYuc2ltcGxlX3NlcnZlcmAsIG5vdyBvbmx5IGNhdGNoIGV4Y2VwdGlvbnMgZGVyaXZlZAorICBmcm9tIDpleGM6YEV4Y2VwdGlvbmAuIFRoZXJlZm9yZSBpZiBhIHJlcXVlc3QgaGFuZGxlciByYWlzZXMKKyAgYW4gZXhjZXB0aW9uIGxpa2UgOmV4YzpgU3lzdGVtRXhpdGAgb3IgOmV4YzpgS2V5Ym9hcmRJbnRlcnJ1cHRgLAorICA6bWV0aDpgfnNvY2tldHNlcnZlci5CYXNlU2VydmVyLmhhbmRsZV9lcnJvcmAgaXMgbm8gbG9uZ2VyIGNhbGxlZCwgYW5kCisgIHRoZSBleGNlcHRpb24gd2lsbCBzdG9wIGEgc2luZ2xlLXRocmVhZGVkIHNlcnZlci4gKENvbnRyaWJ1dGVkIGJ5CisgIE1hcnRpbiBQYW50ZXIgaW4gOmlzc3VlOmAyMzQzMGAuKQorCisqIDpmdW5jOmBzcHdkLmdldHNwbmFtYCBub3cgcmFpc2VzIGEgOmV4YzpgUGVybWlzc2lvbkVycm9yYCBpbnN0ZWFkIG9mCisgIDpleGM6YEtleUVycm9yYCBpZiB0aGUgdXNlciBkb2Vzbid0IGhhdmUgcHJpdmlsZWdlcy4KKworKiBUaGUgOm1ldGg6YHNvY2tldC5zb2NrZXQuY2xvc2VgIG1ldGhvZCBub3cgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZgorICBhbiBlcnJvciAoZS5nLiBFQkFERikgd2FzIHJlcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBjYWxsLgorICBTZWUgOmlzc3VlOmAyNjY4NWAuCisKKyogVGhlICpkZWNvZGVfZGF0YSogYXJndW1lbnQgZm9yIDpjbGFzczpgc210cGQuU01UUENoYW5uZWxgIGFuZAorICA6Y2xhc3M6YHNtdHBkLlNNVFBTZXJ2ZXJgIGNvbnN0cnVjdG9ycyBpcyBub3cgYGBGYWxzZWBgIGJ5IGRlZmF1bHQuCisgIFRoaXMgbWVhbnMgdGhhdCB0aGUgYXJndW1lbnQgcGFzc2VkIHRvCisgIDptZXRoOmB+c210cGQuU01UUFNlcnZlci5wcm9jZXNzX21lc3NhZ2VgIGlzIG5vdyBhIGJ5dGVzIG9iamVjdCBieQorICBkZWZhdWx0LCBhbmQgYGBwcm9jZXNzX21lc3NhZ2UoKWBgIHdpbGwgYmUgcGFzc2VkIGtleXdvcmQgYXJndW1lbnRzLgorICBDb2RlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgZGVwcmVjYXRpb24KKyAgd2FybmluZyBnZW5lcmF0ZWQgYnkgMy41IHdpbGwgbm90IGJlIGFmZmVjdGVkLgorCisqIEFsbCBvcHRpb25hbCBwYXJhbWV0ZXJzIG9mIHRoZSA6ZnVuYzpgfmpzb24uZHVtcGAsIDpmdW5jOmB+anNvbi5kdW1wc2AsCisgIDpmdW5jOmB+anNvbi5sb2FkYCBhbmQgOmZ1bmM6YH5qc29uLmxvYWRzYCBmdW5jdGlvbnMgYW5kCisgIDpjbGFzczpgfmpzb24uSlNPTkVuY29kZXJgIGFuZCA6Y2xhc3M6YH5qc29uLkpTT05EZWNvZGVyYCBjbGFzcworICBjb25zdHJ1Y3RvcnMgaW4gdGhlIDptb2Q6YGpzb25gIG1vZHVsZSBhcmUgbm93IDpyZWY6YGtleXdvcmQtb25seQorICA8a2V5d29yZC1vbmx5X3BhcmFtZXRlcj5gLgorICAoQ29udHJpYnV0ZWQgYnkgU2VyaGl5IFN0b3JjaGFrYSBpbiA6aXNzdWU6YDE4NzI2YC4pCisKKworQ2hhbmdlcyBpbiB0aGUgQyBBUEkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyogOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCBhbGxvY2F0b3IgZmFtaWx5IG5vdyB1c2VzIHRoZSA6cmVmOmBweW1hbGxvYyBhbGxvY2F0b3IKKyAgPHB5bWFsbG9jPmAgcmF0aGVyIHRoYW4gc3lzdGVtIDpjOmZ1bmM6YG1hbGxvY2AuIEFwcGxpY2F0aW9ucyBjYWxsaW5nCisgIDpjOmZ1bmM6YFB5TWVtX01hbGxvY2Agd2l0aG91dCBob2xkaW5nIHRoZSBHSUwgY2FuIG5vdyBjcmFzaC4gU2V0IHRoZQorICA6ZW52dmFyOmBQWVRIT05NQUxMT0NgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGBgZGVidWdgYCB0byB2YWxpZGF0ZSB0aGUKKyAgdXNhZ2Ugb2YgbWVtb3J5IGFsbG9jYXRvcnMgaW4geW91ciBhcHBsaWNhdGlvbi4gU2VlIDppc3N1ZTpgMjYyNDlgLgorCisqIDpjOmZ1bmM6YFB5X0V4aXRgIChhbmQgdGhlIG1haW4gaW50ZXJwcmV0ZXIpIG5vdyBvdmVycmlkZSB0aGUgZXhpdCBzdGF0dXMKKyAgd2l0aCAxMjAgaWYgZmx1c2hpbmcgYnVmZmVyZWQgZGF0YSBmYWlsZWQuICBTZWUgOmlzc3VlOmA1MzE5YC4KZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy9pbmRleC5yc3QgYi9Eb2Mvd2hhdHNuZXcvaW5kZXgucnN0CmluZGV4IGVkYjU1MDIuLjdjOTI1MjQgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy9pbmRleC5yc3QKKysrIGIvRG9jL3doYXRzbmV3L2luZGV4LnJzdApAQCAtMTEsNiArMTEsNyBAQAogLi4gdG9jdHJlZTo6CiAgICA6bWF4ZGVwdGg6IDIKIAorICAgMy42LnJzdAogICAgMy41LnJzdAogICAgMy40LnJzdAogICAgMy4zLnJzdApkaWZmIC0tZ2l0IGEvR3JhbW1hci9HcmFtbWFyIGIvR3JhbW1hci9HcmFtbWFyCmluZGV4IDQzMDc1MjMuLjllNDk3OWUgMTAwNjQ0Ci0tLSBhL0dyYW1tYXIvR3JhbW1hcgorKysgYi9HcmFtbWFyL0dyYW1tYXIKQEAgLTI3LDEzICsyNywxOCBAQAogZnVuY2RlZjogJ2RlZicgTkFNRSBwYXJhbWV0ZXJzIFsnLT4nIHRlc3RdICc6JyBzdWl0ZQogCiBwYXJhbWV0ZXJzOiAnKCcgW3R5cGVkYXJnc2xpc3RdICcpJwotdHlwZWRhcmdzbGlzdDogKHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnCi0gICAgICAgWycqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZl1dCi0gICAgIHwgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZikKK3R5cGVkYXJnc2xpc3Q6ICh0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgfCAnKionIHRmcGRlZiBbJywnXV1dCisgIHwgJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHRmcGRlZiBbJywnXV1dCisgIHwgJyoqJyB0ZnBkZWYgWycsJ10pCiB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQotdmFyYXJnc2xpc3Q6ICh2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJwotICAgICAgIFsnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWZdXQotICAgICB8ICAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWYpCit2YXJhcmdzbGlzdDogKHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgICAgICB8ICcqKicgdmZwZGVmIFsnLCddXV0KKyAgfCAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgfCAnKionIHZmcGRlZiBbJywnXQorKQogdmZwZGVmOiBOQU1FCiAKIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9QeXRob24tYXN0LmggYi9JbmNsdWRlL1B5dGhvbi1hc3QuaAppbmRleCAyZDNlYWNiLi4xYWIzNzZhIDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi1hc3QuaAorKysgYi9JbmNsdWRlL1B5dGhvbi1hc3QuaApAQCAtMjAxLDkgKzIwMSwxMCBAQAogICAgICAgICAgICAgICAgICAgU2V0Q29tcF9raW5kPTksIERpY3RDb21wX2tpbmQ9MTAsIEdlbmVyYXRvckV4cF9raW5kPTExLAogICAgICAgICAgICAgICAgICAgQXdhaXRfa2luZD0xMiwgWWllbGRfa2luZD0xMywgWWllbGRGcm9tX2tpbmQ9MTQsCiAgICAgICAgICAgICAgICAgICBDb21wYXJlX2tpbmQ9MTUsIENhbGxfa2luZD0xNiwgTnVtX2tpbmQ9MTcsIFN0cl9raW5kPTE4LAotICAgICAgICAgICAgICAgICAgQnl0ZXNfa2luZD0xOSwgTmFtZUNvbnN0YW50X2tpbmQ9MjAsIEVsbGlwc2lzX2tpbmQ9MjEsCi0gICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVfa2luZD0yMiwgU3Vic2NyaXB0X2tpbmQ9MjMsIFN0YXJyZWRfa2luZD0yNCwKLSAgICAgICAgICAgICAgICAgIE5hbWVfa2luZD0yNSwgTGlzdF9raW5kPTI2LCBUdXBsZV9raW5kPTI3fTsKKyAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZFZhbHVlX2tpbmQ9MTksIEpvaW5lZFN0cl9raW5kPTIwLCBCeXRlc19raW5kPTIxLAorICAgICAgICAgICAgICAgICAgTmFtZUNvbnN0YW50X2tpbmQ9MjIsIEVsbGlwc2lzX2tpbmQ9MjMsIENvbnN0YW50X2tpbmQ9MjQsCisgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVfa2luZD0yNSwgU3Vic2NyaXB0X2tpbmQ9MjYsIFN0YXJyZWRfa2luZD0yNywKKyAgICAgICAgICAgICAgICAgIE5hbWVfa2luZD0yOCwgTGlzdF9raW5kPTI5LCBUdXBsZV9raW5kPTMwfTsKIHN0cnVjdCBfZXhwciB7CiAgICAgZW51bSBfZXhwcl9raW5kIGtpbmQ7CiAgICAgdW5pb24gewpAQCAtMjk3LDYgKzI5OCwxNiBAQAogICAgICAgICB9IFN0cjsKICAgICAgICAgCiAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgaW50IGNvbnZlcnNpb247CisgICAgICAgICAgICBleHByX3R5IGZvcm1hdF9zcGVjOworICAgICAgICB9IEZvcm1hdHRlZFZhbHVlOworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIGFzZGxfc2VxICp2YWx1ZXM7CisgICAgICAgIH0gSm9pbmVkU3RyOworICAgICAgICAKKyAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgIGJ5dGVzIHM7CiAgICAgICAgIH0gQnl0ZXM7CiAgICAgICAgIApAQCAtMzA1LDYgKzMxNiwxMCBAQAogICAgICAgICB9IE5hbWVDb25zdGFudDsKICAgICAgICAgCiAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBjb25zdGFudCB2YWx1ZTsKKyAgICAgICAgfSBDb25zdGFudDsKKyAgICAgICAgCisgICAgICAgIHN0cnVjdCB7CiAgICAgICAgICAgICBleHByX3R5IHZhbHVlOwogICAgICAgICAgICAgaWRlbnRpZmllciBhdHRyOwogICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eDsKQEAgLTU0Myw2ICs1NTgsMTIgQEAKIGV4cHJfdHkgX1B5X051bShvYmplY3QgbiwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKICNkZWZpbmUgU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfU3RyKGEwLCBhMSwgYTIsIGEzKQogZXhwcl90eSBfUHlfU3RyKHN0cmluZyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBGb3JtYXR0ZWRWYWx1ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfRm9ybWF0dGVkVmFsdWUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X0Zvcm1hdHRlZFZhbHVlKGV4cHJfdHkgdmFsdWUsIGludCBjb252ZXJzaW9uLCBleHByX3R5IGZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgSm9pbmVkU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfSm9pbmVkU3RyKGEwLCBhMSwgYTIsIGEzKQorZXhwcl90eSBfUHlfSm9pbmVkU3RyKGFzZGxfc2VxICogdmFsdWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYQorICAgICAgICAgICAgICAgICAgICAgICphcmVuYSk7CiAjZGVmaW5lIEJ5dGVzKGEwLCBhMSwgYTIsIGEzKSBfUHlfQnl0ZXMoYTAsIGExLCBhMiwgYTMpCiBleHByX3R5IF9QeV9CeXRlcyhieXRlcyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOwogI2RlZmluZSBOYW1lQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpIF9QeV9OYW1lQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpCkBAIC01NTAsNiArNTcxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAqYXJlbmEpOwogI2RlZmluZSBFbGxpcHNpcyhhMCwgYTEsIGEyKSBfUHlfRWxsaXBzaXMoYTAsIGExLCBhMikKIGV4cHJfdHkgX1B5X0VsbGlwc2lzKGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIENvbnN0YW50KGEwLCBhMSwgYTIsIGEzKSBfUHlfQ29uc3RhbnQoYTAsIGExLCBhMiwgYTMpCitleHByX3R5IF9QeV9Db25zdGFudChjb25zdGFudCB2YWx1ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKKyAgICAgICAgICAgICAgICAgICAgICphcmVuYSk7CiAjZGVmaW5lIEF0dHJpYnV0ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfQXR0cmlidXRlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCiBleHByX3R5IF9QeV9BdHRyaWJ1dGUoZXhwcl90eSB2YWx1ZSwgaWRlbnRpZmllciBhdHRyLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQKICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CmRpZmYgLS1naXQgYS9JbmNsdWRlL1B5dGhvbi5oIGIvSW5jbHVkZS9QeXRob24uaAppbmRleCA4NThkYmQxLi40YzdjOWE0IDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi5oCisrKyBiL0luY2x1ZGUvUHl0aG9uLmgKQEAgLTExNiw2ICsxMTYsNyBAQAogI2luY2x1ZGUgInB5bGlmZWN5Y2xlLmgiCiAjaW5jbHVkZSAiY2V2YWwuaCIKICNpbmNsdWRlICJzeXNtb2R1bGUuaCIKKyNpbmNsdWRlICJvc21vZHVsZS5oIgogI2luY2x1ZGUgImludHJjaGVjay5oIgogI2luY2x1ZGUgImltcG9ydC5oIgogCmRpZmYgLS1naXQgYS9JbmNsdWRlL2FzZGwuaCBiL0luY2x1ZGUvYXNkbC5oCmluZGV4IDQ5NTE1M2MuLjM1ZTlmYTEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYXNkbC5oCisrKyBiL0luY2x1ZGUvYXNkbC5oCkBAIC02LDYgKzYsNyBAQAogdHlwZWRlZiBQeU9iamVjdCAqIGJ5dGVzOwogdHlwZWRlZiBQeU9iamVjdCAqIG9iamVjdDsKIHR5cGVkZWYgUHlPYmplY3QgKiBzaW5nbGV0b247Cit0eXBlZGVmIFB5T2JqZWN0ICogY29uc3RhbnQ7CiAKIC8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IGFzZGxfYy5weSB3YXMgY29tcGxldGVseQogICAgaW5kZXBlbmRlbnQgb2YgUHl0aG9uLCBidXQgaXQgaXMgYSBnb2FsIHRoZSByZXF1aXJlcyB0b28gbXVjaCB3b3JrCmRpZmYgLS1naXQgYS9JbmNsdWRlL2J5dGVzX21ldGhvZHMuaCBiL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCmluZGV4IDExZDVmNDIuLjdmYTc1NDAgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCisrKyBiL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oCkBAIC0xNyw5ICsxNywxOCBAQAogLyogVGhlc2Ugc3RvcmUgdGhlaXIgbGVuIHNpemVkIGFuc3dlciBpbiB0aGUgZ2l2ZW4gcHJlYWxsb2NhdGVkICpyZXN1bHQgYXJnLiAqLwogZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX2xvd2VyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOwogZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3VwcGVyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOwotZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOwotZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7Ci1leHRlcm4gdm9pZCBfUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBfUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBfUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKKworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfZmluZChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19pbmRleChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19yZmluZChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19yaW5kZXgoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOworZXh0ZXJuIFB5T2JqZWN0ICpfUHlfYnl0ZXNfY291bnQoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpOworZXh0ZXJuIGludCBfUHlfYnl0ZXNfY29udGFpbnMoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZyk7CitleHRlcm4gUHlPYmplY3QgKl9QeV9ieXRlc19zdGFydHN3aXRoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKK2V4dGVybiBQeU9iamVjdCAqX1B5X2J5dGVzX2VuZHN3aXRoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKTsKIAogLyogVGhlIG1ha2V0cmFucygpIHN0YXRpYyBtZXRob2QuICovCiBleHRlcm4gUHlPYmplY3QqIF9QeV9ieXRlc19tYWtldHJhbnMoUHlfYnVmZmVyICpmcm0sIFB5X2J1ZmZlciAqdG8pOwpAQCAtMzcsNyArNDYsMTkgQEAKIGV4dGVybiBjb25zdCBjaGFyIF9QeV90aXRsZV9fZG9jX19bXTsKIGV4dGVybiBjb25zdCBjaGFyIF9QeV9jYXBpdGFsaXplX19kb2NfX1tdOwogZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3N3YXBjYXNlX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2NvdW50X19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2ZpbmRfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfaW5kZXhfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfcmZpbmRfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfcmluZGV4X19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3N0YXJ0c3dpdGhfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfZW5kc3dpdGhfX2RvY19fW107CiBleHRlcm4gY29uc3QgY2hhciBfUHlfbWFrZXRyYW5zX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2V4cGFuZHRhYnNfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfbGp1c3RfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfcmp1c3RfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfY2VudGVyX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3pmaWxsX19kb2NfX1tdOwogCiAvKiB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIHNvbWUgZG9jcyBhcmUgc2hhcmVkIGZyb20gdGhlIC5vLCBub3Qgc3RhdGljICovCiAjZGVmaW5lIFB5RG9jX1NUUlZBUl9zaGFyZWQobmFtZSxzdHIpIGNvbnN0IGNoYXIgbmFtZVtdID0gUHlEb2NfU1RSKHN0cikKZGlmZiAtLWdpdCBhL0luY2x1ZGUvYnl0ZXNvYmplY3QuaCBiL0luY2x1ZGUvYnl0ZXNvYmplY3QuaAppbmRleCA2YzFlMGMzLi40NTc4MDY5IDEwMDY0NAotLS0gYS9JbmNsdWRlL2J5dGVzb2JqZWN0LmgKKysrIGIvSW5jbHVkZS9ieXRlc29iamVjdC5oCkBAIC02Miw3ICs2MiwxNCBAQAogUHlBUElfRlVOQyh2b2lkKSBQeUJ5dGVzX0NvbmNhdEFuZERlbChQeU9iamVjdCAqKiwgUHlPYmplY3QgKik7CiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiBQeUFQSV9GVU5DKGludCkgX1B5Qnl0ZXNfUmVzaXplKFB5T2JqZWN0ICoqLCBQeV9zc2l6ZV90KTsKLVB5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Qnl0ZXNfRm9ybWF0KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeUJ5dGVzX0Zvcm1hdEV4KAorICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwKKyAgICBQeV9zc2l6ZV90IGZvcm1hdF9sZW4sCisgICAgUHlPYmplY3QgKmFyZ3MsCisgICAgaW50IHVzZV9ieXRlYXJyYXkpOworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeUJ5dGVzX0Zyb21IZXgoCisgICAgUHlPYmplY3QgKnN0cmluZywKKyAgICBpbnQgdXNlX2J5dGVhcnJheSk7CiAjZW5kaWYKIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCeXRlc19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LAogCQkJCQkJICAgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LApAQCAtMTIzLDYgKzEzMCw4NyBAQAogI2RlZmluZSBGX0FMVAkoMTw8MykKICNkZWZpbmUgRl9aRVJPCSgxPDw0KQogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCisvKiBUaGUgX1B5Qnl0ZXNXcml0ZXIgc3RydWN0dXJlIGlzIGJpZzogaXQgY29udGFpbnMgYW4gZW1iZWRlZCAic3RhY2sgYnVmZmVyIi4KKyAgIEEgX1B5Qnl0ZXNXcml0ZXIgdmFyaWFibGUgbXVzdCBiZSBkZWNsYXJlZCBhdCB0aGUgZW5kIG9mIHZhcmlhYmxlcyBpbiBhCisgICBmdW5jdGlvbiB0byBvcHRpbWl6ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gb24gdGhlIHN0YWNrLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIGJ5dGVzLCBieXRlYXJyYXkgb3IgTlVMTCAod2hlbiB0aGUgc21hbGwgYnVmZmVyIGlzIHVzZWQpICovCisgICAgUHlPYmplY3QgKmJ1ZmZlcjsKKworICAgIC8qIE51bWJlciBvZiBhbGxvY2F0ZWQgc2l6ZS4gKi8KKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsKKworICAgIC8qIE1pbmltdW0gbnVtYmVyIG9mIGFsbG9jYXRlZCBieXRlcywKKyAgICAgICBpbmNyZW1lbnRlZCBieSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCkgKi8KKyAgICBQeV9zc2l6ZV90IG1pbl9zaXplOworCisgICAgLyogSWYgbm9uLXplcm8sIHVzZSBhIGJ5dGVhcnJheSBpbnN0ZWFkIG9mIGEgYnl0ZXMgb2JqZWN0IGZvciBidWZmZXIuICovCisgICAgaW50IHVzZV9ieXRlYXJyYXk7CisKKyAgICAvKiBJZiBub24temVybywgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgKGRlZmF1bHQ6IDApLgorICAgICAgIFRoaXMgZmxhZyBtdXN0IGJlIHplcm8gaWYgdXNlX2J5dGVhcnJheSBpcyBub24temVyby4gKi8KKyAgICBpbnQgb3ZlcmFsbG9jYXRlOworCisgICAgLyogU3RhY2sgYnVmZmVyICovCisgICAgaW50IHVzZV9zbWFsbF9idWZmZXI7CisgICAgY2hhciBzbWFsbF9idWZmZXJbNTEyXTsKK30gX1B5Qnl0ZXNXcml0ZXI7CisKKy8qIEluaXRpYWxpemUgYSBieXRlcyB3cml0ZXIKKworICAgQnkgZGVmYXVsdCwgdGhlIG92ZXJhbGxvY2F0aW9uIGlzIGRpc2FibGVkLiBTZXQgdGhlIG92ZXJhbGxvY2F0ZSBhdHRyaWJ1dGUKKyAgIHRvIGNvbnRyb2wgdGhlIGFsbG9jYXRpb24gb2YgdGhlIGJ1ZmZlci4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5Qnl0ZXNXcml0ZXJfSW5pdChfUHlCeXRlc1dyaXRlciAqd3JpdGVyKTsKKworLyogR2V0IHRoZSBidWZmZXIgY29udGVudCBhbmQgcmVzZXQgdGhlIHdyaXRlci4KKyAgIFJldHVybiBhIGJ5dGVzIG9iamVjdCwgb3IgYSBieXRlYXJyYXkgb2JqZWN0IGlmIHVzZV9ieXRlYXJyYXkgaXMgbm9uLXplcm8uCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlCeXRlc1dyaXRlcl9GaW5pc2goX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIpOworCisvKiBEZWFsbG9jYXRlIG1lbW9yeSBvZiBhIHdyaXRlciAoY2xlYXIgaXRzIGludGVybmFsIGJ1ZmZlcikuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcik7CisKKy8qIEFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgc2l6ZSBieXRlcy4KKyAgIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJ1ZmZlciBkYXRhLgorICAgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gTlVMTCBvbiBlcnJvci4gKi8KK1B5QVBJX0ZVTkModm9pZCopIF9QeUJ5dGVzV3JpdGVyX0FsbG9jKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogRW5zdXJlIHRoYXQgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2ggdG8gd3JpdGUgKnNpemUqIGJ5dGVzLgorICAgQWRkIHNpemUgdG8gdGhlIHdyaXRlciBtaW5pbXVtIHNpemUgKG1pbl9zaXplIGF0dHJpYnV0ZSkuCisKKyAgIHN0ciBpcyB0aGUgY3VycmVudCBwb2ludGVyIGluc2lkZSB0aGUgYnVmZmVyLgorICAgUmV0dXJuIHRoZSB1cGRhdGVkIGN1cnJlbnQgcG9pbnRlciBpbnNpZGUgdGhlIGJ1ZmZlci4KKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgdm9pZCAqc3RyLAorICAgIFB5X3NzaXplX3Qgc2l6ZSk7CisKKy8qIFJlc2l6ZSB0aGUgYnVmZmVyIHRvIG1ha2UgaXQgbGFyZ2VyLgorICAgVGhlIG5ldyBidWZmZXIgbWF5IGJlIGxhcmdlciB0aGFuIHNpemUgYnl0ZXMgYmVjYXVzZSBvZiBvdmVyYWxsb2NhdGlvbi4KKyAgIFJldHVybiB0aGUgdXBkYXRlZCBjdXJyZW50IHBvaW50ZXIgaW5zaWRlIHRoZSBidWZmZXIuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLgorCisgICBOb3RlOiBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkIGJ5dGVzIGluIHRoZSB3cml0ZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gZG9lc24ndCB1c2UgdGhlIHdyaXRlciBtaW5pbXVtIHNpemUgKG1pbl9zaXplIGF0dHJpYnV0ZSkuCisKKyAgIFNlZSBhbHNvIF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoKS4KKyAgICovCitQeUFQSV9GVU5DKHZvaWQqKSBfUHlCeXRlc1dyaXRlcl9SZXNpemUoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwKKyAgICB2b2lkICpzdHIsCisgICAgUHlfc3NpemVfdCBzaXplKTsKKworLyogV3JpdGUgYnl0ZXMuCisgICBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIG9uIGVycm9yLiAqLworUHlBUElfRlVOQyh2b2lkKikgX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyhfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgIHZvaWQgKnN0ciwKKyAgICBjb25zdCB2b2lkICpieXRlcywKKyAgICBQeV9zc2l6ZV90IHNpemUpOworI2VuZGlmICAgLyogUHlfTElNSVRFRF9BUEkgKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL0luY2x1ZGUvY2V2YWwuaCBiL0luY2x1ZGUvY2V2YWwuaAppbmRleCBiNTM3M2E5Li5kMTk0MDQ0IDEwMDY0NAotLS0gYS9JbmNsdWRlL2NldmFsLmgKKysrIGIvSW5jbHVkZS9jZXZhbC5oCkBAIC0yMDYsNiArMjA2LDE0IEBACiBQeUFQSV9GVU5DKHZvaWQpIF9QeUV2YWxfU2lnbmFsQXN5bmNFeGModm9pZCk7CiAjZW5kaWYKIAorLyogTWFza3MgYW5kIHZhbHVlcyB1c2VkIGJ5IEZPUk1BVF9WQUxVRSBvcGNvZGUuICovCisjZGVmaW5lIEZWQ19NQVNLICAgICAgMHgzCisjZGVmaW5lIEZWQ19OT05FICAgICAgMHgwCisjZGVmaW5lIEZWQ19TVFIgICAgICAgMHgxCisjZGVmaW5lIEZWQ19SRVBSICAgICAgMHgyCisjZGVmaW5lIEZWQ19BU0NJSSAgICAgMHgzCisjZGVmaW5lIEZWU19NQVNLICAgICAgMHg0CisjZGVmaW5lIEZWU19IQVZFX1NQRUMgMHg0CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9jb2RlLmggYi9JbmNsdWRlL2NvZGUuaAppbmRleCA4ZWNmMzhhLi5hMzAwZWFkIDEwMDY0NAotLS0gYS9JbmNsdWRlL2NvZGUuaAorKysgYi9JbmNsdWRlL2NvZGUuaApAQCAtMTI2LDcgKzEyNiw3IEBACiAjZW5kaWYKIAogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5Q29kZV9PcHRpbWl6ZShQeU9iamVjdCAqY29kZSwgUHlPYmplY3QqIGNvbnN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5hbWVzLCBQeU9iamVjdCAqbGluZW5vX29iaik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcywgUHlPYmplY3QgKmxub3RhYik7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9sb25nb2JqZWN0LmggYi9JbmNsdWRlL2xvbmdvYmplY3QuaAppbmRleCBhZWQ1OWNlLi5lYWY3YTdlIDEwMDY0NAotLS0gYS9JbmNsdWRlL2xvbmdvYmplY3QuaAorKysgYi9JbmNsdWRlL2xvbmdvYmplY3QuaApAQCAtNjUsNyArNjUsOCBAQAogIyAgZXJyb3IgInZvaWQqIGRpZmZlcmVudCBpbiBzaXplIGZyb20gaW50LCBsb25nIGFuZCBsb25nIGxvbmciCiAjZW5kaWYgLyogU0laRU9GX1ZPSURfUCAqLwogCi0vKiBVc2VkIGJ5IFB5dGhvbi9teXN0cnRvdWwuYy4gKi8KKy8qIFVzZWQgYnkgUHl0aG9uL215c3RydG91bC5jLCBfUHlCeXRlc19Gcm9tSGV4KCksCisgICBfUHlCeXRlc19EZWNvZGVFc2NhcGVSZWNvZGUoKSwgZXRjLiAqLwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQogUHlBUElfREFUQSh1bnNpZ25lZCBjaGFyKSBfUHlMb25nX0RpZ2l0VmFsdWVbMjU2XTsKICNlbmRpZgpAQCAtMTgyLDYgKzE4MywxMyBAQAogICAgIGludCBiYXNlLAogICAgIGludCBhbHRlcm5hdGUpOwogCitQeUFQSV9GVU5DKGNoYXIqKSBfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKAorICAgIF9QeUJ5dGVzV3JpdGVyICp3cml0ZXIsCisgICAgY2hhciAqc3RyLAorICAgIFB5T2JqZWN0ICpvYmosCisgICAgaW50IGJhc2UsCisgICAgaW50IGFsdGVybmF0ZSk7CisKIC8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQogICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KIFB5QVBJX0ZVTkMoaW50KSBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkV3JpdGVyKApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vYmplY3QuaCBiL0luY2x1ZGUvb2JqZWN0LmgKaW5kZXggNTBkOTc0Ny4uMGM4ODYwMyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vYmplY3QuaAorKysgYi9JbmNsdWRlL29iamVjdC5oCkBAIC03ODUsNyArNzg1LDcgQEAKICAgICAgICAgLS0oX3B5X2RlY3JlZl90bXApLT5vYl9yZWZjbnQgIT0gMCkgICAgICAgICAgICAgXAogICAgICAgICAgICAgX1B5X0NIRUNLX1JFRkNOVChfcHlfZGVjcmVmX3RtcCkgICAgICAgICAgICBcCiAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX1B5X0RlYWxsb2MoX3B5X2RlY3JlZl90bXApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX1B5X0RlYWxsb2MoX3B5X2RlY3JlZl90bXApOyAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKIAogLyogU2FmZWx5IGRlY3JlZiBgb3BgIGFuZCBzZXQgYG9wYCB0byBOVUxMLCBlc3BlY2lhbGx5IHVzZWZ1bCBpbiB0cF9jbGVhcgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9vcGNvZGUuaCBiL0luY2x1ZGUvb3Bjb2RlLmgKaW5kZXggM2Y5MTdmYi4uMTcxYWFlNyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9vcGNvZGUuaAorKysgYi9JbmNsdWRlL29wY29kZS5oCkBAIC0xMDIsNyArMTAyLDYgQEAKICNkZWZpbmUgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgMTMxCiAjZGVmaW5lIE1BS0VfRlVOQ1RJT04gICAgICAgICAgIDEzMgogI2RlZmluZSBCVUlMRF9TTElDRSAgICAgICAgICAgICAxMzMKLSNkZWZpbmUgTUFLRV9DTE9TVVJFICAgICAgICAgICAgMTM0CiAjZGVmaW5lIExPQURfQ0xPU1VSRSAgICAgICAgICAgIDEzNQogI2RlZmluZSBMT0FEX0RFUkVGICAgICAgICAgICAgICAxMzYKICNkZWZpbmUgU1RPUkVfREVSRUYgICAgICAgICAgICAgMTM3CkBAIC0xMjIsNiArMTIxLDggQEAKICNkZWZpbmUgQlVJTERfVFVQTEVfVU5QQUNLICAgICAgMTUyCiAjZGVmaW5lIEJVSUxEX1NFVF9VTlBBQ0sgICAgICAgIDE1MwogI2RlZmluZSBTRVRVUF9BU1lOQ19XSVRIICAgICAgICAxNTQKKyNkZWZpbmUgRk9STUFUX1ZBTFVFICAgICAgICAgICAgMTU1CisjZGVmaW5lIEJVSUxEX0NPTlNUX0tFWV9NQVAgICAgIDE1NgogCiAvKiBFWENFUFRfSEFORExFUiBpcyBhIHNwZWNpYWwsIGltcGxpY2l0IGJsb2NrIHR5cGUgd2hpY2ggaXMgY3JlYXRlZCB3aGVuCiAgICBlbnRlcmluZyBhbiBleGNlcHQgaGFuZGxlci4gSXQgaXMgbm90IGFuIG9wY29kZSBidXQgd2UgZGVmaW5lIGl0IGhlcmUKZGlmZiAtLWdpdCBhL0luY2x1ZGUvb3Ntb2R1bGUuaCBiL0luY2x1ZGUvb3Ntb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQ2NzU3Ci0tLSAvZGV2L251bGwKKysrIGIvSW5jbHVkZS9vc21vZHVsZS5oCkBAIC0wLDAgKzEsMTUgQEAKKworLyogb3MgbW9kdWxlIGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X09TTU9EVUxFX0gKKyNkZWZpbmUgUHlfT1NNT0RVTEVfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T1NfRlNQYXRoKFB5T2JqZWN0ICpwYXRoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfT1NNT0RVTEVfSCAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9wYXRjaGxldmVsLmggYi9JbmNsdWRlL3BhdGNobGV2ZWwuaAppbmRleCA0NWU1NzM2Li4xZjJhZDE5IDEwMDY0NAotLS0gYS9JbmNsdWRlL3BhdGNobGV2ZWwuaAorKysgYi9JbmNsdWRlL3BhdGNobGV2ZWwuaApAQCAtMTcsMTMgKzE3LDEzIEBACiAvKiBWZXJzaW9uIHBhcnNlZCBvdXQgaW50byBudW1lcmljIHZhbHVlcyAqLwogLyotLXN0YXJ0IGNvbnN0YW50cy0tKi8KICNkZWZpbmUgUFlfTUFKT1JfVkVSU0lPTgkzCi0jZGVmaW5lIFBZX01JTk9SX1ZFUlNJT04JNQotI2RlZmluZSBQWV9NSUNST19WRVJTSU9OCTIKLSNkZWZpbmUgUFlfUkVMRUFTRV9MRVZFTAlQWV9SRUxFQVNFX0xFVkVMX0ZJTkFMCi0jZGVmaW5lIFBZX1JFTEVBU0VfU0VSSUFMCTAKKyNkZWZpbmUgUFlfTUlOT1JfVkVSU0lPTgk2CisjZGVmaW5lIFBZX01JQ1JPX1ZFUlNJT04JMAorI2RlZmluZSBQWV9SRUxFQVNFX0xFVkVMCVBZX1JFTEVBU0VfTEVWRUxfQUxQSEEKKyNkZWZpbmUgUFlfUkVMRUFTRV9TRVJJQUwJMwogCiAvKiBWZXJzaW9uIGFzIGEgc3RyaW5nICovCi0jZGVmaW5lIFBZX1ZFUlNJT04gICAgICAJIjMuNS4yKyIKKyNkZWZpbmUgUFlfVkVSU0lPTiAgICAgIAkiMy42LjBhMysiCiAvKi0tZW5kIGNvbnN0YW50cy0tKi8KIAogLyogVmVyc2lvbiBhcyBhIHNpbmdsZSA0LWJ5dGUgaGV4IG51bWJlciwgZS5nLiAweDAxMDUwMkIyID09IDEuNS4yYjIuCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5X2N1cnNlcy5oIGIvSW5jbHVkZS9weV9jdXJzZXMuaAppbmRleCBmMmMwOGY2Li4zYzIxNjk3IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5X2N1cnNlcy5oCisrKyBiL0luY2x1ZGUvcHlfY3Vyc2VzLmgKQEAgLTEwMyw4ICsxMDMsOCBAQAogI2VuZGlmCiAKIC8qIGdlbmVyYWwgZXJyb3IgbWVzc2FnZXMgKi8KLXN0YXRpYyBjaGFyICpjYXRjaGFsbF9FUlIgID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBFUlIiOwotc3RhdGljIGNoYXIgKmNhdGNoYWxsX05VTEwgPSAiY3Vyc2VzIGZ1bmN0aW9uIHJldHVybmVkIE5VTEwiOworc3RhdGljIGNvbnN0IGNoYXIgY2F0Y2hhbGxfRVJSW10gID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBFUlIiOworc3RhdGljIGNvbnN0IGNoYXIgY2F0Y2hhbGxfTlVMTFtdID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBOVUxMIjsKIAogLyogRnVuY3Rpb24gUHJvdG90eXBlIE1hY3JvcyAtIFRoZXkgYXJlIHVnbHkgYnV0IHZlcnksIHZlcnkgdXNlZnVsLiA7LSkKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWxpZmVjeWNsZS5oIGIvSW5jbHVkZS9weWxpZmVjeWNsZS5oCmluZGV4IGNjZGViZTIuLmU5NmViNzAgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlsaWZlY3ljbGUuaAorKysgYi9JbmNsdWRlL3B5bGlmZWN5Y2xlLmgKQEAgLTI3LDYgKzI3LDcgQEAKIFB5QVBJX0ZVTkModm9pZCkgX1B5X0luaXRpYWxpemVFeF9Qcml2YXRlKGludCwgaW50KTsKICNlbmRpZgogUHlBUElfRlVOQyh2b2lkKSBQeV9GaW5hbGl6ZSh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBQeV9GaW5hbGl6ZUV4KHZvaWQpOwogUHlBUElfRlVOQyhpbnQpIFB5X0lzSW5pdGlhbGl6ZWQodm9pZCk7CiBQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlfTmV3SW50ZXJwcmV0ZXIodm9pZCk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5X0VuZEludGVycHJldGVyKFB5VGhyZWFkU3RhdGUgKik7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5bWFjcm8uaCBiL0luY2x1ZGUvcHltYWNyby5oCmluZGV4IDNmNmY1ZGMuLjQ5OTI5ZTUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltYWNyby5oCisrKyBiL0luY2x1ZGUvcHltYWNyby5oCkBAIC0zNiw2ICszNiwxMCBAQAogI2RlZmluZSBQeV9CVUlMRF9BU1NFUlRfRVhQUihjb25kKSBcCiAgICAgKHNpemVvZihjaGFyIFsxIC0gMiohKGNvbmQpXSkgLSAxKQogCisjZGVmaW5lIFB5X0JVSUxEX0FTU0VSVChjb25kKSAgZG8geyAgICAgICAgIFwKKyAgICAgICAgKHZvaWQpUHlfQlVJTERfQVNTRVJUX0VYUFIoY29uZCk7ICAgXAorICAgIH0gd2hpbGUoMCkKKwogLyogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSB2aXNpYmxlIGFycmF5CiAKICAgIFRoaXMgZG9lcyBub3Qgd29yayBvbiBwb2ludGVycywgb3IgYXJyYXlzIGRlY2xhcmVkIGFzIFtdLCBvciBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weW1hdGguaCBiL0luY2x1ZGUvcHltYXRoLmgKaW5kZXggMWVhOWFjMS4uZWQ3NjA1MyAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weW1hdGguaAorKysgYi9JbmNsdWRlL3B5bWF0aC5oCkBAIC0xNjksNyArMTY5LDcgQEAKICAgICAgICAgI3ByYWdtYSBmbG9hdF9jb250cm9sIChwb3ApCiAgICAgICAgICNkZWZpbmUgUHlfTkFOIF9faWNjX25hbigpCiAgICAgI2Vsc2UgLyogSUNDX05BTl9SRUxBWEVEIGFzIGRlZmF1bHQgZm9yIEludGVsIENvbXBpbGVyICovCi0gICAgICAgIHN0YXRpYyB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgYnVmWzhdOyBkb3VibGUgX19pY2NfbmFuOyB9IF9fbmFuX3N0b3JlID0gezAsMCwwLDAsMCwwLDB4ZjgsMHg3Zn07CisgICAgICAgIHN0YXRpYyBjb25zdCB1bmlvbiB7IHVuc2lnbmVkIGNoYXIgYnVmWzhdOyBkb3VibGUgX19pY2NfbmFuOyB9IF9fbmFuX3N0b3JlID0gezAsMCwwLDAsMCwwLDB4ZjgsMHg3Zn07CiAgICAgICAgICNkZWZpbmUgUHlfTkFOIChfX25hbl9zdG9yZS5fX2ljY19uYW4pCiAgICAgI2VuZGlmIC8qIElDQ19OQU5fU1RSSUNUICovCiAjZW5kaWYgLyogX19JTlRFTF9DT01QSUxFUiAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weW1lbS5oIGIvSW5jbHVkZS9weW1lbS5oCmluZGV4IDA0M2RiNjQuLjQzMWU1YjYgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHltZW0uaAorKysgYi9JbmNsdWRlL3B5bWVtLmgKQEAgLTE2LDggKzE2LDUxIEBACiBQeUFQSV9GVU5DKHZvaWQgKikgUHlNZW1fUmF3Q2FsbG9jKHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSk7CiBQeUFQSV9GVU5DKHZvaWQgKikgUHlNZW1fUmF3UmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5TWVtX1Jhd0ZyZWUodm9pZCAqcHRyKTsKKworLyogQ29uZmlndXJlIHRoZSBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMuIFBhc3MgTlVMTCB0byB1c2UgZGVmYXVsdAorICAgYWxsb2NhdG9ycy4gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlNZW1fU2V0dXBBbGxvY2F0b3JzKGNvbnN0IGNoYXIgKm9wdCk7CisKKyNpZmRlZiBXSVRIX1BZTUFMTE9DCitQeUFQSV9GVU5DKGludCkgX1B5TWVtX1B5bWFsbG9jRW5hYmxlZCh2b2lkKTsKICNlbmRpZgogCisvKiBJZGVudGlmaWVyIG9mIGFuIGFkZHJlc3Mgc3BhY2UgKGRvbWFpbikgaW4gdHJhY2VtYWxsb2MgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90OworCisvKiBUcmFjayBhbiBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIGluIHRoZSB0cmFjZW1hbGxvYyBtb2R1bGUuCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCByZXR1cm4gLTEgb24gZXJyb3IgKGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUKKyAgIHRoZSB0cmFjZSkuCisKKyAgIFJldHVybiAtMiBpZiB0cmFjZW1hbGxvYyBpcyBkaXNhYmxlZC4KKworICAgSWYgbWVtb3J5IGJsb2NrIGlzIGFscmVhZHkgdHJhY2tlZCwgdXBkYXRlIHRoZSBleGlzdGluZyB0cmFjZS4gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlUcmFjZU1hbGxvY19UcmFjaygKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sCisgICAgUHlfdWludHB0cl90IHB0ciwKKyAgICBzaXplX3Qgc2l6ZSk7CisKKy8qIFVudHJhY2sgYW4gYWxsb2NhdGVkIG1lbW9yeSBibG9jayBpbiB0aGUgdHJhY2VtYWxsb2MgbW9kdWxlLgorICAgRG8gbm90aGluZyBpZiB0aGUgYmxvY2sgd2FzIG5vdCB0cmFja2VkLgorCisgICBSZXR1cm4gLTIgaWYgdHJhY2VtYWxsb2MgaXMgZGlzYWJsZWQsIG90aGVyd2lzZSByZXR1cm4gMC4gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlUcmFjZU1hbGxvY19VbnRyYWNrKAorICAgIF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwKKyAgICBQeV91aW50cHRyX3QgcHRyKTsKKworLyogR2V0IHRoZSB0cmFjZWJhY2sgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzIGFsbG9jYXRlZC4KKworICAgUmV0dXJuIGEgdHVwbGUgb2YgKGZpbGVuYW1lOiBzdHIsIGxpbmVubzogaW50KSB0dXBsZXMuCisKKyAgIFJldHVybiBOb25lIGlmIHRoZSB0cmFjZW1hbGxvYyBtb2R1bGUgaXMgZGlzYWJsZWQgb3IgaWYgdGhlIG1lbW9yeSBibG9jaworICAgaXMgbm90IHRyYWNrZWQgYnkgdHJhY2VtYWxsb2MuCisKKyAgIFJhaXNlIGFuIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIE5VTEwgb24gZXJyb3IuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgX1B5VHJhY2VNYWxsb2NfR2V0VHJhY2ViYWNrKAorICAgIF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwKKyAgICBQeV91aW50cHRyX3QgcHRyKTsKKyNlbmRpZiAgIC8qICFQeV9MSU1JVEVEX0FQSSAqLworCiAKIC8qIEJFV0FSRToKIApkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXBvcnQuaCBiL0luY2x1ZGUvcHlwb3J0LmgKaW5kZXggNjZlMDBkNC4uOGIwYTg5ZiAxMDA2NDQKLS0tIGEvSW5jbHVkZS9weXBvcnQuaAorKysgYi9JbmNsdWRlL3B5cG9ydC5oCkBAIC04OTcsNCArODk3LDggQEAKICNlbmRpZiAvKiBfTVNDX1ZFUiA+PSAxOTAwICovCiAjZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLwogCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorI2VuZGlmCisKICNlbmRpZiAvKiBQeV9QWVBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weXN0YXRlLmggYi9JbmNsdWRlL3B5c3RhdGUuaAppbmRleCAwNDk5YTc0Li5kNjlkNGM5IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5c3RhdGUuaAorKysgYi9JbmNsdWRlL3B5c3RhdGUuaApAQCAtMjQxLDExICsyNDEsMjMgQEAKICovCiBQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUodm9pZCk7CiAKLS8qIEhlbHBlci9kaWFnbm9zdGljIGZ1bmN0aW9uIC0gcmV0dXJuIDEgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCi0gKiBjdXJyZW50bHkgaG9sZHMgdGhlIEdJTCwgMCBvdGhlcndpc2UKLSAqLwogI2lmbmRlZiBQeV9MSU1JVEVEX0FQSQorLyogSXNzdWUgIzI2NTU4OiBGbGFnIHRvIGRpc2FibGUgUHlHSUxTdGF0ZV9DaGVjaygpLgorICAgSWYgc2V0IHRvIG5vbi16ZXJvLCBQeUdJTFN0YXRlX0NoZWNrKCkgYWx3YXlzIHJldHVybiAxLiAqLworUHlBUElfREFUQShpbnQpIF9QeUdJTFN0YXRlX2NoZWNrX2VuYWJsZWQ7CisKKy8qIEhlbHBlci9kaWFnbm9zdGljIGZ1bmN0aW9uIC0gcmV0dXJuIDEgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCisgICBjdXJyZW50bHkgaG9sZHMgdGhlIEdJTCwgMCBvdGhlcndpc2UuCisKKyAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIDEgaWYgX1B5R0lMU3RhdGVfY2hlY2tfZW5hYmxlZCBpcyBub24temVyby4gKi8KIFB5QVBJX0ZVTkMoaW50KSBQeUdJTFN0YXRlX0NoZWNrKHZvaWQpOworCisvKiBVbnNhZmUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzaW5nbGUgUHlJbnRlcnByZXRlclN0YXRlIHVzZWQgYnkgdGhpcyBwcm9jZXNzJworICAgR0lMU3RhdGUgaW1wbGVtZW50YXRpb24uCisKKyAgIFJldHVybiBOVUxMIGJlZm9yZSBfUHlHSUxTdGF0ZV9Jbml0KCkgaXMgY2FsbGVkIGFuZCBhZnRlciBfUHlHSUxTdGF0ZV9GaW5pKCkKKyAgIGlzIGNhbGxlZC4gKi8KK1B5QVBJX0ZVTkMoUHlJbnRlcnByZXRlclN0YXRlICopIF9QeUdJTFN0YXRlX0dldEludGVycHJldGVyU3RhdGVVbnNhZmUodm9pZCk7CiAjZW5kaWYKIAogI2VuZGlmICAgLyogI2lmZGVmIFdJVEhfVEhSRUFEICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5dGhvbnJ1bi5oIGIvSW5jbHVkZS9weXRob25ydW4uaAppbmRleCA5YzJlODEzLi5jZmEwYTlmIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGhvbnJ1bi5oCisrKyBiL0luY2x1ZGUvcHl0aG9ucnVuLmgKQEAgLTY2LDggKzY2LDggQEAKICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgICAgICAgLyogZGVjb2RlZCBmcm9tIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nICovCiAgICAgY29uc3QgY2hhciogZW5jLAogICAgIGludCBzdGFydCwKLSAgICBjaGFyICpwczEsCi0gICAgY2hhciAqcHMyLAorICAgIGNvbnN0IGNoYXIgKnBzMSwKKyAgICBjb25zdCBjaGFyICpwczIsCiAgICAgUHlDb21waWxlckZsYWdzICpmbGFncywKICAgICBpbnQgKmVycmNvZGUsCiAgICAgUHlBcmVuYSAqYXJlbmEpOwpAQCAtNzYsOCArNzYsOCBAQAogICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwKICAgICBjb25zdCBjaGFyKiBlbmMsCiAgICAgaW50IHN0YXJ0LAotICAgIGNoYXIgKnBzMSwKLSAgICBjaGFyICpwczIsCisgICAgY29uc3QgY2hhciAqcHMxLAorICAgIGNvbnN0IGNoYXIgKnBzMiwKICAgICBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLAogICAgIGludCAqZXJyY29kZSwKICAgICBQeUFyZW5hICphcmVuYSk7CmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5dGltZS5oIGIvSW5jbHVkZS9weXRpbWUuaAppbmRleCA0OTQzMjJjLi45ODYxMmUxIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGltZS5oCisrKyBiL0luY2x1ZGUvcHl0aW1lLmgKQEAgLTMwLDcgKzMwLDEwIEBACiAgICAgX1B5VGltZV9ST1VORF9GTE9PUj0wLAogICAgIC8qIFJvdW5kIHRvd2FyZHMgaW5maW5pdHkgKCtpbmYpLgogICAgICAgIEZvciBleGFtcGxlLCB1c2VkIGZvciB0aW1lb3V0IHRvIHdhaXQgImF0IGxlYXN0IiBOIHNlY29uZHMuICovCi0gICAgX1B5VGltZV9ST1VORF9DRUlMSU5HCisgICAgX1B5VGltZV9ST1VORF9DRUlMSU5HPTEsCisgICAgLyogUm91bmQgdG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8gbmVhcmVzdCBldmVuIGludGVnZXIuCisgICAgICAgRm9yIGV4YW1wbGUsIHVzZWQgdG8gcm91bmQgZnJvbSBhIFB5dGhvbiBmbG9hdC4gKi8KKyAgICBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTgogfSBfUHlUaW1lX3JvdW5kX3Q7CiAKIC8qIENvbnZlcnQgYSB0aW1lX3QgdG8gYSBQeUxvbmcuICovCmRpZmYgLS1naXQgYS9JbmNsdWRlL3NldG9iamVjdC5oIGIvSW5jbHVkZS9zZXRvYmplY3QuaAppbmRleCBmMTdiYzFiLi44N2VjMWM4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3NldG9iamVjdC5oCisrKyBiL0luY2x1ZGUvc2V0b2JqZWN0LmgKQEAgLTEwLDEyICsxMCwxMyBAQAogCiAvKiBUaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgZW50cmllcyBpbiB0aGUgdGFibGU6CiAKLTEuIFVudXNlZDogIGtleSA9PSBOVUxMCi0yLiBBY3RpdmU6ICBrZXkgIT0gTlVMTCBhbmQga2V5ICE9IGR1bW15Ci0zLiBEdW1teTogICBrZXkgPT0gZHVtbXkKKzEuIFVudXNlZDogIGtleSA9PSBOVUxMIGFuZCBoYXNoID09IDAKKzIuIER1bW15OiAgIGtleSA9PSBkdW1teSBhbmQgaGFzaCA9PSAtMQorMy4gQWN0aXZlOiAga2V5ICE9IE5VTEwgYW5kIGtleSAhPSBkdW1teSBhbmQgaGFzaCAhPSAtMQogCi1UaGUgaGFzaCBmaWVsZCBvZiBVbnVzZWQgc2xvdHMgaGF2ZSBubyBtZWFuaW5nLgotVGhlIGhhc2ggZmllbGQgb2YgRHVtbW55IHNsb3RzIGFyZSBzZXQgdG8gLTEKK1RoZSBoYXNoIGZpZWxkIG9mIFVudXNlZCBzbG90cyBpcyBhbHdheXMgemVyby4KKworVGhlIGhhc2ggZmllbGQgb2YgRHVtbXkgc2xvdHMgYXJlIHNldCB0byAtMQogbWVhbmluZyB0aGF0IGR1bW15IGVudHJpZXMgY2FuIGJlIGRldGVjdGVkIGJ5CiBlaXRoZXIgZW50cnktPmtleT09ZHVtbXkgb3IgYnkgZW50cnktPmhhc2g9PS0xLgogKi8KZGlmZiAtLWdpdCBhL0luY2x1ZGUvdHJhY2ViYWNrLmggYi9JbmNsdWRlL3RyYWNlYmFjay5oCmluZGV4IGMzZWNiZTIuLmRiYzc2OWIgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvdHJhY2ViYWNrLmgKKysrIGIvSW5jbHVkZS90cmFjZWJhY2suaApAQCAtNTMsMTkgKzUzLDYzIEBACiAgICAgUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKTsKIAogLyogV3JpdGUgdGhlIHRyYWNlYmFjayBvZiBhbGwgdGhyZWFkcyBpbnRvIHRoZSBmaWxlICdmZCcuIGN1cnJlbnRfdGhyZWFkIGNhbiBiZQotICAgTlVMTC4gUmV0dXJuIE5VTEwgb24gc3VjY2Vzcywgb3IgYW4gZXJyb3IgbWVzc2FnZSBvbiBlcnJvci4KKyAgIE5VTEwuCisKKyAgIFJldHVybiBOVUxMIG9uIHN1Y2Nlc3MsIG9yIGFuIGVycm9yIG1lc3NhZ2Ugb24gZXJyb3IuCiAKICAgIFRoaXMgZnVuY3Rpb24gaXMgd3JpdHRlbiBmb3IgZGVidWcgcHVycG9zZSBvbmx5LiBJdCBjYWxscwogICAgX1B5X0R1bXBUcmFjZWJhY2soKSBmb3IgZWFjaCB0aHJlYWQsIGFuZCBzbyBoYXMgdGhlIHNhbWUgbGltaXRhdGlvbnMuIEl0CiAgICBvbmx5IHdyaXRlIHRoZSB0cmFjZWJhY2sgb2YgdGhlIGZpcnN0IDEwMCB0aHJlYWRzOiB3cml0ZSAiLi4uIiBpZiB0aGVyZSBhcmUKICAgIG1vcmUgdGhyZWFkcy4KIAorICAgSWYgY3VycmVudF90c3RhdGUgaXMgTlVMTCwgdGhlIGZ1bmN0aW9uIHRyaWVzIHRvIGdldCB0aGUgUHl0aG9uIHRocmVhZCBzdGF0ZQorICAgb2YgdGhlIGN1cnJlbnQgdGhyZWFkLiBJdCBpcyBub3QgYW4gZXJyb3IgaWYgdGhlIGZ1bmN0aW9uIGlzIHVuYWJsZSB0byBnZXQKKyAgIHRoZSBjdXJyZW50IFB5dGhvbiB0aHJlYWQgc3RhdGUuCisKKyAgIElmIGludGVycCBpcyBOVUxMLCB0aGUgZnVuY3Rpb24gdHJpZXMgdG8gZ2V0IHRoZSBpbnRlcnByZXRlciBzdGF0ZSBmcm9tCisgICB0aGUgY3VycmVudCBQeXRob24gdGhyZWFkIHN0YXRlLCBvciBmcm9tCisgICBfUHlHSUxTdGF0ZV9HZXRJbnRlcnByZXRlclN0YXRlVW5zYWZlKCkgaW4gbGFzdCByZXNvcnQuCisKKyAgIEl0IGlzIGJldHRlciB0byBwYXNzIE5VTEwgdG8gaW50ZXJwIGFuZCBjdXJyZW50X3RzdGF0ZSwgdGhlIGZ1bmN0aW9uIHRyaWVzCisgICBkaWZmZXJlbnQgb3B0aW9ucyB0byByZXRyaWV2ZSB0aGVzZSBpbmZvcm1hdGlvbnMuCisKICAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCiAKIFB5QVBJX0ZVTkMoY29uc3QgY2hhciopIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcygKLSAgICBpbnQgZmQsIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwLAotICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnRfdGhyZWFkKTsKKyAgICBpbnQgZmQsCisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnAsCisgICAgUHlUaHJlYWRTdGF0ZSAqY3VycmVudF90c3RhdGUpOwogCisjaWZuZGVmIFB5X0xJTUlURURfQVBJCisKKy8qIFdyaXRlIGEgVW5pY29kZSBvYmplY3QgaW50byB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiBFbmNvZGUgdGhlIHN0cmluZyB0bworICAgQVNDSUkgdXNpbmcgdGhlIGJhY2tzbGFzaHJlcGxhY2UgZXJyb3IgaGFuZGxlci4KKworICAgRG8gbm90aGluZyBpZiB0ZXh0IGlzIG5vdCBhIFVuaWNvZGUgb2JqZWN0LiBUaGUgZnVuY3Rpb24gYWNjZXB0cyBVbmljb2RlCisgICBzdHJpbmcgd2hpY2ggaXMgbm90IHJlYWR5IChQeVVuaWNvZGVfV0NIQVJfS0lORCkuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9EdW1wQVNDSUkoaW50IGZkLCBQeU9iamVjdCAqdGV4dCk7CisKKy8qIEZvcm1hdCBhbiBpbnRlZ2VyIGFzIGRlY2ltYWwgaW50byB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLgorCisgICBUaGlzIGZ1bmN0aW9uIGlzIHNpZ25hbCBzYWZlLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlfRHVtcERlY2ltYWwoCisgICAgaW50IGZkLAorICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCisvKiBGb3JtYXQgYW4gaW50ZWdlciBhcyBoZXhhZGVjaW1hbCBpbnRvIHRoZSBmaWxlIGRlc2NyaXB0b3IgZmQgd2l0aCBhdCBsZWFzdAorICAgd2lkdGggZGlnaXRzLgorCisgICBUaGUgbWF4aW11bSB3aWR0aCBpcyBzaXplb2YodW5zaWduZWQgbG9uZykqMiBkaWdpdHMuCisKKyAgIFRoaXMgZnVuY3Rpb24gaXMgc2lnbmFsIHNhZmUuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9EdW1wSGV4YWRlY2ltYWwoCisgICAgaW50IGZkLAorICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsCisgICAgUHlfc3NpemVfdCB3aWR0aCk7CisKKyNlbmRpZiAgIC8qICFQeV9MSU1JVEVEX0FQSSAqLwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL0luY2x1ZGUvdW5pY29kZW9iamVjdC5oIGIvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKaW5kZXggNTMzZGQ3NS4uMWFmNjIwZCAxMDA2NDQKLS0tIGEvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKKysrIGIvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgKQEAgLTkwMCw3ICs5MDAsNyBAQAogICAgIC8qIG1pbmltdW0gY2hhcmFjdGVyIChkZWZhdWx0OiAxMjcsIEFTQ0lJKSAqLwogICAgIFB5X1VDUzQgbWluX2NoYXI7CiAKLSAgICAvKiBJZiBub24temVybywgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgYnkgMjUlIChkZWZhdWx0OiAwKS4gKi8KKyAgICAvKiBJZiBub24temVybywgb3ZlcmFsbG9jYXRlIHRoZSBidWZmZXIgKGRlZmF1bHQ6IDApLiAqLwogICAgIHVuc2lnbmVkIGNoYXIgb3ZlcmFsbG9jYXRlOwogCiAgICAgLyogSWYgcmVhZG9ubHkgaXMgMSwgYnVmZmVyIGlzIGEgc2hhcmVkIHN0cmluZyAoY2Fubm90IGJlIG1vZGlmaWVkKQpAQCAtOTM0LDYgKzkzNCwyMyBAQAogX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlSW50ZXJuYWwoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW5ndGgsIFB5X1VDUzQgbWF4Y2hhcik7CiAKKy8qIFByZXBhcmUgdGhlIGJ1ZmZlciB0byBoYXZlIGF0IGxlYXN0IHRoZSBraW5kIEtJTkQuCisgICBGb3IgZXhhbXBsZSwga2luZD1QeVVuaWNvZGVfMkJZVEVfS0lORCBlbnN1cmVzIHRoYXQgdGhlIHdyaXRlciB3aWxsCisgICBzdXBwb3J0IGNoYXJhY3RlcnMgaW4gcmFuZ2UgVSswMDAtVStGRkZGLgorCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCByYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiAtMSBvbiBlcnJvci4gKi8KKyNkZWZpbmUgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZChXUklURVIsIEtJTkQpICAgICAgICAgICAgICAgICAgICBcCisgICAgKGFzc2VydCgoS0lORCkgIT0gUHlVbmljb2RlX1dDSEFSX0tJTkQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoS0lORCkgPD0gKFdSSVRFUiktPmtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgPyAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIDogX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZEludGVybmFsKChXUklURVIpLCAoS0lORCkpKQorCisvKiBEb24ndCBjYWxsIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHksIHVzZSB0aGUgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgpCisgICBtYWNybyBpbnN0ZWFkLiAqLworUHlBUElfRlVOQyhpbnQpCitfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kSW50ZXJuYWwoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCk7CisKIC8qIEFwcGVuZCBhIFVuaWNvZGUgY2hhcmFjdGVyLgogICAgUmV0dXJuIDAgb24gc3VjY2VzcywgcmFpc2UgYW4gZXhjZXB0aW9uIGFuZCByZXR1cm4gLTEgb24gZXJyb3IuICovCiBQeUFQSV9GVU5DKGludCkKQEAgLTIyNTMsNiArMjI3MCwxMCBAQAogLyogQ2xlYXIgYWxsIHN0YXRpYyBzdHJpbmdzLiAqLwogUHlBUElfRlVOQyh2b2lkKSBfUHlVbmljb2RlX0NsZWFyU3RhdGljU3RyaW5ncyh2b2lkKTsKIAorLyogRmFzdCBlcXVhbGl0eSBjaGVjayB3aGVuIHRoZSBpbnB1dHMgYXJlIGtub3duIHRvIGJlIGV4YWN0IHVuaWNvZGUgdHlwZXMKKyAgIGFuZCB3aGVyZSB0aGUgaGFzaCB2YWx1ZXMgYXJlIGVxdWFsIChpLmUuIGEgdmVyeSBwcm9iYWJsZSBtYXRjaCkgKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0VRKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS93YXJuaW5ncy5oIGIvSW5jbHVkZS93YXJuaW5ncy5oCmluZGV4IGVmZmI5ZmFkLi5jMWM2OTkyIDEwMDY0NAotLS0gYS9JbmNsdWRlL3dhcm5pbmdzLmgKKysrIGIvSW5jbHVkZS93YXJuaW5ncy5oCkBAIC0xNyw2ICsxNywxMyBAQAogICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCiAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAgICAgICAgIC8qIEFTQ0lJLWVuY29kZWQgc3RyaW5nICAqLwogICAgIC4uLik7CisKKy8qIEVtaXQgYSBSZXNvdXJjZVdhcm5pbmcgd2FybmluZyAqLworUHlBUElfRlVOQyhpbnQpIFB5RXJyX1Jlc291cmNlV2FybmluZygKKyAgICBQeU9iamVjdCAqc291cmNlLAorICAgIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwsCisgICAgY29uc3QgY2hhciAqZm9ybWF0LCAgICAgICAgIC8qIEFTQ0lJLWVuY29kZWQgc3RyaW5nICAqLworICAgIC4uLik7CiAjaWZuZGVmIFB5X0xJTUlURURfQVBJCiBQeUFQSV9GVU5DKGludCkgUHlFcnJfV2FybkV4cGxpY2l0T2JqZWN0KAogICAgIFB5T2JqZWN0ICpjYXRlZ29yeSwKZGlmZiAtLWdpdCBhL0xpYi9fY29sbGVjdGlvbnNfYWJjLnB5IGIvTGliL19jb2xsZWN0aW9uc19hYmMucHkKaW5kZXggZmM5YzlmMS4uZmZlZTM4NSAxMDA2NDQKLS0tIGEvTGliL19jb2xsZWN0aW9uc19hYmMucHkKKysrIGIvTGliL19jb2xsZWN0aW9uc19hYmMucHkKQEAgLTEwLDcgKzEwLDcgQEAKIGltcG9ydCBzeXMKIAogX19hbGxfXyA9IFsiQXdhaXRhYmxlIiwgIkNvcm91dGluZSIsICJBc3luY0l0ZXJhYmxlIiwgIkFzeW5jSXRlcmF0b3IiLAotICAgICAgICAgICAiSGFzaGFibGUiLCAiSXRlcmFibGUiLCAiSXRlcmF0b3IiLCAiR2VuZXJhdG9yIiwKKyAgICAgICAgICAgIkhhc2hhYmxlIiwgIkl0ZXJhYmxlIiwgIkl0ZXJhdG9yIiwgIkdlbmVyYXRvciIsICJSZXZlcnNpYmxlIiwKICAgICAgICAgICAgIlNpemVkIiwgIkNvbnRhaW5lciIsICJDYWxsYWJsZSIsCiAgICAgICAgICAgICJTZXQiLCAiTXV0YWJsZVNldCIsCiAgICAgICAgICAgICJNYXBwaW5nIiwgIk11dGFibGVNYXBwaW5nIiwKQEAgLTI0MCw2ICsyNDAsMjUgQEAKIEl0ZXJhdG9yLnJlZ2lzdGVyKHppcF9pdGVyYXRvcikKIAogCitjbGFzcyBSZXZlcnNpYmxlKEl0ZXJhYmxlKToKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBSZXZlcnNpYmxlOgorICAgICAgICAgICAgZm9yIEIgaW4gQy5fX21yb19fOgorICAgICAgICAgICAgICAgIGlmICJfX3JldmVyc2VkX18iIGluIEIuX19kaWN0X186CisgICAgICAgICAgICAgICAgICAgIGlmIEIuX19kaWN0X19bIl9fcmV2ZXJzZWRfXyJdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKwogY2xhc3MgR2VuZXJhdG9yKEl0ZXJhdG9yKToKIAogICAgIF9fc2xvdHNfXyA9ICgpCkBAIC02NzAsNyArNjg5LDcgQEAKICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gdiA9PSB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIHYgaXMgdmFsdWUgb3IgdiA9PSB2YWx1ZQogCiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICBmb3Iga2V5IGluIHNlbGYuX21hcHBpbmc6CkBAIC02ODUsNyArNzA0LDggQEAKIAogICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgdmFsdWUpOgogICAgICAgICBmb3Iga2V5IGluIHNlbGYuX21hcHBpbmc6Ci0gICAgICAgICAgICBpZiB2YWx1ZSA9PSBzZWxmLl9tYXBwaW5nW2tleV06CisgICAgICAgICAgICB2ID0gc2VsZi5fbWFwcGluZ1trZXldCisgICAgICAgICAgICBpZiB2IGlzIHZhbHVlIG9yIHYgPT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKQEAgLTc5NCw3ICs4MTQsNyBAQAogIyMjIFNFUVVFTkNFUyAjIyMKIAogCi1jbGFzcyBTZXF1ZW5jZShTaXplZCwgSXRlcmFibGUsIENvbnRhaW5lcik6CitjbGFzcyBTZXF1ZW5jZShTaXplZCwgUmV2ZXJzaWJsZSwgQ29udGFpbmVyKToKIAogICAgICIiIkFsbCB0aGUgb3BlcmF0aW9ucyBvbiBhIHJlYWQtb25seSBzZXF1ZW5jZS4KIApAQCAtODIwLDcgKzg0MCw3IEBACiAKICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHZhbHVlKToKICAgICAgICAgZm9yIHYgaW4gc2VsZjoKLSAgICAgICAgICAgIGlmIHYgPT0gdmFsdWU6CisgICAgICAgICAgICBpZiB2IGlzIHZhbHVlIG9yIHYgPT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKZGlmZiAtLWdpdCBhL0xpYi9fcHlkZWNpbWFsLnB5IGIvTGliL19weWRlY2ltYWwucHkKaW5kZXggYzcxOTQyNC4uN2JjZjc1ZiAxMDA2NDQKLS0tIGEvTGliL19weWRlY2ltYWwucHkKKysrIGIvTGliL19weWRlY2ltYWwucHkKQEAgLTE0OCw3ICsxNDgsNyBAQAogX19uYW1lX18gPSAnZGVjaW1hbCcgICAgIyBGb3IgcGlja2xpbmcKIF9fdmVyc2lvbl9fID0gJzEuNzAnICAgICMgSGlnaGVzdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoaXMgY29tcGxpZXMgd2l0aAogICAgICAgICAgICAgICAgICAgICAgICAgIyBTZWUgaHR0cDovL3NwZWxlb3Ryb3ZlLmNvbS9kZWNpbWFsLwotX19saWJtcGRlY192ZXJzaW9uX18gPSAiMi40LjEiICMgY29tcGF0aWJsZSBsaWJtcGRlYyB2ZXJzaW9uCitfX2xpYm1wZGVjX3ZlcnNpb25fXyA9ICIyLjQuMiIgIyBjb21wYXRpYmxlIGxpYm1wZGVjIHZlcnNpb24KIAogaW1wb3J0IG1hdGggYXMgX21hdGgKIGltcG9ydCBudW1iZXJzIGFzIF9udW1iZXJzCkBAIC0xMDEwLDYgKzEwMTAsNTYgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHJldHVybiBEZWNpbWFsVHVwbGUoc2VsZi5fc2lnbiwgdHVwbGUobWFwKGludCwgc2VsZi5faW50KSksIHNlbGYuX2V4cCkKIAorICAgIGRlZiBhc19pbnRlZ2VyX3JhdGlvKHNlbGYpOgorICAgICAgICAiIiJFeHByZXNzIGEgZmluaXRlIERlY2ltYWwgaW5zdGFuY2UgaW4gdGhlIGZvcm0gbiAvIGQuCisKKyAgICAgICAgUmV0dXJucyBhIHBhaXIgKG4sIGQpIG9mIGludGVnZXJzLiAgV2hlbiBjYWxsZWQgb24gYW4gaW5maW5pdHkKKyAgICAgICAgb3IgTmFOLCByYWlzZXMgT3ZlcmZsb3dFcnJvciBvciBWYWx1ZUVycm9yIHJlc3BlY3RpdmVseS4KKworICAgICAgICA+Pj4gRGVjaW1hbCgnMy4xNCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoMTU3LCA1MCkKKyAgICAgICAgPj4+IERlY2ltYWwoJy0xMjNlNScpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoLTEyMzAwMDAwLCAxKQorICAgICAgICA+Pj4gRGVjaW1hbCgnMC4wMCcpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAoMCwgMSkKKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGlmIHNlbGYuaXNfbmFuKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKCJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIikKKworICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiAwLCAxCisKKyAgICAgICAgIyBGaW5kIG4sIGQgaW4gbG93ZXN0IHRlcm1zIHN1Y2ggdGhhdCBhYnMoc2VsZikgPT0gbiAvIGQ7CisgICAgICAgICMgd2UnbGwgZGVhbCB3aXRoIHRoZSBzaWduIGxhdGVyLgorICAgICAgICBuID0gaW50KHNlbGYuX2ludCkKKyAgICAgICAgaWYgc2VsZi5fZXhwID49IDA6CisgICAgICAgICAgICAjIHNlbGYgaXMgYW4gaW50ZWdlci4KKyAgICAgICAgICAgIG4sIGQgPSBuICogMTAqKnNlbGYuX2V4cCwgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBGaW5kIGQyLCBkNSBzdWNoIHRoYXQgYWJzKHNlbGYpID0gbiAvICgyKipkMiAqIDUqKmQ1KS4KKyAgICAgICAgICAgIGQ1ID0gLXNlbGYuX2V4cAorICAgICAgICAgICAgd2hpbGUgZDUgPiAwIGFuZCBuICUgNSA9PSAwOgorICAgICAgICAgICAgICAgIG4gLy89IDUKKyAgICAgICAgICAgICAgICBkNSAtPSAxCisKKyAgICAgICAgICAgICMgKG4gJiAtbikuYml0X2xlbmd0aCgpIC0gMSBjb3VudHMgdHJhaWxpbmcgemVyb3MgaW4gYmluYXJ5CisgICAgICAgICAgICAjIHJlcHJlc2VudGF0aW9uIG9mIG4gKHByb3ZpZGVkIG4gaXMgbm9uemVybykuCisgICAgICAgICAgICBkMiA9IC1zZWxmLl9leHAKKyAgICAgICAgICAgIHNoaWZ0MiA9IG1pbigobiAmIC1uKS5iaXRfbGVuZ3RoKCkgLSAxLCBkMikKKyAgICAgICAgICAgIGlmIHNoaWZ0MjoKKyAgICAgICAgICAgICAgICBuID4+PSBzaGlmdDIKKyAgICAgICAgICAgICAgICBkMiAtPSBzaGlmdDIKKworICAgICAgICAgICAgZCA9IDUqKmQ1IDw8IGQyCisKKyAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgIG4gPSAtbgorICAgICAgICByZXR1cm4gbiwgZAorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICAiIiJSZXByZXNlbnRzIHRoZSBudW1iZXIgYXMgYW4gaW5zdGFuY2Ugb2YgRGVjaW1hbC4iIiIKICAgICAgICAgIyBJbnZhcmlhbnQ6ICBldmFsKHJlcHIoZCkpID09IGQKZGlmZiAtLWdpdCBhL0xpYi9fcHlpby5weSBiL0xpYi9fcHlpby5weQppbmRleCAwZDk4Yjc0Li5kMDk0N2YwIDEwMDY0NAotLS0gYS9MaWIvX3B5aW8ucHkKKysrIGIvTGliL19weWlvLnB5CkBAIC02LDcgKzYsNiBAQAogaW1wb3J0IGFiYwogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGVycm5vCi1pbXBvcnQgYXJyYXkKIGltcG9ydCBzdGF0CiBpbXBvcnQgc3lzCiAjIEltcG9ydCBfdGhyZWFkIGluc3RlYWQgb2YgdGhyZWFkaW5nIHRvIHJlZHVjZSBzdGFydHVwIGNvc3QKQEAgLTE2MSw2ICsxNjAsOCBAQAogICAgIG9wZW5lZCBpbiBhIHRleHQgbW9kZSwgYW5kIGZvciBieXRlcyBhIEJ5dGVzSU8gY2FuIGJlIHVzZWQgbGlrZSBhIGZpbGUKICAgICBvcGVuZWQgaW4gYSBiaW5hcnkgbW9kZS4KICAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShmaWxlLCBpbnQpOgorICAgICAgICBmaWxlID0gb3MuZnNwYXRoKGZpbGUpCiAgICAgaWYgbm90IGlzaW5zdGFuY2UoZmlsZSwgKHN0ciwgYnl0ZXMsIGludCkpOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQgZmlsZTogJXIiICUgZmlsZSkKICAgICBpZiBub3QgaXNpbnN0YW5jZShtb2RlLCBzdHIpOgpAQCAtMTgyLDggKzE4Myw4IEBACiAgICAgdGV4dCA9ICJ0IiBpbiBtb2RlcwogICAgIGJpbmFyeSA9ICJiIiBpbiBtb2RlcwogICAgIGlmICJVIiBpbiBtb2RlczoKLSAgICAgICAgaWYgY3JlYXRpbmcgb3Igd3JpdGluZyBvciBhcHBlbmRpbmc6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW4ndCB1c2UgVSBhbmQgd3JpdGluZyBtb2RlIGF0IG9uY2UiKQorICAgICAgICBpZiBjcmVhdGluZyBvciB3cml0aW5nIG9yIGFwcGVuZGluZyBvciB1cGRhdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgVSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAneCcsICd3JywgJ2EnLCBvciAnKyciKQogICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgd2FybmluZ3Mud2FybigiJ1UnIG1vZGUgaXMgZGVwcmVjYXRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQpAQCAtMTUxNiw3ICsxNTE3LDcgQEAKICAgICAgICAgaWYgc2VsZi5fZmQgPj0gMCBhbmQgc2VsZi5fY2xvc2VmZCBhbmQgbm90IHNlbGYuY2xvc2VkOgogICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCd1bmNsb3NlZCBmaWxlICVyJyAlIChzZWxmLCksIFJlc291cmNlV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIsIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL19zdHJwdGltZS5weSBiL0xpYi9fc3RycHRpbWUucHkKaW5kZXggZjg0MjI3Yi4uZmU5NDM2MSAxMDA2NDQKLS0tIGEvTGliL19zdHJwdGltZS5weQorKysgYi9MaWIvX3N0cnB0aW1lLnB5CkBAIC0xOTksMTIgKzE5OSwxNSBAQAogICAgICAgICAgICAgJ2YnOiByIig/UDxmPlswLTldezEsNn0pIiwKICAgICAgICAgICAgICdIJzogciIoP1A8SD4yWzAtM118WzAtMV1cZHxcZCkiLAogICAgICAgICAgICAgJ0knOiByIig/UDxJPjFbMC0yXXwwWzEtOV18WzEtOV0pIiwKKyAgICAgICAgICAgICdHJzogciIoP1A8Rz5cZFxkXGRcZCkiLAogICAgICAgICAgICAgJ2onOiByIig/UDxqPjM2WzAtNl18M1swLTVdXGR8WzEtMl1cZFxkfDBbMS05XVxkfDAwWzEtOV18WzEtOV1cZHwwWzEtOV18WzEtOV0pIiwKICAgICAgICAgICAgICdtJzogciIoP1A8bT4xWzAtMl18MFsxLTldfFsxLTldKSIsCiAgICAgICAgICAgICAnTSc6IHIiKD9QPE0+WzAtNV1cZHxcZCkiLAogICAgICAgICAgICAgJ1MnOiByIig/UDxTPjZbMC0xXXxbMC01XVxkfFxkKSIsCiAgICAgICAgICAgICAnVSc6IHIiKD9QPFU+NVswLTNdfFswLTRdXGR8XGQpIiwKICAgICAgICAgICAgICd3JzogciIoP1A8dz5bMC02XSkiLAorICAgICAgICAgICAgJ3UnOiByIig/UDx1PlsxLTddKSIsCisgICAgICAgICAgICAnVic6IHIiKD9QPFY+NVswLTNdfDBbMS05XXxbMS00XVxkfFxkKSIsCiAgICAgICAgICAgICAjIFcgaXMgc2V0IGJlbG93IGJ5IHVzaW5nICdVJwogICAgICAgICAgICAgJ3knOiByIig/UDx5PlxkXGQpIiwKICAgICAgICAgICAgICNYWFg6IERvZXMgJ1knIG5lZWQgdG8gd29ycnkgYWJvdXQgaGF2aW5nIGxlc3Mgb3IgbW9yZSB0aGFuCkBAIC0yOTksNiArMzAyLDIyIEBACiAgICAgICAgIHJldHVybiAxICsgZGF5c190b193ZWVrICsgZGF5X29mX3dlZWsKIAogCitkZWYgX2NhbGNfanVsaWFuX2Zyb21fVihpc29feWVhciwgaXNvX3dlZWssIGlzb193ZWVrZGF5KToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIEp1bGlhbiBkYXkgYmFzZWQgb24gdGhlIElTTyA4NjAxIHllYXIsIHdlZWssIGFuZCB3ZWVrZGF5LgorICAgIElTTyB3ZWVrcyBzdGFydCBvbiBNb25kYXlzLCB3aXRoIHdlZWsgMDEgYmVpbmcgdGhlIHdlZWsgY29udGFpbmluZyA0IEphbi4KKyAgICBJU08gd2VlayBkYXlzIHJhbmdlIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLgorICAgICIiIgorICAgIGNvcnJlY3Rpb24gPSBkYXRldGltZV9kYXRlKGlzb195ZWFyLCAxLCA0KS5pc293ZWVrZGF5KCkgKyAzCisgICAgb3JkaW5hbCA9IChpc29fd2VlayAqIDcpICsgaXNvX3dlZWtkYXkgLSBjb3JyZWN0aW9uCisgICAgIyBvcmRpbmFsIG1heSBiZSBuZWdhdGl2ZSBvciAwIG5vdywgd2hpY2ggbWVhbnMgdGhlIGRhdGUgaXMgaW4gdGhlIHByZXZpb3VzCisgICAgIyBjYWxlbmRhciB5ZWFyCisgICAgaWYgb3JkaW5hbCA8IDE6CisgICAgICAgIG9yZGluYWwgKz0gZGF0ZXRpbWVfZGF0ZShpc29feWVhciwgMSwgMSkudG9vcmRpbmFsKCkKKyAgICAgICAgaXNvX3llYXIgLT0gMQorICAgICAgICBvcmRpbmFsIC09IGRhdGV0aW1lX2RhdGUoaXNvX3llYXIsIDEsIDEpLnRvb3JkaW5hbCgpCisgICAgcmV0dXJuIGlzb195ZWFyLCBvcmRpbmFsCisKKwogZGVmIF9zdHJwdGltZShkYXRhX3N0cmluZywgZm9ybWF0PSIlYSAlYiAlZCAlSDolTTolUyAlWSIpOgogICAgICIiIlJldHVybiBhIDItdHVwbGUgY29uc2lzdGluZyBvZiBhIHRpbWUgc3RydWN0IGFuZCBhbiBpbnQgY29udGFpbmluZwogICAgIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGJhc2VkIG9uIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZQpAQCAtMzQ1LDE1ICszNjQsMTUgQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5jb252ZXJ0ZWQgZGF0YSByZW1haW5zOiAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3N0cmluZ1tmb3VuZC5lbmQoKTpdKQogCi0gICAgeWVhciA9IE5vbmUKKyAgICBpc29feWVhciA9IHllYXIgPSBOb25lCiAgICAgbW9udGggPSBkYXkgPSAxCiAgICAgaG91ciA9IG1pbnV0ZSA9IHNlY29uZCA9IGZyYWN0aW9uID0gMAogICAgIHR6ID0gLTEKICAgICB0em9mZnNldCA9IE5vbmUKICAgICAjIERlZmF1bHQgdG8gLTEgdG8gc2lnbmlmeSB0aGF0IHZhbHVlcyBub3Qga25vd247IG5vdCBjcml0aWNhbCB0byBoYXZlLAogICAgICMgdGhvdWdoCi0gICAgd2Vla19vZl95ZWFyID0gLTEKLSAgICB3ZWVrX29mX3llYXJfc3RhcnQgPSAtMQorICAgIGlzb193ZWVrID0gd2Vla19vZl95ZWFyID0gTm9uZQorICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IE5vbmUKICAgICAjIHdlZWtkYXkgYW5kIGp1bGlhbiBkZWZhdWx0ZWQgdG8gTm9uZSBzbyBhcyB0byBzaWduYWwgbmVlZCB0byBjYWxjdWxhdGUKICAgICAjIHZhbHVlcwogICAgIHdlZWtkYXkgPSBqdWxpYW4gPSBOb25lCkBAIC0zNzUsNiArMzk0LDggQEAKICAgICAgICAgICAgICAgICB5ZWFyICs9IDE5MDAKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1knOgogICAgICAgICAgICAgeWVhciA9IGludChmb3VuZF9kaWN0WydZJ10pCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdHJzoKKyAgICAgICAgICAgIGlzb195ZWFyID0gaW50KGZvdW5kX2RpY3RbJ0cnXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ20nOgogICAgICAgICAgICAgbW9udGggPSBpbnQoZm91bmRfZGljdFsnbSddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnQic6CkBAIC00MjAsNiArNDQxLDkgQEAKICAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gNgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB3ZWVrZGF5IC09IDEKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ3UnOgorICAgICAgICAgICAgd2Vla2RheSA9IGludChmb3VuZF9kaWN0Wyd1J10pCisgICAgICAgICAgICB3ZWVrZGF5IC09IDEKICAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ2onOgogICAgICAgICAgICAganVsaWFuID0gaW50KGZvdW5kX2RpY3RbJ2onXSkKICAgICAgICAgZWxpZiBncm91cF9rZXkgaW4gKCdVJywgJ1cnKToKQEAgLTQzMCw2ICs0NTQsOCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAjIFcgc3RhcnRzIHdlZWsgb24gTW9uZGF5LgogICAgICAgICAgICAgICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IDAKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1YnOgorICAgICAgICAgICAgaXNvX3dlZWsgPSBpbnQoZm91bmRfZGljdFsnViddKQogICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAneic6CiAgICAgICAgICAgICB6ID0gZm91bmRfZGljdFsneiddCiAgICAgICAgICAgICB0em9mZnNldCA9IGludCh6WzE6M10pICogNjAgKyBpbnQoelszOjVdKQpAQCAtNDUwLDMyICs0NzYsNjEgQEAKICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgIyBEZWFsIHdpdGggdGhlIGNhc2VzIHdoZXJlIGFtYmlndWl0aWVzIGFyaXplCisgICAgIyBkb24ndCBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMgZm9yIElTTyB3ZWVrL3llYXIKKyAgICBpZiB5ZWFyIGlzIE5vbmUgYW5kIGlzb195ZWFyIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBpc29fd2VlayBpcyBOb25lIG9yIHdlZWtkYXkgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIklTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnIG11c3QgYmUgdXNlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBJU08gd2VlayBkaXJlY3RpdmUgJyVWJyBhbmQgYSB3ZWVrZGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdGl2ZSAoJyVBJywgJyVhJywgJyV3Jywgb3IgJyV1JykuIikKKyAgICAgICAgaWYganVsaWFuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRGF5IG9mIHRoZSB5ZWFyIGRpcmVjdGl2ZSAnJWonIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wYXRpYmxlIHdpdGggSVNPIHllYXIgZGlyZWN0aXZlICclRycuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSAnJVknIGluc3RlYWQuIikKKyAgICBlbGlmIHdlZWtfb2ZfeWVhciBpcyBOb25lIGFuZCBpc29fd2VlayBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgd2Vla2RheSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHdlZWsgZGlyZWN0aXZlICclVicgbXVzdCBiZSB1c2VkIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIElTTyB5ZWFyIGRpcmVjdGl2ZSAnJUcnIGFuZCBhIHdlZWtkYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0aXZlICgnJUEnLCAnJWEnLCAnJXcnLCBvciAnJXUnKS4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSVNPIHdlZWsgZGlyZWN0aXZlICclVicgaXMgaW5jb21wYXRpYmxlIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHllYXIgZGlyZWN0aXZlICclWScuIFVzZSB0aGUgSVNPIHllYXIgJyVHJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkLiIpCisKICAgICBsZWFwX3llYXJfZml4ID0gRmFsc2UKICAgICBpZiB5ZWFyIGlzIE5vbmUgYW5kIG1vbnRoID09IDIgYW5kIGRheSA9PSAyOToKICAgICAgICAgeWVhciA9IDE5MDQgICMgMTkwNCBpcyBmaXJzdCBsZWFwIHllYXIgb2YgMjB0aCBjZW50dXJ5CiAgICAgICAgIGxlYXBfeWVhcl9maXggPSBUcnVlCiAgICAgZWxpZiB5ZWFyIGlzIE5vbmU6CiAgICAgICAgIHllYXIgPSAxOTAwCisKKwogICAgICMgSWYgd2Uga25vdyB0aGUgd2VlayBvZiB0aGUgeWVhciBhbmQgd2hhdCBkYXkgb2YgdGhhdCB3ZWVrLCB3ZSBjYW4gZmlndXJlCiAgICAgIyBvdXQgdGhlIEp1bGlhbiBkYXkgb2YgdGhlIHllYXIuCi0gICAgaWYganVsaWFuIGlzIE5vbmUgYW5kIHdlZWtfb2ZfeWVhciAhPSAtMSBhbmQgd2Vla2RheSBpcyBub3QgTm9uZToKLSAgICAgICAgd2Vla19zdGFydHNfTW9uID0gVHJ1ZSBpZiB3ZWVrX29mX3llYXJfc3RhcnQgPT0gMCBlbHNlIEZhbHNlCi0gICAgICAgIGp1bGlhbiA9IF9jYWxjX2p1bGlhbl9mcm9tX1Vfb3JfVyh5ZWFyLCB3ZWVrX29mX3llYXIsIHdlZWtkYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbikKLSAgICAgICAgaWYganVsaWFuIDw9IDA6CisgICAgaWYganVsaWFuIGlzIE5vbmUgYW5kIHdlZWtkYXkgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHdlZWtfb2ZfeWVhciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbiA9IFRydWUgaWYgd2Vla19vZl95ZWFyX3N0YXJ0ID09IDAgZWxzZSBGYWxzZQorICAgICAgICAgICAganVsaWFuID0gX2NhbGNfanVsaWFuX2Zyb21fVV9vcl9XKHllYXIsIHdlZWtfb2ZfeWVhciwgd2Vla2RheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtfc3RhcnRzX01vbikKKyAgICAgICAgZWxpZiBpc29feWVhciBpcyBub3QgTm9uZSBhbmQgaXNvX3dlZWsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB5ZWFyLCBqdWxpYW4gPSBfY2FsY19qdWxpYW5fZnJvbV9WKGlzb195ZWFyLCBpc29fd2Vlaywgd2Vla2RheSArIDEpCisgICAgICAgIGlmIGp1bGlhbiBpcyBub3QgTm9uZSBhbmQganVsaWFuIDw9IDA6CiAgICAgICAgICAgICB5ZWFyIC09IDEKICAgICAgICAgICAgIHlkYXkgPSAzNjYgaWYgY2FsZW5kYXIuaXNsZWFwKHllYXIpIGVsc2UgMzY1CiAgICAgICAgICAgICBqdWxpYW4gKz0geWRheQotICAgICMgQ2Fubm90IHByZS1jYWxjdWxhdGUgZGF0ZXRpbWVfZGF0ZSgpIHNpbmNlIGNhbiBjaGFuZ2UgaW4gSnVsaWFuCi0gICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZiB0aGUgd2VlawotICAgICMgY2FsY3VsYXRpb24uCisKICAgICBpZiBqdWxpYW4gaXMgTm9uZToKKyAgICAgICAgIyBDYW5ub3QgcHJlLWNhbGN1bGF0ZSBkYXRldGltZV9kYXRlKCkgc2luY2UgY2FuIGNoYW5nZSBpbiBKdWxpYW4KKyAgICAgICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZgorICAgICAgICAjIHRoZSB3ZWVrIGNhbGN1bGF0aW9uLgogICAgICAgICAjIE5lZWQgdG8gYWRkIDEgdG8gcmVzdWx0IHNpbmNlIGZpcnN0IGRheSBvZiB0aGUgeWVhciBpcyAxLCBub3QgMC4KICAgICAgICAganVsaWFuID0gZGF0ZXRpbWVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS50b29yZGluYWwoKSAtIFwKICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkgKyAxCi0gICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgaXQgd2lsbAotICAgICAgICAgICAjIGJlIGFjY3VyYXRlLgotICAgICAgICBkYXRldGltZV9yZXN1bHQgPSBkYXRldGltZV9kYXRlLmZyb21vcmRpbmFsKChqdWxpYW4gLSAxKSArIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCisgICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgKG9yIGlmIGl0IHdhcworICAgICAgICAgICAjIGNhbGN1bGF0ZWQgYWJvdmUgd2l0aCB5ZWFyL3dlZWsvd2Vla2RheSkgaXQgd2lsbCBiZSBhY2N1cmF0ZS4KKyAgICAgICAgZGF0ZXRpbWVfcmVzdWx0ID0gZGF0ZXRpbWVfZGF0ZS5mcm9tb3JkaW5hbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoanVsaWFuIC0gMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCiAgICAgICAgIHllYXIgPSBkYXRldGltZV9yZXN1bHQueWVhcgogICAgICAgICBtb250aCA9IGRhdGV0aW1lX3Jlc3VsdC5tb250aAogICAgICAgICBkYXkgPSBkYXRldGltZV9yZXN1bHQuZGF5CmRpZmYgLS1naXQgYS9MaWIvYWlmYy5weSBiL0xpYi9haWZjLnB5CmluZGV4IDdlYmRiZWIuLjY5MmQwYmYgMTAwNjQ0Ci0tLSBhL0xpYi9haWZjLnB5CisrKyBiL0xpYi9haWZjLnB5CkBAIC0yNTcsNiArMjU3LDE1IEBACiBfYWlmY19wYXJhbXMgPSBuYW1lZHR1cGxlKCdfYWlmY19wYXJhbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnbmNoYW5uZWxzIHNhbXB3aWR0aCBmcmFtZXJhdGUgbmZyYW1lcyBjb21wdHlwZSBjb21wbmFtZScpCiAKK19haWZjX3BhcmFtcy5uY2hhbm5lbHMuX19kb2NfXyA9ICdOdW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKDEgZm9yIG1vbm8sIDIgZm9yIHN0ZXJlbyknCitfYWlmY19wYXJhbXMuc2FtcHdpZHRoLl9fZG9jX18gPSAnU2FtcGxlIHdpZHRoIGluIGJ5dGVzJworX2FpZmNfcGFyYW1zLmZyYW1lcmF0ZS5fX2RvY19fID0gJ1NhbXBsaW5nIGZyZXF1ZW5jeScKK19haWZjX3BhcmFtcy5uZnJhbWVzLl9fZG9jX18gPSAnTnVtYmVyIG9mIGF1ZGlvIGZyYW1lcycKK19haWZjX3BhcmFtcy5jb21wdHlwZS5fX2RvY19fID0gJ0NvbXByZXNzaW9uIHR5cGUgKCJOT05FIiBmb3IgQUlGRiBmaWxlcyknCitfYWlmY19wYXJhbXMuY29tcG5hbWUuX19kb2NfXyA9ICgiIiJcCitBIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNvbXByZXNzaW9uIHR5cGUKKygnbm90IGNvbXByZXNzZWQnIGZvciBBSUZGIGZpbGVzKSIiIikKKwogCiBjbGFzcyBBaWZjX3JlYWQ6CiAgICAgIyBWYXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNsYXNzOgpkaWZmIC0tZ2l0IGEvTGliL2FyZ3BhcnNlLnB5IGIvTGliL2FyZ3BhcnNlLnB5CmluZGV4IDlhMDY3MTkuLjIwOWI0ZTkgMTAwNjQ0Ci0tLSBhL0xpYi9hcmdwYXJzZS5weQorKysgYi9MaWIvYXJncGFyc2UucHkKQEAgLTExOCwxMCArMTE4LDE2IEBACiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICB0eXBlX25hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fCiAgICAgICAgIGFyZ19zdHJpbmdzID0gW10KKyAgICAgICAgc3Rhcl9hcmdzID0ge30KICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLl9nZXRfYXJncygpOgogICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKHJlcHIoYXJnKSkKICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYuX2dldF9rd2FyZ3MoKToKLSAgICAgICAgICAgIGFyZ19zdHJpbmdzLmFwcGVuZCgnJXM9JXInICUgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgIGlmIG5hbWUuaXNpZGVudGlmaWVyKCk6CisgICAgICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFyX2FyZ3NbbmFtZV0gPSB2YWx1ZQorICAgICAgICBpZiBzdGFyX2FyZ3M6CisgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQoJyoqJXMnICUgcmVwcihzdGFyX2FyZ3MpKQogICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAodHlwZV9uYW1lLCAnLCAnLmpvaW4oYXJnX3N0cmluZ3MpKQogCiAgICAgZGVmIF9nZXRfa3dhcmdzKHNlbGYpOgpAQCAtMjA0LDggKzIxMCw2IEBACiAgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5faW5kZW50KCkKICAgICAgICAgICAgIGpvaW4gPSBzZWxmLmZvcm1hdHRlci5fam9pbl9wYXJ0cwotICAgICAgICAgICAgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtczoKLSAgICAgICAgICAgICAgICBmdW5jKCphcmdzKQogICAgICAgICAgICAgaXRlbV9oZWxwID0gam9pbihbZnVuYygqYXJncykgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtc10pCiAgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5fZGVkZW50KCkKZGlmZiAtLWdpdCBhL0xpYi9hc3QucHkgYi9MaWIvYXN0LnB5CmluZGV4IDAxNzA0NzIuLjE1NmExZjIgMTAwNjQ0Ci0tLSBhL0xpYi9hc3QucHkKKysrIGIvTGliL2FzdC5weQpAQCAtMzUsNiArMzUsOCBAQAogICAgIHJldHVybiBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIG1vZGUsIFB5Q0ZfT05MWV9BU1QpCiAKIAorX05VTV9UWVBFUyA9IChpbnQsIGZsb2F0LCBjb21wbGV4KQorCiBkZWYgbGl0ZXJhbF9ldmFsKG5vZGVfb3Jfc3RyaW5nKToKICAgICAiIiIKICAgICBTYWZlbHkgZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiBub2RlIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBQeXRob24KQEAgLTQ3LDcgKzQ5LDkgQEAKICAgICBpZiBpc2luc3RhbmNlKG5vZGVfb3Jfc3RyaW5nLCBFeHByZXNzaW9uKToKICAgICAgICAgbm9kZV9vcl9zdHJpbmcgPSBub2RlX29yX3N0cmluZy5ib2R5CiAgICAgZGVmIF9jb252ZXJ0KG5vZGUpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIChTdHIsIEJ5dGVzKSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29uc3RhbnQpOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIChTdHIsIEJ5dGVzKSk6CiAgICAgICAgICAgICByZXR1cm4gbm9kZS5zCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOdW0pOgogICAgICAgICAgICAgcmV0dXJuIG5vZGUubgpAQCAtNjIsMjQgKzY2LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbiB6aXAobm9kZS5rZXlzLCBub2RlLnZhbHVlcykpCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOYW1lQ29uc3RhbnQpOgogICAgICAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFVuYXJ5T3ApIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wLCAoVUFkZCwgVVN1YikpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wZXJhbmQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBVbmFyeU9wKSBhbmQgaXNpbnN0YW5jZShub2RlLm9wLCAoVUFkZCwgVVN1YikpOgogICAgICAgICAgICAgb3BlcmFuZCA9IF9jb252ZXJ0KG5vZGUub3BlcmFuZCkKLSAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgVUFkZCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICsgb3BlcmFuZAotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByZXR1cm4gLSBvcGVyYW5kCi0gICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBCaW5PcCkgYW5kIFwKLSAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUub3AsIChBZGQsIFN1YikpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLnJpZ2h0LCAoTnVtLCBVbmFyeU9wLCBCaW5PcCkpIGFuZCBcCi0gICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmxlZnQsIChOdW0sIFVuYXJ5T3AsIEJpbk9wKSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9wZXJhbmQsIF9OVU1fVFlQRVMpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgVUFkZCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiArIG9wZXJhbmQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLSBvcGVyYW5kCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBCaW5PcCkgYW5kIGlzaW5zdGFuY2Uobm9kZS5vcCwgKEFkZCwgU3ViKSk6CiAgICAgICAgICAgICBsZWZ0ID0gX2NvbnZlcnQobm9kZS5sZWZ0KQogICAgICAgICAgICAgcmlnaHQgPSBfY29udmVydChub2RlLnJpZ2h0KQotICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBBZGQpOgotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ICsgcmlnaHQKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsZWZ0LCBfTlVNX1RZUEVTKSBhbmQgaXNpbnN0YW5jZShyaWdodCwgX05VTV9UWVBFUyk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm9wLCBBZGQpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgLSByaWdodAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmc6ICcgKyByZXByKG5vZGUpKQogICAgIHJldHVybiBfY29udmVydChub2RlX29yX3N0cmluZykKIApAQCAtMTk2LDEyICsxOTcsMTkgQEAKICAgICAiIiIKICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCAoQXN5bmNGdW5jdGlvbkRlZiwgRnVuY3Rpb25EZWYsIENsYXNzRGVmLCBNb2R1bGUpKToKICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlciBjYW4ndCBoYXZlIGRvY3N0cmluZ3MiICUgbm9kZS5fX2NsYXNzX18uX19uYW1lX18pCi0gICAgaWYgbm9kZS5ib2R5IGFuZCBpc2luc3RhbmNlKG5vZGUuYm9keVswXSwgRXhwcikgYW5kIFwKLSAgICAgICBpc2luc3RhbmNlKG5vZGUuYm9keVswXS52YWx1ZSwgU3RyKToKLSAgICAgICAgaWYgY2xlYW46Ci0gICAgICAgICAgICBpbXBvcnQgaW5zcGVjdAotICAgICAgICAgICAgcmV0dXJuIGluc3BlY3QuY2xlYW5kb2Mobm9kZS5ib2R5WzBdLnZhbHVlLnMpCi0gICAgICAgIHJldHVybiBub2RlLmJvZHlbMF0udmFsdWUucworICAgIGlmIG5vdChub2RlLmJvZHkgYW5kIGlzaW5zdGFuY2Uobm9kZS5ib2R5WzBdLCBFeHByKSk6CisgICAgICAgIHJldHVybgorICAgIG5vZGUgPSBub2RlLmJvZHlbMF0udmFsdWUKKyAgICBpZiBpc2luc3RhbmNlKG5vZGUsIFN0cik6CisgICAgICAgIHRleHQgPSBub2RlLnMKKyAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgQ29uc3RhbnQpIGFuZCBpc2luc3RhbmNlKG5vZGUudmFsdWUsIHN0cik6CisgICAgICAgIHRleHQgPSBub2RlLnZhbHVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCisgICAgaWYgY2xlYW46CisgICAgICAgIGltcG9ydCBpbnNwZWN0CisgICAgICAgIHRleHQgPSBpbnNwZWN0LmNsZWFuZG9jKHRleHQpCisgICAgcmV0dXJuIHRleHQKIAogCiBkZWYgd2Fsayhub2RlKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2hhdC5weSBiL0xpYi9hc3luY2hhdC5weQppbmRleCBmNzI4ZDFiLi5mYzExNDZhIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNoYXQucHkKKysrIGIvTGliL2FzeW5jaGF0LnB5CkBAIC0yODUsMzUgKzI4NSw2IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CiAKIAotY2xhc3MgZmlmbzoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbGlzdD1Ob25lKToKLSAgICAgICAgaW1wb3J0IHdhcm5pbmdzCi0gICAgICAgIHdhcm5pbmdzLndhcm4oJ2ZpZm8gY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjYnLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgICAgICBpZiBub3QgbGlzdDoKLSAgICAgICAgICAgIHNlbGYubGlzdCA9IGRlcXVlKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYubGlzdCA9IGRlcXVlKGxpc3QpCi0KLSAgICBkZWYgX19sZW5fXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGxlbihzZWxmLmxpc3QpCi0KLSAgICBkZWYgaXNfZW1wdHkoc2VsZik6Ci0gICAgICAgIHJldHVybiBub3Qgc2VsZi5saXN0Ci0KLSAgICBkZWYgZmlyc3Qoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmxpc3RbMF0KLQotICAgIGRlZiBwdXNoKHNlbGYsIGRhdGEpOgotICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKGRhdGEpCi0KLSAgICBkZWYgcG9wKHNlbGYpOgotICAgICAgICBpZiBzZWxmLmxpc3Q6Ci0gICAgICAgICAgICByZXR1cm4gKDEsIHNlbGYubGlzdC5wb3BsZWZ0KCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gKDAsIE5vbmUpCi0KLQogIyBHaXZlbiAnaGF5c3RhY2snLCBzZWUgaWYgYW55IHByZWZpeCBvZiAnbmVlZGxlJyBpcyBhdCBpdHMgZW5kLiAgVGhpcwogIyBhc3N1bWVzIGFuIGV4YWN0IG1hdGNoIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZC4gIFJldHVybiB0aGUgbnVtYmVyIG9mCiAjIGNoYXJhY3RlcnMgbWF0Y2hlZC4KZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL2Jhc2VfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKaW5kZXggMDE3NDM3NS4uMDkxNmRhOCAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vYmFzZV9ldmVudHMucHkKQEAgLTQyNiw3ICs0MjYsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2Nsb3NlZCgpOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGV2ZW50IGxvb3AgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGV2ZW50IGxvb3AgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaXNfcnVubmluZygpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIApkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5IGIvTGliL2FzeW5jaW8vYmFzZV9zdWJwcm9jZXNzLnB5CmluZGV4IDhmYzI1M2MuLmZiOGMyYmEgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL2Jhc2Vfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvYXN5bmNpby9iYXNlX3N1YnByb2Nlc3MucHkKQEAgLTEyMiw3ICsxMjIsOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jbG9zZWQ6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgZ2V0X3BpZChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL3Byb2FjdG9yX2V2ZW50cy5weQppbmRleCAzYWMzMTRjLi40YjYwNjdhIDEwMDY0NAotLS0gYS9MaWIvYXN5bmNpby9wcm9hY3Rvcl9ldmVudHMucHkKKysrIGIvTGliL2FzeW5jaW8vcHJvYWN0b3JfZXZlbnRzLnB5CkBAIC04Niw3ICs4Niw4IEBACiAgICAgaWYgY29tcGF0LlBZMzQ6CiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5fc29jayBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9c2VsZikKICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgIGRlZiBfZmF0YWxfZXJyb3Ioc2VsZiwgZXhjLCBtZXNzYWdlPSdGYXRhbCBlcnJvciBvbiBwaXBlIHRyYW5zcG9ydCcpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5IGIvTGliL2FzeW5jaW8vc2VsZWN0b3JfZXZlbnRzLnB5CmluZGV4IGVkMmI0ZDcuLjM0Y2NlNmIgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3NlbGVjdG9yX2V2ZW50cy5weQorKysgYi9MaWIvYXN5bmNpby9zZWxlY3Rvcl9ldmVudHMucHkKQEAgLTU3OSw3ICs1NzksOCBAQAogICAgIGlmIGNvbXBhdC5QWTM0OgogICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgICAgIGlmIHNlbGYuX3NvY2sgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZykKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCB0cmFuc3BvcnQgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICAgICAgc2VsZi5fc29jay5jbG9zZSgpCiAKICAgICBkZWYgX2ZhdGFsX2Vycm9yKHNlbGYsIGV4YywgbWVzc2FnZT0nRmF0YWwgZXJyb3Igb24gdHJhbnNwb3J0Jyk6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby9zc2xwcm90by5weSBiL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CmluZGV4IDMzZDVkZTIuLmYwZjY0MmUgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CisrKyBiL0xpYi9hc3luY2lvL3NzbHByb3RvLnB5CkBAIC0zMjUsNyArMzI1LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY2xvc2VkOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogCiAgICAgZGVmIHBhdXNlX3JlYWRpbmcoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvYXN5bmNpby91bml4X2V2ZW50cy5weSBiL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CmluZGV4IGQ3MTI3NDkuLmNlNDljNGYgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CisrKyBiL0xpYi9hc3luY2lvL3VuaXhfZXZlbnRzLnB5CkBAIC0zODEsNyArMzgxLDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9waXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuX3BpcGUuY2xvc2UoKQogCiAgICAgZGVmIF9mYXRhbF9lcnJvcihzZWxmLCBleGMsIG1lc3NhZ2U9J0ZhdGFsIGVycm9yIG9uIHBpcGUgdHJhbnNwb3J0Jyk6CkBAIC01NzMsNyArNTc0LDggQEAKICAgICBpZiBjb21wYXQuUFkzNDoKICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICBpZiBzZWxmLl9waXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIHRyYW5zcG9ydCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigidW5jbG9zZWQgdHJhbnNwb3J0ICVyIiAlIHNlbGYsIFJlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgICAgIHNlbGYuX3BpcGUuY2xvc2UoKQogCiAgICAgZGVmIGFib3J0KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weSBiL0xpYi9hc3luY2lvL3dpbmRvd3NfdXRpbHMucHkKaW5kZXggODcwY2QxMy4uN2M2M2ZiOSAxMDA2NDQKLS0tIGEvTGliL2FzeW5jaW8vd2luZG93c191dGlscy5weQorKysgYi9MaWIvYXN5bmNpby93aW5kb3dzX3V0aWxzLnB5CkBAIC0xNTksNyArMTU5LDggQEAKIAogICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICBpZiBzZWxmLl9oYW5kbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcpCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1bmNsb3NlZCAlciIgJSBzZWxmLCBSZXNvdXJjZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT1zZWxmKQogICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAKICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2FzeW5jb3JlLnB5IGIvTGliL2FzeW5jb3JlLnB5CmluZGV4IDNiNTFmMGYuLjRiMDQ2ZDYgMTAwNjQ0Ci0tLSBhL0xpYi9hc3luY29yZS5weQorKysgYi9MaWIvYXN5bmNvcmUucHkKQEAgLTU5NSw3ICs1OTUsOCBAQAogCiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgaWYgc2VsZi5mZCA+PSAwOgotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGZpbGUgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVuY2xvc2VkIGZpbGUgJXIiICUgc2VsZiwgUmVzb3VyY2VXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlPXNlbGYpCiAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKIAogICAgICAgICBkZWYgcmVjdihzZWxmLCAqYXJncyk6CmRpZmYgLS1naXQgYS9MaWIvYmFzZTY0LnB5IGIvTGliL2Jhc2U2NC5weQppbmRleCBhZGFlYzFkLi42N2U1NGYwIDEwMDc1NQotLS0gYS9MaWIvYmFzZTY0LnB5CisrKyBiL0xpYi9iYXNlNjQucHkKQEAgLTU1LDggKzU1LDcgQEAKICAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldCBmb3IgdGhlICcrJyBhbmQgJy8nIGNoYXJhY3RlcnMuICBUaGlzIGFsbG93cyBhbgogICAgIGFwcGxpY2F0aW9uIHRvIGUuZy4gZ2VuZXJhdGUgdXJsIG9yIGZpbGVzeXN0ZW0gc2FmZSBCYXNlNjQgc3RyaW5ncy4KICAgICAiIiIKLSAgICAjIFN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZQotICAgIGVuY29kZWQgPSBiaW5hc2NpaS5iMmFfYmFzZTY0KHMpWzotMV0KKyAgICBlbmNvZGVkID0gYmluYXNjaWkuYjJhX2Jhc2U2NChzLCBuZXdsaW5lPUZhbHNlKQogICAgIGlmIGFsdGNoYXJzIGlzIG5vdCBOb25lOgogICAgICAgICBhc3NlcnQgbGVuKGFsdGNoYXJzKSA9PSAyLCByZXByKGFsdGNoYXJzKQogICAgICAgICByZXR1cm4gZW5jb2RlZC50cmFuc2xhdGUoYnl0ZXMubWFrZXRyYW5zKGInKy8nLCBhbHRjaGFycykpCmRpZmYgLS1naXQgYS9MaWIvY2FsZW5kYXIucHkgYi9MaWIvY2FsZW5kYXIucHkKaW5kZXggNTI0NGI4ZC4uODViYWYyZSAxMDA2NDQKLS0tIGEvTGliL2NhbGVuZGFyLnB5CisrKyBiL0xpYi9jYWxlbmRhci5weQpAQCAtMTIsNyArMTIsOSBAQAogX19hbGxfXyA9IFsiSWxsZWdhbE1vbnRoRXJyb3IiLCAiSWxsZWdhbFdlZWtkYXlFcnJvciIsICJzZXRmaXJzdHdlZWtkYXkiLAogICAgICAgICAgICAiZmlyc3R3ZWVrZGF5IiwgImlzbGVhcCIsICJsZWFwZGF5cyIsICJ3ZWVrZGF5IiwgIm1vbnRocmFuZ2UiLAogICAgICAgICAgICAibW9udGhjYWxlbmRhciIsICJwcm1vbnRoIiwgIm1vbnRoIiwgInByY2FsIiwgImNhbGVuZGFyIiwKLSAgICAgICAgICAgInRpbWVnbSIsICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiLCAiZGF5X25hbWUiLCAiZGF5X2FiYnIiXQorICAgICAgICAgICAidGltZWdtIiwgIm1vbnRoX25hbWUiLCAibW9udGhfYWJiciIsICJkYXlfbmFtZSIsICJkYXlfYWJiciIsCisgICAgICAgICAgICJDYWxlbmRhciIsICJUZXh0Q2FsZW5kYXIiLCAiSFRNTENhbGVuZGFyIiwgIkxvY2FsZVRleHRDYWxlbmRhciIsCisgICAgICAgICAgICJMb2NhbGVIVE1MQ2FsZW5kYXIiLCAid2Vla2hlYWRlciJdCiAKICMgRXhjZXB0aW9uIHJhaXNlZCBmb3IgYmFkIGlucHV0ICh3aXRoIHN0cmluZyBwYXJhbWV0ZXIgZm9yIGRldGFpbHMpCiBlcnJvciA9IFZhbHVlRXJyb3IKQEAgLTYwNSw1MSArNjA3LDYzIEBACiAKIAogZGVmIG1haW4oYXJncyk6Ci0gICAgaW1wb3J0IG9wdHBhcnNlCi0gICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJ1c2FnZTogJXByb2cgW29wdGlvbnNdIFt5ZWFyIFttb250aF1dIikKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBpbXBvcnQgYXJncGFyc2UKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgdGV4dGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgndGV4dCBvbmx5IGFyZ3VtZW50cycpCisgICAgaHRtbGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnaHRtbCBvbmx5IGFyZ3VtZW50cycpCisgICAgdGV4dGdyb3VwLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi13IiwgIi0td2lkdGgiLAotICAgICAgICBkZXN0PSJ3aWR0aCIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MiwKLSAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMiwgdGV4dCBvbmx5KSIKKyAgICAgICAgdHlwZT1pbnQsIGRlZmF1bHQ9MiwKKyAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMikiCiAgICAgKQotICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgIHRleHRncm91cC5hZGRfYXJndW1lbnQoCiAgICAgICAgICItbCIsICItLWxpbmVzIiwKLSAgICAgICAgZGVzdD0ibGluZXMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTEsCi0gICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTEsCisgICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLXMiLCAiLS1zcGFjaW5nIiwKLSAgICAgICAgZGVzdD0ic3BhY2luZyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9NiwKLSAgICAgICAgaGVscD0ic3BhY2luZyBiZXR3ZWVuIG1vbnRocyAoZGVmYXVsdCA2LCB0ZXh0IG9ubHkpIgorICAgICAgICB0eXBlPWludCwgZGVmYXVsdD02LAorICAgICAgICBoZWxwPSJzcGFjaW5nIGJldHdlZW4gbW9udGhzIChkZWZhdWx0IDYpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICB0ZXh0Z3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLW0iLCAiLS1tb250aHMiLAotICAgICAgICBkZXN0PSJtb250aHMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTMsCi0gICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMsIHRleHQgb25seSkiCisgICAgICAgIHR5cGU9aW50LCBkZWZhdWx0PTMsCisgICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMpIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBodG1sZ3JvdXAuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLWMiLCAiLS1jc3MiLAotICAgICAgICBkZXN0PSJjc3MiLCBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAotICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIChodG1sIG9ubHkpIgorICAgICAgICBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAorICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLUwiLCAiLS1sb2NhbGUiLAotICAgICAgICBkZXN0PSJsb2NhbGUiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgaGVscD0ibG9jYWxlIHRvIGJlIHVzZWQgZnJvbSBtb250aCBhbmQgd2Vla2RheSBuYW1lcyIKICAgICApCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICAgIi1lIiwgIi0tZW5jb2RpbmciLAotICAgICAgICBkZXN0PSJlbmNvZGluZyIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgaGVscD0iRW5jb2RpbmcgdG8gdXNlIGZvciBvdXRwdXQuIgorICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgIGhlbHA9ImVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0IgogICAgICkKLSAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAogICAgICAgICAiLXQiLCAiLS10eXBlIiwKLSAgICAgICAgZGVzdD0idHlwZSIsIGRlZmF1bHQ9InRleHQiLAorICAgICAgICBkZWZhdWx0PSJ0ZXh0IiwKICAgICAgICAgY2hvaWNlcz0oInRleHQiLCAiaHRtbCIpLAogICAgICAgICBoZWxwPSJvdXRwdXQgdHlwZSAodGV4dCBvciBodG1sKSIKICAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgInllYXIiLAorICAgICAgICBuYXJncz0nPycsIHR5cGU9aW50LAorICAgICAgICBoZWxwPSJ5ZWFyIG51bWJlciAoMS05OTk5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgIm1vbnRoIiwKKyAgICAgICAgbmFyZ3M9Jz8nLCB0eXBlPWludCwKKyAgICAgICAgaGVscD0ibW9udGggbnVtYmVyICgxLTEyLCB0ZXh0IG9ubHkpIgorICAgICkKIAotICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAgb3B0aW9ucyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3NbMTpdKQogCiAgICAgaWYgb3B0aW9ucy5sb2NhbGUgYW5kIG5vdCBvcHRpb25zLmVuY29kaW5nOgogICAgICAgICBwYXJzZXIuZXJyb3IoImlmIC0tbG9jYWxlIGlzIHNwZWNpZmllZCAtLWVuY29kaW5nIGlzIHJlcXVpcmVkIikKQEAgLTY2NywxMCArNjgxLDEwIEBACiAgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQogICAgICAgICBvcHRkaWN0ID0gZGljdChlbmNvZGluZz1lbmNvZGluZywgY3NzPW9wdGlvbnMuY3NzKQogICAgICAgICB3cml0ZSA9IHN5cy5zdGRvdXQuYnVmZmVyLndyaXRlCi0gICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICBpZiBvcHRpb25zLnllYXIgaXMgTm9uZToKICAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShkYXRldGltZS5kYXRlLnRvZGF5KCkueWVhciwgKipvcHRkaWN0KSkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgICAgIHdyaXRlKGNhbC5mb3JtYXR5ZWFycGFnZShpbnQoYXJnc1sxXSksICoqb3B0ZGljdCkpCisgICAgICAgIGVsaWYgb3B0aW9ucy5tb250aCBpcyBOb25lOgorICAgICAgICAgICAgd3JpdGUoY2FsLmZvcm1hdHllYXJwYWdlKG9wdGlvbnMueWVhciwgKipvcHRkaWN0KSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHBhcnNlci5lcnJvcigiaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiKQogICAgICAgICAgICAgc3lzLmV4aXQoMSkKQEAgLTY4MCwxOCArNjk0LDE1IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBjYWwgPSBUZXh0Q2FsZW5kYXIoKQogICAgICAgICBvcHRkaWN0ID0gZGljdCh3PW9wdGlvbnMud2lkdGgsIGw9b3B0aW9ucy5saW5lcykKLSAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgICAgIGlmIG9wdGlvbnMubW9udGggaXMgTm9uZToKICAgICAgICAgICAgIG9wdGRpY3RbImMiXSA9IG9wdGlvbnMuc3BhY2luZwogICAgICAgICAgICAgb3B0ZGljdFsibSJdID0gb3B0aW9ucy5tb250aHMKLSAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgIGlmIG9wdGlvbnMueWVhciBpcyBOb25lOgogICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkKLSAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKLSAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGludChhcmdzWzFdKSwgKipvcHRkaWN0KQotICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAzOgotICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdG1vbnRoKGludChhcmdzWzFdKSwgaW50KGFyZ3NbMl0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgb3B0aW9ucy5tb250aCBpcyBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIob3B0aW9ucy55ZWFyLCAqKm9wdGRpY3QpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKLSAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0bW9udGgob3B0aW9ucy55ZWFyLCBvcHRpb25zLm1vbnRoLCAqKm9wdGRpY3QpCiAgICAgICAgIHdyaXRlID0gc3lzLnN0ZG91dC53cml0ZQogICAgICAgICBpZiBvcHRpb25zLmVuY29kaW5nOgogICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LmVuY29kZShvcHRpb25zLmVuY29kaW5nKQpkaWZmIC0tZ2l0IGEvTGliL2NnaS5weSBiL0xpYi9jZ2kucHkKaW5kZXggMTg5YzZkNS4uMjMzYTQ5NiAxMDA3NTUKLS0tIGEvTGliL2NnaS5weQorKysgYi9MaWIvY2dpLnB5CkBAIC00NSw3ICs0NSw3IEBACiAKIF9fYWxsX18gPSBbIk1pbmlGaWVsZFN0b3JhZ2UiLCAiRmllbGRTdG9yYWdlIiwKICAgICAgICAgICAgInBhcnNlIiwgInBhcnNlX3FzIiwgInBhcnNlX3FzbCIsICJwYXJzZV9tdWx0aXBhcnQiLAotICAgICAgICAgICAicGFyc2VfaGVhZGVyIiwgInByaW50X2V4Y2VwdGlvbiIsICJwcmludF9lbnZpcm9uIiwKKyAgICAgICAgICAgInBhcnNlX2hlYWRlciIsICJ0ZXN0IiwgInByaW50X2V4Y2VwdGlvbiIsICJwcmludF9lbnZpcm9uIiwKICAgICAgICAgICAgInByaW50X2Zvcm0iLCAicHJpbnRfZGlyZWN0b3J5IiwgInByaW50X2FyZ3VtZW50cyIsCiAgICAgICAgICAgICJwcmludF9lbnZpcm9uX3VzYWdlIiwgImVzY2FwZSJdCiAKZGlmZiAtLWdpdCBhL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weSBiL0xpYi9jb2xsZWN0aW9ucy9fX2luaXRfXy5weQppbmRleCBlYmU4ZWU3Li5iOTQxOTUwIDEwMDY0NAotLS0gYS9MaWIvY29sbGVjdGlvbnMvX19pbml0X18ucHkKKysrIGIvTGliL2NvbGxlY3Rpb25zL19faW5pdF9fLnB5CkBAIC04NDIsNyArODQyLDcgQEAKIAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyAgQ2hhaW5NYXAgKGhlbHBlciBmb3IgY29uZmlncGFyc2VyIGFuZCBzdHJpbmcuVGVtcGxhdGUpCisjIyMgIENoYWluTWFwCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2xhc3MgQ2hhaW5NYXAoTXV0YWJsZU1hcHBpbmcpOgpAQCAtOTY5LDcgKzk2OSw3IEBACiAgICAgICAgICAgICBkaWN0ID0ga3dhcmdzLnBvcCgnZGljdCcpCiAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlBhc3NpbmcgJ2RpY3QnIGFzIGtleXdvcmQgYXJndW1lbnQgaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkaWN0ID0gTm9uZQogICAgICAgICBzZWxmLmRhdGEgPSB7fQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVhbGwucHkgYi9MaWIvY29tcGlsZWFsbC5weQppbmRleCAwY2MwYzFkLi42N2M1ZjVhIDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZWFsbC5weQorKysgYi9MaWIvY29tcGlsZWFsbC5weQpAQCAtNjgsNyArNjgsNyBAQAogICAgICIiIgogICAgIGZpbGVzID0gX3dhbGtfZGlyKGRpciwgcXVpZXQ9cXVpZXQsIG1heGxldmVscz1tYXhsZXZlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgZGRpcj1kZGlyKQotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBpZiB3b3JrZXJzIGlzIG5vdCBOb25lIGFuZCB3b3JrZXJzICE9IDEgYW5kIFByb2Nlc3NQb29sRXhlY3V0b3IgaXMgbm90IE5vbmU6CiAgICAgICAgIGlmIHdvcmtlcnMgPCAwOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignd29ya2VycyBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMCcpCkBAIC04MSwxMiArODEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3k9bGVnYWN5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplPW9wdGltaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMpCi0gICAgICAgICAgICBzdWNjZXNzID0gbWluKHJlc3VsdHMsIGRlZmF1bHQ9MSkKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBtaW4ocmVzdWx0cywgZGVmYXVsdD1UcnVlKQogICAgIGVsc2U6CiAgICAgICAgIGZvciBmaWxlIGluIGZpbGVzOgogICAgICAgICAgICAgaWYgbm90IGNvbXBpbGVfZmlsZShmaWxlLCBkZGlyLCBmb3JjZSwgcngsIHF1aWV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3ksIG9wdGltaXplKToKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgIHJldHVybiBzdWNjZXNzCiAKIGRlZiBjb21waWxlX2ZpbGUoZnVsbG5hbWUsIGRkaXI9Tm9uZSwgZm9yY2U9RmFsc2UsIHJ4PU5vbmUsIHF1aWV0PTAsCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICBsZWdhY3k6ICAgIGlmIFRydWUsIHByb2R1Y2UgbGVnYWN5IHB5YyBwYXRocyBpbnN0ZWFkIG9mIFBFUCAzMTQ3IHBhdGhzCiAgICAgb3B0aW1pemU6ICBvcHRpbWl6YXRpb24gbGV2ZWwgb3IgLTEgZm9yIGxldmVsIG9mIHRoZSBpbnRlcnByZXRlcgogICAgICIiIgotICAgIHN1Y2Nlc3MgPSAxCisgICAgc3VjY2VzcyA9IFRydWUKICAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmdWxsbmFtZSkKICAgICBpZiBkZGlyIGlzIG5vdCBOb25lOgogICAgICAgICBkZmlsZSA9IG9zLnBhdGguam9pbihkZGlyLCBuYW1lKQpAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgICAgICAgICAgb2sgPSBweV9jb21waWxlLmNvbXBpbGUoZnVsbG5hbWUsIGNmaWxlLCBkZmlsZSwgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZT1vcHRpbWl6ZSkKICAgICAgICAgICAgIGV4Y2VwdCBweV9jb21waWxlLlB5Q29tcGlsZUVycm9yIGFzIGVycjoKLSAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQogICAgICAgICAgICAgICAgIGlmIHF1aWV0ID49IDI6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzCiAgICAgICAgICAgICAgICAgZWxpZiBxdWlldDoKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgICAgICAgICAgICAgIG1zZyA9IG1zZy5kZWNvZGUoc3lzLnN0ZG91dC5lbmNvZGluZykKICAgICAgICAgICAgICAgICBwcmludChtc2cpCiAgICAgICAgICAgICBleGNlcHQgKFN5bnRheEVycm9yLCBVbmljb2RlRXJyb3IsIE9TRXJyb3IpIGFzIGU6Ci0gICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKICAgICAgICAgICAgICAgICBpZiBxdWlldCA+PSAyOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VjY2VzcwogICAgICAgICAgICAgICAgIGVsaWYgcXVpZXQ6CkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICAgICAgICAgICAgICBwcmludChlLl9fY2xhc3NfXy5fX25hbWVfXyArICc6JywgZSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgaWYgb2sgPT0gMDoKLSAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCiAgICAgcmV0dXJuIHN1Y2Nlc3MKIAogZGVmIGNvbXBpbGVfcGF0aChza2lwX2N1cmRpcj0xLCBtYXhsZXZlbHM9MCwgZm9yY2U9RmFsc2UsIHF1aWV0PTAsCkBAIC0xODMsNyArMTgzLDcgQEAKICAgICBsZWdhY3k6IGFzIGZvciBjb21waWxlX2RpcigpIChkZWZhdWx0IEZhbHNlKQogICAgIG9wdGltaXplOiBhcyBmb3IgY29tcGlsZV9kaXIoKSAoZGVmYXVsdCAtMSkKICAgICAiIiIKLSAgICBzdWNjZXNzID0gMQorICAgIHN1Y2Nlc3MgPSBUcnVlCiAgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKICAgICAgICAgaWYgKG5vdCBkaXIgb3IgZGlyID09IG9zLmN1cmRpcikgYW5kIHNraXBfY3VyZGlyOgogICAgICAgICAgICAgaWYgcXVpZXQgPCAyOgpkaWZmIC0tZ2l0IGEvTGliL2NvbnRleHRsaWIucHkgYi9MaWIvY29udGV4dGxpYi5weQppbmRleCBkNDRlZGQ2Li43ZDk0YTU3IDEwMDY0NAotLS0gYS9MaWIvY29udGV4dGxpYi5weQorKysgYi9MaWIvY29udGV4dGxpYi5weQpAQCAtMSwxMSArMSwzNCBAQAogIiIiVXRpbGl0aWVzIGZvciB3aXRoLXN0YXRlbWVudCBjb250ZXh0cy4gIFNlZSBQRVAgMzQzLiIiIgotCitpbXBvcnQgYWJjCiBpbXBvcnQgc3lzCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQogZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCiAKLV9fYWxsX18gPSBbImNvbnRleHRtYW5hZ2VyIiwgImNsb3NpbmciLCAiQ29udGV4dERlY29yYXRvciIsICJFeGl0U3RhY2siLAotICAgICAgICAgICAicmVkaXJlY3Rfc3Rkb3V0IiwgInJlZGlyZWN0X3N0ZGVyciIsICJzdXBwcmVzcyJdCitfX2FsbF9fID0gWyJjb250ZXh0bWFuYWdlciIsICJjbG9zaW5nIiwgIkFic3RyYWN0Q29udGV4dE1hbmFnZXIiLAorICAgICAgICAgICAiQ29udGV4dERlY29yYXRvciIsICJFeGl0U3RhY2siLCAicmVkaXJlY3Rfc3Rkb3V0IiwKKyAgICAgICAgICAgInJlZGlyZWN0X3N0ZGVyciIsICJzdXBwcmVzcyJdCisKKworY2xhc3MgQWJzdHJhY3RDb250ZXh0TWFuYWdlcihhYmMuQUJDKToKKworICAgICIiIkFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbnRleHQgbWFuYWdlcnMuIiIiCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYHNlbGZgIHVwb24gZW50ZXJpbmcgdGhlIHJ1bnRpbWUgY29udGV4dC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgIiIiUmFpc2UgYW55IGV4Y2VwdGlvbiB0cmlnZ2VyZWQgd2l0aGluIHRoZSBydW50aW1lIGNvbnRleHQuIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgQWJzdHJhY3RDb250ZXh0TWFuYWdlcjoKKyAgICAgICAgICAgIGlmIChhbnkoIl9fZW50ZXJfXyIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pIGFuZAorICAgICAgICAgICAgICAgIGFueSgiX19leGl0X18iIGluIEIuX19kaWN0X18gZm9yIEIgaW4gQy5fX21yb19fKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAKIAogY2xhc3MgQ29udGV4dERlY29yYXRvcihvYmplY3QpOgpAQCAtMzEsNyArNTQsNyBAQAogICAgICAgICByZXR1cm4gaW5uZXIKIAogCi1jbGFzcyBfR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIoQ29udGV4dERlY29yYXRvcik6CitjbGFzcyBfR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIoQ29udGV4dERlY29yYXRvciwgQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAgICAgIiIiSGVscGVyIGZvciBAY29udGV4dG1hbmFnZXIgZGVjb3JhdG9yLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMsIGFyZ3MsIGt3ZHMpOgpAQCAtMTM3LDcgKzE2MCw3IEBACiAgICAgcmV0dXJuIGhlbHBlcgogCiAKLWNsYXNzIGNsb3Npbmcob2JqZWN0KToKK2NsYXNzIGNsb3NpbmcoQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAgICAgIiIiQ29udGV4dCB0byBhdXRvbWF0aWNhbGx5IGNsb3NlIHNvbWV0aGluZyBhdCB0aGUgZW5kIG9mIGEgYmxvY2suCiAKICAgICBDb2RlIGxpa2UgdGhpczoKQEAgLTE2Miw3ICsxODUsNyBAQAogICAgICAgICBzZWxmLnRoaW5nLmNsb3NlKCkKIAogCi1jbGFzcyBfUmVkaXJlY3RTdHJlYW06CitjbGFzcyBfUmVkaXJlY3RTdHJlYW0oQWJzdHJhY3RDb250ZXh0TWFuYWdlcik6CiAKICAgICBfc3RyZWFtID0gTm9uZQogCkBAIC0yMDIsNyArMjI1LDcgQEAKICAgICBfc3RyZWFtID0gInN0ZGVyciIKIAogCi1jbGFzcyBzdXBwcmVzczoKK2NsYXNzIHN1cHByZXNzKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogICAgICIiIkNvbnRleHQgbWFuYWdlciB0byBzdXBwcmVzcyBzcGVjaWZpZWQgZXhjZXB0aW9ucwogCiAgICAgQWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBleGVjdXRpb24gcHJvY2VlZHMgd2l0aCB0aGUgbmV4dApAQCAtMjMzLDcgKzI1Niw3IEBACiAKIAogIyBJbnNwaXJlZCBieSBkaXNjdXNzaW9ucyBvbiBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTM1ODUKLWNsYXNzIEV4aXRTdGFjayhvYmplY3QpOgorY2xhc3MgRXhpdFN0YWNrKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgogICAgICIiIkNvbnRleHQgbWFuYWdlciBmb3IgZHluYW1pYyBtYW5hZ2VtZW50IG9mIGEgc3RhY2sgb2YgZXhpdCBjYWxsYmFja3MKIAogICAgIEZvciBleGFtcGxlOgpAQCAtMzEyLDkgKzMzNSw2IEBACiAgICAgICAgICIiIkltbWVkaWF0ZWx5IHVud2luZCB0aGUgY29udGV4dCBzdGFjayIiIgogICAgICAgICBzZWxmLl9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpCiAKLSAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZgotCiAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfZGV0YWlscyk6CiAgICAgICAgIHJlY2VpdmVkX2V4YyA9IGV4Y19kZXRhaWxzWzBdIGlzIG5vdCBOb25lCiAKZGlmZiAtLWdpdCBhL0xpYi9jb3B5LnB5IGIvTGliL2NvcHkucHkKaW5kZXggOTcyYjk0YS4uZjg2MDQwYSAxMDA2NDQKLS0tIGEvTGliL2NvcHkucHkKKysrIGIvTGliL2NvcHkucHkKQEAgLTUxLDcgKzUxLDYgQEAKIGltcG9ydCB0eXBlcwogaW1wb3J0IHdlYWtyZWYKIGZyb20gY29weXJlZyBpbXBvcnQgZGlzcGF0Y2hfdGFibGUKLWltcG9ydCBidWlsdGlucwogCiBjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIHBhc3MKQEAgLTEwMiwzNyArMTAxLDMzIEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCJ1bihzaGFsbG93KWNvcHlhYmxlIG9iamVjdCBvZiB0eXBlICVzIiAlIGNscykKIAotICAgIHJldHVybiBfcmVjb25zdHJ1Y3QoeCwgcnYsIDApCisgICAgaWYgaXNpbnN0YW5jZShydiwgc3RyKToKKyAgICAgICAgcmV0dXJuIHgKKyAgICByZXR1cm4gX3JlY29uc3RydWN0KHgsIE5vbmUsICpydikKIAogCiBfY29weV9kaXNwYXRjaCA9IGQgPSB7fQogCiBkZWYgX2NvcHlfaW1tdXRhYmxlKHgpOgogICAgIHJldHVybiB4Ci1mb3IgdCBpbiAodHlwZShOb25lKSwgaW50LCBmbG9hdCwgYm9vbCwgc3RyLCB0dXBsZSwKLSAgICAgICAgICBieXRlcywgZnJvemVuc2V0LCB0eXBlLCByYW5nZSwKLSAgICAgICAgICB0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlLCB0eXBlKEVsbGlwc2lzKSwKK2ZvciB0IGluICh0eXBlKE5vbmUpLCBpbnQsIGZsb2F0LCBib29sLCBjb21wbGV4LCBzdHIsIHR1cGxlLAorICAgICAgICAgIGJ5dGVzLCBmcm96ZW5zZXQsIHR5cGUsIHJhbmdlLCBzbGljZSwKKyAgICAgICAgICB0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlLCB0eXBlKEVsbGlwc2lzKSwgdHlwZShOb3RJbXBsZW1lbnRlZCksCiAgICAgICAgICAgdHlwZXMuRnVuY3Rpb25UeXBlLCB3ZWFrcmVmLnJlZik6CiAgICAgZFt0XSA9IF9jb3B5X2ltbXV0YWJsZQogdCA9IGdldGF0dHIodHlwZXMsICJDb2RlVHlwZSIsIE5vbmUpCiBpZiB0IGlzIG5vdCBOb25lOgogICAgIGRbdF0gPSBfY29weV9pbW11dGFibGUKLWZvciBuYW1lIGluICgiY29tcGxleCIsICJ1bmljb2RlIik6Ci0gICAgdCA9IGdldGF0dHIoYnVpbHRpbnMsIG5hbWUsIE5vbmUpCi0gICAgaWYgdCBpcyBub3QgTm9uZToKLSAgICAgICAgZFt0XSA9IF9jb3B5X2ltbXV0YWJsZQogCi1kZWYgX2NvcHlfd2l0aF9jb25zdHJ1Y3Rvcih4KToKLSAgICByZXR1cm4gdHlwZSh4KSh4KQotZm9yIHQgaW4gKGxpc3QsIGRpY3QsIHNldCk6Ci0gICAgZFt0XSA9IF9jb3B5X3dpdGhfY29uc3RydWN0b3IKK2RbbGlzdF0gPSBsaXN0LmNvcHkKK2RbZGljdF0gPSBkaWN0LmNvcHkKK2Rbc2V0XSA9IHNldC5jb3B5CitkW2J5dGVhcnJheV0gPSBieXRlYXJyYXkuY29weQogCi1kZWYgX2NvcHlfd2l0aF9jb3B5X21ldGhvZCh4KToKLSAgICByZXR1cm4geC5jb3B5KCkKIGlmIFB5U3RyaW5nTWFwIGlzIG5vdCBOb25lOgotICAgIGRbUHlTdHJpbmdNYXBdID0gX2NvcHlfd2l0aF9jb3B5X21ldGhvZAorICAgIGRbUHlTdHJpbmdNYXBdID0gUHlTdHJpbmdNYXAuY29weQogCi1kZWwgZAorZGVsIGQsIHQKIAogZGVmIGRlZXBjb3B5KHgsIG1lbW89Tm9uZSwgX25pbD1bXSk6CiAgICAgIiIiRGVlcCBjb3B5IG9wZXJhdGlvbiBvbiBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuCkBAIC0xNzksNyArMTc0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW4oZGVlcCljb3B5YWJsZSBvYmplY3Qgb2YgdHlwZSAlcyIgJSBjbHMpCi0gICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBydiwgMSwgbWVtbykKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJ2LCBzdHIpOgorICAgICAgICAgICAgICAgICAgICB5ID0geAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHkgPSBfcmVjb25zdHJ1Y3QoeCwgbWVtbywgKnJ2KQogCiAgICAgIyBJZiBpcyBpdHMgb3duIGNvcHksIGRvbid0IG1lbW9pemUuCiAgICAgaWYgeSBpcyBub3QgeDoKQEAgLTE5MywxMyArMTkxLDExIEBACiAgICAgcmV0dXJuIHgKIGRbdHlwZShOb25lKV0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW3R5cGUoRWxsaXBzaXMpXSA9IF9kZWVwY29weV9hdG9taWMKK2RbdHlwZShOb3RJbXBsZW1lbnRlZCldID0gX2RlZXBjb3B5X2F0b21pYwogZFtpbnRdID0gX2RlZXBjb3B5X2F0b21pYwogZFtmbG9hdF0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW2Jvb2xdID0gX2RlZXBjb3B5X2F0b21pYwotdHJ5OgotICAgIGRbY29tcGxleF0gPSBfZGVlcGNvcHlfYXRvbWljCi1leGNlcHQgTmFtZUVycm9yOgotICAgIHBhc3MKK2RbY29tcGxleF0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW2J5dGVzXSA9IF9kZWVwY29weV9hdG9taWMKIGRbc3RyXSA9IF9kZWVwY29weV9hdG9taWMKIHRyeToKQEAgLTIxMSwxNSArMjA3LDE2IEBACiBkW3R5cGVzLkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljCiBkW3dlYWtyZWYucmVmXSA9IF9kZWVwY29weV9hdG9taWMKIAotZGVmIF9kZWVwY29weV9saXN0KHgsIG1lbW8pOgorZGVmIF9kZWVwY29weV9saXN0KHgsIG1lbW8sIGRlZXBjb3B5PWRlZXBjb3B5KToKICAgICB5ID0gW10KICAgICBtZW1vW2lkKHgpXSA9IHkKKyAgICBhcHBlbmQgPSB5LmFwcGVuZAogICAgIGZvciBhIGluIHg6Ci0gICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKQorICAgICAgICBhcHBlbmQoZGVlcGNvcHkoYSwgbWVtbykpCiAgICAgcmV0dXJuIHkKIGRbbGlzdF0gPSBfZGVlcGNvcHlfbGlzdAogCi1kZWYgX2RlZXBjb3B5X3R1cGxlKHgsIG1lbW8pOgorZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vLCBkZWVwY29weT1kZWVwY29weSk6CiAgICAgeSA9IFtkZWVwY29weShhLCBtZW1vKSBmb3IgYSBpbiB4XQogICAgICMgV2UncmUgbm90IGdvaW5nIHRvIHB1dCB0aGUgdHVwbGUgaW4gdGhlIG1lbW8sIGJ1dCBpdCdzIHN0aWxsIGltcG9ydGFudCB3ZQogICAgICMgY2hlY2sgZm9yIGl0LCBpbiBjYXNlIHRoZSB0dXBsZSBjb250YWlucyByZWN1cnNpdmUgbXV0YWJsZSBzdHJ1Y3R1cmVzLgpAQCAtMjM2LDcgKzIzMyw3IEBACiAgICAgcmV0dXJuIHkKIGRbdHVwbGVdID0gX2RlZXBjb3B5X3R1cGxlCiAKLWRlZiBfZGVlcGNvcHlfZGljdCh4LCBtZW1vKToKK2RlZiBfZGVlcGNvcHlfZGljdCh4LCBtZW1vLCBkZWVwY29weT1kZWVwY29weSk6CiAgICAgeSA9IHt9CiAgICAgbWVtb1tpZCh4KV0gPSB5CiAgICAgZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOgpAQCAtMjQ4LDcgKzI0NSw5IEBACiAKIGRlZiBfZGVlcGNvcHlfbWV0aG9kKHgsIG1lbW8pOiAjIENvcHkgaW5zdGFuY2UgbWV0aG9kcwogICAgIHJldHVybiB0eXBlKHgpKHguX19mdW5jX18sIGRlZXBjb3B5KHguX19zZWxmX18sIG1lbW8pKQotX2RlZXBjb3B5X2Rpc3BhdGNoW3R5cGVzLk1ldGhvZFR5cGVdID0gX2RlZXBjb3B5X21ldGhvZAorZFt0eXBlcy5NZXRob2RUeXBlXSA9IF9kZWVwY29weV9tZXRob2QKKworZGVsIGQKIAogZGVmIF9rZWVwX2FsaXZlKHgsIG1lbW8pOgogICAgICIiIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby4KQEAgLTI2NiwzMSArMjY1LDE1IEBACiAgICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pCiAgICAgICAgIG1lbW9baWQobWVtbyldPVt4XQogCi1kZWYgX3JlY29uc3RydWN0KHgsIGluZm8sIGRlZXAsIG1lbW89Tm9uZSk6Ci0gICAgaWYgaXNpbnN0YW5jZShpbmZvLCBzdHIpOgotICAgICAgICByZXR1cm4geAotICAgIGFzc2VydCBpc2luc3RhbmNlKGluZm8sIHR1cGxlKQotICAgIGlmIG1lbW8gaXMgTm9uZToKLSAgICAgICAgbWVtbyA9IHt9Ci0gICAgbiA9IGxlbihpbmZvKQotICAgIGFzc2VydCBuIGluICgyLCAzLCA0LCA1KQotICAgIGNhbGxhYmxlLCBhcmdzID0gaW5mb1s6Ml0KLSAgICBpZiBuID4gMjoKLSAgICAgICAgc3RhdGUgPSBpbmZvWzJdCi0gICAgZWxzZToKLSAgICAgICAgc3RhdGUgPSBOb25lCi0gICAgaWYgbiA+IDM6Ci0gICAgICAgIGxpc3RpdGVyID0gaW5mb1szXQotICAgIGVsc2U6Ci0gICAgICAgIGxpc3RpdGVyID0gTm9uZQotICAgIGlmIG4gPiA0OgotICAgICAgICBkaWN0aXRlciA9IGluZm9bNF0KLSAgICBlbHNlOgotICAgICAgICBkaWN0aXRlciA9IE5vbmUKK2RlZiBfcmVjb25zdHJ1Y3QoeCwgbWVtbywgZnVuYywgYXJncywKKyAgICAgICAgICAgICAgICAgc3RhdGU9Tm9uZSwgbGlzdGl0ZXI9Tm9uZSwgZGljdGl0ZXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZGVlcGNvcHk9ZGVlcGNvcHkpOgorICAgIGRlZXAgPSBtZW1vIGlzIG5vdCBOb25lCisgICAgaWYgZGVlcCBhbmQgYXJnczoKKyAgICAgICAgYXJncyA9IChkZWVwY29weShhcmcsIG1lbW8pIGZvciBhcmcgaW4gYXJncykKKyAgICB5ID0gZnVuYygqYXJncykKICAgICBpZiBkZWVwOgotICAgICAgICBhcmdzID0gZGVlcGNvcHkoYXJncywgbWVtbykKLSAgICB5ID0gY2FsbGFibGUoKmFyZ3MpCi0gICAgbWVtb1tpZCh4KV0gPSB5CisgICAgICAgIG1lbW9baWQoeCldID0geQogCiAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6CiAgICAgICAgIGlmIGRlZXA6CkBAIC0zMDksMjIgKzI5MiwyMiBAQAogICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHksIGtleSwgdmFsdWUpCiAKICAgICBpZiBsaXN0aXRlciBpcyBub3QgTm9uZToKLSAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6Ci0gICAgICAgICAgICBpZiBkZWVwOgorICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6CiAgICAgICAgICAgICAgICAgaXRlbSA9IGRlZXBjb3B5KGl0ZW0sIG1lbW8pCi0gICAgICAgICAgICB5LmFwcGVuZChpdGVtKQorICAgICAgICAgICAgICAgIHkuYXBwZW5kKGl0ZW0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBsaXN0aXRlcjoKKyAgICAgICAgICAgICAgICB5LmFwcGVuZChpdGVtKQogICAgIGlmIGRpY3RpdGVyIGlzIG5vdCBOb25lOgotICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjoKLSAgICAgICAgICAgIGlmIGRlZXA6CisgICAgICAgIGlmIGRlZXA6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0aXRlcjoKICAgICAgICAgICAgICAgICBrZXkgPSBkZWVwY29weShrZXksIG1lbW8pCiAgICAgICAgICAgICAgICAgdmFsdWUgPSBkZWVwY29weSh2YWx1ZSwgbWVtbykKLSAgICAgICAgICAgIHlba2V5XSA9IHZhbHVlCisgICAgICAgICAgICAgICAgeVtrZXldID0gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRpY3RpdGVyOgorICAgICAgICAgICAgICAgIHlba2V5XSA9IHZhbHVlCiAgICAgcmV0dXJuIHkKIAotZGVsIGQKLQotZGVsIHR5cGVzCi0KLSMgSGVscGVyIGZvciBpbnN0YW5jZSBjcmVhdGlvbiB3aXRob3V0IGNhbGxpbmcgX19pbml0X18KLWNsYXNzIF9FbXB0eUNsYXNzOgotICAgIHBhc3MKK2RlbCB0eXBlcywgd2Vha3JlZiwgUHlTdHJpbmdNYXAKZGlmZiAtLWdpdCBhL0xpYi9jcnlwdC5weSBiL0xpYi9jcnlwdC5weQppbmRleCA0OWFiOTZlLi5mYmM1ZjRjIDEwMDY0NAotLS0gYS9MaWIvY3J5cHQucHkKKysrIGIvTGliL2NyeXB0LnB5CkBAIC01NCw5ICs1NCw4IEBACiBNRVRIT0RfU0hBNTEyID0gX01ldGhvZCgnU0hBNTEyJywgJzYnLCAxNiwgMTA2KQogCiBtZXRob2RzID0gW10KLWZvciBfbWV0aG9kIGluIChNRVRIT0RfU0hBNTEyLCBNRVRIT0RfU0hBMjU2LCBNRVRIT0RfTUQ1KToKK2ZvciBfbWV0aG9kIGluIChNRVRIT0RfU0hBNTEyLCBNRVRIT0RfU0hBMjU2LCBNRVRIT0RfTUQ1LCBNRVRIT0RfQ1JZUFQpOgogICAgIF9yZXN1bHQgPSBjcnlwdCgnJywgX21ldGhvZCkKICAgICBpZiBfcmVzdWx0IGFuZCBsZW4oX3Jlc3VsdCkgPT0gX21ldGhvZC50b3RhbF9zaXplOgogICAgICAgICBtZXRob2RzLmFwcGVuZChfbWV0aG9kKQotbWV0aG9kcy5hcHBlbmQoTUVUSE9EX0NSWVBUKQogZGVsIF9yZXN1bHQsIF9tZXRob2QKZGlmZiAtLWdpdCBhL0xpYi9jc3YucHkgYi9MaWIvY3N2LnB5CmluZGV4IGNhNDBlNWUuLjkwNDYxZGIgMTAwNjQ0Ci0tLSBhL0xpYi9jc3YucHkKKysrIGIvTGliL2Nzdi5weQpAQCAtMTMsMTEgKzEzLDEyIEBACiAKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiAKLV9fYWxsX18gPSBbICJRVU9URV9NSU5JTUFMIiwgIlFVT1RFX0FMTCIsICJRVU9URV9OT05OVU1FUklDIiwgIlFVT1RFX05PTkUiLAotICAgICAgICAgICAgIkVycm9yIiwgIkRpYWxlY3QiLCAiX19kb2NfXyIsICJleGNlbCIsICJleGNlbF90YWIiLAotICAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCi0gICAgICAgICAgICAicmVnaXN0ZXJfZGlhbGVjdCIsICJnZXRfZGlhbGVjdCIsICJsaXN0X2RpYWxlY3RzIiwgIlNuaWZmZXIiLAotICAgICAgICAgICAgInVucmVnaXN0ZXJfZGlhbGVjdCIsICJfX3ZlcnNpb25fXyIsICJEaWN0UmVhZGVyIiwgIkRpY3RXcml0ZXIiIF0KK19fYWxsX18gPSBbIlFVT1RFX01JTklNQUwiLCAiUVVPVEVfQUxMIiwgIlFVT1RFX05PTk5VTUVSSUMiLCAiUVVPVEVfTk9ORSIsCisgICAgICAgICAgICJFcnJvciIsICJEaWFsZWN0IiwgIl9fZG9jX18iLCAiZXhjZWwiLCAiZXhjZWxfdGFiIiwKKyAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCisgICAgICAgICAgICJyZWdpc3Rlcl9kaWFsZWN0IiwgImdldF9kaWFsZWN0IiwgImxpc3RfZGlhbGVjdHMiLCAiU25pZmZlciIsCisgICAgICAgICAgICJ1bnJlZ2lzdGVyX2RpYWxlY3QiLCAiX192ZXJzaW9uX18iLCAiRGljdFJlYWRlciIsICJEaWN0V3JpdGVyIiwKKyAgICAgICAgICAgInVuaXhfZGlhbGVjdCJdCiAKIGNsYXNzIERpYWxlY3Q6CiAgICAgIiIiRGVzY3JpYmUgYSBDU1YgZGlhbGVjdC4KZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQppbmRleCBiMzlkODJjLi4wZWIwOWZiIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CkBAIC0zLDcgKzMsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKIAotaW1wb3J0IGN0eXBlcwogaW1wb3J0IF9jdHlwZXNfdGVzdAogCiBjbGFzcyBCSVRTKFN0cnVjdHVyZSk6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weQppbmRleCBlZjdiMjBiLi4xOWUzZGMxIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKQEAgLTU0LDcgKzU0LDcgQEAKIAogJycnCiAKLWltcG9ydCB1bml0dGVzdCwgZG9jdGVzdCwgc3lzCitpbXBvcnQgdW5pdHRlc3QsIGRvY3Rlc3QKIAogaW1wb3J0IGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cwogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQppbmRleCBlNTZiY2NmLi4zNjNmNTg2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKQEAgLTEsNCArMSw0IEBACi1pbXBvcnQgdW5pdHRlc3QsIHN5cworaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBuZWVkX3N5bWJvbAogCiBjbGFzcyBTaW1wbGVUeXBlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgICMgWFhYIFJlcGxhY2UgYnkgY19jaGFyX3AgdGVzdHMKICAgICBkZWYgdGVzdF9jc3RyaW5ncyhzZWxmKToKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfY2hhcl9wLCBieXJlZgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19jaGFyX3AKIAogICAgICAgICAjIGNfY2hhcl9wLmZyb21fcGFyYW0gb24gYSBQeXRob24gU3RyaW5nIHBhY2tzIHRoZSBzdHJpbmcKICAgICAgICAgIyBpbnRvIGEgY3BhcmFtIG9iamVjdApAQCAtNjgsNyArNjgsNyBAQAogCiAgICAgQG5lZWRfc3ltYm9sKCdjX3djaGFyX3AnKQogICAgIGRlZiB0ZXN0X2N3X3N0cmluZ3Moc2VsZik6Ci0gICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZiwgY193Y2hhcl9wCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3djaGFyX3AKIAogICAgICAgICBjX3djaGFyX3AuZnJvbV9wYXJhbSgiMTIzIikKIApAQCAtOTgsNyArOTgsNyBAQAogICAgIGRlZiB0ZXN0X2J5cmVmX3BvaW50ZXIoc2VsZik6CiAgICAgICAgICMgVGhlIGZyb21fcGFyYW0gY2xhc3MgbWV0aG9kIG9mIFBPSU5URVIodHlwKSBjbGFzc2VzIGFjY2VwdHMgd2hhdCBpcwogICAgICAgICAjIHJldHVybmVkIGJ5IGJ5cmVmKG9iaiksIGl0IHR5cGUob2JqKSA9PSB0eXAKLSAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgcG9pbnRlciwgUE9JTlRFUiwgYnlyZWYKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUiwgYnlyZWYKICAgICAgICAgTFBJTlQgPSBQT0lOVEVSKGNfaW50KQogCiAgICAgICAgIExQSU5ULmZyb21fcGFyYW0oYnlyZWYoY19pbnQoNDIpKSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5CmluZGV4IDMyZjgwMmMuLmQ2ODM5N2UgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBjdHlwZXMgaW1wb3J0ICoKLWltcG9ydCByZSwgc3RydWN0LCBzeXMKK2ltcG9ydCByZSwgc3lzCiAKIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CiAgICAgVEhJU19FTkRJQU4gPSAiPCIKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKaW5kZXggOTNlYmE2Yi4uMTk3NGY0MCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKQEAgLTEsNiArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gY3R5cGVzIGltcG9ydCAqCi1pbXBvcnQgb3MKIAogaW1wb3J0IF9jdHlwZXNfdGVzdAogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CmluZGV4IGY5YjVlOTcuLjRjZWFjYmMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CkBAIC0yLDcgKzIsNiBAQAogCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgogCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIAogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQppbmRleCBkOTk4YzI3Li42MGJhZTgzIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTMyNiwxMSArMzI2LDggQEAKIAogICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sIGIiU29tZW9uZSIsIChiImEiLCBiImIiLCBiImMiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKLSAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIDxjbGFzcyAnVHlwZUVycm9yJz46IHRvbyBtYW55IGluaXRpYWxpemVycyIpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgIihQaG9uZSkgVHlwZUVycm9yOiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgPGNsYXNzICdUeXBlRXJyb3InPjogdG9vIG1hbnkgaW5pdGlhbGl6ZXJzIikKIAogICAgIGRlZiB0ZXN0X2h1Z2VfZmllbGRfbmFtZShzZWxmKToKICAgICAgICAgIyBpc3N1ZTEyODgxOiBzZWdmYXVsdCB3aXRoIGxhcmdlIHN0cnVjdHVyZSBmaWVsZCBuYW1lcwpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CmluZGV4IDVhM2E0N2YuLmU3MWI0ODAgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKQEAgLTc5LDkgKzc5LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChlbnRyeS5uYW1lLmRlY29kZSgiYXNjaWkiKSwgZW50cnkuc2l6ZSkpCiAKLSAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxNjEpLAotICAgICAgICAgICAgICAgICAgICAoIl9fcGhlbGxvX18iLCAtMTYxKSwKLSAgICAgICAgICAgICAgICAgICAgKCJfX3BoZWxsb19fLnNwYW0iLCAxNjEpLAorICAgICAgICBleHBlY3RlZCA9IFsoIl9faGVsbG9fXyIsIDEzOSksCisgICAgICAgICAgICAgICAgICAgICgiX19waGVsbG9fXyIsIC0xMzkpLAorICAgICAgICAgICAgICAgICAgICAoIl9fcGhlbGxvX18uc3BhbSIsIDEzOSksCiAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgZXhwZWN0ZWQsICJQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIGV4YW1wbGUgIgogICAgICAgICAgICAgImluIERvYy9saWJyYXJ5L2N0eXBlcy5yc3QgbWF5IGJlIG91dCBvZiBkYXRlIikKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdXRpbC5weSBiL0xpYi9jdHlwZXMvdXRpbC5weQppbmRleCA3Njg0ZWFiLi5lMjVhODg2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3V0aWwucHkKKysrIGIvTGliL2N0eXBlcy91dGlsLnB5CkBAIC0yNzEsOCArMjcxLDggQEAKICAgICAgICAgICAgIGFiaV90eXBlID0gbWFjaF9tYXAuZ2V0KG1hY2hpbmUsICdsaWJjNicpCiAKICAgICAgICAgICAgICMgWFhYIGFzc3VtaW5nIEdMSUJDJ3MgbGRjb25maWcgKHdpdGggb3B0aW9uIC1wKQotICAgICAgICAgICAgcmVnZXggPSBvcy5mc2VuY29kZSgKLSAgICAgICAgICAgICAgICAnXHMrKGxpYiVzXC5bXlxzXSspXHMrXCglcycgJSAocmUuZXNjYXBlKG5hbWUpLCBhYmlfdHlwZSkpCisgICAgICAgICAgICByZWdleCA9IHInXHMrKGxpYiVzXC5bXlxzXSspXHMrXCglcycKKyAgICAgICAgICAgIHJlZ2V4ID0gb3MuZnNlbmNvZGUocmVnZXggJSAocmUuZXNjYXBlKG5hbWUpLCBhYmlfdHlwZSkpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgd2l0aCBzdWJwcm9jZXNzLlBvcGVuKFsnL3NiaW4vbGRjb25maWcnLCAnLXAnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5ERVZOVUxMLApkaWZmIC0tZ2l0IGEvTGliL2RhdGV0aW1lLnB5IGIvTGliL2RhdGV0aW1lLnB5CmluZGV4IDJmOTQyMTguLmIxMzIxYTMgMTAwNjQ0Ci0tLSBhL0xpYi9kYXRldGltZS5weQorKysgYi9MaWIvZGF0ZXRpbWUucHkKQEAgLTE1MiwxMiArMTUyLDI2IEBACiAgICAgZG51bSA9IF9kYXlzX2JlZm9yZV9tb250aCh5LCBtKSArIGQKICAgICByZXR1cm4gX3RpbWUuc3RydWN0X3RpbWUoKHksIG0sIGQsIGhoLCBtbSwgc3MsIHdkYXksIGRudW0sIGRzdGZsYWcpKQogCi1kZWYgX2Zvcm1hdF90aW1lKGhoLCBtbSwgc3MsIHVzKToKLSAgICAjIFNraXAgdHJhaWxpbmcgbWljcm9zZWNvbmRzIHdoZW4gdXM9PTAuCi0gICAgcmVzdWx0ID0gIiUwMmQ6JTAyZDolMDJkIiAlIChoaCwgbW0sIHNzKQotICAgIGlmIHVzOgotICAgICAgICByZXN1bHQgKz0gIi4lMDZkIiAlIHVzCi0gICAgcmV0dXJuIHJlc3VsdAorZGVmIF9mb3JtYXRfdGltZShoaCwgbW0sIHNzLCB1cywgdGltZXNwZWM9J2F1dG8nKToKKyAgICBzcGVjcyA9IHsKKyAgICAgICAgJ2hvdXJzJzogJ3s6MDJkfScsCisgICAgICAgICdtaW51dGVzJzogJ3s6MDJkfTp7OjAyZH0nLAorICAgICAgICAnc2Vjb25kcyc6ICd7OjAyZH06ezowMmR9Ons6MDJkfScsCisgICAgICAgICdtaWxsaXNlY29uZHMnOiAnezowMmR9Ons6MDJkfTp7OjAyZH0uezowM2R9JywKKyAgICAgICAgJ21pY3Jvc2Vjb25kcyc6ICd7OjAyZH06ezowMmR9Ons6MDJkfS57OjA2ZH0nCisgICAgfQorCisgICAgaWYgdGltZXNwZWMgPT0gJ2F1dG8nOgorICAgICAgICAjIFNraXAgdHJhaWxpbmcgbWljcm9zZWNvbmRzIHdoZW4gdXM9PTAuCisgICAgICAgIHRpbWVzcGVjID0gJ21pY3Jvc2Vjb25kcycgaWYgdXMgZWxzZSAnc2Vjb25kcycKKyAgICBlbGlmIHRpbWVzcGVjID09ICdtaWxsaXNlY29uZHMnOgorICAgICAgICB1cyAvLz0gMTAwMAorICAgIHRyeToKKyAgICAgICAgZm10ID0gc3BlY3NbdGltZXNwZWNdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duIHRpbWVzcGVjIHZhbHVlJykKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZm10LmZvcm1hdChoaCwgbW0sIHNzLCB1cykKIAogIyBDb3JyZWN0bHkgc3Vic3RpdHV0ZSBmb3IgJXogYW5kICVaIGVzY2FwZXMgaW4gc3RyZnRpbWUgZm9ybWF0cy4KIGRlZiBfd3JhcF9zdHJmdGltZShvYmplY3QsIGZvcm1hdCwgdGltZXR1cGxlKToKQEAgLTI0MCw3ICsyNTQsNyBAQAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0emluZm8uJXMoKSBtdXN0IHJldHVybiBhIHdob2xlIG51bWJlciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIG1pbnV0ZXMsIGdvdCAlcyIgJSAobmFtZSwgb2Zmc2V0KSkKICAgICBpZiBub3QgLXRpbWVkZWx0YSgxKSA8IG9mZnNldCA8IHRpbWVkZWx0YSgxKToKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJXMoKT0lcywgbXVzdCBiZSBtdXN0IGJlIHN0cmljdGx5IGJldHdlZW4gIgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCIlcygpPSVzLCBtdXN0IGJlIHN0cmljdGx5IGJldHdlZW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICItdGltZWRlbHRhKGhvdXJzPTI0KSBhbmQgdGltZWRlbHRhKGhvdXJzPTI0KSIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBvZmZzZXQpKQogCkBAIC0zMTYsNiArMzMwLDcgQEAKIAogICAgIHJldHVybiBxCiAKKwogY2xhc3MgdGltZWRlbHRhOgogICAgICIiIlJlcHJlc2VudCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRldGltZSBvYmplY3RzLgogCkBAIC0xMTkzLDE0ICsxMjA4LDE3IEBACiAgICAgICAgICAgICBzID0gc1s6LTFdICsgIiwgdHppbmZvPSVyIiAlIHNlbGYuX3R6aW5mbyArICIpIgogICAgICAgICByZXR1cm4gcwogCi0gICAgZGVmIGlzb2Zvcm1hdChzZWxmKToKKyAgICBkZWYgaXNvZm9ybWF0KHNlbGYsIHRpbWVzcGVjPSdhdXRvJyk6CiAgICAgICAgICIiIlJldHVybiB0aGUgdGltZSBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIElTTy4KIAotICAgICAgICBUaGlzIGlzICdISDpNTTpTUy5tbW1tbW0reno6enonLCBvciAnSEg6TU06U1Mreno6enonIGlmCi0gICAgICAgIHNlbGYubWljcm9zZWNvbmQgPT0gMC4KKyAgICAgICAgVGhlIGZ1bGwgZm9ybWF0IGlzICdISDpNTTpTUy5tbW1tbW0reno6enonLiBCeSBkZWZhdWx0LCB0aGUgZnJhY3Rpb25hbAorICAgICAgICBwYXJ0IGlzIG9taXR0ZWQgaWYgc2VsZi5taWNyb3NlY29uZCA9PSAwLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCB0aW1lc3BlYyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsCisgICAgICAgIHRlcm1zIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUuCiAgICAgICAgICIiIgogICAgICAgICBzID0gX2Zvcm1hdF90aW1lKHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX21pY3Jvc2Vjb25kKQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCwgdGltZXNwZWMpCiAgICAgICAgIHR6ID0gc2VsZi5fdHpzdHIoKQogICAgICAgICBpZiB0ejoKICAgICAgICAgICAgIHMgKz0gdHoKQEAgLTE1NDksMjEgKzE1NjcsMjUgQEAKICAgICAgICAgICAgIHNlbGYuX2hvdXIsIHNlbGYuX21pbnV0ZSwgc2VsZi5fc2Vjb25kLAogICAgICAgICAgICAgc2VsZi5feWVhcikKIAotICAgIGRlZiBpc29mb3JtYXQoc2VsZiwgc2VwPSdUJyk6CisgICAgZGVmIGlzb2Zvcm1hdChzZWxmLCBzZXA9J1QnLCB0aW1lc3BlYz0nYXV0bycpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHRpbWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byBJU08uCiAKLSAgICAgICAgVGhpcyBpcyAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLCBvciAnWVlZWS1NTS1ERCBISDpNTTpTUycgaWYKLSAgICAgICAgc2VsZi5taWNyb3NlY29uZCA9PSAwLgorICAgICAgICBUaGUgZnVsbCBmb3JtYXQgbG9va3MgbGlrZSAnWVlZWS1NTS1ERCBISDpNTTpTUy5tbW1tbW0nLgorICAgICAgICBCeSBkZWZhdWx0LCB0aGUgZnJhY3Rpb25hbCBwYXJ0IGlzIG9taXR0ZWQgaWYgc2VsZi5taWNyb3NlY29uZCA9PSAwLgogCiAgICAgICAgIElmIHNlbGYudHppbmZvIGlzIG5vdCBOb25lLCB0aGUgVVRDIG9mZnNldCBpcyBhbHNvIGF0dGFjaGVkLCBnaXZpbmcKLSAgICAgICAgJ1lZWVktTU0tREQgSEg6TU06U1MubW1tbW1tK0hIOk1NJyBvciAnWVlZWS1NTS1ERCBISDpNTTpTUytISDpNTScuCisgICAgICAgIGdpdmluZyBhIGZ1bGwgZm9ybWF0IG9mICdZWVlZLU1NLUREIEhIOk1NOlNTLm1tbW1tbStISDpNTScuCiAKICAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQgc2VwIHNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gZGF0ZSBhbmQKICAgICAgICAgdGltZSwgZGVmYXVsdCAnVCcuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IHRpbWVzcGVjIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwKKyAgICAgICAgdGVybXMgb2YgdGhlIHRpbWUgdG8gaW5jbHVkZS4KICAgICAgICAgIiIiCiAgICAgICAgIHMgPSAoIiUwNGQtJTAyZC0lMDJkJWMiICUgKHNlbGYuX3llYXIsIHNlbGYuX21vbnRoLCBzZWxmLl9kYXksIHNlcCkgKwogICAgICAgICAgICAgIF9mb3JtYXRfdGltZShzZWxmLl9ob3VyLCBzZWxmLl9taW51dGUsIHNlbGYuX3NlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWljcm9zZWNvbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9taWNyb3NlY29uZCwgdGltZXNwZWMpKQorCiAgICAgICAgIG9mZiA9IHNlbGYudXRjb2Zmc2V0KCkKICAgICAgICAgaWYgb2ZmIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgaWYgb2ZmLmRheXMgPCAwOgpAQCAtMTkxMyw2ICsxOTM1LDggQEAKIAogICAgIEBzdGF0aWNtZXRob2QKICAgICBkZWYgX25hbWVfZnJvbV9vZmZzZXQoZGVsdGEpOgorICAgICAgICBpZiBub3QgZGVsdGE6CisgICAgICAgICAgICByZXR1cm4gJ1VUQycKICAgICAgICAgaWYgZGVsdGEgPCB0aW1lZGVsdGEoMCk6CiAgICAgICAgICAgICBzaWduID0gJy0nCiAgICAgICAgICAgICBkZWx0YSA9IC1kZWx0YQpkaWZmIC0tZ2l0IGEvTGliL2RibS9kdW1iLnB5IGIvTGliL2RibS9kdW1iLnB5CmluZGV4IDc3NzdhN2MuLmU3YzY0NDAgMTAwNjQ0Ci0tLSBhL0xpYi9kYm0vZHVtYi5weQorKysgYi9MaWIvZGJtL2R1bWIucHkKQEAgLTQ3LDYgKzQ3LDcgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlYmFzZW5hbWUsIG1vZGUsIGZsYWc9J2MnKToKICAgICAgICAgc2VsZi5fbW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi5fcmVhZG9ubHkgPSAoZmxhZyA9PSAncicpCiAKICAgICAgICAgIyBUaGUgZGlyZWN0b3J5IGZpbGUgaXMgYSB0ZXh0IGZpbGUuICBFYWNoIGxpbmUgbG9va3MgbGlrZQogICAgICAgICAjICAgICIlciwgKCVkLCAlZClcbiIgJSAoa2V5LCBwb3MsIHNpeikKQEAgLTgwLDYgKzgxLDExIEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGYgPSBfaW8ub3BlbihzZWxmLl9kYXRmaWxlLCAncicsIGVuY29kaW5nPSJMYXRpbi0xIikKICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBpZiBmbGFnIG5vdCBpbiAoJ2MnLCAnbicpOgorICAgICAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlRoZSBkYXRhYmFzZSBmaWxlIGlzIG1pc3NpbmcsIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VtYW50aWNzIG9mIHRoZSAnYycgZmxhZyB3aWxsIGJlIHVzZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD00KQogICAgICAgICAgICAgd2l0aCBfaW8ub3BlbihzZWxmLl9kYXRmaWxlLCAndycsIGVuY29kaW5nPSJMYXRpbi0xIikgYXMgZjoKICAgICAgICAgICAgICAgICBzZWxmLl9jaG1vZChzZWxmLl9kYXRmaWxlKQogICAgICAgICBlbHNlOgpAQCAtMTc4LDYgKzE4NCwxMCBAQAogICAgICAgICAgICAgZi53cml0ZSgiJXIsICVyXG4iICUgKGtleS5kZWNvZGUoIkxhdGluLTEiKSwgcG9zX2FuZF9zaXpfcGFpcikpCiAKICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWwpOgorICAgICAgICBpZiBzZWxmLl9yZWFkb25seToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybignVGhlIGRhdGFiYXNlIGlzIG9wZW5lZCBmb3IgcmVhZGluZyBvbmx5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpOgogICAgICAgICAgICAga2V5ID0ga2V5LmVuY29kZSgndXRmLTgnKQogICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGtleSwgKGJ5dGVzLCBieXRlYXJyYXkpKToKQEAgLTIxMiw2ICsyMjIsMTAgQEAKICAgICAgICAgICAgICMgKHNvIHRoYXQgX2NvbW1pdCgpIG5ldmVyIGdldHMgY2FsbGVkKS4KIAogICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBzZWxmLl9yZWFkb25seToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybignVGhlIGRhdGFiYXNlIGlzIG9wZW5lZCBmb3IgcmVhZGluZyBvbmx5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpOgogICAgICAgICAgICAga2V5ID0ga2V5LmVuY29kZSgndXRmLTgnKQogICAgICAgICBzZWxmLl92ZXJpZnlfb3BlbigpCkBAIC0zMDAsNCArMzE0LDggQEAKICAgICBlbHNlOgogICAgICAgICAjIFR1cm4gb2ZmIGFueSBiaXRzIHRoYXQgYXJlIHNldCBpbiB0aGUgdW1hc2sKICAgICAgICAgbW9kZSA9IG1vZGUgJiAofnVtKQorICAgIGlmIGZsYWcgbm90IGluICgncicsICd3JywgJ2MnLCAnbicpOgorICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgd2FybmluZ3Mud2FybigiRmxhZyBtdXN0IGJlIG9uZSBvZiAncicsICd3JywgJ2MnLCBvciAnbiciLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgIHJldHVybiBfRGF0YWJhc2UoZmlsZSwgbW9kZSwgZmxhZz1mbGFnKQpkaWZmIC0tZ2l0IGEvTGliL2Rpcy5weSBiL0xpYi9kaXMucHkKaW5kZXggZjdlM2M3Zi4uNTk4ODZmMSAxMDA2NDQKLS0tIGEvTGliL2Rpcy5weQorKysgYi9MaWIvZGlzLnB5CkBAIC0xNjMsNiArMTYzLDE1IEBACiBfSW5zdHJ1Y3Rpb24gPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCJfSW5zdHJ1Y3Rpb24iLAogICAgICAib3BuYW1lIG9wY29kZSBhcmcgYXJndmFsIGFyZ3JlcHIgb2Zmc2V0IHN0YXJ0c19saW5lIGlzX2p1bXBfdGFyZ2V0IikKIAorX0luc3RydWN0aW9uLm9wbmFtZS5fX2RvY19fID0gIkh1bWFuIHJlYWRhYmxlIG5hbWUgZm9yIG9wZXJhdGlvbiIKK19JbnN0cnVjdGlvbi5vcGNvZGUuX19kb2NfXyA9ICJOdW1lcmljIGNvZGUgZm9yIG9wZXJhdGlvbiIKK19JbnN0cnVjdGlvbi5hcmcuX19kb2NfXyA9ICJOdW1lcmljIGFyZ3VtZW50IHRvIG9wZXJhdGlvbiAoaWYgYW55KSwgb3RoZXJ3aXNlIE5vbmUiCitfSW5zdHJ1Y3Rpb24uYXJndmFsLl9fZG9jX18gPSAiUmVzb2x2ZWQgYXJnIHZhbHVlIChpZiBrbm93biksIG90aGVyd2lzZSBzYW1lIGFzIGFyZyIKK19JbnN0cnVjdGlvbi5hcmdyZXByLl9fZG9jX18gPSAiSHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygb3BlcmF0aW9uIGFyZ3VtZW50IgorX0luc3RydWN0aW9uLm9mZnNldC5fX2RvY19fID0gIlN0YXJ0IGluZGV4IG9mIG9wZXJhdGlvbiB3aXRoaW4gYnl0ZWNvZGUgc2VxdWVuY2UiCitfSW5zdHJ1Y3Rpb24uc3RhcnRzX2xpbmUuX19kb2NfXyA9ICJMaW5lIHN0YXJ0ZWQgYnkgdGhpcyBvcGNvZGUgKGlmIGFueSksIG90aGVyd2lzZSBOb25lIgorX0luc3RydWN0aW9uLmlzX2p1bXBfdGFyZ2V0Ll9fZG9jX18gPSAiVHJ1ZSBpZiBvdGhlciBjb2RlIGp1bXBzIHRvIGhlcmUsIG90aGVyd2lzZSBGYWxzZSIKKwogY2xhc3MgSW5zdHJ1Y3Rpb24oX0luc3RydWN0aW9uKToKICAgICAiIiJEZXRhaWxzIGZvciBhIGJ5dGVjb2RlIG9wZXJhdGlvbgogCkBAIC0yNzYsNyArMjg1LDYgQEAKICAgICAiIiIKICAgICBsYWJlbHMgPSBmaW5kbGFiZWxzKGNvZGUpCiAgICAgc3RhcnRzX2xpbmUgPSBOb25lCi0gICAgZnJlZSA9IE5vbmUKICAgICBmb3Igb2Zmc2V0LCBvcCwgYXJnIGluIF91bnBhY2tfb3BhcmdzKGNvZGUpOgogICAgICAgICBpZiBsaW5lc3RhcnRzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc3RhcnRzX2xpbmUgPSBsaW5lc3RhcnRzLmdldChvZmZzZXQsIE5vbmUpCkBAIC0yOTYsNyArMzA0LDcgQEAKICAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzbmFtZToKICAgICAgICAgICAgICAgICBhcmd2YWwsIGFyZ3JlcHIgPSBfZ2V0X25hbWVfaW5mbyhhcmcsIG5hbWVzKQogICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNqcmVsOgotICAgICAgICAgICAgICAgIGFyZ3ZhbCA9IG9mZnNldCArIDMgKyBhcmcKKyAgICAgICAgICAgICAgICBhcmd2YWwgPSBvZmZzZXQgKyAyICsgYXJnCiAgICAgICAgICAgICAgICAgYXJncmVwciA9ICJ0byAiICsgcmVwcihhcmd2YWwpCiAgICAgICAgICAgICBlbGlmIG9wIGluIGhhc2xvY2FsOgogICAgICAgICAgICAgICAgIGFyZ3ZhbCwgYXJncmVwciA9IF9nZXRfbmFtZV9pbmZvKGFyZywgdmFybmFtZXMpCkBAIC0zNDMsMjMgKzM1MSwxNSBAQAogZGlzY28gPSBkaXNhc3NlbWJsZSAgICAgICAgICAgICAgICAgICAgICMgWFhYIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogCiBkZWYgX3VucGFja19vcGFyZ3MoY29kZSk6Ci0gICAgIyBlbnVtZXJhdGUoKSBpcyBub3QgYW4gb3B0aW9uLCBzaW5jZSB3ZSBzb21ldGltZXMgcHJvY2VzcwotICAgICMgbXVsdGlwbGUgZWxlbWVudHMgb24gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHRoZSBsb29wCiAgICAgZXh0ZW5kZWRfYXJnID0gMAotICAgIG4gPSBsZW4oY29kZSkKLSAgICBpID0gMAotICAgIHdoaWxlIGkgPCBuOgorICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihjb2RlKSwgMik6CiAgICAgICAgIG9wID0gY29kZVtpXQotICAgICAgICBvZmZzZXQgPSBpCi0gICAgICAgIGkgPSBpKzEKLSAgICAgICAgYXJnID0gTm9uZQogICAgICAgICBpZiBvcCA+PSBIQVZFX0FSR1VNRU5UOgotICAgICAgICAgICAgYXJnID0gY29kZVtpXSArIGNvZGVbaSsxXSoyNTYgKyBleHRlbmRlZF9hcmcKLSAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IDAKLSAgICAgICAgICAgIGkgPSBpKzIKLSAgICAgICAgICAgIGlmIG9wID09IEVYVEVOREVEX0FSRzoKLSAgICAgICAgICAgICAgICBleHRlbmRlZF9hcmcgPSBhcmcqNjU1MzYKLSAgICAgICAgeWllbGQgKG9mZnNldCwgb3AsIGFyZykKKyAgICAgICAgICAgIGFyZyA9IGNvZGVbaSsxXSB8IGV4dGVuZGVkX2FyZworICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gKGFyZyA8PCA4KSBpZiBvcCA9PSBFWFRFTkRFRF9BUkcgZWxzZSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmcgPSBOb25lCisgICAgICAgIHlpZWxkIChpLCBvcCwgYXJnKQogCiBkZWYgZmluZGxhYmVscyhjb2RlKToKICAgICAiIiJEZXRlY3QgYWxsIG9mZnNldHMgaW4gYSBieXRlIGNvZGUgd2hpY2ggYXJlIGp1bXAgdGFyZ2V0cy4KQEAgLTM3MCwxNCArMzcwLDE0IEBACiAgICAgbGFiZWxzID0gW10KICAgICBmb3Igb2Zmc2V0LCBvcCwgYXJnIGluIF91bnBhY2tfb3BhcmdzKGNvZGUpOgogICAgICAgICBpZiBhcmcgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBsYWJlbCA9IC0xCiAgICAgICAgICAgICBpZiBvcCBpbiBoYXNqcmVsOgotICAgICAgICAgICAgICAgIGxhYmVsID0gb2Zmc2V0ICsgMyArIGFyZworICAgICAgICAgICAgICAgIGxhYmVsID0gb2Zmc2V0ICsgMiArIGFyZwogICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNqYWJzOgogICAgICAgICAgICAgICAgIGxhYmVsID0gYXJnCi0gICAgICAgICAgICBpZiBsYWJlbCA+PSAwOgotICAgICAgICAgICAgICAgIGlmIGxhYmVsIG5vdCBpbiBsYWJlbHM6Ci0gICAgICAgICAgICAgICAgICAgIGxhYmVscy5hcHBlbmQobGFiZWwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBsYWJlbCBub3QgaW4gbGFiZWxzOgorICAgICAgICAgICAgICAgIGxhYmVscy5hcHBlbmQobGFiZWwpCiAgICAgcmV0dXJuIGxhYmVscwogCiBkZWYgZmluZGxpbmVzdGFydHMoY29kZSk6CkBAIC0zODYsOCArMzg2LDggQEAKICAgICBHZW5lcmF0ZSBwYWlycyAob2Zmc2V0LCBsaW5lbm8pIGFzIGRlc2NyaWJlZCBpbiBQeXRob24vY29tcGlsZS5jLgogCiAgICAgIiIiCi0gICAgYnl0ZV9pbmNyZW1lbnRzID0gbGlzdChjb2RlLmNvX2xub3RhYlswOjoyXSkKLSAgICBsaW5lX2luY3JlbWVudHMgPSBsaXN0KGNvZGUuY29fbG5vdGFiWzE6OjJdKQorICAgIGJ5dGVfaW5jcmVtZW50cyA9IGNvZGUuY29fbG5vdGFiWzA6OjJdCisgICAgbGluZV9pbmNyZW1lbnRzID0gY29kZS5jb19sbm90YWJbMTo6Ml0KIAogICAgIGxhc3RsaW5lbm8gPSBOb25lCiAgICAgbGluZW5vID0gY29kZS5jb19maXJzdGxpbmVubwpAQCAtMzk4LDYgKzM5OCw5IEBACiAgICAgICAgICAgICAgICAgeWllbGQgKGFkZHIsIGxpbmVubykKICAgICAgICAgICAgICAgICBsYXN0bGluZW5vID0gbGluZW5vCiAgICAgICAgICAgICBhZGRyICs9IGJ5dGVfaW5jcgorICAgICAgICBpZiBsaW5lX2luY3IgPj0gMHg4MDoKKyAgICAgICAgICAgICMgbGluZV9pbmNyZW1lbnRzIGlzIGFuIGFycmF5IG9mIDgtYml0IHNpZ25lZCBpbnRlZ2VycworICAgICAgICAgICAgbGluZV9pbmNyIC09IDB4MTAwCiAgICAgICAgIGxpbmVubyArPSBsaW5lX2luY3IKICAgICBpZiBsaW5lbm8gIT0gbGFzdGxpbmVubzoKICAgICAgICAgeWllbGQgKGFkZHIsIGxpbmVubykKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5CmluZGV4IGIzY2ZlOWMuLmY2YzIxYWUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weQpAQCAtMTk5LDcgKzE5OSw3IEBACiAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHNlbGYudGFyZ2V0X3ZlcnNpb24KICAgICAgICAgICAgIGlmIG5vdCB0YXJnZXRfdmVyc2lvbjoKICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5za2lwX2J1aWxkLCAiU2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoaXMiCi0gICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzeXMudmVyc2lvblswOjNdCisgICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KICAgICAgICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoc2VsZi5wbGF0X25hbWUsIHRhcmdldF92ZXJzaW9uKQogICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgICAgICAgYnVpbGQuYnVpbGRfbGliID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5CmluZGV4IDBjMGUyYzEuLmQzZTFkM2EgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc2VsZi50YXJnZXRfdmVyc2lvbgogICAgICAgICAgICAgaWYgbm90IHRhcmdldF92ZXJzaW9uOgogICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnNraXBfYnVpbGQsICJTaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhpcyIKLSAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHN5cy52ZXJzaW9uWzA6M10KKyAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQogICAgICAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVzIiAlIChzZWxmLnBsYXRfbmFtZSwgdGFyZ2V0X3ZlcnNpb24pCiAgICAgICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCiAgICAgICAgICAgICBidWlsZC5idWlsZF9saWIgPSBvcy5wYXRoLmpvaW4oYnVpbGQuYnVpbGRfYmFzZSwKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weQppbmRleCAzMzdkZDBiLi5jNmY1MmU2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5CkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tcGxhdC1uYW1lIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3MgKHRyeSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nICcuL2NvbmZpZ3VyZSAtLWhlbHAnIG9uIHlvdXIgcGxhdGZvcm0pIikKIAotICAgICAgICBwbGF0X3NwZWNpZmllciA9ICIuJXMtJXMiICUgKHNlbGYucGxhdF9uYW1lLCBzeXMudmVyc2lvblswOjNdKQorICAgICAgICBwbGF0X3NwZWNpZmllciA9ICIuJXMtJWQuJWQiICUgKHNlbGYucGxhdF9uYW1lLCAqc3lzLnZlcnNpb25faW5mb1s6Ml0pCiAKICAgICAgICAgIyBNYWtlIGl0IHNvIFB5dGhvbiAyLnggYW5kIFB5dGhvbiAyLnggd2l0aCAtLXdpdGgtcHlkZWJ1ZyBkb24ndAogICAgICAgICAjIHNoYXJlIHRoZSBzYW1lIGJ1aWxkIGRpcmVjdG9yaWVzLiBEb2luZyBzbyBjb25mdXNlcyB0aGUgYnVpbGQKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZW1wJyArIHBsYXRfc3BlY2lmaWVyKQogICAgICAgICBpZiBzZWxmLmJ1aWxkX3NjcmlwdHMgaXMgTm9uZToKICAgICAgICAgICAgIHNlbGYuYnVpbGRfc2NyaXB0cyA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdHMtJyArIHN5cy52ZXJzaW9uWzA6M10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdHMtJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0pCiAKICAgICAgICAgaWYgc2VsZi5leGVjdXRhYmxlIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLmV4ZWN1dGFibGUgPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkKaW5kZXggODQ3ZTg1OC4uYjFmZDA5ZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5CkBAIC05LDcgKzksNyBAQAogdGhpcyBoZWFkZXIgZmlsZSBsaXZlcyIuCiAiIiIKIAotaW1wb3J0IHN5cywgb3MsIHJlCitpbXBvcnQgb3MsIHJlCiAKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CmluZGV4IDY3ZGIwMDcuLjk0NzRlOWMgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CkBAIC0yOTAsOCArMjkwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzdF92ZXJzaW9uJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzdF9mdWxsbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV92ZXJzaW9uJzogcHlfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9zaG9ydCc6IHB5X3ZlcnNpb25bMDozXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9ub2RvdCc6IHB5X3ZlcnNpb25bMF0gKyBweV92ZXJzaW9uWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV92ZXJzaW9uX3Nob3J0JzogJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV92ZXJzaW9uX25vZG90JzogJyVkJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c19wcmVmaXgnOiBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWZpeCc6IHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzX2V4ZWNfcHJlZml4JzogZXhlY19wcmVmaXgsCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CmluZGV4IGMyYTdkNjQuLjBkZGM3MzYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CkBAIC0yMSwxMCArMjEsMTAgQEAKIAogICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCgnaW5zdGFsbF9kaXInLCdpbnN0YWxsX2RpcicpKQotICAgICAgICBiYXNlbmFtZSA9ICIlcy0lcy1weSVzLmVnZy1pbmZvIiAlICgKKyAgICAgICAgYmFzZW5hbWUgPSAiJXMtJXMtcHklZC4lZC5lZ2ctaW5mbyIgJSAoCiAgICAgICAgICAgICB0b19maWxlbmFtZShzYWZlX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSkpLAogICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2FmZV92ZXJzaW9uKHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkpKSwKLSAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXQorICAgICAgICAgICAgKnN5cy52ZXJzaW9uX2luZm9bOjJdCiAgICAgICAgICkKICAgICAgICAgc2VsZi50YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgYmFzZW5hbWUpCiAgICAgICAgIHNlbGYub3V0cHV0cyA9IFtzZWxmLnRhcmdldF0KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weQppbmRleCA4NjM0M2M4Li40NTZkNTBkIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5CkBAIC01LDcgKzUsNyBAQAogCiAjIGNyZWF0ZWQgMjAwMi8xMC8yMSwgUmljaGFyZCBKb25lcwogCi1pbXBvcnQgb3MsIHN0cmluZywgZ2V0cGFzcworaW1wb3J0IGdldHBhc3MKIGltcG9ydCBpbwogaW1wb3J0IHVybGxpYi5wYXJzZSwgdXJsbGliLnJlcXVlc3QKIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weQppbmRleCA3ZWEzZDVmLi4zNWEwNmViIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5CkBAIC0zLDcgKzMsNiBAQAogSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdzZGlzdCcgY29tbWFuZCAoY3JlYXRlIGEgc291cmNlIGRpc3RyaWJ1dGlvbikuIiIiCiAKIGltcG9ydCBvcwotaW1wb3J0IHN0cmluZwogaW1wb3J0IHN5cwogZnJvbSB0eXBlcyBpbXBvcnQgKgogZnJvbSBnbG9iIGltcG9ydCBnbG9iCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvcmUucHkgYi9MaWIvZGlzdHV0aWxzL2NvcmUucHkKaW5kZXggZjA1YjM0Yi4uZDYwM2Q0YSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb3JlLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29yZS5weQpAQCAtMjA0LDE2ICsyMDQsMTUgQEAKICAgICBnbG9iYWwgX3NldHVwX3N0b3BfYWZ0ZXIsIF9zZXR1cF9kaXN0cmlidXRpb24KICAgICBfc2V0dXBfc3RvcF9hZnRlciA9IHN0b3BfYWZ0ZXIKIAotICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2CisgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3YuY29weSgpCiAgICAgZyA9IHsnX19maWxlX18nOiBzY3JpcHRfbmFtZX0KLSAgICBsID0ge30KICAgICB0cnk6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gc2NyaXB0X25hbWUKICAgICAgICAgICAgIGlmIHNjcmlwdF9hcmdzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHN5cy5hcmd2WzE6XSA9IHNjcmlwdF9hcmdzCiAgICAgICAgICAgICB3aXRoIG9wZW4oc2NyaXB0X25hbWUsICdyYicpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZXhlYyhmLnJlYWQoKSwgZywgbCkKKyAgICAgICAgICAgICAgICBleGVjKGYucmVhZCgpLCBnKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLmFyZ3YgPSBzYXZlX2FyZ3YKICAgICAgICAgICAgIF9zZXR1cF9zdG9wX2FmdGVyID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9kaXN0LnB5IGIvTGliL2Rpc3R1dGlscy9kaXN0LnB5CmluZGV4IGZmYjMzZmY2Li42MmEyNDUxIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2Rpc3QucHkKKysrIGIvTGliL2Rpc3R1dGlscy9kaXN0LnB5CkBAIC0xMDE4LDggKzEwMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJtYWludGFpbmVyIiwgIm1haW50YWluZXJfZW1haWwiLCAidXJsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAibGljZW5zZSIsICJkZXNjcmlwdGlvbiIsICJsb25nX2Rlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZHMiLCAicGxhdGZvcm1zIiwgImZ1bGxuYW1lIiwgImNvbnRhY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWN0X2VtYWlsIiwgImxpY2Vuc2UiLCAiY2xhc3NpZmllcnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJkb3dubG9hZF91cmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWN0X2VtYWlsIiwgImNsYXNzaWZpZXJzIiwgImRvd25sb2FkX3VybCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQRVAgMzE0CiAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3ZpZGVzIiwgInJlcXVpcmVzIiwgIm9ic29sZXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9leHRlbnNpb24ucHkgYi9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQppbmRleCA3ZWZiYjc0Li5jNTA3ZGEzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQorKysgYi9MaWIvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQpAQCAtNCw3ICs0LDYgQEAKIG1vZHVsZXMgaW4gc2V0dXAgc2NyaXB0cy4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKIAogIyBUaGlzIGNsYXNzIGlzIHJlYWxseSBvbmx5IHVzZWQgYnkgdGhlICJidWlsZF9leHQiIGNvbW1hbmQsIHNvIGl0IG1pZ2h0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IDU3MzcyNGQuLmY3MmI3ZjUgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC03MCw3ICs3MCw3IEBACiAgICAgbGVhdmluZyBvZmYgdGhlIHBhdGNobGV2ZWwuICBTYW1wbGUgcmV0dXJuIHZhbHVlcyBjb3VsZCBiZSAnMS41JwogICAgIG9yICcyLjInLgogICAgICIiIgotICAgIHJldHVybiBzeXMudmVyc2lvbls6M10KKyAgICByZXR1cm4gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAKIAogZGVmIGdldF9weXRob25faW5jKHBsYXRfc3BlY2lmaWM9MCwgcHJlZml4PU5vbmUpOgpAQCAtMjQyLDYgKzI0Miw4IEBACiAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oX3N5c19ob21lIG9yIHByb2plY3RfYmFzZSwgIk1ha2VmaWxlIikKICAgICBsaWJfZGlyID0gZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYz0wLCBzdGFuZGFyZF9saWI9MSkKICAgICBjb25maWdfZmlsZSA9ICdjb25maWcte317fScuZm9ybWF0KGdldF9weXRob25fdmVyc2lvbigpLCBidWlsZF9mbGFncykKKyAgICBpZiBoYXNhdHRyKHN5cy5pbXBsZW1lbnRhdGlvbiwgJ19tdWx0aWFyY2gnKToKKyAgICAgICAgY29uZmlnX2ZpbGUgKz0gJy0lcycgJSBzeXMuaW1wbGVtZW50YXRpb24uX211bHRpYXJjaAogICAgIHJldHVybiBvcy5wYXRoLmpvaW4obGliX2RpciwgY29uZmlnX2ZpbGUsICdNYWtlZmlsZScpCiAKIApAQCAtNDE1LDM4ICs0MTcsMTMgQEAKIAogZGVmIF9pbml0X3Bvc2l4KCk6CiAgICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBQT1NJWCBzeXN0ZW1zLiIiIgotICAgIGcgPSB7fQotICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIE1ha2VmaWxlOgotICAgIHRyeToKLSAgICAgICAgZmlsZW5hbWUgPSBnZXRfbWFrZWZpbGVfZmlsZW5hbWUoKQotICAgICAgICBwYXJzZV9tYWtlZmlsZShmaWxlbmFtZSwgZykKLSAgICBleGNlcHQgT1NFcnJvciBhcyBtc2c6Ci0gICAgICAgIG15X21zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIGZpbGVuYW1lCi0gICAgICAgIGlmIGhhc2F0dHIobXNnLCAic3RyZXJyb3IiKToKLSAgICAgICAgICAgIG15X21zZyA9IG15X21zZyArICIgKCVzKSIgJSBtc2cuc3RyZXJyb3IKLQotICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG15X21zZykKLQotICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIHB5Y29uZmlnLmg6Ci0gICAgdHJ5OgotICAgICAgICBmaWxlbmFtZSA9IGdldF9jb25maWdfaF9maWxlbmFtZSgpCi0gICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZmlsZToKLSAgICAgICAgICAgIHBhcnNlX2NvbmZpZ19oKGZpbGUsIGcpCi0gICAgZXhjZXB0IE9TRXJyb3IgYXMgbXNnOgotICAgICAgICBteV9tc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBmaWxlbmFtZQotICAgICAgICBpZiBoYXNhdHRyKG1zZywgInN0cmVycm9yIik6Ci0gICAgICAgICAgICBteV9tc2cgPSBteV9tc2cgKyAiICglcykiICUgbXNnLnN0cmVycm9yCi0KLSAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCi0KLSAgICAjIE9uIEFJWCwgdGhlcmUgYXJlIHdyb25nIHBhdGhzIHRvIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiB0aGUgTWFrZWZpbGUKLSAgICAjIC0tIHRoZXNlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgUHl0aG9uIHNvdXJjZSwgYnV0IHdoZW4gaW5zdGFsbGVkCi0gICAgIyB0aGUgc2NyaXB0cyBhcmUgaW4gYW5vdGhlciBkaXJlY3RvcnkuCi0gICAgaWYgcHl0aG9uX2J1aWxkOgotICAgICAgICBnWydMRFNIQVJFRCddID0gZ1snQkxEU0hBUkVEJ10KLQorICAgICMgX3N5c2NvbmZpZ2RhdGEgaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUsIHNlZSB0aGUgc3lzY29uZmlnIG1vZHVsZQorICAgIG5hbWUgPSAnX3N5c2NvbmZpZ2RhdGFfJyArIHN5cy5hYmlmbGFncworICAgIF90ZW1wID0gX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJ2J1aWxkX3RpbWVfdmFycyddLCAwKQorICAgIGJ1aWxkX3RpbWVfdmFycyA9IF90ZW1wLmJ1aWxkX3RpbWVfdmFycwogICAgIGdsb2JhbCBfY29uZmlnX3ZhcnMKLSAgICBfY29uZmlnX3ZhcnMgPSBnCisgICAgX2NvbmZpZ192YXJzID0ge30KKyAgICBfY29uZmlnX3ZhcnMudXBkYXRlKGJ1aWxkX3RpbWVfdmFycykKIAogCiBkZWYgX2luaXRfbnQoKToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5CmluZGV4IDI1YzE0YWIuLmMxYTJhMDQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weQpAQCAtMywxNiArMywxMiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKLWltcG9ydCB0ZW1wZmlsZQotaW1wb3J0IHNodXRpbAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogCiBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtIGltcG9ydCBiZGlzdF9ycG0KIGZyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CiBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCi1mcm9tIGRpc3R1dGlscyBpbXBvcnQgc3Bhd24KLWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCiAKIFNFVFVQX1BZID0gIiIiXAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weQppbmRleCAzMzkxZjM2Li5iMDIwYTViIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5CkBAIC0yNyw3ICsyNyw3IEBACiAgICAgICAgICMgYnVpbGRfcGxhdGxpYiBpcyAnYnVpbGQvbGliLnBsYXRmb3JtLXgueFstcHlkZWJ1Z10nCiAgICAgICAgICMgZXhhbXBsZXM6CiAgICAgICAgICMgICBidWlsZC9saWIubWFjb3N4LTEwLjMtaTM4Ni0yLjcKLSAgICAgICAgcGxhdF9zcGVjID0gJy4lcy0lcycgJSAoY21kLnBsYXRfbmFtZSwgc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgcGxhdF9zcGVjID0gJy4lcy0lZC4lZCcgJSAoY21kLnBsYXRfbmFtZSwgKnN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuYnVpbGRfcGxhdGxpYi5lbmRzd2l0aCgnLXB5ZGVidWcnKSkKICAgICAgICAgICAgIHBsYXRfc3BlYyArPSAnLXB5ZGVidWcnCkBAIC00Miw3ICs0Miw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJ1aWxkX3RlbXAsIHdhbnRlZCkKIAogICAgICAgICAjIGJ1aWxkX3NjcmlwdHMgaXMgYnVpbGQvc2NyaXB0cy14LngKLSAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGNtZC5idWlsZF9iYXNlLCAnc2NyaXB0cy0nICsgIHN5cy52ZXJzaW9uWzA6M10pCisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzLSVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF9zY3JpcHRzLCB3YW50ZWQpCiAKICAgICAgICAgIyBleGVjdXRhYmxlIGlzIG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQppbmRleCA0ZTM5N2VhLi40N2I1ODZjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkKQEAgLTE2Niw3ICsxNjYsNiBAQAogICAgICAgICBjbWQgPSBzZWxmLmJ1aWxkX2V4dChkaXN0KQogICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCiAKLSAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwogICAgICAgICBweV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihweV9pbmNsdWRlLCBjbWQuaW5jbHVkZV9kaXJzKQogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKaW5kZXggYjY0ZjMwMC4uYzYwNWFmZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQpAQCAtMSw4ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5jbGVhbi4iIiIKLWltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgZ2V0cGFzcwogCiBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmNsZWFuIGltcG9ydCBjbGVhbgogZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5CmluZGV4IGM3YmJkNmQuLmY4ODUyY2EgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weQpAQCAtMSw4ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMucHlwaXJjLnB5cGlyYy4iIiIKLWltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgdGVtcGZpbGUKIAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgUHlQSVJDQ29tbWFuZAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5CmluZGV4IDY1NDIyN2MuLjI3Y2U3MzIgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5CkBAIC0yOSw2ICsyOSwyMSBAQAogc2V0dXAoKQogIiIiCiAKK3NldHVwX2RvZXNfbm90aGluZyA9ICIiIlwKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitzZXR1cCgpCisiIiIKKworCitzZXR1cF9kZWZpbmVzX3N1YmNsYXNzID0gIiIiXAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgaW5zdGFsbCBhcyBfaW5zdGFsbAorCitjbGFzcyBpbnN0YWxsKF9pbnN0YWxsKToKKyAgICBzdWJfY29tbWFuZHMgPSBfaW5zdGFsbC5zdWJfY29tbWFuZHMgKyBbJ2NtZCddCisKK3NldHVwKGNtZGNsYXNzPXsnaW5zdGFsbCc6IGluc3RhbGx9KQorIiIiCiAKIGNsYXNzIENvcmVUZXN0Q2FzZShzdXBwb3J0LkVudmlyb25HdWFyZCwgdW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC02Nyw2ICs4MiwyMSBAQAogICAgICAgICBkaXN0dXRpbHMuY29yZS5ydW5fc2V0dXAoCiAgICAgICAgICAgICBzZWxmLndyaXRlX3NldHVwKHNldHVwX3VzaW5nX19fZmlsZV9fKSkKIAorICAgIGRlZiB0ZXN0X3J1bl9zZXR1cF9wcmVzZXJ2ZXNfc3lzX2FyZ3Yoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHJ1bl9zZXR1cCBkb2VzIG5vdCBjbG9iYmVyIHN5cy5hcmd2CisgICAgICAgIGFyZ3ZfY29weSA9IHN5cy5hcmd2LmNvcHkoKQorICAgICAgICBkaXN0dXRpbHMuY29yZS5ydW5fc2V0dXAoCisgICAgICAgICAgICBzZWxmLndyaXRlX3NldHVwKHNldHVwX2RvZXNfbm90aGluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmFyZ3YsIGFyZ3ZfY29weSkKKworICAgIGRlZiB0ZXN0X3J1bl9zZXR1cF9kZWZpbmVzX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc2NyaXB0IGNhbiB1c2UgX19maWxlX187IGlmIHRoYXQncyBtaXNzaW5nLCB0aGUgdGVzdAorICAgICAgICAjIHNldHVwLnB5IHNjcmlwdCB3aWxsIHJhaXNlIE5hbWVFcnJvci4KKyAgICAgICAgZGlzdCA9IGRpc3R1dGlscy5jb3JlLnJ1bl9zZXR1cCgKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc2V0dXAoc2V0dXBfZGVmaW5lc19zdWJjbGFzcykpCisgICAgICAgIGluc3RhbGwgPSBkaXN0LmdldF9jb21tYW5kX29iaignaW5zdGFsbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2NtZCcsIGluc3RhbGwuc3ViX2NvbW1hbmRzKQorCiAgICAgZGVmIHRlc3RfcnVuX3NldHVwX3VzZXNfY3VycmVudF9kaXIoc2VsZik6CiAgICAgICAgICMgVGhpcyB0ZXN0cyB0aGF0IHRoZSBzZXR1cCBzY3JpcHQgaXMgcnVuIHdpdGggdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiAgICAgICAgICMgYXMgaXRzIG93biBjdXJyZW50IGRpcmVjdG9yeTsgdGhpcyB3YXMgdGVtcG9yYXJpbHkgYnJva2VuIGJ5IGEKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jeWd3aW5jY29tcGlsZXIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY3lnd2luY2NvbXBpbGVyLnB5CmluZGV4IDg1NjkyMTYuLjlkYzg2OWQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jeWd3aW5jY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2N5Z3dpbmNjb21waWxlci5weQpAQCAtMywxMSArMywxMCBAQAogaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCi1pbXBvcnQgc3VicHJvY2VzcwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAogCiBmcm9tIGRpc3R1dGlscyBpbXBvcnQgY3lnd2luY2NvbXBpbGVyCi1mcm9tIGRpc3R1dGlscy5jeWd3aW5jY29tcGlsZXIgaW1wb3J0IChDeWd3aW5DQ29tcGlsZXIsIGNoZWNrX2NvbmZpZ19oLAorZnJvbSBkaXN0dXRpbHMuY3lnd2luY2NvbXBpbGVyIGltcG9ydCAoY2hlY2tfY29uZmlnX2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSF9PSywgQ09ORklHX0hfTk9UT0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSF9VTkNFUlRBSU4sIGdldF92ZXJzaW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tc3ZjcikKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weQppbmRleCAzZTFjMzY2Li5jNmZhZTM5IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5CkBAIC0xLDcgKzEsNiBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5kZXBfdXRpbC4iIiIKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCi1pbXBvcnQgdGltZQogCiBmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIsIG5ld2VyX3BhaXJ3aXNlLCBuZXdlcl9ncm91cAogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNGaWxlRXJyb3IKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5CmluZGV4IGE2ZDA0ZjAuLjAzMDQwYWYgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weQpAQCAtMSw3ICsxLDYgQEAKICIiIlRlc3RzIGZvciBkaXN0dXRpbHMuZmlsZV91dGlsLiIiIgogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKLWltcG9ydCBzaHV0aWwKIGltcG9ydCBlcnJubwogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBwYXRjaAogCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weQppbmRleCA0ZDhjMDBhLi4zMmFiMjk2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkKQEAgLTEsOCArMSw2IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhLiIiIgotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBnZXRwYXNzCiAKIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhIGltcG9ydCBpbnN0YWxsX2RhdGEKIGZyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weQppbmRleCBkOTUzMTU3Li4yMjE3YjMyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHkKQEAgLTEsOCArMSw2IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9oZWFkZXJzLiIiIgotaW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBnZXRwYXNzCiAKIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9oZWFkZXJzIGltcG9ydCBpbnN0YWxsX2hlYWRlcnMKIGZyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHkKaW5kZXggNmM3ZWIyMC4uZjUwN2VmNyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NwYXduLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weQpAQCAtMSwxMSArMSwxMCBAQAogIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5zcGF3bi4iIiIKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCi1pbXBvcnQgdGltZQotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZG91dCwgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBfbnRfcXVvdGVfYXJncwotZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduLCBmaW5kX2V4ZWN1dGFibGUKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFeGVjRXJyb3IKIGZyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CiAKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKaW5kZXggZTE3MWVlOS4uZWZiYTI3ZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKQEAgLTEsNSArMSw0IEBACiAiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIuIiIiCi1pbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IEVudmlyb25tZW50VmFyR3VhcmQsIHJ1bl91bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXh0X2ZpbGUucHkgYi9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQppbmRleCA0NzgzMzZmLi45M2FiYWQzIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3RleHRfZmlsZS5weQpAQCAtNCw3ICs0LDcgQEAKIHRoYXQgKG9wdGlvbmFsbHkpIHRha2VzIGNhcmUgb2Ygc3RyaXBwaW5nIGNvbW1lbnRzLCBpZ25vcmluZyBibGFuawogbGluZXMsIGFuZCBqb2luaW5nIGxpbmVzIHdpdGggYmFja3NsYXNoZXMuIiIiCiAKLWltcG9ydCBzeXMsIG9zLCBpbworaW1wb3J0IHN5cywgaW8KIAogCiBjbGFzcyBUZXh0RmlsZToKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdXRpbC5weQppbmRleCBlNDIzMzI1Li5mZGNmNmZhIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3V0aWwucHkKKysrIGIvTGliL2Rpc3R1dGlscy91dGlsLnB5CkBAIC03LDggKzcsOCBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBpbXBvcnRsaWIudXRpbAotaW1wb3J0IHN5cwogaW1wb3J0IHN0cmluZworaW1wb3J0IHN5cwogZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCiBmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIKIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgpAQCAtMzUwLDYgKzM1MCwxMSBAQAogICAgIGdlbmVyYXRlZCBpbiBpbmRpcmVjdCBtb2RlOyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGxlYXZlCiAgICAgaXQgc2V0IHRvIE5vbmUuCiAgICAgIiIiCisKKyAgICAjIExhdGUgaW1wb3J0IHRvIGZpeCBhIGJvb3RzdHJhcCBpc3N1ZTogX3Bvc2l4c3VicHJvY2VzcyBpcyBidWlsdCBieQorICAgICMgc2V0dXAucHksIGJ1dCBzZXR1cC5weSB1c2VzIGRpc3R1dGlscy4KKyAgICBpbXBvcnQgc3VicHJvY2VzcworCiAgICAgIyBub3RoaW5nIGlzIGRvbmUgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgaXMgVHJ1ZQogICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgogICAgICAgICByYWlzZSBEaXN0dXRpbHNCeXRlQ29tcGlsZUVycm9yKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZC4nKQpAQCAtNDEyLDExICs0MTcsOSBAQAogCiAgICAgICAgICAgICBzY3JpcHQuY2xvc2UoKQogCi0gICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgc2NyaXB0X25hbWVdCi0gICAgICAgIGlmIG9wdGltaXplID09IDE6Ci0gICAgICAgICAgICBjbWQuaW5zZXJ0KDEsICItTyIpCi0gICAgICAgIGVsaWYgb3B0aW1pemUgPT0gMjoKLSAgICAgICAgICAgIGNtZC5pbnNlcnQoMSwgIi1PTyIpCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZV0KKyAgICAgICAgY21kLmV4dGVuZChzdWJwcm9jZXNzLl9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSkKKyAgICAgICAgY21kLmFwcGVuZChzY3JpcHRfbmFtZSkKICAgICAgICAgc3Bhd24oY21kLCBkcnlfcnVuPWRyeV9ydW4pCiAgICAgICAgIGV4ZWN1dGUob3MucmVtb3ZlLCAoc2NyaXB0X25hbWUsKSwgInJlbW92aW5nICVzIiAlIHNjcmlwdF9uYW1lLAogICAgICAgICAgICAgICAgIGRyeV9ydW49ZHJ5X3J1bikKZGlmZiAtLWdpdCBhL0xpYi9kb2N0ZXN0LnB5IGIvTGliL2RvY3Rlc3QucHkKaW5kZXggMzhmZGQ4MC4uNTYzMDIyMCAxMDA2NDQKLS0tIGEvTGliL2RvY3Rlc3QucHkKKysrIGIvTGliL2RvY3Rlc3QucHkKQEAgLTM4MSwxMiArMzgxLDE1IEBACiAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKIAogIyBbWFhdIE5vcm1hbGl6ZSB3aXRoIHJlc3BlY3QgdG8gb3MucGF0aC5wYXJkaXI/Ci1kZWYgX21vZHVsZV9yZWxhdGl2ZV9wYXRoKG1vZHVsZSwgcGF0aCk6CitkZWYgX21vZHVsZV9yZWxhdGl2ZV9wYXRoKG1vZHVsZSwgdGVzdF9wYXRoKToKICAgICBpZiBub3QgaW5zcGVjdC5pc21vZHVsZShtb2R1bGUpOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0V4cGVjdGVkIGEgbW9kdWxlOiAlcicgJSBtb2R1bGUpCi0gICAgaWYgcGF0aC5zdGFydHN3aXRoKCcvJyk6CisgICAgaWYgdGVzdF9wYXRoLnN0YXJ0c3dpdGgoJy8nKToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTW9kdWxlLXJlbGF0aXZlIGZpbGVzIG1heSBub3QgaGF2ZSBhYnNvbHV0ZSBwYXRocycpCiAKKyAgICAjIE5vcm1hbGl6ZSB0aGUgcGF0aC4gT24gV2luZG93cywgcmVwbGFjZSAiLyIgd2l0aCAiXCIuCisgICAgdGVzdF9wYXRoID0gb3MucGF0aC5qb2luKCoodGVzdF9wYXRoLnNwbGl0KCcvJykpKQorCiAgICAgIyBGaW5kIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHBhdGguCiAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgogICAgICAgICAjIEEgbm9ybWFsIG1vZHVsZS9wYWNrYWdlCkBAIC0zOTgsMTMgKzQwMSwxOSBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgYmFzZWRpciA9IG9zLmN1cmRpcgogICAgIGVsc2U6CisgICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKKyAgICAgICAgICAgIGZvciBkaXJlY3RvcnkgaW4gbW9kdWxlLl9fcGF0aF9fOgorICAgICAgICAgICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgdGVzdF9wYXRoKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZ1bGxwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bGxwYXRoCisKICAgICAgICAgIyBBIG1vZHVsZSB3L28gX19maWxlX18gKHRoaXMgaW5jbHVkZXMgYnVpbHRpbnMpCiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbid0IHJlc29sdmUgcGF0aHMgcmVsYXRpdmUgdG8gdGhlIG1vZHVsZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiVyIChpdCBoYXMgbm8gX19maWxlX18pIgogICAgICAgICAgICAgICAgICAgICAgICAgICUgbW9kdWxlLl9fbmFtZV9fKQogCi0gICAgIyBDb21iaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgdGhlIHBhdGguCi0gICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlZGlyLCAqKHBhdGguc3BsaXQoJy8nKSkpCisgICAgIyBDb21iaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgdGhlIHRlc3QgcGF0aC4KKyAgICByZXR1cm4gb3MucGF0aC5qb2luKGJhc2VkaXIsIHRlc3RfcGF0aCkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgMi4gRXhhbXBsZSAmIERvY1Rlc3QKZGlmZiAtLWdpdCBhL0xpYi9lbnVtLnB5IGIvTGliL2VudW0ucHkKaW5kZXggYjg3ODdkMS4uOTlkYjllNiAxMDA2NDQKLS0tIGEvTGliL2VudW0ucHkKKysrIGIvTGliL2VudW0ucHkKQEAgLTEsOCArMSwxNCBAQAogaW1wb3J0IHN5cwotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKIGZyb20gdHlwZXMgaW1wb3J0IE1hcHBpbmdQcm94eVR5cGUsIER5bmFtaWNDbGFzc0F0dHJpYnV0ZQogCi1fX2FsbF9fID0gWydFbnVtJywgJ0ludEVudW0nLCAndW5pcXVlJ10KKyMgdHJ5IF9jb2xsZWN0aW9ucyBmaXJzdCB0byByZWR1Y2Ugc3RhcnR1cCBjb3N0Cit0cnk6CisgICAgZnJvbSBfY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKKworCitfX2FsbF9fID0gWydFbnVtTWV0YScsICdFbnVtJywgJ0ludEVudW0nLCAndW5pcXVlJ10KIAogCiBkZWYgX2lzX2Rlc2NyaXB0b3Iob2JqKToKQEAgLTU0NCw4ICs1NTAsMTQgQEAKICAgICAgICAgICAgIHNvdXJjZSA9IHZhcnMoc291cmNlKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc291cmNlID0gbW9kdWxlX2dsb2JhbHMKLSAgICAgICAgbWVtYmVycyA9IHtuYW1lOiB2YWx1ZSBmb3IgbmFtZSwgdmFsdWUgaW4gc291cmNlLml0ZW1zKCkKLSAgICAgICAgICAgICAgICBpZiBmaWx0ZXIobmFtZSl9CisgICAgICAgICMgV2UgdXNlIGFuIE9yZGVyZWREaWN0IG9mIHNvcnRlZCBzb3VyY2Uga2V5cyBzbyB0aGF0IHRoZQorICAgICAgICAjIF92YWx1ZTJtZW1iZXJfbWFwIGlzIHBvcHVsYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBldmVyeSB0aW1lCisgICAgICAgICMgZm9yIGEgY29uc2lzdGVudCByZXZlcnNlIG1hcHBpbmcgb2YgbnVtYmVyIHRvIG5hbWUgd2hlbiB0aGVyZQorICAgICAgICAjIGFyZSBtdWx0aXBsZSBuYW1lcyBmb3IgdGhlIHNhbWUgbnVtYmVyIHJhdGhlciB0aGFuIHZhcnlpbmcKKyAgICAgICAgIyBiZXR3ZWVuIHJ1bnMgZHVlIHRvIGhhc2ggcmFuZG9taXphdGlvbiBvZiB0aGUgbW9kdWxlIGRpY3Rpb25hcnkuCisgICAgICAgIG1lbWJlcnMgPSBPcmRlcmVkRGljdCgobmFtZSwgc291cmNlW25hbWVdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc29ydGVkKHNvdXJjZS5rZXlzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmaWx0ZXIobmFtZSkpCiAgICAgICAgIGNscyA9IGNscyhuYW1lLCBtZW1iZXJzLCBtb2R1bGU9bW9kdWxlKQogICAgICAgICBjbHMuX19yZWR1Y2VfZXhfXyA9IF9yZWR1Y2VfZXhfYnlfbmFtZQogICAgICAgICBtb2R1bGVfZ2xvYmFscy51cGRhdGUoY2xzLl9fbWVtYmVyc19fKQpkaWZmIC0tZ2l0IGEvTGliL2ZpbGVpbnB1dC5weSBiL0xpYi9maWxlaW5wdXQucHkKaW5kZXggZDJiNTIwNi4uNzIxZmU5YyAxMDA2NDQKLS0tIGEvTGliL2ZpbGVpbnB1dC5weQorKysgYi9MaWIvZmlsZWlucHV0LnB5CkBAIC03NSwxMyArNzUsMTEgQEAKIGltcG9ydCBzeXMsIG9zCiAKIF9fYWxsX18gPSBbImlucHV0IiwgImNsb3NlIiwgIm5leHRmaWxlIiwgImZpbGVuYW1lIiwgImxpbmVubyIsICJmaWxlbGluZW5vIiwKLSAgICAgICAgICAgImlzZmlyc3RsaW5lIiwgImlzc3RkaW4iLCAiRmlsZUlucHV0Il0KKyAgICAgICAgICAgImZpbGVubyIsICJpc2ZpcnN0bGluZSIsICJpc3N0ZGluIiwgIkZpbGVJbnB1dCIsICJob29rX2NvbXByZXNzZWQiLAorICAgICAgICAgICAiaG9va19lbmNvZGVkIl0KIAogX3N0YXRlID0gTm9uZQogCi0jIE5vIGxvbmdlciB1c2VkCi1ERUZBVUxUX0JVRlNJWkUgPSA4KjEwMjQKLQogZGVmIGlucHV0KGZpbGVzPU5vbmUsIGlucGxhY2U9RmFsc2UsIGJhY2t1cD0iIiwgYnVmc2l6ZT0wLAogICAgICAgICAgIG1vZGU9InIiLCBvcGVuaG9vaz1Ob25lKToKICAgICAiIiJSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIEZpbGVJbnB1dCBjbGFzcywgd2hpY2ggY2FuIGJlIGl0ZXJhdGVkLgpAQCAtMjAxLDYgKzE5OSwxMCBAQAogICAgICAgICBzZWxmLl9maWxlcyA9IGZpbGVzCiAgICAgICAgIHNlbGYuX2lucGxhY2UgPSBpbnBsYWNlCiAgICAgICAgIHNlbGYuX2JhY2t1cCA9IGJhY2t1cAorICAgICAgICBpZiBidWZzaXplOgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdidWZzaXplIGlzIGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgc2VsZi5fc2F2ZXN0ZG91dCA9IE5vbmUKICAgICAgICAgc2VsZi5fb3V0cHV0ID0gTm9uZQogICAgICAgICBzZWxmLl9maWxlbmFtZSA9IE5vbmUKQEAgLTM5OCw5ICs0MDAsOSBAQAogICAgICAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgbW9kZSkKIAogCi1kZWYgaG9va19lbmNvZGVkKGVuY29kaW5nKToKK2RlZiBob29rX2VuY29kZWQoZW5jb2RpbmcsIGVycm9ycz1Ob25lKToKICAgICBkZWYgb3Blbmhvb2soZmlsZW5hbWUsIG1vZGUpOgotICAgICAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgbW9kZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgIHJldHVybiBvcGVuKGZpbGVuYW1lLCBtb2RlLCBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPWVycm9ycykKICAgICByZXR1cm4gb3Blbmhvb2sKIAogCmRpZmYgLS1naXQgYS9MaWIvZnJhY3Rpb25zLnB5IGIvTGliL2ZyYWN0aW9ucy5weQppbmRleCA2MGIwNzI4Li42NGQ3NDZiIDEwMDY0NAotLS0gYS9MaWIvZnJhY3Rpb25zLnB5CisrKyBiL0xpYi9mcmFjdGlvbnMucHkKQEAgLTEyNSwxNyArMTI1LDkgQEAKICAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IG51bWVyYXRvci5kZW5vbWluYXRvcgogICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLSAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIGZsb2F0KToKLSAgICAgICAgICAgICAgICAjIEV4YWN0IGNvbnZlcnNpb24gZnJvbSBmbG9hdAotICAgICAgICAgICAgICAgIHZhbHVlID0gRnJhY3Rpb24uZnJvbV9mbG9hdChudW1lcmF0b3IpCi0gICAgICAgICAgICAgICAgc2VsZi5fbnVtZXJhdG9yID0gdmFsdWUuX251bWVyYXRvcgotICAgICAgICAgICAgICAgIHNlbGYuX2Rlbm9taW5hdG9yID0gdmFsdWUuX2Rlbm9taW5hdG9yCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKLQotICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgRGVjaW1hbCk6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBGcmFjdGlvbi5mcm9tX2RlY2ltYWwobnVtZXJhdG9yKQotICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciA9IHZhbHVlLl9udW1lcmF0b3IKLSAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IHZhbHVlLl9kZW5vbWluYXRvcgorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgKGZsb2F0LCBEZWNpbWFsKSk6CisgICAgICAgICAgICAgICAgIyBFeGFjdCBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgc2VsZi5fbnVtZXJhdG9yLCBzZWxmLl9kZW5vbWluYXRvciA9IG51bWVyYXRvci5hc19pbnRlZ2VyX3JhdGlvKCkKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobnVtZXJhdG9yLCBzdHIpOgpAQCAtMjEwLDEwICsyMDIsNiBAQAogICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGYsIGZsb2F0KToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMuZnJvbV9mbG9hdCgpIG9ubHkgdGFrZXMgZmxvYXRzLCBub3QgJXIgKCVzKSIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbHMuX19uYW1lX18sIGYsIHR5cGUoZikuX19uYW1lX18pKQotICAgICAgICBpZiBtYXRoLmlzbmFuKGYpOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGNvbnZlcnQgJXIgdG8gJXMuIiAlIChmLCBjbHMuX19uYW1lX18pKQotICAgICAgICBpZiBtYXRoLmlzaW5mKGYpOgotICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigiQ2Fubm90IGNvbnZlcnQgJXIgdG8gJXMuIiAlIChmLCBjbHMuX19uYW1lX18pKQogICAgICAgICByZXR1cm4gY2xzKCpmLmFzX2ludGVnZXJfcmF0aW8oKSkKIAogICAgIEBjbGFzc21ldGhvZApAQCAtMjI2LDE5ICsyMTQsNyBAQAogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgICIlcy5mcm9tX2RlY2ltYWwoKSBvbmx5IHRha2VzIERlY2ltYWxzLCBub3QgJXIgKCVzKSIgJQogICAgICAgICAgICAgICAgIChjbHMuX19uYW1lX18sIGRlYywgdHlwZShkZWMpLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgZGVjLmlzX2luZmluaXRlKCk6Ci0gICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKAotICAgICAgICAgICAgICAgICJDYW5ub3QgY29udmVydCAlcyB0byAlcy4iICUgKGRlYywgY2xzLl9fbmFtZV9fKSkKLSAgICAgICAgaWYgZGVjLmlzX25hbigpOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGNvbnZlcnQgJXMgdG8gJXMuIiAlIChkZWMsIGNscy5fX25hbWVfXykpCi0gICAgICAgIHNpZ24sIGRpZ2l0cywgZXhwID0gZGVjLmFzX3R1cGxlKCkKLSAgICAgICAgZGlnaXRzID0gaW50KCcnLmpvaW4obWFwKHN0ciwgZGlnaXRzKSkpCi0gICAgICAgIGlmIHNpZ246Ci0gICAgICAgICAgICBkaWdpdHMgPSAtZGlnaXRzCi0gICAgICAgIGlmIGV4cCA+PSAwOgotICAgICAgICAgICAgcmV0dXJuIGNscyhkaWdpdHMgKiAxMCAqKiBleHApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gY2xzKGRpZ2l0cywgMTAgKiogLWV4cCkKKyAgICAgICAgcmV0dXJuIGNscygqZGVjLmFzX2ludGVnZXJfcmF0aW8oKSkKIAogICAgIGRlZiBsaW1pdF9kZW5vbWluYXRvcihzZWxmLCBtYXhfZGVub21pbmF0b3I9MTAwMDAwMCk6CiAgICAgICAgICIiIkNsb3Nlc3QgRnJhY3Rpb24gdG8gc2VsZiB3aXRoIGRlbm9taW5hdG9yIGF0IG1vc3QgbWF4X2Rlbm9taW5hdG9yLgpkaWZmIC0tZ2l0IGEvTGliL2Z0cGxpYi5weSBiL0xpYi9mdHBsaWIucHkKaW5kZXggYzQxNmQ4NS4uMmFiMWQ1NiAxMDA2NDQKLS0tIGEvTGliL2Z0cGxpYi5weQorKysgYi9MaWIvZnRwbGliLnB5CkBAIC0zNiwxMyArMzYsMTIgQEAKICMgTW9kaWZpZWQgYnkgR2lhbXBhb2xvIFJvZG9sYScgdG8gYWRkIFRMUyBzdXBwb3J0LgogIwogCi1pbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCBzb2NrZXQKLWltcG9ydCB3YXJuaW5ncwogZnJvbSBzb2NrZXQgaW1wb3J0IF9HTE9CQUxfREVGQVVMVF9USU1FT1VUCiAKLV9fYWxsX18gPSBbIkZUUCJdCitfX2FsbF9fID0gWyJGVFAiLCAiZXJyb3JfcmVwbHkiLCAiZXJyb3JfdGVtcCIsICJlcnJvcl9wZXJtIiwgImVycm9yX3Byb3RvIiwKKyAgICAgICAgICAgImFsbF9lcnJvcnMiXQogCiAjIE1hZ2ljIG51bWJlciBmcm9tIDxzb2NrZXQuaD4KIE1TR19PT0IgPSAweDEgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFByb2Nlc3MgZGF0YSBvdXQgb2YgYmFuZApkaWZmIC0tZ2l0IGEvTGliL2h0dHAvY2xpZW50LnB5IGIvTGliL2h0dHAvY2xpZW50LnB5CmluZGV4IDM1MDMxM2UuLjc2M2UxZWYgMTAwNjQ0Ci0tLSBhL0xpYi9odHRwL2NsaWVudC5weQorKysgYi9MaWIvaHR0cC9jbGllbnQucHkKQEAgLTQyMCw2ICs0MjAsNyBAQAogICAgICAgICAgICAgc2VsZi5mcC5mbHVzaCgpCiAKICAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgICIiIkFsd2F5cyByZXR1cm5zIFRydWUiIiIKICAgICAgICAgcmV0dXJuIFRydWUKIAogICAgICMgRW5kIG9mICJyYXcgc3RyZWFtIiBtZXRob2RzCkBAIC00NjcsNiArNDY4LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gcwogCiAgICAgZGVmIHJlYWRpbnRvKHNlbGYsIGIpOgorICAgICAgICAiIiJSZWFkIHVwIHRvIGxlbihiKSBieXRlcyBpbnRvIGJ5dGVhcnJheSBiIGFuZCByZXR1cm4gdGhlIG51bWJlcgorICAgICAgICBvZiBieXRlcyByZWFkLgorICAgICAgICAiIiIKKwogICAgICAgICBpZiBzZWxmLmZwIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4gMAogCkBAIC03MDYsNiArNzExLDE3IEBACiAgICAgICAgIHJldHVybiBzZWxmLmZwLmZpbGVubygpCiAKICAgICBkZWYgZ2V0aGVhZGVyKHNlbGYsIG5hbWUsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICcnJ1JldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIgbWF0Y2hpbmcgKm5hbWUqLgorCisgICAgICAgIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXRjaGluZyBoZWFkZXJzLCB0aGUgdmFsdWVzIGFyZQorICAgICAgICBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIHN0cmluZyBzZXBhcmF0ZWQgYnkgY29tbWFzIGFuZCBzcGFjZXMuCisKKyAgICAgICAgSWYgbm8gbWF0Y2hpbmcgaGVhZGVyIGlzIGZvdW5kLCByZXR1cm5zICpkZWZhdWx0KiBvciBOb25lIGlmCisgICAgICAgIHRoZSAqZGVmYXVsdCogaXMgbm90IHNwZWNpZmllZC4KKworICAgICAgICBJZiB0aGUgaGVhZGVycyBhcmUgdW5rbm93biwgcmFpc2VzIGh0dHAuY2xpZW50LlJlc3BvbnNlTm90UmVhZHkuCisKKyAgICAgICAgJycnCiAgICAgICAgIGlmIHNlbGYuaGVhZGVycyBpcyBOb25lOgogICAgICAgICAgICAgcmFpc2UgUmVzcG9uc2VOb3RSZWFkeSgpCiAgICAgICAgIGhlYWRlcnMgPSBzZWxmLmhlYWRlcnMuZ2V0X2FsbChuYW1lKSBvciBkZWZhdWx0CkBAIC03MjgsMTIgKzc0NCw0NSBAQAogICAgICMgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQtc3R5bGUgdXJsbGliIHJlc3BvbnNlcy4KIAogICAgIGRlZiBpbmZvKHNlbGYpOgorICAgICAgICAnJydSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBtaW1ldG9vbHMuTWVzc2FnZSBjb250YWluaW5nCisgICAgICAgIG1ldGEtaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBVUkwuCisKKyAgICAgICAgV2hlbiB0aGUgbWV0aG9kIGlzIEhUVFAsIHRoZXNlIGhlYWRlcnMgYXJlIHRob3NlIHJldHVybmVkIGJ5CisgICAgICAgIHRoZSBzZXJ2ZXIgYXQgdGhlIGhlYWQgb2YgdGhlIHJldHJpZXZlZCBIVE1MIHBhZ2UgKGluY2x1ZGluZworICAgICAgICBDb250ZW50LUxlbmd0aCBhbmQgQ29udGVudC1UeXBlKS4KKworICAgICAgICBXaGVuIHRoZSBtZXRob2QgaXMgRlRQLCBhIENvbnRlbnQtTGVuZ3RoIGhlYWRlciB3aWxsIGJlCisgICAgICAgIHByZXNlbnQgaWYgKGFzIGlzIG5vdyB1c3VhbCkgdGhlIHNlcnZlciBwYXNzZWQgYmFjayBhIGZpbGUKKyAgICAgICAgbGVuZ3RoIGluIHJlc3BvbnNlIHRvIHRoZSBGVFAgcmV0cmlldmFsIHJlcXVlc3QuIEEKKyAgICAgICAgQ29udGVudC1UeXBlIGhlYWRlciB3aWxsIGJlIHByZXNlbnQgaWYgdGhlIE1JTUUgdHlwZSBjYW4gYmUKKyAgICAgICAgZ3Vlc3NlZC4KKworICAgICAgICBXaGVuIHRoZSBtZXRob2QgaXMgbG9jYWwtZmlsZSwgcmV0dXJuZWQgaGVhZGVycyB3aWxsIGluY2x1ZGUKKyAgICAgICAgYSBEYXRlIHJlcHJlc2VudGluZyB0aGUgZmlsZSdzIGxhc3QtbW9kaWZpZWQgdGltZSwgYQorICAgICAgICBDb250ZW50LUxlbmd0aCBnaXZpbmcgZmlsZSBzaXplLCBhbmQgYSBDb250ZW50LVR5cGUKKyAgICAgICAgY29udGFpbmluZyBhIGd1ZXNzIGF0IHRoZSBmaWxlJ3MgdHlwZS4gU2VlIGFsc28gdGhlCisgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSBtaW1ldG9vbHMgbW9kdWxlLgorCisgICAgICAgICcnJwogICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzCiAKICAgICBkZWYgZ2V0dXJsKHNlbGYpOgorICAgICAgICAnJydSZXR1cm4gdGhlIHJlYWwgVVJMIG9mIHRoZSBwYWdlLgorCisgICAgICAgIEluIHNvbWUgY2FzZXMsIHRoZSBIVFRQIHNlcnZlciByZWRpcmVjdHMgYSBjbGllbnQgdG8gYW5vdGhlcgorICAgICAgICBVUkwuIFRoZSB1cmxvcGVuKCkgZnVuY3Rpb24gaGFuZGxlcyB0aGlzIHRyYW5zcGFyZW50bHksIGJ1dCBpbgorICAgICAgICBzb21lIGNhc2VzIHRoZSBjYWxsZXIgbmVlZHMgdG8ga25vdyB3aGljaCBVUkwgdGhlIGNsaWVudCB3YXMKKyAgICAgICAgcmVkaXJlY3RlZCB0by4gVGhlIGdldHVybCgpIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBnZXQgYXQgdGhpcworICAgICAgICByZWRpcmVjdGVkIFVSTC4KKworICAgICAgICAnJycKICAgICAgICAgcmV0dXJuIHNlbGYudXJsCiAKICAgICBkZWYgZ2V0Y29kZShzZWxmKToKKyAgICAgICAgJycnUmV0dXJuIHRoZSBIVFRQIHN0YXR1cyBjb2RlIHRoYXQgd2FzIHNlbnQgd2l0aCB0aGUgcmVzcG9uc2UsCisgICAgICAgIG9yIE5vbmUgaWYgdGhlIFVSTCBpcyBub3QgYW4gSFRUUCBVUkwuCisKKyAgICAgICAgJycnCiAgICAgICAgIHJldHVybiBzZWxmLnN0YXR1cwogCiBjbGFzcyBIVFRQQ29ubmVjdGlvbjoKZGlmZiAtLWdpdCBhL0xpYi9odHRwL3NlcnZlci5weSBiL0xpYi9odHRwL3NlcnZlci5weQppbmRleCAwMDYyMGQxLi5lMTJlNDViIDEwMDY0NAotLS0gYS9MaWIvaHR0cC9zZXJ2ZXIucHkKKysrIGIvTGliL2h0dHAvc2VydmVyLnB5CkBAIC04Nyw2ICs4Nyw3IEBACiAgICAgIlNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlciIsICJDR0lIVFRQUmVxdWVzdEhhbmRsZXIiLAogXQogCitpbXBvcnQgZW1haWwudXRpbHMKIGltcG9ydCBodG1sCiBpbXBvcnQgaHR0cC5jbGllbnQKIGltcG9ydCBpbwpAQCAtMTI2LDkgKzEyNyw2IEBACiAKIERFRkFVTFRfRVJST1JfQ09OVEVOVF9UWVBFID0gInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IgogCi1kZWYgX3F1b3RlX2h0bWwoaHRtbCk6Ci0gICAgcmV0dXJuIGh0bWwucmVwbGFjZSgiJiIsICImYW1wOyIpLnJlcGxhY2UoIjwiLCAiJmx0OyIpLnJlcGxhY2UoIj4iLCAiJmd0OyIpCi0KIGNsYXNzIEhUVFBTZXJ2ZXIoc29ja2V0c2VydmVyLlRDUFNlcnZlcik6CiAKICAgICBhbGxvd19yZXVzZV9hZGRyZXNzID0gMSAgICAjIFNlZW1zIHRvIG1ha2Ugc2Vuc2UgaW4gdGVzdGluZyBlbnZpcm9ubWVudApAQCAtMTM2LDcgKzEzNCw3IEBACiAgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgogICAgICAgICAiIiJPdmVycmlkZSBzZXJ2ZXJfYmluZCB0byBzdG9yZSB0aGUgc2VydmVyIG5hbWUuIiIiCiAgICAgICAgIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIuc2VydmVyX2JpbmQoc2VsZikKLSAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuc29ja2V0LmdldHNvY2tuYW1lKClbOjJdCisgICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLnNlcnZlcl9hZGRyZXNzWzoyXQogICAgICAgICBzZWxmLnNlcnZlcl9uYW1lID0gc29ja2V0LmdldGZxZG4oaG9zdCkKICAgICAgICAgc2VsZi5zZXJ2ZXJfcG9ydCA9IHBvcnQKIApAQCAtMjgyLDEyICsyODAsOSBAQAogICAgICAgICB3b3JkcyA9IHJlcXVlc3RsaW5lLnNwbGl0KCkKICAgICAgICAgaWYgbGVuKHdvcmRzKSA9PSAzOgogICAgICAgICAgICAgY29tbWFuZCwgcGF0aCwgdmVyc2lvbiA9IHdvcmRzCi0gICAgICAgICAgICBpZiB2ZXJzaW9uWzo1XSAhPSAnSFRUUC8nOgotICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKLSAgICAgICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5CQURfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgIkJhZCByZXF1ZXN0IHZlcnNpb24gKCVyKSIgJSB2ZXJzaW9uKQotICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHZlcnNpb25bOjVdICE9ICdIVFRQLyc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICAgICAgICAgICBiYXNlX3ZlcnNpb25fbnVtYmVyID0gdmVyc2lvbi5zcGxpdCgnLycsIDEpWzFdCiAgICAgICAgICAgICAgICAgdmVyc2lvbl9udW1iZXIgPSBiYXNlX3ZlcnNpb25fbnVtYmVyLnNwbGl0KCIuIikKICAgICAgICAgICAgICAgICAjIFJGQyAyMTQ1IHNlY3Rpb24gMy4xIHNheXMgdGhlcmUgY2FuIGJlIG9ubHkgb25lICIuIiBhbmQKQEAgLTMwOSw3ICszMDQsNyBAQAogICAgICAgICAgICAgaWYgdmVyc2lvbl9udW1iZXIgPj0gKDIsIDApOgogICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcigKICAgICAgICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5IVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRCwKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSFRUUCBWZXJzaW9uICglcykiICUgYmFzZV92ZXJzaW9uX251bWJlcikKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSFRUUCB2ZXJzaW9uICglcykiICUgYmFzZV92ZXJzaW9uX251bWJlcikKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgZWxpZiBsZW4od29yZHMpID09IDI6CiAgICAgICAgICAgICBjb21tYW5kLCBwYXRoID0gd29yZHMKQEAgLTMzMiwxMCArMzI3LDExIEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuaGVhZGVycyA9IGh0dHAuY2xpZW50LnBhcnNlX2hlYWRlcnMoc2VsZi5yZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NsYXNzPXNlbGYuTWVzc2FnZUNsYXNzKQotICAgICAgICBleGNlcHQgaHR0cC5jbGllbnQuTGluZVRvb0xvbmc6CisgICAgICAgIGV4Y2VwdCBodHRwLmNsaWVudC5MaW5lVG9vTG9uZyBhcyBlcnI6CiAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoCi0gICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5CQURfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAiTGluZSB0b28gbG9uZyIpCisgICAgICAgICAgICAgICAgSFRUUFN0YXR1cy5SRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFLAorICAgICAgICAgICAgICAgICJMaW5lIHRvbyBsb25nIiwKKyAgICAgICAgICAgICAgICBzdHIoZXJyKSkKICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICBleGNlcHQgaHR0cC5jbGllbnQuSFRUUEV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoCkBAIC00NjUsOCArNDYxLDggQEAKICAgICAgICAgICAgICMgKHNlZSBidWcgIzExMDAyMDEpCiAgICAgICAgICAgICBjb250ZW50ID0gKHNlbGYuZXJyb3JfbWVzc2FnZV9mb3JtYXQgJSB7CiAgICAgICAgICAgICAgICAgJ2NvZGUnOiBjb2RlLAotICAgICAgICAgICAgICAgICdtZXNzYWdlJzogX3F1b3RlX2h0bWwobWVzc2FnZSksCi0gICAgICAgICAgICAgICAgJ2V4cGxhaW4nOiBfcXVvdGVfaHRtbChleHBsYWluKQorICAgICAgICAgICAgICAgICdtZXNzYWdlJzogaHRtbC5lc2NhcGUobWVzc2FnZSwgcXVvdGU9RmFsc2UpLAorICAgICAgICAgICAgICAgICdleHBsYWluJzogaHRtbC5lc2NhcGUoZXhwbGFpbiwgcXVvdGU9RmFsc2UpCiAgICAgICAgICAgICB9KQogICAgICAgICAgICAgYm9keSA9IGNvbnRlbnQuZW5jb2RlKCdVVEYtOCcsICdyZXBsYWNlJykKICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHNlbGYuZXJyb3JfY29udGVudF90eXBlKQpAQCAtNDkxLDEyICs0ODcsMTIgQEAKIAogICAgIGRlZiBzZW5kX3Jlc3BvbnNlX29ubHkoc2VsZiwgY29kZSwgbWVzc2FnZT1Ob25lKToKICAgICAgICAgIiIiU2VuZCB0aGUgcmVzcG9uc2UgaGVhZGVyIG9ubHkuIiIiCi0gICAgICAgIGlmIG1lc3NhZ2UgaXMgTm9uZToKLSAgICAgICAgICAgIGlmIGNvZGUgaW4gc2VsZi5yZXNwb25zZXM6Ci0gICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNlbGYucmVzcG9uc2VzW2NvZGVdWzBdCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnJwogICAgICAgICBpZiBzZWxmLnJlcXVlc3RfdmVyc2lvbiAhPSAnSFRUUC8wLjknOgorICAgICAgICAgICAgaWYgbWVzc2FnZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGNvZGUgaW4gc2VsZi5yZXNwb25zZXM6CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzZWxmLnJlc3BvbnNlc1tjb2RlXVswXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnJwogICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ19oZWFkZXJzX2J1ZmZlcicpOgogICAgICAgICAgICAgICAgIHNlbGYuX2hlYWRlcnNfYnVmZmVyID0gW10KICAgICAgICAgICAgIHNlbGYuX2hlYWRlcnNfYnVmZmVyLmFwcGVuZCgoIiVzICVkICVzXHJcbiIgJQpAQCAtNTgzLDEyICs1NzksNyBAQAogICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZWQgZm9yIGEgbWVzc2FnZSBoZWFkZXIuIiIiCiAgICAgICAgIGlmIHRpbWVzdGFtcCBpcyBOb25lOgogICAgICAgICAgICAgdGltZXN0YW1wID0gdGltZS50aW1lKCkKLSAgICAgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSB0aW1lLmdtdGltZSh0aW1lc3RhbXApCi0gICAgICAgIHMgPSAiJXMsICUwMmQgJTNzICU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAotICAgICAgICAgICAgICAgIHNlbGYud2Vla2RheW5hbWVbd2RdLAotICAgICAgICAgICAgICAgIGRheSwgc2VsZi5tb250aG5hbWVbbW9udGhdLCB5ZWFyLAotICAgICAgICAgICAgICAgIGhoLCBtbSwgc3MpCi0gICAgICAgIHJldHVybiBzCisgICAgICAgIHJldHVybiBlbWFpbC51dGlscy5mb3JtYXRkYXRlKHRpbWVzdGFtcCwgdXNlZ210PVRydWUpCiAKICAgICBkZWYgbG9nX2RhdGVfdGltZV9zdHJpbmcoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCB0aW1lIGZvcm1hdHRlZCBmb3IgbG9nZ2luZy4iIiIKQEAgLTcyNiw3ICs3MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9J3N1cnJvZ2F0ZXBhc3MnKQogICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgZGlzcGxheXBhdGggPSB1cmxsaWIucGFyc2UudW5xdW90ZShwYXRoKQotICAgICAgICBkaXNwbGF5cGF0aCA9IGh0bWwuZXNjYXBlKGRpc3BsYXlwYXRoKQorICAgICAgICBkaXNwbGF5cGF0aCA9IGh0bWwuZXNjYXBlKGRpc3BsYXlwYXRoLCBxdW90ZT1GYWxzZSkKICAgICAgICAgZW5jID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCiAgICAgICAgIHRpdGxlID0gJ0RpcmVjdG9yeSBsaXN0aW5nIGZvciAlcycgJSBkaXNwbGF5cGF0aAogICAgICAgICByLmFwcGVuZCgnPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAnCkBAIC03NTAsNyArNzQxLDcgQEAKICAgICAgICAgICAgIHIuYXBwZW5kKCc8bGk+PGEgaHJlZj0iJXMiPiVzPC9hPjwvbGk+JwogICAgICAgICAgICAgICAgICAgICAlICh1cmxsaWIucGFyc2UucXVvdGUobGlua25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9J3N1cnJvZ2F0ZXBhc3MnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5lc2NhcGUoZGlzcGxheW5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgaHRtbC5lc2NhcGUoZGlzcGxheW5hbWUsIHF1b3RlPUZhbHNlKSkpCiAgICAgICAgIHIuYXBwZW5kKCc8L3VsPlxuPGhyPlxuPC9ib2R5PlxuPC9odG1sPlxuJykKICAgICAgICAgZW5jb2RlZCA9ICdcbicuam9pbihyKS5lbmNvZGUoZW5jLCAnc3Vycm9nYXRlZXNjYXBlJykKICAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQpAQCAtMTE5MSwxNiArMTE4MiwxNSBAQAogICAgIHNlcnZlcl9hZGRyZXNzID0gKGJpbmQsIHBvcnQpCiAKICAgICBIYW5kbGVyQ2xhc3MucHJvdG9jb2xfdmVyc2lvbiA9IHByb3RvY29sCi0gICAgaHR0cGQgPSBTZXJ2ZXJDbGFzcyhzZXJ2ZXJfYWRkcmVzcywgSGFuZGxlckNsYXNzKQotCi0gICAgc2EgPSBodHRwZC5zb2NrZXQuZ2V0c29ja25hbWUoKQotICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIpCi0gICAgdHJ5OgotICAgICAgICBodHRwZC5zZXJ2ZV9mb3JldmVyKCkKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQotICAgICAgICBodHRwZC5zZXJ2ZXJfY2xvc2UoKQotICAgICAgICBzeXMuZXhpdCgwKQorICAgIHdpdGggU2VydmVyQ2xhc3Moc2VydmVyX2FkZHJlc3MsIEhhbmRsZXJDbGFzcykgYXMgaHR0cGQ6CisgICAgICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICAgICAgc2VydmVfbWVzc2FnZSA9ICJTZXJ2aW5nIEhUVFAgb24ge2hvc3R9IHBvcnQge3BvcnR9IChodHRwOi8ve2hvc3R9Ontwb3J0fS8pIC4uLiIKKyAgICAgICAgcHJpbnQoc2VydmVfbWVzc2FnZS5mb3JtYXQoaG9zdD1zYVswXSwgcG9ydD1zYVsxXSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwcmludCgiXG5LZXlib2FyZCBpbnRlcnJ1cHQgcmVjZWl2ZWQsIGV4aXRpbmcuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDApCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkgYi9MaWIvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyYmE5YS4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLWZyb20gdGtpbnRlciBpbXBvcnQgKgotCi1jbGFzcyBNdWx0aVN0YXR1c0JhcihGcmFtZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgotICAgICAgICBpZiBtYXN0ZXIgaXMgTm9uZToKLSAgICAgICAgICAgIG1hc3RlciA9IFRrKCkKLSAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKmt3KQotICAgICAgICBzZWxmLmxhYmVscyA9IHt9Ci0KLSAgICBkZWYgc2V0X2xhYmVsKHNlbGYsIG5hbWUsIHRleHQ9JycsIHNpZGU9TEVGVCwgd2lkdGg9MCk6Ci0gICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYubGFiZWxzOgotICAgICAgICAgICAgbGFiZWwgPSBMYWJlbChzZWxmLCBib3JkZXJ3aWR0aD0wLCBhbmNob3I9VykKLSAgICAgICAgICAgIGxhYmVsLnBhY2soc2lkZT1zaWRlLCBwYWR5PTAsIHBhZHg9NCkKLSAgICAgICAgICAgIHNlbGYubGFiZWxzW25hbWVdID0gbGFiZWwKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxhYmVsID0gc2VsZi5sYWJlbHNbbmFtZV0KLSAgICAgICAgaWYgd2lkdGggIT0gMDoKLSAgICAgICAgICAgIGxhYmVsLmNvbmZpZyh3aWR0aD13aWR0aCkKLSAgICAgICAgbGFiZWwuY29uZmlnKHRleHQ9dGV4dCkKLQotZGVmIF9tdWx0aXN0YXR1c19iYXIocGFyZW50KToKLSAgICByb290ID0gVGsoKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiICUoeCwgeSArIDE1MCkpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBtdWx0aXN0YXR1cyBiYXIiKQotICAgIGZyYW1lID0gRnJhbWUocm9vdCkKLSAgICB0ZXh0ID0gVGV4dChmcmFtZSkKLSAgICB0ZXh0LnBhY2soKQotICAgIG1zYiA9IE11bHRpU3RhdHVzQmFyKGZyYW1lKQotICAgIG1zYi5zZXRfbGFiZWwoIm9uZSIsICJoZWxsbyIpCi0gICAgbXNiLnNldF9sYWJlbCgidHdvIiwgIndvcmxkIikKLSAgICBtc2IucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQotCi0gICAgZGVmIGNoYW5nZSgpOgotICAgICAgICBtc2Iuc2V0X2xhYmVsKCJvbmUiLCAiZm9vIikKLSAgICAgICAgbXNiLnNldF9sYWJlbCgidHdvIiwgImJhciIpCi0KLSAgICBidXR0b24gPSBCdXR0b24ocm9vdCwgdGV4dD0iVXBkYXRlIHN0YXR1cyIsIGNvbW1hbmQ9Y2hhbmdlKQotICAgIGJ1dHRvbi5wYWNrKHNpZGU9Qk9UVE9NKQotICAgIGZyYW1lLnBhY2soKQotICAgIGZyYW1lLm1haW5sb29wKCkKLSAgICByb290Lm1haW5sb29wKCkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KLSAgICBydW4oX211bHRpc3RhdHVzX2JhcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL05FV1MudHh0IGIvTGliL2lkbGVsaWIvTkVXUy50eHQKaW5kZXggZjQ1ZGQyYi4uMWU3OWNiNCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvTkVXUy50eHQKKysrIGIvTGliL2lkbGVsaWIvTkVXUy50eHQKQEAgLTEsNiArMSwyNiBAQAotV2hhdCdzIE5ldyBpbiBJRExFIDMuNS4zPwotPT09PT09PT09PT09PT09PT09PT09PT09PQotKlJlbGVhc2UgZGF0ZTogMjAxNy0wMS0wMT8qCitXaGF0J3MgTmV3IGluIElETEUgMy42LjA/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKypSZWxlYXNlIGRhdGU6IDIwMTYtMDktPz8qCisKKy0gSXNzdWUgIzI3NDc3OiBJRExFIHNlYXJjaCBkaWFsb2dzIG5vdyB1c2UgdHRrIHdpZGdldHMuCisKKy0gSXNzdWUgIzI3MTczOiBBZGQgJ0lETEUgTW9kZXJuIFVuaXgnIHRvIHRoZSBidWlsdC1pbiBrZXkgc2V0cy4KKyAgTWFrZSB0aGUgZGVmYXVsdCBrZXkgc2V0IGRlcGVuZCBvbiB0aGUgcGxhdGZvcm0uCisgIEFkZCB0ZXN0cyBmb3IgdGhlIGNoYW5nZXMgdG8gdGhlIGNvbmZpZyBtb2R1bGUuCisKKy0gSXNzdWUgIzI3NDUyOiBtYWtlIGNvbW1hbmQgbGluZSAiaWRsZS10ZXN0PiBweXRob24gdGVzdF9oZWxwLnB5IiB3b3JrLgorICBfX2ZpbGVfXyBpcyByZWxhdGl2ZSB3aGVuIHB5dGhvbiBpcyBzdGFydGVkIGluIHRoZSBmaWxlJ3MgZGlyZWN0b3J5LgorCistIElzc3VlICMyNzQ1MjogYWRkIGxpbmUgY291bnRlciBhbmQgY3JjIHRvIElETEUgY29uZmlnSGFuZGxlciB0ZXN0IGR1bXAuCisKKy0gSXNzdWUgIzI3MzgwOiBJRExFOiBhZGQgcXVlcnkucHkgd2l0aCBiYXNlIFF1ZXJ5IGRpYWxvZyBhbmQgdHRrIHdpZGdldHMuCisgIE1vZHVsZSBoYWQgc3ViY2xhc3NlcyBTZWN0aW9uTmFtZSwgTW9kdWxlTmFtZSwgYW5kIEhlbHBTb3VyY2UsIHdoaWNoIGFyZQorICB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tIHVzZXJzIGJ5IGNvbmZpZ2RpYWxvZyBhbmQgZmlsZSA9PkxvYWQgTW9kdWxlLgorICBFYWNoIHN1YmNsYXNzIGhhcyBpdHcgb3duIHZhbGlkaXR5IGNoZWNrcy4gIFVzaW5nIE1vZHVsZU5hbWUgYWxsb3dzIHVzZXJzCisgIHRvIGVkaXQgYmFkIG1vZHVsZSBuYW1lcyBpbnN0ZWFkIG9mIHN0YXJ0aW5nIG92ZXIuCisgIEFkZCB0ZXN0cyBhbmQgZGVsZXRlIHRoZSB0d28gZmlsZXMgY29tYmluZWQgaW50byB0aGUgbmV3IG9uZS4KKworLSBJc3N1ZSAjMjczNzI6IFRlc3RfaWRsZSBubyBsb25nZXIgY2hhbmdlcyB0aGUgbG9jYWxlLgogCiAtIElzc3VlICMyNzM2NTogQWxsb3cgbm9uLWFzY2lpIGNoYXJzIGluIElETEUgTkVXUy50eHQsIGZvciBjb250cmlidXRvciBuYW1lcy4KIApAQCAtOCwxOSArMjgsMzEgQEAKICAgUHJldmlvdXNseSwgd2hlbiBJRExFIHdhcyBzdGFydGVkIGZyb20gYSBjb25zb2xlIG9yIGJ5IGltcG9ydCwgYSBjYXNjYWRlCiAgIG9mIHdhcm5pbmdzIHdhcyBlbWl0dGVkLiAgUGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KIAorLSBJc3N1ZSAjMjQxMzc6IFJ1biBJRExFLCB0ZXN0X2lkbGUsIGFuZCBodGVzdCB3aXRoIHRraW50ZXIgZGVmYXVsdCByb290IGRpc2FibGVkLgorICBGaXggY29kZSBhbmQgdGVzdHMgdGhhdCBmYWlsIHdpdGggdGhpcyByZXN0cmljdGlvbi4KKyAgRml4IGh0ZXN0cyB0byBub3QgY3JlYXRlIGEgc2Vjb25kIGFuZCByZWR1bmRhbnQgcm9vdCBhbmQgbWFpbmxvb3AuCiAKLVdoYXQncyBOZXcgaW4gSURMRSAzLjUuMj8KLT09PT09PT09PT09PT09PT09PT09PT09PT0KLSpSZWxlYXNlIGRhdGU6IDIwMTYtMDYtMjYqCistIElzc3VlICMyNzMxMDogRml4IElETEUuYXBwIGZhaWx1cmUgdG8gbGF1bmNoIG9uIE9TIFggZHVlIHRvIHZlc3RpZ2lhbCBpbXBvcnQuCiAKIC0gSXNzdWUgIzUxMjQ6IFBhc3RlIHdpdGggdGV4dCBzZWxlY3RlZCBub3cgcmVwbGFjZXMgdGhlIHNlbGVjdGlvbiBvbiBYMTEuCiAgIFRoaXMgbWF0Y2hlcyBob3cgcGFzdGUgd29ya3Mgb24gV2luZG93cywgTWFjLCBtb3N0IG1vZGVybiBMaW51eCBhcHBzLAogICBhbmQgdHRrIHdpZGdldHMuICBPcmlnaW5hbCBwYXRjaCBieSBTZXJoaXkgU3RvcmNoYWthLgogCistIElzc3VlICMyNDc1MDogU3dpdGNoIGFsbCBzY3JvbGxiYXJzIGluIElETEUgdG8gdHRrIHZlcnNpb25zLgorICBXaGVyZSBuZWVkZWQsIG1pbmltYWwgdGVzdHMgYXJlIGFkZGVkIHRvIGNvdmVyIGNoYW5nZXMuCisKKy0gSXNzdWUgIzI0NzU5OiBJRExFIHJlcXVpcmVzIHRrIDguNSBhbmQgYXZhaWxhYmlsaXR5IHR0ayB3aWRnZXRzLgorICBEZWxldGUgbm93IHVubmVlZGVkIHRrIHZlcnNpb24gdGVzdHMgYW5kIGNvZGUgZm9yIG9sZGVyIHZlcnNpb25zLgorICBBZGQgdGVzdCBmb3IgSURMRSBzeW50YXggY29sb3JpemVyLgorCistIElzc3VlICMyNzIzOTogaWRsZWxpYi5tYWNvc3guaXNYeXpUayBmdW5jdGlvbnMgaW5pdGlhbGl6ZSBhcyBuZWVkZWQuCisKKy0gSXNzdWUgIzI3MjYyOiBtb3ZlIEFxdWEgdW5iaW5kaW5nIGNvZGUsIHdoaWNoIGVuYWJsZSBjb250ZXh0IG1lbnVzLCB0byBtYXhvc3guCisKIC0gSXNzdWUgIzI0NzU5OiBNYWtlIGNsZWFyIGluIGlkbGVsaWIuaWRsZV90ZXN0Ll9faW5pdF9fIHRoYXQgdGhlIGRpcmVjdG9yeQogICBpcyBhIHByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGVzdC50ZXN0X2lkbGUgYW5kIHRvb2wgZm9yIG1haW50YWluZXJzLgogCi0tIElzc3VlICMyNzE5NjogU3RvcCAnVGhlbWVDaGFuZ2VmJyB3YXJuaW5ncyB3aGVuIHJ1bm5pbmcgSURMRSB0ZXN0cy4KKy0gSXNzdWUgIzI3MTk2OiBTdG9wICdUaGVtZUNoYW5nZWQnIHdhcm5pbmdzIHdoZW4gcnVubmluZyBJRExFIHRlc3RzLgogICBUaGVzZSBwZXJzaXN0ZWQgYWZ0ZXIgb3RoZXIgd2FybmluZ3Mgd2VyZSBzdXBwcmVzc2VkIGluICMyMDU2Ny4KICAgQXBwbHkgU2VyaGl5IFN0b3JjaGFrYSdzIHVwZGF0ZV9pZGxldGFza3Mgc29sdXRpb24gdG8gZm91ciB0ZXN0IGZpbGVzLgogICBSZWNvcmQgdGhpcyBhZGRpdGlvbmFsIGFkdmljZSBpbiBpZGxlX3Rlc3QvUkVBRE1FLnR4dApAQCAtMjgsOSArNjAsMjYgQEAKIC0gSXNzdWUgIzIwNTY3OiBSZXZpc2UgaWRsZV90ZXN0L1JFQURNRS50eHQgd2l0aCBhZHZpY2UgYWJvdXQgYXZvaWRpbmcKICAgdGsgd2FybmluZyBtZXNzYWdlcyBmcm9tIHRlc3RzLiAgQXBwbHkgYWR2aWNlIHRvIHNldmVyYWwgSURMRSB0ZXN0cy4KIAorLSBJc3N1ZSAjIDI0MjI1OiBVcGRhdGUgaWRsZWxpYi9SRUFETUUudHh0IHdpdGggbmV3IGZpbGUgbmFtZXMKKyAgYW5kIGV2ZW50IGhhbmRsZXJzLgorCistIElzc3VlICMyNzE1NjogUmVtb3ZlIG9ic29sZXRlIGNvZGUgbm90IHVzZWQgYnkgSURMRS4gIFJlcGxhY2VtZW50czoKKyAgMS4gaGVscC50eHQsIHJlcGxhY2VkIGJ5IGhlbHAuaHRtbCwgaXMgb3V0LW9mLWRhdGUgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgSXRzIGRlZGljYXRlZCB2aWV3ZXIgaGFzIGJlIHJlcGxhY2VkIGJ5IHRoZSBodG1sIHZpZXdlciBpbiBoZWxwLnB5LgorICAyLiAnaW1wb3J0IGlkbGV2ZXI7IEkgPSBpZGxldmVyLklETEVfVkVSU0lPTicgaXMgdGhlIHNhbWUgYXMKKyAgJ2ltcG9ydCBzeXM7IEkgPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldJworICAzLiBBZnRlciAnb2IgPSBzdGFja3ZpZXdlci5WYXJpYWJsZXNUcmVlSXRlbSgqYXJncyknLAorICAnb2Iua2V5cygpJyA9PSAnbGlzdChvYi5vYmplY3Qua2V5cykuCisgIDQuIEluIG1hY29zYywgcnVubmluZ0FzT1NYQVBQID09IGlzQXF1YVRrOyBpZENhcmJvbkFxdWFUayA9PSBpc0NhcmJvblRrCisKIC0gSXNzdWUgIzI3MTE3OiBNYWtlIGNvbG9yaXplciBodGVzdCBhbmQgdHVydGxlZGVtbyB3b3JrIHdpdGggZGFyayB0aGVtZXMuCiAgIE1vdmUgY29kZSBmb3IgY29uZmlndXJpbmcgdGV4dCB3aWRnZXQgY29sb3JzIHRvIGEgbmV3IGZ1bmN0aW9uLgogCistIElzc3VlICMyNDIyNTogUmVuYW1lIG1hbnkgaWRsZWxpYi8qLnB5IGFuZCBpZGxlX3Rlc3QvdGVzdF8qLnB5IGZpbGVzLgorICBFZGl0IGZpbGVzIHRvIHJlcGxhY2Ugb2xkIG5hbWVzIHdpdGggbmV3IG5hbWVzIHdoZW4gdGhlIG9sZCBuYW1lCisgIHJlZmVycmVkIHRvIHRoZSBtb2R1bGUgcmF0aGVyIHRoYW4gdGhlIGNsYXNzIGl0IGNvbnRhaW5lZC4KKyAgU2VlIHRoZSBpc3N1ZSBhbmQgSURMRSBzZWN0aW9uIGluIFdoYXQncyBOZXcgaW4gMy42IGZvciBtb3JlLgorCiAtIElzc3VlICMyNjY3MzogV2hlbiB0ayByZXBvcnRzIGZvbnQgc2l6ZSBhcyAwLCBjaGFuZ2UgdG8gc2l6ZSAxMC4KICAgU3VjaCBmb250cyBvbiBMaW51eCBwcmV2ZW50ZWQgdGhlIGNvbmZpZ3VyYXRpb24gZGlhbG9nIGZyb20gb3BlbmluZy4KIApAQCAtNDMsOCArOTIsOCBAQAogLSBJc3N1ZSAjMTg0MTA6IEFkZCB0ZXN0IGZvciBJRExFJ3Mgc2VhcmNoIGRpYWxvZy4KICAgT3JpZ2luYWwgcGF0Y2ggYnkgV2VzdGxleSBNYXJ0w61uZXouCiAKLS0gSXNzdWUgIzIxNzAzOiBBZGQgdGVzdCBmb3IgdW5kbyBkZWxlZ2F0b3IuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthciAuCistIElzc3VlICMyMTcwMzogQWRkIHRlc3QgZm9yIHVuZG8gZGVsZWdhdG9yLiAgUGF0Y2ggbW9zdGx5IGJ5CisgIFNhaW1hZGhhdiBIZWJsaWthciAuCiAKIC0gSXNzdWUgIzI3MDQ0OiBBZGQgQ29uZmlnRGlhbG9nLnJlbW92ZV92YXJfY2FsbGJhY2tzIHRvIHN0b3AgbWVtb3J5IGxlYWtzLgogCkBAIC02MywxMSArMTEyLDYgQEAKICAgTUFSSyBpbiBSRUFETUUudHh0IGFuZCBvcGVuIHRoaXMgYW5kIE5FV1MudHh0IHdpdGggJ2FzY2lpJy4KICAgUmUtZW5jb2RlIENSRURJVFMudHh0IHRvIHV0Zi04IGFuZCBvcGVuIGl0IHdpdGggJ3V0Zi04Jy4KIAotCi1XaGF0J3MgTmV3IGluIElETEUgMy41LjE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qUmVsZWFzZSBkYXRlOiAyMDE1LTEyLTA2KgotCiAtIElzc3VlIDE1MzQ4OiBTdG9wIHRoZSBkZWJ1Z2dlciBlbmdpbmUgKG5vcm1hbGx5IGluIGEgdXNlciBwcm9jZXNzKQogICBiZWZvcmUgY2xvc2luZyB0aGUgZGVidWdnZXIgd2luZG93IChydW5uaW5nIGluIHRoZSBJRExFIHByb2Nlc3MpLgogICBUaGlzIHByZXZlbnRzIHRoZSBSdW50aW1lRXJyb3JzIHRoYXQgd2VyZSBiZWluZyBjYXVnaHQgYW5kIGlnbm9yZWQuCkBAIC0zNDUsNiArMzg5LDExIEBACiAtIFVzZSBvZiAnZmlsdGVyJyBpbiBrZXliaW5kaW5nRGlhbG9nLnB5IHdhcyBjYXVzaW5nIGN1c3RvbSBrZXkgYXNzaWdubWVudCB0bwogICBmYWlsLiAgUGF0Y2ggNTcwNyBhbWF1cnkuZm9yZ2VvdGRhcmMuCiAKKworV2hhdCdzIE5ldyBpbiBJRExFIDMuMWExPworPT09PT09PT09PT09PT09PT09PT09PT09PQorKlJlbGVhc2UgZGF0ZTogMDctTWFyLTA5KgorCiAtIElzc3VlICM0ODE1OiBPZmZlciBjb252ZXJzaW9uIHRvIFVURi04IGlmIHNvdXJjZSBmaWxlcyBoYXZlCiAgIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uIGFuZCBhcmUgbm90IGVuY29kZWQgaW4gVVRGLTguCiAKQEAgLTM4NCw2ICs0MzMsMTEgQEAKIAogLSBJc3N1ZSAjMzU0OTogT24gTWFjT1MgdGhlIHByZWZlcmVuY2VzIG1lbnUgd2FzIG5vdCBwcmVzZW50CiAKKworV2hhdCdzIE5ldyBpbiBJRExFIDMuMD8KKz09PT09PT09PT09PT09PT09PT09PT09CisqUmVsZWFzZSBkYXRlOiAwMy1EZWMtMjAwOCoKKwogLSBJRExFIHdvdWxkIHByaW50IGEgIlVuaGFuZGxlZCBzZXJ2ZXIgZXhjZXB0aW9uISIgbWVzc2FnZSB3aGVuIGludGVybmFsCiAgIGRlYnVnZ2luZyBpcyBlbmFibGVkLgogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9SRUFETUUudHh0IGIvTGliL2lkbGVsaWIvUkVBRE1FLnR4dAppbmRleCA3YmY3NGMwLi5kMzMzYjQ3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9SRUFETUUudHh0CisrKyBiL0xpYi9pZGxlbGliL1JFQURNRS50eHQKQEAgLTI5LDYxICsyOSw2MSBAQAogCiBJbXBsZW1lbnRhdGlvbgogLS0tLS0tLS0tLS0tLS0KLUF1dG9Db21wbGV0ZS5weSAgICMgQ29tcGxldGUgYXR0cmlidXRlIG5hbWVzIG9yIGZpbGVuYW1lcy4KLUF1dG9Db21wbGV0ZVdpbmRvdy5weSAgIyBEaXNwbGF5IGNvbXBsZXRpb25zLgotQXV0b0V4cGFuZC5weSAgICAgIyBFeHBhbmQgd29yZCB3aXRoIHByZXZpb3VzIHdvcmQgaW4gZmlsZS4KLUJpbmRpbmdzLnB5ICAgICAgICMgRGVmaW5lIG1vc3Qgb2YgSURMRSBtZW51LgotQ2FsbFRpcFdpbmRvdy5weSAgIyBEaXNwbGF5IGNhbGx0aXAuCi1DYWxsVGlwcy5weSAgICAgICAjIENyZWF0ZSBjYWxsdGlwIHRleHQuCi1DbGFzc0Jyb3dzZXIucHkgICAjIENyZWF0ZSBtb2R1bGUgYnJvd3NlciB3aW5kb3cuCi1Db2RlQ29udGV4dC5weSAgICAjIFNob3cgY29tcG91bmQgc3RhdGVtZW50IGhlYWRlcnMgb3RoZXJ3aXNlIG5vdCB2aXNpYmxlLgotQ29sb3JEZWxlZ2F0b3IucHkgIyBDb2xvcml6ZSB0ZXh0IChuaW0pLgotRGVidWdnZXIucHkgICAgICAgIyBEZWJ1ZyBjb2RlIHJ1biBmcm9tIGVkaXRvcjsgc2hvdyB3aW5kb3cuCi1EZWxlZ2F0b3IucHkgICAgICAjIERlZmluZSBiYXNlIGNsYXNzIGZvciBkZWxlZ2F0b3JzIChuaW0pLgotRWRpdG9yV2luZG93LnB5ICAgIyBEZWZpbmUgbW9zdCBvZiBlZGl0b3IgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLgotRmlsZUxpc3QucHkgICAgICAgIyBPcGVuIGZpbGVzIGFuZCBtYW5hZ2UgbGlzdCBvZiBvcGVuIHdpbmRvd3MgKG5pbSkuCi1Gb3JtYXRQYXJhZ3JhcGgucHkjIFJlLXdyYXAgbXVsdGlsaW5lIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgotR3JlcERpYWxvZy5weSAgICAgIyBGaW5kIGFsbCBvY2N1cnJlbmNlcyBvZiBwYXR0ZXJuIGluIG11bHRpcGxlIGZpbGVzLgotSHlwZXJQYXJzZXIucHkgICAgIyBQYXJzZSBjb2RlIGFyb3VuZCBhIGdpdmVuIGluZGV4LgotSU9CaW5kaW5nLnB5ICAgICAgIyBPcGVuLCByZWFkLCBhbmQgd3JpdGUgZmlsZXMKLUlkbGVIaXN0b3J5LnB5ICAgICMgR2V0IHByZXZpb3VzIG9yIG5leHQgdXNlciBpbnB1dCBpbiBzaGVsbCAobmltKQotTXVsdGlDYWxsLnB5ICAgICAgIyBXcmFwIHRrIHdpZGdldCB0byBhbGxvdyBtdWx0aXBsZSBjYWxscyBwZXIgZXZlbnQgKG5pbSkuCi1NdWx0aVN0YXR1c0Jhci5weSAjIERlZmluZSBzdGF0dXMgYmFyIGZvciB3aW5kb3dzIChuaW0pLgotT2JqZWN0QnJvd3Nlci5weSAgIyBEZWZpbmUgY2xhc3MgdXNlZCBpbiBTdGFja1ZpZXdlciAobmltKS4KLU91dHB1dFdpbmRvdy5weSAgICMgQ3JlYXRlIHdpbmRvdyBmb3IgZ3JlcCBvdXRwdXQuCi1QYXJlbk1hdGNoLnB5ICAgICAjIE1hdGNoIGZlbmNlcG9zdHM6ICgpLCBbXSwgYW5kIHt9LgotUGF0aEJyb3dzZXIucHkgICAgIyBDcmVhdGUgcGF0aCBicm93c2VyIHdpbmRvdy4KLVBlcmNvbGF0b3IucHkgICAgICMgTWFuYWdlIGRlbGVnYXRvciBzdGFjayAobmltKS4KLVB5UGFyc2UucHkgICAgICAgICMgR2l2ZSBpbmZvcm1hdGlvbiBvbiBjb2RlIGluZGVudGF0aW9uCi1QeVNoZWxsLnB5ICAgICAgICAjIFN0YXJ0IElETEUsIG1hbmFnZSBzaGVsbCwgY29tcGxldGUgZWRpdG9yIHdpbmRvdwotUmVtb3RlRGVidWdnZXIucHkgIyBEZWJ1ZyBjb2RlIHJ1biBpbiByZW1vdGUgcHJvY2Vzcy4KLVJlbW90ZU9iamVjdEJyb3dzZXIucHkgIyBDb21tdW5pY2F0ZSBvYmplY3RzIGJldHdlZW4gcHJvY2Vzc2VzIHdpdGggcnBjIChuaW0pLgotUmVwbGFjZURpYWxvZy5weSAgIyBTZWFyY2ggYW5kIHJlcGxhY2UgcGF0dGVybiBpbiB0ZXh0LgotUnN0cmlwRXh0ZW5zaW9uLnB5IyBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlCi1TY3JpcHRCaW5kaW5nLnB5ICAjIENoZWNrIGFuZCBydW4gdXNlciBjb2RlLgotU2Nyb2xsZWRMaXN0LnB5ICAgIyBEZWZpbmUgU2Nyb2xsZWRMaXN0IHdpZGdldCBmb3IgSURMRSAobmltKS4KLVNlYXJjaERpYWxvZy5weSAgICMgU2VhcmNoIGZvciBwYXR0ZXJuIGluIHRleHQuCi1TZWFyY2hEaWFsb2dCYXNlLnB5ICAjIERlZmluZSBiYXNlIGZvciBzZWFyY2gsIHJlcGxhY2UsIGFuZCBncmVwIGRpYWxvZ3MuCi1TZWFyY2hFbmdpbmUucHkgICAjIERlZmluZSBlbmdpbmUgZm9yIGFsbCAzIHNlYXJjaCBkaWFsb2dzLgotU3RhY2tWaWV3ZXIucHkgICAgIyBWaWV3IHN0YWNrIGFmdGVyIGV4Y2VwdGlvbi4KLVRyZWVXaWRnZXQucHkgICAgICMgRGVmaW5lIHRyZWUgd2lkZ2VyLCB1c2VkIGluIGJyb3dzZXJzIChuaW0pLgotVW5kb0RlbGVnYXRvci5weSAgIyBNYW5hZ2UgdW5kbyBzdGFjay4KLVdpZGdldFJlZGlyZWN0b3IucHkgIyBJbnRlcmNlcHQgd2lkZ2V0IHN1YmNvbW1hbmRzIChmb3IgcGVyY29sYXRvcikgKG5pbSkuCi1XaW5kb3dMaXN0LnB5ICAgICAjIE1hbmFnZSB3aW5kb3cgbGlzdCBhbmQgZGVmaW5lIGxpc3RlZCB0b3AgbGV2ZWwuCi1ab29tSGVpZ2h0LnB5ICAgICAjIFpvb20gd2luZG93IHRvIGZ1bGwgaGVpZ2h0IG9mIHNjcmVlbi4KLWFib3V0RGlhbG9nLnB5ICAgICMgRGlzcGxheSBBYm91dCBJRExFIGRpYWxvZy4KLWNvbmZpZ0RpYWxvZy5weSAgICMgRGlzcGxheSB1c2VyIGNvbmZpZ3VyYXRpb24gZGlhbG9ncy4KLWNvbmZpZ0hhbmRsZXIucHkgICMgTG9hZCwgZmV0Y2gsIGFuZCBzYXZlIGNvbmZpZ3VyYXRpb24gKG5pbSkuCi1jb25maWdIZWxwU291cmNlRWRpdC5weSAgIyBTcGVjaWZ5IGhlbHAgc291cmNlLgotY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkgICMgU3BlZmlmeSB1c2VyIGNvbmZpZyBzZWN0aW9uIG5hbWUKLWR5bk9wdGlvbk1lbnVXaWRnZXQucHkgICMgZGVmaW5lIG11dGFibGUgT3B0aW9uTWVudSB3aWRnZXQgKG5pbSkuCithdXRvY29tcGxldGUucHkgICAjIENvbXBsZXRlIGF0dHJpYnV0ZSBuYW1lcyBvciBmaWxlbmFtZXMuCithdXRvY29tcGxldGVfdy5weSAjIERpc3BsYXkgY29tcGxldGlvbnMuCithdXRvZXhwYW5kLnB5ICAgICAjIEV4cGFuZCB3b3JkIHdpdGggcHJldmlvdXMgd29yZCBpbiBmaWxlLgorYnJvd3Nlci5weSAgICAgICAgIyBDcmVhdGUgbW9kdWxlIGJyb3dzZXIgd2luZG93LgorY2FsbHRpcF93LnB5ICAgICAgIyBEaXNwbGF5IGNhbGx0aXAuCitjYWxsdGlwcy5weSAgICAgICAjIENyZWF0ZSBjYWxsdGlwIHRleHQuCitjb2RlY29udGV4dC5weSAgICAjIFNob3cgY29tcG91bmQgc3RhdGVtZW50IGhlYWRlcnMgb3RoZXJ3aXNlIG5vdCB2aXNpYmxlLgorY29sb3JpemVyLnB5ICAgICAgIyBDb2xvcml6ZSB0ZXh0IChuaW0pCitjb25maWcucHkgICAgICAgICAjIExvYWQsIGZldGNoLCBhbmQgc2F2ZSBjb25maWd1cmF0aW9uIChuaW0pLgorY29uZmlnZGlhbG9nLnB5ICAgIyBEaXNwbGF5IHVzZXIgY29uZmlndXJhdGlvbiBkaWFsb2dzLgorY29uZmlnX2hlbHAucHkgICAgIyBTcGVjaWZ5IGhlbHAgc291cmNlIGluIGNvbmZpZ2RpYWxvZy4KK2NvbmZpZ19rZXkucHkgICAgICMgQ2hhbmdlIGtleWJpbmRpbmdzLgorZHlub3B0aW9uLnB5ICAgICAgIyBEZWZpbmUgbXV0YWJsZSBPcHRpb25NZW51IHdpZGdldCAobmltKS4KK2RlYnVnb2JqLnB5ICAgICAgICMgRGVmaW5lIGNsYXNzIHVzZWQgaW4gc3RhY2t2aWV3ZXIuCitkZWJ1Z29ial9yLnB5ICAgICAjIENvbW11bmljYXRlIG9iamVjdHMgYmV0d2VlbiBwcm9jZXNzZXMgd2l0aCBycGMgKG5pbSkuCitkZWJ1Z2dlci5weSAgICAgICAjIERlYnVnIGNvZGUgcnVuIGZyb20gc2hlbGwgb3IgZWRpdG9yOyBzaG93IHdpbmRvdy4KK2RlYnVnZ2VyX3IucHkgICAgICMgRGVidWcgY29kZSBydW4gaW4gcmVtb3RlIHByb2Nlc3MuCitkZWxlZ2F0b3IucHkgICAgICAjIERlZmluZSBiYXNlIGNsYXNzIGZvciBkZWxlZ2F0b3JzIChuaW0pLgorZWRpdG9yLnB5ICAgICAgICAgIyBEZWZpbmUgbW9zdCBvZiBlZGl0b3IgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLgorZmlsZWxpc3QucHkgICAgICAgIyBPcGVuIGZpbGVzIGFuZCBtYW5hZ2UgbGlzdCBvZiBvcGVuIHdpbmRvd3MgKG5pbSkuCitncmVwLnB5ICAgICAgICAgICAjIEZpbmQgYWxsIG9jY3VycmVuY2VzIG9mIHBhdHRlcm4gaW4gbXVsdGlwbGUgZmlsZXMuCiBoZWxwLnB5ICAgICAgICAgICAjIERpc3BsYXkgSURMRSdzIGh0bWwgZG9jLgota2V5YmluZGluZ0RpYWxvZy5weSAgIyBDaGFuZ2Uga2V5YmluZGluZ3MuCi1tYWNvc3hTdXBwb3J0LnB5ICAjIEhlbHAgSURMRSBydW4gb24gTWFjcyAobmltKS4KK2hlbHBfYWJvdXQucHkgICAgICMgRGlzcGxheSBBYm91dCBJRExFIGRpYWxvZy4KK2hpc3RvcnkucHkgICAgICAgICMgR2V0IHByZXZpb3VzIG9yIG5leHQgdXNlciBpbnB1dCBpbiBzaGVsbCAobmltKQoraHlwZXJwYXJzZXIucHkgICAgIyBQYXJzZSBjb2RlIGFyb3VuZCBhIGdpdmVuIGluZGV4LgoraW9tZW51LnB5ICAgICAgICAgIyBPcGVuLCByZWFkLCBhbmQgd3JpdGUgZmlsZXMKK21hY29zeC5weSAgICAgICAgICMgSGVscCBJRExFIHJ1biBvbiBNYWNzIChuaW0pLgorbWFpbm1lbnUucHkgICAgICAgIyBEZWZpbmUgbW9zdCBvZiBJRExFIG1lbnUuCittdWx0aWNhbGwucHkgICAgICAjIFdyYXAgdGsgd2lkZ2V0IHRvIGFsbG93IG11bHRpcGxlIGNhbGxzIHBlciBldmVudCAobmltKS4KK291dHdpbi5weSAgICAgICAgICMgQ3JlYXRlIHdpbmRvdyBmb3IgZ3JlcCBvdXRwdXQuCitwYXJhZ3JhcGgucHkgICAgICAjIFJlLXdyYXAgbXVsdGlsaW5lIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgorcGFyZW5tYXRjaC5weSAgICAgIyBNYXRjaCBmZW5jZXBvc3RzOiAoKSwgW10sIGFuZCB7fS4KK3BhdGhicm93c2VyLnB5ICAgICMgQ3JlYXRlIHBhdGggYnJvd3NlciB3aW5kb3cuCitwZXJjb2xhdG9yLnB5ICAgICAjIE1hbmFnZSBkZWxlZ2F0b3Igc3RhY2sgKG5pbSkuCitweXBhcnNlLnB5ICAgICAgICAjIEdpdmUgaW5mb3JtYXRpb24gb24gY29kZSBpbmRlbnRhdGlvbgorcHlzaGVsbC5weSAgICAgICAgIyBTdGFydCBJRExFLCBtYW5hZ2Ugc2hlbGwsIGNvbXBsZXRlIGVkaXRvciB3aW5kb3cKK3F1ZXJ5LnB5ICAgICAgICAgICMgUXVlcnkgdXNlciBmb3IgaW5mb3JtdGlvbgorcmVkaXJlY3Rvci5weSAgICAgIyBJbnRlcmNlcHQgd2lkZ2V0IHN1YmNvbW1hbmRzIChmb3IgcGVyY29sYXRvcikgKG5pbSkuCityZXBsYWNlLnB5ICAgICAgICAjIFNlYXJjaCBhbmQgcmVwbGFjZSBwYXR0ZXJuIGluIHRleHQuCiBycGMucHkgICAgICAgICAgICAjIENvbW11aWNhdGUgYmV0d2VlbiBpZGxlIGFuZCB1c2VyIHByb2Nlc3NlcyAobmltKS4KK3JzdHJpcC5weSAgICAgICAgICMgU3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZS4KIHJ1bi5weSAgICAgICAgICAgICMgTWFuYWdlIHVzZXIgY29kZSBleGVjdXRpb24gc3VicHJvY2Vzcy4KK3J1bnNjcmlwdC5weSAgICAgICMgQ2hlY2sgYW5kIHJ1biB1c2VyIGNvZGUuCitzY3JvbGxlZGxpc3QucHkgICAjIERlZmluZSBzY3JvbGxlZGxpc3Qgd2lkZ2V0IGZvciBJRExFIChuaW0pLgorc2VhcmNoLnB5ICAgICAgICAgIyBTZWFyY2ggZm9yIHBhdHRlcm4gaW4gdGV4dC4KK3NlYXJjaGJhc2UucHkgICAgICMgRGVmaW5lIGJhc2UgZm9yIHNlYXJjaCwgcmVwbGFjZSwgYW5kIGdyZXAgZGlhbG9ncy4KK3NlYXJjaGVuZ2luZS5weSAgICMgRGVmaW5lIGVuZ2luZSBmb3IgYWxsIDMgc2VhcmNoIGRpYWxvZ3MuCitzdGFja3ZpZXdlci5weSAgICAjIFZpZXcgc3RhY2sgYWZ0ZXIgZXhjZXB0aW9uLgorc3RhdHVzYmFyLnB5ICAgICAgIyBEZWZpbmUgc3RhdHVzIGJhciBmb3Igd2luZG93cyAobmltKS4KIHRhYmJlZHBhZ2VzLnB5ICAgICMgRGVmaW5lIHRhYmJlZCBwYWdlcyB3aWRnZXQgKG5pbSkuCi10ZXh0Vmlldy5weSAgICAgICAjIERlZmluZSByZWFkLW9ubHkgdGV4dCB3aWRnZXQgKG5pbSkuCit0ZXh0dmlldy5weSAgICAgICAjIERlZmluZSByZWFkLW9ubHkgdGV4dCB3aWRnZXQgKG5pbSkuCit0cmVlLnB5ICAgICAgICAgICAjIERlZmluZSB0cmVlIHdpZGdlciwgdXNlZCBpbiBicm93c2VycyAobmltKS4KK3VuZG8ucHkgICAgICAgICAgICMgTWFuYWdlIHVuZG8gc3RhY2suCit3aW5kb3dzLnB5ICAgICAgICAjIE1hbmFnZSB3aW5kb3cgbGlzdCBhbmQgZGVmaW5lIGxpc3RlZCB0b3AgbGV2ZWwuCit6b29taGVpZ2h0LnB5ICAgICAjIFpvb20gd2luZG93IHRvIGZ1bGwgaGVpZ2h0IG9mIHNjcmVlbi4KIAogQ29uZmlndXJhdGlvbgogLS0tLS0tLS0tLS0tLQpAQCAtMTA0LDEyNiArMTA0LDEyOCBAQAogCiBTdWJkaXJlY3RvcmllcwogLS0tLS0tLS0tLS0tLS0KLUljb25zICAjIHNtYWxsIGltYWdlIGZpbGVzCi1pZGxlX3Rlc3QgICMgZmlsZXMgZm9yIGh1bWFuIHRlc3QgYW5kIGF1dG9tYXRlZCB1bml0IHRlc3RzCitJY29ucyAgICAgICAgIyBzbWFsbCBpbWFnZSBmaWxlcworaWRsZV90ZXN0ICAgICMgZmlsZXMgZm9yIGh1bWFuIHRlc3QgYW5kIGF1dG9tYXRlZCB1bml0IHRlc3RzCiAKIFVudXNlZCBhbmQgRGVwcmVjYXRlZCBmaWxlcyBhbmQgb2JqZWN0cyAobmltKQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FZGl0b3JXaW5kb3cucHk6IEhlbHBkaWFsb2cgYW5kIGhlbHBEaWFsb2cKLVRvb2xUaXAucHk6IHVudXNlZC4KLWhlbHAudHh0Ci1pZGxldmVyLnB5Cit0b29sdGlwLnB5ICMgdW51c2VkCisKIAogCiBJRExFIE1FTlVTCi1Ub3AgbGV2ZWwgaXRlbXMgYW5kIG1vc3Qgc3VibWVudSBpdGVtcyBhcmUgZGVmaW5lZCBpbiBCaW5kaW5ncy4KK1RvcCBsZXZlbCBpdGVtcyBhbmQgbW9zdCBzdWJtZW51IGl0ZW1zIGFyZSBkZWZpbmVkIGluIG1haW5tZW51LgogRXh0ZW5zdGlvbnMgYWRkIHN1Ym1lbnUgaXRlbXMgd2hlbiBhY3RpdmUuICBUaGUgbmFtZXMgZ2l2ZW4gYXJlCiBmb3VuZCwgcXVvdGVkLCBpbiBvbmUgb2YgdGhlc2UgbW9kdWxlcywgcGFpcmVkIHdpdGggYSAnPDxwc2V1ZG9ldmVudD4+Jy4KIEVhY2ggcHNldWRvZXZlbnQgaXMgYm91bmQgdG8gYW4gZXZlbnQgaGFuZGxlci4gIFNvbWUgZXZlbnQgaGFuZGxlcnMKIGNhbGwgYW5vdGhlciBmdW5jdGlvbiB0aGF0IGRvZXMgdGhlIGFjdHVhbCB3b3JrLiAgVGhlIGFubm90YXRpb25zIGJlbG93CiBhcmUgaW50ZW5kZWQgdG8gYXQgbGVhc3QgZ2l2ZSB0aGUgbW9kdWxlIHdoZXJlIHRoZSBhY3R1YWwgd29yayBpcyBkb25lLgorJ2VFVycgPSBlZGl0b3IuRWRpdG9yV2luZG93CiAKLUZpbGUgICMgSU9CaW5kaWcgZXhjZXB0IGFzIG5vdGVkCi0gIE5ldyBGaWxlCi0gIE9wZW4uLi4gICMgSU9CaW5kaW5nLm9wZW4KLSAgT3BlbiBNb2R1bGUKK0ZpbGUKKyAgTmV3IEZpbGUgICAgICAgICAjIGVFVy5uZXdfY2FsbGJhY2sKKyAgT3Blbi4uLiAgICAgICAgICAjIGlvbWVudS5vcGVuCisgIE9wZW4gTW9kdWxlICAgICAgIyBlRXcub3Blbl9tb2R1bGUKICAgUmVjZW50IEZpbGVzCi0gIENsYXNzIEJyb3dzZXIgICMgQ2xhc3MgQnJvd3NlcgotICBQYXRoIEJyb3dzZXIgICMgUGF0aCBCcm93c2VyCisgIENsYXNzIEJyb3dzZXIgICAgIyBlRVcub3Blbl9jbGFzc19icm93c2VyLCBicm93c2VyLkNsYXNzQnJvd3NlcgorICBQYXRoIEJyb3dzZXIgICAgICMgZUVXLm9wZW5fcGF0aF9icm93c2VyLCBwYXRoYnJvd3NlcgogICAtLS0KLSAgU2F2ZSAgIyBJREJpbmRpbmcuc2F2ZQotICBTYXZlIEFzLi4uICAjIElPQmluZGluZy5zYXZlX2FzCi0gIFNhdmUgQ29weSBBcy4uLiAgIyBJT0JpbmRsaW5nLnNhdmVfYV9jb3B5CisgIFNhdmUgICAgICAgICAgICAgIyBpb21lbnUuc2F2ZQorICBTYXZlIEFzLi4uICAgICAgICMgaW9tZW51LnNhdmVfYXMKKyAgU2F2ZSBDb3B5IEFzLi4uICAjIGlvbWVudS5zYXZlX2FfY29weQogICAtLS0KLSAgUHJpbnQgV2luZG93ICAjIElPQmluZGluZy5wcmludF93aW5kb3cKKyAgUHJpbnQgV2luZG93ICAgICAjIGlvbWVudS5wcmludF93aW5kb3cKICAgLS0tCi0gIENsb3NlCi0gIEV4aXQKKyAgQ2xvc2UgICAgICAgICAgICAjIGVFVy5jbG9zZV9ldmVudAorICBFeGl0ICAgICAgICAgICAgICMgZmxpc3QuY2xvc2VfYWxsX2NhbGxiYWNrIChib3VuZCBpbiBlRVcpCiAKIEVkaXQKLSAgVW5kbyAgIyB1bmRvRGVsZWdhdG9yCi0gIFJlZG8gICMgdW5kb0RlbGVnYXRvcgotICAtLS0KLSAgQ3V0Ci0gIENvcHkKLSAgUGFzdGUKLSAgU2VsZWN0IEFsbAotICAtLS0gICMgTmV4dCA1IGl0ZW1zIHVzZSBTZWFyY2hFbmdpbmU7IGRpYWxvZ3MgdXNlIFNlYXJjaERpYWxvZ0Jhc2UKLSAgRmluZCAgIyBTZWFyY2ggRGlhbG9nCi0gIEZpbmQgQWdhaW4KLSAgRmluZCBTZWxlY3Rpb24KLSAgRmluZCBpbiBGaWxlcy4uLiAgIyBHcmVwRGlhbG9nCi0gIFJlcGxhY2UuLi4gICMgUmVwbGFjZURpYWxvZwotICBHbyB0byBMaW5lCi0gIFNob3cgQ29tcGxldGlvbnMgICMgQXV0b0NvbXBsZXRlIGV4dGVuc2lvbiBhbmQgQXV0b0NvbXBsZXRlV2lkb3cgKCZIUCkKLSAgRXhwYW5kIFdvcmQgICMgQXV0b0V4cGFuZCBleHRlbnNpb24KLSAgU2hvdyBjYWxsIHRpcCAgIyBDYWxsdGlwcyBleHRlbnNpb24gYW5kIENhbGx0aXBXaW5kb3cgKCYgSHlwZXJwYXJzZXIpCi0gIFNob3cgc3Vycm91bmRpbmcgcGFyZW5zICAjIFBhcmVuTWF0Y2ggKCYgSHlwZXJwYXJzZXIpCisgIFVuZG8gICAgICAgICAgICAgIyB1bmRvZGVsZWdhdG9yCisgIFJlZG8gICAgICAgICAgICAgIyB1bmRvZGVsZWdhdG9yCisgIC0tLSAgICAgICAgICAgICAgIyBlRVcucmlnaHRfbWVudV9ldmVudAorICBDdXQgICAgICAgICAgICAgICMgZUVXLmN1dAorICBDb3B5ICAgICAgICAgICAgICMgZUVXLmNvcHkKKyAgUGFzdGUgICAgICAgICAgICAjIGVFVy5wYXN0CisgIFNlbGVjdCBBbGwgICAgICAgIyBlRVcuc2VsZWN0X2FsbCAoKyBzZWUgZUVXLnJlbW92ZV9zZWxlY3Rpb24pCisgIC0tLSAgICAgICAgICAgICAgIyBOZXh0IDUgaXRlbXMgdXNlIHNlYXJjaGVuZ2luZTsgZGlhbG9ncyB1c2Ugc2VhcmNoYmFzZQorICBGaW5kICAgICAgICAgICAgICMgZUVXLmZpbmRfZXZlbnQsIHNlYXJjaC5TZWFyY2hEaWFsb2cuZmluZAorICBGaW5kIEFnYWluICAgICAgICMgZUVXLmZpbmRfYWdhaW5fZXZlbnQsIHNTRC5maW5kX2FnYWluCisgIEZpbmQgU2VsZWN0aW9uICAgIyBlRVcuZmluZF9zZWxlY3Rpb25fZXZlbnQsIHNTRC5maW5kX3NlbGVjdGlvbgorICBGaW5kIGluIEZpbGVzLi4uICMgZUVXLmZpbmRfaW5fZmlsZXNfZXZlbnQsIGdyZXAKKyAgUmVwbGFjZS4uLiAgICAgICAjIGVFVy5yZXBsYWNlX2V2ZW50LCByZXBsYWNlLlJlcGxhY2VEaWFsb2cucmVwbGFjZQorICBHbyB0byBMaW5lICAgICAgICMgZUVXLmdvdG9fbGluZV9ldmVudAorICBTaG93IENvbXBsZXRpb25zICMgYXV0b2NvbXBsZXRlIGV4dGVuc2lvbiBhbmQgYXV0b2NvbXBsZXRlV2lkb3cgKCZIUCkKKyAgRXhwYW5kIFdvcmQgICAgICAjIGF1dG9leHBhbmQgZXh0ZW5zaW9uCisgIFNob3cgY2FsbCB0aXAgICAgIyBDYWxsdGlwcyBleHRlbnNpb24gYW5kIENhbGx0aXBXaW5kb3cgKCYgSHlwZXJwYXJzZXIpCisgIFNob3cgc3Vycm91bmRpbmcgcGFyZW5zICAjIHBhcmVubWF0Y2ggKCYgSHlwZXJwYXJzZXIpCiAKLVNoZWxsICAjIFB5U2hlbGwKLSAgVmlldyBMYXN0IFJlc3RhcnQgICMgUHlTaGVsbC4/Ci0gIFJlc3RhcnQgU2hlbGwgICMgUHlTaGVsbC4/CitTaGVsbCAgIyBweXNoZWxsCisgIFZpZXcgTGFzdCBSZXN0YXJ0IyBweXNoZWxsLj8KKyAgUmVzdGFydCBTaGVsbCAgICAjIHB5c2hlbGwuPwogCiBEZWJ1ZyAoU2hlbGwgb25seSkKICAgR28gdG8gRmlsZS9MaW5lCi0gIERlYnVnZ2VyICAjIERlYnVnZ2VyLCBSZW1vdGVEZWJ1Z2dlcgotICBTdGFjayBWaWV3ZXIgICMgU3RhY2tWaWV3ZXIKLSAgQXV0by1vcGVuIFN0YWNrIFZpZXdlciAgIyBTdGFja1ZpZXdlcgorICBkZWJ1Z2dlciAgICAgICAgICMgZGVidWdnZXIsIGRlYnVnZ2VyX3IKKyAgU3RhY2sgVmlld2VyICAgICAjIHN0YWNrdmlld2VyCisgIEF1dG8tb3BlbiBTdGFjayBWaWV3ZXIgICMgc3RhY2t2aWV3ZXIKIAogRm9ybWF0IChFZGl0b3Igb25seSkKLSAgSW5kZW50IFJlZ2lvbgotICBEZWRlbnQgUmVnaW9uCi0gIENvbW1lbnQgT3V0IFJlZ2lvbgotICBVbmNvbW1lbnQgUmVnaW9uCi0gIFRhYmlmeSBSZWdpb24KLSAgVW50YWJpZnkgUmVnaW9uCi0gIFRvZ2dsZSBUYWJzCi0gIE5ldyBJbmRlbnQgV2lkdGgKLSAgRm9ybWF0IFBhcmFncmFwaCAgIyBGb3JtYXRQYXJhZ3JhcGggZXh0ZW5zaW9uCisgIEluZGVudCBSZWdpb24gICAgIyBlRVcuaW5kZW50X3JlZ2lvbl9ldmVudAorICBEZWRlbnQgUmVnaW9uICAgICMgZUVXLmRlZGVudF9yZWdpb25fZXZlbnQKKyAgQ29tbWVudCBPdXQgUmVnLiAjIGVFVy5jb21tZW50X3JlZ2lvbl9ldmVudAorICBVbmNvbW1lbnQgUmVnaW9uICMgZUVXLnVuY29tbWVudF9yZWdpb25fZXZlbnQKKyAgVGFiaWZ5IFJlZ2lvbiAgICAjIGVFVy50YWJpZnlfcmVnaW9uX2V2ZW50CisgIFVudGFiaWZ5IFJlZ2lvbiAgIyBlRVcudW50YWJpZnlfcmVnaW9uX2V2ZW50CisgIFRvZ2dsZSBUYWJzICAgICAgIyBlRVcudG9nZ2xlX3RhYnNfZXZlbnQKKyAgTmV3IEluZGVudCBXaWR0aCAjIGVFVy5jaGFuZ2VfaW5kZW50d2lkdGhfZXZlbnQKKyAgRm9ybWF0IFBhcmFncmFwaCAjIHBhcmFncmFwaCBleHRlbnNpb24KICAgLS0tCi0gIFN0cmlwIHRhaWxpbmcgd2hpdGVzcGFjZSAgIyBSc3RyaXBFeHRlbnNpb24gZXh0ZW5zaW9uCisgIFN0cmlwIHRhaWxpbmcgd2hpdGVzcGFjZSAgIyByc3RyaXAgZXh0ZW5zaW9uCiAKIFJ1biAoRWRpdG9yIG9ubHkpCi0gIFB5dGhvbiBTaGVsbCAgIyBQeVNoZWxsCisgIFB5dGhvbiBTaGVsbCAgICAgIyBweXNoZWxsCiAgIC0tLQotICBDaGVjayBNb2R1bGUgICMgU2NyaXB0QmluZGluZwotICBSdW4gTW9kdWxlICAjIFNjcmlwdEJpbmRpbmcKKyAgQ2hlY2sgTW9kdWxlICAgICAjIHJ1bnNjcmlwdAorICBSdW4gTW9kdWxlICAgICAgICMgcnVuc2NyaXB0CiAKIE9wdGlvbnMKLSAgQ29uZmlndXJlIElETEUgICMgY29uZmlnRGlhbG9nCisgIENvbmZpZ3VyZSBJRExFICAgIyBlRVcuY29uZmlnX2RpYWxvZywgY29uZmlnZGlhbG9nCiAgICAgKHRhYnMgaW4gdGhlIGRpYWxvZykKLSAgICBGb250IHRhYiAgIyBvbmZpZy1tYWluLmRlZgotICAgIEhpZ2hsaWdodCB0YWIgICMgY29uZmlnU2VjdGlvbk5hbWVEaWFsb2csIGNvbmZpZy1oaWdobGlnaHQuZGVmCi0gICAgS2V5cyB0YWIgICMga2V5YmluZGluZ0RpYWxvZywgY29uZmlnU2VjdGlvbk5hbWVEaWFsb2csIG9uZmlnLWtldXMuZGVmCi0gICAgR2VuZXJhbCB0YWIgICMgY29uZmlnSGVscFNvdXJjZUVkaXQsIGNvbmZpZy1tYWluLmRlZgotICBDb25maWd1cmUgRXh0ZW5zaW9ucyAgIyBjb25maWdEaWFsb2cKLSAgICBYeXogdGFiICAjIHh5ei5weSwgY29uZmlnLWV4dGVuc2lvbnMuZGVmCisgICAgRm9udCB0YWIgICAgICAgIyBjb25maWctbWFpbi5kZWYKKyAgICBIaWdobGlnaHQgdGFiICAjIHF1ZXJ5LCBjb25maWctaGlnaGxpZ2h0LmRlZgorICAgIEtleXMgdGFiICAgICAgICMgcXVlcnksIGNvbmZpZ19rZXksIGNvbmZpZ19rZXlzLmRlZgorICAgIEdlbmVyYWwgdGFiICAgICMgY29uZmlnX2hlbHAsIGNvbmZpZy1tYWluLmRlZgorICAgIEV4dGVuc2lvbnMgdGFiICMgY29uZmlnLWV4dGVuc2lvbnMuZGVmLCBjb3JyZXNwb25kaW5nIC5weQogICAtLS0KLSAgQ29kZSBDb250ZXh0IChlZGl0b3Igb25seSkgICMgQ29kZUNvbnRleHQgZXh0ZW5zaW9uCisgIENvZGUgQ29udGV4dCAoZWQpIyBjb2RlY29udGV4dCBleHRlbnNpb24KIAogV2luZG93Ci0gIFpvb21oZWlnaHQgICMgWm9vbUhlaWdodCBleHRlbnNpb24KKyAgWm9vbWhlaWdodCAgICAgICAjIHpvb21oZWlnaHQgZXh0ZW5zaW9uCiAgIC0tLQotICA8b3BlbiB3aW5kb3dzPiAgIyBXaW5kb3dMaXN0CisgIDxvcGVuIHdpbmRvd3M+ICAgIyB3aW5kb3dzCiAKIEhlbHAKLSAgQWJvdXQgSURMRSAgIyBhYm91dERpYWxvZworICBBYm91dCBJRExFICAgICAgICMgZUVXLmFib3V0X2RpYWxvZywgaGVscF9hYm91dC5BYm91dERpYWxvZyAKICAgLS0tCi0gIElETEUgSGVscCAgIyBoZWxwCi0gIFB5dGhvbiBEb2MKLSAgVHVydGxlIERlbW8KKyAgSURMRSBIZWxwICAgICAgICAjIGVFVy5oZWxwX2RpYWxvZywgaGVscHNob3dfaWRsZWhlbHAKKyAgUHl0aG9uIERvYyAgICAgICAjIGVFVy5weXRob25fZG9jcworICBUdXJ0bGUgRGVtbyAgICAgICMgZUVXLm9wZW5fdHVydGxlX2RlbW8KICAgLS0tCiAgIDxvdGhlciBoZWxwIHNvdXJjZXM+CiAKIDxDb250ZXh0IE1lbnU+IChyaWdodCBjbGljaykKLURlZmluZWQgaW4gRWRpdG9yV2luZG93LCBQeVNoZWxsLCBPdXRwdXQKLSAgIEN1dAotICAgQ29weQotICAgUGFzdGUKLSAgIC0tLQotICAgR28gdG8gZmlsZS9saW5lIChzaGVsbCBhbmQgb3V0cHV0IG9ubHkpCi0gICBTZXQgQnJlYWtwb2ludCAoZWRpdG9yIG9ubHkpCi0gICBDbGVhciBCcmVha3BvaW50IChlZGl0b3Igb25seSkKLSBEZWZpbmVkIGluIERlYnVnZ2VyCi0gICBHbyB0byBzb3VyY2UgbGluZQotICAgU2hvdyBzdGFjayBmcmFtZQorICBEZWZpbmVkIGluIGVkaXRvciwgUHlTaGVscHlzaGVsbHV0CisgICAgQ3V0CisgICAgQ29weQorICAgIFBhc3RlCisgICAgLS0tCisgICAgR28gdG8gZmlsZS9saW5lIChzaGVsbCBhbmQgb3V0cHV0IG9ubHkpCisgICAgU2V0IEJyZWFrcG9pbnQgKGVkaXRvciBvbmx5KQorICAgIENsZWFyIEJyZWFrcG9pbnQgKGVkaXRvciBvbmx5KQorICBEZWZpbmVkIGluIGRlYnVnZ2VyCisgICAgR28gdG8gc291cmNlIGxpbmUKKyAgICBTaG93IHN0YWNrIGZyYW1lCisKKzxObyBtZW51PgorQ2VudGVyIEluc2VydCAgICAgICMgZUVXLmNlbnRlcl9pbnNlcnRfZXZlbnQKKyAgIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvX19pbml0X18ucHkgYi9MaWIvaWRsZWxpYi9fX2luaXRfXy5weQppbmRleCA3MTFmNjFiLi43OTFkZGVhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9fX2luaXRfXy5weQorKysgYi9MaWIvaWRsZWxpYi9fX2luaXRfXy5weQpAQCAtMSw4ICsxLDEwIEBACiAiIiJUaGUgaWRsZWxpYiBwYWNrYWdlIGltcGxlbWVudHMgdGhlIElkbGUgYXBwbGljYXRpb24uCiAKIElkbGUgaW5jbHVkZXMgYW4gaW50ZXJhY3RpdmUgc2hlbGwgYW5kIGVkaXRvci4KK1N0YXJ0aW5nIHdpdGggUHl0aG9uIDMuNiwgSURMRSByZXF1aXJlcyB0Y2wvdGsgOC41IG9yIGxhdGVyLgogVXNlIHRoZSBmaWxlcyBuYW1lZCBpZGxlLiogdG8gc3RhcnQgSWRsZS4KIAogVGhlIG90aGVyIGZpbGVzIGFyZSBwcml2YXRlIGltcGxlbWVudGF0aW9ucy4gIFRoZWlyIGRldGFpbHMgYXJlIHN1YmplY3QgdG8KIGNoYW5nZS4gIFNlZSBQRVAgNDM0IGZvciBtb3JlLiAgSW1wb3J0IHRoZW0gYXQgeW91ciBvd24gcmlzay4KICIiIgordGVzdGluZyA9IEZhbHNlICAjIFNldCBUcnVlIGJ5IHRlc3QudGVzdF9pZGxlLgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvX19tYWluX18ucHkgYi9MaWIvaWRsZWxpYi9fX21haW5fXy5weQppbmRleCAyZWRmNWY3Li42MzQ5ZWM3IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9fX21haW5fXy5weQorKysgYi9MaWIvaWRsZWxpYi9fX21haW5fXy5weQpAQCAtMyw2ICszLDYgQEAKIAogUnVuIElETEUgYXMgcHl0aG9uIC1tIGlkbGVsaWIKICIiIgotaW1wb3J0IGlkbGVsaWIuUHlTaGVsbAotaWRsZWxpYi5QeVNoZWxsLm1haW4oKQoraW1wb3J0IGlkbGVsaWIucHlzaGVsbAoraWRsZWxpYi5weXNoZWxsLm1haW4oKQogIyBUaGlzIGZpbGUgZG9lcyBub3Qgd29yayBmb3IgMi43OyBTZWUgaXNzdWUgMjQyMTIuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkgYi9MaWIvaWRsZWxpYi9hdXRvY29tcGxldGUucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9hdXRvY29tcGxldGUucHkKaW5kZXggZmYwODVkNS4uNWJhOGRjNSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5CisrKyBiL0xpYi9pZGxlbGliL2F1dG9jb21wbGV0ZS5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIkF1dG9Db21wbGV0ZS5weSAtIEFuIElETEUgZXh0ZW5zaW9uIGZvciBhdXRvbWF0aWNhbGx5IGNvbXBsZXRpbmcgbmFtZXMuCisiIiJhdXRvY29tcGxldGUucHkgLSBBbiBJRExFIGV4dGVuc2lvbiBmb3IgYXV0b21hdGljYWxseSBjb21wbGV0aW5nIG5hbWVzLgogCiBUaGlzIGV4dGVuc2lvbiBjYW4gY29tcGxldGUgZWl0aGVyIGF0dHJpYnV0ZSBuYW1lcyBvciBmaWxlIG5hbWVzLiBJdCBjYW4gcG9wCiBhIHdpbmRvdyB3aXRoIGFsbCBhdmFpbGFibGUgbmFtZXMsIGZvciB0aGUgdXNlciB0byBzZWxlY3QgZnJvbS4KQEAgLTcsNyArNyw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgc3RyaW5nCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogIyBUaGlzIHN0cmluZyBpbmNsdWRlcyBhbGwgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYW4gaWRlbnRpZmllcgogSURfQ0hBUlMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAiXyIKQEAgLTE1LDggKzE1LDggQEAKICMgVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjb21wbGV0aW9ucwogQ09NUExFVEVfQVRUUklCVVRFUywgQ09NUExFVEVfRklMRVMgPSByYW5nZSgxLCAyKzEpCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgQXV0b0NvbXBsZXRlV2luZG93Ci1mcm9tIGlkbGVsaWIuSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IGF1dG9jb21wbGV0ZV93Citmcm9tIGlkbGVsaWIuaHlwZXJwYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCiAKIGltcG9ydCBfX21haW5fXwogCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pbmRleCA9IE5vbmUKIAogICAgIGRlZiBfbWFrZV9hdXRvY29tcGxldGVfd2luZG93KHNlbGYpOgotICAgICAgICByZXR1cm4gQXV0b0NvbXBsZXRlV2luZG93LkF1dG9Db21wbGV0ZVdpbmRvdyhzZWxmLnRleHQpCisgICAgICAgIHJldHVybiBhdXRvY29tcGxldGVfdy5BdXRvQ29tcGxldGVXaW5kb3coc2VsZi50ZXh0KQogCiAgICAgZGVmIF9yZW1vdmVfYXV0b2NvbXBsZXRlX3dpbmRvdyhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgaWYgc2VsZi5hdXRvY29tcGxldGV3aW5kb3c6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9hdXRvY29tcGxldGVfdy5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2F1dG9jb21wbGV0ZV93LnB5CmluZGV4IDJlZTY4NzguLjM4Zjg2MDEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weQorKysgYi9MaWIvaWRsZWxpYi9hdXRvY29tcGxldGVfdy5weQpAQCAtMSw5ICsxLDEwIEBACiAiIiIKLUFuIGF1dG8tY29tcGxldGlvbiB3aW5kb3cgZm9yIElETEUsIHVzZWQgYnkgdGhlIEF1dG9Db21wbGV0ZSBleHRlbnNpb24KK0FuIGF1dG8tY29tcGxldGlvbiB3aW5kb3cgZm9yIElETEUsIHVzZWQgYnkgdGhlIGF1dG9jb21wbGV0ZSBleHRlbnNpb24KICIiIgogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIuTXVsdGlDYWxsIGltcG9ydCBNQ19TSElGVAotZnJvbSBpZGxlbGliLkF1dG9Db21wbGV0ZSBpbXBvcnQgQ09NUExFVEVfRklMRVMsIENPTVBMRVRFX0FUVFJJQlVURVMKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgorZnJvbSBpZGxlbGliLm11bHRpY2FsbCBpbXBvcnQgTUNfU0hJRlQKK2Zyb20gaWRsZWxpYi5hdXRvY29tcGxldGUgaW1wb3J0IENPTVBMRVRFX0ZJTEVTLCBDT01QTEVURV9BVFRSSUJVVEVTCiAKIEhJREVfVklSVFVBTF9FVkVOVF9OQU1FID0gIjw8YXV0b2NvbXBsZXRld2luZG93LWhpZGU+PiIKIEhJREVfU0VRVUVOQ0VTID0gKCI8Rm9jdXNPdXQ+IiwgIjxCdXR0b25QcmVzcz4iKQpAQCAtMzQsOCArMzUsOCBAQAogICAgICAgICBzZWxmLmNvbXBsZXRpb25zID0gTm9uZQogICAgICAgICAjIEEgbGlzdCB3aXRoIG1vcmUgY29tcGxldGlvbnMsIG9yIE5vbmUKICAgICAgICAgc2VsZi5tb3JlY29tcGxldGlvbnMgPSBOb25lCi0gICAgICAgICMgVGhlIGNvbXBsZXRpb24gbW9kZS4gRWl0aGVyIEF1dG9Db21wbGV0ZS5DT01QTEVURV9BVFRSSUJVVEVTIG9yCi0gICAgICAgICMgQXV0b0NvbXBsZXRlLkNPTVBMRVRFX0ZJTEVTCisgICAgICAgICMgVGhlIGNvbXBsZXRpb24gbW9kZS4gRWl0aGVyIGF1dG9jb21wbGV0ZS5DT01QTEVURV9BVFRSSUJVVEVTIG9yCisgICAgICAgICMgYXV0b2NvbXBsZXRlLkNPTVBMRVRFX0ZJTEVTCiAgICAgICAgIHNlbGYubW9kZSA9IE5vbmUKICAgICAgICAgIyBUaGUgY3VycmVudCBjb21wbGV0aW9uIHN0YXJ0LCBvbiB0aGUgdGV4dCBib3ggKGEgc3RyaW5nKQogICAgICAgICBzZWxmLnN0YXJ0ID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQXV0b0V4cGFuZC5weSBiL0xpYi9pZGxlbGliL2F1dG9leHBhbmQucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0F1dG9FeHBhbmQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2F1dG9leHBhbmQucHkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NsYXNzQnJvd3Nlci5weSBiL0xpYi9pZGxlbGliL2Jyb3dzZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9icm93c2VyLnB5CmluZGV4IGQwOWM1MmYuLjk5NjgzMzMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NsYXNzQnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9icm93c2VyLnB5CkBAIC0xNCwxMyArMTQsMTMgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBweWNsYnIKIAotZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCi1mcm9tIGlkbGVsaWIuV2luZG93TGlzdCBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKLWZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlzaGVsbAorZnJvbSBpZGxlbGliLndpbmRvd3MgaW1wb3J0IExpc3RlZFRvcGxldmVsCitmcm9tIGlkbGVsaWIudHJlZSBpbXBvcnQgVHJlZU5vZGUsIFRyZWVJdGVtLCBTY3JvbGxlZENhbnZhcworZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogZmlsZV9vcGVuID0gTm9uZSAgIyBNZXRob2QuLi5JdGVtIGFuZCBDbGFzcy4uLkl0ZW0gdXNlIHRoaXMuCi0jIE5vcm1hbGx5IFB5U2hlbGwuZmxpc3Qub3BlbiwgYnV0IHRoZXJlIGlzIG5vIFB5U2hlbGwuZmxpc3QgZm9yIGh0ZXN0LgorIyBOb3JtYWxseSBweXNoZWxsLmZsaXN0Lm9wZW4sIGJ1dCB0aGVyZSBpcyBubyBweXNoZWxsLmZsaXN0IGZvciBodGVzdC4KIAogY2xhc3MgQ2xhc3NCcm93c2VyOgogCkBAIC0zMiw3ICszMiw3IEBACiAgICAgICAgICIiIgogICAgICAgICBnbG9iYWwgZmlsZV9vcGVuCiAgICAgICAgIGlmIG5vdCBfaHRlc3Q6Ci0gICAgICAgICAgICBmaWxlX29wZW4gPSBQeVNoZWxsLmZsaXN0Lm9wZW4KKyAgICAgICAgICAgIGZpbGVfb3BlbiA9IHB5c2hlbGwuZmxpc3Qub3BlbgogICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgIHNlbGYuZmlsZSA9IG9zLnBhdGguam9pbihwYXRoWzBdLCBzZWxmLm5hbWUgKyAiLnB5IikKICAgICAgICAgc2VsZi5faHRlc3QgPSBfaHRlc3QKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlKToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBQeVNoZWxsLmZsaXN0Lm9wZW4oc2VsZi5maWxlKQorICAgICAgICBweXNoZWxsLmZsaXN0Lm9wZW4oc2VsZi5maWxlKQogCiAgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKICAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uoc2VsZi5maWxlWy0zOl0pID09ICIucHkiCkBAIC0yMjYsNyArMjI2LDcgQEAKICAgICAgICAgICAgIGZpbGUgPSBzeXMuYXJndlswXQogICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQoZmlsZSkKICAgICBuYW1lID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKVswXQotICAgIGZsaXN0ID0gUHlTaGVsbC5QeVNoZWxsRmlsZUxpc3QocGFyZW50KQorICAgIGZsaXN0ID0gcHlzaGVsbC5QeVNoZWxsRmlsZUxpc3QocGFyZW50KQogICAgIGdsb2JhbCBmaWxlX29wZW4KICAgICBmaWxlX29wZW4gPSBmbGlzdC5vcGVuCiAgICAgQ2xhc3NCcm93c2VyKGZsaXN0LCBuYW1lLCBbZGlyXSwgX2h0ZXN0PVRydWUpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5IGIvTGliL2lkbGVsaWIvY2FsbHRpcF93LnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NhbGx0aXBfdy5weQppbmRleCA4ZTY4YTc2Li5iM2MzZTVlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5CisrKyBiL0xpYi9pZGxlbGliL2NhbGx0aXBfdy5weQpAQCAtMSw3ICsxLDcgQEAKICIiIkEgQ2FsbFRpcCB3aW5kb3cgY2xhc3MgZm9yIFRraW50ZXIvSURMRS4KIAotQWZ0ZXIgVG9vbFRpcC5weSwgd2hpY2ggdXNlcyBpZGVhcyBnbGVhbmVkIGZyb20gUHlTb2wKLVVzZWQgYnkgdGhlIENhbGxUaXBzIElETEUgZXh0ZW5zaW9uLgorQWZ0ZXIgdG9vbHRpcC5weSwgd2hpY2ggdXNlcyBpZGVhcyBnbGVhbmVkIGZyb20gUHlTb2wKK1VzZWQgYnkgdGhlIGNhbGx0aXBzIElETEUgZXh0ZW5zaW9uLgogIiIiCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBMYWJlbCwgTEVGVCwgU09MSUQsIFRjbEVycm9yCiAKQEAgLTEzOCw4ICsxMzgsOCBAQAogCiAgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQogICAgIHRvcC50aXRsZSgiVGVzdCBjYWxsdGlwcyIpCi0gICAgdG9wLmdlb21ldHJ5KCIyMDB4MTAwKyVkKyVkIiAlIChwYXJlbnQud2luZm9fcm9vdHgoKSArIDIwMCwKLSAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsgMTUwKSkKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgdG9wLmdlb21ldHJ5KCIyMDB4MTAwKyVkKyVkIiAlICh4ICsgMjUwLCB5ICsgMTc1KSkKICAgICB0ZXh0ID0gVGV4dCh0b3ApCiAgICAgdGV4dC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgInN0cmluZy5zcGxpdCIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9DYWxsVGlwcy5weSBiL0xpYi9pZGxlbGliL2NhbGx0aXBzLnB5CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0NhbGxUaXBzLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9jYWxsdGlwcy5weQppbmRleCA4MWJkNWYxLi4zYTliMWM2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DYWxsVGlwcy5weQorKysgYi9MaWIvaWRsZWxpYi9jYWxsdGlwcy5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIkNhbGxUaXBzLnB5IC0gQW4gSURMRSBFeHRlbnNpb24gdG8gSm9nIFlvdXIgTWVtb3J5CisiIiJjYWxsdGlwcy5weSAtIEFuIElETEUgRXh0ZW5zaW9uIHRvIEpvZyBZb3VyIE1lbW9yeQogCiBDYWxsIFRpcHMgYXJlIGZsb2F0aW5nIHdpbmRvd3Mgd2hpY2ggZGlzcGxheSBmdW5jdGlvbiwgY2xhc3MsIGFuZCBtZXRob2QKIHBhcmFtZXRlciBhbmQgZG9jc3RyaW5nIGluZm9ybWF0aW9uIHdoZW4geW91IHR5cGUgYW4gb3BlbmluZyBwYXJlbnRoZXNpcywgYW5kCkBAIC0xMiw4ICsxMiw4IEBACiBpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB0eXBlcwogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IENhbGxUaXBXaW5kb3cKLWZyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY2FsbHRpcF93Citmcm9tIGlkbGVsaWIuaHlwZXJwYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCiAKIGNsYXNzIENhbGxUaXBzOgogCkBAIC0zNyw3ICszNyw3IEBACiAKICAgICBkZWYgX21ha2VfdGtfY2FsbHRpcF93aW5kb3coc2VsZik6CiAgICAgICAgICMgU2VlIF9faW5pdF9fIGZvciB1c2FnZQotICAgICAgICByZXR1cm4gQ2FsbFRpcFdpbmRvdy5DYWxsVGlwKHNlbGYudGV4dCkKKyAgICAgICAgcmV0dXJuIGNhbGx0aXBfdy5DYWxsVGlwKHNlbGYudGV4dCkKIAogICAgIGRlZiBfcmVtb3ZlX2NhbGx0aXBfd2luZG93KHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgICBpZiBzZWxmLmFjdGl2ZV9jYWxsdGlwOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkgYi9MaWIvaWRsZWxpYi9jb2RlY29udGV4dC5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9Db2RlQ29udGV4dC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvY29kZWNvbnRleHQucHkKaW5kZXggN2QyNWFkYS4uMmEyMWExZiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkKKysrIGIvTGliL2lkbGVsaWIvY29kZWNvbnRleHQucHkKQEAgLTEsMTEgKzEsMTEgQEAKLSIiIkNvZGVDb250ZXh0IC0gRXh0ZW5zaW9uIHRvIGRpc3BsYXkgdGhlIGJsb2NrIGNvbnRleHQgYWJvdmUgdGhlIGVkaXQgd2luZG93CisiIiJjb2RlY29udGV4dCAtIEV4dGVuc2lvbiB0byBkaXNwbGF5IHRoZSBibG9jayBjb250ZXh0IGFib3ZlIHRoZSBlZGl0IHdpbmRvdwogCiBPbmNlIGNvZGUgaGFzIHNjcm9sbGVkIG9mZiB0aGUgdG9wIG9mIGEgd2luZG93LCBpdCBjYW4gYmUgZGlmZmljdWx0IHRvCiBkZXRlcm1pbmUgd2hpY2ggYmxvY2sgeW91IGFyZSBpbi4gIFRoaXMgZXh0ZW5zaW9uIGltcGxlbWVudHMgYSBwYW5lIGF0IHRoZSB0b3AKIG9mIGVhY2ggSURMRSBlZGl0IHdpbmRvdyB3aGljaCBwcm92aWRlcyBibG9jayBzdHJ1Y3R1cmUgaGludHMuICBUaGVzZSBoaW50cyBhcmUKIHRoZSBsaW5lcyB3aGljaCBjb250YWluIHRoZSBibG9jayBvcGVuaW5nIGtleXdvcmRzLCBlLmcuICdpZicsIGZvciB0aGUKIGVuY2xvc2luZyBibG9jay4gIFRoZSBudW1iZXIgb2YgaGludCBsaW5lcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBudW1saW5lcwotdmFyaWFibGUgaW4gdGhlIENvZGVDb250ZXh0IHNlY3Rpb24gb2YgY29uZmlnLWV4dGVuc2lvbnMuZGVmLiBMaW5lcyB3aGljaCBkbwordmFyaWFibGUgaW4gdGhlIGNvZGVjb250ZXh0IHNlY3Rpb24gb2YgY29uZmlnLWV4dGVuc2lvbnMuZGVmLiBMaW5lcyB3aGljaCBkbwogbm90IG9wZW4gYmxvY2tzIGFyZSBub3Qgc2hvd24gaW4gdGhlIGNvbnRleHQgaGludHMgcGFuZS4KIAogIiIiCkBAIC0xMyw3ICsxMyw3IEBACiBmcm9tIHRraW50ZXIuY29uc3RhbnRzIGltcG9ydCBUT1AsIExFRlQsIFgsIFcsIFNVTktFTgogaW1wb3J0IHJlCiBmcm9tIHN5cyBpbXBvcnQgbWF4c2l6ZSBhcyBJTkZJTklUWQotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiBCTE9DS09QRU5FUlMgPSB7ImNsYXNzIiwgImRlZiIsICJlbGlmIiwgImVsc2UiLCAiZXhjZXB0IiwgImZpbmFsbHkiLCAiZm9yIiwKICAgICAgICAgICAgICAgICAgICAgImlmIiwgInRyeSIsICJ3aGlsZSIsICJ3aXRoIn0KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvY29sb3JpemVyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9jb2xvcml6ZXIucHkKaW5kZXggMDJlYWM0Ny4uZjVkZDAzZCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvY29sb3JpemVyLnB5CkBAIC0yLDkgKzIsOCBAQAogaW1wb3J0IHJlCiBpbXBvcnQga2V5d29yZAogaW1wb3J0IGJ1aWx0aW5zCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrVmVyc2lvbgotZnJvbSBpZGxlbGliLkRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5kZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogREVCVUcgPSBGYWxzZQogCkBAIC00OSwxMSArNDgsOCBAQAogICAgICAgICBpbnNlcnRiYWNrZ3JvdW5kPWN1cnNvcl9jb2xvciwKICAgICAgICAgc2VsZWN0Zm9yZWdyb3VuZD1zZWxlY3RfY29sb3JzWydmb3JlZ3JvdW5kJ10sCiAgICAgICAgIHNlbGVjdGJhY2tncm91bmQ9c2VsZWN0X2NvbG9yc1snYmFja2dyb3VuZCddLAotICAgICAgICApCi0gICAgaWYgVGtWZXJzaW9uID49IDguNToKLSAgICAgICAgdGV4dC5jb25maWcoCi0gICAgICAgICAgICBpbmFjdGl2ZXNlbGVjdGJhY2tncm91bmQ9c2VsZWN0X2NvbG9yc1snYmFja2dyb3VuZCddKQotCisgICAgICAgIGluYWN0aXZlc2VsZWN0YmFja2dyb3VuZD1zZWxlY3RfY29sb3JzWydiYWNrZ3JvdW5kJ10sICAjIG5ldyBpbiA4LjUKKyAgICApCiAKIGNsYXNzIENvbG9yRGVsZWdhdG9yKERlbGVnYXRvcik6CiAKQEAgLTI1OSwxMiArMjU1LDEyIEBACiAKIGRlZiBfY29sb3JfZGVsZWdhdG9yKHBhcmVudCk6ICAjIGh0ZXN0ICMKICAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0Ci0gICAgZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKKyAgICBmcm9tIGlkbGVsaWIucGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgogCiAgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQogICAgIHRvcC50aXRsZSgiVGVzdCBDb2xvckRlbGVnYXRvciIpCi0gICAgdG9wLmdlb21ldHJ5KCIyMDB4MTAwKyVkKyVkIiAlIChwYXJlbnQud2luZm9fcm9vdHgoKSArIDIwMCwKLSAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsgMTUwKSkKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgdG9wLmdlb21ldHJ5KCIyMDB4MTAwKyVkKyVkIiAlICh4ICsgMjUwLCB5ICsgMTc1KSkKICAgICBzb3VyY2UgPSAiaWYgc29tZW5hbWU6IHggPSAnYWJjJyAjIGNvbW1lbnRcbnByaW50XG4iCiAgICAgdGV4dCA9IFRleHQodG9wLCBiYWNrZ3JvdW5kPSJ3aGl0ZSIpCiAgICAgdGV4dC5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKQEAgLTI3Nyw1ICsyNzMsOSBAQAogICAgIHAuaW5zZXJ0ZmlsdGVyKGQpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9jb2xvcml6ZXInLAorICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX2NvbG9yX2RlbGVnYXRvcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZiBiL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgppbmRleCAzYmZjYjY5Li42NDc4OGY5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKKysrIGIvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmCkBAIC0xMDksNiArMTA5LDU3IEBACiBkZWwtd29yZC1sZWZ0PTxBbHQtS2V5LUJhY2tTcGFjZT4KIGRlbC13b3JkLXJpZ2h0PTxBbHQtS2V5LWQ+CiAKK1tJRExFIE1vZGVybiBVbml4XQorY29weSA9IDxDb250cm9sLVNoaWZ0LUtleS1DPiA8Q29udHJvbC1LZXktSW5zZXJ0PgorY3V0ID0gPENvbnRyb2wtS2V5LXg+IDxTaGlmdC1LZXktRGVsZXRlPgorcGFzdGUgPSA8Q29udHJvbC1LZXktdj4gPFNoaWZ0LUtleS1JbnNlcnQ+CitiZWdpbm5pbmctb2YtbGluZSA9IDxLZXktSG9tZT4KK2NlbnRlci1pbnNlcnQgPSA8Q29udHJvbC1LZXktbD4KK2Nsb3NlLWFsbC13aW5kb3dzID0gPENvbnRyb2wtS2V5LXE+CitjbG9zZS13aW5kb3cgPSA8Q29udHJvbC1LZXktdz4gPENvbnRyb2wtU2hpZnQtS2V5LVc+Citkby1ub3RoaW5nID0gPENvbnRyb2wtS2V5LUYxMj4KK2VuZC1vZi1maWxlID0gPENvbnRyb2wtS2V5LWQ+CitoaXN0b3J5LW5leHQgPSA8QWx0LUtleS1uPiA8TWV0YS1LZXktbj4KK2hpc3RvcnktcHJldmlvdXMgPSA8QWx0LUtleS1wPiA8TWV0YS1LZXktcD4KK2ludGVycnVwdC1leGVjdXRpb24gPSA8Q29udHJvbC1LZXktYz4KK3ZpZXctcmVzdGFydCA9IDxLZXktRjY+CityZXN0YXJ0LXNoZWxsID0gPENvbnRyb2wtS2V5LUY2Pgorb3Blbi1jbGFzcy1icm93c2VyID0gPENvbnRyb2wtS2V5LWI+CitvcGVuLW1vZHVsZSA9IDxDb250cm9sLUtleS1tPgorb3Blbi1uZXctd2luZG93ID0gPENvbnRyb2wtS2V5LW4+CitvcGVuLXdpbmRvdy1mcm9tLWZpbGUgPSA8Q29udHJvbC1LZXktbz4KK3BsYWluLW5ld2xpbmUtYW5kLWluZGVudCA9IDxDb250cm9sLUtleS1qPgorcHJpbnQtd2luZG93ID0gPENvbnRyb2wtS2V5LXA+CitweXRob24tY29udGV4dC1oZWxwID0gPFNoaWZ0LUtleS1GMT4KK3B5dGhvbi1kb2NzID0gPEtleS1GMT4KK3JlZG8gPSA8Q29udHJvbC1TaGlmdC1LZXktWj4KK3JlbW92ZS1zZWxlY3Rpb24gPSA8S2V5LUVzY2FwZT4KK3NhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZSA9IDxBbHQtU2hpZnQtS2V5LVM+CitzYXZlLXdpbmRvdy1hcy1maWxlID0gPENvbnRyb2wtU2hpZnQtS2V5LVM+CitzYXZlLXdpbmRvdyA9IDxDb250cm9sLUtleS1zPgorc2VsZWN0LWFsbCA9IDxDb250cm9sLUtleS1hPgordG9nZ2xlLWF1dG8tY29sb3JpbmcgPSA8Q29udHJvbC1LZXktc2xhc2g+Cit1bmRvID0gPENvbnRyb2wtS2V5LXo+CitmaW5kID0gPENvbnRyb2wtS2V5LWY+CitmaW5kLWFnYWluID0gPEtleS1GMz4KK2ZpbmQtaW4tZmlsZXMgPSA8Q29udHJvbC1TaGlmdC1LZXktZj4KK2ZpbmQtc2VsZWN0aW9uID0gPENvbnRyb2wtS2V5LWg+CityZXBsYWNlID0gPENvbnRyb2wtS2V5LXI+Citnb3RvLWxpbmUgPSA8Q29udHJvbC1LZXktZz4KK3NtYXJ0LWJhY2tzcGFjZSA9IDxLZXktQmFja1NwYWNlPgorbmV3bGluZS1hbmQtaW5kZW50ID0gPEtleS1SZXR1cm4+IDxLZXktS1BfRW50ZXI+CitzbWFydC1pbmRlbnQgPSA8S2V5LVRhYj4KK2luZGVudC1yZWdpb24gPSA8Q29udHJvbC1LZXktYnJhY2tldHJpZ2h0PgorZGVkZW50LXJlZ2lvbiA9IDxDb250cm9sLUtleS1icmFja2V0bGVmdD4KK2NvbW1lbnQtcmVnaW9uID0gPENvbnRyb2wtS2V5LWQ+Cit1bmNvbW1lbnQtcmVnaW9uID0gPENvbnRyb2wtU2hpZnQtS2V5LUQ+Cit0YWJpZnktcmVnaW9uID0gPEFsdC1LZXktNT4KK3VudGFiaWZ5LXJlZ2lvbiA9IDxBbHQtS2V5LTY+Cit0b2dnbGUtdGFicyA9IDxDb250cm9sLUtleS1UPgorY2hhbmdlLWluZGVudHdpZHRoID0gPEFsdC1LZXktdT4KK2RlbC13b3JkLWxlZnQgPSA8Q29udHJvbC1LZXktQmFja1NwYWNlPgorZGVsLXdvcmQtcmlnaHQgPSA8Q29udHJvbC1LZXktRGVsZXRlPgorCiBbSURMRSBDbGFzc2ljIE1hY10KIGNvcHk9PENvbW1hbmQtS2V5LWM+CiBjdXQ9PENvbW1hbmQtS2V5LXg+CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWctbWFpbi5kZWYgYi9MaWIvaWRsZWxpYi9jb25maWctbWFpbi5kZWYKaW5kZXggOGViYmMxYi4uYTYxYmJhNyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnLW1haW4uZGVmCisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZy1tYWluLmRlZgpAQCAtNzAsNyArNzAsOSBAQAogCiBbS2V5c10KIGRlZmF1bHQ9IDEKLW5hbWU9IElETEUgQ2xhc3NpYyBXaW5kb3dzCituYW1lPQorbmFtZTI9CisjIG5hbWUyIHNldCBpbiB1c2VyIGNvbmZpZy1tYWluLmNmZyBmb3Iga2V5cyBhZGRlZCBhZnRlciAyMDE2IEp1bHkgMQogCiBbSGlzdG9yeV0KIGN5Y2xpYz0xCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5IGIvTGliL2lkbGVsaWIvY29uZmlnLnB5CnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvbmZpZy5weQppbmRleCA4OTU0NDg4Li5mMjQzN2E4IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZy5weQpAQCAtNyw3ICs3LDcgQEAKIGFuZCBpZiBhIGZpbGUgYmVjb21lcyBlbXB0eSwgaXQgd2lsbCBiZSBkZWxldGVkLgogCiBUaGUgY29udGVudHMgb2YgdGhlIHVzZXIgZmlsZXMgbWF5IGJlIGFsdGVyZWQgdXNpbmcgdGhlIE9wdGlvbnMvQ29uZmlndXJlIElETEUKLW1lbnUgdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIEdVSSAoY29uZmlnRGlhbG9nLnB5KSwgb3IgbWFudWFsbHkuCittZW51IHRvIGFjY2VzcyB0aGUgY29uZmlndXJhdGlvbiBHVUkgKGNvbmZpZ2RpYWxvZy5weSksIG9yIG1hbnVhbGx5LgogCiBUaHJvdWdob3V0IHRoaXMgbW9kdWxlIHRoZXJlIGlzIGFuIGVtcGhhc2lzIG9uIHJldHVybmluZyB1c2VhYmxlIGRlZmF1bHRzCiB3aGVuIGEgcHJvYmxlbSBvY2N1cnMgaW4gcmV0dXJuaW5nIGEgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gdmFsdWUgYmFjayB0bwpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IHN5cwogCiBmcm9tIGNvbmZpZ3BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrVmVyc2lvbgogZnJvbSB0a2ludGVyLmZvbnQgaW1wb3J0IEZvbnQsIG5hbWV0b2ZvbnQKIAogY2xhc3MgSW52YWxpZENvbmZpZ1R5cGUoRXhjZXB0aW9uKTogcGFzcwpAQCAtMjMwLDE1ICsyMjksMTIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT10eXBlLCByYXc9cmF3KQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRPcHRpb24gLVxuJworICAgICAgICAgICAgd2FybmluZyA9ICgnXG4gV2FybmluZzogY29uZmlnLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKICAgICAgICAgICAgICAgICAgICAgICAgJyBpbnZhbGlkICVyIHZhbHVlIGZvciBjb25maWd1cmF0aW9uIG9wdGlvbiAlclxuJwogICAgICAgICAgICAgICAgICAgICAgICAnIGZyb20gc2VjdGlvbiAlcjogJXInICUKICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUsIG9wdGlvbiwgc2VjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sIHJhdz1yYXcpKSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCBjb25maWdUeXBlLCBzZWN0aW9uLCBvcHRpb24pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdENmZ1tjb25maWdUeXBlXS5oYXNfb3B0aW9uKHNlY3Rpb24sb3B0aW9uKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLkdldCgKQEAgLTI0NywxNSArMjQzLDEyIEBACiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICNyZXR1cm5pbmcgZGVmYXVsdCwgcHJpbnQgd2FybmluZwogICAgICAgICBpZiB3YXJuX29uX2RlZmF1bHQ6Ci0gICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKKyAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZy5weSAtIElkbGVDb25mLkdldE9wdGlvbiAtXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICcgcHJvYmxlbSByZXRyaWV2aW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9uICVyXG4nCiAgICAgICAgICAgICAgICAgICAgICAgICcgZnJvbSBzZWN0aW9uICVyLlxuJwogICAgICAgICAgICAgICAgICAgICAgICAnIHJldHVybmluZyBkZWZhdWx0IHZhbHVlOiAlcicgJQogICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uLCBzZWN0aW9uLCBkZWZhdWx0KSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCBjb25maWdUeXBlLCBzZWN0aW9uLCBvcHRpb24pCiAgICAgICAgIHJldHVybiBkZWZhdWx0CiAKICAgICBkZWYgU2V0T3B0aW9uKHNlbGYsIGNvbmZpZ1R5cGUsIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpOgpAQCAtMzU4LDUyICszNTEsNzMgQEAKICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdGhlbWU6CiAgICAgICAgICAgICBpZiBub3QgY2ZnUGFyc2VyLmhhc19vcHRpb24odGhlbWVOYW1lLCBlbGVtZW50KToKICAgICAgICAgICAgICAgICAjIFByaW50IHdhcm5pbmcgdGhhdCB3aWxsIHJldHVybiBhIGRlZmF1bHQgY29sb3IKLSAgICAgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLklkbGVDb25mLkdldFRoZW1lRGljdCcKKyAgICAgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWcuSWRsZUNvbmYuR2V0VGhlbWVEaWN0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtXG4gcHJvYmxlbSByZXRyaWV2aW5nIHRoZW1lIGVsZW1lbnQgJXInCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gZnJvbSB0aGVtZSAlci5cbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgY29sb3I6ICVyJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudCwgdGhlbWVOYW1lLCB0aGVtZVtlbGVtZW50XSkpCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBfd2Fybih3YXJuaW5nLCAnaGlnaGxpZ2h0JywgdGhlbWVOYW1lLCBlbGVtZW50KQogICAgICAgICAgICAgdGhlbWVbZWxlbWVudF0gPSBjZmdQYXJzZXIuR2V0KAogICAgICAgICAgICAgICAgICAgICB0aGVtZU5hbWUsIGVsZW1lbnQsIGRlZmF1bHQ9dGhlbWVbZWxlbWVudF0pCiAgICAgICAgIHJldHVybiB0aGVtZQogCiAgICAgZGVmIEN1cnJlbnRUaGVtZShzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRleHQgY29sb3IgdGhlbWUuCisgICAgICAgICJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGV4dCBjb2xvciB0aGVtZS4iCisgICAgICAgIHJldHVybiBzZWxmLmN1cnJlbnRfY29sb3JzX2FuZF9rZXlzKCdUaGVtZScpCiAKLSAgICAgICAgaWRsZWxpYi5jb25maWctbWFpbi5kZWYgaW5jbHVkZXMgdGhpcyBzZWN0aW9uCisgICAgZGVmIEN1cnJlbnRLZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUga2V5IHNldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY3VycmVudF9jb2xvcnNfYW5kX2tleXMoJ0tleXMnKQorCisgICAgZGVmIGN1cnJlbnRfY29sb3JzX2FuZF9rZXlzKHNlbGYsIHNlY3Rpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgbmFtZSBmb3IgVGhlbWUgb3IgS2V5cyBzZWN0aW9uLgorCisgICAgICAgIGlkbGVsaWIuY29uZmlnLW1haW4uZGVmICgnZGVmYXVsdCcpIGluY2x1ZGVzIHRoZXNlIHNlY3Rpb25zCisKICAgICAgICAgW1RoZW1lXQogICAgICAgICBkZWZhdWx0PSAxCiAgICAgICAgIG5hbWU9IElETEUgQ2xhc3NpYwogICAgICAgICBuYW1lMj0KLSAgICAgICAgIyBuYW1lMiBzZXQgaW4gdXNlciBjb25maWctbWFpbi5jZmcgZm9yIHRoZW1lcyBhZGRlZCBhZnRlciAyMDE1IE9jdCAxCiAKLSAgICAgICAgSXRlbSBuYW1lMiBpcyBuZWVkZWQgYmVjYXVzZSBzZXR0aW5nIG5hbWUgdG8gYSBuZXcgYnVpbHRpbgotICAgICAgICBjYXVzZXMgb2xkZXIgSURMRXMgdG8gZGlzcGxheSBtdWx0aXBsZSBlcnJvciBtZXNzYWdlcyBvciBxdWl0LgorICAgICAgICBbS2V5c10KKyAgICAgICAgZGVmYXVsdD0gMQorICAgICAgICBuYW1lPQorICAgICAgICBuYW1lMj0KKworICAgICAgICBJdGVtICduYW1lMicsIGlzIHVzZWQgZm9yIGJ1aWx0LWluICgnZGVmYXVsdCcpIHRoZW1lcyBhbmQga2V5cworICAgICAgICBhZGRlZCBhZnRlciAyMDE1IE9jdCAxIGFuZCAyMDE2IEp1bHkgMS4gIFRoaXMga2x1ZGdlIGlzIG5lZWRlZAorICAgICAgICBiZWNhdXNlIHNldHRpbmcgJ25hbWUnIHRvIGEgYnVpbHRpbiBub3QgZGVmaW5lZCBpbiBvbGRlciBJRExFcworICAgICAgICB0byBkaXNwbGF5IG11bHRpcGxlIGVycm9yIG1lc3NhZ2VzIG9yIHF1aXQuCiAgICAgICAgIFNlZSBodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI1MzEzLgotICAgICAgICBXaGVuIGRlZmF1bHQgPSBUcnVlLCBuYW1lMiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgbmFtZSwKLSAgICAgICAgd2hpbGUgb2xkZXIgSURMRXMgd2lsbCBqdXN0IHVzZSBuYW1lLgorICAgICAgICBXaGVuIGRlZmF1bHQgPSBUcnVlLCAnbmFtZTInIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAnbmFtZScsCisgICAgICAgIHdoaWxlIG9sZGVyIElETEVzIHdpbGwganVzdCB1c2UgbmFtZS4gIFdoZW4gZGVmYXVsdCA9IEZhbHNlLAorICAgICAgICAnbmFtZTInIG1heSBzdGlsbCBiZSBzZXQsIGJ1dCBpdCBpcyBpZ25vcmVkLgogICAgICAgICAiIiIKKyAgICAgICAgY2ZnbmFtZSA9ICdoaWdobGlnaHQnIGlmIHNlY3Rpb24gPT0gJ1RoZW1lJyBlbHNlICdrZXlzJwogICAgICAgICBkZWZhdWx0ID0gc2VsZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnZGVmYXVsdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdib29sJywgZGVmYXVsdD1UcnVlKQorICAgICAgICBuYW1lID0gJycKICAgICAgICAgaWYgZGVmYXVsdDoKLSAgICAgICAgICAgIHRoZW1lID0gc2VsZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZTInLCBkZWZhdWx0PScnKQotICAgICAgICBpZiBkZWZhdWx0IGFuZCBub3QgdGhlbWUgb3Igbm90IGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aGVtZSA9IHNlbGYuR2V0T3B0aW9uKCdtYWluJywgJ1RoZW1lJywgJ25hbWUnLCBkZWZhdWx0PScnKQotICAgICAgICBzb3VyY2UgPSBzZWxmLmRlZmF1bHRDZmcgaWYgZGVmYXVsdCBlbHNlIHNlbGYudXNlckNmZwotICAgICAgICBpZiBzb3VyY2VbJ2hpZ2hsaWdodCddLmhhc19zZWN0aW9uKHRoZW1lKToKLSAgICAgICAgICAgIHJldHVybiB0aGVtZQorICAgICAgICAgICAgbmFtZSA9IHNlbGYuR2V0T3B0aW9uKCdtYWluJywgc2VjdGlvbiwgJ25hbWUyJywgZGVmYXVsdD0nJykKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBuYW1lID0gc2VsZi5HZXRPcHRpb24oJ21haW4nLCBzZWN0aW9uLCAnbmFtZScsIGRlZmF1bHQ9JycpCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBzb3VyY2UgPSBzZWxmLmRlZmF1bHRDZmcgaWYgZGVmYXVsdCBlbHNlIHNlbGYudXNlckNmZworICAgICAgICAgICAgaWYgc291cmNlW2NmZ25hbWVdLmhhc19zZWN0aW9uKG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBuYW1lCisgICAgICAgIHJldHVybiAiSURMRSBDbGFzc2ljIiBpZiBzZWN0aW9uID09ICdUaGVtZScgZWxzZSBzZWxmLmRlZmF1bHRfa2V5cygpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGRlZmF1bHRfa2V5cygpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgorICAgICAgICAgICAgcmV0dXJuICdJRExFIENsYXNzaWMgV2luZG93cycKKyAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICByZXR1cm4gJ0lETEUgQ2xhc3NpYyBPU1gnCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gIklETEUgQ2xhc3NpYyIKKyAgICAgICAgICAgIHJldHVybiAnSURMRSBNb2Rlcm4gVW5peCcKIAotICAgIGRlZiBDdXJyZW50S2V5cyhzZWxmKToKLSAgICAgICAgIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBrZXkgc2V0LiIKLSAgICAgICAgcmV0dXJuIHNlbGYuR2V0T3B0aW9uKCdtYWluJywgJ0tleXMnLCAnbmFtZScsIGRlZmF1bHQ9JycpCi0KLSAgICBkZWYgR2V0RXh0ZW5zaW9ucyhzZWxmLCBhY3RpdmVfb25seT1UcnVlLCBlZGl0b3Jfb25seT1GYWxzZSwgc2hlbGxfb25seT1GYWxzZSk6CisgICAgZGVmIEdldEV4dGVuc2lvbnMoc2VsZiwgYWN0aXZlX29ubHk9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBlZGl0b3Jfb25seT1GYWxzZSwgc2hlbGxfb25seT1GYWxzZSk6CiAgICAgICAgICIiIlJldHVybiBleHRlbnNpb25zIGluIGRlZmF1bHQgYW5kIHVzZXIgY29uZmlnLWV4dGVuc2lvbnMgZmlsZXMuCiAKICAgICAgICAgSWYgYWN0aXZlX29ubHkgVHJ1ZSwgb25seSByZXR1cm4gYWN0aXZlIChlbmFibGVkKSBleHRlbnNpb25zCkBAIC00MjMsNyArNDM3LDcgQEAKICAgICAgICAgICAgICAgICBpZiBzZWxmLkdldE9wdGlvbignZXh0ZW5zaW9ucycsIGV4dG4sICdlbmFibGUnLCBkZWZhdWx0PVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0nYm9vbCcpOgogICAgICAgICAgICAgICAgICAgICAjdGhlIGV4dGVuc2lvbiBpcyBlbmFibGVkCi0gICAgICAgICAgICAgICAgICAgIGlmIGVkaXRvcl9vbmx5IG9yIHNoZWxsX29ubHk6ICAjIFRPRE8gaWYgYm90aCwgY29udHJhZGljdG9yeQorICAgICAgICAgICAgICAgICAgICBpZiBlZGl0b3Jfb25seSBvciBzaGVsbF9vbmx5OiAgIyBUT0RPIGJvdGggVHJ1ZSBjb250cmFkaWN0CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlZGl0b3Jfb25seToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAiZW5hYmxlX2VkaXRvciIKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CkBAIC01MjgsNyArNTQyLDggQEAKICAgICAgICAgZXZlbnRTdHIgLSB2aXJ0dWFsIGV2ZW50LCBpbmNsdWRpbmcgYnJhY2tldHMsIGFzIGluICc8PGV2ZW50Pj4nLgogICAgICAgICAiIiIKICAgICAgICAgZXZlbnROYW1lID0gZXZlbnRTdHJbMjotMl0gI3RyaW0gb2ZmIHRoZSBhbmdsZSBicmFja2V0cwotICAgICAgICBiaW5kaW5nID0gc2VsZi5HZXRPcHRpb24oJ2tleXMnLCBrZXlTZXROYW1lLCBldmVudE5hbWUsIGRlZmF1bHQ9JycpLnNwbGl0KCkKKyAgICAgICAgYmluZGluZyA9IHNlbGYuR2V0T3B0aW9uKCdrZXlzJywga2V5U2V0TmFtZSwgZXZlbnROYW1lLCBkZWZhdWx0PScnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9vbl9kZWZhdWx0PUZhbHNlKS5zcGxpdCgpCiAgICAgICAgIHJldHVybiBiaW5kaW5nCiAKICAgICBkZWYgR2V0Q3VycmVudEtleVNldChzZWxmKToKQEAgLTYzOSwyMCArNjU0LDI4IEBACiAgICAgICAgICAgICAnPDxkZWwtd29yZC1yaWdodD4+JzogWyc8Q29udHJvbC1LZXktRGVsZXRlPiddCiAgICAgICAgICAgICB9CiAgICAgICAgIGlmIGtleVNldE5hbWU6Ci0gICAgICAgICAgICBmb3IgZXZlbnQgaW4ga2V5QmluZGluZ3M6Ci0gICAgICAgICAgICAgICAgYmluZGluZyA9IHNlbGYuR2V0S2V5QmluZGluZyhrZXlTZXROYW1lLCBldmVudCkKLSAgICAgICAgICAgICAgICBpZiBiaW5kaW5nOgotICAgICAgICAgICAgICAgICAgICBrZXlCaW5kaW5nc1tldmVudF0gPSBiaW5kaW5nCi0gICAgICAgICAgICAgICAgZWxzZTogI3dlIGFyZSBnb2luZyB0byByZXR1cm4gYSBkZWZhdWx0LCBwcmludCB3YXJuaW5nCi0gICAgICAgICAgICAgICAgICAgIHdhcm5pbmc9KCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0Q29yZUtleXMnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtXG4gcHJvYmxlbSByZXRyaWV2aW5nIGtleSBiaW5kaW5nIGZvciBldmVudCAlcicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gZnJvbSBrZXkgc2V0ICVyLlxuJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWU6ICVyJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2ZW50LCBrZXlTZXROYW1lLCBrZXlCaW5kaW5nc1tldmVudF0pKQotICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludCh3YXJuaW5nLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgbm90IChzZWxmLnVzZXJDZmdbJ2tleXMnXS5oYXNfc2VjdGlvbihrZXlTZXROYW1lKSBvcgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlZmF1bHRDZmdbJ2tleXMnXS5oYXNfc2VjdGlvbihrZXlTZXROYW1lKSk6CisgICAgICAgICAgICAgICAgd2FybmluZyA9ICgKKyAgICAgICAgICAgICAgICAgICAgJ1xuIFdhcm5pbmc6IGNvbmZpZy5weSAtIElkbGVDb25mLkdldENvcmVLZXlzIC1cbicKKyAgICAgICAgICAgICAgICAgICAgJyBrZXkgc2V0ICVyIGlzIG5vdCBkZWZpbmVkLCB1c2luZyBkZWZhdWx0IGJpbmRpbmdzLicgJQorICAgICAgICAgICAgICAgICAgICAoa2V5U2V0TmFtZSwpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIF93YXJuKHdhcm5pbmcsICdrZXlzJywga2V5U2V0TmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIGV2ZW50IGluIGtleUJpbmRpbmdzOgorICAgICAgICAgICAgICAgICAgICBiaW5kaW5nID0gc2VsZi5HZXRLZXlCaW5kaW5nKGtleVNldE5hbWUsIGV2ZW50KQorICAgICAgICAgICAgICAgICAgICBpZiBiaW5kaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5QmluZGluZ3NbZXZlbnRdID0gYmluZGluZworICAgICAgICAgICAgICAgICAgICBlbHNlOiAjd2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIGRlZmF1bHQsIHByaW50IHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuIFdhcm5pbmc6IGNvbmZpZy5weSAtIElkbGVDb25mLkdldENvcmVLZXlzIC1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHByb2JsZW0gcmV0cmlldmluZyBrZXkgYmluZGluZyBmb3IgZXZlbnQgJXJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGZyb20ga2V5IHNldCAlci5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHJldHVybmluZyBkZWZhdWx0IHZhbHVlOiAlcicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCwga2V5U2V0TmFtZSwga2V5QmluZGluZ3NbZXZlbnRdKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgX3dhcm4od2FybmluZywgJ2tleXMnLCBrZXlTZXROYW1lLCBldmVudCkKICAgICAgICAgcmV0dXJuIGtleUJpbmRpbmdzCiAKICAgICBkZWYgR2V0RXh0cmFIZWxwU291cmNlTGlzdChzZWxmLCBjb25maWdTZXQpOgpAQCAtNzEzLDE2ICs3MzYsMTMgQEAKICAgICAgICAgYm9sZCA9IHNlbGYuR2V0T3B0aW9uKGNvbmZpZ1R5cGUsIHNlY3Rpb24sICdmb250LWJvbGQnLCBkZWZhdWx0PTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdib29sJykKICAgICAgICAgaWYgKGZhbWlseSA9PSAnVGtGaXhlZEZvbnQnKToKLSAgICAgICAgICAgIGlmIFRrVmVyc2lvbiA8IDguNToKLSAgICAgICAgICAgICAgICBmYW1pbHkgPSAnQ291cmllcicKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgZiA9IEZvbnQobmFtZT0nVGtGaXhlZEZvbnQnLCBleGlzdHM9VHJ1ZSwgcm9vdD1yb290KQotICAgICAgICAgICAgICAgIGFjdHVhbEZvbnQgPSBGb250LmFjdHVhbChmKQotICAgICAgICAgICAgICAgIGZhbWlseSA9IGFjdHVhbEZvbnRbJ2ZhbWlseSddCi0gICAgICAgICAgICAgICAgc2l6ZSA9IGFjdHVhbEZvbnRbJ3NpemUnXQotICAgICAgICAgICAgICAgIGlmIHNpemUgPD0gMDoKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDEwICAjIGlmIGZvbnQgaW4gcGl4ZWxzLCBpZ25vcmUgYWN0dWFsIHNpemUKLSAgICAgICAgICAgICAgICBib2xkID0gYWN0dWFsRm9udFsnd2VpZ2h0J109PSdib2xkJworICAgICAgICAgICAgZiA9IEZvbnQobmFtZT0nVGtGaXhlZEZvbnQnLCBleGlzdHM9VHJ1ZSwgcm9vdD1yb290KQorICAgICAgICAgICAgYWN0dWFsRm9udCA9IEZvbnQuYWN0dWFsKGYpCisgICAgICAgICAgICBmYW1pbHkgPSBhY3R1YWxGb250WydmYW1pbHknXQorICAgICAgICAgICAgc2l6ZSA9IGFjdHVhbEZvbnRbJ3NpemUnXQorICAgICAgICAgICAgaWYgc2l6ZSA8PSAwOgorICAgICAgICAgICAgICAgIHNpemUgPSAxMCAgIyBpZiBmb250IGluIHBpeGVscywgaWdub3JlIGFjdHVhbCBzaXplCisgICAgICAgICAgICBib2xkID0gYWN0dWFsRm9udFsnd2VpZ2h0J10gPT0gJ2JvbGQnCiAgICAgICAgIHJldHVybiAoZmFtaWx5LCBzaXplLCAnYm9sZCcgaWYgYm9sZCBlbHNlICdub3JtYWwnKQogCiAgICAgZGVmIExvYWRDZmdGaWxlcyhzZWxmKToKQEAgLTczOSw2ICs3NTksMTggQEAKIAogaWRsZUNvbmYgPSBJZGxlQ29uZigpCiAKKworX3dhcm5lZCA9IHNldCgpCitkZWYgX3dhcm4obXNnLCAqa2V5KToKKyAgICBrZXkgPSAobXNnLCkgKyBrZXkKKyAgICBpZiBrZXkgbm90IGluIF93YXJuZWQ6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgX3dhcm5lZC5hZGQoa2V5KQorCisKICMgVE9ETyBSZXZpc2UgdGVzdCBvdXRwdXQsIHdyaXRlIGV4cGFuZGVkIHVuaXR0ZXN0CiAjCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkgYi9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlODExOC4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0iRGlhbG9nIHRvIHNwZWNpZnkgb3IgZWRpdCB0aGUgcGFyYW1ldGVycyBmb3IgYSB1c2VyIGNvbmZpZ3VyZWQgaGVscCBzb3VyY2UuIgotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLQotZnJvbSB0a2ludGVyIGltcG9ydCAqCi1pbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAotaW1wb3J0IHRraW50ZXIuZmlsZWRpYWxvZyBhcyB0a0ZpbGVEaWFsb2cKLQotY2xhc3MgR2V0SGVscFNvdXJjZURpYWxvZyhUb3BsZXZlbCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIG1lbnVJdGVtPScnLCBmaWxlUGF0aD0nJywgX2h0ZXN0PUZhbHNlKToKLSAgICAgICAgIiIiR2V0IG1lbnUgZW50cnkgYW5kIHVybC8gbG9jYWwgZmlsZSBsb2NhdGlvbiBmb3IgQWRkaXRpb25hbCBIZWxwCi0KLSAgICAgICAgVXNlciBzZWxlY3RzIGEgbmFtZSBmb3IgdGhlIEhlbHAgcmVzb3VyY2UgYW5kIHByb3ZpZGVzIGEgd2ViIHVybAotICAgICAgICBvciBhIGxvY2FsIGZpbGUgYXMgaXRzIHNvdXJjZS4gIFRoZSB1c2VyIGNhbiBlbnRlciBhIHVybCBvciBicm93c2UKLSAgICAgICAgZm9yIHRoZSBmaWxlLgotCi0gICAgICAgIF9odGVzdCAtIGJvb2wsIGNoYW5nZSBib3ggbG9jYXRpb24gd2hlbiBydW5uaW5nIGh0ZXN0Ci0gICAgICAgICIiIgotICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCi0gICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCi0gICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSwgd2lkdGg9RkFMU0UpCi0gICAgICAgIHNlbGYudGl0bGUodGl0bGUpCi0gICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKLSAgICAgICAgc2VsZi5ncmFiX3NldCgpCi0gICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmNhbmNlbCkKLSAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKLSAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCi0gICAgICAgIHNlbGYuY3JlYXRlX3dpZGdldHMoKQotICAgICAgICBzZWxmLm1lbnUuc2V0KG1lbnVJdGVtKQotICAgICAgICBzZWxmLnBhdGguc2V0KGZpbGVQYXRoKQotICAgICAgICBzZWxmLndpdGhkcmF3KCkgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQotICAgICAgICAjbmVlZHMgdG8gYmUgZG9uZSBoZXJlIHNvIHRoYXQgdGhlIHdpbmZvX3JlcXdpZHRoIGlzIHZhbGlkCi0gICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCi0gICAgICAgICNjZW50cmUgZGlhbG9nIG92ZXIgcGFyZW50LiBiZWxvdyBwYXJlbnQgaWYgcnVubmluZyBodGVzdC4KLSAgICAgICAgc2VsZi5nZW9tZXRyeSgKLSAgICAgICAgICAgICAgICAiKyVkKyVkIiAlICgKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R4KCkgKwotICAgICAgICAgICAgICAgICAgICAocGFyZW50LndpbmZvX3dpZHRoKCkvMiAtIHNlbGYud2luZm9fcmVxd2lkdGgoKS8yKSwKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkgKwotICAgICAgICAgICAgICAgICAgICAoKHBhcmVudC53aW5mb19oZWlnaHQoKS8yIC0gc2VsZi53aW5mb19yZXFoZWlnaHQoKS8yKQotICAgICAgICAgICAgICAgICAgICBpZiBub3QgX2h0ZXN0IGVsc2UgMTUwKSkpCi0gICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgI2dlb21ldHJ5IHNldCwgdW5oaWRlCi0gICAgICAgIHNlbGYuYmluZCgnPFJldHVybj4nLCBzZWxmLm9rKQotICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKLQotICAgIGRlZiBjcmVhdGVfd2lkZ2V0cyhzZWxmKToKLSAgICAgICAgc2VsZi5tZW51ID0gU3RyaW5nVmFyKHNlbGYpCi0gICAgICAgIHNlbGYucGF0aCA9IFN0cmluZ1ZhcihzZWxmKQotICAgICAgICBzZWxmLmZvbnRTaXplID0gU3RyaW5nVmFyKHNlbGYpCi0gICAgICAgIHNlbGYuZnJhbWVNYWluID0gRnJhbWUoc2VsZiwgYm9yZGVyd2lkdGg9MiwgcmVsaWVmPUdST09WRSkKLSAgICAgICAgc2VsZi5mcmFtZU1haW4ucGFjayhzaWRlPVRPUCwgZXhwYW5kPVRSVUUsIGZpbGw9Qk9USCkKLSAgICAgICAgbGFiZWxNZW51ID0gTGFiZWwoc2VsZi5mcmFtZU1haW4sIGFuY2hvcj1XLCBqdXN0aWZ5PUxFRlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9J01lbnUgSXRlbTonKQotICAgICAgICBzZWxmLmVudHJ5TWVudSA9IEVudHJ5KHNlbGYuZnJhbWVNYWluLCB0ZXh0dmFyaWFibGU9c2VsZi5tZW51LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTMwKQotICAgICAgICBzZWxmLmVudHJ5TWVudS5mb2N1c19zZXQoKQotICAgICAgICBsYWJlbFBhdGggPSBMYWJlbChzZWxmLmZyYW1lTWFpbiwgYW5jaG9yPVcsIGp1c3RpZnk9TEVGVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nSGVscCBGaWxlIFBhdGg6IEVudGVyIFVSTCBvciBicm93c2UgZm9yIGZpbGUnKQotICAgICAgICBzZWxmLmVudHJ5UGF0aCA9IEVudHJ5KHNlbGYuZnJhbWVNYWluLCB0ZXh0dmFyaWFibGU9c2VsZi5wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTQwKQotICAgICAgICBzZWxmLmVudHJ5TWVudS5mb2N1c19zZXQoKQotICAgICAgICBsYWJlbE1lbnUucGFjayhhbmNob3I9VywgcGFkeD01LCBwYWR5PTMpCi0gICAgICAgIHNlbGYuZW50cnlNZW51LnBhY2soYW5jaG9yPVcsIHBhZHg9NSwgcGFkeT0zKQotICAgICAgICBsYWJlbFBhdGgucGFjayhhbmNob3I9VywgcGFkeD01LCBwYWR5PTMpCi0gICAgICAgIHNlbGYuZW50cnlQYXRoLnBhY2soYW5jaG9yPVcsIHBhZHg9NSwgcGFkeT0zKQotICAgICAgICBicm93c2VCdXR0b24gPSBCdXR0b24oc2VsZi5mcmFtZU1haW4sIHRleHQ9J0Jyb3dzZScsIHdpZHRoPTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuYnJvd3NlX2ZpbGUpCi0gICAgICAgIGJyb3dzZUJ1dHRvbi5wYWNrKHBhZHk9MykKLSAgICAgICAgZnJhbWVCdXR0b25zID0gRnJhbWUoc2VsZikKLSAgICAgICAgZnJhbWVCdXR0b25zLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKLSAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J09LJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD04LCBkZWZhdWx0PUFDVElWRSwgIGNvbW1hbmQ9c2VsZi5vaykKLSAgICAgICAgc2VsZi5idXR0b25Pay5ncmlkKHJvdz0wLCBjb2x1bW49MCwgcGFkeD01LHBhZHk9NSkKLSAgICAgICAgc2VsZi5idXR0b25DYW5jZWwgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdDYW5jZWwnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD04LCBjb21tYW5kPXNlbGYuY2FuY2VsKQotICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbC5ncmlkKHJvdz0wLCBjb2x1bW49MSwgcGFkeD01LCBwYWR5PTUpCi0KLSAgICBkZWYgYnJvd3NlX2ZpbGUoc2VsZik6Ci0gICAgICAgIGZpbGV0eXBlcyA9IFsKLSAgICAgICAgICAgICgiSFRNTCBGaWxlcyIsICIqLmh0bSAqLmh0bWwiLCAiVEVYVCIpLAotICAgICAgICAgICAgKCJQREYgRmlsZXMiLCAiKi5wZGYiLCAiVEVYVCIpLAotICAgICAgICAgICAgKCJXaW5kb3dzIEhlbHAgRmlsZXMiLCAiKi5jaG0iKSwKLSAgICAgICAgICAgICgiVGV4dCBGaWxlcyIsICIqLnR4dCIsICJURVhUIiksCi0gICAgICAgICAgICAoIkFsbCBGaWxlcyIsICIqIildCi0gICAgICAgIHBhdGggPSBzZWxmLnBhdGguZ2V0KCkKLSAgICAgICAgaWYgcGF0aDoKLSAgICAgICAgICAgIGRpciwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGJhc2UgPSBOb25lCi0gICAgICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgotICAgICAgICAgICAgICAgIGRpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmV4ZWN1dGFibGUpLCAnRG9jJykKLSAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXIpOgotICAgICAgICAgICAgICAgICAgICBkaXIgPSBvcy5nZXRjd2QoKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBkaXIgPSBvcy5nZXRjd2QoKQotICAgICAgICBvcGVuZGlhbG9nID0gdGtGaWxlRGlhbG9nLk9wZW4ocGFyZW50PXNlbGYsIGZpbGV0eXBlcz1maWxldHlwZXMpCi0gICAgICAgIGZpbGUgPSBvcGVuZGlhbG9nLnNob3coaW5pdGlhbGRpcj1kaXIsIGluaXRpYWxmaWxlPWJhc2UpCi0gICAgICAgIGlmIGZpbGU6Ci0gICAgICAgICAgICBzZWxmLnBhdGguc2V0KGZpbGUpCi0KLSAgICBkZWYgbWVudV9vayhzZWxmKToKLSAgICAgICAgIlNpbXBsZSB2YWxpZGl0eSBjaGVjayBmb3IgYSBzZW5zaWJsZSBtZW51IGl0ZW0gbmFtZSIKLSAgICAgICAgbWVudV9vayA9IFRydWUKLSAgICAgICAgbWVudSA9IHNlbGYubWVudS5nZXQoKQotICAgICAgICBtZW51LnN0cmlwKCkKLSAgICAgICAgaWYgbm90IG1lbnU6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdNZW51IEl0ZW0gRXJyb3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBtZW51IGl0ZW0gc3BlY2lmaWVkJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCi0gICAgICAgICAgICBzZWxmLmVudHJ5TWVudS5mb2N1c19zZXQoKQotICAgICAgICAgICAgbWVudV9vayA9IEZhbHNlCi0gICAgICAgIGVsaWYgbGVuKG1lbnUpID4gMzA6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdNZW51IEl0ZW0gRXJyb3InLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdNZW51IGl0ZW0gdG9vIGxvbmc6JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbkxpbWl0IDMwIGNoYXJhY3RlcnMuJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCi0gICAgICAgICAgICBzZWxmLmVudHJ5TWVudS5mb2N1c19zZXQoKQotICAgICAgICAgICAgbWVudV9vayA9IEZhbHNlCi0gICAgICAgIHJldHVybiBtZW51X29rCi0KLSAgICBkZWYgcGF0aF9vayhzZWxmKToKLSAgICAgICAgIlNpbXBsZSB2YWxpZGl0eSBjaGVjayBmb3IgbWVudSBmaWxlIHBhdGgiCi0gICAgICAgIHBhdGhfb2sgPSBUcnVlCi0gICAgICAgIHBhdGggPSBzZWxmLnBhdGguZ2V0KCkKLSAgICAgICAgcGF0aC5zdHJpcCgpCi0gICAgICAgIGlmIG5vdCBwYXRoOiAjbm8gcGF0aCBzcGVjaWZpZWQKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0ZpbGUgUGF0aCBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIGhlbHAgZmlsZSBwYXRoIHNwZWNpZmllZC4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKLSAgICAgICAgICAgIHNlbGYuZW50cnlQYXRoLmZvY3VzX3NldCgpCi0gICAgICAgICAgICBwYXRoX29rID0gRmFsc2UKLSAgICAgICAgZWxpZiBwYXRoLnN0YXJ0c3dpdGgoKCd3d3cuJywgJ2h0dHAnKSk6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiBwYXRoWzo1XSA9PSAnZmlsZTonOgotICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzU6XQotICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgotICAgICAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0ZpbGUgUGF0aCBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdIZWxwIGZpbGUgcGF0aCBkb2VzIG5vdCBleGlzdC4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCi0gICAgICAgICAgICAgICAgc2VsZi5lbnRyeVBhdGguZm9jdXNfc2V0KCkKLSAgICAgICAgICAgICAgICBwYXRoX29rID0gRmFsc2UKLSAgICAgICAgcmV0dXJuIHBhdGhfb2sKLQotICAgIGRlZiBvayhzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgaWYgc2VsZi5tZW51X29rKCkgYW5kIHNlbGYucGF0aF9vaygpOgotICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSAoc2VsZi5tZW51LmdldCgpLnN0cmlwKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGguZ2V0KCkuc3RyaXAoKSkKLSAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKLSAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5yZXN1bHRbMV0KLSAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoKCd3d3cnLCAnZmlsZTonLCAnaHR0cDonLCAnaHR0cHM6JykpOgotICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgIyBNYWMgU2FmYXJpIGluc2lzdHMgb24gdXNpbmcgdGhlIFVSSSBmb3JtIGZvciBsb2NhbCBmaWxlcwotICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IGxpc3Qoc2VsZi5yZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0WzFdID0gImZpbGU6Ly8iICsgcGF0aAotICAgICAgICAgICAgc2VsZi5kZXN0cm95KCkKLQotICAgIGRlZiBjYW5jZWwoc2VsZiwgZXZlbnQ9Tm9uZSk6Ci0gICAgICAgIHNlbGYucmVzdWx0ID0gTm9uZQotICAgICAgICBzZWxmLmRlc3Ryb3koKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfY29uZmlnX2hlbHAnLAotICAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQotCi0gICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCi0gICAgcnVuKEdldEhlbHBTb3VyY2VEaWFsb2cpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTM3ODM2Li4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIiIiCi1EaWFsb2cgdGhhdCBhbGxvd3MgdXNlciB0byBzcGVjaWZ5IGEgbmV3IGNvbmZpZyBmaWxlIHNlY3Rpb24gbmFtZS4KLVVzZWQgdG8gZ2V0IG5ldyBoaWdobGlnaHQgdGhlbWUgYW5kIGtleWJpbmRpbmcgc2V0IG5hbWVzLgotVGhlICdyZXR1cm4gdmFsdWUnIGZvciB0aGUgZGlhbG9nLCB1c2VkIHR3byBwbGFjZWQgaW4gY29uZmlnRGlhbG9nLnB5LAotaXMgdGhlIC5yZXN1bHQgYXR0cmlidXRlIHNldCBpbiB0aGUgT2sgYW5kIENhbmNlbCBtZXRob2RzLgotIiIiCi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci0KLWNsYXNzIEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nKFRvcGxldmVsKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdXNlZF9uYW1lcywgX2h0ZXN0PUZhbHNlKToKLSAgICAgICAgIiIiCi0gICAgICAgIG1lc3NhZ2UgLSBzdHJpbmcsIGluZm9ybWF0aW9uYWwgbWVzc2FnZSB0byBkaXNwbGF5Ci0gICAgICAgIHVzZWRfbmFtZXMgLSBzdHJpbmcgY29sbGVjdGlvbiwgbmFtZXMgYWxyZWFkeSBpbiB1c2UgZm9yIHZhbGlkaXR5IGNoZWNrCi0gICAgICAgIF9odGVzdCAtIGJvb2wsIGNoYW5nZSBib3ggbG9jYXRpb24gd2hlbiBydW5uaW5nIGh0ZXN0Ci0gICAgICAgICIiIgotICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCi0gICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCi0gICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSwgd2lkdGg9RkFMU0UpCi0gICAgICAgIHNlbGYudGl0bGUodGl0bGUpCi0gICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKLSAgICAgICAgc2VsZi5ncmFiX3NldCgpCi0gICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKLSAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKLSAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQotICAgICAgICBzZWxmLnVzZWRfbmFtZXMgPSB1c2VkX25hbWVzCi0gICAgICAgIHNlbGYuY3JlYXRlX3dpZGdldHMoKQotICAgICAgICBzZWxmLndpdGhkcmF3KCkgICNoaWRlIHdoaWxlIHNldHRpbmcgZ2VvbWV0cnkKLSAgICAgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkKLSAgICAgICAgI25lZWRzIHRvIGJlIGRvbmUgaGVyZSBzbyB0aGF0IHRoZSB3aW5mb19yZXF3aWR0aCBpcyB2YWxpZAotICAgICAgICBzZWxmLm1lc3NhZ2VJbmZvLmNvbmZpZyh3aWR0aD1zZWxmLmZyYW1lTWFpbi53aW5mb19yZXF3aWR0aCgpKQotICAgICAgICBzZWxmLmdlb21ldHJ5KAotICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArCi0gICAgICAgICAgICAgICAgICAgIChwYXJlbnQud2luZm9fd2lkdGgoKS8yIC0gc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpLAotICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArCi0gICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIgLSBzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfaHRlc3QgZWxzZSAxMDApCi0gICAgICAgICAgICAgICAgKSApICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudCAob3IgYmVsb3cgaHRlc3QgYm94KQotICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKLSAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCi0KLSAgICBkZWYgY3JlYXRlX3dpZGdldHMoc2VsZik6Ci0gICAgICAgIHNlbGYubmFtZSA9IFN0cmluZ1ZhcihzZWxmLnBhcmVudCkKLSAgICAgICAgc2VsZi5mb250U2l6ZSA9IFN0cmluZ1ZhcihzZWxmLnBhcmVudCkKLSAgICAgICAgc2VsZi5mcmFtZU1haW4gPSBGcmFtZShzZWxmLCBib3JkZXJ3aWR0aD0yLCByZWxpZWY9U1VOS0VOKQotICAgICAgICBzZWxmLmZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLCBleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQotICAgICAgICBzZWxmLm1lc3NhZ2VJbmZvID0gTWVzc2FnZShzZWxmLmZyYW1lTWFpbiwgYW5jaG9yPVcsIGp1c3RpZnk9TEVGVCwKLSAgICAgICAgICAgICAgICAgICAgcGFkeD01LCBwYWR5PTUsIHRleHQ9c2VsZi5tZXNzYWdlKSAjLGFzcGVjdD0yMDApCi0gICAgICAgIGVudHJ5TmFtZSA9IEVudHJ5KHNlbGYuZnJhbWVNYWluLCB0ZXh0dmFyaWFibGU9c2VsZi5uYW1lLCB3aWR0aD0zMCkKLSAgICAgICAgZW50cnlOYW1lLmZvY3VzX3NldCgpCi0gICAgICAgIHNlbGYubWVzc2FnZUluZm8ucGFjayhwYWR4PTUsIHBhZHk9NSkgIywgZXhwYW5kPVRSVUUsIGZpbGw9Qk9USCkKLSAgICAgICAgZW50cnlOYW1lLnBhY2socGFkeD01LCBwYWR5PTUpCi0KLSAgICAgICAgZnJhbWVCdXR0b25zID0gRnJhbWUoc2VsZiwgcGFkeT0yKQotICAgICAgICBmcmFtZUJ1dHRvbnMucGFjayhzaWRlPUJPVFRPTSkKLSAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J09rJywKLSAgICAgICAgICAgICAgICB3aWR0aD04LCBjb21tYW5kPXNlbGYuT2spCi0gICAgICAgIHNlbGYuYnV0dG9uT2sucGFjayhzaWRlPUxFRlQsIHBhZHg9NSkKLSAgICAgICAgc2VsZi5idXR0b25DYW5jZWwgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdDYW5jZWwnLAotICAgICAgICAgICAgICAgIHdpZHRoPTgsIGNvbW1hbmQ9c2VsZi5DYW5jZWwpCi0gICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsLnBhY2soc2lkZT1SSUdIVCwgcGFkeD01KQotCi0gICAgZGVmIG5hbWVfb2soc2VsZik6Ci0gICAgICAgICcnJyBBZnRlciBzdHJpcHBpbmcgZW50ZXJlZCBuYW1lLCBjaGVjayB0aGF0IGl0IGlzIGEgIHNlbnNpYmxlCi0gICAgICAgIENvbmZpZ1BhcnNlciBmaWxlIHNlY3Rpb24gbmFtZS4gUmV0dXJuIGl0IGlmIGl0IGlzLCAnJyBpZiBub3QuCi0gICAgICAgICcnJwotICAgICAgICBuYW1lID0gc2VsZi5uYW1lLmdldCgpLnN0cmlwKCkKLSAgICAgICAgaWYgbm90IG5hbWU6ICNubyBuYW1lIHNwZWNpZmllZAotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIG5hbWUgc3BlY2lmaWVkLicsIHBhcmVudD1zZWxmKQotICAgICAgICBlbGlmIGxlbihuYW1lKT4zMDogI25hbWUgdG9vIGxvbmcKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdOYW1lIHRvbyBsb25nLiBJdCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuICcrCi0gICAgICAgICAgICAgICAgICAgICczMCBjaGFyYWN0ZXJzLicsIHBhcmVudD1zZWxmKQotICAgICAgICAgICAgbmFtZSA9ICcnCi0gICAgICAgIGVsaWYgbmFtZSBpbiBzZWxmLnVzZWRfbmFtZXM6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdOYW1lIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLicsIHBhcmVudD1zZWxmKQotICAgICAgICAgICAgbmFtZSA9ICcnCi0gICAgICAgIHJldHVybiBuYW1lCi0KLSAgICBkZWYgT2soc2VsZiwgZXZlbnQ9Tm9uZSk6Ci0gICAgICAgIG5hbWUgPSBzZWxmLm5hbWVfb2soKQotICAgICAgICBpZiBuYW1lOgotICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBuYW1lCi0gICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQotCi0gICAgZGVmIENhbmNlbChzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgc2VsZi5yZXN1bHQgPSAnJwotICAgICAgICBzZWxmLmRlc3Ryb3koKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfY29uZmlnX25hbWUnLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKLQotICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgotICAgIHJ1bihHZXRDZmdTZWN0aW9uTmFtZURpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9jb25maWdfa2V5LnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2NvbmZpZ19rZXkucHkKaW5kZXggZTY0MzhiZi4uMjYwMjI5MyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9jb25maWdfa2V5LnB5CkBAIC0yLDMxICsyLDM1IEBACiBEaWFsb2cgZm9yIGJ1aWxkaW5nIFRraW50ZXIgYWNjZWxlcmF0b3Iga2V5IGJpbmRpbmdzCiAiIiIKIGZyb20gdGtpbnRlciBpbXBvcnQgKgorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAogaW1wb3J0IHN0cmluZwogaW1wb3J0IHN5cwogCiBjbGFzcyBHZXRLZXlzRGlhbG9nKFRvcGxldmVsKToKLSAgICBkZWYgX19pbml0X18oc2VsZixwYXJlbnQsdGl0bGUsYWN0aW9uLGN1cnJlbnRLZXlTZXF1ZW5jZXMsX2h0ZXN0PUZhbHNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgYWN0aW9uLCBjdXJyZW50S2V5U2VxdWVuY2VzLAorICAgICAgICAgICAgICAgICBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CiAgICAgICAgICIiIgogICAgICAgICBhY3Rpb24gLSBzdHJpbmcsIHRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFsIGV2ZW50IHRoZXNlIGtleXMgd2lsbCBiZQogICAgICAgICAgICAgICAgICBtYXBwZWQgdG8KICAgICAgICAgY3VycmVudEtleXMgLSBsaXN0LCBhIGxpc3Qgb2YgYWxsIGtleSBzZXF1ZW5jZSBsaXN0cyBjdXJyZW50bHkgbWFwcGVkCiAgICAgICAgICAgICAgICAgIHRvIHZpcnR1YWwgZXZlbnRzLCBmb3Igb3ZlcmxhcCBjaGVja2luZworICAgICAgICBfdXRlc3QgLSBib29sLCBkbyBub3Qgd2FpdCB3aGVuIHJ1bm5pbmcgdW5pdHRlc3QKICAgICAgICAgX2h0ZXN0IC0gYm9vbCwgY2hhbmdlIGJveCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcgaHRlc3QKICAgICAgICAgIiIiCiAgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi53aXRoZHJhdygpICNoaWRlIHdoaWxlIHNldHRpbmcgZ2VvbWV0cnkKICAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKLSAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLHdpZHRoPUZBTFNFKQorICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0UsIHdpZHRoPUZBTFNFKQogICAgICAgICBzZWxmLnRpdGxlKHRpdGxlKQogICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCiAgICAgICAgIHNlbGYuZ3JhYl9zZXQoKQogICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5DYW5jZWwpCiAgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CiAgICAgICAgIHNlbGYuYWN0aW9uPWFjdGlvbgotICAgICAgICBzZWxmLmN1cnJlbnRLZXlTZXF1ZW5jZXM9Y3VycmVudEtleVNlcXVlbmNlcwotICAgICAgICBzZWxmLnJlc3VsdD0nJwotICAgICAgICBzZWxmLmtleVN0cmluZz1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5jdXJyZW50S2V5U2VxdWVuY2VzID0gY3VycmVudEtleVNlcXVlbmNlcworICAgICAgICBzZWxmLnJlc3VsdCA9ICcnCisgICAgICAgIHNlbGYua2V5U3RyaW5nID0gU3RyaW5nVmFyKHNlbGYpCiAgICAgICAgIHNlbGYua2V5U3RyaW5nLnNldCgnJykKICAgICAgICAgc2VsZi5TZXRNb2RpZmllcnNGb3JQbGF0Zm9ybSgpICMgc2V0IHNlbGYubW9kaWZpZXJzLCBzZWxmLm1vZGlmaWVyX2xhYmVsCiAgICAgICAgIHNlbGYubW9kaWZpZXJfdmFycyA9IFtdCkBAIC0zNyw3ICs0MSw2IEBACiAgICAgICAgIHNlbGYuYWR2YW5jZWQgPSBGYWxzZQogICAgICAgICBzZWxmLkNyZWF0ZVdpZGdldHMoKQogICAgICAgICBzZWxmLkxvYWRGaW5hbEtleUxpc3QoKQotICAgICAgICBzZWxmLndpdGhkcmF3KCkgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQogICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQogICAgICAgICBzZWxmLmdlb21ldHJ5KAogICAgICAgICAgICAgICAgICIrJWQrJWQiICUgKApAQCAtNDcsOCArNTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAoKHBhcmVudC53aW5mb19oZWlnaHQoKS8yIC0gc2VsZi53aW5mb19yZXFoZWlnaHQoKS8yKQogICAgICAgICAgICAgICAgICAgICBpZiBub3QgX2h0ZXN0IGVsc2UgMTUwKQogICAgICAgICAgICAgICAgICkgKSAgI2NlbnRyZSBkaWFsb2cgb3ZlciBwYXJlbnQgKG9yIGJlbG93IGh0ZXN0IGJveCkKLSAgICAgICAgc2VsZi5kZWljb25pZnkoKSAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKLSAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCisgICAgICAgIGlmIG5vdCBfdXRlc3Q6CisgICAgICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICNnZW9tZXRyeSBzZXQsIHVuaGlkZQorICAgICAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCiAKICAgICBkZWYgQ3JlYXRlV2lkZ2V0cyhzZWxmKToKICAgICAgICAgZnJhbWVNYWluID0gRnJhbWUoc2VsZixib3JkZXJ3aWR0aD0yLHJlbGllZj1TVU5LRU4pCkBAIC0yNjEsNiArMjY1LDcgQEAKICAgICAgICAgICAgIGtleXNPSyA9IFRydWUKICAgICAgICAgcmV0dXJuIGtleXNPSwogCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKEdldEtleXNEaWFsb2cpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9jb25maWdkaWFsb2cucHkKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9jb25maWdkaWFsb2cucHkKaW5kZXggNWY1YmQzNi4uZmRhNjU1ZiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZ2RpYWxvZy5weQpAQCAtMTAsMTggKzEwLDE4IEBACiAKICIiIgogZnJvbSB0a2ludGVyIGltcG9ydCAqCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiBpbXBvcnQgdGtpbnRlci5jb2xvcmNob29zZXIgYXMgdGtDb2xvckNob29zZXIKIGltcG9ydCB0a2ludGVyLmZvbnQgYXMgdGtGb250CiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBpZGxlbGliLmR5bk9wdGlvbk1lbnVXaWRnZXQgaW1wb3J0IER5bk9wdGlvbk1lbnUKLWZyb20gaWRsZWxpYi5rZXliaW5kaW5nRGlhbG9nIGltcG9ydCBHZXRLZXlzRGlhbG9nCi1mcm9tIGlkbGVsaWIuY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cgaW1wb3J0IEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nCi1mcm9tIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQgaW1wb3J0IEdldEhlbHBTb3VyY2VEaWFsb2cKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuZHlub3B0aW9uIGltcG9ydCBEeW5PcHRpb25NZW51Citmcm9tIGlkbGVsaWIuY29uZmlnX2tleSBpbXBvcnQgR2V0S2V5c0RpYWxvZworZnJvbSBpZGxlbGliLnF1ZXJ5IGltcG9ydCBTZWN0aW9uTmFtZSwgSGVscFNvdXJjZQogZnJvbSBpZGxlbGliLnRhYmJlZHBhZ2VzIGltcG9ydCBUYWJiZWRQYWdlU2V0Ci1mcm9tIGlkbGVsaWIudGV4dFZpZXcgaW1wb3J0IHZpZXdfdGV4dAotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIGlkbGVsaWIudGV4dHZpZXcgaW1wb3J0IHZpZXdfdGV4dAorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKIAogY2xhc3MgQ29uZmlnRGlhbG9nKFRvcGxldmVsKToKIApAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICBzZWxmLmNyZWF0ZV9hY3Rpb25fYnV0dG9ucygpLnBhY2soc2lkZT1CT1RUT00pCiAKICAgICBkZWYgY3JlYXRlX2FjdGlvbl9idXR0b25zKHNlbGYpOgotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgIyBDaGFuZ2luZyB0aGUgZGVmYXVsdCBwYWRkaW5nIG9uIE9TWCByZXN1bHRzIGluIHVucmVhZGFibGUKICAgICAgICAgICAgICMgdGV4dCBpbiB0aGUgYnV0dG9ucwogICAgICAgICAgICAgcGFkZGluZ0FyZ3MgPSB7fQpAQCAtMzQxLDYgKzM0MSw3IEBACiAgICAgICAgIGJ1dHRvblNhdmVDdXN0b21LZXlzID0gQnV0dG9uKAogICAgICAgICAgICAgICAgIGZyYW1lc1sxXSwgdGV4dD0nU2F2ZSBhcyBOZXcgQ3VzdG9tIEtleSBTZXQnLAogICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5TYXZlQXNOZXdLZXlTZXQpCisgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzID0gTGFiZWwoZnJhbWVzWzBdLCBiZD0yKQogCiAgICAgICAgICMjd2lkZ2V0IHBhY2tpbmcKICAgICAgICAgI2JvZHkKQEAgLTM2MSw2ICszNjIsNyBAQAogICAgICAgICBzZWxmLnJhZGlvS2V5c0N1c3RvbS5ncmlkKHJvdz0xLCBjb2x1bW49MCwgc3RpY2t5PVcrTlMpCiAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLmdyaWQocm93PTAsIGNvbHVtbj0xLCBzdGlja3k9TlNFVykKICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5ncmlkKHJvdz0xLCBjb2x1bW49MSwgc3RpY2t5PU5TRVcpCisgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmdyaWQocm93PTAsIGNvbHVtbj0yLCBzdGlja3k9TlNFVywgcGFkeD01LCBwYWR5PTUpCiAgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tS2V5cy5wYWNrKHNpZGU9TEVGVCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSwgcGFkeD0yKQogICAgICAgICBidXR0b25TYXZlQ3VzdG9tS2V5cy5wYWNrKHNpZGU9TEVGVCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSwgcGFkeD0yKQogICAgICAgICBmcmFtZXNbMF0ucGFjayhzaWRlPVRPUCwgZmlsbD1CT1RILCBleHBhbmQ9VHJ1ZSkKQEAgLTQ2NCwyNCArNDY2LDI0IEBACiAgICAgICAgIHJldHVybiBmcmFtZQogCiAgICAgZGVmIEF0dGFjaFZhckNhbGxiYWNrcyhzZWxmKToKLSAgICAgICAgc2VsZi5mb250U2l6ZS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9mb250KQotICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2ZvbnQpCi0gICAgICAgIHNlbGYuZm9udEJvbGQudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfZm9udCkKLSAgICAgICAgc2VsZi5zcGFjZU51bS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9zcGFjZU51bSkKLSAgICAgICAgc2VsZi5jb2xvdXIudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfY29sb3VyKQotICAgICAgICBzZWxmLmJ1aWx0aW5UaGVtZS50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluVGhlbWUpCi0gICAgICAgIHNlbGYuY3VzdG9tVGhlbWUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tVGhlbWUpCi0gICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4udHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfdGhlbWVJc0J1aWx0aW4pCi0gICAgICAgIHNlbGYuaGlnaGxpZ2h0VGFyZ2V0LnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2hpZ2hsaWdodFRhcmdldCkKLSAgICAgICAgc2VsZi5rZXlCaW5kaW5nLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2tleUJpbmRpbmcpCi0gICAgICAgIHNlbGYuYnVpbHRpbktleXMudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfYnVpbHRpbktleXMpCi0gICAgICAgIHNlbGYuY3VzdG9tS2V5cy50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF9jdXN0b21LZXlzKQotICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKQotICAgICAgICBzZWxmLndpbldpZHRoLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5WYXJDaGFuZ2VkX3dpbldpZHRoKQotICAgICAgICBzZWxmLndpbkhlaWdodC50cmFjZV92YXJpYWJsZSgndycsIHNlbGYuVmFyQ2hhbmdlZF93aW5IZWlnaHQpCi0gICAgICAgIHNlbGYuc3RhcnR1cEVkaXQudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCi0gICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfYXV0b1NhdmUpCi0gICAgICAgIHNlbGYuZW5jb2RpbmcudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLlZhckNoYW5nZWRfZW5jb2RpbmcpCisgICAgICAgIHNlbGYuZm9udFNpemUudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9mb250KQorICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfZm9udCkKKyAgICAgICAgc2VsZi5mb250Qm9sZC50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2ZvbnQpCisgICAgICAgIHNlbGYuc3BhY2VOdW0udHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9zcGFjZU51bSkKKyAgICAgICAgc2VsZi5jb2xvdXIudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9jb2xvdXIpCisgICAgICAgIHNlbGYuYnVpbHRpblRoZW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfYnVpbHRpblRoZW1lKQorICAgICAgICBzZWxmLmN1c3RvbVRoZW1lLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tVGhlbWUpCisgICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4udHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF90aGVtZUlzQnVpbHRpbikKKyAgICAgICAgc2VsZi5oaWdobGlnaHRUYXJnZXQudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9oaWdobGlnaHRUYXJnZXQpCisgICAgICAgIHNlbGYua2V5QmluZGluZy50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2tleUJpbmRpbmcpCisgICAgICAgIHNlbGYuYnVpbHRpbktleXMudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluS2V5cykKKyAgICAgICAgc2VsZi5jdXN0b21LZXlzLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfY3VzdG9tS2V5cykKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKQorICAgICAgICBzZWxmLndpbldpZHRoLnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfd2luV2lkdGgpCisgICAgICAgIHNlbGYud2luSGVpZ2h0LnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfd2luSGVpZ2h0KQorICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LnRyYWNlX2FkZCgnd3JpdGUnLCBzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCisgICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfYWRkKCd3cml0ZScsIHNlbGYuVmFyQ2hhbmdlZF9hdXRvU2F2ZSkKKyAgICAgICAgc2VsZi5lbmNvZGluZy50cmFjZV9hZGQoJ3dyaXRlJywgc2VsZi5WYXJDaGFuZ2VkX2VuY29kaW5nKQogCiAgICAgZGVmIHJlbW92ZV92YXJfY2FsbGJhY2tzKHNlbGYpOgogICAgICAgICAiUmVtb3ZlIGNhbGxiYWNrcyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4iCkBAIC00OTIsNyArNDk0LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmtleUJpbmRpbmcsIHNlbGYuYnVpbHRpbktleXMsIHNlbGYuY3VzdG9tS2V5cywKICAgICAgICAgICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLCBzZWxmLndpbldpZHRoLCBzZWxmLndpbkhlaWdodCwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LCBzZWxmLmF1dG9TYXZlLCBzZWxmLmVuY29kaW5nLCk6Ci0gICAgICAgICAgICB2YXIudHJhY2VfdmRlbGV0ZSgndycsIHZhci50cmFjZV92aW5mbygpWzBdWzFdKQorICAgICAgICAgICAgdmFyLnRyYWNlX3JlbW92ZSgnd3JpdGUnLCB2YXIudHJhY2VfaW5mbygpWzBdWzFdKQogCiAgICAgZGVmIFZhckNoYW5nZWRfZm9udChzZWxmLCAqcGFyYW1zKToKICAgICAgICAgJycnV2hlbiBvbmUgZm9udCBhdHRyaWJ1dGUgY2hhbmdlcywgc2F2ZSB0aGVtIGFsbCwgYXMgdGhleSBhcmUKQEAgLTUxNCwxMCArNTE2LDExIEBACiAgICAgICAgIHNlbGYuT25OZXdDb2xvdXJTZXQoKQogCiAgICAgZGVmIFZhckNoYW5nZWRfYnVpbHRpblRoZW1lKHNlbGYsICpwYXJhbXMpOgorICAgICAgICBvbGR0aGVtZXMgPSAoJ0lETEUgQ2xhc3NpYycsICdJRExFIE5ldycpCiAgICAgICAgIHZhbHVlID0gc2VsZi5idWlsdGluVGhlbWUuZ2V0KCkKLSAgICAgICAgaWYgdmFsdWUgPT0gJ0lETEUgRGFyayc6Ci0gICAgICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZScpICE9ICdJRExFIE5ldyc6Ci0gICAgICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lJywgJ0lETEUgQ2xhc3NpYycpCisgICAgICAgIGlmIHZhbHVlIG5vdCBpbiBvbGR0aGVtZXM6CisgICAgICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnVGhlbWUnLCAnbmFtZScpIG5vdCBpbiBvbGR0aGVtZXM6CisgICAgICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lJywgb2xkdGhlbWVzWzBdKQogICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsICdUaGVtZScsICduYW1lMicsIHZhbHVlKQogICAgICAgICAgICAgc2VsZi5uZXdfY3VzdG9tX3RoZW1lLmNvbmZpZyh0ZXh0PSdOZXcgdGhlbWUsIHNlZSBIZWxwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmc9JyM1MDAwMDAnKQpAQCAtNTU3LDggKzU2MCwyMyBAQAogICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnZXh0ZW5zaW9ucycsIGV4dEtleWJpbmRTZWN0aW9uLCBldmVudCwgdmFsdWUpCiAKICAgICBkZWYgVmFyQ2hhbmdlZF9idWlsdGluS2V5cyhzZWxmLCAqcGFyYW1zKToKKyAgICAgICAgb2xka2V5cyA9ICgKKyAgICAgICAgICAgICdJRExFIENsYXNzaWMgV2luZG93cycsCisgICAgICAgICAgICAnSURMRSBDbGFzc2ljIFVuaXgnLAorICAgICAgICAgICAgJ0lETEUgQ2xhc3NpYyBNYWMnLAorICAgICAgICAgICAgJ0lETEUgQ2xhc3NpYyBPU1gnLAorICAgICAgICApCiAgICAgICAgIHZhbHVlID0gc2VsZi5idWlsdGluS2V5cy5nZXQoKQotICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZScsIHZhbHVlKQorICAgICAgICBpZiB2YWx1ZSBub3QgaW4gb2xka2V5czoKKyAgICAgICAgICAgIGlmIGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdLZXlzJywgJ25hbWUnKSBub3QgaW4gb2xka2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZScsIG9sZGtleXNbMF0pCisgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZTInLCB2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmNvbmZpZyh0ZXh0PSdOZXcga2V5IHNldCwgc2VlIEhlbHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnPScjNTAwMDAwJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCAnS2V5cycsICduYW1lJywgdmFsdWUpCisgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywgJ0tleXMnLCAnbmFtZTInLCAnJykKKyAgICAgICAgICAgIHNlbGYubmV3X2N1c3RvbV9rZXlzLmNvbmZpZyh0ZXh0PScnLCBmZz0nYmxhY2snKQogICAgICAgICBzZWxmLkxvYWRLZXlzTGlzdCh2YWx1ZSkKIAogICAgIGRlZiBWYXJDaGFuZ2VkX2N1c3RvbUtleXMoc2VsZiwgKnBhcmFtcyk6CkBAIC02ODMsNyArNzAxLDcgQEAKICAgICBkZWYgR2V0TmV3S2V5c05hbWUoc2VsZiwgbWVzc2FnZSk6CiAgICAgICAgIHVzZWROYW1lcyA9IChpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsICdrZXlzJykgKwogICAgICAgICAgICAgICAgIGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0JywgJ2tleXMnKSkKLSAgICAgICAgbmV3S2V5U2V0ID0gR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2coCisgICAgICAgIG5ld0tleVNldCA9IFNlY3Rpb25OYW1lKAogICAgICAgICAgICAgICAgIHNlbGYsICdOZXcgQ3VzdG9tIEtleSBTZXQnLCBtZXNzYWdlLCB1c2VkTmFtZXMpLnJlc3VsdAogICAgICAgICByZXR1cm4gbmV3S2V5U2V0CiAKQEAgLTc2Nyw4ICs3ODUsMTAgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uU2V0TWVudShpdGVtTGlzdCwgaXRlbUxpc3RbMF0pCiAgICAgICAgICNyZXZlcnQgdG8gZGVmYXVsdCBrZXkgc2V0Ci0gICAgICAgIHNlbGYua2V5c0FyZUJ1aWx0aW4uc2V0KGlkbGVDb25mLmRlZmF1bHRDZmdbJ21haW4nXS5HZXQoJ0tleXMnLCAnZGVmYXVsdCcpKQotICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdLZXlzJywgJ25hbWUnKSkKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi5zZXQoaWRsZUNvbmYuZGVmYXVsdENmZ1snbWFpbiddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5HZXQoJ0tleXMnLCAnZGVmYXVsdCcpKQorICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdLZXlzJywgJ25hbWUnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZGxlQ29uZi5kZWZhdWx0X2tleXMoKSkKICAgICAgICAgI3VzZXIgY2FuJ3QgYmFjayBvdXQgb2YgdGhlc2UgY2hhbmdlcywgdGhleSBtdXN0IGJlIGFwcGxpZWQgbm93CiAgICAgICAgIHNlbGYuU2F2ZUFsbENoYW5nZWRDb25maWdzKCkKICAgICAgICAgc2VsZi5BY3RpdmF0ZUNvbmZpZ0NoYW5nZXMoKQpAQCAtODM2LDcgKzg1Niw3IEBACiAgICAgZGVmIEdldE5ld1RoZW1lTmFtZShzZWxmLCBtZXNzYWdlKToKICAgICAgICAgdXNlZE5hbWVzID0gKGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywgJ2hpZ2hsaWdodCcpICsKICAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsICdoaWdobGlnaHQnKSkKLSAgICAgICAgbmV3VGhlbWUgPSBHZXRDZmdTZWN0aW9uTmFtZURpYWxvZygKKyAgICAgICAgbmV3VGhlbWUgPSBTZWN0aW9uTmFtZSgKICAgICAgICAgICAgICAgICBzZWxmLCAnTmV3IEN1c3RvbSBUaGVtZScsIG1lc3NhZ2UsIHVzZWROYW1lcykucmVzdWx0CiAgICAgICAgIHJldHVybiBuZXdUaGVtZQogCkBAIC05MzksNyArOTU5LDggQEAKICAgICAgICAgICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0UmVtb3ZlLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKIAogICAgIGRlZiBIZWxwTGlzdEl0ZW1BZGQoc2VsZik6Ci0gICAgICAgIGhlbHBTb3VyY2UgPSBHZXRIZWxwU291cmNlRGlhbG9nKHNlbGYsICdOZXcgSGVscCBTb3VyY2UnKS5yZXN1bHQKKyAgICAgICAgaGVscFNvdXJjZSA9IEhlbHBTb3VyY2Uoc2VsZiwgJ05ldyBIZWxwIFNvdXJjZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkucmVzdWx0CiAgICAgICAgIGlmIGhlbHBTb3VyY2U6CiAgICAgICAgICAgICBzZWxmLnVzZXJIZWxwTGlzdC5hcHBlbmQoKGhlbHBTb3VyY2VbMF0sIGhlbHBTb3VyY2VbMV0pKQogICAgICAgICAgICAgc2VsZi5saXN0SGVscC5pbnNlcnQoRU5ELCBoZWxwU291cmNlWzBdKQpAQCAtOTQ5LDE2ICs5NzAsMTcgQEAKICAgICBkZWYgSGVscExpc3RJdGVtRWRpdChzZWxmKToKICAgICAgICAgaXRlbUluZGV4ID0gc2VsZi5saXN0SGVscC5pbmRleChBTkNIT1IpCiAgICAgICAgIGhlbHBTb3VyY2UgPSBzZWxmLnVzZXJIZWxwTGlzdFtpdGVtSW5kZXhdCi0gICAgICAgIG5ld0hlbHBTb3VyY2UgPSBHZXRIZWxwU291cmNlRGlhbG9nKAotICAgICAgICAgICAgICAgIHNlbGYsICdFZGl0IEhlbHAgU291cmNlJywgbWVudUl0ZW09aGVscFNvdXJjZVswXSwKLSAgICAgICAgICAgICAgICBmaWxlUGF0aD1oZWxwU291cmNlWzFdKS5yZXN1bHQKLSAgICAgICAgaWYgKG5vdCBuZXdIZWxwU291cmNlKSBvciAobmV3SGVscFNvdXJjZSA9PSBoZWxwU291cmNlKToKLSAgICAgICAgICAgIHJldHVybiAjbm8gY2hhbmdlcwotICAgICAgICBzZWxmLnVzZXJIZWxwTGlzdFtpdGVtSW5kZXhdID0gbmV3SGVscFNvdXJjZQotICAgICAgICBzZWxmLmxpc3RIZWxwLmRlbGV0ZShpdGVtSW5kZXgpCi0gICAgICAgIHNlbGYubGlzdEhlbHAuaW5zZXJ0KGl0ZW1JbmRleCwgbmV3SGVscFNvdXJjZVswXSkKLSAgICAgICAgc2VsZi5VcGRhdGVVc2VySGVscENoYW5nZWRJdGVtcygpCi0gICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQorICAgICAgICBuZXdIZWxwU291cmNlID0gSGVscFNvdXJjZSgKKyAgICAgICAgICAgICAgICBzZWxmLCAnRWRpdCBIZWxwIFNvdXJjZScsCisgICAgICAgICAgICAgICAgbWVudWl0ZW09aGVscFNvdXJjZVswXSwKKyAgICAgICAgICAgICAgICBmaWxlcGF0aD1oZWxwU291cmNlWzFdLAorICAgICAgICAgICAgICAgICkucmVzdWx0CisgICAgICAgIGlmIG5ld0hlbHBTb3VyY2UgYW5kIG5ld0hlbHBTb3VyY2UgIT0gaGVscFNvdXJjZToKKyAgICAgICAgICAgIHNlbGYudXNlckhlbHBMaXN0W2l0ZW1JbmRleF0gPSBuZXdIZWxwU291cmNlCisgICAgICAgICAgICBzZWxmLmxpc3RIZWxwLmRlbGV0ZShpdGVtSW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RIZWxwLmluc2VydChpdGVtSW5kZXgsIG5ld0hlbHBTb3VyY2VbMF0pCisgICAgICAgICAgICBzZWxmLlVwZGF0ZVVzZXJIZWxwQ2hhbmdlZEl0ZW1zKCkKKyAgICAgICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQogCiAgICAgZGVmIEhlbHBMaXN0SXRlbVJlbW92ZShzZWxmKToKICAgICAgICAgaXRlbUluZGV4ID0gc2VsZi5saXN0SGVscC5pbmRleChBTkNIT1IpCkBAIC0xMDY1LDcgKzEwODcsNyBAQAogICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5TZXRNZW51KGl0ZW1MaXN0LCBjdXJyZW50T3B0aW9uKQogICAgICAgICAgICAgaXRlbUxpc3QgPSBpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsICdrZXlzJykKICAgICAgICAgICAgIGl0ZW1MaXN0LnNvcnQoKQotICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0J1aWx0aW4uU2V0TWVudShpdGVtTGlzdCwgaXRlbUxpc3RbMF0pCisgICAgICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQnVpbHRpbi5TZXRNZW51KGl0ZW1MaXN0LCBpZGxlQ29uZi5kZWZhdWx0X2tleXMoKSkKICAgICAgICAgc2VsZi5TZXRLZXlzVHlwZSgpCiAgICAgICAgICMjbG9hZCBrZXlzZXQgZWxlbWVudCBsaXN0CiAgICAgICAgIGtleVNldE5hbWUgPSBpZGxlQ29uZi5DdXJyZW50S2V5cygpCkBAIC0xMzY3LDEyICsxMzg5LDE4IEBACiBbQ2FuY2VsXSBvbmx5IGNhbmNlbHMgY2hhbmdlcyBtYWRlIHNpbmNlIHRoZSBsYXN0IHNhdmUuCiAnJycKIGhlbHBfcGFnZXMgPSB7Ci0gICAgJ0hpZ2hsaWdodGluZyc6JycnCisgICAgJ0hpZ2hsaWdodGluZyc6ICcnJwogSGlnaGxpZ2h0aW5nOgogVGhlIElETEUgRGFyayBjb2xvciB0aGVtZSBpcyBuZXcgaW4gT2N0b2JlciAyMDE1LiAgSXQgY2FuIG9ubHkKIGJlIHVzZWQgd2l0aCBvbGRlciBJRExFIHJlbGVhc2VzIGlmIGl0IGlzIHNhdmVkIGFzIGEgY3VzdG9tCiB0aGVtZSwgd2l0aCBhIGRpZmZlcmVudCBuYW1lLgotJycnCisnJycsCisgICAgJ0tleXMnOiAnJycKK0tleXM6CitUaGUgSURMRSBNb2Rlcm4gVW5peCBrZXkgc2V0IGlzIG5ldyBpbiBKdW5lIDIwMTYuICBJdCBjYW4gb25seQorYmUgdXNlZCB3aXRoIG9sZGVyIElETEUgcmVsZWFzZXMgaWYgaXQgaXMgc2F2ZWQgYXMgYSBjdXN0b20KK2tleSBzZXQsIHdpdGggYSBkaWZmZXJlbnQgbmFtZS4KKycnJywKIH0KIAogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weSBiL0xpYi9pZGxlbGliL2RlYnVnZ2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0RlYnVnZ2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9kZWJ1Z2dlci5weQppbmRleCBkNWUyMTdkLi5lYTM5M2IxIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQorKysgYi9MaWIvaWRsZWxpYi9kZWJ1Z2dlci5weQpAQCAtMSw5ICsxLDEwIEBACiBpbXBvcnQgb3MKIGltcG9ydCBiZGIKIGZyb20gdGtpbnRlciBpbXBvcnQgKgotZnJvbSBpZGxlbGliLldpbmRvd0xpc3QgaW1wb3J0IExpc3RlZFRvcGxldmVsCi1mcm9tIGlkbGVsaWIuU2Nyb2xsZWRMaXN0IGltcG9ydCBTY3JvbGxlZExpc3QKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCitmcm9tIGlkbGVsaWIud2luZG93cyBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKK2Zyb20gaWRsZWxpYi5zY3JvbGxlZGxpc3QgaW1wb3J0IFNjcm9sbGVkTGlzdAorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKIAogCiBjbGFzcyBJZGIoYmRiLkJkYik6CkBAIC0zNCw4ICszNSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHByZXZfZnJhbWUgPSBmcmFtZS5mX2JhY2sKLSAgICAgICAgICAgIGlmIHByZXZfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lLmNvdW50KCdEZWJ1Z2dlci5weScpOgotICAgICAgICAgICAgICAgICMgKHRoYXQgdGVzdCB3aWxsIGNhdGNoIGJvdGggRGVidWdnZXIucHkgYW5kIFJlbW90ZURlYnVnZ2VyLnB5KQorICAgICAgICAgICAgcHJldl9uYW1lID0gcHJldl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIGlmICdpZGxlbGliJyBpbiBwcmV2X25hbWUgYW5kICdkZWJ1Z2dlcicgaW4gcHJldl9uYW1lOgorICAgICAgICAgICAgICAgICMgY2F0Y2ggYm90aCBpZGxlbGliL2RlYnVnZ2VyLnB5IGFuZCBpZGxlbGliL2RlYnVnZ2VyX3IucHkKKyAgICAgICAgICAgICAgICAjIG9uIGJvdGggcG9zaXggYW5kIHdpbmRvd3MKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgIHJldHVybiBzZWxmLmluX3JwY19jb2RlKHByZXZfZnJhbWUpCiAKQEAgLTM3MCw3ICszNzMsNyBAQAogY2xhc3MgU3RhY2tWaWV3ZXIoU2Nyb2xsZWRMaXN0KToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGZsaXN0LCBndWkpOgotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgIyBBdCBsZWFzdCBvbiB3aXRoIHRoZSBzdG9jayBBcXVhVGsgdmVyc2lvbiBvbiBPU1ggMTAuNCB5b3UnbGwKICAgICAgICAgICAgICMgZ2V0IGEgc2hha2luZyBHVUkgdGhhdCBldmVudHVhbGx5IGtpbGxzIElETEUgaWYgdGhlIHdpZHRoCiAgICAgICAgICAgICAjIGFyZ3VtZW50IGlzIHNwZWNpZmllZC4KQEAgLTUwMiw3ICs1MDUsNyBAQAogICAgICAgICAgICAgIwogICAgICAgICAgICAgIyBUaGVyZSBpcyBhbHNvIGFuIG9ic2N1cmUgYnVnIGluIHNvcnRlZChkaWN0KSB3aGVyZSB0aGUKICAgICAgICAgICAgICMgaW50ZXJwcmV0ZXIgZ2V0cyBpbnRvIGEgbG9vcCByZXF1ZXN0aW5nIG5vbi1leGlzdGluZyBkaWN0WzBdLAotICAgICAgICAgICAgIyBkaWN0WzFdLCBkaWN0WzJdLCBldGMgZnJvbSB0aGUgUmVtb3RlRGVidWdnZXIuRGljdFByb3h5LgorICAgICAgICAgICAgIyBkaWN0WzFdLCBkaWN0WzJdLCBldGMgZnJvbSB0aGUgZGVidWdnZXJfci5EaWN0UHJveHkuCiAgICAgICAgICAgICAjIyMKICAgICAgICAgICAgIGtleXNfbGlzdCA9IGRpY3Qua2V5cygpCiAgICAgICAgICAgICBuYW1lcyA9IHNvcnRlZChrZXlzX2xpc3QpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9SZW1vdGVEZWJ1Z2dlci5weSBiL0xpYi9pZGxlbGliL2RlYnVnZ2VyX3IucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2RlYnVnZ2VyX3IucHkKaW5kZXggYmUyMjYyZi4uYmM5NzEyNyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHkKKysrIGIvTGliL2lkbGVsaWIvZGVidWdnZXJfci5weQpAQCAtMjEsNyArMjEsNyBAQAogIiIiCiAKIGltcG9ydCB0eXBlcwotZnJvbSBpZGxlbGliIGltcG9ydCBEZWJ1Z2dlcgorZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z2dlcgogCiBkZWJ1Z2dpbmcgPSAwCiAKQEAgLTE4Nyw3ICsxODcsNyBAQAogCiAgICAgIiIiCiAgICAgZ3VpX3Byb3h5ID0gR1VJUHJveHkocnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKQotICAgIGlkYiA9IERlYnVnZ2VyLklkYihndWlfcHJveHkpCisgICAgaWRiID0gZGVidWdnZXIuSWRiKGd1aV9wcm94eSkKICAgICBpZGJfYWRhcCA9IElkYkFkYXB0ZXIoaWRiKQogICAgIHJwY2hhbmRsZXIucmVnaXN0ZXIoaWRiX2FkYXBfb2lkLCBpZGJfYWRhcCkKICAgICByZXR1cm4gaWRiX2FkYXBfb2lkCkBAIC0zNjIsNyArMzYyLDcgQEAKICAgICBpZGJfYWRhcF9vaWQgPSBycGNjbHQucmVtb3RlY2FsbCgiZXhlYyIsICJzdGFydF90aGVfZGVidWdnZXIiLFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGd1aV9hZGFwX29pZCwpLCB7fSkKICAgICBpZGJfcHJveHkgPSBJZGJQcm94eShycGNjbHQsIHB5c2hlbGwsIGlkYl9hZGFwX29pZCkKLSAgICBndWkgPSBEZWJ1Z2dlci5EZWJ1Z2dlcihweXNoZWxsLCBpZGJfcHJveHkpCisgICAgZ3VpID0gZGVidWdnZXIuRGVidWdnZXIocHlzaGVsbCwgaWRiX3Byb3h5KQogICAgIGd1aV9hZGFwID0gR1VJQWRhcHRlcihycGNjbHQsIGd1aSkKICAgICBycGNjbHQucmVnaXN0ZXIoZ3VpX2FkYXBfb2lkLCBndWlfYWRhcCkKICAgICByZXR1cm4gZ3VpCkBAIC0zNzMsNyArMzczLDcgQEAKICAgICBSZXF1ZXN0IHRoYXQgdGhlIFJQQ1NlcnZlciBzaHV0IGRvd24gdGhlIHN1YnByb2Nlc3MgZGVidWdnZXIgYW5kIGxpbmsuCiAgICAgVW5yZWdpc3RlciB0aGUgR1VJQWRhcHRlciwgd2hpY2ggd2lsbCBjYXVzZSBhIEdDIG9uIHRoZSBJZGxlIHByb2Nlc3MKICAgICBkZWJ1Z2dlciBhbmQgUlBDIGxpbmsgb2JqZWN0cy4gIChUaGUgc2Vjb25kIHJlZmVyZW5jZSB0byB0aGUgZGVidWdnZXIgR1VJCi0gICAgaXMgZGVsZXRlZCBpbiBQeVNoZWxsLmNsb3NlX3JlbW90ZV9kZWJ1Z2dlcigpLikKKyAgICBpcyBkZWxldGVkIGluIHB5c2hlbGwuY2xvc2VfcmVtb3RlX2RlYnVnZ2VyKCkuKQogCiAgICAgIiIiCiAgICAgY2xvc2Vfc3VicHJvY2Vzc19kZWJ1Z2dlcihycGNjbHQpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9PYmplY3RCcm93c2VyLnB5IGIvTGliL2lkbGVsaWIvZGVidWdvYmoucHkKc2ltaWxhcml0eSBpbmRleCA4OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZGVidWdvYmoucHkKaW5kZXggN2I1N2FhNC4uYzExNmZjZCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9kZWJ1Z29iai5weQpAQCAtOSw5ICs5LDcgQEAKICMgWFhYIFRPIERPOgogIyAtIGZvciBjbGFzc2VzL21vZHVsZXMsIGFkZCAib3BlbiBzb3VyY2UiIHRvIG9iamVjdCBicm93c2VyCiAKLWltcG9ydCByZQotCi1mcm9tIGlkbGVsaWIuVHJlZVdpZGdldCBpbXBvcnQgVHJlZUl0ZW0sIFRyZWVOb2RlLCBTY3JvbGxlZENhbnZhcworZnJvbSBpZGxlbGliLnRyZWUgaW1wb3J0IFRyZWVJdGVtLCBUcmVlTm9kZSwgU2Nyb2xsZWRDYW52YXMKIAogZnJvbSByZXBybGliIGltcG9ydCBSZXByCiAKQEAgLTEyMiwyMSArMTIwLDIwIEBACiAgICAgcmV0dXJuIGMobGFiZWx0ZXh0LCBvYmplY3QsIHNldGZ1bmN0aW9uKQogCiAKLWRlZiBfb2JqZWN0X2Jyb3dzZXIocGFyZW50KToKK2RlZiBfb2JqZWN0X2Jyb3dzZXIocGFyZW50KTogICMgaHRlc3QgIwogICAgIGltcG9ydCBzeXMKLSAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRrCi0gICAgcm9vdCA9IFRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IE9iamVjdEJyb3dzZXIiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKLSAgICByb290LmNvbmZpZ3VyZShiZD0wLCBiZz0ieWVsbG93IikKLSAgICByb290LmZvY3VzX3NldCgpCi0gICAgc2MgPSBTY3JvbGxlZENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbAorICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKKyAgICB0b3AudGl0bGUoIlRlc3QgZGVidWcgb2JqZWN0IGJyb3dzZXIiKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCArIDEwMCwgeSArIDE3NSkpCisgICAgdG9wLmNvbmZpZ3VyZShiZD0wLCBiZz0ieWVsbG93IikKKyAgICB0b3AuZm9jdXNfc2V0KCkKKyAgICBzYyA9IFNjcm9sbGVkQ2FudmFzKHRvcCwgYmc9IndoaXRlIiwgaGlnaGxpZ2h0dGhpY2tuZXNzPTAsIHRha2Vmb2N1cz0xKQogICAgIHNjLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQogICAgIGl0ZW0gPSBtYWtlX29iamVjdHRyZWVpdGVtKCJzeXMiLCBzeXMpCiAgICAgbm9kZSA9IFRyZWVOb2RlKHNjLmNhbnZhcywgTm9uZSwgaXRlbSkKICAgICBub2RlLnVwZGF0ZSgpCi0gICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9SZW1vdGVPYmplY3RCcm93c2VyLnB5IGIvTGliL2lkbGVsaWIvZGVidWdvYmpfci5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZGVidWdvYmpfci5weQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvZGVsZWdhdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9EZWxlZ2F0b3IucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2RlbGVnYXRvci5weQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weSBiL0xpYi9pZGxlbGliL2R5bm9wdGlvbi5weQpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9keW5vcHRpb24ucHkKaW5kZXggNTE1YjRiYS4uOTYyZjJjMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weQorKysgYi9MaWIvaWRsZWxpYi9keW5vcHRpb24ucHkKQEAgLTM0LDEyICszNCwxMiBAQAogICAgICAgICAgICAgc2VsZi52YXJpYWJsZS5zZXQodmFsdWUpCiAKIGRlZiBfZHluX29wdGlvbl9tZW51KHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsCisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCAjICsgU3RyaW5nVmFyLCBCdXR0b24KIAotICAgIHRvcCA9IFRvcGxldmVsKCkKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgdG9wLnRpdGxlKCJUZXRzIGR5bmFtaWMgb3B0aW9uIG1lbnUiKQotICAgIHRvcC5nZW9tZXRyeSgiMjAweDEwMCslZCslZCIgJSAocGFyZW50LndpbmZvX3Jvb3R4KCkgKyAyMDAsCi0gICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiMjAweDEwMCslZCslZCIgJSAoeCArIDI1MCwgeSArIDE3NSkpCiAgICAgdG9wLmZvY3VzX3NldCgpCiAKICAgICB2YXIgPSBTdHJpbmdWYXIodG9wKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRWRpdG9yV2luZG93LnB5IGIvTGliL2lkbGVsaWIvZWRpdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZWRpdG9yLnB5CmluZGV4IDk5NDRkYTMuLjczNzJlY2YgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQorKysgYi9MaWIvaWRsZWxpYi9lZGl0b3IucHkKQEAgLTcsMjcgKzcsMjkgQEAKIGltcG9ydCBzdHJpbmcKIGltcG9ydCBzeXMKIGZyb20gdGtpbnRlciBpbXBvcnQgKgorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCiBpbXBvcnQgdGtpbnRlci5zaW1wbGVkaWFsb2cgYXMgdGtTaW1wbGVEaWFsb2cKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiBpbXBvcnQgdHJhY2ViYWNrCiBpbXBvcnQgd2ViYnJvd3NlcgogCi1mcm9tIGlkbGVsaWIuTXVsdGlDYWxsIGltcG9ydCBNdWx0aUNhbGxDcmVhdG9yCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFdpbmRvd0xpc3QKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRGlhbG9nCi1mcm9tIGlkbGVsaWIgaW1wb3J0IEdyZXBEaWFsb2cKLWZyb20gaWRsZWxpYiBpbXBvcnQgUmVwbGFjZURpYWxvZwotZnJvbSBpZGxlbGliIGltcG9ydCBQeVBhcnNlCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKLWZyb20gaWRsZWxpYiBpbXBvcnQgYWJvdXREaWFsb2csIHRleHRWaWV3LCBjb25maWdEaWFsb2cKLWZyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBpZGxlbGliLm11bHRpY2FsbCBpbXBvcnQgTXVsdGlDYWxsQ3JlYXRvcgorZnJvbSBpZGxlbGliIGltcG9ydCBxdWVyeQorZnJvbSBpZGxlbGliIGltcG9ydCB3aW5kb3dzCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaAorZnJvbSBpZGxlbGliIGltcG9ydCBncmVwCitmcm9tIGlkbGVsaWIgaW1wb3J0IHJlcGxhY2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlwYXJzZQorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaGVscF9hYm91dCwgdGV4dHZpZXcsIGNvbmZpZ2RpYWxvZworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKIGZyb20gaWRsZWxpYiBpbXBvcnQgaGVscAogCiAjIFRoZSBkZWZhdWx0IHRhYiBzZXR0aW5nIGZvciBhIFRleHQgd2lkZ2V0LCBpbiBhdmVyYWdlLXdpZHRoIGNoYXJhY3RlcnMuCiBUS19UQUJXSURUSF9ERUZBVUxUID0gOAotCiBfcHlfdmVyc2lvbiA9ICcgKCVzKScgJSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAKKwogZGVmIF9zcGhpbnhfdmVyc2lvbigpOgogICAgICJGb3JtYXQgc3lzLnZlcnNpb25faW5mbyB0byBwcm9kdWNlIHRoZSBTcGhpbnggdmVyc2lvbiBzdHJpbmcgdXNlZCB0byBpbnN0YWxsIHRoZSBjaG0gZG9jcyIKICAgICBtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsID0gc3lzLnZlcnNpb25faW5mbwpAQCAtNDAsNjMgKzQyLDE2IEBACiAgICAgcmV0dXJuIHJlbGVhc2UKIAogCi1jbGFzcyBIZWxwRGlhbG9nKG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucGFyZW50ID0gTm9uZSAgICAgICMgcGFyZW50IG9mIGhlbHAgd2luZG93Ci0gICAgICAgIHNlbGYuZGxnID0gTm9uZSAgICAgICAgICMgdGhlIGhlbHAgd2luZG93IGl0ZXNlbGYKLQotICAgIGRlZiBkaXNwbGF5KHNlbGYsIHBhcmVudCwgbmVhcj1Ob25lKToKLSAgICAgICAgIiIiIERpc3BsYXkgdGhlIGhlbHAgZGlhbG9nLgotCi0gICAgICAgICAgICBwYXJlbnQgLSBwYXJlbnQgd2lkZ2V0IGZvciB0aGUgaGVscCB3aW5kb3cKLQotICAgICAgICAgICAgbmVhciAtIGEgVG9wbGV2ZWwgd2lkZ2V0IChlLmcuIEVkaXRvcldpbmRvdyBvciBQeVNoZWxsKQotICAgICAgICAgICAgICAgICAgIHRvIHVzZSBhcyBhIHJlZmVyZW5jZSBmb3IgcGxhY2luZyB0aGUgaGVscCB3aW5kb3cKLSAgICAgICAgIiIiCi0gICAgICAgIGltcG9ydCB3YXJuaW5ncyBhcyB3Ci0gICAgICAgIHcud2FybigiRWRpdG9yV2luZG93LkhlbHBEaWFsb2cgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgSWRsZS5cbiIKLSAgICAgICAgICAgICAgICJJdCB3aWxsIGJlIHJlbW92ZWQgaW4gMy42IG9yIGxhdGVyLlxuIgotICAgICAgICAgICAgICAgIkl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHByaXZhdGUgaGVscC5IZWxwV2luZG93XG4iLAotICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgICAgIGlmIHNlbGYuZGxnIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNob3dfZGlhbG9nKHBhcmVudCkKLSAgICAgICAgaWYgbmVhcjoKLSAgICAgICAgICAgIHNlbGYubmVhcndpbmRvdyhuZWFyKQotCi0gICAgZGVmIHNob3dfZGlhbG9nKHNlbGYsIHBhcmVudCk6Ci0gICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50Ci0gICAgICAgIGZuPW9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksJ2hlbHAudHh0JykKLSAgICAgICAgc2VsZi5kbGcgPSBkbGcgPSB0ZXh0Vmlldy52aWV3X2ZpbGUocGFyZW50LCdIZWxwJyxmbiwgbW9kYWw9RmFsc2UpCi0gICAgICAgIGRsZy5iaW5kKCc8RGVzdHJveT4nLCBzZWxmLmRlc3Ryb3ksICcrJykKLQotICAgIGRlZiBuZWFyd2luZG93KHNlbGYsIG5lYXIpOgotICAgICAgICAjIFBsYWNlIHRoZSBoZWxwIGRpYWxvZyBuZWFyIHRoZSB3aW5kb3cgc3BlY2lmaWVkIGJ5IHBhcmVudC4KLSAgICAgICAgIyBOb3RlIC0gdGhpcyBtYXkgbm90IHJlcG9zaXRpb24gdGhlIHdpbmRvdyBpbiBNZXRhY2l0eQotICAgICAgICAjICBpZiAiL2FwcHMvbWV0YWNpdHkvZ2VuZXJhbC9kaXNhYmxlX3dvcmthcm91bmRzIiBpcyBlbmFibGVkCi0gICAgICAgIGRsZyA9IHNlbGYuZGxnCi0gICAgICAgIGdlb20gPSAobmVhci53aW5mb19yb290eCgpICsgMTAsIG5lYXIud2luZm9fcm9vdHkoKSArIDEwKQotICAgICAgICBkbGcud2l0aGRyYXcoKQotICAgICAgICBkbGcuZ2VvbWV0cnkoIj0rJWQrJWQiICUgZ2VvbSkKLSAgICAgICAgZGxnLmRlaWNvbmlmeSgpCi0gICAgICAgIGRsZy5saWZ0KCkKLQotICAgIGRlZiBkZXN0cm95KHNlbGYsIGV2PU5vbmUpOgotICAgICAgICBzZWxmLmRsZyA9IE5vbmUKLSAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCi0KLWhlbHBEaWFsb2cgPSBIZWxwRGlhbG9nKCkgICMgc2luZ2xldG9uIGluc3RhbmNlLCBubyBsb25nZXIgdXNlZAotCi0KIGNsYXNzIEVkaXRvcldpbmRvdyhvYmplY3QpOgotICAgIGZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCi0gICAgZnJvbSBpZGxlbGliLkNvbG9yRGVsZWdhdG9yIGltcG9ydCBDb2xvckRlbGVnYXRvciwgY29sb3JfY29uZmlnCi0gICAgZnJvbSBpZGxlbGliLlVuZG9EZWxlZ2F0b3IgaW1wb3J0IFVuZG9EZWxlZ2F0b3IKLSAgICBmcm9tIGlkbGVsaWIuSU9CaW5kaW5nIGltcG9ydCBJT0JpbmRpbmcsIGZpbGVzeXN0ZW1lbmNvZGluZywgZW5jb2RpbmcKLSAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IEJpbmRpbmdzCisgICAgZnJvbSBpZGxlbGliLnBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKKyAgICBmcm9tIGlkbGVsaWIuY29sb3JpemVyIGltcG9ydCBDb2xvckRlbGVnYXRvciwgY29sb3JfY29uZmlnCisgICAgZnJvbSBpZGxlbGliLnVuZG8gaW1wb3J0IFVuZG9EZWxlZ2F0b3IKKyAgICBmcm9tIGlkbGVsaWIuaW9tZW51IGltcG9ydCBJT0JpbmRpbmcsIGVuY29kaW5nCisgICAgZnJvbSBpZGxlbGliIGltcG9ydCBtYWlubWVudQogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwKLSAgICBmcm9tIGlkbGVsaWIuTXVsdGlTdGF0dXNCYXIgaW1wb3J0IE11bHRpU3RhdHVzQmFyCisgICAgZnJvbSBpZGxlbGliLnN0YXR1c2JhciBpbXBvcnQgTXVsdGlTdGF0dXNCYXIKIAorICAgIGZpbGVzeXN0ZW1lbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSAgIyBmb3IgZmlsZSBuYW1lcwogICAgIGhlbHBfdXJsID0gTm9uZQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0PU5vbmUsIGZpbGVuYW1lPU5vbmUsIGtleT1Ob25lLCByb290PU5vbmUpOgpAQCAtMTM2LDExICs5MSwxMSBAQAogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICBzeXMucHMxID0gJz4+PiAnCiAgICAgICAgIHNlbGYubWVudWJhciA9IE1lbnUocm9vdCkKLSAgICAgICAgc2VsZi50b3AgPSB0b3AgPSBXaW5kb3dMaXN0Lkxpc3RlZFRvcGxldmVsKHJvb3QsIG1lbnU9c2VsZi5tZW51YmFyKQorICAgICAgICBzZWxmLnRvcCA9IHRvcCA9IHdpbmRvd3MuTGlzdGVkVG9wbGV2ZWwocm9vdCwgbWVudT1zZWxmLm1lbnViYXIpCiAgICAgICAgIGlmIGZsaXN0OgogICAgICAgICAgICAgc2VsZi50a2ludGVyX3ZhcnMgPSBmbGlzdC52YXJzCiAgICAgICAgICAgICAjc2VsZi50b3AuaW5zdGFuY2VfZGljdCBtYWtlcyBmbGlzdC5pbnZlcnNlZGljdCBhdmFpbGFibGUgdG8KLSAgICAgICAgICAgICNjb25maWdEaWFsb2cucHkgc28gaXQgY2FuIGFjY2VzcyBhbGwgRWRpdG9yV2luZG93IGluc3RhbmNlcworICAgICAgICAgICAgI2NvbmZpZ2RpYWxvZy5weSBzbyBpdCBjYW4gYWNjZXNzIGFsbCBFZGl0b3JXaW5kb3cgaW5zdGFuY2VzCiAgICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0ge30gICMga2V5czogVGtpbnRlciBldmVudCBuYW1lcwpAQCAtMTU4LDEzICsxMTMsMTAgQEAKICAgICAgICAgICAgICAgICAnd3JhcCc6ICdub25lJywKICAgICAgICAgICAgICAgICAnaGlnaGxpZ2h0dGhpY2tuZXNzJzogMCwKICAgICAgICAgICAgICAgICAnd2lkdGgnOiBzZWxmLndpZHRoLAotICAgICAgICAgICAgICAgICdoZWlnaHQnOiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWlnaHQnLCB0eXBlPSdpbnQnKX0KLSAgICAgICAgaWYgVGtWZXJzaW9uID49IDguNToKLSAgICAgICAgICAgICMgU3RhcnRpbmcgd2l0aCB0ayA4LjUgd2UgaGF2ZSB0byBzZXQgdGhlIG5ldyB0YWJzdHlsZSBvcHRpb24KLSAgICAgICAgICAgICMgdG8gJ3dvcmRwcm9jZXNzb3InIHRvIGFjaGlldmUgdGhlIHNhbWUgZGlzcGxheSBvZiB0YWJzIGFzIGluCi0gICAgICAgICAgICAjIG9sZGVyIHRrIHZlcnNpb25zLgotICAgICAgICAgICAgdGV4dF9vcHRpb25zWyd0YWJzdHlsZSddID0gJ3dvcmRwcm9jZXNzb3InCisgICAgICAgICAgICAgICAgJ3RhYnN0eWxlJzogJ3dvcmRwcm9jZXNzb3InLCAgIyBuZXcgaW4gOC41CisgICAgICAgICAgICAgICAgJ2hlaWdodCc6IGlkbGVDb25mLkdldE9wdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICdtYWluJywgJ0VkaXRvcldpbmRvdycsICdoZWlnaHQnLCB0eXBlPSdpbnQnKSwKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKFRleHQpKHRleHRfZnJhbWUsICoqdGV4dF9vcHRpb25zKQogICAgICAgICBzZWxmLnRvcC5mb2N1c2VkX3dpZGdldCA9IHNlbGYudGV4dAogCkBAIC0xNzMsNyArMTI1LDcgQEAKIAogICAgICAgICBzZWxmLnRvcC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCiAgICAgICAgIHNlbGYudG9wLmJpbmQoIjw8Y2xvc2Utd2luZG93Pj4iLCBzZWxmLmNsb3NlX2V2ZW50KQotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgIyBDb21tYW5kLVcgb24gZWRpdG9yd2luZG93cyBkb2Vzbid0IHdvcmsgd2l0aG91dCB0aGlzLgogICAgICAgICAgICAgdGV4dC5iaW5kKCc8PGNsb3NlLXdpbmRvdz4+Jywgc2VsZi5jbG9zZV9ldmVudCkKICAgICAgICAgICAgICMgU29tZSBPUyBYIHN5c3RlbXMgaGF2ZSBvbmx5IG9uZSBtb3VzZSBidXR0b24sIHNvIHVzZQpAQCAtMzA5LDcgKzI2MSw3IEBACiAgICAgICAgICAgICAgICAgbWVudS5hZGRfc2VwYXJhdG9yKCkKICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxCiAgICAgICAgICAgICBzZWxmLndtZW51X2VuZCA9IGVuZAotICAgICAgICAgICAgV2luZG93TGlzdC5yZWdpc3Rlcl9jYWxsYmFjayhzZWxmLnBvc3R3aW5kb3dzbWVudSkKKyAgICAgICAgICAgIHdpbmRvd3MucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCiAKICAgICAgICAgIyBTb21lIGFic3RyYWN0aW9ucyBzbyBJRExFIGV4dGVuc2lvbnMgYXJlIGNyb3NzLUlERQogICAgICAgICBzZWxmLmFza3llc25vID0gdGtNZXNzYWdlQm94LmFza3llc25vCkBAIC00MTgsNyArMzcwLDcgQEAKICAgICAgICAgICAgIHVuZGVybGluZSwgbGFiZWwgPSBwcmVwc3RyKGxhYmVsKQogICAgICAgICAgICAgbWVudWRpY3RbbmFtZV0gPSBtZW51ID0gTWVudShtYmFyLCBuYW1lPW5hbWUsIHRlYXJvZmY9MCkKICAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9bGFiZWwsIG1lbnU9bWVudSwgdW5kZXJsaW5lPXVuZGVybGluZSkKLSAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0NhcmJvblRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0NhcmJvblRrKCk6CiAgICAgICAgICAgICAjIEluc2VydCB0aGUgYXBwbGljYXRpb24gbWVudQogICAgICAgICAgICAgbWVudWRpY3RbJ2FwcGxpY2F0aW9uJ10gPSBtZW51ID0gTWVudShtYmFyLCBuYW1lPSdhcHBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYXJvZmY9MCkKQEAgLTQzOSw3ICszOTEsNyBAQAogICAgICAgICAgICAgZW5kID0gLTEKICAgICAgICAgaWYgZW5kID4gc2VsZi53bWVudV9lbmQ6CiAgICAgICAgICAgICBtZW51LmRlbGV0ZShzZWxmLndtZW51X2VuZCsxLCBlbmQpCi0gICAgICAgIFdpbmRvd0xpc3QuYWRkX3dpbmRvd3NfdG9fbWVudShtZW51KQorICAgICAgICB3aW5kb3dzLmFkZF93aW5kb3dzX3RvX21lbnUobWVudSkKIAogICAgIHJtZW51ID0gTm9uZQogCkBAIC01MDcsMTcgKzQ1OSwxNyBAQAogCiAgICAgZGVmIGFib3V0X2RpYWxvZyhzZWxmLCBldmVudD1Ob25lKToKICAgICAgICAgIkhhbmRsZSBIZWxwICdBYm91dCBJRExFJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUuYWJvdXRfZGlhbG9nLgotICAgICAgICBhYm91dERpYWxvZy5BYm91dERpYWxvZyhzZWxmLnRvcCwnQWJvdXQgSURMRScpCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5hYm91dF9kaWFsb2cuCisgICAgICAgIGhlbHBfYWJvdXQuQWJvdXREaWFsb2coc2VsZi50b3AsJ0Fib3V0IElETEUnKQogCiAgICAgZGVmIGNvbmZpZ19kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgT3B0aW9ucyAnQ29uZmlndXJlIElETEUnIGV2ZW50LiIKLSAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIG1hY29zeFN1cHBvcnQub3ZlcnJpZGVSb290TWVudS5jb25maWdfZGlhbG9nLgotICAgICAgICBjb25maWdEaWFsb2cuQ29uZmlnRGlhbG9nKHNlbGYudG9wLCdTZXR0aW5ncycpCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5jb25maWdfZGlhbG9nLgorICAgICAgICBjb25maWdkaWFsb2cuQ29uZmlnRGlhbG9nKHNlbGYudG9wLCdTZXR0aW5ncycpCiAKICAgICBkZWYgaGVscF9kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgSGVscCAnSURMRSBIZWxwJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3hTdXBwb3J0Lm92ZXJyaWRlUm9vdE1lbnUuaGVscF9kaWFsb2cuCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBtYWNvc3gub3ZlcnJpZGVSb290TWVudS5oZWxwX2RpYWxvZy4KICAgICAgICAgaWYgc2VsZi5yb290OgogICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5yb290CiAgICAgICAgIGVsc2U6CkBAIC01OTAsMjMgKzU0MiwyMyBAQAogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGZpbmRfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBTZWFyY2hEaWFsb2cuZmluZChzZWxmLnRleHQpCisgICAgICAgIHNlYXJjaC5maW5kKHNlbGYudGV4dCkKICAgICAgICAgcmV0dXJuICJicmVhayIKIAogICAgIGRlZiBmaW5kX2FnYWluX2V2ZW50KHNlbGYsIGV2ZW50KToKLSAgICAgICAgU2VhcmNoRGlhbG9nLmZpbmRfYWdhaW4oc2VsZi50ZXh0KQorICAgICAgICBzZWFyY2guZmluZF9hZ2FpbihzZWxmLnRleHQpCiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKICAgICBkZWYgZmluZF9zZWxlY3Rpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBTZWFyY2hEaWFsb2cuZmluZF9zZWxlY3Rpb24oc2VsZi50ZXh0KQorICAgICAgICBzZWFyY2guZmluZF9zZWxlY3Rpb24oc2VsZi50ZXh0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGZpbmRfaW5fZmlsZXNfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBHcmVwRGlhbG9nLmdyZXAoc2VsZi50ZXh0LCBzZWxmLmlvLCBzZWxmLmZsaXN0KQorICAgICAgICBncmVwLmdyZXAoc2VsZi50ZXh0LCBzZWxmLmlvLCBzZWxmLmZsaXN0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIHJlcGxhY2VfZXZlbnQoc2VsZiwgZXZlbnQpOgotICAgICAgICBSZXBsYWNlRGlhbG9nLnJlcGxhY2Uoc2VsZi50ZXh0KQorICAgICAgICByZXBsYWNlLnJlcGxhY2Uoc2VsZi50ZXh0KQogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgZGVmIGdvdG9fbGluZV9ldmVudChzZWxmLCBldmVudCk6CkBAIC02MjIsNDYgKzU3NCwyNyBAQAogICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKIAogICAgIGRlZiBvcGVuX21vZHVsZShzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgIyBYWFggU2hvdWxkbid0IHRoaXMgYmUgaW4gSU9CaW5kaW5nPworICAgICAgICAiIiJHZXQgbW9kdWxlIG5hbWUgZnJvbSB1c2VyIGFuZCBvcGVuIGl0LgorCisgICAgICAgIFJldHVybiBtb2R1bGUgcGF0aCBvciBOb25lIGZvciBjYWxscyBieSBvcGVuX2NsYXNzX2Jyb3dzZXIKKyAgICAgICAgd2hlbiBsYXR0ZXIgaXMgbm90IGludm9rZWQgaW4gbmFtZWQgZWRpdG9yIHdpbmRvdy4KKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYIFRoaXMsIG9wZW5fY2xhc3NfYnJvd3NlciwgYW5kIG9wZW5fcGF0aF9icm93c2VyCisgICAgICAgICMgd291bGQgZml0IGJldHRlciBpbiBpb21lbnUuSU9CaW5kaW5nLgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBuYW1lID0gc2VsZi50ZXh0LmdldCgic2VsLmZpcnN0IiwgInNlbC5sYXN0IikKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLnRleHQuZ2V0KCJzZWwuZmlyc3QiLCAic2VsLmxhc3QiKS5zdHJpcCgpCiAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKLSAgICAgICAgICAgIG5hbWUgPSAiIgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQotICAgICAgICBuYW1lID0gdGtTaW1wbGVEaWFsb2cuYXNrc3RyaW5nKCJNb2R1bGUiLAotICAgICAgICAgICAgICAgICAiRW50ZXIgdGhlIG5hbWUgb2YgYSBQeXRob24gbW9kdWxlXG4iCi0gICAgICAgICAgICAgICAgICJ0byBzZWFyY2ggb24gc3lzLnBhdGggYW5kIG9wZW46IiwKLSAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCwgaW5pdGlhbHZhbHVlPW5hbWUpCi0gICAgICAgIGlmIG5hbWU6Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5zdHJpcCgpCi0gICAgICAgIGlmIG5vdCBuYW1lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICMgWFhYIE91Z2h0IHRvIGluc2VydCBjdXJyZW50IGZpbGUncyBkaXJlY3RvcnkgaW4gZnJvbnQgb2YgcGF0aAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzcGVjID0gaW1wb3J0bGliLnV0aWwuZmluZF9zcGVjKG5hbWUpCi0gICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgSW1wb3J0RXJyb3IpIGFzIG1zZzoKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkltcG9ydCBlcnJvciIsIHN0cihtc2cpLCBwYXJlbnQ9c2VsZi50ZXh0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNwZWMgaXMgTm9uZToKLSAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkltcG9ydCBlcnJvciIsICJtb2R1bGUgbm90IGZvdW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLmxvYWRlciwgaW1wb3J0bGliLmFiYy5Tb3VyY2VMb2FkZXIpOgotICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSW1wb3J0IGVycm9yIiwgIm5vdCBhIHNvdXJjZS1iYXNlZCBtb2R1bGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGVfcGF0aCA9IHNwZWMubG9hZGVyLmdldF9maWxlbmFtZShuYW1lKQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJbXBvcnQgZXJyb3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2V0X2ZpbGVuYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLmZsaXN0OgotICAgICAgICAgICAgc2VsZi5mbGlzdC5vcGVuKGZpbGVfcGF0aCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuaW8ubG9hZGZpbGUoZmlsZV9wYXRoKQorICAgICAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGZpbGVfcGF0aCA9IHF1ZXJ5Lk1vZHVsZU5hbWUoCisgICAgICAgICAgICAgICAgc2VsZi50ZXh0LCAiT3BlbiBNb2R1bGUiLAorICAgICAgICAgICAgICAgICJFbnRlciB0aGUgbmFtZSBvZiBhIFB5dGhvbiBtb2R1bGVcbiIKKyAgICAgICAgICAgICAgICAidG8gc2VhcmNoIG9uIHN5cy5wYXRoIGFuZCBvcGVuOiIsCisgICAgICAgICAgICAgICAgbmFtZSkucmVzdWx0CisgICAgICAgIGlmIGZpbGVfcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZmxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5mbGlzdC5vcGVuKGZpbGVfcGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pby5sb2FkZmlsZShmaWxlX3BhdGgpCiAgICAgICAgIHJldHVybiBmaWxlX3BhdGgKIAogICAgIGRlZiBvcGVuX2NsYXNzX2Jyb3dzZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CkBAIC02NzMsMTIgKzYwNiwxMiBAQAogICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dCh0YWlsKQotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IENsYXNzQnJvd3NlcgotICAgICAgICBDbGFzc0Jyb3dzZXIuQ2xhc3NCcm93c2VyKHNlbGYuZmxpc3QsIGJhc2UsIFtoZWFkXSkKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBicm93c2VyCisgICAgICAgIGJyb3dzZXIuQ2xhc3NCcm93c2VyKHNlbGYuZmxpc3QsIGJhc2UsIFtoZWFkXSkKIAogICAgIGRlZiBvcGVuX3BhdGhfYnJvd3NlcihzZWxmLCBldmVudD1Ob25lKToKLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBQYXRoQnJvd3NlcgotICAgICAgICBQYXRoQnJvd3Nlci5QYXRoQnJvd3NlcihzZWxmLmZsaXN0KQorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IHBhdGhicm93c2VyCisgICAgICAgIHBhdGhicm93c2VyLlBhdGhCcm93c2VyKHNlbGYuZmxpc3QpCiAKICAgICBkZWYgb3Blbl90dXJ0bGVfZGVtbyhzZWxmLCBldmVudCA9IE5vbmUpOgogICAgICAgICBpbXBvcnQgc3VicHJvY2VzcwpAQCAtNzM5LDcgKzY3Miw3IEBACiAKICAgICBkZWYgUmVzZXRDb2xvcml6ZXIoc2VsZik6CiAgICAgICAgICJVcGRhdGUgdGhlIGNvbG9yIHRoZW1lIgotICAgICAgICAjIENhbGxlZCBmcm9tIHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2sgYW5kIGZyb20gY29uZmlnRGlhbG9nLnB5CisgICAgICAgICMgQ2FsbGVkIGZyb20gc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vayBhbmQgZnJvbSBjb25maWdkaWFsb2cucHkKICAgICAgICAgc2VsZi5fcm1jb2xvcml6ZXIoKQogICAgICAgICBzZWxmLl9hZGRjb2xvcml6ZXIoKQogICAgICAgICBFZGl0b3JXaW5kb3cuY29sb3JfY29uZmlnKHNlbGYudGV4dCkKQEAgLTc1OSwxNCArNjkyLDE0IEBACiAKICAgICBkZWYgUmVzZXRGb250KHNlbGYpOgogICAgICAgICAiVXBkYXRlIHRoZSB0ZXh0IHdpZGdldHMnIGZvbnQgaWYgaXQgaXMgY2hhbmdlZCIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdkaWFsb2cucHkKIAogICAgICAgICBzZWxmLnRleHRbJ2ZvbnQnXSA9IGlkbGVDb25mLkdldEZvbnQoc2VsZi5yb290LCAnbWFpbicsJ0VkaXRvcldpbmRvdycpCiAKICAgICBkZWYgUmVtb3ZlS2V5YmluZGluZ3Moc2VsZik6CiAgICAgICAgICJSZW1vdmUgdGhlIGtleWJpbmRpbmdzIGJlZm9yZSB0aGV5IGFyZSBjaGFuZ2VkLiIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKLSAgICAgICAgc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnZGlhbG9nLnB5CisgICAgICAgIHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQogICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4ga2V5ZGVmcy5pdGVtcygpOgogICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2RlbGV0ZShldmVudCwgKmtleWxpc3QpCiAgICAgICAgIGZvciBleHRlbnNpb25OYW1lIGluIHNlbGYuZ2V0X3N0YW5kYXJkX2V4dGVuc2lvbl9uYW1lcygpOgpAQCAtNzc3LDggKzcxMCw4IEBACiAKICAgICBkZWYgQXBwbHlLZXliaW5kaW5ncyhzZWxmKToKICAgICAgICAgIlVwZGF0ZSB0aGUga2V5YmluZGluZ3MgYWZ0ZXIgdGhleSBhcmUgY2hhbmdlZCIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKLSAgICAgICAgc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnZGlhbG9nLnB5CisgICAgICAgIHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQogICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKCkKICAgICAgICAgZm9yIGV4dGVuc2lvbk5hbWUgaW4gc2VsZi5nZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKCk6CiAgICAgICAgICAgICB4a2V5ZGVmcyA9IGlkbGVDb25mLkdldEV4dGVuc2lvbkJpbmRpbmdzKGV4dGVuc2lvbk5hbWUpCkBAIC03ODYsNyArNzE5LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKHhrZXlkZWZzKQogICAgICAgICAjdXBkYXRlIG1lbnUgYWNjZWxlcmF0b3JzCiAgICAgICAgIG1lbnVFdmVudERpY3QgPSB7fQotICAgICAgICBmb3IgbWVudSBpbiBzZWxmLkJpbmRpbmdzLm1lbnVkZWZzOgorICAgICAgICBmb3IgbWVudSBpbiBzZWxmLm1haW5tZW51Lm1lbnVkZWZzOgogICAgICAgICAgICAgbWVudUV2ZW50RGljdFttZW51WzBdXSA9IHt9CiAgICAgICAgICAgICBmb3IgaXRlbSBpbiBtZW51WzFdOgogICAgICAgICAgICAgICAgIGlmIGl0ZW06CkBAIC04MTMsNyArNzQ2LDcgQEAKIAogICAgIGRlZiBzZXRfbm90YWJzX2luZGVudHdpZHRoKHNlbGYpOgogICAgICAgICAiVXBkYXRlIHRoZSBpbmRlbnR3aWR0aCBpZiBjaGFuZ2VkIGFuZCBub3QgdXNpbmcgdGFicyBpbiB0aGlzIHdpbmRvdyIKLSAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdkaWFsb2cucHkKICAgICAgICAgaWYgbm90IHNlbGYudXNldGFiczoKICAgICAgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnSW5kZW50JywnbnVtLXNwYWNlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2ludCcpCkBAIC05OTMsNyArOTI2LDcgQEAKICAgICBkZWYgX2Nsb3NlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmlvLmZpbGVuYW1lOgogICAgICAgICAgICAgc2VsZi51cGRhdGVfcmVjZW50X2ZpbGVzX2xpc3QobmV3X2ZpbGU9c2VsZi5pby5maWxlbmFtZSkKLSAgICAgICAgV2luZG93TGlzdC51bnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51KQorICAgICAgICB3aW5kb3dzLnVucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCiAgICAgICAgIHNlbGYudW5sb2FkX2V4dGVuc2lvbnMoKQogICAgICAgICBzZWxmLmlvLmNsb3NlKCkKICAgICAgICAgc2VsZi5pbyA9IE5vbmUKQEAgLTEwMzEsMTIgKzk2NCwyNSBAQAogICAgIGRlZiBnZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKHNlbGYpOgogICAgICAgICByZXR1cm4gaWRsZUNvbmYuR2V0RXh0ZW5zaW9ucyhlZGl0b3Jfb25seT1UcnVlKQogCisgICAgZXh0ZmlsZXMgPSB7ICAjIG1hcCBjb25maWctZXh0ZW5zaW9uIHNlY3Rpb24gbmFtZXMgdG8gbmV3IGZpbGUgbmFtZXMKKyAgICAgICAgJ0F1dG9Db21wbGV0ZSc6ICdhdXRvY29tcGxldGUnLAorICAgICAgICAnQXV0b0V4cGFuZCc6ICdhdXRvZXhwYW5kJywKKyAgICAgICAgJ0NhbGxUaXBzJzogJ2NhbGx0aXBzJywKKyAgICAgICAgJ0NvZGVDb250ZXh0JzogJ2NvZGVjb250ZXh0JywKKyAgICAgICAgJ0Zvcm1hdFBhcmFncmFwaCc6ICdwYXJhZ3JhcGgnLAorICAgICAgICAnUGFyZW5NYXRjaCc6ICdwYXJlbm1hdGNoJywKKyAgICAgICAgJ1JzdHJpcEV4dGVuc2lvbic6ICdyc3RyaXAnLAorICAgICAgICAnU2NyaXB0QmluZGluZyc6ICdydW5zY3JpcHQnLAorICAgICAgICAnWm9vbUhlaWdodCc6ICd6b29taGVpZ2h0JywKKyAgICAgICAgfQorCiAgICAgZGVmIGxvYWRfZXh0ZW5zaW9uKHNlbGYsIG5hbWUpOgorICAgICAgICBmbmFtZSA9IHNlbGYuZXh0ZmlsZXMuZ2V0KG5hbWUsIG5hbWUpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnLicgKyBuYW1lLCBwYWNrYWdlPV9fcGFja2FnZV9fKQorICAgICAgICAgICAgICAgIG1vZCA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCcuJyArIGZuYW1lLCBwYWNrYWdlPV9fcGFja2FnZV9fKQogICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShuYW1lKQorICAgICAgICAgICAgICAgIG1vZCA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKGZuYW1lKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICBwcmludCgiXG5GYWlsZWQgdG8gaW1wb3J0IGV4dGVuc2lvbjogIiwgbmFtZSkKICAgICAgICAgICAgIHJhaXNlCkBAIC0xMDYwLDcgKzEwMDYsNyBAQAogCiAgICAgZGVmIGFwcGx5X2JpbmRpbmdzKHNlbGYsIGtleWRlZnM9Tm9uZSk6CiAgICAgICAgIGlmIGtleWRlZnMgaXMgTm9uZToKLSAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLkJpbmRpbmdzLmRlZmF1bHRfa2V5ZGVmcworICAgICAgICAgICAga2V5ZGVmcyA9IHNlbGYubWFpbm1lbnUuZGVmYXVsdF9rZXlkZWZzCiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKICAgICAgICAgdGV4dC5rZXlkZWZzID0ga2V5ZGVmcwogICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4ga2V5ZGVmcy5pdGVtcygpOgpAQCAtMTA3Myw5ICsxMDE5LDkgQEAKICAgICAgICAgTWVudXMgdGhhdCBhcmUgYWJzZW50IG9yIE5vbmUgaW4gc2VsZi5tZW51ZGljdCBhcmUgaWdub3JlZC4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG1lbnVkZWZzIGlzIE5vbmU6Ci0gICAgICAgICAgICBtZW51ZGVmcyA9IHNlbGYuQmluZGluZ3MubWVudWRlZnMKKyAgICAgICAgICAgIG1lbnVkZWZzID0gc2VsZi5tYWlubWVudS5tZW51ZGVmcwogICAgICAgICBpZiBrZXlkZWZzIGlzIE5vbmU6Ci0gICAgICAgICAgICBrZXlkZWZzID0gc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMKKyAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLm1haW5tZW51LmRlZmF1bHRfa2V5ZGVmcwogICAgICAgICBtZW51ZGljdCA9IHNlbGYubWVudWRpY3QKICAgICAgICAgdGV4dCA9IHNlbGYudGV4dAogICAgICAgICBmb3IgbW5hbWUsIGVudHJ5bGlzdCBpbiBtZW51ZGVmczoKQEAgLTEzMDIsNyArMTI0OCw3IEBACiAgICAgICAgICAgICAjIGFkanVzdCBpbmRlbnRhdGlvbiBmb3IgY29udGludWF0aW9ucyBhbmQgYmxvY2sKICAgICAgICAgICAgICMgb3Blbi9jbG9zZSBmaXJzdCBuZWVkIHRvIGZpbmQgdGhlIGxhc3Qgc3RtdAogICAgICAgICAgICAgbG5vID0gaW5kZXgybGluZSh0ZXh0LmluZGV4KCdpbnNlcnQnKSkKLSAgICAgICAgICAgIHkgPSBQeVBhcnNlLlBhcnNlcihzZWxmLmluZGVudHdpZHRoLCBzZWxmLnRhYndpZHRoKQorICAgICAgICAgICAgeSA9IHB5cGFyc2UuUGFyc2VyKHNlbGYuaW5kZW50d2lkdGgsIHNlbGYudGFid2lkdGgpCiAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb250ZXh0X3VzZV9wczE6CiAgICAgICAgICAgICAgICAgZm9yIGNvbnRleHQgaW4gc2VsZi5udW1fY29udGV4dF9saW5lczoKICAgICAgICAgICAgICAgICAgICAgc3RhcnRhdCA9IG1heChsbm8gLSBjb250ZXh0LCAxKQpAQCAtMTMyNiwyMiArMTI3MiwyMiBAQAogICAgICAgICAgICAgICAgIHkuc2V0X2xvKDApCiAKICAgICAgICAgICAgIGMgPSB5LmdldF9jb250aW51YXRpb25fdHlwZSgpCi0gICAgICAgICAgICBpZiBjICE9IFB5UGFyc2UuQ19OT05FOgorICAgICAgICAgICAgaWYgYyAhPSBweXBhcnNlLkNfTk9ORToKICAgICAgICAgICAgICAgICAjIFRoZSBjdXJyZW50IHN0bXQgaGFzbid0IGVuZGVkIHlldC4KLSAgICAgICAgICAgICAgICBpZiBjID09IFB5UGFyc2UuQ19TVFJJTkdfRklSU1RfTElORToKKyAgICAgICAgICAgICAgICBpZiBjID09IHB5cGFyc2UuQ19TVFJJTkdfRklSU1RfTElORToKICAgICAgICAgICAgICAgICAgICAgIyBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiBhIHN0cmluZzsgZG8gbm90IGluZGVudCBhdCBhbGwKICAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBQeVBhcnNlLkNfU1RSSU5HX05FWFRfTElORVM6CisgICAgICAgICAgICAgICAgZWxpZiBjID09IHB5cGFyc2UuQ19TVFJJTkdfTkVYVF9MSU5FUzoKICAgICAgICAgICAgICAgICAgICAgIyBpbnNpZGUgYSBzdHJpbmcgd2hpY2ggc3RhcnRlZCBiZWZvcmUgdGhpcyBsaW5lOwogICAgICAgICAgICAgICAgICAgICAjIGp1c3QgbWltaWMgdGhlIGN1cnJlbnQgaW5kZW50CiAgICAgICAgICAgICAgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCBpbmRlbnQpCi0gICAgICAgICAgICAgICAgZWxpZiBjID09IFB5UGFyc2UuQ19CUkFDS0VUOgorICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBweXBhcnNlLkNfQlJBQ0tFVDoKICAgICAgICAgICAgICAgICAgICAgIyBsaW5lIHVwIHdpdGggdGhlIGZpcnN0IChpZiBhbnkpIGVsZW1lbnQgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICMgbGFzdCBvcGVuIGJyYWNrZXQgc3RydWN0dXJlOyBlbHNlIGluZGVudCBvbmUKICAgICAgICAgICAgICAgICAgICAgIyBsZXZlbCBiZXlvbmQgdGhlIGluZGVudCBvZiB0aGUgbGluZSB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAjIGxhc3Qgb3BlbiBicmFja2V0CiAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVpbmRlbnRfdG8oeS5jb21wdXRlX2JyYWNrZXRfaW5kZW50KCkpCi0gICAgICAgICAgICAgICAgZWxpZiBjID09IFB5UGFyc2UuQ19CQUNLU0xBU0g6CisgICAgICAgICAgICAgICAgZWxpZiBjID09IHB5cGFyc2UuQ19CQUNLU0xBU0g6CiAgICAgICAgICAgICAgICAgICAgICMgaWYgbW9yZSB0aGFuIG9uZSBsaW5lIGluIHRoaXMgc3RtdCBhbHJlYWR5LCBqdXN0CiAgICAgICAgICAgICAgICAgICAgICMgbWltaWMgdGhlIGN1cnJlbnQgaW5kZW50OyBlbHNlIGlmIGluaXRpYWwgbGluZQogICAgICAgICAgICAgICAgICAgICAjIGhhcyBhIHN0YXJ0IG9uIGFuIGFzc2lnbm1lbnQgc3RtdCwgaW5kZW50IHRvCkBAIC0xNjQ0LDcgKzE1OTAsNyBAQAogICAgIGtleWxpc3QgPSBrZXlkZWZzLmdldChldmVudG5hbWUpCiAgICAgIyBpc3N1ZTEwOTQwOiB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB0byBwcmV2ZW50IGhhbmcgd2l0aCBPUyBYIENvY29hIFRrIDguNQogICAgICMgaWYgbm90IGtleWxpc3Q6Ci0gICAgaWYgKG5vdCBrZXlsaXN0KSBvciAobWFjb3N4U3VwcG9ydC5pc0NvY29hVGsoKSBhbmQgZXZlbnRuYW1lIGluIHsKKyAgICBpZiAobm90IGtleWxpc3QpIG9yIChtYWNvc3guaXNDb2NvYVRrKCkgYW5kIGV2ZW50bmFtZSBpbiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8b3Blbi1tb2R1bGU+PiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8Z290by1saW5lPj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PGNoYW5nZS1pbmRlbnR3aWR0aD4+In0pOgpAQCAtMTY3OSwxMiArMTYyNSwxNSBAQAogICAgICAgICBmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCiAgICAgZWxzZToKICAgICAgICAgZmlsZW5hbWUgPSBOb25lCi0gICAgbWFjb3N4U3VwcG9ydC5zZXR1cEFwcChyb290LCBOb25lKQorICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBOb25lKQogICAgIGVkaXQgPSBFZGl0b3JXaW5kb3cocm9vdD1yb290LCBmaWxlbmFtZT1maWxlbmFtZSkKICAgICBlZGl0LnRleHQuYmluZCgiPDxjbG9zZS1hbGwtd2luZG93cz4+IiwgZWRpdC5jbG9zZV9ldmVudCkKICAgICAjIERvZXMgbm90IHN0b3AgZXJyb3IsIG5laXRoZXIgZG9lcyBmb2xsb3dpbmcKICAgICAjIGVkaXQudGV4dC5iaW5kKCI8PGNsb3NlLXdpbmRvdz4+IiwgZWRpdC5jbG9zZV9ldmVudCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X2VkaXRvcicsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKF9lZGl0b3Jfd2luZG93KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRmlsZUxpc3QucHkgYi9MaWIvaWRsZWxpYi9maWxlbGlzdC5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9GaWxlTGlzdC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZmlsZWxpc3QucHkKaW5kZXggYTk5ODlhOC4uYjVhZjkwY2MgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0ZpbGVMaXN0LnB5CisrKyBiL0xpYi9pZGxlbGliL2ZpbGVsaXN0LnB5CkBAIC02LDcgKzYsNyBAQAogY2xhc3MgRmlsZUxpc3Q6CiAKICAgICAjIE4uQi4gdGhpcyBpbXBvcnQgb3ZlcnJpZGRlbiBpbiBQeVNoZWxsRmlsZUxpc3QuCi0gICAgZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93CisgICAgZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6CiAgICAgICAgIHNlbGYucm9vdCA9IHJvb3QKQEAgLTExMSw3ICsxMTEsNyBAQAogCiAKIGRlZiBfdGVzdCgpOgotICAgIGZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IGZpeHdvcmRicmVha3MKKyAgICBmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBmaXh3b3JkYnJlYWtzCiAgICAgaW1wb3J0IHN5cwogICAgIHJvb3QgPSBUaygpCiAgICAgZml4d29yZGJyZWFrcyhyb290KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weSBiL0xpYi9pZGxlbGliL2dyZXAucHkKc2ltaWxhcml0eSBpbmRleCA4MiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvR3JlcERpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvZ3JlcC5weQppbmRleCA3MjFiMjMxLi5jZmIwZWEwIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9HcmVwRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL2dyZXAucHkKQEAgLTEsMTcgKzEsMTYgQEAKIGltcG9ydCBvcwogaW1wb3J0IGZubWF0Y2gKLWltcG9ydCByZSAgIyBmb3IgaHRlc3QKIGltcG9ydCBzeXMKLWZyb20gdGtpbnRlciBpbXBvcnQgU3RyaW5nVmFyLCBCb29sZWFuVmFyLCBDaGVja2J1dHRvbiAgIyBmb3IgR3JlcERpYWxvZwotZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dCwgQnV0dG9uLCBTRUwsIEVORCAgIyBmb3IgaHRlc3QKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCi1mcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorZnJvbSB0a2ludGVyIGltcG9ydCBTdHJpbmdWYXIsIEJvb2xlYW5WYXIKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IENoZWNrYnV0dG9uCitmcm9tIGlkbGVsaWIgaW1wb3J0IHNlYXJjaGVuZ2luZQorZnJvbSBpZGxlbGliLnNlYXJjaGJhc2UgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UKICMgSW1wb3J0aW5nIE91dHB1dFdpbmRvdyBmYWlscyBkdWUgdG8gaW1wb3J0IGxvb3AKICMgRWRpdG9yV2luZG93IC0+IEdyZXBEaWFsb3AgLT4gT3V0cHV0V2luZG93IC0+IEVkaXRvcldpbmRvdwogCiBkZWYgZ3JlcCh0ZXh0LCBpbz1Ob25lLCBmbGlzdD1Ob25lKToKICAgICByb290ID0gdGV4dC5fcm9vdCgpCi0gICAgZW5naW5lID0gU2VhcmNoRW5naW5lLmdldChyb290KQorICAgIGVuZ2luZSA9IHNlYXJjaGVuZ2luZS5nZXQocm9vdCkKICAgICBpZiBub3QgaGFzYXR0cihlbmdpbmUsICJfZ3JlcGRpYWxvZyIpOgogICAgICAgICBlbmdpbmUuX2dyZXBkaWFsb2cgPSBHcmVwRGlhbG9nKHJvb3QsIGVuZ2luZSwgZmxpc3QpCiAgICAgZGlhbG9nID0gZW5naW5lLl9ncmVwZGlhbG9nCkBAIC00NywxMyArNDYsMTAgQEAKICAgICAgICAgc2VsZi5nbG9iZW50ID0gc2VsZi5tYWtlX2VudHJ5KCJJbiBmaWxlczoiLCBzZWxmLmdsb2J2YXIpWzBdCiAKICAgICBkZWYgY3JlYXRlX290aGVyX2J1dHRvbnMoc2VsZik6Ci0gICAgICAgIGYgPSBzZWxmLm1ha2VfZnJhbWUoKVswXQotCi0gICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGYsIGFuY2hvcj0idyIsCi0gICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5yZWN2YXIsCisgICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKAorICAgICAgICAgICAgICAgIHNlbGYubWFrZV9mcmFtZSgpWzBdLCB2YXJpYWJsZT1zZWxmLnJlY3ZhciwKICAgICAgICAgICAgICAgICB0ZXh0PSJSZWN1cnNlIGRvd24gc3ViZGlyZWN0b3JpZXMiKQogICAgICAgICBidG4ucGFjayhzaWRlPSJ0b3AiLCBmaWxsPSJib3RoIikKLSAgICAgICAgYnRuLnNlbGVjdCgpCiAKICAgICBkZWYgY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyhzZWxmKToKICAgICAgICAgU2VhcmNoRGlhbG9nQmFzZS5jcmVhdGVfY29tbWFuZF9idXR0b25zKHNlbGYpCkBAIC02Nyw3ICs2Myw3IEBACiAgICAgICAgIGlmIG5vdCBwYXRoOgogICAgICAgICAgICAgc2VsZi50b3AuYmVsbCgpCiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgZnJvbSBpZGxlbGliLk91dHB1dFdpbmRvdyBpbXBvcnQgT3V0cHV0V2luZG93ICAjIGxlYXZlIGhlcmUhCisgICAgICAgIGZyb20gaWRsZWxpYi5vdXR3aW4gaW1wb3J0IE91dHB1dFdpbmRvdyAgIyBsZWF2ZSBoZXJlIQogICAgICAgICBzYXZlID0gc3lzLnN0ZG91dAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gT3V0cHV0V2luZG93KHNlbGYuZmxpc3QpCkBAIC0xMzEsMTQgKzEyNywxNiBAQAogCiAKIGRlZiBfZ3JlcF9kaWFsb2cocGFyZW50KTogICMgaHRlc3QgIwotICAgIGZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKLSAgICByb290ID0gVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgR3JlcERpYWxvZyIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQorICAgIGZyb20gaWRsZWxpYi5weXNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0LCBTRUwsIEVORAorICAgIGZyb20gdGtpbnRlci50dGsgaW1wb3J0IEJ1dHRvbgorICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKKyAgICB0b3AudGl0bGUoIlRlc3QgR3JlcERpYWxvZyIpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKIAotICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHJvb3QpCi0gICAgdGV4dCA9IFRleHQocm9vdCwgaGVpZ2h0PTUpCisgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3QodG9wKQorICAgIHRleHQgPSBUZXh0KHRvcCwgaGVpZ2h0PTUpCiAgICAgdGV4dC5wYWNrKCkKIAogICAgIGRlZiBzaG93X2dyZXBfZGlhbG9nKCk6CkBAIC0xNDYsOSArMTQ0LDggQEAKICAgICAgICAgZ3JlcCh0ZXh0LCBmbGlzdD1mbGlzdCkKICAgICAgICAgdGV4dC50YWdfcmVtb3ZlKFNFTCwgIjEuMCIsIEVORCkKIAotICAgIGJ1dHRvbiA9IEJ1dHRvbihyb290LCB0ZXh0PSJTaG93IEdyZXBEaWFsb2ciLCBjb21tYW5kPXNob3dfZ3JlcF9kaWFsb2cpCisgICAgYnV0dG9uID0gQnV0dG9uKHRvcCwgdGV4dD0iU2hvdyBHcmVwRGlhbG9nIiwgY29tbWFuZD1zaG93X2dyZXBfZGlhbG9nKQogICAgIGJ1dHRvbi5wYWNrKCkKLSAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICBpbXBvcnQgdW5pdHRlc3QKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2hlbHAucHkgYi9MaWIvaWRsZWxpYi9oZWxwLnB5CmluZGV4IGQwYzU5YzUuLmQxOGQxY2EgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2hlbHAucHkKKysrIGIvTGliL2lkbGVsaWIvaGVscC5weQpAQCAtNCw3ICs0LDcgQEAKIAogSGVscCA9PiBBYm91dCBJRExFOiBkaXBsYXkgQWJvdXQgSWRsZSBkaWFsb2cKIAotPHRvIGJlIG1vdmVkIGhlcmUgZnJvbSBhYm91dERpYWxvZy5weT4KKzx0byBiZSBtb3ZlZCBoZXJlIGZyb20gaGVscF9hYm91dC5weT4KIAogCiBIZWxwID0+IElETEUgSGVscDogRGlzcGxheSBoZWxwLmh0bWwgd2l0aCBwcm9wZXIgZm9ybWF0dGluZy4KQEAgLTI1LDE0ICsyNSwxMSBAQAogc2hvd19pZGxlaGVscCAtIENyZWF0ZSBIZWxwV2luZG93LiAgQ2FsbGVkIGluIEVkaXRvcldpbmRvdy5oZWxwX2RpYWxvZy4KICIiIgogZnJvbSBodG1sLnBhcnNlciBpbXBvcnQgSFRNTFBhcnNlcgotZnJvbSBvcy5wYXRoIGltcG9ydCBhYnNwYXRoLCBkaXJuYW1lLCBpc2RpciwgaXNmaWxlLCBqb2luCi1mcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUb3BsZXZlbCwgRnJhbWUsIFRleHQsIFNjcm9sbGJhciwgTWVudSwgTWVudWJ1dHRvbgorZnJvbSBvcy5wYXRoIGltcG9ydCBhYnNwYXRoLCBkaXJuYW1lLCBpc2ZpbGUsIGpvaW4KK2Zyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIEZyYW1lLCBUZXh0LCBNZW51Citmcm9tIHRraW50ZXIudHRrIGltcG9ydCBNZW51YnV0dG9uLCBTY3JvbGxiYXIKIGZyb20gdGtpbnRlciBpbXBvcnQgZm9udCBhcyB0a2ZvbnQKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotCi11c2VfdHRrID0gRmFsc2UgIyB1bnRpbCBhdmFpbGFibGUgdG8gaW1wb3J0Ci1pZiB1c2VfdHRrOgotICAgIGZyb20gdGtpbnRlci50dGsgaW1wb3J0IE1lbnVidXR0b24KK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKICMjIEFib3V0IElETEUgIyMKIApAQCAtMTk2LDE1ICsxOTMsMTggQEAKICAgICAiRGlzcGxheSBodG1sIHRleHQsIHNjcm9sbGJhciwgYW5kIHRvYy4iCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgZmlsZW5hbWUpOgogICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCi0gICAgICAgIHRleHQgPSBIZWxwVGV4dChzZWxmLCBmaWxlbmFtZSkKKyAgICAgICAgIyBrZWVwIHJlZmVyZW5jZXMgdG8gd2lkZ2V0cyBmb3IgdGVzdCBhY2Nlc3MuCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQgPSBIZWxwVGV4dChzZWxmLCBmaWxlbmFtZSkKICAgICAgICAgc2VsZlsnYmFja2dyb3VuZCddID0gdGV4dFsnYmFja2dyb3VuZCddCi0gICAgICAgIHNjcm9sbCA9IFNjcm9sbGJhcihzZWxmLCBjb21tYW5kPXRleHQueXZpZXcpCisgICAgICAgIHNlbGYudG9jID0gdG9jID0gc2VsZi50b2NfbWVudSh0ZXh0KQorICAgICAgICBzZWxmLnNjcm9sbCA9IHNjcm9sbCA9IFNjcm9sbGJhcihzZWxmLCBjb21tYW5kPXRleHQueXZpZXcpCiAgICAgICAgIHRleHRbJ3lzY3JvbGxjb21tYW5kJ10gPSBzY3JvbGwuc2V0CisKICAgICAgICAgc2VsZi5yb3djb25maWd1cmUoMCwgd2VpZ2h0PTEpCiAgICAgICAgIHNlbGYuY29sdW1uY29uZmlndXJlKDEsIHdlaWdodD0xKSAgIyB0ZXh0Ci0gICAgICAgIHNlbGYudG9jX21lbnUodGV4dCkuZ3JpZChjb2x1bW49MCwgcm93PTAsIHN0aWNreT0nbncnKQotICAgICAgICB0ZXh0LmdyaWQoY29sdW1uPTEsIHJvdz0wLCBzdGlja3k9J25zZXcnKQotICAgICAgICBzY3JvbGwuZ3JpZChjb2x1bW49Miwgcm93PTAsIHN0aWNreT0nbnMnKQorICAgICAgICB0b2MuZ3JpZChyb3c9MCwgY29sdW1uPTAsIHN0aWNreT0nbncnKQorICAgICAgICB0ZXh0LmdyaWQocm93PTAsIGNvbHVtbj0xLCBzdGlja3k9J25zZXcnKQorICAgICAgICBzY3JvbGwuZ3JpZChyb3c9MCwgY29sdW1uPTIsIHN0aWNreT0nbnMnKQogCiAgICAgZGVmIHRvY19tZW51KHNlbGYsIHRleHQpOgogICAgICAgICAiQ3JlYXRlIHRhYmxlIG9mIGNvbnRlbnRzIGFzIGRyb3AtZG93biBtZW51LiIKQEAgLTI2NSw3ICsyNjUsNyBAQAogICAgIGlmIG5vdCBpc2ZpbGUoZmlsZW5hbWUpOgogICAgICAgICAjIHRyeSBjb3B5X3N0cmlwLCBwcmVzZW50IG1lc3NhZ2UKICAgICAgICAgcmV0dXJuCi0gICAgSGVscFdpbmRvdyhwYXJlbnQsIGZpbGVuYW1lLCAnSURMRSBIZWxwJykKKyAgICByZXR1cm4gSGVscFdpbmRvdyhwYXJlbnQsIGZpbGVuYW1lLCAnSURMRSBIZWxwJykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2hlbHAudHh0IGIvTGliL2lkbGVsaWIvaGVscC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZmJlMGIuLjAwMDAwMDAKLS0tIGEvTGliL2lkbGVsaWIvaGVscC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotVGhpcyBmaWxlLCBpZGxlbGliL2hlbHAudHh0IGlzIG91dC1vZi1kYXRlIGFuZCBubyBsb25nZXIgdXNlZCBieSBJZGxlLgotSXQgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUsIHBvc3NpYmx5IGluIDMuNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1bU2VlIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGZvciAqKiBUSVBTICoqIG9uIHVzaW5nIElETEUgISFdCi0KLUlETEUgaXMgdGhlIFB5dGhvbiBJREUgYnVpbHQgd2l0aCB0aGUgdGtpbnRlciBHVUkgdG9vbGtpdC4KLQotSURMRSBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKLS1jb2RlZCBpbiAxMDAlIHB1cmUgUHl0aG9uLCB1c2luZyB0aGUgdGtpbnRlciBHVUkgdG9vbGtpdAotLWNyb3NzLXBsYXRmb3JtOiB3b3JrcyBvbiBXaW5kb3dzLCBVbml4LCBhbmQgT1MgWAotLW11bHRpLXdpbmRvdyB0ZXh0IGVkaXRvciB3aXRoIG11bHRpcGxlIHVuZG8sIFB5dGhvbiBjb2xvcml6aW5nLCBzbWFydCBpbmRlbnQsCi1jYWxsIHRpcHMsIGFuZCBtYW55IG90aGVyIGZlYXR1cmVzCi0tUHl0aG9uIHNoZWxsIHdpbmRvdyAoYS5rLmEgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIpCi0tZGVidWdnZXIgKG5vdCBjb21wbGV0ZSwgYnV0IHlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzLCB2aWV3IGFuZCBzdGVwKQotCi1NZW51czoKLQotSURMRSBoYXMgdHdvIHdpbmRvdyB0eXBlcyB0aGUgU2hlbGwgd2luZG93IGFuZCB0aGUgRWRpdG9yIHdpbmRvdy4gSXQgaXMKLXBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgZWRpdG9yIHdpbmRvd3Mgc2ltdWx0YW5lb3VzbHkuIElETEUncwotbWVudXMgZHluYW1pY2FsbHkgY2hhbmdlIGJhc2VkIG9uIHdoaWNoIHdpbmRvdyBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuIEVhY2ggbWVudQotZG9jdW1lbnRlZCBiZWxvdyBpbmRpY2F0ZXMgd2hpY2ggd2luZG93IHR5cGUgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiAKLQotRmlsZSBNZW51IChTaGVsbCBhbmQgRWRpdG9yKToKLQotICAgICAgICBOZXcgRmlsZSAgICAgICAgIC0tIENyZWF0ZSBhIG5ldyBmaWxlIGVkaXRpbmcgd2luZG93Ci0gICAgICAgIE9wZW4uLi4gICAgICAgICAgLS0gT3BlbiBhbiBleGlzdGluZyBmaWxlCi0gICAgICAgIE9wZW4gTW9kdWxlLi4uICAgLS0gT3BlbiBhbiBleGlzdGluZyBtb2R1bGUgKHNlYXJjaGVzIHN5cy5wYXRoKQotICAgICAgICBSZWNlbnQgRmlsZXMuLi4gIC0tIE9wZW4gYSBsaXN0IG9mIHJlY2VudCBmaWxlcwotICAgICAgICBDbGFzcyBCcm93c2VyICAgIC0tIFNob3cgY2xhc3NlcyBhbmQgbWV0aG9kcyBpbiBjdXJyZW50IGZpbGUKLSAgICAgICAgUGF0aCBCcm93c2VyICAgICAtLSBTaG93IHN5cy5wYXRoIGRpcmVjdG9yaWVzLCBtb2R1bGVzLCBjbGFzc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBtZXRob2RzCi0gICAgICAgIC0tLQotICAgICAgICBTYXZlICAgICAgICAgICAgIC0tIFNhdmUgY3VycmVudCB3aW5kb3cgdG8gdGhlIGFzc29jaWF0ZWQgZmlsZSAodW5zYXZlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd3MgaGF2ZSBhICogYmVmb3JlIGFuZCBhZnRlciB0aGUgd2luZG93IHRpdGxlKQotCi0gICAgICAgIFNhdmUgQXMuLi4gICAgICAgLS0gU2F2ZSBjdXJyZW50IHdpbmRvdyB0byBuZXcgZmlsZSwgd2hpY2ggYmVjb21lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGZpbGUKLSAgICAgICAgU2F2ZSBDb3B5IEFzLi4uICAtLSBTYXZlIGN1cnJlbnQgd2luZG93IHRvIGRpZmZlcmVudCBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgYXNzb2NpYXRlZCBmaWxlCi0gICAgICAgIC0tLQotICAgICAgICBQcmludCBXaW5kb3cgICAgIC0tIFByaW50IHRoZSBjdXJyZW50IHdpbmRvdwotICAgICAgICAtLS0KLSAgICAgICAgQ2xvc2UgICAgICAgICAgICAtLSBDbG9zZSBjdXJyZW50IHdpbmRvdyAoYXNrcyB0byBzYXZlIGlmIHVuc2F2ZWQpCi0gICAgICAgIEV4aXQgICAgICAgICAgICAgLS0gQ2xvc2UgYWxsIHdpbmRvd3MsIHF1aXQgKGFza3MgdG8gc2F2ZSBpZiB1bnNhdmVkKQotCi1FZGl0IE1lbnUgKFNoZWxsIGFuZCBFZGl0b3IpOgotCi0gICAgICAgIFVuZG8gICAgICAgICAgICAgLS0gVW5kbyBsYXN0IGNoYW5nZSB0byBjdXJyZW50IHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhIG1heGltdW0gb2YgMTAwMCBjaGFuZ2VzIG1heSBiZSB1bmRvbmUpCi0gICAgICAgIFJlZG8gICAgICAgICAgICAgLS0gUmVkbyBsYXN0IHVuZG9uZSBjaGFuZ2UgdG8gY3VycmVudCB3aW5kb3cKLSAgICAgICAgLS0tCi0gICAgICAgIEN1dCAgICAgICAgICAgICAgLS0gQ29weSBhIHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGRlbGV0ZSB0aGUgc2VsZWN0aW9uCi0gICAgICAgIENvcHkgICAgICAgICAgICAgLS0gQ29weSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQKLSAgICAgICAgUGFzdGUgICAgICAgICAgICAtLSBJbnNlcnQgc3lzdGVtLXdpZGUgY2xpcGJvYXJkIGludG8gd2luZG93Ci0gICAgICAgIFNlbGVjdCBBbGwgICAgICAgLS0gU2VsZWN0IHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGVkaXQgYnVmZmVyCi0gICAgICAgIC0tLQotICAgICAgICBGaW5kLi4uICAgICAgICAgIC0tIE9wZW4gYSBzZWFyY2ggZGlhbG9nIGJveCB3aXRoIG1hbnkgb3B0aW9ucwotICAgICAgICBGaW5kIEFnYWluICAgICAgIC0tIFJlcGVhdCBsYXN0IHNlYXJjaAotICAgICAgICBGaW5kIFNlbGVjdGlvbiAgIC0tIFNlYXJjaCBmb3IgdGhlIHN0cmluZyBpbiB0aGUgc2VsZWN0aW9uCi0gICAgICAgIEZpbmQgaW4gRmlsZXMuLi4gLS0gT3BlbiBhIHNlYXJjaCBkaWFsb2cgYm94IGZvciBzZWFyY2hpbmcgZmlsZXMKLSAgICAgICAgUmVwbGFjZS4uLiAgICAgICAtLSBPcGVuIGEgc2VhcmNoLWFuZC1yZXBsYWNlIGRpYWxvZyBib3gKLSAgICAgICAgR28gdG8gTGluZSAgICAgICAtLSBBc2sgZm9yIGEgbGluZSBudW1iZXIgYW5kIHNob3cgdGhhdCBsaW5lCi0gICAgICAgIEV4cGFuZCBXb3JkICAgICAgLS0gRXhwYW5kIHRoZSB3b3JkIHlvdSBoYXZlIHR5cGVkIHRvIG1hdGNoIGFub3RoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkIGluIHRoZSBzYW1lIGJ1ZmZlcjsgcmVwZWF0IHRvIGdldCBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGV4cGFuc2lvbgotICAgICAgICBTaG93IENhbGx0aXAgICAgIC0tIEFmdGVyIGFuIHVuY2xvc2VkIHBhcmVudGhlc2lzIGZvciBhIGZ1bmN0aW9uLCBvcGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzbWFsbCB3aW5kb3cgd2l0aCBmdW5jdGlvbiBwYXJhbWV0ZXIgaGludHMKLSAgICAgICAgU2hvdyBQYXJlbnMgICAgICAtLSBIaWdobGlnaHQgdGhlIHN1cnJvdW5kaW5nIHBhcmVudGhlc2lzCi0gICAgICAgIFNob3cgQ29tcGxldGlvbnMgLS0gT3BlbiBhIHNjcm9sbCB3aW5kb3cgYWxsb3dpbmcgc2VsZWN0aW9uIGtleXdvcmRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGF0dHJpYnV0ZXMuIChzZWUgJypUSVBTKicsIGJlbG93KQotCi1Gb3JtYXQgTWVudSAoRWRpdG9yIHdpbmRvdyBvbmx5KToKLQotICAgICAgICBJbmRlbnQgUmVnaW9uICAgICAgIC0tIFNoaWZ0IHNlbGVjdGVkIGxpbmVzIHJpZ2h0IGJ5IHRoZSBpbmRlbnQgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA0IHNwYWNlcykKLSAgICAgICAgRGVkZW50IFJlZ2lvbiAgICAgICAtLSBTaGlmdCBzZWxlY3RlZCBsaW5lcyBsZWZ0IGJ5IHRoZSBpbmRlbnQgd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCA0IHNwYWNlcykKLSAgICAgICAgQ29tbWVudCBPdXQgUmVnaW9uICAtLSBJbnNlcnQgIyMgaW4gZnJvbnQgb2Ygc2VsZWN0ZWQgbGluZXMKLSAgICAgICAgVW5jb21tZW50IFJlZ2lvbiAgICAtLSBSZW1vdmUgbGVhZGluZyAjIG9yICMjIGZyb20gc2VsZWN0ZWQgbGluZXMKLSAgICAgICAgVGFiaWZ5IFJlZ2lvbiAgICAgICAtLSBUdXJucyAqbGVhZGluZyogc3RyZXRjaGVzIG9mIHNwYWNlcyBpbnRvIHRhYnMuCi0gICAgICAgICAgICAgICAgKE5vdGU6IFdlIHJlY29tbWVuZCB1c2luZyA0IHNwYWNlIGJsb2NrcyB0byBpbmRlbnQgUHl0aG9uIGNvZGUuKQotICAgICAgICBVbnRhYmlmeSBSZWdpb24gICAgIC0tIFR1cm4gKmFsbCogdGFicyBpbnRvIHRoZSBjb3JyZW50IG51bWJlciBvZiBzcGFjZXMKLSAgICAgICAgVG9nZ2xlIHRhYnMgICAgICAgICAtLSBPcGVuIGEgZGlhbG9nIHRvIHN3aXRjaCBiZXR3ZWVuIGluZGVudGluZyB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzIGFuZCB0YWJzLgotICAgICAgICBOZXcgSW5kZW50IFdpZHRoLi4uIC0tIE9wZW4gYSBkaWFsb2cgdG8gY2hhbmdlIGluZGVudCB3aWR0aC4gIFRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkIGRlZmF1bHQgYnkgdGhlIFB5dGhvbiBjb21tdW5pdHkgaXMgNAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcy4KLSAgICAgICAgRm9ybWF0IFBhcmFncmFwaCAgICAtLSBSZWZvcm1hdCB0aGUgY3VycmVudCBibGFuay1saW5lLXNlcGFyYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaC4gQWxsIGxpbmVzIGluIHRoZSBwYXJhZ3JhcGggd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCB0byBsZXNzIHRoYW4gODAgY29sdW1ucy4KLSAgICAgICAgLS0tCi0gICAgICAgIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgLS0gUmVtb3ZlZCBhbnkgc3BhY2UgY2hhcmFjdGVycyBhZnRlciB0aGUgZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGxhc3Qgbm9uLXNwYWNlIGNoYXJhY3RlcgotCi1SdW4gTWVudSAoRWRpdG9yIHdpbmRvdyBvbmx5KToKLQotICAgICAgICBQeXRob24gU2hlbGwgLS0gT3BlbiBvciB3YWtlIHVwIHRoZSBQeXRob24gc2hlbGwgd2luZG93Ci0gICAgICAgIC0tLQotICAgICAgICBDaGVjayBNb2R1bGUgLS0gQ2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgbW9kdWxlIGN1cnJlbnRseSBvcGVuIGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgRWRpdG9yIHdpbmRvdy4gIElmIHRoZSBtb2R1bGUgaGFzIG5vdCBiZWVuIHNhdmVkIElETEUKLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUgdGhlIGNvZGUuCi0gICAgICAgIFJ1biBNb2R1bGUgICAtLSBSZXN0YXJ0IHRoZSBzaGVsbCB0byBjbGVhbiB0aGUgZW52aXJvbm1lbnQsIHRoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUgdGhlIGN1cnJlbnRseSBvcGVuIG1vZHVsZS4gSWYgdGhlIG1vZHVsZSBoYXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZWVuIHNhdmVkIElETEUgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gc2F2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuCi0KLVNoZWxsIE1lbnUgKFNoZWxsIHdpbmRvdyBvbmx5KToKLQotICAgICAgICBWaWV3IExhc3QgUmVzdGFydCAtLSBTY3JvbGwgdGhlIHNoZWxsIHdpbmRvdyB0byB0aGUgbGFzdCBTaGVsbCByZXN0YXJ0Ci0gICAgICAgIFJlc3RhcnQgU2hlbGwgICAgIC0tIFJlc3RhcnQgdGhlIHNoZWxsIHRvIGNsZWFuIHRoZSBlbnZpcm9ubWVudAotCi1EZWJ1ZyBNZW51IChTaGVsbCB3aW5kb3cgb25seSk6Ci0KLSAgICAgICAgR28gdG8gRmlsZS9MaW5lICAgLS0gTG9vayBhcm91bmQgdGhlIGluc2VydCBwb2ludCBmb3IgYSBmaWxlbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbGluZSBudW1iZXIsIG9wZW4gdGhlIGZpbGUsIGFuZCBzaG93IHRoZSBsaW5lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VmdWwgdG8gdmlldyB0aGUgc291cmNlIGxpbmVzIHJlZmVyZW5jZWQgaW4gYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIHRyYWNlYmFjay4gIEF2YWlsYWJsZSBpbiB0aGUgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51IG9mIHRoZSBTaGVsbCB3aW5kb3cuCi0gICAgICAgIERlYnVnZ2VyICh0b2dnbGUpIC0tIFRoaXMgZmVhdHVyZSBpcyBub3QgY29tcGxldGUgYW5kIGNvbnNpZGVyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsLiBSdW4gY29tbWFuZHMgaW4gdGhlIHNoZWxsIHVuZGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlci4KLSAgICAgICAgU3RhY2sgVmlld2VyICAgICAgLS0gU2hvdyB0aGUgc3RhY2sgdHJhY2ViYWNrIG9mIHRoZSBsYXN0IGV4Y2VwdGlvbgotICAgICAgICBBdXRvLW9wZW4gU3RhY2sgVmlld2VyICh0b2dnbGUpIC0tIFRvZ2dsZSBhdXRvbWF0aWNhbGx5IG9wZW5pbmcgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sgdmlld2VyIG9uIHVuaGFuZGxlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbgotCi1PcHRpb25zIE1lbnUgKFNoZWxsIGFuZCBFZGl0b3IpOgotCi0gICAgICAgIENvbmZpZ3VyZSBJRExFIC0tIE9wZW4gYSBjb25maWd1cmF0aW9uIGRpYWxvZy4gIEZvbnRzLCBpbmRlbnRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAga2V5YmluZGluZ3MsIGFuZCBjb2xvciB0aGVtZXMgbWF5IGJlIGFsdGVyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0dXAgUHJlZmVyZW5jZXMgbWF5IGJlIHNldCwgYW5kIGFkZGl0aW9uYWwgSGVscAotICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzIGNhbiBiZSBzcGVjaWZpZWQuICBPbiBPUyBYLCBvcGVuIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGRpYWxvZyBieSBzZWxlY3RpbmcgUHJlZmVyZW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGFwcGxpY2F0aW9uIG1lbnUuCi0KLSAgICAgICAgLS0tCi0gICAgICAgIENvZGUgQ29udGV4dCAodG9nZ2xlKSAtLSBPcGVuIGEgcGFuZSBhdCB0aGUgdG9wIG9mIHRoZSBlZGl0IHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggc2hvd3MgdGhlIGJsb2NrIGNvbnRleHQgb2YgdGhlIHNlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGNvZGUgd2hpY2ggaXMgc2Nyb2xsaW5nIG9mZiB0aGUgdG9wIG9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LiBUaGlzIGlzIG5vdCBwcmVzZW50IGluIHRoZSBTaGVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IG9ubHkgdGhlIEVkaXRvciB3aW5kb3cuCi0KLVdpbmRvdyBNZW51IChTaGVsbCBhbmQgRWRpdG9yKToKLQotICAgICAgICBab29tIEhlaWdodCAtLSBUb2dnbGVzIHRoZSB3aW5kb3cgYmV0d2VlbiBub3JtYWwgc2l6ZSAoNDB4ODAgaW5pdGlhbAotICAgICAgICBzZXR0aW5nKSBhbmQgbWF4aW11bSBoZWlnaHQuICBUaGUgaW5pdGlhbCBzaXplIGlzIGluIHRoZSBDb25maWd1cmUKLSAgICAgICAgSURMRSBkaWFsb2cgdW5kZXIgdGhlIGdlbmVyYWwgdGFiLgotICAgICAgICAtLS0KLSAgICAgICAgVGhlIHJlc3Qgb2YgdGhpcyBtZW51IGxpc3RzIHRoZSBuYW1lcyBvZiBhbGwgb3BlbiB3aW5kb3dzOwotICAgICAgICBzZWxlY3Qgb25lIHRvIGJyaW5nIGl0IHRvIHRoZSBmb3JlZ3JvdW5kIChkZWljb25pZnlpbmcgaXQgaWYKLSAgICAgICAgbmVjZXNzYXJ5KS4KLQotSGVscCBNZW51OgotCi0gICAgICAgIEFib3V0IElETEUgIC0tIFZlcnNpb24sIGNvcHlyaWdodCwgbGljZW5zZSwgY3JlZGl0cwotICAgICAgICAtLS0KLSAgICAgICAgSURMRSBIZWxwICAgLS0gRGlzcGxheSB0aGlzIGZpbGUgd2hpY2ggaXMgYSBoZWxwIGZpbGUgZm9yIElETEUKLSAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsaW5nIHRoZSBtZW51IG9wdGlvbnMsIGJhc2ljIGVkaXRpbmcgYW5kIG5hdmlnYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZCBvdGhlciB0aXBzLgotICAgICAgICBQeXRob24gRG9jcyAtLSBBY2Nlc3MgbG9jYWwgUHl0aG9uIGRvY3VtZW50YXRpb24sIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZC4gIE9yIHdpbGwgc3RhcnQgYSB3ZWIgYnJvd3NlciBhbmQgb3BlbgotICAgICAgICAgICAgICAgICAgICAgICBkb2NzLnB5dGhvbi5vcmcgc2hvd2luZyB0aGUgbGF0ZXN0IFB5dGhvbiBkb2N1bWVudGF0aW9uLgotICAgICAgICAtLS0KLSAgICAgICAgQWRkaXRpb25hbCBoZWxwIHNvdXJjZXMgbWF5IGJlIGFkZGVkIGhlcmUgd2l0aCB0aGUgQ29uZmlndXJlIElETEUKLSAgICAgICAgZGlhbG9nIHVuZGVyIHRoZSBHZW5lcmFsIHRhYi4KLQotRWRpdG9yIGNvbnRleHQgbWVudSAoUmlnaHQtY2xpY2sgLyBDb250cm9sLWNsaWNrIG9uIE9TIFggaW4gRWRpdCB3aW5kb3cpOgotCi0gICAgICAgIEN1dCAgICAgICAgICAgICAgLS0gQ29weSBhIHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGRlbGV0ZSB0aGUgc2VsZWN0aW9uCi0gICAgICAgIENvcHkgICAgICAgICAgICAgLS0gQ29weSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQKLSAgICAgICAgUGFzdGUgICAgICAgICAgICAtLSBJbnNlcnQgc3lzdGVtLXdpZGUgY2xpcGJvYXJkIGludG8gd2luZG93Ci0gICAgICAgIFNldCBCcmVha3BvaW50ICAgLS0gU2V0cyBhIGJyZWFrcG9pbnQuIEJyZWFrcG9pbnRzIGFyZSBvbmx5IGVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBkZWJ1Z2dlciBpcyBvcGVuLgotICAgICAgICBDbGVhciBCcmVha3BvaW50IC0tIENsZWFycyB0aGUgYnJlYWtwb2ludCBvbiB0aGF0IGxpbmUKLQotU2hlbGwgY29udGV4dCBtZW51IChSaWdodC1jbGljayAvIENvbnRyb2wtY2xpY2sgb24gT1MgWCBpbiBTaGVsbCB3aW5kb3cpOgotCi0gICAgICAgIEN1dCAgICAgICAgICAgICAgLS0gQ29weSBhIHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGRlbGV0ZSB0aGUgc2VsZWN0aW9uCi0gICAgICAgIENvcHkgICAgICAgICAgICAgLS0gQ29weSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQKLSAgICAgICAgUGFzdGUgICAgICAgICAgICAtLSBJbnNlcnQgc3lzdGVtLXdpZGUgY2xpcGJvYXJkIGludG8gd2luZG93Ci0gICAgICAgIC0tLQotICAgICAgICBHbyB0byBmaWxlL2xpbmUgIC0tIFNhbWUgYXMgaW4gRGVidWcgbWVudQotCi0KLSoqIFRJUFMgKioKLT09PT09PT09PT0KLQotQWRkaXRpb25hbCBIZWxwIFNvdXJjZXM6Ci0KLSAgICAgICAgV2luZG93cyB1c2VycyBjYW4gR29vZ2xlIG9uIHpvcGVzaGVsZi5jaG0gdG8gYWNjZXNzIFpvcGUgaGVscCBmaWxlcyBpbgotICAgICAgICB0aGUgV2luZG93cyBoZWxwIGZvcm1hdC4gIFRoZSBBZGRpdGlvbmFsIEhlbHAgU291cmNlcyBmZWF0dXJlIG9mIHRoZQotICAgICAgICBjb25maWd1cmF0aW9uIEdVSSBzdXBwb3J0cyAuY2htLCBhbG9uZyB3aXRoIGFueSBvdGhlciBmaWxldHlwZXMKLSAgICAgICAgc3VwcG9ydGVkIGJ5IHlvdXIgYnJvd3Nlci4gIFN1cHBseSBhIE1lbnUgSXRlbSB0aXRsZSwgYW5kIGVudGVyIHRoZQotICAgICAgICBsb2NhdGlvbiBpbiB0aGUgSGVscCBGaWxlIFBhdGggc2xvdCBvZiB0aGUgTmV3IEhlbHAgU291cmNlIGRpYWxvZy4gIFVzZQotICAgICAgICBodHRwOi8vIGFuZC9vciB3d3cuIHRvIGlkZW50aWZ5IGV4dGVybmFsIFVSTHMsIG9yIGRvd25sb2FkIHRoZSBmaWxlIGFuZAotICAgICAgICBicm93c2UgZm9yIGl0cyBwYXRoIG9uIHlvdXIgbWFjaGluZSB1c2luZyB0aGUgQnJvd3NlIGJ1dHRvbi4KLQotICAgICAgICBBbGwgdXNlcnMgY2FuIGFjY2VzcyB0aGUgZXh0ZW5zaXZlIHNvdXJjZXMgb2YgaGVscCwgaW5jbHVkaW5nCi0gICAgICAgIHR1dG9yaWFscywgYXZhaWxhYmxlIGF0IGRvY3MucHl0aG9uLm9yZy4gIFNlbGVjdGVkIFVSTHMgY2FuIGJlIGFkZGVkCi0gICAgICAgIG9yIHJlbW92ZWQgZnJvbSB0aGUgSGVscCBtZW51IGF0IGFueSB0aW1lIHVzaW5nIENvbmZpZ3VyZSBJRExFLgotCi1CYXNpYyBlZGl0aW5nIGFuZCBuYXZpZ2F0aW9uOgotCi0gICAgICAgIEJhY2tzcGFjZSBkZWxldGVzIGNoYXIgdG8gdGhlIGxlZnQ7IERFTCBkZWxldGVzIGNoYXIgdG8gdGhlIHJpZ2h0LgotICAgICAgICBDb250cm9sLWJhY2tzcGFjZSBkZWxldGVzIHdvcmQgbGVmdCwgQ29udHJvbC1ERUwgZGVsZXRlcyB3b3JkIHJpZ2h0LgotICAgICAgICBBcnJvdyBrZXlzIGFuZCBQYWdlIFVwL0Rvd24gbW92ZSBhcm91bmQuCi0gICAgICAgIENvbnRyb2wtbGVmdC9yaWdodCBBcnJvdyBtb3ZlcyBieSB3b3JkcyBpbiBhIHN0cmFuZ2UgYnV0IHVzZWZ1bCB3YXkuCi0gICAgICAgIEhvbWUvRW5kIGdvIHRvIGJlZ2luL2VuZCBvZiBsaW5lLgotICAgICAgICBDb250cm9sLUhvbWUvRW5kIGdvIHRvIGJlZ2luL2VuZCBvZiBmaWxlLgotICAgICAgICBTb21lIHVzZWZ1bCBFbWFjcyBiaW5kaW5ncyBhcmUgaW5oZXJpdGVkIGZyb20gVGNsL1RrOgotICAgICAgICAgICAgICAgIENvbnRyb2wtYSAgICAgYmVnaW5uaW5nIG9mIGxpbmUKLSAgICAgICAgICAgICAgICBDb250cm9sLWUgICAgIGVuZCBvZiBsaW5lCi0gICAgICAgICAgICAgICAgQ29udHJvbC1rICAgICBraWxsIGxpbmUgKGJ1dCBkb2Vzbid0IHB1dCBpdCBpbiBjbGlwYm9hcmQpCi0gICAgICAgICAgICAgICAgQ29udHJvbC1sICAgICBjZW50ZXIgd2luZG93IGFyb3VuZCB0aGUgaW5zZXJ0aW9uIHBvaW50Ci0gICAgICAgIFN0YW5kYXJkIGtleWJpbmRpbmdzIChsaWtlIENvbnRyb2wtYyB0byBjb3B5IGFuZCBDb250cm9sLXYgdG8KLSAgICAgICAgcGFzdGUpIG1heSB3b3JrLiAgS2V5YmluZGluZ3MgYXJlIHNlbGVjdGVkIGluIHRoZSBDb25maWd1cmUgSURMRQotICAgICAgICBkaWFsb2cuCi0KLUF1dG9tYXRpYyBpbmRlbnRhdGlvbjoKLQotICAgICAgICBBZnRlciBhIGJsb2NrLW9wZW5pbmcgc3RhdGVtZW50LCB0aGUgbmV4dCBsaW5lIGlzIGluZGVudGVkIGJ5IDQgc3BhY2VzCi0gICAgICAgIChpbiB0aGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBieSBvbmUgdGFiKS4gIEFmdGVyIGNlcnRhaW4ga2V5d29yZHMKLSAgICAgICAgKGJyZWFrLCByZXR1cm4gZXRjLikgdGhlIG5leHQgbGluZSBpcyBkZWRlbnRlZC4gIEluIGxlYWRpbmcKLSAgICAgICAgaW5kZW50YXRpb24sIEJhY2tzcGFjZSBkZWxldGVzIHVwIHRvIDQgc3BhY2VzIGlmIHRoZXkgYXJlIHRoZXJlLiAgVGFiCi0gICAgICAgIGluc2VydHMgc3BhY2VzIChpbiB0aGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBvbmUgdGFiKSwgbnVtYmVyIGRlcGVuZHMgb24KLSAgICAgICAgSW5kZW50IFdpZHRoLiBDdXJyZW50bHkgdGFicyBhcmUgcmVzdHJpY3RlZCB0byBmb3VyIHNwYWNlcyBkdWUKLSAgICAgICAgdG8gVGNsL1RrIGxpbWl0YXRpb25zLgotCi0gICAgICAgIFNlZSBhbHNvIHRoZSBpbmRlbnQvZGVkZW50IHJlZ2lvbiBjb21tYW5kcyBpbiB0aGUgZWRpdCBtZW51LgotCi1Db21wbGV0aW9uczoKLQotICAgICAgICBDb21wbGV0aW9ucyBhcmUgc3VwcGxpZWQgZm9yIGZ1bmN0aW9ucywgY2xhc3NlcywgYW5kIGF0dHJpYnV0ZXMgb2YKLSAgICAgICAgY2xhc3NlcywgYm90aCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkLiAgQ29tcGxldGlvbnMgYXJlIGFsc28gcHJvdmlkZWQKLSAgICAgICAgZm9yIGZpbGVuYW1lcy4KLQotICAgICAgICBUaGUgQXV0b0NvbXBsZXRlV2luZG93IChBQ1cpIHdpbGwgb3BlbiBhZnRlciBhIHByZWRlZmluZWQgZGVsYXkKLSAgICAgICAgKGRlZmF1bHQgaXMgdHdvIHNlY29uZHMpIGFmdGVyIGEgJy4nIG9yIChpbiBhIHN0cmluZykgYW4gb3Muc2VwIGlzCi0gICAgICAgIHR5cGVkLiAgSWYgYWZ0ZXIgb25lIG9mIHRob3NlIGNoYXJhY3RlcnMgKHBsdXMgemVybyBvciBtb3JlIG90aGVyCi0gICAgICAgIGNoYXJhY3RlcnMpIGEgdGFiIGlzIHR5cGVkIHRoZSBBQ1cgd2lsbCBvcGVuIGltbWVkaWF0ZWx5IGlmIGEgcG9zc2libGUKLSAgICAgICAgY29udGludWF0aW9uIGlzIGZvdW5kLgotCi0gICAgICAgIElmIHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIGNvbXBsZXRpb24gZm9yIHRoZSBjaGFyYWN0ZXJzIGVudGVyZWQsIGEKLSAgICAgICAgdGFiIHdpbGwgc3VwcGx5IHRoYXQgY29tcGxldGlvbiB3aXRob3V0IG9wZW5pbmcgdGhlIEFDVy4KLQotICAgICAgICAnU2hvdyBDb21wbGV0aW9ucycgd2lsbCBmb3JjZSBvcGVuIGEgY29tcGxldGlvbnMgd2luZG93LCBieSBkZWZhdWx0IHRoZQotICAgICAgICBDb250cm9sLXNwYWNlIGtleXMgd2lsbCBvcGVuIGEgY29tcGxldGlvbnMgd2luZG93LiAgSW4gYW4gZW1wdHkKLSAgICAgICAgc3RyaW5nLCB0aGlzIHdpbGwgY29udGFpbiB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgT24gYQotICAgICAgICBibGFuayBsaW5lLCBpdCB3aWxsIGNvbnRhaW4gdGhlIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZAotICAgICAgICBjbGFzc2VzIGluIHRoZSBjdXJyZW50IG5hbWUgc3BhY2VzLCBwbHVzIGFueSBtb2R1bGVzIGltcG9ydGVkLiAgSWYgc29tZQotICAgICAgICBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBlbnRlcmVkLCB0aGUgQUNXIHdpbGwgYXR0ZW1wdCB0byBiZSBtb3JlIHNwZWNpZmljLgotCi0gICAgICAgIElmIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGlzIHR5cGVkLCB0aGUgQUNXIHNlbGVjdGlvbiB3aWxsIGp1bXAgdG8gdGhlCi0gICAgICAgIGVudHJ5IG1vc3QgY2xvc2VseSBtYXRjaGluZyB0aG9zZSBjaGFyYWN0ZXJzLiBFbnRlcmluZyBhIHRhYiB3aWxsIGNhdXNlCi0gICAgICAgIHRoZSBsb25nZXN0IG5vbi1hbWJpZ3VvdXMgbWF0Y2ggdG8gYmUgZW50ZXJlZCBpbiB0aGUgRWRpdCB3aW5kb3cgb3IKLSAgICAgICAgU2hlbGwuICBUd28gdGFicyBpbiBhIHJvdyB3aWxsIHN1cHBseSB0aGUgY3VycmVudCBBQ1cgc2VsZWN0aW9uLCBhcwotICAgICAgICB3aWxsIHJldHVybiBvciBhIGRvdWJsZSBjbGljay4gIEN1cnNvciBrZXlzLCBQYWdlIFVwL0Rvd24sIG1vdXNlCi0gICAgICAgIHNlbGVjdGlvbiwgYW5kIHRoZSBzY3JvbGwgd2hlZWwgYWxsIG9wZXJhdGUgb24gdGhlIEFDVy4KLQotICAgICAgICAiSGlkZGVuIiBhdHRyaWJ1dGVzIGNhbiBiZSBhY2Nlc3NlZCBieSB0eXBpbmcgdGhlIGJlZ2lubmluZyBvZiBoaWRkZW4KLSAgICAgICAgbmFtZSBhZnRlciBhICcuJywgIGUuZy4gJ18nLiAgVGhpcyBhbGxvd3MgYWNjZXNzIHRvIG1vZHVsZXMgd2l0aAotICAgICAgICAnX19hbGxfXycgc2V0LCBvciB0byBjbGFzcy1wcml2YXRlIGF0dHJpYnV0ZXMuCi0KLSAgICAgICAgQ29tcGxldGlvbnMgYW5kIHRoZSAnRXhwYW5kIFdvcmQnIGZhY2lsaXR5IGNhbiBzYXZlIGEgbG90IG9mIHR5cGluZyEKLQotICAgICAgICBDb21wbGV0aW9ucyBhcmUgY3VycmVudGx5IGxpbWl0ZWQgdG8gdGhvc2UgaW4gdGhlIG5hbWVzcGFjZXMuICBOYW1lcyBpbgotICAgICAgICBhbiBFZGl0b3Igd2luZG93IHdoaWNoIGFyZSBub3QgdmlhIF9fbWFpbl9fIG9yIHN5cy5tb2R1bGVzIHdpbGwgbm90IGJlCi0gICAgICAgIGZvdW5kLiAgUnVuIHRoZSBtb2R1bGUgb25jZSB3aXRoIHlvdXIgaW1wb3J0cyB0byBjb3JyZWN0IHRoaXMKLSAgICAgICAgc2l0dWF0aW9uLiAgTm90ZSB0aGF0IElETEUgaXRzZWxmIHBsYWNlcyBxdWl0ZSBhIGZldyBtb2R1bGVzIGluCi0gICAgICAgIHN5cy5tb2R1bGVzLCBzbyBtdWNoIGNhbiBiZSBmb3VuZCBieSBkZWZhdWx0LCBlLmcuIHRoZSByZSBtb2R1bGUuCi0KLSAgICAgICAgSWYgeW91IGRvbid0IGxpa2UgdGhlIEFDVyBwb3BwaW5nIHVwIHVuYmlkZGVuLCBzaW1wbHkgbWFrZSB0aGUgZGVsYXkKLSAgICAgICAgbG9uZ2VyIG9yIGRpc2FibGUgdGhlIGV4dGVuc2lvbi4gIE9yIGFub3RoZXIgb3B0aW9uIGlzIHRoZSBkZWxheSBjb3VsZAotICAgICAgICBiZSBzZXQgdG8gemVyby4gQW5vdGhlciBhbHRlcm5hdGl2ZSB0byBwcmV2ZW50aW5nIEFDVyBwb3B1cHMgaXMgdG8KLSAgICAgICAgZGlzYWJsZSB0aGUgY2FsbCB0aXBzIGV4dGVuc2lvbi4KLQotUHl0aG9uIFNoZWxsIHdpbmRvdzoKLQotICAgICAgICBDb250cm9sLWMgaW50ZXJydXB0cyBleGVjdXRpbmcgY29tbWFuZC4KLSAgICAgICAgQ29udHJvbC1kIHNlbmRzIGVuZC1vZi1maWxlOyBjbG9zZXMgd2luZG93IGlmIHR5cGVkIGF0ID4+PiBwcm9tcHQuCi0gICAgICAgIEFsdC0vIGV4cGFuZCB3b3JkIGlzIGFsc28gdXNlZnVsIHRvIHJlZHVjZSB0eXBpbmcuCi0KLSAgICBDb21tYW5kIGhpc3Rvcnk6Ci0KLSAgICAgICAgQWx0LXAgcmV0cmlldmVzIHByZXZpb3VzIGNvbW1hbmQgbWF0Y2hpbmcgd2hhdCB5b3UgaGF2ZSB0eXBlZC4gT24gT1MgWAotICAgICAgICB1c2UgQ29udHJvbC1wLgotICAgICAgICBBbHQtbiByZXRyaWV2ZXMgbmV4dC4gT24gT1MgWCB1c2UgQ29udHJvbC1uLgotICAgICAgICBSZXR1cm4gd2hpbGUgY3Vyc29yIGlzIG9uIGEgcHJldmlvdXMgY29tbWFuZCByZXRyaWV2ZXMgdGhhdCBjb21tYW5kLgotCi0gICAgU3ludGF4IGNvbG9yczoKLQotICAgICAgICBUaGUgY29sb3JpbmcgaXMgYXBwbGllZCBpbiBhIGJhY2tncm91bmQgInRocmVhZCIsIHNvIHlvdSBtYXkKLSAgICAgICAgb2NjYXNpb25hbGx5IHNlZSB1bmNvbG9yaXplZCB0ZXh0LiAgVG8gY2hhbmdlIHRoZSBjb2xvcgotICAgICAgICBzY2hlbWUsIHVzZSB0aGUgQ29uZmlndXJlIElETEUgLyBIaWdobGlnaHRpbmcgZGlhbG9nLgotCi0gICAgUHl0aG9uIGRlZmF1bHQgc3ludGF4IGNvbG9yczoKLQotICAgICAgICBLZXl3b3JkcyAgICAgICAgb3JhbmdlCi0gICAgICAgIEJ1aWx0aW5zICAgICAgICByb3lhbCBwdXJwbGUKLSAgICAgICAgU3RyaW5ncyAgICAgICAgIGdyZWVuCi0gICAgICAgIENvbW1lbnRzICAgICAgICByZWQKLSAgICAgICAgRGVmaW5pdGlvbnMgICAgIGJsdWUKLQotICAgIFNoZWxsIGRlZmF1bHQgY29sb3JzOgotCi0gICAgICAgIENvbnNvbGUgb3V0cHV0ICBicm93bgotICAgICAgICBzdGRvdXQgICAgICAgICAgYmx1ZQotICAgICAgICBzdGRlcnIgICAgICAgICAgcmVkCi0gICAgICAgIHN0ZGluICAgICAgICAgICBibGFjawotCi1PdGhlciBwcmVmZXJlbmNlczoKLQotICAgICAgICBUaGUgZm9udCBwcmVmZXJlbmNlcywgaGlnaGxpZ2h0aW5nLCBrZXlzLCBhbmQgZ2VuZXJhbCBwcmVmZXJlbmNlcyBjYW4KLSAgICAgICAgYmUgY2hhbmdlZCB2aWEgdGhlIENvbmZpZ3VyZSBJRExFIG1lbnUgb3B0aW9uLiAgQmUgc3VyZSB0byBub3RlIHRoYXQKLSAgICAgICAga2V5cyBjYW4gYmUgdXNlciBkZWZpbmVkLCBJRExFIHNoaXBzIHdpdGggZm91ciBidWlsdCBpbiBrZXkgc2V0cy4gSW4KLSAgICAgICAgYWRkaXRpb24gYSB1c2VyIGNhbiBjcmVhdGUgYSBjdXN0b20ga2V5IHNldCBpbiB0aGUgQ29uZmlndXJlIElETEUKLSAgICAgICAgZGlhbG9nIHVuZGVyIHRoZSBrZXlzIHRhYi4KLQotQ29tbWFuZCBsaW5lIHVzYWdlOgotCi0gICAgICAgIEVudGVyIGlkbGUgLWggYXQgdGhlIGNvbW1hbmQgcHJvbXB0IHRvIGdldCBhIHVzYWdlIG1lc3NhZ2UuCi0KLSAgICAgICAgaWRsZS5weSBbLWMgY29tbWFuZF0gWy1kXSBbLWVdIFstc10gWy10IHRpdGxlXSBbYXJnXSAuLi4KLQotICAgICAgICAtYyBjb21tYW5kICBydW4gdGhpcyBjb21tYW5kCi0gICAgICAgIC1kICAgICAgICAgIGVuYWJsZSBkZWJ1Z2dlcgotICAgICAgICAtZSAgICAgICAgICBlZGl0IG1vZGU7IGFyZ3VtZW50cyBhcmUgZmlsZXMgdG8gYmUgZWRpdGVkCi0gICAgICAgIC1zICAgICAgICAgIHJ1biAkSURMRVNUQVJUVVAgb3IgJFBZVEhPTlNUQVJUVVAgZmlyc3QKLSAgICAgICAgLXQgdGl0bGUgICAgc2V0IHRpdGxlIG9mIHNoZWxsIHdpbmRvdwotCi0gICAgICAgIElmIHRoZXJlIGFyZSBhcmd1bWVudHM6Ci0gICAgICAgIDEuIElmIC1lIGlzIHVzZWQsIGFyZ3VtZW50cyBhcmUgZmlsZXMgb3BlbmVkIGZvciBlZGl0aW5nIGFuZCBzeXMuYXJndgotICAgICAgICAgICByZWZsZWN0cyB0aGUgYXJndW1lbnRzIHBhc3NlZCB0byBJRExFIGl0c2VsZi4KLSAgICAgICAgMi4gT3RoZXJ3aXNlLCBpZiAtYyBpcyB1c2VkLCBhbGwgYXJndW1lbnRzIGFyZSBwbGFjZWQgaW4KLSAgICAgICAgICAgc3lzLmFyZ3ZbMTouLi5dLCB3aXRoIHN5cy5hcmd2WzBdIHNldCB0byAtYy4KLSAgICAgICAgMy4gT3RoZXJ3aXNlLCBpZiBuZWl0aGVyIC1lIG5vciAtYyBpcyB1c2VkLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYQotICAgICAgICAgICBzY3JpcHQgd2hpY2ggaXMgZXhlY3V0ZWQgd2l0aCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBpbgotICAgICAgICAgICBzeXMuYXJndlsxOi4uLl0gIGFuZCBzeXMuYXJndlswXSBzZXQgdG8gdGhlIHNjcmlwdCBuYW1lLiAgSWYgdGhlCi0gICAgICAgICAgIHNjcmlwdCBuYW1lIGlzIC0sIG5vIHNjcmlwdCBpcyBleGVjdXRlZCBidXQgYW4gaW50ZXJhY3RpdmUgUHl0aG9uCi0gICAgICAgICAgIHNlc3Npb24gaXMgc3RhcnRlZDsgdGhlIGFyZ3VtZW50cyBhcmUgc3RpbGwgYXZhaWxhYmxlIGluIHN5cy5hcmd2LgotCi1SdW5uaW5nIHdpdGhvdXQgYSBzdWJwcm9jZXNzOiAoREVQUkVDQVRFRCBpbiBQeXRob24gMy40IHNlZSBJc3N1ZSAxNjEyMykKLQotICAgICAgICBJZiBJRExFIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgLW4gY29tbWFuZCBsaW5lIHN3aXRjaCBpdCB3aWxsIHJ1biBpbiBhCi0gICAgICAgIHNpbmdsZSBwcm9jZXNzIGFuZCB3aWxsIG5vdCBjcmVhdGUgdGhlIHN1YnByb2Nlc3Mgd2hpY2ggcnVucyB0aGUgUlBDCi0gICAgICAgIFB5dGhvbiBleGVjdXRpb24gc2VydmVyLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIFB5dGhvbiBjYW5ub3QgY3JlYXRlCi0gICAgICAgIHRoZSBzdWJwcm9jZXNzIG9yIHRoZSBSUEMgc29ja2V0IGludGVyZmFjZSBvbiB5b3VyIHBsYXRmb3JtLiAgSG93ZXZlciwKLSAgICAgICAgaW4gdGhpcyBtb2RlIHVzZXIgY29kZSBpcyBub3QgaXNvbGF0ZWQgZnJvbSBJRExFIGl0c2VsZi4gIEFsc28sIHRoZQotICAgICAgICBlbnZpcm9ubWVudCBpcyBub3QgcmVzdGFydGVkIHdoZW4gUnVuL1J1biBNb2R1bGUgKEY1KSBpcyBzZWxlY3RlZC4gIElmCi0gICAgICAgIHlvdXIgY29kZSBoYXMgYmVlbiBtb2RpZmllZCwgeW91IG11c3QgcmVsb2FkKCkgdGhlIGFmZmVjdGVkIG1vZHVsZXMgYW5kCi0gICAgICAgIHJlLWltcG9ydCBhbnkgc3BlY2lmaWMgaXRlbXMgKGUuZy4gZnJvbSBmb28gaW1wb3J0IGJheikgaWYgdGhlIGNoYW5nZXMKLSAgICAgICAgYXJlIHRvIHRha2UgZWZmZWN0LiAgRm9yIHRoZXNlIHJlYXNvbnMsIGl0IGlzIHByZWZlcmFibGUgdG8gcnVuIElETEUKLSAgICAgICAgd2l0aCB0aGUgZGVmYXVsdCBzdWJwcm9jZXNzIGlmIGF0IGFsbCBwb3NzaWJsZS4KLQotRXh0ZW5zaW9uczoKLQotICAgICAgICBJRExFIGNvbnRhaW5zIGFuIGV4dGVuc2lvbiBmYWNpbGl0eS4gIFNlZSB0aGUgYmVnaW5uaW5nIG9mCi0gICAgICAgIGNvbmZpZy1leHRlbnNpb25zLmRlZiBpbiB0aGUgaWRsZWxpYiBkaXJlY3RvcnkgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCi0gICAgICAgIFRoZSBkZWZhdWx0IGV4dGVuc2lvbnMgYXJlIGN1cnJlbnRseToKLQotICAgICAgICAgICAgICAgIEZvcm1hdFBhcmFncmFwaAotICAgICAgICAgICAgICAgIEF1dG9FeHBhbmQKLSAgICAgICAgICAgICAgICBab29tSGVpZ2h0Ci0gICAgICAgICAgICAgICAgU2NyaXB0QmluZGluZwotICAgICAgICAgICAgICAgIENhbGxUaXBzCi0gICAgICAgICAgICAgICAgUGFyZW5NYXRjaAotICAgICAgICAgICAgICAgIEF1dG9Db21wbGV0ZQotICAgICAgICAgICAgICAgIENvZGVDb250ZXh0CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9hYm91dERpYWxvZy5weSBiL0xpYi9pZGxlbGliL2hlbHBfYWJvdXQucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvYWJvdXREaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2hlbHBfYWJvdXQucHkKaW5kZXggYThmNzVkMi4uNTRmMzU5OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvYWJvdXREaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvaGVscF9hYm91dC5weQpAQCAtNSw3ICs1LDcgQEAKIGltcG9ydCBvcwogZnJvbSBzeXMgaW1wb3J0IHZlcnNpb24KIGZyb20gdGtpbnRlciBpbXBvcnQgKgotZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0VmlldworZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0dmlldwogCiBjbGFzcyBBYm91dERpYWxvZyhUb3BsZXZlbCk6CiAgICAgIiIiTW9kYWwgYWJvdXQgZGlhbG9nIGZvciBpZGxlCkBAIC0xMzUsMTcgKzEzNSwxNyBAQAogICAgIGRlZiBkaXNwbGF5X3ByaW50ZXJfdGV4dChzZWxmLCB0aXRsZSwgcHJpbnRlcik6CiAgICAgICAgIHByaW50ZXIuX1ByaW50ZXJfX3NldHVwKCkKICAgICAgICAgdGV4dCA9ICdcbicuam9pbihwcmludGVyLl9QcmludGVyX19saW5lcykKLSAgICAgICAgdGV4dFZpZXcudmlld190ZXh0KHNlbGYsIHRpdGxlLCB0ZXh0KQorICAgICAgICB0ZXh0dmlldy52aWV3X3RleHQoc2VsZiwgdGl0bGUsIHRleHQpCiAKICAgICBkZWYgZGlzcGxheV9maWxlX3RleHQoc2VsZiwgdGl0bGUsIGZpbGVuYW1lLCBlbmNvZGluZz1Ob25lKToKICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCBmaWxlbmFtZSkKLSAgICAgICAgdGV4dFZpZXcudmlld19maWxlKHNlbGYsIHRpdGxlLCBmbiwgZW5jb2RpbmcpCisgICAgICAgIHRleHR2aWV3LnZpZXdfZmlsZShzZWxmLCB0aXRsZSwgZm4sIGVuY29kaW5nKQogCiAgICAgZGVmIE9rKHNlbGYsIGV2ZW50PU5vbmUpOgogICAgICAgICBzZWxmLmRlc3Ryb3koKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfaGVscGFib3V0JywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9oZWxwX2Fib3V0JywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKEFib3V0RGlhbG9nKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvSWRsZUhpc3RvcnkucHkgYi9MaWIvaWRsZWxpYi9oaXN0b3J5LnB5CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0lkbGVIaXN0b3J5LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9oaXN0b3J5LnB5CmluZGV4IDA3OGFmMjkuLjYwNjhkNGYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0lkbGVIaXN0b3J5LnB5CisrKyBiL0xpYi9pZGxlbGliL2hpc3RvcnkucHkKQEAgLTEsMTEgKzEsMTEgQEAKICJJbXBsZW1lbnQgSWRsZSBTaGVsbCBoaXN0b3J5IG1lY2hhbmlzbSB3aXRoIEhpc3RvcnkgY2xhc3MiCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAogY2xhc3MgSGlzdG9yeToKICAgICAnJycgSW1wbGVtZW50IElkbGUgU2hlbGwgaGlzdG9yeSBtZWNoYW5pc20uCiAKLSAgICBzdG9yZSAtIFN0b3JlIHNvdXJjZSBzdGF0ZW1lbnQgKGNhbGxlZCBmcm9tIFB5U2hlbGwucmVzZXRvdXRwdXQpLgorICAgIHN0b3JlIC0gU3RvcmUgc291cmNlIHN0YXRlbWVudCAoY2FsbGVkIGZyb20gcHlzaGVsbC5yZXNldG91dHB1dCkuCiAgICAgZmV0Y2ggLSBGZXRjaCBzdG9yZWQgc3RhdGVtZW50IG1hdGNoaW5nIHByZWZpeCBhbHJlYWR5IGVudGVyZWQuCiAgICAgaGlzdG9yeV9uZXh0IC0gQm91bmQgdG8gPDxoaXN0b3J5LW5leHQ+PiBldmVudCAoZGVmYXVsdCBBbHQtTikuCiAgICAgaGlzdG9yeV9wcmV2IC0gQm91bmQgdG8gPDxoaXN0b3J5LXByZXY+PiBldmVudCAoZGVmYXVsdCBBbHQtUCkuCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9IeXBlclBhcnNlci5weSBiL0xpYi9pZGxlbGliL2h5cGVycGFyc2VyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL0h5cGVyUGFyc2VyLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9oeXBlcnBhcnNlci5weQppbmRleCA3N2NiMDU3Li5mOTA0YTM5IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9IeXBlclBhcnNlci5weQorKysgYi9MaWIvaWRsZWxpYi9oeXBlcnBhcnNlci5weQpAQCAtNyw3ICs3LDcgQEAKIAogaW1wb3J0IHN0cmluZwogZnJvbSBrZXl3b3JkIGltcG9ydCBpc2tleXdvcmQKLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlQYXJzZQorZnJvbSBpZGxlbGliIGltcG9ydCBweXBhcnNlCiAKIAogIyBhbGwgQVNDSUkgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYW4gaWRlbnRpZmllcgpAQCAtMzAsNyArMzAsNyBAQAogICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQgPSBlZGl0d2luLnRleHQKIAotICAgICAgICBwYXJzZXIgPSBQeVBhcnNlLlBhcnNlcihlZGl0d2luLmluZGVudHdpZHRoLCBlZGl0d2luLnRhYndpZHRoKQorICAgICAgICBwYXJzZXIgPSBweXBhcnNlLlBhcnNlcihlZGl0d2luLmluZGVudHdpZHRoLCBlZGl0d2luLnRhYndpZHRoKQogCiAgICAgICAgIGRlZiBpbmRleDJsaW5lKGluZGV4KToKICAgICAgICAgICAgIHJldHVybiBpbnQoZmxvYXQoaW5kZXgpKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZS5weSBiL0xpYi9pZGxlbGliL2lkbGUucHkKaW5kZXggYTI0OTU1Ny4uYzAxY2Y5OSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlLnB5CkBAIC03LDUgKzcsNSBAQAogaWRsZWxpYl9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpKQogc3lzLnBhdGguaW5zZXJ0KDAsIGlkbGVsaWJfZGlyKQogCi1pbXBvcnQgaWRsZWxpYi5QeVNoZWxsCi1pZGxlbGliLlB5U2hlbGwubWFpbigpCitpbXBvcnQgaWRsZWxpYi5weXNoZWxsCitpZGxlbGliLnB5c2hlbGwubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlLnB5dyBiL0xpYi9pZGxlbGliL2lkbGUucHl3CmluZGV4IDE0MmNiMzIuLmU3M2MwNDkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGUucHl3CisrKyBiL0xpYi9pZGxlbGliL2lkbGUucHl3CkBAIC0xLDEwICsxLDEwIEBACiB0cnk6Ci0gICAgaW1wb3J0IGlkbGVsaWIuUHlTaGVsbAorICAgIGltcG9ydCBpZGxlbGliLnB5c2hlbGwKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAjIElETEUgaXMgbm90IGluc3RhbGxlZCwgYnV0IG1heWJlIFB5U2hlbGwgaXMgb24gc3lzLnBhdGg6Ci0gICAgZnJvbSAuIGltcG9ydCBQeVNoZWxsCisgICAgIyBJRExFIGlzIG5vdCBpbnN0YWxsZWQsIGJ1dCBtYXliZSBweXNoZWxsIGlzIG9uIHN5cy5wYXRoOgorICAgIGZyb20gLiBpbXBvcnQgcHlzaGVsbAogICAgIGltcG9ydCBvcwotICAgIGlkbGVkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKFB5U2hlbGwuX19maWxlX18pKQorICAgIGlkbGVkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHB5c2hlbGwuX19maWxlX18pKQogICAgIGlmIGlkbGVkaXIgIT0gb3MuZ2V0Y3dkKCk6CiAgICAgICAgICMgV2UncmUgbm90IGluIHRoZSBJRExFIGRpcmVjdG9yeSwgaGVscCB0aGUgc3VicHJvY2VzcyBmaW5kIHJ1bi5weQogICAgICAgICBweXBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKQpAQCAtMTIsNiArMTIsNiBAQAogICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gcHlwYXRoICsgJzonICsgaWRsZWRpcgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gaWRsZWRpcgotICAgIFB5U2hlbGwubWFpbigpCisgICAgcHlzaGVsbC5tYWluKCkKIGVsc2U6Ci0gICAgaWRsZWxpYi5QeVNoZWxsLm1haW4oKQorICAgIGlkbGVsaWIucHlzaGVsbC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9fX2luaXRfXy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9fX2luaXRfXy5weQppbmRleCA4NDVjOTJkLi5hZDA2N2I0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvX19pbml0X18ucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L19faW5pdF9fLnB5CkBAIC0xLDYgKzEsOCBAQAogJycnaWRsZWxpYi5pZGxlX3Rlc3QgaXMgYSBwcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRlc3QudGVzdF9pZGxlLAogd2hpY2ggdGVzdHMgdGhlIElETEUgYXBwbGljYXRpb24gYXMgcGFydCBvZiB0aGUgc3RkbGliIHRlc3Qgc3VpdGUuCiBSdW4gSURMRSB0ZXN0cyBhbG9uZSB3aXRoICJweXRob24gLW0gdGVzdC50ZXN0X2lkbGUiLgorU3RhcnRpbmcgd2l0aCBQeXRob24gMy42LCBJRExFIHJlcXVpcmVzIHRjbC90ayA4LjUgb3IgbGF0ZXIuCisKIFRoaXMgcGFja2FnZSBhbmQgaXRzIGNvbnRhaW5lZCBtb2R1bGVzIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBhbmQKIGFueSBkaXJlY3QgdXNlIGlzIGF0IHlvdXIgb3duIHJpc2suCiAnJycKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9odGVzdC5weQppbmRleCA1OGU2MmNiLi40ZDk4OTI0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvaHRlc3QucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L2h0ZXN0LnB5CkBAIC01OSwxOSArNTksMjAgQEAKIAogCiBNb2R1bGVzIGFuZCBjbGFzc2VzIG5vdCBiZWluZyB0ZXN0ZWQgYXQgdGhlIG1vbWVudDoKLVB5U2hlbGwuUHlTaGVsbEVkaXRvcldpbmRvdwotRGVidWdnZXIuRGVidWdnZXIKLUF1dG9Db21wbGV0ZVdpbmRvdy5BdXRvQ29tcGxldGVXaW5kb3cKLU91dHB1dFdpbmRvdy5PdXRwdXRXaW5kb3cgKGluZGlyZWN0bHkgYmVpbmcgdGVzdGVkIHdpdGggZ3JlcCB0ZXN0KQorcHlzaGVsbC5QeVNoZWxsRWRpdG9yV2luZG93CitkZWJ1Z2dlci5EZWJ1Z2dlcgorYXV0b2NvbXBsZXRlX3cuQXV0b0NvbXBsZXRlV2luZG93CitvdXR3aW4uT3V0cHV0V2luZG93IChpbmRpcmVjdGx5IGJlaW5nIHRlc3RlZCB3aXRoIGdyZXAgdGVzdCkKICcnJwogCiBmcm9tIGltcG9ydGxpYiBpbXBvcnQgaW1wb3J0X21vZHVsZQotZnJvbSBpZGxlbGliLm1hY29zeFN1cHBvcnQgaW1wb3J0IF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMKIGltcG9ydCB0a2ludGVyIGFzIHRrCitmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKK3RrLk5vRGVmYXVsdFJvb3QoKQogCiBBYm91dERpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ2Fib3V0RGlhbG9nJywKLSAgICAna3dkcyc6IHsndGl0bGUnOiAnYWJvdXREaWFsb2cgdGVzdCcsCisgICAgJ2ZpbGUnOiAnaGVscF9hYm91dCcsCisgICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ2hlbHBfYWJvdXQgdGVzdCcsCiAgICAgICAgICAgICAgJ19odGVzdCc6IFRydWUsCiAgICAgICAgICAgICAgfSwKICAgICAnbXNnJzogIlRlc3QgZXZlcnkgYnV0dG9uLiBFbnN1cmUgUHl0aG9uLCBUSyBhbmQgSURMRSB2ZXJzaW9ucyAiCkBAIC03OSwxNCArODAsMTQgQEAKICAgICB9CiAKIF9jYWxsdGlwX3dpbmRvd19zcGVjID0gewotICAgICdmaWxlJzogJ0NhbGxUaXBXaW5kb3cnLAorICAgICdmaWxlJzogJ2NhbGx0aXBfdycsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlR5cGluZyAnKCcgc2hvdWxkIGRpc3BsYXkgYSBjYWxsdGlwLlxuIgogICAgICAgICAgICAiVHlwaW5nICcpIHNob3VsZCBoaWRlIHRoZSBjYWxsdGlwLlxuIgogICAgIH0KIAogX2NsYXNzX2Jyb3dzZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdDbGFzc0Jyb3dzZXInLAorICAgICdmaWxlJzogJ2Jyb3dzZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJJbnNwZWN0IG5hbWVzIG9mIG1vZHVsZSwgY2xhc3Mod2l0aCBzdXBlcmNsYXNzIGlmICIKICAgICAgICAgICAgImFwcGxpY2FibGUpLCBtZXRob2RzIGFuZCBmdW5jdGlvbnMuXG5Ub2dnbGUgbmVzdGVkIGl0ZW1zLlxuIgpAQCAtOTUsNyArOTYsNyBAQAogICAgIH0KIAogX2NvbG9yX2RlbGVnYXRvcl9zcGVjID0gewotICAgICdmaWxlJzogJ0NvbG9yRGVsZWdhdG9yJywKKyAgICAnZmlsZSc6ICdjb2xvcml6ZXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGUgdGV4dCBpcyBzYW1wbGUgUHl0aG9uIGNvZGUuXG4iCiAgICAgICAgICAgICJFbnN1cmUgY29tcG9uZW50cyBsaWtlIGNvbW1lbnRzLCBrZXl3b3JkcywgYnVpbHRpbnMsXG4iCkBAIC0xMDQsNyArMTA1LDcgQEAKICAgICB9CiAKIENvbmZpZ0RpYWxvZ19zcGVjID0gewotICAgICdmaWxlJzogJ2NvbmZpZ0RpYWxvZycsCisgICAgJ2ZpbGUnOiAnY29uZmlnZGlhbG9nJywKICAgICAna3dkcyc6IHsndGl0bGUnOiAnQ29uZmlnRGlhbG9nVGVzdCcsCiAgICAgICAgICAgICAgJ19odGVzdCc6IFRydWUsfSwKICAgICAnbXNnJzogIklETEUgcHJlZmVyZW5jZXMgZGlhbG9nLlxuIgpAQCAtMTIxLDcgKzEyMiw3IEBACiAKICMgVE9ETyBJbXByb3ZlIG1lc3NhZ2UKIF9keW5fb3B0aW9uX21lbnVfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdkeW5PcHRpb25NZW51V2lkZ2V0JywKKyAgICAnZmlsZSc6ICdkeW5vcHRpb24nLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJTZWxlY3Qgb25lIG9mIHRoZSBtYW55IG9wdGlvbnMgaW4gdGhlICdvbGQgb3B0aW9uIHNldCcuXG4iCiAgICAgICAgICAgICJDbGljayB0aGUgYnV0dG9uIHRvIGNoYW5nZSB0aGUgb3B0aW9uIHNldC5cbiIKQEAgLTEzMCwzOSArMTMxLDE1IEBACiAKICMgVE9ETyBlZGl0IHdyYXBwZXIKIF9lZGl0b3Jfd2luZG93X3NwZWMgPSB7Ci0gICAnZmlsZSc6ICdFZGl0b3JXaW5kb3cnLAorICAgJ2ZpbGUnOiAnZWRpdG9yJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiVGVzdCBlZGl0b3IgZnVuY3Rpb25zIG9mIGludGVyZXN0LlxuIgogICAgICAgICAgICAiQmVzdCB0byBjbG9zZSBlZGl0b3IgZmlyc3QuIgogICAgIH0KIAotR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdjb25maWdTZWN0aW9uTmFtZURpYWxvZycsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzonR2V0IE5hbWUnLAotICAgICAgICAgICAgICdtZXNzYWdlJzonRW50ZXIgc29tZXRoaW5nJywKLSAgICAgICAgICAgICAndXNlZF9uYW1lcyc6IHsnYWJjJ30sCi0gICAgICAgICAgICAgJ19odGVzdCc6IFRydWV9LAotICAgICdtc2cnOiAiQWZ0ZXIgdGhlIHRleHQgZW50ZXJlZCB3aXRoIFtPa10gaXMgc3RyaXBwZWQsIDxub3RoaW5nPiwgIgotICAgICAgICAgICAiJ2FiYycsIG9yIG1vcmUgdGhhdCAzMCBjaGFycyBhcmUgZXJyb3JzLlxuIgotICAgICAgICAgICAiQ2xvc2UgJ0dldCBOYW1lJyB3aXRoIGEgdmFsaWQgZW50cnkgKHByaW50ZWQgdG8gU2hlbGwpLCAiCi0gICAgICAgICAgICJbQ2FuY2VsXSwgb3IgW1hdIiwKLSAgICB9Ci0KLUdldEhlbHBTb3VyY2VEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdjb25maWdIZWxwU291cmNlRWRpdCcsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ0dldCBoZWxwc291cmNlJywKLSAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCi0gICAgJ21zZyc6ICJFbnRlciBtZW51IGl0ZW0gbmFtZSBhbmQgaGVscCBmaWxlIHBhdGhcbiAiCi0gICAgICAgICAgICI8bm90aGluZz4gYW5kIG1vcmUgdGhhbiAzMCBjaGFycyBhcmUgaW52YWxpZCBtZW51IGl0ZW0gbmFtZXMuXG4iCi0gICAgICAgICAgICI8bm90aGluZz4sIGZpbGUgZG9lcyBub3QgZXhpc3QgYXJlIGludmFsaWQgcGF0aCBpdGVtcy5cbiIKLSAgICAgICAgICAgIlRlc3QgZm9yIGluY29tcGxldGUgd2ViIGFkZHJlc3MgZm9yIGhlbHAgZmlsZSBwYXRoLlxuIgotICAgICAgICAgICAiQSB2YWxpZCBlbnRyeSB3aWxsIGJlIHByaW50ZWQgdG8gc2hlbGwgd2l0aCBbMGtdLlxuIgotICAgICAgICAgICAiW0NhbmNlbF0gd2lsbCBwcmludCBOb25lIHRvIHNoZWxsIiwKLSAgICB9Ci0KICMgVXBkYXRlIG9uY2UgaXNzdWUyMTUxOSBpcyByZXNvbHZlZC4KIEdldEtleXNEaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdrZXliaW5kaW5nRGlhbG9nJywKKyAgICAnZmlsZSc6ICdjb25maWdfa2V5JywKICAgICAna3dkcyc6IHsndGl0bGUnOiAnVGVzdCBrZXliaW5kaW5ncycsCiAgICAgICAgICAgICAgJ2FjdGlvbic6ICdmaW5kLWFnYWluJywKICAgICAgICAgICAgICAnY3VycmVudEtleVNlcXVlbmNlcyc6IFsnJ10gLApAQCAtMTc3LDcgKzE1NCw3IEBACiAgICAgfQogCiBfZ3JlcF9kaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdHcmVwRGlhbG9nJywKKyAgICAnZmlsZSc6ICdncmVwJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgdGhlICdTaG93IEdyZXBEaWFsb2cnIGJ1dHRvbi5cbiIKICAgICAgICAgICAgIlRlc3QgdGhlIHZhcmlvdXMgJ0ZpbmQtaW4tZmlsZXMnIGZ1bmN0aW9ucy5cbiIKQEAgLTE4Niw4ICsxNjMsMjQgQEAKICAgICAgICAgICAgInNob3VsZCBvcGVuIHRoYXQgZmlsZSBcbmluIGEgbmV3IEVkaXRvcldpbmRvdy4iCiAgICAgfQogCitIZWxwU291cmNlX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAncXVlcnknLAorICAgICdrd2RzJzogeyd0aXRsZSc6ICdIZWxwIG5hbWUgYW5kIHNvdXJjZScsCisgICAgICAgICAgICAgJ21lbnVpdGVtJzogJ3Rlc3QnLAorICAgICAgICAgICAgICdmaWxlcGF0aCc6IF9fZmlsZV9fLAorICAgICAgICAgICAgICd1c2VkX25hbWVzJzogeydhYmMnfSwKKyAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCisgICAgJ21zZyc6ICJFbnRlciBtZW51IGl0ZW0gbmFtZSBhbmQgaGVscCBmaWxlIHBhdGhcbiIKKyAgICAgICAgICAgIicnLCA+IHRoYW4gMzAgY2hhcnMsIGFuZCAnYWJjJyBhcmUgaW52YWxpZCBtZW51IGl0ZW0gbmFtZXMuXG4iCisgICAgICAgICAgICInJyBhbmQgZmlsZSBkb2VzIG5vdCBleGlzdCBhcmUgaW52YWxpZCBwYXRoIGl0ZW1zLlxuIgorICAgICAgICAgICAiQW55IHVybCAoJ3d3dy4uLicsICdodHRwLi4uJykgaXMgYWNjZXB0ZWQuXG4iCisgICAgICAgICAgICJUZXN0IEJyb3dzZSB3aXRoIGFuZCB3aXRob3V0IHBhdGgsIGFzIGNhbm5vdCB1bml0dGVzdC5cbiIKKyAgICAgICAgICAgIkEgdmFsaWQgZW50cnkgd2lsbCBiZSBwcmludGVkIHRvIHNoZWxsIHdpdGggWzBrXVxuIgorICAgICAgICAgICAib3IgPHJldHVybj4uICBbQ2FuY2VsXSB3aWxsIHByaW50IE5vbmUgdG8gc2hlbGwiCisgICAgfQorCiBfaW9fYmluZGluZ19zcGVjID0gewotICAgICdmaWxlJzogJ0lPQmluZGluZycsCisgICAgJ2ZpbGUnOiAnaW9tZW51JywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiVGVzdCB0aGUgZm9sbG93aW5nIGJpbmRpbmdzLlxuIgogICAgICAgICAgICAiPENvbnRyb2wtbz4gdG8gb3BlbiBmaWxlIGZyb20gZGlhbG9nLlxuIgpAQCAtMjAwLDcgKzE5Myw3IEBACiAgICAgfQogCiBfbXVsdGlfY2FsbF9zcGVjID0gewotICAgICdmaWxlJzogJ011bHRpQ2FsbCcsCisgICAgJ2ZpbGUnOiAnbXVsdGljYWxsJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiVGhlIGZvbGxvd2luZyBhY3Rpb25zIHNob3VsZCB0cmlnZ2VyIGEgcHJpbnQgdG8gY29uc29sZSBvciBJRExFIgogICAgICAgICAgICAiIFNoZWxsLlxuRW50ZXJpbmcgYW5kIGxlYXZpbmcgdGhlIHRleHQgYXJlYSwga2V5IGVudHJ5LCAiCkBAIC0yMTAsMTQgKzIwMywxNCBAQAogICAgIH0KIAogX211bHRpc3RhdHVzX2Jhcl9zcGVjID0gewotICAgICdmaWxlJzogJ011bHRpU3RhdHVzQmFyJywKKyAgICAnZmlsZSc6ICdzdGF0dXNiYXInLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJFbnN1cmUgcHJlc2VuY2Ugb2YgbXVsdGktc3RhdHVzIGJhciBiZWxvdyB0ZXh0IGFyZWEuXG4iCiAgICAgICAgICAgICJDbGljayAnVXBkYXRlIFN0YXR1cycgdG8gY2hhbmdlIHRoZSBtdWx0aS1zdGF0dXMgdGV4dCIKICAgICB9CiAKIF9vYmplY3RfYnJvd3Nlcl9zcGVjID0gewotICAgICdmaWxlJzogJ09iamVjdEJyb3dzZXInLAorICAgICdmaWxlJzogJ2RlYnVnb2JqJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiRG91YmxlIGNsaWNrIG9uIGl0ZW1zIHVwdG8gdGhlIGxvd2VzdCBsZXZlbC5cbiIKICAgICAgICAgICAgIkF0dHJpYnV0ZXMgb2YgdGhlIG9iamVjdHMgYW5kIHJlbGF0ZWQgaW5mb3JtYXRpb24gIgpAQCAtMjI1LDcgKzIxOCw3IEBACiAgICAgfQogCiBfcGF0aF9icm93c2VyX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnUGF0aEJyb3dzZXInLAorICAgICdmaWxlJzogJ3BhdGhicm93c2VyJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiVGVzdCBmb3IgY29ycmVjdCBkaXNwbGF5IG9mIGFsbCBwYXRocyBpbiBzeXMucGF0aC5cbiIKICAgICAgICAgICAgIlRvZ2dsZSBuZXN0ZWQgaXRlbXMgdXB0byB0aGUgbG93ZXN0IGxldmVsLlxuIgpAQCAtMjM0LDcgKzIyNyw3IEBACiAgICAgfQogCiBfcGVyY29sYXRvcl9zcGVjID0gewotICAgICdmaWxlJzogJ1BlcmNvbGF0b3InLAorICAgICdmaWxlJzogJ3BlcmNvbGF0b3InLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJUaGVyZSBhcmUgdHdvIHRyYWNlcnMgd2hpY2ggY2FuIGJlIHRvZ2dsZWQgdXNpbmcgYSBjaGVja2JveC5cbiIKICAgICAgICAgICAgIlRvZ2dsaW5nIGEgdHJhY2VyICdvbicgYnkgY2hlY2tpbmcgaXQgc2hvdWxkIHByaW50IHRyYWNlciIKQEAgLTI0NCw4ICsyMzcsMjAgQEAKICAgICAgICAgICAgIlRlc3QgZm9yIGFjdGlvbnMgbGlrZSB0ZXh0IGVudHJ5LCBhbmQgcmVtb3ZhbC4iCiAgICAgfQogCitRdWVyeV9zcGVjID0geworICAgICdmaWxlJzogJ3F1ZXJ5JywKKyAgICAna3dkcyc6IHsndGl0bGUnOiAnUXVlcnknLAorICAgICAgICAgICAgICdtZXNzYWdlJzogJ0VudGVyIHNvbWV0aGluZycsCisgICAgICAgICAgICAgJ3RleHQwJzogJ0dvJywKKyAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCisgICAgJ21zZyc6ICJFbnRlciB3aXRoIDxSZXR1cm4+IG9yIFtPa10uICBQcmludCB2YWxpZCBlbnRyeSB0byBTaGVsbFxuIgorICAgICAgICAgICAiQmxhbmsgbGluZSwgYWZ0ZXIgc3RyaXBwaW5nLCBpcyBpZ25vcmVkXG4iCisgICAgICAgICAgICJDbG9zZSBkaWFsb2cgd2l0aCB2YWxpZCBlbnRyeSwgW0NhbmNlbF0gb3IgW1hdIgorICAgIH0KKworCiBfcmVwbGFjZV9kaWFsb2dfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdSZXBsYWNlRGlhbG9nJywKKyAgICAnZmlsZSc6ICdyZXBsYWNlJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiQ2xpY2sgdGhlICdSZXBsYWNlJyBidXR0b24uXG4iCiAgICAgICAgICAgICJUZXN0IHZhcmlvdXMgcmVwbGFjZSBvcHRpb25zIGluIHRoZSAnUmVwbGFjZSBkaWFsb2cnLlxuIgpAQCAtMjUzLDE1ICsyNTgsMjIgQEAKICAgICB9CiAKIF9zZWFyY2hfZGlhbG9nX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnU2VhcmNoRGlhbG9nJywKKyAgICAnZmlsZSc6ICdzZWFyY2gnLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJDbGljayB0aGUgJ1NlYXJjaCcgYnV0dG9uLlxuIgogICAgICAgICAgICAiVGVzdCB2YXJpb3VzIHNlYXJjaCBvcHRpb25zIGluIHRoZSAnU2VhcmNoIGRpYWxvZycuXG4iCiAgICAgICAgICAgICJDbGljayBbQ2xvc2VdIG9yIFtYXSB0byBjbG9zZSB0aGUgJ1NlYXJjaCBEaWFsb2cnLiIKICAgICB9CiAKK19zZWFyY2hiYXNlX3NwZWMgPSB7CisgICAgJ2ZpbGUnOiAnc2VhcmNoYmFzZScsCisgICAgJ2t3ZHMnOiB7fSwKKyAgICAnbXNnJzogIkNoZWNrIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBiYXNlIHNlYXJjaCBkaWFsb2dcbiIKKyAgICAgICAgICAgIkl0cyBvbmx5IGFjdGlvbiBpcyB0byBjbG9zZS4iCisgICAgfQorCiBfc2Nyb2xsZWRfbGlzdF9zcGVjID0gewotICAgICdmaWxlJzogJ1Njcm9sbGVkTGlzdCcsCisgICAgJ2ZpbGUnOiAnc2Nyb2xsZWRsaXN0JywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiWW91IHNob3VsZCBzZWUgYSBzY3JvbGxhYmxlIGxpc3Qgb2YgaXRlbXNcbiIKICAgICAgICAgICAgIlNlbGVjdGluZyAoY2xpY2tpbmcpIG9yIGRvdWJsZSBjbGlja2luZyBhbiBpdGVtICIKQEAgLTI3Nyw3ICsyODksNyBAQAogICAgIH0KIAogX3N0YWNrX3ZpZXdlcl9zcGVjID0gewotICAgICdmaWxlJzogJ1N0YWNrVmlld2VyJywKKyAgICAnZmlsZSc6ICdzdGFja3ZpZXdlcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkEgc3RhY2t0cmFjZSBmb3IgYSBOYW1lRXJyb3IgZXhjZXB0aW9uLlxuIgogICAgICAgICAgICAiRXhwYW5kICdpZGxlbGliIC4uLicgYW5kICc8bG9jYWxzPicuXG4iCkBAIC0yOTUsOCArMzA3LDggQEAKICAgICB9CiAKIFRleHRWaWV3ZXJfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICd0ZXh0VmlldycsCi0gICAgJ2t3ZHMnOiB7J3RpdGxlJzogJ1Rlc3QgdGV4dFZpZXcnLAorICAgICdmaWxlJzogJ3RleHR2aWV3JywKKyAgICAna3dkcyc6IHsndGl0bGUnOiAnVGVzdCB0ZXh0dmlldycsCiAgICAgICAgICAgICAgJ3RleHQnOidUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLlxuJyozNSwKICAgICAgICAgICAgICAnX2h0ZXN0JzogVHJ1ZX0sCiAgICAgJ21zZyc6ICJUZXN0IGZvciByZWFkLW9ubHkgcHJvcGVydHkgb2YgdGV4dC5cbiIKQEAgLTMwNCwyMSArMzE2LDIxIEBACiAgICAgIH0KIAogX3Rvb2x0aXBfc3BlYyA9IHsKLSAgICAnZmlsZSc6ICdUb29sVGlwJywKKyAgICAnZmlsZSc6ICd0b29sdGlwJywKICAgICAna3dkcyc6IHt9LAogICAgICdtc2cnOiAiUGxhY2UgbW91c2UgY3Vyc29yIG92ZXIgYm90aCB0aGUgYnV0dG9uc1xuIgogICAgICAgICAgICAiQSB0b29sdGlwIHNob3VsZCBhcHBlYXIgd2l0aCBzb21lIHRleHQuIgogICAgIH0KIAogX3RyZWVfd2lkZ2V0X3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnVHJlZVdpZGdldCcsCisgICAgJ2ZpbGUnOiAndHJlZScsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIlRoZSBjYW52YXMgaXMgc2Nyb2xsYWJsZS5cbiIKICAgICAgICAgICAgIkNsaWNrIG9uIGZvbGRlcnMgdXB0byB0byB0aGUgbG93ZXN0IGxldmVsLiIKICAgICB9CiAKIF91bmRvX2RlbGVnYXRvcl9zcGVjID0gewotICAgICdmaWxlJzogJ1VuZG9EZWxlZ2F0b3InLAorICAgICdmaWxlJzogJ3VuZG8nLAogICAgICdrd2RzJzoge30sCiAgICAgJ21zZyc6ICJDbGljayBbVW5kb10gdG8gdW5kbyBhbnkgYWN0aW9uLlxuIgogICAgICAgICAgICAiQ2xpY2sgW1JlZG9dIHRvIHJlZG8gYW55IGFjdGlvbi5cbiIKQEAgLTMyNyw3ICszMzksNyBAQAogICAgIH0KIAogX3dpZGdldF9yZWRpcmVjdG9yX3NwZWMgPSB7Ci0gICAgJ2ZpbGUnOiAnV2lkZ2V0UmVkaXJlY3RvcicsCisgICAgJ2ZpbGUnOiAncmVkaXJlY3RvcicsCiAgICAgJ2t3ZHMnOiB7fSwKICAgICAnbXNnJzogIkV2ZXJ5IHRleHQgaW5zZXJ0IHNob3VsZCBiZSBwcmludGVkIHRvIHRoZSBjb25zb2xlLiIKICAgICAgICAgICAgIm9yIHRoZSBJRExFIHNoZWxsLiIKQEAgLTMzNywxNCArMzQ5LDEzIEBACiAgICAgcm9vdCA9IHRrLlRrKCkKICAgICByb290LnRpdGxlKCdJRExFIGh0ZXN0JykKICAgICByb290LnJlc2l6YWJsZSgwLCAwKQotICAgIF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMocm9vdCkKIAogICAgICMgYSBzY3JvbGxhYmxlIExhYmVsIGxpa2UgY29uc3RhbnQgd2lkdGggdGV4dCB3aWRnZXQuCiAgICAgZnJhbWVMYWJlbCA9IHRrLkZyYW1lKHJvb3QsIHBhZHg9MTApCiAgICAgZnJhbWVMYWJlbC5wYWNrKCkKICAgICB0ZXh0ID0gdGsuVGV4dChmcmFtZUxhYmVsLCB3cmFwPSd3b3JkJykKICAgICB0ZXh0LmNvbmZpZ3VyZShiZz1yb290LmNnZXQoJ2JnJyksIHJlbGllZj0nZmxhdCcsIGhlaWdodD00LCB3aWR0aD03MCkKLSAgICBzY3JvbGxiYXIgPSB0ay5TY3JvbGxiYXIoZnJhbWVMYWJlbCwgY29tbWFuZD10ZXh0Lnl2aWV3KQorICAgIHNjcm9sbGJhciA9IFNjcm9sbGJhcihmcmFtZUxhYmVsLCBjb21tYW5kPXRleHQueXZpZXcpCiAgICAgdGV4dC5jb25maWcoeXNjcm9sbGNvbW1hbmQ9c2Nyb2xsYmFyLnNldCkKICAgICBzY3JvbGxiYXIucGFjayhzaWRlPSdyaWdodCcsIGZpbGw9J3knLCBleHBhbmQ9RmFsc2UpCiAgICAgdGV4dC5wYWNrKHNpZGU9J2xlZnQnLCBmaWxsPSdib3RoJywgZXhwYW5kPVRydWUpCkBAIC0zNjUsNyArMzc2LDcgQEAKICAgICAgICAgICAgICAgICB0ZXN0ID0gZ2V0YXR0cihtb2QsIHRlc3RfbmFtZSkKICAgICAgICAgICAgICAgICB0ZXN0X2xpc3QuYXBwZW5kKCh0ZXN0X3NwZWMsIHRlc3QpKQogCi0gICAgdGVzdF9uYW1lID0gdGsuU3RyaW5nVmFyKCcnKQorICAgIHRlc3RfbmFtZSA9IHRrLlN0cmluZ1Zhcihyb290KQogICAgIGNhbGxhYmxlX29iamVjdCA9IE5vbmUKICAgICB0ZXN0X2t3ZHMgPSBOb25lCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9tb2NrX2lkbGUucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvbW9ja19pZGxlLnB5CmluZGV4IDE2NzJhMzQuLmM3YjQ5ZWYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC9tb2NrX2lkbGUucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L21vY2tfaWRsZS5weQpAQCAtMzMsNyArMzMsNyBAQAogCiAKIGNsYXNzIEVkaXRvcjoKLSAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSBFZGl0b3JXaW5kb3cuRWRpdG9yV2luZG93IGNsYXNzLgorICAgICcnJ01pbmltYWxseSBpbWl0YXRlIGVkaXRvci5FZGl0b3JXaW5kb3cgY2xhc3MuCiAgICAgJycnCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0PU5vbmUsIGZpbGVuYW1lPU5vbmUsIGtleT1Ob25lLCByb290PU5vbmUpOgogICAgICAgICBzZWxmLnRleHQgPSBUZXh0KCkKQEAgLTQ2LDcgKzQ2LDcgQEAKIAogCiBjbGFzcyBVbmRvRGVsZWdhdG9yOgotICAgICcnJ01pbmltYWxseSBpbWl0YXRlIFVuZG9EZWxlZ2F0b3IsVW5kb0RlbGVnYXRvciBjbGFzcy4KKyAgICAnJydNaW5pbWFsbHkgaW1pdGF0ZSB1bmRvLlVuZG9EZWxlZ2F0b3IgY2xhc3MuCiAgICAgJycnCiAgICAgIyBBIHJlYWwgdW5kbyBibG9jayBpcyBvbmx5IG5lZWRlZCBmb3IgdXNlciBpbnRlcmFjdGlvbi4KICAgICBkZWYgdW5kb19ibG9ja19zdGFydCgqYXJncyk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvY29tcGxldGUucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvY29tcGxldGUucHkKaW5kZXggZTQ0OTNkMS4uYTE0YzZkYiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2NvbXBsZXRlLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9jb21wbGV0ZS5weQpAQCAtMSwxMCArMSwxNCBAQAorJycnIFRlc3QgYXV0b2NvbXBsZXRlIGFuZCBhdXRvY29tcGxlX3cKKworQ292ZXJhZ2Ugb2YgYXV0b2NvbXBsZTogNTYlCisnJycKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0CiAKLWltcG9ydCBpZGxlbGliLkF1dG9Db21wbGV0ZSBhcyBhYwotaW1wb3J0IGlkbGVsaWIuQXV0b0NvbXBsZXRlV2luZG93IGFzIGFjdwotaW1wb3J0IGlkbGVsaWIubWFjb3N4U3VwcG9ydCBhcyBtYWMKK2ltcG9ydCBpZGxlbGliLmF1dG9jb21wbGV0ZSBhcyBhYworaW1wb3J0IGlkbGVsaWIuYXV0b2NvbXBsZXRlX3cgYXMgYWN3Citmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgRXZlbnQKIApAQCAtMjcsNyArMzEsNyBAQAogICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CiAgICAgICAgIHJlcXVpcmVzKCdndWknKQogICAgICAgICBjbHMucm9vdCA9IFRrKCkKLSAgICAgICAgbWFjLnNldHVwQXBwKGNscy5yb290LCBOb25lKQorICAgICAgICBtYWNvc3guc2V0dXBBcHAoY2xzLnJvb3QsIE5vbmUpCiAgICAgICAgIGNscy50ZXh0ID0gVGV4dChjbHMucm9vdCkKICAgICAgICAgY2xzLmVkaXRvciA9IER1bW15RWRpdHdpbihjbHMucm9vdCwgY2xzLnRleHQpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9leHBhbmQucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9hdXRvZXhwYW5kLnB5CmluZGV4IGQyYTMxNTYuLjVkMjM0ZGQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2F1dG9leHBhbmQucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfYXV0b2V4cGFuZC5weQpAQCAtMSw5ICsxLDkgQEAKLSIiIlVuaXQgdGVzdHMgZm9yIGlkbGVsaWIuQXV0b0V4cGFuZCIiIgorIiIiVW5pdCB0ZXN0cyBmb3IgaWRsZWxpYi5hdXRvZXhwYW5kIiIiCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogZnJvbSB0a2ludGVyIGltcG9ydCBUZXh0LCBUawogI2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVGV4dAotZnJvbSBpZGxlbGliLkF1dG9FeHBhbmQgaW1wb3J0IEF1dG9FeHBhbmQKK2Zyb20gaWRsZWxpYi5hdXRvZXhwYW5kIGltcG9ydCBBdXRvRXhwYW5kCiAKIAogY2xhc3MgRHVtbXlfRWRpdHdpbjoKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NhbGx0aXBzLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY2FsbHRpcHMucHkKaW5kZXggYjJhNzMzYy4uMGIxMTYwMiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY2FsbHRpcHMucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY2FsbHRpcHMucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBpZGxlbGliLkNhbGxUaXBzIGFzIGN0CitpbXBvcnQgaWRsZWxpYi5jYWxsdGlwcyBhcyBjdAogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdHlwZXMKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29sb3JpemVyLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29sb3JpemVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOGJjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb2xvcml6ZXIucHkKQEAgLTAsMCArMSw1NiBAQAorJycnVGVzdCBpZGxlbGliL2NvbG9yaXplci5weQorCitQZXJmb3JtIG1pbmltYWwgc2FuaXR5IGNoZWNrcyB0aGF0IG1vZHVsZSBpbXBvcnRzIGFuZCBzb21lIHRoaW5ncyBydW4uCisKK0NvdmVyYWdlIDIyJS4KKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBjb2xvcml6ZXIgICMgYWx3YXlzIHRlc3QgaW1wb3J0Citmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIEZ1bmN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hbnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2xvcml6ZXIuYW55KCd0ZXN0JywgKCdhJywgJ2InKSkpCisKKyAgICBkZWYgdGVzdF9tYWtlX3BhdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbG9yaXplci5tYWtlX3BhdCgpKQorCisKK2NsYXNzIENvbG9yQ29uZmlnVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICByZXF1aXJlcygnZ3VpJykKKyAgICAgICAgY2xzLnJvb3QgPSBUaygpCisgICAgICAgIGNscy50ZXh0ID0gVGV4dChjbHMucm9vdCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGRlbCBjbHMudGV4dAorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgdGVzdF9jb2xvcml6ZXIoc2VsZik6CisgICAgICAgIGNvbG9yaXplci5jb2xvcl9jb25maWcoc2VsZi50ZXh0KQorCitjbGFzcyBDb2xvckRlbGVnYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisgICAgICAgIGNscy5yb290ID0gVGsoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHRlc3RfY29sb3JpemVyKHNlbGYpOgorICAgICAgICBjb2xvcml6ZXIuQ29sb3JEZWxlZ2F0b3IoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzY2NWNkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnLnB5CkBAIC0wLDAgKzEsOTggQEAKKycnJ1Rlc3QgaWRsZWxpYi5jb25maWcuCisKK011Y2ggaXMgdGVzdGVkIGJ5IG9wZW5pbmcgY29uZmlnIGRpYWxvZyBsaXZlIG9yIGluIHRlc3RfY29uZmlnZGlhbG9nLgorQ292ZXJhZ2U6IDI3JQorJycnCitmcm9tIHN5cyBpbXBvcnQgbW9kdWxlcworZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZGVycgorZnJvbSB0a2ludGVyIGltcG9ydCBUaworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZworCisjIFRlc3RzIHNob3VsZCBub3QgZGVwZW5kIG9uIGZvcnR1aXRvdXMgdXNlciBjb25maWd1cmF0aW9ucy4KKyMgVGhleSBtdXN0IG5vdCBhZmZlY3QgYWN0dWFsIHVzZXIgLmNmZyBmaWxlcy4KKyMgUmVwbGFjZSB1c2VyIHBhcnNlcnMgd2l0aCBlbXB0eSBwYXJzZXJzIHRoYXQgY2Fubm90IGJlIHNhdmVkLgorCitpZGxlQ29uZiA9IGNvbmZpZy5pZGxlQ29uZgordXNlcmNmZyA9IGlkbGVDb25mLnVzZXJDZmcKK3Rlc3RjZmcgPSB7fQordXNlcm1haW4gPSB0ZXN0Y2ZnWydtYWluJ10gPSBjb25maWcuSWRsZVVzZXJDb25mUGFyc2VyKCcnKSAgIyBmaWxlbmFtZQordXNlcmhpZ2ggPSB0ZXN0Y2ZnWydoaWdobGlnaHQnXSA9IGNvbmZpZy5JZGxlVXNlckNvbmZQYXJzZXIoJycpCit1c2Vya2V5cyA9IHRlc3RjZmdbJ2tleXMnXSA9IGNvbmZpZy5JZGxlVXNlckNvbmZQYXJzZXIoJycpCisKK2RlZiBzZXRVcE1vZHVsZSgpOgorICAgIGlkbGVDb25mLnVzZXJDZmcgPSB0ZXN0Y2ZnCisKK2RlZiB0ZWFyRG93bk1vZHVsZSgpOgorICAgIGlkbGVDb25mLnVzZXJDZmcgPSB1c2VyY2ZnCisKKworY2xhc3MgQ3VycmVudENvbG9yS2V5c1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgY29ycmVjdCBzY2VuYXJpb3MgZm9yIGNvbG9ya2V5cyBhbmQgd3JhcCBmdW5jdGlvbnMuCisKKyAgICAgICAgVGhlIDUgY29ycmVjdCBwYXR0ZXJucyBhcmUgcG9zc2libGUgcmVzdWx0cyBvZiBjb25maWcgZGlhbG9nLgorICAgICIiIgorICAgIGNvbG9ya2V5cyA9IGlkbGVDb25mLmN1cnJlbnRfY29sb3JzX2FuZF9rZXlzCisKKyAgICBkZWYgdGVzdF9vbGRfZGVmYXVsdChzZWxmKToKKyAgICAgICAgIyBuYW1lMiBtdXN0IGJlIGJsYW5rCisgICAgICAgIHVzZXJtYWluLnJlYWRfc3RyaW5nKCcnJworICAgICAgICAgICAgW1RoZW1lXQorICAgICAgICAgICAgZGVmYXVsdD0gMQorICAgICAgICAgICAgJycnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdUaGVtZScpLCAnSURMRSBDbGFzc2ljJykKKyAgICAgICAgdXNlcm1haW5bJ1RoZW1lJ11bJ25hbWUnXSA9ICdJRExFIE5ldycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgJ0lETEUgTmV3JykKKyAgICAgICAgdXNlcm1haW5bJ1RoZW1lJ11bJ25hbWUnXSA9ICdub24tZGVmYXVsdCcgICMgZXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgJ0lETEUgQ2xhc3NpYycpCisgICAgICAgIHVzZXJtYWluLnJlbW92ZV9zZWN0aW9uKCdUaGVtZScpCisKKyAgICBkZWYgdGVzdF9uZXdfZGVmYXVsdChzZWxmKToKKyAgICAgICAgIyBuYW1lMiBvdmVycmlkZXMgbmFtZQorICAgICAgICB1c2VybWFpbi5yZWFkX3N0cmluZygnJycKKyAgICAgICAgICAgIFtUaGVtZV0KKyAgICAgICAgICAgIGRlZmF1bHQ9IDEKKyAgICAgICAgICAgIG5hbWU9IElETEUgTmV3CisgICAgICAgICAgICBuYW1lMj0gSURMRSBEYXJrCisgICAgICAgICAgICAnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksICdJRExFIERhcmsnKQorICAgICAgICB1c2VybWFpblsnVGhlbWUnXVsnbmFtZTInXSA9ICdub24tZGVmYXVsdCcgICMgZXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgJ0lETEUgQ2xhc3NpYycpCisgICAgICAgIHVzZXJtYWluLnJlbW92ZV9zZWN0aW9uKCdUaGVtZScpCisKKyAgICBkZWYgdGVzdF91c2VyX292ZXJyaWRlKHNlbGYpOgorICAgICAgICAjIG5hbWUyIGRvZXMgbm90IG1hdHRlcgorICAgICAgICB1c2VybWFpbi5yZWFkX3N0cmluZygnJycKKyAgICAgICAgICAgIFtUaGVtZV0KKyAgICAgICAgICAgIGRlZmF1bHQ9IDAKKyAgICAgICAgICAgIG5hbWU9IEN1c3RvbSBEYXJrCisgICAgICAgICAgICAnJycpICAjIGVycm9yIHVudGlsIHNldCB1c2VyaGlnaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29sb3JrZXlzKCdUaGVtZScpLCAnSURMRSBDbGFzc2ljJykKKyAgICAgICAgdXNlcmhpZ2gucmVhZF9zdHJpbmcoJ1tDdXN0b20gRGFya11cbmE9YicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb2xvcmtleXMoJ1RoZW1lJyksICdDdXN0b20gRGFyaycpCisgICAgICAgIHVzZXJtYWluWydUaGVtZSddWyduYW1lMiddID0gJ0lETEUgRGFyaycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbG9ya2V5cygnVGhlbWUnKSwgJ0N1c3RvbSBEYXJrJykKKyAgICAgICAgdXNlcm1haW4ucmVtb3ZlX3NlY3Rpb24oJ1RoZW1lJykKKyAgICAgICAgdXNlcmhpZ2gucmVtb3ZlX3NlY3Rpb24oJ0N1c3RvbSBEYXJrJykKKworCitjbGFzcyBXYXJuaW5nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF93YXJuKHNlbGYpOgorICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgY29uZmlnLl93YXJuZWQgPSBzZXQoKQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZGVycigpIGFzIHN0ZGVycjoKKyAgICAgICAgICAgIGNvbmZpZy5fd2Fybignd2FybmluZycsICdrZXknKQorICAgICAgICBFcXVhbChjb25maWcuX3dhcm5lZCwgeygnd2FybmluZycsJ2tleScpfSkKKyAgICAgICAgRXF1YWwoc3RkZXJyLmdldHZhbHVlKCksICd3YXJuaW5nJysnXG4nKQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZGVycigpIGFzIHN0ZGVycjoKKyAgICAgICAgICAgIGNvbmZpZy5fd2Fybignd2FybmluZycsICdrZXknKQorICAgICAgICBFcXVhbChzdGRlcnIuZ2V0dmFsdWUoKSwgJycpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3RkZXJyKCkgYXMgc3RkZXJyOgorICAgICAgICAgICAgY29uZmlnLl93YXJuKCd3YXJuMicsICd5ZWsnKQorICAgICAgICBFcXVhbChjb25maWcuX3dhcm5lZCwgeygnd2FybmluZycsJ2tleScpLCAoJ3dhcm4yJywneWVrJyl9KQorICAgICAgICBFcXVhbChzdGRlcnIuZ2V0dmFsdWUoKSwgJ3dhcm4yJysnXG4nKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19oZWxwLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2hlbHAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NGY4ZWQuLjAwMDAwMDAKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2hlbHAucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotIiIiVW5pdHRlc3RzIGZvciBpZGxlbGliLmNvbmZpZ0hlbHBTb3VyY2VFZGl0IiIiCi1pbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyLCBNYm94LCBFbnRyeQotZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdIZWxwU291cmNlRWRpdCBhcyBoZWxwX2RpYWxvZ19tb2R1bGUKLQotaGVscF9kaWFsb2cgPSBoZWxwX2RpYWxvZ19tb2R1bGUuR2V0SGVscFNvdXJjZURpYWxvZwotCi0KLWNsYXNzIER1bW15X2hlbHBfZGlhbG9nOgotICAgICMgTW9jayBmb3IgdGVzdGluZyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb2YgaGVscF9kaWFsb2cKLSAgICBtZW51X29rID0gaGVscF9kaWFsb2cubWVudV9vawotICAgIHBhdGhfb2sgPSBoZWxwX2RpYWxvZy5wYXRoX29rCi0gICAgb2sgPSBoZWxwX2RpYWxvZy5vawotICAgIGNhbmNlbCA9IGhlbHBfZGlhbG9nLmNhbmNlbAotICAgICMgQXR0cmlidXRlcywgY29uc3RhbnQgb3IgdmFyaWFibGUsIG5lZWRlZCBmb3IgdGVzdHMKLSAgICBtZW51ID0gVmFyKCkKLSAgICBlbnRyeU1lbnUgPSBFbnRyeSgpCi0gICAgcGF0aCA9IFZhcigpCi0gICAgZW50cnlQYXRoID0gRW50cnkoKQotICAgIHJlc3VsdCA9IE5vbmUKLSAgICBkZXN0cm95ZWQgPSBGYWxzZQotCi0gICAgZGVmIGRlc3Ryb3koc2VsZik6Ci0gICAgICAgIHNlbGYuZGVzdHJveWVkID0gVHJ1ZQotCi0KLSMgbWVudV9vayBhbmQgcGF0aF9vayBjYWxsIE1ib3guc2hvd2Vycm9yIGlmIG1lbnUgYW5kIHBhdGggYXJlIG5vdCBvay4KLW9yaWdfbWJveCA9IGhlbHBfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3gKLXNob3dlcnJvciA9IE1ib3guc2hvd2Vycm9yCi0KLQotY2xhc3MgQ29uZmlnSGVscFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRpYWxvZyA9IER1bW15X2hlbHBfZGlhbG9nKCkKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgICAgIGhlbHBfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3ggPSBNYm94Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgotICAgICAgICBoZWxwX2RpYWxvZ19tb2R1bGUudGtNZXNzYWdlQm94ID0gb3JpZ19tYm94Ci0KLSAgICBkZWYgdGVzdF9ibGFua19tZW51KHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5tZW51LnNldCgnJykKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmRpYWxvZy5tZW51X29rKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTWVudSBJdGVtIEVycm9yJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbignTm8nLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgIGRlZiB0ZXN0X2xvbmdfbWVudShzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cubWVudS5zZXQoJ2hlbGxvJyAqIDEwKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLm1lbnVfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdNZW51IEl0ZW0gRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdsb25nJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9nb29kX21lbnUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm1lbnUuc2V0KCdoZWxwJykKLSAgICAgICAgc2hvd2Vycm9yLnRpdGxlID0gJ05vIEVycm9yJyAgIyBzaG91bGQgbm90IGJlIGNhbGxlZAotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cubWVudV9vaygpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05vIEVycm9yJykKLQotICAgIGRlZiB0ZXN0X2JsYW5rX3BhdGgoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLnBhdGguc2V0KCcnKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLnBhdGhfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdGaWxlIFBhdGggRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdObycsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfaW52YWxpZF9maWxlX3BhdGgoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLnBhdGguc2V0KCdmb29iYXInICogMTAwKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZGlhbG9nLnBhdGhfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdGaWxlIFBhdGggRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZXhpc3QnLCBzaG93ZXJyb3IubWVzc2FnZSkKLQotICAgIGRlZiB0ZXN0X2ludmFsaWRfdXJsX3BhdGgoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLnBhdGguc2V0KCd3dy5mb29iYXIuY29tJykKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmRpYWxvZy5wYXRoX29rKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnRmlsZSBQYXRoIEVycm9yJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbignbm90IGV4aXN0Jywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICAgICAgc2VsZi5kaWFsb2cucGF0aC5zZXQoJ2h0dC5mb29iYXIuY29tJykKLSAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmRpYWxvZy5wYXRoX29rKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnRmlsZSBQYXRoIEVycm9yJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbignbm90IGV4aXN0Jywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9nb29kX3BhdGgoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLnBhdGguc2V0KCdodHRwczovL2RvY3MucHl0aG9uLm9yZycpCi0gICAgICAgIHNob3dlcnJvci50aXRsZSA9ICdObyBFcnJvcicgICMgc2hvdWxkIG5vdCBiZSBjYWxsZWQKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGlhbG9nLnBhdGhfb2soKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdObyBFcnJvcicpCi0KLSAgICBkZWYgdGVzdF9vayhzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cuZGVzdHJveWVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5kaWFsb2cubWVudS5zZXQoJ2hlbHAnKQotICAgICAgICBzZWxmLmRpYWxvZy5wYXRoLnNldCgnaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcnKQotICAgICAgICBzZWxmLmRpYWxvZy5vaygpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cucmVzdWx0LCAoJ2hlbHAnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodHRwczovL2RvY3MucHl0aG9uLm9yZycpKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuZGVzdHJveWVkKQotCi0gICAgZGVmIHRlc3RfY2FuY2VsKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95ZWQgPSBGYWxzZQotICAgICAgICBzZWxmLmRpYWxvZy5jYW5jZWwoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLnJlc3VsdCwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGlhbG9nLmRlc3Ryb3llZCkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX2tleS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19rZXkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwOTgyOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19rZXkucHkKQEAgLTAsMCArMSwzMSBAQAorJycnIFRlc3QgaWRsZWxpYi5jb25maWdfa2V5LgorCitDb3ZlcmFnZTogNTYlCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgY29uZmlnX2tleQorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0a2ludGVyIGltcG9ydCBUaywgVGV4dAorCisKK2NsYXNzIEdldEtleXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290ID0gVGsoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBkaWEgPSBjb25maWdfa2V5LkdldEtleXNEaWFsb2coCisgICAgICAgICAgICBzZWxmLnJvb3QsICd0ZXN0JywgJzw8VGVzdD4+JywgWyc8S2V5LUYxMj4nXSwgX3V0ZXN0PVRydWUpCisgICAgICAgIGRpYS5DYW5jZWwoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ19uYW1lLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX25hbWUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTcyYjkuLjAwMDAwMDAKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnX25hbWUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0iIiJVbml0IHRlc3RzIGZvciBpZGxlbGliLmNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nIiIiCi1pbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyLCBNYm94Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nIGFzIG5hbWVfZGlhbG9nX21vZHVsZQotCi1uYW1lX2RpYWxvZyA9IG5hbWVfZGlhbG9nX21vZHVsZS5HZXRDZmdTZWN0aW9uTmFtZURpYWxvZwotCi1jbGFzcyBEdW1teV9uYW1lX2RpYWxvZzoKLSAgICAjIE1vY2sgZm9yIHRlc3RpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzIG9mIG5hbWVfZGlhbG9nCi0gICAgbmFtZV9vayA9IG5hbWVfZGlhbG9nLm5hbWVfb2sKLSAgICBPayA9IG5hbWVfZGlhbG9nLk9rCi0gICAgQ2FuY2VsID0gbmFtZV9kaWFsb2cuQ2FuY2VsCi0gICAgIyBBdHRyaWJ1dGVzLCBjb25zdGFudCBvciB2YXJpYWJsZSwgbmVlZGVkIGZvciB0ZXN0cwotICAgIHVzZWRfbmFtZXMgPSBbJ3VzZWQnXQotICAgIG5hbWUgPSBWYXIoKQotICAgIHJlc3VsdCA9IE5vbmUKLSAgICBkZXN0cm95ZWQgPSBGYWxzZQotICAgIGRlZiBkZXN0cm95KHNlbGYpOgotICAgICAgICBzZWxmLmRlc3Ryb3llZCA9IFRydWUKLQotIyBuYW1lX29rIGNhbGxzIE1ib3guc2hvd2Vycm9yIGlmIG5hbWUgaXMgbm90IG9rCi1vcmlnX21ib3ggPSBuYW1lX2RpYWxvZ19tb2R1bGUudGtNZXNzYWdlQm94Ci1zaG93ZXJyb3IgPSBNYm94LnNob3dlcnJvcgotCi1jbGFzcyBDb25maWdOYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGlhbG9nID0gRHVtbXlfbmFtZV9kaWFsb2coKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKLSAgICAgICAgbmFtZV9kaWFsb2dfbW9kdWxlLnRrTWVzc2FnZUJveCA9IE1ib3gKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIG5hbWVfZGlhbG9nX21vZHVsZS50a01lc3NhZ2VCb3ggPSBvcmlnX21ib3gKLQotICAgIGRlZiB0ZXN0X2JsYW5rX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCcgJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5uYW1lX29rKCksICcnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05hbWUgRXJyb3InKQotICAgICAgICBzZWxmLmFzc2VydEluKCdObycsIHNob3dlcnJvci5tZXNzYWdlKQotCi0gICAgZGVmIHRlc3RfdXNlZF9uYW1lKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgndXNlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaWFsb2cubmFtZV9vaygpLCAnJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKLSAgICAgICAgc2VsZi5hc3NlcnRJbigndXNlJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9sb25nX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCdnb29kJyo4KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTmFtZSBFcnJvcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3RvbyBsb25nJywgc2hvd2Vycm9yLm1lc3NhZ2UpCi0KLSAgICBkZWYgdGVzdF9nb29kX25hbWUoc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLm5hbWUuc2V0KCcgIGdvb2QgJykKLSAgICAgICAgc2hvd2Vycm9yLnRpdGxlID0gJ05vIEVycm9yJyAgIyBzaG91bGQgbm90IGJlIGNhbGxlZAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlhbG9nLm5hbWVfb2soKSwgJ2dvb2QnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05vIEVycm9yJykKLQotICAgIGRlZiB0ZXN0X29rKHNlbGYpOgotICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95ZWQgPSBGYWxzZQotICAgICAgICBzZWxmLmRpYWxvZy5uYW1lLnNldCgnZ29vZCcpCi0gICAgICAgIHNlbGYuZGlhbG9nLk9rKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICdnb29kJykKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZGlhbG9nLmRlc3Ryb3llZCkKLQotICAgIGRlZiB0ZXN0X2NhbmNlbChzZWxmKToKLSAgICAgICAgc2VsZi5kaWFsb2cuZGVzdHJveWVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5kaWFsb2cuQ2FuY2VsKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5yZXN1bHQsICcnKQotICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kaWFsb2cuZGVzdHJveWVkKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2NvbmZpZ2RpYWxvZy5weQppbmRleCBiMDYzNjAxLi43MzZiMDk4IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9jb25maWdkaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfY29uZmlnZGlhbG9nLnB5CkBAIC0xLDIxICsxLDE5IEBACi0nJydUZXN0IGlkbGVsaWIuY29uZmlnRGlhbG9nLgorJycnVGVzdCBpZGxlbGliLmNvbmZpZ2RpYWxvZy4KIAogQ292ZXJhZ2U6IDQ2JSBqdXN0IGJ5IGNyZWF0aW5nIGRpYWxvZy4KIFRoZSBvdGhlciBoYWxmIGlzIGNvZGUgZm9yIHdvcmtpbmcgd2l0aCB1c2VyIGN1c3RvbWl6YXRpb25zLgogJycnCi1mcm9tIGlkbGVsaWIuY29uZmlnRGlhbG9nIGltcG9ydCBDb25maWdEaWFsb2cgICMgYWx3YXlzIHRlc3QgaW1wb3J0Citmcm9tIGlkbGVsaWIuY29uZmlnZGlhbG9nIGltcG9ydCBDb25maWdEaWFsb2cgICMgYWx3YXlzIHRlc3QgaW1wb3J0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIHJlcXVpcmVzKCdndWknKQogZnJvbSB0a2ludGVyIGltcG9ydCBUawogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQgYXMgbWFjb3N4CiAKIGNsYXNzIENvbmZpZ0RpYWxvZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLnJvb3QgPSBUaygpCi0gICAgICAgIG1hY29zeC5faW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzKGNscy5yb290KQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKQEAgLTIzLDcgKzIxLDcgQEAKICAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCiAgICAgICAgIGRlbCBjbHMucm9vdAogCi0gICAgZGVmIHRlc3RfZGlhbG9nKHNlbGYpOgorICAgIGRlZiB0ZXN0X2NvbmZpZ2RpYWxvZyhzZWxmKToKICAgICAgICAgZCA9IENvbmZpZ0RpYWxvZyhzZWxmLnJvb3QsICdUZXN0JywgX3V0ZXN0PVRydWUpCiAgICAgICAgIGQucmVtb3ZlX3Zhcl9jYWxsYmFja3MoKQogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWJ1Z2dlci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlYnVnZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmE5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWJ1Z2dlci5weQpAQCAtMCwwICsxLDI5IEBACisnJycgVGVzdCBpZGxlbGliLmRlYnVnZ2VyLgorCitDb3ZlcmFnZTogMTklCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdnZXIKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworcmVxdWlyZXMoJ2d1aScpCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGsKKworCitjbGFzcyBOYW1lU3BhY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290ID0gVGsoKQorICAgICAgICBjbHMucm9vdC53aXRoZHJhdygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBkZWJ1Z2dlci5OYW1lc3BhY2VWaWV3ZXIoc2VsZi5yb290LCAnVGVzdCcpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZGVsZWdhdG9yLnB5CmluZGV4IDFmMGJhYTkuLjg1NjI0ZmIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2RlbGVnYXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9kZWxlZ2F0b3IucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYi5EZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorZnJvbSBpZGxlbGliLmRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCiAKIGNsYXNzIERlbGVnYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9lZGl0bWVudS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRtZW51LnB5CmluZGV4IDUwMzE3YTkuLjY1NGYwNjAgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRtZW51LnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRtZW51LnB5CkBAIC01LDggKzUsOSBAQAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiByZXF1aXJlcygnZ3VpJykKIGltcG9ydCB0a2ludGVyIGFzIHRrCitmcm9tIHRraW50ZXIgaW1wb3J0IHR0awogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcHlzaGVsbAogCiBjbGFzcyBQYXN0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICcnJ1Rlc3QgcGFzdGluZyBpbnRvIHdpZGdldHMgdGhhdCBhbGxvdyBwYXN0aW5nLgpAQCAtMTYsMTYgKzE3LDE3IEBACiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLnJvb3QgPSByb290ID0gdGsuVGsoKQotICAgICAgICBQeVNoZWxsLmZpeF94MTFfcGFzdGUocm9vdCkKKyAgICAgICAgcHlzaGVsbC5maXhfeDExX3Bhc3RlKHJvb3QpCiAgICAgICAgIGNscy50ZXh0ID0gdGsuVGV4dChyb290KQogICAgICAgICBjbHMuZW50cnkgPSB0ay5FbnRyeShyb290KQorICAgICAgICBjbHMudGVudHJ5ID0gdHRrLkVudHJ5KHJvb3QpCiAgICAgICAgIGNscy5zcGluID0gdGsuU3BpbmJveChyb290KQogICAgICAgICByb290LmNsaXBib2FyZF9jbGVhcigpCiAgICAgICAgIHJvb3QuY2xpcGJvYXJkX2FwcGVuZCgndHdvJykKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6Ci0gICAgICAgIGRlbCBjbHMudGV4dCwgY2xzLmVudHJ5LCBjbHMuc3BpbgorICAgICAgICBkZWwgY2xzLnRleHQsIGNscy5lbnRyeSwgY2xzLnRlbnRyeQogICAgICAgICBjbHMucm9vdC5jbGlwYm9hcmRfY2xlYXIoKQogICAgICAgICBjbHMucm9vdC51cGRhdGVfaWRsZXRhc2tzKCkKICAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCkBAIC00MywxNiArNDUsMTYgQEAKIAogICAgIGRlZiB0ZXN0X3Bhc3RlX2VudHJ5KHNlbGYpOgogICAgICAgICAiVGVzdCBwYXN0aW5nIGludG8gYW4gZW50cnkgd2l0aCBhbmQgd2l0aG91dCBhIHNlbGVjdGlvbi4iCi0gICAgICAgICMgT24gMy42LCBnZW5lcmF0ZWQgPDxQYXN0ZT4+IGZhaWxzIHdpdGhvdXQgZW1wdHkgc2VsZWN0IHJhbmdlCi0gICAgICAgICMgZm9yICdubyBzZWxlY3Rpb24nLiAgTGl2ZSB3aWRnZXQgd29ya3MgZmluZS4KLSAgICAgICAgZW50cnkgPSBzZWxmLmVudHJ5Ci0gICAgICAgIGZvciBlbmQsIGFucyBpbiAoMCwgJ29uZXR3bycpLCAoJ2VuZCcsICd0d28nKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGVudHJ5PWVudHJ5LCBlbmQ9ZW5kLCBhbnM9YW5zKToKLSAgICAgICAgICAgICAgICBlbnRyeS5kZWxldGUoMCwgJ2VuZCcpCi0gICAgICAgICAgICAgICAgZW50cnkuaW5zZXJ0KDAsICdvbmUnKQotICAgICAgICAgICAgICAgIGVudHJ5LnNlbGVjdF9yYW5nZSgwLCBlbmQpICAjIHNlZSBub3RlCi0gICAgICAgICAgICAgICAgZW50cnkuZXZlbnRfZ2VuZXJhdGUoJzw8UGFzdGU+PicpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5nZXQoKSwgYW5zKQorICAgICAgICAjIEdlbmVyYXRlZCA8PFBhc3RlPj4gZmFpbHMgZm9yIHRrIGVudHJ5IHdpdGhvdXQgZW1wdHkgc2VsZWN0CisgICAgICAgICMgcmFuZ2UgZm9yICdubyBzZWxlY3Rpb24nLiAgTGl2ZSB3aWRnZXQgd29ya3MgZmluZS4KKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cnksIHNlbGYudGVudHJ5OgorICAgICAgICAgICAgZm9yIGVuZCwgYW5zIGluICgwLCAnb25ldHdvJyksICgnZW5kJywgJ3R3bycpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGVudHJ5PWVudHJ5LCBlbmQ9ZW5kLCBhbnM9YW5zKToKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGVsZXRlKDAsICdlbmQnKQorICAgICAgICAgICAgICAgICAgICBlbnRyeS5pbnNlcnQoMCwgJ29uZScpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnNlbGVjdF9yYW5nZSgwLCBlbmQpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmV2ZW50X2dlbmVyYXRlKCc8PFBhc3RlPj4nKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LmdldCgpLCBhbnMpCiAKICAgICBkZWYgdGVzdF9wYXN0ZV9zcGluKHNlbGYpOgogICAgICAgICAiVGVzdCBwYXN0aW5nIGludG8gYSBzcGluYm94IHdpdGggYW5kIHdpdGhvdXQgYSBzZWxlY3Rpb24uIgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG9yLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZWRpdG9yLnB5CmluZGV4IGEzMWQyNmQuLmU5ZDI5ZDQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2VkaXRvci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9lZGl0b3IucHkKQEAgLTEsNiArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKLWZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdworZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIAogY2xhc3MgRWRpdG9yX2Z1bmNfdGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9ncmVwLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZ3JlcC5weQppbmRleCAwZDhmZjBkLi42YjU0YzEzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9ncmVwLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2dyZXAucHkKQEAgLTEsNSArMSw1IEBACiAiIiIgIUNoYW5naW5nIHRoaXMgbGluZSB3aWxsIGJyZWFrIFRlc3RfZmluZGZpbGUudGVzdF9mb3VuZCEKLU5vbi1ndWkgdW5pdCB0ZXN0cyBmb3IgaWRsZWxpYi5HcmVwRGlhbG9nIG1ldGhvZHMuCitOb24tZ3VpIHVuaXQgdGVzdHMgZm9yIGdyZXAuR3JlcERpYWxvZyBtZXRob2RzLgogZHVtbXlfY29tbWFuZCBjYWxscyBncmVwX2l0IGNhbGxzIGZpbmRmaWxlcy4KIEFuIGV4Y2VwdGlvbiByYWlzZWQgaW4gb25lIG1ldGhvZCB3aWxsIGZhaWwgY2FsbGVycy4KIE90aGVyd2lzZSwgdGVzdHMgYXJlIG1vc3RseSBpbmRlcGVuZGVudC4KQEAgLTgsNyArOCw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyCi1mcm9tIGlkbGVsaWIuR3JlcERpYWxvZyBpbXBvcnQgR3JlcERpYWxvZworZnJvbSBpZGxlbGliLmdyZXAgaW1wb3J0IEdyZXBEaWFsb2cKIGltcG9ydCByZQogCiBjbGFzcyBEdW1teV9zZWFyY2hlbmdpbmU6CkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lc1s0XS5zdGFydHN3aXRoKCcoSGludDonKSkKIAogY2xhc3MgRGVmYXVsdF9jb21tYW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIyBUbyB3cml0ZSB0aGlzLCBtb2RlIE91dHB1dFdpbmRvdyBpbXBvcnQgdG8gdG9wIG9mIEdyZXBEaWFsb2cKKyAgICAjIFRvIHdyaXRlIHRoaXMsIG1vdmUgb3V0d2luIGltcG9ydCB0byB0b3Agb2YgR3JlcERpYWxvZwogICAgICMgc28gaXQgY2FuIGJlIHJlcGxhY2VkIGJ5IGNhcHR1cmVkX3N0ZG91dCBpbiBjbGFzcyBzZXR1cC90ZWFyZG93bi4KICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHAucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oZWxwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjhlMjMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oZWxwLnB5CkBAIC0wLDAgKzEsMzQgQEAKKycnJ1Rlc3QgaWRsZWxpYi5oZWxwLgorCitDb3ZlcmFnZTogODclCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaGVscAorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCityZXF1aXJlcygnZ3VpJykKK2Zyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aCwgZGlybmFtZSwgam9pbgorZnJvbSB0a2ludGVyIGltcG9ydCBUaworaW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIEhlbHBGcmFtZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgIkJ5IGl0c2VsZiwgdGhpcyB0ZXN0cyB0aGF0IGZpbGUgcGFyc2VkIHdpdGhvdXQgZXhjZXB0aW9uLiIKKyAgICAgICAgY2xzLnJvb3QgPSByb290ID0gVGsoKQorICAgICAgICByb290LndpdGhkcmF3KCkKKyAgICAgICAgaGVscGZpbGUgPSBqb2luKGRpcm5hbWUoZGlybmFtZShhYnNwYXRoKF9fZmlsZV9fKSkpLCAnaGVscC5odG1sJykKKyAgICAgICAgY2xzLmZyYW1lID0gaGVscC5IZWxwRnJhbWUocm9vdCwgaGVscGZpbGUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBkZWwgY2xzLmZyYW1lCisgICAgICAgIGNscy5yb290LnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgdGVzdF9saW5lMShzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYuZnJhbWUudGV4dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuZ2V0KCcxLjAnLCAnMS5lbmQnKSwgJyBJRExFICcpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHBfYWJvdXQucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oZWxwX2Fib3V0LnB5CmluZGV4IGQwYTAxMjcuLjg0M2VmYjkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hlbHBfYWJvdXQucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGVscF9hYm91dC5weQpAQCAtMiwxMCArMiwxMCBAQAogCiBDb3ZlcmFnZToKICcnJwotZnJvbSBpZGxlbGliIGltcG9ydCBhYm91dERpYWxvZyBhcyBoZWxwX2Fib3V0Ci1mcm9tIGlkbGVsaWIgaW1wb3J0IHRleHRWaWV3IGFzIHRleHR2aWV3Citmcm9tIGlkbGVsaWIgaW1wb3J0IGhlbHBfYWJvdXQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgdGV4dHZpZXcKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja19pZGxlIGltcG9ydCBGdW5jCi1mcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IE1ib3gKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveF9mdW5jCiBpbXBvcnQgdW5pdHRlc3QKIAogQWJvdXQgPSBoZWxwX2Fib3V0LkFib3V0RGlhbG9nCkBAIC0xOSwzMyArMTksMzMgQEAKIAogCiBjbGFzcyBEaXNwbGF5RmlsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICJUZXN0IHRoYXQgLnR4dCBmaWxlcyBhcmUgZm91bmQgYW5kIHByb3Blcmx5IGRlY29kZWQuIgogICAgIGRpYWxvZyA9IER1bW15X2Fib3V0X2RpYWxvZygpCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgotICAgICAgICBjbHMub3JpZ19tYm94ID0gdGV4dHZpZXcudGtNZXNzYWdlQm94CisgICAgICAgIGNscy5vcmlnX2Vycm9yID0gdGV4dHZpZXcuc2hvd2Vycm9yCiAgICAgICAgIGNscy5vcmlnX3ZpZXcgPSB0ZXh0dmlldy52aWV3X3RleHQKLSAgICAgICAgY2xzLm1ib3ggPSBNYm94KCkKKyAgICAgICAgY2xzLmVycm9yID0gTWJveF9mdW5jKCkKICAgICAgICAgY2xzLnZpZXcgPSBGdW5jKCkKLSAgICAgICAgdGV4dHZpZXcudGtNZXNzYWdlQm94ID0gY2xzLm1ib3gKKyAgICAgICAgdGV4dHZpZXcuc2hvd2Vycm9yID0gY2xzLmVycm9yCiAgICAgICAgIHRleHR2aWV3LnZpZXdfdGV4dCA9IGNscy52aWV3CiAgICAgICAgIGNscy5BYm91dCA9IER1bW15X2Fib3V0X2RpYWxvZygpCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgotICAgICAgICB0ZXh0dmlldy50a01lc3NhZ2VCb3ggPSBjbHMub3JpZ19tYm94CisgICAgICAgIHRleHR2aWV3LnNob3dlcnJvciA9IGNscy5vcmlnX2Vycm9yCiAgICAgICAgIHRleHR2aWV3LnZpZXdfdGV4dCA9IGNscy5vcmlnX3ZpZXcKIAogICAgIGRlZiB0ZXN0X2ZpbGVfaXNwbGF5KHNlbGYpOgogICAgICAgICBmb3IgaGFuZGxlciBpbiAoc2VsZi5kaWFsb2cuaWRsZV9jcmVkaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWFsb2cuaWRsZV9yZWFkbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpYWxvZy5pZGxlX25ld3MpOgotICAgICAgICAgICAgc2VsZi5tYm94LnNob3dlcnJvci5tZXNzYWdlID0gJycKKyAgICAgICAgICAgIHNlbGYuZXJyb3IubWVzc2FnZSA9ICcnCiAgICAgICAgICAgICBzZWxmLnZpZXcuY2FsbGVkID0gRmFsc2UKLSAgICAgICAgICAgIGhhbmRsZXIoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1ib3guc2hvd2Vycm9yLm1lc3NhZ2UsICcnKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnZpZXcuY2FsbGVkLCBUcnVlKQorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoaGFuZGxlcj1oYW5kbGVyKToKKyAgICAgICAgICAgICAgICBoYW5kbGVyKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZXJyb3IubWVzc2FnZSwgJycpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnZpZXcuY2FsbGVkLCBUcnVlKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pZGxlaGlzdG9yeS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hpc3RvcnkucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaWRsZWhpc3RvcnkucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2hpc3RvcnkucHkKaW5kZXggZDdjM2Q3MC4uNmU4MjY5YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaWRsZWhpc3RvcnkucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaGlzdG9yeS5weQpAQCAtNCw4ICs0LDggQEAKIGltcG9ydCB0a2ludGVyIGFzIHRrCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRleHQgYXMgdGtUZXh0CiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFRleHQgYXMgbWtUZXh0Ci1mcm9tIGlkbGVsaWIuSWRsZUhpc3RvcnkgaW1wb3J0IEhpc3RvcnkKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmhpc3RvcnkgaW1wb3J0IEhpc3RvcnkKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIGxpbmUxID0gJ2EgPSA3JwogbGluZTIgPSAnYiA9IGEnCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9oeXBlcnBhcnNlci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2h5cGVycGFyc2VyLnB5CmluZGV4IGVkZmM3ODMuLjA2N2U1YjEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2h5cGVycGFyc2VyLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2h5cGVycGFyc2VyLnB5CkBAIC0xLDkgKzEsOSBAQAotIiIiVW5pdHRlc3QgZm9yIGlkbGVsaWIuSHlwZXJQYXJzZXIiIiIKKyIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLmh5cGVycGFyc2VyLnB5LiIiIgogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKLWZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdwotZnJvbSBpZGxlbGliLkh5cGVyUGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgorZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93Citmcm9tIGlkbGVsaWIuaHlwZXJwYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCiAKIGNsYXNzIER1bW15RWRpdHdpbjoKICAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pby5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvbWVudS5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9pby5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfaW9tZW51LnB5CmluZGV4IGUwZTNiOTguLmY4ZmYxMTIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2lvbWVudS5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IGlvCi1mcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgUHNldWRvSW5wdXRGaWxlLCBQc2V1ZG9PdXRwdXRGaWxlCitmcm9tIGlkbGVsaWIucHlzaGVsbCBpbXBvcnQgUHNldWRvSW5wdXRGaWxlLCBQc2V1ZG9PdXRwdXRGaWxlCiAKIAogY2xhc3MgUyhzdHIpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfbWFjb3N4LnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfbWFjb3N4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjE2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9tYWNvc3gucHkKQEAgLTAsMCArMSwxMDEgQEAKKycnJ1Rlc3QgaWRsZWxpYi5tYWNvc3gucHkuCisKK0NvdmVyYWdlOiA3MSUgb24gV2luZG93cy4KKycnJworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcworaW1wb3J0IHN5cworaW1wb3J0IHRraW50ZXIgYXMgdGsKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0Lm1vY2sgYXMgbW9jaworZnJvbSBpZGxlbGliLmZpbGVsaXN0IGltcG9ydCBGaWxlTGlzdAorCittYWN0eXBlcyA9IHsnY2FyYm9uJywgJ2NvY29hJywgJ3hxdWFydHonfQorbm9udHlwZXMgPSB7J290aGVyJ30KK2FsbHR5cGVzID0gbWFjdHlwZXMgfCBub250eXBlcworCisKK2NsYXNzIEluaXRUa3R5cGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBfaW5pdF90a190eXBlLiIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHRrLlRrKCkKKyAgICAgICAgY2xzLm9yaWdfcGxhdGZvcm0gPSBtYWNvc3gucGxhdGZvcm0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisgICAgICAgIG1hY29zeC5wbGF0Zm9ybSA9IGNscy5vcmlnX3BsYXRmb3JtCisKKyAgICBkZWYgdGVzdF9pbml0X3NldHNfdGt0eXBlKHNlbGYpOgorICAgICAgICAiVGVzdCB0aGF0IF9pbml0X3RrX3R5cGUgc2V0cyBfdGtfdHlwZSBhY2NvcmRpbmcgdG8gcGxhdGZvcm0uIgorICAgICAgICBmb3IgcGxhdGZvcm0sIHR5cGVzIGluICgnZGFyd2luJywgYWxsdHlwZXMpLCAoJ290aGVyJywgbm9udHlwZXMpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QocGxhdGZvcm09cGxhdGZvcm0pOgorICAgICAgICAgICAgICAgIG1hY29zeC5wbGF0Zm9ybSA9IHBsYXRmb3JtCisgICAgICAgICAgICAgICAgbWFjb3N4Ll90a190eXBlID09IE5vbmUKKyAgICAgICAgICAgICAgICBtYWNvc3guX2luaXRfdGtfdHlwZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtYWNvc3guX3RrX3R5cGUsIHR5cGVzKQorCisKK2NsYXNzIElzVHlwZVRrVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgZWFjaCBvZiB0aGUgZm91ciBpc1R5cGVUayBwcmVkZWNhdGVzLiIKKyAgICBpc2Z1bmNzID0gKChtYWNvc3guaXNBcXVhVGssICgnY2FyYm9uJywgJ2NvY29hJykpLAorICAgICAgICAgICAgICAgKG1hY29zeC5pc0NhcmJvblRrLCAoJ2NhcmJvbicpKSwKKyAgICAgICAgICAgICAgIChtYWNvc3guaXNDb2NvYVRrLCAoJ2NvY29hJykpLAorICAgICAgICAgICAgICAgKG1hY29zeC5pc1hRdWFydHosICgneHF1YXJ0eicpKSwKKyAgICAgICAgICAgICAgICkKKworICAgIEBtb2NrLnBhdGNoKCdpZGxlbGliLm1hY29zeC5faW5pdF90a190eXBlJykKKyAgICBkZWYgdGVzdF9pc19jYWxsc19pbml0KHNlbGYsIG1vY2tpbml0KToKKyAgICAgICAgIlRlc3QgdGhhdCBlYWNoIGlzVHlwZVRrIGNhbGxzIF9pbml0X3RrX3R5cGUgd2hlbiBfdGtfdHlwZSBpcyBOb25lLiIKKyAgICAgICAgbWFjb3N4Ll90a190eXBlID0gTm9uZQorICAgICAgICBmb3IgZnVuYywgd2hlbnRydWUgaW4gc2VsZi5pc2Z1bmNzOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZnVuYz1mdW5jKToKKyAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja2luaXQuY2FsbGVkKQorICAgICAgICAgICAgICAgIG1vY2tpbml0LnJlc2V0X21vY2soKQorCisgICAgZGVmIHRlc3RfaXNmdW5jcyhzZWxmKToKKyAgICAgICAgIlRlc3QgdGhhdCBlYWNoIGlzVHlwZVRrIHJldHVybiBjb3JyZWN0IGJvb2wuIgorICAgICAgICBmb3IgZnVuYywgd2hlbnRydWUgaW4gc2VsZi5pc2Z1bmNzOgorICAgICAgICAgICAgZm9yIHRrdHlwZSBpbiBhbGx0eXBlczoKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChmdW5jPWZ1bmMsIHdoZW50cnVlPXdoZW50cnVlLCB0a3R5cGU9dGt0eXBlKToKKyAgICAgICAgICAgICAgICAgICAgbWFjb3N4Ll90a190eXBlID0gdGt0eXBlCisgICAgICAgICAgICAgICAgICAgIChzZWxmLmFzc2VydFRydWUgaWYgdGt0eXBlIGluIHdoZW50cnVlIGVsc2Ugc2VsZi5hc3NlcnRGYWxzZSlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bmMoKSkKKworCitjbGFzcyBTZXR1cFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICJUZXN0IHNldHVwQXBwLiIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHRrLlRrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBAbW9jay5wYXRjaCgnaWRsZWxpYi5tYWNvc3gub3ZlcnJpZGVSb290TWVudScpICAjMjczMTIKKyAgICBkZWYgdGVzdF9zZXR1cGFwcChzZWxmLCBvdmVycmlkZVJvb3RNZW51KToKKyAgICAgICAgIkNhbGwgc2V0dXBBcHAgd2l0aCBlYWNoIHBvc3NpYmxlIGdyYXBoaWNzIHR5cGUuIgorICAgICAgICByb290ID0gc2VsZi5yb290CisgICAgICAgIGZsaXN0ID0gRmlsZUxpc3Qocm9vdCkKKyAgICAgICAgZm9yIHRrdHlwZSBpbiBhbGx0eXBlczoKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHRrdHlwZT10a3R5cGUpOgorICAgICAgICAgICAgICAgIG1hY29zeC5fdGtfdHlwZSA9IHRrdHlwZQorICAgICAgICAgICAgICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBmbGlzdCkKKyAgICAgICAgICAgICAgICBpZiB0a3R5cGUgaW4gKCdjYXJib24nLCAnY29jb2EnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG92ZXJyaWRlUm9vdE1lbnUuY2FsbGVkKQorICAgICAgICAgICAgICAgIG92ZXJyaWRlUm9vdE1lbnUucmVzZXRfbW9jaygpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfZm9ybWF0cGFyYWdyYXBoLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyYWdyYXBoLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2Zvcm1hdHBhcmFncmFwaC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyYWdyYXBoLnB5CmluZGV4IGU1NTYxZDguLjQ3NDFlYjggMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X2Zvcm1hdHBhcmFncmFwaC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJhZ3JhcGgucHkKQEAgLTEsNyArMSw3IEBACi0jIFRlc3QgdGhlIGZ1bmN0aW9ucyBhbmQgbWFpbiBjbGFzcyBtZXRob2Qgb2YgRm9ybWF0UGFyYWdyYXBoLnB5CisjIFRlc3QgdGhlIGZ1bmN0aW9ucyBhbmQgbWFpbiBjbGFzcyBtZXRob2Qgb2YgcGFyYWdyYXBoLnB5CiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gaWRsZWxpYiBpbXBvcnQgRm9ybWF0UGFyYWdyYXBoIGFzIGZwCi1mcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcGFyYWdyYXBoIGFzIGZwCitmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3cKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogCkBAIC0zOCw3ICszOCw3IEBACiAKIAogY2xhc3MgRmluZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgICIiIlRlc3QgdGhlIGZpbmRfcGFyYWdyYXBoIGZ1bmN0aW9uIGluIEZvcm1hdFBhcmFncmFwaC4KKyAgICAiIiJUZXN0IHRoZSBmaW5kX3BhcmFncmFwaCBmdW5jdGlvbiBpbiBwYXJhZ3JhcGggbW9kdWxlLgogCiAgICAgVXNpbmcgdGhlIHJ1bmNhc2UoKSBmdW5jdGlvbiwgZmluZF9wYXJhZ3JhcGgoKSBpcyBjYWxsZWQgd2l0aCAnbWFyaycgc2V0IGF0CiAgICAgbXVsdGlwbGUgaW5kZXhlcyBiZWZvcmUgYW5kIGluc2lkZSB0aGUgdGVzdCBwYXJhZ3JhcGguCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJlbm1hdGNoLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGFyZW5tYXRjaC5weQppbmRleCA5NWNjMjJjLi5kNDY3YTlhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXJlbm1hdGNoLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BhcmVubWF0Y2gucHkKQEAgLTEsNCArMSw0IEBACi0nJydUZXN0IGlkbGVsaWIuUGFyZW5NYXRjaC4KKycnJ1Rlc3QgaWRsZWxpYi5wYXJlbm1hdGNoLgogCiBUaGlzIG11c3QgY3VycmVudGx5IGJlIGEgZ3VpIHRlc3QgYmVjYXVzZSBQYXJlbk1hdGNoIG1ldGhvZHMgdXNlCiBzZXZlcmFsIHRleHQgbWV0aG9kcyBub3QgZGVmaW5lZCBvbiBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrLlRleHQuCkBAIC05LDcgKzksNyBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKLWZyb20gaWRsZWxpYi5QYXJlbk1hdGNoIGltcG9ydCBQYXJlbk1hdGNoCitmcm9tIGlkbGVsaWIucGFyZW5tYXRjaCBpbXBvcnQgUGFyZW5NYXRjaAogCiBjbGFzcyBEdW1teUVkaXR3aW46CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGF0aGJyb3dzZXIucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXRoYnJvd3Nlci5weQppbmRleCBhZmI4ODZmLi44MTNjYmNjIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXRoYnJvd3Nlci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wYXRoYnJvd3Nlci5weQpAQCAtMiwxMyArMiwxMyBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgaWRsZWxpYgotZnJvbSBpZGxlbGliIGltcG9ydCBQYXRoQnJvd3NlcgorZnJvbSBpZGxlbGliIGltcG9ydCBwYXRoYnJvd3NlcgogCiBjbGFzcyBQYXRoQnJvd3NlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfRGlyQnJvd3NlclRyZWVJdGVtKHNlbGYpOgogICAgICAgICAjIElzc3VlMTYyMjYgLSBtYWtlIHN1cmUgdGhhdCBnZXR0aW5nIGEgc3VibGlzdCB3b3JrcwotICAgICAgICBkID0gUGF0aEJyb3dzZXIuRGlyQnJvd3NlclRyZWVJdGVtKCcnKQorICAgICAgICBkID0gcGF0aGJyb3dzZXIuRGlyQnJvd3NlclRyZWVJdGVtKCcnKQogICAgICAgICBkLkdldFN1Ykxpc3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBkLkdldFRleHQoKSkKIApAQCAtMTcsMTEgKzE3LDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pc3BhY2thZ2VkaXIoZGlyICsgJy9JY29ucycpLCBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X1BhdGhCcm93c2VyVHJlZUl0ZW0oc2VsZik6Ci0gICAgICAgIHAgPSBQYXRoQnJvd3Nlci5QYXRoQnJvd3NlclRyZWVJdGVtKCkKKyAgICAgICAgcCA9IHBhdGhicm93c2VyLlBhdGhCcm93c2VyVHJlZUl0ZW0oKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuR2V0VGV4dCgpLCAnc3lzLnBhdGgnKQogICAgICAgICBzdWIgPSBwLkdldFN1Ykxpc3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWIpLCBsZW4oc3lzLnBhdGgpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3ViWzBdKSwgUGF0aEJyb3dzZXIuRGlyQnJvd3NlclRyZWVJdGVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3ViWzBdKSwgcGF0aGJyb3dzZXIuRGlyQnJvd3NlclRyZWVJdGVtKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wZXJjb2xhdG9yLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcGVyY29sYXRvci5weQppbmRleCA0YzBhN2FkLi41NzNiOWExIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9wZXJjb2xhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3BlcmNvbGF0b3IucHkKQEAgLTEsMTAgKzEsMTAgQEAKLScnJ1Rlc3QgUGVyY29sYXRvcicnJworJycnVGVzdCBwZXJjb2xhdG9yLnB5LicnJwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCiByZXF1aXJlcygnZ3VpJykKIAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRraW50ZXIgaW1wb3J0IFRleHQsIFRrLCBFTkQKLWZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yLCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yLCBEZWxlZ2F0b3IKIAogCiBjbGFzcyBNeUZpbHRlcihEZWxlZ2F0b3IpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcXVlcnkucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9xdWVyeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzM3MmEzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcXVlcnkucHkKQEAgLTAsMCArMSwzOTYgQEAKKyIiIlRlc3QgaWRsZWxpYi5xdWVyeS4KKworTm9uLWd1aSB0ZXN0cyBmb3IgUXVlcnksIFNlY3Rpb25OYW1lLCBNb2R1bGVOYW1lLCBhbmQgSGVscFNvdXJjZSB1c2UKK2R1bW15IHZlcnNpb25zIHRoYXQgZXh0cmFjdCB0aGUgbm9uLWd1aSBtZXRob2RzIGFuZCBhZGQgb3RoZXIgbmVlZGVkCithdHRyaWJ1dGVzLiAgR1VJIHRlc3RzIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBlYWNoIGNsYXNzIGFuZCBzaW11bGF0ZQorZW50cmllcyBhbmQgYnV0dG9uIGNsaWNrcy4gIFN1YmNsYXNzIHRlc3RzIG9ubHkgdGFyZ2V0IHRoZSBuZXcgY29kZSBpbgordGhlIHN1YmNsYXNzIGRlZmluaXRpb24uCisKK1RoZSBhcHBlYXJhbmNlIG9mIHRoZSB3aWRnZXRzIGlzIGNoZWNrZWQgYnkgdGhlIFF1ZXJ5IGFuZAorSGVscFNvdXJjZSBodGVzdHMuICBUaGVzZSBhcmUgcnVuIGJ5IHJ1bm5pbmcgcXVlcnkucHkuCisKK0NvdmVyYWdlOiA5NCUgKDEwMCUgZm9yIFF1ZXJ5IGFuZCBTZWN0aW9uTmFtZSkuCis2IG9mIDggbWlzc2luZyBhcmUgTW9kdWxlTmFtZSBleGNlcHRpb25zIEkgZG9uJ3Qga25vdyBob3cgdG8gdHJpZ2dlci4KKyIiIgorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJlcXVpcmVzCitmcm9tIHRraW50ZXIgaW1wb3J0IFRrCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKK2Zyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgVmFyLCBNYm94X2Z1bmMKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcXVlcnkKKworIyBNb2NrIGVudHJ5LnNob3dlcnJvciBtZXNzYWdlYm94IHNvIGRvbid0IG5lZWQgY2xpY2sgdG8gY29udGludWUKKyMgd2hlbiBlbnRyeV9vayBhbmQgcGF0aF9vayBtZXRob2RzIGNhbGwgaXQgdG8gZGlzcGxheSBlcnJvcnMuCisKK29yaWdfc2hvd2Vycm9yID0gcXVlcnkuc2hvd2Vycm9yCitzaG93ZXJyb3IgPSBNYm94X2Z1bmMoKSAgIyBJbnN0YW5jZSBoYXMgX19jYWxsX18gbWV0aG9kLgorCitkZWYgc2V0VXBNb2R1bGUoKToKKyAgICBxdWVyeS5zaG93ZXJyb3IgPSBzaG93ZXJyb3IKKworZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgcXVlcnkuc2hvd2Vycm9yID0gb3JpZ19zaG93ZXJyb3IKKworCisjIE5PTi1HVUkgVEVTVFMKKworY2xhc3MgUXVlcnlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiVGVzdCBRdWVyeSBiYXNlIGNsYXNzLiIKKworICAgIGNsYXNzIER1bW15X1F1ZXJ5OgorICAgICAgICAjIFRlc3QgdGhlIGZvbGxvd2luZyBRdWVyeSBtZXRob2RzLgorICAgICAgICBlbnRyeV9vayA9IHF1ZXJ5LlF1ZXJ5LmVudHJ5X29rCisgICAgICAgIG9rID0gcXVlcnkuUXVlcnkub2sKKyAgICAgICAgY2FuY2VsID0gcXVlcnkuUXVlcnkuY2FuY2VsCisgICAgICAgICMgQWRkIGF0dHJpYnV0ZXMgbmVlZGVkIGZvciB0aGUgdGVzdHMuCisgICAgICAgIGVudHJ5ID0gVmFyKCkKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICBkZXN0cm95ZWQgPSBGYWxzZQorICAgICAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZGVzdHJveWVkID0gVHJ1ZQorCisgICAgZGlhbG9nID0gRHVtbXlfUXVlcnkoKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzaG93ZXJyb3IudGl0bGUgPSBOb25lCisgICAgICAgIHNlbGYuZGlhbG9nLnJlc3VsdCA9IE5vbmUKKyAgICAgICAgc2VsZi5kaWFsb2cuZGVzdHJveWVkID0gRmFsc2UKKworICAgIGRlZiB0ZXN0X2VudHJ5X29rX2JsYW5rKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZGlhbG9nLmVudHJ5LnNldCgnICcpCisgICAgICAgIEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbCgoZGlhbG9nLnJlc3VsdCwgZGlhbG9nLmRlc3Ryb3llZCksIChOb25lLCBGYWxzZSkpCisgICAgICAgIEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ0VudHJ5IEVycm9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQmxhbmsnLCBzaG93ZXJyb3IubWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2VudHJ5X29rX2dvb2Qoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCcgIGdvb2QgJykKKyAgICAgICAgRXF1YWwoZGlhbG9nLmVudHJ5X29rKCksICdnb29kJykKKyAgICAgICAgRXF1YWwoKGRpYWxvZy5yZXN1bHQsIGRpYWxvZy5kZXN0cm95ZWQpLCAoTm9uZSwgRmFsc2UpKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9va19ibGFuayhzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGRpYWxvZy5lbnRyeS5zZXQoJycpCisgICAgICAgIGRpYWxvZy5lbnRyeS5mb2N1c19zZXQgPSBtb2NrLk1vY2soKQorICAgICAgICBFcXVhbChkaWFsb2cub2soKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5lbnRyeS5mb2N1c19zZXQuY2FsbGVkKQorICAgICAgICBkZWwgZGlhbG9nLmVudHJ5LmZvY3VzX3NldAorICAgICAgICBFcXVhbCgoZGlhbG9nLnJlc3VsdCwgZGlhbG9nLmRlc3Ryb3llZCksIChOb25lLCBGYWxzZSkpCisKKyAgICBkZWYgdGVzdF9va19nb29kKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZGlhbG9nLmVudHJ5LnNldCgnZ29vZCcpCisgICAgICAgIEVxdWFsKGRpYWxvZy5vaygpLCBOb25lKQorICAgICAgICBFcXVhbCgoZGlhbG9nLnJlc3VsdCwgZGlhbG9nLmRlc3Ryb3llZCksICgnZ29vZCcsIFRydWUpKQorCisgICAgZGVmIHRlc3RfY2FuY2VsKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgRXF1YWwoc2VsZi5kaWFsb2cuY2FuY2VsKCksIE5vbmUpCisgICAgICAgIEVxdWFsKChkaWFsb2cucmVzdWx0LCBkaWFsb2cuZGVzdHJveWVkKSwgKE5vbmUsIFRydWUpKQorCisKK2NsYXNzIFNlY3Rpb25OYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgU2VjdGlvbk5hbWUgc3ViY2xhc3Mgb2YgUXVlcnkuIgorCisgICAgY2xhc3MgRHVtbXlfU2VjdGlvbk5hbWU6CisgICAgICAgIGVudHJ5X29rID0gcXVlcnkuU2VjdGlvbk5hbWUuZW50cnlfb2sgICMgRnVuY3Rpb24gYmVpbmcgdGVzdGVkLgorICAgICAgICB1c2VkX25hbWVzID0gWyd1c2VkJ10KKyAgICAgICAgZW50cnkgPSBWYXIoKQorCisgICAgZGlhbG9nID0gRHVtbXlfU2VjdGlvbk5hbWUoKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzaG93ZXJyb3IudGl0bGUgPSBOb25lCisKKyAgICBkZWYgdGVzdF9ibGFua19zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCcgJykKKyAgICAgICAgRXF1YWwoZGlhbG9nLmVudHJ5X29rKCksIE5vbmUpCisgICAgICAgIEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ05hbWUgRXJyb3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCdObycsIHNob3dlcnJvci5tZXNzYWdlKQorCisgICAgZGVmIHRlc3RfdXNlZF9zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCd1c2VkJykKKyAgICAgICAgRXF1YWwoc2VsZi5kaWFsb2cuZW50cnlfb2soKSwgTm9uZSkKKyAgICAgICAgRXF1YWwoc2hvd2Vycm9yLnRpdGxlLCAnTmFtZSBFcnJvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzZScsIHNob3dlcnJvci5tZXNzYWdlKQorCisgICAgZGVmIHRlc3RfbG9uZ19zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCdnb29kJyo4KQorICAgICAgICBFcXVhbChzZWxmLmRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndG9vIGxvbmcnLCBzaG93ZXJyb3IubWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2dvb2Rfc2VjdGlvbl9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZGlhbG9nLmVudHJ5LnNldCgnICBnb29kICcpCisgICAgICAgIEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCAnZ29vZCcpCisgICAgICAgIEVxdWFsKHNob3dlcnJvci50aXRsZSwgTm9uZSkKKworCitjbGFzcyBNb2R1bGVOYW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgTW9kdWxlTmFtZSBzdWJjbGFzcyBvZiBRdWVyeS4iCisKKyAgICBjbGFzcyBEdW1teV9Nb2R1bGVOYW1lOgorICAgICAgICBlbnRyeV9vayA9IHF1ZXJ5Lk1vZHVsZU5hbWUuZW50cnlfb2sgICMgRnVudGlvbiBiZWluZyB0ZXN0ZWQuCisgICAgICAgIHRleHQwID0gJycKKyAgICAgICAgZW50cnkgPSBWYXIoKQorCisgICAgZGlhbG9nID0gRHVtbXlfTW9kdWxlTmFtZSgpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNob3dlcnJvci50aXRsZSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X2JsYW5rX21vZHVsZV9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZGlhbG9nLmVudHJ5LnNldCgnICcpCisgICAgICAgIEVxdWFsKGRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdOYW1lIEVycm9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignTm8nLCBzaG93ZXJyb3IubWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2JvZ3VzX21vZHVsZV9uYW1lKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBFcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZGlhbG9nLmVudHJ5LnNldCgnX19uYW1lX3h5ejEyM19zaG91bGRfbm90X2V4aXN0X18nKQorICAgICAgICBFcXVhbChzZWxmLmRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdJbXBvcnQgRXJyb3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgZm91bmQnLCBzaG93ZXJyb3IubWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2Nfc291cmNlX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCdpdGVydG9vbHMnKQorICAgICAgICBFcXVhbChzZWxmLmRpYWxvZy5lbnRyeV9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdJbXBvcnQgRXJyb3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCdzb3VyY2UtYmFzZWQnLCBzaG93ZXJyb3IubWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2dvb2RfbW9kdWxlX25hbWUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cuZW50cnkuc2V0KCdpZGxlbGliJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5lbnRyeV9vaygpLmVuZHN3aXRoKCdfX2luaXRfXy5weScpKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsIE5vbmUpCisKKworIyAzIEhlbHBTb3VyY2UgdGVzdCBjbGFzc2VzIGVhY2ggdGVzdCBvbmUgZnVuY3Rpb24uCisKK29yaWdfcGxhdGZvcm0gPSBxdWVyeS5wbGF0Zm9ybQorCitjbGFzcyBIZWxwc291cmNlQnJvd3NlZmlsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICJUZXN0IGJyb3dzZV9maWxlIG1ldGhvZCBvZiBNb2R1bGVOYW1lIHN1YmNsYXNzIG9mIFF1ZXJ5LiIKKworICAgIGNsYXNzIER1bW15X0hlbHBTb3VyY2U6CisgICAgICAgIGJyb3dzZV9maWxlID0gcXVlcnkuSGVscFNvdXJjZS5icm93c2VfZmlsZQorICAgICAgICBwYXRodmFyID0gVmFyKCkKKworICAgIGRpYWxvZyA9IER1bW15X0hlbHBTb3VyY2UoKQorCisgICAgZGVmIHRlc3RfZmlsZV9yZXBsYWNlc19wYXRoKHNlbGYpOgorICAgICAgICAjIFBhdGggaXMgd2lkZ2V0IGVudHJ5LCBmaWxlIGlzIGZpbGUgZGlhbG9nIHJldHVybi4KKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgZm9yIHBhdGgsIGZ1bmMsIHJlc3VsdCBpbiAoCisgICAgICAgICAgICAgICAgIyBXZSBuZWVkIGFsbCBjb21iaW5hdGlvbiB0byB0ZXN0IGFsbCAobW9zdCkgY29kZSBwYXRocy4KKyAgICAgICAgICAgICAgICAoJycsIGxhbWJkYSBhLGIsYzonJywgJycpLAorICAgICAgICAgICAgICAgICgnJywgbGFtYmRhIGEsYixjOiBfX2ZpbGVfXywgX19maWxlX18pLAorICAgICAgICAgICAgICAgICgnaHRlc3QnLCBsYW1iZGEgYSxiLGM6JycsICdodGVzdCcpLAorICAgICAgICAgICAgICAgICgnaHRlc3QnLCBsYW1iZGEgYSxiLGM6IF9fZmlsZV9fLCBfX2ZpbGVfXykpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoKToKKyAgICAgICAgICAgICAgICBkaWFsb2cucGF0aHZhci5zZXQocGF0aCkKKyAgICAgICAgICAgICAgICBkaWFsb2cuYXNrZmlsZW5hbWUgPSBmdW5jCisgICAgICAgICAgICAgICAgZGlhbG9nLmJyb3dzZV9maWxlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxvZy5wYXRodmFyLmdldCgpLCByZXN1bHQpCisKKworY2xhc3MgSGVscHNvdXJjZVBhdGhva1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICJUZXN0IHBhdGhfb2sgbWV0aG9kIG9mIE1vZHVsZU5hbWUgc3ViY2xhc3Mgb2YgUXVlcnkuIgorCisgICAgY2xhc3MgRHVtbXlfSGVscFNvdXJjZToKKyAgICAgICAgcGF0aF9vayA9IHF1ZXJ5LkhlbHBTb3VyY2UucGF0aF9vaworICAgICAgICBwYXRoID0gVmFyKCkKKworICAgIGRpYWxvZyA9IER1bW15X0hlbHBTb3VyY2UoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgcXVlcnkucGxhdGZvcm0gPSBvcmlnX3BsYXRmb3JtCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNob3dlcnJvci50aXRsZSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X3BhdGhfb2tfYmxhbmsoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBkaWFsb2cucGF0aC5zZXQoJyAnKQorICAgICAgICBFcXVhbChkaWFsb2cucGF0aF9vaygpLCBOb25lKQorICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsICdGaWxlIFBhdGggRXJyb3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCdObyBoZWxwJywgc2hvd2Vycm9yLm1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF9wYXRoX29rX2JhZChzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGRpYWxvZy5wYXRoLnNldChfX2ZpbGVfXyArICdiYWQtYmFkLWJhZCcpCisgICAgICAgIEVxdWFsKGRpYWxvZy5wYXRoX29rKCksIE5vbmUpCisgICAgICAgIEVxdWFsKHNob3dlcnJvci50aXRsZSwgJ0ZpbGUgUGF0aCBFcnJvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vdCBleGlzdCcsIHNob3dlcnJvci5tZXNzYWdlKQorCisgICAgZGVmIHRlc3RfcGF0aF9va193ZWIoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmb3IgdXJsIGluICd3d3cucHkub3JnJywgJ2h0dHA6Ly9weS5vcmcnOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoKToKKyAgICAgICAgICAgICAgICBkaWFsb2cucGF0aC5zZXQodXJsKQorICAgICAgICAgICAgICAgIEVxdWFsKGRpYWxvZy5wYXRoX29rKCksIHVybCkKKyAgICAgICAgICAgICAgICBFcXVhbChzaG93ZXJyb3IudGl0bGUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9wYXRoX29rX2ZpbGUoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmb3IgcGxhdGZvcm0sIHByZWZpeCBpbiAoJ2RhcndpbicsICdmaWxlOi8vJyksICgnb3RoZXInLCAnJyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCgpOgorICAgICAgICAgICAgICAgIHF1ZXJ5LnBsYXRmb3JtID0gcGxhdGZvcm0KKyAgICAgICAgICAgICAgICBkaWFsb2cucGF0aC5zZXQoX19maWxlX18pCisgICAgICAgICAgICAgICAgRXF1YWwoZGlhbG9nLnBhdGhfb2soKSwgcHJlZml4ICsgX19maWxlX18pCisgICAgICAgICAgICAgICAgRXF1YWwoc2hvd2Vycm9yLnRpdGxlLCBOb25lKQorCisKK2NsYXNzIEhlbHBzb3VyY2VFbnRyeW9rVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIlRlc3QgZW50cnlfb2sgbWV0aG9kIG9mIE1vZHVsZU5hbWUgc3ViY2xhc3Mgb2YgUXVlcnkuIgorCisgICAgY2xhc3MgRHVtbXlfSGVscFNvdXJjZToKKyAgICAgICAgZW50cnlfb2sgPSBxdWVyeS5IZWxwU291cmNlLmVudHJ5X29rCisgICAgICAgIGRlZiBpdGVtX29rKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorICAgICAgICBkZWYgcGF0aF9vayhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGgKKworICAgIGRpYWxvZyA9IER1bW15X0hlbHBTb3VyY2UoKQorCisgICAgZGVmIHRlc3RfZW50cnlfb2tfaGVscHNvdXJjZShzZWxmKToKKyAgICAgICAgZGlhbG9nID0gc2VsZi5kaWFsb2cKKyAgICAgICAgZm9yIG5hbWUsIHBhdGgsIHJlc3VsdCBpbiAoKE5vbmUsIE5vbmUsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ2RvYy50eHQnLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdkb2MnLCBOb25lLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdkb2MnLCAnZG9jLnR4dCcsICgnZG9jJywgJ2RvYy50eHQnKSkpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoKToKKyAgICAgICAgICAgICAgICBkaWFsb2cubmFtZSwgZGlhbG9nLnBhdGggPSBuYW1lLCBwYXRoCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpYWxvZy5lbnRyeV9vaygpLCByZXN1bHQpCisKKworIyBHVUkgVEVTVFMKKworY2xhc3MgUXVlcnlHdWlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgIHJlcXVpcmVzKCdndWknKQorICAgICAgICBjbHMucm9vdCA9IHJvb3QgPSBUaygpCisgICAgICAgIGNscy5kaWFsb2cgPSBxdWVyeS5RdWVyeShyb290LCAnVEVTVCcsICd0ZXN0JywgX3V0ZXN0PVRydWUpCisgICAgICAgIGNscy5kaWFsb2cuZGVzdHJveSA9IG1vY2suTW9jaygpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICBkZWwgY2xzLmRpYWxvZworICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIGNscy5yb290CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGlhbG9nLmVudHJ5LmRlbGV0ZSgwLCAnZW5kJykKKyAgICAgICAgc2VsZi5kaWFsb2cucmVzdWx0ID0gTm9uZQorICAgICAgICBzZWxmLmRpYWxvZy5kZXN0cm95LnJlc2V0X21vY2soKQorCisgICAgZGVmIHRlc3RfY2xpY2tfb2soc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIGRpYWxvZy5lbnRyeS5pbnNlcnQoMCwgJ2FiYycpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsb2cucmVzdWx0LCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5kZXN0cm95LmNhbGxlZCkKKworICAgIGRlZiB0ZXN0X2NsaWNrX2JsYW5rKHNlbGYpOgorICAgICAgICBkaWFsb2cgPSBzZWxmLmRpYWxvZworICAgICAgICBkaWFsb2cuYnV0dG9uX29rLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnJlc3VsdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkaWFsb2cuZGVzdHJveS5jYWxsZWQpCisKKyAgICBkZWYgdGVzdF9jbGlja19jYW5jZWwoc2VsZik6CisgICAgICAgIGRpYWxvZyA9IHNlbGYuZGlhbG9nCisgICAgICAgIGRpYWxvZy5lbnRyeS5pbnNlcnQoMCwgJ2FiYycpCisgICAgICAgIGRpYWxvZy5idXR0b25fY2FuY2VsLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbG9nLnJlc3VsdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5kZXN0cm95LmNhbGxlZCkKKworCitjbGFzcyBTZWN0aW9ubmFtZUd1aVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisKKyAgICBkZWYgdGVzdF9jbGlja19zZWN0aW9uX25hbWUoc2VsZik6CisgICAgICAgIHJvb3QgPSBUaygpCisgICAgICAgIGRpYWxvZyA9ICBxdWVyeS5TZWN0aW9uTmFtZShyb290LCAnVCcsICd0JywgeydhYmMnfSwgX3V0ZXN0PVRydWUpCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBFcXVhbChkaWFsb2cudXNlZF9uYW1lcywgeydhYmMnfSkKKyAgICAgICAgZGlhbG9nLmVudHJ5Lmluc2VydCgwLCAnb2theScpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgRXF1YWwoZGlhbG9nLnJlc3VsdCwgJ29rYXknKQorICAgICAgICBkZWwgZGlhbG9nCisgICAgICAgIHJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCByb290CisKKworY2xhc3MgTW9kdWxlbmFtZUd1aVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgcmVxdWlyZXMoJ2d1aScpCisKKyAgICBkZWYgdGVzdF9jbGlja19tb2R1bGVfbmFtZShzZWxmKToKKyAgICAgICAgcm9vdCA9IFRrKCkKKyAgICAgICAgZGlhbG9nID0gIHF1ZXJ5Lk1vZHVsZU5hbWUocm9vdCwgJ1QnLCAndCcsICdpZGxlbGliJywgX3V0ZXN0PVRydWUpCisgICAgICAgIEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBFcXVhbChkaWFsb2cudGV4dDAsICdpZGxlbGliJykKKyAgICAgICAgRXF1YWwoZGlhbG9nLmVudHJ5LmdldCgpLCAnaWRsZWxpYicpCisgICAgICAgIGRpYWxvZy5idXR0b25fb2suaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxvZy5yZXN1bHQuZW5kc3dpdGgoJ19faW5pdF9fLnB5JykpCisgICAgICAgIGRlbCBkaWFsb2cKKyAgICAgICAgcm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIHJvb3QKKworCitjbGFzcyBIZWxwc291cmNlR3VpVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICByZXF1aXJlcygnZ3VpJykKKworICAgIGRlZiB0ZXN0X2NsaWNrX2hlbHBfc291cmNlKHNlbGYpOgorICAgICAgICByb290ID0gVGsoKQorICAgICAgICBkaWFsb2cgPSAgcXVlcnkuSGVscFNvdXJjZShyb290LCAnVCcsIG1lbnVpdGVtPSdfX3Rlc3RfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVwYXRoPV9fZmlsZV9fLCBfdXRlc3Q9VHJ1ZSkKKyAgICAgICAgRXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIEVxdWFsKGRpYWxvZy5lbnRyeS5nZXQoKSwgJ19fdGVzdF9fJykKKyAgICAgICAgRXF1YWwoZGlhbG9nLnBhdGguZ2V0KCksIF9fZmlsZV9fKQorICAgICAgICBkaWFsb2cuYnV0dG9uX29rLmludm9rZSgpCisgICAgICAgIEVxdWFsKGRpYWxvZy5yZXN1bHQsICgnX190ZXN0X18nLCBfX2ZpbGVfXykpCisgICAgICAgIGRlbCBkaWFsb2cKKyAgICAgICAgcm9vdC5kZXN0cm95KCkKKyAgICAgICAgZGVsIHJvb3QKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93aWRnZXRyZWRpci5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlZGlyZWN0b3IucHkKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2lkZ2V0cmVkaXIucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlZGlyZWN0b3IucHkKaW5kZXggYzY4ZGZjYy4uYzhkZDExOCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2lkZ2V0cmVkaXIucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVkaXJlY3Rvci5weQpAQCAtMSw0ICsxLDQgQEAKLScnJ1Rlc3QgaWRsZWxpYi5XaWRnZXRSZWRpcmVjdG9yLgorJycnVGVzdCBpZGxlbGliLnJlZGlyZWN0b3IuCiAKIDEwMCUgY292ZXJhZ2UKICcnJwpAQCAtNiw3ICs2LDcgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX2lkbGUgaW1wb3J0IEZ1bmMKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQsIFRjbEVycm9yCi1mcm9tIGlkbGVsaWIuV2lkZ2V0UmVkaXJlY3RvciBpbXBvcnQgV2lkZ2V0UmVkaXJlY3RvcgorZnJvbSBpZGxlbGliLnJlZGlyZWN0b3IgaW1wb3J0IFdpZGdldFJlZGlyZWN0b3IKIAogCiBjbGFzcyBJbml0Q2xvc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTExOCw2ICsxMTgsNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucm9vdC5jYWxsKHNlbGYudGV4dC5fdywgJ2luc2VydCcsICdib28nKSwgJycpCiAKIAotCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlZGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVwbGFjZS5weQpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlZGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yZXBsYWNlLnB5CmluZGV4IGZmNDQ4MjAuLmE5ZjNlMTUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JlcGxhY2VkaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcmVwbGFjZS5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLlJlcGxhY2VEaWFsb2ciIiIKKyIiIlVuaXR0ZXN0IGZvciBpZGxlbGliLnJlcGxhY2UucHkiIiIKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogcmVxdWlyZXMoJ2d1aScpCiAKQEAgLTYsOCArNiw4IEBACiBmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRleHQKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja190ayBpbXBvcnQgTWJveAotaW1wb3J0IGlkbGVsaWIuU2VhcmNoRW5naW5lIGFzIHNlCi1pbXBvcnQgaWRsZWxpYi5SZXBsYWNlRGlhbG9nIGFzIHJkCitpbXBvcnQgaWRsZWxpYi5zZWFyY2hlbmdpbmUgYXMgc2UKK2ltcG9ydCBpZGxlbGliLnJlcGxhY2UgYXMgcmQKIAogb3JpZ19tYm94ID0gc2UudGtNZXNzYWdlQm94CiBzaG93ZXJyb3IgPSBNYm94LnNob3dlcnJvcgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcnN0cmlwLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfcnN0cmlwLnB5CmluZGV4IDFjOTBiOTMuLjEzMGU2YmUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3JzdHJpcC5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9yc3RyaXAucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBpZGxlbGliLlJzdHJpcEV4dGVuc2lvbiBhcyBycworaW1wb3J0IGlkbGVsaWIucnN0cmlwIGFzIHJzCiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfaWRsZSBpbXBvcnQgRWRpdG9yCiAKIGNsYXNzIHJzdHJpcFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMjEsNyArMjEsNyBAQAogICAgIGRlZiB0ZXN0X3JzdHJpcF9tdWx0aXBsZShzZWxmKToKICAgICAgICAgZWRpdG9yID0gRWRpdG9yKCkKICAgICAgICAgIyAgVW5jb21tZW50IGZvbGxvd2luZyB0byB2ZXJpZnkgdGhhdCB0ZXN0IHBhc3NlcyB3aXRoIHJlYWwgd2lkZ2V0cy4KLSMjICAgICAgICBmcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3cgYXMgRWRpdG9yCisjIyAgICAgICAgZnJvbSBpZGxlbGliLmVkaXRvciBpbXBvcnQgRWRpdG9yV2luZG93IGFzIEVkaXRvcgogIyMgICAgICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVGsKICMjICAgICAgICBlZGl0b3IgPSBFZGl0b3Iocm9vdD1UaygpKQogICAgICAgICB0ZXh0ID0gZWRpdG9yLnRleHQKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3Njcm9sbGVkbGlzdC5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3Njcm9sbGVkbGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmFhYmZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2Nyb2xsZWRsaXN0LnB5CkBAIC0wLDAgKzEsMjkgQEAKKycnJyBUZXN0IGlkbGVsaWIuc2Nyb2xsZWRsaXN0LgorCitDb3ZlcmFnZTogMzklCisnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc2Nyb2xsZWRsaXN0Citmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK3JlcXVpcmVzKCdndWknKQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRraW50ZXIgaW1wb3J0IFRrCisKKworY2xhc3MgU2Nyb2xsZWRMaXN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgIGNscy5yb290LmRlc3Ryb3koKQorICAgICAgICBkZWwgY2xzLnJvb3QKKworCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgc2Nyb2xsZWRsaXN0LlNjcm9sbGVkTGlzdChzZWxmLnJvb3QpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoLnB5CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoLnB5CmluZGV4IDE5MGM4NjYuLjA3MzVkODQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGRpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2gucHkKQEAgLTEsNCArMSw0IEBACi0iIiJUZXN0IFNlYXJjaERpYWxvZyBjbGFzcyBpbiBTZWFyY2hEaWFsb2d1ZS5weSIiIgorIiIiVGVzdCBTZWFyY2hEaWFsb2cgY2xhc3MgaW4gaWRsZWxpYi5zZWFyY2gucHkiIiIKIAogIyBEb2VzIG5vdCBjdXJyZW50bHkgdGVzdCB0aGUgZXZlbnQgaGFuZGxlciB3cmFwcGVycy4KICMgQSB1c2FnZSB0ZXN0IHNob3VsZCBzaW11bGF0ZSBjbGlja3MgYW5kIGNoZWNrIGhpbGlnaHRpbmcuCkBAIC0xMSw4ICsxMSw4IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0a2ludGVyIGFzIHRrCiBmcm9tIHRraW50ZXIgaW1wb3J0IEJvb2xlYW5WYXIKLWltcG9ydCBpZGxlbGliLlNlYXJjaEVuZ2luZSBhcyBzZQotaW1wb3J0IGlkbGVsaWIuU2VhcmNoRGlhbG9nIGFzIHNkCitpbXBvcnQgaWRsZWxpYi5zZWFyY2hlbmdpbmUgYXMgc2UKK2ltcG9ydCBpZGxlbGliLnNlYXJjaCBhcyBzZAogCiAKIGNsYXNzIFNlYXJjaERpYWxvZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nYmFzZS5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGJhc2UucHkKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZGlhbG9nYmFzZS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoYmFzZS5weQppbmRleCA4MDM2YjkxLi5kNzY5ZmEyIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hkaWFsb2diYXNlLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGJhc2UucHkKQEAgLTEsMTQgKzEsMTMgQEAKLScnJ1VuaXR0ZXN0cyBmb3IgaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5CisnJyd0ZXN0cyBpZGxlbGliLnNlYXJjaGJhc2UuCiAKIENvdmVyYWdlOiA5OSUuIFRoZSBvbmx5IHRoaW5nIG5vdCBjb3ZlcmVkIGlzIGluY29uc2VxdWVudGlhbCAtLQogdGVzdGluZyBza2lwcGluZyBvZiBzdWl0ZSB3aGVuIHNlbGYubmVlZHdyYXBidXR0b24gaXMgZmFsc2UuCi0KICcnJwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIGZyb20gdGtpbnRlciBpbXBvcnQgVGssIFRvcGxldmVsLCBGcmFtZSAjIywgQm9vbGVhblZhciwgU3RyaW5nVmFyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaEVuZ2luZSBhcyBzZQotZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlIGFzIHNkYgorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUgYXMgc2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc2VhcmNoYmFzZSBhcyBzZGIKIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QubW9ja19pZGxlIGltcG9ydCBGdW5jCiAjIyBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFZhcgogCkBAIC03NCw3ICs3Myw3IEBACiAgICAgZGVmIHRlc3RfbWFrZV9lbnRyeShzZWxmKToKICAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIHNlbGYuZGlhbG9nLnJvdyA9IDAKLSAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gVG9wbGV2ZWwoc2VsZi5yb290KQorICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBzZWxmLnJvb3QKICAgICAgICAgZW50cnksIGxhYmVsID0gc2VsZi5kaWFsb2cubWFrZV9lbnRyeSgiVGVzdDoiLCAnaGVsbG8nKQogICAgICAgICBlcXVhbChsYWJlbFsndGV4dCddLCAnVGVzdDonKQogCkBAIC04Nyw2ICs4Niw3IEBACiAgICAgICAgIGVxdWFsKHNlbGYuZGlhbG9nLnJvdywgMSkKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV9lbnRyaWVzKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBzZWxmLnJvb3QKICAgICAgICAgc2VsZi5kaWFsb2cucm93ID0gMAogICAgICAgICBzZWxmLmVuZ2luZS5zZXRwYXQoJ2hlbGxvJykKICAgICAgICAgc2VsZi5kaWFsb2cuY3JlYXRlX2VudHJpZXMoKQpAQCAtOTQsNyArOTQsNyBAQAogCiAgICAgZGVmIHRlc3RfbWFrZV9mcmFtZShzZWxmKToKICAgICAgICAgc2VsZi5kaWFsb2cucm93ID0gMAotICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBUb3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IHNlbGYucm9vdAogICAgICAgICBmcmFtZSwgbGFiZWwgPSBzZWxmLmRpYWxvZy5tYWtlX2ZyYW1lKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYWJlbCwgJycpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmcmFtZSwgRnJhbWUpCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZyYW1lLCBGcmFtZSkKIAogICAgIGRlZiBidG5fdGVzdF9zZXR1cChzZWxmLCBtZXRoKToKLSAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gVG9wbGV2ZWwoc2VsZi5yb290KQorICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBzZWxmLnJvb3QKICAgICAgICAgc2VsZi5kaWFsb2cucm93ID0gMAogICAgICAgICByZXR1cm4gbWV0aCgpCiAKQEAgLTExOSwxMSArMTE5LDYgQEAKICAgICAgICAgICAgICAgICB2YXIsIGxhYmVsID0gc3BlYwogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnV0dG9uWyd0ZXh0J10sIGxhYmVsKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFyLmdldCgpLCBzdGF0ZSkKLSAgICAgICAgICAgICAgICBpZiBzdGF0ZSA9PSAxOgotICAgICAgICAgICAgICAgICAgICBidXR0b24uZGVzZWxlY3QoKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZWxlY3QoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFyLmdldCgpLCAxIC0gc3RhdGUpCiAKICAgICBkZWYgdGVzdF9jcmVhdGVfb3RoZXJfYnV0dG9ucyhzZWxmKToKICAgICAgICAgZm9yIHN0YXRlIGluIChGYWxzZSwgVHJ1ZSk6CkBAIC0xMzksMTggKzEzNCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAjIGhpdCBvdGhlciBidXR0b24sIHRoZW4gdGhpcyBvbmUKICAgICAgICAgICAgICAgICAgICAgIyBpbmRleGVzIGRlcGVuZCBvbiBidXR0b24gb3JkZXIKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIHN0YXRlKQotICAgICAgICAgICAgICAgICAgICBidXR0b25zW3ZhbF0uc2VsZWN0KCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIDEgLSBzdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uc1sxLXZhbF0uc2VsZWN0KCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXIuZ2V0KCksIHN0YXRlKQogCiAgICAgZGVmIHRlc3RfbWFrZV9idXR0b24oc2VsZik6Ci0gICAgICAgIHNlbGYuZGlhbG9nLnRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWFsb2cudG9wID0gc2VsZi5yb290CiAgICAgICAgIHNlbGYuZGlhbG9nLmJ1dHRvbmZyYW1lID0gRnJhbWUoc2VsZi5kaWFsb2cudG9wKQogICAgICAgICBidG4gPSBzZWxmLmRpYWxvZy5tYWtlX2J1dHRvbignVGVzdCcsIHNlbGYuZGlhbG9nLmNsb3NlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ0blsndGV4dCddLCAnVGVzdCcpCiAKICAgICBkZWYgdGVzdF9jcmVhdGVfY29tbWFuZF9idXR0b25zKHNlbGYpOgorICAgICAgICBzZWxmLmRpYWxvZy50b3AgPSBzZWxmLnJvb3QKICAgICAgICAgc2VsZi5kaWFsb2cuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucygpCiAgICAgICAgICMgTG9vayBmb3IgY2xvc2UgYnV0dG9uIGNvbW1hbmQgaW4gYnV0dG9uZnJhbWUKICAgICAgICAgY2xvc2VidXR0b25jb21tYW5kID0gJycKQEAgLTE2MCw2ICsxNTIsNSBAQAogICAgICAgICBzZWxmLmFzc2VydEluKCdjbG9zZScsIGNsb3NlYnV0dG9uY29tbWFuZCkKIAogCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbih2ZXJib3NpdHk9MiwgZXhpdD0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZW5naW5lLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfc2VhcmNoZW5naW5lLnB5CmluZGV4IGVkYmQ1NTguLjdlNmY4YjcgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3NlYXJjaGVuZ2luZS5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF9zZWFyY2hlbmdpbmUucHkKQEAgLTEsNCArMSw0IEBACi0nJydUZXN0IGZ1bmN0aW9ucyBhbmQgU2VhcmNoRW5naW5lIGNsYXNzIGluIFNlYXJjaEVuZ2luZS5weS4nJycKKycnJ1Rlc3QgZnVuY3Rpb25zIGFuZCBTZWFyY2hFbmdpbmUgY2xhc3MgaW4gaWRsZWxpYi5zZWFyY2hlbmdpbmUucHkuJycnCiAKICMgV2l0aCBtb2NrIHJlcGxhY2VtZW50cywgdGhlIG1vZHVsZSBkb2VzIG5vdCB1c2UgYW55IGd1aSB3aWRnZXRzLgogIyBUaGUgdXNlIG9mIHRrLlRleHQgaXMgYXZvaWRlZCAoZm9yIG5vdywgdW50aWwgbW9jayBUZXh0IGlzIGltcHJvdmVkKQpAQCAtMTAsNyArMTAsNyBAQAogIyBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKIGZyb20gdGtpbnRlciBpbXBvcnQgIEJvb2xlYW5WYXIsIFN0cmluZ1ZhciwgVGNsRXJyb3IgICMgLFRrLCBUZXh0CiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAotZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUgYXMgc2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc2VhcmNoZW5naW5lIGFzIHNlCiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IFZhciwgTWJveAogZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBUZXh0IGFzIG1vY2tUZXh0CiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHQucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0LnB5CmluZGV4IDdlODIzZGYuLmE1YmE3YmIgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3RleHQucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dC5weQpAQCAtMSwxNyArMSwxOSBAQAotIyBUZXN0IG1vY2tfdGsuVGV4dCBjbGFzcyBhZ2FpbnN0IHRraW50ZXIuVGV4dCBjbGFzcyBieSBydW5uaW5nIHNhbWUgdGVzdHMgd2l0aCBib3RoLgorJycnIFRlc3QgbW9ja190ay5UZXh0IGNsYXNzIGFnYWluc3QgdGtpbnRlci5UZXh0IGNsYXNzCisKK1J1biBzYW1lIHRlc3RzIHdpdGggYm90aCBieSBjcmVhdGluZyBhIG1peGluIGNsYXNzLgorJycnCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwotCiBmcm9tIF90a2ludGVyIGltcG9ydCBUY2xFcnJvcgogCiBjbGFzcyBUZXh0VGVzdChvYmplY3QpOgorICAgICJEZWZpbmUgaXRlbXMgY29tbW9uIHRvIGJvdGggc2V0cyBvZiB0ZXN0cy4iCiAKLSAgICBodyA9ICdoZWxsb1xud29ybGQnICAjIHVzdWFsIGluaXRpYWwgaW5zZXJ0IGFmdGVyIGluaXRpYWxpemF0aW9uCisgICAgaHcgPSAnaGVsbG9cbndvcmxkJyAgIyBTZXZlcmFsIHRlc3RzIGluc2VydCB0aGlzIGFmdGVyIGFmdGVyIGluaXRpYWxpemF0aW9uLgogICAgIGh3biA9IGh3KydcbicgICMgXG4gcHJlc2VudCBhdCBpbml0aWFsaXphdGlvbiwgYmVmb3JlIGluc2VydAogCi0gICAgVGV4dCA9IE5vbmUKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIHNlbGYudGV4dCA9IHNlbGYuVGV4dCgpCisgICAgIyBzZXRVcENsYXNzIGRlZmluZXMgY2xzLlRleHQgYW5kIG1heWJlIGNscy5yb290LgorICAgICMgc2V0VXAgZGVmaW5lcyBzZWxmLnRleHQgZnJvbSBUZXh0IGFuZCBtYXliZSByb290LgogCiAgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRleHQuZ2V0KCcxLjAnKSwgJ1xuJykKQEAgLTE5Niw2ICsxOTgsMTAgQEAKICAgICAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBUZXh0CiAgICAgICAgIGNscy5UZXh0ID0gVGV4dAogCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRleHQgPSBzZWxmLlRleHQoKQorCisKICAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CiAgICAgICAgICMgdGVzdCBlbmRmbGFncyAoLTEsIDApIG5vdCB0ZXN0ZWQgYnkgdGVzdF9pbmRleCAod2hpY2ggdXNlcyArMSkKICAgICAgICAgZGVjb2RlID0gc2VsZi50ZXh0Ll9kZWNvZGUKQEAgLTIyMiw2ICsyMjgsOSBAQAogICAgICAgICBjbHMucm9vdC5kZXN0cm95KCkKICAgICAgICAgZGVsIGNscy5yb290CiAKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGV4dCA9IHNlbGYuVGV4dChzZWxmLnJvb3QpCisKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdGV4dHZpZXcucHkgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0dmlldy5weQppbmRleCAwMmQxNDcyLi4wYzYyNWVlIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0dmlldy5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90ZXh0dmlldy5weQpAQCAtMSwyMSArMSwyMSBAQAotJycnVGVzdCBpZGxlbGliLnRleHRWaWV3LgorJycnVGVzdCBpZGxlbGliLnRleHR2aWV3LgogCiBTaW5jZSBhbGwgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIGNyZWF0ZSAob3IgZGVzdHJveSkgYSBUZXh0Vmlld2VyLCB3aGljaAogaXMgYSB3aWRnZXQgY29udGFpbmluZyBtdWx0aXBsZSB3aWRnZXRzLCBhbGwgdGVzdHMgbXVzdCBiZSBndWkgdGVzdHMuCiBVc2luZyBtb2NrIFRleHQgd291bGQgbm90IGNoYW5nZSB0aGlzLiAgT3RoZXIgbW9ja3MgYXJlIHVzZWQgdG8gcmV0cmlldmUKIGluZm9ybWF0aW9uIGFib3V0IGNhbGxzLgogCi1UaGUgY292ZXJhZ2UgaXMgZXNzZW50aWFsbHkgMTAwJS4KK0NvdmVyYWdlOiA5NCUuCiAnJycKK2Zyb20gaWRsZWxpYiBpbXBvcnQgdGV4dHZpZXcgYXMgdHYKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCByZXF1aXJlcwogcmVxdWlyZXMoJ2d1aScpCiAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IG9zCiBmcm9tIHRraW50ZXIgaW1wb3J0IFRrCi1mcm9tIGlkbGVsaWIgaW1wb3J0IHRleHRWaWV3IGFzIHR2CiBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfaWRsZSBpbXBvcnQgRnVuYwotZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5tb2NrX3RrIGltcG9ydCBNYm94Citmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lm1vY2tfdGsgaW1wb3J0IE1ib3hfZnVuYwogCiBkZWYgc2V0VXBNb2R1bGUoKToKICAgICBnbG9iYWwgcm9vdApAQCAtNjQsMTcgKzY0LDE3IEBACiAgICAgICAgIHZpZXcuZGVzdHJveQogCiAKLWNsYXNzIHRleHR2aWV3VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CitjbGFzcyBWaWV3RnVuY3Rpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBzZXRVcENsYXNzKGNscyk6Ci0gICAgICAgIGNscy5vcmlnX21ib3ggPSB0di50a01lc3NhZ2VCb3gKLSAgICAgICAgdHYudGtNZXNzYWdlQm94ID0gTWJveAorICAgICAgICBjbHMub3JpZ19lcnJvciA9IHR2LnNob3dlcnJvcgorICAgICAgICB0di5zaG93ZXJyb3IgPSBNYm94X2Z1bmMoKQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKLSAgICAgICAgdHYudGtNZXNzYWdlQm94ID0gY2xzLm9yaWdfbWJveAotICAgICAgICBkZWwgY2xzLm9yaWdfbWJveAorICAgICAgICB0di5zaG93ZXJyb3IgPSBjbHMub3JpZ19lcnJvcgorICAgICAgICBkZWwgY2xzLm9yaWdfZXJyb3IKIAogICAgIGRlZiB0ZXN0X3ZpZXdfdGV4dChzZWxmKToKICAgICAgICAgIyBJZiBtb2RhbCBUcnVlLCB0a2ludGVyIHdpbGwgZXJyb3Igd2l0aCAnY2FuJ3QgaW52b2tlICJldmVudCIgY29tbWFuZCcKQEAgLTg5LDcgKzg5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRJbignVGVzdCcsIHZpZXcudGV4dFZpZXcuZ2V0KCcxLjAnLCAnMS5lbmQnKSkKICAgICAgICAgdmlldy5PaygpCiAKLSAgICAgICAgIyBNb2NrIG1lc3NhZ2Vib3ggd2lsbCBiZSB1c2VkIGFuZCB2aWV3X2ZpbGUgd2lsbCBub3QgcmV0dXJuIGFueXRoaW5nCisgICAgICAgICMgTW9jayBzaG93ZXJyb3Igd2lsbCBiZSB1c2VkIGFuZCB2aWV3X2ZpbGUgd2lsbCByZXR1cm4gTm9uZQogICAgICAgICB0ZXN0ZmlsZSA9IG9zLnBhdGguam9pbih0ZXN0X2RpciwgJy4uL25vdHRoZXJlLnB5JykKICAgICAgICAgdmlldyA9IHR2LnZpZXdfZmlsZShyb290LCAnVGl0bGUnLCB0ZXN0ZmlsZSwgbW9kYWw9RmFsc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHZpZXcpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF90cmVlLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdHJlZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJhOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdHJlZS5weQpAQCAtMCwwICsxLDM2IEBACisnJycgVGVzdCBpZGxlbGliLnRyZWUuCisKK0NvdmVyYWdlOiA1NiUKKycnJworZnJvbSBpZGxlbGliIGltcG9ydCB0cmVlCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMKK3JlcXVpcmVzKCdndWknKQoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGtpbnRlciBpbXBvcnQgVGsKKworCitjbGFzcyBUcmVlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICBjbHMucm9vdCA9IFRrKCkKKyAgICAgICAgY2xzLnJvb3Qud2l0aGRyYXcoKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgY2xzLnJvb3QuZGVzdHJveSgpCisgICAgICAgIGRlbCBjbHMucm9vdAorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIyBTdGFydCB3aXRoIGNvZGUgc2xpZ2h0bHkgYWRhcHRlZCBmcm9tIGh0ZXN0LgorICAgICAgICBzYyA9IHRyZWUuU2Nyb2xsZWRDYW52YXMoCisgICAgICAgICAgICBzZWxmLnJvb3QsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKKyAgICAgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIsIHNpZGU9J2xlZnQnKQorICAgICAgICBpdGVtID0gdHJlZS5GaWxlVHJlZUl0ZW0odHJlZS5JQ09ORElSKQorICAgICAgICBub2RlID0gdHJlZS5UcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCisgICAgICAgIG5vZGUuZXhwYW5kKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF91bmRvZGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kby5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF91bmRvZGVsZWdhdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF91bmRvLnB5CmluZGV4IDJiODNjOTkuLjgwZjFiODAgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3VuZG9kZWxlZ2F0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3RfdW5kby5weQpAQCAtMSw0ICsxLDQgQEAKLSIiIlVuaXR0ZXN0IGZvciBVbmRvRGVsZWdhdG9yIGluIGlkbGVsaWIuVW5kb0RlbGVnYXRvci4KKyIiIlVuaXR0ZXN0IGZvciBVbmRvRGVsZWdhdG9yIGluIGlkbGVsaWIudW5kby5weS4KIAogQ292ZXJhZ2UgYWJvdXQgODAlIChyZXRlc3QpLgogIiIiCkBAIC04LDggKzgsOCBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gdGtpbnRlciBpbXBvcnQgVGV4dCwgVGsKLWZyb20gaWRsZWxpYi5VbmRvRGVsZWdhdG9yIGltcG9ydCBVbmRvRGVsZWdhdG9yCi1mcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorZnJvbSBpZGxlbGliLnVuZG8gaW1wb3J0IFVuZG9EZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCiAKIAogY2xhc3MgVW5kb0RlbGVnYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2FybmluZy5weSBiL0xpYi9pZGxlbGliL2lkbGVfdGVzdC90ZXN0X3dhcm5pbmcucHkKaW5kZXggMTg2MjdkZC4uZjMyNjlmMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZV90ZXN0L3Rlc3Rfd2FybmluZy5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxlX3Rlc3QvdGVzdF93YXJuaW5nLnB5CkBAIC0xLDQgKzEsNCBAQAotJycnVGVzdCB3YXJuaW5ncyByZXBsYWNlbWVudCBpbiBQeVNoZWxsLnB5IGFuZCBydW4ucHkuCisnJydUZXN0IHdhcm5pbmdzIHJlcGxhY2VtZW50IGluIHB5c2hlbGwucHkgYW5kIHJ1bi5weS4KIAogVGhpcyBmaWxlIGNvdWxkIGJlIGV4cGFuZGVkIHRvIGluY2x1ZGUgdHJhY2ViYWNrIG92ZXJyaWRlcwogKGluIHNhbWUgdHdvIG1vZHVsZXMpLiBJZiBzbywgY2hhbmdlIG5hbWUuCkBAIC0xNyw5ICsxNyw5IEBACiBydW5uaW5nX2luX2lkbGUgPSAnaWRsZScgaW4gc2hvd3dhcm5pbmcuX19uYW1lX18KIAogZnJvbSBpZGxlbGliIGltcG9ydCBydW4KLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbCBhcyBzaGVsbAorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsIGFzIHNoZWxsCiAKLSMgVGhlIGZvbGxvd2luZyB3YXMgZ2VuZXJhdGVkIGZyb20gUHlTaGVsbC5pZGxlX2Zvcm1hdHdhcm5pbmcKKyMgVGhlIGZvbGxvd2luZyB3YXMgZ2VuZXJhdGVkIGZyb20gcHlzaGVsbC5pZGxlX2Zvcm1hdHdhcm5pbmcKICMgYW5kIGNoZWNrZWQgYXMgbWF0Y2hpbmcgZXhwZWN0YXRpb24uCiBpZGxlbXNnID0gJycnCiBXYXJuaW5nIChmcm9tIHdhcm5pbmdzIG1vZHVsZSk6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5IGIvTGliL2lkbGVsaWIvaWRsZXZlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5ZjY5YS4uMDAwMDAwMAotLS0gYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIiIiCi1UaGUgc2VwYXJhdGUgSWRsZSB2ZXJzaW9uIHdhcyBlbGltaW5hdGVkIHllYXJzIGFnbzsKLWlkbGVsaWIuaWRsZXZlciBpcyBubyBsb25nZXIgdXNlZCBieSBJZGxlCi1hbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuNiBvciBsYXRlci4gIFVzZQotICAgIGZyb20gc3lzIGltcG9ydCB2ZXJzaW9uCi0gICAgSURMRV9WRVJTSU9OID0gdmVyc2lvbls6dmVyc2lvbi5pbmRleCgnICcpXQotIiIiCi0jIEtlcHQgZm9yIG5vdyBvbmx5IGZvciBwb3NzaWJsZSBleGlzdGluZyBleHRlbnNpb24gdXNlCi1pbXBvcnQgd2FybmluZ3MgYXMgdwotdy53YXJuKF9fZG9jX18sIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotZnJvbSBzeXMgaW1wb3J0IHZlcnNpb24KLUlETEVfVkVSU0lPTiA9IHZlcnNpb25bOnZlcnNpb24uaW5kZXgoJyAnKV0KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0lPQmluZGluZy5weSBiL0xpYi9pZGxlbGliL2lvbWVudS5weQpzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL2lvbWVudS5weQppbmRleCA4NGYzOWEyLi4zNDE0YzdiIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkKKysrIGIvTGliL2lkbGVsaWIvaW9tZW51LnB5CkBAIC0xMCw1NyArMTAsNjAgQEAKIGltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CiBmcm9tIHRraW50ZXIuc2ltcGxlZGlhbG9nIGltcG9ydCBhc2tzdHJpbmcKIAotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitpbXBvcnQgaWRsZWxpYgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAotCi0jIFRyeSBzZXR0aW5nIHRoZSBsb2NhbGUsIHNvIHRoYXQgd2UgY2FuIGZpbmQgb3V0Ci0jIHdoYXQgZW5jb2RpbmcgdG8gdXNlCi10cnk6Ci0gICAgaW1wb3J0IGxvY2FsZQotICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCAiIikKLWV4Y2VwdCAoSW1wb3J0RXJyb3IsIGxvY2FsZS5FcnJvcik6Ci0gICAgcGFzcwotCi0jIEVuY29kaW5nIGZvciBmaWxlIG5hbWVzCi1maWxlc3lzdGVtZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgICMjIyBjdXJyZW50bHkgdW51c2VkCi0KLWxvY2FsZV9lbmNvZGluZyA9ICdhc2NpaScKLWlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgotICAgICMgT24gV2luZG93cywgd2UgY291bGQgdXNlICJtYmNzIi4gSG93ZXZlciwgdG8gZ2l2ZSB0aGUgdXNlcgotICAgICMgYSBwb3J0YWJsZSBlbmNvZGluZyBuYW1lLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGNvZGUgcGFnZQotICAgIHRyeToKLSAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKVsxXQotICAgICAgICBjb2RlY3MubG9va3VwKGxvY2FsZV9lbmNvZGluZykKLSAgICBleGNlcHQgTG9va3VwRXJyb3I6Ci0gICAgICAgIHBhc3MKK2lmIGlkbGVsaWIudGVzdGluZzogICMgU2V0IFRydWUgYnkgdGVzdC50ZXN0X2lkbGUgdG8gYXZvaWQgc2V0bG9jYWxlLgorICAgIGVuY29kaW5nID0gJ3V0Zi04JwogZWxzZToKKyAgICAjIFRyeSBzZXR0aW5nIHRoZSBsb2NhbGUsIHNvIHRoYXQgd2UgY2FuIGZpbmQgb3V0CisgICAgIyB3aGF0IGVuY29kaW5nIHRvIHVzZQogICAgIHRyeToKLSAgICAgICAgIyBEaWZmZXJlbnQgdGhpbmdzIGNhbiBmYWlsIGhlcmU6IHRoZSBsb2NhbGUgbW9kdWxlIG1heSBub3QgYmUKLSAgICAgICAgIyBsb2FkZWQsIGl0IG1heSBub3Qgb2ZmZXIgbmxfbGFuZ2luZm8sIG9yIENPREVTRVQsIG9yIHRoZQotICAgICAgICAjIHJlc3VsdGluZyBjb2Rlc2V0IG1heSBiZSB1bmtub3duIHRvIFB5dGhvbi4gV2UgaWdub3JlIGFsbAotICAgICAgICAjIHRoZXNlIHByb2JsZW1zLCBmYWxsaW5nIGJhY2sgdG8gQVNDSUkKLSAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlLm5sX2xhbmdpbmZvKGxvY2FsZS5DT0RFU0VUKQotICAgICAgICBpZiBsb2NhbGVfZW5jb2RpbmcgaXMgTm9uZSBvciBsb2NhbGVfZW5jb2RpbmcgaXMgJyc6Ci0gICAgICAgICAgICAjIHNpdHVhdGlvbiBvY2N1cnMgb24gTWFjIE9TIFgKLSAgICAgICAgICAgIGxvY2FsZV9lbmNvZGluZyA9ICdhc2NpaScKLSAgICAgICAgY29kZWNzLmxvb2t1cChsb2NhbGVfZW5jb2RpbmcpCi0gICAgZXhjZXB0IChOYW1lRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBMb29rdXBFcnJvcik6Ci0gICAgICAgICMgVHJ5IGdldGRlZmF1bHRsb2NhbGU6IGl0IHBhcnNlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCi0gICAgICAgICMgd2hpY2ggbWF5IGdpdmUgYSBjbHVlLiBVbmZvcnR1bmF0ZWx5LCBnZXRkZWZhdWx0bG9jYWxlIGhhcwotICAgICAgICAjIGJ1Z3MgdGhhdCBjYW4gY2F1c2UgVmFsdWVFcnJvci4KKyAgICAgICAgaW1wb3J0IGxvY2FsZQorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgIiIpCisgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgbG9jYWxlLkVycm9yKToKKyAgICAgICAgcGFzcworCisgICAgbG9jYWxlX2RlY29kZSA9ICdhc2NpaScKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgIyBPbiBXaW5kb3dzLCB3ZSBjb3VsZCB1c2UgIm1iY3MiLiBIb3dldmVyLCB0byBnaXZlIHRoZSB1c2VyCisgICAgICAgICMgYSBwb3J0YWJsZSBlbmNvZGluZyBuYW1lLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGNvZGUgcGFnZQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpWzFdCisgICAgICAgICAgICBjb2RlY3MubG9va3VwKGxvY2FsZV9lbmNvZGluZykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgRGlmZmVyZW50IHRoaW5ncyBjYW4gZmFpbCBoZXJlOiB0aGUgbG9jYWxlIG1vZHVsZSBtYXkgbm90IGJlCisgICAgICAgICAgICAjIGxvYWRlZCwgaXQgbWF5IG5vdCBvZmZlciBubF9sYW5naW5mbywgb3IgQ09ERVNFVCwgb3IgdGhlCisgICAgICAgICAgICAjIHJlc3VsdGluZyBjb2Rlc2V0IG1heSBiZSB1bmtub3duIHRvIFB5dGhvbi4gV2UgaWdub3JlIGFsbAorICAgICAgICAgICAgIyB0aGVzZSBwcm9ibGVtcywgZmFsbGluZyBiYWNrIHRvIEFTQ0lJCisgICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSBsb2NhbGUubmxfbGFuZ2luZm8obG9jYWxlLkNPREVTRVQpCiAgICAgICAgICAgICBpZiBsb2NhbGVfZW5jb2RpbmcgaXMgTm9uZSBvciBsb2NhbGVfZW5jb2RpbmcgaXMgJyc6CiAgICAgICAgICAgICAgICAgIyBzaXR1YXRpb24gb2NjdXJzIG9uIE1hYyBPUyBYCiAgICAgICAgICAgICAgICAgbG9jYWxlX2VuY29kaW5nID0gJ2FzY2lpJwogICAgICAgICAgICAgY29kZWNzLmxvb2t1cChsb2NhbGVfZW5jb2RpbmcpCi0gICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgTG9va3VwRXJyb3IpOgotICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgKE5hbWVFcnJvciwgQXR0cmlidXRlRXJyb3IsIExvb2t1cEVycm9yKToKKyAgICAgICAgICAgICMgVHJ5IGdldGRlZmF1bHRsb2NhbGU6IGl0IHBhcnNlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCisgICAgICAgICAgICAjIHdoaWNoIG1heSBnaXZlIGEgY2x1ZS4gVW5mb3J0dW5hdGVseSwgZ2V0ZGVmYXVsdGxvY2FsZSBoYXMKKyAgICAgICAgICAgICMgYnVncyB0aGF0IGNhbiBjYXVzZSBWYWx1ZUVycm9yLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKClbMV0KKyAgICAgICAgICAgICAgICBpZiBsb2NhbGVfZW5jb2RpbmcgaXMgTm9uZSBvciBsb2NhbGVfZW5jb2RpbmcgaXMgJyc6CisgICAgICAgICAgICAgICAgICAgICMgc2l0dWF0aW9uIG9jY3VycyBvbiBNYWMgT1MgWAorICAgICAgICAgICAgICAgICAgICBsb2NhbGVfZW5jb2RpbmcgPSAnYXNjaWknCisgICAgICAgICAgICAgICAgY29kZWNzLmxvb2t1cChsb2NhbGVfZW5jb2RpbmcpCisgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIExvb2t1cEVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCiAKLWxvY2FsZV9lbmNvZGluZyA9IGxvY2FsZV9lbmNvZGluZy5sb3dlcigpCisgICAgbG9jYWxlX2VuY29kaW5nID0gbG9jYWxlX2VuY29kaW5nLmxvd2VyKCkKIAotZW5jb2RpbmcgPSBsb2NhbGVfZW5jb2RpbmcgICMjIyBLQksgMDdTZXAwNyAgVGhpcyBpcyB1c2VkIGFsbCBvdmVyIElETEUsIGNoZWNrIQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyAnZW5jb2RpbmcnIGlzIHVzZWQgYmVsb3cgaW4gZW5jb2RlKCksIGNoZWNrIQorICAgIGVuY29kaW5nID0gbG9jYWxlX2VuY29kaW5nCisgICAgIyBFbmNvZGluZyBpcyB1c2VkIGluIG11bHRpcGxlIGZpbGVzOyBsb2NhbGVfZW5jb2Rpbmcgbm93aGVyZS4KKyAgICAjIFRoZSBvbmx5IHVzZSBvZiAnZW5jb2RpbmcnIGJlbG93IGlzIGluIF9kZWNvZGUgYXMgaW5pdGlhbCB2YWx1ZQorICAgICMgb2YgZGVwcmVjYXRlZCBibG9jayBhc2tpbmcgdXNlciBmb3IgZW5jb2RpbmcuCisgICAgIyBQZXJoYXBzIHVzZSBlbHNld2hlcmUgc2hvdWxkIGJlIHJldmlld2VkLgogCiBjb2RpbmdfcmUgPSByZS5jb21waWxlKHInXlsgXHRcZl0qIy4qP2NvZGluZ1s6PV1bIFx0XSooWy1cdy5dKyknLCByZS5BU0NJSSkKIGJsYW5rX3JlID0gcmUuY29tcGlsZShyJ15bIFx0XGZdKig/OlsjXHJcbl18JCknLCByZS5BU0NJSSkKQEAgLTEwNyw2ICsxMTAsOSBAQAogCiAKIGNsYXNzIElPQmluZGluZzoKKyMgT25lIGluc3RhbmNlIHBlciBlZGl0b3IgV2luZG93IHNvIG1ldGhvZHMga25vdyB3aGljaCB0byBzYXZlLCBjbG9zZS4KKyMgT3BlbiByZXR1cm5zIGZvY3VzIHRvIHNlbGYuZWRpdHdpbiBpZiBhYm9ydGVkLgorIyBFZGl0b3JXaW5kb3cub3Blbl9tb2R1bGUsIG90aGVycywgYmVsb25nIGhlcmUuCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CiAgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KQEAgLTMwMSw3ICszMDcsNyBAQAogICAgICAgICAgICAgICAgICJUaGUgZmlsZSdzIGVuY29kaW5nIGlzIGludmFsaWQgZm9yIFB5dGhvbiAzLnguXG4iCiAgICAgICAgICAgICAgICAgIklETEUgd2lsbCBjb252ZXJ0IGl0IHRvIFVURi04LlxuIgogICAgICAgICAgICAgICAgICJXaGF0IGlzIHRoZSBjdXJyZW50IGVuY29kaW5nIG9mIHRoZSBmaWxlPyIsCi0gICAgICAgICAgICAgICAgaW5pdGlhbHZhbHVlID0gbG9jYWxlX2VuY29kaW5nLAorICAgICAgICAgICAgICAgIGluaXRpYWx2YWx1ZSA9IGVuY29kaW5nLAogICAgICAgICAgICAgICAgIHBhcmVudCA9IHNlbGYuZWRpdHdpbi50ZXh0KQogCiAgICAgICAgICAgICBpZiBlbmM6CkBAIC01MjksOCArNTM1LDggQEAKIAogICAgIHJvb3QgPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgcm9vdC50aXRsZSgiVGVzdCBJT0JpbmRpbmciKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKICAgICBjbGFzcyBNeUVkaXRXaW46CiAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0KToKICAgICAgICAgICAgIHNlbGYudGV4dCA9IHRleHQKQEAgLTU2MSw1ICs1NjcsOCBAQAogICAgIElPQmluZGluZyhlZGl0d2luKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfaW9tZW51JywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX2lvX2JpbmRpbmcpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5IGIvTGliL2lkbGVsaWIvbWFjb3N4LnB5CnNpbWlsYXJpdHkgaW5kZXggNzglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL21hY29zeC5weQppbmRleCBiOTZiYWUxLi5mOWY1NThkIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5CisrKyBiL0xpYi9pZGxlbGliL21hY29zeC5weQpAQCAtMSwzMCArMSwyNCBAQAogIiIiCiBBIG51bWJlciBvZiBmdW5jdGlvbnMgdGhhdCBlbmhhbmNlIElETEUgb24gTWFjIE9TWC4KICIiIgotaW1wb3J0IHN5cworZnJvbSBzeXMgaW1wb3J0IHBsYXRmb3JtICAjIFVzZWQgaW4gX2luaXRfdGtfdHlwZSwgY2hhbmdlZCBieSB0ZXN0LgogaW1wb3J0IHRraW50ZXIKLWZyb20gb3MgaW1wb3J0IHBhdGgKIGltcG9ydCB3YXJuaW5ncwogCi1kZWYgcnVubmluZ0FzT1NYQXBwKCk6Ci0gICAgd2FybmluZ3Mud2FybigicnVubmluZ0FzT1NYQXBwKCkgaXMgZGVwcmVjYXRlZCwgdXNlIGlzQXF1YVRrKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgcmV0dXJuIGlzQXF1YVRrKCkKIAotZGVmIGlzQ2FyYm9uQXF1YVRrKHJvb3QpOgotICAgIHdhcm5pbmdzLndhcm4oImlzQ2FyYm9uQXF1YVRrKHJvb3QpIGlzIGRlcHJlY2F0ZWQsIHVzZSBpc0NhcmJvblRrKCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgcmV0dXJuIGlzQ2FyYm9uVGsoKQorIyMgRGVmaW5lIGZ1bmN0aW9ucyB0aGF0IHF1ZXJ5IHRoZSBNYWMgZ3JhcGhpY3MgdHlwZS4KKyMjIF90a190eXBlIGFuZCBpdHMgaW5pdGlhbGl6ZXIgYXJlIHByaXZhdGUgdG8gdGhpcyBzZWN0aW9uLgogCiBfdGtfdHlwZSA9IE5vbmUKIAotZGVmIF9pbml0aWFsaXplVGtWYXJpYW50VGVzdHMocm9vdCk6CitkZWYgX2luaXRfdGtfdHlwZSgpOgogICAgICIiIgogICAgIEluaXRpYWxpemVzIE9TIFggVGsgdmFyaWFudCB2YWx1ZXMgZm9yCiAgICAgaXNBcXVhVGsoKSwgaXNDYXJib25UaygpLCBpc0NvY29hVGsoKSwgYW5kIGlzWFF1YXJ0eigpLgogICAgICIiIgogICAgIGdsb2JhbCBfdGtfdHlwZQotICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICBpZiBwbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgcm9vdCA9IHRraW50ZXIuVGsoKQogICAgICAgICB3cyA9IHJvb3QudGsuY2FsbCgndGsnLCAnd2luZG93aW5nc3lzdGVtJykKICAgICAgICAgaWYgJ3gxMScgaW4gd3M6CiAgICAgICAgICAgICBfdGtfdHlwZSA9ICJ4cXVhcnR6IgpAQCAtMzQsNiArMjgsNyBAQAogICAgICAgICAgICAgX3RrX3R5cGUgPSAiY29jb2EiCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBfdGtfdHlwZSA9ICJjYXJib24iCisgICAgICAgIHJvb3QuZGVzdHJveSgpCiAgICAgZWxzZToKICAgICAgICAgX3RrX3R5cGUgPSAib3RoZXIiCiAKQEAgLTQxLDcgKzM2LDggQEAKICAgICAiIiIKICAgICBSZXR1cm5zIFRydWUgaWYgSURMRSBpcyB1c2luZyBhIG5hdGl2ZSBPUyBYIFRrIChDb2NvYSBvciBDYXJib24pLgogICAgICIiIgotICAgIGFzc2VydCBfdGtfdHlwZSBpcyBub3QgTm9uZQorICAgIGlmIG5vdCBfdGtfdHlwZToKKyAgICAgICAgX2luaXRfdGtfdHlwZSgpCiAgICAgcmV0dXJuIF90a190eXBlID09ICJjb2NvYSIgb3IgX3RrX3R5cGUgPT0gImNhcmJvbiIKIAogZGVmIGlzQ2FyYm9uVGsoKToKQEAgLTQ5LDIzICs0NSwyNyBAQAogICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgQ2FyYm9uIEFxdWEgVGsgKGluc3RlYWQgb2YgdGhlCiAgICAgbmV3ZXIgQ29jb2EgQXF1YSBUaykuCiAgICAgIiIiCi0gICAgYXNzZXJ0IF90a190eXBlIGlzIG5vdCBOb25lCisgICAgaWYgbm90IF90a190eXBlOgorICAgICAgICBfaW5pdF90a190eXBlKCkKICAgICByZXR1cm4gX3RrX3R5cGUgPT0gImNhcmJvbiIKIAogZGVmIGlzQ29jb2FUaygpOgogICAgICIiIgogICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgQ29jb2EgQXF1YSBUay4KICAgICAiIiIKLSAgICBhc3NlcnQgX3RrX3R5cGUgaXMgbm90IE5vbmUKKyAgICBpZiBub3QgX3RrX3R5cGU6CisgICAgICAgIF9pbml0X3RrX3R5cGUoKQogICAgIHJldHVybiBfdGtfdHlwZSA9PSAiY29jb2EiCiAKIGRlZiBpc1hRdWFydHooKToKICAgICAiIiIKICAgICBSZXR1cm5zIFRydWUgaWYgSURMRSBpcyB1c2luZyBhbiBPUyBYIFgxMSBUay4KICAgICAiIiIKLSAgICBhc3NlcnQgX3RrX3R5cGUgaXMgbm90IE5vbmUKKyAgICBpZiBub3QgX3RrX3R5cGU6CisgICAgICAgIF9pbml0X3RrX3R5cGUoKQogICAgIHJldHVybiBfdGtfdHlwZSA9PSAieHF1YXJ0eiIKIAorCiBkZWYgdGtWZXJzaW9uV2FybmluZyhyb290KToKICAgICAiIiIKICAgICBSZXR1cm5zIGEgc3RyaW5nIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgVGsgdmVyc2lvbiBpbiB1c2UgYXBwZWFycyB0bwpAQCAtODYsNiArODYsOSBAQAogICAgIGVsc2U6CiAgICAgICAgIHJldHVybiBGYWxzZQogCisKKyMjIEZpeCB0aGUgbWVudSBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuCisKIGRlZiBhZGRPcGVuRXZlbnRTdXBwb3J0KHJvb3QsIGZsaXN0KToKICAgICAiIiIKICAgICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCByZXNwb25kIHRvIG9wZW4gQXBwbGVFdmVudHMsIHdoaWNoCkBAIC0xMjQsMjMgKzEyNywyMyBAQAogICAgICMgRHVlIHRvIGEgKG1pcy0pZmVhdHVyZSBvZiBUa0FxdWEgdGhlIHVzZXIgd2lsbCBhbHNvIHNlZSBhbiBlbXB0eSBIZWxwCiAgICAgIyBtZW51LgogICAgIGZyb20gdGtpbnRlciBpbXBvcnQgTWVudQotICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgQmluZGluZ3MKLSAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IFdpbmRvd0xpc3QKKyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IG1haW5tZW51CisgICAgZnJvbSBpZGxlbGliIGltcG9ydCB3aW5kb3dzCiAKLSAgICBjbG9zZUl0ZW0gPSBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXVstMl0KKyAgICBjbG9zZUl0ZW0gPSBtYWlubWVudS5tZW51ZGVmc1swXVsxXVstMl0KIAogICAgICMgUmVtb3ZlIHRoZSBsYXN0IDMgaXRlbXMgb2YgdGhlIGZpbGUgbWVudTogYSBzZXBhcmF0b3IsIGNsb3NlIHdpbmRvdyBhbmQKICAgICAjIHF1aXQuIENsb3NlIHdpbmRvdyB3aWxsIGJlIHJlaW5zZXJ0ZWQganVzdCBhYm92ZSB0aGUgc2F2ZSBpdGVtLCB3aGVyZQogICAgICMgaXQgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgSElHLiBRdWl0IGlzIGluIHRoZSBhcHBsaWNhdGlvbiBtZW51LgotICAgIGRlbCBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXVstMzpdCi0gICAgQmluZGluZ3MubWVudWRlZnNbMF1bMV0uaW5zZXJ0KDYsIGNsb3NlSXRlbSkKKyAgICBkZWwgbWFpbm1lbnUubWVudWRlZnNbMF1bMV1bLTM6XQorICAgIG1haW5tZW51Lm1lbnVkZWZzWzBdWzFdLmluc2VydCg2LCBjbG9zZUl0ZW0pCiAKICAgICAjIFJlbW92ZSB0aGUgJ0Fib3V0JyBlbnRyeSBmcm9tIHRoZSBoZWxwIG1lbnUsIGl0IGlzIGluIHRoZSBhcHBsaWNhdGlvbgogICAgICMgbWVudQotICAgIGRlbCBCaW5kaW5ncy5tZW51ZGVmc1stMV1bMV1bMDoyXQorICAgIGRlbCBtYWlubWVudS5tZW51ZGVmc1stMV1bMV1bMDoyXQogICAgICMgUmVtb3ZlIHRoZSAnQ29uZmlndXJlIElkbGUnIGVudHJ5IGZyb20gdGhlIG9wdGlvbnMgbWVudSwgaXQgaXMgaW4gdGhlCiAgICAgIyBhcHBsaWNhdGlvbiBtZW51IGFzICdQcmVmZXJlbmNlcycKLSAgICBkZWwgQmluZGluZ3MubWVudWRlZnNbLTJdWzFdWzBdCisgICAgZGVsIG1haW5tZW51Lm1lbnVkZWZzWy0yXVsxXVswXQogICAgIG1lbnViYXIgPSBNZW51KHJvb3QpCiAgICAgcm9vdC5jb25maWd1cmUobWVudT1tZW51YmFyKQogICAgIG1lbnVkaWN0ID0ge30KQEAgLTE1NSwzMCArMTU4LDMwIEBACiAKICAgICAgICAgaWYgZW5kID4gMDoKICAgICAgICAgICAgIG1lbnUuZGVsZXRlKDAsIGVuZCkKLSAgICAgICAgV2luZG93TGlzdC5hZGRfd2luZG93c190b19tZW51KG1lbnUpCi0gICAgV2luZG93TGlzdC5yZWdpc3Rlcl9jYWxsYmFjayhwb3N0d2luZG93c21lbnUpCisgICAgICAgIHdpbmRvd3MuYWRkX3dpbmRvd3NfdG9fbWVudShtZW51KQorICAgIHdpbmRvd3MucmVnaXN0ZXJfY2FsbGJhY2socG9zdHdpbmRvd3NtZW51KQogCiAgICAgZGVmIGFib3V0X2RpYWxvZyhldmVudD1Ob25lKToKICAgICAgICAgIkhhbmRsZSBIZWxwICdBYm91dCBJRExFJyBldmVudC4iCi0gICAgICAgICMgU3luY2hyb25pemUgd2l0aCBFZGl0b3JXaW5kb3cuRWRpdG9yV2luZG93LmFib3V0X2RpYWxvZy4KLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBhYm91dERpYWxvZwotICAgICAgICBhYm91dERpYWxvZy5BYm91dERpYWxvZyhyb290LCAnQWJvdXQgSURMRScpCisgICAgICAgICMgU3luY2hyb25pemUgd2l0aCBlZGl0b3IuRWRpdG9yV2luZG93LmFib3V0X2RpYWxvZy4KKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBoZWxwX2Fib3V0CisgICAgICAgIGhlbHBfYWJvdXQuQWJvdXREaWFsb2cocm9vdCwgJ0Fib3V0IElETEUnKQogCiAgICAgZGVmIGNvbmZpZ19kaWFsb2coZXZlbnQ9Tm9uZSk6CiAgICAgICAgICJIYW5kbGUgT3B0aW9ucyAnQ29uZmlndXJlIElETEUnIGV2ZW50LiIKLSAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIEVkaXRvcldpbmRvdy5FZGl0b3JXaW5kb3cuY29uZmlnX2RpYWxvZy4KLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdEaWFsb2cKKyAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIGVkaXRvci5FZGl0b3JXaW5kb3cuY29uZmlnX2RpYWxvZy4KKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBjb25maWdkaWFsb2cKIAogICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSByb290IG9iamVjdCBoYXMgYW4gaW5zdGFuY2VfZGljdCBhdHRyaWJ1dGUsCiAgICAgICAgICMgbWlycm9ycyBjb2RlIGluIEVkaXRvcldpbmRvdyAoYWx0aG91Z2ggdGhhdCBzZXRzIHRoZSBhdHRyaWJ1dGUKICAgICAgICAgIyBvbiBhbiBFZGl0b3JXaW5kb3cgaW5zdGFuY2UgdGhhdCBpcyB0aGVuIHBhc3NlZCBhcyB0aGUgZmlyc3QKICAgICAgICAgIyBhcmd1bWVudCB0byBDb25maWdEaWFsb2cpCiAgICAgICAgIHJvb3QuaW5zdGFuY2VfZGljdCA9IGZsaXN0LmludmVyc2VkaWN0Ci0gICAgICAgIGNvbmZpZ0RpYWxvZy5Db25maWdEaWFsb2cocm9vdCwgJ1NldHRpbmdzJykKKyAgICAgICAgY29uZmlnZGlhbG9nLkNvbmZpZ0RpYWxvZyhyb290LCAnU2V0dGluZ3MnKQogCiAgICAgZGVmIGhlbHBfZGlhbG9nKGV2ZW50PU5vbmUpOgogICAgICAgICAiSGFuZGxlIEhlbHAgJ0lETEUgSGVscCcgZXZlbnQuIgotICAgICAgICAjIFN5bmNocm9uaXplIHdpdGggRWRpdG9yV2luZG93LkVkaXRvcldpbmRvdy5oZWxwX2RpYWxvZy4KKyAgICAgICAgIyBTeW5jaHJvbml6ZSB3aXRoIGVkaXRvci5FZGl0b3JXaW5kb3cuaGVscF9kaWFsb2cuCiAgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgaGVscAogICAgICAgICBoZWxwLnNob3dfaWRsZWhlbHAocm9vdCkKIApAQCAtMTk4LDI5ICsyMDEsMzMgQEAKICAgICAgICAgbWVudWRpY3RbJ2FwcGxpY2F0aW9uJ10gPSBtZW51ID0gTWVudShtZW51YmFyLCBuYW1lPSdhcHBsZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhcm9mZj0wKQogICAgICAgICBtZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSdJRExFJywgbWVudT1tZW51KQotICAgICAgICBCaW5kaW5ncy5tZW51ZGVmcy5pbnNlcnQoMCwKKyAgICAgICAgbWFpbm1lbnUubWVudWRlZnMuaW5zZXJ0KDAsCiAgICAgICAgICAgICAoJ2FwcGxpY2F0aW9uJywgWwogICAgICAgICAgICAgICAgICgnQWJvdXQgSURMRScsICc8PGFib3V0LWlkbGU+PicpLAogICAgICAgICAgICAgICAgICAgICBOb25lLAogICAgICAgICAgICAgICAgIF0pKQotICAgICAgICB0a3ZlcnNpb24gPSByb290LnRrLmV2YWwoJ2luZm8gcGF0Y2hsZXZlbCcpCi0gICAgICAgIGlmIHR1cGxlKG1hcChpbnQsIHRrdmVyc2lvbi5zcGxpdCgnLicpKSkgPCAoOCwgNCwgMTQpOgotICAgICAgICAgICAgIyBmb3IgZWFybGllciBBcXVhVGsgdmVyc2lvbnMsIHN1cHBseSBhIFByZWZlcmVuY2VzIG1lbnUgaXRlbQotICAgICAgICAgICAgQmluZGluZ3MubWVudWRlZnNbMF1bMV0uYXBwZW5kKAotICAgICAgICAgICAgICAgICAgICAoJ19QcmVmZXJlbmNlcy4uLi4nLCAnPDxvcGVuLWNvbmZpZy1kaWFsb2c+PicpLAotICAgICAgICAgICAgICAgICkKICAgICBpZiBpc0NvY29hVGsoKToKICAgICAgICAgIyByZXBsYWNlIGRlZmF1bHQgQWJvdXQgZGlhbG9nIHdpdGggQWJvdXQgSURMRSBvbmUKICAgICAgICAgcm9vdC5jcmVhdGVjb21tYW5kKCd0a0Fib3V0RGlhbG9nJywgYWJvdXRfZGlhbG9nKQogICAgICAgICAjIHJlcGxhY2UgZGVmYXVsdCAiSGVscCIgaXRlbSBpbiBIZWxwIG1lbnUKICAgICAgICAgcm9vdC5jcmVhdGVjb21tYW5kKCc6OnRrOjptYWM6OlNob3dIZWxwJywgaGVscF9kaWFsb2cpCiAgICAgICAgICMgcmVtb3ZlIHJlZHVuZGFudCAiSURMRSBIZWxwIiBmcm9tIG1lbnUKLSAgICAgICAgZGVsIEJpbmRpbmdzLm1lbnVkZWZzWy0xXVsxXVswXQorICAgICAgICBkZWwgbWFpbm1lbnUubWVudWRlZnNbLTFdWzFdWzBdCisKK2RlZiBmaXhiMmNvbnRleHQocm9vdCk6CisgICAgJycnUmVtb3ZlZCBiYWQgQXF1YVRrIEJ1dHRvbi0yIChyaWdodCkgYW5kIFBhc3RlIGJpbmRpbmdzLgorCisgICAgVGhleSBwcmV2ZW50IGNvbnRleHQgbWVudSBhY2Nlc3MgYW5kIHNlZW0gdG8gYmUgZ29uZSBpbiBBcXVhVGs4LjYuCisgICAgU2VlIGlzc3VlICMyNDgwMS4KKyAgICAnJycKKyAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8QjI+JykKKyAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8QjItTW90aW9uPicpCisgICAgcm9vdC51bmJpbmRfY2xhc3MoJ1RleHQnLCAnPDxQYXN0ZVNlbGVjdGlvbj4+JykKIAogZGVmIHNldHVwQXBwKHJvb3QsIGZsaXN0KToKICAgICAiIiIKICAgICBQZXJmb3JtIGluaXRpYWwgT1MgWCBjdXN0b21pemF0aW9ucyBpZiBuZWVkZWQuCi0gICAgQ2FsbGVkIGZyb20gUHlTaGVsbC5tYWluKCkgYWZ0ZXIgaW5pdGlhbCBjYWxscyB0byBUaygpCisgICAgQ2FsbGVkIGZyb20gcHlzaGVsbC5tYWluKCkgYWZ0ZXIgaW5pdGlhbCBjYWxscyB0byBUaygpCiAKICAgICBUaGVyZSBhcmUgY3VycmVudGx5IHRocmVlIG1ham9yIHZlcnNpb25zIG9mIFRrIGluIHVzZSBvbiBPUyBYOgogICAgICAgICAxLiBBcXVhIENvY29hIFRrIChuYXRpdmUgZGVmYXVsdCBzaW5jZSBPUyBYIDEwLjYpCkBAIC0yMzMsOCArMjQwLDEzIEBACiAgICAgaXNBcXVhVGsoKSwgaXNDYXJib25UaygpLCBpc0NvY29hVGsoKSwgaXNYUXVhcnR6KCkgZnVuY3Rpb25zIHdoaWNoCiAgICAgYXJlIGluaXRpYWxpemVkIGhlcmUgYXMgd2VsbC4KICAgICAiIiIKLSAgICBfaW5pdGlhbGl6ZVRrVmFyaWFudFRlc3RzKHJvb3QpCiAgICAgaWYgaXNBcXVhVGsoKToKICAgICAgICAgaGlkZVRrQ29uc29sZShyb290KQogICAgICAgICBvdmVycmlkZVJvb3RNZW51KHJvb3QsIGZsaXN0KQogICAgICAgICBhZGRPcGVuRXZlbnRTdXBwb3J0KHJvb3QsIGZsaXN0KQorICAgICAgICBmaXhiMmNvbnRleHQocm9vdCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1haW4KKyAgICBtYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X21hY29zeCcsIHZlcmJvc2l0eT0yKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQmluZGluZ3MucHkgYi9MaWIvaWRsZWxpYi9tYWlubWVudS5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9CaW5kaW5ncy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvbWFpbm1lbnUucHkKaW5kZXggYWIyNWZmMS4uOTY1YWRhMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvQmluZGluZ3MucHkKKysrIGIvTGliL2lkbGVsaWIvbWFpbm1lbnUucHkKQEAgLTEwLDkgKzEwLDkgQEAKICIiIgogZnJvbSBpbXBvcnRsaWIudXRpbCBpbXBvcnQgZmluZF9zcGVjCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLmNvbmZpZyBpbXBvcnQgaWRsZUNvbmYKIAotIyAgIFdhcm5pbmc6IG1lbnVkZWZzIGlzIGFsdGVyZWQgaW4gbWFjb3N4U3VwcG9ydC5vdmVycmlkZVJvb3RNZW51KCkKKyMgICBXYXJuaW5nOiBtZW51ZGVmcyBpcyBhbHRlcmVkIGluIG1hY29zeC5vdmVycmlkZVJvb3RNZW51KCkKICMgICBhZnRlciBpdCBpcyBkZXRlcm1pbmVkIHRoYXQgYW4gT1MgWCBBcXVhIFRrIGlzIGluIHVzZSwKICMgICB3aGljaCBjYW5ub3QgYmUgZG9uZSB1bnRpbCBhZnRlciBUaygpIGlzIGZpcnN0IGNhbGxlZC4KICMgICBEbyBub3QgYWx0ZXIgdGhlICdmaWxlJywgJ29wdGlvbnMnLCBvciAnaGVscCcgY2FzY2FkZXMgaGVyZQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvTXVsdGlDYWxsLnB5IGIvTGliL2lkbGVsaWIvbXVsdGljYWxsLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL011bHRpQ2FsbC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvbXVsdGljYWxsLnB5CmluZGV4IDg0NjI4NTQuLjhhNjZjZDkgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL011bHRpQ2FsbC5weQorKysgYi9MaWIvaWRsZWxpYi9tdWx0aWNhbGwucHkKQEAgLTQxNCwxMiArNDE0LDEyIEBACiAgICAgcmV0dXJuIE11bHRpQ2FsbAogCiAKLWRlZiBfbXVsdGlfY2FsbChwYXJlbnQpOgotICAgIHJvb3QgPSB0a2ludGVyLlRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IE11bHRpQ2FsbCIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNTApKQotICAgIHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKHRraW50ZXIuVGV4dCkocm9vdCkKK2RlZiBfbXVsdGlfY2FsbChwYXJlbnQpOiAgIyBodGVzdCAjCisgICAgdG9wID0gdGtpbnRlci5Ub3BsZXZlbChwYXJlbnQpCisgICAgdG9wLnRpdGxlKCJUZXN0IE11bHRpQ2FsbCIpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKKyAgICB0ZXh0ID0gTXVsdGlDYWxsQ3JlYXRvcih0a2ludGVyLlRleHQpKHRvcCkKICAgICB0ZXh0LnBhY2soKQogICAgIGRlZiBiaW5kc2VxKHNlcSwgbj1bMF0pOgogICAgICAgICBkZWYgaGFuZGxlcihldmVudCk6CkBAIC00MzksNyArNDM5LDYgQEAKICAgICBiaW5kc2VxKCI8Rm9jdXNPdXQ+IikKICAgICBiaW5kc2VxKCI8RW50ZXI+IikKICAgICBiaW5kc2VxKCI8TGVhdmU+IikKLSAgICByb290Lm1haW5sb29wKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL091dHB1dFdpbmRvdy5weSBiL0xpYi9pZGxlbGliL291dHdpbi5weQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL291dHdpbi5weQppbmRleCBlNjE0ZjliLi5iM2JjNzg2IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvb3V0d2luLnB5CkBAIC0xLDggKzEsOCBAQAogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3cKK2Zyb20gaWRsZWxpYi5lZGl0b3IgaW1wb3J0IEVkaXRvcldpbmRvdwogaW1wb3J0IHJlCiBpbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAotZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaW9tZW51CiAKIGNsYXNzIE91dHB1dFdpbmRvdyhFZGl0b3JXaW5kb3cpOgogCkBAIC0zNiw3ICszNiw3IEBACiAKICAgICBkZWYgd3JpdGUoc2VsZiwgcywgdGFncz0oKSwgbWFyaz0iaW5zZXJ0Iik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2UocywgKGJ5dGVzLCBieXRlcykpOgotICAgICAgICAgICAgcyA9IHMuZGVjb2RlKElPQmluZGluZy5lbmNvZGluZywgInJlcGxhY2UiKQorICAgICAgICAgICAgcyA9IHMuZGVjb2RlKGlvbWVudS5lbmNvZGluZywgInJlcGxhY2UiKQogICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KG1hcmssIHMsIHRhZ3MpCiAgICAgICAgIHNlbGYudGV4dC5zZWUobWFyaykKICAgICAgICAgc2VsZi50ZXh0LnVwZGF0ZSgpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHkgYi9MaWIvaWRsZWxpYi9wYXJhZ3JhcGgucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9wYXJhZ3JhcGgucHkKaW5kZXggN2E5ZDE4NS4uMDMyM2I1MyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5CisrKyBiL0xpYi9pZGxlbGliL3BhcmFncmFwaC5weQpAQCAtMTYsNyArMTYsNyBAQAogIiIiCiAKIGltcG9ydCByZQotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiBjbGFzcyBGb3JtYXRQYXJhZ3JhcGg6CiAKQEAgLTE5MSw1ICsxOTEsNSBAQAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfZm9ybWF0cGFyYWdyYXBoJywKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3BhcmFncmFwaCcsCiAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkgYi9MaWIvaWRsZWxpYi9wYXJlbm1hdGNoLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3BhcmVubWF0Y2gucHkKaW5kZXggMTliYWQ4Yy4uZTk4ZmFjMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weQorKysgYi9MaWIvaWRsZWxpYi9wYXJlbm1hdGNoLnB5CkBAIC01LDggKzUsOCBAQAogcGFyZW50aGVzZXMsIHNxdWFyZSBicmFja2V0cywgYW5kIGN1cmx5IGJyYWNlcy4KICIiIgogCi1mcm9tIGlkbGVsaWIuSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCi1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5oeXBlcnBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKK2Zyb20gaWRsZWxpYi5jb25maWcgaW1wb3J0IGlkbGVDb25mCiAKIF9vcGVuZXJzID0geycpJzonKCcsJ10nOidbJywnfSc6J3snfQogQ0hFQ0tfREVMQVkgPSAxMDAgIyBtaWxpc2Vjb25kcwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUGF0aEJyb3dzZXIucHkgYi9MaWIvaWRsZWxpYi9wYXRoYnJvd3Nlci5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9QYXRoQnJvd3Nlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcGF0aGJyb3dzZXIucHkKaW5kZXggOWFiNzYzMi4uOTY2YWY0YiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUGF0aEJyb3dzZXIucHkKKysrIGIvTGliL2lkbGVsaWIvcGF0aGJyb3dzZXIucHkKQEAgLTIsOSArMiw5IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQogCi1mcm9tIGlkbGVsaWIuVHJlZVdpZGdldCBpbXBvcnQgVHJlZUl0ZW0KLWZyb20gaWRsZWxpYi5DbGFzc0Jyb3dzZXIgaW1wb3J0IENsYXNzQnJvd3NlciwgTW9kdWxlQnJvd3NlclRyZWVJdGVtCi1mcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgUHlTaGVsbEZpbGVMaXN0Citmcm9tIGlkbGVsaWIudHJlZSBpbXBvcnQgVHJlZUl0ZW0KK2Zyb20gaWRsZWxpYi5icm93c2VyIGltcG9ydCBDbGFzc0Jyb3dzZXIsIE1vZHVsZUJyb3dzZXJUcmVlSXRlbQorZnJvbSBpZGxlbGliLnB5c2hlbGwgaW1wb3J0IFB5U2hlbGxGaWxlTGlzdAogCiAKIGNsYXNzIFBhdGhCcm93c2VyKENsYXNzQnJvd3Nlcik6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QZXJjb2xhdG9yLnB5IGIvTGliL2lkbGVsaWIvcGVyY29sYXRvci5weQpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9QZXJjb2xhdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9wZXJjb2xhdG9yLnB5CmluZGV4IGI4YmUyYWEuLjQ0NzRmOWEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1BlcmNvbGF0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvcGVyY29sYXRvci5weQpAQCAtMSw1ICsxLDUgQEAKLWZyb20gaWRsZWxpYi5XaWRnZXRSZWRpcmVjdG9yIGltcG9ydCBXaWRnZXRSZWRpcmVjdG9yCi1mcm9tIGlkbGVsaWIuRGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5yZWRpcmVjdG9yIGltcG9ydCBXaWRnZXRSZWRpcmVjdG9yCitmcm9tIGlkbGVsaWIuZGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKIAogCiBjbGFzcyBQZXJjb2xhdG9yOgpAQCAtNTcsNyArNTcsNiBAQAogCiBkZWYgX3BlcmNvbGF0b3IocGFyZW50KTogICMgaHRlc3QgIwogICAgIGltcG9ydCB0a2ludGVyIGFzIHRrCi0gICAgaW1wb3J0IHJlCiAKICAgICBjbGFzcyBUcmFjZXIoRGVsZWdhdG9yKToKICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgpAQCAtNzQsOCArNzMsOCBAQAogCiAgICAgYm94ID0gdGsuVG9wbGV2ZWwocGFyZW50KQogICAgIGJveC50aXRsZSgiVGVzdCBQZXJjb2xhdG9yIikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgYm94Lmdlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkgKyAxNTApKQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICBib3guZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCiAgICAgdGV4dCA9IHRrLlRleHQoYm94KQogICAgIHAgPSBQZXJjb2xhdG9yKHRleHQpCiAgICAgcGluID0gcC5pbnNlcnRmaWx0ZXIKQEAgLTg5LDEwICs4OCwxMCBAQAogICAgICAgICAocGluIGlmIHZhcjIuZ2V0KCkgZWxzZSBwb3V0KSh0MikKIAogICAgIHRleHQucGFjaygpCi0gICAgdmFyMSA9IHRrLkludFZhcigpCisgICAgdmFyMSA9IHRrLkludFZhcihwYXJlbnQpCiAgICAgY2IxID0gdGsuQ2hlY2tidXR0b24oYm94LCB0ZXh0PSJUcmFjZXIxIiwgY29tbWFuZD10b2dnbGUxLCB2YXJpYWJsZT12YXIxKQogICAgIGNiMS5wYWNrKCkKLSAgICB2YXIyID0gdGsuSW50VmFyKCkKKyAgICB2YXIyID0gdGsuSW50VmFyKHBhcmVudCkKICAgICBjYjIgPSB0ay5DaGVja2J1dHRvbihib3gsIHRleHQ9IlRyYWNlcjIiLCBjb21tYW5kPXRvZ2dsZTIsIHZhcmlhYmxlPXZhcjIpCiAgICAgY2IyLnBhY2soKQogCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9QeVBhcnNlLnB5IGIvTGliL2lkbGVsaWIvcHlwYXJzZS5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUHlQYXJzZS5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcHlwYXJzZS5weQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUHlTaGVsbC5weSBiL0xpYi9pZGxlbGliL3B5c2hlbGwucHkKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvUHlTaGVsbC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvcHlzaGVsbC5weQppbmRleCA1ZGVjNjhlLi4yODU4NGFjIDEwMDc1NQotLS0gYS9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5CisrKyBiL0xpYi9pZGxlbGliL3B5c2hlbGwucHkKQEAgLTEsNSArMSwyMCBAQAogIyEgL3Vzci9iaW4vZW52IHB5dGhvbjMKIAordHJ5OgorICAgIGZyb20gdGtpbnRlciBpbXBvcnQgKgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHByaW50KCIqKiBJRExFIGNhbid0IGltcG9ydCBUa2ludGVyLlxuIgorICAgICAgICAgICJZb3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrLiAqKiIsIGZpbGU9c3lzLl9fc3RkZXJyX18pCisgICAgc3lzLmV4aXQoMSkKK2ltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94CitpZiBUa1ZlcnNpb24gPCA4LjU6CisgICAgcm9vdCA9IFRrKCkgICMgb3RoZXJ3aXNlIGNyZWF0ZSByb290IGluIG1haW4KKyAgICByb290LndpdGhkcmF3KCkKKyAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJZGxlIENhbm5vdCBTdGFydCIsCisgICAgICAgICAgICAiSWRsZSByZXF1aXJlcyB0Y2wvdGsgOC41Kywgbm90ICRzLiIgJSBUa1ZlcnNpb24sCisgICAgICAgICAgICBwYXJlbnQ9cm9vdCkKKyAgICBzeXMuZXhpdCgxKQorCiBpbXBvcnQgZ2V0b3B0CiBpbXBvcnQgb3MKIGltcG9ydCBvcy5wYXRoCkBAIC0xMCwzMCArMjUsMjIgQEAKIGltcG9ydCB0aHJlYWRpbmcKIGltcG9ydCB0aW1lCiBpbXBvcnQgdG9rZW5pemUKLWltcG9ydCBpbwogCiBpbXBvcnQgbGluZWNhY2hlCiBmcm9tIGNvZGUgaW1wb3J0IEludGVyYWN0aXZlSW50ZXJwcmV0ZXIKIGZyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uLCBzeXN0ZW0KIAotdHJ5OgotICAgIGZyb20gdGtpbnRlciBpbXBvcnQgKgotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHByaW50KCIqKiBJRExFIGNhbid0IGltcG9ydCBUa2ludGVyLlxuIgotICAgICAgICAgICJZb3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrLiAqKiIsIGZpbGU9c3lzLl9fc3RkZXJyX18pCi0gICAgc3lzLmV4aXQoMSkKLWltcG9ydCB0a2ludGVyLm1lc3NhZ2Vib3ggYXMgdGtNZXNzYWdlQm94Ci0KLWZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdywgZml4d29yZGJyZWFrcwotZnJvbSBpZGxlbGliLkZpbGVMaXN0IGltcG9ydCBGaWxlTGlzdAotZnJvbSBpZGxlbGliLkNvbG9yRGVsZWdhdG9yIGltcG9ydCBDb2xvckRlbGVnYXRvcgotZnJvbSBpZGxlbGliLlVuZG9EZWxlZ2F0b3IgaW1wb3J0IFVuZG9EZWxlZ2F0b3IKLWZyb20gaWRsZWxpYi5PdXRwdXRXaW5kb3cgaW1wb3J0IE91dHB1dFdpbmRvdwotZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuZWRpdG9yIGltcG9ydCBFZGl0b3JXaW5kb3csIGZpeHdvcmRicmVha3MKK2Zyb20gaWRsZWxpYi5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QKK2Zyb20gaWRsZWxpYi5jb2xvcml6ZXIgaW1wb3J0IENvbG9yRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIudW5kbyBpbXBvcnQgVW5kb0RlbGVnYXRvcgorZnJvbSBpZGxlbGliLm91dHdpbiBpbXBvcnQgT3V0cHV0V2luZG93Citmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliLnJ1biBpbXBvcnQgaWRsZV9mb3JtYXR3YXJuaW5nLCBQc2V1ZG9JbnB1dEZpbGUsIFBzZXVkb091dHB1dEZpbGUKIGZyb20gaWRsZWxpYiBpbXBvcnQgcnBjCi1mcm9tIGlkbGVsaWIgaW1wb3J0IERlYnVnZ2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZURlYnVnZ2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdnZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdnZXJfcgorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKIAogSE9TVCA9ICcxMjcuMC4wLjEnICMgcHl0aG9uIGV4ZWN1dGlvbiBzZXJ2ZXIgb24gbG9jYWxob3N0IGxvb3BiYWNrCiBQT1JUID0gMCAgIyBzb21lZGF5IHBhc3MgaW4gaG9zdCwgcG9ydCBmb3IgcmVtb3RlIGRlYnVnIGNhcGFiaWxpdHkKQEAgLTQ1LDE5ICs1Miw2IEBACiB3YXJuaW5nX3N0cmVhbSA9IHN5cy5fX3N0ZGVycl9fICAjIE5vbmUsIGF0IGxlYXN0IG9uIFdpbmRvd3MsIGlmIG5vIGNvbnNvbGUuCiBpbXBvcnQgd2FybmluZ3MKIAotZGVmIGlkbGVfZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZT1Ob25lKToKLSAgICAiIiJGb3JtYXQgd2FybmluZ3MgdGhlIElETEUgd2F5LiIiIgotCi0gICAgcyA9ICJcbldhcm5pbmcgKGZyb20gd2FybmluZ3MgbW9kdWxlKTpcbiIKLSAgICBzICs9ICcgIEZpbGUgXCIlc1wiLCBsaW5lICVzXG4nICUgKGZpbGVuYW1lLCBsaW5lbm8pCi0gICAgaWYgbGluZSBpcyBOb25lOgotICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKLSAgICBsaW5lID0gbGluZS5zdHJpcCgpCi0gICAgaWYgbGluZToKLSAgICAgICAgcyArPSAiICAgICVzXG4iICUgbGluZQotICAgIHMgKz0gIiVzOiAlc1xuIiAlIChjYXRlZ29yeS5fX25hbWVfXywgbWVzc2FnZSkKLSAgICByZXR1cm4gcwotCiBkZWYgaWRsZV9zaG93d2FybmluZygKICAgICAgICAgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKICAgICAiIiJTaG93IElkbGUtZm9ybWF0IHdhcm5pbmcgKGFmdGVyIHJlcGxhY2luZyB3YXJuaW5ncy5zaG93d2FybmluZykuCkBAIC00MTAsNyArNDA0LDcgQEAKICAgICAgICAgIyBydW4gZnJvbSB0aGUgSURMRSBzb3VyY2UgZGlyZWN0b3J5LgogICAgICAgICBkZWxfZXhpdGYgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnR2VuZXJhbCcsICdkZWxldGUtZXhpdGZ1bmMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwgdHlwZT0nYm9vbCcpCi0gICAgICAgIGlmIF9fbmFtZV9fID09ICdpZGxlbGliLlB5U2hlbGwnOgorICAgICAgICBpZiBfX25hbWVfXyA9PSAnaWRsZWxpYi5weXNoZWxsJzoKICAgICAgICAgICAgIGNvbW1hbmQgPSAiX19pbXBvcnRfXygnaWRsZWxpYi5ydW4nKS5ydW4ubWFpbiglcikiICUgKGRlbF9leGl0ZiwpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBjb21tYW5kID0gIl9faW1wb3J0X18oJ3J1bicpLm1haW4oJXIpIiAlIChkZWxfZXhpdGYsKQpAQCAtNDY4LDcgKzQ2Miw3IEBACiAgICAgICAgIGlmIGRlYnVnOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICMgT25seSBjbG9zZSBzdWJwcm9jZXNzIGRlYnVnZ2VyLCBkb24ndCB1bnJlZ2lzdGVyIGd1aV9hZGFwIQotICAgICAgICAgICAgICAgIFJlbW90ZURlYnVnZ2VyLmNsb3NlX3N1YnByb2Nlc3NfZGVidWdnZXIoc2VsZi5ycGNjbHQpCisgICAgICAgICAgICAgICAgZGVidWdnZXJfci5jbG9zZV9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgIyBLaWxsIHN1YnByb2Nlc3MsIHNwYXduIGEgbmV3IG9uZSwgYWNjZXB0IGNvbm5lY3Rpb24uCkBAIC00OTcsNyArNDkxLDcgQEAKICAgICAgICAgIyByZXN0YXJ0IHN1YnByb2Nlc3MgZGVidWdnZXIKICAgICAgICAgaWYgZGVidWc6CiAgICAgICAgICAgICAjIFJlc3RhcnRlZCBkZWJ1Z2dlciBjb25uZWN0cyB0byBjdXJyZW50IGluc3RhbmNlIG9mIGRlYnVnIEdVSQotICAgICAgICAgICAgUmVtb3RlRGVidWdnZXIucmVzdGFydF9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQorICAgICAgICAgICAgZGVidWdnZXJfci5yZXN0YXJ0X3N1YnByb2Nlc3NfZGVidWdnZXIoc2VsZi5ycGNjbHQpCiAgICAgICAgICAgICAjIHJlbG9hZCByZW1vdGUgZGVidWdnZXIgYnJlYWtwb2ludHMgZm9yIGFsbCBQeVNoZWxsRWRpdFdpbmRvd3MKICAgICAgICAgICAgIGRlYnVnLmxvYWRfYnJlYWtwb2ludHMoKQogICAgICAgICBzZWxmLmNvbXBpbGUuY29tcGlsZXIuZmxhZ3MgPSBzZWxmLm9yaWdpbmFsX2NvbXBpbGVyX2ZsYWdzCkBAIC01NzgsNyArNTcyLDcgQEAKICAgICAgICAgICAgICAgICBpZiBzZWxmLnRrY29uc29sZS5nZXR2YXIoIjw8dG9nZ2xlLWppdC1zdGFjay12aWV3ZXI+PiIpOgogICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW90ZV9zdGFja192aWV3ZXIoKQogICAgICAgICAgICAgZWxpZiBob3cgPT0gIkVSUk9SIjoKLSAgICAgICAgICAgICAgICBlcnJtc2cgPSAiUHlTaGVsbC5Nb2RpZmllZEludGVycHJldGVyOiBTdWJwcm9jZXNzIEVSUk9SOlxuIgorICAgICAgICAgICAgICAgIGVycm1zZyA9ICJweXNoZWxsLk1vZGlmaWVkSW50ZXJwcmV0ZXI6IFN1YnByb2Nlc3MgRVJST1I6XG4iCiAgICAgICAgICAgICAgICAgcHJpbnQoZXJybXNnLCB3aGF0LCBmaWxlPXN5cy5fX3N0ZGVycl9fKQogICAgICAgICAgICAgICAgIHByaW50KGVycm1zZywgd2hhdCwgZmlsZT1jb25zb2xlKQogICAgICAgICAgICAgIyB3ZSByZWNlaXZlZCBhIHJlc3BvbnNlIHRvIHRoZSBjdXJyZW50bHkgYWN0aXZlIHNlcSBudW1iZXI6CkBAIC02MTMsMTMgKzYwNywxMyBAQAogICAgICAgICByZXR1cm4KIAogICAgIGRlZiByZW1vdGVfc3RhY2tfdmlld2VyKHNlbGYpOgotICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZU9iamVjdEJyb3dzZXIKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBkZWJ1Z29ial9yCiAgICAgICAgIG9pZCA9IHNlbGYucnBjY2x0LnJlbW90ZXF1ZXVlKCJleGVjIiwgInN0YWNrdmlld2VyIiwgKCJmbGlzdCIsKSwge30pCiAgICAgICAgIGlmIG9pZCBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUucm9vdC5iZWxsKCkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBpdGVtID0gUmVtb3RlT2JqZWN0QnJvd3Nlci5TdHViT2JqZWN0VHJlZUl0ZW0oc2VsZi5ycGNjbHQsIG9pZCkKLSAgICAgICAgZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFNjcm9sbGVkQ2FudmFzLCBUcmVlTm9kZQorICAgICAgICBpdGVtID0gZGVidWdvYmpfci5TdHViT2JqZWN0VHJlZUl0ZW0oc2VsZi5ycGNjbHQsIG9pZCkKKyAgICAgICAgZnJvbSBpZGxlbGliLnRyZWUgaW1wb3J0IFNjcm9sbGVkQ2FudmFzLCBUcmVlTm9kZQogICAgICAgICB0b3AgPSBUb3BsZXZlbChzZWxmLnRrY29uc29sZS5yb290KQogICAgICAgICB0aGVtZSA9IGlkbGVDb25mLkN1cnJlbnRUaGVtZSgpCiAgICAgICAgIGJhY2tncm91bmQgPSBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICdub3JtYWwnKVsnYmFja2dyb3VuZCddCkBAIC02NjIsOSArNjU2LDkgQEAKICAgICAgICAgIyBhdCB0aGUgbW9tZW50LCBJbnRlcmFjdGl2ZUludGVycHJldGVyIGV4cGVjdHMgc3RyCiAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHNvdXJjZSwgc3RyKQogICAgICAgICAjaWYgaXNpbnN0YW5jZShzb3VyY2UsIHN0cik6Ci0gICAgICAgICMgICAgZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKKyAgICAgICAgIyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGlvbWVudQogICAgICAgICAjICAgIHRyeToKLSAgICAgICAgIyAgICAgICAgc291cmNlID0gc291cmNlLmVuY29kZShJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgICMgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5lbmNvZGUoaW9tZW51LmVuY29kaW5nKQogICAgICAgICAjICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgICMgICAgICAgIHNlbGYudGtjb25zb2xlLnJlc2V0b3V0cHV0KCkKICAgICAgICAgIyAgICAgICAgc2VsZi53cml0ZSgiVW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBpbiBpbnB1dFxuIikKQEAgLTg1MCw3ICs4NDQsNyBAQAogCiAKICAgICAjIE5ldyBjbGFzc2VzCi0gICAgZnJvbSBpZGxlbGliLklkbGVIaXN0b3J5IGltcG9ydCBIaXN0b3J5CisgICAgZnJvbSBpZGxlbGliLmhpc3RvcnkgaW1wb3J0IEhpc3RvcnkKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lKToKICAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CkBAIC04ODgsMTEgKzg4MiwxMSBAQAogICAgICAgICBzZWxmLnNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAogICAgICAgICBzZWxmLnNhdmVfc3RkZXJyID0gc3lzLnN0ZGVycgogICAgICAgICBzZWxmLnNhdmVfc3RkaW4gPSBzeXMuc3RkaW4KLSAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKLSAgICAgICAgc2VsZi5zdGRpbiA9IFBzZXVkb0lucHV0RmlsZShzZWxmLCAic3RkaW4iLCBJT0JpbmRpbmcuZW5jb2RpbmcpCi0gICAgICAgIHNlbGYuc3Rkb3V0ID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAic3Rkb3V0IiwgSU9CaW5kaW5nLmVuY29kaW5nKQotICAgICAgICBzZWxmLnN0ZGVyciA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZGVyciIsIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc2VsZi5jb25zb2xlID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAiY29uc29sZSIsIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBpb21lbnUKKyAgICAgICAgc2VsZi5zdGRpbiA9IFBzZXVkb0lucHV0RmlsZShzZWxmLCAic3RkaW4iLCBpb21lbnUuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuc3Rkb3V0ID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAic3Rkb3V0IiwgaW9tZW51LmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0ZGVyciA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZGVyciIsIGlvbWVudS5lbmNvZGluZykKKyAgICAgICAgc2VsZi5jb25zb2xlID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAiY29uc29sZSIsIGlvbWVudS5lbmNvZGluZykKICAgICAgICAgaWYgbm90IHVzZV9zdWJwcm9jZXNzOgogICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuc3Rkb3V0CiAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5zdGRlcnIKQEAgLTkwMCw3ICs4OTQsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICAjIHBhZ2UgaGVscCgpIHRleHQgdG8gc2hlbGwuCiAgICAgICAgICAgICBpbXBvcnQgcHlkb2MgIyBpbXBvcnQgbXVzdCBiZSBkb25lIGhlcmUgdG8gY2FwdHVyZSBpL28gcmViaW5kaW5nLgotICAgICAgICAgICAgIyBYWFggS0JLIDI3RGVjMDcgdXNlIGEgdGV4dFZpZXcgc29tZWRheSwgYnV0IG11c3Qgd29yayB3L28gc3VicHJvYworICAgICAgICAgICAgIyBYWFggS0JLIDI3RGVjMDcgdXNlIFRleHRWaWV3ZXIgc29tZWRheSwgYnV0IG11c3Qgd29yayB3L28gc3VicHJvYwogICAgICAgICAgICAgcHlkb2MucGFnZXIgPSBweWRvYy5wbGFpbnBhZ2VyCiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzeXMuX19zdGRlcnJfXwpAQCAtOTU0LDcgKzk0OCw3IEBACiAgICAgICAgICAgICBzZWxmLmludGVycC5zZXRkZWJ1Z2dlcihOb25lKQogICAgICAgICAgICAgZGIuY2xvc2UoKQogICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnAucnBjY2x0OgotICAgICAgICAgICAgICAgIFJlbW90ZURlYnVnZ2VyLmNsb3NlX3JlbW90ZV9kZWJ1Z2dlcihzZWxmLmludGVycC5ycGNjbHQpCisgICAgICAgICAgICAgICAgZGVidWdnZXJfci5jbG9zZV9yZW1vdGVfZGVidWdnZXIoc2VsZi5pbnRlcnAucnBjY2x0KQogICAgICAgICAgICAgc2VsZi5yZXNldG91dHB1dCgpCiAgICAgICAgICAgICBzZWxmLmNvbnNvbGUud3JpdGUoIltERUJVRyBPRkZdXG4iKQogICAgICAgICAgICAgc3lzLnBzMSA9ICI+Pj4gIgpAQCAtOTYzLDEwICs5NTcsMTAgQEAKIAogICAgIGRlZiBvcGVuX2RlYnVnZ2VyKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmludGVycC5ycGNjbHQ6Ci0gICAgICAgICAgICBkYmdfZ3VpID0gUmVtb3RlRGVidWdnZXIuc3RhcnRfcmVtb3RlX2RlYnVnZ2VyKHNlbGYuaW50ZXJwLnJwY2NsdCwKKyAgICAgICAgICAgIGRiZ19ndWkgPSBkZWJ1Z2dlcl9yLnN0YXJ0X3JlbW90ZV9kZWJ1Z2dlcihzZWxmLmludGVycC5ycGNjbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBkYmdfZ3VpID0gRGVidWdnZXIuRGVidWdnZXIoc2VsZikKKyAgICAgICAgICAgIGRiZ19ndWkgPSBkZWJ1Z2dlci5EZWJ1Z2dlcihzZWxmKQogICAgICAgICBzZWxmLmludGVycC5zZXRkZWJ1Z2dlcihkYmdfZ3VpKQogICAgICAgICBkYmdfZ3VpLmxvYWRfYnJlYWtwb2ludHMoKQogICAgICAgICBzeXMucHMxID0gIltERUJVRyBPTl1cbj4+PiAiCkBAIC0xMjQxLDcgKzEyMzUsNyBAQAogICAgICAgICAgICAgICAgICIoc3lzLmxhc3RfdHJhY2ViYWNrIGlzIG5vdCBkZWZpbmVkKSIsCiAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBmcm9tIGlkbGVsaWIuU3RhY2tWaWV3ZXIgaW1wb3J0IFN0YWNrQnJvd3NlcgorICAgICAgICBmcm9tIGlkbGVsaWIuc3RhY2t2aWV3ZXIgaW1wb3J0IFN0YWNrQnJvd3NlcgogICAgICAgICBTdGFja0Jyb3dzZXIoc2VsZi5yb290LCBzZWxmLmZsaXN0KQogCiAgICAgZGVmIHZpZXdfcmVzdGFydF9tYXJrKHNlbGYsIGV2ZW50PU5vbmUpOgpAQCAtMTMwOSw5MiArMTMwMyw2IEBACiAgICAgICAgICAgICByZXR1cm4gJ2Rpc2FibGVkJwogICAgICAgICByZXR1cm4gc3VwZXIoKS5ybWVudV9jaGVja19wYXN0ZSgpCiAKLWNsYXNzIFBzZXVkb0ZpbGUoaW8uVGV4dElPQmFzZSk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nPU5vbmUpOgotICAgICAgICBzZWxmLnNoZWxsID0gc2hlbGwKLSAgICAgICAgc2VsZi50YWdzID0gdGFncwotICAgICAgICBzZWxmLl9lbmNvZGluZyA9IGVuY29kaW5nCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgZW5jb2Rpbmcoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGluZwotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIG5hbWUoc2VsZik6Ci0gICAgICAgIHJldHVybiAnPCVzPicgJSBzZWxmLnRhZ3MKLQotICAgIGRlZiBpc2F0dHkoc2VsZik6Ci0gICAgICAgIHJldHVybiBUcnVlCi0KLQotY2xhc3MgUHNldWRvT3V0cHV0RmlsZShQc2V1ZG9GaWxlKToKLQotICAgIGRlZiB3cml0YWJsZShzZWxmKToKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiB3cml0ZShzZWxmLCBzKToKLSAgICAgICAgaWYgc2VsZi5jbG9zZWQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ3cml0ZSB0byBjbG9zZWQgZmlsZSIpCi0gICAgICAgIGlmIHR5cGUocykgaXMgbm90IHN0cjoKLSAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIHN0ciwgbm90ICcgKyB0eXBlKHMpLl9fbmFtZV9fKQotICAgICAgICAgICAgIyBTZWUgaXNzdWUgIzE5NDgxCi0gICAgICAgICAgICBzID0gc3RyLl9fc3RyX18ocykKLSAgICAgICAgcmV0dXJuIHNlbGYuc2hlbGwud3JpdGUocywgc2VsZi50YWdzKQotCi0KLWNsYXNzIFBzZXVkb0lucHV0RmlsZShQc2V1ZG9GaWxlKToKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaGVsbCwgdGFncywgZW5jb2Rpbmc9Tm9uZSk6Ci0gICAgICAgIFBzZXVkb0ZpbGUuX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nKQotICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCi0KLSAgICBkZWYgcmVhZGFibGUoc2VsZik6Ci0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKLSAgICAgICAgaWYgc2VsZi5jbG9zZWQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQotICAgICAgICBpZiBzaXplIGlzIE5vbmU6Ci0gICAgICAgICAgICBzaXplID0gLTEKLSAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzaXplLCBpbnQpOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIGludCwgbm90ICcgKyB0eXBlKHNpemUpLl9fbmFtZV9fKQotICAgICAgICByZXN1bHQgPSBzZWxmLl9saW5lX2J1ZmZlcgotICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCi0gICAgICAgIGlmIHNpemUgPCAwOgotICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHdoaWxlIGxlbihyZXN1bHQpIDwgc2l6ZToKLSAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKLSAgICAgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gcmVzdWx0W3NpemU6XQotICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzpzaXplXQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6Ci0gICAgICAgIGlmIHNlbGYuY2xvc2VkOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKLSAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgotICAgICAgICAgICAgc2l6ZSA9IC0xCi0gICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2l6ZSwgaW50KToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBpbnQsIG5vdCAnICsgdHlwZShzaXplKS5fX25hbWVfXykKLSAgICAgICAgbGluZSA9IHNlbGYuX2xpbmVfYnVmZmVyIG9yIHNlbGYuc2hlbGwucmVhZGxpbmUoKQotICAgICAgICBpZiBzaXplIDwgMDoKLSAgICAgICAgICAgIHNpemUgPSBsZW4obGluZSkKLSAgICAgICAgZW9sID0gbGluZS5maW5kKCdcbicsIDAsIHNpemUpCi0gICAgICAgIGlmIGVvbCA+PSAwOgotICAgICAgICAgICAgc2l6ZSA9IGVvbCArIDEKLSAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSBsaW5lW3NpemU6XQotICAgICAgICByZXR1cm4gbGluZVs6c2l6ZV0KLQotICAgIGRlZiBjbG9zZShzZWxmKToKLSAgICAgICAgc2VsZi5zaGVsbC5jbG9zZSgpCi0KIAogZGVmIGZpeF94MTFfcGFzdGUocm9vdCk6CiAgICAgIk1ha2UgcGFzdGUgcmVwbGFjZSBzZWxlY3Rpb24gb24geDExLiAgU2VlIGlzc3VlICM1MTI0LiIKQEAgLTE1NDAsNyArMTQ0OCw5IEBACiAgICAgZW5hYmxlX2VkaXQgPSBlbmFibGVfZWRpdCBvciBlZGl0X3N0YXJ0CiAgICAgZW5hYmxlX3NoZWxsID0gZW5hYmxlX3NoZWxsIG9yIG5vdCBlbmFibGVfZWRpdAogCi0gICAgIyBzdGFydCBlZGl0b3IgYW5kL29yIHNoZWxsIHdpbmRvd3M6CisgICAgIyBTZXR1cCByb290LgorICAgIGlmIHVzZV9zdWJwcm9jZXNzOiAgIyBEb24ndCBicmVhayB1c2VyIGNvZGUgcnVuIGluIElETEUgcHJvY2VzcworICAgICAgICBOb0RlZmF1bHRSb290KCkKICAgICByb290ID0gVGsoY2xhc3NOYW1lPSJJZGxlIikKICAgICByb290LndpdGhkcmF3KCkKIApAQCAtMTU0OSwyNSArMTQ1OSwxOSBAQAogICAgIGlmIHN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgICAgICAgaWNvbmZpbGUgPSBvcy5wYXRoLmpvaW4oaWNvbmRpciwgJ2lkbGUuaWNvJykKICAgICAgICAgcm9vdC53bV9pY29uYml0bWFwKGRlZmF1bHQ9aWNvbmZpbGUpCi0gICAgZWxpZiBUa1ZlcnNpb24gPj0gOC41OgorICAgIGVsc2U6CiAgICAgICAgIGV4dCA9ICcucG5nJyBpZiBUa1ZlcnNpb24gPj0gOC42IGVsc2UgJy5naWYnCiAgICAgICAgIGljb25maWxlcyA9IFtvcy5wYXRoLmpvaW4oaWNvbmRpciwgJ2lkbGVfJWQlcycgJSAoc2l6ZSwgZXh0KSkKICAgICAgICAgICAgICAgICAgICAgIGZvciBzaXplIGluICgxNiwgMzIsIDQ4KV0KLSAgICAgICAgaWNvbnMgPSBbUGhvdG9JbWFnZShmaWxlPWljb25maWxlKSBmb3IgaWNvbmZpbGUgaW4gaWNvbmZpbGVzXQorICAgICAgICBpY29ucyA9IFtQaG90b0ltYWdlKG1hc3Rlcj1yb290LCBmaWxlPWljb25maWxlKQorICAgICAgICAgICAgICAgICBmb3IgaWNvbmZpbGUgaW4gaWNvbmZpbGVzXQogICAgICAgICByb290LndtX2ljb25waG90byhUcnVlLCAqaWNvbnMpCiAKKyAgICAjIHN0YXJ0IGVkaXRvciBhbmQvb3Igc2hlbGwgd2luZG93czoKICAgICBmaXh3b3JkYnJlYWtzKHJvb3QpCiAgICAgZml4X3gxMV9wYXN0ZShyb290KQogICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHJvb3QpCi0gICAgbWFjb3N4U3VwcG9ydC5zZXR1cEFwcChyb290LCBmbGlzdCkKLQotICAgIGlmIG1hY29zeFN1cHBvcnQuaXNBcXVhVGsoKToKLSAgICAgICAgIyBUaGVyZSBhcmUgc29tZSBzY3Jld2VkIHVwIDwyPiBjbGFzcyBiaW5kaW5ncyBmb3IgdGV4dAotICAgICAgICAjIHdpZGdldHMgZGVmaW5lZCBpbiBUayB3aGljaCB3ZSBuZWVkIHRvIGRvIGF3YXkgd2l0aC4KLSAgICAgICAgIyBTZWUgaXNzdWUgIzI0ODAxLgotICAgICAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8QjI+JykKLSAgICAgICAgcm9vdC51bmJpbmRfY2xhc3MoJ1RleHQnLCAnPEIyLU1vdGlvbj4nKQotICAgICAgICByb290LnVuYmluZF9jbGFzcygnVGV4dCcsICc8PFBhc3RlU2VsZWN0aW9uPj4nKQorICAgIG1hY29zeC5zZXR1cEFwcChyb290LCBmbGlzdCkKIAogICAgIGlmIGVuYWJsZV9lZGl0OgogICAgICAgICBpZiBub3QgKGNtZCBvciBzY3JpcHQpOgpAQCAtMTU4Miw3ICsxNDg2LDcgQEAKICAgICAgICAgc2hlbGwgPSBmbGlzdC5vcGVuX3NoZWxsKCkKICAgICAgICAgaWYgbm90IHNoZWxsOgogICAgICAgICAgICAgcmV0dXJuICMgY291bGRuJ3Qgb3BlbiBzaGVsbAotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCkgYW5kIGZsaXN0LmRpY3Q6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpIGFuZCBmbGlzdC5kaWN0OgogICAgICAgICAgICAgIyBPbiBPU1g6IHdoZW4gdGhlIHVzZXIgaGFzIGRvdWJsZS1jbGlja2VkIG9uIGEgZmlsZSB0aGF0IGNhdXNlcwogICAgICAgICAgICAgIyBJRExFIHRvIGJlIGxhdW5jaGVkIHRoZSBzaGVsbCB3aW5kb3cgd2lsbCBvcGVuIGp1c3QgaW4gZnJvbnQgb2YKICAgICAgICAgICAgICMgdGhlIGZpbGUgc2hlIHdhbnRzIHRvIHNlZS4gTG93ZXIgdGhlIGludGVycHJldGVyIHdpbmRvdyB3aGVuCkBAIC0xNjE2LDcgKzE1MjAsNyBAQAogICAgICAgICAjIGNoZWNrIGZvciBwcm9ibGVtYXRpYyBPUyBYIFRrIHZlcnNpb25zIGFuZCBwcmludCBhIHdhcm5pbmcKICAgICAgICAgIyBtZXNzYWdlIGluIHRoZSBJRExFIHNoZWxsIHdpbmRvdzsgdGhpcyBpcyBsZXNzIGludHJ1c2l2ZQogICAgICAgICAjIHRoYW4gYWx3YXlzIG9wZW5pbmcgYSBzZXBhcmF0ZSB3aW5kb3cuCi0gICAgICAgIHRrdmVyc2lvbndhcm5pbmcgPSBtYWNvc3hTdXBwb3J0LnRrVmVyc2lvbldhcm5pbmcocm9vdCkKKyAgICAgICAgdGt2ZXJzaW9ud2FybmluZyA9IG1hY29zeC50a1ZlcnNpb25XYXJuaW5nKHJvb3QpCiAgICAgICAgIGlmIHRrdmVyc2lvbndhcm5pbmc6CiAgICAgICAgICAgICBzaGVsbC5pbnRlcnAucnVuY29tbWFuZCgicHJpbnQoJyVzJykiICUgdGt2ZXJzaW9ud2FybmluZykKIApAQCAtMTYyNiw3ICsxNTMwLDcgQEAKICAgICBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHN5cy5tb2R1bGVzWydQeVNoZWxsJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQorICAgIHN5cy5tb2R1bGVzWydweXNoZWxsJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQogICAgIG1haW4oKQogCiBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKSAgIyBNYWtlIHN1cmUgdHVybmVkIG9mZjsgc2VlIGlzc3VlIDE4MDgxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9xdWVyeS5weSBiL0xpYi9pZGxlbGliL3F1ZXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDE0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvaWRsZWxpYi9xdWVyeS5weQpAQCAtMCwwICsxLDI4NiBAQAorIiIiCitEaWFsb2dzIHRoYXQgcXVlcnkgdXNlcnMgYW5kIHZlcmlmeSB0aGUgYW5zd2VyIGJlZm9yZSBhY2NlcHRpbmcuCitVc2UgdHRrIHdpZGdldHMsIGxpbWl0aW5nIHVzZSB0byB0Y2wvdGsgOC41KywgYXMgaW4gSURMRSAzLjYrLgorCitRdWVyeSBpcyB0aGUgZ2VuZXJpYyBiYXNlIGNsYXNzIGZvciBhIHBvcHVwIGRpYWxvZy4KK1RoZSB1c2VyIG11c3QgZWl0aGVyIGVudGVyIGEgdmFsaWQgYW5zd2VyIG9yIGNsb3NlIHRoZSBkaWFsb2cuCitFbnRyaWVzIGFyZSB2YWxpZGF0ZWQgd2hlbiA8UmV0dXJuPiBpcyBlbnRlcmVkIG9yIFtPa10gaXMgY2xpY2tlZC4KK0VudHJpZXMgYXJlIGlnbm9yZWQgd2hlbiBbQ2FuY2VsXSBvciBbWF0gYXJlIGNsaWNrZWQuCitUaGUgJ3JldHVybiB2YWx1ZScgaXMgLnJlc3VsdCBzZXQgdG8gZWl0aGVyIGEgdmFsaWQgYW5zd2VyIG9yIE5vbmUuCisKK1N1YmNsYXNzIFNlY3Rpb25OYW1lIGdldHMgYSBuYW1lIGZvciBhIG5ldyBjb25maWcgZmlsZSBzZWN0aW9uLgorQ29uZmlnZGlhbG9nIHVzZXMgaXQgZm9yIG5ldyBoaWdobGlnaHQgdGhlbWUgYW5kIGtleWJpbmRpbmcgc2V0IG5hbWVzLgorIiIiCisjIFF1ZXJ5IGFuZCBTZWN0aW9uIG5hbWUgcmVzdWx0IGZyb20gc3BsaXR0aW5nIEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nCisjIG9mIGNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5ICh0ZW1wb3JhcmlseSBjb25maWdfc2VjLnB5KSBpbnRvCisjIGdlbmVyaWMgYW5kIHNwZWNpZmljIHBhcnRzLiAgMy42IG9ubHksIEp1bHkgMjAxNi4KKyMgTW9kdWxlTmFtZS5lbnRyeV9vayBjYW1lIGZyb20gZWRpdG9yLkVkaXRvcldpbmRvdy5sb2FkX21vZHVsZS4KKyMgSGVscFNvdXJjZSB3YXMgZXh0cmFjdGVkIGZyb20gY29uZmlnSGVscFNvdXJjZUVkaXQucHkgKHRlbXBvcmFyaWx5CisjIGNvbmZpZ19oZWxwLnB5KSwgd2l0aCBkYXJ3aW4gY29kZSBtb3ZlZCBmcm9tIG9rIHRvIHBhdGhfb2suCisKK2ltcG9ydCBpbXBvcnRsaWIKK2ltcG9ydCBvcworZnJvbSBzeXMgaW1wb3J0IGV4ZWN1dGFibGUsIHBsYXRmb3JtICAjIFBsYXRmb3JtIGlzIHNldCBmb3Igb25lIHRlc3QuCitmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBTdHJpbmdWYXIKK2Zyb20gdGtpbnRlciBpbXBvcnQgZmlsZWRpYWxvZworZnJvbSB0a2ludGVyLm1lc3NhZ2Vib3ggaW1wb3J0IHNob3dlcnJvcgorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgRnJhbWUsIEJ1dHRvbiwgRW50cnksIExhYmVsCisKK2NsYXNzIFF1ZXJ5KFRvcGxldmVsKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBnZXR0aW5nIHZlcmlmaWVkIGFuc3dlciBmcm9tIGEgdXNlci4KKworICAgIEZvciB0aGlzIGJhc2UgY2xhc3MsIGFjY2VwdCBhbnkgbm9uLWJsYW5rIHN0cmluZy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgKiwgdGV4dDA9JycsIHVzZWRfbmFtZXM9e30sCisgICAgICAgICAgICAgICAgIF9odGVzdD1GYWxzZSwgX3V0ZXN0PUZhbHNlKToKKyAgICAgICAgIiIiQ3JlYXRlIHBvcHVwLCBkbyBub3QgcmV0dXJuIHVudGlsIHRrIHdpZGdldCBkZXN0cm95ZWQuCisKKyAgICAgICAgQWRkaXRpb25hbCBzdWJjbGFzcyBpbml0IG11c3QgYmUgZG9uZSBiZWZvcmUgY2FsbGluZyB0aGlzCisgICAgICAgIHVubGVzcyAgX3V0ZXN0PVRydWUgaXMgcGFzc2VkIHRvIHN1cHByZXNzIHdhaXRfd2luZG93KCkuCisKKyAgICAgICAgdGl0bGUgLSBzdHJpbmcsIHRpdGxlIG9mIHBvcHVwIGRpYWxvZworICAgICAgICBtZXNzYWdlIC0gc3RyaW5nLCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UgdG8gZGlzcGxheQorICAgICAgICB0ZXh0MCAtIGluaXRpYWwgdmFsdWUgZm9yIGVudHJ5CisgICAgICAgIHVzZWRfbmFtZXMgLSBuYW1lcyBhbHJlYWR5IGluIHVzZQorICAgICAgICBfaHRlc3QgLSBib29sLCBjaGFuZ2UgYm94IGxvY2F0aW9uIHdoZW4gcnVubmluZyBodGVzdAorICAgICAgICBfdXRlc3QgLSBib29sLCBsZWF2ZSB3aW5kb3cgaGlkZGVuIGFuZCBub3QgbW9kYWwKKyAgICAgICAgIiIiCisgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi53aXRoZHJhdygpICAjIEhpZGUgd2hpbGUgY29uZmlndXJpbmcsIGVzcGVjaWFsbHkgZ2VvbWV0cnkuCisgICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCisgICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GYWxzZSwgd2lkdGg9RmFsc2UpCisgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCisgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgc2VsZi5ncmFiX3NldCgpCisgICAgICAgIHNlbGYuYmluZCgnPEtleS1SZXR1cm4+Jywgc2VsZi5vaykKKyAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2FuY2VsKQorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIHNlbGYudGV4dDAgPSB0ZXh0MAorICAgICAgICBzZWxmLnVzZWRfbmFtZXMgPSB1c2VkX25hbWVzCisgICAgICAgIHNlbGYuY3JlYXRlX3dpZGdldHMoKQorICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKSAgIyBOZWVkZWQgaGVyZSBmb3Igd2luZm9fcmVxd2lkdGggYmVsb3cuCisgICAgICAgIHNlbGYuZ2VvbWV0cnkoICAjIENlbnRlciBkaWFsb2cgb3ZlciBwYXJlbnQgKG9yIGJlbG93IGh0ZXN0IGJveCkuCisgICAgICAgICAgICAgICAgIislZCslZCIgJSAoCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eCgpICsKKyAgICAgICAgICAgICAgICAgICAgKHBhcmVudC53aW5mb193aWR0aCgpLzIgLSBzZWxmLndpbmZvX3JlcXdpZHRoKCkvMiksCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsKKyAgICAgICAgICAgICAgICAgICAgKChwYXJlbnQud2luZm9faGVpZ2h0KCkvMiAtIHNlbGYud2luZm9fcmVxaGVpZ2h0KCkvMikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IF9odGVzdCBlbHNlIDE1MCkKKyAgICAgICAgICAgICAgICApICkKKyAgICAgICAgaWYgbm90IF91dGVzdDoKKyAgICAgICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgICMgVW5oaWRlIG5vdyB0aGF0IGdlb21ldHJ5IHNldC4KKyAgICAgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQorCisgICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOiAgIyBDYWxsIGZyb20gb3ZlcnJpZGUsIGlmIGFueS4KKyAgICAgICAgIyBCaW5kIHRvIHNlbGYgd2lkZ2V0cyBuZWVkZWQgZm9yIGVudHJ5X29rIG9yIHVuaXR0ZXN0LgorICAgICAgICBzZWxmLmZyYW1lID0gZnJhbWUgPSBGcmFtZShzZWxmLCBib3JkZXJ3aWR0aD0yLCByZWxpZWY9J3N1bmtlbicsICkKKyAgICAgICAgZW50cnlsYWJlbCA9IExhYmVsKGZyYW1lLCBhbmNob3I9J3cnLCBqdXN0aWZ5PSdsZWZ0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9c2VsZi5tZXNzYWdlKQorICAgICAgICBzZWxmLmVudHJ5dmFyID0gU3RyaW5nVmFyKHNlbGYsIHNlbGYudGV4dDApCisgICAgICAgIHNlbGYuZW50cnkgPSBFbnRyeShmcmFtZSwgd2lkdGg9MzAsIHRleHR2YXJpYWJsZT1zZWxmLmVudHJ5dmFyKQorICAgICAgICBzZWxmLmVudHJ5LmZvY3VzX3NldCgpCisKKyAgICAgICAgYnV0dG9ucyA9IEZyYW1lKHNlbGYpCisgICAgICAgIHNlbGYuYnV0dG9uX29rID0gQnV0dG9uKGJ1dHRvbnMsIHRleHQ9J09rJywKKyAgICAgICAgICAgICAgICB3aWR0aD04LCBjb21tYW5kPXNlbGYub2spCisgICAgICAgIHNlbGYuYnV0dG9uX2NhbmNlbCA9IEJ1dHRvbihidXR0b25zLCB0ZXh0PSdDYW5jZWwnLAorICAgICAgICAgICAgICAgIHdpZHRoPTgsIGNvbW1hbmQ9c2VsZi5jYW5jZWwpCisKKyAgICAgICAgZnJhbWUucGFjayhzaWRlPSd0b3AnLCBleHBhbmQ9VHJ1ZSwgZmlsbD0nYm90aCcpCisgICAgICAgIGVudHJ5bGFiZWwucGFjayhwYWR4PTUsIHBhZHk9NSkKKyAgICAgICAgc2VsZi5lbnRyeS5wYWNrKHBhZHg9NSwgcGFkeT01KQorICAgICAgICBidXR0b25zLnBhY2soc2lkZT0nYm90dG9tJykKKyAgICAgICAgc2VsZi5idXR0b25fb2sucGFjayhzaWRlPSdsZWZ0JywgcGFkeD01KQorICAgICAgICBzZWxmLmJ1dHRvbl9jYW5jZWwucGFjayhzaWRlPSdyaWdodCcsIHBhZHg9NSkKKworICAgIGRlZiBlbnRyeV9vayhzZWxmKTogICMgRXhhbXBsZTogdXN1YWxseSByZXBsYWNlLgorICAgICAgICAiUmV0dXJuIG5vbi1ibGFuayBlbnRyeSBvciBOb25lLiIKKyAgICAgICAgZW50cnkgPSBzZWxmLmVudHJ5LmdldCgpLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IGVudHJ5OgorICAgICAgICAgICAgc2hvd2Vycm9yKHRpdGxlPSdFbnRyeSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0JsYW5rIGxpbmUuJywgcGFyZW50PXNlbGYpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gZW50cnkKKworICAgIGRlZiBvayhzZWxmLCBldmVudD1Ob25lKTogICMgRG8gbm90IHJlcGxhY2UuCisgICAgICAgICcnJ0lmIGVudHJ5IGlzIHZhbGlkLCBiaW5kIGl0IHRvICdyZXN1bHQnIGFuZCBkZXN0cm95IHRrIHdpZGdldC4KKworICAgICAgICBPdGhlcndpc2UgbGVhdmUgZGlhbG9nIG9wZW4gZm9yIHVzZXIgdG8gY29ycmVjdCBlbnRyeSBvciBjYW5jZWwuCisgICAgICAgICcnJworICAgICAgICBlbnRyeSA9IHNlbGYuZW50cnlfb2soKQorICAgICAgICBpZiBlbnRyeSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gZW50cnkKKyAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFtPa10gbW92ZXMgZm9jdXMuICAoPFJldHVybj4gZG9lcyBub3QuKSAgTW92ZSBpdCBiYWNrLgorICAgICAgICAgICAgc2VsZi5lbnRyeS5mb2N1c19zZXQoKQorCisgICAgZGVmIGNhbmNlbChzZWxmLCBldmVudD1Ob25lKTogICMgRG8gbm90IHJlcGxhY2UuCisgICAgICAgICJTZXQgZGlhbG9nIHJlc3VsdCB0byBOb25lIGFuZCBkZXN0cm95IHRrIHdpZGdldC4iCisgICAgICAgIHNlbGYucmVzdWx0ID0gTm9uZQorICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisKK2NsYXNzIFNlY3Rpb25OYW1lKFF1ZXJ5KToKKyAgICAiR2V0IGEgbmFtZSBmb3IgYSBjb25maWcgZmlsZSBzZWN0aW9uIG5hbWUuIgorICAgICMgVXNlZCBpbiBDb25maWdEaWFsb2cuR2V0TmV3S2V5c05hbWUsIC5HZXROZXdUaGVtZU5hbWUgKDgzNykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCB1c2VkX25hbWVzLAorICAgICAgICAgICAgICAgICAqLCBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18ocGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdXNlZF9uYW1lcz11c2VkX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9odGVzdD1faHRlc3QsIF91dGVzdD1fdXRlc3QpCisKKyAgICBkZWYgZW50cnlfb2soc2VsZik6CisgICAgICAgICJSZXR1cm4gc2Vuc2libGUgQ29uZmlnUGFyc2VyIHNlY3Rpb24gbmFtZSBvciBOb25lLiIKKyAgICAgICAgbmFtZSA9IHNlbGYuZW50cnkuZ2V0KCkuc3RyaXAoKQorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIHNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIG5hbWUgc3BlY2lmaWVkLicsIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxpZiBsZW4obmFtZSk+MzA6CisgICAgICAgICAgICBzaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdOYW1lIHRvbyBsb25nLiBJdCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuICcrCisgICAgICAgICAgICAgICAgICAgICczMCBjaGFyYWN0ZXJzLicsIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYudXNlZF9uYW1lczoKKyAgICAgICAgICAgIHNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4nLCBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBuYW1lCisKKworY2xhc3MgTW9kdWxlTmFtZShRdWVyeSk6CisgICAgIkdldCBhIG1vZHVsZSBuYW1lIGZvciBPcGVuIE1vZHVsZSBtZW51IGVudHJ5LiIKKyAgICAjIFVzZWQgaW4gb3Blbl9tb2R1bGUgKGVkaXRvci5FZGl0b3JXaW5kb3cgdW50aWwgbW92ZSB0byBpb2JpbmRpbmcpLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIG1lc3NhZ2UsIHRleHQwLAorICAgICAgICAgICAgICAgICAqLCBfaHRlc3Q9RmFsc2UsIF91dGVzdD1GYWxzZSk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18ocGFyZW50LCB0aXRsZSwgbWVzc2FnZSwgdGV4dDA9dGV4dDAsCisgICAgICAgICAgICAgICAgICAgICAgIF9odGVzdD1faHRlc3QsIF91dGVzdD1fdXRlc3QpCisKKyAgICBkZWYgZW50cnlfb2soc2VsZik6CisgICAgICAgICJSZXR1cm4gZW50ZXJlZCBtb2R1bGUgbmFtZSBhcyBmaWxlIHBhdGggb3IgTm9uZS4iCisgICAgICAgIG5hbWUgPSBzZWxmLmVudHJ5LmdldCgpLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBzaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBuYW1lIHNwZWNpZmllZC4nLCBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICMgWFhYIE91Z2h0IHRvIGluc2VydCBjdXJyZW50IGZpbGUncyBkaXJlY3RvcnkgaW4gZnJvbnQgb2YgcGF0aC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3BlYyA9IGltcG9ydGxpYi51dGlsLmZpbmRfc3BlYyhuYW1lKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEltcG9ydEVycm9yKSBhcyBtc2c6CisgICAgICAgICAgICBzaG93ZXJyb3IoIkltcG9ydCBFcnJvciIsIHN0cihtc2cpLCBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHNwZWMgaXMgTm9uZToKKyAgICAgICAgICAgIHNob3dlcnJvcigiSW1wb3J0IEVycm9yIiwgIm1vZHVsZSBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYy5sb2FkZXIsIGltcG9ydGxpYi5hYmMuU291cmNlTG9hZGVyKToKKyAgICAgICAgICAgIHNob3dlcnJvcigiSW1wb3J0IEVycm9yIiwgIm5vdCBhIHNvdXJjZS1iYXNlZCBtb2R1bGUiLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZV9wYXRoID0gc3BlYy5sb2FkZXIuZ2V0X2ZpbGVuYW1lKG5hbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHNob3dlcnJvcigiSW1wb3J0IEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAibG9hZGVyIGRvZXMgbm90IHN1cHBvcnQgZ2V0X2ZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBmaWxlX3BhdGgKKworCitjbGFzcyBIZWxwU291cmNlKFF1ZXJ5KToKKyAgICAiR2V0IG1lbnUgbmFtZSBhbmQgaGVscCBzb3VyY2UgZm9yIEhlbHAgbWVudS4iCisgICAgIyBVc2VkIGluIENvbmZpZ0RpYWxvZy5IZWxwTGlzdEl0ZW1BZGQvRWRpdCwgKDk0MS85KQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsICosIG1lbnVpdGVtPScnLCBmaWxlcGF0aD0nJywKKyAgICAgICAgICAgICAgICAgdXNlZF9uYW1lcz17fSwgX2h0ZXN0PUZhbHNlLCBfdXRlc3Q9RmFsc2UpOgorICAgICAgICAiIiJHZXQgbWVudSBlbnRyeSBhbmQgdXJsL2xvY2FsIGZpbGUgZm9yIEFkZGl0aW9uYWwgSGVscC4KKworICAgICAgICBVc2VyIGVudGVycyBhIG5hbWUgZm9yIHRoZSBIZWxwIHJlc291cmNlIGFuZCBhIHdlYiB1cmwgb3IgZmlsZQorICAgICAgICBuYW1lLiBUaGUgdXNlciBjYW4gYnJvd3NlIGZvciB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmlsZXBhdGggPSBmaWxlcGF0aAorICAgICAgICBtZXNzYWdlID0gJ05hbWUgZm9yIGl0ZW0gb24gSGVscCBtZW51OicKKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhwYXJlbnQsIHRpdGxlLCBtZXNzYWdlLCB0ZXh0MD1tZW51aXRlbSwKKyAgICAgICAgICAgICAgICAgdXNlZF9uYW1lcz11c2VkX25hbWVzLCBfaHRlc3Q9X2h0ZXN0LCBfdXRlc3Q9X3V0ZXN0KQorCisgICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOgorICAgICAgICBzdXBlcigpLmNyZWF0ZV93aWRnZXRzKCkKKyAgICAgICAgZnJhbWUgPSBzZWxmLmZyYW1lCisgICAgICAgIHBhdGhsYWJlbCA9IExhYmVsKGZyYW1lLCBhbmNob3I9J3cnLCBqdXN0aWZ5PSdsZWZ0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nSGVscCBGaWxlIFBhdGg6IEVudGVyIFVSTCBvciBicm93c2UgZm9yIGZpbGUnKQorICAgICAgICBzZWxmLnBhdGh2YXIgPSBTdHJpbmdWYXIoc2VsZiwgc2VsZi5maWxlcGF0aCkKKyAgICAgICAgc2VsZi5wYXRoID0gRW50cnkoZnJhbWUsIHRleHR2YXJpYWJsZT1zZWxmLnBhdGh2YXIsIHdpZHRoPTQwKQorICAgICAgICBicm93c2UgPSBCdXR0b24oZnJhbWUsIHRleHQ9J0Jyb3dzZScsIHdpZHRoPTgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuYnJvd3NlX2ZpbGUpCisKKyAgICAgICAgcGF0aGxhYmVsLnBhY2soYW5jaG9yPSd3JywgcGFkeD01LCBwYWR5PTMpCisgICAgICAgIHNlbGYucGF0aC5wYWNrKGFuY2hvcj0ndycsIHBhZHg9NSwgcGFkeT0zKQorICAgICAgICBicm93c2UucGFjayhwYWR5PTMpCisKKyAgICBkZWYgYXNrZmlsZW5hbWUoc2VsZiwgZmlsZXR5cGVzLCBpbml0ZGlyLCBpbml0ZmlsZSk6ICAjIGh0ZXN0ICMKKyAgICAgICAgIyBFeHRyYWN0ZWQgZnJvbSBicm93c2VfZmlsZSBzbyBjYW4gbW9jayBmb3IgdW5pdHRlc3RzLgorICAgICAgICAjIENhbm5vdCB1bml0dGVzdCBhcyBjYW5ub3Qgc2ltdWxhdGUgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgIyBUZXN0IGJ5IHJ1bm5pbmcgaHRlc3QsIHN1Y2ggYXMgYnkgcnVubmluZyB0aGlzIGZpbGUuCisgICAgICAgIHJldHVybiBmaWxlZGlhbG9nLk9wZW4ocGFyZW50PXNlbGYsIGZpbGV0eXBlcz1maWxldHlwZXMpXAorICAgICAgICAgICAgICAgLnNob3coaW5pdGlhbGRpcj1pbml0ZGlyLCBpbml0aWFsZmlsZT1pbml0ZmlsZSkKKworICAgIGRlZiBicm93c2VfZmlsZShzZWxmKToKKyAgICAgICAgZmlsZXR5cGVzID0gWworICAgICAgICAgICAgKCJIVE1MIEZpbGVzIiwgIiouaHRtICouaHRtbCIsICJURVhUIiksCisgICAgICAgICAgICAoIlBERiBGaWxlcyIsICIqLnBkZiIsICJURVhUIiksCisgICAgICAgICAgICAoIldpbmRvd3MgSGVscCBGaWxlcyIsICIqLmNobSIpLAorICAgICAgICAgICAgKCJUZXh0IEZpbGVzIiwgIioudHh0IiwgIlRFWFQiKSwKKyAgICAgICAgICAgICgiQWxsIEZpbGVzIiwgIioiKV0KKyAgICAgICAgcGF0aCA9IHNlbGYucGF0aHZhci5nZXQoKQorICAgICAgICBpZiBwYXRoOgorICAgICAgICAgICAgZGlyLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZSA9IE5vbmUKKyAgICAgICAgICAgIGlmIHBsYXRmb3JtWzozXSA9PSAnd2luJzoKKyAgICAgICAgICAgICAgICBkaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGV4ZWN1dGFibGUpLCAnRG9jJykKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXIpOgorICAgICAgICAgICAgICAgICAgICBkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBmaWxlID0gc2VsZi5hc2tmaWxlbmFtZShmaWxldHlwZXMsIGRpciwgYmFzZSkKKyAgICAgICAgaWYgZmlsZToKKyAgICAgICAgICAgIHNlbGYucGF0aHZhci5zZXQoZmlsZSkKKworICAgIGl0ZW1fb2sgPSBTZWN0aW9uTmFtZS5lbnRyeV9vayAgIyBsb2NhbGl6ZSBmb3IgdGVzdCBvdmVycmlkZQorCisgICAgZGVmIHBhdGhfb2soc2VsZik6CisgICAgICAgICJTaW1wbGUgdmFsaWRpdHkgY2hlY2sgZm9yIG1lbnUgZmlsZSBwYXRoIgorICAgICAgICBwYXRoID0gc2VsZi5wYXRoLmdldCgpLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IHBhdGg6ICNubyBwYXRoIHNwZWNpZmllZAorICAgICAgICAgICAgc2hvd2Vycm9yKHRpdGxlPSdGaWxlIFBhdGggRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIGhlbHAgZmlsZSBwYXRoIHNwZWNpZmllZC4nLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxpZiBub3QgcGF0aC5zdGFydHN3aXRoKCgnd3d3LicsICdodHRwJykpOgorICAgICAgICAgICAgaWYgcGF0aFs6NV0gPT0gJ2ZpbGU6JzoKKyAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFs1Ol0KKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICBzaG93ZXJyb3IodGl0bGU9J0ZpbGUgUGF0aCBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0hlbHAgZmlsZSBwYXRoIGRvZXMgbm90IGV4aXN0LicsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBpZiBwbGF0Zm9ybSA9PSAnZGFyd2luJzogICMgZm9yIE1hYyBTYWZhcmkKKyAgICAgICAgICAgICAgICBwYXRoID0gICJmaWxlOi8vIiArIHBhdGgKKyAgICAgICAgcmV0dXJuIHBhdGgKKworICAgIGRlZiBlbnRyeV9vayhzZWxmKToKKyAgICAgICAgIlJldHVybiBhcHBhcmVudGx5IHZhbGlkIChuYW1lLCBwYXRoKSBvciBOb25lIgorICAgICAgICBuYW1lID0gc2VsZi5pdGVtX29rKCkKKyAgICAgICAgcGF0aCA9IHNlbGYucGF0aF9vaygpCisgICAgICAgIHJldHVybiBOb25lIGlmIG5hbWUgaXMgTm9uZSBvciBwYXRoIGlzIE5vbmUgZWxzZSAobmFtZSwgcGF0aCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB1bml0dGVzdAorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfcXVlcnknLCB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKworICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgorICAgIHJ1bihRdWVyeSwgSGVscFNvdXJjZSkKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkgYi9MaWIvaWRsZWxpYi9yZWRpcmVjdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3JlZGlyZWN0b3IucHkKaW5kZXggYjY2YmU5ZS4uZWM2ODFkZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weQorKysgYi9MaWIvaWRsZWxpYi9yZWRpcmVjdG9yLnB5CkBAIC0xMDQsNyArMTA0LDcgQEAKIAogICAgICAgICBOb3RlIHRoYXQgaWYgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG9wZXJhdGlvbiBpcyBub3QKICAgICAgICAgcGFzc2VkIHRocm91Z2ggdG8gVGsuICBBcHBseSB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgc2VsZi5yZWdpc3RlcigpCi0gICAgICAgIHRvICphcmdzIHRvIGFjY29tcGxpc2ggdGhhdC4gIEZvciBhbiBleGFtcGxlLCBzZWUgQ29sb3JEZWxlZ2F0b3IucHkuCisgICAgICAgIHRvICphcmdzIHRvIGFjY29tcGxpc2ggdGhhdC4gIEZvciBhbiBleGFtcGxlLCBzZWUgY29sb3JpemVyLnB5LgogCiAgICAgICAgICcnJwogICAgICAgICBtID0gc2VsZi5fb3BlcmF0aW9ucy5nZXQob3BlcmF0aW9uKQpAQCAtMTUxLDE0ICsxNTEsMTMgQEAKIAogCiBkZWYgX3dpZGdldF9yZWRpcmVjdG9yKHBhcmVudCk6ICAjIGh0ZXN0ICMKLSAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRrLCBUZXh0Ci0gICAgaW1wb3J0IHJlCisgICAgZnJvbSB0a2ludGVyIGltcG9ydCBUb3BsZXZlbCwgVGV4dAogCi0gICAgcm9vdCA9IFRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IFdpZGdldFJlZGlyZWN0b3IiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKLSAgICB0ZXh0ID0gVGV4dChyb290KQorICAgIHRvcCA9IFRvcGxldmVsKHBhcmVudCkKKyAgICB0b3AudGl0bGUoIlRlc3QgV2lkZ2V0UmVkaXJlY3RvciIpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKKyAgICB0ZXh0ID0gVGV4dCh0b3ApCiAgICAgdGV4dC5wYWNrKCkKICAgICB0ZXh0LmZvY3VzX3NldCgpCiAgICAgcmVkaXIgPSBXaWRnZXRSZWRpcmVjdG9yKHRleHQpCkBAIC0xNjYsMTEgKzE2NSwxMSBAQAogICAgICAgICBwcmludCgiaW5zZXJ0IiwgYXJncykKICAgICAgICAgb3JpZ2luYWxfaW5zZXJ0KCphcmdzKQogICAgIG9yaWdpbmFsX2luc2VydCA9IHJlZGlyLnJlZ2lzdGVyKCJpbnNlcnQiLCBteV9pbnNlcnQpCi0gICAgcm9vdC5tYWlubG9vcCgpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF93aWRnZXRyZWRpcicsCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9yZWRpcmVjdG9yJywKICAgICAgICAgICAgICAgICAgIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKF93aWRnZXRfcmVkaXJlY3RvcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9yZXBsYWNlLnB5CnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3JlcGxhY2UucHkKaW5kZXggZjJlYTIyZS4uN2M5NTczMyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weQorKysgYi9MaWIvaWRsZWxpYi9yZXBsYWNlLnB5CkBAIC0zLDEwICszLDEwIEBACiBEZWZpbmVzIHZhcmlvdXMgcmVwbGFjZSByZWxhdGVkIGZ1bmN0aW9ucyBsaWtlIHJlcGxhY2UsIHJlcGxhY2UgYWxsLAogcmVwbGFjZStmaW5kLgogIiIiCi1mcm9tIHRraW50ZXIgaW1wb3J0ICoKK2Zyb20gdGtpbnRlciBpbXBvcnQgU3RyaW5nVmFyLCBUY2xFcnJvcgogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaEVuZ2luZQotZnJvbSBpZGxlbGliLlNlYXJjaERpYWxvZ0Jhc2UgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UKK2Zyb20gaWRsZWxpYiBpbXBvcnQgc2VhcmNoZW5naW5lCitmcm9tIGlkbGVsaWIuc2VhcmNoYmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQogaW1wb3J0IHJlCiAKIApAQCAtMTQsNyArMTQsNyBAQAogICAgICIiIlJldHVybnMgYSBzaW5nbGV0b24gUmVwbGFjZURpYWxvZyBpbnN0YW5jZS5UaGUgc2luZ2xlIGRpYWxvZwogICAgICBzYXZlcyB1c2VyIGVudHJpZXMgYW5kIHByZWZlcmVuY2VzIGFjcm9zcyBpbnN0YW5jZXMuIiIiCiAgICAgcm9vdCA9IHRleHQuX3Jvb3QoKQotICAgIGVuZ2luZSA9IFNlYXJjaEVuZ2luZS5nZXQocm9vdCkKKyAgICBlbmdpbmUgPSBzZWFyY2hlbmdpbmUuZ2V0KHJvb3QpCiAgICAgaWYgbm90IGhhc2F0dHIoZW5naW5lLCAiX3JlcGxhY2VkaWFsb2ciKToKICAgICAgICAgZW5naW5lLl9yZXBsYWNlZGlhbG9nID0gUmVwbGFjZURpYWxvZyhyb290LCBlbmdpbmUpCiAgICAgZGlhbG9nID0gZW5naW5lLl9yZXBsYWNlZGlhbG9nCkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICAgICAgICAgIHBvcyA9IE5vbmUKICAgICAgICAgaWYgbm90IHBvczoKICAgICAgICAgICAgIGZpcnN0ID0gbGFzdCA9IHBvcyA9IHRleHQuaW5kZXgoImluc2VydCIpCi0gICAgICAgIGxpbmUsIGNvbCA9IFNlYXJjaEVuZ2luZS5nZXRfbGluZV9jb2wocG9zKQorICAgICAgICBsaW5lLCBjb2wgPSBzZWFyY2hlbmdpbmUuZ2V0X2xpbmVfY29sKHBvcykKICAgICAgICAgY2hhcnMgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lLCAiJWQuMCIgJSAobGluZSsxKSkKICAgICAgICAgbSA9IHByb2cubWF0Y2goY2hhcnMsIGNvbCkKICAgICAgICAgaWYgbm90IHByb2c6CkBAIC0yMDQsMTEgKzIwNCwxMyBAQAogCiAKIGRlZiBfcmVwbGFjZV9kaWFsb2cocGFyZW50KTogICMgaHRlc3QgIwotICAgICIiImh0ZXN0IHdyYXBwZXIgZnVuY3Rpb24iIiIKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0CisgICAgZnJvbSB0a2l0ZXIudHRrIGltcG9ydCBCdXR0b24KKwogICAgIGJveCA9IFRvcGxldmVsKHBhcmVudCkKICAgICBib3gudGl0bGUoIlRlc3QgUmVwbGFjZURpYWxvZyIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKIAogICAgICMgbW9jayB1bmRvIGRlbGVnYXRvciBtZXRob2RzCiAgICAgZGVmIHVuZG9fYmxvY2tfc3RhcnQoKToKQEAgLTIzNCw3ICsyMzYsNyBAQAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfcmVwbGFjZWRpYWxvZycsCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9yZXBsYWNlJywKICAgICAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKIAogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUnN0cmlwRXh0ZW5zaW9uLnB5IGIvTGliL2lkbGVsaWIvcnN0cmlwLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3JzdHJpcC5weQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvcnVuLnB5IGIvTGliL2lkbGVsaWIvcnVuLnB5CmluZGV4IDI4Y2U0MjAuLmM3ZWUwYjMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL3J1bi5weQorKysgYi9MaWIvaWRsZWxpYi9ydW4ucHkKQEAgLTEsMjcgKzEsMjcgQEAKLWltcG9ydCBzeXMKK2ltcG9ydCBpbwogaW1wb3J0IGxpbmVjYWNoZQotaW1wb3J0IHRpbWUKLWltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCBxdWV1ZQoraW1wb3J0IHN5cwogaW1wb3J0IF90aHJlYWQgYXMgdGhyZWFkCiBpbXBvcnQgdGhyZWFkaW5nCi1pbXBvcnQgcXVldWUKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCiBpbXBvcnQgdGtpbnRlcgogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IENhbGxUaXBzCi1mcm9tIGlkbGVsaWIgaW1wb3J0IEF1dG9Db21wbGV0ZQorZnJvbSBpZGxlbGliIGltcG9ydCBjYWxsdGlwcworZnJvbSBpZGxlbGliIGltcG9ydCBhdXRvY29tcGxldGUKIAotZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVEZWJ1Z2dlcgotZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVPYmplY3RCcm93c2VyCi1mcm9tIGlkbGVsaWIgaW1wb3J0IFN0YWNrVmlld2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IGRlYnVnZ2VyX3IKK2Zyb20gaWRsZWxpYiBpbXBvcnQgZGVidWdvYmpfcgorZnJvbSBpZGxlbGliIGltcG9ydCBzdGFja3ZpZXdlcgogZnJvbSBpZGxlbGliIGltcG9ydCBycGMKLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAotZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaW9tZW51CiAKIGltcG9ydCBfX21haW5fXwogCiBmb3IgbW9kIGluICgnc2ltcGxlZGlhbG9nJywgJ21lc3NhZ2Vib3gnLCAnZm9udCcsCiAgICAgICAgICAgICAnZGlhbG9nJywgJ2ZpbGVkaWFsb2cnLCAnY29tbW9uZGlhbG9nJywKLSAgICAgICAgICAgICdjb2xvcmNob29zZXInKToKKyAgICAgICAgICAgICd0dGsnKToKICAgICBkZWxhdHRyKHRraW50ZXIsIG1vZCkKICAgICBkZWwgc3lzLm1vZHVsZXNbJ3RraW50ZXIuJyArIG1vZF0KIApAQCAtMjksNiArMjksMTkgQEAKIAogaW1wb3J0IHdhcm5pbmdzCiAKK2RlZiBpZGxlX2Zvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9Tm9uZSk6CisgICAgIiIiRm9ybWF0IHdhcm5pbmdzIHRoZSBJRExFIHdheS4iIiIKKworICAgIHMgPSAiXG5XYXJuaW5nIChmcm9tIHdhcm5pbmdzIG1vZHVsZSk6XG4iCisgICAgcyArPSAnICBGaWxlIFwiJXNcIiwgbGluZSAlc1xuJyAlIChmaWxlbmFtZSwgbGluZW5vKQorICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgIGlmIGxpbmU6CisgICAgICAgIHMgKz0gIiAgICAlc1xuIiAlIGxpbmUKKyAgICBzICs9ICIlczogJXNcbiIgJSAoY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UpCisgICAgcmV0dXJuIHMKKwogZGVmIGlkbGVfc2hvd3dhcm5pbmdfc3VicHJvYygKICAgICAgICAgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKICAgICAiIiJTaG93IElkbGUtZm9ybWF0IHdhcm5pbmcgYWZ0ZXIgcmVwbGFjaW5nIHdhcm5pbmdzLnNob3d3YXJuaW5nLgpAQCAtMzgsNyArNTEsNyBAQAogICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKICAgICB0cnk6Ci0gICAgICAgIGZpbGUud3JpdGUoUHlTaGVsbC5pZGxlX2Zvcm1hdHdhcm5pbmcoCisgICAgICAgIGZpbGUud3JpdGUoaWRsZV9mb3JtYXR3YXJuaW5nKAogICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lKSkKICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgcGFzcyAjIHRoZSBmaWxlIChwcm9iYWJseSBzdGRlcnIpIGlzIGludmFsaWQgLSB0aGlzIHdhcm5pbmcgZ2V0cyBsb3N0LgpAQCAtODgsNyArMTAxLDcgQEAKICAgICBNeUhhbmRsZXIgb2JqZWN0LiAgVGhhdCByZWZlcmVuY2UgaXMgc2F2ZWQgYXMgYXR0cmlidXRlIHJwY2hhbmRsZXIgb2YgdGhlCiAgICAgRXhlY3V0aXZlIGluc3RhbmNlLiAgVGhlIEV4ZWN1dGl2ZSBtZXRob2RzIGhhdmUgYWNjZXNzIHRvIHRoZSByZWZlcmVuY2UgYW5kCiAgICAgY2FuIHBhc3MgaXQgb24gdG8gZW50aXRpZXMgdGhhdCB0aGV5IGNvbW1hbmQKLSAgICAoZS5nLiBSZW1vdGVEZWJ1Z2dlci5EZWJ1Z2dlci5zdGFydF9kZWJ1Z2dlcigpKS4gIFRoZSBsYXR0ZXIsIGluIHR1cm4sIGNhbgorICAgIChlLmcuIGRlYnVnZ2VyX3IuRGVidWdnZXIuc3RhcnRfZGVidWdnZXIoKSkuICBUaGUgbGF0dGVyLCBpbiB0dXJuLCBjYW4KICAgICBjYWxsIE15SGFuZGxlcihTb2NrZXRJTykgcmVnaXN0ZXIvdW5yZWdpc3RlciBtZXRob2RzIHZpYSB0aGUgcmVmZXJlbmNlIHRvCiAgICAgcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgdGhlbXNlbHZlcy4KIApAQCAtMjEwLDcgKzIyMyw3IEBACiAgICAgICAgICAgICB0YmUgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YikKICAgICAgICAgICAgIHByaW50KCdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6JywgZmlsZT1lZmlsZSkKICAgICAgICAgICAgIGV4Y2x1ZGUgPSAoInJ1bi5weSIsICJycGMucHkiLCAidGhyZWFkaW5nLnB5IiwgInF1ZXVlLnB5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlJlbW90ZURlYnVnZ2VyLnB5IiwgImJkYi5weSIpCisgICAgICAgICAgICAgICAgICAgICAgICJkZWJ1Z2dlcl9yLnB5IiwgImJkYi5weSIpCiAgICAgICAgICAgICBjbGVhbnVwX3RyYWNlYmFjayh0YmUsIGV4Y2x1ZGUpCiAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfbGlzdCh0YmUsIGZpbGU9ZWZpbGUpCiAgICAgICAgIGxpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seSh0eXAsIGV4YykKQEAgLTI5Nyw2ICszMTAsOTYgQEAKICAgICAgICAgICAgIHF1aXR0aW5nID0gVHJ1ZQogICAgICAgICAgICAgdGhyZWFkLmludGVycnVwdF9tYWluKCkKIAorCisjIFBzZXVkb2ZpbGVzIGZvciBzaGVsbC1yZW1vdGUgY29tbXVuaWNhdGlvbiAoYWxzbyB1c2VkIGluIHB5c2hlbGwpCisKK2NsYXNzIFBzZXVkb0ZpbGUoaW8uVGV4dElPQmFzZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBzZWxmLnNoZWxsID0gc2hlbGwKKyAgICAgICAgc2VsZi50YWdzID0gdGFncworICAgICAgICBzZWxmLl9lbmNvZGluZyA9IGVuY29kaW5nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGluZworCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAnPCVzPicgJSBzZWxmLnRhZ3MKKworICAgIGRlZiBpc2F0dHkoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgUHNldWRvT3V0cHV0RmlsZShQc2V1ZG9GaWxlKToKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ3cml0ZSB0byBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIHR5cGUocykgaXMgbm90IHN0cjoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIHN0ciwgbm90ICcgKyB0eXBlKHMpLl9fbmFtZV9fKQorICAgICAgICAgICAgIyBTZWUgaXNzdWUgIzE5NDgxCisgICAgICAgICAgICBzID0gc3RyLl9fc3RyX18ocykKKyAgICAgICAgcmV0dXJuIHNlbGYuc2hlbGwud3JpdGUocywgc2VsZi50YWdzKQorCisKK2NsYXNzIFBzZXVkb0lucHV0RmlsZShQc2V1ZG9GaWxlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaGVsbCwgdGFncywgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgIFBzZXVkb0ZpbGUuX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nKQorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzaXplLCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIGludCwgbm90ICcgKyB0eXBlKHNpemUpLl9fbmFtZV9fKQorICAgICAgICByZXN1bHQgPSBzZWxmLl9saW5lX2J1ZmZlcgorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9ICcnCisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdoaWxlIGxlbihyZXN1bHQpIDwgc2l6ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zaGVsbC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGxpbmUKKyAgICAgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gcmVzdWx0W3NpemU6XQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0WzpzaXplXQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2l6ZSA9IC0xCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2l6ZSwgaW50KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBpbnQsIG5vdCAnICsgdHlwZShzaXplKS5fX25hbWVfXykKKyAgICAgICAgbGluZSA9IHNlbGYuX2xpbmVfYnVmZmVyIG9yIHNlbGYuc2hlbGwucmVhZGxpbmUoKQorICAgICAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgICAgIHNpemUgPSBsZW4obGluZSkKKyAgICAgICAgZW9sID0gbGluZS5maW5kKCdcbicsIDAsIHNpemUpCisgICAgICAgIGlmIGVvbCA+PSAwOgorICAgICAgICAgICAgc2l6ZSA9IGVvbCArIDEKKyAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSBsaW5lW3NpemU6XQorICAgICAgICByZXR1cm4gbGluZVs6c2l6ZV0KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zaGVsbC5jbG9zZSgpCisKKwogY2xhc3MgTXlIYW5kbGVyKHJwYy5SUENIYW5kbGVyKToKIAogICAgIGRlZiBoYW5kbGUoc2VsZik6CkBAIC0zMDQsMTIgKzQwNywxMiBAQAogICAgICAgICBleGVjdXRpdmUgPSBFeGVjdXRpdmUoc2VsZikKICAgICAgICAgc2VsZi5yZWdpc3RlcigiZXhlYyIsIGV4ZWN1dGl2ZSkKICAgICAgICAgc2VsZi5jb25zb2xlID0gc2VsZi5nZXRfcmVtb3RlX3Byb3h5KCJjb25zb2xlIikKLSAgICAgICAgc3lzLnN0ZGluID0gUHlTaGVsbC5Qc2V1ZG9JbnB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3RkaW4iLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc3lzLnN0ZG91dCA9IFB5U2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRvdXQiLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKLSAgICAgICAgc3lzLnN0ZGVyciA9IFB5U2hlbGwuUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRlcnIiLAotICAgICAgICAgICAgICAgIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgc3lzLnN0ZGluID0gUHNldWRvSW5wdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZGluIiwKKyAgICAgICAgICAgICAgICBpb21lbnUuZW5jb2RpbmcpCisgICAgICAgIHN5cy5zdGRvdXQgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZG91dCIsCisgICAgICAgICAgICAgICAgaW9tZW51LmVuY29kaW5nKQorICAgICAgICBzeXMuc3RkZXJyID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRlcnIiLAorICAgICAgICAgICAgICAgIGlvbWVudS5lbmNvZGluZykKIAogICAgICAgICBzeXMuZGlzcGxheWhvb2sgPSBycGMuZGlzcGxheWhvb2sKICAgICAgICAgIyBwYWdlIGhlbHAoKSB0ZXh0IHRvIHNoZWxsLgpAQCAtMzQ1LDggKzQ0OCw4IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJwY2hhbmRsZXIpOgogICAgICAgICBzZWxmLnJwY2hhbmRsZXIgPSBycGNoYW5kbGVyCiAgICAgICAgIHNlbGYubG9jYWxzID0gX19tYWluX18uX19kaWN0X18KLSAgICAgICAgc2VsZi5jYWxsdGlwID0gQ2FsbFRpcHMuQ2FsbFRpcHMoKQotICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZSA9IEF1dG9Db21wbGV0ZS5BdXRvQ29tcGxldGUoKQorICAgICAgICBzZWxmLmNhbGx0aXAgPSBjYWxsdGlwcy5DYWxsVGlwcygpCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRlID0gYXV0b2NvbXBsZXRlLkF1dG9Db21wbGV0ZSgpCiAKICAgICBkZWYgcnVuY29kZShzZWxmLCBjb2RlKToKICAgICAgICAgZ2xvYmFsIGludGVycnVwdGFibGUKQEAgLTM3OCw3ICs0ODEsNyBAQAogICAgICAgICAgICAgdGhyZWFkLmludGVycnVwdF9tYWluKCkKIAogICAgIGRlZiBzdGFydF90aGVfZGVidWdnZXIoc2VsZiwgZ3VpX2FkYXBfb2lkKToKLSAgICAgICAgcmV0dXJuIFJlbW90ZURlYnVnZ2VyLnN0YXJ0X2RlYnVnZ2VyKHNlbGYucnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKQorICAgICAgICByZXR1cm4gZGVidWdnZXJfci5zdGFydF9kZWJ1Z2dlcihzZWxmLnJwY2hhbmRsZXIsIGd1aV9hZGFwX29pZCkKIAogICAgIGRlZiBzdG9wX3RoZV9kZWJ1Z2dlcihzZWxmLCBpZGJfYWRhcF9vaWQpOgogICAgICAgICAiVW5yZWdpc3RlciB0aGUgSWRiIEFkYXB0ZXIuICBMaW5rIG9iamVjdHMgYW5kIElkYiB0aGVuIHN1YmplY3QgdG8gR0MiCkBAIC00MDIsNyArNTA1LDcgQEAKICAgICAgICAgICAgIHRiID0gdGIudGJfbmV4dAogICAgICAgICBzeXMubGFzdF90eXBlID0gdHlwCiAgICAgICAgIHN5cy5sYXN0X3ZhbHVlID0gdmFsCi0gICAgICAgIGl0ZW0gPSBTdGFja1ZpZXdlci5TdGFja1RyZWVJdGVtKGZsaXN0LCB0YikKLSAgICAgICAgcmV0dXJuIFJlbW90ZU9iamVjdEJyb3dzZXIucmVtb3RlX29iamVjdF90cmVlX2l0ZW0oaXRlbSkKKyAgICAgICAgaXRlbSA9IHN0YWNrdmlld2VyLlN0YWNrVHJlZUl0ZW0oZmxpc3QsIHRiKQorICAgICAgICByZXR1cm4gZGVidWdvYmpfci5yZW1vdGVfb2JqZWN0X3RyZWVfaXRlbShpdGVtKQogCiBjYXB0dXJlX3dhcm5pbmdzKEZhbHNlKSAgIyBNYWtlIHN1cmUgdHVybmVkIG9mZjsgc2VlIGlzc3VlIDE4MDgxCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5IGIvTGliL2lkbGVsaWIvcnVuc2NyaXB0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3J1bnNjcmlwdC5weQppbmRleCA1Y2I4MThkLi43ZTc1MjRhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CisrKyBiL0xpYi9pZGxlbGliL3J1bnNjcmlwdC5weQpAQCAtMjEsMTAgKzIxLDEwIEBACiBpbXBvcnQgdGFibmFubnkKIGltcG9ydCB0b2tlbml6ZQogaW1wb3J0IHRraW50ZXIubWVzc2FnZWJveCBhcyB0a01lc3NhZ2VCb3gKLWZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAorZnJvbSBpZGxlbGliIGltcG9ydCBweXNoZWxsCiAKLWZyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgotZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0Citmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3gKIAogaW5kZW50X21lc3NhZ2UgPSAiIiJFcnJvcjogSW5jb25zaXN0ZW50IGluZGVudGF0aW9uIGRldGVjdGVkIQogCkBAIC00NiwxMiArNDYsMTIgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKICAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgotICAgICAgICAjIFByb3ZpZGUgaW5zdGFuY2UgdmFyaWFibGVzIHJlZmVyZW5jZWQgYnkgRGVidWdnZXIKKyAgICAgICAgIyBQcm92aWRlIGluc3RhbmNlIHZhcmlhYmxlcyByZWZlcmVuY2VkIGJ5IGRlYnVnZ2VyCiAgICAgICAgICMgWFhYIFRoaXMgc2hvdWxkIGJlIGRvbmUgZGlmZmVyZW50bHkKICAgICAgICAgc2VsZi5mbGlzdCA9IHNlbGYuZWRpdHdpbi5mbGlzdAogICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLmVkaXR3aW4ucm9vdAogCi0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNDb2NvYVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0NvY29hVGsoKToKICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmJpbmQoJzw8cnVuLW1vZHVsZS1ldmVudC0yPj4nLCBzZWxmLl9ydW5fbW9kdWxlX2V2ZW50KQogCiAgICAgZGVmIGNoZWNrX21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6CkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgICAgICAgIHNoZWxsLnNldF93YXJuaW5nX3N0cmVhbShzYXZlZF9zdHJlYW0pCiAKICAgICBkZWYgcnVuX21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6Ci0gICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNDb2NvYVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0NvY29hVGsoKToKICAgICAgICAgICAgICMgVGstQ29jb2EgaW4gTWFjT1NYIGlzIGJyb2tlbiB1bnRpbCBhdCBsZWFzdAogICAgICAgICAgICAgIyBUayA4LjUuOSwgYW5kIHdpdGhvdXQgdGhpcyByYXRoZXIKICAgICAgICAgICAgICMgY3J1ZGUgd29ya2Fyb3VuZCBJRExFIHdvdWxkIGhhbmcgd2hlbiBhIHVzZXIKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgICBpZiBub3Qgc2VsZi50YWJuYW5ueShmaWxlbmFtZSk6CiAgICAgICAgICAgICByZXR1cm4gJ2JyZWFrJwogICAgICAgICBpbnRlcnAgPSBzZWxmLnNoZWxsLmludGVycAotICAgICAgICBpZiBQeVNoZWxsLnVzZV9zdWJwcm9jZXNzOgorICAgICAgICBpZiBweXNoZWxsLnVzZV9zdWJwcm9jZXNzOgogICAgICAgICAgICAgaW50ZXJwLnJlc3RhcnRfc3VicHJvY2Vzcyh3aXRoX2N3ZD1GYWxzZSwgZmlsZW5hbWU9CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXR3aW4uX2ZpbGVuYW1lX3RvX3VuaWNvZGUoZmlsZW5hbWUpKQogICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIGludGVycC5wcmVwZW5kX3N5c3BhdGgoZmlsZW5hbWUpCiAgICAgICAgICMgWFhYIEtCSyAwM0p1bDA0IFdoZW4gcnVuIHcvbyBzdWJwcm9jZXNzLCBydW50aW1lIHdhcm5pbmdzIHN0aWxsCiAgICAgICAgICMgICAgICAgICBnbyB0byBfX3N0ZGVycl9fLiAgV2l0aCBzdWJwcm9jZXNzLCB0aGV5IGdvIHRvIHRoZSBzaGVsbC4KLSAgICAgICAgIyAgICAgICAgIE5lZWQgdG8gY2hhbmdlIHN0cmVhbXMgaW4gUHlTaGVsbC5Nb2RpZmllZEludGVycHJldGVyLgorICAgICAgICAjICAgICAgICAgTmVlZCB0byBjaGFuZ2Ugc3RyZWFtcyBpbiBweXNoZWxsLk1vZGlmaWVkSW50ZXJwcmV0ZXIuCiAgICAgICAgIGludGVycC5ydW5jb2RlKGNvZGUpCiAgICAgICAgIHJldHVybiAnYnJlYWsnCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1Njcm9sbGVkTGlzdC5weSBiL0xpYi9pZGxlbGliL3Njcm9sbGVkbGlzdC5weQpzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9TY3JvbGxlZExpc3QucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3Njcm9sbGVkbGlzdC5weQppbmRleCA1MzU3NmI1Li40Nzk5OTk1IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9TY3JvbGxlZExpc3QucHkKKysrIGIvTGliL2lkbGVsaWIvc2Nyb2xsZWRsaXN0LnB5CkBAIC0xLDUgKzEsNiBAQAogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4Citmcm9tIHRraW50ZXIudHRrIGltcG9ydCBTY3JvbGxiYXIKIAogY2xhc3MgU2Nyb2xsZWRMaXN0OgogCkBAIC0yMyw3ICsyNCw3IEBACiAgICAgICAgICMgQmluZCBldmVudHMgdG8gdGhlIGxpc3QgYm94CiAgICAgICAgIGxpc3Rib3guYmluZCgiPEJ1dHRvblJlbGVhc2UtMT4iLCBzZWxmLmNsaWNrX2V2ZW50KQogICAgICAgICBsaXN0Ym94LmJpbmQoIjxEb3VibGUtQnV0dG9uUmVsZWFzZS0xPiIsIHNlbGYuZG91YmxlX2NsaWNrX2V2ZW50KQotICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LmlzQXF1YVRrKCk6CisgICAgICAgIGlmIG1hY29zeC5pc0FxdWFUaygpOgogICAgICAgICAgICAgbGlzdGJveC5iaW5kKCI8QnV0dG9uUHJlc3MtMj4iLCBzZWxmLnBvcHVwX2V2ZW50KQogICAgICAgICAgICAgbGlzdGJveC5iaW5kKCI8Q29udHJvbC1CdXR0b24tMT4iLCBzZWxmLnBvcHVwX2V2ZW50KQogICAgICAgICBlbHNlOgpAQCAtMTI0LDIyICsxMjUsMjAgQEAKICAgICAgICAgcGFzcwogCiAKLWRlZiBfc2Nyb2xsZWRfbGlzdChwYXJlbnQpOgotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBTY3JvbGxlZExpc3QiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKK2RlZiBfc2Nyb2xsZWRfbGlzdChwYXJlbnQpOiAgIyBodGVzdCAjCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCsyMDAsIHkgKyAxNzUpKQogICAgIGNsYXNzIE15U2Nyb2xsZWRMaXN0KFNjcm9sbGVkTGlzdCk6CiAgICAgICAgIGRlZiBmaWxsX21lbnUoc2VsZik6IHNlbGYubWVudS5hZGRfY29tbWFuZChsYWJlbD0icmlnaHQgY2xpY2siKQogICAgICAgICBkZWYgb25fc2VsZWN0KHNlbGYsIGluZGV4KTogcHJpbnQoInNlbGVjdCIsIHNlbGYuZ2V0KGluZGV4KSkKICAgICAgICAgZGVmIG9uX2RvdWJsZShzZWxmLCBpbmRleCk6IHByaW50KCJkb3VibGUiLCBzZWxmLmdldChpbmRleCkpCiAKLSAgICBzY3JvbGxlZF9saXN0ID0gTXlTY3JvbGxlZExpc3Qocm9vdCkKKyAgICBzY3JvbGxlZF9saXN0ID0gTXlTY3JvbGxlZExpc3QodG9wKQogICAgIGZvciBpIGluIHJhbmdlKDMwKToKICAgICAgICAgc2Nyb2xsZWRfbGlzdC5hcHBlbmQoIkl0ZW0gJTAyZCIgJSBpKQogCi0gICAgcm9vdC5tYWlubG9vcCgpCi0KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIyBBdCB0aGUgbW9tZW50LCB0ZXN0X3Njcm9sbGVkbGlzdCBtZXJlbHkgY3JlYXRlcyBpbnN0YW5jZSwgbGlrZSBodGVzdC4KICAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KICAgICBydW4oX3Njcm9sbGVkX2xpc3QpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9zZWFyY2gucHkKc2ltaWxhcml0eSBpbmRleCA4NCUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zZWFyY2gucHkKaW5kZXggNzY1ZDUzZi4uNGMyYWNlZiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5CisrKyBiL0xpYi9pZGxlbGliL3NlYXJjaC5weQpAQCAtMSwxMiArMSwxMiBAQAotZnJvbSB0a2ludGVyIGltcG9ydCAqCitmcm9tIHRraW50ZXIgaW1wb3J0IFRjbEVycm9yCiAKLWZyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCi1mcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorZnJvbSBpZGxlbGliIGltcG9ydCBzZWFyY2hlbmdpbmUKK2Zyb20gaWRsZWxpYi5zZWFyY2hiYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCiAKIGRlZiBfc2V0dXAodGV4dCk6CiAgICAgIkNyZWF0ZSBvciBmaW5kIHRoZSBzaW5nbGV0b24gU2VhcmNoRGlhbG9nIGluc3RhbmNlLiIKICAgICByb290ID0gdGV4dC5fcm9vdCgpCi0gICAgZW5naW5lID0gU2VhcmNoRW5naW5lLmdldChyb290KQorICAgIGVuZ2luZSA9IHNlYXJjaGVuZ2luZS5nZXQocm9vdCkKICAgICBpZiBub3QgaGFzYXR0cihlbmdpbmUsICJfc2VhcmNoZGlhbG9nIik6CiAgICAgICAgIGVuZ2luZS5fc2VhcmNoZGlhbG9nID0gU2VhcmNoRGlhbG9nKHJvb3QsIGVuZ2luZSkKICAgICByZXR1cm4gZW5naW5lLl9zZWFyY2hkaWFsb2cKQEAgLTcyLDI2ICs3MiwzMCBAQAogCiAKIGRlZiBfc2VhcmNoX2RpYWxvZyhwYXJlbnQpOiAgIyBodGVzdCAjCi0gICAgJycnRGlzcGxheSBzZWFyY2ggdGVzdCBib3guJycnCisgICAgIkRpc3BsYXkgc2VhcmNoIHRlc3QgYm94LiIKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBUZXh0CisgICAgZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgQnV0dG9uCisKICAgICBib3ggPSBUb3BsZXZlbChwYXJlbnQpCiAgICAgYm94LnRpdGxlKCJUZXN0IFNlYXJjaERpYWxvZyIpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIGJveC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKICAgICB0ZXh0ID0gVGV4dChib3gsIGluYWN0aXZlc2VsZWN0YmFja2dyb3VuZD0nZ3JheScpCiAgICAgdGV4dC5wYWNrKCkKICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwiVGhpcyBpcyBhIHNhbXBsZSBzdHJpbmcuXG4iKjUpCiAKICAgICBkZWYgc2hvd19maW5kKCk6Ci0gICAgICAgIHRleHQudGFnX2FkZChTRUwsICIxLjAiLCBFTkQpCisgICAgICAgIHRleHQudGFnX2FkZCgnc2VsJywgJzEuMCcsICdlbmQnKQogICAgICAgICBfc2V0dXAodGV4dCkub3Blbih0ZXh0KQotICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoU0VMLCAiMS4wIiwgRU5EKQorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoJ3NlbCcsICcxLjAnLCAnZW5kJykKIAogICAgIGJ1dHRvbiA9IEJ1dHRvbihib3gsIHRleHQ9IlNlYXJjaCAoc2VsZWN0aW9uIGlnbm9yZWQpIiwgY29tbWFuZD1zaG93X2ZpbmQpCiAgICAgYnV0dG9uLnBhY2soKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGltcG9ydCB1bml0dGVzdAotICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3Rfc2VhcmNoZGlhbG9nJywKKyAgICB1bml0dGVzdC5tYWluKCdpZGxlbGliLmlkbGVfdGVzdC50ZXN0X3NlYXJjaCcsCiAgICAgICAgICAgICAgICAgICB2ZXJib3NpdHk9MiwgZXhpdD1GYWxzZSkKKwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfc2VhcmNoX2RpYWxvZykKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkgYi9MaWIvaWRsZWxpYi9zZWFyY2hiYXNlLnB5CnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3NlYXJjaGJhc2UucHkKaW5kZXggNWZhODRlMi4uY2ZiNDA1MiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weQorKysgYi9MaWIvaWRsZWxpYi9zZWFyY2hiYXNlLnB5CkBAIC0xLDcgKzEsNyBAQAogJycnRGVmaW5lIFNlYXJjaERpYWxvZ0Jhc2UgdXNlZCBieSBTZWFyY2gsIFJlcGxhY2UsIGFuZCBHcmVwIGRpYWxvZ3MuJycnCiAKLWZyb20gdGtpbnRlciBpbXBvcnQgKFRvcGxldmVsLCBGcmFtZSwgRW50cnksIExhYmVsLCBCdXR0b24sCi0gICAgICAgICAgICAgICAgICAgICBDaGVja2J1dHRvbiwgUmFkaW9idXR0b24pCitmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBGcmFtZQorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgRW50cnksIExhYmVsLCBCdXR0b24sIENoZWNrYnV0dG9uLCBSYWRpb2J1dHRvbgogCiBjbGFzcyBTZWFyY2hEaWFsb2dCYXNlOgogICAgICcnJ0NyZWF0ZSBtb3N0IG9mIGEgMyBvciA0IHJvdywgMyBjb2x1bW4gc2VhcmNoIGRpYWxvZy4KQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgIGRlZiBjcmVhdGVfb3B0aW9uX2J1dHRvbnMoc2VsZik6CiAgICAgICAgICcnJ1JldHVybiAoZmlsbGVkIGZyYW1lLCBvcHRpb25zKSBmb3IgdGVzdGluZy4KIAotICAgICAgICBPcHRpb25zIGlzIGEgbGlzdCBvZiBTZWFyY2hFbmdpbmUgYm9vbGVhbnZhciwgbGFiZWwgcGFpcnMuCisgICAgICAgIE9wdGlvbnMgaXMgYSBsaXN0IG9mIHNlYXJjaGVuZ2luZSBib29sZWFudmFyLCBsYWJlbCBwYWlycy4KICAgICAgICAgQSBncmlkZGVkIGZyYW1lIGZyb20gbWFrZV9mcmFtZSBpcyBmaWxsZWQgd2l0aCBhIENoZWNrYnV0dG9uCiAgICAgICAgIGZvciBlYWNoIHBhaXIsIGJvdW5kIHRvIHRoZSB2YXIsIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbGFiZWwuCiAgICAgICAgICcnJwpAQCAtMTM3LDEwICsxMzcsOCBAQAogICAgICAgICBpZiBzZWxmLm5lZWR3cmFwYnV0dG9uOgogICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoKGVuZ2luZS53cmFwdmFyLCAiV3JhcCBhcm91bmQiKSkKICAgICAgICAgZm9yIHZhciwgbGFiZWwgaW4gb3B0aW9uczoKLSAgICAgICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGZyYW1lLCBhbmNob3I9InciLCB2YXJpYWJsZT12YXIsIHRleHQ9bGFiZWwpCisgICAgICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmcmFtZSwgdmFyaWFibGU9dmFyLCB0ZXh0PWxhYmVsKQogICAgICAgICAgICAgYnRuLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiKQotICAgICAgICAgICAgaWYgdmFyLmdldCgpOgotICAgICAgICAgICAgICAgIGJ0bi5zZWxlY3QoKQogICAgICAgICByZXR1cm4gZnJhbWUsIG9wdGlvbnMKIAogICAgIGRlZiBjcmVhdGVfb3RoZXJfYnV0dG9ucyhzZWxmKToKQEAgLTE1MywxMSArMTUxLDggQEAKICAgICAgICAgdmFyID0gc2VsZi5lbmdpbmUuYmFja3ZhcgogICAgICAgICBvdGhlcnMgPSBbKDEsICdVcCcpLCAoMCwgJ0Rvd24nKV0KICAgICAgICAgZm9yIHZhbCwgbGFiZWwgaW4gb3RoZXJzOgotICAgICAgICAgICAgYnRuID0gUmFkaW9idXR0b24oZnJhbWUsIGFuY2hvcj0idyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT12YXIsIHZhbHVlPXZhbCwgdGV4dD1sYWJlbCkKKyAgICAgICAgICAgIGJ0biA9IFJhZGlvYnV0dG9uKGZyYW1lLCB2YXJpYWJsZT12YXIsIHZhbHVlPXZhbCwgdGV4dD1sYWJlbCkKICAgICAgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKLSAgICAgICAgICAgIGlmIHZhci5nZXQoKSA9PSB2YWw6Ci0gICAgICAgICAgICAgICAgYnRuLnNlbGVjdCgpCiAgICAgICAgIHJldHVybiBmcmFtZSwgb3RoZXJzCiAKICAgICBkZWYgbWFrZV9idXR0b24oc2VsZiwgbGFiZWwsIGNvbW1hbmQsIGlzZGVmPTApOgpAQCAtMTc4LDcgKzE3MywyNiBAQAogICAgICAgICBiID0gc2VsZi5tYWtlX2J1dHRvbigiY2xvc2UiLCBzZWxmLmNsb3NlKQogICAgICAgICBiLmxvd2VyKCkKIAorCitjbGFzcyBfc2VhcmNoYmFzZShTZWFyY2hEaWFsb2dCYXNlKTogICMgaHRlc3QgIworICAgICJDcmVhdGUgYXV0by1vcGVuaW5nIGRpYWxvZyB3aXRoIG5vIHRleHQgY29ubmVjdGlvbi4iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50KToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgc2VhcmNoZW5naW5lCisKKyAgICAgICAgc2VsZi5yb290ID0gcGFyZW50CisgICAgICAgIHNlbGYuZW5naW5lID0gc2VhcmNoZW5naW5lLmdldChwYXJlbnQpCisgICAgICAgIHNlbGYuY3JlYXRlX3dpZGdldHMoKQorICAgICAgICBwcmludChwYXJlbnQuZ2VvbWV0cnkoKSkKKyAgICAgICAgd2lkdGgsaGVpZ2h0LCB4LHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKKyAgICAgICAgc2VsZi50b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCArIDQwLCB5ICsgMTc1KSkKKworICAgIGRlZiBkZWZhdWx0X2NvbW1hbmQoc2VsZik6IHBhc3MKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBpbXBvcnQgdW5pdHRlc3QKLSAgICB1bml0dGVzdC5tYWluKAotICAgICAgICAnaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9zZWFyY2hkaWFsb2diYXNlJywgdmVyYm9zaXR5PTIpCisgICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF9zZWFyY2hiYXNlJywgdmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCisKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX3NlYXJjaGJhc2UpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkgYi9MaWIvaWRsZWxpYi9zZWFyY2hlbmdpbmUucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi9zZWFyY2hlbmdpbmUucHkKaW5kZXggMzc4ODNiZi4uMmUzNzAwZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5CisrKyBiL0xpYi9pZGxlbGliL3NlYXJjaGVuZ2luZS5weQpAQCAtNTcsNyArNTcsNyBAQAogCiAgICAgZGVmIHNldGNvb2tlZHBhdChzZWxmLCBwYXQpOgogICAgICAgICAiU2V0IHBhdHRlcm4gYWZ0ZXIgZXNjYXBpbmcgaWYgcmUuIgotICAgICAgICAjIGNhbGxlZCBvbmx5IGluIFNlYXJjaERpYWxvZy5weTogNjYKKyAgICAgICAgIyBjYWxsZWQgb25seSBpbiBzZWFyY2gucHk6IDY2CiAgICAgICAgIGlmIHNlbGYuaXNyZSgpOgogICAgICAgICAgICAgcGF0ID0gcmUuZXNjYXBlKHBhdCkKICAgICAgICAgc2VsZi5zZXRwYXQocGF0KQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvU3RhY2tWaWV3ZXIucHkgYi9MaWIvaWRsZWxpYi9zdGFja3ZpZXdlci5weQpzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9TdGFja1ZpZXdlci5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvc3RhY2t2aWV3ZXIucHkKaW5kZXggY2NjNzU1Yy4uYzhjODAyYyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU3RhY2tWaWV3ZXIucHkKKysrIGIvTGliL2lkbGVsaWIvc3RhY2t2aWV3ZXIucHkKQEAgLTQsOSArNCw4IEBACiBpbXBvcnQgcmUKIGltcG9ydCB0a2ludGVyIGFzIHRrCiAKLWZyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCi1mcm9tIGlkbGVsaWIuT2JqZWN0QnJvd3NlciBpbXBvcnQgT2JqZWN0VHJlZUl0ZW0sIG1ha2Vfb2JqZWN0dHJlZWl0ZW0KLWZyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKK2Zyb20gaWRsZWxpYi50cmVlIGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCitmcm9tIGlkbGVsaWIuZGVidWdvYmogaW1wb3J0IE9iamVjdFRyZWVJdGVtLCBtYWtlX29iamVjdHRyZWVpdGVtCiAKIGRlZiBTdGFja0Jyb3dzZXIocm9vdCwgZmxpc3Q9Tm9uZSwgdGI9Tm9uZSwgdG9wPU5vbmUpOgogICAgIGlmIHRvcCBpcyBOb25lOgpAQCAtMTIwLDE1ICsxMTksMTMgQEAKICAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCiAgICAgICAgIHJldHVybiBzdWJsaXN0CiAKLSAgICBkZWYga2V5cyhzZWxmKTogICMgdW51c2VkLCBsZWZ0IGZvciBwb3NzaWJsZSAzcmQgcGFydHkgdXNlCi0gICAgICAgIHJldHVybiBsaXN0KHNlbGYub2JqZWN0LmtleXMoKSkKLQotZGVmIF9zdGFja192aWV3ZXIocGFyZW50KToKLSAgICByb290ID0gdGsuVGsoKQotICAgIHJvb3QudGl0bGUoIlRlc3QgU3RhY2tWaWV3ZXIiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKLSAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChyb290KQorZGVmIF9zdGFja192aWV3ZXIocGFyZW50KTogICMgaHRlc3QgIworICAgIGZyb20gaWRsZWxpYi5weXNoZWxsIGltcG9ydCBQeVNoZWxsRmlsZUxpc3QKKyAgICB0b3AgPSB0ay5Ub3BsZXZlbChwYXJlbnQpCisgICAgdG9wLnRpdGxlKCJUZXN0IFN0YWNrVmlld2VyIikKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgdG9wLmdlb21ldHJ5KCIrJWQrJWQiICUgKHggKyA1MCwgeSArIDE3NSkpCisgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3QodG9wKQogICAgIHRyeTogIyB0byBvYnRhaW4gYSB0cmFjZWJhY2sgb2JqZWN0CiAgICAgICAgIGludGVudGlvbmFsX25hbWVfZXJyb3IKICAgICBleGNlcHQgTmFtZUVycm9yOgpAQCAtMTM5LDcgKzEzNiw3IEBACiAgICAgc3lzLmxhc3RfdmFsdWUgPSBleGNfdmFsdWUKICAgICBzeXMubGFzdF90cmFjZWJhY2sgPSBleGNfdGIKIAotICAgIFN0YWNrQnJvd3Nlcihyb290LCBmbGlzdD1mbGlzdCwgdG9wPXJvb3QsIHRiPWV4Y190YikKKyAgICBTdGFja0Jyb3dzZXIodG9wLCBmbGlzdD1mbGlzdCwgdG9wPXRvcCwgdGI9ZXhjX3RiKQogCiAgICAgIyByZXN0b3JlIHN5cyB0byBvcmlnaW5hbCBzdGF0ZQogICAgIGRlbCBzeXMubGFzdF90eXBlCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9zdGF0dXNiYXIucHkgYi9MaWIvaWRsZWxpYi9zdGF0dXNiYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1YmZiMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9pZGxlbGliL3N0YXR1c2Jhci5weQpAQCAtMCwwICsxLDQ0IEBACitmcm9tIHRraW50ZXIgaW1wb3J0IEZyYW1lLCBMYWJlbAorCitjbGFzcyBNdWx0aVN0YXR1c0JhcihGcmFtZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKmt3KToKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKmt3KQorICAgICAgICBzZWxmLmxhYmVscyA9IHt9CisKKyAgICBkZWYgc2V0X2xhYmVsKHNlbGYsIG5hbWUsIHRleHQ9JycsIHNpZGU9J2xlZnQnLCB3aWR0aD0wKToKKyAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5sYWJlbHM6CisgICAgICAgICAgICBsYWJlbCA9IExhYmVsKHNlbGYsIGJvcmRlcndpZHRoPTAsIGFuY2hvcj0ndycpCisgICAgICAgICAgICBsYWJlbC5wYWNrKHNpZGU9c2lkZSwgcGFkeT0wLCBwYWR4PTQpCisgICAgICAgICAgICBzZWxmLmxhYmVsc1tuYW1lXSA9IGxhYmVsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYWJlbCA9IHNlbGYubGFiZWxzW25hbWVdCisgICAgICAgIGlmIHdpZHRoICE9IDA6CisgICAgICAgICAgICBsYWJlbC5jb25maWcod2lkdGg9d2lkdGgpCisgICAgICAgIGxhYmVsLmNvbmZpZyh0ZXh0PXRleHQpCisKK2RlZiBfbXVsdGlzdGF0dXNfYmFyKHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICBmcm9tIHRraW50ZXIgaW1wb3J0IFRvcGxldmVsLCBGcmFtZSwgVGV4dCwgQnV0dG9uCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSh4LCB5ICsgMTc1KSkKKyAgICB0b3AudGl0bGUoIlRlc3QgbXVsdGlzdGF0dXMgYmFyIikKKyAgICBmcmFtZSA9IEZyYW1lKHRvcCkKKyAgICB0ZXh0ID0gVGV4dChmcmFtZSwgaGVpZ2h0PTUsIHdpZHRoPTQwKQorICAgIHRleHQucGFjaygpCisgICAgbXNiID0gTXVsdGlTdGF0dXNCYXIoZnJhbWUpCisgICAgbXNiLnNldF9sYWJlbCgib25lIiwgImhlbGxvIikKKyAgICBtc2Iuc2V0X2xhYmVsKCJ0d28iLCAid29ybGQiKQorICAgIG1zYi5wYWNrKHNpZGU9J2JvdHRvbScsIGZpbGw9J3gnKQorCisgICAgZGVmIGNoYW5nZSgpOgorICAgICAgICBtc2Iuc2V0X2xhYmVsKCJvbmUiLCAiZm9vIikKKyAgICAgICAgbXNiLnNldF9sYWJlbCgidHdvIiwgImJhciIpCisKKyAgICBidXR0b24gPSBCdXR0b24odG9wLCB0ZXh0PSJVcGRhdGUgc3RhdHVzIiwgY29tbWFuZD1jaGFuZ2UpCisgICAgYnV0dG9uLnBhY2soc2lkZT0nYm90dG9tJykKKyAgICBmcmFtZS5wYWNrKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmcm9tIGlkbGVsaWIuaWRsZV90ZXN0Lmh0ZXN0IGltcG9ydCBydW4KKyAgICBydW4oX211bHRpc3RhdHVzX2JhcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5IGIvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKaW5kZXggOTY1ZjlmOC4uZWQwNzU4OCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKKysrIGIvTGliL2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKQEAgLTQ2NywzMSArNDY3LDI4IEBACiAKICAgICAgICAgc2VsZi5fdGFiX3NldC5zZXRfc2VsZWN0ZWRfdGFiKHBhZ2VfbmFtZSkKIAotZGVmIF90YWJiZWRfcGFnZXMocGFyZW50KToKLSAgICAjIHRlc3QgZGlhbG9nCi0gICAgcm9vdD1UaygpCi0gICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IGxpc3QobWFwKGludCwgcmUuc3BsaXQoJ1t4K10nLCBwYXJlbnQuZ2VvbWV0cnkoKSkpKQotICAgIHJvb3QuZ2VvbWV0cnkoIislZCslZCIlKHgsIHkgKyAxNzUpKQotICAgIHJvb3QudGl0bGUoIlRlc3QgdGFiYmVkIHBhZ2VzIikKLSAgICB0YWJQYWdlPVRhYmJlZFBhZ2VTZXQocm9vdCwgcGFnZV9uYW1lcz1bJ0Zvb2JhcicsJ0JheiddLCBuX3Jvd3M9MCwKK2RlZiBfdGFiYmVkX3BhZ2VzKHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICB0b3A9VG9wbGV2ZWwocGFyZW50KQorICAgIHgsIHkgPSBtYXAoaW50LCBwYXJlbnQuZ2VvbWV0cnkoKS5zcGxpdCgnKycpWzE6XSkKKyAgICB0b3AuZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSArIDE3NSkpCisgICAgdG9wLnRpdGxlKCJUZXN0IHRhYmJlZCBwYWdlcyIpCisgICAgdGFiUGFnZT1UYWJiZWRQYWdlU2V0KHRvcCwgcGFnZV9uYW1lcz1bJ0Zvb2JhcicsJ0JheiddLCBuX3Jvd3M9MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3RhYnM9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICB0YWJQYWdlLnBhY2soc2lkZT1UT1AsIGV4cGFuZD1UUlVFLCBmaWxsPUJPVEgpCiAgICAgTGFiZWwodGFiUGFnZS5wYWdlc1snRm9vYmFyJ10uZnJhbWUsIHRleHQ9J0ZvbycsIHBhZHk9MjApLnBhY2soKQogICAgIExhYmVsKHRhYlBhZ2UucGFnZXNbJ0Zvb2JhciddLmZyYW1lLCB0ZXh0PSdCYXInLCBwYWR5PTIwKS5wYWNrKCkKICAgICBMYWJlbCh0YWJQYWdlLnBhZ2VzWydCYXonXS5mcmFtZSwgdGV4dD0nQmF6JykucGFjaygpCi0gICAgZW50cnlQZ05hbWU9RW50cnkocm9vdCkKLSAgICBidXR0b25BZGQ9QnV0dG9uKHJvb3QsIHRleHQ9J0FkZCBQYWdlJywKKyAgICBlbnRyeVBnTmFtZT1FbnRyeSh0b3ApCisgICAgYnV0dG9uQWRkPUJ1dHRvbih0b3AsIHRleHQ9J0FkZCBQYWdlJywKICAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhOnRhYlBhZ2UuYWRkX3BhZ2UoZW50cnlQZ05hbWUuZ2V0KCkpKQotICAgIGJ1dHRvblJlbW92ZT1CdXR0b24ocm9vdCwgdGV4dD0nUmVtb3ZlIFBhZ2UnLAorICAgIGJ1dHRvblJlbW92ZT1CdXR0b24odG9wLCB0ZXh0PSdSZW1vdmUgUGFnZScsCiAgICAgICAgICAgICBjb21tYW5kPWxhbWJkYTp0YWJQYWdlLnJlbW92ZV9wYWdlKGVudHJ5UGdOYW1lLmdldCgpKSkKLSAgICBsYWJlbFBnTmFtZT1MYWJlbChyb290LCB0ZXh0PSduYW1lIG9mIHBhZ2UgdG8gYWRkL3JlbW92ZTonKQorICAgIGxhYmVsUGdOYW1lPUxhYmVsKHRvcCwgdGV4dD0nbmFtZSBvZiBwYWdlIHRvIGFkZC9yZW1vdmU6JykKICAgICBidXR0b25BZGQucGFjayhwYWR4PTUsIHBhZHk9NSkKICAgICBidXR0b25SZW1vdmUucGFjayhwYWR4PTUsIHBhZHk9NSkKICAgICBsYWJlbFBnTmFtZS5wYWNrKHBhZHg9NSkKICAgICBlbnRyeVBnTmFtZS5wYWNrKHBhZHg9NSkKLSAgICByb290Lm1haW5sb29wKCkKLQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvdGV4dFZpZXcucHkgYi9MaWIvaWRsZWxpYi90ZXh0dmlldy5weQpzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi90ZXh0Vmlldy5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvdGV4dHZpZXcucHkKaW5kZXggMTJhYzMxOS4uNzY2NDUyNCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvdGV4dFZpZXcucHkKKysrIGIvTGliL2lkbGVsaWIvdGV4dHZpZXcucHkKQEAgLTMsNyArMyw4IEBACiAiIiIKIAogZnJvbSB0a2ludGVyIGltcG9ydCAqCi1pbXBvcnQgdGtpbnRlci5tZXNzYWdlYm94IGFzIHRrTWVzc2FnZUJveAorZnJvbSB0a2ludGVyLnR0ayBpbXBvcnQgU2Nyb2xsYmFyCitmcm9tIHRraW50ZXIubWVzc2FnZWJveCBpbXBvcnQgc2hvd2Vycm9yCiAKIGNsYXNzIFRleHRWaWV3ZXIoVG9wbGV2ZWwpOgogICAgICIiIkEgc2ltcGxlIHRleHQgdmlld2VyIGRpYWxvZyBmb3IgSURMRQpAQCAtNTAsNyArNTEsNyBAQAogICAgICAgICBzZWxmLmJ1dHRvbk9rID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5PaywgdGFrZWZvY3VzPUZBTFNFKQogICAgICAgICBzZWxmLnNjcm9sbGJhclZpZXcgPSBTY3JvbGxiYXIoZnJhbWVUZXh0LCBvcmllbnQ9VkVSVElDQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlZm9jdXM9RkFMU0UsIGhpZ2hsaWdodHRoaWNrbmVzcz0wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZWZvY3VzPUZBTFNFKQogICAgICAgICBzZWxmLnRleHRWaWV3ID0gVGV4dChmcmFtZVRleHQsIHdyYXA9V09SRCwgaGlnaGxpZ2h0dGhpY2tuZXNzPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCiAgICAgICAgIHNlbGYuc2Nyb2xsYmFyVmlldy5jb25maWcoY29tbWFuZD1zZWxmLnRleHRWaWV3Lnl2aWV3KQpAQCAtNzIsMTQgKzczLDE0IEBACiAgICAgdHJ5OgogICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyJywgZW5jb2Rpbmc9ZW5jb2RpbmcpIGFzIGZpbGU6CiAgICAgICAgICAgICBjb250ZW50cyA9IGZpbGUucmVhZCgpCi0gICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0ZpbGUgTG9hZCBFcnJvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVW5hYmxlIHRvIGxvYWQgZmlsZSAlciAuJyAlIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHNob3dlcnJvcih0aXRsZT0nRmlsZSBMb2FkIEVycm9yJywKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1VuYWJsZSB0byBsb2FkIGZpbGUgJXIgLicgJSBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCiAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciBhcyBlcnI6Ci0gICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J1VuaWNvZGUgRGVjb2RlIEVycm9yJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPXN0cihlcnIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCisgICAgICAgIHNob3dlcnJvcih0aXRsZT0nVW5pY29kZSBEZWNvZGUgRXJyb3InLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZT1zdHIoZXJyKSwKKyAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCiAgICAgZWxzZToKICAgICAgICAgcmV0dXJuIHZpZXdfdGV4dChwYXJlbnQsIHRpdGxlLCBjb250ZW50cywgbW9kYWwpCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1Rvb2xUaXAucHkgYi9MaWIvaWRsZWxpYi90b29sdGlwLnB5CnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIExpYi9pZGxlbGliL1Rvb2xUaXAucHkKcmVuYW1lIHRvIExpYi9pZGxlbGliL3Rvb2x0aXAucHkKaW5kZXggOTY0MTA3ZS4uODQzZmI0YSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvVG9vbFRpcC5weQorKysgYi9MaWIvaWRsZWxpYi90b29sdGlwLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBnZW5lcmFsIHB1cnBvc2UgJ3Rvb2x0aXAnIHJvdXRpbmVzIC0gY3VycmVudGx5IHVudXNlZCBpbiBpZGxlZm9yaworIyBnZW5lcmFsIHB1cnBvc2UgJ3Rvb2x0aXAnIHJvdXRpbmVzIC0gY3VycmVudGx5IHVudXNlZCBpbiBpZGxlbGliCiAjIChhbHRob3VnaCB0aGUgJ2NhbGx0aXBzJyBleHRlbnNpb24gaXMgcGFydGx5IGJhc2VkIG9uIHRoaXMgY29kZSkKICMgbWF5IGJlIHVzZWZ1bCBmb3Igc29tZSBwdXJwb3NlcyBpbiAob3IgYWxtb3N0IGluIDspIHRoZSBjdXJyZW50IHByb2plY3Qgc2NvcGUKICMgSWRlYXMgZ2xlYW5lZCBmcm9tIFB5U29sCkBAIC03NiwyMSArNzYsMjAgQEAKICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5pdGVtczoKICAgICAgICAgICAgIGxpc3Rib3guaW5zZXJ0KEVORCwgaXRlbSkKIAotZGVmIF90b29sdGlwKHBhcmVudCk6Ci0gICAgcm9vdCA9IFRrKCkKLSAgICByb290LnRpdGxlKCJUZXN0IHRvb2x0aXAiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICByb290Lmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKLSAgICBsYWJlbCA9IExhYmVsKHJvb3QsIHRleHQ9IlBsYWNlIHlvdXIgbW91c2Ugb3ZlciBidXR0b25zIikKK2RlZiBfdG9vbHRpcChwYXJlbnQpOiAgIyBodGVzdCAjCisgICAgdG9wID0gVG9wbGV2ZWwocGFyZW50KQorICAgIHRvcC50aXRsZSgiVGVzdCB0b29sdGlwIikKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgdG9wLmdlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkgKyAxNTApKQorICAgIGxhYmVsID0gTGFiZWwodG9wLCB0ZXh0PSJQbGFjZSB5b3VyIG1vdXNlIG92ZXIgYnV0dG9ucyIpCiAgICAgbGFiZWwucGFjaygpCi0gICAgYnV0dG9uMSA9IEJ1dHRvbihyb290LCB0ZXh0PSJCdXR0b24gMSIpCi0gICAgYnV0dG9uMiA9IEJ1dHRvbihyb290LCB0ZXh0PSJCdXR0b24gMiIpCisgICAgYnV0dG9uMSA9IEJ1dHRvbih0b3AsIHRleHQ9IkJ1dHRvbiAxIikKKyAgICBidXR0b24yID0gQnV0dG9uKHRvcCwgdGV4dD0iQnV0dG9uIDIiKQogICAgIGJ1dHRvbjEucGFjaygpCiAgICAgYnV0dG9uMi5wYWNrKCkKICAgICBUb29sVGlwKGJ1dHRvbjEsICJUaGlzIGlzIHRvb2x0aXAgdGV4dCBmb3IgYnV0dG9uMS4iKQogICAgIExpc3Rib3hUb29sVGlwKGJ1dHRvbjIsIFsiVGhpcyBpcyIsIm11bHRpcGxlIGxpbmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b29sdGlwIHRleHQiLCJmb3IgYnV0dG9uMiJdKQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvVHJlZVdpZGdldC5weSBiL0xpYi9pZGxlbGliL3RyZWUucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2lkbGVsaWIvVHJlZVdpZGdldC5weQpyZW5hbWUgdG8gTGliL2lkbGVsaWIvdHJlZS5weQppbmRleCBhMTk1NzhmLi4wNGUwNzM0IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5CisrKyBiL0xpYi9pZGxlbGliL3RyZWUucHkKQEAgLTE2LDkgKzE2LDkgQEAKIAogaW1wb3J0IG9zCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLQotZnJvbSBpZGxlbGliIGltcG9ydCBab29tSGVpZ2h0Ci1mcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gdGtpbnRlci50dGsgaW1wb3J0IFNjcm9sbGJhcgorZnJvbSBpZGxlbGliIGltcG9ydCB6b29taGVpZ2h0Citmcm9tIGlkbGVsaWIuY29uZmlnIGltcG9ydCBpZGxlQ29uZgogCiBJQ09ORElSID0gIkljb25zIgogCkBAIC00NDUsMjIgKzQ0NSwyMSBAQAogICAgICAgICBzZWxmLmNhbnZhcy55dmlld19zY3JvbGwoMSwgInVuaXQiKQogICAgICAgICByZXR1cm4gImJyZWFrIgogICAgIGRlZiB6b29tX2hlaWdodChzZWxmLCBldmVudCk6Ci0gICAgICAgIFpvb21IZWlnaHQuem9vbV9oZWlnaHQoc2VsZi5tYXN0ZXIpCisgICAgICAgIHpvb21oZWlnaHQuem9vbV9oZWlnaHQoc2VsZi5tYXN0ZXIpCiAgICAgICAgIHJldHVybiAiYnJlYWsiCiAKIAotZGVmIF90cmVlX3dpZGdldChwYXJlbnQpOgotICAgIHJvb3QgPSBUaygpCi0gICAgcm9vdC50aXRsZSgiVGVzdCBUcmVlV2lkZ2V0IikKLSAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbGlzdChtYXAoaW50LCByZS5zcGxpdCgnW3grXScsIHBhcmVudC5nZW9tZXRyeSgpKSkpCi0gICAgcm9vdC5nZW9tZXRyeSgiKyVkKyVkIiUoeCwgeSArIDE1MCkpCi0gICAgc2MgPSBTY3JvbGxlZENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCitkZWYgX3RyZWVfd2lkZ2V0KHBhcmVudCk6ICAjIGh0ZXN0ICMKKyAgICB0b3AgPSBUb3BsZXZlbChwYXJlbnQpCisgICAgeCwgeSA9IG1hcChpbnQsIHBhcmVudC5nZW9tZXRyeSgpLnNwbGl0KCcrJylbMTpdKQorICAgIHRvcC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4KzUwLCB5KzE3NSkpCisgICAgc2MgPSBTY3JvbGxlZENhbnZhcyh0b3AsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKICAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIiwgc2lkZT1MRUZUKQotICAgIGl0ZW0gPSBGaWxlVHJlZUl0ZW0ob3MuZ2V0Y3dkKCkpCisgICAgaXRlbSA9IEZpbGVUcmVlSXRlbShJQ09ORElSKQogICAgIG5vZGUgPSBUcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCiAgICAgbm9kZS5leHBhbmQoKQotICAgIHJvb3QubWFpbmxvb3AoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgdGVzdF90cmVlIGlzIGN1cnJlbnRseSBhIGNvcHkgb2YgdGhpcwogICAgIGZyb20gaWRsZWxpYi5pZGxlX3Rlc3QuaHRlc3QgaW1wb3J0IHJ1bgogICAgIHJ1bihfdHJlZV93aWRnZXQpCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5IGIvTGliL2lkbGVsaWIvdW5kby5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi91bmRvLnB5CmluZGV4IDFjMjUwMmQuLjlmMjkxZTUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHkKKysrIGIvTGliL2lkbGVsaWIvdW5kby5weQpAQCAtMSw3ICsxLDcgQEAKIGltcG9ydCBzdHJpbmcKLWZyb20gdGtpbnRlciBpbXBvcnQgKgotCi1mcm9tIGlkbGVsaWIuRGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5kZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorIyB0a2ludHRlciBpbXBvcnQgbm90IG5lZWRlZCBiZWNhdXNlIG1vZHVsZSBkb2VzIG5vdCBjcmVhdGUgd2lkZ2V0cywKKyMgYWx0aG91Z2ggbWFueSBtZXRob2RzIG9wZXJhdGUgb24gdGV4dCB3aWRnZXQgYXJndW1lbnRzLgogCiAjJCBldmVudCA8PHJlZG8+PgogIyQgd2luIDxDb250cm9sLXk+CkBAIC0zMzgsMTMgKzMzOCwxMiBAQAogCiAKIGRlZiBfdW5kb19kZWxlZ2F0b3IocGFyZW50KTogICMgaHRlc3QgIwotICAgIGltcG9ydCByZQotICAgIGltcG9ydCB0a2ludGVyIGFzIHRrCi0gICAgZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKLSAgICB1bmRvd2luID0gdGsuVG9wbGV2ZWwoKQorICAgIGZyb20gdGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwsIFRleHQsIEJ1dHRvbgorICAgIGZyb20gaWRsZWxpYi5wZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCisgICAgdW5kb3dpbiA9IFRvcGxldmVsKHBhcmVudCkKICAgICB1bmRvd2luLnRpdGxlKCJUZXN0IFVuZG9EZWxlZ2F0b3IiKQotICAgIHdpZHRoLCBoZWlnaHQsIHgsIHkgPSBsaXN0KG1hcChpbnQsIHJlLnNwbGl0KCdbeCtdJywgcGFyZW50Lmdlb21ldHJ5KCkpKSkKLSAgICB1bmRvd2luLmdlb21ldHJ5KCIrJWQrJWQiJSh4LCB5ICsgMTUwKSkKKyAgICB4LCB5ID0gbWFwKGludCwgcGFyZW50Lmdlb21ldHJ5KCkuc3BsaXQoJysnKVsxOl0pCisgICAgdW5kb3dpbi5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5ICsgMTc1KSkKIAogICAgIHRleHQgPSBUZXh0KHVuZG93aW4sIGhlaWdodD0xMCkKICAgICB0ZXh0LnBhY2soKQpAQCAtMzYyLDcgKzM2MSw3IEBACiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgaW1wb3J0IHVuaXR0ZXN0Ci0gICAgdW5pdHRlc3QubWFpbignaWRsZWxpYi5pZGxlX3Rlc3QudGVzdF91bmRvZGVsZWdhdG9yJywgdmVyYm9zaXR5PTIsCi0gICAgICAgICAgICAgICAgICBleGl0PUZhbHNlKQorICAgIHVuaXR0ZXN0Lm1haW4oJ2lkbGVsaWIuaWRsZV90ZXN0LnRlc3RfdW5kbycsIHZlcmJvc2l0eT0yLCBleGl0PUZhbHNlKQorCiAgICAgZnJvbSBpZGxlbGliLmlkbGVfdGVzdC5odGVzdCBpbXBvcnQgcnVuCiAgICAgcnVuKF91bmRvX2RlbGVnYXRvcikKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1dpbmRvd0xpc3QucHkgYi9MaWIvaWRsZWxpYi93aW5kb3dzLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9XaW5kb3dMaXN0LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi93aW5kb3dzLnB5CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5IGIvTGliL2lkbGVsaWIvem9vbWhlaWdodC5weQpzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBMaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5CnJlbmFtZSB0byBMaWIvaWRsZWxpYi96b29taGVpZ2h0LnB5CmluZGV4IGE1ZDY3OWUuLjAwMTZlOWQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkKKysrIGIvTGliL2lkbGVsaWIvem9vbWhlaWdodC5weQpAQCAtMyw3ICszLDcgQEAKIGltcG9ydCByZQogaW1wb3J0IHN5cwogCi1mcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4CiAKIGNsYXNzIFpvb21IZWlnaHQ6CiAKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgICAgbmV3eSA9IDAKICAgICAgICAgbmV3aGVpZ2h0ID0gbmV3aGVpZ2h0IC0gNzIKIAotICAgIGVsaWYgbWFjb3N4U3VwcG9ydC5pc0FxdWFUaygpOgorICAgIGVsaWYgbWFjb3N4LmlzQXF1YVRrKCk6CiAgICAgICAgICMgVGhlICc4OCcgYmVsb3cgaXMgYSBtYWdpYyBudW1iZXIgdGhhdCBhdm9pZHMgcGxhY2luZyB0aGUgYm90dG9tCiAgICAgICAgICMgb2YgdGhlIHdpbmRvdyBiZWxvdyB0aGUgcGFuZWwgb24gbXkgbWFjaGluZS4gSSBkb24ndCBrbm93IGhvdwogICAgICAgICAjIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhpcyB3aXRoIHRraW50ZXIuCmRpZmYgLS1naXQgYS9MaWIvaW1hcGxpYi5weSBiL0xpYi9pbWFwbGliLnB5CmluZGV4IDRlOGE0YmIuLmE2M2JhOGQgMTAwNjQ0Ci0tLSBhL0xpYi9pbWFwbGliLnB5CisrKyBiL0xpYi9pbWFwbGliLnB5CkBAIC0xMTEsNyArMTExLDE1IEBACiAjIExpdGVyYWwgaXMgbm8gbG9uZ2VyIHVzZWQ7IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiBMaXRlcmFsID0gcmUuY29tcGlsZShicicuKnsoP1A8c2l6ZT5cZCspfSQnLCByZS5BU0NJSSkKIE1hcENSTEYgPSByZS5jb21waWxlKGJyJ1xyXG58XHJ8XG4nKQotUmVzcG9uc2VfY29kZSA9IHJlLmNvbXBpbGUoYnInXFsoP1A8dHlwZT5bQS1aLV0rKSggKD9QPGRhdGE+W15cXV0qKSk/XF0nKQorIyBXZSBubyBsb25nZXIgZXhjbHVkZSB0aGUgJ10nIGNoYXJhY3RlciBmcm9tIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIHJlc3BvbnNlCisjIGNvZGUsIGV2ZW4gdGhvdWdoIGl0IHZpb2xhdGVzIHRoZSBSRkMuICBQb3B1bGFyIElNQVAgc2VydmVycyBzdWNoIGFzIEdtYWlsCisjIGFsbG93IGZsYWdzIHdpdGggJ10nLCBhbmQgdGhlcmUgYXJlIHByb2dyYW1zIChpbmNsdWRpbmcgaW1hcGxpYiEpIHRoYXQgY2FuCisjIHByb2R1Y2UgdGhlbS4gIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyBpZiB0aGUgJ3RleHQnIHBvcnRpb24gb2YgdGhlIHJlc3BvbnNlCisjIGluY2x1ZGVzIGEgJ10nIHdlJ2xsIHBhcnNlIHRoZSByZXNwb25zZSB3cm9uZyAod2hpY2ggaXMgdGhlIHBvaW50IG9mIHRoZSBSRkMKKyMgcmVzdHJpY3Rpb24pLiAgSG93ZXZlciwgdGhhdCBzZWVtcyBsZXNzIGxpa2VseSB0byBiZSBhIHByb2JsZW0gaW4gcHJhY3RpY2UKKyMgdGhhbiBiZWluZyB1bmFibGUgdG8gY29ycmVjdGx5IHBhcnNlIGZsYWdzIHRoYXQgaW5jbHVkZSAnXScgY2hhcnMsIHdoaWNoCisjIHdhcyByZXBvcnRlZCBhcyBhIHJlYWwtd29ybGQgcHJvYmxlbSBpbiBpc3N1ZSAjMjE4MTUuCitSZXNwb25zZV9jb2RlID0gcmUuY29tcGlsZShicidcWyg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT4uKikpP1xdJykKIFVudGFnZ2VkX3Jlc3BvbnNlID0gcmUuY29tcGlsZShicidcKiAoP1A8dHlwZT5bQS1aLV0rKSggKD9QPGRhdGE+LiopKT8nKQogIyBVbnRhZ2dlZF9zdGF0dXMgaXMgbm8gbG9uZ2VyIHVzZWQ7IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKIFVudGFnZ2VkX3N0YXR1cyA9IHJlLmNvbXBpbGUoCmRpZmYgLS1naXQgYS9MaWIvaW1wLnB5IGIvTGliL2ltcC5weQppbmRleCBlMjY0MzkxLi43ODFmZjIzIDEwMDY0NAotLS0gYS9MaWIvaW1wLnB5CisrKyBiL0xpYi9pbXAucHkKQEAgLTMwLDcgKzMwLDcgQEAKIAogd2FybmluZ3Mud2FybigidGhlIGltcCBtb2R1bGUgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaW1wb3J0bGliOyAiCiAgICAgICAgICAgICAgICJzZWUgdGhlIG1vZHVsZSdzIGRvY3VtZW50YXRpb24gZm9yIGFsdGVybmF0aXZlIHVzZXMiLAotICAgICAgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogCiAjIERFUFJFQ0FURUQKIFNFQVJDSF9FUlJPUiA9IDAKZGlmZiAtLWdpdCBhL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcC5weSBiL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcC5weQppbmRleCA5ZWVjYmZlLi4xMWRmNzA2IDEwMDY0NAotLS0gYS9MaWIvaW1wb3J0bGliL19ib290c3RyYXAucHkKKysrIGIvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwLnB5CkBAIC0yNzAsNyArMjcwLDcgQEAKICMgTW9kdWxlIHNwZWNpZmljYXRpb25zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogZGVmIF9tb2R1bGVfcmVwcihtb2R1bGUpOgotICAgICMgVGhlIGltcGxlbWVudGF0aW9uIG9mIE1vZHVsZVR5cGVfX3JlcHJfXygpLgorICAgICMgVGhlIGltcGxlbWVudGF0aW9uIG9mIE1vZHVsZVR5cGUuX19yZXByX18oKS4KICAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgIGlmIGhhc2F0dHIobG9hZGVyLCAnbW9kdWxlX3JlcHInKToKICAgICAgICAgIyBBcyBzb29uIGFzIEJ1aWx0aW5JbXBvcnRlciwgRnJvemVuSW1wb3J0ZXIsIGFuZCBOYW1lc3BhY2VMb2FkZXIKQEAgLTYwMyw3ICs2MDMsNyBAQAogCiAjIFVzZWQgYnkgaW1wb3J0bGliLnJlbG9hZCgpIGFuZCBfbG9hZF9tb2R1bGVfc2hpbSgpLgogZGVmIF9leGVjKHNwZWMsIG1vZHVsZSk6Ci0gICAgIiIiRXhlY3V0ZSB0aGUgc3BlYyBpbiBhbiBleGlzdGluZyBtb2R1bGUncyBuYW1lc3BhY2UuIiIiCisgICAgIiIiRXhlY3V0ZSB0aGUgc3BlYydzIHNwZWNpZmllZCBtb2R1bGUgaW4gYW4gZXhpc3RpbmcgbW9kdWxlJ3MgbmFtZXNwYWNlLiIiIgogICAgIG5hbWUgPSBzcGVjLm5hbWUKICAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICAgd2l0aCBfTW9kdWxlTG9ja01hbmFnZXIobmFtZSk6CkBAIC04NzcsMTQgKzg3NywyMSBAQAogCiAKIGRlZiBfZmluZF9zcGVjKG5hbWUsIHBhdGgsIHRhcmdldD1Ob25lKToKLSAgICAiIiJGaW5kIGEgbW9kdWxlJ3MgbG9hZGVyLiIiIgotICAgIGlmIHN5cy5tZXRhX3BhdGggaXMgbm90IE5vbmUgYW5kIG5vdCBzeXMubWV0YV9wYXRoOgorICAgICIiIkZpbmQgYSBtb2R1bGUncyBzcGVjLiIiIgorICAgIG1ldGFfcGF0aCA9IHN5cy5tZXRhX3BhdGgKKyAgICBpZiBtZXRhX3BhdGggaXMgTm9uZToKKyAgICAgICAgIyBQeUltcG9ydF9DbGVhbnVwKCkgaXMgcnVubmluZyBvciBoYXMgYmVlbiBjYWxsZWQuCisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJzeXMubWV0YV9wYXRoIGlzIE5vbmUsIFB5dGhvbiBpcyBsaWtlbHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAic2h1dHRpbmcgZG93biIpCisKKyAgICBpZiBub3QgbWV0YV9wYXRoOgogICAgICAgICBfd2FybmluZ3Mud2Fybignc3lzLm1ldGFfcGF0aCBpcyBlbXB0eScsIEltcG9ydFdhcm5pbmcpCisKICAgICAjIFdlIGNoZWNrIHN5cy5tb2R1bGVzIGhlcmUgZm9yIHRoZSByZWxvYWQgY2FzZS4gIFdoaWxlIGEgcGFzc2VkLWluCiAgICAgIyB0YXJnZXQgd2lsbCB1c3VhbGx5IGluZGljYXRlIGEgcmVsb2FkIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSwgd2hlcmVhcwogICAgICMgc3lzLm1vZHVsZXMgcHJvdmlkZXMgb25lLgogICAgIGlzX3JlbG9hZCA9IG5hbWUgaW4gc3lzLm1vZHVsZXMKLSAgICBmb3IgZmluZGVyIGluIHN5cy5tZXRhX3BhdGg6CisgICAgZm9yIGZpbmRlciBpbiBtZXRhX3BhdGg6CiAgICAgICAgIHdpdGggX0ltcG9ydExvY2tDb250ZXh0KCk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgZmluZF9zcGVjID0gZmluZGVyLmZpbmRfc3BlYwpAQCAtOTI1LDYgKzkzMiw5IEBACiAgICAgaWYgbGV2ZWwgPiAwOgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWNrYWdlLCBzdHIpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdfX3BhY2thZ2VfXyBub3Qgc2V0IHRvIGEgc3RyaW5nJykKKyAgICAgICAgZWxpZiBub3QgcGFja2FnZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCdhdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IHdpdGggbm8ga25vd24gcGFyZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYWNrYWdlJykKICAgICAgICAgZWxpZiBwYWNrYWdlIG5vdCBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgIG1zZyA9ICgnUGFyZW50IG1vZHVsZSB7IXJ9IG5vdCBsb2FkZWQsIGNhbm5vdCBwZXJmb3JtIHJlbGF0aXZlICcKICAgICAgICAgICAgICAgICAgICAnaW1wb3J0JykKQEAgLTEwMzMsNyArMTA0MywxOSBAQAogCiAgICAgIiIiCiAgICAgcGFja2FnZSA9IGdsb2JhbHMuZ2V0KCdfX3BhY2thZ2VfXycpCi0gICAgaWYgcGFja2FnZSBpcyBOb25lOgorICAgIHNwZWMgPSBnbG9iYWxzLmdldCgnX19zcGVjX18nKQorICAgIGlmIHBhY2thZ2UgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHNwZWMgaXMgbm90IE5vbmUgYW5kIHBhY2thZ2UgIT0gc3BlYy5wYXJlbnQ6CisgICAgICAgICAgICBfd2FybmluZ3Mud2FybigiX19wYWNrYWdlX18gIT0gX19zcGVjX18ucGFyZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGYiKHtwYWNrYWdlIXJ9ICE9IHtzcGVjLnBhcmVudCFyfSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0V2FybmluZywgc3RhY2tsZXZlbD0zKQorICAgICAgICByZXR1cm4gcGFja2FnZQorICAgIGVsaWYgc3BlYyBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHNwZWMucGFyZW50CisgICAgZWxzZToKKyAgICAgICAgX3dhcm5pbmdzLndhcm4oImNhbid0IHJlc29sdmUgcGFja2FnZSBmcm9tIF9fc3BlY19fIG9yIF9fcGFja2FnZV9fLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJmYWxsaW5nIGJhY2sgb24gX19uYW1lX18gYW5kIF9fcGF0aF9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0V2FybmluZywgc3RhY2tsZXZlbD0zKQogICAgICAgICBwYWNrYWdlID0gZ2xvYmFsc1snX19uYW1lX18nXQogICAgICAgICBpZiAnX19wYXRoX18nIG5vdCBpbiBnbG9iYWxzOgogICAgICAgICAgICAgcGFja2FnZSA9IHBhY2thZ2UucnBhcnRpdGlvbignLicpWzBdCmRpZmYgLS1naXQgYS9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkgYi9MaWIvaW1wb3J0bGliL19ib290c3RyYXBfZXh0ZXJuYWwucHkKaW5kZXggZTU0ZDY5MS4uNDZmMWJhYiAxMDA2NDQKLS0tIGEvTGliL2ltcG9ydGxpYi9fYm9vdHN0cmFwX2V4dGVybmFsLnB5CisrKyBiL0xpYi9pbXBvcnRsaWIvX2Jvb3RzdHJhcF9leHRlcm5hbC5weQpAQCAtMTM3LDEwICsxMzcsNiBAQAogIyBhIC5weWMgZmlsZSBpbiB0ZXh0IG1vZGUgdGhlIG1hZ2ljIG51bWJlciB3aWxsIGJlIHdyb25nOyBhbHNvLCB0aGUKICMgQXBwbGUgTVBXIGNvbXBpbGVyIHN3YXBzIHRoZWlyIHZhbHVlcywgYm90Y2hpbmcgc3RyaW5nIGNvbnN0YW50cy4KICMKLSMgVGhlIG1hZ2ljIG51bWJlcnMgbXVzdCBiZSBzcGFjZWQgYXBhcnQgYXQgbGVhc3QgMiB2YWx1ZXMsIGFzIHRoZQotIyAtVSBpbnRlcnBldGVyIGZsYWcgd2lsbCBjYXVzZSBNQUdJQysxIGJlaW5nIHVzZWQuIFRoZXkgaGF2ZSBiZWVuCi0jIG9kZCBudW1iZXJzIGZvciBzb21lIHRpbWUgbm93LgotIwogIyBUaGVyZSB3ZXJlIGEgdmFyaWV0eSBvZiBvbGQgc2NoZW1lcyBmb3Igc2V0dGluZyB0aGUgbWFnaWMgbnVtYmVyLgogIyBUaGUgY3VycmVudCB3b3JraW5nIHNjaGVtZSBpcyB0byBpbmNyZW1lbnQgdGhlIHByZXZpb3VzIHZhbHVlIGJ5CiAjIDEwLgpAQCAtMjMxLDYgKzIyNywxMiBAQAogIyAgICAgUHl0aG9uIDMuNWIyICAzMzQwIChmaXggZGljdGlvbmFyeSBkaXNwbGF5IGV2YWx1YXRpb24gb3JkZXIgIzExMjA1KQogIyAgICAgUHl0aG9uIDMuNWIyICAzMzUwIChhZGQgR0VUX1lJRUxEX0ZST01fSVRFUiBvcGNvZGUgIzI0NDAwKQogIyAgICAgUHl0aG9uIDMuNS4yICAzMzUxIChmaXggQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwgb3Bjb2RlICMyNzI4NikKKyMgICAgIFB5dGhvbiAzLjZhMCAgMzM2MCAoYWRkIEZPUk1BVF9WQUxVRSBvcGNvZGUgIzI1NDgzCisjICAgICBQeXRob24gMy42YTAgIDMzNjEgKGxpbmVubyBkZWx0YSBvZiBjb2RlLmNvX2xub3RhYiBiZWNvbWVzIHNpZ25lZCkKKyMgICAgIFB5dGhvbiAzLjZhMSAgMzM3MCAoMTYgYml0IHdvcmRjb2RlKQorIyAgICAgUHl0aG9uIDMuNmExICAzMzcxIChhZGQgQlVJTERfQ09OU1RfS0VZX01BUCBvcGNvZGUgIzI3MTQwKQorIyAgICAgUHl0aG9uIDMuNmExICAzMzcyIChNQUtFX0ZVTkNUSU9OIHNpbXBsaWZpY2F0aW9uLCByZW1vdmUgTUFLRV9DTE9TVVJFCisgICAgICAgICAgICAgICAgICAgICAgICAgICMyNzA5NSkKICMKICMgTUFHSUMgbXVzdCBjaGFuZ2Ugd2hlbmV2ZXIgdGhlIGJ5dGVjb2RlIGVtaXR0ZWQgYnkgdGhlIGNvbXBpbGVyIG1heSBubwogIyBsb25nZXIgYmUgdW5kZXJzdG9vZCBieSBvbGRlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGV2YWwgbG9vcCAodXN1YWxseQpAQCAtMjM5LDcgKzI0MSw3IEBACiAjIFdoZW5ldmVyIE1BR0lDX05VTUJFUiBpcyBjaGFuZ2VkLCB0aGUgcmFuZ2VzIGluIHRoZSBtYWdpY192YWx1ZXMgYXJyYXkKICMgaW4gUEMvbGF1bmNoZXIuYyBtdXN0IGFsc28gYmUgdXBkYXRlZC4KIAotTUFHSUNfTlVNQkVSID0gKDMzNTEpLnRvX2J5dGVzKDIsICdsaXR0bGUnKSArIGInXHJcbicKK01BR0lDX05VTUJFUiA9ICgzMzcyKS50b19ieXRlcygyLCAnbGl0dGxlJykgKyBiJ1xyXG4nCiBfUkFXX01BR0lDX05VTUJFUiA9IGludC5mcm9tX2J5dGVzKE1BR0lDX05VTUJFUiwgJ2xpdHRsZScpICAjIEZvciBpbXBvcnQuYwogCiBfUFlDQUNIRSA9ICdfX3B5Y2FjaGVfXycKQEAgLTM3MSwxNCArMzczLDYgQEAKICAgICByZXR1cm4gbW9kZQogCiAKLWRlZiBfdmVyYm9zZV9tZXNzYWdlKG1lc3NhZ2UsICphcmdzLCB2ZXJib3NpdHk9MSk6Ci0gICAgIiIiUHJpbnQgdGhlIG1lc3NhZ2UgdG8gc3RkZXJyIGlmIC12L1BZVEhPTlZFUkJPU0UgaXMgdHVybmVkIG9uLiIiIgotICAgIGlmIHN5cy5mbGFncy52ZXJib3NlID49IHZlcmJvc2l0eToKLSAgICAgICAgaWYgbm90IG1lc3NhZ2Uuc3RhcnRzd2l0aCgoJyMnLCAnaW1wb3J0ICcpKToKLSAgICAgICAgICAgIG1lc3NhZ2UgPSAnIyAnICsgbWVzc2FnZQotICAgICAgICBwcmludChtZXNzYWdlLmZvcm1hdCgqYXJncyksIGZpbGU9c3lzLnN0ZGVycikKLQotCiBkZWYgX2NoZWNrX25hbWUobWV0aG9kKToKICAgICAiIiJEZWNvcmF0b3IgdG8gdmVyaWZ5IHRoYXQgdGhlIG1vZHVsZSBiZWluZyByZXF1ZXN0ZWQgbWF0Y2hlcyB0aGUgb25lIHRoZQogICAgIGxvYWRlciBjYW4gaGFuZGxlLgpAQCAtNDQ4LDE1ICs0NDIsMTUgQEAKICAgICByYXdfc2l6ZSA9IGRhdGFbODoxMl0KICAgICBpZiBtYWdpYyAhPSBNQUdJQ19OVU1CRVI6CiAgICAgICAgIG1lc3NhZ2UgPSAnYmFkIG1hZ2ljIG51bWJlciBpbiB7IXJ9OiB7IXJ9Jy5mb3JtYXQobmFtZSwgbWFnaWMpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKG1lc3NhZ2UsICoqZXhjX2RldGFpbHMpCiAgICAgZWxpZiBsZW4ocmF3X3RpbWVzdGFtcCkgIT0gNDoKICAgICAgICAgbWVzc2FnZSA9ICdyZWFjaGVkIEVPRiB3aGlsZSByZWFkaW5nIHRpbWVzdGFtcCBpbiB7IXJ9Jy5mb3JtYXQobmFtZSkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9JywgbWVzc2FnZSkKICAgICAgICAgcmFpc2UgRU9GRXJyb3IobWVzc2FnZSkKICAgICBlbGlmIGxlbihyYXdfc2l6ZSkgIT0gNDoKICAgICAgICAgbWVzc2FnZSA9ICdyZWFjaGVkIEVPRiB3aGlsZSByZWFkaW5nIHNpemUgb2Ygc291cmNlIGluIHshcn0nLmZvcm1hdChuYW1lKQotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgne30nLCBtZXNzYWdlKQogICAgICAgICByYWlzZSBFT0ZFcnJvcihtZXNzYWdlKQogICAgIGlmIHNvdXJjZV9zdGF0cyBpcyBub3QgTm9uZToKICAgICAgICAgdHJ5OgpAQCAtNDY2LDcgKzQ2MCw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBpZiBfcl9sb25nKHJhd190aW1lc3RhbXApICE9IHNvdXJjZV9tdGltZToKICAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ2J5dGVjb2RlIGlzIHN0YWxlIGZvciB7IXJ9Jy5mb3JtYXQobmFtZSkKLSAgICAgICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd7fScsIG1lc3NhZ2UpCiAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IobWVzc2FnZSwgKipleGNfZGV0YWlscykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc291cmNlX3NpemUgPSBzb3VyY2Vfc3RhdHNbJ3NpemUnXSAmIDB4RkZGRkZGRkYKQEAgLTQ4Myw3ICs0NzcsNyBAQAogICAgICIiIkNvbXBpbGUgYnl0ZWNvZGUgYXMgcmV0dXJuZWQgYnkgX3ZhbGlkYXRlX2J5dGVjb2RlX2hlYWRlcigpLiIiIgogICAgIGNvZGUgPSBtYXJzaGFsLmxvYWRzKGRhdGEpCiAgICAgaWYgaXNpbnN0YW5jZShjb2RlLCBfY29kZV90eXBlKToKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7IXJ9JywgYnl0ZWNvZGVfcGF0aCkKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb2RlIG9iamVjdCBmcm9tIHshcn0nLCBieXRlY29kZV9wYXRoKQogICAgICAgICBpZiBzb3VyY2VfcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIF9pbXAuX2ZpeF9jb19maWxlbmFtZShjb2RlLCBzb3VyY2VfcGF0aCkKICAgICAgICAgcmV0dXJuIGNvZGUKQEAgLTYxMCw3ICs2MDQsNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmVnaXN0cnlfa2V5ID0gY2xzLlJFR0lTVFJZX0tFWQogICAgICAgICBrZXkgPSByZWdpc3RyeV9rZXkuZm9ybWF0KGZ1bGxuYW1lPWZ1bGxuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c192ZXJzaW9uPXN5cy52ZXJzaW9uWzozXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNfdmVyc2lvbj0nJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggY2xzLl9vcGVuX3JlZ2lzdHJ5KGtleSkgYXMgaGtleToKICAgICAgICAgICAgICAgICBmaWxlcGF0aCA9IF93aW5yZWcuUXVlcnlWYWx1ZShoa2V5LCAnJykKQEAgLTY3Myw2ICs2NjcsNyBAQAogICAgICAgICBfYm9vdHN0cmFwLl9jYWxsX3dpdGhfZnJhbWVzX3JlbW92ZWQoZXhlYywgY29kZSwgbW9kdWxlLl9fZGljdF9fKQogCiAgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgIiIiVGhpcyBtb2R1bGUgaXMgZGVwcmVjYXRlZC4iIiIKICAgICAgICAgcmV0dXJuIF9ib290c3RyYXAuX2xvYWRfbW9kdWxlX3NoaW0oc2VsZiwgZnVsbG5hbWUpCiAKIApAQCAtNzY2LDIxICs3NjEsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgRU9GRXJyb3IpOgogICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgne30gbWF0Y2hlcyB7fScsIGJ5dGVjb2RlX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ3t9IG1hdGNoZXMge30nLCBieXRlY29kZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlX2J5dGVjb2RlKGJ5dGVzX2RhdGEsIG5hbWU9ZnVsbG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZWNvZGVfcGF0aD1ieXRlY29kZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9wYXRoPXNvdXJjZV9wYXRoKQogICAgICAgICBzb3VyY2VfYnl0ZXMgPSBzZWxmLmdldF9kYXRhKHNvdXJjZV9wYXRoKQogICAgICAgICBjb2RlX29iamVjdCA9IHNlbGYuc291cmNlX3RvX2NvZGUoc291cmNlX2J5dGVzLCBzb3VyY2VfcGF0aCkKLSAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY29kZSBvYmplY3QgZnJvbSB7fScsIHNvdXJjZV9wYXRoKQorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2NvZGUgb2JqZWN0IGZyb20ge30nLCBzb3VyY2VfcGF0aCkKICAgICAgICAgaWYgKG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZSBhbmQgYnl0ZWNvZGVfcGF0aCBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICAgICBzb3VyY2VfbXRpbWUgaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgZGF0YSA9IF9jb2RlX3RvX2J5dGVjb2RlKGNvZGVfb2JqZWN0LCBzb3VyY2VfbXRpbWUsCiAgICAgICAgICAgICAgICAgICAgIGxlbihzb3VyY2VfYnl0ZXMpKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuX2NhY2hlX2J5dGVjb2RlKHNvdXJjZV9wYXRoLCBieXRlY29kZV9wYXRoLCBkYXRhKQotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3dyb3RlIHshcn0nLCBieXRlY29kZV9wYXRoKQorICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnd3JvdGUgeyFyfScsIGJ5dGVjb2RlX3BhdGgpCiAgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgIHJldHVybiBjb2RlX29iamVjdApAQCAtODYwLDE0ICs4NTUsMTYgQEAKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgICAjIENvdWxkIGJlIGEgcGVybWlzc2lvbiBlcnJvciwgcmVhZC1vbmx5IGZpbGVzeXN0ZW06IGp1c3QgZm9yZ2V0CiAgICAgICAgICAgICAgICAgIyBhYm91dCB3cml0aW5nIHRoZSBkYXRhLgotICAgICAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2NvdWxkIG5vdCBjcmVhdGUgeyFyfTogeyFyfScsIHBhcmVudCwgZXhjKQorICAgICAgICAgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LCBleGMpCiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIF93cml0ZV9hdG9taWMocGF0aCwgZGF0YSwgX21vZGUpCi0gICAgICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCdjcmVhdGVkIHshcn0nLCBwYXRoKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjcmVhdGVkIHshcn0nLCBwYXRoKQogICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAjIFNhbWUgYXMgYWJvdmU6IGp1c3QgZG9uJ3Qgd3JpdGUgdGhlIGJ5dGVjb2RlLgotICAgICAgICAgICAgX3ZlcmJvc2VfbWVzc2FnZSgnY291bGQgbm90IGNyZWF0ZSB7IXJ9OiB7IXJ9JywgcGF0aCwgZXhjKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdjb3VsZCBub3QgY3JlYXRlIHshcn06IHshcn0nLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YykKIAogCiBjbGFzcyBTb3VyY2VsZXNzRmlsZUxvYWRlcihGaWxlTG9hZGVyLCBfTG9hZGVyQmFzaWNzKToKQEAgLTkxMiwxNCArOTA5LDE0IEBACiAgICAgICAgICIiIkNyZWF0ZSBhbiB1bml0aWFsaXplZCBleHRlbnNpb24gbW9kdWxlIiIiCiAgICAgICAgIG1vZHVsZSA9IF9ib290c3RyYXAuX2NhbGxfd2l0aF9mcmFtZXNfcmVtb3ZlZCgKICAgICAgICAgICAgIF9pbXAuY3JlYXRlX2R5bmFtaWMsIHNwZWMpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBsb2FkZWQgZnJvbSB7IXJ9JywKKyAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdleHRlbnNpb24gbW9kdWxlIHshcn0gbG9hZGVkIGZyb20geyFyfScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYy5uYW1lLCBzZWxmLnBhdGgpCiAgICAgICAgIHJldHVybiBtb2R1bGUKIAogICAgIGRlZiBleGVjX21vZHVsZShzZWxmLCBtb2R1bGUpOgogICAgICAgICAiIiJJbml0aWFsaXplIGFuIGV4dGVuc2lvbiBtb2R1bGUiIiIKICAgICAgICAgX2Jvb3RzdHJhcC5fY2FsbF93aXRoX2ZyYW1lc19yZW1vdmVkKF9pbXAuZXhlY19keW5hbWljLCBtb2R1bGUpCi0gICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBleGVjdXRlZCBmcm9tIHshcn0nLAorICAgICAgICBfYm9vdHN0cmFwLl92ZXJib3NlX21lc3NhZ2UoJ2V4dGVuc2lvbiBtb2R1bGUgeyFyfSBleGVjdXRlZCBmcm9tIHshcn0nLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5wYXRoKQogCiAgICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgpAQCAtOTg1LDYgKzk4Miw5IEBACiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9yZWNhbGN1bGF0ZSgpKQogCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBwYXRoKToKKyAgICAgICAgc2VsZi5fcGF0aFtpbmRleF0gPSBwYXRoCisKICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9yZWNhbGN1bGF0ZSgpKQogCkBAIC0xMDM0LDcgKzEwMzQsOCBAQAogCiAgICAgICAgICIiIgogICAgICAgICAjIFRoZSBpbXBvcnQgc3lzdGVtIG5ldmVyIGNhbGxzIHRoaXMgbWV0aG9kLgotICAgICAgICBfdmVyYm9zZV9tZXNzYWdlKCduYW1lc3BhY2UgbW9kdWxlIGxvYWRlZCB3aXRoIHBhdGggeyFyfScsIHNlbGYuX3BhdGgpCisgICAgICAgIF9ib290c3RyYXAuX3ZlcmJvc2VfbWVzc2FnZSgnbmFtZXNwYWNlIG1vZHVsZSBsb2FkZWQgd2l0aCBwYXRoIHshcn0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGF0aCkKICAgICAgICAgcmV0dXJuIF9ib290c3RyYXAuX2xvYWRfbW9kdWxlX3NoaW0oc2VsZiwgZnVsbG5hbWUpCiAKIApAQCAtMTA1NCwxMSArMTA1NSw3IEBACiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgX3BhdGhfaG9va3MoY2xzLCBwYXRoKToKLSAgICAgICAgIiIiU2VhcmNoIHNlcXVlbmNlIG9mIGhvb2tzIGZvciBhIGZpbmRlciBmb3IgJ3BhdGgnLgotCi0gICAgICAgIElmICdob29rcycgaXMgZmFsc2UgdGhlbiB1c2Ugc3lzLnBhdGhfaG9va3MuCi0KLSAgICAgICAgIiIiCisgICAgICAgICIiIlNlYXJjaCBzeXMucGF0aF9ob29rcyBmb3IgYSBmaW5kZXIgZm9yICdwYXRoJy4iIiIKICAgICAgICAgaWYgc3lzLnBhdGhfaG9va3MgaXMgbm90IE5vbmUgYW5kIG5vdCBzeXMucGF0aF9ob29rczoKICAgICAgICAgICAgIF93YXJuaW5ncy53YXJuKCdzeXMucGF0aF9ob29rcyBpcyBlbXB0eScsIEltcG9ydFdhcm5pbmcpCiAgICAgICAgIGZvciBob29rIGluIHN5cy5wYXRoX2hvb2tzOgpAQCAtMTE0MCw4ICsxMTM3LDEwIEBACiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgZmluZF9zcGVjKGNscywgZnVsbG5hbWUsIHBhdGg9Tm9uZSwgdGFyZ2V0PU5vbmUpOgotICAgICAgICAiIiJmaW5kIHRoZSBtb2R1bGUgb24gc3lzLnBhdGggb3IgJ3BhdGgnIGJhc2VkIG9uIHN5cy5wYXRoX2hvb2tzIGFuZAotICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS4iIiIKKyAgICAgICAgIiIiVHJ5IHRvIGZpbmQgYSBzcGVjIGZvciAnZnVsbG5hbWUnIG9uIHN5cy5wYXRoIG9yICdwYXRoJy4KKworICAgICAgICBUaGUgc2VhcmNoIGlzIGJhc2VkIG9uIHN5cy5wYXRoX2hvb2tzIGFuZCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS4KKyAgICAgICAgIiIiCiAgICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgICBzcGVjID0gY2xzLl9nZXRfc3BlYyhmdWxsbmFtZSwgcGF0aCwgdGFyZ2V0KQpAQCAtMTIyMSw4ICsxMjIwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGVfc2VhcmNoX2xvY2F0aW9ucz1zbXNsKQogCiAgICAgZGVmIGZpbmRfc3BlYyhzZWxmLCBmdWxsbmFtZSwgdGFyZ2V0PU5vbmUpOgotICAgICAgICAiIiJUcnkgdG8gZmluZCBhIHNwZWMgZm9yIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiAgUmV0dXJucyB0aGUKLSAgICAgICAgbWF0Y2hpbmcgc3BlYywgb3IgTm9uZSBpZiBub3QgZm91bmQuIiIiCisgICAgICAgICIiIlRyeSB0byBmaW5kIGEgc3BlYyBmb3IgdGhlIHNwZWNpZmllZCBtb2R1bGUuCisKKyAgICAgICAgUmV0dXJucyB0aGUgbWF0Y2hpbmcgc3BlYywgb3IgTm9uZSBpZiBub3QgZm91bmQuCisgICAgICAgICIiIgogICAgICAgICBpc19uYW1lc3BhY2UgPSBGYWxzZQogICAgICAgICB0YWlsX21vZHVsZSA9IGZ1bGxuYW1lLnJwYXJ0aXRpb24oJy4nKVsyXQogICAgICAgICB0cnk6CkBAIC0xMjU0LDEyICsxMjU1LDEzIEBACiAgICAgICAgICMgQ2hlY2sgZm9yIGEgZmlsZSB3LyBhIHByb3BlciBzdWZmaXggZXhpc3RzLgogICAgICAgICBmb3Igc3VmZml4LCBsb2FkZXJfY2xhc3MgaW4gc2VsZi5fbG9hZGVyczoKICAgICAgICAgICAgIGZ1bGxfcGF0aCA9IF9wYXRoX2pvaW4oc2VsZi5wYXRoLCB0YWlsX21vZHVsZSArIHN1ZmZpeCkKLSAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3RyeWluZyB7fScuZm9ybWF0KGZ1bGxfcGF0aCksIHZlcmJvc2l0eT0yKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCd0cnlpbmcge30nLCBmdWxsX3BhdGgsIHZlcmJvc2l0eT0yKQogICAgICAgICAgICAgaWYgY2FjaGVfbW9kdWxlICsgc3VmZml4IGluIGNhY2hlOgogICAgICAgICAgICAgICAgIGlmIF9wYXRoX2lzZmlsZShmdWxsX3BhdGgpOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3NwZWMobG9hZGVyX2NsYXNzLCBmdWxsbmFtZSwgZnVsbF9wYXRoLCBOb25lLCB0YXJnZXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfc3BlYyhsb2FkZXJfY2xhc3MsIGZ1bGxuYW1lLCBmdWxsX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCB0YXJnZXQpCiAgICAgICAgIGlmIGlzX25hbWVzcGFjZToKLSAgICAgICAgICAgIF92ZXJib3NlX21lc3NhZ2UoJ3Bvc3NpYmxlIG5hbWVzcGFjZSBmb3Ige30nLmZvcm1hdChiYXNlX3BhdGgpKQorICAgICAgICAgICAgX2Jvb3RzdHJhcC5fdmVyYm9zZV9tZXNzYWdlKCdwb3NzaWJsZSBuYW1lc3BhY2UgZm9yIHt9JywgYmFzZV9wYXRoKQogICAgICAgICAgICAgc3BlYyA9IF9ib290c3RyYXAuTW9kdWxlU3BlYyhmdWxsbmFtZSwgTm9uZSkKICAgICAgICAgICAgIHNwZWMuc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbYmFzZV9wYXRoXQogICAgICAgICAgICAgcmV0dXJuIHNwZWMKZGlmZiAtLWdpdCBhL0xpYi9pbXBvcnRsaWIvdXRpbC5weSBiL0xpYi9pbXBvcnRsaWIvdXRpbC5weQppbmRleCBlMWZhMDdhLi42YmRmMGQ0IDEwMDY0NAotLS0gYS9MaWIvaW1wb3J0bGliL3V0aWwucHkKKysrIGIvTGliL2ltcG9ydGxpYi91dGlsLnB5CkBAIC0yMiw4ICsyMiw4IEBACiAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnLicpOgogICAgICAgICByZXR1cm4gbmFtZQogICAgIGVsaWYgbm90IHBhY2thZ2U6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3shcn0gaXMgbm90IGEgcmVsYXRpdmUgbmFtZSAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgJyhubyBsZWFkaW5nIGRvdCknLmZvcm1hdChuYW1lKSkKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmJ25vIHBhY2thZ2Ugc3BlY2lmaWVkIGZvciB7cmVwcihuYW1lKX0gJworICAgICAgICAgICAgICAgICAgICAgICAgICcocmVxdWlyZWQgZm9yIHJlbGF0aXZlIG1vZHVsZSBuYW1lcyknKQogICAgIGxldmVsID0gMAogICAgIGZvciBjaGFyYWN0ZXIgaW4gbmFtZToKICAgICAgICAgaWYgY2hhcmFjdGVyICE9ICcuJzoKQEAgLTIwNCwxMSArMjA0LDYgQEAKICAgICByZXR1cm4gbW9kdWxlX2Zvcl9sb2FkZXJfd3JhcHBlcgogCiAKLWNsYXNzIF9Nb2R1bGUodHlwZXMuTW9kdWxlVHlwZSk6Ci0KLSAgICAiIiJBIHN1YmNsYXNzIG9mIHRoZSBtb2R1bGUgdHlwZSB0byBhbGxvdyBfX2NsYXNzX18gbWFuaXB1bGF0aW9uLiIiIgotCi0KIGNsYXNzIF9MYXp5TW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUpOgogCiAgICAgIiIiQSBzdWJjbGFzcyBvZiB0aGUgbW9kdWxlIHR5cGUgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyB1cG9uIGF0dHJpYnV0ZSBhY2Nlc3MuIiIiCkBAIC0yMTgsMTMgKzIxMywxNCBAQAogICAgICAgICAjIEFsbCBtb2R1bGUgbWV0YWRhdGEgbXVzdCBiZSBnYXJuZXJlZCBmcm9tIF9fc3BlY19fIGluIG9yZGVyIHRvIGF2b2lkCiAgICAgICAgICMgdXNpbmcgbXV0YXRlZCB2YWx1ZXMuCiAgICAgICAgICMgU3RvcCB0cmlnZ2VyaW5nIHRoaXMgbWV0aG9kLgotICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IF9Nb2R1bGUKKyAgICAgICAgc2VsZi5fX2NsYXNzX18gPSB0eXBlcy5Nb2R1bGVUeXBlCiAgICAgICAgICMgR2V0IHRoZSBvcmlnaW5hbCBuYW1lIHRvIG1ha2Ugc3VyZSBubyBvYmplY3Qgc3Vic3RpdHV0aW9uIG9jY3VycmVkCiAgICAgICAgICMgaW4gc3lzLm1vZHVsZXMuCiAgICAgICAgIG9yaWdpbmFsX25hbWUgPSBzZWxmLl9fc3BlY19fLm5hbWUKICAgICAgICAgIyBGaWd1cmUgb3V0IGV4YWN0bHkgd2hhdCBhdHRyaWJ1dGVzIHdlcmUgbXV0YXRlZCBiZXR3ZWVuIHRoZSBjcmVhdGlvbgogICAgICAgICAjIG9mIHRoZSBtb2R1bGUgYW5kIG5vdy4KLSAgICAgICAgYXR0cnNfdGhlbiA9IHNlbGYuX19zcGVjX18ubG9hZGVyX3N0YXRlCisgICAgICAgIGF0dHJzX3RoZW4gPSBzZWxmLl9fc3BlY19fLmxvYWRlcl9zdGF0ZVsnX19kaWN0X18nXQorICAgICAgICBvcmlnaW5hbF90eXBlID0gc2VsZi5fX3NwZWNfXy5sb2FkZXJfc3RhdGVbJ19fY2xhc3NfXyddCiAgICAgICAgIGF0dHJzX25vdyA9IHNlbGYuX19kaWN0X18KICAgICAgICAgYXR0cnNfdXBkYXRlZCA9IHt9CiAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGF0dHJzX25vdy5pdGVtcygpOgpAQCAtMjM5LDkgKzIzNSw5IEBACiAgICAgICAgICMgb2JqZWN0IHdhcyBwdXQgaW50byBzeXMubW9kdWxlcy4KICAgICAgICAgaWYgb3JpZ2luYWxfbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgIGlmIGlkKHNlbGYpICE9IGlkKHN5cy5tb2R1bGVzW29yaWdpbmFsX25hbWVdKToKLSAgICAgICAgICAgICAgICBtc2cgPSAoJ21vZHVsZSBvYmplY3QgZm9yIHshcn0gc3Vic3RpdHV0ZWQgaW4gc3lzLm1vZHVsZXMgJwotICAgICAgICAgICAgICAgICAgICAgICAnZHVyaW5nIGEgbGF6eSBsb2FkJykKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZy5mb3JtYXQob3JpZ2luYWxfbmFtZSkpCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihmIm1vZHVsZSBvYmplY3QgZm9yIHtvcmlnaW5hbF9uYW1lIXJ9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3Vic3RpdHV0ZWQgaW4gc3lzLm1vZHVsZXMgZHVyaW5nIGEgbGF6eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWQiKQogICAgICAgICAjIFVwZGF0ZSBhZnRlciBsb2FkaW5nIHNpbmNlIHRoYXQncyB3aGF0IHdvdWxkIGhhcHBlbiBpbiBhbiBlYWdlcgogICAgICAgICAjIGxvYWRpbmcgc2l0dWF0aW9uLgogICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShhdHRyc191cGRhdGVkKQpAQCAtMjc1LDggKzI3MSw3IEBACiAgICAgICAgIHNlbGYubG9hZGVyID0gbG9hZGVyCiAKICAgICBkZWYgY3JlYXRlX21vZHVsZShzZWxmLCBzcGVjKToKLSAgICAgICAgIiIiQ3JlYXRlIGEgbW9kdWxlIHdoaWNoIGNhbiBoYXZlIGl0cyBfX2NsYXNzX18gbWFuaXB1bGF0ZWQuIiIiCi0gICAgICAgIHJldHVybiBfTW9kdWxlKHNwZWMubmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmNyZWF0ZV9tb2R1bGUoc3BlYykKIAogICAgIGRlZiBleGVjX21vZHVsZShzZWxmLCBtb2R1bGUpOgogICAgICAgICAiIiJNYWtlIHRoZSBtb2R1bGUgbG9hZCBsYXppbHkuIiIiCkBAIC0yODYsNSArMjgxLDggQEAKICAgICAgICAgIyBvbiBhbiBvYmplY3Qgd291bGQgaGF2ZSB0cmlnZ2VyZWQgdGhlIGxvYWQsCiAgICAgICAgICMgZS5nLiBgYG1vZHVsZS5fX3NwZWNfXy5sb2FkZXIgPSBOb25lYGAgd291bGQgdHJpZ2dlciBhIGxvYWQgZnJvbQogICAgICAgICAjIHRyeWluZyB0byBhY2Nlc3MgbW9kdWxlLl9fc3BlY19fLgotICAgICAgICBtb2R1bGUuX19zcGVjX18ubG9hZGVyX3N0YXRlID0gbW9kdWxlLl9fZGljdF9fLmNvcHkoKQorICAgICAgICBsb2FkZXJfc3RhdGUgPSB7fQorICAgICAgICBsb2FkZXJfc3RhdGVbJ19fZGljdF9fJ10gPSBtb2R1bGUuX19kaWN0X18uY29weSgpCisgICAgICAgIGxvYWRlcl9zdGF0ZVsnX19jbGFzc19fJ10gPSBtb2R1bGUuX19jbGFzc19fCisgICAgICAgIG1vZHVsZS5fX3NwZWNfXy5sb2FkZXJfc3RhdGUgPSBsb2FkZXJfc3RhdGUKICAgICAgICAgbW9kdWxlLl9fY2xhc3NfXyA9IF9MYXp5TW9kdWxlCmRpZmYgLS1naXQgYS9MaWIvaW5zcGVjdC5weSBiL0xpYi9pbnNwZWN0LnB5CmluZGV4IGU4MzBlYjYuLjQ1ZDIxMTAgMTAwNjQ0Ci0tLSBhL0xpYi9pbnNwZWN0LnB5CisrKyBiL0xpYi9pbnNwZWN0LnB5CkBAIC0xNiw3ICsxNiw3IEBACiAgICAgZ2V0bW9kdWxlKCkgLSBkZXRlcm1pbmUgdGhlIG1vZHVsZSB0aGF0IGFuIG9iamVjdCBjYW1lIGZyb20KICAgICBnZXRjbGFzc3RyZWUoKSAtIGFycmFuZ2UgY2xhc3NlcyBzbyBhcyB0byByZXByZXNlbnQgdGhlaXIgaGllcmFyY2h5CiAKLSAgICBnZXRhcmdzcGVjKCksIGdldGFyZ3ZhbHVlcygpLCBnZXRjYWxsYXJncygpIC0gZ2V0IGluZm8gYWJvdXQgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgZ2V0YXJndmFsdWVzKCksIGdldGNhbGxhcmdzKCkgLSBnZXQgaW5mbyBhYm91dCBmdW5jdGlvbiBhcmd1bWVudHMKICAgICBnZXRmdWxsYXJnc3BlYygpIC0gc2FtZSwgd2l0aCBzdXBwb3J0IGZvciBQeXRob24gMyBmZWF0dXJlcwogICAgIGZvcm1hdGFyZ3NwZWMoKSwgZm9ybWF0YXJndmFsdWVzKCkgLSBmb3JtYXQgYW4gYXJndW1lbnQgc3BlYwogICAgIGdldG91dGVyZnJhbWVzKCksIGdldGlubmVyZnJhbWVzKCkgLSBnZXQgaW5mbyBhYm91dCBmcmFtZXMKQEAgLTYyNCwyMyArNjI0LDYgQEAKICAgICByYWlzZSBUeXBlRXJyb3IoJ3shcn0gaXMgbm90IGEgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCAnCiAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbiwgdHJhY2ViYWNrLCBmcmFtZSwgb3IgY29kZSBvYmplY3QnLmZvcm1hdChvYmplY3QpKQogCi1Nb2R1bGVJbmZvID0gbmFtZWR0dXBsZSgnTW9kdWxlSW5mbycsICduYW1lIHN1ZmZpeCBtb2RlIG1vZHVsZV90eXBlJykKLQotZGVmIGdldG1vZHVsZWluZm8ocGF0aCk6Ci0gICAgIiIiR2V0IHRoZSBtb2R1bGUgbmFtZSwgc3VmZml4LCBtb2RlLCBhbmQgbW9kdWxlIHR5cGUgZm9yIGEgZ2l2ZW4gZmlsZS4iIiIKLSAgICB3YXJuaW5ncy53YXJuKCdpbnNwZWN0LmdldG1vZHVsZWluZm8oKSBpcyBkZXByZWNhdGVkJywgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgMikKLSAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgaW1wb3J0IGltcAotICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQotICAgIHN1ZmZpeGVzID0gWygtbGVuKHN1ZmZpeCksIHN1ZmZpeCwgbW9kZSwgbXR5cGUpCi0gICAgICAgICAgICAgICAgICAgIGZvciBzdWZmaXgsIG1vZGUsIG10eXBlIGluIGltcC5nZXRfc3VmZml4ZXMoKV0KLSAgICBzdWZmaXhlcy5zb3J0KCkgIyB0cnkgbG9uZ2VzdCBzdWZmaXhlcyBmaXJzdCwgaW4gY2FzZSB0aGV5IG92ZXJsYXAKLSAgICBmb3IgbmVnbGVuLCBzdWZmaXgsIG1vZGUsIG10eXBlIGluIHN1ZmZpeGVzOgotICAgICAgICBpZiBmaWxlbmFtZVtuZWdsZW46XSA9PSBzdWZmaXg6Ci0gICAgICAgICAgICByZXR1cm4gTW9kdWxlSW5mbyhmaWxlbmFtZVs6bmVnbGVuXSwgc3VmZml4LCBtb2RlLCBtdHlwZSkKLQogZGVmIGdldG1vZHVsZW5hbWUocGF0aCk6CiAgICAgIiIiUmV0dXJuIHRoZSBtb2R1bGUgbmFtZSBmb3IgYSBnaXZlbiBmaWxlLCBvciBOb25lLiIiIgogICAgIGZuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQpAQCAtMTA2MSw4ICsxMDQ0LDYgQEAKICAgICAna3dvbmx5ZGVmYXVsdHMnIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIGZyb20ga3dvbmx5YXJncyB0byBkZWZhdWx0cy4KICAgICAnYW5ub3RhdGlvbnMnIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGFyZ3VtZW50IG5hbWVzIHRvIGFubm90YXRpb25zLgogCi0gICAgVGhlIGZpcnN0IGZvdXIgaXRlbXMgaW4gdGhlIHR1cGxlIGNvcnJlc3BvbmQgdG8gZ2V0YXJnc3BlYygpLgotCiAgICAgVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgaW5zcGVjdC5zaWduYXR1cmUoKSBpbnN0ZWFkLgogICAgICIiIgogCkBAIC0xMTczLDggKzExNTQsNyBAQAogICAgICAgICAgICAgICAgICAgZm9ybWF0dmFsdWU9bGFtYmRhIHZhbHVlOiAnPScgKyByZXByKHZhbHVlKSwKICAgICAgICAgICAgICAgICAgIGZvcm1hdHJldHVybnM9bGFtYmRhIHRleHQ6ICcgLT4gJyArIHRleHQsCiAgICAgICAgICAgICAgICAgICBmb3JtYXRhbm5vdGF0aW9uPWZvcm1hdGFubm90YXRpb24pOgotICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBzcGVjIGZyb20gdGhlIHZhbHVlcyByZXR1cm5lZCBieSBnZXRhcmdzcGVjCi0gICAgb3IgZ2V0ZnVsbGFyZ3NwZWMuCisgICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGdldGZ1bGxhcmdzcGVjLgogCiAgICAgVGhlIGZpcnN0IHNldmVuIGFyZ3VtZW50cyBhcmUgKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywKICAgICBrd29ubHlhcmdzLCBrd29ubHlkZWZhdWx0cywgYW5ub3RhdGlvbnMpLiAgVGhlIG90aGVyIGZpdmUgYXJndW1lbnRzCkBAIC0yNDE2LDYgKzIzOTYsMjAgQEAKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobmFtZSwgc3RyKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigibmFtZSBtdXN0IGJlIGEgc3RyLCBub3QgYSB7IXJ9Ii5mb3JtYXQobmFtZSkpCiAKKyAgICAgICAgaWYgbmFtZVswXSA9PSAnLicgYW5kIG5hbWVbMTpdLmlzZGlnaXQoKToKKyAgICAgICAgICAgICMgVGhlc2UgYXJlIGltcGxpY2l0IGFyZ3VtZW50cyBnZW5lcmF0ZWQgYnkgY29tcHJlaGVuc2lvbnMuIEluCisgICAgICAgICAgICAjIG9yZGVyIHRvIHByb3ZpZGUgYSBmcmllbmRsaWVyIGludGVyZmFjZSB0byB1c2Vycywgd2UgcmVjYXN0CisgICAgICAgICAgICAjIHRoZWlyIG5hbWUgYXMgImltcGxpY2l0TiIgYW5kIHRyZWF0IHRoZW0gYXMgcG9zaXRpb25hbC1vbmx5LgorICAgICAgICAgICAgIyBTZWUgaXNzdWUgMTk2MTEuCisgICAgICAgICAgICBpZiBraW5kICE9IF9QT1NJVElPTkFMX09SX0tFWVdPUkQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgJ2ltcGxpY2l0IGFyZ3VtZW50cyBtdXN0IGJlIHBhc3NlZCBpbiBhcyB7fScuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgX1BPU0lUSU9OQUxfT1JfS0VZV09SRAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5fa2luZCA9IF9QT1NJVElPTkFMX09OTFkKKyAgICAgICAgICAgIG5hbWUgPSAnaW1wbGljaXR7fScuZm9ybWF0KG5hbWVbMTpdKQorCiAgICAgICAgIGlmIG5vdCBuYW1lLmlzaWRlbnRpZmllcigpOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigneyFyfSBpcyBub3QgYSB2YWxpZCBwYXJhbWV0ZXIgbmFtZScuZm9ybWF0KG5hbWUpKQogCmRpZmYgLS1naXQgYS9MaWIvaXBhZGRyZXNzLnB5IGIvTGliL2lwYWRkcmVzcy5weQppbmRleCAxZjkwMDU4Li4yMGYzM2NiIDEwMDY0NAotLS0gYS9MaWIvaXBhZGRyZXNzLnB5CisrKyBiL0xpYi9pcGFkZHJlc3MucHkKQEAgLTYzNiwxMiArNjM2LDEyIEBACiAgICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgICBpZiBuID49IDA6CiAgICAgICAgICAgICBpZiBuZXR3b3JrICsgbiA+IGJyb2FkY2FzdDoKLSAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcignYWRkcmVzcyBvdXQgb2YgcmFuZ2UnKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZHJlc3NfY2xhc3MobmV0d29yayArIG4pCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBuICs9IDEKICAgICAgICAgICAgIGlmIGJyb2FkY2FzdCArIG4gPCBuZXR3b3JrOgotICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKCdhZGRyZXNzIG91dCBvZiByYW5nZScpCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWRkcmVzc19jbGFzcyhicm9hZGNhc3QgKyBuKQogCiAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CmRpZmYgLS1naXQgYS9MaWIvanNvbi9fX2luaXRfXy5weSBiL0xpYi9qc29uL19faW5pdF9fLnB5CmluZGV4IGY3MmIwNTguLmYyYzBkMjMgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL19faW5pdF9fLnB5CisrKyBiL0xpYi9qc29uL19faW5pdF9fLnB5CkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICBkZWZhdWx0PU5vbmUsCiApCiAKLWRlZiBkdW1wKG9iaiwgZnAsIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKK2RlZiBkdW1wKG9iaiwgZnAsICosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKICAgICAgICAgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLAogICAgICAgICBkZWZhdWx0PU5vbmUsIHNvcnRfa2V5cz1GYWxzZSwgKiprdyk6CiAgICAgIiIiU2VyaWFsaXplIGBgb2JqYGAgYXMgYSBKU09OIGZvcm1hdHRlZCBzdHJlYW0gdG8gYGBmcGBgIChhCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgICAgZnAud3JpdGUoY2h1bmspCiAKIAotZGVmIGR1bXBzKG9iaiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAorZGVmIGR1bXBzKG9iaiwgKiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAogICAgICAgICBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsCiAgICAgICAgIGRlZmF1bHQ9Tm9uZSwgc29ydF9rZXlzPUZhbHNlLCAqKmt3KToKICAgICAiIiJTZXJpYWxpemUgYGBvYmpgYCB0byBhIEpTT04gZm9ybWF0dGVkIGBgc3RyYGAuCkBAIC0yNDAsNyArMjQwLDcgQEAKIF9kZWZhdWx0X2RlY29kZXIgPSBKU09ORGVjb2RlcihvYmplY3RfaG9vaz1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lKQogCiAKLWRlZiBsb2FkKGZwLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKK2RlZiBsb2FkKGZwLCAqLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKICAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpOgogICAgICIiIkRlc2VyaWFsaXplIGBgZnBgYCAoYSBgYC5yZWFkKClgYC1zdXBwb3J0aW5nIGZpbGUtbGlrZSBvYmplY3QgY29udGFpbmluZwogICAgIGEgSlNPTiBkb2N1bWVudCkgdG8gYSBQeXRob24gb2JqZWN0LgpAQCAtMjY4LDcgKzI2OCw3IEBACiAgICAgICAgIHBhcnNlX2NvbnN0YW50PXBhcnNlX2NvbnN0YW50LCBvYmplY3RfcGFpcnNfaG9vaz1vYmplY3RfcGFpcnNfaG9vaywgKiprdykKIAogCi1kZWYgbG9hZHMocywgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCitkZWYgbG9hZHMocywgKiwgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCiAgICAgICAgIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KToKICAgICAiIiJEZXNlcmlhbGl6ZSBgYHNgYCAoYSBgYHN0cmBgIGluc3RhbmNlIGNvbnRhaW5pbmcgYSBKU09OCiAgICAgZG9jdW1lbnQpIHRvIGEgUHl0aG9uIG9iamVjdC4KZGlmZiAtLWdpdCBhL0xpYi9qc29uL2RlY29kZXIucHkgYi9MaWIvanNvbi9kZWNvZGVyLnB5CmluZGV4IDBmMDNmMjAuLjI0MjJjNmEgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL2RlY29kZXIucHkKKysrIGIvTGliL2pzb24vZGVjb2Rlci5weQpAQCAtMjgwLDcgKzI4MCw3IEBACiAKICAgICAiIiIKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAogICAgICAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIHN0cmljdD1UcnVlLAogICAgICAgICAgICAgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSk6CiAgICAgICAgICIiImBgb2JqZWN0X2hvb2tgYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSByZXN1bHQKZGlmZiAtLWdpdCBhL0xpYi9qc29uL2VuY29kZXIucHkgYi9MaWIvanNvbi9lbmNvZGVyLnB5CmluZGV4IGQ1OTY0ODkuLjQxYTQ5N2MgMTAwNjQ0Ci0tLSBhL0xpYi9qc29uL2VuY29kZXIucHkKKysrIGIvTGliL2pzb24vZW5jb2Rlci5weQpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgIiIiCiAgICAgaXRlbV9zZXBhcmF0b3IgPSAnLCAnCiAgICAga2V5X3NlcGFyYXRvciA9ICc6ICcKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsCiAgICAgICAgICAgICBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgc29ydF9rZXlzPUZhbHNlLAogICAgICAgICAgICAgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgIiIiQ29uc3RydWN0b3IgZm9yIEpTT05FbmNvZGVyLCB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzLgpAQCAtMTc2LDcgKzE3Niw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT05FbmNvZGVyLmRlZmF1bHQoc2VsZiwgbykKIAogICAgICAgICAiIiIKLSAgICAgICAgcmFpc2UgVHlwZUVycm9yKHJlcHIobykgKyAiIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZSIpCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiT2JqZWN0IG9mIHR5cGUgJyVzJyBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUiICUKKyAgICAgICAgICAgICAgICAgICAgICAgIG8uX19jbGFzc19fLl9fbmFtZV9fKQogCiAgICAgZGVmIGVuY29kZShzZWxmLCBvKToKICAgICAgICAgIiIiUmV0dXJuIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gZGF0YSBzdHJ1Y3R1cmUuCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXJfdXRpbC5weQppbmRleCA0NDUwMmJmLi5iYWJlNmNiIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcl91dGlsLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVyX3V0aWwucHkKQEAgLTEsOCArMSw2IEBACiAiIiJVdGlsaXR5IGZ1bmN0aW9ucywgbm9kZSBjb25zdHJ1Y3Rpb24gbWFjcm9zLCBldGMuIiIiCiAjIEF1dGhvcjogQ29sbGluIFdpbnRlcgogCi1mcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCi0KICMgTG9jYWwgaW1wb3J0cwogZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC5weXRyZWUgaW1wb3J0IExlYWYsIE5vZGUKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKaW5kZXggOTYzZjk1Mi4uZDM2NTVjOSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKQEAgLTMwLDkgKzMwLDggQEAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSAuLiBpbXBvcnQgcHl0cmVlCiBmcm9tIC4uIGltcG9ydCBwYXRjb21wCi1mcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCiBmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCi1mcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgTFBhcmVuLCBSUGFyZW4sIEFyZ0xpc3QsIERvdAorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIERvdAogZnJvbSAuLiBpbXBvcnQgZml4ZXJfdXRpbAogCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKaW5kZXggMmM5YjcyZC4uYWI5MjFlZSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKQEAgLTEwLDcgKzEwLDYgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi4gaW1wb3J0IHB5dHJlZQogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IENvbW1hLCBOYW1lLCBDYWxsCiAKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5CmluZGV4IDM5MTg4OWYuLmJiNjcxOGMgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weQpAQCAtMTQsNyArMTQsNiBAQAogIiIiCiAKICMgTG9jYWwgaW1wb3J0cwotZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIExpc3RDb21wLCBpbl9zcGVjaWFsX2NvbnRleHQKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQppbmRleCAxOGM1NjBmLi40Mzk3MDhjIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQpAQCAtMzEsNyArMzEsNiBAQAogCiAjIExvY2FsIGltcG9ydHMKIGZyb20gLi4gaW1wb3J0IHB5dHJlZQotZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIHBhcmVudGhlc2l6ZQogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weQppbmRleCA0NmM3YWFmLi44ZTM0NDYzIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkKQEAgLTIwLDcgKzIwLDcgQEAKICMgTG9jYWwgaW1wb3J0cwogZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSAuLnB5Z3JhbSBpbXBvcnQgdG9rZW4KLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBzeW1zLCBOb2RlLCBMZWFmCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgc3ltcywgTm9kZSwgTGVhZgogCiAKIGRlZiBoYXNfbWV0YWNsYXNzKHBhcmVudCk6CmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CmluZGV4IGFkOTFhMjkuLmMyMjk1OTYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CisrKyBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CkBAIC0zLDcgKzMsNyBAQAogCiAjIExvY2FsIGltcG9ydHMKIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBzeW1zCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQogCiBjbGFzcyBGaXhOb256ZXJvKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CiAgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weSBiL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQppbmRleCBhMWZlMmY1Li44NzgwMzIyIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5CkBAIC0xOCw3ICsxOCw3IEBACiBmcm9tIC4uIGltcG9ydCBweXRyZWUKIGZyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKLWZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBDb21tYSwgU3RyaW5nLCBpc190dXBsZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIENvbW1hLCBTdHJpbmcKIAogCiBwYXJlbmRfZXhwciA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5IGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5CmluZGV4IGRiMzQxMDQuLjY3YmY1MWYgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQorKysgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKQEAgLTIwLDcgKzIwLDYgQEAKICIiIgogCiAjIExvY2FsIGltcG9ydHMKLWZyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KIGZyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKIGZyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lCiAKQEAgLTQyLDcgKzQxLDcgQEAKICAgICAgICAgJ05vdEltcGxlbWVudGVkVHlwZScgOiAndHlwZShOb3RJbXBsZW1lbnRlZCknLAogICAgICAgICAnU2xpY2VUeXBlJyA6ICdzbGljZScsCiAgICAgICAgICdTdHJpbmdUeXBlJzogJ2J5dGVzJywgIyBYWFggPwotICAgICAgICAnU3RyaW5nVHlwZXMnIDogJ3N0cicsICMgWFhYID8KKyAgICAgICAgJ1N0cmluZ1R5cGVzJyA6ICcoc3RyLCknLCAjIFhYWCA/CiAgICAgICAgICdUdXBsZVR5cGUnOiAndHVwbGUnLAogICAgICAgICAnVHlwZVR5cGUnIDogJ3R5cGUnLAogICAgICAgICAnVW5pY29kZVR5cGUnOiAnc3RyJywKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkgYi9MaWIvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5CmluZGV4IDE0ODFjZDkuLjVhMzYwNDkgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkKKysrIGIvTGliL2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQpAQCAtNiw3ICs2LDYgQEAKIAogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIGxpYjJ0bzMuZml4ZXMuZml4X2ltcG9ydHMgaW1wb3J0IGFsdGVybmF0ZXMsIEZpeEltcG9ydHMKLWZyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQogZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IChOYW1lLCBDb21tYSwgRnJvbUltcG9ydCwgTmV3bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZF9pbmRlbnRhdGlvbiwgTm9kZSwgc3ltcykKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvcmVmYWN0b3IucHkgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQppbmRleCAwNzI4MDgzLi5iNjBiOWRlIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQorKysgYi9MaWIvbGliMnRvMy9yZWZhY3Rvci5weQpAQCAtMjYsNyArMjYsNiBAQAogZnJvbSAucGdlbjIgaW1wb3J0IGRyaXZlciwgdG9rZW5pemUsIHRva2VuCiBmcm9tIC5maXhlcl91dGlsIGltcG9ydCBmaW5kX3Jvb3QKIGZyb20gLiBpbXBvcnQgcHl0cmVlLCBweWdyYW0KLWZyb20gLiBpbXBvcnQgYnRtX3V0aWxzIGFzIGJ1CiBmcm9tIC4gaW1wb3J0IGJ0bV9tYXRjaGVyIGFzIGJtCiAKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5CmluZGV4IGMwYmY3ZjIuLmNmMzFhNTQgMTAwNjQ0Ci0tLSBhL0xpYi9saWIydG8zL3Rlc3RzL2RhdGEvcHkzX3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy9kYXRhL3B5M190ZXN0X2dyYW1tYXIucHkKQEAgLTMxOSw3ICszMTksNyBAQAogICAgICAgICBkZWYgZih4KSAtPiBsaXN0OiBwYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuX19hbm5vdGF0aW9uc19fLCB7J3JldHVybic6IGxpc3R9KQogCi0gICAgICAgICMgdGVzdCBNQUtFX0NMT1NVUkUgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmcncworICAgICAgICAjIHRlc3QgY2xvc3VyZXMgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmcncwogICAgICAgICBjbG9zdXJlID0gMQogICAgICAgICBkZWYgZigpOiByZXR1cm4gY2xvc3VyZQogICAgICAgICBkZWYgZih4PTEpOiByZXR1cm4gY2xvc3VyZQpkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkKaW5kZXggNmYyZDIxNC4uNzE1M2JiNiAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5CkBAIC0zLDEwICszLDggQEAKIAogIyBQeXRob24gaW1wb3J0cwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBvcy5wYXRoCi1pbXBvcnQgcmUKIGZyb20gdGV4dHdyYXAgaW1wb3J0IGRlZGVudAogCiAjIExvY2FsIGltcG9ydHMKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weSBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weQppbmRleCAxNTA3OWZlLi5jMDUwN2NmIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5CkBAIC0xMCw3ICsxMCw2IEBACiBpbXBvcnQgdGVzdC5zdXBwb3J0CiAKICMgTG9jYWwgaW1wb3J0cwotZnJvbSBsaWIydG8zIGltcG9ydCByZWZhY3RvcgogZnJvbSAuIGltcG9ydCBzdXBwb3J0CiAKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQppbmRleCAwNmIwMDMzLi5iOTdiNzNhIDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQpAQCAtMiwxMiArMiwxMSBAQAogCiAjIFB5dGhvbiBpbXBvcnRzCiBpbXBvcnQgb3MKLWltcG9ydCB1bml0dGVzdAogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluCiBmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCiAKICMgTG9jYWwgaW1wb3J0cwotZnJvbSBsaWIydG8zIGltcG9ydCBweWdyYW0sIHB5dHJlZSwgcmVmYWN0b3IsIGZpeGVyX3V0aWwKK2Zyb20gbGliMnRvMyBpbXBvcnQgcHlncmFtLCBmaXhlcl91dGlsCiBmcm9tIGxpYjJ0bzMudGVzdHMgaW1wb3J0IHN1cHBvcnQKIAogCkBAIC0zMzIyLDYgKzMzMjEsMTAgQEAKICAgICAgICAgYSA9ICIiInR5cGUoTm9uZSkiIiIKICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQogCisgICAgICAgIGIgPSAidHlwZXMuU3RyaW5nVHlwZXMiCisgICAgICAgIGEgPSAiKHN0ciwpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKIGNsYXNzIFRlc3RfaWRpb21zKEZpeGVyVGVzdENhc2UpOgogICAgIGZpeGVyID0gImlkaW9tcyIKIApkaWZmIC0tZ2l0IGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQppbmRleCBiNTMzYzAxLi4zNmViMTc2IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQorKysgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQpAQCAtMTAsMTIgKzEwLDExIEBACiAKICMgVGVzdGluZyBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKLWZyb20gLnN1cHBvcnQgaW1wb3J0IGRyaXZlciwgdGVzdF9kaXIKK2Zyb20gLnN1cHBvcnQgaW1wb3J0IGRyaXZlcgogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHZlcmJvc2UKIAogIyBQeXRob24gaW1wb3J0cwogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB3YXJuaW5ncwogaW1wb3J0IHN1YnByb2Nlc3MKZGlmZiAtLWdpdCBhL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKaW5kZXggNGQ1ODVhOC4uYTYxMWQxNyAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKKysrIGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKQEAgLTExLDkgKzExLDYgQEAKIAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAogCi1pbXBvcnQgc3lzCi1pbXBvcnQgd2FybmluZ3MKLQogIyBUZXN0aW5nIGltcG9ydHMKIGZyb20gLiBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5IGIvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQppbmRleCA4NTYzMDAxLi45NGRjMTM1IDEwMDY0NAotLS0gYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKQEAgLTcsMTkgKzcsMTUgQEAKIGltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IGNvZGVjcwotaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgaW8KIGltcG9ydCByZQogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwogCiBmcm9tIGxpYjJ0bzMgaW1wb3J0IHJlZmFjdG9yLCBweWdyYW0sIGZpeGVyX2Jhc2UKIGZyb20gbGliMnRvMy5wZ2VuMiBpbXBvcnQgdG9rZW4KIAotZnJvbSAuIGltcG9ydCBzdXBwb3J0Ci0KIAogVEVTVF9EQVRBX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZGF0YSIpCiBGSVhFUl9ESVIgPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImZpeGVycyIpCmRpZmYgLS1naXQgYS9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkgYi9MaWIvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkKaW5kZXggZDJiZTgyYy4uYzZjNjEzOSAxMDA2NDQKLS0tIGEvTGliL2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5CisrKyBiL0xpYi9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQpAQCAtMyw5ICszLDYgQEAKICMgVGVzdGluZyBpbXBvcnRzCiBmcm9tIC4gaW1wb3J0IHN1cHBvcnQKIAotIyBQeXRob24gaW1wb3J0cwotaW1wb3J0IG9zLnBhdGgKLQogIyBMb2NhbCBpbXBvcnRzCiBmcm9tIGxpYjJ0bzMucHl0cmVlIGltcG9ydCBOb2RlLCBMZWFmCiBmcm9tIGxpYjJ0bzMgaW1wb3J0IGZpeGVyX3V0aWwKZGlmZiAtLWdpdCBhL0xpYi9sb2NhbGUucHkgYi9MaWIvbG9jYWxlLnB5CmluZGV4IDZkNTljZDguLjRkZTAwOTAgMTAwNjQ0Ci0tLSBhL0xpYi9sb2NhbGUucHkKKysrIGIvTGliL2xvY2FsZS5weQpAQCAtMzAyLDEyICszMDIsMTYgQEAKIAogZGVmIGRlbG9jYWxpemUoc3RyaW5nKToKICAgICAiUGFyc2VzIGEgc3RyaW5nIGFzIGEgbm9ybWFsaXplZCBudW1iZXIgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUgc2V0dGluZ3MuIgorCisgICAgY29udiA9IGxvY2FsZWNvbnYoKQorCiAgICAgI0ZpcnN0LCBnZXQgcmlkIG9mIHRoZSBncm91cGluZwotICAgIHRzID0gbG9jYWxlY29udigpWyd0aG91c2FuZHNfc2VwJ10KKyAgICB0cyA9IGNvbnZbJ3Rob3VzYW5kc19zZXAnXQogICAgIGlmIHRzOgogICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZSh0cywgJycpCisKICAgICAjbmV4dCwgcmVwbGFjZSB0aGUgZGVjaW1hbCBwb2ludCB3aXRoIGEgZG90Ci0gICAgZGQgPSBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXQorICAgIGRkID0gY29udlsnZGVjaW1hbF9wb2ludCddCiAgICAgaWYgZGQ6CiAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGRkLCAnLicpCiAgICAgcmV0dXJuIHN0cmluZwpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkgYi9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQppbmRleCBhN2JkODkwLi5mOTQxZjQ4IDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQorKysgYi9MaWIvbG9nZ2luZy9fX2luaXRfXy5weQpAQCAtMzMsOCArMzMsOSBAQAogICAgICAgICAgICAnU3RyZWFtSGFuZGxlcicsICdXQVJOJywgJ1dBUk5JTkcnLCAnYWRkTGV2ZWxOYW1lJywgJ2Jhc2ljQ29uZmlnJywKICAgICAgICAgICAgJ2NhcHR1cmVXYXJuaW5ncycsICdjcml0aWNhbCcsICdkZWJ1ZycsICdkaXNhYmxlJywgJ2Vycm9yJywKICAgICAgICAgICAgJ2V4Y2VwdGlvbicsICdmYXRhbCcsICdnZXRMZXZlbE5hbWUnLCAnZ2V0TG9nZ2VyJywgJ2dldExvZ2dlckNsYXNzJywKLSAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnd2FybicsICd3YXJuaW5nJywKLSAgICAgICAgICAgJ2dldExvZ1JlY29yZEZhY3RvcnknLCAnc2V0TG9nUmVjb3JkRmFjdG9yeScsICdsYXN0UmVzb3J0J10KKyAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnc2h1dGRvd24nLAorICAgICAgICAgICAnd2FybicsICd3YXJuaW5nJywgJ2dldExvZ1JlY29yZEZhY3RvcnknLCAnc2V0TG9nUmVjb3JkRmFjdG9yeScsCisgICAgICAgICAgICdsYXN0UmVzb3J0JywgJ3JhaXNlRXhjZXB0aW9ucyddCiAKIHRyeToKICAgICBpbXBvcnQgdGhyZWFkaW5nCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weSBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CmluZGV4IGM5ZjgyMTcuLmMwNzQ4YTggMTAwNjQ0Ci0tLSBhL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CisrKyBiL0xpYi9sb2dnaW5nL2hhbmRsZXJzLnB5CkBAIC00NDAsMTEgKzQ0MCwxMSBAQAogICAgICAgICAgICAgc3JlcyA9IG9zLmZzdGF0KHNlbGYuc3RyZWFtLmZpbGVubygpKQogICAgICAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gc3Jlc1tTVF9ERVZdLCBzcmVzW1NUX0lOT10KIAotICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgZGVmIHJlb3BlbklmTmVlZGVkKHNlbGYpOgogICAgICAgICAiIiIKLSAgICAgICAgRW1pdCBhIHJlY29yZC4KKyAgICAgICAgUmVvcGVuIGxvZyBmaWxlIGlmIG5lZWRlZC4KIAotICAgICAgICBGaXJzdCBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCBhbmQgaWYgaXQKKyAgICAgICAgQ2hlY2tzIGlmIHRoZSB1bmRlcmx5aW5nIGZpbGUgaGFzIGNoYW5nZWQsIGFuZCBpZiBpdAogICAgICAgICBoYXMsIGNsb3NlIHRoZSBvbGQgc3RyZWFtIGFuZCByZW9wZW4gdGhlIGZpbGUgdG8gZ2V0IHRoZQogICAgICAgICBjdXJyZW50IHN0cmVhbS4KICAgICAgICAgIiIiCkBAIC00NjcsNiArNDY3LDE1IEBACiAgICAgICAgICAgICAgICAgIyBvcGVuIGEgbmV3IGZpbGUgaGFuZGxlIGFuZCBnZXQgbmV3IHN0YXQgaW5mbyBmcm9tIHRoYXQgZmQKICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQogICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRzdHJlYW0oKQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgSWYgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCByZW9wZW4gdGhlIGZpbGUgYmVmb3JlIGVtaXR0aW5nIHRoZQorICAgICAgICByZWNvcmQgdG8gaXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlb3BlbklmTmVlZGVkKCkKICAgICAgICAgbG9nZ2luZy5GaWxlSGFuZGxlci5lbWl0KHNlbGYsIHJlY29yZCkKIAogCmRpZmYgLS1naXQgYS9MaWIvbWFpbGJveC5weSBiL0xpYi9tYWlsYm94LnB5CmluZGV4IDAyNzBlMjUuLjBlMjM5ODcgMTAwNjQ0Ci0tLSBhL0xpYi9tYWlsYm94LnB5CisrKyBiL0xpYi9tYWlsYm94LnB5CkBAIC0yMyw5ICsyMywxMCBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGZjbnRsID0gTm9uZQogCi1fX2FsbF9fID0gWyAnTWFpbGJveCcsICdNYWlsZGlyJywgJ21ib3gnLCAnTUgnLCAnQmFieWwnLCAnTU1ERicsCi0gICAgICAgICAgICAnTWVzc2FnZScsICdNYWlsZGlyTWVzc2FnZScsICdtYm94TWVzc2FnZScsICdNSE1lc3NhZ2UnLAotICAgICAgICAgICAgJ0JhYnlsTWVzc2FnZScsICdNTURGTWVzc2FnZSddCitfX2FsbF9fID0gWydNYWlsYm94JywgJ01haWxkaXInLCAnbWJveCcsICdNSCcsICdCYWJ5bCcsICdNTURGJywKKyAgICAgICAgICAgJ01lc3NhZ2UnLCAnTWFpbGRpck1lc3NhZ2UnLCAnbWJveE1lc3NhZ2UnLCAnTUhNZXNzYWdlJywKKyAgICAgICAgICAgJ0JhYnlsTWVzc2FnZScsICdNTURGTWVzc2FnZScsICdFcnJvcicsICdOb1N1Y2hNYWlsYm94RXJyb3InLAorICAgICAgICAgICAnTm90RW1wdHlFcnJvcicsICdFeHRlcm5hbENsYXNoRXJyb3InLCAnRm9ybWF0RXJyb3InXQogCiBsaW5lc2VwID0gb3MubGluZXNlcC5lbmNvZGUoJ2FzY2lpJykKIApkaWZmIC0tZ2l0IGEvTGliL21pbWV0eXBlcy5weSBiL0xpYi9taW1ldHlwZXMucHkKaW5kZXggMGJlNzZhZC4uOWE4ODY4MCAxMDA2NDQKLS0tIGEvTGliL21pbWV0eXBlcy5weQorKysgYi9MaWIvbWltZXR5cGVzLnB5CkBAIC0zMyw4ICszMywxMCBAQAogICAgIF93aW5yZWcgPSBOb25lCiAKIF9fYWxsX18gPSBbCi0gICAgImd1ZXNzX3R5cGUiLCJndWVzc19leHRlbnNpb24iLCJndWVzc19hbGxfZXh0ZW5zaW9ucyIsCi0gICAgImFkZF90eXBlIiwicmVhZF9taW1lX3R5cGVzIiwiaW5pdCIKKyAgICAia25vd25maWxlcyIsICJpbml0ZWQiLCAiTWltZVR5cGVzIiwKKyAgICAiZ3Vlc3NfdHlwZSIsICJndWVzc19hbGxfZXh0ZW5zaW9ucyIsICJndWVzc19leHRlbnNpb24iLAorICAgICJhZGRfdHlwZSIsICJpbml0IiwgInJlYWRfbWltZV90eXBlcyIsCisgICAgInN1ZmZpeF9tYXAiLCAiZW5jb2RpbmdzX21hcCIsICJ0eXBlc19tYXAiLCAiY29tbW9uX3R5cGVzIgogXQogCiBrbm93bmZpbGVzID0gWwpkaWZmIC0tZ2l0IGEvTGliL21vZHVsZWZpbmRlci5weSBiL0xpYi9tb2R1bGVmaW5kZXIucHkKaW5kZXggODEwMzUwMi4uZTIyMDMxNSAxMDA2NDQKLS0tIGEvTGliL21vZHVsZWZpbmRlci5weQorKysgYi9MaWIvbW9kdWxlZmluZGVyLnB5CkBAIC0xMCw3ICsxMCw3IEBACiBpbXBvcnQgc3RydWN0CiBpbXBvcnQgd2FybmluZ3MKIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgaW1wb3J0IGltcAogCiBMT0FEX0NPTlNUID0gZGlzLm9wbWFwWydMT0FEX0NPTlNUJ10KQEAgLTMzNiw4ICszMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBuYW1lICsgIi4iICsgc3ViCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9hZGRfYmFkbW9kdWxlKGZ1bGxuYW1lLCBjYWxsZXIpCiAKLSAgICBkZWYgc2Nhbl9vcGNvZGVzXzI1KHNlbGYsIGNvLAotICAgICAgICAgICAgICAgICAgICAgdW5wYWNrID0gc3RydWN0LnVucGFjayk6CisgICAgZGVmIHNjYW5fb3Bjb2RlcyhzZWxmLCBjbyk6CiAgICAgICAgICMgU2NhbiB0aGUgY29kZSwgYW5kIHlpZWxkICdpbnRlcmVzdGluZycgb3Bjb2RlIGNvbWJpbmF0aW9ucwogICAgICAgICBjb2RlID0gY28uY29fY29kZQogICAgICAgICBuYW1lcyA9IGNvLmNvX25hbWVzCkBAIC0zNjAsNyArMzU5LDcgQEAKIAogICAgIGRlZiBzY2FuX2NvZGUoc2VsZiwgY28sIG0pOgogICAgICAgICBjb2RlID0gY28uY29fY29kZQotICAgICAgICBzY2FubmVyID0gc2VsZi5zY2FuX29wY29kZXNfMjUKKyAgICAgICAgc2Nhbm5lciA9IHNlbGYuc2Nhbl9vcGNvZGVzCiAgICAgICAgIGZvciB3aGF0LCBhcmdzIGluIHNjYW5uZXIoY28pOgogICAgICAgICAgICAgaWYgd2hhdCA9PSAic3RvcmUiOgogICAgICAgICAgICAgICAgIG5hbWUsID0gYXJncwpkaWZmIC0tZ2l0IGEvTGliL21zaWxpYi9fX2luaXRfXy5weSBiL0xpYi9tc2lsaWIvX19pbml0X18ucHkKaW5kZXggNmQwYTI4Zi4uODIzNjQ0YSAxMDA2NDQKLS0tIGEvTGliL21zaWxpYi9fX2luaXRfXy5weQorKysgYi9MaWIvbXNpbGliL19faW5pdF9fLnB5CkBAIC0xLDcgKzEsNyBAQAogIyBDb3B5cmlnaHQgKEMpIDIwMDUgTWFydGluIHYuIEzDtndpcwogIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCiBmcm9tIF9tc2kgaW1wb3J0ICoKLWltcG9ydCBnbG9iCitpbXBvcnQgZm5tYXRjaAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBzdHJpbmcKQEAgLTM3OSw3ICszNzksMTMgQEAKICAgICBkZWYgZ2xvYihzZWxmLCBwYXR0ZXJuLCBleGNsdWRlID0gTm9uZSk6CiAgICAgICAgICIiIkFkZCBhIGxpc3Qgb2YgZmlsZXMgdG8gdGhlIGN1cnJlbnQgY29tcG9uZW50IGFzIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICAgZ2xvYiBwYXR0ZXJuLiBJbmRpdmlkdWFsIGZpbGVzIGNhbiBiZSBleGNsdWRlZCBpbiB0aGUgZXhjbHVkZSBsaXN0LiIiIgotICAgICAgICBmaWxlcyA9IGdsb2IuZ2xvYjEoc2VsZi5hYnNvbHV0ZSwgcGF0dGVybikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKHNlbGYuYWJzb2x1dGUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGlmIHBhdHRlcm5bOjFdICE9ICcuJzoKKyAgICAgICAgICAgIGZpbGVzID0gKGYgZm9yIGYgaW4gZmlsZXMgaWYgZlswXSAhPSAnLicpCisgICAgICAgIGZpbGVzID0gZm5tYXRjaC5maWx0ZXIoZmlsZXMsIHBhdHRlcm4pCiAgICAgICAgIGZvciBmIGluIGZpbGVzOgogICAgICAgICAgICAgaWYgZXhjbHVkZSBhbmQgZiBpbiBleGNsdWRlOiBjb250aW51ZQogICAgICAgICAgICAgc2VsZi5hZGRfZmlsZShmKQpkaWZmIC0tZ2l0IGEvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5IGIvTGliL211bHRpcHJvY2Vzc2luZy9wb29sLnB5CmluZGV4IDZkMjU0NjkuLmZmZGY0MjYgMTAwNjQ0Ci0tLSBhL0xpYi9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weQorKysgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkKQEAgLTYzOCwyMiArNjM4LDI2IEBACiAgICAgICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCA9IGxlbmd0aC8vY2h1bmtzaXplICsgYm9vbChsZW5ndGggJSBjaHVua3NpemUpCiAKICAgICBkZWYgX3NldChzZWxmLCBpLCBzdWNjZXNzX3Jlc3VsdCk6CisgICAgICAgIHNlbGYuX251bWJlcl9sZWZ0IC09IDEKICAgICAgICAgc3VjY2VzcywgcmVzdWx0ID0gc3VjY2Vzc19yZXN1bHQKLSAgICAgICAgaWYgc3VjY2VzczoKKyAgICAgICAgaWYgc3VjY2VzcyBhbmQgc2VsZi5fc3VjY2VzczoKICAgICAgICAgICAgIHNlbGYuX3ZhbHVlW2kqc2VsZi5fY2h1bmtzaXplOihpKzEpKnNlbGYuX2NodW5rc2l6ZV0gPSByZXN1bHQKLSAgICAgICAgICAgIHNlbGYuX251bWJlcl9sZWZ0IC09IDEKICAgICAgICAgICAgIGlmIHNlbGYuX251bWJlcl9sZWZ0ID09IDA6CiAgICAgICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrKHNlbGYuX3ZhbHVlKQogICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCiAgICAgICAgICAgICAgICAgc2VsZi5fZXZlbnQuc2V0KCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuX3N1Y2Nlc3MgPSBGYWxzZQotICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSByZXN1bHQKLSAgICAgICAgICAgIGlmIHNlbGYuX2Vycm9yX2NhbGxiYWNrOgotICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9yX2NhbGxiYWNrKHNlbGYuX3ZhbHVlKQotICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KLSAgICAgICAgICAgIHNlbGYuX2V2ZW50LnNldCgpCisgICAgICAgICAgICBpZiBub3Qgc3VjY2VzcyBhbmQgc2VsZi5fc3VjY2VzczoKKyAgICAgICAgICAgICAgICAjIG9ubHkgc3RvcmUgZmlyc3QgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgc2VsZi5fc3VjY2VzcyA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSByZXN1bHQKKyAgICAgICAgICAgIGlmIHNlbGYuX251bWJlcl9sZWZ0ID09IDA6CisgICAgICAgICAgICAgICAgIyBvbmx5IGNvbnNpZGVyIHRoZSByZXN1bHQgcmVhZHkgb25jZSBhbGwgam9icyBhcmUgZG9uZQorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2Vycm9yX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9lcnJvcl9jYWxsYmFjayhzZWxmLl92YWx1ZSkKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fY2FjaGVbc2VsZi5fam9iXQorICAgICAgICAgICAgICAgIHNlbGYuX2V2ZW50LnNldCgpCiAKICMKICMgQ2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCBieSBgUG9vbC5pbWFwKClgCmRpZmYgLS1naXQgYS9MaWIvb3Bjb2RlLnB5IGIvTGliL29wY29kZS5weQppbmRleCA0YzgyNmE3Li4wNjQwODE5IDEwMDY0NAotLS0gYS9MaWIvb3Bjb2RlLnB5CisrKyBiL0xpYi9vcGNvZGUucHkKQEAgLTM0LDkgKzM0LDcgQEAKIGhhc25hcmdzID0gW10KIAogb3BtYXAgPSB7fQotb3BuYW1lID0gWycnXSAqIDI1NgotZm9yIG9wIGluIHJhbmdlKDI1Nik6IG9wbmFtZVtvcF0gPSAnPCVyPicgJSAob3AsKQotZGVsIG9wCitvcG5hbWUgPSBbJzwlcj4nICUgKG9wLCkgZm9yIG9wIGluIHJhbmdlKDI1NildCiAKIGRlZiBkZWZfb3AobmFtZSwgb3ApOgogICAgIG9wbmFtZVtvcF0gPSBuYW1lCkBAIC0xNzUsOSArMTczLDggQEAKIGRlZl9vcCgnUkFJU0VfVkFSQVJHUycsIDEzMCkgICAgIyBOdW1iZXIgb2YgcmFpc2UgYXJndW1lbnRzICgxLCAyLCBvciAzKQogZGVmX29wKCdDQUxMX0ZVTkNUSU9OJywgMTMxKSAgICAjICNhcmdzICsgKCNrd2FyZ3MgPDwgOCkKIGhhc25hcmdzLmFwcGVuZCgxMzEpCi1kZWZfb3AoJ01BS0VfRlVOQ1RJT04nLCAxMzIpICAgICMgTnVtYmVyIG9mIGFyZ3Mgd2l0aCBkZWZhdWx0IHZhbHVlcworZGVmX29wKCdNQUtFX0ZVTkNUSU9OJywgMTMyKSAgICAjIEZsYWdzCiBkZWZfb3AoJ0JVSUxEX1NMSUNFJywgMTMzKSAgICAgICMgTnVtYmVyIG9mIGl0ZW1zCi1kZWZfb3AoJ01BS0VfQ0xPU1VSRScsIDEzNCkKIGRlZl9vcCgnTE9BRF9DTE9TVVJFJywgMTM1KQogaGFzZnJlZS5hcHBlbmQoMTM1KQogZGVmX29wKCdMT0FEX0RFUkVGJywgMTM2KQpAQCAtMjE0LDQgKzIxMSw3IEBACiBkZWZfb3AoJ0JVSUxEX1RVUExFX1VOUEFDSycsIDE1MikKIGRlZl9vcCgnQlVJTERfU0VUX1VOUEFDSycsIDE1MykKIAorZGVmX29wKCdGT1JNQVRfVkFMVUUnLCAxNTUpCitkZWZfb3AoJ0JVSUxEX0NPTlNUX0tFWV9NQVAnLCAxNTYpCisKIGRlbCBkZWZfb3AsIG5hbWVfb3AsIGpyZWxfb3AsIGphYnNfb3AKZGlmZiAtLWdpdCBhL0xpYi9vcHRwYXJzZS5weSBiL0xpYi9vcHRwYXJzZS5weQppbmRleCA3NGIzYjM2Li5lOGFjMWUxIDEwMDY0NAotLS0gYS9MaWIvb3B0cGFyc2UucHkKKysrIGIvTGliL29wdHBhcnNlLnB5CkBAIC0zOCw3ICszOCw4IEBACiAgICAgICAgICAgICdPcHRpb25FcnJvcicsCiAgICAgICAgICAgICdPcHRpb25Db25mbGljdEVycm9yJywKICAgICAgICAgICAgJ09wdGlvblZhbHVlRXJyb3InLAotICAgICAgICAgICAnQmFkT3B0aW9uRXJyb3InXQorICAgICAgICAgICAnQmFkT3B0aW9uRXJyb3InLAorICAgICAgICAgICAnY2hlY2tfY2hvaWNlJ10KIAogX19jb3B5cmlnaHRfXyA9ICIiIgogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYgR3JlZ29yeSBQLiBXYXJkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KZGlmZiAtLWdpdCBhL0xpYi9vcy5weSBiL0xpYi9vcy5weQppbmRleCBiNGM2NTFkLi5jMzFlY2IyIDEwMDY0NAotLS0gYS9MaWIvb3MucHkKKysrIGIvTGliL29zLnB5CkBAIC0yMiw3ICsyMiw3IEBACiAiIiIKIAogIycKLQoraW1wb3J0IGFiYwogaW1wb3J0IHN5cywgZXJybm8KIGltcG9ydCBzdGF0IGFzIHN0CiAKQEAgLTM1Niw2ICszNTYsNyBAQAogCiAgICAgZGlycyA9IFtdCiAgICAgbm9uZGlycyA9IFtdCisgICAgd2Fsa19kaXJzID0gW10KIAogICAgICMgV2UgbWF5IG5vdCBoYXZlIHJlYWQgcGVybWlzc2lvbiBmb3IgdG9wLCBpbiB3aGljaCBjYXNlIHdlIGNhbid0CiAgICAgIyBnZXQgYSBsaXN0IG9mIHRoZSBmaWxlcyB0aGUgZGlyZWN0b3J5IGNvbnRhaW5zLiAgb3Mud2FsawpAQCAtMzY5LDQyICszNzAsNTIgQEAKICAgICAgICAgICAgICMgTm90ZSB0aGF0IHNjYW5kaXIgaXMgZ2xvYmFsIGluIHRoaXMgbW9kdWxlIGR1ZQogICAgICAgICAgICAgIyB0byBlYXJsaWVyIGltcG9ydC0qLgogICAgICAgICAgICAgc2NhbmRpcl9pdCA9IHNjYW5kaXIodG9wKQotICAgICAgICBlbnRyaWVzID0gbGlzdChzY2FuZGlyX2l0KQogICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycm9yOgogICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgb25lcnJvcihlcnJvcikKICAgICAgICAgcmV0dXJuCiAKLSAgICBmb3IgZW50cnkgaW4gZW50cmllczoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaXNfZGlyID0gZW50cnkuaXNfZGlyKCkKLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAjIElmIGlzX2RpcigpIHJhaXNlcyBhbiBPU0Vycm9yLCBjb25zaWRlciB0aGF0IHRoZSBlbnRyeSBpcyBub3QKLSAgICAgICAgICAgICMgYSBkaXJlY3RvcnksIHNhbWUgYmVoYXZpb3VyIHRoYW4gb3MucGF0aC5pc2RpcigpLgotICAgICAgICAgICAgaXNfZGlyID0gRmFsc2UKLQotICAgICAgICBpZiBpc19kaXI6Ci0gICAgICAgICAgICBkaXJzLmFwcGVuZChlbnRyeS5uYW1lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbm9uZGlycy5hcHBlbmQoZW50cnkubmFtZSkKLQotICAgICAgICBpZiBub3QgdG9wZG93biBhbmQgaXNfZGlyOgotICAgICAgICAgICAgIyBCb3R0b20tdXA6IHJlY3Vyc2UgaW50byBzdWItZGlyZWN0b3J5LCBidXQgZXhjbHVkZSBzeW1saW5rcyB0bwotICAgICAgICAgICAgIyBkaXJlY3RvcmllcyBpZiBmb2xsb3dsaW5rcyBpcyBGYWxzZQotICAgICAgICAgICAgaWYgZm9sbG93bGlua3M6Ci0gICAgICAgICAgICAgICAgd2Fsa19pbnRvID0gVHJ1ZQotICAgICAgICAgICAgZWxzZToKKyAgICB3aXRoIHNjYW5kaXJfaXQ6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gZW50cnkuaXNfc3ltbGluaygpCi0gICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICMgSWYgaXNfc3ltbGluaygpIHJhaXNlcyBhbiBPU0Vycm9yLCBjb25zaWRlciB0aGF0IHRoZQotICAgICAgICAgICAgICAgICAgICAjIGVudHJ5IGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIHNhbWUgYmVoYXZpb3VyIHRoYW4KLSAgICAgICAgICAgICAgICAgICAgIyBvcy5wYXRoLmlzbGluaygpLgotICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gRmFsc2UKLSAgICAgICAgICAgICAgICB3YWxrX2ludG8gPSBub3QgaXNfc3ltbGluaworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IG5leHQoc2NhbmRpcl9pdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycm9yOgorICAgICAgICAgICAgICAgIGlmIG9uZXJyb3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IoZXJyb3IpCisgICAgICAgICAgICAgICAgcmV0dXJuCiAKLSAgICAgICAgICAgIGlmIHdhbGtfaW50bzoKLSAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHdhbGsoZW50cnkucGF0aCwgdG9wZG93biwgb25lcnJvciwgZm9sbG93bGlua3MpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXNfZGlyID0gZW50cnkuaXNfZGlyKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICMgSWYgaXNfZGlyKCkgcmFpc2VzIGFuIE9TRXJyb3IsIGNvbnNpZGVyIHRoYXQgdGhlIGVudHJ5IGlzIG5vdAorICAgICAgICAgICAgICAgICMgYSBkaXJlY3RvcnksIHNhbWUgYmVoYXZpb3VyIHRoYW4gb3MucGF0aC5pc2RpcigpLgorICAgICAgICAgICAgICAgIGlzX2RpciA9IEZhbHNlCisKKyAgICAgICAgICAgIGlmIGlzX2RpcjoKKyAgICAgICAgICAgICAgICBkaXJzLmFwcGVuZChlbnRyeS5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub25kaXJzLmFwcGVuZChlbnRyeS5uYW1lKQorCisgICAgICAgICAgICBpZiBub3QgdG9wZG93biBhbmQgaXNfZGlyOgorICAgICAgICAgICAgICAgICMgQm90dG9tLXVwOiByZWN1cnNlIGludG8gc3ViLWRpcmVjdG9yeSwgYnV0IGV4Y2x1ZGUgc3ltbGlua3MgdG8KKyAgICAgICAgICAgICAgICAjIGRpcmVjdG9yaWVzIGlmIGZvbGxvd2xpbmtzIGlzIEZhbHNlCisgICAgICAgICAgICAgICAgaWYgZm9sbG93bGlua3M6CisgICAgICAgICAgICAgICAgICAgIHdhbGtfaW50byA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBpc19zeW1saW5rID0gZW50cnkuaXNfc3ltbGluaygpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiBpc19zeW1saW5rKCkgcmFpc2VzIGFuIE9TRXJyb3IsIGNvbnNpZGVyIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGVudHJ5IGlzIG5vdCBhIHN5bWJvbGljIGxpbmssIHNhbWUgYmVoYXZpb3VyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgb3MucGF0aC5pc2xpbmsoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N5bWxpbmsgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICB3YWxrX2ludG8gPSBub3QgaXNfc3ltbGluaworCisgICAgICAgICAgICAgICAgaWYgd2Fsa19pbnRvOgorICAgICAgICAgICAgICAgICAgICB3YWxrX2RpcnMuYXBwZW5kKGVudHJ5LnBhdGgpCiAKICAgICAjIFlpZWxkIGJlZm9yZSByZWN1cnNpb24gaWYgZ29pbmcgdG9wIGRvd24KICAgICBpZiB0b3Bkb3duOgpAQCAtNDIxLDYgKzQzMiw5IEBACiAgICAgICAgICAgICBpZiBmb2xsb3dsaW5rcyBvciBub3QgaXNsaW5rKG5ld19wYXRoKToKICAgICAgICAgICAgICAgICB5aWVsZCBmcm9tIHdhbGsobmV3X3BhdGgsIHRvcGRvd24sIG9uZXJyb3IsIGZvbGxvd2xpbmtzKQogICAgIGVsc2U6CisgICAgICAgICMgUmVjdXJzZSBpbnRvIHN1Yi1kaXJlY3RvcmllcworICAgICAgICBmb3IgbmV3X3BhdGggaW4gd2Fsa19kaXJzOgorICAgICAgICAgICAgeWllbGQgZnJvbSB3YWxrKG5ld19wYXRoLCB0b3Bkb3duLCBvbmVycm9yLCBmb2xsb3dsaW5rcykKICAgICAgICAgIyBZaWVsZCBhZnRlciByZWN1cnNpb24gaWYgZ29pbmcgYm90dG9tIHVwCiAgICAgICAgIHlpZWxkIHRvcCwgZGlycywgbm9uZGlycwogCkBAIC00NjcsMTAgKzQ4MSwyMyBAQAogICAgICAgICBzdGF0ID0gc2VsZi5zdGF0KGZvbGxvd19zeW1saW5rcz1GYWxzZSkKICAgICAgICAgcmV0dXJuIHN0LlNfSVNMTksoc3RhdC5zdF9tb2RlKQogCi1kZWYgX2R1bW15X3NjYW5kaXIoZGlyKToKK2NsYXNzIF9kdW1teV9zY2FuZGlyOgogICAgICMgbGlzdGRpci1iYXNlZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnl0ZXMgcGF0Y2hlcyBvbiBXaW5kb3dzCi0gICAgZm9yIG5hbWUgaW4gbGlzdGRpcihkaXIpOgotICAgICAgICB5aWVsZCBfRHVtbXlEaXJFbnRyeShkaXIsIG5hbWUpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpcik6CisgICAgICAgIHNlbGYuZGlyID0gZGlyCisgICAgICAgIHNlbGYuaXQgPSBpdGVyKGxpc3RkaXIoZGlyKSkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIF9EdW1teURpckVudHJ5KHNlbGYuZGlyLCBuZXh0KHNlbGYuaXQpKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuaXQgPSBpdGVyKCgpKQogCiBfX2FsbF9fLmFwcGVuZCgid2FsayIpCiAKQEAgLTg0OSwzMCArODc2LDI4IEBACiAgICAgICAgIGVycm9ycyA9ICdzdXJyb2dhdGVlc2NhcGUnCiAKICAgICBkZWYgZnNlbmNvZGUoZmlsZW5hbWUpOgorICAgICAgICAiIiJFbmNvZGUgZmlsZW5hbWUgKGFuIG9zLlBhdGhMaWtlLCBieXRlcywgb3Igc3RyKSB0byB0aGUgZmlsZXN5c3RlbQorICAgICAgICBlbmNvZGluZyB3aXRoICdzdXJyb2dhdGVlc2NhcGUnIGVycm9yIGhhbmRsZXIsIHJldHVybiBieXRlcyB1bmNoYW5nZWQuCisgICAgICAgIE9uIFdpbmRvd3MsIHVzZSAnc3RyaWN0JyBlcnJvciBoYW5kbGVyIGlmIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBpcworICAgICAgICAnbWJjcycgKHdoaWNoIGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nKS4KICAgICAgICAgIiIiCi0gICAgICAgIEVuY29kZSBmaWxlbmFtZSB0byB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZyB3aXRoICdzdXJyb2dhdGVlc2NhcGUnIGVycm9yCi0gICAgICAgIGhhbmRsZXIsIHJldHVybiBieXRlcyB1bmNoYW5nZWQuIE9uIFdpbmRvd3MsIHVzZSAnc3RyaWN0JyBlcnJvciBoYW5kbGVyIGlmCi0gICAgICAgIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBpcyAnbWJjcycgKHdoaWNoIGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nKS4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKLSAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQotICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHN0cik6CisgICAgICAgIGZpbGVuYW1lID0gZnNwYXRoKGZpbGVuYW1lKSAgIyBEb2VzIHR5cGUtY2hlY2tpbmcgb2YgYGZpbGVuYW1lYC4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgc3RyKToKICAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0IGJ5dGVzIG9yIHN0ciwgbm90ICVzIiAlIHR5cGUoZmlsZW5hbWUpLl9fbmFtZV9fKQorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAKICAgICBkZWYgZnNkZWNvZGUoZmlsZW5hbWUpOgorICAgICAgICAiIiJEZWNvZGUgZmlsZW5hbWUgKGFuIG9zLlBhdGhMaWtlLCBieXRlcywgb3Igc3RyKSBmcm9tIHRoZSBmaWxlc3lzdGVtCisgICAgICAgIGVuY29kaW5nIHdpdGggJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IgaGFuZGxlciwgcmV0dXJuIHN0ciB1bmNoYW5nZWQuIE9uCisgICAgICAgIFdpbmRvd3MsIHVzZSAnc3RyaWN0JyBlcnJvciBoYW5kbGVyIGlmIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBpcworICAgICAgICAnbWJjcycgKHdoaWNoIGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nKS4KICAgICAgICAgIiIiCi0gICAgICAgIERlY29kZSBmaWxlbmFtZSBmcm9tIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nIHdpdGggJ3N1cnJvZ2F0ZWVzY2FwZScgZXJyb3IKLSAgICAgICAgaGFuZGxlciwgcmV0dXJuIHN0ciB1bmNoYW5nZWQuIE9uIFdpbmRvd3MsIHVzZSAnc3RyaWN0JyBlcnJvciBoYW5kbGVyIGlmCi0gICAgICAgIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBpcyAnbWJjcycgKHdoaWNoIGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nKS4KLSAgICAgICAgIiIiCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHN0cik6Ci0gICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CisgICAgICAgIGZpbGVuYW1lID0gZnNwYXRoKGZpbGVuYW1lKSAgIyBEb2VzIHR5cGUtY2hlY2tpbmcgb2YgYGZpbGVuYW1lYC4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgYnl0ZXMpOgogICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmRlY29kZShlbmNvZGluZywgZXJyb3JzKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUgdHlwZShmaWxlbmFtZSkuX19uYW1lX18pCisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKIAogICAgIHJldHVybiBmc2VuY29kZSwgZnNkZWNvZGUKIApAQCAtMTA3MCwzICsxMDk1LDU1IEBACiAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBmZCB0eXBlICglcywgZXhwZWN0ZWQgaW50ZWdlcikiICUgdHlwZShmZCkpCiAgICAgaW1wb3J0IGlvCiAgICAgcmV0dXJuIGlvLm9wZW4oZmQsICphcmdzLCAqKmt3YXJncykKKworCisjIEZvciB0ZXN0aW5nIHB1cnBvc2VzLCBtYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSB3aGVuIHRoZSBDCisjIGltcGxlbWVudGF0aW9uIGV4aXN0cy4KK2RlZiBfZnNwYXRoKHBhdGgpOgorICAgICIiIlJldHVybiB0aGUgcGF0aCByZXByZXNlbnRhdGlvbiBvZiBhIHBhdGgtbGlrZSBvYmplY3QuCisKKyAgICBJZiBzdHIgb3IgYnl0ZXMgaXMgcGFzc2VkIGluLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuIE90aGVyd2lzZSB0aGUKKyAgICBvcy5QYXRoTGlrZSBpbnRlcmZhY2UgaXMgdXNlZCB0byBnZXQgdGhlIHBhdGggcmVwcmVzZW50YXRpb24uIElmIHRoZQorICAgIHBhdGggcmVwcmVzZW50YXRpb24gaXMgbm90IHN0ciBvciBieXRlcywgVHlwZUVycm9yIGlzIHJhaXNlZC4gSWYgdGhlCisgICAgcHJvdmlkZWQgcGF0aCBpcyBub3Qgc3RyLCBieXRlcywgb3Igb3MuUGF0aExpa2UsIFR5cGVFcnJvciBpcyByYWlzZWQuCisgICAgIiIiCisgICAgaWYgaXNpbnN0YW5jZShwYXRoLCAoc3RyLCBieXRlcykpOgorICAgICAgICByZXR1cm4gcGF0aAorCisgICAgIyBXb3JrIGZyb20gdGhlIG9iamVjdCdzIHR5cGUgdG8gbWF0Y2ggbWV0aG9kIHJlc29sdXRpb24gb2Ygb3RoZXIgbWFnaWMKKyAgICAjIG1ldGhvZHMuCisgICAgcGF0aF90eXBlID0gdHlwZShwYXRoKQorICAgIHRyeToKKyAgICAgICAgcGF0aF9yZXByID0gcGF0aF90eXBlLl9fZnNwYXRoX18ocGF0aCkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIGlmIGhhc2F0dHIocGF0aF90eXBlLCAnX19mc3BhdGhfXycpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0ZWQgc3RyLCBieXRlcyBvciBvcy5QYXRoTGlrZSBvYmplY3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICIgKyBwYXRoX3R5cGUuX19uYW1lX18pCisgICAgaWYgaXNpbnN0YW5jZShwYXRoX3JlcHIsIChzdHIsIGJ5dGVzKSk6CisgICAgICAgIHJldHVybiBwYXRoX3JlcHIKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdGVkIHt9Ll9fZnNwYXRoX18oKSB0byByZXR1cm4gc3RyIG9yIGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAibm90IHt9Ii5mb3JtYXQocGF0aF90eXBlLl9fbmFtZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUocGF0aF9yZXByKS5fX25hbWVfXykpCisKKyMgSWYgdGhlcmUgaXMgbm8gQyBpbXBsZW1lbnRhdGlvbiwgbWFrZSB0aGUgcHVyZSBQeXRob24gdmVyc2lvbiB0aGUKKyMgaW1wbGVtZW50YXRpb24gYXMgdHJhbnNwYXJlbnRseSBhcyBwb3NzaWJsZS4KK2lmIG5vdCBfZXhpc3RzKCdmc3BhdGgnKToKKyAgICBmc3BhdGggPSBfZnNwYXRoCisgICAgZnNwYXRoLl9fbmFtZV9fID0gImZzcGF0aCIKKworCitjbGFzcyBQYXRoTGlrZShhYmMuQUJDKToKKworICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyB0aGUgZmlsZSBzeXN0ZW0gcGF0aCBwcm90b2NvbC4iIiIKKworICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgc3ViY2xhc3MpOgorICAgICAgICByZXR1cm4gaGFzYXR0cihzdWJjbGFzcywgJ19fZnNwYXRoX18nKQpkaWZmIC0tZ2l0IGEvTGliL3BhdGhsaWIucHkgYi9MaWIvcGF0aGxpYi5weQppbmRleCAxNDgwZTJmLi5hMDY2NzZmIDEwMDY0NAotLS0gYS9MaWIvcGF0aGxpYi5weQorKysgYi9MaWIvcGF0aGxpYi5weQpAQCAtNjM0LDEzICs2MzQsMTYgQEAKICAgICAgICAgZm9yIGEgaW4gYXJnczoKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgUHVyZVBhdGgpOgogICAgICAgICAgICAgICAgIHBhcnRzICs9IGEuX3BhcnRzCi0gICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYSwgc3RyKToKLSAgICAgICAgICAgICAgICAjIEZvcmNlLWNhc3Qgc3RyIHN1YmNsYXNzZXMgdG8gc3RyIChpc3N1ZSAjMjExMjcpCi0gICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHN0cihhKSkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAotICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgc2hvdWxkIGJlIGEgcGF0aCBvciBzdHIgb2JqZWN0LCBub3QgJXIiCi0gICAgICAgICAgICAgICAgICAgICUgdHlwZShhKSkKKyAgICAgICAgICAgICAgICBhID0gb3MuZnNwYXRoKGEpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCBzdHIpOgorICAgICAgICAgICAgICAgICAgICAjIEZvcmNlLWNhc3Qgc3RyIHN1YmNsYXNzZXMgdG8gc3RyIChpc3N1ZSAjMjExMjcpCisgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoYSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHNob3VsZCBiZSBhIHN0ciBvYmplY3Qgb3IgYW4gb3MuUGF0aExpa2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5pbmcgc3RyLCBub3QgJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAlIHR5cGUoYSkpCiAgICAgICAgIHJldHVybiBjbHMuX2ZsYXZvdXIucGFyc2VfcGFydHMocGFydHMpCiAKICAgICBAY2xhc3NtZXRob2QKQEAgLTY5Myw2ICs2OTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJ0cykgb3IgJy4nCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3RyCiAKKyAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmKQorCiAgICAgZGVmIGFzX3Bvc2l4KHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aCB3aXRoIGZvcndhcmQgKC8pCiAgICAgICAgIHNsYXNoZXMuIiIiCkBAIC05NDMsNiArOTQ5LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIHJldHVybiBUcnVlCiAKKyMgQ2FuJ3Qgc3ViY2xhc3Mgb3MuUGF0aExpa2UgZnJvbSBQdXJlUGF0aCBhbmQga2VlcCB0aGUgY29uc3RydWN0b3IKKyMgb3B0aW1pemF0aW9ucyBpbiBQdXJlUGF0aC5fcGFyc2VfYXJncygpLgorb3MuUGF0aExpa2UucmVnaXN0ZXIoUHVyZVBhdGgpCisKIAogY2xhc3MgUHVyZVBvc2l4UGF0aChQdXJlUGF0aCk6CiAgICAgX2ZsYXZvdXIgPSBfcG9zaXhfZmxhdm91cgpkaWZmIC0tZ2l0IGEvTGliL3BpY2tsZS5weSBiL0xpYi9waWNrbGUucHkKaW5kZXggMDQwZWNiMi4uYzgzNzBjOSAxMDA2NDQKLS0tIGEvTGliL3BpY2tsZS5weQorKysgYi9MaWIvcGlja2xlLnB5CkBAIC0yNyw2ICsyNyw3IEBACiBmcm9tIGNvcHlyZWcgaW1wb3J0IGRpc3BhdGNoX3RhYmxlCiBmcm9tIGNvcHlyZWcgaW1wb3J0IF9leHRlbnNpb25fcmVnaXN0cnksIF9pbnZlcnRlZF9yZWdpc3RyeSwgX2V4dGVuc2lvbl9jYWNoZQogZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZQorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKIGltcG9ydCBzeXMKIGZyb20gc3lzIGltcG9ydCBtYXhzaXplCiBmcm9tIHN0cnVjdCBpbXBvcnQgcGFjaywgdW5wYWNrCkBAIC01NDgsNyArNTQ5LDcgQEAKICAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCiAKICAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAiX19uYW1lX18iLCAiIikKLSAgICAgICAgaWYgc2VsZi5wcm90byA+PSA0IGFuZCBmdW5jX25hbWUgPT0gIl9fbmV3b2JqX2V4X18iOgorICAgICAgICBpZiBzZWxmLnByb3RvID49IDIgYW5kIGZ1bmNfbmFtZSA9PSAiX19uZXdvYmpfZXhfXyI6CiAgICAgICAgICAgICBjbHMsIGFyZ3MsIGt3YXJncyA9IGFyZ3MKICAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGNscywgIl9fbmV3X18iKToKICAgICAgICAgICAgICAgICByYWlzZSBQaWNrbGluZ0Vycm9yKCJhcmdzWzBdIGZyb20ge30gYXJncyBoYXMgbm8gX19uZXdfXyIKQEAgLTU1NiwxMCArNTU3LDE2IEBACiAgICAgICAgICAgICBpZiBvYmogaXMgbm90IE5vbmUgYW5kIGNscyBpcyBub3Qgb2JqLl9fY2xhc3NfXzoKICAgICAgICAgICAgICAgICByYWlzZSBQaWNrbGluZ0Vycm9yKCJhcmdzWzBdIGZyb20ge30gYXJncyBoYXMgdGhlIHdyb25nIGNsYXNzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChmdW5jX25hbWUpKQotICAgICAgICAgICAgc2F2ZShjbHMpCi0gICAgICAgICAgICBzYXZlKGFyZ3MpCi0gICAgICAgICAgICBzYXZlKGt3YXJncykKLSAgICAgICAgICAgIHdyaXRlKE5FV09CSl9FWCkKKyAgICAgICAgICAgIGlmIHNlbGYucHJvdG8gPj0gNDoKKyAgICAgICAgICAgICAgICBzYXZlKGNscykKKyAgICAgICAgICAgICAgICBzYXZlKGFyZ3MpCisgICAgICAgICAgICAgICAgc2F2ZShrd2FyZ3MpCisgICAgICAgICAgICAgICAgd3JpdGUoTkVXT0JKX0VYKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmdW5jID0gcGFydGlhbChjbHMuX19uZXdfXywgY2xzLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICAgICAgc2F2ZShmdW5jKQorICAgICAgICAgICAgICAgIHNhdmUoKCkpCisgICAgICAgICAgICAgICAgd3JpdGUoUkVEVUNFKQogICAgICAgICBlbGlmIHNlbGYucHJvdG8gPj0gMiBhbmQgZnVuY19uYW1lID09ICJfX25ld29ial9fIjoKICAgICAgICAgICAgICMgQSBfX3JlZHVjZV9fIGltcGxlbWVudGF0aW9uIGNhbiBkaXJlY3QgcHJvdG9jb2wgMiBvciBuZXdlciB0bwogICAgICAgICAgICAgIyB1c2UgdGhlIG1vcmUgZWZmaWNpZW50IE5FV09CSiBvcGNvZGUsIHdoaWxlIHN0aWxsCkBAIC0xMDI4LDcgKzEwMzUsNyBAQAogICAgICAgICBzZWxmLl91bmZyYW1lciA9IF9VbmZyYW1lcihzZWxmLl9maWxlX3JlYWQsIHNlbGYuX2ZpbGVfcmVhZGxpbmUpCiAgICAgICAgIHNlbGYucmVhZCA9IHNlbGYuX3VuZnJhbWVyLnJlYWQKICAgICAgICAgc2VsZi5yZWFkbGluZSA9IHNlbGYuX3VuZnJhbWVyLnJlYWRsaW5lCi0gICAgICAgIHNlbGYubWFyayA9IG9iamVjdCgpICMgYW55IG5ldyB1bmlxdWUgb2JqZWN0CisgICAgICAgIHNlbGYubWV0YXN0YWNrID0gW10KICAgICAgICAgc2VsZi5zdGFjayA9IFtdCiAgICAgICAgIHNlbGYuYXBwZW5kID0gc2VsZi5zdGFjay5hcHBlbmQKICAgICAgICAgc2VsZi5wcm90byA9IDAKQEAgLTEwNDQsMjAgKzEwNTEsMTIgQEAKICAgICAgICAgZXhjZXB0IF9TdG9wIGFzIHN0b3BpbnN0OgogICAgICAgICAgICAgcmV0dXJuIHN0b3BpbnN0LnZhbHVlCiAKLSAgICAjIFJldHVybiBsYXJnZXN0IGluZGV4IGsgc3VjaCB0aGF0IHNlbGYuc3RhY2tba10gaXMgc2VsZi5tYXJrLgotICAgICMgSWYgdGhlIHN0YWNrIGRvZXNuJ3QgY29udGFpbiBhIG1hcmssIGV2ZW50dWFsbHkgcmFpc2VzIEluZGV4RXJyb3IuCi0gICAgIyBUaGlzIGNvdWxkIGJlIHNwZWQgYnkgbWFpbnRhaW5pbmcgYW5vdGhlciBzdGFjaywgb2YgaW5kaWNlcyBhdCB3aGljaAotICAgICMgdGhlIG1hcmsgYXBwZWFycy4gIEZvciB0aGF0IG1hdHRlciwgdGhlIGxhdHRlciBzdGFjayB3b3VsZCBzdWZmaWNlLAotICAgICMgYW5kIHdlIHdvdWxkbid0IG5lZWQgdG8gcHVzaCBtYXJrIG9iamVjdHMgb24gc2VsZi5zdGFjayBhdCBhbGwuCi0gICAgIyBEb2luZyBzbyBpcyBwcm9iYWJseSBhIGdvb2QgdGhpbmcsIHRob3VnaCwgc2luY2UgaWYgdGhlIHBpY2tsZSBpcwotICAgICMgY29ycnVwdCAob3IgaG9zdGlsZSkgd2UgbWF5IGdldCBhIGNsdWUgZnJvbSBmaW5kaW5nIHNlbGYubWFyayBlbWJlZGRlZAotICAgICMgaW4gdW5waWNrbGVkIG9iamVjdHMuCi0gICAgZGVmIG1hcmtlcihzZWxmKToKLSAgICAgICAgc3RhY2sgPSBzZWxmLnN0YWNrCi0gICAgICAgIG1hcmsgPSBzZWxmLm1hcmsKLSAgICAgICAgayA9IGxlbihzdGFjayktMQotICAgICAgICB3aGlsZSBzdGFja1trXSBpcyBub3QgbWFyazogayA9IGstMQotICAgICAgICByZXR1cm4gaworICAgICMgUmV0dXJuIGEgbGlzdCBvZiBpdGVtcyBwdXNoZWQgaW4gdGhlIHN0YWNrIGFmdGVyIGxhc3QgTUFSSyBpbnN0cnVjdGlvbi4KKyAgICBkZWYgcG9wX21hcmsoc2VsZik6CisgICAgICAgIGl0ZW1zID0gc2VsZi5zdGFjaworICAgICAgICBzZWxmLnN0YWNrID0gc2VsZi5tZXRhc3RhY2sucG9wKCkKKyAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLnN0YWNrLmFwcGVuZAorICAgICAgICByZXR1cm4gaXRlbXMKIAogICAgIGRlZiBwZXJzaXN0ZW50X2xvYWQoc2VsZiwgcGlkKToKICAgICAgICAgcmFpc2UgVW5waWNrbGluZ0Vycm9yKCJ1bnN1cHBvcnRlZCBwZXJzaXN0ZW50IGlkIGVuY291bnRlcmVkIikKQEAgLTEyMzgsOCArMTIzNyw4IEBACiAgICAgZGlzcGF0Y2hbU0hPUlRfQklOVU5JQ09ERVswXV0gPSBsb2FkX3Nob3J0X2JpbnVuaWNvZGUKIAogICAgIGRlZiBsb2FkX3R1cGxlKHNlbGYpOgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBzZWxmLnN0YWNrW2s6XSA9IFt0dXBsZShzZWxmLnN0YWNrW2srMTpdKV0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgc2VsZi5hcHBlbmQodHVwbGUoaXRlbXMpKQogICAgIGRpc3BhdGNoW1RVUExFWzBdXSA9IGxvYWRfdHVwbGUKIAogICAgIGRlZiBsb2FkX2VtcHR5X3R1cGxlKHNlbGYpOgpAQCAtMTI3MSwyMSArMTI3MCwyMCBAQAogICAgIGRpc3BhdGNoW0VNUFRZX1NFVFswXV0gPSBsb2FkX2VtcHR5X3NldAogCiAgICAgZGVmIGxvYWRfZnJvemVuc2V0KHNlbGYpOgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBzZWxmLnN0YWNrW2s6XSA9IFtmcm96ZW5zZXQoc2VsZi5zdGFja1trKzE6XSldCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIHNlbGYuYXBwZW5kKGZyb3plbnNldChpdGVtcykpCiAgICAgZGlzcGF0Y2hbRlJPWkVOU0VUWzBdXSA9IGxvYWRfZnJvemVuc2V0CiAKICAgICBkZWYgbG9hZF9saXN0KHNlbGYpOgotICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQotICAgICAgICBzZWxmLnN0YWNrW2s6XSA9IFtzZWxmLnN0YWNrW2srMTpdXQorICAgICAgICBpdGVtcyA9IHNlbGYucG9wX21hcmsoKQorICAgICAgICBzZWxmLmFwcGVuZChpdGVtcykKICAgICBkaXNwYXRjaFtMSVNUWzBdXSA9IGxvYWRfbGlzdAogCiAgICAgZGVmIGxvYWRfZGljdChzZWxmKToKLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgaXRlbXMgPSBzZWxmLnN0YWNrW2srMTpdCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCiAgICAgICAgIGQgPSB7aXRlbXNbaV06IGl0ZW1zW2krMV0KICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oaXRlbXMpLCAyKX0KLSAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbZF0KKyAgICAgICAgc2VsZi5hcHBlbmQoZCkKICAgICBkaXNwYXRjaFtESUNUWzBdXSA9IGxvYWRfZGljdAogCiAgICAgIyBJTlNUIGFuZCBPQkogZGlmZmVyIG9ubHkgaW4gaG93IHRoZXkgZ2V0IGEgY2xhc3Mgb2JqZWN0LiAgSXQncyBub3QKQEAgLTEyOTMsOSArMTI5MSw3IEBACiAgICAgIyBwcmV2aW91c2x5IGRpdmVyZ2VkIGFuZCBncmV3IGRpZmZlcmVudCBidWdzLgogICAgICMga2xhc3MgaXMgdGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlLCBhbmQgayBwb2ludHMgdG8gdGhlIHRvcG1vc3QgbWFyawogICAgICMgb2JqZWN0LCBmb2xsb3dpbmcgd2hpY2ggYXJlIHRoZSBhcmd1bWVudHMgZm9yIGtsYXNzLl9faW5pdF9fLgotICAgIGRlZiBfaW5zdGFudGlhdGUoc2VsZiwga2xhc3MsIGspOgotICAgICAgICBhcmdzID0gdHVwbGUoc2VsZi5zdGFja1trKzE6XSkKLSAgICAgICAgZGVsIHNlbGYuc3RhY2tbazpdCisgICAgZGVmIF9pbnN0YW50aWF0ZShzZWxmLCBrbGFzcywgYXJncyk6CiAgICAgICAgIGlmIChhcmdzIG9yIG5vdCBpc2luc3RhbmNlKGtsYXNzLCB0eXBlKSBvcgogICAgICAgICAgICAgaGFzYXR0cihrbGFzcywgIl9fZ2V0aW5pdGFyZ3NfXyIpKToKICAgICAgICAgICAgIHRyeToKQEAgLTEzMTEsMTQgKzEzMDcsMTQgQEAKICAgICAgICAgbW9kdWxlID0gc2VsZi5yZWFkbGluZSgpWzotMV0uZGVjb2RlKCJhc2NpaSIpCiAgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRsaW5lKClbOi0xXS5kZWNvZGUoImFzY2lpIikKICAgICAgICAga2xhc3MgPSBzZWxmLmZpbmRfY2xhc3MobW9kdWxlLCBuYW1lKQotICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShrbGFzcywgc2VsZi5tYXJrZXIoKSkKKyAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoa2xhc3MsIHNlbGYucG9wX21hcmsoKSkKICAgICBkaXNwYXRjaFtJTlNUWzBdXSA9IGxvYWRfaW5zdAogCiAgICAgZGVmIGxvYWRfb2JqKHNlbGYpOgogICAgICAgICAjIFN0YWNrIGlzIC4uLiBtYXJrb2JqZWN0IGNsYXNzb2JqZWN0IGFyZzEgYXJnMiAuLi4KLSAgICAgICAgayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAga2xhc3MgPSBzZWxmLnN0YWNrLnBvcChrKzEpCi0gICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGtsYXNzLCBrKQorICAgICAgICBhcmdzID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIGNscyA9IGFyZ3MucG9wKDApCisgICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGNscywgYXJncykKICAgICBkaXNwYXRjaFtPQkpbMF1dID0gbG9hZF9vYmoKIAogICAgIGRlZiBsb2FkX25ld29iaihzZWxmKToKQEAgLTE0MDMsMTIgKzEzOTksMTQgQEAKICAgICBkaXNwYXRjaFtSRURVQ0VbMF1dID0gbG9hZF9yZWR1Y2UKIAogICAgIGRlZiBsb2FkX3BvcChzZWxmKToKLSAgICAgICAgZGVsIHNlbGYuc3RhY2tbLTFdCisgICAgICAgIGlmIHNlbGYuc3RhY2s6CisgICAgICAgICAgICBkZWwgc2VsZi5zdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucG9wX21hcmsoKQogICAgIGRpc3BhdGNoW1BPUFswXV0gPSBsb2FkX3BvcAogCiAgICAgZGVmIGxvYWRfcG9wX21hcmsoc2VsZik6Ci0gICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIGRlbCBzZWxmLnN0YWNrW2s6XQorICAgICAgICBzZWxmLnBvcF9tYXJrKCkKICAgICBkaXNwYXRjaFtQT1BfTUFSS1swXV0gPSBsb2FkX3BvcF9tYXJrCiAKICAgICBkZWYgbG9hZF9kdXAoc2VsZik6CkBAIC0xNDY0LDE3ICsxNDYyLDE0IEBACiAgICAgZGlzcGF0Y2hbQVBQRU5EWzBdXSA9IGxvYWRfYXBwZW5kCiAKICAgICBkZWYgbG9hZF9hcHBlbmRzKHNlbGYpOgotICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKLSAgICAgICAgbWFyayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgbGlzdF9vYmogPSBzdGFja1ttYXJrIC0gMV0KLSAgICAgICAgaXRlbXMgPSBzdGFja1ttYXJrICsgMTpdCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIGxpc3Rfb2JqID0gc2VsZi5zdGFja1stMV0KICAgICAgICAgaWYgaXNpbnN0YW5jZShsaXN0X29iaiwgbGlzdCk6CiAgICAgICAgICAgICBsaXN0X29iai5leHRlbmQoaXRlbXMpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBhcHBlbmQgPSBsaXN0X29iai5hcHBlbmQKICAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgogICAgICAgICAgICAgICAgIGFwcGVuZChpdGVtKQotICAgICAgICBkZWwgc3RhY2tbbWFyazpdCiAgICAgZGlzcGF0Y2hbQVBQRU5EU1swXV0gPSBsb2FkX2FwcGVuZHMKIAogICAgIGRlZiBsb2FkX3NldGl0ZW0oc2VsZik6CkBAIC0xNDg2LDI3ICsxNDgxLDIxIEBACiAgICAgZGlzcGF0Y2hbU0VUSVRFTVswXV0gPSBsb2FkX3NldGl0ZW0KIAogICAgIGRlZiBsb2FkX3NldGl0ZW1zKHNlbGYpOgotICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKLSAgICAgICAgbWFyayA9IHNlbGYubWFya2VyKCkKLSAgICAgICAgZGljdCA9IHN0YWNrW21hcmsgLSAxXQotICAgICAgICBmb3IgaSBpbiByYW5nZShtYXJrICsgMSwgbGVuKHN0YWNrKSwgMik6Ci0gICAgICAgICAgICBkaWN0W3N0YWNrW2ldXSA9IHN0YWNrW2kgKyAxXQotCi0gICAgICAgIGRlbCBzdGFja1ttYXJrOl0KKyAgICAgICAgaXRlbXMgPSBzZWxmLnBvcF9tYXJrKCkKKyAgICAgICAgZGljdCA9IHNlbGYuc3RhY2tbLTFdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihpdGVtcyksIDIpOgorICAgICAgICAgICAgZGljdFtpdGVtc1tpXV0gPSBpdGVtc1tpICsgMV0KICAgICBkaXNwYXRjaFtTRVRJVEVNU1swXV0gPSBsb2FkX3NldGl0ZW1zCiAKICAgICBkZWYgbG9hZF9hZGRpdGVtcyhzZWxmKToKLSAgICAgICAgc3RhY2sgPSBzZWxmLnN0YWNrCi0gICAgICAgIG1hcmsgPSBzZWxmLm1hcmtlcigpCi0gICAgICAgIHNldF9vYmogPSBzdGFja1ttYXJrIC0gMV0KLSAgICAgICAgaXRlbXMgPSBzdGFja1ttYXJrICsgMTpdCisgICAgICAgIGl0ZW1zID0gc2VsZi5wb3BfbWFyaygpCisgICAgICAgIHNldF9vYmogPSBzZWxmLnN0YWNrWy0xXQogICAgICAgICBpZiBpc2luc3RhbmNlKHNldF9vYmosIHNldCk6CiAgICAgICAgICAgICBzZXRfb2JqLnVwZGF0ZShpdGVtcykKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGFkZCA9IHNldF9vYmouYWRkCiAgICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKICAgICAgICAgICAgICAgICBhZGQoaXRlbSkKLSAgICAgICAgZGVsIHN0YWNrW21hcms6XQogICAgIGRpc3BhdGNoW0FERElURU1TWzBdXSA9IGxvYWRfYWRkaXRlbXMKIAogICAgIGRlZiBsb2FkX2J1aWxkKHNlbGYpOgpAQCAtMTUzNCw3ICsxNTIzLDkgQEAKICAgICBkaXNwYXRjaFtCVUlMRFswXV0gPSBsb2FkX2J1aWxkCiAKICAgICBkZWYgbG9hZF9tYXJrKHNlbGYpOgotICAgICAgICBzZWxmLmFwcGVuZChzZWxmLm1hcmspCisgICAgICAgIHNlbGYubWV0YXN0YWNrLmFwcGVuZChzZWxmLnN0YWNrKQorICAgICAgICBzZWxmLnN0YWNrID0gW10KKyAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLnN0YWNrLmFwcGVuZAogICAgIGRpc3BhdGNoW01BUktbMF1dID0gbG9hZF9tYXJrCiAKICAgICBkZWYgbG9hZF9zdG9wKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3BpY2tsZXRvb2xzLnB5IGIvTGliL3BpY2tsZXRvb2xzLnB5CmluZGV4IDE2YWU3ZDUuLjRlZWZjMTkgMTAwNjQ0Ci0tLSBhL0xpYi9waWNrbGV0b29scy5weQorKysgYi9MaWIvcGlja2xldG9vbHMucHkKQEAgLTI0NDAsNiArMjQ0MCw3IEBACiAgICAgICAgIGlmIG9wY29kZS5uYW1lIGluICgiUFVUIiwgIkJJTlBVVCIsICJMT05HX0JJTlBVVCIsICJNRU1PSVpFIik6CiAgICAgICAgICAgICBpZiBvcGNvZGUubmFtZSA9PSAiTUVNT0laRSI6CiAgICAgICAgICAgICAgICAgbWVtb19pZHggPSBsZW4obWVtbykKKyAgICAgICAgICAgICAgICBtYXJrbXNnID0gIihhcyAlZCkiICUgbWVtb19pZHgKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgYXNzZXJ0IGFyZyBpcyBub3QgTm9uZQogICAgICAgICAgICAgICAgIG1lbW9faWR4ID0gYXJnCmRpZmYgLS1naXQgYS9MaWIvcGtndXRpbC5weSBiL0xpYi9wa2d1dGlsLnB5CmluZGV4IDk3NzI2YTkuLjE1YjNhZTEgMTAwNjQ0Ci0tLSBhL0xpYi9wa2d1dGlsLnB5CisrKyBiL0xpYi9wa2d1dGlsLnB5CkBAIC00NSw3ICs0NSw3IEBACiAKIAogZGVmIHdhbGtfcGFja2FnZXMocGF0aD1Ob25lLCBwcmVmaXg9JycsIG9uZXJyb3I9Tm9uZSk6Ci0gICAgIiIiWWllbGRzIChtb2R1bGVfbG9hZGVyLCBuYW1lLCBpc3BrZykgZm9yIGFsbCBtb2R1bGVzIHJlY3Vyc2l2ZWx5CisgICAgIiIiWWllbGRzIChtb2R1bGVfZmluZGVyLCBuYW1lLCBpc3BrZykgZm9yIGFsbCBtb2R1bGVzIHJlY3Vyc2l2ZWx5CiAgICAgb24gcGF0aCwgb3IsIGlmIHBhdGggaXMgTm9uZSwgYWxsIGFjY2Vzc2libGUgbW9kdWxlcy4KIAogICAgICdwYXRoJyBzaG91bGQgYmUgZWl0aGVyIE5vbmUgb3IgYSBsaXN0IG9mIHBhdGhzIHRvIGxvb2sgZm9yCkBAIC0xMDIsNyArMTAyLDcgQEAKIAogCiBkZWYgaXRlcl9tb2R1bGVzKHBhdGg9Tm9uZSwgcHJlZml4PScnKToKLSAgICAiIiJZaWVsZHMgKG1vZHVsZV9sb2FkZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIHN1Ym1vZHVsZXMgb24gcGF0aCwKKyAgICAiIiJZaWVsZHMgKG1vZHVsZV9maW5kZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIHN1Ym1vZHVsZXMgb24gcGF0aCwKICAgICBvciwgaWYgcGF0aCBpcyBOb25lLCBhbGwgdG9wLWxldmVsIG1vZHVsZXMgb24gc3lzLnBhdGguCiAKICAgICAncGF0aCcgc2hvdWxkIGJlIGVpdGhlciBOb25lIG9yIGEgbGlzdCBvZiBwYXRocyB0byBsb29rIGZvcgpAQCAtMTgwLDE0ICsxODAsMTQgQEAKIGRlZiBfaW1wb3J0X2ltcCgpOgogICAgIGdsb2JhbCBpbXAKICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgIGltcCA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCdpbXAnKQogCiBjbGFzcyBJbXBJbXBvcnRlcjoKLSAgICAiIiJQRVAgMzAyIEltcG9ydGVyIHRoYXQgd3JhcHMgUHl0aG9uJ3MgImNsYXNzaWMiIGltcG9ydCBhbGdvcml0aG0KKyAgICAiIiJQRVAgMzAyIEZpbmRlciB0aGF0IHdyYXBzIFB5dGhvbidzICJjbGFzc2ljIiBpbXBvcnQgYWxnb3JpdGhtCiAKLSAgICBJbXBJbXBvcnRlcihkaXJuYW1lKSBwcm9kdWNlcyBhIFBFUCAzMDIgaW1wb3J0ZXIgdGhhdCBzZWFyY2hlcyB0aGF0Ci0gICAgZGlyZWN0b3J5LiAgSW1wSW1wb3J0ZXIoTm9uZSkgcHJvZHVjZXMgYSBQRVAgMzAyIGltcG9ydGVyIHRoYXQgc2VhcmNoZXMKKyAgICBJbXBJbXBvcnRlcihkaXJuYW1lKSBwcm9kdWNlcyBhIFBFUCAzMDIgZmluZGVyIHRoYXQgc2VhcmNoZXMgdGhhdAorICAgIGRpcmVjdG9yeS4gIEltcEltcG9ydGVyKE5vbmUpIHByb2R1Y2VzIGEgUEVQIDMwMiBmaW5kZXIgdGhhdCBzZWFyY2hlcwogICAgIHRoZSBjdXJyZW50IHN5cy5wYXRoLCBwbHVzIGFueSBtb2R1bGVzIHRoYXQgYXJlIGZyb3plbiBvciBidWlsdC1pbi4KIAogICAgIE5vdGUgdGhhdCBJbXBJbXBvcnRlciBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydCBiZWluZyB1c2VkIGJ5IHBsYWNlbWVudApAQCAtMzk1LDkgKzM5NSw5IEBACiAKIAogZGVmIGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pOgotICAgICIiIlJldHJpZXZlIGEgUEVQIDMwMiBpbXBvcnRlciBmb3IgdGhlIGdpdmVuIHBhdGggaXRlbQorICAgICIiIlJldHJpZXZlIGEgUEVQIDMwMiBmaW5kZXIgZm9yIHRoZSBnaXZlbiBwYXRoIGl0ZW0KIAotICAgIFRoZSByZXR1cm5lZCBpbXBvcnRlciBpcyBjYWNoZWQgaW4gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUKKyAgICBUaGUgcmV0dXJuZWQgZmluZGVyIGlzIGNhY2hlZCBpbiBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZQogICAgIGlmIGl0IHdhcyBuZXdseSBjcmVhdGVkIGJ5IGEgcGF0aCBob29rLgogCiAgICAgVGhlIGNhY2hlIChvciBwYXJ0IG9mIGl0KSBjYW4gYmUgY2xlYXJlZCBtYW51YWxseSBpZiBhCkBAIC00MTksMTYgKzQxOSwxNiBAQAogCiAKIGRlZiBpdGVyX2ltcG9ydGVycyhmdWxsbmFtZT0iIik6Ci0gICAgIiIiWWllbGQgUEVQIDMwMiBpbXBvcnRlcnMgZm9yIHRoZSBnaXZlbiBtb2R1bGUgbmFtZQorICAgICIiIllpZWxkIFBFUCAzMDIgZmluZGVycyBmb3IgdGhlIGdpdmVuIG1vZHVsZSBuYW1lCiAKLSAgICBJZiBmdWxsbmFtZSBjb250YWlucyBhICcuJywgdGhlIGltcG9ydGVycyB3aWxsIGJlIGZvciB0aGUgcGFja2FnZQorICAgIElmIGZ1bGxuYW1lIGNvbnRhaW5zIGEgJy4nLCB0aGUgZmluZGVycyB3aWxsIGJlIGZvciB0aGUgcGFja2FnZQogICAgIGNvbnRhaW5pbmcgZnVsbG5hbWUsIG90aGVyd2lzZSB0aGV5IHdpbGwgYmUgYWxsIHJlZ2lzdGVyZWQgdG9wIGxldmVsCi0gICAgaW1wb3J0ZXJzIChpLmUuIHRob3NlIG9uIGJvdGggc3lzLm1ldGFfcGF0aCBhbmQgc3lzLnBhdGhfaG9va3MpLgorICAgIGZpbmRlcnMgKGkuZS4gdGhvc2Ugb24gYm90aCBzeXMubWV0YV9wYXRoIGFuZCBzeXMucGF0aF9ob29rcykuCiAKICAgICBJZiB0aGUgbmFtZWQgbW9kdWxlIGlzIGluIGEgcGFja2FnZSwgdGhhdCBwYWNrYWdlIGlzIGltcG9ydGVkIGFzIGEgc2lkZQogICAgIGVmZmVjdCBvZiBpbnZva2luZyB0aGlzIGZ1bmN0aW9uLgogCi0gICAgSWYgbm8gbW9kdWxlIG5hbWUgaXMgc3BlY2lmaWVkLCBhbGwgdG9wIGxldmVsIGltcG9ydGVycyBhcmUgcHJvZHVjZWQuCisgICAgSWYgbm8gbW9kdWxlIG5hbWUgaXMgc3BlY2lmaWVkLCBhbGwgdG9wIGxldmVsIGZpbmRlcnMgYXJlIHByb2R1Y2VkLgogICAgICIiIgogICAgIGlmIGZ1bGxuYW1lLnN0YXJ0c3dpdGgoJy4nKToKICAgICAgICAgbXNnID0gIlJlbGF0aXZlIG1vZHVsZSBuYW1lIHshcn0gbm90IHN1cHBvcnRlZCIuZm9ybWF0KGZ1bGxuYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3BsYXQtbGludXgvcmVnZW4gYi9MaWIvcGxhdC1saW51eC9yZWdlbgppbmRleCBjNzY5NTBlLi4xMDYzM2NiIDEwMDc1NQotLS0gYS9MaWIvcGxhdC1saW51eC9yZWdlbgorKysgYi9MaWIvcGxhdC1saW51eC9yZWdlbgpAQCAtMSw4ICsxLDMzIEBACiAjISAvYmluL3NoCiBjYXNlIGB1bmFtZWAgaW4KLUxpbnV4KikJOzsKK0xpbnV4KnxHTlUqKQk7OwogKikJZWNobyBQcm9iYWJseSBub3Qgb24gYSBMaW51eCBzeXN0ZW0gMT4mMgogCWV4aXQgMTs7CiBlc2FjCi1zZXQgLXYKLWgycHkgLWkgJyh1X2xvbmcpJyAvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmggL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaCAvdXNyL2luY2x1ZGUvZGxmY24uaAoraWYgWyAteiAiJENDIiBdOyB0aGVuCisgICAgZWNobyA+JjIgIiQoYmFzZW5hbWUgJDApOiBDQyBpcyBub3Qgc2V0IgorICAgIGV4aXQgMQorZmkKK2hlYWRlcnM9InN5cy90eXBlcy5oIG5ldGluZXQvaW4uaCBkbGZjbi5oIgoraW5jZGlycz0iJChlY2hvICQoJENDIC12IC1FIC0gPCAvZGV2L251bGwgMj4mMXxhd2sgJy9eI2luY2x1ZGUvLCAvXkVuZCBvZiBzZWFyY2gvJyB8IGdyZXAgJ14gJykpIgoraWYgWyAteiAiJGluY2RpcnMiIF07IHRoZW4KKyAgICBpbmNkaXJzPSIvdXNyL2luY2x1ZGUiCitmaQorZm9yIGggaW4gJGhlYWRlcnM7IGRvCisgICAgYWJzaD0KKyAgICBmb3IgZCBpbiAkaW5jZGlyczsgZG8KKwlpZiBbIC1mICIkZC8kaCIgXTsgdGhlbgorCSAgICBhYnNoPSIkZC8kaCIKKwkgICAgYnJlYWsKKwlmaQorICAgIGRvbmUKKyAgICBpZiBbIC1uICIkYWJzaCIgXTsgdGhlbgorCWFic2hlYWRlcnM9IiRhYnNoZWFkZXJzICRhYnNoIgorICAgIGVsc2UKKwllY2hvID4mMiAiJChiYXNlbmFtZSAkMCk6IGhlYWRlciAkaCBub3QgZm91bmQiCisJZXhpdCAxCisgICAgZmkKK2RvbmUKKworc2V0IC14Ciske0gyUFk6LWgycHl9IC1pICcodV9sb25nKScgJGFic2hlYWRlcnMKZGlmZiAtLWdpdCBhL0xpYi9wbGlzdGxpYi5weSBiL0xpYi9wbGlzdGxpYi5weQppbmRleCBiNjY2MzljLi40ZjM2MGYzIDEwMDY0NAotLS0gYS9MaWIvcGxpc3RsaWIucHkKKysrIGIvTGliL3BsaXN0bGliLnB5CkBAIC00Nyw3ICs0Nyw3IEBACiAiIiIKIF9fYWxsX18gPSBbCiAgICAgInJlYWRQbGlzdCIsICJ3cml0ZVBsaXN0IiwgInJlYWRQbGlzdEZyb21CeXRlcyIsICJ3cml0ZVBsaXN0VG9CeXRlcyIsCi0gICAgIlBsaXN0IiwgIkRhdGEiLCAiRGljdCIsICJGTVRfWE1MIiwgIkZNVF9CSU5BUlkiLAorICAgICJQbGlzdCIsICJEYXRhIiwgIkRpY3QiLCAiSW52YWxpZEZpbGVFeGNlcHRpb24iLCAiRk1UX1hNTCIsICJGTVRfQklOQVJZIiwKICAgICAibG9hZCIsICJkdW1wIiwgImxvYWRzIiwgImR1bXBzIgogXQogCmRpZmYgLS1naXQgYS9MaWIvcHljbGJyLnB5IGIvTGliL3B5Y2xici5weQppbmRleCA0ZDQwYjg3Li5kN2RiYTk3IDEwMDY0NAotLS0gYS9MaWIvcHljbGJyLnB5CisrKyBiL0xpYi9weWNsYnIucHkKQEAgLTQwLDEyICs0MCwxMCBAQAogIiIiCiAKIGltcG9ydCBpbwotaW1wb3J0IG9zCiBpbXBvcnQgc3lzCiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCB0b2tlbml6ZQogZnJvbSB0b2tlbiBpbXBvcnQgTkFNRSwgREVERU5ULCBPUAotZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgogCiBfX2FsbF9fID0gWyJyZWFkbW9kdWxlIiwgInJlYWRtb2R1bGVfZXgiLCAiQ2xhc3MiLCAiRnVuY3Rpb24iXQogCkBAIC0zMjgsNiArMzI2LDcgQEAKIGRlZiBfbWFpbigpOgogICAgICMgTWFpbiBwcm9ncmFtIGZvciB0ZXN0aW5nLgogICAgIGltcG9ydCBvcworICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGl0ZW1nZXR0ZXIKICAgICBtb2QgPSBzeXMuYXJndlsxXQogICAgIGlmIG9zLnBhdGguZXhpc3RzKG1vZCk6CiAgICAgICAgIHBhdGggPSBbb3MucGF0aC5kaXJuYW1lKG1vZCldCmRpZmYgLS1naXQgYS9MaWIvcHlkb2MucHkgYi9MaWIvcHlkb2MucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAwZDBkMGFiLi5kN2ExNzdmCi0tLSBhL0xpYi9weWRvYy5weQorKysgYi9MaWIvcHlkb2MucHkKQEAgLTIwOSw2ICsyMDksMTggQEAKICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKG5hbWUsIGtpbmQsIGNscywgdmFsdWUpKQogICAgIHJldHVybiByZXN1bHRzCiAKK2RlZiBzb3J0X2F0dHJpYnV0ZXMoYXR0cnMsIG9iamVjdCk6CisgICAgJ1NvcnQgdGhlIGF0dHJzIGxpc3QgaW4tcGxhY2UgYnkgX2ZpZWxkcyBhbmQgdGhlbiBhbHBoYWJldGljYWxseSBieSBuYW1lJworICAgICMgVGhpcyBhbGxvd3MgZGF0YSBkZXNjcmlwdG9ycyB0byBiZSBvcmRlcmVkIGFjY29yZGluZworICAgICMgdG8gYSBfZmllbGRzIGF0dHJpYnV0ZSBpZiBwcmVzZW50LgorICAgIGZpZWxkcyA9IGdldGF0dHIob2JqZWN0LCAnX2ZpZWxkcycsIFtdKQorICAgIHRyeToKKyAgICAgICAgZmllbGRfb3JkZXIgPSB7bmFtZSA6IGktbGVuKGZpZWxkcykgZm9yIChpLCBuYW1lKSBpbiBlbnVtZXJhdGUoZmllbGRzKX0KKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICBmaWVsZF9vcmRlciA9IHt9CisgICAga2V5ZnVuYyA9IGxhbWJkYSBhdHRyOiAoZmllbGRfb3JkZXIuZ2V0KGF0dHJbMF0sIDApLCBhdHRyWzBdKQorICAgIGF0dHJzLnNvcnQoa2V5PWtleWZ1bmMpCisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbW9kdWxlIG1hbmlwdWxhdGlvbgogCiBkZWYgaXNwYWNrYWdlKHBhdGgpOgpAQCAtODY4LDggKzg4MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKQogICAgICAgICAgICAgdGFnICs9ICc6PGJyPlxuJwogCi0gICAgICAgICAgICAjIFNvcnQgYXR0cnMgYnkgbmFtZS4KLSAgICAgICAgICAgIGF0dHJzLnNvcnQoa2V5PWxhbWJkYSB0OiB0WzBdKQorICAgICAgICAgICAgc29ydF9hdHRyaWJ1dGVzKGF0dHJzLCBvYmplY3QpCiAKICAgICAgICAgICAgICMgUHVtcCBvdXQgdGhlIGF0dHJzLCBzZWdyZWdhdGVkIGJ5IGtpbmQuCiAgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCdNZXRob2RzICVzJyAlIHRhZywgYXR0cnMsCkBAIC0xMjg3LDggKzEyOTgsOCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICB0YWcgPSAiaW5oZXJpdGVkIGZyb20gJXMiICUgY2xhc3NuYW1lKHRoaXNjbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKQotICAgICAgICAgICAgIyBTb3J0IGF0dHJzIGJ5IG5hbWUuCi0gICAgICAgICAgICBhdHRycy5zb3J0KCkKKworICAgICAgICAgICAgc29ydF9hdHRyaWJ1dGVzKGF0dHJzLCBvYmplY3QpCiAKICAgICAgICAgICAgICMgUHVtcCBvdXQgdGhlIGF0dHJzLCBzZWdyZWdhdGVkIGJ5IGtpbmQuCiAgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCJNZXRob2RzICVzOlxuIiAlIHRhZywgYXR0cnMsCkBAIC0xNDE4LDEzICsxNDI5LDE0IEBACiAgICAgICAgIHJldHVybiBwbGFpbnBhZ2VyCiAgICAgaWYgbm90IHN5cy5zdGRpbi5pc2F0dHkoKSBvciBub3Qgc3lzLnN0ZG91dC5pc2F0dHkoKToKICAgICAgICAgcmV0dXJuIHBsYWlucGFnZXIKLSAgICBpZiAnUEFHRVInIGluIG9zLmVudmlyb246CisgICAgdXNlX3BhZ2VyID0gb3MuZW52aXJvbi5nZXQoJ01BTlBBR0VSJykgb3Igb3MuZW52aXJvbi5nZXQoJ1BBR0VSJykKKyAgICBpZiB1c2VfcGFnZXI6CiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOiAjIHBpcGVzIGNvbXBsZXRlbHkgYnJva2VuIGluIFdpbmRvd3MKLSAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogdGVtcGZpbGVwYWdlcihwbGFpbih0ZXh0KSwgb3MuZW52aXJvblsnUEFHRVInXSkKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogdGVtcGZpbGVwYWdlcihwbGFpbih0ZXh0KSwgdXNlX3BhZ2VyKQogICAgICAgICBlbGlmIG9zLmVudmlyb24uZ2V0KCdURVJNJykgaW4gKCdkdW1iJywgJ2VtYWNzJyk6Ci0gICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcihwbGFpbih0ZXh0KSwgb3MuZW52aXJvblsnUEFHRVInXSkKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogcGlwZXBhZ2VyKHBsYWluKHRleHQpLCB1c2VfcGFnZXIpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcih0ZXh0LCBvcy5lbnZpcm9uWydQQUdFUiddKQorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiBwaXBlcGFnZXIodGV4dCwgdXNlX3BhZ2VyKQogICAgIGlmIG9zLmVudmlyb24uZ2V0KCdURVJNJykgaW4gKCdkdW1iJywgJ2VtYWNzJyk6CiAgICAgICAgIHJldHVybiBwbGFpbnBhZ2VyCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CkBAIC0xOTAxLDEwICsxOTEzLDEwIEBACiAKICAgICBkZWYgaW50cm8oc2VsZik6CiAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCcnJwotV2VsY29tZSB0byBQeXRob24gJXMncyBoZWxwIHV0aWxpdHkhCitXZWxjb21lIHRvIFB5dGhvbiB7MH0ncyBoZWxwIHV0aWxpdHkhCiAKIElmIHRoaXMgaXMgeW91ciBmaXJzdCB0aW1lIHVzaW5nIFB5dGhvbiwgeW91IHNob3VsZCBkZWZpbml0ZWx5IGNoZWNrIG91dAotdGhlIHR1dG9yaWFsIG9uIHRoZSBJbnRlcm5ldCBhdCBodHRwOi8vZG9jcy5weXRob24ub3JnLyVzL3R1dG9yaWFsLy4KK3RoZSB0dXRvcmlhbCBvbiB0aGUgSW50ZXJuZXQgYXQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy97MH0vdHV0b3JpYWwvLgogCiBFbnRlciB0aGUgbmFtZSBvZiBhbnkgbW9kdWxlLCBrZXl3b3JkLCBvciB0b3BpYyB0byBnZXQgaGVscCBvbiB3cml0aW5nCiBQeXRob24gcHJvZ3JhbXMgYW5kIHVzaW5nIFB5dGhvbiBtb2R1bGVzLiAgVG8gcXVpdCB0aGlzIGhlbHAgdXRpbGl0eSBhbmQKQEAgLTE5MTQsNyArMTkyNiw3IEBACiAibW9kdWxlcyIsICJrZXl3b3JkcyIsICJzeW1ib2xzIiwgb3IgInRvcGljcyIuICBFYWNoIG1vZHVsZSBhbHNvIGNvbWVzCiB3aXRoIGEgb25lLWxpbmUgc3VtbWFyeSBvZiB3aGF0IGl0IGRvZXM7IHRvIGxpc3QgdGhlIG1vZHVsZXMgd2hvc2UgbmFtZQogb3Igc3VtbWFyeSBjb250YWluIGEgZ2l2ZW4gc3RyaW5nIHN1Y2ggYXMgInNwYW0iLCB0eXBlICJtb2R1bGVzIHNwYW0iLgotJycnICUgdHVwbGUoW3N5cy52ZXJzaW9uWzozXV0qMikpCisnJycuZm9ybWF0KCclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkpCiAKICAgICBkZWYgbGlzdChzZWxmLCBpdGVtcywgY29sdW1ucz00LCB3aWR0aD04MCk6CiAgICAgICAgIGl0ZW1zID0gbGlzdChzb3J0ZWQoaXRlbXMpKQpkaWZmIC0tZ2l0IGEvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5IGIvTGliL3B5ZG9jX2RhdGEvdG9waWNzLnB5CmluZGV4IGQ2ZjEzNjYuLjczNzhkYzkgMTAwNjQ0Ci0tLSBhL0xpYi9weWRvY19kYXRhL3RvcGljcy5weQorKysgYi9MaWIvcHlkb2NfZGF0YS90b3BpY3MucHkKQEAgLTEsNzkgKzEsMTI3MzIgQEAKICMgLSotIGNvZGluZzogdXRmLTggLSotCi0jIEF1dG9nZW5lcmF0ZWQgYnkgU3BoaW54IG9uIFNhdCBKdW4gMjUgMTQ6MDg6NDQgMjAxNgotdG9waWNzID0geydhc3NlcnQnOiB1J1xuVGhlICJhc3NlcnQiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG5Bc3NlcnQgc3RhdGVtZW50cyBhcmUgYSBjb252ZW5pZW50IHdheSB0byBpbnNlcnQgZGVidWdnaW5nIGFzc2VydGlvbnNcbmludG8gYSBwcm9ncmFtOlxuXG4gICBhc3NlcnRfc3RtdCA6Oj0gImFzc2VydCIgZXhwcmVzc2lvbiBbIiwiIGV4cHJlc3Npb25dXG5cblRoZSBzaW1wbGUgZm9ybSwgImFzc2VydCBleHByZXNzaW9uIiwgaXMgZXF1aXZhbGVudCB0b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICAgaWYgbm90IGV4cHJlc3Npb246IHJhaXNlIEFzc2VydGlvbkVycm9yXG5cblRoZSBleHRlbmRlZCBmb3JtLCAiYXNzZXJ0IGV4cHJlc3Npb24xLCBleHByZXNzaW9uMiIsIGlzIGVxdWl2YWxlbnQgdG9cblxuICAgaWYgX19kZWJ1Z19fOlxuICAgICAgIGlmIG5vdCBleHByZXNzaW9uMTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IoZXhwcmVzc2lvbjIpXG5cblRoZXNlIGVxdWl2YWxlbmNlcyBhc3N1bWUgdGhhdCAiX19kZWJ1Z19fIiBhbmQgIkFzc2VydGlvbkVycm9yIiByZWZlclxudG8gdGhlIGJ1aWx0LWluIHZhcmlhYmxlcyB3aXRoIHRob3NlIG5hbWVzLiAgSW4gdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uLCB0aGUgYnVpbHQtaW4gdmFyaWFibGUgIl9fZGVidWdfXyIgaXMgIlRydWUiIHVuZGVyXG5ub3JtYWwgY2lyY3Vtc3RhbmNlcywgIkZhbHNlIiB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgKGNvbW1hbmRcbmxpbmUgb3B0aW9uIC1PKS4gIFRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdG9yIGVtaXRzIG5vIGNvZGUgZm9yIGFuXG5hc3NlcnQgc3RhdGVtZW50IHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZCBhdCBjb21waWxlIHRpbWUuICBOb3RlXG50aGF0IGl0IGlzIHVubmVjZXNzYXJ5IHRvIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvblxudGhhdCBmYWlsZWQgaW4gdGhlIGVycm9yIG1lc3NhZ2U7IGl0IHdpbGwgYmUgZGlzcGxheWVkIGFzIHBhcnQgb2YgdGhlXG5zdGFjayB0cmFjZS5cblxuQXNzaWdubWVudHMgdG8gIl9fZGVidWdfXyIgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSBidWlsdC1pblxudmFyaWFibGUgaXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMuXG4nLAotICdhc3NpZ25tZW50JzogdSdcbkFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2lnbm1lbnQgc3RhdGVtZW50cyBhcmUgdXNlZCB0byAocmUpYmluZCBuYW1lcyB0byB2YWx1ZXMgYW5kIHRvXG5tb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG5cbiAgIGFzc2lnbm1lbnRfc3RtdCA6Oj0gKHRhcmdldF9saXN0ICI9IikrIChzdGFycmVkX2V4cHJlc3Npb24gfCB5aWVsZF9leHByZXNzaW9uKVxuICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXVxuICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIHwgIigiIHRhcmdldF9saXN0ICIpIlxuICAgICAgICAgICAgICB8ICJbIiBbdGFyZ2V0X2xpc3RdICJdIlxuICAgICAgICAgICAgICB8IGF0dHJpYnV0ZXJlZlxuICAgICAgICAgICAgICB8IHN1YnNjcmlwdGlvblxuICAgICAgICAgICAgICB8IHNsaWNpbmdcbiAgICAgICAgICAgICAgfCAiKiIgdGFyZ2V0XG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3JcbiphdHRyaWJ1dGVyZWYqLCAqc3Vic2NyaXB0aW9uKiwgYW5kICpzbGljaW5nKi4pXG5cbkFuIGFzc2lnbm1lbnQgc3RhdGVtZW50IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBsaXN0IChyZW1lbWJlciB0aGF0XG50aGlzIGNhbiBiZSBhIHNpbmdsZSBleHByZXNzaW9uIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QsIHRoZSBsYXR0ZXJcbnlpZWxkaW5nIGEgdHVwbGUpIGFuZCBhc3NpZ25zIHRoZSBzaW5nbGUgcmVzdWx0aW5nIG9iamVjdCB0byBlYWNoIG9mXG50aGUgdGFyZ2V0IGxpc3RzLCBmcm9tIGxlZnQgdG8gcmlnaHQuXG5cbkFzc2lnbm1lbnQgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBkZXBlbmRpbmcgb24gdGhlIGZvcm0gb2YgdGhlIHRhcmdldFxuKGxpc3QpLiBXaGVuIGEgdGFyZ2V0IGlzIHBhcnQgb2YgYSBtdXRhYmxlIG9iamVjdCAoYW4gYXR0cmlidXRlXG5yZWZlcmVuY2UsIHN1YnNjcmlwdGlvbiBvciBzbGljaW5nKSwgdGhlIG11dGFibGUgb2JqZWN0IG11c3RcbnVsdGltYXRlbHkgcGVyZm9ybSB0aGUgYXNzaWdubWVudCBhbmQgZGVjaWRlIGFib3V0IGl0cyB2YWxpZGl0eSwgYW5kXG5tYXkgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBhc3NpZ25tZW50IGlzIHVuYWNjZXB0YWJsZS4gIFRoZSBydWxlc1xub2JzZXJ2ZWQgYnkgdmFyaW91cyB0eXBlcyBhbmQgdGhlIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBnaXZlbiB3aXRoIHRoZVxuZGVmaW5pdGlvbiBvZiB0aGUgb2JqZWN0IHR5cGVzIChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGVcbmhpZXJhcmNoeSopLlxuXG5Bc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHRhcmdldCBsaXN0LCBvcHRpb25hbGx5IGVuY2xvc2VkIGluXG5wYXJlbnRoZXNlcyBvciBzcXVhcmUgYnJhY2tldHMsIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXMgZm9sbG93cy5cblxuKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgZW1wdHk6IFRoZSBvYmplY3QgbXVzdCBhbHNvIGJlIGFuIGVtcHR5XG4gIGl0ZXJhYmxlLlxuXG4qIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIHNpbmdsZSB0YXJnZXQgaW4gcGFyZW50aGVzZXM6IFRoZSBvYmplY3RcbiAgaXMgYXNzaWduZWQgdG8gdGhhdCB0YXJnZXQuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0cywgb3IgYVxuICBzaW5nbGUgdGFyZ2V0IGluIHNxdWFyZSBicmFja2V0czogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhYmxlXG4gIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZSB0YXJnZXRcbiAgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0byByaWdodCwgdG8gdGhlXG4gIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuICAqIElmIHRoZSB0YXJnZXQgbGlzdCBjb250YWlucyBvbmUgdGFyZ2V0IHByZWZpeGVkIHdpdGggYW5cbiAgICBhc3RlcmlzaywgY2FsbGVkIGEgInN0YXJyZWQiIHRhcmdldDogVGhlIG9iamVjdCBtdXN0IGJlIGFuXG4gICAgaXRlcmFibGUgd2l0aCBhdCBsZWFzdCBhcyBtYW55IGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZVxuICAgIHRhcmdldCBsaXN0LCBtaW51cyBvbmUuICBUaGUgZmlyc3QgaXRlbXMgb2YgdGhlIGl0ZXJhYmxlIGFyZVxuICAgIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSB0YXJnZXRzIGJlZm9yZSB0aGUgc3RhcnJlZFxuICAgIHRhcmdldC4gIFRoZSBmaW5hbCBpdGVtcyBvZiB0aGUgaXRlcmFibGUgYXJlIGFzc2lnbmVkIHRvIHRoZVxuICAgIHRhcmdldHMgYWZ0ZXIgdGhlIHN0YXJyZWQgdGFyZ2V0LiAgQSBsaXN0IG9mIHRoZSByZW1haW5pbmcgaXRlbXNcbiAgICBpbiB0aGUgaXRlcmFibGUgaXMgdGhlbiBhc3NpZ25lZCB0byB0aGUgc3RhcnJlZCB0YXJnZXQgKHRoZSBsaXN0XG4gICAgY2FuIGJlIGVtcHR5KS5cblxuICAqIEVsc2U6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzYW1lIG51bWJlciBvZlxuICAgIGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmVcbiAgICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG5Bc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHNpbmdsZSB0YXJnZXQgaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCBhc1xuZm9sbG93cy5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGFuIGlkZW50aWZpZXIgKG5hbWUpOlxuXG4gICogSWYgdGhlIG5hbWUgZG9lcyBub3Qgb2NjdXIgaW4gYSAiZ2xvYmFsIiBvciAibm9ubG9jYWwiIHN0YXRlbWVudFxuICAgIGluIHRoZSBjdXJyZW50IGNvZGUgYmxvY2s6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlXG4gICAgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UuXG5cbiAgKiBPdGhlcndpc2U6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlIGdsb2JhbFxuICAgIG5hbWVzcGFjZSBvciB0aGUgb3V0ZXIgbmFtZXNwYWNlIGRldGVybWluZWQgYnkgIm5vbmxvY2FsIixcbiAgICByZXNwZWN0aXZlbHkuXG5cbiAgVGhlIG5hbWUgaXMgcmVib3VuZCBpZiBpdCB3YXMgYWxyZWFkeSBib3VuZC4gIFRoaXMgbWF5IGNhdXNlIHRoZVxuICByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBvYmplY3QgcHJldmlvdXNseSBib3VuZCB0byB0aGUgbmFtZSB0byByZWFjaFxuICB6ZXJvLCBjYXVzaW5nIHRoZSBvYmplY3QgdG8gYmUgZGVhbGxvY2F0ZWQgYW5kIGl0cyBkZXN0cnVjdG9yIChpZiBpdFxuICBoYXMgb25lKSB0byBiZSBjYWxsZWQuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluXG4gIHRoZSByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGFuIG9iamVjdCB3aXRoXG4gIGFzc2lnbmFibGUgYXR0cmlidXRlczsgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsICJUeXBlRXJyb3IiIGlzXG4gIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG9cbiAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlc1xuICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSAiQXR0cmlidXRlRXJyb3IiKS5cblxuICBOb3RlOiBJZiB0aGUgb2JqZWN0IGlzIGEgY2xhc3MgaW5zdGFuY2UgYW5kIHRoZSBhdHRyaWJ1dGUgcmVmZXJlbmNlXG4gIG9jY3VycyBvbiBib3RoIHNpZGVzIG9mIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLCB0aGUgUkhTIGV4cHJlc3Npb24sXG4gICJhLngiIGNhbiBhY2Nlc3MgZWl0aGVyIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciAoaWYgbm8gaW5zdGFuY2VcbiAgYXR0cmlidXRlIGV4aXN0cykgYSBjbGFzcyBhdHRyaWJ1dGUuICBUaGUgTEhTIHRhcmdldCAiYS54IiBpcyBhbHdheXNcbiAgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LiAgVGh1cywgdGhlXG4gIHR3byBvY2N1cnJlbmNlcyBvZiAiYS54IiBkbyBub3QgbmVjZXNzYXJpbHkgcmVmZXIgdG8gdGhlIHNhbWVcbiAgYXR0cmlidXRlOiBpZiB0aGUgUkhTIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgY2xhc3MgYXR0cmlidXRlLCB0aGVcbiAgTEhTIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYXR0cmlidXRlIGFzIHRoZSB0YXJnZXQgb2YgdGhlXG4gIGFzc2lnbm1lbnQ6XG5cbiAgICAgY2xhc3MgQ2xzOlxuICAgICAgICAgeCA9IDMgICAgICAgICAgICAgIyBjbGFzcyB2YXJpYWJsZVxuICAgICBpbnN0ID0gQ2xzKClcbiAgICAgaW5zdC54ID0gaW5zdC54ICsgMSAgICMgd3JpdGVzIGluc3QueCBhcyA0IGxlYXZpbmcgQ2xzLnggYXMgM1xuXG4gIFRoaXMgZGVzY3JpcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gZGVzY3JpcHRvclxuICBhdHRyaWJ1dGVzLCBzdWNoIGFzIHByb3BlcnRpZXMgY3JlYXRlZCB3aXRoICJwcm9wZXJ0eSgpIi5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2VcbiAgb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLlxuICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGFuIGludGVnZXIuICBJZiBpdCBpcyBuZWdhdGl2ZSwgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlXG4gIGludGVnZXIgbGVzcyB0aGFuIHRoZSBzZXF1ZW5jZVwncyBsZW5ndGgsIGFuZCB0aGUgc2VxdWVuY2UgaXMgYXNrZWRcbiAgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8gaXRzIGl0ZW0gd2l0aCB0aGF0IGluZGV4LiAgSWYgdGhlXG4gIGluZGV4IGlzIG91dCBvZiByYW5nZSwgIkluZGV4RXJyb3IiIGlzIHJhaXNlZCAoYXNzaWdubWVudCB0byBhXG4gIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGEgbGlzdCkuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nXCdzIGtleSB0eXBlLFxuICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzXG4gIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciByZXBsYWNlIGFuXG4gIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSBuZXdcbiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLlxuXG4gIEZvciB1c2VyLWRlZmluZWQgb2JqZWN0cywgdGhlICJfX3NldGl0ZW1fXygpIiBtZXRob2QgaXMgY2FsbGVkIHdpdGhcbiAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzbGljaW5nOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3RcbiAgKHN1Y2ggYXMgYSBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0XG4gIG9mIHRoZSBzYW1lIHR5cGUuICBOZXh0LCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zIGFyZVxuICBldmFsdWF0ZWQsIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZVxuICBzZXF1ZW5jZVwncyBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byBpbnRlZ2Vycy4gSWZcbiAgZWl0aGVyIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlXG4gIHJlc3VsdGluZyBib3VuZHMgYXJlIGNsaXBwZWQgdG8gbGllIGJldHdlZW4gemVybyBhbmQgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aCwgaW5jbHVzaXZlLiAgRmluYWxseSwgdGhlIHNlcXVlbmNlIG9iamVjdCBpcyBhc2tlZCB0byByZXBsYWNlXG4gIHRoZSBzbGljZSB3aXRoIHRoZSBpdGVtcyBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UuICBUaGUgbGVuZ3RoIG9mXG4gIHRoZSBzbGljZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlbmd0aCBvZiB0aGUgYXNzaWduZWQgc2VxdWVuY2UsXG4gIHRodXMgY2hhbmdpbmcgdGhlIGxlbmd0aCBvZiB0aGUgdGFyZ2V0IHNlcXVlbmNlLCBpZiB0aGUgdGFyZ2V0XG4gIHNlcXVlbmNlIGFsbG93cyBpdC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlXG5zeW50YXggZm9yIHRhcmdldHMgaXMgdGFrZW4gdG8gYmUgdGhlIHNhbWUgYXMgZm9yIGV4cHJlc3Npb25zLCBhbmRcbmludmFsaWQgc3ludGF4IGlzIHJlamVjdGVkIGR1cmluZyB0aGUgY29kZSBnZW5lcmF0aW9uIHBoYXNlLCBjYXVzaW5nXG5sZXNzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzLlxuXG5BbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiBhc3NpZ25tZW50IGltcGxpZXMgdGhhdCBvdmVybGFwcyBiZXR3ZWVuXG50aGUgbGVmdC1oYW5kIHNpZGUgYW5kIHRoZSByaWdodC1oYW5kIHNpZGUgYXJlIFwnc2ltdWx0YW5lb3VzXCcgKGZvclxuZXhhbXBsZSAiYSwgYiA9IGIsIGEiIHN3YXBzIHR3byB2YXJpYWJsZXMpLCBvdmVybGFwcyAqd2l0aGluKiB0aGVcbmNvbGxlY3Rpb24gb2YgYXNzaWduZWQtdG8gdmFyaWFibGVzIG9jY3VyIGxlZnQtdG8tcmlnaHQsIHNvbWV0aW1lc1xucmVzdWx0aW5nIGluIGNvbmZ1c2lvbi4gIEZvciBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBwcm9ncmFtIHByaW50c1xuIlswLCAyXSI6XG5cbiAgIHggPSBbMCwgMV1cbiAgIGkgPSAwXG4gICBpLCB4W2ldID0gMSwgMiAgICAgICAgICMgaSBpcyB1cGRhdGVkLCB0aGVuIHhbaV0gaXMgdXBkYXRlZFxuICAgcHJpbnQoeClcblxuU2VlIGFsc286ICoqUEVQIDMxMzIqKiAtIEV4dGVuZGVkIEl0ZXJhYmxlIFVucGFja2luZ1xuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgIip0YXJnZXQiIGZlYXR1cmUuXG5cblxuQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgb2YgYVxuYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6XG5cbiAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbiAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCBzdWJzY3JpcHRpb24gfCBzbGljaW5nXG4gICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiQD0iIHwgIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iXG4gICAgICAgICAgICAgfCAiPj49IiB8ICI8PD0iIHwgIiY9IiB8ICJePSIgfCAifD0iXG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBvZiB0aGUgbGFzdCB0aHJlZVxuc3ltYm9scy4pXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlIG5vcm1hbFxuYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb25cbmxpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGFzc2lnbm1lbnRcbm9uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsIHRhcmdldC5cblRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS5cblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlICJ4ICs9IDEiIGNhbiBiZSByZXdyaXR0ZW4gYXNcbiJ4ID0geCArIDEiIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJbiB0aGVcbmF1Z21lbnRlZCB2ZXJzaW9uLCAieCIgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gQWxzbywgd2hlbiBwb3NzaWJsZSxcbnRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQgcmF0aGVyIHRoYW5cbmNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCwgdGhlIG9sZCBvYmplY3RcbmlzIG1vZGlmaWVkIGluc3RlYWQuXG5cblVubGlrZSBub3JtYWwgYXNzaWdubWVudHMsIGF1Z21lbnRlZCBhc3NpZ25tZW50cyBldmFsdWF0ZSB0aGUgbGVmdC1cbmhhbmQgc2lkZSAqYmVmb3JlKiBldmFsdWF0aW5nIHRoZSByaWdodC1oYW5kIHNpZGUuICBGb3IgZXhhbXBsZSwgImFbaV1cbis9IGYoeCkiIGZpcnN0IGxvb2tzLXVwICJhW2ldIiwgdGhlbiBpdCBldmFsdWF0ZXMgImYoeCkiIGFuZCBwZXJmb3Jtc1xudGhlIGFkZGl0aW9uLCBhbmQgbGFzdGx5LCBpdCB3cml0ZXMgdGhlIHJlc3VsdCBiYWNrIHRvICJhW2ldIi5cblxuV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYVxuc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuIFNpbWlsYXJseSxcbndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeVxub3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsXG5iaW5hcnkgb3BlcmF0aW9ucy5cblxuRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSAqY2F2ZWF0IGFib3V0XG5jbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyogYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy5cbicsCi0gJ2F0b20taWRlbnRpZmllcnMnOiB1J1xuSWRlbnRpZmllcnMgKE5hbWVzKVxuKioqKioqKioqKioqKioqKioqKlxuXG5BbiBpZGVudGlmaWVyIG9jY3VycmluZyBhcyBhbiBhdG9tIGlzIGEgbmFtZS4gIFNlZSBzZWN0aW9uXG4qSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzKiBmb3IgbGV4aWNhbCBkZWZpbml0aW9uIGFuZCBzZWN0aW9uICpOYW1pbmdcbmFuZCBiaW5kaW5nKiBmb3IgZG9jdW1lbnRhdGlvbiBvZiBuYW1pbmcgYW5kIGJpbmRpbmcuXG5cbldoZW4gdGhlIG5hbWUgaXMgYm91bmQgdG8gYW4gb2JqZWN0LCBldmFsdWF0aW9uIG9mIHRoZSBhdG9tIHlpZWxkc1xudGhhdCBvYmplY3QuIFdoZW4gYSBuYW1lIGlzIG5vdCBib3VuZCwgYW4gYXR0ZW1wdCB0byBldmFsdWF0ZSBpdFxucmFpc2VzIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uLlxuXG4qKlByaXZhdGUgbmFtZSBtYW5nbGluZzoqKiBXaGVuIGFuIGlkZW50aWZpZXIgdGhhdCB0ZXh0dWFsbHkgb2NjdXJzIGluXG5hIGNsYXNzIGRlZmluaXRpb24gYmVnaW5zIHdpdGggdHdvIG9yIG1vcmUgdW5kZXJzY29yZSBjaGFyYWN0ZXJzIGFuZFxuZG9lcyBub3QgZW5kIGluIHR3byBvciBtb3JlIHVuZGVyc2NvcmVzLCBpdCBpcyBjb25zaWRlcmVkIGEgKnByaXZhdGVcbm5hbWUqIG9mIHRoYXQgY2xhc3MuIFByaXZhdGUgbmFtZXMgYXJlIHRyYW5zZm9ybWVkIHRvIGEgbG9uZ2VyIGZvcm1cbmJlZm9yZSBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdGhlbS4gIFRoZSB0cmFuc2Zvcm1hdGlvbiBpbnNlcnRzIHRoZVxuY2xhc3MgbmFtZSwgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmVzIHJlbW92ZWQgYW5kIGEgc2luZ2xlIHVuZGVyc2NvcmVcbmluc2VydGVkLCBpbiBmcm9udCBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgaWRlbnRpZmllciAiX19zcGFtIlxub2NjdXJyaW5nIGluIGEgY2xhc3MgbmFtZWQgIkhhbSIgd2lsbCBiZSB0cmFuc2Zvcm1lZCB0byAiX0hhbV9fc3BhbSIuXG5UaGlzIHRyYW5zZm9ybWF0aW9uIGlzIGluZGVwZW5kZW50IG9mIHRoZSBzeW50YWN0aWNhbCBjb250ZXh0IGluIHdoaWNoXG50aGUgaWRlbnRpZmllciBpcyB1c2VkLiAgSWYgdGhlIHRyYW5zZm9ybWVkIG5hbWUgaXMgZXh0cmVtZWx5IGxvbmdcbihsb25nZXIgdGhhbiAyNTUgY2hhcmFjdGVycyksIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHJ1bmNhdGlvbiBtYXlcbmhhcHBlbi4gSWYgdGhlIGNsYXNzIG5hbWUgY29uc2lzdHMgb25seSBvZiB1bmRlcnNjb3Jlcywgbm9cbnRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuXG4nLAotICdhdG9tLWxpdGVyYWxzJzogdSJcbkxpdGVyYWxzXG4qKioqKioqKlxuXG5QeXRob24gc3VwcG9ydHMgc3RyaW5nIGFuZCBieXRlcyBsaXRlcmFscyBhbmQgdmFyaW91cyBudW1lcmljXG5saXRlcmFsczpcblxuICAgbGl0ZXJhbCA6Oj0gc3RyaW5nbGl0ZXJhbCB8IGJ5dGVzbGl0ZXJhbFxuICAgICAgICAgICAgICAgfCBpbnRlZ2VyIHwgZmxvYXRudW1iZXIgfCBpbWFnbnVtYmVyXG5cbkV2YWx1YXRpb24gb2YgYSBsaXRlcmFsIHlpZWxkcyBhbiBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUgKHN0cmluZyxcbmJ5dGVzLCBpbnRlZ2VyLCBmbG9hdGluZyBwb2ludCBudW1iZXIsIGNvbXBsZXggbnVtYmVyKSB3aXRoIHRoZSBnaXZlblxudmFsdWUuICBUaGUgdmFsdWUgbWF5IGJlIGFwcHJveGltYXRlZCBpbiB0aGUgY2FzZSBvZiBmbG9hdGluZyBwb2ludFxuYW5kIGltYWdpbmFyeSAoY29tcGxleCkgbGl0ZXJhbHMuICBTZWUgc2VjdGlvbiAqTGl0ZXJhbHMqIGZvciBkZXRhaWxzLlxuXG5BbGwgbGl0ZXJhbHMgY29ycmVzcG9uZCB0byBpbW11dGFibGUgZGF0YSB0eXBlcywgYW5kIGhlbmNlIHRoZVxub2JqZWN0J3MgaWRlbnRpdHkgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBpdHMgdmFsdWUuICBNdWx0aXBsZVxuZXZhbHVhdGlvbnMgb2YgbGl0ZXJhbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZWl0aGVyIHRoZSBzYW1lXG5vY2N1cnJlbmNlIGluIHRoZSBwcm9ncmFtIHRleHQgb3IgYSBkaWZmZXJlbnQgb2NjdXJyZW5jZSkgbWF5IG9idGFpblxudGhlIHNhbWUgb2JqZWN0IG9yIGEgZGlmZmVyZW50IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlLlxuIiwKLSAnYXR0cmlidXRlLWFjY2Vzcyc6IHUnXG5DdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2ZcbmF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgIngubmFtZSIpIGZvclxuY2xhc3MgaW5zdGFuY2VzLlxuXG5vYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSBhdHRyaWJ1dGUgaW4gdGhlXG4gICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgaXQgZm91bmRcbiAgIGluIHRoZSBjbGFzcyB0cmVlIGZvciAic2VsZiIpLiAgIm5hbWUiIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS4gVGhpc1xuICAgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi5cblxuICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsIG1lY2hhbmlzbSxcbiAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4gICBiZXR3ZWVuICJfX2dldGF0dHJfXygpIiBhbmQgIl9fc2V0YXR0cl9fKCkiLikgVGhpcyBpcyBkb25lIGJvdGggZm9yXG4gICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICJfX2dldGF0dHJfXygpIiB3b3VsZCBoYXZlXG4gICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZSB0aGF0IGF0XG4gICBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieSBub3RcbiAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0XG4gICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbiAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsXG4gICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy5cblxub2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzIGZvclxuICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAiX19nZXRhdHRyX18oKSIsXG4gICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgIl9fZ2V0YXR0cmlidXRlX18oKSIgZWl0aGVyXG4gICBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbiAiQXR0cmlidXRlRXJyb3IiLiBUaGlzIG1ldGhvZFxuICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW5cbiAgIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSBiYXNlIGNsYXNzXG4gICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCBuZWVkcywgZm9yXG4gICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLlxuXG4gICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWxcbiAgICAgbWV0aG9kcyBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheFxuICAgICBvciBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwKi5cblxub2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZFxuICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlXG4gICBpbnN0YW5jZSBkaWN0aW9uYXJ5KS4gKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgKnZhbHVlKiBpcyB0aGVcbiAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBJZiAiX19zZXRhdHRyX18oKSIgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgaXRcbiAgIHNob3VsZCBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsIGZvciBleGFtcGxlLFxuICAgIm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkiLlxuXG5vYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgTGlrZSAiX19zZXRhdHRyX18oKSIgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZlxuICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgImRlbCBvYmoubmFtZSIgaXNcbiAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuXG5cbm9iamVjdC5fX2Rpcl9fKHNlbGYpXG5cbiAgIENhbGxlZCB3aGVuICJkaXIoKSIgaXMgY2FsbGVkIG9uIHRoZSBvYmplY3QuIEEgc2VxdWVuY2UgbXVzdCBiZVxuICAgcmV0dXJuZWQuICJkaXIoKSIgY29udmVydHMgdGhlIHJldHVybmVkIHNlcXVlbmNlIHRvIGEgbGlzdCBhbmRcbiAgIHNvcnRzIGl0LlxuXG5cbkltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuPT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzXG5jb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhblxuKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVyXCdzIGNsYXNzXG5kaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlXG5leGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXNcbnRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnICJfX2RpY3RfXyIuXG5cbm9iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcilcblxuICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgYXR0cmlidXRlXG4gICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZVxuICAgYWNjZXNzKS4gKm93bmVyKiBpcyBhbHdheXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZSAqaW5zdGFuY2UqIGlzIHRoZVxuICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciAiTm9uZSIgd2hlblxuICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyBtZXRob2Qgc2hvdWxkXG4gICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuICJBdHRyaWJ1dGVFcnJvciJcbiAgIGV4Y2VwdGlvbi5cblxub2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXJcbiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuXG5vYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlXG4gICBvd25lciBjbGFzcy5cblxuVGhlIGF0dHJpYnV0ZSAiX19vYmpjbGFzc19fIiBpcyBpbnRlcnByZXRlZCBieSB0aGUgImluc3BlY3QiIG1vZHVsZSBhc1xuc3BlY2lmeWluZyB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGRlZmluZWQgKHNldHRpbmcgdGhpc1xuYXBwcm9wcmlhdGVseSBjYW4gYXNzaXN0IGluIHJ1bnRpbWUgaW50cm9zcGVjdGlvbiBvZiBkeW5hbWljIGNsYXNzXG5hdHRyaWJ1dGVzKS4gRm9yIGNhbGxhYmxlcywgaXQgbWF5IGluZGljYXRlIHRoYXQgYW4gaW5zdGFuY2Ugb2YgdGhlXG5naXZlbiB0eXBlIChvciBhIHN1YmNsYXNzKSBpcyBleHBlY3RlZCBvciByZXF1aXJlZCBhcyB0aGUgZmlyc3RcbnBvc2l0aW9uYWwgYXJndW1lbnQgKGZvciBleGFtcGxlLCBDUHl0aG9uIHNldHMgdGhpcyBhdHRyaWJ1dGUgZm9yXG51bmJvdW5kIG1ldGhvZHMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gQykuXG5cblxuSW52b2tpbmcgRGVzY3JpcHRvcnNcbj09PT09PT09PT09PT09PT09PT09XG5cbkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggImJpbmRpbmdcbmJlaGF2aW9yIiwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBtZXRob2RzXG5pbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiwgYW5kXG4iX19kZWxldGVfXygpIi4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuIG9iamVjdCwgaXRcbmlzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLlxuXG5UaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgZGVsZXRlXG50aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN0XCdzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgImEueCIgaGFzIGFcbmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fW1wneFwnXSIsIHRoZW5cbiJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXSIsIGFuZCBjb250aW51aW5nIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBvZlxuInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cblxuSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZVxuZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kXG5pbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGVcbnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZFxuaG93IHRoZXkgd2VyZSBjYWxsZWQuXG5cblRoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgYmluZGluZywgImEueCIuIEhvd1xudGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gImEiOlxuXG5EaXJlY3QgQ2FsbFxuICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseVxuICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICAieC5fX2dldF9fKGEpIi5cblxuSW5zdGFuY2UgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhbiBvYmplY3QgaW5zdGFuY2UsICJhLngiIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlXG4gICBjYWxsOiAidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhhLCB0eXBlKGEpKSIuXG5cbkNsYXNzIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBjbGFzcywgIkEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgY2FsbDpcbiAgICJBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpIi5cblxuU3VwZXIgQmluZGluZ1xuICAgSWYgImEiIGlzIGFuIGluc3RhbmNlIG9mICJzdXBlciIsIHRoZW4gdGhlIGJpbmRpbmcgInN1cGVyKEIsXG4gICBvYmopLm0oKSIgc2VhcmNoZXMgIm9iai5fX2NsYXNzX18uX19tcm9fXyIgZm9yIHRoZSBiYXNlIGNsYXNzICJBIlxuICAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nICJCIiBhbmQgdGhlbiBpbnZva2VzIHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlXG4gICBjYWxsOiAiQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosIG9iai5fX2NsYXNzX18pIi5cblxuRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kc1xub24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lXG5hbnkgY29tYmluYXRpb24gb2YgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiIGFuZCAiX19kZWxldGVfXygpIi4gIElmIGl0XG5kb2VzIG5vdCBkZWZpbmUgIl9fZ2V0X18oKSIsIHRoZW4gYWNjZXNzaW5nIHRoZSBhdHRyaWJ1dGUgd2lsbCByZXR1cm5cbnRoZSBkZXNjcmlwdG9yIG9iamVjdCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgdmFsdWUgaW4gdGhlIG9iamVjdFwnc1xuaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgIl9fc2V0X18oKSIgYW5kL29yXG4iX19kZWxldGVfXygpIiwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXMgbmVpdGhlciwgaXQgaXNcbmEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzIGRlZmluZSBib3RoXG4iX19nZXRfXygpIiBhbmQgIl9fc2V0X18oKSIsIHdoaWxlIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGhhdmUganVzdCB0aGVcbiJfX2dldF9fKCkiIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aCAiX19zZXRfXygpIiBhbmQgIl9fZ2V0X18oKSJcbmRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJblxuY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGluc3RhbmNlcy5cblxuUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyAic3RhdGljbWV0aG9kKCkiIGFuZCAiY2xhc3NtZXRob2QoKSIpIGFyZVxuaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhblxucmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsIGluc3RhbmNlcyB0b1xuYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuXG5cblRoZSAicHJvcGVydHkoKSIgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuXG5BY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSBwcm9wZXJ0eS5cblxuXG5fX3Nsb3RzX19cbj09PT09PT09PVxuXG5CeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgY2xhc3NlcyBoYXZlIGEgZGljdGlvbmFyeSBmb3IgYXR0cmlidXRlXG5zdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHMgaGF2aW5nIHZlcnkgZmV3IGluc3RhbmNlXG52YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZSBhY3V0ZSB3aGVuIGNyZWF0aW5nIGxhcmdlXG5udW1iZXJzIG9mIGluc3RhbmNlcy5cblxuVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSBjbGFzc1xuZGVmaW5pdGlvbi4gVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2YgaW5zdGFuY2VcbnZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0byBob2xkIGFcbnZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qIGlzIG5vdFxuY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cblxub2JqZWN0Ll9fc2xvdHNfX1xuXG4gICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsIG9yIHNlcXVlbmNlXG4gICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAqX19zbG90c19fKlxuICAgcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZCB2YXJpYWJsZXMgYW5kIHByZXZlbnRzIHRoZVxuICAgYXV0b21hdGljIGNyZWF0aW9uIG9mICpfX2RpY3RfXyogYW5kICpfX3dlYWtyZWZfXyogZm9yIGVhY2hcbiAgIGluc3RhbmNlLlxuXG5cbk5vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4qIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICpfX2RpY3RfXypcbiAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAqX19zbG90c19fKlxuICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cblxuKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXdcbiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0b1xuICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgIkF0dHJpYnV0ZUVycm9yIi4gSWZcbiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbiAgIlwnX19kaWN0X19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4qIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCBjbGFzc2VzXG4gIGRlZmluaW5nICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byBpdHNcbiAgaW5zdGFuY2VzLiBJZiB3ZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGRcbiAgIlwnX193ZWFrcmVmX19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4qICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmdcbiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXNcbiAgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvclxuICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgY2xhc3NcbiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuXG4qIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzc1xuICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKlxuICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5IGNvbnRhaW4gbmFtZXNcbiAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG5cbiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGVcbiAgaW5zdGFuY2UgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzIGluYWNjZXNzaWJsZVxuICAoZXhjZXB0IGJ5IHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuXG4gIFRoaXMgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhXG4gIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG5cbiogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb21cbiAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyAiaW50IiwgImJ5dGVzIiBhbmQgInR1cGxlIi5cblxuKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouIE1hcHBpbmdzXG4gIG1heSBhbHNvIGJlIHVzZWQ7IGhvd2V2ZXIsIGluIHRoZSBmdXR1cmUsIHNwZWNpYWwgbWVhbmluZyBtYXkgYmVcbiAgYXNzaWduZWQgdG8gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gga2V5LlxuXG4qICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgd29ya3Mgb25seSBpZiBib3RoIGNsYXNzZXMgaGF2ZSB0aGUgc2FtZVxuICAqX19zbG90c19fKi5cbicsCi0gJ2F0dHJpYnV0ZS1yZWZlcmVuY2VzJzogdSdcbkF0dHJpYnV0ZSByZWZlcmVuY2VzXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIGlzIGEgcHJpbWFyeSBmb2xsb3dlZCBieSBhIHBlcmlvZCBhbmQgYSBuYW1lOlxuXG4gICBhdHRyaWJ1dGVyZWYgOjo9IHByaW1hcnkgIi4iIGlkZW50aWZpZXJcblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgc3VwcG9ydHNcbmF0dHJpYnV0ZSByZWZlcmVuY2VzLCB3aGljaCBtb3N0IG9iamVjdHMgZG8uICBUaGlzIG9iamVjdCBpcyB0aGVuXG5hc2tlZCB0byBwcm9kdWNlIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcyB0aGUgaWRlbnRpZmllci4gIFRoaXNcbnByb2R1Y3Rpb24gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgb3ZlcnJpZGluZyB0aGUgIl9fZ2V0YXR0cl9fKCkiIG1ldGhvZC5cbklmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBleGNlcHRpb24gIkF0dHJpYnV0ZUVycm9yIiBpc1xucmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgdHlwZSBhbmQgdmFsdWUgb2YgdGhlIG9iamVjdCBwcm9kdWNlZCBpc1xuZGV0ZXJtaW5lZCBieSB0aGUgb2JqZWN0LiAgTXVsdGlwbGUgZXZhbHVhdGlvbnMgb2YgdGhlIHNhbWUgYXR0cmlidXRlXG5yZWZlcmVuY2UgbWF5IHlpZWxkIGRpZmZlcmVudCBvYmplY3RzLlxuJywKLSAnYXVnYXNzaWduJzogdSdcbkF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGFcbmJpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuXG4gICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4gICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgdGhyZWVcbnN5bWJvbHMuKVxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWxcbmFzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSBleHByZXNzaW9uXG5saXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBhc3NpZ25tZW50XG5vbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuXG5UaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSAieCArPSAxIiBjYW4gYmUgcmV3cml0dGVuIGFzXG4ieCA9IHggKyAxIiB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gSW4gdGhlXG5hdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gcG9zc2libGUsXG50aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0IHJhdGhlciB0aGFuXG5jcmVhdGluZyBhIG5ldyBvYmplY3QgYW5kIGFzc2lnbmluZyB0aGF0IHRvIHRoZSB0YXJnZXQsIHRoZSBvbGQgb2JqZWN0XG5pcyBtb2RpZmllZCBpbnN0ZWFkLlxuXG5Vbmxpa2Ugbm9ybWFsIGFzc2lnbm1lbnRzLCBhdWdtZW50ZWQgYXNzaWdubWVudHMgZXZhbHVhdGUgdGhlIGxlZnQtXG5oYW5kIHNpZGUgKmJlZm9yZSogZXZhbHVhdGluZyB0aGUgcmlnaHQtaGFuZCBzaWRlLiAgRm9yIGV4YW1wbGUsICJhW2ldXG4rPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgcGVyZm9ybXNcbnRoZSBhZGRpdGlvbiwgYW5kIGxhc3RseSwgaXQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byAiYVtpXSIuXG5cbldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGFcbnNpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksXG53aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnlcbm9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbFxuYmluYXJ5IG9wZXJhdGlvbnMuXG5cbkZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgKmNhdmVhdCBhYm91dFxuY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMqIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgYXNzaWdubWVudHMuXG4nLAotICdiaW5hcnknOiB1J1xuQmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYmluYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyBoYXZlIHRoZSBjb252ZW50aW9uYWwgcHJpb3JpdHlcbmxldmVscy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG9wZXJhdGlvbnMgYWxzbyBhcHBseSB0byBjZXJ0YWluIG5vbi1cbm51bWVyaWMgdHlwZXMuICBBcGFydCBmcm9tIHRoZSBwb3dlciBvcGVyYXRvciwgdGhlcmUgYXJlIG9ubHkgdHdvXG5sZXZlbHMsIG9uZSBmb3IgbXVsdGlwbGljYXRpdmUgb3BlcmF0b3JzIGFuZCBvbmUgZm9yIGFkZGl0aXZlXG5vcGVyYXRvcnM6XG5cbiAgIG1fZXhwciA6Oj0gdV9leHByIHwgbV9leHByICIqIiB1X2V4cHIgfCBtX2V4cHIgIkAiIG1fZXhwciB8XG4gICAgICAgICAgICAgIG1fZXhwciAiLy8iIHVfZXhwcnwgbV9leHByICIvIiB1X2V4cHIgfFxuICAgICAgICAgICAgICBtX2V4cHIgIiUiIHVfZXhwclxuICAgYV9leHByIDo6PSBtX2V4cHIgfCBhX2V4cHIgIisiIG1fZXhwciB8IGFfZXhwciAiLSIgbV9leHByXG5cblRoZSAiKiIgKG11bHRpcGxpY2F0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHByb2R1Y3Qgb2YgaXRzIGFyZ3VtZW50cy5cblRoZSBhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzLCBvciBvbmUgYXJndW1lbnQgbXVzdCBiZSBhblxuaW50ZWdlciBhbmQgdGhlIG90aGVyIG11c3QgYmUgYSBzZXF1ZW5jZS4gSW4gdGhlIGZvcm1lciBjYXNlLCB0aGVcbm51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlIGFuZCB0aGVuIG11bHRpcGxpZWQgdG9nZXRoZXIuXG5JbiB0aGUgbGF0dGVyIGNhc2UsIHNlcXVlbmNlIHJlcGV0aXRpb24gaXMgcGVyZm9ybWVkOyBhIG5lZ2F0aXZlXG5yZXBldGl0aW9uIGZhY3RvciB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UuXG5cblRoZSAiQCIgKGF0KSBvcGVyYXRvciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXRyaXhcbm11bHRpcGxpY2F0aW9uLiAgTm8gYnVpbHRpbiBQeXRob24gdHlwZXMgaW1wbGVtZW50IHRoaXMgb3BlcmF0b3IuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuNS5cblxuVGhlICIvIiAoZGl2aXNpb24pIGFuZCAiLy8iIChmbG9vciBkaXZpc2lvbikgb3BlcmF0b3JzIHlpZWxkIHRoZVxucXVvdGllbnQgb2YgdGhlaXIgYXJndW1lbnRzLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdFxuY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuIERpdmlzaW9uIG9mIGludGVnZXJzIHlpZWxkcyBhIGZsb2F0LCB3aGlsZVxuZmxvb3IgZGl2aXNpb24gb2YgaW50ZWdlcnMgcmVzdWx0cyBpbiBhbiBpbnRlZ2VyOyB0aGUgcmVzdWx0IGlzIHRoYXRcbm9mIG1hdGhlbWF0aWNhbCBkaXZpc2lvbiB3aXRoIHRoZSBcJ2Zsb29yXCcgZnVuY3Rpb24gYXBwbGllZCB0byB0aGVcbnJlc3VsdC4gIERpdmlzaW9uIGJ5IHplcm8gcmFpc2VzIHRoZSAiWmVyb0RpdmlzaW9uRXJyb3IiIGV4Y2VwdGlvbi5cblxuVGhlICIlIiAobW9kdWxvKSBvcGVyYXRvciB5aWVsZHMgdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBkaXZpc2lvbiBvZlxudGhlIGZpcnN0IGFyZ3VtZW50IGJ5IHRoZSBzZWNvbmQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0XG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIEEgemVybyByaWdodCBhcmd1bWVudCByYWlzZXMgdGhlXG4iWmVyb0RpdmlzaW9uRXJyb3IiIGV4Y2VwdGlvbi4gIFRoZSBhcmd1bWVudHMgbWF5IGJlIGZsb2F0aW5nIHBvaW50XG5udW1iZXJzLCBlLmcuLCAiMy4xNCUwLjciIGVxdWFscyAiMC4zNCIgKHNpbmNlICIzLjE0IiBlcXVhbHMgIjQqMC43ICtcbjAuMzQiLikgIFRoZSBtb2R1bG8gb3BlcmF0b3IgYWx3YXlzIHlpZWxkcyBhIHJlc3VsdCB3aXRoIHRoZSBzYW1lIHNpZ25cbmFzIGl0cyBzZWNvbmQgb3BlcmFuZCAob3IgemVybyk7IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcmVzdWx0IGlzXG5zdHJpY3RseSBzbWFsbGVyIHRoYW4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBbMV0uXG5cblRoZSBmbG9vciBkaXZpc2lvbiBhbmQgbW9kdWxvIG9wZXJhdG9ycyBhcmUgY29ubmVjdGVkIGJ5IHRoZSBmb2xsb3dpbmdcbmlkZW50aXR5OiAieCA9PSAoeC8veSkqeSArICh4JXkpIi4gIEZsb29yIGRpdmlzaW9uIGFuZCBtb2R1bG8gYXJlIGFsc29cbmNvbm5lY3RlZCB3aXRoIHRoZSBidWlsdC1pbiBmdW5jdGlvbiAiZGl2bW9kKCkiOiAiZGl2bW9kKHgsIHkpID09XG4oeC8veSwgeCV5KSIuIFsyXS5cblxuSW4gYWRkaXRpb24gdG8gcGVyZm9ybWluZyB0aGUgbW9kdWxvIG9wZXJhdGlvbiBvbiBudW1iZXJzLCB0aGUgIiUiXG5vcGVyYXRvciBpcyBhbHNvIG92ZXJsb2FkZWQgYnkgc3RyaW5nIG9iamVjdHMgdG8gcGVyZm9ybSBvbGQtc3R5bGVcbnN0cmluZyBmb3JtYXR0aW5nIChhbHNvIGtub3duIGFzIGludGVycG9sYXRpb24pLiAgVGhlIHN5bnRheCBmb3JcbnN0cmluZyBmb3JtYXR0aW5nIGlzIGRlc2NyaWJlZCBpbiB0aGUgUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlLFxuc2VjdGlvbiAqcHJpbnRmLXN0eWxlIFN0cmluZyBGb3JtYXR0aW5nKi5cblxuVGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yLCB0aGUgbW9kdWxvIG9wZXJhdG9yLCBhbmQgdGhlICJkaXZtb2QoKSJcbmZ1bmN0aW9uIGFyZSBub3QgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzLiAgSW5zdGVhZCwgY29udmVydCB0byBhXG5mbG9hdGluZyBwb2ludCBudW1iZXIgdXNpbmcgdGhlICJhYnMoKSIgZnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuXG5cblRoZSAiKyIgKGFkZGl0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHN1bSBvZiBpdHMgYXJndW1lbnRzLiAgVGhlXG5hcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzIG9yIGJvdGggYmUgc2VxdWVuY2VzIG9mIHRoZSBzYW1lXG50eXBlLiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGVcbmFuZCB0aGVuIGFkZGVkIHRvZ2V0aGVyLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBzZXF1ZW5jZXMgYXJlXG5jb25jYXRlbmF0ZWQuXG5cblRoZSAiLSIgKHN1YnRyYWN0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIGRpZmZlcmVuY2Ugb2YgaXRzIGFyZ3VtZW50cy5cblRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuXG4nLAotICdiaXR3aXNlJzogdSdcbkJpbmFyeSBiaXR3aXNlIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuRWFjaCBvZiB0aGUgdGhyZWUgYml0d2lzZSBvcGVyYXRpb25zIGhhcyBhIGRpZmZlcmVudCBwcmlvcml0eSBsZXZlbDpcblxuICAgYW5kX2V4cHIgOjo9IHNoaWZ0X2V4cHIgfCBhbmRfZXhwciAiJiIgc2hpZnRfZXhwclxuICAgeG9yX2V4cHIgOjo9IGFuZF9leHByIHwgeG9yX2V4cHIgIl4iIGFuZF9leHByXG4gICBvcl9leHByICA6Oj0geG9yX2V4cHIgfCBvcl9leHByICJ8IiB4b3JfZXhwclxuXG5UaGUgIiYiIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBBTkQgb2YgaXRzIGFyZ3VtZW50cywgd2hpY2ggbXVzdFxuYmUgaW50ZWdlcnMuXG5cblRoZSAiXiIgb3BlcmF0b3IgeWllbGRzIHRoZSBiaXR3aXNlIFhPUiAoZXhjbHVzaXZlIE9SKSBvZiBpdHNcbmFyZ3VtZW50cywgd2hpY2ggbXVzdCBiZSBpbnRlZ2Vycy5cblxuVGhlICJ8IiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgKGluY2x1c2l2ZSkgT1Igb2YgaXRzIGFyZ3VtZW50cyxcbndoaWNoIG11c3QgYmUgaW50ZWdlcnMuXG4nLAotICdibHRpbi1jb2RlLW9iamVjdHMnOiB1J1xuQ29kZSBPYmplY3RzXG4qKioqKioqKioqKipcblxuQ29kZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byByZXByZXNlbnQgInBzZXVkby1cbmNvbXBpbGVkIiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlIHN1Y2ggYXMgYSBmdW5jdGlvbiBib2R5LiBUaGV5IGRpZmZlclxuZnJvbSBmdW5jdGlvbiBvYmplY3RzIGJlY2F1c2UgdGhleSBkb25cJ3QgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGVpclxuZ2xvYmFsIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4gIENvZGUgb2JqZWN0cyBhcmUgcmV0dXJuZWQgYnkgdGhlIGJ1aWx0LVxuaW4gImNvbXBpbGUoKSIgZnVuY3Rpb24gYW5kIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBmdW5jdGlvbiBvYmplY3RzXG50aHJvdWdoIHRoZWlyICJfX2NvZGVfXyIgYXR0cmlidXRlLiBTZWUgYWxzbyB0aGUgImNvZGUiIG1vZHVsZS5cblxuQSBjb2RlIG9iamVjdCBjYW4gYmUgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkIGJ5IHBhc3NpbmcgaXQgKGluc3RlYWQgb2YgYVxuc291cmNlIHN0cmluZykgdG8gdGhlICJleGVjKCkiIG9yICJldmFsKCkiICBidWlsdC1pbiBmdW5jdGlvbnMuXG5cblNlZSAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCi0gJ2JsdGluLWVsbGlwc2lzLW9iamVjdCc6IHUnXG5UaGUgRWxsaXBzaXMgT2JqZWN0XG4qKioqKioqKioqKioqKioqKioqXG5cblRoaXMgb2JqZWN0IGlzIGNvbW1vbmx5IHVzZWQgYnkgc2xpY2luZyAoc2VlICpTbGljaW5ncyopLiAgSXQgc3VwcG9ydHNcbm5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIGVsbGlwc2lzIG9iamVjdCwgbmFtZWRcbiJFbGxpcHNpcyIgKGEgYnVpbHQtaW4gbmFtZSkuICAidHlwZShFbGxpcHNpcykoKSIgcHJvZHVjZXMgdGhlXG4iRWxsaXBzaXMiIHNpbmdsZXRvbi5cblxuSXQgaXMgd3JpdHRlbiBhcyAiRWxsaXBzaXMiIG9yICIuLi4iLlxuJywKLSAnYmx0aW4tbnVsbC1vYmplY3QnOiB1J1xuVGhlIE51bGwgT2JqZWN0XG4qKioqKioqKioqKioqKipcblxuVGhpcyBvYmplY3QgaXMgcmV0dXJuZWQgYnkgZnVuY3Rpb25zIHRoYXQgZG9uXCd0IGV4cGxpY2l0bHkgcmV0dXJuIGFcbnZhbHVlLiAgSXQgc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgbnVsbFxub2JqZWN0LCBuYW1lZCAiTm9uZSIgKGEgYnVpbHQtaW4gbmFtZSkuICAidHlwZShOb25lKSgpIiBwcm9kdWNlcyB0aGVcbnNhbWUgc2luZ2xldG9uLlxuXG5JdCBpcyB3cml0dGVuIGFzICJOb25lIi5cbicsCi0gJ2JsdGluLXR5cGUtb2JqZWN0cyc6IHUnXG5UeXBlIE9iamVjdHNcbioqKioqKioqKioqKlxuXG5UeXBlIG9iamVjdHMgcmVwcmVzZW50IHRoZSB2YXJpb3VzIG9iamVjdCB0eXBlcy4gIEFuIG9iamVjdFwncyB0eXBlIGlzXG5hY2Nlc3NlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gInR5cGUoKSIuICBUaGVyZSBhcmUgbm8gc3BlY2lhbFxub3BlcmF0aW9ucyBvbiB0eXBlcy4gIFRoZSBzdGFuZGFyZCBtb2R1bGUgInR5cGVzIiBkZWZpbmVzIG5hbWVzIGZvclxuYWxsIHN0YW5kYXJkIGJ1aWx0LWluIHR5cGVzLlxuXG5UeXBlcyBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6ICI8Y2xhc3MgXCdpbnRcJz4iLlxuJywKLSAnYm9vbGVhbnMnOiB1J1xuQm9vbGVhbiBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKipcblxuICAgb3JfdGVzdCAgOjo9IGFuZF90ZXN0IHwgb3JfdGVzdCAib3IiIGFuZF90ZXN0XG4gICBhbmRfdGVzdCA6Oj0gbm90X3Rlc3QgfCBhbmRfdGVzdCAiYW5kIiBub3RfdGVzdFxuICAgbm90X3Rlc3QgOjo9IGNvbXBhcmlzb24gfCAibm90IiBub3RfdGVzdFxuXG5JbiB0aGUgY29udGV4dCBvZiBCb29sZWFuIG9wZXJhdGlvbnMsIGFuZCBhbHNvIHdoZW4gZXhwcmVzc2lvbnMgYXJlXG51c2VkIGJ5IGNvbnRyb2wgZmxvdyBzdGF0ZW1lbnRzLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWRcbmFzIGZhbHNlOiAiRmFsc2UiLCAiTm9uZSIsIG51bWVyaWMgemVybyBvZiBhbGwgdHlwZXMsIGFuZCBlbXB0eVxuc3RyaW5ncyBhbmQgY29udGFpbmVycyAoaW5jbHVkaW5nIHN0cmluZ3MsIHR1cGxlcywgbGlzdHMsXG5kaWN0aW9uYXJpZXMsIHNldHMgYW5kIGZyb3plbnNldHMpLiAgQWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWRcbmFzIHRydWUuICBVc2VyLWRlZmluZWQgb2JqZWN0cyBjYW4gY3VzdG9taXplIHRoZWlyIHRydXRoIHZhbHVlIGJ5XG5wcm92aWRpbmcgYSAiX19ib29sX18oKSIgbWV0aG9kLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCIgeWllbGRzICJUcnVlIiBpZiBpdHMgYXJndW1lbnQgaXMgZmFsc2UsICJGYWxzZSJcbm90aGVyd2lzZS5cblxuVGhlIGV4cHJlc3Npb24gInggYW5kIHkiIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyBmYWxzZSwgaXRzXG52YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlXG5pcyByZXR1cm5lZC5cblxuVGhlIGV4cHJlc3Npb24gInggb3IgeSIgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIHRydWUsIGl0cyB2YWx1ZVxuaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSwgKnkqIGlzIGV2YWx1YXRlZCBhbmQgdGhlIHJlc3VsdGluZyB2YWx1ZSBpc1xucmV0dXJuZWQuXG5cbihOb3RlIHRoYXQgbmVpdGhlciAiYW5kIiBub3IgIm9yIiByZXN0cmljdCB0aGUgdmFsdWUgYW5kIHR5cGUgdGhleVxucmV0dXJuIHRvICJGYWxzZSIgYW5kICJUcnVlIiwgYnV0IHJhdGhlciByZXR1cm4gdGhlIGxhc3QgZXZhbHVhdGVkXG5hcmd1bWVudC4gIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCwgZS5nLiwgaWYgInMiIGlzIGEgc3RyaW5nIHRoYXRcbnNob3VsZCBiZSByZXBsYWNlZCBieSBhIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXMgZW1wdHksIHRoZSBleHByZXNzaW9uXG4icyBvciBcJ2Zvb1wnIiB5aWVsZHMgdGhlIGRlc2lyZWQgdmFsdWUuICBCZWNhdXNlICJub3QiIGhhcyB0byBjcmVhdGUgYVxubmV3IHZhbHVlLCBpdCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIGl0c1xuYXJndW1lbnQgKGZvciBleGFtcGxlLCAibm90IFwnZm9vXCciIHByb2R1Y2VzICJGYWxzZSIgcmF0aGVyIHRoYW4gIlwnXCciLilcbicsCi0gJ2JyZWFrJzogdSdcblRoZSAiYnJlYWsiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGJyZWFrX3N0bXQgOjo9ICJicmVhayJcblxuImJyZWFrIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhICJmb3IiIG9yICJ3aGlsZSJcbmxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvbiB3aXRoaW4gdGhhdFxubG9vcC5cblxuSXQgdGVybWluYXRlcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcCwgc2tpcHBpbmcgdGhlIG9wdGlvbmFsICJlbHNlIlxuY2xhdXNlIGlmIHRoZSBsb29wIGhhcyBvbmUuXG5cbklmIGEgImZvciIgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIsIHRoZSBsb29wIGNvbnRyb2wgdGFyZ2V0XG5rZWVwcyBpdHMgY3VycmVudCB2YWx1ZS5cblxuV2hlbiAiYnJlYWsiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGEgImZpbmFsbHkiXG5jbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5IGxlYXZpbmcgdGhlXG5sb29wLlxuJywKLSAnY2FsbGFibGUtdHlwZXMnOiB1J1xuRW11bGF0aW5nIGNhbGxhYmxlIG9iamVjdHNcbioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbm9iamVjdC5fX2NhbGxfXyhzZWxmWywgYXJncy4uLl0pXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyAiY2FsbGVkIiBhcyBhIGZ1bmN0aW9uOyBpZiB0aGlzIG1ldGhvZFxuICAgaXMgZGVmaW5lZCwgIngoYXJnMSwgYXJnMiwgLi4uKSIgaXMgYSBzaG9ydGhhbmQgZm9yXG4gICAieC5fX2NhbGxfXyhhcmcxLCBhcmcyLCAuLi4pIi5cbicsCi0gJ2NhbGxzJzogdSdcbkNhbGxzXG4qKioqKlxuXG5BIGNhbGwgY2FsbHMgYSBjYWxsYWJsZSBvYmplY3QgKGUuZy4sIGEgKmZ1bmN0aW9uKikgd2l0aCBhIHBvc3NpYmx5XG5lbXB0eSBzZXJpZXMgb2YgKmFyZ3VtZW50cyo6XG5cbiAgIGNhbGwgICAgICAgICAgICAgICAgIDo6PSBwcmltYXJ5ICIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXSB8IGNvbXByZWhlbnNpb25dICIpIlxuICAgYXJndW1lbnRfbGlzdCAgICAgICAgOjo9IHBvc2l0aW9uYWxfYXJndW1lbnRzIFsiLCIgc3RhcnJlZF9hbmRfa2V5d29yZHNdXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIga2V5d29yZHNfYXJndW1lbnRzXVxuICAgICAgICAgICAgICAgICAgICAgfCBzdGFycmVkX2FuZF9rZXl3b3JkcyBbIiwiIGtleXdvcmRzX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZHNfYXJndW1lbnRzXG4gICBwb3NpdGlvbmFsX2FyZ3VtZW50cyA6Oj0gWyIqIl0gZXhwcmVzc2lvbiAoIiwiIFsiKiJdIGV4cHJlc3Npb24pKlxuICAgc3RhcnJlZF9hbmRfa2V5d29yZHMgOjo9ICgiKiIgZXhwcmVzc2lvbiB8IGtleXdvcmRfaXRlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIiwiICIqIiBleHByZXNzaW9uIHwgIiwiIGtleXdvcmRfaXRlbSkqXG4gICBrZXl3b3Jkc19hcmd1bWVudHMgICA6Oj0gKGtleXdvcmRfaXRlbSB8ICIqKiIgZXhwcmVzc2lvbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBrZXl3b3JkX2l0ZW0gfCAiKioiIGV4cHJlc3Npb24pKlxuICAga2V5d29yZF9pdGVtICAgICAgICAgOjo9IGlkZW50aWZpZXIgIj0iIGV4cHJlc3Npb25cblxuQW4gb3B0aW9uYWwgdHJhaWxpbmcgY29tbWEgbWF5IGJlIHByZXNlbnQgYWZ0ZXIgdGhlIHBvc2l0aW9uYWwgYW5kXG5rZXl3b3JkIGFyZ3VtZW50cyBidXQgZG9lcyBub3QgYWZmZWN0IHRoZSBzZW1hbnRpY3MuXG5cblRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYSBjYWxsYWJsZSBvYmplY3QgKHVzZXItZGVmaW5lZFxuZnVuY3Rpb25zLCBidWlsdC1pbiBmdW5jdGlvbnMsIG1ldGhvZHMgb2YgYnVpbHQtaW4gb2JqZWN0cywgY2xhc3Ncbm9iamVjdHMsIG1ldGhvZHMgb2YgY2xhc3MgaW5zdGFuY2VzLCBhbmQgYWxsIG9iamVjdHMgaGF2aW5nIGFcbiJfX2NhbGxfXygpIiBtZXRob2QgYXJlIGNhbGxhYmxlKS4gIEFsbCBhcmd1bWVudCBleHByZXNzaW9ucyBhcmVcbmV2YWx1YXRlZCBiZWZvcmUgdGhlIGNhbGwgaXMgYXR0ZW1wdGVkLiAgUGxlYXNlIHJlZmVyIHRvIHNlY3Rpb25cbipGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZSBzeW50YXggb2YgZm9ybWFsICpwYXJhbWV0ZXIqIGxpc3RzLlxuXG5JZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcHJlc2VudCwgdGhleSBhcmUgZmlyc3QgY29udmVydGVkIHRvXG5wb3NpdGlvbmFsIGFyZ3VtZW50cywgYXMgZm9sbG93cy4gIEZpcnN0LCBhIGxpc3Qgb2YgdW5maWxsZWQgc2xvdHMgaXNcbmNyZWF0ZWQgZm9yIHRoZSBmb3JtYWwgcGFyYW1ldGVycy4gIElmIHRoZXJlIGFyZSBOIHBvc2l0aW9uYWxcbmFyZ3VtZW50cywgdGhleSBhcmUgcGxhY2VkIGluIHRoZSBmaXJzdCBOIHNsb3RzLiAgTmV4dCwgZm9yIGVhY2hcbmtleXdvcmQgYXJndW1lbnQsIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZVxuY29ycmVzcG9uZGluZyBzbG90IChpZiB0aGUgaWRlbnRpZmllciBpcyB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgZm9ybWFsXG5wYXJhbWV0ZXIgbmFtZSwgdGhlIGZpcnN0IHNsb3QgaXMgdXNlZCwgYW5kIHNvIG9uKS4gIElmIHRoZSBzbG90IGlzXG5hbHJlYWR5IGZpbGxlZCwgYSAiVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLiBPdGhlcndpc2UsIHRoZVxudmFsdWUgb2YgdGhlIGFyZ3VtZW50IGlzIHBsYWNlZCBpbiB0aGUgc2xvdCwgZmlsbGluZyBpdCAoZXZlbiBpZiB0aGVcbmV4cHJlc3Npb24gaXMgIk5vbmUiLCBpdCBmaWxscyB0aGUgc2xvdCkuICBXaGVuIGFsbCBhcmd1bWVudHMgaGF2ZVxuYmVlbiBwcm9jZXNzZWQsIHRoZSBzbG90cyB0aGF0IGFyZSBzdGlsbCB1bmZpbGxlZCBhcmUgZmlsbGVkIHdpdGggdGhlXG5jb3JyZXNwb25kaW5nIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIChEZWZhdWx0XG52YWx1ZXMgYXJlIGNhbGN1bGF0ZWQsIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQ7IHRodXMsIGFcbm11dGFibGUgb2JqZWN0IHN1Y2ggYXMgYSBsaXN0IG9yIGRpY3Rpb25hcnkgdXNlZCBhcyBkZWZhdWx0IHZhbHVlIHdpbGxcbmJlIHNoYXJlZCBieSBhbGwgY2FsbHMgdGhhdCBkb25cJ3Qgc3BlY2lmeSBhbiBhcmd1bWVudCB2YWx1ZSBmb3IgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3Q7IHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgYXZvaWRlZC4pICBJZiB0aGVyZSBhcmUgYW55XG51bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGEgIlR5cGVFcnJvciJcbmV4Y2VwdGlvbiBpcyByYWlzZWQuICBPdGhlcndpc2UsIHRoZSBsaXN0IG9mIGZpbGxlZCBzbG90cyBpcyB1c2VkIGFzXG50aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIGNhbGwuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGVcbmJ1aWx0LWluIGZ1bmN0aW9ucyB3aG9zZSBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgZG8gbm90IGhhdmUgbmFtZXMsIGV2ZW5cbmlmIHRoZXkgYXJlIFwnbmFtZWRcJyBmb3IgdGhlIHB1cnBvc2Ugb2YgZG9jdW1lbnRhdGlvbiwgYW5kIHdoaWNoXG50aGVyZWZvcmUgY2Fubm90IGJlIHN1cHBsaWVkIGJ5IGtleXdvcmQuICBJbiBDUHl0aG9uLCB0aGlzIGlzIHRoZSBjYXNlXG5mb3IgZnVuY3Rpb25zIGltcGxlbWVudGVkIGluIEMgdGhhdCB1c2UgIlB5QXJnX1BhcnNlVHVwbGUoKSIgdG8gcGFyc2VcbnRoZWlyIGFyZ3VtZW50cy5cblxuSWYgdGhlcmUgYXJlIG1vcmUgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aGVyZSBhcmUgZm9ybWFsIHBhcmFtZXRlclxuc2xvdHMsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxudXNpbmcgdGhlIHN5bnRheCAiKmlkZW50aWZpZXIiIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdCBmb3JtYWxcbnBhcmFtZXRlciByZWNlaXZlcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuKG9yIGFuIGVtcHR5IHR1cGxlIGlmIHRoZXJlIHdlcmUgbm8gZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzKS5cblxuSWYgYW55IGtleXdvcmQgYXJndW1lbnQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGZvcm1hbCBwYXJhbWV0ZXJcbm5hbWUsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxudXNpbmcgdGhlIHN5bnRheCAiKippZGVudGlmaWVyIiBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgZm9ybWFsXG5wYXJhbWV0ZXIgcmVjZWl2ZXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBrZXl3b3JkXG5hcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQgdmFsdWVzIGFzXG5jb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZSB3ZXJlIG5vXG5leGNlc3Mga2V5d29yZCBhcmd1bWVudHMuXG5cbklmIHRoZSBzeW50YXggIipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLCAiZXhwcmVzc2lvbiJcbm11c3QgZXZhbHVhdGUgdG8gYW4gKml0ZXJhYmxlKi4gIEVsZW1lbnRzIGZyb20gdGhlc2UgaXRlcmFibGVzIGFyZVxudHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgYWRkaXRpb25hbCBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gIEZvciB0aGUgY2FsbFxuImYoeDEsIHgyLCAqeSwgeDMsIHg0KSIsIGlmICp5KiBldmFsdWF0ZXMgdG8gYSBzZXF1ZW5jZSAqeTEqLCAuLi4sXG4qeU0qLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYWxsIHdpdGggTSs0IHBvc2l0aW9uYWwgYXJndW1lbnRzICp4MSosXG4qeDIqLCAqeTEqLCAuLi4sICp5TSosICp4MyosICp4NCouXG5cbkEgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IGFsdGhvdWdoIHRoZSAiKmV4cHJlc3Npb24iIHN5bnRheCBtYXlcbmFwcGVhciAqYWZ0ZXIqIGV4cGxpY2l0IGtleXdvcmQgYXJndW1lbnRzLCBpdCBpcyBwcm9jZXNzZWQgKmJlZm9yZSpcbnRoZSBrZXl3b3JkIGFyZ3VtZW50cyAoYW5kIGFueSAiKipleHByZXNzaW9uIiBhcmd1bWVudHMgLS0gc2VlIGJlbG93KS5cblNvOlxuXG4gICA+Pj4gZGVmIGYoYSwgYik6XG4gICAuLi4gICAgIHByaW50KGEsIGIpXG4gICAuLi5cbiAgID4+PiBmKGI9MSwgKigyLCkpXG4gICAyIDFcbiAgID4+PiBmKGE9MSwgKigyLCkpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbiAgIFR5cGVFcnJvcjogZigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgXCdhXCdcbiAgID4+PiBmKDEsICooMiwpKVxuICAgMSAyXG5cbkl0IGlzIHVudXN1YWwgZm9yIGJvdGgga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZSAiKmV4cHJlc3Npb24iIHN5bnRheFxudG8gYmUgdXNlZCBpbiB0aGUgc2FtZSBjYWxsLCBzbyBpbiBwcmFjdGljZSB0aGlzIGNvbmZ1c2lvbiBkb2VzIG5vdFxuYXJpc2UuXG5cbklmIHRoZSBzeW50YXggIioqZXhwcmVzc2lvbiIgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCxcbiJleHByZXNzaW9uIiBtdXN0IGV2YWx1YXRlIHRvIGEgKm1hcHBpbmcqLCB0aGUgY29udGVudHMgb2Ygd2hpY2ggYXJlXG50cmVhdGVkIGFzIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMuICBJZiBhIGtleXdvcmQgaXMgYWxyZWFkeVxucHJlc2VudCAoYXMgYW4gZXhwbGljaXQga2V5d29yZCBhcmd1bWVudCwgb3IgZnJvbSBhbm90aGVyIHVucGFja2luZyksXG5hICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5cbkZvcm1hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzeW50YXggIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIlxuY2Fubm90IGJlIHVzZWQgYXMgcG9zaXRpb25hbCBhcmd1bWVudCBzbG90cyBvciBhcyBrZXl3b3JkIGFyZ3VtZW50XG5uYW1lcy5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuNTogRnVuY3Rpb24gY2FsbHMgYWNjZXB0IGFueSBudW1iZXIgb2YgIioiIGFuZFxuIioqIiB1bnBhY2tpbmdzLCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBtYXkgZm9sbG93IGl0ZXJhYmxlIHVucGFja2luZ3NcbigiKiIpLCBhbmQga2V5d29yZCBhcmd1bWVudHMgbWF5IGZvbGxvdyBkaWN0aW9uYXJ5IHVucGFja2luZ3MgKCIqKiIpLlxuT3JpZ2luYWxseSBwcm9wb3NlZCBieSAqKlBFUCA0NDgqKi5cblxuQSBjYWxsIGFsd2F5cyByZXR1cm5zIHNvbWUgdmFsdWUsIHBvc3NpYmx5ICJOb25lIiwgdW5sZXNzIGl0IHJhaXNlcyBhblxuZXhjZXB0aW9uLiAgSG93IHRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGVcbmNhbGxhYmxlIG9iamVjdC5cblxuSWYgaXQgaXMtLS1cblxuYSB1c2VyLWRlZmluZWQgZnVuY3Rpb246XG4gICBUaGUgY29kZSBibG9jayBmb3IgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLCBwYXNzaW5nIGl0IHRoZVxuICAgYXJndW1lbnQgbGlzdC4gIFRoZSBmaXJzdCB0aGluZyB0aGUgY29kZSBibG9jayB3aWxsIGRvIGlzIGJpbmQgdGhlXG4gICBmb3JtYWwgcGFyYW1ldGVycyB0byB0aGUgYXJndW1lbnRzOyB0aGlzIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uXG4gICAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqLiAgV2hlbiB0aGUgY29kZSBibG9jayBleGVjdXRlcyBhICJyZXR1cm4iXG4gICBzdGF0ZW1lbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG5cbmEgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kOlxuICAgVGhlIHJlc3VsdCBpcyB1cCB0byB0aGUgaW50ZXJwcmV0ZXI7IHNlZSAqQnVpbHQtaW4gRnVuY3Rpb25zKiBmb3JcbiAgIHRoZSBkZXNjcmlwdGlvbnMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZXRob2RzLlxuXG5hIGNsYXNzIG9iamVjdDpcbiAgIEEgbmV3IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgaXMgcmV0dXJuZWQuXG5cbmEgY2xhc3MgaW5zdGFuY2UgbWV0aG9kOlxuICAgVGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2l0aCBhbiBhcmd1bWVudFxuICAgbGlzdCB0aGF0IGlzIG9uZSBsb25nZXIgdGhhbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY2FsbDogdGhlXG4gICBpbnN0YW5jZSBiZWNvbWVzIHRoZSBmaXJzdCBhcmd1bWVudC5cblxuYSBjbGFzcyBpbnN0YW5jZTpcbiAgIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhICJfX2NhbGxfXygpIiBtZXRob2Q7IHRoZSBlZmZlY3QgaXMgdGhlbiB0aGVcbiAgIHNhbWUgYXMgaWYgdGhhdCBtZXRob2Qgd2FzIGNhbGxlZC5cbicsCi0gJ2NsYXNzJzogdSdcbkNsYXNzIGRlZmluaXRpb25zXG4qKioqKioqKioqKioqKioqKlxuXG5BIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZFxudHlwZSBoaWVyYXJjaHkqKTpcblxuICAgY2xhc3NkZWYgICAgOjo9IFtkZWNvcmF0b3JzXSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbYXJndW1lbnRfbGlzdF0gIikiXG4gICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllclxuXG5BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgbGlzdFxudXN1YWxseSBnaXZlcyBhIGxpc3Qgb2YgYmFzZSBjbGFzc2VzIChzZWUgKkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uKlxuZm9yIG1vcmUgYWR2YW5jZWQgdXNlcyksIHNvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgZXZhbHVhdGUgdG8gYVxuY2xhc3Mgb2JqZWN0IHdoaWNoIGFsbG93cyBzdWJjbGFzc2luZy4gIENsYXNzZXMgd2l0aG91dCBhbiBpbmhlcml0YW5jZVxubGlzdCBpbmhlcml0LCBieSBkZWZhdWx0LCBmcm9tIHRoZSBiYXNlIGNsYXNzICJvYmplY3QiOyBoZW5jZSxcblxuICAgY2xhc3MgRm9vOlxuICAgICAgIHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb28ob2JqZWN0KTpcbiAgICAgICBwYXNzXG5cblRoZSBjbGFzc1wncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAoc2VlXG4qTmFtaW5nIGFuZCBiaW5kaW5nKiksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kIHRoZVxub3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZSBjb250YWlucyBtb3N0bHlcbmZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzXCdzIHN1aXRlIGZpbmlzaGVzIGV4ZWN1dGlvbiwgaXRzXG5leGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiBbNF0gQVxuY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdCBmb3IgdGhlIGJhc2VcbmNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeS5cblRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCBsb2NhbFxubmFtZXNwYWNlLlxuXG5DbGFzcyBjcmVhdGlvbiBjYW4gYmUgY3VzdG9taXplZCBoZWF2aWx5IHVzaW5nICptZXRhY2xhc3NlcyouXG5cbkNsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nIGZ1bmN0aW9ucyxcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgY2xhc3MgRm9vOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgY2xhc3MgRm9vOiBwYXNzXG4gICBGb28gPSBmMShhcmcpKGYyKEZvbykpXG5cblRoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3JcbmZ1bmN0aW9uIGRlY29yYXRvcnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzcyBvYmplY3QsIHdoaWNoIGlzIHRoZW5cbmJvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmVcbmNsYXNzIGF0dHJpYnV0ZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBpbnN0YW5jZXMuICBJbnN0YW5jZSBhdHRyaWJ1dGVzXG5jYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggInNlbGYubmFtZSA9IHZhbHVlIi4gIEJvdGggY2xhc3MgYW5kXG5pbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uICIic2VsZi5uYW1lIiIsXG5hbmQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIGhpZGVzIGEgY2xhc3MgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZVxud2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gIENsYXNzIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgYXMgZGVmYXVsdHNcbmZvciBpbnN0YW5jZSBhdHRyaWJ1dGVzLCBidXQgdXNpbmcgbXV0YWJsZSB2YWx1ZXMgdGhlcmUgY2FuIGxlYWQgdG9cbnVuZXhwZWN0ZWQgcmVzdWx0cy4gICpEZXNjcmlwdG9ycyogY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlXG52YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gZGV0YWlscy5cblxuU2VlIGFsc286ICoqUEVQIDMxMTUqKiAtIE1ldGFjbGFzc2VzIGluIFB5dGhvbiAzICoqUEVQIDMxMjkqKiAtXG4gIENsYXNzIERlY29yYXRvcnNcbicsCi0gJ2NvbXBhcmlzb25zJzogdSdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSAiYSA8IGIgPCBjIiBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiAiVHJ1ZSIgb3IgIkZhbHNlIi5cblxuQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sICJ4IDwgeSA8PSB6IiBpc1xuZXF1aXZhbGVudCB0byAieCA8IHkgYW5kIHkgPD0geiIsIGV4Y2VwdCB0aGF0ICJ5IiBpcyBldmFsdWF0ZWQgb25seVxub25jZSAoYnV0IGluIGJvdGggY2FzZXMgInoiIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gInggPCB5IiBpc1xuZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuICJhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4geiIgaXMgZXF1aXZhbGVudCB0byAiYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHoiLCBleGNlcHRcbnRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCAiYSBvcDEgYiBvcDIgYyIgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvbiBiZXR3ZWVuXG4qYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgInggPCB5ID4geiIgaXMgcGVyZmVjdGx5IGxlZ2FsICh0aG91Z2hcbnBlcmhhcHMgbm90IHByZXR0eSkuXG5cblxuVmFsdWUgY29tcGFyaXNvbnNcbj09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRvcnMgIjwiLCAiPiIsICI9PSIsICI+PSIsICI8PSIsIGFuZCAiIT0iIGNvbXBhcmUgdGhlIHZhbHVlc1xub2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBkbyBub3QgbmVlZCB0byBoYXZlIHRoZSBzYW1lIHR5cGUuXG5cbkNoYXB0ZXIgKk9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXMqIHN0YXRlcyB0aGF0IG9iamVjdHMgaGF2ZSBhIHZhbHVlXG4oaW4gYWRkaXRpb24gdG8gdHlwZSBhbmQgaWRlbnRpdHkpLiAgVGhlIHZhbHVlIG9mIGFuIG9iamVjdCBpcyBhXG5yYXRoZXIgYWJzdHJhY3Qgbm90aW9uIGluIFB5dGhvbjogRm9yIGV4YW1wbGUsIHRoZXJlIGlzIG5vIGNhbm9uaWNhbFxuYWNjZXNzIG1ldGhvZCBmb3IgYW4gb2JqZWN0XCdzIHZhbHVlLiAgQWxzbywgdGhlcmUgaXMgbm8gcmVxdWlyZW1lbnRcbnRoYXQgdGhlIHZhbHVlIG9mIGFuIG9iamVjdCBzaG91bGQgYmUgY29uc3RydWN0ZWQgaW4gYSBwYXJ0aWN1bGFyIHdheSxcbmUuZy4gY29tcHJpc2VkIG9mIGFsbCBpdHMgZGF0YSBhdHRyaWJ1dGVzLiBDb21wYXJpc29uIG9wZXJhdG9yc1xuaW1wbGVtZW50IGEgcGFydGljdWxhciBub3Rpb24gb2Ygd2hhdCB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGlzLiAgT25lXG5jYW4gdGhpbmsgb2YgdGhlbSBhcyBkZWZpbmluZyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGluZGlyZWN0bHksIGJ5XG5tZWFucyBvZiB0aGVpciBjb21wYXJpc29uIGltcGxlbWVudGF0aW9uLlxuXG5CZWNhdXNlIGFsbCB0eXBlcyBhcmUgKGRpcmVjdCBvciBpbmRpcmVjdCkgc3VidHlwZXMgb2YgIm9iamVjdCIsIHRoZXlcbmluaGVyaXQgdGhlIGRlZmF1bHQgY29tcGFyaXNvbiBiZWhhdmlvciBmcm9tICJvYmplY3QiLiAgVHlwZXMgY2FuXG5jdXN0b21pemUgdGhlaXIgY29tcGFyaXNvbiBiZWhhdmlvciBieSBpbXBsZW1lbnRpbmcgKnJpY2ggY29tcGFyaXNvblxubWV0aG9kcyogbGlrZSAiX19sdF9fKCkiLCBkZXNjcmliZWQgaW4gKkJhc2ljIGN1c3RvbWl6YXRpb24qLlxuXG5UaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbiAoIj09IiBhbmQgIiE9IikgaXMgYmFzZWRcbm9uIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0cy4gIEhlbmNlLCBlcXVhbGl0eSBjb21wYXJpc29uIG9mXG5pbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBpZGVudGl0eSByZXN1bHRzIGluIGVxdWFsaXR5LCBhbmQgZXF1YWxpdHlcbmNvbXBhcmlzb24gb2YgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGlkZW50aXRpZXMgcmVzdWx0cyBpblxuaW5lcXVhbGl0eS4gIEEgbW90aXZhdGlvbiBmb3IgdGhpcyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSBkZXNpcmUgdGhhdFxuYWxsIG9iamVjdHMgc2hvdWxkIGJlIHJlZmxleGl2ZSAoaS5lLiAieCBpcyB5IiBpbXBsaWVzICJ4ID09IHkiKS5cblxuQSBkZWZhdWx0IG9yZGVyIGNvbXBhcmlzb24gKCI8IiwgIj4iLCAiPD0iLCBhbmQgIj49IikgaXMgbm90IHByb3ZpZGVkO1xuYW4gYXR0ZW1wdCByYWlzZXMgIlR5cGVFcnJvciIuICBBIG1vdGl2YXRpb24gZm9yIHRoaXMgZGVmYXVsdCBiZWhhdmlvclxuaXMgdGhlIGxhY2sgb2YgYSBzaW1pbGFyIGludmFyaWFudCBhcyBmb3IgZXF1YWxpdHkuXG5cblRoZSBiZWhhdmlvciBvZiB0aGUgZGVmYXVsdCBlcXVhbGl0eSBjb21wYXJpc29uLCB0aGF0IGluc3RhbmNlcyB3aXRoXG5kaWZmZXJlbnQgaWRlbnRpdGllcyBhcmUgYWx3YXlzIHVuZXF1YWwsIG1heSBiZSBpbiBjb250cmFzdCB0byB3aGF0XG50eXBlcyB3aWxsIG5lZWQgdGhhdCBoYXZlIGEgc2Vuc2libGUgZGVmaW5pdGlvbiBvZiBvYmplY3QgdmFsdWUgYW5kXG52YWx1ZS1iYXNlZCBlcXVhbGl0eS4gIFN1Y2ggdHlwZXMgd2lsbCBuZWVkIHRvIGN1c3RvbWl6ZSB0aGVpclxuY29tcGFyaXNvbiBiZWhhdmlvciwgYW5kIGluIGZhY3QsIGEgbnVtYmVyIG9mIGJ1aWx0LWluIHR5cGVzIGhhdmUgZG9uZVxudGhhdC5cblxuVGhlIGZvbGxvd2luZyBsaXN0IGRlc2NyaWJlcyB0aGUgY29tcGFyaXNvbiBiZWhhdmlvciBvZiB0aGUgbW9zdFxuaW1wb3J0YW50IGJ1aWx0LWluIHR5cGVzLlxuXG4qIE51bWJlcnMgb2YgYnVpbHQtaW4gbnVtZXJpYyB0eXBlcyAoKk51bWVyaWMgVHlwZXMgLS0tIGludCwgZmxvYXQsXG4gIGNvbXBsZXgqKSBhbmQgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgdHlwZXMgImZyYWN0aW9ucy5GcmFjdGlvbiIgYW5kXG4gICJkZWNpbWFsLkRlY2ltYWwiIGNhbiBiZSBjb21wYXJlZCB3aXRoaW4gYW5kIGFjcm9zcyB0aGVpciB0eXBlcyxcbiAgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCBjb21wbGV4IG51bWJlcnMgZG8gbm90IHN1cHBvcnQgb3JkZXJcbiAgY29tcGFyaXNvbi4gIFdpdGhpbiB0aGUgbGltaXRzIG9mIHRoZSB0eXBlcyBpbnZvbHZlZCwgdGhleSBjb21wYXJlXG4gIG1hdGhlbWF0aWNhbGx5IChhbGdvcml0aG1pY2FsbHkpIGNvcnJlY3Qgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi5cblxuICBUaGUgbm90LWEtbnVtYmVyIHZhbHVlcyAiZmxvYXQoXCdOYU5cJykiIGFuZCAiRGVjaW1hbChcJ05hTlwnKSIgYXJlXG4gIHNwZWNpYWwuICBUaGV5IGFyZSBpZGVudGljYWwgdG8gdGhlbXNlbHZlcyAoInggaXMgeCIgaXMgdHJ1ZSkgYnV0XG4gIGFyZSBub3QgZXF1YWwgdG8gdGhlbXNlbHZlcyAoInggPT0geCIgaXMgZmFsc2UpLiAgQWRkaXRpb25hbGx5LFxuICBjb21wYXJpbmcgYW55IG51bWJlciB0byBhIG5vdC1hLW51bWJlciB2YWx1ZSB3aWxsIHJldHVybiAiRmFsc2UiLlxuICBGb3IgZXhhbXBsZSwgYm90aCAiMyA8IGZsb2F0KFwnTmFOXCcpIiBhbmQgImZsb2F0KFwnTmFOXCcpIDwgMyIgd2lsbFxuICByZXR1cm4gIkZhbHNlIi5cblxuKiBCaW5hcnkgc2VxdWVuY2VzIChpbnN0YW5jZXMgb2YgImJ5dGVzIiBvciAiYnl0ZWFycmF5IikgY2FuIGJlXG4gIGNvbXBhcmVkIHdpdGhpbiBhbmQgYWNyb3NzIHRoZWlyIHR5cGVzLiAgVGhleSBjb21wYXJlXG4gIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGVpciBlbGVtZW50cy5cblxuKiBTdHJpbmdzIChpbnN0YW5jZXMgb2YgInN0ciIpIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlXG4gIG51bWVyaWNhbCBVbmljb2RlIGNvZGUgcG9pbnRzICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAib3JkKCkiKSBvZiB0aGVpciBjaGFyYWN0ZXJzLiBbM11cblxuICBTdHJpbmdzIGFuZCBiaW5hcnkgc2VxdWVuY2VzIGNhbm5vdCBiZSBkaXJlY3RseSBjb21wYXJlZC5cblxuKiBTZXF1ZW5jZXMgKGluc3RhbmNlcyBvZiAidHVwbGUiLCAibGlzdCIsIG9yICJyYW5nZSIpIGNhbiBiZVxuICBjb21wYXJlZCBvbmx5IHdpdGhpbiBlYWNoIG9mIHRoZWlyIHR5cGVzLCB3aXRoIHRoZSByZXN0cmljdGlvbiB0aGF0XG4gIHJhbmdlcyBkbyBub3Qgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uLiAgRXF1YWxpdHkgY29tcGFyaXNvbiBhY3Jvc3NcbiAgdGhlc2UgdHlwZXMgcmVzdWx0cyBpbiB1bmVxdWFsaXR5LCBhbmQgb3JkZXJpbmcgY29tcGFyaXNvbiBhY3Jvc3NcbiAgdGhlc2UgdHlwZXMgcmFpc2VzICJUeXBlRXJyb3IiLlxuXG4gIFNlcXVlbmNlcyBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb24gb2ZcbiAgY29ycmVzcG9uZGluZyBlbGVtZW50cywgd2hlcmVieSByZWZsZXhpdml0eSBvZiB0aGUgZWxlbWVudHMgaXNcbiAgZW5mb3JjZWQuXG5cbiAgSW4gZW5mb3JjaW5nIHJlZmxleGl2aXR5IG9mIGVsZW1lbnRzLCB0aGUgY29tcGFyaXNvbiBvZiBjb2xsZWN0aW9uc1xuICBhc3N1bWVzIHRoYXQgZm9yIGEgY29sbGVjdGlvbiBlbGVtZW50ICJ4IiwgInggPT0geCIgaXMgYWx3YXlzIHRydWUuXG4gIEJhc2VkIG9uIHRoYXQgYXNzdW1wdGlvbiwgZWxlbWVudCBpZGVudGl0eSBpcyBjb21wYXJlZCBmaXJzdCwgYW5kXG4gIGVsZW1lbnQgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgb25seSBmb3IgZGlzdGluY3QgZWxlbWVudHMuICBUaGlzXG4gIGFwcHJvYWNoIHlpZWxkcyB0aGUgc2FtZSByZXN1bHQgYXMgYSBzdHJpY3QgZWxlbWVudCBjb21wYXJpc29uXG4gIHdvdWxkLCBpZiB0aGUgY29tcGFyZWQgZWxlbWVudHMgYXJlIHJlZmxleGl2ZS4gIEZvciBub24tcmVmbGV4aXZlXG4gIGVsZW1lbnRzLCB0aGUgcmVzdWx0IGlzIGRpZmZlcmVudCB0aGFuIGZvciBzdHJpY3QgZWxlbWVudFxuICBjb21wYXJpc29uLCBhbmQgbWF5IGJlIHN1cnByaXNpbmc6ICBUaGUgbm9uLXJlZmxleGl2ZSBub3QtYS1udW1iZXJcbiAgdmFsdWVzIGZvciBleGFtcGxlIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvbXBhcmlzb24gYmVoYXZpb3Igd2hlblxuICB1c2VkIGluIGEgbGlzdDpcblxuICAgICA+Pj4gbmFuID0gZmxvYXQoXCdOYU5cJylcbiAgICAgPj4+IG5hbiBpcyBuYW5cbiAgICAgVHJ1ZVxuICAgICA+Pj4gbmFuID09IG5hblxuICAgICBGYWxzZSAgICAgICAgICAgICAgICAgPC0tIHRoZSBkZWZpbmVkIG5vbi1yZWZsZXhpdmUgYmVoYXZpb3Igb2YgTmFOXG4gICAgID4+PiBbbmFuXSA9PSBbbmFuXVxuICAgICBUcnVlICAgICAgICAgICAgICAgICAgPC0tIGxpc3QgZW5mb3JjZXMgcmVmbGV4aXZpdHkgYW5kIHRlc3RzIGlkZW50aXR5IGZpcnN0XG5cbiAgTGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gYmV0d2VlbiBidWlsdC1pbiBjb2xsZWN0aW9ucyB3b3JrcyBhc1xuICBmb2xsb3dzOlxuXG4gICogRm9yIHR3byBjb2xsZWN0aW9ucyB0byBjb21wYXJlIGVxdWFsLCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgICB0eXBlLCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgYW5kIGVhY2ggcGFpciBvZiBjb3JyZXNwb25kaW5nXG4gICAgZWxlbWVudHMgbXVzdCBjb21wYXJlIGVxdWFsIChmb3IgZXhhbXBsZSwgIlsxLDJdID09ICgxLDIpIiBpc1xuICAgIGZhbHNlIGJlY2F1c2UgdGhlIHR5cGUgaXMgbm90IHRoZSBzYW1lKS5cblxuICAqIENvbGxlY3Rpb25zIHRoYXQgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uIGFyZSBvcmRlcmVkIHRoZSBzYW1lXG4gICAgYXMgdGhlaXIgZmlyc3QgdW5lcXVhbCBlbGVtZW50cyAoZm9yIGV4YW1wbGUsICJbMSwyLHhdIDw9IFsxLDIseV0iXG4gICAgaGFzIHRoZSBzYW1lIHZhbHVlIGFzICJ4IDw9IHkiKS4gIElmIGEgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXNcbiAgICBub3QgZXhpc3QsIHRoZSBzaG9ydGVyIGNvbGxlY3Rpb24gaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsXG4gICAgIlsxLDJdIDwgWzEsMiwzXSIgaXMgdHJ1ZSkuXG5cbiogTWFwcGluZ3MgKGluc3RhbmNlcyBvZiAiZGljdCIpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhleVxuICBoYXZlIGVxdWFsICooa2V5LCB2YWx1ZSkqIHBhaXJzLiBFcXVhbGl0eSBjb21wYXJpc29uIG9mIHRoZSBrZXlzIGFuZFxuICBlbGVtZW50cyBlbmZvcmNlcyByZWZsZXhpdml0eS5cblxuICBPcmRlciBjb21wYXJpc29ucyAoIjwiLCAiPiIsICI8PSIsIGFuZCAiPj0iKSByYWlzZSAiVHlwZUVycm9yIi5cblxuKiBTZXRzIChpbnN0YW5jZXMgb2YgInNldCIgb3IgImZyb3plbnNldCIpIGNhbiBiZSBjb21wYXJlZCB3aXRoaW5cbiAgYW5kIGFjcm9zcyB0aGVpciB0eXBlcy5cblxuICBUaGV5IGRlZmluZSBvcmRlciBjb21wYXJpc29uIG9wZXJhdG9ycyB0byBtZWFuIHN1YnNldCBhbmQgc3VwZXJzZXRcbiAgdGVzdHMuICBUaG9zZSByZWxhdGlvbnMgZG8gbm90IGRlZmluZSB0b3RhbCBvcmRlcmluZ3MgKGZvciBleGFtcGxlLFxuICB0aGUgdHdvIHNldHMgInsxLDJ9IiBhbmQgInsyLDN9IiBhcmUgbm90IGVxdWFsLCBub3Igc3Vic2V0cyBvZiBvbmVcbiAgYW5vdGhlciwgbm9yIHN1cGVyc2V0cyBvZiBvbmUgYW5vdGhlcikuICBBY2NvcmRpbmdseSwgc2V0cyBhcmUgbm90XG4gIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIHdoaWNoIGRlcGVuZCBvbiB0b3RhbCBvcmRlcmluZ1xuICAoZm9yIGV4YW1wbGUsICJtaW4oKSIsICJtYXgoKSIsIGFuZCAic29ydGVkKCkiIHByb2R1Y2UgdW5kZWZpbmVkXG4gIHJlc3VsdHMgZ2l2ZW4gYSBsaXN0IG9mIHNldHMgYXMgaW5wdXRzKS5cblxuICBDb21wYXJpc29uIG9mIHNldHMgZW5mb3JjZXMgcmVmbGV4aXZpdHkgb2YgaXRzIGVsZW1lbnRzLlxuXG4qIE1vc3Qgb3RoZXIgYnVpbHQtaW4gdHlwZXMgaGF2ZSBubyBjb21wYXJpc29uIG1ldGhvZHMgaW1wbGVtZW50ZWQsXG4gIHNvIHRoZXkgaW5oZXJpdCB0aGUgZGVmYXVsdCBjb21wYXJpc29uIGJlaGF2aW9yLlxuXG5Vc2VyLWRlZmluZWQgY2xhc3NlcyB0aGF0IGN1c3RvbWl6ZSB0aGVpciBjb21wYXJpc29uIGJlaGF2aW9yIHNob3VsZFxuZm9sbG93IHNvbWUgY29uc2lzdGVuY3kgcnVsZXMsIGlmIHBvc3NpYmxlOlxuXG4qIEVxdWFsaXR5IGNvbXBhcmlzb24gc2hvdWxkIGJlIHJlZmxleGl2ZS4gSW4gb3RoZXIgd29yZHMsIGlkZW50aWNhbFxuICBvYmplY3RzIHNob3VsZCBjb21wYXJlIGVxdWFsOlxuXG4gICAgICJ4IGlzIHkiIGltcGxpZXMgInggPT0geSJcblxuKiBDb21wYXJpc29uIHNob3VsZCBiZSBzeW1tZXRyaWMuIEluIG90aGVyIHdvcmRzLCB0aGUgZm9sbG93aW5nXG4gIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDpcblxuICAgICAieCA9PSB5IiBhbmQgInkgPT0geCJcblxuICAgICAieCAhPSB5IiBhbmQgInkgIT0geCJcblxuICAgICAieCA8IHkiIGFuZCAieSA+IHgiXG5cbiAgICAgInggPD0geSIgYW5kICJ5ID49IHgiXG5cbiogQ29tcGFyaXNvbiBzaG91bGQgYmUgdHJhbnNpdGl2ZS4gVGhlIGZvbGxvd2luZyAobm9uLWV4aGF1c3RpdmUpXG4gIGV4YW1wbGVzIGlsbHVzdHJhdGUgdGhhdDpcblxuICAgICAieCA+IHkgYW5kIHkgPiB6IiBpbXBsaWVzICJ4ID4geiJcblxuICAgICAieCA8IHkgYW5kIHkgPD0geiIgaW1wbGllcyAieCA8IHoiXG5cbiogSW52ZXJzZSBjb21wYXJpc29uIHNob3VsZCByZXN1bHQgaW4gdGhlIGJvb2xlYW4gbmVnYXRpb24uIEluIG90aGVyXG4gIHdvcmRzLCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lIHJlc3VsdDpcblxuICAgICAieCA9PSB5IiBhbmQgIm5vdCB4ICE9IHkiXG5cbiAgICAgInggPCB5IiBhbmQgIm5vdCB4ID49IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG5cbiAgICAgInggPiB5IiBhbmQgIm5vdCB4IDw9IHkiIChmb3IgdG90YWwgb3JkZXJpbmcpXG5cbiAgVGhlIGxhc3QgdHdvIGV4cHJlc3Npb25zIGFwcGx5IHRvIHRvdGFsbHkgb3JkZXJlZCBjb2xsZWN0aW9ucyAoZS5nLlxuICB0byBzZXF1ZW5jZXMsIGJ1dCBub3QgdG8gc2V0cyBvciBtYXBwaW5ncykuIFNlZSBhbHNvIHRoZVxuICAidG90YWxfb3JkZXJpbmcoKSIgZGVjb3JhdG9yLlxuXG5QeXRob24gZG9lcyBub3QgZW5mb3JjZSB0aGVzZSBjb25zaXN0ZW5jeSBydWxlcy4gSW4gZmFjdCwgdGhlXG5ub3QtYS1udW1iZXIgdmFsdWVzIGFyZSBhbiBleGFtcGxlIGZvciBub3QgZm9sbG93aW5nIHRoZXNlIHJ1bGVzLlxuXG5cbk1lbWJlcnNoaXAgdGVzdCBvcGVyYXRpb25zXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb3BlcmF0b3JzICJpbiIgYW5kICJub3QgaW4iIHRlc3QgZm9yIG1lbWJlcnNoaXAuICAieCBpbiBzIlxuZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG5ub3QgaW4gcyIgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgInggaW4gcyIuICBBbGwgYnVpbHQtaW4gc2VxdWVuY2VzXG5hbmQgc2V0IHR5cGVzIHN1cHBvcnQgdGhpcyBhcyB3ZWxsIGFzIGRpY3Rpb25hcnksIGZvciB3aGljaCAiaW4iIHRlc3RzXG53aGV0aGVyIHRoZSBkaWN0aW9uYXJ5IGhhcyBhIGdpdmVuIGtleS4gRm9yIGNvbnRhaW5lciB0eXBlcyBzdWNoIGFzXG5saXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbmV4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbnkpIi5cblxuRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBpc1xuYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzICJ5LmZpbmQoeCkgIT0gLTEiLiAgRW1wdHlcbnN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG5zbyAiIiIgaW4gImFiYyIiIHdpbGwgcmV0dXJuICJUcnVlIi5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG5pbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbmRlZmluZSAiX19pdGVyX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgc29tZSB2YWx1ZSAieiIgd2l0aCAieCA9PSB6IlxuaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZFxuZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbiJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCA9PSB5W2ldIiwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSAiSW5kZXhFcnJvciIgZXhjZXB0aW9uLiAgKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgIm5vdCBpbiIgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbiJpbiIuXG5cblxuSWRlbnRpdHkgY29tcGFyaXNvbnNcbj09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRvcnMgImlzIiBhbmQgImlzIG5vdCIgdGVzdCBmb3Igb2JqZWN0IGlkZW50aXR5OiAieCBpcyB5IiBpc1xudHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgInggaXMgbm90IHkiXG55aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs0XVxuJywKLSAnY29tcG91bmQnOiB1J1xuQ29tcG91bmQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKlxuXG5Db21wb3VuZCBzdGF0ZW1lbnRzIGNvbnRhaW4gKGdyb3VwcyBvZikgb3RoZXIgc3RhdGVtZW50czsgdGhleSBhZmZlY3Rcbm9yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgSW5cbmdlbmVyYWwsIGNvbXBvdW5kIHN0YXRlbWVudHMgc3BhbiBtdWx0aXBsZSBsaW5lcywgYWx0aG91Z2ggaW4gc2ltcGxlXG5pbmNhcm5hdGlvbnMgYSB3aG9sZSBjb21wb3VuZCBzdGF0ZW1lbnQgbWF5IGJlIGNvbnRhaW5lZCBpbiBvbmUgbGluZS5cblxuVGhlICJpZiIsICJ3aGlsZSIgYW5kICJmb3IiIHN0YXRlbWVudHMgaW1wbGVtZW50IHRyYWRpdGlvbmFsIGNvbnRyb2xcbmZsb3cgY29uc3RydWN0cy4gICJ0cnkiIHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXBcbmNvZGUgZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cywgd2hpbGUgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgYWxsb3dzIHRoZVxuZXhlY3V0aW9uIG9mIGluaXRpYWxpemF0aW9uIGFuZCBmaW5hbGl6YXRpb24gY29kZSBhcm91bmQgYSBibG9jayBvZlxuY29kZS4gIEZ1bmN0aW9uIGFuZCBjbGFzcyBkZWZpbml0aW9ucyBhcmUgYWxzbyBzeW50YWN0aWNhbGx5IGNvbXBvdW5kXG5zdGF0ZW1lbnRzLlxuXG5BIGNvbXBvdW5kIHN0YXRlbWVudCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBcJ2NsYXVzZXMuXCcgIEEgY2xhdXNlXG5jb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSBcJ3N1aXRlLlwnICBUaGUgY2xhdXNlIGhlYWRlcnMgb2YgYVxucGFydGljdWxhciBjb21wb3VuZCBzdGF0ZW1lbnQgYXJlIGFsbCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbC5cbkVhY2ggY2xhdXNlIGhlYWRlciBiZWdpbnMgd2l0aCBhIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGtleXdvcmQgYW5kIGVuZHNcbndpdGggYSBjb2xvbi4gIEEgc3VpdGUgaXMgYSBncm91cCBvZiBzdGF0ZW1lbnRzIGNvbnRyb2xsZWQgYnkgYVxuY2xhdXNlLiAgQSBzdWl0ZSBjYW4gYmUgb25lIG9yIG1vcmUgc2VtaWNvbG9uLXNlcGFyYXRlZCBzaW1wbGVcbnN0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaGVhZGVyLCBmb2xsb3dpbmcgdGhlIGhlYWRlclwnc1xuY29sb24sIG9yIGl0IGNhbiBiZSBvbmUgb3IgbW9yZSBpbmRlbnRlZCBzdGF0ZW1lbnRzIG9uIHN1YnNlcXVlbnRcbmxpbmVzLiAgT25seSB0aGUgbGF0dGVyIGZvcm0gb2YgYSBzdWl0ZSBjYW4gY29udGFpbiBuZXN0ZWQgY29tcG91bmRcbnN0YXRlbWVudHM7IHRoZSBmb2xsb3dpbmcgaXMgaWxsZWdhbCwgbW9zdGx5IGJlY2F1c2UgaXQgd291bGRuXCd0IGJlXG5jbGVhciB0byB3aGljaCAiaWYiIGNsYXVzZSBhIGZvbGxvd2luZyAiZWxzZSIgY2xhdXNlIHdvdWxkIGJlbG9uZzpcblxuICAgaWYgdGVzdDE6IGlmIHRlc3QyOiBwcmludCh4KVxuXG5BbHNvIG5vdGUgdGhhdCB0aGUgc2VtaWNvbG9uIGJpbmRzIHRpZ2h0ZXIgdGhhbiB0aGUgY29sb24gaW4gdGhpc1xuY29udGV4dCwgc28gdGhhdCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGVpdGhlciBhbGwgb3Igbm9uZSBvZiB0aGVcbiJwcmludCgpIiBjYWxscyBhcmUgZXhlY3V0ZWQ6XG5cbiAgIGlmIHggPCB5IDwgejogcHJpbnQoeCk7IHByaW50KHkpOyBwcmludCh6KVxuXG5TdW1tYXJpemluZzpcblxuICAgY29tcG91bmRfc3RtdCA6Oj0gaWZfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB3aGlsZV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGZvcl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHRyeV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHdpdGhfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGNsYXNzZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX3dpdGhfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mb3Jfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBhc3luY19mdW5jZGVmXG4gICBzdWl0ZSAgICAgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IE5FV0xJTkUgSU5ERU5UIHN0YXRlbWVudCsgREVERU5UXG4gICBzdGF0ZW1lbnQgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IGNvbXBvdW5kX3N0bXRcbiAgIHN0bXRfbGlzdCAgICAgOjo9IHNpbXBsZV9zdG10ICgiOyIgc2ltcGxlX3N0bXQpKiBbIjsiXVxuXG5Ob3RlIHRoYXQgc3RhdGVtZW50cyBhbHdheXMgZW5kIGluIGEgIk5FV0xJTkUiIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IGFcbiJERURFTlQiLiAgQWxzbyBub3RlIHRoYXQgb3B0aW9uYWwgY29udGludWF0aW9uIGNsYXVzZXMgYWx3YXlzIGJlZ2luXG53aXRoIGEga2V5d29yZCB0aGF0IGNhbm5vdCBzdGFydCBhIHN0YXRlbWVudCwgdGh1cyB0aGVyZSBhcmUgbm9cbmFtYmlndWl0aWVzICh0aGUgXCdkYW5nbGluZyAiZWxzZSJcJyBwcm9ibGVtIGlzIHNvbHZlZCBpbiBQeXRob24gYnlcbnJlcXVpcmluZyBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIHRvIGJlIGluZGVudGVkKS5cblxuVGhlIGZvcm1hdHRpbmcgb2YgdGhlIGdyYW1tYXIgcnVsZXMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwbGFjZXNcbmVhY2ggY2xhdXNlIG9uIGEgc2VwYXJhdGUgbGluZSBmb3IgY2xhcml0eS5cblxuXG5UaGUgImlmIiBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PVxuXG5UaGUgImlmIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG5cblxuVGhlICJ3aGlsZSIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PT1cblxuVGhlICJ3aGlsZSIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG5leHByZXNzaW9uIGlzIHRydWU6XG5cbiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGVcbmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lXG5pdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWRcbmFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuXG5BICJicmVhayIgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbmV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kIGdvZXMgYmFja1xudG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi5cblxuXG5UaGUgImZvciIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09XG5cblRoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2VcbihzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG5cbiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG5vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuImV4cHJlc3Npb25fbGlzdCIuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoIGl0ZW1cbnByb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMgKHNlZSAqQXNzaWdubWVudCBzdGF0ZW1lbnRzKiksIGFuZCB0aGVuIHRoZSBzdWl0ZSBpc1xuZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmUgZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZVxuc2VxdWVuY2UgaXMgZW1wdHkgb3IgYW4gaXRlcmF0b3IgcmFpc2VzIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiksXG50aGUgc3VpdGUgaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3BcbnRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgY29udGludWVzXG53aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlICJlbHNlIiBjbGF1c2UgaWYgdGhlcmUgaXMgbm8gbmV4dFxuaXRlbS5cblxuVGhlIGZvci1sb29wIG1ha2VzIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZXMocykgaW4gdGhlIHRhcmdldCBsaXN0LlxuVGhpcyBvdmVyd3JpdGVzIGFsbCBwcmV2aW91cyBhc3NpZ25tZW50cyB0byB0aG9zZSB2YXJpYWJsZXMgaW5jbHVkaW5nXG50aG9zZSBtYWRlIGluIHRoZSBzdWl0ZSBvZiB0aGUgZm9yLWxvb3A6XG5cbiAgIGZvciBpIGluIHJhbmdlKDEwKTpcbiAgICAgICBwcmludChpKVxuICAgICAgIGkgPSA1ICAgICAgICAgICAgICMgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGZvci1sb29wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmRleCBpbiB0aGUgcmFuZ2VcblxuTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLFxuYnV0IGlmIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSwgdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXRcbmFsbCBieSB0aGUgbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAicmFuZ2UoKSIgcmV0dXJucyBhblxuaXRlcmF0b3Igb2YgaW50ZWdlcnMgc3VpdGFibGUgdG8gZW11bGF0ZSB0aGUgZWZmZWN0IG9mIFBhc2NhbFwncyAiZm9yIGlcbjo9IGEgdG8gYiBkbyI7IGUuZy4sICJsaXN0KHJhbmdlKDMpKSIgcmV0dXJucyB0aGUgbGlzdCAiWzAsIDEsIDJdIi5cblxuTm90ZTogVGhlcmUgaXMgYSBzdWJ0bGV0eSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBiZWluZyBtb2RpZmllZCBieSB0aGVcbiAgbG9vcCAodGhpcyBjYW4gb25seSBvY2N1ciBmb3IgbXV0YWJsZSBzZXF1ZW5jZXMsIGkuZS4gbGlzdHMpLiAgQW5cbiAgaW50ZXJuYWwgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsXG4gIGFuZCB0aGlzIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzXG4gIHJlYWNoZWQgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnNcbiAgdGhhdCBpZiB0aGUgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZVxuICBzZXF1ZW5jZSwgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mXG4gIHRoZSBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG5cblxuVGhlICJ0cnkiIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PVxuXG5UaGUgInRyeSIgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcblxuICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbImFzIiBpZGVudGlmaWVyXV0gIjoiIHN1aXRlKStcbiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4gICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuXG5UaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuIG5vXG5leGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG5leGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggZm9yIGFuXG5leGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdCBjbGF1c2VzXG5pbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuIGV4cHJlc3Npb24tXG5sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcyBhbnlcbmV4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdCBleHByZXNzaW9uXG5pcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUgcmVzdWx0aW5nXG5vYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpcyBjb21wYXRpYmxlXG53aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZSBleGNlcHRpb25cbm9iamVjdCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlIGV4Y2VwdGlvbi5cblxuSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uIHN0YWNrLlxuWzFdXG5cbklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG5yYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kXG5hIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxudGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSAidHJ5IiBzdGF0ZW1lbnQgcmFpc2VkXG50aGUgZXhjZXB0aW9uKS5cblxuV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbnRoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZlxucHJlc2VudCwgYW5kIHRoZSBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdFxuY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzXG5yZWFjaGVkLCBleGVjdXRpb24gY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC5cbihUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLFxuYW5kIHRoZSBleGNlcHRpb24gb2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGVcbm91dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZFxuYXQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0IGNsYXVzZS4gIFRoaXMgaXMgYXMgaWZcblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICBmb29cblxud2FzIHRyYW5zbGF0ZWQgdG9cblxuICAgZXhjZXB0IEUgYXMgTjpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIGZvb1xuICAgICAgIGZpbmFsbHk6XG4gICAgICAgICAgIGRlbCBOXG5cblRoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmVcbmFibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlIGV4Y2VwdCBjbGF1c2UuICBFeGNlcHRpb25zIGFyZSBjbGVhcmVkXG5iZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSByZWZlcmVuY2VcbmN5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSBhbGl2ZVxudW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy5cblxuQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG5leGNlcHRpb24gYXJlIHN0b3JlZCBpbiB0aGUgInN5cyIgbW9kdWxlIGFuZCBjYW4gYmUgYWNjZXNzZWQgdmlhXG4ic3lzLmV4Y19pbmZvKCkiLiAic3lzLmV4Y19pbmZvKCkiIHJldHVybnMgYSAzLXR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlXG5leGNlcHRpb24gY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlXG5wcm9ncmFtIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICAic3lzLmV4Y19pbmZvKCkiIHZhbHVlcyBhcmVcbnJlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZ1xuZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG5cblRoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG50aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlIGFyZVxubm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLlxuXG5JZiAiZmluYWxseSIgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZSAidHJ5IlxuY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmIGFuXG5leGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZVxuZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZC4gIElmXG50aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgImZpbmFsbHkiXG5jbGF1c2UuICBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSBzYXZlZFxuZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICJmaW5hbGx5IlxuY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIgb3IgImJyZWFrIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZCBleGNlcHRpb25cbmlzIGRpc2NhcmRlZDpcblxuICAgPj4+IGRlZiBmKCk6XG4gICAuLi4gICAgIHRyeTpcbiAgIC4uLiAgICAgICAgIDEvMFxuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIDQyXG4gICAuLi5cbiAgID4+PiBmKClcbiAgIDQyXG5cblRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbmV4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS5cblxuV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZVxuInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgY2xhdXNlIGlzXG5hbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSAiY29udGludWUiIHN0YXRlbWVudCBpcyBpbGxlZ2FsIGluXG50aGUgImZpbmFsbHkiIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnRcbmltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG5cblRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iXG5zdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGFcbiJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyBiZSB0aGVcbmxhc3Qgb25lIGV4ZWN1dGVkOlxuXG4gICA+Pj4gZGVmIGZvbygpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCd0cnlcJ1xuICAgLi4uICAgICBmaW5hbGx5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnZmluYWxseVwnXG4gICAuLi5cbiAgID4+PiBmb28oKVxuICAgXCdmaW5hbGx5XCdcblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG9cbmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG5cblRoZSAid2l0aCIgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgIndpdGgiIHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyYXAgdGhlIGV4ZWN1dGlvbiBvZiBhIGJsb2NrIHdpdGhcbm1ldGhvZHMgZGVmaW5lZCBieSBhIGNvbnRleHQgbWFuYWdlciAoc2VlIHNlY3Rpb24gKldpdGggU3RhdGVtZW50XG5Db250ZXh0IE1hbmFnZXJzKikuIFRoaXMgYWxsb3dzIGNvbW1vbiAidHJ5Ii4uLiJleGNlcHQiLi4uImZpbmFsbHkiXG51c2FnZSBwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQgZm9yIGNvbnZlbmllbnQgcmV1c2UuXG5cbiAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cblxuVGhlIGV4ZWN1dGlvbiBvZiB0aGUgIndpdGgiIHN0YXRlbWVudCB3aXRoIG9uZSAiaXRlbSIgcHJvY2VlZHMgYXNcbmZvbGxvd3M6XG5cbjEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSAid2l0aF9pdGVtIilcbiAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG5cbjIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuXG4zLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2VudGVyX18oKSIgbWV0aG9kIGlzIGludm9rZWQuXG5cbjQuIElmIGEgdGFyZ2V0IHdhcyBpbmNsdWRlZCBpbiB0aGUgIndpdGgiIHN0YXRlbWVudCwgdGhlIHJldHVyblxuICAgdmFsdWUgZnJvbSAiX19lbnRlcl9fKCkiIGlzIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBOb3RlOiBUaGUgIndpdGgiIHN0YXRlbWVudCBndWFyYW50ZWVzIHRoYXQgaWYgdGhlICJfX2VudGVyX18oKSJcbiAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiAiX19leGl0X18oKSIgd2lsbCBhbHdheXMgYmVcbiAgICAgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZVxuICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuXG41LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG5cbjYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgIl9fZXhpdF9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLiAgSWYgYW5cbiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgdGhyZWVcbiAgICJOb25lIiBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBkdWUgdG8gYW4gZXhjZXB0aW9uLCBhbmQgdGhlIHJldHVybiB2YWx1ZVxuICAgZnJvbSB0aGUgIl9fZXhpdF9fKCkiIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMgcmVyYWlzZWQuXG4gICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsIGFuZFxuICAgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nIHRoZSAid2l0aCJcbiAgIHN0YXRlbWVudC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZVxuICAgcmV0dXJuIHZhbHVlIGZyb20gIl9fZXhpdF9fKCkiIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gcHJvY2VlZHNcbiAgIGF0IHRoZSBub3JtYWwgbG9jYXRpb24gZm9yIHRoZSBraW5kIG9mIGV4aXQgdGhhdCB3YXMgdGFrZW4uXG5cbldpdGggbW9yZSB0aGFuIG9uZSBpdGVtLCB0aGUgY29udGV4dCBtYW5hZ2VycyBhcmUgcHJvY2Vzc2VkIGFzIGlmXG5tdWx0aXBsZSAid2l0aCIgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcblxuICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4gICAgICAgc3VpdGVcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICB3aXRoIEEoKSBhcyBhOlxuICAgICAgIHdpdGggQigpIGFzIGI6XG4gICAgICAgICAgIHN1aXRlXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbnRleHQgZXhwcmVzc2lvbnMuXG5cblNlZSBhbHNvOiAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCJcbiAgICAgc3RhdGVtZW50LlxuXG5cbkZ1bmN0aW9uIGRlZmluaXRpb25zXG49PT09PT09PT09PT09PT09PT09PVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGZ1bmNkZWYgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4gICBkb3R0ZWRfbmFtZSAgICA6Oj0gaWRlbnRpZmllciAoIi4iIGlkZW50aWZpZXIpKlxuICAgcGFyYW1ldGVyX2xpc3QgOjo9IChkZWZwYXJhbWV0ZXIgIiwiKSpcbiAgICAgICAgICAgICAgICAgICAgICB8ICIqIiBbcGFyYW1ldGVyXSAoIiwiIGRlZnBhcmFtZXRlcikqIFsiLCIgIioqIiBwYXJhbWV0ZXJdXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKioiIHBhcmFtZXRlclxuICAgICAgICAgICAgICAgICAgICAgIHwgZGVmcGFyYW1ldGVyIFsiLCJdIClcbiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIFsiOiIgZXhwcmVzc2lvbl1cbiAgIGRlZnBhcmFtZXRlciAgIDo6PSBwYXJhbWV0ZXIgWyI9IiBleHByZXNzaW9uXVxuICAgZnVuY25hbWUgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXRzIGV4ZWN1dGlvbiBiaW5kc1xudGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gb2JqZWN0XG4oYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpc1xuZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCBuYW1lc3BhY2VcbmFzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLlxuXG5UaGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBkb2VzIG5vdCBleGVjdXRlIHRoZSBmdW5jdGlvbiBib2R5OyB0aGlzIGdldHNcbmV4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbM11cblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqXG5leHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXNcbmRlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgVGhlXG5yZXN1bHQgbXVzdCBiZSBhIGNhbGxhYmxlLCB3aGljaCBpcyBpbnZva2VkIHdpdGggdGhlIGZ1bmN0aW9uIG9iamVjdFxuYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgZnVuY3Rpb24gbmFtZVxuaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpblxubmVzdGVkIGZhc2hpb24uIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGVcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgZGVmIGZ1bmMoKTogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGRlZiBmdW5jKCk6IHBhc3NcbiAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKVxuXG5XaGVuIG9uZSBvciBtb3JlICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqICI9IlxuKmV4cHJlc3Npb24qLCB0aGUgZnVuY3Rpb24gaXMgc2FpZCB0byBoYXZlICJkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMuIlxuRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyAqYXJndW1lbnQqIG1heVxuYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyXCdzIGRlZmF1bHQgdmFsdWUgaXNcbnN1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZ1xucGFyYW1ldGVycyB1cCB1bnRpbCB0aGUgIiIqIiIgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSB0aGlzXG5pcyBhIHN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlIGdyYW1tYXIuXG5cbioqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHdoZW4gdGhlXG5mdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLioqIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhwcmVzc2lvbiBpc1xuZXZhbHVhdGVkIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICJwcmUtXG5jb21wdXRlZCIgdmFsdWUgaXMgdXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudFxudG8gdW5kZXJzdGFuZCB3aGVuIGEgZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCBhcyBhXG5saXN0IG9yIGEgZGljdGlvbmFyeTogaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gYnlcbmFwcGVuZGluZyBhbiBpdGVtIHRvIGEgbGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCBtb2RpZmllZC5cblRoaXMgaXMgZ2VuZXJhbGx5IG5vdCB3aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzIGlzIHRvIHVzZVxuIk5vbmUiIGFzIHRoZSBkZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiB0aGVcbmZ1bmN0aW9uLCBlLmcuOlxuXG4gICBkZWYgd2hhdHNfb25fdGhlX3RlbGx5KHBlbmd1aW49Tm9uZSk6XG4gICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOlxuICAgICAgICAgICBwZW5ndWluID0gW11cbiAgICAgICBwZW5ndWluLmFwcGVuZCgicHJvcGVydHkgb2YgdGhlIHpvbyIpXG4gICAgICAgcmV0dXJuIHBlbmd1aW5cblxuRnVuY3Rpb24gY2FsbCBzZW1hbnRpY3MgYXJlIGRlc2NyaWJlZCBpbiBtb3JlIGRldGFpbCBpbiBzZWN0aW9uXG4qQ2FsbHMqLiBBIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGFzc2lnbnMgdmFsdWVzIHRvIGFsbCBwYXJhbWV0ZXJzXG5tZW50aW9uZWQgaW4gdGhlIHBhcmFtZXRlciBsaXN0LCBlaXRoZXIgZnJvbSBwb3NpdGlvbiBhcmd1bWVudHMsIGZyb21cbmtleXdvcmQgYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm1cbiIiKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZyBhbnlcbmV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWYgdGhlXG5mb3JtICIiKippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXdcbmRpY3Rpb25hcnkgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXdcbmVtcHR5IGRpY3Rpb25hcnkuIFBhcmFtZXRlcnMgYWZ0ZXIgIiIqIiIgb3IgIiIqaWRlbnRpZmllciIiIGFyZVxua2V5d29yZC1vbmx5IHBhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCB1c2VkIGtleXdvcmQgYXJndW1lbnRzLlxuXG5QYXJhbWV0ZXJzIG1heSBoYXZlIGFubm90YXRpb25zIG9mIHRoZSBmb3JtICIiOiBleHByZXNzaW9uIiIgZm9sbG93aW5nXG50aGUgcGFyYW1ldGVyIG5hbWUuICBBbnkgcGFyYW1ldGVyIG1heSBoYXZlIGFuIGFubm90YXRpb24gZXZlbiB0aG9zZVxub2YgdGhlIGZvcm0gIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIi4gIEZ1bmN0aW9ucyBtYXkgaGF2ZVxuInJldHVybiIgYW5ub3RhdGlvbiBvZiB0aGUgZm9ybSAiIi0+IGV4cHJlc3Npb24iIiBhZnRlciB0aGUgcGFyYW1ldGVyXG5saXN0LiAgVGhlc2UgYW5ub3RhdGlvbnMgY2FuIGJlIGFueSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiBhbmQgYXJlXG5ldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4gIEFubm90YXRpb25zIG1heVxuYmUgZXZhbHVhdGVkIGluIGEgZGlmZmVyZW50IG9yZGVyIHRoYW4gdGhleSBhcHBlYXIgaW4gdGhlIHNvdXJjZSBjb2RlLlxuVGhlIHByZXNlbmNlIG9mIGFubm90YXRpb25zIGRvZXMgbm90IGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mIGFcbmZ1bmN0aW9uLiAgVGhlIGFubm90YXRpb24gdmFsdWVzIGFyZSBhdmFpbGFibGUgYXMgdmFsdWVzIG9mIGFcbmRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnNcJyBuYW1lcyBpbiB0aGUgIl9fYW5ub3RhdGlvbnNfXyJcbmF0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LlxuXG5JdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zIChmdW5jdGlvbnMgbm90IGJvdW5kXG50byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGFcbmV4cHJlc3Npb25zLCBkZXNjcmliZWQgaW4gc2VjdGlvbiAqTGFtYmRhcyouICBOb3RlIHRoYXQgdGhlIGxhbWJkYVxuZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiBkZWZpbml0aW9uO1xuYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgIiJkZWYiIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3JcbmFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSBqdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgbGFtYmRhXG5leHByZXNzaW9uLiAgVGhlICIiZGVmIiIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlIGl0XG5hbGxvd3MgdGhlIGV4ZWN1dGlvbiBvZiBtdWx0aXBsZSBzdGF0ZW1lbnRzIGFuZCBhbm5vdGF0aW9ucy5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogRnVuY3Rpb25zIGFyZSBmaXJzdC1jbGFzcyBvYmplY3RzLiAgQSAiImRlZiIiXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWxcbmZ1bmN0aW9uIHRoYXQgY2FuIGJlIHJldHVybmVkIG9yIHBhc3NlZCBhcm91bmQuICBGcmVlIHZhcmlhYmxlcyB1c2VkXG5pbiB0aGUgbmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZnVuY3Rpb25cbmNvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqIGZvciBkZXRhaWxzLlxuXG5TZWUgYWxzbzogKipQRVAgMzEwNyoqIC0gRnVuY3Rpb24gQW5ub3RhdGlvbnNcblxuICAgICBUaGUgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBmb3IgZnVuY3Rpb24gYW5ub3RhdGlvbnMuXG5cblxuQ2xhc3MgZGVmaW5pdGlvbnNcbj09PT09PT09PT09PT09PT09XG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkXG50eXBlIGhpZXJhcmNoeSopOlxuXG4gICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlXG4gICBpbmhlcml0YW5jZSA6Oj0gIigiIFthcmd1bWVudF9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIFRoZSBpbmhlcml0YW5jZSBsaXN0XG51c3VhbGx5IGdpdmVzIGEgbGlzdCBvZiBiYXNlIGNsYXNzZXMgKHNlZSAqQ3VzdG9taXppbmcgY2xhc3MgY3JlYXRpb24qXG5mb3IgbW9yZSBhZHZhbmNlZCB1c2VzKSwgc28gZWFjaCBpdGVtIGluIHRoZSBsaXN0IHNob3VsZCBldmFsdWF0ZSB0byBhXG5jbGFzcyBvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuIGluaGVyaXRhbmNlXG5saXN0IGluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLFxuXG4gICBjbGFzcyBGb286XG4gICAgICAgcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvXG5cbiAgIGNsYXNzIEZvbyhvYmplY3QpOlxuICAgICAgIHBhc3NcblxuVGhlIGNsYXNzXCdzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uIGZyYW1lIChzZWVcbipOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsIG5hbWVzcGFjZSBhbmQgdGhlXG5vcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlIGNvbnRhaW5zIG1vc3RseVxuZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3NcJ3Mgc3VpdGUgZmluaXNoZXMgZXhlY3V0aW9uLCBpdHNcbmV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXMgc2F2ZWQuIFs0XSBBXG5jbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0IGZvciB0aGUgYmFzZVxuY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LlxuVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxvY2FsXG5uYW1lc3BhY2UuXG5cbkNsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgKm1ldGFjbGFzc2VzKi5cblxuQ2xhc3NlcyBjYW4gYWxzbyBiZSBkZWNvcmF0ZWQ6IGp1c3QgbGlrZSB3aGVuIGRlY29yYXRpbmcgZnVuY3Rpb25zLFxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBjbGFzcyBGb286IHBhc3NcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICBjbGFzcyBGb286IHBhc3NcbiAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcblxuVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvclxuZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgbXVzdCBiZSBhIGNsYXNzIG9iamVjdCwgd2hpY2ggaXMgdGhlblxuYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgYXR0cmlidXRlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGluc3RhbmNlcy4gIEluc3RhbmNlIGF0dHJpYnV0ZXNcbmNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCAic2VsZi5uYW1lID0gdmFsdWUiLiAgQm90aCBjbGFzcyBhbmRcbmluc3RhbmNlIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb24gIiJzZWxmLm5hbWUiIixcbmFuZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgaGlkZXMgYSBjbGFzcyBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lXG53aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0c1xuZm9yIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW4gbGVhZCB0b1xudW5leHBlY3RlZCByZXN1bHRzLiAgKkRlc2NyaXB0b3JzKiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VcbnZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLlxuXG5TZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMgKipQRVAgMzEyOSoqIC1cbiAgQ2xhc3MgRGVjb3JhdG9yc1xuXG5cbkNvcm91dGluZXNcbj09PT09PT09PT1cblxuTmV3IGluIHZlcnNpb24gMy41LlxuXG5cbkNvcm91dGluZSBmdW5jdGlvbiBkZWZpbml0aW9uXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY19mdW5jZGVmIDo6PSBbZGVjb3JhdG9yc10gImFzeW5jIiAiZGVmIiBmdW5jbmFtZSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG5cbkV4ZWN1dGlvbiBvZiBQeXRob24gY29yb3V0aW5lcyBjYW4gYmUgc3VzcGVuZGVkIGFuZCByZXN1bWVkIGF0IG1hbnlcbnBvaW50cyAoc2VlICpjb3JvdXRpbmUqKS4gIEluIHRoZSBib2R5IG9mIGEgY29yb3V0aW5lLCBhbnkgImF3YWl0IiBhbmRcbiJhc3luYyIgaWRlbnRpZmllcnMgYmVjb21lIHJlc2VydmVkIGtleXdvcmRzOyAiYXdhaXQiIGV4cHJlc3Npb25zLFxuImFzeW5jIGZvciIgYW5kICJhc3luYyB3aXRoIiBjYW4gb25seSBiZSB1c2VkIGluIGNvcm91dGluZSBib2RpZXMuXG5cbkZ1bmN0aW9ucyBkZWZpbmVkIHdpdGggImFzeW5jIGRlZiIgc3ludGF4IGFyZSBhbHdheXMgY29yb3V0aW5lXG5mdW5jdGlvbnMsIGV2ZW4gaWYgdGhleSBkbyBub3QgY29udGFpbiAiYXdhaXQiIG9yICJhc3luYyIga2V5d29yZHMuXG5cbkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgInlpZWxkIiBleHByZXNzaW9ucyBpbiAiYXN5bmMgZGVmIlxuY29yb3V0aW5lcy5cblxuQW4gZXhhbXBsZSBvZiBhIGNvcm91dGluZSBmdW5jdGlvbjpcblxuICAgYXN5bmMgZGVmIGZ1bmMocGFyYW0xLCBwYXJhbTIpOlxuICAgICAgIGRvX3N0dWZmKClcbiAgICAgICBhd2FpdCBzb21lX2Nvcm91dGluZSgpXG5cblxuVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudFxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY19mb3Jfc3RtdCA6Oj0gImFzeW5jIiBmb3Jfc3RtdFxuXG5BbiAqYXN5bmNocm9ub3VzIGl0ZXJhYmxlKiBpcyBhYmxlIHRvIGNhbGwgYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzXG4qaXRlciogaW1wbGVtZW50YXRpb24sIGFuZCAqYXN5bmNocm9ub3VzIGl0ZXJhdG9yKiBjYW4gY2FsbFxuYXN5bmNocm9ub3VzIGNvZGUgaW4gaXRzICpuZXh0KiBtZXRob2QuXG5cblRoZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgYWxsb3dzIGNvbnZlbmllbnQgaXRlcmF0aW9uIG92ZXJcbmFzeW5jaHJvbm91cyBpdGVyYXRvcnMuXG5cblRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgYXN5bmMgZm9yIFRBUkdFVCBpbiBJVEVSOlxuICAgICAgIEJMT0NLXG4gICBlbHNlOlxuICAgICAgIEJMT0NLMlxuXG5JcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bzpcblxuICAgaXRlciA9IChJVEVSKVxuICAgaXRlciA9IHR5cGUoaXRlcikuX19haXRlcl9fKGl0ZXIpXG4gICBydW5uaW5nID0gVHJ1ZVxuICAgd2hpbGUgcnVubmluZzpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIFRBUkdFVCA9IGF3YWl0IHR5cGUoaXRlcikuX19hbmV4dF9fKGl0ZXIpXG4gICAgICAgZXhjZXB0IFN0b3BBc3luY0l0ZXJhdGlvbjpcbiAgICAgICAgICAgcnVubmluZyA9IEZhbHNlXG4gICAgICAgZWxzZTpcbiAgICAgICAgICAgQkxPQ0tcbiAgIGVsc2U6XG4gICAgICAgQkxPQ0syXG5cblNlZSBhbHNvICJfX2FpdGVyX18oKSIgYW5kICJfX2FuZXh0X18oKSIgZm9yIGRldGFpbHMuXG5cbkl0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgImFzeW5jIGZvciIgc3RhdGVtZW50IG91dHNpZGUgb2YgYW5cbiJhc3luYyBkZWYiIGZ1bmN0aW9uLlxuXG5cblRoZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICBhc3luY193aXRoX3N0bXQgOjo9ICJhc3luYyIgd2l0aF9zdG10XG5cbkFuICphc3luY2hyb25vdXMgY29udGV4dCBtYW5hZ2VyKiBpcyBhICpjb250ZXh0IG1hbmFnZXIqIHRoYXQgaXMgYWJsZVxudG8gc3VzcGVuZCBleGVjdXRpb24gaW4gaXRzICplbnRlciogYW5kICpleGl0KiBtZXRob2RzLlxuXG5UaGUgZm9sbG93aW5nIGNvZGU6XG5cbiAgIGFzeW5jIHdpdGggRVhQUiBhcyBWQVI6XG4gICAgICAgQkxPQ0tcblxuSXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86XG5cbiAgIG1nciA9IChFWFBSKVxuICAgYWV4aXQgPSB0eXBlKG1ncikuX19hZXhpdF9fXG4gICBhZW50ZXIgPSB0eXBlKG1ncikuX19hZW50ZXJfXyhtZ3IpXG4gICBleGMgPSBUcnVlXG5cbiAgIFZBUiA9IGF3YWl0IGFlbnRlclxuICAgdHJ5OlxuICAgICAgIEJMT0NLXG4gICBleGNlcHQ6XG4gICAgICAgaWYgbm90IGF3YWl0IGFleGl0KG1nciwgKnN5cy5leGNfaW5mbygpKTpcbiAgICAgICAgICAgcmFpc2VcbiAgIGVsc2U6XG4gICAgICAgYXdhaXQgYWV4aXQobWdyLCBOb25lLCBOb25lLCBOb25lKVxuXG5TZWUgYWxzbyAiX19hZW50ZXJfXygpIiBhbmQgIl9fYWV4aXRfXygpIiBmb3IgZGV0YWlscy5cblxuSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50IG91dHNpZGUgb2YgYW5cbiJhc3luYyBkZWYiIGZ1bmN0aW9uLlxuXG5TZWUgYWxzbzogKipQRVAgNDkyKiogLSBDb3JvdXRpbmVzIHdpdGggYXN5bmMgYW5kIGF3YWl0IHN5bnRheFxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3NcbiAgICB0aGVyZSBpcyBhICJmaW5hbGx5IiBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyXG4gICAgZXhjZXB0aW9uLiBUaGF0IG5ldyBleGNlcHRpb24gY2F1c2VzIHRoZSBvbGQgb25lIHRvIGJlIGxvc3QuXG5cblsyXSBDdXJyZW50bHksIGNvbnRyb2wgImZsb3dzIG9mZiB0aGUgZW5kIiBleGNlcHQgaW4gdGhlIGNhc2Ugb2ZcbiAgICBhbiBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhICJyZXR1cm4iLCAiY29udGludWUiLCBvclxuICAgICJicmVhayIgc3RhdGVtZW50LlxuXG5bM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGVcbiAgICBmdW5jdGlvbiBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uXCdzICJfX2RvY19fIlxuICAgIGF0dHJpYnV0ZSBhbmQgdGhlcmVmb3JlIHRoZSBmdW5jdGlvblwncyAqZG9jc3RyaW5nKi5cblxuWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2VcJ3MgIl9fZG9jX18iIGl0ZW0gYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBjbGFzc1wncyAqZG9jc3RyaW5nKi5cbicsCi0gJ2NvbnRleHQtbWFuYWdlcnMnOiB1J1xuV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vyc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0b1xuYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSAid2l0aCIgc3RhdGVtZW50LiBUaGUgY29udGV4dCBtYW5hZ2VyXG5oYW5kbGVzIHRoZSBlbnRyeSBpbnRvLCBhbmQgdGhlIGV4aXQgZnJvbSwgdGhlIGRlc2lyZWQgcnVudGltZSBjb250ZXh0XG5mb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmxvY2sgb2YgY29kZS4gIENvbnRleHQgbWFuYWdlcnMgYXJlIG5vcm1hbGx5XG5pbnZva2VkIHVzaW5nIHRoZSAid2l0aCIgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvbiAqVGhlIHdpdGhcbnN0YXRlbWVudCopLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpciBtZXRob2RzLlxuXG5UeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgcmVzdG9yaW5nIHZhcmlvdXNcbmtpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nIHJlc291cmNlcywgY2xvc2luZyBvcGVuZWRcbmZpbGVzLCBldGMuXG5cbkZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZSAqQ29udGV4dCBNYW5hZ2VyIFR5cGVzKi5cblxub2JqZWN0Ll9fZW50ZXJfXyhzZWxmKVxuXG4gICBFbnRlciB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSAid2l0aCJcbiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2RcJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocylcbiAgIHNwZWNpZmllZCBpbiB0aGUgImFzIiBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuXG5vYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuXG4gICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnNcbiAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGVcbiAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlIGFyZ3VtZW50cyB3aWxsXG4gICBiZSAiTm9uZSIuXG5cbiAgIElmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvIHN1cHByZXNzIHRoZVxuICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0IHNob3VsZFxuICAgcmV0dXJuIGEgdHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkXG4gICBub3JtYWxseSB1cG9uIGV4aXQgZnJvbSB0aGlzIG1ldGhvZC5cblxuICAgTm90ZSB0aGF0ICJfX2V4aXRfXygpIiBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluXG4gICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlclwncyByZXNwb25zaWJpbGl0eS5cblxuU2VlIGFsc286ICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcblxuICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uICJ3aXRoIlxuICAgICBzdGF0ZW1lbnQuXG4nLAotICdjb250aW51ZSc6IHUnXG5UaGUgImNvbnRpbnVlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBjb250aW51ZV9zdG10IDo6PSAiY29udGludWUiXG5cbiJjb250aW51ZSIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAid2hpbGUiXG5sb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gb3IgImZpbmFsbHkiXG5jbGF1c2Ugd2l0aGluIHRoYXQgbG9vcC4gIEl0IGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGN5Y2xlIG9mIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbG9vcC5cblxuV2hlbiAiY29udGludWUiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGFcbiJmaW5hbGx5IiBjbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5XG5zdGFydGluZyB0aGUgbmV4dCBsb29wIGN5Y2xlLlxuJywKLSAnY29udmVyc2lvbnMnOiB1J1xuQXJpdGhtZXRpYyBjb252ZXJzaW9uc1xuKioqKioqKioqKioqKioqKioqKioqKlxuXG5XaGVuIGEgZGVzY3JpcHRpb24gb2YgYW4gYXJpdGhtZXRpYyBvcGVyYXRvciBiZWxvdyB1c2VzIHRoZSBwaHJhc2VcbiJ0aGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCIgdGhpcyBtZWFuc1xudGhhdCB0aGUgb3BlcmF0b3IgaW1wbGVtZW50YXRpb24gZm9yIGJ1aWx0LWluIHR5cGVzIHdvcmtzIGFzIGZvbGxvd3M6XG5cbiogSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgY29tcGxleCBudW1iZXIsIHRoZSBvdGhlciBpcyBjb252ZXJ0ZWQgdG9cbiAgY29tcGxleDtcblxuKiBvdGhlcndpc2UsIGlmIGVpdGhlciBhcmd1bWVudCBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgdGhlXG4gIG90aGVyIGlzIGNvbnZlcnRlZCB0byBmbG9hdGluZyBwb2ludDtcblxuKiBvdGhlcndpc2UsIGJvdGggbXVzdCBiZSBpbnRlZ2VycyBhbmQgbm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkuXG5cblNvbWUgYWRkaXRpb25hbCBydWxlcyBhcHBseSBmb3IgY2VydGFpbiBvcGVyYXRvcnMgKGUuZy4sIGEgc3RyaW5nIGFzIGFcbmxlZnQgYXJndW1lbnQgdG8gdGhlIFwnJVwnIG9wZXJhdG9yKS4gIEV4dGVuc2lvbnMgbXVzdCBkZWZpbmUgdGhlaXIgb3duXG5jb252ZXJzaW9uIGJlaGF2aW9yLlxuJywKLSAnY3VzdG9taXphdGlvbic6IHUnXG5CYXNpYyBjdXN0b21pemF0aW9uXG4qKioqKioqKioqKioqKioqKioqXG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICAiX19uZXdfXygpIiBpcyBhXG4gICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpXG4gICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0c1xuICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZVxuICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuXG4gICB2YWx1ZSBvZiAiX19uZXdfXygpIiBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHkgYW5cbiAgIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgIl9fbmV3X18oKSIgbWV0aG9kIHVzaW5nXG4gICAic3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggYXBwcm9wcmlhdGVcbiAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgYXNcbiAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuXG4gICBJZiAiX19uZXdfXygpIiByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyBpbnN0YW5jZSBhbmQgdGhlXG4gICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byAiX19uZXdfXygpIi5cblxuICAgSWYgIl9fbmV3X18oKSIgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzICJfX2luaXRfXygpIiBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cblxuICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIGFmdGVyIHRoZSBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIChieSAiX19uZXdfXygpIiksIGJ1dFxuICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgIl9faW5pdF9fKCkiIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCwgaWZcbiAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGVcbiAgIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuICAgIkJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pIi5cblxuICAgQmVjYXVzZSAiX19uZXdfXygpIiBhbmQgIl9faW5pdF9fKCkiIHdvcmsgdG9nZXRoZXIgaW4gY29uc3RydWN0aW5nXG4gICBvYmplY3RzICgiX19uZXdfXygpIiB0byBjcmVhdGUgaXQsIGFuZCAiX19pbml0X18oKSIgdG8gY3VzdG9taXNlXG4gICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICJfX2luaXRfXygpIjsgZG9pbmcgc29cbiAgIHdpbGwgY2F1c2UgYSAiVHlwZUVycm9yIiB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSAiX19kZWxfXygpIiBtZXRob2QsIHRoZVxuICAgZGVyaXZlZCBjbGFzc1wncyAiX19kZWxfXygpIiBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXRcbiAgIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2UuXG4gICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3IgdGhlXG4gICAiX19kZWxfXygpIiBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiAiZGVsIHgiIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgInguX19kZWxfXygpIiAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yICJ4IiBieSBvbmUsIGFuZCB0aGUgbGF0dGVyIGlzXG4gICAgIG9ubHkgY2FsbGVkIHdoZW4gIngiXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICBTb21lIGNvbW1vblxuICAgICBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhbiBvYmplY3QgZnJvbVxuICAgICBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBvYmplY3RzIChlLmcuLFxuICAgICBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBwYXJlbnQgYW5kXG4gICAgIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgb2ZcbiAgICAgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgICJzeXMuZXhjX2luZm8oKVsyXSIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IgYSByZWZlcmVuY2VcbiAgICAgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW4gdW5oYW5kbGVkXG4gICAgIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmxhc3RfdHJhY2ViYWNrIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBzZWNvbmQgY2FuIGJlIHJlc29sdmVkIGJ5IGZyZWVpbmcgdGhlIHJlZmVyZW5jZSB0byB0aGVcbiAgICAgdHJhY2ViYWNrIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VmdWwsIGFuZCB0aGUgdGhpcmQgY2FuXG4gICAgIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgIk5vbmUiIGluICJzeXMubGFzdF90cmFjZWJhY2siLiBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCBhbmQgY2xlYW5lZCB1cCB3aGVuIHRoZVxuICAgICBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCkuIFJlZmVyXG4gICAgIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImdjIiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiAgICAgYWJvdXQgdGhpcyB0b3BpYy5cblxuICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2hcbiAgICAgIl9fZGVsX18oKSIgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZ1xuICAgICB0aGVpciBleGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0b1xuICAgICAic3lzLnN0ZGVyciIgaW5zdGVhZC4gQWxzbywgd2hlbiAiX19kZWxfXygpIiBpcyBpbnZva2VkIGluXG4gICAgIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZVxuICAgICBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlICJfX2RlbF9fKCkiXG4gICAgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZ1xuICAgICB0b3JuIGRvd24gKGUuZy4gdGhlIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpc1xuICAgICByZWFzb24sICJfX2RlbF9fKCkiIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZFxuICAgICB0byBtYWludGFpbiBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSxcbiAgICAgUHl0aG9uIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC5cblxub2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSB0aGUgInJlcHIoKSIgYnVpbHQtaW4gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpc1xuICAgc2hvdWxkIGxvb2sgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0b1xuICAgcmVjcmVhdGUgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlXG4gICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm1cbiAgICI8Li4uc29tZSB1c2VmdWwgZGVzY3JpcHRpb24uLi4+IiBzaG91bGQgYmUgcmV0dXJuZWQuIFRoZSByZXR1cm5cbiAgIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgIl9fcmVwcl9fKCkiIGJ1dFxuICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJzdHIob2JqZWN0KSIgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImZvcm1hdCgpIiBhbmRcbiAgICJwcmludCgpIiB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIG9yIG5pY2VseSBwcmludGFibGUgc3RyaW5nXG4gICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSAqc3RyaW5nKlxuICAgb2JqZWN0LlxuXG4gICBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gIm9iamVjdC5fX3JlcHJfXygpIiBpbiB0aGF0IHRoZXJlIGlzIG5vXG4gICBleHBlY3RhdGlvbiB0aGF0ICJfX3N0cl9fKCkiIHJldHVybiBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhXG4gICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC5cblxuICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBieSB0aGUgYnVpbHQtaW4gdHlwZSAib2JqZWN0IlxuICAgY2FsbHMgIm9iamVjdC5fX3JlcHJfXygpIi5cblxub2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgImJ5dGVzKCkiIHRvIGNvbXB1dGUgYSBieXRlLXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiBUaGlzIHNob3VsZCByZXR1cm4gYSAiYnl0ZXMiIG9iamVjdC5cblxub2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpXG5cbiAgIENhbGxlZCBieSB0aGUgImZvcm1hdCgpIiBidWlsdC1pbiBmdW5jdGlvbiAoYW5kIGJ5IGV4dGVuc2lvbiwgdGhlXG4gICAic3RyLmZvcm1hdCgpIiBtZXRob2Qgb2YgY2xhc3MgInN0ciIpIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gVGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgYVxuICAgc3RyaW5nIHRoYXQgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zXG4gICBkZXNpcmVkLiBUaGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgdXAgdG9cbiAgIHRoZSB0eXBlIGltcGxlbWVudGluZyAiX19mb3JtYXRfXygpIiwgaG93ZXZlciBtb3N0IGNsYXNzZXMgd2lsbFxuICAgZWl0aGVyIGRlbGVnYXRlIGZvcm1hdHRpbmcgdG8gb25lIG9mIHRoZSBidWlsdC1pbiB0eXBlcywgb3IgdXNlIGFcbiAgIHNpbWlsYXIgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LlxuXG4gICBTZWUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZVxuICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG5cbiAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiBpdHNlbGZcbiAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgInguX19sZV9fKHkpIixcbiAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgIng+eSIgY2FsbHNcbiAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAiTm90SW1wbGVtZW50ZWQiXG4gICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyIG9mXG4gICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgZm9yIGFcbiAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuIGFueSB2YWx1ZSxcbiAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuIGNvbnRleHQgKGUuZy4sXG4gICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAiYm9vbCgpIlxuICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIEJ5IGRlZmF1bHQsICJfX25lX18oKSIgZGVsZWdhdGVzIHRvICJfX2VxX18oKSIgYW5kIGludmVydHMgdGhlXG4gICByZXN1bHQgdW5sZXNzIGl0IGlzICJOb3RJbXBsZW1lbnRlZCIuICBUaGVyZSBhcmUgbm8gb3RoZXIgaW1wbGllZFxuICAgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGZvciBleGFtcGxlLCB0aGVcbiAgIHRydXRoIG9mICIoeDx5IG9yIHg9PXkpIiBkb2VzIG5vdCBpbXBseSAieDw9eSIuIFRvIGF1dG9tYXRpY2FsbHlcbiAgIGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290IG9wZXJhdGlvbiwgc2VlXG4gICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLlxuXG4gICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uXG4gICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvblxuICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG5cbiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWRcbiAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCB0aGUgcmlnaHRcbiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlIGVhY2ggb3RoZXJcJ3NcbiAgIHJlZmxlY3Rpb24sICJfX2xlX18oKSIgYW5kICJfX2dlX18oKSIgYXJlIGVhY2ggb3RoZXJcJ3MgcmVmbGVjdGlvbixcbiAgIGFuZCAiX19lcV9fKCkiIGFuZCAiX19uZV9fKCkiIGFyZSB0aGVpciBvd24gcmVmbGVjdGlvbi4gSWYgdGhlXG4gICBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLCBhbmQgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGFcbiAgIGRpcmVjdCBvciBpbmRpcmVjdCBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kXCdzIHR5cGUsIHRoZVxuICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksIG90aGVyd2lzZSB0aGVcbiAgIGxlZnQgb3BlcmFuZFwncyBtZXRob2QgaGFzIHByaW9yaXR5LiAgVmlydHVhbCBzdWJjbGFzc2luZyBpcyBub3RcbiAgIGNvbnNpZGVyZWQuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gImhhc2goKSIgYW5kIGZvciBvcGVyYXRpb25zIG9uIG1lbWJlcnNcbiAgIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgInNldCIsICJmcm96ZW5zZXQiLCBhbmQgImRpY3QiLlxuICAgIl9faGFzaF9fKCkiIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5IHJlcXVpcmVkIHByb3BlcnR5XG4gICBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lIGhhc2ggdmFsdWU7IGl0IGlzXG4gICBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2hcbiAgIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhIHBhcnQgaW5cbiAgIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cblxuICAgTm90ZTogImhhc2goKSIgdHJ1bmNhdGVzIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGFuIG9iamVjdFwnc1xuICAgICBjdXN0b20gIl9faGFzaF9fKCkiIG1ldGhvZCB0byB0aGUgc2l6ZSBvZiBhICJQeV9zc2l6ZV90Ii4gIFRoaXNcbiAgICAgaXMgdHlwaWNhbGx5IDggYnl0ZXMgb24gNjQtYml0IGJ1aWxkcyBhbmQgNCBieXRlcyBvbiAzMi1iaXRcbiAgICAgYnVpbGRzLiBJZiBhbiBvYmplY3RcJ3MgICAiX19oYXNoX18oKSIgbXVzdCBpbnRlcm9wZXJhdGUgb24gYnVpbGRzXG4gICAgIG9mIGRpZmZlcmVudCBiaXQgc2l6ZXMsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIHdpZHRoIG9uIGFsbFxuICAgICBzdXBwb3J0ZWQgYnVpbGRzLiAgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpcyB3aXRoICJweXRob24gLWNcbiAgICAgImltcG9ydCBzeXM7IHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiIuXG5cbiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGFuICJfX2VxX18oKSIgbWV0aG9kIGl0IHNob3VsZCBub3RcbiAgIGRlZmluZSBhICJfX2hhc2hfXygpIiBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdCBkZWZpbmVzICJfX2VxX18oKSJcbiAgIGJ1dCBub3QgIl9faGFzaF9fKCkiLCBpdHMgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSBhcyBpdGVtcyBpblxuICAgaGFzaGFibGUgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzIGRlZmluZXMgbXV0YWJsZSBvYmplY3RzIGFuZFxuICAgaW1wbGVtZW50cyBhbiAiX19lcV9fKCkiIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnRcbiAgICJfX2hhc2hfXygpIiwgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhhc2hhYmxlIGNvbGxlY3Rpb25zXG4gICByZXF1aXJlcyB0aGF0IGEga2V5XCdzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0XCdzIGhhc2hcbiAgIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmUgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS5cblxuICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSAiX19lcV9fKCkiIGFuZCAiX19oYXNoX18oKSIgbWV0aG9kcyBieVxuICAgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoXG4gICB0aGVtc2VsdmVzKSBhbmQgInguX19oYXNoX18oKSIgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBzdWNoXG4gICB0aGF0ICJ4ID09IHkiIGltcGxpZXMgYm90aCB0aGF0ICJ4IGlzIHkiIGFuZCAiaGFzaCh4KSA9PSBoYXNoKHkpIi5cblxuICAgQSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIGFuZCBkb2VzIG5vdCBkZWZpbmUgIl9faGFzaF9fKCkiXG4gICB3aWxsIGhhdmUgaXRzICJfX2hhc2hfXygpIiBpbXBsaWNpdGx5IHNldCB0byAiTm9uZSIuICBXaGVuIHRoZVxuICAgIl9faGFzaF9fKCkiIG1ldGhvZCBvZiBhIGNsYXNzIGlzICJOb25lIiwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzc1xuICAgd2lsbCByYWlzZSBhbiBhcHByb3ByaWF0ZSAiVHlwZUVycm9yIiB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0b1xuICAgcmV0cmlldmUgdGhlaXIgaGFzaCB2YWx1ZSwgYW5kIHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIi5cblxuICAgSWYgYSBjbGFzcyB0aGF0IG92ZXJyaWRlcyAiX19lcV9fKCkiIG5lZWRzIHRvIHJldGFpbiB0aGVcbiAgIGltcGxlbWVudGF0aW9uIG9mICJfX2hhc2hfXygpIiBmcm9tIGEgcGFyZW50IGNsYXNzLCB0aGUgaW50ZXJwcmV0ZXJcbiAgIG11c3QgYmUgdG9sZCB0aGlzIGV4cGxpY2l0bHkgYnkgc2V0dGluZyAiX19oYXNoX18gPVxuICAgPFBhcmVudENsYXNzPi5fX2hhc2hfXyIuXG5cbiAgIElmIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSAiX19lcV9fKCkiIHdpc2hlcyB0byBzdXBwcmVzc1xuICAgaGFzaCBzdXBwb3J0LCBpdCBzaG91bGQgaW5jbHVkZSAiX19oYXNoX18gPSBOb25lIiBpbiB0aGUgY2xhc3NcbiAgIGRlZmluaXRpb24uIEEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBpdHMgb3duICJfX2hhc2hfXygpIiB0aGF0XG4gICBleHBsaWNpdGx5IHJhaXNlcyBhICJUeXBlRXJyb3IiIHdvdWxkIGJlIGluY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIGhhc2hhYmxlIGJ5IGFuICJpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpIiBjYWxsLlxuXG4gICBOb3RlOiBCeSBkZWZhdWx0LCB0aGUgIl9faGFzaF9fKCkiIHZhbHVlcyBvZiBzdHIsIGJ5dGVzIGFuZFxuICAgICBkYXRldGltZSBvYmplY3RzIGFyZSAic2FsdGVkIiB3aXRoIGFuIHVucHJlZGljdGFibGUgcmFuZG9tIHZhbHVlLlxuICAgICBBbHRob3VnaCB0aGV5IHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCBQeXRob25cbiAgICAgcHJvY2VzcywgdGhleSBhcmUgbm90IHByZWRpY3RhYmxlIGJldHdlZW4gcmVwZWF0ZWQgaW52b2NhdGlvbnMgb2ZcbiAgICAgUHl0aG9uLlRoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgYSBkZW5pYWwtXG4gICAgIG9mLXNlcnZpY2UgY2F1c2VkIGJ5IGNhcmVmdWxseS1jaG9zZW4gaW5wdXRzIHRoYXQgZXhwbG9pdCB0aGVcbiAgICAgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBvZiBhIGRpY3QgaW5zZXJ0aW9uLCBPKG5eMikgY29tcGxleGl0eS5cbiAgICAgU2VlIGh0dHA6Ly93d3cub2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbCBmb3JcbiAgICAgZGV0YWlscy5DaGFuZ2luZyBoYXNoIHZhbHVlcyBhZmZlY3RzIHRoZSBpdGVyYXRpb24gb3JkZXIgb2ZcbiAgICAgZGljdHMsIHNldHMgYW5kIG90aGVyIG1hcHBpbmdzLiAgUHl0aG9uIGhhcyBuZXZlciBtYWRlIGd1YXJhbnRlZXNcbiAgICAgYWJvdXQgdGhpcyBvcmRlcmluZyAoYW5kIGl0IHR5cGljYWxseSB2YXJpZXMgYmV0d2VlbiAzMi1iaXQgYW5kXG4gICAgIDY0LWJpdCBidWlsZHMpLlNlZSBhbHNvICJQWVRIT05IQVNIU0VFRCIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IEhhc2ggcmFuZG9taXphdGlvbiBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuXG5cbm9iamVjdC5fX2Jvb2xfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb25cbiAgICJib29sKCkiOyBzaG91bGQgcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiLiAgV2hlbiB0aGlzIG1ldGhvZCBpcyBub3RcbiAgIGRlZmluZWQsICJfX2xlbl9fKCkiIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXNcbiAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uICBJZiBhIGNsYXNzIGRlZmluZXNcbiAgIG5laXRoZXIgIl9fbGVuX18oKSIgbm9yICJfX2Jvb2xfXygpIiwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlXG4gICBjb25zaWRlcmVkIHRydWUuXG4nLAotICdkZWJ1Z2dlcic6IHUnXG4icGRiIiAtLS0gVGhlIFB5dGhvbiBEZWJ1Z2dlclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKipTb3VyY2UgY29kZToqKiBMaWIvcGRiLnB5XG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG1vZHVsZSAicGRiIiBkZWZpbmVzIGFuIGludGVyYWN0aXZlIHNvdXJjZSBjb2RlIGRlYnVnZ2VyIGZvclxuUHl0aG9uIHByb2dyYW1zLiAgSXQgc3VwcG9ydHMgc2V0dGluZyAoY29uZGl0aW9uYWwpIGJyZWFrcG9pbnRzIGFuZFxuc2luZ2xlIHN0ZXBwaW5nIGF0IHRoZSBzb3VyY2UgbGluZSBsZXZlbCwgaW5zcGVjdGlvbiBvZiBzdGFjayBmcmFtZXMsXG5zb3VyY2UgY29kZSBsaXN0aW5nLCBhbmQgZXZhbHVhdGlvbiBvZiBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgaW4gdGhlXG5jb250ZXh0IG9mIGFueSBzdGFjayBmcmFtZS4gIEl0IGFsc28gc3VwcG9ydHMgcG9zdC1tb3J0ZW0gZGVidWdnaW5nXG5hbmQgY2FuIGJlIGNhbGxlZCB1bmRlciBwcm9ncmFtIGNvbnRyb2wuXG5cblRoZSBkZWJ1Z2dlciBpcyBleHRlbnNpYmxlIC0tIGl0IGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgdGhlIGNsYXNzXG4iUGRiIi4gVGhpcyBpcyBjdXJyZW50bHkgdW5kb2N1bWVudGVkIGJ1dCBlYXNpbHkgdW5kZXJzdG9vZCBieSByZWFkaW5nXG50aGUgc291cmNlLiAgVGhlIGV4dGVuc2lvbiBpbnRlcmZhY2UgdXNlcyB0aGUgbW9kdWxlcyAiYmRiIiBhbmQgImNtZCIuXG5cblRoZSBkZWJ1Z2dlclwncyBwcm9tcHQgaXMgIihQZGIpIi4gVHlwaWNhbCB1c2FnZSB0byBydW4gYSBwcm9ncmFtIHVuZGVyXG5jb250cm9sIG9mIHRoZSBkZWJ1Z2dlciBpczpcblxuICAgPj4+IGltcG9ydCBwZGJcbiAgID4+PiBpbXBvcnQgbXltb2R1bGVcbiAgID4+PiBwZGIucnVuKFwnbXltb2R1bGUudGVzdCgpXCcpXG4gICA+IDxzdHJpbmc+KDApPygpXG4gICAoUGRiKSBjb250aW51ZVxuICAgPiA8c3RyaW5nPigxKT8oKVxuICAgKFBkYikgY29udGludWVcbiAgIE5hbWVFcnJvcjogXCdzcGFtXCdcbiAgID4gPHN0cmluZz4oMSk/KClcbiAgIChQZGIpXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IFRhYi1jb21wbGV0aW9uIHZpYSB0aGUgInJlYWRsaW5lIiBtb2R1bGUgaXNcbmF2YWlsYWJsZSBmb3IgY29tbWFuZHMgYW5kIGNvbW1hbmQgYXJndW1lbnRzLCBlLmcuIHRoZSBjdXJyZW50IGdsb2JhbFxuYW5kIGxvY2FsIG5hbWVzIGFyZSBvZmZlcmVkIGFzIGFyZ3VtZW50cyBvZiB0aGUgInAiIGNvbW1hbmQuXG5cbiJwZGIucHkiIGNhbiBhbHNvIGJlIGludm9rZWQgYXMgYSBzY3JpcHQgdG8gZGVidWcgb3RoZXIgc2NyaXB0cy4gIEZvclxuZXhhbXBsZTpcblxuICAgcHl0aG9uMyAtbSBwZGIgbXlzY3JpcHQucHlcblxuV2hlbiBpbnZva2VkIGFzIGEgc2NyaXB0LCBwZGIgd2lsbCBhdXRvbWF0aWNhbGx5IGVudGVyIHBvc3QtbW9ydGVtXG5kZWJ1Z2dpbmcgaWYgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgZXhpdHMgYWJub3JtYWxseS4gIEFmdGVyIHBvc3QtXG5tb3J0ZW0gZGVidWdnaW5nIChvciBhZnRlciBub3JtYWwgZXhpdCBvZiB0aGUgcHJvZ3JhbSksIHBkYiB3aWxsXG5yZXN0YXJ0IHRoZSBwcm9ncmFtLiAgQXV0b21hdGljIHJlc3RhcnRpbmcgcHJlc2VydmVzIHBkYlwncyBzdGF0ZSAoc3VjaFxuYXMgYnJlYWtwb2ludHMpIGFuZCBpbiBtb3N0IGNhc2VzIGlzIG1vcmUgdXNlZnVsIHRoYW4gcXVpdHRpbmcgdGhlXG5kZWJ1Z2dlciB1cG9uIHByb2dyYW1cJ3MgZXhpdC5cblxuTmV3IGluIHZlcnNpb24gMy4yOiAicGRiLnB5IiBub3cgYWNjZXB0cyBhICItYyIgb3B0aW9uIHRoYXQgZXhlY3V0ZXNcbmNvbW1hbmRzIGFzIGlmIGdpdmVuIGluIGEgIi5wZGJyYyIgZmlsZSwgc2VlICpEZWJ1Z2dlciBDb21tYW5kcyouXG5cblRoZSB0eXBpY2FsIHVzYWdlIHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyIGZyb20gYSBydW5uaW5nIHByb2dyYW0gaXNcbnRvIGluc2VydFxuXG4gICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKClcblxuYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiB0aGVuXG5zdGVwIHRocm91Z2ggdGhlIGNvZGUgZm9sbG93aW5nIHRoaXMgc3RhdGVtZW50LCBhbmQgY29udGludWUgcnVubmluZ1xud2l0aG91dCB0aGUgZGVidWdnZXIgdXNpbmcgdGhlICJjb250aW51ZSIgY29tbWFuZC5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gaW5zcGVjdCBhIGNyYXNoZWQgcHJvZ3JhbSBpczpcblxuICAgPj4+IGltcG9ydCBwZGJcbiAgID4+PiBpbXBvcnQgbXltb2R1bGVcbiAgID4+PiBteW1vZHVsZS50ZXN0KClcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSA0LCBpbiB0ZXN0XG4gICAgICAgdGVzdDIoKVxuICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSAzLCBpbiB0ZXN0MlxuICAgICAgIHByaW50KHNwYW0pXG4gICBOYW1lRXJyb3I6IHNwYW1cbiAgID4+PiBwZGIucG0oKVxuICAgPiAuL215bW9kdWxlLnB5KDMpdGVzdDIoKVxuICAgLT4gcHJpbnQoc3BhbSlcbiAgIChQZGIpXG5cblRoZSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczsgZWFjaCBlbnRlcnMgdGhlIGRlYnVnZ2VyXG5pbiBhIHNsaWdodGx5IGRpZmZlcmVudCB3YXk6XG5cbnBkYi5ydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuXG4gICBFeGVjdXRlIHRoZSAqc3RhdGVtZW50KiAoZ2l2ZW4gYXMgYSBzdHJpbmcgb3IgYSBjb2RlIG9iamVjdCkgdW5kZXJcbiAgIGRlYnVnZ2VyIGNvbnRyb2wuICBUaGUgZGVidWdnZXIgcHJvbXB0IGFwcGVhcnMgYmVmb3JlIGFueSBjb2RlIGlzXG4gICBleGVjdXRlZDsgeW91IGNhbiBzZXQgYnJlYWtwb2ludHMgYW5kIHR5cGUgImNvbnRpbnVlIiwgb3IgeW91IGNhblxuICAgc3RlcCB0aHJvdWdoIHRoZSBzdGF0ZW1lbnQgdXNpbmcgInN0ZXAiIG9yICJuZXh0IiAoYWxsIHRoZXNlXG4gICBjb21tYW5kcyBhcmUgZXhwbGFpbmVkIGJlbG93KS4gIFRoZSBvcHRpb25hbCAqZ2xvYmFscyogYW5kICpsb2NhbHMqXG4gICBhcmd1bWVudHMgc3BlY2lmeSB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIGNvZGUgaXMgZXhlY3V0ZWQ7IGJ5XG4gICBkZWZhdWx0IHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBtb2R1bGUgIl9fbWFpbl9fIiBpcyB1c2VkLiAgKFNlZSB0aGVcbiAgIGV4cGxhbmF0aW9uIG9mIHRoZSBidWlsdC1pbiAiZXhlYygpIiBvciAiZXZhbCgpIiBmdW5jdGlvbnMuKVxuXG5wZGIucnVuZXZhbChleHByZXNzaW9uLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuXG4gICBFdmFsdWF0ZSB0aGUgKmV4cHJlc3Npb24qIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgb2JqZWN0KVxuICAgdW5kZXIgZGVidWdnZXIgY29udHJvbC4gIFdoZW4gInJ1bmV2YWwoKSIgcmV0dXJucywgaXQgcmV0dXJucyB0aGVcbiAgIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiAgT3RoZXJ3aXNlIHRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0b1xuICAgInJ1bigpIi5cblxucGRiLnJ1bmNhbGwoZnVuY3Rpb24sICphcmdzLCAqKmt3ZHMpXG5cbiAgIENhbGwgdGhlICpmdW5jdGlvbiogKGEgZnVuY3Rpb24gb3IgbWV0aG9kIG9iamVjdCwgbm90IGEgc3RyaW5nKVxuICAgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAgV2hlbiAicnVuY2FsbCgpIiByZXR1cm5zLCBpdCByZXR1cm5zXG4gICB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5lZC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFyc1xuICAgYXMgc29vbiBhcyB0aGUgZnVuY3Rpb24gaXMgZW50ZXJlZC5cblxucGRiLnNldF90cmFjZSgpXG5cbiAgIEVudGVyIHRoZSBkZWJ1Z2dlciBhdCB0aGUgY2FsbGluZyBzdGFjayBmcmFtZS4gIFRoaXMgaXMgdXNlZnVsIHRvXG4gICBoYXJkLWNvZGUgYSBicmVha3BvaW50IGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYSBwcm9ncmFtLCBldmVuIGlmIHRoZVxuICAgY29kZSBpcyBub3Qgb3RoZXJ3aXNlIGJlaW5nIGRlYnVnZ2VkIChlLmcuIHdoZW4gYW4gYXNzZXJ0aW9uXG4gICBmYWlscykuXG5cbnBkYi5wb3N0X21vcnRlbSh0cmFjZWJhY2s9Tm9uZSlcblxuICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSBnaXZlbiAqdHJhY2ViYWNrKiBvYmplY3QuICBJZiBub1xuICAgKnRyYWNlYmFjayogaXMgZ2l2ZW4sIGl0IHVzZXMgdGhlIG9uZSBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgaXNcbiAgIGN1cnJlbnRseSBiZWluZyBoYW5kbGVkIChhbiBleGNlcHRpb24gbXVzdCBiZSBiZWluZyBoYW5kbGVkIGlmIHRoZVxuICAgZGVmYXVsdCBpcyB0byBiZSB1c2VkKS5cblxucGRiLnBtKClcblxuICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSB0cmFjZWJhY2sgZm91bmQgaW5cbiAgICJzeXMubGFzdF90cmFjZWJhY2siLlxuXG5UaGUgInJ1bioiIGZ1bmN0aW9ucyBhbmQgInNldF90cmFjZSgpIiBhcmUgYWxpYXNlcyBmb3IgaW5zdGFudGlhdGluZ1xudGhlICJQZGIiIGNsYXNzIGFuZCBjYWxsaW5nIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZS4gIElmIHlvdSB3YW50XG50byBhY2Nlc3MgZnVydGhlciBmZWF0dXJlcywgeW91IGhhdmUgdG8gZG8gdGhpcyB5b3Vyc2VsZjpcblxuY2xhc3MgY2xhc3MgcGRiLlBkYihjb21wbGV0ZWtleT1cJ3RhYlwnLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc2tpcD1Ob25lLCBub3NpZ2ludD1GYWxzZSlcblxuICAgIlBkYiIgaXMgdGhlIGRlYnVnZ2VyIGNsYXNzLlxuXG4gICBUaGUgKmNvbXBsZXRla2V5KiwgKnN0ZGluKiBhbmQgKnN0ZG91dCogYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlXG4gICB1bmRlcmx5aW5nICJjbWQuQ21kIiBjbGFzczsgc2VlIHRoZSBkZXNjcmlwdGlvbiB0aGVyZS5cblxuICAgVGhlICpza2lwKiBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgZ2xvYi1zdHlsZVxuICAgbW9kdWxlIG5hbWUgcGF0dGVybnMuICBUaGUgZGVidWdnZXIgd2lsbCBub3Qgc3RlcCBpbnRvIGZyYW1lcyB0aGF0XG4gICBvcmlnaW5hdGUgaW4gYSBtb2R1bGUgdGhhdCBtYXRjaGVzIG9uZSBvZiB0aGVzZSBwYXR0ZXJucy4gWzFdXG5cbiAgIEJ5IGRlZmF1bHQsIFBkYiBzZXRzIGEgaGFuZGxlciBmb3IgdGhlIFNJR0lOVCBzaWduYWwgKHdoaWNoIGlzIHNlbnRcbiAgIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyAiQ3RybC1DIiBvbiB0aGUgY29uc29sZSkgd2hlbiB5b3UgZ2l2ZSBhXG4gICAiY29udGludWUiIGNvbW1hbmQuIFRoaXMgYWxsb3dzIHlvdSB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlclxuICAgYWdhaW4gYnkgcHJlc3NpbmcgIkN0cmwtQyIuICBJZiB5b3Ugd2FudCBQZGIgbm90IHRvIHRvdWNoIHRoZVxuICAgU0lHSU5UIGhhbmRsZXIsIHNldCAqbm9zaWdpbnQqIHRvdCB0cnVlLlxuXG4gICBFeGFtcGxlIGNhbGwgdG8gZW5hYmxlIHRyYWNpbmcgd2l0aCAqc2tpcCo6XG5cbiAgICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoc2tpcD1bXCdkamFuZ28uKlwnXSkuc2V0X3RyYWNlKClcblxuICAgTmV3IGluIHZlcnNpb24gMy4xOiBUaGUgKnNraXAqIGFyZ3VtZW50LlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjI6IFRoZSAqbm9zaWdpbnQqIGFyZ3VtZW50LiAgUHJldmlvdXNseSwgYSBTSUdJTlRcbiAgIGhhbmRsZXIgd2FzIG5ldmVyIHNldCBieSBQZGIuXG5cbiAgIHJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4gICBydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4gICBydW5jYWxsKGZ1bmN0aW9uLCAqYXJncywgKiprd2RzKVxuICAgc2V0X3RyYWNlKClcblxuICAgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZnVuY3Rpb25zIGV4cGxhaW5lZCBhYm92ZS5cblxuXG5EZWJ1Z2dlciBDb21tYW5kc1xuPT09PT09PT09PT09PT09PT1cblxuVGhlIGNvbW1hbmRzIHJlY29nbml6ZWQgYnkgdGhlIGRlYnVnZ2VyIGFyZSBsaXN0ZWQgYmVsb3cuICBNb3N0XG5jb21tYW5kcyBjYW4gYmUgYWJicmV2aWF0ZWQgdG8gb25lIG9yIHR3byBsZXR0ZXJzIGFzIGluZGljYXRlZDsgZS5nLlxuImgoZWxwKSIgbWVhbnMgdGhhdCBlaXRoZXIgImgiIG9yICJoZWxwIiBjYW4gYmUgdXNlZCB0byBlbnRlciB0aGUgaGVscFxuY29tbWFuZCAoYnV0IG5vdCAiaGUiIG9yICJoZWwiLCBub3IgIkgiIG9yICJIZWxwIiBvciAiSEVMUCIpLlxuQXJndW1lbnRzIHRvIGNvbW1hbmRzIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgKHNwYWNlcyBvclxudGFicykuICBPcHRpb25hbCBhcmd1bWVudHMgYXJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyAoIltdIikgaW5cbnRoZSBjb21tYW5kIHN5bnRheDsgdGhlIHNxdWFyZSBicmFja2V0cyBtdXN0IG5vdCBiZSB0eXBlZC5cbkFsdGVybmF0aXZlcyBpbiB0aGUgY29tbWFuZCBzeW50YXggYXJlIHNlcGFyYXRlZCBieSBhIHZlcnRpY2FsIGJhclxuKCJ8IikuXG5cbkVudGVyaW5nIGEgYmxhbmsgbGluZSByZXBlYXRzIHRoZSBsYXN0IGNvbW1hbmQgZW50ZXJlZC4gIEV4Y2VwdGlvbjogaWZcbnRoZSBsYXN0IGNvbW1hbmQgd2FzIGEgImxpc3QiIGNvbW1hbmQsIHRoZSBuZXh0IDExIGxpbmVzIGFyZSBsaXN0ZWQuXG5cbkNvbW1hbmRzIHRoYXQgdGhlIGRlYnVnZ2VyIGRvZXNuXCd0IHJlY29nbml6ZSBhcmUgYXNzdW1lZCB0byBiZSBQeXRob25cbnN0YXRlbWVudHMgYW5kIGFyZSBleGVjdXRlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcHJvZ3JhbSBiZWluZ1xuZGVidWdnZWQuICBQeXRob24gc3RhdGVtZW50cyBjYW4gYWxzbyBiZSBwcmVmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uXG5wb2ludCAoIiEiKS4gIFRoaXMgaXMgYSBwb3dlcmZ1bCB3YXkgdG8gaW5zcGVjdCB0aGUgcHJvZ3JhbSBiZWluZ1xuZGVidWdnZWQ7IGl0IGlzIGV2ZW4gcG9zc2libGUgdG8gY2hhbmdlIGEgdmFyaWFibGUgb3IgY2FsbCBhIGZ1bmN0aW9uLlxuV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHN1Y2ggYSBzdGF0ZW1lbnQsIHRoZSBleGNlcHRpb24gbmFtZSBpc1xucHJpbnRlZCBidXQgdGhlIGRlYnVnZ2VyXCdzIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLlxuXG5UaGUgZGVidWdnZXIgc3VwcG9ydHMgKmFsaWFzZXMqLiAgQWxpYXNlcyBjYW4gaGF2ZSBwYXJhbWV0ZXJzIHdoaWNoXG5hbGxvd3Mgb25lIGEgY2VydGFpbiBsZXZlbCBvZiBhZGFwdGFiaWxpdHkgdG8gdGhlIGNvbnRleHQgdW5kZXJcbmV4YW1pbmF0aW9uLlxuXG5NdWx0aXBsZSBjb21tYW5kcyBtYXkgYmUgZW50ZXJlZCBvbiBhIHNpbmdsZSBsaW5lLCBzZXBhcmF0ZWQgYnkgIjs7Ii5cbihBIHNpbmdsZSAiOyIgaXMgbm90IHVzZWQgYXMgaXQgaXMgdGhlIHNlcGFyYXRvciBmb3IgbXVsdGlwbGUgY29tbWFuZHNcbmluIGEgbGluZSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgUHl0aG9uIHBhcnNlci4pICBObyBpbnRlbGxpZ2VuY2UgaXNcbmFwcGxpZWQgdG8gc2VwYXJhdGluZyB0aGUgY29tbWFuZHM7IHRoZSBpbnB1dCBpcyBzcGxpdCBhdCB0aGUgZmlyc3RcbiI7OyIgcGFpciwgZXZlbiBpZiBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgcXVvdGVkIHN0cmluZy5cblxuSWYgYSBmaWxlICIucGRicmMiIGV4aXN0cyBpbiB0aGUgdXNlclwncyBob21lIGRpcmVjdG9yeSBvciBpbiB0aGVcbmN1cnJlbnQgZGlyZWN0b3J5LCBpdCBpcyByZWFkIGluIGFuZCBleGVjdXRlZCBhcyBpZiBpdCBoYWQgYmVlbiB0eXBlZFxuYXQgdGhlIGRlYnVnZ2VyIHByb21wdC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgYWxpYXNlcy4gIElmXG5ib3RoIGZpbGVzIGV4aXN0LCB0aGUgb25lIGluIHRoZSBob21lIGRpcmVjdG9yeSBpcyByZWFkIGZpcnN0IGFuZFxuYWxpYXNlcyBkZWZpbmVkIHRoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBsb2NhbCBmaWxlLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4yOiAiLnBkYnJjIiBjYW4gbm93IGNvbnRhaW4gY29tbWFuZHMgdGhhdFxuY29udGludWUgZGVidWdnaW5nLCBzdWNoIGFzICJjb250aW51ZSIgb3IgIm5leHQiLiAgUHJldmlvdXNseSwgdGhlc2VcbmNvbW1hbmRzIGhhZCBubyBlZmZlY3QuXG5cbmgoZWxwKSBbY29tbWFuZF1cblxuICAgV2l0aG91dCBhcmd1bWVudCwgcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgV2l0aCBhXG4gICAqY29tbWFuZCogYXMgYXJndW1lbnQsIHByaW50IGhlbHAgYWJvdXQgdGhhdCBjb21tYW5kLiAgImhlbHAgcGRiIlxuICAgZGlzcGxheXMgdGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiAodGhlIGRvY3N0cmluZyBvZiB0aGUgInBkYiJcbiAgIG1vZHVsZSkuICBTaW5jZSB0aGUgKmNvbW1hbmQqIGFyZ3VtZW50IG11c3QgYmUgYW4gaWRlbnRpZmllciwgImhlbHBcbiAgIGV4ZWMiIG11c3QgYmUgZW50ZXJlZCB0byBnZXQgaGVscCBvbiB0aGUgIiEiIGNvbW1hbmQuXG5cbncoaGVyZSlcblxuICAgUHJpbnQgYSBzdGFjayB0cmFjZSwgd2l0aCB0aGUgbW9zdCByZWNlbnQgZnJhbWUgYXQgdGhlIGJvdHRvbS4gIEFuXG4gICBhcnJvdyBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZnJhbWUsIHdoaWNoIGRldGVybWluZXMgdGhlIGNvbnRleHQgb2ZcbiAgIG1vc3QgY29tbWFuZHMuXG5cbmQob3duKSBbY291bnRdXG5cbiAgIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgKmNvdW50KiAoZGVmYXVsdCBvbmUpIGxldmVscyBkb3duIGluIHRoZVxuICAgc3RhY2sgdHJhY2UgKHRvIGEgbmV3ZXIgZnJhbWUpLlxuXG51KHApIFtjb3VudF1cblxuICAgTW92ZSB0aGUgY3VycmVudCBmcmFtZSAqY291bnQqIChkZWZhdWx0IG9uZSkgbGV2ZWxzIHVwIGluIHRoZSBzdGFja1xuICAgdHJhY2UgKHRvIGFuIG9sZGVyIGZyYW1lKS5cblxuYihyZWFrKSBbKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl1dXG5cbiAgIFdpdGggYSAqbGluZW5vKiBhcmd1bWVudCwgc2V0IGEgYnJlYWsgdGhlcmUgaW4gdGhlIGN1cnJlbnQgZmlsZS5cbiAgIFdpdGggYSAqZnVuY3Rpb24qIGFyZ3VtZW50LCBzZXQgYSBicmVhayBhdCB0aGUgZmlyc3QgZXhlY3V0YWJsZVxuICAgc3RhdGVtZW50IHdpdGhpbiB0aGF0IGZ1bmN0aW9uLiAgVGhlIGxpbmUgbnVtYmVyIG1heSBiZSBwcmVmaXhlZFxuICAgd2l0aCBhIGZpbGVuYW1lIGFuZCBhIGNvbG9uLCB0byBzcGVjaWZ5IGEgYnJlYWtwb2ludCBpbiBhbm90aGVyXG4gICBmaWxlIChwcm9iYWJseSBvbmUgdGhhdCBoYXNuXCd0IGJlZW4gbG9hZGVkIHlldCkuICBUaGUgZmlsZSBpc1xuICAgc2VhcmNoZWQgb24gInN5cy5wYXRoIi4gIE5vdGUgdGhhdCBlYWNoIGJyZWFrcG9pbnQgaXMgYXNzaWduZWQgYVxuICAgbnVtYmVyIHRvIHdoaWNoIGFsbCB0aGUgb3RoZXIgYnJlYWtwb2ludCBjb21tYW5kcyByZWZlci5cblxuICAgSWYgYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudCwgaXQgaXMgYW4gZXhwcmVzc2lvbiB3aGljaCBtdXN0XG4gICBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLlxuXG4gICBXaXRob3V0IGFyZ3VtZW50LCBsaXN0IGFsbCBicmVha3MsIGluY2x1ZGluZyBmb3IgZWFjaCBicmVha3BvaW50LFxuICAgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGJyZWFrcG9pbnQgaGFzIGJlZW4gaGl0LCB0aGUgY3VycmVudFxuICAgaWdub3JlIGNvdW50LCBhbmQgdGhlIGFzc29jaWF0ZWQgY29uZGl0aW9uIGlmIGFueS5cblxudGJyZWFrIFsoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXV1cblxuICAgVGVtcG9yYXJ5IGJyZWFrcG9pbnQsIHdoaWNoIGlzIHJlbW92ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGlzXG4gICBmaXJzdCBoaXQuIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciAiYnJlYWsiLlxuXG5jbChlYXIpIFtmaWxlbmFtZTpsaW5lbm8gfCBicG51bWJlciBbYnBudW1iZXIgLi4uXV1cblxuICAgV2l0aCBhICpmaWxlbmFtZTpsaW5lbm8qIGFyZ3VtZW50LCBjbGVhciBhbGwgdGhlIGJyZWFrcG9pbnRzIGF0XG4gICB0aGlzIGxpbmUuIFdpdGggYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBicmVha3BvaW50IG51bWJlcnMsIGNsZWFyXG4gICB0aG9zZSBicmVha3BvaW50cy4gV2l0aG91dCBhcmd1bWVudCwgY2xlYXIgYWxsIGJyZWFrcyAoYnV0IGZpcnN0XG4gICBhc2sgY29uZmlybWF0aW9uKS5cblxuZGlzYWJsZSBbYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG5cbiAgIERpc2FibGUgdGhlIGJyZWFrcG9pbnRzIGdpdmVuIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2ZcbiAgIGJyZWFrcG9pbnQgbnVtYmVycy4gIERpc2FibGluZyBhIGJyZWFrcG9pbnQgbWVhbnMgaXQgY2Fubm90IGNhdXNlXG4gICB0aGUgcHJvZ3JhbSB0byBzdG9wIGV4ZWN1dGlvbiwgYnV0IHVubGlrZSBjbGVhcmluZyBhIGJyZWFrcG9pbnQsIGl0XG4gICByZW1haW5zIGluIHRoZSBsaXN0IG9mIGJyZWFrcG9pbnRzIGFuZCBjYW4gYmUgKHJlLSllbmFibGVkLlxuXG5lbmFibGUgW2JwbnVtYmVyIFticG51bWJlciAuLi5dXVxuXG4gICBFbmFibGUgdGhlIGJyZWFrcG9pbnRzIHNwZWNpZmllZC5cblxuaWdub3JlIGJwbnVtYmVyIFtjb3VudF1cblxuICAgU2V0IHRoZSBpZ25vcmUgY291bnQgZm9yIHRoZSBnaXZlbiBicmVha3BvaW50IG51bWJlci4gIElmIGNvdW50IGlzXG4gICBvbWl0dGVkLCB0aGUgaWdub3JlIGNvdW50IGlzIHNldCB0byAwLiAgQSBicmVha3BvaW50IGJlY29tZXMgYWN0aXZlXG4gICB3aGVuIHRoZSBpZ25vcmUgY291bnQgaXMgemVyby4gIFdoZW4gbm9uLXplcm8sIHRoZSBjb3VudCBpc1xuICAgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQgYW5kIHRoZSBicmVha3BvaW50XG4gICBpcyBub3QgZGlzYWJsZWQgYW5kIGFueSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS5cblxuY29uZGl0aW9uIGJwbnVtYmVyIFtjb25kaXRpb25dXG5cbiAgIFNldCBhIG5ldyAqY29uZGl0aW9uKiBmb3IgdGhlIGJyZWFrcG9pbnQsIGFuIGV4cHJlc3Npb24gd2hpY2ggbXVzdFxuICAgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4gIElmICpjb25kaXRpb24qXG4gICBpcyBhYnNlbnQsIGFueSBleGlzdGluZyBjb25kaXRpb24gaXMgcmVtb3ZlZDsgaS5lLiwgdGhlIGJyZWFrcG9pbnRcbiAgIGlzIG1hZGUgdW5jb25kaXRpb25hbC5cblxuY29tbWFuZHMgW2JwbnVtYmVyXVxuXG4gICBTcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgYnJlYWtwb2ludCBudW1iZXIgKmJwbnVtYmVyKi4gIFRoZVxuICAgY29tbWFuZHMgdGhlbXNlbHZlcyBhcHBlYXIgb24gdGhlIGZvbGxvd2luZyBsaW5lcy4gIFR5cGUgYSBsaW5lXG4gICBjb250YWluaW5nIGp1c3QgImVuZCIgdG8gdGVybWluYXRlIHRoZSBjb21tYW5kcy4gQW4gZXhhbXBsZTpcblxuICAgICAgKFBkYikgY29tbWFuZHMgMVxuICAgICAgKGNvbSkgcCBzb21lX3ZhcmlhYmxlXG4gICAgICAoY29tKSBlbmRcbiAgICAgIChQZGIpXG5cbiAgIFRvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgY29tbWFuZHMgYW5kIGZvbGxvd1xuICAgaXQgaW1tZWRpYXRlbHkgd2l0aCAiZW5kIjsgdGhhdCBpcywgZ2l2ZSBubyBjb21tYW5kcy5cblxuICAgV2l0aCBubyAqYnBudW1iZXIqIGFyZ3VtZW50LCBjb21tYW5kcyByZWZlcnMgdG8gdGhlIGxhc3QgYnJlYWtwb2ludFxuICAgc2V0LlxuXG4gICBZb3UgY2FuIHVzZSBicmVha3BvaW50IGNvbW1hbmRzIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbSB1cCBhZ2Fpbi5cbiAgIFNpbXBseSB1c2UgdGhlIGNvbnRpbnVlIGNvbW1hbmQsIG9yIHN0ZXAsIG9yIGFueSBvdGhlciBjb21tYW5kIHRoYXRcbiAgIHJlc3VtZXMgZXhlY3V0aW9uLlxuXG4gICBTcGVjaWZ5aW5nIGFueSBjb21tYW5kIHJlc3VtaW5nIGV4ZWN1dGlvbiAoY3VycmVudGx5IGNvbnRpbnVlLFxuICAgc3RlcCwgbmV4dCwgcmV0dXJuLCBqdW1wLCBxdWl0IGFuZCB0aGVpciBhYmJyZXZpYXRpb25zKSB0ZXJtaW5hdGVzXG4gICB0aGUgY29tbWFuZCBsaXN0IChhcyBpZiB0aGF0IGNvbW1hbmQgd2FzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5XG4gICBlbmQpLiBUaGlzIGlzIGJlY2F1c2UgYW55IHRpbWUgeW91IHJlc3VtZSBleGVjdXRpb24gKGV2ZW4gd2l0aCBhXG4gICBzaW1wbGUgbmV4dCBvciBzdGVwKSwgeW91IG1heSBlbmNvdW50ZXIgYW5vdGhlciBicmVha3BvaW50LS13aGljaFxuICAgY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0byBhbWJpZ3VpdGllcyBhYm91dCB3aGljaFxuICAgbGlzdCB0byBleGVjdXRlLlxuXG4gICBJZiB5b3UgdXNlIHRoZSBcJ3NpbGVudFwnIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgbGlzdCwgdGhlIHVzdWFsXG4gICBtZXNzYWdlIGFib3V0IHN0b3BwaW5nIGF0IGEgYnJlYWtwb2ludCBpcyBub3QgcHJpbnRlZC4gIFRoaXMgbWF5IGJlXG4gICBkZXNpcmFibGUgZm9yIGJyZWFrcG9pbnRzIHRoYXQgYXJlIHRvIHByaW50IGEgc3BlY2lmaWMgbWVzc2FnZSBhbmRcbiAgIHRoZW4gY29udGludWUuICBJZiBub25lIG9mIHRoZSBvdGhlciBjb21tYW5kcyBwcmludCBhbnl0aGluZywgeW91XG4gICBzZWUgbm8gc2lnbiB0aGF0IHRoZSBicmVha3BvaW50IHdhcyByZWFjaGVkLlxuXG5zKHRlcClcblxuICAgRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBvY2Nhc2lvblxuICAgKGVpdGhlciBpbiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9yIG9uIHRoZSBuZXh0IGxpbmUgaW4gdGhlXG4gICBjdXJyZW50IGZ1bmN0aW9uKS5cblxubihleHQpXG5cbiAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzXG4gICByZWFjaGVkIG9yIGl0IHJldHVybnMuICAoVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAibmV4dCIgYW5kICJzdGVwIlxuICAgaXMgdGhhdCAic3RlcCIgc3RvcHMgaW5zaWRlIGEgY2FsbGVkIGZ1bmN0aW9uLCB3aGlsZSAibmV4dCJcbiAgIGV4ZWN1dGVzIGNhbGxlZCBmdW5jdGlvbnMgYXQgKG5lYXJseSkgZnVsbCBzcGVlZCwgb25seSBzdG9wcGluZyBhdFxuICAgdGhlIG5leHQgbGluZSBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4pXG5cbnVudChpbCkgW2xpbmVub11cblxuICAgV2l0aG91dCBhcmd1bWVudCwgY29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBsaW5lIHdpdGggYSBudW1iZXJcbiAgIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBvbmUgaXMgcmVhY2hlZC5cblxuICAgV2l0aCBhIGxpbmUgbnVtYmVyLCBjb250aW51ZSBleGVjdXRpb24gdW50aWwgYSBsaW5lIHdpdGggYSBudW1iZXJcbiAgIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhhdCBpcyByZWFjaGVkLiAgSW4gYm90aCBjYXNlcywgYWxzbyBzdG9wIHdoZW5cbiAgIHRoZSBjdXJyZW50IGZyYW1lIHJldHVybnMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjI6IEFsbG93IGdpdmluZyBhbiBleHBsaWNpdCBsaW5lIG51bWJlci5cblxucihldHVybilcblxuICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHJldHVybnMuXG5cbmMob250KGludWUpKVxuXG4gICBDb250aW51ZSBleGVjdXRpb24sIG9ubHkgc3RvcCB3aGVuIGEgYnJlYWtwb2ludCBpcyBlbmNvdW50ZXJlZC5cblxuaih1bXApIGxpbmVub1xuXG4gICBTZXQgdGhlIG5leHQgbGluZSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuICBPbmx5IGF2YWlsYWJsZSBpbiB0aGVcbiAgIGJvdHRvbS1tb3N0IGZyYW1lLiAgVGhpcyBsZXRzIHlvdSBqdW1wIGJhY2sgYW5kIGV4ZWN1dGUgY29kZSBhZ2FpbixcbiAgIG9yIGp1bXAgZm9yd2FyZCB0byBza2lwIGNvZGUgdGhhdCB5b3UgZG9uXCd0IHdhbnQgdG8gcnVuLlxuXG4gICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBub3QgYWxsIGp1bXBzIGFyZSBhbGxvd2VkIC0tIGZvciBpbnN0YW5jZVxuICAgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGp1bXAgaW50byB0aGUgbWlkZGxlIG9mIGEgImZvciIgbG9vcCBvciBvdXRcbiAgIG9mIGEgImZpbmFsbHkiIGNsYXVzZS5cblxubChpc3QpIFtmaXJzdFssIGxhc3RdXVxuXG4gICBMaXN0IHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmaWxlLiAgV2l0aG91dCBhcmd1bWVudHMsIGxpc3QgMTFcbiAgIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lIG9yIGNvbnRpbnVlIHRoZSBwcmV2aW91cyBsaXN0aW5nLlxuICAgV2l0aCAiLiIgYXMgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUuICBXaXRoXG4gICBvbmUgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgYXJvdW5kIGF0IHRoYXQgbGluZS4gIFdpdGggdHdvXG4gICBhcmd1bWVudHMsIGxpc3QgdGhlIGdpdmVuIHJhbmdlOyBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGxlc3NcbiAgIHRoYW4gdGhlIGZpcnN0LCBpdCBpcyBpbnRlcnByZXRlZCBhcyBhIGNvdW50LlxuXG4gICBUaGUgY3VycmVudCBsaW5lIGluIHRoZSBjdXJyZW50IGZyYW1lIGlzIGluZGljYXRlZCBieSAiLT4iLiAgSWYgYW5cbiAgIGV4Y2VwdGlvbiBpcyBiZWluZyBkZWJ1Z2dlZCwgdGhlIGxpbmUgd2hlcmUgdGhlIGV4Y2VwdGlvbiB3YXNcbiAgIG9yaWdpbmFsbHkgcmFpc2VkIG9yIHByb3BhZ2F0ZWQgaXMgaW5kaWNhdGVkIGJ5ICI+PiIsIGlmIGl0IGRpZmZlcnNcbiAgIGZyb20gdGhlIGN1cnJlbnQgbGluZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yOiBUaGUgIj4+IiBtYXJrZXIuXG5cbmxsIHwgbG9uZ2xpc3RcblxuICAgTGlzdCBhbGwgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uIG9yIGZyYW1lLlxuICAgSW50ZXJlc3RpbmcgbGluZXMgYXJlIG1hcmtlZCBhcyBmb3IgImxpc3QiLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbmEocmdzKVxuXG4gICBQcmludCB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi5cblxucCBleHByZXNzaW9uXG5cbiAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogaW4gdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgcHJpbnQgaXRzXG4gICB2YWx1ZS5cblxuICAgTm90ZTogInByaW50KCkiIGNhbiBhbHNvIGJlIHVzZWQsIGJ1dCBpcyBub3QgYSBkZWJ1Z2dlciBjb21tYW5kXG4gICAgIC0tLSB0aGlzIGV4ZWN1dGVzIHRoZSBQeXRob24gInByaW50KCkiIGZ1bmN0aW9uLlxuXG5wcCBleHByZXNzaW9uXG5cbiAgIExpa2UgdGhlICJwIiBjb21tYW5kLCBleGNlcHQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzIHByZXR0eS1cbiAgIHByaW50ZWQgdXNpbmcgdGhlICJwcHJpbnQiIG1vZHVsZS5cblxud2hhdGlzIGV4cHJlc3Npb25cblxuICAgUHJpbnQgdGhlIHR5cGUgb2YgdGhlICpleHByZXNzaW9uKi5cblxuc291cmNlIGV4cHJlc3Npb25cblxuICAgVHJ5IHRvIGdldCBzb3VyY2UgY29kZSBmb3IgdGhlIGdpdmVuIG9iamVjdCBhbmQgZGlzcGxheSBpdC5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5kaXNwbGF5IFtleHByZXNzaW9uXVxuXG4gICBEaXNwbGF5IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbiBpZiBpdCBjaGFuZ2VkLCBlYWNoIHRpbWVcbiAgIGV4ZWN1dGlvbiBzdG9wcyBpbiB0aGUgY3VycmVudCBmcmFtZS5cblxuICAgV2l0aG91dCBleHByZXNzaW9uLCBsaXN0IGFsbCBkaXNwbGF5IGV4cHJlc3Npb25zIGZvciB0aGUgY3VycmVudFxuICAgZnJhbWUuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cblxudW5kaXNwbGF5IFtleHByZXNzaW9uXVxuXG4gICBEbyBub3QgZGlzcGxheSB0aGUgZXhwcmVzc2lvbiBhbnkgbW9yZSBpbiB0aGUgY3VycmVudCBmcmFtZS5cbiAgIFdpdGhvdXQgZXhwcmVzc2lvbiwgY2xlYXIgYWxsIGRpc3BsYXkgZXhwcmVzc2lvbnMgZm9yIHRoZSBjdXJyZW50XG4gICBmcmFtZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4yLlxuXG5pbnRlcmFjdFxuXG4gICBTdGFydCBhbiBpbnRlcmF0aXZlIGludGVycHJldGVyICh1c2luZyB0aGUgImNvZGUiIG1vZHVsZSkgd2hvc2VcbiAgIGdsb2JhbCBuYW1lc3BhY2UgY29udGFpbnMgYWxsIHRoZSAoZ2xvYmFsIGFuZCBsb2NhbCkgbmFtZXMgZm91bmQgaW5cbiAgIHRoZSBjdXJyZW50IHNjb3BlLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbmFsaWFzIFtuYW1lIFtjb21tYW5kXV1cblxuICAgQ3JlYXRlIGFuIGFsaWFzIGNhbGxlZCAqbmFtZSogdGhhdCBleGVjdXRlcyAqY29tbWFuZCouICBUaGUgY29tbWFuZFxuICAgbXVzdCAqbm90KiBiZSBlbmNsb3NlZCBpbiBxdW90ZXMuICBSZXBsYWNlYWJsZSBwYXJhbWV0ZXJzIGNhbiBiZVxuICAgaW5kaWNhdGVkIGJ5ICIlMSIsICIlMiIsIGFuZCBzbyBvbiwgd2hpbGUgIiUqIiBpcyByZXBsYWNlZCBieSBhbGxcbiAgIHRoZSBwYXJhbWV0ZXJzLiBJZiBubyBjb21tYW5kIGlzIGdpdmVuLCB0aGUgY3VycmVudCBhbGlhcyBmb3JcbiAgICpuYW1lKiBpcyBzaG93bi4gSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgYWxsIGFsaWFzZXMgYXJlIGxpc3RlZC5cblxuICAgQWxpYXNlcyBtYXkgYmUgbmVzdGVkIGFuZCBjYW4gY29udGFpbiBhbnl0aGluZyB0aGF0IGNhbiBiZSBsZWdhbGx5XG4gICB0eXBlZCBhdCB0aGUgcGRiIHByb21wdC4gIE5vdGUgdGhhdCBpbnRlcm5hbCBwZGIgY29tbWFuZHMgKmNhbiogYmVcbiAgIG92ZXJyaWRkZW4gYnkgYWxpYXNlcy4gIFN1Y2ggYSBjb21tYW5kIGlzIHRoZW4gaGlkZGVuIHVudGlsIHRoZVxuICAgYWxpYXMgaXMgcmVtb3ZlZC4gIEFsaWFzaW5nIGlzIHJlY3Vyc2l2ZWx5IGFwcGxpZWQgdG8gdGhlIGZpcnN0XG4gICB3b3JkIG9mIHRoZSBjb21tYW5kIGxpbmU7IGFsbCBvdGhlciB3b3JkcyBpbiB0aGUgbGluZSBhcmUgbGVmdFxuICAgYWxvbmUuXG5cbiAgIEFzIGFuIGV4YW1wbGUsIGhlcmUgYXJlIHR3byB1c2VmdWwgYWxpYXNlcyAoZXNwZWNpYWxseSB3aGVuIHBsYWNlZFxuICAgaW4gdGhlICIucGRicmMiIGZpbGUpOlxuXG4gICAgICAjIFByaW50IGluc3RhbmNlIHZhcmlhYmxlcyAodXNhZ2UgInBpIGNsYXNzSW5zdCIpXG4gICAgICBhbGlhcyBwaSBmb3IgayBpbiAlMS5fX2RpY3RfXy5rZXlzKCk6IHByaW50KCIlMS4iLGssIj0iLCUxLl9fZGljdF9fW2tdKVxuICAgICAgIyBQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgaW4gc2VsZlxuICAgICAgYWxpYXMgcHMgcGkgc2VsZlxuXG51bmFsaWFzIG5hbWVcblxuICAgRGVsZXRlIHRoZSBzcGVjaWZpZWQgYWxpYXMuXG5cbiEgc3RhdGVtZW50XG5cbiAgIEV4ZWN1dGUgdGhlIChvbmUtbGluZSkgKnN0YXRlbWVudCogaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnRcbiAgIHN0YWNrIGZyYW1lLiBUaGUgZXhjbGFtYXRpb24gcG9pbnQgY2FuIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBmaXJzdFxuICAgd29yZCBvZiB0aGUgc3RhdGVtZW50IHJlc2VtYmxlcyBhIGRlYnVnZ2VyIGNvbW1hbmQuICBUbyBzZXQgYVxuICAgZ2xvYmFsIHZhcmlhYmxlLCB5b3UgY2FuIHByZWZpeCB0aGUgYXNzaWdubWVudCBjb21tYW5kIHdpdGggYVxuICAgImdsb2JhbCIgc3RhdGVtZW50IG9uIHRoZSBzYW1lIGxpbmUsIGUuZy46XG5cbiAgICAgIChQZGIpIGdsb2JhbCBsaXN0X29wdGlvbnM7IGxpc3Rfb3B0aW9ucyA9IFtcJy1sXCddXG4gICAgICAoUGRiKVxuXG5ydW4gW2FyZ3MgLi4uXVxucmVzdGFydCBbYXJncyAuLi5dXG5cbiAgIFJlc3RhcnQgdGhlIGRlYnVnZ2VkIFB5dGhvbiBwcm9ncmFtLiAgSWYgYW4gYXJndW1lbnQgaXMgc3VwcGxpZWQsXG4gICBpdCBpcyBzcGxpdCB3aXRoICJzaGxleCIgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbmV3XG4gICAic3lzLmFyZ3YiLiBIaXN0b3J5LCBicmVha3BvaW50cywgYWN0aW9ucyBhbmQgZGVidWdnZXIgb3B0aW9ucyBhcmVcbiAgIHByZXNlcnZlZC4gInJlc3RhcnQiIGlzIGFuIGFsaWFzIGZvciAicnVuIi5cblxucSh1aXQpXG5cbiAgIFF1aXQgZnJvbSB0aGUgZGVidWdnZXIuICBUaGUgcHJvZ3JhbSBiZWluZyBleGVjdXRlZCBpcyBhYm9ydGVkLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFdoZXRoZXIgYSBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIG9yaWdpbmF0ZSBpbiBhIGNlcnRhaW4gbW9kdWxlXG4gICAgaXMgZGV0ZXJtaW5lZCBieSB0aGUgIl9fbmFtZV9fIiBpbiB0aGUgZnJhbWUgZ2xvYmFscy5cbicsCi0gJ2RlbCc6IHUnXG5UaGUgImRlbCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqXG5cbiAgIGRlbF9zdG10IDo6PSAiZGVsIiB0YXJnZXRfbGlzdFxuXG5EZWxldGlvbiBpcyByZWN1cnNpdmVseSBkZWZpbmVkIHZlcnkgc2ltaWxhciB0byB0aGUgd2F5IGFzc2lnbm1lbnQgaXNcbmRlZmluZWQuIFJhdGhlciB0aGFuIHNwZWxsaW5nIGl0IG91dCBpbiBmdWxsIGRldGFpbHMsIGhlcmUgYXJlIHNvbWVcbmhpbnRzLlxuXG5EZWxldGlvbiBvZiBhIHRhcmdldCBsaXN0IHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgZWFjaCB0YXJnZXQsIGZyb20gbGVmdFxudG8gcmlnaHQuXG5cbkRlbGV0aW9uIG9mIGEgbmFtZSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBmcm9tIHRoZSBsb2NhbCBvclxuZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgImdsb2JhbCJcbnN0YXRlbWVudCBpbiB0aGUgc2FtZSBjb2RlIGJsb2NrLiAgSWYgdGhlIG5hbWUgaXMgdW5ib3VuZCwgYVxuIk5hbWVFcnJvciIgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLlxuXG5EZWxldGlvbiBvZiBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgc3Vic2NyaXB0aW9ucyBhbmQgc2xpY2luZ3MgaXMgcGFzc2VkXG50byB0aGUgcHJpbWFyeSBvYmplY3QgaW52b2x2ZWQ7IGRlbGV0aW9uIG9mIGEgc2xpY2luZyBpcyBpbiBnZW5lcmFsXG5lcXVpdmFsZW50IHRvIGFzc2lnbm1lbnQgb2YgYW4gZW1wdHkgc2xpY2Ugb2YgdGhlIHJpZ2h0IHR5cGUgKGJ1dCBldmVuXG50aGlzIGlzIGRldGVybWluZWQgYnkgdGhlIHNsaWNlZCBvYmplY3QpLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBQcmV2aW91c2x5IGl0IHdhcyBpbGxlZ2FsIHRvIGRlbGV0ZSBhIG5hbWVcbmZyb20gdGhlIGxvY2FsIG5hbWVzcGFjZSBpZiBpdCBvY2N1cnMgYXMgYSBmcmVlIHZhcmlhYmxlIGluIGEgbmVzdGVkXG5ibG9jay5cbicsCi0gJ2RpY3QnOiB1J1xuRGljdGlvbmFyeSBkaXNwbGF5c1xuKioqKioqKioqKioqKioqKioqKlxuXG5BIGRpY3Rpb25hcnkgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBrZXkvZGF0dW0gcGFpcnNcbmVuY2xvc2VkIGluIGN1cmx5IGJyYWNlczpcblxuICAgZGljdF9kaXNwbGF5ICAgICAgIDo6PSAieyIgW2tleV9kYXR1bV9saXN0IHwgZGljdF9jb21wcmVoZW5zaW9uXSAifSJcbiAgIGtleV9kYXR1bV9saXN0ICAgICA6Oj0ga2V5X2RhdHVtICgiLCIga2V5X2RhdHVtKSogWyIsIl1cbiAgIGtleV9kYXR1bSAgICAgICAgICA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiB8ICIqKiIgb3JfZXhwclxuICAgZGljdF9jb21wcmVoZW5zaW9uIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIGNvbXBfZm9yXG5cbkEgZGljdGlvbmFyeSBkaXNwbGF5IHlpZWxkcyBhIG5ldyBkaWN0aW9uYXJ5IG9iamVjdC5cblxuSWYgYSBjb21tYS1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2Yga2V5L2RhdHVtIHBhaXJzIGlzIGdpdmVuLCB0aGV5IGFyZVxuZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB0byBkZWZpbmUgdGhlIGVudHJpZXMgb2YgdGhlIGRpY3Rpb25hcnk6XG5lYWNoIGtleSBvYmplY3QgaXMgdXNlZCBhcyBhIGtleSBpbnRvIHRoZSBkaWN0aW9uYXJ5IHRvIHN0b3JlIHRoZVxuY29ycmVzcG9uZGluZyBkYXR1bS4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNhbWUga2V5XG5tdWx0aXBsZSB0aW1lcyBpbiB0aGUga2V5L2RhdHVtIGxpc3QsIGFuZCB0aGUgZmluYWwgZGljdGlvbmFyeVwncyB2YWx1ZVxuZm9yIHRoYXQga2V5IHdpbGwgYmUgdGhlIGxhc3Qgb25lIGdpdmVuLlxuXG5BIGRvdWJsZSBhc3RlcmlzayAiKioiIGRlbm90ZXMgKmRpY3Rpb25hcnkgdW5wYWNraW5nKi4gSXRzIG9wZXJhbmRcbm11c3QgYmUgYSAqbWFwcGluZyouICBFYWNoIG1hcHBpbmcgaXRlbSBpcyBhZGRlZCB0byB0aGUgbmV3XG5kaWN0aW9uYXJ5LiAgTGF0ZXIgdmFsdWVzIHJlcGxhY2UgdmFsdWVzIGFscmVhZHkgc2V0IGJ5IGVhcmxpZXJcbmtleS9kYXR1bSBwYWlycyBhbmQgZWFybGllciBkaWN0aW9uYXJ5IHVucGFja2luZ3MuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuNTogVW5wYWNraW5nIGludG8gZGljdGlvbmFyeSBkaXNwbGF5cywgb3JpZ2luYWxseVxucHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG5cbkEgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsXG5uZWVkcyB0d28gZXhwcmVzc2lvbnMgc2VwYXJhdGVkIHdpdGggYSBjb2xvbiBmb2xsb3dlZCBieSB0aGUgdXN1YWxcbiJmb3IiIGFuZCAiaWYiIGNsYXVzZXMuIFdoZW4gdGhlIGNvbXByZWhlbnNpb24gaXMgcnVuLCB0aGUgcmVzdWx0aW5nXG5rZXkgYW5kIHZhbHVlIGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGUgbmV3IGRpY3Rpb25hcnkgaW4gdGhlIG9yZGVyXG50aGV5IGFyZSBwcm9kdWNlZC5cblxuUmVzdHJpY3Rpb25zIG9uIHRoZSB0eXBlcyBvZiB0aGUga2V5IHZhbHVlcyBhcmUgbGlzdGVkIGVhcmxpZXIgaW5cbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSouICAoVG8gc3VtbWFyaXplLCB0aGUga2V5IHR5cGVcbnNob3VsZCBiZSAqaGFzaGFibGUqLCB3aGljaCBleGNsdWRlcyBhbGwgbXV0YWJsZSBvYmplY3RzLikgIENsYXNoZXNcbmJldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgZGF0dW0gKHRleHR1YWxseVxucmlnaHRtb3N0IGluIHRoZSBkaXNwbGF5KSBzdG9yZWQgZm9yIGEgZ2l2ZW4ga2V5IHZhbHVlIHByZXZhaWxzLlxuJywKLSAnZHluYW1pYy1mZWF0dXJlcyc6IHUnXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5OYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlXG50aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG5cbiAgIGkgPSAxMFxuICAgZGVmIGYoKTpcbiAgICAgICBwcmludChpKVxuICAgaSA9IDQyXG4gICBmKClcblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsXG5lbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbFxuYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkXG5pbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV1cblRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5vdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXNcbnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCi0gJ2Vsc2UnOiB1J1xuVGhlICJpZiIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKipcblxuVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcblxuICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbiAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5JdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgb25lXG5ieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uICpCb29sZWFuIG9wZXJhdGlvbnMqXG5mb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWRcbihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJywKLSAnZXhjZXB0aW9ucyc6IHUnXG5FeGNlcHRpb25zXG4qKioqKioqKioqXG5cbkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sXG5vZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzXG5kZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnlcbmNvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmVcbnRoZSBlcnJvciBvY2N1cnJlZC5cblxuVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lXG5lcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiBFeGNlcHRpb25cbmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgInRyeSIgLi4uICJleGNlcHQiIHN0YXRlbWVudC4gIFRoZVxuImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cFxuY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW5cbmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuXG5QeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXJcbmxldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGVcbmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlXG5mcm9tIHRoZSB0b3ApLlxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzXG5leGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluXG5laXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgZXhjZXB0aW9uIGlzXG4iU3lzdGVtRXhpdCIuXG5cbkV4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlICJleGNlcHQiIGNsYXVzZSBpc1xuc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgcmVmZXJlbmNlIHRoZVxuY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlIGNhbiBiZVxucmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZVxuZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuXG5Ob3RlOiBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXJcbiAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCB3aXRob3V0XG4gIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXJcbiAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuXG5TZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5XG5zdGF0ZW1lbnQqIGFuZCAicmFpc2UiIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCBieVxuICAgIHRoZXNlIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzXG4gICAgY29tcGlsZWQuXG4nLAotICdleGVjbW9kZWwnOiB1J1xuRXhlY3V0aW9uIG1vZGVsXG4qKioqKioqKioqKioqKipcblxuXG5TdHJ1Y3R1cmUgb2YgYSBwcm9ncmFtXG49PT09PT09PT09PT09PT09PT09PT09XG5cbkEgUHl0aG9uIHByb2dyYW0gaXMgY29uc3RydWN0ZWQgZnJvbSBjb2RlIGJsb2Nrcy4gQSAqYmxvY2sqIGlzIGEgcGllY2Vcbm9mIFB5dGhvbiBwcm9ncmFtIHRleHQgdGhhdCBpcyBleGVjdXRlZCBhcyBhIHVuaXQuIFRoZSBmb2xsb3dpbmcgYXJlXG5ibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uIGJvZHksIGFuZCBhIGNsYXNzIGRlZmluaXRpb24uIEVhY2hcbmNvbW1hbmQgdHlwZWQgaW50ZXJhY3RpdmVseSBpcyBhIGJsb2NrLiAgQSBzY3JpcHQgZmlsZSAoYSBmaWxlIGdpdmVuXG5hcyBzdGFuZGFyZCBpbnB1dCB0byB0aGUgaW50ZXJwcmV0ZXIgb3Igc3BlY2lmaWVkIGFzIGEgY29tbWFuZCBsaW5lXG5hcmd1bWVudCB0byB0aGUgaW50ZXJwcmV0ZXIpIGlzIGEgY29kZSBibG9jay4gIEEgc2NyaXB0IGNvbW1hbmQgKGFcbmNvbW1hbmQgc3BlY2lmaWVkIG9uIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGxpbmUgd2l0aCB0aGUgXCcqKi1jKipcJ1xub3B0aW9uKSBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50IHBhc3NlZCB0byB0aGUgYnVpbHQtaW5cbmZ1bmN0aW9ucyAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgaXMgYSBjb2RlIGJsb2NrLlxuXG5BIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zXG5zb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzXG53aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2tcJ3MgZXhlY3V0aW9uIGhhc1xuY29tcGxldGVkLlxuXG5cbk5hbWluZyBhbmQgYmluZGluZ1xuPT09PT09PT09PT09PT09PT09XG5cblxuQmluZGluZyBvZiBuYW1lc1xuLS0tLS0tLS0tLS0tLS0tLVxuXG4qTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG4iaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsIG9yIGFmdGVyXG4iYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiBzdGF0ZW1lbnRcbm9mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG5pbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtXG5tYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG5cbkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jayxcbnVubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZVxubW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSBtb2R1bGVcbmNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZVxuYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cblxuRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0byB0aGUgKmJpbmRpbmcqXG5vZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gcnVsZXMuXG5cblxuUmVzb2x1dGlvbiBvZiBuYW1lc1xuLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS5cblxuV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0XG5lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9ja1xuaXMgY2FsbGVkIHRoZSBibG9ja1wncyAqZW52aXJvbm1lbnQqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIElmXG50aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWxcbnZhcmlhYmxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBib3VuZCB0byBhIHZhbHVlIGF0IHRoZSBwb2ludCB3aGVyZSB0aGVcbm5hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLlxuXG5JZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbFxudXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlXG5jdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gYVxuYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5JZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVcbnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiB0aGVcbnRvcC1sZXZlbCBuYW1lc3BhY2UuICBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnlcbnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlXG5vZiB0aGUgbW9kdWxlICJidWlsdGlucyIuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZCBmaXJzdC4gIElmXG50aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuICBUaGVcbiJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG5cblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvblxuaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZVxuY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLlxuXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG9cbnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cbiJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGF0IGNvbXBpbGUgdGltZSBpZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdFxuZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cblxuVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFcbm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZFxuIl9fbWFpbl9fIi5cblxuQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlXG5zcGVjaWFsIGluIHRoZSBjb250ZXh0IG9mIG5hbWUgcmVzb2x1dGlvbi4gQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuXG5leGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZSBuYW1lcy4gVGhlc2UgcmVmZXJlbmNlc1xuZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0XG51bmJvdW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBUaGVcbm5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSBvZlxudGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG9cbnRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZSBjb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tXG50aGlzIGluY2x1ZGVzIGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2UgdGhleSBhcmVcbmltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZ1xud2lsbCBmYWlsOlxuXG4gICBjbGFzcyBBOlxuICAgICAgIGEgPSA0MlxuICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcblxuXG5CdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb25cbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSAiX19idWlsdGluc19fIiBpbiBpdHMgZ2xvYmFsXG5uYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciBjYXNlXG50aGUgbW9kdWxlXCdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiX19tYWluX18iXG5tb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiBhbnlcbm90aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZVxuImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhIHVzZXItY3JlYXRlZFxuZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAiaW1wb3J0IlxudGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5OYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlXG50aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG5cbiAgIGkgPSAxMFxuICAgZGVmIGYoKTpcbiAgICAgICBwcmludChpKVxuICAgaSA9IDQyXG4gICBmKClcblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsXG5lbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbFxuYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkXG5pbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV1cblRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5vdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXNcbnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cblxuXG5FeGNlcHRpb25zXG49PT09PT09PT09XG5cbkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sXG5vZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzXG5kZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnlcbmNvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmVcbnRoZSBlcnJvciBvY2N1cnJlZC5cblxuVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lXG5lcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlICJyYWlzZSIgc3RhdGVtZW50LiBFeGNlcHRpb25cbmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgInRyeSIgLi4uICJleGNlcHQiIHN0YXRlbWVudC4gIFRoZVxuImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cFxuY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW5cbmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuXG5QeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXJcbmxldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGVcbmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlXG5mcm9tIHRoZSB0b3ApLlxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzXG5leGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluXG5laXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgZXhjZXB0aW9uIGlzXG4iU3lzdGVtRXhpdCIuXG5cbkV4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlICJleGNlcHQiIGNsYXVzZSBpc1xuc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgcmVmZXJlbmNlIHRoZVxuY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlIGNhbiBiZVxucmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZVxuZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuXG5Ob3RlOiBFeGNlcHRpb24gbWVzc2FnZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXJcbiAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCB3aXRob3V0XG4gIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXJcbiAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuXG5TZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5XG5zdGF0ZW1lbnQqIGFuZCAicmFpc2UiIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCBieVxuICAgIHRoZXNlIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzXG4gICAgY29tcGlsZWQuXG4nLAotICdleHBybGlzdHMnOiB1J1xuRXhwcmVzc2lvbiBsaXN0c1xuKioqKioqKioqKioqKioqKlxuXG4gICBleHByZXNzaW9uX2xpc3QgICAgOjo9IGV4cHJlc3Npb24gKCAiLCIgZXhwcmVzc2lvbiApKiBbIiwiXVxuICAgc3RhcnJlZF9saXN0ICAgICAgIDo6PSBzdGFycmVkX2l0ZW0gKCAiLCIgc3RhcnJlZF9pdGVtICkqIFsiLCJdXG4gICBzdGFycmVkX2V4cHJlc3Npb24gOjo9IGV4cHJlc3Npb24gfCAoIHN0YXJyZWRfaXRlbSAiLCIgKSogW3N0YXJyZWRfaXRlbV1cbiAgIHN0YXJyZWRfaXRlbSAgICAgICA6Oj0gZXhwcmVzc2lvbiB8ICIqIiBvcl9leHByXG5cbkV4Y2VwdCB3aGVuIHBhcnQgb2YgYSBsaXN0IG9yIHNldCBkaXNwbGF5LCBhbiBleHByZXNzaW9uIGxpc3RcbmNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGNvbW1hIHlpZWxkcyBhIHR1cGxlLiAgVGhlIGxlbmd0aCBvZiB0aGUgdHVwbGVcbmlzIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaW4gdGhlIGxpc3QuICBUaGUgZXhwcmVzc2lvbnMgYXJlXG5ldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5BbiBhc3RlcmlzayAiKiIgZGVub3RlcyAqaXRlcmFibGUgdW5wYWNraW5nKi4gIEl0cyBvcGVyYW5kIG11c3QgYmUgYW5cbippdGVyYWJsZSouICBUaGUgaXRlcmFibGUgaXMgZXhwYW5kZWQgaW50byBhIHNlcXVlbmNlIG9mIGl0ZW1zLCB3aGljaFxuYXJlIGluY2x1ZGVkIGluIHRoZSBuZXcgdHVwbGUsIGxpc3QsIG9yIHNldCwgYXQgdGhlIHNpdGUgb2YgdGhlXG51bnBhY2tpbmcuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuNTogSXRlcmFibGUgdW5wYWNraW5nIGluIGV4cHJlc3Npb24gbGlzdHMsIG9yaWdpbmFsbHlcbnByb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLlxuXG5UaGUgdHJhaWxpbmcgY29tbWEgaXMgcmVxdWlyZWQgb25seSB0byBjcmVhdGUgYSBzaW5nbGUgdHVwbGUgKGEuay5hLiBhXG4qc2luZ2xldG9uKik7IGl0IGlzIG9wdGlvbmFsIGluIGFsbCBvdGhlciBjYXNlcy4gIEEgc2luZ2xlIGV4cHJlc3Npb25cbndpdGhvdXQgYSB0cmFpbGluZyBjb21tYSBkb2VzblwndCBjcmVhdGUgYSB0dXBsZSwgYnV0IHJhdGhlciB5aWVsZHMgdGhlXG52YWx1ZSBvZiB0aGF0IGV4cHJlc3Npb24uIChUbyBjcmVhdGUgYW4gZW1wdHkgdHVwbGUsIHVzZSBhbiBlbXB0eSBwYWlyXG5vZiBwYXJlbnRoZXNlczogIigpIi4pXG4nLAotICdmbG9hdGluZyc6IHUnXG5GbG9hdGluZyBwb2ludCBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWxcbmRlZmluaXRpb25zOlxuXG4gICBmbG9hdG51bWJlciAgIDo6PSBwb2ludGZsb2F0IHwgZXhwb25lbnRmbG9hdFxuICAgcG9pbnRmbG9hdCAgICA6Oj0gW2ludHBhcnRdIGZyYWN0aW9uIHwgaW50cGFydCAiLiJcbiAgIGV4cG9uZW50ZmxvYXQgOjo9IChpbnRwYXJ0IHwgcG9pbnRmbG9hdCkgZXhwb25lbnRcbiAgIGludHBhcnQgICAgICAgOjo9IGRpZ2l0K1xuICAgZnJhY3Rpb24gICAgICA6Oj0gIi4iIGRpZ2l0K1xuICAgZXhwb25lbnQgICAgICA6Oj0gKCJlIiB8ICJFIikgWyIrIiB8ICItIl0gZGlnaXQrXG5cbk5vdGUgdGhhdCB0aGUgaW50ZWdlciBhbmQgZXhwb25lbnQgcGFydHMgYXJlIGFsd2F5cyBpbnRlcnByZXRlZCB1c2luZ1xucmFkaXggMTAuIEZvciBleGFtcGxlLCAiMDc3ZTAxMCIgaXMgbGVnYWwsIGFuZCBkZW5vdGVzIHRoZSBzYW1lIG51bWJlclxuYXMgIjc3ZTEwIi4gVGhlIGFsbG93ZWQgcmFuZ2Ugb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgaXNcbmltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gU29tZSBleGFtcGxlcyBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFsczpcblxuICAgMy4xNCAgICAxMC4gICAgLjAwMSAgICAxZTEwMCAgICAzLjE0ZS0xMCAgICAwZTBcblxuTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlICItMSJcbmlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yICItIiBhbmQgdGhlXG5saXRlcmFsICIxIi5cbicsCi0gJ2Zvcic6IHUnXG5UaGUgImZvciIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqXG5cblRoZSAiZm9yIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGEgc2VxdWVuY2VcbihzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG5cbiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG5vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuImV4cHJlc3Npb25fbGlzdCIuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoIGl0ZW1cbnByb3ZpZGVkIGJ5IHRoZSBpdGVyYXRvciwgaW4gdGhlIG9yZGVyIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvci4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMgKHNlZSAqQXNzaWdubWVudCBzdGF0ZW1lbnRzKiksIGFuZCB0aGVuIHRoZSBzdWl0ZSBpc1xuZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmUgZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZVxuc2VxdWVuY2UgaXMgZW1wdHkgb3IgYW4gaXRlcmF0b3IgcmFpc2VzIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiksXG50aGUgc3VpdGUgaW4gdGhlICJlbHNlIiBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3BcbnRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgY29udGludWVzXG53aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlICJlbHNlIiBjbGF1c2UgaWYgdGhlcmUgaXMgbm8gbmV4dFxuaXRlbS5cblxuVGhlIGZvci1sb29wIG1ha2VzIGFzc2lnbm1lbnRzIHRvIHRoZSB2YXJpYWJsZXMocykgaW4gdGhlIHRhcmdldCBsaXN0LlxuVGhpcyBvdmVyd3JpdGVzIGFsbCBwcmV2aW91cyBhc3NpZ25tZW50cyB0byB0aG9zZSB2YXJpYWJsZXMgaW5jbHVkaW5nXG50aG9zZSBtYWRlIGluIHRoZSBzdWl0ZSBvZiB0aGUgZm9yLWxvb3A6XG5cbiAgIGZvciBpIGluIHJhbmdlKDEwKTpcbiAgICAgICBwcmludChpKVxuICAgICAgIGkgPSA1ICAgICAgICAgICAgICMgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGZvci1sb29wXG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGkgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmRleCBpbiB0aGUgcmFuZ2VcblxuTmFtZXMgaW4gdGhlIHRhcmdldCBsaXN0IGFyZSBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLFxuYnV0IGlmIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSwgdGhleSB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXRcbmFsbCBieSB0aGUgbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAicmFuZ2UoKSIgcmV0dXJucyBhblxuaXRlcmF0b3Igb2YgaW50ZWdlcnMgc3VpdGFibGUgdG8gZW11bGF0ZSB0aGUgZWZmZWN0IG9mIFBhc2NhbFwncyAiZm9yIGlcbjo9IGEgdG8gYiBkbyI7IGUuZy4sICJsaXN0KHJhbmdlKDMpKSIgcmV0dXJucyB0aGUgbGlzdCAiWzAsIDEsIDJdIi5cblxuTm90ZTogVGhlcmUgaXMgYSBzdWJ0bGV0eSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBiZWluZyBtb2RpZmllZCBieSB0aGVcbiAgbG9vcCAodGhpcyBjYW4gb25seSBvY2N1ciBmb3IgbXV0YWJsZSBzZXF1ZW5jZXMsIGkuZS4gbGlzdHMpLiAgQW5cbiAgaW50ZXJuYWwgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsXG4gIGFuZCB0aGlzIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzXG4gIHJlYWNoZWQgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnNcbiAgdGhhdCBpZiB0aGUgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZVxuICBzZXF1ZW5jZSwgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mXG4gIHRoZSBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG4nLAotICdmb3JtYXRzdHJpbmdzJzogdSdcbkZvcm1hdCBTdHJpbmcgU3ludGF4XG4qKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgInN0ci5mb3JtYXQoKSIgbWV0aG9kIGFuZCB0aGUgIkZvcm1hdHRlciIgY2xhc3Mgc2hhcmUgdGhlIHNhbWVcbnN5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mICJGb3JtYXR0ZXIiLFxuc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuXG5cbkZvcm1hdCBzdHJpbmdzIGNvbnRhaW4gInJlcGxhY2VtZW50IGZpZWxkcyIgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXNcbiJ7fSIuIEFueXRoaW5nIHRoYXQgaXMgbm90IGNvbnRhaW5lZCBpbiBicmFjZXMgaXMgY29uc2lkZXJlZCBsaXRlcmFsXG50ZXh0LCB3aGljaCBpcyBjb3BpZWQgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQuICBJZiB5b3UgbmVlZCB0byBpbmNsdWRlXG5hIGJyYWNlIGNoYXJhY3RlciBpbiB0aGUgbGl0ZXJhbCB0ZXh0LCBpdCBjYW4gYmUgZXNjYXBlZCBieSBkb3VibGluZzpcbiJ7eyIgYW5kICJ9fSIuXG5cblRoZSBncmFtbWFyIGZvciBhIHJlcGxhY2VtZW50IGZpZWxkIGlzIGFzIGZvbGxvd3M6XG5cbiAgICAgIHJlcGxhY2VtZW50X2ZpZWxkIDo6PSAieyIgW2ZpZWxkX25hbWVdIFsiISIgY29udmVyc2lvbl0gWyI6IiBmb3JtYXRfc3BlY10gIn0iXG4gICAgICBmaWVsZF9uYW1lICAgICAgICA6Oj0gYXJnX25hbWUgKCIuIiBhdHRyaWJ1dGVfbmFtZSB8ICJbIiBlbGVtZW50X2luZGV4ICJdIikqXG4gICAgICBhcmdfbmFtZSAgICAgICAgICA6Oj0gW2lkZW50aWZpZXIgfCBpbnRlZ2VyXVxuICAgICAgYXR0cmlidXRlX25hbWUgICAgOjo9IGlkZW50aWZpZXJcbiAgICAgIGVsZW1lbnRfaW5kZXggICAgIDo6PSBpbnRlZ2VyIHwgaW5kZXhfc3RyaW5nXG4gICAgICBpbmRleF9zdHJpbmcgICAgICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXSI+ICtcbiAgICAgIGNvbnZlcnNpb24gICAgICAgIDo6PSAiciIgfCAicyIgfCAiYSJcbiAgICAgIGZvcm1hdF9zcGVjICAgICAgIDo6PSA8ZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24+XG5cbkluIGxlc3MgZm9ybWFsIHRlcm1zLCB0aGUgcmVwbGFjZW1lbnQgZmllbGQgY2FuIHN0YXJ0IHdpdGggYVxuKmZpZWxkX25hbWUqIHRoYXQgc3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgdG8gYmUgZm9ybWF0dGVkXG5hbmQgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgdGhlIHJlcGxhY2VtZW50IGZpZWxkLiBUaGVcbipmaWVsZF9uYW1lKiBpcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgICpjb252ZXJzaW9uKiBmaWVsZCwgd2hpY2ggaXNcbnByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50ICJcJyFcJyIsIGFuZCBhICpmb3JtYXRfc3BlYyosIHdoaWNoIGlzXG5wcmVjZWRlZCBieSBhIGNvbG9uICJcJzpcJyIuICBUaGVzZSBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgZm9ybWF0IGZvciB0aGVcbnJlcGxhY2VtZW50IHZhbHVlLlxuXG5TZWUgYWxzbyB0aGUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIHNlY3Rpb24uXG5cblRoZSAqZmllbGRfbmFtZSogaXRzZWxmIGJlZ2lucyB3aXRoIGFuICphcmdfbmFtZSogdGhhdCBpcyBlaXRoZXIgYVxubnVtYmVyIG9yIGEga2V5d29yZC4gIElmIGl0XCdzIGEgbnVtYmVyLCBpdCByZWZlcnMgdG8gYSBwb3NpdGlvbmFsXG5hcmd1bWVudCwgYW5kIGlmIGl0XCdzIGEga2V5d29yZCwgaXQgcmVmZXJzIHRvIGEgbmFtZWQga2V5d29yZFxuYXJndW1lbnQuICBJZiB0aGUgbnVtZXJpY2FsIGFyZ19uYW1lcyBpbiBhIGZvcm1hdCBzdHJpbmcgYXJlIDAsIDEsIDIsXG4uLi4gaW4gc2VxdWVuY2UsIHRoZXkgY2FuIGFsbCBiZSBvbWl0dGVkIChub3QganVzdCBzb21lKSBhbmQgdGhlXG5udW1iZXJzIDAsIDEsIDIsIC4uLiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW4gdGhhdCBvcmRlci5cbkJlY2F1c2UgKmFyZ19uYW1lKiBpcyBub3QgcXVvdGUtZGVsaW1pdGVkLCBpdCBpcyBub3QgcG9zc2libGUgdG9cbnNwZWNpZnkgYXJiaXRyYXJ5IGRpY3Rpb25hcnkga2V5cyAoZS5nLiwgdGhlIHN0cmluZ3MgIlwnMTBcJyIgb3JcbiJcJzotXVwnIikgd2l0aGluIGEgZm9ybWF0IHN0cmluZy4gVGhlICphcmdfbmFtZSogY2FuIGJlIGZvbGxvd2VkIGJ5IGFueVxubnVtYmVyIG9mIGluZGV4IG9yIGF0dHJpYnV0ZSBleHByZXNzaW9ucy4gQW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybVxuIlwnLm5hbWVcJyIgc2VsZWN0cyB0aGUgbmFtZWQgYXR0cmlidXRlIHVzaW5nICJnZXRhdHRyKCkiLCB3aGlsZSBhblxuZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSAiXCdbaW5kZXhdXCciIGRvZXMgYW4gaW5kZXggbG9va3VwIHVzaW5nXG4iX19nZXRpdGVtX18oKSIuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgY2FuIGJlXG5vbWl0dGVkLCBzbyAiXCd7fSB7fVwnIiBpcyBlcXVpdmFsZW50IHRvICJcJ3swfSB7MX1cJyIuXG5cblNvbWUgc2ltcGxlIGZvcm1hdCBzdHJpbmcgZXhhbXBsZXM6XG5cbiAgICJGaXJzdCwgdGhvdSBzaGFsdCBjb3VudCB0byB7MH0iICAjIFJlZmVyZW5jZXMgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudFxuICAgIkJyaW5nIG1lIGEge30iICAgICAgICAgICAgICAgICAgICMgSW1wbGljaXRseSByZWZlcmVuY2VzIHRoZSBmaXJzdCBwb3NpdGlvbmFsIGFyZ3VtZW50XG4gICAiRnJvbSB7fSB0byB7fSIgICAgICAgICAgICAgICAgICAgIyBTYW1lIGFzICJGcm9tIHswfSB0byB7MX0iXG4gICAiTXkgcXVlc3QgaXMge25hbWV9IiAgICAgICAgICAgICAgIyBSZWZlcmVuY2VzIGtleXdvcmQgYXJndW1lbnQgXCduYW1lXCdcbiAgICJXZWlnaHQgaW4gdG9ucyB7MC53ZWlnaHR9IiAgICAgICAjIFwnd2VpZ2h0XCcgYXR0cmlidXRlIG9mIGZpcnN0IHBvc2l0aW9uYWwgYXJnXG4gICAiVW5pdHMgZGVzdHJveWVkOiB7cGxheWVyc1swXX0iICAgIyBGaXJzdCBlbGVtZW50IG9mIGtleXdvcmQgYXJndW1lbnQgXCdwbGF5ZXJzXCcuXG5cblRoZSAqY29udmVyc2lvbiogZmllbGQgY2F1c2VzIGEgdHlwZSBjb2VyY2lvbiBiZWZvcmUgZm9ybWF0dGluZy5cbk5vcm1hbGx5LCB0aGUgam9iIG9mIGZvcm1hdHRpbmcgYSB2YWx1ZSBpcyBkb25lIGJ5IHRoZSAiX19mb3JtYXRfXygpIlxubWV0aG9kIG9mIHRoZSB2YWx1ZSBpdHNlbGYuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzIGl0IGlzIGRlc2lyYWJsZSB0b1xuZm9yY2UgYSB0eXBlIHRvIGJlIGZvcm1hdHRlZCBhcyBhIHN0cmluZywgb3ZlcnJpZGluZyBpdHMgb3duXG5kZWZpbml0aW9uIG9mIGZvcm1hdHRpbmcuICBCeSBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBhIHN0cmluZyBiZWZvcmVcbmNhbGxpbmcgIl9fZm9ybWF0X18oKSIsIHRoZSBub3JtYWwgZm9ybWF0dGluZyBsb2dpYyBpcyBieXBhc3NlZC5cblxuVGhyZWUgY29udmVyc2lvbiBmbGFncyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDogIlwnIXNcJyIgd2hpY2ggY2FsbHNcbiJzdHIoKSIgb24gdGhlIHZhbHVlLCAiXCchclwnIiB3aGljaCBjYWxscyAicmVwcigpIiBhbmQgIlwnIWFcJyIgd2hpY2hcbmNhbGxzICJhc2NpaSgpIi5cblxuU29tZSBleGFtcGxlczpcblxuICAgIkhhcm9sZFwncyBhIGNsZXZlciB7MCFzfSIgICAgICAgICMgQ2FsbHMgc3RyKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0XG4gICAiQnJpbmcgb3V0IHRoZSBob2x5IHtuYW1lIXJ9IiAgICAjIENhbGxzIHJlcHIoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3RcbiAgICJNb3JlIHshYX0iICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbHMgYXNjaWkoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3RcblxuVGhlICpmb3JtYXRfc3BlYyogZmllbGQgY29udGFpbnMgYSBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGUgdmFsdWVcbnNob3VsZCBiZSBwcmVzZW50ZWQsIGluY2x1ZGluZyBzdWNoIGRldGFpbHMgYXMgZmllbGQgd2lkdGgsIGFsaWdubWVudCxcbnBhZGRpbmcsIGRlY2ltYWwgcHJlY2lzaW9uIGFuZCBzbyBvbi4gIEVhY2ggdmFsdWUgdHlwZSBjYW4gZGVmaW5lIGl0c1xub3duICJmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2UiIG9yIGludGVycHJldGF0aW9uIG9mIHRoZSAqZm9ybWF0X3NwZWMqLlxuXG5Nb3N0IGJ1aWx0LWluIHR5cGVzIHN1cHBvcnQgYSBjb21tb24gZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdlLCB3aGljaFxuaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uXG5cbkEgKmZvcm1hdF9zcGVjKiBmaWVsZCBjYW4gYWxzbyBpbmNsdWRlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHNcbndpdGhpbiBpdC4gVGhlc2UgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkcyBtYXkgY29udGFpbiBhIGZpZWxkIG5hbWUsXG5jb252ZXJzaW9uIGZsYWcgYW5kIGZvcm1hdCBzcGVjaWZpY2F0aW9uLCBidXQgZGVlcGVyIG5lc3RpbmcgaXMgbm90XG5hbGxvd2VkLiAgVGhlIHJlcGxhY2VtZW50IGZpZWxkcyB3aXRoaW4gdGhlIGZvcm1hdF9zcGVjIGFyZVxuc3Vic3RpdHV0ZWQgYmVmb3JlIHRoZSAqZm9ybWF0X3NwZWMqIHN0cmluZyBpcyBpbnRlcnByZXRlZC4gVGhpc1xuYWxsb3dzIHRoZSBmb3JtYXR0aW5nIG9mIGEgdmFsdWUgdG8gYmUgZHluYW1pY2FsbHkgc3BlY2lmaWVkLlxuXG5TZWUgdGhlICpGb3JtYXQgZXhhbXBsZXMqIHNlY3Rpb24gZm9yIHNvbWUgZXhhbXBsZXMuXG5cblxuRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iRm9ybWF0IHNwZWNpZmljYXRpb25zIiBhcmUgdXNlZCB3aXRoaW4gcmVwbGFjZW1lbnQgZmllbGRzIGNvbnRhaW5lZFxud2l0aGluIGEgZm9ybWF0IHN0cmluZyB0byBkZWZpbmUgaG93IGluZGl2aWR1YWwgdmFsdWVzIGFyZSBwcmVzZW50ZWRcbihzZWUgKkZvcm1hdCBTdHJpbmcgU3ludGF4KikuICBUaGV5IGNhbiBhbHNvIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGVcbmJ1aWx0LWluICJmb3JtYXQoKSIgZnVuY3Rpb24uICBFYWNoIGZvcm1hdHRhYmxlIHR5cGUgbWF5IGRlZmluZSBob3dcbnRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyB0byBiZSBpbnRlcnByZXRlZC5cblxuTW9zdCBidWlsdC1pbiB0eXBlcyBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZvciBmb3JtYXRcbnNwZWNpZmljYXRpb25zLCBhbHRob3VnaCBzb21lIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlIG9ubHlcbnN1cHBvcnRlZCBieSB0aGUgbnVtZXJpYyB0eXBlcy5cblxuQSBnZW5lcmFsIGNvbnZlbnRpb24gaXMgdGhhdCBhbiBlbXB0eSBmb3JtYXQgc3RyaW5nICgiIiIiKSBwcm9kdWNlc1xudGhlIHNhbWUgcmVzdWx0IGFzIGlmIHlvdSBoYWQgY2FsbGVkICJzdHIoKSIgb24gdGhlIHZhbHVlLiBBIG5vbi1lbXB0eVxuZm9ybWF0IHN0cmluZyB0eXBpY2FsbHkgbW9kaWZpZXMgdGhlIHJlc3VsdC5cblxuVGhlIGdlbmVyYWwgZm9ybSBvZiBhICpzdGFuZGFyZCBmb3JtYXQgc3BlY2lmaWVyKiBpczpcblxuICAgZm9ybWF0X3NwZWMgOjo9IFtbZmlsbF1hbGlnbl1bc2lnbl1bI11bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdXG4gICBmaWxsICAgICAgICA6Oj0gPGFueSBjaGFyYWN0ZXI+XG4gICBhbGlnbiAgICAgICA6Oj0gIjwiIHwgIj4iIHwgIj0iIHwgIl4iXG4gICBzaWduICAgICAgICA6Oj0gIisiIHwgIi0iIHwgIiAiXG4gICB3aWR0aCAgICAgICA6Oj0gaW50ZWdlclxuICAgcHJlY2lzaW9uICAgOjo9IGludGVnZXJcbiAgIHR5cGUgICAgICAgIDo6PSAiYiIgfCAiYyIgfCAiZCIgfCAiZSIgfCAiRSIgfCAiZiIgfCAiRiIgfCAiZyIgfCAiRyIgfCAibiIgfCAibyIgfCAicyIgfCAieCIgfCAiWCIgfCAiJSJcblxuSWYgYSB2YWxpZCAqYWxpZ24qIHZhbHVlIGlzIHNwZWNpZmllZCwgaXQgY2FuIGJlIHByZWNlZGVkIGJ5IGEgKmZpbGwqXG5jaGFyYWN0ZXIgdGhhdCBjYW4gYmUgYW55IGNoYXJhY3RlciBhbmQgZGVmYXVsdHMgdG8gYSBzcGFjZSBpZlxub21pdHRlZC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBhIGxpdGVyYWwgY3VybHkgYnJhY2UgKCIieyIiIG9yXG4iIn0iIikgYXMgdGhlICpmaWxsKiBjaGFyYWN0ZXIgd2hlbiB1c2luZyB0aGUgInN0ci5mb3JtYXQoKSIgbWV0aG9kLlxuSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gaW5zZXJ0IGEgY3VybHkgYnJhY2Ugd2l0aCBhIG5lc3RlZFxucmVwbGFjZW1lbnQgZmllbGQuICBUaGlzIGxpbWl0YXRpb24gZG9lc25cJ3QgYWZmZWN0IHRoZSAiZm9ybWF0KCkiXG5mdW5jdGlvbi5cblxuVGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYWxpZ25tZW50IG9wdGlvbnMgaXMgYXMgZm9sbG93czpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgT3B0aW9uICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXCc8XCciICAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgbGVmdC1hbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICAgfFxuICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbW9zdCBvYmplY3RzKS4gICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJz5cJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSByaWdodC1hbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICB8XG4gICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBudW1iZXJzKS4gICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnPVwnIiAgICAgfCBGb3JjZXMgdGhlIHBhZGRpbmcgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSBzaWduIChpZiBhbnkpICAgIHxcbiAgIHwgICAgICAgICAgIHwgYnV0IGJlZm9yZSB0aGUgZGlnaXRzLiAgVGhpcyBpcyB1c2VkIGZvciBwcmludGluZyBmaWVsZHMgICB8XG4gICB8ICAgICAgICAgICB8IGluIHRoZSBmb3JtIFwnKzAwMDAwMDEyMFwnLiBUaGlzIGFsaWdubWVudCBvcHRpb24gaXMgb25seSAgICB8XG4gICB8ICAgICAgICAgICB8IHZhbGlkIGZvciBudW1lcmljIHR5cGVzLiAgSXQgYmVjb21lcyB0aGUgZGVmYXVsdCB3aGVuIFwnMFwnICB8XG4gICB8ICAgICAgICAgICB8IGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBmaWVsZCB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnXlwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGNlbnRlcmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgc3BhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5Ob3RlIHRoYXQgdW5sZXNzIGEgbWluaW11bSBmaWVsZCB3aWR0aCBpcyBkZWZpbmVkLCB0aGUgZmllbGQgd2lkdGhcbndpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGRhdGEgdG8gZmlsbCBpdCwgc28gdGhhdCB0aGVcbmFsaWdubWVudCBvcHRpb24gaGFzIG5vIG1lYW5pbmcgaW4gdGhpcyBjYXNlLlxuXG5UaGUgKnNpZ24qIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBudW1iZXIgdHlwZXMsIGFuZCBjYW4gYmUgb25lIG9mXG50aGUgZm9sbG93aW5nOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBPcHRpb24gICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8ICJcJytcJyIgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkIGZvciBib3RoIHBvc2l0aXZlIGFzICB8XG4gICB8ICAgICAgICAgICB8IHdlbGwgYXMgbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnLVwnIiAgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIHNpZ24gc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgbmVnYXRpdmUgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVycyAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBzcGFjZSAgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIGxlYWRpbmcgc3BhY2Ugc2hvdWxkIGJlIHVzZWQgb24gcG9zaXRpdmUgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVycywgYW5kIGEgbWludXMgc2lnbiBvbiBuZWdhdGl2ZSBudW1iZXJzLiAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5UaGUgIlwnI1wnIiBvcHRpb24gY2F1c2VzIHRoZSAiYWx0ZXJuYXRlIGZvcm0iIHRvIGJlIHVzZWQgZm9yIHRoZVxuY29udmVyc2lvbi4gIFRoZSBhbHRlcm5hdGUgZm9ybSBpcyBkZWZpbmVkIGRpZmZlcmVudGx5IGZvciBkaWZmZXJlbnRcbnR5cGVzLiAgVGhpcyBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgaW50ZWdlciwgZmxvYXQsIGNvbXBsZXggYW5kXG5EZWNpbWFsIHR5cGVzLiBGb3IgaW50ZWdlcnMsIHdoZW4gYmluYXJ5LCBvY3RhbCwgb3IgaGV4YWRlY2ltYWwgb3V0cHV0XG5pcyB1c2VkLCB0aGlzIG9wdGlvbiBhZGRzIHRoZSBwcmVmaXggcmVzcGVjdGl2ZSAiXCcwYlwnIiwgIlwnMG9cJyIsIG9yXG4iXCcweFwnIiB0byB0aGUgb3V0cHV0IHZhbHVlLiBGb3IgZmxvYXRzLCBjb21wbGV4IGFuZCBEZWNpbWFsIHRoZVxuYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gdG8gYWx3YXlzIGNvbnRhaW4gYVxuZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIsIGV2ZW4gaWYgbm8gZGlnaXRzIGZvbGxvdyBpdC4gTm9ybWFsbHksIGFcbmRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIGFwcGVhcnMgaW4gdGhlIHJlc3VsdCBvZiB0aGVzZSBjb252ZXJzaW9uc1xub25seSBpZiBhIGRpZ2l0IGZvbGxvd3MgaXQuIEluIGFkZGl0aW9uLCBmb3IgIlwnZ1wnIiBhbmQgIlwnR1wnIlxuY29udmVyc2lvbnMsIHRyYWlsaW5nIHplcm9zIGFyZSBub3QgcmVtb3ZlZCBmcm9tIHRoZSByZXN1bHQuXG5cblRoZSAiXCcsXCciIG9wdGlvbiBzaWduYWxzIHRoZSB1c2Ugb2YgYSBjb21tYSBmb3IgYSB0aG91c2FuZHMgc2VwYXJhdG9yLlxuRm9yIGEgbG9jYWxlIGF3YXJlIHNlcGFyYXRvciwgdXNlIHRoZSAiXCduXCciIGludGVnZXIgcHJlc2VudGF0aW9uIHR5cGVcbmluc3RlYWQuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IEFkZGVkIHRoZSAiXCcsXCciIG9wdGlvbiAoc2VlIGFsc28gKipQRVAgMzc4KiopLlxuXG4qd2lkdGgqIGlzIGEgZGVjaW1hbCBpbnRlZ2VyIGRlZmluaW5nIHRoZSBtaW5pbXVtIGZpZWxkIHdpZHRoLiAgSWYgbm90XG5zcGVjaWZpZWQsIHRoZW4gdGhlIGZpZWxkIHdpZHRoIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgY29udGVudC5cblxuV2hlbiBubyBleHBsaWNpdCBhbGlnbm1lbnQgaXMgZ2l2ZW4sIHByZWNlZGluZyB0aGUgKndpZHRoKiBmaWVsZCBieSBhXG56ZXJvICgiXCcwXCciKSBjaGFyYWN0ZXIgZW5hYmxlcyBzaWduLWF3YXJlIHplcm8tcGFkZGluZyBmb3IgbnVtZXJpY1xudHlwZXMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSAqZmlsbCogY2hhcmFjdGVyIG9mICJcJzBcJyIgd2l0aCBhblxuKmFsaWdubWVudCogdHlwZSBvZiAiXCc9XCciLlxuXG5UaGUgKnByZWNpc2lvbiogaXMgYSBkZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55IGRpZ2l0cyBzaG91bGRcbmJlIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgYSBmbG9hdGluZyBwb2ludCB2YWx1ZVxuZm9ybWF0dGVkIHdpdGggIlwnZlwnIiBhbmQgIlwnRlwnIiwgb3IgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludFxuZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZm9ybWF0dGVkIHdpdGggIlwnZ1wnIiBvciAiXCdHXCciLiAgRm9yIG5vbi1cbm51bWJlciB0eXBlcyB0aGUgZmllbGQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIGZpZWxkIHNpemUgLSBpbiBvdGhlclxud29yZHMsIGhvdyBtYW55IGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkIGZyb20gdGhlIGZpZWxkIGNvbnRlbnQuIFRoZVxuKnByZWNpc2lvbiogaXMgbm90IGFsbG93ZWQgZm9yIGludGVnZXIgdmFsdWVzLlxuXG5GaW5hbGx5LCB0aGUgKnR5cGUqIGRldGVybWluZXMgaG93IHRoZSBkYXRhIHNob3VsZCBiZSBwcmVzZW50ZWQuXG5cblRoZSBhdmFpbGFibGUgc3RyaW5nIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlwnc1wnIiAgICAgfCBTdHJpbmcgZm9ybWF0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHR5cGUgZm9yIHN0cmluZ3MgYW5kICAgIHxcbiAgIHwgICAgICAgICAgIHwgbWF5IGJlIG9taXR0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyAiXCdzXCciLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuVGhlIGF2YWlsYWJsZSBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlwnYlwnIiAgICAgfCBCaW5hcnkgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAyLiAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ2NcJyIgICAgIHwgQ2hhcmFjdGVyLiBDb252ZXJ0cyB0aGUgaW50ZWdlciB0byB0aGUgY29ycmVzcG9uZGluZyAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHVuaWNvZGUgY2hhcmFjdGVyIGJlZm9yZSBwcmludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnZFwnIiAgICAgfCBEZWNpbWFsIEludGVnZXIuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDEwLiAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ29cJyIgICAgIHwgT2N0YWwgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSA4LiAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCd4XCciICAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDE2LCB1c2luZyBsb3dlci0gICAgfFxuICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ1hcJyIgICAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTYsIHVzaW5nIHVwcGVyLSAgICB8XG4gICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSA5LiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnblwnIiAgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgIlwnZFwnIiwgZXhjZXB0IHRoYXQgaXQgdXNlcyB0aGUgfFxuICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyICAgIHxcbiAgIHwgICAgICAgICAgIHwgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyAiXCdkXCciLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIHByZXNlbnRhdGlvbiB0eXBlcywgaW50ZWdlcnMgY2FuIGJlIGZvcm1hdHRlZFxud2l0aCB0aGUgZmxvYXRpbmcgcG9pbnQgcHJlc2VudGF0aW9uIHR5cGVzIGxpc3RlZCBiZWxvdyAoZXhjZXB0ICJcJ25cJyJcbmFuZCBOb25lKS4gV2hlbiBkb2luZyBzbywgImZsb2F0KCkiIGlzIHVzZWQgdG8gY29udmVydCB0aGUgaW50ZWdlciB0b1xuYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYmVmb3JlIGZvcm1hdHRpbmcuXG5cblRoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciBmbG9hdGluZyBwb2ludCBhbmQgZGVjaW1hbCB2YWx1ZXNcbmFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCAiXCdlXCciICAgICB8IEV4cG9uZW50IG5vdGF0aW9uLiBQcmludHMgdGhlIG51bWJlciBpbiBzY2llbnRpZmljICAgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBub3RhdGlvbiB1c2luZyB0aGUgbGV0dGVyIFwnZVwnIHRvIGluZGljYXRlIHRoZSBleHBvbmVudC4gICAgfFxuICAgfCAgICAgICAgICAgfCBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgIjYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ0VcJyIgICAgIHwgRXhwb25lbnQgbm90YXRpb24uIFNhbWUgYXMgIlwnZVwnIiBleGNlcHQgaXQgdXNlcyBhbiB1cHBlciAgIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZSBcJ0VcJyBhcyB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ2ZcJyIgICAgIHwgRml4ZWQgcG9pbnQuIERpc3BsYXlzIHRoZSBudW1iZXIgYXMgYSBmaXhlZC1wb2ludCBudW1iZXIuICB8XG4gICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyAiNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlwnRlwnIiAgICAgfCBGaXhlZCBwb2ludC4gU2FtZSBhcyAiXCdmXCciLCBidXQgY29udmVydHMgIm5hbiIgdG8gIk5BTiIgICAgfFxuICAgfCAgICAgICAgICAgfCBhbmQgImluZiIgdG8gIklORiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ2dcJyIgICAgIHwgR2VuZXJhbCBmb3JtYXQuICBGb3IgYSBnaXZlbiBwcmVjaXNpb24gInAgPj0gMSIsIHRoaXMgICAgICB8XG4gICB8ICAgICAgICAgICB8IHJvdW5kcyB0aGUgbnVtYmVyIHRvICJwIiBzaWduaWZpY2FudCBkaWdpdHMgYW5kIHRoZW4gICAgICAgfFxuICAgfCAgICAgICAgICAgfCBmb3JtYXRzIHRoZSByZXN1bHQgaW4gZWl0aGVyIGZpeGVkLXBvaW50IGZvcm1hdCBvciBpbiAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgc2NpZW50aWZpYyBub3RhdGlvbiwgZGVwZW5kaW5nIG9uIGl0cyBtYWduaXR1ZGUuICBUaGUgICAgICB8XG4gICB8ICAgICAgICAgICB8IHByZWNpc2UgcnVsZXMgYXJlIGFzIGZvbGxvd3M6IHN1cHBvc2UgdGhhdCB0aGUgcmVzdWx0ICAgICAgfFxuICAgfCAgICAgICAgICAgfCBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSAiXCdlXCciIGFuZCBwcmVjaXNpb24gInAtMSIgfFxuICAgfCAgICAgICAgICAgfCB3b3VsZCBoYXZlIGV4cG9uZW50ICJleHAiLiAgVGhlbiBpZiAiLTQgPD0gZXhwIDwgcCIsIHRoZSAgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVyIGlzIGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICJcJ2ZcJyIgYW5kICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgcHJlY2lzaW9uICJwLTEtZXhwIi4gIE90aGVyd2lzZSwgdGhlIG51bWJlciBpcyBmb3JtYXR0ZWQgICB8XG4gICB8ICAgICAgICAgICB8IHdpdGggcHJlc2VudGF0aW9uIHR5cGUgIlwnZVwnIiBhbmQgcHJlY2lzaW9uICJwLTEiLiBJbiBib3RoICB8XG4gICB8ICAgICAgICAgICB8IGNhc2VzIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MgYXJlIHJlbW92ZWQgZnJvbSB0aGUgICAgfFxuICAgfCAgICAgICAgICAgfCBzaWduaWZpY2FuZCwgYW5kIHRoZSBkZWNpbWFsIHBvaW50IGlzIGFsc28gcmVtb3ZlZCBpZiAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBkaWdpdHMgZm9sbG93aW5nIGl0LiAgUG9zaXRpdmUgYW5kICB8XG4gICB8ICAgICAgICAgICB8IG5lZ2F0aXZlIGluZmluaXR5LCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgemVybywgYW5kIG5hbnMsICAgfFxuICAgfCAgICAgICAgICAgfCBhcmUgZm9ybWF0dGVkIGFzICJpbmYiLCAiLWluZiIsICIwIiwgIi0wIiBhbmQgIm5hbiIgICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgcmVzcGVjdGl2ZWx5LCByZWdhcmRsZXNzIG9mIHRoZSBwcmVjaXNpb24uICBBIHByZWNpc2lvbiBvZiB8XG4gICB8ICAgICAgICAgICB8ICIwIiBpcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYSBwcmVjaXNpb24gb2YgIjEiLiBUaGUgICAgfFxuICAgfCAgICAgICAgICAgfCBkZWZhdWx0IHByZWNpc2lvbiBpcyAiNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJ0dcJyIgICAgIHwgR2VuZXJhbCBmb3JtYXQuIFNhbWUgYXMgIlwnZ1wnIiBleGNlcHQgc3dpdGNoZXMgdG8gIlwnRVwnIiBpZiAgfFxuICAgfCAgICAgICAgICAgfCB0aGUgbnVtYmVyIGdldHMgdG9vIGxhcmdlLiBUaGUgcmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5IHxcbiAgIHwgICAgICAgICAgIHwgYW5kIE5hTiBhcmUgdXBwZXJjYXNlZCwgdG9vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXCduXCciICAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyAiXCdnXCciLCBleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSB8XG4gICB8ICAgICAgICAgICB8IGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgICAgfFxuICAgfCAgICAgICAgICAgfCBzZXBhcmF0b3IgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcJyVcJyIgICAgIHwgUGVyY2VudGFnZS4gTXVsdGlwbGllcyB0aGUgbnVtYmVyIGJ5IDEwMCBhbmQgZGlzcGxheXMgaW4gICB8XG4gICB8ICAgICAgICAgICB8IGZpeGVkICgiXCdmXCciKSBmb3JtYXQsIGZvbGxvd2VkIGJ5IGEgcGVyY2VudCBzaWduLiAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBTaW1pbGFyIHRvICJcJ2dcJyIsIGV4Y2VwdCB0aGF0IGZpeGVkLXBvaW50IG5vdGF0aW9uLCB3aGVuICAgfFxuICAgfCAgICAgICAgICAgfCB1c2VkLCBoYXMgYXQgbGVhc3Qgb25lIGRpZ2l0IHBhc3QgdGhlIGRlY2ltYWwgcG9pbnQuIFRoZSAgIHxcbiAgIHwgICAgICAgICAgIHwgZGVmYXVsdCBwcmVjaXNpb24gaXMgYXMgaGlnaCBhcyBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZSAgICB8XG4gICB8ICAgICAgICAgICB8IHBhcnRpY3VsYXIgdmFsdWUuIFRoZSBvdmVyYWxsIGVmZmVjdCBpcyB0byBtYXRjaCB0aGUgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBvdXRwdXQgb2YgInN0cigpIiBhcyBhbHRlcmVkIGJ5IHRoZSBvdGhlciBmb3JtYXQgICAgICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbW9kaWZpZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5cbkZvcm1hdCBleGFtcGxlc1xuPT09PT09PT09PT09PT09XG5cblRoaXMgc2VjdGlvbiBjb250YWlucyBleGFtcGxlcyBvZiB0aGUgInN0ci5mb3JtYXQoKSIgc3ludGF4IGFuZFxuY29tcGFyaXNvbiB3aXRoIHRoZSBvbGQgIiUiLWZvcm1hdHRpbmcuXG5cbkluIG1vc3Qgb2YgdGhlIGNhc2VzIHRoZSBzeW50YXggaXMgc2ltaWxhciB0byB0aGUgb2xkICIlIi1mb3JtYXR0aW5nLFxud2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlICJ7fSIgYW5kIHdpdGggIjoiIHVzZWQgaW5zdGVhZCBvZiAiJSIuIEZvclxuZXhhbXBsZSwgIlwnJTAzLjJmXCciIGNhbiBiZSB0cmFuc2xhdGVkIHRvICJcJ3s6MDMuMmZ9XCciLlxuXG5UaGUgbmV3IGZvcm1hdCBzeW50YXggYWxzbyBzdXBwb3J0cyBuZXcgYW5kIGRpZmZlcmVudCBvcHRpb25zLCBzaG93blxuaW4gdGhlIGZvbGxvdyBleGFtcGxlcy5cblxuQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBwb3NpdGlvbjpcblxuICAgPj4+IFwnezB9LCB7MX0sIHsyfVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKVxuICAgXCdhLCBiLCBjXCdcbiAgID4+PiBcJ3t9LCB7fSwge31cJy5mb3JtYXQoXCdhXCcsIFwnYlwnLCBcJ2NcJykgICMgMy4xKyBvbmx5XG4gICBcJ2EsIGIsIGNcJ1xuICAgPj4+IFwnezJ9LCB7MX0sIHswfVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKVxuICAgXCdjLCBiLCBhXCdcbiAgID4+PiBcJ3syfSwgezF9LCB7MH1cJy5mb3JtYXQoKlwnYWJjXCcpICAgICAgIyB1bnBhY2tpbmcgYXJndW1lbnQgc2VxdWVuY2VcbiAgIFwnYywgYiwgYVwnXG4gICA+Pj4gXCd7MH17MX17MH1cJy5mb3JtYXQoXCdhYnJhXCcsIFwnY2FkXCcpICAgIyBhcmd1bWVudHNcJyBpbmRpY2VzIGNhbiBiZSByZXBlYXRlZFxuICAgXCdhYnJhY2FkYWJyYVwnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHMgYnkgbmFtZTpcblxuICAgPj4+IFwnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9XCcuZm9ybWF0KGxhdGl0dWRlPVwnMzcuMjROXCcsIGxvbmdpdHVkZT1cJy0xMTUuODFXXCcpXG4gICBcJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXXCdcbiAgID4+PiBjb29yZCA9IHtcJ2xhdGl0dWRlXCc6IFwnMzcuMjROXCcsIFwnbG9uZ2l0dWRlXCc6IFwnLTExNS44MVdcJ31cbiAgID4+PiBcJ0Nvb3JkaW5hdGVzOiB7bGF0aXR1ZGV9LCB7bG9uZ2l0dWRlfVwnLmZvcm1hdCgqKmNvb3JkKVxuICAgXCdDb29yZGluYXRlczogMzcuMjROLCAtMTE1LjgxV1wnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHNcJyBhdHRyaWJ1dGVzOlxuXG4gICA+Pj4gYyA9IDMtNWpcbiAgID4+PiAoXCdUaGUgY29tcGxleCBudW1iZXIgezB9IGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgezAucmVhbH0gXCdcbiAgIC4uLiAgXCdhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IHswLmltYWd9LlwnKS5mb3JtYXQoYylcbiAgIFwnVGhlIGNvbXBsZXggbnVtYmVyICgzLTVqKSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0IDMuMCBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IC01LjAuXCdcbiAgID4+PiBjbGFzcyBQb2ludDpcbiAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgsIHkpOlxuICAgLi4uICAgICAgICAgc2VsZi54LCBzZWxmLnkgPSB4LCB5XG4gICAuLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwnUG9pbnQoe3NlbGYueH0sIHtzZWxmLnl9KVwnLmZvcm1hdChzZWxmPXNlbGYpXG4gICAuLi5cbiAgID4+PiBzdHIoUG9pbnQoNCwgMikpXG4gICBcJ1BvaW50KDQsIDIpXCdcblxuQWNjZXNzaW5nIGFyZ3VtZW50c1wnIGl0ZW1zOlxuXG4gICA+Pj4gY29vcmQgPSAoMywgNSlcbiAgID4+PiBcJ1g6IHswWzBdfTsgIFk6IHswWzFdfVwnLmZvcm1hdChjb29yZClcbiAgIFwnWDogMzsgIFk6IDVcJ1xuXG5SZXBsYWNpbmcgIiVzIiBhbmQgIiVyIjpcblxuICAgPj4+ICJyZXByKCkgc2hvd3MgcXVvdGVzOiB7IXJ9OyBzdHIoKSBkb2VzblwndDogeyFzfSIuZm9ybWF0KFwndGVzdDFcJywgXCd0ZXN0MlwnKVxuICAgInJlcHIoKSBzaG93cyBxdW90ZXM6IFwndGVzdDFcJzsgc3RyKCkgZG9lc25cJ3Q6IHRlc3QyIlxuXG5BbGlnbmluZyB0aGUgdGV4dCBhbmQgc3BlY2lmeWluZyBhIHdpZHRoOlxuXG4gICA+Pj4gXCd7OjwzMH1cJy5mb3JtYXQoXCdsZWZ0IGFsaWduZWRcJylcbiAgIFwnbGVmdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgXCdcbiAgID4+PiBcJ3s6PjMwfVwnLmZvcm1hdChcJ3JpZ2h0IGFsaWduZWRcJylcbiAgIFwnICAgICAgICAgICAgICAgICByaWdodCBhbGlnbmVkXCdcbiAgID4+PiBcJ3s6XjMwfVwnLmZvcm1hdChcJ2NlbnRlcmVkXCcpXG4gICBcJyAgICAgICAgICAgY2VudGVyZWQgICAgICAgICAgIFwnXG4gICA+Pj4gXCd7OipeMzB9XCcuZm9ybWF0KFwnY2VudGVyZWRcJykgICMgdXNlIFwnKlwnIGFzIGEgZmlsbCBjaGFyXG4gICBcJyoqKioqKioqKioqY2VudGVyZWQqKioqKioqKioqKlwnXG5cblJlcGxhY2luZyAiJStmIiwgIiUtZiIsIGFuZCAiJSBmIiBhbmQgc3BlY2lmeWluZyBhIHNpZ246XG5cbiAgID4+PiBcJ3s6K2Z9OyB7OitmfVwnLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBpdCBhbHdheXNcbiAgIFwnKzMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuICAgPj4+IFwnezogZn07IHs6IGZ9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGEgc3BhY2UgZm9yIHBvc2l0aXZlIG51bWJlcnNcbiAgIFwnIDMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuICAgPj4+IFwnezotZn07IHs6LWZ9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IG9ubHkgdGhlIG1pbnVzIC0tIHNhbWUgYXMgXCd7OmZ9OyB7OmZ9XCdcbiAgIFwnMy4xNDAwMDA7IC0zLjE0MDAwMFwnXG5cblJlcGxhY2luZyAiJXgiIGFuZCAiJW8iIGFuZCBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBkaWZmZXJlbnQgYmFzZXM6XG5cbiAgID4+PiAjIGZvcm1hdCBhbHNvIHN1cHBvcnRzIGJpbmFyeSBudW1iZXJzXG4gICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOnh9OyAgb2N0OiB7MDpvfTsgIGJpbjogezA6Yn0iLmZvcm1hdCg0MilcbiAgIFwnaW50OiA0MjsgIGhleDogMmE7ICBvY3Q6IDUyOyAgYmluOiAxMDEwMTBcJ1xuICAgPj4+ICMgd2l0aCAweCwgMG8sIG9yIDBiIGFzIHByZWZpeDpcbiAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6I3h9OyAgb2N0OiB7MDojb307ICBiaW46IHswOiNifSIuZm9ybWF0KDQyKVxuICAgXCdpbnQ6IDQyOyAgaGV4OiAweDJhOyAgb2N0OiAwbzUyOyAgYmluOiAwYjEwMTAxMFwnXG5cblVzaW5nIHRoZSBjb21tYSBhcyBhIHRob3VzYW5kcyBzZXBhcmF0b3I6XG5cbiAgID4+PiBcJ3s6LH1cJy5mb3JtYXQoMTIzNDU2Nzg5MClcbiAgIFwnMSwyMzQsNTY3LDg5MFwnXG5cbkV4cHJlc3NpbmcgYSBwZXJjZW50YWdlOlxuXG4gICA+Pj4gcG9pbnRzID0gMTlcbiAgID4+PiB0b3RhbCA9IDIyXG4gICA+Pj4gXCdDb3JyZWN0IGFuc3dlcnM6IHs6LjIlfVwnLmZvcm1hdChwb2ludHMvdG90YWwpXG4gICBcJ0NvcnJlY3QgYW5zd2VyczogODYuMzYlXCdcblxuVXNpbmcgdHlwZS1zcGVjaWZpYyBmb3JtYXR0aW5nOlxuXG4gICA+Pj4gaW1wb3J0IGRhdGV0aW1lXG4gICA+Pj4gZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMTAsIDcsIDQsIDEyLCAxNSwgNTgpXG4gICA+Pj4gXCd7OiVZLSVtLSVkICVIOiVNOiVTfVwnLmZvcm1hdChkKVxuICAgXCcyMDEwLTA3LTA0IDEyOjE1OjU4XCdcblxuTmVzdGluZyBhcmd1bWVudHMgYW5kIG1vcmUgY29tcGxleCBleGFtcGxlczpcblxuICAgPj4+IGZvciBhbGlnbiwgdGV4dCBpbiB6aXAoXCc8Xj5cJywgW1wnbGVmdFwnLCBcJ2NlbnRlclwnLCBcJ3JpZ2h0XCddKTpcbiAgIC4uLiAgICAgXCd7MDp7ZmlsbH17YWxpZ259MTZ9XCcuZm9ybWF0KHRleHQsIGZpbGw9YWxpZ24sIGFsaWduPWFsaWduKVxuICAgLi4uXG4gICBcJ2xlZnQ8PDw8PDw8PDw8PDxcJ1xuICAgXCdeXl5eXmNlbnRlcl5eXl5eXCdcbiAgIFwnPj4+Pj4+Pj4+Pj5yaWdodFwnXG4gICA+Pj5cbiAgID4+PiBvY3RldHMgPSBbMTkyLCAxNjgsIDAsIDFdXG4gICA+Pj4gXCd7OjAyWH17OjAyWH17OjAyWH17OjAyWH1cJy5mb3JtYXQoKm9jdGV0cylcbiAgIFwnQzBBODAwMDFcJ1xuICAgPj4+IGludChfLCAxNilcbiAgIDMyMzIyMzU1MjFcbiAgID4+PlxuICAgPj4+IHdpZHRoID0gNVxuICAgPj4+IGZvciBudW0gaW4gcmFuZ2UoNSwxMik6ICNkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0VcbiAgIC4uLiAgICAgZm9yIGJhc2UgaW4gXCdkWG9iXCc6XG4gICAuLi4gICAgICAgICBwcmludChcJ3swOnt3aWR0aH17YmFzZX19XCcuZm9ybWF0KG51bSwgYmFzZT1iYXNlLCB3aWR0aD13aWR0aCksIGVuZD1cJyBcJylcbiAgIC4uLiAgICAgcHJpbnQoKVxuICAgLi4uXG4gICAgICAgNSAgICAgNSAgICAgNSAgIDEwMVxuICAgICAgIDYgICAgIDYgICAgIDYgICAxMTBcbiAgICAgICA3ICAgICA3ICAgICA3ICAgMTExXG4gICAgICAgOCAgICAgOCAgICAxMCAgMTAwMFxuICAgICAgIDkgICAgIDkgICAgMTEgIDEwMDFcbiAgICAgIDEwICAgICBBICAgIDEyICAxMDEwXG4gICAgICAxMSAgICAgQiAgICAxMyAgMTAxMVxuJywKLSAnZnVuY3Rpb24nOiB1J1xuRnVuY3Rpb24gZGVmaW5pdGlvbnNcbioqKioqKioqKioqKioqKioqKioqXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKTpcblxuICAgZnVuY2RlZiAgICAgICAgOjo9IFtkZWNvcmF0b3JzXSAiZGVmIiBmdW5jbmFtZSAiKCIgW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG4gICBkZWNvcmF0b3JzICAgICA6Oj0gZGVjb3JhdG9yK1xuICAgZGVjb3JhdG9yICAgICAgOjo9ICJAIiBkb3R0ZWRfbmFtZSBbIigiIFthcmd1bWVudF9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkVcbiAgIGRvdHRlZF9uYW1lICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4gICBwYXJhbWV0ZXJfbGlzdCA6Oj0gKGRlZnBhcmFtZXRlciAiLCIpKlxuICAgICAgICAgICAgICAgICAgICAgIHwgIioiIFtwYXJhbWV0ZXJdICgiLCIgZGVmcGFyYW1ldGVyKSogWyIsIiAiKioiIHBhcmFtZXRlcl1cbiAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgcGFyYW1ldGVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgcGFyYW1ldGVyICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZVxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBkZWYgZnVuYygpOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgZGVmIGZ1bmMoKTogcGFzc1xuICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpXG5cbldoZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iXG4qZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcy4iXG5Gb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nICphcmd1bWVudCogbWF5XG5iZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXJcJ3MgZGVmYXVsdCB2YWx1ZSBpc1xuc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGwgZm9sbG93aW5nXG5wYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSAiIioiIiBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tIHRoaXNcbmlzIGEgc3ludGFjdGljIHJlc3RyaWN0aW9uIHRoYXQgaXMgbm90IGV4cHJlc3NlZCBieSB0aGUgZ3JhbW1hci5cblxuKipEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgd2hlbiB0aGVcbmZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSBleHByZXNzaW9uIGlzXG5ldmFsdWF0ZWQgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUgInByZS1cbmNvbXB1dGVkIiB2YWx1ZSBpcyB1c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50XG50byB1bmRlcnN0YW5kIHdoZW4gYSBkZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoIGFzIGFcbmxpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieVxuYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYSBsaXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLlxuVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgaXMgdG8gdXNlXG4iTm9uZSIgYXMgdGhlIGRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZVxuZnVuY3Rpb24sIGUuZy46XG5cbiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4gICAgICAgICAgIHBlbmd1aW4gPSBbXVxuICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbiAgICAgICByZXR1cm4gcGVuZ3VpblxuXG5GdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb25cbipDYWxscyouIEEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnNcbm1lbnRpb25lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbVxua2V5d29yZCBhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybVxuIiIqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgdHVwbGUgcmVjZWl2aW5nIGFueVxuZXhjZXNzIHBvc2l0aW9uYWwgcGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZiB0aGVcbmZvcm0gIiIqKmlkZW50aWZpZXIiIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ld1xuZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ld1xuZW1wdHkgZGljdGlvbmFyeS4gUGFyYW1ldGVycyBhZnRlciAiIioiIiBvciAiIippZGVudGlmaWVyIiIgYXJlXG5rZXl3b3JkLW9ubHkgcGFyYW1ldGVycyBhbmQgbWF5IG9ubHkgYmUgcGFzc2VkIHVzZWQga2V5d29yZCBhcmd1bWVudHMuXG5cblBhcmFtZXRlcnMgbWF5IGhhdmUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm0gIiI6IGV4cHJlc3Npb24iIiBmb2xsb3dpbmdcbnRoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiBldmVuIHRob3NlXG5vZiB0aGUgZm9ybSAiKmlkZW50aWZpZXIiIG9yICIqKmlkZW50aWZpZXIiLiAgRnVuY3Rpb25zIG1heSBoYXZlXG4icmV0dXJuIiBhbm5vdGF0aW9uIG9mIHRoZSBmb3JtICIiLT4gZXhwcmVzc2lvbiIiIGFmdGVyIHRoZSBwYXJhbWV0ZXJcbmxpc3QuICBUaGVzZSBhbm5vdGF0aW9ucyBjYW4gYmUgYW55IHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIGFuZCBhcmVcbmV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIGV4ZWN1dGVkLiAgQW5ub3RhdGlvbnMgbWF5XG5iZSBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlIGNvZGUuXG5UaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYVxuZnVuY3Rpb24uICBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YWx1ZXMgb2YgYVxuZGljdGlvbmFyeSBrZXllZCBieSB0aGUgcGFyYW1ldGVyc1wnIG5hbWVzIGluIHRoZSAiX19hbm5vdGF0aW9uc19fIlxuYXR0cmlidXRlIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuXG5cbkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmRcbnRvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYVxuZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uICpMYW1iZGFzKi4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhXG5leHByZXNzaW9uIGlzIG1lcmVseSBhIHNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247XG5hIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSAiImRlZiIiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCBvclxuYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSBsYW1iZGFcbmV4cHJlc3Npb24uICBUaGUgIiJkZWYiIiBmb3JtIGlzIGFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXRcbmFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICIiZGVmIiJcbnN0YXRlbWVudCBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbFxuZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWRcbmluIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvblxuY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyogZm9yIGRldGFpbHMuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9uc1xuXG4gICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy5cbicsCi0gJ2dsb2JhbCc6IHUnXG5UaGUgImdsb2JhbCIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGdsb2JhbF9zdG10IDo6PSAiZ2xvYmFsIiBpZGVudGlmaWVyICgiLCIgaWRlbnRpZmllcikqXG5cblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaXMgYSBkZWNsYXJhdGlvbiB3aGljaCBob2xkcyBmb3IgdGhlIGVudGlyZVxuY3VycmVudCBjb2RlIGJsb2NrLiAgSXQgbWVhbnMgdGhhdCB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIGFyZSB0byBiZVxuaW50ZXJwcmV0ZWQgYXMgZ2xvYmFscy4gIEl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gYXNzaWduIHRvIGEgZ2xvYmFsXG52YXJpYWJsZSB3aXRob3V0ICJnbG9iYWwiLCBhbHRob3VnaCBmcmVlIHZhcmlhYmxlcyBtYXkgcmVmZXIgdG9cbmdsb2JhbHMgd2l0aG91dCBiZWluZyBkZWNsYXJlZCBnbG9iYWwuXG5cbk5hbWVzIGxpc3RlZCBpbiBhICJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBzYW1lIGNvZGVcbmJsb2NrIHRleHR1YWxseSBwcmVjZWRpbmcgdGhhdCAiZ2xvYmFsIiBzdGF0ZW1lbnQuXG5cbk5hbWVzIGxpc3RlZCBpbiBhICJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBiZSBkZWZpbmVkIGFzIGZvcm1hbFxucGFyYW1ldGVycyBvciBpbiBhICJmb3IiIGxvb3AgY29udHJvbCB0YXJnZXQsICJjbGFzcyIgZGVmaW5pdGlvbixcbmZ1bmN0aW9uIGRlZmluaXRpb24sIG9yICJpbXBvcnQiIHN0YXRlbWVudC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdFxuZW5mb3JjZSB0aGUgdHdvIHJlc3RyaWN0aW9ucywgYnV0IHByb2dyYW1zIHNob3VsZCBub3QgYWJ1c2UgdGhpc1xuZnJlZWRvbSwgYXMgZnV0dXJlIGltcGxlbWVudGF0aW9ucyBtYXkgZW5mb3JjZSB0aGVtIG9yIHNpbGVudGx5IGNoYW5nZVxudGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0uXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIHRoZSAiZ2xvYmFsIiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgcGFyc2VyLiAgSXRcbmFwcGxpZXMgb25seSB0byBjb2RlIHBhcnNlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSAiZ2xvYmFsIlxuc3RhdGVtZW50LiBJbiBwYXJ0aWN1bGFyLCBhICJnbG9iYWwiIHN0YXRlbWVudCBjb250YWluZWQgaW4gYSBzdHJpbmdcbm9yIGNvZGUgb2JqZWN0IHN1cHBsaWVkIHRvIHRoZSBidWlsdC1pbiAiZXhlYygpIiBmdW5jdGlvbiBkb2VzIG5vdFxuYWZmZWN0IHRoZSBjb2RlIGJsb2NrICpjb250YWluaW5nKiB0aGUgZnVuY3Rpb24gY2FsbCwgYW5kIGNvZGVcbmNvbnRhaW5lZCBpbiBzdWNoIGEgc3RyaW5nIGlzIHVuYWZmZWN0ZWQgYnkgImdsb2JhbCIgc3RhdGVtZW50cyBpbiB0aGVcbmNvZGUgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gY2FsbC4gIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlICJldmFsKCkiXG5hbmQgImNvbXBpbGUoKSIgZnVuY3Rpb25zLlxuJywKLSAnaWQtY2xhc3Nlcyc6IHUnXG5SZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkNlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSBzcGVjaWFsXG5tZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mIGxlYWRpbmcgYW5kXG50cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6XG5cbiJfKiJcbiAgIE5vdCBpbXBvcnRlZCBieSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiLiAgVGhlIHNwZWNpYWwgaWRlbnRpZmllciAiXyJcbiAgIGlzIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIHRvIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlXG4gICBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgImJ1aWx0aW5zIiBtb2R1bGUuICBXaGVuIG5vdFxuICAgaW4gaW50ZXJhY3RpdmUgbW9kZSwgIl8iIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzIG5vdCBkZWZpbmVkLlxuICAgU2VlIHNlY3Rpb24gKlRoZSBpbXBvcnQgc3RhdGVtZW50Ki5cblxuICAgTm90ZTogVGhlIG5hbWUgIl8iIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZVxuICAgICAiZ2V0dGV4dCIgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgY29udmVudGlvbi5cblxuIl9fKl9fIlxuICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlclxuICAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KS4gIEN1cnJlbnRcbiAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSAqU3BlY2lhbCBtZXRob2QgbmFtZXMqIHNlY3Rpb25cbiAgIGFuZCBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mXG4gICBQeXRob24uICAqQW55KiB1c2Ugb2YgIl9fKl9fIiBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgZG9lcyBub3RcbiAgIGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlIHdpdGhvdXRcbiAgIHdhcm5pbmcuXG5cbiJfXyoiXG4gICBDbGFzcy1wcml2YXRlIG5hbWVzLiAgTmFtZXMgaW4gdGhpcyBjYXRlZ29yeSwgd2hlbiB1c2VkIHdpdGhpbiB0aGVcbiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm1cbiAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgYmFzZSBhbmRcbiAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gKklkZW50aWZpZXJzIChOYW1lcykqLlxuJywKLSAnaWRlbnRpZmllcnMnOiB1J1xuSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzXG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuSWRlbnRpZmllcnMgKGFsc28gcmVmZXJyZWQgdG8gYXMgKm5hbWVzKikgYXJlIGRlc2NyaWJlZCBieSB0aGVcbmZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zLlxuXG5UaGUgc3ludGF4IG9mIGlkZW50aWZpZXJzIGluIFB5dGhvbiBpcyBiYXNlZCBvbiB0aGUgVW5pY29kZSBzdGFuZGFyZFxuYW5uZXggVUFYLTMxLCB3aXRoIGVsYWJvcmF0aW9uIGFuZCBjaGFuZ2VzIGFzIGRlZmluZWQgYmVsb3c7IHNlZSBhbHNvXG4qKlBFUCAzMTMxKiogZm9yIGZ1cnRoZXIgZGV0YWlscy5cblxuV2l0aGluIHRoZSBBU0NJSSByYW5nZSAoVSswMDAxLi5VKzAwN0YpLCB0aGUgdmFsaWQgY2hhcmFjdGVycyBmb3JcbmlkZW50aWZpZXJzIGFyZSB0aGUgc2FtZSBhcyBpbiBQeXRob24gMi54OiB0aGUgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2VcbmxldHRlcnMgIkEiIHRocm91Z2ggIloiLCB0aGUgdW5kZXJzY29yZSAiXyIgYW5kLCBleGNlcHQgZm9yIHRoZSBmaXJzdFxuY2hhcmFjdGVyLCB0aGUgZGlnaXRzICIwIiB0aHJvdWdoICI5Ii5cblxuUHl0aG9uIDMuMCBpbnRyb2R1Y2VzIGFkZGl0aW9uYWwgY2hhcmFjdGVycyBmcm9tIG91dHNpZGUgdGhlIEFTQ0lJXG5yYW5nZSAoc2VlICoqUEVQIDMxMzEqKikuICBGb3IgdGhlc2UgY2hhcmFjdGVycywgdGhlIGNsYXNzaWZpY2F0aW9uXG51c2VzIHRoZSB2ZXJzaW9uIG9mIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSBhcyBpbmNsdWRlZCBpbiB0aGVcbiJ1bmljb2RlZGF0YSIgbW9kdWxlLlxuXG5JZGVudGlmaWVycyBhcmUgdW5saW1pdGVkIGluIGxlbmd0aC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuXG5cbiAgIGlkZW50aWZpZXIgICA6Oj0geGlkX3N0YXJ0IHhpZF9jb250aW51ZSpcbiAgIGlkX3N0YXJ0ICAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGdlbmVyYWwgY2F0ZWdvcmllcyBMdSwgTGwsIEx0LCBMbSwgTG8sIE5sLCB0aGUgdW5kZXJzY29yZSwgYW5kIGNoYXJhY3RlcnMgd2l0aCB0aGUgT3RoZXJfSURfU3RhcnQgcHJvcGVydHk+XG4gICBpZF9jb250aW51ZSAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCwgcGx1cyBjaGFyYWN0ZXJzIGluIHRoZSBjYXRlZ29yaWVzIE1uLCBNYywgTmQsIFBjIGFuZCBvdGhlcnMgd2l0aCB0aGUgT3RoZXJfSURfQ29udGludWUgcHJvcGVydHk+XG4gICB4aWRfc3RhcnQgICAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCB3aG9zZSBORktDIG5vcm1hbGl6YXRpb24gaXMgaW4gImlkX3N0YXJ0IHhpZF9jb250aW51ZSoiPlxuICAgeGlkX2NvbnRpbnVlIDo6PSA8YWxsIGNoYXJhY3RlcnMgaW4gaWRfY29udGludWUgd2hvc2UgTkZLQyBub3JtYWxpemF0aW9uIGlzIGluICJpZF9jb250aW51ZSoiPlxuXG5UaGUgVW5pY29kZSBjYXRlZ29yeSBjb2RlcyBtZW50aW9uZWQgYWJvdmUgc3RhbmQgZm9yOlxuXG4qICpMdSogLSB1cHBlcmNhc2UgbGV0dGVyc1xuXG4qICpMbCogLSBsb3dlcmNhc2UgbGV0dGVyc1xuXG4qICpMdCogLSB0aXRsZWNhc2UgbGV0dGVyc1xuXG4qICpMbSogLSBtb2RpZmllciBsZXR0ZXJzXG5cbiogKkxvKiAtIG90aGVyIGxldHRlcnNcblxuKiAqTmwqIC0gbGV0dGVyIG51bWJlcnNcblxuKiAqTW4qIC0gbm9uc3BhY2luZyBtYXJrc1xuXG4qICpNYyogLSBzcGFjaW5nIGNvbWJpbmluZyBtYXJrc1xuXG4qICpOZCogLSBkZWNpbWFsIG51bWJlcnNcblxuKiAqUGMqIC0gY29ubmVjdG9yIHB1bmN0dWF0aW9uc1xuXG4qICpPdGhlcl9JRF9TdGFydCogLSBleHBsaWNpdCBsaXN0IG9mIGNoYXJhY3RlcnMgaW4gUHJvcExpc3QudHh0IHRvXG4gIHN1cHBvcnQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuKiAqT3RoZXJfSURfQ29udGludWUqIC0gbGlrZXdpc2VcblxuQWxsIGlkZW50aWZpZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aGUgbm9ybWFsIGZvcm0gTkZLQyB3aGlsZSBwYXJzaW5nO1xuY29tcGFyaXNvbiBvZiBpZGVudGlmaWVycyBpcyBiYXNlZCBvbiBORktDLlxuXG5BIG5vbi1ub3JtYXRpdmUgSFRNTCBmaWxlIGxpc3RpbmcgYWxsIHZhbGlkIGlkZW50aWZpZXIgY2hhcmFjdGVycyBmb3JcblVuaWNvZGUgNC4xIGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5kY2wuaHBpLnVuaS1cbnBvdHNkYW0uZGUvaG9tZS9sb2V3aXMvdGFibGUtMzEzMS5odG1sLlxuXG5cbktleXdvcmRzXG49PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIGFyZSB1c2VkIGFzIHJlc2VydmVkIHdvcmRzLCBvciAqa2V5d29yZHMqIG9mXG50aGUgbGFuZ3VhZ2UsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBvcmRpbmFyeSBpZGVudGlmaWVycy4gIFRoZXkgbXVzdFxuYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZTpcblxuICAgRmFsc2UgICAgICBjbGFzcyAgICAgIGZpbmFsbHkgICAgaXMgICAgICAgICByZXR1cm5cbiAgIE5vbmUgICAgICAgY29udGludWUgICBmb3IgICAgICAgIGxhbWJkYSAgICAgdHJ5XG4gICBUcnVlICAgICAgIGRlZiAgICAgICAgZnJvbSAgICAgICBub25sb2NhbCAgIHdoaWxlXG4gICBhbmQgICAgICAgIGRlbCAgICAgICAgZ2xvYmFsICAgICBub3QgICAgICAgIHdpdGhcbiAgIGFzICAgICAgICAgZWxpZiAgICAgICBpZiAgICAgICAgIG9yICAgICAgICAgeWllbGRcbiAgIGFzc2VydCAgICAgZWxzZSAgICAgICBpbXBvcnQgICAgIHBhc3NcbiAgIGJyZWFrICAgICAgZXhjZXB0ICAgICBpbiAgICAgICAgIHJhaXNlXG5cblxuUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVyc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5DZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbFxubWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZFxudHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOlxuXG4iXyoiXG4gICBOb3QgaW1wb3J0ZWQgYnkgImZyb20gbW9kdWxlIGltcG9ydCAqIi4gIFRoZSBzcGVjaWFsIGlkZW50aWZpZXIgIl8iXG4gICBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIHRoZVxuICAgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlICJidWlsdGlucyIgbW9kdWxlLiAgV2hlbiBub3RcbiAgIGluIGludGVyYWN0aXZlIG1vZGUsICJfIiBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGFuZCBpcyBub3QgZGVmaW5lZC5cbiAgIFNlZSBzZWN0aW9uICpUaGUgaW1wb3J0IHN0YXRlbWVudCouXG5cbiAgIE5vdGU6IFRoZSBuYW1lICJfIiBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbiAgICAgaW50ZXJuYXRpb25hbGl6YXRpb247IHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGVcbiAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uXG5cbiJfXypfXyJcbiAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgaW50ZXJwcmV0ZXJcbiAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICBDdXJyZW50XG4gICBzeXN0ZW0gbmFtZXMgYXJlIGRpc2N1c3NlZCBpbiB0aGUgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKiBzZWN0aW9uXG4gICBhbmQgZWxzZXdoZXJlLiAgTW9yZSB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZlxuICAgUHl0aG9uLiAgKkFueSogdXNlIG9mICJfXypfXyIgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXMgbm90XG4gICBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZSB3aXRob3V0XG4gICB3YXJuaW5nLlxuXG4iX18qIlxuICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlXG4gICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgbWFuZ2xlZCBmb3JtXG4gICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mIGJhc2UgYW5kXG4gICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uICpJZGVudGlmaWVycyAoTmFtZXMpKi5cbicsCi0gJ2lmJzogdSdcblRoZSAiaWYiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqXG5cblRoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmXG5wcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCi0gJ2ltYWdpbmFyeSc6IHUnXG5JbWFnaW5hcnkgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKlxuXG5JbWFnaW5hcnkgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6XG5cbiAgIGltYWdudW1iZXIgOjo9IChmbG9hdG51bWJlciB8IGludHBhcnQpICgiaiIgfCAiSiIpXG5cbkFuIGltYWdpbmFyeSBsaXRlcmFsIHlpZWxkcyBhIGNvbXBsZXggbnVtYmVyIHdpdGggYSByZWFsIHBhcnQgb2YgMC4wLlxuQ29tcGxleCBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVyc1xuYW5kIGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIG9uIHRoZWlyIHJhbmdlLiAgVG8gY3JlYXRlIGEgY29tcGxleFxubnVtYmVyIHdpdGggYSBub256ZXJvIHJlYWwgcGFydCwgYWRkIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIGl0LFxuZS5nLiwgIigzKzRqKSIuICBTb21lIGV4YW1wbGVzIG9mIGltYWdpbmFyeSBsaXRlcmFsczpcblxuICAgMy4xNGogICAxMC5qICAgIDEwaiAgICAgLjAwMWogICAxZTEwMGogIDMuMTRlLTEwalxuJywKLSAnaW1wb3J0JzogdSdcblRoZSAiaW1wb3J0IiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuICAgaW1wb3J0X3N0bXQgICAgIDo6PSAiaW1wb3J0IiBtb2R1bGUgWyJhcyIgbmFtZV0gKCAiLCIgbW9kdWxlIFsiYXMiIG5hbWVdICkqXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgcmVsYXRpdmVfbW9kdWxlICJpbXBvcnQiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgcmVsYXRpdmVfbW9kdWxlICJpbXBvcnQiICIoIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgKCAiLCIgaWRlbnRpZmllciBbImFzIiBuYW1lXSApKiBbIiwiXSAiKSJcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiBtb2R1bGUgImltcG9ydCIgIioiXG4gICBtb2R1bGUgICAgICAgICAgOjo9IChpZGVudGlmaWVyICIuIikqIGlkZW50aWZpZXJcbiAgIHJlbGF0aXZlX21vZHVsZSA6Oj0gIi4iKiBtb2R1bGUgfCAiLiIrXG4gICBuYW1lICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcblxuVGhlIGJhc2ljIGltcG9ydCBzdGF0ZW1lbnQgKG5vICJmcm9tIiBjbGF1c2UpIGlzIGV4ZWN1dGVkIGluIHR3b1xuc3RlcHM6XG5cbjEuIGZpbmQgYSBtb2R1bGUsIGxvYWRpbmcgYW5kIGluaXRpYWxpemluZyBpdCBpZiBuZWNlc3NhcnlcblxuMi4gZGVmaW5lIGEgbmFtZSBvciBuYW1lcyBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgc2NvcGVcbiAgIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLlxuXG5XaGVuIHRoZSBzdGF0ZW1lbnQgY29udGFpbnMgbXVsdGlwbGUgY2xhdXNlcyAoc2VwYXJhdGVkIGJ5IGNvbW1hcykgdGhlXG50d28gc3RlcHMgYXJlIGNhcnJpZWQgb3V0IHNlcGFyYXRlbHkgZm9yIGVhY2ggY2xhdXNlLCBqdXN0IGFzIHRob3VnaFxudGhlIGNsYXVzZXMgaGFkIGJlZW4gc2VwYXJhdGVkIG91dCBpbnRvIGluZGl2aWR1YWwgaW1wb3J0IHN0YXRlbWVudHMuXG5cblRoZSBkZXRhaWxzIG9mIHRoZSBmaXJzdCBzdGVwLCBmaW5kaW5nIGFuZCBsb2FkaW5nIG1vZHVsZXMgYXJlXG5kZXNjcmliZWQgaW4gZ3JlYXRlciBkZXRhaWwgaW4gdGhlIHNlY3Rpb24gb24gdGhlICppbXBvcnQgc3lzdGVtKixcbndoaWNoIGFsc28gZGVzY3JpYmVzIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHBhY2thZ2VzIGFuZCBtb2R1bGVzIHRoYXRcbmNhbiBiZSBpbXBvcnRlZCwgYXMgd2VsbCBhcyBhbGwgdGhlIGhvb2tzIHRoYXQgY2FuIGJlIHVzZWQgdG9cbmN1c3RvbWl6ZSB0aGUgaW1wb3J0IHN5c3RlbS4gTm90ZSB0aGF0IGZhaWx1cmVzIGluIHRoaXMgc3RlcCBtYXlcbmluZGljYXRlIGVpdGhlciB0aGF0IHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGxvY2F0ZWQsICpvciogdGhhdCBhblxuZXJyb3Igb2NjdXJyZWQgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBtb2R1bGUsIHdoaWNoIGluY2x1ZGVzIGV4ZWN1dGlvblxub2YgdGhlIG1vZHVsZVwncyBjb2RlLlxuXG5JZiB0aGUgcmVxdWVzdGVkIG1vZHVsZSBpcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5LCBpdCB3aWxsIGJlIG1hZGVcbmF2YWlsYWJsZSBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGluIG9uZSBvZiB0aHJlZSB3YXlzOlxuXG4qIElmIHRoZSBtb2R1bGUgbmFtZSBpcyBmb2xsb3dlZCBieSAiYXMiLCB0aGVuIHRoZSBuYW1lIGZvbGxvd2luZ1xuICAiYXMiIGlzIGJvdW5kIGRpcmVjdGx5IHRvIHRoZSBpbXBvcnRlZCBtb2R1bGUuXG5cbiogSWYgbm8gb3RoZXIgbmFtZSBpcyBzcGVjaWZpZWQsIGFuZCB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzIGFcbiAgdG9wIGxldmVsIG1vZHVsZSwgdGhlIG1vZHVsZVwncyBuYW1lIGlzIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2VcbiAgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGltcG9ydGVkIG1vZHVsZVxuXG4qIElmIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgKm5vdCogYSB0b3AgbGV2ZWwgbW9kdWxlLCB0aGVuIHRoZVxuICBuYW1lIG9mIHRoZSB0b3AgbGV2ZWwgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZSBtb2R1bGUgaXMgYm91bmQgaW5cbiAgdGhlIGxvY2FsIG5hbWVzcGFjZSBhcyBhIHJlZmVyZW5jZSB0byB0aGUgdG9wIGxldmVsIHBhY2thZ2UuIFRoZVxuICBpbXBvcnRlZCBtb2R1bGUgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBpdHMgZnVsbCBxdWFsaWZpZWQgbmFtZVxuICByYXRoZXIgdGhhbiBkaXJlY3RseVxuXG5UaGUgImZyb20iIGZvcm0gdXNlcyBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBwcm9jZXNzOlxuXG4xLiBmaW5kIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGluIHRoZSAiZnJvbSIgY2xhdXNlLCBsb2FkaW5nIGFuZFxuICAgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeTtcblxuMi4gZm9yIGVhY2ggb2YgdGhlIGlkZW50aWZpZXJzIHNwZWNpZmllZCBpbiB0aGUgImltcG9ydCIgY2xhdXNlczpcblxuICAgMS4gY2hlY2sgaWYgdGhlIGltcG9ydGVkIG1vZHVsZSBoYXMgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZVxuXG4gICAyLiBpZiBub3QsIGF0dGVtcHQgdG8gaW1wb3J0IGEgc3VibW9kdWxlIHdpdGggdGhhdCBuYW1lIGFuZCB0aGVuXG4gICAgICBjaGVjayB0aGUgaW1wb3J0ZWQgbW9kdWxlIGFnYWluIGZvciB0aGF0IGF0dHJpYnV0ZVxuXG4gICAzLiBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgIkltcG9ydEVycm9yIiBpcyByYWlzZWQuXG5cbiAgIDQuIG90aGVyd2lzZSwgYSByZWZlcmVuY2UgdG8gdGhhdCB2YWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGxvY2FsXG4gICAgICBuYW1lc3BhY2UsIHVzaW5nIHRoZSBuYW1lIGluIHRoZSAiYXMiIGNsYXVzZSBpZiBpdCBpcyBwcmVzZW50LFxuICAgICAgb3RoZXJ3aXNlIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbmFtZVxuXG5FeGFtcGxlczpcblxuICAgaW1wb3J0IGZvbyAgICAgICAgICAgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGJvdW5kIGxvY2FsbHlcbiAgIGltcG9ydCBmb28uYmFyLmJheiAgICAgICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQsIGZvbyBib3VuZCBsb2NhbGx5XG4gICBpbXBvcnQgZm9vLmJhci5iYXogYXMgZmJiICAjIGZvby5iYXIuYmF6IGltcG9ydGVkIGFuZCBib3VuZCBhcyBmYmJcbiAgIGZyb20gZm9vLmJhciBpbXBvcnQgYmF6ICAgICMgZm9vLmJhci5iYXogaW1wb3J0ZWQgYW5kIGJvdW5kIGFzIGJhelxuICAgZnJvbSBmb28gaW1wb3J0IGF0dHIgICAgICAgIyBmb28gaW1wb3J0ZWQgYW5kIGZvby5hdHRyIGJvdW5kIGFzIGF0dHJcblxuSWYgdGhlIGxpc3Qgb2YgaWRlbnRpZmllcnMgaXMgcmVwbGFjZWQgYnkgYSBzdGFyICgiXCcqXCciKSwgYWxsIHB1YmxpY1xubmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlIGFyZSBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGVcbnNjb3BlIHdoZXJlIHRoZSAiaW1wb3J0IiBzdGF0ZW1lbnQgb2NjdXJzLlxuXG5UaGUgKnB1YmxpYyBuYW1lcyogZGVmaW5lZCBieSBhIG1vZHVsZSBhcmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGVcbm1vZHVsZVwncyBuYW1lc3BhY2UgZm9yIGEgdmFyaWFibGUgbmFtZWQgIl9fYWxsX18iOyBpZiBkZWZpbmVkLCBpdCBtdXN0XG5iZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG5hbWVzIGRlZmluZWQgb3IgaW1wb3J0ZWQgYnkgdGhhdFxubW9kdWxlLiAgVGhlIG5hbWVzIGdpdmVuIGluICJfX2FsbF9fIiBhcmUgYWxsIGNvbnNpZGVyZWQgcHVibGljIGFuZFxuYXJlIHJlcXVpcmVkIHRvIGV4aXN0LiAgSWYgIl9fYWxsX18iIGlzIG5vdCBkZWZpbmVkLCB0aGUgc2V0IG9mIHB1YmxpY1xubmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlIHdoaWNoIGRvIG5vdFxuYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlIGNoYXJhY3RlciAoIlwnX1wnIikuICAiX19hbGxfXyIgc2hvdWxkIGNvbnRhaW5cbnRoZSBlbnRpcmUgcHVibGljIEFQSS4gSXQgaXMgaW50ZW5kZWQgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IGV4cG9ydGluZ1xuaXRlbXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIEFQSSAoc3VjaCBhcyBsaWJyYXJ5IG1vZHVsZXMgd2hpY2ggd2VyZVxuaW1wb3J0ZWQgYW5kIHVzZWQgd2l0aGluIHRoZSBtb2R1bGUpLlxuXG5UaGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiIC0tLSBpcyBvbmx5XG5hbGxvd2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuICBBdHRlbXB0aW5nIHRvIHVzZSBpdCBpbiBjbGFzcyBvclxuZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2lsbCByYWlzZSBhICJTeW50YXhFcnJvciIuXG5cbldoZW4gc3BlY2lmeWluZyB3aGF0IG1vZHVsZSB0byBpbXBvcnQgeW91IGRvIG5vdCBoYXZlIHRvIHNwZWNpZnkgdGhlXG5hYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUuIFdoZW4gYSBtb2R1bGUgb3IgcGFja2FnZSBpcyBjb250YWluZWRcbndpdGhpbiBhbm90aGVyIHBhY2thZ2UgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHJlbGF0aXZlIGltcG9ydCB3aXRoaW5cbnRoZSBzYW1lIHRvcCBwYWNrYWdlIHdpdGhvdXQgaGF2aW5nIHRvIG1lbnRpb24gdGhlIHBhY2thZ2UgbmFtZS4gQnlcbnVzaW5nIGxlYWRpbmcgZG90cyBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvciBwYWNrYWdlIGFmdGVyICJmcm9tIiB5b3VcbmNhbiBzcGVjaWZ5IGhvdyBoaWdoIHRvIHRyYXZlcnNlIHVwIHRoZSBjdXJyZW50IHBhY2thZ2UgaGllcmFyY2h5XG53aXRob3V0IHNwZWNpZnlpbmcgZXhhY3QgbmFtZXMuIE9uZSBsZWFkaW5nIGRvdCBtZWFucyB0aGUgY3VycmVudFxucGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgdXBcbm9uZSBwYWNrYWdlIGxldmVsLiBUaHJlZSBkb3RzIGlzIHVwIHR3byBsZXZlbHMsIGV0Yy4gU28gaWYgeW91IGV4ZWN1dGVcbiJmcm9tIC4gaW1wb3J0IG1vZCIgZnJvbSBhIG1vZHVsZSBpbiB0aGUgInBrZyIgcGFja2FnZSB0aGVuIHlvdSB3aWxsXG5lbmQgdXAgaW1wb3J0aW5nICJwa2cubW9kIi4gSWYgeW91IGV4ZWN1dGUgImZyb20gLi5zdWJwa2cyIGltcG9ydCBtb2QiXG5mcm9tIHdpdGhpbiAicGtnLnN1YnBrZzEiIHlvdSB3aWxsIGltcG9ydCAicGtnLnN1YnBrZzIubW9kIi4gVGhlXG5zcGVjaWZpY2F0aW9uIGZvciByZWxhdGl2ZSBpbXBvcnRzIGlzIGNvbnRhaW5lZCB3aXRoaW4gKipQRVAgMzI4KiouXG5cbiJpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIiBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyB0aGF0XG5kZXRlcm1pbmUgZHluYW1pY2FsbHkgdGhlIG1vZHVsZXMgdG8gYmUgbG9hZGVkLlxuXG5cbkZ1dHVyZSBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PVxuXG5BICpmdXR1cmUgc3RhdGVtZW50KiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgY29tcGlsZXIgdGhhdCBhIHBhcnRpY3VsYXJcbm1vZHVsZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgc3ludGF4IG9yIHNlbWFudGljcyB0aGF0IHdpbGwgYmVcbmF2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBmdXR1cmUgcmVsZWFzZSBvZiBQeXRob24gd2hlcmUgdGhlIGZlYXR1cmVcbmJlY29tZXMgc3RhbmRhcmQuXG5cblRoZSBmdXR1cmUgc3RhdGVtZW50IGlzIGludGVuZGVkIHRvIGVhc2UgbWlncmF0aW9uIHRvIGZ1dHVyZSB2ZXJzaW9uc1xub2YgUHl0aG9uIHRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gIEl0XG5hbGxvd3MgdXNlIG9mIHRoZSBuZXcgZmVhdHVyZXMgb24gYSBwZXItbW9kdWxlIGJhc2lzIGJlZm9yZSB0aGVcbnJlbGVhc2UgaW4gd2hpY2ggdGhlIGZlYXR1cmUgYmVjb21lcyBzdGFuZGFyZC5cblxuICAgZnV0dXJlX3N0YXRlbWVudCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKlxuICAgICAgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKiBbIiwiXSAiKSJcbiAgIGZlYXR1cmUgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbiAgIG5hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcblxuQSBmdXR1cmUgc3RhdGVtZW50IG11c3QgYXBwZWFyIG5lYXIgdGhlIHRvcCBvZiB0aGUgbW9kdWxlLiAgVGhlIG9ubHlcbmxpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZTpcblxuKiB0aGUgbW9kdWxlIGRvY3N0cmluZyAoaWYgYW55KSxcblxuKiBjb21tZW50cyxcblxuKiBibGFuayBsaW5lcywgYW5kXG5cbiogb3RoZXIgZnV0dXJlIHN0YXRlbWVudHMuXG5cblRoZSBmZWF0dXJlcyByZWNvZ25pemVkIGJ5IFB5dGhvbiAzLjAgYXJlICJhYnNvbHV0ZV9pbXBvcnQiLFxuImRpdmlzaW9uIiwgImdlbmVyYXRvcnMiLCAidW5pY29kZV9saXRlcmFscyIsICJwcmludF9mdW5jdGlvbiIsXG4ibmVzdGVkX3Njb3BlcyIgYW5kICJ3aXRoX3N0YXRlbWVudCIuICBUaGV5IGFyZSBhbGwgcmVkdW5kYW50IGJlY2F1c2VcbnRoZXkgYXJlIGFsd2F5cyBlbmFibGVkLCBhbmQgb25seSBrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cblxuQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGVcbnRpbWU6IENoYW5nZXMgdG8gdGhlIHNlbWFudGljcyBvZiBjb3JlIGNvbnN0cnVjdHMgYXJlIG9mdGVuXG5pbXBsZW1lbnRlZCBieSBnZW5lcmF0aW5nIGRpZmZlcmVudCBjb2RlLiAgSXQgbWF5IGV2ZW4gYmUgdGhlIGNhc2VcbnRoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgbmV3XG5yZXNlcnZlZCB3b3JkKSwgaW4gd2hpY2ggY2FzZSB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gcGFyc2UgdGhlXG5tb2R1bGUgZGlmZmVyZW50bHkuICBTdWNoIGRlY2lzaW9ucyBjYW5ub3QgYmUgcHVzaGVkIG9mZiB1bnRpbFxucnVudGltZS5cblxuRm9yIGFueSBnaXZlbiByZWxlYXNlLCB0aGUgY29tcGlsZXIga25vd3Mgd2hpY2ggZmVhdHVyZSBuYW1lcyBoYXZlXG5iZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgc3RhdGVtZW50XG5jb250YWlucyBhIGZlYXR1cmUgbm90IGtub3duIHRvIGl0LlxuXG5UaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCBzdGF0ZW1lbnQ6XG50aGVyZSBpcyBhIHN0YW5kYXJkIG1vZHVsZSAiX19mdXR1cmVfXyIsIGRlc2NyaWJlZCBsYXRlciwgYW5kIGl0IHdpbGxcbmJlIGltcG9ydGVkIGluIHRoZSB1c3VhbCB3YXkgYXQgdGhlIHRpbWUgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXNcbmV4ZWN1dGVkLlxuXG5UaGUgaW50ZXJlc3RpbmcgcnVudGltZSBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBmZWF0dXJlXG5lbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LlxuXG5Ob3RlIHRoYXQgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBzdGF0ZW1lbnQ6XG5cbiAgIGltcG9ydCBfX2Z1dHVyZV9fIFthcyBuYW1lXVxuXG5UaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl0XCdzIGFuIG9yZGluYXJ5IGltcG9ydCBzdGF0ZW1lbnQgd2l0aFxubm8gc3BlY2lhbCBzZW1hbnRpY3Mgb3Igc3ludGF4IHJlc3RyaWN0aW9ucy5cblxuQ29kZSBjb21waWxlZCBieSBjYWxscyB0byB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJleGVjKCkiIGFuZFxuImNvbXBpbGUoKSIgdGhhdCBvY2N1ciBpbiBhIG1vZHVsZSAiTSIgY29udGFpbmluZyBhIGZ1dHVyZSBzdGF0ZW1lbnRcbndpbGwsIGJ5IGRlZmF1bHQsIHVzZSB0aGUgbmV3IHN5bnRheCBvciBzZW1hbnRpY3MgYXNzb2NpYXRlZCB3aXRoIHRoZVxuZnV0dXJlIHN0YXRlbWVudC4gIFRoaXMgY2FuIGJlIGNvbnRyb2xsZWQgYnkgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG4iY29tcGlsZSgpIiAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuXG5cbkEgZnV0dXJlIHN0YXRlbWVudCB0eXBlZCBhdCBhbiBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBwcm9tcHQgd2lsbFxudGFrZSBlZmZlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnByZXRlciBzZXNzaW9uLiAgSWYgYW5cbmludGVycHJldGVyIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgKi1pKiBvcHRpb24sIGlzIHBhc3NlZCBhIHNjcmlwdCBuYW1lXG50byBleGVjdXRlLCBhbmQgdGhlIHNjcmlwdCBpbmNsdWRlcyBhIGZ1dHVyZSBzdGF0ZW1lbnQsIGl0IHdpbGwgYmUgaW5cbmVmZmVjdCBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBzdGFydGVkIGFmdGVyIHRoZSBzY3JpcHQgaXNcbmV4ZWN1dGVkLlxuXG5TZWUgYWxzbzogKipQRVAgMjM2KiogLSBCYWNrIHRvIHRoZSBfX2Z1dHVyZV9fXG5cbiAgICAgVGhlIG9yaWdpbmFsIHByb3Bvc2FsIGZvciB0aGUgX19mdXR1cmVfXyBtZWNoYW5pc20uXG4nLAotICdpbic6IHUnXG5NZW1iZXJzaGlwIHRlc3Qgb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIG9wZXJhdG9ycyAiaW4iIGFuZCAibm90IGluIiB0ZXN0IGZvciBtZW1iZXJzaGlwLiAgInggaW4gcyJcbmV2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiAqcyosIGFuZCBmYWxzZSBvdGhlcndpc2UuICAieFxubm90IGluIHMiIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mICJ4IGluIHMiLiAgQWxsIGJ1aWx0LWluIHNlcXVlbmNlc1xuYW5kIHNldCB0eXBlcyBzdXBwb3J0IHRoaXMgYXMgd2VsbCBhcyBkaWN0aW9uYXJ5LCBmb3Igd2hpY2ggImluIiB0ZXN0c1xud2hldGhlciB0aGUgZGljdGlvbmFyeSBoYXMgYSBnaXZlbiBrZXkuIEZvciBjb250YWluZXIgdHlwZXMgc3VjaCBhc1xubGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlXG5leHByZXNzaW9uICJ4IGluIHkiIGlzIGVxdWl2YWxlbnQgdG8gImFueSh4IGlzIGUgb3IgeCA9PSBlIGZvciBlIGluXG55KSIuXG5cbkZvciB0aGUgc3RyaW5nIGFuZCBieXRlcyB0eXBlcywgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogaXNcbmEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4gIEVtcHR5XG5zdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0byBiZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgc3RyaW5nLFxuc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlICJfX2NvbnRhaW5zX18oKSIgbWV0aG9kLCAieFxuaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAieS5fX2NvbnRhaW5zX18oeCkiIGlzIHRydWUuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIgYnV0IGRvXG5kZWZpbmUgIl9faXRlcl9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgInoiIHdpdGggInggPT0geiJcbmlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyICJ5Ii4gIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWRcbmR1cmluZyB0aGUgaXRlcmF0aW9uLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbi5cblxuTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzXG4iX19nZXRpdGVtX18oKSIsICJ4IGluIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tXG5uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgInggPT0geVtpXSIsIGFuZCBhbGwgbG93ZXJcbmludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXJcbmV4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uKS5cblxuVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG4iaW4iLlxuJywKLSAnaW50ZWdlcnMnOiB1J1xuSW50ZWdlciBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKlxuXG5JbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBpbnRlZ2VyICAgICAgICA6Oj0gZGVjaW1hbGludGVnZXIgfCBvY3RpbnRlZ2VyIHwgaGV4aW50ZWdlciB8IGJpbmludGVnZXJcbiAgIGRlY2ltYWxpbnRlZ2VyIDo6PSBub256ZXJvZGlnaXQgZGlnaXQqIHwgIjAiK1xuICAgbm9uemVyb2RpZ2l0ICAgOjo9ICIxIi4uLiI5IlxuICAgZGlnaXQgICAgICAgICAgOjo9ICIwIi4uLiI5IlxuICAgb2N0aW50ZWdlciAgICAgOjo9ICIwIiAoIm8iIHwgIk8iKSBvY3RkaWdpdCtcbiAgIGhleGludGVnZXIgICAgIDo6PSAiMCIgKCJ4IiB8ICJYIikgaGV4ZGlnaXQrXG4gICBiaW5pbnRlZ2VyICAgICA6Oj0gIjAiICgiYiIgfCAiQiIpIGJpbmRpZ2l0K1xuICAgb2N0ZGlnaXQgICAgICAgOjo9ICIwIi4uLiI3IlxuICAgaGV4ZGlnaXQgICAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiXG4gICBiaW5kaWdpdCAgICAgICA6Oj0gIjAiIHwgIjEiXG5cblRoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbGVuZ3RoIG9mIGludGVnZXIgbGl0ZXJhbHMgYXBhcnQgZnJvbSB3aGF0XG5jYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuXG5cbk5vdGUgdGhhdCBsZWFkaW5nIHplcm9zIGluIGEgbm9uLXplcm8gZGVjaW1hbCBudW1iZXIgYXJlIG5vdCBhbGxvd2VkLlxuVGhpcyBpcyBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBDLXN0eWxlIG9jdGFsIGxpdGVyYWxzLCB3aGljaCBQeXRob25cbnVzZWQgYmVmb3JlIHZlcnNpb24gMy4wLlxuXG5Tb21lIGV4YW1wbGVzIG9mIGludGVnZXIgbGl0ZXJhbHM6XG5cbiAgIDcgICAgIDIxNDc0ODM2NDcgICAgICAgICAgICAgICAgICAgICAgICAwbzE3NyAgICAwYjEwMDExMDExMVxuICAgMyAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgIDBvMzc3ICAgIDB4ZGVhZGJlZWZcbicsCi0gJ2xhbWJkYSc6IHUnXG5MYW1iZGFzXG4qKioqKioqXG5cbiAgIGxhbWJkYV9leHByICAgICAgICA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogZXhwcmVzc2lvblxuICAgbGFtYmRhX2V4cHJfbm9jb25kIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBleHByZXNzaW9uX25vY29uZFxuXG5MYW1iZGEgZXhwcmVzc2lvbnMgKHNvbWV0aW1lcyBjYWxsZWQgbGFtYmRhIGZvcm1zKSBhcmUgdXNlZCB0byBjcmVhdGVcbmFub255bW91cyBmdW5jdGlvbnMuIFRoZSBleHByZXNzaW9uICJsYW1iZGEgYXJndW1lbnRzOiBleHByZXNzaW9uIlxueWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LiAgVGhlIHVubmFtZWQgb2JqZWN0IGJlaGF2ZXMgbGlrZSBhIGZ1bmN0aW9uXG5vYmplY3QgZGVmaW5lZCB3aXRoXG5cbiAgIGRlZiA8bGFtYmRhPihhcmd1bWVudHMpOlxuICAgICAgIHJldHVybiBleHByZXNzaW9uXG5cblNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZSBzeW50YXggb2YgcGFyYW1ldGVyIGxpc3RzLlxuTm90ZSB0aGF0IGZ1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGV4cHJlc3Npb25zIGNhbm5vdCBjb250YWluXG5zdGF0ZW1lbnRzIG9yIGFubm90YXRpb25zLlxuJywKLSAnbGlzdHMnOiB1J1xuTGlzdCBkaXNwbGF5c1xuKioqKioqKioqKioqKlxuXG5BIGxpc3QgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBleHByZXNzaW9ucyBlbmNsb3NlZCBpblxuc3F1YXJlIGJyYWNrZXRzOlxuXG4gICBsaXN0X2Rpc3BsYXkgOjo9ICJbIiBbc3RhcnJlZF9saXN0IHwgY29tcHJlaGVuc2lvbl0gIl0iXG5cbkEgbGlzdCBkaXNwbGF5IHlpZWxkcyBhIG5ldyBsaXN0IG9iamVjdCwgdGhlIGNvbnRlbnRzIGJlaW5nIHNwZWNpZmllZFxuYnkgZWl0aGVyIGEgbGlzdCBvZiBleHByZXNzaW9ucyBvciBhIGNvbXByZWhlbnNpb24uICBXaGVuIGEgY29tbWEtXG5zZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBzdXBwbGllZCwgaXRzIGVsZW1lbnRzIGFyZSBldmFsdWF0ZWRcbmZyb20gbGVmdCB0byByaWdodCBhbmQgcGxhY2VkIGludG8gdGhlIGxpc3Qgb2JqZWN0IGluIHRoYXQgb3JkZXIuXG5XaGVuIGEgY29tcHJlaGVuc2lvbiBpcyBzdXBwbGllZCwgdGhlIGxpc3QgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGVcbmVsZW1lbnRzIHJlc3VsdGluZyBmcm9tIHRoZSBjb21wcmVoZW5zaW9uLlxuJywKLSAnbmFtaW5nJzogdSdcbk5hbWluZyBhbmQgYmluZGluZ1xuKioqKioqKioqKioqKioqKioqXG5cblxuQmluZGluZyBvZiBuYW1lc1xuPT09PT09PT09PT09PT09PVxuXG4qTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG4iaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsIG9yIGFmdGVyXG4iYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiBzdGF0ZW1lbnRcbm9mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG5pbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtXG5tYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG5cbkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jayxcbnVubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZVxubW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSBtb2R1bGVcbmNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZVxuYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cblxuRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0byB0aGUgKmJpbmRpbmcqXG5vZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gcnVsZXMuXG5cblxuUmVzb2x1dGlvbiBvZiBuYW1lc1xuPT09PT09PT09PT09PT09PT09PVxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS5cblxuV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0XG5lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9ja1xuaXMgY2FsbGVkIHRoZSBibG9ja1wncyAqZW52aXJvbm1lbnQqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuIElmXG50aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWxcbnZhcmlhYmxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBib3VuZCB0byBhIHZhbHVlIGF0IHRoZSBwb2ludCB3aGVyZSB0aGVcbm5hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLlxuXG5JZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbFxudXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlXG5jdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gYVxuYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5JZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVcbnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiB0aGVcbnRvcC1sZXZlbCBuYW1lc3BhY2UuICBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnlcbnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlXG5vZiB0aGUgbW9kdWxlICJidWlsdGlucyIuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZCBmaXJzdC4gIElmXG50aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuICBUaGVcbiJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG5cblRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvblxuaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSB2YXJpYWJsZVxuY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgZ2xvYmFsLlxuXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG9cbnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cbiJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGF0IGNvbXBpbGUgdGltZSBpZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdFxuZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cblxuVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFcbm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZFxuIl9fbWFpbl9fIi5cblxuQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgYXJlXG5zcGVjaWFsIGluIHRoZSBjb250ZXh0IG9mIG5hbWUgcmVzb2x1dGlvbi4gQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuXG5leGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZSBuYW1lcy4gVGhlc2UgcmVmZXJlbmNlc1xuZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiB0aGF0XG51bmJvdW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBUaGVcbm5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSBvZlxudGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG9cbnRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZSBjb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tXG50aGlzIGluY2x1ZGVzIGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2UgdGhleSBhcmVcbmltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZ1xud2lsbCBmYWlsOlxuXG4gICBjbGFzcyBBOlxuICAgICAgIGEgPSA0MlxuICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcblxuXG5CdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb25cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSAiX19idWlsdGluc19fIiBpbiBpdHMgZ2xvYmFsXG5uYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciBjYXNlXG50aGUgbW9kdWxlXCdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZSAiX19tYWluX18iXG5tb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIHRoZSBidWlsdC1pbiBtb2R1bGUgImJ1aWx0aW5zIjsgd2hlbiBpbiBhbnlcbm90aGVyIG1vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZVxuImJ1aWx0aW5zIiBtb2R1bGUgaXRzZWxmLiAgIl9fYnVpbHRpbnNfXyIgY2FuIGJlIHNldCB0byBhIHVzZXItY3JlYXRlZFxuZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuIl9fYnVpbHRpbnNfXyI7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCAiaW1wb3J0IlxudGhlICJidWlsdGlucyIgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5OYW1lIHJlc29sdXRpb24gb2YgZnJlZSB2YXJpYWJsZXMgb2NjdXJzIGF0IHJ1bnRpbWUsIG5vdCBhdCBjb21waWxlXG50aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG5cbiAgIGkgPSAxMFxuICAgZGVmIGYoKTpcbiAgICAgICBwcmludChpKVxuICAgaSA9IDQyXG4gICBmKClcblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsXG5lbnZpcm9ubWVudCBmb3IgcmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbFxuYW5kIGdsb2JhbCBuYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkXG5pbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICBbMV1cblRoZSAiZXhlYygpIiBhbmQgImV2YWwoKSIgZnVuY3Rpb25zIGhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5vdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuICBJZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXNcbnNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCi0gJ25vbmxvY2FsJzogdSdcblRoZSAibm9ubG9jYWwiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIG5vbmxvY2FsX3N0bXQgOjo9ICJub25sb2NhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuXG5UaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgdG8gcmVmZXIgdG9cbnByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBleGNsdWRpbmdcbmdsb2JhbHMuIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGJpbmRpbmcgaXNcbnRvIHNlYXJjaCB0aGUgbG9jYWwgbmFtZXNwYWNlIGZpcnN0LiAgVGhlIHN0YXRlbWVudCBhbGxvd3NcbmVuY2Fwc3VsYXRlZCBjb2RlIHRvIHJlYmluZCB2YXJpYWJsZXMgb3V0c2lkZSBvZiB0aGUgbG9jYWwgc2NvcGVcbmJlc2lkZXMgdGhlIGdsb2JhbCAobW9kdWxlKSBzY29wZS5cblxuTmFtZXMgbGlzdGVkIGluIGEgIm5vbmxvY2FsIiBzdGF0ZW1lbnQsIHVubGlrZSB0aG9zZSBsaXN0ZWQgaW4gYVxuImdsb2JhbCIgc3RhdGVtZW50LCBtdXN0IHJlZmVyIHRvIHByZS1leGlzdGluZyBiaW5kaW5ncyBpbiBhblxuZW5jbG9zaW5nIHNjb3BlICh0aGUgc2NvcGUgaW4gd2hpY2ggYSBuZXcgYmluZGluZyBzaG91bGQgYmUgY3JlYXRlZFxuY2Fubm90IGJlIGRldGVybWluZWQgdW5hbWJpZ3VvdXNseSkuXG5cbk5hbWVzIGxpc3RlZCBpbiBhICJub25sb2NhbCIgc3RhdGVtZW50IG11c3Qgbm90IGNvbGxpZGUgd2l0aCBwcmUtXG5leGlzdGluZyBiaW5kaW5ncyBpbiB0aGUgbG9jYWwgc2NvcGUuXG5cblNlZSBhbHNvOiAqKlBFUCAzMTA0KiogLSBBY2Nlc3MgdG8gTmFtZXMgaW4gT3V0ZXIgU2NvcGVzXG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAibm9ubG9jYWwiIHN0YXRlbWVudC5cbicsCi0gJ251bWJlcnMnOiB1J1xuTnVtZXJpYyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50XG5udW1iZXJzLCBhbmQgaW1hZ2luYXJ5IG51bWJlcnMuICBUaGVyZSBhcmUgbm8gY29tcGxleCBsaXRlcmFsc1xuKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWwgbnVtYmVyIGFuZCBhblxuaW1hZ2luYXJ5IG51bWJlcikuXG5cbk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSAiLTEiXG5pcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciBcJyItIlwnIGFuZCB0aGVcbmxpdGVyYWwgIjEiLlxuJywKLSAnbnVtZXJpYy10eXBlcyc6IHUnXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsIHRvXG4gICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYVxuICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyBjYWxsZWQuXG4gICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byB1c2luZ1xuICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0b1xuICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdFxuICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgYnVpbHQtaW5cbiAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuXG4gICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGVcbiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuXG5vYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsXG4gICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAoc3dhcHBlZClcbiAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXNcbiAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZlxuICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCAtXG4gICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gIl9fcnN1Yl9fKCkiXG4gICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgcmV0dXJuc1xuICAgKk5vdEltcGxlbWVudGVkKi5cblxuICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAiX19ycG93X18oKSIgKHRoZVxuICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG5cbiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2RcbiAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3Nlc1xuICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnNcJyBvcGVyYXRpb25zLlxuXG5vYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljXG4gICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICIqKj0iLFxuICAgIjw8PSIsICI+Pj0iLCAiJj0iLCAiXj0iLCAifD0iKS4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGF0dGVtcHQgdG9cbiAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gdGhlIHJlc3VsdFxuICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWNcbiAgIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlXG4gICBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NcbiAgIHdpdGggYW4gIl9faWFkZF9fKCkiIG1ldGhvZCwgInggKz0geSIgaXMgZXF1aXZhbGVudCB0byAieCA9XG4gICB4Ll9faWFkZF9fKHkpIiAuIE90aGVyd2lzZSwgInguX19hZGRfXyh5KSIgYW5kICJ5Ll9fcmFkZF9fKHgpIiBhcmVcbiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gY2VydGFpblxuICAgc2l0dWF0aW9ucywgYXVnbWVudGVkIGFzc2lnbm1lbnQgY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGVycm9yc1xuICAgKHNlZSAqV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbXCdpdGVtXCddIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZVxuICAgYWRkaXRpb24gd29ya3M/KiksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiB0aGUgZGF0YVxuICAgbW9kZWwuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAiKyIsXG4gICAiYWJzKCkiIGFuZCAifiIpLlxuXG5vYmplY3QuX19jb21wbGV4X18oc2VsZilcbm9iamVjdC5fX2ludF9fKHNlbGYpXG5vYmplY3QuX19mbG9hdF9fKHNlbGYpXG5vYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAiaW50KCkiLFxuICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGFwcHJvcHJpYXRlXG4gICB0eXBlLlxuXG5vYmplY3QuX19pbmRleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgUHl0aG9uIG5lZWRzXG4gICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgb2JqZWN0IChzdWNoXG4gICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgIm9jdCgpIlxuICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlIG51bWVyaWNcbiAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuXG4gICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCB3aGVuXG4gICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSBkZWZpbmVkLCBhbmRcbiAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuJywKLSAnb2JqZWN0cyc6IHUnXG5PYmplY3RzLCB2YWx1ZXMgYW5kIHR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cbipPYmplY3RzKiBhcmUgUHl0aG9uXCdzIGFic3RyYWN0aW9uIGZvciBkYXRhLiAgQWxsIGRhdGEgaW4gYSBQeXRob25cbnByb2dyYW0gaXMgcmVwcmVzZW50ZWQgYnkgb2JqZWN0cyBvciBieSByZWxhdGlvbnMgYmV0d2VlbiBvYmplY3RzLiAoSW5cbmEgc2Vuc2UsIGFuZCBpbiBjb25mb3JtYW5jZSB0byBWb24gTmV1bWFublwncyBtb2RlbCBvZiBhICJzdG9yZWRcbnByb2dyYW0gY29tcHV0ZXIsIiBjb2RlIGlzIGFsc28gcmVwcmVzZW50ZWQgYnkgb2JqZWN0cy4pXG5cbkV2ZXJ5IG9iamVjdCBoYXMgYW4gaWRlbnRpdHksIGEgdHlwZSBhbmQgYSB2YWx1ZS4gIEFuIG9iamVjdFwnc1xuKmlkZW50aXR5KiBuZXZlciBjaGFuZ2VzIG9uY2UgaXQgaGFzIGJlZW4gY3JlYXRlZDsgeW91IG1heSB0aGluayBvZiBpdFxuYXMgdGhlIG9iamVjdFwncyBhZGRyZXNzIGluIG1lbW9yeS4gIFRoZSBcJyJpcyJcJyBvcGVyYXRvciBjb21wYXJlcyB0aGVcbmlkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUgImlkKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlclxucmVwcmVzZW50aW5nIGl0cyBpZGVudGl0eS5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBGb3IgQ1B5dGhvbiwgImlkKHgpIiBpcyB0aGUgbWVtb3J5XG5hZGRyZXNzIHdoZXJlICJ4IiBpcyBzdG9yZWQuXG5cbkFuIG9iamVjdFwncyB0eXBlIGRldGVybWluZXMgdGhlIG9wZXJhdGlvbnMgdGhhdCB0aGUgb2JqZWN0IHN1cHBvcnRzXG4oZS5nLiwgImRvZXMgaXQgaGF2ZSBhIGxlbmd0aD8iKSBhbmQgYWxzbyBkZWZpbmVzIHRoZSBwb3NzaWJsZSB2YWx1ZXNcbmZvciBvYmplY3RzIG9mIHRoYXQgdHlwZS4gIFRoZSAidHlwZSgpIiBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdFwnc1xudHlwZSAod2hpY2ggaXMgYW4gb2JqZWN0IGl0c2VsZikuICBMaWtlIGl0cyBpZGVudGl0eSwgYW4gb2JqZWN0XCdzXG4qdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXVxuXG5UaGUgKnZhbHVlKiBvZiBzb21lIG9iamVjdHMgY2FuIGNoYW5nZS4gIE9iamVjdHMgd2hvc2UgdmFsdWUgY2FuXG5jaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlIGlzIHVuY2hhbmdlYWJsZVxub25jZSB0aGV5IGFyZSBjcmVhdGVkIGFyZSBjYWxsZWQgKmltbXV0YWJsZSouIChUaGUgdmFsdWUgb2YgYW5cbmltbXV0YWJsZSBjb250YWluZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlXG5vYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXJcJ3MgdmFsdWUgaXMgY2hhbmdlZDsgaG93ZXZlciB0aGVcbmNvbnRhaW5lciBpcyBzdGlsbCBjb25zaWRlcmVkIGltbXV0YWJsZSwgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiBvZlxub2JqZWN0cyBpdCBjb250YWlucyBjYW5ub3QgYmUgY2hhbmdlZC4gIFNvLCBpbW11dGFiaWxpdHkgaXMgbm90XG5zdHJpY3RseSB0aGUgc2FtZSBhcyBoYXZpbmcgYW4gdW5jaGFuZ2VhYmxlIHZhbHVlLCBpdCBpcyBtb3JlIHN1YnRsZS4pXG5BbiBvYmplY3RcJ3MgbXV0YWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IGl0cyB0eXBlOyBmb3IgaW5zdGFuY2UsXG5udW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzIGFuZFxubGlzdHMgYXJlIG11dGFibGUuXG5cbk9iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgYmVjb21lXG51bnJlYWNoYWJsZSB0aGV5IG1heSBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gIEFuIGltcGxlbWVudGF0aW9uIGlzXG5hbGxvd2VkIHRvIHBvc3Rwb25lIGdhcmJhZ2UgY29sbGVjdGlvbiBvciBvbWl0IGl0IGFsdG9nZXRoZXIgLS0tIGl0IGlzXG5hIG1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbmltcGxlbWVudGVkLCBhcyBsb25nIGFzIG5vIG9iamVjdHMgYXJlIGNvbGxlY3RlZCB0aGF0IGFyZSBzdGlsbFxucmVhY2hhYmxlLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIENQeXRob24gY3VycmVudGx5IHVzZXMgYSByZWZlcmVuY2UtXG5jb3VudGluZyBzY2hlbWUgd2l0aCAob3B0aW9uYWwpIGRlbGF5ZWQgZGV0ZWN0aW9uIG9mIGN5Y2xpY2FsbHkgbGlua2VkXG5nYXJiYWdlLCB3aGljaCBjb2xsZWN0cyBtb3N0IG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGJlY29tZVxudW5yZWFjaGFibGUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb2xsZWN0IGdhcmJhZ2UgY29udGFpbmluZ1xuY2lyY3VsYXIgcmVmZXJlbmNlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgImdjIiBtb2R1bGUgZm9yXG5pbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gT3RoZXJcbmltcGxlbWVudGF0aW9ucyBhY3QgZGlmZmVyZW50bHkgYW5kIENQeXRob24gbWF5IGNoYW5nZS4gRG8gbm90IGRlcGVuZFxub24gaW1tZWRpYXRlIGZpbmFsaXphdGlvbiBvZiBvYmplY3RzIHdoZW4gdGhleSBiZWNvbWUgdW5yZWFjaGFibGUgKHNvXG55b3Ugc2hvdWxkIGFsd2F5cyBjbG9zZSBmaWxlcyBleHBsaWNpdGx5KS5cblxuTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uXCdzIHRyYWNpbmcgb3IgZGVidWdnaW5nXG5mYWNpbGl0aWVzIG1heSBrZWVwIG9iamVjdHMgYWxpdmUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBjb2xsZWN0YWJsZS5cbkFsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgXCcidHJ5Ii4uLiJleGNlcHQiXCdcbnN0YXRlbWVudCBtYXkga2VlcCBvYmplY3RzIGFsaXZlLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvICJleHRlcm5hbCIgcmVzb3VyY2VzIHN1Y2ggYXMgb3BlblxuZmlsZXMgb3Igd2luZG93cy4gIEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGVzZSByZXNvdXJjZXMgYXJlIGZyZWVkXG53aGVuIHRoZSBvYmplY3QgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQsIGJ1dCBzaW5jZSBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbm5vdCBndWFyYW50ZWVkIHRvIGhhcHBlbiwgc3VjaCBvYmplY3RzIGFsc28gcHJvdmlkZSBhbiBleHBsaWNpdCB3YXkgdG9cbnJlbGVhc2UgdGhlIGV4dGVybmFsIHJlc291cmNlLCB1c3VhbGx5IGEgImNsb3NlKCkiIG1ldGhvZC4gUHJvZ3JhbXNcbmFyZSBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBleHBsaWNpdGx5IGNsb3NlIHN1Y2ggb2JqZWN0cy4gIFRoZVxuXCcidHJ5Ii4uLiJmaW5hbGx5IlwnIHN0YXRlbWVudCBhbmQgdGhlIFwnIndpdGgiXCcgc3RhdGVtZW50IHByb3ZpZGVcbmNvbnZlbmllbnQgd2F5cyB0byBkbyB0aGlzLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHM7IHRoZXNlIGFyZSBjYWxsZWRcbipjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmRcbmRpY3Rpb25hcmllcy4gIFRoZSByZWZlcmVuY2VzIGFyZSBwYXJ0IG9mIGEgY29udGFpbmVyXCdzIHZhbHVlLiAgSW5cbm1vc3QgY2FzZXMsIHdoZW4gd2UgdGFsayBhYm91dCB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIsIHdlIGltcGx5IHRoZVxudmFsdWVzLCBub3QgdGhlIGlkZW50aXRpZXMgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzOyBob3dldmVyLCB3aGVuIHdlXG50YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mIHRoZVxuaW1tZWRpYXRlbHkgY29udGFpbmVkIG9iamVjdHMgYXJlIGltcGxpZWQuICBTbywgaWYgYW4gaW1tdXRhYmxlXG5jb250YWluZXIgKGxpa2UgYSB0dXBsZSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlIG9iamVjdCwgaXRzXG52YWx1ZSBjaGFuZ2VzIGlmIHRoYXQgbXV0YWJsZSBvYmplY3QgaXMgY2hhbmdlZC5cblxuVHlwZXMgYWZmZWN0IGFsbW9zdCBhbGwgYXNwZWN0cyBvZiBvYmplY3QgYmVoYXZpb3IuICBFdmVuIHRoZVxuaW1wb3J0YW5jZSBvZiBvYmplY3QgaWRlbnRpdHkgaXMgYWZmZWN0ZWQgaW4gc29tZSBzZW5zZTogZm9yIGltbXV0YWJsZVxudHlwZXMsIG9wZXJhdGlvbnMgdGhhdCBjb21wdXRlIG5ldyB2YWx1ZXMgbWF5IGFjdHVhbGx5IHJldHVybiBhXG5yZWZlcmVuY2UgdG8gYW55IGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIHZhbHVlLCB3aGlsZVxuZm9yIG11dGFibGUgb2JqZWN0cyB0aGlzIGlzIG5vdCBhbGxvd2VkLiAgRS5nLiwgYWZ0ZXIgImEgPSAxOyBiID0gMSIsXG4iYSIgYW5kICJiIiBtYXkgb3IgbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3Qgd2l0aCB0aGUgdmFsdWVcbm9uZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGFmdGVyICJjID0gW107IGQgPSBbXSIsICJjIlxuYW5kICJkIiBhcmUgZ3VhcmFudGVlZCB0byByZWZlciB0byB0d28gZGlmZmVyZW50LCB1bmlxdWUsIG5ld2x5XG5jcmVhdGVkIGVtcHR5IGxpc3RzLiAoTm90ZSB0aGF0ICJjID0gZCA9IFtdIiBhc3NpZ25zIHRoZSBzYW1lIG9iamVjdFxudG8gYm90aCAiYyIgYW5kICJkIi4pXG4nLAotICdvcGVyYXRvci1zdW1tYXJ5JzogdSdcbk9wZXJhdG9yIHByZWNlZGVuY2VcbioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIGluIFB5dGhvbiwgZnJvbVxubG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0IGJpbmRpbmcpIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZSAobW9zdFxuYmluZGluZykuICBPcGVyYXRvcnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZS4gIFVubGVzc1xudGhlIHN5bnRheCBpcyBleHBsaWNpdGx5IGdpdmVuLCBvcGVyYXRvcnMgYXJlIGJpbmFyeS4gIE9wZXJhdG9ycyBpblxudGhlIHNhbWUgYm94IGdyb3VwIGxlZnQgdG8gcmlnaHQgKGV4Y2VwdCBmb3IgZXhwb25lbnRpYXRpb24sIHdoaWNoXG5ncm91cHMgZnJvbSByaWdodCB0byBsZWZ0KS5cblxuTm90ZSB0aGF0IGNvbXBhcmlzb25zLCBtZW1iZXJzaGlwIHRlc3RzLCBhbmQgaWRlbnRpdHkgdGVzdHMsIGFsbCBoYXZlXG50aGUgc2FtZSBwcmVjZWRlbmNlIGFuZCBoYXZlIGEgbGVmdC10by1yaWdodCBjaGFpbmluZyBmZWF0dXJlIGFzXG5kZXNjcmliZWQgaW4gdGhlICpDb21wYXJpc29ucyogc2VjdGlvbi5cblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xufCAibGFtYmRhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExhbWJkYSBleHByZXNzaW9uICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiaWYiIC0tICJlbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbmRpdGlvbmFsIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAib3IiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiYW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAibm90IiAieCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJvb2xlYW4gTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiaW4iLCAibm90IGluIiwgImlzIiwgImlzIG5vdCIsICI8IiwgIjw9IiwgIj4iLCB8IENvbXBhcmlzb25zLCBpbmNsdWRpbmcgbWVtYmVyc2hpcCAgICAgfFxufCAiPj0iLCAiIT0iLCAiPT0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cyAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAifCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiXiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiJiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJpdHdpc2UgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiPDwiLCAiPj4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNoaWZ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKyIsICItIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIgICAgICAgICAgICAgICAgICAgICAgICB8IE11bHRpcGxpY2F0aW9uLCBtYXRyaXggbXVsdGlwbGljYXRpb24gfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpdmlzaW9uLCByZW1haW5kZXIgWzVdICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiK3giLCAiLXgiLCAifngiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBvc2l0aXZlLCBuZWdhdGl2ZSwgYml0d2lzZSBOT1QgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKioiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEV4cG9uZW50aWF0aW9uIFs2XSAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiYXdhaXQiICJ4IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEF3YWl0IGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAieFtpbmRleF0iLCAieFtpbmRleDppbmRleF0iLCAgICAgICAgICAgICAgICAgICB8IFN1YnNjcmlwdGlvbiwgc2xpY2luZywgY2FsbCwgICAgICAgICAgfFxufCAieChhcmd1bWVudHMuLi4pIiwgInguYXR0cmlidXRlIiAgICAgICAgICAgICAgICB8IGF0dHJpYnV0ZSByZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiKGV4cHJlc3Npb25zLi4uKSIsICJbZXhwcmVzc2lvbnMuLi5dIiwgIntrZXk6ICB8IEJpbmRpbmcgb3IgdHVwbGUgZGlzcGxheSwgbGlzdCAgICAgICAgfFxufCB2YWx1ZS4uLn0iLCAie2V4cHJlc3Npb25zLi4ufSIgICAgICAgICAgICAgICAgICB8IGRpc3BsYXksIGRpY3Rpb25hcnkgZGlzcGxheSwgc2V0ICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGRpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFdoaWxlICJhYnMoeCV5KSA8IGFicyh5KSIgaXMgdHJ1ZSBtYXRoZW1hdGljYWxseSwgZm9yIGZsb2F0c1xuICAgIGl0IG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kXG4gICAgYXNzdW1pbmcgYSBwbGF0Zm9ybSBvbiB3aGljaCBhIFB5dGhvbiBmbG9hdCBpcyBhbiBJRUVFIDc1NCBkb3VibGUtXG4gICAgcHJlY2lzaW9uIG51bWJlciwgaW4gb3JkZXIgdGhhdCAiLTFlLTEwMCAlIDFlMTAwIiBoYXZlIHRoZSBzYW1lXG4gICAgc2lnbiBhcyAiMWUxMDAiLCB0aGUgY29tcHV0ZWQgcmVzdWx0IGlzICItMWUtMTAwICsgMWUxMDAiLCB3aGljaFxuICAgIGlzIG51bWVyaWNhbGx5IGV4YWN0bHkgZXF1YWwgdG8gIjFlMTAwIi4gIFRoZSBmdW5jdGlvblxuICAgICJtYXRoLmZtb2QoKSIgcmV0dXJucyBhIHJlc3VsdCB3aG9zZSBzaWduIG1hdGNoZXMgdGhlIHNpZ24gb2YgdGhlXG4gICAgZmlyc3QgYXJndW1lbnQgaW5zdGVhZCwgYW5kIHNvIHJldHVybnMgIi0xZS0xMDAiIGluIHRoaXMgY2FzZS5cbiAgICBXaGljaCBhcHByb2FjaCBpcyBtb3JlIGFwcHJvcHJpYXRlIGRlcGVuZHMgb24gdGhlIGFwcGxpY2F0aW9uLlxuXG5bMl0gSWYgeCBpcyB2ZXJ5IGNsb3NlIHRvIGFuIGV4YWN0IGludGVnZXIgbXVsdGlwbGUgb2YgeSwgaXRcJ3NcbiAgICBwb3NzaWJsZSBmb3IgIngvL3kiIHRvIGJlIG9uZSBsYXJnZXIgdGhhbiAiKHgteCV5KS8veSIgZHVlIHRvXG4gICAgcm91bmRpbmcuICBJbiBzdWNoIGNhc2VzLCBQeXRob24gcmV0dXJucyB0aGUgbGF0dGVyIHJlc3VsdCwgaW5cbiAgICBvcmRlciB0byBwcmVzZXJ2ZSB0aGF0ICJkaXZtb2QoeCx5KVswXSAqIHkgKyB4ICUgeSIgYmUgdmVyeSBjbG9zZVxuICAgIHRvICJ4Ii5cblxuWzNdIFRoZSBVbmljb2RlIHN0YW5kYXJkIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiAqY29kZSBwb2ludHMqIChlLmcuXG4gICAgVSswMDQxKSBhbmQgKmFic3RyYWN0IGNoYXJhY3RlcnMqIChlLmcuICJMQVRJTiBDQVBJVEFMIExFVFRFUiBBIikuXG4gICAgV2hpbGUgbW9zdCBhYnN0cmFjdCBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgYXJlIG9ubHkgcmVwcmVzZW50ZWRcbiAgICB1c2luZyBvbmUgY29kZSBwb2ludCwgdGhlcmUgaXMgYSBudW1iZXIgb2YgYWJzdHJhY3QgY2hhcmFjdGVyc1xuICAgIHRoYXQgY2FuIGluIGFkZGl0aW9uIGJlIHJlcHJlc2VudGVkIHVzaW5nIGEgc2VxdWVuY2Ugb2YgbW9yZSB0aGFuXG4gICAgb25lIGNvZGUgcG9pbnQuICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0IGNoYXJhY3RlciAiTEFUSU5cbiAgICBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSIgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlXG4gICAgKnByZWNvbXBvc2VkIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwQzcsIG9yIGFzIGEgc2VxdWVuY2VcbiAgICBvZiBhICpiYXNlIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwNDMgKExBVElOIENBUElUQUxcbiAgICBMRVRURVIgQyksIGZvbGxvd2VkIGJ5IGEgKmNvbWJpbmluZyBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb25cbiAgICBVKzAzMjcgKENPTUJJTklORyBDRURJTExBKS5cblxuICAgIFRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBvbiBzdHJpbmdzIGNvbXBhcmUgYXQgdGhlIGxldmVsIG9mXG4gICAgVW5pY29kZSBjb2RlIHBvaW50cy4gVGhpcyBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgdG8gaHVtYW5zLiAgRm9yXG4gICAgZXhhbXBsZSwgIiJcXHUwMEM3IiA9PSAiXFx1MDA0M1xcdTAzMjciIiBpcyAiRmFsc2UiLCBldmVuIHRob3VnaCBib3RoXG4gICAgc3RyaW5ncyByZXByZXNlbnQgdGhlIHNhbWUgYWJzdHJhY3QgY2hhcmFjdGVyICJMQVRJTiBDQVBJVEFMXG4gICAgTEVUVEVSIEMgV0lUSCBDRURJTExBIi5cblxuICAgIFRvIGNvbXBhcmUgc3RyaW5ncyBhdCB0aGUgbGV2ZWwgb2YgYWJzdHJhY3QgY2hhcmFjdGVycyAodGhhdCBpcyxcbiAgICBpbiBhIHdheSBpbnR1aXRpdmUgdG8gaHVtYW5zKSwgdXNlICJ1bmljb2RlZGF0YS5ub3JtYWxpemUoKSIuXG5cbls0XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kIHRoZVxuICAgIGR5bmFtaWMgbmF0dXJlIG9mIGRlc2NyaXB0b3JzLCB5b3UgbWF5IG5vdGljZSBzZWVtaW5nbHkgdW51c3VhbFxuICAgIGJlaGF2aW91ciBpbiBjZXJ0YWluIHVzZXMgb2YgdGhlICJpcyIgb3BlcmF0b3IsIGxpa2UgdGhvc2VcbiAgICBpbnZvbHZpbmcgY29tcGFyaXNvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZXRob2RzLCBvciBjb25zdGFudHMuXG4gICAgQ2hlY2sgdGhlaXIgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLlxuXG5bNV0gVGhlICIlIiBvcGVyYXRvciBpcyBhbHNvIHVzZWQgZm9yIHN0cmluZyBmb3JtYXR0aW5nOyB0aGUgc2FtZVxuICAgIHByZWNlZGVuY2UgYXBwbGllcy5cblxuWzZdIFRoZSBwb3dlciBvcGVyYXRvciAiKioiIGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIGFuIGFyaXRobWV0aWNcbiAgICBvciBiaXR3aXNlIHVuYXJ5IG9wZXJhdG9yIG9uIGl0cyByaWdodCwgdGhhdCBpcywgIjIqKi0xIiBpcyAiMC41Ii5cbicsCi0gJ3Bhc3MnOiB1J1xuVGhlICJwYXNzIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHBhc3Nfc3RtdCA6Oj0gInBhc3MiXG5cbiJwYXNzIiBpcyBhIG51bGwgb3BlcmF0aW9uIC0tLSB3aGVuIGl0IGlzIGV4ZWN1dGVkLCBub3RoaW5nIGhhcHBlbnMuXG5JdCBpcyB1c2VmdWwgYXMgYSBwbGFjZWhvbGRlciB3aGVuIGEgc3RhdGVtZW50IGlzIHJlcXVpcmVkXG5zeW50YWN0aWNhbGx5LCBidXQgbm8gY29kZSBuZWVkcyB0byBiZSBleGVjdXRlZCwgZm9yIGV4YW1wbGU6XG5cbiAgIGRlZiBmKGFyZyk6IHBhc3MgICAgIyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nICh5ZXQpXG5cbiAgIGNsYXNzIEM6IHBhc3MgICAgICAgIyBhIGNsYXNzIHdpdGggbm8gbWV0aG9kcyAoeWV0KVxuJywKLSAncG93ZXInOiB1J1xuVGhlIHBvd2VyIG9wZXJhdG9yXG4qKioqKioqKioqKioqKioqKipcblxuVGhlIHBvd2VyIG9wZXJhdG9yIGJpbmRzIG1vcmUgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHNcbmxlZnQ7IGl0IGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHMgcmlnaHQuICBUaGVcbnN5bnRheCBpczpcblxuICAgcG93ZXIgOjo9ICggYXdhaXRfZXhwciB8IHByaW1hcnkgKSBbIioqIiB1X2V4cHJdXG5cblRodXMsIGluIGFuIHVucGFyZW50aGVzaXplZCBzZXF1ZW5jZSBvZiBwb3dlciBhbmQgdW5hcnkgb3BlcmF0b3JzLCB0aGVcbm9wZXJhdG9ycyBhcmUgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCAodGhpcyBkb2VzIG5vdCBjb25zdHJhaW5cbnRoZSBldmFsdWF0aW9uIG9yZGVyIGZvciB0aGUgb3BlcmFuZHMpOiAiLTEqKjIiIHJlc3VsdHMgaW4gIi0xIi5cblxuVGhlIHBvd2VyIG9wZXJhdG9yIGhhcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIGJ1aWx0LWluICJwb3coKSJcbmZ1bmN0aW9uLCB3aGVuIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHM6IGl0IHlpZWxkcyBpdHMgbGVmdCBhcmd1bWVudFxucmFpc2VkIHRvIHRoZSBwb3dlciBvZiBpdHMgcmlnaHQgYXJndW1lbnQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlXG5maXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwgYW5kIHRoZSByZXN1bHQgaXMgb2YgdGhhdCB0eXBlLlxuXG5Gb3IgaW50IG9wZXJhbmRzLCB0aGUgcmVzdWx0IGhhcyB0aGUgc2FtZSB0eXBlIGFzIHRoZSBvcGVyYW5kcyB1bmxlc3NcbnRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbmVnYXRpdmU7IGluIHRoYXQgY2FzZSwgYWxsIGFyZ3VtZW50cyBhcmVcbmNvbnZlcnRlZCB0byBmbG9hdCBhbmQgYSBmbG9hdCByZXN1bHQgaXMgZGVsaXZlcmVkLiBGb3IgZXhhbXBsZSxcbiIxMCoqMiIgcmV0dXJucyAiMTAwIiwgYnV0ICIxMCoqLTIiIHJldHVybnMgIjAuMDEiLlxuXG5SYWlzaW5nICIwLjAiIHRvIGEgbmVnYXRpdmUgcG93ZXIgcmVzdWx0cyBpbiBhICJaZXJvRGl2aXNpb25FcnJvciIuXG5SYWlzaW5nIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGEgZnJhY3Rpb25hbCBwb3dlciByZXN1bHRzIGluIGEgImNvbXBsZXgiXG5udW1iZXIuIChJbiBlYXJsaWVyIHZlcnNpb25zIGl0IHJhaXNlZCBhICJWYWx1ZUVycm9yIi4pXG4nLAotICdyYWlzZSc6IHUnXG5UaGUgInJhaXNlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG4gICByYWlzZV9zdG10IDo6PSAicmFpc2UiIFtleHByZXNzaW9uIFsiZnJvbSIgZXhwcmVzc2lvbl1dXG5cbklmIG5vIGV4cHJlc3Npb25zIGFyZSBwcmVzZW50LCAicmFpc2UiIHJlLXJhaXNlcyB0aGUgbGFzdCBleGNlcHRpb25cbnRoYXQgd2FzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIElmIG5vIGV4Y2VwdGlvbiBpcyBhY3RpdmUgaW5cbnRoZSBjdXJyZW50IHNjb3BlLCBhICJSdW50aW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW5kaWNhdGluZ1xudGhhdCB0aGlzIGlzIGFuIGVycm9yLlxuXG5PdGhlcndpc2UsICJyYWlzZSIgZXZhbHVhdGVzIHRoZSBmaXJzdCBleHByZXNzaW9uIGFzIHRoZSBleGNlcHRpb25cbm9iamVjdC4gIEl0IG11c3QgYmUgZWl0aGVyIGEgc3ViY2xhc3Mgb3IgYW4gaW5zdGFuY2Ugb2ZcbiJCYXNlRXhjZXB0aW9uIi4gSWYgaXQgaXMgYSBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSB3aWxsIGJlXG5vYnRhaW5lZCB3aGVuIG5lZWRlZCBieSBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyB3aXRoIG5vIGFyZ3VtZW50cy5cblxuVGhlICp0eXBlKiBvZiB0aGUgZXhjZXB0aW9uIGlzIHRoZSBleGNlcHRpb24gaW5zdGFuY2VcJ3MgY2xhc3MsIHRoZVxuKnZhbHVlKiBpcyB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuXG5BIHRyYWNlYmFjayBvYmplY3QgaXMgbm9ybWFsbHkgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gZXhjZXB0aW9uXG5pcyByYWlzZWQgYW5kIGF0dGFjaGVkIHRvIGl0IGFzIHRoZSAiX190cmFjZWJhY2tfXyIgYXR0cmlidXRlLCB3aGljaFxuaXMgd3JpdGFibGUuIFlvdSBjYW4gY3JlYXRlIGFuIGV4Y2VwdGlvbiBhbmQgc2V0IHlvdXIgb3duIHRyYWNlYmFjayBpblxub25lIHN0ZXAgdXNpbmcgdGhlICJ3aXRoX3RyYWNlYmFjaygpIiBleGNlcHRpb24gbWV0aG9kICh3aGljaCByZXR1cm5zXG50aGUgc2FtZSBleGNlcHRpb24gaW5zdGFuY2UsIHdpdGggaXRzIHRyYWNlYmFjayBzZXQgdG8gaXRzIGFyZ3VtZW50KSxcbmxpa2Ugc286XG5cbiAgIHJhaXNlIEV4Y2VwdGlvbigiZm9vIG9jY3VycmVkIikud2l0aF90cmFjZWJhY2sodHJhY2ViYWNrb2JqKVxuXG5UaGUgImZyb20iIGNsYXVzZSBpcyB1c2VkIGZvciBleGNlcHRpb24gY2hhaW5pbmc6IGlmIGdpdmVuLCB0aGUgc2Vjb25kXG4qZXhwcmVzc2lvbiogbXVzdCBiZSBhbm90aGVyIGV4Y2VwdGlvbiBjbGFzcyBvciBpbnN0YW5jZSwgd2hpY2ggd2lsbFxudGhlbiBiZSBhdHRhY2hlZCB0byB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBhcyB0aGUgIl9fY2F1c2VfXyIgYXR0cmlidXRlXG4od2hpY2ggaXMgd3JpdGFibGUpLiAgSWYgdGhlIHJhaXNlZCBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQsIGJvdGhcbmV4Y2VwdGlvbnMgd2lsbCBiZSBwcmludGVkOlxuXG4gICA+Pj4gdHJ5OlxuICAgLi4uICAgICBwcmludCgxIC8gMClcbiAgIC4uLiBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzpcbiAgIC4uLiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJTb21ldGhpbmcgYmFkIGhhcHBlbmVkIikgZnJvbSBleGNcbiAgIC4uLlxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPlxuICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludCBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1xuXG4gICBUaGUgYWJvdmUgZXhjZXB0aW9uIHdhcyB0aGUgZGlyZWN0IGNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOlxuXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDQsIGluIDxtb2R1bGU+XG4gICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWRcblxuQSBzaW1pbGFyIG1lY2hhbmlzbSB3b3JrcyBpbXBsaWNpdGx5IGlmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW5zaWRlXG5hbiBleGNlcHRpb24gaGFuZGxlciBvciBhICJmaW5hbGx5IiBjbGF1c2U6IHRoZSBwcmV2aW91cyBleGNlcHRpb24gaXNcbnRoZW4gYXR0YWNoZWQgYXMgdGhlIG5ldyBleGNlcHRpb25cJ3MgIl9fY29udGV4dF9fIiBhdHRyaWJ1dGU6XG5cbiAgID4+PiB0cnk6XG4gICAuLi4gICAgIHByaW50KDEgLyAwKVxuICAgLi4uIGV4Y2VwdDpcbiAgIC4uLiAgICAgcmFpc2UgUnVudGltZUVycm9yKCJTb21ldGhpbmcgYmFkIGhhcHBlbmVkIilcbiAgIC4uLlxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiA8bW9kdWxlPlxuICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludCBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1xuXG4gICBEdXJpbmcgaGFuZGxpbmcgb2YgdGhlIGFib3ZlIGV4Y2VwdGlvbiwgYW5vdGhlciBleGNlcHRpb24gb2NjdXJyZWQ6XG5cbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgNCwgaW4gPG1vZHVsZT5cbiAgIFJ1bnRpbWVFcnJvcjogU29tZXRoaW5nIGJhZCBoYXBwZW5lZFxuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhhbmRsaW5nIGV4Y2VwdGlvbnMgaXMgaW4gc2VjdGlvblxuKlRoZSB0cnkgc3RhdGVtZW50Ki5cbicsCi0gJ3JldHVybic6IHUnXG5UaGUgInJldHVybiIgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHJldHVybl9zdG10IDo6PSAicmV0dXJuIiBbZXhwcmVzc2lvbl9saXN0XVxuXG4icmV0dXJuIiBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIGRlZmluaXRpb24sXG5ub3Qgd2l0aGluIGEgbmVzdGVkIGNsYXNzIGRlZmluaXRpb24uXG5cbklmIGFuIGV4cHJlc3Npb24gbGlzdCBpcyBwcmVzZW50LCBpdCBpcyBldmFsdWF0ZWQsIGVsc2UgIk5vbmUiIGlzXG5zdWJzdGl0dXRlZC5cblxuInJldHVybiIgbGVhdmVzIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGNhbGwgd2l0aCB0aGUgZXhwcmVzc2lvbiBsaXN0IChvclxuIk5vbmUiKSBhcyByZXR1cm4gdmFsdWUuXG5cbldoZW4gInJldHVybiIgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgInRyeSIgc3RhdGVtZW50IHdpdGggYSAiZmluYWxseSJcbmNsYXVzZSwgdGhhdCAiZmluYWxseSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHkgbGVhdmluZyB0aGVcbmZ1bmN0aW9uLlxuXG5JbiBhIGdlbmVyYXRvciBmdW5jdGlvbiwgdGhlICJyZXR1cm4iIHN0YXRlbWVudCBpbmRpY2F0ZXMgdGhhdCB0aGVcbmdlbmVyYXRvciBpcyBkb25lIGFuZCB3aWxsIGNhdXNlICJTdG9wSXRlcmF0aW9uIiB0byBiZSByYWlzZWQuIFRoZVxucmV0dXJuZWQgdmFsdWUgKGlmIGFueSkgaXMgdXNlZCBhcyBhbiBhcmd1bWVudCB0byBjb25zdHJ1Y3RcbiJTdG9wSXRlcmF0aW9uIiBhbmQgYmVjb21lcyB0aGUgIlN0b3BJdGVyYXRpb24udmFsdWUiIGF0dHJpYnV0ZS5cbicsCi0gJ3NlcXVlbmNlLXR5cGVzJzogdSdcbkVtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgb2JqZWN0cy5cbkNvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgb3IgbWFwcGluZ3NcbihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZVxuZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yIHRvXG5lbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgdGhlXG5hbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggIjAgPD0gayA8IE4iIHdoZXJlXG4qTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoIGRlZmluZSBhXG5yYW5nZSBvZiBpdGVtcy4gIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyBwcm92aWRlIHRoZVxubWV0aG9kcyAia2V5cygpIiwgInZhbHVlcygpIiwgIml0ZW1zKCkiLCAiZ2V0KCkiLCAiY2xlYXIoKSIsXG4ic2V0ZGVmYXVsdCgpIiwgInBvcCgpIiwgInBvcGl0ZW0oKSIsICJjb3B5KCkiLCBhbmQgInVwZGF0ZSgpIlxuYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uXCdzIHN0YW5kYXJkIGRpY3Rpb25hcnkgb2JqZWN0cy5cblRoZSAiY29sbGVjdGlvbnMiIG1vZHVsZSBwcm92aWRlcyBhICJNdXRhYmxlTWFwcGluZyIgYWJzdHJhY3QgYmFzZVxuY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YgIl9fZ2V0aXRlbV9fKCkiLFxuIl9fc2V0aXRlbV9fKCkiLCAiX19kZWxpdGVtX18oKSIsIGFuZCAia2V5cygpIi4gTXV0YWJsZSBzZXF1ZW5jZXNcbnNob3VsZCBwcm92aWRlIG1ldGhvZHMgImFwcGVuZCgpIiwgImNvdW50KCkiLCAiaW5kZXgoKSIsICJleHRlbmQoKSIsXG4iaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLCAicmV2ZXJzZSgpIiBhbmQgInNvcnQoKSIsIGxpa2UgUHl0aG9uXG5zdGFuZGFyZCBsaXN0IG9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgaW1wbGVtZW50XG5hZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmdcbnJlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzICJfX2FkZF9fKCkiLCAiX19yYWRkX18oKSIsXG4iX19pYWRkX18oKSIsICJfX211bF9fKCkiLCAiX19ybXVsX18oKSIgYW5kICJfX2ltdWxfXygpIiBkZXNjcmliZWRcbmJlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICBJdCBpc1xucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgImluIiBvcGVyYXRvcjtcbmZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5nXCdzIGtleXM7IGZvciBzZXF1ZW5jZXMsIGl0XG5zaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXIgcmVjb21tZW5kZWQgdGhhdCBib3RoXG5tYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9faXRlcl9fKCkiIG1ldGhvZCB0byBhbGxvd1xuZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgIl9faXRlcl9fKCkiXG5zaG91bGQgYmUgdGhlIHNhbWUgYXMgImtleXMoKSI7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBpdGVyYXRlXG50aHJvdWdoIHRoZSB2YWx1ZXMuXG5cbm9iamVjdC5fX2xlbl9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICBTaG91bGQgcmV0dXJuXG4gICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgIj49IiAwLiAgQWxzbywgYW4gb2JqZWN0IHRoYXRcbiAgIGRvZXNuXCd0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICJfX2xlbl9fKCkiIG1ldGhvZFxuICAgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYSBCb29sZWFuIGNvbnRleHQuXG5cbm9iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IubGVuZ3RoX2hpbnQoKSIuIFNob3VsZCByZXR1cm4gYW5cbiAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyIG9yIGxlc3MgdGhhblxuICAgdGhlIGFjdHVhbCBsZW5ndGgpLiBUaGUgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciAiPj0iIDAuIFRoaXNcbiAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCBmb3JcbiAgIGNvcnJlY3RuZXNzLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjQuXG5cbk5vdGU6IFNsaWNpbmcgaXMgZG9uZSBleGNsdXNpdmVseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcy5cbiAgQSBjYWxsIGxpa2VcblxuICAgICBhWzE6Ml0gPSBiXG5cbiAgaXMgdHJhbnNsYXRlZCB0b1xuXG4gICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYlxuXG4gIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gd2l0aCAiTm9uZSIuXG5cbm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiAic2VsZltrZXldIi4gRm9yIHNlcXVlbmNlIHR5cGVzLFxuICAgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLiAgTm90ZSB0aGF0XG4gICB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUgY2xhc3Mgd2lzaGVzXG4gICB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuIElmXG4gICAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZSByYWlzZWQ7IGlmIG9mXG4gICBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgKGFmdGVyIGFueVxuICAgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLCAiSW5kZXhFcnJvciIgc2hvdWxkIGJlXG4gICByYWlzZWQuIEZvciBtYXBwaW5nIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gdGhlXG4gICBjb250YWluZXIpLCAiS2V5RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuXG5cbiAgIE5vdGU6ICJmb3IiIGxvb3BzIGV4cGVjdCB0aGF0IGFuICJJbmRleEVycm9yIiB3aWxsIGJlIHJhaXNlZCBmb3JcbiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGVcbiAgICAgc2VxdWVuY2UuXG5cbm9iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAic2VsZltrZXldIiBmb3IgZGljdFxuICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yXG4gICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzXG4gICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkLiAgVGhlXG4gICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvclxuICAgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG5cbm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgInNlbGZba2V5XSIuICBTYW1lIG5vdGUgYXMgZm9yXG4gICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHNcbiAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmVcbiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxub2JqZWN0Ll9faXRlcl9fKHNlbGYpXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhIGNvbnRhaW5lci5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuIGl0ZXJhdGVcbiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZFxuICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuXG5cbiAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSBhcmVcbiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3JcbiAgIG9iamVjdHMsIHNlZSAqSXRlcmF0b3IgVHlwZXMqLlxuXG5vYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG5cbiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byBpbXBsZW1lbnRcbiAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdFxuICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlIG9yZGVyLlxuXG4gICBJZiB0aGUgIl9fcmV2ZXJzZWRfXygpIiBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGUgInJldmVyc2VkKCkiXG4gICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgKCJfX2xlbl9fKCkiXG4gICBhbmQgIl9fZ2V0aXRlbV9fKCkiKS4gIE9iamVjdHMgdGhhdCBzdXBwb3J0IHRoZSBzZXF1ZW5jZSBwcm90b2NvbFxuICAgc2hvdWxkIG9ubHkgcHJvdmlkZSAiX19yZXZlcnNlZF9fKCkiIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW5cbiAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5XG4gICAicmV2ZXJzZWQoKSIuXG5cblRoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzICgiaW4iIGFuZCAibm90IGluIikgYXJlIG5vcm1hbGx5XG5pbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgY29udGFpbmVyXG5vYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnRcbmltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBhIHNlcXVlbmNlLlxuXG5vYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCByZXR1cm4gdHJ1ZVxuICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpc1xuICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSB2YWx1ZXMgb3JcbiAgIHRoZSBrZXktaXRlbSBwYWlycy5cblxuICAgRm9yIG9iamVjdHMgdGhhdCBkb25cJ3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIsIHRoZSBtZW1iZXJzaGlwIHRlc3RcbiAgIGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgIl9faXRlcl9fKCkiLCB0aGVuIHRoZSBvbGQgc2VxdWVuY2VcbiAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgKnRoaXMgc2VjdGlvbiBpbiB0aGVcbiAgIGxhbmd1YWdlIHJlZmVyZW5jZSouXG4nLAotICdzaGlmdGluZyc6IHUnXG5TaGlmdGluZyBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqXG5cblRoZSBzaGlmdGluZyBvcGVyYXRpb25zIGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgYXJpdGhtZXRpY1xub3BlcmF0aW9uczpcblxuICAgc2hpZnRfZXhwciA6Oj0gYV9leHByIHwgc2hpZnRfZXhwciAoICI8PCIgfCAiPj4iICkgYV9leHByXG5cblRoZXNlIG9wZXJhdG9ycyBhY2NlcHQgaW50ZWdlcnMgYXMgYXJndW1lbnRzLiAgVGhleSBzaGlmdCB0aGUgZmlyc3RcbmFyZ3VtZW50IHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBieSB0aGVcbnNlY29uZCBhcmd1bWVudC5cblxuQSByaWdodCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIGZsb29yIGRpdmlzaW9uIGJ5ICJwb3coMixuKSIuXG5BIGxlZnQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBtdWx0aXBsaWNhdGlvbiB3aXRoICJwb3coMixuKSIuXG5cbk5vdGU6IEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzXG4gIHJlcXVpcmVkIHRvIGJlIGF0IG1vc3QgInN5cy5tYXhzaXplIi4gIElmIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgaXNcbiAgbGFyZ2VyIHRoYW4gInN5cy5tYXhzaXplIiBhbiAiT3ZlcmZsb3dFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicsCi0gJ3NsaWNpbmdzJzogdSdcblNsaWNpbmdzXG4qKioqKioqKlxuXG5BIHNsaWNpbmcgc2VsZWN0cyBhIHJhbmdlIG9mIGl0ZW1zIGluIGEgc2VxdWVuY2Ugb2JqZWN0IChlLmcuLCBhXG5zdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgU2xpY2luZ3MgbWF5IGJlIHVzZWQgYXMgZXhwcmVzc2lvbnMgb3IgYXNcbnRhcmdldHMgaW4gYXNzaWdubWVudCBvciAiZGVsIiBzdGF0ZW1lbnRzLiAgVGhlIHN5bnRheCBmb3IgYSBzbGljaW5nOlxuXG4gICBzbGljaW5nICAgICAgOjo9IHByaW1hcnkgIlsiIHNsaWNlX2xpc3QgIl0iXG4gICBzbGljZV9saXN0ICAgOjo9IHNsaWNlX2l0ZW0gKCIsIiBzbGljZV9pdGVtKSogWyIsIl1cbiAgIHNsaWNlX2l0ZW0gICA6Oj0gZXhwcmVzc2lvbiB8IHByb3Blcl9zbGljZVxuICAgcHJvcGVyX3NsaWNlIDo6PSBbbG93ZXJfYm91bmRdICI6IiBbdXBwZXJfYm91bmRdIFsgIjoiIFtzdHJpZGVdIF1cbiAgIGxvd2VyX2JvdW5kICA6Oj0gZXhwcmVzc2lvblxuICAgdXBwZXJfYm91bmQgIDo6PSBleHByZXNzaW9uXG4gICBzdHJpZGUgICAgICAgOjo9IGV4cHJlc3Npb25cblxuVGhlcmUgaXMgYW1iaWd1aXR5IGluIHRoZSBmb3JtYWwgc3ludGF4IGhlcmU6IGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZVxuYW4gZXhwcmVzc2lvbiBsaXN0IGFsc28gbG9va3MgbGlrZSBhIHNsaWNlIGxpc3QsIHNvIGFueSBzdWJzY3JpcHRpb25cbmNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNsaWNpbmcuICBSYXRoZXIgdGhhbiBmdXJ0aGVyIGNvbXBsaWNhdGluZyB0aGVcbnN5bnRheCwgdGhpcyBpcyBkaXNhbWJpZ3VhdGVkIGJ5IGRlZmluaW5nIHRoYXQgaW4gdGhpcyBjYXNlIHRoZVxuaW50ZXJwcmV0YXRpb24gYXMgYSBzdWJzY3JpcHRpb24gdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGVcbmludGVycHJldGF0aW9uIGFzIGEgc2xpY2luZyAodGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgc2xpY2UgbGlzdFxuY29udGFpbnMgbm8gcHJvcGVyIHNsaWNlKS5cblxuVGhlIHNlbWFudGljcyBmb3IgYSBzbGljaW5nIGFyZSBhcyBmb2xsb3dzLiAgVGhlIHByaW1hcnkgaXMgaW5kZXhlZFxuKHVzaW5nIHRoZSBzYW1lICJfX2dldGl0ZW1fXygpIiBtZXRob2QgYXMgbm9ybWFsIHN1YnNjcmlwdGlvbikgd2l0aCBhXG5rZXkgdGhhdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzbGljZSBsaXN0LCBhcyBmb2xsb3dzLiAgSWYgdGhlIHNsaWNlXG5saXN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBjb21tYSwgdGhlIGtleSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlXG5jb252ZXJzaW9uIG9mIHRoZSBzbGljZSBpdGVtczsgb3RoZXJ3aXNlLCB0aGUgY29udmVyc2lvbiBvZiB0aGUgbG9uZVxuc2xpY2UgaXRlbSBpcyB0aGUga2V5LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBzbGljZSBpdGVtIHRoYXQgaXMgYW5cbmV4cHJlc3Npb24gaXMgdGhhdCBleHByZXNzaW9uLiAgVGhlIGNvbnZlcnNpb24gb2YgYSBwcm9wZXIgc2xpY2UgaXMgYVxuc2xpY2Ugb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5Kikgd2hvc2VcbiJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIGF0dHJpYnV0ZXMgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlXG5leHByZXNzaW9ucyBnaXZlbiBhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kIHN0cmlkZSxcbnJlc3BlY3RpdmVseSwgc3Vic3RpdHV0aW5nICJOb25lIiBmb3IgbWlzc2luZyBleHByZXNzaW9ucy5cbicsCi0gJ3NwZWNpYWxhdHRycyc6IHUnXG5TcGVjaWFsIEF0dHJpYnV0ZXNcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzIHRvIHNldmVyYWxcbm9iamVjdCB0eXBlcywgd2hlcmUgdGhleSBhcmUgcmVsZXZhbnQuICBTb21lIG9mIHRoZXNlIGFyZSBub3QgcmVwb3J0ZWRcbmJ5IHRoZSAiZGlyKCkiIGJ1aWx0LWluIGZ1bmN0aW9uLlxuXG5vYmplY3QuX19kaWN0X19cblxuICAgQSBkaWN0aW9uYXJ5IG9yIG90aGVyIG1hcHBpbmcgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gb2JqZWN0XCdzXG4gICAod3JpdGFibGUpIGF0dHJpYnV0ZXMuXG5cbmluc3RhbmNlLl9fY2xhc3NfX1xuXG4gICBUaGUgY2xhc3MgdG8gd2hpY2ggYSBjbGFzcyBpbnN0YW5jZSBiZWxvbmdzLlxuXG5jbGFzcy5fX2Jhc2VzX19cblxuICAgVGhlIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBvZiBhIGNsYXNzIG9iamVjdC5cblxuY2xhc3MuX19uYW1lX19cblxuICAgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIG9yIHR5cGUuXG5cbmNsYXNzLl9fcXVhbG5hbWVfX1xuXG4gICBUaGUgKnF1YWxpZmllZCBuYW1lKiBvZiB0aGUgY2xhc3Mgb3IgdHlwZS5cblxuICAgTmV3IGluIHZlcnNpb24gMy4zLlxuXG5jbGFzcy5fX21yb19fXG5cbiAgIFRoaXMgYXR0cmlidXRlIGlzIGEgdHVwbGUgb2YgY2xhc3NlcyB0aGF0IGFyZSBjb25zaWRlcmVkIHdoZW5cbiAgIGxvb2tpbmcgZm9yIGJhc2UgY2xhc3NlcyBkdXJpbmcgbWV0aG9kIHJlc29sdXRpb24uXG5cbmNsYXNzLm1ybygpXG5cbiAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgbWV0YWNsYXNzIHRvIGN1c3RvbWl6ZSB0aGVcbiAgIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIGZvciBpdHMgaW5zdGFuY2VzLiAgSXQgaXMgY2FsbGVkIGF0IGNsYXNzXG4gICBpbnN0YW50aWF0aW9uLCBhbmQgaXRzIHJlc3VsdCBpcyBzdG9yZWQgaW4gIl9fbXJvX18iLlxuXG5jbGFzcy5fX3N1YmNsYXNzZXNfXygpXG5cbiAgIEVhY2ggY2xhc3Mga2VlcHMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBpdHMgaW1tZWRpYXRlXG4gICBzdWJjbGFzc2VzLiAgVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRob3NlIHJlZmVyZW5jZXNcbiAgIHN0aWxsIGFsaXZlLiBFeGFtcGxlOlxuXG4gICAgICA+Pj4gaW50Ll9fc3ViY2xhc3Nlc19fKClcbiAgICAgIFs8Y2xhc3MgXCdib29sXCc+XVxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlc2Ugc3BlY2lhbCBtZXRob2RzIG1heSBiZSBmb3VuZFxuICAgIGluIHRoZSBQeXRob24gUmVmZXJlbmNlIE1hbnVhbCAoKkJhc2ljIGN1c3RvbWl6YXRpb24qKS5cblxuWzJdIEFzIGEgY29uc2VxdWVuY2UsIHRoZSBsaXN0ICJbMSwgMl0iIGlzIGNvbnNpZGVyZWQgZXF1YWwgdG9cbiAgICAiWzEuMCwgMi4wXSIsIGFuZCBzaW1pbGFybHkgZm9yIHR1cGxlcy5cblxuWzNdIFRoZXkgbXVzdCBoYXZlIHNpbmNlIHRoZSBwYXJzZXIgY2FuXCd0IHRlbGwgdGhlIHR5cGUgb2YgdGhlXG4gICAgb3BlcmFuZHMuXG5cbls0XSBDYXNlZCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoIGdlbmVyYWwgY2F0ZWdvcnkgcHJvcGVydHlcbiAgICBiZWluZyBvbmUgb2YgIkx1IiAoTGV0dGVyLCB1cHBlcmNhc2UpLCAiTGwiIChMZXR0ZXIsIGxvd2VyY2FzZSksXG4gICAgb3IgIkx0IiAoTGV0dGVyLCB0aXRsZWNhc2UpLlxuXG5bNV0gVG8gZm9ybWF0IG9ubHkgYSB0dXBsZSB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBwcm92aWRlIGFcbiAgICBzaW5nbGV0b24gdHVwbGUgd2hvc2Ugb25seSBlbGVtZW50IGlzIHRoZSB0dXBsZSB0byBiZSBmb3JtYXR0ZWQuXG4nLAotICdzcGVjaWFsbmFtZXMnOiB1J1xuU3BlY2lhbCBtZXRob2QgbmFtZXNcbioqKioqKioqKioqKioqKioqKioqXG5cbkEgY2xhc3MgY2FuIGltcGxlbWVudCBjZXJ0YWluIG9wZXJhdGlvbnMgdGhhdCBhcmUgaW52b2tlZCBieSBzcGVjaWFsXG5zeW50YXggKHN1Y2ggYXMgYXJpdGhtZXRpYyBvcGVyYXRpb25zIG9yIHN1YnNjcmlwdGluZyBhbmQgc2xpY2luZykgYnlcbmRlZmluaW5nIG1ldGhvZHMgd2l0aCBzcGVjaWFsIG5hbWVzLiBUaGlzIGlzIFB5dGhvblwncyBhcHByb2FjaCB0b1xuKm9wZXJhdG9yIG92ZXJsb2FkaW5nKiwgYWxsb3dpbmcgY2xhc3NlcyB0byBkZWZpbmUgdGhlaXIgb3duIGJlaGF2aW9yXG53aXRoIHJlc3BlY3QgdG8gbGFuZ3VhZ2Ugb3BlcmF0b3JzLiAgRm9yIGluc3RhbmNlLCBpZiBhIGNsYXNzIGRlZmluZXNcbmEgbWV0aG9kIG5hbWVkICJfX2dldGl0ZW1fXygpIiwgYW5kICJ4IiBpcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLFxudGhlbiAieFtpXSIgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvICJ0eXBlKHgpLl9fZ2V0aXRlbV9fKHgsIGkpIi5cbkV4Y2VwdCB3aGVyZSBtZW50aW9uZWQsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgYW4gb3BlcmF0aW9uIHJhaXNlIGFuXG5leGNlcHRpb24gd2hlbiBubyBhcHByb3ByaWF0ZSBtZXRob2QgaXMgZGVmaW5lZCAodHlwaWNhbGx5XG4iQXR0cmlidXRlRXJyb3IiIG9yICJUeXBlRXJyb3IiKS5cblxuV2hlbiBpbXBsZW1lbnRpbmcgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIGFueSBidWlsdC1pbiB0eXBlLCBpdCBpc1xuaW1wb3J0YW50IHRoYXQgdGhlIGVtdWxhdGlvbiBvbmx5IGJlIGltcGxlbWVudGVkIHRvIHRoZSBkZWdyZWUgdGhhdCBpdFxubWFrZXMgc2Vuc2UgZm9yIHRoZSBvYmplY3QgYmVpbmcgbW9kZWxsZWQuICBGb3IgZXhhbXBsZSwgc29tZVxuc2VxdWVuY2VzIG1heSB3b3JrIHdlbGwgd2l0aCByZXRyaWV2YWwgb2YgaW5kaXZpZHVhbCBlbGVtZW50cywgYnV0XG5leHRyYWN0aW5nIGEgc2xpY2UgbWF5IG5vdCBtYWtlIHNlbnNlLiAgKE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgdGhlXG4iTm9kZUxpc3QiIGludGVyZmFjZSBpbiB0aGUgVzNDXCdzIERvY3VtZW50IE9iamVjdCBNb2RlbC4pXG5cblxuQmFzaWMgY3VzdG9taXphdGlvblxuPT09PT09PT09PT09PT09PT09PVxuXG5vYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKVxuXG4gICBDYWxsZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzICpjbHMqLiAgIl9fbmV3X18oKSIgaXMgYVxuICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKVxuICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHNcbiAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGVcbiAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVyblxuICAgdmFsdWUgb2YgIl9fbmV3X18oKSIgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5IGFuXG4gICBpbnN0YW5jZSBvZiAqY2xzKikuXG5cbiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnlcbiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCB1c2luZ1xuICAgInN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pIiB3aXRoIGFwcHJvcHJpYXRlXG4gICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlIGFzXG4gICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC5cblxuICAgSWYgIl9fbmV3X18oKSIgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlXG4gICAiX19pbml0X18oc2VsZlssIC4uLl0pIiwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgaW5zdGFuY2UgYW5kIHRoZVxuICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gIl9fbmV3X18oKSIuXG5cbiAgIElmICJfX25ld19fKCkiIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuXG5cbiAgICJfX25ld19fKCkiIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mIGltbXV0YWJsZVxuICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdFxuICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0b1xuICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuXG5vYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG5cbiAgIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCAoYnkgIl9fbmV3X18oKSIpLCBidXRcbiAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2VcbiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW5cbiAgICJfX2luaXRfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNzXCdzICJfX2luaXRfXygpIiBtZXRob2QsIGlmXG4gICBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2YgdGhlXG4gICBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbiAgICJCYXNlQ2xhc3MuX19pbml0X18oc2VsZiwgW2FyZ3MuLi5dKSIuXG5cbiAgIEJlY2F1c2UgIl9fbmV3X18oKSIgYW5kICJfX2luaXRfXygpIiB3b3JrIHRvZ2V0aGVyIGluIGNvbnN0cnVjdGluZ1xuICAgb2JqZWN0cyAoIl9fbmV3X18oKSIgdG8gY3JlYXRlIGl0LCBhbmQgIl9faW5pdF9fKCkiIHRvIGN1c3RvbWlzZVxuICAgaXQpLCBubyBub24tIk5vbmUiIHZhbHVlIG1heSBiZSByZXR1cm5lZCBieSAiX19pbml0X18oKSI7IGRvaW5nIHNvXG4gICB3aWxsIGNhdXNlIGEgIlR5cGVFcnJvciIgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuXG5cbm9iamVjdC5fX2RlbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuICBUaGlzIGlzIGFsc29cbiAgIGNhbGxlZCBhIGRlc3RydWN0b3IuICBJZiBhIGJhc2UgY2xhc3MgaGFzIGEgIl9fZGVsX18oKSIgbWV0aG9kLCB0aGVcbiAgIGRlcml2ZWQgY2xhc3NcJ3MgIl9fZGVsX18oKSIgbWV0aG9kLCBpZiBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0XG4gICB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlLlxuICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yIHRoZVxuICAgIl9fZGVsX18oKSIgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieVxuICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXJcbiAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXRcbiAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0IHN0aWxsIGV4aXN0IHdoZW5cbiAgIHRoZSBpbnRlcnByZXRlciBleGl0cy5cblxuICAgTm90ZTogImRlbCB4IiBkb2VzblwndCBkaXJlY3RseSBjYWxsICJ4Ll9fZGVsX18oKSIgLS0tIHRoZSBmb3JtZXJcbiAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciAieCIgYnkgb25lLCBhbmQgdGhlIGxhdHRlciBpc1xuICAgICBvbmx5IGNhbGxlZCB3aGVuICJ4IlwncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgU29tZSBjb21tb25cbiAgICAgc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4gb2JqZWN0IGZyb21cbiAgICAgZ29pbmcgdG8gemVybyBpbmNsdWRlOiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gb2JqZWN0cyAoZS5nLixcbiAgICAgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGggcGFyZW50IGFuZFxuICAgICBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIG9mXG4gICAgIGEgZnVuY3Rpb24gdGhhdCBjYXVnaHQgYW4gZXhjZXB0aW9uICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICAic3lzLmV4Y19pbmZvKClbMl0iIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yIGEgcmVmZXJlbmNlXG4gICAgIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuIHVuaGFuZGxlZFxuICAgICBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgInN5cy5sYXN0X3RyYWNlYmFjayIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKS4gIFRoZSBmaXJzdFxuICAgICBzaXR1YXRpb24gY2FuIG9ubHkgYmUgcmVtZWRpZWQgYnkgZXhwbGljaXRseSBicmVha2luZyB0aGUgY3ljbGVzO1xuICAgICB0aGUgc2Vjb25kIGNhbiBiZSByZXNvbHZlZCBieSBmcmVlaW5nIHRoZSByZWZlcmVuY2UgdG8gdGhlXG4gICAgIHRyYWNlYmFjayBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZnVsLCBhbmQgdGhlIHRoaXJkIGNhblxuICAgICBiZSByZXNvbHZlZCBieSBzdG9yaW5nICJOb25lIiBpbiAic3lzLmxhc3RfdHJhY2ViYWNrIi4gQ2lyY3VsYXJcbiAgICAgcmVmZXJlbmNlcyB3aGljaCBhcmUgZ2FyYmFnZSBhcmUgZGV0ZWN0ZWQgYW5kIGNsZWFuZWQgdXAgd2hlbiB0aGVcbiAgICAgY3ljbGljIGdhcmJhZ2UgY29sbGVjdG9yIGlzIGVuYWJsZWQgKGl0XCdzIG9uIGJ5IGRlZmF1bHQpLiBSZWZlclxuICAgICB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJnYyIgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uXG4gICAgIGFib3V0IHRoaXMgdG9waWMuXG5cbiAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoXG4gICAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmdcbiAgICAgdGhlaXIgZXhlY3V0aW9uIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG9cbiAgICAgInN5cy5zdGRlcnIiIGluc3RlYWQuIEFsc28sIHdoZW4gIl9fZGVsX18oKSIgaXMgaW52b2tlZCBpblxuICAgICByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZyBkZWxldGVkIChlLmcuLCB3aGVuIGV4ZWN1dGlvbiBvZiB0aGVcbiAgICAgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXIgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSAiX19kZWxfXygpIlxuICAgICBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmdcbiAgICAgdG9ybiBkb3duIChlLmcuIHRoZSBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgRm9yIHRoaXNcbiAgICAgcmVhc29uLCAiX19kZWxfXygpIiBtZXRob2RzIHNob3VsZCBkbyB0aGUgYWJzb2x1dGUgbWluaW11bSBuZWVkZWRcbiAgICAgdG8gbWFpbnRhaW4gZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjUsXG4gICAgIFB5dGhvbiBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGEgc2luZ2xlXG4gICAgIHVuZGVyc2NvcmUgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpciBtb2R1bGUgYmVmb3JlIG90aGVyIGdsb2JhbHMgYXJlXG4gICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCB0aGlzIG1heVxuICAgICBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgYXZhaWxhYmxlIGF0IHRoZVxuICAgICB0aW1lIHdoZW4gdGhlICJfX2RlbF9fKCkiIG1ldGhvZCBpcyBjYWxsZWQuXG5cbm9iamVjdC5fX3JlcHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlICJyZXByKCkiIGJ1aWx0LWluIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlICJvZmZpY2lhbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsIHRoaXNcbiAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQgdG9cbiAgIHJlY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiBhcHByb3ByaWF0ZVxuICAgZW52aXJvbm1lbnQpLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSBmb3JtXG4gICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiBUaGUgcmV0dXJuXG4gICB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzICJfX3JlcHJfXygpIiBidXRcbiAgIG5vdCAiX19zdHJfXygpIiwgdGhlbiAiX19yZXByX18oKSIgaXMgYWxzbyB1c2VkIHdoZW4gYW4gImluZm9ybWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzIHJlcXVpcmVkLlxuXG4gICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZVxuICAgcmVwcmVzZW50YXRpb24gaXMgaW5mb3JtYXRpb24tcmljaCBhbmQgdW5hbWJpZ3VvdXMuXG5cbm9iamVjdC5fX3N0cl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSAic3RyKG9iamVjdCkiIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJmb3JtYXQoKSIgYW5kXG4gICAicHJpbnQoKSIgdG8gY29tcHV0ZSB0aGUgImluZm9ybWFsIiBvciBuaWNlbHkgcHJpbnRhYmxlIHN0cmluZ1xuICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgKnN0cmluZypcbiAgIG9iamVjdC5cblxuICAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tICJvYmplY3QuX19yZXByX18oKSIgaW4gdGhhdCB0aGVyZSBpcyBub1xuICAgZXhwZWN0YXRpb24gdGhhdCAiX19zdHJfXygpIiByZXR1cm4gYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbjogYVxuICAgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2UgcmVwcmVzZW50YXRpb24gY2FuIGJlIHVzZWQuXG5cbiAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRlZmluZWQgYnkgdGhlIGJ1aWx0LWluIHR5cGUgIm9iamVjdCJcbiAgIGNhbGxzICJvYmplY3QuX19yZXByX18oKSIuXG5cbm9iamVjdC5fX2J5dGVzX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5ICJieXRlcygpIiB0byBjb21wdXRlIGEgYnl0ZS1zdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW5cbiAgIG9iamVjdC4gVGhpcyBzaG91bGQgcmV0dXJuIGEgImJ5dGVzIiBvYmplY3QuXG5cbm9iamVjdC5fX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKVxuXG4gICBDYWxsZWQgYnkgdGhlICJmb3JtYXQoKSIgYnVpbHQtaW4gZnVuY3Rpb24gKGFuZCBieSBleHRlbnNpb24sIHRoZVxuICAgInN0ci5mb3JtYXQoKSIgbWV0aG9kIG9mIGNsYXNzICJzdHIiKSB0byBwcm9kdWNlIGEgImZvcm1hdHRlZCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIGFcbiAgIHN0cmluZyB0aGF0IGNvbnRhaW5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9uc1xuICAgZGVzaXJlZC4gVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSAiZm9ybWF0X3NwZWMiIGFyZ3VtZW50IGlzIHVwIHRvXG4gICB0aGUgdHlwZSBpbXBsZW1lbnRpbmcgIl9fZm9ybWF0X18oKSIsIGhvd2V2ZXIgbW9zdCBjbGFzc2VzIHdpbGxcbiAgIGVpdGhlciBkZWxlZ2F0ZSBmb3JtYXR0aW5nIHRvIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZXMsIG9yIHVzZSBhXG4gICBzaW1pbGFyIGZvcm1hdHRpbmcgb3B0aW9uIHN5bnRheC5cblxuICAgU2VlICpGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlKiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGVcbiAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgc3ludGF4LlxuXG4gICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy40OiBUaGUgX19mb3JtYXRfXyBtZXRob2Qgb2YgIm9iamVjdCIgaXRzZWxmXG4gICByYWlzZXMgYSAiVHlwZUVycm9yIiBpZiBwYXNzZWQgYW55IG5vbi1lbXB0eSBzdHJpbmcuXG5cbm9iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZXFfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ2VfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcy4gVGhlXG4gICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyBpcyBhc1xuICAgZm9sbG93czogIng8eSIgY2FsbHMgInguX19sdF9fKHkpIiwgIng8PXkiIGNhbGxzICJ4Ll9fbGVfXyh5KSIsXG4gICAieD09eSIgY2FsbHMgInguX19lcV9fKHkpIiwgInghPXkiIGNhbGxzICJ4Ll9fbmVfXyh5KSIsICJ4PnkiIGNhbGxzXG4gICAieC5fX2d0X18oeSkiLCBhbmQgIng+PXkiIGNhbGxzICJ4Ll9fZ2VfXyh5KSIuXG5cbiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b24gIk5vdEltcGxlbWVudGVkIlxuICAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gcGFpciBvZlxuICAgYXJndW1lbnRzLiBCeSBjb252ZW50aW9uLCAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlIHJldHVybmVkIGZvciBhXG4gICBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuIHJldHVybiBhbnkgdmFsdWUsXG4gICBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEgQm9vbGVhbiBjb250ZXh0IChlLmcuLFxuICAgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiAiaWYiIHN0YXRlbWVudCksIFB5dGhvbiB3aWxsIGNhbGwgImJvb2woKSJcbiAgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdCBpcyB0cnVlIG9yIGZhbHNlLlxuXG4gICBCeSBkZWZhdWx0LCAiX19uZV9fKCkiIGRlbGVnYXRlcyB0byAiX19lcV9fKCkiIGFuZCBpbnZlcnRzIHRoZVxuICAgcmVzdWx0IHVubGVzcyBpdCBpcyAiTm90SW1wbGVtZW50ZWQiLiAgVGhlcmUgYXJlIG5vIG90aGVyIGltcGxpZWRcbiAgIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBmb3IgZXhhbXBsZSwgdGhlXG4gICB0cnV0aCBvZiAiKHg8eSBvciB4PT15KSIgZG9lcyBub3QgaW1wbHkgIng8PXkiLiBUbyBhdXRvbWF0aWNhbGx5XG4gICBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdCBvcGVyYXRpb24sIHNlZVxuICAgImZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpIi5cblxuICAgU2VlIHRoZSBwYXJhZ3JhcGggb24gIl9faGFzaF9fKCkiIGZvciBzb21lIGltcG9ydGFudCBub3RlcyBvblxuICAgY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tIGNvbXBhcmlzb25cbiAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLlxuXG4gICBUaGVyZSBhcmUgbm8gc3dhcHBlZC1hcmd1bWVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzICh0byBiZSB1c2VkXG4gICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiBidXQgdGhlIHJpZ2h0XG4gICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCAiX19sdF9fKCkiIGFuZCAiX19ndF9fKCkiIGFyZSBlYWNoIG90aGVyXCdzXG4gICByZWZsZWN0aW9uLCAiX19sZV9fKCkiIGFuZCAiX19nZV9fKCkiIGFyZSBlYWNoIG90aGVyXCdzIHJlZmxlY3Rpb24sXG4gICBhbmQgIl9fZXFfXygpIiBhbmQgIl9fbmVfXygpIiBhcmUgdGhlaXIgb3duIHJlZmxlY3Rpb24uIElmIHRoZVxuICAgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcywgYW5kIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhXG4gICBkaXJlY3Qgb3IgaW5kaXJlY3Qgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZFwncyB0eXBlLCB0aGVcbiAgIHJlZmxlY3RlZCBtZXRob2Qgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgaGFzIHByaW9yaXR5LCBvdGhlcndpc2UgdGhlXG4gICBsZWZ0IG9wZXJhbmRcJ3MgbWV0aG9kIGhhcyBwcmlvcml0eS4gIFZpcnR1YWwgc3ViY2xhc3NpbmcgaXMgbm90XG4gICBjb25zaWRlcmVkLlxuXG5vYmplY3QuX19oYXNoX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IGJ1aWx0LWluIGZ1bmN0aW9uICJoYXNoKCkiIGFuZCBmb3Igb3BlcmF0aW9ucyBvbiBtZW1iZXJzXG4gICBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nICJzZXQiLCAiZnJvemVuc2V0IiwgYW5kICJkaWN0Ii5cbiAgICJfX2hhc2hfXygpIiBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIuICBUaGUgb25seSByZXF1aXJlZCBwcm9wZXJ0eVxuICAgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlOyBpdCBpc1xuICAgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZyBleGNsdXNpdmUgb3IpIHRoZSBoYXNoXG4gICB2YWx1ZXMgZm9yIHRoZSBjb21wb25lbnRzIG9mIHRoZSBvYmplY3QgdGhhdCBhbHNvIHBsYXkgYSBwYXJ0IGluXG4gICBjb21wYXJpc29uIG9mIG9iamVjdHMuXG5cbiAgIE5vdGU6ICJoYXNoKCkiIHRydW5jYXRlcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhbiBvYmplY3RcJ3NcbiAgICAgY3VzdG9tICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAiUHlfc3NpemVfdCIuICBUaGlzXG4gICAgIGlzIHR5cGljYWxseSA4IGJ5dGVzIG9uIDY0LWJpdCBidWlsZHMgYW5kIDQgYnl0ZXMgb24gMzItYml0XG4gICAgIGJ1aWxkcy4gSWYgYW4gb2JqZWN0XCdzICAgIl9faGFzaF9fKCkiIG11c3QgaW50ZXJvcGVyYXRlIG9uIGJ1aWxkc1xuICAgICBvZiBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiBhbGxcbiAgICAgc3VwcG9ydGVkIGJ1aWxkcy4gIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCAicHl0aG9uIC1jXG4gICAgICJpbXBvcnQgc3lzOyBwcmludChzeXMuaGFzaF9pbmZvLndpZHRoKSIiLlxuXG4gICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCBzaG91bGQgbm90XG4gICBkZWZpbmUgYSAiX19oYXNoX18oKSIgb3BlcmF0aW9uIGVpdGhlcjsgaWYgaXQgZGVmaW5lcyAiX19lcV9fKCkiXG4gICBidXQgbm90ICJfX2hhc2hfXygpIiwgaXRzIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgYXMgaXRlbXMgaW5cbiAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmRcbiAgIGltcGxlbWVudHMgYW4gIl9fZXFfXygpIiBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50XG4gICAiX19oYXNoX18oKSIsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoYWJsZSBjb2xsZWN0aW9uc1xuICAgcmVxdWlyZXMgdGhhdCBhIGtleVwncyBoYXNoIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdFwncyBoYXNoXG4gICB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG5cbiAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgIl9fZXFfXygpIiBhbmQgIl9faGFzaF9fKCkiIG1ldGhvZHMgYnlcbiAgIGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aFxuICAgdGhlbXNlbHZlcykgYW5kICJ4Ll9faGFzaF9fKCkiIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgdmFsdWUgc3VjaFxuICAgdGhhdCAieCA9PSB5IiBpbXBsaWVzIGJvdGggdGhhdCAieCBpcyB5IiBhbmQgImhhc2goeCkgPT0gaGFzaCh5KSIuXG5cbiAgIEEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBhbmQgZG9lcyBub3QgZGVmaW5lICJfX2hhc2hfXygpIlxuICAgd2lsbCBoYXZlIGl0cyAiX19oYXNoX18oKSIgaW1wbGljaXRseSBzZXQgdG8gIk5vbmUiLiAgV2hlbiB0aGVcbiAgICJfX2hhc2hfXygpIiBtZXRob2Qgb2YgYSBjbGFzcyBpcyAiTm9uZSIsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3NcbiAgIHdpbGwgcmFpc2UgYW4gYXBwcm9wcmlhdGUgIlR5cGVFcnJvciIgd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG9cbiAgIHJldHJpZXZlIHRoZWlyIGhhc2ggdmFsdWUsIGFuZCB3aWxsIGFsc28gYmUgY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIuXG5cbiAgIElmIGEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBuZWVkcyB0byByZXRhaW4gdGhlXG4gICBpbXBsZW1lbnRhdGlvbiBvZiAiX19oYXNoX18oKSIgZnJvbSBhIHBhcmVudCBjbGFzcywgdGhlIGludGVycHJldGVyXG4gICBtdXN0IGJlIHRvbGQgdGhpcyBleHBsaWNpdGx5IGJ5IHNldHRpbmcgIl9faGFzaF9fID1cbiAgIDxQYXJlbnRDbGFzcz4uX19oYXNoX18iLlxuXG4gICBJZiBhIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgIl9fZXFfXygpIiB3aXNoZXMgdG8gc3VwcHJlc3NcbiAgIGhhc2ggc3VwcG9ydCwgaXQgc2hvdWxkIGluY2x1ZGUgIl9faGFzaF9fID0gTm9uZSIgaW4gdGhlIGNsYXNzXG4gICBkZWZpbml0aW9uLiBBIGNsYXNzIHdoaWNoIGRlZmluZXMgaXRzIG93biAiX19oYXNoX18oKSIgdGhhdFxuICAgZXhwbGljaXRseSByYWlzZXMgYSAiVHlwZUVycm9yIiB3b3VsZCBiZSBpbmNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICBoYXNoYWJsZSBieSBhbiAiaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKSIgY2FsbC5cblxuICAgTm90ZTogQnkgZGVmYXVsdCwgdGhlICJfX2hhc2hfXygpIiB2YWx1ZXMgb2Ygc3RyLCBieXRlcyBhbmRcbiAgICAgZGF0ZXRpbWUgb2JqZWN0cyBhcmUgInNhbHRlZCIgd2l0aCBhbiB1bnByZWRpY3RhYmxlIHJhbmRvbSB2YWx1ZS5cbiAgICAgQWx0aG91Z2ggdGhleSByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgUHl0aG9uXG4gICAgIHByb2Nlc3MsIHRoZXkgYXJlIG5vdCBwcmVkaWN0YWJsZSBiZXR3ZWVuIHJlcGVhdGVkIGludm9jYXRpb25zIG9mXG4gICAgIFB5dGhvbi5UaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0IGEgZGVuaWFsLVxuICAgICBvZi1zZXJ2aWNlIGNhdXNlZCBieSBjYXJlZnVsbHktY2hvc2VuIGlucHV0cyB0aGF0IGV4cGxvaXQgdGhlXG4gICAgIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2Ugb2YgYSBkaWN0IGluc2VydGlvbiwgTyhuXjIpIGNvbXBsZXhpdHkuXG4gICAgIFNlZSBodHRwOi8vd3d3Lm9jZXJ0Lm9yZy9hZHZpc29yaWVzL29jZXJ0LTIwMTEtMDAzLmh0bWwgZm9yXG4gICAgIGRldGFpbHMuQ2hhbmdpbmcgaGFzaCB2YWx1ZXMgYWZmZWN0cyB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mXG4gICAgIGRpY3RzLCBzZXRzIGFuZCBvdGhlciBtYXBwaW5ncy4gIFB5dGhvbiBoYXMgbmV2ZXIgbWFkZSBndWFyYW50ZWVzXG4gICAgIGFib3V0IHRoaXMgb3JkZXJpbmcgKGFuZCBpdCB0eXBpY2FsbHkgdmFyaWVzIGJldHdlZW4gMzItYml0IGFuZFxuICAgICA2NC1iaXQgYnVpbGRzKS5TZWUgYWxzbyAiUFlUSE9OSEFTSFNFRUQiLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBIYXNoIHJhbmRvbWl6YXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LlxuXG5vYmplY3QuX19ib29sX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uXG4gICAiYm9vbCgpIjsgc2hvdWxkIHJldHVybiAiRmFsc2UiIG9yICJUcnVlIi4gIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90XG4gICBkZWZpbmVkLCAiX19sZW5fXygpIiBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCB0aGUgb2JqZWN0IGlzXG4gICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiAgSWYgYSBjbGFzcyBkZWZpbmVzXG4gICBuZWl0aGVyICJfX2xlbl9fKCkiIG5vciAiX19ib29sX18oKSIsIGFsbCBpdHMgaW5zdGFuY2VzIGFyZVxuICAgY29uc2lkZXJlZCB0cnVlLlxuXG5cbkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZlxuYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiAieC5uYW1lIikgZm9yXG5jbGFzcyBpbnN0YW5jZXMuXG5cbm9iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgbG9va3VwIGhhcyBub3QgZm91bmQgdGhlIGF0dHJpYnV0ZSBpbiB0aGVcbiAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG5vciBpcyBpdCBmb3VuZFxuICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yICJzZWxmIikuICAibmFtZSIgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLiBUaGlzXG4gICBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbiAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLlxuXG4gICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtLFxuICAgIl9fZ2V0YXR0cl9fKCkiIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBhc3ltbWV0cnlcbiAgIGJldHdlZW4gIl9fZ2V0YXR0cl9fKCkiIGFuZCAiX19zZXRhdHRyX18oKSIuKSBUaGlzIGlzIGRvbmUgYm90aCBmb3JcbiAgIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgIl9fZ2V0YXR0cl9fKCkiIHdvdWxkIGhhdmVcbiAgIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlIHRoYXQgYXRcbiAgIGxlYXN0IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIHlvdSBjYW4gZmFrZSB0b3RhbCBjb250cm9sIGJ5IG5vdFxuICAgaW5zZXJ0aW5nIGFueSB2YWx1ZXMgaW4gdGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5IChidXRcbiAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZVxuICAgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSBnZXQgdG90YWxcbiAgIGNvbnRyb2wgb3ZlciBhdHRyaWJ1dGUgYWNjZXNzLlxuXG5vYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yXG4gICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzICJfX2dldGF0dHJfXygpIixcbiAgIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyAiX19nZXRhdHRyaWJ1dGVfXygpIiBlaXRoZXJcbiAgIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuICJBdHRyaWJ1dGVFcnJvciIuIFRoaXMgbWV0aG9kXG4gICBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uIEluIG9yZGVyIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpblxuICAgdGhpcyBtZXRob2QsIGl0cyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3NcbiAgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgdG8gYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0IG5lZWRzLCBmb3JcbiAgIGV4YW1wbGUsICJvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKSIuXG5cbiAgIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbFxuICAgICBtZXRob2RzIGFzIHRoZSByZXN1bHQgb2YgaW1wbGljaXQgaW52b2NhdGlvbiB2aWEgbGFuZ3VhZ2Ugc3ludGF4XG4gICAgIG9yIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlICpTcGVjaWFsIG1ldGhvZCBsb29rdXAqLlxuXG5vYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gIFRoaXMgaXMgY2FsbGVkXG4gICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGVcbiAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZVxuICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG5cbiAgIElmICJfX3NldGF0dHJfXygpIiB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdFxuICAgc2hvdWxkIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yIGV4YW1wbGUsXG4gICAib2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKSIuXG5cbm9iamVjdC5fX2RlbGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBMaWtlICJfX3NldGF0dHJfXygpIiBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mXG4gICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiAiZGVsIG9iai5uYW1lIiBpc1xuICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC5cblxub2JqZWN0Ll9fZGlyX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gImRpcigpIiBpcyBjYWxsZWQgb24gdGhlIG9iamVjdC4gQSBzZXF1ZW5jZSBtdXN0IGJlXG4gICByZXR1cm5lZC4gImRpcigpIiBjb252ZXJ0cyB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgdG8gYSBsaXN0IGFuZFxuICAgc29ydHMgaXQuXG5cblxuSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3NcbmNvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSBhcHBlYXJzIGluIGFuXG4qb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXJcJ3MgY2xhc3NcbmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGVcbmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xudGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzXCcgIl9fZGljdF9fIi5cblxub2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKVxuXG4gICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyBhdHRyaWJ1dGVcbiAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgYXR0cmlidXRlXG4gICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICppbnN0YW5jZSogaXMgdGhlXG4gICBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsIG9yICJOb25lIiB3aGVuXG4gICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzIG1ldGhvZCBzaG91bGRcbiAgIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gIkF0dHJpYnV0ZUVycm9yIlxuICAgZXhjZXB0aW9uLlxuXG5vYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lclxuICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG5cbm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGVcbiAgIG93bmVyIGNsYXNzLlxuXG5UaGUgYXR0cmlidXRlICJfX29iamNsYXNzX18iIGlzIGludGVycHJldGVkIGJ5IHRoZSAiaW5zcGVjdCIgbW9kdWxlIGFzXG5zcGVjaWZ5aW5nIHRoZSBjbGFzcyB3aGVyZSB0aGlzIG9iamVjdCB3YXMgZGVmaW5lZCAoc2V0dGluZyB0aGlzXG5hcHByb3ByaWF0ZWx5IGNhbiBhc3Npc3QgaW4gcnVudGltZSBpbnRyb3NwZWN0aW9uIG9mIGR5bmFtaWMgY2xhc3NcbmF0dHJpYnV0ZXMpLiBGb3IgY2FsbGFibGVzLCBpdCBtYXkgaW5kaWNhdGUgdGhhdCBhbiBpbnN0YW5jZSBvZiB0aGVcbmdpdmVuIHR5cGUgKG9yIGEgc3ViY2xhc3MpIGlzIGV4cGVjdGVkIG9yIHJlcXVpcmVkIGFzIHRoZSBmaXJzdFxucG9zaXRpb25hbCBhcmd1bWVudCAoZm9yIGV4YW1wbGUsIENQeXRob24gc2V0cyB0aGlzIGF0dHJpYnV0ZSBmb3JcbnVuYm91bmQgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBDKS5cblxuXG5JbnZva2luZyBEZXNjcmlwdG9yc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAiYmluZGluZ1xuYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHNcbmluIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiLCBhbmRcbiJfX2RlbGV0ZV9fKCkiLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gb2JqZWN0LCBpdFxuaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG5cblRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciBkZWxldGVcbnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3RcJ3MgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCAiYS54IiBoYXMgYVxubG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggImEuX19kaWN0X19bXCd4XCddIiwgdGhlblxuInR5cGUoYSkuX19kaWN0X19bXCd4XCddIiwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgYmFzZSBjbGFzc2VzIG9mXG4idHlwZShhKSIgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLlxuXG5Ib3dldmVyLCBpZiB0aGUgbG9va2VkLXVwIHZhbHVlIGlzIGFuIG9iamVjdCBkZWZpbmluZyBvbmUgb2YgdGhlXG5kZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmRcbmludm9rZSB0aGUgZGVzY3JpcHRvciBtZXRob2QgaW5zdGVhZC4gIFdoZXJlIHRoaXMgb2NjdXJzIGluIHRoZVxucHJlY2VkZW5jZSBjaGFpbiBkZXBlbmRzIG9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyB3ZXJlIGRlZmluZWQgYW5kXG5ob3cgdGhleSB3ZXJlIGNhbGxlZC5cblxuVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCAiYS54Ii4gSG93XG50aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiAiYSI6XG5cbkRpcmVjdCBDYWxsXG4gICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5XG4gICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgICJ4Ll9fZ2V0X18oYSkiLlxuXG5JbnN0YW5jZSBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGFuIG9iamVjdCBpbnN0YW5jZSwgImEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGVcbiAgIGNhbGw6ICJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKGEsIHR5cGUoYSkpIi5cblxuQ2xhc3MgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhIGNsYXNzLCAiQS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBjYWxsOlxuICAgIkEuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oTm9uZSwgQSkiLlxuXG5TdXBlciBCaW5kaW5nXG4gICBJZiAiYSIgaXMgYW4gaW5zdGFuY2Ugb2YgInN1cGVyIiwgdGhlbiB0aGUgYmluZGluZyAic3VwZXIoQixcbiAgIG9iaikubSgpIiBzZWFyY2hlcyAib2JqLl9fY2xhc3NfXy5fX21yb19fIiBmb3IgdGhlIGJhc2UgY2xhc3MgIkEiXG4gICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgIkIiIGFuZCB0aGVuIGludm9rZXMgdGhlIGRlc2NyaXB0b3Igd2l0aCB0aGVcbiAgIGNhbGw6ICJBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXykiLlxuXG5Gb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBkZXBlbmRzXG5vbiB0aGUgd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgQSBkZXNjcmlwdG9yIGNhbiBkZWZpbmVcbmFueSBjb21iaW5hdGlvbiBvZiAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIgYW5kICJfX2RlbGV0ZV9fKCkiLiAgSWYgaXRcbmRvZXMgbm90IGRlZmluZSAiX19nZXRfXygpIiwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsIHJldHVyblxudGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGUgb2JqZWN0XCdzXG5pbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyAiX19zZXRfXygpIiBhbmQvb3JcbiJfX2RlbGV0ZV9fKCkiLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lcyBuZWl0aGVyLCBpdCBpc1xuYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnMgZGVmaW5lIGJvdGhcbiJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIiwgd2hpbGUgbm9uLWRhdGEgZGVzY3JpcHRvcnMgaGF2ZSBqdXN0IHRoZVxuIl9fZ2V0X18oKSIgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoICJfX3NldF9fKCkiIGFuZCAiX19nZXRfXygpIlxuZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb24gaW4gYW4gaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluXG5jb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzLlxuXG5QeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nICJzdGF0aWNtZXRob2QoKSIgYW5kICJjbGFzc21ldGhvZCgpIikgYXJlXG5pbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuXG5yZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRvXG5hY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcy5cblxuVGhlICJwcm9wZXJ0eSgpIiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgZGVzY3JpcHRvci5cbkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LlxuXG5cbl9fc2xvdHNfX1xuLS0tLS0tLS0tXG5cbkJ5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBjbGFzc2VzIGhhdmUgYSBkaWN0aW9uYXJ5IGZvciBhdHRyaWJ1dGVcbnN0b3JhZ2UuICBUaGlzIHdhc3RlcyBzcGFjZSBmb3Igb2JqZWN0cyBoYXZpbmcgdmVyeSBmZXcgaW5zdGFuY2VcbnZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lIGFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2Vcbm51bWJlcnMgb2YgaW5zdGFuY2VzLlxuXG5UaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyAqX19zbG90c19fKiBpbiBhIGNsYXNzXG5kZWZpbml0aW9uLiBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSBvZiBpbnN0YW5jZVxudmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvIGhvbGQgYVxudmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICpfX2RpY3RfXyogaXMgbm90XG5jcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuXG5vYmplY3QuX19zbG90c19fXG5cbiAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCBpdGVyYWJsZSwgb3Igc2VxdWVuY2VcbiAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gICpfX3Nsb3RzX18qXG4gICByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlXG4gICBhdXRvbWF0aWMgY3JlYXRpb24gb2YgKl9fZGljdF9fKiBhbmQgKl9fd2Vha3JlZl9fKiBmb3IgZWFjaFxuICAgaW5zdGFuY2UuXG5cblxuTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXypcbn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+XG5cbiogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgKl9fZGljdF9fKlxuICBhdHRyaWJ1dGUgb2YgdGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NpYmxlLCBzbyBhICpfX3Nsb3RzX18qXG4gIGRlZmluaXRpb24gaW4gdGhlIHN1YmNsYXNzIGlzIG1lYW5pbmdsZXNzLlxuXG4qIFdpdGhvdXQgYSAqX19kaWN0X18qIHZhcmlhYmxlLCBpbnN0YW5jZXMgY2Fubm90IGJlIGFzc2lnbmVkIG5ld1xuICB2YXJpYWJsZXMgbm90IGxpc3RlZCBpbiB0aGUgKl9fc2xvdHNfXyogZGVmaW5pdGlvbi4gIEF0dGVtcHRzIHRvXG4gIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyAiQXR0cmlidXRlRXJyb3IiLiBJZlxuICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZFxuICAiXCdfX2RpY3RfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXNcbiAgZGVmaW5pbmcgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvIGl0c1xuICBpbnN0YW5jZXMuIElmIHdlYWsgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZFxuICAiXCdfX3dlYWtyZWZfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZ1xuICBkZXNjcmlwdG9ycyAoKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyopIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUuICBBc1xuICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yXG4gIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSBjbGFzc1xuICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG5cbiogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzXG4gIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSAqX19kaWN0X18qXG4gIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lc1xuICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cblxuKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZVxuICBpbnN0YW5jZSB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlXG4gIChleGNlcHQgYnkgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS5cbiAgVGhpcyByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGFcbiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cblxuKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbVxuICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzICJpbnQiLCAiYnl0ZXMiIGFuZCAidHVwbGUiLlxuXG4qIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAqX19zbG90c19fKi4gTWFwcGluZ3NcbiAgbWF5IGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nIG1heSBiZVxuICBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuXG5cbiogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lXG4gICpfX3Nsb3RzX18qLlxuXG5cbkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5CeSBkZWZhdWx0LCBjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyAidHlwZSgpIi4gVGhlIGNsYXNzIGJvZHkgaXNcbmV4ZWN1dGVkIGluIGEgbmV3IG5hbWVzcGFjZSBhbmQgdGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgbG9jYWxseSB0byB0aGVcbnJlc3VsdCBvZiAidHlwZShuYW1lLCBiYXNlcywgbmFtZXNwYWNlKSIuXG5cblRoZSBjbGFzcyBjcmVhdGlvbiBwcm9jZXNzIGNhbiBiZSBjdXN0b21pc2VkIGJ5IHBhc3NpbmcgdGhlXG4ibWV0YWNsYXNzIiBrZXl3b3JkIGFyZ3VtZW50IGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGxpbmUsIG9yIGJ5XG5pbmhlcml0aW5nIGZyb20gYW4gZXhpc3RpbmcgY2xhc3MgdGhhdCBpbmNsdWRlZCBzdWNoIGFuIGFyZ3VtZW50LiBJblxudGhlIGZvbGxvd2luZyBleGFtcGxlLCBib3RoICJNeUNsYXNzIiBhbmQgIk15U3ViY2xhc3MiIGFyZSBpbnN0YW5jZXNcbm9mICJNZXRhIjpcblxuICAgY2xhc3MgTWV0YSh0eXBlKTpcbiAgICAgICBwYXNzXG5cbiAgIGNsYXNzIE15Q2xhc3MobWV0YWNsYXNzPU1ldGEpOlxuICAgICAgIHBhc3NcblxuICAgY2xhc3MgTXlTdWJjbGFzcyhNeUNsYXNzKTpcbiAgICAgICBwYXNzXG5cbkFueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb25cbmFyZSBwYXNzZWQgdGhyb3VnaCB0byBhbGwgbWV0YWNsYXNzIG9wZXJhdGlvbnMgZGVzY3JpYmVkIGJlbG93LlxuXG5XaGVuIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyBleGVjdXRlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBvY2N1cjpcblxuKiB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGlzIGRldGVybWluZWRcblxuKiB0aGUgY2xhc3MgbmFtZXNwYWNlIGlzIHByZXBhcmVkXG5cbiogdGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWRcblxuKiB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWRcblxuXG5EZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgZm9yIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyBkZXRlcm1pbmVkIGFzXG5mb2xsb3dzOlxuXG4qIGlmIG5vIGJhc2VzIGFuZCBubyBleHBsaWNpdCBtZXRhY2xhc3MgYXJlIGdpdmVuLCB0aGVuICJ0eXBlKCkiIGlzXG4gIHVzZWRcblxuKiBpZiBhbiBleHBsaWNpdCBtZXRhY2xhc3MgaXMgZ2l2ZW4gYW5kIGl0IGlzICpub3QqIGFuIGluc3RhbmNlIG9mXG4gICJ0eXBlKCkiLCB0aGVuIGl0IGlzIHVzZWQgZGlyZWN0bHkgYXMgdGhlIG1ldGFjbGFzc1xuXG4qIGlmIGFuIGluc3RhbmNlIG9mICJ0eXBlKCkiIGlzIGdpdmVuIGFzIHRoZSBleHBsaWNpdCBtZXRhY2xhc3MsIG9yXG4gIGJhc2VzIGFyZSBkZWZpbmVkLCB0aGVuIHRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIHVzZWRcblxuVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgc2VsZWN0ZWQgZnJvbSB0aGUgZXhwbGljaXRseSBzcGVjaWZpZWRcbm1ldGFjbGFzcyAoaWYgYW55KSBhbmQgdGhlIG1ldGFjbGFzc2VzIChpLmUuICJ0eXBlKGNscykiKSBvZiBhbGxcbnNwZWNpZmllZCBiYXNlIGNsYXNzZXMuIFRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIG9uZSB3aGljaCBpcyBhXG5zdWJ0eXBlIG9mICphbGwqIG9mIHRoZXNlIGNhbmRpZGF0ZSBtZXRhY2xhc3Nlcy4gSWYgbm9uZSBvZiB0aGVcbmNhbmRpZGF0ZSBtZXRhY2xhc3NlcyBtZWV0cyB0aGF0IGNyaXRlcmlvbiwgdGhlbiB0aGUgY2xhc3MgZGVmaW5pdGlvblxud2lsbCBmYWlsIHdpdGggIlR5cGVFcnJvciIuXG5cblxuUHJlcGFyaW5nIHRoZSBjbGFzcyBuYW1lc3BhY2Vcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbk9uY2UgdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBoYXMgYmVlbiBpZGVudGlmaWVkLCB0aGVuIHRoZSBjbGFzc1xubmFtZXNwYWNlIGlzIHByZXBhcmVkLiBJZiB0aGUgbWV0YWNsYXNzIGhhcyBhICJfX3ByZXBhcmVfXyIgYXR0cmlidXRlLFxuaXQgaXMgY2FsbGVkIGFzICJuYW1lc3BhY2UgPSBtZXRhY2xhc3MuX19wcmVwYXJlX18obmFtZSwgYmFzZXMsXG4qKmt3ZHMpIiAod2hlcmUgdGhlIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGlmIGFueSwgY29tZSBmcm9tXG50aGUgY2xhc3MgZGVmaW5pdGlvbikuXG5cbklmIHRoZSBtZXRhY2xhc3MgaGFzIG5vICJfX3ByZXBhcmVfXyIgYXR0cmlidXRlLCB0aGVuIHRoZSBjbGFzc1xubmFtZXNwYWNlIGlzIGluaXRpYWxpc2VkIGFzIGFuIGVtcHR5ICJkaWN0KCkiIGluc3RhbmNlLlxuXG5TZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMwMDBcblxuICAgICBJbnRyb2R1Y2VkIHRoZSAiX19wcmVwYXJlX18iIG5hbWVzcGFjZSBob29rXG5cblxuRXhlY3V0aW5nIHRoZSBjbGFzcyBib2R5XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWQgKGFwcHJveGltYXRlbHkpIGFzICJleGVjKGJvZHksIGdsb2JhbHMoKSxcbm5hbWVzcGFjZSkiLiBUaGUga2V5IGRpZmZlcmVuY2UgZnJvbSBhIG5vcm1hbCBjYWxsIHRvICJleGVjKCkiIGlzIHRoYXRcbmxleGljYWwgc2NvcGluZyBhbGxvd3MgdGhlIGNsYXNzIGJvZHkgKGluY2x1ZGluZyBhbnkgbWV0aG9kcykgdG9cbnJlZmVyZW5jZSBuYW1lcyBmcm9tIHRoZSBjdXJyZW50IGFuZCBvdXRlciBzY29wZXMgd2hlbiB0aGUgY2xhc3NcbmRlZmluaXRpb24gb2NjdXJzIGluc2lkZSBhIGZ1bmN0aW9uLlxuXG5Ib3dldmVyLCBldmVuIHdoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gb2NjdXJzIGluc2lkZSB0aGUgZnVuY3Rpb24sXG5tZXRob2RzIGRlZmluZWQgaW5zaWRlIHRoZSBjbGFzcyBzdGlsbCBjYW5ub3Qgc2VlIG5hbWVzIGRlZmluZWQgYXQgdGhlXG5jbGFzcyBzY29wZS4gQ2xhc3MgdmFyaWFibGVzIG11c3QgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgZmlyc3RcbnBhcmFtZXRlciBvZiBpbnN0YW5jZSBvciBjbGFzcyBtZXRob2RzLCBhbmQgY2Fubm90IGJlIGFjY2Vzc2VkIGF0IGFsbFxuZnJvbSBzdGF0aWMgbWV0aG9kcy5cblxuXG5DcmVhdGluZyB0aGUgY2xhc3Mgb2JqZWN0XG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbk9uY2UgdGhlIGNsYXNzIG5hbWVzcGFjZSBoYXMgYmVlbiBwb3B1bGF0ZWQgYnkgZXhlY3V0aW5nIHRoZSBjbGFzc1xuYm9keSwgdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgIm1ldGFjbGFzcyhuYW1lLCBiYXNlcyxcbm5hbWVzcGFjZSwgKiprd2RzKSIgKHRoZSBhZGRpdGlvbmFsIGtleXdvcmRzIHBhc3NlZCBoZXJlIGFyZSB0aGUgc2FtZVxuYXMgdGhvc2UgcGFzc2VkIHRvICJfX3ByZXBhcmVfXyIpLlxuXG5UaGlzIGNsYXNzIG9iamVjdCBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSB6ZXJvLVxuYXJndW1lbnQgZm9ybSBvZiAic3VwZXIoKSIuICJfX2NsYXNzX18iIGlzIGFuIGltcGxpY2l0IGNsb3N1cmVcbnJlZmVyZW5jZSBjcmVhdGVkIGJ5IHRoZSBjb21waWxlciBpZiBhbnkgbWV0aG9kcyBpbiBhIGNsYXNzIGJvZHkgcmVmZXJcbnRvIGVpdGhlciAiX19jbGFzc19fIiBvciAic3VwZXIiLiBUaGlzIGFsbG93cyB0aGUgemVybyBhcmd1bWVudCBmb3JtXG5vZiAic3VwZXIoKSIgdG8gY29ycmVjdGx5IGlkZW50aWZ5IHRoZSBjbGFzcyBiZWluZyBkZWZpbmVkIGJhc2VkIG9uXG5sZXhpY2FsIHNjb3BpbmcsIHdoaWxlIHRoZSBjbGFzcyBvciBpbnN0YW5jZSB0aGF0IHdhcyB1c2VkIHRvIG1ha2UgdGhlXG5jdXJyZW50IGNhbGwgaXMgaWRlbnRpZmllZCBiYXNlZCBvbiB0aGUgZmlyc3QgYXJndW1lbnQgcGFzc2VkIHRvIHRoZVxubWV0aG9kLlxuXG5BZnRlciB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGlzIHBhc3NlZCB0byB0aGUgY2xhc3NcbmRlY29yYXRvcnMgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gKGlmIGFueSkgYW5kIHRoZSByZXN1bHRpbmdcbm9iamVjdCBpcyBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGFzIHRoZSBkZWZpbmVkIGNsYXNzLlxuXG5XaGVuIGEgbmV3IGNsYXNzIGlzIGNyZWF0ZWQgYnkgInR5cGUuX19uZXdfXyIsIHRoZSBvYmplY3QgcHJvdmlkZWQgYXNcbnRoZSBuYW1lc3BhY2UgcGFyYW1ldGVyIGlzIGNvcGllZCB0byBhIHN0YW5kYXJkIFB5dGhvbiBkaWN0aW9uYXJ5IGFuZFxudGhlIG9yaWdpbmFsIG9iamVjdCBpcyBkaXNjYXJkZWQuIFRoZSBuZXcgY29weSBiZWNvbWVzIHRoZSAiX19kaWN0X18iXG5hdHRyaWJ1dGUgb2YgdGhlIGNsYXNzIG9iamVjdC5cblxuU2VlIGFsc286ICoqUEVQIDMxMzUqKiAtIE5ldyBzdXBlclxuXG4gICAgIERlc2NyaWJlcyB0aGUgaW1wbGljaXQgIl9fY2xhc3NfXyIgY2xvc3VyZSByZWZlcmVuY2VcblxuXG5NZXRhY2xhc3MgZXhhbXBsZVxuLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzIHRoYXQgaGF2ZVxuYmVlbiBleHBsb3JlZCBpbmNsdWRlIGxvZ2dpbmcsIGludGVyZmFjZSBjaGVja2luZywgYXV0b21hdGljXG5kZWxlZ2F0aW9uLCBhdXRvbWF0aWMgcHJvcGVydHkgY3JlYXRpb24sIHByb3hpZXMsIGZyYW1ld29ya3MsIGFuZFxuYXV0b21hdGljIHJlc291cmNlIGxvY2tpbmcvc3luY2hyb25pemF0aW9uLlxuXG5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRhY2xhc3MgdGhhdCB1c2VzIGFuXG4iY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiIHRvIHJlbWVtYmVyIHRoZSBvcmRlciB0aGF0IGNsYXNzIHZhcmlhYmxlc1xuYXJlIGRlZmluZWQ6XG5cbiAgIGNsYXNzIE9yZGVyZWRDbGFzcyh0eXBlKTpcblxuICAgICAgIEBjbGFzc21ldGhvZFxuICAgICAgIGRlZiBfX3ByZXBhcmVfXyhtZXRhY2xzLCBuYW1lLCBiYXNlcywgKiprd2RzKTpcbiAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KClcblxuICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgKiprd2RzKTpcbiAgICAgICAgICAgcmVzdWx0ID0gdHlwZS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsIGRpY3QobmFtZXNwYWNlKSlcbiAgICAgICAgICAgcmVzdWx0Lm1lbWJlcnMgPSB0dXBsZShuYW1lc3BhY2UpXG4gICAgICAgICAgIHJldHVybiByZXN1bHRcblxuICAgY2xhc3MgQShtZXRhY2xhc3M9T3JkZXJlZENsYXNzKTpcbiAgICAgICBkZWYgb25lKHNlbGYpOiBwYXNzXG4gICAgICAgZGVmIHR3byhzZWxmKTogcGFzc1xuICAgICAgIGRlZiB0aHJlZShzZWxmKTogcGFzc1xuICAgICAgIGRlZiBmb3VyKHNlbGYpOiBwYXNzXG5cbiAgID4+PiBBLm1lbWJlcnNcbiAgIChcJ19fbW9kdWxlX19cJywgXCdvbmVcJywgXCd0d29cJywgXCd0aHJlZVwnLCBcJ2ZvdXJcJylcblxuV2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBmb3IgKkEqIGdldHMgZXhlY3V0ZWQsIHRoZSBwcm9jZXNzIGJlZ2luc1xud2l0aCBjYWxsaW5nIHRoZSBtZXRhY2xhc3NcJ3MgIl9fcHJlcGFyZV9fKCkiIG1ldGhvZCB3aGljaCByZXR1cm5zIGFuXG5lbXB0eSAiY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiLiAgVGhhdCBtYXBwaW5nIHJlY29yZHMgdGhlIG1ldGhvZHMgYW5kXG5hdHRyaWJ1dGVzIG9mICpBKiBhcyB0aGV5IGFyZSBkZWZpbmVkIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgY2xhc3NcbnN0YXRlbWVudC4gT25jZSB0aG9zZSBkZWZpbml0aW9ucyBhcmUgZXhlY3V0ZWQsIHRoZSBvcmRlcmVkIGRpY3Rpb25hcnlcbmlzIGZ1bGx5IHBvcHVsYXRlZCBhbmQgdGhlIG1ldGFjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgZ2V0c1xuaW52b2tlZC4gIFRoYXQgbWV0aG9kIGJ1aWxkcyB0aGUgbmV3IHR5cGUgYW5kIGl0IHNhdmVzIHRoZSBvcmRlcmVkXG5kaWN0aW9uYXJ5IGtleXMgaW4gYW4gYXR0cmlidXRlIGNhbGxlZCAibWVtYmVycyIuXG5cblxuQ3VzdG9taXppbmcgaW5zdGFuY2UgYW5kIHN1YmNsYXNzIGNoZWNrc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgdGhlXG4iaXNpbnN0YW5jZSgpIiBhbmQgImlzc3ViY2xhc3MoKSIgYnVpbHQtaW4gZnVuY3Rpb25zLlxuXG5JbiBwYXJ0aWN1bGFyLCB0aGUgbWV0YWNsYXNzICJhYmMuQUJDTWV0YSIgaW1wbGVtZW50cyB0aGVzZSBtZXRob2RzIGluXG5vcmRlciB0byBhbGxvdyB0aGUgYWRkaXRpb24gb2YgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChBQkNzKSBhc1xuInZpcnR1YWwgYmFzZSBjbGFzc2VzIiB0byBhbnkgY2xhc3Mgb3IgdHlwZSAoaW5jbHVkaW5nIGJ1aWx0LWluXG50eXBlcyksIGluY2x1ZGluZyBvdGhlciBBQkNzLlxuXG5jbGFzcy5fX2luc3RhbmNlY2hlY2tfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgUmV0dXJuIHRydWUgaWYgKmluc3RhbmNlKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3Qgb3JcbiAgIGluZGlyZWN0KSBpbnN0YW5jZSBvZiAqY2xhc3MqLiBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50XG4gICAiaXNpbnN0YW5jZShpbnN0YW5jZSwgY2xhc3MpIi5cblxuY2xhc3MuX19zdWJjbGFzc2NoZWNrX18oc2VsZiwgc3ViY2xhc3MpXG5cbiAgIFJldHVybiB0cnVlIGlmICpzdWJjbGFzcyogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgc3ViY2xhc3Mgb2YgKmNsYXNzKi4gIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnRcbiAgICJpc3N1YmNsYXNzKHN1YmNsYXNzLCBjbGFzcykiLlxuXG5Ob3RlIHRoYXQgdGhlc2UgbWV0aG9kcyBhcmUgbG9va2VkIHVwIG9uIHRoZSB0eXBlIChtZXRhY2xhc3MpIG9mIGFcbmNsYXNzLiAgVGhleSBjYW5ub3QgYmUgZGVmaW5lZCBhcyBjbGFzcyBtZXRob2RzIGluIHRoZSBhY3R1YWwgY2xhc3MuXG5UaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbG9va3VwIG9mIHNwZWNpYWwgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWRcbm9uIGluc3RhbmNlcywgb25seSBpbiB0aGlzIGNhc2UgdGhlIGluc3RhbmNlIGlzIGl0c2VsZiBhIGNsYXNzLlxuXG5TZWUgYWxzbzogKipQRVAgMzExOSoqIC0gSW50cm9kdWNpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzXG5cbiAgICAgSW5jbHVkZXMgdGhlIHNwZWNpZmljYXRpb24gZm9yIGN1c3RvbWl6aW5nICJpc2luc3RhbmNlKCkiIGFuZFxuICAgICAiaXNzdWJjbGFzcygpIiBiZWhhdmlvciB0aHJvdWdoICJfX2luc3RhbmNlY2hlY2tfXygpIiBhbmRcbiAgICAgIl9fc3ViY2xhc3NjaGVja19fKCkiLCB3aXRoIG1vdGl2YXRpb24gZm9yIHRoaXMgZnVuY3Rpb25hbGl0eSBpblxuICAgICB0aGUgY29udGV4dCBvZiBhZGRpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChzZWUgdGhlICJhYmMiXG4gICAgIG1vZHVsZSkgdG8gdGhlIGxhbmd1YWdlLlxuXG5cbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsICJ4KGFyZzEsIGFyZzIsIC4uLikiIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgInguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKSIuXG5cblxuRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLlxuQ29udGFpbmVycyB1c3VhbGx5IGFyZSBzZXF1ZW5jZXMgKHN1Y2ggYXMgbGlzdHMgb3IgdHVwbGVzKSBvciBtYXBwaW5nc1xuKGxpa2UgZGljdGlvbmFyaWVzKSwgYnV0IGNhbiByZXByZXNlbnQgb3RoZXIgY29udGFpbmVycyBhcyB3ZWxsLiAgVGhlXG5maXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2Ugb3IgdG9cbmVtdWxhdGUgYSBtYXBwaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZvciBhIHNlcXVlbmNlLCB0aGVcbmFsbG93YWJsZSBrZXlzIHNob3VsZCBiZSB0aGUgaW50ZWdlcnMgKmsqIGZvciB3aGljaCAiMCA8PSBrIDwgTiIgd2hlcmVcbipOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2ggZGVmaW5lIGFcbnJhbmdlIG9mIGl0ZW1zLiAgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGUgdGhlXG5tZXRob2RzICJrZXlzKCkiLCAidmFsdWVzKCkiLCAiaXRlbXMoKSIsICJnZXQoKSIsICJjbGVhcigpIixcbiJzZXRkZWZhdWx0KCkiLCAicG9wKCkiLCAicG9waXRlbSgpIiwgImNvcHkoKSIsIGFuZCAidXBkYXRlKCkiXG5iZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob25cJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLlxuVGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlIHByb3ZpZGVzIGEgIk11dGFibGVNYXBwaW5nIiBhYnN0cmFjdCBiYXNlXG5jbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZiAiX19nZXRpdGVtX18oKSIsXG4iX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLiBNdXRhYmxlIHNlcXVlbmNlc1xuc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyAiYXBwZW5kKCkiLCAiY291bnQoKSIsICJpbmRleCgpIiwgImV4dGVuZCgpIixcbiJpbnNlcnQoKSIsICJwb3AoKSIsICJyZW1vdmUoKSIsICJyZXZlcnNlKCkiIGFuZCAic29ydCgpIiwgbGlrZSBQeXRob25cbnN0YW5kYXJkIGxpc3Qgb2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCBpbXBsZW1lbnRcbmFkZGl0aW9uIChtZWFuaW5nIGNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZ1xucmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlIG1ldGhvZHMgIl9fYWRkX18oKSIsICJfX3JhZGRfXygpIixcbiJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQgIl9faW11bF9fKCkiIGRlc2NyaWJlZFxuYmVsb3c7IHRoZXkgc2hvdWxkIG5vdCBkZWZpbmUgb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzXG5yZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG4iX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iIG9wZXJhdG9yO1xuZm9yIG1hcHBpbmdzLCAiaW4iIHNob3VsZCBzZWFyY2ggdGhlIG1hcHBpbmdcJ3Mga2V5czsgZm9yIHNlcXVlbmNlcywgaXRcbnNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlciByZWNvbW1lbmRlZCB0aGF0IGJvdGhcbm1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZSAiX19pdGVyX18oKSIgbWV0aG9kIHRvIGFsbG93XG5lZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlIGNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCAiX19pdGVyX18oKSJcbnNob3VsZCBiZSB0aGUgc2FtZSBhcyAia2V5cygpIjsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGVcbnRocm91Z2ggdGhlIHZhbHVlcy5cblxub2JqZWN0Ll9fbGVuX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIi4gIFNob3VsZCByZXR1cm5cbiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiBvYmplY3QgdGhhdFxuICAgZG9lc25cJ3QgZGVmaW5lIGEgIl9fYm9vbF9fKCkiIG1ldGhvZCBhbmQgd2hvc2UgIl9fbGVuX18oKSIgbWV0aG9kXG4gICByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhIEJvb2xlYW4gY29udGV4dC5cblxub2JqZWN0Ll9fbGVuZ3RoX2hpbnRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkIHJldHVybiBhblxuICAgZXN0aW1hdGVkIGxlbmd0aCBmb3IgdGhlIG9iamVjdCAod2hpY2ggbWF5IGJlIGdyZWF0ZXIgb3IgbGVzcyB0aGFuXG4gICB0aGUgYWN0dWFsIGxlbmd0aCkuIFRoZSBsZW5ndGggbXVzdCBiZSBhbiBpbnRlZ2VyICI+PSIgMC4gVGhpc1xuICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkIGZvclxuICAgY29ycmVjdG5lc3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuNC5cblxuTm90ZTogU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzLlxuICBBIGNhbGwgbGlrZVxuXG4gICAgIGFbMToyXSA9IGJcblxuICBpcyB0cmFuc2xhdGVkIHRvXG5cbiAgICAgYVtzbGljZSgxLCAyLCBOb25lKV0gPSBiXG5cbiAgYW5kIHNvIGZvcnRoLiAgTWlzc2luZyBzbGljZSBpdGVtcyBhcmUgYWx3YXlzIGZpbGxlZCBpbiB3aXRoICJOb25lIi5cblxub2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3Igc2VxdWVuY2UgdHlwZXMsXG4gICB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuICBOb3RlIHRoYXRcbiAgIHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZSBjbGFzcyB3aXNoZXNcbiAgIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC4gSWZcbiAgICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSwgIlR5cGVFcnJvciIgbWF5IGJlIHJhaXNlZDsgaWYgb2ZcbiAgIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAoYWZ0ZXIgYW55XG4gICBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksICJJbmRleEVycm9yIiBzaG91bGQgYmVcbiAgIHJhaXNlZC4gRm9yIG1hcHBpbmcgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiB0aGVcbiAgIGNvbnRhaW5lciksICJLZXlFcnJvciIgc2hvdWxkIGJlIHJhaXNlZC5cblxuICAgTm90ZTogImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgcmFpc2VkIGZvclxuICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZVxuICAgICBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIGJ5ICJkaWN0Ii4iX19nZXRpdGVtX18oKSIgdG8gaW1wbGVtZW50ICJzZWxmW2tleV0iIGZvciBkaWN0XG4gICBzdWJjbGFzc2VzIHdoZW4ga2V5IGlzIG5vdCBpbiB0aGUgZGljdGlvbmFyeS5cblxub2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgbmV3IGtleXNcbiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGVcbiAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yXG4gICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cblxub2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiAic2VsZltrZXldIi4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50c1xuICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZVxuICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAiX19nZXRpdGVtX18oKSIgbWV0aG9kLlxuXG5vYmplY3QuX19pdGVyX18oc2VsZilcblxuICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgY29udGFpbmVyLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gaXRlcmF0ZVxuICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQgc2hvdWxkXG4gICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lci5cblxuICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5IGFyZVxuICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvclxuICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouXG5cbm9iamVjdC5fX3JldmVyc2VkX18oc2VsZilcblxuICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgInJldmVyc2VkKCkiIGJ1aWx0LWluIHRvIGltcGxlbWVudFxuICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0XG4gICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluIHJldmVyc2Ugb3JkZXIuXG5cbiAgIElmIHRoZSAiX19yZXZlcnNlZF9fKCkiIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZSAicmV2ZXJzZWQoKSJcbiAgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZSBwcm90b2NvbCAoIl9fbGVuX18oKSJcbiAgIGFuZCAiX19nZXRpdGVtX18oKSIpLiAgT2JqZWN0cyB0aGF0IHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sXG4gICBzaG91bGQgb25seSBwcm92aWRlICJfX3JldmVyc2VkX18oKSIgaWYgdGhleSBjYW4gcHJvdmlkZSBhblxuICAgaW1wbGVtZW50YXRpb24gdGhhdCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnlcbiAgICJyZXZlcnNlZCgpIi5cblxuVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKCJpbiIgYW5kICJub3QgaW4iKSBhcmUgbm9ybWFsbHlcbmltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLCBjb250YWluZXJcbm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudFxuaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuXG5cbm9iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlXG4gICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyBvYmplY3RzLCB0aGlzXG4gICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvclxuICAgdGhlIGtleS1pdGVtIHBhaXJzLlxuXG4gICBGb3Igb2JqZWN0cyB0aGF0IGRvblwndCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiwgdGhlIG1lbWJlcnNoaXAgdGVzdFxuICAgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSAiX19pdGVyX18oKSIsIHRoZW4gdGhlIG9sZCBzZXF1ZW5jZVxuICAgaXRlcmF0aW9uIHByb3RvY29sIHZpYSAiX19nZXRpdGVtX18oKSIsIHNlZSAqdGhpcyBzZWN0aW9uIGluIHRoZVxuICAgbGFuZ3VhZ2UgcmVmZXJlbmNlKi5cblxuXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAiZGl2bW9kKCkiLFxuICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsIHRvXG4gICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYVxuICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyBjYWxsZWQuXG4gICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byB1c2luZ1xuICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgcmVsYXRlZCB0b1xuICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdFxuICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgYnVpbHQtaW5cbiAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuXG4gICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGVcbiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuXG5vYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICJkaXZtb2QoKSIsXG4gICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAoc3dhcHBlZClcbiAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCBvcGVyYW5kIGRvZXNcbiAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzIGFyZSBvZlxuICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCAtXG4gICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gIl9fcnN1Yl9fKCkiXG4gICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgcmV0dXJuc1xuICAgKk5vdEltcGxlbWVudGVkKi5cblxuICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAiX19ycG93X18oKSIgKHRoZVxuICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG5cbiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2RcbiAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdFxuICAgICBvcGVyYW5kXCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3Nlc1xuICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnNcJyBvcGVyYXRpb25zLlxuXG5vYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbWF0bXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljXG4gICBhc3NpZ25tZW50cyAoIis9IiwgIi09IiwgIio9IiwgIkA9IiwgIi89IiwgIi8vPSIsICIlPSIsICIqKj0iLFxuICAgIjw8PSIsICI+Pj0iLCAiJj0iLCAiXj0iLCAifD0iKS4gIFRoZXNlIG1ldGhvZHMgc2hvdWxkIGF0dGVtcHQgdG9cbiAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gdGhlIHJlc3VsdFxuICAgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSwgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWNcbiAgIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgdGhlIGF1Z21lbnRlZCBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlXG4gICBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3NcbiAgIHdpdGggYW4gIl9faWFkZF9fKCkiIG1ldGhvZCwgInggKz0geSIgaXMgZXF1aXZhbGVudCB0byAieCA9XG4gICB4Ll9faWFkZF9fKHkpIiAuIE90aGVyd2lzZSwgInguX19hZGRfXyh5KSIgYW5kICJ5Ll9fcmFkZF9fKHgpIiBhcmVcbiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gY2VydGFpblxuICAgc2l0dWF0aW9ucywgYXVnbWVudGVkIGFzc2lnbm1lbnQgY2FuIHJlc3VsdCBpbiB1bmV4cGVjdGVkIGVycm9yc1xuICAgKHNlZSAqV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbXCdpdGVtXCddIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZVxuICAgYWRkaXRpb24gd29ya3M/KiksIGJ1dCB0aGlzIGJlaGF2aW9yIGlzIGluIGZhY3QgcGFydCBvZiB0aGUgZGF0YVxuICAgbW9kZWwuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoIi0iLCAiKyIsXG4gICAiYWJzKCkiIGFuZCAifiIpLlxuXG5vYmplY3QuX19jb21wbGV4X18oc2VsZilcbm9iamVjdC5fX2ludF9fKHNlbGYpXG5vYmplY3QuX19mbG9hdF9fKHNlbGYpXG5vYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICJjb21wbGV4KCkiLCAiaW50KCkiLFxuICAgImZsb2F0KCkiIGFuZCAicm91bmQoKSIuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2YgdGhlIGFwcHJvcHJpYXRlXG4gICB0eXBlLlxuXG5vYmplY3QuX19pbmRleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm9wZXJhdG9yLmluZGV4KCkiLCBhbmQgd2hlbmV2ZXIgUHl0aG9uIG5lZWRzXG4gICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgb2JqZWN0IChzdWNoXG4gICBhcyBpbiBzbGljaW5nLCBvciBpbiB0aGUgYnVpbHQtaW4gImJpbigpIiwgImhleCgpIiBhbmQgIm9jdCgpIlxuICAgZnVuY3Rpb25zKS4gUHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaW5kaWNhdGVzIHRoYXQgdGhlIG51bWVyaWNcbiAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuXG4gICBOb3RlOiBJbiBvcmRlciB0byBoYXZlIGEgY29oZXJlbnQgaW50ZWdlciB0eXBlIGNsYXNzLCB3aGVuXG4gICAgICJfX2luZGV4X18oKSIgaXMgZGVmaW5lZCAiX19pbnRfXygpIiBzaG91bGQgYWxzbyBiZSBkZWZpbmVkLCBhbmRcbiAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuXG5cbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQSAqY29udGV4dCBtYW5hZ2VyKiBpcyBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBydW50aW1lIGNvbnRleHQgdG9cbmJlIGVzdGFibGlzaGVkIHdoZW4gZXhlY3V0aW5nIGEgIndpdGgiIHN0YXRlbWVudC4gVGhlIGNvbnRleHQgbWFuYWdlclxuaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWUgY29udGV4dFxuZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZSBub3JtYWxseVxuaW52b2tlZCB1c2luZyB0aGUgIndpdGgiIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb24gKlRoZSB3aXRoXG5zdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXIgbWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgIndpdGgiXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlICJhcyIgY2xhdXNlIG9mIHRoZSBzdGF0ZW1lbnQsIGlmIGFueS5cblxub2JqZWN0Ll9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjaylcblxuICAgRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSBwYXJhbWV0ZXJzXG4gICBkZXNjcmliZSB0aGUgZXhjZXB0aW9uIHRoYXQgY2F1c2VkIHRoZSBjb250ZXh0IHRvIGJlIGV4aXRlZC4gSWYgdGhlXG4gICBjb250ZXh0IHdhcyBleGl0ZWQgd2l0aG91dCBhbiBleGNlcHRpb24sIGFsbCB0aHJlZSBhcmd1bWVudHMgd2lsbFxuICAgYmUgIk5vbmUiLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCAiX19leGl0X18oKSIgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOiAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG5cbiAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAid2l0aCJcbiAgICAgc3RhdGVtZW50LlxuXG5cblNwZWNpYWwgbWV0aG9kIGxvb2t1cFxuPT09PT09PT09PT09PT09PT09PT09XG5cbkZvciBjdXN0b20gY2xhc3NlcywgaW1wbGljaXQgaW52b2NhdGlvbnMgb2Ygc3BlY2lhbCBtZXRob2RzIGFyZSBvbmx5XG5ndWFyYW50ZWVkIHRvIHdvcmsgY29ycmVjdGx5IGlmIGRlZmluZWQgb24gYW4gb2JqZWN0XCdzIHR5cGUsIG5vdCBpblxudGhlIG9iamVjdFwncyBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgVGhhdCBiZWhhdmlvdXIgaXMgdGhlIHJlYXNvbiB3aHlcbnRoZSBmb2xsb3dpbmcgY29kZSByYWlzZXMgYW4gZXhjZXB0aW9uOlxuXG4gICA+Pj4gY2xhc3MgQzpcbiAgIC4uLiAgICAgcGFzc1xuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMuX19sZW5fXyA9IGxhbWJkYTogNVxuICAgPj4+IGxlbihjKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgVHlwZUVycm9yOiBvYmplY3Qgb2YgdHlwZSBcJ0NcJyBoYXMgbm8gbGVuKClcblxuVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBiZWhhdmlvdXIgbGllcyB3aXRoIGEgbnVtYmVyIG9mIHNwZWNpYWxcbm1ldGhvZHMgc3VjaCBhcyAiX19oYXNoX18oKSIgYW5kICJfX3JlcHJfXygpIiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBieVxuYWxsIG9iamVjdHMsIGluY2x1ZGluZyB0eXBlIG9iamVjdHMuIElmIHRoZSBpbXBsaWNpdCBsb29rdXAgb2YgdGhlc2Vcbm1ldGhvZHMgdXNlZCB0aGUgY29udmVudGlvbmFsIGxvb2t1cCBwcm9jZXNzLCB0aGV5IHdvdWxkIGZhaWwgd2hlblxuaW52b2tlZCBvbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmOlxuXG4gICA+Pj4gMSAuX19oYXNoX18oKSA9PSBoYXNoKDEpXG4gICBUcnVlXG4gICA+Pj4gaW50Ll9faGFzaF9fKCkgPT0gaGFzaChpbnQpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBUeXBlRXJyb3I6IGRlc2NyaXB0b3IgXCdfX2hhc2hfX1wnIG9mIFwnaW50XCcgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XG5cbkluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8gaW52b2tlIGFuIHVuYm91bmQgbWV0aG9kIG9mIGEgY2xhc3MgaW4gdGhpc1xud2F5IGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBcJ21ldGFjbGFzcyBjb25mdXNpb25cJywgYW5kIGlzIGF2b2lkZWRcbmJ5IGJ5cGFzc2luZyB0aGUgaW5zdGFuY2Ugd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kczpcblxuICAgPj4+IHR5cGUoMSkuX19oYXNoX18oMSkgPT0gaGFzaCgxKVxuICAgVHJ1ZVxuICAgPj4+IHR5cGUoaW50KS5fX2hhc2hfXyhpbnQpID09IGhhc2goaW50KVxuICAgVHJ1ZVxuXG5JbiBhZGRpdGlvbiB0byBieXBhc3NpbmcgYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgaW4gdGhlIGludGVyZXN0IG9mXG5jb3JyZWN0bmVzcywgaW1wbGljaXQgc3BlY2lhbCBtZXRob2QgbG9va3VwIGdlbmVyYWxseSBhbHNvIGJ5cGFzc2VzXG50aGUgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGV2ZW4gb2YgdGhlIG9iamVjdFwncyBtZXRhY2xhc3M6XG5cbiAgID4+PiBjbGFzcyBNZXRhKHR5cGUpOlxuICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6XG4gICAuLi4gICAgICAgICBwcmludCgiTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIilcbiAgIC4uLiAgICAgICAgIHJldHVybiB0eXBlLl9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4gICAuLi5cbiAgID4+PiBjbGFzcyBDKG9iamVjdCwgbWV0YWNsYXNzPU1ldGEpOlxuICAgLi4uICAgICBkZWYgX19sZW5fXyhzZWxmKTpcbiAgIC4uLiAgICAgICAgIHJldHVybiAxMFxuICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6XG4gICAuLi4gICAgICAgICBwcmludCgiQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKVxuICAgLi4uICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKVxuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMuX19sZW5fXygpICAgICAgICAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgaW5zdGFuY2VcbiAgIENsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4gICAxMFxuICAgPj4+IHR5cGUoYykuX19sZW5fXyhjKSAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgdHlwZVxuICAgTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4gICAxMFxuICAgPj4+IGxlbihjKSAgICAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0IGxvb2t1cFxuICAgMTBcblxuQnlwYXNzaW5nIHRoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtYWNoaW5lcnkgaW4gdGhpcyBmYXNoaW9uIHByb3ZpZGVzXG5zaWduaWZpY2FudCBzY29wZSBmb3Igc3BlZWQgb3B0aW1pc2F0aW9ucyB3aXRoaW4gdGhlIGludGVycHJldGVyLCBhdFxudGhlIGNvc3Qgb2Ygc29tZSBmbGV4aWJpbGl0eSBpbiB0aGUgaGFuZGxpbmcgb2Ygc3BlY2lhbCBtZXRob2RzICh0aGVcbnNwZWNpYWwgbWV0aG9kICptdXN0KiBiZSBzZXQgb24gdGhlIGNsYXNzIG9iamVjdCBpdHNlbGYgaW4gb3JkZXIgdG8gYmVcbmNvbnNpc3RlbnRseSBpbnZva2VkIGJ5IHRoZSBpbnRlcnByZXRlcikuXG4nLAotICdzdHJpbmctbWV0aG9kcyc6IHUnXG5TdHJpbmcgTWV0aG9kc1xuKioqKioqKioqKioqKipcblxuU3RyaW5ncyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBzZXF1ZW5jZSBvcGVyYXRpb25zLCBhbG9uZyB3aXRoXG50aGUgYWRkaXRpb25hbCBtZXRob2RzIGRlc2NyaWJlZCBiZWxvdy5cblxuU3RyaW5ncyBhbHNvIHN1cHBvcnQgdHdvIHN0eWxlcyBvZiBzdHJpbmcgZm9ybWF0dGluZywgb25lIHByb3ZpZGluZyBhXG5sYXJnZSBkZWdyZWUgb2YgZmxleGliaWxpdHkgYW5kIGN1c3RvbWl6YXRpb24gKHNlZSAic3RyLmZvcm1hdCgpIixcbipGb3JtYXQgU3RyaW5nIFN5bnRheCogYW5kICpDdXN0b20gU3RyaW5nIEZvcm1hdHRpbmcqKSBhbmQgdGhlIG90aGVyXG5iYXNlZCBvbiBDICJwcmludGYiIHN0eWxlIGZvcm1hdHRpbmcgdGhhdCBoYW5kbGVzIGEgbmFycm93ZXIgcmFuZ2Ugb2ZcbnR5cGVzIGFuZCBpcyBzbGlnaHRseSBoYXJkZXIgdG8gdXNlIGNvcnJlY3RseSwgYnV0IGlzIG9mdGVuIGZhc3RlciBmb3JcbnRoZSBjYXNlcyBpdCBjYW4gaGFuZGxlICgqcHJpbnRmLXN0eWxlIFN0cmluZyBGb3JtYXR0aW5nKikuXG5cblRoZSAqVGV4dCBQcm9jZXNzaW5nIFNlcnZpY2VzKiBzZWN0aW9uIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGNvdmVyc1xuYSBudW1iZXIgb2Ygb3RoZXIgbW9kdWxlcyB0aGF0IHByb3ZpZGUgdmFyaW91cyB0ZXh0IHJlbGF0ZWQgdXRpbGl0aWVzXG4oaW5jbHVkaW5nIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdXBwb3J0IGluIHRoZSAicmUiIG1vZHVsZSkuXG5cbnN0ci5jYXBpdGFsaXplKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZFxuICAgYW5kIHRoZSByZXN0IGxvd2VyY2FzZWQuXG5cbnN0ci5jYXNlZm9sZCgpXG5cbiAgIFJldHVybiBhIGNhc2Vmb2xkZWQgY29weSBvZiB0aGUgc3RyaW5nLiBDYXNlZm9sZGVkIHN0cmluZ3MgbWF5IGJlXG4gICB1c2VkIGZvciBjYXNlbGVzcyBtYXRjaGluZy5cblxuICAgQ2FzZWZvbGRpbmcgaXMgc2ltaWxhciB0byBsb3dlcmNhc2luZyBidXQgbW9yZSBhZ2dyZXNzaXZlIGJlY2F1c2VcbiAgIGl0IGlzIGludGVuZGVkIHRvIHJlbW92ZSBhbGwgY2FzZSBkaXN0aW5jdGlvbnMgaW4gYSBzdHJpbmcuIEZvclxuICAgZXhhbXBsZSwgdGhlIEdlcm1hbiBsb3dlcmNhc2UgbGV0dGVyICJcJ1x4ZGZcJyIgaXMgZXF1aXZhbGVudCB0byAiInNzIiIuXG4gICBTaW5jZSBpdCBpcyBhbHJlYWR5IGxvd2VyY2FzZSwgImxvd2VyKCkiIHdvdWxkIGRvIG5vdGhpbmcgdG8gIlwnXHhkZlwnIjtcbiAgICJjYXNlZm9sZCgpIiBjb252ZXJ0cyBpdCB0byAiInNzIiIuXG5cbiAgIFRoZSBjYXNlZm9sZGluZyBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gMy4xMyBvZiB0aGVcbiAgIFVuaWNvZGUgU3RhbmRhcmQuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMy5cblxuc3RyLmNlbnRlcih3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBQYWRkaW5nIGlzIGRvbmVcbiAgIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhbiBBU0NJSSBzcGFjZSkuIFRoZVxuICAgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvXG4gICAibGVuKHMpIi5cblxuc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YipcbiAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kXG4gICAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cbnN0ci5lbmNvZGUoZW5jb2Rpbmc9InV0Zi04IiwgZXJyb3JzPSJzdHJpY3QiKVxuXG4gICBSZXR1cm4gYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgYSBieXRlcyBvYmplY3QuIERlZmF1bHRcbiAgIGVuY29kaW5nIGlzICJcJ3V0Zi04XCciLiAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGEgZGlmZmVyZW50XG4gICBlcnJvciBoYW5kbGluZyBzY2hlbWUuIFRoZSBkZWZhdWx0IGZvciAqZXJyb3JzKiBpcyAiXCdzdHJpY3RcJyIsXG4gICBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGEgIlVuaWNvZGVFcnJvciIuIE90aGVyIHBvc3NpYmxlXG4gICB2YWx1ZXMgYXJlICJcJ2lnbm9yZVwnIiwgIlwncmVwbGFjZVwnIiwgIlwneG1sY2hhcnJlZnJlcGxhY2VcJyIsXG4gICAiXCdiYWNrc2xhc2hyZXBsYWNlXCciIGFuZCBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYVxuICAgImNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpIiwgc2VlIHNlY3Rpb24gKkVycm9yIEhhbmRsZXJzKi4gRm9yIGEgbGlzdFxuICAgb2YgcG9zc2libGUgZW5jb2RpbmdzLCBzZWUgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gIlRydWUiIGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgKnN1ZmZpeCosXG4gICBvdGhlcndpc2UgcmV0dXJuICJGYWxzZSIuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN1ZmZpeGVzXG4gICB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXG5zdHIuZXhwYW5kdGFicyh0YWJzaXplPTgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkXG4gICBieSBvbmUgb3IgbW9yZSBzcGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBjb2x1bW4gYW5kIHRoZVxuICAgZ2l2ZW4gdGFiIHNpemUuICBUYWIgcG9zaXRpb25zIG9jY3VyIGV2ZXJ5ICp0YWJzaXplKiBjaGFyYWN0ZXJzXG4gICAoZGVmYXVsdCBpcyA4LCBnaXZpbmcgdGFiIHBvc2l0aW9ucyBhdCBjb2x1bW5zIDAsIDgsIDE2IGFuZCBzbyBvbikuXG4gICBUbyBleHBhbmQgdGhlIHN0cmluZywgdGhlIGN1cnJlbnQgY29sdW1uIGlzIHNldCB0byB6ZXJvIGFuZCB0aGVcbiAgIHN0cmluZyBpcyBleGFtaW5lZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLiAgSWYgdGhlIGNoYXJhY3RlciBpcyBhXG4gICB0YWIgKCJcXHQiKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIHJlc3VsdFxuICAgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi4gKFRoZVxuICAgdGFiIGNoYXJhY3RlciBpdHNlbGYgaXMgbm90IGNvcGllZC4pICBJZiB0aGUgY2hhcmFjdGVyIGlzIGEgbmV3bGluZVxuICAgKCJcXG4iKSBvciByZXR1cm4gKCJcXHIiKSwgaXQgaXMgY29waWVkIGFuZCB0aGUgY3VycmVudCBjb2x1bW4gaXNcbiAgIHJlc2V0IHRvIHplcm8uICBBbnkgb3RoZXIgY2hhcmFjdGVyIGlzIGNvcGllZCB1bmNoYW5nZWQgYW5kIHRoZVxuICAgY3VycmVudCBjb2x1bW4gaXMgaW5jcmVtZW50ZWQgYnkgb25lIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZVxuICAgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIHdoZW4gcHJpbnRlZC5cblxuICAgPj4+IFwnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzRcJy5leHBhbmR0YWJzKClcbiAgIFwnMDEgICAgICAwMTIgICAgIDAxMjMgICAgMDEyMzRcJ1xuICAgPj4+IFwnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzRcJy5leHBhbmR0YWJzKDQpXG4gICBcJzAxICAwMTIgMDEyMyAgICAwMTIzNFwnXG5cbnN0ci5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHRoZSBzdHJpbmcgd2hlcmUgc3Vic3RyaW5nICpzdWIqIGlzXG4gICBmb3VuZCB3aXRoaW4gdGhlIHNsaWNlICJzW3N0YXJ0OmVuZF0iLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCpcbiAgIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uICBSZXR1cm4gIi0xIiBpZlxuICAgKnN1YiogaXMgbm90IGZvdW5kLlxuXG4gICBOb3RlOiBUaGUgImZpbmQoKSIgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IG5lZWQgdG8ga25vd1xuICAgICB0aGUgcG9zaXRpb24gb2YgKnN1YiouICBUbyBjaGVjayBpZiAqc3ViKiBpcyBhIHN1YnN0cmluZyBvciBub3QsXG4gICAgIHVzZSB0aGUgImluIiBvcGVyYXRvcjpcblxuICAgICAgICA+Pj4gXCdQeVwnIGluIFwnUHl0aG9uXCdcbiAgICAgICAgVHJ1ZVxuXG5zdHIuZm9ybWF0KCphcmdzLCAqKmt3YXJncylcblxuICAgUGVyZm9ybSBhIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbi4gIFRoZSBzdHJpbmcgb24gd2hpY2ggdGhpc1xuICAgbWV0aG9kIGlzIGNhbGxlZCBjYW4gY29udGFpbiBsaXRlcmFsIHRleHQgb3IgcmVwbGFjZW1lbnQgZmllbGRzXG4gICBkZWxpbWl0ZWQgYnkgYnJhY2VzICJ7fSIuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkIGNvbnRhaW5zIGVpdGhlclxuICAgdGhlIG51bWVyaWMgaW5kZXggb2YgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBvciB0aGUgbmFtZSBvZiBhXG4gICBrZXl3b3JkIGFyZ3VtZW50LiAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoXG4gICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlXG4gICBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LlxuXG4gICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKVxuICAgXCdUaGUgc3VtIG9mIDEgKyAyIGlzIDNcJ1xuXG4gICBTZWUgKkZvcm1hdCBTdHJpbmcgU3ludGF4KiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaW91c1xuICAgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpbiBmb3JtYXQgc3RyaW5ncy5cblxuc3RyLmZvcm1hdF9tYXAobWFwcGluZylcblxuICAgU2ltaWxhciB0byAic3RyLmZvcm1hdCgqKm1hcHBpbmcpIiwgZXhjZXB0IHRoYXQgIm1hcHBpbmciIGlzIHVzZWRcbiAgIGRpcmVjdGx5IGFuZCBub3QgY29waWVkIHRvIGEgImRpY3QiLiAgVGhpcyBpcyB1c2VmdWwgaWYgZm9yIGV4YW1wbGVcbiAgICJtYXBwaW5nIiBpcyBhIGRpY3Qgc3ViY2xhc3M6XG5cbiAgID4+PiBjbGFzcyBEZWZhdWx0KGRpY3QpOlxuICAgLi4uICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBrZXlcbiAgIC4uLlxuICAgPj4+IFwne25hbWV9IHdhcyBib3JuIGluIHtjb3VudHJ5fVwnLmZvcm1hdF9tYXAoRGVmYXVsdChuYW1lPVwnR3VpZG9cJykpXG4gICBcJ0d1aWRvIHdhcyBib3JuIGluIGNvdW50cnlcJ1xuXG4gICBOZXcgaW4gdmVyc2lvbiAzLjIuXG5cbnN0ci5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlICJmaW5kKCkiLCBidXQgcmFpc2UgIlZhbHVlRXJyb3IiIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3RcbiAgIGZvdW5kLlxuXG5zdHIuaXNhbG51bSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhbnVtZXJpYyBhbmRcbiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gIEEgY2hhcmFjdGVyICJjIlxuICAgaXMgYWxwaGFudW1lcmljIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJldHVybnMgIlRydWUiOlxuICAgImMuaXNhbHBoYSgpIiwgImMuaXNkZWNpbWFsKCkiLCAiYy5pc2RpZ2l0KCkiLCBvciAiYy5pc251bWVyaWMoKSIuXG5cbnN0ci5pc2FscGhhKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFiZXRpYyBhbmRcbiAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gIEFscGhhYmV0aWNcbiAgIGNoYXJhY3RlcnMgYXJlIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXJcbiAgIGRhdGFiYXNlIGFzICJMZXR0ZXIiLCBpLmUuLCB0aG9zZSB3aXRoIGdlbmVyYWwgY2F0ZWdvcnkgcHJvcGVydHlcbiAgIGJlaW5nIG9uZSBvZiAiTG0iLCAiTHQiLCAiTHUiLCAiTGwiLCBvciAiTG8iLiAgTm90ZSB0aGF0IHRoaXMgaXNcbiAgIGRpZmZlcmVudCBmcm9tIHRoZSAiQWxwaGFiZXRpYyIgcHJvcGVydHkgZGVmaW5lZCBpbiB0aGUgVW5pY29kZVxuICAgU3RhbmRhcmQuXG5cbnN0ci5pc2RlY2ltYWwoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkZWNpbWFsIGNoYXJhY3RlcnNcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuIERlY2ltYWxcbiAgIGNoYXJhY3RlcnMgYXJlIHRob3NlIGZyb20gZ2VuZXJhbCBjYXRlZ29yeSAiTmQiLiBUaGlzIGNhdGVnb3J5XG4gICBpbmNsdWRlcyBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBjYW4gYmUgdXNlZCB0b1xuICAgZm9ybSBkZWNpbWFsLXJhZGl4IG51bWJlcnMsIGUuZy4gVSswNjYwLCBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTy5cblxuc3RyLmlzZGlnaXQoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlIGlzXG4gICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBEaWdpdHMgaW5jbHVkZSBkZWNpbWFsXG4gICBjaGFyYWN0ZXJzIGFuZCBkaWdpdHMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcsIHN1Y2ggYXMgdGhlXG4gICBjb21wYXRpYmlsaXR5IHN1cGVyc2NyaXB0IGRpZ2l0cy4gIEZvcm1hbGx5LCBhIGRpZ2l0IGlzIGEgY2hhcmFjdGVyXG4gICB0aGF0IGhhcyB0aGUgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0IG9yXG4gICBOdW1lcmljX1R5cGU9RGVjaW1hbC5cblxuc3RyLmlzaWRlbnRpZmllcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBpZGVudGlmaWVyIGFjY29yZGluZyB0byB0aGVcbiAgIGxhbmd1YWdlIGRlZmluaXRpb24sIHNlY3Rpb24gKklkZW50aWZpZXJzIGFuZCBrZXl3b3JkcyouXG5cbiAgIFVzZSAia2V5d29yZC5pc2tleXdvcmQoKSIgdG8gdGVzdCBmb3IgcmVzZXJ2ZWQgaWRlbnRpZmllcnMgc3VjaCBhc1xuICAgImRlZiIgYW5kICJjbGFzcyIuXG5cbnN0ci5pc2xvd2VyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuc3RyLmlzbnVtZXJpYygpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIG51bWVyaWMgY2hhcmFjdGVycyxcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuIE51bWVyaWNcbiAgIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlXG4gICB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LCBlLmcuIFUrMjE1NSwgVlVMR0FSIEZSQUNUSU9OXG4gICBPTkUgRklGVEguICBGb3JtYWxseSwgbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoIHRoZVxuICAgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0LCBOdW1lcmljX1R5cGU9RGVjaW1hbCBvclxuICAgTnVtZXJpY19UeXBlPU51bWVyaWMuXG5cbnN0ci5pc3ByaW50YWJsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIHByaW50YWJsZSBvciB0aGVcbiAgIHN0cmluZyBpcyBlbXB0eSwgZmFsc2Ugb3RoZXJ3aXNlLiAgTm9ucHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlXG4gICB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGRhdGFiYXNlIGFzXG4gICAiT3RoZXIiIG9yICJTZXBhcmF0b3IiLCBleGNlcHRpbmcgdGhlIEFTQ0lJIHNwYWNlICgweDIwKSB3aGljaCBpc1xuICAgY29uc2lkZXJlZCBwcmludGFibGUuICAoTm90ZSB0aGF0IHByaW50YWJsZSBjaGFyYWN0ZXJzIGluIHRoaXNcbiAgIGNvbnRleHQgYXJlIHRob3NlIHdoaWNoIHNob3VsZCBub3QgYmUgZXNjYXBlZCB3aGVuICJyZXByKCkiIGlzXG4gICBpbnZva2VkIG9uIGEgc3RyaW5nLiAgSXQgaGFzIG5vIGJlYXJpbmcgb24gdGhlIGhhbmRsaW5nIG9mIHN0cmluZ3NcbiAgIHdyaXR0ZW4gdG8gInN5cy5zdGRvdXQiIG9yICJzeXMuc3RkZXJyIi4pXG5cbnN0ci5pc3NwYWNlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmdcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuICBXaGl0ZXNwYWNlXG4gICBjaGFyYWN0ZXJzICBhcmUgdGhvc2UgY2hhcmFjdGVycyBkZWZpbmVkIGluIHRoZSBVbmljb2RlIGNoYXJhY3RlclxuICAgZGF0YWJhc2UgYXMgIk90aGVyIiBvciAiU2VwYXJhdG9yIiBhbmQgdGhvc2Ugd2l0aCBiaWRpcmVjdGlvbmFsXG4gICBwcm9wZXJ0eSBiZWluZyBvbmUgb2YgIldTIiwgIkIiLCBvciAiUyIuXG5cbnN0ci5pc3RpdGxlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCB0aGVyZSBpcyBhdFxuICAgbGVhc3Qgb25lIGNoYXJhY3RlciwgZm9yIGV4YW1wbGUgdXBwZXJjYXNlIGNoYXJhY3RlcnMgbWF5IG9ubHlcbiAgIGZvbGxvdyB1bmNhc2VkIGNoYXJhY3RlcnMgYW5kIGxvd2VyY2FzZSBjaGFyYWN0ZXJzIG9ubHkgY2FzZWQgb25lcy5cbiAgIFJldHVybiBmYWxzZSBvdGhlcndpc2UuXG5cbnN0ci5pc3VwcGVyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIHVwcGVyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuc3RyLmpvaW4oaXRlcmFibGUpXG5cbiAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBpbiB0aGVcbiAgICppdGVyYWJsZSogKml0ZXJhYmxlKi4gIEEgIlR5cGVFcnJvciIgd2lsbCBiZSByYWlzZWQgaWYgdGhlcmUgYXJlXG4gICBhbnkgbm9uLXN0cmluZyB2YWx1ZXMgaW4gKml0ZXJhYmxlKiwgaW5jbHVkaW5nICJieXRlcyIgb2JqZWN0cy5cbiAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGUgc3RyaW5nIHByb3ZpZGluZyB0aGlzIG1ldGhvZC5cblxuc3RyLmxqdXN0KHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gdGhlIHN0cmluZyBsZWZ0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYW4gQVNDSUlcbiAgIHNwYWNlKS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvclxuICAgZXF1YWwgdG8gImxlbihzKSIuXG5cbnN0ci5sb3dlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF1cbiAgIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuXG5cbiAgIFRoZSBsb3dlcmNhc2luZyBhbGdvcml0aG0gdXNlZCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAzLjEzIG9mIHRoZVxuICAgVW5pY29kZSBTdGFuZGFyZC5cblxuc3RyLmxzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5sc3RyaXAoKVxuICAgICAgXCdzcGFjaW91cyAgIFwnXG4gICAgICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5sc3RyaXAoXCdjbW93ei5cJylcbiAgICAgIFwnZXhhbXBsZS5jb21cJ1xuXG5zdGF0aWMgc3RyLm1ha2V0cmFucyh4WywgeVssIHpdXSlcblxuICAgVGhpcyBzdGF0aWMgbWV0aG9kIHJldHVybnMgYSB0cmFuc2xhdGlvbiB0YWJsZSB1c2FibGUgZm9yXG4gICAic3RyLnRyYW5zbGF0ZSgpIi5cblxuICAgSWYgdGhlcmUgaXMgb25seSBvbmUgYXJndW1lbnQsIGl0IG11c3QgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmdcbiAgIFVuaWNvZGUgb3JkaW5hbHMgKGludGVnZXJzKSBvciBjaGFyYWN0ZXJzIChzdHJpbmdzIG9mIGxlbmd0aCAxKSB0b1xuICAgVW5pY29kZSBvcmRpbmFscywgc3RyaW5ncyAob2YgYXJiaXRyYXJ5IGxlbmd0aHMpIG9yIE5vbmUuXG4gICBDaGFyYWN0ZXIga2V5cyB3aWxsIHRoZW4gYmUgY29udmVydGVkIHRvIG9yZGluYWxzLlxuXG4gICBJZiB0aGVyZSBhcmUgdHdvIGFyZ3VtZW50cywgdGhleSBtdXN0IGJlIHN0cmluZ3Mgb2YgZXF1YWwgbGVuZ3RoLFxuICAgYW5kIGluIHRoZSByZXN1bHRpbmcgZGljdGlvbmFyeSwgZWFjaCBjaGFyYWN0ZXIgaW4geCB3aWxsIGJlIG1hcHBlZFxuICAgdG8gdGhlIGNoYXJhY3RlciBhdCB0aGUgc2FtZSBwb3NpdGlvbiBpbiB5LiAgSWYgdGhlcmUgaXMgYSB0aGlyZFxuICAgYXJndW1lbnQsIGl0IG11c3QgYmUgYSBzdHJpbmcsIHdob3NlIGNoYXJhY3RlcnMgd2lsbCBiZSBtYXBwZWQgdG9cbiAgIE5vbmUgaW4gdGhlIHJlc3VsdC5cblxuc3RyLnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYVxuICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXG4gICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3RcbiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBpdHNlbGYsIGZvbGxvd2VkIGJ5XG4gICB0d28gZW1wdHkgc3RyaW5ncy5cblxuc3RyLnJlcGxhY2Uob2xkLCBuZXdbLCBjb3VudF0pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCpcbiAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgZ2l2ZW4sIG9ubHlcbiAgIHRoZSBmaXJzdCAqY291bnQqIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC5cblxuc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgd2l0aGluICJzW3N0YXJ0OmVuZF0iLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gIi0xIiBvbiBmYWlsdXJlLlxuXG5zdHIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIExpa2UgInJmaW5kKCkiIGJ1dCByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gdGhlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgbm90IGZvdW5kLlxuXG5zdHIucmp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYW4gQVNDSUlcbiAgIHNwYWNlKS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvclxuICAgZXF1YWwgdG8gImxlbihzKSIuXG5cbnN0ci5ycGFydGl0aW9uKHNlcClcblxuICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHR3byBlbXB0eSBzdHJpbmdzLCBmb2xsb3dlZCBieVxuICAgdGhlIHN0cmluZyBpdHNlbGYuXG5cbnN0ci5yc3BsaXQoc2VwPU5vbmUsIG1heHNwbGl0PS0xKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBzcGxpdHNcbiAgIGFyZSBkb25lLCB0aGUgKnJpZ2h0bW9zdCogb25lcy4gIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3JcbiAgICJOb25lIiwgYW55IHdoaXRlc3BhY2Ugc3RyaW5nIGlzIGEgc2VwYXJhdG9yLiAgRXhjZXB0IGZvciBzcGxpdHRpbmdcbiAgIGZyb20gdGhlIHJpZ2h0LCAicnNwbGl0KCkiIGJlaGF2ZXMgbGlrZSAic3BsaXQoKSIgd2hpY2ggaXNcbiAgIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuXG5cbnN0ci5yc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgY2hhcmFjdGVycyByZW1vdmVkLiAgVGhlXG4gICAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlXG4gICByZW1vdmVkLiAgSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICAgICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnJzdHJpcCgpXG4gICAgICBcJyAgIHNwYWNpb3VzXCdcbiAgICAgID4+PiBcJ21pc3Npc3NpcHBpXCcucnN0cmlwKFwnaXB6XCcpXG4gICAgICBcJ21pc3Npc3NcJ1xuXG5zdHIuc3BsaXQoc2VwPU5vbmUsIG1heHNwbGl0PS0xKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuICBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCpcbiAgIHNwbGl0cyBhcmUgZG9uZSAodGh1cywgdGhlIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgIm1heHNwbGl0KzEiXG4gICBlbGVtZW50cykuICBJZiAqbWF4c3BsaXQqIGlzIG5vdCBzcGVjaWZpZWQgb3IgIi0xIiwgdGhlbiB0aGVyZSBpc1xuICAgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBzcGxpdHMgKGFsbCBwb3NzaWJsZSBzcGxpdHMgYXJlIG1hZGUpLlxuXG4gICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcbiAgIGFuZCBhcmUgZGVlbWVkIHRvIGRlbGltaXQgZW1wdHkgc3RyaW5ncyAoZm9yIGV4YW1wbGUsXG4gICAiXCcxLCwyXCcuc3BsaXQoXCcsXCcpIiByZXR1cm5zICJbXCcxXCcsIFwnXCcsIFwnMlwnXSIpLiAgVGhlICpzZXAqIGFyZ3VtZW50XG4gICBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSxcbiAgICJcJzE8PjI8PjNcJy5zcGxpdChcJzw+XCcpIiByZXR1cm5zICJbXCcxXCcsIFwnMlwnLCBcJzNcJ10iKS4gU3BsaXR0aW5nIGFuXG4gICBlbXB0eSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBzZXBhcmF0b3IgcmV0dXJucyAiW1wnXCddIi5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBcJzEsMiwzXCcuc3BsaXQoXCcsXCcpXG4gICAgICBbXCcxXCcsIFwnMlwnLCBcJzNcJ11cbiAgICAgID4+PiBcJzEsMiwzXCcuc3BsaXQoXCcsXCcsIG1heHNwbGl0PTEpXG4gICAgICBbXCcxXCcsIFwnMiwzXCddXG4gICAgICA+Pj4gXCcxLDIsLDMsXCcuc3BsaXQoXCcsXCcpXG4gICAgICBbXCcxXCcsIFwnMlwnLCBcJ1wnLCBcJzNcJywgXCdcJ11cblxuICAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvciBpcyAiTm9uZSIsIGEgZGlmZmVyZW50IHNwbGl0dGluZ1xuICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSBhcmUgcmVnYXJkZWRcbiAgIGFzIGEgc2luZ2xlIHNlcGFyYXRvciwgYW5kIHRoZSByZXN1bHQgd2lsbCBjb250YWluIG5vIGVtcHR5IHN0cmluZ3NcbiAgIGF0IHRoZSBzdGFydCBvciBlbmQgaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBvciB0cmFpbGluZ1xuICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZ1xuICAgY29uc2lzdGluZyBvZiBqdXN0IHdoaXRlc3BhY2Ugd2l0aCBhICJOb25lIiBzZXBhcmF0b3IgcmV0dXJucyAiW10iLlxuXG4gICBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IFwnMSAyIDNcJy5zcGxpdCgpXG4gICAgICBbXCcxXCcsIFwnMlwnLCBcJzNcJ11cbiAgICAgID4+PiBcJzEgMiAzXCcuc3BsaXQobWF4c3BsaXQ9MSlcbiAgICAgIFtcJzFcJywgXCcyIDNcJ11cbiAgICAgID4+PiBcJyAgIDEgICAyICAgMyAgIFwnLnNwbGl0KClcbiAgICAgIFtcJzFcJywgXCcyXCcsIFwnM1wnXVxuXG5zdHIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgc3RyaW5nLCBicmVha2luZyBhdCBsaW5lXG4gICBib3VuZGFyaWVzLiAgTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3RcbiAgIHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZCB0cnVlLlxuXG4gICBUaGlzIG1ldGhvZCBzcGxpdHMgb24gdGhlIGZvbGxvd2luZyBsaW5lIGJvdW5kYXJpZXMuICBJblxuICAgcGFydGljdWxhciwgdGhlIGJvdW5kYXJpZXMgYXJlIGEgc3VwZXJzZXQgb2YgKnVuaXZlcnNhbCBuZXdsaW5lcyouXG5cbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFJlcHJlc2VudGF0aW9uICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgIlxcbiIgICAgICAgICAgICAgICAgICAgIHwgTGluZSBGZWVkICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcciIgICAgICAgICAgICAgICAgICAgIHwgQ2FycmlhZ2UgUmV0dXJuICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcclxcbiIgICAgICAgICAgICAgICAgICB8IENhcnJpYWdlIFJldHVybiArIExpbmUgRmVlZCAgIHxcbiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8ICJcXHYiIG9yICJcXHgwYiIgICAgICAgICAgfCBMaW5lIFRhYnVsYXRpb24gICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCAiXFxmIiBvciAiXFx4MGMiICAgICAgICAgIHwgRm9ybSBGZWVkICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxceDFjIiAgICAgICAgICAgICAgICAgIHwgRmlsZSBTZXBhcmF0b3IgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxceDFkIiAgICAgICAgICAgICAgICAgIHwgR3JvdXAgU2VwYXJhdG9yICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxceDFlIiAgICAgICAgICAgICAgICAgIHwgUmVjb3JkIFNlcGFyYXRvciAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxceDg1IiAgICAgICAgICAgICAgICAgIHwgTmV4dCBMaW5lIChDMSBDb250cm9sIENvZGUpICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcdTIwMjgiICAgICAgICAgICAgICAgIHwgTGluZSBTZXBhcmF0b3IgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgIlxcdTIwMjkiICAgICAgICAgICAgICAgIHwgUGFyYWdyYXBoIFNlcGFyYXRvciAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogIlxcdiIgYW5kICJcXGYiIGFkZGVkIHRvIGxpc3Qgb2YgbGluZVxuICAgYm91bmRhcmllcy5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiBcJ2FiIGNcXG5cXG5kZSBmZ1xccmtsXFxyXFxuXCcuc3BsaXRsaW5lcygpXG4gICAgICBbXCdhYiBjXCcsIFwnXCcsIFwnZGUgZmdcJywgXCdrbFwnXVxuICAgICAgPj4+IFwnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG5cJy5zcGxpdGxpbmVzKGtlZXBlbmRzPVRydWUpXG4gICAgICBbXCdhYiBjXFxuXCcsIFwnXFxuXCcsIFwnZGUgZmdcXHJcJywgXCdrbFxcclxcblwnXVxuXG4gICBVbmxpa2UgInNwbGl0KCkiIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzXG4gICBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0IGZvciB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgYSB0ZXJtaW5hbFxuICAgbGluZSBicmVhayBkb2VzIG5vdCByZXN1bHQgaW4gYW4gZXh0cmEgbGluZTpcblxuICAgICAgPj4+ICIiLnNwbGl0bGluZXMoKVxuICAgICAgW11cbiAgICAgID4+PiAiT25lIGxpbmVcXG4iLnNwbGl0bGluZXMoKVxuICAgICAgW1wnT25lIGxpbmVcJ11cblxuICAgRm9yIGNvbXBhcmlzb24sICJzcGxpdChcJ1xcblwnKSIgZ2l2ZXM6XG5cbiAgICAgID4+PiBcJ1wnLnNwbGl0KFwnXFxuXCcpXG4gICAgICBbXCdcJ11cbiAgICAgID4+PiBcJ1R3byBsaW5lc1xcblwnLnNwbGl0KFwnXFxuXCcpXG4gICAgICBbXCdUd28gbGluZXNcJywgXCdcJ11cblxuc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuICJUcnVlIiBpZiBzdHJpbmcgc3RhcnRzIHdpdGggdGhlICpwcmVmaXgqLCBvdGhlcndpc2UgcmV0dXJuXG4gICAiRmFsc2UiLiAqcHJlZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHByZWZpeGVzIHRvIGxvb2sgZm9yLlxuICAgV2l0aCBvcHRpb25hbCAqc3RhcnQqLCB0ZXN0IHN0cmluZyBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cbiAgIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIHN0cmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXG5zdHIuc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG4gICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlXG4gICBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkLiBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycypcbiAgIGFyZ3VtZW50IGRlZmF1bHRzIHRvIHJlbW92aW5nIHdoaXRlc3BhY2UuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzXG4gICBub3QgYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmVcbiAgIHN0cmlwcGVkOlxuXG4gICAgICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnN0cmlwKClcbiAgICAgIFwnc3BhY2lvdXNcJ1xuICAgICAgPj4+IFwnd3d3LmV4YW1wbGUuY29tXCcuc3RyaXAoXCdjbW93ei5cJylcbiAgICAgIFwnZXhhbXBsZVwnXG5cbiAgIFRoZSBvdXRlcm1vc3QgbGVhZGluZyBhbmQgdHJhaWxpbmcgKmNoYXJzKiBhcmd1bWVudCB2YWx1ZXMgYXJlXG4gICBzdHJpcHBlZCBmcm9tIHRoZSBzdHJpbmcuIENoYXJhY3RlcnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGVhZGluZ1xuICAgZW5kIHVudGlsIHJlYWNoaW5nIGEgc3RyaW5nIGNoYXJhY3RlciB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gdGhlXG4gICBzZXQgb2YgY2hhcmFjdGVycyBpbiAqY2hhcnMqLiBBIHNpbWlsYXIgYWN0aW9uIHRha2VzIHBsYWNlIG9uIHRoZVxuICAgdHJhaWxpbmcgZW5kLiBGb3IgZXhhbXBsZTpcblxuICAgICAgPj4+IGNvbW1lbnRfc3RyaW5nID0gXCcjLi4uLi4uLiBTZWN0aW9uIDMuMi4xIElzc3VlICMzMiAuLi4uLi4uXCdcbiAgICAgID4+PiBjb21tZW50X3N0cmluZy5zdHJpcChcJy4jISBcJylcbiAgICAgIFwnU2VjdGlvbiAzLjIuMSBJc3N1ZSAjMzJcJ1xuXG5zdHIuc3dhcGNhc2UoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB1cHBlcmNhc2UgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG9cbiAgIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS4gTm90ZSB0aGF0IGl0IGlzIG5vdCBuZWNlc3NhcmlseSB0cnVlIHRoYXRcbiAgICJzLnN3YXBjYXNlKCkuc3dhcGNhc2UoKSA9PSBzIi5cblxuc3RyLnRpdGxlKClcblxuICAgUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2hlcmUgd29yZHMgc3RhcnQgd2l0aCBhblxuICAgdXBwZXJjYXNlIGNoYXJhY3RlciBhbmQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBsb3dlcmNhc2UuXG5cbiAgIEZvciBleGFtcGxlOlxuXG4gICAgICA+Pj4gXCdIZWxsbyB3b3JsZFwnLnRpdGxlKClcbiAgICAgIFwnSGVsbG8gV29ybGRcJ1xuXG4gICBUaGUgYWxnb3JpdGhtIHVzZXMgYSBzaW1wbGUgbGFuZ3VhZ2UtaW5kZXBlbmRlbnQgZGVmaW5pdGlvbiBvZiBhXG4gICB3b3JkIGFzIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBsZXR0ZXJzLiAgVGhlIGRlZmluaXRpb24gd29ya3MgaW5cbiAgIG1hbnkgY29udGV4dHMgYnV0IGl0IG1lYW5zIHRoYXQgYXBvc3Ryb3BoZXMgaW4gY29udHJhY3Rpb25zIGFuZFxuICAgcG9zc2Vzc2l2ZXMgZm9ybSB3b3JkIGJvdW5kYXJpZXMsIHdoaWNoIG1heSBub3QgYmUgdGhlIGRlc2lyZWRcbiAgIHJlc3VsdDpcblxuICAgICAgPj4+ICJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMgZnJvbSB0aGUgVUsiLnRpdGxlKClcbiAgICAgICJUaGV5XCdSZSBCaWxsXCdTIEZyaWVuZHMgRnJvbSBUaGUgVWsiXG5cbiAgIEEgd29ya2Fyb3VuZCBmb3IgYXBvc3Ryb3BoZXMgY2FuIGJlIGNvbnN0cnVjdGVkIHVzaW5nIHJlZ3VsYXJcbiAgIGV4cHJlc3Npb25zOlxuXG4gICAgICA+Pj4gaW1wb3J0IHJlXG4gICAgICA+Pj4gZGVmIHRpdGxlY2FzZShzKTpcbiAgICAgIC4uLiAgICAgcmV0dXJuIHJlLnN1YihyIltBLVphLXpdKyhcJ1tBLVphLXpdKyk/IixcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBsYW1iZGEgbW86IG1vLmdyb3VwKDApWzBdLnVwcGVyKCkgK1xuICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW8uZ3JvdXAoMClbMTpdLmxvd2VyKCksXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgcylcbiAgICAgIC4uLlxuICAgICAgPj4+IHRpdGxlY2FzZSgidGhleVwncmUgYmlsbFwncyBmcmllbmRzLiIpXG4gICAgICAiVGhleVwncmUgQmlsbFwncyBGcmllbmRzLiJcblxuc3RyLnRyYW5zbGF0ZSh0YWJsZSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyIGhhcyBiZWVuIG1hcHBlZFxuICAgdGhyb3VnaCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdGFibGUuICBUaGUgdGFibGUgbXVzdCBiZSBhbiBvYmplY3RcbiAgIHRoYXQgaW1wbGVtZW50cyBpbmRleGluZyB2aWEgIl9fZ2V0aXRlbV9fKCkiLCB0eXBpY2FsbHkgYSAqbWFwcGluZypcbiAgIG9yICpzZXF1ZW5jZSouICBXaGVuIGluZGV4ZWQgYnkgYSBVbmljb2RlIG9yZGluYWwgKGFuIGludGVnZXIpLCB0aGVcbiAgIHRhYmxlIG9iamVjdCBjYW4gZG8gYW55IG9mIHRoZSBmb2xsb3dpbmc6IHJldHVybiBhIFVuaWNvZGUgb3JkaW5hbFxuICAgb3IgYSBzdHJpbmcsIHRvIG1hcCB0aGUgY2hhcmFjdGVyIHRvIG9uZSBvciBtb3JlIG90aGVyIGNoYXJhY3RlcnM7XG4gICByZXR1cm4gIk5vbmUiLCB0byBkZWxldGUgdGhlIGNoYXJhY3RlciBmcm9tIHRoZSByZXR1cm4gc3RyaW5nOyBvclxuICAgcmFpc2UgYSAiTG9va3VwRXJyb3IiIGV4Y2VwdGlvbiwgdG8gbWFwIHRoZSBjaGFyYWN0ZXIgdG8gaXRzZWxmLlxuXG4gICBZb3UgY2FuIHVzZSAic3RyLm1ha2V0cmFucygpIiB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiBtYXAgZnJvbVxuICAgY2hhcmFjdGVyLXRvLWNoYXJhY3RlciBtYXBwaW5ncyBpbiBkaWZmZXJlbnQgZm9ybWF0cy5cblxuICAgU2VlIGFsc28gdGhlICJjb2RlY3MiIG1vZHVsZSBmb3IgYSBtb3JlIGZsZXhpYmxlIGFwcHJvYWNoIHRvIGN1c3RvbVxuICAgY2hhcmFjdGVyIG1hcHBpbmdzLlxuXG5zdHIudXBwZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLiAgTm90ZSB0aGF0ICJzdHIudXBwZXIoKS5pc3VwcGVyKCkiIG1pZ2h0IGJlXG4gICAiRmFsc2UiIGlmICJzIiBjb250YWlucyB1bmNhc2VkIGNoYXJhY3RlcnMgb3IgaWYgdGhlIFVuaWNvZGVcbiAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCAiTHUiIChMZXR0ZXIsXG4gICB1cHBlcmNhc2UpLCBidXQgZS5nLiAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG5cbiAgIFRoZSB1cHBlcmNhc2luZyBhbGdvcml0aG0gdXNlZCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAzLjEzIG9mIHRoZVxuICAgVW5pY29kZSBTdGFuZGFyZC5cblxuc3RyLnpmaWxsKHdpZHRoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCBBU0NJSSAiXCcwXCciIGRpZ2l0cyB0b1xuICAgbWFrZSBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gQSBsZWFkaW5nIHNpZ24gcHJlZml4XG4gICAoIlwnK1wnIi8iXCctXCciKSBpcyBoYW5kbGVkIGJ5IGluc2VydGluZyB0aGUgcGFkZGluZyAqYWZ0ZXIqIHRoZSBzaWduXG4gICBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYmVmb3JlLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmXG4gICAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAibGVuKHMpIi5cblxuICAgRm9yIGV4YW1wbGU6XG5cbiAgICAgID4+PiAiNDIiLnpmaWxsKDUpXG4gICAgICBcJzAwMDQyXCdcbiAgICAgID4+PiAiLTQyIi56ZmlsbCg1KVxuICAgICAgXCctMDA0MlwnXG4nLAotICdzdHJpbmdzJzogdSdcblN0cmluZyBhbmQgQnl0ZXMgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuU3RyaW5nIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBzdHJpbmdsaXRlcmFsICAgOjo9IFtzdHJpbmdwcmVmaXhdKHNob3J0c3RyaW5nIHwgbG9uZ3N0cmluZylcbiAgIHN0cmluZ3ByZWZpeCAgICA6Oj0gInIiIHwgInUiIHwgIlIiIHwgIlUiXG4gICBzaG9ydHN0cmluZyAgICAgOjo9ICJcJyIgc2hvcnRzdHJpbmdpdGVtKiAiXCciIHwgXCciXCcgc2hvcnRzdHJpbmdpdGVtKiBcJyJcJ1xuICAgbG9uZ3N0cmluZyAgICAgIDo6PSAiXCdcJ1wnIiBsb25nc3RyaW5naXRlbSogIlwnXCdcJyIgfCBcJyIiIlwnIGxvbmdzdHJpbmdpdGVtKiBcJyIiIlwnXG4gICBzaG9ydHN0cmluZ2l0ZW0gOjo9IHNob3J0c3RyaW5nY2hhciB8IHN0cmluZ2VzY2FwZXNlcVxuICAgbG9uZ3N0cmluZ2l0ZW0gIDo6PSBsb25nc3RyaW5nY2hhciB8IHN0cmluZ2VzY2FwZXNlcVxuICAgc2hvcnRzdHJpbmdjaGFyIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgbmV3bGluZSBvciB0aGUgcXVvdGU+XG4gICBsb25nc3RyaW5nY2hhciAgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlxcIj5cbiAgIHN0cmluZ2VzY2FwZXNlcSA6Oj0gIlxcIiA8YW55IHNvdXJjZSBjaGFyYWN0ZXI+XG5cbiAgIGJ5dGVzbGl0ZXJhbCAgIDo6PSBieXRlc3ByZWZpeChzaG9ydGJ5dGVzIHwgbG9uZ2J5dGVzKVxuICAgYnl0ZXNwcmVmaXggICAgOjo9ICJiIiB8ICJCIiB8ICJiciIgfCAiQnIiIHwgImJSIiB8ICJCUiIgfCAicmIiIHwgInJCIiB8ICJSYiIgfCAiUkIiXG4gICBzaG9ydGJ5dGVzICAgICA6Oj0gIlwnIiBzaG9ydGJ5dGVzaXRlbSogIlwnIiB8IFwnIlwnIHNob3J0Ynl0ZXNpdGVtKiBcJyJcJ1xuICAgbG9uZ2J5dGVzICAgICAgOjo9ICJcJ1wnXCciIGxvbmdieXRlc2l0ZW0qICJcJ1wnXCciIHwgXCciIiJcJyBsb25nYnl0ZXNpdGVtKiBcJyIiIlwnXG4gICBzaG9ydGJ5dGVzaXRlbSA6Oj0gc2hvcnRieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcVxuICAgbG9uZ2J5dGVzaXRlbSAgOjo9IGxvbmdieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcVxuICAgc2hvcnRieXRlc2NoYXIgOjo9IDxhbnkgQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiIG9yIG5ld2xpbmUgb3IgdGhlIHF1b3RlPlxuICAgbG9uZ2J5dGVzY2hhciAgOjo9IDxhbnkgQVNDSUkgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiPlxuICAgYnl0ZXNlc2NhcGVzZXEgOjo9ICJcXCIgPGFueSBBU0NJSSBjaGFyYWN0ZXI+XG5cbk9uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyB0aGF0XG53aGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlICJzdHJpbmdwcmVmaXgiIG9yICJieXRlc3ByZWZpeCJcbmFuZCB0aGUgcmVzdCBvZiB0aGUgbGl0ZXJhbC4gVGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0IGlzIGRlZmluZWQgYnlcbnRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbjsgaXQgaXMgVVRGLTggaWYgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gaXNcbmdpdmVuIGluIHRoZSBzb3VyY2UgZmlsZTsgc2VlIHNlY3Rpb24gKkVuY29kaW5nIGRlY2xhcmF0aW9ucyouXG5cbkluIHBsYWluIEVuZ2xpc2g6IEJvdGggdHlwZXMgb2YgbGl0ZXJhbHMgY2FuIGJlIGVuY2xvc2VkIGluIG1hdGNoaW5nXG5zaW5nbGUgcXVvdGVzICgiXCciKSBvciBkb3VibGUgcXVvdGVzICgiIiIpLiAgVGhleSBjYW4gYWxzbyBiZSBlbmNsb3NlZFxuaW4gbWF0Y2hpbmcgZ3JvdXBzIG9mIHRocmVlIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzICh0aGVzZSBhcmVcbmdlbmVyYWxseSByZWZlcnJlZCB0byBhcyAqdHJpcGxlLXF1b3RlZCBzdHJpbmdzKikuICBUaGUgYmFja3NsYXNoXG4oIlxcIikgY2hhcmFjdGVyIGlzIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBvdGhlcndpc2UgaGF2ZSBhXG5zcGVjaWFsIG1lYW5pbmcsIHN1Y2ggYXMgbmV3bGluZSwgYmFja3NsYXNoIGl0c2VsZiwgb3IgdGhlIHF1b3RlXG5jaGFyYWN0ZXIuXG5cbkJ5dGVzIGxpdGVyYWxzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCAiXCdiXCciIG9yICJcJ0JcJyI7IHRoZXkgcHJvZHVjZVxuYW4gaW5zdGFuY2Ugb2YgdGhlICJieXRlcyIgdHlwZSBpbnN0ZWFkIG9mIHRoZSAic3RyIiB0eXBlLiAgVGhleSBtYXlcbm9ubHkgY29udGFpbiBBU0NJSSBjaGFyYWN0ZXJzOyBieXRlcyB3aXRoIGEgbnVtZXJpYyB2YWx1ZSBvZiAxMjggb3JcbmdyZWF0ZXIgbXVzdCBiZSBleHByZXNzZWQgd2l0aCBlc2NhcGVzLlxuXG5BcyBvZiBQeXRob24gMy4zIGl0IGlzIHBvc3NpYmxlIGFnYWluIHRvIHByZWZpeCBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBhXG4idSIgcHJlZml4IHRvIHNpbXBsaWZ5IG1haW50ZW5hbmNlIG9mIGR1YWwgMi54IGFuZCAzLnggY29kZWJhc2VzLlxuXG5Cb3RoIHN0cmluZyBhbmQgYnl0ZXMgbGl0ZXJhbHMgbWF5IG9wdGlvbmFsbHkgYmUgcHJlZml4ZWQgd2l0aCBhXG5sZXR0ZXIgIlwnclwnIiBvciAiXCdSXCciOyBzdWNoIHN0cmluZ3MgYXJlIGNhbGxlZCAqcmF3IHN0cmluZ3MqIGFuZCB0cmVhdFxuYmFja3NsYXNoZXMgYXMgbGl0ZXJhbCBjaGFyYWN0ZXJzLiAgQXMgYSByZXN1bHQsIGluIHN0cmluZyBsaXRlcmFscyxcbiJcJ1xcVVwnIiBhbmQgIlwnXFx1XCciIGVzY2FwZXMgaW4gcmF3IHN0cmluZ3MgYXJlIG5vdCB0cmVhdGVkIHNwZWNpYWxseS5cbkdpdmVuIHRoYXQgUHl0aG9uIDIueFwncyByYXcgdW5pY29kZSBsaXRlcmFscyBiZWhhdmUgZGlmZmVyZW50bHkgdGhhblxuUHl0aG9uIDMueFwncyB0aGUgIlwndXJcJyIgc3ludGF4IGlzIG5vdCBzdXBwb3J0ZWQuXG5cbk5ldyBpbiB2ZXJzaW9uIDMuMzogVGhlICJcJ3JiXCciIHByZWZpeCBvZiByYXcgYnl0ZXMgbGl0ZXJhbHMgaGFzIGJlZW5cbmFkZGVkIGFzIGEgc3lub255bSBvZiAiXCdiclwnIi5cblxuTmV3IGluIHZlcnNpb24gMy4zOiBTdXBwb3J0IGZvciB0aGUgdW5pY29kZSBsZWdhY3kgbGl0ZXJhbFxuKCJ1XCd2YWx1ZVwnIikgd2FzIHJlaW50cm9kdWNlZCB0byBzaW1wbGlmeSB0aGUgbWFpbnRlbmFuY2Ugb2YgZHVhbFxuUHl0aG9uIDIueCBhbmQgMy54IGNvZGViYXNlcy4gU2VlICoqUEVQIDQxNCoqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG5JbiB0cmlwbGUtcXVvdGVkIGxpdGVyYWxzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZFxuKGFuZCBhcmUgcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93XG50ZXJtaW5hdGUgdGhlIGxpdGVyYWwuICAoQSAicXVvdGUiIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuIHRoZVxubGl0ZXJhbCwgaS5lLiBlaXRoZXIgIlwnIiBvciAiIiIuKVxuXG5Vbmxlc3MgYW4gIlwnclwnIiBvciAiXCdSXCciIHByZWZpeCBpcyBwcmVzZW50LCBlc2NhcGUgc2VxdWVuY2VzIGluIHN0cmluZ1xuYW5kIGJ5dGVzIGxpdGVyYWxzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byB0aG9zZVxudXNlZCBieSBTdGFuZGFyZCBDLiAgVGhlIHJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmU6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHxcbis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbnwgIlxcbmV3bGluZSIgICAgICAgIHwgQmFja3NsYXNoIGFuZCBuZXdsaW5lIGlnbm9yZWQgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXFxcIiAgICAgICAgICAgICAgfCBCYWNrc2xhc2ggKCJcXCIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXFwnIiAgICAgICAgICAgICAgfCBTaW5nbGUgcXVvdGUgKCJcJyIpICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXCIiICAgICAgICAgICAgICB8IERvdWJsZSBxdW90ZSAoIiIiKSAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxhIiAgICAgICAgICAgICAgfCBBU0NJSSBCZWxsIChCRUwpICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcYiIgICAgICAgICAgICAgIHwgQVNDSUkgQmFja3NwYWNlIChCUykgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXGYiICAgICAgICAgICAgICB8IEFTQ0lJIEZvcm1mZWVkIChGRikgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFxuIiAgICAgICAgICAgICAgfCBBU0NJSSBMaW5lZmVlZCAoTEYpICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcciIgICAgICAgICAgICAgIHwgQVNDSUkgQ2FycmlhZ2UgUmV0dXJuIChDUikgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHQiICAgICAgICAgICAgICB8IEFTQ0lJIEhvcml6b250YWwgVGFiIChUQUIpICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFx2IiAgICAgICAgICAgICAgfCBBU0NJSSBWZXJ0aWNhbCBUYWIgKFZUKSAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcb29vIiAgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggb2N0YWwgdmFsdWUgKm9vbyogIHwgKDEsMykgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58ICJcXHhoaCIgICAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIGhleCB2YWx1ZSAqaGgqICAgICB8ICgyLDMpICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Fc2NhcGUgc2VxdWVuY2VzIG9ubHkgcmVjb2duaXplZCBpbiBzdHJpbmcgbGl0ZXJhbHMgYXJlOlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IEVzY2FwZSBTZXF1ZW5jZSAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICB8XG4rPT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT0rXG58ICJcXE57bmFtZX0iICAgICAgICB8IENoYXJhY3RlciBuYW1lZCAqbmFtZSogaW4gdGhlICAgICB8ICg0KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICB8IFVuaWNvZGUgZGF0YWJhc2UgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCAiXFx1eHh4eCIgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAxNi1iaXQgaGV4IHZhbHVlICAgfCAoNSkgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgfCAqeHh4eCogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgIlxcVXh4eHh4eHh4IiAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMzItYml0IGhleCB2YWx1ZSAgIHwgKDYpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgKnh4eHh4eHh4KiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiBBcyBpbiBTdGFuZGFyZCBDLCB1cCB0byB0aHJlZSBvY3RhbCBkaWdpdHMgYXJlIGFjY2VwdGVkLlxuXG4yLiBVbmxpa2UgaW4gU3RhbmRhcmQgQywgZXhhY3RseSB0d28gaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG5cbjMuIEluIGEgYnl0ZXMgbGl0ZXJhbCwgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIGVzY2FwZXMgZGVub3RlIHRoZVxuICAgYnl0ZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS4gSW4gYSBzdHJpbmcgbGl0ZXJhbCwgdGhlc2UgZXNjYXBlc1xuICAgZGVub3RlIGEgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuXG5cbjQuIENoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IFN1cHBvcnQgZm9yIG5hbWUgYWxpYXNlcyBbMV0gaGFzIGJlZW5cbiAgIGFkZGVkLlxuXG41LiBFeGFjdGx5IGZvdXIgaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG5cbjYuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheS4gIEV4YWN0bHkgZWlnaHRcbiAgIGhleCBkaWdpdHMgYXJlIHJlcXVpcmVkLlxuXG5Vbmxpa2UgU3RhbmRhcmQgQywgYWxsIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBsZWZ0IGluIHRoZVxuc3RyaW5nIHVuY2hhbmdlZCwgaS5lLiwgKnRoZSBiYWNrc2xhc2ggaXMgbGVmdCBpbiB0aGUgcmVzdWx0Ki4gIChUaGlzXG5iZWhhdmlvciBpcyB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmc6IGlmIGFuIGVzY2FwZSBzZXF1ZW5jZSBpcyBtaXN0eXBlZCxcbnRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIG1vcmUgZWFzaWx5IHJlY29nbml6ZWQgYXMgYnJva2VuLikgIEl0IGlzIGFsc29cbmltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluIHN0cmluZ1xubGl0ZXJhbHMgZmFsbCBpbnRvIHRoZSBjYXRlZ29yeSBvZiB1bnJlY29nbml6ZWQgZXNjYXBlcyBmb3IgYnl0ZXNcbmxpdGVyYWxzLlxuXG5FdmVuIGluIGEgcmF3IGxpdGVyYWwsIHF1b3RlcyBjYW4gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLCBidXQgdGhlXG5iYWNrc2xhc2ggcmVtYWlucyBpbiB0aGUgcmVzdWx0OyBmb3IgZXhhbXBsZSwgInIiXFwiIiIgaXMgYSB2YWxpZFxuc3RyaW5nIGxpdGVyYWwgY29uc2lzdGluZyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgZG91YmxlXG5xdW90ZTsgInIiXFwiIiBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCAoZXZlbiBhIHJhdyBzdHJpbmcgY2Fubm90XG5lbmQgaW4gYW4gb2RkIG51bWJlciBvZiBiYWNrc2xhc2hlcykuICBTcGVjaWZpY2FsbHksICphIHJhdyBsaXRlcmFsXG5jYW5ub3QgZW5kIGluIGEgc2luZ2xlIGJhY2tzbGFzaCogKHNpbmNlIHRoZSBiYWNrc2xhc2ggd291bGQgZXNjYXBlXG50aGUgZm9sbG93aW5nIHF1b3RlIGNoYXJhY3RlcikuICBOb3RlIGFsc28gdGhhdCBhIHNpbmdsZSBiYWNrc2xhc2hcbmZvbGxvd2VkIGJ5IGEgbmV3bGluZSBpcyBpbnRlcnByZXRlZCBhcyB0aG9zZSB0d28gY2hhcmFjdGVycyBhcyBwYXJ0XG5vZiB0aGUgbGl0ZXJhbCwgKm5vdCogYXMgYSBsaW5lIGNvbnRpbnVhdGlvbi5cbicsCi0gJ3N1YnNjcmlwdGlvbnMnOiB1J1xuU3Vic2NyaXB0aW9uc1xuKioqKioqKioqKioqKlxuXG5BIHN1YnNjcmlwdGlvbiBzZWxlY3RzIGFuIGl0ZW0gb2YgYSBzZXF1ZW5jZSAoc3RyaW5nLCB0dXBsZSBvciBsaXN0KVxub3IgbWFwcGluZyAoZGljdGlvbmFyeSkgb2JqZWN0OlxuXG4gICBzdWJzY3JpcHRpb24gOjo9IHByaW1hcnkgIlsiIGV4cHJlc3Npb25fbGlzdCAiXSJcblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3QgdGhhdCBzdXBwb3J0cyBzdWJzY3JpcHRpb25cbihsaXN0cyBvciBkaWN0aW9uYXJpZXMgZm9yIGV4YW1wbGUpLiAgVXNlci1kZWZpbmVkIG9iamVjdHMgY2FuIHN1cHBvcnRcbnN1YnNjcmlwdGlvbiBieSBkZWZpbmluZyBhICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG5cbkZvciBidWlsdC1pbiBvYmplY3RzLCB0aGVyZSBhcmUgdHdvIHR5cGVzIG9mIG9iamVjdHMgdGhhdCBzdXBwb3J0XG5zdWJzY3JpcHRpb246XG5cbklmIHRoZSBwcmltYXJ5IGlzIGEgbWFwcGluZywgdGhlIGV4cHJlc3Npb24gbGlzdCBtdXN0IGV2YWx1YXRlIHRvIGFuXG5vYmplY3Qgd2hvc2UgdmFsdWUgaXMgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nLCBhbmQgdGhlXG5zdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgdmFsdWUgaW4gdGhlIG1hcHBpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGF0XG5rZXkuICAoVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBhIHR1cGxlIGV4Y2VwdCBpZiBpdCBoYXMgZXhhY3RseSBvbmVcbml0ZW0uKVxuXG5JZiB0aGUgcHJpbWFyeSBpcyBhIHNlcXVlbmNlLCB0aGUgZXhwcmVzc2lvbiAobGlzdCkgbXVzdCBldmFsdWF0ZSB0b1xuYW4gaW50ZWdlciBvciBhIHNsaWNlIChhcyBkaXNjdXNzZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uKS5cblxuVGhlIGZvcm1hbCBzeW50YXggbWFrZXMgbm8gc3BlY2lhbCBwcm92aXNpb24gZm9yIG5lZ2F0aXZlIGluZGljZXMgaW5cbnNlcXVlbmNlczsgaG93ZXZlciwgYnVpbHQtaW4gc2VxdWVuY2VzIGFsbCBwcm92aWRlIGEgIl9fZ2V0aXRlbV9fKCkiXG5tZXRob2QgdGhhdCBpbnRlcnByZXRzIG5lZ2F0aXZlIGluZGljZXMgYnkgYWRkaW5nIHRoZSBsZW5ndGggb2YgdGhlXG5zZXF1ZW5jZSB0byB0aGUgaW5kZXggKHNvIHRoYXQgInhbLTFdIiBzZWxlY3RzIHRoZSBsYXN0IGl0ZW0gb2YgIngiKS5cblRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIgbGVzcyB0aGFuIHRoZSBudW1iZXJcbm9mIGl0ZW1zIGluIHRoZSBzZXF1ZW5jZSwgYW5kIHRoZSBzdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgaXRlbSB3aG9zZVxuaW5kZXggaXMgdGhhdCB2YWx1ZSAoY291bnRpbmcgZnJvbSB6ZXJvKS4gU2luY2UgdGhlIHN1cHBvcnQgZm9yXG5uZWdhdGl2ZSBpbmRpY2VzIGFuZCBzbGljaW5nIG9jY3VycyBpbiB0aGUgb2JqZWN0XCdzICJfX2dldGl0ZW1fXygpIlxubWV0aG9kLCBzdWJjbGFzc2VzIG92ZXJyaWRpbmcgdGhpcyBtZXRob2Qgd2lsbCBuZWVkIHRvIGV4cGxpY2l0bHkgYWRkXG50aGF0IHN1cHBvcnQuXG5cbkEgc3RyaW5nXCdzIGl0ZW1zIGFyZSBjaGFyYWN0ZXJzLiAgQSBjaGFyYWN0ZXIgaXMgbm90IGEgc2VwYXJhdGUgZGF0YVxudHlwZSBidXQgYSBzdHJpbmcgb2YgZXhhY3RseSBvbmUgY2hhcmFjdGVyLlxuJywKLSAndHJ1dGgnOiB1J1xuVHJ1dGggVmFsdWUgVGVzdGluZ1xuKioqKioqKioqKioqKioqKioqKlxuXG5Bbnkgb2JqZWN0IGNhbiBiZSB0ZXN0ZWQgZm9yIHRydXRoIHZhbHVlLCBmb3IgdXNlIGluIGFuICJpZiIgb3JcbiJ3aGlsZSIgY29uZGl0aW9uIG9yIGFzIG9wZXJhbmQgb2YgdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyBiZWxvdy4gVGhlXG5mb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGZhbHNlOlxuXG4qICJOb25lIlxuXG4qICJGYWxzZSJcblxuKiB6ZXJvIG9mIGFueSBudW1lcmljIHR5cGUsIGZvciBleGFtcGxlLCAiMCIsICIwLjAiLCAiMGoiLlxuXG4qIGFueSBlbXB0eSBzZXF1ZW5jZSwgZm9yIGV4YW1wbGUsICJcJ1wnIiwgIigpIiwgIltdIi5cblxuKiBhbnkgZW1wdHkgbWFwcGluZywgZm9yIGV4YW1wbGUsICJ7fSIuXG5cbiogaW5zdGFuY2VzIG9mIHVzZXItZGVmaW5lZCBjbGFzc2VzLCBpZiB0aGUgY2xhc3MgZGVmaW5lcyBhXG4gICJfX2Jvb2xfXygpIiBvciAiX19sZW5fXygpIiBtZXRob2QsIHdoZW4gdGhhdCBtZXRob2QgcmV0dXJucyB0aGVcbiAgaW50ZWdlciB6ZXJvIG9yICJib29sIiB2YWx1ZSAiRmFsc2UiLiBbMV1cblxuQWxsIG90aGVyIHZhbHVlcyBhcmUgY29uc2lkZXJlZCB0cnVlIC0tLSBzbyBvYmplY3RzIG9mIG1hbnkgdHlwZXMgYXJlXG5hbHdheXMgdHJ1ZS5cblxuT3BlcmF0aW9ucyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIEJvb2xlYW4gcmVzdWx0IGFsd2F5c1xucmV0dXJuICIwIiBvciAiRmFsc2UiIGZvciBmYWxzZSBhbmQgIjEiIG9yICJUcnVlIiBmb3IgdHJ1ZSwgdW5sZXNzXG5vdGhlcndpc2Ugc3RhdGVkLiAoSW1wb3J0YW50IGV4Y2VwdGlvbjogdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyAib3IiXG5hbmQgImFuZCIgYWx3YXlzIHJldHVybiBvbmUgb2YgdGhlaXIgb3BlcmFuZHMuKVxuJywKLSAndHJ5JzogdSdcblRoZSAidHJ5IiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKipcblxuVGhlICJ0cnkiIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGVcbmZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG5cbiAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4gICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl1dICI6IiBzdWl0ZSkrXG4gICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcblxuVGhlICJleGNlcHQiIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlbiBub1xuZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpc1xuZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgc3VpdGUsIGEgc2VhcmNoIGZvciBhblxuZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHQgY2xhdXNlc1xuaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBbiBleHByZXNzaW9uLVxubGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMgYW55XG5leGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQgZXhwcmVzc2lvblxuaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlIHJlc3VsdGluZ1xub2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXMgY29tcGF0aWJsZVxud2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGUgZXhjZXB0aW9uXG5vYmplY3Qgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZSBleGNlcHRpb24uXG5cbklmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiBleGNlcHRpb25cbmhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiBzdGFjay5cblsxXVxuXG5JZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0IGNsYXVzZVxucmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkIGFuZFxuYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb25cbnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50IHJhaXNlZFxudGhlIGV4Y2VwdGlvbikuXG5cbldoZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvXG50aGUgdGFyZ2V0IHNwZWNpZmllZCBhZnRlciB0aGUgImFzIiBrZXl3b3JkIGluIHRoYXQgZXhjZXB0IGNsYXVzZSwgaWZcbnByZXNlbnQsIGFuZCB0aGUgZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZC4gIEFsbCBleGNlcHRcbmNsYXVzZXMgbXVzdCBoYXZlIGFuIGV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyBibG9jayBpc1xucmVhY2hlZCwgZXhlY3V0aW9uIGNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlIHRyeSBzdGF0ZW1lbnQuXG4oVGhpcyBtZWFucyB0aGF0IGlmIHR3byBuZXN0ZWQgaGFuZGxlcnMgZXhpc3QgZm9yIHRoZSBzYW1lIGV4Y2VwdGlvbixcbmFuZCB0aGUgZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgdGhlXG5vdXRlciBoYW5kbGVyIHdpbGwgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLilcblxuV2hlbiBhbiBleGNlcHRpb24gaGFzIGJlZW4gYXNzaWduZWQgdXNpbmcgImFzIHRhcmdldCIsIGl0IGlzIGNsZWFyZWRcbmF0IHRoZSBlbmQgb2YgdGhlIGV4Y2VwdCBjbGF1c2UuICBUaGlzIGlzIGFzIGlmXG5cbiAgIGV4Y2VwdCBFIGFzIE46XG4gICAgICAgZm9vXG5cbndhcyB0cmFuc2xhdGVkIHRvXG5cbiAgIGV4Y2VwdCBFIGFzIE46XG4gICAgICAgdHJ5OlxuICAgICAgICAgICBmb29cbiAgICAgICBmaW5hbGx5OlxuICAgICAgICAgICBkZWwgTlxuXG5UaGlzIG1lYW5zIHRoZSBleGNlcHRpb24gbXVzdCBiZSBhc3NpZ25lZCB0byBhIGRpZmZlcmVudCBuYW1lIHRvIGJlXG5hYmxlIHRvIHJlZmVyIHRvIGl0IGFmdGVyIHRoZSBleGNlcHQgY2xhdXNlLiAgRXhjZXB0aW9ucyBhcmUgY2xlYXJlZFxuYmVjYXVzZSB3aXRoIHRoZSB0cmFjZWJhY2sgYXR0YWNoZWQgdG8gdGhlbSwgdGhleSBmb3JtIGEgcmVmZXJlbmNlXG5jeWNsZSB3aXRoIHRoZSBzdGFjayBmcmFtZSwga2VlcGluZyBhbGwgbG9jYWxzIGluIHRoYXQgZnJhbWUgYWxpdmVcbnVudGlsIHRoZSBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuXG5cbkJlZm9yZSBhbiBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuZXhjZXB0aW9uIGFyZSBzdG9yZWQgaW4gdGhlICJzeXMiIG1vZHVsZSBhbmQgY2FuIGJlIGFjY2Vzc2VkIHZpYVxuInN5cy5leGNfaW5mbygpIi4gInN5cy5leGNfaW5mbygpIiByZXR1cm5zIGEgMy10dXBsZSBjb25zaXN0aW5nIG9mIHRoZVxuZXhjZXB0aW9uIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIGFuZCBhIHRyYWNlYmFjayBvYmplY3QgKHNlZVxuc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KikgaWRlbnRpZnlpbmcgdGhlIHBvaW50IGluIHRoZVxucHJvZ3JhbSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLiAgInN5cy5leGNfaW5mbygpIiB2YWx1ZXMgYXJlXG5yZXN0b3JlZCB0byB0aGVpciBwcmV2aW91cyB2YWx1ZXMgKGJlZm9yZSB0aGUgY2FsbCkgd2hlbiByZXR1cm5pbmdcbmZyb20gYSBmdW5jdGlvbiB0aGF0IGhhbmRsZWQgYW4gZXhjZXB0aW9uLlxuXG5UaGUgb3B0aW9uYWwgImVsc2UiIGNsYXVzZSBpcyBleGVjdXRlZCBpZiBhbmQgd2hlbiBjb250cm9sIGZsb3dzIG9mZlxudGhlIGVuZCBvZiB0aGUgInRyeSIgY2xhdXNlLiBbMl0gRXhjZXB0aW9ucyBpbiB0aGUgImVsc2UiIGNsYXVzZSBhcmVcbm5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgImV4Y2VwdCIgY2xhdXNlcy5cblxuSWYgImZpbmFsbHkiIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIFwnY2xlYW51cFwnIGhhbmRsZXIuICBUaGUgInRyeSJcbmNsYXVzZSBpcyBleGVjdXRlZCwgaW5jbHVkaW5nIGFueSAiZXhjZXB0IiBhbmQgImVsc2UiIGNsYXVzZXMuICBJZiBhblxuZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdCBoYW5kbGVkLCB0aGVcbmV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQuICBJZlxudGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24gaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmQgb2YgdGhlICJmaW5hbGx5IlxuY2xhdXNlLiAgSWYgdGhlICJmaW5hbGx5IiBjbGF1c2UgcmFpc2VzIGFub3RoZXIgZXhjZXB0aW9uLCB0aGUgc2F2ZWRcbmV4Y2VwdGlvbiBpcyBzZXQgYXMgdGhlIGNvbnRleHQgb2YgdGhlIG5ldyBleGNlcHRpb24uIElmIHRoZSAiZmluYWxseSJcbmNsYXVzZSBleGVjdXRlcyBhICJyZXR1cm4iIG9yICJicmVhayIgc3RhdGVtZW50LCB0aGUgc2F2ZWQgZXhjZXB0aW9uXG5pcyBkaXNjYXJkZWQ6XG5cbiAgID4+PiBkZWYgZigpOlxuICAgLi4uICAgICB0cnk6XG4gICAuLi4gICAgICAgICAxLzBcbiAgIC4uLiAgICAgZmluYWxseTpcbiAgIC4uLiAgICAgICAgIHJldHVybiA0MlxuICAgLi4uXG4gICA+Pj4gZigpXG4gICA0MlxuXG5UaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0gZHVyaW5nXG5leGVjdXRpb24gb2YgdGhlICJmaW5hbGx5IiBjbGF1c2UuXG5cbldoZW4gYSAicmV0dXJuIiwgImJyZWFrIiBvciAiY29udGludWUiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpbiB0aGVcbiJ0cnkiIHN1aXRlIG9mIGEgInRyeSIuLi4iZmluYWxseSIgc3RhdGVtZW50LCB0aGUgImZpbmFsbHkiIGNsYXVzZSBpc1xuYWxzbyBleGVjdXRlZCBcJ29uIHRoZSB3YXkgb3V0LlwnIEEgImNvbnRpbnVlIiBzdGF0ZW1lbnQgaXMgaWxsZWdhbCBpblxudGhlICJmaW5hbGx5IiBjbGF1c2UuIChUaGUgcmVhc29uIGlzIGEgcHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50XG5pbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmUgbGlmdGVkIGluIHRoZSBmdXR1cmUpLlxuXG5UaGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgbGFzdCAicmV0dXJuIlxuc3RhdGVtZW50IGV4ZWN1dGVkLiAgU2luY2UgdGhlICJmaW5hbGx5IiBjbGF1c2UgYWx3YXlzIGV4ZWN1dGVzLCBhXG4icmV0dXJuIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2Ugd2lsbCBhbHdheXMgYmUgdGhlXG5sYXN0IG9uZSBleGVjdXRlZDpcblxuICAgPj4+IGRlZiBmb28oKTpcbiAgIC4uLiAgICAgdHJ5OlxuICAgLi4uICAgICAgICAgcmV0dXJuIFwndHJ5XCdcbiAgIC4uLiAgICAgZmluYWxseTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ2ZpbmFsbHlcJ1xuICAgLi4uXG4gICA+Pj4gZm9vKClcbiAgIFwnZmluYWxseVwnXG5cbkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuKkV4Y2VwdGlvbnMqLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlICJyYWlzZSIgc3RhdGVtZW50IHRvXG5nZW5lcmF0ZSBleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cbicsCi0gJ3R5cGVzJzogdSdcblRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeVxuKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkJlbG93IGlzIGEgbGlzdCBvZiB0aGUgdHlwZXMgdGhhdCBhcmUgYnVpbHQgaW50byBQeXRob24uICBFeHRlbnNpb25cbm1vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlXG5pbXBsZW1lbnRhdGlvbikgY2FuIGRlZmluZSBhZGRpdGlvbmFsIHR5cGVzLiAgRnV0dXJlIHZlcnNpb25zIG9mXG5QeXRob24gbWF5IGFkZCB0eXBlcyB0byB0aGUgdHlwZSBoaWVyYXJjaHkgKGUuZy4sIHJhdGlvbmFsIG51bWJlcnMsXG5lZmZpY2llbnRseSBzdG9yZWQgYXJyYXlzIG9mIGludGVnZXJzLCBldGMuKSwgYWx0aG91Z2ggc3VjaCBhZGRpdGlvbnNcbndpbGwgb2Z0ZW4gYmUgcHJvdmlkZWQgdmlhIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGluc3RlYWQuXG5cblNvbWUgb2YgdGhlIHR5cGUgZGVzY3JpcHRpb25zIGJlbG93IGNvbnRhaW4gYSBwYXJhZ3JhcGggbGlzdGluZ1xuXCdzcGVjaWFsIGF0dHJpYnV0ZXMuXCcgIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlXG5pbXBsZW1lbnRhdGlvbiBhbmQgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuICBUaGVpciBkZWZpbml0aW9uXG5tYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cbk5vbmVcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZSAiTm9uZSIuIEl0XG4gICBpcyB1c2VkIHRvIHNpZ25pZnkgdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSBpbiBtYW55IHNpdHVhdGlvbnMsIGUuZy4sXG4gICBpdCBpcyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvblwndCBleHBsaWNpdGx5IHJldHVyblxuICAgYW55dGhpbmcuIEl0cyB0cnV0aCB2YWx1ZSBpcyBmYWxzZS5cblxuTm90SW1wbGVtZW50ZWRcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZVxuICAgIk5vdEltcGxlbWVudGVkIi4gTnVtZXJpYyBtZXRob2RzIGFuZCByaWNoIGNvbXBhcmlzb24gbWV0aG9kc1xuICAgc2hvdWxkIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZXkgZG8gbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvclxuICAgdGhlIG9wZXJhbmRzIHByb3ZpZGVkLiAgKFRoZSBpbnRlcnByZXRlciB3aWxsIHRoZW4gdHJ5IHRoZVxuICAgcmVmbGVjdGVkIG9wZXJhdGlvbiwgb3Igc29tZSBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZVxuICAgb3BlcmF0b3IuKSAgSXRzIHRydXRoIHZhbHVlIGlzIHRydWUuXG5cbiAgIFNlZSAqSW1wbGVtZW50aW5nIHRoZSBhcml0aG1ldGljIG9wZXJhdGlvbnMqIGZvciBtb3JlIGRldGFpbHMuXG5cbkVsbGlwc2lzXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGxpdGVyYWwgIi4uLiIgb3IgdGhlXG4gICBidWlsdC1pbiBuYW1lICJFbGxpcHNpcyIuICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cblxuIm51bWJlcnMuTnVtYmVyIlxuICAgVGhlc2UgYXJlIGNyZWF0ZWQgYnkgbnVtZXJpYyBsaXRlcmFscyBhbmQgcmV0dXJuZWQgYXMgcmVzdWx0cyBieVxuICAgYXJpdGhtZXRpYyBvcGVyYXRvcnMgYW5kIGFyaXRobWV0aWMgYnVpbHQtaW4gZnVuY3Rpb25zLiAgTnVtZXJpY1xuICAgb2JqZWN0cyBhcmUgaW1tdXRhYmxlOyBvbmNlIGNyZWF0ZWQgdGhlaXIgdmFsdWUgbmV2ZXIgY2hhbmdlcy5cbiAgIFB5dGhvbiBudW1iZXJzIGFyZSBvZiBjb3Vyc2Ugc3Ryb25nbHkgcmVsYXRlZCB0byBtYXRoZW1hdGljYWxcbiAgIG51bWJlcnMsIGJ1dCBzdWJqZWN0IHRvIHRoZSBsaW1pdGF0aW9ucyBvZiBudW1lcmljYWwgcmVwcmVzZW50YXRpb25cbiAgIGluIGNvbXB1dGVycy5cblxuICAgUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYW5kXG4gICBjb21wbGV4IG51bWJlcnM6XG5cbiAgICJudW1iZXJzLkludGVncmFsIlxuICAgICAgVGhlc2UgcmVwcmVzZW50IGVsZW1lbnRzIGZyb20gdGhlIG1hdGhlbWF0aWNhbCBzZXQgb2YgaW50ZWdlcnNcbiAgICAgIChwb3NpdGl2ZSBhbmQgbmVnYXRpdmUpLlxuXG4gICAgICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGludGVnZXJzOlxuXG4gICAgICBJbnRlZ2VycyAoImludCIpXG5cbiAgICAgICAgIFRoZXNlIHJlcHJlc2VudCBudW1iZXJzIGluIGFuIHVubGltaXRlZCByYW5nZSwgc3ViamVjdCB0b1xuICAgICAgICAgYXZhaWxhYmxlICh2aXJ0dWFsKSBtZW1vcnkgb25seS4gIEZvciB0aGUgcHVycG9zZSBvZiBzaGlmdFxuICAgICAgICAgYW5kIG1hc2sgb3BlcmF0aW9ucywgYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaXMgYXNzdW1lZCwgYW5kXG4gICAgICAgICBuZWdhdGl2ZSBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiBhIHZhcmlhbnQgb2YgMlwnc1xuICAgICAgICAgY29tcGxlbWVudCB3aGljaCBnaXZlcyB0aGUgaWxsdXNpb24gb2YgYW4gaW5maW5pdGUgc3RyaW5nIG9mXG4gICAgICAgICBzaWduIGJpdHMgZXh0ZW5kaW5nIHRvIHRoZSBsZWZ0LlxuXG4gICAgICBCb29sZWFucyAoImJvb2wiKVxuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IHRoZSB0cnV0aCB2YWx1ZXMgRmFsc2UgYW5kIFRydWUuICBUaGUgdHdvXG4gICAgICAgICBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgdGhlXG4gICAgICAgICBvbmx5IEJvb2xlYW4gb2JqZWN0cy4gVGhlIEJvb2xlYW4gdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlXG4gICAgICAgICBpbnRlZ2VyIHR5cGUsIGFuZCBCb29sZWFuIHZhbHVlcyBiZWhhdmUgbGlrZSB0aGUgdmFsdWVzIDAgYW5kXG4gICAgICAgICAxLCByZXNwZWN0aXZlbHksIGluIGFsbW9zdCBhbGwgY29udGV4dHMsIHRoZSBleGNlcHRpb24gYmVpbmdcbiAgICAgICAgIHRoYXQgd2hlbiBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIHRoZSBzdHJpbmdzICIiRmFsc2UiIiBvclxuICAgICAgICAgIiJUcnVlIiIgYXJlIHJldHVybmVkLCByZXNwZWN0aXZlbHkuXG5cbiAgICAgIFRoZSBydWxlcyBmb3IgaW50ZWdlciByZXByZXNlbnRhdGlvbiBhcmUgaW50ZW5kZWQgdG8gZ2l2ZSB0aGVcbiAgICAgIG1vc3QgbWVhbmluZ2Z1bCBpbnRlcnByZXRhdGlvbiBvZiBzaGlmdCBhbmQgbWFzayBvcGVyYXRpb25zXG4gICAgICBpbnZvbHZpbmcgbmVnYXRpdmUgaW50ZWdlcnMuXG5cbiAgICJudW1iZXJzLlJlYWwiICgiZmxvYXQiKVxuICAgICAgVGhlc2UgcmVwcmVzZW50IG1hY2hpbmUtbGV2ZWwgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludFxuICAgICAgbnVtYmVycy4gWW91IGFyZSBhdCB0aGUgbWVyY3kgb2YgdGhlIHVuZGVybHlpbmcgbWFjaGluZVxuICAgICAgYXJjaGl0ZWN0dXJlIChhbmQgQyBvciBKYXZhIGltcGxlbWVudGF0aW9uKSBmb3IgdGhlIGFjY2VwdGVkXG4gICAgICByYW5nZSBhbmQgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cuIFB5dGhvbiBkb2VzIG5vdCBzdXBwb3J0IHNpbmdsZS1cbiAgICAgIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzOyB0aGUgc2F2aW5ncyBpbiBwcm9jZXNzb3IgYW5kXG4gICAgICBtZW1vcnkgdXNhZ2UgdGhhdCBhcmUgdXN1YWxseSB0aGUgcmVhc29uIGZvciB1c2luZyB0aGVzZSBhcmVcbiAgICAgIGR3YXJmZWQgYnkgdGhlIG92ZXJoZWFkIG9mIHVzaW5nIG9iamVjdHMgaW4gUHl0aG9uLCBzbyB0aGVyZSBpc1xuICAgICAgbm8gcmVhc29uIHRvIGNvbXBsaWNhdGUgdGhlIGxhbmd1YWdlIHdpdGggdHdvIGtpbmRzIG9mIGZsb2F0aW5nXG4gICAgICBwb2ludCBudW1iZXJzLlxuXG4gICAibnVtYmVycy5Db21wbGV4IiAoImNvbXBsZXgiKVxuICAgICAgVGhlc2UgcmVwcmVzZW50IGNvbXBsZXggbnVtYmVycyBhcyBhIHBhaXIgb2YgbWFjaGluZS1sZXZlbFxuICAgICAgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgVGhlIHNhbWUgY2F2ZWF0cyBhcHBseVxuICAgICAgYXMgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2YgYVxuICAgICAgY29tcGxleCBudW1iZXIgInoiIGNhbiBiZSByZXRyaWV2ZWQgdGhyb3VnaCB0aGUgcmVhZC1vbmx5XG4gICAgICBhdHRyaWJ1dGVzICJ6LnJlYWwiIGFuZCAiei5pbWFnIi5cblxuU2VxdWVuY2VzXG4gICBUaGVzZSByZXByZXNlbnQgZmluaXRlIG9yZGVyZWQgc2V0cyBpbmRleGVkIGJ5IG5vbi1uZWdhdGl2ZVxuICAgbnVtYmVycy4gVGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zXG4gICBvZiBhIHNlcXVlbmNlLiBXaGVuIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBpcyAqbiosIHRoZSBpbmRleCBzZXRcbiAgIGNvbnRhaW5zIHRoZSBudW1iZXJzIDAsIDEsIC4uLiwgKm4qLTEuICBJdGVtICppKiBvZiBzZXF1ZW5jZSAqYSogaXNcbiAgIHNlbGVjdGVkIGJ5ICJhW2ldIi5cblxuICAgU2VxdWVuY2VzIGFsc28gc3VwcG9ydCBzbGljaW5nOiAiYVtpOmpdIiBzZWxlY3RzIGFsbCBpdGVtcyB3aXRoXG4gICBpbmRleCAqayogc3VjaCB0aGF0ICppKiAiPD0iICprKiAiPCIgKmoqLiAgV2hlbiB1c2VkIGFzIGFuXG4gICBleHByZXNzaW9uLCBhIHNsaWNlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZS4gIFRoaXMgaW1wbGllc1xuICAgdGhhdCB0aGUgaW5kZXggc2V0IGlzIHJlbnVtYmVyZWQgc28gdGhhdCBpdCBzdGFydHMgYXQgMC5cblxuICAgU29tZSBzZXF1ZW5jZXMgYWxzbyBzdXBwb3J0ICJleHRlbmRlZCBzbGljaW5nIiB3aXRoIGEgdGhpcmQgInN0ZXAiXG4gICBwYXJhbWV0ZXI6ICJhW2k6ajprXSIgc2VsZWN0cyBhbGwgaXRlbXMgb2YgKmEqIHdpdGggaW5kZXggKngqIHdoZXJlXG4gICAieCA9IGkgKyBuKmsiLCAqbiogIj49IiAiMCIgYW5kICppKiAiPD0iICp4KiAiPCIgKmoqLlxuXG4gICBTZXF1ZW5jZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG11dGFiaWxpdHk6XG5cbiAgIEltbXV0YWJsZSBzZXF1ZW5jZXNcbiAgICAgIEFuIG9iamVjdCBvZiBhbiBpbW11dGFibGUgc2VxdWVuY2UgdHlwZSBjYW5ub3QgY2hhbmdlIG9uY2UgaXQgaXNcbiAgICAgIGNyZWF0ZWQuICAoSWYgdGhlIG9iamVjdCBjb250YWlucyByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHMsXG4gICAgICB0aGVzZSBvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgaG93ZXZlcixcbiAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbiBpbW11dGFibGVcbiAgICAgIG9iamVjdCBjYW5ub3QgY2hhbmdlLilcblxuICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlczpcblxuICAgICAgU3RyaW5nc1xuICAgICAgICAgQSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhhdCByZXByZXNlbnQgVW5pY29kZSBjb2RlXG4gICAgICAgICBwb2ludHMuIEFsbCB0aGUgY29kZSBwb2ludHMgaW4gdGhlIHJhbmdlICJVKzAwMDAgLSBVKzEwRkZGRiJcbiAgICAgICAgIGNhbiBiZSByZXByZXNlbnRlZCBpbiBhIHN0cmluZy4gIFB5dGhvbiBkb2VzblwndCBoYXZlIGEgImNoYXIiXG4gICAgICAgICB0eXBlOyBpbnN0ZWFkLCBldmVyeSBjb2RlIHBvaW50IGluIHRoZSBzdHJpbmcgaXMgcmVwcmVzZW50ZWRcbiAgICAgICAgIGFzIGEgc3RyaW5nIG9iamVjdCB3aXRoIGxlbmd0aCAiMSIuICBUaGUgYnVpbHQtaW4gZnVuY3Rpb25cbiAgICAgICAgICJvcmQoKSIgY29udmVydHMgYSBjb2RlIHBvaW50IGZyb20gaXRzIHN0cmluZyBmb3JtIHRvIGFuXG4gICAgICAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSAiMCAtIDEwRkZGRiI7ICJjaHIoKSIgY29udmVydHMgYW5cbiAgICAgICAgIGludGVnZXIgaW4gdGhlIHJhbmdlICIwIC0gMTBGRkZGIiB0byB0aGUgY29ycmVzcG9uZGluZyBsZW5ndGhcbiAgICAgICAgICIxIiBzdHJpbmcgb2JqZWN0LiAic3RyLmVuY29kZSgpIiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGFcbiAgICAgICAgICJzdHIiIHRvICJieXRlcyIgdXNpbmcgdGhlIGdpdmVuIHRleHQgZW5jb2RpbmcsIGFuZFxuICAgICAgICAgImJ5dGVzLmRlY29kZSgpIiBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBvcHBvc2l0ZS5cblxuICAgICAgVHVwbGVzXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSB0dXBsZSBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiBUdXBsZXMgb2ZcbiAgICAgICAgIHR3byBvciBtb3JlIGl0ZW1zIGFyZSBmb3JtZWQgYnkgY29tbWEtc2VwYXJhdGVkIGxpc3RzIG9mXG4gICAgICAgICBleHByZXNzaW9ucy4gIEEgdHVwbGUgb2Ygb25lIGl0ZW0gKGEgXCdzaW5nbGV0b25cJykgY2FuIGJlXG4gICAgICAgICBmb3JtZWQgYnkgYWZmaXhpbmcgYSBjb21tYSB0byBhbiBleHByZXNzaW9uIChhbiBleHByZXNzaW9uIGJ5XG4gICAgICAgICBpdHNlbGYgZG9lcyBub3QgY3JlYXRlIGEgdHVwbGUsIHNpbmNlIHBhcmVudGhlc2VzIG11c3QgYmVcbiAgICAgICAgIHVzYWJsZSBmb3IgZ3JvdXBpbmcgb2YgZXhwcmVzc2lvbnMpLiAgQW4gZW1wdHkgdHVwbGUgY2FuIGJlXG4gICAgICAgICBmb3JtZWQgYnkgYW4gZW1wdHkgcGFpciBvZiBwYXJlbnRoZXNlcy5cblxuICAgICAgQnl0ZXNcbiAgICAgICAgIEEgYnl0ZXMgb2JqZWN0IGlzIGFuIGltbXV0YWJsZSBhcnJheS4gIFRoZSBpdGVtcyBhcmUgOC1iaXRcbiAgICAgICAgIGJ5dGVzLCByZXByZXNlbnRlZCBieSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMCA8PSB4IDwgMjU2LlxuICAgICAgICAgQnl0ZXMgbGl0ZXJhbHMgKGxpa2UgImJcJ2FiY1wnIikgYW5kIHRoZSBidWlsdC1pbiBmdW5jdGlvblxuICAgICAgICAgImJ5dGVzKCkiIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBieXRlcyBvYmplY3RzLiAgQWxzbyxcbiAgICAgICAgIGJ5dGVzIG9iamVjdHMgY2FuIGJlIGRlY29kZWQgdG8gc3RyaW5ncyB2aWEgdGhlICJkZWNvZGUoKSJcbiAgICAgICAgIG1ldGhvZC5cblxuICAgTXV0YWJsZSBzZXF1ZW5jZXNcbiAgICAgIE11dGFibGUgc2VxdWVuY2VzIGNhbiBiZSBjaGFuZ2VkIGFmdGVyIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGVcbiAgICAgIHN1YnNjcmlwdGlvbiBhbmQgc2xpY2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQgYXMgdGhlIHRhcmdldCBvZlxuICAgICAgYXNzaWdubWVudCBhbmQgImRlbCIgKGRlbGV0ZSkgc3RhdGVtZW50cy5cblxuICAgICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIG11dGFibGUgc2VxdWVuY2UgdHlwZXM6XG5cbiAgICAgIExpc3RzXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSBsaXN0IGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuICBMaXN0cyBhcmVcbiAgICAgICAgIGZvcm1lZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaW5cbiAgICAgICAgIHNxdWFyZSBicmFja2V0cy4gKE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gc3BlY2lhbCBjYXNlcyBuZWVkZWRcbiAgICAgICAgIHRvIGZvcm0gbGlzdHMgb2YgbGVuZ3RoIDAgb3IgMS4pXG5cbiAgICAgIEJ5dGUgQXJyYXlzXG4gICAgICAgICBBIGJ5dGVhcnJheSBvYmplY3QgaXMgYSBtdXRhYmxlIGFycmF5LiBUaGV5IGFyZSBjcmVhdGVkIGJ5XG4gICAgICAgICB0aGUgYnVpbHQtaW4gImJ5dGVhcnJheSgpIiBjb25zdHJ1Y3Rvci4gIEFzaWRlIGZyb20gYmVpbmdcbiAgICAgICAgIG11dGFibGUgKGFuZCBoZW5jZSB1bmhhc2hhYmxlKSwgYnl0ZSBhcnJheXMgb3RoZXJ3aXNlIHByb3ZpZGVcbiAgICAgICAgIHRoZSBzYW1lIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbGl0eSBhcyBpbW11dGFibGUgYnl0ZXNcbiAgICAgICAgIG9iamVjdHMuXG5cbiAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlICJhcnJheSIgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBleGFtcGxlIG9mIGFcbiAgICAgIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgYXMgZG9lcyB0aGUgImNvbGxlY3Rpb25zIiBtb2R1bGUuXG5cblNldCB0eXBlc1xuICAgVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGVcbiAgIG9iamVjdHMuIEFzIHN1Y2gsIHRoZXkgY2Fubm90IGJlIGluZGV4ZWQgYnkgYW55IHN1YnNjcmlwdC4gSG93ZXZlcixcbiAgIHRoZXkgY2FuIGJlIGl0ZXJhdGVkIG92ZXIsIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gImxlbigpIlxuICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUgZmFzdFxuICAgbWVtYmVyc2hpcCB0ZXN0aW5nLCByZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gYSBzZXF1ZW5jZSwgYW5kXG4gICBjb21wdXRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBpbnRlcnNlY3Rpb24sIHVuaW9uLFxuICAgZGlmZmVyZW5jZSwgYW5kIHN5bW1ldHJpYyBkaWZmZXJlbmNlLlxuXG4gICBGb3Igc2V0IGVsZW1lbnRzLCB0aGUgc2FtZSBpbW11dGFiaWxpdHkgcnVsZXMgYXBwbHkgYXMgZm9yXG4gICBkaWN0aW9uYXJ5IGtleXMuIE5vdGUgdGhhdCBudW1lcmljIHR5cGVzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3JcbiAgIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgIjEiIGFuZFxuICAgIjEuMCIpLCBvbmx5IG9uZSBvZiB0aGVtIGNhbiBiZSBjb250YWluZWQgaW4gYSBzZXQuXG5cbiAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBzZXQgdHlwZXM6XG5cbiAgIFNldHNcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBhIG11dGFibGUgc2V0LiBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pblxuICAgICAgInNldCgpIiBjb25zdHJ1Y3RvciBhbmQgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgYnkgc2V2ZXJhbFxuICAgICAgbWV0aG9kcywgc3VjaCBhcyAiYWRkKCkiLlxuXG4gICBGcm96ZW4gc2V0c1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGFuIGltbXV0YWJsZSBzZXQuICBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZVxuICAgICAgYnVpbHQtaW4gImZyb3plbnNldCgpIiBjb25zdHJ1Y3Rvci4gIEFzIGEgZnJvemVuc2V0IGlzIGltbXV0YWJsZVxuICAgICAgYW5kICpoYXNoYWJsZSosIGl0IGNhbiBiZSB1c2VkIGFnYWluIGFzIGFuIGVsZW1lbnQgb2YgYW5vdGhlclxuICAgICAgc2V0LCBvciBhcyBhIGRpY3Rpb25hcnkga2V5LlxuXG5NYXBwaW5nc1xuICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBhcmJpdHJhcnkgaW5kZXhcbiAgIHNldHMuIFRoZSBzdWJzY3JpcHQgbm90YXRpb24gImFba10iIHNlbGVjdHMgdGhlIGl0ZW0gaW5kZXhlZCBieSAiayJcbiAgIGZyb20gdGhlIG1hcHBpbmcgImEiOyB0aGlzIGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zIGFuZCBhcyB0aGVcbiAgIHRhcmdldCBvZiBhc3NpZ25tZW50cyBvciAiZGVsIiBzdGF0ZW1lbnRzLiBUaGUgYnVpbHQtaW4gZnVuY3Rpb25cbiAgICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgbWFwcGluZy5cblxuICAgVGhlcmUgaXMgY3VycmVudGx5IGEgc2luZ2xlIGludHJpbnNpYyBtYXBwaW5nIHR5cGU6XG5cbiAgIERpY3Rpb25hcmllc1xuICAgICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBuZWFybHlcbiAgICAgIGFyYml0cmFyeSB2YWx1ZXMuICBUaGUgb25seSB0eXBlcyBvZiB2YWx1ZXMgbm90IGFjY2VwdGFibGUgYXNcbiAgICAgIGtleXMgYXJlIHZhbHVlcyBjb250YWluaW5nIGxpc3RzIG9yIGRpY3Rpb25hcmllcyBvciBvdGhlclxuICAgICAgbXV0YWJsZSB0eXBlcyB0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3RcbiAgICAgIGlkZW50aXR5LCB0aGUgcmVhc29uIGJlaW5nIHRoYXQgdGhlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZlxuICAgICAgZGljdGlvbmFyaWVzIHJlcXVpcmVzIGEga2V5XCdzIGhhc2ggdmFsdWUgdG8gcmVtYWluIGNvbnN0YW50LlxuICAgICAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpY1xuICAgICAgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgIjEiIGFuZCAiMS4wIilcbiAgICAgIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXggdGhlIHNhbWVcbiAgICAgIGRpY3Rpb25hcnkgZW50cnkuXG5cbiAgICAgIERpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgInsuLi59IlxuICAgICAgbm90YXRpb24gKHNlZSBzZWN0aW9uICpEaWN0aW9uYXJ5IGRpc3BsYXlzKikuXG5cbiAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlcyAiZGJtLm5kYm0iIGFuZCAiZGJtLmdudSIgcHJvdmlkZVxuICAgICAgYWRkaXRpb25hbCBleGFtcGxlcyBvZiBtYXBwaW5nIHR5cGVzLCBhcyBkb2VzIHRoZSAiY29sbGVjdGlvbnMiXG4gICAgICBtb2R1bGUuXG5cbkNhbGxhYmxlIHR5cGVzXG4gICBUaGVzZSBhcmUgdGhlIHR5cGVzIHRvIHdoaWNoIHRoZSBmdW5jdGlvbiBjYWxsIG9wZXJhdGlvbiAoc2VlXG4gICBzZWN0aW9uICpDYWxscyopIGNhbiBiZSBhcHBsaWVkOlxuXG4gICBVc2VyLWRlZmluZWQgZnVuY3Rpb25zXG4gICAgICBBIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgaXMgY3JlYXRlZCBieSBhIGZ1bmN0aW9uXG4gICAgICBkZWZpbml0aW9uIChzZWUgc2VjdGlvbiAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqKS4gIEl0IHNob3VsZCBiZVxuICAgICAgY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtc1xuICAgICAgYXMgdGhlIGZ1bmN0aW9uXCdzIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdC5cblxuICAgICAgU3BlY2lhbCBhdHRyaWJ1dGVzOlxuXG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBBdHRyaWJ1dGUgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT0rXG4gICAgICB8ICJfX2RvY19fIiAgICAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvbiAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZywgb3IgIk5vbmUiIGlmICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1bmF2YWlsYWJsZTsgbm90IGluaGVyaXRlZCBieSAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc3ViY2xhc3NlcyAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX25hbWVfXyIgICAgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgbmFtZSAgICAgICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX3F1YWxuYW1lX18iICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgKnF1YWxpZmllZCBuYW1lKiB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5ldyBpbiB2ZXJzaW9uIDMuMy4gICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19tb2R1bGVfXyIgICAgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluLCBvciAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAiTm9uZSIgaWYgdW5hdmFpbGFibGUuICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fZGVmYXVsdHNfXyIgICAgICAgICAgICB8IEEgdHVwbGUgY29udGFpbmluZyBkZWZhdWx0ICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudCB2YWx1ZXMgZm9yIHRob3NlICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnRzIHRoYXQgaGF2ZSBkZWZhdWx0cywgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yICJOb25lIiBpZiBubyBhcmd1bWVudHMgaGF2ZSAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhIGRlZmF1bHQgdmFsdWUgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fY29kZV9fIiAgICAgICAgICAgICAgICB8IFRoZSBjb2RlIG9iamVjdCByZXByZXNlbnRpbmcgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29tcGlsZWQgZnVuY3Rpb24gYm9keS4gICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fZ2xvYmFsc19fIiAgICAgICAgICAgICB8IEEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5ICAgfCBSZWFkLW9ubHkgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGF0IGhvbGRzIHRoZSBmdW5jdGlvblwncyAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGdsb2JhbCB2YXJpYWJsZXMgLS0tIHRoZSBnbG9iYWwgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZSBpbiAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLiB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2RpY3RfXyIgICAgICAgICAgICAgICAgfCBUaGUgbmFtZXNwYWNlIHN1cHBvcnRpbmcgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJiaXRyYXJ5IGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8ICJfX2Nsb3N1cmVfXyIgICAgICAgICAgICAgfCAiTm9uZSIgb3IgYSB0dXBsZSBvZiBjZWxscyB0aGF0IHwgUmVhZC1vbmx5ICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29udGFpbiBiaW5kaW5ncyBmb3IgdGhlICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uXCdzIGZyZWUgdmFyaWFibGVzLiAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgIl9fYW5ub3RhdGlvbnNfXyIgICAgICAgICB8IEEgZGljdCBjb250YWluaW5nIGFubm90YXRpb25zICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvZiBwYXJhbWV0ZXJzLiAgVGhlIGtleXMgb2YgdGhlIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGljdCBhcmUgdGhlIHBhcmFtZXRlciBuYW1lcywgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFuZCAiXCdyZXR1cm5cJyIgZm9yIHRoZSByZXR1cm4gICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFubm90YXRpb24sIGlmIHByb3ZpZGVkLiAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCAiX19rd2RlZmF1bHRzX18iICAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgZGVmYXVsdHMgZm9yICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmQtb25seSBwYXJhbWV0ZXJzLiAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuXG4gICAgICBNb3N0IG9mIHRoZSBhdHRyaWJ1dGVzIGxhYmVsbGVkICJXcml0YWJsZSIgY2hlY2sgdGhlIHR5cGUgb2YgdGhlXG4gICAgICBhc3NpZ25lZCB2YWx1ZS5cblxuICAgICAgRnVuY3Rpb24gb2JqZWN0cyBhbHNvIHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcnlcbiAgICAgIGF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gYXR0YWNoIG1ldGFkYXRhXG4gICAgICB0byBmdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZSBkb3Qtbm90YXRpb24gaXMgdXNlZCB0byBnZXQgYW5kXG4gICAgICBzZXQgc3VjaCBhdHRyaWJ1dGVzLiAqTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHlcbiAgICAgIHN1cHBvcnRzIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gRnVuY3Rpb25cbiAgICAgIGF0dHJpYnV0ZXMgb24gYnVpbHQtaW4gZnVuY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlXG4gICAgICBmdXR1cmUuKlxuXG4gICAgICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb25cJ3MgZGVmaW5pdGlvbiBjYW4gYmVcbiAgICAgIHJldHJpZXZlZCBmcm9tIGl0cyBjb2RlIG9iamVjdDsgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBpbnRlcm5hbFxuICAgICAgdHlwZXMgYmVsb3cuXG5cbiAgIEluc3RhbmNlIG1ldGhvZHNcbiAgICAgIEFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgY29tYmluZXMgYSBjbGFzcywgYSBjbGFzcyBpbnN0YW5jZSBhbmRcbiAgICAgIGFueSBjYWxsYWJsZSBvYmplY3QgKG5vcm1hbGx5IGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uKS5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogIl9fc2VsZl9fIiBpcyB0aGUgY2xhc3MgaW5zdGFuY2VcbiAgICAgIG9iamVjdCwgIl9fZnVuY19fIiBpcyB0aGUgZnVuY3Rpb24gb2JqZWN0OyAiX19kb2NfXyIgaXMgdGhlXG4gICAgICBtZXRob2RcJ3MgZG9jdW1lbnRhdGlvbiAoc2FtZSBhcyAiX19mdW5jX18uX19kb2NfXyIpOyAiX19uYW1lX18iXG4gICAgICBpcyB0aGUgbWV0aG9kIG5hbWUgKHNhbWUgYXMgIl9fZnVuY19fLl9fbmFtZV9fIik7ICJfX21vZHVsZV9fIlxuICAgICAgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgbWV0aG9kIHdhcyBkZWZpbmVkIGluLCBvciAiTm9uZSJcbiAgICAgIGlmIHVuYXZhaWxhYmxlLlxuXG4gICAgICBNZXRob2RzIGFsc28gc3VwcG9ydCBhY2Nlc3NpbmcgKGJ1dCBub3Qgc2V0dGluZykgdGhlIGFyYml0cmFyeVxuICAgICAgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QuXG5cbiAgICAgIFVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0cyBtYXkgYmUgY3JlYXRlZCB3aGVuIGdldHRpbmcgYW5cbiAgICAgIGF0dHJpYnV0ZSBvZiBhIGNsYXNzIChwZXJoYXBzIHZpYSBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzKSwgaWZcbiAgICAgIHRoYXQgYXR0cmlidXRlIGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBvciBhIGNsYXNzXG4gICAgICBtZXRob2Qgb2JqZWN0LlxuXG4gICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgdXNlci1cbiAgICAgIGRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcyB2aWEgb25lIG9mIGl0cyBpbnN0YW5jZXMsXG4gICAgICBpdHMgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLCBhbmQgdGhlIG1ldGhvZCBvYmplY3RcbiAgICAgIGlzIHNhaWQgdG8gYmUgYm91bmQuICBUaGUgbmV3IG1ldGhvZFwncyAiX19mdW5jX18iIGF0dHJpYnV0ZSBpc1xuICAgICAgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZ1xuICAgICAgYW5vdGhlciBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgdGhlIGJlaGF2aW91ciBpc1xuICAgICAgdGhlIHNhbWUgYXMgZm9yIGEgZnVuY3Rpb24gb2JqZWN0LCBleGNlcHQgdGhhdCB0aGUgIl9fZnVuY19fIlxuICAgICAgYXR0cmlidXRlIG9mIHRoZSBuZXcgaW5zdGFuY2UgaXMgbm90IHRoZSBvcmlnaW5hbCBtZXRob2Qgb2JqZWN0XG4gICAgICBidXQgaXRzICJfX2Z1bmNfXyIgYXR0cmlidXRlLlxuXG4gICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgY2xhc3NcbiAgICAgIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCBpdHMgIl9fc2VsZl9fIiBhdHRyaWJ1dGVcbiAgICAgIGlzIHRoZSBjbGFzcyBpdHNlbGYsIGFuZCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUgaXMgdGhlXG4gICAgICBmdW5jdGlvbiBvYmplY3QgdW5kZXJseWluZyB0aGUgY2xhc3MgbWV0aG9kLlxuXG4gICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGUgdW5kZXJseWluZ1xuICAgICAgZnVuY3Rpb24gKCJfX2Z1bmNfXyIpIGlzIGNhbGxlZCwgaW5zZXJ0aW5nIHRoZSBjbGFzcyBpbnN0YW5jZVxuICAgICAgKCJfX3NlbGZfXyIpIGluIGZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yIGluc3RhbmNlLCB3aGVuXG4gICAgICAiQyIgaXMgYSBjbGFzcyB3aGljaCBjb250YWlucyBhIGRlZmluaXRpb24gZm9yIGEgZnVuY3Rpb24gImYoKSIsXG4gICAgICBhbmQgIngiIGlzIGFuIGluc3RhbmNlIG9mICJDIiwgY2FsbGluZyAieC5mKDEpIiBpcyBlcXVpdmFsZW50IHRvXG4gICAgICBjYWxsaW5nICJDLmYoeCwgMSkiLlxuXG4gICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgZGVyaXZlZCBmcm9tIGEgY2xhc3MgbWV0aG9kXG4gICAgICBvYmplY3QsIHRoZSAiY2xhc3MgaW5zdGFuY2UiIHN0b3JlZCBpbiAiX19zZWxmX18iIHdpbGwgYWN0dWFsbHlcbiAgICAgIGJlIHRoZSBjbGFzcyBpdHNlbGYsIHNvIHRoYXQgY2FsbGluZyBlaXRoZXIgInguZigxKSIgb3IgIkMuZigxKSJcbiAgICAgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyAiZihDLDEpIiB3aGVyZSAiZiIgaXMgdGhlIHVuZGVybHlpbmdcbiAgICAgIGZ1bmN0aW9uLlxuXG4gICAgICBOb3RlIHRoYXQgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gZnVuY3Rpb24gb2JqZWN0IHRvIGluc3RhbmNlXG4gICAgICBtZXRob2Qgb2JqZWN0IGhhcHBlbnMgZWFjaCB0aW1lIHRoZSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkIGZyb21cbiAgICAgIHRoZSBpbnN0YW5jZS4gIEluIHNvbWUgY2FzZXMsIGEgZnJ1aXRmdWwgb3B0aW1pemF0aW9uIGlzIHRvXG4gICAgICBhc3NpZ24gdGhlIGF0dHJpYnV0ZSB0byBhIGxvY2FsIHZhcmlhYmxlIGFuZCBjYWxsIHRoYXQgbG9jYWxcbiAgICAgIHZhcmlhYmxlLiBBbHNvIG5vdGljZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb24gb25seSBoYXBwZW5zIGZvclxuICAgICAgdXNlci1kZWZpbmVkIGZ1bmN0aW9uczsgb3RoZXIgY2FsbGFibGUgb2JqZWN0cyAoYW5kIGFsbCBub24tXG4gICAgICBjYWxsYWJsZSBvYmplY3RzKSBhcmUgcmV0cmlldmVkIHdpdGhvdXQgdHJhbnNmb3JtYXRpb24uICBJdCBpc1xuICAgICAgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgd2hpY2ggYXJlXG4gICAgICBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgaW5zdGFuY2UgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gYm91bmRcbiAgICAgIG1ldGhvZHM7IHRoaXMgKm9ubHkqIGhhcHBlbnMgd2hlbiB0aGUgZnVuY3Rpb24gaXMgYW4gYXR0cmlidXRlXG4gICAgICBvZiB0aGUgY2xhc3MuXG5cbiAgIEdlbmVyYXRvciBmdW5jdGlvbnNcbiAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIHVzZXMgdGhlICJ5aWVsZCIgc3RhdGVtZW50IChzZWVcbiAgICAgIHNlY3Rpb24gKlRoZSB5aWVsZCBzdGF0ZW1lbnQqKSBpcyBjYWxsZWQgYSAqZ2VuZXJhdG9yIGZ1bmN0aW9uKi5cbiAgICAgIFN1Y2ggYSBmdW5jdGlvbiwgd2hlbiBjYWxsZWQsIGFsd2F5cyByZXR1cm5zIGFuIGl0ZXJhdG9yIG9iamVjdFxuICAgICAgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb246ICBjYWxsaW5nXG4gICAgICB0aGUgaXRlcmF0b3JcJ3MgIml0ZXJhdG9yLl9fbmV4dF9fKCkiIG1ldGhvZCB3aWxsIGNhdXNlIHRoZVxuICAgICAgZnVuY3Rpb24gdG8gZXhlY3V0ZSB1bnRpbCBpdCBwcm92aWRlcyBhIHZhbHVlIHVzaW5nIHRoZSAieWllbGQiXG4gICAgICBzdGF0ZW1lbnQuICBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcyBhICJyZXR1cm4iIHN0YXRlbWVudCBvclxuICAgICAgZmFsbHMgb2ZmIHRoZSBlbmQsIGEgIlN0b3BJdGVyYXRpb24iIGV4Y2VwdGlvbiBpcyByYWlzZWQgYW5kIHRoZVxuICAgICAgaXRlcmF0b3Igd2lsbCBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2V0IG9mIHZhbHVlcyB0byBiZVxuICAgICAgcmV0dXJuZWQuXG5cbiAgIENvcm91dGluZSBmdW5jdGlvbnNcbiAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIGlzIGRlZmluZWQgdXNpbmcgImFzeW5jIGRlZiIgaXNcbiAgICAgIGNhbGxlZCBhICpjb3JvdXRpbmUgZnVuY3Rpb24qLiAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCxcbiAgICAgIHJldHVybnMgYSAqY29yb3V0aW5lKiBvYmplY3QuICBJdCBtYXkgY29udGFpbiAiYXdhaXQiXG4gICAgICBleHByZXNzaW9ucywgYXMgd2VsbCBhcyAiYXN5bmMgd2l0aCIgYW5kICJhc3luYyBmb3IiIHN0YXRlbWVudHMuXG4gICAgICBTZWUgYWxzbyB0aGUgKkNvcm91dGluZSBPYmplY3RzKiBzZWN0aW9uLlxuXG4gICBCdWlsdC1pbiBmdW5jdGlvbnNcbiAgICAgIEEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLlxuICAgICAgRXhhbXBsZXMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFyZSAibGVuKCkiIGFuZCAibWF0aC5zaW4oKSJcbiAgICAgICgibWF0aCIgaXMgYSBzdGFuZGFyZCBidWlsdC1pbiBtb2R1bGUpLiBUaGUgbnVtYmVyIGFuZCB0eXBlIG9mXG4gICAgICB0aGUgYXJndW1lbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLiBTcGVjaWFsIHJlYWQtXG4gICAgICBvbmx5IGF0dHJpYnV0ZXM6ICJfX2RvY19fIiBpcyB0aGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvblxuICAgICAgc3RyaW5nLCBvciAiTm9uZSIgaWYgdW5hdmFpbGFibGU7ICJfX25hbWVfXyIgaXMgdGhlIGZ1bmN0aW9uXCdzXG4gICAgICBuYW1lOyAiX19zZWxmX18iIGlzIHNldCB0byAiTm9uZSIgKGJ1dCBzZWUgdGhlIG5leHQgaXRlbSk7XG4gICAgICAiX19tb2R1bGVfXyIgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWRcbiAgICAgIGluIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZS5cblxuICAgQnVpbHQtaW4gbWV0aG9kc1xuICAgICAgVGhpcyBpcyByZWFsbHkgYSBkaWZmZXJlbnQgZGlzZ3Vpc2Ugb2YgYSBidWlsdC1pbiBmdW5jdGlvbiwgdGhpc1xuICAgICAgdGltZSBjb250YWluaW5nIGFuIG9iamVjdCBwYXNzZWQgdG8gdGhlIEMgZnVuY3Rpb24gYXMgYW5cbiAgICAgIGltcGxpY2l0IGV4dHJhIGFyZ3VtZW50LiAgQW4gZXhhbXBsZSBvZiBhIGJ1aWx0LWluIG1ldGhvZCBpc1xuICAgICAgImFsaXN0LmFwcGVuZCgpIiwgYXNzdW1pbmcgKmFsaXN0KiBpcyBhIGxpc3Qgb2JqZWN0LiBJbiB0aGlzXG4gICAgICBjYXNlLCB0aGUgc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlICJfX3NlbGZfXyIgaXMgc2V0IHRvIHRoZVxuICAgICAgb2JqZWN0IGRlbm90ZWQgYnkgKmFsaXN0Ki5cblxuICAgQ2xhc3Nlc1xuICAgICAgQ2xhc3NlcyBhcmUgY2FsbGFibGUuICBUaGVzZSBvYmplY3RzIG5vcm1hbGx5IGFjdCBhcyBmYWN0b3JpZXNcbiAgICAgIGZvciBuZXcgaW5zdGFuY2VzIG9mIHRoZW1zZWx2ZXMsIGJ1dCB2YXJpYXRpb25zIGFyZSBwb3NzaWJsZSBmb3JcbiAgICAgIGNsYXNzIHR5cGVzIHRoYXQgb3ZlcnJpZGUgIl9fbmV3X18oKSIuICBUaGUgYXJndW1lbnRzIG9mIHRoZVxuICAgICAgY2FsbCBhcmUgcGFzc2VkIHRvICJfX25ld19fKCkiIGFuZCwgaW4gdGhlIHR5cGljYWwgY2FzZSwgdG9cbiAgICAgICJfX2luaXRfXygpIiB0byBpbml0aWFsaXplIHRoZSBuZXcgaW5zdGFuY2UuXG5cbiAgIENsYXNzIEluc3RhbmNlc1xuICAgICAgSW5zdGFuY2VzIG9mIGFyYml0cmFyeSBjbGFzc2VzIGNhbiBiZSBtYWRlIGNhbGxhYmxlIGJ5IGRlZmluaW5nXG4gICAgICBhICJfX2NhbGxfXygpIiBtZXRob2QgaW4gdGhlaXIgY2xhc3MuXG5cbk1vZHVsZXNcbiAgIE1vZHVsZXMgYXJlIGEgYmFzaWMgb3JnYW5pemF0aW9uYWwgdW5pdCBvZiBQeXRob24gY29kZSwgYW5kIGFyZVxuICAgY3JlYXRlZCBieSB0aGUgKmltcG9ydCBzeXN0ZW0qIGFzIGludm9rZWQgZWl0aGVyIGJ5IHRoZSAiaW1wb3J0IlxuICAgc3RhdGVtZW50IChzZWUgImltcG9ydCIpLCBvciBieSBjYWxsaW5nIGZ1bmN0aW9ucyBzdWNoIGFzXG4gICAiaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKSIgYW5kIGJ1aWx0LWluICJfX2ltcG9ydF9fKCkiLiAgQSBtb2R1bGVcbiAgIG9iamVjdCBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYnkgYSBkaWN0aW9uYXJ5IG9iamVjdCAodGhpcyBpc1xuICAgdGhlIGRpY3Rpb25hcnkgcmVmZXJlbmNlZCBieSB0aGUgIl9fZ2xvYmFsc19fIiBhdHRyaWJ1dGUgb2ZcbiAgIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUpLiAgQXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlXG4gICB0cmFuc2xhdGVkIHRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LCBlLmcuLCAibS54IiBpcyBlcXVpdmFsZW50XG4gICB0byAibS5fX2RpY3RfX1sieCJdIi4gQSBtb2R1bGUgb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4gdGhlIGNvZGVcbiAgIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZSAoc2luY2UgaXQgaXNuXCd0IG5lZWRlZCBvbmNlXG4gICB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSkuXG5cbiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50IHVwZGF0ZXMgdGhlIG1vZHVsZVwncyBuYW1lc3BhY2UgZGljdGlvbmFyeSxcbiAgIGUuZy4sICJtLnggPSAxIiBpcyBlcXVpdmFsZW50IHRvICJtLl9fZGljdF9fWyJ4Il0gPSAxIi5cblxuICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlOiAiX19kaWN0X18iIGlzIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlXG4gICBhcyBhIGRpY3Rpb25hcnkgb2JqZWN0LlxuXG4gICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEJlY2F1c2Ugb2YgdGhlIHdheSBDUHl0aG9uXG4gICBjbGVhcnMgbW9kdWxlIGRpY3Rpb25hcmllcywgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHdpbGwgYmUgY2xlYXJlZFxuICAgd2hlbiB0aGUgbW9kdWxlIGZhbGxzIG91dCBvZiBzY29wZSBldmVuIGlmIHRoZSBkaWN0aW9uYXJ5IHN0aWxsIGhhc1xuICAgbGl2ZSByZWZlcmVuY2VzLiAgVG8gYXZvaWQgdGhpcywgY29weSB0aGUgZGljdGlvbmFyeSBvciBrZWVwIHRoZVxuICAgbW9kdWxlIGFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS5cblxuICAgUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6ICJfX25hbWVfXyIgaXMgdGhlIG1vZHVsZVwncyBuYW1lO1xuICAgIl9fZG9jX18iIGlzIHRoZSBtb2R1bGVcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yICJOb25lIiBpZlxuICAgdW5hdmFpbGFibGU7ICJfX2ZpbGVfXyIgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggdGhlXG4gICBtb2R1bGUgd2FzIGxvYWRlZCwgaWYgaXQgd2FzIGxvYWRlZCBmcm9tIGEgZmlsZS4gVGhlICJfX2ZpbGVfXyJcbiAgIGF0dHJpYnV0ZSBtYXkgYmUgbWlzc2luZyBmb3IgY2VydGFpbiB0eXBlcyBvZiBtb2R1bGVzLCBzdWNoIGFzIENcbiAgIG1vZHVsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvclxuICAgZXh0ZW5zaW9uIG1vZHVsZXMgbG9hZGVkIGR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXQgaXNcbiAgIHRoZSBwYXRobmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkgZmlsZS5cblxuQ3VzdG9tIGNsYXNzZXNcbiAgIEN1c3RvbSBjbGFzcyB0eXBlcyBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgYnkgY2xhc3MgZGVmaW5pdGlvbnMgKHNlZVxuICAgc2VjdGlvbiAqQ2xhc3MgZGVmaW5pdGlvbnMqKS4gIEEgY2xhc3MgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkXG4gICBieSBhIGRpY3Rpb25hcnkgb2JqZWN0LiBDbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmUgdHJhbnNsYXRlZFxuICAgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksIGUuZy4sICJDLngiIGlzIHRyYW5zbGF0ZWQgdG9cbiAgICJDLl9fZGljdF9fWyJ4Il0iIChhbHRob3VnaCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgaG9va3Mgd2hpY2ggYWxsb3dcbiAgIGZvciBvdGhlciBtZWFucyBvZiBsb2NhdGluZyBhdHRyaWJ1dGVzKS4gV2hlbiB0aGUgYXR0cmlidXRlIG5hbWUgaXNcbiAgIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlXG4gICBjbGFzc2VzLiBUaGlzIHNlYXJjaCBvZiB0aGUgYmFzZSBjbGFzc2VzIHVzZXMgdGhlIEMzIG1ldGhvZFxuICAgcmVzb2x1dGlvbiBvcmRlciB3aGljaCBiZWhhdmVzIGNvcnJlY3RseSBldmVuIGluIHRoZSBwcmVzZW5jZSBvZlxuICAgXCdkaWFtb25kXCcgaW5oZXJpdGFuY2Ugc3RydWN0dXJlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGVcbiAgIGluaGVyaXRhbmNlIHBhdGhzIGxlYWRpbmcgYmFjayB0byBhIGNvbW1vbiBhbmNlc3Rvci4gQWRkaXRpb25hbFxuICAgZGV0YWlscyBvbiB0aGUgQzMgTVJPIHVzZWQgYnkgUHl0aG9uIGNhbiBiZSBmb3VuZCBpbiB0aGVcbiAgIGRvY3VtZW50YXRpb24gYWNjb21wYW55aW5nIHRoZSAyLjMgcmVsZWFzZSBhdFxuICAgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9yZWxlYXNlcy8yLjMvbXJvLy5cblxuICAgV2hlbiBhIGNsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2UgKGZvciBjbGFzcyAiQyIsIHNheSkgd291bGQgeWllbGQgYVxuICAgY2xhc3MgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2RcbiAgIG9iamVjdCB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZXMgaXMgIkMiLiAgV2hlbiBpdCB3b3VsZCB5aWVsZCBhXG4gICBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgb2JqZWN0IHdyYXBwZWQgYnlcbiAgIHRoZSBzdGF0aWMgbWV0aG9kIG9iamVjdC4gU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycypcbiAgIGZvciBhbm90aGVyIHdheSBpbiB3aGljaCBhdHRyaWJ1dGVzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3MgbWF5XG4gICBkaWZmZXIgZnJvbSB0aG9zZSBhY3R1YWxseSBjb250YWluZWQgaW4gaXRzICJfX2RpY3RfXyIuXG5cbiAgIENsYXNzIGF0dHJpYnV0ZSBhc3NpZ25tZW50cyB1cGRhdGUgdGhlIGNsYXNzXCdzIGRpY3Rpb25hcnksIG5ldmVyXG4gICB0aGUgZGljdGlvbmFyeSBvZiBhIGJhc2UgY2xhc3MuXG5cbiAgIEEgY2xhc3Mgb2JqZWN0IGNhbiBiZSBjYWxsZWQgKHNlZSBhYm92ZSkgdG8geWllbGQgYSBjbGFzcyBpbnN0YW5jZVxuICAgKHNlZSBiZWxvdykuXG5cbiAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgY2xhc3MgbmFtZTsgIl9fbW9kdWxlX18iIGlzXG4gICB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyAiX19kaWN0X18iIGlzIHRoZVxuICAgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBjbGFzc1wncyBuYW1lc3BhY2U7ICJfX2Jhc2VzX18iIGlzIGEgdHVwbGVcbiAgIChwb3NzaWJseSBlbXB0eSBvciBhIHNpbmdsZXRvbikgY29udGFpbmluZyB0aGUgYmFzZSBjbGFzc2VzLCBpbiB0aGVcbiAgIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdDsgIl9fZG9jX18iIGlzIHRoZVxuICAgY2xhc3NcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWYgdW5kZWZpbmVkLlxuXG5DbGFzcyBpbnN0YW5jZXNcbiAgIEEgY2xhc3MgaW5zdGFuY2UgaXMgY3JlYXRlZCBieSBjYWxsaW5nIGEgY2xhc3Mgb2JqZWN0IChzZWUgYWJvdmUpLlxuICAgQSBjbGFzcyBpbnN0YW5jZSBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYXMgYSBkaWN0aW9uYXJ5IHdoaWNoXG4gICBpcyB0aGUgZmlyc3QgcGxhY2UgaW4gd2hpY2ggYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHNlYXJjaGVkLlxuICAgV2hlbiBhbiBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kIHRoZXJlLCBhbmQgdGhlIGluc3RhbmNlXCdzIGNsYXNzIGhhc1xuICAgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZSwgdGhlIHNlYXJjaCBjb250aW51ZXMgd2l0aCB0aGUgY2xhc3NcbiAgIGF0dHJpYnV0ZXMuICBJZiBhIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aGF0IGlzIGEgdXNlci1kZWZpbmVkXG4gICBmdW5jdGlvbiBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdFxuICAgd2hvc2UgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLiAgU3RhdGljIG1ldGhvZCBhbmRcbiAgIGNsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBhbHNvIHRyYW5zZm9ybWVkOyBzZWUgYWJvdmUgdW5kZXJcbiAgICJDbGFzc2VzIi4gIFNlZSBzZWN0aW9uICpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqIGZvciBhbm90aGVyIHdheVxuICAgaW4gd2hpY2ggYXR0cmlidXRlcyBvZiBhIGNsYXNzIHJldHJpZXZlZCB2aWEgaXRzIGluc3RhbmNlcyBtYXlcbiAgIGRpZmZlciBmcm9tIHRoZSBvYmplY3RzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgY2xhc3NcJ3MgIl9fZGljdF9fIi5cbiAgIElmIG5vIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCwgYW5kIHRoZSBvYmplY3RcJ3MgY2xhc3MgaGFzIGFcbiAgICJfX2dldGF0dHJfXygpIiBtZXRob2QsIHRoYXQgaXMgY2FsbGVkIHRvIHNhdGlzZnkgdGhlIGxvb2t1cC5cblxuICAgQXR0cmlidXRlIGFzc2lnbm1lbnRzIGFuZCBkZWxldGlvbnMgdXBkYXRlIHRoZSBpbnN0YW5jZVwnc1xuICAgZGljdGlvbmFyeSwgbmV2ZXIgYSBjbGFzc1wncyBkaWN0aW9uYXJ5LiAgSWYgdGhlIGNsYXNzIGhhcyBhXG4gICAiX19zZXRhdHRyX18oKSIgb3IgIl9fZGVsYXR0cl9fKCkiIG1ldGhvZCwgdGhpcyBpcyBjYWxsZWQgaW5zdGVhZFxuICAgb2YgdXBkYXRpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgZGlyZWN0bHkuXG5cbiAgIENsYXNzIGluc3RhbmNlcyBjYW4gcHJldGVuZCB0byBiZSBudW1iZXJzLCBzZXF1ZW5jZXMsIG9yIG1hcHBpbmdzXG4gICBpZiB0aGV5IGhhdmUgbWV0aG9kcyB3aXRoIGNlcnRhaW4gc3BlY2lhbCBuYW1lcy4gIFNlZSBzZWN0aW9uXG4gICAqU3BlY2lhbCBtZXRob2QgbmFtZXMqLlxuXG4gICBTcGVjaWFsIGF0dHJpYnV0ZXM6ICJfX2RpY3RfXyIgaXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5O1xuICAgIl9fY2xhc3NfXyIgaXMgdGhlIGluc3RhbmNlXCdzIGNsYXNzLlxuXG5JL08gb2JqZWN0cyAoYWxzbyBrbm93biBhcyBmaWxlIG9iamVjdHMpXG4gICBBICpmaWxlIG9iamVjdCogcmVwcmVzZW50cyBhbiBvcGVuIGZpbGUuICBWYXJpb3VzIHNob3J0Y3V0cyBhcmVcbiAgIGF2YWlsYWJsZSB0byBjcmVhdGUgZmlsZSBvYmplY3RzOiB0aGUgIm9wZW4oKSIgYnVpbHQtaW4gZnVuY3Rpb24sXG4gICBhbmQgYWxzbyAib3MucG9wZW4oKSIsICJvcy5mZG9wZW4oKSIsIGFuZCB0aGUgIm1ha2VmaWxlKCkiIG1ldGhvZFxuICAgb2Ygc29ja2V0IG9iamVjdHMgKGFuZCBwZXJoYXBzIGJ5IG90aGVyIGZ1bmN0aW9ucyBvciBtZXRob2RzXG4gICBwcm92aWRlZCBieSBleHRlbnNpb24gbW9kdWxlcykuXG5cbiAgIFRoZSBvYmplY3RzICJzeXMuc3RkaW4iLCAic3lzLnN0ZG91dCIgYW5kICJzeXMuc3RkZXJyIiBhcmVcbiAgIGluaXRpYWxpemVkIHRvIGZpbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRlcnByZXRlclwnc1xuICAgc3RhbmRhcmQgaW5wdXQsIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtczsgdGhleSBhcmUgYWxsIG9wZW4gaW4gdGV4dFxuICAgbW9kZSBhbmQgdGhlcmVmb3JlIGZvbGxvdyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlXG4gICAiaW8uVGV4dElPQmFzZSIgYWJzdHJhY3QgY2xhc3MuXG5cbkludGVybmFsIHR5cGVzXG4gICBBIGZldyB0eXBlcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGludGVycHJldGVyIGFyZSBleHBvc2VkIHRvIHRoZVxuICAgdXNlci4gVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGVcbiAgIGludGVycHJldGVyLCBidXQgdGhleSBhcmUgbWVudGlvbmVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy5cblxuICAgQ29kZSBvYmplY3RzXG4gICAgICBDb2RlIG9iamVjdHMgcmVwcmVzZW50ICpieXRlLWNvbXBpbGVkKiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlLFxuICAgICAgb3IgKmJ5dGVjb2RlKi4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvZGUgb2JqZWN0IGFuZCBhXG4gICAgICBmdW5jdGlvbiBvYmplY3QgaXMgdGhhdCB0aGUgZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGFuIGV4cGxpY2l0XG4gICAgICByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uXCdzIGdsb2JhbHMgKHRoZSBtb2R1bGUgaW4gd2hpY2ggaXQgd2FzXG4gICAgICBkZWZpbmVkKSwgd2hpbGUgYSBjb2RlIG9iamVjdCBjb250YWlucyBubyBjb250ZXh0OyBhbHNvIHRoZVxuICAgICAgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgZnVuY3Rpb24gb2JqZWN0LCBub3RcbiAgICAgIGluIHRoZSBjb2RlIG9iamVjdCAoYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB2YWx1ZXMgY2FsY3VsYXRlZCBhdFxuICAgICAgcnVuLXRpbWUpLiAgVW5saWtlIGZ1bmN0aW9uIG9iamVjdHMsIGNvZGUgb2JqZWN0cyBhcmUgaW1tdXRhYmxlXG4gICAgICBhbmQgY29udGFpbiBubyByZWZlcmVuY2VzIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBtdXRhYmxlXG4gICAgICBvYmplY3RzLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiY29fbmFtZSIgZ2l2ZXMgdGhlIGZ1bmN0aW9uIG5hbWU7XG4gICAgICAiY29fYXJnY291bnQiIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHMgKGluY2x1ZGluZ1xuICAgICAgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpOyAiY29fbmxvY2FscyIgaXMgdGhlIG51bWJlciBvZlxuICAgICAgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIChpbmNsdWRpbmcgYXJndW1lbnRzKTtcbiAgICAgICJjb192YXJuYW1lcyIgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgbG9jYWxcbiAgICAgIHZhcmlhYmxlcyAoc3RhcnRpbmcgd2l0aCB0aGUgYXJndW1lbnQgbmFtZXMpOyAiY29fY2VsbHZhcnMiIGlzIGFcbiAgICAgIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZVxuICAgICAgcmVmZXJlbmNlZCBieSBuZXN0ZWQgZnVuY3Rpb25zOyAiY29fZnJlZXZhcnMiIGlzIGEgdHVwbGVcbiAgICAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGZyZWUgdmFyaWFibGVzOyAiY29fY29kZSIgaXMgYSBzdHJpbmdcbiAgICAgIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2Ugb2YgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zOyAiY29fY29uc3RzIlxuICAgICAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBsaXRlcmFscyB1c2VkIGJ5IHRoZSBieXRlY29kZTtcbiAgICAgICJjb19uYW1lcyIgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyB1c2VkIGJ5IHRoZSBieXRlY29kZTtcbiAgICAgICJjb19maWxlbmFtZSIgaXMgdGhlIGZpbGVuYW1lIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzIGNvbXBpbGVkO1xuICAgICAgImNvX2ZpcnN0bGluZW5vIiBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlIGZ1bmN0aW9uO1xuICAgICAgImNvX2xub3RhYiIgaXMgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIG1hcHBpbmcgZnJvbSBieXRlY29kZVxuICAgICAgb2Zmc2V0cyB0byBsaW5lIG51bWJlcnMgKGZvciBkZXRhaWxzIHNlZSB0aGUgc291cmNlIGNvZGUgb2YgdGhlXG4gICAgICBpbnRlcnByZXRlcik7ICJjb19zdGFja3NpemUiIGlzIHRoZSByZXF1aXJlZCBzdGFjayBzaXplXG4gICAgICAoaW5jbHVkaW5nIGxvY2FsIHZhcmlhYmxlcyk7ICJjb19mbGFncyIgaXMgYW4gaW50ZWdlciBlbmNvZGluZyBhXG4gICAgICBudW1iZXIgb2YgZmxhZ3MgZm9yIHRoZSBpbnRlcnByZXRlci5cblxuICAgICAgVGhlIGZvbGxvd2luZyBmbGFnIGJpdHMgYXJlIGRlZmluZWQgZm9yICJjb19mbGFncyI6IGJpdCAiMHgwNCJcbiAgICAgIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIiphcmd1bWVudHMiIHN5bnRheCB0byBhY2NlcHQgYW5cbiAgICAgIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdCAiMHgwOCIgaXMgc2V0IGlmXG4gICAgICB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgIioqa2V5d29yZHMiIHN5bnRheCB0byBhY2NlcHQgYXJiaXRyYXJ5XG4gICAgICBrZXl3b3JkIGFyZ3VtZW50czsgYml0ICIweDIwIiBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIGlzIGFcbiAgICAgIGdlbmVyYXRvci5cblxuICAgICAgRnV0dXJlIGZlYXR1cmUgZGVjbGFyYXRpb25zICgiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbiIpXG4gICAgICBhbHNvIHVzZSBiaXRzIGluICJjb19mbGFncyIgdG8gaW5kaWNhdGUgd2hldGhlciBhIGNvZGUgb2JqZWN0XG4gICAgICB3YXMgY29tcGlsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmVhdHVyZSBlbmFibGVkOiBiaXQgIjB4MjAwMCIgaXNcbiAgICAgIHNldCBpZiB0aGUgZnVuY3Rpb24gd2FzIGNvbXBpbGVkIHdpdGggZnV0dXJlIGRpdmlzaW9uIGVuYWJsZWQ7XG4gICAgICBiaXRzICIweDEwIiBhbmQgIjB4MTAwMCIgd2VyZSB1c2VkIGluIGVhcmxpZXIgdmVyc2lvbnMgb2ZcbiAgICAgIFB5dGhvbi5cblxuICAgICAgT3RoZXIgYml0cyBpbiAiY29fZmxhZ3MiIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLlxuXG4gICAgICBJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW5cbiAgICAgICJjb19jb25zdHMiIGlzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUgZnVuY3Rpb24sIG9yXG4gICAgICAiTm9uZSIgaWYgdW5kZWZpbmVkLlxuXG4gICBGcmFtZSBvYmplY3RzXG4gICAgICBGcmFtZSBvYmplY3RzIHJlcHJlc2VudCBleGVjdXRpb24gZnJhbWVzLiAgVGhleSBtYXkgb2NjdXIgaW5cbiAgICAgIHRyYWNlYmFjayBvYmplY3RzIChzZWUgYmVsb3cpLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiZl9iYWNrIiBpcyB0byB0aGUgcHJldmlvdXMgc3RhY2tcbiAgICAgIGZyYW1lICh0b3dhcmRzIHRoZSBjYWxsZXIpLCBvciAiTm9uZSIgaWYgdGhpcyBpcyB0aGUgYm90dG9tXG4gICAgICBzdGFjayBmcmFtZTsgImZfY29kZSIgaXMgdGhlIGNvZGUgb2JqZWN0IGJlaW5nIGV4ZWN1dGVkIGluIHRoaXNcbiAgICAgIGZyYW1lOyAiZl9sb2NhbHMiIGlzIHRoZSBkaWN0aW9uYXJ5IHVzZWQgdG8gbG9vayB1cCBsb2NhbFxuICAgICAgdmFyaWFibGVzOyAiZl9nbG9iYWxzIiBpcyB1c2VkIGZvciBnbG9iYWwgdmFyaWFibGVzO1xuICAgICAgImZfYnVpbHRpbnMiIGlzIHVzZWQgZm9yIGJ1aWx0LWluIChpbnRyaW5zaWMpIG5hbWVzOyAiZl9sYXN0aSJcbiAgICAgIGdpdmVzIHRoZSBwcmVjaXNlIGluc3RydWN0aW9uICh0aGlzIGlzIGFuIGluZGV4IGludG8gdGhlXG4gICAgICBieXRlY29kZSBzdHJpbmcgb2YgdGhlIGNvZGUgb2JqZWN0KS5cblxuICAgICAgU3BlY2lhbCB3cml0YWJsZSBhdHRyaWJ1dGVzOiAiZl90cmFjZSIsIGlmIG5vdCAiTm9uZSIsIGlzIGFcbiAgICAgIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgY29kZSBsaW5lICh0aGlzIGlzXG4gICAgICB1c2VkIGJ5IHRoZSBkZWJ1Z2dlcik7ICJmX2xpbmVubyIgaXMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgb2ZcbiAgICAgIHRoZSBmcmFtZSAtLS0gd3JpdGluZyB0byB0aGlzIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24ganVtcHNcbiAgICAgIHRvIHRoZSBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGUgYm90dG9tLW1vc3QgZnJhbWUpLiAgQSBkZWJ1Z2dlclxuICAgICAgY2FuIGltcGxlbWVudCBhIEp1bXAgY29tbWFuZCAoYWthIFNldCBOZXh0IFN0YXRlbWVudCkgYnkgd3JpdGluZ1xuICAgICAgdG8gZl9saW5lbm8uXG5cbiAgICAgIEZyYW1lIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuXG4gICAgICBmcmFtZS5jbGVhcigpXG5cbiAgICAgICAgIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgcmVmZXJlbmNlcyB0byBsb2NhbCB2YXJpYWJsZXMgaGVsZCBieVxuICAgICAgICAgdGhlIGZyYW1lLiAgQWxzbywgaWYgdGhlIGZyYW1lIGJlbG9uZ2VkIHRvIGEgZ2VuZXJhdG9yLCB0aGVcbiAgICAgICAgIGdlbmVyYXRvciBpcyBmaW5hbGl6ZWQuICBUaGlzIGhlbHBzIGJyZWFrIHJlZmVyZW5jZSBjeWNsZXNcbiAgICAgICAgIGludm9sdmluZyBmcmFtZSBvYmplY3RzIChmb3IgZXhhbXBsZSB3aGVuIGNhdGNoaW5nIGFuXG4gICAgICAgICBleGNlcHRpb24gYW5kIHN0b3JpbmcgaXRzIHRyYWNlYmFjayBmb3IgbGF0ZXIgdXNlKS5cblxuICAgICAgICAgIlJ1bnRpbWVFcnJvciIgaXMgcmFpc2VkIGlmIHRoZSBmcmFtZSBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLlxuXG4gICAgICAgICBOZXcgaW4gdmVyc2lvbiAzLjQuXG5cbiAgIFRyYWNlYmFjayBvYmplY3RzXG4gICAgICBUcmFjZWJhY2sgb2JqZWN0cyByZXByZXNlbnQgYSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uICBBXG4gICAgICB0cmFjZWJhY2sgb2JqZWN0IGlzIGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLiAgV2hlbiB0aGVcbiAgICAgIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uIGhhbmRsZXIgdW53aW5kcyB0aGUgZXhlY3V0aW9uIHN0YWNrLCBhdFxuICAgICAgZWFjaCB1bndvdW5kIGxldmVsIGEgdHJhY2ViYWNrIG9iamVjdCBpcyBpbnNlcnRlZCBpbiBmcm9udCBvZlxuICAgICAgdGhlIGN1cnJlbnQgdHJhY2ViYWNrLiAgV2hlbiBhbiBleGNlcHRpb24gaGFuZGxlciBpcyBlbnRlcmVkLFxuICAgICAgdGhlIHN0YWNrIHRyYWNlIGlzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtLiAoU2VlIHNlY3Rpb25cbiAgICAgICpUaGUgdHJ5IHN0YXRlbWVudCouKSBJdCBpcyBhY2Nlc3NpYmxlIGFzIHRoZSB0aGlyZCBpdGVtIG9mIHRoZVxuICAgICAgdHVwbGUgcmV0dXJuZWQgYnkgInN5cy5leGNfaW5mbygpIi4gV2hlbiB0aGUgcHJvZ3JhbSBjb250YWlucyBub1xuICAgICAgc3VpdGFibGUgaGFuZGxlciwgdGhlIHN0YWNrIHRyYWNlIGlzIHdyaXR0ZW4gKG5pY2VseSBmb3JtYXR0ZWQpXG4gICAgICB0byB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMgaW50ZXJhY3RpdmUsXG4gICAgICBpdCBpcyBhbHNvIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGFzICJzeXMubGFzdF90cmFjZWJhY2siLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAidGJfbmV4dCIgaXMgdGhlIG5leHQgbGV2ZWwgaW4gdGhlXG4gICAgICBzdGFjayB0cmFjZSAodG93YXJkcyB0aGUgZnJhbWUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCksIG9yXG4gICAgICAiTm9uZSIgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbDsgInRiX2ZyYW1lIiBwb2ludHMgdG8gdGhlXG4gICAgICBleGVjdXRpb24gZnJhbWUgb2YgdGhlIGN1cnJlbnQgbGV2ZWw7ICJ0Yl9saW5lbm8iIGdpdmVzIHRoZSBsaW5lXG4gICAgICBudW1iZXIgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZDsgInRiX2xhc3RpIiBpbmRpY2F0ZXMgdGhlXG4gICAgICBwcmVjaXNlIGluc3RydWN0aW9uLiAgVGhlIGxpbmUgbnVtYmVyIGFuZCBsYXN0IGluc3RydWN0aW9uIGluXG4gICAgICB0aGUgdHJhY2ViYWNrIG1heSBkaWZmZXIgZnJvbSB0aGUgbGluZSBudW1iZXIgb2YgaXRzIGZyYW1lXG4gICAgICBvYmplY3QgaWYgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCBpbiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIG5vXG4gICAgICBtYXRjaGluZyBleGNlcHQgY2xhdXNlIG9yIHdpdGggYSBmaW5hbGx5IGNsYXVzZS5cblxuICAgU2xpY2Ugb2JqZWN0c1xuICAgICAgU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIGZvciAiX19nZXRpdGVtX18oKSJcbiAgICAgIG1ldGhvZHMuICBUaGV5IGFyZSBhbHNvIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluICJzbGljZSgpIlxuICAgICAgZnVuY3Rpb24uXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJzdGFydCIgaXMgdGhlIGxvd2VyIGJvdW5kOyAic3RvcCJcbiAgICAgIGlzIHRoZSB1cHBlciBib3VuZDsgInN0ZXAiIGlzIHRoZSBzdGVwIHZhbHVlOyBlYWNoIGlzICJOb25lIiBpZlxuICAgICAgb21pdHRlZC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuXG5cbiAgICAgIFNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuXG4gICAgICBzbGljZS5pbmRpY2VzKHNlbGYsIGxlbmd0aClcblxuICAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCAqbGVuZ3RoKiBhbmRcbiAgICAgICAgIGNvbXB1dGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzbGljZSB0aGF0IHRoZSBzbGljZSBvYmplY3RcbiAgICAgICAgIHdvdWxkIGRlc2NyaWJlIGlmIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKiBpdGVtcy5cbiAgICAgICAgIEl0IHJldHVybnMgYSB0dXBsZSBvZiB0aHJlZSBpbnRlZ2VyczsgcmVzcGVjdGl2ZWx5IHRoZXNlIGFyZVxuICAgICAgICAgdGhlICpzdGFydCogYW5kICpzdG9wKiBpbmRpY2VzIGFuZCB0aGUgKnN0ZXAqIG9yIHN0cmlkZVxuICAgICAgICAgbGVuZ3RoIG9mIHRoZSBzbGljZS4gTWlzc2luZyBvciBvdXQtb2YtYm91bmRzIGluZGljZXMgYXJlXG4gICAgICAgICBoYW5kbGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCByZWd1bGFyIHNsaWNlcy5cblxuICAgU3RhdGljIG1ldGhvZCBvYmplY3RzXG4gICAgICBTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlXG4gICAgICB0cmFuc2Zvcm1hdGlvbiBvZiBmdW5jdGlvbiBvYmplY3RzIHRvIG1ldGhvZCBvYmplY3RzIGRlc2NyaWJlZFxuICAgICAgYWJvdmUuIEEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbnkgb3RoZXJcbiAgICAgIG9iamVjdCwgdXN1YWxseSBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0LiBXaGVuIGEgc3RhdGljXG4gICAgICBtZXRob2Qgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3Mgb3IgYSBjbGFzcyBpbnN0YW5jZSwgdGhlXG4gICAgICBvYmplY3QgYWN0dWFsbHkgcmV0dXJuZWQgaXMgdGhlIHdyYXBwZWQgb2JqZWN0LCB3aGljaCBpcyBub3RcbiAgICAgIHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmVcbiAgICAgIG5vdCB0aGVtc2VsdmVzIGNhbGxhYmxlLCBhbHRob3VnaCB0aGUgb2JqZWN0cyB0aGV5IHdyYXAgdXN1YWxseVxuICAgICAgYXJlLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICAic3RhdGljbWV0aG9kKCkiIGNvbnN0cnVjdG9yLlxuXG4gICBDbGFzcyBtZXRob2Qgb2JqZWN0c1xuICAgICAgQSBjbGFzcyBtZXRob2Qgb2JqZWN0LCBsaWtlIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGlzIGEgd3JhcHBlclxuICAgICAgYXJvdW5kIGFub3RoZXIgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSB3YXkgaW4gd2hpY2ggdGhhdCBvYmplY3RcbiAgICAgIGlzIHJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciBvZlxuICAgICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgdXBvbiBzdWNoIHJldHJpZXZhbCBpcyBkZXNjcmliZWQgYWJvdmUsXG4gICAgICB1bmRlciAiVXNlci1kZWZpbmVkIG1ldGhvZHMiLiBDbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZFxuICAgICAgYnkgdGhlIGJ1aWx0LWluICJjbGFzc21ldGhvZCgpIiBjb25zdHJ1Y3Rvci5cbicsCi0gJ3R5cGVzZnVuY3Rpb25zJzogdSdcbkZ1bmN0aW9uc1xuKioqKioqKioqXG5cbkZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seVxub3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6ICJmdW5jKGFyZ3VtZW50LWxpc3QpIi5cblxuVGhlcmUgYXJlIHJlYWxseSB0d28gZmxhdm9ycyBvZiBmdW5jdGlvbiBvYmplY3RzOiBidWlsdC1pbiBmdW5jdGlvbnNcbmFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAgQm90aCBzdXBwb3J0IHRoZSBzYW1lIG9wZXJhdGlvbiAodG8gY2FsbFxudGhlIGZ1bmN0aW9uKSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQsIGhlbmNlIHRoZVxuZGlmZmVyZW50IG9iamVjdCB0eXBlcy5cblxuU2VlICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAotICd0eXBlc21hcHBpbmcnOiB1J1xuTWFwcGluZyBUeXBlcyAtLS0gImRpY3QiXG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuQSAqbWFwcGluZyogb2JqZWN0IG1hcHMgKmhhc2hhYmxlKiB2YWx1ZXMgdG8gYXJiaXRyYXJ5IG9iamVjdHMuXG5NYXBwaW5ncyBhcmUgbXV0YWJsZSBvYmplY3RzLiAgVGhlcmUgaXMgY3VycmVudGx5IG9ubHkgb25lIHN0YW5kYXJkXG5tYXBwaW5nIHR5cGUsIHRoZSAqZGljdGlvbmFyeSouICAoRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdC1cbmluICJsaXN0IiwgInNldCIsIGFuZCAidHVwbGUiIGNsYXNzZXMsIGFuZCB0aGUgImNvbGxlY3Rpb25zIiBtb2R1bGUuKVxuXG5BIGRpY3Rpb25hcnlcJ3Mga2V5cyBhcmUgKmFsbW9zdCogYXJiaXRyYXJ5IHZhbHVlcy4gIFZhbHVlcyB0aGF0IGFyZVxubm90ICpoYXNoYWJsZSosIHRoYXQgaXMsIHZhbHVlcyBjb250YWluaW5nIGxpc3RzLCBkaWN0aW9uYXJpZXMgb3Jcbm90aGVyIG11dGFibGUgdHlwZXMgKHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdFxuaWRlbnRpdHkpIG1heSBub3QgYmUgdXNlZCBhcyBrZXlzLiAgTnVtZXJpYyB0eXBlcyB1c2VkIGZvciBrZXlzIG9iZXlcbnRoZSBub3JtYWwgcnVsZXMgZm9yIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbFxuKHN1Y2ggYXMgIjEiIGFuZCAiMS4wIikgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleFxudGhlIHNhbWUgZGljdGlvbmFyeSBlbnRyeS4gIChOb3RlIGhvd2V2ZXIsIHRoYXQgc2luY2UgY29tcHV0ZXJzIHN0b3JlXG5mbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIGFwcHJveGltYXRpb25zIGl0IGlzIHVzdWFsbHkgdW53aXNlIHRvIHVzZVxudGhlbSBhcyBkaWN0aW9uYXJ5IGtleXMuKVxuXG5EaWN0aW9uYXJpZXMgY2FuIGJlIGNyZWF0ZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mICJrZXk6XG52YWx1ZSIgcGFpcnMgd2l0aGluIGJyYWNlcywgZm9yIGV4YW1wbGU6ICJ7XCdqYWNrXCc6IDQwOTgsIFwnc2pvZXJkXCc6XG40MTI3fSIgb3IgIns0MDk4OiBcJ2phY2tcJywgNDEyNzogXCdzam9lcmRcJ30iLCBvciBieSB0aGUgImRpY3QiXG5jb25zdHJ1Y3Rvci5cblxuY2xhc3MgY2xhc3MgZGljdCgqKmt3YXJnKVxuY2xhc3MgY2xhc3MgZGljdChtYXBwaW5nLCAqKmt3YXJnKVxuY2xhc3MgY2xhc3MgZGljdChpdGVyYWJsZSwgKiprd2FyZylcblxuICAgUmV0dXJuIGEgbmV3IGRpY3Rpb25hcnkgaW5pdGlhbGl6ZWQgZnJvbSBhbiBvcHRpb25hbCBwb3NpdGlvbmFsXG4gICBhcmd1bWVudCBhbmQgYSBwb3NzaWJseSBlbXB0eSBzZXQgb2Yga2V5d29yZCBhcmd1bWVudHMuXG5cbiAgIElmIG5vIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4sIGFuIGVtcHR5IGRpY3Rpb25hcnkgaXMgY3JlYXRlZC5cbiAgIElmIGEgcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiBhbmQgaXQgaXMgYSBtYXBwaW5nIG9iamVjdCwgYVxuICAgZGljdGlvbmFyeSBpcyBjcmVhdGVkIHdpdGggdGhlIHNhbWUga2V5LXZhbHVlIHBhaXJzIGFzIHRoZSBtYXBwaW5nXG4gICBvYmplY3QuICBPdGhlcndpc2UsIHRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IG11c3QgYmUgYW4gKml0ZXJhYmxlKlxuICAgb2JqZWN0LiAgRWFjaCBpdGVtIGluIHRoZSBpdGVyYWJsZSBtdXN0IGl0c2VsZiBiZSBhbiBpdGVyYWJsZSB3aXRoXG4gICBleGFjdGx5IHR3byBvYmplY3RzLiAgVGhlIGZpcnN0IG9iamVjdCBvZiBlYWNoIGl0ZW0gYmVjb21lcyBhIGtleVxuICAgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5LCBhbmQgdGhlIHNlY29uZCBvYmplY3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAgIHZhbHVlLiAgSWYgYSBrZXkgb2NjdXJzIG1vcmUgdGhhbiBvbmNlLCB0aGUgbGFzdCB2YWx1ZSBmb3IgdGhhdCBrZXlcbiAgIGJlY29tZXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5LlxuXG4gICBJZiBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlaXJcbiAgIHZhbHVlcyBhcmUgYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnkgY3JlYXRlZCBmcm9tIHRoZSBwb3NpdGlvbmFsXG4gICBhcmd1bWVudC4gIElmIGEga2V5IGJlaW5nIGFkZGVkIGlzIGFscmVhZHkgcHJlc2VudCwgdGhlIHZhbHVlIGZyb21cbiAgIHRoZSBrZXl3b3JkIGFyZ3VtZW50IHJlcGxhY2VzIHRoZSB2YWx1ZSBmcm9tIHRoZSBwb3NpdGlvbmFsXG4gICBhcmd1bWVudC5cblxuICAgVG8gaWxsdXN0cmF0ZSwgdGhlIGZvbGxvd2luZyBleGFtcGxlcyBhbGwgcmV0dXJuIGEgZGljdGlvbmFyeSBlcXVhbFxuICAgdG8gInsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9IjpcblxuICAgICAgPj4+IGEgPSBkaWN0KG9uZT0xLCB0d289MiwgdGhyZWU9MylcbiAgICAgID4+PiBiID0ge1wnb25lXCc6IDEsIFwndHdvXCc6IDIsIFwndGhyZWVcJzogM31cbiAgICAgID4+PiBjID0gZGljdCh6aXAoW1wnb25lXCcsIFwndHdvXCcsIFwndGhyZWVcJ10sIFsxLCAyLCAzXSkpXG4gICAgICA+Pj4gZCA9IGRpY3QoWyhcJ3R3b1wnLCAyKSwgKFwnb25lXCcsIDEpLCAoXCd0aHJlZVwnLCAzKV0pXG4gICAgICA+Pj4gZSA9IGRpY3Qoe1wndGhyZWVcJzogMywgXCdvbmVcJzogMSwgXCd0d29cJzogMn0pXG4gICAgICA+Pj4gYSA9PSBiID09IGMgPT0gZCA9PSBlXG4gICAgICBUcnVlXG5cbiAgIFByb3ZpZGluZyBrZXl3b3JkIGFyZ3VtZW50cyBhcyBpbiB0aGUgZmlyc3QgZXhhbXBsZSBvbmx5IHdvcmtzIGZvclxuICAga2V5cyB0aGF0IGFyZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMuICBPdGhlcndpc2UsIGFueSB2YWxpZCBrZXlzXG4gICBjYW4gYmUgdXNlZC5cblxuICAgVGhlc2UgYXJlIHRoZSBvcGVyYXRpb25zIHRoYXQgZGljdGlvbmFyaWVzIHN1cHBvcnQgKGFuZCB0aGVyZWZvcmUsXG4gICBjdXN0b20gbWFwcGluZyB0eXBlcyBzaG91bGQgc3VwcG9ydCB0b28pOlxuXG4gICBsZW4oZClcblxuICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGRpY3Rpb25hcnkgKmQqLlxuXG4gICBkW2tleV1cblxuICAgICAgUmV0dXJuIHRoZSBpdGVtIG9mICpkKiB3aXRoIGtleSAqa2V5Ki4gIFJhaXNlcyBhICJLZXlFcnJvciIgaWZcbiAgICAgICprZXkqIGlzIG5vdCBpbiB0aGUgbWFwLlxuXG4gICAgICBJZiBhIHN1YmNsYXNzIG9mIGRpY3QgZGVmaW5lcyBhIG1ldGhvZCAiX19taXNzaW5nX18oKSIgYW5kICprZXkqXG4gICAgICBpcyBub3QgcHJlc2VudCwgdGhlICJkW2tleV0iIG9wZXJhdGlvbiBjYWxscyB0aGF0IG1ldGhvZCB3aXRoXG4gICAgICB0aGUga2V5ICprZXkqIGFzIGFyZ3VtZW50LiAgVGhlICJkW2tleV0iIG9wZXJhdGlvbiB0aGVuIHJldHVybnNcbiAgICAgIG9yIHJhaXNlcyB3aGF0ZXZlciBpcyByZXR1cm5lZCBvciByYWlzZWQgYnkgdGhlXG4gICAgICAiX19taXNzaW5nX18oa2V5KSIgY2FsbC4gTm8gb3RoZXIgb3BlcmF0aW9ucyBvciBtZXRob2RzIGludm9rZVxuICAgICAgIl9fbWlzc2luZ19fKCkiLiBJZiAiX19taXNzaW5nX18oKSIgaXMgbm90IGRlZmluZWQsICJLZXlFcnJvciJcbiAgICAgIGlzIHJhaXNlZC4gIl9fbWlzc2luZ19fKCkiIG11c3QgYmUgYSBtZXRob2Q7IGl0IGNhbm5vdCBiZSBhblxuICAgICAgaW5zdGFuY2UgdmFyaWFibGU6XG5cbiAgICAgICAgID4+PiBjbGFzcyBDb3VudGVyKGRpY3QpOlxuICAgICAgICAgLi4uICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KTpcbiAgICAgICAgIC4uLiAgICAgICAgIHJldHVybiAwXG4gICAgICAgICA+Pj4gYyA9IENvdW50ZXIoKVxuICAgICAgICAgPj4+IGNbXCdyZWRcJ11cbiAgICAgICAgIDBcbiAgICAgICAgID4+PiBjW1wncmVkXCddICs9IDFcbiAgICAgICAgID4+PiBjW1wncmVkXCddXG4gICAgICAgICAxXG5cbiAgICAgIFRoZSBleGFtcGxlIGFib3ZlIHNob3dzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mXG4gICAgICAiY29sbGVjdGlvbnMuQ291bnRlciIuICBBIGRpZmZlcmVudCAiX19taXNzaW5nX18iIG1ldGhvZCBpcyB1c2VkXG4gICAgICBieSAiY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QiLlxuXG4gICBkW2tleV0gPSB2YWx1ZVxuXG4gICAgICBTZXQgImRba2V5XSIgdG8gKnZhbHVlKi5cblxuICAgZGVsIGRba2V5XVxuXG4gICAgICBSZW1vdmUgImRba2V5XSIgZnJvbSAqZCouICBSYWlzZXMgYSAiS2V5RXJyb3IiIGlmICprZXkqIGlzIG5vdFxuICAgICAgaW4gdGhlIG1hcC5cblxuICAga2V5IGluIGRcblxuICAgICAgUmV0dXJuICJUcnVlIiBpZiAqZCogaGFzIGEga2V5ICprZXkqLCBlbHNlICJGYWxzZSIuXG5cbiAgIGtleSBub3QgaW4gZFxuXG4gICAgICBFcXVpdmFsZW50IHRvICJub3Qga2V5IGluIGQiLlxuXG4gICBpdGVyKGQpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIHRoZSBkaWN0aW9uYXJ5LiAgVGhpcyBpcyBhXG4gICAgICBzaG9ydGN1dCBmb3IgIml0ZXIoZC5rZXlzKCkpIi5cblxuICAgY2xlYXIoKVxuXG4gICAgICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGNvcHkoKVxuXG4gICAgICBSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGNsYXNzbWV0aG9kIGZyb21rZXlzKHNlcVssIHZhbHVlXSlcblxuICAgICAgQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gKnNlcSogYW5kIHZhbHVlcyBzZXQgdG9cbiAgICAgICp2YWx1ZSouXG5cbiAgICAgICJmcm9ta2V5cygpIiBpcyBhIGNsYXNzIG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgZGljdGlvbmFyeS5cbiAgICAgICp2YWx1ZSogZGVmYXVsdHMgdG8gIk5vbmUiLlxuXG4gICBnZXQoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIFJldHVybiB0aGUgdmFsdWUgZm9yICprZXkqIGlmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlXG4gICAgICAqZGVmYXVsdCouIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvICJOb25lIiwgc29cbiAgICAgIHRoYXQgdGhpcyBtZXRob2QgbmV2ZXIgcmFpc2VzIGEgIktleUVycm9yIi5cblxuICAgaXRlbXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyBpdGVtcyAoIihrZXksIHZhbHVlKSJcbiAgICAgIHBhaXJzKS4gU2VlIHRoZSAqZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMqLlxuXG4gICBrZXlzKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3Mga2V5cy4gIFNlZSB0aGVcbiAgICAgICpkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cyouXG5cbiAgIHBvcChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgIGVsc2UgcmV0dXJuICpkZWZhdWx0Ki4gIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4gYW5kICprZXkqIGlzXG4gICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgIktleUVycm9yIiBpcyByYWlzZWQuXG5cbiAgIHBvcGl0ZW0oKVxuXG4gICAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgIihrZXksIHZhbHVlKSIgcGFpciBmcm9tIHRoZVxuICAgICAgZGljdGlvbmFyeS5cblxuICAgICAgInBvcGl0ZW0oKSIgaXMgdXNlZnVsIHRvIGRlc3RydWN0aXZlbHkgaXRlcmF0ZSBvdmVyIGFcbiAgICAgIGRpY3Rpb25hcnksIGFzIG9mdGVuIHVzZWQgaW4gc2V0IGFsZ29yaXRobXMuICBJZiB0aGUgZGljdGlvbmFyeVxuICAgICAgaXMgZW1wdHksIGNhbGxpbmcgInBvcGl0ZW0oKSIgcmFpc2VzIGEgIktleUVycm9yIi5cblxuICAgc2V0ZGVmYXVsdChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiBub3QsIGluc2VydFxuICAgICAgKmtleSogd2l0aCBhIHZhbHVlIG9mICpkZWZhdWx0KiBhbmQgcmV0dXJuICpkZWZhdWx0Ki4gICpkZWZhdWx0KlxuICAgICAgZGVmYXVsdHMgdG8gIk5vbmUiLlxuXG4gICB1cGRhdGUoW290aGVyXSlcblxuICAgICAgVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS92YWx1ZSBwYWlycyBmcm9tICpvdGhlciosXG4gICAgICBvdmVyd3JpdGluZyBleGlzdGluZyBrZXlzLiAgUmV0dXJuICJOb25lIi5cblxuICAgICAgInVwZGF0ZSgpIiBhY2NlcHRzIGVpdGhlciBhbm90aGVyIGRpY3Rpb25hcnkgb2JqZWN0IG9yIGFuXG4gICAgICBpdGVyYWJsZSBvZiBrZXkvdmFsdWUgcGFpcnMgKGFzIHR1cGxlcyBvciBvdGhlciBpdGVyYWJsZXMgb2ZcbiAgICAgIGxlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlIGRpY3Rpb25hcnlcbiAgICAgIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczogImQudXBkYXRlKHJlZD0xLFxuICAgICAgYmx1ZT0yKSIuXG5cbiAgIHZhbHVlcygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIHZhbHVlcy4gIFNlZSB0aGVcbiAgICAgICpkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cyouXG5cbiAgIERpY3Rpb25hcmllcyBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSAiKGtleSxcbiAgIHZhbHVlKSIgcGFpcnMuIE9yZGVyIGNvbXBhcmlzb25zIChcJzxcJywgXCc8PVwnLCBcJz49XCcsIFwnPlwnKSByYWlzZVxuICAgIlR5cGVFcnJvciIuXG5cblNlZSBhbHNvOiAidHlwZXMuTWFwcGluZ1Byb3h5VHlwZSIgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcmVhZC1vbmx5XG4gIHZpZXcgb2YgYSAiZGljdCIuXG5cblxuRGljdGlvbmFyeSB2aWV3IG9iamVjdHNcbj09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvYmplY3RzIHJldHVybmVkIGJ5ICJkaWN0LmtleXMoKSIsICJkaWN0LnZhbHVlcygpIiBhbmRcbiJkaWN0Lml0ZW1zKCkiIGFyZSAqdmlldyBvYmplY3RzKi4gIFRoZXkgcHJvdmlkZSBhIGR5bmFtaWMgdmlldyBvbiB0aGVcbmRpY3Rpb25hcnlcJ3MgZW50cmllcywgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSBkaWN0aW9uYXJ5IGNoYW5nZXMsXG50aGUgdmlldyByZWZsZWN0cyB0aGVzZSBjaGFuZ2VzLlxuXG5EaWN0aW9uYXJ5IHZpZXdzIGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHlpZWxkIHRoZWlyIHJlc3BlY3RpdmUgZGF0YSxcbmFuZCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHM6XG5cbmxlbihkaWN0dmlldylcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeS5cblxuaXRlcihkaWN0dmlldylcblxuICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMsIHZhbHVlcyBvciBpdGVtcyAocmVwcmVzZW50ZWQgYXNcbiAgIHR1cGxlcyBvZiAiKGtleSwgdmFsdWUpIikgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIEtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIgd2hpY2ggaXNcbiAgIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uIGltcGxlbWVudGF0aW9ucywgYW5kIGRlcGVuZHMgb25cbiAgIHRoZSBkaWN0aW9uYXJ5XCdzIGhpc3Rvcnkgb2YgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLiBJZiBrZXlzLFxuICAgdmFsdWVzIGFuZCBpdGVtcyB2aWV3cyBhcmUgaXRlcmF0ZWQgb3ZlciB3aXRoIG5vIGludGVydmVuaW5nXG4gICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5LCB0aGUgb3JkZXIgb2YgaXRlbXMgd2lsbCBkaXJlY3RseVxuICAgY29ycmVzcG9uZC4gIFRoaXMgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiAiKHZhbHVlLCBrZXkpIiBwYWlycyB1c2luZ1xuICAgInppcCgpIjogInBhaXJzID0gemlwKGQudmFsdWVzKCksIGQua2V5cygpKSIuICBBbm90aGVyIHdheSB0b1xuICAgY3JlYXRlIHRoZSBzYW1lIGxpc3QgaXMgInBhaXJzID0gWyh2LCBrKSBmb3IgKGssIHYpIGluIGQuaXRlbXMoKV0iLlxuXG4gICBJdGVyYXRpbmcgdmlld3Mgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnlcbiAgIG1heSByYWlzZSBhICJSdW50aW1lRXJyb3IiIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzLlxuXG54IGluIGRpY3R2aWV3XG5cbiAgIFJldHVybiAiVHJ1ZSIgaWYgKngqIGlzIGluIHRoZSB1bmRlcmx5aW5nIGRpY3Rpb25hcnlcJ3Mga2V5cywgdmFsdWVzXG4gICBvciBpdGVtcyAoaW4gdGhlIGxhdHRlciBjYXNlLCAqeCogc2hvdWxkIGJlIGEgIihrZXksIHZhbHVlKSJcbiAgIHR1cGxlKS5cblxuS2V5cyB2aWV3cyBhcmUgc2V0LWxpa2Ugc2luY2UgdGhlaXIgZW50cmllcyBhcmUgdW5pcXVlIGFuZCBoYXNoYWJsZS5cbklmIGFsbCB2YWx1ZXMgYXJlIGhhc2hhYmxlLCBzbyB0aGF0ICIoa2V5LCB2YWx1ZSkiIHBhaXJzIGFyZSB1bmlxdWVcbmFuZCBoYXNoYWJsZSwgdGhlbiB0aGUgaXRlbXMgdmlldyBpcyBhbHNvIHNldC1saWtlLiAgKFZhbHVlcyB2aWV3cyBhcmVcbm5vdCB0cmVhdGVkIGFzIHNldC1saWtlIHNpbmNlIHRoZSBlbnRyaWVzIGFyZSBnZW5lcmFsbHkgbm90IHVuaXF1ZS4pXG5Gb3Igc2V0LWxpa2Ugdmlld3MsIGFsbCBvZiB0aGUgb3BlcmF0aW9ucyBkZWZpbmVkIGZvciB0aGUgYWJzdHJhY3RcbmJhc2UgY2xhc3MgImNvbGxlY3Rpb25zLmFiYy5TZXQiIGFyZSBhdmFpbGFibGUgKGZvciBleGFtcGxlLCAiPT0iLFxuIjwiLCBvciAiXiIpLlxuXG5BbiBleGFtcGxlIG9mIGRpY3Rpb25hcnkgdmlldyB1c2FnZTpcblxuICAgPj4+IGRpc2hlcyA9IHtcJ2VnZ3NcJzogMiwgXCdzYXVzYWdlXCc6IDEsIFwnYmFjb25cJzogMSwgXCdzcGFtXCc6IDUwMH1cbiAgID4+PiBrZXlzID0gZGlzaGVzLmtleXMoKVxuICAgPj4+IHZhbHVlcyA9IGRpc2hlcy52YWx1ZXMoKVxuXG4gICA+Pj4gIyBpdGVyYXRpb25cbiAgID4+PiBuID0gMFxuICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOlxuICAgLi4uICAgICBuICs9IHZhbFxuICAgPj4+IHByaW50KG4pXG4gICA1MDRcblxuICAgPj4+ICMga2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIHRoZSBzYW1lIG9yZGVyXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnZWdnc1wnLCBcJ2JhY29uXCcsIFwnc2F1c2FnZVwnLCBcJ3NwYW1cJ11cbiAgID4+PiBsaXN0KHZhbHVlcylcbiAgIFsyLCAxLCAxLCA1MDBdXG5cbiAgID4+PiAjIHZpZXcgb2JqZWN0cyBhcmUgZHluYW1pYyBhbmQgcmVmbGVjdCBkaWN0IGNoYW5nZXNcbiAgID4+PiBkZWwgZGlzaGVzW1wnZWdnc1wnXVxuICAgPj4+IGRlbCBkaXNoZXNbXCdzYXVzYWdlXCddXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnc3BhbVwnLCBcJ2JhY29uXCddXG5cbiAgID4+PiAjIHNldCBvcGVyYXRpb25zXG4gICA+Pj4ga2V5cyAmIHtcJ2VnZ3NcJywgXCdiYWNvblwnLCBcJ3NhbGFkXCd9XG4gICB7XCdiYWNvblwnfVxuICAgPj4+IGtleXMgXiB7XCdzYXVzYWdlXCcsIFwnanVpY2VcJ31cbiAgIHtcJ2p1aWNlXCcsIFwnc2F1c2FnZVwnLCBcJ2JhY29uXCcsIFwnc3BhbVwnfVxuJywKLSAndHlwZXNtZXRob2RzJzogdSdcbk1ldGhvZHNcbioqKioqKipcblxuTWV0aG9kcyBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB1c2luZyB0aGUgYXR0cmlidXRlIG5vdGF0aW9uLlxuVGhlcmUgYXJlIHR3byBmbGF2b3JzOiBidWlsdC1pbiBtZXRob2RzIChzdWNoIGFzICJhcHBlbmQoKSIgb24gbGlzdHMpXG5hbmQgY2xhc3MgaW5zdGFuY2UgbWV0aG9kcy4gIEJ1aWx0LWluIG1ldGhvZHMgYXJlIGRlc2NyaWJlZCB3aXRoIHRoZVxudHlwZXMgdGhhdCBzdXBwb3J0IHRoZW0uXG5cbklmIHlvdSBhY2Nlc3MgYSBtZXRob2QgKGEgZnVuY3Rpb24gZGVmaW5lZCBpbiBhIGNsYXNzIG5hbWVzcGFjZSlcbnRocm91Z2ggYW4gaW5zdGFuY2UsIHlvdSBnZXQgYSBzcGVjaWFsIG9iamVjdDogYSAqYm91bmQgbWV0aG9kKiAoYWxzb1xuY2FsbGVkICppbnN0YW5jZSBtZXRob2QqKSBvYmplY3QuIFdoZW4gY2FsbGVkLCBpdCB3aWxsIGFkZCB0aGUgInNlbGYiXG5hcmd1bWVudCB0byB0aGUgYXJndW1lbnQgbGlzdC4gIEJvdW5kIG1ldGhvZHMgaGF2ZSB0d28gc3BlY2lhbCByZWFkLVxub25seSBhdHRyaWJ1dGVzOiAibS5fX3NlbGZfXyIgaXMgdGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kXG5vcGVyYXRlcywgYW5kICJtLl9fZnVuY19fIiBpcyB0aGUgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSBtZXRob2QuXG5DYWxsaW5nICJtKGFyZy0xLCBhcmctMiwgLi4uLCBhcmctbikiIGlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0b1xuY2FsbGluZyAibS5fX2Z1bmNfXyhtLl9fc2VsZl9fLCBhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pIi5cblxuTGlrZSBmdW5jdGlvbiBvYmplY3RzLCBib3VuZCBtZXRob2Qgb2JqZWN0cyBzdXBwb3J0IGdldHRpbmcgYXJiaXRyYXJ5XG5hdHRyaWJ1dGVzLiAgSG93ZXZlciwgc2luY2UgbWV0aG9kIGF0dHJpYnV0ZXMgYXJlIGFjdHVhbGx5IHN0b3JlZCBvblxudGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0ICgibWV0aC5fX2Z1bmNfXyIpLCBzZXR0aW5nIG1ldGhvZFxuYXR0cmlidXRlcyBvbiBib3VuZCBtZXRob2RzIGlzIGRpc2FsbG93ZWQuICBBdHRlbXB0aW5nIHRvIHNldCBhblxuYXR0cmlidXRlIG9uIGEgbWV0aG9kIHJlc3VsdHMgaW4gYW4gIkF0dHJpYnV0ZUVycm9yIiBiZWluZyByYWlzZWQuICBJblxub3JkZXIgdG8gc2V0IGEgbWV0aG9kIGF0dHJpYnV0ZSwgeW91IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgb24gdGhlXG51bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdDpcblxuICAgPj4+IGNsYXNzIEM6XG4gICAuLi4gICAgIGRlZiBtZXRob2Qoc2VsZik6XG4gICAuLi4gICAgICAgICBwYXNzXG4gICAuLi5cbiAgID4+PiBjID0gQygpXG4gICA+Pj4gYy5tZXRob2Qud2hvYW1pID0gXCdteSBuYW1lIGlzIG1ldGhvZFwnICAjIGNhblwndCBzZXQgb24gdGhlIG1ldGhvZFxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgQXR0cmlidXRlRXJyb3I6IFwnbWV0aG9kXCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgXCd3aG9hbWlcJ1xuICAgPj4+IGMubWV0aG9kLl9fZnVuY19fLndob2FtaSA9IFwnbXkgbmFtZSBpcyBtZXRob2RcJ1xuICAgPj4+IGMubWV0aG9kLndob2FtaVxuICAgXCdteSBuYW1lIGlzIG1ldGhvZFwnXG5cblNlZSAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCi0gJ3R5cGVzbW9kdWxlcyc6IHUnXG5Nb2R1bGVzXG4qKioqKioqXG5cblRoZSBvbmx5IHNwZWNpYWwgb3BlcmF0aW9uIG9uIGEgbW9kdWxlIGlzIGF0dHJpYnV0ZSBhY2Nlc3M6ICJtLm5hbWUiLFxud2hlcmUgKm0qIGlzIGEgbW9kdWxlIGFuZCAqbmFtZSogYWNjZXNzZXMgYSBuYW1lIGRlZmluZWQgaW4gKm0qXCdzXG5zeW1ib2wgdGFibGUuIE1vZHVsZSBhdHRyaWJ1dGVzIGNhbiBiZSBhc3NpZ25lZCB0by4gIChOb3RlIHRoYXQgdGhlXG4iaW1wb3J0IiBzdGF0ZW1lbnQgaXMgbm90LCBzdHJpY3RseSBzcGVha2luZywgYW4gb3BlcmF0aW9uIG9uIGEgbW9kdWxlXG5vYmplY3Q7ICJpbXBvcnQgZm9vIiBkb2VzIG5vdCByZXF1aXJlIGEgbW9kdWxlIG9iamVjdCBuYW1lZCAqZm9vKiB0b1xuZXhpc3QsIHJhdGhlciBpdCByZXF1aXJlcyBhbiAoZXh0ZXJuYWwpICpkZWZpbml0aW9uKiBmb3IgYSBtb2R1bGVcbm5hbWVkICpmb28qIHNvbWV3aGVyZS4pXG5cbkEgc3BlY2lhbCBhdHRyaWJ1dGUgb2YgZXZlcnkgbW9kdWxlIGlzICJfX2RpY3RfXyIuIFRoaXMgaXMgdGhlXG5kaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG1vZHVsZVwncyBzeW1ib2wgdGFibGUuIE1vZGlmeWluZyB0aGlzXG5kaWN0aW9uYXJ5IHdpbGwgYWN0dWFsbHkgY2hhbmdlIHRoZSBtb2R1bGVcJ3Mgc3ltYm9sIHRhYmxlLCBidXQgZGlyZWN0XG5hc3NpZ25tZW50IHRvIHRoZSAiX19kaWN0X18iIGF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSBjYW4gd3JpdGVcbiJtLl9fZGljdF9fW1wnYVwnXSA9IDEiLCB3aGljaCBkZWZpbmVzICJtLmEiIHRvIGJlICIxIiwgYnV0IHlvdSBjYW5cJ3RcbndyaXRlICJtLl9fZGljdF9fID0ge30iKS4gIE1vZGlmeWluZyAiX19kaWN0X18iIGRpcmVjdGx5IGlzIG5vdFxucmVjb21tZW5kZWQuXG5cbk1vZHVsZXMgYnVpbHQgaW50byB0aGUgaW50ZXJwcmV0ZXIgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiAiPG1vZHVsZVxuXCdzeXNcJyAoYnVpbHQtaW4pPiIuICBJZiBsb2FkZWQgZnJvbSBhIGZpbGUsIHRoZXkgYXJlIHdyaXR0ZW4gYXNcbiI8bW9kdWxlIFwnb3NcJyBmcm9tIFwnL3Vzci9sb2NhbC9saWIvcHl0aG9uWC5ZL29zLnB5Y1wnPiIuXG4nLAotICd0eXBlc3NlcSc6IHUnXG5TZXF1ZW5jZSBUeXBlcyAtLS0gImxpc3QiLCAidHVwbGUiLCAicmFuZ2UiXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZXJlIGFyZSB0aHJlZSBiYXNpYyBzZXF1ZW5jZSB0eXBlczogbGlzdHMsIHR1cGxlcywgYW5kIHJhbmdlXG5vYmplY3RzLiBBZGRpdGlvbmFsIHNlcXVlbmNlIHR5cGVzIHRhaWxvcmVkIGZvciBwcm9jZXNzaW5nIG9mICpiaW5hcnlcbmRhdGEqIGFuZCAqdGV4dCBzdHJpbmdzKiBhcmUgZGVzY3JpYmVkIGluIGRlZGljYXRlZCBzZWN0aW9ucy5cblxuXG5Db21tb24gU2VxdWVuY2UgT3BlcmF0aW9uc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9wZXJhdGlvbnMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgc3VwcG9ydGVkIGJ5IG1vc3Qgc2VxdWVuY2VcbnR5cGVzLCBib3RoIG11dGFibGUgYW5kIGltbXV0YWJsZS4gVGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQ1xuaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zXG5vbiBjdXN0b20gc2VxdWVuY2UgdHlwZXMuXG5cblRoaXMgdGFibGUgbGlzdHMgdGhlIHNlcXVlbmNlIG9wZXJhdGlvbnMgc29ydGVkIGluIGFzY2VuZGluZyBwcmlvcml0eS5cbkluIHRoZSB0YWJsZSwgKnMqIGFuZCAqdCogYXJlIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlLCAqbiosICppKixcbipqKiBhbmQgKmsqIGFyZSBpbnRlZ2VycyBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnlcbnR5cGUgYW5kIHZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKi5cblxuVGhlICJpbiIgYW5kICJub3QgaW4iIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0aWVzIGFzIHRoZVxuY29tcGFyaXNvbiBvcGVyYXRpb25zLiBUaGUgIisiIChjb25jYXRlbmF0aW9uKSBhbmQgIioiIChyZXBldGl0aW9uKVxub3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBjb3JyZXNwb25kaW5nIG51bWVyaWNcbm9wZXJhdGlvbnMuXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PStcbnwgInggaW4gcyIgICAgICAgICAgICAgICAgICAgfCAiVHJ1ZSIgaWYgYW4gaXRlbSBvZiAqcyogaXMgICAgICB8ICgxKSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiRmFsc2UiICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInggbm90IGluIHMiICAgICAgICAgICAgICAgfCAiRmFsc2UiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICB8ICgxKSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiVHJ1ZSIgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInMgKyB0IiAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29uY2F0ZW5hdGlvbiBvZiAqcyogYW5kICp0KiB8ICg2KSg3KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzICogbiIgb3IgIm4gKiBzIiAgICAgICAgIHwgZXF1aXZhbGVudCB0byBhZGRpbmcgKnMqIHRvICAgICAgfCAoMikoNykgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdHNlbGYgKm4qIHRpbWVzICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJzW2ldIiAgICAgICAgICAgICAgICAgICAgIHwgKmkqdGggaXRlbSBvZiAqcyosIG9yaWdpbiAwICAgICAgfCAoMykgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAic1tpOmpdIiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDQpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInNbaTpqOmtdIiAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICB8ICgzKSg1KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdpdGggc3RlcCAqayogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgImxlbihzKSIgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgKnMqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58ICJtaW4ocykiICAgICAgICAgICAgICAgICAgIHwgc21hbGxlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAibWF4KHMpIiAgICAgICAgICAgICAgICAgICB8IGxhcmdlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbnwgInMuaW5kZXgoeFssIGlbLCBqXV0pIiAgICAgfCBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB8ICg4KSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiBpbiAqcyogKGF0IG9yIGFmdGVyIGluZGV4ICAgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKmkqIGFuZCBiZWZvcmUgaW5kZXggKmoqKSAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCAicy5jb3VudCh4KSIgICAgICAgICAgICAgICB8IHRvdGFsIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiAgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqIGluICpzKiAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuXG5TZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZSBhbHNvIHN1cHBvcnQgY29tcGFyaXNvbnMuICBJbiBwYXJ0aWN1bGFyLFxudHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgY29tcGFyaW5nXG5jb3JyZXNwb25kaW5nIGVsZW1lbnRzLiBUaGlzIG1lYW5zIHRoYXQgdG8gY29tcGFyZSBlcXVhbCwgZXZlcnlcbmVsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSBzYW1lXG50eXBlIGFuZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4gIChGb3IgZnVsbCBkZXRhaWxzIHNlZSAqQ29tcGFyaXNvbnMqIGluXG50aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlLilcblxuTm90ZXM6XG5cbjEuIFdoaWxlIHRoZSAiaW4iIGFuZCAibm90IGluIiBvcGVyYXRpb25zIGFyZSB1c2VkIG9ubHkgZm9yIHNpbXBsZVxuICAgY29udGFpbm1lbnQgdGVzdGluZyBpbiB0aGUgZ2VuZXJhbCBjYXNlLCBzb21lIHNwZWNpYWxpc2VkIHNlcXVlbmNlc1xuICAgKHN1Y2ggYXMgInN0ciIsICJieXRlcyIgYW5kICJieXRlYXJyYXkiKSBhbHNvIHVzZSB0aGVtIGZvclxuICAgc3Vic2VxdWVuY2UgdGVzdGluZzpcblxuICAgICAgPj4+ICJnZyIgaW4gImVnZ3MiXG4gICAgICBUcnVlXG5cbjIuIFZhbHVlcyBvZiAqbiogbGVzcyB0aGFuICIwIiBhcmUgdHJlYXRlZCBhcyAiMCIgKHdoaWNoIHlpZWxkcyBhblxuICAgZW1wdHkgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyAqcyopLiAgTm90ZSB0aGF0IGl0ZW1zIGluIHRoZVxuICAgc2VxdWVuY2UgKnMqIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSByZWZlcmVuY2VkIG11bHRpcGxlIHRpbWVzLlxuICAgVGhpcyBvZnRlbiBoYXVudHMgbmV3IFB5dGhvbiBwcm9ncmFtbWVyczsgY29uc2lkZXI6XG5cbiAgICAgID4+PiBsaXN0cyA9IFtbXV0gKiAzXG4gICAgICA+Pj4gbGlzdHNcbiAgICAgIFtbXSwgW10sIFtdXVxuICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuICAgICAgPj4+IGxpc3RzXG4gICAgICBbWzNdLCBbM10sIFszXV1cblxuICAgV2hhdCBoYXMgaGFwcGVuZWQgaXMgdGhhdCAiW1tdXSIgaXMgYSBvbmUtZWxlbWVudCBsaXN0IGNvbnRhaW5pbmdcbiAgIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiAiW1tdXSAqIDMiIGFyZSByZWZlcmVuY2VzXG4gICB0byB0aGlzIHNpbmdsZSBlbXB0eSBsaXN0LiAgTW9kaWZ5aW5nIGFueSBvZiB0aGUgZWxlbWVudHMgb2ZcbiAgICJsaXN0cyIgbW9kaWZpZXMgdGhpcyBzaW5nbGUgbGlzdC4gWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mXG4gICBkaWZmZXJlbnQgbGlzdHMgdGhpcyB3YXk6XG5cbiAgICAgID4+PiBsaXN0cyA9IFtbXSBmb3IgaSBpbiByYW5nZSgzKV1cbiAgICAgID4+PiBsaXN0c1swXS5hcHBlbmQoMylcbiAgICAgID4+PiBsaXN0c1sxXS5hcHBlbmQoNSlcbiAgICAgID4+PiBsaXN0c1syXS5hcHBlbmQoNylcbiAgICAgID4+PiBsaXN0c1xuICAgICAgW1szXSwgWzVdLCBbN11dXG5cbiAgIEZ1cnRoZXIgZXhwbGFuYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBGQVEgZW50cnkgKkhvdyBkbyBJIGNyZWF0ZVxuICAgYSBtdWx0aWRpbWVuc2lvbmFsIGxpc3Q/Ki5cblxuMy4gSWYgKmkqIG9yICpqKiBpcyBuZWdhdGl2ZSwgdGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2ZcbiAgIHRoZSBzdHJpbmc6ICJsZW4ocykgKyBpIiBvciAibGVuKHMpICsgaiIgaXMgc3Vic3RpdHV0ZWQuICBCdXQgbm90ZVxuICAgdGhhdCAiLTAiIGlzIHN0aWxsICIwIi5cblxuNC4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgZGVmaW5lZCBhcyB0aGUgc2VxdWVuY2Ugb2ZcbiAgIGl0ZW1zIHdpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCAiaSA8PSBrIDwgaiIuICBJZiAqaSogb3IgKmoqIGlzXG4gICBncmVhdGVyIHRoYW4gImxlbihzKSIsIHVzZSAibGVuKHMpIi4gIElmICppKiBpcyBvbWl0dGVkIG9yICJOb25lIixcbiAgIHVzZSAiMCIuICBJZiAqaiogaXMgb21pdHRlZCBvciAiTm9uZSIsIHVzZSAibGVuKHMpIi4gIElmICppKiBpc1xuICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICpqKiwgdGhlIHNsaWNlIGlzIGVtcHR5LlxuXG41LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiB3aXRoIHN0ZXAgKmsqIGlzIGRlZmluZWQgYXMgdGhlXG4gICBzZXF1ZW5jZSBvZiBpdGVtcyB3aXRoIGluZGV4ICAieCA9IGkgKyBuKmsiIHN1Y2ggdGhhdCAiMCA8PSBuIDxcbiAgIChqLWkpL2siLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBpbmRpY2VzIGFyZSAiaSIsICJpK2siLCAiaSsyKmsiLFxuICAgImkrMyprIiBhbmQgc28gb24sIHN0b3BwaW5nIHdoZW4gKmoqIGlzIHJlYWNoZWQgKGJ1dCBuZXZlclxuICAgaW5jbHVkaW5nICpqKikuICBJZiAqaSogb3IgKmoqIGlzIGdyZWF0ZXIgdGhhbiAibGVuKHMpIiwgdXNlXG4gICAibGVuKHMpIi4gIElmICppKiBvciAqaiogYXJlIG9taXR0ZWQgb3IgIk5vbmUiLCB0aGV5IGJlY29tZSAiZW5kIlxuICAgdmFsdWVzICh3aGljaCBlbmQgZGVwZW5kcyBvbiB0aGUgc2lnbiBvZiAqayopLiAgTm90ZSwgKmsqIGNhbm5vdCBiZVxuICAgemVyby4gSWYgKmsqIGlzICJOb25lIiwgaXQgaXMgdHJlYXRlZCBsaWtlICIxIi5cblxuNi4gQ29uY2F0ZW5hdGluZyBpbW11dGFibGUgc2VxdWVuY2VzIGFsd2F5cyByZXN1bHRzIGluIGEgbmV3XG4gICBvYmplY3QuIFRoaXMgbWVhbnMgdGhhdCBidWlsZGluZyB1cCBhIHNlcXVlbmNlIGJ5IHJlcGVhdGVkXG4gICBjb25jYXRlbmF0aW9uIHdpbGwgaGF2ZSBhIHF1YWRyYXRpYyBydW50aW1lIGNvc3QgaW4gdGhlIHRvdGFsXG4gICBzZXF1ZW5jZSBsZW5ndGguIFRvIGdldCBhIGxpbmVhciBydW50aW1lIGNvc3QsIHlvdSBtdXN0IHN3aXRjaCB0b1xuICAgb25lIG9mIHRoZSBhbHRlcm5hdGl2ZXMgYmVsb3c6XG5cbiAgICogaWYgY29uY2F0ZW5hdGluZyAic3RyIiBvYmplY3RzLCB5b3UgY2FuIGJ1aWxkIGEgbGlzdCBhbmQgdXNlXG4gICAgICJzdHIuam9pbigpIiBhdCB0aGUgZW5kIG9yIGVsc2Ugd3JpdGUgdG8gYW4gImlvLlN0cmluZ0lPIlxuICAgICBpbnN0YW5jZSBhbmQgcmV0cmlldmUgaXRzIHZhbHVlIHdoZW4gY29tcGxldGVcblxuICAgKiBpZiBjb25jYXRlbmF0aW5nICJieXRlcyIgb2JqZWN0cywgeW91IGNhbiBzaW1pbGFybHkgdXNlXG4gICAgICJieXRlcy5qb2luKCkiIG9yICJpby5CeXRlc0lPIiwgb3IgeW91IGNhbiBkbyBpbi1wbGFjZVxuICAgICBjb25jYXRlbmF0aW9uIHdpdGggYSAiYnl0ZWFycmF5IiBvYmplY3QuICAiYnl0ZWFycmF5IiBvYmplY3RzIGFyZVxuICAgICBtdXRhYmxlIGFuZCBoYXZlIGFuIGVmZmljaWVudCBvdmVyYWxsb2NhdGlvbiBtZWNoYW5pc21cblxuICAgKiBpZiBjb25jYXRlbmF0aW5nICJ0dXBsZSIgb2JqZWN0cywgZXh0ZW5kIGEgImxpc3QiIGluc3RlYWRcblxuICAgKiBmb3Igb3RoZXIgdHlwZXMsIGludmVzdGlnYXRlIHRoZSByZWxldmFudCBjbGFzcyBkb2N1bWVudGF0aW9uXG5cbjcuIFNvbWUgc2VxdWVuY2UgdHlwZXMgKHN1Y2ggYXMgInJhbmdlIikgb25seSBzdXBwb3J0IGl0ZW1cbiAgIHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBzcGVjaWZpYyBwYXR0ZXJucywgYW5kIGhlbmNlIGRvblwndCBzdXBwb3J0XG4gICBzZXF1ZW5jZSBjb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24uXG5cbjguICJpbmRleCIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLiBXaGVuXG4gICBzdXBwb3J0ZWQsIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgaW5kZXggbWV0aG9kIGFsbG93XG4gICBlZmZpY2llbnQgc2VhcmNoaW5nIG9mIHN1YnNlY3Rpb25zIG9mIHRoZSBzZXF1ZW5jZS4gUGFzc2luZyB0aGVcbiAgIGV4dHJhIGFyZ3VtZW50cyBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdXNpbmcgInNbaTpqXS5pbmRleCh4KSIsXG4gICBvbmx5IHdpdGhvdXQgY29weWluZyBhbnkgZGF0YSBhbmQgd2l0aCB0aGUgcmV0dXJuZWQgaW5kZXggYmVpbmdcbiAgIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VxdWVuY2UgcmF0aGVyIHRoYW4gdGhlIHN0YXJ0IG9mIHRoZVxuICAgc2xpY2UuXG5cblxuSW1tdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9ubHkgb3BlcmF0aW9uIHRoYXQgaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGVzIGdlbmVyYWxseSBpbXBsZW1lbnRcbnRoYXQgaXMgbm90IGFsc28gaW1wbGVtZW50ZWQgYnkgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBpcyBzdXBwb3J0IGZvclxudGhlICJoYXNoKCkiIGJ1aWx0LWluLlxuXG5UaGlzIHN1cHBvcnQgYWxsb3dzIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHN1Y2ggYXMgInR1cGxlIiBpbnN0YW5jZXMsIHRvXG5iZSB1c2VkIGFzICJkaWN0IiBrZXlzIGFuZCBzdG9yZWQgaW4gInNldCIgYW5kICJmcm96ZW5zZXQiIGluc3RhbmNlcy5cblxuQXR0ZW1wdGluZyB0byBoYXNoIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zIHVuaGFzaGFibGVcbnZhbHVlcyB3aWxsIHJlc3VsdCBpbiAiVHlwZUVycm9yIi5cblxuXG5NdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gbXV0YWJsZSBzZXF1ZW5jZVxudHlwZXMuIFRoZSAiY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXF1ZW5jZSIgQUJDIGlzIHByb3ZpZGVkIHRvIG1ha2Vcbml0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gY3VzdG9tIHNlcXVlbmNlXG50eXBlcy5cblxuSW4gdGhlIHRhYmxlICpzKiBpcyBhbiBpbnN0YW5jZSBvZiBhIG11dGFibGUgc2VxdWVuY2UgdHlwZSwgKnQqIGlzIGFueVxuaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueSB0eXBlIGFuZFxudmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgImJ5dGVhcnJheSIgb25seVxuYWNjZXB0cyBpbnRlZ2VycyB0aGF0IG1lZXQgdGhlIHZhbHVlIHJlc3RyaWN0aW9uICIwIDw9IHggPD0gMjU1IikuXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PStcbnwgInNbaV0gPSB4IiAgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkIGJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInNbaTpqXSA9IHQiICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAiZGVsIHNbaTpqXSIgICAgICAgICAgICAgICAgICAgfCBzYW1lIGFzICJzW2k6al0gPSBbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInNbaTpqOmtdID0gdCIgICAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mICJzW2k6ajprXSIgYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6ajprXSIgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlIGxpc3QgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuYXBwZW5kKHgpIiAgICAgICAgICAgICAgICAgIHwgYXBwZW5kcyAqeCogdG8gdGhlIGVuZCBvZiB0aGUgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzZXF1ZW5jZSAoc2FtZSBhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJzW2xlbihzKTpsZW4ocyldID0gW3hdIikgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5jbGVhcigpIiAgICAgICAgICAgICAgICAgICAgfCByZW1vdmVzIGFsbCBpdGVtcyBmcm9tICJzIiAoc2FtZSB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJkZWwgc1s6XSIpICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mICJzIiAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChzYW1lIGFzICJzWzpdIikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5leHRlbmQodCkiIG9yICJzICs9IHQiICAgICAgfCBleHRlbmRzICpzKiB3aXRoIHRoZSBjb250ZW50cyBvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp0KiAoZm9yIHRoZSBtb3N0IHBhcnQgdGhlIHNhbWUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgInNbbGVuKHMpOmxlbihzKV0gPSB0IikgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzICo9IG4iICAgICAgICAgICAgICAgICAgICAgICB8IHVwZGF0ZXMgKnMqIHdpdGggaXRzIGNvbnRlbnRzICAgIHwgKDYpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwZWF0ZWQgKm4qIHRpbWVzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmluc2VydChpLCB4KSIgICAgICAgICAgICAgICB8IGluc2VydHMgKngqIGludG8gKnMqIGF0IHRoZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaW5kZXggZ2l2ZW4gYnkgKmkqIChzYW1lIGFzICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gW3hdIikgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucG9wKFtpXSkiICAgICAgICAgICAgICAgICAgIHwgcmV0cmlldmVzIHRoZSBpdGVtIGF0ICppKiBhbmQgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbHNvIHJlbW92ZXMgaXQgZnJvbSAqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucmVtb3ZlKHgpIiAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlIHRoZSBmaXJzdCBpdGVtIGZyb20gKnMqICAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGVyZSAic1tpXSA9PSB4IiAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMucmV2ZXJzZSgpIiAgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyByZXBsYWNpbmcuXG5cbjIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gIi0xIiwgc28gdGhhdCBieSBkZWZhdWx0XG4gICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuXG4zLiAicmVtb3ZlIiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouXG5cbjQuIFRoZSAicmV2ZXJzZSgpIiBtZXRob2QgbW9kaWZpZXMgdGhlIHNlcXVlbmNlIGluIHBsYWNlIGZvclxuICAgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHJldmVyc2luZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzXG4gICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHJldmVyc2VkXG4gICBzZXF1ZW5jZS5cblxuNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlXG4gICBpbnRlcmZhY2VzIG9mIG11dGFibGUgY29udGFpbmVycyB0aGF0IGRvblwndCBzdXBwb3J0IHNsaWNpbmdcbiAgIG9wZXJhdGlvbnMgKHN1Y2ggYXMgImRpY3QiIGFuZCAic2V0IilcblxuICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuXG5cbjYuIFRoZSB2YWx1ZSAqbiogaXMgYW4gaW50ZWdlciwgb3IgYW4gb2JqZWN0IGltcGxlbWVudGluZ1xuICAgIl9faW5kZXhfXygpIi4gIFplcm8gYW5kIG5lZ2F0aXZlIHZhbHVlcyBvZiAqbiogY2xlYXIgdGhlIHNlcXVlbmNlLlxuICAgSXRlbXMgaW4gdGhlIHNlcXVlbmNlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSByZWZlcmVuY2VkIG11bHRpcGxlXG4gICB0aW1lcywgYXMgZXhwbGFpbmVkIGZvciAicyAqIG4iIHVuZGVyICpDb21tb24gU2VxdWVuY2UgT3BlcmF0aW9ucyouXG5cblxuTGlzdHNcbj09PT09XG5cbkxpc3RzIGFyZSBtdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgb2ZcbmhvbW9nZW5lb3VzIGl0ZW1zICh3aGVyZSB0aGUgcHJlY2lzZSBkZWdyZWUgb2Ygc2ltaWxhcml0eSB3aWxsIHZhcnkgYnlcbmFwcGxpY2F0aW9uKS5cblxuY2xhc3MgY2xhc3MgbGlzdChbaXRlcmFibGVdKVxuXG4gICBMaXN0cyBtYXkgYmUgY29uc3RydWN0ZWQgaW4gc2V2ZXJhbCB3YXlzOlxuXG4gICAqIFVzaW5nIGEgcGFpciBvZiBzcXVhcmUgYnJhY2tldHMgdG8gZGVub3RlIHRoZSBlbXB0eSBsaXN0OiAiW10iXG5cbiAgICogVXNpbmcgc3F1YXJlIGJyYWNrZXRzLCBzZXBhcmF0aW5nIGl0ZW1zIHdpdGggY29tbWFzOiAiW2FdIixcbiAgICAgIlthLCBiLCBjXSJcblxuICAgKiBVc2luZyBhIGxpc3QgY29tcHJlaGVuc2lvbjogIlt4IGZvciB4IGluIGl0ZXJhYmxlXSJcblxuICAgKiBVc2luZyB0aGUgdHlwZSBjb25zdHJ1Y3RvcjogImxpc3QoKSIgb3IgImxpc3QoaXRlcmFibGUpIlxuXG4gICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZVxuICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqXCdzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGFcbiAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3JcbiAgIG9iamVjdC4gIElmICppdGVyYWJsZSogaXMgYWxyZWFkeSBhIGxpc3QsIGEgY29weSBpcyBtYWRlIGFuZFxuICAgcmV0dXJuZWQsIHNpbWlsYXIgdG8gIml0ZXJhYmxlWzpdIi4gRm9yIGV4YW1wbGUsICJsaXN0KFwnYWJjXCcpIlxuICAgcmV0dXJucyAiW1wnYVwnLCBcJ2JcJywgXCdjXCddIiBhbmQgImxpc3QoICgxLCAyLCAzKSApIiByZXR1cm5zICJbMSwgMixcbiAgIDNdIi4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5XG4gICBsaXN0LCAiW10iLlxuXG4gICBNYW55IG90aGVyIG9wZXJhdGlvbnMgYWxzbyBwcm9kdWNlIGxpc3RzLCBpbmNsdWRpbmcgdGhlICJzb3J0ZWQoKSJcbiAgIGJ1aWx0LWluLlxuXG4gICBMaXN0cyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBhbmQgKm11dGFibGUqIHNlcXVlbmNlXG4gICBvcGVyYXRpb25zLiBMaXN0cyBhbHNvIHByb3ZpZGUgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIG1ldGhvZDpcblxuICAgc29ydCgqLCBrZXk9Tm9uZSwgcmV2ZXJzZT1Ob25lKVxuXG4gICAgICBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgbGlzdCBpbiBwbGFjZSwgdXNpbmcgb25seSAiPCIgY29tcGFyaXNvbnNcbiAgICAgIGJldHdlZW4gaXRlbXMuIEV4Y2VwdGlvbnMgYXJlIG5vdCBzdXBwcmVzc2VkIC0gaWYgYW55IGNvbXBhcmlzb25cbiAgICAgIG9wZXJhdGlvbnMgZmFpbCwgdGhlIGVudGlyZSBzb3J0IG9wZXJhdGlvbiB3aWxsIGZhaWwgKGFuZCB0aGVcbiAgICAgIGxpc3Qgd2lsbCBsaWtlbHkgYmUgbGVmdCBpbiBhIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSkuXG5cbiAgICAgICJzb3J0KCkiIGFjY2VwdHMgdHdvIGFyZ3VtZW50cyB0aGF0IGNhbiBvbmx5IGJlIHBhc3NlZCBieVxuICAgICAga2V5d29yZCAoKmtleXdvcmQtb25seSBhcmd1bWVudHMqKTpcblxuICAgICAgKmtleSogc3BlY2lmaWVzIGEgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50IHRoYXQgaXMgdXNlZCB0b1xuICAgICAgZXh0cmFjdCBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQgKGZvciBleGFtcGxlLFxuICAgICAgImtleT1zdHIubG93ZXIiKS4gVGhlIGtleSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdFxuICAgICAgaXMgY2FsY3VsYXRlZCBvbmNlIGFuZCB0aGVuIHVzZWQgZm9yIHRoZSBlbnRpcmUgc29ydGluZyBwcm9jZXNzLlxuICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgIk5vbmUiIG1lYW5zIHRoYXQgbGlzdCBpdGVtcyBhcmUgc29ydGVkXG4gICAgICBkaXJlY3RseSB3aXRob3V0IGNhbGN1bGF0aW5nIGEgc2VwYXJhdGUga2V5IHZhbHVlLlxuXG4gICAgICBUaGUgImZ1bmN0b29scy5jbXBfdG9fa2V5KCkiIHV0aWxpdHkgaXMgYXZhaWxhYmxlIHRvIGNvbnZlcnQgYVxuICAgICAgMi54IHN0eWxlICpjbXAqIGZ1bmN0aW9uIHRvIGEgKmtleSogZnVuY3Rpb24uXG5cbiAgICAgICpyZXZlcnNlKiBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gIlRydWUiLCB0aGVuIHRoZSBsaXN0XG4gICAgICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLlxuXG4gICAgICBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yIGVjb25vbXkgb2Ygc3BhY2VcbiAgICAgIHdoZW4gc29ydGluZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kIHVzZXJzIHRoYXQgaXQgb3BlcmF0ZXNcbiAgICAgIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gdGhlIHNvcnRlZCBzZXF1ZW5jZSAodXNlXG4gICAgICAic29ydGVkKCkiIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBhIG5ldyBzb3J0ZWQgbGlzdCBpbnN0YW5jZSkuXG5cbiAgICAgIFRoZSAic29ydCgpIiBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuICBBIHNvcnQgaXNcbiAgICAgIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlIHJlbGF0aXZlIG9yZGVyIG9mXG4gICAgICBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwgLS0tIHRoaXMgaXMgaGVscGZ1bCBmb3Igc29ydGluZyBpblxuICAgICAgbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LCB0aGVuIGJ5IHNhbGFyeVxuICAgICAgZ3JhZGUpLlxuXG4gICAgICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFdoaWxlIGEgbGlzdCBpcyBiZWluZyBzb3J0ZWQsXG4gICAgICB0aGUgZWZmZWN0IG9mIGF0dGVtcHRpbmcgdG8gbXV0YXRlLCBvciBldmVuIGluc3BlY3QsIHRoZSBsaXN0IGlzXG4gICAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gbWFrZXMgdGhlIGxpc3QgYXBwZWFyXG4gICAgICBlbXB0eSBmb3IgdGhlIGR1cmF0aW9uLCBhbmQgcmFpc2VzICJWYWx1ZUVycm9yIiBpZiBpdCBjYW4gZGV0ZWN0XG4gICAgICB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC5cblxuXG5UdXBsZXNcbj09PT09PVxuXG5UdXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlIGNvbGxlY3Rpb25zIG9mXG5oZXRlcm9nZW5lb3VzIGRhdGEgKHN1Y2ggYXMgdGhlIDItdHVwbGVzIHByb2R1Y2VkIGJ5IHRoZSAiZW51bWVyYXRlKCkiXG5idWlsdC1pbikuIFR1cGxlcyBhcmUgYWxzbyB1c2VkIGZvciBjYXNlcyB3aGVyZSBhbiBpbW11dGFibGUgc2VxdWVuY2Vcbm9mIGhvbW9nZW5lb3VzIGRhdGEgaXMgbmVlZGVkIChzdWNoIGFzIGFsbG93aW5nIHN0b3JhZ2UgaW4gYSAic2V0IiBvclxuImRpY3QiIGluc3RhbmNlKS5cblxuY2xhc3MgY2xhc3MgdHVwbGUoW2l0ZXJhYmxlXSlcblxuICAgVHVwbGVzIG1heSBiZSBjb25zdHJ1Y3RlZCBpbiBhIG51bWJlciBvZiB3YXlzOlxuXG4gICAqIFVzaW5nIGEgcGFpciBvZiBwYXJlbnRoZXNlcyB0byBkZW5vdGUgdGhlIGVtcHR5IHR1cGxlOiAiKCkiXG5cbiAgICogVXNpbmcgYSB0cmFpbGluZyBjb21tYSBmb3IgYSBzaW5nbGV0b24gdHVwbGU6ICJhLCIgb3IgIihhLCkiXG5cbiAgICogU2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogImEsIGIsIGMiIG9yICIoYSwgYiwgYykiXG5cbiAgICogVXNpbmcgdGhlICJ0dXBsZSgpIiBidWlsdC1pbjogInR1cGxlKCkiIG9yICJ0dXBsZShpdGVyYWJsZSkiXG5cbiAgIFRoZSBjb25zdHJ1Y3RvciBidWlsZHMgYSB0dXBsZSB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluIHRoZVxuICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqXCdzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyIGFcbiAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gaXRlcmF0b3JcbiAgIG9iamVjdC4gIElmICppdGVyYWJsZSogaXMgYWxyZWFkeSBhIHR1cGxlLCBpdCBpcyByZXR1cm5lZFxuICAgdW5jaGFuZ2VkLiBGb3IgZXhhbXBsZSwgInR1cGxlKFwnYWJjXCcpIiByZXR1cm5zICIoXCdhXCcsIFwnYlwnLCBcJ2NcJykiXG4gICBhbmQgInR1cGxlKCBbMSwgMiwgM10gKSIgcmV0dXJucyAiKDEsIDIsIDMpIi4gSWYgbm8gYXJndW1lbnQgaXNcbiAgIGdpdmVuLCB0aGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIG5ldyBlbXB0eSB0dXBsZSwgIigpIi5cblxuICAgTm90ZSB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZSBjb21tYSB3aGljaCBtYWtlcyBhIHR1cGxlLCBub3QgdGhlXG4gICBwYXJlbnRoZXNlcy4gVGhlIHBhcmVudGhlc2VzIGFyZSBvcHRpb25hbCwgZXhjZXB0IGluIHRoZSBlbXB0eVxuICAgdHVwbGUgY2FzZSwgb3Igd2hlbiB0aGV5IGFyZSBuZWVkZWQgdG8gYXZvaWQgc3ludGFjdGljIGFtYmlndWl0eS5cbiAgIEZvciBleGFtcGxlLCAiZihhLCBiLCBjKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggdGhyZWUgYXJndW1lbnRzLFxuICAgd2hpbGUgImYoKGEsIGIsIGMpKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSAzLXR1cGxlIGFzIHRoZSBzb2xlXG4gICBhcmd1bWVudC5cblxuICAgVHVwbGVzIGltcGxlbWVudCBhbGwgb2YgdGhlICpjb21tb24qIHNlcXVlbmNlIG9wZXJhdGlvbnMuXG5cbkZvciBoZXRlcm9nZW5lb3VzIGNvbGxlY3Rpb25zIG9mIGRhdGEgd2hlcmUgYWNjZXNzIGJ5IG5hbWUgaXMgY2xlYXJlclxudGhhbiBhY2Nlc3MgYnkgaW5kZXgsICJjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCkiIG1heSBiZSBhIG1vcmVcbmFwcHJvcHJpYXRlIGNob2ljZSB0aGFuIGEgc2ltcGxlIHR1cGxlIG9iamVjdC5cblxuXG5SYW5nZXNcbj09PT09PVxuXG5UaGUgInJhbmdlIiB0eXBlIHJlcHJlc2VudHMgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIG9mIG51bWJlcnMgYW5kIGlzXG5jb21tb25seSB1c2VkIGZvciBsb29waW5nIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHRpbWVzIGluICJmb3IiIGxvb3BzLlxuXG5jbGFzcyBjbGFzcyByYW5nZShzdG9wKVxuY2xhc3MgY2xhc3MgcmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSlcblxuICAgVGhlIGFyZ3VtZW50cyB0byB0aGUgcmFuZ2UgY29uc3RydWN0b3IgbXVzdCBiZSBpbnRlZ2VycyAoZWl0aGVyXG4gICBidWlsdC1pbiAiaW50IiBvciBhbnkgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgIl9faW5kZXhfXyJcbiAgIHNwZWNpYWwgbWV0aG9kKS4gIElmIHRoZSAqc3RlcCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG9cbiAgICIxIi4gSWYgdGhlICpzdGFydCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIjAiLiBJZlxuICAgKnN0ZXAqIGlzIHplcm8sICJWYWx1ZUVycm9yIiBpcyByYWlzZWQuXG5cbiAgIEZvciBhIHBvc2l0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIGEgcmFuZ2UgInIiIGFyZSBkZXRlcm1pbmVkXG4gICBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiB3aGVyZSAiaSA+PSAwIiBhbmQgInJbaV0gPFxuICAgc3RvcCIuXG5cbiAgIEZvciBhIG5lZ2F0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSBhcmUgc3RpbGxcbiAgIGRldGVybWluZWQgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIsIGJ1dCB0aGVcbiAgIGNvbnN0cmFpbnRzIGFyZSAiaSA+PSAwIiBhbmQgInJbaV0gPiBzdG9wIi5cblxuICAgQSByYW5nZSBvYmplY3Qgd2lsbCBiZSBlbXB0eSBpZiAiclswXSIgZG9lcyBub3QgbWVldCB0aGUgdmFsdWVcbiAgIGNvbnN0cmFpbnQuIFJhbmdlcyBkbyBzdXBwb3J0IG5lZ2F0aXZlIGluZGljZXMsIGJ1dCB0aGVzZSBhcmVcbiAgIGludGVycHJldGVkIGFzIGluZGV4aW5nIGZyb20gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgZGV0ZXJtaW5lZCBieVxuICAgdGhlIHBvc2l0aXZlIGluZGljZXMuXG5cbiAgIFJhbmdlcyBjb250YWluaW5nIGFic29sdXRlIHZhbHVlcyBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiIGFyZVxuICAgcGVybWl0dGVkIGJ1dCBzb21lIGZlYXR1cmVzIChzdWNoIGFzICJsZW4oKSIpIG1heSByYWlzZVxuICAgIk92ZXJmbG93RXJyb3IiLlxuXG4gICBSYW5nZSBleGFtcGxlczpcblxuICAgICAgPj4+IGxpc3QocmFuZ2UoMTApKVxuICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldXG4gICAgICA+Pj4gbGlzdChyYW5nZSgxLCAxMSkpXG4gICAgICBbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTBdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwLCAzMCwgNSkpXG4gICAgICBbMCwgNSwgMTAsIDE1LCAyMCwgMjVdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwLCAxMCwgMykpXG4gICAgICBbMCwgMywgNiwgOV1cbiAgICAgID4+PiBsaXN0KHJhbmdlKDAsIC0xMCwgLTEpKVxuICAgICAgWzAsIC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCwgLTldXG4gICAgICA+Pj4gbGlzdChyYW5nZSgwKSlcbiAgICAgIFtdXG4gICAgICA+Pj4gbGlzdChyYW5nZSgxLCAwKSlcbiAgICAgIFtdXG5cbiAgIFJhbmdlcyBpbXBsZW1lbnQgYWxsIG9mIHRoZSAqY29tbW9uKiBzZXF1ZW5jZSBvcGVyYXRpb25zIGV4Y2VwdFxuICAgY29uY2F0ZW5hdGlvbiBhbmQgcmVwZXRpdGlvbiAoZHVlIHRvIHRoZSBmYWN0IHRoYXQgcmFuZ2Ugb2JqZWN0c1xuICAgY2FuIG9ubHkgcmVwcmVzZW50IHNlcXVlbmNlcyB0aGF0IGZvbGxvdyBhIHN0cmljdCBwYXR0ZXJuIGFuZFxuICAgcmVwZXRpdGlvbiBhbmQgY29uY2F0ZW5hdGlvbiB3aWxsIHVzdWFsbHkgdmlvbGF0ZSB0aGF0IHBhdHRlcm4pLlxuXG4gICBzdGFydFxuXG4gICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGFydCogcGFyYW1ldGVyIChvciAiMCIgaWYgdGhlIHBhcmFtZXRlciB3YXNcbiAgICAgIG5vdCBzdXBwbGllZClcblxuICAgc3RvcFxuXG4gICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdG9wKiBwYXJhbWV0ZXJcblxuICAgc3RlcFxuXG4gICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGVwKiBwYXJhbWV0ZXIgKG9yICIxIiBpZiB0aGUgcGFyYW1ldGVyIHdhc1xuICAgICAgbm90IHN1cHBsaWVkKVxuXG5UaGUgYWR2YW50YWdlIG9mIHRoZSAicmFuZ2UiIHR5cGUgb3ZlciBhIHJlZ3VsYXIgImxpc3QiIG9yICJ0dXBsZSIgaXNcbnRoYXQgYSAicmFuZ2UiIG9iamVjdCB3aWxsIGFsd2F5cyB0YWtlIHRoZSBzYW1lIChzbWFsbCkgYW1vdW50IG9mXG5tZW1vcnksIG5vIG1hdHRlciB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgaXQgcmVwcmVzZW50cyAoYXMgaXQgb25seVxuc3RvcmVzIHRoZSAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIiB2YWx1ZXMsIGNhbGN1bGF0aW5nIGluZGl2aWR1YWxcbml0ZW1zIGFuZCBzdWJyYW5nZXMgYXMgbmVlZGVkKS5cblxuUmFuZ2Ugb2JqZWN0cyBpbXBsZW1lbnQgdGhlICJjb2xsZWN0aW9ucy5hYmMuU2VxdWVuY2UiIEFCQywgYW5kXG5wcm92aWRlIGZlYXR1cmVzIHN1Y2ggYXMgY29udGFpbm1lbnQgdGVzdHMsIGVsZW1lbnQgaW5kZXggbG9va3VwLFxuc2xpY2luZyBhbmQgc3VwcG9ydCBmb3IgbmVnYXRpdmUgaW5kaWNlcyAoc2VlICpTZXF1ZW5jZSBUeXBlcyAtLS1cbmxpc3QsIHR1cGxlLCByYW5nZSopOlxuXG4+Pj4gciA9IHJhbmdlKDAsIDIwLCAyKVxuPj4+IHJcbnJhbmdlKDAsIDIwLCAyKVxuPj4+IDExIGluIHJcbkZhbHNlXG4+Pj4gMTAgaW4gclxuVHJ1ZVxuPj4+IHIuaW5kZXgoMTApXG41XG4+Pj4gcls1XVxuMTBcbj4+PiByWzo1XVxucmFuZ2UoMCwgMTAsIDIpXG4+Pj4gclstMV1cbjE4XG5cblRlc3RpbmcgcmFuZ2Ugb2JqZWN0cyBmb3IgZXF1YWxpdHkgd2l0aCAiPT0iIGFuZCAiIT0iIGNvbXBhcmVzIHRoZW0gYXNcbnNlcXVlbmNlcy4gIFRoYXQgaXMsIHR3byByYW5nZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXlcbnJlcHJlc2VudCB0aGUgc2FtZSBzZXF1ZW5jZSBvZiB2YWx1ZXMuICAoTm90ZSB0aGF0IHR3byByYW5nZSBvYmplY3RzXG50aGF0IGNvbXBhcmUgZXF1YWwgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCJcbmF0dHJpYnV0ZXMsIGZvciBleGFtcGxlICJyYW5nZSgwKSA9PSByYW5nZSgyLCAxLCAzKSIgb3IgInJhbmdlKDAsIDMsXG4yKSA9PSByYW5nZSgwLCA0LCAyKSIuKVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBJbXBsZW1lbnQgdGhlIFNlcXVlbmNlIEFCQy4gU3VwcG9ydCBzbGljaW5nXG5hbmQgbmVnYXRpdmUgaW5kaWNlcy4gVGVzdCAiaW50IiBvYmplY3RzIGZvciBtZW1iZXJzaGlwIGluIGNvbnN0YW50XG50aW1lIGluc3RlYWQgb2YgaXRlcmF0aW5nIHRocm91Z2ggYWxsIGl0ZW1zLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBEZWZpbmUgXCc9PVwnIGFuZCBcJyE9XCcgdG8gY29tcGFyZSByYW5nZSBvYmplY3RzXG5iYXNlZCBvbiB0aGUgc2VxdWVuY2Ugb2YgdmFsdWVzIHRoZXkgZGVmaW5lIChpbnN0ZWFkIG9mIGNvbXBhcmluZ1xuYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5KS5cblxuTmV3IGluIHZlcnNpb24gMy4zOiBUaGUgInN0YXJ0IiwgInN0b3AiIGFuZCAic3RlcCIgYXR0cmlidXRlcy5cbicsCi0gJ3R5cGVzc2VxLW11dGFibGUnOiB1J1xuTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2VcbnR5cGVzLiBUaGUgImNvbGxlY3Rpb25zLmFiYy5NdXRhYmxlU2VxdWVuY2UiIEFCQyBpcyBwcm92aWRlZCB0byBtYWtlXG5pdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIG9uIGN1c3RvbSBzZXF1ZW5jZVxudHlwZXMuXG5cbkluIHRoZSB0YWJsZSAqcyogaXMgYW4gaW5zdGFuY2Ugb2YgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsICp0KiBpcyBhbnlcbml0ZXJhYmxlIG9iamVjdCBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCBtZWV0cyBhbnkgdHlwZSBhbmRcbnZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiIG9ubHlcbmFjY2VwdHMgaW50ZWdlcnMgdGhhdCBtZWV0IHRoZSB2YWx1ZSByZXN0cmljdGlvbiAiMCA8PSB4IDw9IDI1NSIpLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG58ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAqdCogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gW10iICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iIGFyZSAgIHwgKDEpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTpqOmtdIiBmcm9tIHRoZSBsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLmFwcGVuZCh4KSIgICAgICAgICAgICAgICAgICB8IGFwcGVuZHMgKngqIHRvIHRoZSBlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgYXMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9IFt4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSAicyIgKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcyAiZGVsIHNbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuY29weSgpIiAgICAgICAgICAgICAgICAgICAgIHwgY3JlYXRlcyBhIHNoYWxsb3cgY29weSBvZiAicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAic1s6XSIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgInMuZXh0ZW5kKHQpIiBvciAicyArPSB0IiAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgY29udGVudHMgb2YgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCBwYXJ0IHRoZSBzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJzW2xlbihzKTpsZW4ocyldID0gdCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicyAqPSBuIiAgICAgICAgICAgICAgICAgICAgICAgfCB1cGRhdGVzICpzKiB3aXRoIGl0cyBjb250ZW50cyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiB0aW1lcyAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiBhdCB0aGUgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAoc2FtZSBhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbaTppXSA9IFt4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnBvcChbaV0pIiAgICAgICAgICAgICAgICAgICB8IHJldHJpZXZlcyB0aGUgaXRlbSBhdCAqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gKnMqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICpzKiAgIHwgKDMpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0geCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgcmVwbGFjaW5nLlxuXG4yLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgYnkgZGVmYXVsdFxuICAgdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC5cblxuMy4gInJlbW92ZSIgcmFpc2VzICJWYWx1ZUVycm9yIiB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLlxuXG40LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3JcbiAgIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2Vyc1xuICAgdGhhdCBpdCBvcGVyYXRlcyBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSByZXZlcnNlZFxuICAgc2VxdWVuY2UuXG5cbjUuICJjbGVhcigpIiBhbmQgImNvcHkoKSIgYXJlIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZVxuICAgaW50ZXJmYWNlcyBvZiBtdXRhYmxlIGNvbnRhaW5lcnMgdGhhdCBkb25cJ3Qgc3VwcG9ydCBzbGljaW5nXG4gICBvcGVyYXRpb25zIChzdWNoIGFzICJkaWN0IiBhbmQgInNldCIpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDMuMzogImNsZWFyKCkiIGFuZCAiY29weSgpIiBtZXRob2RzLlxuXG42LiBUaGUgdmFsdWUgKm4qIGlzIGFuIGludGVnZXIsIG9yIGFuIG9iamVjdCBpbXBsZW1lbnRpbmdcbiAgICJfX2luZGV4X18oKSIuICBaZXJvIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb2YgKm4qIGNsZWFyIHRoZSBzZXF1ZW5jZS5cbiAgIEl0ZW1zIGluIHRoZSBzZXF1ZW5jZSBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZVxuICAgdGltZXMsIGFzIGV4cGxhaW5lZCBmb3IgInMgKiBuIiB1bmRlciAqQ29tbW9uIFNlcXVlbmNlIE9wZXJhdGlvbnMqLlxuJywKLSAndW5hcnknOiB1J1xuVW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQWxsIHVuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5OlxuXG4gICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByXG5cblRoZSB1bmFyeSAiLSIgKG1pbnVzKSBvcGVyYXRvciB5aWVsZHMgdGhlIG5lZ2F0aW9uIG9mIGl0cyBudW1lcmljXG5hcmd1bWVudC5cblxuVGhlIHVuYXJ5ICIrIiAocGx1cykgb3BlcmF0b3IgeWllbGRzIGl0cyBudW1lcmljIGFyZ3VtZW50IHVuY2hhbmdlZC5cblxuVGhlIHVuYXJ5ICJ+IiAoaW52ZXJ0KSBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mIGl0c1xuaW50ZWdlciBhcmd1bWVudC4gIFRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiAieCIgaXMgZGVmaW5lZCBhc1xuIi0oeCsxKSIuICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwgbnVtYmVycy5cblxuSW4gYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVyIHR5cGUsIGFcbiJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nLAotICd3aGlsZSc6IHUnXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZFxuYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSAiZWxzZSIgY2xhdXNlXCdzIHN1aXRlLiAgQSAiY29udGludWUiIHN0YXRlbWVudFxuZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmQgZ29lcyBiYWNrXG50byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuJywKLSAnd2l0aCc6IHUnXG5UaGUgIndpdGgiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSIuLi4iZXhjZXB0Ii4uLiJmaW5hbGx5IlxudXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkIGZvciBjb252ZW5pZW50IHJldXNlLlxuXG4gICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGVcbiAgIHdpdGhfaXRlbSA6Oj0gZXhwcmVzc2lvbiBbImFzIiB0YXJnZXRdXG5cblRoZSBleGVjdXRpb24gb2YgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cblxuMy4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19lbnRlcl9fKCkiIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlICJ3aXRoIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gIl9fZW50ZXJfXygpIiBpcyBhc3NpZ25lZCB0byBpdC5cblxuICAgTm90ZTogVGhlICJ3aXRoIiBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSAiX19lbnRlcl9fKCkiXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gIl9fZXhpdF9fKCkiIHdpbGwgYWx3YXlzIGJlXG4gICAgIGNhbGxlZC4gVGh1cywgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgYXNzaWdubWVudCB0byB0aGVcbiAgICAgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhbiBlcnJvciBvY2N1cnJpbmdcbiAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cblxuNS4gVGhlIHN1aXRlIGlzIGV4ZWN1dGVkLlxuXG42LiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gIl9fZXhpdF9fKCkiLiBPdGhlcndpc2UsIHRocmVlXG4gICAiTm9uZSIgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzIHJlcmFpc2VkLlxuICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCBhbmRcbiAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4gICBzdGF0ZW1lbnQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCB0aGVcbiAgIHJldHVybiB2YWx1ZSBmcm9tICJfX2V4aXRfXygpIiBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgIndpdGgiIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzogKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuXG4gICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gIndpdGgiXG4gICAgIHN0YXRlbWVudC5cbicsCi0gJ3lpZWxkJzogdSdcblRoZSAieWllbGQiIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHlpZWxkX3N0bXQgOjo9IHlpZWxkX2V4cHJlc3Npb25cblxuQSAieWllbGQiIHN0YXRlbWVudCBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBhICp5aWVsZFxuZXhwcmVzc2lvbiouIFRoZSB5aWVsZCBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gb21pdCB0aGUgcGFyZW50aGVzZXNcbnRoYXQgd291bGQgb3RoZXJ3aXNlIGJlIHJlcXVpcmVkIGluIHRoZSBlcXVpdmFsZW50IHlpZWxkIGV4cHJlc3Npb25cbnN0YXRlbWVudC4gRm9yIGV4YW1wbGUsIHRoZSB5aWVsZCBzdGF0ZW1lbnRzXG5cbiAgIHlpZWxkIDxleHByPlxuICAgeWllbGQgZnJvbSA8ZXhwcj5cblxuYXJlIGVxdWl2YWxlbnQgdG8gdGhlIHlpZWxkIGV4cHJlc3Npb24gc3RhdGVtZW50c1xuXG4gICAoeWllbGQgPGV4cHI+KVxuICAgKHlpZWxkIGZyb20gPGV4cHI+KVxuXG5ZaWVsZCBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyBhcmUgb25seSB1c2VkIHdoZW4gZGVmaW5pbmcgYVxuKmdlbmVyYXRvciogZnVuY3Rpb24sIGFuZCBhcmUgb25seSB1c2VkIGluIHRoZSBib2R5IG9mIHRoZSBnZW5lcmF0b3JcbmZ1bmN0aW9uLiAgVXNpbmcgeWllbGQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHN1ZmZpY2llbnQgdG8gY2F1c2VcbnRoYXQgZGVmaW5pdGlvbiB0byBjcmVhdGUgYSBnZW5lcmF0b3IgZnVuY3Rpb24gaW5zdGVhZCBvZiBhIG5vcm1hbFxuZnVuY3Rpb24uXG5cbkZvciBmdWxsIGRldGFpbHMgb2YgInlpZWxkIiBzZW1hbnRpY3MsIHJlZmVyIHRvIHRoZSAqWWllbGRcbmV4cHJlc3Npb25zKiBzZWN0aW9uLlxuJ30KKyMgQXV0b2dlbmVyYXRlZCBieSBTcGhpbnggb24gTW9uIEp1bCAxMSAxNTozMDoyNCAyMDE2Cit0b3BpY3MgPSB7J2Fzc2VydCc6ICdcbicKKyAgICAgICAgICAgJ1RoZSAiYXNzZXJ0IiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQXNzZXJ0IHN0YXRlbWVudHMgYXJlIGEgY29udmVuaWVudCB3YXkgdG8gaW5zZXJ0IGRlYnVnZ2luZyAnCisgICAgICAgICAgICdhc3NlcnRpb25zXG4nCisgICAgICAgICAgICdpbnRvIGEgcHJvZ3JhbTpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgYXNzZXJ0X3N0bXQgOjo9ICJhc3NlcnQiIGV4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uXVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgc2ltcGxlIGZvcm0sICJhc3NlcnQgZXhwcmVzc2lvbiIsIGlzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaWYgX19kZWJ1Z19fOlxuJworICAgICAgICAgICAnICAgICAgIGlmIG5vdCBleHByZXNzaW9uOiByYWlzZSBBc3NlcnRpb25FcnJvclxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZXh0ZW5kZWQgZm9ybSwgImFzc2VydCBleHByZXNzaW9uMSwgZXhwcmVzc2lvbjIiLCBpcyAnCisgICAgICAgICAgICdlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGlmIF9fZGVidWdfXzpcbicKKyAgICAgICAgICAgJyAgICAgICBpZiBub3QgZXhwcmVzc2lvbjE6IHJhaXNlIEFzc2VydGlvbkVycm9yKGV4cHJlc3Npb24yKVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGVzZSBlcXVpdmFsZW5jZXMgYXNzdW1lIHRoYXQgIl9fZGVidWdfXyIgYW5kICJBc3NlcnRpb25FcnJvciIgJworICAgICAgICAgICAncmVmZXJcbicKKyAgICAgICAgICAgJ3RvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50XG4nCisgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIHZhcmlhYmxlICJfX2RlYnVnX18iIGlzICJUcnVlIiB1bmRlclxuJworICAgICAgICAgICAnbm9ybWFsIGNpcmN1bXN0YW5jZXMsICJGYWxzZSIgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkICcKKyAgICAgICAgICAgJyhjb21tYW5kXG4nCisgICAgICAgICAgICdsaW5lIG9wdGlvbiAtTykuICBUaGUgY3VycmVudCBjb2RlIGdlbmVyYXRvciBlbWl0cyBubyBjb2RlIGZvciBhblxuJworICAgICAgICAgICAnYXNzZXJ0IHN0YXRlbWVudCB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgYXQgY29tcGlsZSB0aW1lLiAgJworICAgICAgICAgICAnTm90ZVxuJworICAgICAgICAgICAndGhhdCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlICcKKyAgICAgICAgICAgJ2V4cHJlc3Npb25cbicKKyAgICAgICAgICAgJ3RoYXQgZmFpbGVkIGluIHRoZSBlcnJvciBtZXNzYWdlOyBpdCB3aWxsIGJlIGRpc3BsYXllZCBhcyBwYXJ0IG9mICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnc3RhY2sgdHJhY2UuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0Fzc2lnbm1lbnRzIHRvICJfX2RlYnVnX18iIGFyZSBpbGxlZ2FsLiAgVGhlIHZhbHVlIGZvciB0aGUgJworICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgJ3ZhcmlhYmxlIGlzIGRldGVybWluZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzLlxuJywKKyAnYXNzaWdubWVudCc6ICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IHN0YXRlbWVudHNcbicKKyAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IHN0YXRlbWVudHMgYXJlIHVzZWQgdG8gKHJlKWJpbmQgbmFtZXMgdG8gdmFsdWVzIGFuZCAnCisgICAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAgICdtb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAgYXNzaWdubWVudF9zdG10IDo6PSAodGFyZ2V0X2xpc3QgIj0iKSsgKHN0YXJyZWRfZXhwcmVzc2lvbiAnCisgICAgICAgICAgICAgICAnfCB5aWVsZF9leHByZXNzaW9uKVxuJworICAgICAgICAgICAgICAgJyAgIHRhcmdldF9saXN0ICAgICA6Oj0gdGFyZ2V0ICgiLCIgdGFyZ2V0KSogWyIsIl1cbicKKyAgICAgICAgICAgICAgICcgICB0YXJnZXQgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgIigiIFt0YXJnZXRfbGlzdF0gIikiXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgICB8ICJbIiBbdGFyZ2V0X2xpc3RdICJdIlxuJworICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWZcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgc3Vic2NyaXB0aW9uXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgICB8IHNsaWNpbmdcbicKKyAgICAgICAgICAgICAgICcgICAgICAgICAgICAgIHwgIioiIHRhcmdldFxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyhTZWUgc2VjdGlvbiBQcmltYXJpZXMgZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yICcKKyAgICAgICAgICAgICAgICcqYXR0cmlidXRlcmVmKixcbicKKyAgICAgICAgICAgICAgICcqc3Vic2NyaXB0aW9uKiwgYW5kICpzbGljaW5nKi4pXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQW4gYXNzaWdubWVudCBzdGF0ZW1lbnQgZXZhbHVhdGVzIHRoZSBleHByZXNzaW9uIGxpc3QgJworICAgICAgICAgICAgICAgJyhyZW1lbWJlciB0aGF0XG4nCisgICAgICAgICAgICAgICAndGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgJworICAgICAgICAgICAgICAgJ2xhdHRlclxuJworICAgICAgICAgICAgICAgJ3lpZWxkaW5nIGEgdHVwbGUpIGFuZCBhc3NpZ25zIHRoZSBzaW5nbGUgcmVzdWx0aW5nIG9iamVjdCB0byAnCisgICAgICAgICAgICAgICAnZWFjaCBvZlxuJworICAgICAgICAgICAgICAgJ3RoZSB0YXJnZXQgbGlzdHMsIGZyb20gbGVmdCB0byByaWdodC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSAnCisgICAgICAgICAgICAgICAndGFyZ2V0XG4nCisgICAgICAgICAgICAgICAnKGxpc3QpLiBXaGVuIGEgdGFyZ2V0IGlzIHBhcnQgb2YgYSBtdXRhYmxlIG9iamVjdCAoYW4gJworICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgJ3JlZmVyZW5jZSwgc3Vic2NyaXB0aW9uIG9yIHNsaWNpbmcpLCB0aGUgbXV0YWJsZSBvYmplY3QgbXVzdFxuJworICAgICAgICAgICAgICAgJ3VsdGltYXRlbHkgcGVyZm9ybSB0aGUgYXNzaWdubWVudCBhbmQgZGVjaWRlIGFib3V0IGl0cyAnCisgICAgICAgICAgICAgICAndmFsaWRpdHksIGFuZFxuJworICAgICAgICAgICAgICAgJ21heSByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGFzc2lnbm1lbnQgaXMgdW5hY2NlcHRhYmxlLiAgVGhlICcKKyAgICAgICAgICAgICAgICdydWxlc1xuJworICAgICAgICAgICAgICAgJ29ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gJworICAgICAgICAgICAgICAgJ3dpdGggdGhlXG4nCisgICAgICAgICAgICAgICAnZGVmaW5pdGlvbiBvZiB0aGUgb2JqZWN0IHR5cGVzIChzZWUgc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZVxuJworICAgICAgICAgICAgICAgJ2hpZXJhcmNoeSkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCwgb3B0aW9uYWxseSBlbmNsb3NlZCAnCisgICAgICAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAgICAgICdwYXJlbnRoZXNlcyBvciBzcXVhcmUgYnJhY2tldHMsIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXMgJworICAgICAgICAgICAgICAgJ2ZvbGxvd3MuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgZW1wdHk6IFRoZSBvYmplY3QgbXVzdCBhbHNvIGJlIGFuICcKKyAgICAgICAgICAgICAgICdlbXB0eVxuJworICAgICAgICAgICAgICAgJyAgaXRlcmFibGUuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBzaW5nbGUgdGFyZ2V0IGluIHBhcmVudGhlc2VzOiBUaGUgJworICAgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICAgJyAgaXMgYXNzaWduZWQgdG8gdGhhdCB0YXJnZXQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzLCBvciAnCisgICAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICAgJyAgc2luZ2xlIHRhcmdldCBpbiBzcXVhcmUgYnJhY2tldHM6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiAnCisgICAgICAgICAgICAgICAnaXRlcmFibGVcbicKKyAgICAgICAgICAgICAgICcgIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzIGluIHRoZSAnCisgICAgICAgICAgICAgICAndGFyZ2V0XG4nCisgICAgICAgICAgICAgICAnICBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZSBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byAnCisgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAnICBjb3JyZXNwb25kaW5nIHRhcmdldHMuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAqIElmIHRoZSB0YXJnZXQgbGlzdCBjb250YWlucyBvbmUgdGFyZ2V0IHByZWZpeGVkIHdpdGggYW5cbicKKyAgICAgICAgICAgICAgICcgICAgYXN0ZXJpc2ssIGNhbGxlZCBhICJzdGFycmVkIiB0YXJnZXQ6IFRoZSBvYmplY3QgbXVzdCBiZSAnCisgICAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAgICcgICAgaXRlcmFibGUgd2l0aCBhdCBsZWFzdCBhcyBtYW55IGl0ZW1zIGFzIHRoZXJlIGFyZSB0YXJnZXRzICcKKyAgICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAgICcgICAgdGFyZ2V0IGxpc3QsIG1pbnVzIG9uZS4gIFRoZSBmaXJzdCBpdGVtcyBvZiB0aGUgaXRlcmFibGUgJworICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgJyAgICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgdGFyZ2V0cyBiZWZvcmUgdGhlICcKKyAgICAgICAgICAgICAgICdzdGFycmVkXG4nCisgICAgICAgICAgICAgICAnICAgIHRhcmdldC4gIFRoZSBmaW5hbCBpdGVtcyBvZiB0aGUgaXRlcmFibGUgYXJlIGFzc2lnbmVkIHRvICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICcgICAgdGFyZ2V0cyBhZnRlciB0aGUgc3RhcnJlZCB0YXJnZXQuICBBIGxpc3Qgb2YgdGhlIHJlbWFpbmluZyAnCisgICAgICAgICAgICAgICAnaXRlbXNcbicKKyAgICAgICAgICAgICAgICcgICAgaW4gdGhlIGl0ZXJhYmxlIGlzIHRoZW4gYXNzaWduZWQgdG8gdGhlIHN0YXJyZWQgdGFyZ2V0ICcKKyAgICAgICAgICAgICAgICcodGhlIGxpc3RcbicKKyAgICAgICAgICAgICAgICcgICAgY2FuIGJlIGVtcHR5KS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICogRWxzZTogVGhlIG9iamVjdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNhbWUgbnVtYmVyICcKKyAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgJyAgICBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCB0aGUgJworICAgICAgICAgICAgICAgJ2l0ZW1zIGFyZVxuJworICAgICAgICAgICAgICAgJyAgICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyAnCisgICAgICAgICAgICAgICAndGFyZ2V0cy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHNpbmdsZSB0YXJnZXQgaXMgcmVjdXJzaXZlbHkgJworICAgICAgICAgICAgICAgJ2RlZmluZWQgYXNcbicKKyAgICAgICAgICAgICAgICdmb2xsb3dzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKTpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICogSWYgdGhlIG5hbWUgZG9lcyBub3Qgb2NjdXIgaW4gYSAiZ2xvYmFsIiBvciAibm9ubG9jYWwiICcKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgICcgICAgaW4gdGhlIGN1cnJlbnQgY29kZSBibG9jazogdGhlIG5hbWUgaXMgYm91bmQgdG8gdGhlIG9iamVjdCAnCisgICAgICAgICAgICAgICAnaW4gdGhlXG4nCisgICAgICAgICAgICAgICAnICAgIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgKiBPdGhlcndpc2U6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlIGdsb2JhbFxuJworICAgICAgICAgICAgICAgJyAgICBuYW1lc3BhY2Ugb3IgdGhlIG91dGVyIG5hbWVzcGFjZSBkZXRlcm1pbmVkIGJ5ICcKKyAgICAgICAgICAgICAgICcibm9ubG9jYWwiLFxuJworICAgICAgICAgICAgICAgJyAgICByZXNwZWN0aXZlbHkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJyAgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgb2JqZWN0IHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIG5hbWUgJworICAgICAgICAgICAgICAgJ3RvIHJlYWNoXG4nCisgICAgICAgICAgICAgICAnICB6ZXJvLCBjYXVzaW5nIHRoZSBvYmplY3QgdG8gYmUgZGVhbGxvY2F0ZWQgYW5kIGl0cyAnCisgICAgICAgICAgICAgICAnZGVzdHJ1Y3RvciAoaWYgaXRcbicKKyAgICAgICAgICAgICAgICcgIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcqIElmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgJworICAgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaW5cbicKKyAgICAgICAgICAgICAgICcgIHRoZSByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGFuIG9iamVjdCB3aXRoXG4nCisgICAgICAgICAgICAgICAnICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCAiVHlwZUVycm9yIiAnCisgICAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAgICcgIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCAnCisgICAgICAgICAgICAgICAnb2JqZWN0IHRvXG4nCisgICAgICAgICAgICAgICAnICB0aGUgZ2l2ZW4gYXR0cmlidXRlOyBpZiBpdCBjYW5ub3QgcGVyZm9ybSB0aGUgYXNzaWdubWVudCwgaXQgJworICAgICAgICAgICAgICAgJ3JhaXNlc1xuJworICAgICAgICAgICAgICAgJyAgYW4gZXhjZXB0aW9uICh1c3VhbGx5IGJ1dCBub3QgbmVjZXNzYXJpbHkgJworICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciIpLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgTm90ZTogSWYgdGhlIG9iamVjdCBpcyBhIGNsYXNzIGluc3RhbmNlIGFuZCB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICdyZWZlcmVuY2VcbicKKyAgICAgICAgICAgICAgICcgIG9jY3VycyBvbiBib3RoIHNpZGVzIG9mIHRoZSBhc3NpZ25tZW50IG9wZXJhdG9yLCB0aGUgUkhTICcKKyAgICAgICAgICAgICAgICdleHByZXNzaW9uLFxuJworICAgICAgICAgICAgICAgJyAgImEueCIgY2FuIGFjY2VzcyBlaXRoZXIgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG9yIChpZiBubyAnCisgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZSBleGlzdHMpIGEgY2xhc3MgYXR0cmlidXRlLiAgVGhlIExIUyB0YXJnZXQgImEueCIgJworICAgICAgICAgICAgICAgJ2lzIGFsd2F5c1xuJworICAgICAgICAgICAgICAgJyAgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LiAgJworICAgICAgICAgICAgICAgJ1RodXMsIHRoZVxuJworICAgICAgICAgICAgICAgJyAgdHdvIG9jY3VycmVuY2VzIG9mICJhLngiIGRvIG5vdCBuZWNlc3NhcmlseSByZWZlciB0byB0aGUgJworICAgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZTogaWYgdGhlIFJIUyBleHByZXNzaW9uIHJlZmVycyB0byBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICdhdHRyaWJ1dGUsIHRoZVxuJworICAgICAgICAgICAgICAgJyAgTEhTIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYXR0cmlidXRlIGFzIHRoZSB0YXJnZXQgb2YgdGhlXG4nCisgICAgICAgICAgICAgICAnICBhc3NpZ25tZW50OlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgICAgY2xhc3MgQ2xzOlxuJworICAgICAgICAgICAgICAgJyAgICAgICAgIHggPSAzICAgICAgICAgICAgICMgY2xhc3MgdmFyaWFibGVcbicKKyAgICAgICAgICAgICAgICcgICAgIGluc3QgPSBDbHMoKVxuJworICAgICAgICAgICAgICAgJyAgICAgaW5zdC54ID0gaW5zdC54ICsgMSAgICMgd3JpdGVzIGluc3QueCBhcyA0IGxlYXZpbmcgQ2xzLnggJworICAgICAgICAgICAgICAgJ2FzIDNcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgIFRoaXMgZGVzY3JpcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gZGVzY3JpcHRvclxuJworICAgICAgICAgICAgICAgJyAgYXR0cmlidXRlcywgc3VjaCBhcyBwcm9wZXJ0aWVzIGNyZWF0ZWQgd2l0aCAicHJvcGVydHkoKSIuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICcgIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgZWl0aGVyIGEgbXV0YWJsZSAnCisgICAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICcgIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpIG9yIGEgbWFwcGluZyBvYmplY3QgKHN1Y2ggYXMgYSAnCisgICAgICAgICAgICAgICAnZGljdGlvbmFyeSkuXG4nCisgICAgICAgICAgICAgICAnICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgSWYgdGhlIHByaW1hcnkgaXMgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdCAoc3VjaCBhcyBhICcKKyAgICAgICAgICAgICAgICdsaXN0KSwgdGhlXG4nCisgICAgICAgICAgICAgICAnICBzdWJzY3JpcHQgbXVzdCB5aWVsZCBhbiBpbnRlZ2VyLiAgSWYgaXQgaXMgbmVnYXRpdmUsIHRoZSAnCisgICAgICAgICAgICAgICAic2VxdWVuY2Unc1xuIgorICAgICAgICAgICAgICAgJyAgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlIHJlc3VsdGluZyB2YWx1ZSBtdXN0IGJlIGEgJworICAgICAgICAgICAgICAgJ25vbm5lZ2F0aXZlXG4nCisgICAgICAgICAgICAgICAiICBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgc2VxdWVuY2UncyBsZW5ndGgsIGFuZCB0aGUgc2VxdWVuY2UgaXMgIgorICAgICAgICAgICAgICAgJ2Fza2VkXG4nCisgICAgICAgICAgICAgICAnICB0byBhc3NpZ24gdGhlIGFzc2lnbmVkIG9iamVjdCB0byBpdHMgaXRlbSB3aXRoIHRoYXQgaW5kZXguICAnCisgICAgICAgICAgICAgICAnSWYgdGhlXG4nCisgICAgICAgICAgICAgICAnICBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsICJJbmRleEVycm9yIiBpcyByYWlzZWQgKGFzc2lnbm1lbnQgdG8gJworICAgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAgICcgIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGEgbGlzdCkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBJZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSksICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICIgIHN1YnNjcmlwdCBtdXN0IGhhdmUgYSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgbWFwcGluZydzIGtleSAiCisgICAgICAgICAgICAgICAndHlwZSxcbicKKyAgICAgICAgICAgICAgICcgIGFuZCB0aGUgbWFwcGluZyBpcyB0aGVuIGFza2VkIHRvIGNyZWF0ZSBhIGtleS9kYXR1bSBwYWlyICcKKyAgICAgICAgICAgICAgICd3aGljaCBtYXBzXG4nCisgICAgICAgICAgICAgICAnICB0aGUgc3Vic2NyaXB0IHRvIHRoZSBhc3NpZ25lZCBvYmplY3QuICBUaGlzIGNhbiBlaXRoZXIgJworICAgICAgICAgICAgICAgJ3JlcGxhY2UgYW5cbicKKyAgICAgICAgICAgICAgICcgIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSAnCisgICAgICAgICAgICAgICAnbmV3XG4nCisgICAgICAgICAgICAgICAnICBrZXkvdmFsdWUgcGFpciAoaWYgbm8ga2V5IHdpdGggdGhlIHNhbWUgdmFsdWUgZXhpc3RlZCkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICBGb3IgdXNlci1kZWZpbmVkIG9iamVjdHMsIHRoZSAiX19zZXRpdGVtX18oKSIgbWV0aG9kIGlzICcKKyAgICAgICAgICAgICAgICdjYWxsZWQgd2l0aFxuJworICAgICAgICAgICAgICAgJyAgYXBwcm9wcmlhdGUgYXJndW1lbnRzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyogSWYgdGhlIHRhcmdldCBpcyBhIHNsaWNpbmc6IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW4gdGhlXG4nCisgICAgICAgICAgICAgICAnICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgICAnICAoc3VjaCBhcyBhIGxpc3QpLiAgVGhlIGFzc2lnbmVkIG9iamVjdCBzaG91bGQgYmUgYSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgICAgICAnICBvZiB0aGUgc2FtZSB0eXBlLiAgTmV4dCwgdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCAnCisgICAgICAgICAgICAgICAnZXhwcmVzc2lvbnMgYXJlXG4nCisgICAgICAgICAgICAgICAnICBldmFsdWF0ZWQsIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kICcKKyAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICIgIHNlcXVlbmNlJ3MgbGVuZ3RoLiAgVGhlIGJvdW5kcyBzaG91bGQgZXZhbHVhdGUgdG8gaW50ZWdlcnMuICIKKyAgICAgICAgICAgICAgICdJZlxuJworICAgICAgICAgICAgICAgIiAgZWl0aGVyIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2UncyBsZW5ndGggaXMgYWRkZWQgdG8gIgorICAgICAgICAgICAgICAgJ2l0LiAgVGhlXG4nCisgICAgICAgICAgICAgICAnICByZXN1bHRpbmcgYm91bmRzIGFyZSBjbGlwcGVkIHRvIGxpZSBiZXR3ZWVuIHplcm8gYW5kIHRoZSAnCisgICAgICAgICAgICAgICAic2VxdWVuY2Unc1xuIgorICAgICAgICAgICAgICAgJyAgbGVuZ3RoLCBpbmNsdXNpdmUuICBGaW5hbGx5LCB0aGUgc2VxdWVuY2Ugb2JqZWN0IGlzIGFza2VkIHRvICcKKyAgICAgICAgICAgICAgICdyZXBsYWNlXG4nCisgICAgICAgICAgICAgICAnICB0aGUgc2xpY2Ugd2l0aCB0aGUgaXRlbXMgb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLiAgVGhlICcKKyAgICAgICAgICAgICAgICdsZW5ndGggb2ZcbicKKyAgICAgICAgICAgICAgICcgIHRoZSBzbGljZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGxlbmd0aCBvZiB0aGUgYXNzaWduZWQgJworICAgICAgICAgICAgICAgJ3NlcXVlbmNlLFxuJworICAgICAgICAgICAgICAgJyAgdGh1cyBjaGFuZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UsIGlmIHRoZSAnCisgICAgICAgICAgICAgICAndGFyZ2V0XG4nCisgICAgICAgICAgICAgICAnICBzZXF1ZW5jZSBhbGxvd3MgaXQuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJbiB0aGUgY3VycmVudCAnCisgICAgICAgICAgICAgICAnaW1wbGVtZW50YXRpb24sIHRoZVxuJworICAgICAgICAgICAgICAgJ3N5bnRheCBmb3IgdGFyZ2V0cyBpcyB0YWtlbiB0byBiZSB0aGUgc2FtZSBhcyBmb3IgZXhwcmVzc2lvbnMsICcKKyAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICdpbnZhbGlkIHN5bnRheCBpcyByZWplY3RlZCBkdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSwgJworICAgICAgICAgICAgICAgJ2NhdXNpbmdcbicKKyAgICAgICAgICAgICAgICdsZXNzIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0FsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIGFzc2lnbm1lbnQgaW1wbGllcyB0aGF0IG92ZXJsYXBzICcKKyAgICAgICAgICAgICAgICdiZXR3ZWVuXG4nCisgICAgICAgICAgICAgICAidGhlIGxlZnQtaGFuZCBzaWRlIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSAnc2ltdWx0YW5lb3VzJyAiCisgICAgICAgICAgICAgICAnKGZvclxuJworICAgICAgICAgICAgICAgJ2V4YW1wbGUgImEsIGIgPSBiLCBhIiBzd2FwcyB0d28gdmFyaWFibGVzKSwgb3ZlcmxhcHMgKndpdGhpbiogJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb24gb2YgYXNzaWduZWQtdG8gdmFyaWFibGVzIG9jY3VyIGxlZnQtdG8tcmlnaHQsICcKKyAgICAgICAgICAgICAgICdzb21ldGltZXNcbicKKyAgICAgICAgICAgICAgICdyZXN1bHRpbmcgaW4gY29uZnVzaW9uLiAgRm9yIGluc3RhbmNlLCB0aGUgZm9sbG93aW5nIHByb2dyYW0gJworICAgICAgICAgICAgICAgJ3ByaW50c1xuJworICAgICAgICAgICAgICAgJyJbMCwgMl0iOlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyAgIHggPSBbMCwgMV1cbicKKyAgICAgICAgICAgICAgICcgICBpID0gMFxuJworICAgICAgICAgICAgICAgJyAgIGksIHhbaV0gPSAxLCAyICAgICAgICAgIyBpIGlzIHVwZGF0ZWQsIHRoZW4geFtpXSBpcyAnCisgICAgICAgICAgICAgICAndXBkYXRlZFxuJworICAgICAgICAgICAgICAgJyAgIHByaW50KHgpXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnICAqKlBFUCAzMTMyKiogLSBFeHRlbmRlZCBJdGVyYWJsZSBVbnBhY2tpbmdcbicKKyAgICAgICAgICAgICAgICcgICAgIFRoZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgIip0YXJnZXQiIGZlYXR1cmUuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuJworICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdBdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlICcKKyAgICAgICAgICAgICAgICdzdGF0ZW1lbnQsIG9mIGFcbicKKyAgICAgICAgICAgICAgICdiaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgJworICAgICAgICAgICAgICAgJyhleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuJworICAgICAgICAgICAgICAgJyAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCAnCisgICAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuJworICAgICAgICAgICAgICAgJyAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICJAPSIgfCAnCisgICAgICAgICAgICAgICAnIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iXG4nCisgICAgICAgICAgICAgICAnICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyhTZWUgc2VjdGlvbiBQcmltYXJpZXMgZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgb2YgdGhlIGxhc3QgJworICAgICAgICAgICAgICAgJ3RocmVlXG4nCisgICAgICAgICAgICAgICAnc3ltYm9scy4pXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2UgJworICAgICAgICAgICAgICAgJ25vcm1hbFxuJworICAgICAgICAgICAgICAgJ2Fzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICAgJ2xpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mICcKKyAgICAgICAgICAgICAgICdhc3NpZ25tZW50XG4nCisgICAgICAgICAgICAgICAnb24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgJworICAgICAgICAgICAgICAgJ3RhcmdldC5cbicKKyAgICAgICAgICAgICAgICdUaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlICJ4ICs9IDEiIGNhbiBiZSAnCisgICAgICAgICAgICAgICAncmV3cml0dGVuIGFzXG4nCisgICAgICAgICAgICAgICAnInggPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCAnCisgICAgICAgICAgICAgICAnZWZmZWN0LiBJbiB0aGVcbicKKyAgICAgICAgICAgICAgICdhdWdtZW50ZWQgdmVyc2lvbiwgIngiIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW4gJworICAgICAgICAgICAgICAgJ3Bvc3NpYmxlLFxuJworICAgICAgICAgICAgICAgJ3RoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXQgJworICAgICAgICAgICAgICAgJ3JhdGhlciB0aGFuXG4nCisgICAgICAgICAgICAgICAnY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgJworICAgICAgICAgICAgICAgJ29sZCBvYmplY3RcbicKKyAgICAgICAgICAgICAgICdpcyBtb2RpZmllZCBpbnN0ZWFkLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1VubGlrZSBub3JtYWwgYXNzaWdubWVudHMsIGF1Z21lbnRlZCBhc3NpZ25tZW50cyBldmFsdWF0ZSB0aGUgJworICAgICAgICAgICAgICAgJ2xlZnQtXG4nCisgICAgICAgICAgICAgICAnaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciAnCisgICAgICAgICAgICAgICAnZXhhbXBsZSwgImFbaV1cbicKKyAgICAgICAgICAgICAgICcrPSBmKHgpIiBmaXJzdCBsb29rcy11cCAiYVtpXSIsIHRoZW4gaXQgZXZhbHVhdGVzICJmKHgpIiBhbmQgJworICAgICAgICAgICAgICAgJ3BlcmZvcm1zXG4nCisgICAgICAgICAgICAgICAndGhlIGFkZGl0aW9uLCBhbmQgbGFzdGx5LCBpdCB3cml0ZXMgdGhlIHJlc3VsdCBiYWNrIHRvICcKKyAgICAgICAgICAgICAgICciYVtpXSIuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgJworICAgICAgICAgICAgICAgJ2luIGFcbicKKyAgICAgICAgICAgICAgICdzaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50XG4nCisgICAgICAgICAgICAgICAnc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuICcKKyAgICAgICAgICAgICAgICdTaW1pbGFybHksXG4nCisgICAgICAgICAgICAgICAnd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwb3NzaWJsZSAqaW4tcGxhY2UqIGJlaGF2aW9yLCB0aGUgJworICAgICAgICAgICAgICAgJ2JpbmFyeVxuJworICAgICAgICAgICAgICAgJ29wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlICcKKyAgICAgICAgICAgICAgICdub3JtYWxcbicKKyAgICAgICAgICAgICAgICdiaW5hcnkgb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdGb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lIGNhdmVhdCAnCisgICAgICAgICAgICAgICAnYWJvdXRcbicKKyAgICAgICAgICAgICAgICdjbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyBhcHBsaWVzIGFzIGZvciByZWd1bGFyICcKKyAgICAgICAgICAgICAgICdhc3NpZ25tZW50cy5cbicsCisgJ2F0b20taWRlbnRpZmllcnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSWRlbnRpZmllcnMgKE5hbWVzKVxuJworICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdBbiBpZGVudGlmaWVyIG9jY3VycmluZyBhcyBhbiBhdG9tIGlzIGEgbmFtZS4gIFNlZSAnCisgICAgICAgICAgICAgICAgICAgICAnc2VjdGlvbiBJZGVudGlmaWVyc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2FuZCBrZXl3b3JkcyBmb3IgbGV4aWNhbCBkZWZpbml0aW9uIGFuZCBzZWN0aW9uIE5hbWluZyAnCisgICAgICAgICAgICAgICAgICAgICAnYW5kIGJpbmRpbmcgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvbiBvZiBuYW1pbmcgYW5kIGJpbmRpbmcuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnV2hlbiB0aGUgbmFtZSBpcyBib3VuZCB0byBhbiBvYmplY3QsIGV2YWx1YXRpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdG9tIHlpZWxkc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3RoYXQgb2JqZWN0LiBXaGVuIGEgbmFtZSBpcyBub3QgYm91bmQsIGFuIGF0dGVtcHQgdG8gJworICAgICAgICAgICAgICAgICAgICAgJ2V2YWx1YXRlIGl0XG4nCisgICAgICAgICAgICAgICAgICAgICAncmFpc2VzIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyoqUHJpdmF0ZSBuYW1lIG1hbmdsaW5nOioqIFdoZW4gYW4gaWRlbnRpZmllciB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAgICd0ZXh0dWFsbHkgb2NjdXJzIGluXG4nCisgICAgICAgICAgICAgICAgICAgICAnYSBjbGFzcyBkZWZpbml0aW9uIGJlZ2lucyB3aXRoIHR3byBvciBtb3JlIHVuZGVyc2NvcmUgJworICAgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnZG9lcyBub3QgZW5kIGluIHR3byBvciBtb3JlIHVuZGVyc2NvcmVzLCBpdCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnY29uc2lkZXJlZCBhICpwcml2YXRlXG4nCisgICAgICAgICAgICAgICAgICAgICAnbmFtZSogb2YgdGhhdCBjbGFzcy4gUHJpdmF0ZSBuYW1lcyBhcmUgdHJhbnNmb3JtZWQgdG8gYSAnCisgICAgICAgICAgICAgICAgICAgICAnbG9uZ2VyIGZvcm1cbicKKyAgICAgICAgICAgICAgICAgICAgICdiZWZvcmUgY29kZSBpcyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGUgdHJhbnNmb3JtYXRpb24gJworICAgICAgICAgICAgICAgICAgICAgJ2luc2VydHMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnY2xhc3MgbmFtZSwgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmVzIHJlbW92ZWQgYW5kIGEgJworICAgICAgICAgICAgICAgICAgICAgJ3NpbmdsZSB1bmRlcnNjb3JlXG4nCisgICAgICAgICAgICAgICAgICAgICAnaW5zZXJ0ZWQsIGluIGZyb250IG9mIHRoZSBuYW1lLiAgRm9yIGV4YW1wbGUsIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnaWRlbnRpZmllciAiX19zcGFtIlxuJworICAgICAgICAgICAgICAgICAgICAgJ29jY3VycmluZyBpbiBhIGNsYXNzIG5hbWVkICJIYW0iIHdpbGwgYmUgdHJhbnNmb3JtZWQgdG8gJworICAgICAgICAgICAgICAgICAgICAgJyJfSGFtX19zcGFtIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGlzIHRyYW5zZm9ybWF0aW9uIGlzIGluZGVwZW5kZW50IG9mIHRoZSBzeW50YWN0aWNhbCAnCisgICAgICAgICAgICAgICAgICAgICAnY29udGV4dCBpbiB3aGljaFxuJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBpZGVudGlmaWVyIGlzIHVzZWQuICBJZiB0aGUgdHJhbnNmb3JtZWQgbmFtZSBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnZXh0cmVtZWx5IGxvbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcobG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMpLCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgICAgICd0cnVuY2F0aW9uIG1heVxuJworICAgICAgICAgICAgICAgICAgICAgJ2hhcHBlbi4gSWYgdGhlIGNsYXNzIG5hbWUgY29uc2lzdHMgb25seSBvZiB1bmRlcnNjb3JlcywgJworICAgICAgICAgICAgICAgICAgICAgJ25vXG4nCisgICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtYXRpb24gaXMgZG9uZS5cbicsCisgJ2F0b20tbGl0ZXJhbHMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAnTGl0ZXJhbHNcbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1B5dGhvbiBzdXBwb3J0cyBzdHJpbmcgYW5kIGJ5dGVzIGxpdGVyYWxzIGFuZCB2YXJpb3VzICcKKyAgICAgICAgICAgICAgICAgICdudW1lcmljXG4nCisgICAgICAgICAgICAgICAgICAnbGl0ZXJhbHM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgbGl0ZXJhbCA6Oj0gc3RyaW5nbGl0ZXJhbCB8IGJ5dGVzbGl0ZXJhbFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgIHwgaW50ZWdlciB8IGZsb2F0bnVtYmVyIHwgaW1hZ251bWJlclxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0V2YWx1YXRpb24gb2YgYSBsaXRlcmFsIHlpZWxkcyBhbiBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUgJworICAgICAgICAgICAgICAgICAgJyhzdHJpbmcsXG4nCisgICAgICAgICAgICAgICAgICAnYnl0ZXMsIGludGVnZXIsIGZsb2F0aW5nIHBvaW50IG51bWJlciwgY29tcGxleCBudW1iZXIpIHdpdGggJworICAgICAgICAgICAgICAgICAgJ3RoZSBnaXZlblxuJworICAgICAgICAgICAgICAgICAgJ3ZhbHVlLiAgVGhlIHZhbHVlIG1heSBiZSBhcHByb3hpbWF0ZWQgaW4gdGhlIGNhc2Ugb2YgJworICAgICAgICAgICAgICAgICAgJ2Zsb2F0aW5nIHBvaW50XG4nCisgICAgICAgICAgICAgICAgICAnYW5kIGltYWdpbmFyeSAoY29tcGxleCkgbGl0ZXJhbHMuICBTZWUgc2VjdGlvbiBMaXRlcmFscyBmb3IgJworICAgICAgICAgICAgICAgICAgJ2RldGFpbHMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQWxsIGxpdGVyYWxzIGNvcnJlc3BvbmQgdG8gaW1tdXRhYmxlIGRhdGEgdHlwZXMsIGFuZCBoZW5jZSAnCisgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAib2JqZWN0J3MgaWRlbnRpdHkgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBpdHMgdmFsdWUuICAiCisgICAgICAgICAgICAgICAgICAnTXVsdGlwbGVcbicKKyAgICAgICAgICAgICAgICAgICdldmFsdWF0aW9ucyBvZiBsaXRlcmFscyB3aXRoIHRoZSBzYW1lIHZhbHVlIChlaXRoZXIgdGhlICcKKyAgICAgICAgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICAgICAgICAnb2NjdXJyZW5jZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IG9yIGEgZGlmZmVyZW50IG9jY3VycmVuY2UpICcKKyAgICAgICAgICAgICAgICAgICdtYXkgb2J0YWluXG4nCisgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgb2JqZWN0IG9yIGEgZGlmZmVyZW50IG9iamVjdCB3aXRoIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZS5cbicsCisgJ2F0dHJpYnV0ZS1hY2Nlc3MnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnQ3VzdG9taXppbmcgYXR0cmlidXRlIGFjY2Vzc1xuJworICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gY3VzdG9taXplIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnbWVhbmluZyBvZlxuJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgJworICAgICAgICAgICAgICAgICAgICAgJyJ4Lm5hbWUiKSBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICdjbGFzcyBpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIGluIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICAgICdub3IgaXMgaXQgZm91bmRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgInNlbGYiKS4gICJuYW1lIiBpcyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBuYW1lLiBUaGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlICcKKyAgICAgICAgICAgICAgICAgICAgICdvciByYWlzZSBhblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdub3JtYWwgbWVjaGFuaXNtLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gJworICAgICAgICAgICAgICAgICAgICAgJ2ludGVudGlvbmFsIGFzeW1tZXRyeVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGJldHdlZW4gIl9fZ2V0YXR0cl9fKCkiIGFuZCAiX19zZXRhdHRyX18oKSIuKSBUaGlzIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdkb25lIGJvdGggZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0YXR0cl9fKCkiIHdvdWxkIGhhdmVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgJworICAgICAgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCBhdFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGxlYXN0IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIHlvdSBjYW4gZmFrZSB0b3RhbCAnCisgICAgICAgICAgICAgICAgICAgICAnY29udHJvbCBieSBub3RcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IChidXRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAiX19nZXRhdHRyaWJ1dGVfXygpIiBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvICcKKyAgICAgICAgICAgICAgICAgICAgICdhY3R1YWxseSBnZXQgdG90YWxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICAgICAnYWNjZXNzZXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0YXR0cl9fKCkiLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzcyAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fZ2V0YXR0cmlidXRlX18oKSIgZWl0aGVyXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgY2FsbHMgaXQgZXhwbGljaXRseSBvciByYWlzZXMgYW4gIkF0dHJpYnV0ZUVycm9yIi4gJworICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgJworICAgICAgICAgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIkF0dHJpYnV0ZUVycm9yIiBleGNlcHRpb24uIEluIG9yZGVyIHRvIGF2b2lkICcKKyAgICAgICAgICAgICAgICAgICAgICdpbmZpbml0ZSByZWN1cnNpb24gaW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uIHNob3VsZCBhbHdheXMgY2FsbCAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIGJhc2UgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCAnCisgICAgICAgICAgICAgICAgICAgICAnbmVlZHMsIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGV4YW1wbGUsICJvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyAnCisgICAgICAgICAgICAgICAgICAgICAndXAgc3BlY2lhbFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgbWV0aG9kcyBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhICcKKyAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSBzeW50YXhcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgIG9yIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlIFNwZWNpYWwgbWV0aG9kIGxvb2t1cC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgJworICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgY2FsbGVkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgJworICAgICAgICAgICAgICAgICAgICAgJ2luIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAnCisgICAgICAgICAgICAgICAgICAgICAnKnZhbHVlKiBpcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJZiAiX19zZXRhdHRyX18oKSIgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUsIGl0XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgJworICAgICAgICAgICAgICAgICAgICAgJ2ZvciBleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBMaWtlICJfX3NldGF0dHJfXygpIiBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGVhZCBvZlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmICJkZWwgJworICAgICAgICAgICAgICAgICAgICAgJ29iai5uYW1lIiBpc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGlyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBICcKKyAgICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZSBtdXN0IGJlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJuZWQuICJkaXIoKSIgY29udmVydHMgdGhlIHJldHVybmVkIHNlcXVlbmNlIHRvIGEgJworICAgICAgICAgICAgICAgICAgICAgJ2xpc3QgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc29ydHMgaXQuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG4nCisgICAgICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpICcKKyAgICAgICAgICAgICAgICAgICAgICdhcHBlYXJzIGluIGFuXG4nCisgICAgICAgICAgICAgICAgICAgICAnKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICJvd25lcidzIGNsYXNzXG4iCisgICAgICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeSBvciBpbiB0aGUgY2xhc3MgZGljdGlvbmFyeSBmb3Igb25lIG9mIGl0cyAnCisgICAgICAgICAgICAgICAgICAgICAncGFyZW50cykuICBJbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICdleGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICAgICd3aG9zZSBuYW1lIGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAidGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzJyAiCisgICAgICAgICAgICAgICAgICAgICAnIl9fZGljdF9fIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgJworICAgICAgICAgICAgICAgICAgICAgJyppbnN0YW5jZSogaXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciAnCisgICAgICAgICAgICAgICAgICAgICAnIk5vbmUiIHdoZW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzICcKKyAgICAgICAgICAgICAgICAgICAgICdtZXRob2Qgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiAnCisgICAgICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogJworICAgICAgICAgICAgICAgICAgICAgJ29mIHRoZSBvd25lclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBkZWxldGUgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnKmluc3RhbmNlKiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBvd25lciBjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgYXR0cmlidXRlICJfX29iamNsYXNzX18iIGlzIGludGVycHJldGVkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnImluc3BlY3QiIG1vZHVsZSBhc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3NwZWNpZnlpbmcgdGhlIGNsYXNzIHdoZXJlIHRoaXMgb2JqZWN0IHdhcyBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgICAgICcoc2V0dGluZyB0aGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVseSBjYW4gYXNzaXN0IGluIHJ1bnRpbWUgaW50cm9zcGVjdGlvbiBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnZHluYW1pYyBjbGFzc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMpLiBGb3IgY2FsbGFibGVzLCBpdCBtYXkgaW5kaWNhdGUgdGhhdCBhbiAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2Ugb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnZ2l2ZW4gdHlwZSAob3IgYSBzdWJjbGFzcykgaXMgZXhwZWN0ZWQgb3IgcmVxdWlyZWQgYXMgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWwgYXJndW1lbnQgKGZvciBleGFtcGxlLCBDUHl0aG9uIHNldHMgdGhpcyAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlIGZvclxuJworICAgICAgICAgICAgICAgICAgICAgJ3VuYm91bmQgbWV0aG9kcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBDKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbnZva2luZyBEZXNjcmlwdG9yc1xuJworICAgICAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAnCisgICAgICAgICAgICAgICAgICAgICAnImJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICdiZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuICcKKyAgICAgICAgICAgICAgICAgICAgICdvdmVycmlkZGVuIGJ5IG1ldGhvZHNcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiwgJworICAgICAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAgICAgJyJfX2RlbGV0ZV9fKCkiLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2FuIG9iamVjdCwgaXRcbicKKyAgICAgICAgICAgICAgICAgICAgICdpcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsICcKKyAgICAgICAgICAgICAgICAgICAgICdzZXQsIG9yIGRlbGV0ZVxuJworICAgICAgICAgICAgICAgICAgICAgInRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3QncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsICIKKyAgICAgICAgICAgICAgICAgICAgICciYS54IiBoYXMgYVxuJworICAgICAgICAgICAgICAgICAgICAgJ2xvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoICJhLl9fZGljdF9fW1wneFwnXSIsIHRoZW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10iLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnYmFzZSBjbGFzc2VzIG9mXG4nCisgICAgICAgICAgICAgICAgICAgICAnInR5cGUoYSkiIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdIb3dldmVyLCBpZiB0aGUgbG9va2VkLXVwIHZhbHVlIGlzIGFuIG9iamVjdCBkZWZpbmluZyAnCisgICAgICAgICAgICAgICAgICAgICAnb25lIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgICAgICdiZWhhdmlvciBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyAnCisgICAgICAgICAgICAgICAgICAgICAnaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAncHJlY2VkZW5jZSBjaGFpbiBkZXBlbmRzIG9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyAnCisgICAgICAgICAgICAgICAgICAgICAnd2VyZSBkZWZpbmVkIGFuZFxuJworICAgICAgICAgICAgICAgICAgICAgJ2hvdyB0aGV5IHdlcmUgY2FsbGVkLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgJworICAgICAgICAgICAgICAgICAgICAgJ2JpbmRpbmcsICJhLngiLiBIb3dcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiAiYSI6XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnRGlyZWN0IENhbGxcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlICcKKyAgICAgICAgICAgICAgICAgICAgICdkaXJlY3RseVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgInguX19nZXRfXyhhKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW5zdGFuY2UgQmluZGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIElmIGJpbmRpbmcgdG8gYW4gb2JqZWN0IGluc3RhbmNlLCAiYS54IiBpcyAnCisgICAgICAgICAgICAgICAgICAgICAndHJhbnNmb3JtZWQgaW50byB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBjYWxsOiAidHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhhLCB0eXBlKGEpKSIuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnQ2xhc3MgQmluZGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIElmIGJpbmRpbmcgdG8gYSBjbGFzcywgIkEueCIgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NhbGw6XG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIkEuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oTm9uZSwgQSkiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1N1cGVyIEJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBJZiAiYSIgaXMgYW4gaW5zdGFuY2Ugb2YgInN1cGVyIiwgdGhlbiB0aGUgYmluZGluZyAnCisgICAgICAgICAgICAgICAgICAgICAnInN1cGVyKEIsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgb2JqKS5tKCkiIHNlYXJjaGVzICJvYmouX19jbGFzc19fLl9fbXJvX18iIGZvciB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2Jhc2UgY2xhc3MgIkEiXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nICJCIiBhbmQgdGhlbiBpbnZva2VzIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRvciB3aXRoIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGNhbGw6ICJBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgJworICAgICAgICAgICAgICAgICAgICAgJ29iai5fX2NsYXNzX18pIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdGb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgJworICAgICAgICAgICAgICAgICAgICAgJ2ludm9jYXRpb24gZGVwZW5kc1xuJworICAgICAgICAgICAgICAgICAgICAgJ29uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBICcKKyAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yIGNhbiBkZWZpbmVcbicKKyAgICAgICAgICAgICAgICAgICAgICdhbnkgY29tYmluYXRpb24gb2YgIl9fZ2V0X18oKSIsICJfX3NldF9fKCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIuICBJZiBpdFxuJworICAgICAgICAgICAgICAgICAgICAgJ2RvZXMgbm90IGRlZmluZSAiX19nZXRfXygpIiwgdGhlbiBhY2Nlc3NpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgd2lsbCByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluICcKKyAgICAgICAgICAgICAgICAgICAgICJ0aGUgb2JqZWN0J3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICAgICAnIl9fc2V0X18oKSIgYW5kL29yXG4nCisgICAgICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgICAgICduZWl0aGVyLCBpdCBpc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2Egbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzICcKKyAgICAgICAgICAgICAgICAgICAgICdkZWZpbmUgYm90aFxuJworICAgICAgICAgICAgICAgICAgICAgJyJfX2dldF9fKCkiIGFuZCAiX19zZXRfXygpIiwgd2hpbGUgbm9uLWRhdGEgZGVzY3JpcHRvcnMgJworICAgICAgICAgICAgICAgICAgICAgJ2hhdmUganVzdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICciX19nZXRfXygpIiBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGggIl9fc2V0X18oKSIgJworICAgICAgICAgICAgICAgICAgICAgJ2FuZCAiX19nZXRfXygpIlxuJworICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uIGluIGFuIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5LiAgSW5cbicKKyAgICAgICAgICAgICAgICAgICAgICdjb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgJworICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdQeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nICJzdGF0aWNtZXRob2QoKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICciY2xhc3NtZXRob2QoKSIpIGFyZVxuJworICAgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGVkIGFzIG5vbi1kYXRhIGRlc2NyaXB0b3JzLiAgQWNjb3JkaW5nbHksICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZXMgY2FuXG4nCisgICAgICAgICAgICAgICAgICAgICAncmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZXMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICdhY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiAnCisgICAgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlICJwcm9wZXJ0eSgpIiBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgJworICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0b3IuXG4nCisgICAgICAgICAgICAgICAgICAgICAnQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgJworICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ19fc2xvdHNfX1xuJworICAgICAgICAgICAgICAgICAgICAgJz09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ0J5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBjbGFzc2VzIGhhdmUgYSBkaWN0aW9uYXJ5IGZvciAnCisgICAgICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICAgICAnc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzIGhhdmluZyB2ZXJ5IGZldyAnCisgICAgICAgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICd2YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZSBhY3V0ZSB3aGVuICcKKyAgICAgICAgICAgICAgICAgICAgICdjcmVhdGluZyBsYXJnZVxuJworICAgICAgICAgICAgICAgICAgICAgJ251bWJlcnMgb2YgaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluICcKKyAgICAgICAgICAgICAgICAgICAgICdhIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbi4gVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAgICAgJ29mIGluc3RhbmNlXG4nCisgICAgICAgICAgICAgICAgICAgICAndmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoICcKKyAgICAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSB0byBob2xkIGFcbicKKyAgICAgICAgICAgICAgICAgICAgICd2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgJworICAgICAgICAgICAgICAgICAgICAgJypfX2RpY3RfXyogaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAgICAnY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19zbG90c19fXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsICcKKyAgICAgICAgICAgICAgICAgICAgICdpdGVyYWJsZSwgb3Igc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICAnCisgICAgICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkIHZhcmlhYmxlcyBhbmQgJworICAgICAgICAgICAgICAgICAgICAgJ3ByZXZlbnRzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZCAqX193ZWFrcmVmX18qICcKKyAgICAgICAgICAgICAgICAgICAgICdmb3IgZWFjaFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ05vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICcqX19kaWN0X18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBhdHRyaWJ1dGUgb2YgdGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NpYmxlLCBzbyAnCisgICAgICAgICAgICAgICAgICAgICAnYSAqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSAnCisgICAgICAgICAgICAgICAgICAgICAnYXNzaWduZWQgbmV3XG4nCisgICAgICAgICAgICAgICAgICAgICAnICB2YXJpYWJsZXMgbm90IGxpc3RlZCBpbiB0aGUgKl9fc2xvdHNfXyogZGVmaW5pdGlvbi4gICcKKyAgICAgICAgICAgICAgICAgICAgICdBdHRlbXB0cyB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzICcKKyAgICAgICAgICAgICAgICAgICAgICciQXR0cmlidXRlRXJyb3IiLiBJZlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiAnCisgICAgICAgICAgICAgICAgICAgICAnYWRkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAiXCdfX2RpY3RfX1wnIiB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJypfX3Nsb3RzX18qXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBkZWNsYXJhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCAnCisgICAgICAgICAgICAgICAgICAgICAnY2xhc3Nlc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVmaW5pbmcgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlcy4gSWYgd2VhayByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gJworICAgICAgICAgICAgICAgICAgICAgJ2FkZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIlwnX193ZWFrcmVmX19cJyIgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVjbGFyYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5ICcKKyAgICAgICAgICAgICAgICAgICAgICdjcmVhdGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgZGVzY3JpcHRvcnMgKEltcGxlbWVudGluZyBEZXNjcmlwdG9ycykgZm9yIGVhY2ggJworICAgICAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlIG5hbWUuICBBcyBhXG4nCisgICAgICAgICAgICAgICAgICAgICAnICByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsICcKKyAgICAgICAgICAgICAgICAgICAgICdoYXZlIGEgKl9fZGljdF9fKlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIG11c3Qgb25seSAnCisgICAgICAgICAgICAgICAgICAgICAnY29udGFpbiBuYW1lc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgJworICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyAnCisgICAgICAgICAgICAgICAgICAgICAnaW5hY2Nlc3NpYmxlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAoZXhjZXB0IGJ5IHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2Jhc2UgY2xhc3MpLlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgVGhpcyByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgZnV0dXJlLCBhXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkICcKKyAgICAgICAgICAgICAgICAgICAgICdmcm9tXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzICJpbnQiLCAnCisgICAgICAgICAgICAgICAgICAgICAnImJ5dGVzIiBhbmQgInR1cGxlIi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcqIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAnCisgICAgICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXyouIE1hcHBpbmdzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICBtYXkgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsICcKKyAgICAgICAgICAgICAgICAgICAgICdtZWFuaW5nIG1heSBiZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgYXNzaWduZWQgdG8gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gga2V5LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgKl9fc2xvdHNfXyouXG4nLAorICdhdHRyaWJ1dGUtcmVmZXJlbmNlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnQXR0cmlidXRlIHJlZmVyZW5jZXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0FuIGF0dHJpYnV0ZSByZWZlcmVuY2UgaXMgYSBwcmltYXJ5IGZvbGxvd2VkIGJ5IGEgJworICAgICAgICAgICAgICAgICAgICAgICAgICdwZXJpb2QgYW5kIGEgbmFtZTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIGF0dHJpYnV0ZXJlZiA6Oj0gcHJpbWFyeSAiLiIgaWRlbnRpZmllclxuJworICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGhhdCBzdXBwb3J0c1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgcmVmZXJlbmNlcywgd2hpY2ggbW9zdCBvYmplY3RzIGRvLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ29iamVjdCBpcyB0aGVuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fza2VkIHRvIHByb2R1Y2UgdGhlIGF0dHJpYnV0ZSB3aG9zZSBuYW1lIGlzIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZXIuICBUaGlzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y3Rpb24gY2FuIGJlIGN1c3RvbWl6ZWQgYnkgb3ZlcnJpZGluZyB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICciX19nZXRhdHRyX18oKSIgbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICdJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgZXhjZXB0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIiBpc1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICdyYWlzZWQuICBPdGhlcndpc2UsIHRoZSB0eXBlIGFuZCB2YWx1ZSBvZiB0aGUgb2JqZWN0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjZWQgaXNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZGV0ZXJtaW5lZCBieSB0aGUgb2JqZWN0LiAgTXVsdGlwbGUgZXZhbHVhdGlvbnMgb2YgJworICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZSBhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAncmVmZXJlbmNlIG1heSB5aWVsZCBkaWZmZXJlbnQgb2JqZWN0cy5cbicsCisgJ2F1Z2Fzc2lnbic6ICdcbicKKyAgICAgICAgICAgICAgJ0F1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbicKKyAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsICcKKyAgICAgICAgICAgICAgJ29mIGFcbicKKyAgICAgICAgICAgICAgJ2JpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcgICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgJworICAgICAgICAgICAgICAnKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4nCisgICAgICAgICAgICAgICcgICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgJworICAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuJworICAgICAgICAgICAgICAnICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIkA9IiB8ICcKKyAgICAgICAgICAgICAgJyIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuJworICAgICAgICAgICAgICAnICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcoU2VlIHNlY3Rpb24gUHJpbWFyaWVzIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIG9mIHRoZSBsYXN0ICcKKyAgICAgICAgICAgICAgJ3RocmVlXG4nCisgICAgICAgICAgICAgICdzeW1ib2xzLilcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2UgJworICAgICAgICAgICAgICAnbm9ybWFsXG4nCisgICAgICAgICAgICAgICdhc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgJworICAgICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICAnbGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgJworICAgICAgICAgICAgICAnYXNzaWdubWVudFxuJworICAgICAgICAgICAgICAnb24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgJworICAgICAgICAgICAgICAndGFyZ2V0LlxuJworICAgICAgICAgICAgICAnVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdBbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgInggKz0gMSIgY2FuIGJlICcKKyAgICAgICAgICAgICAgJ3Jld3JpdHRlbiBhc1xuJworICAgICAgICAgICAgICAnInggPSB4ICsgMSIgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCBlZmZlY3QuICcKKyAgICAgICAgICAgICAgJ0luIHRoZVxuJworICAgICAgICAgICAgICAnYXVnbWVudGVkIHZlcnNpb24sICJ4IiBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuICcKKyAgICAgICAgICAgICAgJ3Bvc3NpYmxlLFxuJworICAgICAgICAgICAgICAndGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdCAnCisgICAgICAgICAgICAgICdyYXRoZXIgdGhhblxuJworICAgICAgICAgICAgICAnY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LCB0aGUgb2xkICcKKyAgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICAnaXMgbW9kaWZpZWQgaW5zdGVhZC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVW5saWtlIG5vcm1hbCBhc3NpZ25tZW50cywgYXVnbWVudGVkIGFzc2lnbm1lbnRzIGV2YWx1YXRlIHRoZSAnCisgICAgICAgICAgICAgICdsZWZ0LVxuJworICAgICAgICAgICAgICAnaGFuZCBzaWRlICpiZWZvcmUqIGV2YWx1YXRpbmcgdGhlIHJpZ2h0LWhhbmQgc2lkZS4gIEZvciAnCisgICAgICAgICAgICAgICdleGFtcGxlLCAiYVtpXVxuJworICAgICAgICAgICAgICAnKz0gZih4KSIgZmlyc3QgbG9va3MtdXAgImFbaV0iLCB0aGVuIGl0IGV2YWx1YXRlcyAiZih4KSIgYW5kICcKKyAgICAgICAgICAgICAgJ3BlcmZvcm1zXG4nCisgICAgICAgICAgICAgICd0aGUgYWRkaXRpb24sIGFuZCBsYXN0bHksIGl0IHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gImFbaV0iLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdXaXRoIHRoZSBleGNlcHRpb24gb2YgYXNzaWduaW5nIHRvIHR1cGxlcyBhbmQgbXVsdGlwbGUgdGFyZ2V0cyAnCisgICAgICAgICAgICAgICdpbiBhXG4nCisgICAgICAgICAgICAgICdzaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50XG4nCisgICAgICAgICAgICAgICdzdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gJworICAgICAgICAgICAgICAnU2ltaWxhcmx5LFxuJworICAgICAgICAgICAgICAnd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwb3NzaWJsZSAqaW4tcGxhY2UqIGJlaGF2aW9yLCB0aGUgJworICAgICAgICAgICAgICAnYmluYXJ5XG4nCisgICAgICAgICAgICAgICdvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSAnCisgICAgICAgICAgICAgICdub3JtYWxcbicKKyAgICAgICAgICAgICAgJ2JpbmFyeSBvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdGb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lIGNhdmVhdCAnCisgICAgICAgICAgICAgICdhYm91dFxuJworICAgICAgICAgICAgICAnY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXBwbGllcyBhcyBmb3IgcmVndWxhciAnCisgICAgICAgICAgICAgICdhc3NpZ25tZW50cy5cbicsCisgJ2JpbmFyeSc6ICdcbicKKyAgICAgICAgICAgJ0JpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgaGF2ZSB0aGUgY29udmVudGlvbmFsIHByaW9yaXR5XG4nCisgICAgICAgICAgICdsZXZlbHMuICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSBvcGVyYXRpb25zIGFsc28gYXBwbHkgdG8gY2VydGFpbiAnCisgICAgICAgICAgICdub24tXG4nCisgICAgICAgICAgICdudW1lcmljIHR5cGVzLiAgQXBhcnQgZnJvbSB0aGUgcG93ZXIgb3BlcmF0b3IsIHRoZXJlIGFyZSBvbmx5IHR3b1xuJworICAgICAgICAgICAnbGV2ZWxzLCBvbmUgZm9yIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9ycyBhbmQgb25lIGZvciBhZGRpdGl2ZVxuJworICAgICAgICAgICAnb3BlcmF0b3JzOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBtX2V4cHIgOjo9IHVfZXhwciB8IG1fZXhwciAiKiIgdV9leHByIHwgbV9leHByICJAIiBtX2V4cHIgfFxuJworICAgICAgICAgICAnICAgICAgICAgICAgICBtX2V4cHIgIi8vIiB1X2V4cHJ8IG1fZXhwciAiLyIgdV9leHByIHxcbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgbV9leHByICIlIiB1X2V4cHJcbicKKyAgICAgICAgICAgJyAgIGFfZXhwciA6Oj0gbV9leHByIHwgYV9leHByICIrIiBtX2V4cHIgfCBhX2V4cHIgIi0iIG1fZXhwclxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIioiIChtdWx0aXBsaWNhdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBwcm9kdWN0IG9mIGl0cyAnCisgICAgICAgICAgICdhcmd1bWVudHMuXG4nCisgICAgICAgICAgICdUaGUgYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycywgb3Igb25lIGFyZ3VtZW50IG11c3QgYmUgJworICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgJ2ludGVnZXIgYW5kIHRoZSBvdGhlciBtdXN0IGJlIGEgc2VxdWVuY2UuIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlXG4nCisgICAgICAgICAgICdudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSBhbmQgdGhlbiBtdWx0aXBsaWVkICcKKyAgICAgICAgICAgJ3RvZ2V0aGVyLlxuJworICAgICAgICAgICAnSW4gdGhlIGxhdHRlciBjYXNlLCBzZXF1ZW5jZSByZXBldGl0aW9uIGlzIHBlcmZvcm1lZDsgYSBuZWdhdGl2ZVxuJworICAgICAgICAgICAncmVwZXRpdGlvbiBmYWN0b3IgeWllbGRzIGFuIGVtcHR5IHNlcXVlbmNlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIkAiIChhdCkgb3BlcmF0b3IgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWF0cml4XG4nCisgICAgICAgICAgICdtdWx0aXBsaWNhdGlvbi4gIE5vIGJ1aWx0aW4gUHl0aG9uIHR5cGVzIGltcGxlbWVudCB0aGlzIG9wZXJhdG9yLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiLyIgKGRpdmlzaW9uKSBhbmQgIi8vIiAoZmxvb3IgZGl2aXNpb24pIG9wZXJhdG9ycyB5aWVsZCB0aGVcbicKKyAgICAgICAgICAgJ3F1b3RpZW50IG9mIHRoZWlyIGFyZ3VtZW50cy4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3RcbicKKyAgICAgICAgICAgJ2NvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiBEaXZpc2lvbiBvZiBpbnRlZ2VycyB5aWVsZHMgYSBmbG9hdCwgJworICAgICAgICAgICAnd2hpbGVcbicKKyAgICAgICAgICAgJ2Zsb29yIGRpdmlzaW9uIG9mIGludGVnZXJzIHJlc3VsdHMgaW4gYW4gaW50ZWdlcjsgdGhlIHJlc3VsdCBpcyAnCisgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICJvZiBtYXRoZW1hdGljYWwgZGl2aXNpb24gd2l0aCB0aGUgJ2Zsb29yJyBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZVxuIgorICAgICAgICAgICAncmVzdWx0LiAgRGl2aXNpb24gYnkgemVybyByYWlzZXMgdGhlICJaZXJvRGl2aXNpb25FcnJvciIgJworICAgICAgICAgICAnZXhjZXB0aW9uLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIiUiIChtb2R1bG8pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcmVtYWluZGVyIGZyb20gdGhlIGRpdmlzaW9uICcKKyAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICd0aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHNlY29uZC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgJworICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgJ2NvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgQSB6ZXJvIHJpZ2h0IGFyZ3VtZW50IHJhaXNlcyB0aGVcbicKKyAgICAgICAgICAgJyJaZXJvRGl2aXNpb25FcnJvciIgZXhjZXB0aW9uLiAgVGhlIGFyZ3VtZW50cyBtYXkgYmUgZmxvYXRpbmcgJworICAgICAgICAgICAncG9pbnRcbicKKyAgICAgICAgICAgJ251bWJlcnMsIGUuZy4sICIzLjE0JTAuNyIgZXF1YWxzICIwLjM0IiAoc2luY2UgIjMuMTQiIGVxdWFscyAnCisgICAgICAgICAgICciNCowLjcgK1xuJworICAgICAgICAgICAnMC4zNCIuKSAgVGhlIG1vZHVsbyBvcGVyYXRvciBhbHdheXMgeWllbGRzIGEgcmVzdWx0IHdpdGggdGhlIHNhbWUgJworICAgICAgICAgICAnc2lnblxuJworICAgICAgICAgICAnYXMgaXRzIHNlY29uZCBvcGVyYW5kIChvciB6ZXJvKTsgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSByZXN1bHQgJworICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgJ3N0cmljdGx5IHNtYWxsZXIgdGhhbiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHNlY29uZCBvcGVyYW5kICcKKyAgICAgICAgICAgJ1sxXS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZsb29yIGRpdmlzaW9uIGFuZCBtb2R1bG8gb3BlcmF0b3JzIGFyZSBjb25uZWN0ZWQgYnkgdGhlICcKKyAgICAgICAgICAgJ2ZvbGxvd2luZ1xuJworICAgICAgICAgICAnaWRlbnRpdHk6ICJ4ID09ICh4Ly95KSp5ICsgKHgleSkiLiAgRmxvb3IgZGl2aXNpb24gYW5kIG1vZHVsbyBhcmUgJworICAgICAgICAgICAnYWxzb1xuJworICAgICAgICAgICAnY29ubmVjdGVkIHdpdGggdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJkaXZtb2QoKSI6ICJkaXZtb2QoeCwgeSkgPT1cbicKKyAgICAgICAgICAgJyh4Ly95LCB4JXkpIi4gWzJdLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJbiBhZGRpdGlvbiB0byBwZXJmb3JtaW5nIHRoZSBtb2R1bG8gb3BlcmF0aW9uIG9uIG51bWJlcnMsIHRoZSAnCisgICAgICAgICAgICciJSJcbicKKyAgICAgICAgICAgJ29wZXJhdG9yIGlzIGFsc28gb3ZlcmxvYWRlZCBieSBzdHJpbmcgb2JqZWN0cyB0byBwZXJmb3JtICcKKyAgICAgICAgICAgJ29sZC1zdHlsZVxuJworICAgICAgICAgICAnc3RyaW5nIGZvcm1hdHRpbmcgKGFsc28ga25vd24gYXMgaW50ZXJwb2xhdGlvbikuICBUaGUgc3ludGF4IGZvclxuJworICAgICAgICAgICAnc3RyaW5nIGZvcm1hdHRpbmcgaXMgZGVzY3JpYmVkIGluIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UsXG4nCisgICAgICAgICAgICdzZWN0aW9uIHByaW50Zi1zdHlsZSBTdHJpbmcgRm9ybWF0dGluZy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yLCB0aGUgbW9kdWxvIG9wZXJhdG9yLCBhbmQgdGhlICcKKyAgICAgICAgICAgJyJkaXZtb2QoKSJcbicKKyAgICAgICAgICAgJ2Z1bmN0aW9uIGFyZSBub3QgZGVmaW5lZCBmb3IgY29tcGxleCBudW1iZXJzLiAgSW5zdGVhZCwgY29udmVydCB0byAnCisgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICdmbG9hdGluZyBwb2ludCBudW1iZXIgdXNpbmcgdGhlICJhYnMoKSIgZnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiKyIgKGFkZGl0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHN1bSBvZiBpdHMgYXJndW1lbnRzLiAgVGhlXG4nCisgICAgICAgICAgICdhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzIG9yIGJvdGggYmUgc2VxdWVuY2VzIG9mIHRoZSAnCisgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICd0eXBlLiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uICcKKyAgICAgICAgICAgJ3R5cGVcbicKKyAgICAgICAgICAgJ2FuZCB0aGVuIGFkZGVkIHRvZ2V0aGVyLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBzZXF1ZW5jZXMgYXJlXG4nCisgICAgICAgICAgICdjb25jYXRlbmF0ZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiLSIgKHN1YnRyYWN0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIGRpZmZlcmVuY2Ugb2YgaXRzICcKKyAgICAgICAgICAgJ2FyZ3VtZW50cy5cbicKKyAgICAgICAgICAgJ1RoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuXG4nLAorICdiaXR3aXNlJzogJ1xuJworICAgICAgICAgICAgJ0JpbmFyeSBiaXR3aXNlIG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnRWFjaCBvZiB0aGUgdGhyZWUgYml0d2lzZSBvcGVyYXRpb25zIGhhcyBhIGRpZmZlcmVudCBwcmlvcml0eSAnCisgICAgICAgICAgICAnbGV2ZWw6XG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnICAgYW5kX2V4cHIgOjo9IHNoaWZ0X2V4cHIgfCBhbmRfZXhwciAiJiIgc2hpZnRfZXhwclxuJworICAgICAgICAgICAgJyAgIHhvcl9leHByIDo6PSBhbmRfZXhwciB8IHhvcl9leHByICJeIiBhbmRfZXhwclxuJworICAgICAgICAgICAgJyAgIG9yX2V4cHIgIDo6PSB4b3JfZXhwciB8IG9yX2V4cHIgInwiIHhvcl9leHByXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVGhlICImIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgQU5EIG9mIGl0cyBhcmd1bWVudHMsIHdoaWNoICcKKyAgICAgICAgICAgICdtdXN0XG4nCisgICAgICAgICAgICAnYmUgaW50ZWdlcnMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVGhlICJeIiBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0c1xuJworICAgICAgICAgICAgJ2FyZ3VtZW50cywgd2hpY2ggbXVzdCBiZSBpbnRlZ2Vycy5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUaGUgInwiIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSAoaW5jbHVzaXZlKSBPUiBvZiBpdHMgJworICAgICAgICAgICAgJ2FyZ3VtZW50cyxcbicKKyAgICAgICAgICAgICd3aGljaCBtdXN0IGJlIGludGVnZXJzLlxuJywKKyAnYmx0aW4tY29kZS1vYmplY3RzJzogJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnQ29kZSBPYmplY3RzXG4nCisgICAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnQ29kZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byAnCisgICAgICAgICAgICAgICAgICAgICAgICdyZXByZXNlbnQgInBzZXVkby1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBpbGVkIiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlIHN1Y2ggYXMgYSBmdW5jdGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAgICdib2R5LiBUaGV5IGRpZmZlclxuJworICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBmdW5jdGlvbiBvYmplY3RzIGJlY2F1c2UgdGhleSBkb24ndCBjb250YWluIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAncmVmZXJlbmNlIHRvIHRoZWlyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwgZXhlY3V0aW9uIGVudmlyb25tZW50LiAgQ29kZSBvYmplY3RzIGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICdyZXR1cm5lZCBieSB0aGUgYnVpbHQtXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdpbiAiY29tcGlsZSgpIiBmdW5jdGlvbiBhbmQgY2FuIGJlIGV4dHJhY3RlZCBmcm9tICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uIG9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rocm91Z2ggdGhlaXIgIl9fY29kZV9fIiBhdHRyaWJ1dGUuIFNlZSBhbHNvIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICciY29kZSIgbW9kdWxlLlxuJworICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdBIGNvZGUgb2JqZWN0IGNhbiBiZSBleGVjdXRlZCBvciBldmFsdWF0ZWQgYnkgcGFzc2luZyAnCisgICAgICAgICAgICAgICAgICAgICAgICdpdCAoaW5zdGVhZCBvZiBhXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdzb3VyY2Ugc3RyaW5nKSB0byB0aGUgImV4ZWMoKSIgb3IgImV2YWwoKSIgIGJ1aWx0LWluICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9ucy5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAnU2VlIFRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSBmb3IgbW9yZSAnCisgICAgICAgICAgICAgICAgICAgICAgICdpbmZvcm1hdGlvbi5cbicsCisgJ2JsdGluLWVsbGlwc2lzLW9iamVjdCc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBFbGxpcHNpcyBPYmplY3RcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBvYmplY3QgaXMgY29tbW9ubHkgdXNlZCBieSBzbGljaW5nIChzZWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnU2xpY2luZ3MpLiAgSXQgc3VwcG9ydHNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsbGlwc2lzIG9iamVjdCwgbmFtZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyJFbGxpcHNpcyIgKGEgYnVpbHQtaW4gbmFtZSkuICAidHlwZShFbGxpcHNpcykoKSIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjZXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICciRWxsaXBzaXMiIHNpbmdsZXRvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnSXQgaXMgd3JpdHRlbiBhcyAiRWxsaXBzaXMiIG9yICIuLi4iLlxuJywKKyAnYmx0aW4tbnVsbC1vYmplY3QnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBOdWxsIE9iamVjdFxuJworICAgICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgb2JqZWN0IGlzIHJldHVybmVkIGJ5IGZ1bmN0aW9ucyB0aGF0IGRvbid0ICIKKyAgICAgICAgICAgICAgICAgICAgICAnZXhwbGljaXRseSByZXR1cm4gYVxuJworICAgICAgICAgICAgICAgICAgICAgICd2YWx1ZS4gIEl0IHN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzICcKKyAgICAgICAgICAgICAgICAgICAgICAnZXhhY3RseSBvbmUgbnVsbFxuJworICAgICAgICAgICAgICAgICAgICAgICdvYmplY3QsIG5hbWVkICJOb25lIiAoYSBidWlsdC1pbiBuYW1lKS4gICJ0eXBlKE5vbmUpKCkiICcKKyAgICAgICAgICAgICAgICAgICAgICAncHJvZHVjZXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAgJ3NhbWUgc2luZ2xldG9uLlxuJworICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAnSXQgaXMgd3JpdHRlbiBhcyAiTm9uZSIuXG4nLAorICdibHRpbi10eXBlLW9iamVjdHMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdUeXBlIE9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdUeXBlIG9iamVjdHMgcmVwcmVzZW50IHRoZSB2YXJpb3VzIG9iamVjdCB0eXBlcy4gIEFuICcKKyAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCdzIHR5cGUgaXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgJ2FjY2Vzc2VkIGJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAidHlwZSgpIi4gIFRoZXJlIGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICdubyBzcGVjaWFsXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdvcGVyYXRpb25zIG9uIHR5cGVzLiAgVGhlIHN0YW5kYXJkIG1vZHVsZSAidHlwZXMiICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZXMgbmFtZXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdhbGwgc3RhbmRhcmQgYnVpbHQtaW4gdHlwZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJ1R5cGVzIGFyZSB3cml0dGVuIGxpa2UgdGhpczogIjxjbGFzcyBcJ2ludFwnPiIuXG4nLAorICdib29sZWFucyc6ICdcbicKKyAgICAgICAgICAgICAnQm9vbGVhbiBvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgb3JfdGVzdCAgOjo9IGFuZF90ZXN0IHwgb3JfdGVzdCAib3IiIGFuZF90ZXN0XG4nCisgICAgICAgICAgICAgJyAgIGFuZF90ZXN0IDo6PSBub3RfdGVzdCB8IGFuZF90ZXN0ICJhbmQiIG5vdF90ZXN0XG4nCisgICAgICAgICAgICAgJyAgIG5vdF90ZXN0IDo6PSBjb21wYXJpc29uIHwgIm5vdCIgbm90X3Rlc3RcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0luIHRoZSBjb250ZXh0IG9mIEJvb2xlYW4gb3BlcmF0aW9ucywgYW5kIGFsc28gd2hlbiBleHByZXNzaW9ucyAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICd1c2VkIGJ5IGNvbnRyb2wgZmxvdyBzdGF0ZW1lbnRzLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgJworICAgICAgICAgICAgICdpbnRlcnByZXRlZFxuJworICAgICAgICAgICAgICdhcyBmYWxzZTogIkZhbHNlIiwgIk5vbmUiLCBudW1lcmljIHplcm8gb2YgYWxsIHR5cGVzLCBhbmQgZW1wdHlcbicKKyAgICAgICAgICAgICAnc3RyaW5ncyBhbmQgY29udGFpbmVycyAoaW5jbHVkaW5nIHN0cmluZ3MsIHR1cGxlcywgbGlzdHMsXG4nCisgICAgICAgICAgICAgJ2RpY3Rpb25hcmllcywgc2V0cyBhbmQgZnJvemVuc2V0cykuICBBbGwgb3RoZXIgdmFsdWVzIGFyZSAnCisgICAgICAgICAgICAgJ2ludGVycHJldGVkXG4nCisgICAgICAgICAgICAgJ2FzIHRydWUuICBVc2VyLWRlZmluZWQgb2JqZWN0cyBjYW4gY3VzdG9taXplIHRoZWlyIHRydXRoIHZhbHVlICcKKyAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAncHJvdmlkaW5nIGEgIl9fYm9vbF9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvcGVyYXRvciAibm90IiB5aWVsZHMgIlRydWUiIGlmIGl0cyBhcmd1bWVudCBpcyBmYWxzZSwgJworICAgICAgICAgICAgICciRmFsc2UiXG4nCisgICAgICAgICAgICAgJ290aGVyd2lzZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBleHByZXNzaW9uICJ4IGFuZCB5IiBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgZmFsc2UsICcKKyAgICAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgICAgJ3ZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgJworICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICdpcyByZXR1cm5lZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBleHByZXNzaW9uICJ4IG9yIHkiIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyB0cnVlLCBpdHMgJworICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICdpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAncmV0dXJuZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcoTm90ZSB0aGF0IG5laXRoZXIgImFuZCIgbm9yICJvciIgcmVzdHJpY3QgdGhlIHZhbHVlIGFuZCB0eXBlICcKKyAgICAgICAgICAgICAndGhleVxuJworICAgICAgICAgICAgICdyZXR1cm4gdG8gIkZhbHNlIiBhbmQgIlRydWUiLCBidXQgcmF0aGVyIHJldHVybiB0aGUgbGFzdCAnCisgICAgICAgICAgICAgJ2V2YWx1YXRlZFxuJworICAgICAgICAgICAgICdhcmd1bWVudC4gIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCwgZS5nLiwgaWYgInMiIGlzIGEgc3RyaW5nICcKKyAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICdzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBkZWZhdWx0IHZhbHVlIGlmIGl0IGlzIGVtcHR5LCB0aGUgJworICAgICAgICAgICAgICdleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJyJzIG9yIFwnZm9vXCciIHlpZWxkcyB0aGUgZGVzaXJlZCB2YWx1ZS4gIEJlY2F1c2UgIm5vdCIgaGFzIHRvICcKKyAgICAgICAgICAgICAnY3JlYXRlIGFcbicKKyAgICAgICAgICAgICAnbmV3IHZhbHVlLCBpdCByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mICcKKyAgICAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgICAgJ2FyZ3VtZW50IChmb3IgZXhhbXBsZSwgIm5vdCBcJ2Zvb1wnIiBwcm9kdWNlcyAiRmFsc2UiIHJhdGhlciAnCisgICAgICAgICAgICAgJ3RoYW4gIlwnXCciLilcbicsCisgJ2JyZWFrJzogJ1xuJworICAgICAgICAgICdUaGUgImJyZWFrIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBicmVha19zdG10IDo6PSAiYnJlYWsiXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICciYnJlYWsiIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgImZvciIgb3IgIndoaWxlIlxuJworICAgICAgICAgICdsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gd2l0aGluIHRoYXRcbicKKyAgICAgICAgICAnbG9vcC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0l0IHRlcm1pbmF0ZXMgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AsIHNraXBwaW5nIHRoZSBvcHRpb25hbCAnCisgICAgICAgICAgJyJlbHNlIlxuJworICAgICAgICAgICdjbGF1c2UgaWYgdGhlIGxvb3AgaGFzIG9uZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIGEgImZvciIgbG9vcCBpcyB0ZXJtaW5hdGVkIGJ5ICJicmVhayIsIHRoZSBsb29wIGNvbnRyb2wgdGFyZ2V0XG4nCisgICAgICAgICAgJ2tlZXBzIGl0cyBjdXJyZW50IHZhbHVlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnV2hlbiAiYnJlYWsiIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGEgJworICAgICAgICAgICciZmluYWxseSJcbicKKyAgICAgICAgICAnY2xhdXNlLCB0aGF0ICJmaW5hbGx5IiBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseSBsZWF2aW5nICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ2xvb3AuXG4nLAorICdjYWxsYWJsZS10eXBlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAnRW11bGF0aW5nIGNhbGxhYmxlIG9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2NhbGxfXyhzZWxmWywgYXJncy4uLl0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgJworICAgICAgICAgICAgICAgICAgICd0aGlzIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAgICcgICBpcyBkZWZpbmVkLCAieChhcmcxLCBhcmcyLCAuLi4pIiBpcyBhIHNob3J0aGFuZCBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgInguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKSIuXG4nLAorICdjYWxscyc6ICdcbicKKyAgICAgICAgICAnQ2FsbHNcbicKKyAgICAgICAgICAnKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSAqZnVuY3Rpb24qKSB3aXRoIGEgJworICAgICAgICAgICdwb3NzaWJseVxuJworICAgICAgICAgICdlbXB0eSBzZXJpZXMgb2YgKmFyZ3VtZW50cyo6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjYWxsICAgICAgICAgICAgICAgICA6Oj0gcHJpbWFyeSAiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl0gfCAnCisgICAgICAgICAgJ2NvbXByZWhlbnNpb25dICIpIlxuJworICAgICAgICAgICcgICBhcmd1bWVudF9saXN0ICAgICAgICA6Oj0gcG9zaXRpb25hbF9hcmd1bWVudHMgWyIsIiAnCisgICAgICAgICAgJ3N0YXJyZWRfYW5kX2tleXdvcmRzXVxuJworICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgIFsiLCIga2V5d29yZHNfYXJndW1lbnRzXVxuJworICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IHN0YXJyZWRfYW5kX2tleXdvcmRzIFsiLCIgJworICAgICAgICAgICdrZXl3b3Jkc19hcmd1bWVudHNdXG4nCisgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwga2V5d29yZHNfYXJndW1lbnRzXG4nCisgICAgICAgICAgJyAgIHBvc2l0aW9uYWxfYXJndW1lbnRzIDo6PSBbIioiXSBleHByZXNzaW9uICgiLCIgWyIqIl0gJworICAgICAgICAgICdleHByZXNzaW9uKSpcbicKKyAgICAgICAgICAnICAgc3RhcnJlZF9hbmRfa2V5d29yZHMgOjo9ICgiKiIgZXhwcmVzc2lvbiB8IGtleXdvcmRfaXRlbSlcbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgIioiIGV4cHJlc3Npb24gfCAiLCIgJworICAgICAgICAgICdrZXl3b3JkX2l0ZW0pKlxuJworICAgICAgICAgICcgICBrZXl3b3Jkc19hcmd1bWVudHMgICA6Oj0gKGtleXdvcmRfaXRlbSB8ICIqKiIgZXhwcmVzc2lvbilcbicKKyAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGtleXdvcmRfaXRlbSB8ICIqKiIgZXhwcmVzc2lvbikqXG4nCisgICAgICAgICAgJyAgIGtleXdvcmRfaXRlbSAgICAgICAgIDo6PSBpZGVudGlmaWVyICI9IiBleHByZXNzaW9uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBbiBvcHRpb25hbCB0cmFpbGluZyBjb21tYSBtYXkgYmUgcHJlc2VudCBhZnRlciB0aGUgcG9zaXRpb25hbCBhbmRcbicKKyAgICAgICAgICAna2V5d29yZCBhcmd1bWVudHMgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGUgc2VtYW50aWNzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhIGNhbGxhYmxlIG9iamVjdCAodXNlci1kZWZpbmVkXG4nCisgICAgICAgICAgJ2Z1bmN0aW9ucywgYnVpbHQtaW4gZnVuY3Rpb25zLCBtZXRob2RzIG9mIGJ1aWx0LWluIG9iamVjdHMsIGNsYXNzXG4nCisgICAgICAgICAgJ29iamVjdHMsIG1ldGhvZHMgb2YgY2xhc3MgaW5zdGFuY2VzLCBhbmQgYWxsIG9iamVjdHMgaGF2aW5nIGFcbicKKyAgICAgICAgICAnIl9fY2FsbF9fKCkiIG1ldGhvZCBhcmUgY2FsbGFibGUpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZVxuJworICAgICAgICAgICdldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsIGlzIGF0dGVtcHRlZC4gIFBsZWFzZSByZWZlciB0byBzZWN0aW9uXG4nCisgICAgICAgICAgJ0Z1bmN0aW9uIGRlZmluaXRpb25zIGZvciB0aGUgc3ludGF4IG9mIGZvcm1hbCAqcGFyYW1ldGVyKiBsaXN0cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG9cbicKKyAgICAgICAgICAncG9zaXRpb25hbCBhcmd1bWVudHMsIGFzIGZvbGxvd3MuICBGaXJzdCwgYSBsaXN0IG9mIHVuZmlsbGVkIHNsb3RzICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnY3JlYXRlZCBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgdGhlcmUgYXJlIE4gcG9zaXRpb25hbFxuJworICAgICAgICAgICdhcmd1bWVudHMsIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgZmlyc3QgTiBzbG90cy4gIE5leHQsIGZvciBlYWNoXG4nCisgICAgICAgICAgJ2tleXdvcmQgYXJndW1lbnQsIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZVxuJworICAgICAgICAgICdjb3JyZXNwb25kaW5nIHNsb3QgKGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCAnCisgICAgICAgICAgJ2Zvcm1hbFxuJworICAgICAgICAgICdwYXJhbWV0ZXIgbmFtZSwgdGhlIGZpcnN0IHNsb3QgaXMgdXNlZCwgYW5kIHNvIG9uKS4gIElmIHRoZSBzbG90ICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnYWxyZWFkeSBmaWxsZWQsIGEgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGVcbicKKyAgICAgICAgICAndmFsdWUgb2YgdGhlIGFyZ3VtZW50IGlzIHBsYWNlZCBpbiB0aGUgc2xvdCwgZmlsbGluZyBpdCAoZXZlbiBpZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICdleHByZXNzaW9uIGlzICJOb25lIiwgaXQgZmlsbHMgdGhlIHNsb3QpLiAgV2hlbiBhbGwgYXJndW1lbnRzIGhhdmVcbicKKyAgICAgICAgICAnYmVlbiBwcm9jZXNzZWQsIHRoZSBzbG90cyB0aGF0IGFyZSBzdGlsbCB1bmZpbGxlZCBhcmUgZmlsbGVkIHdpdGggJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnY29ycmVzcG9uZGluZyBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICAnCisgICAgICAgICAgJyhEZWZhdWx0XG4nCisgICAgICAgICAgJ3ZhbHVlcyBhcmUgY2FsY3VsYXRlZCwgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZDsgdGh1cywgYVxuJworICAgICAgICAgICdtdXRhYmxlIG9iamVjdCBzdWNoIGFzIGEgbGlzdCBvciBkaWN0aW9uYXJ5IHVzZWQgYXMgZGVmYXVsdCB2YWx1ZSAnCisgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAiYmUgc2hhcmVkIGJ5IGFsbCBjYWxscyB0aGF0IGRvbid0IHNwZWNpZnkgYW4gYXJndW1lbnQgdmFsdWUgZm9yICIKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ2NvcnJlc3BvbmRpbmcgc2xvdDsgdGhpcyBzaG91bGQgdXN1YWxseSBiZSBhdm9pZGVkLikgIElmIHRoZXJlIGFyZSAnCisgICAgICAgICAgJ2FueVxuJworICAgICAgICAgICd1bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGEgJworICAgICAgICAgICciVHlwZUVycm9yIlxuJworICAgICAgICAgICdleGNlcHRpb24gaXMgcmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBvZiBmaWxsZWQgc2xvdHMgaXMgdXNlZCAnCisgICAgICAgICAgJ2FzXG4nCisgICAgICAgICAgJ3RoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgY2FsbC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGVcbicKKyAgICAgICAgICAnYnVpbHQtaW4gZnVuY3Rpb25zIHdob3NlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBuYW1lcywgJworICAgICAgICAgICdldmVuXG4nCisgICAgICAgICAgImlmIHRoZXkgYXJlICduYW1lZCcgZm9yIHRoZSBwdXJwb3NlIG9mIGRvY3VtZW50YXRpb24sIGFuZCB3aGljaFxuIgorICAgICAgICAgICd0aGVyZWZvcmUgY2Fubm90IGJlIHN1cHBsaWVkIGJ5IGtleXdvcmQuICBJbiBDUHl0aG9uLCB0aGlzIGlzIHRoZSAnCisgICAgICAgICAgJ2Nhc2VcbicKKyAgICAgICAgICAnZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlICJQeUFyZ19QYXJzZVR1cGxlKCkiIHRvICcKKyAgICAgICAgICAncGFyc2VcbicKKyAgICAgICAgICAndGhlaXIgYXJndW1lbnRzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgdGhlcmUgYXJlIG1vcmUgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aGVyZSBhcmUgZm9ybWFsICcKKyAgICAgICAgICAncGFyYW1ldGVyXG4nCisgICAgICAgICAgJ3Nsb3RzLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCAnCisgICAgICAgICAgJ3BhcmFtZXRlclxuJworICAgICAgICAgICd1c2luZyB0aGUgc3ludGF4ICIqaWRlbnRpZmllciIgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0ICcKKyAgICAgICAgICAnZm9ybWFsXG4nCisgICAgICAgICAgJ3BhcmFtZXRlciByZWNlaXZlcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBwb3NpdGlvbmFsICcKKyAgICAgICAgICAnYXJndW1lbnRzXG4nCisgICAgICAgICAgJyhvciBhbiBlbXB0eSB0dXBsZSBpZiB0aGVyZSB3ZXJlIG5vIGV4Y2VzcyBwb3NpdGlvbmFsIGFyZ3VtZW50cykuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiBhbnkga2V5d29yZCBhcmd1bWVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlclxuJworICAgICAgICAgICduYW1lLCBhICJUeXBlRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbicKKyAgICAgICAgICAndXNpbmcgdGhlIHN5bnRheCAiKippZGVudGlmaWVyIiBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgJworICAgICAgICAgICdmb3JtYWxcbicKKyAgICAgICAgICAncGFyYW1ldGVyIHJlY2VpdmVzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBleGNlc3Mga2V5d29yZFxuJworICAgICAgICAgICdhcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQgdmFsdWVzIGFzXG4nCisgICAgICAgICAgJ2NvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb3IgYSAobmV3KSBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZXJlIHdlcmUgJworICAgICAgICAgICdub1xuJworICAgICAgICAgICdleGNlc3Mga2V5d29yZCBhcmd1bWVudHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdJZiB0aGUgc3ludGF4ICIqZXhwcmVzc2lvbiIgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCwgJworICAgICAgICAgICciZXhwcmVzc2lvbiJcbicKKyAgICAgICAgICAnbXVzdCBldmFsdWF0ZSB0byBhbiAqaXRlcmFibGUqLiAgRWxlbWVudHMgZnJvbSB0aGVzZSBpdGVyYWJsZXMgYXJlXG4nCisgICAgICAgICAgJ3RyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIGFkZGl0aW9uYWwgcG9zaXRpb25hbCBhcmd1bWVudHMuICBGb3IgdGhlICcKKyAgICAgICAgICAnY2FsbFxuJworICAgICAgICAgICciZih4MSwgeDIsICp5LCB4MywgeDQpIiwgaWYgKnkqIGV2YWx1YXRlcyB0byBhIHNlcXVlbmNlICp5MSosIC4uLixcbicKKyAgICAgICAgICAnKnlNKiwgdGhpcyBpcyBlcXVpdmFsZW50IHRvIGEgY2FsbCB3aXRoIE0rNCBwb3NpdGlvbmFsIGFyZ3VtZW50cyAnCisgICAgICAgICAgJyp4MSosXG4nCisgICAgICAgICAgJyp4MiosICp5MSosIC4uLiwgKnlNKiwgKngzKiwgKng0Ki5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgY29uc2VxdWVuY2Ugb2YgdGhpcyBpcyB0aGF0IGFsdGhvdWdoIHRoZSAiKmV4cHJlc3Npb24iIHN5bnRheCAnCisgICAgICAgICAgJ21heVxuJworICAgICAgICAgICdhcHBlYXIgKmFmdGVyKiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50cywgaXQgaXMgcHJvY2Vzc2VkICcKKyAgICAgICAgICAnKmJlZm9yZSpcbicKKyAgICAgICAgICAndGhlIGtleXdvcmQgYXJndW1lbnRzIChhbmQgYW55ICIqKmV4cHJlc3Npb24iIGFyZ3VtZW50cyAtLSBzZWUgJworICAgICAgICAgICdiZWxvdykuXG4nCisgICAgICAgICAgJ1NvOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgPj4+IGRlZiBmKGEsIGIpOlxuJworICAgICAgICAgICcgICAuLi4gICAgIHByaW50KGEsIGIpXG4nCisgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICcgICA+Pj4gZihiPTEsICooMiwpKVxuJworICAgICAgICAgICcgICAyIDFcbicKKyAgICAgICAgICAnICAgPj4+IGYoYT0xLCAqKDIsKSlcbicKKyAgICAgICAgICAnICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbicKKyAgICAgICAgICAiICAgVHlwZUVycm9yOiBmKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCAnYSdcbiIKKyAgICAgICAgICAnICAgPj4+IGYoMSwgKigyLCkpXG4nCisgICAgICAgICAgJyAgIDEgMlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSXQgaXMgdW51c3VhbCBmb3IgYm90aCBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlICIqZXhwcmVzc2lvbiIgJworICAgICAgICAgICdzeW50YXhcbicKKyAgICAgICAgICAndG8gYmUgdXNlZCBpbiB0aGUgc2FtZSBjYWxsLCBzbyBpbiBwcmFjdGljZSB0aGlzIGNvbmZ1c2lvbiBkb2VzICcKKyAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgJ2FyaXNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgdGhlIHN5bnRheCAiKipleHByZXNzaW9uIiBhcHBlYXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLFxuJworICAgICAgICAgICciZXhwcmVzc2lvbiIgbXVzdCBldmFsdWF0ZSB0byBhICptYXBwaW5nKiwgdGhlIGNvbnRlbnRzIG9mIHdoaWNoICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJ3RyZWF0ZWQgYXMgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy4gIElmIGEga2V5d29yZCBpcyBhbHJlYWR5XG4nCisgICAgICAgICAgJ3ByZXNlbnQgKGFzIGFuIGV4cGxpY2l0IGtleXdvcmQgYXJndW1lbnQsIG9yIGZyb20gYW5vdGhlciAnCisgICAgICAgICAgJ3VucGFja2luZyksXG4nCisgICAgICAgICAgJ2EgIlR5cGVFcnJvciIgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0Zvcm1hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzeW50YXggIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIlxuJworICAgICAgICAgICdjYW5ub3QgYmUgdXNlZCBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IHNsb3RzIG9yIGFzIGtleXdvcmQgYXJndW1lbnRcbicKKyAgICAgICAgICAnbmFtZXMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy41OiBGdW5jdGlvbiBjYWxscyBhY2NlcHQgYW55IG51bWJlciBvZiAiKiIgJworICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAnIioqIiB1bnBhY2tpbmdzLCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBtYXkgZm9sbG93IGl0ZXJhYmxlICcKKyAgICAgICAgICAndW5wYWNraW5nc1xuJworICAgICAgICAgICcoIioiKSwgYW5kIGtleXdvcmQgYXJndW1lbnRzIG1heSBmb2xsb3cgZGljdGlvbmFyeSB1bnBhY2tpbmdzICcKKyAgICAgICAgICAnKCIqKiIpLlxuJworICAgICAgICAgICdPcmlnaW5hbGx5IHByb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSBjYWxsIGFsd2F5cyByZXR1cm5zIHNvbWUgdmFsdWUsIHBvc3NpYmx5ICJOb25lIiwgdW5sZXNzIGl0IHJhaXNlcyAnCisgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgJ2V4Y2VwdGlvbi4gIEhvdyB0aGlzIHZhbHVlIGlzIGNvbXB1dGVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlXG4nCisgICAgICAgICAgJ2NhbGxhYmxlIG9iamVjdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0lmIGl0IGlzLS0tXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhIHVzZXItZGVmaW5lZCBmdW5jdGlvbjpcbicKKyAgICAgICAgICAnICAgVGhlIGNvZGUgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCwgcGFzc2luZyBpdCB0aGVcbicKKyAgICAgICAgICAnICAgYXJndW1lbnQgbGlzdC4gIFRoZSBmaXJzdCB0aGluZyB0aGUgY29kZSBibG9jayB3aWxsIGRvIGlzIGJpbmQgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgZm9ybWFsIHBhcmFtZXRlcnMgdG8gdGhlIGFyZ3VtZW50czsgdGhpcyBpcyBkZXNjcmliZWQgaW4gJworICAgICAgICAgICdzZWN0aW9uXG4nCisgICAgICAgICAgJyAgIEZ1bmN0aW9uIGRlZmluaXRpb25zLiAgV2hlbiB0aGUgY29kZSBibG9jayBleGVjdXRlcyBhICJyZXR1cm4iXG4nCisgICAgICAgICAgJyAgIHN0YXRlbWVudCwgdGhpcyBzcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gJworICAgICAgICAgICdjYWxsLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYSBidWlsdC1pbiBmdW5jdGlvbiBvciBtZXRob2Q6XG4nCisgICAgICAgICAgJyAgIFRoZSByZXN1bHQgaXMgdXAgdG8gdGhlIGludGVycHJldGVyOyBzZWUgQnVpbHQtaW4gRnVuY3Rpb25zIGZvciAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBkZXNjcmlwdGlvbnMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZXRob2RzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYSBjbGFzcyBvYmplY3Q6XG4nCisgICAgICAgICAgJyAgIEEgbmV3IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgaXMgcmV0dXJuZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdhIGNsYXNzIGluc3RhbmNlIG1ldGhvZDpcbicKKyAgICAgICAgICAnICAgVGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2l0aCBhbiAnCisgICAgICAgICAgJ2FyZ3VtZW50XG4nCisgICAgICAgICAgJyAgIGxpc3QgdGhhdCBpcyBvbmUgbG9uZ2VyIHRoYW4gdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGNhbGw6IHRoZVxuJworICAgICAgICAgICcgICBpbnN0YW5jZSBiZWNvbWVzIHRoZSBmaXJzdCBhcmd1bWVudC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ2EgY2xhc3MgaW5zdGFuY2U6XG4nCisgICAgICAgICAgJyAgIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhICJfX2NhbGxfXygpIiBtZXRob2Q7IHRoZSBlZmZlY3QgaXMgdGhlbiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBzYW1lIGFzIGlmIHRoYXQgbWV0aG9kIHdhcyBjYWxsZWQuXG4nLAorICdjbGFzcyc6ICdcbicKKyAgICAgICAgICAnQ2xhc3MgZGVmaW5pdGlvbnNcbicKKyAgICAgICAgICAnKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiBUaGUgJworICAgICAgICAgICdzdGFuZGFyZFxuJworICAgICAgICAgICd0eXBlIGhpZXJhcmNoeSk6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBjbGFzc2RlZiAgICA6Oj0gW2RlY29yYXRvcnNdICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiICcKKyAgICAgICAgICAnc3VpdGVcbicKKyAgICAgICAgICAnICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbYXJndW1lbnRfbGlzdF0gIikiXG4nCisgICAgICAgICAgJyAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBUaGUgaW5oZXJpdGFuY2UgJworICAgICAgICAgICdsaXN0XG4nCisgICAgICAgICAgJ3VzdWFsbHkgZ2l2ZXMgYSBsaXN0IG9mIGJhc2UgY2xhc3NlcyAoc2VlIEN1c3RvbWl6aW5nIGNsYXNzICcKKyAgICAgICAgICAnY3JlYXRpb25cbicKKyAgICAgICAgICAnZm9yIG1vcmUgYWR2YW5jZWQgdXNlcyksIHNvIGVhY2ggaXRlbSBpbiB0aGUgbGlzdCBzaG91bGQgZXZhbHVhdGUgJworICAgICAgICAgICd0byBhXG4nCisgICAgICAgICAgJ2NsYXNzIG9iamVjdCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NpbmcuICBDbGFzc2VzIHdpdGhvdXQgYW4gJworICAgICAgICAgICdpbmhlcml0YW5jZVxuJworICAgICAgICAgICdsaXN0IGluaGVyaXQsIGJ5IGRlZmF1bHQsIGZyb20gdGhlIGJhc2UgY2xhc3MgIm9iamVjdCI7IGhlbmNlLFxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgY2xhc3MgRm9vOlxuJworICAgICAgICAgICcgICAgICAgcGFzc1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgY2xhc3MgRm9vKG9iamVjdCk6XG4nCisgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICJUaGUgY2xhc3MncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvbiBmcmFtZSAoc2VlXG4iCisgICAgICAgICAgJ05hbWluZyBhbmQgYmluZGluZyksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kIHRoZVxuJworICAgICAgICAgICdvcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlIGNvbnRhaW5zIG1vc3RseVxuJworICAgICAgICAgICJmdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzcydzIHN1aXRlIGZpbmlzaGVzIGV4ZWN1dGlvbiwgIgorICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAnZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpcyBzYXZlZC4gWzRdICcKKyAgICAgICAgICAnQVxuJworICAgICAgICAgICdjbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0IGZvciB0aGUgJworICAgICAgICAgICdiYXNlXG4nCisgICAgICAgICAgJ2NsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICdkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICdUaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGUgb3JpZ2luYWwgbG9jYWxcbicKKyAgICAgICAgICAnbmFtZXNwYWNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQ2xhc3MgY3JlYXRpb24gY2FuIGJlIGN1c3RvbWl6ZWQgaGVhdmlseSB1c2luZyBtZXRhY2xhc3Nlcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0NsYXNzZXMgY2FuIGFsc28gYmUgZGVjb3JhdGVkOiBqdXN0IGxpa2Ugd2hlbiBkZWNvcmF0aW5nICcKKyAgICAgICAgICAnZnVuY3Rpb25zLFxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQGYxKGFyZylcbicKKyAgICAgICAgICAnICAgQGYyXG4nCisgICAgICAgICAgJyAgIGNsYXNzIEZvbzogcGFzc1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgY2xhc3MgRm9vOiBwYXNzXG4nCisgICAgICAgICAgJyAgIEZvbyA9IGYxKGFyZykoZjIoRm9vKSlcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyAnCisgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICdmdW5jdGlvbiBkZWNvcmF0b3JzLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Mgb2JqZWN0LCB3aGljaCBpcyAnCisgICAgICAgICAgJ3RoZW5cbicKKyAgICAgICAgICAnYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICIqKlByb2dyYW1tZXIncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uICIKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJ2NsYXNzIGF0dHJpYnV0ZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBpbnN0YW5jZXMuICBJbnN0YW5jZSAnCisgICAgICAgICAgJ2F0dHJpYnV0ZXNcbicKKyAgICAgICAgICAnY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoICJzZWxmLm5hbWUgPSB2YWx1ZSIuICBCb3RoIGNsYXNzIGFuZFxuJworICAgICAgICAgICdpbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uICcKKyAgICAgICAgICAnIiJzZWxmLm5hbWUiIixcbicKKyAgICAgICAgICAnYW5kIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBoaWRlcyBhIGNsYXNzIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lICcKKyAgICAgICAgICAnbmFtZVxuJworICAgICAgICAgICd3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyAnCisgICAgICAgICAgJ2RlZmF1bHRzXG4nCisgICAgICAgICAgJ2ZvciBpbnN0YW5jZSBhdHRyaWJ1dGVzLCBidXQgdXNpbmcgbXV0YWJsZSB2YWx1ZXMgdGhlcmUgY2FuIGxlYWQgJworICAgICAgICAgICd0b1xuJworICAgICAgICAgICd1bmV4cGVjdGVkIHJlc3VsdHMuICBEZXNjcmlwdG9ycyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VcbicKKyAgICAgICAgICAndmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdTZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMgKipQRVAgMzEyOSoqIC1cbicKKyAgICAgICAgICAnICBDbGFzcyBEZWNvcmF0b3JzXG4nLAorICdjb21wYXJpc29ucyc6ICdcbicKKyAgICAgICAgICAgICAgICAnQ29tcGFyaXNvbnNcbicKKyAgICAgICAgICAgICAgICAnKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1VubGlrZSBDLCBhbGwgY29tcGFyaXNvbiBvcGVyYXRpb25zIGluIFB5dGhvbiBoYXZlIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAgICAncHJpb3JpdHksXG4nCisgICAgICAgICAgICAgICAgJ3doaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgJworICAgICAgICAgICAgICAgICdiaXR3aXNlXG4nCisgICAgICAgICAgICAgICAgJ29wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgImEgPCBiIDwgYyIgaGF2ZSAnCisgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICdpbnRlcnByZXRhdGlvbiB0aGF0IGlzIGNvbnZlbnRpb25hbCBpbiBtYXRoZW1hdGljczpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbicKKyAgICAgICAgICAgICAgICAnICAgY29tcF9vcGVyYXRvciA6Oj0gIjwiIHwgIj4iIHwgIj09IiB8ICI+PSIgfCAiPD0iIHwgIiE9IlxuJworICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQ29tcGFyaXNvbnMgeWllbGQgYm9vbGVhbiB2YWx1ZXM6ICJUcnVlIiBvciAiRmFsc2UiLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sICJ4IDwgeSA8PSB6IiAnCisgICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAgJ2VxdWl2YWxlbnQgdG8gInggPCB5IGFuZCB5IDw9IHoiLCBleGNlcHQgdGhhdCAieSIgaXMgJworICAgICAgICAgICAgICAgICdldmFsdWF0ZWQgb25seVxuJworICAgICAgICAgICAgICAgICdvbmNlIChidXQgaW4gYm90aCBjYXNlcyAieiIgaXMgbm90IGV2YWx1YXRlZCBhdCBhbGwgd2hlbiAieCA8ICcKKyAgICAgICAgICAgICAgICAneSIgaXNcbicKKyAgICAgICAgICAgICAgICAnZm91bmQgdG8gYmUgZmFsc2UpLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnRm9ybWFsbHksIGlmICphKiwgKmIqLCAqYyosIC4uLiwgKnkqLCAqeiogYXJlIGV4cHJlc3Npb25zIGFuZCAnCisgICAgICAgICAgICAgICAgJypvcDEqLFxuJworICAgICAgICAgICAgICAgICcqb3AyKiwgLi4uLCAqb3BOKiBhcmUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIHRoZW4gImEgb3AxIGIgb3AyICcKKyAgICAgICAgICAgICAgICAnYyAuLi4geVxuJworICAgICAgICAgICAgICAgICdvcE4geiIgaXMgZXF1aXZhbGVudCB0byAiYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOICcKKyAgICAgICAgICAgICAgICAneiIsIGV4Y2VwdFxuJworICAgICAgICAgICAgICAgICd0aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnTm90ZSB0aGF0ICJhIG9wMSBiIG9wMiBjIiBkb2VzblwndCBpbXBseSBhbnkga2luZCBvZiAnCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gYmV0d2VlblxuJworICAgICAgICAgICAgICAgICcqYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgInggPCB5ID4geiIgaXMgcGVyZmVjdGx5IGxlZ2FsICcKKyAgICAgICAgICAgICAgICAnKHRob3VnaFxuJworICAgICAgICAgICAgICAgICdwZXJoYXBzIG5vdCBwcmV0dHkpLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1ZhbHVlIGNvbXBhcmlzb25zXG4nCisgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgb3BlcmF0b3JzICI8IiwgIj4iLCAiPT0iLCAiPj0iLCAiPD0iLCBhbmQgIiE9IiBjb21wYXJlICcKKyAgICAgICAgICAgICAgICAndGhlIHZhbHVlc1xuJworICAgICAgICAgICAgICAgICdvZiB0d28gb2JqZWN0cy4gIFRoZSBvYmplY3RzIGRvIG5vdCBuZWVkIHRvIGhhdmUgdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICd0eXBlLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQ2hhcHRlciBPYmplY3RzLCB2YWx1ZXMgYW5kIHR5cGVzIHN0YXRlcyB0aGF0IG9iamVjdHMgaGF2ZSBhICcKKyAgICAgICAgICAgICAgICAndmFsdWUgKGluXG4nCisgICAgICAgICAgICAgICAgJ2FkZGl0aW9uIHRvIHR5cGUgYW5kIGlkZW50aXR5KS4gIFRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaXMgYSAnCisgICAgICAgICAgICAgICAgJ3JhdGhlclxuJworICAgICAgICAgICAgICAgICdhYnN0cmFjdCBub3Rpb24gaW4gUHl0aG9uOiBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgbm8gY2Fub25pY2FsICcKKyAgICAgICAgICAgICAgICAnYWNjZXNzXG4nCisgICAgICAgICAgICAgICAgIm1ldGhvZCBmb3IgYW4gb2JqZWN0J3MgdmFsdWUuICBBbHNvLCB0aGVyZSBpcyBubyByZXF1aXJlbWVudCAiCisgICAgICAgICAgICAgICAgJ3RoYXQgdGhlXG4nCisgICAgICAgICAgICAgICAgJ3ZhbHVlIG9mIGFuIG9iamVjdCBzaG91bGQgYmUgY29uc3RydWN0ZWQgaW4gYSBwYXJ0aWN1bGFyIHdheSwgJworICAgICAgICAgICAgICAgICdlLmcuXG4nCisgICAgICAgICAgICAgICAgJ2NvbXByaXNlZCBvZiBhbGwgaXRzIGRhdGEgYXR0cmlidXRlcy4gQ29tcGFyaXNvbiBvcGVyYXRvcnMgJworICAgICAgICAgICAgICAgICdpbXBsZW1lbnQgYVxuJworICAgICAgICAgICAgICAgICdwYXJ0aWN1bGFyIG5vdGlvbiBvZiB3aGF0IHRoZSB2YWx1ZSBvZiBhbiBvYmplY3QgaXMuICBPbmUgY2FuICcKKyAgICAgICAgICAgICAgICAndGhpbmsgb2ZcbicKKyAgICAgICAgICAgICAgICAndGhlbSBhcyBkZWZpbmluZyB0aGUgdmFsdWUgb2YgYW4gb2JqZWN0IGluZGlyZWN0bHksIGJ5IG1lYW5zICcKKyAgICAgICAgICAgICAgICAnb2YgdGhlaXJcbicKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBpbXBsZW1lbnRhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0JlY2F1c2UgYWxsIHR5cGVzIGFyZSAoZGlyZWN0IG9yIGluZGlyZWN0KSBzdWJ0eXBlcyBvZiAnCisgICAgICAgICAgICAgICAgJyJvYmplY3QiLCB0aGV5XG4nCisgICAgICAgICAgICAgICAgJ2luaGVyaXQgdGhlIGRlZmF1bHQgY29tcGFyaXNvbiBiZWhhdmlvciBmcm9tICJvYmplY3QiLiAgVHlwZXMgJworICAgICAgICAgICAgICAgICdjYW5cbicKKyAgICAgICAgICAgICAgICAnY3VzdG9taXplIHRoZWlyIGNvbXBhcmlzb24gYmVoYXZpb3IgYnkgaW1wbGVtZW50aW5nICpyaWNoICcKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvblxuJworICAgICAgICAgICAgICAgICdtZXRob2RzKiBsaWtlICJfX2x0X18oKSIsIGRlc2NyaWJlZCBpbiBCYXNpYyBjdXN0b21pemF0aW9uLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb24gKCI9PSIgYW5kICIhPSIpICcKKyAgICAgICAgICAgICAgICAnaXMgYmFzZWRcbicKKyAgICAgICAgICAgICAgICAnb24gdGhlIGlkZW50aXR5IG9mIHRoZSBvYmplY3RzLiAgSGVuY2UsIGVxdWFsaXR5IGNvbXBhcmlzb24gJworICAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgICdpbnN0YW5jZXMgd2l0aCB0aGUgc2FtZSBpZGVudGl0eSByZXN1bHRzIGluIGVxdWFsaXR5LCBhbmQgJworICAgICAgICAgICAgICAgICdlcXVhbGl0eVxuJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uIG9mIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBpZGVudGl0aWVzIHJlc3VsdHMgaW5cbicKKyAgICAgICAgICAgICAgICAnaW5lcXVhbGl0eS4gIEEgbW90aXZhdGlvbiBmb3IgdGhpcyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRoZSAnCisgICAgICAgICAgICAgICAgJ2Rlc2lyZSB0aGF0XG4nCisgICAgICAgICAgICAgICAgJ2FsbCBvYmplY3RzIHNob3VsZCBiZSByZWZsZXhpdmUgKGkuZS4gInggaXMgeSIgaW1wbGllcyAieCA9PSAnCisgICAgICAgICAgICAgICAgJ3kiKS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0EgZGVmYXVsdCBvcmRlciBjb21wYXJpc29uICgiPCIsICI+IiwgIjw9IiwgYW5kICI+PSIpIGlzIG5vdCAnCisgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkO1xuJworICAgICAgICAgICAgICAgICdhbiBhdHRlbXB0IHJhaXNlcyAiVHlwZUVycm9yIi4gIEEgbW90aXZhdGlvbiBmb3IgdGhpcyBkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAnYmVoYXZpb3JcbicKKyAgICAgICAgICAgICAgICAnaXMgdGhlIGxhY2sgb2YgYSBzaW1pbGFyIGludmFyaWFudCBhcyBmb3IgZXF1YWxpdHkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdUaGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgZXF1YWxpdHkgY29tcGFyaXNvbiwgdGhhdCAnCisgICAgICAgICAgICAgICAgJ2luc3RhbmNlcyB3aXRoXG4nCisgICAgICAgICAgICAgICAgJ2RpZmZlcmVudCBpZGVudGl0aWVzIGFyZSBhbHdheXMgdW5lcXVhbCwgbWF5IGJlIGluIGNvbnRyYXN0ICcKKyAgICAgICAgICAgICAgICAndG8gd2hhdFxuJworICAgICAgICAgICAgICAgICd0eXBlcyB3aWxsIG5lZWQgdGhhdCBoYXZlIGEgc2Vuc2libGUgZGVmaW5pdGlvbiBvZiBvYmplY3QgJworICAgICAgICAgICAgICAgICd2YWx1ZSBhbmRcbicKKyAgICAgICAgICAgICAgICAndmFsdWUtYmFzZWQgZXF1YWxpdHkuICBTdWNoIHR5cGVzIHdpbGwgbmVlZCB0byBjdXN0b21pemUgJworICAgICAgICAgICAgICAgICd0aGVpclxuJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uIGJlaGF2aW9yLCBhbmQgaW4gZmFjdCwgYSBudW1iZXIgb2YgYnVpbHQtaW4gdHlwZXMgJworICAgICAgICAgICAgICAgICdoYXZlIGRvbmVcbicKKyAgICAgICAgICAgICAgICAndGhhdC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbGlzdCBkZXNjcmliZXMgdGhlIGNvbXBhcmlzb24gYmVoYXZpb3Igb2YgdGhlICcKKyAgICAgICAgICAgICAgICAnbW9zdFxuJworICAgICAgICAgICAgICAgICdpbXBvcnRhbnQgYnVpbHQtaW4gdHlwZXMuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIE51bWJlcnMgb2YgYnVpbHQtaW4gbnVtZXJpYyB0eXBlcyAoTnVtZXJpYyBUeXBlcyAtLS0gaW50LCAnCisgICAgICAgICAgICAgICAgJ2Zsb2F0LFxuJworICAgICAgICAgICAgICAgICcgIGNvbXBsZXgpIGFuZCBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSB0eXBlcyAnCisgICAgICAgICAgICAgICAgJyJmcmFjdGlvbnMuRnJhY3Rpb24iIGFuZFxuJworICAgICAgICAgICAgICAgICcgICJkZWNpbWFsLkRlY2ltYWwiIGNhbiBiZSBjb21wYXJlZCB3aXRoaW4gYW5kIGFjcm9zcyB0aGVpciAnCisgICAgICAgICAgICAgICAgJ3R5cGVzLFxuJworICAgICAgICAgICAgICAgICcgIHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXQgY29tcGxleCBudW1iZXJzIGRvIG5vdCBzdXBwb3J0ICcKKyAgICAgICAgICAgICAgICAnb3JkZXJcbicKKyAgICAgICAgICAgICAgICAnICBjb21wYXJpc29uLiAgV2l0aGluIHRoZSBsaW1pdHMgb2YgdGhlIHR5cGVzIGludm9sdmVkLCB0aGV5ICcKKyAgICAgICAgICAgICAgICAnY29tcGFyZVxuJworICAgICAgICAgICAgICAgICcgIG1hdGhlbWF0aWNhbGx5IChhbGdvcml0aG1pY2FsbHkpIGNvcnJlY3Qgd2l0aG91dCBsb3NzIG9mICcKKyAgICAgICAgICAgICAgICAncHJlY2lzaW9uLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBUaGUgbm90LWEtbnVtYmVyIHZhbHVlcyAiZmxvYXQoXCdOYU5cJykiIGFuZCAnCisgICAgICAgICAgICAgICAgJyJEZWNpbWFsKFwnTmFOXCcpIiBhcmVcbicKKyAgICAgICAgICAgICAgICAnICBzcGVjaWFsLiAgVGhleSBhcmUgaWRlbnRpY2FsIHRvIHRoZW1zZWx2ZXMgKCJ4IGlzIHgiIGlzICcKKyAgICAgICAgICAgICAgICAndHJ1ZSkgYnV0XG4nCisgICAgICAgICAgICAgICAgJyAgYXJlIG5vdCBlcXVhbCB0byB0aGVtc2VsdmVzICgieCA9PSB4IiBpcyBmYWxzZSkuICAnCisgICAgICAgICAgICAgICAgJ0FkZGl0aW9uYWxseSxcbicKKyAgICAgICAgICAgICAgICAnICBjb21wYXJpbmcgYW55IG51bWJlciB0byBhIG5vdC1hLW51bWJlciB2YWx1ZSB3aWxsIHJldHVybiAnCisgICAgICAgICAgICAgICAgJyJGYWxzZSIuXG4nCisgICAgICAgICAgICAgICAgJyAgRm9yIGV4YW1wbGUsIGJvdGggIjMgPCBmbG9hdChcJ05hTlwnKSIgYW5kICJmbG9hdChcJ05hTlwnKSAnCisgICAgICAgICAgICAgICAgJzwgMyIgd2lsbFxuJworICAgICAgICAgICAgICAgICcgIHJldHVybiAiRmFsc2UiLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBCaW5hcnkgc2VxdWVuY2VzIChpbnN0YW5jZXMgb2YgImJ5dGVzIiBvciAiYnl0ZWFycmF5IikgY2FuICcKKyAgICAgICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgICAgICAnICBjb21wYXJlZCB3aXRoaW4gYW5kIGFjcm9zcyB0aGVpciB0eXBlcy4gIFRoZXkgY29tcGFyZVxuJworICAgICAgICAgICAgICAgICcgIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljIHZhbHVlcyBvZiB0aGVpciAnCisgICAgICAgICAgICAgICAgJ2VsZW1lbnRzLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBTdHJpbmdzIChpbnN0YW5jZXMgb2YgInN0ciIpIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgJworICAgICAgICAgICAgICAgICd1c2luZyB0aGVcbicKKyAgICAgICAgICAgICAgICAnICBudW1lcmljYWwgVW5pY29kZSBjb2RlIHBvaW50cyAodGhlIHJlc3VsdCBvZiB0aGUgYnVpbHQtaW4gJworICAgICAgICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICAgICAgICcgICJvcmQoKSIpIG9mIHRoZWlyIGNoYXJhY3RlcnMuIFszXVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICBTdHJpbmdzIGFuZCBiaW5hcnkgc2VxdWVuY2VzIGNhbm5vdCBiZSBkaXJlY3RseSBjb21wYXJlZC5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogU2VxdWVuY2VzIChpbnN0YW5jZXMgb2YgInR1cGxlIiwgImxpc3QiLCBvciAicmFuZ2UiKSBjYW4gJworICAgICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICAgICcgIGNvbXBhcmVkIG9ubHkgd2l0aGluIGVhY2ggb2YgdGhlaXIgdHlwZXMsIHdpdGggdGhlICcKKyAgICAgICAgICAgICAgICAncmVzdHJpY3Rpb24gdGhhdFxuJworICAgICAgICAgICAgICAgICcgIHJhbmdlcyBkbyBub3Qgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uLiAgRXF1YWxpdHkgJworICAgICAgICAgICAgICAgICdjb21wYXJpc29uIGFjcm9zc1xuJworICAgICAgICAgICAgICAgICcgIHRoZXNlIHR5cGVzIHJlc3VsdHMgaW4gdW5lcXVhbGl0eSwgYW5kIG9yZGVyaW5nIGNvbXBhcmlzb24gJworICAgICAgICAgICAgICAgICdhY3Jvc3NcbicKKyAgICAgICAgICAgICAgICAnICB0aGVzZSB0eXBlcyByYWlzZXMgIlR5cGVFcnJvciIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIFNlcXVlbmNlcyBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb24gb2ZcbicKKyAgICAgICAgICAgICAgICAnICBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLCB3aGVyZWJ5IHJlZmxleGl2aXR5IG9mIHRoZSBlbGVtZW50cyAnCisgICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAgJyAgZW5mb3JjZWQuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIEluIGVuZm9yY2luZyByZWZsZXhpdml0eSBvZiBlbGVtZW50cywgdGhlIGNvbXBhcmlzb24gb2YgJworICAgICAgICAgICAgICAgICdjb2xsZWN0aW9uc1xuJworICAgICAgICAgICAgICAgICcgIGFzc3VtZXMgdGhhdCBmb3IgYSBjb2xsZWN0aW9uIGVsZW1lbnQgIngiLCAieCA9PSB4IiBpcyAnCisgICAgICAgICAgICAgICAgJ2Fsd2F5cyB0cnVlLlxuJworICAgICAgICAgICAgICAgICcgIEJhc2VkIG9uIHRoYXQgYXNzdW1wdGlvbiwgZWxlbWVudCBpZGVudGl0eSBpcyBjb21wYXJlZCAnCisgICAgICAgICAgICAgICAgJ2ZpcnN0LCBhbmRcbicKKyAgICAgICAgICAgICAgICAnICBlbGVtZW50IGNvbXBhcmlzb24gaXMgcGVyZm9ybWVkIG9ubHkgZm9yIGRpc3RpbmN0ICcKKyAgICAgICAgICAgICAgICAnZWxlbWVudHMuICBUaGlzXG4nCisgICAgICAgICAgICAgICAgJyAgYXBwcm9hY2ggeWllbGRzIHRoZSBzYW1lIHJlc3VsdCBhcyBhIHN0cmljdCBlbGVtZW50ICcKKyAgICAgICAgICAgICAgICAnY29tcGFyaXNvblxuJworICAgICAgICAgICAgICAgICcgIHdvdWxkLCBpZiB0aGUgY29tcGFyZWQgZWxlbWVudHMgYXJlIHJlZmxleGl2ZS4gIEZvciAnCisgICAgICAgICAgICAgICAgJ25vbi1yZWZsZXhpdmVcbicKKyAgICAgICAgICAgICAgICAnICBlbGVtZW50cywgdGhlIHJlc3VsdCBpcyBkaWZmZXJlbnQgdGhhbiBmb3Igc3RyaWN0IGVsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAnICBjb21wYXJpc29uLCBhbmQgbWF5IGJlIHN1cnByaXNpbmc6ICBUaGUgbm9uLXJlZmxleGl2ZSAnCisgICAgICAgICAgICAgICAgJ25vdC1hLW51bWJlclxuJworICAgICAgICAgICAgICAgICcgIHZhbHVlcyBmb3IgZXhhbXBsZSByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBjb21wYXJpc29uICcKKyAgICAgICAgICAgICAgICAnYmVoYXZpb3Igd2hlblxuJworICAgICAgICAgICAgICAgICcgIHVzZWQgaW4gYSBsaXN0OlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAiICAgICA+Pj4gbmFuID0gZmxvYXQoJ05hTicpXG4iCisgICAgICAgICAgICAgICAgJyAgICAgPj4+IG5hbiBpcyBuYW5cbicKKyAgICAgICAgICAgICAgICAnICAgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgJyAgICAgPj4+IG5hbiA9PSBuYW5cbicKKyAgICAgICAgICAgICAgICAnICAgICBGYWxzZSAgICAgICAgICAgICAgICAgPC0tIHRoZSBkZWZpbmVkIG5vbi1yZWZsZXhpdmUgJworICAgICAgICAgICAgICAgICdiZWhhdmlvciBvZiBOYU5cbicKKyAgICAgICAgICAgICAgICAnICAgICA+Pj4gW25hbl0gPT0gW25hbl1cbicKKyAgICAgICAgICAgICAgICAnICAgICBUcnVlICAgICAgICAgICAgICAgICAgPC0tIGxpc3QgZW5mb3JjZXMgcmVmbGV4aXZpdHkgYW5kICcKKyAgICAgICAgICAgICAgICAndGVzdHMgaWRlbnRpdHkgZmlyc3RcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgTGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24gYmV0d2VlbiBidWlsdC1pbiBjb2xsZWN0aW9ucyAnCisgICAgICAgICAgICAgICAgJ3dvcmtzIGFzXG4nCisgICAgICAgICAgICAgICAgJyAgZm9sbG93czpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgKiBGb3IgdHdvIGNvbGxlY3Rpb25zIHRvIGNvbXBhcmUgZXF1YWwsIHRoZXkgbXVzdCBiZSBvZiB0aGUgJworICAgICAgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICAgICAgJyAgICB0eXBlLCBoYXZlIHRoZSBzYW1lIGxlbmd0aCwgYW5kIGVhY2ggcGFpciBvZiAnCisgICAgICAgICAgICAgICAgJ2NvcnJlc3BvbmRpbmdcbicKKyAgICAgICAgICAgICAgICAnICAgIGVsZW1lbnRzIG11c3QgY29tcGFyZSBlcXVhbCAoZm9yIGV4YW1wbGUsICJbMSwyXSA9PSAnCisgICAgICAgICAgICAgICAgJygxLDIpIiBpc1xuJworICAgICAgICAgICAgICAgICcgICAgZmFsc2UgYmVjYXVzZSB0aGUgdHlwZSBpcyBub3QgdGhlIHNhbWUpLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAqIENvbGxlY3Rpb25zIHRoYXQgc3VwcG9ydCBvcmRlciBjb21wYXJpc29uIGFyZSBvcmRlcmVkIHRoZSAnCisgICAgICAgICAgICAgICAgJ3NhbWVcbicKKyAgICAgICAgICAgICAgICAnICAgIGFzIHRoZWlyIGZpcnN0IHVuZXF1YWwgZWxlbWVudHMgKGZvciBleGFtcGxlLCAiWzEsMix4XSA8PSAnCisgICAgICAgICAgICAgICAgJ1sxLDIseV0iXG4nCisgICAgICAgICAgICAgICAgJyAgICBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgInggPD0geSIpLiAgSWYgYSBjb3JyZXNwb25kaW5nICcKKyAgICAgICAgICAgICAgICAnZWxlbWVudCBkb2VzXG4nCisgICAgICAgICAgICAgICAgJyAgICBub3QgZXhpc3QsIHRoZSBzaG9ydGVyIGNvbGxlY3Rpb24gaXMgb3JkZXJlZCBmaXJzdCAoZm9yICcKKyAgICAgICAgICAgICAgICAnZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAgICAnICAgICJbMSwyXSA8IFsxLDIsM10iIGlzIHRydWUpLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBNYXBwaW5ncyAoaW5zdGFuY2VzIG9mICJkaWN0IikgY29tcGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiAnCisgICAgICAgICAgICAgICAgJ3RoZXlcbicKKyAgICAgICAgICAgICAgICAnICBoYXZlIGVxdWFsICooa2V5LCB2YWx1ZSkqIHBhaXJzLiBFcXVhbGl0eSBjb21wYXJpc29uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgJ2tleXMgYW5kXG4nCisgICAgICAgICAgICAgICAgJyAgZWxlbWVudHMgZW5mb3JjZXMgcmVmbGV4aXZpdHkuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIE9yZGVyIGNvbXBhcmlzb25zICgiPCIsICI+IiwgIjw9IiwgYW5kICI+PSIpIHJhaXNlICcKKyAgICAgICAgICAgICAgICAnIlR5cGVFcnJvciIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIFNldHMgKGluc3RhbmNlcyBvZiAic2V0IiBvciAiZnJvemVuc2V0IikgY2FuIGJlIGNvbXBhcmVkICcKKyAgICAgICAgICAgICAgICAnd2l0aGluXG4nCisgICAgICAgICAgICAgICAgJyAgYW5kIGFjcm9zcyB0aGVpciB0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgVGhleSBkZWZpbmUgb3JkZXIgY29tcGFyaXNvbiBvcGVyYXRvcnMgdG8gbWVhbiBzdWJzZXQgYW5kICcKKyAgICAgICAgICAgICAgICAnc3VwZXJzZXRcbicKKyAgICAgICAgICAgICAgICAnICB0ZXN0cy4gIFRob3NlIHJlbGF0aW9ucyBkbyBub3QgZGVmaW5lIHRvdGFsIG9yZGVyaW5ncyAoZm9yICcKKyAgICAgICAgICAgICAgICAnZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAgICAnICB0aGUgdHdvIHNldHMgInsxLDJ9IiBhbmQgInsyLDN9IiBhcmUgbm90IGVxdWFsLCBub3Igc3Vic2V0cyAnCisgICAgICAgICAgICAgICAgJ29mIG9uZVxuJworICAgICAgICAgICAgICAgICcgIGFub3RoZXIsIG5vciBzdXBlcnNldHMgb2Ygb25lIGFub3RoZXIpLiAgQWNjb3JkaW5nbHksIHNldHMgJworICAgICAgICAgICAgICAgICdhcmUgbm90XG4nCisgICAgICAgICAgICAgICAgJyAgYXBwcm9wcmlhdGUgYXJndW1lbnRzIGZvciBmdW5jdGlvbnMgd2hpY2ggZGVwZW5kIG9uIHRvdGFsICcKKyAgICAgICAgICAgICAgICAnb3JkZXJpbmdcbicKKyAgICAgICAgICAgICAgICAnICAoZm9yIGV4YW1wbGUsICJtaW4oKSIsICJtYXgoKSIsIGFuZCAic29ydGVkKCkiIHByb2R1Y2UgJworICAgICAgICAgICAgICAgICd1bmRlZmluZWRcbicKKyAgICAgICAgICAgICAgICAnICByZXN1bHRzIGdpdmVuIGEgbGlzdCBvZiBzZXRzIGFzIGlucHV0cykuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgIENvbXBhcmlzb24gb2Ygc2V0cyBlbmZvcmNlcyByZWZsZXhpdml0eSBvZiBpdHMgZWxlbWVudHMuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIE1vc3Qgb3RoZXIgYnVpbHQtaW4gdHlwZXMgaGF2ZSBubyBjb21wYXJpc29uIG1ldGhvZHMgJworICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCxcbicKKyAgICAgICAgICAgICAgICAnICBzbyB0aGV5IGluaGVyaXQgdGhlIGRlZmF1bHQgY29tcGFyaXNvbiBiZWhhdmlvci5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1VzZXItZGVmaW5lZCBjbGFzc2VzIHRoYXQgY3VzdG9taXplIHRoZWlyIGNvbXBhcmlzb24gYmVoYXZpb3IgJworICAgICAgICAgICAgICAgICdzaG91bGRcbicKKyAgICAgICAgICAgICAgICAnZm9sbG93IHNvbWUgY29uc2lzdGVuY3kgcnVsZXMsIGlmIHBvc3NpYmxlOlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBFcXVhbGl0eSBjb21wYXJpc29uIHNob3VsZCBiZSByZWZsZXhpdmUuIEluIG90aGVyIHdvcmRzLCAnCisgICAgICAgICAgICAgICAgJ2lkZW50aWNhbFxuJworICAgICAgICAgICAgICAgICcgIG9iamVjdHMgc2hvdWxkIGNvbXBhcmUgZXF1YWw6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4IGlzIHkiIGltcGxpZXMgInggPT0geSJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogQ29tcGFyaXNvbiBzaG91bGQgYmUgc3ltbWV0cmljLiBJbiBvdGhlciB3b3JkcywgdGhlICcKKyAgICAgICAgICAgICAgICAnZm9sbG93aW5nXG4nCisgICAgICAgICAgICAgICAgJyAgZXhwcmVzc2lvbnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgcmVzdWx0OlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA9PSB5IiBhbmQgInkgPT0geCJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggIT0geSIgYW5kICJ5ICE9IHgiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4IDwgeSIgYW5kICJ5ID4geCJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPD0geSIgYW5kICJ5ID49IHgiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIENvbXBhcmlzb24gc2hvdWxkIGJlIHRyYW5zaXRpdmUuIFRoZSBmb2xsb3dpbmcgJworICAgICAgICAgICAgICAgICcobm9uLWV4aGF1c3RpdmUpXG4nCisgICAgICAgICAgICAgICAgJyAgZXhhbXBsZXMgaWxsdXN0cmF0ZSB0aGF0OlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA+IHkgYW5kIHkgPiB6IiBpbXBsaWVzICJ4ID4geiJcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgICAgInggPCB5IGFuZCB5IDw9IHoiIGltcGxpZXMgInggPCB6IlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBJbnZlcnNlIGNvbXBhcmlzb24gc2hvdWxkIHJlc3VsdCBpbiB0aGUgYm9vbGVhbiBuZWdhdGlvbi4gJworICAgICAgICAgICAgICAgICdJbiBvdGhlclxuJworICAgICAgICAgICAgICAgICcgIHdvcmRzLCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIHNob3VsZCBoYXZlIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAgICAncmVzdWx0OlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA9PSB5IiBhbmQgIm5vdCB4ICE9IHkiXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICAgICJ4IDwgeSIgYW5kICJub3QgeCA+PSB5IiAoZm9yIHRvdGFsIG9yZGVyaW5nKVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnICAgICAieCA+IHkiIGFuZCAibm90IHggPD0geSIgKGZvciB0b3RhbCBvcmRlcmluZylcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyAgVGhlIGxhc3QgdHdvIGV4cHJlc3Npb25zIGFwcGx5IHRvIHRvdGFsbHkgb3JkZXJlZCAnCisgICAgICAgICAgICAgICAgJ2NvbGxlY3Rpb25zIChlLmcuXG4nCisgICAgICAgICAgICAgICAgJyAgdG8gc2VxdWVuY2VzLCBidXQgbm90IHRvIHNldHMgb3IgbWFwcGluZ3MpLiBTZWUgYWxzbyB0aGVcbicKKyAgICAgICAgICAgICAgICAnICAidG90YWxfb3JkZXJpbmcoKSIgZGVjb3JhdG9yLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnUHl0aG9uIGRvZXMgbm90IGVuZm9yY2UgdGhlc2UgY29uc2lzdGVuY3kgcnVsZXMuIEluIGZhY3QsICcKKyAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgJ25vdC1hLW51bWJlciB2YWx1ZXMgYXJlIGFuIGV4YW1wbGUgZm9yIG5vdCBmb2xsb3dpbmcgdGhlc2UgJworICAgICAgICAgICAgICAgICdydWxlcy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdNZW1iZXJzaGlwIHRlc3Qgb3BlcmF0aW9uc1xuJworICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIG9wZXJhdG9ycyAiaW4iIGFuZCAibm90IGluIiB0ZXN0IGZvciBtZW1iZXJzaGlwLiAgInggaW4gJworICAgICAgICAgICAgICAgICdzIlxuJworICAgICAgICAgICAgICAgICdldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgKnMqLCBhbmQgZmFsc2UgJworICAgICAgICAgICAgICAgICdvdGhlcndpc2UuICAieFxuJworICAgICAgICAgICAgICAgICdub3QgaW4gcyIgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgInggaW4gcyIuICBBbGwgYnVpbHQtaW4gJworICAgICAgICAgICAgICAgICdzZXF1ZW5jZXNcbicKKyAgICAgICAgICAgICAgICAnYW5kIHNldCB0eXBlcyBzdXBwb3J0IHRoaXMgYXMgd2VsbCBhcyBkaWN0aW9uYXJ5LCBmb3Igd2hpY2ggJworICAgICAgICAgICAgICAgICciaW4iIHRlc3RzXG4nCisgICAgICAgICAgICAgICAgJ3doZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzICcKKyAgICAgICAgICAgICAgICAnc3VjaCBhc1xuJworICAgICAgICAgICAgICAgICdsaXN0LCB0dXBsZSwgc2V0LCBmcm96ZW5zZXQsIGRpY3QsIG9yIGNvbGxlY3Rpb25zLmRlcXVlLCB0aGVcbicKKyAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbiAieCBpbiB5IiBpcyBlcXVpdmFsZW50IHRvICJhbnkoeCBpcyBlIG9yIHggPT0gZSAnCisgICAgICAgICAgICAgICAgJ2ZvciBlIGluXG4nCisgICAgICAgICAgICAgICAgJ3kpIi5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0ZvciB0aGUgc3RyaW5nIGFuZCBieXRlcyB0eXBlcywgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSAnCisgICAgICAgICAgICAgICAgJ2lmICp4KiBpc1xuJworICAgICAgICAgICAgICAgICdhIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgInkuZmluZCh4KSAhPSAnCisgICAgICAgICAgICAgICAgJy0xIi4gIEVtcHR5XG4nCisgICAgICAgICAgICAgICAgJ3N0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciAnCisgICAgICAgICAgICAgICAgJ3N0cmluZyxcbicKKyAgICAgICAgICAgICAgICAnc28gIiIiIGluICJhYmMiIiB3aWxsIHJldHVybiAiVHJ1ZSIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdGb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSAiX19jb250YWluc19fKCkiICcKKyAgICAgICAgICAgICAgICAnbWV0aG9kLCAieFxuJworICAgICAgICAgICAgICAgICdpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICJ5Ll9fY29udGFpbnNfXyh4KSIgaXMgdHJ1ZS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0ZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lICJfX2NvbnRhaW5zX18oKSIgJworICAgICAgICAgICAgICAgICdidXQgZG9cbicKKyAgICAgICAgICAgICAgICAnZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlICJ6IiB3aXRoICcKKyAgICAgICAgICAgICAgICAnInggPT0geiJcbicKKyAgICAgICAgICAgICAgICAnaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgInkiLiAgSWYgYW4gZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICAgICAgICAncmFpc2VkXG4nCisgICAgICAgICAgICAgICAgJ2R1cmluZyB0aGUgaXRlcmF0aW9uLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0ICcKKyAgICAgICAgICAgICAgICAnZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyAnCisgICAgICAgICAgICAgICAgJ2RlZmluZXNcbicKKyAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgJworICAgICAgICAgICAgICAgICdub24tXG4nCisgICAgICAgICAgICAgICAgJ25lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCAieCA9PSB5W2ldIiwgYW5kIGFsbCAnCisgICAgICAgICAgICAgICAgJ2xvd2VyXG4nCisgICAgICAgICAgICAgICAgJ2ludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgJworICAgICAgICAgICAgICAgICdvdGhlclxuJworICAgICAgICAgICAgICAgICdleGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiAiaW4iIHJhaXNlZCB0aGF0ICcKKyAgICAgICAgICAgICAgICAnZXhjZXB0aW9uKS5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBvcGVyYXRvciAibm90IGluIiBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSAnCisgICAgICAgICAgICAgICAgJ3ZhbHVlIG9mXG4nCisgICAgICAgICAgICAgICAgJyJpbiIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnSWRlbnRpdHkgY29tcGFyaXNvbnNcbicKKyAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBvcGVyYXRvcnMgImlzIiBhbmQgImlzIG5vdCIgdGVzdCBmb3Igb2JqZWN0IGlkZW50aXR5OiAieCAnCisgICAgICAgICAgICAgICAgJ2lzIHkiIGlzXG4nCisgICAgICAgICAgICAgICAgJ3RydWUgaWYgYW5kIG9ubHkgaWYgKngqIGFuZCAqeSogYXJlIHRoZSBzYW1lIG9iamVjdC4gICJ4IGlzICcKKyAgICAgICAgICAgICAgICAnbm90IHkiXG4nCisgICAgICAgICAgICAgICAgJ3lpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzRdXG4nLAorICdjb21wb3VuZCc6ICdcbicKKyAgICAgICAgICAgICAnQ29tcG91bmQgc3RhdGVtZW50c1xuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDb21wb3VuZCBzdGF0ZW1lbnRzIGNvbnRhaW4gKGdyb3VwcyBvZikgb3RoZXIgc3RhdGVtZW50czsgdGhleSAnCisgICAgICAgICAgICAgJ2FmZmVjdFxuJworICAgICAgICAgICAgICdvciBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhvc2Ugb3RoZXIgc3RhdGVtZW50cyBpbiBzb21lIHdheS4gICcKKyAgICAgICAgICAgICAnSW5cbicKKyAgICAgICAgICAgICAnZ2VuZXJhbCwgY29tcG91bmQgc3RhdGVtZW50cyBzcGFuIG11bHRpcGxlIGxpbmVzLCBhbHRob3VnaCBpbiAnCisgICAgICAgICAgICAgJ3NpbXBsZVxuJworICAgICAgICAgICAgICdpbmNhcm5hdGlvbnMgYSB3aG9sZSBjb21wb3VuZCBzdGF0ZW1lbnQgbWF5IGJlIGNvbnRhaW5lZCBpbiBvbmUgJworICAgICAgICAgICAgICdsaW5lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJpZiIsICJ3aGlsZSIgYW5kICJmb3IiIHN0YXRlbWVudHMgaW1wbGVtZW50IHRyYWRpdGlvbmFsICcKKyAgICAgICAgICAgICAnY29udHJvbFxuJworICAgICAgICAgICAgICdmbG93IGNvbnN0cnVjdHMuICAidHJ5IiBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciAnCisgICAgICAgICAgICAgJ2NsZWFudXBcbicKKyAgICAgICAgICAgICAnY29kZSBmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzLCB3aGlsZSB0aGUgIndpdGgiIHN0YXRlbWVudCAnCisgICAgICAgICAgICAgJ2FsbG93cyB0aGVcbicKKyAgICAgICAgICAgICAnZXhlY3V0aW9uIG9mIGluaXRpYWxpemF0aW9uIGFuZCBmaW5hbGl6YXRpb24gY29kZSBhcm91bmQgYSBibG9jayAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJ2NvZGUuICBGdW5jdGlvbiBhbmQgY2xhc3MgZGVmaW5pdGlvbnMgYXJlIGFsc28gc3ludGFjdGljYWxseSAnCisgICAgICAgICAgICAgJ2NvbXBvdW5kXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJBIGNvbXBvdW5kIHN0YXRlbWVudCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSAnY2xhdXNlcy4nICBBICIKKyAgICAgICAgICAgICAnY2xhdXNlXG4nCisgICAgICAgICAgICAgImNvbnNpc3RzIG9mIGEgaGVhZGVyIGFuZCBhICdzdWl0ZS4nICBUaGUgY2xhdXNlIGhlYWRlcnMgb2YgYVxuIgorICAgICAgICAgICAgICdwYXJ0aWN1bGFyIGNvbXBvdW5kIHN0YXRlbWVudCBhcmUgYWxsIGF0IHRoZSBzYW1lIGluZGVudGF0aW9uICcKKyAgICAgICAgICAgICAnbGV2ZWwuXG4nCisgICAgICAgICAgICAgJ0VhY2ggY2xhdXNlIGhlYWRlciBiZWdpbnMgd2l0aCBhIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGtleXdvcmQgJworICAgICAgICAgICAgICdhbmQgZW5kc1xuJworICAgICAgICAgICAgICd3aXRoIGEgY29sb24uICBBIHN1aXRlIGlzIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cyBjb250cm9sbGVkIGJ5IGFcbicKKyAgICAgICAgICAgICAnY2xhdXNlLiAgQSBzdWl0ZSBjYW4gYmUgb25lIG9yIG1vcmUgc2VtaWNvbG9uLXNlcGFyYXRlZCBzaW1wbGVcbicKKyAgICAgICAgICAgICAnc3RhdGVtZW50cyBvbiB0aGUgc2FtZSBsaW5lIGFzIHRoZSBoZWFkZXIsIGZvbGxvd2luZyB0aGUgJworICAgICAgICAgICAgICJoZWFkZXInc1xuIgorICAgICAgICAgICAgICdjb2xvbiwgb3IgaXQgY2FuIGJlIG9uZSBvciBtb3JlIGluZGVudGVkIHN0YXRlbWVudHMgb24gJworICAgICAgICAgICAgICdzdWJzZXF1ZW50XG4nCisgICAgICAgICAgICAgJ2xpbmVzLiAgT25seSB0aGUgbGF0dGVyIGZvcm0gb2YgYSBzdWl0ZSBjYW4gY29udGFpbiBuZXN0ZWQgJworICAgICAgICAgICAgICdjb21wb3VuZFxuJworICAgICAgICAgICAgICJzdGF0ZW1lbnRzOyB0aGUgZm9sbG93aW5nIGlzIGlsbGVnYWwsIG1vc3RseSBiZWNhdXNlIGl0IHdvdWxkbid0ICIKKyAgICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgICAnY2xlYXIgdG8gd2hpY2ggImlmIiBjbGF1c2UgYSBmb2xsb3dpbmcgImVsc2UiIGNsYXVzZSB3b3VsZCAnCisgICAgICAgICAgICAgJ2JlbG9uZzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGlmIHRlc3QxOiBpZiB0ZXN0MjogcHJpbnQoeClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Fsc28gbm90ZSB0aGF0IHRoZSBzZW1pY29sb24gYmluZHMgdGlnaHRlciB0aGFuIHRoZSBjb2xvbiBpbiAnCisgICAgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAgICAnY29udGV4dCwgc28gdGhhdCBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGVpdGhlciBhbGwgb3Igbm9uZSBvZiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICcicHJpbnQoKSIgY2FsbHMgYXJlIGV4ZWN1dGVkOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgaWYgeCA8IHkgPCB6OiBwcmludCh4KTsgcHJpbnQoeSk7IHByaW50KHopXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTdW1tYXJpemluZzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGNvbXBvdW5kX3N0bXQgOjo9IGlmX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCB3aGlsZV9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgZm9yX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCB0cnlfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IHdpdGhfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IGZ1bmNkZWZcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgfCBjbGFzc2RlZlxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX3dpdGhfc3RtdFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICB8IGFzeW5jX2Zvcl9zdG10XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgIHwgYXN5bmNfZnVuY2RlZlxuJworICAgICAgICAgICAgICcgICBzdWl0ZSAgICAgICAgIDo6PSBzdG10X2xpc3QgTkVXTElORSB8IE5FV0xJTkUgSU5ERU5UICcKKyAgICAgICAgICAgICAnc3RhdGVtZW50KyBERURFTlRcbicKKyAgICAgICAgICAgICAnICAgc3RhdGVtZW50ICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBjb21wb3VuZF9zdG10XG4nCisgICAgICAgICAgICAgJyAgIHN0bXRfbGlzdCAgICAgOjo9IHNpbXBsZV9zdG10ICgiOyIgc2ltcGxlX3N0bXQpKiBbIjsiXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZSB0aGF0IHN0YXRlbWVudHMgYWx3YXlzIGVuZCBpbiBhICJORVdMSU5FIiBwb3NzaWJseSBmb2xsb3dlZCAnCisgICAgICAgICAgICAgJ2J5IGFcbicKKyAgICAgICAgICAgICAnIkRFREVOVCIuICBBbHNvIG5vdGUgdGhhdCBvcHRpb25hbCBjb250aW51YXRpb24gY2xhdXNlcyBhbHdheXMgJworICAgICAgICAgICAgICdiZWdpblxuJworICAgICAgICAgICAgICd3aXRoIGEga2V5d29yZCB0aGF0IGNhbm5vdCBzdGFydCBhIHN0YXRlbWVudCwgdGh1cyB0aGVyZSBhcmUgbm9cbicKKyAgICAgICAgICAgICAnYW1iaWd1aXRpZXMgKHRoZSBcJ2RhbmdsaW5nICJlbHNlIlwnIHByb2JsZW0gaXMgc29sdmVkIGluIFB5dGhvbiAnCisgICAgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgICAgJ3JlcXVpcmluZyBuZXN0ZWQgImlmIiBzdGF0ZW1lbnRzIHRvIGJlIGluZGVudGVkKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmb3JtYXR0aW5nIG9mIHRoZSBncmFtbWFyIHJ1bGVzIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgJworICAgICAgICAgICAgICdwbGFjZXNcbicKKyAgICAgICAgICAgICAnZWFjaCBjbGF1c2Ugb24gYSBzZXBhcmF0ZSBsaW5lIGZvciBjbGFyaXR5LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiaWYiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMgb25lXG4nCisgICAgICAgICAgICAgJ2J5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gQm9vbGVhbiAnCisgICAgICAgICAgICAgJ29wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAnZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzICcKKyAgICAgICAgICAgICAnZXhlY3V0ZWRcbicKKyAgICAgICAgICAgICAnKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSAiaWYiIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciAnCisgICAgICAgICAgICAgJ2V2YWx1YXRlZCkuXG4nCisgICAgICAgICAgICAgJ0lmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgJworICAgICAgICAgICAgICdpZlxuJworICAgICAgICAgICAgICdwcmVzZW50LCBpcyBleGVjdXRlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgIndoaWxlIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgIndoaWxlIiBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgJworICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICdleHByZXNzaW9uIGlzIHRydWU6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgJworICAgICAgICAgICAgICdleGVjdXRlcyB0aGVcbicKKyAgICAgICAgICAgICAnZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0ICcKKyAgICAgICAgICAgICAndGltZVxuJworICAgICAgICAgICAgICdpdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgJworICAgICAgICAgICAgICdleGVjdXRlZFxuJworICAgICAgICAgICAgICdhbmQgdGhlIGxvb3AgdGVybWluYXRlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlICcKKyAgICAgICAgICAgICAnbG9vcFxuJworICAgICAgICAgICAgICd3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiAnCisgICAgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICAgICdleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBnb2VzICcKKyAgICAgICAgICAgICAnYmFja1xuJworICAgICAgICAgICAgICd0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiZm9yIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJmb3IiIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgJyhzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBmb3Jfc3RtdCA6Oj0gImZvciIgdGFyZ2V0X2xpc3QgImluIiBleHByZXNzaW9uX2xpc3QgIjoiICcKKyAgICAgICAgICAgICAnc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuICcKKyAgICAgICAgICAgICAnaXRlcmFibGVcbicKKyAgICAgICAgICAgICAnb2JqZWN0LiAgQW4gaXRlcmF0b3IgaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3VsdCBvZiB0aGVcbicKKyAgICAgICAgICAgICAnImV4cHJlc3Npb25fbGlzdCIuICBUaGUgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBvbmNlIGZvciBlYWNoICcKKyAgICAgICAgICAgICAnaXRlbVxuJworICAgICAgICAgICAgICdwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciByZXR1cm5lZCBieSB0aGUgJworICAgICAgICAgICAgICdpdGVyYXRvci4gIEVhY2hcbicKKyAgICAgICAgICAgICAnaXRlbSBpbiB0dXJuIGlzIGFzc2lnbmVkIHRvIHRoZSB0YXJnZXQgbGlzdCB1c2luZyB0aGUgc3RhbmRhcmQgJworICAgICAgICAgICAgICdydWxlc1xuJworICAgICAgICAgICAgICdmb3IgYXNzaWdubWVudHMgKHNlZSBBc3NpZ25tZW50IHN0YXRlbWVudHMpLCBhbmQgdGhlbiB0aGUgc3VpdGUgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdleGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZSBleGhhdXN0ZWQgKHdoaWNoIGlzIGltbWVkaWF0ZWx5ICcKKyAgICAgICAgICAgICAnd2hlbiB0aGVcbicKKyAgICAgICAgICAgICAnc2VxdWVuY2UgaXMgZW1wdHkgb3IgYW4gaXRlcmF0b3IgcmFpc2VzIGEgIlN0b3BJdGVyYXRpb24iICcKKyAgICAgICAgICAgICAnZXhjZXB0aW9uKSxcbicKKyAgICAgICAgICAgICAndGhlIHN1aXRlIGluIHRoZSAiZWxzZSIgY2xhdXNlLCBpZiBwcmVzZW50LCBpcyBleGVjdXRlZCwgYW5kIHRoZSAnCisgICAgICAgICAgICAgJ2xvb3BcbicKKyAgICAgICAgICAgICAndGVybWluYXRlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlICcKKyAgICAgICAgICAgICAnbG9vcFxuJworICAgICAgICAgICAgICd3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiAnCisgICAgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICAgICdleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCAnCisgICAgICAgICAgICAgJ2NvbnRpbnVlc1xuJworICAgICAgICAgICAgICd3aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlICJlbHNlIiBjbGF1c2UgaWYgdGhlcmUgaXMgbm8gJworICAgICAgICAgICAgICduZXh0XG4nCisgICAgICAgICAgICAgJ2l0ZW0uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZm9yLWxvb3AgbWFrZXMgYXNzaWdubWVudHMgdG8gdGhlIHZhcmlhYmxlcyhzKSBpbiB0aGUgdGFyZ2V0ICcKKyAgICAgICAgICAgICAnbGlzdC5cbicKKyAgICAgICAgICAgICAnVGhpcyBvdmVyd3JpdGVzIGFsbCBwcmV2aW91cyBhc3NpZ25tZW50cyB0byB0aG9zZSB2YXJpYWJsZXMgJworICAgICAgICAgICAgICdpbmNsdWRpbmdcbicKKyAgICAgICAgICAgICAndGhvc2UgbWFkZSBpbiB0aGUgc3VpdGUgb2YgdGhlIGZvci1sb29wOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZm9yIGkgaW4gcmFuZ2UoMTApOlxuJworICAgICAgICAgICAgICcgICAgICAgcHJpbnQoaSlcbicKKyAgICAgICAgICAgICAnICAgICAgIGkgPSA1ICAgICAgICAgICAgICMgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdGhlIGZvci1sb29wXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggJworICAgICAgICAgICAgICd0aGUgbmV4dFxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmRleCBpbiB0aGUgcmFuZ2VcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05hbWVzIGluIHRoZSB0YXJnZXQgbGlzdCBhcmUgbm90IGRlbGV0ZWQgd2hlbiB0aGUgbG9vcCBpcyAnCisgICAgICAgICAgICAgJ2ZpbmlzaGVkLFxuJworICAgICAgICAgICAgICdidXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCAnCisgICAgICAgICAgICAgJ3RvIGF0XG4nCisgICAgICAgICAgICAgJ2FsbCBieSB0aGUgbG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAicmFuZ2UoKSIgcmV0dXJucyAnCisgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgIml0ZXJhdG9yIG9mIGludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWwncyAiCisgICAgICAgICAgICAgJyJmb3IgaVxuJworICAgICAgICAgICAgICc6PSBhIHRvIGIgZG8iOyBlLmcuLCAibGlzdChyYW5nZSgzKSkiIHJldHVybnMgdGhlIGxpc3QgIlswLCAxLCAnCisgICAgICAgICAgICAgJzJdIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICBsb29wICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuICAnCisgICAgICAgICAgICAgJ0FuXG4nCisgICAgICAgICAgICAgJyAgaW50ZXJuYWwgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkICcKKyAgICAgICAgICAgICAnbmV4dCxcbicKKyAgICAgICAgICAgICAnICBhbmQgdGhpcyBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyICcKKyAgICAgICAgICAgICAnaGFzXG4nCisgICAgICAgICAgICAgJyAgcmVhY2hlZCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGUgbG9vcCB0ZXJtaW5hdGVzLiAgVGhpcyAnCisgICAgICAgICAgICAgJ21lYW5zXG4nCisgICAgICAgICAgICAgJyAgdGhhdCBpZiB0aGUgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSAnCisgICAgICAgICAgICAgJ2Zyb20gdGhlXG4nCisgICAgICAgICAgICAgJyAgc2VxdWVuY2UsIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSAnCisgICAgICAgICAgICAgJ2luZGV4IG9mXG4nCisgICAgICAgICAgICAgJyAgdGhlIGN1cnJlbnQgaXRlbSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHRyZWF0ZWQpLiAgTGlrZXdpc2UsICcKKyAgICAgICAgICAgICAnaWYgdGhlXG4nCisgICAgICAgICAgICAgJyAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgJworICAgICAgICAgICAgICdsb29wLlxuJworICAgICAgICAgICAgICcgIFRoaXMgY2FuIGxlYWQgdG8gbmFzdHkgYnVncyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyBhXG4nCisgICAgICAgICAgICAgJyAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgIGZvciB4IGluIGFbOl06XG4nCisgICAgICAgICAgICAgJyAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAidHJ5IiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJ0cnkiIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwICcKKyAgICAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICAgICdmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbicKKyAgICAgICAgICAgICAnICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl1dICI6IiAnCisgICAgICAgICAgICAgJ3N1aXRlKStcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgICAgICAnICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgImV4Y2VwdCIgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiAnCisgICAgICAgICAgICAgJ1doZW4gbm9cbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpc1xuJworICAgICAgICAgICAgICdleGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSAidHJ5IiBzdWl0ZSwgYSBzZWFyY2ggJworICAgICAgICAgICAgICdmb3IgYW5cbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHQgJworICAgICAgICAgICAgICdjbGF1c2VzXG4nCisgICAgICAgICAgICAgJ2luIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW4gJworICAgICAgICAgICAgICdleHByZXNzaW9uLVxuJworICAgICAgICAgICAgICdsZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlcyBhbnlcbicKKyAgICAgICAgICAgICAnZXhjZXB0aW9uLiAgRm9yIGFuIGV4Y2VwdCBjbGF1c2Ugd2l0aCBhbiBleHByZXNzaW9uLCB0aGF0ICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICdpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGUgJworICAgICAgICAgICAgICdyZXN1bHRpbmdcbicKKyAgICAgICAgICAgICAnb2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXMgJworICAgICAgICAgICAgICdjb21wYXRpYmxlXG4nCisgICAgICAgICAgICAgJ3dpdGggYW4gZXhjZXB0aW9uIGlmIGl0IGlzIHRoZSBjbGFzcyBvciBhIGJhc2UgY2xhc3Mgb2YgdGhlICcKKyAgICAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgJ29iamVjdCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlICcKKyAgICAgICAgICAgICAnZXhjZXB0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuICcKKyAgICAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgJ2hhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiAnCisgICAgICAgICAgICAgJ3N0YWNrLlxuJworICAgICAgICAgICAgICdbMV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0lmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgJworICAgICAgICAgICAgICdjbGF1c2VcbicKKyAgICAgICAgICAgICAncmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzICcKKyAgICAgICAgICAgICAnY2FuY2VsZWQgYW5kXG4nCisgICAgICAgICAgICAgJ2Egc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgJworICAgICAgICAgICAgICdhbmQgb25cbicKKyAgICAgICAgICAgICAndGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSAidHJ5IiBzdGF0ZW1lbnQgJworICAgICAgICAgICAgICdyYWlzZWRcbicKKyAgICAgICAgICAgICAndGhlIGV4Y2VwdGlvbikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIGEgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyAnCisgICAgICAgICAgICAgJ2Fzc2lnbmVkIHRvXG4nCisgICAgICAgICAgICAgJ3RoZSB0YXJnZXQgc3BlY2lmaWVkIGFmdGVyIHRoZSAiYXMiIGtleXdvcmQgaW4gdGhhdCBleGNlcHQgJworICAgICAgICAgICAgICdjbGF1c2UsIGlmXG4nCisgICAgICAgICAgICAgInByZXNlbnQsIGFuZCB0aGUgZXhjZXB0IGNsYXVzZSdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdFxuIgorICAgICAgICAgICAgICdjbGF1c2VzIG11c3QgaGF2ZSBhbiBleGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgJworICAgICAgICAgICAgICdibG9jayBpc1xuJworICAgICAgICAgICAgICdyZWFjaGVkLCBleGVjdXRpb24gY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5ICcKKyAgICAgICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICcoVGhpcyBtZWFucyB0aGF0IGlmIHR3byBuZXN0ZWQgaGFuZGxlcnMgZXhpc3QgZm9yIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAnZXhjZXB0aW9uLFxuJworICAgICAgICAgICAgICdhbmQgdGhlIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ291dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2hlbiBhbiBleGNlcHRpb24gaGFzIGJlZW4gYXNzaWduZWQgdXNpbmcgImFzIHRhcmdldCIsIGl0IGlzICcKKyAgICAgICAgICAgICAnY2xlYXJlZFxuJworICAgICAgICAgICAgICdhdCB0aGUgZW5kIG9mIHRoZSBleGNlcHQgY2xhdXNlLiAgVGhpcyBpcyBhcyBpZlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZXhjZXB0IEUgYXMgTjpcbicKKyAgICAgICAgICAgICAnICAgICAgIGZvb1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnd2FzIHRyYW5zbGF0ZWQgdG9cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGV4Y2VwdCBFIGFzIE46XG4nCisgICAgICAgICAgICAgJyAgICAgICB0cnk6XG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgZm9vXG4nCisgICAgICAgICAgICAgJyAgICAgICBmaW5hbGx5OlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIGRlbCBOXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGlzIG1lYW5zIHRoZSBleGNlcHRpb24gbXVzdCBiZSBhc3NpZ25lZCB0byBhIGRpZmZlcmVudCBuYW1lIHRvICcKKyAgICAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAgICAnYWJsZSB0byByZWZlciB0byBpdCBhZnRlciB0aGUgZXhjZXB0IGNsYXVzZS4gIEV4Y2VwdGlvbnMgYXJlICcKKyAgICAgICAgICAgICAnY2xlYXJlZFxuJworICAgICAgICAgICAgICdiZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSAnCisgICAgICAgICAgICAgJ3JlZmVyZW5jZVxuJworICAgICAgICAgICAgICdjeWNsZSB3aXRoIHRoZSBzdGFjayBmcmFtZSwga2VlcGluZyBhbGwgbG9jYWxzIGluIHRoYXQgZnJhbWUgJworICAgICAgICAgICAgICdhbGl2ZVxuJworICAgICAgICAgICAgICd1bnRpbCB0aGUgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2UncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbiIKKyAgICAgICAgICAgICAnZXhjZXB0aW9uIGFyZSBzdG9yZWQgaW4gdGhlICJzeXMiIG1vZHVsZSBhbmQgY2FuIGJlIGFjY2Vzc2VkICcKKyAgICAgICAgICAgICAndmlhXG4nCisgICAgICAgICAgICAgJyJzeXMuZXhjX2luZm8oKSIuICJzeXMuZXhjX2luZm8oKSIgcmV0dXJucyBhIDMtdHVwbGUgY29uc2lzdGluZyAnCisgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICdleGNlcHRpb24gY2xhc3MsIHRoZSBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGEgdHJhY2ViYWNrIG9iamVjdCAnCisgICAgICAgICAgICAgJyhzZWVcbicKKyAgICAgICAgICAgICAnc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdwcm9ncmFtIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICAic3lzLmV4Y19pbmZvKCkiIHZhbHVlcyAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICdyZXN0b3JlZCB0byB0aGVpciBwcmV2aW91cyB2YWx1ZXMgKGJlZm9yZSB0aGUgY2FsbCkgd2hlbiAnCisgICAgICAgICAgICAgJ3JldHVybmluZ1xuJworICAgICAgICAgICAgICdmcm9tIGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3MgJworICAgICAgICAgICAgICdvZmZcbicKKyAgICAgICAgICAgICAndGhlIGVuZCBvZiB0aGUgInRyeSIgY2xhdXNlLiBbMl0gRXhjZXB0aW9ucyBpbiB0aGUgImVsc2UiIGNsYXVzZSAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICdub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nICJleGNlcHQiIGNsYXVzZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJZiAiZmluYWxseSIgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gICcKKyAgICAgICAgICAgICAnVGhlICJ0cnkiXG4nCisgICAgICAgICAgICAgJ2NsYXVzZSBpcyBleGVjdXRlZCwgaW5jbHVkaW5nIGFueSAiZXhjZXB0IiBhbmQgImVsc2UiIGNsYXVzZXMuICAnCisgICAgICAgICAgICAgJ0lmIGFuXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3QgaGFuZGxlZCwgdGhlXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlICJmaW5hbGx5IiBjbGF1c2UgaXMgJworICAgICAgICAgICAgICdleGVjdXRlZC4gIElmXG4nCisgICAgICAgICAgICAgJ3RoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kIG9mIHRoZSAnCisgICAgICAgICAgICAgJyJmaW5hbGx5IlxuJworICAgICAgICAgICAgICdjbGF1c2UuICBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSAnCisgICAgICAgICAgICAgJ3NhdmVkXG4nCisgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBpcyBzZXQgYXMgdGhlIGNvbnRleHQgb2YgdGhlIG5ldyBleGNlcHRpb24uIElmIHRoZSAnCisgICAgICAgICAgICAgJyJmaW5hbGx5IlxuJworICAgICAgICAgICAgICdjbGF1c2UgZXhlY3V0ZXMgYSAicmV0dXJuIiBvciAiYnJlYWsiIHN0YXRlbWVudCwgdGhlIHNhdmVkICcKKyAgICAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgJ2lzIGRpc2NhcmRlZDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgID4+PiBkZWYgZigpOlxuJworICAgICAgICAgICAgICcgICAuLi4gICAgIHRyeTpcbicKKyAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgMS8wXG4nCisgICAgICAgICAgICAgJyAgIC4uLiAgICAgZmluYWxseTpcbicKKyAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIDQyXG4nCisgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICcgICA+Pj4gZigpXG4nCisgICAgICAgICAgICAgJyAgIDQyXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0gJworICAgICAgICAgICAgICdkdXJpbmdcbicKKyAgICAgICAgICAgICAnZXhlY3V0aW9uIG9mIHRoZSAiZmluYWxseSIgY2xhdXNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyJ0cnkiIHN1aXRlIG9mIGEgInRyeSIuLi4iZmluYWxseSIgc3RhdGVtZW50LCB0aGUgImZpbmFsbHkiICcKKyAgICAgICAgICAgICAnY2xhdXNlIGlzXG4nCisgICAgICAgICAgICAgJ2Fsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBICJjb250aW51ZSIgc3RhdGVtZW50IGlzICcKKyAgICAgICAgICAgICAnaWxsZWdhbCBpblxuJworICAgICAgICAgICAgICd0aGUgImZpbmFsbHkiIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnRcbicKKyAgICAgICAgICAgICAnaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIGxpZnRlZCBpbiB0aGUgJworICAgICAgICAgICAgICdmdXR1cmUpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIHJldHVybiB2YWx1ZSBvZiBhIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGxhc3QgJworICAgICAgICAgICAgICcicmV0dXJuIlxuJworICAgICAgICAgICAgICdzdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcicmV0dXJuIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlICJmaW5hbGx5IiBjbGF1c2Ugd2lsbCBhbHdheXMgJworICAgICAgICAgICAgICdiZSB0aGVcbicKKyAgICAgICAgICAgICAnbGFzdCBvbmUgZXhlY3V0ZWQ6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICA+Pj4gZGVmIGZvbygpOlxuJworICAgICAgICAgICAgICcgICAuLi4gICAgIHRyeTpcbicKKyAgICAgICAgICAgICAiICAgLi4uICAgICAgICAgcmV0dXJuICd0cnknXG4iCisgICAgICAgICAgICAgJyAgIC4uLiAgICAgZmluYWxseTpcbicKKyAgICAgICAgICAgICAiICAgLi4uICAgICAgICAgcmV0dXJuICdmaW5hbGx5J1xuIgorICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAnICAgPj4+IGZvbygpXG4nCisgICAgICAgICAgICAgIiAgICdmaW5hbGx5J1xuIgorICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4nCisgICAgICAgICAgICAgJ0V4Y2VwdGlvbnMsIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgInJhaXNlIiBzdGF0ZW1lbnQgdG8gJworICAgICAgICAgICAgICdnZW5lcmF0ZVxuJworICAgICAgICAgICAgICdleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uIFRoZSByYWlzZSBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAid2l0aCIgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgJworICAgICAgICAgICAgICd3aXRoXG4nCisgICAgICAgICAgICAgJ21ldGhvZHMgZGVmaW5lZCBieSBhIGNvbnRleHQgbWFuYWdlciAoc2VlIHNlY3Rpb24gV2l0aCAnCisgICAgICAgICAgICAgJ1N0YXRlbWVudFxuJworICAgICAgICAgICAgICdDb250ZXh0IE1hbmFnZXJzKS4gVGhpcyBhbGxvd3MgY29tbW9uICcKKyAgICAgICAgICAgICAnInRyeSIuLi4iZXhjZXB0Ii4uLiJmaW5hbGx5IlxuJworICAgICAgICAgICAgICd1c2FnZSBwYXR0ZXJucyB0byBiZSBlbmNhcHN1bGF0ZWQgZm9yIGNvbnZlbmllbnQgcmV1c2UuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBleGVjdXRpb24gb2YgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzICcKKyAgICAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAgICAnZm9sbG93czpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzEuIFRoZSBjb250ZXh0IGV4cHJlc3Npb24gKHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSAnCisgICAgICAgICAgICAgJyJ3aXRoX2l0ZW0iKVxuJworICAgICAgICAgICAgICcgICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICczLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2VudGVyX18oKSIgbWV0aG9kIGlzIGludm9rZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc0LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlICJ3aXRoIiBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbicKKyAgICAgICAgICAgICAnICAgdmFsdWUgZnJvbSAiX19lbnRlcl9fKCkiIGlzIGFzc2lnbmVkIHRvIGl0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTm90ZTogVGhlICJ3aXRoIiBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSAnCisgICAgICAgICAgICAgJyJfX2VudGVyX18oKSJcbicKKyAgICAgICAgICAgICAnICAgICBtZXRob2QgcmV0dXJucyB3aXRob3V0IGFuIGVycm9yLCB0aGVuICJfX2V4aXRfXygpIiB3aWxsICcKKyAgICAgICAgICAgICAnYWx3YXlzIGJlXG4nCisgICAgICAgICAgICAgJyAgICAgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgICAgdGFyZ2V0IGxpc3QsIGl0IHdpbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhbiBlcnJvciAnCisgICAgICAgICAgICAgJ29jY3VycmluZ1xuJworICAgICAgICAgICAgICcgICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc1LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc2LiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBtZXRob2QgaXMgaW52b2tlZC4gIElmICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnICAgZXhjZXB0aW9uIGNhdXNlZCB0aGUgc3VpdGUgdG8gYmUgZXhpdGVkLCBpdHMgdHlwZSwgdmFsdWUsICcKKyAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgJyAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byAiX19leGl0X18oKSIuIE90aGVyd2lzZSwgJworICAgICAgICAgICAgICd0aHJlZVxuJworICAgICAgICAgICAgICcgICAiTm9uZSIgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuICcKKyAgICAgICAgICAgICAndmFsdWVcbicKKyAgICAgICAgICAgICAnICAgZnJvbSB0aGUgIl9fZXhpdF9fKCkiIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXMgJworICAgICAgICAgICAgICdyZXJhaXNlZC5cbicKKyAgICAgICAgICAgICAnICAgSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpcyBzdXBwcmVzc2VkLCAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICcgICBleGVjdXRpb24gY29udGludWVzIHdpdGggdGhlIHN0YXRlbWVudCBmb2xsb3dpbmcgdGhlICJ3aXRoIlxuJworICAgICAgICAgICAgICcgICBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuICcKKyAgICAgICAgICAgICAnZXhjZXB0aW9uLCB0aGVcbicKKyAgICAgICAgICAgICAnICAgcmV0dXJuIHZhbHVlIGZyb20gIl9fZXhpdF9fKCkiIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gJworICAgICAgICAgICAgICdwcm9jZWVkc1xuJworICAgICAgICAgICAgICcgICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgJworICAgICAgICAgICAgICdpZlxuJworICAgICAgICAgICAgICdtdWx0aXBsZSAid2l0aCIgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuJworICAgICAgICAgICAgICcgICAgICAgc3VpdGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIHdpdGggQSgpIGFzIGE6XG4nCisgICAgICAgICAgICAgJyAgICAgICB3aXRoIEIoKSBhcyBiOlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIHN1aXRlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0ICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICcgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob24gJworICAgICAgICAgICAgICcid2l0aCJcbicKKyAgICAgICAgICAgICAnICAgICBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRnVuY3Rpb24gZGVmaW5pdGlvbnNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAnCisgICAgICAgICAgICAgJyhzZWVcbicKKyAgICAgICAgICAgICAnc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZnVuY2RlZiAgICAgICAgICAgICAgICAgOjo9IFtkZWNvcmF0b3JzXSAiZGVmIiBmdW5jbmFtZSAiKCIgJworICAgICAgICAgICAgICdbcGFyYW1ldGVyX2xpc3RdICIpIiBbIi0+IiBleHByZXNzaW9uXSAiOiIgc3VpdGVcbicKKyAgICAgICAgICAgICAnICAgZGVjb3JhdG9ycyAgICAgICAgICAgICAgOjo9IGRlY29yYXRvcitcbicKKyAgICAgICAgICAgICAnICAgZGVjb3JhdG9yICAgICAgICAgICAgICAgOjo9ICJAIiBkb3R0ZWRfbmFtZSBbIigiICcKKyAgICAgICAgICAgICAnW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuJworICAgICAgICAgICAgICcgICBkb3R0ZWRfbmFtZSAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciAoIi4iIGlkZW50aWZpZXIpKlxuJworICAgICAgICAgICAgICcgICBwYXJhbWV0ZXJfbGlzdCAgICAgICAgICA6Oj0gZGVmcGFyYW1ldGVyICgiLCIgZGVmcGFyYW1ldGVyKSogJworICAgICAgICAgICAgICdbIiwiIFtwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc11dXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICB8IHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzXG4nCisgICAgICAgICAgICAgJyAgIHBhcmFtZXRlcl9saXN0X3N0YXJhcmdzIDo6PSAiKiIgW3BhcmFtZXRlcl0gKCIsIiAnCisgICAgICAgICAgICAgJ2RlZnBhcmFtZXRlcikqIFsiLCIgWyIqKiIgcGFyYW1ldGVyIFsiLCJdXV1cbicKKyAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBwYXJhbWV0ZXIgWyIsIl1cbicKKyAgICAgICAgICAgICAnICAgcGFyYW1ldGVyICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgWyI6IiBleHByZXNzaW9uXVxuJworICAgICAgICAgICAgICcgICBkZWZwYXJhbWV0ZXIgICAgICAgICAgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnICAgZnVuY25hbWUgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gJworICAgICAgICAgICAgICdiaW5kc1xuJworICAgICAgICAgICAgICd0aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICcoYSB3cmFwcGVyIGFyb3VuZCB0aGUgZXhlY3V0YWJsZSBjb2RlIGZvciB0aGUgZnVuY3Rpb24pLiAgVGhpc1xuJworICAgICAgICAgICAgICdmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsICcKKyAgICAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgICAgJ2FzIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHRvIGJlIHVzZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyAnCisgICAgICAgICAgICAgJ2dldHNcbicKKyAgICAgICAgICAgICAnZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBkZWZpbml0aW9uIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvciBtb3JlICpkZWNvcmF0b3IqXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIGlzXG4nCisgICAgICAgICAgICAgJ2RlZmluZWQsIGluIHRoZSBzY29wZSB0aGF0IGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgJworICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAncmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgICdhcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIG5hbWVcbicKKyAgICAgICAgICAgICAnaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LiAgTXVsdGlwbGUgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCAnCisgICAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICAgJ25lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBAZjEoYXJnKVxuJworICAgICAgICAgICAgICcgICBAZjJcbicKKyAgICAgICAgICAgICAnICAgZGVmIGZ1bmMoKTogcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaXMgZXF1aXZhbGVudCB0b1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZGVmIGZ1bmMoKTogcGFzc1xuJworICAgICAgICAgICAgICcgICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gb25lIG9yIG1vcmUgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlciogIj0iXG4nCisgICAgICAgICAgICAgJypleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXIgJworICAgICAgICAgICAgICd2YWx1ZXMuIlxuJworICAgICAgICAgICAgICdGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nICcKKyAgICAgICAgICAgICAnKmFyZ3VtZW50KiBtYXlcbicKKyAgICAgICAgICAgICAiYmUgb21pdHRlZCBmcm9tIGEgY2FsbCwgaW4gd2hpY2ggY2FzZSB0aGUgcGFyYW1ldGVyJ3MgZGVmYXVsdCAiCisgICAgICAgICAgICAgJ3ZhbHVlIGlzXG4nCisgICAgICAgICAgICAgJ3N1YnN0aXR1dGVkLiAgSWYgYSBwYXJhbWV0ZXIgaGFzIGEgZGVmYXVsdCB2YWx1ZSwgYWxsIGZvbGxvd2luZ1xuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzIHVwIHVudGlsIHRoZSAiIioiIiBtdXN0IGFsc28gaGF2ZSBhIGRlZmF1bHQgdmFsdWUgLS0tICcKKyAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICdpcyBhIHN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAnZ3JhbW1hci5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyoqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHdoZW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4qKiBUaGlzIG1lYW5zIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpc1xuJworICAgICAgICAgICAgICdldmFsdWF0ZWQgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIHNhbWUgJworICAgICAgICAgICAgICcicHJlLVxuJworICAgICAgICAgICAgICdjb21wdXRlZCIgdmFsdWUgaXMgdXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5ICcKKyAgICAgICAgICAgICAnaW1wb3J0YW50XG4nCisgICAgICAgICAgICAgJ3RvIHVuZGVyc3RhbmQgd2hlbiBhIGRlZmF1bHQgcGFyYW1ldGVyIGlzIGEgbXV0YWJsZSBvYmplY3QsIHN1Y2ggJworICAgICAgICAgICAgICdhcyBhXG4nCisgICAgICAgICAgICAgJ2xpc3Qgb3IgYSBkaWN0aW9uYXJ5OiBpZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiAnCisgICAgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgICAgJ2FwcGVuZGluZyBhbiBpdGVtIHRvIGEgbGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCAnCisgICAgICAgICAgICAgJ21vZGlmaWVkLlxuJworICAgICAgICAgICAgICdUaGlzIGlzIGdlbmVyYWxseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQuICBBIHdheSBhcm91bmQgdGhpcyBpcyAnCisgICAgICAgICAgICAgJ3RvIHVzZVxuJworICAgICAgICAgICAgICciTm9uZSIgYXMgdGhlIGRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uLCBlLmcuOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuJworICAgICAgICAgICAgICcgICAgICAgaWYgcGVuZ3VpbiBpcyBOb25lOlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIHBlbmd1aW4gPSBbXVxuJworICAgICAgICAgICAgICcgICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuJworICAgICAgICAgICAgICcgICAgICAgcmV0dXJuIHBlbmd1aW5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Z1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvbiAnCisgICAgICAgICAgICAgJ0NhbGxzLlxuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGNhbGwgYWx3YXlzIGFzc2lnbnMgdmFsdWVzIHRvIGFsbCBwYXJhbWV0ZXJzICcKKyAgICAgICAgICAgICAnbWVudGlvbmVkIGluXG4nCisgICAgICAgICAgICAgJ3RoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tICcKKyAgICAgICAgICAgICAna2V5d29yZFxuJworICAgICAgICAgICAgICdhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybSAiIippZGVudGlmaWVyIiIgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZyBhbnkgZXhjZXNzICcKKyAgICAgICAgICAgICAncG9zaXRpb25hbFxuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmIHRoZSBmb3JtXG4nCisgICAgICAgICAgICAgJyIiKippZGVudGlmaWVyIiIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXcgJworICAgICAgICAgICAgICdkaWN0aW9uYXJ5XG4nCisgICAgICAgICAgICAgJ3JlY2VpdmluZyBhbnkgZXhjZXNzIGtleXdvcmQgYXJndW1lbnRzLCBkZWZhdWx0aW5nIHRvIGEgbmV3ICcKKyAgICAgICAgICAgICAnZW1wdHlcbicKKyAgICAgICAgICAgICAnZGljdGlvbmFyeS4gUGFyYW1ldGVycyBhZnRlciAiIioiIiBvciAiIippZGVudGlmaWVyIiIgYXJlICcKKyAgICAgICAgICAgICAna2V5d29yZC1vbmx5XG4nCisgICAgICAgICAgICAgJ3BhcmFtZXRlcnMgYW5kIG1heSBvbmx5IGJlIHBhc3NlZCB1c2VkIGtleXdvcmQgYXJndW1lbnRzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnUGFyYW1ldGVycyBtYXkgaGF2ZSBhbm5vdGF0aW9ucyBvZiB0aGUgZm9ybSAiIjogZXhwcmVzc2lvbiIiICcKKyAgICAgICAgICAgICAnZm9sbG93aW5nXG4nCisgICAgICAgICAgICAgJ3RoZSBwYXJhbWV0ZXIgbmFtZS4gIEFueSBwYXJhbWV0ZXIgbWF5IGhhdmUgYW4gYW5ub3RhdGlvbiBldmVuICcKKyAgICAgICAgICAgICAndGhvc2VcbicKKyAgICAgICAgICAgICAnb2YgdGhlIGZvcm0gIippZGVudGlmaWVyIiBvciAiKippZGVudGlmaWVyIi4gIEZ1bmN0aW9ucyBtYXkgJworICAgICAgICAgICAgICdoYXZlXG4nCisgICAgICAgICAgICAgJyJyZXR1cm4iIGFubm90YXRpb24gb2YgdGhlIGZvcm0gIiItPiBleHByZXNzaW9uIiIgYWZ0ZXIgdGhlICcKKyAgICAgICAgICAgICAncGFyYW1ldGVyXG4nCisgICAgICAgICAgICAgJ2xpc3QuICBUaGVzZSBhbm5vdGF0aW9ucyBjYW4gYmUgYW55IHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIGFuZCAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICdldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBleGVjdXRlZC4gIEFubm90YXRpb25zICcKKyAgICAgICAgICAgICAnbWF5XG4nCisgICAgICAgICAgICAgJ2JlIGV2YWx1YXRlZCBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZXkgYXBwZWFyIGluIHRoZSBzb3VyY2UgJworICAgICAgICAgICAgICdjb2RlLlxuJworICAgICAgICAgICAgICdUaGUgcHJlc2VuY2Ugb2YgYW5ub3RhdGlvbnMgZG9lcyBub3QgY2hhbmdlIHRoZSBzZW1hbnRpY3Mgb2YgYVxuJworICAgICAgICAgICAgICdmdW5jdGlvbi4gIFRoZSBhbm5vdGF0aW9uIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGFzIHZhbHVlcyBvZiBhXG4nCisgICAgICAgICAgICAgImRpY3Rpb25hcnkga2V5ZWQgYnkgdGhlIHBhcmFtZXRlcnMnIG5hbWVzIGluIHRoZSAiCisgICAgICAgICAgICAgJyJfX2Fubm90YXRpb25zX18iXG4nCisgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBvZiB0aGUgZnVuY3Rpb24gb2JqZWN0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCAnCisgICAgICAgICAgICAgJ2JvdW5kXG4nCisgICAgICAgICAgICAgJ3RvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYVxuJworICAgICAgICAgICAgICdleHByZXNzaW9ucywgZGVzY3JpYmVkIGluIHNlY3Rpb24gTGFtYmRhcy4gIE5vdGUgdGhhdCB0aGUgJworICAgICAgICAgICAgICdsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpcyBtZXJlbHkgYSBzaG9ydGhhbmQgZm9yIGEgc2ltcGxpZmllZCBmdW5jdGlvbiAnCisgICAgICAgICAgICAgJ2RlZmluaXRpb247XG4nCisgICAgICAgICAgICAgJ2EgZnVuY3Rpb24gZGVmaW5lZCBpbiBhICIiZGVmIiIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kICcKKyAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAnYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lIGp1c3QgbGlrZSBhIGZ1bmN0aW9uIGRlZmluZWQgYnkgYSAnCisgICAgICAgICAgICAgJ2xhbWJkYVxuJworICAgICAgICAgICAgICdleHByZXNzaW9uLiAgVGhlICIiZGVmIiIgZm9ybSBpcyBhY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlICcKKyAgICAgICAgICAgICAnaXRcbicKKyAgICAgICAgICAgICAnYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGUgc3RhdGVtZW50cyBhbmQgYW5ub3RhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIqKlByb2dyYW1tZXIncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgIgorICAgICAgICAgICAgICciImRlZiIiXG4nCisgICAgICAgICAgICAgJ3N0YXRlbWVudCBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbFxuJworICAgICAgICAgICAgICdmdW5jdGlvbiB0aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgJworICAgICAgICAgICAgICd1c2VkXG4nCisgICAgICAgICAgICAgJ2luIHRoZSBuZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uXG4nCisgICAgICAgICAgICAgJ2NvbnRhaW5pbmcgdGhlIGRlZi4gIFNlZSBzZWN0aW9uIE5hbWluZyBhbmQgYmluZGluZyBmb3IgJworICAgICAgICAgICAgICdkZXRhaWxzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICoqUEVQIDMxMDcqKiAtIEZ1bmN0aW9uIEFubm90YXRpb25zXG4nCisgICAgICAgICAgICAgJyAgICAgVGhlIG9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIGZ1bmN0aW9uIGFubm90YXRpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NsYXNzIGRlZmluaXRpb25zXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gVGhlICcKKyAgICAgICAgICAgICAnc3RhbmRhcmRcbicKKyAgICAgICAgICAgICAndHlwZSBoaWVyYXJjaHkpOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgY2xhc3NkZWYgICAgOjo9IFtkZWNvcmF0b3JzXSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICcKKyAgICAgICAgICAgICAnIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2FyZ3VtZW50X2xpc3RdICIpIlxuJworICAgICAgICAgICAgICcgICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgVGhlIGluaGVyaXRhbmNlICcKKyAgICAgICAgICAgICAnbGlzdFxuJworICAgICAgICAgICAgICd1c3VhbGx5IGdpdmVzIGEgbGlzdCBvZiBiYXNlIGNsYXNzZXMgKHNlZSBDdXN0b21pemluZyBjbGFzcyAnCisgICAgICAgICAgICAgJ2NyZWF0aW9uXG4nCisgICAgICAgICAgICAgJ2ZvciBtb3JlIGFkdmFuY2VkIHVzZXMpLCBzbyBlYWNoIGl0ZW0gaW4gdGhlIGxpc3Qgc2hvdWxkICcKKyAgICAgICAgICAgICAnZXZhbHVhdGUgdG8gYVxuJworICAgICAgICAgICAgICdjbGFzcyBvYmplY3Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzaW5nLiAgQ2xhc3NlcyB3aXRob3V0IGFuICcKKyAgICAgICAgICAgICAnaW5oZXJpdGFuY2VcbicKKyAgICAgICAgICAgICAnbGlzdCBpbmhlcml0LCBieSBkZWZhdWx0LCBmcm9tIHRoZSBiYXNlIGNsYXNzICJvYmplY3QiOyBoZW5jZSxcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzIEZvbzpcbicKKyAgICAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzIEZvbyhvYmplY3QpOlxuJworICAgICAgICAgICAgICcgICAgICAgcGFzc1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiVGhlIGNsYXNzJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb24gZnJhbWUgIgorICAgICAgICAgICAgICcoc2VlXG4nCisgICAgICAgICAgICAgJ05hbWluZyBhbmQgYmluZGluZyksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbCBuYW1lc3BhY2UgYW5kICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ29yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGUgY29udGFpbnMgbW9zdGx5XG4nCisgICAgICAgICAgICAgImZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzJ3Mgc3VpdGUgZmluaXNoZXMgIgorICAgICAgICAgICAgICdleGVjdXRpb24sIGl0c1xuJworICAgICAgICAgICAgICdleGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzIHNhdmVkLiAnCisgICAgICAgICAgICAgJ1s0XSBBXG4nCisgICAgICAgICAgICAgJ2NsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3QgZm9yIHRoZSAnCisgICAgICAgICAgICAgJ2Jhc2VcbicKKyAgICAgICAgICAgICAnY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgJ1RoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZSBvcmlnaW5hbCAnCisgICAgICAgICAgICAgJ2xvY2FsXG4nCisgICAgICAgICAgICAgJ25hbWVzcGFjZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NsYXNzIGNyZWF0aW9uIGNhbiBiZSBjdXN0b21pemVkIGhlYXZpbHkgdXNpbmcgbWV0YWNsYXNzZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDbGFzc2VzIGNhbiBhbHNvIGJlIGRlY29yYXRlZDoganVzdCBsaWtlIHdoZW4gZGVjb3JhdGluZyAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9ucyxcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEBmMShhcmcpXG4nCisgICAgICAgICAgICAgJyAgIEBmMlxuJworICAgICAgICAgICAgICcgICBjbGFzcyBGb286IHBhc3NcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGNsYXNzIEZvbzogcGFzc1xuJworICAgICAgICAgICAgICcgICBGb28gPSBmMShhcmcpKGYyKEZvbykpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvciBleHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgJworICAgICAgICAgICAgICdhcyBmb3JcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gZGVjb3JhdG9ycy4gIFRoZSByZXN1bHQgbXVzdCBiZSBhIGNsYXNzIG9iamVjdCwgd2hpY2ggJworICAgICAgICAgICAgICdpcyB0aGVuXG4nCisgICAgICAgICAgICAgJ2JvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiKipQcm9ncmFtbWVyJ3Mgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiAiCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICdjbGFzcyBhdHRyaWJ1dGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgaW5zdGFuY2VzLiAgSW5zdGFuY2UgJworICAgICAgICAgICAgICdhdHRyaWJ1dGVzXG4nCisgICAgICAgICAgICAgJ2NhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCAic2VsZi5uYW1lID0gdmFsdWUiLiAgQm90aCBjbGFzcyAnCisgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICdpbnN0YW5jZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uICcKKyAgICAgICAgICAgICAnIiJzZWxmLm5hbWUiIixcbicKKyAgICAgICAgICAgICAnYW5kIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBoaWRlcyBhIGNsYXNzIGF0dHJpYnV0ZSB3aXRoIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAnbmFtZVxuJworICAgICAgICAgICAgICd3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiAgQ2xhc3MgYXR0cmlidXRlcyBjYW4gYmUgdXNlZCBhcyAnCisgICAgICAgICAgICAgJ2RlZmF1bHRzXG4nCisgICAgICAgICAgICAgJ2ZvciBpbnN0YW5jZSBhdHRyaWJ1dGVzLCBidXQgdXNpbmcgbXV0YWJsZSB2YWx1ZXMgdGhlcmUgY2FuIGxlYWQgJworICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICd1bmV4cGVjdGVkIHJlc3VsdHMuICBEZXNjcmlwdG9ycyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAndmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGRldGFpbHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTZWUgYWxzbzogKipQRVAgMzExNSoqIC0gTWV0YWNsYXNzZXMgaW4gUHl0aG9uIDMgKipQRVAgMzEyOSoqIC1cbicKKyAgICAgICAgICAgICAnICBDbGFzcyBEZWNvcmF0b3JzXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ29yb3V0aW5lc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ29yb3V0aW5lIGZ1bmN0aW9uIGRlZmluaXRpb25cbicKKyAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGFzeW5jX2Z1bmNkZWYgOjo9IFtkZWNvcmF0b3JzXSAiYXN5bmMiICJkZWYiIGZ1bmNuYW1lICIoIiAnCisgICAgICAgICAgICAgJ1twYXJhbWV0ZXJfbGlzdF0gIikiIFsiLT4iIGV4cHJlc3Npb25dICI6IiBzdWl0ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRXhlY3V0aW9uIG9mIFB5dGhvbiBjb3JvdXRpbmVzIGNhbiBiZSBzdXNwZW5kZWQgYW5kIHJlc3VtZWQgYXQgJworICAgICAgICAgICAgICdtYW55XG4nCisgICAgICAgICAgICAgJ3BvaW50cyAoc2VlICpjb3JvdXRpbmUqKS4gIEluIHRoZSBib2R5IG9mIGEgY29yb3V0aW5lLCBhbnkgJworICAgICAgICAgICAgICciYXdhaXQiIGFuZFxuJworICAgICAgICAgICAgICciYXN5bmMiIGlkZW50aWZpZXJzIGJlY29tZSByZXNlcnZlZCBrZXl3b3JkczsgImF3YWl0IiAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb25zLFxuJworICAgICAgICAgICAgICciYXN5bmMgZm9yIiBhbmQgImFzeW5jIHdpdGgiIGNhbiBvbmx5IGJlIHVzZWQgaW4gY29yb3V0aW5lICcKKyAgICAgICAgICAgICAnYm9kaWVzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRnVuY3Rpb25zIGRlZmluZWQgd2l0aCAiYXN5bmMgZGVmIiBzeW50YXggYXJlIGFsd2F5cyBjb3JvdXRpbmVcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb25zLCBldmVuIGlmIHRoZXkgZG8gbm90IGNvbnRhaW4gImF3YWl0IiBvciAiYXN5bmMiICcKKyAgICAgICAgICAgICAna2V5d29yZHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJdCBpcyBhICJTeW50YXhFcnJvciIgdG8gdXNlICJ5aWVsZCIgZXhwcmVzc2lvbnMgaW4gImFzeW5jIGRlZiJcbicKKyAgICAgICAgICAgICAnY29yb3V0aW5lcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0FuIGV4YW1wbGUgb2YgYSBjb3JvdXRpbmUgZnVuY3Rpb246XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBhc3luYyBkZWYgZnVuYyhwYXJhbTEsIHBhcmFtMik6XG4nCisgICAgICAgICAgICAgJyAgICAgICBkb19zdHVmZigpXG4nCisgICAgICAgICAgICAgJyAgICAgICBhd2FpdCBzb21lX2Nvcm91dGluZSgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBhc3luY19mb3Jfc3RtdCA6Oj0gImFzeW5jIiBmb3Jfc3RtdFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQW4gKmFzeW5jaHJvbm91cyBpdGVyYWJsZSogaXMgYWJsZSB0byBjYWxsIGFzeW5jaHJvbm91cyBjb2RlIGluICcKKyAgICAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgICAgJyppdGVyKiBpbXBsZW1lbnRhdGlvbiwgYW5kICphc3luY2hyb25vdXMgaXRlcmF0b3IqIGNhbiBjYWxsXG4nCisgICAgICAgICAgICAgJ2FzeW5jaHJvbm91cyBjb2RlIGluIGl0cyAqbmV4dCogbWV0aG9kLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJhc3luYyBmb3IiIHN0YXRlbWVudCBhbGxvd3MgY29udmVuaWVudCBpdGVyYXRpb24gb3ZlclxuJworICAgICAgICAgICAgICdhc3luY2hyb25vdXMgaXRlcmF0b3JzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBjb2RlOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgYXN5bmMgZm9yIFRBUkdFVCBpbiBJVEVSOlxuJworICAgICAgICAgICAgICcgICAgICAgQkxPQ0tcbicKKyAgICAgICAgICAgICAnICAgZWxzZTpcbicKKyAgICAgICAgICAgICAnICAgICAgIEJMT0NLMlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG86XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBpdGVyID0gKElURVIpXG4nCisgICAgICAgICAgICAgJyAgIGl0ZXIgPSB0eXBlKGl0ZXIpLl9fYWl0ZXJfXyhpdGVyKVxuJworICAgICAgICAgICAgICcgICBydW5uaW5nID0gVHJ1ZVxuJworICAgICAgICAgICAgICcgICB3aGlsZSBydW5uaW5nOlxuJworICAgICAgICAgICAgICcgICAgICAgdHJ5OlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIFRBUkdFVCA9IGF3YWl0IHR5cGUoaXRlcikuX19hbmV4dF9fKGl0ZXIpXG4nCisgICAgICAgICAgICAgJyAgICAgICBleGNlcHQgU3RvcEFzeW5jSXRlcmF0aW9uOlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIHJ1bm5pbmcgPSBGYWxzZVxuJworICAgICAgICAgICAgICcgICAgICAgZWxzZTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBCTE9DS1xuJworICAgICAgICAgICAgICcgICBlbHNlOlxuJworICAgICAgICAgICAgICcgICAgICAgQkxPQ0syXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTZWUgYWxzbyAiX19haXRlcl9fKCkiIGFuZCAiX19hbmV4dF9fKCkiIGZvciBkZXRhaWxzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnSXQgaXMgYSAiU3ludGF4RXJyb3IiIHRvIHVzZSAiYXN5bmMgZm9yIiBzdGF0ZW1lbnQgb3V0c2lkZSBvZiAnCisgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgJyJhc3luYyBkZWYiIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiYXN5bmMgd2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBhc3luY193aXRoX3N0bXQgOjo9ICJhc3luYyIgd2l0aF9zdG10XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBbiAqYXN5bmNocm9ub3VzIGNvbnRleHQgbWFuYWdlciogaXMgYSAqY29udGV4dCBtYW5hZ2VyKiB0aGF0IGlzICcKKyAgICAgICAgICAgICAnYWJsZVxuJworICAgICAgICAgICAgICd0byBzdXNwZW5kIGV4ZWN1dGlvbiBpbiBpdHMgKmVudGVyKiBhbmQgKmV4aXQqIG1ldGhvZHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIGNvZGU6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBhc3luYyB3aXRoIEVYUFIgYXMgVkFSOlxuJworICAgICAgICAgICAgICcgICAgICAgQkxPQ0tcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0lzIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgbWdyID0gKEVYUFIpXG4nCisgICAgICAgICAgICAgJyAgIGFleGl0ID0gdHlwZShtZ3IpLl9fYWV4aXRfX1xuJworICAgICAgICAgICAgICcgICBhZW50ZXIgPSB0eXBlKG1ncikuX19hZW50ZXJfXyhtZ3IpXG4nCisgICAgICAgICAgICAgJyAgIGV4YyA9IFRydWVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFZBUiA9IGF3YWl0IGFlbnRlclxuJworICAgICAgICAgICAgICcgICB0cnk6XG4nCisgICAgICAgICAgICAgJyAgICAgICBCTE9DS1xuJworICAgICAgICAgICAgICcgICBleGNlcHQ6XG4nCisgICAgICAgICAgICAgJyAgICAgICBpZiBub3QgYXdhaXQgYWV4aXQobWdyLCAqc3lzLmV4Y19pbmZvKCkpOlxuJworICAgICAgICAgICAgICcgICAgICAgICAgIHJhaXNlXG4nCisgICAgICAgICAgICAgJyAgIGVsc2U6XG4nCisgICAgICAgICAgICAgJyAgICAgICBhd2FpdCBhZXhpdChtZ3IsIE5vbmUsIE5vbmUsIE5vbmUpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTZWUgYWxzbyAiX19hZW50ZXJfXygpIiBhbmQgIl9fYWV4aXRfXygpIiBmb3IgZGV0YWlscy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0l0IGlzIGEgIlN5bnRheEVycm9yIiB0byB1c2UgImFzeW5jIHdpdGgiIHN0YXRlbWVudCBvdXRzaWRlIG9mICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnImFzeW5jIGRlZiIgZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdTZWUgYWxzbzogKipQRVAgNDkyKiogLSBDb3JvdXRpbmVzIHdpdGggYXN5bmMgYW5kIGF3YWl0IHN5bnRheFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdbMV0gVGhlIGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZSBpbnZvY2F0aW9uIHN0YWNrIHVubGVzc1xuJworICAgICAgICAgICAgICcgICAgdGhlcmUgaXMgYSAiZmluYWxseSIgY2xhdXNlIHdoaWNoIGhhcHBlbnMgdG8gcmFpc2UgYW5vdGhlclxuJworICAgICAgICAgICAgICcgICAgZXhjZXB0aW9uLiBUaGF0IG5ldyBleGNlcHRpb24gY2F1c2VzIHRoZSBvbGQgb25lIHRvIGJlICcKKyAgICAgICAgICAgICAnbG9zdC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1syXSBDdXJyZW50bHksIGNvbnRyb2wgImZsb3dzIG9mZiB0aGUgZW5kIiBleGNlcHQgaW4gdGhlIGNhc2UgJworICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICcgICAgYW4gZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSAicmV0dXJuIiwgImNvbnRpbnVlIiwgb3JcbicKKyAgICAgICAgICAgICAnICAgICJicmVhayIgc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnWzNdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlXG4nCisgICAgICAgICAgICAgJyAgICBmdW5jdGlvbiBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uXCdzICJfX2RvY19fIlxuJworICAgICAgICAgICAgICIgICAgYXR0cmlidXRlIGFuZCB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9uJ3MgKmRvY3N0cmluZyouXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdbNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgJworICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICcgICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2VcJ3MgIl9fZG9jX18iIGl0ZW0gJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAiICAgIHRoZXJlZm9yZSB0aGUgY2xhc3MncyAqZG9jc3RyaW5nKi5cbiIsCisgJ2NvbnRleHQtbWFuYWdlcnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vyc1xuJworICAgICAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdBICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdydW50aW1lIGNvbnRleHQgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICdiZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnY29udGV4dCBtYW5hZ2VyXG4nCisgICAgICAgICAgICAgICAgICAgICAnaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkICcKKyAgICAgICAgICAgICAgICAgICAgICdydW50aW1lIGNvbnRleHRcbicKKyAgICAgICAgICAgICAgICAgICAgICdmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgYmxvY2sgb2YgY29kZS4gIENvbnRleHQgJworICAgICAgICAgICAgICAgICAgICAgJ21hbmFnZXJzIGFyZSBub3JtYWxseVxuJworICAgICAgICAgICAgICAgICAgICAgJ2ludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uICcKKyAgICAgICAgICAgICAgICAgICAgICdUaGUgd2l0aFxuJworICAgICAgICAgICAgICAgICAgICAgJ3N0YXRlbWVudCksIGJ1dCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRpcmVjdGx5IGludm9raW5nICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGVpciBtZXRob2RzLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1R5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICAgICAncmVzdG9yaW5nIHZhcmlvdXNcbicKKyAgICAgICAgICAgICAgICAgICAgICdraW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsICcKKyAgICAgICAgICAgICAgICAgICAgICdjbG9zaW5nIG9wZW5lZFxuJworICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVzLCBldGMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlIENvbnRleHQgJworICAgICAgICAgICAgICAgICAgICAgJ01hbmFnZXIgVHlwZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZW50ZXJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICcKKyAgICAgICAgICAgICAgICAgICAgICcid2l0aCJcbicKKyAgICAgICAgICAgICAgICAgICAgICIgICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAndGFyZ2V0KHMpXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgc3BlY2lmaWVkIGluIHRoZSAiYXMiIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiAnCisgICAgICAgICAgICAgICAgICAgICAnYW55LlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgRXhpdCB0aGUgcnVudGltZSBjb250ZXh0IHJlbGF0ZWQgdG8gdGhpcyBvYmplY3QuIFRoZSAnCisgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgJworICAgICAgICAgICAgICAgICAgICAgJ2V4aXRlZC4gSWYgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgJworICAgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyB3aWxsXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgYmUgIk5vbmUiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgIElmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvICcKKyAgICAgICAgICAgICAgICAgICAgICdzdXBwcmVzcyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgJworICAgICAgICAgICAgICAgICAgICAgJ2l0IHNob3VsZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlICcKKyAgICAgICAgICAgICAgICAgICAgICdwcm9jZXNzZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBub3JtYWxseSB1cG9uIGV4aXQgZnJvbSB0aGlzIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBOb3RlIHRoYXQgIl9fZXhpdF9fKCkiIG1ldGhvZHMgc2hvdWxkIG5vdCByZXJhaXNlIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAncGFzc2VkLWluXG4nCisgICAgICAgICAgICAgICAgICAgICAiICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICoqUEVQIDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uICJ3aXRoIlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAgc3RhdGVtZW50LlxuJywKKyAnY29udGludWUnOiAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiY29udGludWUiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGNvbnRpbnVlX3N0bXQgOjo9ICJjb250aW51ZSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyJjb250aW51ZSIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSAiZm9yIiBvciAnCisgICAgICAgICAgICAgJyJ3aGlsZSJcbicKKyAgICAgICAgICAgICAnbG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIG9yICcKKyAgICAgICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICAgICAgJ2NsYXVzZSB3aXRoaW4gdGhhdCBsb29wLiAgSXQgY29udGludWVzIHdpdGggdGhlIG5leHQgY3ljbGUgb2YgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnbmVhcmVzdCBlbmNsb3NpbmcgbG9vcC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1doZW4gImNvbnRpbnVlIiBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSAidHJ5IiBzdGF0ZW1lbnQgd2l0aCBhXG4nCisgICAgICAgICAgICAgJyJmaW5hbGx5IiBjbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgJworICAgICAgICAgICAgICdyZWFsbHlcbicKKyAgICAgICAgICAgICAnc3RhcnRpbmcgdGhlIG5leHQgbG9vcCBjeWNsZS5cbicsCisgJ2NvbnZlcnNpb25zJzogJ1xuJworICAgICAgICAgICAgICAgICdBcml0aG1ldGljIGNvbnZlcnNpb25zXG4nCisgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1doZW4gYSBkZXNjcmlwdGlvbiBvZiBhbiBhcml0aG1ldGljIG9wZXJhdG9yIGJlbG93IHVzZXMgdGhlICcKKyAgICAgICAgICAgICAgICAncGhyYXNlXG4nCisgICAgICAgICAgICAgICAgJyJ0aGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCIgdGhpcyAnCisgICAgICAgICAgICAgICAgJ21lYW5zXG4nCisgICAgICAgICAgICAgICAgJ3RoYXQgdGhlIG9wZXJhdG9yIGltcGxlbWVudGF0aW9uIGZvciBidWlsdC1pbiB0eXBlcyB3b3JrcyBhcyAnCisgICAgICAgICAgICAgICAgJ2ZvbGxvd3M6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIElmIGVpdGhlciBhcmd1bWVudCBpcyBhIGNvbXBsZXggbnVtYmVyLCB0aGUgb3RoZXIgaXMgJworICAgICAgICAgICAgICAgICdjb252ZXJ0ZWQgdG9cbicKKyAgICAgICAgICAgICAgICAnICBjb21wbGV4O1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiBvdGhlcndpc2UsIGlmIGVpdGhlciBhcmd1bWVudCBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgJworICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAnICBvdGhlciBpcyBjb252ZXJ0ZWQgdG8gZmxvYXRpbmcgcG9pbnQ7XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqIG90aGVyd2lzZSwgYm90aCBtdXN0IGJlIGludGVnZXJzIGFuZCBubyBjb252ZXJzaW9uIGlzICcKKyAgICAgICAgICAgICAgICAnbmVjZXNzYXJ5LlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnU29tZSBhZGRpdGlvbmFsIHJ1bGVzIGFwcGx5IGZvciBjZXJ0YWluIG9wZXJhdG9ycyAoZS5nLiwgYSAnCisgICAgICAgICAgICAgICAgJ3N0cmluZyBhcyBhXG4nCisgICAgICAgICAgICAgICAgImxlZnQgYXJndW1lbnQgdG8gdGhlICclJyBvcGVyYXRvcikuICBFeHRlbnNpb25zIG11c3QgZGVmaW5lICIKKyAgICAgICAgICAgICAgICAndGhlaXIgb3duXG4nCisgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb24gYmVoYXZpb3IuXG4nLAorICdjdXN0b21pemF0aW9uJzogJ1xuJworICAgICAgICAgICAgICAgICAgJ0Jhc2ljIGN1c3RvbWl6YXRpb25cbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzICpjbHMqLiAgJworICAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiIGlzIGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0ICcKKyAgICAgICAgICAgICAgICAgICdhcyBzdWNoKVxuJworICAgICAgICAgICAgICAgICAgJyAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgJworICAgICAgICAgICAgICAgICAgJ2FzIGl0c1xuJworICAgICAgICAgICAgICAgICAgJyAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlICcKKyAgICAgICAgICAgICAgICAgICdwYXNzZWQgdG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICAnCisgICAgICAgICAgICAgICAgICAnVGhlIHJldHVyblxuJworICAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIG9mICJfX25ld19fKCkiIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICAnKHVzdWFsbHkgYW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZSBvZiAqY2xzKikuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnY2xhc3MgYnlcbicKKyAgICAgICAgICAgICAgICAgICcgICBpbnZva2luZyB0aGUgc3VwZXJjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgdXNpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICAic3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSkiIHdpdGggJworICAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlXG4nCisgICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBJZiAiX19uZXdfXygpIiByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICAnbmV3XG4nCisgICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2luaXRfXyhzZWxmWywgLi4uXSkiLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyAnCisgICAgICAgICAgICAgICAgICAnaW5zdGFuY2UgYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvICcKKyAgICAgICAgICAgICAgICAgICciX19uZXdfXygpIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBJZiAiX19uZXdfXygpIiBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosICcKKyAgICAgICAgICAgICAgICAgICd0aGVuIHRoZSBuZXdcbicKKyAgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZVwncyAiX19pbml0X18oKSIgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fbmV3X18oKSIgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgJworICAgICAgICAgICAgICAgICAgJ2ltbXV0YWJsZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgICdjcmVhdGlvbi4gIEl0XG4nCisgICAgICAgICAgICAgICAgICAnICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiAnCisgICAgICAgICAgICAgICAgICAnb3JkZXIgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW5pdF9fKHNlbGZbLCAuLi5dKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBhZnRlciB0aGUgaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCAoYnkgJworICAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiKSwgYnV0XG4nCisgICAgICAgICAgICAgICAgICAnICAgYmVmb3JlIGl0IGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuICBUaGUgYXJndW1lbnRzIGFyZSAnCisgICAgICAgICAgICAgICAgICAndGhvc2VcbicKKyAgICAgICAgICAgICAgICAgICcgICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgJworICAgICAgICAgICAgICAgICAgJ2NsYXNzIGhhcyBhblxuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2luaXRfXygpIiBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNzXCdzICJfX2luaXRfXygpIiAnCisgICAgICAgICAgICAgICAgICAnbWV0aG9kLCBpZlxuJworICAgICAgICAgICAgICAgICAgJyAgIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciAnCisgICAgICAgICAgICAgICAgICAnaW5pdGlhbGl6YXRpb24gb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICAnICAgIkJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBCZWNhdXNlICJfX25ld19fKCkiIGFuZCAiX19pbml0X18oKSIgd29yayB0b2dldGhlciBpbiAnCisgICAgICAgICAgICAgICAgICAnY29uc3RydWN0aW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2JqZWN0cyAoIl9fbmV3X18oKSIgdG8gY3JlYXRlIGl0LCBhbmQgIl9faW5pdF9fKCkiIHRvICcKKyAgICAgICAgICAgICAgICAgICdjdXN0b21pc2VcbicKKyAgICAgICAgICAgICAgICAgICcgICBpdCksIG5vIG5vbi0iTm9uZSIgdmFsdWUgbWF5IGJlIHJldHVybmVkIGJ5ICcKKyAgICAgICAgICAgICAgICAgICciX19pbml0X18oKSI7IGRvaW5nIHNvXG4nCisgICAgICAgICAgICAgICAgICAnICAgd2lsbCBjYXVzZSBhICJUeXBlRXJyb3IiIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgJworICAgICAgICAgICAgICAgICAgJ2lzIGFsc29cbicKKyAgICAgICAgICAgICAgICAgICcgICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhICJfX2RlbF9fKCkiICcKKyAgICAgICAgICAgICAgICAgICdtZXRob2QsIHRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGRlcml2ZWQgY2xhc3NcJ3MgIl9fZGVsX18oKSIgbWV0aG9kLCBpZiBhbnksIG11c3QgJworICAgICAgICAgICAgICAgICAgJ2V4cGxpY2l0bHkgY2FsbCBpdFxuJworICAgICAgICAgICAgICAgICAgJyAgIHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvciAnCisgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fZGVsX18oKSIgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnaW5zdGFuY2UgYnlcbicKKyAgICAgICAgICAgICAgICAgICcgICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgJworICAgICAgICAgICAgICAgICAgJ2F0IGEgbGF0ZXJcbicKKyAgICAgICAgICAgICAgICAgICcgICB0aW1lIHdoZW4gdGhpcyBuZXcgcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAgJ2d1YXJhbnRlZWQgdGhhdFxuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0IHN0aWxsICcKKyAgICAgICAgICAgICAgICAgICdleGlzdCB3aGVuXG4nCisgICAgICAgICAgICAgICAgICAnICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6ICJkZWwgeCIgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCAieC5fX2RlbF9fKCkiIC0tLSAnCisgICAgICAgICAgICAgICAgICAndGhlIGZvcm1lclxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciAieCIgYnkgb25lLCBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgICdsYXR0ZXIgaXNcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIG9ubHkgY2FsbGVkIHdoZW4gIngiXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICAnCisgICAgICAgICAgICAgICAgICAnU29tZSBjb21tb25cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuICcKKyAgICAgICAgICAgICAgICAgICdvYmplY3QgZnJvbVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZ29pbmcgdG8gemVybyBpbmNsdWRlOiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gJworICAgICAgICAgICAgICAgICAgJ29iamVjdHMgKGUuZy4sXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aCAnCisgICAgICAgICAgICAgICAgICAncGFyZW50IGFuZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZSAnCisgICAgICAgICAgICAgICAgICAnc3RhY2sgZnJhbWUgb2ZcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGEgZnVuY3Rpb24gdGhhdCBjYXVnaHQgYW4gZXhjZXB0aW9uICh0aGUgdHJhY2ViYWNrICcKKyAgICAgICAgICAgICAgICAgICdzdG9yZWQgaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICJzeXMuZXhjX2luZm8oKVsyXSIga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3IgYSAnCisgICAgICAgICAgICAgICAgICAncmVmZXJlbmNlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSB0aGF0IHJhaXNlZCBhbiAnCisgICAgICAgICAgICAgICAgICAndW5oYW5kbGVkXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgJworICAgICAgICAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAic3lzLmxhc3RfdHJhY2ViYWNrIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgJworICAgICAgICAgICAgICAgICAgJ1RoZSBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgJworICAgICAgICAgICAgICAgICAgJ3RoZSBjeWNsZXM7XG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0aGUgc2Vjb25kIGNhbiBiZSByZXNvbHZlZCBieSBmcmVlaW5nIHRoZSByZWZlcmVuY2UgdG8gJworICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgdHJhY2ViYWNrIG9iamVjdCB3aGVuIGl0IGlzIG5vIGxvbmdlciB1c2VmdWwsIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAgJ3RoaXJkIGNhblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyAiTm9uZSIgaW4gInN5cy5sYXN0X3RyYWNlYmFjayIuICcKKyAgICAgICAgICAgICAgICAgICdDaXJjdWxhclxuJworICAgICAgICAgICAgICAgICAgJyAgICAgcmVmZXJlbmNlcyB3aGljaCBhcmUgZ2FyYmFnZSBhcmUgZGV0ZWN0ZWQgYW5kIGNsZWFuZWQgJworICAgICAgICAgICAgICAgICAgJ3VwIHdoZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAiICAgICBjeWNsaWMgZ2FyYmFnZSBjb2xsZWN0b3IgaXMgZW5hYmxlZCAoaXQncyBvbiBieSAiCisgICAgICAgICAgICAgICAgICAnZGVmYXVsdCkuIFJlZmVyXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJnYyIgbW9kdWxlIGZvciBtb3JlICcKKyAgICAgICAgICAgICAgICAgICdpbmZvcm1hdGlvblxuJworICAgICAgICAgICAgICAgICAgJyAgICAgYWJvdXQgdGhpcyB0b3BpYy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciAnCisgICAgICAgICAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciAnCisgICAgICAgICAgICAgICAgICAnZHVyaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB0aGVpciBleGVjdXRpb24gYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCAnCisgICAgICAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICJzeXMuc3RkZXJyIiBpbnN0ZWFkLiBBbHNvLCB3aGVuICJfX2RlbF9fKCkiIGlzICcKKyAgICAgICAgICAgICAgICAgICdpbnZva2VkIGluXG4nCisgICAgICAgICAgICAgICAgICAnICAgICByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZyBkZWxldGVkIChlLmcuLCB3aGVuICcKKyAgICAgICAgICAgICAgICAgICdleGVjdXRpb24gb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgICciX19kZWxfXygpIlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgbWV0aG9kIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBkZWxldGVkIG9yIGluIHRoZSBwcm9jZXNzICcKKyAgICAgICAgICAgICAgICAgICdvZiBiZWluZ1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgdG9ybiBkb3duIChlLmcuIHRoZSBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgJworICAgICAgICAgICAgICAgICAgJ0ZvciB0aGlzXG4nCisgICAgICAgICAgICAgICAgICAnICAgICByZWFzb24sICJfX2RlbF9fKCkiIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSAnCisgICAgICAgICAgICAgICAgICAnbWluaW11bSBuZWVkZWRcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRvIG1haW50YWluIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoICcKKyAgICAgICAgICAgICAgICAgICd2ZXJzaW9uIDEuNSxcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIFB5dGhvbiBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoICcKKyAgICAgICAgICAgICAgICAgICdhIHNpbmdsZVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgJworICAgICAgICAgICAgICAgICAgJ2dsb2JhbHMgYXJlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgJworICAgICAgICAgICAgICAgICAgJ3RoaXMgbWF5XG4nCisgICAgICAgICAgICAgICAgICAnICAgICBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgJworICAgICAgICAgICAgICAgICAgJ2F2YWlsYWJsZSBhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIHRpbWUgd2hlbiB0aGUgIl9fZGVsX18oKSIgbWV0aG9kIGlzIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZXByX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgdGhlICJyZXByKCkiIGJ1aWx0LWluIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlICcKKyAgICAgICAgICAgICAgICAgICcib2ZmaWNpYWwiXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgJworICAgICAgICAgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBzaG91bGQgbG9vayBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSAnCisgICAgICAgICAgICAgICAgICAndXNlZCB0b1xuJworICAgICAgICAgICAgICAgICAgJyAgIHJlY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBlbnZpcm9ubWVudCkuICBJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdmb3JtXG4nCisgICAgICAgICAgICAgICAgICAnICAgIjwuLi5zb21lIHVzZWZ1bCBkZXNjcmlwdGlvbi4uLj4iIHNob3VsZCBiZSByZXR1cm5lZC4gJworICAgICAgICAgICAgICAgICAgJ1RoZSByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgICcgICB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgICciX19yZXByX18oKSIgYnV0XG4nCisgICAgICAgICAgICAgICAgICAnICAgbm90ICJfX3N0cl9fKCkiLCB0aGVuICJfX3JlcHJfXygpIiBpcyBhbHNvIHVzZWQgd2hlbiBhbiAnCisgICAgICAgICAgICAgICAgICAnImluZm9ybWFsIlxuJworICAgICAgICAgICAgICAgICAgJyAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyAnCisgICAgICAgICAgICAgICAgICAncmVxdWlyZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgJworICAgICAgICAgICAgICAgICAgJ3RoYXQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVwcmVzZW50YXRpb24gaXMgaW5mb3JtYXRpb24tcmljaCBhbmQgdW5hbWJpZ3VvdXMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc3RyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgInN0cihvYmplY3QpIiBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAnCisgICAgICAgICAgICAgICAgICAnImZvcm1hdCgpIiBhbmRcbicKKyAgICAgICAgICAgICAgICAgICcgICAicHJpbnQoKSIgdG8gY29tcHV0ZSB0aGUgImluZm9ybWFsIiBvciBuaWNlbHkgcHJpbnRhYmxlICcKKyAgICAgICAgICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAgICAgICAgICcgICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSAnCisgICAgICAgICAgICAgICAgICAnc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSAib2JqZWN0Ll9fcmVwcl9fKCkiIGluIHRoYXQgJworICAgICAgICAgICAgICAgICAgJ3RoZXJlIGlzIG5vXG4nCisgICAgICAgICAgICAgICAgICAnICAgZXhwZWN0YXRpb24gdGhhdCAiX19zdHJfXygpIiByZXR1cm4gYSB2YWxpZCBQeXRob24gJworICAgICAgICAgICAgICAgICAgJ2V4cHJlc3Npb246IGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZSByZXByZXNlbnRhdGlvbiBjYW4gYmUgdXNlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ5IHRoZSBidWlsdC1pbiB0eXBlICcKKyAgICAgICAgICAgICAgICAgICcib2JqZWN0IlxuJworICAgICAgICAgICAgICAgICAgJyAgIGNhbGxzICJvYmplY3QuX19yZXByX18oKSIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYnl0ZXNfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAiYnl0ZXMoKSIgdG8gY29tcHV0ZSBhIGJ5dGUtc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICdyZXByZXNlbnRhdGlvbiBvZiBhblxuJworICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC4gVGhpcyBzaG91bGQgcmV0dXJuIGEgImJ5dGVzIiBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5IHRoZSAiZm9ybWF0KCkiIGJ1aWx0LWluIGZ1bmN0aW9uLCBhbmQgYnkgJworICAgICAgICAgICAgICAgICAgJ2V4dGVuc2lvbixcbicKKyAgICAgICAgICAgICAgICAgICcgICBldmFsdWF0aW9uIG9mIGZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICAnInN0ci5mb3JtYXQoKSJcbicKKyAgICAgICAgICAgICAgICAgICcgICBtZXRob2QsIHRvIHByb2R1Y2UgYSAiZm9ybWF0dGVkIiBzdHJpbmcgcmVwcmVzZW50YXRpb24gJworICAgICAgICAgICAgICAgICAgJ29mIGFuXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LiBUaGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyBhIHN0cmluZyB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICdjb250YWlucyBhXG4nCisgICAgICAgICAgICAgICAgICAnICAgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBkZXNpcmVkLiBUaGUgJworICAgICAgICAgICAgICAgICAgJ2ludGVycHJldGF0aW9uXG4nCisgICAgICAgICAgICAgICAgICAnICAgb2YgdGhlICJmb3JtYXRfc3BlYyIgYXJndW1lbnQgaXMgdXAgdG8gdGhlIHR5cGUgJworICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGluZ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2Zvcm1hdF9fKCkiLCBob3dldmVyIG1vc3QgY2xhc3NlcyB3aWxsIGVpdGhlciAnCisgICAgICAgICAgICAgICAgICAnZGVsZWdhdGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBmb3JtYXR0aW5nIHRvIG9uZSBvZiB0aGUgYnVpbHQtaW4gdHlwZXMsIG9yIHVzZSBhICcKKyAgICAgICAgICAgICAgICAgICdzaW1pbGFyXG4nCisgICAgICAgICAgICAgICAgICAnICAgZm9ybWF0dGluZyBvcHRpb24gc3ludGF4LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFNlZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIGZvciBhIGRlc2NyaXB0aW9uICcKKyAgICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdGFuZGFyZCBmb3JtYXR0aW5nIHN5bnRheC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAnCisgICAgICAgICAgICAgICAgICAnIm9iamVjdCIgaXRzZWxmXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmFpc2VzIGEgIlR5cGVFcnJvciIgaWYgcGFzc2VkIGFueSBub24tZW1wdHkgc3RyaW5nLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMuIFRoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzICcKKyAgICAgICAgICAgICAgICAgICdpcyBhc1xuJworICAgICAgICAgICAgICAgICAgJyAgIGZvbGxvd3M6ICJ4PHkiIGNhbGxzICJ4Ll9fbHRfXyh5KSIsICJ4PD15IiBjYWxscyAnCisgICAgICAgICAgICAgICAgICAnInguX19sZV9fKHkpIixcbicKKyAgICAgICAgICAgICAgICAgICcgICAieD09eSIgY2FsbHMgInguX19lcV9fKHkpIiwgInghPXkiIGNhbGxzICJ4Ll9fbmVfXyh5KSIsICcKKyAgICAgICAgICAgICAgICAgICcieD55IiBjYWxsc1xuJworICAgICAgICAgICAgICAgICAgJyAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uICcKKyAgICAgICAgICAgICAgICAgICciTm90SW1wbGVtZW50ZWQiXG4nCisgICAgICAgICAgICAgICAgICAnICAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gcGFpciAnCisgICAgICAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgJworICAgICAgICAgICAgICAgICAgJ3JldHVybmVkIGZvciBhXG4nCisgICAgICAgICAgICAgICAgICAnICAgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhbiByZXR1cm4gJworICAgICAgICAgICAgICAgICAgJ2FueSB2YWx1ZSxcbicKKyAgICAgICAgICAgICAgICAgICcgICBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGEgQm9vbGVhbiAnCisgICAgICAgICAgICAgICAgICAnY29udGV4dCAoZS5nLixcbicKKyAgICAgICAgICAgICAgICAgICcgICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAnCisgICAgICAgICAgICAgICAgICAnImJvb2woKSJcbicKKyAgICAgICAgICAgICAgICAgICcgICBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHQgaXMgdHJ1ZSBvciAnCisgICAgICAgICAgICAgICAgICAnZmFsc2UuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQnkgZGVmYXVsdCwgIl9fbmVfXygpIiBkZWxlZ2F0ZXMgdG8gIl9fZXFfXygpIiBhbmQgJworICAgICAgICAgICAgICAgICAgJ2ludmVydHMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVzdWx0IHVubGVzcyBpdCBpcyAiTm90SW1wbGVtZW50ZWQiLiAgVGhlcmUgYXJlIG5vICcKKyAgICAgICAgICAgICAgICAgICdvdGhlciBpbXBsaWVkXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGZvciAnCisgICAgICAgICAgICAgICAgICAnZXhhbXBsZSwgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgdHJ1dGggb2YgIih4PHkgb3IgeD09eSkiIGRvZXMgbm90IGltcGx5ICJ4PD15Ii4gVG8gJworICAgICAgICAgICAgICAgICAgJ2F1dG9tYXRpY2FsbHlcbicKKyAgICAgICAgICAgICAgICAgICcgICBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdCAnCisgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9uLCBzZWVcbicKKyAgICAgICAgICAgICAgICAgICcgICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFNlZSB0aGUgcGFyYWdyYXBoIG9uICJfX2hhc2hfXygpIiBmb3Igc29tZSBpbXBvcnRhbnQgJworICAgICAgICAgICAgICAgICAgJ25vdGVzIG9uXG4nCisgICAgICAgICAgICAgICAgICAnICAgY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tICcKKyAgICAgICAgICAgICAgICAgICdjb21wYXJpc29uXG4nCisgICAgICAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAnCisgICAgICAgICAgICAgICAgICAnKHRvIGJlIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgICcgICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICAnYnV0IHRoZSByaWdodFxuJworICAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlICcKKyAgICAgICAgICAgICAgICAgICJlYWNoIG90aGVyJ3NcbiIKKyAgICAgICAgICAgICAgICAgICcgICByZWZsZWN0aW9uLCAiX19sZV9fKCkiIGFuZCAiX19nZV9fKCkiIGFyZSBlYWNoIG90aGVyXCdzICcKKyAgICAgICAgICAgICAgICAgICdyZWZsZWN0aW9uLFxuJworICAgICAgICAgICAgICAgICAgJyAgIGFuZCAiX19lcV9fKCkiIGFuZCAiX19uZV9fKCkiIGFyZSB0aGVpciBvd24gcmVmbGVjdGlvbi4gJworICAgICAgICAgICAgICAgICAgJ0lmIHRoZVxuJworICAgICAgICAgICAgICAgICAgIiAgIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGFuZCByaWdodCBvcGVyYW5kJ3MgIgorICAgICAgICAgICAgICAgICAgJ3R5cGUgaXMgYVxuJworICAgICAgICAgICAgICAgICAgIiAgIGRpcmVjdCBvciBpbmRpcmVjdCBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kJ3MgdHlwZSwgIgorICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgJyAgIHJlZmxlY3RlZCBtZXRob2Qgb2YgdGhlIHJpZ2h0IG9wZXJhbmQgaGFzIHByaW9yaXR5LCAnCisgICAgICAgICAgICAgICAgICAnb3RoZXJ3aXNlIHRoZVxuJworICAgICAgICAgICAgICAgICAgIiAgIGxlZnQgb3BlcmFuZCdzIG1ldGhvZCBoYXMgcHJpb3JpdHkuICBWaXJ0dWFsIHN1YmNsYXNzaW5nICIKKyAgICAgICAgICAgICAgICAgICdpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2hhc2hfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiAiaGFzaCgpIiBhbmQgZm9yIG9wZXJhdGlvbnMgJworICAgICAgICAgICAgICAgICAgJ29uIG1lbWJlcnNcbicKKyAgICAgICAgICAgICAgICAgICcgICBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nICJzZXQiLCAiZnJvemVuc2V0IiwgYW5kICcKKyAgICAgICAgICAgICAgICAgICciZGljdCIuXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9faGFzaF9fKCkiIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5ICcKKyAgICAgICAgICAgICAgICAgICdyZXF1aXJlZCBwcm9wZXJ0eVxuJworICAgICAgICAgICAgICAgICAgJyAgIGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWUgaGFzaCAnCisgICAgICAgICAgICAgICAgICAndmFsdWU7IGl0IGlzXG4nCisgICAgICAgICAgICAgICAgICAnICAgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZyBleGNsdXNpdmUgJworICAgICAgICAgICAgICAgICAgJ29yKSB0aGUgaGFzaFxuJworICAgICAgICAgICAgICAgICAgJyAgIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0IGFsc28gcGxheSBhICcKKyAgICAgICAgICAgICAgICAgICdwYXJ0IGluXG4nCisgICAgICAgICAgICAgICAgICAnICAgY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6ICJoYXNoKCkiIHRydW5jYXRlcyB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhbiAnCisgICAgICAgICAgICAgICAgICAib2JqZWN0J3NcbiIKKyAgICAgICAgICAgICAgICAgICcgICAgIGN1c3RvbSAiX19oYXNoX18oKSIgbWV0aG9kIHRvIHRoZSBzaXplIG9mIGEgJworICAgICAgICAgICAgICAgICAgJyJQeV9zc2l6ZV90Ii4gIFRoaXNcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGlzIHR5cGljYWxseSA4IGJ5dGVzIG9uIDY0LWJpdCBidWlsZHMgYW5kIDQgYnl0ZXMgb24gJworICAgICAgICAgICAgICAgICAgJzMyLWJpdFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgYnVpbGRzLiBJZiBhbiBvYmplY3RcJ3MgICAiX19oYXNoX18oKSIgbXVzdCAnCisgICAgICAgICAgICAgICAgICAnaW50ZXJvcGVyYXRlIG9uIGJ1aWxkc1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgb2YgZGlmZmVyZW50IGJpdCBzaXplcywgYmUgc3VyZSB0byBjaGVjayB0aGUgd2lkdGggb24gJworICAgICAgICAgICAgICAgICAgJ2FsbFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgc3VwcG9ydGVkIGJ1aWxkcy4gIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCAnCisgICAgICAgICAgICAgICAgICAnInB5dGhvbiAtY1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgImltcG9ydCBzeXM7IHByaW50KHN5cy5oYXNoX2luZm8ud2lkdGgpIiIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYW4gIl9fZXFfXygpIiBtZXRob2QgaXQgJworICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBub3RcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZWZpbmUgYSAiX19oYXNoX18oKSIgb3BlcmF0aW9uIGVpdGhlcjsgaWYgaXQgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICAnIl9fZXFfXygpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIGJ1dCBub3QgIl9faGFzaF9fKCkiLCBpdHMgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSAnCisgICAgICAgICAgICAgICAgICAnYXMgaXRlbXMgaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBoYXNoYWJsZSBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3MgZGVmaW5lcyBtdXRhYmxlICcKKyAgICAgICAgICAgICAgICAgICdvYmplY3RzIGFuZFxuJworICAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudHMgYW4gIl9fZXFfXygpIiBtZXRob2QsIGl0IHNob3VsZCBub3QgJworICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAgJyAgICJfX2hhc2hfXygpIiwgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhhc2hhYmxlICcKKyAgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9uc1xuJworICAgICAgICAgICAgICAgICAgIiAgIHJlcXVpcmVzIHRoYXQgYSBrZXkncyBoYXNoIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlICIKKyAgICAgICAgICAgICAgICAgICJvYmplY3QncyBoYXNoXG4iCisgICAgICAgICAgICAgICAgICAnICAgdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZSBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgIl9fZXFfXygpIiBhbmQgIl9faGFzaF9fKCkiICcKKyAgICAgICAgICAgICAgICAgICdtZXRob2RzIGJ5XG4nCisgICAgICAgICAgICAgICAgICAnICAgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCAnCisgICAgICAgICAgICAgICAgICAnd2l0aFxuJworICAgICAgICAgICAgICAgICAgJyAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZSBzdWNoXG4nCisgICAgICAgICAgICAgICAgICAnICAgdGhhdCAieCA9PSB5IiBpbXBsaWVzIGJvdGggdGhhdCAieCBpcyB5IiBhbmQgImhhc2goeCkgPT0gJworICAgICAgICAgICAgICAgICAgJ2hhc2goeSkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIEEgY2xhc3MgdGhhdCBvdmVycmlkZXMgIl9fZXFfXygpIiBhbmQgZG9lcyBub3QgZGVmaW5lICcKKyAgICAgICAgICAgICAgICAgICciX19oYXNoX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICcgICB3aWxsIGhhdmUgaXRzICJfX2hhc2hfXygpIiBpbXBsaWNpdGx5IHNldCB0byAiTm9uZSIuICAnCisgICAgICAgICAgICAgICAgICAnV2hlbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIgbWV0aG9kIG9mIGEgY2xhc3MgaXMgIk5vbmUiLCBpbnN0YW5jZXMgb2YgJworICAgICAgICAgICAgICAgICAgJ3RoZSBjbGFzc1xuJworICAgICAgICAgICAgICAgICAgJyAgIHdpbGwgcmFpc2UgYW4gYXBwcm9wcmlhdGUgIlR5cGVFcnJvciIgd2hlbiBhIHByb2dyYW0gJworICAgICAgICAgICAgICAgICAgJ2F0dGVtcHRzIHRvXG4nCisgICAgICAgICAgICAgICAgICAnICAgcmV0cmlldmUgdGhlaXIgaGFzaCB2YWx1ZSwgYW5kIHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgJworICAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgICcgICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgImlzaW5zdGFuY2Uob2JqLCAnCisgICAgICAgICAgICAgICAgICAnY29sbGVjdGlvbnMuSGFzaGFibGUpIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluICcKKyAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBpbXBsZW1lbnRhdGlvbiBvZiAiX19oYXNoX18oKSIgZnJvbSBhIHBhcmVudCBjbGFzcywgdGhlICcKKyAgICAgICAgICAgICAgICAgICdpbnRlcnByZXRlclxuJworICAgICAgICAgICAgICAgICAgJyAgIG11c3QgYmUgdG9sZCB0aGlzIGV4cGxpY2l0bHkgYnkgc2V0dGluZyAiX19oYXNoX18gPVxuJworICAgICAgICAgICAgICAgICAgJyAgIDxQYXJlbnRDbGFzcz4uX19oYXNoX18iLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSAiX19lcV9fKCkiIHdpc2hlcyB0byAnCisgICAgICAgICAgICAgICAgICAnc3VwcHJlc3NcbicKKyAgICAgICAgICAgICAgICAgICcgICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgICcgICBkZWZpbml0aW9uLiBBIGNsYXNzIHdoaWNoIGRlZmluZXMgaXRzIG93biAiX19oYXNoX18oKSIgJworICAgICAgICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICAgICAgICcgICBleHBsaWNpdGx5IHJhaXNlcyBhICJUeXBlRXJyb3IiIHdvdWxkIGJlIGluY29ycmVjdGx5ICcKKyAgICAgICAgICAgICAgICAgICdpZGVudGlmaWVkIGFzXG4nCisgICAgICAgICAgICAgICAgICAnICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiICcKKyAgICAgICAgICAgICAgICAgICdjYWxsLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciwgYnl0ZXMgJworICAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZGF0ZXRpbWUgb2JqZWN0cyBhcmUgInNhbHRlZCIgd2l0aCBhbiB1bnByZWRpY3RhYmxlICcKKyAgICAgICAgICAgICAgICAgICdyYW5kb20gdmFsdWUuXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBBbHRob3VnaCB0aGV5IHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCAnCisgICAgICAgICAgICAgICAgICAnUHl0aG9uXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBwcm9jZXNzLCB0aGV5IGFyZSBub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCAnCisgICAgICAgICAgICAgICAgICAnaW52b2NhdGlvbnMgb2ZcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIFB5dGhvbi5UaGlzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgcHJvdGVjdGlvbiBhZ2FpbnN0ICcKKyAgICAgICAgICAgICAgICAgICdhIGRlbmlhbC1cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIG9mLXNlcnZpY2UgY2F1c2VkIGJ5IGNhcmVmdWxseS1jaG9zZW4gaW5wdXRzIHRoYXQgJworICAgICAgICAgICAgICAgICAgJ2V4cGxvaXQgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgICB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sIE8obl4yKSAnCisgICAgICAgICAgICAgICAgICAnY29tcGxleGl0eS5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgIFNlZSAnCisgICAgICAgICAgICAgICAgICAnaHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sIGZvclxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZGV0YWlscy5DaGFuZ2luZyBoYXNoIHZhbHVlcyBhZmZlY3RzIHRoZSBpdGVyYXRpb24gJworICAgICAgICAgICAgICAgICAgJ29yZGVyIG9mXG4nCisgICAgICAgICAgICAgICAgICAnICAgICBkaWN0cywgc2V0cyBhbmQgb3RoZXIgbWFwcGluZ3MuICBQeXRob24gaGFzIG5ldmVyIG1hZGUgJworICAgICAgICAgICAgICAgICAgJ2d1YXJhbnRlZXNcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIGFib3V0IHRoaXMgb3JkZXJpbmcgKGFuZCBpdCB0eXBpY2FsbHkgdmFyaWVzIGJldHdlZW4gJworICAgICAgICAgICAgICAgICAgJzMyLWJpdCBhbmRcbicKKyAgICAgICAgICAgICAgICAgICcgICAgIDY0LWJpdCBidWlsZHMpLlNlZSBhbHNvICJQWVRIT05IQVNIU0VFRCIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgJworICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYm9vbF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gJworICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvblxuJworICAgICAgICAgICAgICAgICAgJyAgICJib29sKCkiOyBzaG91bGQgcmV0dXJuICJGYWxzZSIgb3IgIlRydWUiLiAgV2hlbiB0aGlzICcKKyAgICAgICAgICAgICAgICAgICdtZXRob2QgaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAnICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgJworICAgICAgICAgICAgICAgICAgJ3RoZSBvYmplY3QgaXNcbicKKyAgICAgICAgICAgICAgICAgICcgICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiAgSWYgYSBjbGFzcyAnCisgICAgICAgICAgICAgICAgICAnZGVmaW5lc1xuJworICAgICAgICAgICAgICAgICAgJyAgIG5laXRoZXIgIl9fbGVuX18oKSIgbm9yICJfX2Jvb2xfXygpIiwgYWxsIGl0cyBpbnN0YW5jZXMgJworICAgICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQgdHJ1ZS5cbicsCisgJ2RlYnVnZ2VyJzogJ1xuJworICAgICAgICAgICAgICcicGRiIiAtLS0gVGhlIFB5dGhvbiBEZWJ1Z2dlclxuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnKipTb3VyY2UgY29kZToqKiBMaWIvcGRiLnB5XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgbW9kdWxlICJwZGIiIGRlZmluZXMgYW4gaW50ZXJhY3RpdmUgc291cmNlIGNvZGUgZGVidWdnZXIgJworICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAnUHl0aG9uIHByb2dyYW1zLiAgSXQgc3VwcG9ydHMgc2V0dGluZyAoY29uZGl0aW9uYWwpIGJyZWFrcG9pbnRzICcKKyAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgJ3NpbmdsZSBzdGVwcGluZyBhdCB0aGUgc291cmNlIGxpbmUgbGV2ZWwsIGluc3BlY3Rpb24gb2Ygc3RhY2sgJworICAgICAgICAgICAgICdmcmFtZXMsXG4nCisgICAgICAgICAgICAgJ3NvdXJjZSBjb2RlIGxpc3RpbmcsIGFuZCBldmFsdWF0aW9uIG9mIGFyYml0cmFyeSBQeXRob24gY29kZSBpbiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdjb250ZXh0IG9mIGFueSBzdGFjayBmcmFtZS4gIEl0IGFsc28gc3VwcG9ydHMgcG9zdC1tb3J0ZW0gJworICAgICAgICAgICAgICdkZWJ1Z2dpbmdcbicKKyAgICAgICAgICAgICAnYW5kIGNhbiBiZSBjYWxsZWQgdW5kZXIgcHJvZ3JhbSBjb250cm9sLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGRlYnVnZ2VyIGlzIGV4dGVuc2libGUgLS0gaXQgaXMgYWN0dWFsbHkgZGVmaW5lZCBhcyB0aGUgJworICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICciUGRiIi4gVGhpcyBpcyBjdXJyZW50bHkgdW5kb2N1bWVudGVkIGJ1dCBlYXNpbHkgdW5kZXJzdG9vZCBieSAnCisgICAgICAgICAgICAgJ3JlYWRpbmdcbicKKyAgICAgICAgICAgICAndGhlIHNvdXJjZS4gIFRoZSBleHRlbnNpb24gaW50ZXJmYWNlIHVzZXMgdGhlIG1vZHVsZXMgImJkYiIgYW5kICcKKyAgICAgICAgICAgICAnImNtZCIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgZGVidWdnZXJcJ3MgcHJvbXB0IGlzICIoUGRiKSIuIFR5cGljYWwgdXNhZ2UgdG8gcnVuIGEgJworICAgICAgICAgICAgICdwcm9ncmFtIHVuZGVyXG4nCisgICAgICAgICAgICAgJ2NvbnRyb2wgb2YgdGhlIGRlYnVnZ2VyIGlzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgPj4+IGltcG9ydCBwZGJcbicKKyAgICAgICAgICAgICAnICAgPj4+IGltcG9ydCBteW1vZHVsZVxuJworICAgICAgICAgICAgICIgICA+Pj4gcGRiLnJ1bignbXltb2R1bGUudGVzdCgpJylcbiIKKyAgICAgICAgICAgICAnICAgPiA8c3RyaW5nPigwKT8oKVxuJworICAgICAgICAgICAgICcgICAoUGRiKSBjb250aW51ZVxuJworICAgICAgICAgICAgICcgICA+IDxzdHJpbmc+KDEpPygpXG4nCisgICAgICAgICAgICAgJyAgIChQZGIpIGNvbnRpbnVlXG4nCisgICAgICAgICAgICAgIiAgIE5hbWVFcnJvcjogJ3NwYW0nXG4iCisgICAgICAgICAgICAgJyAgID4gPHN0cmluZz4oMSk/KClcbicKKyAgICAgICAgICAgICAnICAgKFBkYilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjM6IFRhYi1jb21wbGV0aW9uIHZpYSB0aGUgInJlYWRsaW5lIiBtb2R1bGUgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdhdmFpbGFibGUgZm9yIGNvbW1hbmRzIGFuZCBjb21tYW5kIGFyZ3VtZW50cywgZS5nLiB0aGUgY3VycmVudCAnCisgICAgICAgICAgICAgJ2dsb2JhbFxuJworICAgICAgICAgICAgICdhbmQgbG9jYWwgbmFtZXMgYXJlIG9mZmVyZWQgYXMgYXJndW1lbnRzIG9mIHRoZSAicCIgY29tbWFuZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyJwZGIucHkiIGNhbiBhbHNvIGJlIGludm9rZWQgYXMgYSBzY3JpcHQgdG8gZGVidWcgb3RoZXIgJworICAgICAgICAgICAgICdzY3JpcHRzLiAgRm9yXG4nCisgICAgICAgICAgICAgJ2V4YW1wbGU6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBweXRob24zIC1tIHBkYiBteXNjcmlwdC5weVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnV2hlbiBpbnZva2VkIGFzIGEgc2NyaXB0LCBwZGIgd2lsbCBhdXRvbWF0aWNhbGx5IGVudGVyICcKKyAgICAgICAgICAgICAncG9zdC1tb3J0ZW1cbicKKyAgICAgICAgICAgICAnZGVidWdnaW5nIGlmIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIGV4aXRzIGFibm9ybWFsbHkuICBBZnRlciAnCisgICAgICAgICAgICAgJ3Bvc3QtXG4nCisgICAgICAgICAgICAgJ21vcnRlbSBkZWJ1Z2dpbmcgKG9yIGFmdGVyIG5vcm1hbCBleGl0IG9mIHRoZSBwcm9ncmFtKSwgcGRiICcKKyAgICAgICAgICAgICAnd2lsbFxuJworICAgICAgICAgICAgICJyZXN0YXJ0IHRoZSBwcm9ncmFtLiAgQXV0b21hdGljIHJlc3RhcnRpbmcgcHJlc2VydmVzIHBkYidzIHN0YXRlICIKKyAgICAgICAgICAgICAnKHN1Y2hcbicKKyAgICAgICAgICAgICAnYXMgYnJlYWtwb2ludHMpIGFuZCBpbiBtb3N0IGNhc2VzIGlzIG1vcmUgdXNlZnVsIHRoYW4gcXVpdHRpbmcgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAiZGVidWdnZXIgdXBvbiBwcm9ncmFtJ3MgZXhpdC5cbiIKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ05ldyBpbiB2ZXJzaW9uIDMuMjogInBkYi5weSIgbm93IGFjY2VwdHMgYSAiLWMiIG9wdGlvbiB0aGF0ICcKKyAgICAgICAgICAgICAnZXhlY3V0ZXNcbicKKyAgICAgICAgICAgICAnY29tbWFuZHMgYXMgaWYgZ2l2ZW4gaW4gYSAiLnBkYnJjIiBmaWxlLCBzZWUgRGVidWdnZXIgQ29tbWFuZHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgdHlwaWNhbCB1c2FnZSB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlciBmcm9tIGEgcnVubmluZyAnCisgICAgICAgICAgICAgJ3Byb2dyYW0gaXNcbicKKyAgICAgICAgICAgICAndG8gaW5zZXJ0XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2F0IHRoZSBsb2NhdGlvbiB5b3Ugd2FudCB0byBicmVhayBpbnRvIHRoZSBkZWJ1Z2dlci4gIFlvdSBjYW4gJworICAgICAgICAgICAgICd0aGVuXG4nCisgICAgICAgICAgICAgJ3N0ZXAgdGhyb3VnaCB0aGUgY29kZSBmb2xsb3dpbmcgdGhpcyBzdGF0ZW1lbnQsIGFuZCBjb250aW51ZSAnCisgICAgICAgICAgICAgJ3J1bm5pbmdcbicKKyAgICAgICAgICAgICAnd2l0aG91dCB0aGUgZGVidWdnZXIgdXNpbmcgdGhlICJjb250aW51ZSIgY29tbWFuZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSB0eXBpY2FsIHVzYWdlIHRvIGluc3BlY3QgYSBjcmFzaGVkIHByb2dyYW0gaXM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICA+Pj4gaW1wb3J0IHBkYlxuJworICAgICAgICAgICAgICcgICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4nCisgICAgICAgICAgICAgJyAgID4+PiBteW1vZHVsZS50ZXN0KClcbicKKyAgICAgICAgICAgICAnICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbicKKyAgICAgICAgICAgICAnICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSA0LCBpbiB0ZXN0XG4nCisgICAgICAgICAgICAgJyAgICAgICB0ZXN0MigpXG4nCisgICAgICAgICAgICAgJyAgICAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgMywgaW4gdGVzdDJcbicKKyAgICAgICAgICAgICAnICAgICAgIHByaW50KHNwYW0pXG4nCisgICAgICAgICAgICAgJyAgIE5hbWVFcnJvcjogc3BhbVxuJworICAgICAgICAgICAgICcgICA+Pj4gcGRiLnBtKClcbicKKyAgICAgICAgICAgICAnICAgPiAuL215bW9kdWxlLnB5KDMpdGVzdDIoKVxuJworICAgICAgICAgICAgICcgICAtPiBwcmludChzcGFtKVxuJworICAgICAgICAgICAgICcgICAoUGRiKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOyBlYWNoIGVudGVycyB0aGUgJworICAgICAgICAgICAgICdkZWJ1Z2dlclxuJworICAgICAgICAgICAgICdpbiBhIHNsaWdodGx5IGRpZmZlcmVudCB3YXk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwZGIucnVuKHN0YXRlbWVudCwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEV4ZWN1dGUgdGhlICpzdGF0ZW1lbnQqIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgb2JqZWN0KSAnCisgICAgICAgICAgICAgJ3VuZGVyXG4nCisgICAgICAgICAgICAgJyAgIGRlYnVnZ2VyIGNvbnRyb2wuICBUaGUgZGVidWdnZXIgcHJvbXB0IGFwcGVhcnMgYmVmb3JlIGFueSAnCisgICAgICAgICAgICAgJ2NvZGUgaXNcbicKKyAgICAgICAgICAgICAnICAgZXhlY3V0ZWQ7IHlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzIGFuZCB0eXBlICJjb250aW51ZSIsIG9yIHlvdSAnCisgICAgICAgICAgICAgJ2NhblxuJworICAgICAgICAgICAgICcgICBzdGVwIHRocm91Z2ggdGhlIHN0YXRlbWVudCB1c2luZyAic3RlcCIgb3IgIm5leHQiIChhbGwgdGhlc2VcbicKKyAgICAgICAgICAgICAnICAgY29tbWFuZHMgYXJlIGV4cGxhaW5lZCBiZWxvdykuICBUaGUgb3B0aW9uYWwgKmdsb2JhbHMqIGFuZCAnCisgICAgICAgICAgICAgJypsb2NhbHMqXG4nCisgICAgICAgICAgICAgJyAgIGFyZ3VtZW50cyBzcGVjaWZ5IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBpcyAnCisgICAgICAgICAgICAgJ2V4ZWN1dGVkOyBieVxuJworICAgICAgICAgICAgICcgICBkZWZhdWx0IHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBtb2R1bGUgIl9fbWFpbl9fIiBpcyB1c2VkLiAgJworICAgICAgICAgICAgICcoU2VlIHRoZVxuJworICAgICAgICAgICAgICcgICBleHBsYW5hdGlvbiBvZiB0aGUgYnVpbHQtaW4gImV4ZWMoKSIgb3IgImV2YWwoKSIgZnVuY3Rpb25zLilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BkYi5ydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFdmFsdWF0ZSB0aGUgKmV4cHJlc3Npb24qIChnaXZlbiBhcyBhIHN0cmluZyBvciBhIGNvZGUgJworICAgICAgICAgICAgICdvYmplY3QpXG4nCisgICAgICAgICAgICAgJyAgIHVuZGVyIGRlYnVnZ2VyIGNvbnRyb2wuICBXaGVuICJydW5ldmFsKCkiIHJldHVybnMsIGl0IHJldHVybnMgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uICBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyICcKKyAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAnICAgInJ1bigpIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BkYi5ydW5jYWxsKGZ1bmN0aW9uLCAqYXJncywgKiprd2RzKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQ2FsbCB0aGUgKmZ1bmN0aW9uKiAoYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LCBub3QgYSAnCisgICAgICAgICAgICAgJ3N0cmluZylcbicKKyAgICAgICAgICAgICAnICAgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAgV2hlbiAicnVuY2FsbCgpIiByZXR1cm5zLCBpdCAnCisgICAgICAgICAgICAgJ3JldHVybnNcbicKKyAgICAgICAgICAgICAnICAgd2hhdGV2ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJuZWQuICBUaGUgZGVidWdnZXIgcHJvbXB0ICcKKyAgICAgICAgICAgICAnYXBwZWFyc1xuJworICAgICAgICAgICAgICcgICBhcyBzb29uIGFzIHRoZSBmdW5jdGlvbiBpcyBlbnRlcmVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncGRiLnNldF90cmFjZSgpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFbnRlciB0aGUgZGVidWdnZXIgYXQgdGhlIGNhbGxpbmcgc3RhY2sgZnJhbWUuICBUaGlzIGlzICcKKyAgICAgICAgICAgICAndXNlZnVsIHRvXG4nCisgICAgICAgICAgICAgJyAgIGhhcmQtY29kZSBhIGJyZWFrcG9pbnQgYXQgYSBnaXZlbiBwb2ludCBpbiBhIHByb2dyYW0sIGV2ZW4gaWYgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgY29kZSBpcyBub3Qgb3RoZXJ3aXNlIGJlaW5nIGRlYnVnZ2VkIChlLmcuIHdoZW4gYW4gYXNzZXJ0aW9uXG4nCisgICAgICAgICAgICAgJyAgIGZhaWxzKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BkYi5wb3N0X21vcnRlbSh0cmFjZWJhY2s9Tm9uZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgZ2l2ZW4gKnRyYWNlYmFjayogb2JqZWN0LiAgJworICAgICAgICAgICAgICdJZiBub1xuJworICAgICAgICAgICAgICcgICAqdHJhY2ViYWNrKiBpcyBnaXZlbiwgaXQgdXNlcyB0aGUgb25lIG9mIHRoZSBleGNlcHRpb24gdGhhdCAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJyAgIGN1cnJlbnRseSBiZWluZyBoYW5kbGVkIChhbiBleGNlcHRpb24gbXVzdCBiZSBiZWluZyBoYW5kbGVkICcKKyAgICAgICAgICAgICAnaWYgdGhlXG4nCisgICAgICAgICAgICAgJyAgIGRlZmF1bHQgaXMgdG8gYmUgdXNlZCkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdwZGIucG0oKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSB0cmFjZWJhY2sgZm91bmQgaW5cbicKKyAgICAgICAgICAgICAnICAgInN5cy5sYXN0X3RyYWNlYmFjayIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgInJ1bioiIGZ1bmN0aW9ucyBhbmQgInNldF90cmFjZSgpIiBhcmUgYWxpYXNlcyBmb3IgJworICAgICAgICAgICAgICdpbnN0YW50aWF0aW5nXG4nCisgICAgICAgICAgICAgJ3RoZSAiUGRiIiBjbGFzcyBhbmQgY2FsbGluZyB0aGUgbWV0aG9kIG9mIHRoZSBzYW1lIG5hbWUuICBJZiB5b3UgJworICAgICAgICAgICAgICd3YW50XG4nCisgICAgICAgICAgICAgJ3RvIGFjY2VzcyBmdXJ0aGVyIGZlYXR1cmVzLCB5b3UgaGF2ZSB0byBkbyB0aGlzIHlvdXJzZWxmOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiY2xhc3MgcGRiLlBkYihjb21wbGV0ZWtleT0ndGFiJywgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsICIKKyAgICAgICAgICAgICAnc2tpcD1Ob25lLCBub3NpZ2ludD1GYWxzZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICJQZGIiIGlzIHRoZSBkZWJ1Z2dlciBjbGFzcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRoZSAqY29tcGxldGVrZXkqLCAqc3RkaW4qIGFuZCAqc3Rkb3V0KiBhcmd1bWVudHMgYXJlIHBhc3NlZCAnCisgICAgICAgICAgICAgJ3RvIHRoZVxuJworICAgICAgICAgICAgICcgICB1bmRlcmx5aW5nICJjbWQuQ21kIiBjbGFzczsgc2VlIHRoZSBkZXNjcmlwdGlvbiB0aGVyZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRoZSAqc2tpcCogYXJndW1lbnQsIGlmIGdpdmVuLCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mICcKKyAgICAgICAgICAgICAnZ2xvYi1zdHlsZVxuJworICAgICAgICAgICAgICcgICBtb2R1bGUgbmFtZSBwYXR0ZXJucy4gIFRoZSBkZWJ1Z2dlciB3aWxsIG5vdCBzdGVwIGludG8gZnJhbWVzICcKKyAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICcgICBvcmlnaW5hdGUgaW4gYSBtb2R1bGUgdGhhdCBtYXRjaGVzIG9uZSBvZiB0aGVzZSBwYXR0ZXJucy4gJworICAgICAgICAgICAgICdbMV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEJ5IGRlZmF1bHQsIFBkYiBzZXRzIGEgaGFuZGxlciBmb3IgdGhlIFNJR0lOVCBzaWduYWwgKHdoaWNoICcKKyAgICAgICAgICAgICAnaXMgc2VudFxuJworICAgICAgICAgICAgICcgICB3aGVuIHRoZSB1c2VyIHByZXNzZXMgIkN0cmwtQyIgb24gdGhlIGNvbnNvbGUpIHdoZW4geW91IGdpdmUgJworICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyAgICJjb250aW51ZSIgY29tbWFuZC4gVGhpcyBhbGxvd3MgeW91IHRvIGJyZWFrIGludG8gdGhlICcKKyAgICAgICAgICAgICAnZGVidWdnZXJcbicKKyAgICAgICAgICAgICAnICAgYWdhaW4gYnkgcHJlc3NpbmcgIkN0cmwtQyIuICBJZiB5b3Ugd2FudCBQZGIgbm90IHRvIHRvdWNoICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIFNJR0lOVCBoYW5kbGVyLCBzZXQgKm5vc2lnaW50KiB0b3QgdHJ1ZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEV4YW1wbGUgY2FsbCB0byBlbmFibGUgdHJhY2luZyB3aXRoICpza2lwKjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIiAgICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoc2tpcD1bJ2RqYW5nby4qJ10pLnNldF90cmFjZSgpXG4iCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjE6IFRoZSAqc2tpcCogYXJndW1lbnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjI6IFRoZSAqbm9zaWdpbnQqIGFyZ3VtZW50LiAgUHJldmlvdXNseSwgYSAnCisgICAgICAgICAgICAgJ1NJR0lOVFxuJworICAgICAgICAgICAgICcgICBoYW5kbGVyIHdhcyBuZXZlciBzZXQgYnkgUGRiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgcnVuKHN0YXRlbWVudCwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSlcbicKKyAgICAgICAgICAgICAnICAgcnVuZXZhbChleHByZXNzaW9uLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKVxuJworICAgICAgICAgICAgICcgICBydW5jYWxsKGZ1bmN0aW9uLCAqYXJncywgKiprd2RzKVxuJworICAgICAgICAgICAgICcgICBzZXRfdHJhY2UoKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZnVuY3Rpb25zIGV4cGxhaW5lZCBhYm92ZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdEZWJ1Z2dlciBDb21tYW5kc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGNvbW1hbmRzIHJlY29nbml6ZWQgYnkgdGhlIGRlYnVnZ2VyIGFyZSBsaXN0ZWQgYmVsb3cuICBNb3N0XG4nCisgICAgICAgICAgICAgJ2NvbW1hbmRzIGNhbiBiZSBhYmJyZXZpYXRlZCB0byBvbmUgb3IgdHdvIGxldHRlcnMgYXMgaW5kaWNhdGVkOyAnCisgICAgICAgICAgICAgJ2UuZy5cbicKKyAgICAgICAgICAgICAnImgoZWxwKSIgbWVhbnMgdGhhdCBlaXRoZXIgImgiIG9yICJoZWxwIiBjYW4gYmUgdXNlZCB0byBlbnRlciAnCisgICAgICAgICAgICAgJ3RoZSBoZWxwXG4nCisgICAgICAgICAgICAgJ2NvbW1hbmQgKGJ1dCBub3QgImhlIiBvciAiaGVsIiwgbm9yICJIIiBvciAiSGVscCIgb3IgIkhFTFAiKS5cbicKKyAgICAgICAgICAgICAnQXJndW1lbnRzIHRvIGNvbW1hbmRzIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgKHNwYWNlcyAnCisgICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAgJ3RhYnMpLiAgT3B0aW9uYWwgYXJndW1lbnRzIGFyZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgJworICAgICAgICAgICAgICcoIltdIikgaW5cbicKKyAgICAgICAgICAgICAndGhlIGNvbW1hbmQgc3ludGF4OyB0aGUgc3F1YXJlIGJyYWNrZXRzIG11c3Qgbm90IGJlIHR5cGVkLlxuJworICAgICAgICAgICAgICdBbHRlcm5hdGl2ZXMgaW4gdGhlIGNvbW1hbmQgc3ludGF4IGFyZSBzZXBhcmF0ZWQgYnkgYSB2ZXJ0aWNhbCAnCisgICAgICAgICAgICAgJ2JhclxuJworICAgICAgICAgICAgICcoInwiKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0VudGVyaW5nIGEgYmxhbmsgbGluZSByZXBlYXRzIHRoZSBsYXN0IGNvbW1hbmQgZW50ZXJlZC4gICcKKyAgICAgICAgICAgICAnRXhjZXB0aW9uOiBpZlxuJworICAgICAgICAgICAgICd0aGUgbGFzdCBjb21tYW5kIHdhcyBhICJsaXN0IiBjb21tYW5kLCB0aGUgbmV4dCAxMSBsaW5lcyBhcmUgJworICAgICAgICAgICAgICdsaXN0ZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJDb21tYW5kcyB0aGF0IHRoZSBkZWJ1Z2dlciBkb2Vzbid0IHJlY29nbml6ZSBhcmUgYXNzdW1lZCB0byBiZSAiCisgICAgICAgICAgICAgJ1B5dGhvblxuJworICAgICAgICAgICAgICdzdGF0ZW1lbnRzIGFuZCBhcmUgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2dyYW0gYmVpbmdcbicKKyAgICAgICAgICAgICAnZGVidWdnZWQuICBQeXRob24gc3RhdGVtZW50cyBjYW4gYWxzbyBiZSBwcmVmaXhlZCB3aXRoIGFuICcKKyAgICAgICAgICAgICAnZXhjbGFtYXRpb25cbicKKyAgICAgICAgICAgICAncG9pbnQgKCIhIikuICBUaGlzIGlzIGEgcG93ZXJmdWwgd2F5IHRvIGluc3BlY3QgdGhlIHByb2dyYW0gJworICAgICAgICAgICAgICdiZWluZ1xuJworICAgICAgICAgICAgICdkZWJ1Z2dlZDsgaXQgaXMgZXZlbiBwb3NzaWJsZSB0byBjaGFuZ2UgYSB2YXJpYWJsZSBvciBjYWxsIGEgJworICAgICAgICAgICAgICdmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAnV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHN1Y2ggYSBzdGF0ZW1lbnQsIHRoZSBleGNlcHRpb24gbmFtZSAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgInByaW50ZWQgYnV0IHRoZSBkZWJ1Z2dlcidzIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLlxuIgorICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlIGRlYnVnZ2VyIHN1cHBvcnRzIGFsaWFzZXMuICBBbGlhc2VzIGNhbiBoYXZlIHBhcmFtZXRlcnMgJworICAgICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICAgICdhbGxvd3Mgb25lIGEgY2VydGFpbiBsZXZlbCBvZiBhZGFwdGFiaWxpdHkgdG8gdGhlIGNvbnRleHQgdW5kZXJcbicKKyAgICAgICAgICAgICAnZXhhbWluYXRpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdNdWx0aXBsZSBjb21tYW5kcyBtYXkgYmUgZW50ZXJlZCBvbiBhIHNpbmdsZSBsaW5lLCBzZXBhcmF0ZWQgYnkgJworICAgICAgICAgICAgICciOzsiLlxuJworICAgICAgICAgICAgICcoQSBzaW5nbGUgIjsiIGlzIG5vdCB1c2VkIGFzIGl0IGlzIHRoZSBzZXBhcmF0b3IgZm9yIG11bHRpcGxlICcKKyAgICAgICAgICAgICAnY29tbWFuZHNcbicKKyAgICAgICAgICAgICAnaW4gYSBsaW5lIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBQeXRob24gcGFyc2VyLikgIE5vIGludGVsbGlnZW5jZSAnCisgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgJ2FwcGxpZWQgdG8gc2VwYXJhdGluZyB0aGUgY29tbWFuZHM7IHRoZSBpbnB1dCBpcyBzcGxpdCBhdCB0aGUgJworICAgICAgICAgICAgICdmaXJzdFxuJworICAgICAgICAgICAgICciOzsiIHBhaXIsIGV2ZW4gaWYgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHF1b3RlZCBzdHJpbmcuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJZiBhIGZpbGUgIi5wZGJyYyIgZXhpc3RzIGluIHRoZSB1c2VyXCdzIGhvbWUgZGlyZWN0b3J5IG9yIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2N1cnJlbnQgZGlyZWN0b3J5LCBpdCBpcyByZWFkIGluIGFuZCBleGVjdXRlZCBhcyBpZiBpdCBoYWQgYmVlbiAnCisgICAgICAgICAgICAgJ3R5cGVkXG4nCisgICAgICAgICAgICAgJ2F0IHRoZSBkZWJ1Z2dlciBwcm9tcHQuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yICcKKyAgICAgICAgICAgICAnYWxpYXNlcy4gIElmXG4nCisgICAgICAgICAgICAgJ2JvdGggZmlsZXMgZXhpc3QsIHRoZSBvbmUgaW4gdGhlIGhvbWUgZGlyZWN0b3J5IGlzIHJlYWQgZmlyc3QgJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnYWxpYXNlcyBkZWZpbmVkIHRoZXJlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBsb2NhbCBmaWxlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogIi5wZGJyYyIgY2FuIG5vdyBjb250YWluIGNvbW1hbmRzIHRoYXRcbicKKyAgICAgICAgICAgICAnY29udGludWUgZGVidWdnaW5nLCBzdWNoIGFzICJjb250aW51ZSIgb3IgIm5leHQiLiAgUHJldmlvdXNseSwgJworICAgICAgICAgICAgICd0aGVzZVxuJworICAgICAgICAgICAgICdjb21tYW5kcyBoYWQgbm8gZWZmZWN0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnaChlbHApIFtjb21tYW5kXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aG91dCBhcmd1bWVudCwgcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgV2l0aCAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnICAgKmNvbW1hbmQqIGFzIGFyZ3VtZW50LCBwcmludCBoZWxwIGFib3V0IHRoYXQgY29tbWFuZC4gICJoZWxwICcKKyAgICAgICAgICAgICAncGRiIlxuJworICAgICAgICAgICAgICcgICBkaXNwbGF5cyB0aGUgZnVsbCBkb2N1bWVudGF0aW9uICh0aGUgZG9jc3RyaW5nIG9mIHRoZSAicGRiIlxuJworICAgICAgICAgICAgICcgICBtb2R1bGUpLiAgU2luY2UgdGhlICpjb21tYW5kKiBhcmd1bWVudCBtdXN0IGJlIGFuIGlkZW50aWZpZXIsICcKKyAgICAgICAgICAgICAnImhlbHBcbicKKyAgICAgICAgICAgICAnICAgZXhlYyIgbXVzdCBiZSBlbnRlcmVkIHRvIGdldCBoZWxwIG9uIHRoZSAiISIgY29tbWFuZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3coaGVyZSlcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFByaW50IGEgc3RhY2sgdHJhY2UsIHdpdGggdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSAnCisgICAgICAgICAgICAgJ2JvdHRvbS4gIEFuXG4nCisgICAgICAgICAgICAgJyAgIGFycm93IGluZGljYXRlcyB0aGUgY3VycmVudCBmcmFtZSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgJworICAgICAgICAgICAgICdjb250ZXh0IG9mXG4nCisgICAgICAgICAgICAgJyAgIG1vc3QgY29tbWFuZHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdkKG93bikgW2NvdW50XVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTW92ZSB0aGUgY3VycmVudCBmcmFtZSAqY291bnQqIChkZWZhdWx0IG9uZSkgbGV2ZWxzIGRvd24gaW4gJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgc3RhY2sgdHJhY2UgKHRvIGEgbmV3ZXIgZnJhbWUpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAndShwKSBbY291bnRdXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lICpjb3VudCogKGRlZmF1bHQgb25lKSBsZXZlbHMgdXAgaW4gdGhlICcKKyAgICAgICAgICAgICAnc3RhY2tcbicKKyAgICAgICAgICAgICAnICAgdHJhY2UgKHRvIGFuIG9sZGVyIGZyYW1lKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2IocmVhaykgWyhbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCBjb25kaXRpb25dXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aCBhICpsaW5lbm8qIGFyZ3VtZW50LCBzZXQgYSBicmVhayB0aGVyZSBpbiB0aGUgY3VycmVudCAnCisgICAgICAgICAgICAgJ2ZpbGUuXG4nCisgICAgICAgICAgICAgJyAgIFdpdGggYSAqZnVuY3Rpb24qIGFyZ3VtZW50LCBzZXQgYSBicmVhayBhdCB0aGUgZmlyc3QgJworICAgICAgICAgICAgICdleGVjdXRhYmxlXG4nCisgICAgICAgICAgICAgJyAgIHN0YXRlbWVudCB3aXRoaW4gdGhhdCBmdW5jdGlvbi4gIFRoZSBsaW5lIG51bWJlciBtYXkgYmUgJworICAgICAgICAgICAgICdwcmVmaXhlZFxuJworICAgICAgICAgICAgICcgICB3aXRoIGEgZmlsZW5hbWUgYW5kIGEgY29sb24sIHRvIHNwZWNpZnkgYSBicmVha3BvaW50IGluICcKKyAgICAgICAgICAgICAnYW5vdGhlclxuJworICAgICAgICAgICAgICIgICBmaWxlIChwcm9iYWJseSBvbmUgdGhhdCBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0KS4gIFRoZSBmaWxlICIKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgc2VhcmNoZWQgb24gInN5cy5wYXRoIi4gIE5vdGUgdGhhdCBlYWNoIGJyZWFrcG9pbnQgaXMgJworICAgICAgICAgICAgICdhc3NpZ25lZCBhXG4nCisgICAgICAgICAgICAgJyAgIG51bWJlciB0byB3aGljaCBhbGwgdGhlIG90aGVyIGJyZWFrcG9pbnQgY29tbWFuZHMgcmVmZXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBJZiBhIHNlY29uZCBhcmd1bWVudCBpcyBwcmVzZW50LCBpdCBpcyBhbiBleHByZXNzaW9uIHdoaWNoICcKKyAgICAgICAgICAgICAnbXVzdFxuJworICAgICAgICAgICAgICcgICBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgV2l0aG91dCBhcmd1bWVudCwgbGlzdCBhbGwgYnJlYWtzLCBpbmNsdWRpbmcgZm9yIGVhY2ggJworICAgICAgICAgICAgICdicmVha3BvaW50LFxuJworICAgICAgICAgICAgICcgICB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYnJlYWtwb2ludCBoYXMgYmVlbiBoaXQsIHRoZSAnCisgICAgICAgICAgICAgJ2N1cnJlbnRcbicKKyAgICAgICAgICAgICAnICAgaWdub3JlIGNvdW50LCBhbmQgdGhlIGFzc29jaWF0ZWQgY29uZGl0aW9uIGlmIGFueS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3RicmVhayBbKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUZW1wb3JhcnkgYnJlYWtwb2ludCwgd2hpY2ggaXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICBmaXJzdCBoaXQuIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciAiYnJlYWsiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnY2woZWFyKSBbZmlsZW5hbWU6bGluZW5vIHwgYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRoIGEgKmZpbGVuYW1lOmxpbmVubyogYXJndW1lbnQsIGNsZWFyIGFsbCB0aGUgYnJlYWtwb2ludHMgJworICAgICAgICAgICAgICdhdFxuJworICAgICAgICAgICAgICcgICB0aGlzIGxpbmUuIFdpdGggYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBicmVha3BvaW50IG51bWJlcnMsICcKKyAgICAgICAgICAgICAnY2xlYXJcbicKKyAgICAgICAgICAgICAnICAgdGhvc2UgYnJlYWtwb2ludHMuIFdpdGhvdXQgYXJndW1lbnQsIGNsZWFyIGFsbCBicmVha3MgKGJ1dCAnCisgICAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICAgJyAgIGFzayBjb25maXJtYXRpb24pLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnZGlzYWJsZSBbYnBudW1iZXIgW2JwbnVtYmVyIC4uLl1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBEaXNhYmxlIHRoZSBicmVha3BvaW50cyBnaXZlbiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mXG4nCisgICAgICAgICAgICAgJyAgIGJyZWFrcG9pbnQgbnVtYmVycy4gIERpc2FibGluZyBhIGJyZWFrcG9pbnQgbWVhbnMgaXQgY2Fubm90ICcKKyAgICAgICAgICAgICAnY2F1c2VcbicKKyAgICAgICAgICAgICAnICAgdGhlIHByb2dyYW0gdG8gc3RvcCBleGVjdXRpb24sIGJ1dCB1bmxpa2UgY2xlYXJpbmcgYSAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnQsIGl0XG4nCisgICAgICAgICAgICAgJyAgIHJlbWFpbnMgaW4gdGhlIGxpc3Qgb2YgYnJlYWtwb2ludHMgYW5kIGNhbiBiZSAocmUtKWVuYWJsZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdlbmFibGUgW2JwbnVtYmVyIFticG51bWJlciAuLi5dXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRW5hYmxlIHRoZSBicmVha3BvaW50cyBzcGVjaWZpZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdpZ25vcmUgYnBudW1iZXIgW2NvdW50XVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU2V0IHRoZSBpZ25vcmUgY291bnQgZm9yIHRoZSBnaXZlbiBicmVha3BvaW50IG51bWJlci4gIElmICcKKyAgICAgICAgICAgICAnY291bnQgaXNcbicKKyAgICAgICAgICAgICAnICAgb21pdHRlZCwgdGhlIGlnbm9yZSBjb3VudCBpcyBzZXQgdG8gMC4gIEEgYnJlYWtwb2ludCBiZWNvbWVzICcKKyAgICAgICAgICAgICAnYWN0aXZlXG4nCisgICAgICAgICAgICAgJyAgIHdoZW4gdGhlIGlnbm9yZSBjb3VudCBpcyB6ZXJvLiAgV2hlbiBub24temVybywgdGhlIGNvdW50IGlzXG4nCisgICAgICAgICAgICAgJyAgIGRlY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgYnJlYWtwb2ludCBpcyByZWFjaGVkIGFuZCB0aGUgJworICAgICAgICAgICAgICdicmVha3BvaW50XG4nCisgICAgICAgICAgICAgJyAgIGlzIG5vdCBkaXNhYmxlZCBhbmQgYW55IGFzc29jaWF0ZWQgY29uZGl0aW9uIGV2YWx1YXRlcyB0byAnCisgICAgICAgICAgICAgJ3RydWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjb25kaXRpb24gYnBudW1iZXIgW2NvbmRpdGlvbl1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFNldCBhIG5ldyAqY29uZGl0aW9uKiBmb3IgdGhlIGJyZWFrcG9pbnQsIGFuIGV4cHJlc3Npb24gd2hpY2ggJworICAgICAgICAgICAgICdtdXN0XG4nCisgICAgICAgICAgICAgJyAgIGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuICBJZiAnCisgICAgICAgICAgICAgJypjb25kaXRpb24qXG4nCisgICAgICAgICAgICAgJyAgIGlzIGFic2VudCwgYW55IGV4aXN0aW5nIGNvbmRpdGlvbiBpcyByZW1vdmVkOyBpLmUuLCB0aGUgJworICAgICAgICAgICAgICdicmVha3BvaW50XG4nCisgICAgICAgICAgICAgJyAgIGlzIG1hZGUgdW5jb25kaXRpb25hbC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2NvbW1hbmRzIFticG51bWJlcl1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFNwZWNpZnkgYSBsaXN0IG9mIGNvbW1hbmRzIGZvciBicmVha3BvaW50IG51bWJlciAqYnBudW1iZXIqLiAgJworICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAnICAgY29tbWFuZHMgdGhlbXNlbHZlcyBhcHBlYXIgb24gdGhlIGZvbGxvd2luZyBsaW5lcy4gIFR5cGUgYSAnCisgICAgICAgICAgICAgJ2xpbmVcbicKKyAgICAgICAgICAgICAnICAgY29udGFpbmluZyBqdXN0ICJlbmQiIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuIEFuIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICAoUGRiKSBjb21tYW5kcyAxXG4nCisgICAgICAgICAgICAgJyAgICAgIChjb20pIHAgc29tZV92YXJpYWJsZVxuJworICAgICAgICAgICAgICcgICAgICAoY29tKSBlbmRcbicKKyAgICAgICAgICAgICAnICAgICAgKFBkYilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFRvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgY29tbWFuZHMgYW5kICcKKyAgICAgICAgICAgICAnZm9sbG93XG4nCisgICAgICAgICAgICAgJyAgIGl0IGltbWVkaWF0ZWx5IHdpdGggImVuZCI7IHRoYXQgaXMsIGdpdmUgbm8gY29tbWFuZHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRoIG5vICpicG51bWJlciogYXJndW1lbnQsIGNvbW1hbmRzIHJlZmVycyB0byB0aGUgbGFzdCAnCisgICAgICAgICAgICAgJ2JyZWFrcG9pbnRcbicKKyAgICAgICAgICAgICAnICAgc2V0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgWW91IGNhbiB1c2UgYnJlYWtwb2ludCBjb21tYW5kcyB0byBzdGFydCB5b3VyIHByb2dyYW0gdXAgJworICAgICAgICAgICAgICdhZ2Fpbi5cbicKKyAgICAgICAgICAgICAnICAgU2ltcGx5IHVzZSB0aGUgY29udGludWUgY29tbWFuZCwgb3Igc3RlcCwgb3IgYW55IG90aGVyICcKKyAgICAgICAgICAgICAnY29tbWFuZCB0aGF0XG4nCisgICAgICAgICAgICAgJyAgIHJlc3VtZXMgZXhlY3V0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgU3BlY2lmeWluZyBhbnkgY29tbWFuZCByZXN1bWluZyBleGVjdXRpb24gKGN1cnJlbnRseSAnCisgICAgICAgICAgICAgJ2NvbnRpbnVlLFxuJworICAgICAgICAgICAgICcgICBzdGVwLCBuZXh0LCByZXR1cm4sIGp1bXAsIHF1aXQgYW5kIHRoZWlyIGFiYnJldmlhdGlvbnMpICcKKyAgICAgICAgICAgICAndGVybWluYXRlc1xuJworICAgICAgICAgICAgICcgICB0aGUgY29tbWFuZCBsaXN0IChhcyBpZiB0aGF0IGNvbW1hbmQgd2FzIGltbWVkaWF0ZWx5IGZvbGxvd2VkICcKKyAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAnICAgZW5kKS4gVGhpcyBpcyBiZWNhdXNlIGFueSB0aW1lIHlvdSByZXN1bWUgZXhlY3V0aW9uIChldmVuICcKKyAgICAgICAgICAgICAnd2l0aCBhXG4nCisgICAgICAgICAgICAgJyAgIHNpbXBsZSBuZXh0IG9yIHN0ZXApLCB5b3UgbWF5IGVuY291bnRlciBhbm90aGVyICcKKyAgICAgICAgICAgICAnYnJlYWtwb2ludC0td2hpY2hcbicKKyAgICAgICAgICAgICAnICAgY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0byBhbWJpZ3VpdGllcyBhYm91dCAnCisgICAgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgICAgJyAgIGxpc3QgdG8gZXhlY3V0ZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgIiAgIElmIHlvdSB1c2UgdGhlICdzaWxlbnQnIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgbGlzdCwgdGhlICIKKyAgICAgICAgICAgICAndXN1YWxcbicKKyAgICAgICAgICAgICAnICAgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzICcKKyAgICAgICAgICAgICAnbWF5IGJlXG4nCisgICAgICAgICAgICAgJyAgIGRlc2lyYWJsZSBmb3IgYnJlYWtwb2ludHMgdGhhdCBhcmUgdG8gcHJpbnQgYSBzcGVjaWZpYyAnCisgICAgICAgICAgICAgJ21lc3NhZ2UgYW5kXG4nCisgICAgICAgICAgICAgJyAgIHRoZW4gY29udGludWUuICBJZiBub25lIG9mIHRoZSBvdGhlciBjb21tYW5kcyBwcmludCBhbnl0aGluZywgJworICAgICAgICAgICAgICd5b3VcbicKKyAgICAgICAgICAgICAnICAgc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3ModGVwKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSAnCisgICAgICAgICAgICAgJ29jY2FzaW9uXG4nCisgICAgICAgICAgICAgJyAgIChlaXRoZXIgaW4gYSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBvciBvbiB0aGUgbmV4dCBsaW5lIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIGN1cnJlbnQgZnVuY3Rpb24pLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnbihleHQpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIG5leHQgbGluZSBpbiB0aGUgY3VycmVudCAnCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIGlzXG4nCisgICAgICAgICAgICAgJyAgIHJlYWNoZWQgb3IgaXQgcmV0dXJucy4gIChUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJuZXh0IiBhbmQgJworICAgICAgICAgICAgICcic3RlcCJcbicKKyAgICAgICAgICAgICAnICAgaXMgdGhhdCAic3RlcCIgc3RvcHMgaW5zaWRlIGEgY2FsbGVkIGZ1bmN0aW9uLCB3aGlsZSAibmV4dCJcbicKKyAgICAgICAgICAgICAnICAgZXhlY3V0ZXMgY2FsbGVkIGZ1bmN0aW9ucyBhdCAobmVhcmx5KSBmdWxsIHNwZWVkLCBvbmx5ICcKKyAgICAgICAgICAgICAnc3RvcHBpbmcgYXRcbicKKyAgICAgICAgICAgICAnICAgdGhlIG5leHQgbGluZSBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd1bnQoaWwpIFtsaW5lbm9dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRob3V0IGFyZ3VtZW50LCBjb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGxpbmUgd2l0aCBhICcKKyAgICAgICAgICAgICAnbnVtYmVyXG4nCisgICAgICAgICAgICAgJyAgIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBvbmUgaXMgcmVhY2hlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFdpdGggYSBsaW5lIG51bWJlciwgY29udGludWUgZXhlY3V0aW9uIHVudGlsIGEgbGluZSB3aXRoIGEgJworICAgICAgICAgICAgICdudW1iZXJcbicKKyAgICAgICAgICAgICAnICAgZ3JlYXRlciBvciBlcXVhbCB0byB0aGF0IGlzIHJlYWNoZWQuICBJbiBib3RoIGNhc2VzLCBhbHNvICcKKyAgICAgICAgICAgICAnc3RvcCB3aGVuXG4nCisgICAgICAgICAgICAgJyAgIHRoZSBjdXJyZW50IGZyYW1lIHJldHVybnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBBbGxvdyBnaXZpbmcgYW4gZXhwbGljaXQgbGluZSAnCisgICAgICAgICAgICAgJ251bWJlci5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3IoZXR1cm4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGN1cnJlbnQgZnVuY3Rpb24gcmV0dXJucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2Mob250KGludWUpKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQ29udGludWUgZXhlY3V0aW9uLCBvbmx5IHN0b3Agd2hlbiBhIGJyZWFrcG9pbnQgaXMgJworICAgICAgICAgICAgICdlbmNvdW50ZXJlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2oodW1wKSBsaW5lbm9cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFNldCB0aGUgbmV4dCBsaW5lIHRoYXQgd2lsbCBiZSBleGVjdXRlZC4gIE9ubHkgYXZhaWxhYmxlIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIGJvdHRvbS1tb3N0IGZyYW1lLiAgVGhpcyBsZXRzIHlvdSBqdW1wIGJhY2sgYW5kIGV4ZWN1dGUgY29kZSAnCisgICAgICAgICAgICAgJ2FnYWluLFxuJworICAgICAgICAgICAgICIgICBvciBqdW1wIGZvcndhcmQgdG8gc2tpcCBjb2RlIHRoYXQgeW91IGRvbid0IHdhbnQgdG8gcnVuLlxuIgorICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgbm90IGFsbCBqdW1wcyBhcmUgYWxsb3dlZCAtLSBmb3IgJworICAgICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICAgICcgICBpdCBpcyBub3QgcG9zc2libGUgdG8ganVtcCBpbnRvIHRoZSBtaWRkbGUgb2YgYSAiZm9yIiBsb29wIG9yICcKKyAgICAgICAgICAgICAnb3V0XG4nCisgICAgICAgICAgICAgJyAgIG9mIGEgImZpbmFsbHkiIGNsYXVzZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2woaXN0KSBbZmlyc3RbLCBsYXN0XV1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIExpc3Qgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZpbGUuICBXaXRob3V0IGFyZ3VtZW50cywgJworICAgICAgICAgICAgICdsaXN0IDExXG4nCisgICAgICAgICAgICAgJyAgIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lIG9yIGNvbnRpbnVlIHRoZSBwcmV2aW91cyAnCisgICAgICAgICAgICAgJ2xpc3RpbmcuXG4nCisgICAgICAgICAgICAgJyAgIFdpdGggIi4iIGFzIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lLiAgJworICAgICAgICAgICAgICdXaXRoXG4nCisgICAgICAgICAgICAgJyAgIG9uZSBhcmd1bWVudCwgbGlzdCAxMSBsaW5lcyBhcm91bmQgYXQgdGhhdCBsaW5lLiAgV2l0aCB0d29cbicKKyAgICAgICAgICAgICAnICAgYXJndW1lbnRzLCBsaXN0IHRoZSBnaXZlbiByYW5nZTsgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyAnCisgICAgICAgICAgICAgJ2xlc3NcbicKKyAgICAgICAgICAgICAnICAgdGhhbiB0aGUgZmlyc3QsIGl0IGlzIGludGVycHJldGVkIGFzIGEgY291bnQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgY3VycmVudCBsaW5lIGluIHRoZSBjdXJyZW50IGZyYW1lIGlzIGluZGljYXRlZCBieSAiLT4iLiAgJworICAgICAgICAgICAgICdJZiBhblxuJworICAgICAgICAgICAgICcgICBleGNlcHRpb24gaXMgYmVpbmcgZGVidWdnZWQsIHRoZSBsaW5lIHdoZXJlIHRoZSBleGNlcHRpb24gJworICAgICAgICAgICAgICd3YXNcbicKKyAgICAgICAgICAgICAnICAgb3JpZ2luYWxseSByYWlzZWQgb3IgcHJvcGFnYXRlZCBpcyBpbmRpY2F0ZWQgYnkgIj4+IiwgaWYgaXQgJworICAgICAgICAgICAgICdkaWZmZXJzXG4nCisgICAgICAgICAgICAgJyAgIGZyb20gdGhlIGN1cnJlbnQgbGluZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMjogVGhlICI+PiIgbWFya2VyLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnbGwgfCBsb25nbGlzdFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlzdCBhbGwgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uIG9yIGZyYW1lLlxuJworICAgICAgICAgICAgICcgICBJbnRlcmVzdGluZyBsaW5lcyBhcmUgbWFya2VkIGFzIGZvciAibGlzdCIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdhKHJncylcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFByaW50IHRoZSBhcmd1bWVudCBsaXN0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAncCBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBFdmFsdWF0ZSB0aGUgKmV4cHJlc3Npb24qIGluIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHByaW50ICcKKyAgICAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgICAgJyAgIHZhbHVlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTm90ZTogInByaW50KCkiIGNhbiBhbHNvIGJlIHVzZWQsIGJ1dCBpcyBub3QgYSBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgJ2NvbW1hbmRcbicKKyAgICAgICAgICAgICAnICAgICAtLS0gdGhpcyBleGVjdXRlcyB0aGUgUHl0aG9uICJwcmludCgpIiBmdW5jdGlvbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3BwIGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIExpa2UgdGhlICJwIiBjb21tYW5kLCBleGNlcHQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlzICcKKyAgICAgICAgICAgICAncHJldHR5LVxuJworICAgICAgICAgICAgICcgICBwcmludGVkIHVzaW5nIHRoZSAicHByaW50IiBtb2R1bGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd3aGF0aXMgZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUHJpbnQgdGhlIHR5cGUgb2YgdGhlICpleHByZXNzaW9uKi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3NvdXJjZSBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUcnkgdG8gZ2V0IHNvdXJjZSBjb2RlIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCBkaXNwbGF5IGl0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4yLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnZGlzcGxheSBbZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIERpc3BsYXkgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uIGlmIGl0IGNoYW5nZWQsIGVhY2ggdGltZVxuJworICAgICAgICAgICAgICcgICBleGVjdXRpb24gc3RvcHMgaW4gdGhlIGN1cnJlbnQgZnJhbWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaXRob3V0IGV4cHJlc3Npb24sIGxpc3QgYWxsIGRpc3BsYXkgZXhwcmVzc2lvbnMgZm9yIHRoZSAnCisgICAgICAgICAgICAgJ2N1cnJlbnRcbicKKyAgICAgICAgICAgICAnICAgZnJhbWUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICd1bmRpc3BsYXkgW2V4cHJlc3Npb25dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBEbyBub3QgZGlzcGxheSB0aGUgZXhwcmVzc2lvbiBhbnkgbW9yZSBpbiB0aGUgY3VycmVudCBmcmFtZS5cbicKKyAgICAgICAgICAgICAnICAgV2l0aG91dCBleHByZXNzaW9uLCBjbGVhciBhbGwgZGlzcGxheSBleHByZXNzaW9ucyBmb3IgdGhlICcKKyAgICAgICAgICAgICAnY3VycmVudFxuJworICAgICAgICAgICAgICcgICBmcmFtZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2ludGVyYWN0XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBTdGFydCBhbiBpbnRlcmF0aXZlIGludGVycHJldGVyICh1c2luZyB0aGUgImNvZGUiIG1vZHVsZSkgJworICAgICAgICAgICAgICd3aG9zZVxuJworICAgICAgICAgICAgICcgICBnbG9iYWwgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCB0aGUgKGdsb2JhbCBhbmQgbG9jYWwpIG5hbWVzICcKKyAgICAgICAgICAgICAnZm91bmQgaW5cbicKKyAgICAgICAgICAgICAnICAgdGhlIGN1cnJlbnQgc2NvcGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdhbGlhcyBbbmFtZSBbY29tbWFuZF1dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBDcmVhdGUgYW4gYWxpYXMgY2FsbGVkICpuYW1lKiB0aGF0IGV4ZWN1dGVzICpjb21tYW5kKi4gIFRoZSAnCisgICAgICAgICAgICAgJ2NvbW1hbmRcbicKKyAgICAgICAgICAgICAnICAgbXVzdCAqbm90KiBiZSBlbmNsb3NlZCBpbiBxdW90ZXMuICBSZXBsYWNlYWJsZSBwYXJhbWV0ZXJzIGNhbiAnCisgICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAgJyAgIGluZGljYXRlZCBieSAiJTEiLCAiJTIiLCBhbmQgc28gb24sIHdoaWxlICIlKiIgaXMgcmVwbGFjZWQgYnkgJworICAgICAgICAgICAgICdhbGxcbicKKyAgICAgICAgICAgICAnICAgdGhlIHBhcmFtZXRlcnMuIElmIG5vIGNvbW1hbmQgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IGFsaWFzICcKKyAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgJyAgICpuYW1lKiBpcyBzaG93bi4gSWYgbm8gYXJndW1lbnRzIGFyZSBnaXZlbiwgYWxsIGFsaWFzZXMgYXJlICcKKyAgICAgICAgICAgICAnbGlzdGVkLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQWxpYXNlcyBtYXkgYmUgbmVzdGVkIGFuZCBjYW4gY29udGFpbiBhbnl0aGluZyB0aGF0IGNhbiBiZSAnCisgICAgICAgICAgICAgJ2xlZ2FsbHlcbicKKyAgICAgICAgICAgICAnICAgdHlwZWQgYXQgdGhlIHBkYiBwcm9tcHQuICBOb3RlIHRoYXQgaW50ZXJuYWwgcGRiIGNvbW1hbmRzICcKKyAgICAgICAgICAgICAnKmNhbiogYmVcbicKKyAgICAgICAgICAgICAnICAgb3ZlcnJpZGRlbiBieSBhbGlhc2VzLiAgU3VjaCBhIGNvbW1hbmQgaXMgdGhlbiBoaWRkZW4gdW50aWwgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgYWxpYXMgaXMgcmVtb3ZlZC4gIEFsaWFzaW5nIGlzIHJlY3Vyc2l2ZWx5IGFwcGxpZWQgdG8gdGhlICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnICAgd29yZCBvZiB0aGUgY29tbWFuZCBsaW5lOyBhbGwgb3RoZXIgd29yZHMgaW4gdGhlIGxpbmUgYXJlICcKKyAgICAgICAgICAgICAnbGVmdFxuJworICAgICAgICAgICAgICcgICBhbG9uZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEFzIGFuIGV4YW1wbGUsIGhlcmUgYXJlIHR3byB1c2VmdWwgYWxpYXNlcyAoZXNwZWNpYWxseSB3aGVuICcKKyAgICAgICAgICAgICAncGxhY2VkXG4nCisgICAgICAgICAgICAgJyAgIGluIHRoZSAiLnBkYnJjIiBmaWxlKTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICMgUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzICh1c2FnZSAicGkgY2xhc3NJbnN0IilcbicKKyAgICAgICAgICAgICAnICAgICAgYWxpYXMgcGkgZm9yIGsgaW4gJTEuX19kaWN0X18ua2V5cygpOiAnCisgICAgICAgICAgICAgJ3ByaW50KCIlMS4iLGssIj0iLCUxLl9fZGljdF9fW2tdKVxuJworICAgICAgICAgICAgICcgICAgICAjIFByaW50IGluc3RhbmNlIHZhcmlhYmxlcyBpbiBzZWxmXG4nCisgICAgICAgICAgICAgJyAgICAgIGFsaWFzIHBzIHBpIHNlbGZcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3VuYWxpYXMgbmFtZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRGVsZXRlIHRoZSBzcGVjaWZpZWQgYWxpYXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICchIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRXhlY3V0ZSB0aGUgKG9uZS1saW5lKSAqc3RhdGVtZW50KiBpbiB0aGUgY29udGV4dCBvZiB0aGUgJworICAgICAgICAgICAgICdjdXJyZW50XG4nCisgICAgICAgICAgICAgJyAgIHN0YWNrIGZyYW1lLiBUaGUgZXhjbGFtYXRpb24gcG9pbnQgY2FuIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSAnCisgICAgICAgICAgICAgJ2ZpcnN0XG4nCisgICAgICAgICAgICAgJyAgIHdvcmQgb2YgdGhlIHN0YXRlbWVudCByZXNlbWJsZXMgYSBkZWJ1Z2dlciBjb21tYW5kLiAgVG8gc2V0ICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICBnbG9iYWwgdmFyaWFibGUsIHlvdSBjYW4gcHJlZml4IHRoZSBhc3NpZ25tZW50IGNvbW1hbmQgd2l0aCAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnICAgImdsb2JhbCIgc3RhdGVtZW50IG9uIHRoZSBzYW1lIGxpbmUsIGUuZy46XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICIgICAgICAoUGRiKSBnbG9iYWwgbGlzdF9vcHRpb25zOyBsaXN0X29wdGlvbnMgPSBbJy1sJ11cbiIKKyAgICAgICAgICAgICAnICAgICAgKFBkYilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3J1biBbYXJncyAuLi5dXG4nCisgICAgICAgICAgICAgJ3Jlc3RhcnQgW2FyZ3MgLi4uXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUmVzdGFydCB0aGUgZGVidWdnZWQgUHl0aG9uIHByb2dyYW0uICBJZiBhbiBhcmd1bWVudCBpcyAnCisgICAgICAgICAgICAgJ3N1cHBsaWVkLFxuJworICAgICAgICAgICAgICcgICBpdCBpcyBzcGxpdCB3aXRoICJzaGxleCIgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbmV3XG4nCisgICAgICAgICAgICAgJyAgICJzeXMuYXJndiIuIEhpc3RvcnksIGJyZWFrcG9pbnRzLCBhY3Rpb25zIGFuZCBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgJ29wdGlvbnMgYXJlXG4nCisgICAgICAgICAgICAgJyAgIHByZXNlcnZlZC4gInJlc3RhcnQiIGlzIGFuIGFsaWFzIGZvciAicnVuIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ3EodWl0KVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUXVpdCBmcm9tIHRoZSBkZWJ1Z2dlci4gIFRoZSBwcm9ncmFtIGJlaW5nIGV4ZWN1dGVkIGlzICcKKyAgICAgICAgICAgICAnYWJvcnRlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJy1bIEZvb3Rub3RlcyBdLVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnWzFdIFdoZXRoZXIgYSBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIG9yaWdpbmF0ZSBpbiBhIGNlcnRhaW4gJworICAgICAgICAgICAgICdtb2R1bGVcbicKKyAgICAgICAgICAgICAnICAgIGlzIGRldGVybWluZWQgYnkgdGhlICJfX25hbWVfXyIgaW4gdGhlIGZyYW1lIGdsb2JhbHMuXG4nLAorICdkZWwnOiAnXG4nCisgICAgICAgICdUaGUgImRlbCIgc3RhdGVtZW50XG4nCisgICAgICAgICcqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgIGRlbF9zdG10IDo6PSAiZGVsIiB0YXJnZXRfbGlzdFxuJworICAgICAgICAnXG4nCisgICAgICAgICdEZWxldGlvbiBpcyByZWN1cnNpdmVseSBkZWZpbmVkIHZlcnkgc2ltaWxhciB0byB0aGUgd2F5IGFzc2lnbm1lbnQgJworICAgICAgICAnaXNcbicKKyAgICAgICAgJ2RlZmluZWQuIFJhdGhlciB0aGFuIHNwZWxsaW5nIGl0IG91dCBpbiBmdWxsIGRldGFpbHMsIGhlcmUgYXJlIHNvbWVcbicKKyAgICAgICAgJ2hpbnRzLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdEZWxldGlvbiBvZiBhIHRhcmdldCBsaXN0IHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgZWFjaCB0YXJnZXQsIGZyb20gbGVmdFxuJworICAgICAgICAndG8gcmlnaHQuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0RlbGV0aW9uIG9mIGEgbmFtZSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBmcm9tIHRoZSBsb2NhbCAnCisgICAgICAgICdvclxuJworICAgICAgICAnZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgImdsb2JhbCJcbicKKyAgICAgICAgJ3N0YXRlbWVudCBpbiB0aGUgc2FtZSBjb2RlIGJsb2NrLiAgSWYgdGhlIG5hbWUgaXMgdW5ib3VuZCwgYVxuJworICAgICAgICAnIk5hbWVFcnJvciIgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdEZWxldGlvbiBvZiBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgc3Vic2NyaXB0aW9ucyBhbmQgc2xpY2luZ3MgaXMgJworICAgICAgICAncGFzc2VkXG4nCisgICAgICAgICd0byB0aGUgcHJpbWFyeSBvYmplY3QgaW52b2x2ZWQ7IGRlbGV0aW9uIG9mIGEgc2xpY2luZyBpcyBpbiBnZW5lcmFsXG4nCisgICAgICAgICdlcXVpdmFsZW50IHRvIGFzc2lnbm1lbnQgb2YgYW4gZW1wdHkgc2xpY2Ugb2YgdGhlIHJpZ2h0IHR5cGUgKGJ1dCAnCisgICAgICAgICdldmVuXG4nCisgICAgICAgICd0aGlzIGlzIGRldGVybWluZWQgYnkgdGhlIHNsaWNlZCBvYmplY3QpLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBQcmV2aW91c2x5IGl0IHdhcyBpbGxlZ2FsIHRvIGRlbGV0ZSBhIG5hbWVcbicKKyAgICAgICAgJ2Zyb20gdGhlIGxvY2FsIG5hbWVzcGFjZSBpZiBpdCBvY2N1cnMgYXMgYSBmcmVlIHZhcmlhYmxlIGluIGEgbmVzdGVkXG4nCisgICAgICAgICdibG9jay5cbicsCisgJ2RpY3QnOiAnXG4nCisgICAgICAgICAnRGljdGlvbmFyeSBkaXNwbGF5c1xuJworICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdBIGRpY3Rpb25hcnkgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBrZXkvZGF0dW0gcGFpcnNcbicKKyAgICAgICAgICdlbmNsb3NlZCBpbiBjdXJseSBicmFjZXM6XG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgZGljdF9kaXNwbGF5ICAgICAgIDo6PSAieyIgW2tleV9kYXR1bV9saXN0IHwgZGljdF9jb21wcmVoZW5zaW9uXSAnCisgICAgICAgICAnIn0iXG4nCisgICAgICAgICAnICAga2V5X2RhdHVtX2xpc3QgICAgIDo6PSBrZXlfZGF0dW0gKCIsIiBrZXlfZGF0dW0pKiBbIiwiXVxuJworICAgICAgICAgJyAgIGtleV9kYXR1bSAgICAgICAgICA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiB8ICIqKiIgb3JfZXhwclxuJworICAgICAgICAgJyAgIGRpY3RfY29tcHJlaGVuc2lvbiA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvbiBjb21wX2ZvclxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0EgZGljdGlvbmFyeSBkaXNwbGF5IHlpZWxkcyBhIG5ldyBkaWN0aW9uYXJ5IG9iamVjdC5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdJZiBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBrZXkvZGF0dW0gcGFpcnMgaXMgZ2l2ZW4sIHRoZXkgYXJlXG4nCisgICAgICAgICAnZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB0byBkZWZpbmUgdGhlIGVudHJpZXMgb2YgdGhlICcKKyAgICAgICAgICdkaWN0aW9uYXJ5OlxuJworICAgICAgICAgJ2VhY2gga2V5IG9iamVjdCBpcyB1c2VkIGFzIGEga2V5IGludG8gdGhlIGRpY3Rpb25hcnkgdG8gc3RvcmUgdGhlXG4nCisgICAgICAgICAnY29ycmVzcG9uZGluZyBkYXR1bS4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNhbWUga2V5XG4nCisgICAgICAgICAibXVsdGlwbGUgdGltZXMgaW4gdGhlIGtleS9kYXR1bSBsaXN0LCBhbmQgdGhlIGZpbmFsIGRpY3Rpb25hcnkncyAiCisgICAgICAgICAndmFsdWVcbicKKyAgICAgICAgICdmb3IgdGhhdCBrZXkgd2lsbCBiZSB0aGUgbGFzdCBvbmUgZ2l2ZW4uXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnQSBkb3VibGUgYXN0ZXJpc2sgIioqIiBkZW5vdGVzICpkaWN0aW9uYXJ5IHVucGFja2luZyouIEl0cyBvcGVyYW5kXG4nCisgICAgICAgICAnbXVzdCBiZSBhICptYXBwaW5nKi4gIEVhY2ggbWFwcGluZyBpdGVtIGlzIGFkZGVkIHRvIHRoZSBuZXdcbicKKyAgICAgICAgICdkaWN0aW9uYXJ5LiAgTGF0ZXIgdmFsdWVzIHJlcGxhY2UgdmFsdWVzIGFscmVhZHkgc2V0IGJ5IGVhcmxpZXJcbicKKyAgICAgICAgICdrZXkvZGF0dW0gcGFpcnMgYW5kIGVhcmxpZXIgZGljdGlvbmFyeSB1bnBhY2tpbmdzLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ05ldyBpbiB2ZXJzaW9uIDMuNTogVW5wYWNraW5nIGludG8gZGljdGlvbmFyeSBkaXNwbGF5cywgb3JpZ2luYWxseVxuJworICAgICAgICAgJ3Byb3Bvc2VkIGJ5ICoqUEVQIDQ0OCoqLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ0EgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsXG4nCisgICAgICAgICAnbmVlZHMgdHdvIGV4cHJlc3Npb25zIHNlcGFyYXRlZCB3aXRoIGEgY29sb24gZm9sbG93ZWQgYnkgdGhlIHVzdWFsXG4nCisgICAgICAgICAnImZvciIgYW5kICJpZiIgY2xhdXNlcy4gV2hlbiB0aGUgY29tcHJlaGVuc2lvbiBpcyBydW4sIHRoZSAnCisgICAgICAgICAncmVzdWx0aW5nXG4nCisgICAgICAgICAna2V5IGFuZCB2YWx1ZSBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5IGluIHRoZSAnCisgICAgICAgICAnb3JkZXJcbicKKyAgICAgICAgICd0aGV5IGFyZSBwcm9kdWNlZC5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdSZXN0cmljdGlvbnMgb24gdGhlIHR5cGVzIG9mIHRoZSBrZXkgdmFsdWVzIGFyZSBsaXN0ZWQgZWFybGllciBpblxuJworICAgICAgICAgJ3NlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5LiAgKFRvIHN1bW1hcml6ZSwgdGhlIGtleSB0eXBlXG4nCisgICAgICAgICAnc2hvdWxkIGJlICpoYXNoYWJsZSosIHdoaWNoIGV4Y2x1ZGVzIGFsbCBtdXRhYmxlIG9iamVjdHMuKSAgQ2xhc2hlc1xuJworICAgICAgICAgJ2JldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgZGF0dW0gKHRleHR1YWxseVxuJworICAgICAgICAgJ3JpZ2h0bW9zdCBpbiB0aGUgZGlzcGxheSkgc3RvcmVkIGZvciBhIGdpdmVuIGtleSB2YWx1ZSBwcmV2YWlscy5cbicsCisgJ2R5bmFtaWMtZmVhdHVyZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgJworICAgICAgICAgICAgICAgICAgICAgJ2F0IGNvbXBpbGVcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aW1lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBjb2RlIHdpbGwgcHJpbnQgNDI6XG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgaSA9IDEwXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgZGVmIGYoKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgICAgcHJpbnQoaSlcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBpID0gNDJcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBmKClcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgJworICAgICAgICAgICAgICAgICAgICAgJ2lsbGVnYWwgd2hlbiB1c2VkXG4nCisgICAgICAgICAgICAgICAgICAgICAnaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlICcKKyAgICAgICAgICAgICAgICAgICAgICd2YXJpYWJsZXMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ2lsbGVnYWwgdG9cbicKKyAgICAgICAgICAgICAgICAgICAgICdkZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgJworICAgICAgICAgICAgICAgICAgICAgJ3RpbWUuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlICJldmFsKCkiIGFuZCAiZXhlYygpIiBmdW5jdGlvbnMgZG8gbm90IGhhdmUgYWNjZXNzICcKKyAgICAgICAgICAgICAgICAgICAgICd0byB0aGUgZnVsbFxuJworICAgICAgICAgICAgICAgICAgICAgJ2Vudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgJworICAgICAgICAgICAgICAgICAgICAgJ2luIHRoZSBsb2NhbFxuJworICAgICAgICAgICAgICAgICAgICAgJ2FuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlICcKKyAgICAgICAgICAgICAgICAgICAgICdub3QgcmVzb2x2ZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICdpbiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCAnCisgICAgICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlLiAgWzFdXG4nCisgICAgICAgICAgICAgICAgICAgICAnVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCAnCisgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzIHRvXG4nCisgICAgICAgICAgICAgICAgICAgICAnb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgJworICAgICAgICAgICAgICAgICAgICAgJ25hbWVzcGFjZSBpc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCisgJ2Vsc2UnOiAnXG4nCisgICAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50XG4nCisgICAgICAgICAnKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnVGhlICJpZiIgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4nCisgICAgICAgICAnICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbicKKyAgICAgICAgICcgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdJdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgJworICAgICAgICAgJ29uZVxuJworICAgICAgICAgJ2J5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gQm9vbGVhbiAnCisgICAgICAgICAnb3BlcmF0aW9uc1xuJworICAgICAgICAgJ2ZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuJworICAgICAgICAgJyhhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgImlmIiBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbicKKyAgICAgICAgICdJZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlICJlbHNlIiBjbGF1c2UsIGlmXG4nCisgICAgICAgICAncHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAorICdleGNlcHRpb25zJzogJ1xuJworICAgICAgICAgICAgICAgJ0V4Y2VwdGlvbnNcbicKKyAgICAgICAgICAgICAgICcqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mICcKKyAgICAgICAgICAgICAgICdjb250cm9sXG4nCisgICAgICAgICAgICAgICAnb2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgJworICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbmFsXG4nCisgICAgICAgICAgICAgICAnY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlICcKKyAgICAgICAgICAgICAgICdlcnJvciBpc1xuJworICAgICAgICAgICAgICAgJ2RldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yICcKKyAgICAgICAgICAgICAgICdieSBhbnlcbicKKyAgICAgICAgICAgICAgICdjb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrICcKKyAgICAgICAgICAgICAgICd3aGVyZVxuJworICAgICAgICAgICAgICAgJ3RoZSBlcnJvciBvY2N1cnJlZC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdUaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgJworICAgICAgICAgICAgICAgJ3J1bi10aW1lXG4nCisgICAgICAgICAgICAgICAnZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG4nCisgICAgICAgICAgICAgICAnZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgInJhaXNlIiBzdGF0ZW1lbnQuICcKKyAgICAgICAgICAgICAgICdFeGNlcHRpb25cbicKKyAgICAgICAgICAgICAgICdoYW5kbGVycyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlICJ0cnkiIC4uLiAiZXhjZXB0IiBzdGF0ZW1lbnQuICAnCisgICAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgICAnImZpbmFsbHkiIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgJworICAgICAgICAgICAgICAgJ2NsZWFudXBcbicKKyAgICAgICAgICAgICAgICdjb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgJworICAgICAgICAgICAgICAgJ3doZXRoZXIgYW5cbicKKyAgICAgICAgICAgICAgICdleGNlcHRpb24gb2NjdXJyZWQgb3Igbm90IGluIHRoZSBwcmVjZWRpbmcgY29kZS5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdQeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gJworICAgICAgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICAgICAgJ2hhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCAnCisgICAgICAgICAgICAgICAnYW4gb3V0ZXJcbicKKyAgICAgICAgICAgICAgICdsZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgJworICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgJ2ZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSAnCisgICAgICAgICAgICAgICAnb2YgY29kZVxuJworICAgICAgICAgICAgICAgJ2Zyb20gdGhlIHRvcCkuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgJworICAgICAgICAgICAgICAgJ3Rlcm1pbmF0ZXNcbicKKyAgICAgICAgICAgICAgICdleGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gJworICAgICAgICAgICAgICAgJ2xvb3AuICBJblxuJworICAgICAgICAgICAgICAgJ2VpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSAnCisgICAgICAgICAgICAgICAnZXhjZXB0aW9uIGlzXG4nCisgICAgICAgICAgICAgICAnIlN5c3RlbUV4aXQiLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ0V4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlICJleGNlcHQiICcKKyAgICAgICAgICAgICAgICdjbGF1c2UgaXNcbicKKyAgICAgICAgICAgICAgICdzZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCAnCisgICAgICAgICAgICAgICAncmVmZXJlbmNlIHRoZVxuJworICAgICAgICAgICAgICAgJ2NsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAnY2FuIGJlXG4nCisgICAgICAgICAgICAgICAncmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICcKKyAgICAgICAgICAgICAgICdhYm91dCB0aGVcbicKKyAgICAgICAgICAgICAgICdleGNlcHRpb25hbCBjb25kaXRpb24uXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnTm90ZTogRXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gICcKKyAgICAgICAgICAgICAgICdUaGVpclxuJworICAgICAgICAgICAgICAgJyAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCAnCisgICAgICAgICAgICAgICAnd2l0aG91dFxuJworICAgICAgICAgICAgICAgJyAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biAnCisgICAgICAgICAgICAgICAndW5kZXJcbicKKyAgICAgICAgICAgICAgICcgIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICdTZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJ0cnkiIHN0YXRlbWVudCBpbiBzZWN0aW9uIFRoZSAnCisgICAgICAgICAgICAgICAndHJ5XG4nCisgICAgICAgICAgICAgICAnc3RhdGVtZW50IGFuZCAicmFpc2UiIHN0YXRlbWVudCBpbiBzZWN0aW9uIFRoZSByYWlzZSAnCisgICAgICAgICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJy1bIEZvb3Rub3RlcyBdLVxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJ1sxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCAnCisgICAgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICAgICcgICAgdGhlc2Ugb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgJworICAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICAnICAgIGNvbXBpbGVkLlxuJywKKyAnZXhlY21vZGVsJzogJ1xuJworICAgICAgICAgICAgICAnRXhlY3V0aW9uIG1vZGVsXG4nCisgICAgICAgICAgICAgICcqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdTdHJ1Y3R1cmUgb2YgYSBwcm9ncmFtXG4nCisgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0EgUHl0aG9uIHByb2dyYW0gaXMgY29uc3RydWN0ZWQgZnJvbSBjb2RlIGJsb2Nrcy4gQSAqYmxvY2sqIGlzICcKKyAgICAgICAgICAgICAgJ2EgcGllY2VcbicKKyAgICAgICAgICAgICAgJ29mIFB5dGhvbiBwcm9ncmFtIHRleHQgdGhhdCBpcyBleGVjdXRlZCBhcyBhIHVuaXQuIFRoZSAnCisgICAgICAgICAgICAgICdmb2xsb3dpbmcgYXJlXG4nCisgICAgICAgICAgICAgICdibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uIGJvZHksIGFuZCBhIGNsYXNzIGRlZmluaXRpb24uICcKKyAgICAgICAgICAgICAgJ0VhY2hcbicKKyAgICAgICAgICAgICAgJ2NvbW1hbmQgdHlwZWQgaW50ZXJhY3RpdmVseSBpcyBhIGJsb2NrLiAgQSBzY3JpcHQgZmlsZSAoYSBmaWxlICcKKyAgICAgICAgICAgICAgJ2dpdmVuXG4nCisgICAgICAgICAgICAgICdhcyBzdGFuZGFyZCBpbnB1dCB0byB0aGUgaW50ZXJwcmV0ZXIgb3Igc3BlY2lmaWVkIGFzIGEgY29tbWFuZCAnCisgICAgICAgICAgICAgICdsaW5lXG4nCisgICAgICAgICAgICAgICdhcmd1bWVudCB0byB0aGUgaW50ZXJwcmV0ZXIpIGlzIGEgY29kZSBibG9jay4gIEEgc2NyaXB0IGNvbW1hbmQgJworICAgICAgICAgICAgICAnKGFcbicKKyAgICAgICAgICAgICAgJ2NvbW1hbmQgc3BlY2lmaWVkIG9uIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGxpbmUgd2l0aCB0aGUgJworICAgICAgICAgICAgICAiJyoqLWMqKidcbiIKKyAgICAgICAgICAgICAgJ29wdGlvbikgaXMgYSBjb2RlIGJsb2NrLiAgVGhlIHN0cmluZyBhcmd1bWVudCBwYXNzZWQgdG8gdGhlICcKKyAgICAgICAgICAgICAgJ2J1aWx0LWluXG4nCisgICAgICAgICAgICAgICdmdW5jdGlvbnMgImV2YWwoKSIgYW5kICJleGVjKCkiIGlzIGEgY29kZSBibG9jay5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSAnCisgICAgICAgICAgICAgICdjb250YWluc1xuJworICAgICAgICAgICAgICAnc29tZSBhZG1pbmlzdHJhdGl2ZSBpbmZvcm1hdGlvbiAodXNlZCBmb3IgZGVidWdnaW5nKSBhbmQgJworICAgICAgICAgICAgICAnZGV0ZXJtaW5lc1xuJworICAgICAgICAgICAgICAid2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrJ3MgIgorICAgICAgICAgICAgICAnZXhlY3V0aW9uIGhhc1xuJworICAgICAgICAgICAgICAnY29tcGxldGVkLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ05hbWluZyBhbmQgYmluZGluZ1xuJworICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnQmluZGluZyBvZiBuYW1lc1xuJworICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcqTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lICcKKyAgICAgICAgICAgICAgJ2JpbmRpbmdcbicKKyAgICAgICAgICAgICAgJ29wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byAnCisgICAgICAgICAgICAgICdmdW5jdGlvbnMsXG4nCisgICAgICAgICAgICAgICciaW1wb3J0IiBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgJworICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICdjbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgJworICAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgICdpZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgImZvciIgbG9vcCBoZWFkZXIsICcKKyAgICAgICAgICAgICAgJ29yIGFmdGVyXG4nCisgICAgICAgICAgICAgICciYXMiIGluIGEgIndpdGgiIHN0YXRlbWVudCBvciAiZXhjZXB0IiBjbGF1c2UuIFRoZSAiaW1wb3J0IiAnCisgICAgICAgICAgICAgICdzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgJ29mIHRoZSBmb3JtICJmcm9tIC4uLiBpbXBvcnQgKiIgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlXG4nCisgICAgICAgICAgICAgICdpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdCB0aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgJworICAgICAgICAgICAgICAnVGhpcyBmb3JtXG4nCisgICAgICAgICAgICAgICdtYXkgb25seSBiZSB1c2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0EgdGFyZ2V0IG9jY3VycmluZyBpbiBhICJkZWwiIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgJworICAgICAgICAgICAgICAnYm91bmQgZm9yXG4nCisgICAgICAgICAgICAgICd0aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSAnCisgICAgICAgICAgICAgICduYW1lKS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrICcKKyAgICAgICAgICAgICAgJ2RlZmluZWQgYnkgYVxuJworICAgICAgICAgICAgICAnY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgJworICAgICAgICAgICAgICAndG9wLWxldmVsXG4nCisgICAgICAgICAgICAgICdjb2RlIGJsb2NrKS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCAnCisgICAgICAgICAgICAgICdibG9jayxcbicKKyAgICAgICAgICAgICAgJ3VubGVzcyBkZWNsYXJlZCBhcyAibm9ubG9jYWwiIG9yICJnbG9iYWwiLiAgSWYgYSBuYW1lIGlzIGJvdW5kICcKKyAgICAgICAgICAgICAgJ2F0IHRoZVxuJworICAgICAgICAgICAgICAnbW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGUgdmFyaWFibGVzIG9mIHRoZSAnCisgICAgICAgICAgICAgICdtb2R1bGVcbicKKyAgICAgICAgICAgICAgJ2NvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYSB2YXJpYWJsZSBpcyB1c2VkIGluIGEgJworICAgICAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICAgICAnYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlIHZhcmlhYmxlKi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0byB0aGUgJworICAgICAgICAgICAgICAnKmJpbmRpbmcqXG4nCisgICAgICAgICAgICAgICdvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgYnkgdGhlIGZvbGxvd2luZyBuYW1lIHJlc29sdXRpb24gJworICAgICAgICAgICAgICAncnVsZXMuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnUmVzb2x1dGlvbiBvZiBuYW1lc1xuJworICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdBICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiAnCisgICAgICAgICAgICAgICdhIGxvY2FsXG4nCisgICAgICAgICAgICAgICd2YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgJworICAgICAgICAgICAgICAnSWYgdGhlXG4nCisgICAgICAgICAgICAgICdkZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgJworICAgICAgICAgICAgICAnYmxvY2tzXG4nCisgICAgICAgICAgICAgICdjb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayAnCisgICAgICAgICAgICAgICdpbnRyb2R1Y2VzXG4nCisgICAgICAgICAgICAgICdhIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSAnCisgICAgICAgICAgICAgICduZWFyZXN0XG4nCisgICAgICAgICAgICAgICdlbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSAnCisgICAgICAgICAgICAgICdibG9ja1xuJworICAgICAgICAgICAgICAiaXMgY2FsbGVkIHRoZSBibG9jaydzICplbnZpcm9ubWVudCouXG4iCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1doZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgIk5hbWVFcnJvciIgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICAgICAgJ3JhaXNlZC4gSWZcbicKKyAgICAgICAgICAgICAgJ3RoZSBjdXJyZW50IHNjb3BlIGlzIGEgZnVuY3Rpb24gc2NvcGUsIGFuZCB0aGUgbmFtZSByZWZlcnMgdG8gYSAnCisgICAgICAgICAgICAgICdsb2NhbFxuJworICAgICAgICAgICAgICAndmFyaWFibGUgdGhhdCBoYXMgbm90IHlldCBiZWVuIGJvdW5kIHRvIGEgdmFsdWUgYXQgdGhlIHBvaW50ICcKKyAgICAgICAgICAgICAgJ3doZXJlIHRoZVxuJworICAgICAgICAgICAgICAnbmFtZSBpcyB1c2VkLCBhbiAiVW5ib3VuZExvY2FsRXJyb3IiIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG4nCisgICAgICAgICAgICAgICciVW5ib3VuZExvY2FsRXJyb3IiIGlzIGEgc3ViY2xhc3Mgb2YgIk5hbWVFcnJvciIuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0lmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSAnCisgICAgICAgICAgICAgICdibG9jaywgYWxsXG4nCisgICAgICAgICAgICAgICd1c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJ2N1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkICcKKyAgICAgICAgICAgICAgJ3dpdGhpbiBhXG4nCisgICAgICAgICAgICAgICdibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuICBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG4nCisgICAgICAgICAgICAgICdkZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciAnCisgICAgICAgICAgICAgICdhbnl3aGVyZVxuJworICAgICAgICAgICAgICAnd2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiAnCisgICAgICAgICAgICAgICdiZVxuJworICAgICAgICAgICAgICAnZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lICcKKyAgICAgICAgICAgICAgJ2JpbmRpbmdcbicKKyAgICAgICAgICAgICAgJ29wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0lmIHRoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiAnCisgICAgICAgICAgICAgICd0aGUgbmFtZVxuJworICAgICAgICAgICAgICAnc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluICcKKyAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAndG9wLWxldmVsIG5hbWVzcGFjZS4gIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsICcKKyAgICAgICAgICAgICAgJ25hbWVzcGFjZSBieVxuJworICAgICAgICAgICAgICAnc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlICcKKyAgICAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAgICAnY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSAnCisgICAgICAgICAgICAgICduYW1lc3BhY2VcbicKKyAgICAgICAgICAgICAgJ29mIHRoZSBtb2R1bGUgImJ1aWx0aW5zIi4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkICcKKyAgICAgICAgICAgICAgJ2ZpcnN0LiAgSWZcbicKKyAgICAgICAgICAgICAgJ3RoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpcyAnCisgICAgICAgICAgICAgICdzZWFyY2hlZC4gIFRoZVxuJworICAgICAgICAgICAgICAnImdsb2JhbCIgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnVGhlICJnbG9iYWwiIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmcgJworICAgICAgICAgICAgICAnb3BlcmF0aW9uXG4nCisgICAgICAgICAgICAgICdpbiB0aGUgc2FtZSBibG9jay4gIElmIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBmb3IgYSBmcmVlICcKKyAgICAgICAgICAgICAgJ3ZhcmlhYmxlXG4nCisgICAgICAgICAgICAgICdjb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzIHRyZWF0ZWQgYXMgYSAnCisgICAgICAgICAgICAgICdnbG9iYWwuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSAibm9ubG9jYWwiIHN0YXRlbWVudCBjYXVzZXMgY29ycmVzcG9uZGluZyBuYW1lcyB0byByZWZlciAnCisgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAncHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGZ1bmN0aW9uICcKKyAgICAgICAgICAgICAgJ3Njb3BlLlxuJworICAgICAgICAgICAgICAnIlN5bnRheEVycm9yIiBpcyByYWlzZWQgYXQgY29tcGlsZSB0aW1lIGlmIHRoZSBnaXZlbiBuYW1lIGRvZXMgJworICAgICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICAgICdleGlzdCBpbiBhbnkgZW5jbG9zaW5nIGZ1bmN0aW9uIHNjb3BlLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdUaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0ICcKKyAgICAgICAgICAgICAgJ3RpbWUgYVxuJworICAgICAgICAgICAgICAnbW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgJworICAgICAgICAgICAgICAnY2FsbGVkXG4nCisgICAgICAgICAgICAgICciX19tYWluX18iLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdDbGFzcyBkZWZpbml0aW9uIGJsb2NrcyBhbmQgYXJndW1lbnRzIHRvICJleGVjKCkiIGFuZCAiZXZhbCgpIiAnCisgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgJ3NwZWNpYWwgaW4gdGhlIGNvbnRleHQgb2YgbmFtZSByZXNvbHV0aW9uLiBBIGNsYXNzIGRlZmluaXRpb24gJworICAgICAgICAgICAgICAnaXMgYW5cbicKKyAgICAgICAgICAgICAgJ2V4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lIG5hbWVzLiBUaGVzZSAnCisgICAgICAgICAgICAgICdyZWZlcmVuY2VzXG4nCisgICAgICAgICAgICAgICdmb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uIHdpdGggYW4gZXhjZXB0aW9uICcKKyAgICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICAgJ3VuYm91bmQgbG9jYWwgdmFyaWFibGVzIGFyZSBsb29rZWQgdXAgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuICcKKyAgICAgICAgICAgICAgJ1RoZVxuJworICAgICAgICAgICAgICAnbmFtZXNwYWNlIG9mIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlY29tZXMgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IG9mXG4nCisgICAgICAgICAgICAgICd0aGUgY2xhc3MuIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGEgY2xhc3MgYmxvY2sgaXMgJworICAgICAgICAgICAgICAnbGltaXRlZCB0b1xuJworICAgICAgICAgICAgICAndGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlIGNvZGUgYmxvY2tzIG9mICcKKyAgICAgICAgICAgICAgJ21ldGhvZHMgLS1cbicKKyAgICAgICAgICAgICAgJ3RoaXMgaW5jbHVkZXMgY29tcHJlaGVuc2lvbnMgYW5kIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZSAnCisgICAgICAgICAgICAgICd0aGV5IGFyZVxuJworICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQgdXNpbmcgYSBmdW5jdGlvbiBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgJworICAgICAgICAgICAgICAnZm9sbG93aW5nXG4nCisgICAgICAgICAgICAgICd3aWxsIGZhaWw6XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGNsYXNzIEE6XG4nCisgICAgICAgICAgICAgICcgICAgICAgYSA9IDQyXG4nCisgICAgICAgICAgICAgICcgICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0J1aWx0aW5zIGFuZCByZXN0cmljdGVkIGV4ZWN1dGlvblxuJworICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlICcKKyAgICAgICAgICAgICAgJ2Jsb2NrXG4nCisgICAgICAgICAgICAgICdpcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lICJfX2J1aWx0aW5zX18iIGluIGl0cyAnCisgICAgICAgICAgICAgICdnbG9iYWxcbicKKyAgICAgICAgICAgICAgJ25hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGUgJworICAgICAgICAgICAgICAnbGF0dGVyIGNhc2VcbicKKyAgICAgICAgICAgICAgInRoZSBtb2R1bGUncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGUgIgorICAgICAgICAgICAgICAnIl9fbWFpbl9fIlxuJworICAgICAgICAgICAgICAnbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyB0aGUgYnVpbHQtaW4gbW9kdWxlICJidWlsdGlucyI7IHdoZW4gJworICAgICAgICAgICAgICAnaW4gYW55XG4nCisgICAgICAgICAgICAgICdvdGhlciBtb2R1bGUsICJfX2J1aWx0aW5zX18iIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJyJidWlsdGlucyIgbW9kdWxlIGl0c2VsZi4gICJfX2J1aWx0aW5zX18iIGNhbiBiZSBzZXQgdG8gYSAnCisgICAgICAgICAgICAgICd1c2VyLWNyZWF0ZWRcbicKKyAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbicKKyAgICAgICAgICAgICAgJyJfX2J1aWx0aW5zX18iOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICAnCisgICAgICAgICAgICAgICdVc2Vyc1xuJworICAgICAgICAgICAgICAnd2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgJworICAgICAgICAgICAgICAnImltcG9ydCJcbicKKyAgICAgICAgICAgICAgJ3RoZSAiYnVpbHRpbnMiIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzIGFwcHJvcHJpYXRlbHkuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG4nCisgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnTmFtZSByZXNvbHV0aW9uIG9mIGZyZWUgdmFyaWFibGVzIG9jY3VycyBhdCBydW50aW1lLCBub3QgYXQgJworICAgICAgICAgICAgICAnY29tcGlsZVxuJworICAgICAgICAgICAgICAndGltZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIHByaW50IDQyOlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICcgICBpID0gMTBcbicKKyAgICAgICAgICAgICAgJyAgIGRlZiBmKCk6XG4nCisgICAgICAgICAgICAgICcgICAgICAgcHJpbnQoaSlcbicKKyAgICAgICAgICAgICAgJyAgIGkgPSA0MlxuJworICAgICAgICAgICAgICAnICAgZigpXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsICcKKyAgICAgICAgICAgICAgJ3doZW4gdXNlZFxuJworICAgICAgICAgICAgICAnaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgJworICAgICAgICAgICAgICAnaWxsZWdhbCB0b1xuJworICAgICAgICAgICAgICAnZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSAiZXZhbCgpIiBhbmQgImV4ZWMoKSIgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgJworICAgICAgICAgICAgICAnZnVsbFxuJworICAgICAgICAgICAgICAnZW52aXJvbm1lbnQgZm9yIHJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgJworICAgICAgICAgICAgICAnbG9jYWxcbicKKyAgICAgICAgICAgICAgJ2FuZCBnbG9iYWwgbmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCAnCisgICAgICAgICAgICAgICdyZXNvbHZlZFxuJworICAgICAgICAgICAgICAnaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgJworICAgICAgICAgICAgICAnbmFtZXNwYWNlLiAgWzFdXG4nCisgICAgICAgICAgICAgICdUaGUgImV4ZWMoKSIgYW5kICJldmFsKCkiIGZ1bmN0aW9ucyBoYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0b1xuJworICAgICAgICAgICAgICAnb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLiAgSWYgb25seSBvbmUgbmFtZXNwYWNlICcKKyAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICdzcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRXhjZXB0aW9uc1xuJworICAgICAgICAgICAgICAnPT09PT09PT09PVxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgJworICAgICAgICAgICAgICAnY29udHJvbFxuJworICAgICAgICAgICAgICAnb2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWxcbicKKyAgICAgICAgICAgICAgJ2NvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSAnCisgICAgICAgICAgICAgICdlcnJvciBpc1xuJworICAgICAgICAgICAgICAnZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgJworICAgICAgICAgICAgICAnYnkgYW55XG4nCisgICAgICAgICAgICAgICdjb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrICcKKyAgICAgICAgICAgICAgJ3doZXJlXG4nCisgICAgICAgICAgICAgICd0aGUgZXJyb3Igb2NjdXJyZWQuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSAnCisgICAgICAgICAgICAgICdydW4tdGltZVxuJworICAgICAgICAgICAgICAnZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG4nCisgICAgICAgICAgICAgICdleHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSAicmFpc2UiIHN0YXRlbWVudC4gJworICAgICAgICAgICAgICAnRXhjZXB0aW9uXG4nCisgICAgICAgICAgICAgICdoYW5kbGVycyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlICJ0cnkiIC4uLiAiZXhjZXB0IiBzdGF0ZW1lbnQuICAnCisgICAgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgICAgJyJmaW5hbGx5IiBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5ICcKKyAgICAgICAgICAgICAgJ2NsZWFudXBcbicKKyAgICAgICAgICAgICAgJ2NvZGUgd2hpY2ggZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24sIGJ1dCBpcyBleGVjdXRlZCAnCisgICAgICAgICAgICAgICd3aGV0aGVyIGFuXG4nCisgICAgICAgICAgICAgICdleGNlcHRpb24gb2NjdXJyZWQgb3Igbm90IGluIHRoZSBwcmVjZWRpbmcgY29kZS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnUHl0aG9uIHVzZXMgdGhlICJ0ZXJtaW5hdGlvbiIgbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuICcKKyAgICAgICAgICAgICAgJ2V4Y2VwdGlvblxuJworICAgICAgICAgICAgICAnaGFuZGxlciBjYW4gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCBhbmQgY29udGludWUgZXhlY3V0aW9uIGF0IGFuICcKKyAgICAgICAgICAgICAgJ291dGVyXG4nCisgICAgICAgICAgICAgICdsZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgJworICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICdmYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgJworICAgICAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICAgICAnZnJvbSB0aGUgdG9wKS5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgJworICAgICAgICAgICAgICAndGVybWluYXRlc1xuJworICAgICAgICAgICAgICAnZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtLCBvciByZXR1cm5zIHRvIGl0cyBpbnRlcmFjdGl2ZSBtYWluICcKKyAgICAgICAgICAgICAgJ2xvb3AuICBJblxuJworICAgICAgICAgICAgICAnZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIGJhY2t0cmFjZSwgZXhjZXB0IHdoZW4gdGhlICcKKyAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiBpc1xuJworICAgICAgICAgICAgICAnIlN5c3RlbUV4aXQiLlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdFeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSAiZXhjZXB0IiAnCisgICAgICAgICAgICAgICdjbGF1c2UgaXNcbicKKyAgICAgICAgICAgICAgJ3NlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0ICcKKyAgICAgICAgICAgICAgJ3JlZmVyZW5jZSB0aGVcbicKKyAgICAgICAgICAgICAgJ2NsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICdjYW4gYmVcbicKKyAgICAgICAgICAgICAgJ3JlY2VpdmVkIGJ5IHRoZSBoYW5kbGVyIGFuZCBjYW4gY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAnCisgICAgICAgICAgICAgICdhYm91dCB0aGVcbicKKyAgICAgICAgICAgICAgJ2V4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnTm90ZTogRXhjZXB0aW9uIG1lc3NhZ2VzIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gICcKKyAgICAgICAgICAgICAgJ1RoZWlyXG4nCisgICAgICAgICAgICAgICcgIGNvbnRlbnRzIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgJworICAgICAgICAgICAgICAnd2l0aG91dFxuJworICAgICAgICAgICAgICAnICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuICcKKyAgICAgICAgICAgICAgJ3VuZGVyXG4nCisgICAgICAgICAgICAgICcgIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSAidHJ5IiBzdGF0ZW1lbnQgaW4gc2VjdGlvbiBUaGUgJworICAgICAgICAgICAgICAndHJ5XG4nCisgICAgICAgICAgICAgICdzdGF0ZW1lbnQgYW5kICJyYWlzZSIgc3RhdGVtZW50IGluIHNlY3Rpb24gVGhlIHJhaXNlICcKKyAgICAgICAgICAgICAgJ3N0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnLVsgRm9vdG5vdGVzIF0tXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1sxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCAnCisgICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICAnICAgIHRoZXNlIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlICcKKyAgICAgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgICAgICcgICAgY29tcGlsZWQuXG4nLAorICdleHBybGlzdHMnOiAnXG4nCisgICAgICAgICAgICAgICdFeHByZXNzaW9uIGxpc3RzXG4nCisgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGV4cHJlc3Npb25fbGlzdCAgICA6Oj0gZXhwcmVzc2lvbiAoICIsIiBleHByZXNzaW9uICkqIFsiLCJdXG4nCisgICAgICAgICAgICAgICcgICBzdGFycmVkX2xpc3QgICAgICAgOjo9IHN0YXJyZWRfaXRlbSAoICIsIiBzdGFycmVkX2l0ZW0gKSogJworICAgICAgICAgICAgICAnWyIsIl1cbicKKyAgICAgICAgICAgICAgJyAgIHN0YXJyZWRfZXhwcmVzc2lvbiA6Oj0gZXhwcmVzc2lvbiB8ICggc3RhcnJlZF9pdGVtICIsIiApKiAnCisgICAgICAgICAgICAgICdbc3RhcnJlZF9pdGVtXVxuJworICAgICAgICAgICAgICAnICAgc3RhcnJlZF9pdGVtICAgICAgIDo6PSBleHByZXNzaW9uIHwgIioiIG9yX2V4cHJcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnRXhjZXB0IHdoZW4gcGFydCBvZiBhIGxpc3Qgb3Igc2V0IGRpc3BsYXksIGFuIGV4cHJlc3Npb24gbGlzdFxuJworICAgICAgICAgICAgICAnY29udGFpbmluZyBhdCBsZWFzdCBvbmUgY29tbWEgeWllbGRzIGEgdHVwbGUuICBUaGUgbGVuZ3RoIG9mICcKKyAgICAgICAgICAgICAgJ3RoZSB0dXBsZVxuJworICAgICAgICAgICAgICAnaXMgdGhlIG51bWJlciBvZiBleHByZXNzaW9ucyBpbiB0aGUgbGlzdC4gIFRoZSBleHByZXNzaW9ucyBhcmVcbicKKyAgICAgICAgICAgICAgJ2V2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQuXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0FuIGFzdGVyaXNrICIqIiBkZW5vdGVzICppdGVyYWJsZSB1bnBhY2tpbmcqLiAgSXRzIG9wZXJhbmQgbXVzdCAnCisgICAgICAgICAgICAgICdiZSBhblxuJworICAgICAgICAgICAgICAnKml0ZXJhYmxlKi4gIFRoZSBpdGVyYWJsZSBpcyBleHBhbmRlZCBpbnRvIGEgc2VxdWVuY2Ugb2YgaXRlbXMsICcKKyAgICAgICAgICAgICAgJ3doaWNoXG4nCisgICAgICAgICAgICAgICdhcmUgaW5jbHVkZWQgaW4gdGhlIG5ldyB0dXBsZSwgbGlzdCwgb3Igc2V0LCBhdCB0aGUgc2l0ZSBvZiAnCisgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgJ3VucGFja2luZy5cbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy41OiBJdGVyYWJsZSB1bnBhY2tpbmcgaW4gZXhwcmVzc2lvbiBsaXN0cywgJworICAgICAgICAgICAgICAnb3JpZ2luYWxseVxuJworICAgICAgICAgICAgICAncHJvcG9zZWQgYnkgKipQRVAgNDQ4KiouXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ1RoZSB0cmFpbGluZyBjb21tYSBpcyByZXF1aXJlZCBvbmx5IHRvIGNyZWF0ZSBhIHNpbmdsZSB0dXBsZSAnCisgICAgICAgICAgICAgICcoYS5rLmEuIGFcbicKKyAgICAgICAgICAgICAgJypzaW5nbGV0b24qKTsgaXQgaXMgb3B0aW9uYWwgaW4gYWxsIG90aGVyIGNhc2VzLiAgQSBzaW5nbGUgJworICAgICAgICAgICAgICAnZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICAid2l0aG91dCBhIHRyYWlsaW5nIGNvbW1hIGRvZXNuJ3QgY3JlYXRlIGEgdHVwbGUsIGJ1dCByYXRoZXIgIgorICAgICAgICAgICAgICAneWllbGRzIHRoZVxuJworICAgICAgICAgICAgICAndmFsdWUgb2YgdGhhdCBleHByZXNzaW9uLiAoVG8gY3JlYXRlIGFuIGVtcHR5IHR1cGxlLCB1c2UgYW4gJworICAgICAgICAgICAgICAnZW1wdHkgcGFpclxuJworICAgICAgICAgICAgICAnb2YgcGFyZW50aGVzZXM6ICIoKSIuKVxuJywKKyAnZmxvYXRpbmcnOiAnXG4nCisgICAgICAgICAgICAgJ0Zsb2F0aW5nIHBvaW50IGxpdGVyYWxzXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGbG9hdGluZyBwb2ludCBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbFxuJworICAgICAgICAgICAgICdkZWZpbml0aW9uczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGZsb2F0bnVtYmVyICAgOjo9IHBvaW50ZmxvYXQgfCBleHBvbmVudGZsb2F0XG4nCisgICAgICAgICAgICAgJyAgIHBvaW50ZmxvYXQgICAgOjo9IFtpbnRwYXJ0XSBmcmFjdGlvbiB8IGludHBhcnQgIi4iXG4nCisgICAgICAgICAgICAgJyAgIGV4cG9uZW50ZmxvYXQgOjo9IChpbnRwYXJ0IHwgcG9pbnRmbG9hdCkgZXhwb25lbnRcbicKKyAgICAgICAgICAgICAnICAgaW50cGFydCAgICAgICA6Oj0gZGlnaXQrXG4nCisgICAgICAgICAgICAgJyAgIGZyYWN0aW9uICAgICAgOjo9ICIuIiBkaWdpdCtcbicKKyAgICAgICAgICAgICAnICAgZXhwb25lbnQgICAgICA6Oj0gKCJlIiB8ICJFIikgWyIrIiB8ICItIl0gZGlnaXQrXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlIHRoYXQgdGhlIGludGVnZXIgYW5kIGV4cG9uZW50IHBhcnRzIGFyZSBhbHdheXMgaW50ZXJwcmV0ZWQgJworICAgICAgICAgICAgICd1c2luZ1xuJworICAgICAgICAgICAgICdyYWRpeCAxMC4gRm9yIGV4YW1wbGUsICIwNzdlMDEwIiBpcyBsZWdhbCwgYW5kIGRlbm90ZXMgdGhlIHNhbWUgJworICAgICAgICAgICAgICdudW1iZXJcbicKKyAgICAgICAgICAgICAnYXMgIjc3ZTEwIi4gVGhlIGFsbG93ZWQgcmFuZ2Ugb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgaXNcbicKKyAgICAgICAgICAgICAnaW1wbGVtZW50YXRpb24tZGVwZW5kZW50LiBTb21lIGV4YW1wbGVzIG9mIGZsb2F0aW5nIHBvaW50ICcKKyAgICAgICAgICAgICAnbGl0ZXJhbHM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAzLjE0ICAgIDEwLiAgICAuMDAxICAgIDFlMTAwICAgIDMuMTRlLTEwICAgIDBlMFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlICcKKyAgICAgICAgICAgICAnIi0xIlxuJworICAgICAgICAgICAgICdpcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciAiLSIgYW5kICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2xpdGVyYWwgIjEiLlxuJywKKyAnZm9yJzogJ1xuJworICAgICAgICAnVGhlICJmb3IiIHN0YXRlbWVudFxuJworICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAnXG4nCisgICAgICAgICdUaGUgImZvciIgc3RhdGVtZW50IGlzIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhICcKKyAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICcoc3VjaCBhcyBhIHN0cmluZywgdHVwbGUgb3IgbGlzdCkgb3Igb3RoZXIgaXRlcmFibGUgb2JqZWN0OlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICBmb3Jfc3RtdCA6Oj0gImZvciIgdGFyZ2V0X2xpc3QgImluIiBleHByZXNzaW9uX2xpc3QgIjoiIHN1aXRlXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSBleHByZXNzaW9uIGxpc3QgaXMgZXZhbHVhdGVkIG9uY2U7IGl0IHNob3VsZCB5aWVsZCBhbiBpdGVyYWJsZVxuJworICAgICAgICAnb2JqZWN0LiAgQW4gaXRlcmF0b3IgaXMgY3JlYXRlZCBmb3IgdGhlIHJlc3VsdCBvZiB0aGVcbicKKyAgICAgICAgJyJleHByZXNzaW9uX2xpc3QiLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG4nCisgICAgICAgICdwcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IuICAnCisgICAgICAgICdFYWNoXG4nCisgICAgICAgICdpdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlc1xuJworICAgICAgICAnZm9yIGFzc2lnbm1lbnRzIChzZWUgQXNzaWdubWVudCBzdGF0ZW1lbnRzKSwgYW5kIHRoZW4gdGhlIHN1aXRlIGlzXG4nCisgICAgICAgICdleGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZSBleGhhdXN0ZWQgKHdoaWNoIGlzIGltbWVkaWF0ZWx5IHdoZW4gJworICAgICAgICAndGhlXG4nCisgICAgICAgICdzZXF1ZW5jZSBpcyBlbXB0eSBvciBhbiBpdGVyYXRvciByYWlzZXMgYSAiU3RvcEl0ZXJhdGlvbiIgJworICAgICAgICAnZXhjZXB0aW9uKSxcbicKKyAgICAgICAgJ3RoZSBzdWl0ZSBpbiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgJworICAgICAgICAnbG9vcFxuJworICAgICAgICAndGVybWluYXRlcy5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnQSAiYnJlYWsiIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxuJworICAgICAgICAnd2l0aG91dCBleGVjdXRpbmcgdGhlICJlbHNlIiBjbGF1c2VcJ3Mgc3VpdGUuICBBICJjb250aW51ZSIgJworICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICdleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCAnCisgICAgICAgICdjb250aW51ZXNcbicKKyAgICAgICAgJ3dpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgImVsc2UiIGNsYXVzZSBpZiB0aGVyZSBpcyBubyBuZXh0XG4nCisgICAgICAgICdpdGVtLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdUaGUgZm9yLWxvb3AgbWFrZXMgYXNzaWdubWVudHMgdG8gdGhlIHZhcmlhYmxlcyhzKSBpbiB0aGUgdGFyZ2V0ICcKKyAgICAgICAgJ2xpc3QuXG4nCisgICAgICAgICdUaGlzIG92ZXJ3cml0ZXMgYWxsIHByZXZpb3VzIGFzc2lnbm1lbnRzIHRvIHRob3NlIHZhcmlhYmxlcyAnCisgICAgICAgICdpbmNsdWRpbmdcbicKKyAgICAgICAgJ3Rob3NlIG1hZGUgaW4gdGhlIHN1aXRlIG9mIHRoZSBmb3ItbG9vcDpcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgZm9yIGkgaW4gcmFuZ2UoMTApOlxuJworICAgICAgICAnICAgICAgIHByaW50KGkpXG4nCisgICAgICAgICcgICAgICAgaSA9IDUgICAgICAgICAgICAgIyB0aGlzIHdpbGwgbm90IGFmZmVjdCB0aGUgZm9yLWxvb3BcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaSB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlICcKKyAgICAgICAgJ25leHRcbicKKyAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4IGluIHRoZSByYW5nZVxuJworICAgICAgICAnXG4nCisgICAgICAgICdOYW1lcyBpbiB0aGUgdGFyZ2V0IGxpc3QgYXJlIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsXG4nCisgICAgICAgICdidXQgaWYgdGhlIHNlcXVlbmNlIGlzIGVtcHR5LCB0aGV5IHdpbGwgbm90IGhhdmUgYmVlbiBhc3NpZ25lZCB0byBhdFxuJworICAgICAgICAnYWxsIGJ5IHRoZSBsb29wLiAgSGludDogdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJyYW5nZSgpIiByZXR1cm5zIGFuXG4nCisgICAgICAgICdpdGVyYXRvciBvZiBpbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzICJmb3IgJworICAgICAgICAnaVxuJworICAgICAgICAnOj0gYSB0byBiIGRvIjsgZS5nLiwgImxpc3QocmFuZ2UoMykpIiByZXR1cm5zIHRoZSBsaXN0ICJbMCwgMSwgMl0iLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdOb3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZVxuJworICAgICAgICAnICBsb29wICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuICBBblxuJworICAgICAgICAnICBpbnRlcm5hbCBjb3VudGVyIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBpdGVtIGlzIHVzZWQgbmV4dCxcbicKKyAgICAgICAgJyAgYW5kIHRoaXMgaXMgaW5jcmVtZW50ZWQgb24gZWFjaCBpdGVyYXRpb24uICBXaGVuIHRoaXMgY291bnRlciBoYXNcbicKKyAgICAgICAgJyAgcmVhY2hlZCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSB0aGUgbG9vcCB0ZXJtaW5hdGVzLiAgVGhpcyAnCisgICAgICAgICdtZWFuc1xuJworICAgICAgICAnICB0aGF0IGlmIHRoZSBzdWl0ZSBkZWxldGVzIHRoZSBjdXJyZW50IChvciBhIHByZXZpb3VzKSBpdGVtIGZyb20gJworICAgICAgICAndGhlXG4nCisgICAgICAgICcgIHNlcXVlbmNlLCB0aGUgbmV4dCBpdGVtIHdpbGwgYmUgc2tpcHBlZCAoc2luY2UgaXQgZ2V0cyB0aGUgaW5kZXggJworICAgICAgICAnb2ZcbicKKyAgICAgICAgJyAgdGhlIGN1cnJlbnQgaXRlbSB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHRyZWF0ZWQpLiAgTGlrZXdpc2UsIGlmICcKKyAgICAgICAgJ3RoZVxuJworICAgICAgICAnICBzdWl0ZSBpbnNlcnRzIGFuIGl0ZW0gaW4gdGhlIHNlcXVlbmNlIGJlZm9yZSB0aGUgY3VycmVudCBpdGVtLCB0aGVcbicKKyAgICAgICAgJyAgY3VycmVudCBpdGVtIHdpbGwgYmUgdHJlYXRlZCBhZ2FpbiB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlIGxvb3AuXG4nCisgICAgICAgICcgIFRoaXMgY2FuIGxlYWQgdG8gbmFzdHkgYnVncyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IG1ha2luZyBhXG4nCisgICAgICAgICcgIHRlbXBvcmFyeSBjb3B5IHVzaW5nIGEgc2xpY2Ugb2YgdGhlIHdob2xlIHNlcXVlbmNlLCBlLmcuLFxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICAgIGZvciB4IGluIGFbOl06XG4nCisgICAgICAgICcgICAgICAgICBpZiB4IDwgMDogYS5yZW1vdmUoeClcbicsCisgJ2Zvcm1hdHN0cmluZ3MnOiAnXG4nCisgICAgICAgICAgICAgICAgICAnRm9ybWF0IFN0cmluZyBTeW50YXhcbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAic3RyLmZvcm1hdCgpIiBtZXRob2QgYW5kIHRoZSAiRm9ybWF0dGVyIiBjbGFzcyBzaGFyZSAnCisgICAgICAgICAgICAgICAgICAndGhlIHNhbWVcbicKKyAgICAgICAgICAgICAgICAgICdzeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiAnCisgICAgICAgICAgICAgICAgICAnIkZvcm1hdHRlciIsXG4nCisgICAgICAgICAgICAgICAgICAnc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuICBUaGUgJworICAgICAgICAgICAgICAgICAgJ3N5bnRheCBpc1xuJworICAgICAgICAgICAgICAgICAgJ3JlbGF0ZWQgdG8gdGhhdCBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzLCBidXQgdGhlcmUgJworICAgICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVuY2VzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0Zvcm1hdCBzdHJpbmdzIGNvbnRhaW4gInJlcGxhY2VtZW50IGZpZWxkcyIgc3Vycm91bmRlZCBieSAnCisgICAgICAgICAgICAgICAgICAnY3VybHkgYnJhY2VzXG4nCisgICAgICAgICAgICAgICAgICAnInt9Ii4gQW55dGhpbmcgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIGJyYWNlcyBpcyAnCisgICAgICAgICAgICAgICAgICAnY29uc2lkZXJlZCBsaXRlcmFsXG4nCisgICAgICAgICAgICAgICAgICAndGV4dCwgd2hpY2ggaXMgY29waWVkIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiAgSWYgeW91IG5lZWQgJworICAgICAgICAgICAgICAgICAgJ3RvIGluY2x1ZGVcbicKKyAgICAgICAgICAgICAgICAgICdhIGJyYWNlIGNoYXJhY3RlciBpbiB0aGUgbGl0ZXJhbCB0ZXh0LCBpdCBjYW4gYmUgZXNjYXBlZCBieSAnCisgICAgICAgICAgICAgICAgICAnZG91Ymxpbmc6XG4nCisgICAgICAgICAgICAgICAgICAnInt7IiBhbmQgIn19Ii5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgZ3JhbW1hciBmb3IgYSByZXBsYWNlbWVudCBmaWVsZCBpcyBhcyBmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgIHJlcGxhY2VtZW50X2ZpZWxkIDo6PSAieyIgW2ZpZWxkX25hbWVdIFsiISIgJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb25dIFsiOiIgZm9ybWF0X3NwZWNdICJ9IlxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGZpZWxkX25hbWUgICAgICAgIDo6PSBhcmdfbmFtZSAoIi4iIGF0dHJpYnV0ZV9uYW1lIHwgJworICAgICAgICAgICAgICAgICAgJyJbIiBlbGVtZW50X2luZGV4ICJdIikqXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgYXJnX25hbWUgICAgICAgICAgOjo9IFtpZGVudGlmaWVyIHwgaW50ZWdlcl1cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICBhdHRyaWJ1dGVfbmFtZSAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGVsZW1lbnRfaW5kZXggICAgIDo6PSBpbnRlZ2VyIHwgaW5kZXhfc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgaW5kZXhfc3RyaW5nICAgICAgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgJworICAgICAgICAgICAgICAgICAgJyJdIj4gK1xuJworICAgICAgICAgICAgICAgICAgJyAgICAgIGNvbnZlcnNpb24gICAgICAgIDo6PSAiciIgfCAicyIgfCAiYSJcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICBmb3JtYXRfc3BlYyAgICAgICA6Oj0gPGRlc2NyaWJlZCBpbiB0aGUgbmV4dCAnCisgICAgICAgICAgICAgICAgICAnc2VjdGlvbj5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJbiBsZXNzIGZvcm1hbCB0ZXJtcywgdGhlIHJlcGxhY2VtZW50IGZpZWxkIGNhbiBzdGFydCB3aXRoICcKKyAgICAgICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgICAgICAnKmZpZWxkX25hbWUqIHRoYXQgc3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgdG8gYmUgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlZFxuJworICAgICAgICAgICAgICAgICAgJ2FuZCBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiB0aGUgcmVwbGFjZW1lbnQgJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkLiBUaGVcbicKKyAgICAgICAgICAgICAgICAgICcqZmllbGRfbmFtZSogaXMgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhICAqY29udmVyc2lvbiogJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkLCB3aGljaCBpc1xuJworICAgICAgICAgICAgICAgICAgJ3ByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50ICJcJyFcJyIsIGFuZCBhICcKKyAgICAgICAgICAgICAgICAgICcqZm9ybWF0X3NwZWMqLCB3aGljaCBpc1xuJworICAgICAgICAgICAgICAgICAgJ3ByZWNlZGVkIGJ5IGEgY29sb24gIlwnOlwnIi4gIFRoZXNlIHNwZWNpZnkgYSBub24tZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0IGZvciB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdyZXBsYWNlbWVudCB2YWx1ZS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdTZWUgYWxzbyB0aGUgRm9ybWF0IFNwZWNpZmljYXRpb24gTWluaS1MYW5ndWFnZSBzZWN0aW9uLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqZmllbGRfbmFtZSogaXRzZWxmIGJlZ2lucyB3aXRoIGFuICphcmdfbmFtZSogdGhhdCBpcyAnCisgICAgICAgICAgICAgICAgICAnZWl0aGVyIGFcbicKKyAgICAgICAgICAgICAgICAgICJudW1iZXIgb3IgYSBrZXl3b3JkLiAgSWYgaXQncyBhIG51bWJlciwgaXQgcmVmZXJzIHRvIGEgIgorICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgICJhcmd1bWVudCwgYW5kIGlmIGl0J3MgYSBrZXl3b3JkLCBpdCByZWZlcnMgdG8gYSBuYW1lZCAiCisgICAgICAgICAgICAgICAgICAna2V5d29yZFxuJworICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50LiAgSWYgdGhlIG51bWVyaWNhbCBhcmdfbmFtZXMgaW4gYSBmb3JtYXQgc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICdhcmUgMCwgMSwgMixcbicKKyAgICAgICAgICAgICAgICAgICcuLi4gaW4gc2VxdWVuY2UsIHRoZXkgY2FuIGFsbCBiZSBvbWl0dGVkIChub3QganVzdCBzb21lKSAnCisgICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgJ251bWJlcnMgMCwgMSwgMiwgLi4uIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbiB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICdvcmRlci5cbicKKyAgICAgICAgICAgICAgICAgICdCZWNhdXNlICphcmdfbmFtZSogaXMgbm90IHF1b3RlLWRlbGltaXRlZCwgaXQgaXMgbm90ICcKKyAgICAgICAgICAgICAgICAgICdwb3NzaWJsZSB0b1xuJworICAgICAgICAgICAgICAgICAgJ3NwZWNpZnkgYXJiaXRyYXJ5IGRpY3Rpb25hcnkga2V5cyAoZS5nLiwgdGhlIHN0cmluZ3MgJworICAgICAgICAgICAgICAgICAgJyJcJzEwXCciIG9yXG4nCisgICAgICAgICAgICAgICAgICAnIlwnOi1dXCciKSB3aXRoaW4gYSBmb3JtYXQgc3RyaW5nLiBUaGUgKmFyZ19uYW1lKiBjYW4gYmUgJworICAgICAgICAgICAgICAgICAgJ2ZvbGxvd2VkIGJ5IGFueVxuJworICAgICAgICAgICAgICAgICAgJ251bWJlciBvZiBpbmRleCBvciBhdHRyaWJ1dGUgZXhwcmVzc2lvbnMuIEFuIGV4cHJlc3Npb24gb2YgJworICAgICAgICAgICAgICAgICAgJ3RoZSBmb3JtXG4nCisgICAgICAgICAgICAgICAgICAnIlwnLm5hbWVcJyIgc2VsZWN0cyB0aGUgbmFtZWQgYXR0cmlidXRlIHVzaW5nICJnZXRhdHRyKCkiLCAnCisgICAgICAgICAgICAgICAgICAnd2hpbGUgYW5cbicKKyAgICAgICAgICAgICAgICAgICdleHByZXNzaW9uIG9mIHRoZSBmb3JtICJcJ1tpbmRleF1cJyIgZG9lcyBhbiBpbmRleCBsb29rdXAgJworICAgICAgICAgICAgICAgICAgJ3VzaW5nXG4nCisgICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0NoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgJworICAgICAgICAgICAgICAgICAgJ2NhbiBiZVxuJworICAgICAgICAgICAgICAgICAgJ29taXR0ZWQsIHNvICJcJ3t9IHt9XCciIGlzIGVxdWl2YWxlbnQgdG8gIlwnezB9IHsxfVwnIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdTb21lIHNpbXBsZSBmb3JtYXQgc3RyaW5nIGV4YW1wbGVzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJGaXJzdCwgdGhvdSBzaGFsdCBjb3VudCB0byB7MH0iICAjIFJlZmVyZW5jZXMgZmlyc3QgJworICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWwgYXJndW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICcgICAiQnJpbmcgbWUgYSB7fSIgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdGx5ICcKKyAgICAgICAgICAgICAgICAgICdyZWZlcmVuY2VzIHRoZSBmaXJzdCBwb3NpdGlvbmFsIGFyZ3VtZW50XG4nCisgICAgICAgICAgICAgICAgICAnICAgIkZyb20ge30gdG8ge30iICAgICAgICAgICAgICAgICAgICMgU2FtZSBhcyAiRnJvbSB7MH0gdG8gJworICAgICAgICAgICAgICAgICAgJ3sxfSJcbicKKyAgICAgICAgICAgICAgICAgICcgICAiTXkgcXVlc3QgaXMge25hbWV9IiAgICAgICAgICAgICAgIyBSZWZlcmVuY2VzIGtleXdvcmQgJworICAgICAgICAgICAgICAgICAgImFyZ3VtZW50ICduYW1lJ1xuIgorICAgICAgICAgICAgICAgICAgJyAgICJXZWlnaHQgaW4gdG9ucyB7MC53ZWlnaHR9IiAgICAgICAjIFwnd2VpZ2h0XCcgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgICdvZiBmaXJzdCBwb3NpdGlvbmFsIGFyZ1xuJworICAgICAgICAgICAgICAgICAgJyAgICJVbml0cyBkZXN0cm95ZWQ6IHtwbGF5ZXJzWzBdfSIgICAjIEZpcnN0IGVsZW1lbnQgb2YgJworICAgICAgICAgICAgICAgICAgImtleXdvcmQgYXJndW1lbnQgJ3BsYXllcnMnLlxuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqY29udmVyc2lvbiogZmllbGQgY2F1c2VzIGEgdHlwZSBjb2VyY2lvbiBiZWZvcmUgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRpbmcuXG4nCisgICAgICAgICAgICAgICAgICAnTm9ybWFsbHksIHRoZSBqb2Igb2YgZm9ybWF0dGluZyBhIHZhbHVlIGlzIGRvbmUgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgICciX19mb3JtYXRfXygpIlxuJworICAgICAgICAgICAgICAgICAgJ21ldGhvZCBvZiB0aGUgdmFsdWUgaXRzZWxmLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlcyBpdCBpcyAnCisgICAgICAgICAgICAgICAgICAnZGVzaXJhYmxlIHRvXG4nCisgICAgICAgICAgICAgICAgICAnZm9yY2UgYSB0eXBlIHRvIGJlIGZvcm1hdHRlZCBhcyBhIHN0cmluZywgb3ZlcnJpZGluZyBpdHMgJworICAgICAgICAgICAgICAgICAgJ293blxuJworICAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2YgZm9ybWF0dGluZy4gIEJ5IGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGEgJworICAgICAgICAgICAgICAgICAgJ3N0cmluZyBiZWZvcmVcbicKKyAgICAgICAgICAgICAgICAgICdjYWxsaW5nICJfX2Zvcm1hdF9fKCkiLCB0aGUgbm9ybWFsIGZvcm1hdHRpbmcgbG9naWMgaXMgJworICAgICAgICAgICAgICAgICAgJ2J5cGFzc2VkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RocmVlIGNvbnZlcnNpb24gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6ICJcJyFzXCciICcKKyAgICAgICAgICAgICAgICAgICd3aGljaCBjYWxsc1xuJworICAgICAgICAgICAgICAgICAgJyJzdHIoKSIgb24gdGhlIHZhbHVlLCAiXCchclwnIiB3aGljaCBjYWxscyAicmVwcigpIiBhbmQgJworICAgICAgICAgICAgICAgICAgJyJcJyFhXCciIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICAnY2FsbHMgImFzY2lpKCkiLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1NvbWUgZXhhbXBsZXM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgIkhhcm9sZFwncyBhIGNsZXZlciB7MCFzfSIgICAgICAgICMgQ2FsbHMgc3RyKCkgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgJyAgICJCcmluZyBvdXQgdGhlIGhvbHkge25hbWUhcn0iICAgICMgQ2FsbHMgcmVwcigpIG9uIHRoZSAnCisgICAgICAgICAgICAgICAgICAnYXJndW1lbnQgZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgICcgICAiTW9yZSB7IWF9IiAgICAgICAgICAgICAgICAgICAgICAjIENhbGxzIGFzY2lpKCkgb24gdGhlICcKKyAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmaXJzdFxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNvbnRhaW5zIGEgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBwcmVzZW50ZWQsIGluY2x1ZGluZyBzdWNoIGRldGFpbHMgYXMgZmllbGQgd2lkdGgsICcKKyAgICAgICAgICAgICAgICAgICdhbGlnbm1lbnQsXG4nCisgICAgICAgICAgICAgICAgICAncGFkZGluZywgZGVjaW1hbCBwcmVjaXNpb24gYW5kIHNvIG9uLiAgRWFjaCB2YWx1ZSB0eXBlIGNhbiAnCisgICAgICAgICAgICAgICAgICAnZGVmaW5lIGl0c1xuJworICAgICAgICAgICAgICAgICAgJ293biAiZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdlIiBvciBpbnRlcnByZXRhdGlvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJypmb3JtYXRfc3BlYyouXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnTW9zdCBidWlsdC1pbiB0eXBlcyBzdXBwb3J0IGEgY29tbW9uIGZvcm1hdHRpbmcgJworICAgICAgICAgICAgICAgICAgJ21pbmktbGFuZ3VhZ2UsIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICAnaXMgZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNhbiBhbHNvIGluY2x1ZGUgbmVzdGVkIHJlcGxhY2VtZW50ICcKKyAgICAgICAgICAgICAgICAgICdmaWVsZHNcbicKKyAgICAgICAgICAgICAgICAgICd3aXRoaW4gaXQuIFRoZXNlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMgbWF5IGNvbnRhaW4gYSAnCisgICAgICAgICAgICAgICAgICAnZmllbGQgbmFtZSxcbicKKyAgICAgICAgICAgICAgICAgICdjb252ZXJzaW9uIGZsYWcgYW5kIGZvcm1hdCBzcGVjaWZpY2F0aW9uLCBidXQgZGVlcGVyICcKKyAgICAgICAgICAgICAgICAgICduZXN0aW5nIGlzIG5vdFxuJworICAgICAgICAgICAgICAgICAgJ2FsbG93ZWQuICBUaGUgcmVwbGFjZW1lbnQgZmllbGRzIHdpdGhpbiB0aGUgZm9ybWF0X3NwZWMgJworICAgICAgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICAgICAgJ3N1YnN0aXR1dGVkIGJlZm9yZSB0aGUgKmZvcm1hdF9zcGVjKiBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQuICcKKyAgICAgICAgICAgICAgICAgICdUaGlzXG4nCisgICAgICAgICAgICAgICAgICAnYWxsb3dzIHRoZSBmb3JtYXR0aW5nIG9mIGEgdmFsdWUgdG8gYmUgZHluYW1pY2FsbHkgJworICAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdTZWUgdGhlIEZvcm1hdCBleGFtcGxlcyBzZWN0aW9uIGZvciBzb21lIGV4YW1wbGVzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0Zvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2VcbicKKyAgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnIkZvcm1hdCBzcGVjaWZpY2F0aW9ucyIgYXJlIHVzZWQgd2l0aGluIHJlcGxhY2VtZW50IGZpZWxkcyAnCisgICAgICAgICAgICAgICAgICAnY29udGFpbmVkXG4nCisgICAgICAgICAgICAgICAgICAnd2l0aGluIGEgZm9ybWF0IHN0cmluZyB0byBkZWZpbmUgaG93IGluZGl2aWR1YWwgdmFsdWVzIGFyZSAnCisgICAgICAgICAgICAgICAgICAncHJlc2VudGVkXG4nCisgICAgICAgICAgICAgICAgICAnKHNlZSBGb3JtYXQgU3RyaW5nIFN5bnRheCBhbmQgRm9ybWF0dGVkIHN0cmluZyBsaXRlcmFscykuICcKKyAgICAgICAgICAgICAgICAgICdUaGV5IGNhblxuJworICAgICAgICAgICAgICAgICAgJ2Fsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBidWlsdC1pbiAiZm9ybWF0KCkiICcKKyAgICAgICAgICAgICAgICAgICdmdW5jdGlvbi4gIEVhY2hcbicKKyAgICAgICAgICAgICAgICAgICdmb3JtYXR0YWJsZSB0eXBlIG1heSBkZWZpbmUgaG93IHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyAnCisgICAgICAgICAgICAgICAgICAndG8gYmVcbicKKyAgICAgICAgICAgICAgICAgICdpbnRlcnByZXRlZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdNb3N0IGJ1aWx0LWluIHR5cGVzIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZm9yICcKKyAgICAgICAgICAgICAgICAgICdmb3JtYXRcbicKKyAgICAgICAgICAgICAgICAgICdzcGVjaWZpY2F0aW9ucywgYWx0aG91Z2ggc29tZSBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGFyZSAnCisgICAgICAgICAgICAgICAgICAnb25seVxuJworICAgICAgICAgICAgICAgICAgJ3N1cHBvcnRlZCBieSB0aGUgbnVtZXJpYyB0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBIGdlbmVyYWwgY29udmVudGlvbiBpcyB0aGF0IGFuIGVtcHR5IGZvcm1hdCBzdHJpbmcgKCIiIiIpICcKKyAgICAgICAgICAgICAgICAgICdwcm9kdWNlc1xuJworICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIHJlc3VsdCBhcyBpZiB5b3UgaGFkIGNhbGxlZCAic3RyKCkiIG9uIHRoZSB2YWx1ZS4gJworICAgICAgICAgICAgICAgICAgJ0Egbm9uLWVtcHR5XG4nCisgICAgICAgICAgICAgICAgICAnZm9ybWF0IHN0cmluZyB0eXBpY2FsbHkgbW9kaWZpZXMgdGhlIHJlc3VsdC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgZ2VuZXJhbCBmb3JtIG9mIGEgKnN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpZXIqIGlzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIGZvcm1hdF9zcGVjIDo6PSAnCisgICAgICAgICAgICAgICAgICAnW1tmaWxsXWFsaWduXVtzaWduXVsjXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bdHlwZV1cbicKKyAgICAgICAgICAgICAgICAgICcgICBmaWxsICAgICAgICA6Oj0gPGFueSBjaGFyYWN0ZXI+XG4nCisgICAgICAgICAgICAgICAgICAnICAgYWxpZ24gICAgICAgOjo9ICI8IiB8ICI+IiB8ICI9IiB8ICJeIlxuJworICAgICAgICAgICAgICAgICAgJyAgIHNpZ24gICAgICAgIDo6PSAiKyIgfCAiLSIgfCAiICJcbicKKyAgICAgICAgICAgICAgICAgICcgICB3aWR0aCAgICAgICA6Oj0gaW50ZWdlclxuJworICAgICAgICAgICAgICAgICAgJyAgIHByZWNpc2lvbiAgIDo6PSBpbnRlZ2VyXG4nCisgICAgICAgICAgICAgICAgICAnICAgdHlwZSAgICAgICAgOjo9ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJFIiB8ICJmIiB8ICJGIiAnCisgICAgICAgICAgICAgICAgICAnfCAiZyIgfCAiRyIgfCAibiIgfCAibyIgfCAicyIgfCAieCIgfCAiWCIgfCAiJSJcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJZiBhIHZhbGlkICphbGlnbiogdmFsdWUgaXMgc3BlY2lmaWVkLCBpdCBjYW4gYmUgcHJlY2VkZWQgJworICAgICAgICAgICAgICAgICAgJ2J5IGEgKmZpbGwqXG4nCisgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyIHRoYXQgY2FuIGJlIGFueSBjaGFyYWN0ZXIgYW5kIGRlZmF1bHRzIHRvIGEgc3BhY2UgJworICAgICAgICAgICAgICAgICAgJ2lmXG4nCisgICAgICAgICAgICAgICAgICAnb21pdHRlZC4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIHVzZSBhIGxpdGVyYWwgY3VybHkgYnJhY2UgJworICAgICAgICAgICAgICAgICAgJygiInsiIiBvclxuJworICAgICAgICAgICAgICAgICAgJyIifSIiKSBhcyB0aGUgKmZpbGwqIGNoYXJhY3RlciBpbiBhIGZvcm1hdHRlZCBzdHJpbmcgJworICAgICAgICAgICAgICAgICAgJ2xpdGVyYWwgb3Igd2hlblxuJworICAgICAgICAgICAgICAgICAgJ3VzaW5nIHRoZSAic3RyLmZvcm1hdCgpIiBtZXRob2QuICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSAnCisgICAgICAgICAgICAgICAgICAndG8gaW5zZXJ0IGFcbicKKyAgICAgICAgICAgICAgICAgICdjdXJseSBicmFjZSB3aXRoIGEgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICAibGltaXRhdGlvbiBkb2Vzbid0XG4iCisgICAgICAgICAgICAgICAgICAnYWZmZWN0IHRoZSAiZm9ybWF0KCkiIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGFsaWdubWVudCBvcHRpb25zIGlzIGFzICcKKyAgICAgICAgICAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgT3B0aW9uICAgIHwgJworICAgICAgICAgICAgICAgICAgJ01lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJzxcJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBsZWZ0LWFsaWduZWQgJworICAgICAgICAgICAgICAgICAgJ3dpdGhpbiB0aGUgYXZhaWxhYmxlICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgc3BhY2UgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIG1vc3QgJworICAgICAgICAgICAgICAgICAgJ29iamVjdHMpLiAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnPlwnIiAgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIHJpZ2h0LWFsaWduZWQgJworICAgICAgICAgICAgICAgICAgJ3dpdGhpbiB0aGUgYXZhaWxhYmxlICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgJworICAgICAgICAgICAgICAgICAgJ251bWJlcnMpLiAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCc9XCciICAgICB8IEZvcmNlcyB0aGUgcGFkZGluZyB0byBiZSBwbGFjZWQgYWZ0ZXIgJworICAgICAgICAgICAgICAgICAgJ3RoZSBzaWduIChpZiBhbnkpICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGJ1dCBiZWZvcmUgdGhlIGRpZ2l0cy4gIFRoaXMgaXMgdXNlZCBmb3IgJworICAgICAgICAgICAgICAgICAgJ3ByaW50aW5nIGZpZWxkcyAgIHxcbicKKyAgICAgICAgICAgICAgICAgICIgICB8ICAgICAgICAgICB8IGluIHRoZSBmb3JtICcrMDAwMDAwMTIwJy4gVGhpcyBhbGlnbm1lbnQgIgorICAgICAgICAgICAgICAgICAgJ29wdGlvbiBpcyBvbmx5ICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHZhbGlkIGZvciBudW1lcmljIHR5cGVzLiAgSXQgYmVjb21lcyB0aGUgJworICAgICAgICAgICAgICAgICAgImRlZmF1bHQgd2hlbiAnMCcgIHxcbiIKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAnd2lkdGguICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ15cJyIgICAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBjZW50ZXJlZCB3aXRoaW4gJworICAgICAgICAgICAgICAgICAgJ3RoZSBhdmFpbGFibGUgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgJ3NwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdOb3RlIHRoYXQgdW5sZXNzIGEgbWluaW11bSBmaWVsZCB3aWR0aCBpcyBkZWZpbmVkLCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkIHdpZHRoXG4nCisgICAgICAgICAgICAgICAgICAnd2lsbCBhbHdheXMgYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgZGF0YSB0byBmaWxsIGl0LCBzbyAnCisgICAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdhbGlnbm1lbnQgb3B0aW9uIGhhcyBubyBtZWFuaW5nIGluIHRoaXMgY2FzZS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgKnNpZ24qIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBudW1iZXIgdHlwZXMsIGFuZCBjYW4gJworICAgICAgICAgICAgICAgICAgJ2JlIG9uZSBvZlxuJworICAgICAgICAgICAgICAgICAgJ3RoZSBmb2xsb3dpbmc6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBPcHRpb24gICAgfCAnCisgICAgICAgICAgICAgICAgICAnTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnK1wnIiAgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIHNpZ24gc2hvdWxkIGJlIHVzZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgICdib3RoIHBvc2l0aXZlIGFzICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB3ZWxsIGFzIG5lZ2F0aXZlICcKKyAgICAgICAgICAgICAgICAgICdudW1iZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCctXCciICAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCAnCisgICAgICAgICAgICAgICAgICAnb25seSBmb3IgbmVnYXRpdmUgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG51bWJlcnMgKHRoaXMgaXMgdGhlIGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yKS4gICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IHNwYWNlICAgICB8IGluZGljYXRlcyB0aGF0IGEgbGVhZGluZyBzcGFjZSBzaG91bGQgYmUgJworICAgICAgICAgICAgICAgICAgJ3VzZWQgb24gcG9zaXRpdmUgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG51bWJlcnMsIGFuZCBhIG1pbnVzIHNpZ24gb24gbmVnYXRpdmUgJworICAgICAgICAgICAgICAgICAgJ251bWJlcnMuICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgIlwnI1wnIiBvcHRpb24gY2F1c2VzIHRoZSAiYWx0ZXJuYXRlIGZvcm0iIHRvIGJlIHVzZWQgJworICAgICAgICAgICAgICAgICAgJ2ZvciB0aGVcbicKKyAgICAgICAgICAgICAgICAgICdjb252ZXJzaW9uLiAgVGhlIGFsdGVybmF0ZSBmb3JtIGlzIGRlZmluZWQgZGlmZmVyZW50bHkgZm9yICcKKyAgICAgICAgICAgICAgICAgICdkaWZmZXJlbnRcbicKKyAgICAgICAgICAgICAgICAgICd0eXBlcy4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIGludGVnZXIsIGZsb2F0LCAnCisgICAgICAgICAgICAgICAgICAnY29tcGxleCBhbmRcbicKKyAgICAgICAgICAgICAgICAgICdEZWNpbWFsIHR5cGVzLiBGb3IgaW50ZWdlcnMsIHdoZW4gYmluYXJ5LCBvY3RhbCwgb3IgJworICAgICAgICAgICAgICAgICAgJ2hleGFkZWNpbWFsIG91dHB1dFxuJworICAgICAgICAgICAgICAgICAgJ2lzIHVzZWQsIHRoaXMgb3B0aW9uIGFkZHMgdGhlIHByZWZpeCByZXNwZWN0aXZlICJcJzBiXCciLCAnCisgICAgICAgICAgICAgICAgICAnIlwnMG9cJyIsIG9yXG4nCisgICAgICAgICAgICAgICAgICAnIlwnMHhcJyIgdG8gdGhlIG91dHB1dCB2YWx1ZS4gRm9yIGZsb2F0cywgY29tcGxleCBhbmQgJworICAgICAgICAgICAgICAgICAgJ0RlY2ltYWwgdGhlXG4nCisgICAgICAgICAgICAgICAgICAnYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gdG8gJworICAgICAgICAgICAgICAgICAgJ2Fsd2F5cyBjb250YWluIGFcbicKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsLXBvaW50IGNoYXJhY3RlciwgZXZlbiBpZiBubyBkaWdpdHMgZm9sbG93IGl0LiAnCisgICAgICAgICAgICAgICAgICAnTm9ybWFsbHksIGFcbicKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsLXBvaW50IGNoYXJhY3RlciBhcHBlYXJzIGluIHRoZSByZXN1bHQgb2YgdGhlc2UgJworICAgICAgICAgICAgICAgICAgJ2NvbnZlcnNpb25zXG4nCisgICAgICAgICAgICAgICAgICAnb25seSBpZiBhIGRpZ2l0IGZvbGxvd3MgaXQuIEluIGFkZGl0aW9uLCBmb3IgIlwnZ1wnIiBhbmQgJworICAgICAgICAgICAgICAgICAgJyJcJ0dcJyJcbicKKyAgICAgICAgICAgICAgICAgICdjb252ZXJzaW9ucywgdHJhaWxpbmcgemVyb3MgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgICdyZXN1bHQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlICJcJyxcJyIgb3B0aW9uIHNpZ25hbHMgdGhlIHVzZSBvZiBhIGNvbW1hIGZvciBhICcKKyAgICAgICAgICAgICAgICAgICd0aG91c2FuZHMgc2VwYXJhdG9yLlxuJworICAgICAgICAgICAgICAgICAgJ0ZvciBhIGxvY2FsZSBhd2FyZSBzZXBhcmF0b3IsIHVzZSB0aGUgIlwnblwnIiBpbnRlZ2VyICcKKyAgICAgICAgICAgICAgICAgICdwcmVzZW50YXRpb24gdHlwZVxuJworICAgICAgICAgICAgICAgICAgJ2luc3RlYWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMTogQWRkZWQgdGhlICJcJyxcJyIgb3B0aW9uIChzZWUgYWxzbyAnCisgICAgICAgICAgICAgICAgICAnKipQRVAgMzc4KiopLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyp3aWR0aCogaXMgYSBkZWNpbWFsIGludGVnZXIgZGVmaW5pbmcgdGhlIG1pbmltdW0gZmllbGQgJworICAgICAgICAgICAgICAgICAgJ3dpZHRoLiAgSWYgbm90XG4nCisgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkLCB0aGVuIHRoZSBmaWVsZCB3aWR0aCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICAgICdjb250ZW50LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1doZW4gbm8gZXhwbGljaXQgYWxpZ25tZW50IGlzIGdpdmVuLCBwcmVjZWRpbmcgdGhlICp3aWR0aCogJworICAgICAgICAgICAgICAgICAgJ2ZpZWxkIGJ5IGFcbicKKyAgICAgICAgICAgICAgICAgICd6ZXJvICgiXCcwXCciKSBjaGFyYWN0ZXIgZW5hYmxlcyBzaWduLWF3YXJlIHplcm8tcGFkZGluZyAnCisgICAgICAgICAgICAgICAgICAnZm9yIG51bWVyaWNcbicKKyAgICAgICAgICAgICAgICAgICd0eXBlcy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhICpmaWxsKiBjaGFyYWN0ZXIgb2YgIlwnMFwnIiAnCisgICAgICAgICAgICAgICAgICAnd2l0aCBhblxuJworICAgICAgICAgICAgICAgICAgJyphbGlnbm1lbnQqIHR5cGUgb2YgIlwnPVwnIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgKnByZWNpc2lvbiogaXMgYSBkZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55ICcKKyAgICAgICAgICAgICAgICAgICdkaWdpdHMgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICAnYmUgZGlzcGxheWVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciBhIGZsb2F0aW5nIHBvaW50ICcKKyAgICAgICAgICAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlZCB3aXRoICJcJ2ZcJyIgYW5kICJcJ0ZcJyIsIG9yIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlICcKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsIHBvaW50XG4nCisgICAgICAgICAgICAgICAgICAnZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZm9ybWF0dGVkIHdpdGggIlwnZ1wnIiBvciAnCisgICAgICAgICAgICAgICAgICAnIlwnR1wnIi4gIEZvciBub24tXG4nCisgICAgICAgICAgICAgICAgICAnbnVtYmVyIHR5cGVzIHRoZSBmaWVsZCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gZmllbGQgc2l6ZSAtICcKKyAgICAgICAgICAgICAgICAgICdpbiBvdGhlclxuJworICAgICAgICAgICAgICAgICAgJ3dvcmRzLCBob3cgbWFueSBjaGFyYWN0ZXJzIHdpbGwgYmUgdXNlZCBmcm9tIHRoZSBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAnY29udGVudC4gVGhlXG4nCisgICAgICAgICAgICAgICAgICAnKnByZWNpc2lvbiogaXMgbm90IGFsbG93ZWQgZm9yIGludGVnZXIgdmFsdWVzLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0ZpbmFsbHksIHRoZSAqdHlwZSogZGV0ZXJtaW5lcyBob3cgdGhlIGRhdGEgc2hvdWxkIGJlICcKKyAgICAgICAgICAgICAgICAgICdwcmVzZW50ZWQuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIGF2YWlsYWJsZSBzdHJpbmcgcHJlc2VudGF0aW9uIHR5cGVzIGFyZTpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IFR5cGUgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICdNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdzXCciICAgICB8IFN0cmluZyBmb3JtYXQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHlwZSAnCisgICAgICAgICAgICAgICAgICAnZm9yIHN0cmluZ3MgYW5kICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG1heSBiZSAnCisgICAgICAgICAgICAgICAgICAnb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzICcKKyAgICAgICAgICAgICAgICAgICciXCdzXCciLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBhdmFpbGFibGUgaW50ZWdlciBwcmVzZW50YXRpb24gdHlwZXMgYXJlOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgVHlwZSAgICAgIHwgJworICAgICAgICAgICAgICAgICAgJ01lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ2JcJyIgICAgIHwgQmluYXJ5IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluICcKKyAgICAgICAgICAgICAgICAgICdiYXNlIDIuICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwnY1wnIiAgICAgfCBDaGFyYWN0ZXIuIENvbnZlcnRzIHRoZSBpbnRlZ2VyIHRvIHRoZSAnCisgICAgICAgICAgICAgICAgICAnY29ycmVzcG9uZGluZyAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB1bmljb2RlIGNoYXJhY3RlciBiZWZvcmUgJworICAgICAgICAgICAgICAgICAgJ3ByaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdkXCciICAgICB8IERlY2ltYWwgSW50ZWdlci4gT3V0cHV0cyB0aGUgbnVtYmVyIGluICcKKyAgICAgICAgICAgICAgICAgICdiYXNlIDEwLiAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ29cJyIgICAgIHwgT2N0YWwgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAnCisgICAgICAgICAgICAgICAgICAnOC4gICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgIlwneFwnIiAgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAnCisgICAgICAgICAgICAgICAgICAnMTYsIHVzaW5nIGxvd2VyLSAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgJworICAgICAgICAgICAgICAgICAgJzkuICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdYXCciICAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlICcKKyAgICAgICAgICAgICAgICAgICcxNiwgdXNpbmcgdXBwZXItICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSAnCisgICAgICAgICAgICAgICAgICAnOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ25cJyIgICAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzICJcJ2RcJyIsICcKKyAgICAgICAgICAgICAgICAgICdleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlIG51bWJlciAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBzZXBhcmF0b3IgJworICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyAnCisgICAgICAgICAgICAgICAgICAnIlwnZFwnIi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgcHJlc2VudGF0aW9uIHR5cGVzLCBpbnRlZ2VycyBjYW4gJworICAgICAgICAgICAgICAgICAgJ2JlIGZvcm1hdHRlZFxuJworICAgICAgICAgICAgICAgICAgJ3dpdGggdGhlIGZsb2F0aW5nIHBvaW50IHByZXNlbnRhdGlvbiB0eXBlcyBsaXN0ZWQgYmVsb3cgJworICAgICAgICAgICAgICAgICAgJyhleGNlcHQgIlwnblwnIlxuJworICAgICAgICAgICAgICAgICAgJ2FuZCBOb25lKS4gV2hlbiBkb2luZyBzbywgImZsb2F0KCkiIGlzIHVzZWQgdG8gY29udmVydCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2ludGVnZXIgdG9cbicKKyAgICAgICAgICAgICAgICAgICdhIGZsb2F0aW5nIHBvaW50IG51bWJlciBiZWZvcmUgZm9ybWF0dGluZy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgYXZhaWxhYmxlIHByZXNlbnRhdGlvbiB0eXBlcyBmb3IgZmxvYXRpbmcgcG9pbnQgYW5kICcKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsIHZhbHVlc1xuJworICAgICAgICAgICAgICAgICAgJ2FyZTpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8IFR5cGUgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICdNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICd8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdlXCciICAgICB8IEV4cG9uZW50IG5vdGF0aW9uLiBQcmludHMgdGhlIG51bWJlciBpbiAnCisgICAgICAgICAgICAgICAgICAnc2NpZW50aWZpYyAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICIgICB8ICAgICAgICAgICB8IG5vdGF0aW9uIHVzaW5nIHRoZSBsZXR0ZXIgJ2UnIHRvIGluZGljYXRlICIKKyAgICAgICAgICAgICAgICAgICd0aGUgZXhwb25lbnQuICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyAnCisgICAgICAgICAgICAgICAgICAnIjYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ0VcJyIgICAgIHwgRXhwb25lbnQgbm90YXRpb24uIFNhbWUgYXMgIlwnZVwnIiAnCisgICAgICAgICAgICAgICAgICAnZXhjZXB0IGl0IHVzZXMgYW4gdXBwZXIgICB8XG4nCisgICAgICAgICAgICAgICAgICAiICAgfCAgICAgICAgICAgfCBjYXNlICdFJyBhcyB0aGUgc2VwYXJhdG9yICIKKyAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdmXCciICAgICB8IEZpeGVkIHBvaW50LiBEaXNwbGF5cyB0aGUgbnVtYmVyIGFzIGEgJworICAgICAgICAgICAgICAgICAgJ2ZpeGVkLXBvaW50IG51bWJlci4gIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyAnCisgICAgICAgICAgICAgICAgICAnIjYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ0ZcJyIgICAgIHwgRml4ZWQgcG9pbnQuIFNhbWUgYXMgIlwnZlwnIiwgYnV0ICcKKyAgICAgICAgICAgICAgICAgICdjb252ZXJ0cyAibmFuIiB0byAiTkFOIiAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBhbmQgImluZiIgdG8gJworICAgICAgICAgICAgICAgICAgJyJJTkYiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCdnXCciICAgICB8IEdlbmVyYWwgZm9ybWF0LiAgRm9yIGEgZ2l2ZW4gcHJlY2lzaW9uICcKKyAgICAgICAgICAgICAgICAgICcicCA+PSAxIiwgdGhpcyAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHJvdW5kcyB0aGUgbnVtYmVyIHRvICJwIiBzaWduaWZpY2FudCAnCisgICAgICAgICAgICAgICAgICAnZGlnaXRzIGFuZCB0aGVuICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGZvcm1hdHMgdGhlIHJlc3VsdCBpbiBlaXRoZXIgZml4ZWQtcG9pbnQgJworICAgICAgICAgICAgICAgICAgJ2Zvcm1hdCBvciBpbiAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNjaWVudGlmaWMgbm90YXRpb24sIGRlcGVuZGluZyBvbiBpdHMgJworICAgICAgICAgICAgICAgICAgJ21hZ25pdHVkZS4gIFRoZSAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHByZWNpc2UgcnVsZXMgYXJlIGFzIGZvbGxvd3M6IHN1cHBvc2UgdGhhdCAnCisgICAgICAgICAgICAgICAgICAndGhlIHJlc3VsdCAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICJcJ2VcJyIgJworICAgICAgICAgICAgICAgICAgJ2FuZCBwcmVjaXNpb24gInAtMSIgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgd291bGQgaGF2ZSBleHBvbmVudCAiZXhwIi4gIFRoZW4gaWYgIi00IDw9ICcKKyAgICAgICAgICAgICAgICAgICdleHAgPCBwIiwgdGhlICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgIHwgICAgICAgICAgIHwgbnVtYmVyIGlzIGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICcKKyAgICAgICAgICAgICAgICAgICciXCdmXCciIGFuZCAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBwcmVjaXNpb24gInAtMS1leHAiLiAgT3RoZXJ3aXNlLCB0aGUgJworICAgICAgICAgICAgICAgICAgJ251bWJlciBpcyBmb3JtYXR0ZWQgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlICJcJ2VcJyIgYW5kICcKKyAgICAgICAgICAgICAgICAgICdwcmVjaXNpb24gInAtMSIuIEluIGJvdGggIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGNhc2VzIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MgYXJlICcKKyAgICAgICAgICAgICAgICAgICdyZW1vdmVkIGZyb20gdGhlICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHNpZ25pZmljYW5kLCBhbmQgdGhlIGRlY2ltYWwgcG9pbnQgaXMgYWxzbyAnCisgICAgICAgICAgICAgICAgICAncmVtb3ZlZCBpZiAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHRoZXJlIGFyZSBubyByZW1haW5pbmcgZGlnaXRzIGZvbGxvd2luZyAnCisgICAgICAgICAgICAgICAgICAnaXQuICBQb3NpdGl2ZSBhbmQgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IG5lZ2F0aXZlIGluZmluaXR5LCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgJworICAgICAgICAgICAgICAgICAgJ3plcm8sIGFuZCBuYW5zLCAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGFyZSBmb3JtYXR0ZWQgYXMgImluZiIsICItaW5mIiwgIjAiLCAiLTAiICcKKyAgICAgICAgICAgICAgICAgICdhbmQgIm5hbiIgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHJlc3BlY3RpdmVseSwgcmVnYXJkbGVzcyBvZiB0aGUgJworICAgICAgICAgICAgICAgICAgJ3ByZWNpc2lvbi4gIEEgcHJlY2lzaW9uIG9mIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8ICIwIiBpcyB0cmVhdGVkIGFzIGVxdWl2YWxlbnQgdG8gYSAnCisgICAgICAgICAgICAgICAgICAncHJlY2lzaW9uIG9mICIxIi4gVGhlICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGRlZmF1bHQgcHJlY2lzaW9uIGlzICcKKyAgICAgICAgICAgICAgICAgICciNiIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ0dcJyIgICAgIHwgR2VuZXJhbCBmb3JtYXQuIFNhbWUgYXMgIlwnZ1wnIiBleGNlcHQgJworICAgICAgICAgICAgICAgICAgJ3N3aXRjaGVzIHRvICJcJ0VcJyIgaWYgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IHRoZSBudW1iZXIgZ2V0cyB0b28gbGFyZ2UuIFRoZSAnCisgICAgICAgICAgICAgICAgICAncmVwcmVzZW50YXRpb25zIG9mIGluZmluaXR5IHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGFuZCBOYU4gYXJlIHVwcGVyY2FzZWQsICcKKyAgICAgICAgICAgICAgICAgICd0b28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICJcJ25cJyIgICAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzICJcJ2dcJyIsICcKKyAgICAgICAgICAgICAgICAgICdleGNlcHQgdGhhdCBpdCB1c2VzIHRoZSB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgJworICAgICAgICAgICAgICAgICAgJ2FwcHJvcHJpYXRlIG51bWJlciAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBzZXBhcmF0b3IgJworICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAiXCclXCciICAgICB8IFBlcmNlbnRhZ2UuIE11bHRpcGxpZXMgdGhlIG51bWJlciBieSAxMDAgJworICAgICAgICAgICAgICAgICAgJ2FuZCBkaXNwbGF5cyBpbiAgIHxcbicKKyAgICAgICAgICAgICAgICAgICcgICB8ICAgICAgICAgICB8IGZpeGVkICgiXCdmXCciKSBmb3JtYXQsIGZvbGxvd2VkIGJ5IGEgJworICAgICAgICAgICAgICAgICAgJ3BlcmNlbnQgc2lnbi4gICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJyAgIHwgTm9uZSAgICAgIHwgU2ltaWxhciB0byAiXCdnXCciLCBleGNlcHQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnZml4ZWQtcG9pbnQgbm90YXRpb24sIHdoZW4gICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCB1c2VkLCBoYXMgYXQgbGVhc3Qgb25lIGRpZ2l0IHBhc3QgdGhlICcKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsIHBvaW50LiBUaGUgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBkZWZhdWx0IHByZWNpc2lvbiBpcyBhcyBoaWdoIGFzIG5lZWRlZCB0byAnCisgICAgICAgICAgICAgICAgICAncmVwcmVzZW50IHRoZSAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBwYXJ0aWN1bGFyIHZhbHVlLiBUaGUgb3ZlcmFsbCBlZmZlY3QgaXMgdG8gJworICAgICAgICAgICAgICAgICAgJ21hdGNoIHRoZSAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCBvdXRwdXQgb2YgInN0cigpIiBhcyBhbHRlcmVkIGJ5IHRoZSBvdGhlciAnCisgICAgICAgICAgICAgICAgICAnZm9ybWF0ICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAnICAgfCAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAnbW9kaWZpZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0Zvcm1hdCBleGFtcGxlc1xuJworICAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoaXMgc2VjdGlvbiBjb250YWlucyBleGFtcGxlcyBvZiB0aGUgInN0ci5mb3JtYXQoKSIgc3ludGF4ICcKKyAgICAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICAgICdjb21wYXJpc29uIHdpdGggdGhlIG9sZCAiJSItZm9ybWF0dGluZy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJbiBtb3N0IG9mIHRoZSBjYXNlcyB0aGUgc3ludGF4IGlzIHNpbWlsYXIgdG8gdGhlIG9sZCAnCisgICAgICAgICAgICAgICAgICAnIiUiLWZvcm1hdHRpbmcsXG4nCisgICAgICAgICAgICAgICAgICAnd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlICJ7fSIgYW5kIHdpdGggIjoiIHVzZWQgaW5zdGVhZCBvZiAnCisgICAgICAgICAgICAgICAgICAnIiUiLiBGb3JcbicKKyAgICAgICAgICAgICAgICAgICdleGFtcGxlLCAiXCclMDMuMmZcJyIgY2FuIGJlIHRyYW5zbGF0ZWQgdG8gIlwnezowMy4yZn1cJyIuXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnVGhlIG5ldyBmb3JtYXQgc3ludGF4IGFsc28gc3VwcG9ydHMgbmV3IGFuZCBkaWZmZXJlbnQgJworICAgICAgICAgICAgICAgICAgJ29wdGlvbnMsIHNob3duXG4nCisgICAgICAgICAgICAgICAgICAnaW4gdGhlIGZvbGxvdyBleGFtcGxlcy5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdBY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IHBvc2l0aW9uOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezB9LCB7MX0sIHsyfScuZm9ybWF0KCdhJywgJ2InLCAnYycpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ2EsIGIsIGMnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7fSwge30sIHt9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJykgICMgMy4xKyBvbmx5XG4iCisgICAgICAgICAgICAgICAgICAiICAgJ2EsIGIsIGMnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Mn0sIHsxfSwgezB9Jy5mb3JtYXQoJ2EnLCAnYicsICdjJylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnYywgYiwgYSdcbiIKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3syfSwgezF9LCB7MH0nLmZvcm1hdCgqJ2FiYycpICAgICAgIyB1bnBhY2tpbmcgIgorICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IHNlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICAiICAgJ2MsIGIsIGEnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7MH17MX17MH0nLmZvcm1hdCgnYWJyYScsICdjYWQnKSAgICMgYXJndW1lbnRzJyAiCisgICAgICAgICAgICAgICAgICAnaW5kaWNlcyBjYW4gYmUgcmVwZWF0ZWRcbicKKyAgICAgICAgICAgICAgICAgICIgICAnYWJyYWNhZGFicmEnXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBuYW1lOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sICIKKyAgICAgICAgICAgICAgICAgICJ7bG9uZ2l0dWRlfScuZm9ybWF0KGxhdGl0dWRlPSczNy4yNE4nLCAiCisgICAgICAgICAgICAgICAgICAibG9uZ2l0dWRlPSctMTE1LjgxVycpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXJ1xuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiBjb29yZCA9IHsnbGF0aXR1ZGUnOiAnMzcuMjROJywgJ2xvbmdpdHVkZSc6ICIKKyAgICAgICAgICAgICAgICAgICInLTExNS44MVcnfVxuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiAnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sICIKKyAgICAgICAgICAgICAgICAgICJ7bG9uZ2l0dWRlfScuZm9ybWF0KCoqY29vcmQpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIkFjY2Vzc2luZyBhcmd1bWVudHMnIGF0dHJpYnV0ZXM6XG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IGMgPSAzLTVqXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICgnVGhlIGNvbXBsZXggbnVtYmVyIHswfSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCAiCisgICAgICAgICAgICAgICAgICAicGFydCB7MC5yZWFsfSAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgLi4uICAnYW5kIHRoZSBpbWFnaW5hcnkgcGFydCB7MC5pbWFnfS4nKS5mb3JtYXQoYylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnVGhlIGNvbXBsZXggbnVtYmVyICgzLTVqKSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0ICIKKyAgICAgICAgICAgICAgICAgICIzLjAgYW5kIHRoZSBpbWFnaW5hcnkgcGFydCAtNS4wLidcbiIKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gY2xhc3MgUG9pbnQ6XG4nCisgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6XG4nCisgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgc2VsZi54LCBzZWxmLnkgPSB4LCB5XG4nCisgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19zdHJfXyhzZWxmKTpcbicKKyAgICAgICAgICAgICAgICAgICIgICAuLi4gICAgICAgICByZXR1cm4gJ1BvaW50KHtzZWxmLnh9LCAiCisgICAgICAgICAgICAgICAgICAie3NlbGYueX0pJy5mb3JtYXQoc2VsZj1zZWxmKVxuIgorICAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBzdHIoUG9pbnQoNCwgMikpXG4nCisgICAgICAgICAgICAgICAgICAiICAgJ1BvaW50KDQsIDIpJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIkFjY2Vzc2luZyBhcmd1bWVudHMnIGl0ZW1zOlxuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiBjb29yZCA9ICgzLCA1KVxuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnWDogezBbMF19OyAgWTogezBbMV19Jy5mb3JtYXQoY29vcmQpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ1g6IDM7ICBZOiA1J1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1JlcGxhY2luZyAiJXMiIGFuZCAiJXIiOlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiAicmVwcigpIHNob3dzIHF1b3RlczogeyFyfTsgc3RyKCkgZG9lc25cJ3Q6ICcKKyAgICAgICAgICAgICAgICAgICd7IXN9Ii5mb3JtYXQoXCd0ZXN0MVwnLCBcJ3Rlc3QyXCcpXG4nCisgICAgICAgICAgICAgICAgICAnICAgInJlcHIoKSBzaG93cyBxdW90ZXM6IFwndGVzdDFcJzsgc3RyKCkgZG9lc25cJ3Q6IHRlc3QyIlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ0FsaWduaW5nIHRoZSB0ZXh0IGFuZCBzcGVjaWZ5aW5nIGEgd2lkdGg6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OjwzMH0nLmZvcm1hdCgnbGVmdCBhbGlnbmVkJylcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnbGVmdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgJ1xuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezo+MzB9Jy5mb3JtYXQoJ3JpZ2h0IGFsaWduZWQnKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICcgICAgICAgICAgICAgICAgIHJpZ2h0IGFsaWduZWQnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Ol4zMH0nLmZvcm1hdCgnY2VudGVyZWQnKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICcgICAgICAgICAgIGNlbnRlcmVkICAgICAgICAgICAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OipeMzB9Jy5mb3JtYXQoJ2NlbnRlcmVkJykgICMgdXNlICcqJyBhcyBhIGZpbGwgIgorICAgICAgICAgICAgICAgICAgJ2NoYXJcbicKKyAgICAgICAgICAgICAgICAgICIgICAnKioqKioqKioqKipjZW50ZXJlZCoqKioqKioqKioqJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1JlcGxhY2luZyAiJStmIiwgIiUtZiIsIGFuZCAiJSBmIiBhbmQgc3BlY2lmeWluZyBhIHNpZ246XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7OitmfTsgezorZn0nLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBpdCAiCisgICAgICAgICAgICAgICAgICAnYWx3YXlzXG4nCisgICAgICAgICAgICAgICAgICAiICAgJyszLjE0MDAwMDsgLTMuMTQwMDAwJ1xuIgorICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezogZn07IHs6IGZ9Jy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgYSBzcGFjZSAiCisgICAgICAgICAgICAgICAgICAnZm9yIHBvc2l0aXZlIG51bWJlcnNcbicKKyAgICAgICAgICAgICAgICAgICIgICAnIDMuMTQwMDAwOyAtMy4xNDAwMDAnXG4iCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Oi1mfTsgezotZn0nLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBvbmx5IHRoZSAiCisgICAgICAgICAgICAgICAgICAibWludXMgLS0gc2FtZSBhcyAnezpmfTsgezpmfSdcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnMy4xNDAwMDA7IC0zLjE0MDAwMCdcbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdSZXBsYWNpbmcgIiV4IiBhbmQgIiVvIiBhbmQgY29udmVydGluZyB0aGUgdmFsdWUgdG8gJworICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVudCBiYXNlczpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gIyBmb3JtYXQgYWxzbyBzdXBwb3J0cyBiaW5hcnkgbnVtYmVyc1xuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6eH07ICBvY3Q6IHswOm99OyAgYmluOiAnCisgICAgICAgICAgICAgICAgICAnezA6Yn0iLmZvcm1hdCg0MilcbicKKyAgICAgICAgICAgICAgICAgICIgICAnaW50OiA0MjsgIGhleDogMmE7ICBvY3Q6IDUyOyAgYmluOiAxMDEwMTAnXG4iCisgICAgICAgICAgICAgICAgICAnICAgPj4+ICMgd2l0aCAweCwgMG8sIG9yIDBiIGFzIHByZWZpeDpcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOiN4fTsgIG9jdDogezA6I299OyAgYmluOiAnCisgICAgICAgICAgICAgICAgICAnezA6I2J9Ii5mb3JtYXQoNDIpXG4nCisgICAgICAgICAgICAgICAgICAiICAgJ2ludDogNDI7ICBoZXg6IDB4MmE7ICBvY3Q6IDBvNTI7ICBiaW46IDBiMTAxMDEwJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1VzaW5nIHRoZSBjb21tYSBhcyBhIHRob3VzYW5kcyBzZXBhcmF0b3I6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7Oix9Jy5mb3JtYXQoMTIzNDU2Nzg5MClcbiIKKyAgICAgICAgICAgICAgICAgICIgICAnMSwyMzQsNTY3LDg5MCdcbiIKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdFeHByZXNzaW5nIGEgcGVyY2VudGFnZTpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gcG9pbnRzID0gMTlcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gdG90YWwgPSAyMlxuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnQ29ycmVjdCBhbnN3ZXJzOiB7Oi4yJX0nLmZvcm1hdChwb2ludHMvdG90YWwpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ0NvcnJlY3QgYW5zd2VyczogODYuMzYlJ1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1VzaW5nIHR5cGUtc3BlY2lmaWMgZm9ybWF0dGluZzpcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gaW1wb3J0IGRhdGV0aW1lXG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IGQgPSBkYXRldGltZS5kYXRldGltZSgyMDEwLCA3LCA0LCAxMiwgMTUsIDU4KVxuJworICAgICAgICAgICAgICAgICAgIiAgID4+PiAnezolWS0lbS0lZCAlSDolTTolU30nLmZvcm1hdChkKVxuIgorICAgICAgICAgICAgICAgICAgIiAgICcyMDEwLTA3LTA0IDEyOjE1OjU4J1xuIgorICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ05lc3RpbmcgYXJndW1lbnRzIGFuZCBtb3JlIGNvbXBsZXggZXhhbXBsZXM6XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAiICAgPj4+IGZvciBhbGlnbiwgdGV4dCBpbiB6aXAoJzxePicsIFsnbGVmdCcsICdjZW50ZXInLCAiCisgICAgICAgICAgICAgICAgICAiJ3JpZ2h0J10pOlxuIgorICAgICAgICAgICAgICAgICAgIiAgIC4uLiAgICAgJ3swOntmaWxsfXthbGlnbn0xNn0nLmZvcm1hdCh0ZXh0LCBmaWxsPWFsaWduLCAiCisgICAgICAgICAgICAgICAgICAnYWxpZ249YWxpZ24pXG4nCisgICAgICAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgICAgICAiICAgJ2xlZnQ8PDw8PDw8PDw8PDwnXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ15eXl5eY2VudGVyXl5eXl4nXG4iCisgICAgICAgICAgICAgICAgICAiICAgJz4+Pj4+Pj4+Pj4+cmlnaHQnXG4iCisgICAgICAgICAgICAgICAgICAnICAgPj4+XG4nCisgICAgICAgICAgICAgICAgICAnICAgPj4+IG9jdGV0cyA9IFsxOTIsIDE2OCwgMCwgMV1cbicKKyAgICAgICAgICAgICAgICAgICIgICA+Pj4gJ3s6MDJYfXs6MDJYfXs6MDJYfXs6MDJYfScuZm9ybWF0KCpvY3RldHMpXG4iCisgICAgICAgICAgICAgICAgICAiICAgJ0MwQTgwMDAxJ1xuIgorICAgICAgICAgICAgICAgICAgJyAgID4+PiBpbnQoXywgMTYpXG4nCisgICAgICAgICAgICAgICAgICAnICAgMzIzMjIzNTUyMVxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PlxuJworICAgICAgICAgICAgICAgICAgJyAgID4+PiB3aWR0aCA9IDVcbicKKyAgICAgICAgICAgICAgICAgICcgICA+Pj4gZm9yIG51bSBpbiByYW5nZSg1LDEyKTogI2RvY3Rlc3Q6ICcKKyAgICAgICAgICAgICAgICAgICcrTk9STUFMSVpFX1dISVRFU1BBQ0VcbicKKyAgICAgICAgICAgICAgICAgICIgICAuLi4gICAgIGZvciBiYXNlIGluICdkWG9iJzpcbiIKKyAgICAgICAgICAgICAgICAgICIgICAuLi4gICAgICAgICBwcmludCgnezA6e3dpZHRofXtiYXNlfX0nLmZvcm1hdChudW0sICIKKyAgICAgICAgICAgICAgICAgICJiYXNlPWJhc2UsIHdpZHRoPXdpZHRoKSwgZW5kPScgJylcbiIKKyAgICAgICAgICAgICAgICAgICcgICAuLi4gICAgIHByaW50KClcbicKKyAgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAgNSAgICAgNSAgICAgNSAgIDEwMVxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICA2ICAgICA2ICAgICA2ICAgMTEwXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgIDcgICAgIDcgICAgIDcgICAxMTFcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAgOCAgICAgOCAgICAxMCAgMTAwMFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgICA5ICAgICA5ICAgIDExICAxMDAxXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAgMTAgICAgIEEgICAgMTIgIDEwMTBcbicKKyAgICAgICAgICAgICAgICAgICcgICAgICAxMSAgICAgQiAgICAxMyAgMTAxMVxuJywKKyAnZnVuY3Rpb24nOiAnXG4nCisgICAgICAgICAgICAgJ0Z1bmN0aW9uIGRlZmluaXRpb25zXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgJworICAgICAgICAgICAgICcoc2VlXG4nCisgICAgICAgICAgICAgJ3NlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGZ1bmNkZWYgICAgICAgICAgICAgICAgIDo6PSBbZGVjb3JhdG9yc10gImRlZiIgZnVuY25hbWUgIigiICcKKyAgICAgICAgICAgICAnW3BhcmFtZXRlcl9saXN0XSAiKSIgWyItPiIgZXhwcmVzc2lvbl0gIjoiIHN1aXRlXG4nCisgICAgICAgICAgICAgJyAgIGRlY29yYXRvcnMgICAgICAgICAgICAgIDo6PSBkZWNvcmF0b3IrXG4nCisgICAgICAgICAgICAgJyAgIGRlY29yYXRvciAgICAgICAgICAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiAnCisgICAgICAgICAgICAgJ1thcmd1bWVudF9saXN0IFsiLCJdXSAiKSJdIE5FV0xJTkVcbicKKyAgICAgICAgICAgICAnICAgZG90dGVkX25hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbicKKyAgICAgICAgICAgICAnICAgcGFyYW1ldGVyX2xpc3QgICAgICAgICAgOjo9IGRlZnBhcmFtZXRlciAoIiwiIGRlZnBhcmFtZXRlcikqICcKKyAgICAgICAgICAgICAnWyIsIiBbcGFyYW1ldGVyX2xpc3Rfc3RhcmFyZ3NdXVxuJworICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgfCBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJnc1xuJworICAgICAgICAgICAgICcgICBwYXJhbWV0ZXJfbGlzdF9zdGFyYXJncyA6Oj0gIioiIFtwYXJhbWV0ZXJdICgiLCIgJworICAgICAgICAgICAgICdkZWZwYXJhbWV0ZXIpKiBbIiwiIFsiKioiIHBhcmFtZXRlciBbIiwiXV1dXG4nCisgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICIqKiIgcGFyYW1ldGVyIFsiLCJdXG4nCisgICAgICAgICAgICAgJyAgIHBhcmFtZXRlciAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIFsiOiIgZXhwcmVzc2lvbl1cbicKKyAgICAgICAgICAgICAnICAgZGVmcGFyYW1ldGVyICAgICAgICAgICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4nCisgICAgICAgICAgICAgJyAgIGZ1bmNuYW1lICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdBIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uICcKKyAgICAgICAgICAgICAnYmluZHNcbicKKyAgICAgICAgICAgICAndGhlIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGN1cnJlbnQgbG9jYWwgbmFtZXNwYWNlIHRvIGEgZnVuY3Rpb24gJworICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAnKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGdsb2JhbCAnCisgICAgICAgICAgICAgJ25hbWVzcGFjZVxuJworICAgICAgICAgICAgICdhcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgJworICAgICAgICAgICAgICdnZXRzXG4nCisgICAgICAgICAgICAgJ2V4ZWN1dGVkIG9ubHkgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBbM11cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuJworICAgICAgICAgICAgICdleHByZXNzaW9ucy4gRGVjb3JhdG9yIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvbiBpc1xuJworICAgICAgICAgICAgICdkZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gICcKKyAgICAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgICAgJ3Jlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gJworICAgICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAgICAnYXMgdGhlIG9ubHkgYXJndW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBib3VuZCB0byB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvbiBuYW1lXG4nCisgICAgICAgICAgICAgJ2luc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgJworICAgICAgICAgICAgICdpblxuJworICAgICAgICAgICAgICduZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgQGYxKGFyZylcbicKKyAgICAgICAgICAgICAnICAgQGYyXG4nCisgICAgICAgICAgICAgJyAgIGRlZiBmdW5jKCk6IHBhc3NcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ2lzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGRlZiBmdW5jKCk6IHBhc3NcbicKKyAgICAgICAgICAgICAnICAgZnVuYyA9IGYxKGFyZykoZjIoZnVuYykpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdXaGVuIG9uZSBvciBtb3JlICpwYXJhbWV0ZXJzKiBoYXZlIHRoZSBmb3JtICpwYXJhbWV0ZXIqICI9IlxuJworICAgICAgICAgICAgICcqZXhwcmVzc2lvbiosIHRoZSBmdW5jdGlvbiBpcyBzYWlkIHRvIGhhdmUgImRlZmF1bHQgcGFyYW1ldGVyICcKKyAgICAgICAgICAgICAndmFsdWVzLiJcbicKKyAgICAgICAgICAgICAnRm9yIGEgcGFyYW1ldGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCB0aGUgY29ycmVzcG9uZGluZyAnCisgICAgICAgICAgICAgJyphcmd1bWVudCogbWF5XG4nCisgICAgICAgICAgICAgImJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlcidzIGRlZmF1bHQgIgorICAgICAgICAgICAgICd2YWx1ZSBpc1xuJworICAgICAgICAgICAgICdzdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbCBmb2xsb3dpbmdcbicKKyAgICAgICAgICAgICAncGFyYW1ldGVycyB1cCB1bnRpbCB0aGUgIiIqIiIgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSAnCisgICAgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAgICAnaXMgYSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgJ2dyYW1tYXIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcqKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB3aGVuICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ2Z1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuKiogVGhpcyBtZWFucyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXNcbicKKyAgICAgICAgICAgICAnZXZhbHVhdGVkIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICcKKyAgICAgICAgICAgICAnInByZS1cbicKKyAgICAgICAgICAgICAnY29tcHV0ZWQiIHZhbHVlIGlzIHVzZWQgZm9yIGVhY2ggY2FsbC4gIFRoaXMgaXMgZXNwZWNpYWxseSAnCisgICAgICAgICAgICAgJ2ltcG9ydGFudFxuJworICAgICAgICAgICAgICd0byB1bmRlcnN0YW5kIHdoZW4gYSBkZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoICcKKyAgICAgICAgICAgICAnYXMgYVxuJworICAgICAgICAgICAgICdsaXN0IG9yIGEgZGljdGlvbmFyeTogaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gJworICAgICAgICAgICAgICdieVxuJworICAgICAgICAgICAgICdhcHBlbmRpbmcgYW4gaXRlbSB0byBhIGxpc3QpLCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBpbiBlZmZlY3QgJworICAgICAgICAgICAgICdtb2RpZmllZC5cbicKKyAgICAgICAgICAgICAnVGhpcyBpcyBnZW5lcmFsbHkgbm90IHdoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgaXMgJworICAgICAgICAgICAgICd0byB1c2VcbicKKyAgICAgICAgICAgICAnIk5vbmUiIGFzIHRoZSBkZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdmdW5jdGlvbiwgZS5nLjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbicKKyAgICAgICAgICAgICAnICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbicKKyAgICAgICAgICAgICAnICAgICAgICAgICBwZW5ndWluID0gW11cbicKKyAgICAgICAgICAgICAnICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbicKKyAgICAgICAgICAgICAnICAgICAgIHJldHVybiBwZW5ndWluXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdGdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb24gJworICAgICAgICAgICAgICdDYWxscy5cbicKKyAgICAgICAgICAgICAnQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVycyAnCisgICAgICAgICAgICAgJ21lbnRpb25lZCBpblxuJworICAgICAgICAgICAgICd0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbSAnCisgICAgICAgICAgICAgJ2tleXdvcmRcbicKKyAgICAgICAgICAgICAnYXJndW1lbnRzLCBvciBmcm9tIGRlZmF1bHQgdmFsdWVzLiAgSWYgdGhlIGZvcm0gIiIqaWRlbnRpZmllciIiICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAncHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmcgYW55IGV4Y2VzcyAnCisgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAncGFyYW1ldGVycywgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgdHVwbGUuICBJZiB0aGUgZm9ybVxuJworICAgICAgICAgICAgICciIioqaWRlbnRpZmllciIiIGlzIHByZXNlbnQsIGl0IGlzIGluaXRpYWxpemVkIHRvIGEgbmV3ICcKKyAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICdyZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ldyAnCisgICAgICAgICAgICAgJ2VtcHR5XG4nCisgICAgICAgICAgICAgJ2RpY3Rpb25hcnkuIFBhcmFtZXRlcnMgYWZ0ZXIgIiIqIiIgb3IgIiIqaWRlbnRpZmllciIiIGFyZSAnCisgICAgICAgICAgICAgJ2tleXdvcmQtb25seVxuJworICAgICAgICAgICAgICdwYXJhbWV0ZXJzIGFuZCBtYXkgb25seSBiZSBwYXNzZWQgdXNlZCBrZXl3b3JkIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1BhcmFtZXRlcnMgbWF5IGhhdmUgYW5ub3RhdGlvbnMgb2YgdGhlIGZvcm0gIiI6IGV4cHJlc3Npb24iIiAnCisgICAgICAgICAgICAgJ2ZvbGxvd2luZ1xuJworICAgICAgICAgICAgICd0aGUgcGFyYW1ldGVyIG5hbWUuICBBbnkgcGFyYW1ldGVyIG1heSBoYXZlIGFuIGFubm90YXRpb24gZXZlbiAnCisgICAgICAgICAgICAgJ3Rob3NlXG4nCisgICAgICAgICAgICAgJ29mIHRoZSBmb3JtICIqaWRlbnRpZmllciIgb3IgIioqaWRlbnRpZmllciIuICBGdW5jdGlvbnMgbWF5ICcKKyAgICAgICAgICAgICAnaGF2ZVxuJworICAgICAgICAgICAgICcicmV0dXJuIiBhbm5vdGF0aW9uIG9mIHRoZSBmb3JtICIiLT4gZXhwcmVzc2lvbiIiIGFmdGVyIHRoZSAnCisgICAgICAgICAgICAgJ3BhcmFtZXRlclxuJworICAgICAgICAgICAgICdsaXN0LiAgVGhlc2UgYW5ub3RhdGlvbnMgY2FuIGJlIGFueSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiBhbmQgJworICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAnZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZXhlY3V0ZWQuICBBbm5vdGF0aW9ucyAnCisgICAgICAgICAgICAgJ21heVxuJworICAgICAgICAgICAgICdiZSBldmFsdWF0ZWQgaW4gYSBkaWZmZXJlbnQgb3JkZXIgdGhhbiB0aGV5IGFwcGVhciBpbiB0aGUgc291cmNlICcKKyAgICAgICAgICAgICAnY29kZS5cbicKKyAgICAgICAgICAgICAnVGhlIHByZXNlbmNlIG9mIGFubm90YXRpb25zIGRvZXMgbm90IGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mIGFcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24uICBUaGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBhcyB2YWx1ZXMgb2YgYVxuJworICAgICAgICAgICAgICJkaWN0aW9uYXJ5IGtleWVkIGJ5IHRoZSBwYXJhbWV0ZXJzJyBuYW1lcyBpbiB0aGUgIgorICAgICAgICAgICAgICciX19hbm5vdGF0aW9uc19fIlxuJworICAgICAgICAgICAgICdhdHRyaWJ1dGUgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0l0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgJworICAgICAgICAgICAgICdib3VuZFxuJworICAgICAgICAgICAgICd0byBhIG5hbWUpLCBmb3IgaW1tZWRpYXRlIHVzZSBpbiBleHByZXNzaW9ucy4gIFRoaXMgdXNlcyBsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbnMsIGRlc2NyaWJlZCBpbiBzZWN0aW9uIExhbWJkYXMuICBOb3RlIHRoYXQgdGhlICcKKyAgICAgICAgICAgICAnbGFtYmRhXG4nCisgICAgICAgICAgICAgJ2V4cHJlc3Npb24gaXMgbWVyZWx5IGEgc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gJworICAgICAgICAgICAgICdkZWZpbml0aW9uO1xuJworICAgICAgICAgICAgICdhIGZ1bmN0aW9uIGRlZmluZWQgaW4gYSAiImRlZiIiIHN0YXRlbWVudCBjYW4gYmUgcGFzc2VkIGFyb3VuZCAnCisgICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAgJ2Fzc2lnbmVkIHRvIGFub3RoZXIgbmFtZSBqdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgJworICAgICAgICAgICAgICdsYW1iZGFcbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbi4gIFRoZSAiImRlZiIiIGZvcm0gaXMgYWN0dWFsbHkgbW9yZSBwb3dlcmZ1bCBzaW5jZSAnCisgICAgICAgICAgICAgJ2l0XG4nCisgICAgICAgICAgICAgJ2FsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHN0YXRlbWVudHMgYW5kIGFubm90YXRpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAiKipQcm9ncmFtbWVyJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICIKKyAgICAgICAgICAgICAnIiJkZWYiIlxuJworICAgICAgICAgICAgICdzdGF0ZW1lbnQgZXhlY3V0ZWQgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgbG9jYWxcbicKKyAgICAgICAgICAgICAnZnVuY3Rpb24gdGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzICcKKyAgICAgICAgICAgICAndXNlZFxuJworICAgICAgICAgICAgICdpbiB0aGUgbmVzdGVkIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgJworICAgICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICAgICdjb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiBOYW1pbmcgYW5kIGJpbmRpbmcgZm9yICcKKyAgICAgICAgICAgICAnZGV0YWlscy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAqKlBFUCAzMTA3KiogLSBGdW5jdGlvbiBBbm5vdGF0aW9uc1xuJworICAgICAgICAgICAgICcgICAgIFRoZSBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uIGZvciBmdW5jdGlvbiBhbm5vdGF0aW9ucy5cbicsCisgJ2dsb2JhbCc6ICdcbicKKyAgICAgICAgICAgJ1RoZSAiZ2xvYmFsIiBzdGF0ZW1lbnRcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgZ2xvYmFsX3N0bXQgOjo9ICJnbG9iYWwiIGlkZW50aWZpZXIgKCIsIiBpZGVudGlmaWVyKSpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICJnbG9iYWwiIHN0YXRlbWVudCBpcyBhIGRlY2xhcmF0aW9uIHdoaWNoIGhvbGRzIGZvciB0aGUgJworICAgICAgICAgICAnZW50aXJlXG4nCisgICAgICAgICAgICdjdXJyZW50IGNvZGUgYmxvY2suICBJdCBtZWFucyB0aGF0IHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgYXJlIHRvICcKKyAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICdpbnRlcnByZXRlZCBhcyBnbG9iYWxzLiAgSXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byBhc3NpZ24gdG8gYSAnCisgICAgICAgICAgICdnbG9iYWxcbicKKyAgICAgICAgICAgJ3ZhcmlhYmxlIHdpdGhvdXQgImdsb2JhbCIsIGFsdGhvdWdoIGZyZWUgdmFyaWFibGVzIG1heSByZWZlciB0b1xuJworICAgICAgICAgICAnZ2xvYmFscyB3aXRob3V0IGJlaW5nIGRlY2xhcmVkIGdsb2JhbC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnTmFtZXMgbGlzdGVkIGluIGEgImdsb2JhbCIgc3RhdGVtZW50IG11c3Qgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgJworICAgICAgICAgICAnY29kZVxuJworICAgICAgICAgICAnYmxvY2sgdGV4dHVhbGx5IHByZWNlZGluZyB0aGF0ICJnbG9iYWwiIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnTmFtZXMgbGlzdGVkIGluIGEgImdsb2JhbCIgc3RhdGVtZW50IG11c3Qgbm90IGJlIGRlZmluZWQgYXMgJworICAgICAgICAgICAnZm9ybWFsXG4nCisgICAgICAgICAgICdwYXJhbWV0ZXJzIG9yIGluIGEgImZvciIgbG9vcCBjb250cm9sIHRhcmdldCwgImNsYXNzIiBkZWZpbml0aW9uLFxuJworICAgICAgICAgICAnZnVuY3Rpb24gZGVmaW5pdGlvbiwgb3IgImltcG9ydCIgc3RhdGVtZW50LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgJworICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICdlbmZvcmNlIHRoZSB0d28gcmVzdHJpY3Rpb25zLCBidXQgcHJvZ3JhbXMgc2hvdWxkIG5vdCBhYnVzZSB0aGlzXG4nCisgICAgICAgICAgICdmcmVlZG9tLCBhcyBmdXR1cmUgaW1wbGVtZW50YXRpb25zIG1heSBlbmZvcmNlIHRoZW0gb3Igc2lsZW50bHkgJworICAgICAgICAgICAnY2hhbmdlXG4nCisgICAgICAgICAgICd0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogdGhlICJnbG9iYWwiIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSAnCisgICAgICAgICAgICdwYXJzZXIuICBJdFxuJworICAgICAgICAgICAnYXBwbGllcyBvbmx5IHRvIGNvZGUgcGFyc2VkIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlICJnbG9iYWwiXG4nCisgICAgICAgICAgICdzdGF0ZW1lbnQuIEluIHBhcnRpY3VsYXIsIGEgImdsb2JhbCIgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiBhICcKKyAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAnb3IgY29kZSBvYmplY3Qgc3VwcGxpZWQgdG8gdGhlIGJ1aWx0LWluICJleGVjKCkiIGZ1bmN0aW9uIGRvZXMgJworICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICdhZmZlY3QgdGhlIGNvZGUgYmxvY2sgKmNvbnRhaW5pbmcqIHRoZSBmdW5jdGlvbiBjYWxsLCBhbmQgY29kZVxuJworICAgICAgICAgICAnY29udGFpbmVkIGluIHN1Y2ggYSBzdHJpbmcgaXMgdW5hZmZlY3RlZCBieSAiZ2xvYmFsIiBzdGF0ZW1lbnRzIGluICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnY29kZSBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBjYWxsLiAgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgJworICAgICAgICAgICAnImV2YWwoKSJcbicKKyAgICAgICAgICAgJ2FuZCAiY29tcGlsZSgpIiBmdW5jdGlvbnMuXG4nLAorICdpZC1jbGFzc2VzJzogJ1xuJworICAgICAgICAgICAgICAgJ1Jlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbicKKyAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlICcKKyAgICAgICAgICAgICAgICdzcGVjaWFsXG4nCisgICAgICAgICAgICAgICAnbWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiAnCisgICAgICAgICAgICAgICAnbGVhZGluZyBhbmRcbicKKyAgICAgICAgICAgICAgICd0cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6XG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnIl8qIlxuJworICAgICAgICAgICAgICAgJyAgIE5vdCBpbXBvcnRlZCBieSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiLiAgVGhlIHNwZWNpYWwgJworICAgICAgICAgICAgICAgJ2lkZW50aWZpZXIgIl8iXG4nCisgICAgICAgICAgICAgICAnICAgaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCAnCisgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAnICAgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlICJidWlsdGlucyIgbW9kdWxlLiAgJworICAgICAgICAgICAgICAgJ1doZW4gbm90XG4nCisgICAgICAgICAgICAgICAnICAgaW4gaW50ZXJhY3RpdmUgbW9kZSwgIl8iIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzIG5vdCAnCisgICAgICAgICAgICAgICAnZGVmaW5lZC5cbicKKyAgICAgICAgICAgICAgICcgICBTZWUgc2VjdGlvbiBUaGUgaW1wb3J0IHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICcgICBOb3RlOiBUaGUgbmFtZSAiXyIgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4nCisgICAgICAgICAgICAgICAnICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZVxuJworICAgICAgICAgICAgICAgJyAgICAgImdldHRleHQiIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzICcKKyAgICAgICAgICAgICAgICdjb252ZW50aW9uLlxuJworICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgJyJfXypfXyJcbicKKyAgICAgICAgICAgICAgICcgICBTeXN0ZW0tZGVmaW5lZCBuYW1lcy4gVGhlc2UgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlICcKKyAgICAgICAgICAgICAgICdpbnRlcnByZXRlclxuJworICAgICAgICAgICAgICAgJyAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICAnCisgICAgICAgICAgICAgICAnQ3VycmVudFxuJworICAgICAgICAgICAgICAgJyAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSBTcGVjaWFsIG1ldGhvZCBuYW1lcyAnCisgICAgICAgICAgICAgICAnc2VjdGlvbiBhbmRcbicKKyAgICAgICAgICAgICAgICcgICBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zICcKKyAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgJyAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiAiX18qX18iIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCAnCisgICAgICAgICAgICAgICAnZG9lcyBub3RcbicKKyAgICAgICAgICAgICAgICcgICBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZSAnCisgICAgICAgICAgICAgICAnd2l0aG91dFxuJworICAgICAgICAgICAgICAgJyAgIHdhcm5pbmcuXG4nCisgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAnIl9fKiJcbicKKyAgICAgICAgICAgICAgICcgICBDbGFzcy1wcml2YXRlIG5hbWVzLiAgTmFtZXMgaW4gdGhpcyBjYXRlZ29yeSwgd2hlbiB1c2VkICcKKyAgICAgICAgICAgICAgICd3aXRoaW4gdGhlXG4nCisgICAgICAgICAgICAgICAnICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhICcKKyAgICAgICAgICAgICAgICdtYW5nbGVkIGZvcm1cbicKKyAgICAgICAgICAgICAgICcgICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mICcKKyAgICAgICAgICAgICAgICdiYXNlIGFuZFxuJworICAgICAgICAgICAgICAgJyAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gSWRlbnRpZmllcnMgKE5hbWVzKS5cbicsCisgJ2lkZW50aWZpZXJzJzogJ1xuJworICAgICAgICAgICAgICAgICdJZGVudGlmaWVycyBhbmQga2V5d29yZHNcbicKKyAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdJZGVudGlmaWVycyAoYWxzbyByZWZlcnJlZCB0byBhcyAqbmFtZXMqKSBhcmUgZGVzY3JpYmVkIGJ5ICcKKyAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgJ2ZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zLlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIHN5bnRheCBvZiBpZGVudGlmaWVycyBpbiBQeXRob24gaXMgYmFzZWQgb24gdGhlIFVuaWNvZGUgJworICAgICAgICAgICAgICAgICdzdGFuZGFyZFxuJworICAgICAgICAgICAgICAgICdhbm5leCBVQVgtMzEsIHdpdGggZWxhYm9yYXRpb24gYW5kIGNoYW5nZXMgYXMgZGVmaW5lZCBiZWxvdzsgJworICAgICAgICAgICAgICAgICdzZWUgYWxzb1xuJworICAgICAgICAgICAgICAgICcqKlBFUCAzMTMxKiogZm9yIGZ1cnRoZXIgZGV0YWlscy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1dpdGhpbiB0aGUgQVNDSUkgcmFuZ2UgKFUrMDAwMS4uVSswMDdGKSwgdGhlIHZhbGlkIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAnaWRlbnRpZmllcnMgYXJlIHRoZSBzYW1lIGFzIGluIFB5dGhvbiAyLng6IHRoZSB1cHBlcmNhc2UgYW5kICcKKyAgICAgICAgICAgICAgICAnbG93ZXJjYXNlXG4nCisgICAgICAgICAgICAgICAgJ2xldHRlcnMgIkEiIHRocm91Z2ggIloiLCB0aGUgdW5kZXJzY29yZSAiXyIgYW5kLCBleGNlcHQgZm9yICcKKyAgICAgICAgICAgICAgICAndGhlIGZpcnN0XG4nCisgICAgICAgICAgICAgICAgJ2NoYXJhY3RlciwgdGhlIGRpZ2l0cyAiMCIgdGhyb3VnaCAiOSIuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdQeXRob24gMy4wIGludHJvZHVjZXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGZyb20gb3V0c2lkZSB0aGUgJworICAgICAgICAgICAgICAgICdBU0NJSVxuJworICAgICAgICAgICAgICAgICdyYW5nZSAoc2VlICoqUEVQIDMxMzEqKikuICBGb3IgdGhlc2UgY2hhcmFjdGVycywgdGhlICcKKyAgICAgICAgICAgICAgICAnY2xhc3NpZmljYXRpb25cbicKKyAgICAgICAgICAgICAgICAndXNlcyB0aGUgdmVyc2lvbiBvZiB0aGUgVW5pY29kZSBDaGFyYWN0ZXIgRGF0YWJhc2UgYXMgJworICAgICAgICAgICAgICAgICdpbmNsdWRlZCBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAnInVuaWNvZGVkYXRhIiBtb2R1bGUuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdJZGVudGlmaWVycyBhcmUgdW5saW1pdGVkIGluIGxlbmd0aC4gIENhc2UgaXMgc2lnbmlmaWNhbnQuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICBpZGVudGlmaWVyICAgOjo9IHhpZF9zdGFydCB4aWRfY29udGludWUqXG4nCisgICAgICAgICAgICAgICAgJyAgIGlkX3N0YXJ0ICAgICA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGdlbmVyYWwgY2F0ZWdvcmllcyBMdSwgJworICAgICAgICAgICAgICAgICdMbCwgTHQsIExtLCBMbywgTmwsIHRoZSB1bmRlcnNjb3JlLCBhbmQgY2hhcmFjdGVycyB3aXRoIHRoZSAnCisgICAgICAgICAgICAgICAgJ090aGVyX0lEX1N0YXJ0IHByb3BlcnR5PlxuJworICAgICAgICAgICAgICAgICcgICBpZF9jb250aW51ZSAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCwgcGx1cyAnCisgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgaW4gdGhlIGNhdGVnb3JpZXMgTW4sIE1jLCBOZCwgUGMgYW5kIG90aGVycyB3aXRoICcKKyAgICAgICAgICAgICAgICAndGhlIE90aGVyX0lEX0NvbnRpbnVlIHByb3BlcnR5PlxuJworICAgICAgICAgICAgICAgICcgICB4aWRfc3RhcnQgICAgOjo9IDxhbGwgY2hhcmFjdGVycyBpbiBpZF9zdGFydCB3aG9zZSBORktDICcKKyAgICAgICAgICAgICAgICAnbm9ybWFsaXphdGlvbiBpcyBpbiAiaWRfc3RhcnQgeGlkX2NvbnRpbnVlKiI+XG4nCisgICAgICAgICAgICAgICAgJyAgIHhpZF9jb250aW51ZSA6Oj0gPGFsbCBjaGFyYWN0ZXJzIGluIGlkX2NvbnRpbnVlIHdob3NlIE5GS0MgJworICAgICAgICAgICAgICAgICdub3JtYWxpemF0aW9uIGlzIGluICJpZF9jb250aW51ZSoiPlxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnVGhlIFVuaWNvZGUgY2F0ZWdvcnkgY29kZXMgbWVudGlvbmVkIGFib3ZlIHN0YW5kIGZvcjpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKkx1KiAtIHVwcGVyY2FzZSBsZXR0ZXJzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpMbCogLSBsb3dlcmNhc2UgbGV0dGVyc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTHQqIC0gdGl0bGVjYXNlIGxldHRlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKkxtKiAtIG1vZGlmaWVyIGxldHRlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKkxvKiAtIG90aGVyIGxldHRlcnNcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyogKk5sKiAtIGxldHRlciBudW1iZXJzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpNbiogLSBub25zcGFjaW5nIG1hcmtzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpNYyogLSBzcGFjaW5nIGNvbWJpbmluZyBtYXJrc1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnKiAqTmQqIC0gZGVjaW1hbCBudW1iZXJzXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpQYyogLSBjb25uZWN0b3IgcHVuY3R1YXRpb25zXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpPdGhlcl9JRF9TdGFydCogLSBleHBsaWNpdCBsaXN0IG9mIGNoYXJhY3RlcnMgaW4gJworICAgICAgICAgICAgICAgICdQcm9wTGlzdC50eHQgdG9cbicKKyAgICAgICAgICAgICAgICAnICBzdXBwb3J0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcqICpPdGhlcl9JRF9Db250aW51ZSogLSBsaWtld2lzZVxuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnQWxsIGlkZW50aWZpZXJzIGFyZSBjb252ZXJ0ZWQgaW50byB0aGUgbm9ybWFsIGZvcm0gTkZLQyB3aGlsZSAnCisgICAgICAgICAgICAgICAgJ3BhcnNpbmc7XG4nCisgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gb2YgaWRlbnRpZmllcnMgaXMgYmFzZWQgb24gTkZLQy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0Egbm9uLW5vcm1hdGl2ZSBIVE1MIGZpbGUgbGlzdGluZyBhbGwgdmFsaWQgaWRlbnRpZmllciAnCisgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgZm9yXG4nCisgICAgICAgICAgICAgICAgJ1VuaWNvZGUgNC4xIGNhbiBiZSBmb3VuZCBhdCBodHRwczovL3d3dy5kY2wuaHBpLnVuaS1cbicKKyAgICAgICAgICAgICAgICAncG90c2RhbS5kZS9ob21lL2xvZXdpcy90YWJsZS0zMTMxLmh0bWwuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAnS2V5d29yZHNcbicKKyAgICAgICAgICAgICAgICAnPT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnMgYXJlIHVzZWQgYXMgcmVzZXJ2ZWQgd29yZHMsIG9yICcKKyAgICAgICAgICAgICAgICAnKmtleXdvcmRzKiBvZlxuJworICAgICAgICAgICAgICAgICd0aGUgbGFuZ3VhZ2UsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBvcmRpbmFyeSBpZGVudGlmaWVycy4gICcKKyAgICAgICAgICAgICAgICAnVGhleSBtdXN0XG4nCisgICAgICAgICAgICAgICAgJ2JlIHNwZWxsZWQgZXhhY3RseSBhcyB3cml0dGVuIGhlcmU6XG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICBGYWxzZSAgICAgIGNsYXNzICAgICAgZmluYWxseSAgICBpcyAgICAgICAgIHJldHVyblxuJworICAgICAgICAgICAgICAgICcgICBOb25lICAgICAgIGNvbnRpbnVlICAgZm9yICAgICAgICBsYW1iZGEgICAgIHRyeVxuJworICAgICAgICAgICAgICAgICcgICBUcnVlICAgICAgIGRlZiAgICAgICAgZnJvbSAgICAgICBub25sb2NhbCAgIHdoaWxlXG4nCisgICAgICAgICAgICAgICAgJyAgIGFuZCAgICAgICAgZGVsICAgICAgICBnbG9iYWwgICAgIG5vdCAgICAgICAgd2l0aFxuJworICAgICAgICAgICAgICAgICcgICBhcyAgICAgICAgIGVsaWYgICAgICAgaWYgICAgICAgICBvciAgICAgICAgIHlpZWxkXG4nCisgICAgICAgICAgICAgICAgJyAgIGFzc2VydCAgICAgZWxzZSAgICAgICBpbXBvcnQgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAnICAgYnJlYWsgICAgICBleGNlcHQgICAgIGluICAgICAgICAgcmFpc2VcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICdSZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXG4nCisgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJ0NlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSAnCisgICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAnbWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiAnCisgICAgICAgICAgICAgICAgJ2xlYWRpbmcgYW5kXG4nCisgICAgICAgICAgICAgICAgJ3RyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczpcbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyJfKiJcbicKKyAgICAgICAgICAgICAgICAnICAgTm90IGltcG9ydGVkIGJ5ICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIuICBUaGUgc3BlY2lhbCAnCisgICAgICAgICAgICAgICAgJ2lkZW50aWZpZXIgIl8iXG4nCisgICAgICAgICAgICAgICAgJyAgIGlzIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIHRvIHN0b3JlIHRoZSByZXN1bHQgJworICAgICAgICAgICAgICAgICdvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAnICAgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlICJidWlsdGlucyIgbW9kdWxlLiAgJworICAgICAgICAgICAgICAgICdXaGVuIG5vdFxuJworICAgICAgICAgICAgICAgICcgICBpbiBpbnRlcmFjdGl2ZSBtb2RlLCAiXyIgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXMgbm90ICcKKyAgICAgICAgICAgICAgICAnZGVmaW5lZC5cbicKKyAgICAgICAgICAgICAgICAnICAgU2VlIHNlY3Rpb24gVGhlIGltcG9ydCBzdGF0ZW1lbnQuXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICcgICBOb3RlOiBUaGUgbmFtZSAiXyIgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4nCisgICAgICAgICAgICAgICAgJyAgICAgaW50ZXJuYXRpb25hbGl6YXRpb247IHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciAnCisgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICcgICAgICJnZXR0ZXh0IiBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyAnCisgICAgICAgICAgICAgICAgJ2NvbnZlbnRpb24uXG4nCisgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICciX18qX18iXG4nCisgICAgICAgICAgICAgICAgJyAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgJworICAgICAgICAgICAgICAgICdpbnRlcnByZXRlclxuJworICAgICAgICAgICAgICAgICcgICBhbmQgaXRzIGltcGxlbWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiAgJworICAgICAgICAgICAgICAgICdDdXJyZW50XG4nCisgICAgICAgICAgICAgICAgJyAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSBTcGVjaWFsIG1ldGhvZCBuYW1lcyAnCisgICAgICAgICAgICAgICAgJ3NlY3Rpb24gYW5kXG4nCisgICAgICAgICAgICAgICAgJyAgIGVsc2V3aGVyZS4gIE1vcmUgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgJworICAgICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICAgICcgICBQeXRob24uICAqQW55KiB1c2Ugb2YgIl9fKl9fIiBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgJworICAgICAgICAgICAgICAgICdkb2VzIG5vdFxuJworICAgICAgICAgICAgICAgICcgICBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZSAnCisgICAgICAgICAgICAgICAgJ3dpdGhvdXRcbicKKyAgICAgICAgICAgICAgICAnICAgd2FybmluZy5cbicKKyAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgJyJfXyoiXG4nCisgICAgICAgICAgICAgICAgJyAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgJworICAgICAgICAgICAgICAgICd3aXRoaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgJyAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSAnCisgICAgICAgICAgICAgICAgJ21hbmdsZWQgZm9ybVxuJworICAgICAgICAgICAgICAgICcgICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mICcKKyAgICAgICAgICAgICAgICAnYmFzZSBhbmRcbicKKyAgICAgICAgICAgICAgICAnICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiBJZGVudGlmaWVycyAoTmFtZXMpLlxuJywKKyAnaWYnOiAnXG4nCisgICAgICAgJ1RoZSAiaWYiIHN0YXRlbWVudFxuJworICAgICAgICcqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAnXG4nCisgICAgICAgJ1RoZSAiaWYiIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG4nCisgICAgICAgJ1xuJworICAgICAgICcgICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4nCisgICAgICAgJyAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4nCisgICAgICAgJyAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICdcbicKKyAgICAgICAnSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zICcKKyAgICAgICAnb25lXG4nCisgICAgICAgJ2J5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gQm9vbGVhbiBvcGVyYXRpb25zXG4nCisgICAgICAgJ2ZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuJworICAgICAgICcoYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlICJpZiIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG4nCisgICAgICAgJ0lmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWZcbicKKyAgICAgICAncHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAorICdpbWFnaW5hcnknOiAnXG4nCisgICAgICAgICAgICAgICdJbWFnaW5hcnkgbGl0ZXJhbHNcbicKKyAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICdJbWFnaW5hcnkgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGxleGljYWwgJworICAgICAgICAgICAgICAnZGVmaW5pdGlvbnM6XG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJyAgIGltYWdudW1iZXIgOjo9IChmbG9hdG51bWJlciB8IGludHBhcnQpICgiaiIgfCAiSiIpXG4nCisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgJ0FuIGltYWdpbmFyeSBsaXRlcmFsIHlpZWxkcyBhIGNvbXBsZXggbnVtYmVyIHdpdGggYSByZWFsIHBhcnQgJworICAgICAgICAgICAgICAnb2YgMC4wLlxuJworICAgICAgICAgICAgICAnQ29tcGxleCBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgZmxvYXRpbmcgcG9pbnQgJworICAgICAgICAgICAgICAnbnVtYmVyc1xuJworICAgICAgICAgICAgICAnYW5kIGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb25zIG9uIHRoZWlyIHJhbmdlLiAgVG8gY3JlYXRlIGEgJworICAgICAgICAgICAgICAnY29tcGxleFxuJworICAgICAgICAgICAgICAnbnVtYmVyIHdpdGggYSBub256ZXJvIHJlYWwgcGFydCwgYWRkIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvICcKKyAgICAgICAgICAgICAgJ2l0LFxuJworICAgICAgICAgICAgICAnZS5nLiwgIigzKzRqKSIuICBTb21lIGV4YW1wbGVzIG9mIGltYWdpbmFyeSBsaXRlcmFsczpcbicKKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAnICAgMy4xNGogICAxMC5qICAgIDEwaiAgICAgLjAwMWogICAxZTEwMGogIDMuMTRlLTEwalxuJywKKyAnaW1wb3J0JzogJ1xuJworICAgICAgICAgICAnVGhlICJpbXBvcnQiIHN0YXRlbWVudFxuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBpbXBvcnRfc3RtdCAgICAgOjo9ICJpbXBvcnQiIG1vZHVsZSBbImFzIiBuYW1lXSAoICIsIiBtb2R1bGUgJworICAgICAgICAgICAnWyJhcyIgbmFtZV0gKSpcbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgaWRlbnRpZmllciAnCisgICAgICAgICAgICdbImFzIiBuYW1lXVxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSpcbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiByZWxhdGl2ZV9tb2R1bGUgImltcG9ydCIgIigiICcKKyAgICAgICAgICAgJ2lkZW50aWZpZXIgWyJhcyIgbmFtZV1cbicKKyAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqIFsiLCJdICIpIlxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgIHwgImZyb20iIG1vZHVsZSAiaW1wb3J0IiAiKiJcbicKKyAgICAgICAgICAgJyAgIG1vZHVsZSAgICAgICAgICA6Oj0gKGlkZW50aWZpZXIgIi4iKSogaWRlbnRpZmllclxuJworICAgICAgICAgICAnICAgcmVsYXRpdmVfbW9kdWxlIDo6PSAiLiIqIG1vZHVsZSB8ICIuIitcbicKKyAgICAgICAgICAgJyAgIG5hbWUgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgYmFzaWMgaW1wb3J0IHN0YXRlbWVudCAobm8gImZyb20iIGNsYXVzZSkgaXMgZXhlY3V0ZWQgaW4gdHdvXG4nCisgICAgICAgICAgICdzdGVwczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnMS4gZmluZCBhIG1vZHVsZSwgbG9hZGluZyBhbmQgaW5pdGlhbGl6aW5nIGl0IGlmIG5lY2Vzc2FyeVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcyLiBkZWZpbmUgYSBuYW1lIG9yIG5hbWVzIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBzY29wZVxuJworICAgICAgICAgICAnICAgd2hlcmUgdGhlICJpbXBvcnQiIHN0YXRlbWVudCBvY2N1cnMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1doZW4gdGhlIHN0YXRlbWVudCBjb250YWlucyBtdWx0aXBsZSBjbGF1c2VzIChzZXBhcmF0ZWQgYnkgY29tbWFzKSAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ3R3byBzdGVwcyBhcmUgY2FycmllZCBvdXQgc2VwYXJhdGVseSBmb3IgZWFjaCBjbGF1c2UsIGp1c3QgYXMgJworICAgICAgICAgICAndGhvdWdoXG4nCisgICAgICAgICAgICd0aGUgY2xhdXNlcyBoYWQgYmVlbiBzZXBhcmF0ZWQgb3V0IGludG8gaW5kaXZpZHVhbCBpbXBvcnQgJworICAgICAgICAgICAnc3RhdGVtZW50cy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIGRldGFpbHMgb2YgdGhlIGZpcnN0IHN0ZXAsIGZpbmRpbmcgYW5kIGxvYWRpbmcgbW9kdWxlcyBhcmVcbicKKyAgICAgICAgICAgJ2Rlc2NyaWJlZCBpbiBncmVhdGVyIGRldGFpbCBpbiB0aGUgc2VjdGlvbiBvbiB0aGUgaW1wb3J0IHN5c3RlbSwgJworICAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAgJ2Fsc28gZGVzY3JpYmVzIHRoZSB2YXJpb3VzIHR5cGVzIG9mIHBhY2thZ2VzIGFuZCBtb2R1bGVzIHRoYXQgY2FuICcKKyAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICdpbXBvcnRlZCwgYXMgd2VsbCBhcyBhbGwgdGhlIGhvb2tzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnaW1wb3J0IHN5c3RlbS4gTm90ZSB0aGF0IGZhaWx1cmVzIGluIHRoaXMgc3RlcCBtYXkgaW5kaWNhdGUgJworICAgICAgICAgICAnZWl0aGVyXG4nCisgICAgICAgICAgICd0aGF0IHRoZSBtb2R1bGUgY291bGQgbm90IGJlIGxvY2F0ZWQsICpvciogdGhhdCBhbiBlcnJvciBvY2N1cnJlZFxuJworICAgICAgICAgICAnd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBtb2R1bGUsIHdoaWNoIGluY2x1ZGVzIGV4ZWN1dGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgIm1vZHVsZSdzIGNvZGUuXG4iCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIHRoZSByZXF1ZXN0ZWQgbW9kdWxlIGlzIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIGl0IHdpbGwgYmUgJworICAgICAgICAgICAnbWFkZVxuJworICAgICAgICAgICAnYXZhaWxhYmxlIGluIHRoZSBsb2NhbCBuYW1lc3BhY2UgaW4gb25lIG9mIHRocmVlIHdheXM6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyogSWYgdGhlIG1vZHVsZSBuYW1lIGlzIGZvbGxvd2VkIGJ5ICJhcyIsIHRoZW4gdGhlIG5hbWUgZm9sbG93aW5nXG4nCisgICAgICAgICAgICcgICJhcyIgaXMgYm91bmQgZGlyZWN0bHkgdG8gdGhlIGltcG9ydGVkIG1vZHVsZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBJZiBubyBvdGhlciBuYW1lIGlzIHNwZWNpZmllZCwgYW5kIHRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQgaXMgJworICAgICAgICAgICAnYVxuJworICAgICAgICAgICAiICB0b3AgbGV2ZWwgbW9kdWxlLCB0aGUgbW9kdWxlJ3MgbmFtZSBpcyBib3VuZCBpbiB0aGUgbG9jYWwgIgorICAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgICcgIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBpbXBvcnRlZCBtb2R1bGVcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBJZiB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzICpub3QqIGEgdG9wIGxldmVsIG1vZHVsZSwgdGhlbiAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJyAgbmFtZSBvZiB0aGUgdG9wIGxldmVsIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlIGlzIGJvdW5kICcKKyAgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgICcgIHRoZSBsb2NhbCBuYW1lc3BhY2UgYXMgYSByZWZlcmVuY2UgdG8gdGhlIHRvcCBsZXZlbCBwYWNrYWdlLiAnCisgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgJyAgaW1wb3J0ZWQgbW9kdWxlIG11c3QgYmUgYWNjZXNzZWQgdXNpbmcgaXRzIGZ1bGwgcXVhbGlmaWVkIG5hbWVcbicKKyAgICAgICAgICAgJyAgcmF0aGVyIHRoYW4gZGlyZWN0bHlcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICJmcm9tIiBmb3JtIHVzZXMgYSBzbGlnaHRseSBtb3JlIGNvbXBsZXggcHJvY2VzczpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnMS4gZmluZCB0aGUgbW9kdWxlIHNwZWNpZmllZCBpbiB0aGUgImZyb20iIGNsYXVzZSwgbG9hZGluZyBhbmRcbicKKyAgICAgICAgICAgJyAgIGluaXRpYWxpemluZyBpdCBpZiBuZWNlc3Nhcnk7XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJzIuIGZvciBlYWNoIG9mIHRoZSBpZGVudGlmaWVycyBzcGVjaWZpZWQgaW4gdGhlICJpbXBvcnQiIGNsYXVzZXM6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIDEuIGNoZWNrIGlmIHRoZSBpbXBvcnRlZCBtb2R1bGUgaGFzIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWVcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgMi4gaWYgbm90LCBhdHRlbXB0IHRvIGltcG9ydCBhIHN1Ym1vZHVsZSB3aXRoIHRoYXQgbmFtZSBhbmQgJworICAgICAgICAgICAndGhlblxuJworICAgICAgICAgICAnICAgICAgY2hlY2sgdGhlIGltcG9ydGVkIG1vZHVsZSBhZ2FpbiBmb3IgdGhhdCBhdHRyaWJ1dGVcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgMy4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsICJJbXBvcnRFcnJvciIgaXMgcmFpc2VkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICA0LiBvdGhlcndpc2UsIGEgcmVmZXJlbmNlIHRvIHRoYXQgdmFsdWUgaXMgc3RvcmVkIGluIHRoZSBsb2NhbFxuJworICAgICAgICAgICAnICAgICAgbmFtZXNwYWNlLCB1c2luZyB0aGUgbmFtZSBpbiB0aGUgImFzIiBjbGF1c2UgaWYgaXQgaXMgJworICAgICAgICAgICAncHJlc2VudCxcbicKKyAgICAgICAgICAgJyAgICAgIG90aGVyd2lzZSB1c2luZyB0aGUgYXR0cmlidXRlIG5hbWVcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnRXhhbXBsZXM6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGltcG9ydCBmb28gICAgICAgICAgICAgICAgICMgZm9vIGltcG9ydGVkIGFuZCBib3VuZCBsb2NhbGx5XG4nCisgICAgICAgICAgICcgICBpbXBvcnQgZm9vLmJhci5iYXogICAgICAgICAjIGZvby5iYXIuYmF6IGltcG9ydGVkLCBmb28gYm91bmQgJworICAgICAgICAgICAnbG9jYWxseVxuJworICAgICAgICAgICAnICAgaW1wb3J0IGZvby5iYXIuYmF6IGFzIGZiYiAgIyBmb28uYmFyLmJheiBpbXBvcnRlZCBhbmQgYm91bmQgYXMgJworICAgICAgICAgICAnZmJiXG4nCisgICAgICAgICAgICcgICBmcm9tIGZvby5iYXIgaW1wb3J0IGJheiAgICAjIGZvby5iYXIuYmF6IGltcG9ydGVkIGFuZCBib3VuZCBhcyAnCisgICAgICAgICAgICdiYXpcbicKKyAgICAgICAgICAgJyAgIGZyb20gZm9vIGltcG9ydCBhdHRyICAgICAgICMgZm9vIGltcG9ydGVkIGFuZCBmb28uYXR0ciBib3VuZCBhcyAnCisgICAgICAgICAgICdhdHRyXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIGlzIHJlcGxhY2VkIGJ5IGEgc3RhciAoIlwnKlwnIiksIGFsbCAnCisgICAgICAgICAgICdwdWJsaWNcbicKKyAgICAgICAgICAgJ25hbWVzIGRlZmluZWQgaW4gdGhlIG1vZHVsZSBhcmUgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBmb3IgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdzY29wZSB3aGVyZSB0aGUgImltcG9ydCIgc3RhdGVtZW50IG9jY3Vycy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlICpwdWJsaWMgbmFtZXMqIGRlZmluZWQgYnkgYSBtb2R1bGUgYXJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdtb2R1bGVcJ3MgbmFtZXNwYWNlIGZvciBhIHZhcmlhYmxlIG5hbWVkICJfX2FsbF9fIjsgaWYgZGVmaW5lZCwgaXQgJworICAgICAgICAgICAnbXVzdFxuJworICAgICAgICAgICAnYmUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBuYW1lcyBkZWZpbmVkIG9yIGltcG9ydGVkIGJ5ICcKKyAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgJ21vZHVsZS4gIFRoZSBuYW1lcyBnaXZlbiBpbiAiX19hbGxfXyIgYXJlIGFsbCBjb25zaWRlcmVkIHB1YmxpYyAnCisgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgJ2FyZSByZXF1aXJlZCB0byBleGlzdC4gIElmICJfX2FsbF9fIiBpcyBub3QgZGVmaW5lZCwgdGhlIHNldCBvZiAnCisgICAgICAgICAgICdwdWJsaWNcbicKKyAgICAgICAgICAgIm5hbWVzIGluY2x1ZGVzIGFsbCBuYW1lcyBmb3VuZCBpbiB0aGUgbW9kdWxlJ3MgbmFtZXNwYWNlIHdoaWNoIGRvICIKKyAgICAgICAgICAgJ25vdFxuJworICAgICAgICAgICAnYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlIGNoYXJhY3RlciAoIlwnX1wnIikuICAiX19hbGxfXyIgc2hvdWxkICcKKyAgICAgICAgICAgJ2NvbnRhaW5cbicKKyAgICAgICAgICAgJ3RoZSBlbnRpcmUgcHVibGljIEFQSS4gSXQgaXMgaW50ZW5kZWQgdG8gYXZvaWQgYWNjaWRlbnRhbGx5ICcKKyAgICAgICAgICAgJ2V4cG9ydGluZ1xuJworICAgICAgICAgICAnaXRlbXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIEFQSSAoc3VjaCBhcyBsaWJyYXJ5IG1vZHVsZXMgd2hpY2ggJworICAgICAgICAgICAnd2VyZVxuJworICAgICAgICAgICAnaW1wb3J0ZWQgYW5kIHVzZWQgd2l0aGluIHRoZSBtb2R1bGUpLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiIC0tLSBpcyAnCisgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICdhbGxvd2VkIGF0IHRoZSBtb2R1bGUgbGV2ZWwuICBBdHRlbXB0aW5nIHRvIHVzZSBpdCBpbiBjbGFzcyBvclxuJworICAgICAgICAgICAnZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2lsbCByYWlzZSBhICJTeW50YXhFcnJvciIuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1doZW4gc3BlY2lmeWluZyB3aGF0IG1vZHVsZSB0byBpbXBvcnQgeW91IGRvIG5vdCBoYXZlIHRvIHNwZWNpZnkgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdhYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUuIFdoZW4gYSBtb2R1bGUgb3IgcGFja2FnZSBpcyAnCisgICAgICAgICAgICdjb250YWluZWRcbicKKyAgICAgICAgICAgJ3dpdGhpbiBhbm90aGVyIHBhY2thZ2UgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHJlbGF0aXZlIGltcG9ydCAnCisgICAgICAgICAgICd3aXRoaW5cbicKKyAgICAgICAgICAgJ3RoZSBzYW1lIHRvcCBwYWNrYWdlIHdpdGhvdXQgaGF2aW5nIHRvIG1lbnRpb24gdGhlIHBhY2thZ2UgbmFtZS4gJworICAgICAgICAgICAnQnlcbicKKyAgICAgICAgICAgJ3VzaW5nIGxlYWRpbmcgZG90cyBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvciBwYWNrYWdlIGFmdGVyICJmcm9tIiAnCisgICAgICAgICAgICd5b3VcbicKKyAgICAgICAgICAgJ2NhbiBzcGVjaWZ5IGhvdyBoaWdoIHRvIHRyYXZlcnNlIHVwIHRoZSBjdXJyZW50IHBhY2thZ2UgaGllcmFyY2h5XG4nCisgICAgICAgICAgICd3aXRob3V0IHNwZWNpZnlpbmcgZXhhY3QgbmFtZXMuIE9uZSBsZWFkaW5nIGRvdCBtZWFucyB0aGUgY3VycmVudFxuJworICAgICAgICAgICAncGFja2FnZSB3aGVyZSB0aGUgbW9kdWxlIG1ha2luZyB0aGUgaW1wb3J0IGV4aXN0cy4gVHdvIGRvdHMgbWVhbnMgJworICAgICAgICAgICAndXBcbicKKyAgICAgICAgICAgJ29uZSBwYWNrYWdlIGxldmVsLiBUaHJlZSBkb3RzIGlzIHVwIHR3byBsZXZlbHMsIGV0Yy4gU28gaWYgeW91ICcKKyAgICAgICAgICAgJ2V4ZWN1dGVcbicKKyAgICAgICAgICAgJyJmcm9tIC4gaW1wb3J0IG1vZCIgZnJvbSBhIG1vZHVsZSBpbiB0aGUgInBrZyIgcGFja2FnZSB0aGVuIHlvdSAnCisgICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgICdlbmQgdXAgaW1wb3J0aW5nICJwa2cubW9kIi4gSWYgeW91IGV4ZWN1dGUgImZyb20gLi5zdWJwa2cyIGltcG9ydCAnCisgICAgICAgICAgICdtb2QiXG4nCisgICAgICAgICAgICdmcm9tIHdpdGhpbiAicGtnLnN1YnBrZzEiIHlvdSB3aWxsIGltcG9ydCAicGtnLnN1YnBrZzIubW9kIi4gVGhlXG4nCisgICAgICAgICAgICdzcGVjaWZpY2F0aW9uIGZvciByZWxhdGl2ZSBpbXBvcnRzIGlzIGNvbnRhaW5lZCB3aXRoaW4gKipQRVAgJworICAgICAgICAgICAnMzI4KiouXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyJpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpIiBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGFwcGxpY2F0aW9ucyAnCisgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICdkZXRlcm1pbmUgZHluYW1pY2FsbHkgdGhlIG1vZHVsZXMgdG8gYmUgbG9hZGVkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0Z1dHVyZSBzdGF0ZW1lbnRzXG4nCisgICAgICAgICAgICc9PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBICpmdXR1cmUgc3RhdGVtZW50KiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgY29tcGlsZXIgdGhhdCBhICcKKyAgICAgICAgICAgJ3BhcnRpY3VsYXJcbicKKyAgICAgICAgICAgJ21vZHVsZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgc3ludGF4IG9yIHNlbWFudGljcyB0aGF0IHdpbGwgYmVcbicKKyAgICAgICAgICAgJ2F2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBmdXR1cmUgcmVsZWFzZSBvZiBQeXRob24gd2hlcmUgdGhlICcKKyAgICAgICAgICAgJ2ZlYXR1cmVcbicKKyAgICAgICAgICAgJ2JlY29tZXMgc3RhbmRhcmQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBmdXR1cmUgc3RhdGVtZW50IGlzIGludGVuZGVkIHRvIGVhc2UgbWlncmF0aW9uIHRvIGZ1dHVyZSAnCisgICAgICAgICAgICd2ZXJzaW9uc1xuJworICAgICAgICAgICAnb2YgUHl0aG9uIHRoYXQgaW50cm9kdWNlIGluY29tcGF0aWJsZSBjaGFuZ2VzIHRvIHRoZSBsYW5ndWFnZS4gICcKKyAgICAgICAgICAgJ0l0XG4nCisgICAgICAgICAgICdhbGxvd3MgdXNlIG9mIHRoZSBuZXcgZmVhdHVyZXMgb24gYSBwZXItbW9kdWxlIGJhc2lzIGJlZm9yZSB0aGVcbicKKyAgICAgICAgICAgJ3JlbGVhc2UgaW4gd2hpY2ggdGhlIGZlYXR1cmUgYmVjb21lcyBzdGFuZGFyZC5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgZnV0dXJlX3N0YXRlbWVudCA6Oj0gImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiBmZWF0dXJlIFsiYXMiICcKKyAgICAgICAgICAgJ25hbWVdXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKlxuJworICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiICIoIiBmZWF0dXJlICcKKyAgICAgICAgICAgJ1siYXMiIG5hbWVdXG4nCisgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAoIiwiIGZlYXR1cmUgWyJhcyIgbmFtZV0pKiBbIiwiXSAiKSJcbicKKyAgICAgICAgICAgJyAgIGZlYXR1cmUgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgJyAgIG5hbWUgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSBmdXR1cmUgc3RhdGVtZW50IG11c3QgYXBwZWFyIG5lYXIgdGhlIHRvcCBvZiB0aGUgbW9kdWxlLiAgVGhlICcKKyAgICAgICAgICAgJ29ubHlcbicKKyAgICAgICAgICAgJ2xpbmVzIHRoYXQgY2FuIGFwcGVhciBiZWZvcmUgYSBmdXR1cmUgc3RhdGVtZW50IGFyZTpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiB0aGUgbW9kdWxlIGRvY3N0cmluZyAoaWYgYW55KSxcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBjb21tZW50cyxcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKiBibGFuayBsaW5lcywgYW5kXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyogb3RoZXIgZnV0dXJlIHN0YXRlbWVudHMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSBmZWF0dXJlcyByZWNvZ25pemVkIGJ5IFB5dGhvbiAzLjAgYXJlICJhYnNvbHV0ZV9pbXBvcnQiLFxuJworICAgICAgICAgICAnImRpdmlzaW9uIiwgImdlbmVyYXRvcnMiLCAidW5pY29kZV9saXRlcmFscyIsICJwcmludF9mdW5jdGlvbiIsXG4nCisgICAgICAgICAgICcibmVzdGVkX3Njb3BlcyIgYW5kICJ3aXRoX3N0YXRlbWVudCIuICBUaGV5IGFyZSBhbGwgcmVkdW5kYW50ICcKKyAgICAgICAgICAgJ2JlY2F1c2VcbicKKyAgICAgICAgICAgJ3RoZXkgYXJlIGFsd2F5cyBlbmFibGVkLCBhbmQgb25seSBrZXB0IGZvciBiYWNrd2FyZHMgJworICAgICAgICAgICAnY29tcGF0aWJpbGl0eS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGVcbicKKyAgICAgICAgICAgJ3RpbWU6IENoYW5nZXMgdG8gdGhlIHNlbWFudGljcyBvZiBjb3JlIGNvbnN0cnVjdHMgYXJlIG9mdGVuXG4nCisgICAgICAgICAgICdpbXBsZW1lbnRlZCBieSBnZW5lcmF0aW5nIGRpZmZlcmVudCBjb2RlLiAgSXQgbWF5IGV2ZW4gYmUgdGhlICcKKyAgICAgICAgICAgJ2Nhc2VcbicKKyAgICAgICAgICAgJ3RoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgJworICAgICAgICAgICAnbmV3XG4nCisgICAgICAgICAgICdyZXNlcnZlZCB3b3JkKSwgaW4gd2hpY2ggY2FzZSB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gcGFyc2UgdGhlXG4nCisgICAgICAgICAgICdtb2R1bGUgZGlmZmVyZW50bHkuICBTdWNoIGRlY2lzaW9ucyBjYW5ub3QgYmUgcHVzaGVkIG9mZiB1bnRpbFxuJworICAgICAgICAgICAncnVudGltZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnRm9yIGFueSBnaXZlbiByZWxlYXNlLCB0aGUgY29tcGlsZXIga25vd3Mgd2hpY2ggZmVhdHVyZSBuYW1lcyAnCisgICAgICAgICAgICdoYXZlXG4nCisgICAgICAgICAgICdiZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgJworICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICdjb250YWlucyBhIGZlYXR1cmUgbm90IGtub3duIHRvIGl0LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCAnCisgICAgICAgICAgICdzdGF0ZW1lbnQ6XG4nCisgICAgICAgICAgICd0aGVyZSBpcyBhIHN0YW5kYXJkIG1vZHVsZSAiX19mdXR1cmVfXyIsIGRlc2NyaWJlZCBsYXRlciwgYW5kIGl0ICcKKyAgICAgICAgICAgJ3dpbGxcbicKKyAgICAgICAgICAgJ2JlIGltcG9ydGVkIGluIHRoZSB1c3VhbCB3YXkgYXQgdGhlIHRpbWUgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQgaXNcbicKKyAgICAgICAgICAgJ2V4ZWN1dGVkLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgaW50ZXJlc3RpbmcgcnVudGltZSBzZW1hbnRpY3MgZGVwZW5kIG9uIHRoZSBzcGVjaWZpYyBmZWF0dXJlXG4nCisgICAgICAgICAgICdlbmFibGVkIGJ5IHRoZSBmdXR1cmUgc3RhdGVtZW50LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdOb3RlIHRoYXQgdGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0IHRoZSBzdGF0ZW1lbnQ6XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyAgIGltcG9ydCBfX2Z1dHVyZV9fIFthcyBuYW1lXVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICJUaGF0IGlzIG5vdCBhIGZ1dHVyZSBzdGF0ZW1lbnQ7IGl0J3MgYW4gb3JkaW5hcnkgaW1wb3J0IHN0YXRlbWVudCAiCisgICAgICAgICAgICd3aXRoXG4nCisgICAgICAgICAgICdubyBzcGVjaWFsIHNlbWFudGljcyBvciBzeW50YXggcmVzdHJpY3Rpb25zLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdDb2RlIGNvbXBpbGVkIGJ5IGNhbGxzIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImV4ZWMoKSIgYW5kXG4nCisgICAgICAgICAgICciY29tcGlsZSgpIiB0aGF0IG9jY3VyIGluIGEgbW9kdWxlICJNIiBjb250YWluaW5nIGEgZnV0dXJlICcKKyAgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICAnd2lsbCwgYnkgZGVmYXVsdCwgdXNlIHRoZSBuZXcgc3ludGF4IG9yIHNlbWFudGljcyBhc3NvY2lhdGVkIHdpdGggJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdmdXR1cmUgc3RhdGVtZW50LiAgVGhpcyBjYW4gYmUgY29udHJvbGxlZCBieSBvcHRpb25hbCBhcmd1bWVudHMgJworICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgJyJjb21waWxlKCkiIC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiBmb3IgJworICAgICAgICAgICAnZGV0YWlscy5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSBmdXR1cmUgc3RhdGVtZW50IHR5cGVkIGF0IGFuIGludGVyYWN0aXZlIGludGVycHJldGVyIHByb21wdCAnCisgICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgICd0YWtlIGVmZmVjdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGludGVycHJldGVyIHNlc3Npb24uICBJZiBhblxuJworICAgICAgICAgICAnaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZCB3aXRoIHRoZSAiLWkiIG9wdGlvbiwgaXMgcGFzc2VkIGEgc2NyaXB0ICcKKyAgICAgICAgICAgJ25hbWVcbicKKyAgICAgICAgICAgJ3RvIGV4ZWN1dGUsIGFuZCB0aGUgc2NyaXB0IGluY2x1ZGVzIGEgZnV0dXJlIHN0YXRlbWVudCwgaXQgd2lsbCBiZSAnCisgICAgICAgICAgICdpblxuJworICAgICAgICAgICAnZWZmZWN0IGluIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uIHN0YXJ0ZWQgYWZ0ZXIgdGhlIHNjcmlwdCBpc1xuJworICAgICAgICAgICAnZXhlY3V0ZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICoqUEVQIDIzNioqIC0gQmFjayB0byB0aGUgX19mdXR1cmVfX1xuJworICAgICAgICAgICAnICAgICBUaGUgb3JpZ2luYWwgcHJvcG9zYWwgZm9yIHRoZSBfX2Z1dHVyZV9fIG1lY2hhbmlzbS5cbicsCisgJ2luJzogJ1xuJworICAgICAgICdNZW1iZXJzaGlwIHRlc3Qgb3BlcmF0aW9uc1xuJworICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICdcbicKKyAgICAgICAnVGhlIG9wZXJhdG9ycyAiaW4iIGFuZCAibm90IGluIiB0ZXN0IGZvciBtZW1iZXJzaGlwLiAgInggaW4gcyJcbicKKyAgICAgICAnZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mICpzKiwgYW5kIGZhbHNlIG90aGVyd2lzZS4gICJ4XG4nCisgICAgICAgJ25vdCBpbiBzIiByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiAieCBpbiBzIi4gIEFsbCBidWlsdC1pbiBzZXF1ZW5jZXNcbicKKyAgICAgICAnYW5kIHNldCB0eXBlcyBzdXBwb3J0IHRoaXMgYXMgd2VsbCBhcyBkaWN0aW9uYXJ5LCBmb3Igd2hpY2ggImluIiAnCisgICAgICAgJ3Rlc3RzXG4nCisgICAgICAgJ3doZXRoZXIgdGhlIGRpY3Rpb25hcnkgaGFzIGEgZ2l2ZW4ga2V5LiBGb3IgY29udGFpbmVyIHR5cGVzIHN1Y2ggYXNcbicKKyAgICAgICAnbGlzdCwgdHVwbGUsIHNldCwgZnJvemVuc2V0LCBkaWN0LCBvciBjb2xsZWN0aW9ucy5kZXF1ZSwgdGhlXG4nCisgICAgICAgJ2V4cHJlc3Npb24gInggaW4geSIgaXMgZXF1aXZhbGVudCB0byAiYW55KHggaXMgZSBvciB4ID09IGUgZm9yIGUgaW5cbicKKyAgICAgICAneSkiLlxuJworICAgICAgICdcbicKKyAgICAgICAnRm9yIHRoZSBzdHJpbmcgYW5kIGJ5dGVzIHR5cGVzLCAieCBpbiB5IiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiAnCisgICAgICAgJ2lzXG4nCisgICAgICAgJ2Egc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyAieS5maW5kKHgpICE9IC0xIi4gIEVtcHR5XG4nCisgICAgICAgJ3N0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsXG4nCisgICAgICAgJ3NvICIiIiBpbiAiYWJjIiIgd2lsbCByZXR1cm4gIlRydWUiLlxuJworICAgICAgICdcbicKKyAgICAgICAnRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgIl9fY29udGFpbnNfXygpIiBtZXRob2QsICJ4XG4nCisgICAgICAgJ2luIHkiIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgInkuX19jb250YWluc19fKHgpIiBpcyB0cnVlLlxuJworICAgICAgICdcbicKKyAgICAgICAnRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgIl9fY29udGFpbnNfXygpIiBidXQgZG9cbicKKyAgICAgICAnZGVmaW5lICJfX2l0ZXJfXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlICJ6IiB3aXRoICJ4ID09IHoiXG4nCisgICAgICAgJ2lzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyICJ5Ii4gIElmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWRcbicKKyAgICAgICAnZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmICJpbiIgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuJworICAgICAgICdcbicKKyAgICAgICAnTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzXG4nCisgICAgICAgJyJfX2dldGl0ZW1fXygpIiwgInggaW4geSIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbicKKyAgICAgICAnbmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0ICJ4ID09IHlbaV0iLCBhbmQgYWxsIGxvd2VyXG4nCisgICAgICAgJ2ludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgIkluZGV4RXJyb3IiIGV4Y2VwdGlvbi4gIChJZiBhbnkgb3RoZXJcbicKKyAgICAgICAnZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgImluIiByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuJworICAgICAgICdcbicKKyAgICAgICAnVGhlIG9wZXJhdG9yICJub3QgaW4iIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG4nCisgICAgICAgJyJpbiIuXG4nLAorICdpbnRlZ2Vycyc6ICdcbicKKyAgICAgICAgICAgICAnSW50ZWdlciBsaXRlcmFsc1xuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsICcKKyAgICAgICAgICAgICAnZGVmaW5pdGlvbnM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBpbnRlZ2VyICAgICAgICA6Oj0gZGVjaW1hbGludGVnZXIgfCBvY3RpbnRlZ2VyIHwgaGV4aW50ZWdlciB8ICcKKyAgICAgICAgICAgICAnYmluaW50ZWdlclxuJworICAgICAgICAgICAgICcgICBkZWNpbWFsaW50ZWdlciA6Oj0gbm9uemVyb2RpZ2l0IGRpZ2l0KiB8ICIwIitcbicKKyAgICAgICAgICAgICAnICAgbm9uemVyb2RpZ2l0ICAgOjo9ICIxIi4uLiI5IlxuJworICAgICAgICAgICAgICcgICBkaWdpdCAgICAgICAgICA6Oj0gIjAiLi4uIjkiXG4nCisgICAgICAgICAgICAgJyAgIG9jdGludGVnZXIgICAgIDo6PSAiMCIgKCJvIiB8ICJPIikgb2N0ZGlnaXQrXG4nCisgICAgICAgICAgICAgJyAgIGhleGludGVnZXIgICAgIDo6PSAiMCIgKCJ4IiB8ICJYIikgaGV4ZGlnaXQrXG4nCisgICAgICAgICAgICAgJyAgIGJpbmludGVnZXIgICAgIDo6PSAiMCIgKCJiIiB8ICJCIikgYmluZGlnaXQrXG4nCisgICAgICAgICAgICAgJyAgIG9jdGRpZ2l0ICAgICAgIDo6PSAiMCIuLi4iNyJcbicKKyAgICAgICAgICAgICAnICAgaGV4ZGlnaXQgICAgICAgOjo9IGRpZ2l0IHwgImEiLi4uImYiIHwgIkEiLi4uIkYiXG4nCisgICAgICAgICAgICAgJyAgIGJpbmRpZ2l0ICAgICAgIDo6PSAiMCIgfCAiMSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbGVuZ3RoIG9mIGludGVnZXIgbGl0ZXJhbHMgYXBhcnQgZnJvbSAnCisgICAgICAgICAgICAgJ3doYXRcbicKKyAgICAgICAgICAgICAnY2FuIGJlIHN0b3JlZCBpbiBhdmFpbGFibGUgbWVtb3J5LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZSB0aGF0IGxlYWRpbmcgemVyb3MgaW4gYSBub24temVybyBkZWNpbWFsIG51bWJlciBhcmUgbm90ICcKKyAgICAgICAgICAgICAnYWxsb3dlZC5cbicKKyAgICAgICAgICAgICAnVGhpcyBpcyBmb3IgZGlzYW1iaWd1YXRpb24gd2l0aCBDLXN0eWxlIG9jdGFsIGxpdGVyYWxzLCB3aGljaCAnCisgICAgICAgICAgICAgJ1B5dGhvblxuJworICAgICAgICAgICAgICd1c2VkIGJlZm9yZSB2ZXJzaW9uIDMuMC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NvbWUgZXhhbXBsZXMgb2YgaW50ZWdlciBsaXRlcmFsczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIDcgICAgIDIxNDc0ODM2NDcgICAgICAgICAgICAgICAgICAgICAgICAwbzE3NyAgICAwYjEwMDExMDExMVxuJworICAgICAgICAgICAgICcgICAzICAgICA3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNiAgICAgMG8zNzcgICAgMHhkZWFkYmVlZlxuJywKKyAnbGFtYmRhJzogJ1xuJworICAgICAgICAgICAnTGFtYmRhc1xuJworICAgICAgICAgICAnKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBsYW1iZGFfZXhwciAgICAgICAgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgJyAgIGxhbWJkYV9leHByX25vY29uZCA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogJworICAgICAgICAgICAnZXhwcmVzc2lvbl9ub2NvbmRcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnTGFtYmRhIGV4cHJlc3Npb25zIChzb21ldGltZXMgY2FsbGVkIGxhbWJkYSBmb3JtcykgYXJlIHVzZWQgdG8gJworICAgICAgICAgICAnY3JlYXRlXG4nCisgICAgICAgICAgICdhbm9ueW1vdXMgZnVuY3Rpb25zLiBUaGUgZXhwcmVzc2lvbiAibGFtYmRhIGFyZ3VtZW50czogJworICAgICAgICAgICAnZXhwcmVzc2lvbiJcbicKKyAgICAgICAgICAgJ3lpZWxkcyBhIGZ1bmN0aW9uIG9iamVjdC4gIFRoZSB1bm5hbWVkIG9iamVjdCBiZWhhdmVzIGxpa2UgYSAnCisgICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICAnb2JqZWN0IGRlZmluZWQgd2l0aFxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBkZWYgPGxhbWJkYT4oYXJndW1lbnRzKTpcbicKKyAgICAgICAgICAgJyAgICAgICByZXR1cm4gZXhwcmVzc2lvblxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdTZWUgc2VjdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9ucyBmb3IgdGhlIHN5bnRheCBvZiBwYXJhbWV0ZXIgJworICAgICAgICAgICAnbGlzdHMuXG4nCisgICAgICAgICAgICdOb3RlIHRoYXQgZnVuY3Rpb25zIGNyZWF0ZWQgd2l0aCBsYW1iZGEgZXhwcmVzc2lvbnMgY2Fubm90ICcKKyAgICAgICAgICAgJ2NvbnRhaW5cbicKKyAgICAgICAgICAgJ3N0YXRlbWVudHMgb3IgYW5ub3RhdGlvbnMuXG4nLAorICdsaXN0cyc6ICdcbicKKyAgICAgICAgICAnTGlzdCBkaXNwbGF5c1xuJworICAgICAgICAgICcqKioqKioqKioqKioqXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBIGxpc3QgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBleHByZXNzaW9ucyBlbmNsb3NlZCAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJ3NxdWFyZSBicmFja2V0czpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIGxpc3RfZGlzcGxheSA6Oj0gIlsiIFtzdGFycmVkX2xpc3QgfCBjb21wcmVoZW5zaW9uXSAiXSJcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgbGlzdCBkaXNwbGF5IHlpZWxkcyBhIG5ldyBsaXN0IG9iamVjdCwgdGhlIGNvbnRlbnRzIGJlaW5nICcKKyAgICAgICAgICAnc3BlY2lmaWVkXG4nCisgICAgICAgICAgJ2J5IGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBjb21wcmVoZW5zaW9uLiAgV2hlbiBhIGNvbW1hLVxuJworICAgICAgICAgICdzZXBhcmF0ZWQgbGlzdCBvZiBleHByZXNzaW9ucyBpcyBzdXBwbGllZCwgaXRzIGVsZW1lbnRzIGFyZSAnCisgICAgICAgICAgJ2V2YWx1YXRlZFxuJworICAgICAgICAgICdmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHBsYWNlZCBpbnRvIHRoZSBsaXN0IG9iamVjdCBpbiB0aGF0IG9yZGVyLlxuJworICAgICAgICAgICdXaGVuIGEgY29tcHJlaGVuc2lvbiBpcyBzdXBwbGllZCwgdGhlIGxpc3QgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGVcbicKKyAgICAgICAgICAnZWxlbWVudHMgcmVzdWx0aW5nIGZyb20gdGhlIGNvbXByZWhlbnNpb24uXG4nLAorICduYW1pbmcnOiAnXG4nCisgICAgICAgICAgICdOYW1pbmcgYW5kIGJpbmRpbmdcbicKKyAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0JpbmRpbmcgb2YgbmFtZXNcbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nXG4nCisgICAgICAgICAgICdvcGVyYXRpb25zLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gJworICAgICAgICAgICAnZnVuY3Rpb25zLFxuJworICAgICAgICAgICAnImltcG9ydCIgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZSBpbiB0aGUgZGVmaW5pbmcgYmxvY2spLCBhbmQgdGFyZ2V0cyB0aGF0ICcKKyAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAnaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQsICJmb3IiIGxvb3AgaGVhZGVyLCBvciAnCisgICAgICAgICAgICdhZnRlclxuJworICAgICAgICAgICAnImFzIiBpbiBhICJ3aXRoIiBzdGF0ZW1lbnQgb3IgImV4Y2VwdCIgY2xhdXNlLiBUaGUgImltcG9ydCIgJworICAgICAgICAgICAnc3RhdGVtZW50XG4nCisgICAgICAgICAgICdvZiB0aGUgZm9ybSAiZnJvbSAuLi4gaW1wb3J0ICoiIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZVxuJworICAgICAgICAgICAnaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHQgdGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgJworICAgICAgICAgICAnZm9ybVxuJworICAgICAgICAgICAnbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGUgbW9kdWxlIGxldmVsLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdBIHRhcmdldCBvY2N1cnJpbmcgaW4gYSAiZGVsIiBzdGF0ZW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIGJvdW5kICcKKyAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAndGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgJworICAgICAgICAgICAnbmFtZSkuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0VhY2ggYXNzaWdubWVudCBvciBpbXBvcnQgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jayBkZWZpbmVkICcKKyAgICAgICAgICAgJ2J5IGFcbicKKyAgICAgICAgICAgJ2NsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlICcKKyAgICAgICAgICAgJ3RvcC1sZXZlbFxuJworICAgICAgICAgICAnY29kZSBibG9jaykuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgJworICAgICAgICAgICAnYmxvY2ssXG4nCisgICAgICAgICAgICd1bmxlc3MgZGVjbGFyZWQgYXMgIm5vbmxvY2FsIiBvciAiZ2xvYmFsIi4gIElmIGEgbmFtZSBpcyBib3VuZCBhdCAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ21vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlIHZhcmlhYmxlcyBvZiB0aGUgJworICAgICAgICAgICAnbW9kdWxlXG4nCisgICAgICAgICAgICdjb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGEgdmFyaWFibGUgaXMgdXNlZCBpbiBhICcKKyAgICAgICAgICAgJ2NvZGVcbicKKyAgICAgICAgICAgJ2Jsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZSB2YXJpYWJsZSouXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0VhY2ggb2NjdXJyZW5jZSBvZiBhIG5hbWUgaW4gdGhlIHByb2dyYW0gdGV4dCByZWZlcnMgdG8gdGhlICcKKyAgICAgICAgICAgJypiaW5kaW5nKlxuJworICAgICAgICAgICAnb2YgdGhhdCBuYW1lIGVzdGFibGlzaGVkIGJ5IHRoZSBmb2xsb3dpbmcgbmFtZSByZXNvbHV0aW9uIHJ1bGVzLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1Jlc29sdXRpb24gb2YgbmFtZXNcbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQSAqc2NvcGUqIGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhIGJsb2NrLiAgSWYgYSAnCisgICAgICAgICAgICdsb2NhbFxuJworICAgICAgICAgICAndmFyaWFibGUgaXMgZGVmaW5lZCBpbiBhIGJsb2NrLCBpdHMgc2NvcGUgaW5jbHVkZXMgdGhhdCBibG9jay4gIElmICcKKyAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAnZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55ICcKKyAgICAgICAgICAgJ2Jsb2Nrc1xuJworICAgICAgICAgICAnY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYSBjb250YWluZWQgYmxvY2sgJworICAgICAgICAgICAnaW50cm9kdWNlc1xuJworICAgICAgICAgICAnYSBkaWZmZXJlbnQgYmluZGluZyBmb3IgdGhlIG5hbWUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1doZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgJworICAgICAgICAgICAnbmVhcmVzdFxuJworICAgICAgICAgICAnZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgJworICAgICAgICAgICAnYmxvY2tcbicKKyAgICAgICAgICAgImlzIGNhbGxlZCB0aGUgYmxvY2sncyAqZW52aXJvbm1lbnQqLlxuIgorICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdXaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhICJOYW1lRXJyb3IiIGV4Y2VwdGlvbiBpcyAnCisgICAgICAgICAgICdyYWlzZWQuIElmXG4nCisgICAgICAgICAgICd0aGUgY3VycmVudCBzY29wZSBpcyBhIGZ1bmN0aW9uIHNjb3BlLCBhbmQgdGhlIG5hbWUgcmVmZXJzIHRvIGEgJworICAgICAgICAgICAnbG9jYWxcbicKKyAgICAgICAgICAgJ3ZhcmlhYmxlIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBib3VuZCB0byBhIHZhbHVlIGF0IHRoZSBwb2ludCB3aGVyZSAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ25hbWUgaXMgdXNlZCwgYW4gIlVuYm91bmRMb2NhbEVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuJworICAgICAgICAgICAnIlVuYm91bmRMb2NhbEVycm9yIiBpcyBhIHN1YmNsYXNzIG9mICJOYW1lRXJyb3IiLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssICcKKyAgICAgICAgICAgJ2FsbFxuJworICAgICAgICAgICAndXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdjdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gJworICAgICAgICAgICAnYVxuJworICAgICAgICAgICAnYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiAgVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuJworICAgICAgICAgICAnZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbicKKyAgICAgICAgICAgJ3dpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbicKKyAgICAgICAgICAgJ2RldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSAnCisgICAgICAgICAgICdiaW5kaW5nXG4nCisgICAgICAgICAgICdvcGVyYXRpb25zLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJZiB0aGUgImdsb2JhbCIgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlICcKKyAgICAgICAgICAgJ25hbWVcbicKKyAgICAgICAgICAgJ3NwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiAnCisgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgJ3RvcC1sZXZlbCBuYW1lc3BhY2UuICBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCAnCisgICAgICAgICAgICduYW1lc3BhY2UgYnlcbicKKyAgICAgICAgICAgJ3NlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbicKKyAgICAgICAgICAgJ2NvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgJworICAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgICdvZiB0aGUgbW9kdWxlICJidWlsdGlucyIuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZCAnCisgICAgICAgICAgICdmaXJzdC4gIElmXG4nCisgICAgICAgICAgICd0aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXMgc2VhcmNoZWQuICAnCisgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgJyJnbG9iYWwiIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ1RoZSAiZ2xvYmFsIiBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nICcKKyAgICAgICAgICAgJ29wZXJhdGlvblxuJworICAgICAgICAgICAnaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGEgZnJlZSAnCisgICAgICAgICAgICd2YXJpYWJsZVxuJworICAgICAgICAgICAnY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpcyB0cmVhdGVkIGFzIGEgJworICAgICAgICAgICAnZ2xvYmFsLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgIm5vbmxvY2FsIiBzdGF0ZW1lbnQgY2F1c2VzIGNvcnJlc3BvbmRpbmcgbmFtZXMgdG8gcmVmZXIgdG9cbicKKyAgICAgICAgICAgJ3ByZXZpb3VzbHkgYm91bmQgdmFyaWFibGVzIGluIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBmdW5jdGlvbiAnCisgICAgICAgICAgICdzY29wZS5cbicKKyAgICAgICAgICAgJyJTeW50YXhFcnJvciIgaXMgcmFpc2VkIGF0IGNvbXBpbGUgdGltZSBpZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzICcKKyAgICAgICAgICAgJ25vdFxuJworICAgICAgICAgICAnZXhpc3QgaW4gYW55IGVuY2xvc2luZyBmdW5jdGlvbiBzY29wZS5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lICcKKyAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgJ21vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzICcKKyAgICAgICAgICAgJ2NhbGxlZFxuJworICAgICAgICAgICAnIl9fbWFpbl9fIi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnQ2xhc3MgZGVmaW5pdGlvbiBibG9ja3MgYW5kIGFyZ3VtZW50cyB0byAiZXhlYygpIiBhbmQgImV2YWwoKSIgJworICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICdzcGVjaWFsIGluIHRoZSBjb250ZXh0IG9mIG5hbWUgcmVzb2x1dGlvbi4gQSBjbGFzcyBkZWZpbml0aW9uIGlzICcKKyAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICdleGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZSBuYW1lcy4gVGhlc2UgJworICAgICAgICAgICAncmVmZXJlbmNlc1xuJworICAgICAgICAgICAnZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbiB3aXRoIGFuIGV4Y2VwdGlvbiAnCisgICAgICAgICAgICd0aGF0XG4nCisgICAgICAgICAgICd1bmJvdW5kIGxvY2FsIHZhcmlhYmxlcyBhcmUgbG9va2VkIHVwIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiAnCisgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgJ25hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAnCisgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAndGhlIGNsYXNzLiBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhIGNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgJworICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgJ3RoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZSBjb2RlIGJsb2NrcyBvZiBtZXRob2RzICcKKyAgICAgICAgICAgJy0tXG4nCisgICAgICAgICAgICd0aGlzIGluY2x1ZGVzIGNvbXByZWhlbnNpb25zIGFuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2UgdGhleSAnCisgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgJ2ltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlICcKKyAgICAgICAgICAgJ2ZvbGxvd2luZ1xuJworICAgICAgICAgICAnd2lsbCBmYWlsOlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICBjbGFzcyBBOlxuJworICAgICAgICAgICAnICAgICAgIGEgPSA0MlxuJworICAgICAgICAgICAnICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdCdWlsdGlucyBhbmQgcmVzdHJpY3RlZCBleGVjdXRpb25cbicKKyAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSAnCisgICAgICAgICAgICdibG9ja1xuJworICAgICAgICAgICAnaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSAiX19idWlsdGluc19fIiBpbiBpdHMgJworICAgICAgICAgICAnZ2xvYmFsXG4nCisgICAgICAgICAgICduYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlIGxhdHRlciAnCisgICAgICAgICAgICdjYXNlXG4nCisgICAgICAgICAgICJ0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlICIKKyAgICAgICAgICAgJyJfX21haW5fXyJcbicKKyAgICAgICAgICAgJ21vZHVsZSwgIl9fYnVpbHRpbnNfXyIgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZSAiYnVpbHRpbnMiOyB3aGVuIGluICcKKyAgICAgICAgICAgJ2FueVxuJworICAgICAgICAgICAnb3RoZXIgbW9kdWxlLCAiX19idWlsdGluc19fIiBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICciYnVpbHRpbnMiIG1vZHVsZSBpdHNlbGYuICAiX19idWlsdGluc19fIiBjYW4gYmUgc2V0IHRvIGEgJworICAgICAgICAgICAndXNlci1jcmVhdGVkXG4nCisgICAgICAgICAgICdkaWN0aW9uYXJ5IHRvIGNyZWF0ZSBhIHdlYWsgZm9ybSBvZiByZXN0cmljdGVkIGV4ZWN1dGlvbi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoXG4nCisgICAgICAgICAgICciX19idWlsdGluc19fIjsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnNcbicKKyAgICAgICAgICAgJ3dhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkICcKKyAgICAgICAgICAgJyJpbXBvcnQiXG4nCisgICAgICAgICAgICd0aGUgImJ1aWx0aW5zIiBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlcyBhcHByb3ByaWF0ZWx5LlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0ludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuJworICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ05hbWUgcmVzb2x1dGlvbiBvZiBmcmVlIHZhcmlhYmxlcyBvY2N1cnMgYXQgcnVudGltZSwgbm90IGF0ICcKKyAgICAgICAgICAgJ2NvbXBpbGVcbicKKyAgICAgICAgICAgJ3RpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCBwcmludCA0MjpcbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnICAgaSA9IDEwXG4nCisgICAgICAgICAgICcgICBkZWYgZigpOlxuJworICAgICAgICAgICAnICAgICAgIHByaW50KGkpXG4nCisgICAgICAgICAgICcgICBpID0gNDJcbicKKyAgICAgICAgICAgJyAgIGYoKVxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuICcKKyAgICAgICAgICAgJ3VzZWRcbicKKyAgICAgICAgICAgJ2luIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJ0lmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgJworICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgJ2RlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdUaGUgImV2YWwoKSIgYW5kICJleGVjKCkiIGZ1bmN0aW9ucyBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlICcKKyAgICAgICAgICAgJ2Z1bGxcbicKKyAgICAgICAgICAgJ2Vudmlyb25tZW50IGZvciByZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlICcKKyAgICAgICAgICAgJ2xvY2FsXG4nCisgICAgICAgICAgICdhbmQgZ2xvYmFsIG5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgJworICAgICAgICAgICAncmVzb2x2ZWRcbicKKyAgICAgICAgICAgJ2luIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gICcKKyAgICAgICAgICAgJ1sxXVxuJworICAgICAgICAgICAnVGhlICJleGVjKCkiIGFuZCAiZXZhbCgpIiBmdW5jdGlvbnMgaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG9cbicKKyAgICAgICAgICAgJ292ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS4gIElmIG9ubHkgb25lIG5hbWVzcGFjZSAnCisgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAnc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKKyAnbm9ubG9jYWwnOiAnXG4nCisgICAgICAgICAgICAgJ1RoZSAibm9ubG9jYWwiIHN0YXRlbWVudFxuJworICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIG5vbmxvY2FsX3N0bXQgOjo9ICJub25sb2NhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnVGhlICJub25sb2NhbCIgc3RhdGVtZW50IGNhdXNlcyB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIHRvIHJlZmVyICcKKyAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAncHJldmlvdXNseSBib3VuZCB2YXJpYWJsZXMgaW4gdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlICcKKyAgICAgICAgICAgICAnZXhjbHVkaW5nXG4nCisgICAgICAgICAgICAgJ2dsb2JhbHMuIFRoaXMgaXMgaW1wb3J0YW50IGJlY2F1c2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yICcKKyAgICAgICAgICAgICAnYmluZGluZyBpc1xuJworICAgICAgICAgICAgICd0byBzZWFyY2ggdGhlIGxvY2FsIG5hbWVzcGFjZSBmaXJzdC4gIFRoZSBzdGF0ZW1lbnQgYWxsb3dzXG4nCisgICAgICAgICAgICAgJ2VuY2Fwc3VsYXRlZCBjb2RlIHRvIHJlYmluZCB2YXJpYWJsZXMgb3V0c2lkZSBvZiB0aGUgbG9jYWwgJworICAgICAgICAgICAgICdzY29wZVxuJworICAgICAgICAgICAgICdiZXNpZGVzIHRoZSBnbG9iYWwgKG1vZHVsZSkgc2NvcGUuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOYW1lcyBsaXN0ZWQgaW4gYSAibm9ubG9jYWwiIHN0YXRlbWVudCwgdW5saWtlIHRob3NlIGxpc3RlZCBpbiAnCisgICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICAnImdsb2JhbCIgc3RhdGVtZW50LCBtdXN0IHJlZmVyIHRvIHByZS1leGlzdGluZyBiaW5kaW5ncyBpbiBhblxuJworICAgICAgICAgICAgICdlbmNsb3Npbmcgc2NvcGUgKHRoZSBzY29wZSBpbiB3aGljaCBhIG5ldyBiaW5kaW5nIHNob3VsZCBiZSAnCisgICAgICAgICAgICAgJ2NyZWF0ZWRcbicKKyAgICAgICAgICAgICAnY2Fubm90IGJlIGRldGVybWluZWQgdW5hbWJpZ3VvdXNseSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOYW1lcyBsaXN0ZWQgaW4gYSAibm9ubG9jYWwiIHN0YXRlbWVudCBtdXN0IG5vdCBjb2xsaWRlIHdpdGggJworICAgICAgICAgICAgICdwcmUtXG4nCisgICAgICAgICAgICAgJ2V4aXN0aW5nIGJpbmRpbmdzIGluIHRoZSBsb2NhbCBzY29wZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAqKlBFUCAzMTA0KiogLSBBY2Nlc3MgdG8gTmFtZXMgaW4gT3V0ZXIgU2NvcGVzXG4nCisgICAgICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24gZm9yIHRoZSAibm9ubG9jYWwiIHN0YXRlbWVudC5cbicsCisgJ251bWJlcnMnOiAnXG4nCisgICAgICAgICAgICAnTnVtZXJpYyBsaXRlcmFsc1xuJworICAgICAgICAgICAgJyoqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogaW50ZWdlcnMsIGZsb2F0aW5nICcKKyAgICAgICAgICAgICdwb2ludFxuJworICAgICAgICAgICAgJ251bWJlcnMsIGFuZCBpbWFnaW5hcnkgbnVtYmVycy4gIFRoZXJlIGFyZSBubyBjb21wbGV4IGxpdGVyYWxzXG4nCisgICAgICAgICAgICAnKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWwgbnVtYmVyIGFuZCBhblxuJworICAgICAgICAgICAgJ2ltYWdpbmFyeSBudW1iZXIpLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ05vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSAnCisgICAgICAgICAgICAnIi0xIlxuJworICAgICAgICAgICAgJ2lzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yIFwnIi0iXCcgJworICAgICAgICAgICAgJ2FuZCB0aGVcbicKKyAgICAgICAgICAgICdsaXRlcmFsICIxIi5cbicsCisgJ251bWVyaWMtdHlwZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAnRW11bGF0aW5nIG51bWVyaWMgdHlwZXNcbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBlbXVsYXRlIG51bWVyaWMgJworICAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAnTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAnCisgICAgICAgICAgICAgICAgICAnYnkgdGhlXG4nCisgICAgICAgICAgICAgICAgICAncGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSAnCisgICAgICAgICAgICAgICAgICAnb3BlcmF0aW9ucyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICdub24taW50ZWdyYWwgbnVtYmVycykgc2hvdWxkIGJlIGxlZnQgdW5kZWZpbmVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3N1Yl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Bvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19hbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSAnCisgICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICcKKyAgICAgICAgICAgICAgICAgICciZGl2bW9kKCkiLFxuJworICAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIsICIqKiIsICI8PCIsICI+PiIsICImIiwgIl4iLCAifCIpLiAgRm9yICcKKyAgICAgICAgICAgICAgICAgICdpbnN0YW5jZSwgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gJworICAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIG9mIGFcbicKKyAgICAgICAgICAgICAgICAgICcgICBjbGFzcyB0aGF0IGhhcyBhbiAiX19hZGRfXygpIiBtZXRob2QsICJ4Ll9fYWRkX18oeSkiIGlzICcKKyAgICAgICAgICAgICAgICAgICdjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlICJfX2Rpdm1vZF9fKCkiIG1ldGhvZCBzaG91bGQgYmUgdGhlIGVxdWl2YWxlbnQgdG8gJworICAgICAgICAgICAgICAgICAgJ3VzaW5nXG4nCisgICAgICAgICAgICAgICAgICAnICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgJworICAgICAgICAgICAgICAgICAgJ3JlbGF0ZWQgdG9cbicKKyAgICAgICAgICAgICAgICAgICcgICAiX190cnVlZGl2X18oKSIuICBOb3RlIHRoYXQgIl9fcG93X18oKSIgc2hvdWxkIGJlICcKKyAgICAgICAgICAgICAgICAgICdkZWZpbmVkIHRvIGFjY2VwdFxuJworICAgICAgICAgICAgICAgICAgJyAgIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICdidWlsdC1pblxuJworICAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gIk5vdEltcGxlbWVudGVkIi5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5ICcKKyAgICAgICAgICAgICAgICAgICdhcml0aG1ldGljXG4nCisgICAgICAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyAoIisiLCAiLSIsICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiwgJworICAgICAgICAgICAgICAgICAgJyJkaXZtb2QoKSIsXG4nCisgICAgICAgICAgICAgICAgICAnICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8Iikgd2l0aCByZWZsZWN0ZWQgJworICAgICAgICAgICAgICAgICAgJyhzd2FwcGVkKVxuJworICAgICAgICAgICAgICAgICAgJyAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCAnCisgICAgICAgICAgICAgICAgICAnb3BlcmFuZCBkb2VzXG4nCisgICAgICAgICAgICAgICAgICAnICAgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUgb3BlcmFuZHMgJworICAgICAgICAgICAgICAgICAgJ2FyZSBvZlxuJworICAgICAgICAgICAgICAgICAgJyAgIGRpZmZlcmVudCB0eXBlcy4gWzJdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlICcKKyAgICAgICAgICAgICAgICAgICdleHByZXNzaW9uICJ4IC1cbicKKyAgICAgICAgICAgICAgICAgICcgICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gJworICAgICAgICAgICAgICAgICAgJyJfX3JzdWJfXygpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgInkuX19yc3ViX18oeCkiIGlzIGNhbGxlZCBpZiAieC5fX3N1Yl9fKHkpIiAnCisgICAgICAgICAgICAgICAgICAncmV0dXJuc1xuJworICAgICAgICAgICAgICAgICAgJyAgICpOb3RJbXBsZW1lbnRlZCouXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAnCisgICAgICAgICAgICAgICAgICAnIl9fcnBvd19fKCkiICh0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICIgICBOb3RlOiBJZiB0aGUgcmlnaHQgb3BlcmFuZCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgJ2xlZnRcbicKKyAgICAgICAgICAgICAgICAgICIgICAgIG9wZXJhbmQncyB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSAiCisgICAgICAgICAgICAgICAgICAncmVmbGVjdGVkIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgZm9yIHRoZSBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSAnCisgICAgICAgICAgICAgICAgICAndGhlIGxlZnRcbicKKyAgICAgICAgICAgICAgICAgICIgICAgIG9wZXJhbmQncyBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzICIKKyAgICAgICAgICAgICAgICAgICdzdWJjbGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICAiICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnMnIG9wZXJhdGlvbnMuXG4iCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW1hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCAnCisgICAgICAgICAgICAgICAgICAnYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnRzICgiKz0iLCAiLT0iLCAiKj0iLCAiQD0iLCAiLz0iLCAiLy89IiwgIiU9IiwgJworICAgICAgICAgICAgICAgICAgJyIqKj0iLFxuJworICAgICAgICAgICAgICAgICAgJyAgICI8PD0iLCAiPj49IiwgIiY9IiwgIl49IiwgInw9IikuICBUaGVzZSBtZXRob2RzIHNob3VsZCAnCisgICAgICAgICAgICAgICAgICAnYXR0ZW1wdCB0b1xuJworICAgICAgICAgICAgICAgICAgJyAgIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZCByZXR1cm4gJworICAgICAgICAgICAgICAgICAgJ3RoZSByZXN1bHRcbicKKyAgICAgICAgICAgICAgICAgICcgICAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCAqc2VsZiopLiAgSWYgYSAnCisgICAgICAgICAgICAgICAgICAnc3BlY2lmaWNcbicKKyAgICAgICAgICAgICAgICAgICcgICBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWQgYXNzaWdubWVudCBmYWxscyAnCisgICAgICAgICAgICAgICAgICAnYmFjayB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgICcgICBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgaWYgKngqIGlzIGFuIGluc3RhbmNlIG9mICcKKyAgICAgICAgICAgICAgICAgICdhIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICAnICAgd2l0aCBhbiAiX19pYWRkX18oKSIgbWV0aG9kLCAieCArPSB5IiBpcyBlcXVpdmFsZW50IHRvICcKKyAgICAgICAgICAgICAgICAgICcieCA9XG4nCisgICAgICAgICAgICAgICAgICAnICAgeC5fX2lhZGRfXyh5KSIgLiBPdGhlcndpc2UsICJ4Ll9fYWRkX18oeSkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAnInkuX19yYWRkX18oeCkiIGFyZVxuJworICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgInggKyB5Ii4gSW4gJworICAgICAgICAgICAgICAgICAgJ2NlcnRhaW5cbicKKyAgICAgICAgICAgICAgICAgICcgICBzaXR1YXRpb25zLCBhdWdtZW50ZWQgYXNzaWdubWVudCBjYW4gcmVzdWx0IGluICcKKyAgICAgICAgICAgICAgICAgICd1bmV4cGVjdGVkIGVycm9yc1xuJworICAgICAgICAgICAgICAgICAgIiAgIChzZWUgV2h5IGRvZXMgYV90dXBsZVtpXSArPSBbJ2l0ZW0nXSByYWlzZSBhbiBleGNlcHRpb24gIgorICAgICAgICAgICAgICAgICAgJ3doZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAnICAgYWRkaXRpb24gd29ya3M/KSwgYnV0IHRoaXMgYmVoYXZpb3IgaXMgaW4gZmFjdCBwYXJ0IG9mICcKKyAgICAgICAgICAgICAgICAgICd0aGUgZGF0YVxuJworICAgICAgICAgICAgICAgICAgJyAgIG1vZGVsLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX25lZ19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcG9zX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19hYnNfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ludmVydF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgdW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zICcKKyAgICAgICAgICAgICAgICAgICcoIi0iLCAiKyIsXG4nCisgICAgICAgICAgICAgICAgICAnICAgImFicygpIiBhbmQgIn4iKS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19jb21wbGV4X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Zsb2F0X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdvYmplY3QuX19yb3VuZF9fKHNlbGZbLCBuXSlcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgImNvbXBsZXgoKSIsICcKKyAgICAgICAgICAgICAgICAgICciaW50KCkiLFxuJworICAgICAgICAgICAgICAgICAgJyAgICJmbG9hdCgpIiBhbmQgInJvdW5kKCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVcbicKKyAgICAgICAgICAgICAgICAgICcgICB0eXBlLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2luZGV4X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyICcKKyAgICAgICAgICAgICAgICAgICdQeXRob24gbmVlZHNcbicKKyAgICAgICAgICAgICAgICAgICcgICB0byBsb3NzbGVzc2x5IGNvbnZlcnQgdGhlIG51bWVyaWMgb2JqZWN0IHRvIGFuIGludGVnZXIgJworICAgICAgICAgICAgICAgICAgJ29iamVjdCAoc3VjaFxuJworICAgICAgICAgICAgICAgICAgJyAgIGFzIGluIHNsaWNpbmcsIG9yIGluIHRoZSBidWlsdC1pbiAiYmluKCkiLCAiaGV4KCkiIGFuZCAnCisgICAgICAgICAgICAgICAgICAnIm9jdCgpIlxuJworICAgICAgICAgICAgICAgICAgJyAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgICAgICAnbnVtZXJpY1xuJworICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdCBpcyBhbiBpbnRlZ2VyIHR5cGUuICBNdXN0IHJldHVybiBhbiBpbnRlZ2VyLlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IEluIG9yZGVyIHRvIGhhdmUgYSBjb2hlcmVudCBpbnRlZ2VyIHR5cGUgY2xhc3MsICcKKyAgICAgICAgICAgICAgICAgICd3aGVuXG4nCisgICAgICAgICAgICAgICAgICAnICAgICAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQgIl9faW50X18oKSIgc2hvdWxkIGFsc28gYmUgJworICAgICAgICAgICAgICAgICAgJ2RlZmluZWQsIGFuZFxuJworICAgICAgICAgICAgICAgICAgJyAgICAgYm90aCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHZhbHVlLlxuJywKKyAnb2JqZWN0cyc6ICdcbicKKyAgICAgICAgICAgICdPYmplY3RzLCB2YWx1ZXMgYW5kIHR5cGVzXG4nCisgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgIipPYmplY3RzKiBhcmUgUHl0aG9uJ3MgYWJzdHJhY3Rpb24gZm9yIGRhdGEuICBBbGwgZGF0YSBpbiBhICIKKyAgICAgICAgICAgICdQeXRob25cbicKKyAgICAgICAgICAgICdwcm9ncmFtIGlzIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMgb3IgYnkgcmVsYXRpb25zIGJldHdlZW4gJworICAgICAgICAgICAgJ29iamVjdHMuIChJblxuJworICAgICAgICAgICAgJ2Egc2Vuc2UsIGFuZCBpbiBjb25mb3JtYW5jZSB0byBWb24gTmV1bWFublwncyBtb2RlbCBvZiBhICJzdG9yZWRcbicKKyAgICAgICAgICAgICdwcm9ncmFtIGNvbXB1dGVyLCIgY29kZSBpcyBhbHNvIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMuKVxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgIkV2ZXJ5IG9iamVjdCBoYXMgYW4gaWRlbnRpdHksIGEgdHlwZSBhbmQgYSB2YWx1ZS4gIEFuIG9iamVjdCdzXG4iCisgICAgICAgICAgICAnKmlkZW50aXR5KiBuZXZlciBjaGFuZ2VzIG9uY2UgaXQgaGFzIGJlZW4gY3JlYXRlZDsgeW91IG1heSB0aGluayAnCisgICAgICAgICAgICAnb2YgaXRcbicKKyAgICAgICAgICAgICdhcyB0aGUgb2JqZWN0XCdzIGFkZHJlc3MgaW4gbWVtb3J5LiAgVGhlIFwnImlzIlwnIG9wZXJhdG9yICcKKyAgICAgICAgICAgICdjb21wYXJlcyB0aGVcbicKKyAgICAgICAgICAgICdpZGVudGl0eSBvZiB0d28gb2JqZWN0czsgdGhlICJpZCgpIiBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVnZXJcbicKKyAgICAgICAgICAgICdyZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5LlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJyoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogRm9yIENQeXRob24sICJpZCh4KSIgaXMgdGhlICcKKyAgICAgICAgICAgICdtZW1vcnlcbicKKyAgICAgICAgICAgICdhZGRyZXNzIHdoZXJlICJ4IiBpcyBzdG9yZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAiQW4gb2JqZWN0J3MgdHlwZSBkZXRlcm1pbmVzIHRoZSBvcGVyYXRpb25zIHRoYXQgdGhlIG9iamVjdCAiCisgICAgICAgICAgICAnc3VwcG9ydHNcbicKKyAgICAgICAgICAgICcoZS5nLiwgImRvZXMgaXQgaGF2ZSBhIGxlbmd0aD8iKSBhbmQgYWxzbyBkZWZpbmVzIHRoZSBwb3NzaWJsZSAnCisgICAgICAgICAgICAndmFsdWVzXG4nCisgICAgICAgICAgICAnZm9yIG9iamVjdHMgb2YgdGhhdCB0eXBlLiAgVGhlICJ0eXBlKCkiIGZ1bmN0aW9uIHJldHVybnMgYW4gJworICAgICAgICAgICAgIm9iamVjdCdzXG4iCisgICAgICAgICAgICAndHlwZSAod2hpY2ggaXMgYW4gb2JqZWN0IGl0c2VsZikuICBMaWtlIGl0cyBpZGVudGl0eSwgYW4gJworICAgICAgICAgICAgIm9iamVjdCdzXG4iCisgICAgICAgICAgICAnKnR5cGUqIGlzIGFsc28gdW5jaGFuZ2VhYmxlLiBbMV1cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdUaGUgKnZhbHVlKiBvZiBzb21lIG9iamVjdHMgY2FuIGNoYW5nZS4gIE9iamVjdHMgd2hvc2UgdmFsdWUgY2FuXG4nCisgICAgICAgICAgICAnY2hhbmdlIGFyZSBzYWlkIHRvIGJlICptdXRhYmxlKjsgb2JqZWN0cyB3aG9zZSB2YWx1ZSBpcyAnCisgICAgICAgICAgICAndW5jaGFuZ2VhYmxlXG4nCisgICAgICAgICAgICAnb25jZSB0aGV5IGFyZSBjcmVhdGVkIGFyZSBjYWxsZWQgKmltbXV0YWJsZSouIChUaGUgdmFsdWUgb2YgYW5cbicKKyAgICAgICAgICAgICdpbW11dGFibGUgY29udGFpbmVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgJworICAgICAgICAgICAgJ211dGFibGVcbicKKyAgICAgICAgICAgICJvYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXIncyB2YWx1ZSBpcyBjaGFuZ2VkOyBob3dldmVyICIKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICdjb250YWluZXIgaXMgc3RpbGwgY29uc2lkZXJlZCBpbW11dGFibGUsIGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gJworICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAnb2JqZWN0cyBpdCBjb250YWlucyBjYW5ub3QgYmUgY2hhbmdlZC4gIFNvLCBpbW11dGFiaWxpdHkgaXMgbm90XG4nCisgICAgICAgICAgICAnc3RyaWN0bHkgdGhlIHNhbWUgYXMgaGF2aW5nIGFuIHVuY2hhbmdlYWJsZSB2YWx1ZSwgaXQgaXMgbW9yZSAnCisgICAgICAgICAgICAnc3VidGxlLilcbicKKyAgICAgICAgICAgICJBbiBvYmplY3QncyBtdXRhYmlsaXR5IGlzIGRldGVybWluZWQgYnkgaXRzIHR5cGU7IGZvciBpbnN0YW5jZSxcbiIKKyAgICAgICAgICAgICdudW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzICcKKyAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICdsaXN0cyBhcmUgbXV0YWJsZS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdPYmplY3RzIGFyZSBuZXZlciBleHBsaWNpdGx5IGRlc3Ryb3llZDsgaG93ZXZlciwgd2hlbiB0aGV5ICcKKyAgICAgICAgICAgICdiZWNvbWVcbicKKyAgICAgICAgICAgICd1bnJlYWNoYWJsZSB0aGV5IG1heSBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gIEFuIGltcGxlbWVudGF0aW9uIGlzXG4nCisgICAgICAgICAgICAnYWxsb3dlZCB0byBwb3N0cG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24gb3Igb21pdCBpdCBhbHRvZ2V0aGVyIC0tLSAnCisgICAgICAgICAgICAnaXQgaXNcbicKKyAgICAgICAgICAgICdhIG1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbicKKyAgICAgICAgICAgICdpbXBsZW1lbnRlZCwgYXMgbG9uZyBhcyBubyBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgdGhhdCBhcmUgc3RpbGxcbicKKyAgICAgICAgICAgICdyZWFjaGFibGUuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBDUHl0aG9uIGN1cnJlbnRseSB1c2VzIGEgJworICAgICAgICAgICAgJ3JlZmVyZW5jZS1cbicKKyAgICAgICAgICAgICdjb3VudGluZyBzY2hlbWUgd2l0aCAob3B0aW9uYWwpIGRlbGF5ZWQgZGV0ZWN0aW9uIG9mIGN5Y2xpY2FsbHkgJworICAgICAgICAgICAgJ2xpbmtlZFxuJworICAgICAgICAgICAgJ2dhcmJhZ2UsIHdoaWNoIGNvbGxlY3RzIG1vc3Qgb2JqZWN0cyBhcyBzb29uIGFzIHRoZXkgYmVjb21lXG4nCisgICAgICAgICAgICAndW5yZWFjaGFibGUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb2xsZWN0IGdhcmJhZ2UgY29udGFpbmluZ1xuJworICAgICAgICAgICAgJ2NpcmN1bGFyIHJlZmVyZW5jZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlICJnYyIgbW9kdWxlICcKKyAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICdpbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gJworICAgICAgICAgICAgJ090aGVyXG4nCisgICAgICAgICAgICAnaW1wbGVtZW50YXRpb25zIGFjdCBkaWZmZXJlbnRseSBhbmQgQ1B5dGhvbiBtYXkgY2hhbmdlLiBEbyBub3QgJworICAgICAgICAgICAgJ2RlcGVuZFxuJworICAgICAgICAgICAgJ29uIGltbWVkaWF0ZSBmaW5hbGl6YXRpb24gb2Ygb2JqZWN0cyB3aGVuIHRoZXkgYmVjb21lIHVucmVhY2hhYmxlICcKKyAgICAgICAgICAgICcoc29cbicKKyAgICAgICAgICAgICd5b3Ugc2hvdWxkIGFsd2F5cyBjbG9zZSBmaWxlcyBleHBsaWNpdGx5KS5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICJOb3RlIHRoYXQgdGhlIHVzZSBvZiB0aGUgaW1wbGVtZW50YXRpb24ncyB0cmFjaW5nIG9yIGRlYnVnZ2luZ1xuIgorICAgICAgICAgICAgJ2ZhY2lsaXRpZXMgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZSB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlICcKKyAgICAgICAgICAgICdjb2xsZWN0YWJsZS5cbicKKyAgICAgICAgICAgICdBbHNvIG5vdGUgdGhhdCBjYXRjaGluZyBhbiBleGNlcHRpb24gd2l0aCBhIFwnInRyeSIuLi4iZXhjZXB0IlwnXG4nCisgICAgICAgICAgICAnc3RhdGVtZW50IG1heSBrZWVwIG9iamVjdHMgYWxpdmUuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byAiZXh0ZXJuYWwiIHJlc291cmNlcyBzdWNoIGFzICcKKyAgICAgICAgICAgICdvcGVuXG4nCisgICAgICAgICAgICAnZmlsZXMgb3Igd2luZG93cy4gIEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGVzZSByZXNvdXJjZXMgYXJlICcKKyAgICAgICAgICAgICdmcmVlZFxuJworICAgICAgICAgICAgJ3doZW4gdGhlIG9iamVjdCBpcyBnYXJiYWdlLWNvbGxlY3RlZCwgYnV0IHNpbmNlIGdhcmJhZ2UgJworICAgICAgICAgICAgJ2NvbGxlY3Rpb24gaXNcbicKKyAgICAgICAgICAgICdub3QgZ3VhcmFudGVlZCB0byBoYXBwZW4sIHN1Y2ggb2JqZWN0cyBhbHNvIHByb3ZpZGUgYW4gZXhwbGljaXQgJworICAgICAgICAgICAgJ3dheSB0b1xuJworICAgICAgICAgICAgJ3JlbGVhc2UgdGhlIGV4dGVybmFsIHJlc291cmNlLCB1c3VhbGx5IGEgImNsb3NlKCkiIG1ldGhvZC4gJworICAgICAgICAgICAgJ1Byb2dyYW1zXG4nCisgICAgICAgICAgICAnYXJlIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGV4cGxpY2l0bHkgY2xvc2Ugc3VjaCBvYmplY3RzLiAgVGhlXG4nCisgICAgICAgICAgICAnXCcidHJ5Ii4uLiJmaW5hbGx5IlwnIHN0YXRlbWVudCBhbmQgdGhlIFwnIndpdGgiXCcgc3RhdGVtZW50ICcKKyAgICAgICAgICAgICdwcm92aWRlXG4nCisgICAgICAgICAgICAnY29udmVuaWVudCB3YXlzIHRvIGRvIHRoaXMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzOyB0aGVzZSBhcmUgJworICAgICAgICAgICAgJ2NhbGxlZFxuJworICAgICAgICAgICAgJypjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmRcbicKKyAgICAgICAgICAgICJkaWN0aW9uYXJpZXMuICBUaGUgcmVmZXJlbmNlcyBhcmUgcGFydCBvZiBhIGNvbnRhaW5lcidzIHZhbHVlLiAgIgorICAgICAgICAgICAgJ0luXG4nCisgICAgICAgICAgICAnbW9zdCBjYXNlcywgd2hlbiB3ZSB0YWxrIGFib3V0IHRoZSB2YWx1ZSBvZiBhIGNvbnRhaW5lciwgd2UgaW1wbHkgJworICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgJ3ZhbHVlcywgbm90IHRoZSBpZGVudGl0aWVzIG9mIHRoZSBjb250YWluZWQgb2JqZWN0czsgaG93ZXZlciwgJworICAgICAgICAgICAgJ3doZW4gd2VcbicKKyAgICAgICAgICAgICd0YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mICcKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICdpbW1lZGlhdGVseSBjb250YWluZWQgb2JqZWN0cyBhcmUgaW1wbGllZC4gIFNvLCBpZiBhbiBpbW11dGFibGVcbicKKyAgICAgICAgICAgICdjb250YWluZXIgKGxpa2UgYSB0dXBsZSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlICcKKyAgICAgICAgICAgICdvYmplY3QsIGl0c1xuJworICAgICAgICAgICAgJ3ZhbHVlIGNoYW5nZXMgaWYgdGhhdCBtdXRhYmxlIG9iamVjdCBpcyBjaGFuZ2VkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ1R5cGVzIGFmZmVjdCBhbG1vc3QgYWxsIGFzcGVjdHMgb2Ygb2JqZWN0IGJlaGF2aW9yLiAgRXZlbiB0aGVcbicKKyAgICAgICAgICAgICdpbXBvcnRhbmNlIG9mIG9iamVjdCBpZGVudGl0eSBpcyBhZmZlY3RlZCBpbiBzb21lIHNlbnNlOiBmb3IgJworICAgICAgICAgICAgJ2ltbXV0YWJsZVxuJworICAgICAgICAgICAgJ3R5cGVzLCBvcGVyYXRpb25zIHRoYXQgY29tcHV0ZSBuZXcgdmFsdWVzIG1heSBhY3R1YWxseSByZXR1cm4gYVxuJworICAgICAgICAgICAgJ3JlZmVyZW5jZSB0byBhbnkgZXhpc3Rpbmcgb2JqZWN0IHdpdGggdGhlIHNhbWUgdHlwZSBhbmQgdmFsdWUsICcKKyAgICAgICAgICAgICd3aGlsZVxuJworICAgICAgICAgICAgJ2ZvciBtdXRhYmxlIG9iamVjdHMgdGhpcyBpcyBub3QgYWxsb3dlZC4gIEUuZy4sIGFmdGVyICJhID0gMTsgYiA9ICcKKyAgICAgICAgICAgICcxIixcbicKKyAgICAgICAgICAgICciYSIgYW5kICJiIiBtYXkgb3IgbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3Qgd2l0aCB0aGUgJworICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAnb25lLCBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgYWZ0ZXIgImMgPSBbXTsgZCA9IFtdIiwgJworICAgICAgICAgICAgJyJjIlxuJworICAgICAgICAgICAgJ2FuZCAiZCIgYXJlIGd1YXJhbnRlZWQgdG8gcmVmZXIgdG8gdHdvIGRpZmZlcmVudCwgdW5pcXVlLCBuZXdseVxuJworICAgICAgICAgICAgJ2NyZWF0ZWQgZW1wdHkgbGlzdHMuIChOb3RlIHRoYXQgImMgPSBkID0gW10iIGFzc2lnbnMgdGhlIHNhbWUgJworICAgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICAgJ3RvIGJvdGggImMiIGFuZCAiZCIuKVxuJywKKyAnb3BlcmF0b3Itc3VtbWFyeSc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdPcGVyYXRvciBwcmVjZWRlbmNlXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB0aGUgb3BlcmF0b3IgcHJlY2VkZW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnaW4gUHl0aG9uLCBmcm9tXG4nCisgICAgICAgICAgICAgICAgICAgICAnbG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0IGJpbmRpbmcpIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAnKG1vc3RcbicKKyAgICAgICAgICAgICAgICAgICAgICdiaW5kaW5nKS4gIE9wZXJhdG9ycyBpbiB0aGUgc2FtZSBib3ggaGF2ZSB0aGUgc2FtZSAnCisgICAgICAgICAgICAgICAgICAgICAncHJlY2VkZW5jZS4gIFVubGVzc1xuJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzeW50YXggaXMgZXhwbGljaXRseSBnaXZlbiwgb3BlcmF0b3JzIGFyZSBiaW5hcnkuICAnCisgICAgICAgICAgICAgICAgICAgICAnT3BlcmF0b3JzIGluXG4nCisgICAgICAgICAgICAgICAgICAgICAndGhlIHNhbWUgYm94IGdyb3VwIGxlZnQgdG8gcmlnaHQgKGV4Y2VwdCBmb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2V4cG9uZW50aWF0aW9uLCB3aGljaFxuJworICAgICAgICAgICAgICAgICAgICAgJ2dyb3VwcyBmcm9tIHJpZ2h0IHRvIGxlZnQpLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCBjb21wYXJpc29ucywgbWVtYmVyc2hpcCB0ZXN0cywgYW5kIGlkZW50aXR5ICcKKyAgICAgICAgICAgICAgICAgICAgICd0ZXN0cywgYWxsIGhhdmVcbicKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2FtZSBwcmVjZWRlbmNlIGFuZCBoYXZlIGEgbGVmdC10by1yaWdodCBjaGFpbmluZyAnCisgICAgICAgICAgICAgICAgICAgICAnZmVhdHVyZSBhc1xuJworICAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaWJlZCBpbiB0aGUgQ29tcGFyaXNvbnMgc2VjdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCBPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAibGFtYmRhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdMYW1iZGEgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiaWYiIC0tICJlbHNlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdDb25kaXRpb25hbCBleHByZXNzaW9uICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAib3IiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCb29sZWFuIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiYW5kIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCb29sZWFuIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAibm90IiAieCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCb29sZWFuIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiaW4iLCAibm90IGluIiwgImlzIiwgImlzIG5vdCIsICI8IiwgIjw9IiwgIj4iLCB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdDb21wYXJpc29ucywgaW5jbHVkaW5nIG1lbWJlcnNoaXAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICI+PSIsICIhPSIsICI9PSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RzIGFuZCBpZGVudGl0eSB0ZXN0cyAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJ8IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0JpdHdpc2UgT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJeIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0JpdHdpc2UgWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICImIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0JpdHdpc2UgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICI8PCIsICI+PiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ1NoaWZ0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICIrIiwgIi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ0FkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICIqIiwgIkAiLCAiLyIsICIvLyIsICIlIiAgICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ011bHRpcGxpY2F0aW9uLCBtYXRyaXggbXVsdGlwbGljYXRpb24gfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnZGl2aXNpb24sIHJlbWFpbmRlciBbNV0gICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIit4IiwgIi14IiwgIn54IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnUG9zaXRpdmUsIG5lZ2F0aXZlLCBiaXR3aXNlIE5PVCAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgIioqIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnRXhwb25lbnRpYXRpb24gWzZdICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgImF3YWl0IiAieCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnQXdhaXQgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInhbaW5kZXhdIiwgInhbaW5kZXg6aW5kZXhdIiwgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnU3Vic2NyaXB0aW9uLCBzbGljaW5nLCBjYWxsLCAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAieChhcmd1bWVudHMuLi4pIiwgInguYXR0cmlidXRlIiAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAiKGV4cHJlc3Npb25zLi4uKSIsICJbZXhwcmVzc2lvbnMuLi5dIiwgIntrZXk6ICB8ICcKKyAgICAgICAgICAgICAgICAgICAgICdCaW5kaW5nIG9yIHR1cGxlIGRpc3BsYXksIGxpc3QgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8IHZhbHVlLi4ufSIsICJ7ZXhwcmVzc2lvbnMuLi59IiAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICAgICAgICAgJ2Rpc3BsYXksIGRpY3Rpb25hcnkgZGlzcGxheSwgc2V0ICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnZGlzcGxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJy1bIEZvb3Rub3RlcyBdLVxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1sxXSBXaGlsZSAiYWJzKHgleSkgPCBhYnMoeSkiIGlzIHRydWUgbWF0aGVtYXRpY2FsbHksICcKKyAgICAgICAgICAgICAgICAgICAgICdmb3IgZmxvYXRzXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGl0IG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgJworICAgICAgICAgICAgICAgICAgICAgJ2V4YW1wbGUsIGFuZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBhc3N1bWluZyBhIHBsYXRmb3JtIG9uIHdoaWNoIGEgUHl0aG9uIGZsb2F0IGlzIGFuICcKKyAgICAgICAgICAgICAgICAgICAgICdJRUVFIDc1NCBkb3VibGUtXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHByZWNpc2lvbiBudW1iZXIsIGluIG9yZGVyIHRoYXQgIi0xZS0xMDAgJSAxZTEwMCIgJworICAgICAgICAgICAgICAgICAgICAgJ2hhdmUgdGhlIHNhbWVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgc2lnbiBhcyAiMWUxMDAiLCB0aGUgY29tcHV0ZWQgcmVzdWx0IGlzICItMWUtMTAwICsgJworICAgICAgICAgICAgICAgICAgICAgJzFlMTAwIiwgd2hpY2hcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgaXMgbnVtZXJpY2FsbHkgZXhhY3RseSBlcXVhbCB0byAiMWUxMDAiLiAgVGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICAibWF0aC5mbW9kKCkiIHJldHVybnMgYSByZXN1bHQgd2hvc2Ugc2lnbiBtYXRjaGVzICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2lnbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgZmlyc3QgYXJndW1lbnQgaW5zdGVhZCwgYW5kIHNvIHJldHVybnMgIi0xZS0xMDAiIGluICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGlzIGNhc2UuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFdoaWNoIGFwcHJvYWNoIGlzIG1vcmUgYXBwcm9wcmlhdGUgZGVwZW5kcyBvbiB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1syXSBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiAnCisgICAgICAgICAgICAgICAgICAgICAieSwgaXQnc1xuIgorICAgICAgICAgICAgICAgICAgICAgJyAgICBwb3NzaWJsZSBmb3IgIngvL3kiIHRvIGJlIG9uZSBsYXJnZXIgdGhhbiAnCisgICAgICAgICAgICAgICAgICAgICAnIih4LXgleSkvL3kiIGR1ZSB0b1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zIHRoZSBsYXR0ZXIgJworICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCwgaW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgb3JkZXIgdG8gcHJlc2VydmUgdGhhdCAiZGl2bW9kKHgseSlbMF0gKiB5ICsgeCAlIHkiICcKKyAgICAgICAgICAgICAgICAgICAgICdiZSB2ZXJ5IGNsb3NlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHRvICJ4Ii5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdbM10gVGhlIFVuaWNvZGUgc3RhbmRhcmQgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuICpjb2RlICcKKyAgICAgICAgICAgICAgICAgICAgICdwb2ludHMqIChlLmcuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFUrMDA0MSkgYW5kICphYnN0cmFjdCBjaGFyYWN0ZXJzKiAoZS5nLiAiTEFUSU4gJworICAgICAgICAgICAgICAgICAgICAgJ0NBUElUQUwgTEVUVEVSIEEiKS5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgV2hpbGUgbW9zdCBhYnN0cmFjdCBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgYXJlIG9ubHkgJworICAgICAgICAgICAgICAgICAgICAgJ3JlcHJlc2VudGVkXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHVzaW5nIG9uZSBjb2RlIHBvaW50LCB0aGVyZSBpcyBhIG51bWJlciBvZiBhYnN0cmFjdCAnCisgICAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyc1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICB0aGF0IGNhbiBpbiBhZGRpdGlvbiBiZSByZXByZXNlbnRlZCB1c2luZyBhIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdvZiBtb3JlIHRoYW5cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgb25lIGNvZGUgcG9pbnQuICBGb3IgZXhhbXBsZSwgdGhlIGFic3RyYWN0IGNoYXJhY3RlciAnCisgICAgICAgICAgICAgICAgICAgICAnIkxBVElOXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBIiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgJworICAgICAgICAgICAgICAgICAgICAgJ2Egc2luZ2xlXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgICpwcmVjb21wb3NlZCBjaGFyYWN0ZXIqIGF0IGNvZGUgcG9zaXRpb24gVSswMEM3LCBvciAnCisgICAgICAgICAgICAgICAgICAgICAnYXMgYSBzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBvZiBhICpiYXNlIGNoYXJhY3RlciogYXQgY29kZSBwb3NpdGlvbiBVKzAwNDMgKExBVElOICcKKyAgICAgICAgICAgICAgICAgICAgICdDQVBJVEFMXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIExFVFRFUiBDKSwgZm9sbG93ZWQgYnkgYSAqY29tYmluaW5nIGNoYXJhY3RlciogYXQgJworICAgICAgICAgICAgICAgICAgICAgJ2NvZGUgcG9zaXRpb25cbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgVSswMzI3IChDT01CSU5JTkcgQ0VESUxMQSkuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIFRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBvbiBzdHJpbmdzIGNvbXBhcmUgYXQgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdsZXZlbCBvZlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBVbmljb2RlIGNvZGUgcG9pbnRzLiBUaGlzIG1heSBiZSBjb3VudGVyLWludHVpdGl2ZSAnCisgICAgICAgICAgICAgICAgICAgICAndG8gaHVtYW5zLiAgRm9yXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIGV4YW1wbGUsICIiXFx1MDBDNyIgPT0gIlxcdTAwNDNcXHUwMzI3IiIgaXMgIkZhbHNlIiwgJworICAgICAgICAgICAgICAgICAgICAgJ2V2ZW4gdGhvdWdoIGJvdGhcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgc3RyaW5ncyByZXByZXNlbnQgdGhlIHNhbWUgYWJzdHJhY3QgY2hhcmFjdGVyICJMQVRJTiAnCisgICAgICAgICAgICAgICAgICAgICAnQ0FQSVRBTFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBMRVRURVIgQyBXSVRIIENFRElMTEEiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBUbyBjb21wYXJlIHN0cmluZ3MgYXQgdGhlIGxldmVsIG9mIGFic3RyYWN0ICcKKyAgICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzICh0aGF0IGlzLFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpbiBhIHdheSBpbnR1aXRpdmUgdG8gaHVtYW5zKSwgdXNlICcKKyAgICAgICAgICAgICAgICAgICAgICcidW5pY29kZWRhdGEubm9ybWFsaXplKCkiLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1s0XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgZHluYW1pYyBuYXR1cmUgb2YgZGVzY3JpcHRvcnMsIHlvdSBtYXkgbm90aWNlICcKKyAgICAgICAgICAgICAgICAgICAgICdzZWVtaW5nbHkgdW51c3VhbFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBiZWhhdmlvdXIgaW4gY2VydGFpbiB1c2VzIG9mIHRoZSAiaXMiIG9wZXJhdG9yLCBsaWtlICcKKyAgICAgICAgICAgICAgICAgICAgICd0aG9zZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBpbnZvbHZpbmcgY29tcGFyaXNvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZXRob2RzLCBvciAnCisgICAgICAgICAgICAgICAgICAgICAnY29uc3RhbnRzLlxuJworICAgICAgICAgICAgICAgICAgICAgJyAgICBDaGVjayB0aGVpciBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnWzVdIFRoZSAiJSIgb3BlcmF0b3IgaXMgYWxzbyB1c2VkIGZvciBzdHJpbmcgZm9ybWF0dGluZzsgJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgIHByZWNlZGVuY2UgYXBwbGllcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdbNl0gVGhlIHBvd2VyIG9wZXJhdG9yICIqKiIgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gYW4gJworICAgICAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICAgb3IgYml0d2lzZSB1bmFyeSBvcGVyYXRvciBvbiBpdHMgcmlnaHQsIHRoYXQgaXMsICcKKyAgICAgICAgICAgICAgICAgICAgICciMioqLTEiIGlzICIwLjUiLlxuJywKKyAncGFzcyc6ICdcbicKKyAgICAgICAgICdUaGUgInBhc3MiIHN0YXRlbWVudFxuJworICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgcGFzc19zdG10IDo6PSAicGFzcyJcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcicGFzcyIgaXMgYSBudWxsIG9wZXJhdGlvbiAtLS0gd2hlbiBpdCBpcyBleGVjdXRlZCwgbm90aGluZyAnCisgICAgICAgICAnaGFwcGVucy5cbicKKyAgICAgICAgICdJdCBpcyB1c2VmdWwgYXMgYSBwbGFjZWhvbGRlciB3aGVuIGEgc3RhdGVtZW50IGlzIHJlcXVpcmVkXG4nCisgICAgICAgICAnc3ludGFjdGljYWxseSwgYnV0IG5vIGNvZGUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQsIGZvciBleGFtcGxlOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIGRlZiBmKGFyZyk6IHBhc3MgICAgIyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nICh5ZXQpXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnICAgY2xhc3MgQzogcGFzcyAgICAgICAjIGEgY2xhc3Mgd2l0aCBubyBtZXRob2RzICh5ZXQpXG4nLAorICdwb3dlcic6ICdcbicKKyAgICAgICAgICAnVGhlIHBvd2VyIG9wZXJhdG9yXG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlIHBvd2VyIG9wZXJhdG9yIGJpbmRzIG1vcmUgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHNcbicKKyAgICAgICAgICAnbGVmdDsgaXQgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0cyByaWdodC4gICcKKyAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgJ3N5bnRheCBpczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIHBvd2VyIDo6PSAoIGF3YWl0X2V4cHIgfCBwcmltYXJ5ICkgWyIqKiIgdV9leHByXVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGh1cywgaW4gYW4gdW5wYXJlbnRoZXNpemVkIHNlcXVlbmNlIG9mIHBvd2VyIGFuZCB1bmFyeSBvcGVyYXRvcnMsICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ29wZXJhdG9ycyBhcmUgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCAodGhpcyBkb2VzIG5vdCAnCisgICAgICAgICAgJ2NvbnN0cmFpblxuJworICAgICAgICAgICd0aGUgZXZhbHVhdGlvbiBvcmRlciBmb3IgdGhlIG9wZXJhbmRzKTogIi0xKioyIiByZXN1bHRzIGluICItMSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgcG93ZXIgb3BlcmF0b3IgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYnVpbHQtaW4gInBvdygpIlxuJworICAgICAgICAgICdmdW5jdGlvbiwgd2hlbiBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzOiBpdCB5aWVsZHMgaXRzIGxlZnQgJworICAgICAgICAgICdhcmd1bWVudFxuJworICAgICAgICAgICdyYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGl0cyByaWdodCBhcmd1bWVudC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyAnCisgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICdmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwgYW5kIHRoZSByZXN1bHQgaXMgb2YgdGhhdCB0eXBlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnRm9yIGludCBvcGVyYW5kcywgdGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb3BlcmFuZHMgJworICAgICAgICAgICd1bmxlc3NcbicKKyAgICAgICAgICAndGhlIHNlY29uZCBhcmd1bWVudCBpcyBuZWdhdGl2ZTsgaW4gdGhhdCBjYXNlLCBhbGwgYXJndW1lbnRzIGFyZVxuJworICAgICAgICAgICdjb252ZXJ0ZWQgdG8gZmxvYXQgYW5kIGEgZmxvYXQgcmVzdWx0IGlzIGRlbGl2ZXJlZC4gRm9yIGV4YW1wbGUsXG4nCisgICAgICAgICAgJyIxMCoqMiIgcmV0dXJucyAiMTAwIiwgYnV0ICIxMCoqLTIiIHJldHVybnMgIjAuMDEiLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnUmFpc2luZyAiMC4wIiB0byBhIG5lZ2F0aXZlIHBvd2VyIHJlc3VsdHMgaW4gYSAnCisgICAgICAgICAgJyJaZXJvRGl2aXNpb25FcnJvciIuXG4nCisgICAgICAgICAgJ1JhaXNpbmcgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYSBmcmFjdGlvbmFsIHBvd2VyIHJlc3VsdHMgaW4gYSAnCisgICAgICAgICAgJyJjb21wbGV4IlxuJworICAgICAgICAgICdudW1iZXIuIChJbiBlYXJsaWVyIHZlcnNpb25zIGl0IHJhaXNlZCBhICJWYWx1ZUVycm9yIi4pXG4nLAorICdyYWlzZSc6ICdcbicKKyAgICAgICAgICAnVGhlICJyYWlzZSIgc3RhdGVtZW50XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgcmFpc2Vfc3RtdCA6Oj0gInJhaXNlIiBbZXhwcmVzc2lvbiBbImZyb20iIGV4cHJlc3Npb25dXVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSWYgbm8gZXhwcmVzc2lvbnMgYXJlIHByZXNlbnQsICJyYWlzZSIgcmUtcmFpc2VzIHRoZSBsYXN0ICcKKyAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgJ3RoYXQgd2FzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIElmIG5vIGV4Y2VwdGlvbiBpcyBhY3RpdmUgJworICAgICAgICAgICdpblxuJworICAgICAgICAgICd0aGUgY3VycmVudCBzY29wZSwgYSAiUnVudGltZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkIGluZGljYXRpbmdcbicKKyAgICAgICAgICAndGhhdCB0aGlzIGlzIGFuIGVycm9yLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnT3RoZXJ3aXNlLCAicmFpc2UiIGV2YWx1YXRlcyB0aGUgZmlyc3QgZXhwcmVzc2lvbiBhcyB0aGUgZXhjZXB0aW9uXG4nCisgICAgICAgICAgJ29iamVjdC4gIEl0IG11c3QgYmUgZWl0aGVyIGEgc3ViY2xhc3Mgb3IgYW4gaW5zdGFuY2Ugb2ZcbicKKyAgICAgICAgICAnIkJhc2VFeGNlcHRpb24iLiBJZiBpdCBpcyBhIGNsYXNzLCB0aGUgZXhjZXB0aW9uIGluc3RhbmNlIHdpbGwgYmVcbicKKyAgICAgICAgICAnb2J0YWluZWQgd2hlbiBuZWVkZWQgYnkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3Mgd2l0aCBubyBhcmd1bWVudHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICJUaGUgKnR5cGUqIG9mIHRoZSBleGNlcHRpb24gaXMgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSdzIGNsYXNzLCB0aGVcbiIKKyAgICAgICAgICAnKnZhbHVlKiBpcyB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSB0cmFjZWJhY2sgb2JqZWN0IGlzIG5vcm1hbGx5IGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFuICcKKyAgICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICAgJ2lzIHJhaXNlZCBhbmQgYXR0YWNoZWQgdG8gaXQgYXMgdGhlICJfX3RyYWNlYmFja19fIiBhdHRyaWJ1dGUsICcKKyAgICAgICAgICAnd2hpY2hcbicKKyAgICAgICAgICAnaXMgd3JpdGFibGUuIFlvdSBjYW4gY3JlYXRlIGFuIGV4Y2VwdGlvbiBhbmQgc2V0IHlvdXIgb3duIHRyYWNlYmFjayAnCisgICAgICAgICAgJ2luXG4nCisgICAgICAgICAgJ29uZSBzdGVwIHVzaW5nIHRoZSAid2l0aF90cmFjZWJhY2soKSIgZXhjZXB0aW9uIG1ldGhvZCAod2hpY2ggJworICAgICAgICAgICdyZXR1cm5zXG4nCisgICAgICAgICAgJ3RoZSBzYW1lIGV4Y2VwdGlvbiBpbnN0YW5jZSwgd2l0aCBpdHMgdHJhY2ViYWNrIHNldCB0byBpdHMgJworICAgICAgICAgICdhcmd1bWVudCksXG4nCisgICAgICAgICAgJ2xpa2Ugc286XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICByYWlzZSBFeGNlcHRpb24oImZvbyBvY2N1cnJlZCIpLndpdGhfdHJhY2ViYWNrKHRyYWNlYmFja29iailcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSAiZnJvbSIgY2xhdXNlIGlzIHVzZWQgZm9yIGV4Y2VwdGlvbiBjaGFpbmluZzogaWYgZ2l2ZW4sIHRoZSAnCisgICAgICAgICAgJ3NlY29uZFxuJworICAgICAgICAgICcqZXhwcmVzc2lvbiogbXVzdCBiZSBhbm90aGVyIGV4Y2VwdGlvbiBjbGFzcyBvciBpbnN0YW5jZSwgd2hpY2ggJworICAgICAgICAgICd3aWxsXG4nCisgICAgICAgICAgJ3RoZW4gYmUgYXR0YWNoZWQgdG8gdGhlIHJhaXNlZCBleGNlcHRpb24gYXMgdGhlICJfX2NhdXNlX18iICcKKyAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgJyh3aGljaCBpcyB3cml0YWJsZSkuICBJZiB0aGUgcmFpc2VkIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCwgYm90aFxuJworICAgICAgICAgICdleGNlcHRpb25zIHdpbGwgYmUgcHJpbnRlZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgID4+PiB0cnk6XG4nCisgICAgICAgICAgJyAgIC4uLiAgICAgcHJpbnQoMSAvIDApXG4nCisgICAgICAgICAgJyAgIC4uLiBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzpcbicKKyAgICAgICAgICAnICAgLi4uICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQiKSBmcm9tIGV4Y1xuJworICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAnICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJworICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgJyAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnQgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm9cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRoZSBhYm92ZSBleGNlcHRpb24gd2FzIHRoZSBkaXJlY3QgY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyAnCisgICAgICAgICAgJ2V4Y2VwdGlvbjpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicKKyAgICAgICAgICAnICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSA0LCBpbiA8bW9kdWxlPlxuJworICAgICAgICAgICcgICBSdW50aW1lRXJyb3I6IFNvbWV0aGluZyBiYWQgaGFwcGVuZWRcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0Egc2ltaWxhciBtZWNoYW5pc20gd29ya3MgaW1wbGljaXRseSBpZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkICcKKyAgICAgICAgICAnaW5zaWRlXG4nCisgICAgICAgICAgJ2FuIGV4Y2VwdGlvbiBoYW5kbGVyIG9yIGEgImZpbmFsbHkiIGNsYXVzZTogdGhlIHByZXZpb3VzIGV4Y2VwdGlvbiAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJ3RoZW4gYXR0YWNoZWQgYXMgdGhlIG5ldyBleGNlcHRpb25cJ3MgIl9fY29udGV4dF9fIiBhdHRyaWJ1dGU6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICA+Pj4gdHJ5OlxuJworICAgICAgICAgICcgICAuLi4gICAgIHByaW50KDEgLyAwKVxuJworICAgICAgICAgICcgICAuLi4gZXhjZXB0OlxuJworICAgICAgICAgICcgICAuLi4gICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiU29tZXRoaW5nIGJhZCBoYXBwZW5lZCIpXG4nCisgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAnICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludCBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVyb1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgRHVyaW5nIGhhbmRsaW5nIG9mIHRoZSBhYm92ZSBleGNlcHRpb24sIGFub3RoZXIgZXhjZXB0aW9uICcKKyAgICAgICAgICAnb2NjdXJyZWQ6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgJyAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgNCwgaW4gPG1vZHVsZT5cbicKKyAgICAgICAgICAnICAgUnVudGltZUVycm9yOiBTb21ldGhpbmcgYmFkIGhhcHBlbmVkXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbicKKyAgICAgICAgICAnRXhjZXB0aW9ucywgYW5kIGluZm9ybWF0aW9uIGFib3V0IGhhbmRsaW5nIGV4Y2VwdGlvbnMgaXMgaW4gJworICAgICAgICAgICdzZWN0aW9uXG4nCisgICAgICAgICAgJ1RoZSB0cnkgc3RhdGVtZW50LlxuJywKKyAncmV0dXJuJzogJ1xuJworICAgICAgICAgICAnVGhlICJyZXR1cm4iIHN0YXRlbWVudFxuJworICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICcgICByZXR1cm5fc3RtdCA6Oj0gInJldHVybiIgW2V4cHJlc3Npb25fbGlzdF1cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnInJldHVybiIgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBmdW5jdGlvbiAnCisgICAgICAgICAgICdkZWZpbml0aW9uLFxuJworICAgICAgICAgICAnbm90IHdpdGhpbiBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdJZiBhbiBleHByZXNzaW9uIGxpc3QgaXMgcHJlc2VudCwgaXQgaXMgZXZhbHVhdGVkLCBlbHNlICJOb25lIiBpc1xuJworICAgICAgICAgICAnc3Vic3RpdHV0ZWQuXG4nCisgICAgICAgICAgICdcbicKKyAgICAgICAgICAgJyJyZXR1cm4iIGxlYXZlcyB0aGUgY3VycmVudCBmdW5jdGlvbiBjYWxsIHdpdGggdGhlIGV4cHJlc3Npb24gbGlzdCAnCisgICAgICAgICAgICcob3JcbicKKyAgICAgICAgICAgJyJOb25lIikgYXMgcmV0dXJuIHZhbHVlLlxuJworICAgICAgICAgICAnXG4nCisgICAgICAgICAgICdXaGVuICJyZXR1cm4iIHBhc3NlcyBjb250cm9sIG91dCBvZiBhICJ0cnkiIHN0YXRlbWVudCB3aXRoIGEgJworICAgICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICAgICdjbGF1c2UsIHRoYXQgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5IGxlYXZpbmcgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdmdW5jdGlvbi5cbicKKyAgICAgICAgICAgJ1xuJworICAgICAgICAgICAnSW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24sIHRoZSAicmV0dXJuIiBzdGF0ZW1lbnQgaW5kaWNhdGVzIHRoYXQgJworICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICdnZW5lcmF0b3IgaXMgZG9uZSBhbmQgd2lsbCBjYXVzZSAiU3RvcEl0ZXJhdGlvbiIgdG8gYmUgcmFpc2VkLiAnCisgICAgICAgICAgICdUaGVcbicKKyAgICAgICAgICAgJ3JldHVybmVkIHZhbHVlIChpZiBhbnkpIGlzIHVzZWQgYXMgYW4gYXJndW1lbnQgdG8gY29uc3RydWN0XG4nCisgICAgICAgICAgICciU3RvcEl0ZXJhdGlvbiIgYW5kIGJlY29tZXMgdGhlICJTdG9wSXRlcmF0aW9uLnZhbHVlIiBhdHRyaWJ1dGUuXG4nLAorICdzZXF1ZW5jZS10eXBlcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAnRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlc1xuJworICAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50ICcKKyAgICAgICAgICAgICAgICAgICAnY29udGFpbmVyIG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAgJ0NvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgJworICAgICAgICAgICAgICAgICAgICdvciBtYXBwaW5nc1xuJworICAgICAgICAgICAgICAgICAgICcobGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzICcKKyAgICAgICAgICAgICAgICAgICAnd2VsbC4gIFRoZVxuJworICAgICAgICAgICAgICAgICAgICdmaXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAgICdvciB0b1xuJworICAgICAgICAgICAgICAgICAgICdlbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoICIwIDw9ICcKKyAgICAgICAgICAgICAgICAgICAnayA8IE4iIHdoZXJlXG4nCisgICAgICAgICAgICAgICAgICAgJypOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2ggJworICAgICAgICAgICAgICAgICAgICdkZWZpbmUgYVxuJworICAgICAgICAgICAgICAgICAgICdyYW5nZSBvZiBpdGVtcy4gIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyAnCisgICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGUgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ21ldGhvZHMgImtleXMoKSIsICJ2YWx1ZXMoKSIsICJpdGVtcygpIiwgImdldCgpIiwgJworICAgICAgICAgICAgICAgICAgICciY2xlYXIoKSIsXG4nCisgICAgICAgICAgICAgICAgICAgJyJzZXRkZWZhdWx0KCkiLCAicG9wKCkiLCAicG9waXRlbSgpIiwgImNvcHkoKSIsIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJyJ1cGRhdGUoKSJcbicKKyAgICAgICAgICAgICAgICAgICAiYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uJ3Mgc3RhbmRhcmQgZGljdGlvbmFyeSAiCisgICAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1RoZSAiY29sbGVjdGlvbnMiIG1vZHVsZSBwcm92aWRlcyBhICJNdXRhYmxlTWFwcGluZyIgJworICAgICAgICAgICAgICAgICAgICdhYnN0cmFjdCBiYXNlXG4nCisgICAgICAgICAgICAgICAgICAgJ2NsYXNzIHRvIGhlbHAgY3JlYXRlIHRob3NlIG1ldGhvZHMgZnJvbSBhIGJhc2Ugc2V0IG9mICcKKyAgICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLFxuJworICAgICAgICAgICAgICAgICAgICciX19zZXRpdGVtX18oKSIsICJfX2RlbGl0ZW1fXygpIiwgYW5kICJrZXlzKCkiLiBNdXRhYmxlICcKKyAgICAgICAgICAgICAgICAgICAnc2VxdWVuY2VzXG4nCisgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBwcm92aWRlIG1ldGhvZHMgImFwcGVuZCgpIiwgImNvdW50KCkiLCAiaW5kZXgoKSIsICcKKyAgICAgICAgICAgICAgICAgICAnImV4dGVuZCgpIixcbicKKyAgICAgICAgICAgICAgICAgICAnImluc2VydCgpIiwgInBvcCgpIiwgInJlbW92ZSgpIiwgInJldmVyc2UoKSIgYW5kICJzb3J0KCkiLCAnCisgICAgICAgICAgICAgICAgICAgJ2xpa2UgUHl0aG9uXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0YW5kYXJkIGxpc3Qgb2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCAnCisgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAgICdhZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gJworICAgICAgICAgICAgICAgICAgICcobWVhbmluZ1xuJworICAgICAgICAgICAgICAgICAgICdyZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGUgbWV0aG9kcyAiX19hZGRfXygpIiwgJworICAgICAgICAgICAgICAgICAgICciX19yYWRkX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICAgJyJfX2lhZGRfXygpIiwgIl9fbXVsX18oKSIsICJfX3JtdWxfXygpIiBhbmQgIl9faW11bF9fKCkiICcKKyAgICAgICAgICAgICAgICAgICAnZGVzY3JpYmVkXG4nCisgICAgICAgICAgICAgICAgICAgJ2JlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICAnCisgICAgICAgICAgICAgICAgICAgJ0l0IGlzXG4nCisgICAgICAgICAgICAgICAgICAgJ3JlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAgICciX19jb250YWluc19fKCkiIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgdXNlIG9mIHRoZSAiaW4iICcKKyAgICAgICAgICAgICAgICAgICAnb3BlcmF0b3I7XG4nCisgICAgICAgICAgICAgICAgICAgJ2ZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5nXCdzIGtleXM7IGZvciAnCisgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlcywgaXRcbicKKyAgICAgICAgICAgICAgICAgICAnc2hvdWxkIHNlYXJjaCB0aHJvdWdoIHRoZSB2YWx1ZXMuICBJdCBpcyBmdXJ0aGVyICcKKyAgICAgICAgICAgICAgICAgICAncmVjb21tZW5kZWQgdGhhdCBib3RoXG4nCisgICAgICAgICAgICAgICAgICAgJ21hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZSAiX19pdGVyX18oKSIgbWV0aG9kICcKKyAgICAgICAgICAgICAgICAgICAndG8gYWxsb3dcbicKKyAgICAgICAgICAgICAgICAgICAnZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgJworICAgICAgICAgICAgICAgICAgICciX19pdGVyX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlIHRoZSBzYW1lIGFzICJrZXlzKCkiOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgJworICAgICAgICAgICAgICAgICAgICdpdGVyYXRlXG4nCisgICAgICAgICAgICAgICAgICAgJ3Rocm91Z2ggdGhlIHZhbHVlcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlbl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiAibGVuKCkiLiAgJworICAgICAgICAgICAgICAgICAgICdTaG91bGQgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciAiPj0iIDAuICBBbHNvLCBhbiAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdCB0aGF0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRvZXNuXCd0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICcKKyAgICAgICAgICAgICAgICAgICAnIl9fbGVuX18oKSIgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJldHVybnMgemVybyBpcyBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGluIGEgQm9vbGVhbiAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnRleHQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19sZW5ndGhfaGludF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5sZW5ndGhfaGludCgpIi4gU2hvdWxkICcKKyAgICAgICAgICAgICAgICAgICAncmV0dXJuIGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyICcKKyAgICAgICAgICAgICAgICAgICAnb3IgbGVzcyB0aGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBhY3R1YWwgbGVuZ3RoKS4gVGhlIGxlbmd0aCBtdXN0IGJlIGFuIGludGVnZXIgIj49IiAnCisgICAgICAgICAgICAgICAgICAgJzAuIFRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIHB1cmVseSBhbiBvcHRpbWl6YXRpb24gYW5kIGlzIG5ldmVyIHJlcXVpcmVkICcKKyAgICAgICAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvcnJlY3RuZXNzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy40LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnTm90ZTogU2xpY2luZyBpcyBkb25lIGV4Y2x1c2l2ZWx5IHdpdGggdGhlIGZvbGxvd2luZyB0aHJlZSAnCisgICAgICAgICAgICAgICAgICAgJ21ldGhvZHMuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgQSBjYWxsIGxpa2VcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgYVsxOjJdID0gYlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICBpcyB0cmFuc2xhdGVkIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICBhbmQgc28gZm9ydGguICBNaXNzaW5nIHNsaWNlIGl0ZW1zIGFyZSBhbHdheXMgZmlsbGVkIGluICcKKyAgICAgICAgICAgICAgICAgICAnd2l0aCAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mICJzZWxmW2tleV0iLiBGb3IgJworICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZSB0eXBlcyxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdHMuICBOb3RlIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgaW5kZXhlcyAoaWYgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnY2xhc3Mgd2lzaGVzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGUgJworICAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSIgbWV0aG9kLiBJZlxuJworICAgICAgICAgICAgICAgICAgICcgICAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZSAnCisgICAgICAgICAgICAgICAgICAgJ3JhaXNlZDsgaWYgb2ZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2YgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAnKGFmdGVyIGFueVxuJworICAgICAgICAgICAgICAgICAgICcgICBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIHZhbHVlcyksICcKKyAgICAgICAgICAgICAgICAgICAnIkluZGV4RXJyb3IiIHNob3VsZCBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICByYWlzZWQuIEZvciBtYXBwaW5nIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29udGFpbmVyKSwgIktleUVycm9yIiBzaG91bGQgYmUgcmFpc2VkLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTm90ZTogImZvciIgbG9vcHMgZXhwZWN0IHRoYXQgYW4gIkluZGV4RXJyb3IiIHdpbGwgYmUgJworICAgICAgICAgICAgICAgICAgICdyYWlzZWQgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCAnCisgICAgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICAgIHNlcXVlbmNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbWlzc2luZ19fKHNlbGYsIGtleSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAnCisgICAgICAgICAgICAgICAgICAgJyJzZWxmW2tleV0iIGZvciBkaWN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHN1YmNsYXNzZXMgd2hlbiBrZXkgaXMgbm90IGluIHRoZSBkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lICcKKyAgICAgICAgICAgICAgICAgICAnbm90ZSBhcyBmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIl9fZ2V0aXRlbV9fKCkiLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgJworICAgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBpZlxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgJworICAgICAgICAgICAgICAgICAgICdpZiBuZXcga2V5c1xuJworICAgICAgICAgICAgICAgICAgICcgICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlICcKKyAgICAgICAgICAgICAgICAgICAncmVwbGFjZWQuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqICcKKyAgICAgICAgICAgICAgICAgICAndmFsdWVzIGFzIGZvclxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mICJzZWxmW2tleV0iLiAgU2FtZSBub3RlICcKKyAgICAgICAgICAgICAgICAgICAnYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJfX2dldGl0ZW1fXygpIi4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yICcKKyAgICAgICAgICAgICAgICAgICAnbWFwcGluZ3MgaWZcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgJworICAgICAgICAgICAgICAgICAgICdpZiBlbGVtZW50c1xuJworICAgICAgICAgICAgICAgICAgICcgICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgJworICAgICAgICAgICAgICAgICAgICdzaG91bGQgYmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdvYmplY3QuX19pdGVyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciAnCisgICAgICAgICAgICAgICAgICAgJ2EgY29udGFpbmVyLlxuJworICAgICAgICAgICAgICAgICAgICcgICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAnY2FuIGl0ZXJhdGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgJworICAgICAgICAgICAgICAgICAgICdpdCBzaG91bGRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJdGVyYXRvciBvYmplY3RzIGFsc28gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2Q7ICcKKyAgICAgICAgICAgICAgICAgICAndGhleSBhcmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiAnCisgICAgICAgICAgICAgICAgICAgJ2l0ZXJhdG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG9iamVjdHMsIHNlZSBJdGVyYXRvciBUeXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JldmVyc2VkX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlICJyZXZlcnNlZCgpIiBidWlsdC1pbiB0byAnCisgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAgICcgICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3IgJworICAgICAgICAgICAgICAgICAgICdvYmplY3QgdGhhdFxuJworICAgICAgICAgICAgICAgICAgICcgICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluICcKKyAgICAgICAgICAgICAgICAgICAncmV2ZXJzZSBvcmRlci5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIElmIHRoZSAiX19yZXZlcnNlZF9fKCkiIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJyJyZXZlcnNlZCgpIlxuJworICAgICAgICAgICAgICAgICAgICcgICBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgJworICAgICAgICAgICAgICAgICAgICcoIl9fbGVuX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kICJfX2dldGl0ZW1fXygpIikuICBPYmplY3RzIHRoYXQgc3VwcG9ydCB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZSBwcm90b2NvbFxuJworICAgICAgICAgICAgICAgICAgICcgICBzaG91bGQgb25seSBwcm92aWRlICJfX3JldmVyc2VkX18oKSIgaWYgdGhleSBjYW4gJworICAgICAgICAgICAgICAgICAgICdwcm92aWRlIGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudGF0aW9uIHRoYXQgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lICcKKyAgICAgICAgICAgICAgICAgICAncHJvdmlkZWQgYnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgInJldmVyc2VkKCkiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKCJpbiIgYW5kICJub3QgaW4iKSBhcmUgJworICAgICAgICAgICAgICAgICAgICdub3JtYWxseVxuJworICAgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgJworICAgICAgICAgICAgICAgICAgICdjb250YWluZXJcbicKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhICcKKyAgICAgICAgICAgICAgICAgICAnbW9yZSBlZmZpY2llbnRcbicKKyAgICAgICAgICAgICAgICAgICAnaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlICcKKyAgICAgICAgICAgICAgICAgICAnYSBzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybiB0cnVlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nICcKKyAgICAgICAgICAgICAgICAgICAnb2JqZWN0cywgdGhpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAndmFsdWVzIG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZSBrZXktaXRlbSBwYWlycy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEZvciBvYmplY3RzIHRoYXQgZG9uXCd0IGRlZmluZSAiX19jb250YWluc19fKCkiLCB0aGUgJworICAgICAgICAgICAgICAgICAgICdtZW1iZXJzaGlwIHRlc3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSAiX19pdGVyX18oKSIsIHRoZW4gdGhlIG9sZCAnCisgICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgIl9fZ2V0aXRlbV9fKCkiLCBzZWUgdGhpcyAnCisgICAgICAgICAgICAgICAgICAgJ3NlY3Rpb24gaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGxhbmd1YWdlIHJlZmVyZW5jZS5cbicsCisgJ3NoaWZ0aW5nJzogJ1xuJworICAgICAgICAgICAgICdTaGlmdGluZyBvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBzaGlmdGluZyBvcGVyYXRpb25zIGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgYXJpdGhtZXRpY1xuJworICAgICAgICAgICAgICdvcGVyYXRpb25zOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgc2hpZnRfZXhwciA6Oj0gYV9leHByIHwgc2hpZnRfZXhwciAoICI8PCIgfCAiPj4iICkgYV9leHByXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGVzZSBvcGVyYXRvcnMgYWNjZXB0IGludGVnZXJzIGFzIGFyZ3VtZW50cy4gIFRoZXkgc2hpZnQgdGhlICcKKyAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAnYXJndW1lbnQgdG8gdGhlIGxlZnQgb3IgcmlnaHQgYnkgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIGJ5ICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJ3NlY29uZCBhcmd1bWVudC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0EgcmlnaHQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBmbG9vciBkaXZpc2lvbiBieSAnCisgICAgICAgICAgICAgJyJwb3coMixuKSIuXG4nCisgICAgICAgICAgICAgJ0EgbGVmdCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIG11bHRpcGxpY2F0aW9uIHdpdGggJworICAgICAgICAgICAgICcicG93KDIsbikiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTm90ZTogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgaXNcbicKKyAgICAgICAgICAgICAnICByZXF1aXJlZCB0byBiZSBhdCBtb3N0ICJzeXMubWF4c2l6ZSIuICBJZiB0aGUgcmlnaHQtaGFuZCAnCisgICAgICAgICAgICAgJ29wZXJhbmQgaXNcbicKKyAgICAgICAgICAgICAnICBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiIGFuICJPdmVyZmxvd0Vycm9yIiBleGNlcHRpb24gaXMgJworICAgICAgICAgICAgICdyYWlzZWQuXG4nLAorICdzbGljaW5ncyc6ICdcbicKKyAgICAgICAgICAgICAnU2xpY2luZ3NcbicKKyAgICAgICAgICAgICAnKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0Egc2xpY2luZyBzZWxlY3RzIGEgcmFuZ2Ugb2YgaXRlbXMgaW4gYSBzZXF1ZW5jZSBvYmplY3QgKGUuZy4sICcKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICdzdHJpbmcsIHR1cGxlIG9yIGxpc3QpLiAgU2xpY2luZ3MgbWF5IGJlIHVzZWQgYXMgZXhwcmVzc2lvbnMgb3IgJworICAgICAgICAgICAgICdhc1xuJworICAgICAgICAgICAgICd0YXJnZXRzIGluIGFzc2lnbm1lbnQgb3IgImRlbCIgc3RhdGVtZW50cy4gIFRoZSBzeW50YXggZm9yIGEgJworICAgICAgICAgICAgICdzbGljaW5nOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgc2xpY2luZyAgICAgIDo6PSBwcmltYXJ5ICJbIiBzbGljZV9saXN0ICJdIlxuJworICAgICAgICAgICAgICcgICBzbGljZV9saXN0ICAgOjo9IHNsaWNlX2l0ZW0gKCIsIiBzbGljZV9pdGVtKSogWyIsIl1cbicKKyAgICAgICAgICAgICAnICAgc2xpY2VfaXRlbSAgIDo6PSBleHByZXNzaW9uIHwgcHJvcGVyX3NsaWNlXG4nCisgICAgICAgICAgICAgJyAgIHByb3Blcl9zbGljZSA6Oj0gW2xvd2VyX2JvdW5kXSAiOiIgW3VwcGVyX2JvdW5kXSBbICI6IiAnCisgICAgICAgICAgICAgJ1tzdHJpZGVdIF1cbicKKyAgICAgICAgICAgICAnICAgbG93ZXJfYm91bmQgIDo6PSBleHByZXNzaW9uXG4nCisgICAgICAgICAgICAgJyAgIHVwcGVyX2JvdW5kICA6Oj0gZXhwcmVzc2lvblxuJworICAgICAgICAgICAgICcgICBzdHJpZGUgICAgICAgOjo9IGV4cHJlc3Npb25cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZXJlIGlzIGFtYmlndWl0eSBpbiB0aGUgZm9ybWFsIHN5bnRheCBoZXJlOiBhbnl0aGluZyB0aGF0ICcKKyAgICAgICAgICAgICAnbG9va3MgbGlrZVxuJworICAgICAgICAgICAgICdhbiBleHByZXNzaW9uIGxpc3QgYWxzbyBsb29rcyBsaWtlIGEgc2xpY2UgbGlzdCwgc28gYW55ICcKKyAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uXG4nCisgICAgICAgICAgICAgJ2NhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNsaWNpbmcuICBSYXRoZXIgdGhhbiBmdXJ0aGVyICcKKyAgICAgICAgICAgICAnY29tcGxpY2F0aW5nIHRoZVxuJworICAgICAgICAgICAgICdzeW50YXgsIHRoaXMgaXMgZGlzYW1iaWd1YXRlZCBieSBkZWZpbmluZyB0aGF0IGluIHRoaXMgY2FzZSB0aGVcbicKKyAgICAgICAgICAgICAnaW50ZXJwcmV0YXRpb24gYXMgYSBzdWJzY3JpcHRpb24gdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGVcbicKKyAgICAgICAgICAgICAnaW50ZXJwcmV0YXRpb24gYXMgYSBzbGljaW5nICh0aGlzIGlzIHRoZSBjYXNlIGlmIHRoZSBzbGljZSBsaXN0XG4nCisgICAgICAgICAgICAgJ2NvbnRhaW5zIG5vIHByb3BlciBzbGljZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgc2VtYW50aWNzIGZvciBhIHNsaWNpbmcgYXJlIGFzIGZvbGxvd3MuICBUaGUgcHJpbWFyeSBpcyAnCisgICAgICAgICAgICAgJ2luZGV4ZWRcbicKKyAgICAgICAgICAgICAnKHVzaW5nIHRoZSBzYW1lICJfX2dldGl0ZW1fXygpIiBtZXRob2QgYXMgbm9ybWFsIHN1YnNjcmlwdGlvbikgJworICAgICAgICAgICAgICd3aXRoIGFcbicKKyAgICAgICAgICAgICAna2V5IHRoYXQgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgc2xpY2UgbGlzdCwgYXMgZm9sbG93cy4gIElmIHRoZSAnCisgICAgICAgICAgICAgJ3NsaWNlXG4nCisgICAgICAgICAgICAgJ2xpc3QgY29udGFpbnMgYXQgbGVhc3Qgb25lIGNvbW1hLCB0aGUga2V5IGlzIGEgdHVwbGUgY29udGFpbmluZyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdjb252ZXJzaW9uIG9mIHRoZSBzbGljZSBpdGVtczsgb3RoZXJ3aXNlLCB0aGUgY29udmVyc2lvbiBvZiB0aGUgJworICAgICAgICAgICAgICdsb25lXG4nCisgICAgICAgICAgICAgJ3NsaWNlIGl0ZW0gaXMgdGhlIGtleS4gIFRoZSBjb252ZXJzaW9uIG9mIGEgc2xpY2UgaXRlbSB0aGF0IGlzICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnZXhwcmVzc2lvbiBpcyB0aGF0IGV4cHJlc3Npb24uICBUaGUgY29udmVyc2lvbiBvZiBhIHByb3BlciBzbGljZSAnCisgICAgICAgICAgICAgJ2lzIGFcbicKKyAgICAgICAgICAgICAnc2xpY2Ugb2JqZWN0IChzZWUgc2VjdGlvbiBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkpIHdob3NlICcKKyAgICAgICAgICAgICAnInN0YXJ0IixcbicKKyAgICAgICAgICAgICAnInN0b3AiIGFuZCAic3RlcCIgYXR0cmlidXRlcyBhcmUgdGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgJworICAgICAgICAgICAgICdnaXZlblxuJworICAgICAgICAgICAgICdhcyBsb3dlciBib3VuZCwgdXBwZXIgYm91bmQgYW5kIHN0cmlkZSwgcmVzcGVjdGl2ZWx5LCAnCisgICAgICAgICAgICAgJ3N1YnN0aXR1dGluZ1xuJworICAgICAgICAgICAgICciTm9uZSIgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbnMuXG4nLAorICdzcGVjaWFsYXR0cnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICdTcGVjaWFsIEF0dHJpYnV0ZXNcbicKKyAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzICcKKyAgICAgICAgICAgICAgICAgJ3RvIHNldmVyYWxcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdCB0eXBlcywgd2hlcmUgdGhleSBhcmUgcmVsZXZhbnQuICBTb21lIG9mIHRoZXNlIGFyZSAnCisgICAgICAgICAgICAgICAgICdub3QgcmVwb3J0ZWRcbicKKyAgICAgICAgICAgICAgICAgJ2J5IHRoZSAiZGlyKCkiIGJ1aWx0LWluIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kaWN0X19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQSBkaWN0aW9uYXJ5IG9yIG90aGVyIG1hcHBpbmcgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gJworICAgICAgICAgICAgICAgICAib2JqZWN0J3NcbiIKKyAgICAgICAgICAgICAgICAgJyAgICh3cml0YWJsZSkgYXR0cmlidXRlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2UuX19jbGFzc19fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSBjbGFzcyB0byB3aGljaCBhIGNsYXNzIGluc3RhbmNlIGJlbG9uZ3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fYmFzZXNfX1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIG9mIGEgY2xhc3Mgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdkZWZpbml0aW9uLl9fbmFtZV9fXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcywgZnVuY3Rpb24sIG1ldGhvZCwgZGVzY3JpcHRvciwgb3IgJworICAgICAgICAgICAgICAgICAnZ2VuZXJhdG9yXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbi5fX3F1YWxuYW1lX19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlICpxdWFsaWZpZWQgbmFtZSogb2YgdGhlIGNsYXNzLCBmdW5jdGlvbiwgbWV0aG9kLCAnCisgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yLCBvclxuJworICAgICAgICAgICAgICAgICAnICAgZ2VuZXJhdG9yIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fbXJvX19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBhdHRyaWJ1dGUgaXMgYSB0dXBsZSBvZiBjbGFzc2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgJworICAgICAgICAgICAgICAgICAnd2hlblxuJworICAgICAgICAgICAgICAgICAnICAgbG9va2luZyBmb3IgYmFzZSBjbGFzc2VzIGR1cmluZyBtZXRob2QgcmVzb2x1dGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnY2xhc3MubXJvKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBtZXRhY2xhc3MgdG8gY3VzdG9taXplICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgZm9yIGl0cyBpbnN0YW5jZXMuICBJdCBpcyBjYWxsZWQgJworICAgICAgICAgICAgICAgICAnYXQgY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RhbnRpYXRpb24sIGFuZCBpdHMgcmVzdWx0IGlzIHN0b3JlZCBpbiAiX19tcm9fXyIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9fc3ViY2xhc3Nlc19fKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgRWFjaCBjbGFzcyBrZWVwcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIGl0cyAnCisgICAgICAgICAgICAgICAgICdpbW1lZGlhdGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN1YmNsYXNzZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2UgJworICAgICAgICAgICAgICAgICAncmVmZXJlbmNlc1xuJworICAgICAgICAgICAgICAgICAnICAgc3RpbGwgYWxpdmUuIEV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBpbnQuX19zdWJjbGFzc2VzX18oKVxuJworICAgICAgICAgICAgICAgICAiICAgICAgWzxjbGFzcyAnYm9vbCc+XVxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICctWyBGb290bm90ZXMgXS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnWzFdIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlc2Ugc3BlY2lhbCBtZXRob2RzIG1heSBiZSAnCisgICAgICAgICAgICAgICAgICdmb3VuZFxuJworICAgICAgICAgICAgICAgICAnICAgIGluIHRoZSBQeXRob24gUmVmZXJlbmNlIE1hbnVhbCAoQmFzaWMgY3VzdG9taXphdGlvbikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1syXSBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgbGlzdCAiWzEsIDJdIiBpcyBjb25zaWRlcmVkIGVxdWFsICcKKyAgICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAgICcgICAgIlsxLjAsIDIuMF0iLCBhbmQgc2ltaWxhcmx5IGZvciB0dXBsZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIlszXSBUaGV5IG11c3QgaGF2ZSBzaW5jZSB0aGUgcGFyc2VyIGNhbid0IHRlbGwgdGhlIHR5cGUgb2YgIgorICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAgb3BlcmFuZHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1s0XSBDYXNlZCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoIGdlbmVyYWwgY2F0ZWdvcnkgJworICAgICAgICAgICAgICAgICAncHJvcGVydHlcbicKKyAgICAgICAgICAgICAgICAgJyAgICBiZWluZyBvbmUgb2YgIkx1IiAoTGV0dGVyLCB1cHBlcmNhc2UpLCAiTGwiIChMZXR0ZXIsICcKKyAgICAgICAgICAgICAgICAgJ2xvd2VyY2FzZSksXG4nCisgICAgICAgICAgICAgICAgICcgICAgb3IgIkx0IiAoTGV0dGVyLCB0aXRsZWNhc2UpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdbNV0gVG8gZm9ybWF0IG9ubHkgYSB0dXBsZSB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBwcm92aWRlIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgICBzaW5nbGV0b24gdHVwbGUgd2hvc2Ugb25seSBlbGVtZW50IGlzIHRoZSB0dXBsZSB0byBiZSAnCisgICAgICAgICAgICAgICAgICdmb3JtYXR0ZWQuXG4nLAorICdzcGVjaWFsbmFtZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICdTcGVjaWFsIG1ldGhvZCBuYW1lc1xuJworICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQSBjbGFzcyBjYW4gaW1wbGVtZW50IGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBpbnZva2VkIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAgJ3N5bnRheCAoc3VjaCBhcyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb3Igc3Vic2NyaXB0aW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICdzbGljaW5nKSBieVxuJworICAgICAgICAgICAgICAgICAiZGVmaW5pbmcgbWV0aG9kcyB3aXRoIHNwZWNpYWwgbmFtZXMuIFRoaXMgaXMgUHl0aG9uJ3MgIgorICAgICAgICAgICAgICAgICAnYXBwcm9hY2ggdG9cbicKKyAgICAgICAgICAgICAgICAgJypvcGVyYXRvciBvdmVybG9hZGluZyosIGFsbG93aW5nIGNsYXNzZXMgdG8gZGVmaW5lIHRoZWlyIG93biAnCisgICAgICAgICAgICAgICAgICdiZWhhdmlvclxuJworICAgICAgICAgICAgICAgICAnd2l0aCByZXNwZWN0IHRvIGxhbmd1YWdlIG9wZXJhdG9ycy4gIEZvciBpbnN0YW5jZSwgaWYgYSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyBkZWZpbmVzXG4nCisgICAgICAgICAgICAgICAgICdhIG1ldGhvZCBuYW1lZCAiX19nZXRpdGVtX18oKSIsIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgJworICAgICAgICAgICAgICAgICAndGhpcyBjbGFzcyxcbicKKyAgICAgICAgICAgICAgICAgJ3RoZW4gInhbaV0iIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byAidHlwZSh4KS5fX2dldGl0ZW1fXyh4LCAnCisgICAgICAgICAgICAgICAgICdpKSIuXG4nCisgICAgICAgICAgICAgICAgICdFeGNlcHQgd2hlcmUgbWVudGlvbmVkLCBhdHRlbXB0cyB0byBleGVjdXRlIGFuIG9wZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICdyYWlzZSBhblxuJworICAgICAgICAgICAgICAgICAnZXhjZXB0aW9uIHdoZW4gbm8gYXBwcm9wcmlhdGUgbWV0aG9kIGlzIGRlZmluZWQgKHR5cGljYWxseVxuJworICAgICAgICAgICAgICAgICAnIkF0dHJpYnV0ZUVycm9yIiBvciAiVHlwZUVycm9yIikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1doZW4gaW1wbGVtZW50aW5nIGEgY2xhc3MgdGhhdCBlbXVsYXRlcyBhbnkgYnVpbHQtaW4gdHlwZSwgJworICAgICAgICAgICAgICAgICAnaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgJ2ltcG9ydGFudCB0aGF0IHRoZSBlbXVsYXRpb24gb25seSBiZSBpbXBsZW1lbnRlZCB0byB0aGUgJworICAgICAgICAgICAgICAgICAnZGVncmVlIHRoYXQgaXRcbicKKyAgICAgICAgICAgICAgICAgJ21ha2VzIHNlbnNlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG1vZGVsbGVkLiAgRm9yIGV4YW1wbGUsICcKKyAgICAgICAgICAgICAgICAgJ3NvbWVcbicKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsIG9mIGluZGl2aWR1YWwgJworICAgICAgICAgICAgICAgICAnZWxlbWVudHMsIGJ1dFxuJworICAgICAgICAgICAgICAgICAnZXh0cmFjdGluZyBhIHNsaWNlIG1heSBub3QgbWFrZSBzZW5zZS4gIChPbmUgZXhhbXBsZSBvZiB0aGlzICcKKyAgICAgICAgICAgICAgICAgJ2lzIHRoZVxuJworICAgICAgICAgICAgICAgICAnIk5vZGVMaXN0IiBpbnRlcmZhY2UgaW4gdGhlIFczQ1wncyBEb2N1bWVudCBPYmplY3QgTW9kZWwuKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0Jhc2ljIGN1c3RvbWl6YXRpb25cbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gICcKKyAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiIGlzIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgJworICAgICAgICAgICAgICAgICAnYXMgc3VjaClcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgJworICAgICAgICAgICAgICAgICAnYXMgaXRzXG4nCisgICAgICAgICAgICAgICAgICcgICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgJworICAgICAgICAgICAgICAgICAndG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gICcKKyAgICAgICAgICAgICAgICAgJ1RoZSByZXR1cm5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlIG9mICJfX25ld19fKCkiIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICcodXN1YWxseSBhblxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2Ugb2YgKmNscyopLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBpbnZva2luZyB0aGUgc3VwZXJjbGFzc1wncyAiX19uZXdfXygpIiBtZXRob2QgdXNpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICJzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKSIgd2l0aCAnCisgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdhc1xuJworICAgICAgICAgICAgICAgICAnICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmICJfX25ld19fKCkiIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ25ld1xuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuJworICAgICAgICAgICAgICAgICAnICAgIl9faW5pdF9fKHNlbGZbLCAuLi5dKSIsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2FuZCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvICcKKyAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiAiX19uZXdfXygpIiBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gJworICAgICAgICAgICAgICAgICAndGhlIG5ld1xuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VcJ3MgIl9faW5pdF9fKCkiIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19uZXdfXygpIiBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiAnCisgICAgICAgICAgICAgICAgICdpbW11dGFibGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2NyZWF0aW9uLiAgSXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGlzIGFsc28gY29tbW9ubHkgb3ZlcnJpZGRlbiBpbiBjdXN0b20gbWV0YWNsYXNzZXMgaW4gJworICAgICAgICAgICAgICAgICAnb3JkZXIgdG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW5pdF9fKHNlbGZbLCAuLi5dKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYWZ0ZXIgdGhlIGluc3RhbmNlIGhhcyBiZWVuIGNyZWF0ZWQgKGJ5ICcKKyAgICAgICAgICAgICAgICAgJyJfX25ld19fKCkiKSwgYnV0XG4nCisgICAgICAgICAgICAgICAgICcgICBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBhcmd1bWVudHMgYXJlICcKKyAgICAgICAgICAgICAgICAgJ3Rob3NlXG4nCisgICAgICAgICAgICAgICAgICcgICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgJworICAgICAgICAgICAgICAgICAnY2xhc3MgaGFzIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19pbml0X18oKSIgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyAiX19pbml0X18oKSIgJworICAgICAgICAgICAgICAgICAnbWV0aG9kLCBpZlxuJworICAgICAgICAgICAgICAgICAnICAgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyICcKKyAgICAgICAgICAgICAgICAgJ2luaXRpYWxpemF0aW9uIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICcgICAiQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBCZWNhdXNlICJfX25ld19fKCkiIGFuZCAiX19pbml0X18oKSIgd29yayB0b2dldGhlciBpbiAnCisgICAgICAgICAgICAgICAgICdjb25zdHJ1Y3RpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdHMgKCJfX25ld19fKCkiIHRvIGNyZWF0ZSBpdCwgYW5kICJfX2luaXRfXygpIiB0byAnCisgICAgICAgICAgICAgICAgICdjdXN0b21pc2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0KSwgbm8gbm9uLSJOb25lIiB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQgYnkgIl9faW5pdF9fKCkiOyAnCisgICAgICAgICAgICAgICAgICdkb2luZyBzb1xuJworICAgICAgICAgICAgICAgICAnICAgd2lsbCBjYXVzZSBhICJUeXBlRXJyb3IiIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICdpcyBhbHNvXG4nCisgICAgICAgICAgICAgICAgICcgICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhICJfX2RlbF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZCwgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBkZXJpdmVkIGNsYXNzXCdzICJfX2RlbF9fKCkiIG1ldGhvZCwgaWYgYW55LCBtdXN0ICcKKyAgICAgICAgICAgICAgICAgJ2V4cGxpY2l0bHkgY2FsbCBpdFxuJworICAgICAgICAgICAgICAgICAnICAgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvciAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2RlbF9fKCkiIG1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2UgYnlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCBhdCAnCisgICAgICAgICAgICAgICAgICdhIGxhdGVyXG4nCisgICAgICAgICAgICAgICAgICcgICB0aW1lIHdoZW4gdGhpcyBuZXcgcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAnZ3VhcmFudGVlZCB0aGF0XG4nCisgICAgICAgICAgICAgICAgICcgICAiX19kZWxfXygpIiBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCAnCisgICAgICAgICAgICAgICAgICdleGlzdCB3aGVuXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6ICJkZWwgeCIgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCAieC5fX2RlbF9fKCkiIC0tLSAnCisgICAgICAgICAgICAgICAgICd0aGUgZm9ybWVyXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgIngiIGJ5IG9uZSwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICdsYXR0ZXIgaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgb25seSBjYWxsZWQgd2hlbiAieCJcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gICcKKyAgICAgICAgICAgICAgICAgJ1NvbWUgY29tbW9uXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdCBmcm9tXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdHMgKGUuZy4sXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoICcKKyAgICAgICAgICAgICAgICAgJ3BhcmVudCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayAnCisgICAgICAgICAgICAgICAgICdmcmFtZSBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFjayAnCisgICAgICAgICAgICAgICAgICdzdG9yZWQgaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5leGNfaW5mbygpWzJdIiBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpOyBvciBhICcKKyAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZVxuJworICAgICAgICAgICAgICAgICAnICAgICB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSB0aGF0IHJhaXNlZCBhbiAnCisgICAgICAgICAgICAgICAgICd1bmhhbmRsZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgZXhjZXB0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJzeXMubGFzdF90cmFjZWJhY2siIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgJworICAgICAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgJworICAgICAgICAgICAgICAgICAndGhlIGN5Y2xlcztcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdGhlIHNlY29uZCBjYW4gYmUgcmVzb2x2ZWQgYnkgZnJlZWluZyB0aGUgcmVmZXJlbmNlIHRvICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgICB0cmFjZWJhY2sgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWZ1bCwgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICd0aGlyZCBjYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyAiTm9uZSIgaW4gInN5cy5sYXN0X3RyYWNlYmFjayIuICcKKyAgICAgICAgICAgICAgICAgJ0NpcmN1bGFyXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIGFuZCBjbGVhbmVkICcKKyAgICAgICAgICAgICAgICAgJ3VwIHdoZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICIgICAgIGN5Y2xpYyBnYXJiYWdlIGNvbGxlY3RvciBpcyBlbmFibGVkIChpdCdzIG9uIGJ5ICIKKyAgICAgICAgICAgICAgICAgJ2RlZmF1bHQpLiBSZWZlclxuJworICAgICAgICAgICAgICAgICAnICAgICB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlICJnYyIgbW9kdWxlIGZvciBtb3JlICcKKyAgICAgICAgICAgICAgICAgJ2luZm9ybWF0aW9uXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGFib3V0IHRoaXMgdG9waWMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJfX2RlbF9fKCkiIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciAnCisgICAgICAgICAgICAgICAgICdkdXJpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdGhlaXIgZXhlY3V0aW9uIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgJworICAgICAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgInN5cy5zdGRlcnIiIGluc3RlYWQuIEFsc28sIHdoZW4gIl9fZGVsX18oKSIgaXMgaW52b2tlZCAnCisgICAgICAgICAgICAgICAgICdpblxuJworICAgICAgICAgICAgICAgICAnICAgICByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZyBkZWxldGVkIChlLmcuLCB3aGVuICcKKyAgICAgICAgICAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXIgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICciX19kZWxfXygpIlxuJworICAgICAgICAgICAgICAgICAnICAgICBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3MgJworICAgICAgICAgICAgICAgICAnb2YgYmVpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdG9ybiBkb3duIChlLmcuIHRoZSBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgJworICAgICAgICAgICAgICAgICAnRm9yIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgcmVhc29uLCAiX19kZWxfXygpIiBtZXRob2RzIHNob3VsZCBkbyB0aGUgYWJzb2x1dGUgJworICAgICAgICAgICAgICAgICAnbWluaW11bSBuZWVkZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgdG8gbWFpbnRhaW4gZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAnCisgICAgICAgICAgICAgICAgICcxLjUsXG4nCisgICAgICAgICAgICAgICAgICcgICAgIFB5dGhvbiBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGEgJworICAgICAgICAgICAgICAgICAnc2luZ2xlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHVuZGVyc2NvcmUgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpciBtb2R1bGUgYmVmb3JlIG90aGVyICcKKyAgICAgICAgICAgICAgICAgJ2dsb2JhbHMgYXJlXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCAnCisgICAgICAgICAgICAgICAgICd0aGlzIG1heVxuJworICAgICAgICAgICAgICAgICAnICAgICBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgJworICAgICAgICAgICAgICAgICAnYXZhaWxhYmxlIGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICB0aW1lIHdoZW4gdGhlICJfX2RlbF9fKCkiIG1ldGhvZCBpcyBjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JlcHJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgYnkgdGhlICJyZXByKCkiIGJ1aWx0LWluIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJvZmZpY2lhbCJcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsICcKKyAgICAgICAgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBsb29rIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlICcKKyAgICAgICAgICAgICAgICAgJ3VzZWQgdG9cbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlY3JlYXRlIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiAnCisgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgZW52aXJvbm1lbnQpLiAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdmb3JtXG4nCisgICAgICAgICAgICAgICAgICcgICAiPC4uLnNvbWUgdXNlZnVsIGRlc2NyaXB0aW9uLi4uPiIgc2hvdWxkIGJlIHJldHVybmVkLiBUaGUgJworICAgICAgICAgICAgICAgICAncmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgJyJfX3JlcHJfXygpIiBidXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vdCAiX19zdHJfXygpIiwgdGhlbiAiX19yZXByX18oKSIgaXMgYWxzbyB1c2VkIHdoZW4gYW4gJworICAgICAgICAgICAgICAgICAnImluZm9ybWFsIlxuJworICAgICAgICAgICAgICAgICAnICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzICcKKyAgICAgICAgICAgICAgICAgJ3JlcXVpcmVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCAnCisgICAgICAgICAgICAgICAgICd0aGF0IHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgcmVwcmVzZW50YXRpb24gaXMgaW5mb3JtYXRpb24tcmljaCBhbmQgdW5hbWJpZ3VvdXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3N0cl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAic3RyKG9iamVjdCkiIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zICcKKyAgICAgICAgICAgICAgICAgJyJmb3JtYXQoKSIgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAicHJpbnQoKSIgdG8gY29tcHV0ZSB0aGUgImluZm9ybWFsIiBvciBuaWNlbHkgcHJpbnRhYmxlICcKKyAgICAgICAgICAgICAgICAgJ3N0cmluZ1xuJworICAgICAgICAgICAgICAgICAnICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGEgJworICAgICAgICAgICAgICAgICAnc3RyaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSAib2JqZWN0Ll9fcmVwcl9fKCkiIGluIHRoYXQgJworICAgICAgICAgICAgICAgICAndGhlcmUgaXMgbm9cbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4cGVjdGF0aW9uIHRoYXQgIl9fc3RyX18oKSIgcmV0dXJuIGEgdmFsaWQgUHl0aG9uICcKKyAgICAgICAgICAgICAgICAgJ2V4cHJlc3Npb246IGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlIHJlcHJlc2VudGF0aW9uIGNhbiBiZSB1c2VkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJ5IHRoZSBidWlsdC1pbiB0eXBlICcKKyAgICAgICAgICAgICAgICAgJyJvYmplY3QiXG4nCisgICAgICAgICAgICAgICAgICcgICBjYWxscyAib2JqZWN0Ll9fcmVwcl9fKCkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ieXRlc19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAiYnl0ZXMoKSIgdG8gY29tcHV0ZSBhIGJ5dGUtc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgJ3JlcHJlc2VudGF0aW9uIG9mIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QuIFRoaXMgc2hvdWxkIHJldHVybiBhICJieXRlcyIgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIGJ5IHRoZSAiZm9ybWF0KCkiIGJ1aWx0LWluIGZ1bmN0aW9uLCBhbmQgYnkgJworICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9uLFxuJworICAgICAgICAgICAgICAgICAnICAgZXZhbHVhdGlvbiBvZiBmb3JtYXR0ZWQgc3RyaW5nIGxpdGVyYWxzIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAnInN0ci5mb3JtYXQoKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCwgdG8gcHJvZHVjZSBhICJmb3JtYXR0ZWQiIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiAnCisgICAgICAgICAgICAgICAgICdhblxuJworICAgICAgICAgICAgICAgICAnICAgb2JqZWN0LiBUaGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyBhIHN0cmluZyB0aGF0ICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRhaW5zIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgZGVzaXJlZC4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ2ludGVycHJldGF0aW9uXG4nCisgICAgICAgICAgICAgICAgICcgICBvZiB0aGUgImZvcm1hdF9zcGVjIiBhcmd1bWVudCBpcyB1cCB0byB0aGUgdHlwZSAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2Zvcm1hdF9fKCkiLCBob3dldmVyIG1vc3QgY2xhc3NlcyB3aWxsIGVpdGhlciAnCisgICAgICAgICAgICAgICAgICdkZWxlZ2F0ZVxuJworICAgICAgICAgICAgICAgICAnICAgZm9ybWF0dGluZyB0byBvbmUgb2YgdGhlIGJ1aWx0LWluIHR5cGVzLCBvciB1c2UgYSAnCisgICAgICAgICAgICAgICAgICdzaW1pbGFyXG4nCisgICAgICAgICAgICAgICAgICcgICBmb3JtYXR0aW5nIG9wdGlvbiBzeW50YXguXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFNlZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIGZvciBhIGRlc2NyaXB0aW9uICcKKyAgICAgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgc3RhbmRhcmQgZm9ybWF0dGluZyBzeW50YXguXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvYmplY3QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjQ6IFRoZSBfX2Zvcm1hdF9fIG1ldGhvZCBvZiAib2JqZWN0IiAnCisgICAgICAgICAgICAgICAgICdpdHNlbGZcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJhaXNlcyBhICJUeXBlRXJyb3IiIGlmIHBhc3NlZCBhbnkgbm9uLWVtcHR5IHN0cmluZy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLiBUaGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzICcKKyAgICAgICAgICAgICAgICAgJ2lzIGFzXG4nCisgICAgICAgICAgICAgICAgICcgICBmb2xsb3dzOiAieDx5IiBjYWxscyAieC5fX2x0X18oeSkiLCAieDw9eSIgY2FsbHMgJworICAgICAgICAgICAgICAgICAnInguX19sZV9fKHkpIixcbicKKyAgICAgICAgICAgICAgICAgJyAgICJ4PT15IiBjYWxscyAieC5fX2VxX18oeSkiLCAieCE9eSIgY2FsbHMgInguX19uZV9fKHkpIiwgJworICAgICAgICAgICAgICAgICAnIng+eSIgY2FsbHNcbicKKyAgICAgICAgICAgICAgICAgJyAgICJ4Ll9fZ3RfXyh5KSIsIGFuZCAieD49eSIgY2FsbHMgInguX19nZV9fKHkpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvbiAnCisgICAgICAgICAgICAgICAgICciTm90SW1wbGVtZW50ZWQiXG4nCisgICAgICAgICAgICAgICAgICcgICBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBwYWlyICcKKyAgICAgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgICAgICcgICBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sICJGYWxzZSIgYW5kICJUcnVlIiBhcmUgcmV0dXJuZWQgJworICAgICAgICAgICAgICAgICAnZm9yIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW4gcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgJ2FueSB2YWx1ZSxcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYSBCb29sZWFuICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRleHQgKGUuZy4sXG4nCisgICAgICAgICAgICAgICAgICcgICBpbiB0aGUgY29uZGl0aW9uIG9mIGFuICJpZiIgc3RhdGVtZW50KSwgUHl0aG9uIHdpbGwgY2FsbCAnCisgICAgICAgICAgICAgICAgICciYm9vbCgpIlxuJworICAgICAgICAgICAgICAgICAnICAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0IGlzIHRydWUgb3IgJworICAgICAgICAgICAgICAgICAnZmFsc2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEJ5IGRlZmF1bHQsICJfX25lX18oKSIgZGVsZWdhdGVzIHRvICJfX2VxX18oKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgJ2ludmVydHMgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICByZXN1bHQgdW5sZXNzIGl0IGlzICJOb3RJbXBsZW1lbnRlZCIuICBUaGVyZSBhcmUgbm8gb3RoZXIgJworICAgICAgICAgICAgICAgICAnaW1wbGllZFxuJworICAgICAgICAgICAgICAgICAnICAgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGZvciAnCisgICAgICAgICAgICAgICAgICdleGFtcGxlLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRydXRoIG9mICIoeDx5IG9yIHg9PXkpIiBkb2VzIG5vdCBpbXBseSAieDw9eSIuIFRvICcKKyAgICAgICAgICAgICAgICAgJ2F1dG9tYXRpY2FsbHlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290ICcKKyAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbiwgc2VlXG4nCisgICAgICAgICAgICAgICAgICcgICAiZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKCkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBTZWUgdGhlIHBhcmFncmFwaCBvbiAiX19oYXNoX18oKSIgZm9yIHNvbWUgaW1wb3J0YW50ICcKKyAgICAgICAgICAgICAgICAgJ25vdGVzIG9uXG4nCisgICAgICAgICAgICAgICAgICcgICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gJworICAgICAgICAgICAgICAgICAnY29tcGFyaXNvblxuJworICAgICAgICAgICAgICAgICAnICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgJworICAgICAgICAgICAgICAgICAnKHRvIGJlIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCAnCisgICAgICAgICAgICAgICAgICd0aGUgcmlnaHRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsICJfX2x0X18oKSIgYW5kICJfX2d0X18oKSIgYXJlICcKKyAgICAgICAgICAgICAgICAgImVhY2ggb3RoZXInc1xuIgorICAgICAgICAgICAgICAgICAnICAgcmVmbGVjdGlvbiwgIl9fbGVfXygpIiBhbmQgIl9fZ2VfXygpIiBhcmUgZWFjaCBvdGhlclwncyAnCisgICAgICAgICAgICAgICAgICdyZWZsZWN0aW9uLFxuJworICAgICAgICAgICAgICAgICAnICAgYW5kICJfX2VxX18oKSIgYW5kICJfX25lX18oKSIgYXJlIHRoZWlyIG93biByZWZsZWN0aW9uLiAnCisgICAgICAgICAgICAgICAgICdJZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgIiAgIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMsIGFuZCByaWdodCBvcGVyYW5kJ3MgdHlwZSAiCisgICAgICAgICAgICAgICAgICdpcyBhXG4nCisgICAgICAgICAgICAgICAgICIgICBkaXJlY3Qgb3IgaW5kaXJlY3Qgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZCdzIHR5cGUsICIKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgcmVmbGVjdGVkIG1ldGhvZCBvZiB0aGUgcmlnaHQgb3BlcmFuZCBoYXMgcHJpb3JpdHksICcKKyAgICAgICAgICAgICAgICAgJ290aGVyd2lzZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgIiAgIGxlZnQgb3BlcmFuZCdzIG1ldGhvZCBoYXMgcHJpb3JpdHkuICBWaXJ0dWFsIHN1YmNsYXNzaW5nICIKKyAgICAgICAgICAgICAgICAgJ2lzIG5vdFxuJworICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faGFzaF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiAiaGFzaCgpIiBhbmQgZm9yIG9wZXJhdGlvbnMgJworICAgICAgICAgICAgICAgICAnb24gbWVtYmVyc1xuJworICAgICAgICAgICAgICAgICAnICAgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyAic2V0IiwgImZyb3plbnNldCIsIGFuZCAnCisgICAgICAgICAgICAgICAgICciZGljdCIuXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHkgcmVxdWlyZWQgJworICAgICAgICAgICAgICAgICAncHJvcGVydHlcbicKKyAgICAgICAgICAgICAgICAgJyAgIGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWUgaGFzaCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZTsgaXQgaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmcgZXhjbHVzaXZlIG9yKSAnCisgICAgICAgICAgICAgICAgICd0aGUgaGFzaFxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXQgYWxzbyBwbGF5IGEgJworICAgICAgICAgICAgICAgICAncGFydCBpblxuJworICAgICAgICAgICAgICAgICAnICAgY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiAiaGFzaCgpIiB0cnVuY2F0ZXMgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYW4gJworICAgICAgICAgICAgICAgICAib2JqZWN0J3NcbiIKKyAgICAgICAgICAgICAgICAgJyAgICAgY3VzdG9tICJfX2hhc2hfXygpIiBtZXRob2QgdG8gdGhlIHNpemUgb2YgYSAnCisgICAgICAgICAgICAgICAgICciUHlfc3NpemVfdCIuICBUaGlzXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGlzIHR5cGljYWxseSA4IGJ5dGVzIG9uIDY0LWJpdCBidWlsZHMgYW5kIDQgYnl0ZXMgb24gJworICAgICAgICAgICAgICAgICAnMzItYml0XG4nCisgICAgICAgICAgICAgICAgICcgICAgIGJ1aWxkcy4gSWYgYW4gb2JqZWN0XCdzICAgIl9faGFzaF9fKCkiIG11c3QgJworICAgICAgICAgICAgICAgICAnaW50ZXJvcGVyYXRlIG9uIGJ1aWxkc1xuJworICAgICAgICAgICAgICAgICAnICAgICBvZiBkaWZmZXJlbnQgYml0IHNpemVzLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSB3aWR0aCBvbiAnCisgICAgICAgICAgICAgICAgICdhbGxcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc3VwcG9ydGVkIGJ1aWxkcy4gIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCAnCisgICAgICAgICAgICAgICAgICcicHl0aG9uIC1jXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJpbXBvcnQgc3lzOyBwcmludChzeXMuaGFzaF9pbmZvLndpZHRoKSIiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbiAiX19lcV9fKCkiIG1ldGhvZCBpdCBzaG91bGQgJworICAgICAgICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICAgICAgICcgICBkZWZpbmUgYSAiX19oYXNoX18oKSIgb3BlcmF0aW9uIGVpdGhlcjsgaWYgaXQgZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICciX19lcV9fKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBidXQgbm90ICJfX2hhc2hfXygpIiwgaXRzIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgYXMgJworICAgICAgICAgICAgICAgICAnaXRlbXMgaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGhhc2hhYmxlIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzcyBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyAnCisgICAgICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGltcGxlbWVudHMgYW4gIl9fZXFfXygpIiBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIsIHNpbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoYWJsZSAnCisgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9uc1xuJworICAgICAgICAgICAgICAgICAiICAgcmVxdWlyZXMgdGhhdCBhIGtleSdzIGhhc2ggdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgIgorICAgICAgICAgICAgICAgICAib2JqZWN0J3MgaGFzaFxuIgorICAgICAgICAgICAgICAgICAnICAgdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZSBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlICJfX2VxX18oKSIgYW5kICJfX2hhc2hfXygpIiAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzIGJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0ICcKKyAgICAgICAgICAgICAgICAgJ3dpdGhcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoZW1zZWx2ZXMpIGFuZCAieC5fX2hhc2hfXygpIiByZXR1cm5zIGFuIGFwcHJvcHJpYXRlICcKKyAgICAgICAgICAgICAgICAgJ3ZhbHVlIHN1Y2hcbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoYXQgInggPT0geSIgaW1wbGllcyBib3RoIHRoYXQgInggaXMgeSIgYW5kICJoYXNoKHgpID09ICcKKyAgICAgICAgICAgICAgICAgJ2hhc2goeSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBBIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgYW5kIGRvZXMgbm90IGRlZmluZSAnCisgICAgICAgICAgICAgICAgICciX19oYXNoX18oKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIHdpbGwgaGF2ZSBpdHMgIl9faGFzaF9fKCkiIGltcGxpY2l0bHkgc2V0IHRvICJOb25lIi4gICcKKyAgICAgICAgICAgICAgICAgJ1doZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19oYXNoX18oKSIgbWV0aG9kIG9mIGEgY2xhc3MgaXMgIk5vbmUiLCBpbnN0YW5jZXMgb2YgJworICAgICAgICAgICAgICAgICAndGhlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICB3aWxsIHJhaXNlIGFuIGFwcHJvcHJpYXRlICJUeXBlRXJyb3IiIHdoZW4gYSBwcm9ncmFtICcKKyAgICAgICAgICAgICAgICAgJ2F0dGVtcHRzIHRvXG4nCisgICAgICAgICAgICAgICAgICcgICByZXRyaWV2ZSB0aGVpciBoYXNoIHZhbHVlLCBhbmQgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSAnCisgICAgICAgICAgICAgICAgICdpZGVudGlmaWVkIGFzXG4nCisgICAgICAgICAgICAgICAgICcgICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgImlzaW5zdGFuY2Uob2JqLCAnCisgICAgICAgICAgICAgICAgICdjb2xsZWN0aW9ucy5IYXNoYWJsZSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBhIGNsYXNzIHRoYXQgb3ZlcnJpZGVzICJfX2VxX18oKSIgbmVlZHMgdG8gcmV0YWluIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgaW1wbGVtZW50YXRpb24gb2YgIl9faGFzaF9fKCkiIGZyb20gYSBwYXJlbnQgY2xhc3MsIHRoZSAnCisgICAgICAgICAgICAgICAgICdpbnRlcnByZXRlclxuJworICAgICAgICAgICAgICAgICAnICAgbXVzdCBiZSB0b2xkIHRoaXMgZXhwbGljaXRseSBieSBzZXR0aW5nICJfX2hhc2hfXyA9XG4nCisgICAgICAgICAgICAgICAgICcgICA8UGFyZW50Q2xhc3M+Ll9faGFzaF9fIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgYSBjbGFzcyB0aGF0IGRvZXMgbm90IG92ZXJyaWRlICJfX2VxX18oKSIgd2lzaGVzIHRvICcKKyAgICAgICAgICAgICAgICAgJ3N1cHByZXNzXG4nCisgICAgICAgICAgICAgICAgICcgICBoYXNoIHN1cHBvcnQsIGl0IHNob3VsZCBpbmNsdWRlICJfX2hhc2hfXyA9IE5vbmUiIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgZGVmaW5pdGlvbi4gQSBjbGFzcyB3aGljaCBkZWZpbmVzIGl0cyBvd24gIl9faGFzaF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4cGxpY2l0bHkgcmFpc2VzIGEgIlR5cGVFcnJvciIgd291bGQgYmUgaW5jb3JyZWN0bHkgJworICAgICAgICAgICAgICAgICAnaWRlbnRpZmllZCBhc1xuJworICAgICAgICAgICAgICAgICAnICAgaGFzaGFibGUgYnkgYW4gImlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSkiICcKKyAgICAgICAgICAgICAgICAgJ2NhbGwuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IEJ5IGRlZmF1bHQsIHRoZSAiX19oYXNoX18oKSIgdmFsdWVzIG9mIHN0ciwgYnl0ZXMgJworICAgICAgICAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGRhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSAnCisgICAgICAgICAgICAgICAgICdyYW5kb20gdmFsdWUuXG4nCisgICAgICAgICAgICAgICAgICcgICAgIEFsdGhvdWdoIHRoZXkgcmVtYWluIGNvbnN0YW50IHdpdGhpbiBhbiBpbmRpdmlkdWFsICcKKyAgICAgICAgICAgICAgICAgJ1B5dGhvblxuJworICAgICAgICAgICAgICAgICAnICAgICBwcm9jZXNzLCB0aGV5IGFyZSBub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCAnCisgICAgICAgICAgICAgICAgICdpbnZvY2F0aW9ucyBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICBQeXRob24uVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhICcKKyAgICAgICAgICAgICAgICAgJ2RlbmlhbC1cbicKKyAgICAgICAgICAgICAgICAgJyAgICAgb2Ytc2VydmljZSBjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCAnCisgICAgICAgICAgICAgICAgICdleHBsb2l0IHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIGEgZGljdCBpbnNlcnRpb24sIE8obl4yKSAnCisgICAgICAgICAgICAgICAgICdjb21wbGV4aXR5LlxuJworICAgICAgICAgICAgICAgICAnICAgICBTZWUgaHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sICcKKyAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAnICAgICBkZXRhaWxzLkNoYW5naW5nIGhhc2ggdmFsdWVzIGFmZmVjdHMgdGhlIGl0ZXJhdGlvbiAnCisgICAgICAgICAgICAgICAgICdvcmRlciBvZlxuJworICAgICAgICAgICAgICAgICAnICAgICBkaWN0cywgc2V0cyBhbmQgb3RoZXIgbWFwcGluZ3MuICBQeXRob24gaGFzIG5ldmVyIG1hZGUgJworICAgICAgICAgICAgICAgICAnZ3VhcmFudGVlc1xuJworICAgICAgICAgICAgICAgICAnICAgICBhYm91dCB0aGlzIG9yZGVyaW5nIChhbmQgaXQgdHlwaWNhbGx5IHZhcmllcyBiZXR3ZWVuICcKKyAgICAgICAgICAgICAgICAgJzMyLWJpdCBhbmRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgNjQtYml0IGJ1aWxkcykuU2VlIGFsc28gIlBZVEhPTkhBU0hTRUVEIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogSGFzaCByYW5kb21pemF0aW9uIGlzIGVuYWJsZWQgYnkgJworICAgICAgICAgICAgICAgICAnZGVmYXVsdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYm9vbF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluICcKKyAgICAgICAgICAgICAgICAgJ29wZXJhdGlvblxuJworICAgICAgICAgICAgICAgICAnICAgImJvb2woKSI7IHNob3VsZCByZXR1cm4gIkZhbHNlIiBvciAiVHJ1ZSIuICBXaGVuIHRoaXMgJworICAgICAgICAgICAgICAgICAnbWV0aG9kIGlzIG5vdFxuJworICAgICAgICAgICAgICAgICAnICAgZGVmaW5lZCwgIl9fbGVuX18oKSIgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdCBpc1xuJworICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gIElmIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICAnZGVmaW5lc1xuJworICAgICAgICAgICAgICAgICAnICAgbmVpdGhlciAiX19sZW5fXygpIiBub3IgIl9fYm9vbF9fKCkiLCBhbGwgaXRzIGluc3RhbmNlcyAnCisgICAgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQgdHJ1ZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlICcKKyAgICAgICAgICAgICAgICAgJ21lYW5pbmcgb2ZcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgJworICAgICAgICAgICAgICAgICAnIngubmFtZSIpIGZvclxuJworICAgICAgICAgICAgICAgICAnY2xhc3MgaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgJworICAgICAgICAgICAgICAgICAnaXQgZm91bmRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSBjbGFzcyB0cmVlIGZvciAic2VsZiIpLiAgIm5hbWUiIGlzIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAnbmFtZS4gVGhpc1xuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICAiQXR0cmlidXRlRXJyb3IiIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsICcKKyAgICAgICAgICAgICAgICAgJ21lY2hhbmlzbSxcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2dldGF0dHJfXygpIiBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgJworICAgICAgICAgICAgICAgICAnYXN5bW1ldHJ5XG4nCisgICAgICAgICAgICAgICAgICcgICBiZXR3ZWVuICJfX2dldGF0dHJfXygpIiBhbmQgIl9fc2V0YXR0cl9fKCkiLikgVGhpcyBpcyAnCisgICAgICAgICAgICAgICAgICdkb25lIGJvdGggZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlICJfX2dldGF0dHJfXygpIiAnCisgICAgICAgICAgICAgICAgICd3b3VsZCBoYXZlXG4nCisgICAgICAgICAgICAgICAgICcgICBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZSAnCisgICAgICAgICAgICAgICAgICd0aGF0IGF0XG4nCisgICAgICAgICAgICAgICAgICcgICBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCAnCisgICAgICAgICAgICAgICAgICdieSBub3RcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAnCisgICAgICAgICAgICAgICAgICcoYnV0XG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICJfX2dldGF0dHJpYnV0ZV9fKCkiIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgJworICAgICAgICAgICAgICAgICAnZ2V0IHRvdGFsXG4nCisgICAgICAgICAgICAgICAgICcgICBjb250cm9sIG92ZXIgYXR0cmlidXRlIGFjY2Vzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzICcKKyAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lcyAnCisgICAgICAgICAgICAgICAgICciX19nZXRhdHRyX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgIl9fZ2V0YXR0cmlidXRlX18oKSIgJworICAgICAgICAgICAgICAgICAnZWl0aGVyXG4nCisgICAgICAgICAgICAgICAgICcgICBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhbiAiQXR0cmlidXRlRXJyb3IiLiBUaGlzICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZFxuJworICAgICAgICAgICAgICAgICAnICAgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICJBdHRyaWJ1dGVFcnJvciIgZXhjZXB0aW9uLiBJbiBvcmRlciB0byBhdm9pZCBpbmZpbml0ZSAnCisgICAgICAgICAgICAgICAgICdyZWN1cnNpb24gaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb24gc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSAnCisgICAgICAgICAgICAgICAgICdiYXNlIGNsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCAnCisgICAgICAgICAgICAgICAgICduZWVkcywgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICBleGFtcGxlLCAib2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgbWV0aG9kcyBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhICcKKyAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlIHN5bnRheFxuJworICAgICAgICAgICAgICAgICAnICAgICBvciBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSBTcGVjaWFsIG1ldGhvZCBsb29rdXAuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICdpcyBjYWxsZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICpuYW1lKiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsICcKKyAgICAgICAgICAgICAgICAgJyp2YWx1ZSogaXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgIl9fc2V0YXR0cl9fKCkiIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUsIGl0XG4nCisgICAgICAgICAgICAgICAgICcgICBzaG91bGQgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgJworICAgICAgICAgICAgICAgICAnZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAgICAgJyAgICJvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIExpa2UgIl9fc2V0YXR0cl9fKCkiIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uIGluc3RlYWQgJworICAgICAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmICJkZWwgJworICAgICAgICAgICAgICAgICAnb2JqLm5hbWUiIGlzXG4nCisgICAgICAgICAgICAgICAgICcgICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kaXJfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgd2hlbiAiZGlyKCkiIGlzIGNhbGxlZCBvbiB0aGUgb2JqZWN0LiBBIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgJ211c3QgYmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJldHVybmVkLiAiZGlyKCkiIGNvbnZlcnRzIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSB0byBhICcKKyAgICAgICAgICAgICAgICAgJ2xpc3QgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICBzb3J0cyBpdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnNcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpICcKKyAgICAgICAgICAgICAgICAgJ2FwcGVhcnMgaW4gYW5cbicKKyAgICAgICAgICAgICAgICAgIipvd25lciogY2xhc3MgKHRoZSBkZXNjcmlwdG9yIG11c3QgYmUgaW4gZWl0aGVyIHRoZSBvd25lcidzICIKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzICcKKyAgICAgICAgICAgICAgICAgJ3BhcmVudHMpLiAgSW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICdleGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlICcKKyAgICAgICAgICAgICAgICAgJ3dob3NlIG5hbWUgaXNcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnICJfX2RpY3RfXyIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgICAgICAgICcgICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlICcKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAnICAgYWNjZXNzKS4gKm93bmVyKiBpcyBhbHdheXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZSAnCisgICAgICAgICAgICAgICAgICcqaW5zdGFuY2UqIGlzIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciAnCisgICAgICAgICAgICAgICAgICciTm9uZSIgd2hlblxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyAnCisgICAgICAgICAgICAgICAgICdtZXRob2Qgc2hvdWxkXG4nCisgICAgICAgICAgICAgICAgICcgICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuICcKKyAgICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4Y2VwdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiAnCisgICAgICAgICAgICAgICAgICd0aGUgb3duZXJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogJworICAgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBvd25lciBjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGF0dHJpYnV0ZSAiX19vYmpjbGFzc19fIiBpcyBpbnRlcnByZXRlZCBieSB0aGUgImluc3BlY3QiICcKKyAgICAgICAgICAgICAgICAgJ21vZHVsZSBhc1xuJworICAgICAgICAgICAgICAgICAnc3BlY2lmeWluZyB0aGUgY2xhc3Mgd2hlcmUgdGhpcyBvYmplY3Qgd2FzIGRlZmluZWQgKHNldHRpbmcgJworICAgICAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICAgICAnYXBwcm9wcmlhdGVseSBjYW4gYXNzaXN0IGluIHJ1bnRpbWUgaW50cm9zcGVjdGlvbiBvZiBkeW5hbWljICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVzKS4gRm9yIGNhbGxhYmxlcywgaXQgbWF5IGluZGljYXRlIHRoYXQgYW4gaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICdnaXZlbiB0eXBlIChvciBhIHN1YmNsYXNzKSBpcyBleHBlY3RlZCBvciByZXF1aXJlZCBhcyB0aGUgJworICAgICAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWwgYXJndW1lbnQgKGZvciBleGFtcGxlLCBDUHl0aG9uIHNldHMgdGhpcyAnCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgZm9yXG4nCisgICAgICAgICAgICAgICAgICd1bmJvdW5kIG1ldGhvZHMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gQykuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW52b2tpbmcgRGVzY3JpcHRvcnNcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0luIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggJworICAgICAgICAgICAgICAgICAnImJpbmRpbmdcbicKKyAgICAgICAgICAgICAgICAgJ2JlaGF2aW9yIiwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzXG4nCisgICAgICAgICAgICAgICAgICdpbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogICJfX2dldF9fKCkiLCAiX19zZXRfXygpIiwgYW5kXG4nCisgICAgICAgICAgICAgICAgICciX19kZWxldGVfXygpIi4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdCwgaXRcbicKKyAgICAgICAgICAgICAgICAgJ2lzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgJworICAgICAgICAgICAgICAgICAnZGVsZXRlXG4nCisgICAgICAgICAgICAgICAgICJ0aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN0J3MgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCAiCisgICAgICAgICAgICAgICAgICciYS54IiBoYXMgYVxuJworICAgICAgICAgICAgICAgICAnbG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggImEuX19kaWN0X19bXCd4XCddIiwgdGhlblxuJworICAgICAgICAgICAgICAgICAnInR5cGUoYSkuX19kaWN0X19bXCd4XCddIiwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgYmFzZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc2VzIG9mXG4nCisgICAgICAgICAgICAgICAgICcidHlwZShhKSIgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdIb3dldmVyLCBpZiB0aGUgbG9va2VkLXVwIHZhbHVlIGlzIGFuIG9iamVjdCBkZWZpbmluZyBvbmUgb2YgJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICdiZWhhdmlvciBhbmRcbicKKyAgICAgICAgICAgICAgICAgJ2ludm9rZSB0aGUgZGVzY3JpcHRvciBtZXRob2QgaW5zdGVhZC4gIFdoZXJlIHRoaXMgb2NjdXJzIGluICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAncHJlY2VkZW5jZSBjaGFpbiBkZXBlbmRzIG9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyB3ZXJlICcKKyAgICAgICAgICAgICAgICAgJ2RlZmluZWQgYW5kXG4nCisgICAgICAgICAgICAgICAgICdob3cgdGhleSB3ZXJlIGNhbGxlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCAnCisgICAgICAgICAgICAgICAgICciYS54Ii4gSG93XG4nCisgICAgICAgICAgICAgICAgICd0aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiAiYSI6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0RpcmVjdCBDYWxsXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlICcKKyAgICAgICAgICAgICAgICAgJ2RpcmVjdGx5XG4nCisgICAgICAgICAgICAgICAgICcgICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgICJ4Ll9fZ2V0X18oYSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbnN0YW5jZSBCaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBiaW5kaW5nIHRvIGFuIG9iamVjdCBpbnN0YW5jZSwgImEueCIgaXMgdHJhbnNmb3JtZWQgJworICAgICAgICAgICAgICAgICAnaW50byB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbGw6ICJ0eXBlKGEpLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKGEsIHR5cGUoYSkpIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQ2xhc3MgQmluZGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgYmluZGluZyB0byBhIGNsYXNzLCAiQS54IiBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSAnCisgICAgICAgICAgICAgICAgICdjYWxsOlxuJworICAgICAgICAgICAgICAgICAnICAgIkEuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oTm9uZSwgQSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTdXBlciBCaW5kaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiAiYSIgaXMgYW4gaW5zdGFuY2Ugb2YgInN1cGVyIiwgdGhlbiB0aGUgYmluZGluZyAnCisgICAgICAgICAgICAgICAgICcic3VwZXIoQixcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iaikubSgpIiBzZWFyY2hlcyAib2JqLl9fY2xhc3NfXy5fX21yb19fIiBmb3IgdGhlIGJhc2UgJworICAgICAgICAgICAgICAgICAnY2xhc3MgIkEiXG4nCisgICAgICAgICAgICAgICAgICcgICBpbW1lZGlhdGVseSBwcmVjZWRpbmcgIkIiIGFuZCB0aGVuIGludm9rZXMgdGhlIGRlc2NyaXB0b3IgJworICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbGw6ICJBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXykiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdGb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgJworICAgICAgICAgICAgICAgICAnaW52b2NhdGlvbiBkZXBlbmRzXG4nCisgICAgICAgICAgICAgICAgICdvbiB0aGUgd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgQSBkZXNjcmlwdG9yICcKKyAgICAgICAgICAgICAgICAgJ2NhbiBkZWZpbmVcbicKKyAgICAgICAgICAgICAgICAgJ2FueSBjb21iaW5hdGlvbiBvZiAiX19nZXRfXygpIiwgIl9fc2V0X18oKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgJyJfX2RlbGV0ZV9fKCkiLiAgSWYgaXRcbicKKyAgICAgICAgICAgICAgICAgJ2RvZXMgbm90IGRlZmluZSAiX19nZXRfXygpIiwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSAnCisgICAgICAgICAgICAgICAgICd3aWxsIHJldHVyblxuJworICAgICAgICAgICAgICAgICAndGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGUgJworICAgICAgICAgICAgICAgICAib2JqZWN0J3NcbiIKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzICJfX3NldF9fKCkiICcKKyAgICAgICAgICAgICAgICAgJ2FuZC9vclxuJworICAgICAgICAgICAgICAgICAnIl9fZGVsZXRlX18oKSIsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzICcKKyAgICAgICAgICAgICAgICAgJ25laXRoZXIsIGl0IGlzXG4nCisgICAgICAgICAgICAgICAgICdhIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9ycyBkZWZpbmUgJworICAgICAgICAgICAgICAgICAnYm90aFxuJworICAgICAgICAgICAgICAgICAnIl9fZ2V0X18oKSIgYW5kICJfX3NldF9fKCkiLCB3aGlsZSBub24tZGF0YSBkZXNjcmlwdG9ycyBoYXZlICcKKyAgICAgICAgICAgICAgICAgJ2p1c3QgdGhlXG4nCisgICAgICAgICAgICAgICAgICciX19nZXRfXygpIiBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGggIl9fc2V0X18oKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgJyJfX2dldF9fKCkiXG4nCisgICAgICAgICAgICAgICAgICdkZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvbiBpbiBhbiBpbnN0YW5jZSAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5LiAgSW5cbicKKyAgICAgICAgICAgICAgICAgJ2NvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmUgb3ZlcnJpZGRlbiBieSAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1B5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgInN0YXRpY21ldGhvZCgpIiBhbmQgJworICAgICAgICAgICAgICAgICAnImNsYXNzbWV0aG9kKCkiKSBhcmVcbicKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGVkIGFzIG5vbi1kYXRhIGRlc2NyaXB0b3JzLiAgQWNjb3JkaW5nbHksIGluc3RhbmNlcyAnCisgICAgICAgICAgICAgICAgICdjYW5cbicKKyAgICAgICAgICAgICAgICAgJ3JlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZXMgdG9cbicKKyAgICAgICAgICAgICAgICAgJ2FjcXVpcmUgYmVoYXZpb3JzIHRoYXQgZGlmZmVyIGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdzYW1lIGNsYXNzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgInByb3BlcnR5KCkiIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSAnCisgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yLlxuJworICAgICAgICAgICAgICAgICAnQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgJworICAgICAgICAgICAgICAgICAncHJvcGVydHkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnX19zbG90c19fXG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGNsYXNzZXMgaGF2ZSBhIGRpY3Rpb25hcnkgZm9yICcKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICAgICAgICAnc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzIGhhdmluZyB2ZXJ5IGZldyAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICAgICAgICAndmFyaWFibGVzLiAgVGhlIHNwYWNlIGNvbnN1bXB0aW9uIGNhbiBiZWNvbWUgYWN1dGUgd2hlbiAnCisgICAgICAgICAgICAgICAgICdjcmVhdGluZyBsYXJnZVxuJworICAgICAgICAgICAgICAgICAnbnVtYmVycyBvZiBpbnN0YW5jZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluIGEgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24uIFRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB0YWtlcyBhIHNlcXVlbmNlIG9mICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgICAgICAgICd2YXJpYWJsZXMgYW5kIHJlc2VydmVzIGp1c3QgZW5vdWdoIHNwYWNlIGluIGVhY2ggaW5zdGFuY2UgdG8gJworICAgICAgICAgICAgICAgICAnaG9sZCBhXG4nCisgICAgICAgICAgICAgICAgICd2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgKl9fZGljdF9fKiAnCisgICAgICAgICAgICAgICAgICdpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgJ2NyZWF0ZWQgZm9yIGVhY2ggaW5zdGFuY2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3Nsb3RzX19cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCAnCisgICAgICAgICAgICAgICAgICdvciBzZXF1ZW5jZVxuJworICAgICAgICAgICAgICAgICAnICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgJworICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWQgdmFyaWFibGVzIGFuZCBwcmV2ZW50cyAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZCAqX193ZWFrcmVmX18qIGZvciAnCisgICAgICAgICAgICAgICAgICdlYWNoXG4nCisgICAgICAgICAgICAgICAgICcgICBpbnN0YW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdOb3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAnfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAnCisgICAgICAgICAgICAgICAgICcqX19kaWN0X18qXG4nCisgICAgICAgICAgICAgICAgICcgIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgJworICAgICAgICAgICAgICAgICAnKl9fc2xvdHNfXypcbicKKyAgICAgICAgICAgICAgICAgJyAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgJworICAgICAgICAgICAgICAgICAnYXNzaWduZWQgbmV3XG4nCisgICAgICAgICAgICAgICAgICcgIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgJworICAgICAgICAgICAgICAgICAnQXR0ZW1wdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgJyAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzICcKKyAgICAgICAgICAgICAgICAgJyJBdHRyaWJ1dGVFcnJvciIuIElmXG4nCisgICAgICAgICAgICAgICAgICcgIGR5bmFtaWMgYXNzaWdubWVudCBvZiBuZXcgdmFyaWFibGVzIGlzIGRlc2lyZWQsIHRoZW4gYWRkXG4nCisgICAgICAgICAgICAgICAgICcgICJcJ19fZGljdF9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAnICBkZWNsYXJhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBXaXRob3V0IGEgKl9fd2Vha3JlZl9fKiB2YXJpYWJsZSBmb3IgZWFjaCBpbnN0YW5jZSwgJworICAgICAgICAgICAgICAgICAnY2xhc3Nlc1xuJworICAgICAgICAgICAgICAgICAnICBkZWZpbmluZyAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgdG8gJworICAgICAgICAgICAgICAgICAnaXRzXG4nCisgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlcy4gSWYgd2VhayByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gYWRkXG4nCisgICAgICAgICAgICAgICAgICcgICJcJ19fd2Vha3JlZl9fXCciIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICcqX19zbG90c19fKlxuJworICAgICAgICAgICAgICAgICAnICBkZWNsYXJhdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5ICcKKyAgICAgICAgICAgICAgICAgJ2NyZWF0aW5nXG4nCisgICAgICAgICAgICAgICAgICcgIGRlc2NyaXB0b3JzIChJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMpIGZvciBlYWNoIHZhcmlhYmxlICcKKyAgICAgICAgICAgICAgICAgJ25hbWUuICBBcyBhXG4nCisgICAgICAgICAgICAgICAgICcgIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICd2YWx1ZXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzXG4nCisgICAgICAgICAgICAgICAgICcgIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSAnCisgICAgICAgICAgICAgICAgICcqX19kaWN0X18qXG4nCisgICAgICAgICAgICAgICAgICcgIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgJworICAgICAgICAgICAgICAgICAnY29udGFpbiBuYW1lc1xuJworICAgICAgICAgICAgICAgICAnICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICBpbnN0YW5jZSB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgJworICAgICAgICAgICAgICAgICAnaW5hY2Nlc3NpYmxlXG4nCisgICAgICAgICAgICAgICAgICcgIChleGNlcHQgYnkgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSAnCisgICAgICAgICAgICAgICAgICdiYXNlIGNsYXNzKS5cbicKKyAgICAgICAgICAgICAgICAgJyAgVGhpcyByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSAnCisgICAgICAgICAgICAgICAgICdmdXR1cmUsIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgJworICAgICAgICAgICAgICAgICAnZnJvbVxuJworICAgICAgICAgICAgICAgICAnICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzICJpbnQiLCAiYnl0ZXMiICcKKyAgICAgICAgICAgICAgICAgJ2FuZCAidHVwbGUiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAqX19zbG90c19fKi4gJworICAgICAgICAgICAgICAgICAnTWFwcGluZ3NcbicKKyAgICAgICAgICAgICAgICAgJyAgbWF5IGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nICcKKyAgICAgICAgICAgICAgICAgJ21heSBiZVxuJworICAgICAgICAgICAgICAgICAnICBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSAnCisgICAgICAgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICAgICAgICcgICpfX3Nsb3RzX18qLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0N1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdCeSBkZWZhdWx0LCBjbGFzc2VzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyAidHlwZSgpIi4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzIGJvZHkgaXNcbicKKyAgICAgICAgICAgICAgICAgJ2V4ZWN1dGVkIGluIGEgbmV3IG5hbWVzcGFjZSBhbmQgdGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgJworICAgICAgICAgICAgICAgICAnbG9jYWxseSB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3Jlc3VsdCBvZiAidHlwZShuYW1lLCBiYXNlcywgbmFtZXNwYWNlKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBjbGFzcyBjcmVhdGlvbiBwcm9jZXNzIGNhbiBiZSBjdXN0b21pc2VkIGJ5IHBhc3NpbmcgdGhlXG4nCisgICAgICAgICAgICAgICAgICcibWV0YWNsYXNzIiBrZXl3b3JkIGFyZ3VtZW50IGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGxpbmUsICcKKyAgICAgICAgICAgICAgICAgJ29yIGJ5XG4nCisgICAgICAgICAgICAgICAgICdpbmhlcml0aW5nIGZyb20gYW4gZXhpc3RpbmcgY2xhc3MgdGhhdCBpbmNsdWRlZCBzdWNoIGFuICcKKyAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50LiBJblxuJworICAgICAgICAgICAgICAgICAndGhlIGZvbGxvd2luZyBleGFtcGxlLCBib3RoICJNeUNsYXNzIiBhbmQgIk15U3ViY2xhc3MiIGFyZSAnCisgICAgICAgICAgICAgICAgICdpbnN0YW5jZXNcbicKKyAgICAgICAgICAgICAgICAgJ29mICJNZXRhIjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgTWV0YSh0eXBlKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIE15Q2xhc3MobWV0YWNsYXNzPU1ldGEpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgTXlTdWJjbGFzcyhNeUNsYXNzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICBwYXNzXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0FueSBvdGhlciBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzICcKKyAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb25cbicKKyAgICAgICAgICAgICAgICAgJ2FyZSBwYXNzZWQgdGhyb3VnaCB0byBhbGwgbWV0YWNsYXNzIG9wZXJhdGlvbnMgZGVzY3JpYmVkICcKKyAgICAgICAgICAgICAgICAgJ2JlbG93LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaGVuIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyBleGVjdXRlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyAnCisgICAgICAgICAgICAgICAgICdvY2N1cjpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzIGlzIGRldGVybWluZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiB0aGUgY2xhc3MgbmFtZXNwYWNlIGlzIHByZXBhcmVkXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyogdGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdEZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGUgbWV0YWNsYXNzXG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgZm9yIGEgY2xhc3MgZGVmaW5pdGlvbiBpcyAnCisgICAgICAgICAgICAgICAgICdkZXRlcm1pbmVkIGFzXG4nCisgICAgICAgICAgICAgICAgICdmb2xsb3dzOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIGlmIG5vIGJhc2VzIGFuZCBubyBleHBsaWNpdCBtZXRhY2xhc3MgYXJlIGdpdmVuLCB0aGVuICcKKyAgICAgICAgICAgICAgICAgJyJ0eXBlKCkiIGlzXG4nCisgICAgICAgICAgICAgICAgICcgIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnKiBpZiBhbiBleHBsaWNpdCBtZXRhY2xhc3MgaXMgZ2l2ZW4gYW5kIGl0IGlzICpub3QqIGFuICcKKyAgICAgICAgICAgICAgICAgJ2luc3RhbmNlIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICJ0eXBlKCkiLCB0aGVuIGl0IGlzIHVzZWQgZGlyZWN0bHkgYXMgdGhlIG1ldGFjbGFzc1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcqIGlmIGFuIGluc3RhbmNlIG9mICJ0eXBlKCkiIGlzIGdpdmVuIGFzIHRoZSBleHBsaWNpdCAnCisgICAgICAgICAgICAgICAgICdtZXRhY2xhc3MsIG9yXG4nCisgICAgICAgICAgICAgICAgICcgIGJhc2VzIGFyZSBkZWZpbmVkLCB0aGVuIHRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzICcKKyAgICAgICAgICAgICAgICAgJ3VzZWRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3MgaXMgc2VsZWN0ZWQgZnJvbSB0aGUgZXhwbGljaXRseSAnCisgICAgICAgICAgICAgICAgICdzcGVjaWZpZWRcbicKKyAgICAgICAgICAgICAgICAgJ21ldGFjbGFzcyAoaWYgYW55KSBhbmQgdGhlIG1ldGFjbGFzc2VzIChpLmUuICJ0eXBlKGNscykiKSBvZiAnCisgICAgICAgICAgICAgICAgICdhbGxcbicKKyAgICAgICAgICAgICAgICAgJ3NwZWNpZmllZCBiYXNlIGNsYXNzZXMuIFRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIGlzIG9uZSAnCisgICAgICAgICAgICAgICAgICd3aGljaCBpcyBhXG4nCisgICAgICAgICAgICAgICAgICdzdWJ0eXBlIG9mICphbGwqIG9mIHRoZXNlIGNhbmRpZGF0ZSBtZXRhY2xhc3Nlcy4gSWYgbm9uZSBvZiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJ2NhbmRpZGF0ZSBtZXRhY2xhc3NlcyBtZWV0cyB0aGF0IGNyaXRlcmlvbiwgdGhlbiB0aGUgY2xhc3MgJworICAgICAgICAgICAgICAgICAnZGVmaW5pdGlvblxuJworICAgICAgICAgICAgICAgICAnd2lsbCBmYWlsIHdpdGggIlR5cGVFcnJvciIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnUHJlcGFyaW5nIHRoZSBjbGFzcyBuYW1lc3BhY2VcbicKKyAgICAgICAgICAgICAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ09uY2UgdGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBoYXMgYmVlbiBpZGVudGlmaWVkLCB0aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlIGlzIHByZXBhcmVkLiBJZiB0aGUgbWV0YWNsYXNzIGhhcyBhICJfX3ByZXBhcmVfXyIgJworICAgICAgICAgICAgICAgICAnYXR0cmlidXRlLFxuJworICAgICAgICAgICAgICAgICAnaXQgaXMgY2FsbGVkIGFzICJuYW1lc3BhY2UgPSBtZXRhY2xhc3MuX19wcmVwYXJlX18obmFtZSwgJworICAgICAgICAgICAgICAgICAnYmFzZXMsXG4nCisgICAgICAgICAgICAgICAgICcqKmt3ZHMpIiAod2hlcmUgdGhlIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMsIGlmIGFueSwgJworICAgICAgICAgICAgICAgICAnY29tZSBmcm9tXG4nCisgICAgICAgICAgICAgICAgICd0aGUgY2xhc3MgZGVmaW5pdGlvbikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0lmIHRoZSBtZXRhY2xhc3MgaGFzIG5vICJfX3ByZXBhcmVfXyIgYXR0cmlidXRlLCB0aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlIGlzIGluaXRpYWxpc2VkIGFzIGFuIGVtcHR5ICJkaWN0KCkiIGluc3RhbmNlLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAqKlBFUCAzMTE1KiogLSBNZXRhY2xhc3NlcyBpbiBQeXRob24gMzAwMFxuJworICAgICAgICAgICAgICAgICAnICAgICBJbnRyb2R1Y2VkIHRoZSAiX19wcmVwYXJlX18iIG5hbWVzcGFjZSBob29rXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRXhlY3V0aW5nIHRoZSBjbGFzcyBib2R5XG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGNsYXNzIGJvZHkgaXMgZXhlY3V0ZWQgKGFwcHJveGltYXRlbHkpIGFzICJleGVjKGJvZHksICcKKyAgICAgICAgICAgICAgICAgJ2dsb2JhbHMoKSxcbicKKyAgICAgICAgICAgICAgICAgJ25hbWVzcGFjZSkiLiBUaGUga2V5IGRpZmZlcmVuY2UgZnJvbSBhIG5vcm1hbCBjYWxsIHRvICcKKyAgICAgICAgICAgICAgICAgJyJleGVjKCkiIGlzIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJ2xleGljYWwgc2NvcGluZyBhbGxvd3MgdGhlIGNsYXNzIGJvZHkgKGluY2x1ZGluZyBhbnkgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcykgdG9cbicKKyAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZSBuYW1lcyBmcm9tIHRoZSBjdXJyZW50IGFuZCBvdXRlciBzY29wZXMgd2hlbiB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2NjdXJzIGluc2lkZSBhIGZ1bmN0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdIb3dldmVyLCBldmVuIHdoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gb2NjdXJzIGluc2lkZSB0aGUgJworICAgICAgICAgICAgICAgICAnZnVuY3Rpb24sXG4nCisgICAgICAgICAgICAgICAgICdtZXRob2RzIGRlZmluZWQgaW5zaWRlIHRoZSBjbGFzcyBzdGlsbCBjYW5ub3Qgc2VlIG5hbWVzICcKKyAgICAgICAgICAgICAgICAgJ2RlZmluZWQgYXQgdGhlXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBzY29wZS4gQ2xhc3MgdmFyaWFibGVzIG11c3QgYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgJworICAgICAgICAgICAgICAgICAnZmlyc3RcbicKKyAgICAgICAgICAgICAgICAgJ3BhcmFtZXRlciBvZiBpbnN0YW5jZSBvciBjbGFzcyBtZXRob2RzLCBhbmQgY2Fubm90IGJlICcKKyAgICAgICAgICAgICAgICAgJ2FjY2Vzc2VkIGF0IGFsbFxuJworICAgICAgICAgICAgICAgICAnZnJvbSBzdGF0aWMgbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDcmVhdGluZyB0aGUgY2xhc3Mgb2JqZWN0XG4nCisgICAgICAgICAgICAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ09uY2UgdGhlIGNsYXNzIG5hbWVzcGFjZSBoYXMgYmVlbiBwb3B1bGF0ZWQgYnkgZXhlY3V0aW5nIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnYm9keSwgdGhlIGNsYXNzIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGNhbGxpbmcgJworICAgICAgICAgICAgICAgICAnIm1ldGFjbGFzcyhuYW1lLCBiYXNlcyxcbicKKyAgICAgICAgICAgICAgICAgJ25hbWVzcGFjZSwgKiprd2RzKSIgKHRoZSBhZGRpdGlvbmFsIGtleXdvcmRzIHBhc3NlZCBoZXJlIGFyZSAnCisgICAgICAgICAgICAgICAgICd0aGUgc2FtZVxuJworICAgICAgICAgICAgICAgICAnYXMgdGhvc2UgcGFzc2VkIHRvICJfX3ByZXBhcmVfXyIpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGlzIGNsYXNzIG9iamVjdCBpcyB0aGUgb25lIHRoYXQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICd6ZXJvLVxuJworICAgICAgICAgICAgICAgICAnYXJndW1lbnQgZm9ybSBvZiAic3VwZXIoKSIuICJfX2NsYXNzX18iIGlzIGFuIGltcGxpY2l0ICcKKyAgICAgICAgICAgICAgICAgJ2Nsb3N1cmVcbicKKyAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZSBjcmVhdGVkIGJ5IHRoZSBjb21waWxlciBpZiBhbnkgbWV0aG9kcyBpbiBhIGNsYXNzICcKKyAgICAgICAgICAgICAgICAgJ2JvZHkgcmVmZXJcbicKKyAgICAgICAgICAgICAgICAgJ3RvIGVpdGhlciAiX19jbGFzc19fIiBvciAic3VwZXIiLiBUaGlzIGFsbG93cyB0aGUgemVybyAnCisgICAgICAgICAgICAgICAgICdhcmd1bWVudCBmb3JtXG4nCisgICAgICAgICAgICAgICAgICdvZiAic3VwZXIoKSIgdG8gY29ycmVjdGx5IGlkZW50aWZ5IHRoZSBjbGFzcyBiZWluZyBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgJ2Jhc2VkIG9uXG4nCisgICAgICAgICAgICAgICAgICdsZXhpY2FsIHNjb3BpbmcsIHdoaWxlIHRoZSBjbGFzcyBvciBpbnN0YW5jZSB0aGF0IHdhcyB1c2VkICcKKyAgICAgICAgICAgICAgICAgJ3RvIG1ha2UgdGhlXG4nCisgICAgICAgICAgICAgICAgICdjdXJyZW50IGNhbGwgaXMgaWRlbnRpZmllZCBiYXNlZCBvbiB0aGUgZmlyc3QgYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAncGFzc2VkIHRvIHRoZVxuJworICAgICAgICAgICAgICAgICAnbWV0aG9kLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdBZnRlciB0aGUgY2xhc3Mgb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGlzIHBhc3NlZCB0byB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAgICAgICAgJ2RlY29yYXRvcnMgaW5jbHVkZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gKGlmIGFueSkgYW5kIHRoZSAnCisgICAgICAgICAgICAgICAgICdyZXN1bHRpbmdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdCBpcyBib3VuZCBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIGFzIHRoZSBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaGVuIGEgbmV3IGNsYXNzIGlzIGNyZWF0ZWQgYnkgInR5cGUuX19uZXdfXyIsIHRoZSBvYmplY3QgJworICAgICAgICAgICAgICAgICAncHJvdmlkZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBuYW1lc3BhY2UgcGFyYW1ldGVyIGlzIGNvcGllZCB0byBhIHN0YW5kYXJkIFB5dGhvbiAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IGFuZFxuJworICAgICAgICAgICAgICAgICAndGhlIG9yaWdpbmFsIG9iamVjdCBpcyBkaXNjYXJkZWQuIFRoZSBuZXcgY29weSBiZWNvbWVzIHRoZSAnCisgICAgICAgICAgICAgICAgICciX19kaWN0X18iXG4nCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgb2YgdGhlIGNsYXNzIG9iamVjdC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnU2VlIGFsc286XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgKipQRVAgMzEzNSoqIC0gTmV3IHN1cGVyXG4nCisgICAgICAgICAgICAgICAgICcgICAgIERlc2NyaWJlcyB0aGUgaW1wbGljaXQgIl9fY2xhc3NfXyIgY2xvc3VyZSByZWZlcmVuY2VcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdNZXRhY2xhc3MgZXhhbXBsZVxuJworICAgICAgICAgICAgICAgICAnLS0tLS0tLS0tLS0tLS0tLS1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzICcKKyAgICAgICAgICAgICAgICAgJ3RoYXQgaGF2ZVxuJworICAgICAgICAgICAgICAgICAnYmVlbiBleHBsb3JlZCBpbmNsdWRlIGxvZ2dpbmcsIGludGVyZmFjZSBjaGVja2luZywgJworICAgICAgICAgICAgICAgICAnYXV0b21hdGljXG4nCisgICAgICAgICAgICAgICAgICdkZWxlZ2F0aW9uLCBhdXRvbWF0aWMgcHJvcGVydHkgY3JlYXRpb24sIHByb3hpZXMsICcKKyAgICAgICAgICAgICAgICAgJ2ZyYW1ld29ya3MsIGFuZFxuJworICAgICAgICAgICAgICAgICAnYXV0b21hdGljIHJlc291cmNlIGxvY2tpbmcvc3luY2hyb25pemF0aW9uLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBtZXRhY2xhc3MgdGhhdCB1c2VzIGFuXG4nCisgICAgICAgICAgICAgICAgICciY29sbGVjdGlvbnMuT3JkZXJlZERpY3QiIHRvIHJlbWVtYmVyIHRoZSBvcmRlciB0aGF0IGNsYXNzICcKKyAgICAgICAgICAgICAgICAgJ3ZhcmlhYmxlc1xuJworICAgICAgICAgICAgICAgICAnYXJlIGRlZmluZWQ6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNsYXNzIE9yZGVyZWRDbGFzcyh0eXBlKTpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgIEBjbGFzc21ldGhvZFxuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiBfX3ByZXBhcmVfXyhtZXRhY2xzLCBuYW1lLCBiYXNlcywgKiprd2RzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSwgKiprd2RzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgcmVzdWx0ID0gdHlwZS5fX25ld19fKGNscywgbmFtZSwgYmFzZXMsICcKKyAgICAgICAgICAgICAgICAgJ2RpY3QobmFtZXNwYWNlKSlcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgcmVzdWx0Lm1lbWJlcnMgPSB0dXBsZShuYW1lc3BhY2UpXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAgIHJldHVybiByZXN1bHRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgQShtZXRhY2xhc3M9T3JkZXJlZENsYXNzKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICBkZWYgb25lKHNlbGYpOiBwYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgZGVmIHR3byhzZWxmKTogcGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiB0aHJlZShzZWxmKTogcGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgICAgIGRlZiBmb3VyKHNlbGYpOiBwYXNzXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBBLm1lbWJlcnNcbicKKyAgICAgICAgICAgICAgICAgIiAgICgnX19tb2R1bGVfXycsICdvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInKVxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaGVuIHRoZSBjbGFzcyBkZWZpbml0aW9uIGZvciAqQSogZ2V0cyBleGVjdXRlZCwgdGhlIHByb2Nlc3MgJworICAgICAgICAgICAgICAgICAnYmVnaW5zXG4nCisgICAgICAgICAgICAgICAgICd3aXRoIGNhbGxpbmcgdGhlIG1ldGFjbGFzc1wncyAiX19wcmVwYXJlX18oKSIgbWV0aG9kIHdoaWNoICcKKyAgICAgICAgICAgICAgICAgJ3JldHVybnMgYW5cbicKKyAgICAgICAgICAgICAgICAgJ2VtcHR5ICJjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCIuICBUaGF0IG1hcHBpbmcgcmVjb3JkcyB0aGUgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcyBhbmRcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMgb2YgKkEqIGFzIHRoZXkgYXJlIGRlZmluZWQgd2l0aGluIHRoZSBib2R5IG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnc3RhdGVtZW50LiBPbmNlIHRob3NlIGRlZmluaXRpb25zIGFyZSBleGVjdXRlZCwgdGhlIG9yZGVyZWQgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICAgICAnaXMgZnVsbHkgcG9wdWxhdGVkIGFuZCB0aGUgbWV0YWNsYXNzXCdzICJfX25ld19fKCkiIG1ldGhvZCAnCisgICAgICAgICAgICAgICAgICdnZXRzXG4nCisgICAgICAgICAgICAgICAgICdpbnZva2VkLiAgVGhhdCBtZXRob2QgYnVpbGRzIHRoZSBuZXcgdHlwZSBhbmQgaXQgc2F2ZXMgdGhlICcKKyAgICAgICAgICAgICAgICAgJ29yZGVyZWRcbicKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnkga2V5cyBpbiBhbiBhdHRyaWJ1dGUgY2FsbGVkICJtZW1iZXJzIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdDdXN0b21pemluZyBpbnN0YW5jZSBhbmQgc3ViY2xhc3MgY2hlY2tzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCAnCisgICAgICAgICAgICAgICAgICdiZWhhdmlvciBvZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJpc2luc3RhbmNlKCkiIGFuZCAiaXNzdWJjbGFzcygpIiBidWlsdC1pbiBmdW5jdGlvbnMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0luIHBhcnRpY3VsYXIsIHRoZSBtZXRhY2xhc3MgImFiYy5BQkNNZXRhIiBpbXBsZW1lbnRzIHRoZXNlICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgaW5cbicKKyAgICAgICAgICAgICAgICAgJ29yZGVyIHRvIGFsbG93IHRoZSBhZGRpdGlvbiBvZiBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpICcKKyAgICAgICAgICAgICAgICAgJ2FzXG4nCisgICAgICAgICAgICAgICAgICcidmlydHVhbCBiYXNlIGNsYXNzZXMiIHRvIGFueSBjbGFzcyBvciB0eXBlIChpbmNsdWRpbmcgJworICAgICAgICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgICAgICAgJ3R5cGVzKSwgaW5jbHVkaW5nIG90aGVyIEFCQ3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2NsYXNzLl9faW5zdGFuY2VjaGVja19fKHNlbGYsIGluc3RhbmNlKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiAqaW5zdGFuY2UqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCAnCisgICAgICAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgICAgICAnICAgaW5kaXJlY3QpIGluc3RhbmNlIG9mICpjbGFzcyouIElmIGRlZmluZWQsIGNhbGxlZCB0byAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJyAgICJpc2luc3RhbmNlKGluc3RhbmNlLCBjbGFzcykiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcy5fX3N1YmNsYXNzY2hlY2tfXyhzZWxmLCBzdWJjbGFzcylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgKnN1YmNsYXNzKiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIChkaXJlY3QgJworICAgICAgICAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGluZGlyZWN0KSBzdWJjbGFzcyBvZiAqY2xhc3MqLiAgSWYgZGVmaW5lZCwgY2FsbGVkIHRvICcKKyAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudFxuJworICAgICAgICAgICAgICAgICAnICAgImlzc3ViY2xhc3Moc3ViY2xhc3MsIGNsYXNzKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ05vdGUgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBsb29rZWQgdXAgb24gdGhlIHR5cGUgJworICAgICAgICAgICAgICAgICAnKG1ldGFjbGFzcykgb2YgYVxuJworICAgICAgICAgICAgICAgICAnY2xhc3MuICBUaGV5IGNhbm5vdCBiZSBkZWZpbmVkIGFzIGNsYXNzIG1ldGhvZHMgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2FjdHVhbCBjbGFzcy5cbicKKyAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsb29rdXAgb2Ygc3BlY2lhbCBtZXRob2RzIHRoYXQgJworICAgICAgICAgICAgICAgICAnYXJlIGNhbGxlZFxuJworICAgICAgICAgICAgICAgICAnb24gaW5zdGFuY2VzLCBvbmx5IGluIHRoaXMgY2FzZSB0aGUgaW5zdGFuY2UgaXMgaXRzZWxmIGEgJworICAgICAgICAgICAgICAgICAnY2xhc3MuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICoqUEVQIDMxMTkqKiAtIEludHJvZHVjaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3Nlc1xuJworICAgICAgICAgICAgICAgICAnICAgICBJbmNsdWRlcyB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY3VzdG9taXppbmcgJworICAgICAgICAgICAgICAgICAnImlzaW5zdGFuY2UoKSIgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgICJpc3N1YmNsYXNzKCkiIGJlaGF2aW9yIHRocm91Z2ggIl9faW5zdGFuY2VjaGVja19fKCkiICcKKyAgICAgICAgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICAgICAgICAnICAgICAiX19zdWJjbGFzc2NoZWNrX18oKSIsIHdpdGggbW90aXZhdGlvbiBmb3IgdGhpcyAnCisgICAgICAgICAgICAgICAgICdmdW5jdGlvbmFsaXR5IGluXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHRoZSBjb250ZXh0IG9mIGFkZGluZyBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKHNlZSB0aGUgJworICAgICAgICAgICAgICAgICAnImFiYyJcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgbW9kdWxlKSB0byB0aGUgbGFuZ3VhZ2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRW11bGF0aW5nIGNhbGxhYmxlIG9iamVjdHNcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2NhbGxfXyhzZWxmWywgYXJncy4uLl0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyAiY2FsbGVkIiBhcyBhIGZ1bmN0aW9uOyBpZiAnCisgICAgICAgICAgICAgICAgICd0aGlzIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAnICAgaXMgZGVmaW5lZCwgIngoYXJnMSwgYXJnMiwgLi4uKSIgaXMgYSBzaG9ydGhhbmQgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICAieC5fX2NhbGxfXyhhcmcxLCBhcmcyLCAuLi4pIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdDb250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpICcKKyAgICAgICAgICAgICAgICAgJ29yIG1hcHBpbmdzXG4nCisgICAgICAgICAgICAgICAgICcobGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzICcKKyAgICAgICAgICAgICAgICAgJ3dlbGwuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgJ2ZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciAnCisgICAgICAgICAgICAgICAgICd0b1xuJworICAgICAgICAgICAgICAgICAnZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsICcKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoICIwIDw9IGsgJworICAgICAgICAgICAgICAgICAnPCBOIiB3aGVyZVxuJworICAgICAgICAgICAgICAgICAnKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciBzbGljZSBvYmplY3RzLCB3aGljaCAnCisgICAgICAgICAgICAgICAgICdkZWZpbmUgYVxuJworICAgICAgICAgICAgICAgICAncmFuZ2Ugb2YgaXRlbXMuICBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgJworICAgICAgICAgICAgICAgICAncHJvdmlkZSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgImtleXMoKSIsICJ2YWx1ZXMoKSIsICJpdGVtcygpIiwgImdldCgpIiwgJworICAgICAgICAgICAgICAgICAnImNsZWFyKCkiLFxuJworICAgICAgICAgICAgICAgICAnInNldGRlZmF1bHQoKSIsICJwb3AoKSIsICJwb3BpdGVtKCkiLCAiY29weSgpIiwgYW5kICcKKyAgICAgICAgICAgICAgICAgJyJ1cGRhdGUoKSJcbicKKyAgICAgICAgICAgICAgICAgImJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvbidzIHN0YW5kYXJkIGRpY3Rpb25hcnkgIgorICAgICAgICAgICAgICAgICAnb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ1RoZSAiY29sbGVjdGlvbnMiIG1vZHVsZSBwcm92aWRlcyBhICJNdXRhYmxlTWFwcGluZyIgJworICAgICAgICAgICAgICAgICAnYWJzdHJhY3QgYmFzZVxuJworICAgICAgICAgICAgICAgICAnY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2YgJworICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiLFxuJworICAgICAgICAgICAgICAgICAnIl9fc2V0aXRlbV9fKCkiLCAiX19kZWxpdGVtX18oKSIsIGFuZCAia2V5cygpIi4gTXV0YWJsZSAnCisgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXNcbicKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZCBwcm92aWRlIG1ldGhvZHMgImFwcGVuZCgpIiwgImNvdW50KCkiLCAiaW5kZXgoKSIsICcKKyAgICAgICAgICAgICAgICAgJyJleHRlbmQoKSIsXG4nCisgICAgICAgICAgICAgICAgICciaW5zZXJ0KCkiLCAicG9wKCkiLCAicmVtb3ZlKCkiLCAicmV2ZXJzZSgpIiBhbmQgInNvcnQoKSIsICcKKyAgICAgICAgICAgICAgICAgJ2xpa2UgUHl0aG9uXG4nCisgICAgICAgICAgICAgICAgICdzdGFuZGFyZCBsaXN0IG9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICdhZGRpdGlvbiAobWVhbmluZyBjb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gJworICAgICAgICAgICAgICAgICAnKG1lYW5pbmdcbicKKyAgICAgICAgICAgICAgICAgJ3JlcGV0aXRpb24pIGJ5IGRlZmluaW5nIHRoZSBtZXRob2RzICJfX2FkZF9fKCkiLCAnCisgICAgICAgICAgICAgICAgICciX19yYWRkX18oKSIsXG4nCisgICAgICAgICAgICAgICAgICciX19pYWRkX18oKSIsICJfX211bF9fKCkiLCAiX19ybXVsX18oKSIgYW5kICJfX2ltdWxfXygpIiAnCisgICAgICAgICAgICAgICAgICdkZXNjcmliZWRcbicKKyAgICAgICAgICAgICAgICAgJ2JlbG93OyB0aGV5IHNob3VsZCBub3QgZGVmaW5lIG90aGVyIG51bWVyaWNhbCBvcGVyYXRvcnMuICBJdCAnCisgICAgICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICAgICAncmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuJworICAgICAgICAgICAgICAgICAnIl9fY29udGFpbnNfXygpIiBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgImluIiAnCisgICAgICAgICAgICAgICAgICdvcGVyYXRvcjtcbicKKyAgICAgICAgICAgICAgICAgJ2ZvciBtYXBwaW5ncywgImluIiBzaG91bGQgc2VhcmNoIHRoZSBtYXBwaW5nXCdzIGtleXM7IGZvciAnCisgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXMsIGl0XG4nCisgICAgICAgICAgICAgICAgICdzaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXIgcmVjb21tZW5kZWQgJworICAgICAgICAgICAgICAgICAndGhhdCBib3RoXG4nCisgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGUgIl9faXRlcl9fKCkiIG1ldGhvZCB0byAnCisgICAgICAgICAgICAgICAgICdhbGxvd1xuJworICAgICAgICAgICAgICAgICAnZWZmaWNpZW50IGl0ZXJhdGlvbiB0aHJvdWdoIHRoZSBjb250YWluZXI7IGZvciBtYXBwaW5ncywgJworICAgICAgICAgICAgICAgICAnIl9faXRlcl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICdzaG91bGQgYmUgdGhlIHNhbWUgYXMgImtleXMoKSI7IGZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCAnCisgICAgICAgICAgICAgICAgICdpdGVyYXRlXG4nCisgICAgICAgICAgICAgICAgICd0aHJvdWdoIHRoZSB2YWx1ZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlbl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIuICAnCisgICAgICAgICAgICAgICAgICdTaG91bGQgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgIj49IiAwLiAgQWxzbywgYW4gJworICAgICAgICAgICAgICAgICAnb2JqZWN0IHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRvZXNuXCd0IGRlZmluZSBhICJfX2Jvb2xfXygpIiBtZXRob2QgYW5kIHdob3NlICcKKyAgICAgICAgICAgICAgICAgJyJfX2xlbl9fKCkiIG1ldGhvZFxuJworICAgICAgICAgICAgICAgICAnICAgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYSBCb29sZWFuICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRleHQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2xlbmd0aF9oaW50X18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgQ2FsbGVkIHRvIGltcGxlbWVudCAib3BlcmF0b3IubGVuZ3RoX2hpbnQoKSIuIFNob3VsZCAnCisgICAgICAgICAgICAgICAgICdyZXR1cm4gYW5cbicKKyAgICAgICAgICAgICAgICAgJyAgIGVzdGltYXRlZCBsZW5ndGggZm9yIHRoZSBvYmplY3QgKHdoaWNoIG1heSBiZSBncmVhdGVyIG9yICcKKyAgICAgICAgICAgICAgICAgJ2xlc3MgdGhhblxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGFjdHVhbCBsZW5ndGgpLiBUaGUgbGVuZ3RoIG11c3QgYmUgYW4gaW50ZWdlciAiPj0iIDAuICcKKyAgICAgICAgICAgICAgICAgJ1RoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCBpcyBwdXJlbHkgYW4gb3B0aW1pemF0aW9uIGFuZCBpcyBuZXZlciByZXF1aXJlZCAnCisgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvcnJlY3RuZXNzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ05vdGU6IFNsaWNpbmcgaXMgZG9uZSBleGNsdXNpdmVseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGhyZWUgJworICAgICAgICAgICAgICAgICAnbWV0aG9kcy5cbicKKyAgICAgICAgICAgICAgICAgJyAgQSBjYWxsIGxpa2VcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICBhWzE6Ml0gPSBiXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgaXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGFbc2xpY2UoMSwgMiwgTm9uZSldID0gYlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgIGFuZCBzbyBmb3J0aC4gIE1pc3Npbmcgc2xpY2UgaXRlbXMgYXJlIGFsd2F5cyBmaWxsZWQgaW4gJworICAgICAgICAgICAgICAgICAnd2l0aCAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiAic2VsZltrZXldIi4gRm9yICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlIHR5cGVzLFxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLiAgJworICAgICAgICAgICAgICAgICAnTm90ZSB0aGF0XG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGUgJworICAgICAgICAgICAgICAgICAnY2xhc3Mgd2lzaGVzXG4nCisgICAgICAgICAgICAgICAgICcgICB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlICJfX2dldGl0ZW1fXygpIiAnCisgICAgICAgICAgICAgICAgICdtZXRob2QuIElmXG4nCisgICAgICAgICAgICAgICAgICcgICAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsICJUeXBlRXJyb3IiIG1heSBiZSAnCisgICAgICAgICAgICAgICAgICdyYWlzZWQ7IGlmIG9mXG4nCisgICAgICAgICAgICAgICAgICcgICBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZiBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAnKGFmdGVyIGFueVxuJworICAgICAgICAgICAgICAgICAnICAgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSB2YWx1ZXMpLCAiSW5kZXhFcnJvciIgJworICAgICAgICAgICAgICAgICAnc2hvdWxkIGJlXG4nCisgICAgICAgICAgICAgICAgICcgICByYWlzZWQuIEZvciBtYXBwaW5nIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gJworICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBjb250YWluZXIpLCAiS2V5RXJyb3IiIHNob3VsZCBiZSByYWlzZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIE5vdGU6ICJmb3IiIGxvb3BzIGV4cGVjdCB0aGF0IGFuICJJbmRleEVycm9yIiB3aWxsIGJlICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlZCBmb3JcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21pc3NpbmdfXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCBieSAiZGljdCIuIl9fZ2V0aXRlbV9fKCkiIHRvIGltcGxlbWVudCAic2VsZltrZXldIiAnCisgICAgICAgICAgICAgICAgICdmb3IgZGljdFxuJworICAgICAgICAgICAgICAgICAnICAgc3ViY2xhc3NlcyB3aGVuIGtleSBpcyBub3QgaW4gdGhlIGRpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gInNlbGZba2V5XSIuICBTYW1lIG5vdGUgJworICAgICAgICAgICAgICAgICAnYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciAnCisgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBpZlxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmICcKKyAgICAgICAgICAgICAgICAgJ25ldyBrZXlzXG4nCisgICAgICAgICAgICAgICAgICcgICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlICcKKyAgICAgICAgICAgICAgICAgJ3JlcGxhY2VkLiAgVGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogJworICAgICAgICAgICAgICAgICAndmFsdWVzIGFzIGZvclxuJworICAgICAgICAgICAgICAgICAnICAgdGhlICJfX2dldGl0ZW1fXygpIiBtZXRob2QuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgInNlbGZba2V5XSIuICBTYW1lIG5vdGUgJworICAgICAgICAgICAgICAgICAnYXMgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICAiX19nZXRpdGVtX18oKSIuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciAnCisgICAgICAgICAgICAgICAgICdtYXBwaW5ncyBpZlxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgJworICAgICAgICAgICAgICAgICAnZWxlbWVudHNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyAnCisgICAgICAgICAgICAgICAgICdzaG91bGQgYmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgJworICAgICAgICAgICAgICAgICAnIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faXRlcl9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lci5cbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuICcKKyAgICAgICAgICAgICAgICAgJ2l0ZXJhdGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0ICcKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZFxuJworICAgICAgICAgICAgICAgICAnICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSAnCisgICAgICAgICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gJworICAgICAgICAgICAgICAgICAnaXRlcmF0b3JcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdHMsIHNlZSBJdGVyYXRvciBUeXBlcy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmV2ZXJzZWRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSAicmV2ZXJzZWQoKSIgYnVpbHQtaW4gdG8gJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgICAgICcgICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3IgJworICAgICAgICAgICAgICAgICAnb2JqZWN0IHRoYXRcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSAnCisgICAgICAgICAgICAgICAgICdvcmRlci5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgdGhlICJfX3JldmVyc2VkX18oKSIgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlICcKKyAgICAgICAgICAgICAgICAgJyJyZXZlcnNlZCgpIlxuJworICAgICAgICAgICAgICAgICAnICAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlIHByb3RvY29sICcKKyAgICAgICAgICAgICAgICAgJygiX19sZW5fXygpIlxuJworICAgICAgICAgICAgICAgICAnICAgYW5kICJfX2dldGl0ZW1fXygpIikuICBPYmplY3RzIHRoYXQgc3VwcG9ydCB0aGUgc2VxdWVuY2UgJworICAgICAgICAgICAgICAgICAncHJvdG9jb2xcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBvbmx5IHByb3ZpZGUgIl9fcmV2ZXJzZWRfXygpIiBpZiB0aGV5IGNhbiBwcm92aWRlICcKKyAgICAgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgICAgICcgICBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSAnCisgICAgICAgICAgICAgICAgICdwcm92aWRlZCBieVxuJworICAgICAgICAgICAgICAgICAnICAgInJldmVyc2VkKCkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoImluIiBhbmQgIm5vdCBpbiIpIGFyZSAnCisgICAgICAgICAgICAgICAgICdub3JtYWxseVxuJworICAgICAgICAgICAgICAgICAnaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsICcKKyAgICAgICAgICAgICAgICAgJ2NvbnRhaW5lclxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIG1vcmUgJworICAgICAgICAgICAgICAgICAnZWZmaWNpZW50XG4nCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgYSAnCisgICAgICAgICAgICAgICAgICdzZXF1ZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgJworICAgICAgICAgICAgICAgICAncmV0dXJuIHRydWVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdHMsIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgJworICAgICAgICAgICAgICAgICAndmFsdWVzIG9yXG4nCisgICAgICAgICAgICAgICAgICcgICB0aGUga2V5LWl0ZW0gcGFpcnMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEZvciBvYmplY3RzIHRoYXQgZG9uXCd0IGRlZmluZSAiX19jb250YWluc19fKCkiLCB0aGUgJworICAgICAgICAgICAgICAgICAnbWVtYmVyc2hpcCB0ZXN0XG4nCisgICAgICAgICAgICAgICAgICcgICBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhICJfX2l0ZXJfXygpIiwgdGhlbiB0aGUgb2xkICcKKyAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgICAgICcgICBpdGVyYXRpb24gcHJvdG9jb2wgdmlhICJfX2dldGl0ZW1fXygpIiwgc2VlIHRoaXMgc2VjdGlvbiAnCisgICAgICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGxhbmd1YWdlIHJlZmVyZW5jZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdFbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuJworICAgICAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT1cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyAnCisgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCAnCisgICAgICAgICAgICAgICAgICdieSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3BhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2UgJworICAgICAgICAgICAgICAgICAnb3BlcmF0aW9ucyBmb3JcbicKKyAgICAgICAgICAgICAgICAgJ25vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21hdG11bF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSAnCisgICAgICAgICAgICAgICAgICdhcml0aG1ldGljXG4nCisgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zICgiKyIsICItIiwgIioiLCAiQCIsICIvIiwgIi8vIiwgIiUiLCAnCisgICAgICAgICAgICAgICAgICciZGl2bW9kKCkiLFxuJworICAgICAgICAgICAgICAgICAnICAgInBvdygpIiwgIioqIiwgIjw8IiwgIj4+IiwgIiYiLCAiXiIsICJ8IikuICBGb3IgaW5zdGFuY2UsICcKKyAgICAgICAgICAgICAgICAgJ3RvXG4nCisgICAgICAgICAgICAgICAgICcgICBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiAieCArIHkiLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2UgJworICAgICAgICAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3MgdGhhdCBoYXMgYW4gIl9fYWRkX18oKSIgbWV0aG9kLCAieC5fX2FkZF9fKHkpIiBpcyAnCisgICAgICAgICAgICAgICAgICdjYWxsZWQuXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGUgIl9fZGl2bW9kX18oKSIgbWV0aG9kIHNob3VsZCBiZSB0aGUgZXF1aXZhbGVudCB0byAnCisgICAgICAgICAgICAgICAgICd1c2luZ1xuJworICAgICAgICAgICAgICAgICAnICAgIl9fZmxvb3JkaXZfXygpIiBhbmQgIl9fbW9kX18oKSI7IGl0IHNob3VsZCBub3QgYmUgJworICAgICAgICAgICAgICAgICAncmVsYXRlZCB0b1xuJworICAgICAgICAgICAgICAgICAnICAgIl9fdHJ1ZWRpdl9fKCkiLiAgTm90ZSB0aGF0ICJfX3Bvd19fKCkiIHNob3VsZCBiZSBkZWZpbmVkICcKKyAgICAgICAgICAgICAgICAgJ3RvIGFjY2VwdFxuJworICAgICAgICAgICAgICAgICAnICAgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgJworICAgICAgICAgICAgICAgICAnYnVpbHQtaW5cbicKKyAgICAgICAgICAgICAgICAgJyAgICJwb3coKSIgZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiAiTm90SW1wbGVtZW50ZWQiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybWF0bXVsX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5ICcKKyAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKCIrIiwgIi0iLCAiKiIsICJAIiwgIi8iLCAiLy8iLCAiJSIsICcKKyAgICAgICAgICAgICAgICAgJyJkaXZtb2QoKSIsXG4nCisgICAgICAgICAgICAgICAgICcgICAicG93KCkiLCAiKioiLCAiPDwiLCAiPj4iLCAiJiIsICJeIiwgInwiKSB3aXRoIHJlZmxlY3RlZCAnCisgICAgICAgICAgICAgICAgICcoc3dhcHBlZClcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgbGVmdCAnCisgICAgICAgICAgICAgICAgICdvcGVyYW5kIGRvZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmQgdGhlIG9wZXJhbmRzICcKKyAgICAgICAgICAgICAgICAgJ2FyZSBvZlxuJworICAgICAgICAgICAgICAgICAnICAgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgJworICAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbiAieCAtXG4nCisgICAgICAgICAgICAgICAgICcgICB5Iiwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gJworICAgICAgICAgICAgICAgICAnIl9fcnN1Yl9fKCkiXG4nCisgICAgICAgICAgICAgICAgICcgICBtZXRob2QsICJ5Ll9fcnN1Yl9fKHgpIiBpcyBjYWxsZWQgaWYgInguX19zdWJfXyh5KSIgJworICAgICAgICAgICAgICAgICAncmV0dXJuc1xuJworICAgICAgICAgICAgICAgICAnICAgKk5vdEltcGxlbWVudGVkKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IHRlcm5hcnkgInBvdygpIiB3aWxsIG5vdCB0cnkgY2FsbGluZyAnCisgICAgICAgICAgICAgICAgICciX19ycG93X18oKSIgKHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICdsZWZ0XG4nCisgICAgICAgICAgICAgICAgICIgICAgIG9wZXJhbmQncyB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSByZWZsZWN0ZWQgIgorICAgICAgICAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGZvciB0aGUgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgJworICAgICAgICAgICAgICAgICAndGhlIGxlZnRcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgb3BlcmFuZCdzIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3MgIgorICAgICAgICAgICAgICAgICAnc3ViY2xhc3Nlc1xuJworICAgICAgICAgICAgICAgICAiICAgICB0byBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnMnIG9wZXJhdGlvbnMuXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltYXRtdWxfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkICcKKyAgICAgICAgICAgICAgICAgJ2FyaXRobWV0aWNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFzc2lnbm1lbnRzICgiKz0iLCAiLT0iLCAiKj0iLCAiQD0iLCAiLz0iLCAiLy89IiwgIiU9IiwgJworICAgICAgICAgICAgICAgICAnIioqPSIsXG4nCisgICAgICAgICAgICAgICAgICcgICAiPDw9IiwgIj4+PSIsICImPSIsICJePSIsICJ8PSIpLiAgVGhlc2UgbWV0aG9kcyBzaG91bGQgJworICAgICAgICAgICAgICAgICAnYXR0ZW1wdCB0b1xuJworICAgICAgICAgICAgICAgICAnICAgZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kIHJldHVybiAnCisgICAgICAgICAgICAgICAgICd0aGUgcmVzdWx0XG4nCisgICAgICAgICAgICAgICAgICcgICAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLCAqc2VsZiopLiAgSWYgYSAnCisgICAgICAgICAgICAgICAgICdzcGVjaWZpY1xuJworICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkIGFzc2lnbm1lbnQgZmFsbHMgJworICAgICAgICAgICAgICAgICAnYmFjayB0byB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCBpZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSAnCisgICAgICAgICAgICAgICAgICdjbGFzc1xuJworICAgICAgICAgICAgICAgICAnICAgd2l0aCBhbiAiX19pYWRkX18oKSIgbWV0aG9kLCAieCArPSB5IiBpcyBlcXVpdmFsZW50IHRvICJ4ICcKKyAgICAgICAgICAgICAgICAgJz1cbicKKyAgICAgICAgICAgICAgICAgJyAgIHguX19pYWRkX18oeSkiIC4gT3RoZXJ3aXNlLCAieC5fX2FkZF9fKHkpIiBhbmQgJworICAgICAgICAgICAgICAgICAnInkuX19yYWRkX18oeCkiIGFyZVxuJworICAgICAgICAgICAgICAgICAnICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiAieCArIHkiLiBJbiAnCisgICAgICAgICAgICAgICAgICdjZXJ0YWluXG4nCisgICAgICAgICAgICAgICAgICcgICBzaXR1YXRpb25zLCBhdWdtZW50ZWQgYXNzaWdubWVudCBjYW4gcmVzdWx0IGluIHVuZXhwZWN0ZWQgJworICAgICAgICAgICAgICAgICAnZXJyb3JzXG4nCisgICAgICAgICAgICAgICAgICIgICAoc2VlIFdoeSBkb2VzIGFfdHVwbGVbaV0gKz0gWydpdGVtJ10gcmFpc2UgYW4gZXhjZXB0aW9uICIKKyAgICAgICAgICAgICAgICAgJ3doZW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICcgICBhZGRpdGlvbiB3b3Jrcz8pLCBidXQgdGhpcyBiZWhhdmlvciBpcyBpbiBmYWN0IHBhcnQgb2YgJworICAgICAgICAgICAgICAgICAndGhlIGRhdGFcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1vZGVsLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19uZWdfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcG9zX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2Fic19fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbnZlcnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKCItIiwgJworICAgICAgICAgICAgICAgICAnIisiLFxuJworICAgICAgICAgICAgICAgICAnICAgImFicygpIiBhbmQgIn4iKS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19pbnRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9fcm91bmRfXyhzZWxmWywgbl0pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyAiY29tcGxleCgpIiwgJworICAgICAgICAgICAgICAgICAnImludCgpIixcbicKKyAgICAgICAgICAgICAgICAgJyAgICJmbG9hdCgpIiBhbmQgInJvdW5kKCkiLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICdhcHByb3ByaWF0ZVxuJworICAgICAgICAgICAgICAgICAnICAgdHlwZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnb2JqZWN0Ll9faW5kZXhfXyhzZWxmKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBDYWxsZWQgdG8gaW1wbGVtZW50ICJvcGVyYXRvci5pbmRleCgpIiwgYW5kIHdoZW5ldmVyICcKKyAgICAgICAgICAgICAgICAgJ1B5dGhvbiBuZWVkc1xuJworICAgICAgICAgICAgICAgICAnICAgdG8gbG9zc2xlc3NseSBjb252ZXJ0IHRoZSBudW1lcmljIG9iamVjdCB0byBhbiBpbnRlZ2VyICcKKyAgICAgICAgICAgICAgICAgJ29iamVjdCAoc3VjaFxuJworICAgICAgICAgICAgICAgICAnICAgYXMgaW4gc2xpY2luZywgb3IgaW4gdGhlIGJ1aWx0LWluICJiaW4oKSIsICJoZXgoKSIgYW5kICcKKyAgICAgICAgICAgICAgICAgJyJvY3QoKSJcbicKKyAgICAgICAgICAgICAgICAgJyAgIGZ1bmN0aW9ucykuIFByZXNlbmNlIG9mIHRoaXMgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSAnCisgICAgICAgICAgICAgICAgICdudW1lcmljXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QgaXMgYW4gaW50ZWdlciB0eXBlLiAgTXVzdCByZXR1cm4gYW4gaW50ZWdlci5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZTogSW4gb3JkZXIgdG8gaGF2ZSBhIGNvaGVyZW50IGludGVnZXIgdHlwZSBjbGFzcywgJworICAgICAgICAgICAgICAgICAnd2hlblxuJworICAgICAgICAgICAgICAgICAnICAgICAiX19pbmRleF9fKCkiIGlzIGRlZmluZWQgIl9faW50X18oKSIgc2hvdWxkIGFsc28gYmUgJworICAgICAgICAgICAgICAgICAnZGVmaW5lZCwgYW5kXG4nCisgICAgICAgICAgICAgICAgICcgICAgIGJvdGggc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdXaXRoIFN0YXRlbWVudCBDb250ZXh0IE1hbmFnZXJzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0EgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSAnCisgICAgICAgICAgICAgICAgICdjb250ZXh0IHRvXG4nCisgICAgICAgICAgICAgICAgICdiZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhICJ3aXRoIiBzdGF0ZW1lbnQuIFRoZSAnCisgICAgICAgICAgICAgICAgICdjb250ZXh0IG1hbmFnZXJcbicKKyAgICAgICAgICAgICAgICAgJ2hhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCAnCisgICAgICAgICAgICAgICAgICdydW50aW1lIGNvbnRleHRcbicKKyAgICAgICAgICAgICAgICAgJ2ZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyAnCisgICAgICAgICAgICAgICAgICdhcmUgbm9ybWFsbHlcbicKKyAgICAgICAgICAgICAgICAgJ2ludm9rZWQgdXNpbmcgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgKGRlc2NyaWJlZCBpbiBzZWN0aW9uIFRoZSAnCisgICAgICAgICAgICAgICAgICd3aXRoXG4nCisgICAgICAgICAgICAgICAgICdzdGF0ZW1lbnQpLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpciAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUeXBpY2FsIHVzZXMgb2YgY29udGV4dCBtYW5hZ2VycyBpbmNsdWRlIHNhdmluZyBhbmQgJworICAgICAgICAgICAgICAgICAncmVzdG9yaW5nIHZhcmlvdXNcbicKKyAgICAgICAgICAgICAgICAgJ2tpbmRzIG9mIGdsb2JhbCBzdGF0ZSwgbG9ja2luZyBhbmQgdW5sb2NraW5nIHJlc291cmNlcywgJworICAgICAgICAgICAgICAgICAnY2xvc2luZyBvcGVuZWRcbicKKyAgICAgICAgICAgICAgICAgJ2ZpbGVzLCBldGMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRleHQgbWFuYWdlcnMsIHNlZSBDb250ZXh0ICcKKyAgICAgICAgICAgICAgICAgJ01hbmFnZXIgVHlwZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdC5fX2VudGVyX18oc2VsZilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgJworICAgICAgICAgICAgICAgICAnIndpdGgiXG4nCisgICAgICAgICAgICAgICAgICIgICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSAiCisgICAgICAgICAgICAgICAgICd0YXJnZXQocylcbicKKyAgICAgICAgICAgICAgICAgJyAgIHNwZWNpZmllZCBpbiB0aGUgImFzIiBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdvYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlICcKKyAgICAgICAgICAgICAgICAgJ3BhcmFtZXRlcnNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgJworICAgICAgICAgICAgICAgICAnZXhpdGVkLiBJZiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlICcKKyAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyB3aWxsXG4nCisgICAgICAgICAgICAgICAgICcgICBiZSAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGFuIGV4Y2VwdGlvbiBpcyBzdXBwbGllZCwgYW5kIHRoZSBtZXRob2Qgd2lzaGVzIHRvICcKKyAgICAgICAgICAgICAgICAgJ3N1cHByZXNzIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgZXhjZXB0aW9uIChpLmUuLCBwcmV2ZW50IGl0IGZyb20gYmVpbmcgcHJvcGFnYXRlZCksIGl0ICcKKyAgICAgICAgICAgICAgICAgJ3Nob3VsZFxuJworICAgICAgICAgICAgICAgICAnICAgcmV0dXJuIGEgdHJ1ZSB2YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgJworICAgICAgICAgICAgICAgICAncHJvY2Vzc2VkXG4nCisgICAgICAgICAgICAgICAgICcgICBub3JtYWxseSB1cG9uIGV4aXQgZnJvbSB0aGlzIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgTm90ZSB0aGF0ICJfX2V4aXRfXygpIiBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgJworICAgICAgICAgICAgICAgICAncGFzc2VkLWluXG4nCisgICAgICAgICAgICAgICAgICIgICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5LlxuIgorICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTZWUgYWxzbzpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAqKlBFUCAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgICAgICcgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICdQeXRob24gIndpdGgiXG4nCisgICAgICAgICAgICAgICAgICcgICAgIHN0YXRlbWVudC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTcGVjaWFsIG1ldGhvZCBsb29rdXBcbicKKyAgICAgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdGb3IgY3VzdG9tIGNsYXNzZXMsIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHNwZWNpYWwgbWV0aG9kcyAnCisgICAgICAgICAgICAgICAgICdhcmUgb25seVxuJworICAgICAgICAgICAgICAgICAiZ3VhcmFudGVlZCB0byB3b3JrIGNvcnJlY3RseSBpZiBkZWZpbmVkIG9uIGFuIG9iamVjdCdzIHR5cGUsICIKKyAgICAgICAgICAgICAgICAgJ25vdCBpblxuJworICAgICAgICAgICAgICAgICAidGhlIG9iamVjdCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBUaGF0IGJlaGF2aW91ciBpcyB0aGUgIgorICAgICAgICAgICAgICAgICAncmVhc29uIHdoeVxuJworICAgICAgICAgICAgICAgICAndGhlIGZvbGxvd2luZyBjb2RlIHJhaXNlcyBhbiBleGNlcHRpb246XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBDOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBwYXNzXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjID0gQygpXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYy5fX2xlbl9fID0gbGFtYmRhOiA1XG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGVuKGMpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgICAgICAgICIgICBUeXBlRXJyb3I6IG9iamVjdCBvZiB0eXBlICdDJyBoYXMgbm8gbGVuKClcbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBiZWhhdmlvdXIgbGllcyB3aXRoIGEgbnVtYmVyIG9mICcKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWxcbicKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgc3VjaCBhcyAiX19oYXNoX18oKSIgYW5kICJfX3JlcHJfXygpIiB0aGF0IGFyZSAnCisgICAgICAgICAgICAgICAgICdpbXBsZW1lbnRlZCBieVxuJworICAgICAgICAgICAgICAgICAnYWxsIG9iamVjdHMsIGluY2x1ZGluZyB0eXBlIG9iamVjdHMuIElmIHRoZSBpbXBsaWNpdCBsb29rdXAgJworICAgICAgICAgICAgICAgICAnb2YgdGhlc2VcbicKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgdXNlZCB0aGUgY29udmVudGlvbmFsIGxvb2t1cCBwcm9jZXNzLCB0aGV5IHdvdWxkICcKKyAgICAgICAgICAgICAgICAgJ2ZhaWwgd2hlblxuJworICAgICAgICAgICAgICAgICAnaW52b2tlZCBvbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gMSAuX19oYXNoX18oKSA9PSBoYXNoKDEpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcnVlXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gaW50Ll9faGFzaF9fKCkgPT0gaGFzaChpbnQpXG4nCisgICAgICAgICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgICAgICAgICIgICBUeXBlRXJyb3I6IGRlc2NyaXB0b3IgJ19faGFzaF9fJyBvZiAnaW50JyBvYmplY3QgbmVlZHMgYW4gIgorICAgICAgICAgICAgICAgICAnYXJndW1lbnRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0byBpbnZva2UgYW4gdW5ib3VuZCBtZXRob2Qgb2YgYSAnCisgICAgICAgICAgICAgICAgICdjbGFzcyBpbiB0aGlzXG4nCisgICAgICAgICAgICAgICAgICJ3YXkgaXMgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzICdtZXRhY2xhc3MgY29uZnVzaW9uJywgYW5kICIKKyAgICAgICAgICAgICAgICAgJ2lzIGF2b2lkZWRcbicKKyAgICAgICAgICAgICAgICAgJ2J5IGJ5cGFzc2luZyB0aGUgaW5zdGFuY2Ugd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kczpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHR5cGUoMSkuX19oYXNoX18oMSkgPT0gaGFzaCgxKVxuJworICAgICAgICAgICAgICAgICAnICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHR5cGUoaW50KS5fX2hhc2hfXyhpbnQpID09IGhhc2goaW50KVxuJworICAgICAgICAgICAgICAgICAnICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdJbiBhZGRpdGlvbiB0byBieXBhc3NpbmcgYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2ludGVyZXN0IG9mXG4nCisgICAgICAgICAgICAgICAgICdjb3JyZWN0bmVzcywgaW1wbGljaXQgc3BlY2lhbCBtZXRob2QgbG9va3VwIGdlbmVyYWxseSBhbHNvICcKKyAgICAgICAgICAgICAgICAgJ2J5cGFzc2VzXG4nCisgICAgICAgICAgICAgICAgICd0aGUgIl9fZ2V0YXR0cmlidXRlX18oKSIgbWV0aG9kIGV2ZW4gb2YgdGhlIG9iamVjdFwncyAnCisgICAgICAgICAgICAgICAgICdtZXRhY2xhc3M6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBNZXRhKHR5cGUpOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICBwcmludCgiTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIilcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHJldHVybiB0eXBlLl9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4nCisgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBjbGFzcyBDKG9iamVjdCwgbWV0YWNsYXNzPU1ldGEpOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19sZW5fXyhzZWxmKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHJldHVybiAxMFxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXygqYXJncyk6XG4nCisgICAgICAgICAgICAgICAgICcgICAuLi4gICAgICAgICBwcmludCgiQ2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiKVxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKVxuJworICAgICAgICAgICAgICAgICAnICAgLi4uXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYyA9IEMoKVxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGMuX19sZW5fXygpICAgICAgICAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgJworICAgICAgICAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAgICAgICAgJyAgIENsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4nCisgICAgICAgICAgICAgICAgICcgICAxMFxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHR5cGUoYykuX19sZW5fXyhjKSAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgJworICAgICAgICAgICAgICAgICAndHlwZVxuJworICAgICAgICAgICAgICAgICAnICAgTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4nCisgICAgICAgICAgICAgICAgICcgICAxMFxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGxlbihjKSAgICAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0IGxvb2t1cFxuJworICAgICAgICAgICAgICAgICAnICAgMTBcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQnlwYXNzaW5nIHRoZSAiX19nZXRhdHRyaWJ1dGVfXygpIiBtYWNoaW5lcnkgaW4gdGhpcyBmYXNoaW9uICcKKyAgICAgICAgICAgICAgICAgJ3Byb3ZpZGVzXG4nCisgICAgICAgICAgICAgICAgICdzaWduaWZpY2FudCBzY29wZSBmb3Igc3BlZWQgb3B0aW1pc2F0aW9ucyB3aXRoaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2ludGVycHJldGVyLCBhdFxuJworICAgICAgICAgICAgICAgICAndGhlIGNvc3Qgb2Ygc29tZSBmbGV4aWJpbGl0eSBpbiB0aGUgaGFuZGxpbmcgb2Ygc3BlY2lhbCAnCisgICAgICAgICAgICAgICAgICdtZXRob2RzICh0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3NwZWNpYWwgbWV0aG9kICptdXN0KiBiZSBzZXQgb24gdGhlIGNsYXNzIG9iamVjdCBpdHNlbGYgaW4gJworICAgICAgICAgICAgICAgICAnb3JkZXIgdG8gYmVcbicKKyAgICAgICAgICAgICAgICAgJ2NvbnNpc3RlbnRseSBpbnZva2VkIGJ5IHRoZSBpbnRlcnByZXRlcikuXG4nLAorICdzdHJpbmctbWV0aG9kcyc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAnU3RyaW5nIE1ldGhvZHNcbicKKyAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1N0cmluZ3MgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIHNlcXVlbmNlIG9wZXJhdGlvbnMsICcKKyAgICAgICAgICAgICAgICAgICAnYWxvbmcgd2l0aFxuJworICAgICAgICAgICAgICAgICAgICd0aGUgYWRkaXRpb25hbCBtZXRob2RzIGRlc2NyaWJlZCBiZWxvdy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1N0cmluZ3MgYWxzbyBzdXBwb3J0IHR3byBzdHlsZXMgb2Ygc3RyaW5nIGZvcm1hdHRpbmcsIG9uZSAnCisgICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGluZyBhXG4nCisgICAgICAgICAgICAgICAgICAgJ2xhcmdlIGRlZ3JlZSBvZiBmbGV4aWJpbGl0eSBhbmQgY3VzdG9taXphdGlvbiAoc2VlICcKKyAgICAgICAgICAgICAgICAgICAnInN0ci5mb3JtYXQoKSIsXG4nCisgICAgICAgICAgICAgICAgICAgJ0Zvcm1hdCBTdHJpbmcgU3ludGF4IGFuZCBDdXN0b20gU3RyaW5nIEZvcm1hdHRpbmcpIGFuZCB0aGUgJworICAgICAgICAgICAgICAgICAgICdvdGhlciBiYXNlZFxuJworICAgICAgICAgICAgICAgICAgICdvbiBDICJwcmludGYiIHN0eWxlIGZvcm1hdHRpbmcgdGhhdCBoYW5kbGVzIGEgbmFycm93ZXIgJworICAgICAgICAgICAgICAgICAgICdyYW5nZSBvZiB0eXBlc1xuJworICAgICAgICAgICAgICAgICAgICdhbmQgaXMgc2xpZ2h0bHkgaGFyZGVyIHRvIHVzZSBjb3JyZWN0bHksIGJ1dCBpcyBvZnRlbiAnCisgICAgICAgICAgICAgICAgICAgJ2Zhc3RlciBmb3IgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ2Nhc2VzIGl0IGNhbiBoYW5kbGUgKHByaW50Zi1zdHlsZSBTdHJpbmcgRm9ybWF0dGluZykuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdUaGUgVGV4dCBQcm9jZXNzaW5nIFNlcnZpY2VzIHNlY3Rpb24gb2YgdGhlIHN0YW5kYXJkICcKKyAgICAgICAgICAgICAgICAgICAnbGlicmFyeSBjb3ZlcnMgYVxuJworICAgICAgICAgICAgICAgICAgICdudW1iZXIgb2Ygb3RoZXIgbW9kdWxlcyB0aGF0IHByb3ZpZGUgdmFyaW91cyB0ZXh0IHJlbGF0ZWQgJworICAgICAgICAgICAgICAgICAgICd1dGlsaXRpZXNcbicKKyAgICAgICAgICAgICAgICAgICAnKGluY2x1ZGluZyByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCBpbiB0aGUgInJlIiAnCisgICAgICAgICAgICAgICAgICAgJ21vZHVsZSkuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuY2FwaXRhbGl6ZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyICcKKyAgICAgICAgICAgICAgICAgICAnY2FwaXRhbGl6ZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZSByZXN0IGxvd2VyY2FzZWQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuY2FzZWZvbGQoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY2FzZWZvbGRlZCBjb3B5IG9mIHRoZSBzdHJpbmcuIENhc2Vmb2xkZWQgJworICAgICAgICAgICAgICAgICAgICdzdHJpbmdzIG1heSBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICB1c2VkIGZvciBjYXNlbGVzcyBtYXRjaGluZy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENhc2Vmb2xkaW5nIGlzIHNpbWlsYXIgdG8gbG93ZXJjYXNpbmcgYnV0IG1vcmUgJworICAgICAgICAgICAgICAgICAgICdhZ2dyZXNzaXZlIGJlY2F1c2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXQgaXMgaW50ZW5kZWQgdG8gcmVtb3ZlIGFsbCBjYXNlIGRpc3RpbmN0aW9ucyBpbiBhICcKKyAgICAgICAgICAgICAgICAgICAnc3RyaW5nLiBGb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXhhbXBsZSwgdGhlIEdlcm1hbiBsb3dlcmNhc2UgbGV0dGVyICJcJ8OfXCciIGlzICcKKyAgICAgICAgICAgICAgICAgICAnZXF1aXZhbGVudCB0byAiInNzIiIuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNpbmNlIGl0IGlzIGFscmVhZHkgbG93ZXJjYXNlLCAibG93ZXIoKSIgd291bGQgZG8gJworICAgICAgICAgICAgICAgICAgICdub3RoaW5nIHRvICJcJ8OfXCciO1xuJworICAgICAgICAgICAgICAgICAgICcgICAiY2FzZWZvbGQoKSIgY29udmVydHMgaXQgdG8gIiJzcyIiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIGNhc2Vmb2xkaW5nIGFsZ29yaXRobSBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAzLjEzICcKKyAgICAgICAgICAgICAgICAgICAnb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgU3RhbmRhcmQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBOZXcgaW4gdmVyc2lvbiAzLjMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGNlbnRlcmVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLiBQYWRkaW5nICcKKyAgICAgICAgICAgICAgICAgICAnaXMgZG9uZVxuJworICAgICAgICAgICAgICAgICAgICcgICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYW4gQVNDSUkgJworICAgICAgICAgICAgICAgICAgICdzcGFjZSkuIFRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgJworICAgICAgICAgICAgICAgICAgICdlcXVhbCB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICAibGVuKHMpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nICpzdWIqXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICcKKyAgICAgICAgICAgICAgICAgICAnKnN0YXJ0KiBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmVuY29kZShlbmNvZGluZz0idXRmLTgiLCBlcnJvcnM9InN0cmljdCIpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYW4gZW5jb2RlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgYXMgYSBieXRlcyAnCisgICAgICAgICAgICAgICAgICAgJ29iamVjdC4gRGVmYXVsdFxuJworICAgICAgICAgICAgICAgICAgICcgICBlbmNvZGluZyBpcyAiXCd1dGYtOFwnIi4gKmVycm9ycyogbWF5IGJlIGdpdmVuIHRvIHNldCBhICcKKyAgICAgICAgICAgICAgICAgICAnZGlmZmVyZW50XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVycm9yIGhhbmRsaW5nIHNjaGVtZS4gVGhlIGRlZmF1bHQgZm9yICplcnJvcnMqIGlzICcKKyAgICAgICAgICAgICAgICAgICAnIlwnc3RyaWN0XCciLFxuJworICAgICAgICAgICAgICAgICAgICcgICBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGEgIlVuaWNvZGVFcnJvciIuICcKKyAgICAgICAgICAgICAgICAgICAnT3RoZXIgcG9zc2libGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdmFsdWVzIGFyZSAiXCdpZ25vcmVcJyIsICJcJ3JlcGxhY2VcJyIsICcKKyAgICAgICAgICAgICAgICAgICAnIlwneG1sY2hhcnJlZnJlcGxhY2VcJyIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJcJ2JhY2tzbGFzaHJlcGxhY2VcJyIgYW5kIGFueSBvdGhlciBuYW1lIHJlZ2lzdGVyZWQgJworICAgICAgICAgICAgICAgICAgICd2aWFcbicKKyAgICAgICAgICAgICAgICAgICAnICAgImNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpIiwgc2VlIHNlY3Rpb24gRXJyb3IgSGFuZGxlcnMuICcKKyAgICAgICAgICAgICAgICAgICAnRm9yIGEgbGlzdFxuJworICAgICAgICAgICAgICAgICAgICcgICBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZSBzZWN0aW9uIFN0YW5kYXJkIEVuY29kaW5ncy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENoYW5nZWQgaW4gdmVyc2lvbiAzLjE6IFN1cHBvcnQgZm9yIGtleXdvcmQgYXJndW1lbnRzICcKKyAgICAgICAgICAgICAgICAgICAnYWRkZWQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiAiVHJ1ZSIgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCAnCisgICAgICAgICAgICAgICAgICAgJypzdWZmaXgqLFxuJworICAgICAgICAgICAgICAgICAgICcgICBvdGhlcndpc2UgcmV0dXJuICJGYWxzZSIuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlICcKKyAgICAgICAgICAgICAgICAgICAnb2Ygc3VmZml4ZXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3QgYmVnaW5uaW5nIGF0ICcKKyAgICAgICAgICAgICAgICAgICAndGhhdFxuJworICAgICAgICAgICAgICAgICAgICcgICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIGF0IHRoYXQgJworICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5leHBhbmR0YWJzKHRhYnNpemU9OClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBhbGwgdGFiIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICAgICdhcmUgcmVwbGFjZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uICcKKyAgICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBnaXZlbiB0YWIgc2l6ZS4gIFRhYiBwb3NpdGlvbnMgb2NjdXIgZXZlcnkgKnRhYnNpemUqICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVyc1xuJworICAgICAgICAgICAgICAgICAgICcgICAoZGVmYXVsdCBpcyA4LCBnaXZpbmcgdGFiIHBvc2l0aW9ucyBhdCBjb2x1bW5zIDAsIDgsIDE2ICcKKyAgICAgICAgICAgICAgICAgICAnYW5kIHNvIG9uKS5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZXQgdG8gemVybyAnCisgICAgICAgICAgICAgICAgICAgJ2FuZCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc3RyaW5nIGlzIGV4YW1pbmVkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuICBJZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXIgaXMgYVxuJworICAgICAgICAgICAgICAgICAgICcgICB0YWIgKCJcXHQiKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgJworICAgICAgICAgICAgICAgICAgICdpbiB0aGUgcmVzdWx0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVudGlsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBlcXVhbCB0byB0aGUgbmV4dCB0YWIgJworICAgICAgICAgICAgICAgICAgICdwb3NpdGlvbi4gKFRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICB0YWIgY2hhcmFjdGVyIGl0c2VsZiBpcyBub3QgY29waWVkLikgIElmIHRoZSBjaGFyYWN0ZXIgJworICAgICAgICAgICAgICAgICAgICdpcyBhIG5ld2xpbmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKCJcXG4iKSBvciByZXR1cm4gKCJcXHIiKSwgaXQgaXMgY29waWVkIGFuZCB0aGUgY3VycmVudCAnCisgICAgICAgICAgICAgICAgICAgJ2NvbHVtbiBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICByZXNldCB0byB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkICcKKyAgICAgICAgICAgICAgICAgICAnYW5kIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjdXJyZW50IGNvbHVtbiBpcyBpbmNyZW1lbnRlZCBieSBvbmUgcmVnYXJkbGVzcyBvZiBob3cgJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIHdoZW4gcHJpbnRlZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgID4+PiAnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzQnLmV4cGFuZHRhYnMoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAnMDEgICAgICAwMTIgICAgIDAxMjMgICAgMDEyMzQnXG4iCisgICAgICAgICAgICAgICAgICAgIiAgID4+PiAnMDFcXHQwMTJcXHQwMTIzXFx0MDEyMzQnLmV4cGFuZHRhYnMoNClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgJzAxICAwMTIgMDEyMyAgICAwMTIzNCdcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAnCisgICAgICAgICAgICAgICAgICAgJypzdWIqIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvdW5kIHdpdGhpbiB0aGUgc2xpY2UgInNbc3RhcnQ6ZW5kXSIuICBPcHRpb25hbCAnCisgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50cyAqc3RhcnQqXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFuZCAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uICBSZXR1cm4gJworICAgICAgICAgICAgICAgICAgICciLTEiIGlmXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICpzdWIqIGlzIG5vdCBmb3VuZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5vdGU6IFRoZSAiZmluZCgpIiBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgJworICAgICAgICAgICAgICAgICAgICduZWVkIHRvIGtub3dcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICB0aGUgcG9zaXRpb24gb2YgKnN1YiouICBUbyBjaGVjayBpZiAqc3ViKiBpcyBhICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nIG9yIG5vdCxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICB1c2UgdGhlICJpbiIgb3BlcmF0b3I6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICAgID4+PiAnUHknIGluICdQeXRob24nXG4iCisgICAgICAgICAgICAgICAgICAgJyAgICAgICAgVHJ1ZVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBQZXJmb3JtIGEgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgVGhlIHN0cmluZyBvbiAnCisgICAgICAgICAgICAgICAgICAgJ3doaWNoIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbWV0aG9kIGlzIGNhbGxlZCBjYW4gY29udGFpbiBsaXRlcmFsIHRleHQgb3IgJworICAgICAgICAgICAgICAgICAgICdyZXBsYWNlbWVudCBmaWVsZHNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGVsaW1pdGVkIGJ5IGJyYWNlcyAie30iLiAgRWFjaCByZXBsYWNlbWVudCBmaWVsZCAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnRhaW5zIGVpdGhlclxuJworICAgICAgICAgICAgICAgICAgICcgICB0aGUgbnVtZXJpYyBpbmRleCBvZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQsIG9yIHRoZSBuYW1lICcKKyAgICAgICAgICAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICAgICAgICAgICcgICBrZXl3b3JkIGFyZ3VtZW50LiAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSAnCisgICAgICAgICAgICAgICAgICAgJ2VhY2hcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVwbGFjZW1lbnQgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mICcKKyAgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKVxuJworICAgICAgICAgICAgICAgICAgICIgICAnVGhlIHN1bSBvZiAxICsgMiBpcyAzJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgU2VlIEZvcm1hdCBTdHJpbmcgU3ludGF4IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3ZhcmlvdXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpbiBmb3JtYXQgJworICAgICAgICAgICAgICAgICAgICdzdHJpbmdzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmZvcm1hdF9tYXAobWFwcGluZylcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNpbWlsYXIgdG8gInN0ci5mb3JtYXQoKiptYXBwaW5nKSIsIGV4Y2VwdCB0aGF0ICcKKyAgICAgICAgICAgICAgICAgICAnIm1hcHBpbmciIGlzIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGlyZWN0bHkgYW5kIG5vdCBjb3BpZWQgdG8gYSAiZGljdCIuICBUaGlzIGlzIHVzZWZ1bCBpZiAnCisgICAgICAgICAgICAgICAgICAgJ2ZvciBleGFtcGxlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJtYXBwaW5nIiBpcyBhIGRpY3Qgc3ViY2xhc3M6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICA+Pj4gY2xhc3MgRGVmYXVsdChkaWN0KTpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KTpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIGtleVxuJworICAgICAgICAgICAgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgICAiICAgPj4+ICd7bmFtZX0gd2FzIGJvcm4gaW4gIgorICAgICAgICAgICAgICAgICAgICJ7Y291bnRyeX0nLmZvcm1hdF9tYXAoRGVmYXVsdChuYW1lPSdHdWlkbycpKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAnR3VpZG8gd2FzIGJvcm4gaW4gY291bnRyeSdcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgTGlrZSAiZmluZCgpIiwgYnV0IHJhaXNlICJWYWx1ZUVycm9yIiB3aGVuIHRoZSAnCisgICAgICAgICAgICAgICAgICAgJ3N1YnN0cmluZyBpcyBub3RcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm91bmQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNhbG51bSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSAnCisgICAgICAgICAgICAgICAgICAgJ2FscGhhbnVtZXJpYyBhbmRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgQSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlciAiYyJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaXMgYWxwaGFudW1lcmljIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJldHVybnMgJworICAgICAgICAgICAgICAgICAgICciVHJ1ZSI6XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJjLmlzYWxwaGEoKSIsICJjLmlzZGVjaW1hbCgpIiwgImMuaXNkaWdpdCgpIiwgb3IgJworICAgICAgICAgICAgICAgICAgICciYy5pc251bWVyaWMoKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNhbHBoYSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSAnCisgICAgICAgICAgICAgICAgICAgJ2FscGhhYmV0aWMgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gICcKKyAgICAgICAgICAgICAgICAgICAnQWxwaGFiZXRpY1xuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXJzIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGF0YWJhc2UgYXMgIkxldHRlciIsIGkuZS4sIHRob3NlIHdpdGggZ2VuZXJhbCBjYXRlZ29yeSAnCisgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnR5XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGJlaW5nIG9uZSBvZiAiTG0iLCAiTHQiLCAiTHUiLCAiTGwiLCBvciAiTG8iLiAgTm90ZSAnCisgICAgICAgICAgICAgICAgICAgJ3RoYXQgdGhpcyBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBkaWZmZXJlbnQgZnJvbSB0aGUgIkFscGhhYmV0aWMiIHByb3BlcnR5IGRlZmluZWQgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAnVW5pY29kZVxuJworICAgICAgICAgICAgICAgICAgICcgICBTdGFuZGFyZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2RlY2ltYWwoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgZGVjaW1hbCAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gJworICAgICAgICAgICAgICAgICAgICdEZWNpbWFsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgYXJlIHRob3NlIGZyb20gZ2VuZXJhbCBjYXRlZ29yeSAiTmQiLiBUaGlzICcKKyAgICAgICAgICAgICAgICAgICAnY2F0ZWdvcnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgaW5jbHVkZXMgZGlnaXQgY2hhcmFjdGVycywgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgY2FuICcKKyAgICAgICAgICAgICAgICAgICAnYmUgdXNlZCB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICBmb3JtIGRlY2ltYWwtcmFkaXggbnVtYmVycywgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyAnCisgICAgICAgICAgICAgICAgICAgJ0RJR0lUIFpFUk8uXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNkaWdpdCgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgJworICAgICAgICAgICAgICAgICAgICdhbmQgdGhlcmUgaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgRGlnaXRzICcKKyAgICAgICAgICAgICAgICAgICAnaW5jbHVkZSBkZWNpbWFsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgYW5kIGRpZ2l0cyB0aGF0IG5lZWQgc3BlY2lhbCBoYW5kbGluZywgc3VjaCAnCisgICAgICAgICAgICAgICAgICAgJ2FzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjb21wYXRpYmlsaXR5IHN1cGVyc2NyaXB0IGRpZ2l0cy4gIEZvcm1hbGx5LCBhIGRpZ2l0IGlzICcKKyAgICAgICAgICAgICAgICAgICAnYSBjaGFyYWN0ZXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhhdCBoYXMgdGhlIHByb3BlcnR5IHZhbHVlIE51bWVyaWNfVHlwZT1EaWdpdCBvclxuJworICAgICAgICAgICAgICAgICAgICcgICBOdW1lcmljX1R5cGU9RGVjaW1hbC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5pc2lkZW50aWZpZXIoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHZhbGlkIGlkZW50aWZpZXIgJworICAgICAgICAgICAgICAgICAgICdhY2NvcmRpbmcgdG8gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGxhbmd1YWdlIGRlZmluaXRpb24sIHNlY3Rpb24gSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVXNlICJrZXl3b3JkLmlza2V5d29yZCgpIiB0byB0ZXN0IGZvciByZXNlcnZlZCAnCisgICAgICAgICAgICAgICAgICAgJ2lkZW50aWZpZXJzIHN1Y2ggYXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgImRlZiIgYW5kICJjbGFzcyIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXNsb3dlcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyAnCisgICAgICAgICAgICAgICAgICAgJ2FyZSBsb3dlcmNhc2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlICcKKyAgICAgICAgICAgICAgICAgICAnb3RoZXJ3aXNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzbnVtZXJpYygpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBudW1lcmljICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS4gJworICAgICAgICAgICAgICAgICAgICdOdW1lcmljXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLCBhbmQgYWxsIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICAgICd0aGF0IGhhdmVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIFVuaWNvZGUgbnVtZXJpYyB2YWx1ZSBwcm9wZXJ0eSwgZS5nLiBVKzIxNTUsIFZVTEdBUiAnCisgICAgICAgICAgICAgICAgICAgJ0ZSQUNUSU9OXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE9ORSBGSUZUSC4gIEZvcm1hbGx5LCBudW1lcmljIGNoYXJhY3RlcnMgYXJlIHRob3NlIHdpdGggJworICAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcHJvcGVydHkgdmFsdWUgTnVtZXJpY19UeXBlPURpZ2l0LCBOdW1lcmljX1R5cGU9RGVjaW1hbCAnCisgICAgICAgICAgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIE51bWVyaWNfVHlwZT1OdW1lcmljLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzcHJpbnRhYmxlKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlICcKKyAgICAgICAgICAgICAgICAgICAncHJpbnRhYmxlIG9yIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzdHJpbmcgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4gIE5vbnByaW50YWJsZSAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgYXJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRob3NlIGNoYXJhY3RlcnMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgJworICAgICAgICAgICAgICAgICAgICdkYXRhYmFzZSBhc1xuJworICAgICAgICAgICAgICAgICAgICcgICAiT3RoZXIiIG9yICJTZXBhcmF0b3IiLCBleGNlcHRpbmcgdGhlIEFTQ0lJIHNwYWNlICcKKyAgICAgICAgICAgICAgICAgICAnKDB4MjApIHdoaWNoIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbnNpZGVyZWQgcHJpbnRhYmxlLiAgKE5vdGUgdGhhdCBwcmludGFibGUgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ2luIHRoaXNcbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29udGV4dCBhcmUgdGhvc2Ugd2hpY2ggc2hvdWxkIG5vdCBiZSBlc2NhcGVkIHdoZW4gJworICAgICAgICAgICAgICAgICAgICcicmVwcigpIiBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBpbnZva2VkIG9uIGEgc3RyaW5nLiAgSXQgaGFzIG5vIGJlYXJpbmcgb24gdGhlIGhhbmRsaW5nICcKKyAgICAgICAgICAgICAgICAgICAnb2Ygc3RyaW5nc1xuJworICAgICAgICAgICAgICAgICAgICcgICB3cml0dGVuIHRvICJzeXMuc3Rkb3V0IiBvciAic3lzLnN0ZGVyciIuKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzc3BhY2UoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluICcKKyAgICAgICAgICAgICAgICAgICAndGhlIHN0cmluZ1xuJworICAgICAgICAgICAgICAgICAgICcgICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLiAgJworICAgICAgICAgICAgICAgICAgICdXaGl0ZXNwYWNlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNoYXJhY3RlcnMgIGFyZSB0aG9zZSBjaGFyYWN0ZXJzIGRlZmluZWQgaW4gdGhlIFVuaWNvZGUgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZGF0YWJhc2UgYXMgIk90aGVyIiBvciAiU2VwYXJhdG9yIiBhbmQgdGhvc2Ugd2l0aCAnCisgICAgICAgICAgICAgICAgICAgJ2JpZGlyZWN0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcHJvcGVydHkgYmVpbmcgb25lIG9mICJXUyIsICJCIiwgb3IgIlMiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmlzdGl0bGUoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBpcyBhIHRpdGxlY2FzZWQgc3RyaW5nIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ3RoZXJlIGlzIGF0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzICcKKyAgICAgICAgICAgICAgICAgICAnbWF5IG9ubHlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZm9sbG93IHVuY2FzZWQgY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSAnCisgICAgICAgICAgICAgICAgICAgJ2Nhc2VkIG9uZXMuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBmYWxzZSBvdGhlcndpc2UuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuaXN1cHBlcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyAnCisgICAgICAgICAgICAgICAgICAgJ2FyZSB1cHBlcmNhc2VcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlICcKKyAgICAgICAgICAgICAgICAgICAnb3RoZXJ3aXNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLmpvaW4oaXRlcmFibGUpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc3RyaW5ncyBpbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKml0ZXJhYmxlKiAqaXRlcmFibGUqLiAgQSAiVHlwZUVycm9yIiB3aWxsIGJlIHJhaXNlZCBpZiAnCisgICAgICAgICAgICAgICAgICAgJ3RoZXJlIGFyZVxuJworICAgICAgICAgICAgICAgICAgICcgICBhbnkgbm9uLXN0cmluZyB2YWx1ZXMgaW4gKml0ZXJhYmxlKiwgaW5jbHVkaW5nICJieXRlcyIgJworICAgICAgICAgICAgICAgICAgICdvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAgICcgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4gZWxlbWVudHMgaXMgdGhlIHN0cmluZyBwcm92aWRpbmcgJworICAgICAgICAgICAgICAgICAgICd0aGlzIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAnCisgICAgICAgICAgICAgICAgICAgJyp3aWR0aCouXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgJworICAgICAgICAgICAgICAgICAgICdpcyBhbiBBU0NJSVxuJworICAgICAgICAgICAgICAgICAgICcgICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyAnCisgICAgICAgICAgICAgICAgICAgJ2xlc3MgdGhhbiBvclxuJworICAgICAgICAgICAgICAgICAgICcgICBlcXVhbCB0byAibGVuKHMpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5sb3dlcigpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyBbNF1cbicKKyAgICAgICAgICAgICAgICAgICAnICAgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoZSBsb3dlcmNhc2luZyBhbGdvcml0aG0gdXNlZCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAnCisgICAgICAgICAgICAgICAgICAgJzMuMTMgb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgU3RhbmRhcmQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIubHN0cmlwKFtjaGFyc10pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgJworICAgICAgICAgICAgICAgICAgICdyZW1vdmVkLiAgVGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycyB0byBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICByZW1vdmVkLiAgSWYgb21pdHRlZCBvciAiTm9uZSIsIHRoZSAqY2hhcnMqIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAnZGVmYXVsdHMgdG9cbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhICcKKyAgICAgICAgICAgICAgICAgICAncHJlZml4OyByYXRoZXIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJyAgIHNwYWNpb3VzICAgJy5sc3RyaXAoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAnc3BhY2lvdXMgICAnXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnd3d3LmV4YW1wbGUuY29tJy5sc3RyaXAoJ2Ntb3d6LicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdleGFtcGxlLmNvbSdcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0YXRpYyBzdHIubWFrZXRyYW5zKHhbLCB5Wywgel1dKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhpcyBzdGF0aWMgbWV0aG9kIHJldHVybnMgYSB0cmFuc2xhdGlvbiB0YWJsZSB1c2FibGUgJworICAgICAgICAgICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgInN0ci50cmFuc2xhdGUoKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiB0aGVyZSBpcyBvbmx5IG9uZSBhcmd1bWVudCwgaXQgbXVzdCBiZSBhIGRpY3Rpb25hcnkgJworICAgICAgICAgICAgICAgICAgICdtYXBwaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgb3JkaW5hbHMgKGludGVnZXJzKSBvciBjaGFyYWN0ZXJzIChzdHJpbmdzIG9mICcKKyAgICAgICAgICAgICAgICAgICAnbGVuZ3RoIDEpIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgb3JkaW5hbHMsIHN0cmluZ3MgKG9mIGFyYml0cmFyeSBsZW5ndGhzKSBvciAnCisgICAgICAgICAgICAgICAgICAgJ05vbmUuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIENoYXJhY3RlciBrZXlzIHdpbGwgdGhlbiBiZSBjb252ZXJ0ZWQgdG8gb3JkaW5hbHMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBJZiB0aGVyZSBhcmUgdHdvIGFyZ3VtZW50cywgdGhleSBtdXN0IGJlIHN0cmluZ3Mgb2YgJworICAgICAgICAgICAgICAgICAgICdlcXVhbCBsZW5ndGgsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFuZCBpbiB0aGUgcmVzdWx0aW5nIGRpY3Rpb25hcnksIGVhY2ggY2hhcmFjdGVyIGluIHggJworICAgICAgICAgICAgICAgICAgICd3aWxsIGJlIG1hcHBlZFxuJworICAgICAgICAgICAgICAgICAgICcgICB0byB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGluIHkuICBJZiB0aGVyZSAnCisgICAgICAgICAgICAgICAgICAgJ2lzIGEgdGhpcmRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQsIGl0IG11c3QgYmUgYSBzdHJpbmcsIHdob3NlIGNoYXJhY3RlcnMgd2lsbCBiZSAnCisgICAgICAgICAgICAgICAgICAgJ21hcHBlZCB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICBOb25lIGluIHRoZSByZXN1bHQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucGFydGl0aW9uKHNlcClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybiBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc2VwYXJhdG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3IgaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBpdHNlbGYsICcKKyAgICAgICAgICAgICAgICAgICAnZm9sbG93ZWQgYnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdHdvIGVtcHR5IHN0cmluZ3MuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucmVwbGFjZShvbGQsIG5ld1ssIGNvdW50XSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiAnCisgICAgICAgICAgICAgICAgICAgJ3N1YnN0cmluZyAqb2xkKlxuJworICAgICAgICAgICAgICAgICAgICcgICByZXBsYWNlZCBieSAqbmV3Ki4gIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCAqY291bnQqIGlzICcKKyAgICAgICAgICAgICAgICAgICAnZ2l2ZW4sIG9ubHlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIGZpcnN0ICpjb3VudCogb2NjdXJyZW5jZXMgYXJlIHJlcGxhY2VkLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgJworICAgICAgICAgICAgICAgICAgICcqc3ViKiBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBmb3VuZCwgc3VjaCB0aGF0ICpzdWIqIGlzIGNvbnRhaW5lZCB3aXRoaW4gJworICAgICAgICAgICAgICAgICAgICcic1tzdGFydDplbmRdIi5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyAnCisgICAgICAgICAgICAgICAgICAgJ2luIHNsaWNlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG5vdGF0aW9uLiAgUmV0dXJuICItMSIgb24gZmFpbHVyZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIExpa2UgInJmaW5kKCkiIGJ1dCByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc3Vic3RyaW5nICpzdWIqIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG5vdCBmb3VuZC5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggJworICAgICAgICAgICAgICAgICAgICcqd2lkdGgqLlxuJworICAgICAgICAgICAgICAgICAgICcgICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0ICcKKyAgICAgICAgICAgICAgICAgICAnaXMgYW4gQVNDSUlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgJworICAgICAgICAgICAgICAgICAgICdsZXNzIHRoYW4gb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXF1YWwgdG8gImxlbihzKSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucnBhcnRpdGlvbihzZXApXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybiBhXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnc2VwYXJhdG9yXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgJworICAgICAgICAgICAgICAgICAgICdzZXBhcmF0b3IgaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsICcKKyAgICAgICAgICAgICAgICAgICAnZm9sbG93ZWQgYnlcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGhlIHN0cmluZyBpdHNlbGYuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIucnNwbGl0KHNlcD1Ob25lLCBtYXhzcGxpdD0tMSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqICcKKyAgICAgICAgICAgICAgICAgICAnYXMgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgJworICAgICAgICAgICAgICAgICAgICcqbWF4c3BsaXQqIHNwbGl0c1xuJworICAgICAgICAgICAgICAgICAgICcgICBhcmUgZG9uZSwgdGhlICpyaWdodG1vc3QqIG9uZXMuICBJZiAqc2VwKiBpcyBub3QgJworICAgICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgb3JcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIk5vbmUiLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcgaXMgYSBzZXBhcmF0b3IuICBFeGNlcHQgJworICAgICAgICAgICAgICAgICAgICdmb3Igc3BsaXR0aW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGZyb20gdGhlIHJpZ2h0LCAicnNwbGl0KCkiIGJlaGF2ZXMgbGlrZSAic3BsaXQoKSIgd2hpY2ggJworICAgICAgICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBkZXNjcmliZWQgaW4gZGV0YWlsIGJlbG93LlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnJzdHJpcChbY2hhcnNdKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdHJhaWxpbmcgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ3JlbW92ZWQuICBUaGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgJworICAgICAgICAgICAgICAgICAgICdjaGFyYWN0ZXJzIHRvIGJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yICJOb25lIiwgdGhlICpjaGFycyogYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAgICdkZWZhdWx0cyB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgJworICAgICAgICAgICAgICAgICAgICdzdWZmaXg7IHJhdGhlcixcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLnJzdHJpcCgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICcgICBzcGFjaW91cydcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICdtaXNzaXNzaXBwaScucnN0cmlwKCdpcHonKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICAnbWlzc2lzcydcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5zcGxpdChzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiAnCisgICAgICAgICAgICAgICAgICAgJ2FzIHRoZVxuJworICAgICAgICAgICAgICAgICAgICcgICBkZWxpbWl0ZXIgc3RyaW5nLiAgSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAnCisgICAgICAgICAgICAgICAgICAgJyptYXhzcGxpdCpcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCAnCisgICAgICAgICAgICAgICAgICAgJyJtYXhzcGxpdCsxIlxuJworICAgICAgICAgICAgICAgICAgICcgICBlbGVtZW50cykuICBJZiAqbWF4c3BsaXQqIGlzIG5vdCBzcGVjaWZpZWQgb3IgIi0xIiwgJworICAgICAgICAgICAgICAgICAgICd0aGVuIHRoZXJlIGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzICcKKyAgICAgICAgICAgICAgICAgICAnYXJlIG1hZGUpLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgSWYgKnNlcCogaXMgZ2l2ZW4sIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMgYXJlIG5vdCAnCisgICAgICAgICAgICAgICAgICAgJ2dyb3VwZWQgdG9nZXRoZXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYW5kIGFyZSBkZWVtZWQgdG8gZGVsaW1pdCBlbXB0eSBzdHJpbmdzIChmb3IgZXhhbXBsZSxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgIlwnMSwsMlwnLnNwbGl0KFwnLFwnKSIgcmV0dXJucyAiW1wnMVwnLCBcJ1wnLCAnCisgICAgICAgICAgICAgICAgICAgJ1wnMlwnXSIpLiAgVGhlICpzZXAqIGFyZ3VtZW50XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuJworICAgICAgICAgICAgICAgICAgICcgICAiXCcxPD4yPD4zXCcuc3BsaXQoXCc8PlwnKSIgcmV0dXJucyAiW1wnMVwnLCBcJzJcJywgJworICAgICAgICAgICAgICAgICAgICdcJzNcJ10iKS4gU3BsaXR0aW5nIGFuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVtcHR5IHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIHNlcGFyYXRvciByZXR1cm5zICcKKyAgICAgICAgICAgICAgICAgICAnIltcJ1wnXSIuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnMSwyLDMnLnNwbGl0KCcsJylcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycxJywgJzInLCAnMyddXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnMSwyLDMnLnNwbGl0KCcsJywgbWF4c3BsaXQ9MSlcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycxJywgJzIsMyddXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnMSwyLCwzLCcuc3BsaXQoJywnKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMicsICcnLCAnMycsICcnXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvciBpcyAiTm9uZSIsIGEgZGlmZmVyZW50ICcKKyAgICAgICAgICAgICAgICAgICAnc3BsaXR0aW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGFsZ29yaXRobSBpcyBhcHBsaWVkOiBydW5zIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgJworICAgICAgICAgICAgICAgICAgICdhcmUgcmVnYXJkZWRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXMgYSBzaW5nbGUgc2VwYXJhdG9yLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGNvbnRhaW4gbm8gJworICAgICAgICAgICAgICAgICAgICdlbXB0eSBzdHJpbmdzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGF0IHRoZSBzdGFydCBvciBlbmQgaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBvciAnCisgICAgICAgICAgICAgICAgICAgJ3RyYWlsaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHdoaXRlc3BhY2UuICBDb25zZXF1ZW50bHksIHNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgb3IgJworICAgICAgICAgICAgICAgICAgICdhIHN0cmluZ1xuJworICAgICAgICAgICAgICAgICAgICcgICBjb25zaXN0aW5nIG9mIGp1c3Qgd2hpdGVzcGFjZSB3aXRoIGEgIk5vbmUiIHNlcGFyYXRvciAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybnMgIltdIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIEZvciBleGFtcGxlOlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxIDIgMycuc3BsaXQoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJzEnLCAnMicsICczJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICcxIDIgMycuc3BsaXQobWF4c3BsaXQ9MSlcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgWycxJywgJzIgMyddXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnICAgMSAgIDIgICAzICAgJy5zcGxpdCgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnMScsICcyJywgJzMnXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnNwbGl0bGluZXMoW2tlZXBlbmRzXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIGxpbmVzIGluIHRoZSBzdHJpbmcsIGJyZWFraW5nIGF0ICcKKyAgICAgICAgICAgICAgICAgICAnbGluZVxuJworICAgICAgICAgICAgICAgICAgICcgICBib3VuZGFyaWVzLiAgTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgJworICAgICAgICAgICAgICAgICAgICdyZXN1bHRpbmcgbGlzdFxuJworICAgICAgICAgICAgICAgICAgICcgICB1bmxlc3MgKmtlZXBlbmRzKiBpcyBnaXZlbiBhbmQgdHJ1ZS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoaXMgbWV0aG9kIHNwbGl0cyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgYm91bmRhcmllcy4gICcKKyAgICAgICAgICAgICAgICAgICAnSW5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgcGFydGljdWxhciwgdGhlIGJvdW5kYXJpZXMgYXJlIGEgc3VwZXJzZXQgb2YgKnVuaXZlcnNhbCAnCisgICAgICAgICAgICAgICAgICAgJ25ld2xpbmVzKi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCBSZXByZXNlbnRhdGlvbiAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAgICAgICAnRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcbiIgICAgICAgICAgICAgICAgICAgIHwgTGluZSAnCisgICAgICAgICAgICAgICAgICAgJ0ZlZWQgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFxyIiAgICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSAnCisgICAgICAgICAgICAgICAgICAgJ1JldHVybiAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHJcXG4iICAgICAgICAgICAgICAgICAgfCBDYXJyaWFnZSBSZXR1cm4gKyBMaW5lICcKKyAgICAgICAgICAgICAgICAgICAnRmVlZCAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHYiIG9yICJcXHgwYiIgICAgICAgICAgfCBMaW5lICcKKyAgICAgICAgICAgICAgICAgICAnVGFidWxhdGlvbiAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXGYiIG9yICJcXHgwYyIgICAgICAgICAgfCBGb3JtICcKKyAgICAgICAgICAgICAgICAgICAnRmVlZCAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHgxYyIgICAgICAgICAgICAgICAgICB8IEZpbGUgJworICAgICAgICAgICAgICAgICAgICdTZXBhcmF0b3IgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxceDFkIiAgICAgICAgICAgICAgICAgIHwgR3JvdXAgJworICAgICAgICAgICAgICAgICAgICdTZXBhcmF0b3IgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFx4MWUiICAgICAgICAgICAgICAgICAgfCBSZWNvcmQgJworICAgICAgICAgICAgICAgICAgICdTZXBhcmF0b3IgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICcgICB8ICJcXHg4NSIgICAgICAgICAgICAgICAgICB8IE5leHQgTGluZSAoQzEgQ29udHJvbCAnCisgICAgICAgICAgICAgICAgICAgJ0NvZGUpICAgfFxuJworICAgICAgICAgICAgICAgICAgICcgICAnCisgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHwgIlxcdTIwMjgiICAgICAgICAgICAgICAgIHwgTGluZSAnCisgICAgICAgICAgICAgICAgICAgJ1NlcGFyYXRvciAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgJyAgICcKKyAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAnICAgfCAiXFx1MjAyOSIgICAgICAgICAgICAgICAgfCBQYXJhZ3JhcGggJworICAgICAgICAgICAgICAgICAgICdTZXBhcmF0b3IgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgJworICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMjogIlxcdiIgYW5kICJcXGYiIGFkZGVkIHRvIGxpc3QgJworICAgICAgICAgICAgICAgICAgICdvZiBsaW5lXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGJvdW5kYXJpZXMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG4nLnNwbGl0bGluZXMoKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJ2FiIGMnLCAnJywgJ2RlIGZnJywgJ2tsJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICdhYiBjXFxuXFxuZGUgIgorICAgICAgICAgICAgICAgICAgICJmZ1xccmtsXFxyXFxuJy5zcGxpdGxpbmVzKGtlZXBlbmRzPVRydWUpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnYWIgY1xcbicsICdcXG4nLCAnZGUgZmdcXHInLCAna2xcXHJcXG4nXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVW5saWtlICJzcGxpdCgpIiB3aGVuIGEgZGVsaW1pdGVyIHN0cmluZyAqc2VwKiBpcyAnCisgICAgICAgICAgICAgICAgICAgJ2dpdmVuLCB0aGlzXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCAnCisgICAgICAgICAgICAgICAgICAgJ2EgdGVybWluYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgbGluZSBicmVhayBkb2VzIG5vdCByZXN1bHQgaW4gYW4gZXh0cmEgbGluZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiAiIi5zcGxpdGxpbmVzKClcbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgW11cbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+ICJPbmUgbGluZVxcbiIuc3BsaXRsaW5lcygpXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnT25lIGxpbmUnXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIGNvbXBhcmlzb24sICJzcGxpdChcJ1xcblwnKSIgZ2l2ZXM6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJycuc3BsaXQoJ1xcbicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgIFsnJ11cbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgPj4+ICdUd28gbGluZXNcXG4nLnNwbGl0KCdcXG4nKVxuIgorICAgICAgICAgICAgICAgICAgICIgICAgICBbJ1R3byBsaW5lcycsICcnXVxuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiAiVHJ1ZSIgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4KiwgJworICAgICAgICAgICAgICAgICAgICdvdGhlcndpc2UgcmV0dXJuXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICJGYWxzZSIuICpwcmVmaXgqIGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgcHJlZml4ZXMgdG8gJworICAgICAgICAgICAgICAgICAgICdsb29rIGZvci5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgV2l0aCBvcHRpb25hbCAqc3RhcnQqLCB0ZXN0IHN0cmluZyBiZWdpbm5pbmcgYXQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICcgICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnN0cmlwKFtjaGFyc10pXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0aGUgbGVhZGluZyBhbmQgJworICAgICAgICAgICAgICAgICAgICd0cmFpbGluZ1xuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nICcKKyAgICAgICAgICAgICAgICAgICAnc3BlY2lmeWluZyB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciAiTm9uZSIsICcKKyAgICAgICAgICAgICAgICAgICAndGhlICpjaGFycypcbicKKyAgICAgICAgICAgICAgICAgICAnICAgYXJndW1lbnQgZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gVGhlICpjaGFycyogJworICAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBpc1xuJworICAgICAgICAgICAgICAgICAgICcgICBub3QgYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzICcKKyAgICAgICAgICAgICAgICAgICAndmFsdWVzIGFyZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzdHJpcHBlZDpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiAnICAgc3BhY2lvdXMgICAnLnN0cmlwKClcbiIKKyAgICAgICAgICAgICAgICAgICAiICAgICAgJ3NwYWNpb3VzJ1xuIgorICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ3d3dy5leGFtcGxlLmNvbScuc3RyaXAoJ2Ntb3d6LicpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdleGFtcGxlJ1xuIgorICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgVGhlIG91dGVybW9zdCBsZWFkaW5nIGFuZCB0cmFpbGluZyAqY2hhcnMqIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAndmFsdWVzIGFyZVxuJworICAgICAgICAgICAgICAgICAgICcgICBzdHJpcHBlZCBmcm9tIHRoZSBzdHJpbmcuIENoYXJhY3RlcnMgYXJlIHJlbW92ZWQgZnJvbSAnCisgICAgICAgICAgICAgICAgICAgJ3RoZSBsZWFkaW5nXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGVuZCB1bnRpbCByZWFjaGluZyBhIHN0cmluZyBjaGFyYWN0ZXIgdGhhdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAgICdjb250YWluZWQgaW4gdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHNldCBvZiBjaGFyYWN0ZXJzIGluICpjaGFycyouIEEgc2ltaWxhciBhY3Rpb24gdGFrZXMgJworICAgICAgICAgICAgICAgICAgICdwbGFjZSBvbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdHJhaWxpbmcgZW5kLiBGb3IgZXhhbXBsZTpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiBjb21tZW50X3N0cmluZyA9ICcjLi4uLi4uLiBTZWN0aW9uIDMuMi4xIElzc3VlICIKKyAgICAgICAgICAgICAgICAgICAiIzMyIC4uLi4uLi4nXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgID4+PiBjb21tZW50X3N0cmluZy5zdHJpcCgnLiMhICcpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdTZWN0aW9uIDMuMi4xIElzc3VlICMzMidcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ3N0ci5zd2FwY2FzZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB1cHBlcmNhc2UgY2hhcmFjdGVycyAnCisgICAgICAgICAgICAgICAgICAgJ2NvbnZlcnRlZCB0b1xuJworICAgICAgICAgICAgICAgICAgICcgICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuIE5vdGUgdGhhdCBpdCBpcyBub3QgJworICAgICAgICAgICAgICAgICAgICduZWNlc3NhcmlseSB0cnVlIHRoYXRcbicKKyAgICAgICAgICAgICAgICAgICAnICAgInMuc3dhcGNhc2UoKS5zd2FwY2FzZSgpID09IHMiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnRpdGxlKClcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIHRpdGxlY2FzZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoZXJlIHdvcmRzICcKKyAgICAgICAgICAgICAgICAgICAnc3RhcnQgd2l0aCBhblxuJworICAgICAgICAgICAgICAgICAgICcgICB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlICcKKyAgICAgICAgICAgICAgICAgICAnbG93ZXJjYXNlLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICIgICAgICA+Pj4gJ0hlbGxvIHdvcmxkJy50aXRsZSgpXG4iCisgICAgICAgICAgICAgICAgICAgIiAgICAgICdIZWxsbyBXb3JsZCdcbiIKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCAnCisgICAgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24gb2YgYVxuJworICAgICAgICAgICAgICAgICAgICcgICB3b3JkIGFzIGdyb3VwcyBvZiBjb25zZWN1dGl2ZSBsZXR0ZXJzLiAgVGhlIGRlZmluaXRpb24gJworICAgICAgICAgICAgICAgICAgICd3b3JrcyBpblxuJworICAgICAgICAgICAgICAgICAgICcgICBtYW55IGNvbnRleHRzIGJ1dCBpdCBtZWFucyB0aGF0IGFwb3N0cm9waGVzIGluICcKKyAgICAgICAgICAgICAgICAgICAnY29udHJhY3Rpb25zIGFuZFxuJworICAgICAgICAgICAgICAgICAgICcgICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgJworICAgICAgICAgICAgICAgICAgICdkZXNpcmVkXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHJlc3VsdDpcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiAidGhleVwncmUgYmlsbFwncyBmcmllbmRzIGZyb20gdGhlIFVLIi50aXRsZSgpXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgICJUaGV5XCdSZSBCaWxsXCdTIEZyaWVuZHMgRnJvbSBUaGUgVWsiXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBBIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyAnCisgICAgICAgICAgICAgICAgICAgJ3JlZ3VsYXJcbicKKyAgICAgICAgICAgICAgICAgICAnICAgZXhwcmVzc2lvbnM6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gaW1wb3J0IHJlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBkZWYgdGl0bGVjYXNlKHMpOlxuJworICAgICAgICAgICAgICAgICAgICcgICAgICAuLi4gICAgIHJldHVybiByZS5zdWIociJbQS1aYS16XSsoXCdbQS1aYS16XSspPyIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBsYW1iZGEgbW86ICcKKyAgICAgICAgICAgICAgICAgICAnbW8uZ3JvdXAoMClbMF0udXBwZXIoKSArXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICAnbW8uZ3JvdXAoMClbMTpdLmxvd2VyKCksXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKVxuJworICAgICAgICAgICAgICAgICAgICcgICAgICAuLi5cbicKKyAgICAgICAgICAgICAgICAgICAnICAgICAgPj4+IHRpdGxlY2FzZSgidGhleVwncmUgYmlsbFwncyBmcmllbmRzLiIpXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICAgICJUaGV5XCdyZSBCaWxsXCdzIEZyaWVuZHMuIlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnc3RyLnRyYW5zbGF0ZSh0YWJsZSlcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBpbiB3aGljaCBlYWNoIGNoYXJhY3RlciBoYXMgJworICAgICAgICAgICAgICAgICAgICdiZWVuIG1hcHBlZFxuJworICAgICAgICAgICAgICAgICAgICcgICB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZS4gIFRoZSB0YWJsZSBtdXN0IGJlICcKKyAgICAgICAgICAgICAgICAgICAnYW4gb2JqZWN0XG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHRoYXQgaW1wbGVtZW50cyBpbmRleGluZyB2aWEgIl9fZ2V0aXRlbV9fKCkiLCB0eXBpY2FsbHkgJworICAgICAgICAgICAgICAgICAgICdhICptYXBwaW5nKlxuJworICAgICAgICAgICAgICAgICAgICcgICBvciAqc2VxdWVuY2UqLiAgV2hlbiBpbmRleGVkIGJ5IGEgVW5pY29kZSBvcmRpbmFsIChhbiAnCisgICAgICAgICAgICAgICAgICAgJ2ludGVnZXIpLCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAnICAgdGFibGUgb2JqZWN0IGNhbiBkbyBhbnkgb2YgdGhlIGZvbGxvd2luZzogcmV0dXJuIGEgJworICAgICAgICAgICAgICAgICAgICdVbmljb2RlIG9yZGluYWxcbicKKyAgICAgICAgICAgICAgICAgICAnICAgb3IgYSBzdHJpbmcsIHRvIG1hcCB0aGUgY2hhcmFjdGVyIHRvIG9uZSBvciBtb3JlIG90aGVyICcKKyAgICAgICAgICAgICAgICAgICAnY2hhcmFjdGVycztcbicKKyAgICAgICAgICAgICAgICAgICAnICAgcmV0dXJuICJOb25lIiwgdG8gZGVsZXRlIHRoZSBjaGFyYWN0ZXIgZnJvbSB0aGUgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgICAnc3RyaW5nOyBvclxuJworICAgICAgICAgICAgICAgICAgICcgICByYWlzZSBhICJMb29rdXBFcnJvciIgZXhjZXB0aW9uLCB0byBtYXAgdGhlIGNoYXJhY3RlciAnCisgICAgICAgICAgICAgICAgICAgJ3RvIGl0c2VsZi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFlvdSBjYW4gdXNlICJzdHIubWFrZXRyYW5zKCkiIHRvIGNyZWF0ZSBhIHRyYW5zbGF0aW9uICcKKyAgICAgICAgICAgICAgICAgICAnbWFwIGZyb21cbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVyLXRvLWNoYXJhY3RlciBtYXBwaW5ncyBpbiBkaWZmZXJlbnQgZm9ybWF0cy5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFNlZSBhbHNvIHRoZSAiY29kZWNzIiBtb2R1bGUgZm9yIGEgbW9yZSBmbGV4aWJsZSAnCisgICAgICAgICAgICAgICAgICAgJ2FwcHJvYWNoIHRvIGN1c3RvbVxuJworICAgICAgICAgICAgICAgICAgICcgICBjaGFyYWN0ZXIgbWFwcGluZ3MuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIudXBwZXIoKVxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCAnCisgICAgICAgICAgICAgICAgICAgJ2NoYXJhY3RlcnMgWzRdXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgJworICAgICAgICAgICAgICAgICAgICcic3RyLnVwcGVyKCkuaXN1cHBlcigpIiBtaWdodCBiZVxuJworICAgICAgICAgICAgICAgICAgICcgICAiRmFsc2UiIGlmICJzIiBjb250YWlucyB1bmNhc2VkIGNoYXJhY3RlcnMgb3IgaWYgdGhlICcKKyAgICAgICAgICAgICAgICAgICAnVW5pY29kZVxuJworICAgICAgICAgICAgICAgICAgICcgICBjYXRlZ29yeSBvZiB0aGUgcmVzdWx0aW5nIGNoYXJhY3RlcihzKSBpcyBub3QgIkx1IiAnCisgICAgICAgICAgICAgICAgICAgJyhMZXR0ZXIsXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFRoZSB1cHBlcmNhc2luZyBhbGdvcml0aG0gdXNlZCBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAnCisgICAgICAgICAgICAgICAgICAgJzMuMTMgb2YgdGhlXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIFVuaWNvZGUgU3RhbmRhcmQuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdzdHIuemZpbGwod2lkdGgpXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCBBU0NJSSAnCisgICAgICAgICAgICAgICAgICAgJyJcJzBcJyIgZGlnaXRzIHRvXG4nCisgICAgICAgICAgICAgICAgICAgJyAgIG1ha2UgYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIEEgbGVhZGluZyBzaWduIHByZWZpeFxuJworICAgICAgICAgICAgICAgICAgICcgICAoIlwnK1wnIi8iXCctXCciKSBpcyBoYW5kbGVkIGJ5IGluc2VydGluZyB0aGUgcGFkZGluZyAnCisgICAgICAgICAgICAgICAgICAgJyphZnRlciogdGhlIHNpZ25cbicKKyAgICAgICAgICAgICAgICAgICAnICAgY2hhcmFjdGVyIHJhdGhlciB0aGFuIGJlZm9yZS4gVGhlIG9yaWdpbmFsIHN0cmluZyBpcyAnCisgICAgICAgICAgICAgICAgICAgJ3JldHVybmVkIGlmXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICJsZW4ocykiLlxuJworICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAnICAgRm9yIGV4YW1wbGU6XG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gIjQyIi56ZmlsbCg1KVxuJworICAgICAgICAgICAgICAgICAgICIgICAgICAnMDAwNDInXG4iCisgICAgICAgICAgICAgICAgICAgJyAgICAgID4+PiAiLTQyIi56ZmlsbCg1KVxuJworICAgICAgICAgICAgICAgICAgICIgICAgICAnLTAwNDInXG4iLAorICdzdHJpbmdzJzogJ1xuJworICAgICAgICAgICAgJ1N0cmluZyBhbmQgQnl0ZXMgbGl0ZXJhbHNcbicKKyAgICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnU3RyaW5nIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsICcKKyAgICAgICAgICAgICdkZWZpbml0aW9uczpcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcgICBzdHJpbmdsaXRlcmFsICAgOjo9IFtzdHJpbmdwcmVmaXhdKHNob3J0c3RyaW5nIHwgbG9uZ3N0cmluZylcbicKKyAgICAgICAgICAgICcgICBzdHJpbmdwcmVmaXggICAgOjo9ICJyIiB8ICJ1IiB8ICJSIiB8ICJVIiB8ICJmIiB8ICJGIlxuJworICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgfCAiZnIiIHwgIkZyIiB8ICJmUiIgfCAiRlIiIHwgInJmIiB8ICJyRiIgfCAnCisgICAgICAgICAgICAnIlJmIiB8ICJSRiJcbicKKyAgICAgICAgICAgICcgICBzaG9ydHN0cmluZyAgICAgOjo9ICJcJyIgc2hvcnRzdHJpbmdpdGVtKiAiXCciIHwgXCciXCcgJworICAgICAgICAgICAgJ3Nob3J0c3RyaW5naXRlbSogXCciXCdcbicKKyAgICAgICAgICAgICcgICBsb25nc3RyaW5nICAgICAgOjo9ICJcJ1wnXCciIGxvbmdzdHJpbmdpdGVtKiAiXCdcJ1wnIiB8ICcKKyAgICAgICAgICAgICdcJyIiIlwnIGxvbmdzdHJpbmdpdGVtKiBcJyIiIlwnXG4nCisgICAgICAgICAgICAnICAgc2hvcnRzdHJpbmdpdGVtIDo6PSBzaG9ydHN0cmluZ2NoYXIgfCBzdHJpbmdlc2NhcGVzZXFcbicKKyAgICAgICAgICAgICcgICBsb25nc3RyaW5naXRlbSAgOjo9IGxvbmdzdHJpbmdjaGFyIHwgc3RyaW5nZXNjYXBlc2VxXG4nCisgICAgICAgICAgICAnICAgc2hvcnRzdHJpbmdjaGFyIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgJworICAgICAgICAgICAgJ25ld2xpbmUgb3IgdGhlIHF1b3RlPlxuJworICAgICAgICAgICAgJyAgIGxvbmdzdHJpbmdjaGFyICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiPlxuJworICAgICAgICAgICAgJyAgIHN0cmluZ2VzY2FwZXNlcSA6Oj0gIlxcIiA8YW55IHNvdXJjZSBjaGFyYWN0ZXI+XG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnICAgYnl0ZXNsaXRlcmFsICAgOjo9IGJ5dGVzcHJlZml4KHNob3J0Ynl0ZXMgfCBsb25nYnl0ZXMpXG4nCisgICAgICAgICAgICAnICAgYnl0ZXNwcmVmaXggICAgOjo9ICJiIiB8ICJCIiB8ICJiciIgfCAiQnIiIHwgImJSIiB8ICJCUiIgfCAnCisgICAgICAgICAgICAnInJiIiB8ICJyQiIgfCAiUmIiIHwgIlJCIlxuJworICAgICAgICAgICAgJyAgIHNob3J0Ynl0ZXMgICAgIDo6PSAiXCciIHNob3J0Ynl0ZXNpdGVtKiAiXCciIHwgXCciXCcgJworICAgICAgICAgICAgJ3Nob3J0Ynl0ZXNpdGVtKiBcJyJcJ1xuJworICAgICAgICAgICAgJyAgIGxvbmdieXRlcyAgICAgIDo6PSAiXCdcJ1wnIiBsb25nYnl0ZXNpdGVtKiAiXCdcJ1wnIiB8IFwnIiIiXCcgJworICAgICAgICAgICAgJ2xvbmdieXRlc2l0ZW0qIFwnIiIiXCdcbicKKyAgICAgICAgICAgICcgICBzaG9ydGJ5dGVzaXRlbSA6Oj0gc2hvcnRieXRlc2NoYXIgfCBieXRlc2VzY2FwZXNlcVxuJworICAgICAgICAgICAgJyAgIGxvbmdieXRlc2l0ZW0gIDo6PSBsb25nYnl0ZXNjaGFyIHwgYnl0ZXNlc2NhcGVzZXFcbicKKyAgICAgICAgICAgICcgICBzaG9ydGJ5dGVzY2hhciA6Oj0gPGFueSBBU0NJSSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgbmV3bGluZSAnCisgICAgICAgICAgICAnb3IgdGhlIHF1b3RlPlxuJworICAgICAgICAgICAgJyAgIGxvbmdieXRlc2NoYXIgIDo6PSA8YW55IEFTQ0lJIGNoYXJhY3RlciBleGNlcHQgIlxcIj5cbicKKyAgICAgICAgICAgICcgICBieXRlc2VzY2FwZXNlcSA6Oj0gIlxcIiA8YW55IEFTQ0lJIGNoYXJhY3Rlcj5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdPbmUgc3ludGFjdGljIHJlc3RyaWN0aW9uIG5vdCBpbmRpY2F0ZWQgYnkgdGhlc2UgcHJvZHVjdGlvbnMgaXMgJworICAgICAgICAgICAgJ3RoYXRcbicKKyAgICAgICAgICAgICd3aGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlICJzdHJpbmdwcmVmaXgiIG9yICcKKyAgICAgICAgICAgICciYnl0ZXNwcmVmaXgiXG4nCisgICAgICAgICAgICAnYW5kIHRoZSByZXN0IG9mIHRoZSBsaXRlcmFsLiBUaGUgc291cmNlIGNoYXJhY3RlciBzZXQgaXMgZGVmaW5lZCAnCisgICAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAgICd0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb247IGl0IGlzIFVURi04IGlmIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uICcKKyAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgJ2dpdmVuIGluIHRoZSBzb3VyY2UgZmlsZTsgc2VlIHNlY3Rpb24gRW5jb2RpbmcgZGVjbGFyYXRpb25zLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0luIHBsYWluIEVuZ2xpc2g6IEJvdGggdHlwZXMgb2YgbGl0ZXJhbHMgY2FuIGJlIGVuY2xvc2VkIGluICcKKyAgICAgICAgICAgICdtYXRjaGluZ1xuJworICAgICAgICAgICAgJ3NpbmdsZSBxdW90ZXMgKCJcJyIpIG9yIGRvdWJsZSBxdW90ZXMgKCIiIikuICBUaGV5IGNhbiBhbHNvIGJlICcKKyAgICAgICAgICAgICdlbmNsb3NlZFxuJworICAgICAgICAgICAgJ2luIG1hdGNoaW5nIGdyb3VwcyBvZiB0aHJlZSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodGhlc2UgYXJlXG4nCisgICAgICAgICAgICAnZ2VuZXJhbGx5IHJlZmVycmVkIHRvIGFzICp0cmlwbGUtcXVvdGVkIHN0cmluZ3MqKS4gIFRoZSAnCisgICAgICAgICAgICAnYmFja3NsYXNoXG4nCisgICAgICAgICAgICAnKCJcXCIpIGNoYXJhY3RlciBpcyB1c2VkIHRvIGVzY2FwZSBjaGFyYWN0ZXJzIHRoYXQgb3RoZXJ3aXNlIGhhdmUgJworICAgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAgICdzcGVjaWFsIG1lYW5pbmcsIHN1Y2ggYXMgbmV3bGluZSwgYmFja3NsYXNoIGl0c2VsZiwgb3IgdGhlIHF1b3RlXG4nCisgICAgICAgICAgICAnY2hhcmFjdGVyLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0J5dGVzIGxpdGVyYWxzIGFyZSBhbHdheXMgcHJlZml4ZWQgd2l0aCAiXCdiXCciIG9yICJcJ0JcJyI7IHRoZXkgJworICAgICAgICAgICAgJ3Byb2R1Y2VcbicKKyAgICAgICAgICAgICdhbiBpbnN0YW5jZSBvZiB0aGUgImJ5dGVzIiB0eXBlIGluc3RlYWQgb2YgdGhlICJzdHIiIHR5cGUuICBUaGV5ICcKKyAgICAgICAgICAgICdtYXlcbicKKyAgICAgICAgICAgICdvbmx5IGNvbnRhaW4gQVNDSUkgY2hhcmFjdGVyczsgYnl0ZXMgd2l0aCBhIG51bWVyaWMgdmFsdWUgb2YgMTI4ICcKKyAgICAgICAgICAgICdvclxuJworICAgICAgICAgICAgJ2dyZWF0ZXIgbXVzdCBiZSBleHByZXNzZWQgd2l0aCBlc2NhcGVzLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ0FzIG9mIFB5dGhvbiAzLjMgaXQgaXMgcG9zc2libGUgYWdhaW4gdG8gcHJlZml4IHN0cmluZyBsaXRlcmFscyAnCisgICAgICAgICAgICAnd2l0aCBhXG4nCisgICAgICAgICAgICAnInUiIHByZWZpeCB0byBzaW1wbGlmeSBtYWludGVuYW5jZSBvZiBkdWFsIDIueCBhbmQgMy54ICcKKyAgICAgICAgICAgICdjb2RlYmFzZXMuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnQm90aCBzdHJpbmcgYW5kIGJ5dGVzIGxpdGVyYWxzIG1heSBvcHRpb25hbGx5IGJlIHByZWZpeGVkIHdpdGggYVxuJworICAgICAgICAgICAgJ2xldHRlciAiXCdyXCciIG9yICJcJ1JcJyI7IHN1Y2ggc3RyaW5ncyBhcmUgY2FsbGVkICpyYXcgc3RyaW5ncyogJworICAgICAgICAgICAgJ2FuZCB0cmVhdFxuJworICAgICAgICAgICAgJ2JhY2tzbGFzaGVzIGFzIGxpdGVyYWwgY2hhcmFjdGVycy4gIEFzIGEgcmVzdWx0LCBpbiBzdHJpbmcgJworICAgICAgICAgICAgJ2xpdGVyYWxzLFxuJworICAgICAgICAgICAgJyJcJ1xcVVwnIiBhbmQgIlwnXFx1XCciIGVzY2FwZXMgaW4gcmF3IHN0cmluZ3MgYXJlIG5vdCB0cmVhdGVkICcKKyAgICAgICAgICAgICdzcGVjaWFsbHkuXG4nCisgICAgICAgICAgICAiR2l2ZW4gdGhhdCBQeXRob24gMi54J3MgcmF3IHVuaWNvZGUgbGl0ZXJhbHMgYmVoYXZlIGRpZmZlcmVudGx5ICIKKyAgICAgICAgICAgICd0aGFuXG4nCisgICAgICAgICAgICAnUHl0aG9uIDMueFwncyB0aGUgIlwndXJcJyIgc3ludGF4IGlzIG5vdCBzdXBwb3J0ZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy4zOiBUaGUgIlwncmJcJyIgcHJlZml4IG9mIHJhdyBieXRlcyBsaXRlcmFscyBoYXMgJworICAgICAgICAgICAgJ2JlZW5cbicKKyAgICAgICAgICAgICdhZGRlZCBhcyBhIHN5bm9ueW0gb2YgIlwnYnJcJyIuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnTmV3IGluIHZlcnNpb24gMy4zOiBTdXBwb3J0IGZvciB0aGUgdW5pY29kZSBsZWdhY3kgbGl0ZXJhbFxuJworICAgICAgICAgICAgJygidVwndmFsdWVcJyIpIHdhcyByZWludHJvZHVjZWQgdG8gc2ltcGxpZnkgdGhlIG1haW50ZW5hbmNlIG9mICcKKyAgICAgICAgICAgICdkdWFsXG4nCisgICAgICAgICAgICAnUHl0aG9uIDIueCBhbmQgMy54IGNvZGViYXNlcy4gU2VlICoqUEVQIDQxNCoqIGZvciBtb3JlICcKKyAgICAgICAgICAgICdpbmZvcm1hdGlvbi5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdBIHN0cmluZyBsaXRlcmFsIHdpdGggIlwnZlwnIiBvciAiXCdGXCciIGluIGl0cyBwcmVmaXggaXMgYSAnCisgICAgICAgICAgICAnKmZvcm1hdHRlZFxuJworICAgICAgICAgICAgJ3N0cmluZyBsaXRlcmFsKjsgc2VlIEZvcm1hdHRlZCBzdHJpbmcgbGl0ZXJhbHMuICBUaGUgIlwnZlwnIiBtYXkgJworICAgICAgICAgICAgJ2JlXG4nCisgICAgICAgICAgICAnY29tYmluZWQgd2l0aCAiXCdyXCciLCBidXQgbm90IHdpdGggIlwnYlwnIiBvciAiXCd1XCciLCB0aGVyZWZvcmUgJworICAgICAgICAgICAgJ3Jhd1xuJworICAgICAgICAgICAgJ2Zvcm1hdHRlZCBzdHJpbmdzIGFyZSBwb3NzaWJsZSwgYnV0IGZvcm1hdHRlZCBieXRlcyBsaXRlcmFscyBhcmUgJworICAgICAgICAgICAgJ25vdC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdJbiB0cmlwbGUtcXVvdGVkIGxpdGVyYWxzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgJworICAgICAgICAgICAgJ2FsbG93ZWRcbicKKyAgICAgICAgICAgICcoYW5kIGFyZSByZXRhaW5lZCksIGV4Y2VwdCB0aGF0IHRocmVlIHVuZXNjYXBlZCBxdW90ZXMgaW4gYSByb3dcbicKKyAgICAgICAgICAgICd0ZXJtaW5hdGUgdGhlIGxpdGVyYWwuICAoQSAicXVvdGUiIGlzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBvcGVuICcKKyAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICdsaXRlcmFsLCBpLmUuIGVpdGhlciAiXCciIG9yICIiIi4pXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVW5sZXNzIGFuICJcJ3JcJyIgb3IgIlwnUlwnIiBwcmVmaXggaXMgcHJlc2VudCwgZXNjYXBlIHNlcXVlbmNlcyAnCisgICAgICAgICAgICAnaW4gc3RyaW5nXG4nCisgICAgICAgICAgICAnYW5kIGJ5dGVzIGxpdGVyYWxzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byAnCisgICAgICAgICAgICAndGhvc2VcbicKKyAgICAgICAgICAgICd1c2VkIGJ5IFN0YW5kYXJkIEMuICBUaGUgcmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZTpcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCBFc2NhcGUgU2VxdWVuY2UgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgJworICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICcrPT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT0rXG4nCisgICAgICAgICAgICAnfCAiXFxuZXdsaW5lIiAgICAgICAgfCBCYWNrc2xhc2ggYW5kIG5ld2xpbmUgaWdub3JlZCAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcXFwiICAgICAgICAgICAgICB8IEJhY2tzbGFzaCAoIlxcIikgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcXCciICAgICAgICAgICAgICB8IFNpbmdsZSBxdW90ZSAoIlwnIikgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcIiIgICAgICAgICAgICAgIHwgRG91YmxlIHF1b3RlICgiIiIpICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXGEiICAgICAgICAgICAgICB8IEFTQ0lJIEJlbGwgKEJFTCkgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxiIiAgICAgICAgICAgICAgfCBBU0NJSSBCYWNrc3BhY2UgKEJTKSAgICAgICAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcZiIgICAgICAgICAgICAgIHwgQVNDSUkgRm9ybWZlZWQgKEZGKSAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXG4iICAgICAgICAgICAgICB8IEFTQ0lJIExpbmVmZWVkIChMRikgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxyIiAgICAgICAgICAgICAgfCBBU0NJSSBDYXJyaWFnZSBSZXR1cm4gKENSKSAgICAgICAgJworICAgICAgICAgICAgJ3wgICAgICAgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxcdCIgICAgICAgICAgICAgIHwgQVNDSUkgSG9yaXpvbnRhbCBUYWIgKFRBQikgICAgICAgICcKKyAgICAgICAgICAgICd8ICAgICAgICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXHYiICAgICAgICAgICAgICB8IEFTQ0lJIFZlcnRpY2FsIFRhYiAoVlQpICAgICAgICAgICAnCisgICAgICAgICAgICAnfCAgICAgICAgIHxcbicKKyAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAnfCAiXFxvb28iICAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqb29vKiAgfCAnCisgICAgICAgICAgICAnKDEsMykgICB8XG4nCisgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgJ3wgIlxceGhoIiAgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggaGV4IHZhbHVlICpoaCogICAgIHwgJworICAgICAgICAgICAgJygyLDMpICAgfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdFc2NhcGUgc2VxdWVuY2VzIG9ubHkgcmVjb2duaXplZCBpbiBzdHJpbmcgbGl0ZXJhbHMgYXJlOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8IEVzY2FwZSBTZXF1ZW5jZSAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbicKKyAgICAgICAgICAgICd8ICJcXE57bmFtZX0iICAgICAgICB8IENoYXJhY3RlciBuYW1lZCAqbmFtZSogaW4gdGhlICAgICB8ICcKKyAgICAgICAgICAgICcoNCkgICAgIHxcbicKKyAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXHV4eHh4IiAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIDE2LWJpdCBoZXggdmFsdWUgICB8ICcKKyAgICAgICAgICAgICcoNSkgICAgIHxcbicKKyAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICd8ICJcXFV4eHh4eHh4eCIgICAgICB8IENoYXJhY3RlciB3aXRoIDMyLWJpdCBoZXggdmFsdWUgICB8ICcKKyAgICAgICAgICAgICcoNikgICAgIHxcbicKKyAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgIHwgKnh4eHh4eHh4KiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAnCisgICAgICAgICAgICAnfFxuJworICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdOb3RlczpcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICcxLiBBcyBpbiBTdGFuZGFyZCBDLCB1cCB0byB0aHJlZSBvY3RhbCBkaWdpdHMgYXJlIGFjY2VwdGVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzIuIFVubGlrZSBpbiBTdGFuZGFyZCBDLCBleGFjdGx5IHR3byBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICczLiBJbiBhIGJ5dGVzIGxpdGVyYWwsIGhleGFkZWNpbWFsIGFuZCBvY3RhbCBlc2NhcGVzIGRlbm90ZSB0aGVcbicKKyAgICAgICAgICAgICcgICBieXRlIHdpdGggdGhlIGdpdmVuIHZhbHVlLiBJbiBhIHN0cmluZyBsaXRlcmFsLCB0aGVzZSBlc2NhcGVzXG4nCisgICAgICAgICAgICAnICAgZGVub3RlIGEgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnNC4gQ2hhbmdlZCBpbiB2ZXJzaW9uIDMuMzogU3VwcG9ydCBmb3IgbmFtZSBhbGlhc2VzIFsxXSBoYXMgYmVlblxuJworICAgICAgICAgICAgJyAgIGFkZGVkLlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJzUuIEV4YWN0bHkgZm91ciBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICc2LiBBbnkgVW5pY29kZSBjaGFyYWN0ZXIgY2FuIGJlIGVuY29kZWQgdGhpcyB3YXkuICBFeGFjdGx5IGVpZ2h0XG4nCisgICAgICAgICAgICAnICAgaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAnVW5saWtlIFN0YW5kYXJkIEMsIGFsbCB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbGVmdCBpbiAnCisgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAnc3RyaW5nIHVuY2hhbmdlZCwgaS5lLiwgKnRoZSBiYWNrc2xhc2ggaXMgbGVmdCBpbiB0aGUgcmVzdWx0Ki4gICcKKyAgICAgICAgICAgICcoVGhpc1xuJworICAgICAgICAgICAgJ2JlaGF2aW9yIGlzIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZzogaWYgYW4gZXNjYXBlIHNlcXVlbmNlIGlzICcKKyAgICAgICAgICAgICdtaXN0eXBlZCxcbicKKyAgICAgICAgICAgICd0aGUgcmVzdWx0aW5nIG91dHB1dCBpcyBtb3JlIGVhc2lseSByZWNvZ25pemVkIGFzIGJyb2tlbi4pICBJdCBpcyAnCisgICAgICAgICAgICAnYWxzb1xuJworICAgICAgICAgICAgJ2ltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgb25seSByZWNvZ25pemVkIGluICcKKyAgICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAgICdsaXRlcmFscyBmYWxsIGludG8gdGhlIGNhdGVnb3J5IG9mIHVucmVjb2duaXplZCBlc2NhcGVzIGZvciAnCisgICAgICAgICAgICAnYnl0ZXNcbicKKyAgICAgICAgICAgICdsaXRlcmFscy5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdFdmVuIGluIGEgcmF3IGxpdGVyYWwsIHF1b3RlcyBjYW4gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLCAnCisgICAgICAgICAgICAnYnV0IHRoZVxuJworICAgICAgICAgICAgJ2JhY2tzbGFzaCByZW1haW5zIGluIHRoZSByZXN1bHQ7IGZvciBleGFtcGxlLCAiciJcXCIiIiBpcyBhICcKKyAgICAgICAgICAgICd2YWxpZFxuJworICAgICAgICAgICAgJ3N0cmluZyBsaXRlcmFsIGNvbnNpc3Rpbmcgb2YgdHdvIGNoYXJhY3RlcnM6IGEgYmFja3NsYXNoIGFuZCBhICcKKyAgICAgICAgICAgICdkb3VibGVcbicKKyAgICAgICAgICAgICdxdW90ZTsgInIiXFwiIiBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCAoZXZlbiBhIHJhdyBzdHJpbmcgJworICAgICAgICAgICAgJ2Nhbm5vdFxuJworICAgICAgICAgICAgJ2VuZCBpbiBhbiBvZGQgbnVtYmVyIG9mIGJhY2tzbGFzaGVzKS4gIFNwZWNpZmljYWxseSwgKmEgcmF3ICcKKyAgICAgICAgICAgICdsaXRlcmFsXG4nCisgICAgICAgICAgICAnY2Fubm90IGVuZCBpbiBhIHNpbmdsZSBiYWNrc2xhc2gqIChzaW5jZSB0aGUgYmFja3NsYXNoIHdvdWxkICcKKyAgICAgICAgICAgICdlc2NhcGVcbicKKyAgICAgICAgICAgICd0aGUgZm9sbG93aW5nIHF1b3RlIGNoYXJhY3RlcikuICBOb3RlIGFsc28gdGhhdCBhIHNpbmdsZSAnCisgICAgICAgICAgICAnYmFja3NsYXNoXG4nCisgICAgICAgICAgICAnZm9sbG93ZWQgYnkgYSBuZXdsaW5lIGlzIGludGVycHJldGVkIGFzIHRob3NlIHR3byBjaGFyYWN0ZXJzIGFzICcKKyAgICAgICAgICAgICdwYXJ0XG4nCisgICAgICAgICAgICAnb2YgdGhlIGxpdGVyYWwsICpub3QqIGFzIGEgbGluZSBjb250aW51YXRpb24uXG4nLAorICdzdWJzY3JpcHRpb25zJzogJ1xuJworICAgICAgICAgICAgICAgICAgJ1N1YnNjcmlwdGlvbnNcbicKKyAgICAgICAgICAgICAgICAgICcqKioqKioqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnQSBzdWJzY3JpcHRpb24gc2VsZWN0cyBhbiBpdGVtIG9mIGEgc2VxdWVuY2UgKHN0cmluZywgdHVwbGUgJworICAgICAgICAgICAgICAgICAgJ29yIGxpc3QpXG4nCisgICAgICAgICAgICAgICAgICAnb3IgbWFwcGluZyAoZGljdGlvbmFyeSkgb2JqZWN0OlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJyAgIHN1YnNjcmlwdGlvbiA6Oj0gcHJpbWFyeSAiWyIgZXhwcmVzc2lvbl9saXN0ICJdIlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgJ1RoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IHRoYXQgc3VwcG9ydHMgJworICAgICAgICAgICAgICAgICAgJ3N1YnNjcmlwdGlvblxuJworICAgICAgICAgICAgICAgICAgJyhsaXN0cyBvciBkaWN0aW9uYXJpZXMgZm9yIGV4YW1wbGUpLiAgVXNlci1kZWZpbmVkIG9iamVjdHMgJworICAgICAgICAgICAgICAgICAgJ2NhbiBzdXBwb3J0XG4nCisgICAgICAgICAgICAgICAgICAnc3Vic2NyaXB0aW9uIGJ5IGRlZmluaW5nIGEgIl9fZ2V0aXRlbV9fKCkiIG1ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdGb3IgYnVpbHQtaW4gb2JqZWN0cywgdGhlcmUgYXJlIHR3byB0eXBlcyBvZiBvYmplY3RzIHRoYXQgJworICAgICAgICAgICAgICAgICAgJ3N1cHBvcnRcbicKKyAgICAgICAgICAgICAgICAgICdzdWJzY3JpcHRpb246XG4nCisgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAnSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nLCB0aGUgZXhwcmVzc2lvbiBsaXN0IG11c3QgJworICAgICAgICAgICAgICAgICAgJ2V2YWx1YXRlIHRvIGFuXG4nCisgICAgICAgICAgICAgICAgICAnb2JqZWN0IHdob3NlIHZhbHVlIGlzIG9uZSBvZiB0aGUga2V5cyBvZiB0aGUgbWFwcGluZywgYW5kICcKKyAgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgICdzdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgdmFsdWUgaW4gdGhlIG1hcHBpbmcgdGhhdCAnCisgICAgICAgICAgICAgICAgICAnY29ycmVzcG9uZHMgdG8gdGhhdFxuJworICAgICAgICAgICAgICAgICAgJ2tleS4gIChUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGEgdHVwbGUgZXhjZXB0IGlmIGl0IGhhcyAnCisgICAgICAgICAgICAgICAgICAnZXhhY3RseSBvbmVcbicKKyAgICAgICAgICAgICAgICAgICdpdGVtLilcbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdJZiB0aGUgcHJpbWFyeSBpcyBhIHNlcXVlbmNlLCB0aGUgZXhwcmVzc2lvbiAobGlzdCkgbXVzdCAnCisgICAgICAgICAgICAgICAgICAnZXZhbHVhdGUgdG9cbicKKyAgICAgICAgICAgICAgICAgICdhbiBpbnRlZ2VyIG9yIGEgc2xpY2UgKGFzIGRpc2N1c3NlZCBpbiB0aGUgZm9sbG93aW5nICcKKyAgICAgICAgICAgICAgICAgICdzZWN0aW9uKS5cbicKKyAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICdUaGUgZm9ybWFsIHN5bnRheCBtYWtlcyBubyBzcGVjaWFsIHByb3Zpc2lvbiBmb3IgbmVnYXRpdmUgJworICAgICAgICAgICAgICAgICAgJ2luZGljZXMgaW5cbicKKyAgICAgICAgICAgICAgICAgICdzZXF1ZW5jZXM7IGhvd2V2ZXIsIGJ1aWx0LWluIHNlcXVlbmNlcyBhbGwgcHJvdmlkZSBhICcKKyAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICdtZXRob2QgdGhhdCBpbnRlcnByZXRzIG5lZ2F0aXZlIGluZGljZXMgYnkgYWRkaW5nIHRoZSAnCisgICAgICAgICAgICAgICAgICAnbGVuZ3RoIG9mIHRoZVxuJworICAgICAgICAgICAgICAgICAgJ3NlcXVlbmNlIHRvIHRoZSBpbmRleCAoc28gdGhhdCAieFstMV0iIHNlbGVjdHMgdGhlIGxhc3QgJworICAgICAgICAgICAgICAgICAgJ2l0ZW0gb2YgIngiKS5cbicKKyAgICAgICAgICAgICAgICAgICdUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiAnCisgICAgICAgICAgICAgICAgICAndGhlIG51bWJlclxuJworICAgICAgICAgICAgICAgICAgJ29mIGl0ZW1zIGluIHRoZSBzZXF1ZW5jZSwgYW5kIHRoZSBzdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgJworICAgICAgICAgICAgICAgICAgJ2l0ZW0gd2hvc2VcbicKKyAgICAgICAgICAgICAgICAgICdpbmRleCBpcyB0aGF0IHZhbHVlIChjb3VudGluZyBmcm9tIHplcm8pLiBTaW5jZSB0aGUgc3VwcG9ydCAnCisgICAgICAgICAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgICAgICAgICAibmVnYXRpdmUgaW5kaWNlcyBhbmQgc2xpY2luZyBvY2N1cnMgaW4gdGhlIG9iamVjdCdzICIKKyAgICAgICAgICAgICAgICAgICciX19nZXRpdGVtX18oKSJcbicKKyAgICAgICAgICAgICAgICAgICdtZXRob2QsIHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZCB3aWxsIG5lZWQgdG8gJworICAgICAgICAgICAgICAgICAgJ2V4cGxpY2l0bHkgYWRkXG4nCisgICAgICAgICAgICAgICAgICAndGhhdCBzdXBwb3J0LlxuJworICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgIkEgc3RyaW5nJ3MgaXRlbXMgYXJlIGNoYXJhY3RlcnMuICBBIGNoYXJhY3RlciBpcyBub3QgYSAiCisgICAgICAgICAgICAgICAgICAnc2VwYXJhdGUgZGF0YVxuJworICAgICAgICAgICAgICAgICAgJ3R5cGUgYnV0IGEgc3RyaW5nIG9mIGV4YWN0bHkgb25lIGNoYXJhY3Rlci5cbicsCisgJ3RydXRoJzogJ1xuJworICAgICAgICAgICdUcnV0aCBWYWx1ZSBUZXN0aW5nXG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0FueSBvYmplY3QgY2FuIGJlIHRlc3RlZCBmb3IgdHJ1dGggdmFsdWUsIGZvciB1c2UgaW4gYW4gImlmIiBvclxuJworICAgICAgICAgICcid2hpbGUiIGNvbmRpdGlvbiBvciBhcyBvcGVyYW5kIG9mIHRoZSBCb29sZWFuIG9wZXJhdGlvbnMgYmVsb3cuICcKKyAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgJ2ZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZmFsc2U6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqICJOb25lIlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnKiAiRmFsc2UiXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqIHplcm8gb2YgYW55IG51bWVyaWMgdHlwZSwgZm9yIGV4YW1wbGUsICIwIiwgIjAuMCIsICIwaiIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcqIGFueSBlbXB0eSBzZXF1ZW5jZSwgZm9yIGV4YW1wbGUsICJcJ1wnIiwgIigpIiwgIltdIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyogYW55IGVtcHR5IG1hcHBpbmcsIGZvciBleGFtcGxlLCAie30iLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnKiBpbnN0YW5jZXMgb2YgdXNlci1kZWZpbmVkIGNsYXNzZXMsIGlmIHRoZSBjbGFzcyBkZWZpbmVzIGFcbicKKyAgICAgICAgICAnICAiX19ib29sX18oKSIgb3IgIl9fbGVuX18oKSIgbWV0aG9kLCB3aGVuIHRoYXQgbWV0aG9kIHJldHVybnMgdGhlXG4nCisgICAgICAgICAgJyAgaW50ZWdlciB6ZXJvIG9yICJib29sIiB2YWx1ZSAiRmFsc2UiLiBbMV1cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0FsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZSAtLS0gc28gb2JqZWN0cyBvZiBtYW55IHR5cGVzICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJ2Fsd2F5cyB0cnVlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnT3BlcmF0aW9ucyBhbmQgYnVpbHQtaW4gZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIEJvb2xlYW4gcmVzdWx0ICcKKyAgICAgICAgICAnYWx3YXlzXG4nCisgICAgICAgICAgJ3JldHVybiAiMCIgb3IgIkZhbHNlIiBmb3IgZmFsc2UgYW5kICIxIiBvciAiVHJ1ZSIgZm9yIHRydWUsIHVubGVzc1xuJworICAgICAgICAgICdvdGhlcndpc2Ugc3RhdGVkLiAoSW1wb3J0YW50IGV4Y2VwdGlvbjogdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyAnCisgICAgICAgICAgJyJvciJcbicKKyAgICAgICAgICAnYW5kICJhbmQiIGFsd2F5cyByZXR1cm4gb25lIG9mIHRoZWlyIG9wZXJhbmRzLilcbicsCisgJ3RyeSc6ICdcbicKKyAgICAgICAgJ1RoZSAidHJ5IiBzdGF0ZW1lbnRcbicKKyAgICAgICAgJyoqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlICJ0cnkiIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGVcbicKKyAgICAgICAgJ2ZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG4nCisgICAgICAgICdcbicKKyAgICAgICAgJyAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4nCisgICAgICAgICcgICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuJworICAgICAgICAnICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWyJhcyIgaWRlbnRpZmllcl1dICI6IiAnCisgICAgICAgICdzdWl0ZSkrXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAnICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbicKKyAgICAgICAgJyAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4nCisgICAgICAgICcgICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnVGhlICJleGNlcHQiIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlbiAnCisgICAgICAgICdub1xuJworICAgICAgICAnZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpc1xuJworICAgICAgICAnZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgInRyeSIgc3VpdGUsIGEgc2VhcmNoIGZvciAnCisgICAgICAgICdhblxuJworICAgICAgICAnZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHQgJworICAgICAgICAnY2xhdXNlc1xuJworICAgICAgICAnaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBbiAnCisgICAgICAgICdleHByZXNzaW9uLVxuJworICAgICAgICAnbGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXMgYW55XG4nCisgICAgICAgICdleGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXQgZXhwcmVzc2lvblxuJworICAgICAgICAnaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlIHJlc3VsdGluZ1xuJworICAgICAgICAnb2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXMgY29tcGF0aWJsZVxuJworICAgICAgICAnd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGUgJworICAgICAgICAnZXhjZXB0aW9uXG4nCisgICAgICAgICdvYmplY3Qgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZSBleGNlcHRpb24uXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ0lmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiAnCisgICAgICAgICdleGNlcHRpb25cbicKKyAgICAgICAgJ2hhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiAnCisgICAgICAgICdzdGFjay5cbicKKyAgICAgICAgJ1sxXVxuJworICAgICAgICAnXG4nCisgICAgICAgICdJZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0IGNsYXVzZVxuJworICAgICAgICAncmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkICcKKyAgICAgICAgJ2FuZFxuJworICAgICAgICAnYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb25cbicKKyAgICAgICAgJ3RoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgInRyeSIgc3RhdGVtZW50ICcKKyAgICAgICAgJ3JhaXNlZFxuJworICAgICAgICAndGhlIGV4Y2VwdGlvbikuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1doZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvXG4nCisgICAgICAgICd0aGUgdGFyZ2V0IHNwZWNpZmllZCBhZnRlciB0aGUgImFzIiBrZXl3b3JkIGluIHRoYXQgZXhjZXB0IGNsYXVzZSwgJworICAgICAgICAnaWZcbicKKyAgICAgICAgInByZXNlbnQsIGFuZCB0aGUgZXhjZXB0IGNsYXVzZSdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdFxuIgorICAgICAgICAnY2xhdXNlcyBtdXN0IGhhdmUgYW4gZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrICcKKyAgICAgICAgJ2lzXG4nCisgICAgICAgICdyZWFjaGVkLCBleGVjdXRpb24gY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5ICcKKyAgICAgICAgJ3N0YXRlbWVudC5cbicKKyAgICAgICAgJyhUaGlzIG1lYW5zIHRoYXQgaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgJworICAgICAgICAnZXhjZXB0aW9uLFxuJworICAgICAgICAnYW5kIHRoZSBleGNlcHRpb24gb2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGVcbicKKyAgICAgICAgJ291dGVyIGhhbmRsZXIgd2lsbCBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuJworICAgICAgICAnXG4nCisgICAgICAgICdXaGVuIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiBhc3NpZ25lZCB1c2luZyAiYXMgdGFyZ2V0IiwgaXQgaXMgY2xlYXJlZFxuJworICAgICAgICAnYXQgdGhlIGVuZCBvZiB0aGUgZXhjZXB0IGNsYXVzZS4gIFRoaXMgaXMgYXMgaWZcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgZXhjZXB0IEUgYXMgTjpcbicKKyAgICAgICAgJyAgICAgICBmb29cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnd2FzIHRyYW5zbGF0ZWQgdG9cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgZXhjZXB0IEUgYXMgTjpcbicKKyAgICAgICAgJyAgICAgICB0cnk6XG4nCisgICAgICAgICcgICAgICAgICAgIGZvb1xuJworICAgICAgICAnICAgICAgIGZpbmFsbHk6XG4nCisgICAgICAgICcgICAgICAgICAgIGRlbCBOXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoaXMgbWVhbnMgdGhlIGV4Y2VwdGlvbiBtdXN0IGJlIGFzc2lnbmVkIHRvIGEgZGlmZmVyZW50IG5hbWUgdG8gYmVcbicKKyAgICAgICAgJ2FibGUgdG8gcmVmZXIgdG8gaXQgYWZ0ZXIgdGhlIGV4Y2VwdCBjbGF1c2UuICBFeGNlcHRpb25zIGFyZSBjbGVhcmVkXG4nCisgICAgICAgICdiZWNhdXNlIHdpdGggdGhlIHRyYWNlYmFjayBhdHRhY2hlZCB0byB0aGVtLCB0aGV5IGZvcm0gYSByZWZlcmVuY2VcbicKKyAgICAgICAgJ2N5Y2xlIHdpdGggdGhlIHN0YWNrIGZyYW1lLCBrZWVwaW5nIGFsbCBsb2NhbHMgaW4gdGhhdCBmcmFtZSBhbGl2ZVxuJworICAgICAgICAndW50aWwgdGhlIG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIG9jY3Vycy5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAiQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2UncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbiIKKyAgICAgICAgJ2V4Y2VwdGlvbiBhcmUgc3RvcmVkIGluIHRoZSAic3lzIiBtb2R1bGUgYW5kIGNhbiBiZSBhY2Nlc3NlZCB2aWFcbicKKyAgICAgICAgJyJzeXMuZXhjX2luZm8oKSIuICJzeXMuZXhjX2luZm8oKSIgcmV0dXJucyBhIDMtdHVwbGUgY29uc2lzdGluZyBvZiAnCisgICAgICAgICd0aGVcbicKKyAgICAgICAgJ2V4Y2VwdGlvbiBjbGFzcywgdGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBhbmQgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWVcbicKKyAgICAgICAgJ3NlY3Rpb24gVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlXG4nCisgICAgICAgICdwcm9ncmFtIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuICAic3lzLmV4Y19pbmZvKCkiIHZhbHVlcyBhcmVcbicKKyAgICAgICAgJ3Jlc3RvcmVkIHRvIHRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZ1xuJworICAgICAgICAnZnJvbSBhIGZ1bmN0aW9uIHRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSBvcHRpb25hbCAiZWxzZSIgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG4nCisgICAgICAgICd0aGUgZW5kIG9mIHRoZSAidHJ5IiBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSAiZWxzZSIgY2xhdXNlIGFyZVxuJworICAgICAgICAnbm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyAiZXhjZXB0IiBjbGF1c2VzLlxuJworICAgICAgICAnXG4nCisgICAgICAgICdJZiAiZmluYWxseSIgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZSAnCisgICAgICAgICcidHJ5IlxuJworICAgICAgICAnY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55ICJleGNlcHQiIGFuZCAiZWxzZSIgY2xhdXNlcy4gIElmICcKKyAgICAgICAgJ2FuXG4nCisgICAgICAgICdleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90IGhhbmRsZWQsIHRoZVxuJworICAgICAgICAnZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgImZpbmFsbHkiIGNsYXVzZSBpcyBleGVjdXRlZC4gICcKKyAgICAgICAgJ0lmXG4nCisgICAgICAgICd0aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgJworICAgICAgICAnImZpbmFsbHkiXG4nCisgICAgICAgICdjbGF1c2UuICBJZiB0aGUgImZpbmFsbHkiIGNsYXVzZSByYWlzZXMgYW5vdGhlciBleGNlcHRpb24sIHRoZSBzYXZlZFxuJworICAgICAgICAnZXhjZXB0aW9uIGlzIHNldCBhcyB0aGUgY29udGV4dCBvZiB0aGUgbmV3IGV4Y2VwdGlvbi4gSWYgdGhlICcKKyAgICAgICAgJyJmaW5hbGx5IlxuJworICAgICAgICAnY2xhdXNlIGV4ZWN1dGVzIGEgInJldHVybiIgb3IgImJyZWFrIiBzdGF0ZW1lbnQsIHRoZSBzYXZlZCBleGNlcHRpb25cbicKKyAgICAgICAgJ2lzIGRpc2NhcmRlZDpcbicKKyAgICAgICAgJ1xuJworICAgICAgICAnICAgPj4+IGRlZiBmKCk6XG4nCisgICAgICAgICcgICAuLi4gICAgIHRyeTpcbicKKyAgICAgICAgJyAgIC4uLiAgICAgICAgIDEvMFxuJworICAgICAgICAnICAgLi4uICAgICBmaW5hbGx5OlxuJworICAgICAgICAnICAgLi4uICAgICAgICAgcmV0dXJuIDQyXG4nCisgICAgICAgICcgICAuLi5cbicKKyAgICAgICAgJyAgID4+PiBmKClcbicKKyAgICAgICAgJyAgIDQyXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbicKKyAgICAgICAgJ2V4ZWN1dGlvbiBvZiB0aGUgImZpbmFsbHkiIGNsYXVzZS5cbicKKyAgICAgICAgJ1xuJworICAgICAgICAnV2hlbiBhICJyZXR1cm4iLCAiYnJlYWsiIG9yICJjb250aW51ZSIgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluIHRoZVxuJworICAgICAgICAnInRyeSIgc3VpdGUgb2YgYSAidHJ5Ii4uLiJmaW5hbGx5IiBzdGF0ZW1lbnQsIHRoZSAiZmluYWxseSIgY2xhdXNlICcKKyAgICAgICAgJ2lzXG4nCisgICAgICAgICdhbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSAiY29udGludWUiIHN0YXRlbWVudCBpcyBpbGxlZ2FsICcKKyAgICAgICAgJ2luXG4nCisgICAgICAgICd0aGUgImZpbmFsbHkiIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYSBwcm9ibGVtIHdpdGggdGhlIGN1cnJlbnRcbicKKyAgICAgICAgJ2ltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG4nCisgICAgICAgICdcbicKKyAgICAgICAgJ1RoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsYXN0ICJyZXR1cm4iXG4nCisgICAgICAgICdzdGF0ZW1lbnQgZXhlY3V0ZWQuICBTaW5jZSB0aGUgImZpbmFsbHkiIGNsYXVzZSBhbHdheXMgZXhlY3V0ZXMsIGFcbicKKyAgICAgICAgJyJyZXR1cm4iIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgImZpbmFsbHkiIGNsYXVzZSB3aWxsIGFsd2F5cyBiZSAnCisgICAgICAgICd0aGVcbicKKyAgICAgICAgJ2xhc3Qgb25lIGV4ZWN1dGVkOlxuJworICAgICAgICAnXG4nCisgICAgICAgICcgICA+Pj4gZGVmIGZvbygpOlxuJworICAgICAgICAnICAgLi4uICAgICB0cnk6XG4nCisgICAgICAgICIgICAuLi4gICAgICAgICByZXR1cm4gJ3RyeSdcbiIKKyAgICAgICAgJyAgIC4uLiAgICAgZmluYWxseTpcbicKKyAgICAgICAgIiAgIC4uLiAgICAgICAgIHJldHVybiAnZmluYWxseSdcbiIKKyAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAnICAgPj4+IGZvbygpXG4nCisgICAgICAgICIgICAnZmluYWxseSdcbiIKKyAgICAgICAgJ1xuJworICAgICAgICAnQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4nCisgICAgICAgICdFeGNlcHRpb25zLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlICJyYWlzZSIgc3RhdGVtZW50IHRvICcKKyAgICAgICAgJ2dlbmVyYXRlXG4nCisgICAgICAgICdleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uIFRoZSByYWlzZSBzdGF0ZW1lbnQuXG4nLAorICd0eXBlcyc6ICdcbicKKyAgICAgICAgICAnVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB0eXBlcyB0aGF0IGFyZSBidWlsdCBpbnRvIFB5dGhvbi4gICcKKyAgICAgICAgICAnRXh0ZW5zaW9uXG4nCisgICAgICAgICAgJ21vZHVsZXMgKHdyaXR0ZW4gaW4gQywgSmF2YSwgb3Igb3RoZXIgbGFuZ3VhZ2VzLCBkZXBlbmRpbmcgb24gdGhlXG4nCisgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2ZcbicKKyAgICAgICAgICAnUHl0aG9uIG1heSBhZGQgdHlwZXMgdG8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuLCByYXRpb25hbCAnCisgICAgICAgICAgJ251bWJlcnMsXG4nCisgICAgICAgICAgJ2VmZmljaWVudGx5IHN0b3JlZCBhcnJheXMgb2YgaW50ZWdlcnMsIGV0Yy4pLCBhbHRob3VnaCBzdWNoICcKKyAgICAgICAgICAnYWRkaXRpb25zXG4nCisgICAgICAgICAgJ3dpbGwgb2Z0ZW4gYmUgcHJvdmlkZWQgdmlhIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGluc3RlYWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdTb21lIG9mIHRoZSB0eXBlIGRlc2NyaXB0aW9ucyBiZWxvdyBjb250YWluIGEgcGFyYWdyYXBoIGxpc3RpbmdcbicKKyAgICAgICAgICAiJ3NwZWNpYWwgYXR0cmlidXRlcy4nICBUaGVzZSBhcmUgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvICIKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJ2ltcGxlbWVudGF0aW9uIGFuZCBhcmUgbm90IGludGVuZGVkIGZvciBnZW5lcmFsIHVzZS4gIFRoZWlyICcKKyAgICAgICAgICAnZGVmaW5pdGlvblxuJworICAgICAgICAgICdtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdOb25lXG4nCisgICAgICAgICAgJyAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCAnCisgICAgICAgICAgJ3RoaXNcbicKKyAgICAgICAgICAnICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWUgIk5vbmUiLiAnCisgICAgICAgICAgJ0l0XG4nCisgICAgICAgICAgJyAgIGlzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIG1hbnkgc2l0dWF0aW9ucywgJworICAgICAgICAgICdlLmcuLFxuJworICAgICAgICAgICIgICBpdCBpcyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvbid0IGV4cGxpY2l0bHkgcmV0dXJuXG4iCisgICAgICAgICAgJyAgIGFueXRoaW5nLiBJdHMgdHJ1dGggdmFsdWUgaXMgZmFsc2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdOb3RJbXBsZW1lbnRlZFxuJworICAgICAgICAgICcgICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggJworICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgJyAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lXG4nCisgICAgICAgICAgJyAgICJOb3RJbXBsZW1lbnRlZCIuIE51bWVyaWMgbWV0aG9kcyBhbmQgcmljaCBjb21wYXJpc29uIG1ldGhvZHNcbicKKyAgICAgICAgICAnICAgc2hvdWxkIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZXkgZG8gbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJyAgIHRoZSBvcGVyYW5kcyBwcm92aWRlZC4gIChUaGUgaW50ZXJwcmV0ZXIgd2lsbCB0aGVuIHRyeSB0aGVcbicKKyAgICAgICAgICAnICAgcmVmbGVjdGVkIG9wZXJhdGlvbiwgb3Igc29tZSBvdGhlciBmYWxsYmFjaywgZGVwZW5kaW5nIG9uIHRoZVxuJworICAgICAgICAgICcgICBvcGVyYXRvci4pICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNlZSBJbXBsZW1lbnRpbmcgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBmb3IgbW9yZSBkZXRhaWxzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnRWxsaXBzaXNcbicKKyAgICAgICAgICAnICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoICcKKyAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICcgICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbGl0ZXJhbCAiLi4uIiBvciB0aGVcbicKKyAgICAgICAgICAnICAgYnVpbHQtaW4gbmFtZSAiRWxsaXBzaXMiLiAgSXRzIHRydXRoIHZhbHVlIGlzIHRydWUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcibnVtYmVycy5OdW1iZXIiXG4nCisgICAgICAgICAgJyAgIFRoZXNlIGFyZSBjcmVhdGVkIGJ5IG51bWVyaWMgbGl0ZXJhbHMgYW5kIHJldHVybmVkIGFzIHJlc3VsdHMgJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICBhcml0aG1ldGljIG9wZXJhdG9ycyBhbmQgYXJpdGhtZXRpYyBidWlsdC1pbiBmdW5jdGlvbnMuICAnCisgICAgICAgICAgJ051bWVyaWNcbicKKyAgICAgICAgICAnICAgb2JqZWN0cyBhcmUgaW1tdXRhYmxlOyBvbmNlIGNyZWF0ZWQgdGhlaXIgdmFsdWUgbmV2ZXIgY2hhbmdlcy5cbicKKyAgICAgICAgICAnICAgUHl0aG9uIG51bWJlcnMgYXJlIG9mIGNvdXJzZSBzdHJvbmdseSByZWxhdGVkIHRvIG1hdGhlbWF0aWNhbFxuJworICAgICAgICAgICcgICBudW1iZXJzLCBidXQgc3ViamVjdCB0byB0aGUgbGltaXRhdGlvbnMgb2YgbnVtZXJpY2FsICcKKyAgICAgICAgICAncmVwcmVzZW50YXRpb25cbicKKyAgICAgICAgICAnICAgaW4gY29tcHV0ZXJzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgJworICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAnICAgY29tcGxleCBudW1iZXJzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgIm51bWJlcnMuSW50ZWdyYWwiXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBlbGVtZW50cyBmcm9tIHRoZSBtYXRoZW1hdGljYWwgc2V0IG9mICcKKyAgICAgICAgICAnaW50ZWdlcnNcbicKKyAgICAgICAgICAnICAgICAgKHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIGludGVnZXJzOlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgSW50ZWdlcnMgKCJpbnQiKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gYW4gdW5saW1pdGVkIHJhbmdlLCBzdWJqZWN0IHRvXG4nCisgICAgICAgICAgJyAgICAgICAgIGF2YWlsYWJsZSAodmlydHVhbCkgbWVtb3J5IG9ubHkuICBGb3IgdGhlIHB1cnBvc2Ugb2YgJworICAgICAgICAgICdzaGlmdFxuJworICAgICAgICAgICcgICAgICAgICBhbmQgbWFzayBvcGVyYXRpb25zLCBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyBhc3N1bWVkLCAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICIgICAgICAgICBuZWdhdGl2ZSBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiBhIHZhcmlhbnQgb2YgMidzXG4iCisgICAgICAgICAgJyAgICAgICAgIGNvbXBsZW1lbnQgd2hpY2ggZ2l2ZXMgdGhlIGlsbHVzaW9uIG9mIGFuIGluZmluaXRlIHN0cmluZyAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgICAgIHNpZ24gYml0cyBleHRlbmRpbmcgdG8gdGhlIGxlZnQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBCb29sZWFucyAoImJvb2wiKVxuJworICAgICAgICAgICcgICAgICAgICBUaGVzZSByZXByZXNlbnQgdGhlIHRydXRoIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZS4gIFRoZSB0d29cbicKKyAgICAgICAgICAnICAgICAgICAgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyAiRmFsc2UiIGFuZCAiVHJ1ZSIgYXJlICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgICAgIG9ubHkgQm9vbGVhbiBvYmplY3RzLiBUaGUgQm9vbGVhbiB0eXBlIGlzIGEgc3VidHlwZSBvZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICAgICBpbnRlZ2VyIHR5cGUsIGFuZCBCb29sZWFuIHZhbHVlcyBiZWhhdmUgbGlrZSB0aGUgdmFsdWVzIDAgJworICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAnICAgICAgICAgMSwgcmVzcGVjdGl2ZWx5LCBpbiBhbG1vc3QgYWxsIGNvbnRleHRzLCB0aGUgZXhjZXB0aW9uICcKKyAgICAgICAgICAnYmVpbmdcbicKKyAgICAgICAgICAnICAgICAgICAgdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHN0cmluZywgdGhlIHN0cmluZ3MgIiJGYWxzZSIiIG9yXG4nCisgICAgICAgICAgJyAgICAgICAgICIiVHJ1ZSIiIGFyZSByZXR1cm5lZCwgcmVzcGVjdGl2ZWx5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVGhlIHJ1bGVzIGZvciBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGFyZSBpbnRlbmRlZCB0byBnaXZlICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIG1vc3QgbWVhbmluZ2Z1bCBpbnRlcnByZXRhdGlvbiBvZiBzaGlmdCBhbmQgbWFzayBvcGVyYXRpb25zXG4nCisgICAgICAgICAgJyAgICAgIGludm9sdmluZyBuZWdhdGl2ZSBpbnRlZ2Vycy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICJudW1iZXJzLlJlYWwiICgiZmxvYXQiKVxuJworICAgICAgICAgICcgICAgICBUaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nICcKKyAgICAgICAgICAncG9pbnRcbicKKyAgICAgICAgICAnICAgICAgbnVtYmVycy4gWW91IGFyZSBhdCB0aGUgbWVyY3kgb2YgdGhlIHVuZGVybHlpbmcgbWFjaGluZVxuJworICAgICAgICAgICcgICAgICBhcmNoaXRlY3R1cmUgKGFuZCBDIG9yIEphdmEgaW1wbGVtZW50YXRpb24pIGZvciB0aGUgYWNjZXB0ZWRcbicKKyAgICAgICAgICAnICAgICAgcmFuZ2UgYW5kIGhhbmRsaW5nIG9mIG92ZXJmbG93LiBQeXRob24gZG9lcyBub3Qgc3VwcG9ydCAnCisgICAgICAgICAgJ3NpbmdsZS1cbicKKyAgICAgICAgICAnICAgICAgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZSBzYXZpbmdzIGluIHByb2Nlc3NvciAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICcgICAgICBtZW1vcnkgdXNhZ2UgdGhhdCBhcmUgdXN1YWxseSB0aGUgcmVhc29uIGZvciB1c2luZyB0aGVzZSBhcmVcbicKKyAgICAgICAgICAnICAgICAgZHdhcmZlZCBieSB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgb2JqZWN0cyBpbiBQeXRob24sIHNvIHRoZXJlICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgbm8gcmVhc29uIHRvIGNvbXBsaWNhdGUgdGhlIGxhbmd1YWdlIHdpdGggdHdvIGtpbmRzIG9mICcKKyAgICAgICAgICAnZmxvYXRpbmdcbicKKyAgICAgICAgICAnICAgICAgcG9pbnQgbnVtYmVycy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICJudW1iZXJzLkNvbXBsZXgiICgiY29tcGxleCIpXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBjb21wbGV4IG51bWJlcnMgYXMgYSBwYWlyIG9mIG1hY2hpbmUtbGV2ZWxcbicKKyAgICAgICAgICAnICAgICAgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgVGhlIHNhbWUgY2F2ZWF0cyAnCisgICAgICAgICAgJ2FwcGx5XG4nCisgICAgICAgICAgJyAgICAgIGFzIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzICcKKyAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICcgICAgICBjb21wbGV4IG51bWJlciAieiIgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSByZWFkLW9ubHlcbicKKyAgICAgICAgICAnICAgICAgYXR0cmlidXRlcyAiei5yZWFsIiBhbmQgInouaW1hZyIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdTZXF1ZW5jZXNcbicKKyAgICAgICAgICAnICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBvcmRlcmVkIHNldHMgaW5kZXhlZCBieSBub24tbmVnYXRpdmVcbicKKyAgICAgICAgICAnICAgbnVtYmVycy4gVGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSIgcmV0dXJucyB0aGUgbnVtYmVyIG9mICcKKyAgICAgICAgICAnaXRlbXNcbicKKyAgICAgICAgICAnICAgb2YgYSBzZXF1ZW5jZS4gV2hlbiB0aGUgbGVuZ3RoIG9mIGEgc2VxdWVuY2UgaXMgKm4qLCB0aGUgaW5kZXggJworICAgICAgICAgICdzZXRcbicKKyAgICAgICAgICAnICAgY29udGFpbnMgdGhlIG51bWJlcnMgMCwgMSwgLi4uLCAqbiotMS4gIEl0ZW0gKmkqIG9mIHNlcXVlbmNlICphKiAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgIHNlbGVjdGVkIGJ5ICJhW2ldIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgc2xpY2luZzogImFbaTpqXSIgc2VsZWN0cyBhbGwgaXRlbXMgd2l0aFxuJworICAgICAgICAgICcgICBpbmRleCAqayogc3VjaCB0aGF0ICppKiAiPD0iICprKiAiPCIgKmoqLiAgV2hlbiB1c2VkIGFzIGFuXG4nCisgICAgICAgICAgJyAgIGV4cHJlc3Npb24sIGEgc2xpY2UgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyAnCisgICAgICAgICAgJ2ltcGxpZXNcbicKKyAgICAgICAgICAnICAgdGhhdCB0aGUgaW5kZXggc2V0IGlzIHJlbnVtYmVyZWQgc28gdGhhdCBpdCBzdGFydHMgYXQgMC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNvbWUgc2VxdWVuY2VzIGFsc28gc3VwcG9ydCAiZXh0ZW5kZWQgc2xpY2luZyIgd2l0aCBhIHRoaXJkICcKKyAgICAgICAgICAnInN0ZXAiXG4nCisgICAgICAgICAgJyAgIHBhcmFtZXRlcjogImFbaTpqOmtdIiBzZWxlY3RzIGFsbCBpdGVtcyBvZiAqYSogd2l0aCBpbmRleCAqeCogJworICAgICAgICAgICd3aGVyZVxuJworICAgICAgICAgICcgICAieCA9IGkgKyBuKmsiLCAqbiogIj49IiAiMCIgYW5kICppKiAiPD0iICp4KiAiPCIgKmoqLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgU2VxdWVuY2VzIGFyZSBkaXN0aW5ndWlzaGVkIGFjY29yZGluZyB0byB0aGVpciBtdXRhYmlsaXR5OlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgSW1tdXRhYmxlIHNlcXVlbmNlc1xuJworICAgICAgICAgICcgICAgICBBbiBvYmplY3Qgb2YgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGUgY2Fubm90IGNoYW5nZSBvbmNlIGl0ICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgY3JlYXRlZC4gIChJZiB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb3RoZXIgJworICAgICAgICAgICdvYmplY3RzLFxuJworICAgICAgICAgICcgICAgICB0aGVzZSBvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgJworICAgICAgICAgICdob3dldmVyLFxuJworICAgICAgICAgICcgICAgICB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgYW4gJworICAgICAgICAgICdpbW11dGFibGVcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0IGNhbm5vdCBjaGFuZ2UuKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFN0cmluZ3NcbicKKyAgICAgICAgICAnICAgICAgICAgQSBzdHJpbmcgaXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMgdGhhdCByZXByZXNlbnQgVW5pY29kZSAnCisgICAgICAgICAgJ2NvZGVcbicKKyAgICAgICAgICAnICAgICAgICAgcG9pbnRzLiBBbGwgdGhlIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZSAiVSswMDAwIC0gJworICAgICAgICAgICdVKzEwRkZGRiJcbicKKyAgICAgICAgICAiICAgICAgICAgY2FuIGJlIHJlcHJlc2VudGVkIGluIGEgc3RyaW5nLiAgUHl0aG9uIGRvZXNuJ3QgaGF2ZSBhICIKKyAgICAgICAgICAnImNoYXIiXG4nCisgICAgICAgICAgJyAgICAgICAgIHR5cGU7IGluc3RlYWQsIGV2ZXJ5IGNvZGUgcG9pbnQgaW4gdGhlIHN0cmluZyBpcyAnCisgICAgICAgICAgJ3JlcHJlc2VudGVkXG4nCisgICAgICAgICAgJyAgICAgICAgIGFzIGEgc3RyaW5nIG9iamVjdCB3aXRoIGxlbmd0aCAiMSIuICBUaGUgYnVpbHQtaW4gJworICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICcgICAgICAgICAib3JkKCkiIGNvbnZlcnRzIGEgY29kZSBwb2ludCBmcm9tIGl0cyBzdHJpbmcgZm9ybSB0byBhblxuJworICAgICAgICAgICcgICAgICAgICBpbnRlZ2VyIGluIHRoZSByYW5nZSAiMCAtIDEwRkZGRiI7ICJjaHIoKSIgY29udmVydHMgYW5cbicKKyAgICAgICAgICAnICAgICAgICAgaW50ZWdlciBpbiB0aGUgcmFuZ2UgIjAgLSAxMEZGRkYiIHRvIHRoZSBjb3JyZXNwb25kaW5nICcKKyAgICAgICAgICAnbGVuZ3RoXG4nCisgICAgICAgICAgJyAgICAgICAgICIxIiBzdHJpbmcgb2JqZWN0LiAic3RyLmVuY29kZSgpIiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0ICcKKyAgICAgICAgICAnYVxuJworICAgICAgICAgICcgICAgICAgICAic3RyIiB0byAiYnl0ZXMiIHVzaW5nIHRoZSBnaXZlbiB0ZXh0IGVuY29kaW5nLCBhbmRcbicKKyAgICAgICAgICAnICAgICAgICAgImJ5dGVzLmRlY29kZSgpIiBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBvcHBvc2l0ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFR1cGxlc1xuJworICAgICAgICAgICcgICAgICAgICBUaGUgaXRlbXMgb2YgYSB0dXBsZSBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiBUdXBsZXMgJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICcgICAgICAgICB0d28gb3IgbW9yZSBpdGVtcyBhcmUgZm9ybWVkIGJ5IGNvbW1hLXNlcGFyYXRlZCBsaXN0cyBvZlxuJworICAgICAgICAgICIgICAgICAgICBleHByZXNzaW9ucy4gIEEgdHVwbGUgb2Ygb25lIGl0ZW0gKGEgJ3NpbmdsZXRvbicpIGNhbiBiZVxuIgorICAgICAgICAgICcgICAgICAgICBmb3JtZWQgYnkgYWZmaXhpbmcgYSBjb21tYSB0byBhbiBleHByZXNzaW9uIChhbiBleHByZXNzaW9uICcKKyAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAnICAgICAgICAgaXRzZWxmIGRvZXMgbm90IGNyZWF0ZSBhIHR1cGxlLCBzaW5jZSBwYXJlbnRoZXNlcyBtdXN0IGJlXG4nCisgICAgICAgICAgJyAgICAgICAgIHVzYWJsZSBmb3IgZ3JvdXBpbmcgb2YgZXhwcmVzc2lvbnMpLiAgQW4gZW1wdHkgdHVwbGUgY2FuICcKKyAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAnICAgICAgICAgZm9ybWVkIGJ5IGFuIGVtcHR5IHBhaXIgb2YgcGFyZW50aGVzZXMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBCeXRlc1xuJworICAgICAgICAgICcgICAgICAgICBBIGJ5dGVzIG9iamVjdCBpcyBhbiBpbW11dGFibGUgYXJyYXkuICBUaGUgaXRlbXMgYXJlICcKKyAgICAgICAgICAnOC1iaXRcbicKKyAgICAgICAgICAnICAgICAgICAgYnl0ZXMsIHJlcHJlc2VudGVkIGJ5IGludGVnZXJzIGluIHRoZSByYW5nZSAwIDw9IHggPCAyNTYuXG4nCisgICAgICAgICAgJyAgICAgICAgIEJ5dGVzIGxpdGVyYWxzIChsaWtlICJiXCdhYmNcJyIpIGFuZCB0aGUgYnVpbHQtaW4gJworICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICcgICAgICAgICAiYnl0ZXMoKSIgY2FuIGJlIHVzZWQgdG8gY29uc3RydWN0IGJ5dGVzIG9iamVjdHMuICBBbHNvLFxuJworICAgICAgICAgICcgICAgICAgICBieXRlcyBvYmplY3RzIGNhbiBiZSBkZWNvZGVkIHRvIHN0cmluZ3MgdmlhIHRoZSAnCisgICAgICAgICAgJyJkZWNvZGUoKSJcbicKKyAgICAgICAgICAnICAgICAgICAgbWV0aG9kLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgTXV0YWJsZSBzZXF1ZW5jZXNcbicKKyAgICAgICAgICAnICAgICAgTXV0YWJsZSBzZXF1ZW5jZXMgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gICcKKyAgICAgICAgICAnVGhlXG4nCisgICAgICAgICAgJyAgICAgIHN1YnNjcmlwdGlvbiBhbmQgc2xpY2luZyBub3RhdGlvbnMgY2FuIGJlIHVzZWQgYXMgdGhlIHRhcmdldCAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIGFzc2lnbm1lbnQgYW5kICJkZWwiIChkZWxldGUpIHN0YXRlbWVudHMuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIExpc3RzXG4nCisgICAgICAgICAgJyAgICAgICAgIFRoZSBpdGVtcyBvZiBhIGxpc3QgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gIExpc3RzICcKKyAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgJyAgICAgICAgIGZvcm1lZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgJworICAgICAgICAgICdpblxuJworICAgICAgICAgICcgICAgICAgICBzcXVhcmUgYnJhY2tldHMuIChOb3RlIHRoYXQgdGhlcmUgYXJlIG5vIHNwZWNpYWwgY2FzZXMgJworICAgICAgICAgICduZWVkZWRcbicKKyAgICAgICAgICAnICAgICAgICAgdG8gZm9ybSBsaXN0cyBvZiBsZW5ndGggMCBvciAxLilcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEJ5dGUgQXJyYXlzXG4nCisgICAgICAgICAgJyAgICAgICAgIEEgYnl0ZWFycmF5IG9iamVjdCBpcyBhIG11dGFibGUgYXJyYXkuIFRoZXkgYXJlIGNyZWF0ZWQgJworICAgICAgICAgICdieVxuJworICAgICAgICAgICcgICAgICAgICB0aGUgYnVpbHQtaW4gImJ5dGVhcnJheSgpIiBjb25zdHJ1Y3Rvci4gIEFzaWRlIGZyb20gYmVpbmdcbicKKyAgICAgICAgICAnICAgICAgICAgbXV0YWJsZSAoYW5kIGhlbmNlIHVuaGFzaGFibGUpLCBieXRlIGFycmF5cyBvdGhlcndpc2UgJworICAgICAgICAgICdwcm92aWRlXG4nCisgICAgICAgICAgJyAgICAgICAgIHRoZSBzYW1lIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbGl0eSBhcyBpbW11dGFibGUgYnl0ZXNcbicKKyAgICAgICAgICAnICAgICAgICAgb2JqZWN0cy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlICJhcnJheSIgcHJvdmlkZXMgYW4gYWRkaXRpb25hbCBleGFtcGxlICcKKyAgICAgICAgICAnb2YgYVxuJworICAgICAgICAgICcgICAgICBtdXRhYmxlIHNlcXVlbmNlIHR5cGUsIGFzIGRvZXMgdGhlICJjb2xsZWN0aW9ucyIgbW9kdWxlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnU2V0IHR5cGVzXG4nCisgICAgICAgICAgJyAgIFRoZXNlIHJlcHJlc2VudCB1bm9yZGVyZWQsIGZpbml0ZSBzZXRzIG9mIHVuaXF1ZSwgaW1tdXRhYmxlXG4nCisgICAgICAgICAgJyAgIG9iamVjdHMuIEFzIHN1Y2gsIHRoZXkgY2Fubm90IGJlIGluZGV4ZWQgYnkgYW55IHN1YnNjcmlwdC4gJworICAgICAgICAgICdIb3dldmVyLFxuJworICAgICAgICAgICcgICB0aGV5IGNhbiBiZSBpdGVyYXRlZCBvdmVyLCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uICJsZW4oKSJcbicKKyAgICAgICAgICAnICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUgJworICAgICAgICAgICdmYXN0XG4nCisgICAgICAgICAgJyAgIG1lbWJlcnNoaXAgdGVzdGluZywgcmVtb3ZpbmcgZHVwbGljYXRlcyBmcm9tIGEgc2VxdWVuY2UsIGFuZFxuJworICAgICAgICAgICcgICBjb21wdXRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBpbnRlcnNlY3Rpb24sIHVuaW9uLFxuJworICAgICAgICAgICcgICBkaWZmZXJlbmNlLCBhbmQgc3ltbWV0cmljIGRpZmZlcmVuY2UuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBGb3Igc2V0IGVsZW1lbnRzLCB0aGUgc2FtZSBpbW11dGFiaWxpdHkgcnVsZXMgYXBwbHkgYXMgZm9yXG4nCisgICAgICAgICAgJyAgIGRpY3Rpb25hcnkga2V5cy4gTm90ZSB0aGF0IG51bWVyaWMgdHlwZXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJyAgIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgIjEiIGFuZFxuJworICAgICAgICAgICcgICAiMS4wIiksIG9ubHkgb25lIG9mIHRoZW0gY2FuIGJlIGNvbnRhaW5lZCBpbiBhIHNldC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBzZXQgdHlwZXM6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBTZXRzXG4nCisgICAgICAgICAgJyAgICAgIFRoZXNlIHJlcHJlc2VudCBhIG11dGFibGUgc2V0LiBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSAnCisgICAgICAgICAgJ2J1aWx0LWluXG4nCisgICAgICAgICAgJyAgICAgICJzZXQoKSIgY29uc3RydWN0b3IgYW5kIGNhbiBiZSBtb2RpZmllZCBhZnRlcndhcmRzIGJ5ICcKKyAgICAgICAgICAnc2V2ZXJhbFxuJworICAgICAgICAgICcgICAgICBtZXRob2RzLCBzdWNoIGFzICJhZGQoKSIuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBGcm96ZW4gc2V0c1xuJworICAgICAgICAgICcgICAgICBUaGVzZSByZXByZXNlbnQgYW4gaW1tdXRhYmxlIHNldC4gIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlXG4nCisgICAgICAgICAgJyAgICAgIGJ1aWx0LWluICJmcm96ZW5zZXQoKSIgY29uc3RydWN0b3IuICBBcyBhIGZyb3plbnNldCBpcyAnCisgICAgICAgICAgJ2ltbXV0YWJsZVxuJworICAgICAgICAgICcgICAgICBhbmQgKmhhc2hhYmxlKiwgaXQgY2FuIGJlIHVzZWQgYWdhaW4gYXMgYW4gZWxlbWVudCBvZiAnCisgICAgICAgICAgJ2Fub3RoZXJcbicKKyAgICAgICAgICAnICAgICAgc2V0LCBvciBhcyBhIGRpY3Rpb25hcnkga2V5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnTWFwcGluZ3NcbicKKyAgICAgICAgICAnICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBhcmJpdHJhcnkgJworICAgICAgICAgICdpbmRleFxuJworICAgICAgICAgICcgICBzZXRzLiBUaGUgc3Vic2NyaXB0IG5vdGF0aW9uICJhW2tdIiBzZWxlY3RzIHRoZSBpdGVtIGluZGV4ZWQgYnkgJworICAgICAgICAgICciayJcbicKKyAgICAgICAgICAnICAgZnJvbSB0aGUgbWFwcGluZyAiYSI7IHRoaXMgY2FuIGJlIHVzZWQgaW4gZXhwcmVzc2lvbnMgYW5kIGFzICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgIHRhcmdldCBvZiBhc3NpZ25tZW50cyBvciAiZGVsIiBzdGF0ZW1lbnRzLiBUaGUgYnVpbHQtaW4gJworICAgICAgICAgICdmdW5jdGlvblxuJworICAgICAgICAgICcgICAibGVuKCkiIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIG1hcHBpbmcuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZTpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIERpY3Rpb25hcmllc1xuJworICAgICAgICAgICcgICAgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseVxuJworICAgICAgICAgICcgICAgICBhcmJpdHJhcnkgdmFsdWVzLiAgVGhlIG9ubHkgdHlwZXMgb2YgdmFsdWVzIG5vdCBhY2NlcHRhYmxlICcKKyAgICAgICAgICAnYXNcbicKKyAgICAgICAgICAnICAgICAga2V5cyBhcmUgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMgb3IgZGljdGlvbmFyaWVzIG9yIG90aGVyXG4nCisgICAgICAgICAgJyAgICAgIG11dGFibGUgdHlwZXMgdGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgICAgaWRlbnRpdHksIHRoZSByZWFzb24gYmVpbmcgdGhhdCB0aGUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uICcKKyAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAiICAgICAgZGljdGlvbmFyaWVzIHJlcXVpcmVzIGEga2V5J3MgaGFzaCB2YWx1ZSB0byByZW1haW4gY29uc3RhbnQuXG4iCisgICAgICAgICAgJyAgICAgIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5IHRoZSBub3JtYWwgcnVsZXMgZm9yICcKKyAgICAgICAgICAnbnVtZXJpY1xuJworICAgICAgICAgICcgICAgICBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCAiMSIgYW5kICcKKyAgICAgICAgICAnIjEuMCIpXG4nCisgICAgICAgICAgJyAgICAgIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXggdGhlIHNhbWVcbicKKyAgICAgICAgICAnICAgICAgZGljdGlvbmFyeSBlbnRyeS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIERpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgInsuLi59IlxuJworICAgICAgICAgICcgICAgICBub3RhdGlvbiAoc2VlIHNlY3Rpb24gRGljdGlvbmFyeSBkaXNwbGF5cykuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBUaGUgZXh0ZW5zaW9uIG1vZHVsZXMgImRibS5uZGJtIiBhbmQgImRibS5nbnUiIHByb3ZpZGVcbicKKyAgICAgICAgICAnICAgICAgYWRkaXRpb25hbCBleGFtcGxlcyBvZiBtYXBwaW5nIHR5cGVzLCBhcyBkb2VzIHRoZSAnCisgICAgICAgICAgJyJjb2xsZWN0aW9ucyJcbicKKyAgICAgICAgICAnICAgICAgbW9kdWxlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQ2FsbGFibGUgdHlwZXNcbicKKyAgICAgICAgICAnICAgVGhlc2UgYXJlIHRoZSB0eXBlcyB0byB3aGljaCB0aGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRpb24gKHNlZVxuJworICAgICAgICAgICcgICBzZWN0aW9uIENhbGxzKSBjYW4gYmUgYXBwbGllZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFVzZXItZGVmaW5lZCBmdW5jdGlvbnNcbicKKyAgICAgICAgICAnICAgICAgQSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgYSBmdW5jdGlvblxuJworICAgICAgICAgICcgICAgICBkZWZpbml0aW9uIChzZWUgc2VjdGlvbiBGdW5jdGlvbiBkZWZpbml0aW9ucykuICBJdCBzaG91bGQgYmVcbicKKyAgICAgICAgICAnICAgICAgY2FsbGVkIHdpdGggYW4gYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIG51bWJlciBvZiAnCisgICAgICAgICAgJ2l0ZW1zXG4nCisgICAgICAgICAgIiAgICAgIGFzIHRoZSBmdW5jdGlvbidzIGZvcm1hbCBwYXJhbWV0ZXIgbGlzdC5cbiIKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgYXR0cmlidXRlczpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCBBdHRyaWJ1dGUgICAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fZG9jX18iICAgICAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyAnCisgICAgICAgICAgJ2RvY3VtZW50YXRpb24gICAgfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZywgb3IgIk5vbmUiIGlmICAgICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5hdmFpbGFibGU7IG5vdCBpbmhlcml0ZWQgYnkgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdWJjbGFzc2VzICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19uYW1lX18iICAgICAgICAgICAgICAgIHwgVGhlIGZ1bmN0aW9uXCdzICcKKyAgICAgICAgICAnbmFtZSAgICAgICAgICAgICB8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX3F1YWxuYW1lX18iICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgKnF1YWxpZmllZCAnCisgICAgICAgICAgJ25hbWUqIHwgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOZXcgaW4gdmVyc2lvbiAzLjMuICAgICAgICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19tb2R1bGVfXyIgICAgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgICAgICAnCisgICAgICAgICAgJ3wgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiwgb3IgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJOb25lIiBpZiB1bmF2YWlsYWJsZS4gICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2RlZmF1bHRzX18iICAgICAgICAgICAgfCBBIHR1cGxlIGNvbnRhaW5pbmcgZGVmYXVsdCAgICAgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50IHZhbHVlcyBmb3IgdGhvc2UgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnRzIHRoYXQgaGF2ZSBkZWZhdWx0cywgICAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBvciAiTm9uZSIgaWYgbm8gYXJndW1lbnRzIGhhdmUgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2NvZGVfXyIgICAgICAgICAgICAgICAgfCBUaGUgY29kZSBvYmplY3QgcmVwcmVzZW50aW5nICAgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb21waWxlZCBmdW5jdGlvbiBib2R5LiAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2dsb2JhbHNfXyIgICAgICAgICAgICAgfCBBIHJlZmVyZW5jZSB0byB0aGUgZGljdGlvbmFyeSAgICcKKyAgICAgICAgICAnfCBSZWFkLW9ubHkgICB8XG4nCisgICAgICAgICAgIiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uJ3MgICAgICAgIgorICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZ2xvYmFsIHZhcmlhYmxlcyAtLS0gdGhlIGdsb2JhbCAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZSBpbiAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZGVmaW5lZC4gJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2RpY3RfXyIgICAgICAgICAgICAgICAgfCBUaGUgbmFtZXNwYWNlIHN1cHBvcnRpbmcgICAgICAgICcKKyAgICAgICAgICAnfCBXcml0YWJsZSAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyYml0cmFyeSBmdW5jdGlvbiBhdHRyaWJ1dGVzLiAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAnICAgICAgJworICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICcgICAgICB8ICJfX2Nsb3N1cmVfXyIgICAgICAgICAgICAgfCAiTm9uZSIgb3IgYSB0dXBsZSBvZiBjZWxscyB0aGF0ICcKKyAgICAgICAgICAnfCBSZWFkLW9ubHkgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvbnRhaW4gYmluZGluZ3MgZm9yIHRoZSAgICAgICAgJworICAgICAgICAgICd8ICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAiICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24ncyBmcmVlIHZhcmlhYmxlcy4gICAgICAiCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICAnCisgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgJyAgICAgIHwgIl9fYW5ub3RhdGlvbnNfXyIgICAgICAgICB8IEEgZGljdCBjb250YWluaW5nIGFubm90YXRpb25zICAgJworICAgICAgICAgICd8IFdyaXRhYmxlICAgIHxcbicKKyAgICAgICAgICAnICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgb2YgcGFyYW1ldGVycy4gIFRoZSBrZXlzIG9mIHRoZSAnCisgICAgICAgICAgJ3wgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkaWN0IGFyZSB0aGUgcGFyYW1ldGVyIG5hbWVzLCAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFuZCAiXCdyZXR1cm5cJyIgZm9yIHRoZSAnCisgICAgICAgICAgJ3JldHVybiAgIHwgICAgICAgICAgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbm5vdGF0aW9uLCBpZiBwcm92aWRlZC4gICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnICAgICAgfCAiX19rd2RlZmF1bHRzX18iICAgICAgICAgIHwgQSBkaWN0IGNvbnRhaW5pbmcgZGVmYXVsdHMgZm9yICAnCisgICAgICAgICAgJ3wgV3JpdGFibGUgICAgfFxuJworICAgICAgICAgICcgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3JkLW9ubHkgcGFyYW1ldGVycy4gICAgICAgICcKKyAgICAgICAgICAnfCAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgJyAgICAgICcKKyAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIE1vc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgbGFiZWxsZWQgIldyaXRhYmxlIiBjaGVjayB0aGUgdHlwZSBvZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBhc3NpZ25lZCB2YWx1ZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIEZ1bmN0aW9uIG9iamVjdHMgYWxzbyBzdXBwb3J0IGdldHRpbmcgYW5kIHNldHRpbmcgYXJiaXRyYXJ5XG4nCisgICAgICAgICAgJyAgICAgIGF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gYXR0YWNoICcKKyAgICAgICAgICAnbWV0YWRhdGFcbicKKyAgICAgICAgICAnICAgICAgdG8gZnVuY3Rpb25zLiAgUmVndWxhciBhdHRyaWJ1dGUgZG90LW5vdGF0aW9uIGlzIHVzZWQgdG8gZ2V0ICcKKyAgICAgICAgICAnYW5kXG4nCisgICAgICAgICAgJyAgICAgIHNldCBzdWNoIGF0dHJpYnV0ZXMuICpOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gJworICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgJyAgICAgIHN1cHBvcnRzIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gJworICAgICAgICAgICdGdW5jdGlvblxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGVzIG9uIGJ1aWx0LWluIGZ1bmN0aW9ucyBtYXkgYmUgc3VwcG9ydGVkIGluIHRoZVxuJworICAgICAgICAgICcgICAgICBmdXR1cmUuKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiICAgICAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbiBjYW4gYmVcbiIKKyAgICAgICAgICAnICAgICAgcmV0cmlldmVkIGZyb20gaXRzIGNvZGUgb2JqZWN0OyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mICcKKyAgICAgICAgICAnaW50ZXJuYWxcbicKKyAgICAgICAgICAnICAgICAgdHlwZXMgYmVsb3cuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBJbnN0YW5jZSBtZXRob2RzXG4nCisgICAgICAgICAgJyAgICAgIEFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgY29tYmluZXMgYSBjbGFzcywgYSBjbGFzcyBpbnN0YW5jZSAnCisgICAgICAgICAgJ2FuZFxuJworICAgICAgICAgICcgICAgICBhbnkgY2FsbGFibGUgb2JqZWN0IChub3JtYWxseSBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbikuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAiX19zZWxmX18iIGlzIHRoZSBjbGFzcyAnCisgICAgICAgICAgJ2luc3RhbmNlXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCwgIl9fZnVuY19fIiBpcyB0aGUgZnVuY3Rpb24gb2JqZWN0OyAiX19kb2NfXyIgaXMgdGhlXG4nCisgICAgICAgICAgJyAgICAgIG1ldGhvZFwncyBkb2N1bWVudGF0aW9uIChzYW1lIGFzICJfX2Z1bmNfXy5fX2RvY19fIik7ICcKKyAgICAgICAgICAnIl9fbmFtZV9fIlxuJworICAgICAgICAgICcgICAgICBpcyB0aGUgbWV0aG9kIG5hbWUgKHNhbWUgYXMgIl9fZnVuY19fLl9fbmFtZV9fIik7ICcKKyAgICAgICAgICAnIl9fbW9kdWxlX18iXG4nCisgICAgICAgICAgJyAgICAgIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIG1ldGhvZCB3YXMgZGVmaW5lZCBpbiwgb3IgJworICAgICAgICAgICciTm9uZSJcbicKKyAgICAgICAgICAnICAgICAgaWYgdW5hdmFpbGFibGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBNZXRob2RzIGFsc28gc3VwcG9ydCBhY2Nlc3NpbmcgKGJ1dCBub3Qgc2V0dGluZykgdGhlICcKKyAgICAgICAgICAnYXJiaXRyYXJ5XG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhblxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGUgb2YgYSBjbGFzcyAocGVyaGFwcyB2aWEgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyksICcKKyAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAnICAgICAgdGhhdCBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yIGEgY2xhc3NcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kIG9iamVjdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFdoZW4gYW4gaW5zdGFuY2UgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYSAnCisgICAgICAgICAgJ3VzZXItXG4nCisgICAgICAgICAgJyAgICAgIGRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcyB2aWEgb25lIG9mIGl0cyAnCisgICAgICAgICAgJ2luc3RhbmNlcyxcbicKKyAgICAgICAgICAnICAgICAgaXRzICJfX3NlbGZfXyIgYXR0cmlidXRlIGlzIHRoZSBpbnN0YW5jZSwgYW5kIHRoZSBtZXRob2QgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgICAgaXMgc2FpZCB0byBiZSBib3VuZC4gIFRoZSBuZXcgbWV0aG9kXCdzICJfX2Z1bmNfXyIgYXR0cmlidXRlICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9iamVjdC5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmdcbicKKyAgICAgICAgICAnICAgICAgYW5vdGhlciBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgdGhlIGJlaGF2aW91ciAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBzYW1lIGFzIGZvciBhIGZ1bmN0aW9uIG9iamVjdCwgZXhjZXB0IHRoYXQgdGhlICcKKyAgICAgICAgICAnIl9fZnVuY19fIlxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGUgb2YgdGhlIG5ldyBpbnN0YW5jZSBpcyBub3QgdGhlIG9yaWdpbmFsIG1ldGhvZCAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICBidXQgaXRzICJfX2Z1bmNfXyIgYXR0cmlidXRlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhICcKKyAgICAgICAgICAnY2xhc3NcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIGl0cyAiX19zZWxmX18iICcKKyAgICAgICAgICAnYXR0cmlidXRlXG4nCisgICAgICAgICAgJyAgICAgIGlzIHRoZSBjbGFzcyBpdHNlbGYsIGFuZCBpdHMgIl9fZnVuY19fIiBhdHRyaWJ1dGUgaXMgdGhlXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIG9iamVjdCB1bmRlcmx5aW5nIHRoZSBjbGFzcyBtZXRob2QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBXaGVuIGFuIGluc3RhbmNlIG1ldGhvZCBvYmplY3QgaXMgY2FsbGVkLCB0aGUgdW5kZXJseWluZ1xuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbiAoIl9fZnVuY19fIikgaXMgY2FsbGVkLCBpbnNlcnRpbmcgdGhlIGNsYXNzICcKKyAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAnICAgICAgKCJfX3NlbGZfXyIpIGluIGZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yIGluc3RhbmNlLCAnCisgICAgICAgICAgJ3doZW5cbicKKyAgICAgICAgICAnICAgICAgIkMiIGlzIGEgY2xhc3Mgd2hpY2ggY29udGFpbnMgYSBkZWZpbml0aW9uIGZvciBhIGZ1bmN0aW9uICcKKyAgICAgICAgICAnImYoKSIsXG4nCisgICAgICAgICAgJyAgICAgIGFuZCAieCIgaXMgYW4gaW5zdGFuY2Ugb2YgIkMiLCBjYWxsaW5nICJ4LmYoMSkiIGlzIGVxdWl2YWxlbnQgJworICAgICAgICAgICd0b1xuJworICAgICAgICAgICcgICAgICBjYWxsaW5nICJDLmYoeCwgMSkiLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgV2hlbiBhbiBpbnN0YW5jZSBtZXRob2Qgb2JqZWN0IGlzIGRlcml2ZWQgZnJvbSBhIGNsYXNzICcKKyAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCwgdGhlICJjbGFzcyBpbnN0YW5jZSIgc3RvcmVkIGluICJfX3NlbGZfXyIgd2lsbCAnCisgICAgICAgICAgJ2FjdHVhbGx5XG4nCisgICAgICAgICAgJyAgICAgIGJlIHRoZSBjbGFzcyBpdHNlbGYsIHNvIHRoYXQgY2FsbGluZyBlaXRoZXIgInguZigxKSIgb3IgJworICAgICAgICAgICciQy5mKDEpIlxuJworICAgICAgICAgICcgICAgICBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgImYoQywxKSIgd2hlcmUgImYiIGlzIHRoZSAnCisgICAgICAgICAgJ3VuZGVybHlpbmdcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBOb3RlIHRoYXQgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gZnVuY3Rpb24gb2JqZWN0IHRvICcKKyAgICAgICAgICAnaW5zdGFuY2VcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kIG9iamVjdCBoYXBwZW5zIGVhY2ggdGltZSB0aGUgYXR0cmlidXRlIGlzIHJldHJpZXZlZCAnCisgICAgICAgICAgJ2Zyb21cbicKKyAgICAgICAgICAnICAgICAgdGhlIGluc3RhbmNlLiAgSW4gc29tZSBjYXNlcywgYSBmcnVpdGZ1bCBvcHRpbWl6YXRpb24gaXMgdG9cbicKKyAgICAgICAgICAnICAgICAgYXNzaWduIHRoZSBhdHRyaWJ1dGUgdG8gYSBsb2NhbCB2YXJpYWJsZSBhbmQgY2FsbCB0aGF0IGxvY2FsXG4nCisgICAgICAgICAgJyAgICAgIHZhcmlhYmxlLiBBbHNvIG5vdGljZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb24gb25seSBoYXBwZW5zICcKKyAgICAgICAgICAnZm9yXG4nCisgICAgICAgICAgJyAgICAgIHVzZXItZGVmaW5lZCBmdW5jdGlvbnM7IG90aGVyIGNhbGxhYmxlIG9iamVjdHMgKGFuZCBhbGwgbm9uLVxuJworICAgICAgICAgICcgICAgICBjYWxsYWJsZSBvYmplY3RzKSBhcmUgcmV0cmlldmVkIHdpdGhvdXQgdHJhbnNmb3JtYXRpb24uICBJdCAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgICAgIGFsc28gaW1wb3J0YW50IHRvIG5vdGUgdGhhdCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIHdoaWNoIGFyZVxuJworICAgICAgICAgICcgICAgICBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgaW5zdGFuY2UgYXJlIG5vdCBjb252ZXJ0ZWQgdG8gYm91bmRcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kczsgdGhpcyAqb25seSogaGFwcGVucyB3aGVuIHRoZSBmdW5jdGlvbiBpcyBhbiAnCisgICAgICAgICAgJ2F0dHJpYnV0ZVxuJworICAgICAgICAgICcgICAgICBvZiB0aGUgY2xhc3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBHZW5lcmF0b3IgZnVuY3Rpb25zXG4nCisgICAgICAgICAgJyAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIHVzZXMgdGhlICJ5aWVsZCIgc3RhdGVtZW50IChzZWVcbicKKyAgICAgICAgICAnICAgICAgc2VjdGlvbiBUaGUgeWllbGQgc3RhdGVtZW50KSBpcyBjYWxsZWQgYSAqZ2VuZXJhdG9yICcKKyAgICAgICAgICAnZnVuY3Rpb24qLlxuJworICAgICAgICAgICcgICAgICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCBhbHdheXMgcmV0dXJucyBhbiBpdGVyYXRvciAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbjogICcKKyAgICAgICAgICAnY2FsbGluZ1xuJworICAgICAgICAgICcgICAgICB0aGUgaXRlcmF0b3JcJ3MgIml0ZXJhdG9yLl9fbmV4dF9fKCkiIG1ldGhvZCB3aWxsIGNhdXNlIHRoZVxuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbiB0byBleGVjdXRlIHVudGlsIGl0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlICcKKyAgICAgICAgICAnInlpZWxkIlxuJworICAgICAgICAgICcgICAgICBzdGF0ZW1lbnQuICBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcyBhICJyZXR1cm4iIHN0YXRlbWVudCAnCisgICAgICAgICAgJ29yXG4nCisgICAgICAgICAgJyAgICAgIGZhbGxzIG9mZiB0aGUgZW5kLCBhICJTdG9wSXRlcmF0aW9uIiBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBpdGVyYXRvciB3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgdmFsdWVzIHRvICcKKyAgICAgICAgICAnYmVcbicKKyAgICAgICAgICAnICAgICAgcmV0dXJuZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBDb3JvdXRpbmUgZnVuY3Rpb25zXG4nCisgICAgICAgICAgJyAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIGlzIGRlZmluZWQgdXNpbmcgImFzeW5jIGRlZiIgaXNcbicKKyAgICAgICAgICAnICAgICAgY2FsbGVkIGEgKmNvcm91dGluZSBmdW5jdGlvbiouICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gJworICAgICAgICAgICdjYWxsZWQsXG4nCisgICAgICAgICAgJyAgICAgIHJldHVybnMgYSAqY29yb3V0aW5lKiBvYmplY3QuICBJdCBtYXkgY29udGFpbiAiYXdhaXQiXG4nCisgICAgICAgICAgJyAgICAgIGV4cHJlc3Npb25zLCBhcyB3ZWxsIGFzICJhc3luYyB3aXRoIiBhbmQgImFzeW5jIGZvciIgJworICAgICAgICAgICdzdGF0ZW1lbnRzLlxuJworICAgICAgICAgICcgICAgICBTZWUgYWxzbyB0aGUgQ29yb3V0aW5lIE9iamVjdHMgc2VjdGlvbi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEJ1aWx0LWluIGZ1bmN0aW9uc1xuJworICAgICAgICAgICcgICAgICBBIGJ1aWx0LWluIGZ1bmN0aW9uIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGEgQyBmdW5jdGlvbi5cbicKKyAgICAgICAgICAnICAgICAgRXhhbXBsZXMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFyZSAibGVuKCkiIGFuZCAibWF0aC5zaW4oKSJcbicKKyAgICAgICAgICAnICAgICAgKCJtYXRoIiBpcyBhIHN0YW5kYXJkIGJ1aWx0LWluIG1vZHVsZSkuIFRoZSBudW1iZXIgYW5kIHR5cGUgJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICcgICAgICB0aGUgYXJndW1lbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLiBTcGVjaWFsICcKKyAgICAgICAgICAncmVhZC1cbicKKyAgICAgICAgICAnICAgICAgb25seSBhdHRyaWJ1dGVzOiAiX19kb2NfXyIgaXMgdGhlIGZ1bmN0aW9uXCdzIGRvY3VtZW50YXRpb25cbicKKyAgICAgICAgICAnICAgICAgc3RyaW5nLCBvciAiTm9uZSIgaWYgdW5hdmFpbGFibGU7ICJfX25hbWVfXyIgaXMgdGhlICcKKyAgICAgICAgICAiZnVuY3Rpb24nc1xuIgorICAgICAgICAgICcgICAgICBuYW1lOyAiX19zZWxmX18iIGlzIHNldCB0byAiTm9uZSIgKGJ1dCBzZWUgdGhlIG5leHQgaXRlbSk7XG4nCisgICAgICAgICAgJyAgICAgICJfX21vZHVsZV9fIiBpcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRoZSBmdW5jdGlvbiB3YXMgJworICAgICAgICAgICdkZWZpbmVkXG4nCisgICAgICAgICAgJyAgICAgIGluIG9yICJOb25lIiBpZiB1bmF2YWlsYWJsZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIEJ1aWx0LWluIG1ldGhvZHNcbicKKyAgICAgICAgICAnICAgICAgVGhpcyBpcyByZWFsbHkgYSBkaWZmZXJlbnQgZGlzZ3Vpc2Ugb2YgYSBidWlsdC1pbiBmdW5jdGlvbiwgJworICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgJyAgICAgIHRpbWUgY29udGFpbmluZyBhbiBvYmplY3QgcGFzc2VkIHRvIHRoZSBDIGZ1bmN0aW9uIGFzIGFuXG4nCisgICAgICAgICAgJyAgICAgIGltcGxpY2l0IGV4dHJhIGFyZ3VtZW50LiAgQW4gZXhhbXBsZSBvZiBhIGJ1aWx0LWluIG1ldGhvZCBpc1xuJworICAgICAgICAgICcgICAgICAiYWxpc3QuYXBwZW5kKCkiLCBhc3N1bWluZyAqYWxpc3QqIGlzIGEgbGlzdCBvYmplY3QuIEluIHRoaXNcbicKKyAgICAgICAgICAnICAgICAgY2FzZSwgdGhlIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZSAiX19zZWxmX18iIGlzIHNldCB0byAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBvYmplY3QgZGVub3RlZCBieSAqYWxpc3QqLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQ2xhc3Nlc1xuJworICAgICAgICAgICcgICAgICBDbGFzc2VzIGFyZSBjYWxsYWJsZS4gIFRoZXNlIG9iamVjdHMgbm9ybWFsbHkgYWN0IGFzICcKKyAgICAgICAgICAnZmFjdG9yaWVzXG4nCisgICAgICAgICAgJyAgICAgIGZvciBuZXcgaW5zdGFuY2VzIG9mIHRoZW1zZWx2ZXMsIGJ1dCB2YXJpYXRpb25zIGFyZSBwb3NzaWJsZSAnCisgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICcgICAgICBjbGFzcyB0eXBlcyB0aGF0IG92ZXJyaWRlICJfX25ld19fKCkiLiAgVGhlIGFyZ3VtZW50cyBvZiB0aGVcbicKKyAgICAgICAgICAnICAgICAgY2FsbCBhcmUgcGFzc2VkIHRvICJfX25ld19fKCkiIGFuZCwgaW4gdGhlIHR5cGljYWwgY2FzZSwgdG9cbicKKyAgICAgICAgICAnICAgICAgIl9faW5pdF9fKCkiIHRvIGluaXRpYWxpemUgdGhlIG5ldyBpbnN0YW5jZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIENsYXNzIEluc3RhbmNlc1xuJworICAgICAgICAgICcgICAgICBJbnN0YW5jZXMgb2YgYXJiaXRyYXJ5IGNsYXNzZXMgY2FuIGJlIG1hZGUgY2FsbGFibGUgYnkgJworICAgICAgICAgICdkZWZpbmluZ1xuJworICAgICAgICAgICcgICAgICBhICJfX2NhbGxfXygpIiBtZXRob2QgaW4gdGhlaXIgY2xhc3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdNb2R1bGVzXG4nCisgICAgICAgICAgJyAgIE1vZHVsZXMgYXJlIGEgYmFzaWMgb3JnYW5pemF0aW9uYWwgdW5pdCBvZiBQeXRob24gY29kZSwgYW5kIGFyZVxuJworICAgICAgICAgICcgICBjcmVhdGVkIGJ5IHRoZSBpbXBvcnQgc3lzdGVtIGFzIGludm9rZWQgZWl0aGVyIGJ5IHRoZSAiaW1wb3J0IlxuJworICAgICAgICAgICcgICBzdGF0ZW1lbnQgKHNlZSAiaW1wb3J0IiksIG9yIGJ5IGNhbGxpbmcgZnVuY3Rpb25zIHN1Y2ggYXNcbicKKyAgICAgICAgICAnICAgImltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCkiIGFuZCBidWlsdC1pbiAiX19pbXBvcnRfXygpIi4gIEEgJworICAgICAgICAgICdtb2R1bGVcbicKKyAgICAgICAgICAnICAgb2JqZWN0IGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0ICh0aGlzICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgdGhlIGRpY3Rpb25hcnkgcmVmZXJlbmNlZCBieSB0aGUgIl9fZ2xvYmFsc19fIiBhdHRyaWJ1dGUgb2ZcbicKKyAgICAgICAgICAnICAgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSkuICBBdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmVcbicKKyAgICAgICAgICAnICAgdHJhbnNsYXRlZCB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgIm0ueCIgaXMgJworICAgICAgICAgICdlcXVpdmFsZW50XG4nCisgICAgICAgICAgJyAgIHRvICJtLl9fZGljdF9fWyJ4Il0iLiBBIG1vZHVsZSBvYmplY3QgZG9lcyBub3QgY29udGFpbiB0aGUgY29kZVxuJworICAgICAgICAgICIgICBvYmplY3QgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGUgKHNpbmNlIGl0IGlzbid0IG5lZWRlZCAiCisgICAgICAgICAgJ29uY2VcbicKKyAgICAgICAgICAnICAgdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAiICAgQXR0cmlidXRlIGFzc2lnbm1lbnQgdXBkYXRlcyB0aGUgbW9kdWxlJ3MgbmFtZXNwYWNlIGRpY3Rpb25hcnksXG4iCisgICAgICAgICAgJyAgIGUuZy4sICJtLnggPSAxIiBpcyBlcXVpdmFsZW50IHRvICJtLl9fZGljdF9fWyJ4Il0gPSAxIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZTogIl9fZGljdF9fIiBpcyB0aGUgbW9kdWxlXCdzICcKKyAgICAgICAgICAnbmFtZXNwYWNlXG4nCisgICAgICAgICAgJyAgIGFzIGEgZGljdGlvbmFyeSBvYmplY3QuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEJlY2F1c2Ugb2YgdGhlIHdheSBDUHl0aG9uXG4nCisgICAgICAgICAgJyAgIGNsZWFycyBtb2R1bGUgZGljdGlvbmFyaWVzLCB0aGUgbW9kdWxlIGRpY3Rpb25hcnkgd2lsbCBiZSAnCisgICAgICAgICAgJ2NsZWFyZWRcbicKKyAgICAgICAgICAnICAgd2hlbiB0aGUgbW9kdWxlIGZhbGxzIG91dCBvZiBzY29wZSBldmVuIGlmIHRoZSBkaWN0aW9uYXJ5IHN0aWxsICcKKyAgICAgICAgICAnaGFzXG4nCisgICAgICAgICAgJyAgIGxpdmUgcmVmZXJlbmNlcy4gIFRvIGF2b2lkIHRoaXMsIGNvcHkgdGhlIGRpY3Rpb25hcnkgb3Iga2VlcCAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBtb2R1bGUgYXJvdW5kIHdoaWxlIHVzaW5nIGl0cyBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6ICJfX25hbWVfXyIgaXMgdGhlIG1vZHVsZVwncyAnCisgICAgICAgICAgJ25hbWU7XG4nCisgICAgICAgICAgJyAgICJfX2RvY19fIiBpcyB0aGUgbW9kdWxlXCdzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciAiTm9uZSIgaWZcbicKKyAgICAgICAgICAnICAgdW5hdmFpbGFibGU7ICJfX2ZpbGVfXyIgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2ggJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgbW9kdWxlIHdhcyBsb2FkZWQsIGlmIGl0IHdhcyBsb2FkZWQgZnJvbSBhIGZpbGUuIFRoZSAiX19maWxlX18iXG4nCisgICAgICAgICAgJyAgIGF0dHJpYnV0ZSBtYXkgYmUgbWlzc2luZyBmb3IgY2VydGFpbiB0eXBlcyBvZiBtb2R1bGVzLCBzdWNoIGFzICcKKyAgICAgICAgICAnQ1xuJworICAgICAgICAgICcgICBtb2R1bGVzIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIGludG8gdGhlIGludGVycHJldGVyOyBmb3JcbicKKyAgICAgICAgICAnICAgZXh0ZW5zaW9uIG1vZHVsZXMgbG9hZGVkIGR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXQgJworICAgICAgICAgICdpc1xuJworICAgICAgICAgICcgICB0aGUgcGF0aG5hbWUgb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGZpbGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdDdXN0b20gY2xhc3Nlc1xuJworICAgICAgICAgICcgICBDdXN0b20gY2xhc3MgdHlwZXMgYXJlIHR5cGljYWxseSBjcmVhdGVkIGJ5IGNsYXNzIGRlZmluaXRpb25zICcKKyAgICAgICAgICAnKHNlZVxuJworICAgICAgICAgICcgICBzZWN0aW9uIENsYXNzIGRlZmluaXRpb25zKS4gIEEgY2xhc3MgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkICcKKyAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAnICAgYSBkaWN0aW9uYXJ5IG9iamVjdC4gQ2xhc3MgYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgJworICAgICAgICAgICd0b1xuJworICAgICAgICAgICcgICBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgIkMueCIgaXMgdHJhbnNsYXRlZCB0b1xuJworICAgICAgICAgICcgICAiQy5fX2RpY3RfX1sieCJdIiAoYWx0aG91Z2ggdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhvb2tzIHdoaWNoICcKKyAgICAgICAgICAnYWxsb3dcbicKKyAgICAgICAgICAnICAgZm9yIG90aGVyIG1lYW5zIG9mIGxvY2F0aW5nIGF0dHJpYnV0ZXMpLiBXaGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGludWVzIGluIHRoZSBiYXNlXG4nCisgICAgICAgICAgJyAgIGNsYXNzZXMuIFRoaXMgc2VhcmNoIG9mIHRoZSBiYXNlIGNsYXNzZXMgdXNlcyB0aGUgQzMgbWV0aG9kXG4nCisgICAgICAgICAgJyAgIHJlc29sdXRpb24gb3JkZXIgd2hpY2ggYmVoYXZlcyBjb3JyZWN0bHkgZXZlbiBpbiB0aGUgcHJlc2VuY2UgJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICIgICAnZGlhbW9uZCcgaW5oZXJpdGFuY2Ugc3RydWN0dXJlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGVcbiIKKyAgICAgICAgICAnICAgaW5oZXJpdGFuY2UgcGF0aHMgbGVhZGluZyBiYWNrIHRvIGEgY29tbW9uIGFuY2VzdG9yLiBBZGRpdGlvbmFsXG4nCisgICAgICAgICAgJyAgIGRldGFpbHMgb24gdGhlIEMzIE1STyB1c2VkIGJ5IFB5dGhvbiBjYW4gYmUgZm91bmQgaW4gdGhlXG4nCisgICAgICAgICAgJyAgIGRvY3VtZW50YXRpb24gYWNjb21wYW55aW5nIHRoZSAyLjMgcmVsZWFzZSBhdFxuJworICAgICAgICAgICcgICBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL3JlbGVhc2VzLzIuMy9tcm8vLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgV2hlbiBhIGNsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2UgKGZvciBjbGFzcyAiQyIsIHNheSkgd291bGQgJworICAgICAgICAgICd5aWVsZCBhXG4nCisgICAgICAgICAgJyAgIGNsYXNzIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gaW5zdGFuY2UgbWV0aG9kXG4nCisgICAgICAgICAgJyAgIG9iamVjdCB3aG9zZSAiX19zZWxmX18iIGF0dHJpYnV0ZXMgaXMgIkMiLiAgV2hlbiBpdCB3b3VsZCB5aWVsZCAnCisgICAgICAgICAgJ2FcbicKKyAgICAgICAgICAnICAgc3RhdGljIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG9iamVjdCB3cmFwcGVkICcKKyAgICAgICAgICAnYnlcbicKKyAgICAgICAgICAnICAgdGhlIHN0YXRpYyBtZXRob2Qgb2JqZWN0LiBTZWUgc2VjdGlvbiBJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMgJworICAgICAgICAgICdmb3JcbicKKyAgICAgICAgICAnICAgYW5vdGhlciB3YXkgaW4gd2hpY2ggYXR0cmlidXRlcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG1heSAnCisgICAgICAgICAgJ2RpZmZlclxuJworICAgICAgICAgICcgICBmcm9tIHRob3NlIGFjdHVhbGx5IGNvbnRhaW5lZCBpbiBpdHMgIl9fZGljdF9fIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgIiAgIENsYXNzIGF0dHJpYnV0ZSBhc3NpZ25tZW50cyB1cGRhdGUgdGhlIGNsYXNzJ3MgZGljdGlvbmFyeSwgIgorICAgICAgICAgICduZXZlclxuJworICAgICAgICAgICcgICB0aGUgZGljdGlvbmFyeSBvZiBhIGJhc2UgY2xhc3MuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBBIGNsYXNzIG9iamVjdCBjYW4gYmUgY2FsbGVkIChzZWUgYWJvdmUpIHRvIHlpZWxkIGEgY2xhc3MgJworICAgICAgICAgICdpbnN0YW5jZVxuJworICAgICAgICAgICcgICAoc2VlIGJlbG93KS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fbmFtZV9fIiBpcyB0aGUgY2xhc3MgbmFtZTsgIl9fbW9kdWxlX18iICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgdGhlIG1vZHVsZSBuYW1lIGluIHdoaWNoIHRoZSBjbGFzcyB3YXMgZGVmaW5lZDsgIl9fZGljdF9fIiBpcyAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzXCdzIG5hbWVzcGFjZTsgIl9fYmFzZXNfXyIgaXMgYSAnCisgICAgICAgICAgJ3R1cGxlXG4nCisgICAgICAgICAgJyAgIChwb3NzaWJseSBlbXB0eSBvciBhIHNpbmdsZXRvbikgY29udGFpbmluZyB0aGUgYmFzZSBjbGFzc2VzLCBpbiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICBvcmRlciBvZiB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3Q7ICJfX2RvY19fIiBpcyAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICIgICBjbGFzcydzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBOb25lIGlmIHVuZGVmaW5lZC5cbiIKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0NsYXNzIGluc3RhbmNlc1xuJworICAgICAgICAgICcgICBBIGNsYXNzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYnkgY2FsbGluZyBhIGNsYXNzIG9iamVjdCAoc2VlICcKKyAgICAgICAgICAnYWJvdmUpLlxuJworICAgICAgICAgICcgICBBIGNsYXNzIGluc3RhbmNlIGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBhcyBhIGRpY3Rpb25hcnkgJworICAgICAgICAgICd3aGljaFxuJworICAgICAgICAgICcgICBpcyB0aGUgZmlyc3QgcGxhY2UgaW4gd2hpY2ggYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHNlYXJjaGVkLlxuJworICAgICAgICAgICIgICBXaGVuIGFuIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQgdGhlcmUsIGFuZCB0aGUgaW5zdGFuY2UncyBjbGFzcyAiCisgICAgICAgICAgJ2hhc1xuJworICAgICAgICAgICcgICBhbiBhdHRyaWJ1dGUgYnkgdGhhdCBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBjbGFzc1xuJworICAgICAgICAgICcgICBhdHRyaWJ1dGVzLiAgSWYgYSBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQgdGhhdCBpcyBhICcKKyAgICAgICAgICAndXNlci1kZWZpbmVkXG4nCisgICAgICAgICAgJyAgIGZ1bmN0aW9uIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiBpbnN0YW5jZSBtZXRob2QgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgd2hvc2UgIl9fc2VsZl9fIiBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLiAgU3RhdGljIG1ldGhvZCBhbmRcbicKKyAgICAgICAgICAnICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlIGFsc28gdHJhbnNmb3JtZWQ7IHNlZSBhYm92ZSB1bmRlclxuJworICAgICAgICAgICcgICAiQ2xhc3NlcyIuICBTZWUgc2VjdGlvbiBJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMgZm9yIGFub3RoZXIgd2F5ICcKKyAgICAgICAgICAnaW5cbicKKyAgICAgICAgICAnICAgd2hpY2ggYXR0cmlidXRlcyBvZiBhIGNsYXNzIHJldHJpZXZlZCB2aWEgaXRzIGluc3RhbmNlcyBtYXkgJworICAgICAgICAgICdkaWZmZXJcbicKKyAgICAgICAgICAnICAgZnJvbSB0aGUgb2JqZWN0cyBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIGNsYXNzXCdzICJfX2RpY3RfXyIuICBJZiAnCisgICAgICAgICAgJ25vXG4nCisgICAgICAgICAgIiAgIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCwgYW5kIHRoZSBvYmplY3QncyBjbGFzcyBoYXMgYVxuIgorICAgICAgICAgICcgICAiX19nZXRhdHRyX18oKSIgbWV0aG9kLCB0aGF0IGlzIGNhbGxlZCB0byBzYXRpc2Z5IHRoZSBsb29rdXAuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICIgICBBdHRyaWJ1dGUgYXNzaWdubWVudHMgYW5kIGRlbGV0aW9ucyB1cGRhdGUgdGhlIGluc3RhbmNlJ3NcbiIKKyAgICAgICAgICAiICAgZGljdGlvbmFyeSwgbmV2ZXIgYSBjbGFzcydzIGRpY3Rpb25hcnkuICBJZiB0aGUgY2xhc3MgaGFzIGFcbiIKKyAgICAgICAgICAnICAgIl9fc2V0YXR0cl9fKCkiIG9yICJfX2RlbGF0dHJfXygpIiBtZXRob2QsIHRoaXMgaXMgY2FsbGVkICcKKyAgICAgICAgICAnaW5zdGVhZFxuJworICAgICAgICAgICcgICBvZiB1cGRhdGluZyB0aGUgaW5zdGFuY2UgZGljdGlvbmFyeSBkaXJlY3RseS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIENsYXNzIGluc3RhbmNlcyBjYW4gcHJldGVuZCB0byBiZSBudW1iZXJzLCBzZXF1ZW5jZXMsIG9yICcKKyAgICAgICAgICAnbWFwcGluZ3NcbicKKyAgICAgICAgICAnICAgaWYgdGhleSBoYXZlIG1ldGhvZHMgd2l0aCBjZXJ0YWluIHNwZWNpYWwgbmFtZXMuICBTZWUgc2VjdGlvblxuJworICAgICAgICAgICcgICBTcGVjaWFsIG1ldGhvZCBuYW1lcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNwZWNpYWwgYXR0cmlidXRlczogIl9fZGljdF9fIiBpcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnk7XG4nCisgICAgICAgICAgJyAgICJfX2NsYXNzX18iIGlzIHRoZSBpbnN0YW5jZVwncyBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0kvTyBvYmplY3RzIChhbHNvIGtub3duIGFzIGZpbGUgb2JqZWN0cylcbicKKyAgICAgICAgICAnICAgQSAqZmlsZSBvYmplY3QqIHJlcHJlc2VudHMgYW4gb3BlbiBmaWxlLiAgVmFyaW91cyBzaG9ydGN1dHMgYXJlXG4nCisgICAgICAgICAgJyAgIGF2YWlsYWJsZSB0byBjcmVhdGUgZmlsZSBvYmplY3RzOiB0aGUgIm9wZW4oKSIgYnVpbHQtaW4gJworICAgICAgICAgICdmdW5jdGlvbixcbicKKyAgICAgICAgICAnICAgYW5kIGFsc28gIm9zLnBvcGVuKCkiLCAib3MuZmRvcGVuKCkiLCBhbmQgdGhlICJtYWtlZmlsZSgpIiAnCisgICAgICAgICAgJ21ldGhvZFxuJworICAgICAgICAgICcgICBvZiBzb2NrZXQgb2JqZWN0cyAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHNcbicKKyAgICAgICAgICAnICAgcHJvdmlkZWQgYnkgZXh0ZW5zaW9uIG1vZHVsZXMpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgVGhlIG9iamVjdHMgInN5cy5zdGRpbiIsICJzeXMuc3Rkb3V0IiBhbmQgInN5cy5zdGRlcnIiIGFyZVxuJworICAgICAgICAgICIgICBpbml0aWFsaXplZCB0byBmaWxlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJwcmV0ZXInc1xuIgorICAgICAgICAgICcgICBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zOyB0aGV5IGFyZSBhbGwgb3BlbiBpbiAnCisgICAgICAgICAgJ3RleHRcbicKKyAgICAgICAgICAnICAgbW9kZSBhbmQgdGhlcmVmb3JlIGZvbGxvdyB0aGUgaW50ZXJmYWNlIGRlZmluZWQgYnkgdGhlXG4nCisgICAgICAgICAgJyAgICJpby5UZXh0SU9CYXNlIiBhYnN0cmFjdCBjbGFzcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0ludGVybmFsIHR5cGVzXG4nCisgICAgICAgICAgJyAgIEEgZmV3IHR5cGVzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgaW50ZXJwcmV0ZXIgYXJlIGV4cG9zZWQgdG8gJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgdXNlci4gVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGVcbicKKyAgICAgICAgICAnICAgaW50ZXJwcmV0ZXIsIGJ1dCB0aGV5IGFyZSBtZW50aW9uZWQgaGVyZSBmb3IgY29tcGxldGVuZXNzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgQ29kZSBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIENvZGUgb2JqZWN0cyByZXByZXNlbnQgKmJ5dGUtY29tcGlsZWQqIGV4ZWN1dGFibGUgUHl0aG9uICcKKyAgICAgICAgICAnY29kZSxcbicKKyAgICAgICAgICAnICAgICAgb3IgKmJ5dGVjb2RlKi4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvZGUgb2JqZWN0IGFuZCBhXG4nCisgICAgICAgICAgJyAgICAgIGZ1bmN0aW9uIG9iamVjdCBpcyB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYW4gJworICAgICAgICAgICdleHBsaWNpdFxuJworICAgICAgICAgICIgICAgICByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uJ3MgZ2xvYmFscyAodGhlIG1vZHVsZSBpbiB3aGljaCBpdCAiCisgICAgICAgICAgJ3dhc1xuJworICAgICAgICAgICcgICAgICBkZWZpbmVkKSwgd2hpbGUgYSBjb2RlIG9iamVjdCBjb250YWlucyBubyBjb250ZXh0OyBhbHNvIHRoZVxuJworICAgICAgICAgICcgICAgICBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBmdW5jdGlvbiBvYmplY3QsICcKKyAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgJyAgICAgIGluIHRoZSBjb2RlIG9iamVjdCAoYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB2YWx1ZXMgY2FsY3VsYXRlZCAnCisgICAgICAgICAgJ2F0XG4nCisgICAgICAgICAgJyAgICAgIHJ1bi10aW1lKS4gIFVubGlrZSBmdW5jdGlvbiBvYmplY3RzLCBjb2RlIG9iamVjdHMgYXJlICcKKyAgICAgICAgICAnaW1tdXRhYmxlXG4nCisgICAgICAgICAgJyAgICAgIGFuZCBjb250YWluIG5vIHJlZmVyZW5jZXMgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHRvICcKKyAgICAgICAgICAnbXV0YWJsZVxuJworICAgICAgICAgICcgICAgICBvYmplY3RzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogImNvX25hbWUiIGdpdmVzIHRoZSBmdW5jdGlvbiAnCisgICAgICAgICAgJ25hbWU7XG4nCisgICAgICAgICAgJyAgICAgICJjb19hcmdjb3VudCIgaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50cyAnCisgICAgICAgICAgJyhpbmNsdWRpbmdcbicKKyAgICAgICAgICAnICAgICAgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMpOyAiY29fbmxvY2FscyIgaXMgdGhlIG51bWJlciAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIGxvY2FsIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiAoaW5jbHVkaW5nIGFyZ3VtZW50cyk7XG4nCisgICAgICAgICAgJyAgICAgICJjb192YXJuYW1lcyIgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgbG9jYWxcbicKKyAgICAgICAgICAnICAgICAgdmFyaWFibGVzIChzdGFydGluZyB3aXRoIHRoZSBhcmd1bWVudCBuYW1lcyk7ICJjb19jZWxsdmFycyIgJworICAgICAgICAgICdpcyBhXG4nCisgICAgICAgICAgJyAgICAgIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcyB0aGF0IGFyZVxuJworICAgICAgICAgICcgICAgICByZWZlcmVuY2VkIGJ5IG5lc3RlZCBmdW5jdGlvbnM7ICJjb19mcmVldmFycyIgaXMgYSB0dXBsZVxuJworICAgICAgICAgICcgICAgICBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBmcmVlIHZhcmlhYmxlczsgImNvX2NvZGUiIGlzIGEgJworICAgICAgICAgICdzdHJpbmdcbicKKyAgICAgICAgICAnICAgICAgcmVwcmVzZW50aW5nIHRoZSBzZXF1ZW5jZSBvZiBieXRlY29kZSBpbnN0cnVjdGlvbnM7ICcKKyAgICAgICAgICAnImNvX2NvbnN0cyJcbicKKyAgICAgICAgICAnICAgICAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBsaXRlcmFscyB1c2VkIGJ5IHRoZSBieXRlY29kZTtcbicKKyAgICAgICAgICAnICAgICAgImNvX25hbWVzIiBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIHVzZWQgYnkgdGhlICcKKyAgICAgICAgICAnYnl0ZWNvZGU7XG4nCisgICAgICAgICAgJyAgICAgICJjb19maWxlbmFtZSIgaXMgdGhlIGZpbGVuYW1lIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzICcKKyAgICAgICAgICAnY29tcGlsZWQ7XG4nCisgICAgICAgICAgJyAgICAgICJjb19maXJzdGxpbmVubyIgaXMgdGhlIGZpcnN0IGxpbmUgbnVtYmVyIG9mIHRoZSBmdW5jdGlvbjtcbicKKyAgICAgICAgICAnICAgICAgImNvX2xub3RhYiIgaXMgYSBzdHJpbmcgZW5jb2RpbmcgdGhlIG1hcHBpbmcgZnJvbSBieXRlY29kZVxuJworICAgICAgICAgICcgICAgICBvZmZzZXRzIHRvIGxpbmUgbnVtYmVycyAoZm9yIGRldGFpbHMgc2VlIHRoZSBzb3VyY2UgY29kZSBvZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBpbnRlcnByZXRlcik7ICJjb19zdGFja3NpemUiIGlzIHRoZSByZXF1aXJlZCBzdGFjayBzaXplXG4nCisgICAgICAgICAgJyAgICAgIChpbmNsdWRpbmcgbG9jYWwgdmFyaWFibGVzKTsgImNvX2ZsYWdzIiBpcyBhbiBpbnRlZ2VyICcKKyAgICAgICAgICAnZW5jb2RpbmcgYVxuJworICAgICAgICAgICcgICAgICBudW1iZXIgb2YgZmxhZ3MgZm9yIHRoZSBpbnRlcnByZXRlci5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFRoZSBmb2xsb3dpbmcgZmxhZyBiaXRzIGFyZSBkZWZpbmVkIGZvciAiY29fZmxhZ3MiOiBiaXQgJworICAgICAgICAgICciMHgwNCJcbicKKyAgICAgICAgICAnICAgICAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSAiKmFyZ3VtZW50cyIgc3ludGF4IHRvIGFjY2VwdCAnCisgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgJyAgICAgIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdCAiMHgwOCIgaXMgc2V0ICcKKyAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAnICAgICAgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlICIqKmtleXdvcmRzIiBzeW50YXggdG8gYWNjZXB0ICcKKyAgICAgICAgICAnYXJiaXRyYXJ5XG4nCisgICAgICAgICAgJyAgICAgIGtleXdvcmQgYXJndW1lbnRzOyBiaXQgIjB4MjAiIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gaXMgYVxuJworICAgICAgICAgICcgICAgICBnZW5lcmF0b3IuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBGdXR1cmUgZmVhdHVyZSBkZWNsYXJhdGlvbnMgKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0ICcKKyAgICAgICAgICAnZGl2aXNpb24iKVxuJworICAgICAgICAgICcgICAgICBhbHNvIHVzZSBiaXRzIGluICJjb19mbGFncyIgdG8gaW5kaWNhdGUgd2hldGhlciBhIGNvZGUgJworICAgICAgICAgICdvYmplY3RcbicKKyAgICAgICAgICAnICAgICAgd2FzIGNvbXBpbGVkIHdpdGggYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZW5hYmxlZDogYml0ICIweDIwMDAiICcKKyAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAnICAgICAgc2V0IGlmIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQgd2l0aCBmdXR1cmUgZGl2aXNpb24gJworICAgICAgICAgICdlbmFibGVkO1xuJworICAgICAgICAgICcgICAgICBiaXRzICIweDEwIiBhbmQgIjB4MTAwMCIgd2VyZSB1c2VkIGluIGVhcmxpZXIgdmVyc2lvbnMgb2ZcbicKKyAgICAgICAgICAnICAgICAgUHl0aG9uLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgT3RoZXIgYml0cyBpbiAiY29fZmxhZ3MiIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgSWYgYSBjb2RlIG9iamVjdCByZXByZXNlbnRzIGEgZnVuY3Rpb24sIHRoZSBmaXJzdCBpdGVtIGluXG4nCisgICAgICAgICAgJyAgICAgICJjb19jb25zdHMiIGlzIHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBvZiB0aGUgZnVuY3Rpb24sIG9yXG4nCisgICAgICAgICAgJyAgICAgICJOb25lIiBpZiB1bmRlZmluZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBGcmFtZSBvYmplY3RzXG4nCisgICAgICAgICAgJyAgICAgIEZyYW1lIG9iamVjdHMgcmVwcmVzZW50IGV4ZWN1dGlvbiBmcmFtZXMuICBUaGV5IG1heSBvY2N1ciBpblxuJworICAgICAgICAgICcgICAgICB0cmFjZWJhY2sgb2JqZWN0cyAoc2VlIGJlbG93KS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJmX2JhY2siIGlzIHRvIHRoZSBwcmV2aW91cyAnCisgICAgICAgICAgJ3N0YWNrXG4nCisgICAgICAgICAgJyAgICAgIGZyYW1lICh0b3dhcmRzIHRoZSBjYWxsZXIpLCBvciAiTm9uZSIgaWYgdGhpcyBpcyB0aGUgYm90dG9tXG4nCisgICAgICAgICAgJyAgICAgIHN0YWNrIGZyYW1lOyAiZl9jb2RlIiBpcyB0aGUgY29kZSBvYmplY3QgYmVpbmcgZXhlY3V0ZWQgaW4gJworICAgICAgICAgICd0aGlzXG4nCisgICAgICAgICAgJyAgICAgIGZyYW1lOyAiZl9sb2NhbHMiIGlzIHRoZSBkaWN0aW9uYXJ5IHVzZWQgdG8gbG9vayB1cCBsb2NhbFxuJworICAgICAgICAgICcgICAgICB2YXJpYWJsZXM7ICJmX2dsb2JhbHMiIGlzIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXM7XG4nCisgICAgICAgICAgJyAgICAgICJmX2J1aWx0aW5zIiBpcyB1c2VkIGZvciBidWlsdC1pbiAoaW50cmluc2ljKSBuYW1lczsgJworICAgICAgICAgICciZl9sYXN0aSJcbicKKyAgICAgICAgICAnICAgICAgZ2l2ZXMgdGhlIHByZWNpc2UgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgYW4gaW5kZXggaW50byB0aGVcbicKKyAgICAgICAgICAnICAgICAgYnl0ZWNvZGUgc3RyaW5nIG9mIHRoZSBjb2RlIG9iamVjdCkuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXM6ICJmX3RyYWNlIiwgaWYgbm90ICJOb25lIiwgaXMgYVxuJworICAgICAgICAgICcgICAgICBmdW5jdGlvbiBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGNvZGUgbGluZSAodGhpcyAnCisgICAgICAgICAgJ2lzXG4nCisgICAgICAgICAgJyAgICAgIHVzZWQgYnkgdGhlIGRlYnVnZ2VyKTsgImZfbGluZW5vIiBpcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBmcmFtZSAtLS0gd3JpdGluZyB0byB0aGlzIGZyb20gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24gJworICAgICAgICAgICdqdW1wc1xuJworICAgICAgICAgICcgICAgICB0byB0aGUgZ2l2ZW4gbGluZSAob25seSBmb3IgdGhlIGJvdHRvbS1tb3N0IGZyYW1lKS4gIEEgJworICAgICAgICAgICdkZWJ1Z2dlclxuJworICAgICAgICAgICcgICAgICBjYW4gaW1wbGVtZW50IGEgSnVtcCBjb21tYW5kIChha2EgU2V0IE5leHQgU3RhdGVtZW50KSBieSAnCisgICAgICAgICAgJ3dyaXRpbmdcbicKKyAgICAgICAgICAnICAgICAgdG8gZl9saW5lbm8uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBGcmFtZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIGZyYW1lLmNsZWFyKClcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgICAgIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgcmVmZXJlbmNlcyB0byBsb2NhbCB2YXJpYWJsZXMgaGVsZCAnCisgICAgICAgICAgJ2J5XG4nCisgICAgICAgICAgJyAgICAgICAgIHRoZSBmcmFtZS4gIEFsc28sIGlmIHRoZSBmcmFtZSBiZWxvbmdlZCB0byBhIGdlbmVyYXRvciwgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgICAgZ2VuZXJhdG9yIGlzIGZpbmFsaXplZC4gIFRoaXMgaGVscHMgYnJlYWsgcmVmZXJlbmNlICcKKyAgICAgICAgICAnY3ljbGVzXG4nCisgICAgICAgICAgJyAgICAgICAgIGludm9sdmluZyBmcmFtZSBvYmplY3RzIChmb3IgZXhhbXBsZSB3aGVuIGNhdGNoaW5nIGFuXG4nCisgICAgICAgICAgJyAgICAgICAgIGV4Y2VwdGlvbiBhbmQgc3RvcmluZyBpdHMgdHJhY2ViYWNrIGZvciBsYXRlciB1c2UpLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgICAgIlJ1bnRpbWVFcnJvciIgaXMgcmFpc2VkIGlmIHRoZSBmcmFtZSBpcyBjdXJyZW50bHkgJworICAgICAgICAgICdleGVjdXRpbmcuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICAgICBOZXcgaW4gdmVyc2lvbiAzLjQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBUcmFjZWJhY2sgb2JqZWN0c1xuJworICAgICAgICAgICcgICAgICBUcmFjZWJhY2sgb2JqZWN0cyByZXByZXNlbnQgYSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uICAnCisgICAgICAgICAgJ0FcbicKKyAgICAgICAgICAnICAgICAgdHJhY2ViYWNrIG9iamVjdCBpcyBjcmVhdGVkIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3Vycy4gIFdoZW4gJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnICAgICAgc2VhcmNoIGZvciBhbiBleGNlcHRpb24gaGFuZGxlciB1bndpbmRzIHRoZSBleGVjdXRpb24gc3RhY2ssICcKKyAgICAgICAgICAnYXRcbicKKyAgICAgICAgICAnICAgICAgZWFjaCB1bndvdW5kIGxldmVsIGEgdHJhY2ViYWNrIG9iamVjdCBpcyBpbnNlcnRlZCBpbiBmcm9udCAnCisgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgJyAgICAgIHRoZSBjdXJyZW50IHRyYWNlYmFjay4gIFdoZW4gYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgJworICAgICAgICAgICdlbnRlcmVkLFxuJworICAgICAgICAgICcgICAgICB0aGUgc3RhY2sgdHJhY2UgaXMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0uIChTZWUgJworICAgICAgICAgICdzZWN0aW9uXG4nCisgICAgICAgICAgJyAgICAgIFRoZSB0cnkgc3RhdGVtZW50LikgSXQgaXMgYWNjZXNzaWJsZSBhcyB0aGUgdGhpcmQgaXRlbSBvZiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICB0dXBsZSByZXR1cm5lZCBieSAic3lzLmV4Y19pbmZvKCkiLiBXaGVuIHRoZSBwcm9ncmFtIGNvbnRhaW5zICcKKyAgICAgICAgICAnbm9cbicKKyAgICAgICAgICAnICAgICAgc3VpdGFibGUgaGFuZGxlciwgdGhlIHN0YWNrIHRyYWNlIGlzIHdyaXR0ZW4gKG5pY2VseSAnCisgICAgICAgICAgJ2Zvcm1hdHRlZClcbicKKyAgICAgICAgICAnICAgICAgdG8gdGhlIHN0YW5kYXJkIGVycm9yIHN0cmVhbTsgaWYgdGhlIGludGVycHJldGVyIGlzICcKKyAgICAgICAgICAnaW50ZXJhY3RpdmUsXG4nCisgICAgICAgICAgJyAgICAgIGl0IGlzIGFsc28gbWFkZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgYXMgJworICAgICAgICAgICcic3lzLmxhc3RfdHJhY2ViYWNrIi5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6ICJ0Yl9uZXh0IiBpcyB0aGUgbmV4dCBsZXZlbCBpbiAnCisgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICcgICAgICBzdGFjayB0cmFjZSAodG93YXJkcyB0aGUgZnJhbWUgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCksICcKKyAgICAgICAgICAnb3JcbicKKyAgICAgICAgICAnICAgICAgIk5vbmUiIGlmIHRoZXJlIGlzIG5vIG5leHQgbGV2ZWw7ICJ0Yl9mcmFtZSIgcG9pbnRzIHRvIHRoZVxuJworICAgICAgICAgICcgICAgICBleGVjdXRpb24gZnJhbWUgb2YgdGhlIGN1cnJlbnQgbGV2ZWw7ICJ0Yl9saW5lbm8iIGdpdmVzIHRoZSAnCisgICAgICAgICAgJ2xpbmVcbicKKyAgICAgICAgICAnICAgICAgbnVtYmVyIHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQ7ICJ0Yl9sYXN0aSIgaW5kaWNhdGVzICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIHByZWNpc2UgaW5zdHJ1Y3Rpb24uICBUaGUgbGluZSBudW1iZXIgYW5kIGxhc3QgaW5zdHJ1Y3Rpb24gJworICAgICAgICAgICdpblxuJworICAgICAgICAgICcgICAgICB0aGUgdHJhY2ViYWNrIG1heSBkaWZmZXIgZnJvbSB0aGUgbGluZSBudW1iZXIgb2YgaXRzIGZyYW1lXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCBpZiB0aGUgZXhjZXB0aW9uIG9jY3VycmVkIGluIGEgInRyeSIgc3RhdGVtZW50IHdpdGggJworICAgICAgICAgICdub1xuJworICAgICAgICAgICcgICAgICBtYXRjaGluZyBleGNlcHQgY2xhdXNlIG9yIHdpdGggYSBmaW5hbGx5IGNsYXVzZS5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFNsaWNlIG9iamVjdHNcbicKKyAgICAgICAgICAnICAgICAgU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIGZvciAnCisgICAgICAgICAgJyJfX2dldGl0ZW1fXygpIlxuJworICAgICAgICAgICcgICAgICBtZXRob2RzLiAgVGhleSBhcmUgYWxzbyBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pbiAic2xpY2UoKSJcbicKKyAgICAgICAgICAnICAgICAgZnVuY3Rpb24uXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiAic3RhcnQiIGlzIHRoZSBsb3dlciBib3VuZDsgJworICAgICAgICAgICcic3RvcCJcbicKKyAgICAgICAgICAnICAgICAgaXMgdGhlIHVwcGVyIGJvdW5kOyAic3RlcCIgaXMgdGhlIHN0ZXAgdmFsdWU7IGVhY2ggaXMgIk5vbmUiICcKKyAgICAgICAgICAnaWZcbicKKyAgICAgICAgICAnICAgICAgb21pdHRlZC4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICAgICBTbGljZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDpcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgICAgIHNsaWNlLmluZGljZXMoc2VsZiwgbGVuZ3RoKVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCAqbGVuZ3RoKiBhbmRcbicKKyAgICAgICAgICAnICAgICAgICAgY29tcHV0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNsaWNlIHRoYXQgdGhlIHNsaWNlICcKKyAgICAgICAgICAnb2JqZWN0XG4nCisgICAgICAgICAgJyAgICAgICAgIHdvdWxkIGRlc2NyaWJlIGlmIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKiAnCisgICAgICAgICAgJ2l0ZW1zLlxuJworICAgICAgICAgICcgICAgICAgICBJdCByZXR1cm5zIGEgdHVwbGUgb2YgdGhyZWUgaW50ZWdlcnM7IHJlc3BlY3RpdmVseSB0aGVzZSAnCisgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICcgICAgICAgICB0aGUgKnN0YXJ0KiBhbmQgKnN0b3AqIGluZGljZXMgYW5kIHRoZSAqc3RlcCogb3Igc3RyaWRlXG4nCisgICAgICAgICAgJyAgICAgICAgIGxlbmd0aCBvZiB0aGUgc2xpY2UuIE1pc3Npbmcgb3Igb3V0LW9mLWJvdW5kcyBpbmRpY2VzIGFyZVxuJworICAgICAgICAgICcgICAgICAgICBoYW5kbGVkIGluIGEgbWFubmVyIGNvbnNpc3RlbnQgd2l0aCByZWd1bGFyIHNsaWNlcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0c1xuJworICAgICAgICAgICcgICAgICBTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlXG4nCisgICAgICAgICAgJyAgICAgIHRyYW5zZm9ybWF0aW9uIG9mIGZ1bmN0aW9uIG9iamVjdHMgdG8gbWV0aG9kIG9iamVjdHMgJworICAgICAgICAgICdkZXNjcmliZWRcbicKKyAgICAgICAgICAnICAgICAgYWJvdmUuIEEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbnkgb3RoZXJcbicKKyAgICAgICAgICAnICAgICAgb2JqZWN0LCB1c3VhbGx5IGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QuIFdoZW4gYSBzdGF0aWNcbicKKyAgICAgICAgICAnICAgICAgbWV0aG9kIG9iamVjdCBpcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG9yIGEgY2xhc3MgaW5zdGFuY2UsICcKKyAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgJyAgICAgIG9iamVjdCBhY3R1YWxseSByZXR1cm5lZCBpcyB0aGUgd3JhcHBlZCBvYmplY3QsIHdoaWNoIGlzIG5vdFxuJworICAgICAgICAgICcgICAgICBzdWJqZWN0IHRvIGFueSBmdXJ0aGVyIHRyYW5zZm9ybWF0aW9uLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgJworICAgICAgICAgICdhcmVcbicKKyAgICAgICAgICAnICAgICAgbm90IHRoZW1zZWx2ZXMgY2FsbGFibGUsIGFsdGhvdWdoIHRoZSBvYmplY3RzIHRoZXkgd3JhcCAnCisgICAgICAgICAgJ3VzdWFsbHlcbicKKyAgICAgICAgICAnICAgICAgYXJlLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4nCisgICAgICAgICAgJyAgICAgICJzdGF0aWNtZXRob2QoKSIgY29uc3RydWN0b3IuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICBDbGFzcyBtZXRob2Qgb2JqZWN0c1xuJworICAgICAgICAgICcgICAgICBBIGNsYXNzIG1ldGhvZCBvYmplY3QsIGxpa2UgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXMgYSAnCisgICAgICAgICAgJ3dyYXBwZXJcbicKKyAgICAgICAgICAnICAgICAgYXJvdW5kIGFub3RoZXIgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSB3YXkgaW4gd2hpY2ggdGhhdCAnCisgICAgICAgICAgJ29iamVjdFxuJworICAgICAgICAgICcgICAgICBpcyByZXRyaWV2ZWQgZnJvbSBjbGFzc2VzIGFuZCBjbGFzcyBpbnN0YW5jZXMuIFRoZSBiZWhhdmlvdXIgJworICAgICAgICAgICdvZlxuJworICAgICAgICAgICcgICAgICBjbGFzcyBtZXRob2Qgb2JqZWN0cyB1cG9uIHN1Y2ggcmV0cmlldmFsIGlzIGRlc2NyaWJlZCBhYm92ZSxcbicKKyAgICAgICAgICAnICAgICAgdW5kZXIgIlVzZXItZGVmaW5lZCBtZXRob2RzIi4gQ2xhc3MgbWV0aG9kIG9iamVjdHMgYXJlICcKKyAgICAgICAgICAnY3JlYXRlZFxuJworICAgICAgICAgICcgICAgICBieSB0aGUgYnVpbHQtaW4gImNsYXNzbWV0aG9kKCkiIGNvbnN0cnVjdG9yLlxuJywKKyAndHlwZXNmdW5jdGlvbnMnOiAnXG4nCisgICAgICAgICAgICAgICAgICAgJ0Z1bmN0aW9uc1xuJworICAgICAgICAgICAgICAgICAgICcqKioqKioqKipcbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ0Z1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgJworICAgICAgICAgICAgICAgICAgICdvbmx5XG4nCisgICAgICAgICAgICAgICAgICAgJ29wZXJhdGlvbiBvbiBhIGZ1bmN0aW9uIG9iamVjdCBpcyB0byBjYWxsIGl0OiAnCisgICAgICAgICAgICAgICAgICAgJyJmdW5jKGFyZ3VtZW50LWxpc3QpIi5cbicKKyAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgJ1RoZXJlIGFyZSByZWFsbHkgdHdvIGZsYXZvcnMgb2YgZnVuY3Rpb24gb2JqZWN0czogYnVpbHQtaW4gJworICAgICAgICAgICAgICAgICAgICdmdW5jdGlvbnNcbicKKyAgICAgICAgICAgICAgICAgICAnYW5kIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuICBCb3RoIHN1cHBvcnQgdGhlIHNhbWUgJworICAgICAgICAgICAgICAgICAgICdvcGVyYXRpb24gKHRvIGNhbGxcbicKKyAgICAgICAgICAgICAgICAgICAndGhlIGZ1bmN0aW9uKSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQsIGhlbmNlICcKKyAgICAgICAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVudCBvYmplY3QgdHlwZXMuXG4nCisgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICdTZWUgRnVuY3Rpb24gZGVmaW5pdGlvbnMgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAorICd0eXBlc21hcHBpbmcnOiAnXG4nCisgICAgICAgICAgICAgICAgICdNYXBwaW5nIFR5cGVzIC0tLSAiZGljdCJcbicKKyAgICAgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdBICptYXBwaW5nKiBvYmplY3QgbWFwcyAqaGFzaGFibGUqIHZhbHVlcyB0byBhcmJpdHJhcnkgJworICAgICAgICAgICAgICAgICAnb2JqZWN0cy5cbicKKyAgICAgICAgICAgICAgICAgJ01hcHBpbmdzIGFyZSBtdXRhYmxlIG9iamVjdHMuICBUaGVyZSBpcyBjdXJyZW50bHkgb25seSBvbmUgJworICAgICAgICAgICAgICAgICAnc3RhbmRhcmRcbicKKyAgICAgICAgICAgICAgICAgJ21hcHBpbmcgdHlwZSwgdGhlICpkaWN0aW9uYXJ5Ki4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgJworICAgICAgICAgICAgICAgICAndGhlIGJ1aWx0LVxuJworICAgICAgICAgICAgICAgICAnaW4gImxpc3QiLCAic2V0IiwgYW5kICJ0dXBsZSIgY2xhc3NlcywgYW5kIHRoZSAiY29sbGVjdGlvbnMiICcKKyAgICAgICAgICAgICAgICAgJ21vZHVsZS4pXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIkEgZGljdGlvbmFyeSdzIGtleXMgYXJlICphbG1vc3QqIGFyYml0cmFyeSB2YWx1ZXMuICBWYWx1ZXMgIgorICAgICAgICAgICAgICAgICAndGhhdCBhcmVcbicKKyAgICAgICAgICAgICAgICAgJ25vdCAqaGFzaGFibGUqLCB0aGF0IGlzLCB2YWx1ZXMgY29udGFpbmluZyBsaXN0cywgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyaWVzIG9yXG4nCisgICAgICAgICAgICAgICAgICdvdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiAnCisgICAgICAgICAgICAgICAgICdieSBvYmplY3RcbicKKyAgICAgICAgICAgICAgICAgJ2lkZW50aXR5KSBtYXkgbm90IGJlIHVzZWQgYXMga2V5cy4gIE51bWVyaWMgdHlwZXMgdXNlZCBmb3IgJworICAgICAgICAgICAgICAgICAna2V5cyBvYmV5XG4nCisgICAgICAgICAgICAgICAgICd0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzICcKKyAgICAgICAgICAgICAgICAgJ2NvbXBhcmUgZXF1YWxcbicKKyAgICAgICAgICAgICAgICAgJyhzdWNoIGFzICIxIiBhbmQgIjEuMCIpIHRoZW4gdGhleSBjYW4gYmUgdXNlZCAnCisgICAgICAgICAgICAgICAgICdpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXhcbicKKyAgICAgICAgICAgICAgICAgJ3RoZSBzYW1lIGRpY3Rpb25hcnkgZW50cnkuICAoTm90ZSBob3dldmVyLCB0aGF0IHNpbmNlICcKKyAgICAgICAgICAgICAgICAgJ2NvbXB1dGVycyBzdG9yZVxuJworICAgICAgICAgICAgICAgICAnZmxvYXRpbmctcG9pbnQgbnVtYmVycyBhcyBhcHByb3hpbWF0aW9ucyBpdCBpcyB1c3VhbGx5ICcKKyAgICAgICAgICAgICAgICAgJ3Vud2lzZSB0byB1c2VcbicKKyAgICAgICAgICAgICAgICAgJ3RoZW0gYXMgZGljdGlvbmFyeSBrZXlzLilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnRGljdGlvbmFyaWVzIGNhbiBiZSBjcmVhdGVkIGJ5IHBsYWNpbmcgYSBjb21tYS1zZXBhcmF0ZWQgJworICAgICAgICAgICAgICAgICAnbGlzdCBvZiAia2V5OlxuJworICAgICAgICAgICAgICAgICAndmFsdWUiIHBhaXJzIHdpdGhpbiBicmFjZXMsIGZvciBleGFtcGxlOiAie1wnamFja1wnOiA0MDk4LCAnCisgICAgICAgICAgICAgICAgICInc2pvZXJkJzpcbiIKKyAgICAgICAgICAgICAgICAgJzQxMjd9IiBvciAiezQwOTg6IFwnamFja1wnLCA0MTI3OiBcJ3Nqb2VyZFwnfSIsIG9yIGJ5IHRoZSAnCisgICAgICAgICAgICAgICAgICciZGljdCJcbicKKyAgICAgICAgICAgICAgICAgJ2NvbnN0cnVjdG9yLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBkaWN0KCoqa3dhcmcpXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBkaWN0KG1hcHBpbmcsICoqa3dhcmcpXG4nCisgICAgICAgICAgICAgICAgICdjbGFzcyBkaWN0KGl0ZXJhYmxlLCAqKmt3YXJnKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBSZXR1cm4gYSBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGFuIG9wdGlvbmFsICcKKyAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50IGFuZCBhIHBvc3NpYmx5IGVtcHR5IHNldCBvZiBrZXl3b3JkIGFyZ3VtZW50cy5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgSWYgbm8gcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiwgYW4gZW1wdHkgZGljdGlvbmFyeSAnCisgICAgICAgICAgICAgICAgICdpcyBjcmVhdGVkLlxuJworICAgICAgICAgICAgICAgICAnICAgSWYgYSBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuIGFuZCBpdCBpcyBhIG1hcHBpbmcgJworICAgICAgICAgICAgICAgICAnb2JqZWN0LCBhXG4nCisgICAgICAgICAgICAgICAgICcgICBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBrZXktdmFsdWUgcGFpcnMgYXMgJworICAgICAgICAgICAgICAgICAndGhlIG1hcHBpbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9iamVjdC4gIE90aGVyd2lzZSwgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgbXVzdCBiZSBhbiAnCisgICAgICAgICAgICAgICAgICcqaXRlcmFibGUqXG4nCisgICAgICAgICAgICAgICAgICcgICBvYmplY3QuICBFYWNoIGl0ZW0gaW4gdGhlIGl0ZXJhYmxlIG11c3QgaXRzZWxmIGJlIGFuICcKKyAgICAgICAgICAgICAgICAgJ2l0ZXJhYmxlIHdpdGhcbicKKyAgICAgICAgICAgICAgICAgJyAgIGV4YWN0bHkgdHdvIG9iamVjdHMuICBUaGUgZmlyc3Qgb2JqZWN0IG9mIGVhY2ggaXRlbSAnCisgICAgICAgICAgICAgICAgICdiZWNvbWVzIGEga2V5XG4nCisgICAgICAgICAgICAgICAgICcgICBpbiB0aGUgbmV3IGRpY3Rpb25hcnksIGFuZCB0aGUgc2Vjb25kIG9iamVjdCB0aGUgJworICAgICAgICAgICAgICAgICAnY29ycmVzcG9uZGluZ1xuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWUuICBJZiBhIGtleSBvY2N1cnMgbW9yZSB0aGFuIG9uY2UsIHRoZSBsYXN0IHZhbHVlICcKKyAgICAgICAgICAgICAgICAgJ2ZvciB0aGF0IGtleVxuJworICAgICAgICAgICAgICAgICAnICAgYmVjb21lcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgbmV3IGRpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIElmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIGtleXdvcmQgYXJndW1lbnRzIGFuZCAnCisgICAgICAgICAgICAgICAgICd0aGVpclxuJworICAgICAgICAgICAgICAgICAnICAgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeSBjcmVhdGVkIGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50LiAgSWYgYSBrZXkgYmVpbmcgYWRkZWQgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgJworICAgICAgICAgICAgICAgICAndmFsdWUgZnJvbVxuJworICAgICAgICAgICAgICAgICAnICAgdGhlIGtleXdvcmQgYXJndW1lbnQgcmVwbGFjZXMgdGhlIHZhbHVlIGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uYWxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGFyZ3VtZW50LlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUbyBpbGx1c3RyYXRlLCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIGFsbCByZXR1cm4gYSAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5IGVxdWFsXG4nCisgICAgICAgICAgICAgICAgICcgICB0byAieyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30iOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICA+Pj4gYSA9IGRpY3Qob25lPTEsIHR3bz0yLCB0aHJlZT0zKVxuJworICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGIgPSB7J29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzfVxuIgorICAgICAgICAgICAgICAgICAiICAgICAgPj4+IGMgPSBkaWN0KHppcChbJ29uZScsICd0d28nLCAndGhyZWUnXSwgWzEsIDIsIDNdKSlcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgID4+PiBkID0gZGljdChbKCd0d28nLCAyKSwgKCdvbmUnLCAxKSwgKCd0aHJlZScsIDMpXSlcbiIKKyAgICAgICAgICAgICAgICAgIiAgICAgID4+PiBlID0gZGljdCh7J3RocmVlJzogMywgJ29uZSc6IDEsICd0d28nOiAyfSlcbiIKKyAgICAgICAgICAgICAgICAgJyAgICAgID4+PiBhID09IGIgPT0gYyA9PSBkID09IGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFRydWVcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUHJvdmlkaW5nIGtleXdvcmQgYXJndW1lbnRzIGFzIGluIHRoZSBmaXJzdCBleGFtcGxlIG9ubHkgJworICAgICAgICAgICAgICAgICAnd29ya3MgZm9yXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXlzIHRoYXQgYXJlIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVycy4gIE90aGVyd2lzZSwgYW55ICcKKyAgICAgICAgICAgICAgICAgJ3ZhbGlkIGtleXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIGNhbiBiZSB1c2VkLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBUaGVzZSBhcmUgdGhlIG9wZXJhdGlvbnMgdGhhdCBkaWN0aW9uYXJpZXMgc3VwcG9ydCAoYW5kICcKKyAgICAgICAgICAgICAgICAgJ3RoZXJlZm9yZSxcbicKKyAgICAgICAgICAgICAgICAgJyAgIGN1c3RvbSBtYXBwaW5nIHR5cGVzIHNob3VsZCBzdXBwb3J0IHRvbyk6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGxlbihkKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGljdGlvbmFyeSAqZCouXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRba2V5XVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gdGhlIGl0ZW0gb2YgKmQqIHdpdGgga2V5ICprZXkqLiAgUmFpc2VzIGEgJworICAgICAgICAgICAgICAgICAnIktleUVycm9yIiBpZlxuJworICAgICAgICAgICAgICAgICAnICAgICAgKmtleSogaXMgbm90IGluIHRoZSBtYXAuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIElmIGEgc3ViY2xhc3Mgb2YgZGljdCBkZWZpbmVzIGEgbWV0aG9kICJfX21pc3NpbmdfXygpIiAnCisgICAgICAgICAgICAgICAgICdhbmQgKmtleSpcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGlzIG5vdCBwcmVzZW50LCB0aGUgImRba2V5XSIgb3BlcmF0aW9uIGNhbGxzIHRoYXQgJworICAgICAgICAgICAgICAgICAnbWV0aG9kIHdpdGhcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIHRoZSBrZXkgKmtleSogYXMgYXJndW1lbnQuICBUaGUgImRba2V5XSIgb3BlcmF0aW9uICcKKyAgICAgICAgICAgICAgICAgJ3RoZW4gcmV0dXJuc1xuJworICAgICAgICAgICAgICAgICAnICAgICAgb3IgcmFpc2VzIHdoYXRldmVyIGlzIHJldHVybmVkIG9yIHJhaXNlZCBieSB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICJfX21pc3NpbmdfXyhrZXkpIiBjYWxsLiBObyBvdGhlciBvcGVyYXRpb25zIG9yICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZHMgaW52b2tlXG4nCisgICAgICAgICAgICAgICAgICcgICAgICAiX19taXNzaW5nX18oKSIuIElmICJfX21pc3NpbmdfXygpIiBpcyBub3QgZGVmaW5lZCwgJworICAgICAgICAgICAgICAgICAnIktleUVycm9yIlxuJworICAgICAgICAgICAgICAgICAnICAgICAgaXMgcmFpc2VkLiAiX19taXNzaW5nX18oKSIgbXVzdCBiZSBhIG1ldGhvZDsgaXQgY2Fubm90ICcKKyAgICAgICAgICAgICAgICAgJ2JlIGFuXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpbnN0YW5jZSB2YXJpYWJsZTpcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgPj4+IGNsYXNzIENvdW50ZXIoZGljdCk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgICAgICAuLi4gICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOlxuJworICAgICAgICAgICAgICAgICAnICAgICAgICAgLi4uICAgICAgICAgcmV0dXJuIDBcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgID4+PiBjID0gQ291bnRlcigpXG4nCisgICAgICAgICAgICAgICAgICIgICAgICAgICA+Pj4gY1sncmVkJ11cbiIKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgIDBcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgICAgID4+PiBjWydyZWQnXSArPSAxXG4iCisgICAgICAgICAgICAgICAgICIgICAgICAgICA+Pj4gY1sncmVkJ11cbiIKKyAgICAgICAgICAgICAgICAgJyAgICAgICAgIDFcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgVGhlIGV4YW1wbGUgYWJvdmUgc2hvd3MgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICJjb2xsZWN0aW9ucy5Db3VudGVyIi4gIEEgZGlmZmVyZW50ICJfX21pc3NpbmdfXyIgJworICAgICAgICAgICAgICAgICAnbWV0aG9kIGlzIHVzZWRcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGJ5ICJjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGRba2V5XSA9IHZhbHVlXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFNldCAiZFtrZXldIiB0byAqdmFsdWUqLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBkZWwgZFtrZXldXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJlbW92ZSAiZFtrZXldIiBmcm9tICpkKi4gIFJhaXNlcyBhICJLZXlFcnJvciIgaWYgJworICAgICAgICAgICAgICAgICAnKmtleSogaXMgbm90XG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpbiB0aGUgbWFwLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXkgaW4gZFxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZXR1cm4gIlRydWUiIGlmICpkKiBoYXMgYSBrZXkgKmtleSosIGVsc2UgIkZhbHNlIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAga2V5IG5vdCBpbiBkXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIEVxdWl2YWxlbnQgdG8gIm5vdCBrZXkgaW4gZCIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGl0ZXIoZClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgdGhlIGRpY3Rpb25hcnkuICAnCisgICAgICAgICAgICAgICAgICdUaGlzIGlzIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIHNob3J0Y3V0IGZvciAiaXRlcihkLmtleXMoKSkiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBjbGVhcigpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY29weSgpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiBhIHNoYWxsb3cgY29weSBvZiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgY2xhc3NtZXRob2QgZnJvbWtleXMoc2VxWywgdmFsdWVdKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBDcmVhdGUgYSBuZXcgZGljdGlvbmFyeSB3aXRoIGtleXMgZnJvbSAqc2VxKiBhbmQgJworICAgICAgICAgICAgICAgICAndmFsdWVzIHNldCB0b1xuJworICAgICAgICAgICAgICAgICAnICAgICAgKnZhbHVlKi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgImZyb21rZXlzKCkiIGlzIGEgY2xhc3MgbWV0aG9kIHRoYXQgcmV0dXJucyBhIG5ldyAnCisgICAgICAgICAgICAgICAgICdkaWN0aW9uYXJ5LlxuJworICAgICAgICAgICAgICAgICAnICAgICAgKnZhbHVlKiBkZWZhdWx0cyB0byAiTm9uZSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIGdldChrZXlbLCBkZWZhdWx0XSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBmb3IgKmtleSogaWYgKmtleSogaXMgaW4gdGhlICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnksIGVsc2VcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgICpkZWZhdWx0Ki4gSWYgKmRlZmF1bHQqIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gJworICAgICAgICAgICAgICAgICAnIk5vbmUiLCBzb1xuJworICAgICAgICAgICAgICAgICAnICAgICAgdGhhdCB0aGlzIG1ldGhvZCBuZXZlciByYWlzZXMgYSAiS2V5RXJyb3IiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBpdGVtcygpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGl0ZW1zICgiKGtleSwgJworICAgICAgICAgICAgICAgICAndmFsdWUpIlxuJworICAgICAgICAgICAgICAgICAnICAgICAgcGFpcnMpLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICBrZXlzKClcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAiICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnkncyBrZXlzLiAgU2VlIHRoZVxuIgorICAgICAgICAgICAgICAgICAnICAgICAgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHBvcChrZXlbLCBkZWZhdWx0XSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJlbW92ZSBpdCBhbmQgcmV0dXJuICcKKyAgICAgICAgICAgICAgICAgJ2l0cyB2YWx1ZSxcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGVsc2UgcmV0dXJuICpkZWZhdWx0Ki4gIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4gYW5kICcKKyAgICAgICAgICAgICAgICAgJyprZXkqIGlzXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgIktleUVycm9yIiBpcyByYWlzZWQuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHBvcGl0ZW0oKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBSZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgIihrZXksIHZhbHVlKSIgcGFpciAnCisgICAgICAgICAgICAgICAgICdmcm9tIHRoZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgInBvcGl0ZW0oKSIgaXMgdXNlZnVsIHRvIGRlc3RydWN0aXZlbHkgaXRlcmF0ZSBvdmVyIGFcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGRpY3Rpb25hcnksIGFzIG9mdGVuIHVzZWQgaW4gc2V0IGFsZ29yaXRobXMuICBJZiB0aGUgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICAgICAnICAgICAgaXMgZW1wdHksIGNhbGxpbmcgInBvcGl0ZW0oKSIgcmFpc2VzIGEgIktleUVycm9yIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgc2V0ZGVmYXVsdChrZXlbLCBkZWZhdWx0XSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiAnCisgICAgICAgICAgICAgICAgICdub3QsIGluc2VydFxuJworICAgICAgICAgICAgICAgICAnICAgICAgKmtleSogd2l0aCBhIHZhbHVlIG9mICpkZWZhdWx0KiBhbmQgcmV0dXJuICpkZWZhdWx0Ki4gICcKKyAgICAgICAgICAgICAgICAgJypkZWZhdWx0KlxuJworICAgICAgICAgICAgICAgICAnICAgICAgZGVmYXVsdHMgdG8gIk5vbmUiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICB1cGRhdGUoW290aGVyXSlcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS92YWx1ZSBwYWlycyBmcm9tICcKKyAgICAgICAgICAgICAgICAgJypvdGhlciosXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBvdmVyd3JpdGluZyBleGlzdGluZyBrZXlzLiAgUmV0dXJuICJOb25lIi5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgICAgInVwZGF0ZSgpIiBhY2NlcHRzIGVpdGhlciBhbm90aGVyIGRpY3Rpb25hcnkgb2JqZWN0IG9yICcKKyAgICAgICAgICAgICAgICAgJ2FuXG4nCisgICAgICAgICAgICAgICAgICcgICAgICBpdGVyYWJsZSBvZiBrZXkvdmFsdWUgcGFpcnMgKGFzIHR1cGxlcyBvciBvdGhlciAnCisgICAgICAgICAgICAgICAgICdpdGVyYWJsZXMgb2ZcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGxlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlICcKKyAgICAgICAgICAgICAgICAgJ2RpY3Rpb25hcnlcbicKKyAgICAgICAgICAgICAgICAgJyAgICAgIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczogJworICAgICAgICAgICAgICAgICAnImQudXBkYXRlKHJlZD0xLFxuJworICAgICAgICAgICAgICAgICAnICAgICAgYmx1ZT0yKSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlcygpXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgIiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5J3MgdmFsdWVzLiAgU2VlICIKKyAgICAgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICAgICAnICAgICAgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIERpY3Rpb25hcmllcyBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZXkgaGF2ZSB0aGUgJworICAgICAgICAgICAgICAgICAnc2FtZSAiKGtleSxcbicKKyAgICAgICAgICAgICAgICAgJyAgIHZhbHVlKSIgcGFpcnMuIE9yZGVyIGNvbXBhcmlzb25zIChcJzxcJywgXCc8PVwnLCBcJz49XCcsICcKKyAgICAgICAgICAgICAgICAgIic+JykgcmFpc2VcbiIKKyAgICAgICAgICAgICAgICAgJyAgICJUeXBlRXJyb3IiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdTZWUgYWxzbzogInR5cGVzLk1hcHBpbmdQcm94eVR5cGUiIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhICcKKyAgICAgICAgICAgICAgICAgJ3JlYWQtb25seVxuJworICAgICAgICAgICAgICAgICAnICB2aWV3IG9mIGEgImRpY3QiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0RpY3Rpb25hcnkgdmlldyBvYmplY3RzXG4nCisgICAgICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdUaGUgb2JqZWN0cyByZXR1cm5lZCBieSAiZGljdC5rZXlzKCkiLCAiZGljdC52YWx1ZXMoKSIgYW5kXG4nCisgICAgICAgICAgICAgICAgICciZGljdC5pdGVtcygpIiBhcmUgKnZpZXcgb2JqZWN0cyouICBUaGV5IHByb3ZpZGUgYSBkeW5hbWljICcKKyAgICAgICAgICAgICAgICAgJ3ZpZXcgb24gdGhlXG4nCisgICAgICAgICAgICAgICAgICJkaWN0aW9uYXJ5J3MgZW50cmllcywgd2hpY2ggbWVhbnMgdGhhdCB3aGVuIHRoZSBkaWN0aW9uYXJ5ICIKKyAgICAgICAgICAgICAgICAgJ2NoYW5nZXMsXG4nCisgICAgICAgICAgICAgICAgICd0aGUgdmlldyByZWZsZWN0cyB0aGVzZSBjaGFuZ2VzLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdEaWN0aW9uYXJ5IHZpZXdzIGNhbiBiZSBpdGVyYXRlZCBvdmVyIHRvIHlpZWxkIHRoZWlyICcKKyAgICAgICAgICAgICAgICAgJ3Jlc3BlY3RpdmUgZGF0YSxcbicKKyAgICAgICAgICAgICAgICAgJ2FuZCBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHM6XG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ2xlbihkaWN0dmlldylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnaXRlcihkaWN0dmlldylcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMsIHZhbHVlcyBvciBpdGVtcyAnCisgICAgICAgICAgICAgICAgICcocmVwcmVzZW50ZWQgYXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIHR1cGxlcyBvZiAiKGtleSwgdmFsdWUpIikgaW4gdGhlIGRpY3Rpb25hcnkuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIgJworICAgICAgICAgICAgICAgICAnd2hpY2ggaXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uIGltcGxlbWVudGF0aW9ucywgYW5kICcKKyAgICAgICAgICAgICAgICAgJ2RlcGVuZHMgb25cbicKKyAgICAgICAgICAgICAgICAgIiAgIHRoZSBkaWN0aW9uYXJ5J3MgaGlzdG9yeSBvZiBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuIElmICIKKyAgICAgICAgICAgICAgICAgJ2tleXMsXG4nCisgICAgICAgICAgICAgICAgICcgICB2YWx1ZXMgYW5kIGl0ZW1zIHZpZXdzIGFyZSBpdGVyYXRlZCBvdmVyIHdpdGggbm8gJworICAgICAgICAgICAgICAgICAnaW50ZXJ2ZW5pbmdcbicKKyAgICAgICAgICAgICAgICAgJyAgIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRpY3Rpb25hcnksIHRoZSBvcmRlciBvZiBpdGVtcyB3aWxsICcKKyAgICAgICAgICAgICAgICAgJ2RpcmVjdGx5XG4nCisgICAgICAgICAgICAgICAgICcgICBjb3JyZXNwb25kLiAgVGhpcyBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mICIodmFsdWUsIGtleSkiICcKKyAgICAgICAgICAgICAgICAgJ3BhaXJzIHVzaW5nXG4nCisgICAgICAgICAgICAgICAgICcgICAiemlwKCkiOiAicGFpcnMgPSB6aXAoZC52YWx1ZXMoKSwgZC5rZXlzKCkpIi4gIEFub3RoZXIgJworICAgICAgICAgICAgICAgICAnd2F5IHRvXG4nCisgICAgICAgICAgICAgICAgICcgICBjcmVhdGUgdGhlIHNhbWUgbGlzdCBpcyAicGFpcnMgPSBbKHYsIGspIGZvciAoaywgdikgaW4gJworICAgICAgICAgICAgICAgICAnZC5pdGVtcygpXSIuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJyAgIEl0ZXJhdGluZyB2aWV3cyB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGUgJworICAgICAgICAgICAgICAgICAnZGljdGlvbmFyeVxuJworICAgICAgICAgICAgICAgICAnICAgbWF5IHJhaXNlIGEgIlJ1bnRpbWVFcnJvciIgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXIgYWxsICcKKyAgICAgICAgICAgICAgICAgJ2VudHJpZXMuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ3ggaW4gZGljdHZpZXdcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgUmV0dXJuICJUcnVlIiBpZiAqeCogaXMgaW4gdGhlIHVuZGVybHlpbmcgZGljdGlvbmFyeVwncyAnCisgICAgICAgICAgICAgICAgICdrZXlzLCB2YWx1ZXNcbicKKyAgICAgICAgICAgICAgICAgJyAgIG9yIGl0ZW1zIChpbiB0aGUgbGF0dGVyIGNhc2UsICp4KiBzaG91bGQgYmUgYSAiKGtleSwgJworICAgICAgICAgICAgICAgICAndmFsdWUpIlxuJworICAgICAgICAgICAgICAgICAnICAgdHVwbGUpLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdLZXlzIHZpZXdzIGFyZSBzZXQtbGlrZSBzaW5jZSB0aGVpciBlbnRyaWVzIGFyZSB1bmlxdWUgYW5kICcKKyAgICAgICAgICAgICAgICAgJ2hhc2hhYmxlLlxuJworICAgICAgICAgICAgICAgICAnSWYgYWxsIHZhbHVlcyBhcmUgaGFzaGFibGUsIHNvIHRoYXQgIihrZXksIHZhbHVlKSIgcGFpcnMgYXJlICcKKyAgICAgICAgICAgICAgICAgJ3VuaXF1ZVxuJworICAgICAgICAgICAgICAgICAnYW5kIGhhc2hhYmxlLCB0aGVuIHRoZSBpdGVtcyB2aWV3IGlzIGFsc28gc2V0LWxpa2UuICAoVmFsdWVzICcKKyAgICAgICAgICAgICAgICAgJ3ZpZXdzIGFyZVxuJworICAgICAgICAgICAgICAgICAnbm90IHRyZWF0ZWQgYXMgc2V0LWxpa2Ugc2luY2UgdGhlIGVudHJpZXMgYXJlIGdlbmVyYWxseSBub3QgJworICAgICAgICAgICAgICAgICAndW5pcXVlLilcbicKKyAgICAgICAgICAgICAgICAgJ0ZvciBzZXQtbGlrZSB2aWV3cywgYWxsIG9mIHRoZSBvcGVyYXRpb25zIGRlZmluZWQgZm9yIHRoZSAnCisgICAgICAgICAgICAgICAgICdhYnN0cmFjdFxuJworICAgICAgICAgICAgICAgICAnYmFzZSBjbGFzcyAiY29sbGVjdGlvbnMuYWJjLlNldCIgYXJlIGF2YWlsYWJsZSAoZm9yIGV4YW1wbGUsICcKKyAgICAgICAgICAgICAgICAgJyI9PSIsXG4nCisgICAgICAgICAgICAgICAgICciPCIsIG9yICJeIikuXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ0FuIGV4YW1wbGUgb2YgZGljdGlvbmFyeSB2aWV3IHVzYWdlOlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICIgICA+Pj4gZGlzaGVzID0geydlZ2dzJzogMiwgJ3NhdXNhZ2UnOiAxLCAnYmFjb24nOiAxLCAiCisgICAgICAgICAgICAgICAgICInc3BhbSc6IDUwMH1cbiIKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBrZXlzID0gZGlzaGVzLmtleXMoKVxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHZhbHVlcyA9IGRpc2hlcy52YWx1ZXMoKVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gIyBpdGVyYXRpb25cbicKKyAgICAgICAgICAgICAgICAgJyAgID4+PiBuID0gMFxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOlxuJworICAgICAgICAgICAgICAgICAnICAgLi4uICAgICBuICs9IHZhbFxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IHByaW50KG4pXG4nCisgICAgICAgICAgICAgICAgICcgICA1MDRcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+ICMga2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIHRoZSBzYW1lICcKKyAgICAgICAgICAgICAgICAgJ29yZGVyXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGlzdChrZXlzKVxuJworICAgICAgICAgICAgICAgICAiICAgWydlZ2dzJywgJ2JhY29uJywgJ3NhdXNhZ2UnLCAnc3BhbSddXG4iCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGlzdCh2YWx1ZXMpXG4nCisgICAgICAgICAgICAgICAgICcgICBbMiwgMSwgMSwgNTAwXVxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gIyB2aWV3IG9iamVjdHMgYXJlIGR5bmFtaWMgYW5kIHJlZmxlY3QgZGljdCBjaGFuZ2VzXG4nCisgICAgICAgICAgICAgICAgICIgICA+Pj4gZGVsIGRpc2hlc1snZWdncyddXG4iCisgICAgICAgICAgICAgICAgICIgICA+Pj4gZGVsIGRpc2hlc1snc2F1c2FnZSddXG4iCisgICAgICAgICAgICAgICAgICcgICA+Pj4gbGlzdChrZXlzKVxuJworICAgICAgICAgICAgICAgICAiICAgWydzcGFtJywgJ2JhY29uJ11cbiIKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnICAgPj4+ICMgc2V0IG9wZXJhdGlvbnNcbicKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBrZXlzICYgeydlZ2dzJywgJ2JhY29uJywgJ3NhbGFkJ31cbiIKKyAgICAgICAgICAgICAgICAgIiAgIHsnYmFjb24nfVxuIgorICAgICAgICAgICAgICAgICAiICAgPj4+IGtleXMgXiB7J3NhdXNhZ2UnLCAnanVpY2UnfVxuIgorICAgICAgICAgICAgICAgICAiICAgeydqdWljZScsICdzYXVzYWdlJywgJ2JhY29uJywgJ3NwYW0nfVxuIiwKKyAndHlwZXNtZXRob2RzJzogJ1xuJworICAgICAgICAgICAgICAgICAnTWV0aG9kc1xuJworICAgICAgICAgICAgICAgICAnKioqKioqKlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdNZXRob2RzIGFyZSBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIHVzaW5nIHRoZSBhdHRyaWJ1dGUgJworICAgICAgICAgICAgICAgICAnbm90YXRpb24uXG4nCisgICAgICAgICAgICAgICAgICdUaGVyZSBhcmUgdHdvIGZsYXZvcnM6IGJ1aWx0LWluIG1ldGhvZHMgKHN1Y2ggYXMgImFwcGVuZCgpIiAnCisgICAgICAgICAgICAgICAgICdvbiBsaXN0cylcbicKKyAgICAgICAgICAgICAgICAgJ2FuZCBjbGFzcyBpbnN0YW5jZSBtZXRob2RzLiAgQnVpbHQtaW4gbWV0aG9kcyBhcmUgZGVzY3JpYmVkICcKKyAgICAgICAgICAgICAgICAgJ3dpdGggdGhlXG4nCisgICAgICAgICAgICAgICAgICd0eXBlcyB0aGF0IHN1cHBvcnQgdGhlbS5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnSWYgeW91IGFjY2VzcyBhIG1ldGhvZCAoYSBmdW5jdGlvbiBkZWZpbmVkIGluIGEgY2xhc3MgJworICAgICAgICAgICAgICAgICAnbmFtZXNwYWNlKVxuJworICAgICAgICAgICAgICAgICAndGhyb3VnaCBhbiBpbnN0YW5jZSwgeW91IGdldCBhIHNwZWNpYWwgb2JqZWN0OiBhICpib3VuZCAnCisgICAgICAgICAgICAgICAgICdtZXRob2QqIChhbHNvXG4nCisgICAgICAgICAgICAgICAgICdjYWxsZWQgKmluc3RhbmNlIG1ldGhvZCopIG9iamVjdC4gV2hlbiBjYWxsZWQsIGl0IHdpbGwgYWRkICcKKyAgICAgICAgICAgICAgICAgJ3RoZSAic2VsZiJcbicKKyAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IHRvIHRoZSBhcmd1bWVudCBsaXN0LiAgQm91bmQgbWV0aG9kcyBoYXZlIHR3byAnCisgICAgICAgICAgICAgICAgICdzcGVjaWFsIHJlYWQtXG4nCisgICAgICAgICAgICAgICAgICdvbmx5IGF0dHJpYnV0ZXM6ICJtLl9fc2VsZl9fIiBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSAnCisgICAgICAgICAgICAgICAgICdtZXRob2RcbicKKyAgICAgICAgICAgICAgICAgJ29wZXJhdGVzLCBhbmQgIm0uX19mdW5jX18iIGlzIHRoZSBmdW5jdGlvbiBpbXBsZW1lbnRpbmcgdGhlICcKKyAgICAgICAgICAgICAgICAgJ21ldGhvZC5cbicKKyAgICAgICAgICAgICAgICAgJ0NhbGxpbmcgIm0oYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKSIgaXMgY29tcGxldGVseSAnCisgICAgICAgICAgICAgICAgICdlcXVpdmFsZW50IHRvXG4nCisgICAgICAgICAgICAgICAgICdjYWxsaW5nICJtLl9fZnVuY19fKG0uX19zZWxmX18sIGFyZy0xLCBhcmctMiwgLi4uLCBhcmctbikiLlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICdMaWtlIGZ1bmN0aW9uIG9iamVjdHMsIGJvdW5kIG1ldGhvZCBvYmplY3RzIHN1cHBvcnQgZ2V0dGluZyAnCisgICAgICAgICAgICAgICAgICdhcmJpdHJhcnlcbicKKyAgICAgICAgICAgICAgICAgJ2F0dHJpYnV0ZXMuICBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkgJworICAgICAgICAgICAgICAgICAnc3RvcmVkIG9uXG4nCisgICAgICAgICAgICAgICAgICd0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgKCJtZXRoLl9fZnVuY19fIiksIHNldHRpbmcgJworICAgICAgICAgICAgICAgICAnbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGVzIG9uIGJvdW5kIG1ldGhvZHMgaXMgZGlzYWxsb3dlZC4gIEF0dGVtcHRpbmcgdG8gJworICAgICAgICAgICAgICAgICAnc2V0IGFuXG4nCisgICAgICAgICAgICAgICAgICdhdHRyaWJ1dGUgb24gYSBtZXRob2QgcmVzdWx0cyBpbiBhbiAiQXR0cmlidXRlRXJyb3IiIGJlaW5nICcKKyAgICAgICAgICAgICAgICAgJ3JhaXNlZC4gIEluXG4nCisgICAgICAgICAgICAgICAgICdvcmRlciB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlLCB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHNldCAnCisgICAgICAgICAgICAgICAgICdpdCBvbiB0aGVcbicKKyAgICAgICAgICAgICAgICAgJ3VuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0OlxuJworICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICcgICA+Pj4gY2xhc3MgQzpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgZGVmIG1ldGhvZChzZWxmKTpcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLiAgICAgICAgIHBhc3NcbicKKyAgICAgICAgICAgICAgICAgJyAgIC4uLlxuJworICAgICAgICAgICAgICAgICAnICAgPj4+IGMgPSBDKClcbicKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBjLm1ldGhvZC53aG9hbWkgPSAnbXkgbmFtZSBpcyBtZXRob2QnICAjIGNhbid0IHNldCBvbiAiCisgICAgICAgICAgICAgICAgICd0aGUgbWV0aG9kXG4nCisgICAgICAgICAgICAgICAgICcgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nCisgICAgICAgICAgICAgICAgICcgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4nCisgICAgICAgICAgICAgICAgICIgICBBdHRyaWJ1dGVFcnJvcjogJ21ldGhvZCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgIgorICAgICAgICAgICAgICAgICAiJ3dob2FtaSdcbiIKKyAgICAgICAgICAgICAgICAgIiAgID4+PiBjLm1ldGhvZC5fX2Z1bmNfXy53aG9hbWkgPSAnbXkgbmFtZSBpcyBtZXRob2QnXG4iCisgICAgICAgICAgICAgICAgICcgICA+Pj4gYy5tZXRob2Qud2hvYW1pXG4nCisgICAgICAgICAgICAgICAgICIgICAnbXkgbmFtZSBpcyBtZXRob2QnXG4iCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1NlZSBUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAorICd0eXBlc21vZHVsZXMnOiAnXG4nCisgICAgICAgICAgICAgICAgICdNb2R1bGVzXG4nCisgICAgICAgICAgICAgICAgICcqKioqKioqXG4nCisgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgJ1RoZSBvbmx5IHNwZWNpYWwgb3BlcmF0aW9uIG9uIGEgbW9kdWxlIGlzIGF0dHJpYnV0ZSBhY2Nlc3M6ICcKKyAgICAgICAgICAgICAgICAgJyJtLm5hbWUiLFxuJworICAgICAgICAgICAgICAgICAnd2hlcmUgKm0qIGlzIGEgbW9kdWxlIGFuZCAqbmFtZSogYWNjZXNzZXMgYSBuYW1lIGRlZmluZWQgaW4gJworICAgICAgICAgICAgICAgICAiKm0qJ3NcbiIKKyAgICAgICAgICAgICAgICAgJ3N5bWJvbCB0YWJsZS4gTW9kdWxlIGF0dHJpYnV0ZXMgY2FuIGJlIGFzc2lnbmVkIHRvLiAgKE5vdGUgJworICAgICAgICAgICAgICAgICAndGhhdCB0aGVcbicKKyAgICAgICAgICAgICAgICAgJyJpbXBvcnQiIHN0YXRlbWVudCBpcyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBhbiBvcGVyYXRpb24gJworICAgICAgICAgICAgICAgICAnb24gYSBtb2R1bGVcbicKKyAgICAgICAgICAgICAgICAgJ29iamVjdDsgImltcG9ydCBmb28iIGRvZXMgbm90IHJlcXVpcmUgYSBtb2R1bGUgb2JqZWN0IG5hbWVkICcKKyAgICAgICAgICAgICAgICAgJypmb28qIHRvXG4nCisgICAgICAgICAgICAgICAgICdleGlzdCwgcmF0aGVyIGl0IHJlcXVpcmVzIGFuIChleHRlcm5hbCkgKmRlZmluaXRpb24qIGZvciBhICcKKyAgICAgICAgICAgICAgICAgJ21vZHVsZVxuJworICAgICAgICAgICAgICAgICAnbmFtZWQgKmZvbyogc29tZXdoZXJlLilcbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnQSBzcGVjaWFsIGF0dHJpYnV0ZSBvZiBldmVyeSBtb2R1bGUgaXMgIl9fZGljdF9fIi4gVGhpcyBpcyAnCisgICAgICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAgICAgImRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgIgorICAgICAgICAgICAgICAgICAndGhpc1xuJworICAgICAgICAgICAgICAgICAiZGljdGlvbmFyeSB3aWxsIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLCAiCisgICAgICAgICAgICAgICAgICdidXQgZGlyZWN0XG4nCisgICAgICAgICAgICAgICAgICdhc3NpZ25tZW50IHRvIHRoZSAiX19kaWN0X18iIGF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSAnCisgICAgICAgICAgICAgICAgICdjYW4gd3JpdGVcbicKKyAgICAgICAgICAgICAgICAgJyJtLl9fZGljdF9fW1wnYVwnXSA9IDEiLCB3aGljaCBkZWZpbmVzICJtLmEiIHRvIGJlICIxIiwgYnV0ICcKKyAgICAgICAgICAgICAgICAgInlvdSBjYW4ndFxuIgorICAgICAgICAgICAgICAgICAnd3JpdGUgIm0uX19kaWN0X18gPSB7fSIpLiAgTW9kaWZ5aW5nICJfX2RpY3RfXyIgZGlyZWN0bHkgaXMgJworICAgICAgICAgICAgICAgICAnbm90XG4nCisgICAgICAgICAgICAgICAgICdyZWNvbW1lbmRlZC5cbicKKyAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAnTW9kdWxlcyBidWlsdCBpbnRvIHRoZSBpbnRlcnByZXRlciBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6ICcKKyAgICAgICAgICAgICAgICAgJyI8bW9kdWxlXG4nCisgICAgICAgICAgICAgICAgICdcJ3N5c1wnIChidWlsdC1pbik+Ii4gIElmIGxvYWRlZCBmcm9tIGEgZmlsZSwgdGhleSBhcmUgJworICAgICAgICAgICAgICAgICAnd3JpdHRlbiBhc1xuJworICAgICAgICAgICAgICAgICAnIjxtb2R1bGUgXCdvc1wnIGZyb20gJworICAgICAgICAgICAgICAgICAnXCcvdXNyL2xvY2FsL2xpYi9weXRob25YLlkvb3MucHljXCc+Ii5cbicsCisgJ3R5cGVzc2VxJzogJ1xuJworICAgICAgICAgICAgICdTZXF1ZW5jZSBUeXBlcyAtLS0gImxpc3QiLCAidHVwbGUiLCAicmFuZ2UiXG4nCisgICAgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZXJlIGFyZSB0aHJlZSBiYXNpYyBzZXF1ZW5jZSB0eXBlczogbGlzdHMsIHR1cGxlcywgYW5kIHJhbmdlXG4nCisgICAgICAgICAgICAgJ29iamVjdHMuIEFkZGl0aW9uYWwgc2VxdWVuY2UgdHlwZXMgdGFpbG9yZWQgZm9yIHByb2Nlc3Npbmcgb2YgJworICAgICAgICAgICAgICdiaW5hcnlcbicKKyAgICAgICAgICAgICAnZGF0YSBhbmQgdGV4dCBzdHJpbmdzIGFyZSBkZXNjcmliZWQgaW4gZGVkaWNhdGVkIHNlY3Rpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0NvbW1vbiBTZXF1ZW5jZSBPcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBzdXBwb3J0ZWQgYnkgbW9zdCAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgJ3R5cGVzLCBib3RoIG11dGFibGUgYW5kIGltbXV0YWJsZS4gVGhlICcKKyAgICAgICAgICAgICAnImNvbGxlY3Rpb25zLmFiYy5TZXF1ZW5jZSIgQUJDXG4nCisgICAgICAgICAgICAgJ2lzIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlc2UgJworICAgICAgICAgICAgICdvcGVyYXRpb25zXG4nCisgICAgICAgICAgICAgJ29uIGN1c3RvbSBzZXF1ZW5jZSB0eXBlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoaXMgdGFibGUgbGlzdHMgdGhlIHNlcXVlbmNlIG9wZXJhdGlvbnMgc29ydGVkIGluIGFzY2VuZGluZyAnCisgICAgICAgICAgICAgJ3ByaW9yaXR5LlxuJworICAgICAgICAgICAgICdJbiB0aGUgdGFibGUsICpzKiBhbmQgKnQqIGFyZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZSwgKm4qLCAnCisgICAgICAgICAgICAgJyppKixcbicKKyAgICAgICAgICAgICAnKmoqIGFuZCAqayogYXJlIGludGVnZXJzIGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0ICcKKyAgICAgICAgICAgICAnbWVldHMgYW55XG4nCisgICAgICAgICAgICAgJ3R5cGUgYW5kIHZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAiaW4iIGFuZCAibm90IGluIiBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdGllcyBhcyAnCisgICAgICAgICAgICAgJ3RoZVxuJworICAgICAgICAgICAgICdjb21wYXJpc29uIG9wZXJhdGlvbnMuIFRoZSAiKyIgKGNvbmNhdGVuYXRpb24pIGFuZCAiKiIgJworICAgICAgICAgICAgICcocmVwZXRpdGlvbilcbicKKyAgICAgICAgICAgICAnb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBjb3JyZXNwb25kaW5nIG51bWVyaWNcbicKKyAgICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8IE5vdGVzICAgICAgfFxuJworICAgICAgICAgICAgICcrPT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAnfCAieCBpbiBzIiAgICAgICAgICAgICAgICAgICB8ICJUcnVlIiBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICAgICcKKyAgICAgICAgICAgICAnfCAoMSkgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSAiRmFsc2UiICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInggbm90IGluIHMiICAgICAgICAgICAgICAgfCAiRmFsc2UiIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgICAnCisgICAgICAgICAgICAgJ3wgKDEpICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgIlRydWUiICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzICsgdCIgICAgICAgICAgICAgICAgICAgIHwgdGhlIGNvbmNhdGVuYXRpb24gb2YgKnMqIGFuZCAqdCogJworICAgICAgICAgICAgICd8ICg2KSg3KSAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicyAqIG4iIG9yICJuICogcyIgICAgICAgICB8IGVxdWl2YWxlbnQgdG8gYWRkaW5nICpzKiB0byAgICAgICcKKyAgICAgICAgICAgICAnfCAoMikoNykgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0c2VsZiAqbiogdGltZXMgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInNbaV0iICAgICAgICAgICAgICAgICAgICAgfCAqaSp0aCBpdGVtIG9mICpzKiwgb3JpZ2luIDAgICAgICAnCisgICAgICAgICAgICAgJ3wgKDMpICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiAgICAgJworICAgICAgICAgICAgICd8ICgzKSg0KSAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAic1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgICcKKyAgICAgICAgICAgICAnfCAoMykoNSkgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdpdGggc3RlcCAqayogICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgImxlbihzKSIgICAgICAgICAgICAgICAgICAgfCBsZW5ndGggb2YgKnMqICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJtaW4ocykiICAgICAgICAgICAgICAgICAgIHwgc21hbGxlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAibWF4KHMpIiAgICAgICAgICAgICAgICAgICB8IGxhcmdlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuaW5kZXgoeFssIGlbLCBqXV0pIiAgICAgfCBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAnCisgICAgICAgICAgICAgJ3wgKDgpICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogaW4gKnMqIChhdCBvciBhZnRlciBpbmRleCAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqaSogYW5kIGJlZm9yZSBpbmRleCAqaiopICAgICAgICAnCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLmNvdW50KHgpIiAgICAgICAgICAgICAgIHwgdG90YWwgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqIGluICpzKiAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1NlcXVlbmNlcyBvZiB0aGUgc2FtZSB0eXBlIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gIEluICcKKyAgICAgICAgICAgICAncGFydGljdWxhcixcbicKKyAgICAgICAgICAgICAndHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgYnkgY29tcGFyaW5nXG4nCisgICAgICAgICAgICAgJ2NvcnJlc3BvbmRpbmcgZWxlbWVudHMuIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBldmVyeVxuJworICAgICAgICAgICAgICdlbGVtZW50IG11c3QgY29tcGFyZSBlcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgJworICAgICAgICAgICAgICdzYW1lXG4nCisgICAgICAgICAgICAgJ3R5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLiAgKEZvciBmdWxsIGRldGFpbHMgc2VlICcKKyAgICAgICAgICAgICAnQ29tcGFyaXNvbnMgaW5cbicKKyAgICAgICAgICAgICAndGhlIGxhbmd1YWdlIHJlZmVyZW5jZS4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzEuIFdoaWxlIHRoZSAiaW4iIGFuZCAibm90IGluIiBvcGVyYXRpb25zIGFyZSB1c2VkIG9ubHkgZm9yICcKKyAgICAgICAgICAgICAnc2ltcGxlXG4nCisgICAgICAgICAgICAgJyAgIGNvbnRhaW5tZW50IHRlc3RpbmcgaW4gdGhlIGdlbmVyYWwgY2FzZSwgc29tZSBzcGVjaWFsaXNlZCAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlc1xuJworICAgICAgICAgICAgICcgICAoc3VjaCBhcyAic3RyIiwgImJ5dGVzIiBhbmQgImJ5dGVhcnJheSIpIGFsc28gdXNlIHRoZW0gZm9yXG4nCisgICAgICAgICAgICAgJyAgIHN1YnNlcXVlbmNlIHRlc3Rpbmc6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICA+Pj4gImdnIiBpbiAiZWdncyJcbicKKyAgICAgICAgICAgICAnICAgICAgVHJ1ZVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnMi4gVmFsdWVzIG9mICpuKiBsZXNzIHRoYW4gIjAiIGFyZSB0cmVhdGVkIGFzICIwIiAod2hpY2ggeWllbGRzICcKKyAgICAgICAgICAgICAnYW5cbicKKyAgICAgICAgICAgICAnICAgZW1wdHkgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyAqcyopLiAgTm90ZSB0aGF0IGl0ZW1zIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlICpzKiBhcmUgbm90IGNvcGllZDsgdGhleSBhcmUgcmVmZXJlbmNlZCBtdWx0aXBsZSAnCisgICAgICAgICAgICAgJ3RpbWVzLlxuJworICAgICAgICAgICAgICcgICBUaGlzIG9mdGVuIGhhdW50cyBuZXcgUHl0aG9uIHByb2dyYW1tZXJzOyBjb25zaWRlcjpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0cyA9IFtbXV0gKiAzXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0c1xuJworICAgICAgICAgICAgICcgICAgICBbW10sIFtdLCBbXV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNcbicKKyAgICAgICAgICAgICAnICAgICAgW1szXSwgWzNdLCBbM11dXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBXaGF0IGhhcyBoYXBwZW5lZCBpcyB0aGF0ICJbW11dIiBpcyBhIG9uZS1lbGVtZW50IGxpc3QgJworICAgICAgICAgICAgICdjb250YWluaW5nXG4nCisgICAgICAgICAgICAgJyAgIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiAiW1tdXSAqIDMiIGFyZSAnCisgICAgICAgICAgICAgJ3JlZmVyZW5jZXNcbicKKyAgICAgICAgICAgICAnICAgdG8gdGhpcyBzaW5nbGUgZW1wdHkgbGlzdC4gIE1vZGlmeWluZyBhbnkgb2YgdGhlIGVsZW1lbnRzIG9mXG4nCisgICAgICAgICAgICAgJyAgICJsaXN0cyIgbW9kaWZpZXMgdGhpcyBzaW5nbGUgbGlzdC4gWW91IGNhbiBjcmVhdGUgYSBsaXN0IG9mXG4nCisgICAgICAgICAgICAgJyAgIGRpZmZlcmVudCBsaXN0cyB0aGlzIHdheTpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0cyA9IFtbXSBmb3IgaSBpbiByYW5nZSgzKV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0c1syXS5hcHBlbmQoNylcbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3RzXG4nCisgICAgICAgICAgICAgJyAgICAgIFtbM10sIFs1XSwgWzddXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgRnVydGhlciBleHBsYW5hdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIEZBUSBlbnRyeSBIb3cgZG8gSSAnCisgICAgICAgICAgICAgJ2NyZWF0ZSBhXG4nCisgICAgICAgICAgICAgJyAgIG11bHRpZGltZW5zaW9uYWwgbGlzdD8uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICczLiBJZiAqaSogb3IgKmoqIGlzIG5lZ2F0aXZlLCB0aGUgaW5kZXggaXMgcmVsYXRpdmUgdG8gdGhlIGVuZCAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJyAgIHRoZSBzdHJpbmc6ICJsZW4ocykgKyBpIiBvciAibGVuKHMpICsgaiIgaXMgc3Vic3RpdHV0ZWQuICBCdXQgJworICAgICAgICAgICAgICdub3RlXG4nCisgICAgICAgICAgICAgJyAgIHRoYXQgIi0wIiBpcyBzdGlsbCAiMCIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc0LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyBkZWZpbmVkIGFzIHRoZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJyAgIGl0ZW1zIHdpdGggaW5kZXggKmsqIHN1Y2ggdGhhdCAiaSA8PSBrIDwgaiIuICBJZiAqaSogb3IgKmoqICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgZ3JlYXRlciB0aGFuICJsZW4ocykiLCB1c2UgImxlbihzKSIuICBJZiAqaSogaXMgb21pdHRlZCBvciAnCisgICAgICAgICAgICAgJyJOb25lIixcbicKKyAgICAgICAgICAgICAnICAgdXNlICIwIi4gIElmICpqKiBpcyBvbWl0dGVkIG9yICJOb25lIiwgdXNlICJsZW4ocykiLiAgSWYgKmkqICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICpqKiwgdGhlIHNsaWNlIGlzIGVtcHR5LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlIG9mIGl0ZW1zIHdpdGggaW5kZXggICJ4ID0gaSArIG4qayIgc3VjaCB0aGF0ICIwIDw9IG4gJworICAgICAgICAgICAgICc8XG4nCisgICAgICAgICAgICAgJyAgIChqLWkpL2siLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBpbmRpY2VzIGFyZSAiaSIsICJpK2siLCAnCisgICAgICAgICAgICAgJyJpKzIqayIsXG4nCisgICAgICAgICAgICAgJyAgICJpKzMqayIgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXQgbmV2ZXJcbicKKyAgICAgICAgICAgICAnICAgaW5jbHVkaW5nICpqKikuICBJZiAqaSogb3IgKmoqIGlzIGdyZWF0ZXIgdGhhbiAibGVuKHMpIiwgdXNlXG4nCisgICAgICAgICAgICAgJyAgICJsZW4ocykiLiAgSWYgKmkqIG9yICpqKiBhcmUgb21pdHRlZCBvciAiTm9uZSIsIHRoZXkgYmVjb21lICcKKyAgICAgICAgICAgICAnImVuZCJcbicKKyAgICAgICAgICAgICAnICAgdmFsdWVzICh3aGljaCBlbmQgZGVwZW5kcyBvbiB0aGUgc2lnbiBvZiAqayopLiAgTm90ZSwgKmsqICcKKyAgICAgICAgICAgICAnY2Fubm90IGJlXG4nCisgICAgICAgICAgICAgJyAgIHplcm8uIElmICprKiBpcyAiTm9uZSIsIGl0IGlzIHRyZWF0ZWQgbGlrZSAiMSIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc2LiBDb25jYXRlbmF0aW5nIGltbXV0YWJsZSBzZXF1ZW5jZXMgYWx3YXlzIHJlc3VsdHMgaW4gYSBuZXdcbicKKyAgICAgICAgICAgICAnICAgb2JqZWN0LiBUaGlzIG1lYW5zIHRoYXQgYnVpbGRpbmcgdXAgYSBzZXF1ZW5jZSBieSByZXBlYXRlZFxuJworICAgICAgICAgICAgICcgICBjb25jYXRlbmF0aW9uIHdpbGwgaGF2ZSBhIHF1YWRyYXRpYyBydW50aW1lIGNvc3QgaW4gdGhlICcKKyAgICAgICAgICAgICAndG90YWxcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UgbGVuZ3RoLiBUbyBnZXQgYSBsaW5lYXIgcnVudGltZSBjb3N0LCB5b3UgbXVzdCAnCisgICAgICAgICAgICAgJ3N3aXRjaCB0b1xuJworICAgICAgICAgICAgICcgICBvbmUgb2YgdGhlIGFsdGVybmF0aXZlcyBiZWxvdzpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogaWYgY29uY2F0ZW5hdGluZyAic3RyIiBvYmplY3RzLCB5b3UgY2FuIGJ1aWxkIGEgbGlzdCBhbmQgJworICAgICAgICAgICAgICd1c2VcbicKKyAgICAgICAgICAgICAnICAgICAic3RyLmpvaW4oKSIgYXQgdGhlIGVuZCBvciBlbHNlIHdyaXRlIHRvIGFuICJpby5TdHJpbmdJTyJcbicKKyAgICAgICAgICAgICAnICAgICBpbnN0YW5jZSBhbmQgcmV0cmlldmUgaXRzIHZhbHVlIHdoZW4gY29tcGxldGVcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogaWYgY29uY2F0ZW5hdGluZyAiYnl0ZXMiIG9iamVjdHMsIHlvdSBjYW4gc2ltaWxhcmx5IHVzZVxuJworICAgICAgICAgICAgICcgICAgICJieXRlcy5qb2luKCkiIG9yICJpby5CeXRlc0lPIiwgb3IgeW91IGNhbiBkbyBpbi1wbGFjZVxuJworICAgICAgICAgICAgICcgICAgIGNvbmNhdGVuYXRpb24gd2l0aCBhICJieXRlYXJyYXkiIG9iamVjdC4gICJieXRlYXJyYXkiICcKKyAgICAgICAgICAgICAnb2JqZWN0cyBhcmVcbicKKyAgICAgICAgICAgICAnICAgICBtdXRhYmxlIGFuZCBoYXZlIGFuIGVmZmljaWVudCBvdmVyYWxsb2NhdGlvbiBtZWNoYW5pc21cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogaWYgY29uY2F0ZW5hdGluZyAidHVwbGUiIG9iamVjdHMsIGV4dGVuZCBhICJsaXN0IiBpbnN0ZWFkXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIGZvciBvdGhlciB0eXBlcywgaW52ZXN0aWdhdGUgdGhlIHJlbGV2YW50IGNsYXNzICcKKyAgICAgICAgICAgICAnZG9jdW1lbnRhdGlvblxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNy4gU29tZSBzZXF1ZW5jZSB0eXBlcyAoc3VjaCBhcyAicmFuZ2UiKSBvbmx5IHN1cHBvcnQgaXRlbVxuJworICAgICAgICAgICAgICIgICBzZXF1ZW5jZXMgdGhhdCBmb2xsb3cgc3BlY2lmaWMgcGF0dGVybnMsIGFuZCBoZW5jZSBkb24ndCAiCisgICAgICAgICAgICAgJ3N1cHBvcnRcbicKKyAgICAgICAgICAgICAnICAgc2VxdWVuY2UgY29uY2F0ZW5hdGlvbiBvciByZXBldGl0aW9uLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnOC4gImluZGV4IiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouICcKKyAgICAgICAgICAgICAnV2hlblxuJworICAgICAgICAgICAgICcgICBzdXBwb3J0ZWQsIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byB0aGUgaW5kZXggbWV0aG9kICcKKyAgICAgICAgICAgICAnYWxsb3dcbicKKyAgICAgICAgICAgICAnICAgZWZmaWNpZW50IHNlYXJjaGluZyBvZiBzdWJzZWN0aW9ucyBvZiB0aGUgc2VxdWVuY2UuIFBhc3NpbmcgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgZXh0cmEgYXJndW1lbnRzIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byB1c2luZyAnCisgICAgICAgICAgICAgJyJzW2k6al0uaW5kZXgoeCkiLFxuJworICAgICAgICAgICAgICcgICBvbmx5IHdpdGhvdXQgY29weWluZyBhbnkgZGF0YSBhbmQgd2l0aCB0aGUgcmV0dXJuZWQgaW5kZXggJworICAgICAgICAgICAgICdiZWluZ1xuJworICAgICAgICAgICAgICcgICByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHNlcXVlbmNlIHJhdGhlciB0aGFuIHRoZSBzdGFydCAnCisgICAgICAgICAgICAgJ29mIHRoZVxuJworICAgICAgICAgICAgICcgICBzbGljZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJbW11dGFibGUgU2VxdWVuY2UgVHlwZXNcbicKKyAgICAgICAgICAgICAnPT09PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgb25seSBvcGVyYXRpb24gdGhhdCBpbW11dGFibGUgc2VxdWVuY2UgdHlwZXMgZ2VuZXJhbGx5ICcKKyAgICAgICAgICAgICAnaW1wbGVtZW50XG4nCisgICAgICAgICAgICAgJ3RoYXQgaXMgbm90IGFsc28gaW1wbGVtZW50ZWQgYnkgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyBpcyAnCisgICAgICAgICAgICAgJ3N1cHBvcnQgZm9yXG4nCisgICAgICAgICAgICAgJ3RoZSAiaGFzaCgpIiBidWlsdC1pbi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoaXMgc3VwcG9ydCBhbGxvd3MgaW1tdXRhYmxlIHNlcXVlbmNlcywgc3VjaCBhcyAidHVwbGUiICcKKyAgICAgICAgICAgICAnaW5zdGFuY2VzLCB0b1xuJworICAgICAgICAgICAgICdiZSB1c2VkIGFzICJkaWN0IiBrZXlzIGFuZCBzdG9yZWQgaW4gInNldCIgYW5kICJmcm96ZW5zZXQiICcKKyAgICAgICAgICAgICAnaW5zdGFuY2VzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnQXR0ZW1wdGluZyB0byBoYXNoIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0aGF0IGNvbnRhaW5zICcKKyAgICAgICAgICAgICAndW5oYXNoYWJsZVxuJworICAgICAgICAgICAgICd2YWx1ZXMgd2lsbCByZXN1bHQgaW4gIlR5cGVFcnJvciIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuJworICAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUaGUgb3BlcmF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlIGFyZSBkZWZpbmVkIG9uIG11dGFibGUgJworICAgICAgICAgICAgICdzZXF1ZW5jZVxuJworICAgICAgICAgICAgICd0eXBlcy4gVGhlICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMgaXMgcHJvdmlkZWQgdG8gJworICAgICAgICAgICAgICdtYWtlXG4nCisgICAgICAgICAgICAgJ2l0IGVhc2llciB0byBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZXNlIG9wZXJhdGlvbnMgb24gY3VzdG9tICcKKyAgICAgICAgICAgICAnc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAndHlwZXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdJbiB0aGUgdGFibGUgKnMqIGlzIGFuIGluc3RhbmNlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLCAqdCogJworICAgICAgICAgICAgICdpcyBhbnlcbicKKyAgICAgICAgICAgICAnaXRlcmFibGUgb2JqZWN0IGFuZCAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB0aGF0IG1lZXRzIGFueSAnCisgICAgICAgICAgICAgJ3R5cGUgYW5kXG4nCisgICAgICAgICAgICAgJ3ZhbHVlIHJlc3RyaWN0aW9ucyBpbXBvc2VkIGJ5ICpzKiAoZm9yIGV4YW1wbGUsICJieXRlYXJyYXkiICcKKyAgICAgICAgICAgICAnb25seVxuJworICAgICAgICAgICAgICdhY2NlcHRzIGludGVnZXJzIHRoYXQgbWVldCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24gIjAgPD0geCA8PSAnCisgICAgICAgICAgICAgJzI1NSIpLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgJworICAgICAgICAgICAgICdSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJys9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xuJworICAgICAgICAgICAgICd8ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCAnCisgICAgICAgICAgICAgJ2J5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICcKKyAgICAgICAgICAgICAnKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAic1tpOmpdID0gdCIgICAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICcKKyAgICAgICAgICAgICAnaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgJworICAgICAgICAgICAgICd0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAnCisgICAgICAgICAgICAgJyp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgImRlbCBzW2k6al0iICAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyAic1tpOmpdID0gJworICAgICAgICAgICAgICdbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzW2k6ajprXSA9IHQiICAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiAic1tpOmo6a10iICcKKyAgICAgICAgICAgICAnYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICcKKyAgICAgICAgICAgICAnKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAiZGVsIHNbaTpqOmtdIiAgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyAnCisgICAgICAgICAgICAgJ29mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlICcKKyAgICAgICAgICAgICAnbGlzdCAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuYXBwZW5kKHgpIiAgICAgICAgICAgICAgICAgIHwgYXBwZW5kcyAqeCogdG8gdGhlIGVuZCBvZiAnCisgICAgICAgICAgICAgJ3RoZSAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgc2VxdWVuY2UgKHNhbWUgJworICAgICAgICAgICAgICdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgInNbbGVuKHMpOmxlbihzKV0gPSAnCisgICAgICAgICAgICAgJ1t4XSIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLmNsZWFyKCkiICAgICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgYWxsIGl0ZW1zIGZyb20gInMiICcKKyAgICAgICAgICAgICAnKHNhbWUgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJkZWwgJworICAgICAgICAgICAgICdzWzpdIikgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyBjb3B5IG9mICcKKyAgICAgICAgICAgICAnInMiICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoc2FtZSBhcyAnCisgICAgICAgICAgICAgJyJzWzpdIikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMuZXh0ZW5kKHQpIiBvciAicyArPSB0IiAgICAgIHwgZXh0ZW5kcyAqcyogd2l0aCB0aGUgY29udGVudHMgJworICAgICAgICAgICAgICdvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKnQqIChmb3IgdGhlIG1vc3QgcGFydCB0aGUgJworICAgICAgICAgICAgICdzYW1lICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgInNbbGVuKHMpOmxlbihzKV0gPSAnCisgICAgICAgICAgICAgJ3QiKSAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzICo9IG4iICAgICAgICAgICAgICAgICAgICAgICB8IHVwZGF0ZXMgKnMqIHdpdGggaXRzICcKKyAgICAgICAgICAgICAnY29udGVudHMgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGVhdGVkICpuKiAnCisgICAgICAgICAgICAgJ3RpbWVzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5pbnNlcnQoaSwgeCkiICAgICAgICAgICAgICAgfCBpbnNlcnRzICp4KiBpbnRvICpzKiBhdCAnCisgICAgICAgICAgICAgJ3RoZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbmRleCBnaXZlbiBieSAqaSogKHNhbWUgJworICAgICAgICAgICAgICdhcyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gJworICAgICAgICAgICAgICdbeF0iKSAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ3wgInMucG9wKFtpXSkiICAgICAgICAgICAgICAgICAgIHwgcmV0cmlldmVzIHRoZSBpdGVtIGF0ICppKiAnCisgICAgICAgICAgICAgJ2FuZCAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWxzbyByZW1vdmVzIGl0IGZyb20gJworICAgICAgICAgICAgICcqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICd8ICJzLnJlbW92ZSh4KSIgICAgICAgICAgICAgICAgICB8IHJlbW92ZSB0aGUgZmlyc3QgaXRlbSBmcm9tICcKKyAgICAgICAgICAgICAnKnMqICAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdoZXJlICJzW2ldID09ICcKKyAgICAgICAgICAgICAneCIgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAnfCAicy5yZXZlcnNlKCkiICAgICAgICAgICAgICAgICAgfCByZXZlcnNlcyB0aGUgaXRlbXMgb2YgKnMqICcKKyAgICAgICAgICAgICAnaW4gICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgJ3BsYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOb3RlczpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJzEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyByZXBsYWNpbmcuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcyLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgYnkgJworICAgICAgICAgICAgICdkZWZhdWx0XG4nCisgICAgICAgICAgICAgJyAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICczLiAicmVtb3ZlIiByYWlzZXMgIlZhbHVlRXJyb3IiIHdoZW4gKngqIGlzIG5vdCBmb3VuZCBpbiAqcyouXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICc0LiBUaGUgInJldmVyc2UoKSIgbWV0aG9kIG1vZGlmaWVzIHRoZSBzZXF1ZW5jZSBpbiBwbGFjZSBmb3JcbicKKyAgICAgICAgICAgICAnICAgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHJldmVyc2luZyBhIGxhcmdlIHNlcXVlbmNlLiAgVG8gcmVtaW5kICcKKyAgICAgICAgICAgICAndXNlcnNcbicKKyAgICAgICAgICAgICAnICAgdGhhdCBpdCBvcGVyYXRlcyBieSBzaWRlIGVmZmVjdCwgaXQgZG9lcyBub3QgcmV0dXJuIHRoZSAnCisgICAgICAgICAgICAgJ3JldmVyc2VkXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNS4gImNsZWFyKCkiIGFuZCAiY29weSgpIiBhcmUgaW5jbHVkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlXG4nCisgICAgICAgICAgICAgIiAgIGludGVyZmFjZXMgb2YgbXV0YWJsZSBjb250YWluZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBzbGljaW5nXG4iCisgICAgICAgICAgICAgJyAgIG9wZXJhdGlvbnMgKHN1Y2ggYXMgImRpY3QiIGFuZCAic2V0IilcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE5ldyBpbiB2ZXJzaW9uIDMuMzogImNsZWFyKCkiIGFuZCAiY29weSgpIiBtZXRob2RzLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnNi4gVGhlIHZhbHVlICpuKiBpcyBhbiBpbnRlZ2VyLCBvciBhbiBvYmplY3QgaW1wbGVtZW50aW5nXG4nCisgICAgICAgICAgICAgJyAgICJfX2luZGV4X18oKSIuICBaZXJvIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb2YgKm4qIGNsZWFyIHRoZSAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlLlxuJworICAgICAgICAgICAgICcgICBJdGVtcyBpbiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBjb3BpZWQ7IHRoZXkgYXJlIHJlZmVyZW5jZWQgJworICAgICAgICAgICAgICdtdWx0aXBsZVxuJworICAgICAgICAgICAgICcgICB0aW1lcywgYXMgZXhwbGFpbmVkIGZvciAicyAqIG4iIHVuZGVyIENvbW1vbiBTZXF1ZW5jZSAnCisgICAgICAgICAgICAgJ09wZXJhdGlvbnMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnTGlzdHNcbicKKyAgICAgICAgICAgICAnPT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ0xpc3RzIGFyZSBtdXRhYmxlIHNlcXVlbmNlcywgdHlwaWNhbGx5IHVzZWQgdG8gc3RvcmUgY29sbGVjdGlvbnMgJworICAgICAgICAgICAgICdvZlxuJworICAgICAgICAgICAgICdob21vZ2VuZW91cyBpdGVtcyAod2hlcmUgdGhlIHByZWNpc2UgZGVncmVlIG9mIHNpbWlsYXJpdHkgd2lsbCAnCisgICAgICAgICAgICAgJ3ZhcnkgYnlcbicKKyAgICAgICAgICAgICAnYXBwbGljYXRpb24pLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnY2xhc3MgbGlzdChbaXRlcmFibGVdKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlzdHMgbWF5IGJlIGNvbnN0cnVjdGVkIGluIHNldmVyYWwgd2F5czpcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogVXNpbmcgYSBwYWlyIG9mIHNxdWFyZSBicmFja2V0cyB0byBkZW5vdGUgdGhlIGVtcHR5IGxpc3Q6ICcKKyAgICAgICAgICAgICAnIltdIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyBzcXVhcmUgYnJhY2tldHMsIHNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6ICcKKyAgICAgICAgICAgICAnIlthXSIsXG4nCisgICAgICAgICAgICAgJyAgICAgIlthLCBiLCBjXSJcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICogVXNpbmcgYSBsaXN0IGNvbXByZWhlbnNpb246ICJbeCBmb3IgeCBpbiBpdGVyYWJsZV0iXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIHRoZSB0eXBlIGNvbnN0cnVjdG9yOiAibGlzdCgpIiBvciAibGlzdChpdGVyYWJsZSkiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBUaGUgY29uc3RydWN0b3IgYnVpbGRzIGEgbGlzdCB3aG9zZSBpdGVtcyBhcmUgdGhlIHNhbWUgYW5kIGluICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgIiAgIHNhbWUgb3JkZXIgYXMgKml0ZXJhYmxlKidzIGl0ZW1zLiAgKml0ZXJhYmxlKiBtYXkgYmUgZWl0aGVyICIKKyAgICAgICAgICAgICAnYVxuJworICAgICAgICAgICAgICcgICBzZXF1ZW5jZSwgYSBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuICcKKyAgICAgICAgICAgICAnaXRlcmF0b3JcbicKKyAgICAgICAgICAgICAnICAgb2JqZWN0LiAgSWYgKml0ZXJhYmxlKiBpcyBhbHJlYWR5IGEgbGlzdCwgYSBjb3B5IGlzIG1hZGUgYW5kXG4nCisgICAgICAgICAgICAgJyAgIHJldHVybmVkLCBzaW1pbGFyIHRvICJpdGVyYWJsZVs6XSIuIEZvciBleGFtcGxlLCAnCisgICAgICAgICAgICAgJyJsaXN0KFwnYWJjXCcpIlxuJworICAgICAgICAgICAgICcgICByZXR1cm5zICJbXCdhXCcsIFwnYlwnLCBcJ2NcJ10iIGFuZCAibGlzdCggKDEsIDIsIDMpICkiICcKKyAgICAgICAgICAgICAncmV0dXJucyAiWzEsIDIsXG4nCisgICAgICAgICAgICAgJyAgIDNdIi4gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3ICcKKyAgICAgICAgICAgICAnZW1wdHlcbicKKyAgICAgICAgICAgICAnICAgbGlzdCwgIltdIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIE1hbnkgb3RoZXIgb3BlcmF0aW9ucyBhbHNvIHByb2R1Y2UgbGlzdHMsIGluY2x1ZGluZyB0aGUgJworICAgICAgICAgICAgICcic29ydGVkKCkiXG4nCisgICAgICAgICAgICAgJyAgIGJ1aWx0LWluLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTGlzdHMgaW1wbGVtZW50IGFsbCBvZiB0aGUgY29tbW9uIGFuZCBtdXRhYmxlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAnb3BlcmF0aW9ucy5cbicKKyAgICAgICAgICAgICAnICAgTGlzdHMgYWxzbyBwcm92aWRlIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBtZXRob2Q6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzb3J0KCosIGtleT1Ob25lLCByZXZlcnNlPU5vbmUpXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGlzIG1ldGhvZCBzb3J0cyB0aGUgbGlzdCBpbiBwbGFjZSwgdXNpbmcgb25seSAiPCIgJworICAgICAgICAgICAgICdjb21wYXJpc29uc1xuJworICAgICAgICAgICAgICcgICAgICBiZXR3ZWVuIGl0ZW1zLiBFeGNlcHRpb25zIGFyZSBub3Qgc3VwcHJlc3NlZCAtIGlmIGFueSAnCisgICAgICAgICAgICAgJ2NvbXBhcmlzb25cbicKKyAgICAgICAgICAgICAnICAgICAgb3BlcmF0aW9ucyBmYWlsLCB0aGUgZW50aXJlIHNvcnQgb3BlcmF0aW9uIHdpbGwgZmFpbCAoYW5kICcKKyAgICAgICAgICAgICAndGhlXG4nCisgICAgICAgICAgICAgJyAgICAgIGxpc3Qgd2lsbCBsaWtlbHkgYmUgbGVmdCBpbiBhIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICAic29ydCgpIiBhY2NlcHRzIHR3byBhcmd1bWVudHMgdGhhdCBjYW4gb25seSBiZSBwYXNzZWQgYnlcbicKKyAgICAgICAgICAgICAnICAgICAga2V5d29yZCAoa2V5d29yZC1vbmx5IGFyZ3VtZW50cyk6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICAqa2V5KiBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkICcKKyAgICAgICAgICAgICAndG9cbicKKyAgICAgICAgICAgICAnICAgICAgZXh0cmFjdCBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQgKGZvciAnCisgICAgICAgICAgICAgJ2V4YW1wbGUsXG4nCisgICAgICAgICAgICAgJyAgICAgICJrZXk9c3RyLmxvd2VyIikuIFRoZSBrZXkgY29ycmVzcG9uZGluZyB0byBlYWNoIGl0ZW0gaW4gJworICAgICAgICAgICAgICd0aGUgbGlzdFxuJworICAgICAgICAgICAgICcgICAgICBpcyBjYWxjdWxhdGVkIG9uY2UgYW5kIHRoZW4gdXNlZCBmb3IgdGhlIGVudGlyZSBzb3J0aW5nICcKKyAgICAgICAgICAgICAncHJvY2Vzcy5cbicKKyAgICAgICAgICAgICAnICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgIk5vbmUiIG1lYW5zIHRoYXQgbGlzdCBpdGVtcyBhcmUgJworICAgICAgICAgICAgICdzb3J0ZWRcbicKKyAgICAgICAgICAgICAnICAgICAgZGlyZWN0bHkgd2l0aG91dCBjYWxjdWxhdGluZyBhIHNlcGFyYXRlIGtleSB2YWx1ZS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoZSAiZnVuY3Rvb2xzLmNtcF90b19rZXkoKSIgdXRpbGl0eSBpcyBhdmFpbGFibGUgdG8gJworICAgICAgICAgICAgICdjb252ZXJ0IGFcbicKKyAgICAgICAgICAgICAnICAgICAgMi54IHN0eWxlICpjbXAqIGZ1bmN0aW9uIHRvIGEgKmtleSogZnVuY3Rpb24uXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvICJUcnVlIiwgdGhlbiB0aGUgJworICAgICAgICAgICAgICdsaXN0XG4nCisgICAgICAgICAgICAgJyAgICAgIGVsZW1lbnRzIGFyZSBzb3J0ZWQgYXMgaWYgZWFjaCBjb21wYXJpc29uIHdlcmUgcmV2ZXJzZWQuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgZm9yIGVjb25vbXkgb2YgJworICAgICAgICAgICAgICdzcGFjZVxuJworICAgICAgICAgICAgICcgICAgICB3aGVuIHNvcnRpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvIHJlbWluZCB1c2VycyB0aGF0IGl0ICcKKyAgICAgICAgICAgICAnb3BlcmF0ZXNcbicKKyAgICAgICAgICAgICAnICAgICAgYnkgc2lkZSBlZmZlY3QsIGl0IGRvZXMgbm90IHJldHVybiB0aGUgc29ydGVkIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAnKHVzZVxuJworICAgICAgICAgICAgICcgICAgICAic29ydGVkKCkiIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBhIG5ldyBzb3J0ZWQgbGlzdCAnCisgICAgICAgICAgICAgJ2luc3RhbmNlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgIFRoZSAic29ydCgpIiBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZSBzdGFibGUuICBBIHNvcnQgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICcgICAgICBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8gY2hhbmdlIHRoZSByZWxhdGl2ZSBvcmRlciAnCisgICAgICAgICAgICAgJ29mXG4nCisgICAgICAgICAgICAgJyAgICAgIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbCAtLS0gdGhpcyBpcyBoZWxwZnVsIGZvciAnCisgICAgICAgICAgICAgJ3NvcnRpbmcgaW5cbicKKyAgICAgICAgICAgICAnICAgICAgbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LCB0aGVuIGJ5ICcKKyAgICAgICAgICAgICAnc2FsYXJ5XG4nCisgICAgICAgICAgICAgJyAgICAgIGdyYWRlKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgICAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogV2hpbGUgYSBsaXN0IGlzIGJlaW5nICcKKyAgICAgICAgICAgICAnc29ydGVkLFxuJworICAgICAgICAgICAgICcgICAgICB0aGUgZWZmZWN0IG9mIGF0dGVtcHRpbmcgdG8gbXV0YXRlLCBvciBldmVuIGluc3BlY3QsIHRoZSAnCisgICAgICAgICAgICAgJ2xpc3QgaXNcbicKKyAgICAgICAgICAgICAnICAgICAgdW5kZWZpbmVkLiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIG1ha2VzIHRoZSBsaXN0ICcKKyAgICAgICAgICAgICAnYXBwZWFyXG4nCisgICAgICAgICAgICAgJyAgICAgIGVtcHR5IGZvciB0aGUgZHVyYXRpb24sIGFuZCByYWlzZXMgIlZhbHVlRXJyb3IiIGlmIGl0IGNhbiAnCisgICAgICAgICAgICAgJ2RldGVjdFxuJworICAgICAgICAgICAgICcgICAgICB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUdXBsZXNcbicKKyAgICAgICAgICAgICAnPT09PT09XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdUdXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZXMsIHR5cGljYWxseSB1c2VkIHRvIHN0b3JlICcKKyAgICAgICAgICAgICAnY29sbGVjdGlvbnMgb2ZcbicKKyAgICAgICAgICAgICAnaGV0ZXJvZ2VuZW91cyBkYXRhIChzdWNoIGFzIHRoZSAyLXR1cGxlcyBwcm9kdWNlZCBieSB0aGUgJworICAgICAgICAgICAgICciZW51bWVyYXRlKCkiXG4nCisgICAgICAgICAgICAgJ2J1aWx0LWluKS4gVHVwbGVzIGFyZSBhbHNvIHVzZWQgZm9yIGNhc2VzIHdoZXJlIGFuIGltbXV0YWJsZSAnCisgICAgICAgICAgICAgJ3NlcXVlbmNlXG4nCisgICAgICAgICAgICAgJ29mIGhvbW9nZW5lb3VzIGRhdGEgaXMgbmVlZGVkIChzdWNoIGFzIGFsbG93aW5nIHN0b3JhZ2UgaW4gYSAnCisgICAgICAgICAgICAgJyJzZXQiIG9yXG4nCisgICAgICAgICAgICAgJyJkaWN0IiBpbnN0YW5jZSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjbGFzcyB0dXBsZShbaXRlcmFibGVdKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVHVwbGVzIG1heSBiZSBjb25zdHJ1Y3RlZCBpbiBhIG51bWJlciBvZiB3YXlzOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyBhIHBhaXIgb2YgcGFyZW50aGVzZXMgdG8gZGVub3RlIHRoZSBlbXB0eSB0dXBsZTogJworICAgICAgICAgICAgICciKCkiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFVzaW5nIGEgdHJhaWxpbmcgY29tbWEgZm9yIGEgc2luZ2xldG9uIHR1cGxlOiAiYSwiIG9yICcKKyAgICAgICAgICAgICAnIihhLCkiXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAqIFNlcGFyYXRpbmcgaXRlbXMgd2l0aCBjb21tYXM6ICJhLCBiLCBjIiBvciAiKGEsIGIsIGMpIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgKiBVc2luZyB0aGUgInR1cGxlKCkiIGJ1aWx0LWluOiAidHVwbGUoKSIgb3IgJworICAgICAgICAgICAgICcidHVwbGUoaXRlcmFibGUpIlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlIGNvbnN0cnVjdG9yIGJ1aWxkcyBhIHR1cGxlIHdob3NlIGl0ZW1zIGFyZSB0aGUgc2FtZSBhbmQgJworICAgICAgICAgICAgICdpbiB0aGVcbicKKyAgICAgICAgICAgICAiICAgc2FtZSBvcmRlciBhcyAqaXRlcmFibGUqJ3MgaXRlbXMuICAqaXRlcmFibGUqIG1heSBiZSBlaXRoZXIgIgorICAgICAgICAgICAgICdhXG4nCisgICAgICAgICAgICAgJyAgIHNlcXVlbmNlLCBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIGl0ZXJhdGlvbiwgb3IgYW4gJworICAgICAgICAgICAgICdpdGVyYXRvclxuJworICAgICAgICAgICAgICcgICBvYmplY3QuICBJZiAqaXRlcmFibGUqIGlzIGFscmVhZHkgYSB0dXBsZSwgaXQgaXMgcmV0dXJuZWRcbicKKyAgICAgICAgICAgICAnICAgdW5jaGFuZ2VkLiBGb3IgZXhhbXBsZSwgInR1cGxlKFwnYWJjXCcpIiByZXR1cm5zICIoXCdhXCcsICcKKyAgICAgICAgICAgICAnXCdiXCcsIFwnY1wnKSJcbicKKyAgICAgICAgICAgICAnICAgYW5kICJ0dXBsZSggWzEsIDIsIDNdICkiIHJldHVybnMgIigxLCAyLCAzKSIuIElmIG5vIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAnaXNcbicKKyAgICAgICAgICAgICAnICAgZ2l2ZW4sIHRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgbmV3IGVtcHR5IHR1cGxlLCAiKCkiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgTm90ZSB0aGF0IGl0IGlzIGFjdHVhbGx5IHRoZSBjb21tYSB3aGljaCBtYWtlcyBhIHR1cGxlLCBub3QgJworICAgICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAgICAnICAgcGFyZW50aGVzZXMuIFRoZSBwYXJlbnRoZXNlcyBhcmUgb3B0aW9uYWwsIGV4Y2VwdCBpbiB0aGUgJworICAgICAgICAgICAgICdlbXB0eVxuJworICAgICAgICAgICAgICcgICB0dXBsZSBjYXNlLCBvciB3aGVuIHRoZXkgYXJlIG5lZWRlZCB0byBhdm9pZCBzeW50YWN0aWMgJworICAgICAgICAgICAgICdhbWJpZ3VpdHkuXG4nCisgICAgICAgICAgICAgJyAgIEZvciBleGFtcGxlLCAiZihhLCBiLCBjKSIgaXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggdGhyZWUgJworICAgICAgICAgICAgICdhcmd1bWVudHMsXG4nCisgICAgICAgICAgICAgJyAgIHdoaWxlICJmKChhLCBiLCBjKSkiIGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgMy10dXBsZSBhcyB0aGUgJworICAgICAgICAgICAgICdzb2xlXG4nCisgICAgICAgICAgICAgJyAgIGFyZ3VtZW50LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVHVwbGVzIGltcGxlbWVudCBhbGwgb2YgdGhlIGNvbW1vbiBzZXF1ZW5jZSBvcGVyYXRpb25zLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnRm9yIGhldGVyb2dlbmVvdXMgY29sbGVjdGlvbnMgb2YgZGF0YSB3aGVyZSBhY2Nlc3MgYnkgbmFtZSBpcyAnCisgICAgICAgICAgICAgJ2NsZWFyZXJcbicKKyAgICAgICAgICAgICAndGhhbiBhY2Nlc3MgYnkgaW5kZXgsICJjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCkiIG1heSBiZSBhIG1vcmVcbicKKyAgICAgICAgICAgICAnYXBwcm9wcmlhdGUgY2hvaWNlIHRoYW4gYSBzaW1wbGUgdHVwbGUgb2JqZWN0LlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1Jhbmdlc1xuJworICAgICAgICAgICAgICc9PT09PT1cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSAicmFuZ2UiIHR5cGUgcmVwcmVzZW50cyBhbiBpbW11dGFibGUgc2VxdWVuY2Ugb2YgbnVtYmVycyBhbmQgJworICAgICAgICAgICAgICdpc1xuJworICAgICAgICAgICAgICdjb21tb25seSB1c2VkIGZvciBsb29waW5nIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHRpbWVzIGluICJmb3IiICcKKyAgICAgICAgICAgICAnbG9vcHMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdjbGFzcyByYW5nZShzdG9wKVxuJworICAgICAgICAgICAgICdjbGFzcyByYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgVGhlIGFyZ3VtZW50cyB0byB0aGUgcmFuZ2UgY29uc3RydWN0b3IgbXVzdCBiZSBpbnRlZ2VycyAnCisgICAgICAgICAgICAgJyhlaXRoZXJcbicKKyAgICAgICAgICAgICAnICAgYnVpbHQtaW4gImludCIgb3IgYW55IG9iamVjdCB0aGF0IGltcGxlbWVudHMgdGhlICJfX2luZGV4X18iXG4nCisgICAgICAgICAgICAgJyAgIHNwZWNpYWwgbWV0aG9kKS4gIElmIHRoZSAqc3RlcCogYXJndW1lbnQgaXMgb21pdHRlZCwgaXQgJworICAgICAgICAgICAgICdkZWZhdWx0cyB0b1xuJworICAgICAgICAgICAgICcgICAiMSIuIElmIHRoZSAqc3RhcnQqIGFyZ3VtZW50IGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICIwIi4gJworICAgICAgICAgICAgICdJZlxuJworICAgICAgICAgICAgICcgICAqc3RlcCogaXMgemVybywgIlZhbHVlRXJyb3IiIGlzIHJhaXNlZC5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEZvciBhIHBvc2l0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIGEgcmFuZ2UgInIiIGFyZSAnCisgICAgICAgICAgICAgJ2RldGVybWluZWRcbicKKyAgICAgICAgICAgICAnICAgYnkgdGhlIGZvcm11bGEgInJbaV0gPSBzdGFydCArIHN0ZXAqaSIgd2hlcmUgImkgPj0gMCIgYW5kICcKKyAgICAgICAgICAgICAnInJbaV0gPFxuJworICAgICAgICAgICAgICcgICBzdG9wIi5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIEZvciBhIG5lZ2F0aXZlICpzdGVwKiwgdGhlIGNvbnRlbnRzIG9mIHRoZSByYW5nZSBhcmUgc3RpbGxcbicKKyAgICAgICAgICAgICAnICAgZGV0ZXJtaW5lZCBieSB0aGUgZm9ybXVsYSAicltpXSA9IHN0YXJ0ICsgc3RlcCppIiwgYnV0IHRoZVxuJworICAgICAgICAgICAgICcgICBjb25zdHJhaW50cyBhcmUgImkgPj0gMCIgYW5kICJyW2ldID4gc3RvcCIuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBBIHJhbmdlIG9iamVjdCB3aWxsIGJlIGVtcHR5IGlmICJyWzBdIiBkb2VzIG5vdCBtZWV0IHRoZSAnCisgICAgICAgICAgICAgJ3ZhbHVlXG4nCisgICAgICAgICAgICAgJyAgIGNvbnN0cmFpbnQuIFJhbmdlcyBkbyBzdXBwb3J0IG5lZ2F0aXZlIGluZGljZXMsIGJ1dCB0aGVzZSAnCisgICAgICAgICAgICAgJ2FyZVxuJworICAgICAgICAgICAgICcgICBpbnRlcnByZXRlZCBhcyBpbmRleGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlICcKKyAgICAgICAgICAgICAnZGV0ZXJtaW5lZCBieVxuJworICAgICAgICAgICAgICcgICB0aGUgcG9zaXRpdmUgaW5kaWNlcy5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJyAgIFJhbmdlcyBjb250YWluaW5nIGFic29sdXRlIHZhbHVlcyBsYXJnZXIgdGhhbiAic3lzLm1heHNpemUiICcKKyAgICAgICAgICAgICAnYXJlXG4nCisgICAgICAgICAgICAgJyAgIHBlcm1pdHRlZCBidXQgc29tZSBmZWF0dXJlcyAoc3VjaCBhcyAibGVuKCkiKSBtYXkgcmFpc2VcbicKKyAgICAgICAgICAgICAnICAgIk92ZXJmbG93RXJyb3IiLlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUmFuZ2UgZXhhbXBsZXM6XG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdChyYW5nZSgxMCkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XVxuJworICAgICAgICAgICAgICcgICAgICA+Pj4gbGlzdChyYW5nZSgxLCAxMSkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMF1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMCwgMzAsIDUpKVxuJworICAgICAgICAgICAgICcgICAgICBbMCwgNSwgMTAsIDE1LCAyMCwgMjVdXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDAsIDEwLCAzKSlcbicKKyAgICAgICAgICAgICAnICAgICAgWzAsIDMsIDYsIDldXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDAsIC0xMCwgLTEpKVxuJworICAgICAgICAgICAgICcgICAgICBbMCwgLTEsIC0yLCAtMywgLTQsIC01LCAtNiwgLTcsIC04LCAtOV1cbicKKyAgICAgICAgICAgICAnICAgICAgPj4+IGxpc3QocmFuZ2UoMCkpXG4nCisgICAgICAgICAgICAgJyAgICAgIFtdXG4nCisgICAgICAgICAgICAgJyAgICAgID4+PiBsaXN0KHJhbmdlKDEsIDApKVxuJworICAgICAgICAgICAgICcgICAgICBbXVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgUmFuZ2VzIGltcGxlbWVudCBhbGwgb2YgdGhlIGNvbW1vbiBzZXF1ZW5jZSBvcGVyYXRpb25zICcKKyAgICAgICAgICAgICAnZXhjZXB0XG4nCisgICAgICAgICAgICAgJyAgIGNvbmNhdGVuYXRpb24gYW5kIHJlcGV0aXRpb24gKGR1ZSB0byB0aGUgZmFjdCB0aGF0IHJhbmdlICcKKyAgICAgICAgICAgICAnb2JqZWN0c1xuJworICAgICAgICAgICAgICcgICBjYW4gb25seSByZXByZXNlbnQgc2VxdWVuY2VzIHRoYXQgZm9sbG93IGEgc3RyaWN0IHBhdHRlcm4gJworICAgICAgICAgICAgICdhbmRcbicKKyAgICAgICAgICAgICAnICAgcmVwZXRpdGlvbiBhbmQgY29uY2F0ZW5hdGlvbiB3aWxsIHVzdWFsbHkgdmlvbGF0ZSB0aGF0ICcKKyAgICAgICAgICAgICAncGF0dGVybikuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzdGFydFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RhcnQqIHBhcmFtZXRlciAob3IgIjAiIGlmIHRoZSAnCisgICAgICAgICAgICAgJ3BhcmFtZXRlciB3YXNcbicKKyAgICAgICAgICAgICAnICAgICAgbm90IHN1cHBsaWVkKVxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgc3RvcFxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnICAgICAgVGhlIHZhbHVlIG9mIHRoZSAqc3RvcCogcGFyYW1ldGVyXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICBzdGVwXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICcgICAgICBUaGUgdmFsdWUgb2YgdGhlICpzdGVwKiBwYXJhbWV0ZXIgKG9yICIxIiBpZiB0aGUgcGFyYW1ldGVyICcKKyAgICAgICAgICAgICAnd2FzXG4nCisgICAgICAgICAgICAgJyAgICAgIG5vdCBzdXBwbGllZClcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1RoZSBhZHZhbnRhZ2Ugb2YgdGhlICJyYW5nZSIgdHlwZSBvdmVyIGEgcmVndWxhciAibGlzdCIgb3IgJworICAgICAgICAgICAgICcidHVwbGUiIGlzXG4nCisgICAgICAgICAgICAgJ3RoYXQgYSAicmFuZ2UiIG9iamVjdCB3aWxsIGFsd2F5cyB0YWtlIHRoZSBzYW1lIChzbWFsbCkgYW1vdW50ICcKKyAgICAgICAgICAgICAnb2ZcbicKKyAgICAgICAgICAgICAnbWVtb3J5LCBubyBtYXR0ZXIgdGhlIHNpemUgb2YgdGhlIHJhbmdlIGl0IHJlcHJlc2VudHMgKGFzIGl0ICcKKyAgICAgICAgICAgICAnb25seVxuJworICAgICAgICAgICAgICdzdG9yZXMgdGhlICJzdGFydCIsICJzdG9wIiBhbmQgInN0ZXAiIHZhbHVlcywgY2FsY3VsYXRpbmcgJworICAgICAgICAgICAgICdpbmRpdmlkdWFsXG4nCisgICAgICAgICAgICAgJ2l0ZW1zIGFuZCBzdWJyYW5nZXMgYXMgbmVlZGVkKS5cbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1JhbmdlIG9iamVjdHMgaW1wbGVtZW50IHRoZSAiY29sbGVjdGlvbnMuYWJjLlNlcXVlbmNlIiBBQkMsIGFuZFxuJworICAgICAgICAgICAgICdwcm92aWRlIGZlYXR1cmVzIHN1Y2ggYXMgY29udGFpbm1lbnQgdGVzdHMsIGVsZW1lbnQgaW5kZXggJworICAgICAgICAgICAgICdsb29rdXAsXG4nCisgICAgICAgICAgICAgJ3NsaWNpbmcgYW5kIHN1cHBvcnQgZm9yIG5lZ2F0aXZlIGluZGljZXMgKHNlZSBTZXF1ZW5jZSBUeXBlcyAtLS0gJworICAgICAgICAgICAgICdsaXN0LFxuJworICAgICAgICAgICAgICd0dXBsZSwgcmFuZ2UpOlxuJworICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAnPj4+IHIgPSByYW5nZSgwLCAyMCwgMilcbicKKyAgICAgICAgICAgICAnPj4+IHJcbicKKyAgICAgICAgICAgICAncmFuZ2UoMCwgMjAsIDIpXG4nCisgICAgICAgICAgICAgJz4+PiAxMSBpbiByXG4nCisgICAgICAgICAgICAgJ0ZhbHNlXG4nCisgICAgICAgICAgICAgJz4+PiAxMCBpbiByXG4nCisgICAgICAgICAgICAgJ1RydWVcbicKKyAgICAgICAgICAgICAnPj4+IHIuaW5kZXgoMTApXG4nCisgICAgICAgICAgICAgJzVcbicKKyAgICAgICAgICAgICAnPj4+IHJbNV1cbicKKyAgICAgICAgICAgICAnMTBcbicKKyAgICAgICAgICAgICAnPj4+IHJbOjVdXG4nCisgICAgICAgICAgICAgJ3JhbmdlKDAsIDEwLCAyKVxuJworICAgICAgICAgICAgICc+Pj4gclstMV1cbicKKyAgICAgICAgICAgICAnMThcbicKKyAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgJ1Rlc3RpbmcgcmFuZ2Ugb2JqZWN0cyBmb3IgZXF1YWxpdHkgd2l0aCAiPT0iIGFuZCAiIT0iIGNvbXBhcmVzICcKKyAgICAgICAgICAgICAndGhlbSBhc1xuJworICAgICAgICAgICAgICdzZXF1ZW5jZXMuICBUaGF0IGlzLCB0d28gcmFuZ2Ugb2JqZWN0cyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiAnCisgICAgICAgICAgICAgJ3RoZXlcbicKKyAgICAgICAgICAgICAncmVwcmVzZW50IHRoZSBzYW1lIHNlcXVlbmNlIG9mIHZhbHVlcy4gIChOb3RlIHRoYXQgdHdvIHJhbmdlICcKKyAgICAgICAgICAgICAnb2JqZWN0c1xuJworICAgICAgICAgICAgICd0aGF0IGNvbXBhcmUgZXF1YWwgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgInN0YXJ0IiwgInN0b3AiIGFuZCAnCisgICAgICAgICAgICAgJyJzdGVwIlxuJworICAgICAgICAgICAgICdhdHRyaWJ1dGVzLCBmb3IgZXhhbXBsZSAicmFuZ2UoMCkgPT0gcmFuZ2UoMiwgMSwgMykiIG9yICcKKyAgICAgICAgICAgICAnInJhbmdlKDAsIDMsXG4nCisgICAgICAgICAgICAgJzIpID09IHJhbmdlKDAsIDQsIDIpIi4pXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4yOiBJbXBsZW1lbnQgdGhlIFNlcXVlbmNlIEFCQy4gU3VwcG9ydCAnCisgICAgICAgICAgICAgJ3NsaWNpbmdcbicKKyAgICAgICAgICAgICAnYW5kIG5lZ2F0aXZlIGluZGljZXMuIFRlc3QgImludCIgb2JqZWN0cyBmb3IgbWVtYmVyc2hpcCBpbiAnCisgICAgICAgICAgICAgJ2NvbnN0YW50XG4nCisgICAgICAgICAgICAgJ3RpbWUgaW5zdGVhZCBvZiBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgaXRlbXMuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICJDaGFuZ2VkIGluIHZlcnNpb24gMy4zOiBEZWZpbmUgJz09JyBhbmQgJyE9JyB0byBjb21wYXJlIHJhbmdlICIKKyAgICAgICAgICAgICAnb2JqZWN0c1xuJworICAgICAgICAgICAgICdiYXNlZCBvbiB0aGUgc2VxdWVuY2Ugb2YgdmFsdWVzIHRoZXkgZGVmaW5lIChpbnN0ZWFkIG9mICcKKyAgICAgICAgICAgICAnY29tcGFyaW5nXG4nCisgICAgICAgICAgICAgJ2Jhc2VkIG9uIG9iamVjdCBpZGVudGl0eSkuXG4nCisgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICdOZXcgaW4gdmVyc2lvbiAzLjM6IFRoZSAic3RhcnQiLCAic3RvcCIgYW5kICJzdGVwIiBhdHRyaWJ1dGVzLlxuJywKKyAndHlwZXNzZXEtbXV0YWJsZSc6ICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdNdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG4nCisgICAgICAgICAgICAgICAgICAgICAnKioqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJ1RoZSBvcGVyYXRpb25zIGluIHRoZSBmb2xsb3dpbmcgdGFibGUgYXJlIGRlZmluZWQgb24gJworICAgICAgICAgICAgICAgICAgICAgJ211dGFibGUgc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICd0eXBlcy4gVGhlICJjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlIiBBQkMgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ3Byb3ZpZGVkIHRvIG1ha2VcbicKKyAgICAgICAgICAgICAgICAgICAgICdpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGltcGxlbWVudCB0aGVzZSBvcGVyYXRpb25zIG9uICcKKyAgICAgICAgICAgICAgICAgICAgICdjdXN0b20gc2VxdWVuY2VcbicKKyAgICAgICAgICAgICAgICAgICAgICd0eXBlcy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdJbiB0aGUgdGFibGUgKnMqIGlzIGFuIGluc3RhbmNlIG9mIGEgbXV0YWJsZSBzZXF1ZW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAndHlwZSwgKnQqIGlzIGFueVxuJworICAgICAgICAgICAgICAgICAgICAgJ2l0ZXJhYmxlIG9iamVjdCBhbmQgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgICAnbWVldHMgYW55IHR5cGUgYW5kXG4nCisgICAgICAgICAgICAgICAgICAgICAndmFsdWUgcmVzdHJpY3Rpb25zIGltcG9zZWQgYnkgKnMqIChmb3IgZXhhbXBsZSwgJworICAgICAgICAgICAgICAgICAgICAgJyJieXRlYXJyYXkiIG9ubHlcbicKKyAgICAgICAgICAgICAgICAgICAgICdhY2NlcHRzIGludGVnZXJzIHRoYXQgbWVldCB0aGUgdmFsdWUgcmVzdHJpY3Rpb24gIjAgPD0geCAnCisgICAgICAgICAgICAgICAgICAgICAnPD0gMjU1IikuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICAgICcrPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzW2ldID0geCIgICAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyAnCisgICAgICAgICAgICAgICAgICAgICAncmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAnKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzW2k6al0gPSB0IiAgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiAnCisgICAgICAgICAgICAgICAgICAgICAndG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgJworICAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgJworICAgICAgICAgICAgICAgICAgICAgJyp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJkZWwgc1tpOmpdIiAgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgInNbaTpqXSA9ICcKKyAgICAgICAgICAgICAgICAgICAgICdbXSIgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAic1tpOmo6a10gPSB0IiAgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgJworICAgICAgICAgICAgICAgICAgICAgJyJzW2k6ajprXSIgYXJlICAgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgJworICAgICAgICAgICAgICAgICAgICAgJyp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJkZWwgc1tpOmo6a10iICAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzICcKKyAgICAgICAgICAgICAgICAgICAgICdvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmo6a10iIGZyb20gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdsaXN0ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMuYXBwZW5kKHgpIiAgICAgICAgICAgICAgICAgIHwgYXBwZW5kcyAqeCogdG8gdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdlbmQgb2YgdGhlICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNlcXVlbmNlIChzYW1lICcKKyAgICAgICAgICAgICAgICAgICAgICdhcyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tsZW4ocyk6bGVuKHMpXSA9ICcKKyAgICAgICAgICAgICAgICAgICAgICdbeF0iKSAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMuY2xlYXIoKSIgICAgICAgICAgICAgICAgICAgIHwgcmVtb3ZlcyBhbGwgaXRlbXMgJworICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gInMiIChzYW1lIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFzICJkZWwgJworICAgICAgICAgICAgICAgICAgICAgJ3NbOl0iKSAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5jb3B5KCkiICAgICAgICAgICAgICAgICAgICAgfCBjcmVhdGVzIGEgc2hhbGxvdyAnCisgICAgICAgICAgICAgICAgICAgICAnY29weSBvZiAicyIgICAgfCAoNSkgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHNhbWUgYXMgJworICAgICAgICAgICAgICAgICAgICAgJyJzWzpdIikgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzLmV4dGVuZCh0KSIgb3IgInMgKz0gdCIgICAgICB8IGV4dGVuZHMgKnMqIHdpdGggdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250ZW50cyBvZiB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqdCogKGZvciB0aGUgbW9zdCAnCisgICAgICAgICAgICAgICAgICAgICAncGFydCB0aGUgc2FtZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXMgInNbbGVuKHMpOmxlbihzKV0gJworICAgICAgICAgICAgICAgICAgICAgJz0gdCIpICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzICo9IG4iICAgICAgICAgICAgICAgICAgICAgICB8IHVwZGF0ZXMgKnMqIHdpdGggaXRzICcKKyAgICAgICAgICAgICAgICAgICAgICdjb250ZW50cyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBlYXRlZCAqbiogJworICAgICAgICAgICAgICAgICAgICAgJ3RpbWVzICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMuaW5zZXJ0KGksIHgpIiAgICAgICAgICAgICAgIHwgaW5zZXJ0cyAqeCogaW50byAqcyogJworICAgICAgICAgICAgICAgICAgICAgJ2F0IHRoZSAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGluZGV4IGdpdmVuIGJ5ICppKiAnCisgICAgICAgICAgICAgICAgICAgICAnKHNhbWUgYXMgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAic1tpOmldID0gJworICAgICAgICAgICAgICAgICAgICAgJ1t4XSIpICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuJworICAgICAgICAgICAgICAgICAgICAgJ3wgInMucG9wKFtpXSkiICAgICAgICAgICAgICAgICAgIHwgcmV0cmlldmVzIHRoZSBpdGVtIGF0ICcKKyAgICAgICAgICAgICAgICAgICAgICcqaSogYW5kICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFsc28gcmVtb3ZlcyBpdCBmcm9tICcKKyAgICAgICAgICAgICAgICAgICAgICcqcyogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAicy5yZW1vdmUoeCkiICAgICAgICAgICAgICAgICAgfCByZW1vdmUgdGhlIGZpcnN0IGl0ZW0gJworICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gKnMqICAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxuJworICAgICAgICAgICAgICAgICAgICAgJ3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hlcmUgInNbaV0gPT0gJworICAgICAgICAgICAgICAgICAgICAgJ3giICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICd8ICJzLnJldmVyc2UoKSIgICAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAnCisgICAgICAgICAgICAgICAgICAgICAnKnMqIGluICAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG4nCisgICAgICAgICAgICAgICAgICAgICAnfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnCisgICAgICAgICAgICAgICAgICAgICAncGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgJ3xcbicKKyAgICAgICAgICAgICAgICAgICAgICcrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICdOb3RlczpcbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcxLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgJworICAgICAgICAgICAgICAgICAgICAgJ3JlcGxhY2luZy5cbicKKyAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICcyLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvICItMSIsIHNvIHRoYXQgJworICAgICAgICAgICAgICAgICAgICAgJ2J5IGRlZmF1bHRcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJzMuICJyZW1vdmUiIHJhaXNlcyAiVmFsdWVFcnJvciIgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICcKKyAgICAgICAgICAgICAgICAgICAgICcqcyouXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnNC4gVGhlICJyZXZlcnNlKCkiIG1ldGhvZCBtb2RpZmllcyB0aGUgc2VxdWVuY2UgaW4gcGxhY2UgJworICAgICAgICAgICAgICAgICAgICAgJ2ZvclxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiByZXZlcnNpbmcgYSBsYXJnZSBzZXF1ZW5jZS4gIFRvICcKKyAgICAgICAgICAgICAgICAgICAgICdyZW1pbmQgdXNlcnNcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICB0aGF0IGl0IG9wZXJhdGVzIGJ5IHNpZGUgZWZmZWN0LCBpdCBkb2VzIG5vdCByZXR1cm4gJworICAgICAgICAgICAgICAgICAgICAgJ3RoZSByZXZlcnNlZFxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHNlcXVlbmNlLlxuJworICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgJzUuICJjbGVhcigpIiBhbmQgImNvcHkoKSIgYXJlIGluY2x1ZGVkIGZvciBjb25zaXN0ZW5jeSAnCisgICAgICAgICAgICAgICAgICAgICAnd2l0aCB0aGVcbicKKyAgICAgICAgICAgICAgICAgICAgICIgICBpbnRlcmZhY2VzIG9mIG11dGFibGUgY29udGFpbmVycyB0aGF0IGRvbid0IHN1cHBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgJ3NsaWNpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgICcgICBvcGVyYXRpb25zIChzdWNoIGFzICJkaWN0IiBhbmQgInNldCIpXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgTmV3IGluIHZlcnNpb24gMy4zOiAiY2xlYXIoKSIgYW5kICJjb3B5KCkiIG1ldGhvZHMuXG4nCisgICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICAnNi4gVGhlIHZhbHVlICpuKiBpcyBhbiBpbnRlZ2VyLCBvciBhbiBvYmplY3QgJworICAgICAgICAgICAgICAgICAgICAgJ2ltcGxlbWVudGluZ1xuJworICAgICAgICAgICAgICAgICAgICAgJyAgICJfX2luZGV4X18oKSIuICBaZXJvIGFuZCBuZWdhdGl2ZSB2YWx1ZXMgb2YgKm4qIGNsZWFyICcKKyAgICAgICAgICAgICAgICAgICAgICd0aGUgc2VxdWVuY2UuXG4nCisgICAgICAgICAgICAgICAgICAgICAnICAgSXRlbXMgaW4gdGhlIHNlcXVlbmNlIGFyZSBub3QgY29waWVkOyB0aGV5IGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAncmVmZXJlbmNlZCBtdWx0aXBsZVxuJworICAgICAgICAgICAgICAgICAgICAgJyAgIHRpbWVzLCBhcyBleHBsYWluZWQgZm9yICJzICogbiIgdW5kZXIgQ29tbW9uIFNlcXVlbmNlICcKKyAgICAgICAgICAgICAgICAgICAgICdPcGVyYXRpb25zLlxuJywKKyAndW5hcnknOiAnXG4nCisgICAgICAgICAgJ1VuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9uc1xuJworICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0FsbCB1bmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSAnCisgICAgICAgICAgJ3ByaW9yaXR5OlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgdV9leHByIDo6PSBwb3dlciB8ICItIiB1X2V4cHIgfCAiKyIgdV9leHByIHwgIn4iIHVfZXhwclxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhlIHVuYXJ5ICItIiAobWludXMpIG9wZXJhdG9yIHlpZWxkcyB0aGUgbmVnYXRpb24gb2YgaXRzIG51bWVyaWNcbicKKyAgICAgICAgICAnYXJndW1lbnQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgdW5hcnkgIisiIChwbHVzKSBvcGVyYXRvciB5aWVsZHMgaXRzIG51bWVyaWMgYXJndW1lbnQgJworICAgICAgICAgICd1bmNoYW5nZWQuXG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICdUaGUgdW5hcnkgIn4iIChpbnZlcnQpIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBpbnZlcnNpb24gb2YgJworICAgICAgICAgICdpdHNcbicKKyAgICAgICAgICAnaW50ZWdlciBhcmd1bWVudC4gIFRoZSBiaXR3aXNlIGludmVyc2lvbiBvZiAieCIgaXMgZGVmaW5lZCBhc1xuJworICAgICAgICAgICciLSh4KzEpIi4gIEl0IG9ubHkgYXBwbGllcyB0byBpbnRlZ3JhbCBudW1iZXJzLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnSW4gYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVyIHR5cGUsICcKKyAgICAgICAgICAnYVxuJworICAgICAgICAgICciVHlwZUVycm9yIiBleGNlcHRpb24gaXMgcmFpc2VkLlxuJywKKyAnd2hpbGUnOiAnXG4nCisgICAgICAgICAgJ1RoZSAid2hpbGUiIHN0YXRlbWVudFxuJworICAgICAgICAgICcqKioqKioqKioqKioqKioqKioqKipcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ1RoZSAid2hpbGUiIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyBhblxuJworICAgICAgICAgICdleHByZXNzaW9uIGlzIHRydWU6XG4nCisgICAgICAgICAgJ1xuJworICAgICAgICAgICcgICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4nCisgICAgICAgICAgJyAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgZXhlY3V0ZXMgJworICAgICAgICAgICd0aGVcbicKKyAgICAgICAgICAnZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0ICcKKyAgICAgICAgICAndGltZVxuJworICAgICAgICAgICdpdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgImVsc2UiIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgJworICAgICAgICAgICdleGVjdXRlZFxuJworICAgICAgICAgICdhbmQgdGhlIGxvb3AgdGVybWluYXRlcy5cbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJ0EgImJyZWFrIiBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlICcKKyAgICAgICAgICAnbG9vcFxuJworICAgICAgICAgICd3aXRob3V0IGV4ZWN1dGluZyB0aGUgImVsc2UiIGNsYXVzZVwncyBzdWl0ZS4gIEEgImNvbnRpbnVlIiAnCisgICAgICAgICAgJ3N0YXRlbWVudFxuJworICAgICAgICAgICdleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZCBnb2VzICcKKyAgICAgICAgICAnYmFja1xuJworICAgICAgICAgICd0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuJywKKyAnd2l0aCc6ICdcbicKKyAgICAgICAgICdUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnVGhlICJ3aXRoIiBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG4nCisgICAgICAgICAnbWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiBXaXRoIFN0YXRlbWVudFxuJworICAgICAgICAgJ0NvbnRleHQgTWFuYWdlcnMpLiBUaGlzIGFsbG93cyBjb21tb24gInRyeSIuLi4iZXhjZXB0Ii4uLiJmaW5hbGx5IlxuJworICAgICAgICAgJ3VzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZCBmb3IgY29udmVuaWVudCByZXVzZS5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICB3aXRoX3N0bXQgOjo9ICJ3aXRoIiB3aXRoX2l0ZW0gKCIsIiB3aXRoX2l0ZW0pKiAiOiIgc3VpdGVcbicKKyAgICAgICAgICcgICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ1RoZSBleGVjdXRpb24gb2YgdGhlICJ3aXRoIiBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG4nCisgICAgICAgICAnZm9sbG93czpcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcxLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgIndpdGhfaXRlbSIpXG4nCisgICAgICAgICAnICAgaXMgZXZhbHVhdGVkIHRvIG9idGFpbiBhIGNvbnRleHQgbWFuYWdlci5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcyLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2V4aXRfXygpIiBpcyBsb2FkZWQgZm9yIGxhdGVyIHVzZS5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICczLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzICJfX2VudGVyX18oKSIgbWV0aG9kIGlzIGludm9rZWQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSAid2l0aCIgc3RhdGVtZW50LCB0aGUgcmV0dXJuXG4nCisgICAgICAgICAnICAgdmFsdWUgZnJvbSAiX19lbnRlcl9fKCkiIGlzIGFzc2lnbmVkIHRvIGl0LlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIE5vdGU6IFRoZSAid2l0aCIgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgIl9fZW50ZXJfXygpIlxuJworICAgICAgICAgJyAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiAiX19leGl0X18oKSIgd2lsbCBhbHdheXMgJworICAgICAgICAgJ2JlXG4nCisgICAgICAgICAnICAgICBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4nCisgICAgICAgICAnICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuJworICAgICAgICAgJyAgICAgd2l0aGluIHRoZSBzdWl0ZSB3b3VsZCBiZS4gU2VlIHN0ZXAgNiBiZWxvdy5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICc1LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG4nCisgICAgICAgICAnXG4nCisgICAgICAgICAnNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyAiX19leGl0X18oKSIgbWV0aG9kIGlzIGludm9rZWQuICBJZiBhblxuJworICAgICAgICAgJyAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbicKKyAgICAgICAgICcgICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gIl9fZXhpdF9fKCkiLiBPdGhlcndpc2UsICcKKyAgICAgICAgICd0aHJlZVxuJworICAgICAgICAgJyAgICJOb25lIiBhcmd1bWVudHMgYXJlIHN1cHBsaWVkLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuICcKKyAgICAgICAgICd2YWx1ZVxuJworICAgICAgICAgJyAgIGZyb20gdGhlICJfX2V4aXRfXygpIiBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzICcKKyAgICAgICAgICdyZXJhaXNlZC5cbicKKyAgICAgICAgICcgICBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzIHN1cHByZXNzZWQsIGFuZFxuJworICAgICAgICAgJyAgIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZyB0aGUgIndpdGgiXG4nCisgICAgICAgICAnICAgc3RhdGVtZW50LlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gYW4gZXhjZXB0aW9uLCAnCisgICAgICAgICAndGhlXG4nCisgICAgICAgICAnICAgcmV0dXJuIHZhbHVlIGZyb20gIl9fZXhpdF9fKCkiIGlzIGlnbm9yZWQsIGFuZCBleGVjdXRpb24gJworICAgICAgICAgJ3Byb2NlZWRzXG4nCisgICAgICAgICAnICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdXaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxuJworICAgICAgICAgJ211bHRpcGxlICJ3aXRoIiBzdGF0ZW1lbnRzIHdlcmUgbmVzdGVkOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuJworICAgICAgICAgJyAgICAgICBzdWl0ZVxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ2lzIGVxdWl2YWxlbnQgdG9cbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICcgICB3aXRoIEEoKSBhcyBhOlxuJworICAgICAgICAgJyAgICAgICB3aXRoIEIoKSBhcyBiOlxuJworICAgICAgICAgJyAgICAgICAgICAgc3VpdGVcbicKKyAgICAgICAgICdcbicKKyAgICAgICAgICdDaGFuZ2VkIGluIHZlcnNpb24gMy4xOiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJ1NlZSBhbHNvOlxuJworICAgICAgICAgJ1xuJworICAgICAgICAgJyAgKipQRVAgMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuJworICAgICAgICAgJyAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvbiAnCisgICAgICAgICAnIndpdGgiXG4nCisgICAgICAgICAnICAgICBzdGF0ZW1lbnQuXG4nLAorICd5aWVsZCc6ICdcbicKKyAgICAgICAgICAnVGhlICJ5aWVsZCIgc3RhdGVtZW50XG4nCisgICAgICAgICAgJyoqKioqKioqKioqKioqKioqKioqKlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgeWllbGRfc3RtdCA6Oj0geWllbGRfZXhwcmVzc2lvblxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnQSAieWllbGQiIHN0YXRlbWVudCBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byBhIHlpZWxkICcKKyAgICAgICAgICAnZXhwcmVzc2lvbi5cbicKKyAgICAgICAgICAnVGhlIHlpZWxkIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBvbWl0IHRoZSBwYXJlbnRoZXNlcyB0aGF0IHdvdWxkXG4nCisgICAgICAgICAgJ290aGVyd2lzZSBiZSByZXF1aXJlZCBpbiB0aGUgZXF1aXZhbGVudCB5aWVsZCBleHByZXNzaW9uICcKKyAgICAgICAgICAnc3RhdGVtZW50LlxuJworICAgICAgICAgICdGb3IgZXhhbXBsZSwgdGhlIHlpZWxkIHN0YXRlbWVudHNcbicKKyAgICAgICAgICAnXG4nCisgICAgICAgICAgJyAgIHlpZWxkIDxleHByPlxuJworICAgICAgICAgICcgICB5aWVsZCBmcm9tIDxleHByPlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnYXJlIGVxdWl2YWxlbnQgdG8gdGhlIHlpZWxkIGV4cHJlc3Npb24gc3RhdGVtZW50c1xuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnICAgKHlpZWxkIDxleHByPilcbicKKyAgICAgICAgICAnICAgKHlpZWxkIGZyb20gPGV4cHI+KVxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnWWllbGQgZXhwcmVzc2lvbnMgYW5kIHN0YXRlbWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGRlZmluaW5nIGFcbicKKyAgICAgICAgICAnKmdlbmVyYXRvciogZnVuY3Rpb24sIGFuZCBhcmUgb25seSB1c2VkIGluIHRoZSBib2R5IG9mIHRoZSAnCisgICAgICAgICAgJ2dlbmVyYXRvclxuJworICAgICAgICAgICdmdW5jdGlvbi4gIFVzaW5nIHlpZWxkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBzdWZmaWNpZW50IHRvICcKKyAgICAgICAgICAnY2F1c2VcbicKKyAgICAgICAgICAndGhhdCBkZWZpbml0aW9uIHRvIGNyZWF0ZSBhIGdlbmVyYXRvciBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEgbm9ybWFsXG4nCisgICAgICAgICAgJ2Z1bmN0aW9uLlxuJworICAgICAgICAgICdcbicKKyAgICAgICAgICAnRm9yIGZ1bGwgZGV0YWlscyBvZiAieWllbGQiIHNlbWFudGljcywgcmVmZXIgdG8gdGhlIFlpZWxkICcKKyAgICAgICAgICAnZXhwcmVzc2lvbnNcbicKKyAgICAgICAgICAnc2VjdGlvbi5cbid9CmRpZmYgLS1naXQgYS9MaWIvcmFuZG9tLnB5IGIvTGliL3JhbmRvbS5weQppbmRleCA1OTUwNzM1Li4xY2ZmYjBhIDEwMDY0NAotLS0gYS9MaWIvcmFuZG9tLnB5CisrKyBiL0xpYi9yYW5kb20ucHkKQEAgLTYwNiwxMSArNjA2LDExIEBACiAKICAgICAgICAgIyBUaGlzIHZlcnNpb24gZHVlIHRvIEphbm5lIFNpbmtrb25lbiwgYW5kIG1hdGNoZXMgYWxsIHRoZSBzdGQKICAgICAgICAgIyB0ZXh0cyAoZS5nLiwgS251dGggVm9sIDIgRWQgMyBwZyAxMzQgInRoZSBiZXRhIGRpc3RyaWJ1dGlvbiIpLgotICAgICAgICB5ID0gc2VsZi5nYW1tYXZhcmlhdGUoYWxwaGEsIDEuKQorICAgICAgICB5ID0gc2VsZi5nYW1tYXZhcmlhdGUoYWxwaGEsIDEuMCkKICAgICAgICAgaWYgeSA9PSAwOgogICAgICAgICAgICAgcmV0dXJuIDAuMAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHkgLyAoeSArIHNlbGYuZ2FtbWF2YXJpYXRlKGJldGEsIDEuKSkKKyAgICAgICAgICAgIHJldHVybiB5IC8gKHkgKyBzZWxmLmdhbW1hdmFyaWF0ZShiZXRhLCAxLjApKQogCiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJldG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvTGliL3JlLnB5IGIvTGliL3JlLnB5CmluZGV4IGRkZTg5MDEuLjY2MTkyOWUgMTAwNjQ0Ci0tLSBhL0xpYi9yZS5weQorKysgYi9MaWIvcmUucHkKQEAgLTExOSw3ICsxMTksNiBAQAogCiAiIiIKIAotaW1wb3J0IHN5cwogaW1wb3J0IHNyZV9jb21waWxlCiBpbXBvcnQgc3JlX3BhcnNlCiB0cnk6CmRpZmYgLS1naXQgYS9MaWIvcmxjb21wbGV0ZXIucHkgYi9MaWIvcmxjb21wbGV0ZXIucHkKaW5kZXggNDAxYTYyNi4uYmNhNGE3YiAxMDA2NDQKLS0tIGEvTGliL3JsY29tcGxldGVyLnB5CisrKyBiL0xpYi9ybGNvbXBsZXRlci5weQpAQCAtMTEzLDYgKzExMywxMiBAQAogICAgICAgICBmb3Igd29yZCBpbiBrZXl3b3JkLmt3bGlzdDoKICAgICAgICAgICAgIGlmIHdvcmRbOm5dID09IHRleHQ6CiAgICAgICAgICAgICAgICAgc2Vlbi5hZGQod29yZCkKKyAgICAgICAgICAgICAgICBpZiB3b3JkIGluIHsnZmluYWxseScsICd0cnknfToKKyAgICAgICAgICAgICAgICAgICAgd29yZCA9IHdvcmQgKyAnOicKKyAgICAgICAgICAgICAgICBlbGlmIHdvcmQgbm90IGluIHsnRmFsc2UnLCAnTm9uZScsICdUcnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnJlYWsnLCAnY29udGludWUnLCAncGFzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vsc2UnfToKKyAgICAgICAgICAgICAgICAgICAgd29yZCA9IHdvcmQgKyAnICcKICAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCh3b3JkKQogICAgICAgICBmb3IgbnNwYWNlIGluIFtzZWxmLm5hbWVzcGFjZSwgYnVpbHRpbnMuX19kaWN0X19dOgogICAgICAgICAgICAgZm9yIHdvcmQsIHZhbCBpbiBuc3BhY2UuaXRlbXMoKToKQEAgLTE1MiwxNCArMTU4LDMwIEBACiAgICAgICAgICAgICB3b3Jkcy51cGRhdGUoZ2V0X2NsYXNzX21lbWJlcnModGhpc29iamVjdC5fX2NsYXNzX18pKQogICAgICAgICBtYXRjaGVzID0gW10KICAgICAgICAgbiA9IGxlbihhdHRyKQotICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKLSAgICAgICAgICAgIGlmIHdvcmRbOm5dID09IGF0dHI6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHRoaXNvYmplY3QsIHdvcmQpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUgICMgRXhjbHVkZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBzZXQKLSAgICAgICAgICAgICAgICB3b3JkID0gc2VsZi5fY2FsbGFibGVfcG9zdGZpeCh2YWwsICIlcy4lcyIgJSAoZXhwciwgd29yZCkpCi0gICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQod29yZCkKKyAgICAgICAgaWYgYXR0ciA9PSAnJzoKKyAgICAgICAgICAgIG5vcHJlZml4ID0gJ18nCisgICAgICAgIGVsaWYgYXR0ciA9PSAnXyc6CisgICAgICAgICAgICBub3ByZWZpeCA9ICdfXycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5vcHJlZml4ID0gTm9uZQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CisgICAgICAgICAgICAgICAgaWYgKHdvcmRbOm5dID09IGF0dHIgYW5kCisgICAgICAgICAgICAgICAgICAgIG5vdCAobm9wcmVmaXggYW5kIHdvcmRbOm4rMV0gPT0gbm9wcmVmaXgpKToKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAiJXMuJXMiICUgKGV4cHIsIHdvcmQpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIodGhpc29iamVjdCwgd29yZCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgICMgSW5jbHVkZSBldmVuIGlmIGF0dHJpYnV0ZSBub3Qgc2V0CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHNlbGYuX2NhbGxhYmxlX3Bvc3RmaXgodmFsLCBtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQobWF0Y2gpCisgICAgICAgICAgICBpZiBtYXRjaGVzIG9yIG5vdCBub3ByZWZpeDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm9wcmVmaXggPT0gJ18nOgorICAgICAgICAgICAgICAgIG5vcHJlZml4ID0gJ19fJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub3ByZWZpeCA9IE5vbmUKICAgICAgICAgbWF0Y2hlcy5zb3J0KCkKICAgICAgICAgcmV0dXJuIG1hdGNoZXMKIApkaWZmIC0tZ2l0IGEvTGliL3J1bnB5LnB5IGIvTGliL3J1bnB5LnB5CmluZGV4IGFmNjIwNWQuLjZiNmZjMjQgMTAwNjQ0Ci0tLSBhL0xpYi9ydW5weS5weQorKysgYi9MaWIvcnVucHkucHkKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAjIG1heSBiZSBjbGVhcmVkIHdoZW4gdGhlIHRlbXBvcmFyeSBtb2R1bGUgZ29lcyBhd2F5CiAgICAgcmV0dXJuIG1vZF9nbG9iYWxzLmNvcHkoKQogCi0jIEhlbHBlciB0byBnZXQgdGhlIGxvYWRlciwgY29kZSBhbmQgZmlsZW5hbWUgZm9yIGEgbW9kdWxlCisjIEhlbHBlciB0byBnZXQgdGhlIGZ1bGwgbmFtZSwgc3BlYyBhbmQgY29kZSBmb3IgYSBtb2R1bGUKIGRlZiBfZ2V0X21vZHVsZV9kZXRhaWxzKG1vZF9uYW1lLCBlcnJvcj1JbXBvcnRFcnJvcik6CiAgICAgaWYgbW9kX25hbWUuc3RhcnRzd2l0aCgiLiIpOgogICAgICAgICByYWlzZSBlcnJvcigiUmVsYXRpdmUgbW9kdWxlIG5hbWVzIG5vdCBzdXBwb3J0ZWQiKQpAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgICAgIHJldHVybiBfcnVuX21vZHVsZV9jb2RlKGNvZGUsIGluaXRfZ2xvYmFscywgcnVuX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrZ19uYW1lPXBrZ19uYW1lLCBzY3JpcHRfbmFtZT1mbmFtZSkKICAgICBlbHNlOgotICAgICAgICAjIEltcG9ydGVyIGlzIGRlZmluZWQgZm9yIHBhdGgsIHNvIGFkZCBpdCB0bworICAgICAgICAjIEZpbmRlciBpcyBkZWZpbmVkIGZvciBwYXRoLCBzbyBhZGQgaXQgdG8KICAgICAgICAgIyB0aGUgc3RhcnQgb2Ygc3lzLnBhdGgKICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGhfbmFtZSkKICAgICAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3NjaGVkLnB5IGIvTGliL3NjaGVkLnB5CmluZGV4IGI0NzY0OGQuLmJkN2MwZjEgMTAwNjQ0Ci0tLSBhL0xpYi9zY2hlZC5weQorKysgYi9MaWIvc2NoZWQucHkKQEAgLTQ2LDYgKzQ2LDE3IEBACiAgICAgZGVmIF9fZ3RfXyhzLCBvKTogcmV0dXJuIChzLnRpbWUsIHMucHJpb3JpdHkpID4gIChvLnRpbWUsIG8ucHJpb3JpdHkpCiAgICAgZGVmIF9fZ2VfXyhzLCBvKTogcmV0dXJuIChzLnRpbWUsIHMucHJpb3JpdHkpID49IChvLnRpbWUsIG8ucHJpb3JpdHkpCiAKK0V2ZW50LnRpbWUuX19kb2NfXyA9ICgnJydOdW1lcmljIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCit0aW1lZnVuYyBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLicnJykKK0V2ZW50LnByaW9yaXR5Ll9fZG9jX18gPSAoJycnRXZlbnRzIHNjaGVkdWxlZCBmb3IgdGhlIHNhbWUgdGltZSB3aWxsIGJlIGV4ZWN1dGVkCitpbiB0aGUgb3JkZXIgb2YgdGhlaXIgcHJpb3JpdHkuJycnKQorRXZlbnQuYWN0aW9uLl9fZG9jX18gPSAoJycnRXhlY3V0aW5nIHRoZSBldmVudCBtZWFucyBleGVjdXRpbmcKK2FjdGlvbigqYXJndW1lbnQsICoqa3dhcmdzKScnJykKK0V2ZW50LmFyZ3VtZW50Ll9fZG9jX18gPSAoJycnYXJndW1lbnQgaXMgYSBzZXF1ZW5jZSBob2xkaW5nIHRoZSBwb3NpdGlvbmFsCithcmd1bWVudHMgZm9yIHRoZSBhY3Rpb24uJycnKQorRXZlbnQua3dhcmdzLl9fZG9jX18gPSAoJycna3dhcmdzIGlzIGEgZGljdGlvbmFyeSBob2xkaW5nIHRoZSBrZXl3b3JkCithcmd1bWVudHMgZm9yIHRoZSBhY3Rpb24uJycnKQorCiBfc2VudGluZWwgPSBvYmplY3QoKQogCiBjbGFzcyBzY2hlZHVsZXI6CmRpZmYgLS1naXQgYS9MaWIvc2VjcmV0cy5weSBiL0xpYi9zZWNyZXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZmE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2VjcmV0cy5weQpAQCAtMCwwICsxLDcxIEBACisiIiJHZW5lcmF0ZSBjcnlwdG9ncmFwaGljYWxseSBzdHJvbmcgcHNldWRvLXJhbmRvbSBudW1iZXJzIHN1aXRhYmxlIGZvcgorbWFuYWdpbmcgc2VjcmV0cyBzdWNoIGFzIGFjY291bnQgYXV0aGVudGljYXRpb24sIHRva2VucywgYW5kIHNpbWlsYXIuCisKK1NlZSBQRVAgNTA2IGZvciBtb3JlIGluZm9ybWF0aW9uLgoraHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDUwNi8KKworIiIiCisKK19fYWxsX18gPSBbJ2Nob2ljZScsICdyYW5kYmVsb3cnLCAncmFuZGJpdHMnLCAnU3lzdGVtUmFuZG9tJywKKyAgICAgICAgICAgJ3Rva2VuX2J5dGVzJywgJ3Rva2VuX2hleCcsICd0b2tlbl91cmxzYWZlJywKKyAgICAgICAgICAgJ2NvbXBhcmVfZGlnZXN0JywKKyAgICAgICAgICAgXQorCisKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBiaW5hc2NpaQoraW1wb3J0IG9zCisKK2Zyb20gaG1hYyBpbXBvcnQgY29tcGFyZV9kaWdlc3QKK2Zyb20gcmFuZG9tIGltcG9ydCBTeXN0ZW1SYW5kb20KKworX3N5c3JhbmQgPSBTeXN0ZW1SYW5kb20oKQorCityYW5kYml0cyA9IF9zeXNyYW5kLmdldHJhbmRiaXRzCitjaG9pY2UgPSBfc3lzcmFuZC5jaG9pY2UKKworZGVmIHJhbmRiZWxvdyhleGNsdXNpdmVfdXBwZXJfYm91bmQpOgorICAgICIiIlJldHVybiBhIHJhbmRvbSBpbnQgaW4gdGhlIHJhbmdlIFswLCBuKS4iIiIKKyAgICByZXR1cm4gX3N5c3JhbmQuX3JhbmRiZWxvdyhleGNsdXNpdmVfdXBwZXJfYm91bmQpCisKK0RFRkFVTFRfRU5UUk9QWSA9IDMyICAjIG51bWJlciBvZiBieXRlcyB0byByZXR1cm4gYnkgZGVmYXVsdAorCitkZWYgdG9rZW5fYnl0ZXMobmJ5dGVzPU5vbmUpOgorICAgICIiIlJldHVybiBhIHJhbmRvbSBieXRlIHN0cmluZyBjb250YWluaW5nICpuYnl0ZXMqIGJ5dGVzLgorCisgICAgSWYgKm5ieXRlcyogaXMgYGBOb25lYGAgb3Igbm90IHN1cHBsaWVkLCBhIHJlYXNvbmFibGUKKyAgICBkZWZhdWx0IGlzIHVzZWQuCisKKyAgICA+Pj4gdG9rZW5fYnl0ZXMoMTYpICAjZG9jdGVzdDorU0tJUAorICAgIGInXFx4ZWJyXFx4MTdEKnRcXHhhZVxceGQ0XFx4ZTNTXFx4YjZcXHhlMlxceGViUDFcXHg4YicKKworICAgICIiIgorICAgIGlmIG5ieXRlcyBpcyBOb25lOgorICAgICAgICBuYnl0ZXMgPSBERUZBVUxUX0VOVFJPUFkKKyAgICByZXR1cm4gb3MudXJhbmRvbShuYnl0ZXMpCisKK2RlZiB0b2tlbl9oZXgobmJ5dGVzPU5vbmUpOgorICAgICIiIlJldHVybiBhIHJhbmRvbSB0ZXh0IHN0cmluZywgaW4gaGV4YWRlY2ltYWwuCisKKyAgICBUaGUgc3RyaW5nIGhhcyAqbmJ5dGVzKiByYW5kb20gYnl0ZXMsIGVhY2ggYnl0ZSBjb252ZXJ0ZWQgdG8gdHdvCisgICAgaGV4IGRpZ2l0cy4gIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgIG9yIG5vdCBzdXBwbGllZCwgYSByZWFzb25hYmxlCisgICAgZGVmYXVsdCBpcyB1c2VkLgorCisgICAgPj4+IHRva2VuX2hleCgxNikgICNkb2N0ZXN0OitTS0lQCisgICAgJ2Y5YmY3OGI5YTE4Y2U2ZDQ2YTBjZDJiMGI4NmRmOWRhJworCisgICAgIiIiCisgICAgcmV0dXJuIGJpbmFzY2lpLmhleGxpZnkodG9rZW5fYnl0ZXMobmJ5dGVzKSkuZGVjb2RlKCdhc2NpaScpCisKK2RlZiB0b2tlbl91cmxzYWZlKG5ieXRlcz1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSByYW5kb20gVVJMLXNhZmUgdGV4dCBzdHJpbmcsIGluIEJhc2U2NCBlbmNvZGluZy4KKworICAgIFRoZSBzdHJpbmcgaGFzICpuYnl0ZXMqIHJhbmRvbSBieXRlcy4gIElmICpuYnl0ZXMqIGlzIGBgTm9uZWBgCisgICAgb3Igbm90IHN1cHBsaWVkLCBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLgorCisgICAgPj4+IHRva2VuX3VybHNhZmUoMTYpICAjZG9jdGVzdDorU0tJUAorICAgICdEcm1oemU2RVBjdjBmTl84MUJqLW5BJworCisgICAgIiIiCisgICAgdG9rID0gdG9rZW5fYnl0ZXMobmJ5dGVzKQorICAgIHJldHVybiBiYXNlNjQudXJsc2FmZV9iNjRlbmNvZGUodG9rKS5yc3RyaXAoYic9JykuZGVjb2RlKCdhc2NpaScpCmRpZmYgLS1naXQgYS9MaWIvc2h1dGlsLnB5IGIvTGliL3NodXRpbC5weQppbmRleCAzNzEyNGEwLi5iMTk1M2NjIDEwMDY0NAotLS0gYS9MaWIvc2h1dGlsLnB5CisrKyBiL0xpYi9zaHV0aWwucHkKQEAgLTk3NCw2ICs5NzQsOSBAQAogCiAgICAgX19hbGxfXy5hcHBlbmQoJ2Rpc2tfdXNhZ2UnKQogICAgIF9udHVwbGVfZGlza3VzYWdlID0gY29sbGVjdGlvbnMubmFtZWR0dXBsZSgndXNhZ2UnLCAndG90YWwgdXNlZCBmcmVlJykKKyAgICBfbnR1cGxlX2Rpc2t1c2FnZS50b3RhbC5fX2RvY19fID0gJ1RvdGFsIHNwYWNlIGluIGJ5dGVzJworICAgIF9udHVwbGVfZGlza3VzYWdlLnVzZWQuX19kb2NfXyA9ICdVc2VkIHNwYWNlIGluIGJ5dGVzJworICAgIF9udHVwbGVfZGlza3VzYWdlLmZyZWUuX19kb2NfXyA9ICdGcmVlIHNwYWNlIGluIGJ5dGVzJwogCiAgICAgZGVmIGRpc2tfdXNhZ2UocGF0aCk6CiAgICAgICAgICIiIlJldHVybiBkaXNrIHVzYWdlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGdpdmVuIHBhdGguCmRpZmYgLS1naXQgYS9MaWIvc2l0ZS1wYWNrYWdlcy9SRUFETUUudHh0IGIvTGliL3NpdGUtcGFja2FnZXMvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzNmNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NpdGUtcGFja2FnZXMvUkVBRE1FLnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgZGlyZWN0b3J5IGV4aXN0cyBzbyB0aGF0IDNyZCBwYXJ0eSBwYWNrYWdlcyBjYW4gYmUgaW5zdGFsbGVkCitoZXJlLiAgUmVhZCB0aGUgc291cmNlIGZvciBzaXRlLnB5IGZvciBtb3JlIGRldGFpbHMuCmRpZmYgLS1naXQgYS9MaWIvc2l0ZS5weSBiL0xpYi9zaXRlLnB5CmluZGV4IDNmNzhlZjUuLmE4NGUzYmIgMTAwNjQ0Ci0tLSBhL0xpYi9zaXRlLnB5CisrKyBiL0xpYi9zaXRlLnB5CkBAIC0xMzEsMTMgKzEzMSwxMyBAQAogCiAKIGRlZiBfaW5pdF9wYXRoaW5mbygpOgotICAgICIiIlJldHVybiBhIHNldCBjb250YWluaW5nIGFsbCBleGlzdGluZyBkaXJlY3RvcnkgZW50cmllcyBmcm9tIHN5cy5wYXRoIiIiCisgICAgIiIiUmV0dXJuIGEgc2V0IGNvbnRhaW5pbmcgYWxsIGV4aXN0aW5nIGZpbGUgc3lzdGVtIGl0ZW1zIGZyb20gc3lzLnBhdGguIiIiCiAgICAgZCA9IHNldCgpCi0gICAgZm9yIGRpciBpbiBzeXMucGF0aDoKKyAgICBmb3IgaXRlbSBpbiBzeXMucGF0aDoKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXIpOgotICAgICAgICAgICAgICAgIGRpciwgZGlyY2FzZSA9IG1ha2VwYXRoKGRpcikKLSAgICAgICAgICAgICAgICBkLmFkZChkaXJjYXNlKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaXRlbSk6CisgICAgICAgICAgICAgICAgXywgaXRlbWNhc2UgPSBtYWtlcGF0aChpdGVtKQorICAgICAgICAgICAgICAgIGQuYWRkKGl0ZW1jYXNlKQogICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgY29udGludWUKICAgICByZXR1cm4gZApAQCAtMTUwLDkgKzE1MCw5IEBACiAgICAgIiIiCiAgICAgaWYga25vd25fcGF0aHMgaXMgTm9uZToKICAgICAgICAga25vd25fcGF0aHMgPSBfaW5pdF9wYXRoaW5mbygpCi0gICAgICAgIHJlc2V0ID0gMQorICAgICAgICByZXNldCA9IFRydWUKICAgICBlbHNlOgotICAgICAgICByZXNldCA9IDAKKyAgICAgICAgcmVzZXQgPSBGYWxzZQogICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHNpdGVkaXIsIG5hbWUpCiAgICAgdHJ5OgogICAgICAgICBmID0gb3BlbihmdWxsbmFtZSwgInIiKQpAQCAtMTkwLDkgKzE5MCw5IEBACiAgICAgJ3NpdGVkaXInIiIiCiAgICAgaWYga25vd25fcGF0aHMgaXMgTm9uZToKICAgICAgICAga25vd25fcGF0aHMgPSBfaW5pdF9wYXRoaW5mbygpCi0gICAgICAgIHJlc2V0ID0gMQorICAgICAgICByZXNldCA9IFRydWUKICAgICBlbHNlOgotICAgICAgICByZXNldCA9IDAKKyAgICAgICAgcmVzZXQgPSBGYWxzZQogICAgIHNpdGVkaXIsIHNpdGVkaXJjYXNlID0gbWFrZXBhdGgoc2l0ZWRpcikKICAgICBpZiBub3Qgc2l0ZWRpcmNhc2UgaW4ga25vd25fcGF0aHM6CiAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChzaXRlZGlyKSAgICAgICAgIyBBZGQgcGF0aCBjb21wb25lbnQKQEAgLTMwNCw3ICszMDQsNyBAQAogCiAgICAgICAgIGlmIG9zLnNlcCA9PSAnLyc6CiAgICAgICAgICAgICBzaXRlcGFja2FnZXMuYXBwZW5kKG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24lZC4lZCIgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l0ZS1wYWNrYWdlcyIpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZChwcmVmaXgpCkBAIC0zMTcsNyArMzE3LDcgQEAKICAgICAgICAgICAgIGlmIGZyYW1ld29yazoKICAgICAgICAgICAgICAgICBzaXRlcGFja2FnZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKCIvTGlicmFyeSIsIGZyYW1ld29yaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10sICJzaXRlLXBhY2thZ2VzIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLCAic2l0ZS1wYWNrYWdlcyIpKQogICAgIHJldHVybiBzaXRlcGFja2FnZXMKIAogZGVmIGFkZHNpdGVwYWNrYWdlcyhrbm93bl9wYXRocywgcHJlZml4ZXM9Tm9uZSk6CkBAIC01MDQsOSArNTA0LDEzIEBACiBkZWYgZXhlY3NpdGVjdXN0b21pemUoKToKICAgICAiIiJSdW4gY3VzdG9tIHNpdGUgc3BlY2lmaWMgY29kZSwgaWYgYXZhaWxhYmxlLiIiIgogICAgIHRyeToKLSAgICAgICAgaW1wb3J0IHNpdGVjdXN0b21pemUKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHNpdGVjdXN0b21pemUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIGV4Yy5uYW1lID09ICdzaXRlY3VzdG9taXplJzoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJQWVRIT05WRVJCT1NFIik6CiAgICAgICAgICAgICBzeXMuZXhjZXB0aG9vaygqc3lzLmV4Y19pbmZvKCkpCkBAIC01MjAsOSArNTI0LDEzIEBACiBkZWYgZXhlY3VzZXJjdXN0b21pemUoKToKICAgICAiIiJSdW4gY3VzdG9tIHVzZXIgc3BlY2lmaWMgY29kZSwgaWYgYXZhaWxhYmxlLiIiIgogICAgIHRyeToKLSAgICAgICAgaW1wb3J0IHVzZXJjdXN0b21pemUKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHVzZXJjdXN0b21pemUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIGV4Yy5uYW1lID09ICd1c2VyY3VzdG9taXplJzoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgIGlmIG9zLmVudmlyb24uZ2V0KCJQWVRIT05WRVJCT1NFIik6CiAgICAgICAgICAgICBzeXMuZXhjZXB0aG9vaygqc3lzLmV4Y19pbmZvKCkpCmRpZmYgLS1naXQgYS9MaWIvc210cGQucHkgYi9MaWIvc210cGQucHkKaW5kZXggNzMyMDY2ZS4uODEwM2NhOSAxMDA3NTUKLS0tIGEvTGliL3NtdHBkLnB5CisrKyBiL0xpYi9zbXRwZC5weQpAQCAtODksNyArODksMTAgQEAKIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KIGZyb20gZW1haWwuX2hlYWRlcl92YWx1ZV9wYXJzZXIgaW1wb3J0IGdldF9hZGRyX3NwZWMsIGdldF9hbmdsZV9hZGRyCiAKLV9fYWxsX18gPSBbIlNNVFBTZXJ2ZXIiLCJEZWJ1Z2dpbmdTZXJ2ZXIiLCJQdXJlUHJveHkiLCJNYWlsbWFuUHJveHkiXQorX19hbGxfXyA9IFsKKyAgICAiU01UUENoYW5uZWwiLCAiU01UUFNlcnZlciIsICJEZWJ1Z2dpbmdTZXJ2ZXIiLCAiUHVyZVByb3h5IiwKKyAgICAiTWFpbG1hblByb3h5IiwKK10KIAogcHJvZ3JhbSA9IHN5cy5hcmd2WzBdCiBfX3ZlcnNpb25fXyA9ICdQeXRob24gU01UUCBwcm94eSB2ZXJzaW9uIDAuMycKQEAgLTEyOCwyNCArMTMxLDE3IEBACiAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21tYW5kX3NpemVfbGltaXQKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRhdGFfc2l6ZV9saW1pdD1EQVRBX1NJWkVfREVGQVVMVCwKLSAgICAgICAgICAgICAgICAgbWFwPU5vbmUsIGVuYWJsZV9TTVRQVVRGOD1GYWxzZSwgZGVjb2RlX2RhdGE9Tm9uZSk6CisgICAgICAgICAgICAgICAgIG1hcD1Ob25lLCBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPUZhbHNlKToKICAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5fX2luaXRfXyhzZWxmLCBjb25uLCBtYXA9bWFwKQogICAgICAgICBzZWxmLnNtdHBfc2VydmVyID0gc2VydmVyCiAgICAgICAgIHNlbGYuY29ubiA9IGNvbm4KICAgICAgICAgc2VsZi5hZGRyID0gYWRkcgogICAgICAgICBzZWxmLmRhdGFfc2l6ZV9saW1pdCA9IGRhdGFfc2l6ZV9saW1pdAogICAgICAgICBzZWxmLmVuYWJsZV9TTVRQVVRGOCA9IGVuYWJsZV9TTVRQVVRGOAotICAgICAgICBpZiBlbmFibGVfU01UUFVURjg6Ci0gICAgICAgICAgICBpZiBkZWNvZGVfZGF0YToKLSAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkZWNvZGVfZGF0YSBhbmQgZW5hYmxlX1NNVFBVVEY4IGNhbm5vdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYmUgc2V0IHRvIFRydWUgYXQgdGhlIHNhbWUgdGltZSIpCi0gICAgICAgICAgICBkZWNvZGVfZGF0YSA9IEZhbHNlCi0gICAgICAgIGlmIGRlY29kZV9kYXRhIGlzIE5vbmU6Ci0gICAgICAgICAgICB3YXJuKCJUaGUgZGVjb2RlX2RhdGEgZGVmYXVsdCBvZiBUcnVlIHdpbGwgY2hhbmdlIHRvIEZhbHNlIGluIDMuNjsiCi0gICAgICAgICAgICAgICAgICIgc3BlY2lmeSBhbiBleHBsaWNpdCB2YWx1ZSBmb3IgdGhpcyBrZXl3b3JkIiwKLSAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgICAgICAgICAgZGVjb2RlX2RhdGEgPSBUcnVlCiAgICAgICAgIHNlbGYuX2RlY29kZV9kYXRhID0gZGVjb2RlX2RhdGEKKyAgICAgICAgaWYgZW5hYmxlX1NNVFBVVEY4IGFuZCBkZWNvZGVfZGF0YToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRlY29kZV9kYXRhIGFuZCBlbmFibGVfU01UUFVURjggY2Fubm90IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJlIHNldCB0byBUcnVlIGF0IHRoZSBzYW1lIHRpbWUiKQogICAgICAgICBpZiBkZWNvZGVfZGF0YToKICAgICAgICAgICAgIHNlbGYuX2VtcHR5c3RyaW5nID0gJycKICAgICAgICAgICAgIHNlbGYuX2xpbmVzZXAgPSAnXHJcbicKQEAgLTYzNSwyMyArNjMxLDE1IEBACiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYWxhZGRyLCByZW1vdGVhZGRyLAogICAgICAgICAgICAgICAgICBkYXRhX3NpemVfbGltaXQ9REFUQV9TSVpFX0RFRkFVTFQsIG1hcD1Ob25lLAotICAgICAgICAgICAgICAgICBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPU5vbmUpOgorICAgICAgICAgICAgICAgICBlbmFibGVfU01UUFVURjg9RmFsc2UsIGRlY29kZV9kYXRhPUZhbHNlKToKICAgICAgICAgc2VsZi5fbG9jYWxhZGRyID0gbG9jYWxhZGRyCiAgICAgICAgIHNlbGYuX3JlbW90ZWFkZHIgPSByZW1vdGVhZGRyCiAgICAgICAgIHNlbGYuZGF0YV9zaXplX2xpbWl0ID0gZGF0YV9zaXplX2xpbWl0CiAgICAgICAgIHNlbGYuZW5hYmxlX1NNVFBVVEY4ID0gZW5hYmxlX1NNVFBVVEY4Ci0gICAgICAgIGlmIGVuYWJsZV9TTVRQVVRGODoKLSAgICAgICAgICAgIGlmIGRlY29kZV9kYXRhOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBkZWNvZGVfZGF0YSBhbmQgZW5hYmxlX1NNVFBVVEY4IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBwYXJhbWV0ZXJzIGNhbm5vdCBiZSBzZXQgdG8gVHJ1ZSBhdCB0aGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNhbWUgdGltZS4iKQotICAgICAgICAgICAgZGVjb2RlX2RhdGEgPSBGYWxzZQotICAgICAgICBpZiBkZWNvZGVfZGF0YSBpcyBOb25lOgotICAgICAgICAgICAgd2FybigiVGhlIGRlY29kZV9kYXRhIGRlZmF1bHQgb2YgVHJ1ZSB3aWxsIGNoYW5nZSB0byBGYWxzZSBpbiAzLjY7IgotICAgICAgICAgICAgICAgICAiIHNwZWNpZnkgYW4gZXhwbGljaXQgdmFsdWUgZm9yIHRoaXMga2V5d29yZCIsCi0gICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgICAgIGRlY29kZV9kYXRhID0gVHJ1ZQogICAgICAgICBzZWxmLl9kZWNvZGVfZGF0YSA9IGRlY29kZV9kYXRhCisgICAgICAgIGlmIGVuYWJsZV9TTVRQVVRGOCBhbmQgZGVjb2RlX2RhdGE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkZWNvZGVfZGF0YSBhbmQgZW5hYmxlX1NNVFBVVEY4IGNhbm5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBiZSBzZXQgdG8gVHJ1ZSBhdCB0aGUgc2FtZSB0aW1lIikKICAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmLCBtYXA9bWFwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBnYWlfcmVzdWx0cyA9IHNvY2tldC5nZXRhZGRyaW5mbygqbG9jYWxhZGRyLApAQCAtNjk4LDkgKzY4Niw5IEBACiAgICAgICAgIGNvbnRhaW5pbmcgYSBgLicgZm9sbG93ZWQgYnkgb3RoZXIgdGV4dCBoYXMgaGFkIHRoZSBsZWFkaW5nIGRvdAogICAgICAgICByZW1vdmVkLgogCi0gICAgICAgIGt3YXJncyBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiBJdCBpcyBlbXB0eQotICAgICAgICB1bmxlc3MgZGVjb2RlX2RhdGE9RmFsc2Ugb3IgZW5hYmxlX1NNVFBVVEY4PVRydWUgd2FzIGdpdmVuIGFzIGluaXQKLSAgICAgICAgcGFyYW1ldGVyLCBpbiB3aGljaCBjYXNlIHV0IHdpbGwgY29udGFpbiB0aGUgZm9sbG93aW5nIGtleXM6CisgICAgICAgIGt3YXJncyBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLiAgSXQgaXMKKyAgICAgICAgZW1wdHkgaWYgZGVjb2RlX2RhdGE9VHJ1ZSB3YXMgZ2l2ZW4gYXMgaW5pdCBwYXJhbWV0ZXIsIG90aGVyd2lzZQorICAgICAgICBpdCB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBrZXlzOgogICAgICAgICAgICAgJ21haWxfb3B0aW9ucyc6IGxpc3Qgb2YgcGFyYW1ldGVycyB0byB0aGUgbWFpbCBjb21tYW5kLiAgQWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgYXJlIHVwcGVyY2FzZSBzdHJpbmdzLiAgRXhhbXBsZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0JPRFk9OEJJVE1JTUUnLCAnU01UUFVURjgnXS4KZGlmZiAtLWdpdCBhL0xpYi9zbmRoZHIucHkgYi9MaWIvc25kaGRyLnB5CmluZGV4IGU1OTAxZWMuLjdlY2FmYjQgMTAwNjQ0Ci0tLSBhL0xpYi9zbmRoZHIucHkKKysrIGIvTGliL3NuZGhkci5weQpAQCAtMzcsNiArMzcsMTggQEAKIFNuZEhlYWRlcnMgPSBuYW1lZHR1cGxlKCdTbmRIZWFkZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxldHlwZSBmcmFtZXJhdGUgbmNoYW5uZWxzIG5mcmFtZXMgc2FtcHdpZHRoJykKIAorU25kSGVhZGVycy5maWxldHlwZS5fX2RvY19fID0gKCIiIlRoZSB2YWx1ZSBmb3IgdHlwZSBpbmRpY2F0ZXMgdGhlIGRhdGEgdHlwZQorYW5kIHdpbGwgYmUgb25lIG9mIHRoZSBzdHJpbmdzICdhaWZjJywgJ2FpZmYnLCAnYXUnLCdoY29tJywKKydzbmRyJywgJ3NuZHQnLCAndm9jJywgJ3dhdicsICc4c3Z4JywgJ3NiJywgJ3ViJywgb3IgJ3VsJy4iIiIpCitTbmRIZWFkZXJzLmZyYW1lcmF0ZS5fX2RvY19fID0gKCIiIlRoZSBzYW1wbGluZ19yYXRlIHdpbGwgYmUgZWl0aGVyIHRoZSBhY3R1YWwKK3ZhbHVlIG9yIDAgaWYgdW5rbm93biBvciBkaWZmaWN1bHQgdG8gZGVjb2RlLiIiIikKK1NuZEhlYWRlcnMubmNoYW5uZWxzLl9fZG9jX18gPSAoIiIiVGhlIG51bWJlciBvZiBjaGFubmVscyBvciAwIGlmIGl0IGNhbm5vdCBiZQorZGV0ZXJtaW5lZCBvciBpZiB0aGUgdmFsdWUgaXMgZGlmZmljdWx0IHRvIGRlY29kZS4iIiIpCitTbmRIZWFkZXJzLm5mcmFtZXMuX19kb2NfXyA9ICgiIiJUaGUgdmFsdWUgZm9yIGZyYW1lcyB3aWxsIGJlIGVpdGhlciB0aGUgbnVtYmVyCitvZiBmcmFtZXMgb3IgLTEuIiIiKQorU25kSGVhZGVycy5zYW1wd2lkdGguX19kb2NfXyA9ICgiIiJFaXRoZXIgdGhlIHNhbXBsZSBzaXplIGluIGJpdHMgb3IKKydBJyBmb3IgQS1MQVcgb3IgJ1UnIGZvciB1LUxBVy4iIiIpCisKIGRlZiB3aGF0KGZpbGVuYW1lKToKICAgICAiIiJHdWVzcyB0aGUgdHlwZSBvZiBhIHNvdW5kIGZpbGUuIiIiCiAgICAgcmVzID0gd2hhdGhkcihmaWxlbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi9zb2NrZXRzZXJ2ZXIucHkgYi9MaWIvc29ja2V0c2VydmVyLnB5CmluZGV4IDg4MDg4MTMuLjQxYTM3NjYgMTAwNjQ0Ci0tLSBhL0xpYi9zb2NrZXRzZXJ2ZXIucHkKKysrIGIvTGliL3NvY2tldHNlcnZlci5weQpAQCAtMTI3LDE2ICsxMjcsMjAgQEAKIGltcG9ydCBzZWxlY3RvcnMKIGltcG9ydCBvcwogaW1wb3J0IGVycm5vCitpbXBvcnQgc3lzCiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZGluZwogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgdGhyZWFkaW5nCitmcm9tIGlvIGltcG9ydCBCdWZmZXJlZElPQmFzZQogZnJvbSB0aW1lIGltcG9ydCBtb25vdG9uaWMgYXMgdGltZQogCi1fX2FsbF9fID0gWyJCYXNlU2VydmVyIiwgIlRDUFNlcnZlciIsICJVRFBTZXJ2ZXIiLCAiRm9ya2luZ1VEUFNlcnZlciIsCi0gICAgICAgICAgICJGb3JraW5nVENQU2VydmVyIiwgIlRocmVhZGluZ1VEUFNlcnZlciIsICJUaHJlYWRpbmdUQ1BTZXJ2ZXIiLAorX19hbGxfXyA9IFsiQmFzZVNlcnZlciIsICJUQ1BTZXJ2ZXIiLCAiVURQU2VydmVyIiwKKyAgICAgICAgICAgIlRocmVhZGluZ1VEUFNlcnZlciIsICJUaHJlYWRpbmdUQ1BTZXJ2ZXIiLAogICAgICAgICAgICAiQmFzZVJlcXVlc3RIYW5kbGVyIiwgIlN0cmVhbVJlcXVlc3RIYW5kbGVyIiwKLSAgICAgICAgICAgIkRhdGFncmFtUmVxdWVzdEhhbmRsZXIiLCAiVGhyZWFkaW5nTWl4SW4iLCAiRm9ya2luZ01peEluIl0KKyAgICAgICAgICAgIkRhdGFncmFtUmVxdWVzdEhhbmRsZXIiLCAiVGhyZWFkaW5nTWl4SW4iXQoraWYgaGFzYXR0cihvcywgImZvcmsiKToKKyAgICBfX2FsbF9fLmV4dGVuZChbIkZvcmtpbmdVRFBTZXJ2ZXIiLCJGb3JraW5nVENQU2VydmVyIiwgIkZvcmtpbmdNaXhJbiJdKQogaWYgaGFzYXR0cihzb2NrZXQsICJBRl9VTklYIik6CiAgICAgX19hbGxfXy5leHRlbmQoWyJVbml4U3RyZWFtU2VydmVyIiwiVW5peERhdGFncmFtU2VydmVyIiwKICAgICAgICAgICAgICAgICAgICAgIlRocmVhZGluZ1VuaXhTdHJlYW1TZXJ2ZXIiLApAQCAtMzExLDkgKzMxNSwxMiBAQAogICAgICAgICBpZiBzZWxmLnZlcmlmeV9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKLSAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCiAgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQogCkBAIC0zNjcsMTIgKzM3NCwxOCBAQAogICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBwcmludCBhIHRyYWNlYmFjayBhbmQgY29udGludWUuCiAKICAgICAgICAgIiIiCi0gICAgICAgIHByaW50KCctJyo0MCkKLSAgICAgICAgcHJpbnQoJ0V4Y2VwdGlvbiBoYXBwZW5lZCBkdXJpbmcgcHJvY2Vzc2luZyBvZiByZXF1ZXN0IGZyb20nLCBlbmQ9JyAnKQotICAgICAgICBwcmludChjbGllbnRfYWRkcmVzcykKKyAgICAgICAgcHJpbnQoJy0nKjQwLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHByaW50KCdFeGNlcHRpb24gaGFwcGVuZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgcmVxdWVzdCBmcm9tJywKKyAgICAgICAgICAgIGNsaWVudF9hZGRyZXNzLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKLSAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpICMgWFhYIEJ1dCB0aGlzIGdvZXMgdG8gc3RkZXJyIQotICAgICAgICBwcmludCgnLScqNDApCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICBwcmludCgnLScqNDAsIGZpbGU9c3lzLnN0ZGVycikKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnNlcnZlcl9jbG9zZSgpCiAKIAogY2xhc3MgVENQU2VydmVyKEJhc2VTZXJ2ZXIpOgpAQCAtNTI3LDg1ICs1NDAsODYgQEAKICAgICAgICAgIyBObyBuZWVkIHRvIGNsb3NlIGFueXRoaW5nLgogICAgICAgICBwYXNzCiAKLWNsYXNzIEZvcmtpbmdNaXhJbjoKK2lmIGhhc2F0dHIob3MsICJmb3JrIik6CisgICAgY2xhc3MgRm9ya2luZ01peEluOgorICAgICAgICAiIiJNaXgtaW4gY2xhc3MgdG8gaGFuZGxlIGVhY2ggcmVxdWVzdCBpbiBhIG5ldyBwcm9jZXNzLiIiIgogCi0gICAgIiIiTWl4LWluIGNsYXNzIHRvIGhhbmRsZSBlYWNoIHJlcXVlc3QgaW4gYSBuZXcgcHJvY2Vzcy4iIiIKKyAgICAgICAgdGltZW91dCA9IDMwMAorICAgICAgICBhY3RpdmVfY2hpbGRyZW4gPSBOb25lCisgICAgICAgIG1heF9jaGlsZHJlbiA9IDQwCiAKLSAgICB0aW1lb3V0ID0gMzAwCi0gICAgYWN0aXZlX2NoaWxkcmVuID0gTm9uZQotICAgIG1heF9jaGlsZHJlbiA9IDQwCi0KLSAgICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKLSAgICAgICAgIiIiSW50ZXJuYWwgcm91dGluZSB0byB3YWl0IGZvciBjaGlsZHJlbiB0aGF0IGhhdmUgZXhpdGVkLiIiIgotICAgICAgICBpZiBzZWxmLmFjdGl2ZV9jaGlsZHJlbiBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgIyBJZiB3ZSdyZSBhYm92ZSB0aGUgbWF4IG51bWJlciBvZiBjaGlsZHJlbiwgd2FpdCBhbmQgcmVhcCB0aGVtIHVudGlsCi0gICAgICAgICMgd2UgZ28gYmFjayBiZWxvdyB0aHJlc2hvbGQuIE5vdGUgdGhhdCB3ZSB1c2Ugd2FpdHBpZCgtMSkgYmVsb3cgdG8gYmUKLSAgICAgICAgIyBhYmxlIHRvIGNvbGxlY3QgY2hpbGRyZW4gaW4gc2l6ZSg8ZGVmdW5jdCBjaGlsZHJlbj4pIHN5c2NhbGxzIGluc3RlYWQKLSAgICAgICAgIyBvZiBzaXplKDxjaGlsZHJlbj4pOiB0aGUgZG93bnNpZGUgaXMgdGhhdCB0aGlzIG1pZ2h0IHJlYXAgY2hpbGRyZW4KLSAgICAgICAgIyB3aGljaCB3ZSBkaWRuJ3Qgc3Bhd24sIHdoaWNoIGlzIHdoeSB3ZSBvbmx5IHJlc29ydCB0byB0aGlzIHdoZW4gd2UncmUKLSAgICAgICAgIyBhYm92ZSBtYXhfY2hpbGRyZW4uCi0gICAgICAgIHdoaWxlIGxlbihzZWxmLmFjdGl2ZV9jaGlsZHJlbikgPj0gc2VsZi5tYXhfY2hpbGRyZW46Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcGlkLCBfID0gb3Mud2FpdHBpZCgtMSwgMCkKLSAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5kaXNjYXJkKHBpZCkKLSAgICAgICAgICAgIGV4Y2VwdCBDaGlsZFByb2Nlc3NFcnJvcjoKLSAgICAgICAgICAgICAgICAjIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuLCB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uY2xlYXIoKQotICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLQotICAgICAgICAjIE5vdyByZWFwIGFsbCBkZWZ1bmN0IGNoaWxkcmVuLgotICAgICAgICBmb3IgcGlkIGluIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmNvcHkoKToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBwaWQsIF8gPSBvcy53YWl0cGlkKHBpZCwgb3MuV05PSEFORykKLSAgICAgICAgICAgICAgICAjIGlmIHRoZSBjaGlsZCBoYXNuJ3QgZXhpdGVkIHlldCwgcGlkIHdpbGwgYmUgMCBhbmQgaWdub3JlZCBieQotICAgICAgICAgICAgICAgICMgZGlzY2FyZCgpIGJlbG93Ci0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uZGlzY2FyZChwaWQpCi0gICAgICAgICAgICBleGNlcHQgQ2hpbGRQcm9jZXNzRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBzb21lb25lIGVsc2UgcmVhcGVkIGl0Ci0gICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uZGlzY2FyZChwaWQpCi0gICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0KLSAgICBkZWYgaGFuZGxlX3RpbWVvdXQoc2VsZik6Ci0gICAgICAgICIiIldhaXQgZm9yIHpvbWJpZXMgYWZ0ZXIgc2VsZi50aW1lb3V0IHNlY29uZHMgb2YgaW5hY3Rpdml0eS4KLQotICAgICAgICBNYXkgYmUgZXh0ZW5kZWQsIGRvIG5vdCBvdmVycmlkZS4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCi0KLSAgICBkZWYgc2VydmljZV9hY3Rpb25zKHNlbGYpOgotICAgICAgICAiIiJDb2xsZWN0IHRoZSB6b21iaWUgY2hpbGQgcHJvY2Vzc2VzIHJlZ3VsYXJseSBpbiB0aGUgRm9ya2luZ01peEluLgotCi0gICAgICAgIHNlcnZpY2VfYWN0aW9ucyBpcyBjYWxsZWQgaW4gdGhlIEJhc2VTZXJ2ZXIncyBzZXJ2ZV9mb3J2ZXIgbG9vcC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCi0KLSAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKLSAgICAgICAgIiIiRm9yayBhIG5ldyBzdWJwcm9jZXNzIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuIiIiCi0gICAgICAgIHBpZCA9IG9zLmZvcmsoKQotICAgICAgICBpZiBwaWQ6Ci0gICAgICAgICAgICAjIFBhcmVudCBwcm9jZXNzCisgICAgICAgIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICAgICAgIiIiSW50ZXJuYWwgcm91dGluZSB0byB3YWl0IGZvciBjaGlsZHJlbiB0aGF0IGhhdmUgZXhpdGVkLiIiIgogICAgICAgICAgICAgaWYgc2VsZi5hY3RpdmVfY2hpbGRyZW4gaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbiA9IHNldCgpCi0gICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5hZGQocGlkKQotICAgICAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgQ2hpbGQgcHJvY2Vzcy4KLSAgICAgICAgICAgICMgVGhpcyBtdXN0IG5ldmVyIHJldHVybiwgaGVuY2Ugb3MuX2V4aXQoKSEKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQotICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQotICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCi0gICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgSWYgd2UncmUgYWJvdmUgdGhlIG1heCBudW1iZXIgb2YgY2hpbGRyZW4sIHdhaXQgYW5kIHJlYXAgdGhlbSB1bnRpbAorICAgICAgICAgICAgIyB3ZSBnbyBiYWNrIGJlbG93IHRocmVzaG9sZC4gTm90ZSB0aGF0IHdlIHVzZSB3YWl0cGlkKC0xKSBiZWxvdyB0byBiZQorICAgICAgICAgICAgIyBhYmxlIHRvIGNvbGxlY3QgY2hpbGRyZW4gaW4gc2l6ZSg8ZGVmdW5jdCBjaGlsZHJlbj4pIHN5c2NhbGxzIGluc3RlYWQKKyAgICAgICAgICAgICMgb2Ygc2l6ZSg8Y2hpbGRyZW4+KTogdGhlIGRvd25zaWRlIGlzIHRoYXQgdGhpcyBtaWdodCByZWFwIGNoaWxkcmVuCisgICAgICAgICAgICAjIHdoaWNoIHdlIGRpZG4ndCBzcGF3biwgd2hpY2ggaXMgd2h5IHdlIG9ubHkgcmVzb3J0IHRvIHRoaXMgd2hlbiB3ZSdyZQorICAgICAgICAgICAgIyBhYm92ZSBtYXhfY2hpbGRyZW4uCisgICAgICAgICAgICB3aGlsZSBsZW4oc2VsZi5hY3RpdmVfY2hpbGRyZW4pID49IHNlbGYubWF4X2NoaWxkcmVuOgogICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGlkLCBfID0gb3Mud2FpdHBpZCgtMSwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uZGlzY2FyZChwaWQpCisgICAgICAgICAgICAgICAgZXhjZXB0IENoaWxkUHJvY2Vzc0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAjIHdlIGRvbid0IGhhdmUgYW55IGNoaWxkcmVuLCB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmNsZWFyKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgIyBOb3cgcmVhcCBhbGwgZGVmdW5jdCBjaGlsZHJlbi4KKyAgICAgICAgICAgIGZvciBwaWQgaW4gc2VsZi5hY3RpdmVfY2hpbGRyZW4uY29weSgpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGlkLCBfID0gb3Mud2FpdHBpZChwaWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIGNoaWxkIGhhc24ndCBleGl0ZWQgeWV0LCBwaWQgd2lsbCBiZSAwIGFuZCBpZ25vcmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICMgZGlzY2FyZCgpIGJlbG93CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBDaGlsZFByb2Nlc3NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBzb21lb25lIGVsc2UgcmVhcGVkIGl0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmRpc2NhcmQocGlkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGhhbmRsZV90aW1lb3V0KHNlbGYpOgorICAgICAgICAgICAgIiIiV2FpdCBmb3Igem9tYmllcyBhZnRlciBzZWxmLnRpbWVvdXQgc2Vjb25kcyBvZiBpbmFjdGl2aXR5LgorCisgICAgICAgICAgICBNYXkgYmUgZXh0ZW5kZWQsIGRvIG5vdCBvdmVycmlkZS4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgc2VsZi5jb2xsZWN0X2NoaWxkcmVuKCkKKworICAgICAgICBkZWYgc2VydmljZV9hY3Rpb25zKHNlbGYpOgorICAgICAgICAgICAgIiIiQ29sbGVjdCB0aGUgem9tYmllIGNoaWxkIHByb2Nlc3NlcyByZWd1bGFybHkgaW4gdGhlIEZvcmtpbmdNaXhJbi4KKworICAgICAgICAgICAgc2VydmljZV9hY3Rpb25zIGlzIGNhbGxlZCBpbiB0aGUgQmFzZVNlcnZlcidzIHNlcnZlX2ZvcnZlciBsb29wLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQorCisgICAgICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAgICAgIiIiRm9yayBhIG5ldyBzdWJwcm9jZXNzIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuIiIiCisgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIHBpZDoKKyAgICAgICAgICAgICAgICAjIFBhcmVudCBwcm9jZXNzCisgICAgICAgICAgICAgICAgaWYgc2VsZi5hY3RpdmVfY2hpbGRyZW4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4gPSBzZXQoKQorICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmFkZChwaWQpCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQ2hpbGQgcHJvY2Vzcy4KKyAgICAgICAgICAgICAgICAjIFRoaXMgbXVzdCBuZXZlciByZXR1cm4sIGhlbmNlIG9zLl9leGl0KCkhCisgICAgICAgICAgICAgICAgc3RhdHVzID0gMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMAorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQotICAgICAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKICAgICAgICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgICAgICBvcy5fZXhpdCgxKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLl9leGl0KHN0YXR1cykKIAogCiBjbGFzcyBUaHJlYWRpbmdNaXhJbjoKQEAgLTYyMyw5ICs2MzcsOSBAQAogICAgICAgICAiIiIKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKLSAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQotICAgICAgICBleGNlcHQ6CisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcihyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQogCiAgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CkBAIC02MzYsOCArNjUwLDkgQEAKICAgICAgICAgdC5zdGFydCgpCiAKIAotY2xhc3MgRm9ya2luZ1VEUFNlcnZlcihGb3JraW5nTWl4SW4sIFVEUFNlcnZlcik6IHBhc3MKLWNsYXNzIEZvcmtpbmdUQ1BTZXJ2ZXIoRm9ya2luZ01peEluLCBUQ1BTZXJ2ZXIpOiBwYXNzCitpZiBoYXNhdHRyKG9zLCAiZm9yayIpOgorICAgIGNsYXNzIEZvcmtpbmdVRFBTZXJ2ZXIoRm9ya2luZ01peEluLCBVRFBTZXJ2ZXIpOiBwYXNzCisgICAgY2xhc3MgRm9ya2luZ1RDUFNlcnZlcihGb3JraW5nTWl4SW4sIFRDUFNlcnZlcik6IHBhc3MKIAogY2xhc3MgVGhyZWFkaW5nVURQU2VydmVyKFRocmVhZGluZ01peEluLCBVRFBTZXJ2ZXIpOiBwYXNzCiBjbGFzcyBUaHJlYWRpbmdUQ1BTZXJ2ZXIoVGhyZWFkaW5nTWl4SW4sIFRDUFNlcnZlcik6IHBhc3MKQEAgLTcyOSw3ICs3NDQsMTAgQEAKICAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5zZXRzb2Nrb3B0KHNvY2tldC5JUFBST1RPX1RDUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5UQ1BfTk9ERUxBWSwgVHJ1ZSkKICAgICAgICAgc2VsZi5yZmlsZSA9IHNlbGYuY29ubmVjdGlvbi5tYWtlZmlsZSgncmInLCBzZWxmLnJidWZzaXplKQotICAgICAgICBzZWxmLndmaWxlID0gc2VsZi5jb25uZWN0aW9uLm1ha2VmaWxlKCd3YicsIHNlbGYud2J1ZnNpemUpCisgICAgICAgIGlmIHNlbGYud2J1ZnNpemUgPT0gMDoKKyAgICAgICAgICAgIHNlbGYud2ZpbGUgPSBfU29ja2V0V3JpdGVyKHNlbGYuY29ubmVjdGlvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud2ZpbGUgPSBzZWxmLmNvbm5lY3Rpb24ubWFrZWZpbGUoJ3diJywgc2VsZi53YnVmc2l6ZSkKIAogICAgIGRlZiBmaW5pc2goc2VsZik6CiAgICAgICAgIGlmIG5vdCBzZWxmLndmaWxlLmNsb3NlZDoKQEAgLTc0Miw2ICs3NjAsMjQgQEAKICAgICAgICAgc2VsZi53ZmlsZS5jbG9zZSgpCiAgICAgICAgIHNlbGYucmZpbGUuY2xvc2UoKQogCitjbGFzcyBfU29ja2V0V3JpdGVyKEJ1ZmZlcmVkSU9CYXNlKToKKyAgICAiIiJTaW1wbGUgd3JpdGFibGUgQnVmZmVyZWRJT0Jhc2UgaW1wbGVtZW50YXRpb24gZm9yIGEgc29ja2V0CisKKyAgICBEb2VzIG5vdCBob2xkIGRhdGEgaW4gYSBidWZmZXIsIGF2b2lkaW5nIGFueSBuZWVkIHRvIGNhbGwgZmx1c2goKS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrKToKKyAgICAgICAgc2VsZi5fc29jayA9IHNvY2sKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgc2VsZi5fc29jay5zZW5kYWxsKGIpCisgICAgICAgIHdpdGggbWVtb3J5dmlldyhiKSBhcyB2aWV3OgorICAgICAgICAgICAgcmV0dXJuIHZpZXcubmJ5dGVzCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc29jay5maWxlbm8oKQogCiBjbGFzcyBEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyKEJhc2VSZXF1ZXN0SGFuZGxlcik6CiAKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CmluZGV4IGVjNDJlYjcuLjUxYzRkNTMgMTAwNjQ0Ci0tLSBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpAQCAtMTg4LDcgKzE4OCwxMCBAQAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5jeCA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCiAgICAgICAgIHNlbGYuY3UgPSBzZWxmLmN4LmN1cnNvcigpCi0gICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0LCBpbmNvbWUgbnVtYmVyKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgKKyAgICAgICAgICAgICJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsICIKKyAgICAgICAgICAgICJpbmNvbWUgbnVtYmVyLCB1bmlxdWVfdGVzdCB0ZXh0IHVuaXF1ZSkiCisgICAgICAgICkKICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKQEAgLTQ2Miw2ICs0NjUsNDQgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgogICAgICAgICAgICAgY3VyID0gc3FsaXRlLkN1cnNvcihmb28pCiAKKyAgICBkZWYgQ2hlY2tMYXN0Um93SURPblJlcGxhY2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJTlNFUlQgT1IgUkVQTEFDRSBhbmQgUkVQTEFDRSBJTlRPIHNob3VsZCBwcm9kdWNlIHRoZSBzYW1lIGJlaGF2aW9yLgorICAgICAgICAiIiIKKyAgICAgICAgc3FsID0gJ3t9IElOVE8gdGVzdChpZCwgdW5pcXVlX3Rlc3QpIFZBTFVFUyAoPywgPyknCisgICAgICAgIGZvciBzdGF0ZW1lbnQgaW4gKCdJTlNFUlQgT1IgUkVQTEFDRScsICdSRVBMQUNFJyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChzdGF0ZW1lbnQ9c3RhdGVtZW50KToKKyAgICAgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoc3FsLmZvcm1hdChzdGF0ZW1lbnQpLCAoMSwgJ2ZvbycpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5sYXN0cm93aWQsIDEpCisKKyAgICBkZWYgQ2hlY2tMYXN0Um93SURPbklnbm9yZShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKAorICAgICAgICAgICAgImluc2VydCBvciBpZ25vcmUgaW50byB0ZXN0KHVuaXF1ZV90ZXN0KSB2YWx1ZXMgKD8pIiwKKyAgICAgICAgICAgICgndGVzdCcsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1Lmxhc3Ryb3dpZCwgMikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKAorICAgICAgICAgICAgImluc2VydCBvciBpZ25vcmUgaW50byB0ZXN0KHVuaXF1ZV90ZXN0KSB2YWx1ZXMgKD8pIiwKKyAgICAgICAgICAgICgndGVzdCcsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1Lmxhc3Ryb3dpZCwgMikKKworICAgIGRlZiBDaGVja0xhc3RSb3dJREluc2VydE9SKHNlbGYpOgorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgZm9yIHN0YXRlbWVudCBpbiAoJ0ZBSUwnLCAnQUJPUlQnLCAnUk9MTEJBQ0snKToKKyAgICAgICAgICAgIHNxbCA9ICdJTlNFUlQgT1Ige30gSU5UTyB0ZXN0KHVuaXF1ZV90ZXN0KSBWQUxVRVMgKD8pJworICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc3RhdGVtZW50PSdJTlNFUlQgT1Ige30nLmZvcm1hdChzdGF0ZW1lbnQpKToKKyAgICAgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoc3FsLmZvcm1hdChzdGF0ZW1lbnQpLCAoc3RhdGVtZW50LCkpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKHN0YXRlbWVudCwgc2VsZi5jdS5sYXN0cm93aWQpKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLkludGVncml0eUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKHNxbC5mb3JtYXQoc3RhdGVtZW50KSwgKHN0YXRlbWVudCwpKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChzdGF0ZW1lbnQsIHNlbGYuY3UubGFzdHJvd2lkKSkKKyAgICAgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgICAgICAoJ0ZBSUwnLCAyKSwgKCdGQUlMJywgMiksCisgICAgICAgICAgICAoJ0FCT1JUJywgMyksICgnQUJPUlQnLCAzKSwKKyAgICAgICAgICAgICgnUk9MTEJBQ0snLCA0KSwgKCdST0xMQkFDSycsIDQpLAorICAgICAgICBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0cywgZXhwZWN0ZWQpCisKKwogQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhpcyB0ZXN0IHJlcXVpcmVzIHRocmVhZGluZy4nKQogY2xhc3MgVGhyZWFkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9zcmVfY29tcGlsZS5weSBiL0xpYi9zcmVfY29tcGlsZS5weQppbmRleCA1MDJiMDYxLi40ZWRiMDNmIDEwMDY0NAotLS0gYS9MaWIvc3JlX2NvbXBpbGUucHkKKysrIGIvTGliL3NyZV9jb21waWxlLnB5CkBAIC00MDksNTcgKzQwOSwzOSBAQAogICAgICAgICAgICAgdGFibGVbaV0gPSBpZHggKyAxCiAgICAgcmV0dXJuIHRhYmxlCiAKLWRlZiBfY29tcGlsZV9pbmZvKGNvZGUsIHBhdHRlcm4sIGZsYWdzKToKLSAgICAjIGludGVybmFsOiBjb21waWxlIGFuIGluZm8gYmxvY2suICBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLAotICAgICMgdGhpcyBjb250YWlucyBtaW4vbWF4IHBhdHRlcm4gd2lkdGgsIGFuZCBhbiBvcHRpb25hbCBsaXRlcmFsCi0gICAgIyBwcmVmaXggb3IgYSBjaGFyYWN0ZXIgbWFwCi0gICAgbG8sIGhpID0gcGF0dGVybi5nZXR3aWR0aCgpCi0gICAgaWYgaGkgPiBNQVhDT0RFOgotICAgICAgICBoaSA9IE1BWENPREUKLSAgICBpZiBsbyA9PSAwOgotICAgICAgICBjb2RlLmV4dGVuZChbSU5GTywgNCwgMCwgbG8sIGhpXSkKLSAgICAgICAgcmV0dXJuCi0gICAgIyBsb29rIGZvciBhIGxpdGVyYWwgcHJlZml4CitkZWYgX2dldF9saXRlcmFsX3ByZWZpeChwYXR0ZXJuKToKKyAgICAjIGxvb2sgZm9yIGxpdGVyYWwgcHJlZml4CiAgICAgcHJlZml4ID0gW10KICAgICBwcmVmaXhhcHBlbmQgPSBwcmVmaXguYXBwZW5kCi0gICAgcHJlZml4X3NraXAgPSAwCisgICAgcHJlZml4X3NraXAgPSBOb25lCisgICAgZ290X2FsbCA9IFRydWUKKyAgICBmb3Igb3AsIGF2IGluIHBhdHRlcm4uZGF0YToKKyAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKKyAgICAgICAgICAgIHByZWZpeGFwcGVuZChhdikKKyAgICAgICAgZWxpZiBvcCBpcyBTVUJQQVRURVJOOgorICAgICAgICAgICAgcHJlZml4MSwgcHJlZml4X3NraXAxLCBnb3RfYWxsID0gX2dldF9saXRlcmFsX3ByZWZpeChhdlsxXSkKKyAgICAgICAgICAgIGlmIHByZWZpeF9za2lwIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgYXZbMF0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeF9za2lwID0gbGVuKHByZWZpeCkKKyAgICAgICAgICAgICAgICBlbGlmIHByZWZpeF9za2lwMSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4X3NraXAgPSBsZW4ocHJlZml4KSArIHByZWZpeF9za2lwMQorICAgICAgICAgICAgcHJlZml4LmV4dGVuZChwcmVmaXgxKQorICAgICAgICAgICAgaWYgbm90IGdvdF9hbGw6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGdvdF9hbGwgPSBGYWxzZQorICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gcHJlZml4LCBwcmVmaXhfc2tpcCwgZ290X2FsbAorCitkZWYgX2dldF9jaGFyc2V0X3ByZWZpeChwYXR0ZXJuKToKICAgICBjaGFyc2V0ID0gW10gIyBub3QgdXNlZAogICAgIGNoYXJzZXRhcHBlbmQgPSBjaGFyc2V0LmFwcGVuZAotICAgIGlmIG5vdCAoZmxhZ3MgJiBTUkVfRkxBR19JR05PUkVDQVNFKToKLSAgICAgICAgIyBsb29rIGZvciBsaXRlcmFsIHByZWZpeAotICAgICAgICBmb3Igb3AsIGF2IGluIHBhdHRlcm4uZGF0YToKKyAgICBpZiBwYXR0ZXJuLmRhdGE6CisgICAgICAgIG9wLCBhdiA9IHBhdHRlcm4uZGF0YVswXQorICAgICAgICBpZiBvcCBpcyBTVUJQQVRURVJOIGFuZCBhdlsxXToKKyAgICAgICAgICAgIG9wLCBhdiA9IGF2WzFdWzBdCiAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgIGlmIGxlbihwcmVmaXgpID09IHByZWZpeF9za2lwOgotICAgICAgICAgICAgICAgICAgICBwcmVmaXhfc2tpcCA9IHByZWZpeF9za2lwICsgMQotICAgICAgICAgICAgICAgIHByZWZpeGFwcGVuZChhdikKLSAgICAgICAgICAgIGVsaWYgb3AgaXMgU1VCUEFUVEVSTiBhbmQgbGVuKGF2WzFdKSA9PSAxOgotICAgICAgICAgICAgICAgIG9wLCBhdiA9IGF2WzFdWzBdCi0gICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKLSAgICAgICAgICAgICAgICAgICAgcHJlZml4YXBwZW5kKGF2KQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICMgaWYgbm8gcHJlZml4LCBsb29rIGZvciBjaGFyc2V0IHByZWZpeAotICAgICAgICBpZiBub3QgcHJlZml4IGFuZCBwYXR0ZXJuLmRhdGE6Ci0gICAgICAgICAgICBvcCwgYXYgPSBwYXR0ZXJuLmRhdGFbMF0KLSAgICAgICAgICAgIGlmIG9wIGlzIFNVQlBBVFRFUk4gYW5kIGF2WzFdOgotICAgICAgICAgICAgICAgIG9wLCBhdiA9IGF2WzFdWzBdCi0gICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKLSAgICAgICAgICAgICAgICAgICAgY2hhcnNldGFwcGVuZCgob3AsIGF2KSkKLSAgICAgICAgICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKLSAgICAgICAgICAgICAgICAgICAgYyA9IFtdCi0gICAgICAgICAgICAgICAgICAgIGNhcHBlbmQgPSBjLmFwcGVuZAotICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBhdlsxXToKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICBvcCwgYXYgPSBwWzBdCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHBlbmQoKG9wLCBhdikpCi0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYworICAgICAgICAgICAgICAgIGNoYXJzZXRhcHBlbmQoKG9wLCBhdikpCiAgICAgICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKICAgICAgICAgICAgICAgICBjID0gW10KICAgICAgICAgICAgICAgICBjYXBwZW5kID0gYy5hcHBlbmQKQEAgLTQ3Myw4ICs0NTUsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IGMKLSAgICAgICAgICAgIGVsaWYgb3AgaXMgSU46Ci0gICAgICAgICAgICAgICAgY2hhcnNldCA9IGF2CisgICAgICAgIGVsaWYgb3AgaXMgQlJBTkNIOgorICAgICAgICAgICAgYyA9IFtdCisgICAgICAgICAgICBjYXBwZW5kID0gYy5hcHBlbmQKKyAgICAgICAgICAgIGZvciBwIGluIGF2WzFdOgorICAgICAgICAgICAgICAgIGlmIG5vdCBwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG9wLCBhdiA9IHBbMF0KKyAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgICAgICBjYXBwZW5kKChvcCwgYXYpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCisgICAgICAgIGVsaWYgb3AgaXMgSU46CisgICAgICAgICAgICBjaGFyc2V0ID0gYXYKKyAgICByZXR1cm4gY2hhcnNldAorCitkZWYgX2NvbXBpbGVfaW5mbyhjb2RlLCBwYXR0ZXJuLCBmbGFncyk6CisgICAgIyBpbnRlcm5hbDogY29tcGlsZSBhbiBpbmZvIGJsb2NrLiAgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwKKyAgICAjIHRoaXMgY29udGFpbnMgbWluL21heCBwYXR0ZXJuIHdpZHRoLCBhbmQgYW4gb3B0aW9uYWwgbGl0ZXJhbAorICAgICMgcHJlZml4IG9yIGEgY2hhcmFjdGVyIG1hcAorICAgIGxvLCBoaSA9IHBhdHRlcm4uZ2V0d2lkdGgoKQorICAgIGlmIGhpID4gTUFYQ09ERToKKyAgICAgICAgaGkgPSBNQVhDT0RFCisgICAgaWYgbG8gPT0gMDoKKyAgICAgICAgY29kZS5leHRlbmQoW0lORk8sIDQsIDAsIGxvLCBoaV0pCisgICAgICAgIHJldHVybgorICAgICMgbG9vayBmb3IgYSBsaXRlcmFsIHByZWZpeAorICAgIHByZWZpeCA9IFtdCisgICAgcHJlZml4X3NraXAgPSAwCisgICAgY2hhcnNldCA9IFtdICMgbm90IHVzZWQKKyAgICBpZiBub3QgKGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRSk6CisgICAgICAgICMgbG9vayBmb3IgbGl0ZXJhbCBwcmVmaXgKKyAgICAgICAgcHJlZml4LCBwcmVmaXhfc2tpcCwgZ290X2FsbCA9IF9nZXRfbGl0ZXJhbF9wcmVmaXgocGF0dGVybikKKyAgICAgICAgIyBpZiBubyBwcmVmaXgsIGxvb2sgZm9yIGNoYXJzZXQgcHJlZml4CisgICAgICAgIGlmIG5vdCBwcmVmaXg6CisgICAgICAgICAgICBjaGFyc2V0ID0gX2dldF9jaGFyc2V0X3ByZWZpeChwYXR0ZXJuKQogIyMgICAgIGlmIHByZWZpeDoKICMjICAgICAgICAgcHJpbnQoIioqKiBQUkVGSVgiLCBwcmVmaXgsIHByZWZpeF9za2lwKQogIyMgICAgIGlmIGNoYXJzZXQ6CkBAIC00ODcsNyArNTA0LDcgQEAKICAgICBtYXNrID0gMAogICAgIGlmIHByZWZpeDoKICAgICAgICAgbWFzayA9IFNSRV9JTkZPX1BSRUZJWAotICAgICAgICBpZiBsZW4ocHJlZml4KSA9PSBwcmVmaXhfc2tpcCA9PSBsZW4ocGF0dGVybi5kYXRhKToKKyAgICAgICAgaWYgcHJlZml4X3NraXAgaXMgTm9uZSBhbmQgZ290X2FsbDoKICAgICAgICAgICAgIG1hc2sgPSBtYXNrIHwgU1JFX0lORk9fTElURVJBTAogICAgIGVsaWYgY2hhcnNldDoKICAgICAgICAgbWFzayA9IG1hc2sgfCBTUkVfSU5GT19DSEFSU0VUCkBAIC01MDIsNiArNTE5LDggQEAKICAgICAjIGFkZCBsaXRlcmFsIHByZWZpeAogICAgIGlmIHByZWZpeDoKICAgICAgICAgZW1pdChsZW4ocHJlZml4KSkgIyBsZW5ndGgKKyAgICAgICAgaWYgcHJlZml4X3NraXAgaXMgTm9uZToKKyAgICAgICAgICAgIHByZWZpeF9za2lwID0gIGxlbihwcmVmaXgpCiAgICAgICAgIGVtaXQocHJlZml4X3NraXApICMgc2tpcAogICAgICAgICBjb2RlLmV4dGVuZChwcmVmaXgpCiAgICAgICAgICMgZ2VuZXJhdGUgb3ZlcmxhcCB0YWJsZQpkaWZmIC0tZ2l0IGEvTGliL3NyZV9wYXJzZS5weSBiL0xpYi9zcmVfcGFyc2UucHkKaW5kZXggNGZmNTBkMS4uNTIxZTM3OSAxMDA2NDQKLS0tIGEvTGliL3NyZV9wYXJzZS5weQorKysgYi9MaWIvc3JlX3BhcnNlLnB5CkBAIC0yODIsMzMgKzI4Miw2IEBACiAgICAgZGVmIGVycm9yKHNlbGYsIG1zZywgb2Zmc2V0PTApOgogICAgICAgICByZXR1cm4gZXJyb3IobXNnLCBzZWxmLnN0cmluZywgc2VsZi50ZWxsKCkgLSBvZmZzZXQpCiAKLSMgVGhlIGZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgYXJlIG5vdCB1c2VkIGluIHRoaXMgbW9kdWxlIGFueW1vcmUsIGJ1dCB3ZSBrZWVwCi0jIHRoZW0gaGVyZSAod2l0aCBEZXByZWNhdGlvbldhcm5pbmdzKSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCi0KLWRlZiBpc2lkZW50KGNoYXIpOgotICAgIGltcG9ydCB3YXJuaW5ncwotICAgIHdhcm5pbmdzLndhcm4oJ3NyZV9wYXJzZS5pc2lkZW50KCkgd2lsbCBiZSByZW1vdmVkIGluIDMuNScsCi0gICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKLSAgICByZXR1cm4gImEiIDw9IGNoYXIgPD0gInoiIG9yICJBIiA8PSBjaGFyIDw9ICJaIiBvciBjaGFyID09ICJfIgotCi1kZWYgaXNkaWdpdChjaGFyKToKLSAgICBpbXBvcnQgd2FybmluZ3MKLSAgICB3YXJuaW5ncy53YXJuKCdzcmVfcGFyc2UuaXNkaWdpdCgpIHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjUnLAotICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCi0gICAgcmV0dXJuICIwIiA8PSBjaGFyIDw9ICI5IgotCi1kZWYgaXNuYW1lKG5hbWUpOgotICAgIGltcG9ydCB3YXJuaW5ncwotICAgIHdhcm5pbmdzLndhcm4oJ3NyZV9wYXJzZS5pc25hbWUoKSB3aWxsIGJlIHJlbW92ZWQgaW4gMy41JywKLSAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQotICAgICMgY2hlY2sgdGhhdCBncm91cCBuYW1lIGlzIGEgdmFsaWQgc3RyaW5nCi0gICAgaWYgbm90IGlzaWRlbnQobmFtZVswXSk6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGZvciBjaGFyIGluIG5hbWVbMTpdOgotICAgICAgICBpZiBub3QgaXNpZGVudChjaGFyKSBhbmQgbm90IGlzZGlnaXQoY2hhcik6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQotCiBkZWYgX2NsYXNzX2VzY2FwZShzb3VyY2UsIGVzY2FwZSk6CiAgICAgIyBoYW5kbGUgZXNjYXBlIGNvZGUgaW5zaWRlIGNoYXJhY3RlciBjbGFzcwogICAgIGNvZGUgPSBFU0NBUEVTLmdldChlc2NhcGUpCkBAIC0zNTEsOSArMzI0LDcgQEAKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICAgaWYgbGVuKGVzY2FwZSkgPT0gMjoKICAgICAgICAgICAgIGlmIGMgaW4gQVNDSUlMRVRURVJTOgotICAgICAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ2JhZCBlc2NhcGUgJXMnICUgZXNjYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTgpCisgICAgICAgICAgICAgICAgcmFpc2Ugc291cmNlLmVycm9yKCdiYWQgZXNjYXBlICVzJyAlIGVzY2FwZSwgbGVuKGVzY2FwZSkpCiAgICAgICAgICAgICByZXR1cm4gTElURVJBTCwgb3JkKGVzY2FwZVsxXSkKICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgcGFzcwpAQCAtNDE4LDkgKzM4OSw3IEBACiAgICAgICAgICAgICByYWlzZSBzb3VyY2UuZXJyb3IoImludmFsaWQgZ3JvdXAgcmVmZXJlbmNlIiwgbGVuKGVzY2FwZSkpCiAgICAgICAgIGlmIGxlbihlc2NhcGUpID09IDI6CiAgICAgICAgICAgICBpZiBjIGluIEFTQ0lJTEVUVEVSUzoKLSAgICAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdiYWQgZXNjYXBlICVzJyAlIGVzY2FwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD04KQorICAgICAgICAgICAgICAgIHJhaXNlIHNvdXJjZS5lcnJvcigiYmFkIGVzY2FwZSAlcyIgJSBlc2NhcGUsIGxlbihlc2NhcGUpKQogICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIG9yZChlc2NhcGVbMV0pCiAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIHBhc3MKQEAgLTc5OCwxMCArNzY3LDcgQEAKICAgICAjIENoZWNrIGFuZCBmaXggZmxhZ3MgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHBhdHRlcm4gKHN0ciBvciBieXRlcykKICAgICBpZiBpc2luc3RhbmNlKHNyYywgc3RyKToKICAgICAgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19MT0NBTEU6Ci0gICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkxPQ0FMRSBmbGFnIHdpdGggYSBzdHIgcGF0dGVybiBpcyBkZXByZWNhdGVkLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJXaWxsIGJlIGFuIGVycm9yIGluIDMuNiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD02KQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHVzZSBMT0NBTEUgZmxhZyB3aXRoIGEgc3RyIHBhdHRlcm4iKQogICAgICAgICBpZiBub3QgZmxhZ3MgJiBTUkVfRkxBR19BU0NJSToKICAgICAgICAgICAgIGZsYWdzIHw9IFNSRV9GTEFHX1VOSUNPREUKICAgICAgICAgZWxpZiBmbGFncyAmIFNSRV9GTEFHX1VOSUNPREU6CkBAIC04MTAsMTAgKzc3Niw3IEBACiAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfVU5JQ09ERToKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCB1c2UgVU5JQ09ERSBmbGFnIHdpdGggYSBieXRlcyBwYXR0ZXJuIikKICAgICAgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19MT0NBTEUgYW5kIGZsYWdzICYgU1JFX0ZMQUdfQVNDSUk6Ci0gICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkFTQ0lJIGFuZCBMT0NBTEUgZmxhZ3MgYXJlIGluY29tcGF0aWJsZS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiV2lsbCBiZSBhbiBlcnJvciBpbiAzLjYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9NikKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkFTQ0lJIGFuZCBMT0NBTEUgZmxhZ3MgYXJlIGluY29tcGF0aWJsZSIpCiAgICAgcmV0dXJuIGZsYWdzCiAKIGRlZiBwYXJzZShzdHIsIGZsYWdzPTAsIHBhdHRlcm49Tm9uZSk6CkBAIC05MTQsOSArODc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdGhpcyA9IGNocihFU0NBUEVTW3RoaXNdWzFdKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgaWYgYyBpbiBBU0NJSUxFVFRFUlM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ2JhZCBlc2NhcGUgJXMnICUgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTQpCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBzLmVycm9yKCdiYWQgZXNjYXBlICVzJyAlIHRoaXMsIGxlbih0aGlzKSkKICAgICAgICAgICAgICAgICBsYXBwZW5kKHRoaXMpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBsYXBwZW5kKHRoaXMpCmRpZmYgLS1naXQgYS9MaWIvc3NsLnB5IGIvTGliL3NzbC5weQppbmRleCAzZjVjM2M0Li41NjBjZmVmIDEwMDY0NAotLS0gYS9MaWIvc3NsLnB5CisrKyBiL0xpYi9zc2wucHkKQEAgLTg5MCw3ICs4OTAsNiBAQAogICAgICAgICAgICAgd2hpbGUgKGNvdW50IDwgYW1vdW50KToKICAgICAgICAgICAgICAgICB2ID0gc2VsZi5zZW5kKGRhdGFbY291bnQ6XSkKICAgICAgICAgICAgICAgICBjb3VudCArPSB2Ci0gICAgICAgICAgICByZXR1cm4gYW1vdW50CiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gc29ja2V0LnNlbmRhbGwoc2VsZiwgZGF0YSwgZmxhZ3MpCiAKZGlmZiAtLWdpdCBhL0xpYi9zdGF0aXN0aWNzLnB5IGIvTGliL3N0YXRpc3RpY3MucHkKaW5kZXggNGY1YzFjMS4uYjA4MWI1YSAxMDA2NDQKLS0tIGEvTGliL3N0YXRpc3RpY3MucHkKKysrIGIvTGliL3N0YXRpc3RpY3MucHkKQEAgLTEwNSw2ICsxMDUsNyBAQAogZnJvbSBmcmFjdGlvbnMgaW1wb3J0IEZyYWN0aW9uCiBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBncm91cGJ5Citmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0X2xlZnQsIGJpc2VjdF9yaWdodAogCiAKIApAQCAtMjIzLDU2ICsyMjQsMjYgQEAKICAgICAgICAgIyBPcHRpbWlzZSB0aGUgY29tbW9uIGNhc2Ugb2YgZmxvYXRzLiBXZSBleHBlY3QgdGhhdCB0aGUgbW9zdCBvZnRlbgogICAgICAgICAjIHVzZWQgbnVtZXJpYyB0eXBlIHdpbGwgYmUgYnVpbHRpbiBmbG9hdHMsIHNvIHRyeSB0byBtYWtlIHRoaXMgYXMKICAgICAgICAgIyBmYXN0IGFzIHBvc3NpYmxlLgotICAgICAgICBpZiB0eXBlKHgpIGlzIGZsb2F0OgorICAgICAgICBpZiB0eXBlKHgpIGlzIGZsb2F0IG9yIHR5cGUoeCkgaXMgRGVjaW1hbDoKICAgICAgICAgICAgIHJldHVybiB4LmFzX2ludGVnZXJfcmF0aW8oKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICAjIHggbWF5IGJlIGFuIGludCwgRnJhY3Rpb24sIG9yIEludGVncmFsIEFCQy4KICAgICAgICAgICAgIHJldHVybiAoeC5udW1lcmF0b3IsIHguZGVub21pbmF0b3IpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAjIHggbWF5IGJlIGEgZmxvYXQgc3ViY2xhc3MuCisgICAgICAgICAgICAgICAgIyB4IG1heSBiZSBhIGZsb2F0IG9yIERlY2ltYWwgc3ViY2xhc3MuCiAgICAgICAgICAgICAgICAgcmV0dXJuIHguYXNfaW50ZWdlcl9yYXRpbygpCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAjIHggbWF5IGJlIGEgRGVjaW1hbC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNpbWFsX3RvX3JhdGlvKHgpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAjIEp1c3QgZ2l2ZSB1cD8KLSAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICMgSnVzdCBnaXZlIHVwPworICAgICAgICAgICAgICAgIHBhc3MKICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAjIGZsb2F0IE5BTiBvciBJTkYuCi0gICAgICAgIGFzc2VydCBub3QgbWF0aC5pc2Zpbml0ZSh4KQorICAgICAgICBhc3NlcnQgbm90IF9pc2Zpbml0ZSh4KQogICAgICAgICByZXR1cm4gKHgsIE5vbmUpCiAgICAgbXNnID0gImNhbid0IGNvbnZlcnQgdHlwZSAne30nIHRvIG51bWVyYXRvci9kZW5vbWluYXRvciIKICAgICByYWlzZSBUeXBlRXJyb3IobXNnLmZvcm1hdCh0eXBlKHgpLl9fbmFtZV9fKSkKIAogCi0jIEZJWE1FIFRoaXMgaXMgZmFzdGVyIHRoYW4gRnJhY3Rpb24uZnJvbV9kZWNpbWFsLCBidXQgc3RpbGwgdG9vIHNsb3cuCi1kZWYgX2RlY2ltYWxfdG9fcmF0aW8oZCk6Ci0gICAgIiIiQ29udmVydCBEZWNpbWFsIGQgdG8gZXhhY3QgaW50ZWdlciByYXRpbyAobnVtZXJhdG9yLCBkZW5vbWluYXRvcikuCi0KLSAgICA+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCi0gICAgPj4+IF9kZWNpbWFsX3RvX3JhdGlvKERlY2ltYWwoIjIuNiIpKQotICAgICgyNiwgMTApCi0KLSAgICAiIiIKLSAgICBzaWduLCBkaWdpdHMsIGV4cCA9IGQuYXNfdHVwbGUoKQotICAgIGlmIGV4cCBpbiAoJ0YnLCAnbicsICdOJyk6ICAjIElORiwgTkFOLCBzTkFOCi0gICAgICAgIGFzc2VydCBub3QgZC5pc19maW5pdGUoKQotICAgICAgICByZXR1cm4gKGQsIE5vbmUpCi0gICAgbnVtID0gMAotICAgIGZvciBkaWdpdCBpbiBkaWdpdHM6Ci0gICAgICAgIG51bSA9IG51bSoxMCArIGRpZ2l0Ci0gICAgaWYgZXhwIDwgMDoKLSAgICAgICAgZGVuID0gMTAqKi1leHAKLSAgICBlbHNlOgotICAgICAgICBudW0gKj0gMTAqKmV4cAotICAgICAgICBkZW4gPSAxCi0gICAgaWYgc2lnbjoKLSAgICAgICAgbnVtID0gLW51bQotICAgIHJldHVybiAobnVtLCBkZW4pCi0KLQogZGVmIF9jb252ZXJ0KHZhbHVlLCBUKToKICAgICAiIiJDb252ZXJ0IHZhbHVlIHRvIGdpdmVuIG51bWVyaWMgdHlwZSBULiIiIgogICAgIGlmIHR5cGUodmFsdWUpIGlzIFQ6CkBAIC0zMDUsNiArMjc2LDIxIEBACiAgICAgcmV0dXJuIHRhYmxlCiAKIAorZGVmIF9maW5kX2x0ZXEoYSwgeCk6CisgICAgJ0xvY2F0ZSB0aGUgbGVmdG1vc3QgdmFsdWUgZXhhY3RseSBlcXVhbCB0byB4JworICAgIGkgPSBiaXNlY3RfbGVmdChhLCB4KQorICAgIGlmIGkgIT0gbGVuKGEpIGFuZCBhW2ldID09IHg6CisgICAgICAgIHJldHVybiBpCisgICAgcmFpc2UgVmFsdWVFcnJvcgorCisKK2RlZiBfZmluZF9ydGVxKGEsIGwsIHgpOgorICAgICdMb2NhdGUgdGhlIHJpZ2h0bW9zdCB2YWx1ZSBleGFjdGx5IGVxdWFsIHRvIHgnCisgICAgaSA9IGJpc2VjdF9yaWdodChhLCB4LCBsbz1sKQorICAgIGlmIGkgIT0gKGxlbihhKSsxKSBhbmQgYVtpLTFdID09IHg6CisgICAgICAgIHJldHVybiBpLTEKKyAgICByYWlzZSBWYWx1ZUVycm9yCisKICMgPT09IE1lYXN1cmVzIG9mIGNlbnRyYWwgdGVuZGVuY3kgKGF2ZXJhZ2VzKSA9PT0KIAogZGVmIG1lYW4oZGF0YSk6CkBAIC00NDIsOSArNDI4LDE1IEBACiAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgIyBNaXhlZCB0eXBlLiBGb3Igbm93IHdlIGp1c3QgY29lcmNlIHRvIGZsb2F0LgogICAgICAgICBMID0gZmxvYXQoeCkgLSBmbG9hdChpbnRlcnZhbCkvMgotICAgIGNmID0gZGF0YS5pbmRleCh4KSAgIyBOdW1iZXIgb2YgdmFsdWVzIGJlbG93IHRoZSBtZWRpYW4gaW50ZXJ2YWwuCi0gICAgIyBGSVhNRSBUaGUgZm9sbG93aW5nIGxpbmUgY291bGQgYmUgbW9yZSBlZmZpY2llbnQgZm9yIGJpZyBsaXN0cy4KLSAgICBmID0gZGF0YS5jb3VudCh4KSAgIyBOdW1iZXIgb2YgZGF0YSBwb2ludHMgaW4gdGhlIG1lZGlhbiBpbnRlcnZhbC4KKworICAgICMgVXNlcyBiaXNlY3Rpb24gc2VhcmNoIHRvIHNlYXJjaCBmb3IgeCBpbiBkYXRhIHdpdGggbG9nKG4pIHRpbWUgY29tcGxleGl0eQorICAgICMgRmluZCB0aGUgcG9zaXRpb24gb2YgbGVmdG1vc3Qgb2NjdXJyZW5jZSBvZiB4IGluIGRhdGEKKyAgICBsMSA9IF9maW5kX2x0ZXEoZGF0YSwgeCkKKyAgICAjIEZpbmQgdGhlIHBvc2l0aW9uIG9mIHJpZ2h0bW9zdCBvY2N1cnJlbmNlIG9mIHggaW4gZGF0YVtsMS4uLmxlbihkYXRhKV0KKyAgICAjIEFzc3VtaW5nIGFsd2F5cyBsMSA8PSBsMgorICAgIGwyID0gX2ZpbmRfcnRlcShkYXRhLCBsMSwgeCkKKyAgICBjZiA9IGwxCisgICAgZiA9IGwyIC0gbDEgKyAxCiAgICAgcmV0dXJuIEwgKyBpbnRlcnZhbCoobi8yIC0gY2YpL2YKIAogCmRpZmYgLS1naXQgYS9MaWIvc3RyaW5nLnB5IGIvTGliL3N0cmluZy5weQppbmRleCA4OTI4N2M0Li43Mjk4Yzg5IDEwMDY0NAotLS0gYS9MaWIvc3RyaW5nLnB5CisrKyBiL0xpYi9zdHJpbmcucHkKQEAgLTExNiwxMCArMTE2LDcgQEAKICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG1vc3QgY29tbW9uIHBhdGggZmlyc3QuCiAgICAgICAgICAgICBuYW1lZCA9IG1vLmdyb3VwKCduYW1lZCcpIG9yIG1vLmdyb3VwKCdicmFjZWQnKQogICAgICAgICAgICAgaWYgbmFtZWQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgdmFsID0gbWFwcGluZ1tuYW1lZF0KLSAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyIHdpbGwKLSAgICAgICAgICAgICAgICAjIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgotICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKHZhbCwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihtYXBwaW5nW25hbWVkXSkKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyCiAgICAgICAgICAgICBpZiBtby5ncm91cCgnaW52YWxpZCcpIGlzIG5vdCBOb25lOgpAQCAtMTQ2LDkgKzE0Myw3IEBACiAgICAgICAgICAgICBuYW1lZCA9IG1vLmdyb3VwKCduYW1lZCcpIG9yIG1vLmdyb3VwKCdicmFjZWQnKQogICAgICAgICAgICAgaWYgbmFtZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyCi0gICAgICAgICAgICAgICAgICAgICMgd2lsbCBmYWlsIGlmIHZhbCBpcyBhIFVuaWNvZGUgY29udGFpbmluZyBub24tQVNDSUkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAobWFwcGluZ1tuYW1lZF0sKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKG1hcHBpbmdbbmFtZWRdKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vLmdyb3VwKCkKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvc3VicHJvY2Vzcy5weSBiL0xpYi9zdWJwcm9jZXNzLnB5CmluZGV4IGQ4ZDZhYjIuLjNkZWEwODkgMTAwNjQ0Ci0tLSBhL0xpYi9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi9zdWJwcm9jZXNzLnB5CkBAIC0zNzIsOSArMzcyLDExIEBACiAKIAogY2xhc3MgQ2FsbGVkUHJvY2Vzc0Vycm9yKFN1YnByb2Nlc3NFcnJvcik6Ci0gICAgIiIiVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSBwcm9jZXNzIHJ1biBieSBjaGVja19jYWxsKCkgb3IKLSAgICBjaGVja19vdXRwdXQoKSByZXR1cm5zIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMuCi0gICAgVGhlIGV4aXQgc3RhdHVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZTsKKyAgICAiIiJSYWlzZWQgd2hlbiBhIGNoZWNrX2NhbGwoKSBvciBjaGVja19vdXRwdXQoKSBwcm9jZXNzIHJldHVybnMgbm9uLXplcm8uCisKKyAgICBUaGUgZXhpdCBzdGF0dXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlLCBuZWdhdGl2ZQorICAgIGlmIGl0IHJlcHJlc2VudHMgYSBzaWduYWwgbnVtYmVyLgorCiAgICAgY2hlY2tfb3V0cHV0KCkgd2lsbCBhbHNvIHN0b3JlIHRoZSBvdXRwdXQgaW4gdGhlIG91dHB1dCBhdHRyaWJ1dGUuCiAgICAgIiIiCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJldHVybmNvZGUsIGNtZCwgb3V0cHV0PU5vbmUsIHN0ZGVycj1Ob25lKToKQEAgLTM4NCw3ICszODYsMTYgQEAKICAgICAgICAgc2VsZi5zdGRlcnIgPSBzdGRlcnIKIAogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyByZXR1cm5lZCBub24temVybyBleGl0IHN0YXR1cyAlZCIgJSAoc2VsZi5jbWQsIHNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGFuZCBzZWxmLnJldHVybmNvZGUgPCAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiAiQ29tbWFuZCAnJXMnIGRpZWQgd2l0aCAlci4iICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbWQsIHNpZ25hbC5TaWduYWxzKC1zZWxmLnJldHVybmNvZGUpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDb21tYW5kICclcycgZGllZCB3aXRoIHVua25vd24gc2lnbmFsICVkLiIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNtZCwgLXNlbGYucmV0dXJuY29kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiQ29tbWFuZCAnJXMnIHJldHVybmVkIG5vbi16ZXJvIGV4aXQgc3RhdHVzICVkLiIgJSAoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY21kLCBzZWxmLnJldHVybmNvZGUpCiAKICAgICBAcHJvcGVydHkKICAgICBkZWYgc3Rkb3V0KHNlbGYpOgpAQCAtNDcxLDcgKzQ4Miw4IEBACiAgICAgX19hbGxfXy5leHRlbmQoWyJDUkVBVEVfTkVXX0NPTlNPTEUiLCAiQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQIiwKICAgICAgICAgICAgICAgICAgICAgIlNURF9JTlBVVF9IQU5ETEUiLCAiU1REX09VVFBVVF9IQU5ETEUiLAogICAgICAgICAgICAgICAgICAgICAiU1REX0VSUk9SX0hBTkRMRSIsICJTV19ISURFIiwKLSAgICAgICAgICAgICAgICAgICAgIlNUQVJURl9VU0VTVERIQU5ETEVTIiwgIlNUQVJURl9VU0VTSE9XV0lORE9XIl0pCisgICAgICAgICAgICAgICAgICAgICJTVEFSVEZfVVNFU1RESEFORExFUyIsICJTVEFSVEZfVVNFU0hPV1dJTkRPVyIsCisgICAgICAgICAgICAgICAgICAgICJTVEFSVFVQSU5GTyJdKQogCiAgICAgY2xhc3MgSGFuZGxlKGludCk6CiAgICAgICAgIGNsb3NlZCA9IEZhbHNlCkBAIC01MjAsNiArNTMyLDE2IEBACiAjIGJ1dCBpdCdzIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgaW1wb3J0ZWQgd2hlbiBQeXRob24gaXMgY29tcGlsZWQgd2l0aG91dAogIyB0aHJlYWRzLgogCitkZWYgX29wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyByZXByb2R1Y2luZyB0aGUgY3VycmVudAorICAgIG9wdGltaXphdGlvbiBzZXR0aW5ncyBpbiBzeXMuZmxhZ3MuIiIiCisgICAgYXJncyA9IFtdCisgICAgdmFsdWUgPSBzeXMuZmxhZ3Mub3B0aW1pemUKKyAgICBpZiB2YWx1ZSA+IDA6CisgICAgICAgIGFyZ3MuYXBwZW5kKCctJyArICdPJyAqIHZhbHVlKQorICAgIHJldHVybiBhcmdzCisKKwogZGVmIF9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKToKICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgcmVwcm9kdWNpbmcgdGhlIGN1cnJlbnQKICAgICBzZXR0aW5ncyBpbiBzeXMuZmxhZ3MgYW5kIHN5cy53YXJub3B0aW9ucy4iIiIKQEAgLTUyNyw3ICs1NDksNiBAQAogICAgICAgICAnZGVidWcnOiAnZCcsCiAgICAgICAgICMgJ2luc3BlY3QnOiAnaScsCiAgICAgICAgICMgJ2ludGVyYWN0aXZlJzogJ2knLAotICAgICAgICAnb3B0aW1pemUnOiAnTycsCiAgICAgICAgICdkb250X3dyaXRlX2J5dGVjb2RlJzogJ0InLAogICAgICAgICAnbm9fdXNlcl9zaXRlJzogJ3MnLAogICAgICAgICAnbm9fc2l0ZSc6ICdTJywKQEAgLTUzNSw4ICs1NTYsOSBAQAogICAgICAgICAndmVyYm9zZSc6ICd2JywKICAgICAgICAgJ2J5dGVzX3dhcm5pbmcnOiAnYicsCiAgICAgICAgICdxdWlldCc6ICdxJywKKyAgICAgICAgIyAtTyBpcyBoYW5kbGVkIGluIF9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQogICAgIH0KLSAgICBhcmdzID0gW10KKyAgICBhcmdzID0gX29wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCiAgICAgZm9yIGZsYWcsIG9wdCBpbiBmbGFnX29wdF9tYXAuaXRlbXMoKToKICAgICAgICAgdiA9IGdldGF0dHIoc3lzLmZsYWdzLCBmbGFnKQogICAgICAgICBpZiB2ID4gMDoKQEAgLTk3MSw3ICs5OTMsNiBAQAogCiAgICAgICAgICAgICByYWlzZQogCi0KICAgICBkZWYgX3RyYW5zbGF0ZV9uZXdsaW5lcyhzZWxmLCBkYXRhLCBlbmNvZGluZyk6CiAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZShlbmNvZGluZykKICAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgiXHJcbiIsICJcbiIpLnJlcGxhY2UoIlxyIiwgIlxuIikKQEAgLTk5NSw2ICsxMDE2LDExIEBACiAgICAgICAgIGlmIG5vdCBzZWxmLl9jaGlsZF9jcmVhdGVkOgogICAgICAgICAgICAgIyBXZSBkaWRuJ3QgZ2V0IHRvIHN1Y2Nlc3NmdWxseSBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzLgogICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgIyBOb3QgcmVhZGluZyBzdWJwcm9jZXNzIGV4aXQgc3RhdHVzIGNyZWF0ZXMgYSB6b21iaSBwcm9jZXNzIHdoaWNoCisgICAgICAgICAgICAjIGlzIG9ubHkgZGVzdHJveWVkIGF0IHRoZSBwYXJlbnQgcHl0aG9uIHByb2Nlc3MgZXhpdAorICAgICAgICAgICAgd2FybmluZ3Mud2Fybigic3VicHJvY2VzcyAlcyBpcyBzdGlsbCBydW5uaW5nIiAlIHNlbGYucGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVdhcm5pbmcsIHNvdXJjZT1zZWxmKQogICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgogICAgICAgICBzZWxmLl9pbnRlcm5hbF9wb2xsKF9kZWFkc3RhdGU9X21heHNpemUpCiAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lIGFuZCBfYWN0aXZlIGlzIG5vdCBOb25lOgpAQCAtMTUyMCw5ICsxNTQ2LDE0IEBACiAKICAgICAgICAgICAgIGlmIGVycnBpcGVfZGF0YToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIG9zLndhaXRwaWQoc2VsZi5waWQsIDApCisgICAgICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChzZWxmLnBpZCwgMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX2V4aXRzdGF0dXMoc3RzKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gc3lzLm1heHNpemUKICAgICAgICAgICAgICAgICBleGNlcHQgQ2hpbGRQcm9jZXNzRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHBhc3MKKwogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX25hbWUsIGhleF9lcnJubywgZXJyX21zZyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJwaXBlX2RhdGEuc3BsaXQoYic6JywgMikpCmRpZmYgLS1naXQgYS9MaWIvc3lzY29uZmlnLnB5IGIvTGliL3N5c2NvbmZpZy5weQppbmRleCA5YzM0YmUwLi5lZjUzMDYxIDEwMDY0NAotLS0gYS9MaWIvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9zeXNjb25maWcucHkKQEAgLTg2LDggKzg2LDggQEAKICAjIEZJWE1FIGRvbid0IHJlbHkgb24gc3lzLnZlcnNpb24gaGVyZSwgaXRzIGZvcm1hdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwKICAjIG9mIENQeXRob24sIHVzZSBzeXMudmVyc2lvbl9pbmZvIG9yIHN5cy5oZXh2ZXJzaW9uCiBfUFlfVkVSU0lPTiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KLV9QWV9WRVJTSU9OX1NIT1JUID0gc3lzLnZlcnNpb25bOjNdCi1fUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QgPSBfUFlfVkVSU0lPTlswXSArIF9QWV9WRVJTSU9OWzJdCitfUFlfVkVSU0lPTl9TSE9SVCA9ICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQorX1BZX1ZFUlNJT05fU0hPUlRfTk9fRE9UID0gJyVkJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIF9QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpCiBfQkFTRV9QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5iYXNlX3ByZWZpeCkKIF9FWEVDX1BSRUZJWCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWNfcHJlZml4KQpAQCAtMzM3LDYgKzMzNyw4IEBACiAgICAgICAgIGNvbmZpZ19kaXJfbmFtZSA9ICdjb25maWctJXMlcycgJSAoX1BZX1ZFUlNJT05fU0hPUlQsIHN5cy5hYmlmbGFncykKICAgICBlbHNlOgogICAgICAgICBjb25maWdfZGlyX25hbWUgPSAnY29uZmlnJworICAgIGlmIGhhc2F0dHIoc3lzLmltcGxlbWVudGF0aW9uLCAnX211bHRpYXJjaCcpOgorICAgICAgICBjb25maWdfZGlyX25hbWUgKz0gJy0lcycgJSBzeXMuaW1wbGVtZW50YXRpb24uX211bHRpYXJjaAogICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZ2V0X3BhdGgoJ3N0ZGxpYicpLCBjb25maWdfZGlyX25hbWUsICdNYWtlZmlsZScpCiAKIGRlZiBfZ2VuZXJhdGVfcG9zaXhfdmFycygpOgpAQCAtMzc5LDE0ICszODEsMTQgQEAKICAgICAjIF9zeXNjb25maWdkYXRhIG1vZHVsZSBtYW51YWxseSBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgYnVpbGQgdmFycy4KICAgICAjIFRoaXMgaXMgbW9yZSB0aGFuIHN1ZmZpY2llbnQgZm9yIGVuc3VyaW5nIHRoZSBzdWJzZXF1ZW50IGNhbGwgdG8KICAgICAjIGdldF9wbGF0Zm9ybSgpIHN1Y2NlZWRzLgotICAgIG5hbWUgPSAnX3N5c2NvbmZpZ2RhdGEnCisgICAgbmFtZSA9ICdfc3lzY29uZmlnZGF0YV8nICsgc3lzLmFiaWZsYWdzCiAgICAgaWYgJ2RhcndpbicgaW4gc3lzLnBsYXRmb3JtOgogICAgICAgICBpbXBvcnQgdHlwZXMKICAgICAgICAgbW9kdWxlID0gdHlwZXMuTW9kdWxlVHlwZShuYW1lKQogICAgICAgICBtb2R1bGUuYnVpbGRfdGltZV92YXJzID0gdmFycwogICAgICAgICBzeXMubW9kdWxlc1tuYW1lXSA9IG1vZHVsZQogCi0gICAgcHlidWlsZGRpciA9ICdidWlsZC9saWIuJXMtJXMnICUgKGdldF9wbGF0Zm9ybSgpLCBzeXMudmVyc2lvbls6M10pCisgICAgcHlidWlsZGRpciA9ICdidWlsZC9saWIuJXMtJXMnICUgKGdldF9wbGF0Zm9ybSgpLCBfUFlfVkVSU0lPTl9TSE9SVCkKICAgICBpZiBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKICAgICAgICAgcHlidWlsZGRpciArPSAnLXB5ZGVidWcnCiAgICAgb3MubWFrZWRpcnMocHlidWlsZGRpciwgZXhpc3Rfb2s9VHJ1ZSkKQEAgLTQwNSw3ICs0MDcsOSBAQAogZGVmIF9pbml0X3Bvc2l4KHZhcnMpOgogICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgUE9TSVggc3lzdGVtcy4iIiIKICAgICAjIF9zeXNjb25maWdkYXRhIGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLCBzZWUgX2dlbmVyYXRlX3Bvc2l4X3ZhcnMoKQotICAgIGZyb20gX3N5c2NvbmZpZ2RhdGEgaW1wb3J0IGJ1aWxkX3RpbWVfdmFycworICAgIG5hbWUgPSAnX3N5c2NvbmZpZ2RhdGFfJyArIHN5cy5hYmlmbGFncworICAgIF90ZW1wID0gX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJ2J1aWxkX3RpbWVfdmFycyddLCAwKQorICAgIGJ1aWxkX3RpbWVfdmFycyA9IF90ZW1wLmJ1aWxkX3RpbWVfdmFycwogICAgIHZhcnMudXBkYXRlKGJ1aWxkX3RpbWVfdmFycykKIAogZGVmIF9pbml0X25vbl9wb3NpeCh2YXJzKToKQEAgLTUxOCw3ICs1MjIsNyBAQAogICAgICAgICBfQ09ORklHX1ZBUlNbJ2V4ZWNfcHJlZml4J10gPSBfRVhFQ19QUkVGSVgKICAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uJ10gPSBfUFlfVkVSU0lPTgogICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fc2hvcnQnXSA9IF9QWV9WRVJTSU9OX1NIT1JUCi0gICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbl9ub2RvdCddID0gX1BZX1ZFUlNJT05bMF0gKyBfUFlfVkVSU0lPTlsyXQorICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fbm9kb3QnXSA9IF9QWV9WRVJTSU9OX1NIT1JUX05PX0RPVAogICAgICAgICBfQ09ORklHX1ZBUlNbJ2luc3RhbGxlZF9iYXNlJ10gPSBfQkFTRV9QUkVGSVgKICAgICAgICAgX0NPTkZJR19WQVJTWydiYXNlJ10gPSBfUFJFRklYCiAgICAgICAgIF9DT05GSUdfVkFSU1snaW5zdGFsbGVkX3BsYXRiYXNlJ10gPSBfQkFTRV9FWEVDX1BSRUZJWApkaWZmIC0tZ2l0IGEvTGliL3RhcmZpbGUucHkgYi9MaWIvdGFyZmlsZS5weQppbmRleCA3MjFmOWQ3Li5kZjQ3NDVkIDEwMDc1NQotLS0gYS9MaWIvdGFyZmlsZS5weQorKysgYi9MaWIvdGFyZmlsZS5weQpAQCAtNjQsNyArNjQsMTAgQEAKICAgICBwYXNzCiAKICMgZnJvbSB0YXJmaWxlIGltcG9ydCAqCi1fX2FsbF9fID0gWyJUYXJGaWxlIiwgIlRhckluZm8iLCAiaXNfdGFyZmlsZSIsICJUYXJFcnJvciJdCitfX2FsbF9fID0gWyJUYXJGaWxlIiwgIlRhckluZm8iLCAiaXNfdGFyZmlsZSIsICJUYXJFcnJvciIsICJSZWFkRXJyb3IiLAorICAgICAgICAgICAiQ29tcHJlc3Npb25FcnJvciIsICJTdHJlYW1FcnJvciIsICJFeHRyYWN0RXJyb3IiLCAiSGVhZGVyRXJyb3IiLAorICAgICAgICAgICAiRU5DT0RJTkciLCAiVVNUQVJfRk9STUFUIiwgIkdOVV9GT1JNQVQiLCAiUEFYX0ZPUk1BVCIsCisgICAgICAgICAgICJERUZBVUxUX0ZPUk1BVCIsICJvcGVuIl0KIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB0YXIgY29uc3RhbnRzCkBAIC0yMzc0LDkgKzIzNzcsMzIgQEAKICAgICAgICAgIiIiUHJvdmlkZSBhbiBpdGVyYXRvciBvYmplY3QuCiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLl9sb2FkZWQ6Ci0gICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLm1lbWJlcnMpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gVGFySXRlcihzZWxmKQorICAgICAgICAgICAgeWllbGQgZnJvbSBzZWxmLm1lbWJlcnMKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgWWllbGQgaXRlbXMgdXNpbmcgVGFyRmlsZSdzIG5leHQoKSBtZXRob2QuCisgICAgICAgICMgV2hlbiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZCwgc2V0IFRhckZpbGUgYXMgX2xvYWRlZC4KKyAgICAgICAgaW5kZXggPSAwCisgICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgorICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKKyAgICAgICAgIyB3aGljaCB3aWxsIGhhdmUgYWxyZWFkeSBleGhhdXN0ZWQgdGhlIG5leHQoKSBtZXRob2QuCisgICAgICAgIGlmIHNlbGYuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5uZXh0KCkKKyAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgIHlpZWxkIHRhcmluZm8KKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgaW5kZXggPCBsZW4oc2VsZi5tZW1iZXJzKToKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5tZW1iZXJzW2luZGV4XQorICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5fbG9hZGVkOgorICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQorICAgICAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgIHlpZWxkIHRhcmluZm8KIAogICAgIGRlZiBfZGJnKHNlbGYsIGxldmVsLCBtc2cpOgogICAgICAgICAiIiJXcml0ZSBkZWJ1Z2dpbmcgb3V0cHV0IHRvIHN5cy5zdGRlcnIuCkBAIC0yMzk3LDQ1ICsyNDIzLDYgQEAKICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKLSMgY2xhc3MgVGFyRmlsZQotCi1jbGFzcyBUYXJJdGVyOgotICAgICIiIkl0ZXJhdG9yIENsYXNzLgotCi0gICAgICAgZm9yIHRhcmluZm8gaW4gVGFyRmlsZSguLi4pOgotICAgICAgICAgICBzdWl0ZS4uLgotICAgICIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUpOgotICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJdGVyIG9iamVjdC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYudGFyZmlsZSA9IHRhcmZpbGUKLSAgICAgICAgc2VsZi5pbmRleCA9IDAKLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgICIiIlJldHVybiBpdGVyYXRvciBvYmplY3QuCi0gICAgICAgICIiIgotICAgICAgICByZXR1cm4gc2VsZgotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IGl0ZW0gdXNpbmcgVGFyRmlsZSdzIG5leHQoKSBtZXRob2QuCi0gICAgICAgICAgIFdoZW4gYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIHJlYWQsIHNldCBUYXJGaWxlIGFzIF9sb2FkZWQuCi0gICAgICAgICIiIgotICAgICAgICAjIEZpeCBmb3IgU0YgIzExMDA0Mjk6IFVuZGVyIHJhcmUgY2lyY3Vtc3RhbmNlcyBpdCBjYW4KLSAgICAgICAgIyBoYXBwZW4gdGhhdCBnZXRtZW1iZXJzKCkgaXMgY2FsbGVkIGR1cmluZyBpdGVyYXRpb24sCi0gICAgICAgICMgd2hpY2ggd2lsbCBjYXVzZSBUYXJJdGVyIHRvIHN0b3AgcHJlbWF0dXJlbHkuCi0KLSAgICAgICAgaWYgc2VsZi5pbmRleCA9PSAwIGFuZCBzZWxmLnRhcmZpbGUuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQotICAgICAgICBlbGlmIHNlbGYuaW5kZXggPCBsZW4oc2VsZi50YXJmaWxlLm1lbWJlcnMpOgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5tZW1iZXJzW3NlbGYuaW5kZXhdCi0gICAgICAgIGVsaWYgbm90IHNlbGYudGFyZmlsZS5fbG9hZGVkOgotICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5uZXh0KCkKLSAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvOgotICAgICAgICAgICAgICAgIHNlbGYudGFyZmlsZS5fbG9hZGVkID0gVHJ1ZQotICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KLSAgICAgICAgc2VsZi5pbmRleCArPSAxCi0gICAgICAgIHJldHVybiB0YXJpbmZvCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBleHBvcnRlZCBmdW5jdGlvbnMKZGlmZiAtLWdpdCBhL0xpYi90ZWxuZXRsaWIucHkgYi9MaWIvdGVsbmV0bGliLnB5CmluZGV4IDcyZGFiYzcuLmIwODYzYjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZWxuZXRsaWIucHkKKysrIGIvTGliL3RlbG5ldGxpYi5weQpAQCAtNjM3LDYgKzYzNywxMiBAQAogICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKICAgICAgICAgcmV0dXJuICgtMSwgTm9uZSwgdGV4dCkKIAorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCiAKIGRlZiB0ZXN0KCk6CiAgICAgIiIiVGVzdCBwcm9ncmFtIGZvciB0ZWxuZXRsaWIuCkBAIC02NjAsMTEgKzY2NiwxMCBAQAogICAgICAgICAgICAgcG9ydCA9IGludChwb3J0c3RyKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHBvcnQgPSBzb2NrZXQuZ2V0c2VydmJ5bmFtZShwb3J0c3RyLCAndGNwJykKLSAgICB0biA9IFRlbG5ldCgpCi0gICAgdG4uc2V0X2RlYnVnbGV2ZWwoZGVidWdsZXZlbCkKLSAgICB0bi5vcGVuKGhvc3QsIHBvcnQsIHRpbWVvdXQ9MC41KQotICAgIHRuLmludGVyYWN0KCkKLSAgICB0bi5jbG9zZSgpCisgICAgd2l0aCBUZWxuZXQoKSBhcyB0bjoKKyAgICAgICAgdG4uc2V0X2RlYnVnbGV2ZWwoZGVidWdsZXZlbCkKKyAgICAgICAgdG4ub3Blbihob3N0LCBwb3J0LCB0aW1lb3V0PTAuNSkKKyAgICAgICAgdG4uaW50ZXJhY3QoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3RlbXBmaWxlLnB5IGIvTGliL3RlbXBmaWxlLnB5CmluZGV4IGFkNjg3YjkuLjYxNDYyMzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZW1wZmlsZS5weQorKysgYi9MaWIvdGVtcGZpbGUucHkKQEAgLTc5Nyw3ICs3OTcsNiBAQAogICAgICAgICBfc2h1dGlsLnJtdHJlZShuYW1lKQogICAgICAgICBfd2FybmluZ3Mud2Fybih3YXJuX21lc3NhZ2UsIFJlc291cmNlV2FybmluZykKIAotCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIjx7fSB7IXJ9PiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm5hbWUpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L19fbWFpbl9fLnB5IGIvTGliL3Rlc3QvX19tYWluX18ucHkKaW5kZXggZDVmYmUxNS4uMTlhNmIyYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvX19tYWluX18ucHkKKysrIGIvTGliL3Rlc3QvX19tYWluX18ucHkKQEAgLTEsMyArMSwyIEBACi1mcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0Ci0KLXJlZ3J0ZXN0Lm1haW5faW5fdGVtcF9jd2QoKQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0IGltcG9ydCBtYWluCittYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weSBiL0xpYi90ZXN0L190ZXN0X211bHRpcHJvY2Vzc2luZy5weQppbmRleCAxMWE2MzEwLi4xNjQwN2RiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9fdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKKysrIGIvTGliL3Rlc3QvX3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CkBAIC0xNjY4LDYgKzE2NjgsMTAgQEAKIGRlZiBtdWwoeCwgeSk6CiAgICAgcmV0dXJuIHgqeQogCitkZWYgcmFpc2VfbGFyZ2VfdmFsdWVycm9yKHdhaXQpOgorICAgIHRpbWUuc2xlZXAod2FpdCkKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJ4IiAqIDEwMjQqKjIpCisKIGNsYXNzIFNheVdoZW5FcnJvcihWYWx1ZUVycm9yKTogcGFzcwogCiBkZWYgZXhjZXB0aW9uX3Rocm93aW5nX2dlbmVyYXRvcih0b3RhbCwgd2hlbik6CkBAIC0xOTEwLDYgKzE5MTQsMjYgQEAKICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKICAgICAgICAgICAgICAgICBwLmFwcGx5KHNlbGYuX3Rlc3Rfd3JhcHBlZF9leGNlcHRpb24pCiAKKyAgICBkZWYgdGVzdF9tYXBfbm9fZmFpbGZhc3Qoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzIzOTkyOiB0aGUgZmFpbC1mYXN0IGJlaGF2aW91ciB3aGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQKKyAgICAgICAgIyBkdXJpbmcgbWFwKCkgd291bGQgbWFrZSBQb29sLmpvaW4oKSBkZWFkbG9jaywgYmVjYXVzZSBhIHdvcmtlcgorICAgICAgICAjIHByb2Nlc3Mgd291bGQgZmlsbCB0aGUgcmVzdWx0IHF1ZXVlIChhZnRlciB0aGUgcmVzdWx0IGhhbmRsZXIgdGhyZWFkCisgICAgICAgICMgdGVybWluYXRlZCwgaGVuY2Ugbm90IGRyYWluaW5nIGl0IGFueW1vcmUpLgorCisgICAgICAgIHRfc3RhcnQgPSB0aW1lLnRpbWUoKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICB3aXRoIHNlbGYuUG9vbCgyKSBhcyBwOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcC5tYXAocmFpc2VfbGFyZ2VfdmFsdWVycm9yLCBbMCwgMV0pCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpCisgICAgICAgICAgICAgICAgICAgIHAuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBwLmpvaW4oKQorCisgICAgICAgICMgY2hlY2sgdGhhdCB3ZSBpbmRlZWQgd2FpdGVkIGZvciBhbGwgam9icworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIodGltZS50aW1lKCkgLSB0X3N0YXJ0LCAwLjkpCisKIAogZGVmIHJhaXNpbmcoKToKICAgICByYWlzZSBLZXlFcnJvcigia2V5IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2F1ZGlvdGVzdHMucHkgYi9MaWIvdGVzdC9hdWRpb3Rlc3RzLnB5CmluZGV4IDBhZTIyNDIuLmQzZThlOWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2F1ZGlvdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvYXVkaW90ZXN0cy5weQpAQCAtMSw5ICsxLDggQEAKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgVEVTVEZOLCB1bmxpbmsKLWltcG9ydCB1bml0dGVzdAogaW1wb3J0IGFycmF5CiBpbXBvcnQgaW8KIGltcG9ydCBwaWNrbGUKLWltcG9ydCBzeXMKKwogCiBjbGFzcyBVbnNlZWthYmxlSU8oaW8uRmlsZUlPKToKICAgICBkZWYgdGVsbChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2F1dG90ZXN0LnB5IGIvTGliL3Rlc3QvYXV0b3Rlc3QucHkKaW5kZXggNDFjMjA4OC4uZmE4NWNjMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvYXV0b3Rlc3QucHkKKysrIGIvTGliL3Rlc3QvYXV0b3Rlc3QucHkKQEAgLTEsNiArMSw1IEBACiAjIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcnVubmluZyByZWdydGVzdC5weSBmcm9tIHRoZSBjbWRsaW5lLgogIyBJdCBjYW4gYmUgZXNwZWNpYWxseSBoYW5keSBpZiB5b3UncmUgaW4gYW4gaW50ZXJhY3RpdmUgc2hlbGwsIGUuZy4sCiAjIGZyb20gdGVzdCBpbXBvcnQgYXV0b3Rlc3QuCi0KLWZyb20gdGVzdCBpbXBvcnQgcmVncnRlc3QKLXJlZ3J0ZXN0Lm1haW4oKQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0IGltcG9ydCBtYWluCittYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NhcGF0aC8wZTQwMTViOS4wIGIvTGliL3Rlc3QvY2FwYXRoLzBlNDAxNWI5LjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDI1OWIuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvY2FwYXRoLzBlNDAxNWI5LjAKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KLU1JSUNsVENDQWY2Z0F3SUJBZ0lKQUtHVTk1d0tSOHBUTUEwR0NTcUdTSWIzRFFFQkJRVUFNSEF4Q3pBSkJnTlYKLUJBWVRBbGhaTVJjd0ZRWURWUVFIREE1RFlYTjBiR1VnUVc1MGFISmhlREVqTUNFR0ExVUVDZ3dhVUhsMGFHOXUKLUlGTnZablIzWVhKbElFWnZkVzVrWVhScGIyNHhJekFoQmdOVkJBTU1Hbk5sYkdZdGMybG5ibVZrTG5CNWRHaHYKLWJuUmxjM1F1Ym1WME1CNFhEVEUwTVRFd01qRTRNRGt5T1ZvWERUSTBNVEF6TURFNE1Ea3lPVm93Y0RFTE1Ba0cKLUExVUVCaE1DV0ZreEZ6QVZCZ05WQkFjTURrTmhjM1JzWlNCQmJuUm9jbUY0TVNNd0lRWURWUVFLREJwUWVYUm8KLWIyNGdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiakVqTUNFR0ExVUVBd3dhYzJWc1ppMXphV2R1WldRdWNIbDAKLWFHOXVkR1Z6ZEM1dVpYUXdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTkRYUVhXOXRqeVoKLVh0MEl2MnRMTDEramlucjR3R2czNmlvTERMRmtNZisyWTFHTDB2MEJuS1lHNE4xT0tsQVUxNUxYR2VHZXI4dm0KLVN2L3lJdm1kckVMdmhBYmJvM3c0YTlUTVlRQTRYa0lWTGR2dTNtdk5PQWV0KzhQTUp4bjI2ZGJEaEc4MDlBTHYKLUVIWTU3bFFzQlMzRzU5Ulp5QlBWcUFxbUltV05KblZ6QWdNQkFBR2pOekExTUNVR0ExVWRFUVFlTUJ5Q0duTmwKLWJHWXRjMmxuYm1Wa0xuQjVkR2h2Ym5SbGMzUXVibVYwTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y04KLUFRRUZCUUFEZ1lFQUl1ekFoZ01vdUpwTmRmM1VSQ0hJaW5leW9TdDZXSy85K2V5VWNqbEtPckRvWE5aYUQ3MmgKLVRYTWVLWW9Xdkp5VmNTTEtMOGNrUHREb2JnUDJPVHQwVWt5QWFqMG4rWkhhcXExbEgyeVZmR1VBMUlMSnY1MTUKLUM4QnFidlZadXFtM2k3eWdtdzNicUUvbFlNZ09yWXRYWG5xT3J6Nm52c0U2WWM5VjlyRmZsT009Ci0tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jYXBhdGgvYjE5MzAyMTguMCBiL0xpYi90ZXN0L2NhcGF0aC9iMTkzMDIxOC4wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzM0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jYXBhdGgvYjE5MzAyMTguMApAQCAtMCwwICsxLDIxIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURiVENDQWxXZ0F3SUJBZ0lKQUxDU1pMSHkyaUhRTUEwR0NTcUdTSWIzRFFFQkJRVUFNRTB4Q3pBSkJnTlYKK0JBWVRBbGhaTVNZd0pBWURWUVFLREIxUWVYUm9iMjRnVTI5bWRIZGhjbVVnUm05MWJtUmhkR2x2YmlCRFFURVcKK01CUUdBMVVFQXd3TmIzVnlMV05oTFhObGNuWmxjakFlRncweE16QXhNRFF4T1RRM01EZGFGdzB5TXpBeE1ESXgKK09UUTNNRGRhTUUweEN6QUpCZ05WQkFZVEFsaFpNU1l3SkFZRFZRUUtEQjFRZVhSb2IyNGdVMjltZEhkaGNtVWcKK1JtOTFibVJoZEdsdmJpQkRRVEVXTUJRR0ExVUVBd3dOYjNWeUxXTmhMWE5sY25abGNqQ0NBU0l3RFFZSktvWkkKK2h2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBT2ZlNmVNTW53QzJvZjByVzViU2I4emd2b2E1SUY3c0EzcFYKK3ErcWs2ZmxKaGRKbTFlM0hldXBXamkyUDUwTGlZaWlwbjlZYmp1dTF0SnlmRkt2ZjVwU0xkaDArYlNSaDdReS8KK0FJcGhETjljeURaekZnRE5SN3B0cEtSMGlJTWpDaG44Q2FjOFNrdlQ1eDB0NU9wTVZDSHpKdHVKTnhqVUFydEEKK01sK2sveTBjOTlTNzdJN1BYSUtzNW53SWJFaUZZUWQvSmVCYzRMdzBYK0M1QkVkMXlFY0xqYnpXeUdoZk00TmkKKzBpQkVOYkd0Z1JxS3pidzFzRnlMUjlZWTZad1lsOHdCUENuTTZCN2s1TUc0M3VmQ0VSaUhXcE0wMktZbDl4UngKKzYrUWhvdElQTGk3VVlnQTEwOWJ2WEdCTFRLa1U0dDBWV0VZM015YTM1eTVkN1VMa3hVMENBd0VBQWFOUU1FNHcKK0hRWURWUjBPQkJZRUZMemRZdGwyMmh2U1ZHdlA0R2FiSGg1N1Znd0xNQjhHQTFVZEl3UVlNQmFBRkx6ZFl0bDIKKzJodlNWR3ZQNEdhYkhoNTdWZ3dMTUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUIKK0FIMEs5Y3VOMDEyOW1ZNzRLdys2NjhMWnBpZFBMbnN2RG1UWUhEVlFUdTc4a0xtTmJhakZ4Z2F3ci9NdHZ6dTQKK1FnZmRHSDF0bFZSWGhSaGdSeS9yZUJ2NTZCZjlXZzJIRnlpc1RHcm12Q24wOUZWd0tVTGVoZXFyYkNNR1pEQjEKK0FvNVR2RjRCTXpmTUhzMjRwUDNLNUY5bE80TWNodkZWQXFBNmo5dVJ0MEFVdE9lTjB1NXp1dVBsTkMyOGxHOU8KK0pBYjNYNHNPcDQ1cjNsNTE5REthVUxGRU01clFCZUo0Z3YvYjJvcGo2Nm5kMGIrZ1lhM2pub29rWFdJTzUweVIKK2YrL2ZORFk3TDEzMWhMSXZ4RzJUbGhwdk1DangyaEthWkxSQU14MjkzaXRUcU9xKzFyeE9sdlZFK3pJWXJ0VWYKKzltbXZ0azU3SFZqc082bFRvMTVZeUo0PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY2FwYXRoL2NlN2I4NjQzLjAgYi9MaWIvdGVzdC9jYXBhdGgvY2U3Yjg2NDMuMApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkMjU5Yi4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9jYXBhdGgvY2U3Yjg2NDMuMAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQotTUlJQ2xUQ0NBZjZnQXdJQkFnSUpBS0dVOTV3S1I4cFRNQTBHQ1NxR1NJYjNEUUVCQlFVQU1IQXhDekFKQmdOVgotQkFZVEFsaFpNUmN3RlFZRFZRUUhEQTVEWVhOMGJHVWdRVzUwYUhKaGVERWpNQ0VHQTFVRUNnd2FVSGwwYUc5dQotSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEl6QWhCZ05WQkFNTUduTmxiR1l0YzJsbmJtVmtMbkI1ZEdodgotYm5SbGMzUXVibVYwTUI0WERURTBNVEV3TWpFNE1Ea3lPVm9YRFRJME1UQXpNREU0TURreU9Wb3djREVMTUFrRwotQTFVRUJoTUNXRmt4RnpBVkJnTlZCQWNNRGtOaGMzUnNaU0JCYm5Sb2NtRjRNU013SVFZRFZRUUtEQnBRZVhSbwotYjI0Z1UyOW1kSGRoY21VZ1JtOTFibVJoZEdsdmJqRWpNQ0VHQTFVRUF3d2FjMlZzWmkxemFXZHVaV1F1Y0hsMAotYUc5dWRHVnpkQzV1WlhRd2daOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFORFhRWFc5dGp5WgotWHQwSXYydExMMStqaW5yNHdHZzM2aW9MRExGa01mKzJZMUdMMHYwQm5LWUc0TjFPS2xBVTE1TFhHZUdlcjh2bQotU3YveUl2bWRyRUx2aEFiYm8zdzRhOVRNWVFBNFhrSVZMZHZ1M212Tk9BZXQrOFBNSnhuMjZkYkRoRzgwOUFMdgotRUhZNTdsUXNCUzNHNTlSWnlCUFZxQXFtSW1XTkpuVnpBZ01CQUFHak56QTFNQ1VHQTFVZEVRUWVNQnlDR25ObAotYkdZdGMybG5ibVZrTG5CNWRHaHZiblJsYzNRdWJtVjBNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTgotQVFFRkJRQURnWUVBSXV6QWhnTW91SnBOZGYzVVJDSElpbmV5b1N0NldLLzkrZXlVY2psS09yRG9YTlphRDcyaAotVFhNZUtZb1d2SnlWY1NMS0w4Y2tQdERvYmdQMk9UdDBVa3lBYWowbitaSGFxcTFsSDJ5VmZHVUExSUxKdjUxNQotQzhCcWJ2Vlp1cW0zaTd5Z213M2JxRS9sWU1nT3JZdFhYbnFPcno2bnZzRTZZYzlWOXJGZmxPTT0KLS0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NhcGF0aC9jZWZmMTcxMC4wIGIvTGliL3Rlc3QvY2FwYXRoL2NlZmYxNzEwLjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczMzQ5YwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2NhcGF0aC9jZWZmMTcxMC4wCkBAIC0wLDAgKzEsMjEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRGJUQ0NBbFdnQXdJQkFnSUpBTENTWkxIeTJpSFFNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FMHhDekFKQmdOVgorQkFZVEFsaFpNU1l3SkFZRFZRUUtEQjFRZVhSb2IyNGdVMjltZEhkaGNtVWdSbTkxYm1SaGRHbHZiaUJEUVRFVworTUJRR0ExVUVBd3dOYjNWeUxXTmhMWE5sY25abGNqQWVGdzB4TXpBeE1EUXhPVFEzTURkYUZ3MHlNekF4TURJeAorT1RRM01EZGFNRTB4Q3pBSkJnTlZCQVlUQWxoWk1TWXdKQVlEVlFRS0RCMVFlWFJvYjI0Z1UyOW1kSGRoY21VZworUm05MWJtUmhkR2x2YmlCRFFURVdNQlFHQTFVRUF3d05iM1Z5TFdOaExYTmxjblpsY2pDQ0FTSXdEUVlKS29aSQoraHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPZmU2ZU1NbndDMm9mMHJXNWJTYjh6Z3ZvYTVJRjdzQTNwVgorcStxazZmbEpoZEptMWUzSGV1cFdqaTJQNTBMaVlpaXBuOVlianV1MXRKeWZGS3ZmNXBTTGRoMCtiU1JoN1F5LworQUlwaEROOWN5RFp6RmdETlI3cHRwS1IwaUlNakNobjhDYWM4U2t2VDV4MHQ1T3BNVkNIekp0dUpOeGpVQXJ0QQorTWwray95MGM5OVM3N0k3UFhJS3M1bndJYkVpRllRZC9KZUJjNEx3MFgrQzVCRWQxeUVjTGpield5R2hmTTROaQorMGlCRU5iR3RnUnFLemJ3MXNGeUxSOVlZNlp3WWw4d0JQQ25NNkI3azVNRzQzdWZDRVJpSFdwTTAyS1lsOXhSeAorNitRaG90SVBMaTdVWWdBMTA5YnZYR0JMVEtrVTR0MFZXRVkzTXlhMzV5NWQ3VUxreFUwQ0F3RUFBYU5RTUU0dworSFFZRFZSME9CQllFRkx6ZFl0bDIyaHZTVkd2UDRHYWJIaDU3Vmd3TE1COEdBMVVkSXdRWU1CYUFGTHpkWXRsMgorMmh2U1ZHdlA0R2FiSGg1N1Znd0xNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQgorQUgwSzljdU4wMTI5bVk3NEt3KzY2OExacGlkUExuc3ZEbVRZSERWUVR1NzhrTG1OYmFqRnhnYXdyL010dnp1NAorUWdmZEdIMXRsVlJYaFJoZ1J5L3JlQnY1NkJmOVdnMkhGeWlzVEdybXZDbjA5RlZ3S1VMZWhlcXJiQ01HWkRCMQorQW81VHZGNEJNemZNSHMyNHBQM0s1RjlsTzRNY2h2RlZBcUE2ajl1UnQwQVV0T2VOMHU1enV1UGxOQzI4bEc5TworSkFiM1g0c09wNDVyM2w1MTlES2FVTEZFTTVyUUJlSjRndi9iMm9wajY2bmQwYitnWWEzam5vb2tYV0lPNTB5UgorZisvZk5EWTdMMTMxaExJdnhHMlRsaHB2TUNqeDJoS2FaTFJBTXgyOTNpdFRxT3ErMXJ4T2x2VkUreklZcnRVZgorOW1tdnRrNTdIVmpzTzZsVG8xNVl5SjQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9kYXRldGltZXRlc3Rlci5weSBiL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CmluZGV4IGY1MjIyYzcuLjhmYzAxMzkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CisrKyBiL0xpYi90ZXN0L2RhdGV0aW1ldGVzdGVyLnB5CkBAIC0yODQsNyArMjg0LDggQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOiBzZWxmLkVTVC5kc3QoNSkKIAogICAgIGRlZiB0ZXN0X3R6bmFtZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnVVRDKzAwOjAwJywgdGltZXpvbmUoWkVSTykudHpuYW1lKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMnLCB0aW1lem9uZS51dGMudHpuYW1lKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMnLCB0aW1lem9uZShaRVJPKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQy0wNTowMCcsIHRpbWV6b25lKC01ICogSE9VUikudHpuYW1lKE5vbmUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdVVEMrMDk6MzAnLCB0aW1lem9uZSg5LjUgKiBIT1VSKS50em5hbWUoTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1VUQy0wMDowMScsIHRpbWV6b25lKHRpbWVkZWx0YShtaW51dGVzPS0xKSkudHpuYW1lKE5vbmUpKQpAQCAtMTU1OCwxMyArMTU1OSwzMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQogCiAgICAgZGVmIHRlc3RfaXNvZm9ybWF0KHNlbGYpOgotICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyLCA0LCA1LCAxLCAxMjMpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgICAgIjAwMDItMDMtMDJUMDQ6MDU6MDEuMDAwMTIzIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnVCcpLCAiMDAwMi0wMy0wMlQwNDowNTowMS4wMDAxMjMiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCcgJyksICIwMDAyLTAzLTAyIDA0OjA1OjAxLjAwMDEyMyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1x4MDAnKSwgIjAwMDItMDMtMDJceDAwMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1QnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnICcpLCAiMDAwMS0wMi0wMyAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCdceDAwJyksICIwMDAxLTAyLTAzXHgwMDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2hvdXJzJyksICIwMDAxLTAyLTAzVDA0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWludXRlcycpLCAiMDAwMS0wMi0wM1QwNDowNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdChzZXA9JyAnLCB0aW1lc3BlYz0nbWludXRlcycpLCAiMDAwMS0wMi0wMyAwNDowNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuaXNvZm9ybWF0LCB0aW1lc3BlYz0nZm9vJykKICAgICAgICAgIyBzdHIgaXMgSVNPIGZvcm1hdCB3aXRoIHRoZSBzZXBhcmF0b3IgZm9yY2VkIHRvIGEgYmxhbmsuCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDAwMi0wMy0wMiAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgIjAwMDEtMDItMDMgMDQ6MDU6MDEuMDAwMTIzIikKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0LCA1LCAxLCA5OTk1MDAsIHR6aW5mbz10aW1lem9uZS51dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS45OTkrMDA6MDAiKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQsIDUsIDEsIDk5OTUwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIwMDAxLTAyLTAzVDA0OjA1OjAxLjk5OSIpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nYXV0bycpLCAiMDAwMS0wMi0wM1QwNDowNTowMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMDAwMS0wMi0wM1QwNDowNTowMS4wMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKSwgIjAwMDEtMDItMDNUMDQ6MDU6MDEuMDAwMDAwIikKIAogICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAyLTAzLTAyVDAwOjAwOjAwIikKQEAgLTIzMjQsNiArMjM0NCwyMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDowMDowMC4xMDAwMDAiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksIHN0cih0KSkKIAorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9MTIzNDU2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdob3VycycpLCAiMTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaW51dGVzJyksICIxMjozNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J3NlY29uZHMnKSwgIjEyOjM0OjU2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWlsbGlzZWNvbmRzJyksICIxMjozNDo1Ni4xMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWNyb3NlY29uZHMnKSwgIjEyOjM0OjU2LjEyMzQ1NiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J2F1dG8nKSwgIjEyOjM0OjU2LjEyMzQ1NiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuaXNvZm9ybWF0LCB0aW1lc3BlYz0nbW9ua2V5JykKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhob3VyPTEyLCBtaW51dGU9MzQsIHNlY29uZD01NiwgbWljcm9zZWNvbmQ9OTk5NTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdtaWxsaXNlY29uZHMnKSwgIjEyOjM0OjU2Ljk5OSIpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoaG91cj0xMiwgbWludXRlPTM0LCBzZWNvbmQ9NTYsIG1pY3Jvc2Vjb25kPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQodGltZXNwZWM9J21pbGxpc2Vjb25kcycpLCAiMTI6MzQ6NTYuMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCh0aW1lc3BlYz0nbWljcm9zZWNvbmRzJyksICIxMjozNDo1Ni4wMDAwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KHRpbWVzcGVjPSdhdXRvJyksICIxMjozNDo1NiIpCisKICAgICBkZWYgdGVzdF8xNjUzNzM2KHNlbGYpOgogICAgICAgICAjIHZlcmlmeSBpdCBkb2Vzbid0IGFjY2VwdCBleHRyYSBrZXl3b3JkIGFyZ3VtZW50cwogICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhzZWNvbmQ9MSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkgYi9MaWIvdGVzdC9laW50cmRhdGEvZWludHJfdGVzdGVyLnB5CmluZGV4IDk5MzFhNTUuLmZmY2RiOTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2VpbnRyZGF0YS9laW50cl90ZXN0ZXIucHkKKysrIGIvTGliL3Rlc3QvZWludHJkYXRhL2VpbnRyX3Rlc3Rlci5weQpAQCAtOSw3ICs5LDcgQEAKICIiIgogCiBpbXBvcnQgY29udGV4dGxpYgotaW1wb3J0IGlvCitpbXBvcnQgZmF1bHRoYW5kbGVyCiBpbXBvcnQgb3MKIGltcG9ydCBzZWxlY3QKIGltcG9ydCBzaWduYWwKQEAgLTUwLDYgKzUwLDEwIEBACiAgICAgICAgIHNpZ25hbC5zZXRpdGltZXIoc2lnbmFsLklUSU1FUl9SRUFMLCBjbHMuc2lnbmFsX2RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5zaWduYWxfcGVyaW9kKQogCisgICAgICAgICMgSXNzdWUgIzI1Mjc3OiBVc2UgZmF1bHRoYW5kbGVyIHRvIHRyeSB0byBkZWJ1ZyBhIGhhbmcgb24gRnJlZUJTRAorICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIoMTAgKiA2MCwgZXhpdD1UcnVlKQorCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIHN0b3BfYWxhcm0oY2xzKToKICAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzaWduYWwuSVRJTUVSX1JFQUwsIDAsIDApCkBAIC01OCw2ICs2Miw4IEBACiAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKICAgICAgICAgY2xzLnN0b3BfYWxhcm0oKQogICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBjbHMub3JpZ19oYW5kbGVyKQorICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2NhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcicpOgorICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmNhbmNlbF9kdW1wX3RyYWNlYmFja19sYXRlcigpCiAKICAgICBkZWYgc3VicHJvY2VzcyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgIGNtZF9hcmdzID0gKHN5cy5leGVjdXRhYmxlLCAnLWMnKSArIGFyZ3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L19faW5pdF9fLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNSBAQAorIyBXZSBpbXBvcnQgaW1wb3J0bGliICpBU0FQKiBpbiBvcmRlciB0byB0ZXN0ICMxNTM4NgoraW1wb3J0IGltcG9ydGxpYgorCitmcm9tIHRlc3QubGlicmVncnRlc3QuY21kbGluZSBpbXBvcnQgX3BhcnNlX2FyZ3MsIFJFU09VUkNFX05BTUVTCitmcm9tIHRlc3QubGlicmVncnRlc3QubWFpbiBpbXBvcnQgbWFpbgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvY21kbGluZS5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L2NtZGxpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUwOWEwMQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L2NtZGxpbmUucHkKQEAgLTAsMCArMSwzNDIgQEAKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworCitVU0FHRSA9ICIiIlwKK3B5dGhvbiAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQorcHl0aG9uIHBhdGgvdG8vTGliL3Rlc3QvcmVncnRlc3QucHkgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCisiIiIKKworREVTQ1JJUFRJT04gPSAiIiJcCitSdW4gUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuCisKK0lmIG5vIGFyZ3VtZW50cyBvciBvcHRpb25zIGFyZSBwcm92aWRlZCwgZmluZHMgYWxsIGZpbGVzIG1hdGNoaW5nCit0aGUgcGF0dGVybiAidGVzdF8qIiBpbiB0aGUgTGliL3Rlc3Qgc3ViZGlyZWN0b3J5IGFuZCBydW5zCit0aGVtIGluIGFscGhhYmV0aWNhbCBvcmRlciAoYnV0IHNlZSAtTSBhbmQgLXUsIGJlbG93LCBmb3IgZXhjZXB0aW9ucykuCisKK0ZvciBtb3JlIHJpZ29yb3VzIHRlc3RpbmcsIGl0IGlzIHVzZWZ1bCB0byB1c2UgdGhlIGZvbGxvd2luZworY29tbWFuZCBsaW5lOgorCitweXRob24gLUUgLVdkIC1tIHRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIC4uLl0KKyIiIgorCitFUElMT0cgPSAiIiJcCitBZGRpdGlvbmFsIG9wdGlvbiBkZXRhaWxzOgorCistciByYW5kb21pemVzIHRlc3QgZXhlY3V0aW9uIG9yZGVyLiBZb3UgY2FuIHVzZSAtLXJhbmRzZWVkPWludCB0byBwcm92aWRlIGFuCitpbnQgc2VlZCB2YWx1ZSBmb3IgdGhlIHJhbmRvbWl6ZXI7IHRoaXMgaXMgdXNlZnVsIGZvciByZXByb2R1Y2luZyB0cm91Ymxlc29tZQordGVzdCBvcmRlcnMuCisKKy1zIE9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHJlZ3J0ZXN0IHVzaW5nIC1zLCB0aGUgZmlyc3QgdGVzdCBmaWxlIGZvdW5kCitvciB0aGUgZmlyc3QgdGVzdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcnVuLCBhbmQgdGhlIG5hbWUgb2YKK3RoZSBuZXh0IHRlc3QgaXMgcmVjb3JkZWQgaW4gYSBmaWxlIG5hbWVkIHB5bmV4dHRlc3QuICBJZiBydW4gZnJvbSB0aGUKK1B5dGhvbiBidWlsZCBkaXJlY3RvcnksIHB5bmV4dHRlc3QgaXMgbG9jYXRlZCBpbiB0aGUgJ2J1aWxkJyBzdWJkaXJlY3RvcnksCitvdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBpbiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkuICBPbiBzdWJzZXF1ZW50IHJ1bnMsCit0aGUgdGVzdCBpbiBweW5leHR0ZXN0IGlzIHJ1biwgYW5kIHRoZSBuZXh0IHRlc3QgaXMgd3JpdHRlbiB0byBweW5leHR0ZXN0LgorV2hlbiB0aGUgbGFzdCB0ZXN0IGhhcyBiZWVuIHJ1biwgcHluZXh0dGVzdCBpcyBkZWxldGVkLiAgSW4gdGhpcyB3YXkgaXQKK2lzIHBvc3NpYmxlIHRvIHNpbmdsZSBzdGVwIHRocm91Z2ggdGhlIHRlc3QgZmlsZXMuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCitkb2luZyBtZW1vcnkgYW5hbHlzaXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgd2hpY2ggcHJvY2VzcyB0ZW5kcyB0bworY29uc3VtZSB0b28gbWFueSByZXNvdXJjZXMgdG8gcnVuIHRoZSBmdWxsIHJlZ3Jlc3Npb24gdGVzdCBub24tc3RvcC4KKworLVMgaXMgdXNlZCB0byBjb250aW51ZSBydW5uaW5nIHRlc3RzIGFmdGVyIGFuIGFib3J0ZWQgcnVuLiAgSXQgd2lsbAorbWFpbnRhaW4gdGhlIG9yZGVyIGEgc3RhbmRhcmQgcnVuIChpZSwgdGhpcyBhc3N1bWVzIC1yIGlzIG5vdCB1c2VkKS4KK1RoaXMgaXMgdXNlZnVsIGFmdGVyIHRoZSB0ZXN0cyBoYXZlIHByZW1hdHVyZWx5IHN0b3BwZWQgZm9yIHNvbWUgZXh0ZXJuYWwKK3JlYXNvbiBhbmQgeW91IHdhbnQgdG8gc3RhcnQgcnVubmluZyBmcm9tIHdoZXJlIHlvdSBsZWZ0IG9mZiByYXRoZXIKK3RoYW4gc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgorCistZiByZWFkcyB0aGUgbmFtZXMgb2YgdGVzdHMgZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyBmJ3MgYXJndW1lbnQsIG9uZQorb3IgbW9yZSB0ZXN0IG5hbWVzIHBlciBsaW5lLiAgV2hpdGVzcGFjZSBpcyBpZ25vcmVkLiAgQmxhbmsgbGluZXMgYW5kCitsaW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgord2hpdHRsaW5nIGRvd24gZmFpbHVyZXMgaW52b2x2aW5nIGludGVyYWN0aW9ucyBhbW9uZyB0ZXN0cy4KKworLUwgY2F1c2VzIHRoZSBsZWFrcygxKSBjb21tYW5kIHRvIGJlIHJ1biBqdXN0IGJlZm9yZSBleGl0IGlmIGl0IGV4aXN0cy4KK2xlYWtzKDEpIGlzIGF2YWlsYWJsZSBvbiBNYWMgT1MgWCBhbmQgcHJlc3VtYWJseSBvbiBzb21lIG90aGVyCitGcmVlQlNELWRlcml2ZWQgc3lzdGVtcy4KKworLVIgcnVucyBlYWNoIHRlc3Qgc2V2ZXJhbCB0aW1lcyBhbmQgZXhhbWluZXMgc3lzLmdldHRvdGFscmVmY291bnQoKSB0bworc2VlIGlmIHRoZSB0ZXN0IGFwcGVhcnMgdG8gYmUgbGVha2luZyByZWZlcmVuY2VzLiAgVGhlIGFyZ3VtZW50IHNob3VsZAorYmUgb2YgdGhlIGZvcm0gc3RhYjpydW46Zm5hbWUgd2hlcmUgJ3N0YWInIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCit0ZXN0IGlzIHJ1biB0byBsZXQgZ2V0dG90YWxyZWZjb3VudCBzZXR0bGUgZG93biwgJ3J1bicgaXMgdGhlIG51bWJlcgorb2YgdGltZXMgZnVydGhlciBpdCBpcyBydW4gYW5kICdmbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlCityZXBvcnRzIGFyZSB3cml0dGVuIHRvLiAgVGhlc2UgcGFyYW1ldGVycyBhbGwgaGF2ZSBkZWZhdWx0cyAoNSwgNCBhbmQKKyJyZWZsb2cudHh0IiByZXNwZWN0aXZlbHkpLCBhbmQgdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOicuCisKKy1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKK3R5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KKzIgYmlsbGlvbiBvYmplY3RzLCB3aGljaCBvbmx5IHdvcmtzIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGVyZSBhcmUgYWxzbyBzb21lCit0ZXN0cyB0aGF0IHRyeSB0byBleGhhdXN0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzLCB3aGljaCBvbmx5IG1ha2VzCitzZW5zZSBvbiAzMi1iaXQgc3lzdGVtcyB3aXRoIGF0IGxlYXN0IDJHYiBvZiBtZW1vcnkuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCit3aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAnMi41R2InLCBkZXRlcm1pbmVzIGhvd211Y2ggbWVtb3J5IHRoZQordGVzdHMgd2lsbCBsaW1pdCB0aGVtc2VsdmVzIHRvIChidXQgdGhleSBtYXkgZ28gc2xpZ2h0bHkgb3Zlci4pIFRoZSBudW1iZXIKK3Nob3VsZG4ndCBiZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBtYWNoaW5lIGhhcyAoaW5jbHVkaW5nIHN3YXAgbWVtb3J5KS4gWW91CitzaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBzd2FwIG1lbW9yeSBpcyBnZW5lcmFsbHkgbXVjaCwgbXVjaCBzbG93ZXIKK3RoYW4gUkFNLCBhbmQgc2V0dGluZyBtZW1saW1pdCB0byBhbGwgYXZhaWxhYmxlIFJBTSBvciBoaWdoZXIgd2lsbCBoZWF2aWx5Cit0YXggdGhlIG1hY2hpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBubyB1c2UgcnVubmluZyB0aGVzZSB0ZXN0cyB3aXRoIGEKK2xpbWl0IG9mIGxlc3MgdGhhbiAyLjVHYiwgYW5kIG1hbnkgcmVxdWlyZSBtb3JlIHRoYW4gMjBHYi4gVGVzdHMgdGhhdCBleHBlY3QKK3RvIHVzZSBtb3JlIHRoYW4gbWVtbGltaXQgbWVtb3J5IHdpbGwgYmUgc2tpcHBlZC4gVGhlIGJpZy1tZW1vcnkgdGVzdHMKK2dlbmVyYWxseSBydW4gdmVyeSwgdmVyeSBsb25nLgorCistdSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuLAorc3VjaCBhcyB0aG9zZSByZXF1aXJpbmcgbGFyZ2UgZmlsZSBzdXBwb3J0IG9yIG5ldHdvcmsgY29ubmVjdGl2aXR5LgorVGhlIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgaW5kaWNhdGluZyB0aGUKK3Jlc291cmNlcyB0byB0ZXN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKKworICAgIGFsbCAtICAgICAgIEVuYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMuCisKKyAgICBub25lIC0gICAgICBEaXNhYmxlIGFsbCBzcGVjaWFsIHJlc291cmNlcyAodGhpcyBpcyB0aGUgZGVmYXVsdCkuCisKKyAgICBhdWRpbyAtICAgICBUZXN0cyB0aGF0IHVzZSB0aGUgYXVkaW8gZGV2aWNlLiAgKFRoZXJlIGFyZSBrbm93bgorICAgICAgICAgICAgICAgIGNhc2VzIG9mIGJyb2tlbiBhdWRpbyBkcml2ZXJzIHRoYXQgY2FuIGNyYXNoIFB5dGhvbiBvcgorICAgICAgICAgICAgICAgIGV2ZW4gdGhlIExpbnV4IGtlcm5lbC4pCisKKyAgICBjdXJzZXMgLSAgICBUZXN0cyB0aGF0IHVzZSBjdXJzZXMgYW5kIHdpbGwgbW9kaWZ5IHRoZSB0ZXJtaW5hbCdzCisgICAgICAgICAgICAgICAgc3RhdGUgYW5kIG91dHB1dCBtb2Rlcy4KKworICAgIGxhcmdlZmlsZSAtIEl0IGlzIG9rYXkgdG8gcnVuIHNvbWUgdGVzdCB0aGF0IG1heSBjcmVhdGUgaHVnZQorICAgICAgICAgICAgICAgIGZpbGVzLiAgVGhlc2UgdGVzdHMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIG1heQorICAgICAgICAgICAgICAgIGNvbnN1bWUgPjJHQiBvZiBkaXNrIHNwYWNlIHRlbXBvcmFyaWx5LgorCisgICAgbmV0d29yayAtICAgSXQgaXMgb2theSB0byBydW4gdGVzdHMgdGhhdCB1c2UgZXh0ZXJuYWwgbmV0d29yaworICAgICAgICAgICAgICAgIHJlc291cmNlLCBlLmcuIHRlc3RpbmcgU1NMIHN1cHBvcnQgZm9yIHNvY2tldHMuCisKKyAgICBkZWNpbWFsIC0gICBUZXN0IHRoZSBkZWNpbWFsIG1vZHVsZSBhZ2FpbnN0IGEgbGFyZ2Ugc3VpdGUgdGhhdAorICAgICAgICAgICAgICAgIHZlcmlmaWVzIGNvbXBsaWFuY2Ugd2l0aCBzdGFuZGFyZHMuCisKKyAgICBjcHUgLSAgICAgICBVc2VkIGZvciBjZXJ0YWluIENQVS1oZWF2eSB0ZXN0cy4KKworICAgIHN1YnByb2Nlc3MgIFJ1biBhbGwgdGVzdHMgZm9yIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4KKworICAgIHVybGZldGNoIC0gIEl0IGlzIG9rYXkgdG8gZG93bmxvYWQgZmlsZXMgcmVxdWlyZWQgb24gdGVzdGluZy4KKworICAgIGd1aSAtICAgICAgIFJ1biB0ZXN0cyB0aGF0IHJlcXVpcmUgYSBydW5uaW5nIEdVSS4KKworVG8gZW5hYmxlIGFsbCByZXNvdXJjZXMgZXhjZXB0IG9uZSwgdXNlICctdWFsbCwtPHJlc291cmNlPicuICBGb3IKK2V4YW1wbGUsIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGV4Y2VwdCBmb3IgdGhlIGd1aSB0ZXN0cywgZ2l2ZSB0aGUKK29wdGlvbiAnLXVhbGwsLWd1aScuCisiIiIKKworCitSRVNPVVJDRV9OQU1FUyA9ICgnYXVkaW8nLCAnY3Vyc2VzJywgJ2xhcmdlZmlsZScsICduZXR3b3JrJywKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsJywgJ2NwdScsICdzdWJwcm9jZXNzJywgJ3VybGZldGNoJywgJ2d1aScpCisKK2NsYXNzIF9BcmdQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorCisgICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzdXBlcigpLmVycm9yKG1lc3NhZ2UgKyAiXG5QYXNzIC1oIG9yIC0taGVscCBmb3IgY29tcGxldGUgaGVscC4iKQorCisKK2RlZiBfY3JlYXRlX3BhcnNlcigpOgorICAgICMgU2V0IHByb2cgdG8gcHJldmVudCB0aGUgdW5pbmZvcm1hdGl2ZSAiX19tYWluX18ucHkiIGZyb20gZGlzcGxheWluZyBpbgorICAgICMgZXJyb3IgbWVzc2FnZXMgd2hlbiB1c2luZyAicHl0aG9uIC1tIHRlc3QgLi4uIi4KKyAgICBwYXJzZXIgPSBfQXJnUGFyc2VyKHByb2c9J3JlZ3J0ZXN0LnB5JywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPVVTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249REVTQ1JJUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9RVBJTE9HLAorICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJfY2xhc3M9YXJncGFyc2UuUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKQorCisgICAgIyBBcmd1bWVudHMgd2l0aCB0aGlzIGNsYXVzZSBhZGRlZCB0byBpdHMgaGVscCBhcmUgZGVzY3JpYmVkIGZ1cnRoZXIgaW4KKyAgICAjIHRoZSBlcGlsb2cncyAiQWRkaXRpb25hbCBvcHRpb24gZGV0YWlscyIgc2VjdGlvbi4KKyAgICBtb3JlX2RldGFpbHMgPSAnICBTZWUgdGhlIHNlY3Rpb24gYXQgYm90dG9tIGZvciBtb3JlIGRldGFpbHMuJworCisgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdHZW5lcmFsIG9wdGlvbnMnKQorICAgICMgV2UgYWRkIGhlbHAgZXhwbGljaXRseSB0byBjb250cm9sIHdoYXQgYXJndW1lbnQgZ3JvdXAgaXQgcmVuZGVycyB1bmRlci4KKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1oJywgJy0taGVscCcsIGFjdGlvbj0naGVscCcsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS10aW1lb3V0JywgbWV0YXZhcj0nVElNRU9VVCcsIHR5cGU9ZmxvYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vcmUgdGhhbiBUSU1FT1VUIHNlY29uZHM7IGRpc2FibGVkIGlmIFRJTUVPVVQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgbmVnYXRpdmUgb3IgZXF1YWxzIHRvIHplcm8nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS13YWl0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2FpdCBmb3IgdXNlciBpbnB1dCwgZS5nLiwgYWxsb3cgYSBkZWJ1Z2dlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGJlIGF0dGFjaGVkJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc2xhdmVhcmdzJywgbWV0YXZhcj0nQVJHUycpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUycsICctLXN0YXJ0JywgbWV0YXZhcj0nU1RBUlQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0aGUgbmFtZSBvZiB0aGUgdGVzdCBhdCB3aGljaCB0byBzdGFydC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisKKyAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1ZlcmJvc2l0eScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdicsICctLXZlcmJvc2UnLCBhY3Rpb249J2NvdW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXcnLCAnLS12ZXJib3NlMicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1XJywgJy0tdmVyYm9zZTMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXEnLCAnLS1xdWlldCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J25vIG91dHB1dCB1bmxlc3Mgb25lIG9yIG1vcmUgdGVzdHMgZmFpbCcpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbycsICctLXNsb3cnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdwcmludF9zbG93JywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1oZWFkZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU2VsZWN0aW5nIHRlc3RzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1yJywgJy0tcmFuZG9taXplJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXJhbmRzZWVkJywgbWV0YXZhcj0nU0VFRCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3JhbmRvbV9zZWVkJywgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Bhc3MgYSByYW5kb20gc2VlZCB0byByZXByb2R1Y2UgYSBwcmV2aW91cyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JhbmRvbSBydW4nKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWYnLCAnLS1mcm9tZmlsZScsIG1ldGF2YXI9J0ZJTEUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZS4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsICctLWV4Y2x1ZGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhcmd1bWVudHMgYXJlIHRlc3RzIHRvICpleGNsdWRlKicpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcycsICctLXNpbmdsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NpbmdsZSBzdGVwIHRocm91Z2ggYSBzZXQgb2YgdGVzdHMuJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW0nLCAnLS1tYXRjaCcsIG1ldGF2YXI9J1BBVCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J21hdGNoX3Rlc3RzJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbWF0Y2ggdGVzdCBjYXNlcyBhbmQgbWV0aG9kcyB3aXRoIGdsb2IgcGF0dGVybiBQQVQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUcnLCAnLS1mYWlsZmFzdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2ZhaWwgYXMgc29vbiBhcyBhIHRlc3QgZmFpbHMgKG9ubHkgd2l0aCAtdiBvciAtVyknKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXUnLCAnLS11c2UnLCBtZXRhdmFyPSdSRVMxLFJFUzIsLi4uJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLCB0eXBlPXJlc291cmNlc19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTScsICctLW1lbWxpbWl0JywgbWV0YXZhcj0nTElNSVQnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzLicgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGVzdGRpcicsIG1ldGF2YXI9J0RJUicsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2V4ZWN1dGUgdGVzdCBmaWxlcyBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhpbnN0ZWFkIG9mIHRoZSBQeXRob24gc3RkbGliIHRlc3Qgc3VpdGUpJykKKworICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnU3BlY2lhbCBydW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1sJywgJy0tZmluZGxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0naWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5JykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1MJywgJy0tcnVubGVha3MnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIGxlYWtzKDEpIGNvbW1hbmQganVzdCBiZWZvcmUgZXhpdC4nICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUicsICctLWh1bnRybGVha3MnLCBtZXRhdmFyPSdSVU5DT1VOVFMnLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3NlYXJjaCBmb3IgcmVmZXJlbmNlIGxlYWtzIChuZWVkcyBkZWJ1ZyBidWlsZCwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJ5IHNsb3cpLicgKyBtb3JlX2RldGFpbHMpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaicsICctLW11bHRpcHJvY2VzcycsIG1ldGF2YXI9J1BST0NFU1NFUycsCisgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9J3VzZV9tcCcsIHR5cGU9aW50LAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1UJywgJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd0cmFjZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3R1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21vZHVsZScpCisgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRCcsICctLWNvdmVyZGlyJywgbWV0YXZhcj0nRElSJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1yZWxhdGl2ZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQnKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU4nLCAnLS1ub2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PU5vbmUsIGRlc3Q9J2NvdmVyZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHV0IGNvdmVyYWdlIGZpbGVzIGFsb25nc2lkZSBtb2R1bGVzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy10JywgJy0tdGhyZXNob2xkJywgbWV0YXZhcj0nVEhSRVNIT0xEJywKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2NhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1uJywgJy0tbm93aW5kb3dzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3VwcHJlc3MgZXJyb3IgbWVzc2FnZSBib3hlcyBvbiBXaW5kb3dzJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy1GJywgJy0tZm9yZXZlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0aGUgc3BlY2lmaWVkIHRlc3RzIGluIGEgbG9vcCwgdW50aWwgYW4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvciBoYXBwZW5zJykKKyAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tbGlzdC10ZXN0cycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Im9ubHkgd3JpdGUgdGhlIG5hbWUgb2YgdGVzdHMgdGhhdCB3aWxsIGJlIHJ1biwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb24ndCBleGVjdXRlIHRoZW0iKQorICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVAnLCAnLS1wZ28nLCBkZXN0PSdwZ28nLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdlbmFibGUgUHJvZmlsZSBHdWlkZWQgT3B0aW1pemF0aW9uIHRyYWluaW5nJykKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2FyZ3MnLCBuYXJncz1hcmdwYXJzZS5SRU1BSU5ERVIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorCisgICAgcmV0dXJuIHBhcnNlcgorCisKK2RlZiByZWxhdGl2ZV9maWxlbmFtZShzdHJpbmcpOgorICAgICMgQ1dEIGlzIHJlcGxhY2VkIHdpdGggYSB0ZW1wb3JhcnkgZGlyIGJlZm9yZSBjYWxsaW5nIG1haW4oKSwgc28gd2UKKyAgICAjIGpvaW4gaXQgd2l0aCB0aGUgc2F2ZWQgQ1dEIHNvIGl0IGVuZHMgdXAgd2hlcmUgdGhlIHVzZXIgZXhwZWN0cy4KKyAgICByZXR1cm4gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHN0cmluZykKKworCitkZWYgaHVudHJsZWFrcyhzdHJpbmcpOgorICAgIGFyZ3MgPSBzdHJpbmcuc3BsaXQoJzonKQorICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDIsIDMpOgorICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcigKKyAgICAgICAgICAgICduZWVkcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCisgICAgbndhcm11cCA9IGludChhcmdzWzBdKSBpZiBhcmdzWzBdIGVsc2UgNQorICAgIG50cmFja2VkID0gaW50KGFyZ3NbMV0pIGlmIGFyZ3NbMV0gZWxzZSA0CisgICAgZm5hbWUgPSBhcmdzWzJdIGlmIGxlbihhcmdzKSA+IDIgYW5kIGFyZ3NbMl0gZWxzZSAncmVmbG9nLnR4dCcKKyAgICByZXR1cm4gbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lCisKKworZGVmIHJlc291cmNlc19saXN0KHN0cmluZyk6CisgICAgdSA9IFt4Lmxvd2VyKCkgZm9yIHggaW4gc3RyaW5nLnNwbGl0KCcsJyldCisgICAgZm9yIHIgaW4gdToKKyAgICAgICAgaWYgciA9PSAnYWxsJyBvciByID09ICdub25lJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHJbMF0gPT0gJy0nOgorICAgICAgICAgICAgciA9IHJbMTpdCisgICAgICAgIGlmIHIgbm90IGluIFJFU09VUkNFX05BTUVTOgorICAgICAgICAgICAgcmFpc2UgYXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoJ2ludmFsaWQgcmVzb3VyY2U6ICcgKyByKQorICAgIHJldHVybiB1CisKKworZGVmIF9wYXJzZV9hcmdzKGFyZ3MsICoqa3dhcmdzKToKKyAgICAjIERlZmF1bHRzCisgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UodGVzdGRpcj1Ob25lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLAorICAgICAgICAgZXhjbHVkZT1GYWxzZSwgc2luZ2xlPUZhbHNlLCByYW5kb21pemU9RmFsc2UsIGZyb21maWxlPU5vbmUsCisgICAgICAgICBmaW5kbGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSwgdHJhY2U9RmFsc2UsIGNvdmVyZGlyPSdjb3ZlcmFnZScsCisgICAgICAgICBydW5sZWFrcz1GYWxzZSwgaHVudHJsZWFrcz1GYWxzZSwgdmVyYm9zZTI9RmFsc2UsIHByaW50X3Nsb3c9RmFsc2UsCisgICAgICAgICByYW5kb21fc2VlZD1Ob25lLCB1c2VfbXA9Tm9uZSwgdmVyYm9zZTM9RmFsc2UsIGZvcmV2ZXI9RmFsc2UsCisgICAgICAgICBoZWFkZXI9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLCBwZ289RmFsc2UpCisgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG5zLCBrKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoaXMgZnVuY3Rpb24nICUgaykKKyAgICAgICAgc2V0YXR0cihucywgaywgdikKKyAgICBpZiBucy51c2VfcmVzb3VyY2VzIGlzIE5vbmU6CisgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMgPSBbXQorCisgICAgcGFyc2VyID0gX2NyZWF0ZV9wYXJzZXIoKQorICAgIHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJncywgbmFtZXNwYWNlPW5zKQorCisgICAgaWYgbnMuc2luZ2xlIGFuZCBucy5mcm9tZmlsZToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItcyBhbmQgLWYgZG9uJ3QgZ28gdG9nZXRoZXIhIikKKyAgICBpZiBucy51c2VfbXAgYW5kIG5zLnRyYWNlOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1UIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMuZmluZGxlYWtzOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1sIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIG5zLmZhaWxmYXN0IGFuZCBub3QgKG5zLnZlcmJvc2Ugb3IgbnMudmVyYm9zZTMpOgorICAgICAgICBwYXJzZXIuZXJyb3IoIi1HLy0tZmFpbGZhc3QgbmVlZHMgZWl0aGVyIC12IG9yIC1XIikKKyAgICBpZiBucy5wZ28gYW5kIChucy52ZXJib3NlIG9yIG5zLnZlcmJvc2UyIG9yIG5zLnZlcmJvc2UzKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCItLXBnby8tdiBkb24ndCBnbyB0b2dldGhlciEiKQorCisgICAgaWYgbnMubm93aW5kb3dzOgorICAgICAgICBwcmludCgiV2FybmluZzogdGhlIC0tbm93aW5kb3dzICgtbikgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuICIKKyAgICAgICAgICAgICAgIlVzZSAtdnYgdG8gZGlzcGxheSBhc3NlcnRpb25zIGluIHN0ZGVyci4iLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICBpZiBucy5xdWlldDoKKyAgICAgICAgbnMudmVyYm9zZSA9IDAKKyAgICBpZiBucy50aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICBpZiBucy50aW1lb3V0IDw9IDA6CisgICAgICAgICAgICBucy50aW1lb3V0ID0gTm9uZQorICAgIGlmIG5zLnVzZV9tcCBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgbnMudXNlX21wIDw9IDA6CisgICAgICAgICAgICAjIFVzZSBhbGwgY29yZXMgKyBleHRyYXMgZm9yIHRlc3RzIHRoYXQgbGlrZSB0byBzbGVlcAorICAgICAgICAgICAgbnMudXNlX21wID0gMiArIChvcy5jcHVfY291bnQoKSBvciAxKQorICAgIGlmIG5zLnVzZToKKyAgICAgICAgZm9yIGEgaW4gbnMudXNlOgorICAgICAgICAgICAgZm9yIHIgaW4gYToKKyAgICAgICAgICAgICAgICBpZiByID09ICdhbGwnOgorICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzWzpdID0gUkVTT1VSQ0VfTkFNRVMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiByID09ICdub25lJzoKKyAgICAgICAgICAgICAgICAgICAgZGVsIG5zLnVzZV9yZXNvdXJjZXNbOl0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByZW1vdmUgPSBGYWxzZQorICAgICAgICAgICAgICAgIGlmIHJbMF0gPT0gJy0nOgorICAgICAgICAgICAgICAgICAgICByZW1vdmUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHIgPSByWzE6XQorICAgICAgICAgICAgICAgIGlmIHJlbW92ZToKKyAgICAgICAgICAgICAgICAgICAgaWYgciBpbiBucy51c2VfcmVzb3VyY2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlcy5yZW1vdmUocikKKyAgICAgICAgICAgICAgICBlbGlmIHIgbm90IGluIG5zLnVzZV9yZXNvdXJjZXM6CisgICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXMuYXBwZW5kKHIpCisgICAgaWYgbnMucmFuZG9tX3NlZWQgaXMgbm90IE5vbmU6CisgICAgICAgIG5zLnJhbmRvbWl6ZSA9IFRydWUKKworICAgIHJldHVybiBucwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvbWFpbi5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L21haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwM2MxMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L21haW4ucHkKQEAgLTAsMCArMSw1MDggQEAKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IGZhdWx0aGFuZGxlcgoraW1wb3J0IG1hdGgKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBzeXNjb25maWcKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgdGltZQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LmNtZGxpbmUgaW1wb3J0IF9wYXJzZV9hcmdzCitmcm9tIHRlc3QubGlicmVncnRlc3QucnVudGVzdCBpbXBvcnQgKAorICAgIGZpbmR0ZXN0cywgcnVudGVzdCwKKyAgICBTVERURVNUUywgTk9UVEVTVFMsIFBBU1NFRCwgRkFJTEVELCBFTlZfQ0hBTkdFRCwgU0tJUFBFRCwgUkVTT1VSQ0VfREVOSUVELAorICAgIElOVEVSUlVQVEVELCBDSElMRF9FUlJPUiwKKyAgICBQUk9HUkVTU19NSU5fVElNRSwgZm9ybWF0X3Rlc3RfcmVzdWx0KQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnNldHVwIGltcG9ydCBzZXR1cF90ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IGdjCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZ2MgPSBOb25lCisKKworIyBXaGVuIHRlc3RzIGFyZSBydW4gZnJvbSB0aGUgUHl0aG9uIGJ1aWxkIGRpcmVjdG9yeSwgaXQgaXMgYmVzdCBwcmFjdGljZQorIyB0byBrZWVwIHRoZSB0ZXN0IGZpbGVzIGluIGEgc3ViZm9sZGVyLiAgVGhpcyBlYXNlcyB0aGUgY2xlYW51cCBvZiBsZWZ0b3ZlcgorIyBmaWxlcyB1c2luZyB0aGUgIm1ha2UgZGlzdGNsZWFuIiBjb21tYW5kLgoraWYgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgorICAgIFRFTVBESVIgPSBvcy5wYXRoLmpvaW4oc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdzcmNkaXInKSwgJ2J1aWxkJykKK2Vsc2U6CisgICAgVEVNUERJUiA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorVEVNUERJUiA9IG9zLnBhdGguYWJzcGF0aChURU1QRElSKQorCisKK2NsYXNzIFJlZ3J0ZXN0OgorICAgICIiIkV4ZWN1dGUgYSB0ZXN0IHN1aXRlLgorCisgICAgVGhpcyBhbHNvIHBhcnNlcyBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgbW9kaWZpZXMgaXRzIGJlaGF2aW9yCisgICAgYWNjb3JkaW5nbHkuCisKKyAgICB0ZXN0cyAtLSBhIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRlc3QgbmFtZXMgKG9wdGlvbmFsKQorICAgIHRlc3RkaXIgLS0gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBsb29rIGZvciB0ZXN0cyAob3B0aW9uYWwpCisKKyAgICBVc2VycyBvdGhlciB0aGFuIHRoZSBQeXRob24gdGVzdCBzdWl0ZSB3aWxsIGNlcnRhaW5seSB3YW50IHRvCisgICAgc3BlY2lmeSB0ZXN0ZGlyOyBpZiBpdCdzIG9taXR0ZWQsIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKKyAgICBQeXRob24gdGVzdCBzdWl0ZSBpcyBzZWFyY2hlZCBmb3IuCisKKyAgICBJZiB0aGUgdGVzdHMgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIHRlc3RzIGxpc3RlZCBvbiB0aGUKKyAgICBjb21tYW5kLWxpbmUgd2lsbCBiZSB1c2VkLiAgSWYgdGhhdCdzIGVtcHR5LCB0b28sIHRoZW4gYWxsICoucHkKKyAgICBmaWxlcyBiZWdpbm5pbmcgd2l0aCB0ZXN0XyB3aWxsIGJlIHVzZWQuCisKKyAgICBUaGUgb3RoZXIgZGVmYXVsdCBhcmd1bWVudHMgKHZlcmJvc2UsIHF1aWV0LCBleGNsdWRlLAorICAgIHNpbmdsZSwgcmFuZG9taXplLCBmaW5kbGVha3MsIHVzZV9yZXNvdXJjZXMsIHRyYWNlLCBjb3ZlcmRpciwKKyAgICBwcmludF9zbG93LCBhbmQgcmFuZG9tX3NlZWQpIGFsbG93IHByb2dyYW1tZXJzIGNhbGxpbmcgbWFpbigpCisgICAgZGlyZWN0bHkgdG8gc2V0IHRoZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBzZXQgYnkgZmxhZ3MKKyAgICBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBOYW1lc3BhY2Ugb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMKKyAgICAgICAgc2VsZi5ucyA9IE5vbmUKKworICAgICAgICAjIHRlc3RzCisgICAgICAgIHNlbGYudGVzdHMgPSBbXQorICAgICAgICBzZWxmLnNlbGVjdGVkID0gW10KKworICAgICAgICAjIHRlc3QgcmVzdWx0cworICAgICAgICBzZWxmLmdvb2QgPSBbXQorICAgICAgICBzZWxmLmJhZCA9IFtdCisgICAgICAgIHNlbGYuc2tpcHBlZCA9IFtdCisgICAgICAgIHNlbGYucmVzb3VyY2VfZGVuaWVkcyA9IFtdCisgICAgICAgIHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCA9IFtdCisgICAgICAgIHNlbGYuaW50ZXJydXB0ZWQgPSBGYWxzZQorCisgICAgICAgICMgdXNlZCBieSAtLXNsb3cKKyAgICAgICAgc2VsZi50ZXN0X3RpbWVzID0gW10KKworICAgICAgICAjIHVzZWQgYnkgLS1jb3ZlcmFnZSwgdHJhY2UuVHJhY2UgaW5zdGFuY2UKKyAgICAgICAgc2VsZi50cmFjZXIgPSBOb25lCisKKyAgICAgICAgIyB1c2VkIGJ5IC0tZmluZGxlYWtzLCBzdG9yZSBmb3IgZ2MuZ2FyYmFnZQorICAgICAgICBzZWxmLmZvdW5kX2dhcmJhZ2UgPSBbXQorCisgICAgICAgICMgdXNlZCB0byBkaXNwbGF5IHRoZSBwcm9ncmVzcyBiYXIgIlsgMy8xMDBdIgorICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSB0aW1lLm1vbm90b25pYygpCisgICAgICAgIHNlbGYudGVzdF9jb3VudCA9ICcnCisgICAgICAgIHNlbGYudGVzdF9jb3VudF93aWR0aCA9IDEKKworICAgICAgICAjIHVzZWQgYnkgLS1zaW5nbGUKKyAgICAgICAgc2VsZi5uZXh0X3NpbmdsZV90ZXN0ID0gTm9uZQorICAgICAgICBzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lID0gTm9uZQorCisgICAgZGVmIGFjY3VtdWxhdGVfcmVzdWx0KHNlbGYsIHRlc3QsIHJlc3VsdCk6CisgICAgICAgIG9rLCB0ZXN0X3RpbWUgPSByZXN1bHQKKyAgICAgICAgaWYgb2sgbm90IGluIChDSElMRF9FUlJPUiwgSU5URVJSVVBURUQpOgorICAgICAgICAgICAgc2VsZi50ZXN0X3RpbWVzLmFwcGVuZCgodGVzdF90aW1lLCB0ZXN0KSkKKyAgICAgICAgaWYgb2sgPT0gUEFTU0VEOgorICAgICAgICAgICAgc2VsZi5nb29kLmFwcGVuZCh0ZXN0KQorICAgICAgICBlbGlmIG9rID09IEZBSUxFRDoKKyAgICAgICAgICAgIHNlbGYuYmFkLmFwcGVuZCh0ZXN0KQorICAgICAgICBlbGlmIG9rID09IEVOVl9DSEFOR0VEOgorICAgICAgICAgICAgc2VsZi5lbnZpcm9ubWVudF9jaGFuZ2VkLmFwcGVuZCh0ZXN0KQorICAgICAgICBlbGlmIG9rID09IFNLSVBQRUQ6CisgICAgICAgICAgICBzZWxmLnNraXBwZWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gUkVTT1VSQ0VfREVOSUVEOgorICAgICAgICAgICAgc2VsZi5za2lwcGVkLmFwcGVuZCh0ZXN0KQorICAgICAgICAgICAgc2VsZi5yZXNvdXJjZV9kZW5pZWRzLmFwcGVuZCh0ZXN0KQorCisgICAgZGVmIHRpbWVfZGVsdGEoc2VsZiwgY2VpbD1GYWxzZSk6CisgICAgICAgIHNlY29uZHMgPSB0aW1lLm1vbm90b25pYygpIC0gc2VsZi5zdGFydF90aW1lCisgICAgICAgIGlmIGNlaWw6CisgICAgICAgICAgICBzZWNvbmRzID0gbWF0aC5jZWlsKHNlY29uZHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWNvbmRzID0gaW50KHNlY29uZHMpCisgICAgICAgIHJldHVybiBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz1zZWNvbmRzKQorCisgICAgZGVmIGRpc3BsYXlfcHJvZ3Jlc3Moc2VsZiwgdGVzdF9pbmRleCwgdGVzdCk6CisgICAgICAgIGlmIHNlbGYubnMucXVpZXQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5iYWQgYW5kIG5vdCBzZWxmLm5zLnBnbzoKKyAgICAgICAgICAgIGZtdCA9ICJ7dGltZX0gW3t0ZXN0X2luZGV4Ontjb3VudF93aWR0aH19e3Rlc3RfY291bnR9L3tuYmFkfV0ge3Rlc3RfbmFtZX0iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbXQgPSAie3RpbWV9IFt7dGVzdF9pbmRleDp7Y291bnRfd2lkdGh9fXt0ZXN0X2NvdW50fV0ge3Rlc3RfbmFtZX0iCisgICAgICAgIGxpbmUgPSBmbXQuZm9ybWF0KGNvdW50X3dpZHRoPXNlbGYudGVzdF9jb3VudF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9pbmRleD10ZXN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50PXNlbGYudGVzdF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmJhZD1sZW4oc2VsZi5iYWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWU9dGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZT1zZWxmLnRpbWVfZGVsdGEoKSkKKyAgICAgICAgcHJpbnQobGluZSwgZmx1c2g9VHJ1ZSkKKworICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGt3YXJncyk6CisgICAgICAgIG5zID0gX3BhcnNlX2FyZ3Moc3lzLmFyZ3ZbMTpdLCAqKmt3YXJncykKKworICAgICAgICBpZiBucy50aW1lb3V0IGFuZCBub3QgaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpOgorICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IFRoZSB0aW1lb3V0IG9wdGlvbiByZXF1aXJlcyAiCisgICAgICAgICAgICAgICAgICAiZmF1bHRoYW5kbGVyLmR1bXBfdHJhY2ViYWNrX2xhdGVyIiwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKKworICAgICAgICBpZiBucy50aHJlc2hvbGQgaXMgbm90IE5vbmUgYW5kIGdjIGlzIE5vbmU6CisgICAgICAgICAgICBwcmludCgnTm8gR0MgYXZhaWxhYmxlLCBpZ25vcmUgLS10aHJlc2hvbGQuJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgbnMudGhyZXNob2xkID0gTm9uZQorCisgICAgICAgIGlmIG5zLmZpbmRsZWFrczoKKyAgICAgICAgICAgIGlmIGdjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIHJlcG9ydCBnYXJiYWdlIHRoYXQgaXMgbm90CisgICAgICAgICAgICAgICAgIyBmcmVlYWJsZSBieSByZWZlcmVuY2UgY291bnRpbmcgYWxvbmUuICBCeSBkZWZhdWx0IG9ubHkKKyAgICAgICAgICAgICAgICAjIGdhcmJhZ2UgdGhhdCBpcyBub3QgY29sbGVjdGFibGUgYnkgdGhlIEdDIGlzIHJlcG9ydGVkLgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAjZ2Muc2V0X2RlYnVnKGdjLkRFQlVHX1NBVkVBTEwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50KCdObyBHQyBhdmFpbGFibGUsIGRpc2FibGluZyAtLWZpbmRsZWFrcycsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgIG5zLmZpbmRsZWFrcyA9IEZhbHNlCisKKyAgICAgICAgIyBTdHJpcCAucHkgZXh0ZW5zaW9ucy4KKyAgICAgICAgcmVtb3ZlcHkobnMuYXJncykKKworICAgICAgICByZXR1cm4gbnMKKworICAgIGRlZiBmaW5kX3Rlc3RzKHNlbGYsIHRlc3RzKToKKyAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCisKKyAgICAgICAgaWYgc2VsZi5ucy5zaW5nbGU6CisgICAgICAgICAgICBzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICdweW5leHR0ZXN0JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZSwgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgbmV4dF90ZXN0ID0gZnAucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXN0cyA9IFtuZXh0X3Rlc3RdCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgc2VsZi5ucy5mcm9tZmlsZToKKyAgICAgICAgICAgIHNlbGYudGVzdHMgPSBbXQorICAgICAgICAgICAgIyByZWdleCB0byBtYXRjaCAndGVzdF9idWlsdGluJyBpbiBsaW5lOgorICAgICAgICAgICAgIyAnMDowMDowMCBbICA0LzQwMF0gdGVzdF9idWlsdGluIC0tIHRlc3RfZGljdCB0b29rIDEgc2VjJworICAgICAgICAgICAgcmVnZXggPSAocideKD86WzAtOV0rOlswLTldKzpbMC05XSsgKik/JworICAgICAgICAgICAgICAgICAgICAgcicoPzpcW1swLTkvIF0rXF0gKik/JworICAgICAgICAgICAgICAgICAgICAgcicodGVzdF9bYS16QS1aMC05X10rKScpCisgICAgICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocmVnZXgpCisgICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHNlbGYubnMuZnJvbWZpbGUpKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmcDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gcmVnZXgubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdHMuYXBwZW5kKG1hdGNoLmdyb3VwKDEpKQorCisgICAgICAgIHJlbW92ZXB5KHNlbGYudGVzdHMpCisKKyAgICAgICAgc3RkdGVzdHMgPSBTVERURVNUU1s6XQorICAgICAgICBub3R0ZXN0cyA9IE5PVFRFU1RTLmNvcHkoKQorICAgICAgICBpZiBzZWxmLm5zLmV4Y2x1ZGU6CisgICAgICAgICAgICBmb3IgYXJnIGluIHNlbGYubnMuYXJnczoKKyAgICAgICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6CisgICAgICAgICAgICAgICAgICAgIHN0ZHRlc3RzLnJlbW92ZShhcmcpCisgICAgICAgICAgICAgICAgbm90dGVzdHMuYWRkKGFyZykKKyAgICAgICAgICAgIHNlbGYubnMuYXJncyA9IFtdCisKKyAgICAgICAgIyBpZiB0ZXN0ZGlyIGlzIHNldCwgdGhlbiB3ZSBhcmUgbm90IHJ1bm5pbmcgdGhlIHB5dGhvbiB0ZXN0cyBzdWl0ZSwgc28KKyAgICAgICAgIyBkb24ndCBhZGQgZGVmYXVsdCB0ZXN0cyB0byBiZSBleGVjdXRlZCBvciBza2lwcGVkIChwYXNzIGVtcHR5IHZhbHVlcykKKyAgICAgICAgaWYgc2VsZi5ucy50ZXN0ZGlyOgorICAgICAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMoc2VsZi5ucy50ZXN0ZGlyLCBsaXN0KCksIHNldCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMoc2VsZi5ucy50ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCisKKyAgICAgICAgaWYgbm90IHNlbGYubnMuZnJvbWZpbGU6CisgICAgICAgICAgICBzZWxmLnNlbGVjdGVkID0gc2VsZi50ZXN0cyBvciBzZWxmLm5zLmFyZ3Mgb3IgYWxsdGVzdHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBzZWxmLnRlc3RzCisgICAgICAgIGlmIHNlbGYubnMuc2luZ2xlOgorICAgICAgICAgICAgc2VsZi5zZWxlY3RlZCA9IHNlbGYuc2VsZWN0ZWRbOjFdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcG9zID0gYWxsdGVzdHMuaW5kZXgoc2VsZi5zZWxlY3RlZFswXSkKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1twb3MgKyAxXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgUmVtb3ZlIGFsbCB0aGUgc2VsZWN0ZWQgdGVzdHMgdGhhdCBwcmVjZWRlIHN0YXJ0IGlmIGl0J3Mgc2V0LgorICAgICAgICBpZiBzZWxmLm5zLnN0YXJ0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnNlbGVjdGVkWzpzZWxmLnNlbGVjdGVkLmluZGV4KHNlbGYubnMuc3RhcnQpXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGZpbmQgc3RhcnRpbmcgdGVzdCAoJXMpLCB1c2luZyBhbGwgdGVzdHMiCisgICAgICAgICAgICAgICAgICAgICAgJSBzZWxmLm5zLnN0YXJ0LCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICAgICAgaWYgc2VsZi5ucy5yYW5kb21pemU6CisgICAgICAgICAgICBpZiBzZWxmLm5zLnJhbmRvbV9zZWVkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5ucy5yYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCisgICAgICAgICAgICByYW5kb20uc2VlZChzZWxmLm5zLnJhbmRvbV9zZWVkKQorICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUoc2VsZi5zZWxlY3RlZCkKKworICAgIGRlZiBsaXN0X3Rlc3RzKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLnNlbGVjdGVkOgorICAgICAgICAgICAgcHJpbnQobmFtZSkKKworICAgIGRlZiByZXJ1bl9mYWlsZWRfdGVzdHMoc2VsZik6CisgICAgICAgIHNlbGYubnMudmVyYm9zZSA9IFRydWUKKyAgICAgICAgc2VsZi5ucy5mYWlsZmFzdCA9IEZhbHNlCisgICAgICAgIHNlbGYubnMudmVyYm9zZTMgPSBGYWxzZQorICAgICAgICBzZWxmLm5zLm1hdGNoX3Rlc3RzID0gTm9uZQorCisgICAgICAgIHByaW50KCJSZS1ydW5uaW5nIGZhaWxlZCB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUiKQorICAgICAgICBmb3IgdGVzdCBpbiBzZWxmLmJhZFs6XToKKyAgICAgICAgICAgIHByaW50KCJSZS1ydW5uaW5nIHRlc3QgJXIgaW4gdmVyYm9zZSBtb2RlIiAlIHRlc3QsIGZsdXNoPVRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5ucy52ZXJib3NlID0gVHJ1ZQorICAgICAgICAgICAgICAgIG9rID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICMgcHJpbnQgYSBuZXdsaW5lIHNlcGFyYXRlIGZyb20gdGhlIF5DCisgICAgICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG9rWzBdIGluIHtQQVNTRUQsIEVOVl9DSEFOR0VELCBTS0lQUEVELCBSRVNPVVJDRV9ERU5JRUR9OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJhZC5yZW1vdmUodGVzdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuYmFkOgorICAgICAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihzZWxmLmJhZCksICd0ZXN0JyksICJmYWlsZWQgYWdhaW46IikKKyAgICAgICAgICAgICAgICBwcmludGxpc3Qoc2VsZi5iYWQpCisKKyAgICBkZWYgZGlzcGxheV9yZXN1bHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW50ZXJydXB0ZWQ6CisgICAgICAgICAgICAjIHByaW50IGEgbmV3bGluZSBhZnRlciBeQworICAgICAgICAgICAgcHJpbnQoKQorICAgICAgICAgICAgcHJpbnQoIlRlc3Qgc3VpdGUgaW50ZXJydXB0ZWQgYnkgc2lnbmFsIFNJR0lOVC4iKQorICAgICAgICAgICAgZXhlY3V0ZWQgPSBzZXQoc2VsZi5nb29kKSB8IHNldChzZWxmLmJhZCkgfCBzZXQoc2VsZi5za2lwcGVkKQorICAgICAgICAgICAgb21pdHRlZCA9IHNldChzZWxmLnNlbGVjdGVkKSAtIGV4ZWN1dGVkCisgICAgICAgICAgICBwcmludChjb3VudChsZW4ob21pdHRlZCksICJ0ZXN0IiksICJvbWl0dGVkOiIpCisgICAgICAgICAgICBwcmludGxpc3Qob21pdHRlZCkKKworICAgICAgICAjIElmIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgZm9yIFBHTyB0aGVuIG5vIG9uZSBjYXJlcyBhYm91dAorICAgICAgICAjIHJlc3VsdHMuCisgICAgICAgIGlmIHNlbGYubnMucGdvOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5nb29kIGFuZCBub3Qgc2VsZi5ucy5xdWlldDoKKyAgICAgICAgICAgIGlmIChub3Qgc2VsZi5iYWQKKyAgICAgICAgICAgICAgICBhbmQgbm90IHNlbGYuc2tpcHBlZAorICAgICAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5pbnRlcnJ1cHRlZAorICAgICAgICAgICAgICAgIGFuZCBsZW4oc2VsZi5nb29kKSA+IDEpOgorICAgICAgICAgICAgICAgIHByaW50KCJBbGwiLCBlbmQ9JyAnKQorICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuZ29vZCksICJ0ZXN0IiksICJPSy4iKQorCisgICAgICAgIGlmIHNlbGYubnMucHJpbnRfc2xvdzoKKyAgICAgICAgICAgIHNlbGYudGVzdF90aW1lcy5zb3J0KHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgICAgIHByaW50KCIxMCBzbG93ZXN0IHRlc3RzOiIpCisgICAgICAgICAgICBmb3IgdGltZSwgdGVzdCBpbiBzZWxmLnRlc3RfdGltZXNbOjEwXToKKyAgICAgICAgICAgICAgICBwcmludCgiJXM6ICUuMWZzIiAlICh0ZXN0LCB0aW1lKSkKKworICAgICAgICBpZiBzZWxmLmJhZDoKKyAgICAgICAgICAgIHByaW50KGNvdW50KGxlbihzZWxmLmJhZCksICJ0ZXN0IiksICJmYWlsZWQ6IikKKyAgICAgICAgICAgIHByaW50bGlzdChzZWxmLmJhZCkKKworICAgICAgICBpZiBzZWxmLmVudmlyb25tZW50X2NoYW5nZWQ6CisgICAgICAgICAgICBwcmludCgie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgY291bnQobGVuKHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpKQorICAgICAgICAgICAgcHJpbnRsaXN0KHNlbGYuZW52aXJvbm1lbnRfY2hhbmdlZCkKKworICAgICAgICBpZiBzZWxmLnNraXBwZWQgYW5kIG5vdCBzZWxmLm5zLnF1aWV0OgorICAgICAgICAgICAgcHJpbnQoY291bnQobGVuKHNlbGYuc2tpcHBlZCksICJ0ZXN0IiksICJza2lwcGVkOiIpCisgICAgICAgICAgICBwcmludGxpc3Qoc2VsZi5za2lwcGVkKQorCisgICAgZGVmIHJ1bl90ZXN0c19zZXF1ZW50aWFsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5zLnRyYWNlOgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlCisgICAgICAgICAgICBzZWxmLnRyYWNlciA9IHRyYWNlLlRyYWNlKHRyYWNlPUZhbHNlLCBjb3VudD1UcnVlKQorCisgICAgICAgIHNhdmVfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmtleXMoKQorCisgICAgICAgIHByaW50KCJSdW4gdGVzdHMgc2VxdWVudGlhbGx5IikKKworICAgICAgICBwcmV2aW91c190ZXN0ID0gTm9uZQorICAgICAgICBmb3IgdGVzdF9pbmRleCwgdGVzdCBpbiBlbnVtZXJhdGUoc2VsZi50ZXN0cywgMSk6CisgICAgICAgICAgICBzdGFydF90aW1lID0gdGltZS5tb25vdG9uaWMoKQorCisgICAgICAgICAgICB0ZXh0ID0gdGVzdAorICAgICAgICAgICAgaWYgcHJldmlvdXNfdGVzdDoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gJyVzIC0tICVzJyAlICh0ZXh0LCBwcmV2aW91c190ZXN0KQorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X3Byb2dyZXNzKHRlc3RfaW5kZXgsIHRleHQpCisKKyAgICAgICAgICAgIGlmIHNlbGYudHJhY2VyOgorICAgICAgICAgICAgICAgICMgSWYgd2UncmUgdHJhY2luZyBjb2RlIGNvdmVyYWdlLCB0aGVuIHdlIGRvbid0IGV4aXQgd2l0aCBzdGF0dXMKKyAgICAgICAgICAgICAgICAjIGlmIG9uIGEgZmFsc2UgcmV0dXJuIHZhbHVlIGZyb20gbWFpbi4KKyAgICAgICAgICAgICAgICBjbWQgPSAoJ3Jlc3VsdCA9IHJ1bnRlc3Qoc2VsZi5ucywgdGVzdCk7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGYuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KScpCisgICAgICAgICAgICAgICAgbnMgPSBkaWN0KGxvY2FscygpKQorICAgICAgICAgICAgICAgIHNlbGYudHJhY2VyLnJ1bmN0eChjbWQsIGdsb2JhbHM9Z2xvYmFscygpLCBsb2NhbHM9bnMpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnNbJ3Jlc3VsdCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdChzZWxmLm5zLCB0ZXN0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCAoSU5URVJSVVBURUQsIE5vbmUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQorCisgICAgICAgICAgICBwcmV2aW91c190ZXN0ID0gZm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3QsIHJlc3VsdFswXSkKKyAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUubW9ub3RvbmljKCkgLSBzdGFydF90aW1lCisgICAgICAgICAgICBpZiB0ZXN0X3RpbWUgPj0gUFJPR1JFU1NfTUlOX1RJTUU6CisgICAgICAgICAgICAgICAgcHJldmlvdXNfdGVzdCA9ICIlcyBpbiAlLjBmIHNlYyIgJSAocHJldmlvdXNfdGVzdCwgdGVzdF90aW1lKQorICAgICAgICAgICAgZWxpZiByZXN1bHRbMF0gPT0gUEFTU0VEOgorICAgICAgICAgICAgICAgICMgYmUgcXVpZXQ6IHNheSBub3RoaW5nIGlmIHRoZSB0ZXN0IHBhc3NlZCBzaG9ydGx5CisgICAgICAgICAgICAgICAgcHJldmlvdXNfdGVzdCA9IE5vbmUKKworICAgICAgICAgICAgaWYgc2VsZi5ucy5maW5kbGVha3M6CisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICAgICAgaWYgZ2MuZ2FyYmFnZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IHRlc3QgY3JlYXRlZCIsIGxlbihnYy5nYXJiYWdlKSwgZW5kPScgJykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoInVuY29sbGVjdGFibGUgb2JqZWN0KHMpLiIpCisgICAgICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgdW5jb2xsZWN0YWJsZSBvYmplY3RzIHNvbWV3aGVyZSBzbyB3ZSBkb24ndCBzZWUKKyAgICAgICAgICAgICAgICAgICAgIyB0aGVtIGFnYWluCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZm91bmRfZ2FyYmFnZS5leHRlbmQoZ2MuZ2FyYmFnZSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIGdjLmdhcmJhZ2VbOl0KKworICAgICAgICAgICAgIyBVbmxvYWQgdGhlIG5ld2x5IGltcG9ydGVkIG1vZHVsZXMgKGJlc3QgZWZmb3J0IGZpbmFsaXphdGlvbikKKyAgICAgICAgICAgIGZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIG1vZHVsZSBub3QgaW4gc2F2ZV9tb2R1bGVzIGFuZCBtb2R1bGUuc3RhcnRzd2l0aCgidGVzdC4iKToKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC51bmxvYWQobW9kdWxlKQorCisgICAgICAgIGlmIHByZXZpb3VzX3Rlc3Q6CisgICAgICAgICAgICBwcmludChwcmV2aW91c190ZXN0KQorCisgICAgZGVmIF90ZXN0X2ZvcmV2ZXIoc2VsZiwgdGVzdHMpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICAgICAgeWllbGQgdGVzdAorICAgICAgICAgICAgICAgIGlmIHNlbGYuYmFkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgIGRlZiBydW5fdGVzdHMoc2VsZik6CisgICAgICAgICMgRm9yIGEgcGFydGlhbCBydW4sIHdlIGRvIG5vdCBuZWVkIHRvIGNsdXR0ZXIgdGhlIG91dHB1dC4KKyAgICAgICAgaWYgKHNlbGYubnMudmVyYm9zZQorICAgICAgICAgICAgb3Igc2VsZi5ucy5oZWFkZXIKKyAgICAgICAgICAgIG9yIG5vdCAoc2VsZi5ucy5wZ28gb3Igc2VsZi5ucy5xdWlldCBvciBzZWxmLm5zLnNpbmdsZQorICAgICAgICAgICAgICAgICAgICBvciBzZWxmLnRlc3RzIG9yIHNlbGYubnMuYXJncykpOgorICAgICAgICAgICAgIyBQcmludCBiYXNpYyBwbGF0Zm9ybSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgcHJpbnQoIj09IiwgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksICpzeXMudmVyc2lvbi5zcGxpdCgpKQorICAgICAgICAgICAgcHJpbnQoIj09ICAiLCBwbGF0Zm9ybS5wbGF0Zm9ybShhbGlhc2VkPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMtZW5kaWFuIiAlIHN5cy5ieXRlb3JkZXIpCisgICAgICAgICAgICBwcmludCgiPT0gICIsICJoYXNoIGFsZ29yaXRobToiLCBzeXMuaGFzaF9pbmZvLmFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICI2NGJpdCIgaWYgc3lzLm1heHNpemUgPiAyKiozMiBlbHNlICIzMmJpdCIpCisgICAgICAgICAgICBwcmludCgiPT0gICIsIG9zLmdldGN3ZCgpKQorICAgICAgICAgICAgcHJpbnQoIlRlc3Rpbmcgd2l0aCBmbGFnczoiLCBzeXMuZmxhZ3MpCisKKyAgICAgICAgaWYgc2VsZi5ucy5yYW5kb21pemU6CisgICAgICAgICAgICBwcmludCgiVXNpbmcgcmFuZG9tIHNlZWQiLCBzZWxmLm5zLnJhbmRvbV9zZWVkKQorCisgICAgICAgIGlmIHNlbGYubnMuZm9yZXZlcjoKKyAgICAgICAgICAgIHNlbGYudGVzdHMgPSBzZWxmLl90ZXN0X2ZvcmV2ZXIobGlzdChzZWxmLnNlbGVjdGVkKSkKKyAgICAgICAgICAgIHNlbGYudGVzdF9jb3VudCA9ICcnCisgICAgICAgICAgICBzZWxmLnRlc3RfY291bnRfd2lkdGggPSAzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlc3RzID0gaXRlcihzZWxmLnNlbGVjdGVkKQorICAgICAgICAgICAgc2VsZi50ZXN0X2NvdW50ID0gJy97fScuZm9ybWF0KGxlbihzZWxmLnNlbGVjdGVkKSkKKyAgICAgICAgICAgIHNlbGYudGVzdF9jb3VudF93aWR0aCA9IGxlbihzZWxmLnRlc3RfY291bnQpIC0gMQorCisgICAgICAgIGlmIHNlbGYubnMudXNlX21wOgorICAgICAgICAgICAgZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJ1bnRlc3RfbXAgaW1wb3J0IHJ1bl90ZXN0c19tdWx0aXByb2Nlc3MKKyAgICAgICAgICAgIHJ1bl90ZXN0c19tdWx0aXByb2Nlc3Moc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucnVuX3Rlc3RzX3NlcXVlbnRpYWwoKQorCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lOgorICAgICAgICAgICAgaWYgc2VsZi5uZXh0X3NpbmdsZV90ZXN0OgorICAgICAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLm5leHRfc2luZ2xlX2ZpbGVuYW1lLCAndycpIGFzIGZwOgorICAgICAgICAgICAgICAgICAgICBmcC53cml0ZShzZWxmLm5leHRfc2luZ2xlX3Rlc3QgKyAnXG4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5uZXh0X3NpbmdsZV9maWxlbmFtZSkKKworICAgICAgICBpZiBzZWxmLnRyYWNlcjoKKyAgICAgICAgICAgIHIgPSBzZWxmLnRyYWNlci5yZXN1bHRzKCkKKyAgICAgICAgICAgIHIud3JpdGVfcmVzdWx0cyhzaG93X21pc3Npbmc9VHJ1ZSwgc3VtbWFyeT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZGlyPXNlbGYubnMuY292ZXJkaXIpCisKKyAgICAgICAgcHJpbnQoIlRvdGFsIGR1cmF0aW9uOiAlcyIgJSBzZWxmLnRpbWVfZGVsdGEoY2VpbD1UcnVlKSkKKworICAgICAgICBpZiBzZWxmLm5zLnJ1bmxlYWtzOgorICAgICAgICAgICAgb3Muc3lzdGVtKCJsZWFrcyAlZCIgJSBvcy5nZXRwaWQoKSkKKworICAgIGRlZiBtYWluKHNlbGYsIHRlc3RzPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgZ2xvYmFsIFRFTVBESVIKKworICAgICAgICBpZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MubWtkaXIoVEVNUERJUikKKyAgICAgICAgICAgIGV4Y2VwdCBGaWxlRXhpc3RzRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgRGVmaW5lIGEgd3JpdGFibGUgdGVtcCBkaXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY3dkIHdoaWxlIHJ1bm5pbmcKKyAgICAgICAgIyB0aGUgdGVzdHMuIFRoZSBuYW1lIG9mIHRoZSBkaXIgaW5jbHVkZXMgdGhlIHBpZCB0byBhbGxvdyBwYXJhbGxlbAorICAgICAgICAjIHRlc3RpbmcgKHNlZSB0aGUgLWogb3B0aW9uKS4KKyAgICAgICAgdGVzdF9jd2QgPSAndGVzdF9weXRob25fe30nLmZvcm1hdChvcy5nZXRwaWQoKSkKKyAgICAgICAgdGVzdF9jd2QgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgdGVzdF9jd2QpCisKKyAgICAgICAgIyBSdW4gdGhlIHRlc3RzIGluIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgdGVtcG9yYXJpbHkgY2hhbmdlcyB0aGUgQ1dEIHRvIGEKKyAgICAgICAgIyB0ZW1wb3JhcnkgYW5kIHdyaXRhYmxlIGRpcmVjdG9yeS4gIElmIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBvcgorICAgICAgICAjIGNoYW5nZSB0aGUgQ1dELCB0aGUgb3JpZ2luYWwgQ1dEIHdpbGwgYmUgdXNlZC4gIFRoZSBvcmlnaW5hbCBDV0QgaXMKKyAgICAgICAgIyBhdmFpbGFibGUgZnJvbSBzdXBwb3J0LlNBVkVEQ1dELgorICAgICAgICB3aXRoIHN1cHBvcnQudGVtcF9jd2QodGVzdF9jd2QsIHF1aWV0PVRydWUpOgorICAgICAgICAgICAgc2VsZi5fbWFpbih0ZXN0cywga3dhcmdzKQorCisgICAgZGVmIF9tYWluKHNlbGYsIHRlc3RzLCBrd2FyZ3MpOgorICAgICAgICBzZWxmLm5zID0gc2VsZi5wYXJzZV9hcmdzKGt3YXJncykKKworICAgICAgICBpZiBzZWxmLm5zLnNsYXZlYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZyb20gdGVzdC5saWJyZWdydGVzdC5ydW50ZXN0X21wIGltcG9ydCBydW5fdGVzdHNfc2xhdmUKKyAgICAgICAgICAgIHJ1bl90ZXN0c19zbGF2ZShzZWxmLm5zLnNsYXZlYXJncykKKworICAgICAgICBpZiBzZWxmLm5zLndhaXQ6CisgICAgICAgICAgICBpbnB1dCgiUHJlc3MgYW55IGtleSB0byBjb250aW51ZS4uLiIpCisKKyAgICAgICAgc2V0dXBfdGVzdHMoc2VsZi5ucykKKworICAgICAgICBzZWxmLmZpbmRfdGVzdHModGVzdHMpCisKKyAgICAgICAgaWYgc2VsZi5ucy5saXN0X3Rlc3RzOgorICAgICAgICAgICAgc2VsZi5saXN0X3Rlc3RzKCkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoKQorICAgICAgICBzZWxmLmRpc3BsYXlfcmVzdWx0KCkKKworICAgICAgICBpZiBzZWxmLm5zLnZlcmJvc2UyIGFuZCBzZWxmLmJhZDoKKyAgICAgICAgICAgIHNlbGYucmVydW5fZmFpbGVkX3Rlc3RzKCkKKworICAgICAgICBzZWxmLmZpbmFsaXplKCkKKyAgICAgICAgc3lzLmV4aXQobGVuKHNlbGYuYmFkKSA+IDAgb3Igc2VsZi5pbnRlcnJ1cHRlZCkKKworCitkZWYgcmVtb3ZlcHkobmFtZXMpOgorICAgIGlmIG5vdCBuYW1lczoKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgorICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBpZiBleHQgPT0gJy5weSc6CisgICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKKworCitkZWYgY291bnQobiwgd29yZCk6CisgICAgaWYgbiA9PSAxOgorICAgICAgICByZXR1cm4gIiVkICVzIiAlIChuLCB3b3JkKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiJWQgJXNzIiAlIChuLCB3b3JkKQorCisKK2RlZiBwcmludGxpc3QoeCwgd2lkdGg9NzAsIGluZGVudD00KToKKyAgICAiIiJQcmludCB0aGUgZWxlbWVudHMgb2YgaXRlcmFibGUgeCB0byBzdGRvdXQuCisKKyAgICBPcHRpb25hbCBhcmcgd2lkdGggKGRlZmF1bHQgNzApIGlzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoLgorICAgIE9wdGlvbmFsIGFyZyBpbmRlbnQgKGRlZmF1bHQgNCkgaXMgdGhlIG51bWJlciBvZiBibGFua3Mgd2l0aCB3aGljaCB0bworICAgIGJlZ2luIGVhY2ggbGluZS4KKyAgICAiIiIKKworICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAorICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKKyAgICBwcmludCh0ZXh0d3JhcC5maWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykpCisKKworZGVmIG1haW4odGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgorICAgICIiIlJ1biB0aGUgUHl0aG9uIHN1aXRlLiIiIgorICAgIFJlZ3J0ZXN0KCkubWFpbih0ZXN0cz10ZXN0cywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9saWJyZWdydGVzdC9yZWZsZWFrLnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcmVmbGVhay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRjNDlmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3QvcmVmbGVhay5weQpAQCAtMCwwICsxLDIwMiBAQAoraW1wb3J0IGVycm5vCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitmcm9tIGluc3BlY3QgaW1wb3J0IGlzYWJzdHJhY3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisKK3RyeToKKyAgICBNQVhGRCA9IG9zLnN5c2NvbmYoIlNDX09QRU5fTUFYIikKK2V4Y2VwdCBFeGNlcHRpb246CisgICAgTUFYRkQgPSAyNTYKKworCitkZWYgZmRfY291bnQoKToKKyAgICAiIiJDb3VudCB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZSBkZXNjcmlwdG9ycyIiIgorICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCgnbGludXgnLCAnZnJlZWJzZCcpKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKCIvcHJvYy9zZWxmL2ZkIikKKyAgICAgICAgICAgIHJldHVybiBsZW4obmFtZXMpCisgICAgICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGNvdW50ID0gMAorICAgIGZvciBmZCBpbiByYW5nZShNQVhGRCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgUHJlZmVyIGR1cCgpIG92ZXIgZnN0YXQoKS4gZnN0YXQoKSBjYW4gcmVxdWlyZSBpbnB1dC9vdXRwdXQKKyAgICAgICAgICAgICMgd2hlcmVhcyBkdXAoKSBkb2Vzbid0LgorICAgICAgICAgICAgZmQyID0gb3MuZHVwKGZkKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQkFERjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MuY2xvc2UoZmQyKQorICAgICAgICAgICAgY291bnQgKz0gMQorICAgIHJldHVybiBjb3VudAorCisKK2RlZiBkYXNoX1IodGhlX21vZHVsZSwgdGVzdCwgaW5kaXJlY3RfdGVzdCwgaHVudHJsZWFrcyk6CisgICAgIiIiUnVuIGEgdGVzdCBtdWx0aXBsZSB0aW1lcywgbG9va2luZyBmb3IgcmVmZXJlbmNlIGxlYWtzLgorCisgICAgUmV0dXJuczoKKyAgICAgICAgRmFsc2UgaWYgdGhlIHRlc3QgZGlkbid0IGxlYWsgcmVmZXJlbmNlczsgVHJ1ZSBpZiB3ZSBkZXRlY3RlZCByZWZsZWFrcy4KKyAgICAiIiIKKyAgICAjIFRoaXMgY29kZSBpcyBoYWNraXNoIGFuZCBpbmVsZWdhbnQsIGJ1dCBpdCBzZWVtcyB0byBkbyB0aGUgam9iLgorICAgIGltcG9ydCBjb3B5cmVnCisgICAgaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworCisgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRyYWNraW5nIHJlZmVyZW5jZSBsZWFrcyByZXF1aXJlcyBhIGRlYnVnIGJ1aWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZiBQeXRob24iKQorCisgICAgIyBTYXZlIGN1cnJlbnQgdmFsdWVzIGZvciBkYXNoX1JfY2xlYW51cCgpIHRvIHJlc3RvcmUuCisgICAgZnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCisgICAgcHMgPSBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNvcHkoKQorICAgIHBpYyA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNvcHkoKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHppcGltcG9ydAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgemRjID0gTm9uZSAjIFJ1biB1bm1vZGlmaWVkIG9uIHBsYXRmb3JtcyB3aXRob3V0IHppcGltcG9ydCBzdXBwb3J0CisgICAgZWxzZToKKyAgICAgICAgemRjID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNvcHkoKQorICAgIGFiY3MgPSB7fQorICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106CisgICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106CisgICAgICAgICAgICBhYmNzW29ial0gPSBvYmouX2FiY19yZWdpc3RyeS5jb3B5KCkKKworICAgIG53YXJtdXAsIG50cmFja2VkLCBmbmFtZSA9IGh1bnRybGVha3MKKyAgICBmbmFtZSA9IG9zLnBhdGguam9pbihzdXBwb3J0LlNBVkVEQ1dELCBmbmFtZSkKKyAgICByZXBjb3VudCA9IG53YXJtdXAgKyBudHJhY2tlZAorICAgIHJjX2RlbHRhcyA9IFswXSAqIHJlcGNvdW50CisgICAgYWxsb2NfZGVsdGFzID0gWzBdICogcmVwY291bnQKKyAgICBmZF9kZWx0YXMgPSBbMF0gKiByZXBjb3VudAorCisgICAgcHJpbnQoImJlZ2lubmluZyIsIHJlcGNvdW50LCAicmVwZXRpdGlvbnMiLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgcHJpbnQoKCIxMjM0NTY3ODkwIioocmVwY291bnQvLzEwICsgMSkpWzpyZXBjb3VudF0sIGZpbGU9c3lzLnN0ZGVyciwKKyAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICMgaW5pdGlhbGl6ZSB2YXJpYWJsZXMgdG8gbWFrZSBweWZsYWtlcyBxdWlldAorICAgIHJjX2JlZm9yZSA9IGFsbG9jX2JlZm9yZSA9IGZkX2JlZm9yZSA9IDAKKyAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6CisgICAgICAgIGluZGlyZWN0X3Rlc3QoKQorICAgICAgICBhbGxvY19hZnRlciwgcmNfYWZ0ZXIsIGZkX2FmdGVyID0gZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiY3MpCisgICAgICAgIHByaW50KCcuJywgZW5kPScnLCBmbHVzaD1UcnVlKQorICAgICAgICBpZiBpID49IG53YXJtdXA6CisgICAgICAgICAgICByY19kZWx0YXNbaV0gPSByY19hZnRlciAtIHJjX2JlZm9yZQorICAgICAgICAgICAgYWxsb2NfZGVsdGFzW2ldID0gYWxsb2NfYWZ0ZXIgLSBhbGxvY19iZWZvcmUKKyAgICAgICAgICAgIGZkX2RlbHRhc1tpXSA9IGZkX2FmdGVyIC0gZmRfYmVmb3JlCisgICAgICAgIGFsbG9jX2JlZm9yZSA9IGFsbG9jX2FmdGVyCisgICAgICAgIHJjX2JlZm9yZSA9IHJjX2FmdGVyCisgICAgICAgIGZkX2JlZm9yZSA9IGZkX2FmdGVyCisgICAgcHJpbnQoZmlsZT1zeXMuc3RkZXJyKQorICAgICMgVGhlc2UgY2hlY2tlcnMgcmV0dXJuIEZhbHNlIG9uIHN1Y2Nlc3MsIFRydWUgb24gZmFpbHVyZQorICAgIGRlZiBjaGVja19yY19kZWx0YXMoZGVsdGFzKToKKyAgICAgICAgcmV0dXJuIGFueShkZWx0YXMpCisgICAgZGVmIGNoZWNrX2FsbG9jX2RlbHRhcyhkZWx0YXMpOgorICAgICAgICAjIEF0IGxlYXN0IDEvM3JkIG9mIDBzCisgICAgICAgIGlmIDMgKiBkZWx0YXMuY291bnQoMCkgPCBsZW4oZGVsdGFzKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgTm90aGluZyBlbHNlIHRoYW4gMXMsIDBzIGFuZCAtMXMKKyAgICAgICAgaWYgbm90IHNldChkZWx0YXMpIDw9IHsxLDAsLTF9OgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZmFpbGVkID0gRmFsc2UKKyAgICBmb3IgZGVsdGFzLCBpdGVtX25hbWUsIGNoZWNrZXIgaW4gWworICAgICAgICAocmNfZGVsdGFzLCAncmVmZXJlbmNlcycsIGNoZWNrX3JjX2RlbHRhcyksCisgICAgICAgIChhbGxvY19kZWx0YXMsICdtZW1vcnkgYmxvY2tzJywgY2hlY2tfYWxsb2NfZGVsdGFzKSwKKyAgICAgICAgKGZkX2RlbHRhcywgJ2ZpbGUgZGVzY3JpcHRvcnMnLCBjaGVja19yY19kZWx0YXMpXToKKyAgICAgICAgaWYgY2hlY2tlcihkZWx0YXMpOgorICAgICAgICAgICAgbXNnID0gJyVzIGxlYWtlZCAlcyAlcywgc3VtPSVzJyAlICgKKyAgICAgICAgICAgICAgICB0ZXN0LCBkZWx0YXNbbndhcm11cDpdLCBpdGVtX25hbWUsIHN1bShkZWx0YXMpKQorICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisgICAgICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICJhIikgYXMgcmVmcmVwOgorICAgICAgICAgICAgICAgIHByaW50KG1zZywgZmlsZT1yZWZyZXApCisgICAgICAgICAgICAgICAgcmVmcmVwLmZsdXNoKCkKKyAgICAgICAgICAgIGZhaWxlZCA9IFRydWUKKyAgICByZXR1cm4gZmFpbGVkCisKKworZGVmIGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljLCB6ZGMsIGFiY3MpOgorICAgIGltcG9ydCBnYywgY29weXJlZworICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZQorICAgIGltcG9ydCB1cmxsaWIucGFyc2UsIHVybGxpYi5yZXF1ZXN0LCBtaW1ldHlwZXMsIGRvY3Rlc3QKKyAgICBpbXBvcnQgc3RydWN0LCBmaWxlY21wLCBjb2xsZWN0aW9ucy5hYmMKKyAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgX3BhdGhfY3JlYXRlZAorICAgIGZyb20gd2Vha3JlZiBpbXBvcnQgV2Vha1NldAorCisgICAgIyBDbGVhciB0aGUgd2FybmluZ3MgcmVnaXN0cnksIHNvIHRoZXkgY2FuIGJlIGRpc3BsYXllZCBhZ2FpbgorICAgIGZvciBtb2QgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6CisgICAgICAgIGlmIGhhc2F0dHIobW9kLCAnX193YXJuaW5ncmVnaXN0cnlfXycpOgorICAgICAgICAgICAgZGVsIG1vZC5fX3dhcm5pbmdyZWdpc3RyeV9fCisKKyAgICAjIFJlc3RvcmUgc29tZSBvcmlnaW5hbCB2YWx1ZXMuCisgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IGZzCisgICAgY29weXJlZy5kaXNwYXRjaF90YWJsZS5jbGVhcigpCisgICAgY29weXJlZy5kaXNwYXRjaF90YWJsZS51cGRhdGUocHMpCisgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQorICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnVwZGF0ZShwaWMpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgemlwaW1wb3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKKyAgICBlbHNlOgorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUudXBkYXRlKHpkYykKKworICAgICMgY2xlYXIgdHlwZSBjYWNoZQorICAgIHN5cy5fY2xlYXJfdHlwZV9jYWNoZSgpCisKKyAgICAjIENsZWFyIEFCQyByZWdpc3RyaWVzLCByZXN0b3JpbmcgcHJldmlvdXNseSBzYXZlZCBBQkMgcmVnaXN0cmllcy4KKyAgICBmb3IgYWJjIGluIFtnZXRhdHRyKGNvbGxlY3Rpb25zLmFiYywgYSkgZm9yIGEgaW4gY29sbGVjdGlvbnMuYWJjLl9fYWxsX19dOgorICAgICAgICBpZiBub3QgaXNhYnN0cmFjdChhYmMpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm9yIG9iaiBpbiBhYmMuX19zdWJjbGFzc2VzX18oKSArIFthYmNdOgorICAgICAgICAgICAgb2JqLl9hYmNfcmVnaXN0cnkgPSBhYmNzLmdldChvYmosIFdlYWtTZXQoKSkuY29weSgpCisgICAgICAgICAgICBvYmouX2FiY19jYWNoZS5jbGVhcigpCisgICAgICAgICAgICBvYmouX2FiY19uZWdhdGl2ZV9jYWNoZS5jbGVhcigpCisKKyAgICAjIEZsdXNoIHN0YW5kYXJkIG91dHB1dCwgc28gdGhhdCBidWZmZXJlZCBkYXRhIGlzIHNlbnQgdG8gdGhlIE9TIGFuZAorICAgICMgYXNzb2NpYXRlZCBQeXRob24gb2JqZWN0cyBhcmUgcmVjbGFpbWVkLgorICAgIGZvciBzdHJlYW0gaW4gKHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIsIHN5cy5fX3N0ZG91dF9fLCBzeXMuX19zdGRlcnJfXyk6CisgICAgICAgIGlmIHN0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpCisKKyAgICAjIENsZWFyIGFzc29ydGVkIG1vZHVsZSBjYWNoZXMuCisgICAgX3BhdGhfY3JlYXRlZC5jbGVhcigpCisgICAgcmUucHVyZ2UoKQorICAgIF9zdHJwdGltZS5fcmVnZXhfY2FjaGUuY2xlYXIoKQorICAgIHVybGxpYi5wYXJzZS5jbGVhcl9jYWNoZSgpCisgICAgdXJsbGliLnJlcXVlc3QudXJsY2xlYW51cCgpCisgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgIG1pbWV0eXBlcy5fZGVmYXVsdF9taW1lX3R5cGVzKCkKKyAgICBmaWxlY21wLl9jYWNoZS5jbGVhcigpCisgICAgc3RydWN0Ll9jbGVhcmNhY2hlKCkKKyAgICBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgRG9uJ3Qgd29ycnkgYWJvdXQgcmVzZXR0aW5nIHRoZSBjYWNoZSBpZiBjdHlwZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgY3R5cGVzLl9yZXNldF9jYWNoZSgpCisKKyAgICAjIENvbGxlY3QgY3ljbGljIHRyYXNoIGFuZCByZWFkIG1lbW9yeSBzdGF0aXN0aWNzIGltbWVkaWF0ZWx5IGFmdGVyLgorICAgIGZ1bmMxID0gc3lzLmdldGFsbG9jYXRlZGJsb2NrcworICAgIGZ1bmMyID0gc3lzLmdldHRvdGFscmVmY291bnQKKyAgICBnYy5jb2xsZWN0KCkKKyAgICByZXR1cm4gZnVuYzEoKSwgZnVuYzIoKSwgZmRfY291bnQoKQorCisKK2RlZiB3YXJtX2NhY2hlcygpOgorICAgICMgY2hhciBjYWNoZQorICAgIHMgPSBieXRlcyhyYW5nZSgyNTYpKQorICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgIHNbaTppKzFdCisgICAgIyB1bmljb2RlIGNhY2hlCisgICAgW2NocihpKSBmb3IgaSBpbiByYW5nZSgyNTYpXQorICAgICMgaW50IGNhY2hlCisgICAgbGlzdChyYW5nZSgtNSwgMjU3KSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3QucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMWZlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9ydW50ZXN0LnB5CkBAIC0wLDAgKzEsMjYwIEBACitpbXBvcnQgZmF1bHRoYW5kbGVyCitpbXBvcnQgaW1wb3J0bGliCitpbXBvcnQgaW8KK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QubGlicmVncnRlc3QucmVmbGVhayBpbXBvcnQgZGFzaF9SCitmcm9tIHRlc3QubGlicmVncnRlc3Quc2F2ZV9lbnYgaW1wb3J0IHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQKKworCisjIFRlc3QgcmVzdWx0IGNvbnN0YW50cy4KK1BBU1NFRCA9IDEKK0ZBSUxFRCA9IDAKK0VOVl9DSEFOR0VEID0gLTEKK1NLSVBQRUQgPSAtMgorUkVTT1VSQ0VfREVOSUVEID0gLTMKK0lOVEVSUlVQVEVEID0gLTQKK0NISUxEX0VSUk9SID0gLTUgICAjIGVycm9yIGluIGEgY2hpbGQgcHJvY2VzcworCitfRk9STUFUX1RFU1RfUkVTVUxUID0geworICAgIFBBU1NFRDogJyVzIHBhc3NlZCcsCisgICAgRkFJTEVEOiAnJXMgZmFpbGVkJywKKyAgICBFTlZfQ0hBTkdFRDogJyVzIGZhaWxlZCAoZW52IGNoYW5nZWQpJywKKyAgICBTS0lQUEVEOiAnJXMgc2tpcHBlZCcsCisgICAgUkVTT1VSQ0VfREVOSUVEOiAnJXMgc2tpcHBlZCAocmVzb3VyY2UgZGVuaWVkKScsCisgICAgSU5URVJSVVBURUQ6ICclcyBpbnRlcnJ1cHRlZCcsCisgICAgQ0hJTERfRVJST1I6ICclcyBjcmFzaGVkJywKK30KKworIyBNaW5pbXVtIGR1cmF0aW9uIG9mIGEgdGVzdCB0byBkaXNwbGF5IGl0cyBkdXJhdGlvbiBvciB0byBtZW50aW9uIHRoYXQKKyMgdGhlIHRlc3QgaXMgcnVubmluZyBpbiBiYWNrZ3JvdW5kCitQUk9HUkVTU19NSU5fVElNRSA9IDMwLjAgICAjIHNlY29uZHMKKworIyBzbWFsbCBzZXQgb2YgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGhhdmUgYSBiYXNpY2FsbHkgZnVuY3Rpb25pbmcgaW50ZXJwcmV0ZXIKKyMgKGkuZS4gaWYgYW55IG9mIHRoZXNlIGZhaWwsIHRoZW4gYW55dGhpbmcgZWxzZSBpcyBsaWtlbHkgdG8gZm9sbG93KQorU1REVEVTVFMgPSBbCisgICAgJ3Rlc3RfZ3JhbW1hcicsCisgICAgJ3Rlc3Rfb3Bjb2RlcycsCisgICAgJ3Rlc3RfZGljdCcsCisgICAgJ3Rlc3RfYnVpbHRpbicsCisgICAgJ3Rlc3RfZXhjZXB0aW9ucycsCisgICAgJ3Rlc3RfdHlwZXMnLAorICAgICd0ZXN0X3VuaXR0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0MicsCisgICAgJ3Rlc3Rfc3VwcG9ydCcKK10KKworIyBzZXQgb2YgdGVzdHMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdXNpbmcgcmVncnRlc3QKK05PVFRFU1RTID0gc2V0KCkKKworCitkZWYgZm9ybWF0X3Rlc3RfcmVzdWx0KHRlc3RfbmFtZSwgcmVzdWx0KToKKyAgICBmbXQgPSBfRk9STUFUX1RFU1RfUkVTVUxULmdldChyZXN1bHQsICIlcyIpCisgICAgcmV0dXJuIGZtdCAlIHRlc3RfbmFtZQorCisKK2RlZiBmaW5kdGVzdHModGVzdGRpcj1Ob25lLCBzdGR0ZXN0cz1TVERURVNUUywgbm90dGVzdHM9Tk9UVEVTVFMpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGFwcGxpY2FibGUgdGVzdCBtb2R1bGVzLiIiIgorICAgIHRlc3RkaXIgPSBmaW5kdGVzdGRpcih0ZXN0ZGlyKQorICAgIG5hbWVzID0gb3MubGlzdGRpcih0ZXN0ZGlyKQorICAgIHRlc3RzID0gW10KKyAgICBvdGhlcnMgPSBzZXQoc3RkdGVzdHMpIHwgbm90dGVzdHMKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgbW9kLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCisgICAgICAgIGlmIG1vZFs6NV0gPT0gInRlc3RfIiBhbmQgZXh0IGluICgiLnB5IiwgIiIpIGFuZCBtb2Qgbm90IGluIG90aGVyczoKKyAgICAgICAgICAgIHRlc3RzLmFwcGVuZChtb2QpCisgICAgcmV0dXJuIHN0ZHRlc3RzICsgc29ydGVkKHRlc3RzKQorCisKK2RlZiBydW50ZXN0KG5zLCB0ZXN0KToKKyAgICAiIiJSdW4gYSBzaW5nbGUgdGVzdC4KKworICAgIHRlc3QgLS0gdGhlIG5hbWUgb2YgdGhlIHRlc3QKKyAgICB2ZXJib3NlIC0tIGlmIHRydWUsIHByaW50IG1vcmUgbWVzc2FnZXMKKyAgICBxdWlldCAtLSBpZiB0cnVlLCBkb24ndCBwcmludCAnc2tpcHBlZCcgbWVzc2FnZXMgKHByb2JhYmx5IHJlZHVuZGFudCkKKyAgICBodW50cmxlYWtzIC0tIHJ1biBtdWx0aXBsZSB0aW1lcyB0byB0ZXN0IGZvciBsZWFrczsgcmVxdWlyZXMgYSBkZWJ1ZworICAgICAgICAgICAgICAgICAgYnVpbGQ7IGEgdHJpcGxlIGNvcnJlc3BvbmRpbmcgdG8gLVIncyB0aHJlZSBhcmd1bWVudHMKKyAgICBvdXRwdXRfb25fZmFpbHVyZSAtLSBpZiB0cnVlLCBkaXNwbGF5IHRlc3Qgb3V0cHV0IG9uIGZhaWx1cmUKKyAgICB0aW1lb3V0IC0tIGR1bXAgdGhlIHRyYWNlYmFjayBhbmQgZXhpdCBpZiBhIHRlc3QgdGFrZXMgbW9yZSB0aGFuCisgICAgICAgICAgICAgICB0aW1lb3V0IHNlY29uZHMKKyAgICBmYWlsZmFzdCwgbWF0Y2hfdGVzdHMgLS0gU2VlIHJlZ3J0ZXN0IGNvbW1hbmQtbGluZSBmbGFncyBmb3IgdGhlc2UuCisgICAgcGdvIC0tIGlmIHRydWUsIHN1cHByZXNzIGFueSBpbmZvIGlycmVsZXZhbnQgdG8gYSBnZW5lcmF0aW5nIGEgUEdPIGJ1aWxkCisKKyAgICBSZXR1cm5zIHRoZSB0dXBsZSByZXN1bHQsIHRlc3RfdGltZSwgd2hlcmUgcmVzdWx0IGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzOgorICAgICAgICBJTlRFUlJVUFRFRCAgICAgIEtleWJvYXJkSW50ZXJydXB0IHdoZW4gcnVuIHVuZGVyIC1qCisgICAgICAgIFJFU09VUkNFX0RFTklFRCAgdGVzdCBza2lwcGVkIGJlY2F1c2UgcmVzb3VyY2UgZGVuaWVkCisgICAgICAgIFNLSVBQRUQgICAgICAgICAgdGVzdCBza2lwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgorICAgICAgICBFTlZfQ0hBTkdFRCAgICAgIHRlc3QgZmFpbGVkIGJlY2F1c2UgaXQgY2hhbmdlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50CisgICAgICAgIEZBSUxFRCAgICAgICAgICAgdGVzdCBmYWlsZWQKKyAgICAgICAgUEFTU0VEICAgICAgICAgICB0ZXN0IHBhc3NlZAorICAgICIiIgorCisgICAgdmVyYm9zZSA9IG5zLnZlcmJvc2UKKyAgICBxdWlldCA9IG5zLnF1aWV0CisgICAgaHVudHJsZWFrcyA9IG5zLmh1bnRybGVha3MKKyAgICBvdXRwdXRfb25fZmFpbHVyZSA9IG5zLnZlcmJvc2UzCisgICAgZmFpbGZhc3QgPSBucy5mYWlsZmFzdAorICAgIG1hdGNoX3Rlc3RzID0gbnMubWF0Y2hfdGVzdHMKKyAgICB0aW1lb3V0ID0gbnMudGltZW91dAorICAgIHBnbyA9IG5zLnBnbworCisgICAgdXNlX3RpbWVvdXQgPSAodGltZW91dCBpcyBub3QgTm9uZSkKKyAgICBpZiB1c2VfdGltZW91dDoKKyAgICAgICAgZmF1bHRoYW5kbGVyLmR1bXBfdHJhY2ViYWNrX2xhdGVyKHRpbWVvdXQsIGV4aXQ9VHJ1ZSkKKyAgICB0cnk6CisgICAgICAgIHN1cHBvcnQubWF0Y2hfdGVzdHMgPSBtYXRjaF90ZXN0cworICAgICAgICBpZiBmYWlsZmFzdDoKKyAgICAgICAgICAgIHN1cHBvcnQuZmFpbGZhc3QgPSBUcnVlCisgICAgICAgIGlmIG91dHB1dF9vbl9mYWlsdXJlOgorICAgICAgICAgICAgc3VwcG9ydC52ZXJib3NlID0gVHJ1ZQorCisgICAgICAgICAgICAjIFJldXNlIHRoZSBzYW1lIGluc3RhbmNlIHRvIGFsbCBjYWxscyB0byBydW50ZXN0KCkuIFNvbWUKKyAgICAgICAgICAgICMgdGVzdHMga2VlcCBhIHJlZmVyZW5jZSB0byBzeXMuc3Rkb3V0IG9yIHN5cy5zdGRlcnIKKyAgICAgICAgICAgICMgKGVnLiB0ZXN0X2FyZ3BhcnNlKS4KKyAgICAgICAgICAgIGlmIHJ1bnRlc3Quc3RyaW5naW8gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBpby5TdHJpbmdJTygpCisgICAgICAgICAgICAgICAgcnVudGVzdC5zdHJpbmdpbyA9IHN0cmVhbQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBydW50ZXN0LnN0cmluZ2lvCisgICAgICAgICAgICAgICAgc3RyZWFtLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzdHJlYW0udHJ1bmNhdGUoKQorCisgICAgICAgICAgICBvcmlnX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIG9yaWdfc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzdHJlYW0KKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3RyZWFtCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcihucywgdGVzdCwgdmVyYm9zZSwgcXVpZXQsIGh1bnRybGVha3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2ZhaWx1cmU9RmFsc2UsIHBnbz1wZ28pCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IEZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgb3JpZ19zdGRlcnIud3JpdGUob3V0cHV0KQorICAgICAgICAgICAgICAgICAgICBvcmlnX3N0ZGVyci5mbHVzaCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvcmlnX3N0ZG91dAorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBvcmlnX3N0ZGVycgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3VwcG9ydC52ZXJib3NlID0gdmVyYm9zZSAgIyBUZWxsIHRlc3RzIHRvIGJlIG1vZGVyYXRlbHkgcXVpZXQKKyAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3RfaW5uZXIobnMsIHRlc3QsIHZlcmJvc2UsIHF1aWV0LCBodW50cmxlYWtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2ZhaWx1cmU9bm90IHZlcmJvc2UsIHBnbz1wZ28pCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB1c2VfdGltZW91dDoKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5jYW5jZWxfZHVtcF90cmFjZWJhY2tfbGF0ZXIoKQorICAgICAgICBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3QsIHZlcmJvc2UpCitydW50ZXN0LnN0cmluZ2lvID0gTm9uZQorCisKK2RlZiBydW50ZXN0X2lubmVyKG5zLCB0ZXN0LCB2ZXJib3NlLCBxdWlldCwKKyAgICAgICAgICAgICAgICAgIGh1bnRybGVha3M9RmFsc2UsIGRpc3BsYXlfZmFpbHVyZT1UcnVlLCAqLCBwZ289RmFsc2UpOgorICAgIHN1cHBvcnQudW5sb2FkKHRlc3QpCisKKyAgICB0ZXN0X3RpbWUgPSAwLjAKKyAgICByZWZsZWFrID0gRmFsc2UgICMgVHJ1ZSBpZiB0aGUgdGVzdCBsZWFrZWQgcmVmZXJlbmNlcy4KKyAgICB0cnk6CisgICAgICAgIGlmIHRlc3Quc3RhcnRzd2l0aCgndGVzdC4nKSBvciBucy50ZXN0ZGlyOgorICAgICAgICAgICAgYWJzdGVzdCA9IHRlc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQWx3YXlzIGltcG9ydCBpdCBmcm9tIHRoZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgICAgIGFic3Rlc3QgPSAndGVzdC4nICsgdGVzdAorICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdCwgdmVyYm9zZSwgcXVpZXQsIHBnbz1wZ28pIGFzIGVudmlyb25tZW50OgorICAgICAgICAgICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICB0aGVfbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoYWJzdGVzdCkKKyAgICAgICAgICAgICMgSWYgdGhlIHRlc3QgaGFzIGEgdGVzdF9tYWluLCB0aGF0IHdpbGwgcnVuIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgIyB0ZXN0cy4gIElmIG5vdCwgdXNlIG5vcm1hbCB1bml0dGVzdCB0ZXN0IGxvYWRpbmcuCisgICAgICAgICAgICB0ZXN0X3J1bm5lciA9IGdldGF0dHIodGhlX21vZHVsZSwgInRlc3RfbWFpbiIsIE5vbmUpCisgICAgICAgICAgICBpZiB0ZXN0X3J1bm5lciBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X3J1bm5lcigpOgorICAgICAgICAgICAgICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgdGVzdHMgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZSh0aGVfbW9kdWxlKQorICAgICAgICAgICAgICAgICAgICBmb3IgZXJyb3IgaW4gbG9hZGVyLmVycm9yczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGVycm9yLCBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICAgICAgICAgIGlmIGxvYWRlci5lcnJvcnM6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oImVycm9ycyB3aGlsZSBsb2FkaW5nIHRlc3RzIikKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QodGVzdHMpCisgICAgICAgICAgICB0ZXN0X3J1bm5lcigpCisgICAgICAgICAgICBpZiBodW50cmxlYWtzOgorICAgICAgICAgICAgICAgIHJlZmxlYWsgPSBkYXNoX1IodGhlX21vZHVsZSwgdGVzdCwgdGVzdF9ydW5uZXIsIGh1bnRybGVha3MpCisgICAgICAgICAgICB0ZXN0X3RpbWUgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUKKyAgICBleGNlcHQgc3VwcG9ydC5SZXNvdXJjZURlbmllZCBhcyBtc2c6CisgICAgICAgIGlmIG5vdCBxdWlldCBhbmQgbm90IHBnbzoKKyAgICAgICAgICAgIHByaW50KHRlc3QsICJza2lwcGVkIC0tIiwgbXNnLCBmbHVzaD1UcnVlKQorICAgICAgICByZXR1cm4gUkVTT1VSQ0VfREVOSUVELCB0ZXN0X3RpbWUKKyAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QgYXMgbXNnOgorICAgICAgICBpZiBub3QgcXVpZXQgYW5kIG5vdCBwZ286CisgICAgICAgICAgICBwcmludCh0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZywgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIFNLSVBQRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQgc3VwcG9ydC5UZXN0RmFpbGVkIGFzIG1zZzoKKyAgICAgICAgaWYgbm90IHBnbzoKKyAgICAgICAgICAgIGlmIGRpc3BsYXlfZmFpbHVyZToKKyAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQgLS0iLCBtc2csIGZpbGU9c3lzLnN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgICBmbHVzaD1UcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQiLCBmaWxlPXN5cy5zdGRlcnIsIGZsdXNoPVRydWUpCisgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdDoKKyAgICAgICAgbXNnID0gdHJhY2ViYWNrLmZvcm1hdF9leGMoKQorICAgICAgICBpZiBub3QgcGdvOgorICAgICAgICAgICAgcHJpbnQoInRlc3QiLCB0ZXN0LCAiY3Jhc2hlZCAtLSIsIG1zZywgZmlsZT1zeXMuc3RkZXJyLAorICAgICAgICAgICAgICAgICAgZmx1c2g9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgZWxzZToKKyAgICAgICAgaWYgcmVmbGVhazoKKyAgICAgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQorICAgICAgICBpZiBlbnZpcm9ubWVudC5jaGFuZ2VkOgorICAgICAgICAgICAgcmV0dXJuIEVOVl9DSEFOR0VELCB0ZXN0X3RpbWUKKyAgICAgICAgcmV0dXJuIFBBU1NFRCwgdGVzdF90aW1lCisKKworZGVmIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdG5hbWUsIHZlcmJvc2UpOgorICAgIGltcG9ydCBzaHV0aWwKKyAgICBpbXBvcnQgc3RhdAorICAgIGltcG9ydCBnYworCisgICAgIyBGaXJzdCBraWxsIGFueSBkYW5nbGluZyByZWZlcmVuY2VzIHRvIG9wZW4gZmlsZXMgZXRjLgorICAgICMgVGhpcyBjYW4gYWxzbyBpc3N1ZSBzb21lIFJlc291cmNlV2FybmluZ3Mgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGdldAorICAgICMgdHJpZ2dlcmVkIGR1cmluZyB0aGUgZm9sbG93aW5nIHRlc3QgcnVuLCBhbmQgcG9zc2libHkgcHJvZHVjZSBmYWlsdXJlcy4KKyAgICBnYy5jb2xsZWN0KCkKKworICAgICMgVHJ5IHRvIGNsZWFuIHVwIGp1bmsgY29tbW9ubHkgbGVmdCBiZWhpbmQuICBXaGlsZSB0ZXN0cyBzaG91bGRuJ3QgbGVhdmUKKyAgICAjIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBiZWhpbmQsIHdoZW4gYSB0ZXN0IGZhaWxzIHRoYXQgY2FuIGJlIHRlZGlvdXMKKyAgICAjIGZvciBpdCB0byBhcnJhbmdlLiAgVGhlIGNvbnNlcXVlbmNlcyBjYW4gYmUgZXNwZWNpYWxseSBuYXN0eSBvbiBXaW5kb3dzLAorICAgICMgc2luY2UgaWYgYSB0ZXN0IGxlYXZlcyBhIGZpbGUgb3BlbiwgaXQgY2Fubm90IGJlIGRlbGV0ZWQgYnkgbmFtZSAod2hpbGUKKyAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCBoZXJlIGVpdGhlciwgd2UgY2FuIGRpc3BsYXkgdGhlCisgICAgIyBuYW1lIG9mIHRoZSBvZmZlbmRpbmcgdGVzdCwgd2hpY2ggaXMgYSByZWFsIGhlbHApLgorICAgIGZvciBuYW1lIGluIChzdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgImRiX2hvbWUiLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhuYW1lKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihuYW1lKToKKyAgICAgICAgICAgIGtpbmQsIG51a2VyID0gImRpcmVjdG9yeSIsIHNodXRpbC5ybXRyZWUKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYW1lKToKKyAgICAgICAgICAgIGtpbmQsIG51a2VyID0gImZpbGUiLCBvcy51bmxpbmsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yKCJvcy5wYXRoIHNheXMgJXIgZXhpc3RzIGJ1dCBpcyBuZWl0aGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3Rvcnkgbm9yIGZpbGUiICUgbmFtZSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIiVyIGxlZnQgYmVoaW5kICVzICVyIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBjaG1vZCwgZml4IHBvc3NpYmxlIHBlcm1pc3Npb25zIHByb2JsZW1zCisgICAgICAgICAgICAjIHRoYXQgbWlnaHQgcHJldmVudCBjbGVhbnVwCisgICAgICAgICAgICBpZiAoaGFzYXR0cihvcywgJ2NobW9kJykpOgorICAgICAgICAgICAgICAgIG9zLmNobW9kKG5hbWUsIHN0YXQuU19JUldYVSB8IHN0YXQuU19JUldYRyB8IHN0YXQuU19JUldYTykKKyAgICAgICAgICAgIG51a2VyKG5hbWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgbXNnOgorICAgICAgICAgICAgcHJpbnQoKCIlciBsZWZ0IGJlaGluZCAlcyAlciBhbmQgaXQgY291bGRuJ3QgYmUgIgorICAgICAgICAgICAgICAgICJyZW1vdmVkOiAlcyIgJSAodGVzdG5hbWUsIGtpbmQsIG5hbWUsIG1zZykpLCBmaWxlPXN5cy5zdGRlcnIpCisKKworZGVmIGZpbmR0ZXN0ZGlyKHBhdGg9Tm9uZSk6CisgICAgcmV0dXJuIHBhdGggb3Igb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpIG9yIG9zLmN1cmRpcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3QvcnVudGVzdF9tcC5weSBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3RfbXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTYwNGMxNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3J1bnRlc3RfbXAucHkKQEAgLTAsMCArMSwyNDUgQEAKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBxdWV1ZQoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB0eXBlcworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHByaW50KCJNdWx0aXByb2Nlc3Mgb3B0aW9uIHJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IikKKyAgICBzeXMuZXhpdCgyKQorCitmcm9tIHRlc3QubGlicmVncnRlc3QucnVudGVzdCBpbXBvcnQgKAorICAgIHJ1bnRlc3QsIElOVEVSUlVQVEVELCBDSElMRF9FUlJPUiwgUFJPR1JFU1NfTUlOX1RJTUUsCisgICAgZm9ybWF0X3Rlc3RfcmVzdWx0KQorZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnNldHVwIGltcG9ydCBzZXR1cF90ZXN0cworCisKKyMgRGlzcGxheSB0aGUgcnVubmluZyB0ZXN0cyBpZiBub3RoaW5nIGhhcHBlbmVkIGxhc3QgTiBzZWNvbmRzCitQUk9HUkVTU19VUERBVEUgPSAzMC4wICAgIyBzZWNvbmRzCisKKyMgSWYgaW50ZXJydXB0ZWQsIGRpc3BsYXkgdGhlIHdhaXQgcHJvZ3Jlc3MgZXZlcnkgTiBzZWNvbmRzCitXQUlUX1BST0dSRVNTID0gMi4wICAgIyBzZWNvbmRzCisKKworZGVmIHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdG5hbWUsIG5zKToKKyAgICAiIiJSdW4gdGhlIGdpdmVuIHRlc3QgaW4gYSBzdWJwcm9jZXNzIHdpdGggLS1zbGF2ZWFyZ3MuCisKKyAgICBucyBpcyB0aGUgb3B0aW9uIE5hbWVzcGFjZSBwYXJzZWQgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiByZWdydGVzdAorICAgIGlzIGludm9rZWQgaW4gYSBzdWJwcm9jZXNzIHdpdGggdGhlIC0tc2xhdmVhcmdzIGFyZ3VtZW50OyB3aGVuIHRoZQorICAgIHN1YnByb2Nlc3MgZXhpdHMsIGl0cyByZXR1cm4gY29kZSwgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJldHVybmVkIGFzIGEKKyAgICAzLXR1cGxlLgorICAgICIiIgorICAgIGZyb20gc3VicHJvY2VzcyBpbXBvcnQgUG9wZW4sIFBJUEUKKworICAgIG5zX2RpY3QgPSB2YXJzKG5zKQorICAgIHNsYXZlYXJncyA9IChuc19kaWN0LCB0ZXN0bmFtZSkKKyAgICBzbGF2ZWFyZ3MgPSBqc29uLmR1bXBzKHNsYXZlYXJncykKKworICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgKnN1cHBvcnQuYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCksCisgICAgICAgICAgICctWCcsICdmYXVsdGhhbmRsZXInLAorICAgICAgICAgICAnLW0nLCAndGVzdC5yZWdydGVzdCcsCisgICAgICAgICAgICctLXNsYXZlYXJncycsIHNsYXZlYXJnc10KKyAgICBpZiBucy5wZ286CisgICAgICAgIGNtZCArPSBbJy0tcGdvJ10KKworICAgICMgUnVubmluZyB0aGUgY2hpbGQgZnJvbSB0aGUgc2FtZSB3b3JraW5nIGRpcmVjdG9yeSBhcyByZWdydGVzdCdzIG9yaWdpbmFsCisgICAgIyBpbnZvY2F0aW9uIGVuc3VyZXMgdGhhdCBURU1QRElSIGZvciB0aGUgY2hpbGQgaXMgdGhlIHNhbWUgd2hlbgorICAgICMgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpIGlzIHRydWUuIFNlZSBpc3N1ZSAxNTMwMC4KKyAgICBwb3BlbiA9IFBvcGVuKGNtZCwKKyAgICAgICAgICAgICAgICAgIHN0ZG91dD1QSVBFLCBzdGRlcnI9UElQRSwKKyAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzPShvcy5uYW1lICE9ICdudCcpLAorICAgICAgICAgICAgICAgICAgY3dkPXN1cHBvcnQuU0FWRURDV0QpCisgICAgd2l0aCBwb3BlbjoKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwb3Blbi5jb21tdW5pY2F0ZSgpCisgICAgICAgIHJldGNvZGUgPSBwb3Blbi53YWl0KCkKKyAgICByZXR1cm4gcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIKKworCitkZWYgcnVuX3Rlc3RzX3NsYXZlKHNsYXZlYXJncyk6CisgICAgbnNfZGljdCwgdGVzdG5hbWUgPSBqc29uLmxvYWRzKHNsYXZlYXJncykKKyAgICBucyA9IHR5cGVzLlNpbXBsZU5hbWVzcGFjZSgqKm5zX2RpY3QpCisKKyAgICBzZXR1cF90ZXN0cyhucykKKworICAgIHRyeToKKyAgICAgICAgcmVzdWx0ID0gcnVudGVzdChucywgdGVzdG5hbWUpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByZXN1bHQgPSBJTlRFUlJVUFRFRCwgJycKKyAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgcmVzdWx0ID0gQ0hJTERfRVJST1IsIHN0cihlKQorCisgICAgcHJpbnQoKSAgICMgRm9yY2UgYSBuZXdsaW5lIChqdXN0IGluIGNhc2UpCisgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQpLCBmbHVzaD1UcnVlKQorICAgIHN5cy5leGl0KDApCisKKworIyBXZSBkbyBub3QgdXNlIGEgZ2VuZXJhdG9yIHNvIG11bHRpcGxlIHRocmVhZHMgY2FuIGNhbGwgbmV4dCgpLgorY2xhc3MgTXVsdGlwcm9jZXNzSXRlcmF0b3I6CisKKyAgICAiIiJBIHRocmVhZC1zYWZlIGl0ZXJhdG9yIG92ZXIgdGVzdHMgZm9yIG11bHRpcHJvY2VzcyBtb2RlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RzKToKKyAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCisgICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5sb2NrOgorICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCd0ZXN0cyBpbnRlcnJ1cHRlZCcpCisgICAgICAgICAgICByZXR1cm4gbmV4dChzZWxmLnRlc3RzKQorCisKK2NsYXNzIE11bHRpcHJvY2Vzc1RocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGVuZGluZywgb3V0cHV0LCBucyk6CisgICAgICAgIHN1cGVyKCkuX19pbml0X18oKQorICAgICAgICBzZWxmLnBlbmRpbmcgPSBwZW5kaW5nCisgICAgICAgIHNlbGYub3V0cHV0ID0gb3V0cHV0CisgICAgICAgIHNlbGYubnMgPSBucworICAgICAgICBzZWxmLmN1cnJlbnRfdGVzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQorCisgICAgZGVmIF9ydW50ZXN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0ID0gbmV4dChzZWxmLnBlbmRpbmcpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zdGFydF90aW1lID0gdGltZS5tb25vdG9uaWMoKQorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSB0ZXN0CisKKyAgICAgICAgICAgIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyID0gcnVuX3Rlc3RfaW5fc3VicHJvY2Vzcyh0ZXN0LCBzZWxmLm5zKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X3Rlc3QgPSBOb25lCisKKyAgICAgICAgc3Rkb3V0LCBfLCByZXN1bHQgPSBzdGRvdXQuc3RyaXAoKS5ycGFydGl0aW9uKCJcbiIpCisgICAgICAgIGlmIHJldGNvZGUgIT0gMDoKKyAgICAgICAgICAgIHJlc3VsdCA9IChDSElMRF9FUlJPUiwgIkV4aXQgY29kZSAlcyIgJSByZXRjb2RlKQorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZHMocmVzdWx0KQorICAgICAgICBzZWxmLm91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3RvcCA9IEZhbHNlCisgICAgICAgICAgICB3aGlsZSBub3Qgc3RvcDoKKyAgICAgICAgICAgICAgICBzdG9wID0gc2VsZi5fcnVudGVzdCgpCisgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHJhaXNlCisKKworZGVmIHJ1bl90ZXN0c19tdWx0aXByb2Nlc3MocmVncnRlc3QpOgorICAgIG91dHB1dCA9IHF1ZXVlLlF1ZXVlKCkKKyAgICBwZW5kaW5nID0gTXVsdGlwcm9jZXNzSXRlcmF0b3IocmVncnRlc3QudGVzdHMpCisgICAgdGVzdF90aW1lb3V0ID0gcmVncnRlc3QubnMudGltZW91dAorICAgIHVzZV90aW1lb3V0ID0gKHRlc3RfdGltZW91dCBpcyBub3QgTm9uZSkKKworICAgIHdvcmtlcnMgPSBbTXVsdGlwcm9jZXNzVGhyZWFkKHBlbmRpbmcsIG91dHB1dCwgcmVncnRlc3QubnMpCisgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShyZWdydGVzdC5ucy51c2VfbXApXQorICAgIHByaW50KCJSdW4gdGVzdHMgaW4gcGFyYWxsZWwgdXNpbmcgJXMgY2hpbGQgcHJvY2Vzc2VzIgorICAgICAgICAgICUgbGVuKHdvcmtlcnMpKQorICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgd29ya2VyLnN0YXJ0KCkKKworICAgIGRlZiBnZXRfcnVubmluZyh3b3JrZXJzKToKKyAgICAgICAgcnVubmluZyA9IFtdCisgICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgICAgIGN1cnJlbnRfdGVzdCA9IHdvcmtlci5jdXJyZW50X3Rlc3QKKyAgICAgICAgICAgIGlmIG5vdCBjdXJyZW50X3Rlc3Q6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGR0ID0gdGltZS5tb25vdG9uaWMoKSAtIHdvcmtlci5zdGFydF90aW1lCisgICAgICAgICAgICBpZiBkdCA+PSBQUk9HUkVTU19NSU5fVElNRToKKyAgICAgICAgICAgICAgICBydW5uaW5nLmFwcGVuZCgnJXMgKCUuMGYgc2VjKScgJSAoY3VycmVudF90ZXN0LCBkdCkpCisgICAgICAgIHJldHVybiBydW5uaW5nCisKKyAgICBmaW5pc2hlZCA9IDAKKyAgICB0ZXN0X2luZGV4ID0gMQorICAgIGdldF90aW1lb3V0ID0gbWF4KFBST0dSRVNTX1VQREFURSwgUFJPR1JFU1NfTUlOX1RJTUUpCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBmaW5pc2hlZCA8IHJlZ3J0ZXN0Lm5zLnVzZV9tcDoKKyAgICAgICAgICAgIGlmIHVzZV90aW1lb3V0OgorICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlci5kdW1wX3RyYWNlYmFja19sYXRlcih0ZXN0X3RpbWVvdXQsIGV4aXQ9VHJ1ZSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGl0ZW0gPSBvdXRwdXQuZ2V0KHRpbWVvdXQ9Z2V0X3RpbWVvdXQpCisgICAgICAgICAgICBleGNlcHQgcXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgcnVubmluZyA9IGdldF9ydW5uaW5nKHdvcmtlcnMpCisgICAgICAgICAgICAgICAgaWYgcnVubmluZyBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ3J1bm5pbmc6ICVzJyAlICcsICcuam9pbihydW5uaW5nKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB0ZXN0LCBzdGRvdXQsIHN0ZGVyciwgcmVzdWx0ID0gaXRlbQorICAgICAgICAgICAgaWYgdGVzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGZpbmlzaGVkICs9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcmVncnRlc3QuYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQorCisgICAgICAgICAgICAjIERpc3BsYXkgcHJvZ3Jlc3MKKyAgICAgICAgICAgIG9rLCB0ZXN0X3RpbWUgPSByZXN1bHQKKyAgICAgICAgICAgIHRleHQgPSBmb3JtYXRfdGVzdF9yZXN1bHQodGVzdCwgb2spCisgICAgICAgICAgICBpZiAob2sgbm90IGluIChDSElMRF9FUlJPUiwgSU5URVJSVVBURUQpCisgICAgICAgICAgICAgICAgYW5kIHRlc3RfdGltZSA+PSBQUk9HUkVTU19NSU5fVElNRQorICAgICAgICAgICAgICAgIGFuZCBub3QgcmVncnRlc3QubnMucGdvKToKKyAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgKCUuMGYgc2VjKScgJSB0ZXN0X3RpbWUKKyAgICAgICAgICAgIHJ1bm5pbmcgPSBnZXRfcnVubmluZyh3b3JrZXJzKQorICAgICAgICAgICAgaWYgcnVubmluZyBhbmQgbm90IHJlZ3J0ZXN0Lm5zLnBnbzoKKyAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgLS0gcnVubmluZzogJXMnICUgJywgJy5qb2luKHJ1bm5pbmcpCisgICAgICAgICAgICByZWdydGVzdC5kaXNwbGF5X3Byb2dyZXNzKHRlc3RfaW5kZXgsIHRleHQpCisKKyAgICAgICAgICAgICMgQ29weSBzdGRvdXQgYW5kIHN0ZGVyciBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzCisgICAgICAgICAgICBpZiBzdGRvdXQ6CisgICAgICAgICAgICAgICAgcHJpbnQoc3Rkb3V0LCBmbHVzaD1UcnVlKQorICAgICAgICAgICAgaWYgc3RkZXJyIGFuZCBub3QgcmVncnRlc3QubnMucGdvOgorICAgICAgICAgICAgICAgIHByaW50KHN0ZGVyciwgZmlsZT1zeXMuc3RkZXJyLCBmbHVzaD1UcnVlKQorCisgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gSU5URVJSVVBURUQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBDSElMRF9FUlJPUjoKKyAgICAgICAgICAgICAgICBtc2cgPSAiQ2hpbGQgZXJyb3Igb24ge306IHt9Ii5mb3JtYXQodGVzdCwgcmVzdWx0WzFdKQorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihtc2cpCisgICAgICAgICAgICB0ZXN0X2luZGV4ICs9IDEKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHJlZ3J0ZXN0LmludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICBwZW5kaW5nLmludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICBwcmludCgpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdXNlX3RpbWVvdXQ6CisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKKworICAgICMgSWYgdGVzdHMgYXJlIGludGVycnVwdGVkLCB3YWl0IHVudGlsIHRlc3RzIGNvbXBsZXRlCisgICAgd2FpdF9zdGFydCA9IHRpbWUubW9ub3RvbmljKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBydW5uaW5nID0gW3dvcmtlci5jdXJyZW50X3Rlc3QgZm9yIHdvcmtlciBpbiB3b3JrZXJzXQorICAgICAgICBydW5uaW5nID0gbGlzdChmaWx0ZXIoYm9vbCwgcnVubmluZykpCisgICAgICAgIGlmIG5vdCBydW5uaW5nOgorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBkdCA9IHRpbWUubW9ub3RvbmljKCkgLSB3YWl0X3N0YXJ0CisgICAgICAgIGxpbmUgPSAiV2FpdGluZyBmb3IgJXMgKCVzIHRlc3RzKSIgJSAoJywgJy5qb2luKHJ1bm5pbmcpLCBsZW4ocnVubmluZykpCisgICAgICAgIGlmIGR0ID49IFdBSVRfUFJPR1JFU1M6CisgICAgICAgICAgICBsaW5lID0gIiVzIHNpbmNlICUuMGYgc2VjIiAlIChsaW5lLCBkdCkKKyAgICAgICAgcHJpbnQobGluZSkKKyAgICAgICAgZm9yIHdvcmtlciBpbiB3b3JrZXJzOgorICAgICAgICAgICAgd29ya2VyLmpvaW4oV0FJVF9QUk9HUkVTUykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5IGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2F2ZV9lbnYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiOWUxOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2xpYnJlZ3J0ZXN0L3NhdmVfZW52LnB5CkBAIC0wLDAgKzEsMjg2IEBACitpbXBvcnQgYnVpbHRpbnMKK2ltcG9ydCBsb2NhbGUKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzeXMKK2ltcG9ydCBzeXNjb25maWcKK2ltcG9ydCB3YXJuaW5ncworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKK3RyeToKKyAgICBpbXBvcnQgX211bHRpcHJvY2Vzc2luZywgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBtdWx0aXByb2Nlc3NpbmcgPSBOb25lCisKKworIyBVbml0IHRlc3RzIGFyZSBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IHVuY2hhbmdlZAorIyBvbmNlIHRoZXkgY29tcGxldGUuICBCdXQgc29tZXRpbWVzIHRlc3RzIGhhdmUgYnVncywgZXNwZWNpYWxseSB3aGVuCisjIHRlc3RzIGZhaWwsIGFuZCB0aGUgY2hhbmdlcyB0byBlbnZpcm9ubWVudCBnbyBvbiB0byBtZXNzIHVwIG90aGVyCisjIHRlc3RzLiAgVGhpcyBjYW4gY2F1c2UgaXNzdWVzIHdpdGggYnVpbGRib3Qgc3RhYmlsaXR5LCBzaW5jZSB0ZXN0cworIyBhcmUgcnVuIGluIHJhbmRvbSBvcmRlciBhbmQgc28gcHJvYmxlbXMgbWF5IGFwcGVhciB0byBjb21lIGFuZCBnby4KKyMgVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB3ZSBjYW4gc2F2ZSBhbmQgcmVzdG9yZSB0byBtaXRpZ2F0ZSB0aGlzLCBhbmQKKyMgdGhlIGZvbGxvd2luZyBjb250ZXh0IG1hbmFnZXIgaGFuZGxlcyB0aGlzIHRhc2suCisKK2NsYXNzIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQ6CisgICAgIiIiU2F2ZSBiaXRzIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCByZXN0b3JlIHRoZW0gYXQgYmxvY2sgZXhpdC4KKworICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdG5hbWUsIHZlcmJvc2UsIHF1aWV0KToKKyAgICAgICAgICAgICNzdHVmZgorCisgICAgVW5sZXNzIHF1aWV0IGlzIFRydWUsIGEgd2FybmluZyBpcyBwcmludGVkIHRvIHN0ZGVyciBpZiBhbnkgb2YKKyAgICB0aGUgc2F2ZWQgaXRlbXMgd2FzIGNoYW5nZWQgYnkgdGhlIHRlc3QuICBUaGUgYXR0cmlidXRlICdjaGFuZ2VkJworICAgIGlzIGluaXRpYWxseSBGYWxzZSwgYnV0IGlzIHNldCB0byBUcnVlIGlmIGEgY2hhbmdlIGlzIGRldGVjdGVkLgorCisgICAgSWYgdmVyYm9zZSBpcyBtb3JlIHRoYW4gMSwgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgc3RhdGUgb2YgY2hhbmdlZAorICAgIGl0ZW1zIGlzIGFsc28gcHJpbnRlZC4KKyAgICAiIiIKKworICAgIGNoYW5nZWQgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RuYW1lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLCAqLCBwZ289RmFsc2UpOgorICAgICAgICBzZWxmLnRlc3RuYW1lID0gdGVzdG5hbWUKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLnF1aWV0ID0gcXVpZXQKKyAgICAgICAgc2VsZi5wZ28gPSBwZ28KKworICAgICMgVG8gYWRkIHRoaW5ncyB0byBzYXZlIGFuZCByZXN0b3JlLCBhZGQgYSBuYW1lIFhYWCB0byB0aGUgcmVzb3VyY2VzIGxpc3QKKyAgICAjIGFuZCBhZGQgY29ycmVzcG9uZGluZyBnZXRfWFhYL3Jlc3RvcmVfWFhYIGZ1bmN0aW9ucy4gIGdldF9YWFggc2hvdWxkCisgICAgIyByZXR1cm4gdGhlIHZhbHVlIHRvIGJlIHNhdmVkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IGEgc2Vjb25kIGNhbGwgdG8gdGhlCisgICAgIyBnZXQgZnVuY3Rpb24gd2hlbiB0ZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZXMuICByZXN0b3JlX1hYWCBzaG91bGQgYWNjZXB0CisgICAgIyB0aGUgc2F2ZWQgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHJlc291cmNlIHVzaW5nIGl0LiAgSXQgd2lsbCBiZSBjYWxsZWQgaWYKKyAgICAjIGFuZCBvbmx5IGlmIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBpcyBkZXRlY3RlZC4KKyAgICAjCisgICAgIyBOb3RlOiBYWFggd2lsbCBoYXZlIGFueSAnLicgcmVwbGFjZWQgd2l0aCAnXycgY2hhcmFjdGVycyB3aGVuIGRldGVybWluaW5nCisgICAgIyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgbmFtZXMuCisKKyAgICByZXNvdXJjZXMgPSAoJ3N5cy5hcmd2JywgJ2N3ZCcsICdzeXMuc3RkaW4nLCAnc3lzLnN0ZG91dCcsICdzeXMuc3RkZXJyJywKKyAgICAgICAgICAgICAgICAgJ29zLmVudmlyb24nLCAnc3lzLnBhdGgnLCAnc3lzLnBhdGhfaG9va3MnLCAnX19pbXBvcnRfXycsCisgICAgICAgICAgICAgICAgICd3YXJuaW5ncy5maWx0ZXJzJywgJ2FzeW5jb3JlLnNvY2tldF9tYXAnLAorICAgICAgICAgICAgICAgICAnbG9nZ2luZy5faGFuZGxlcnMnLCAnbG9nZ2luZy5faGFuZGxlckxpc3QnLCAnc3lzLmdldHRyYWNlJywKKyAgICAgICAgICAgICAgICAgJ3N5cy53YXJub3B0aW9ucycsCisgICAgICAgICAgICAgICAgICMgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2NsZWFudXAoKSBtYXkgcmVsZWFzZSByZWYKKyAgICAgICAgICAgICAgICAgIyB0byBhIHRocmVhZCwgc28gY2hlY2sgcHJvY2Vzc2VzIGZpcnN0LgorICAgICAgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nJywgJ3RocmVhZGluZy5fZGFuZ2xpbmcnLAorICAgICAgICAgICAgICAgICAnc3lzY29uZmlnLl9DT05GSUdfVkFSUycsICdzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUycsCisgICAgICAgICAgICAgICAgICdmaWxlcycsICdsb2NhbGUnLCAnd2FybmluZ3Muc2hvd3dhcm5pbmcnLAorICAgICAgICAgICAgICAgICAnc2h1dGlsX2FyY2hpdmVfZm9ybWF0cycsICdzaHV0aWxfdW5wYWNrX2Zvcm1hdHMnLAorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBnZXRfc3lzX2FyZ3Yoc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMuYXJndiksIHN5cy5hcmd2LCBzeXMuYXJndls6XQorICAgIGRlZiByZXN0b3JlX3N5c19hcmd2KHNlbGYsIHNhdmVkX2FyZ3YpOgorICAgICAgICBzeXMuYXJndiA9IHNhdmVkX2FyZ3ZbMV0KKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZF9hcmd2WzJdCisKKyAgICBkZWYgZ2V0X2N3ZChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLmdldGN3ZCgpCisgICAgZGVmIHJlc3RvcmVfY3dkKHNlbGYsIHNhdmVkX2N3ZCk6CisgICAgICAgIG9zLmNoZGlyKHNhdmVkX2N3ZCkKKworICAgIGRlZiBnZXRfc3lzX3N0ZG91dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3Rkb3V0KHNlbGYsIHNhdmVkX3N0ZG91dCk6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlZF9zdGRvdXQKKworICAgIGRlZiBnZXRfc3lzX3N0ZGVycihzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRlcnIKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3RkZXJyKHNlbGYsIHNhdmVkX3N0ZGVycik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBzYXZlZF9zdGRlcnIKKworICAgIGRlZiBnZXRfc3lzX3N0ZGluKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGluCisgICAgZGVmIHJlc3RvcmVfc3lzX3N0ZGluKHNlbGYsIHNhdmVkX3N0ZGluKToKKyAgICAgICAgc3lzLnN0ZGluID0gc2F2ZWRfc3RkaW4KKworICAgIGRlZiBnZXRfb3NfZW52aXJvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKG9zLmVudmlyb24pLCBvcy5lbnZpcm9uLCBkaWN0KG9zLmVudmlyb24pCisgICAgZGVmIHJlc3RvcmVfb3NfZW52aXJvbihzZWxmLCBzYXZlZF9lbnZpcm9uKToKKyAgICAgICAgb3MuZW52aXJvbiA9IHNhdmVkX2Vudmlyb25bMV0KKyAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNhdmVkX2Vudmlyb25bMl0pCisKKyAgICBkZWYgZ2V0X3N5c19wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGgpLCBzeXMucGF0aCwgc3lzLnBhdGhbOl0KKyAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aChzZWxmLCBzYXZlZF9wYXRoKToKKyAgICAgICAgc3lzLnBhdGggPSBzYXZlZF9wYXRoWzFdCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRfcGF0aFsyXQorCisgICAgZGVmIGdldF9zeXNfcGF0aF9ob29rcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy5wYXRoX2hvb2tzKSwgc3lzLnBhdGhfaG9va3MsIHN5cy5wYXRoX2hvb2tzWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3BhdGhfaG9va3Moc2VsZiwgc2F2ZWRfaG9va3MpOgorICAgICAgICBzeXMucGF0aF9ob29rcyA9IHNhdmVkX2hvb2tzWzFdCisgICAgICAgIHN5cy5wYXRoX2hvb2tzWzpdID0gc2F2ZWRfaG9va3NbMl0KKworICAgIGRlZiBnZXRfc3lzX2dldHRyYWNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLmdldHRyYWNlKCkKKyAgICBkZWYgcmVzdG9yZV9zeXNfZ2V0dHJhY2Uoc2VsZiwgdHJhY2VfZnhuKToKKyAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlX2Z4bikKKworICAgIGRlZiBnZXRfX19pbXBvcnRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGJ1aWx0aW5zLl9faW1wb3J0X18KKyAgICBkZWYgcmVzdG9yZV9fX2ltcG9ydF9fKHNlbGYsIGltcG9ydF8pOgorICAgICAgICBidWlsdGlucy5fX2ltcG9ydF9fID0gaW1wb3J0XworCisgICAgZGVmIGdldF93YXJuaW5nc19maWx0ZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQod2FybmluZ3MuZmlsdGVycyksIHdhcm5pbmdzLmZpbHRlcnMsIHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19maWx0ZXJzKHNlbGYsIHNhdmVkX2ZpbHRlcnMpOgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJzID0gc2F2ZWRfZmlsdGVyc1sxXQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gc2F2ZWRfZmlsdGVyc1syXQorCisgICAgZGVmIGdldF9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYpOgorICAgICAgICBhc3luY29yZSA9IHN5cy5tb2R1bGVzLmdldCgnYXN5bmNvcmUnKQorICAgICAgICAjIFhYWCBNYWtpbmcgYSBjb3B5IGtlZXBzIG9iamVjdHMgYWxpdmUgdW50aWwgX19leGl0X18gZ2V0cyBjYWxsZWQuCisgICAgICAgIHJldHVybiBhc3luY29yZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcC5jb3B5KCkgb3Ige30KKyAgICBkZWYgcmVzdG9yZV9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYsIHNhdmVkX21hcCk6CisgICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCisgICAgICAgIGlmIGFzeW5jb3JlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKKyAgICAgICAgICAgIGFzeW5jb3JlLnNvY2tldF9tYXAudXBkYXRlKHNhdmVkX21hcCkKKworICAgIGRlZiBnZXRfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmKToKKyAgICAgICAgIyB3ZSBjb3VsZCBjYWxsIGdldF9hcmNoaXZlc19mb3JtYXRzKCkgYnV0IHRoYXQgb25seSByZXR1cm5zIHRoZQorICAgICAgICAjIHJlZ2lzdHJ5IGtleXM7IHdlIHdhbnQgdG8gY2hlY2sgdGhlIHZhbHVlcyB0b28gKHRoZSBmdW5jdGlvbnMgdGhhdAorICAgICAgICAjIGFyZSByZWdpc3RlcmVkKQorICAgICAgICByZXR1cm4gc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMsIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3NodXRpbF9hcmNoaXZlX2Zvcm1hdHMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUyA9IHNhdmVkWzBdCisgICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNsZWFyKCkKKyAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMudXBkYXRlKHNhdmVkWzFdKQorCisgICAgZGVmIGdldF9zaHV0aWxfdW5wYWNrX2Zvcm1hdHMoc2VsZik6CisgICAgICAgIHJldHVybiBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLCBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmLCBzYXZlZCk6CisgICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMgPSBzYXZlZFswXQorICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNsZWFyKCkKKyAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCisKKyAgICBkZWYgZ2V0X2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYpOgorICAgICAgICAjIF9oYW5kbGVycyBpcyBhIFdlYWtWYWx1ZURpY3Rpb25hcnkKKyAgICAgICAgcmV0dXJuIGlkKGxvZ2dpbmcuX2hhbmRsZXJzKSwgbG9nZ2luZy5faGFuZGxlcnMsIGxvZ2dpbmcuX2hhbmRsZXJzLmNvcHkoKQorICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYsIHNhdmVkX2hhbmRsZXJzKToKKyAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCisgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlckxpc3Qoc2VsZik6CisgICAgICAgICMgX2hhbmRsZXJMaXN0IGlzIGEgbGlzdCBvZiB3ZWFrcmVmcyB0byBoYW5kbGVycworICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlckxpc3QpLCBsb2dnaW5nLl9oYW5kbGVyTGlzdCwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KKyAgICBkZWYgcmVzdG9yZV9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmLCBzYXZlZF9oYW5kbGVyTGlzdCk6CisgICAgICAgICMgQ2FuJ3QgZWFzaWx5IHJldmVydCB0aGUgbG9nZ2luZyBzdGF0ZQorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0X3N5c193YXJub3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy53YXJub3B0aW9ucyksIHN5cy53YXJub3B0aW9ucywgc3lzLndhcm5vcHRpb25zWzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX3dhcm5vcHRpb25zKHNlbGYsIHNhdmVkX29wdGlvbnMpOgorICAgICAgICBzeXMud2Fybm9wdGlvbnMgPSBzYXZlZF9vcHRpb25zWzFdCisgICAgICAgIHN5cy53YXJub3B0aW9uc1s6XSA9IHNhdmVkX29wdGlvbnNbMl0KKworICAgICMgQ29udHJvbGxpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byBUaHJlYWQgb2JqZWN0cyBjYW4gbWFrZSBpdCBlYXNpZXIKKyAgICAjIHRvIHRyYWNrIHJlZmVyZW5jZSBsZWFrcy4KKyAgICBkZWYgZ2V0X3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZik6CisgICAgICAgIGlmIG5vdCB0aHJlYWRpbmc6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIFRoaXMgY29waWVzIHRoZSB3ZWFrcmVmcyB3aXRob3V0IG1ha2luZyBhbnkgc3Ryb25nIHJlZmVyZW5jZQorICAgICAgICByZXR1cm4gdGhyZWFkaW5nLl9kYW5nbGluZy5jb3B5KCkKKyAgICBkZWYgcmVzdG9yZV90aHJlYWRpbmdfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKKyAgICAgICAgaWYgbm90IHRocmVhZGluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLmNsZWFyKCkKKyAgICAgICAgdGhyZWFkaW5nLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCisKKyAgICAjIFNhbWUgZm9yIFByb2Nlc3Mgb2JqZWN0cworICAgIGRlZiBnZXRfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYpOgorICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBVbmpvaW5lZCBwcm9jZXNzIG9iamVjdHMgY2FuIHN1cnZpdmUgYWZ0ZXIgcHJvY2VzcyBleGl0cworICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpCisgICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCisgICAgICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY29weSgpCisgICAgZGVmIHJlc3RvcmVfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKKyAgICAgICAgaWYgbm90IG11bHRpcHJvY2Vzc2luZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY2xlYXIoKQorICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcudXBkYXRlKHNhdmVkKQorCisgICAgZGVmIGdldF9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZGljdCBpcyBpbml0aWFsaXplZAorICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3ByZWZpeCcpCisgICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9DT05GSUdfVkFSUyksIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMsCisgICAgICAgICAgICAgICAgZGljdChzeXNjb25maWcuX0NPTkZJR19WQVJTKSkKKyAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYsIHNhdmVkKToKKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUyA9IHNhdmVkWzFdCisgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMuY2xlYXIoKQorICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTLnVwZGF0ZShzYXZlZFsyXSkKKworICAgIGRlZiBnZXRfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZik6CisgICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMpLCBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUywKKyAgICAgICAgICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy5jb3B5KCkpCisgICAgZGVmIHJlc3RvcmVfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZiwgc2F2ZWQpOgorICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyA9IHNhdmVkWzFdCisgICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNsZWFyKCkKKyAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMudXBkYXRlKHNhdmVkWzJdKQorCisgICAgZGVmIGdldF9maWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNvcnRlZChmbiArICgnLycgaWYgb3MucGF0aC5pc2RpcihmbikgZWxzZSAnJykKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcigpKQorICAgIGRlZiByZXN0b3JlX2ZpbGVzKHNlbGYsIHNhdmVkX3ZhbHVlKToKKyAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBpZiBmbiBub3QgaW4gc2F2ZWRfdmFsdWUgYW5kIChmbiArICcvJykgbm90IGluIHNhdmVkX3ZhbHVlOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKGZuKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZuKToKKyAgICAgICAgICAgICAgICBzdXBwb3J0LnJtdHJlZShmbikKKworICAgIF9sYyA9IFtnZXRhdHRyKGxvY2FsZSwgbGMpIGZvciBsYyBpbiBkaXIobG9jYWxlKQorICAgICAgICAgICBpZiBsYy5zdGFydHN3aXRoKCdMQ18nKV0KKyAgICBkZWYgZ2V0X2xvY2FsZShzZWxmKToKKyAgICAgICAgcGFpcmluZ3MgPSBbXQorICAgICAgICBmb3IgbGMgaW4gc2VsZi5fbGM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFpcmluZ3MuYXBwZW5kKChsYywgbG9jYWxlLnNldGxvY2FsZShsYywgTm9uZSkpKQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHJldHVybiBwYWlyaW5ncworICAgIGRlZiByZXN0b3JlX2xvY2FsZShzZWxmLCBzYXZlZCk6CisgICAgICAgIGZvciBsYywgc2V0dGluZyBpbiBzYXZlZDoKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobGMsIHNldHRpbmcpCisKKyAgICBkZWYgZ2V0X3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gd2FybmluZ3Muc2hvd3dhcm5pbmcKKyAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19zaG93d2FybmluZyhzZWxmLCBmeG4pOgorICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IGZ4bgorCisgICAgZGVmIHJlc291cmNlX2luZm8oc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYucmVzb3VyY2VzOgorICAgICAgICAgICAgbWV0aG9kX3N1ZmZpeCA9IG5hbWUucmVwbGFjZSgnLicsICdfJykKKyAgICAgICAgICAgIGdldF9uYW1lID0gJ2dldF8nICsgbWV0aG9kX3N1ZmZpeAorICAgICAgICAgICAgcmVzdG9yZV9uYW1lID0gJ3Jlc3RvcmVfJyArIG1ldGhvZF9zdWZmaXgKKyAgICAgICAgICAgIHlpZWxkIG5hbWUsIGdldGF0dHIoc2VsZiwgZ2V0X25hbWUpLCBnZXRhdHRyKHNlbGYsIHJlc3RvcmVfbmFtZSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZWRfdmFsdWVzID0gZGljdCgobmFtZSwgZ2V0KCkpIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYucmVzb3VyY2VfaW5mbygpKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgorICAgICAgICBzYXZlZF92YWx1ZXMgPSBzZWxmLnNhdmVkX3ZhbHVlcworICAgICAgICBkZWwgc2VsZi5zYXZlZF92YWx1ZXMKKyAgICAgICAgZm9yIG5hbWUsIGdldCwgcmVzdG9yZSBpbiBzZWxmLnJlc291cmNlX2luZm8oKToKKyAgICAgICAgICAgIGN1cnJlbnQgPSBnZXQoKQorICAgICAgICAgICAgb3JpZ2luYWwgPSBzYXZlZF92YWx1ZXMucG9wKG5hbWUpCisgICAgICAgICAgICAjIENoZWNrIGZvciBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSdzIHZhbHVlCisgICAgICAgICAgICBpZiBjdXJyZW50ICE9IG9yaWdpbmFsOgorICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlZCA9IFRydWUKKyAgICAgICAgICAgICAgICByZXN0b3JlKG9yaWdpbmFsKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnF1aWV0IGFuZCBub3Qgc2VsZi5wZ286CisgICAgICAgICAgICAgICAgICAgIHByaW50KCJXYXJuaW5nIC0tIHt9IHdhcyBtb2RpZmllZCBieSB7fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNlbGYudGVzdG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KCIgIEJlZm9yZToge31cbiAgQWZ0ZXI6ICB7fSAiLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwsIGN1cnJlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkgYi9MaWIvdGVzdC9saWJyZWdydGVzdC9zZXR1cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI0NTMxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGlicmVncnRlc3Qvc2V0dXAucHkKQEAgLTAsMCArMSwxMjEgQEAKK2ltcG9ydCBhdGV4aXQKK2ltcG9ydCBmYXVsdGhhbmRsZXIKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgZ2MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnYyA9IE5vbmUKKworZnJvbSB0ZXN0LmxpYnJlZ3J0ZXN0LnJlZmxlYWsgaW1wb3J0IHdhcm1fY2FjaGVzCisKKworZGVmIHNldHVwX3Rlc3RzKG5zKToKKyAgICAjIERpc3BsYXkgdGhlIFB5dGhvbiB0cmFjZWJhY2sgb24gZmF0YWwgZXJyb3JzIChlLmcuIHNlZ2ZhdWx0KQorICAgIGZhdWx0aGFuZGxlci5lbmFibGUoYWxsX3RocmVhZHM9VHJ1ZSkKKworICAgICMgRGlzcGxheSB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBTSUdBTFJNIG9yIFNJR1VTUjEgc2lnbmFsCisgICAgc2lnbmFscyA9IFtdCisgICAgaWYgaGFzYXR0cihzaWduYWwsICdTSUdBTFJNJyk6CisgICAgICAgIHNpZ25hbHMuYXBwZW5kKHNpZ25hbC5TSUdBTFJNKQorICAgIGlmIGhhc2F0dHIoc2lnbmFsLCAnU0lHVVNSMScpOgorICAgICAgICBzaWduYWxzLmFwcGVuZChzaWduYWwuU0lHVVNSMSkKKyAgICBmb3Igc2lnbnVtIGluIHNpZ25hbHM6CisgICAgICAgIGZhdWx0aGFuZGxlci5yZWdpc3RlcihzaWdudW0sIGNoYWluPVRydWUpCisKKyAgICByZXBsYWNlX3N0ZG91dCgpCisgICAgc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCisKKyAgICBpZiBucy50ZXN0ZGlyOgorICAgICAgICAjIFByZXBlbmQgdGVzdCBkaXJlY3RvcnkgdG8gc3lzLnBhdGgsIHNvIHJ1bnRlc3QoKSB3aWxsIGJlIGFibGUKKyAgICAgICAgIyB0byBsb2NhdGUgdGVzdHMKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguYWJzcGF0aChucy50ZXN0ZGlyKSkKKworICAgICMgU29tZSB0aW1lcyBfX3BhdGhfXyBhbmQgX19maWxlX18gYXJlIG5vdCBhYnNvbHV0ZSAoZS5nLiB3aGlsZSBydW5uaW5nIGZyb20KKyAgICAjIExpYi8pIGFuZCwgaWYgd2UgY2hhbmdlIHRoZSBDV0QgdG8gcnVuIHRoZSB0ZXN0cyBpbiBhIHRlbXBvcmFyeSBkaXIsIHNvbWUKKyAgICAjIGltcG9ydHMgbWlnaHQgZmFpbC4gIFRoaXMgYWZmZWN0cyBvbmx5IHRoZSBtb2R1bGVzIGltcG9ydGVkIGJlZm9yZSBvcy5jaGRpcigpLgorICAgICMgVGhlc2UgbW9kdWxlcyBhcmUgc2VhcmNoZWQgZmlyc3QgaW4gc3lzLnBhdGhbMF0gKHNvICcnIC0tIHRoZSBDV0QpIGFuZCBpZgorICAgICMgdGhleSBhcmUgZm91bmQgaW4gdGhlIENXRCB0aGVpciBfX2ZpbGVfXyBhbmQgX19wYXRoX18gd2lsbCBiZSByZWxhdGl2ZSAodGhpcworICAgICMgaGFwcGVucyBiZWZvcmUgdGhlIGNoZGlyKS4gIEFsbCB0aGUgbW9kdWxlcyBpbXBvcnRlZCBhZnRlciB0aGUgY2hkaXIsIGFyZQorICAgICMgbm90IGZvdW5kIGluIHRoZSBDV0QsIGFuZCBzaW5jZSB0aGUgb3RoZXIgcGF0aHMgaW4gc3lzLnBhdGhbMTpdIGFyZSBhYnNvbHV0ZQorICAgICMgKHNpdGUucHkgYWJzb2x1dGl6ZSB0aGVtKSwgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIGFic29sdXRlIHRvby4KKyAgICAjIFRoZXJlZm9yZSBpdCBpcyBuZWNlc3NhcnkgdG8gYWJzb2x1dGl6ZSBtYW51YWxseSB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIG9mCisgICAgIyB0aGUgcGFja2FnZXMgdG8gcHJldmVudCBsYXRlciBpbXBvcnRzIHRvIGZhaWwgd2hlbiB0aGUgQ1dEIGlzIGRpZmZlcmVudC4KKyAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CisgICAgICAgICAgICBmb3IgaW5kZXgsIHBhdGggaW4gZW51bWVyYXRlKG1vZHVsZS5fX3BhdGhfXyk6CisgICAgICAgICAgICAgICAgbW9kdWxlLl9fcGF0aF9fW2luZGV4XSA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6CisgICAgICAgICAgICBtb2R1bGUuX19maWxlX18gPSBvcy5wYXRoLmFic3BhdGgobW9kdWxlLl9fZmlsZV9fKQorCisgICAgIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAorICAgICMgZm9yIGRlZXBseSByZWN1cnNpdmUgcmVndWxhciBleHByZXNzaW9ucy4gIFdlIHNlZSB0aGlzIGFzIGNyYXNoZXMgaW4KKyAgICAjIHRoZSBQeXRob24gdGVzdCBzdWl0ZSB3aGVuIHJ1bm5pbmcgdGVzdF9yZS5weSBhbmQgdGVzdF9zcmUucHkuICBUaGUKKyAgICAjIGZpeCBpcyB0byBzZXQgdGhlIHN0YWNrIGxpbWl0IHRvIDIwNDguCisgICAgIyBUaGlzIGFwcHJvYWNoIG1heSBhbHNvIGJlIHVzZWZ1bCBmb3Igb3RoZXIgVW5peHkgcGxhdGZvcm1zIHRoYXQKKyAgICAjIHN1ZmZlciBmcm9tIHNtYWxsIGRlZmF1bHQgc3RhY2sgbGltaXRzLgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHJlc291cmNlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNvZnQsIGhhcmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLKQorICAgICAgICAgICAgbmV3c29mdCA9IG1pbihoYXJkLCBtYXgoc29mdCwgMTAyNCoyMDQ4KSkKKyAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfU1RBQ0ssIChuZXdzb2Z0LCBoYXJkKSkKKworICAgIGlmIG5zLmh1bnRybGVha3M6CisgICAgICAgIHVuaXR0ZXN0LkJhc2VUZXN0U3VpdGUuX2NsZWFudXAgPSBGYWxzZQorCisgICAgICAgICMgQXZvaWQgZmFsc2UgcG9zaXRpdmVzIGR1ZSB0byB2YXJpb3VzIGNhY2hlcworICAgICAgICAjIGZpbGxpbmcgc2xvd2x5IHdpdGggcmFuZG9tIGRhdGE6CisgICAgICAgIHdhcm1fY2FjaGVzKCkKKworICAgIGlmIG5zLm1lbWxpbWl0IGlzIG5vdCBOb25lOgorICAgICAgICBzdXBwb3J0LnNldF9tZW1saW1pdChucy5tZW1saW1pdCkKKworICAgIGlmIG5zLnRocmVzaG9sZCBpcyBub3QgTm9uZToKKyAgICAgICAgZ2Muc2V0X3RocmVzaG9sZChucy50aHJlc2hvbGQpCisKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBtc3ZjcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBtc3ZjcnQuU2V0RXJyb3JNb2RlKG1zdmNydC5TRU1fRkFJTENSSVRJQ0FMRVJST1JTfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9BTElHTk1FTlRGQVVMVEVYQ0VQVHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PR1BGQVVMVEVSUk9SQk9YfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zdmNydC5TRU1fTk9PUEVORklMRUVSUk9SQk9YKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIHJlbGVhc2UgYnVpbGQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBtIGluIFttc3ZjcnQuQ1JUX1dBUk4sIG1zdmNydC5DUlRfRVJST1IsIG1zdmNydC5DUlRfQVNTRVJUXToKKyAgICAgICAgICAgICAgICBpZiBucy52ZXJib3NlIGFuZCBucy52ZXJib3NlID49IDI6CisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIG1zdmNydC5DUlREQkdfTU9ERV9GSUxFKQorICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0RmlsZShtLCBtc3ZjcnQuQ1JUREJHX0ZJTEVfU1RERVJSKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCisKKyAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBucy51c2VfcmVzb3VyY2VzCisKKworZGVmIHJlcGxhY2Vfc3Rkb3V0KCk6CisgICAgIiIiU2V0IHN0ZG91dCBlbmNvZGVyIGVycm9yIGhhbmRsZXIgdG8gYmFja3NsYXNocmVwbGFjZSAoYXMgc3RkZXJyIGVycm9yCisgICAgaGFuZGxlcikgdG8gYXZvaWQgVW5pY29kZUVuY29kZUVycm9yIHdoZW4gcHJpbnRpbmcgYSB0cmFjZWJhY2siIiIKKyAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgc3lzLnN0ZG91dCA9IG9wZW4oc3Rkb3V0LmZpbGVubygpLCAndycsCisgICAgICAgIGVuY29kaW5nPXN0ZG91dC5lbmNvZGluZywKKyAgICAgICAgZXJyb3JzPSJiYWNrc2xhc2hyZXBsYWNlIiwKKyAgICAgICAgY2xvc2VmZD1GYWxzZSwKKyAgICAgICAgbmV3bGluZT0nXG4nKQorCisgICAgZGVmIHJlc3RvcmVfc3Rkb3V0KCk6CisgICAgICAgIHN5cy5zdGRvdXQuY2xvc2UoKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc3Rkb3V0CisgICAgYXRleGl0LnJlZ2lzdGVyKHJlc3RvcmVfc3Rkb3V0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvbG9ja190ZXN0cy5weSBiL0xpYi90ZXN0L2xvY2tfdGVzdHMucHkKaW5kZXggYTY0YWExOC4uYTZjYjNiMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvbG9ja190ZXN0cy5weQorKysgYi9MaWIvdGVzdC9sb2NrX3Rlc3RzLnB5CkBAIC03LDYgKzcsNyBAQAogZnJvbSBfdGhyZWFkIGltcG9ydCBzdGFydF9uZXdfdGhyZWFkLCBUSU1FT1VUX01BWAogaW1wb3J0IHRocmVhZGluZwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2Vha3JlZgogCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIApAQCAtMTk4LDYgKzE5OSwxNyBAQAogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdHNbMF0pCiAgICAgICAgIHNlbGYuYXNzZXJ0VGltZW91dChyZXN1bHRzWzFdLCAwLjUpCiAKKyAgICBkZWYgdGVzdF93ZWFrcmVmX2V4aXN0cyhzZWxmKToKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICByZWYgPSB3ZWFrcmVmLnJlZihsb2NrKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShyZWYoKSkKKworICAgIGRlZiB0ZXN0X3dlYWtyZWZfZGVsZXRlZChzZWxmKToKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICByZWYgPSB3ZWFrcmVmLnJlZihsb2NrKQorICAgICAgICBkZWwgbG9jaworICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZWYoKSkKKwogCiBjbGFzcyBMb2NrVGVzdHMoQmFzZUxvY2tUZXN0cyk6CiAgICAgIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9tYWtlX3NzbF9jZXJ0cy5weSBiL0xpYi90ZXN0L21ha2Vfc3NsX2NlcnRzLnB5CmluZGV4IDgxZDA0ZjguLmU0MzI2ZDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L21ha2Vfc3NsX2NlcnRzLnB5CisrKyBiL0xpYi90ZXN0L21ha2Vfc3NsX2NlcnRzLnB5CkBAIC0zLDcgKzMsNiBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCBzaHV0aWwKLWltcG9ydCBzeXMKIGltcG9ydCB0ZW1wZmlsZQogZnJvbSBzdWJwcm9jZXNzIGltcG9ydCAqCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weSBiL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQppbmRleCA3OTIyYjU0Li41YzgzMzYxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKKysrIGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CkBAIC0xMDAwLDcgKzEwMDAsNyBAQAogICAgICAgICAgICAgYicwJywgICAgICAgICAgICAgICAgICAgICAgICMgUE9QCiAgICAgICAgICAgICBiJzEnLCAgICAgICAgICAgICAgICAgICAgICAgIyBQT1BfTUFSSwogICAgICAgICAgICAgYicyJywgICAgICAgICAgICAgICAgICAgICAgICMgRFVQCi0gICAgICAgICAgICAjIGInKDInLCAgICAgICAgICAgICAgICAgICAgIyBQeVVucGlja2xlciBkb2Vzbid0IHJhaXNlCisgICAgICAgICAgICBiJygyJywKICAgICAgICAgICAgIGInUicsICAgICAgICAgICAgICAgICAgICAgICAjIFJFRFVDRQogICAgICAgICAgICAgYicpUicsCiAgICAgICAgICAgICBiJ2EnLCAgICAgICAgICAgICAgICAgICAgICAgIyBBUFBFTkQKQEAgLTEwMDksNyArMTAwOSw3IEBACiAgICAgICAgICAgICBiJ05iJywKICAgICAgICAgICAgIGInZCcsICAgICAgICAgICAgICAgICAgICAgICAjIERJQ1QKICAgICAgICAgICAgIGInZScsICAgICAgICAgICAgICAgICAgICAgICAjIEFQUEVORFMKLSAgICAgICAgICAgICMgYicoZScsICAgICAgICAgICAgICAgICAgICAjIFB5VW5waWNrbGVyIHJhaXNlcyBBdHRyaWJ1dGVFcnJvcgorICAgICAgICAgICAgYicoZScsCiAgICAgICAgICAgICBiJ2lidWlsdGluc1xubGlzdFxuJywgICAgICAgIyBJTlNUCiAgICAgICAgICAgICBiJ2wnLCAgICAgICAgICAgICAgICAgICAgICAgIyBMSVNUCiAgICAgICAgICAgICBiJ28nLCAgICAgICAgICAgICAgICAgICAgICAgIyBPQkoKQEAgLTEwMjIsNyArMTAyMiw3IEBACiAgICAgICAgICAgICBiJ05OcycsCiAgICAgICAgICAgICBiJ3QnLCAgICAgICAgICAgICAgICAgICAgICAgIyBUVVBMRQogICAgICAgICAgICAgYid1JywgICAgICAgICAgICAgICAgICAgICAgICMgU0VUSVRFTVMKLSAgICAgICAgICAgICMgYicodScsICAgICAgICAgICAgICAgICAgICAjIFB5VW5waWNrbGVyIGRvZXNuJ3QgcmFpc2UKKyAgICAgICAgICAgIGInKHUnLAogICAgICAgICAgICAgYid9KE51JywKICAgICAgICAgICAgIGInXHg4MScsICAgICAgICAgICAgICAgICAgICAjIE5FV09CSgogICAgICAgICAgICAgYicpXHg4MScsCkBAIC0xMDMzLDcgKzEwMzMsNyBAQAogICAgICAgICAgICAgYidOXHg4NycsCiAgICAgICAgICAgICBiJ05OXHg4NycsCiAgICAgICAgICAgICBiJ1x4OTAnLCAgICAgICAgICAgICAgICAgICAgIyBBRERJVEVNUwotICAgICAgICAgICAgIyBiJyhceDkwJywgICAgICAgICAgICAgICAgICMgUHlVbnBpY2tsZXIgcmFpc2VzIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBiJyhceDkwJywKICAgICAgICAgICAgIGInXHg5MScsICAgICAgICAgICAgICAgICAgICAjIEZST1pFTlNFVAogICAgICAgICAgICAgYidceDkyJywgICAgICAgICAgICAgICAgICAgICMgTkVXT0JKX0VYCiAgICAgICAgICAgICBiJyl9XHg5MicsCkBAIC0xMDQ2LDcgKzEwNDYsNyBAQAogCiAgICAgZGVmIHRlc3RfYmFkX21hcmsoc2VsZik6CiAgICAgICAgIGJhZHBpY2tsZXMgPSBbCi0gICAgICAgICAgICAjIGInTiguJywgICAgICAgICAgICAgICAgICAgICAjIFNUT1AKKyAgICAgICAgICAgIGInTiguJywgICAgICAgICAgICAgICAgICAgICAjIFNUT1AKICAgICAgICAgICAgIGInTigyJywgICAgICAgICAgICAgICAgICAgICAjIERVUAogICAgICAgICAgICAgYidjYnVpbHRpbnNcbmxpc3RcbikoUicsICAgICMgUkVEVUNFCiAgICAgICAgICAgICBiJ2NidWlsdGluc1xubGlzdFxuKClSJywKQEAgLTEwODEsNyArMTA4MSw3IEBACiAgICAgICAgICAgICBiJ04oXHg5NCcsICAgICAgICAgICAgICAgICAgIyBNRU1PSVpFCiAgICAgICAgIF0KICAgICAgICAgZm9yIHAgaW4gYmFkcGlja2xlczoKLSAgICAgICAgICAgIHNlbGYuY2hlY2tfdW5waWNrbGluZ19lcnJvcihzZWxmLmJhZF9tYXJrX2Vycm9ycywgcCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdW5waWNrbGluZ19lcnJvcihzZWxmLmJhZF9zdGFja19lcnJvcnMsIHApCiAKICAgICBkZWYgdGVzdF90cnVuY2F0ZWRfZGF0YShzZWxmKToKICAgICAgICAgc2VsZi5jaGVja191bnBpY2tsaW5nX2Vycm9yKEVPRkVycm9yLCBiJycpCkBAIC0xODU1LDE2ICsxODU1LDE0IEBACiAgICAgICAgIHguYWJjID0gNjY2CiAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChwcm90bz1wcm90byk6Ci0gICAgICAgICAgICAgICAgaWYgMiA8PSBwcm90byA8IDQ6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZHVtcHMsIHgsIHByb3RvKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQogICAgICAgICAgICAgICAgIGlmIHByb3RvIDwgMToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1xuTDY0MjA2JywgcykgICMgTE9ORwogICAgICAgICAgICAgICAgIGVsaWYgcHJvdG8gPCAyOgogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInTVx4Y2VceGZhJywgcykgICMgQklOSU5UMgorICAgICAgICAgICAgICAgIGVsaWYgcHJvdG8gPCA0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInWFx4MDRceDAwXHgwMFx4MDBGQUNFJywgcykgICMgQklOVU5JQ09ERQogICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBwcm90byA+PSA0CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidceDhjXHgwNEZBQ0UnLCBzKSAgIyBTSE9SVF9CSU5VTklDT0RFCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGNvZGVfaW5fcGlja2xlKHBpY2tsZS5ORVdPQkosIHMpKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bjb2RlX2luX3BpY2tsZShwaWNrbGUuTkVXT0JKX0VYLCBzKSwKQEAgLTI1ODMsMTEgKzI1ODEsNiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhwaWNrbGUuUGlja2xpbmdFcnJvciwgQmFkUGlja2xlcigpLmR1bXAsIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEJhZFVucGlja2xlcigpLmxvYWQpCiAKLSAgICBkZWYgdGVzdF9iYWRfaW5wdXQoc2VsZik6Ci0gICAgICAgICMgVGVzdCBpc3N1ZTQyOTgKLSAgICAgICAgcyA9IGJ5dGVzKFsweDU4LCAwLCAwLCAwLCAweDU0XSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIHBpY2tsZS5sb2FkcywgcykKLQogCiBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbnRQaWNrbGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9yZWdydGVzdC5weSBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggZmVjZmQwOS4uMjFiMGVkZgotLS0gYS9MaWIvdGVzdC9yZWdydGVzdC5weQorKysgYi9MaWIvdGVzdC9yZWdydGVzdC5weQpAQCAtNiwxNjA0ICs2LDMzIEBACiBSdW4gdGhpcyBzY3JpcHQgd2l0aCAtaCBvciAtLWhlbHAgZm9yIGRvY3VtZW50YXRpb24uCiAiIiIKIAotVVNBR0UgPSAiIiJcCi1weXRob24gLW0gdGVzdCBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgW3Rlc3RfbmFtZTIgLi4uXV0KLXB5dGhvbiBwYXRoL3RvL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQotIiIiCi0KLURFU0NSSVBUSU9OID0gIiIiXAotUnVuIFB5dGhvbiByZWdyZXNzaW9uIHRlc3RzLgotCi1JZiBubyBhcmd1bWVudHMgb3Igb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGZpbmRzIGFsbCBmaWxlcyBtYXRjaGluZwotdGhlIHBhdHRlcm4gInRlc3RfKiIgaW4gdGhlIExpYi90ZXN0IHN1YmRpcmVjdG9yeSBhbmQgcnVucwotdGhlbSBpbiBhbHBoYWJldGljYWwgb3JkZXIgKGJ1dCBzZWUgLU0gYW5kIC11LCBiZWxvdywgZm9yIGV4Y2VwdGlvbnMpLgotCi1Gb3IgbW9yZSByaWdvcm91cyB0ZXN0aW5nLCBpdCBpcyB1c2VmdWwgdG8gdXNlIHRoZSBmb2xsb3dpbmcKLWNvbW1hbmQgbGluZToKLQotcHl0aG9uIC1FIC1XZCAtbSB0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSAuLi5dCi0iIiIKLQotRVBJTE9HID0gIiIiXAotQWRkaXRpb25hbCBvcHRpb24gZGV0YWlsczoKLQotLXIgcmFuZG9taXplcyB0ZXN0IGV4ZWN1dGlvbiBvcmRlci4gWW91IGNhbiB1c2UgLS1yYW5kc2VlZD1pbnQgdG8gcHJvdmlkZSBhbgotaW50IHNlZWQgdmFsdWUgZm9yIHRoZSByYW5kb21pemVyOyB0aGlzIGlzIHVzZWZ1bCBmb3IgcmVwcm9kdWNpbmcgdHJvdWJsZXNvbWUKLXRlc3Qgb3JkZXJzLgotCi0tcyBPbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiByZWdydGVzdCB1c2luZyAtcywgdGhlIGZpcnN0IHRlc3QgZmlsZSBmb3VuZAotb3IgdGhlIGZpcnN0IHRlc3QgZmlsZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIHJ1biwgYW5kIHRoZSBuYW1lIG9mCi10aGUgbmV4dCB0ZXN0IGlzIHJlY29yZGVkIGluIGEgZmlsZSBuYW1lZCBweW5leHR0ZXN0LiAgSWYgcnVuIGZyb20gdGhlCi1QeXRob24gYnVpbGQgZGlyZWN0b3J5LCBweW5leHR0ZXN0IGlzIGxvY2F0ZWQgaW4gdGhlICdidWlsZCcgc3ViZGlyZWN0b3J5LAotb3RoZXJ3aXNlIGl0IGlzIGxvY2F0ZWQgaW4gdGVtcGZpbGUuZ2V0dGVtcGRpcigpLiAgT24gc3Vic2VxdWVudCBydW5zLAotdGhlIHRlc3QgaW4gcHluZXh0dGVzdCBpcyBydW4sIGFuZCB0aGUgbmV4dCB0ZXN0IGlzIHdyaXR0ZW4gdG8gcHluZXh0dGVzdC4KLVdoZW4gdGhlIGxhc3QgdGVzdCBoYXMgYmVlbiBydW4sIHB5bmV4dHRlc3QgaXMgZGVsZXRlZC4gIEluIHRoaXMgd2F5IGl0Ci1pcyBwb3NzaWJsZSB0byBzaW5nbGUgc3RlcCB0aHJvdWdoIHRoZSB0ZXN0IGZpbGVzLiAgVGhpcyBpcyB1c2VmdWwgd2hlbgotZG9pbmcgbWVtb3J5IGFuYWx5c2lzIG9uIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIHdoaWNoIHByb2Nlc3MgdGVuZHMgdG8KLWNvbnN1bWUgdG9vIG1hbnkgcmVzb3VyY2VzIHRvIHJ1biB0aGUgZnVsbCByZWdyZXNzaW9uIHRlc3Qgbm9uLXN0b3AuCi0KLS1TIGlzIHVzZWQgdG8gY29udGludWUgcnVubmluZyB0ZXN0cyBhZnRlciBhbiBhYm9ydGVkIHJ1bi4gIEl0IHdpbGwKLW1haW50YWluIHRoZSBvcmRlciBhIHN0YW5kYXJkIHJ1biAoaWUsIHRoaXMgYXNzdW1lcyAtciBpcyBub3QgdXNlZCkuCi1UaGlzIGlzIHVzZWZ1bCBhZnRlciB0aGUgdGVzdHMgaGF2ZSBwcmVtYXR1cmVseSBzdG9wcGVkIGZvciBzb21lIGV4dGVybmFsCi1yZWFzb24gYW5kIHlvdSB3YW50IHRvIHN0YXJ0IHJ1bm5pbmcgZnJvbSB3aGVyZSB5b3UgbGVmdCBvZmYgcmF0aGVyCi10aGFuIHN0YXJ0aW5nIGZyb20gdGhlIGJlZ2lubmluZy4KLQotLWYgcmVhZHMgdGhlIG5hbWVzIG9mIHRlc3RzIGZyb20gdGhlIGZpbGUgZ2l2ZW4gYXMgZidzIGFyZ3VtZW50LCBvbmUKLW9yIG1vcmUgdGVzdCBuYW1lcyBwZXIgbGluZS4gIFdoaXRlc3BhY2UgaXMgaWdub3JlZC4gIEJsYW5rIGxpbmVzIGFuZAotbGluZXMgYmVnaW5uaW5nIHdpdGggJyMnIGFyZSBpZ25vcmVkLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IKLXdoaXR0bGluZyBkb3duIGZhaWx1cmVzIGludm9sdmluZyBpbnRlcmFjdGlvbnMgYW1vbmcgdGVzdHMuCi0KLS1MIGNhdXNlcyB0aGUgbGVha3MoMSkgY29tbWFuZCB0byBiZSBydW4ganVzdCBiZWZvcmUgZXhpdCBpZiBpdCBleGlzdHMuCi1sZWFrcygxKSBpcyBhdmFpbGFibGUgb24gTWFjIE9TIFggYW5kIHByZXN1bWFibHkgb24gc29tZSBvdGhlcgotRnJlZUJTRC1kZXJpdmVkIHN5c3RlbXMuCi0KLS1SIHJ1bnMgZWFjaCB0ZXN0IHNldmVyYWwgdGltZXMgYW5kIGV4YW1pbmVzIHN5cy5nZXR0b3RhbHJlZmNvdW50KCkgdG8KLXNlZSBpZiB0aGUgdGVzdCBhcHBlYXJzIHRvIGJlIGxlYWtpbmcgcmVmZXJlbmNlcy4gIFRoZSBhcmd1bWVudCBzaG91bGQKLWJlIG9mIHRoZSBmb3JtIHN0YWI6cnVuOmZuYW1lIHdoZXJlICdzdGFiJyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZQotdGVzdCBpcyBydW4gdG8gbGV0IGdldHRvdGFscmVmY291bnQgc2V0dGxlIGRvd24sICdydW4nIGlzIHRoZSBudW1iZXIKLW9mIHRpbWVzIGZ1cnRoZXIgaXQgaXMgcnVuIGFuZCAnZm5hbWUnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoZQotcmVwb3J0cyBhcmUgd3JpdHRlbiB0by4gIFRoZXNlIHBhcmFtZXRlcnMgYWxsIGhhdmUgZGVmYXVsdHMgKDUsIDQgYW5kCi0icmVmbG9nLnR4dCIgcmVzcGVjdGl2ZWx5KSwgYW5kIHRoZSBtaW5pbWFsIGludm9jYXRpb24gaXMgJy1SIDonLgotCi0tTSBydW5zIHRlc3RzIHRoYXQgcmVxdWlyZSBhbiBleG9yYml0YW50IGFtb3VudCBvZiBtZW1vcnkuIFRoZXNlIHRlc3RzCi10eXBpY2FsbHkgdHJ5IHRvIGFzY2VydGFpbiBjb250YWluZXJzIGtlZXAgd29ya2luZyB3aGVuIGNvbnRhaW5pbmcgbW9yZSB0aGFuCi0yIGJpbGxpb24gb2JqZWN0cywgd2hpY2ggb25seSB3b3JrcyBvbiA2NC1iaXQgc3lzdGVtcy4gVGhlcmUgYXJlIGFsc28gc29tZQotdGVzdHMgdGhhdCB0cnkgdG8gZXhoYXVzdCB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcHJvY2Vzcywgd2hpY2ggb25seSBtYWtlcwotc2Vuc2Ugb24gMzItYml0IHN5c3RlbXMgd2l0aCBhdCBsZWFzdCAyR2Igb2YgbWVtb3J5LiBUaGUgcGFzc2VkLWluIG1lbWxpbWl0LAotd2hpY2ggaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm0gb2YgJzIuNUdiJywgZGV0ZXJtaW5lcyBob3dtdWNoIG1lbW9yeSB0aGUKLXRlc3RzIHdpbGwgbGltaXQgdGhlbXNlbHZlcyB0byAoYnV0IHRoZXkgbWF5IGdvIHNsaWdodGx5IG92ZXIuKSBUaGUgbnVtYmVyCi1zaG91bGRuJ3QgYmUgbW9yZSBtZW1vcnkgdGhhbiB0aGUgbWFjaGluZSBoYXMgKGluY2x1ZGluZyBzd2FwIG1lbW9yeSkuIFlvdQotc2hvdWxkIGFsc28ga2VlcCBpbiBtaW5kIHRoYXQgc3dhcCBtZW1vcnkgaXMgZ2VuZXJhbGx5IG11Y2gsIG11Y2ggc2xvd2VyCi10aGFuIFJBTSwgYW5kIHNldHRpbmcgbWVtbGltaXQgdG8gYWxsIGF2YWlsYWJsZSBSQU0gb3IgaGlnaGVyIHdpbGwgaGVhdmlseQotdGF4IHRoZSBtYWNoaW5lLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaXMgbm8gdXNlIHJ1bm5pbmcgdGhlc2UgdGVzdHMgd2l0aCBhCi1saW1pdCBvZiBsZXNzIHRoYW4gMi41R2IsIGFuZCBtYW55IHJlcXVpcmUgbW9yZSB0aGFuIDIwR2IuIFRlc3RzIHRoYXQgZXhwZWN0Ci10byB1c2UgbW9yZSB0aGFuIG1lbWxpbWl0IG1lbW9yeSB3aWxsIGJlIHNraXBwZWQuIFRoZSBiaWctbWVtb3J5IHRlc3RzCi1nZW5lcmFsbHkgcnVuIHZlcnksIHZlcnkgbG9uZy4KLQotLXUgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzIHRvIHJ1biwKLXN1Y2ggYXMgdGhvc2UgcmVxdWlyaW5nIGxhcmdlIGZpbGUgc3VwcG9ydCBvciBuZXR3b3JrIGNvbm5lY3Rpdml0eS4KLVRoZSBhcmd1bWVudCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmRzIGluZGljYXRpbmcgdGhlCi1yZXNvdXJjZXMgdG8gdGVzdC4gIEN1cnJlbnRseSBvbmx5IHRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQ6Ci0KLSAgICBhbGwgLSAgICAgICBFbmFibGUgYWxsIHNwZWNpYWwgcmVzb3VyY2VzLgotCi0gICAgbm9uZSAtICAgICAgRGlzYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMgKHRoaXMgaXMgdGhlIGRlZmF1bHQpLgotCi0gICAgYXVkaW8gLSAgICAgVGVzdHMgdGhhdCB1c2UgdGhlIGF1ZGlvIGRldmljZS4gIChUaGVyZSBhcmUga25vd24KLSAgICAgICAgICAgICAgICBjYXNlcyBvZiBicm9rZW4gYXVkaW8gZHJpdmVycyB0aGF0IGNhbiBjcmFzaCBQeXRob24gb3IKLSAgICAgICAgICAgICAgICBldmVuIHRoZSBMaW51eCBrZXJuZWwuKQotCi0gICAgY3Vyc2VzIC0gICAgVGVzdHMgdGhhdCB1c2UgY3Vyc2VzIGFuZCB3aWxsIG1vZGlmeSB0aGUgdGVybWluYWwncwotICAgICAgICAgICAgICAgIHN0YXRlIGFuZCBvdXRwdXQgbW9kZXMuCi0KLSAgICBsYXJnZWZpbGUgLSBJdCBpcyBva2F5IHRvIHJ1biBzb21lIHRlc3QgdGhhdCBtYXkgY3JlYXRlIGh1Z2UKLSAgICAgICAgICAgICAgICBmaWxlcy4gIFRoZXNlIHRlc3RzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBtYXkKLSAgICAgICAgICAgICAgICBjb25zdW1lID4yR0Igb2YgZGlzayBzcGFjZSB0ZW1wb3JhcmlseS4KLQotICAgIG5ldHdvcmsgLSAgIEl0IGlzIG9rYXkgdG8gcnVuIHRlc3RzIHRoYXQgdXNlIGV4dGVybmFsIG5ldHdvcmsKLSAgICAgICAgICAgICAgICByZXNvdXJjZSwgZS5nLiB0ZXN0aW5nIFNTTCBzdXBwb3J0IGZvciBzb2NrZXRzLgotCi0gICAgZGVjaW1hbCAtICAgVGVzdCB0aGUgZGVjaW1hbCBtb2R1bGUgYWdhaW5zdCBhIGxhcmdlIHN1aXRlIHRoYXQKLSAgICAgICAgICAgICAgICB2ZXJpZmllcyBjb21wbGlhbmNlIHdpdGggc3RhbmRhcmRzLgotCi0gICAgY3B1IC0gICAgICAgVXNlZCBmb3IgY2VydGFpbiBDUFUtaGVhdnkgdGVzdHMuCi0KLSAgICBzdWJwcm9jZXNzICBSdW4gYWxsIHRlc3RzIGZvciB0aGUgc3VicHJvY2VzcyBtb2R1bGUuCi0KLSAgICB1cmxmZXRjaCAtICBJdCBpcyBva2F5IHRvIGRvd25sb2FkIGZpbGVzIHJlcXVpcmVkIG9uIHRlc3RpbmcuCi0KLSAgICBndWkgLSAgICAgICBSdW4gdGVzdHMgdGhhdCByZXF1aXJlIGEgcnVubmluZyBHVUkuCi0KLVRvIGVuYWJsZSBhbGwgcmVzb3VyY2VzIGV4Y2VwdCBvbmUsIHVzZSAnLXVhbGwsLTxyZXNvdXJjZT4nLiAgRm9yCi1leGFtcGxlLCB0byBydW4gYWxsIHRoZSB0ZXN0cyBleGNlcHQgZm9yIHRoZSBndWkgdGVzdHMsIGdpdmUgdGhlCi1vcHRpb24gJy11YWxsLC1ndWknLgotIiIiCi0KICMgV2UgaW1wb3J0IGltcG9ydGxpYiAqQVNBUCogaW4gb3JkZXIgdG8gdGVzdCAjMTUzODYKIGltcG9ydCBpbXBvcnRsaWIKIAotaW1wb3J0IGFyZ3BhcnNlCi1pbXBvcnQgYnVpbHRpbnMKLWltcG9ydCBmYXVsdGhhbmRsZXIKLWltcG9ydCBpbwotaW1wb3J0IGpzb24KLWltcG9ydCBsb2NhbGUKLWltcG9ydCBsb2dnaW5nCiBpbXBvcnQgb3MKLWltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IHJhbmRvbQotaW1wb3J0IHJlCi1pbXBvcnQgc2h1dGlsCi1pbXBvcnQgc2lnbmFsCiBpbXBvcnQgc3lzCi1pbXBvcnQgc3lzY29uZmlnCi1pbXBvcnQgdGVtcGZpbGUKLWltcG9ydCB0aW1lCi1pbXBvcnQgdHJhY2ViYWNrCi1pbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwotZnJvbSBpbnNwZWN0IGltcG9ydCBpc2Fic3RyYWN0Citmcm9tIHRlc3QubGlicmVncnRlc3QgaW1wb3J0IG1haW4KIAotdHJ5OgotICAgIGltcG9ydCB0aHJlYWRpbmcKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICB0aHJlYWRpbmcgPSBOb25lCi10cnk6Ci0gICAgaW1wb3J0IF9tdWx0aXByb2Nlc3NpbmcsIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgbXVsdGlwcm9jZXNzaW5nID0gTm9uZQogCisjIEFsaWFzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IChqdXN0IGluIGNhc2UpCittYWluX2luX3RlbXBfY3dkID0gbWFpbgogCi0jIFNvbWUgdGltZXMgX19wYXRoX18gYW5kIF9fZmlsZV9fIGFyZSBub3QgYWJzb2x1dGUgKGUuZy4gd2hpbGUgcnVubmluZyBmcm9tCi0jIExpYi8pIGFuZCwgaWYgd2UgY2hhbmdlIHRoZSBDV0QgdG8gcnVuIHRoZSB0ZXN0cyBpbiBhIHRlbXBvcmFyeSBkaXIsIHNvbWUKLSMgaW1wb3J0cyBtaWdodCBmYWlsLiAgVGhpcyBhZmZlY3RzIG9ubHkgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYmVmb3JlIG9zLmNoZGlyKCkuCi0jIFRoZXNlIG1vZHVsZXMgYXJlIHNlYXJjaGVkIGZpcnN0IGluIHN5cy5wYXRoWzBdIChzbyAnJyAtLSB0aGUgQ1dEKSBhbmQgaWYKLSMgdGhleSBhcmUgZm91bmQgaW4gdGhlIENXRCB0aGVpciBfX2ZpbGVfXyBhbmQgX19wYXRoX18gd2lsbCBiZSByZWxhdGl2ZSAodGhpcwotIyBoYXBwZW5zIGJlZm9yZSB0aGUgY2hkaXIpLiAgQWxsIHRoZSBtb2R1bGVzIGltcG9ydGVkIGFmdGVyIHRoZSBjaGRpciwgYXJlCi0jIG5vdCBmb3VuZCBpbiB0aGUgQ1dELCBhbmQgc2luY2UgdGhlIG90aGVyIHBhdGhzIGluIHN5cy5wYXRoWzE6XSBhcmUgYWJzb2x1dGUKLSMgKHNpdGUucHkgYWJzb2x1dGl6ZSB0aGVtKSwgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIGFic29sdXRlIHRvby4KLSMgVGhlcmVmb3JlIGl0IGlzIG5lY2Vzc2FyeSB0byBhYnNvbHV0aXplIG1hbnVhbGx5IHRoZSBfX2ZpbGVfXyBhbmQgX19wYXRoX18gb2YKLSMgdGhlIHBhY2thZ2VzIHRvIHByZXZlbnQgbGF0ZXIgaW1wb3J0cyB0byBmYWlsIHdoZW4gdGhlIENXRCBpcyBkaWZmZXJlbnQuCi1mb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgotICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKLSAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW29zLnBhdGguYWJzcGF0aChwYXRoKSBmb3IgcGF0aCBpbiBtb2R1bGUuX19wYXRoX19dCi0gICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgotICAgICAgICBtb2R1bGUuX19maWxlX18gPSBvcy5wYXRoLmFic3BhdGgobW9kdWxlLl9fZmlsZV9fKQogCi0KLSMgTWFjT1NYIChhLmsuYS4gRGFyd2luKSBoYXMgYSBkZWZhdWx0IHN0YWNrIHNpemUgdGhhdCBpcyB0b28gc21hbGwKLSMgZm9yIGRlZXBseSByZWN1cnNpdmUgcmVndWxhciBleHByZXNzaW9ucy4gIFdlIHNlZSB0aGlzIGFzIGNyYXNoZXMgaW4KLSMgdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdoZW4gcnVubmluZyB0ZXN0X3JlLnB5IGFuZCB0ZXN0X3NyZS5weS4gIFRoZQotIyBmaXggaXMgdG8gc2V0IHRoZSBzdGFjayBsaW1pdCB0byAyMDQ4LgotIyBUaGlzIGFwcHJvYWNoIG1heSBhbHNvIGJlIHVzZWZ1bCBmb3Igb3RoZXIgVW5peHkgcGxhdGZvcm1zIHRoYXQKLSMgc3VmZmVyIGZyb20gc21hbGwgZGVmYXVsdCBzdGFjayBsaW1pdHMuCi1pZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6Ci0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgcmVzb3VyY2UKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgICBzb2Z0LCBoYXJkID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSykKLSAgICAgICAgbmV3c29mdCA9IG1pbihoYXJkLCBtYXgoc29mdCwgMTAyNCoyMDQ4KSkKLSAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSywgKG5ld3NvZnQsIGhhcmQpKQotCi0jIFRlc3QgcmVzdWx0IGNvbnN0YW50cy4KLVBBU1NFRCA9IDEKLUZBSUxFRCA9IDAKLUVOVl9DSEFOR0VEID0gLTEKLVNLSVBQRUQgPSAtMgotUkVTT1VSQ0VfREVOSUVEID0gLTMKLUlOVEVSUlVQVEVEID0gLTQKLUNISUxEX0VSUk9SID0gLTUgICAjIGVycm9yIGluIGEgY2hpbGQgcHJvY2VzcwotCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKLQotUkVTT1VSQ0VfTkFNRVMgPSAoJ2F1ZGlvJywgJ2N1cnNlcycsICdsYXJnZWZpbGUnLCAnbmV0d29yaycsCi0gICAgICAgICAgICAgICAgICAnZGVjaW1hbCcsICdjcHUnLCAnc3VicHJvY2VzcycsICd1cmxmZXRjaCcsICdndWknKQotCi0jIFdoZW4gdGVzdHMgYXJlIHJ1biBmcm9tIHRoZSBQeXRob24gYnVpbGQgZGlyZWN0b3J5LCBpdCBpcyBiZXN0IHByYWN0aWNlCi0jIHRvIGtlZXAgdGhlIHRlc3QgZmlsZXMgaW4gYSBzdWJmb2xkZXIuICBUaGlzIGVhc2VzIHRoZSBjbGVhbnVwIG9mIGxlZnRvdmVyCi0jIGZpbGVzIHVzaW5nIHRoZSAibWFrZSBkaXN0Y2xlYW4iIGNvbW1hbmQuCi1pZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6Ci0gICAgVEVNUERJUiA9IG9zLnBhdGguam9pbihzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3NyY2RpcicpLCAnYnVpbGQnKQotZWxzZToKLSAgICBURU1QRElSID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCi1URU1QRElSID0gb3MucGF0aC5hYnNwYXRoKFRFTVBESVIpCi0KLWNsYXNzIF9BcmdQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgotCi0gICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgotICAgICAgICBzdXBlcigpLmVycm9yKG1lc3NhZ2UgKyAiXG5QYXNzIC1oIG9yIC0taGVscCBmb3IgY29tcGxldGUgaGVscC4iKQotCi1kZWYgX2NyZWF0ZV9wYXJzZXIoKToKLSAgICAjIFNldCBwcm9nIHRvIHByZXZlbnQgdGhlIHVuaW5mb3JtYXRpdmUgIl9fbWFpbl9fLnB5IiBmcm9tIGRpc3BsYXlpbmcgaW4KLSAgICAjIGVycm9yIG1lc3NhZ2VzIHdoZW4gdXNpbmcgInB5dGhvbiAtbSB0ZXN0IC4uLiIuCi0gICAgcGFyc2VyID0gX0FyZ1BhcnNlcihwcm9nPSdyZWdydGVzdC5weScsCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZT1VU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPURFU0NSSVBUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgZXBpbG9nPUVQSUxPRywKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9oZWxwPUZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlcikKLQotICAgICMgQXJndW1lbnRzIHdpdGggdGhpcyBjbGF1c2UgYWRkZWQgdG8gaXRzIGhlbHAgYXJlIGRlc2NyaWJlZCBmdXJ0aGVyIGluCi0gICAgIyB0aGUgZXBpbG9nJ3MgIkFkZGl0aW9uYWwgb3B0aW9uIGRldGFpbHMiIHNlY3Rpb24uCi0gICAgbW9yZV9kZXRhaWxzID0gJyAgU2VlIHRoZSBzZWN0aW9uIGF0IGJvdHRvbSBmb3IgbW9yZSBkZXRhaWxzLicKLQotICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnR2VuZXJhbCBvcHRpb25zJykKLSAgICAjIFdlIGFkZCBoZWxwIGV4cGxpY2l0bHkgdG8gY29udHJvbCB3aGF0IGFyZ3VtZW50IGdyb3VwIGl0IHJlbmRlcnMgdW5kZXIuCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctaCcsICctLWhlbHAnLCBhY3Rpb249J2hlbHAnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tdGltZW91dCcsIG1ldGF2YXI9J1RJTUVPVVQnLCB0eXBlPWZsb2F0LAotICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZHVtcCB0aGUgdHJhY2ViYWNrIGFuZCBleGl0IGlmIGEgdGVzdCB0YWtlcyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb3JlIHRoYW4gVElNRU9VVCBzZWNvbmRzOyBkaXNhYmxlZCBpZiBUSU1FT1VUICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIG5lZ2F0aXZlIG9yIGVxdWFscyB0byB6ZXJvJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0td2FpdCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3dhaXQgZm9yIHVzZXIgaW5wdXQsIGUuZy4sIGFsbG93IGEgZGVidWdnZXIgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0byBiZSBhdHRhY2hlZCcpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXNsYXZlYXJncycsIG1ldGF2YXI9J0FSR1MnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVMnLCAnLS1zdGFydCcsIG1ldGF2YXI9J1NUQVJUJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ndGhlIG5hbWUgb2YgdGhlIHRlc3QgYXQgd2hpY2ggdG8gc3RhcnQuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotCi0gICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdWZXJib3NpdHknKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdjb3VudCcsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3J1biB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUgd2l0aCBvdXRwdXQgdG8gc3Rkb3V0JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy13JywgJy0tdmVyYm9zZTInLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZS1ydW4gZmFpbGVkIHRlc3RzIGluIHZlcmJvc2UgbW9kZScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctVycsICctLXZlcmJvc2UzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlzcGxheSB0ZXN0IG91dHB1dCBvbiBmYWlsdXJlJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1xJywgJy0tcXVpZXQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdubyBvdXRwdXQgdW5sZXNzIG9uZSBvciBtb3JlIHRlc3RzIGZhaWwnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLW8nLCAnLS1zbG93JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0ncHJpbnRfc2xvdycsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3ByaW50IHRoZSBzbG93ZXN0IDEwIHRlc3RzJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy0taGVhZGVyJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncHJpbnQgaGVhZGVyIHdpdGggaW50ZXJwcmV0ZXIgaW5mbycpCi0KLSAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1NlbGVjdGluZyB0ZXN0cycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctcicsICctLXJhbmRvbWl6ZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3JhbmRvbWl6ZSB0ZXN0IGV4ZWN1dGlvbiBvcmRlci4nICsgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1yYW5kc2VlZCcsIG1ldGF2YXI9J1NFRUQnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdyYW5kb21fc2VlZCcsIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdwYXNzIGEgcmFuZG9tIHNlZWQgdG8gcmVwcm9kdWNlIGEgcHJldmlvdXMgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyYW5kb20gcnVuJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1mJywgJy0tZnJvbWZpbGUnLCBtZXRhdmFyPSdGSUxFJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmVhZCBuYW1lcyBvZiB0ZXN0cyB0byBydW4gZnJvbSBhIGZpbGUuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXgnLCAnLS1leGNsdWRlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nYXJndW1lbnRzIGFyZSB0ZXN0cyB0byAqZXhjbHVkZSonKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zaW5nbGUnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzaW5nbGUgc3RlcCB0aHJvdWdoIGEgc2V0IG9mIHRlc3RzLicgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZGV0YWlscykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1tJywgJy0tbWF0Y2gnLCBtZXRhdmFyPSdQQVQnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdtYXRjaF90ZXN0cycsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J21hdGNoIHRlc3QgY2FzZXMgYW5kIG1ldGhvZHMgd2l0aCBnbG9iIHBhdHRlcm4gUEFUJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1HJywgJy0tZmFpbGZhc3QnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdmYWlsIGFzIHNvb24gYXMgYSB0ZXN0IGZhaWxzIChvbmx5IHdpdGggLXYgb3IgLVcpJykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy11JywgJy0tdXNlJywgbWV0YXZhcj0nUkVTMSxSRVMyLC4uLicsCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nYXBwZW5kJywgdHlwZT1yZXNvdXJjZXNfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nc3BlY2lmeSB3aGljaCBzcGVjaWFsIHJlc291cmNlIGludGVuc2l2ZSB0ZXN0cyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIHJ1bi4nICsgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLU0nLCAnLS1tZW1saW1pdCcsIG1ldGF2YXI9J0xJTUlUJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHZlcnkgbGFyZ2UgbWVtb3J5LWNvbnN1bWluZyB0ZXN0cy4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2RldGFpbHMpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXRlc3RkaXInLCBtZXRhdmFyPSdESVInLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXJlbGF0aXZlX2ZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdleGVjdXRlIHRlc3QgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoaW5zdGVhZCBvZiB0aGUgUHl0aG9uIHN0ZGxpYiB0ZXN0IHN1aXRlKScpCi0KLSAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ1NwZWNpYWwgcnVucycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbCcsICctLWZpbmRsZWFrcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2lmIEdDIGlzIGF2YWlsYWJsZSBkZXRlY3QgdGVzdHMgdGhhdCBsZWFrIG1lbW9yeScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctTCcsICctLXJ1bmxlYWtzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIHRoZSBsZWFrcygxKSBjb21tYW5kIGp1c3QgYmVmb3JlIGV4aXQuJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLVInLCAnLS1odW50cmxlYWtzJywgbWV0YXZhcj0nUlVOQ09VTlRTJywKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1odW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdzZWFyY2ggZm9yIHJlZmVyZW5jZSBsZWFrcyAobmVlZHMgZGVidWcgYnVpbGQsICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyeSBzbG93KS4nICsgbW9yZV9kZXRhaWxzKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWonLCAnLS1tdWx0aXByb2Nlc3MnLCBtZXRhdmFyPSdQUk9DRVNTRVMnLAotICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd1c2VfbXAnLCB0eXBlPWludCwKLSAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncnVuIFBST0NFU1NFUyBwcm9jZXNzZXMgYXQgb25jZScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctVCcsICctLWNvdmVyYWdlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0ndHJhY2UnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd0dXJuIG9uIGNvZGUgY292ZXJhZ2UgdHJhY2luZyB1c2luZyB0aGUgdHJhY2UgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtb2R1bGUnKQotICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLUQnLCAnLS1jb3ZlcmRpcicsIG1ldGF2YXI9J0RJUicsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9cmVsYXRpdmVfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2RpcmVjdG9yeSB3aGVyZSBjb3ZlcmFnZSBmaWxlcyBhcmUgcHV0JykKLSAgICBncm91cC5hZGRfYXJndW1lbnQoJy1OJywgJy0tbm9jb3ZlcmRpcicsCi0gICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBjb25zdD1Ob25lLCBkZXN0PSdjb3ZlcmRpcicsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3B1dCBjb3ZlcmFnZSBmaWxlcyBhbG9uZ3NpZGUgbW9kdWxlcycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdCcsICctLXRocmVzaG9sZCcsIG1ldGF2YXI9J1RIUkVTSE9MRCcsCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9aW50LAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdjYWxsIGdjLnNldF90aHJlc2hvbGQoVEhSRVNIT0xEKScpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctbicsICctLW5vd2luZG93cycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3N1cHByZXNzIGVycm9yIG1lc3NhZ2UgYm94ZXMgb24gV2luZG93cycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctRicsICctLWZvcmV2ZXInLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gdGhlIHNwZWNpZmllZCB0ZXN0cyBpbiBhIGxvb3AsIHVudGlsIGFuICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3IgaGFwcGVucycpCi0gICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctUCcsICctLXBnbycsIGRlc3Q9J3BnbycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2VuYWJsZSBQcm9maWxlIEd1aWRlZCBPcHRpbWl6YXRpb24gdHJhaW5pbmcnKQotCi0gICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYXJncycsIG5hcmdzPWFyZ3BhcnNlLlJFTUFJTkRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9YXJncGFyc2UuU1VQUFJFU1MpCi0KLSAgICByZXR1cm4gcGFyc2VyCi0KLWRlZiByZWxhdGl2ZV9maWxlbmFtZShzdHJpbmcpOgotICAgICMgQ1dEIGlzIHJlcGxhY2VkIHdpdGggYSB0ZW1wb3JhcnkgZGlyIGJlZm9yZSBjYWxsaW5nIG1haW4oKSwgc28gd2UKLSAgICAjIGpvaW4gaXQgd2l0aCB0aGUgc2F2ZWQgQ1dEIHNvIGl0IGVuZHMgdXAgd2hlcmUgdGhlIHVzZXIgZXhwZWN0cy4KLSAgICByZXR1cm4gb3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIHN0cmluZykKLQotZGVmIGh1bnRybGVha3Moc3RyaW5nKToKLSAgICBhcmdzID0gc3RyaW5nLnNwbGl0KCc6JykKLSAgICBpZiBsZW4oYXJncykgbm90IGluICgyLCAzKToKLSAgICAgICAgcmFpc2UgYXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoCi0gICAgICAgICAgICAnbmVlZHMgMiBvciAzIGNvbG9uLXNlcGFyYXRlZCBhcmd1bWVudHMnKQotICAgIG53YXJtdXAgPSBpbnQoYXJnc1swXSkgaWYgYXJnc1swXSBlbHNlIDUKLSAgICBudHJhY2tlZCA9IGludChhcmdzWzFdKSBpZiBhcmdzWzFdIGVsc2UgNAotICAgIGZuYW1lID0gYXJnc1syXSBpZiBsZW4oYXJncykgPiAyIGFuZCBhcmdzWzJdIGVsc2UgJ3JlZmxvZy50eHQnCi0gICAgcmV0dXJuIG53YXJtdXAsIG50cmFja2VkLCBmbmFtZQotCi1kZWYgcmVzb3VyY2VzX2xpc3Qoc3RyaW5nKToKLSAgICB1ID0gW3gubG93ZXIoKSBmb3IgeCBpbiBzdHJpbmcuc3BsaXQoJywnKV0KLSAgICBmb3IgciBpbiB1OgotICAgICAgICBpZiByID09ICdhbGwnIG9yIHIgPT0gJ25vbmUnOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgaWYgclswXSA9PSAnLSc6Ci0gICAgICAgICAgICByID0gclsxOl0KLSAgICAgICAgaWYgciBub3QgaW4gUkVTT1VSQ0VfTkFNRVM6Ci0gICAgICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcignaW52YWxpZCByZXNvdXJjZTogJyArIHIpCi0gICAgcmV0dXJuIHUKLQotZGVmIF9wYXJzZV9hcmdzKGFyZ3MsICoqa3dhcmdzKToKLSAgICAjIERlZmF1bHRzCi0gICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UodGVzdGRpcj1Ob25lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLAotICAgICAgICAgZXhjbHVkZT1GYWxzZSwgc2luZ2xlPUZhbHNlLCByYW5kb21pemU9RmFsc2UsIGZyb21maWxlPU5vbmUsCi0gICAgICAgICBmaW5kbGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSwgdHJhY2U9RmFsc2UsIGNvdmVyZGlyPSdjb3ZlcmFnZScsCi0gICAgICAgICBydW5sZWFrcz1GYWxzZSwgaHVudHJsZWFrcz1GYWxzZSwgdmVyYm9zZTI9RmFsc2UsIHByaW50X3Nsb3c9RmFsc2UsCi0gICAgICAgICByYW5kb21fc2VlZD1Ob25lLCB1c2VfbXA9Tm9uZSwgdmVyYm9zZTM9RmFsc2UsIGZvcmV2ZXI9RmFsc2UsCi0gICAgICAgICBoZWFkZXI9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLCBwZ289RmFsc2UpCi0gICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6Ci0gICAgICAgIGlmIG5vdCBoYXNhdHRyKG5zLCBrKToKLSAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXIgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHRoaXMgZnVuY3Rpb24nICUgaykKLSAgICAgICAgc2V0YXR0cihucywgaywgdikKLSAgICBpZiBucy51c2VfcmVzb3VyY2VzIGlzIE5vbmU6Ci0gICAgICAgIG5zLnVzZV9yZXNvdXJjZXMgPSBbXQotCi0gICAgcGFyc2VyID0gX2NyZWF0ZV9wYXJzZXIoKQotICAgIHBhcnNlci5wYXJzZV9hcmdzKGFyZ3M9YXJncywgbmFtZXNwYWNlPW5zKQotCi0gICAgaWYgbnMuc2luZ2xlIGFuZCBucy5mcm9tZmlsZToKLSAgICAgICAgcGFyc2VyLmVycm9yKCItcyBhbmQgLWYgZG9uJ3QgZ28gdG9nZXRoZXIhIikKLSAgICBpZiBucy51c2VfbXAgYW5kIG5zLnRyYWNlOgotICAgICAgICBwYXJzZXIuZXJyb3IoIi1UIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQotICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMuZmluZGxlYWtzOgotICAgICAgICBwYXJzZXIuZXJyb3IoIi1sIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQotICAgIGlmIG5zLnVzZV9tcCBhbmQgbnMubWVtbGltaXQ6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLU0gYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCi0gICAgaWYgbnMuZmFpbGZhc3QgYW5kIG5vdCAobnMudmVyYm9zZSBvciBucy52ZXJib3NlMyk6Ci0gICAgICAgIHBhcnNlci5lcnJvcigiLUcvLS1mYWlsZmFzdCBuZWVkcyBlaXRoZXIgLXYgb3IgLVciKQotCi0gICAgaWYgbnMucXVpZXQ6Ci0gICAgICAgIG5zLnZlcmJvc2UgPSAwCi0gICAgaWYgbnMudGltZW91dCBpcyBub3QgTm9uZToKLSAgICAgICAgaWYgaGFzYXR0cihmYXVsdGhhbmRsZXIsICdkdW1wX3RyYWNlYmFja19sYXRlcicpOgotICAgICAgICAgICAgaWYgbnMudGltZW91dCA8PSAwOgotICAgICAgICAgICAgICAgIG5zLnRpbWVvdXQgPSBOb25lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCgiV2FybmluZzogVGhlIHRpbWVvdXQgb3B0aW9uIHJlcXVpcmVzICIKLSAgICAgICAgICAgICAgICAgICJmYXVsdGhhbmRsZXIuZHVtcF90cmFjZWJhY2tfbGF0ZXIiKQotICAgICAgICAgICAgbnMudGltZW91dCA9IE5vbmUKLSAgICBpZiBucy51c2VfbXAgaXMgbm90IE5vbmU6Ci0gICAgICAgIGlmIG5zLnVzZV9tcCA8PSAwOgotICAgICAgICAgICAgIyBVc2UgYWxsIGNvcmVzICsgZXh0cmFzIGZvciB0ZXN0cyB0aGF0IGxpa2UgdG8gc2xlZXAKLSAgICAgICAgICAgIG5zLnVzZV9tcCA9IDIgKyAob3MuY3B1X2NvdW50KCkgb3IgMSkKLSAgICAgICAgaWYgbnMudXNlX21wID09IDE6Ci0gICAgICAgICAgICBucy51c2VfbXAgPSBOb25lCi0gICAgaWYgbnMudXNlOgotICAgICAgICBmb3IgYSBpbiBucy51c2U6Ci0gICAgICAgICAgICBmb3IgciBpbiBhOgotICAgICAgICAgICAgICAgIGlmIHIgPT0gJ2FsbCc6Ci0gICAgICAgICAgICAgICAgICAgIG5zLnVzZV9yZXNvdXJjZXNbOl0gPSBSRVNPVVJDRV9OQU1FUwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIGlmIHIgPT0gJ25vbmUnOgotICAgICAgICAgICAgICAgICAgICBkZWwgbnMudXNlX3Jlc291cmNlc1s6XQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIHJlbW92ZSA9IEZhbHNlCi0gICAgICAgICAgICAgICAgaWYgclswXSA9PSAnLSc6Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IFRydWUKLSAgICAgICAgICAgICAgICAgICAgciA9IHJbMTpdCi0gICAgICAgICAgICAgICAgaWYgcmVtb3ZlOgotICAgICAgICAgICAgICAgICAgICBpZiByIGluIG5zLnVzZV9yZXNvdXJjZXM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBucy51c2VfcmVzb3VyY2VzLnJlbW92ZShyKQotICAgICAgICAgICAgICAgIGVsaWYgciBub3QgaW4gbnMudXNlX3Jlc291cmNlczoKLSAgICAgICAgICAgICAgICAgICAgbnMudXNlX3Jlc291cmNlcy5hcHBlbmQocikKLSAgICBpZiBucy5yYW5kb21fc2VlZCBpcyBub3QgTm9uZToKLSAgICAgICAgbnMucmFuZG9taXplID0gVHJ1ZQotCi0gICAgcmV0dXJuIG5zCi0KLQotZGVmIHJ1bl90ZXN0X2luX3N1YnByb2Nlc3ModGVzdG5hbWUsIG5zKToKLSAgICAiIiJSdW4gdGhlIGdpdmVuIHRlc3QgaW4gYSBzdWJwcm9jZXNzIHdpdGggLS1zbGF2ZWFyZ3MuCi0KLSAgICBucyBpcyB0aGUgb3B0aW9uIE5hbWVzcGFjZSBwYXJzZWQgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiByZWdydGVzdAotICAgIGlzIGludm9rZWQgaW4gYSBzdWJwcm9jZXNzIHdpdGggdGhlIC0tc2xhdmVhcmdzIGFyZ3VtZW50OyB3aGVuIHRoZQotICAgIHN1YnByb2Nlc3MgZXhpdHMsIGl0cyByZXR1cm4gY29kZSwgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlIHJldHVybmVkIGFzIGEKLSAgICAzLXR1cGxlLgotICAgICIiIgotICAgIGZyb20gc3VicHJvY2VzcyBpbXBvcnQgUG9wZW4sIFBJUEUKLSAgICBiYXNlX2NtZCA9IChbc3lzLmV4ZWN1dGFibGVdICsgc3VwcG9ydC5hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSArCi0gICAgICAgICAgICAgICAgWyctWCcsICdmYXVsdGhhbmRsZXInLCAnLW0nLCAndGVzdC5yZWdydGVzdCddKQotICAgICMgcmVxdWlyZWQgdG8gc3Bhd24gYSBuZXcgcHJvY2VzcyB3aXRoIFBHTyBmbGFnIG9uL29mZgotICAgIGlmIG5zLnBnbzoKLSAgICAgICAgYmFzZV9jbWQgPSBiYXNlX2NtZCArIFsnLS1wZ28nXQotICAgIHNsYXZlYXJncyA9ICgKLSAgICAgICAgICAgICh0ZXN0bmFtZSwgbnMudmVyYm9zZSwgbnMucXVpZXQpLAotICAgICAgICAgICAgZGljdChodW50cmxlYWtzPW5zLmh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgIHVzZV9yZXNvdXJjZXM9bnMudXNlX3Jlc291cmNlcywKLSAgICAgICAgICAgICAgICAgb3V0cHV0X29uX2ZhaWx1cmU9bnMudmVyYm9zZTMsCi0gICAgICAgICAgICAgICAgIHRpbWVvdXQ9bnMudGltZW91dCwgZmFpbGZhc3Q9bnMuZmFpbGZhc3QsCi0gICAgICAgICAgICAgICAgIG1hdGNoX3Rlc3RzPW5zLm1hdGNoX3Rlc3RzLCBwZ289bnMucGdvKSkKLSAgICAjIFJ1bm5pbmcgdGhlIGNoaWxkIGZyb20gdGhlIHNhbWUgd29ya2luZyBkaXJlY3RvcnkgYXMgcmVncnRlc3QncyBvcmlnaW5hbAotICAgICMgaW52b2NhdGlvbiBlbnN1cmVzIHRoYXQgVEVNUERJUiBmb3IgdGhlIGNoaWxkIGlzIHRoZSBzYW1lIHdoZW4KLSAgICAjIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKSBpcyB0cnVlLiBTZWUgaXNzdWUgMTUzMDAuCi0gICAgcG9wZW4gPSBQb3BlbihiYXNlX2NtZCArIFsnLS1zbGF2ZWFyZ3MnLCBqc29uLmR1bXBzKHNsYXZlYXJncyldLAotICAgICAgICAgICAgICAgICAgc3Rkb3V0PVBJUEUsIHN0ZGVycj1QSVBFLAotICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCi0gICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9KG9zLm5hbWUgIT0gJ250JyksCi0gICAgICAgICAgICAgICAgICBjd2Q9c3VwcG9ydC5TQVZFRENXRCkKLSAgICBzdGRvdXQsIHN0ZGVyciA9IHBvcGVuLmNvbW11bmljYXRlKCkKLSAgICByZXRjb2RlID0gcG9wZW4ud2FpdCgpCi0gICAgcmV0dXJuIHJldGNvZGUsIHN0ZG91dCwgc3RkZXJyCi0KLQotZGVmIG1haW4odGVzdHM9Tm9uZSwgKiprd2FyZ3MpOgotICAgICIiIkV4ZWN1dGUgYSB0ZXN0IHN1aXRlLgotCi0gICAgVGhpcyBhbHNvIHBhcnNlcyBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgbW9kaWZpZXMgaXRzIGJlaGF2aW9yCi0gICAgYWNjb3JkaW5nbHkuCi0KLSAgICB0ZXN0cyAtLSBhIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRlc3QgbmFtZXMgKG9wdGlvbmFsKQotICAgIHRlc3RkaXIgLS0gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBsb29rIGZvciB0ZXN0cyAob3B0aW9uYWwpCi0KLSAgICBVc2VycyBvdGhlciB0aGFuIHRoZSBQeXRob24gdGVzdCBzdWl0ZSB3aWxsIGNlcnRhaW5seSB3YW50IHRvCi0gICAgc3BlY2lmeSB0ZXN0ZGlyOyBpZiBpdCdzIG9taXR0ZWQsIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKLSAgICBQeXRob24gdGVzdCBzdWl0ZSBpcyBzZWFyY2hlZCBmb3IuCi0KLSAgICBJZiB0aGUgdGVzdHMgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIHRlc3RzIGxpc3RlZCBvbiB0aGUKLSAgICBjb21tYW5kLWxpbmUgd2lsbCBiZSB1c2VkLiAgSWYgdGhhdCdzIGVtcHR5LCB0b28sIHRoZW4gYWxsICoucHkKLSAgICBmaWxlcyBiZWdpbm5pbmcgd2l0aCB0ZXN0XyB3aWxsIGJlIHVzZWQuCi0KLSAgICBUaGUgb3RoZXIgZGVmYXVsdCBhcmd1bWVudHMgKHZlcmJvc2UsIHF1aWV0LCBleGNsdWRlLAotICAgIHNpbmdsZSwgcmFuZG9taXplLCBmaW5kbGVha3MsIHVzZV9yZXNvdXJjZXMsIHRyYWNlLCBjb3ZlcmRpciwKLSAgICBwcmludF9zbG93LCBhbmQgcmFuZG9tX3NlZWQpIGFsbG93IHByb2dyYW1tZXJzIGNhbGxpbmcgbWFpbigpCi0gICAgZGlyZWN0bHkgdG8gc2V0IHRoZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBzZXQgYnkgZmxhZ3MKLSAgICBvbiB0aGUgY29tbWFuZCBsaW5lLgotICAgICIiIgotICAgICMgRGlzcGxheSB0aGUgUHl0aG9uIHRyYWNlYmFjayBvbiBmYXRhbCBlcnJvcnMgKGUuZy4gc2VnZmF1bHQpCi0gICAgZmF1bHRoYW5kbGVyLmVuYWJsZShhbGxfdGhyZWFkcz1UcnVlKQotCi0gICAgIyBEaXNwbGF5IHRoZSBQeXRob24gdHJhY2ViYWNrIG9uIFNJR0FMUk0gb3IgU0lHVVNSMSBzaWduYWwKLSAgICBzaWduYWxzID0gW10KLSAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ1NJR0FMUk0nKToKLSAgICAgICAgc2lnbmFscy5hcHBlbmQoc2lnbmFsLlNJR0FMUk0pCi0gICAgaWYgaGFzYXR0cihzaWduYWwsICdTSUdVU1IxJyk6Ci0gICAgICAgIHNpZ25hbHMuYXBwZW5kKHNpZ25hbC5TSUdVU1IxKQotICAgIGZvciBzaWdudW0gaW4gc2lnbmFsczoKLSAgICAgICAgZmF1bHRoYW5kbGVyLnJlZ2lzdGVyKHNpZ251bSwgY2hhaW49VHJ1ZSkKLQotICAgIHJlcGxhY2Vfc3Rkb3V0KCkKLQotICAgIHN1cHBvcnQucmVjb3JkX29yaWdpbmFsX3N0ZG91dChzeXMuc3Rkb3V0KQotCi0gICAgbnMgPSBfcGFyc2VfYXJncyhzeXMuYXJndlsxOl0sICoqa3dhcmdzKQotCi0gICAgaWYgbnMuaHVudHJsZWFrczoKLSAgICAgICAgIyBBdm9pZCBmYWxzZSBwb3NpdGl2ZXMgZHVlIHRvIHZhcmlvdXMgY2FjaGVzCi0gICAgICAgICMgZmlsbGluZyBzbG93bHkgd2l0aCByYW5kb20gZGF0YToKLSAgICAgICAgd2FybV9jYWNoZXMoKQotICAgIGlmIG5zLm1lbWxpbWl0IGlzIG5vdCBOb25lOgotICAgICAgICBzdXBwb3J0LnNldF9tZW1saW1pdChucy5tZW1saW1pdCkKLSAgICBpZiBucy50aHJlc2hvbGQgaXMgbm90IE5vbmU6Ci0gICAgICAgIGltcG9ydCBnYwotICAgICAgICBnYy5zZXRfdGhyZXNob2xkKG5zLnRocmVzaG9sZCkKLSAgICBpZiBucy5ub3dpbmRvd3M6Ci0gICAgICAgIHByaW50KCdUaGUgLS1ub3dpbmRvd3MgKC1uKSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gJwotICAgICAgICAgICAgICAnVXNlIC12diB0byBkaXNwbGF5IGFzc2VydGlvbnMgaW4gc3RkZXJyLicpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgbXN2Y3J0Ci0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgbXN2Y3J0LlNldEVycm9yTW9kZShtc3ZjcnQuU0VNX0ZBSUxDUklUSUNBTEVSUk9SU3wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PQUxJR05NRU5URkFVTFRFWENFUFR8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LlNFTV9OT0dQRkFVTFRFUlJPUkJPWHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuU0VNX05PT1BFTkZJTEVFUlJPUkJPWCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydE1vZGUKLSAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgIyByZWxlYXNlIGJ1aWxkCi0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBmb3IgbSBpbiBbbXN2Y3J0LkNSVF9XQVJOLCBtc3ZjcnQuQ1JUX0VSUk9SLCBtc3ZjcnQuQ1JUX0FTU0VSVF06Ci0gICAgICAgICAgICAgICAgaWYgbnMudmVyYm9zZSBhbmQgbnMudmVyYm9zZSA+PSAyOgotICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCBtc3ZjcnQuQ1JUREJHX01PREVfRklMRSkKLSAgICAgICAgICAgICAgICAgICAgbXN2Y3J0LkNydFNldFJlcG9ydEZpbGUobSwgbXN2Y3J0LkNSVERCR19GSUxFX1NUREVSUikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZShtLCAwKQotICAgIGlmIG5zLndhaXQ6Ci0gICAgICAgIGlucHV0KCJQcmVzcyBhbnkga2V5IHRvIGNvbnRpbnVlLi4uIikKLQotICAgIGlmIG5zLnNsYXZlYXJncyBpcyBub3QgTm9uZToKLSAgICAgICAgYXJncywga3dhcmdzID0ganNvbi5sb2Fkcyhucy5zbGF2ZWFyZ3MpCi0gICAgICAgIGlmIGt3YXJncy5nZXQoJ2h1bnRybGVha3MnKToKLSAgICAgICAgICAgIHVuaXR0ZXN0LkJhc2VUZXN0U3VpdGUuX2NsZWFudXAgPSBGYWxzZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0KCphcmdzLCAqKmt3YXJncykKLSAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgcmVzdWx0ID0gSU5URVJSVVBURUQsICcnCi0gICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uIGFzIGU6Ci0gICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKLSAgICAgICAgICAgIHJlc3VsdCA9IENISUxEX0VSUk9SLCBzdHIoZSkKLSAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgIHByaW50KCkgICAjIEZvcmNlIGEgbmV3bGluZSAoanVzdCBpbiBjYXNlKQotICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdCkpCi0gICAgICAgIHN5cy5leGl0KDApCi0KLSAgICBnb29kID0gW10KLSAgICBiYWQgPSBbXQotICAgIHNraXBwZWQgPSBbXQotICAgIHJlc291cmNlX2RlbmllZHMgPSBbXQotICAgIGVudmlyb25tZW50X2NoYW5nZWQgPSBbXQotICAgIGludGVycnVwdGVkID0gRmFsc2UKLQotICAgIGlmIG5zLmZpbmRsZWFrczoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaW1wb3J0IGdjCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHByaW50KCdObyBHQyBhdmFpbGFibGUsIGRpc2FibGluZyBmaW5kbGVha3MuJykKLSAgICAgICAgICAgIG5zLmZpbmRsZWFrcyA9IEZhbHNlCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byByZXBvcnQgZ2FyYmFnZSB0aGF0IGlzIG5vdAotICAgICAgICAgICAgIyBmcmVlYWJsZSBieSByZWZlcmVuY2UgY291bnRpbmcgYWxvbmUuICBCeSBkZWZhdWx0IG9ubHkKLSAgICAgICAgICAgICMgZ2FyYmFnZSB0aGF0IGlzIG5vdCBjb2xsZWN0YWJsZSBieSB0aGUgR0MgaXMgcmVwb3J0ZWQuCi0gICAgICAgICAgICAjZ2Muc2V0X2RlYnVnKGdjLkRFQlVHX1NBVkVBTEwpCi0gICAgICAgICAgICBmb3VuZF9nYXJiYWdlID0gW10KLQotICAgIGlmIG5zLmh1bnRybGVha3M6Ci0gICAgICAgIHVuaXR0ZXN0LkJhc2VUZXN0U3VpdGUuX2NsZWFudXAgPSBGYWxzZQotCi0gICAgaWYgbnMuc2luZ2xlOgotICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAncHluZXh0dGVzdCcpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3InKSBhcyBmcDoKLSAgICAgICAgICAgICAgICBuZXh0X3Rlc3QgPSBmcC5yZWFkKCkuc3RyaXAoKQotICAgICAgICAgICAgICAgIHRlc3RzID0gW25leHRfdGVzdF0KLSAgICAgICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICBpZiBucy5mcm9tZmlsZToKLSAgICAgICAgdGVzdHMgPSBbXQotICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHN1cHBvcnQuU0FWRURDV0QsIG5zLmZyb21maWxlKSkgYXMgZnA6Ci0gICAgICAgICAgICBjb3VudF9wYXQgPSByZS5jb21waWxlKHInXFtccypcZCsvXHMqXGQrXF0nKQotICAgICAgICAgICAgZm9yIGxpbmUgaW4gZnA6Ci0gICAgICAgICAgICAgICAgbGluZSA9IGNvdW50X3BhdC5zdWIoJycsIGxpbmUpCi0gICAgICAgICAgICAgICAgZ3V0cyA9IGxpbmUuc3BsaXQoKSAjIGFzc3VtaW5nIG5vIHRlc3QgaGFzIHdoaXRlc3BhY2UgaW4gaXRzIG5hbWUKLSAgICAgICAgICAgICAgICBpZiBndXRzIGFuZCBub3QgZ3V0c1swXS5zdGFydHN3aXRoKCcjJyk6Ci0gICAgICAgICAgICAgICAgICAgIHRlc3RzLmV4dGVuZChndXRzKQotCi0gICAgIyBTdHJpcCAucHkgZXh0ZW5zaW9ucy4KLSAgICByZW1vdmVweShucy5hcmdzKQotICAgIHJlbW92ZXB5KHRlc3RzKQotCi0gICAgc3RkdGVzdHMgPSBTVERURVNUU1s6XQotICAgIG5vdHRlc3RzID0gTk9UVEVTVFMuY29weSgpCi0gICAgaWYgbnMuZXhjbHVkZToKLSAgICAgICAgZm9yIGFyZyBpbiBucy5hcmdzOgotICAgICAgICAgICAgaWYgYXJnIGluIHN0ZHRlc3RzOgotICAgICAgICAgICAgICAgIHN0ZHRlc3RzLnJlbW92ZShhcmcpCi0gICAgICAgICAgICBub3R0ZXN0cy5hZGQoYXJnKQotICAgICAgICBucy5hcmdzID0gW10KLQotICAgICMgRm9yIGEgcGFydGlhbCBydW4sIHdlIGRvIG5vdCBuZWVkIHRvIGNsdXR0ZXIgdGhlIG91dHB1dC4KLSAgICBpZiAobnMudmVyYm9zZSBvciBucy5oZWFkZXIgb3IKLSAgICAgICAgICAgIG5vdCAobnMucGdvIG9yIG5zLnF1aWV0IG9yIG5zLnNpbmdsZSBvciB0ZXN0cyBvciBucy5hcmdzKSk6Ci0gICAgICAgICMgUHJpbnQgYmFzaWMgcGxhdGZvcm0gaW5mb3JtYXRpb24KLSAgICAgICAgcHJpbnQoIj09IiwgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksICpzeXMudmVyc2lvbi5zcGxpdCgpKQotICAgICAgICBwcmludCgiPT0gICIsIHBsYXRmb3JtLnBsYXRmb3JtKGFsaWFzZWQ9VHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXMtZW5kaWFuIiAlIHN5cy5ieXRlb3JkZXIpCi0gICAgICAgIHByaW50KCI9PSAgIiwgImhhc2ggYWxnb3JpdGhtOiIsIHN5cy5oYXNoX2luZm8uYWxnb3JpdGhtLAotICAgICAgICAgICAgICAgICI2NGJpdCIgaWYgc3lzLm1heHNpemUgPiAyKiozMiBlbHNlICIzMmJpdCIpCi0gICAgICAgIHByaW50KCI9PSAgIiwgb3MuZ2V0Y3dkKCkpCi0gICAgICAgIHByaW50KCJUZXN0aW5nIHdpdGggZmxhZ3M6Iiwgc3lzLmZsYWdzKQotCi0gICAgIyBpZiB0ZXN0ZGlyIGlzIHNldCwgdGhlbiB3ZSBhcmUgbm90IHJ1bm5pbmcgdGhlIHB5dGhvbiB0ZXN0cyBzdWl0ZSwgc28KLSAgICAjIGRvbid0IGFkZCBkZWZhdWx0IHRlc3RzIHRvIGJlIGV4ZWN1dGVkIG9yIHNraXBwZWQgKHBhc3MgZW1wdHkgdmFsdWVzKQotICAgIGlmIG5zLnRlc3RkaXI6Ci0gICAgICAgIGFsbHRlc3RzID0gZmluZHRlc3RzKG5zLnRlc3RkaXIsIGxpc3QoKSwgc2V0KCkpCi0gICAgZWxzZToKLSAgICAgICAgYWxsdGVzdHMgPSBmaW5kdGVzdHMobnMudGVzdGRpciwgc3RkdGVzdHMsIG5vdHRlc3RzKQotCi0gICAgc2VsZWN0ZWQgPSB0ZXN0cyBvciBucy5hcmdzIG9yIGFsbHRlc3RzCi0gICAgaWYgbnMuc2luZ2xlOgotICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkWzoxXQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBuZXh0X3NpbmdsZV90ZXN0ID0gYWxsdGVzdHNbYWxsdGVzdHMuaW5kZXgoc2VsZWN0ZWRbMF0pKzFdCi0gICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgbmV4dF9zaW5nbGVfdGVzdCA9IE5vbmUKLSAgICAjIFJlbW92ZSBhbGwgdGhlIHNlbGVjdGVkIHRlc3RzIHRoYXQgcHJlY2VkZSBzdGFydCBpZiBpdCdzIHNldC4KLSAgICBpZiBucy5zdGFydDoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZGVsIHNlbGVjdGVkWzpzZWxlY3RlZC5pbmRleChucy5zdGFydCldCi0gICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcHJpbnQoIkNvdWxkbid0IGZpbmQgc3RhcnRpbmcgdGVzdCAoJXMpLCB1c2luZyBhbGwgdGVzdHMiICUgbnMuc3RhcnQpCi0gICAgaWYgbnMucmFuZG9taXplOgotICAgICAgICBpZiBucy5yYW5kb21fc2VlZCBpcyBOb25lOgotICAgICAgICAgICAgbnMucmFuZG9tX3NlZWQgPSByYW5kb20ucmFuZHJhbmdlKDEwMDAwMDAwKQotICAgICAgICByYW5kb20uc2VlZChucy5yYW5kb21fc2VlZCkKLSAgICAgICAgcHJpbnQoIlVzaW5nIHJhbmRvbSBzZWVkIiwgbnMucmFuZG9tX3NlZWQpCi0gICAgICAgIHJhbmRvbS5zaHVmZmxlKHNlbGVjdGVkKQotICAgIGlmIG5zLnRyYWNlOgotICAgICAgICBpbXBvcnQgdHJhY2UsIHRlbXBmaWxlCi0gICAgICAgIHRyYWNlciA9IHRyYWNlLlRyYWNlKGlnbm9yZWRpcnM9W3N5cy5iYXNlX3ByZWZpeCwgc3lzLmJhc2VfZXhlY19wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBmaWxlLmdldHRlbXBkaXIoKV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlPUZhbHNlLCBjb3VudD1UcnVlKQotCi0gICAgdGVzdF90aW1lcyA9IFtdCi0gICAgc3VwcG9ydC52ZXJib3NlID0gbnMudmVyYm9zZSAgICAgICMgVGVsbCB0ZXN0cyB0byBiZSBtb2RlcmF0ZWx5IHF1aWV0Ci0gICAgc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gbnMudXNlX3Jlc291cmNlcwotICAgIHNhdmVfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmtleXMoKQotCi0gICAgZGVmIGFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIHJlc3VsdCk6Ci0gICAgICAgIG9rLCB0ZXN0X3RpbWUgPSByZXN1bHQKLSAgICAgICAgaWYgb2sgbm90IGluIChDSElMRF9FUlJPUiwgSU5URVJSVVBURUQpOgotICAgICAgICAgICAgdGVzdF90aW1lcy5hcHBlbmQoKHRlc3RfdGltZSwgdGVzdCkpCi0gICAgICAgIGlmIG9rID09IFBBU1NFRDoKLSAgICAgICAgICAgIGdvb2QuYXBwZW5kKHRlc3QpCi0gICAgICAgIGVsaWYgb2sgPT0gRkFJTEVEOgotICAgICAgICAgICAgYmFkLmFwcGVuZCh0ZXN0KQotICAgICAgICBlbGlmIG9rID09IEVOVl9DSEFOR0VEOgotICAgICAgICAgICAgZW52aXJvbm1lbnRfY2hhbmdlZC5hcHBlbmQodGVzdCkKLSAgICAgICAgZWxpZiBvayA9PSBTS0lQUEVEOgotICAgICAgICAgICAgc2tpcHBlZC5hcHBlbmQodGVzdCkKLSAgICAgICAgZWxpZiBvayA9PSBSRVNPVVJDRV9ERU5JRUQ6Ci0gICAgICAgICAgICBza2lwcGVkLmFwcGVuZCh0ZXN0KQotICAgICAgICAgICAgcmVzb3VyY2VfZGVuaWVkcy5hcHBlbmQodGVzdCkKLQotICAgIGlmIG5zLmZvcmV2ZXI6Ci0gICAgICAgIGRlZiB0ZXN0X2ZvcmV2ZXIodGVzdHM9bGlzdChzZWxlY3RlZCkpOgotICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKLSAgICAgICAgICAgICAgICAgICAgeWllbGQgdGVzdAotICAgICAgICAgICAgICAgICAgICBpZiBiYWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgdGVzdHMgPSB0ZXN0X2ZvcmV2ZXIoKQotICAgICAgICB0ZXN0X2NvdW50ID0gJycKLSAgICAgICAgdGVzdF9jb3VudF93aWR0aCA9IDMKLSAgICBlbHNlOgotICAgICAgICB0ZXN0cyA9IGl0ZXIoc2VsZWN0ZWQpCi0gICAgICAgIHRlc3RfY291bnQgPSAnL3t9Jy5mb3JtYXQobGVuKHNlbGVjdGVkKSkKLSAgICAgICAgdGVzdF9jb3VudF93aWR0aCA9IGxlbih0ZXN0X2NvdW50KSAtIDEKLQotICAgIGlmIG5zLnVzZV9tcDoKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZAotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICBwcmludCgiTXVsdGlwcm9jZXNzIG9wdGlvbiByZXF1aXJlcyB0aHJlYWQgc3VwcG9ydCIpCi0gICAgICAgICAgICBzeXMuZXhpdCgyKQotICAgICAgICBmcm9tIHF1ZXVlIGltcG9ydCBRdWV1ZQotICAgICAgICBkZWJ1Z19vdXRwdXRfcGF0ID0gcmUuY29tcGlsZShyIlxbXGQrIHJlZnMsIFxkKyBibG9ja3NcXSQiKQotICAgICAgICBvdXRwdXQgPSBRdWV1ZSgpCi0gICAgICAgIHBlbmRpbmcgPSBNdWx0aXByb2Nlc3NUZXN0cyh0ZXN0cykKLSAgICAgICAgZGVmIHdvcmsoKToKLSAgICAgICAgICAgICMgQSB3b3JrZXIgdGhyZWFkLgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgPSBuZXh0KHBlbmRpbmcpCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgcmV0Y29kZSwgc3Rkb3V0LCBzdGRlcnIgPSBydW5fdGVzdF9pbl9zdWJwcm9jZXNzKHRlc3QsIG5zKQotICAgICAgICAgICAgICAgICAgICAjIFN0cmlwIGxhc3QgcmVmY291bnQgb3V0cHV0IGxpbmUgaWYgaXQgZXhpc3RzLCBzaW5jZSBpdAotICAgICAgICAgICAgICAgICAgICAjIGNvbWVzIGZyb20gdGhlIHNodXRkb3duIG9mIHRoZSBpbnRlcnByZXRlciBpbiB0aGUgc3ViY29tbWFuZC4KLSAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gZGVidWdfb3V0cHV0X3BhdC5zdWIoIiIsIHN0ZGVycikKLSAgICAgICAgICAgICAgICAgICAgc3Rkb3V0LCBfLCByZXN1bHQgPSBzdGRvdXQuc3RyaXAoKS5ycGFydGl0aW9uKCJcbiIpCi0gICAgICAgICAgICAgICAgICAgIGlmIHJldGNvZGUgIT0gMDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChDSElMRF9FUlJPUiwgIkV4aXQgY29kZSAlcyIgJSByZXRjb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgodGVzdCwgc3Rkb3V0LnJzdHJpcCgpLCBzdGRlcnIucnN0cmlwKCksIHJlc3VsdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZHMocmVzdWx0KQotICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwgcmVzdWx0KSkKLSAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgotICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQotICAgICAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIHdvcmtlcnMgPSBbVGhyZWFkKHRhcmdldD13b3JrKSBmb3IgaSBpbiByYW5nZShucy51c2VfbXApXQotICAgICAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6Ci0gICAgICAgICAgICB3b3JrZXIuc3RhcnQoKQotICAgICAgICBmaW5pc2hlZCA9IDAKLSAgICAgICAgdGVzdF9pbmRleCA9IDEKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2hpbGUgZmluaXNoZWQgPCBucy51c2VfbXA6Ci0gICAgICAgICAgICAgICAgdGVzdCwgc3Rkb3V0LCBzdGRlcnIsIHJlc3VsdCA9IG91dHB1dC5nZXQoKQotICAgICAgICAgICAgICAgIGlmIHRlc3QgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgKz0gMQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIHJlc3VsdCkKLSAgICAgICAgICAgICAgICBpZiBub3QgbnMucXVpZXQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGJhZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfS97M31dIHs0fSIKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfV0gezR9IgotICAgICAgICAgICAgICAgICAgICBwcmludChmbXQuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9jb3VudF93aWR0aCwgdGVzdF9pbmRleCwgdGVzdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbihiYWQpLCB0ZXN0KSkKLSAgICAgICAgICAgICAgICBpZiBzdGRvdXQ6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KHN0ZG91dCkKLSAgICAgICAgICAgICAgICBpZiBzdGRlcnIgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KHN0ZGVyciwgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBJTlRFUlJVUFRFRDoKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKLSAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gQ0hJTERfRVJST1I6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQ2hpbGQgZXJyb3Igb24ge306IHt9Ii5mb3JtYXQodGVzdCwgcmVzdWx0WzFdKSkKLSAgICAgICAgICAgICAgICB0ZXN0X2luZGV4ICs9IDEKLSAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSBUcnVlCi0gICAgICAgICAgICBwZW5kaW5nLmludGVycnVwdGVkID0gVHJ1ZQotICAgICAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6Ci0gICAgICAgICAgICB3b3JrZXIuam9pbigpCi0gICAgZWxzZToKLSAgICAgICAgZm9yIHRlc3RfaW5kZXgsIHRlc3QgaW4gZW51bWVyYXRlKHRlc3RzLCAxKToKLSAgICAgICAgICAgIGlmIG5vdCBucy5xdWlldDoKLSAgICAgICAgICAgICAgICBpZiBiYWQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgICAgICAgICAgICAgIGZtdCA9ICJbezE6ezB9fXsyfS97M31dIHs0fSIKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBmbXQgPSAiW3sxOnswfX17Mn1dIHs0fSIKLSAgICAgICAgICAgICAgICBwcmludChmbXQuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICB0ZXN0X2NvdW50X3dpZHRoLCB0ZXN0X2luZGV4LCB0ZXN0X2NvdW50LCBsZW4oYmFkKSwgdGVzdCkpCi0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCi0gICAgICAgICAgICBpZiBucy50cmFjZToKLSAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIHRyYWNpbmcgY29kZSBjb3ZlcmFnZSwgdGhlbiB3ZSBkb24ndCBleGl0IHdpdGggc3RhdHVzCi0gICAgICAgICAgICAgICAgIyBpZiBvbiBhIGZhbHNlIHJldHVybiB2YWx1ZSBmcm9tIG1haW4uCi0gICAgICAgICAgICAgICAgdHJhY2VyLnJ1bmN0eCgncnVudGVzdCh0ZXN0LCBucy52ZXJib3NlLCBucy5xdWlldCwgdGltZW91dD1ucy50aW1lb3V0KScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxzPWdsb2JhbHMoKSwgbG9jYWxzPXZhcnMoKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0KHRlc3QsIG5zLnZlcmJvc2UsIG5zLnF1aWV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zLmh1bnRybGVha3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X29uX2ZhaWx1cmU9bnMudmVyYm9zZTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1ucy50aW1lb3V0LCBmYWlsZmFzdD1ucy5mYWlsZmFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF90ZXN0cz1ucy5tYXRjaF90ZXN0cywgcGdvPW5zLnBnbykKLSAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQotICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSBUcnVlCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBpZiBucy5maW5kbGVha3M6Ci0gICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgICAgICAgICAgaWYgZ2MuZ2FyYmFnZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoIldhcm5pbmc6IHRlc3QgY3JlYXRlZCIsIGxlbihnYy5nYXJiYWdlKSwgZW5kPScgJykKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQoInVuY29sbGVjdGFibGUgb2JqZWN0KHMpLiIpCi0gICAgICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgdW5jb2xsZWN0YWJsZSBvYmplY3RzIHNvbWV3aGVyZSBzbyB3ZSBkb24ndCBzZWUKLSAgICAgICAgICAgICAgICAgICAgIyB0aGVtIGFnYWluCi0gICAgICAgICAgICAgICAgICAgIGZvdW5kX2dhcmJhZ2UuZXh0ZW5kKGdjLmdhcmJhZ2UpCi0gICAgICAgICAgICAgICAgICAgIGRlbCBnYy5nYXJiYWdlWzpdCi0gICAgICAgICAgICAjIFVubG9hZCB0aGUgbmV3bHkgaW1wb3J0ZWQgbW9kdWxlcyAoYmVzdCBlZmZvcnQgZmluYWxpemF0aW9uKQotICAgICAgICAgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6Ci0gICAgICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzYXZlX21vZHVsZXMgYW5kIG1vZHVsZS5zdGFydHN3aXRoKCJ0ZXN0LiIpOgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnVubG9hZChtb2R1bGUpCi0KLSAgICBpZiBpbnRlcnJ1cHRlZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgIyBwcmludCBhIG5ld2xpbmUgYWZ0ZXIgXkMKLSAgICAgICAgcHJpbnQoKQotICAgICAgICBwcmludCgiVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULiIpCi0gICAgICAgIG9taXR0ZWQgPSBzZXQoc2VsZWN0ZWQpIC0gc2V0KGdvb2QpIC0gc2V0KGJhZCkgLSBzZXQoc2tpcHBlZCkKLSAgICAgICAgcHJpbnQoY291bnQobGVuKG9taXR0ZWQpLCAidGVzdCIpLCAib21pdHRlZDoiKQotICAgICAgICBwcmludGxpc3Qob21pdHRlZCkKLSAgICBpZiBnb29kIGFuZCBub3QgbnMucXVpZXQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgIGlmIG5vdCBiYWQgYW5kIG5vdCBza2lwcGVkIGFuZCBub3QgaW50ZXJydXB0ZWQgYW5kIGxlbihnb29kKSA+IDE6Ci0gICAgICAgICAgICBwcmludCgiQWxsIiwgZW5kPScgJykKLSAgICAgICAgcHJpbnQoY291bnQobGVuKGdvb2QpLCAidGVzdCIpLCAiT0suIikKLSAgICBpZiBucy5wcmludF9zbG93OgotICAgICAgICB0ZXN0X3RpbWVzLnNvcnQocmV2ZXJzZT1UcnVlKQotICAgICAgICBwcmludCgiMTAgc2xvd2VzdCB0ZXN0czoiKQotICAgICAgICBmb3IgdGltZSwgdGVzdCBpbiB0ZXN0X3RpbWVzWzoxMF06Ci0gICAgICAgICAgICBwcmludCgiJXM6ICUuMWZzIiAlICh0ZXN0LCB0aW1lKSkKLSAgICBpZiBiYWQgYW5kIG5vdCBucy5wZ286Ci0gICAgICAgIHByaW50KGNvdW50KGxlbihiYWQpLCAidGVzdCIpLCAiZmFpbGVkOiIpCi0gICAgICAgIHByaW50bGlzdChiYWQpCi0gICAgaWYgZW52aXJvbm1lbnRfY2hhbmdlZCBhbmQgbm90IG5zLnBnbzoKLSAgICAgICAgcHJpbnQoInt9IGFsdGVyZWQgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudDoiLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgY291bnQobGVuKGVudmlyb25tZW50X2NoYW5nZWQpLCAidGVzdCIpKSkKLSAgICAgICAgcHJpbnRsaXN0KGVudmlyb25tZW50X2NoYW5nZWQpCi0gICAgaWYgc2tpcHBlZCBhbmQgbm90IG5zLnF1aWV0IGFuZCBub3QgbnMucGdvOgotICAgICAgICBwcmludChjb3VudChsZW4oc2tpcHBlZCksICJ0ZXN0IiksICJza2lwcGVkOiIpCi0gICAgICAgIHByaW50bGlzdChza2lwcGVkKQotCi0gICAgaWYgbnMudmVyYm9zZTIgYW5kIGJhZDoKLSAgICAgICAgcHJpbnQoIlJlLXJ1bm5pbmcgZmFpbGVkIHRlc3RzIGluIHZlcmJvc2UgbW9kZSIpCi0gICAgICAgIGZvciB0ZXN0IGluIGJhZFs6XToKLSAgICAgICAgICAgIGlmIG5vdCBucy5wZ286Ci0gICAgICAgICAgICAgICAgcHJpbnQoIlJlLXJ1bm5pbmcgdGVzdCAlciBpbiB2ZXJib3NlIG1vZGUiICUgdGVzdCkKLSAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG5zLnZlcmJvc2UgPSBUcnVlCi0gICAgICAgICAgICAgICAgb2sgPSBydW50ZXN0KHRlc3QsIFRydWUsIG5zLnF1aWV0LCBucy5odW50cmxlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PW5zLnRpbWVvdXQsIHBnbz1ucy5wZ28pCi0gICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgICAgICAgICAgIyBwcmludCBhIG5ld2xpbmUgc2VwYXJhdGUgZnJvbSB0aGUgXkMKLSAgICAgICAgICAgICAgICBwcmludCgpCi0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgb2tbMF0gaW4ge1BBU1NFRCwgRU5WX0NIQU5HRUQsIFNLSVBQRUQsIFJFU09VUkNFX0RFTklFRH06Ci0gICAgICAgICAgICAgICAgICAgIGJhZC5yZW1vdmUodGVzdCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGlmIGJhZDoKLSAgICAgICAgICAgICAgICBwcmludChjb3VudChsZW4oYmFkKSwgJ3Rlc3QnKSwgImZhaWxlZCBhZ2FpbjoiKQotICAgICAgICAgICAgICAgIHByaW50bGlzdChiYWQpCi0KLSAgICBpZiBucy5zaW5nbGU6Ci0gICAgICAgIGlmIG5leHRfc2luZ2xlX3Rlc3Q6Ci0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZnA6Ci0gICAgICAgICAgICAgICAgZnAud3JpdGUobmV4dF9zaW5nbGVfdGVzdCArICdcbicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCi0KLSAgICBpZiBucy50cmFjZToKLSAgICAgICAgciA9IHRyYWNlci5yZXN1bHRzKCkKLSAgICAgICAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBzdW1tYXJ5PVRydWUsIGNvdmVyZGlyPW5zLmNvdmVyZGlyKQotCi0gICAgaWYgbnMucnVubGVha3M6Ci0gICAgICAgIG9zLnN5c3RlbSgibGVha3MgJWQiICUgb3MuZ2V0cGlkKCkpCi0KLSAgICBzeXMuZXhpdChsZW4oYmFkKSA+IDAgb3IgaW50ZXJydXB0ZWQpCi0KLQotIyBzbWFsbCBzZXQgb2YgdGVzdHMgdG8gZGV0ZXJtaW5lIGlmIHdlIGhhdmUgYSBiYXNpY2FsbHkgZnVuY3Rpb25pbmcgaW50ZXJwcmV0ZXIKLSMgKGkuZS4gaWYgYW55IG9mIHRoZXNlIGZhaWwsIHRoZW4gYW55dGhpbmcgZWxzZSBpcyBsaWtlbHkgdG8gZm9sbG93KQotU1REVEVTVFMgPSBbCi0gICAgJ3Rlc3RfZ3JhbW1hcicsCi0gICAgJ3Rlc3Rfb3Bjb2RlcycsCi0gICAgJ3Rlc3RfZGljdCcsCi0gICAgJ3Rlc3RfYnVpbHRpbicsCi0gICAgJ3Rlc3RfZXhjZXB0aW9ucycsCi0gICAgJ3Rlc3RfdHlwZXMnLAotICAgICd0ZXN0X3VuaXR0ZXN0JywKLSAgICAndGVzdF9kb2N0ZXN0JywKLSAgICAndGVzdF9kb2N0ZXN0MicsCi0gICAgJ3Rlc3Rfc3VwcG9ydCcKLV0KLQotIyBzZXQgb2YgdGVzdHMgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGJlIGV4ZWN1dGVkIHdoZW4gdXNpbmcgcmVncnRlc3QKLU5PVFRFU1RTID0gc2V0KCkKLQotZGVmIGZpbmR0ZXN0cyh0ZXN0ZGlyPU5vbmUsIHN0ZHRlc3RzPVNURFRFU1RTLCBub3R0ZXN0cz1OT1RURVNUUyk6Ci0gICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXBwbGljYWJsZSB0ZXN0IG1vZHVsZXMuIiIiCi0gICAgdGVzdGRpciA9IGZpbmR0ZXN0ZGlyKHRlc3RkaXIpCi0gICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRlc3RkaXIpCi0gICAgdGVzdHMgPSBbXQotICAgIG90aGVycyA9IHNldChzdGR0ZXN0cykgfCBub3R0ZXN0cwotICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICBtb2QsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKLSAgICAgICAgaWYgbW9kWzo1XSA9PSAidGVzdF8iIGFuZCBleHQgaW4gKCIucHkiLCAiIikgYW5kIG1vZCBub3QgaW4gb3RoZXJzOgotICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZCkKLSAgICByZXR1cm4gc3RkdGVzdHMgKyBzb3J0ZWQodGVzdHMpCi0KLSMgV2UgZG8gbm90IHVzZSBhIGdlbmVyYXRvciBzbyBtdWx0aXBsZSB0aHJlYWRzIGNhbiBjYWxsIG5leHQoKS4KLWNsYXNzIE11bHRpcHJvY2Vzc1Rlc3RzKG9iamVjdCk6Ci0KLSAgICAiIiJBIHRocmVhZC1zYWZlIGl0ZXJhdG9yIG92ZXIgdGVzdHMgZm9yIG11bHRpcHJvY2VzcyBtb2RlLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RzKToKLSAgICAgICAgc2VsZi5pbnRlcnJ1cHRlZCA9IEZhbHNlCi0gICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5Mb2NrKCkKLSAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCi0KLSAgICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgX19uZXh0X18oc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5sb2NrOgotICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnJ1cHRlZDoKLSAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCd0ZXN0cyBpbnRlcnJ1cHRlZCcpCi0gICAgICAgICAgICByZXR1cm4gbmV4dChzZWxmLnRlc3RzKQotCi1kZWYgcmVwbGFjZV9zdGRvdXQoKToKLSAgICAiIiJTZXQgc3Rkb3V0IGVuY29kZXIgZXJyb3IgaGFuZGxlciB0byBiYWNrc2xhc2hyZXBsYWNlIChhcyBzdGRlcnIgZXJyb3IKLSAgICBoYW5kbGVyKSB0byBhdm9pZCBVbmljb2RlRW5jb2RlRXJyb3Igd2hlbiBwcmludGluZyBhIHRyYWNlYmFjayIiIgotICAgIGltcG9ydCBhdGV4aXQKLQotICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKLSAgICBzeXMuc3Rkb3V0ID0gb3BlbihzdGRvdXQuZmlsZW5vKCksICd3JywKLSAgICAgICAgZW5jb2Rpbmc9c3Rkb3V0LmVuY29kaW5nLAotICAgICAgICBlcnJvcnM9ImJhY2tzbGFzaHJlcGxhY2UiLAotICAgICAgICBjbG9zZWZkPUZhbHNlLAotICAgICAgICBuZXdsaW5lPSdcbicpCi0KLSAgICBkZWYgcmVzdG9yZV9zdGRvdXQoKToKLSAgICAgICAgc3lzLnN0ZG91dC5jbG9zZSgpCi0gICAgICAgIHN5cy5zdGRvdXQgPSBzdGRvdXQKLSAgICBhdGV4aXQucmVnaXN0ZXIocmVzdG9yZV9zdGRvdXQpCi0KLWRlZiBydW50ZXN0KHRlc3QsIHZlcmJvc2UsIHF1aWV0LAotICAgICAgICAgICAgaHVudHJsZWFrcz1GYWxzZSwgdXNlX3Jlc291cmNlcz1Ob25lLAotICAgICAgICAgICAgb3V0cHV0X29uX2ZhaWx1cmU9RmFsc2UsIGZhaWxmYXN0PUZhbHNlLCBtYXRjaF90ZXN0cz1Ob25lLAotICAgICAgICAgICAgdGltZW91dD1Ob25lLCAqLCBwZ289RmFsc2UpOgotICAgICIiIlJ1biBhIHNpbmdsZSB0ZXN0LgotCi0gICAgdGVzdCAtLSB0aGUgbmFtZSBvZiB0aGUgdGVzdAotICAgIHZlcmJvc2UgLS0gaWYgdHJ1ZSwgcHJpbnQgbW9yZSBtZXNzYWdlcwotICAgIHF1aWV0IC0tIGlmIHRydWUsIGRvbid0IHByaW50ICdza2lwcGVkJyBtZXNzYWdlcyAocHJvYmFibHkgcmVkdW5kYW50KQotICAgIGh1bnRybGVha3MgLS0gcnVuIG11bHRpcGxlIHRpbWVzIHRvIHRlc3QgZm9yIGxlYWtzOyByZXF1aXJlcyBhIGRlYnVnCi0gICAgICAgICAgICAgICAgICBidWlsZDsgYSB0cmlwbGUgY29ycmVzcG9uZGluZyB0byAtUidzIHRocmVlIGFyZ3VtZW50cwotICAgIHVzZV9yZXNvdXJjZXMgLS0gbGlzdCBvZiBleHRyYSByZXNvdXJjZXMgdG8gdXNlCi0gICAgb3V0cHV0X29uX2ZhaWx1cmUgLS0gaWYgdHJ1ZSwgZGlzcGxheSB0ZXN0IG91dHB1dCBvbiBmYWlsdXJlCi0gICAgdGltZW91dCAtLSBkdW1wIHRoZSB0cmFjZWJhY2sgYW5kIGV4aXQgaWYgYSB0ZXN0IHRha2VzIG1vcmUgdGhhbgotICAgICAgICAgICAgICAgdGltZW91dCBzZWNvbmRzCi0gICAgZmFpbGZhc3QsIG1hdGNoX3Rlc3RzIC0tIFNlZSByZWdydGVzdCBjb21tYW5kLWxpbmUgZmxhZ3MgZm9yIHRoZXNlLgotICAgIHBnbyAtLSBpZiB0cnVlLCBkbyBub3QgcHJpbnQgdW5uZWNlc3NhcnkgaW5mbyB3aGVuIHJ1bm5pbmcgdGhlIHRlc3QKLSAgICAgICAgICAgZm9yIFByb2ZpbGUgR3VpZGVkIE9wdGltaXphdGlvbiBidWlsZAotCi0gICAgUmV0dXJucyB0aGUgdHVwbGUgcmVzdWx0LCB0ZXN0X3RpbWUsIHdoZXJlIHJlc3VsdCBpcyBvbmUgb2YgdGhlIGNvbnN0YW50czoKLSAgICAgICAgSU5URVJSVVBURUQgICAgICBLZXlib2FyZEludGVycnVwdCB3aGVuIHJ1biB1bmRlciAtagotICAgICAgICBSRVNPVVJDRV9ERU5JRUQgIHRlc3Qgc2tpcHBlZCBiZWNhdXNlIHJlc291cmNlIGRlbmllZAotICAgICAgICBTS0lQUEVEICAgICAgICAgIHRlc3Qgc2tpcHBlZCBmb3Igc29tZSBvdGhlciByZWFzb24KLSAgICAgICAgRU5WX0NIQU5HRUQgICAgICB0ZXN0IGZhaWxlZCBiZWNhdXNlIGl0IGNoYW5nZWQgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudAotICAgICAgICBGQUlMRUQgICAgICAgICAgIHRlc3QgZmFpbGVkCi0gICAgICAgIFBBU1NFRCAgICAgICAgICAgdGVzdCBwYXNzZWQKLSAgICAiIiIKLSAgICBpZiB1c2VfcmVzb3VyY2VzIGlzIG5vdCBOb25lOgotICAgICAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSB1c2VfcmVzb3VyY2VzCi0gICAgdXNlX3RpbWVvdXQgPSAodGltZW91dCBpcyBub3QgTm9uZSkKLSAgICBpZiB1c2VfdGltZW91dDoKLSAgICAgICAgZmF1bHRoYW5kbGVyLmR1bXBfdHJhY2ViYWNrX2xhdGVyKHRpbWVvdXQsIGV4aXQ9VHJ1ZSkKLSAgICB0cnk6Ci0gICAgICAgIHN1cHBvcnQubWF0Y2hfdGVzdHMgPSBtYXRjaF90ZXN0cwotICAgICAgICBpZiBmYWlsZmFzdDoKLSAgICAgICAgICAgIHN1cHBvcnQuZmFpbGZhc3QgPSBUcnVlCi0gICAgICAgIGlmIG91dHB1dF9vbl9mYWlsdXJlOgotICAgICAgICAgICAgc3VwcG9ydC52ZXJib3NlID0gVHJ1ZQotCi0gICAgICAgICAgICAjIFJldXNlIHRoZSBzYW1lIGluc3RhbmNlIHRvIGFsbCBjYWxscyB0byBydW50ZXN0KCkuIFNvbWUKLSAgICAgICAgICAgICMgdGVzdHMga2VlcCBhIHJlZmVyZW5jZSB0byBzeXMuc3Rkb3V0IG9yIHN5cy5zdGRlcnIKLSAgICAgICAgICAgICMgKGVnLiB0ZXN0X2FyZ3BhcnNlKS4KLSAgICAgICAgICAgIGlmIHJ1bnRlc3Quc3RyaW5naW8gaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBpby5TdHJpbmdJTygpCi0gICAgICAgICAgICAgICAgcnVudGVzdC5zdHJpbmdpbyA9IHN0cmVhbQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBydW50ZXN0LnN0cmluZ2lvCi0gICAgICAgICAgICAgICAgc3RyZWFtLnNlZWsoMCkKLSAgICAgICAgICAgICAgICBzdHJlYW0udHJ1bmNhdGUoKQotCi0gICAgICAgICAgICBvcmlnX3N0ZG91dCA9IHN5cy5zdGRvdXQKLSAgICAgICAgICAgIG9yaWdfc3RkZXJyID0gc3lzLnN0ZGVycgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzdHJlYW0KLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3RyZWFtCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmFpbHVyZT1GYWxzZSwgcGdvPXBnbykKLSAgICAgICAgICAgICAgICBpZiByZXN1bHRbMF0gPT0gRkFJTEVEIGFuZCBub3QgcGdvOgotICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzdHJlYW0uZ2V0dmFsdWUoKQotICAgICAgICAgICAgICAgICAgICBvcmlnX3N0ZGVyci53cml0ZShvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgIG9yaWdfc3RkZXJyLmZsdXNoKCkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9yaWdfc3Rkb3V0Ci0gICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9yaWdfc3RkZXJyCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzdXBwb3J0LnZlcmJvc2UgPSB2ZXJib3NlICAjIFRlbGwgdGVzdHMgdG8gYmUgbW9kZXJhdGVseSBxdWlldAotICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mYWlsdXJlPW5vdCB2ZXJib3NlLCBwZ289cGdvKQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgZmluYWxseToKLSAgICAgICAgaWYgdXNlX3RpbWVvdXQ6Ci0gICAgICAgICAgICBmYXVsdGhhbmRsZXIuY2FuY2VsX2R1bXBfdHJhY2ViYWNrX2xhdGVyKCkKLSAgICAgICAgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0LCB2ZXJib3NlKQotcnVudGVzdC5zdHJpbmdpbyA9IE5vbmUKLQotIyBVbml0IHRlc3RzIGFyZSBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IHVuY2hhbmdlZAotIyBvbmNlIHRoZXkgY29tcGxldGUuICBCdXQgc29tZXRpbWVzIHRlc3RzIGhhdmUgYnVncywgZXNwZWNpYWxseSB3aGVuCi0jIHRlc3RzIGZhaWwsIGFuZCB0aGUgY2hhbmdlcyB0byBlbnZpcm9ubWVudCBnbyBvbiB0byBtZXNzIHVwIG90aGVyCi0jIHRlc3RzLiAgVGhpcyBjYW4gY2F1c2UgaXNzdWVzIHdpdGggYnVpbGRib3Qgc3RhYmlsaXR5LCBzaW5jZSB0ZXN0cwotIyBhcmUgcnVuIGluIHJhbmRvbSBvcmRlciBhbmQgc28gcHJvYmxlbXMgbWF5IGFwcGVhciB0byBjb21lIGFuZCBnby4KLSMgVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB3ZSBjYW4gc2F2ZSBhbmQgcmVzdG9yZSB0byBtaXRpZ2F0ZSB0aGlzLCBhbmQKLSMgdGhlIGZvbGxvd2luZyBjb250ZXh0IG1hbmFnZXIgaGFuZGxlcyB0aGlzIHRhc2suCi0KLWNsYXNzIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQ6Ci0gICAgIiIiU2F2ZSBiaXRzIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCByZXN0b3JlIHRoZW0gYXQgYmxvY2sgZXhpdC4KLQotICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdG5hbWUsIHZlcmJvc2UsIHF1aWV0KToKLSAgICAgICAgICAgICNzdHVmZgotCi0gICAgVW5sZXNzIHF1aWV0IGlzIFRydWUsIGEgd2FybmluZyBpcyBwcmludGVkIHRvIHN0ZGVyciBpZiBhbnkgb2YKLSAgICB0aGUgc2F2ZWQgaXRlbXMgd2FzIGNoYW5nZWQgYnkgdGhlIHRlc3QuICBUaGUgYXR0cmlidXRlICdjaGFuZ2VkJwotICAgIGlzIGluaXRpYWxseSBGYWxzZSwgYnV0IGlzIHNldCB0byBUcnVlIGlmIGEgY2hhbmdlIGlzIGRldGVjdGVkLgotCi0gICAgSWYgdmVyYm9zZSBpcyBtb3JlIHRoYW4gMSwgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgc3RhdGUgb2YgY2hhbmdlZAotICAgIGl0ZW1zIGlzIGFsc28gcHJpbnRlZC4KLSAgICAiIiIKLQotICAgIGNoYW5nZWQgPSBGYWxzZQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RuYW1lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLCAqLCBwZ289RmFsc2UpOgotICAgICAgICBzZWxmLnRlc3RuYW1lID0gdGVzdG5hbWUKLSAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQotICAgICAgICBzZWxmLnF1aWV0ID0gcXVpZXQKLSAgICAgICAgc2VsZi5wZ28gPSBwZ28KLQotICAgICMgVG8gYWRkIHRoaW5ncyB0byBzYXZlIGFuZCByZXN0b3JlLCBhZGQgYSBuYW1lIFhYWCB0byB0aGUgcmVzb3VyY2VzIGxpc3QKLSAgICAjIGFuZCBhZGQgY29ycmVzcG9uZGluZyBnZXRfWFhYL3Jlc3RvcmVfWFhYIGZ1bmN0aW9ucy4gIGdldF9YWFggc2hvdWxkCi0gICAgIyByZXR1cm4gdGhlIHZhbHVlIHRvIGJlIHNhdmVkIGFuZCBjb21wYXJlZCBhZ2FpbnN0IGEgc2Vjb25kIGNhbGwgdG8gdGhlCi0gICAgIyBnZXQgZnVuY3Rpb24gd2hlbiB0ZXN0IGV4ZWN1dGlvbiBjb21wbGV0ZXMuICByZXN0b3JlX1hYWCBzaG91bGQgYWNjZXB0Ci0gICAgIyB0aGUgc2F2ZWQgdmFsdWUgYW5kIHJlc3RvcmUgdGhlIHJlc291cmNlIHVzaW5nIGl0LiAgSXQgd2lsbCBiZSBjYWxsZWQgaWYKLSAgICAjIGFuZCBvbmx5IGlmIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBpcyBkZXRlY3RlZC4KLSAgICAjCi0gICAgIyBOb3RlOiBYWFggd2lsbCBoYXZlIGFueSAnLicgcmVwbGFjZWQgd2l0aCAnXycgY2hhcmFjdGVycyB3aGVuIGRldGVybWluaW5nCi0gICAgIyB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgbmFtZXMuCi0KLSAgICByZXNvdXJjZXMgPSAoJ3N5cy5hcmd2JywgJ2N3ZCcsICdzeXMuc3RkaW4nLCAnc3lzLnN0ZG91dCcsICdzeXMuc3RkZXJyJywKLSAgICAgICAgICAgICAgICAgJ29zLmVudmlyb24nLCAnc3lzLnBhdGgnLCAnc3lzLnBhdGhfaG9va3MnLCAnX19pbXBvcnRfXycsCi0gICAgICAgICAgICAgICAgICd3YXJuaW5ncy5maWx0ZXJzJywgJ2FzeW5jb3JlLnNvY2tldF9tYXAnLAotICAgICAgICAgICAgICAgICAnbG9nZ2luZy5faGFuZGxlcnMnLCAnbG9nZ2luZy5faGFuZGxlckxpc3QnLCAnc3lzLmdldHRyYWNlJywKLSAgICAgICAgICAgICAgICAgJ3N5cy53YXJub3B0aW9ucycsCi0gICAgICAgICAgICAgICAgICMgbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2NsZWFudXAoKSBtYXkgcmVsZWFzZSByZWYKLSAgICAgICAgICAgICAgICAgIyB0byBhIHRocmVhZCwgc28gY2hlY2sgcHJvY2Vzc2VzIGZpcnN0LgotICAgICAgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MuX2RhbmdsaW5nJywgJ3RocmVhZGluZy5fZGFuZ2xpbmcnLAotICAgICAgICAgICAgICAgICAnc3lzY29uZmlnLl9DT05GSUdfVkFSUycsICdzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUycsCi0gICAgICAgICAgICAgICAgICdmaWxlcycsICdsb2NhbGUnLCAnd2FybmluZ3Muc2hvd3dhcm5pbmcnLAotICAgICAgICAgICAgICAgICAnc2h1dGlsX2FyY2hpdmVfZm9ybWF0cycsICdzaHV0aWxfdW5wYWNrX2Zvcm1hdHMnLAotICAgICAgICAgICAgICAgICkKLQotICAgIGRlZiBnZXRfc3lzX2FyZ3Yoc2VsZik6Ci0gICAgICAgIHJldHVybiBpZChzeXMuYXJndiksIHN5cy5hcmd2LCBzeXMuYXJndls6XQotICAgIGRlZiByZXN0b3JlX3N5c19hcmd2KHNlbGYsIHNhdmVkX2FyZ3YpOgotICAgICAgICBzeXMuYXJndiA9IHNhdmVkX2FyZ3ZbMV0KLSAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZF9hcmd2WzJdCi0KLSAgICBkZWYgZ2V0X2N3ZChzZWxmKToKLSAgICAgICAgcmV0dXJuIG9zLmdldGN3ZCgpCi0gICAgZGVmIHJlc3RvcmVfY3dkKHNlbGYsIHNhdmVkX2N3ZCk6Ci0gICAgICAgIG9zLmNoZGlyKHNhdmVkX2N3ZCkKLQotICAgIGRlZiBnZXRfc3lzX3N0ZG91dChzZWxmKToKLSAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKLSAgICBkZWYgcmVzdG9yZV9zeXNfc3Rkb3V0KHNlbGYsIHNhdmVkX3N0ZG91dCk6Ci0gICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlZF9zdGRvdXQKLQotICAgIGRlZiBnZXRfc3lzX3N0ZGVycihzZWxmKToKLSAgICAgICAgcmV0dXJuIHN5cy5zdGRlcnIKLSAgICBkZWYgcmVzdG9yZV9zeXNfc3RkZXJyKHNlbGYsIHNhdmVkX3N0ZGVycik6Ci0gICAgICAgIHN5cy5zdGRlcnIgPSBzYXZlZF9zdGRlcnIKLQotICAgIGRlZiBnZXRfc3lzX3N0ZGluKHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLnN0ZGluCi0gICAgZGVmIHJlc3RvcmVfc3lzX3N0ZGluKHNlbGYsIHNhdmVkX3N0ZGluKToKLSAgICAgICAgc3lzLnN0ZGluID0gc2F2ZWRfc3RkaW4KLQotICAgIGRlZiBnZXRfb3NfZW52aXJvbihzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKG9zLmVudmlyb24pLCBvcy5lbnZpcm9uLCBkaWN0KG9zLmVudmlyb24pCi0gICAgZGVmIHJlc3RvcmVfb3NfZW52aXJvbihzZWxmLCBzYXZlZF9lbnZpcm9uKToKLSAgICAgICAgb3MuZW52aXJvbiA9IHNhdmVkX2Vudmlyb25bMV0KLSAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCi0gICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNhdmVkX2Vudmlyb25bMl0pCi0KLSAgICBkZWYgZ2V0X3N5c19wYXRoKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGgpLCBzeXMucGF0aCwgc3lzLnBhdGhbOl0KLSAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aChzZWxmLCBzYXZlZF9wYXRoKToKLSAgICAgICAgc3lzLnBhdGggPSBzYXZlZF9wYXRoWzFdCi0gICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRfcGF0aFsyXQotCi0gICAgZGVmIGdldF9zeXNfcGF0aF9ob29rcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKHN5cy5wYXRoX2hvb2tzKSwgc3lzLnBhdGhfaG9va3MsIHN5cy5wYXRoX2hvb2tzWzpdCi0gICAgZGVmIHJlc3RvcmVfc3lzX3BhdGhfaG9va3Moc2VsZiwgc2F2ZWRfaG9va3MpOgotICAgICAgICBzeXMucGF0aF9ob29rcyA9IHNhdmVkX2hvb2tzWzFdCi0gICAgICAgIHN5cy5wYXRoX2hvb2tzWzpdID0gc2F2ZWRfaG9va3NbMl0KLQotICAgIGRlZiBnZXRfc3lzX2dldHRyYWNlKHNlbGYpOgotICAgICAgICByZXR1cm4gc3lzLmdldHRyYWNlKCkKLSAgICBkZWYgcmVzdG9yZV9zeXNfZ2V0dHJhY2Uoc2VsZiwgdHJhY2VfZnhuKToKLSAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlX2Z4bikKLQotICAgIGRlZiBnZXRfX19pbXBvcnRfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGJ1aWx0aW5zLl9faW1wb3J0X18KLSAgICBkZWYgcmVzdG9yZV9fX2ltcG9ydF9fKHNlbGYsIGltcG9ydF8pOgotICAgICAgICBidWlsdGlucy5fX2ltcG9ydF9fID0gaW1wb3J0XwotCi0gICAgZGVmIGdldF93YXJuaW5nc19maWx0ZXJzKHNlbGYpOgotICAgICAgICByZXR1cm4gaWQod2FybmluZ3MuZmlsdGVycyksIHdhcm5pbmdzLmZpbHRlcnMsIHdhcm5pbmdzLmZpbHRlcnNbOl0KLSAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19maWx0ZXJzKHNlbGYsIHNhdmVkX2ZpbHRlcnMpOgotICAgICAgICB3YXJuaW5ncy5maWx0ZXJzID0gc2F2ZWRfZmlsdGVyc1sxXQotICAgICAgICB3YXJuaW5ncy5maWx0ZXJzWzpdID0gc2F2ZWRfZmlsdGVyc1syXQotCi0gICAgZGVmIGdldF9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYpOgotICAgICAgICBhc3luY29yZSA9IHN5cy5tb2R1bGVzLmdldCgnYXN5bmNvcmUnKQotICAgICAgICAjIFhYWCBNYWtpbmcgYSBjb3B5IGtlZXBzIG9iamVjdHMgYWxpdmUgdW50aWwgX19leGl0X18gZ2V0cyBjYWxsZWQuCi0gICAgICAgIHJldHVybiBhc3luY29yZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcC5jb3B5KCkgb3Ige30KLSAgICBkZWYgcmVzdG9yZV9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYsIHNhdmVkX21hcCk6Ci0gICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCi0gICAgICAgIGlmIGFzeW5jb3JlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKLSAgICAgICAgICAgIGFzeW5jb3JlLnNvY2tldF9tYXAudXBkYXRlKHNhdmVkX21hcCkKLQotICAgIGRlZiBnZXRfc2h1dGlsX2FyY2hpdmVfZm9ybWF0cyhzZWxmKToKLSAgICAgICAgIyB3ZSBjb3VsZCBjYWxsIGdldF9hcmNoaXZlc19mb3JtYXRzKCkgYnV0IHRoYXQgb25seSByZXR1cm5zIHRoZQotICAgICAgICAjIHJlZ2lzdHJ5IGtleXM7IHdlIHdhbnQgdG8gY2hlY2sgdGhlIHZhbHVlcyB0b28gKHRoZSBmdW5jdGlvbnMgdGhhdAotICAgICAgICAjIGFyZSByZWdpc3RlcmVkKQotICAgICAgICByZXR1cm4gc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMsIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX3NodXRpbF9hcmNoaXZlX2Zvcm1hdHMoc2VsZiwgc2F2ZWQpOgotICAgICAgICBzaHV0aWwuX0FSQ0hJVkVfRk9STUFUUyA9IHNhdmVkWzBdCi0gICAgICAgIHNodXRpbC5fQVJDSElWRV9GT1JNQVRTLmNsZWFyKCkKLSAgICAgICAgc2h1dGlsLl9BUkNISVZFX0ZPUk1BVFMudXBkYXRlKHNhdmVkWzFdKQotCi0gICAgZGVmIGdldF9zaHV0aWxfdW5wYWNrX2Zvcm1hdHMoc2VsZik6Ci0gICAgICAgIHJldHVybiBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLCBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX3NodXRpbF91bnBhY2tfZm9ybWF0cyhzZWxmLCBzYXZlZCk6Ci0gICAgICAgIHNodXRpbC5fVU5QQUNLX0ZPUk1BVFMgPSBzYXZlZFswXQotICAgICAgICBzaHV0aWwuX1VOUEFDS19GT1JNQVRTLmNsZWFyKCkKLSAgICAgICAgc2h1dGlsLl9VTlBBQ0tfRk9STUFUUy51cGRhdGUoc2F2ZWRbMV0pCi0KLSAgICBkZWYgZ2V0X2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYpOgotICAgICAgICAjIF9oYW5kbGVycyBpcyBhIFdlYWtWYWx1ZURpY3Rpb25hcnkKLSAgICAgICAgcmV0dXJuIGlkKGxvZ2dpbmcuX2hhbmRsZXJzKSwgbG9nZ2luZy5faGFuZGxlcnMsIGxvZ2dpbmcuX2hhbmRsZXJzLmNvcHkoKQotICAgIGRlZiByZXN0b3JlX2xvZ2dpbmdfX2hhbmRsZXJzKHNlbGYsIHNhdmVkX2hhbmRsZXJzKToKLSAgICAgICAgIyBDYW4ndCBlYXNpbHkgcmV2ZXJ0IHRoZSBsb2dnaW5nIHN0YXRlCi0gICAgICAgIHBhc3MKLQotICAgIGRlZiBnZXRfbG9nZ2luZ19faGFuZGxlckxpc3Qoc2VsZik6Ci0gICAgICAgICMgX2hhbmRsZXJMaXN0IGlzIGEgbGlzdCBvZiB3ZWFrcmVmcyB0byBoYW5kbGVycwotICAgICAgICByZXR1cm4gaWQobG9nZ2luZy5faGFuZGxlckxpc3QpLCBsb2dnaW5nLl9oYW5kbGVyTGlzdCwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KLSAgICBkZWYgcmVzdG9yZV9sb2dnaW5nX19oYW5kbGVyTGlzdChzZWxmLCBzYXZlZF9oYW5kbGVyTGlzdCk6Ci0gICAgICAgICMgQ2FuJ3QgZWFzaWx5IHJldmVydCB0aGUgbG9nZ2luZyBzdGF0ZQotICAgICAgICBwYXNzCi0KLSAgICBkZWYgZ2V0X3N5c193YXJub3B0aW9ucyhzZWxmKToKLSAgICAgICAgcmV0dXJuIGlkKHN5cy53YXJub3B0aW9ucyksIHN5cy53YXJub3B0aW9ucywgc3lzLndhcm5vcHRpb25zWzpdCi0gICAgZGVmIHJlc3RvcmVfc3lzX3dhcm5vcHRpb25zKHNlbGYsIHNhdmVkX29wdGlvbnMpOgotICAgICAgICBzeXMud2Fybm9wdGlvbnMgPSBzYXZlZF9vcHRpb25zWzFdCi0gICAgICAgIHN5cy53YXJub3B0aW9uc1s6XSA9IHNhdmVkX29wdGlvbnNbMl0KLQotICAgICMgQ29udHJvbGxpbmcgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byBUaHJlYWQgb2JqZWN0cyBjYW4gbWFrZSBpdCBlYXNpZXIKLSAgICAjIHRvIHRyYWNrIHJlZmVyZW5jZSBsZWFrcy4KLSAgICBkZWYgZ2V0X3RocmVhZGluZ19fZGFuZ2xpbmcoc2VsZik6Ci0gICAgICAgIGlmIG5vdCB0aHJlYWRpbmc6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAjIFRoaXMgY29waWVzIHRoZSB3ZWFrcmVmcyB3aXRob3V0IG1ha2luZyBhbnkgc3Ryb25nIHJlZmVyZW5jZQotICAgICAgICByZXR1cm4gdGhyZWFkaW5nLl9kYW5nbGluZy5jb3B5KCkKLSAgICBkZWYgcmVzdG9yZV90aHJlYWRpbmdfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKLSAgICAgICAgaWYgbm90IHRocmVhZGluZzoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICB0aHJlYWRpbmcuX2RhbmdsaW5nLmNsZWFyKCkKLSAgICAgICAgdGhyZWFkaW5nLl9kYW5nbGluZy51cGRhdGUoc2F2ZWQpCi0KLSAgICAjIFNhbWUgZm9yIFByb2Nlc3Mgb2JqZWN0cwotICAgIGRlZiBnZXRfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYpOgotICAgICAgICBpZiBub3QgbXVsdGlwcm9jZXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgIyBVbmpvaW5lZCBwcm9jZXNzIG9iamVjdHMgY2FuIHN1cnZpdmUgYWZ0ZXIgcHJvY2VzcyBleGl0cwotICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fY2xlYW51cCgpCi0gICAgICAgICMgVGhpcyBjb3BpZXMgdGhlIHdlYWtyZWZzIHdpdGhvdXQgbWFraW5nIGFueSBzdHJvbmcgcmVmZXJlbmNlCi0gICAgICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY29weSgpCi0gICAgZGVmIHJlc3RvcmVfbXVsdGlwcm9jZXNzaW5nX3Byb2Nlc3NfX2RhbmdsaW5nKHNlbGYsIHNhdmVkKToKLSAgICAgICAgaWYgbm90IG11bHRpcHJvY2Vzc2luZzoKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcuY2xlYXIoKQotICAgICAgICBtdWx0aXByb2Nlc3NpbmcucHJvY2Vzcy5fZGFuZ2xpbmcudXBkYXRlKHNhdmVkKQotCi0gICAgZGVmIGdldF9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYpOgotICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZGljdCBpcyBpbml0aWFsaXplZAotICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ3ByZWZpeCcpCi0gICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9DT05GSUdfVkFSUyksIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMsCi0gICAgICAgICAgICAgICAgZGljdChzeXNjb25maWcuX0NPTkZJR19WQVJTKSkKLSAgICBkZWYgcmVzdG9yZV9zeXNjb25maWdfX0NPTkZJR19WQVJTKHNlbGYsIHNhdmVkKToKLSAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUyA9IHNhdmVkWzFdCi0gICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMuY2xlYXIoKQotICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTLnVwZGF0ZShzYXZlZFsyXSkKLQotICAgIGRlZiBnZXRfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZik6Ci0gICAgICAgIHJldHVybiAoaWQoc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMpLCBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUywKLSAgICAgICAgICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUy5jb3B5KCkpCi0gICAgZGVmIHJlc3RvcmVfc3lzY29uZmlnX19JTlNUQUxMX1NDSEVNRVMoc2VsZiwgc2F2ZWQpOgotICAgICAgICBzeXNjb25maWcuX0lOU1RBTExfU0NIRU1FUyA9IHNhdmVkWzFdCi0gICAgICAgIHN5c2NvbmZpZy5fSU5TVEFMTF9TQ0hFTUVTLmNsZWFyKCkKLSAgICAgICAgc3lzY29uZmlnLl9JTlNUQUxMX1NDSEVNRVMudXBkYXRlKHNhdmVkWzJdKQotCi0gICAgZGVmIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgcmV0dXJuIHNvcnRlZChmbiArICgnLycgaWYgb3MucGF0aC5pc2RpcihmbikgZWxzZSAnJykKLSAgICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcigpKQotICAgIGRlZiByZXN0b3JlX2ZpbGVzKHNlbGYsIHNhdmVkX3ZhbHVlKToKLSAgICAgICAgZm4gPSBzdXBwb3J0LlRFU1RGTgotICAgICAgICBpZiBmbiBub3QgaW4gc2F2ZWRfdmFsdWUgYW5kIChmbiArICcvJykgbm90IGluIHNhdmVkX3ZhbHVlOgotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgotICAgICAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKGZuKQotICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZuKToKLSAgICAgICAgICAgICAgICBzdXBwb3J0LnJtdHJlZShmbikKLQotICAgIF9sYyA9IFtnZXRhdHRyKGxvY2FsZSwgbGMpIGZvciBsYyBpbiBkaXIobG9jYWxlKQotICAgICAgICAgICBpZiBsYy5zdGFydHN3aXRoKCdMQ18nKV0KLSAgICBkZWYgZ2V0X2xvY2FsZShzZWxmKToKLSAgICAgICAgcGFpcmluZ3MgPSBbXQotICAgICAgICBmb3IgbGMgaW4gc2VsZi5fbGM6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcGFpcmluZ3MuYXBwZW5kKChsYywgbG9jYWxlLnNldGxvY2FsZShsYywgTm9uZSkpKQotICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgotICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHJldHVybiBwYWlyaW5ncwotICAgIGRlZiByZXN0b3JlX2xvY2FsZShzZWxmLCBzYXZlZCk6Ci0gICAgICAgIGZvciBsYywgc2V0dGluZyBpbiBzYXZlZDoKLSAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobGMsIHNldHRpbmcpCi0KLSAgICBkZWYgZ2V0X3dhcm5pbmdzX3Nob3d3YXJuaW5nKHNlbGYpOgotICAgICAgICByZXR1cm4gd2FybmluZ3Muc2hvd3dhcm5pbmcKLSAgICBkZWYgcmVzdG9yZV93YXJuaW5nc19zaG93d2FybmluZyhzZWxmLCBmeG4pOgotICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IGZ4bgotCi0gICAgZGVmIHJlc291cmNlX2luZm8oc2VsZik6Ci0gICAgICAgIGZvciBuYW1lIGluIHNlbGYucmVzb3VyY2VzOgotICAgICAgICAgICAgbWV0aG9kX3N1ZmZpeCA9IG5hbWUucmVwbGFjZSgnLicsICdfJykKLSAgICAgICAgICAgIGdldF9uYW1lID0gJ2dldF8nICsgbWV0aG9kX3N1ZmZpeAotICAgICAgICAgICAgcmVzdG9yZV9uYW1lID0gJ3Jlc3RvcmVfJyArIG1ldGhvZF9zdWZmaXgKLSAgICAgICAgICAgIHlpZWxkIG5hbWUsIGdldGF0dHIoc2VsZiwgZ2V0X25hbWUpLCBnZXRhdHRyKHNlbGYsIHJlc3RvcmVfbmFtZSkKLQotICAgIGRlZiBfX2VudGVyX18oc2VsZik6Ci0gICAgICAgIHNlbGYuc2F2ZWRfdmFsdWVzID0gZGljdCgobmFtZSwgZ2V0KCkpIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYucmVzb3VyY2VfaW5mbygpKQotICAgICAgICByZXR1cm4gc2VsZgotCi0gICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgotICAgICAgICBzYXZlZF92YWx1ZXMgPSBzZWxmLnNhdmVkX3ZhbHVlcwotICAgICAgICBkZWwgc2VsZi5zYXZlZF92YWx1ZXMKLSAgICAgICAgZm9yIG5hbWUsIGdldCwgcmVzdG9yZSBpbiBzZWxmLnJlc291cmNlX2luZm8oKToKLSAgICAgICAgICAgIGN1cnJlbnQgPSBnZXQoKQotICAgICAgICAgICAgb3JpZ2luYWwgPSBzYXZlZF92YWx1ZXMucG9wKG5hbWUpCi0gICAgICAgICAgICAjIENoZWNrIGZvciBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSdzIHZhbHVlCi0gICAgICAgICAgICBpZiBjdXJyZW50ICE9IG9yaWdpbmFsOgotICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlZCA9IFRydWUKLSAgICAgICAgICAgICAgICByZXN0b3JlKG9yaWdpbmFsKQotICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnF1aWV0IGFuZCBub3Qgc2VsZi5wZ286Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KCJXYXJuaW5nIC0tIHt9IHdhcyBtb2RpZmllZCBieSB7fSIuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNlbGYudGVzdG5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlID4gMSBhbmQgbm90IHNlbGYucGdvOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoIiAgQmVmb3JlOiB7fVxuICBBZnRlcjogIHt9ICIuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCwgY3VycmVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLQotZGVmIHJ1bnRlc3RfaW5uZXIodGVzdCwgdmVyYm9zZSwgcXVpZXQsCi0gICAgICAgICAgICAgICAgICBodW50cmxlYWtzPUZhbHNlLCBkaXNwbGF5X2ZhaWx1cmU9VHJ1ZSwgcGdvPUZhbHNlKToKLSAgICBzdXBwb3J0LnVubG9hZCh0ZXN0KQotCi0gICAgdGVzdF90aW1lID0gMC4wCi0gICAgcmVmbGVhayA9IEZhbHNlICAjIFRydWUgaWYgdGhlIHRlc3QgbGVha2VkIHJlZmVyZW5jZXMuCi0gICAgdHJ5OgotICAgICAgICBpZiB0ZXN0LnN0YXJ0c3dpdGgoJ3Rlc3QuJyk6Ci0gICAgICAgICAgICBhYnN0ZXN0ID0gdGVzdAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBBbHdheXMgaW1wb3J0IGl0IGZyb20gdGhlIHRlc3QgcGFja2FnZQotICAgICAgICAgICAgYWJzdGVzdCA9ICd0ZXN0LicgKyB0ZXN0Ci0gICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0LCB2ZXJib3NlLCBxdWlldCwgcGdvPXBnbykgYXMgZW52aXJvbm1lbnQ6Ci0gICAgICAgICAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICAgICAgICAgIHRoZV9tb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShhYnN0ZXN0KQotICAgICAgICAgICAgIyBJZiB0aGUgdGVzdCBoYXMgYSB0ZXN0X21haW4sIHRoYXQgd2lsbCBydW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICAgICAgICAjIHRlc3RzLiAgSWYgbm90LCB1c2Ugbm9ybWFsIHVuaXR0ZXN0IHRlc3QgbG9hZGluZy4KLSAgICAgICAgICAgIHRlc3RfcnVubmVyID0gZ2V0YXR0cih0aGVfbW9kdWxlLCAidGVzdF9tYWluIiwgTm9uZSkKLSAgICAgICAgICAgIGlmIHRlc3RfcnVubmVyIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgZGVmIHRlc3RfcnVubmVyKCk6Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQotICAgICAgICAgICAgICAgICAgICB0ZXN0cyA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHRoZV9tb2R1bGUpCi0gICAgICAgICAgICAgICAgICAgIGZvciBlcnJvciBpbiBsb2FkZXIuZXJyb3JzOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoZXJyb3IsIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgICAgICAgICAgaWYgbG9hZGVyLmVycm9yczoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXJyb3JzIHdoaWxlIGxvYWRpbmcgdGVzdHMiKQotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCh0ZXN0cykKLSAgICAgICAgICAgIHRlc3RfcnVubmVyKCkKLSAgICAgICAgICAgIGlmIGh1bnRybGVha3M6Ci0gICAgICAgICAgICAgICAgcmVmbGVhayA9IGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCB0ZXN0X3J1bm5lciwgaHVudHJsZWFrcykKLSAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUudGltZSgpIC0gc3RhcnRfdGltZQotICAgIGV4Y2VwdCBzdXBwb3J0LlJlc291cmNlRGVuaWVkIGFzIG1zZzoKLSAgICAgICAgaWYgbm90IHF1aWV0IGFuZCBub3QgcGdvOgotICAgICAgICAgICAgcHJpbnQodGVzdCwgInNraXBwZWQgLS0iLCBtc2cpCi0gICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgcmV0dXJuIFJFU09VUkNFX0RFTklFRCwgdGVzdF90aW1lCi0gICAgZXhjZXB0IHVuaXR0ZXN0LlNraXBUZXN0IGFzIG1zZzoKLSAgICAgICAgaWYgbm90IHF1aWV0IGFuZCBub3QgcGdvOgotICAgICAgICAgICAgcHJpbnQodGVzdCwgInNraXBwZWQgLS0iLCBtc2cpCi0gICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKLSAgICAgICAgcmV0dXJuIFNLSVBQRUQsIHRlc3RfdGltZQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgcmFpc2UKLSAgICBleGNlcHQgc3VwcG9ydC5UZXN0RmFpbGVkIGFzIG1zZzoKLSAgICAgICAgaWYgbm90IHBnbzoKLSAgICAgICAgICAgIGlmIGRpc3BsYXlfZmFpbHVyZToKLSAgICAgICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJmYWlsZWQgLS0iLCBtc2csIGZpbGU9c3lzLnN0ZGVycikKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQoInRlc3QiLCB0ZXN0LCAiZmFpbGVkIiwgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCi0gICAgZXhjZXB0OgotICAgICAgICBtc2cgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCi0gICAgICAgIGlmIG5vdCBwZ286Ci0gICAgICAgICAgICBwcmludCgidGVzdCIsIHRlc3QsICJjcmFzaGVkIC0tIiwgbXNnLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKLSAgICBlbHNlOgotICAgICAgICBpZiByZWZsZWFrOgotICAgICAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCi0gICAgICAgIGlmIGVudmlyb25tZW50LmNoYW5nZWQ6Ci0gICAgICAgICAgICByZXR1cm4gRU5WX0NIQU5HRUQsIHRlc3RfdGltZQotICAgICAgICByZXR1cm4gUEFTU0VELCB0ZXN0X3RpbWUKLQotZGVmIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdG5hbWUsIHZlcmJvc2UpOgotICAgIGltcG9ydCBzaHV0aWwKLSAgICBpbXBvcnQgc3RhdAotICAgIGltcG9ydCBnYwotCi0gICAgIyBGaXJzdCBraWxsIGFueSBkYW5nbGluZyByZWZlcmVuY2VzIHRvIG9wZW4gZmlsZXMgZXRjLgotICAgICMgVGhpcyBjYW4gYWxzbyBpc3N1ZSBzb21lIFJlc291cmNlV2FybmluZ3Mgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGdldAotICAgICMgdHJpZ2dlcmVkIGR1cmluZyB0aGUgZm9sbG93aW5nIHRlc3QgcnVuLCBhbmQgcG9zc2libHkgcHJvZHVjZSBmYWlsdXJlcy4KLSAgICBnYy5jb2xsZWN0KCkKLQotICAgICMgVHJ5IHRvIGNsZWFuIHVwIGp1bmsgY29tbW9ubHkgbGVmdCBiZWhpbmQuICBXaGlsZSB0ZXN0cyBzaG91bGRuJ3QgbGVhdmUKLSAgICAjIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBiZWhpbmQsIHdoZW4gYSB0ZXN0IGZhaWxzIHRoYXQgY2FuIGJlIHRlZGlvdXMKLSAgICAjIGZvciBpdCB0byBhcnJhbmdlLiAgVGhlIGNvbnNlcXVlbmNlcyBjYW4gYmUgZXNwZWNpYWxseSBuYXN0eSBvbiBXaW5kb3dzLAotICAgICMgc2luY2UgaWYgYSB0ZXN0IGxlYXZlcyBhIGZpbGUgb3BlbiwgaXQgY2Fubm90IGJlIGRlbGV0ZWQgYnkgbmFtZSAod2hpbGUKLSAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCBoZXJlIGVpdGhlciwgd2UgY2FuIGRpc3BsYXkgdGhlCi0gICAgIyBuYW1lIG9mIHRoZSBvZmZlbmRpbmcgdGVzdCwgd2hpY2ggaXMgYSByZWFsIGhlbHApLgotICAgIGZvciBuYW1lIGluIChzdXBwb3J0LlRFU1RGTiwKLSAgICAgICAgICAgICAgICAgImRiX2hvbWUiLAotICAgICAgICAgICAgICAgICk6Ci0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhuYW1lKToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3MucGF0aC5pc2RpcihuYW1lKToKLSAgICAgICAgICAgIGtpbmQsIG51a2VyID0gImRpcmVjdG9yeSIsIHNodXRpbC5ybXRyZWUKLSAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYW1lKToKLSAgICAgICAgICAgIGtpbmQsIG51a2VyID0gImZpbGUiLCBvcy51bmxpbmsKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yKCJvcy5wYXRoIHNheXMgJXIgZXhpc3RzIGJ1dCBpcyBuZWl0aGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3Rvcnkgbm9yIGZpbGUiICUgbmFtZSkKLQotICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgcHJpbnQoIiVyIGxlZnQgYmVoaW5kICVzICVyIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSkpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBjaG1vZCwgZml4IHBvc3NpYmxlIHBlcm1pc3Npb25zIHByb2JsZW1zCi0gICAgICAgICAgICAjIHRoYXQgbWlnaHQgcHJldmVudCBjbGVhbnVwCi0gICAgICAgICAgICBpZiAoaGFzYXR0cihvcywgJ2NobW9kJykpOgotICAgICAgICAgICAgICAgIG9zLmNobW9kKG5hbWUsIHN0YXQuU19JUldYVSB8IHN0YXQuU19JUldYRyB8IHN0YXQuU19JUldYTykKLSAgICAgICAgICAgIG51a2VyKG5hbWUpCi0gICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgbXNnOgotICAgICAgICAgICAgcHJpbnQoKCIlciBsZWZ0IGJlaGluZCAlcyAlciBhbmQgaXQgY291bGRuJ3QgYmUgIgotICAgICAgICAgICAgICAgICJyZW1vdmVkOiAlcyIgJSAodGVzdG5hbWUsIGtpbmQsIG5hbWUsIG1zZykpLCBmaWxlPXN5cy5zdGRlcnIpCi0KLWRlZiBkYXNoX1IodGhlX21vZHVsZSwgdGVzdCwgaW5kaXJlY3RfdGVzdCwgaHVudHJsZWFrcyk6Ci0gICAgIiIiUnVuIGEgdGVzdCBtdWx0aXBsZSB0aW1lcywgbG9va2luZyBmb3IgcmVmZXJlbmNlIGxlYWtzLgotCi0gICAgUmV0dXJuczoKLSAgICAgICAgRmFsc2UgaWYgdGhlIHRlc3QgZGlkbid0IGxlYWsgcmVmZXJlbmNlczsgVHJ1ZSBpZiB3ZSBkZXRlY3RlZCByZWZsZWFrcy4KLSAgICAiIiIKLSAgICAjIFRoaXMgY29kZSBpcyBoYWNraXNoIGFuZCBpbmVsZWdhbnQsIGJ1dCBpdCBzZWVtcyB0byBkbyB0aGUgam9iLgotICAgIGltcG9ydCBjb3B5cmVnCi0gICAgaW1wb3J0IGNvbGxlY3Rpb25zLmFiYwotCi0gICAgaWYgbm90IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgotICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRyYWNraW5nIHJlZmVyZW5jZSBsZWFrcyByZXF1aXJlcyBhIGRlYnVnIGJ1aWxkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvZiBQeXRob24iKQotCi0gICAgIyBTYXZlIGN1cnJlbnQgdmFsdWVzIGZvciBkYXNoX1JfY2xlYW51cCgpIHRvIHJlc3RvcmUuCi0gICAgZnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCi0gICAgcHMgPSBjb3B5cmVnLmRpc3BhdGNoX3RhYmxlLmNvcHkoKQotICAgIHBpYyA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNvcHkoKQotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IHppcGltcG9ydAotICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgemRjID0gTm9uZSAjIFJ1biB1bm1vZGlmaWVkIG9uIHBsYXRmb3JtcyB3aXRob3V0IHppcGltcG9ydCBzdXBwb3J0Ci0gICAgZWxzZToKLSAgICAgICAgemRjID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNvcHkoKQotICAgIGFiY3MgPSB7fQotICAgIGZvciBhYmMgaW4gW2dldGF0dHIoY29sbGVjdGlvbnMuYWJjLCBhKSBmb3IgYSBpbiBjb2xsZWN0aW9ucy5hYmMuX19hbGxfX106Ci0gICAgICAgIGlmIG5vdCBpc2Fic3RyYWN0KGFiYyk6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106Ci0gICAgICAgICAgICBhYmNzW29ial0gPSBvYmouX2FiY19yZWdpc3RyeS5jb3B5KCkKLQotICAgIG53YXJtdXAsIG50cmFja2VkLCBmbmFtZSA9IGh1bnRybGVha3MKLSAgICBmbmFtZSA9IG9zLnBhdGguam9pbihzdXBwb3J0LlNBVkVEQ1dELCBmbmFtZSkKLSAgICByZXBjb3VudCA9IG53YXJtdXAgKyBudHJhY2tlZAotICAgIHJjX2RlbHRhcyA9IFswXSAqIHJlcGNvdW50Ci0gICAgYWxsb2NfZGVsdGFzID0gWzBdICogcmVwY291bnQKLQotICAgIHByaW50KCJiZWdpbm5pbmciLCByZXBjb3VudCwgInJlcGV0aXRpb25zIiwgZmlsZT1zeXMuc3RkZXJyKQotICAgIHByaW50KCgiMTIzNDU2Nzg5MCIqKHJlcGNvdW50Ly8xMCArIDEpKVs6cmVwY291bnRdLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgc3lzLnN0ZGVyci5mbHVzaCgpCi0gICAgZm9yIGkgaW4gcmFuZ2UocmVwY291bnQpOgotICAgICAgICBpbmRpcmVjdF90ZXN0KCkKLSAgICAgICAgYWxsb2NfYWZ0ZXIsIHJjX2FmdGVyID0gZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcykKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnLicpCi0gICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQotICAgICAgICBpZiBpID49IG53YXJtdXA6Ci0gICAgICAgICAgICByY19kZWx0YXNbaV0gPSByY19hZnRlciAtIHJjX2JlZm9yZQotICAgICAgICAgICAgYWxsb2NfZGVsdGFzW2ldID0gYWxsb2NfYWZ0ZXIgLSBhbGxvY19iZWZvcmUKLSAgICAgICAgYWxsb2NfYmVmb3JlLCByY19iZWZvcmUgPSBhbGxvY19hZnRlciwgcmNfYWZ0ZXIKLSAgICBwcmludChmaWxlPXN5cy5zdGRlcnIpCi0gICAgIyBUaGVzZSBjaGVja2VycyByZXR1cm4gRmFsc2Ugb24gc3VjY2VzcywgVHJ1ZSBvbiBmYWlsdXJlCi0gICAgZGVmIGNoZWNrX3JjX2RlbHRhcyhkZWx0YXMpOgotICAgICAgICByZXR1cm4gYW55KGRlbHRhcykKLSAgICBkZWYgY2hlY2tfYWxsb2NfZGVsdGFzKGRlbHRhcyk6Ci0gICAgICAgICMgQXQgbGVhc3QgMS8zcmQgb2YgMHMKLSAgICAgICAgaWYgMyAqIGRlbHRhcy5jb3VudCgwKSA8IGxlbihkZWx0YXMpOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgIyBOb3RoaW5nIGVsc2UgdGhhbiAxcywgMHMgYW5kIC0xcwotICAgICAgICBpZiBub3Qgc2V0KGRlbHRhcykgPD0gezEsMCwtMX06Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICBmYWlsZWQgPSBGYWxzZQotICAgIGZvciBkZWx0YXMsIGl0ZW1fbmFtZSwgY2hlY2tlciBpbiBbCi0gICAgICAgIChyY19kZWx0YXMsICdyZWZlcmVuY2VzJywgY2hlY2tfcmNfZGVsdGFzKSwKLSAgICAgICAgKGFsbG9jX2RlbHRhcywgJ21lbW9yeSBibG9ja3MnLCBjaGVja19hbGxvY19kZWx0YXMpXToKLSAgICAgICAgaWYgY2hlY2tlcihkZWx0YXMpOgotICAgICAgICAgICAgbXNnID0gJyVzIGxlYWtlZCAlcyAlcywgc3VtPSVzJyAlICgKLSAgICAgICAgICAgICAgICB0ZXN0LCBkZWx0YXNbbndhcm11cDpdLCBpdGVtX25hbWUsIHN1bShkZWx0YXMpKQotICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKLSAgICAgICAgICAgIHdpdGggb3BlbihmbmFtZSwgImEiKSBhcyByZWZyZXA6Ci0gICAgICAgICAgICAgICAgcHJpbnQobXNnLCBmaWxlPXJlZnJlcCkKLSAgICAgICAgICAgICAgICByZWZyZXAuZmx1c2goKQotICAgICAgICAgICAgZmFpbGVkID0gVHJ1ZQotICAgIHJldHVybiBmYWlsZWQKLQotZGVmIGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljLCB6ZGMsIGFiY3MpOgotICAgIGltcG9ydCBnYywgY29weXJlZwotICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZQotICAgIGltcG9ydCB1cmxsaWIucGFyc2UsIHVybGxpYi5yZXF1ZXN0LCBtaW1ldHlwZXMsIGRvY3Rlc3QKLSAgICBpbXBvcnQgc3RydWN0LCBmaWxlY21wLCBjb2xsZWN0aW9ucy5hYmMKLSAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgX3BhdGhfY3JlYXRlZAotICAgIGZyb20gd2Vha3JlZiBpbXBvcnQgV2Vha1NldAotCi0gICAgIyBDbGVhciB0aGUgd2FybmluZ3MgcmVnaXN0cnksIHNvIHRoZXkgY2FuIGJlIGRpc3BsYXllZCBhZ2FpbgotICAgIGZvciBtb2QgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6Ci0gICAgICAgIGlmIGhhc2F0dHIobW9kLCAnX193YXJuaW5ncmVnaXN0cnlfXycpOgotICAgICAgICAgICAgZGVsIG1vZC5fX3dhcm5pbmdyZWdpc3RyeV9fCi0KLSAgICAjIFJlc3RvcmUgc29tZSBvcmlnaW5hbCB2YWx1ZXMuCi0gICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IGZzCi0gICAgY29weXJlZy5kaXNwYXRjaF90YWJsZS5jbGVhcigpCi0gICAgY29weXJlZy5kaXNwYXRjaF90YWJsZS51cGRhdGUocHMpCi0gICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQotICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnVwZGF0ZShwaWMpCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgemlwaW1wb3J0Ci0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBwYXNzICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKLSAgICBlbHNlOgotICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQotICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUudXBkYXRlKHpkYykKLQotICAgICMgY2xlYXIgdHlwZSBjYWNoZQotICAgIHN5cy5fY2xlYXJfdHlwZV9jYWNoZSgpCi0KLSAgICAjIENsZWFyIEFCQyByZWdpc3RyaWVzLCByZXN0b3JpbmcgcHJldmlvdXNseSBzYXZlZCBBQkMgcmVnaXN0cmllcy4KLSAgICBmb3IgYWJjIGluIFtnZXRhdHRyKGNvbGxlY3Rpb25zLmFiYywgYSkgZm9yIGEgaW4gY29sbGVjdGlvbnMuYWJjLl9fYWxsX19dOgotICAgICAgICBpZiBub3QgaXNhYnN0cmFjdChhYmMpOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZm9yIG9iaiBpbiBhYmMuX19zdWJjbGFzc2VzX18oKSArIFthYmNdOgotICAgICAgICAgICAgb2JqLl9hYmNfcmVnaXN0cnkgPSBhYmNzLmdldChvYmosIFdlYWtTZXQoKSkuY29weSgpCi0gICAgICAgICAgICBvYmouX2FiY19jYWNoZS5jbGVhcigpCi0gICAgICAgICAgICBvYmouX2FiY19uZWdhdGl2ZV9jYWNoZS5jbGVhcigpCi0KLSAgICAjIEZsdXNoIHN0YW5kYXJkIG91dHB1dCwgc28gdGhhdCBidWZmZXJlZCBkYXRhIGlzIHNlbnQgdG8gdGhlIE9TIGFuZAotICAgICMgYXNzb2NpYXRlZCBQeXRob24gb2JqZWN0cyBhcmUgcmVjbGFpbWVkLgotICAgIGZvciBzdHJlYW0gaW4gKHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIsIHN5cy5fX3N0ZG91dF9fLCBzeXMuX19zdGRlcnJfXyk6Ci0gICAgICAgIGlmIHN0cmVhbSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHN0cmVhbS5mbHVzaCgpCi0KLSAgICAjIENsZWFyIGFzc29ydGVkIG1vZHVsZSBjYWNoZXMuCi0gICAgX3BhdGhfY3JlYXRlZC5jbGVhcigpCi0gICAgcmUucHVyZ2UoKQotICAgIF9zdHJwdGltZS5fcmVnZXhfY2FjaGUuY2xlYXIoKQotICAgIHVybGxpYi5wYXJzZS5jbGVhcl9jYWNoZSgpCi0gICAgdXJsbGliLnJlcXVlc3QudXJsY2xlYW51cCgpCi0gICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQotICAgIG1pbWV0eXBlcy5fZGVmYXVsdF9taW1lX3R5cGVzKCkKLSAgICBmaWxlY21wLl9jYWNoZS5jbGVhcigpCi0gICAgc3RydWN0Ll9jbGVhcmNhY2hlKCkKLSAgICBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBjdHlwZXMKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICMgRG9uJ3Qgd29ycnkgYWJvdXQgcmVzZXR0aW5nIHRoZSBjYWNoZSBpZiBjdHlwZXMgaXMgbm90IHN1cHBvcnRlZAotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICAgY3R5cGVzLl9yZXNldF9jYWNoZSgpCi0KLSAgICAjIENvbGxlY3QgY3ljbGljIHRyYXNoIGFuZCByZWFkIG1lbW9yeSBzdGF0aXN0aWNzIGltbWVkaWF0ZWx5IGFmdGVyLgotICAgIGZ1bmMxID0gc3lzLmdldGFsbG9jYXRlZGJsb2NrcwotICAgIGZ1bmMyID0gc3lzLmdldHRvdGFscmVmY291bnQKLSAgICBnYy5jb2xsZWN0KCkKLSAgICByZXR1cm4gZnVuYzEoKSwgZnVuYzIoKQotCi1kZWYgd2FybV9jYWNoZXMoKToKLSAgICAjIGNoYXIgY2FjaGUKLSAgICBzID0gYnl0ZXMocmFuZ2UoMjU2KSkKLSAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgotICAgICAgICBzW2k6aSsxXQotICAgICMgdW5pY29kZSBjYWNoZQotICAgIHggPSBbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildCi0gICAgIyBpbnQgY2FjaGUKLSAgICB4ID0gbGlzdChyYW5nZSgtNSwgMjU3KSkKLQotZGVmIGZpbmR0ZXN0ZGlyKHBhdGg9Tm9uZSk6Ci0gICAgcmV0dXJuIHBhdGggb3Igb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIKLQotZGVmIHJlbW92ZXB5KG5hbWVzKToKLSAgICBpZiBub3QgbmFtZXM6Ci0gICAgICAgIHJldHVybgotICAgIGZvciBpZHgsIG5hbWUgaW4gZW51bWVyYXRlKG5hbWVzKToKLSAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKLSAgICAgICAgaWYgZXh0ID09ICcucHknOgotICAgICAgICAgICAgbmFtZXNbaWR4XSA9IGJhc2VuYW1lCi0KLWRlZiBjb3VudChuLCB3b3JkKToKLSAgICBpZiBuID09IDE6Ci0gICAgICAgIHJldHVybiAiJWQgJXMiICUgKG4sIHdvcmQpCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuICIlZCAlc3MiICUgKG4sIHdvcmQpCi0KLWRlZiBwcmludGxpc3QoeCwgd2lkdGg9NzAsIGluZGVudD00KToKLSAgICAiIiJQcmludCB0aGUgZWxlbWVudHMgb2YgaXRlcmFibGUgeCB0byBzdGRvdXQuCi0KLSAgICBPcHRpb25hbCBhcmcgd2lkdGggKGRlZmF1bHQgNzApIGlzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoLgotICAgIE9wdGlvbmFsIGFyZyBpbmRlbnQgKGRlZmF1bHQgNCkgaXMgdGhlIG51bWJlciBvZiBibGFua3Mgd2l0aCB3aGljaCB0bwotICAgIGJlZ2luIGVhY2ggbGluZS4KLSAgICAiIiIKLQotICAgIGZyb20gdGV4dHdyYXAgaW1wb3J0IGZpbGwKLSAgICBibGFua3MgPSAnICcgKiBpbmRlbnQKLSAgICAjIFByaW50IHRoZSBzb3J0ZWQgbGlzdDogJ3gnIG1heSBiZSBhICctLXJhbmRvbScgbGlzdCBvciBhIHNldCgpCi0gICAgcHJpbnQoZmlsbCgnICcuam9pbihzdHIoZWx0KSBmb3IgZWx0IGluIHNvcnRlZCh4KSksIHdpZHRoLAotICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9YmxhbmtzLCBzdWJzZXF1ZW50X2luZGVudD1ibGFua3MpKQotCi0KLWRlZiBtYWluX2luX3RlbXBfY3dkKCk6Ci0gICAgIiIiUnVuIG1haW4oKSBpbiBhIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeS4iIiIKLSAgICBpZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLm1rZGlyKFRFTVBESVIpCi0gICAgICAgIGV4Y2VwdCBGaWxlRXhpc3RzRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAjIERlZmluZSBhIHdyaXRhYmxlIHRlbXAgZGlyIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGN3ZCB3aGlsZSBydW5uaW5nCi0gICAgIyB0aGUgdGVzdHMuIFRoZSBuYW1lIG9mIHRoZSBkaXIgaW5jbHVkZXMgdGhlIHBpZCB0byBhbGxvdyBwYXJhbGxlbAotICAgICMgdGVzdGluZyAoc2VlIHRoZSAtaiBvcHRpb24pLgotICAgIHRlc3RfY3dkID0gJ3Rlc3RfcHl0aG9uX3t9Jy5mb3JtYXQob3MuZ2V0cGlkKCkpCi0gICAgdGVzdF9jd2QgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgdGVzdF9jd2QpCi0KLSAgICAjIFJ1biB0aGUgdGVzdHMgaW4gYSBjb250ZXh0IG1hbmFnZXIgdGhhdCB0ZW1wb3JhcmlseSBjaGFuZ2VzIHRoZSBDV0QgdG8gYQotICAgICMgdGVtcG9yYXJ5IGFuZCB3cml0YWJsZSBkaXJlY3RvcnkuICBJZiBpdCdzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgb3IKLSAgICAjIGNoYW5nZSB0aGUgQ1dELCB0aGUgb3JpZ2luYWwgQ1dEIHdpbGwgYmUgdXNlZC4gIFRoZSBvcmlnaW5hbCBDV0QgaXMKLSAgICAjIGF2YWlsYWJsZSBmcm9tIHN1cHBvcnQuU0FWRURDV0QuCi0gICAgd2l0aCBzdXBwb3J0LnRlbXBfY3dkKHRlc3RfY3dkLCBxdWlldD1UcnVlKToKLSAgICAgICAgbWFpbigpCi0KK2RlZiBfbWFpbigpOgorICAgIGdsb2JhbCBfX2ZpbGVfXwogCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgICMgUmVtb3ZlIHJlZ3J0ZXN0LnB5J3Mgb3duIGRpcmVjdG9yeSBmcm9tIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGguIERlc3BpdGUKICAgICAjIHRoZSBlbGltaW5hdGlvbiBvZiBpbXBsaWNpdCByZWxhdGl2ZSBpbXBvcnRzLCB0aGlzIGlzIHN0aWxsIG5lZWRlZCB0bwogICAgICMgZW5zdXJlIHRoYXQgc3VibW9kdWxlcyBvZiB0aGUgdGVzdCBwYWNrYWdlIGRvIG5vdCBpbmFwcHJvcHJpYXRlbHkgYXBwZWFyCiAgICAgIyBhcyB0b3AtbGV2ZWwgbW9kdWxlcyBldmVuIHdoZW4gcGVvcGxlIChvciBidWlsZGJvdHMhKSBpbnZva2UgcmVncnRlc3QucHkKICAgICAjIGRpcmVjdGx5IGluc3RlYWQgb2YgdXNpbmcgdGhlIC1tIHN3aXRjaAogICAgIG15ZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5kaXJuYW1lKHN5cy5hcmd2WzBdKSkpCi0gICAgaSA9IGxlbihzeXMucGF0aCkKKyAgICBpID0gbGVuKHN5cy5wYXRoKSAtIDEKICAgICB3aGlsZSBpID49IDA6Ci0gICAgICAgIGkgLT0gMQogICAgICAgICBpZiBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChzeXMucGF0aFtpXSkpID09IG15ZGlyOgogICAgICAgICAgICAgZGVsIHN5cy5wYXRoW2ldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpIC09IDEKIAogICAgICMgZmluZHRlc3RkaXIoKSBnZXRzIHRoZSBkaXJuYW1lIG91dCBvZiBfX2ZpbGVfXywgc28gd2UgaGF2ZSB0byBtYWtlIGl0CiAgICAgIyBhYnNvbHV0ZSBiZWZvcmUgY2hhbmdpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5LgpAQCAtMTYxNCw0ICs0Myw4IEBACiAgICAgIyBzYW5pdHkgY2hlY2sKICAgICBhc3NlcnQgX19maWxlX18gPT0gb3MucGF0aC5hYnNwYXRoKHN5cy5hcmd2WzBdKQogCi0gICAgbWFpbl9pbl90ZW1wX2N3ZCgpCisgICAgbWFpbigpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zZXFfdGVzdHMucHkgYi9MaWIvdGVzdC9zZXFfdGVzdHMucHkKaW5kZXggNzJmNDg0NS4uMWU3YTZmNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvc2VxX3Rlc3RzLnB5CisrKyBiL0xpYi90ZXN0L3NlcV90ZXN0cy5weQpAQCAtMzE4LDcgKzMxOCw2IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKHMpLCBpZChzKjEpKQogCiAgICAgZGVmIHRlc3RfYmlncmVwZWF0KHNlbGYpOgotICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgIGlmIHN5cy5tYXhzaXplIDw9IDIxNDc0ODM2NDc6CiAgICAgICAgICAgICB4ID0gc2VsZi50eXBlMnRlc3QoWzBdKQogICAgICAgICAgICAgeCAqPSAyKioxNgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3Qvc2lnbmFsaW50ZXJwcm9jdGVzdGVyLnB5IGIvTGliL3Rlc3Qvc2lnbmFsaW50ZXJwcm9jdGVzdGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYWUxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9zaWduYWxpbnRlcnByb2N0ZXN0ZXIucHkKQEAgLTAsMCArMSw4NCBAQAoraW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFNJR1VTUjFFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgSW50ZXJQcm9jZXNzU2lnbmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5nb3Rfc2lnbmFscyA9IHsnU0lHSFVQJzogMCwgJ1NJR1VTUjEnOiAwLCAnU0lHQUxSTSc6IDB9CisKKyAgICBkZWYgc2lnaHVwX2hhbmRsZXIoc2VsZiwgc2lnbnVtLCBmcmFtZSk6CisgICAgICAgIHNlbGYuZ290X3NpZ25hbHNbJ1NJR0hVUCddICs9IDEKKworICAgIGRlZiBzaWd1c3IxX2hhbmRsZXIoc2VsZiwgc2lnbnVtLCBmcmFtZSk6CisgICAgICAgIHNlbGYuZ290X3NpZ25hbHNbJ1NJR1VTUjEnXSArPSAxCisgICAgICAgIHJhaXNlIFNJR1VTUjFFeGNlcHRpb24KKworICAgIGRlZiB3YWl0X3NpZ25hbChzZWxmLCBjaGlsZCwgc2lnbmFtZSwgZXhjX2NsYXNzPU5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBjaGlsZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIFRoaXMgd2FpdCBzaG91bGQgYmUgaW50ZXJydXB0ZWQgYnkgZXhjX2NsYXNzCisgICAgICAgICAgICAgICAgIyAoaWYgc2V0KQorICAgICAgICAgICAgICAgIGNoaWxkLndhaXQoKQorCisgICAgICAgICAgICB0aW1lb3V0ID0gMTAuMAorICAgICAgICAgICAgZGVhZGxpbmUgPSB0aW1lLm1vbm90b25pYygpICsgdGltZW91dAorCisgICAgICAgICAgICB3aGlsZSB0aW1lLm1vbm90b25pYygpIDwgZGVhZGxpbmU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5nb3Rfc2lnbmFsc1tzaWduYW1lXToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2lnbmFsLnBhdXNlKCkKKyAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgaWYgZXhjX2NsYXNzIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKGV4YywgZXhjX2NsYXNzKToKKyAgICAgICAgICAgICAgICAjIGdvdCB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHNlbGYuZmFpbCgnc2lnbmFsICVzIG5vdCByZWNlaXZlZCBhZnRlciAlcyBzZWNvbmRzJworICAgICAgICAgICAgICAgICAgJSAoc2lnbmFtZSwgdGltZW91dCkpCisKKyAgICBkZWYgc3VicHJvY2Vzc19zZW5kX3NpZ25hbChzZWxmLCBwaWQsIHNpZ25hbWUpOgorICAgICAgICBjb2RlID0gJ2ltcG9ydCBvcywgc2lnbmFsOyBvcy5raWxsKCVzLCBzaWduYWwuJXMpJyAlIChwaWQsIHNpZ25hbWUpCisgICAgICAgIGFyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsICctSScsICctYycsIGNvZGVdCisgICAgICAgIHJldHVybiBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9pbnRlcnByb2Nlc3Nfc2lnbmFsKHNlbGYpOgorICAgICAgICAjIEluc3RhbGwgaGFuZGxlcnMuIFRoaXMgZnVuY3Rpb24gcnVucyBpbiBhIHN1Yi1wcm9jZXNzLCBzbyB3ZQorICAgICAgICAjIGRvbid0IHdvcnJ5IGFib3V0IHJlLXNldHRpbmcgdGhlIGRlZmF1bHQgaGFuZGxlcnMuCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgc2VsZi5zaWdodXBfaGFuZGxlcikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMSwgc2VsZi5zaWd1c3IxX2hhbmRsZXIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjIsIHNpZ25hbC5TSUdfSUdOKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcikKKworICAgICAgICAjIExldCB0aGUgc3ViLXByb2Nlc3NlcyBrbm93IHdobyB0byBzZW5kIHNpZ25hbHMgdG8uCisgICAgICAgIHBpZCA9IHN0cihvcy5nZXRwaWQoKSkKKworICAgICAgICB3aXRoIHNlbGYuc3VicHJvY2Vzc19zZW5kX3NpZ25hbChwaWQsICJTSUdIVVAiKSBhcyBjaGlsZDoKKyAgICAgICAgICAgIHNlbGYud2FpdF9zaWduYWwoY2hpbGQsICdTSUdIVVAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ290X3NpZ25hbHMsIHsnU0lHSFVQJzogMSwgJ1NJR1VTUjEnOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0lHQUxSTSc6IDB9KQorCisgICAgICAgIHdpdGggc2VsZi5zdWJwcm9jZXNzX3NlbmRfc2lnbmFsKHBpZCwgIlNJR1VTUjEiKSBhcyBjaGlsZDoKKyAgICAgICAgICAgIHNlbGYud2FpdF9zaWduYWwoY2hpbGQsICdTSUdVU1IxJywgU0lHVVNSMUV4Y2VwdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9zaWduYWxzLCB7J1NJR0hVUCc6IDEsICdTSUdVU1IxJzogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NJR0FMUk0nOiAwfSkKKworICAgICAgICB3aXRoIHNlbGYuc3VicHJvY2Vzc19zZW5kX3NpZ25hbChwaWQsICJTSUdVU1IyIikgYXMgY2hpbGQ6CisgICAgICAgICAgICAjIE5vdGhpbmcgc2hvdWxkIGhhcHBlbjogU0lHVVNSMiBpcyBpZ25vcmVkCisgICAgICAgICAgICBjaGlsZC53YWl0KCkKKworICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgc2VsZi53YWl0X3NpZ25hbChOb25lLCAnU0lHQUxSTScsIEtleWJvYXJkSW50ZXJydXB0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ290X3NpZ25hbHMsIHsnU0lHSFVQJzogMSwgJ1NJR1VTUjEnOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0lHQUxSTSc6IDB9KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5IGIvTGliL3Rlc3Qvc3VwcG9ydC9fX2luaXRfXy5weQppbmRleCA4NjdkYzJmLi4yYjI5NjY4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC9zdXBwb3J0L19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3N1cHBvcnQvX19pbml0X18ucHkKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBzeXNjb25maWcKIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHRpbWUKK2ltcG9ydCB0eXBlcwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdXJsbGliLmVycm9yCiBpbXBvcnQgd2FybmluZ3MKQEAgLTg5LDggKzkwLDkgQEAKICAgICAiYmlnbWVtdGVzdCIsICJiaWdhZGRyc3BhY2V0ZXN0IiwgImNweXRob25fb25seSIsICJnZXRfYXR0cmlidXRlIiwKICAgICAicmVxdWlyZXNfSUVFRV83NTQiLCAic2tpcF91bmxlc3NfeGF0dHIiLCAicmVxdWlyZXNfemxpYiIsCiAgICAgImFudGljaXBhdGVfZmFpbHVyZSIsICJsb2FkX3BhY2thZ2VfdGVzdHMiLCAiZGV0ZWN0X2FwaV9taXNtYXRjaCIsCisgICAgImNoZWNrX19hbGxfXyIsCiAgICAgIyBzeXMKLSAgICAiaXNfanl0aG9uIiwgImNoZWNrX2ltcGxfZGV0YWlsIiwKKyAgICAiaXNfanl0aG9uIiwgImlzX2FuZHJvaWQiLCAiY2hlY2tfaW1wbF9kZXRhaWwiLAogICAgICMgbmV0d29yawogICAgICJIT1NUIiwgIklQVjZfRU5BQkxFRCIsICJmaW5kX3VudXNlZF9wb3J0IiwgImJpbmRfcG9ydCIsICJvcGVuX3VybHJlc291cmNlIiwKICAgICAjIHByb2Nlc3NlcwpAQCAtNzMyLDYgKzczNCw4IEBACiAKIGlzX2p5dGhvbiA9IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykKIAoraXNfYW5kcm9pZCA9IGJvb2woc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdBTkRST0lEX0FQSV9MRVZFTCcpKQorCiAjIEZpbGVuYW1lIHVzZWQgZm9yIHRlc3RpbmcKIGlmIG9zLm5hbWUgPT0gJ2phdmEnOgogICAgICMgSnl0aG9uIGRpc2FsbG93cyBAIGluIG1vZHVsZSBuYW1lcwpAQCAtOTAwLDcgKzkwNCw3IEBACiAgICAgICAgIHlpZWxkIHBhdGgKICAgICBmaW5hbGx5OgogICAgICAgICBpZiBkaXJfY3JlYXRlZDoKLSAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKyAgICAgICAgICAgIHJtdHJlZShwYXRoKQogCiBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogZGVmIGNoYW5nZV9jd2QocGF0aCwgcXVpZXQ9RmFsc2UpOgpAQCAtMjA3Nyw2ICsyMDgxLDExIEBACiAgICAgc2V0dGluZ3MgaW4gc3lzLmZsYWdzIGFuZCBzeXMud2Fybm9wdGlvbnMuIiIiCiAgICAgcmV0dXJuIHN1YnByb2Nlc3MuX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCiAKK2RlZiBvcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgcmVwcm9kdWNpbmcgdGhlIGN1cnJlbnQKKyAgICBvcHRpbWl6YXRpb24gc2V0dGluZ3MgaW4gc3lzLmZsYWdzLiIiIgorICAgIHJldHVybiBzdWJwcm9jZXNzLl9vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKQorCiAjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjIFN1cHBvcnQgZm9yIGFzc2VydGlvbnMgYWJvdXQgbG9nZ2luZy4KICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTIyMjgsNiArMjIzNyw2NSBAQAogICAgIHJldHVybiBtaXNzaW5nX2l0ZW1zCiAKIAorZGVmIGNoZWNrX19hbGxfXyh0ZXN0X2Nhc2UsIG1vZHVsZSwgbmFtZV9vZl9tb2R1bGU9Tm9uZSwgZXh0cmE9KCksCisgICAgICAgICAgICAgICAgIGJsYWNrbGlzdD0oKSk6CisgICAgIiIiQXNzZXJ0IHRoYXQgdGhlIF9fYWxsX18gdmFyaWFibGUgb2YgJ21vZHVsZScgY29udGFpbnMgYWxsIHB1YmxpYyBuYW1lcy4KKworICAgIFRoZSBtb2R1bGUncyBwdWJsaWMgbmFtZXMgKGl0cyBBUEkpIGFyZSBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uCisgICAgd2hldGhlciB0aGV5IG1hdGNoIHRoZSBwdWJsaWMgbmFtZSBjb252ZW50aW9uIGFuZCB3ZXJlIGRlZmluZWQgaW4KKyAgICAnbW9kdWxlJy4KKworICAgIFRoZSAnbmFtZV9vZl9tb2R1bGUnIGFyZ3VtZW50IGNhbiBzcGVjaWZ5IChhcyBhIHN0cmluZyBvciB0dXBsZSB0aGVyZW9mKQorICAgIHdoYXQgbW9kdWxlKHMpIGFuIEFQSSBjb3VsZCBiZSBkZWZpbmVkIGluIGluIG9yZGVyIHRvIGJlIGRldGVjdGVkIGFzIGEKKyAgICBwdWJsaWMgQVBJLiBPbmUgY2FzZSBmb3IgdGhpcyBpcyB3aGVuICdtb2R1bGUnIGltcG9ydHMgcGFydCBvZiBpdHMgcHVibGljCisgICAgQVBJIGZyb20gb3RoZXIgbW9kdWxlcywgcG9zc2libHkgYSBDIGJhY2tlbmQgKGxpa2UgJ2NzdicgYW5kIGl0cyAnX2NzdicpLgorCisgICAgVGhlICdleHRyYScgYXJndW1lbnQgY2FuIGJlIGEgc2V0IG9mIG5hbWVzIHRoYXQgd291bGRuJ3Qgb3RoZXJ3aXNlIGJlCisgICAgYXV0b21hdGljYWxseSBkZXRlY3RlZCBhcyAicHVibGljIiwgbGlrZSBvYmplY3RzIHdpdGhvdXQgYSBwcm9wZXIKKyAgICAnX19tb2R1bGVfXycgYXR0cml1YnV0ZS4gSWYgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCisgICAgYXV0b21hdGljYWxseSBkZXRlY3RlZCBvbmVzLgorCisgICAgVGhlICdibGFja2xpc3QnIGFyZ3VtZW50IGNhbiBiZSBhIHNldCBvZiBuYW1lcyB0aGF0IG11c3Qgbm90IGJlIHRyZWF0ZWQKKyAgICBhcyBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGV2ZW4gdGhvdWdoIHRoZWlyIG5hbWVzIGluZGljYXRlIG90aGVyd2lzZS4KKworICAgIFVzYWdlOgorICAgICAgICBpbXBvcnQgYmFyCisgICAgICAgIGltcG9ydCBmb28KKyAgICAgICAgaW1wb3J0IHVuaXR0ZXN0CisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAorCisgICAgICAgIGNsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZm9vKQorCisgICAgICAgIGNsYXNzIE90aGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGV4dHJhID0geydCQVJfQ09OU1QnLCAnRk9PX0NPTlNUJ30KKyAgICAgICAgICAgICAgICBibGFja2xpc3QgPSB7J2Jheid9ICAjIFVuZG9jdW1lbnRlZCBuYW1lLgorICAgICAgICAgICAgICAgICMgYmFyIGltcG9ydHMgcGFydCBvZiBpdHMgQVBJIGZyb20gX2Jhci4KKyAgICAgICAgICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBiYXIsICgnYmFyJywgJ19iYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgICIiIgorCisgICAgaWYgbmFtZV9vZl9tb2R1bGUgaXMgTm9uZToKKyAgICAgICAgbmFtZV9vZl9tb2R1bGUgPSAobW9kdWxlLl9fbmFtZV9fLCApCisgICAgZWxpZiBpc2luc3RhbmNlKG5hbWVfb2ZfbW9kdWxlLCBzdHIpOgorICAgICAgICBuYW1lX29mX21vZHVsZSA9IChuYW1lX29mX21vZHVsZSwgKQorCisgICAgZXhwZWN0ZWQgPSBzZXQoZXh0cmEpCisKKyAgICBmb3IgbmFtZSBpbiBkaXIobW9kdWxlKToKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdfJykgb3IgbmFtZSBpbiBibGFja2xpc3Q6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBvYmogPSBnZXRhdHRyKG1vZHVsZSwgbmFtZSkKKyAgICAgICAgaWYgKGdldGF0dHIob2JqLCAnX19tb2R1bGVfXycsIE5vbmUpIGluIG5hbWVfb2ZfbW9kdWxlIG9yCisgICAgICAgICAgICAgICAgKG5vdCBoYXNhdHRyKG9iaiwgJ19fbW9kdWxlX18nKSBhbmQKKyAgICAgICAgICAgICAgICAgbm90IGlzaW5zdGFuY2Uob2JqLCB0eXBlcy5Nb2R1bGVUeXBlKSkpOgorICAgICAgICAgICAgZXhwZWN0ZWQuYWRkKG5hbWUpCisgICAgdGVzdF9jYXNlLmFzc2VydENvdW50RXF1YWwobW9kdWxlLl9fYWxsX18sIGV4cGVjdGVkKQorCisKIGNsYXNzIFN1cHByZXNzQ3Jhc2hSZXBvcnQ6CiAgICAgIiIiVHJ5IHRvIHByZXZlbnQgYSBjcmFzaCByZXBvcnQgZnJvbSBwb3BwaW5nIHVwLgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkgYi9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkKaW5kZXggNThmMmYwNC4uYWI0ZTI0NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weQpAQCAtNCw3ICs0LDYgQEAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBubF9sYW5naW5mbyA9IE5vbmUKIAotaW1wb3J0IGNvZGVjcwogaW1wb3J0IGxvY2FsZQogaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5CmluZGV4IGFjNjMyNWEuLmJjYmE4Y2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5CkBAIC00LDcgKzQsNiBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IHNodXRpbAogaW1wb3J0IHN0YXQKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9haWZjLnB5IGIvTGliL3Rlc3QvdGVzdF9haWZjLnB5CmluZGV4IGFiNTE0MzcuLjFiZDFmODkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYWlmYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FpZmMucHkKQEAgLTIsNyArMiw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgYXVkaW90ZXN0cwogZnJvbSBhdWRpb29wIGltcG9ydCBieXRlc3dhcAotaW1wb3J0IG9zCiBpbXBvcnQgaW8KIGltcG9ydCBzeXMKIGltcG9ydCBzdHJ1Y3QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CmluZGV4IGY5ZWUzOTguLjUyYzYyNDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJncGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcmdwYXJzZS5weQpAQCAtNDUxMiw2ICs0NTEyLDIxIEBACiAgICAgICAgIHN0cmluZyA9ICJOYW1lc3BhY2UoYmFyPSdzcGFtJywgZm9vPTQyKSIKICAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQogCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlX3N0YXJrd2FyZ3Nfbm90aWRlbnRpZmllcihzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoKip7JyInOiAncXVvdGUnfSkKKyAgICAgICAgc3RyaW5nID0gIiIiTmFtZXNwYWNlKCoqeyciJzogJ3F1b3RlJ30pIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZV9rd2FyZ3NfYW5kX3N0YXJrd2FyZ3Nfbm90aWRlbnRpZmllcihzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoYT0xLCAqKnsnIic6ICdxdW90ZSd9KQorICAgICAgICBzdHJpbmcgPSAiIiJOYW1lc3BhY2UoYT0xLCAqKnsnIic6ICdxdW90ZSd9KSIiIgorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG5zLCBzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Vfc3Rhcmt3YXJnc19pZGVudGlmaWVyKHNlbGYpOgorICAgICAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSgqKnsndmFsaWQnOiBUcnVlfSkKKyAgICAgICAgc3RyaW5nID0gIk5hbWVzcGFjZSh2YWxpZD1UcnVlKSIKKyAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChucywgc3RyaW5nKQorCiAgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgogICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKICAgICAgICAgc3RyaW5nID0gKApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weSBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKaW5kZXggNDgyNTI2ZS4uOGZkNTRjYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcnJheS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CkBAIC03LDggKzcsNiBAQAogaW1wb3J0IHdlYWtyZWYKIGltcG9ydCBwaWNrbGUKIGltcG9ydCBvcGVyYXRvcgotaW1wb3J0IGlvCi1pbXBvcnQgbWF0aAogaW1wb3J0IHN0cnVjdAogaW1wb3J0IHN5cwogaW1wb3J0IHdhcm5pbmdzCkBAIC0zMTgsOCArMzE2LDE5IEBACiAgICAgICAgICAgICBkID0gcGlja2xlLmR1bXBzKChpdG9yaWcsIG9yaWcpLCBwcm90bykKICAgICAgICAgICAgIGl0LCBhID0gcGlja2xlLmxvYWRzKGQpCiAgICAgICAgICAgICBhLmZyb21saXN0KGRhdGEyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGl0KSwgdHlwZShpdG9yaWcpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgZGF0YTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBbXSkKKworICAgIGRlZiB0ZXN0X2V4aGF1c3RlZF9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGEpLCBsaXN0KHNlbGYuZXhhbXBsZSkpCisgICAgICAgIGV4aGl0ID0gaXRlcihhKQorICAgICAgICBlbXBpdCA9IGl0ZXIoYSkKKyAgICAgICAgZm9yIHggaW4gZXhoaXQ6ICAjIGV4aGF1c3QgdGhlIGl0ZXJhdG9yCisgICAgICAgICAgICBuZXh0KGVtcGl0KSAgIyBub3QgZXhoYXVzdGVkCisgICAgICAgIGEuYXBwZW5kKHNlbGYub3V0c2lkZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGV4aGl0KSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChlbXBpdCksIFtzZWxmLm91dHNpZGVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYSksIGxpc3Qoc2VsZi5leGFtcGxlKSArIFtzZWxmLm91dHNpZGVdKQogCiAgICAgZGVmIHRlc3RfaW5zZXJ0KHNlbGYpOgogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQpAQCAtMTA3MCw2ICsxMDc5LDEyIEBACiAgICAgICAgIGEgPSBhcnJheS5hcnJheSgnQicsIGIiIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIGdldGJ1ZmZlcl93aXRoX251bGxfdmlldywgYSkKIAorICAgIGRlZiB0ZXN0X2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYpOgorICAgICAgICBzdXBwb3J0LmNoZWNrX2ZyZWVfYWZ0ZXJfaXRlcmF0aW5nKHNlbGYsIGl0ZXIsIGFycmF5LmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnR5cGVjb2RlLCkpCisgICAgICAgIHN1cHBvcnQuY2hlY2tfZnJlZV9hZnRlcl9pdGVyYXRpbmcoc2VsZiwgcmV2ZXJzZWQsIGFycmF5LmFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnR5cGVjb2RlLCkpCisKIGNsYXNzIFN0cmluZ1Rlc3QoQmFzZVRlc3QpOgogCiAgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggZDNlNmQzNS4uZTAzMmY2ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTEsNyArMSw4IEBACitpbXBvcnQgYXN0CitpbXBvcnQgZGlzCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IGFzdAogaW1wb3J0IHdlYWtyZWYKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0yMzgsNyArMjM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXN0X3RyZWUgPSBjb21waWxlKGksICI/Iiwga2luZCwgYXN0LlB5Q0ZfT05MWV9BU1QpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9fdHVwbGUoYXN0X3RyZWUpLCBvKQogICAgICAgICAgICAgICAgICAgICBzZWxmLl9hc3NlcnRUcnVlb3JkZXIoYXN0X3RyZWUsICgwLCAwKSkKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChhY3Rpb249ImNvbXBpbGluZyIsIGlucHV0PWkpOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGFjdGlvbj0iY29tcGlsaW5nIiwgaW5wdXQ9aSwga2luZD1raW5kKToKICAgICAgICAgICAgICAgICAgICAgY29tcGlsZShhc3RfdHJlZSwgIj8iLCBraW5kKQogCiAgICAgZGVmIHRlc3Rfc2xpY2Uoc2VsZik6CkBAIC01NDcsNiArNTQ4LDE3IEBACiAgICAgICAgICAgICBjb21waWxlKG1vZCwgJ3Rlc3QnLCAnZXhlYycpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImludmFsaWQgaW50ZWdlciB2YWx1ZTogTm9uZSIsIHN0cihjbS5leGNlcHRpb24pKQogCisgICAgZGVmIHRlc3RfbGV2ZWxfYXNfbm9uZShzZWxmKToKKyAgICAgICAgYm9keSA9IFthc3QuSW1wb3J0RnJvbShtb2R1bGU9J3RpbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzPVthc3QuYWxpYXMobmFtZT0nc2xlZXAnKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89MCwgY29sX29mZnNldD0wKV0KKyAgICAgICAgbW9kID0gYXN0Lk1vZHVsZShib2R5KQorICAgICAgICBjb2RlID0gY29tcGlsZShtb2QsICd0ZXN0JywgJ2V4ZWMnKQorICAgICAgICBucyA9IHt9CisgICAgICAgIGV4ZWMoY29kZSwgbnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3NsZWVwJywgbnMpCisKIAogY2xhc3MgQVNUVmFsaWRhdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC03NDIsNyArNzU0LDcgQEAKIAogICAgIGRlZiB0ZXN0X2ltcG9ydGZyb20oc2VsZik6CiAgICAgICAgIGltcCA9IGFzdC5JbXBvcnRGcm9tKE5vbmUsIFthc3QuYWxpYXMoIngiLCBOb25lKV0sIC00MikKLSAgICAgICAgc2VsZi5zdG10KGltcCwgImxldmVsIGxlc3MgdGhhbiAtMSIpCisgICAgICAgIHNlbGYuc3RtdChpbXAsICJOZWdhdGl2ZSBJbXBvcnRGcm9tIGxldmVsIikKICAgICAgICAgc2VsZi5zdG10KGFzdC5JbXBvcnRGcm9tKE5vbmUsIFtdLCAwKSwgImVtcHR5IG5hbWVzIG9uIEltcG9ydEZyb20iKQogCiAgICAgZGVmIHRlc3RfZ2xvYmFsKHNlbGYpOgpAQCAtOTMzLDYgKzk0NSwxMjUgQEAKICAgICAgICAgICAgIGNvbXBpbGUobW9kLCBmbiwgImV4ZWMiKQogCiAKK2NsYXNzIENvbnN0YW50VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIG9uIHRoZSBhc3QuQ29uc3RhbnQgbm9kZSB0eXBlLiIiIgorCisgICAgZGVmIGNvbXBpbGVfY29uc3RhbnQoc2VsZiwgdmFsdWUpOgorICAgICAgICB0cmVlID0gYXN0LnBhcnNlKCJ4ID0gMTIzIikKKworICAgICAgICBub2RlID0gdHJlZS5ib2R5WzBdLnZhbHVlCisgICAgICAgIG5ld19ub2RlID0gYXN0LkNvbnN0YW50KHZhbHVlPXZhbHVlKQorICAgICAgICBhc3QuY29weV9sb2NhdGlvbihuZXdfbm9kZSwgbm9kZSkKKyAgICAgICAgdHJlZS5ib2R5WzBdLnZhbHVlID0gbmV3X25vZGUKKworICAgICAgICBjb2RlID0gY29tcGlsZSh0cmVlLCAiPHN0cmluZz4iLCAiZXhlYyIpCisKKyAgICAgICAgbnMgPSB7fQorICAgICAgICBleGVjKGNvZGUsIG5zKQorICAgICAgICByZXR1cm4gbnNbJ3gnXQorCisgICAgZGVmIHRlc3RfdmFsaWRhdGlvbihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgc2VsZi5jb21waWxlX2NvbnN0YW50KFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20uZXhjZXB0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZ290IGFuIGludmFsaWQgdHlwZSBpbiBDb25zdGFudDogbGlzdCIpCisKKyAgICBkZWYgdGVzdF9zaW5nbGV0b25zKHNlbGYpOgorICAgICAgICBmb3IgY29uc3QgaW4gKE5vbmUsIEZhbHNlLCBUcnVlLCBFbGxpcHNpcywgYicnLCBmcm96ZW5zZXQoKSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChjb25zdD1jb25zdCk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbXBpbGVfY29uc3RhbnQoY29uc3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2YWx1ZSwgY29uc3QpCisKKyAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CisgICAgICAgIG5lc3RlZF90dXBsZSA9ICgxLCkKKyAgICAgICAgbmVzdGVkX2Zyb3plbnNldCA9IGZyb3plbnNldCh7MX0pCisgICAgICAgIGZvciBsZXZlbCBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIG5lc3RlZF90dXBsZSA9IChuZXN0ZWRfdHVwbGUsIDIpCisgICAgICAgICAgICBuZXN0ZWRfZnJvemVuc2V0ID0gZnJvemVuc2V0KHtuZXN0ZWRfZnJvemVuc2V0LCAyfSkKKyAgICAgICAgdmFsdWVzID0gKDEyMywgMTIzLjAsIDEyM2osCisgICAgICAgICAgICAgICAgICAidW5pY29kZSIsIGInYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgdHVwbGUoInR1cGxlIiksIGZyb3plbnNldCgiZnJvemVuc2V0IiksCisgICAgICAgICAgICAgICAgICBuZXN0ZWRfdHVwbGUsIG5lc3RlZF9mcm96ZW5zZXQpCisgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh2YWx1ZT12YWx1ZSk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb21waWxlX2NvbnN0YW50KHZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCB2YWx1ZSkKKworICAgIGRlZiB0ZXN0X2Fzc2lnbl90b19jb25zdGFudChzZWxmKToKKyAgICAgICAgdHJlZSA9IGFzdC5wYXJzZSgieCA9IDEiKQorCisgICAgICAgIHRhcmdldCA9IHRyZWUuYm9keVswXS50YXJnZXRzWzBdCisgICAgICAgIG5ld190YXJnZXQgPSBhc3QuQ29uc3RhbnQodmFsdWU9MSkKKyAgICAgICAgYXN0LmNvcHlfbG9jYXRpb24obmV3X3RhcmdldCwgdGFyZ2V0KQorICAgICAgICB0cmVlLmJvZHlbMF0udGFyZ2V0c1swXSA9IG5ld190YXJnZXQKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgY29tcGlsZSh0cmVlLCAic3RyaW5nIiwgImV4ZWMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleHByZXNzaW9uIHdoaWNoIGNhbid0IGJlIGFzc2lnbmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidG8gaW4gU3RvcmUgY29udGV4dCIpCisKKyAgICBkZWYgdGVzdF9nZXRfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICB0cmVlID0gYXN0LnBhcnNlKCInZG9jc3RyaW5nJ1xueCA9IDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5nZXRfZG9jc3RyaW5nKHRyZWUpLCAnZG9jc3RyaW5nJykKKworICAgICAgICB0cmVlLmJvZHlbMF0udmFsdWUgPSBhc3QuQ29uc3RhbnQodmFsdWU9J2NvbnN0YW50IGRvY3N0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmdldF9kb2NzdHJpbmcodHJlZSksICdjb25zdGFudCBkb2NzdHJpbmcnKQorCisgICAgZGVmIGdldF9sb2FkX2NvbnN0KHNlbGYsIHRyZWUpOgorICAgICAgICAjIENvbXBpbGUgdG8gYnl0ZWNvZGUsIGRpc2Fzc2VtYmxlIGFuZCBnZXQgcGFyYW1ldGVyIG9mIExPQURfQ09OU1QKKyAgICAgICAgIyBpbnN0cnVjdGlvbnMKKyAgICAgICAgY28gPSBjb21waWxlKHRyZWUsICc8c3RyaW5nPicsICdleGVjJykKKyAgICAgICAgY29uc3RzID0gW10KKyAgICAgICAgZm9yIGluc3RyIGluIGRpcy5nZXRfaW5zdHJ1Y3Rpb25zKGNvKToKKyAgICAgICAgICAgIGlmIGluc3RyLm9wbmFtZSA9PSAnTE9BRF9DT05TVCc6CisgICAgICAgICAgICAgICAgY29uc3RzLmFwcGVuZChpbnN0ci5hcmd2YWwpCisgICAgICAgIHJldHVybiBjb25zdHMKKworICAgIEBzdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2xvYWRfY29uc3Qoc2VsZik6CisgICAgICAgIGNvbnN0cyA9IFtOb25lLAorICAgICAgICAgICAgICAgICAgVHJ1ZSwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAxMjQsCisgICAgICAgICAgICAgICAgICAyLjAsCisgICAgICAgICAgICAgICAgICAzaiwKKyAgICAgICAgICAgICAgICAgICJ1bmljb2RlIiwKKyAgICAgICAgICAgICAgICAgIGInYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgKDEsIDIsIDMpXQorCisgICAgICAgIGNvZGUgPSAnXG4nLmpvaW4oWyd4PXshcn0nLmZvcm1hdChjb25zdCkgZm9yIGNvbnN0IGluIGNvbnN0c10pCisgICAgICAgIGNvZGUgKz0gJ1xueCA9IC4uLicKKyAgICAgICAgY29uc3RzLmV4dGVuZCgoRWxsaXBzaXMsIE5vbmUpKQorCisgICAgICAgIHRyZWUgPSBhc3QucGFyc2UoY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF9sb2FkX2NvbnN0KHRyZWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cykKKworICAgICAgICAjIFJlcGxhY2UgZXhwcmVzc2lvbiBub2RlcyB3aXRoIGNvbnN0YW50cworICAgICAgICBmb3IgYXNzaWduLCBjb25zdCBpbiB6aXAodHJlZS5ib2R5LCBjb25zdHMpOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYXNzaWduLCBhc3QuQXNzaWduKSwgYXN0LmR1bXAoYXNzaWduKQorICAgICAgICAgICAgbmV3X25vZGUgPSBhc3QuQ29uc3RhbnQodmFsdWU9Y29uc3QpCisgICAgICAgICAgICBhc3QuY29weV9sb2NhdGlvbihuZXdfbm9kZSwgYXNzaWduLnZhbHVlKQorICAgICAgICAgICAgYXNzaWduLnZhbHVlID0gbmV3X25vZGUKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2xvYWRfY29uc3QodHJlZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RzKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbF9ldmFsKHNlbGYpOgorICAgICAgICB0cmVlID0gYXN0LnBhcnNlKCIxICsgMiIpCisgICAgICAgIGJpbm9wID0gdHJlZS5ib2R5WzBdLnZhbHVlCisKKyAgICAgICAgbmV3X2xlZnQgPSBhc3QuQ29uc3RhbnQodmFsdWU9MTApCisgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld19sZWZ0LCBiaW5vcC5sZWZ0KQorICAgICAgICBiaW5vcC5sZWZ0ID0gbmV3X2xlZnQKKworICAgICAgICBuZXdfcmlnaHQgPSBhc3QuQ29uc3RhbnQodmFsdWU9MjApCisgICAgICAgIGFzdC5jb3B5X2xvY2F0aW9uKG5ld19yaWdodCwgYmlub3AucmlnaHQpCisgICAgICAgIGJpbm9wLnJpZ2h0ID0gbmV3X3JpZ2h0CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKGJpbm9wKSwgMzApCisKKwogZGVmIG1haW4oKToKICAgICBpZiBfX25hbWVfXyAhPSAnX19tYWluX18nOgogICAgICAgICByZXR1cm4KQEAgLTk0MCw4ICsxMDcxLDkgQEAKICAgICAgICAgZm9yIHN0YXRlbWVudHMsIGtpbmQgaW4gKChleGVjX3Rlc3RzLCAiZXhlYyIpLCAoc2luZ2xlX3Rlc3RzLCAic2luZ2xlIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgImV2YWwiKSk6CiAgICAgICAgICAgICBwcmludChraW5kKyJfcmVzdWx0cyA9IFsiKQotICAgICAgICAgICAgZm9yIHMgaW4gc3RhdGVtZW50czoKLSAgICAgICAgICAgICAgICBwcmludChyZXByKHRvX3R1cGxlKGNvbXBpbGUocywgIj8iLCBraW5kLCAweDQwMCkpKSsiLCIpCisgICAgICAgICAgICBmb3Igc3RhdGVtZW50IGluIHN0YXRlbWVudHM6CisgICAgICAgICAgICAgICAgdHJlZSA9IGFzdC5wYXJzZShzdGF0ZW1lbnQsICI/Iiwga2luZCkKKyAgICAgICAgICAgICAgICBwcmludCgiJXIsIiAlICh0b190dXBsZSh0cmVlKSwpKQogICAgICAgICAgICAgcHJpbnQoIl0iKQogICAgICAgICBwcmludCgibWFpbigpIikKICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKaW5kZXggM2EzM2ZjOC4uMGViYTc2ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CkBAIC0xMiw3ICsxMiw2IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgd2FybmluZ3MKIGltcG9ydCB1bml0dGVzdC5tb2NrCiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZGluZwpAQCAtMjk3LDM3ICsyOTYsNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzeW5jaGF0LmZpbmRfcHJlZml4X2F0X2VuZCgicXdlcnR5ZGtqZiIsICJcclxuIiksIDApCiAKIAotY2xhc3MgVGVzdEZpZm8odW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKSBhcyBjbToKLSAgICAgICAgICAgIGYgPSBhc3luY2hhdC5maWZvKCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20ud2FybmluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZpZm8gY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjYiKQotICAgICAgICBmLnB1c2goNykKLSAgICAgICAgZi5wdXNoKGInYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYpLCAyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZmlyc3QoKSwgNykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgNykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYpLCAxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZmlyc3QoKSwgYidhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmlzX2VtcHR5KCksIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCBiJ2EnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc19lbXB0eSgpLCBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgwLCBOb25lKSkKLQotICAgIGRlZiB0ZXN0X2dpdmVuX2xpc3Qoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpIGFzIGNtOgotICAgICAgICAgICAgZiA9IGFzeW5jaGF0LmZpZm8oW2IneCcsIDE3LCAzXSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY20ud2FybmluZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZpZm8gY2xhc3Mgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjYiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgYid4JykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsIDE3KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgMykpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDAsIE5vbmUpKQotCi0KIGNsYXNzIFRlc3ROb3RDb25uZWN0ZWQodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Rpc2FsbG93X25lZ2F0aXZlX3Rlcm1pbmF0b3Ioc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzExMjU5CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CmluZGV4IDQwYWM5YmYuLjYxMzNiYmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0xNCw3ICsxNCw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcGVyYXRvcgogaW1wb3J0IHN5cwotaW1wb3J0IGZ1bmN0b29scwogCiAjIFRoZXNlIHRlc3RzIGFsbCB1c2Ugb25lIG9mIHRoZSBiaWdtZW10ZXN0IGRlY29yYXRvcnMgdG8gaW5kaWNhdGUgaG93IG11Y2gKICMgbWVtb3J5IHRoZXkgdXNlIGFuZCBob3cgbXVjaCBtZW1vcnkgdGhleSBuZWVkIHRvIGJlIGV2ZW4gbWVhbmluZ2Z1bC4gIFRoZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weSBiL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKaW5kZXggODM2N2FmZS4uZmJjOTMzZTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQpAQCAtMTU5LDExICsxNTksMjUgQEAKICAgICAgICAgIyBUaGVuIGNhbGN1bGF0ZSB0aGUgaGV4YmluNCBiaW5hcnktdG8tQVNDSUkgdHJhbnNsYXRpb24KICAgICAgICAgcmxlID0gYmluYXNjaWkucmxlY29kZV9ocXgoc2VsZi5kYXRhKQogICAgICAgICBhID0gYmluYXNjaWkuYjJhX2hxeChzZWxmLnR5cGUydGVzdChybGUpKQorCiAgICAgICAgIGIsIF8gPSBiaW5hc2NpaS5hMmJfaHF4KHNlbGYudHlwZTJ0ZXN0KGEpKQogICAgICAgICByZXMgPSBiaW5hc2NpaS5ybGVkZWNvZGVfaHF4KGIpCi0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYucmF3ZGF0YSkKIAorICAgIGRlZiB0ZXN0X3JsZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IHJlcGV0aXRpb24gd2l0aCBhIHJlcGV0aXRpb24gbG9uZ2VyIHRoYW4gdGhlIGxpbWl0IG9mIDI1NQorICAgICAgICBkYXRhID0gKGInYScgKiAxMDAgKyBiJ2InICsgYidjJyAqIDMwMCkKKworICAgICAgICBlbmNvZGVkID0gYmluYXNjaWkucmxlY29kZV9ocXgoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ2FceDkwZCcgICAgICAjICdhJyAqIDEwMAorICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2InICAgICAgICAgICAjICdiJworICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2NceDkwXHhmZicgICAjICdjJyAqIDI1NQorICAgICAgICAgICAgICAgICAgICAgICAgICBiJ2NceDkwLScpKSAgICAjICdjJyAqIDQ1CisKKyAgICAgICAgZGVjb2RlZCA9IGJpbmFzY2lpLnJsZWRlY29kZV9ocXgoZW5jb2RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkLCBkYXRhKQorCiAgICAgZGVmIHRlc3RfaGV4KHNlbGYpOgogICAgICAgICAjIHRlc3QgaGV4bGlmaWNhdGlvbgogICAgICAgICBzID0gYid7c1wwMDVcMDAwXDAwMFwwMDB3b3JsZGlcMDAyXDAwMFwwMDBcMDAwc1wwMDVcMDAwXDAwMFwwMDBoZWxsb2lcMDAxXDAwMFwwMDBcMDAwMCcKQEAgLTI2Miw2ICsyNzYsMTYgQEAKICAgICAgICAgICAgICMgbm9uLUFTQ0lJIHN0cmluZwogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYTJiLCAiXHg4MCIpCiAKKyAgICBkZWYgdGVzdF9iMmFfYmFzZTY0X25ld2xpbmUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzI1MzU3OiB0ZXN0IG5ld2xpbmUgcGFyYW1ldGVyCisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfYmFzZTY0KGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYUdWc2JHOD1cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX2Jhc2U2NChiLCBuZXdsaW5lPVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYUdWc2JHOD1cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX2Jhc2U2NChiLCBuZXdsaW5lPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2FHVnNiRzg9JykKKwogCiBjbGFzcyBBcnJheUJpbkFTQ0lJVGVzdChCaW5BU0NJSVRlc3QpOgogICAgIGRlZiB0eXBlMnRlc3Qoc2VsZiwgcyk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpbmhleC5weSBiL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CmluZGV4IDlkNGM4NWEuLjIxZjQ0NjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmluaGV4LnB5CkBAIC00LDcgKzQsNiBAQAogICAgQmFzZWQgb24gYW4gb3JpZ2luYWwgdGVzdCBieSBSb2dlciBFLiBNYXNzZS4KICIiIgogaW1wb3J0IGJpbmhleAotaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5IGIvTGliL3Rlc3QvdGVzdF9iaW5vcC5weQppbmRleCBlOWRiZGRjLi5mYzhkMzBmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkKQEAgLTIsNyArMiw3IEBACiAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0Ci1mcm9tIG9wZXJhdG9yIGltcG9ydCBlcSwgbmUsIGx0LCBndCwgbGUsIGdlCitmcm9tIG9wZXJhdG9yIGltcG9ydCBlcSwgbGUKIGZyb20gYWJjIGltcG9ydCBBQkNNZXRhCiAKIGRlZiBnY2QoYSwgYik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1ZmZlci5weSBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CmluZGV4IDJlZWY5ZmMuLmI4M2YyZjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVmZmVyLnB5CkBAIC0xNiw3ICsxNiw2IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gaXRlcnRvb2xzIGltcG9ydCBwZXJtdXRhdGlvbnMsIHByb2R1Y3QKIGZyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UsIHNhbXBsZSwgY2hvaWNlCi1mcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXIKIGltcG9ydCB3YXJuaW5ncwogaW1wb3J0IHN5cywgYXJyYXksIGlvCiBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkgYi9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CmluZGV4IGNjMzEyYjEuLjEyOWI0YWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQpAQCAtMjY5LDYgKzI2OSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMjAwLCBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IDMwMCBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IC0xIGluIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogc3lzLm1heHNpemUrMSBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogTm9uZSBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZmxvYXQob3JkKCdhJykpIGluIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAiYSIgaW4gYikKQEAgLTMwMCw2ICszMDEsMjAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QuZnJvbWhleCwgJ1x4MDAnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCAnMTIgICBceDAwICAgMzQnKQogCisgICAgICAgIGZvciBkYXRhLCBwb3MgaW4gKAorICAgICAgICAgICAgIyBpbnZhbGlkIGZpcnN0IGhleGFkZWNpbWFsIGNoYXJhY3RlcgorICAgICAgICAgICAgKCcxMiB4NCA1NicsIDMpLAorICAgICAgICAgICAgIyBpbnZhbGlkIHNlY29uZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIKKyAgICAgICAgICAgICgnMTIgM3ggNTYnLCA0KSwKKyAgICAgICAgICAgICMgdHdvIGludmFsaWQgaGV4YWRlY2ltYWwgY2hhcmFjdGVycworICAgICAgICAgICAgKCcxMiB4eSA1NicsIDMpLAorICAgICAgICAgICAgIyB0ZXN0IG5vbi1BU0NJSSBzdHJpbmcKKyAgICAgICAgICAgICgnMTIgM1x4ZmYgNTYnLCA0KSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgY206CisgICAgICAgICAgICAgICAgc2VsZi50eXBlMnRlc3QuZnJvbWhleChkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignYXQgcG9zaXRpb24gJXMnICUgcG9zLCBzdHIoY20uZXhjZXB0aW9uKSkKKwogICAgIGRlZiB0ZXN0X2hleChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdC5oZXgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QuaGV4LCAxKQpAQCAtNzIyLDI2ICs3MzcsMTA3IEBACiAKICAgICAjIFRlc3QgUHlCeXRlc19Gcm9tRm9ybWF0KCkKICAgICBkZWYgdGVzdF9mcm9tX2Zvcm1hdChzZWxmKToKLSAgICAgICAgdGVzdC5zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2N0eXBlcycpCi0gICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBweXRob25hcGksIHB5X29iamVjdCwgY19pbnQsIGNfY2hhcl9wCisgICAgICAgIGN0eXBlcyA9IHRlc3Quc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdjdHlwZXMnKQorICAgICAgICBfdGVzdGNhcGkgPSB0ZXN0LnN1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3Rlc3RjYXBpJykKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHB5dGhvbmFwaSwgcHlfb2JqZWN0CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCAoCisgICAgICAgICAgICBjX2ludCwgY191aW50LAorICAgICAgICAgICAgY19sb25nLCBjX3Vsb25nLAorICAgICAgICAgICAgY19zaXplX3QsIGNfc3NpemVfdCwKKyAgICAgICAgICAgIGNfY2hhcl9wKQorCiAgICAgICAgIFB5Qnl0ZXNfRnJvbUZvcm1hdCA9IHB5dGhvbmFwaS5QeUJ5dGVzX0Zyb21Gb3JtYXQKICAgICAgICAgUHlCeXRlc19Gcm9tRm9ybWF0LnJlc3R5cGUgPSBweV9vYmplY3QKIAorICAgICAgICAjIGJhc2ljIHRlc3RzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInZm9ybWF0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYidmb3JtYXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ0hlbGxvICVzICEnLCBiJ3dvcmxkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidIZWxsbyB3b3JsZCAhJykKIAorICAgICAgICAjIHRlc3QgZm9ybWF0dGVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2M9JWMnLCBjX2ludCgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidjPVwwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidjPSVjJywgY19pbnQob3JkKCdAJykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2M9QCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInYz0lYycsIGNfaW50KDI1NSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYz1ceGZmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidkPSVkIGxkPSVsZCB6ZD0lemQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2ludCgxKSwgY19sb25nKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3NpemVfdCgzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidkPTEgbGQ9MiB6ZD0zJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidkPSVkIGxkPSVsZCB6ZD0lemQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2ludCgtMSksIGNfbG9uZygtMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfc2l6ZV90KC0zKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidkPS0xIGxkPS0yIHpkPS0zJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYid1PSV1IGx1PSVsdSB6dT0lenUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3VpbnQoMTIzKSwgY191bG9uZyg0NTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3NpemVfdCg3ODkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ3U9MTIzIGx1PTQ1NiB6dT03ODknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2k9JWknLCBjX2ludCgxMjMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ2k9MTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYidpPSVpJywgY19pbnQoLTEyMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInaT0tMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYid4PSV4JywgY19pbnQoMHhhYmMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ3g9YWJjJykKKworICAgICAgICBzaXplb2ZfcHRyID0gY3R5cGVzLnNpemVvZihjX2NoYXJfcCkKKworICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICAjIFdpbmRvd3MgKE1TQ1JUKQorICAgICAgICAgICAgcHRyX2Zvcm1hdCA9ICcweCUwe31YJy5mb3JtYXQoMiAqIHNpemVvZl9wdHIpCisgICAgICAgICAgICBkZWYgcHRyX2Zvcm1hdHRlcihwdHIpOgorICAgICAgICAgICAgICAgIHJldHVybiAocHRyX2Zvcm1hdCAlIHB0cikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVU5JWCAoZ2xpYmMpCisgICAgICAgICAgICBkZWYgcHRyX2Zvcm1hdHRlcihwdHIpOgorICAgICAgICAgICAgICAgIHJldHVybiAnJSN4JyAlIHB0cgorCisgICAgICAgIHB0ciA9IDB4YWJjZGVmCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGIncHRyPSVwJywgY19jaGFyX3AocHRyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdwdHI9JyArIHB0cl9mb3JtYXR0ZXIocHRyKSkuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ3M9JXMnLCBjX2NoYXJfcChiJ2NzdHInKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidzPWNzdHInKQorCisgICAgICAgICMgdGVzdCBtaW5pbXVtIGFuZCBtYXhpbXVtIGludGVnZXIgdmFsdWVzCisgICAgICAgIHNpemVfbWF4ID0gY19zaXplX3QoLTEpLnZhbHVlCisgICAgICAgIGZvciBmb3JtYXRzdHIsIGN0eXBlc190eXBlLCB2YWx1ZSwgcHlfZm9ybWF0dGVyIGluICgKKyAgICAgICAgICAgIChiJyVkJywgY19pbnQsIF90ZXN0Y2FwaS5JTlRfTUlOLCBzdHIpLAorICAgICAgICAgICAgKGInJWQnLCBjX2ludCwgX3Rlc3RjYXBpLklOVF9NQVgsIHN0ciksCisgICAgICAgICAgICAoYiclbGQnLCBjX2xvbmcsIF90ZXN0Y2FwaS5MT05HX01JTiwgc3RyKSwKKyAgICAgICAgICAgIChiJyVsZCcsIGNfbG9uZywgX3Rlc3RjYXBpLkxPTkdfTUFYLCBzdHIpLAorICAgICAgICAgICAgKGInJWx1JywgY191bG9uZywgX3Rlc3RjYXBpLlVMT05HX01BWCwgc3RyKSwKKyAgICAgICAgICAgIChiJyV6ZCcsIGNfc3NpemVfdCwgX3Rlc3RjYXBpLlBZX1NTSVpFX1RfTUlOLCBzdHIpLAorICAgICAgICAgICAgKGInJXpkJywgY19zc2l6ZV90LCBfdGVzdGNhcGkuUFlfU1NJWkVfVF9NQVgsIHN0ciksCisgICAgICAgICAgICAoYiclenUnLCBjX3NpemVfdCwgc2l6ZV9tYXgsIHN0ciksCisgICAgICAgICAgICAoYiclcCcsIGNfY2hhcl9wLCBzaXplX21heCwgcHRyX2Zvcm1hdHRlciksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChmb3JtYXRzdHIsIGN0eXBlc190eXBlKHZhbHVlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5X2Zvcm1hdHRlcih2YWx1ZSkuZW5jb2RlKCdhc2NpaScpKSwKKworICAgICAgICAjIHdpZHRoIGFuZCBwcmVjaXNpb24gKHdpZHRoIGlzIGN1cnJlbnRseSBpZ25vcmVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyU1cycsIGInYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJS4zcycsIGInYWJjZGVmJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidhYmMnKQorCisgICAgICAgICMgJyUlJyBmb3JtYXR0ZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInJScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInWyUlXScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInWyVdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJSVjJywgY19pbnQob3JkKCdfJykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJyVfJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYiclJXMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJyVzJykKKworICAgICAgICAjIEludmFsaWQgZm9ybWF0cyBhbmQgcGFydGlhbCBmb3JtYXR0aW5nCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJScpLCBiJyUnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlJyksIGInJScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInJSVzJyksIGInJXMnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ1slJV0nKSwgYidbJV0nKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJyUlJWMnLCBjX2ludChvcmQoJ18nKSkpLCBiJyVfJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeUJ5dGVzX0Zyb21Gb3JtYXQoYid4PSVpIHk9JScsIGNfaW50KDIpLCBjX2ludCgzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYid4PTIgeT0lJykKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5Qnl0ZXNfRnJvbUZvcm1hdChiJ2M6JWMnLCBjX2ludCgyNTUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiJ2M6XHhmZicpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlCeXRlc19Gcm9tRm9ybWF0KGInczolcycsIGNfY2hhcl9wKGInY3N0cicpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiJ3M6Y3N0cicpCi0KLSAgICAgICAgIyBJc3N1ZSAjMTk5NjkKKyAgICAgICAgIyBJc3N1ZSAjMTk5Njk6ICVjIG11c3QgcmFpc2UgT3ZlcmZsb3dFcnJvciBmb3IgdmFsdWVzCisgICAgICAgICMgbm90IGluIHRoZSByYW5nZSBbMDsgMjU1XQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0Zyb21Gb3JtYXQsIGInJWMnLCBjX2ludCgtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCkBAIC0xNTA0LDcgKzE2MDAsMzIgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhKSwgdHlwZShiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhLnkpLCB0eXBlKGIueSkpCiAKLSAgICB0ZXN0X2Zyb21oZXggPSBCYXNlQnl0ZXNUZXN0LnRlc3RfZnJvbWhleAorICAgIGRlZiB0ZXN0X2Zyb21oZXgoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdC5mcm9taGV4KCcxYTJCMzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInXHgxYVx4MmJceDMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGIpLCBzZWxmLnR5cGUydGVzdCkKKworICAgICAgICBjbGFzcyBCMShzZWxmLmJhc2V0eXBlKToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgdmFsdWUpOgorICAgICAgICAgICAgICAgIG1lID0gc2VsZi5iYXNldHlwZS5fX25ld19fKGNscywgdmFsdWUpCisgICAgICAgICAgICAgICAgbWUuZm9vID0gJ2JhcicKKyAgICAgICAgICAgICAgICByZXR1cm4gbWUKKworICAgICAgICBiID0gQjEuZnJvbWhleCgnMWEyQjMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ1x4MWFceDJiXHgzMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShiKSwgQjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5mb28sICdiYXInKQorCisgICAgICAgIGNsYXNzIEIyKHNlbGYuYmFzZXR5cGUpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKG1lLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuYmFzZXR5cGUgaXMgbm90IGJ5dGVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJhc2V0eXBlLl9faW5pdF9fKG1lLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICAgICAgbWUuZm9vID0gJ2JhcicKKworICAgICAgICBiID0gQjIuZnJvbWhleCgnMWEyQjMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ1x4MWFceDJiXHgzMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShiKSwgQjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5mb28sICdiYXInKQogCiAKIGNsYXNzIEJ5dGVBcnJheVN1YmNsYXNzKGJ5dGVhcnJheSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5IGIvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQppbmRleCA4MGVkNjMyLi42ZGFkMDU4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKQEAgLTcwMiwxOSArNzAyLDE5IEBACiAKICAgICBkZWYgYXNzZXJ0RmFpbHVyZShzZWxmLCAqYXJncyk6CiAgICAgICAgIHJjLCBzdGRvdXQsIHN0ZGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLW0nLCAnY2FsZW5kYXInLCAqYXJncykKLSAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1VzYWdlOicsIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ3VzYWdlOicsIHN0ZGVycikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMikKIAogICAgIGRlZiB0ZXN0X2hlbHAoc2VsZik6CiAgICAgICAgIHN0ZG91dCA9IHNlbGYucnVuX29rKCctaCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0SW4oYidVc2FnZTonLCBzdGRvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYid1c2FnZTonLCBzdGRvdXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidjYWxlbmRhci5weScsIHN0ZG91dCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihiJy0taGVscCcsIHN0ZG91dCkKIAogICAgIGRlZiB0ZXN0X2lsbGVnYWxfYXJndW1lbnRzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEZhaWx1cmUoJy16JykKLSAgICAgICAgI3NlbGYuYXNzZXJ0RmFpbHVyZSgnc3BhbScpCi0gICAgICAgICNzZWxmLmFzc2VydEZhaWx1cmUoJzIwMDQnLCAnc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFpbHVyZSgnc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFpbHVyZSgnMjAwNCcsICdzcGFtJykKICAgICAgICAgc2VsZi5hc3NlcnRGYWlsdXJlKCctdCcsICdodG1sJywgJzIwMDQnLCAnMScpCiAKICAgICBkZWYgdGVzdF9vdXRwdXRfY3VycmVudF95ZWFyKHNlbGYpOgpAQCAtODE1LDUgKzgxNSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgIGInaHJlZj0iY3VzdG9tLmNzcyIgLz4nLCBzdGRvdXQpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnbWRheXMnLCAnSmFudWFyeScsICdGZWJydWFyeScsICdFUE9DSCcsCisgICAgICAgICAgICAgICAgICAgICAnTU9OREFZJywgJ1RVRVNEQVknLCAnV0VETkVTREFZJywgJ1RIVVJTREFZJywgJ0ZSSURBWScsCisgICAgICAgICAgICAgICAgICAgICAnU0FUVVJEQVknLCAnU1VOREFZJywgJ2RpZmZlcmVudF9sb2NhbGUnLCAnYycsCisgICAgICAgICAgICAgICAgICAgICAncHJ3ZWVrJywgJ3dlZWsnLCAnZm9ybWF0JywgJ2Zvcm1hdHN0cmluZycsICdtYWluJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgY2FsZW5kYXIsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FwaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQppbmRleCAxZWFkZDIyLi42ODUyMzgxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NhcGkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CkBAIC00LDggKzQsMTAgQEAKIGltcG9ydCBvcwogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHJhbmRvbQoraW1wb3J0IHJlCiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cworaW1wb3J0IHN5c2NvbmZpZwogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CkBAIC00NDIsNiArNDQ0LDcgQEAKICAgICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zdHJpcCgpLCBleHBlY3RlZF9vdXRwdXQpCiAKKwogY2xhc3MgU2tpcGl0ZW1UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X3NraXBpdGVtKHNlbGYpOgpAQCAtNDkxLDEwICs0OTQsMTAgQEAKICAgICAgICAgICAgICAgICBfdGVzdGNhcGkucGFyc2VfdHVwbGVfYW5kX2tleXdvcmRzKHR1cGxlXzEsIGRpY3RfYiwKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmVuY29kZSgiYXNjaWkiKSwga2V5d29yZHMpCiAgICAgICAgICAgICAgICAgd2hlbl9ub3Rfc2tpcHBlZCA9IEZhbHNlCi0gICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6CisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICBzID0gImFyZ3VtZW50IDEgKGltcG9zc2libGU8YmFkIGZvcm1hdCBjaGFyPikiCiAgICAgICAgICAgICAgICAgd2hlbl9ub3Rfc2tpcHBlZCA9IChzdHIoZSkgPT0gcykKLSAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAgd2hlbl9ub3Rfc2tpcHBlZCA9IEZhbHNlCiAKICAgICAgICAgICAgICMgdGVzdCB0aGUgZm9ybWF0IHVuaXQgd2hlbiBza2lwcGVkCkBAIC01MDMsNyArNTA2LDcgQEAKICAgICAgICAgICAgICAgICBfdGVzdGNhcGkucGFyc2VfdHVwbGVfYW5kX2tleXdvcmRzKGVtcHR5X3R1cGxlLCBkaWN0X2IsCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2Zvcm1hdC5lbmNvZGUoImFzY2lpIiksIGtleXdvcmRzKQogICAgICAgICAgICAgICAgIHdoZW5fc2tpcHBlZCA9IEZhbHNlCi0gICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIGU6CisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICBzID0gImltcG9zc2libGU8YmFkIGZvcm1hdCBjaGFyPjogJ3t9JyIuZm9ybWF0KGZvcm1hdCkKICAgICAgICAgICAgICAgICB3aGVuX3NraXBwZWQgPSAoc3RyKGUpID09IHMpCiAKQEAgLTUyNCw2ICs1MjcsMzIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgX3Rlc3RjYXBpLnBhcnNlX3R1cGxlX2FuZF9rZXl3b3JkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCksIHt9LCBiJycsIFs0Ml0pCiAKKyAgICBkZWYgdGVzdF9wb3NpdGlvbmFsX29ubHkoc2VsZik6CisgICAgICAgIHBhcnNlID0gX3Rlc3RjYXBpLnBhcnNlX3R1cGxlX2FuZF9rZXl3b3JkcworCisgICAgICAgIHBhcnNlKCgxLCAyLCAzKSwge30sIGInT09PJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgcGFyc2UoKDEsIDIpLCB7J2EnOiAzfSwgYidPT08nLCBbJycsICcnLCAnYSddKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICdGdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAyIHBvc2l0aW9uYWwgYXJndW1lbnRzIFwoMSBnaXZlblwpJyk6CisgICAgICAgICAgICBwYXJzZSgoMSwpLCB7J2EnOiAzfSwgYidPT08nLCBbJycsICcnLCAnYSddKQorICAgICAgICBwYXJzZSgoMSwpLCB7fSwgYidPfE9PJywgWycnLCAnJywgJ2EnXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAnRnVuY3Rpb24gdGFrZXMgYXQgbGVhc3QgMSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDAgZ2l2ZW5cKScpOgorICAgICAgICAgICAgcGFyc2UoKCksIHt9LCBiJ098T08nLCBbJycsICcnLCAnYSddKQorICAgICAgICBwYXJzZSgoMSwgMiksIHsnYSc6IDN9LCBiJ09PJE8nLCBbJycsICcnLCAnYSddKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICdGdW5jdGlvbiB0YWtlcyBleGFjdGx5IDIgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgxIGdpdmVuXCknKToKKyAgICAgICAgICAgIHBhcnNlKCgxLCksIHsnYSc6IDN9LCBiJ09PJE8nLCBbJycsICcnLCAnYSddKQorICAgICAgICBwYXJzZSgoMSwpLCB7fSwgYidPfE8kTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgJ0Z1bmN0aW9uIHRha2VzIGF0IGxlYXN0IDEgcG9zaXRpb25hbCBhcmd1bWVudHMgXCgwIGdpdmVuXCknKToKKyAgICAgICAgICAgIHBhcnNlKCgpLCB7fSwgYidPfE8kTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeXN0ZW1FcnJvciwgJ0VtcHR5IHBhcmFtZXRlciBuYW1lIGFmdGVyIFwkJyk6CisgICAgICAgICAgICBwYXJzZSgoMSwpLCB7fSwgYidPfCRPTycsIFsnJywgJycsICdhJ10pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChTeXN0ZW1FcnJvciwgJ0VtcHR5IGtleXdvcmQnKToKKyAgICAgICAgICAgIHBhcnNlKCgxLCksIHt9LCBiJ098T08nLCBbJycsICdhJywgJyddKQorCisKIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCiBjbGFzcyBUZXN0VGhyZWFkU3RhdGUodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC01NDgsNiArNTc3LDcgQEAKICAgICAgICAgdC5zdGFydCgpCiAgICAgICAgIHQuam9pbigpCiAKKwogY2xhc3MgVGVzdF90ZXN0Y2FwaSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfX3Rlc3RjYXBpKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiBkaXIoX3Rlc3RjYXBpKToKQEAgLTU1Niw1ICs1ODYsODQgQEAKICAgICAgICAgICAgICAgICAgICAgdGVzdCA9IGdldGF0dHIoX3Rlc3RjYXBpLCBuYW1lKQogICAgICAgICAgICAgICAgICAgICB0ZXN0KCkKIAorCitjbGFzcyBQeU1lbURlYnVnVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIFBZVEhPTk1BTExPQyA9ICdkZWJ1ZycKKyAgICAjICcweDA0YzA2ZTAnIG9yICcwNEMwNkUwJworICAgIFBUUl9SRUdFWCA9IHInKD86MHgpP1swLTlhLWZBLUZdKycKKworICAgIGRlZiBjaGVjayhzZWxmLCBjb2RlKToKKyAgICAgICAgd2l0aCBzdXBwb3J0LlN1cHByZXNzQ3Jhc2hSZXBvcnQoKToKKyAgICAgICAgICAgIG91dCA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWMnLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBZVEhPTk1BTExPQz1zZWxmLlBZVEhPTk1BTExPQykKKyAgICAgICAgc3RkZXJyID0gb3V0LmVycgorICAgICAgICByZXR1cm4gc3RkZXJyLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpCisKKyAgICBkZWYgdGVzdF9idWZmZXJfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIG91dCA9IHNlbGYuY2hlY2soJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW1lbV9idWZmZXJfb3ZlcmZsb3coKScpCisgICAgICAgIHJlZ2V4ID0gKHIiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD17cHRyfTogQVBJICdtJ1xuIgorICAgICAgICAgICAgICAgICByIiAgICAxNiBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHAtWzAtOV0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHRhaWw9e3B0cn0gYXJlIG5vdCBhbGwgRk9SQklEREVOQllURSBcKDB4WzAtOWEtZl17ezJ9fVwpOlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMDogMHg3OCBcKlwqXCogT1VDSFxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMTogMHhmYlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgYXQgdGFpbFwrMjogMHhmYlxuIgorICAgICAgICAgICAgICAgICByIiAgICAgICAgLipcbiIKKyAgICAgICAgICAgICAgICAgciIgICAgVGhlIGJsb2NrIHdhcyBtYWRlIGJ5IGNhbGwgI1swLTldKyB0byBkZWJ1ZyBtYWxsb2MvcmVhbGxvYy5cbiIKKyAgICAgICAgICAgICAgICAgciIgICAgRGF0YSBhdCBwOiBjYiBjYiBjYiAuKlxuIgorICAgICAgICAgICAgICAgICByIlxuIgorICAgICAgICAgICAgICAgICByIkZhdGFsIFB5dGhvbiBlcnJvcjogYmFkIHRyYWlsaW5nIHBhZCBieXRlIikKKyAgICAgICAgcmVnZXggPSByZWdleC5mb3JtYXQocHRyPXNlbGYuUFRSX1JFR0VYKQorICAgICAgICByZWdleCA9IHJlLmNvbXBpbGUocmVnZXgsIGZsYWdzPXJlLkRPVEFMTCkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXQsIHJlZ2V4KQorCisgICAgZGVmIHRlc3RfYXBpX21pc3VzZShzZWxmKToKKyAgICAgICAgb3V0ID0gc2VsZi5jaGVjaygnaW1wb3J0IF90ZXN0Y2FwaTsgX3Rlc3RjYXBpLnB5bWVtX2FwaV9taXN1c2UoKScpCisgICAgICAgIHJlZ2V4ID0gKHIiRGVidWcgbWVtb3J5IGJsb2NrIGF0IGFkZHJlc3MgcD17cHRyfTogQVBJICdtJ1xuIgorICAgICAgICAgICAgICAgICByIiAgICAxNiBieXRlcyBvcmlnaW5hbGx5IHJlcXVlc3RlZFxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHAtWzAtOV0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgWzAtOV0gcGFkIGJ5dGVzIGF0IHRhaWw9e3B0cn0gYXJlIEZPUkJJRERFTkJZVEUsIGFzIGV4cGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBUaGUgYmxvY2sgd2FzIG1hZGUgYnkgY2FsbCAjWzAtOV0rIHRvIGRlYnVnIG1hbGxvYy9yZWFsbG9jLlxuIgorICAgICAgICAgICAgICAgICByIiAgICBEYXRhIGF0IHA6IGNiIGNiIGNiIC4qXG4iCisgICAgICAgICAgICAgICAgIHIiXG4iCisgICAgICAgICAgICAgICAgIHIiRmF0YWwgUHl0aG9uIGVycm9yOiBiYWQgSUQ6IEFsbG9jYXRlZCB1c2luZyBBUEkgJ20nLCB2ZXJpZmllZCB1c2luZyBBUEkgJ3InXG4iKQorICAgICAgICByZWdleCA9IHJlZ2V4LmZvcm1hdChwdHI9c2VsZi5QVFJfUkVHRVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXgob3V0LCByZWdleCkKKworICAgIGRlZiBjaGVja19tYWxsb2Nfd2l0aG91dF9naWwoc2VsZiwgY29kZSk6CisgICAgICAgIG91dCA9IHNlbGYuY2hlY2soY29kZSkKKyAgICAgICAgZXhwZWN0ZWQgPSAoJ0ZhdGFsIFB5dGhvbiBlcnJvcjogUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3IgY2FsbGVkICcKKyAgICAgICAgICAgICAgICAgICAgJ3dpdGhvdXQgaG9sZGluZyB0aGUgR0lMJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgb3V0KQorCisgICAgZGVmIHRlc3RfcHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKHNlbGYpOgorICAgICAgICAjIERlYnVnIGhvb2tzIG11c3QgcmFpc2UgYW4gZXJyb3IgaWYgUHlNZW1fTWFsbG9jKCkgaXMgY2FsbGVkCisgICAgICAgICMgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwKKyAgICAgICAgY29kZSA9ICdpbXBvcnQgX3Rlc3RjYXBpOyBfdGVzdGNhcGkucHltZW1fbWFsbG9jX3dpdGhvdXRfZ2lsKCknCisgICAgICAgIHNlbGYuY2hlY2tfbWFsbG9jX3dpdGhvdXRfZ2lsKGNvZGUpCisKKyAgICBkZWYgdGVzdF9weW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoc2VsZik6CisgICAgICAgICMgRGVidWcgaG9va3MgbXVzdCByYWlzZSBhbiBlcnJvciBpZiBQeU9iamVjdF9NYWxsb2MoKSBpcyBjYWxsZWQKKyAgICAgICAgIyB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTAorICAgICAgICBjb2RlID0gJ2ltcG9ydCBfdGVzdGNhcGk7IF90ZXN0Y2FwaS5weW9iamVjdF9tYWxsb2Nfd2l0aG91dF9naWwoKScKKyAgICAgICAgc2VsZi5jaGVja19tYWxsb2Nfd2l0aG91dF9naWwoY29kZSkKKworCitjbGFzcyBQeU1lbU1hbGxvY0RlYnVnVGVzdHMoUHlNZW1EZWJ1Z1Rlc3RzKToKKyAgICBQWVRIT05NQUxMT0MgPSAnbWFsbG9jX2RlYnVnJworCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignV0lUSF9QWU1BTExPQycpID09IDEsCisgICAgICAgICAgICAgICAgICAgICAnbmVlZCBweW1hbGxvYycpCitjbGFzcyBQeU1lbVB5bWFsbG9jRGVidWdUZXN0cyhQeU1lbURlYnVnVGVzdHMpOgorICAgIFBZVEhPTk1BTExPQyA9ICdweW1hbGxvY19kZWJ1ZycKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhQeV9ERUJVRywgJ25lZWQgUHlfREVCVUcnKQorY2xhc3MgUHlNZW1EZWZhdWx0VGVzdHMoUHlNZW1EZWJ1Z1Rlc3RzKToKKyAgICAjIHRlc3QgZGVmYXVsdCBhbGxvY2F0b3Igb2YgUHl0aG9uIGNvbXBpbGVkIGluIGRlYnVnIG1vZGUKKyAgICBQWVRIT05NQUxMT0MgPSAnJworCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NnaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CmluZGV4IGFiOWY2YWIuLjE2NDc4NDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CkBAIC03LDYgKzcsNyBAQAogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTywgQnl0ZXNJTworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIGNsYXNzIEhhY2tlZFN5c01vZHVsZToKICAgICAjIFRoZSByZWdyZXNzaW9uIHRlc3Qgd2lsbCBoYXZlIHJlYWwgdmFsdWVzIGluIHN5cy5hcmd2LCB3aGljaApAQCAtNDczLDYgKzQ3NCwxMSBAQAogICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcignZm9ybS1kYXRhOyBuYW1lPSJmaWxlcyI7IGZpbGVuYW1lPSJmb1xcIm87YmFyIicpLAogICAgICAgICAgICAgKCJmb3JtLWRhdGEiLCB7Im5hbWUiOiAiZmlsZXMiLCAiZmlsZW5hbWUiOiAnZm8ibztiYXInfSkpCiAKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsibG9nZmlsZSIsICJsb2dmcCIsICJpbml0bG9nIiwgImRvbG9nIiwgIm5vbG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICJjbG9zZWxvZyIsICJsb2ciLCAibWF4bGVuIiwgInZhbGlkX2JvdW5kYXJ5In0KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgY2dpLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCiAKIEJPVU5EQVJZID0gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NCIKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jaGFybWFwY29kZWMucHkgYi9MaWIvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weQppbmRleCA0MDY0YWVmLi4wZDQ1OTRkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weQpAQCAtOSw3ICs5LDcgQEAKIAogIiIiIyIKIAotaW1wb3J0IHRlc3Quc3VwcG9ydCwgdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAogCiBpbXBvcnQgY29kZWNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CmluZGV4IGRjZTQxOGIuLjhmYWE4ZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQpAQCAtMzQ4LDggKzM0OCw5IEBACiAgICAgICAgICAgICB0ZXN0LnN1cHBvcnQuU3VwcHJlc3NDcmFzaFJlcG9ydCgpLl9fZW50ZXJfXygpCiAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCd4JykKICAgICAgICAgICAgIG9zLmNsb3NlKHN5cy5zdGRvdXQuZmlsZW5vKCkpIiIiCi0gICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soJy1jJywgY29kZSkKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctYycsIGNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIwLCByYykKICAgICAgICAgc2VsZi5hc3NlcnRSZWdleChlcnIuZGVjb2RlKCdhc2NpaScsICdpZ25vcmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnRXhjZXB0aW9uIGlnbm9yZWQgaW4uKlxuT1NFcnJvcjogLionKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weSBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CmluZGV4IGIyYmU5YjEuLjAxZmI3ZGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5CkBAIC0xMzgsOSArMTM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9hcmd2MCwgZXhwZWN0ZWRfcGF0aDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcGFja2FnZSwgZXhwZWN0ZWRfbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjbWRfbGluZV9zd2l0Y2hlcyk6Ci0gICAgICAgIGlmIG5vdCBfX2RlYnVnX186Ci0gICAgICAgICAgICBjbWRfbGluZV9zd2l0Y2hlcyArPSAoJy0nICsgJ08nICogc3lzLmZsYWdzLm9wdGltaXplLCkKLSAgICAgICAgcnVuX2FyZ3MgPSBjbWRfbGluZV9zd2l0Y2hlcyArIChzY3JpcHRfbmFtZSwpICsgdHVwbGUoZXhhbXBsZV9hcmdzKQorICAgICAgICBydW5fYXJncyA9IFsqc3VwcG9ydC5vcHRpbV9hcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgKmNtZF9saW5lX3N3aXRjaGVzLCBzY3JpcHRfbmFtZSwgKmV4YW1wbGVfYXJnc10KICAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygqcnVuX2FyZ3MsIF9faXNvbGF0ZWQ9RmFsc2UpCiAgICAgICAgIHNlbGYuX2NoZWNrX291dHB1dChzY3JpcHRfbmFtZSwgcmMsIG91dCArIGVyciwgZXhwZWN0ZWRfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2FyZ3YwLCBleHBlY3RlZF9wYXRoMCwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5CmluZGV4IGVlMWUyOGEuLmM4Y2RhY2YgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weQpAQCAtNCw3ICs0LDYgQEAKIGltcG9ydCB0ZXN0LnN1cHBvcnQKIGltcG9ydCB1bmljb2RlZGF0YQogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgd2FybmluZ3MKIAogY2xhc3MgUG9zUmV0dXJuOgogICAgICMgdGhpcyBjYW4gYmUgdXNlZCBmb3IgY29uZmlndXJhYmxlIGNhbGxiYWNrcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKaW5kZXggZDBlM2ExNS4uM2JkZjdkMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5CmluZGV4IGJiOWJlMTEuLmM1ZTJmOTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSG9uZ0tvbmcgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weQppbmRleCA4YTNjYTcwLi4wMGVhMWMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5CkBAIC0xLDYgKzEsNSBAQAogIyBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSVNPIDIwMjIgZW5jb2RpbmdzLgogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5CmluZGV4IDQ0YjYzYTAuLjk0Mzc4ZDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSmFwYW5lc2UgZW5jb2RpbmdzLgogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5CmluZGV4IGI2YTc0ZmIuLjg2M2QxNmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncy4KICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weQppbmRleCA5MTc0Mjk2Li5iYjFkMTMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFJPQyBlbmNvZGluZ3MuCiAjCiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCBtdWx0aWJ5dGVjb2RlY19zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQppbmRleCBmMWJkMzg0Li44OWU1MWM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzCiAjCiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0IGltcG9ydCBtdWx0aWJ5dGVjb2RlY19zdXBwb3J0CiBpbXBvcnQgdW5pdHRlc3QKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQppbmRleCA0YzBjNDE1Li43YTQ4ZDI0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQpAQCAtMyw3ICszLDYgQEAKICMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBIb25nS29uZyBlbmNvZGluZ3MKICMKIAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IG11bHRpYnl0ZWNvZGVjX3N1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weSBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CmluZGV4IDU3NzM4MjMuLmZkZmVjODAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CkBAIC0zLDcgKzMsNiBAQAogIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIEphcGFuZXNlIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKaW5kZXggNmNiNDFjOC4uNDcxY2Q3NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKaW5kZXggMmVhNDRiNS4uMTQ1YTk3ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKQEAgLTMsNyArMyw2IEBACiAjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUk9DIGVuY29kaW5ncwogIwogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gdGVzdCBpbXBvcnQgbXVsdGlieXRlY29kZWNfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKaW5kZXggMDQ3OTU0Mi4uZDg3NTM0MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKQEAgLTQsNyArNCw2IEBACiBpbXBvcnQgbG9jYWxlCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB3YXJuaW5ncwogaW1wb3J0IGVuY29kaW5ncwogCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKQEAgLTI3LDYgKzI2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlcihpbnB1dCksIChleHBlY3QsIGxlbihpbnB1dCkpKQogICAgIHJldHVybiBjaGVjawogCisKIGNsYXNzIFF1ZXVlKG9iamVjdCk6CiAgICAgIiIiCiAgICAgcXVldWU6IHdyaXRlIGJ5dGVzIGF0IG9uZSBlbmQsIHJlYWQgYnl0ZXMgZnJvbSB0aGUgb3RoZXIgZW5kCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBzZWxmLl9idWZmZXJbc2l6ZTpdCiAgICAgICAgICAgICByZXR1cm4gcwogCisKIGNsYXNzIE1peEluQ2hlY2tTdGF0ZUhhbmRsaW5nOgogICAgIGRlZiBjaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoc2VsZiwgZW5jb2RpbmcsIHUsIHMpOgogICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocykrMSk6CkBAIC04MCw2ICs4MSw3IEBACiAgICAgICAgICAgICBwYXJ0MiA9IGQuZW5jb2RlKHVbaTpdLCBUcnVlKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBwYXJ0MStwYXJ0MikKIAorCiBjbGFzcyBSZWFkVGVzdChNaXhJbkNoZWNrU3RhdGVIYW5kbGluZyk6CiAgICAgZGVmIGNoZWNrX3BhcnRpYWwoc2VsZiwgaW5wdXQsIHBhcnRpYWxyZXN1bHRzKToKICAgICAgICAgIyBnZXQgYSBTdHJlYW1SZWFkZXIgZm9yIHRoZSBlbmNvZGluZyBhbmQgZmVlZCB0aGUgYnl0ZXN0cmluZyB2ZXJzaW9uCkBAIC0zNTgsNiArMzYwLDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInJlcGxhY2UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiWz9dIi5lbmNvZGUoc2VsZi5lbmNvZGluZykpCiAKKyAgICAgICAgIyBzZXF1ZW50aWFsIHN1cnJvZ2F0ZSBjaGFyYWN0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdUQ4MDBcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgImlnbm9yZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJbXHVEODAwXHVEQzgwXSIuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIls/P10iLmVuY29kZShzZWxmLmVuY29kaW5nKSkKKwogICAgICAgICBib20gPSAiIi5lbmNvZGUoc2VsZi5lbmNvZGluZykKICAgICAgICAgZm9yIGJlZm9yZSwgYWZ0ZXIgaW4gWygiXFUwMDAxMGZmZiIsICJBIiksICgiWyIsICJdIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkEiLCAiXFUwMDAxMGZmZiIpXToKQEAgLTM4Myw2ICszOTEsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X3NlcXVlbmNlLmRlY29kZShzZWxmLmVuY29kaW5nLCAiYmFja3NsYXNocmVwbGFjZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgKyBiYWNrc2xhc2hyZXBsYWNlICsgYWZ0ZXIpCiAKKwogY2xhc3MgVVRGMzJUZXN0KFJlYWRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZW5jb2RpbmcgPSAidXRmLTMyIgogICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CkBAIC00NzgsNiArNDg3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXFUwMDAxMDAwMCcgKiAxMDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfZGVjb2RlKGVuY29kZWRfYmUpWzBdKQogCisKIGNsYXNzIFVURjMyTEVUZXN0KFJlYWRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZW5jb2RpbmcgPSAidXRmLTMyLWxlIgogICAgIGlsbF9mb3JtZWRfc2VxdWVuY2UgPSBiIlx4ODBceGRjXHgwMFx4MDAiCkBAIC01MjMsNiArNTMzLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXFUwMDAxMDAwMCcgKiAxMDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfbGVfZGVjb2RlKGVuY29kZWQpWzBdKQogCisKIGNsYXNzIFVURjMyQkVUZXN0KFJlYWRUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZW5jb2RpbmcgPSAidXRmLTMyLWJlIgogICAgIGlsbF9mb3JtZWRfc2VxdWVuY2UgPSBiIlx4MDBceDAwXHhkY1x4ODAiCkBAIC03NDcsNiArNzU4LDcgQEAKICAgICBlbmNvZGluZyA9ICJ1dGYtOCIKICAgICBpbGxfZm9ybWVkX3NlcXVlbmNlID0gYiJceGVkXHhiMlx4ODAiCiAgICAgaWxsX2Zvcm1lZF9zZXF1ZW5jZV9yZXBsYWNlID0gIlx1ZmZmZCIgKiAzCisgICAgQk9NID0gYicnCiAKICAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCkBAIC03NzUsMjcgKzc4Nyw0OSBAQAogICAgICAgICBzZWxmLmNoZWNrX3N0YXRlX2hhbmRsaW5nX2RlY29kZShzZWxmLmVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LCB1LmVuY29kZShzZWxmLmVuY29kaW5nKSkKIAorICAgIGRlZiB0ZXN0X2RlY29kZV9lcnJvcihzZWxmKToKKyAgICAgICAgZm9yIGRhdGEsIGVycm9yX2hhbmRsZXIsIGV4cGVjdGVkIGluICgKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAnaWdub3JlJywgJ1tdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ3JlcGxhY2UnLCAnW1x1ZmZmZFx1ZmZmZF0nKSwKKyAgICAgICAgICAgIChiJ1tceDgwXHhmZl0nLCAnc3Vycm9nYXRlZXNjYXBlJywgJ1tcdWRjODBcdWRjZmZdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ2JhY2tzbGFzaHJlcGxhY2UnLCAnW1xceDgwXFx4ZmZdJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGVycm9yX2hhbmRsZXI9ZXJyb3JfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZGVjb2RlKHNlbGYuZW5jb2RpbmcsIGVycm9yX2hhbmRsZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQpCisKICAgICBkZWYgdGVzdF9sb25lX3N1cnJvZ2F0ZXMoc2VsZik6CiAgICAgICAgIHN1cGVyKCkudGVzdF9sb25lX3N1cnJvZ2F0ZXMoKQogICAgICAgICAjIG5vdCBzdXJlIGlmIHRoaXMgaXMgbWFraW5nIHNlbnNlIGZvcgogICAgICAgICAjIFVURi0xNiBhbmQgVVRGLTMyCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdURDODBdIi5lbmNvZGUoJ3V0Zi04JywgInN1cnJvZ2F0ZWVzY2FwZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGInW1x4ODBdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiW1x1REM4MF0iLmVuY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlZXNjYXBlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5CT00gKyBiJ1tceDgwXScpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgIltcdURDODBcdUQ4MDBcdURGRkZdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZWVzY2FwZSIpCisgICAgICAgIGV4YyA9IGNtLmV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5vYmplY3RbZXhjLnN0YXJ0OmV4Yy5lbmRdLCAnXHVEODAwXHVERkZGJykKIAogICAgIGRlZiB0ZXN0X3N1cnJvZ2F0ZXBhc3NfaGFuZGxlcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYWJjXHVkODAwZGVmIi5lbmNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiImFiY1x4ZWRceGEwXHg4MGRlZiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmNceGVkXHhhMFx4ODBkZWYiLmRlY29kZSgidXRmLTgiLCAic3Vycm9nYXRlcGFzcyIpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhYmNcdWQ4MDBkZWYiLmVuY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlcGFzcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQk9NICsgYiJhYmNceGVkXHhhMFx4ODBkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJcVTAwMDEwZmZmXHVEODAwIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJPTSArIGIiXHhmMFx4OTBceGJmXHhiZlx4ZWRceGEwXHg4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIltcdUQ4MDBcdURDODBdIi5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkJPTSArIGInW1x4ZWRceGEwXHg4MFx4ZWRceGIyXHg4MF0nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmNceGVkXHhhMFx4ODBkZWYiLmRlY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlcGFzcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJhYmNcdWQ4MDBkZWYiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJcVTAwMDEwZmZmXHVEODAwIi5lbmNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiIlx4ZjBceDkwXHhiZlx4YmZceGVkXHhhMFx4ODAiKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiXHhmMFx4OTBceGJmXHhiZlx4ZWRceGEwXHg4MCIuZGVjb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIiksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJceGYwXHg5MFx4YmZceGJmXHhlZFx4YTBceDgwIi5kZWNvZGUoc2VsZi5lbmNvZGluZywgInN1cnJvZ2F0ZXBhc3MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiXFUwMDAxMGZmZlx1RDgwMCIpCisKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvZGVjcy5sb29rdXBfZXJyb3IoInN1cnJvZ2F0ZXBhc3MiKSkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IpOgotICAgICAgICAgICAgYiJhYmNceGVkXHhhMCIuZGVjb2RlKCJ1dGYtOCIsICJzdXJyb2dhdGVwYXNzIikKKyAgICAgICAgICAgIGIiYWJjXHhlZFx4YTAiLmRlY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlcGFzcyIpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKLSAgICAgICAgICAgIGIiYWJjXHhlZFx4YTB6Ii5kZWNvZGUoInV0Zi04IiwgInN1cnJvZ2F0ZXBhc3MiKQorICAgICAgICAgICAgYiJhYmNceGVkXHhhMHoiLmRlY29kZShzZWxmLmVuY29kaW5nLCAic3Vycm9nYXRlcGFzcyIpCisKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICd3aW4zMicsCiAgICAgICAgICAgICAgICAgICAgICAnY3A2NTAwMSBpcyBhIFdpbmRvd3Mtb25seSBjb2RlYycpCkBAIC0xMDU5LDYgKzEwOTMsNyBAQAogCiBjbGFzcyBVVEY4U2lnVGVzdChVVEY4VGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGVuY29kaW5nID0gInV0Zi04LXNpZyIKKyAgICBCT00gPSBjb2RlY3MuQk9NX1VURjgKIAogICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKQEAgLTExOTQsNiArMTIyOSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGJyIltceDBdXHgwIiwgImlnbm9yZSIpLCAoYiJbXSIsIDgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHgwXVx4MCIsICJyZXBsYWNlIiksIChiIls/XT8iLCA4KSkKIAorCiBjbGFzcyBSZWNvZGluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3JlY29kaW5nKHNlbGYpOgogICAgICAgICBmID0gaW8uQnl0ZXNJTygpCkBAIC0xMzEzLDYgKzEzNDksNyBAQAogICAgIGlmIGxlbihpKSE9MjoKICAgICAgICAgcHJpbnQocmVwcihpKSkKIAorCiBjbGFzcyBQdW55Y29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKICAgICAgICAgZm9yIHVuaSwgcHVueSBpbiBwdW55Y29kZV90ZXN0Y2FzZXM6CkBAIC0xMzMyLDYgKzEzNjksNyBAQAogICAgICAgICAgICAgcHVueSA9IHB1bnkuZGVjb2RlKCJhc2NpaSIpLmVuY29kZSgiYXNjaWkiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmksIHB1bnkuZGVjb2RlKCJwdW55Y29kZSIpKQogCisKIGNsYXNzIFVuaWNvZGVJbnRlcm5hbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFNJWkVPRl9XQ0hBUl9UID09IDQsICdzcGVjaWZpYyB0byAzMi1iaXQgd2NoYXJfdCcpCiAgICAgZGVmIHRlc3RfYnVnMTI1MTMwMChzZWxmKToKQEAgLTE1ODYsNiArMTYyNCw3IEBACiAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBzdXBwb3J0LlRlc3RGYWlsZWQoIlRlc3QgMy4lZDogJXMiICUgKHBvcysxLCBzdHIoZSkpKQogCisKIGNsYXNzIElETkFDb2RlY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2J1aWx0aW5fZGVjb2RlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihiInB5dGhvbi5vcmciLCAiaWRuYSIpLCAicHl0aG9uLm9yZyIpCkBAIC0xNjcyLDYgKzE3MTEsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLAogICAgICAgICAgICAgICAgIGIicHl0aG9uLm9yZyIuZGVjb2RlLCAiaWRuYSIsIGVycm9ycykKIAorCiBjbGFzcyBDb2RlY3NNb2R1bGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKQEAgLTE3ODAsNiArMTgyMCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsCiAgICAgICAgICAgICAgICAgY29kZWNzLmRlY29kZSwgYidhYmMnLCAndW5kZWZpbmVkJywgZXJyb3JzKQogCisKIGNsYXNzIFN0cmVhbVJlYWRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMTc5MCw2ICsxODMxLDcgQEAKICAgICAgICAgZiA9IHNlbGYucmVhZGVyKHNlbGYuc3RyZWFtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmVzKCksIFsnXHVkNTVjXG4nLCAnXHVhZTAwJ10pCiAKKwogY2xhc3MgRW5jb2RlZEZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgpAQCAtMTkyMCw2ICsxOTYyLDcgQEAKICAgICAidW5pY29kZV9pbnRlcm5hbCIKIF0KIAorCiBjbGFzcyBCYXNpY1VuaWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLCBNaXhJbkNoZWNrU3RhdGVIYW5kbGluZyk6CiAgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgogICAgICAgICBzID0gImFiYzEyMyIgICMgYWxsIGNvZGVjcyBzaG91bGQgYmUgYWJsZSB0byBlbmNvZGUgdGhlc2UKQEAgLTIwODIsNiArMjEyNSw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0ZV9oYW5kbGluZ19kZWNvZGUoZW5jb2RpbmcsIHUsIHUuZW5jb2RlKGVuY29kaW5nKSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0YXRlX2hhbmRsaW5nX2VuY29kZShlbmNvZGluZywgdSwgdS5lbmNvZGUoZW5jb2RpbmcpKQogCisKIGNsYXNzIENoYXJtYXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kZWNvZGVfd2l0aF9zdHJpbmdfbWFwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKApAQCAtMjMzMiw2ICsyMzc2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uc3RyZWFtd3JpdGVyLCAnc3RyaWN0JykgYXMgc3J3OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcncucmVhZCgpLCAiXHhmYyIpCiAKKwogY2xhc3MgVHlwZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9kZWNvZGVfdW5pY29kZShzZWxmKToKICAgICAgICAgIyBNb3N0IGRlY29kZXJzIGRvbid0IGFjY2VwdCB1bmljb2RlIGlucHV0CkBAIC0yNjIyLDYgKzI2NjcsNyBAQAogICAgIGJ5dGVzX3RyYW5zZm9ybV9lbmNvZGluZ3MuYXBwZW5kKCJiejJfY29kZWMiKQogICAgIHRyYW5zZm9ybV9hbGlhc2VzWyJiejJfY29kZWMiXSA9IFsiYnoyIl0KIAorCiBjbGFzcyBUcmFuc2Zvcm1Db2RlY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgpAQCAtMzA5OSw1ICszMTQ1LDgxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZCwgKCdhYmMnLCAzKSkKIAogCitjbGFzcyBBU0NJSVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjMTIzJy5lbmNvZGUoJ2FzY2lpJyksIGInYWJjMTIzJykKKworICAgIGRlZiB0ZXN0X2VuY29kZV9lcnJvcihzZWxmKToKKyAgICAgICAgZm9yIGRhdGEsIGVycm9yX2hhbmRsZXIsIGV4cGVjdGVkIGluICgKKyAgICAgICAgICAgICgnW1x4ODBceGZmXHUyMGFjXScsICdpZ25vcmUnLCBiJ1tdJyksCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY10nLCAncmVwbGFjZScsIGInWz8/P10nKSwKKyAgICAgICAgICAgICgnW1x4ODBceGZmXHUyMGFjXScsICd4bWxjaGFycmVmcmVwbGFjZScsIGInWyYjMTI4OyYjMjU1OyYjODM2NDtdJyksCisgICAgICAgICAgICAoJ1tceDgwXHhmZlx1MjBhY1xVMDAwYWJjZGVdJywgJ2JhY2tzbGFzaHJlcGxhY2UnLAorICAgICAgICAgICAgIGInW1xceDgwXFx4ZmZcXHUyMGFjXFxVMDAwYWJjZGVdJyksCisgICAgICAgICAgICAoJ1tcdWRjODBcdWRjZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsIGInW1x4ODBceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmVuY29kZSgnYXNjaWknLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX3N1cnJvZ2F0ZWVzY2FwZV9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgIyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNhbiBiZSBkZWNvZGVkLCBidXQgbm90IHRoZSBzZWNvbmQKKyAgICAgICAgICAgICdcdWRjODBceGZmJy5lbmNvZGUoJ2FzY2lpJywgJ3N1cnJvZ2F0ZWVzY2FwZScpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmMnLmRlY29kZSgnYXNjaWknKSwgJ2FiYycpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ2lnbm9yZScsICdbXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdyZXBsYWNlJywgJ1tcdWZmZmRcdWZmZmRdJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ3N1cnJvZ2F0ZWVzY2FwZScsICdbXHVkYzgwXHVkY2ZmXScpLAorICAgICAgICAgICAgKGInW1x4ODBceGZmXScsICdiYWNrc2xhc2hyZXBsYWNlJywgJ1tcXHg4MFxceGZmXScpLAorICAgICAgICApOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoZGF0YT1kYXRhLCBlcnJvcl9oYW5kbGVyPWVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1leHBlY3RlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmRlY29kZSgnYXNjaWknLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCisKK2NsYXNzIExhdGluMVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZm9yIGRhdGEsIGV4cGVjdGVkIGluICgKKyAgICAgICAgICAgICgnYWJjJywgYidhYmMnKSwKKyAgICAgICAgICAgICgnXHg4MFx4ZTlceGZmJywgYidceDgwXHhlOVx4ZmYnKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5lbmNvZGUoJ2xhdGluMScpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9lcnJvcnMoc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBlcnJvcl9oYW5kbGVyLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoJ1tcdTIwYWNcdWRjODBdJywgJ2lnbm9yZScsIGInW10nKSwKKyAgICAgICAgICAgICgnW1x1MjBhY1x1ZGM4MF0nLCAncmVwbGFjZScsIGInWz8/XScpLAorICAgICAgICAgICAgKCdbXHUyMGFjXFUwMDBhYmNkZV0nLCAnYmFja3NsYXNocmVwbGFjZScsCisgICAgICAgICAgICAgYidbXFx1MjBhY1xcVTAwMGFiY2RlXScpLAorICAgICAgICAgICAgKCdbXHUyMGFjXHVkYzgwXScsICd4bWxjaGFycmVmcmVwbGFjZScsIGInWyYjODM2NDsmIzU2NDQ4O10nKSwKKyAgICAgICAgICAgICgnW1x1ZGM4MFx1ZGNmZl0nLCAnc3Vycm9nYXRlZXNjYXBlJywgYidbXHg4MFx4ZmZdJyksCisgICAgICAgICk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChkYXRhPWRhdGEsIGVycm9yX2hhbmRsZXI9ZXJyb3JfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPWV4cGVjdGVkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEuZW5jb2RlKCdsYXRpbjEnLCBlcnJvcl9oYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX3N1cnJvZ2F0ZWVzY2FwZV9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgIyB0aGUgZmlyc3QgY2hhcmFjdGVyIGNhbiBiZSBkZWNvZGVkLCBidXQgbm90IHRoZSBzZWNvbmQKKyAgICAgICAgICAgICdcdWRjODBcdTIwYWMnLmVuY29kZSgnbGF0aW4xJywgJ3N1cnJvZ2F0ZWVzY2FwZScpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGZvciBkYXRhLCBleHBlY3RlZCBpbiAoCisgICAgICAgICAgICAoYidhYmMnLCAnYWJjJyksCisgICAgICAgICAgICAoYidbXHg4MFx4ZmZdJywgJ1tceDgwXHhmZl0nKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KGRhdGE9ZGF0YSwgZXhwZWN0ZWQ9ZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5kZWNvZGUoJ2xhdGluMScpLCBleHBlY3RlZCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQppbmRleCA1MDliZjVkLi45OGRhMjZmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQpAQCAtMjgyLDcgKzI4Miw2IEBACiAgICAgICAgIGFpKCJpZiAoYSA9PSAxIGFuZCBiID0gMik6IHBhc3MiKQogCiAgICAgICAgIGFpKCJkZWwgMSIpCi0gICAgICAgIGFpKCJkZWwgKCkiKQogICAgICAgICBhaSgiZGVsICgxLCkiKQogICAgICAgICBhaSgiZGVsIFsxXSIpCiAgICAgICAgIGFpKCJkZWwgJzEnIikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CmluZGV4IDRjMzJlMDkuLjM4MjRhODcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQpAQCAtMjAsMTAgKzIwLDEwIEBACiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDaGFpbk1hcAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBBd2FpdGFibGUsIENvcm91dGluZSwgQXN5bmNJdGVyYXRvciwgQXN5bmNJdGVyYWJsZQotZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIEdlbmVyYXRvcgorZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIEdlbmVyYXRvciwgUmV2ZXJzaWJsZQogZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlCiBmcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgU2V0LCBNdXRhYmxlU2V0Ci1mcm9tIGNvbGxlY3Rpb25zLmFiYyBpbXBvcnQgTWFwcGluZywgTXV0YWJsZU1hcHBpbmcsIEtleXNWaWV3LCBJdGVtc1ZpZXcKK2Zyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBNYXBwaW5nLCBNdXRhYmxlTWFwcGluZywgS2V5c1ZpZXcsIEl0ZW1zVmlldywgVmFsdWVzVmlldwogZnJvbSBjb2xsZWN0aW9ucy5hYmMgaW1wb3J0IFNlcXVlbmNlLCBNdXRhYmxlU2VxdWVuY2UKIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBCeXRlU3RyaW5nCiAKQEAgLTY4OSw2ICs2ODksMzEgQEAKICAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEl0ZXJhYmxlLCAnX19pdGVyX18nKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoSXRlcmFibGUsICdfX2l0ZXJfXycpCiAKKyAgICBkZWYgdGVzdF9SZXZlcnNpYmxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLXJldmVyc2libGVzCisgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwgZGljdCgpLCBzZXQoKSwgZnJvemVuc2V0KCldCisgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIFJldmVyc2libGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgUmV2ZXJzaWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgc29tZSByZXZlcnNpYmxlcworICAgICAgICBzYW1wbGVzID0gW3R1cGxlKCksIGxpc3QoKV0KKyAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBSZXZlcnNpYmxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgUmV2ZXJzaWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgYWxzbyBNYXBwaW5nLCBNdXRhYmxlTWFwcGluZywgYW5kIFNlcXVlbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKFNlcXVlbmNlLCBSZXZlcnNpYmxlKSwgcmVwcihTZXF1ZW5jZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhNYXBwaW5nLCBSZXZlcnNpYmxlKSwgcmVwcihNYXBwaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKE11dGFibGVNYXBwaW5nLCBSZXZlcnNpYmxlKSwgcmVwcihNdXRhYmxlTWFwcGluZykpCisgICAgICAgICMgQ2hlY2sgZGlyZWN0IHN1YmNsYXNzaW5nCisgICAgICAgIGNsYXNzIFIoUmV2ZXJzaWJsZSk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIobGlzdCgpKQorICAgICAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXZlcnNlZChSKCkpKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhmbG9hdCwgUikpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhSZXZlcnNpYmxlLCAnX19yZXZlcnNlZF9fJywgJ19faXRlcl9fJykKKwogICAgIGRlZiB0ZXN0X0l0ZXJhdG9yKHNlbGYpOgogICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosIGIiIiwgIiIsICgpLCBbXSwge30sIHNldCgpXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKQEAgLTg0MiwxNCArODY3LDE0IEBACiAgICAgICAgIHNlbGYudmFsaWRhdGVfaXNpbnN0YW5jZShDYWxsYWJsZSwgJ19fY2FsbF9fJykKIAogICAgIGRlZiB0ZXN0X2RpcmVjdF9zdWJjbGFzc2luZyhzZWxmKToKLSAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CisgICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFJldmVyc2libGUsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgogICAgICAgICAgICAgY2xhc3MgQyhCKToKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBCKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhpbnQsIEMpKQogCiAgICAgZGVmIHRlc3RfcmVnaXN0cmF0aW9uKHNlbGYpOgotICAgICAgICBmb3IgQiBpbiBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZToKKyAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgUmV2ZXJzaWJsZSwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CiAgICAgICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAgIyBNYWtlIHN1cmUgaXQgaXNuJ3QgaGFzaGFibGUgYnkgZGVmYXVsdAogICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIEIpLCBCLl9fbmFtZV9fKQpAQCAtMTA0OSw2ICsxMDc0LDI2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmNzID4gY3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuY3MgPj0gY3MpCiAKKyAgICBkZWYgdGVzdF9pc3N1ZTI2OTE1KHNlbGYpOgorICAgICAgICAjIENvbnRhaW5lciBtZW1iZXJzaGlwIHRlc3Qgc2hvdWxkIGNoZWNrIGlkZW50aXR5IGZpcnN0CisgICAgICAgIGNsYXNzIEN1c3RvbUVxdWFsT2JqZWN0OgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGNsYXNzIEN1c3RvbVNlcXVlbmNlKGxpc3QpOgorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFNlcXVlbmNlLl9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSkKKworICAgICAgICBuYW4gPSBmbG9hdCgnbmFuJykKKyAgICAgICAgb2JqID0gQ3VzdG9tRXF1YWxPYmplY3QoKQorICAgICAgICBjb250YWluZXJzID0gWworICAgICAgICAgICAgQ3VzdG9tU2VxdWVuY2UoW25hbiwgb2JqXSksCisgICAgICAgICAgICBJdGVtc1ZpZXcoezE6IG5hbiwgMjogb2JqfSksCisgICAgICAgICAgICBWYWx1ZXNWaWV3KHsxOiBuYW4sIDI6IG9ian0pCisgICAgICAgIF0KKyAgICAgICAgZm9yIGNvbnRhaW5lciBpbiBjb250YWluZXJzOgorICAgICAgICAgICAgZm9yIGVsZW0gaW4gY29udGFpbmVyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZWxlbSwgY29udGFpbmVyKQorCiAgICAgZGVmIGFzc2VydFNhbWVTZXQoc2VsZiwgczEsIHMyKToKICAgICAgICAgIyBjb2VyY2UgYm90aCB0byBhIHJlYWwgc2V0IHRoZW4gY2hlY2sgZXF1YWxpdHkKICAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChzZXQoczEpLCBzZXQoczIpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5CmluZGV4IDJjZThhNjEuLjliNDI0YTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKQEAgLTEsNiArMSw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgY29tcGlsZWFsbAogaW1wb3J0IGltcG9ydGxpYi51dGlsCitpbXBvcnQgdGVzdC50ZXN0X2ltcG9ydGxpYi51dGlsCiBpbXBvcnQgb3MKIGltcG9ydCBwYXRobGliCiBpbXBvcnQgcHlfY29tcGlsZQpAQCAtNDAsNiArNDEsMTEgQEAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5kaXJlY3RvcnkpCiAKKyAgICBkZWYgYWRkX2JhZF9zb3VyY2VfZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5iYWRfc291cmNlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksICdfdGVzdF9iYWQucHknKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5iYWRfc291cmNlX3BhdGgsICd3JykgYXMgZmlsZToKKyAgICAgICAgICAgIGZpbGUud3JpdGUoJ3ggKFxuJykKKwogICAgIGRlZiBkYXRhKHNlbGYpOgogICAgICAgICB3aXRoIG9wZW4oc2VsZi5iY19wYXRoLCAncmInKSBhcyBmaWxlOgogICAgICAgICAgICAgZGF0YSA9IGZpbGUucmVhZCg4KQpAQCAtNzgsMTUgKzg0LDQzIEBACiAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2ZpbGUoc2VsZi5zb3VyY2VfcGF0aCwgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21waWxlYWxsLmNvbXBpbGVfZmlsZShzZWxmLnNvdXJjZV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgyKSkKICAgICAgICAgb3MudW5saW5rKHNlbGYuYmNfcGF0aCkKLSAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNlbGYuZGlyZWN0b3J5LCBmb3JjZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQ9VHJ1ZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoMikpCiAgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgpCiAgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgyKQorICAgICAgICAjIFRlc3QgYWdhaW5zdCBiYWQgZmlsZXMKKyAgICAgICAgc2VsZi5hZGRfYmFkX3NvdXJjZV9maWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21waWxlYWxsLmNvbXBpbGVfZmlsZShzZWxmLmJhZF9zb3VyY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1GYWxzZSwgcXVpZXQ9MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPUZhbHNlLCBxdWlldD0yKSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfcGF0aChzZWxmKToKKyAgICAgICAgIyBFeGNsdWRlIExpYi90ZXN0LyB3aGljaCBjb250YWlucyBpbnZhbGlkIFB5dGhvbiBmaWxlcyBsaWtlCisgICAgICAgICMgTGliL3Rlc3QvYmFkc3ludGF4X3BlcDMxMjAucHkKKyAgICAgICAgdGVzdGRpciA9IG9zLnBhdGgucmVhbHBhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKKyAgICAgICAgaWYgdGVzdGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXRhdHRyLCBzeXMsICdwYXRoJywgc3lzLnBhdGgpCisKKyAgICAgICAgICAgIHN5cy5wYXRoID0gbGlzdChzeXMucGF0aCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMucGF0aC5yZW1vdmUodGVzdGRpcikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGlsZWFsbC5jb21waWxlX3BhdGgocXVpZXQ9MikpCisKKyAgICAgICAgd2l0aCB0ZXN0LnRlc3RfaW1wb3J0bGliLnV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W3NlbGYuZGlyZWN0b3J5XSk6CisgICAgICAgICAgICBzZWxmLmFkZF9iYWRfc291cmNlX2ZpbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb21waWxlYWxsLmNvbXBpbGVfcGF0aChza2lwX2N1cmRpcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9VHJ1ZSwgcXVpZXQ9MikpCiAKICAgICBkZWYgdGVzdF9ub19weWNhY2hlX2luX25vbl9wYWNrYWdlKHNlbGYpOgogICAgICAgICAjIEJ1ZyA4NTYzIHJlcG9ydGVkIHRoYXQgX19weWNhY2hlX18gZGlyZWN0b3JpZXMgZ290IGNyZWF0ZWQgYnkKQEAgLTE5NywxMCArMjMxLDkgQEAKICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdub3QgYWxsIGVudHJpZXMgb24gc3lzLnBhdGggYXJlIHdyaXRhYmxlJykKIAogICAgIGRlZiBfZ2V0X3J1bl9hcmdzKHNlbGYsIGFyZ3MpOgotICAgICAgICBpbnRlcnBfYXJncyA9IFsnLVMnXQotICAgICAgICBpZiBzeXMuZmxhZ3Mub3B0aW1pemU6Ci0gICAgICAgICAgICBpbnRlcnBfYXJncy5hcHBlbmQoezEgOiAnLU8nLCAyIDogJy1PTyd9W3N5cy5mbGFncy5vcHRpbWl6ZV0pCi0gICAgICAgIHJldHVybiBpbnRlcnBfYXJncyArIFsnLW0nLCAnY29tcGlsZWFsbCddICsgbGlzdChhcmdzKQorICAgICAgICByZXR1cm4gWypzdXBwb3J0Lm9wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpLAorICAgICAgICAgICAgICAgICctUycsICctbScsICdjb21waWxlYWxsJywKKyAgICAgICAgICAgICAgICAqYXJnc10KIAogICAgIGRlZiBhc3NlcnRSdW5PSyhzZWxmLCAqYXJncywgKiplbnZfdmFycyk6CiAgICAgICAgIHJjLCBvdXQsIGVyciA9IHNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9vaygKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQppbmRleCA1MTY0MDNlLi5jMDRjODA0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CkBAIC0xMiw2ICsxMiwzOSBAQAogICAgIHRocmVhZGluZyA9IE5vbmUKIAogCitjbGFzcyBUZXN0QWJzdHJhY3RDb250ZXh0TWFuYWdlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lbnRlcihzZWxmKToKKyAgICAgICAgY2xhc3MgRGVmYXVsdEVudGVyKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9fZXhpdF9fKCphcmdzKQorCisgICAgICAgIG1hbmFnZXIgPSBEZWZhdWx0RW50ZXIoKQorICAgICAgICBzZWxmLmFzc2VydElzKG1hbmFnZXIuX19lbnRlcl9fKCksIG1hbmFnZXIpCisKKyAgICBkZWYgdGVzdF9leGl0X2lzX2Fic3RyYWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBNaXNzaW5nRXhpdChBYnN0cmFjdENvbnRleHRNYW5hZ2VyKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBNaXNzaW5nRXhpdCgpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3R1cmFsX3N1YmNsYXNzaW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBNYW5hZ2VyRnJvbVNjcmF0Y2g6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE1hbmFnZXJGcm9tU2NyYXRjaCwgQWJzdHJhY3RDb250ZXh0TWFuYWdlcikpCisKKyAgICAgICAgY2xhc3MgRGVmYXVsdEVudGVyKEFic3RyYWN0Q29udGV4dE1hbmFnZXIpOgorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBzdXBlcigpLl9fZXhpdF9fKCphcmdzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKERlZmF1bHRFbnRlciwgQWJzdHJhY3RDb250ZXh0TWFuYWdlcikpCisKKwogY2xhc3MgQ29udGV4dE1hbmFnZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9wbGFpbihzZWxmKToKQEAgLTg5LDcgKzEyMiw3IEBACiAgICAgICAgIGRlZiB3b29ob28oKToKICAgICAgICAgICAgIHlpZWxkCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgICAgIHdpdGggd29vaG9vKCk6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlIHN0b3BfZXhjCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvcHkucHkgYi9MaWIvdGVzdC90ZXN0X2NvcHkucHkKaW5kZXggMGUxZjY3MC4uNDVhNjkyMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29weS5weQpAQCAtOTgsNyArOTgsNyBAQAogICAgICAgICB0ZXN0cyA9IFtOb25lLCAuLi4sIE5vdEltcGxlbWVudGVkLAogICAgICAgICAgICAgICAgICA0MiwgMioqMTAwLCAzLjE0LCBUcnVlLCBGYWxzZSwgMWosCiAgICAgICAgICAgICAgICAgICJoZWxsbyIsICJoZWxsb1x1MTIzNCIsIGYuX19jb2RlX18sCi0gICAgICAgICAgICAgICAgIGIid29ybGQiLCBieXRlcyhyYW5nZSgyNTYpKSwgcmFuZ2UoMTApLAorICAgICAgICAgICAgICAgICBiIndvcmxkIiwgYnl0ZXMocmFuZ2UoMjU2KSksIHJhbmdlKDEwKSwgc2xpY2UoMSwgMTAsIDIpLAogICAgICAgICAgICAgICAgICBOZXdTdHlsZSwgQ2xhc3NpYywgbWF4LCBXaXRoTWV0YWNsYXNzXQogICAgICAgICBmb3IgeCBpbiB0ZXN0czoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY29weS5jb3B5KHgpLCB4KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jcHJvZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfY3Byb2ZpbGUucHkKaW5kZXggZjE4OTgzZi4uNTNmODkxNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jcHJvZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Nwcm9maWxlLnB5CkBAIC02LDcgKzYsNyBAQAogIyByaXAgb2ZmIGFsbCBpbnRlcmVzdGluZyBzdHVmZiBmcm9tIHRlc3RfcHJvZmlsZQogaW1wb3J0IGNQcm9maWxlCiBmcm9tIHRlc3QudGVzdF9wcm9maWxlIGltcG9ydCBQcm9maWxlVGVzdCwgcmVnZW5lcmF0ZV9leHBlY3RlZF9vdXRwdXQKLWZyb20gdGVzdC5wcm9maWxlZSBpbXBvcnQgdGVzdGZ1bmMKKwogCiBjbGFzcyBDUHJvZmlsZVRlc3QoUHJvZmlsZVRlc3QpOgogICAgIHByb2ZpbGVyY2xhc3MgPSBjUHJvZmlsZS5Qcm9maWxlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Nzdi5weSBiL0xpYi90ZXN0L3Rlc3RfY3N2LnB5CmluZGV4IDc3YzMxNWUuLmU5N2M5ZjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY3N2LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY3N2LnB5CkBAIC0yLDkgKzIsNyBAQAogIyBjc3YgcGFja2FnZSB1bml0IHRlc3RzCiAKIGltcG9ydCBjb3B5Ci1pbXBvcnQgaW8KIGltcG9ydCBzeXMKLWltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0ZW1wZmlsZSBpbXBvcnQgVGVtcG9yYXJ5RmlsZQpAQCAtNDI2LDE3ICs0MjQsMTYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IC0xKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWFkZXIsIFtdLCBxdW90aW5nID0gMTAwKQogCi0gICAgIyBTZWUgaXNzdWUgIzIyOTk1Ci0gICAgIyMgZGVmIHRlc3RfY29weShzZWxmKToKLSAgICAjIyAgICAgZm9yIG5hbWUgaW4gY3N2Lmxpc3RfZGlhbGVjdHMoKToKLSAgICAjIyAgICAgICAgIGRpYWxlY3QgPSBjc3YuZ2V0X2RpYWxlY3QobmFtZSkKLSAgICAjIyAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29weS5jb3B5LCBkaWFsZWN0KQorICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIGNzdi5saXN0X2RpYWxlY3RzKCk6CisgICAgICAgICAgICBkaWFsZWN0ID0gY3N2LmdldF9kaWFsZWN0KG5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvcHkuY29weSwgZGlhbGVjdCkKIAotICAgICMjIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKLSAgICAjIyAgICAgZm9yIG5hbWUgaW4gY3N2Lmxpc3RfZGlhbGVjdHMoKToKLSAgICAjIyAgICAgICAgIGRpYWxlY3QgPSBjc3YuZ2V0X2RpYWxlY3QobmFtZSkKLSAgICAjIyAgICAgICAgIGZvciBwcm90byBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgotICAgICMjICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcGlja2xlLmR1bXBzLCBkaWFsZWN0LCBwcm90bykKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIGNzdi5saXN0X2RpYWxlY3RzKCk6CisgICAgICAgICAgICBkaWFsZWN0ID0gY3N2LmdldF9kaWFsZWN0KG5hbWUpCisgICAgICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBpY2tsZS5kdW1wcywgZGlhbGVjdCwgcHJvdG8pCiAKIGNsYXNzIFRlc3RDc3ZCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgcmVhZGVyQXNzZXJ0RXF1YWwoc2VsZiwgaW5wdXQsIGV4cGVjdGVkX3Jlc3VsdCk6CkBAIC0xMDgwLDcgKzEwNzcsNiBAQAogICAgICAgICAgICAgICJGcmFuw6dvaXMgUGluYXJkIl0KIAogICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVhZChzZWxmKToKLSAgICAgICAgaW1wb3J0IGlvCiAgICAgICAgIHdpdGggVGVtcG9yYXJ5RmlsZSgidysiLCBuZXdsaW5lPScnLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaWxlb2JqOgogICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiLCIuam9pbihzZWxmLm5hbWVzKSArICJcclxuIikKICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQpAQCAtMTA4OSw3ICsxMDg1LDYgQEAKIAogCiAgICAgZGVmIHRlc3RfdW5pY29kZV93cml0ZShzZWxmKToKLSAgICAgICAgaW1wb3J0IGlvCiAgICAgICAgIHdpdGggVGVtcG9yYXJ5RmlsZSgidysiLCBuZXdsaW5lPScnLCBlbmNvZGluZz0idXRmLTgiKSBhcyBmaWxlb2JqOgogICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqKQogICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHNlbGYubmFtZXMpCkBAIC0xMDk4LDUgKzEwOTMsMTEgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBleHRyYSA9IHsnX19kb2NfXycsICdfX3ZlcnNpb25fXyd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGNzdiwgKCdjc3YnLCAnX2NzdicpLCBleHRyYT1leHRyYSkKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYm0ucHkgYi9MaWIvdGVzdC90ZXN0X2RibS5weQppbmRleCA2MjNkOTkyLi5mMGE0MjhkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RibS5weQpAQCAtMSw2ICsxLDUgQEAKICIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgZGJtLm9wZW4gZnVuY3Rpb24gYmFzZWQgb24gdGVzdGR1bWJkYm0ucHkiIiIKIAotaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBnbG9iCiBpbXBvcnQgdGVzdC5zdXBwb3J0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RibV9kdW1iLnB5IGIvTGliL3Rlc3QvdGVzdF9kYm1fZHVtYi5weQppbmRleCBmZjYzYzg4Li4yZDc3ZjA3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RibV9kdW1iLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGJtX2R1bWIucHkKQEAgLTYsNiArNiw3IEBACiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCBvcwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBkYm0uZHVtYiBhcyBkdW1iZGJtCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCkBAIC03OCw2ICs3OSwxMiBAQAogICAgICAgICBzZWxmLmluaXRfZGIoKQogICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ3InKQogICAgICAgICBzZWxmLnJlYWRfaGVscGVyKGYpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBkYXRhYmFzZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcgb25seScpOgorICAgICAgICAgICAgZltiJ2cnXSA9IGIneCcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGRhdGFiYXNlIGlzIG9wZW5lZCBmb3IgcmVhZGluZyBvbmx5Jyk6CisgICAgICAgICAgICBkZWwgZltiJ2EnXQogICAgICAgICBmLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0X2R1bWJkYm1fa2V5cyhzZWxmKToKQEAgLTE0OCw3ICsxNTUsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kaWN0W2tleV0sIGZba2V5XSkKIAogICAgIGRlZiBpbml0X2RiKHNlbGYpOgotICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ3cnKQorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ24nKQogICAgICAgICBmb3IgayBpbiBzZWxmLl9kaWN0OgogICAgICAgICAgICAgZltrXSA9IHNlbGYuX2RpY3Rba10KICAgICAgICAgZi5jbG9zZSgpCkBAIC0yMzQsNiArMjQxLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LmdldHZhbHVlKCksICcnKQogCisgICAgZGVmIHRlc3Rfd2Fybl9vbl9pZ25vcmVkX2ZsYWdzKHNlbGYpOgorICAgICAgICBmb3IgdmFsdWUgaW4gKCdyJywgJ3cnKToKKyAgICAgICAgICAgIF9kZWxldGVfZmlsZXMoKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkYXRhYmFzZSBmaWxlIGlzIG1pc3NpbmcsIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VtYW50aWNzIG9mIHRoZSAnYycgZmxhZyB3aWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSB1c2VkLiIpOgorICAgICAgICAgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9mbGFnKHNlbGYpOgorICAgICAgICBmb3IgZmxhZyBpbiAoJ3gnLCAncmYnLCBOb25lKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbGFnIG11c3QgYmUgb25lIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIncicsICd3JywgJ2MnLCBvciAnbiciKToKKyAgICAgICAgICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgZmxhZykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kYm1fZ251LnB5IGIvTGliL3Rlc3QvdGVzdF9kYm1fZ251LnB5CmluZGV4IGE3ODA4ZjUuLjMwNGIzMzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGJtX2dudS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RibV9nbnUucHkKQEAgLTIsNyArMiw3IEBACiBnZGJtID0gc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJkYm0uZ251IikgI3NraXAgaWYgbm90IHN1cHBvcnRlZAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBURVNURk4sIHVubGluaworZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgdW5saW5rCiAKIAogZmlsZW5hbWUgPSBURVNURk4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGJtX25kYm0ucHkgYi9MaWIvdGVzdC90ZXN0X2RibV9uZGJtLnB5CmluZGV4IDIyOTE1NjEuLjQ5ZjQ0MjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGJtX25kYm0ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kYm1fbmRibS5weQpAQCAtMSw4ICsxLDYgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJkYm0ubmRibSIpICNza2lwIGlmIG5vdCBzdXBwb3J0ZWQKIGltcG9ydCB1bml0dGVzdAotaW1wb3J0IG9zCi1pbXBvcnQgcmFuZG9tCiBpbXBvcnQgZGJtLm5kYm0KIGZyb20gZGJtLm5kYm0gaW1wb3J0IGVycm9yCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weSBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQppbmRleCBjZGU1ZDc4Li42NGUxY2M2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CkBAIC0yMDQ3LDYgKzIwNDcsMzkgQEAKICAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoMCwgMiwgNywgMSksICdGJykgKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgwLCksICdGJykpCiAKKyAgICBkZWYgdGVzdF9hc19pbnRlZ2VyX3JhdGlvKHNlbGYpOgorICAgICAgICBEZWNpbWFsID0gc2VsZi5kZWNpbWFsLkRlY2ltYWwKKworICAgICAgICAjIGV4Y2VwdGlvbmFsIGNhc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbywgRGVjaW1hbCgnLWluZicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsLmFzX2ludGVnZXJfcmF0aW8sIERlY2ltYWwoJy1uYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvLCBEZWNpbWFsKCdzbmFuMTIzJykpCisKKyAgICAgICAgZm9yIGV4cCBpbiByYW5nZSgtNCwgMik6CisgICAgICAgICAgICBmb3IgY29lZmYgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICAgICAgZm9yIHNpZ24gaW4gJysnLCAnLSc6CisgICAgICAgICAgICAgICAgICAgIGQgPSBEZWNpbWFsKCclcyVkRSVkJyAlIChzaWduLCBjb2VmZiwgZXhwKSkKKyAgICAgICAgICAgICAgICAgICAgcHEgPSBkLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICAgICAgICAgICAgICBwLCBxID0gcHEKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHJldHVybiB0eXBlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwcSwgdHVwbGUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwLCBpbnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShxLCBpbnQpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBub3JtYWxpemF0aW9uOiAgcSBzaG91bGQgYmUgcG9zaXRpdmU7CisgICAgICAgICAgICAgICAgICAgICMgcCBzaG91bGQgYmUgcmVsYXRpdmVseSBwcmltZSB0byBxLgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIocSwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmdjZChwLCBxKSwgMSkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHRoYXQgcC9xIGFjdHVhbGx5IGdpdmVzIHRoZSBjb3JyZWN0IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbChwKSAvIERlY2ltYWwocSksIGQpCisKICAgICBkZWYgdGVzdF9zdWJjbGFzc2luZyhzZWxmKToKICAgICAgICAgIyBEaWZmZXJlbnQgYmVoYXZpb3VycyB3aGVuIHN1YmNsYXNzaW5nIERlY2ltYWwKICAgICAgICAgRGVjaW1hbCA9IHNlbGYuZGVjaW1hbC5EZWNpbWFsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQppbmRleCBmNTI1NDI5Li40ZmQwY2M3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKQEAgLTI4OSw3ICsyODksNyBAQAogICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmluZGV4KGVsZW1lbnQsIHN0YXJ0LCBzdG9wKSwgdGFyZ2V0KQogCi0gICAgZGVmIHRlc3RfaW5zZXJ0X2J1Z18yNDkxMyhzZWxmKToKKyAgICBkZWYgdGVzdF9pbmRleF9idWdfMjQ5MTMoc2VsZik6CiAgICAgICAgIGQgPSBkZXF1ZSgnQScgKiAzKQogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgogICAgICAgICAgICAgaSA9IGQuaW5kZXgoIkhlbGxvIHdvcmxkIiwgMCwgNCkKQEAgLTYyMiwyMCArNjIyLDIyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKIAogICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKLSAgICAgICAgZCA9IGRlcXVlKHJhbmdlKDIwMCkpCi0gICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6Ci0gICAgICAgICAgICBzID0gcGlja2xlLmR1bXBzKGQsIGkpCi0gICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKyAgICAgICAgZm9yIGQgaW4gZGVxdWUocmFuZ2UoMjAwKSksIGRlcXVlKHJhbmdlKDIwMCksIDEwMCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMoZCwgaSkKKyAgICAgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChlKSwgaWQoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGUpLCBsaXN0KGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tYXhsZW4sIGQubWF4bGVuKQogCi0jIyAgICBkZWYgdGVzdF9waWNrbGVfcmVjdXJzaXZlKHNlbGYpOgotIyMgICAgICAgIGQgPSBkZXF1ZSgnYWJjJykKLSMjICAgICAgICBkLmFwcGVuZChkKQotIyMgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6Ci0jIyAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQsIGkpKQotIyMgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKLSMjICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlKSwgaWQoZVstMV0pKQorICAgIGRlZiB0ZXN0X3BpY2tsZV9yZWN1cnNpdmUoc2VsZik6CisgICAgICAgIGZvciBkIGluIGRlcXVlKCdhYmMnKSwgZGVxdWUoJ2FiYycsIDMpOgorICAgICAgICAgICAgZC5hcHBlbmQoZCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgaSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChlKSwgaWQoZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlWy0xXSksIGlkKGUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tYXhsZW4sIGQubWF4bGVuKQogCiAgICAgZGVmIHRlc3RfaXRlcmF0b3JfcGlja2xlKHNlbGYpOgogICAgICAgICBvcmlnID0gZGVxdWUocmFuZ2UoMjAwKSkKQEAgLTY5Niw2ICs2OTgsMTUgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKIAorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGZvciBtYXhsZW4gaW4gcmFuZ2UoLTEsIDYpOgorICAgICAgICAgICAgICAgIHMgPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBqIGluIHJhbmdlKGkpXQorICAgICAgICAgICAgICAgIGQgPSBkZXF1ZShzKSBpZiBtYXhsZW4gPT0gLTEgZWxzZSBkZXF1ZShzLCBtYXhsZW4pCisgICAgICAgICAgICAgICAgZSA9IGQuY29weSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5tYXhsZW4sIGUubWF4bGVuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoeCBpcyB5IGZvciB4LCB5IGluIHppcChkLCBlKSkpCisKICAgICBkZWYgdGVzdF9jb3B5X21ldGhvZChzZWxmKToKICAgICAgICAgbXV0ID0gWzEwXQogICAgICAgICBkID0gZGVxdWUoW211dF0pCkBAIC04NDUsMjQgKzg1NiwyNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQpLCB0eXBlKGUpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogCi0jIyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6Ci0jIyAgICAgICAgZCA9IERlcXVlKCdhYmMnKQotIyMgICAgICAgIGQuYXBwZW5kKGQpCi0jIwotIyMgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQpKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQotIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShlKSkKLSMjICAgICAgICBkZCA9IGQucG9wKCkKLSMjICAgICAgICBlZSA9IGUucG9wKCkKLSMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlZSkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQotIyMKLSMjICAgICAgICBkLnggPSBkCi0jIyAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCkpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlKSwgaWQoZS54KSkKLSMjCi0jIyAgICAgICAgZCA9IERlcXVlV2l0aEJhZEl0ZXIoJ2FiYycpCi0jIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGQpCisgICAgZGVmIHRlc3RfcGlja2xlX3JlY3Vyc2l2ZShzZWxmKToKKyAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBmb3IgZCBpbiBEZXF1ZSgnYWJjJyksIERlcXVlKCdhYmMnLCAzKToKKyAgICAgICAgICAgICAgICBkLmFwcGVuZChkKQorCisgICAgICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgcHJvdG8pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZSksIGlkKGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShlKSwgdHlwZShkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubWF4bGVuLCBkLm1heGxlbikKKyAgICAgICAgICAgICAgICBkZCA9IGQucG9wKCkKKyAgICAgICAgICAgICAgICBlZSA9IGUucG9wKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGVlKSwgaWQoZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLCBkKQorCisgICAgICAgICAgICAgICAgZC54ID0gZAorICAgICAgICAgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQsIHByb3RvKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUueCksIGlkKGUpKQorCisgICAgICAgICAgICBmb3IgZCBpbiBEZXF1ZVdpdGhCYWRJdGVyKCdhYmMnKSwgRGVxdWVXaXRoQmFkSXRlcignYWJjJywgMik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGQsIHByb3RvKQogCiAgICAgZGVmIHRlc3Rfd2Vha3JlZihzZWxmKToKICAgICAgICAgZCA9IGRlcXVlKCdnYWxsYWhhZCcpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQppbmRleCBhMTMwY2VjLi4wYTVlY2Q1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTQ3MzgsMTEgKzQ3MzgsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAoYXJncywga3dhcmdzKQogICAgICAgICBvYmogPSBDMygpCiAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6Ci0gICAgICAgICAgICBpZiBwcm90byA+PSA0OgorICAgICAgICAgICAgaWYgcHJvdG8gPj0gMjoKICAgICAgICAgICAgICAgICBzZWxmLl9jaGVja19yZWR1Y2UocHJvdG8sIG9iaiwgYXJncywga3dhcmdzKQotICAgICAgICAgICAgZWxpZiBwcm90byA+PSAyOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICAgICAgICAgICAgICAgIG9iai5fX3JlZHVjZV9leF9fKHByb3RvKQogCiAgICAgICAgIGNsYXNzIEM0OgogICAgICAgICAgICAgZGVmIF9fZ2V0bmV3YXJnc19leF9fKHNlbGYpOgpAQCAtNTA2MSwxMCArNTA1OCw2IEBACiAgICAgICAgICAgICAgICAga3dhcmdzID0gZ2V0YXR0cihjbHMsICdLV0FSR1MnLCB7fSkKICAgICAgICAgICAgICAgICBvYmogPSBjbHMoKmNscy5BUkdTLCAqKmt3YXJncykKICAgICAgICAgICAgICAgICBwcm90byA9IHBpY2tsZV9jb3BpZXIucHJvdG8KLSAgICAgICAgICAgICAgICBpZiAyIDw9IHByb3RvIDwgNCBhbmQgaGFzYXR0cihjbHMsICdfX2dldG5ld2FyZ3NfZXhfXycpOgotICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlX2NvcGllci5kdW1wcyhvYmosIHByb3RvKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIG9iamNvcHkgPSBwaWNrbGVfY29waWVyLmNvcHkob2JqKQogICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9pc19jb3B5KG9iaiwgb2JqY29weSkKICAgICAgICAgICAgICAgICAjIEZvciB0ZXN0IGNsYXNzZXMgdGhhdCBzdXBwb3J0cyB0aGlzLCBtYWtlIHN1cmUgd2UgZGlkbid0IGdvCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RldnBvbGwucHkgYi9MaWIvdGVzdC90ZXN0X2RldnBvbGwucHkKaW5kZXggOTU1NjE4YS4uYzEzM2M4MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXZwb2xsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGV2cG9sbC5weQpAQCAtNSw5ICs1LDggQEAKIGltcG9ydCBvcwogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHNlbGVjdAotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QsIGNweXRob25fb25seQorZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY3B5dGhvbl9vbmx5CiAKIGlmIG5vdCBoYXNhdHRyKHNlbGVjdCwgJ2RldnBvbGwnKSA6CiAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ3Rlc3Qgd29ya3Mgb25seSBvbiBTb2xhcmlzIE9TIGZhbWlseScpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3QucHkgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKaW5kZXggNmQ2OGU3Ni4uNmM0NzA2NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdC5weQpAQCAtMSwxMCArMSwxMiBAQAotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKLQotaW1wb3J0IGNvbGxlY3Rpb25zLCByYW5kb20sIHN0cmluZworaW1wb3J0IGNvbGxlY3Rpb25zCiBpbXBvcnQgY29sbGVjdGlvbnMuYWJjCi1pbXBvcnQgZ2MsIHdlYWtyZWYKK2ltcG9ydCBnYwogaW1wb3J0IHBpY2tsZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0cmluZworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2Vha3JlZgorZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKIAogY2xhc3MgRGljdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtOTY5LDUgKzk3MSw2IEBACiBjbGFzcyBTdWJjbGFzc01hcHBpbmdUZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CiAgICAgdHlwZTJ0ZXN0ID0gRGljdAogCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpY3Rjb21wcy5weSBiL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CmluZGV4IDNjOGI5NWMuLjA4NzMwNzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CkBAIC0xLDcgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0CiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotCiAjIEZvciBzY29wZSB0ZXN0aW5nLgogZyA9ICJHbG9iYWwgdmFyaWFibGUiCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5IGIvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKaW5kZXggYWIyM2NhMS4uNGMyOTBmZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKQEAgLTEsMyArMSw0IEBACitpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBjb3B5CiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTIxOSw2ICsyMjAsMjcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHBpY2tsZS5QaWNrbGluZ0Vycm9yKSwKICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcHMsIGQuaXRlbXMoKSwgcHJvdG8pCiAKKyAgICBkZWYgdGVzdF9hYmNfcmVnaXN0cnkoc2VsZik6CisgICAgICAgIGQgPSBkaWN0KGE9MSkKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLktleXNWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLk1hcHBpbmdWaWV3KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5rZXlzKCksIGNvbGxlY3Rpb25zLlNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5TaXplZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQua2V5cygpLCBjb2xsZWN0aW9ucy5Db250YWluZXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQudmFsdWVzKCksIGNvbGxlY3Rpb25zLlZhbHVlc1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLnZhbHVlcygpLCBjb2xsZWN0aW9ucy5NYXBwaW5nVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQudmFsdWVzKCksIGNvbGxlY3Rpb25zLlNpemVkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLkl0ZW1zVmlldykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuTWFwcGluZ1ZpZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLlNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQuaXRlbXMoKSwgY29sbGVjdGlvbnMuU2l6ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLml0ZW1zKCksIGNvbGxlY3Rpb25zLkl0ZXJhYmxlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5pdGVtcygpLCBjb2xsZWN0aW9ucy5Db250YWluZXIpCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGlzLnB5IGIvTGliL3Rlc3QvdGVzdF9kaXMucHkKaW5kZXggMGZkMTM0OC4uMDllNjhjZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kaXMucHkKQEAgLTQwLDQxICs0MCw0MSBAQAogCiBkaXNfY19pbnN0YW5jZV9tZXRob2QgPSAiIiJcCiAlM2QgICAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKHgpCi0gICAgICAgICAgICAgIDMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgIDYgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQotICAgICAgICAgICAgICA5IExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChzZWxmKQotICAgICAgICAgICAgIDEyIFNUT1JFX0FUVFIgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgIDE1IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgIDE4IFJFVFVSTl9WQUxVRQorICAgICAgICAgICAgICAyIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorICAgICAgICAgICAgICA0IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKKyAgICAgICAgICAgICAgNiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoc2VsZikKKyAgICAgICAgICAgICAgOCBTVE9SRV9BVFRSICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAxMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICAxMiBSRVRVUk5fVkFMVUUKICIiIiAlIChfQy5fX2luaXRfXy5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDEsKQogCiBkaXNfY19pbnN0YW5jZV9tZXRob2RfYnl0ZXMgPSAiIiJcCiAgICAgICAgICAgMCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgIDYgQ09NUEFSRV9PUCAgICAgICAgICAgICAgIDIgKD09KQotICAgICAgICAgIDkgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAxMiBTVE9SRV9BVFRSICAgICAgICAgICAgICAgMCAoMCkKLSAgICAgICAgIDE1IExPQURfQ09OU1QgICAgICAgICAgICAgICAwICgwKQotICAgICAgICAgMTggUkVUVVJOX1ZBTFVFCisgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICA0IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKKyAgICAgICAgICA2IExPQURfRkFTVCAgICAgICAgICAgICAgICAwICgwKQorICAgICAgICAgIDggU1RPUkVfQVRUUiAgICAgICAgICAgICAgIDAgKDApCisgICAgICAgICAxMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMCkKKyAgICAgICAgIDEyIFJFVFVSTl9WQUxVRQogIiIiCiAKIGRpc19jX2NsYXNzX21ldGhvZCA9ICIiIlwKICUzZCAgICAgICAgICAgMCBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMSAoeCkKLSAgICAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKLSAgICAgICAgICAgICAgNiBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCi0gICAgICAgICAgICAgIDkgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGNscykKLSAgICAgICAgICAgICAxMiBTVE9SRV9BVFRSICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAxNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAxOCBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAgNCBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCisgICAgICAgICAgICAgIDYgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGNscykKKyAgICAgICAgICAgICAgOCBTVE9SRV9BVFRSICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAxMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICAxMiBSRVRVUk5fVkFMVUUKICIiIiAlIChfQy5jbS5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDIsKQogCiBkaXNfY19zdGF0aWNfbWV0aG9kID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgICA2IENPTVBBUkVfT1AgICAgICAgICAgICAgICAyICg9PSkKLSAgICAgICAgICAgICAgOSBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAxMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAxNSBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAgNCBDT01QQVJFX09QICAgICAgICAgICAgICAgMiAoPT0pCisgICAgICAgICAgICAgIDYgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHgpCisgICAgICAgICAgICAgIDggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMTAgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX0Muc20uX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAyLCkKIAogIyBDbGFzcyBkaXNhc3NlbWJsaW5nIGluZm8gaGFzIGFuIGV4dHJhIG5ld2xpbmUgYXQgZW5kLgpAQCAtOTUsMjMgKzk1LDIzIEBACiAKIGRpc19mID0gIiIiXAogJTNkICAgICAgICAgICAwIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChwcmludCkKLSAgICAgICAgICAgICAgMyBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoYSkKLSAgICAgICAgICAgICAgNiBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMSAoMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcikKLSAgICAgICAgICAgICAgOSBQT1BfVE9QCisgICAgICAgICAgICAgIDIgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGEpCisgICAgICAgICAgICAgIDQgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCisgICAgICAgICAgICAgIDYgUE9QX1RPUAogCi0lM2QgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgMTMgUkVUVVJOX1ZBTFVFCislM2QgICAgICAgICAgIDggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCisgICAgICAgICAgICAgMTAgUkVUVVJOX1ZBTFVFCiAiIiIgJSAoX2YuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAxLAogICAgICAgIF9mLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMikKIAogCiBkaXNfZl9jb19jb2RlID0gIiIiXAogICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKDApCi0gICAgICAgICAgMyBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoMCkKLSAgICAgICAgICA2IENBTExfRlVOQ1RJT04gICAgICAgICAgICAxICgxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyKQotICAgICAgICAgIDkgUE9QX1RPUAotICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAxMyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAyIExPQURfRkFTVCAgICAgICAgICAgICAgICAwICgwKQorICAgICAgICAgIDQgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCisgICAgICAgICAgNiBQT1BfVE9QCisgICAgICAgICAgOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgIDEwIFJFVFVSTl9WQUxVRQogIiIiCiAKIApAQCAtMTIxLDIwICsxMjEsMjAgQEAKICAgICAgICAgcGFzcwogCiBkaXNfYnVnNzA4OTAxID0gIiIiXAotJTNkICAgICAgICAgICAwIFNFVFVQX0xPT1AgICAgICAgICAgICAgIDIzICh0byAyNikKLSAgICAgICAgICAgICAgMyBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAocmFuZ2UpCi0gICAgICAgICAgICAgIDYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCislM2QgICAgICAgICAgIDAgU0VUVVBfTE9PUCAgICAgICAgICAgICAgMTggKHRvIDIwKQorICAgICAgICAgICAgICAyIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChyYW5nZSkKKyAgICAgICAgICAgICAgNCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKIAotJTNkICAgICAgICAgICA5IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgxMCkKLSAgICAgICAgICAgICAxMiBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMiAoMiBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcikKLSAgICAgICAgICAgICAxNSBHRVRfSVRFUgotICAgICAgICA+PiAgIDE2IEZPUl9JVEVSICAgICAgICAgICAgICAgICA2ICh0byAyNSkKLSAgICAgICAgICAgICAxOSBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAocmVzKQorJTNkICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgxMCkKKyAgICAgICAgICAgICAgOCBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMiAoMiBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcikKKyAgICAgICAgICAgICAxMCBHRVRfSVRFUgorICAgICAgICA+PiAgIDEyIEZPUl9JVEVSICAgICAgICAgICAgICAgICA0ICh0byAxOCkKKyAgICAgICAgICAgICAxNCBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAocmVzKQogCi0lM2QgICAgICAgICAgMjIgSlVNUF9BQlNPTFVURSAgICAgICAgICAgMTYKLSAgICAgICAgPj4gICAyNSBQT1BfQkxPQ0sKLSAgICAgICAgPj4gICAyNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAyOSBSRVRVUk5fVkFMVUUKKyUzZCAgICAgICAgICAxNiBKVU1QX0FCU09MVVRFICAgICAgICAgICAxMgorICAgICAgICA+PiAgIDE4IFBPUF9CTE9DSworICAgICAgICA+PiAgIDIwIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgIDIyIFJFVFVSTl9WQUxVRQogIiIiICUgKGJ1ZzcwODkwMS5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDEsCiAgICAgICAgYnVnNzA4OTAxLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vICsgMiwKICAgICAgICBidWc3MDg5MDEuX19jb2RlX18uY29fZmlyc3RsaW5lbm8gKyAzKQpAQCAtMTQ3LDIyICsxNDcsMjIgQEAKIAogZGlzX2J1ZzEzMzM5ODIgPSAiIiJcCiAlM2QgICAgICAgICAgIDAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDApCi0gICAgICAgICAgICAgIDMgUE9QX0pVTVBfSUZfVFJVRSAgICAgICAgMzUKLSAgICAgICAgICAgICAgNiBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAoQXNzZXJ0aW9uRXJyb3IpCi0gICAgICAgICAgICAgIDkgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDxjb2RlIG9iamVjdCA8bGlzdGNvbXA+IGF0IDB4Li4uLCBmaWxlICIlcyIsIGxpbmUgJWQ+KQotICAgICAgICAgICAgIDEyIExPQURfQ09OU1QgICAgICAgICAgICAgICAzICgnYnVnMTMzMzk4Mi48bG9jYWxzPi48bGlzdGNvbXA+JykKLSAgICAgICAgICAgICAxNSBNQUtFX0ZVTkNUSU9OICAgICAgICAgICAgMAotICAgICAgICAgICAgIDE4IExPQURfRkFTVCAgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgIDIxIEdFVF9JVEVSCisgICAgICAgICAgICAgIDIgUE9QX0pVTVBfSUZfVFJVRSAgICAgICAgMjYKKyAgICAgICAgICAgICAgNCBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAoQXNzZXJ0aW9uRXJyb3IpCisgICAgICAgICAgICAgIDYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDxjb2RlIG9iamVjdCA8bGlzdGNvbXA+IGF0IDB4Li4uLCBmaWxlICIlcyIsIGxpbmUgJWQ+KQorICAgICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAzICgnYnVnMTMzMzk4Mi48bG9jYWxzPi48bGlzdGNvbXA+JykKKyAgICAgICAgICAgICAxMCBNQUtFX0ZVTkNUSU9OICAgICAgICAgICAgMAorICAgICAgICAgICAgIDEyIExPQURfRkFTVCAgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgIDE0IEdFVF9JVEVSCisgICAgICAgICAgICAgMTYgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCisKKyUzZCAgICAgICAgICAxOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgNCAoMSkKKyAgICAgICAgICAgICAyMCBCSU5BUllfQURECiAgICAgICAgICAgICAgMjIgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEgKDEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXIpCisgICAgICAgICAgICAgMjQgUkFJU0VfVkFSQVJHUyAgICAgICAgICAgIDEKIAotJTNkICAgICAgICAgIDI1IExPQURfQ09OU1QgICAgICAgICAgICAgICA0ICgxKQotICAgICAgICAgICAgIDI4IEJJTkFSWV9BREQKLSAgICAgICAgICAgICAyOSBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMSAoMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcikKLSAgICAgICAgICAgICAzMiBSQUlTRV9WQVJBUkdTICAgICAgICAgICAgMQotCi0lM2QgICAgID4+ICAgMzUgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCi0gICAgICAgICAgICAgMzggUkVUVVJOX1ZBTFVFCislM2QgICAgID4+ICAgMjYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMjggUkVUVVJOX1ZBTFVFCiAiIiIgJSAoYnVnMTMzMzk4Mi5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDEsCiAgICAgICAgX19maWxlX18sCiAgICAgICAgYnVnMTMzMzk4Mi5fX2NvZGVfXy5jb19maXJzdGxpbmVubyArIDEsCkBAIC0xNzEsMTkgKzE3MSwxOSBAQAogCiBfQklHX0xJTkVOT19GT1JNQVQgPSAiIiJcCiAlM2QgICAgICAgICAgIDAgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKHNwYW0pCi0gICAgICAgICAgICAgIDMgUE9QX1RPUAorICAgICAgICAgICAgICAyIFBPUF9UT1AKICAgICAgICAgICAgICAgNCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKLSAgICAgICAgICAgICAgNyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgNiBSRVRVUk5fVkFMVUUKICIiIgogCiBkaXNfbW9kdWxlX2V4cGVjdGVkX3Jlc3VsdHMgPSAiIiJcCiBEaXNhc3NlbWJseSBvZiBmOgogICA0ICAgICAgICAgICAwIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgICAzIFJFVFVSTl9WQUxVRQorICAgICAgICAgICAgICAyIFJFVFVSTl9WQUxVRQogCiBEaXNhc3NlbWJseSBvZiBnOgogICA1ICAgICAgICAgICAwIExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgICAzIFJFVFVSTl9WQUxVRQorICAgICAgICAgICAgICAyIFJFVFVSTl9WQUxVRQogCiAiIiIKIApAQCAtMTkxLDIwICsxOTEsMjAgQEAKIAogZGlzX2V4cHJfc3RyID0gIiIiXAogICAxICAgICAgICAgICAwIExPQURfTkFNRSAgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgICAzIExPQURfQ09OU1QgICAgICAgICAgICAgICAwICgxKQotICAgICAgICAgICAgICA2IEJJTkFSWV9BREQKLSAgICAgICAgICAgICAgNyBSRVRVUk5fVkFMVUUKKyAgICAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMSkKKyAgICAgICAgICAgICAgNCBCSU5BUllfQURECisgICAgICAgICAgICAgIDYgUkVUVVJOX1ZBTFVFCiAiIiIKIAogc2ltcGxlX3N0bXRfc3RyID0gInggPSB4ICsgMSIKIAogZGlzX3NpbXBsZV9zdG10X3N0ciA9ICIiIlwKICAgMSAgICAgICAgICAgMCBMT0FEX05BTUUgICAgICAgICAgICAgICAgMCAoeCkKLSAgICAgICAgICAgICAgMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoMSkKLSAgICAgICAgICAgICAgNiBCSU5BUllfQURECi0gICAgICAgICAgICAgIDcgU1RPUkVfTkFNRSAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKE5vbmUpCi0gICAgICAgICAgICAgMTMgUkVUVVJOX1ZBTFVFCisgICAgICAgICAgICAgIDIgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKDEpCisgICAgICAgICAgICAgIDQgQklOQVJZX0FERAorICAgICAgICAgICAgICA2IFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgICA4IExPQURfQ09OU1QgICAgICAgICAgICAgICAxIChOb25lKQorICAgICAgICAgICAgIDEwIFJFVFVSTl9WQUxVRQogIiIiCiAKIGNvbXBvdW5kX3N0bXRfc3RyID0gIiIiXApAQCAtMjE1LDU0ICsyMTUsNTQgQEAKIAogZGlzX2NvbXBvdW5kX3N0bXRfc3RyID0gIiIiXAogICAxICAgICAgICAgICAwIExPQURfQ09OU1QgICAgICAgICAgICAgICAwICgwKQotICAgICAgICAgICAgICAzIFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgICAyIFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQogCi0gIDIgICAgICAgICAgIDYgU0VUVVBfTE9PUCAgICAgICAgICAgICAgMTQgKHRvIDIzKQorICAyICAgICAgICAgICA0IFNFVFVQX0xPT1AgICAgICAgICAgICAgIDEyICh0byAxOCkKIAotICAzICAgICA+PiAgICA5IExPQURfTkFNRSAgICAgICAgICAgICAgICAwICh4KQotICAgICAgICAgICAgIDEyIExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQotICAgICAgICAgICAgIDE1IElOUExBQ0VfQURECi0gICAgICAgICAgICAgMTYgU1RPUkVfTkFNRSAgICAgICAgICAgICAgIDAgKHgpCi0gICAgICAgICAgICAgMTkgSlVNUF9BQlNPTFVURSAgICAgICAgICAgIDkKLSAgICAgICAgICAgICAyMiBQT1BfQkxPQ0sKLSAgICAgICAgPj4gICAyMyBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoTm9uZSkKLSAgICAgICAgICAgICAyNiBSRVRVUk5fVkFMVUUKKyAgMyAgICAgPj4gICAgNiBMT0FEX05BTUUgICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAgOCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAxMCBJTlBMQUNFX0FERAorICAgICAgICAgICAgIDEyIFNUT1JFX05BTUUgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgIDE0IEpVTVBfQUJTT0xVVEUgICAgICAgICAgICA2CisgICAgICAgICAgICAgMTYgUE9QX0JMT0NLCisgICAgICAgID4+ICAgMTggTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKE5vbmUpCisgICAgICAgICAgICAgMjAgUkVUVVJOX1ZBTFVFCiAiIiIKIAogZGlzX3RyYWNlYmFjayA9ICIiIlwKLSUzZCAgICAgICAgICAgMCBTRVRVUF9FWENFUFQgICAgICAgICAgICAxMiAodG8gMTUpCislM2QgICAgICAgICAgIDAgU0VUVVBfRVhDRVBUICAgICAgICAgICAgMTIgKHRvIDE0KQogCi0lM2QgICAgICAgICAgIDMgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDEpCi0gICAgICAgICAgICAgIDYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDApCi0gICAgLS0+ICAgICAgIDkgQklOQVJZX1RSVUVfRElWSURFCi0gICAgICAgICAgICAgMTAgUE9QX1RPUAotICAgICAgICAgICAgIDExIFBPUF9CTE9DSwotICAgICAgICAgICAgIDEyIEpVTVBfRk9SV0FSRCAgICAgICAgICAgIDQ2ICh0byA2MSkKKyUzZCAgICAgICAgICAgMiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAgNCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMCkKKyAgICAtLT4gICAgICAgNiBCSU5BUllfVFJVRV9ESVZJREUKKyAgICAgICAgICAgICAgOCBQT1BfVE9QCisgICAgICAgICAgICAgMTAgUE9QX0JMT0NLCisgICAgICAgICAgICAgMTIgSlVNUF9GT1JXQVJEICAgICAgICAgICAgNDAgKHRvIDU0KQogCi0lM2QgICAgID4+ICAgMTUgRFVQX1RPUAorJTNkICAgICA+PiAgIDE0IERVUF9UT1AKICAgICAgICAgICAgICAxNiBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAoRXhjZXB0aW9uKQotICAgICAgICAgICAgIDE5IENPTVBBUkVfT1AgICAgICAgICAgICAgIDEwIChleGNlcHRpb24gbWF0Y2gpCi0gICAgICAgICAgICAgMjIgUE9QX0pVTVBfSUZfRkFMU0UgICAgICAgNjAKLSAgICAgICAgICAgICAyNSBQT1BfVE9QCi0gICAgICAgICAgICAgMjYgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKGUpCi0gICAgICAgICAgICAgMjkgUE9QX1RPUAotICAgICAgICAgICAgIDMwIFNFVFVQX0ZJTkFMTFkgICAgICAgICAgIDE0ICh0byA0NykKKyAgICAgICAgICAgICAxOCBDT01QQVJFX09QICAgICAgICAgICAgICAxMCAoZXhjZXB0aW9uIG1hdGNoKQorICAgICAgICAgICAgIDIwIFBPUF9KVU1QX0lGX0ZBTFNFICAgICAgIDUyCisgICAgICAgICAgICAgMjIgUE9QX1RPUAorICAgICAgICAgICAgIDI0IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwIChlKQorICAgICAgICAgICAgIDI2IFBPUF9UT1AKKyAgICAgICAgICAgICAyOCBTRVRVUF9GSU5BTExZICAgICAgICAgICAxMiAodG8gNDIpCiAKLSUzZCAgICAgICAgICAzMyBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoZSkKLSAgICAgICAgICAgICAzNiBMT0FEX0FUVFIgICAgICAgICAgICAgICAgMSAoX190cmFjZWJhY2tfXykKLSAgICAgICAgICAgICAzOSBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMSAodGIpCi0gICAgICAgICAgICAgNDIgUE9QX0JMT0NLCi0gICAgICAgICAgICAgNDMgUE9QX0VYQ0VQVAotICAgICAgICAgICAgIDQ0IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICA+PiAgIDQ3IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQotICAgICAgICAgICAgIDUwIFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwIChlKQotICAgICAgICAgICAgIDUzIERFTEVURV9GQVNUICAgICAgICAgICAgICAwIChlKQotICAgICAgICAgICAgIDU2IEVORF9GSU5BTExZCi0gICAgICAgICAgICAgNTcgSlVNUF9GT1JXQVJEICAgICAgICAgICAgIDEgKHRvIDYxKQotICAgICAgICA+PiAgIDYwIEVORF9GSU5BTExZCislM2QgICAgICAgICAgMzAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGUpCisgICAgICAgICAgICAgMzIgTE9BRF9BVFRSICAgICAgICAgICAgICAgIDEgKF9fdHJhY2ViYWNrX18pCisgICAgICAgICAgICAgMzQgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDEgKHRiKQorICAgICAgICAgICAgIDM2IFBPUF9CTE9DSworICAgICAgICAgICAgIDM4IFBPUF9FWENFUFQKKyAgICAgICAgICAgICA0MCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgPj4gICA0MiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICA0NCBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMCAoZSkKKyAgICAgICAgICAgICA0NiBERUxFVEVfRkFTVCAgICAgICAgICAgICAgMCAoZSkKKyAgICAgICAgICAgICA0OCBFTkRfRklOQUxMWQorICAgICAgICAgICAgIDUwIEpVTVBfRk9SV0FSRCAgICAgICAgICAgICAyICh0byA1NCkKKyAgICAgICAgPj4gICA1MiBFTkRfRklOQUxMWQogCi0lM2QgICAgID4+ICAgNjEgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDEgKHRiKQotICAgICAgICAgICAgIDY0IFJFVFVSTl9WQUxVRQorJTNkICAgICA+PiAgIDU0IExPQURfRkFTVCAgICAgICAgICAgICAgICAxICh0YikKKyAgICAgICAgICAgICA1NiBSRVRVUk5fVkFMVUUKICIiIiAlIChUUkFDRUJBQ0tfQ09ERS5jb19maXJzdGxpbmVubyArIDEsCiAgICAgICAgVFJBQ0VCQUNLX0NPREUuY29fZmlyc3RsaW5lbm8gKyAyLAogICAgICAgIFRSQUNFQkFDS19DT0RFLmNvX2ZpcnN0bGluZW5vICsgMywKQEAgLTY0OSwxNzEgKzY0OSwxNjkgQEAKIAogSW5zdHJ1Y3Rpb24gPSBkaXMuSW5zdHJ1Y3Rpb24KIGV4cGVjdGVkX29waW5mb19vdXRlciA9IFsKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTEsIGFyZ3ZhbD0zLCBhcmdyZXByPSczJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTIsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MCwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9OSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX1RVUExFJywgb3Bjb2RlPTEwMiwgYXJnPTIsIGFyZ3ZhbD0yLCBhcmdyZXByPScnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD1jb2RlX29iamVjdF9mLCBhcmdyZXByPXJlcHIoY29kZV9vYmplY3RfZiksIG9mZnNldD0xNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NCwgYXJndmFsPSdvdXRlci48bG9jYWxzPi5mJywgYXJncmVwcj0iJ291dGVyLjxsb2NhbHM+LmYnIiwgb2Zmc2V0PTE4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTUFLRV9DTE9TVVJFJywgb3Bjb2RlPTEzNCwgYXJnPTIsIGFyZ3ZhbD0yLCBhcmdyZXByPScnLCBvZmZzZXQ9MjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTIsIGFyZ3ZhbD0nZicsIGFyZ3JlcHI9J2YnLCBvZmZzZXQ9MjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0wLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MjcsIHN0YXJ0c19saW5lPTcsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9MzAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9MzMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTUsIGFyZ3ZhbD0nJywgYXJncmVwcj0iJyciLCBvZmZzZXQ9MzYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTYsIGFyZ3ZhbD0xLCBhcmdyZXByPScxJywgb2Zmc2V0PTM5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfTElTVCcsIG9wY29kZT0xMDMsIGFyZz0wLCBhcmd2YWw9MCwgYXJncmVwcj0nJywgb2Zmc2V0PTQyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfTUFQJywgb3Bjb2RlPTEwNSwgYXJnPTAsIGFyZ3ZhbD0wLCBhcmdyZXByPScnLCBvZmZzZXQ9NDUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTcsIGFyZ3ZhbD0nSGVsbG8gd29ybGQhJywgYXJncmVwcj0iJ0hlbGxvIHdvcmxkISciLCBvZmZzZXQ9NDgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTcsIGFyZ3ZhbD03LCBhcmdyZXByPSc3IHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTUxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0yLCBhcmd2YWw9J2YnLCBhcmdyZXByPSdmJywgb2Zmc2V0PTU1LCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9OCwgYXJndmFsPSgzLCA0KSwgYXJncmVwcj0nKDMsIDQpJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTIsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MCwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTEsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX1RVUExFJywgb3Bjb2RlPTEwMiwgYXJnPTIsIGFyZ3ZhbD0yLCBhcmdyZXByPScnLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPWNvZGVfb2JqZWN0X2YsIGFyZ3JlcHI9cmVwcihjb2RlX29iamVjdF9mKSwgb2Zmc2V0PTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTQsIGFyZ3ZhbD0nb3V0ZXIuPGxvY2Fscz4uZicsIGFyZ3JlcHI9IidvdXRlci48bG9jYWxzPi5mJyIsIG9mZnNldD0xMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J01BS0VfRlVOQ1RJT04nLCBvcGNvZGU9MTMyLCBhcmc9OSwgYXJndmFsPTksIGFyZ3JlcHI9JycsIG9mZnNldD0xMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MiwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD0xNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xNiwgc3RhcnRzX2xpbmU9NywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MCwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD0yMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPScnLCBhcmdyZXByPSInJyIsIG9mZnNldD0yMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NiwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9MjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9MSVNUJywgb3Bjb2RlPTEwMywgYXJnPTAsIGFyZ3ZhbD0wLCBhcmdyZXByPScnLCBvZmZzZXQ9MjYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCVUlMRF9NQVAnLCBvcGNvZGU9MTA1LCBhcmc9MCwgYXJndmFsPTAsIGFyZ3JlcHI9JycsIG9mZnNldD0yOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NywgYXJndmFsPSdIZWxsbyB3b3JsZCEnLCBhcmdyZXByPSInSGVsbG8gd29ybGQhJyIsIG9mZnNldD0zMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NywgYXJndmFsPTcsIGFyZ3JlcHI9JzcgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTM0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTIsIGFyZ3ZhbD0nZicsIGFyZ3JlcHI9J2YnLCBvZmZzZXQ9MzYsIHN0YXJ0c19saW5lPTgsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdSRVRVUk5fVkFMVUUnLCBvcGNvZGU9ODMsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTM4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCiBdCiAKIGV4cGVjdGVkX29waW5mb19mID0gWwotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MSwgYXJndmFsPTUsIGFyZ3JlcHI9JzUnLCBvZmZzZXQ9MCwgc3RhcnRzX2xpbmU9MywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MiwgYXJndmFsPTYsIGFyZ3JlcHI9JzYnLCBvZmZzZXQ9Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0yLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MywgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD05LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTAsIGFyZ3ZhbD0nYycsIGFyZ3JlcHI9J2MnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MSwgYXJndmFsPSdkJywgYXJncmVwcj0nZCcsIG9mZnNldD0xNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JVSUxEX1RVUExFJywgb3Bjb2RlPTEwMiwgYXJnPTQsIGFyZ3ZhbD00LCBhcmdyZXByPScnLCBvZmZzZXQ9MTgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD1jb2RlX29iamVjdF9pbm5lciwgYXJncmVwcj1yZXByKGNvZGVfb2JqZWN0X2lubmVyKSwgb2Zmc2V0PTIxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J291dGVyLjxsb2NhbHM+LmYuPGxvY2Fscz4uaW5uZXInLCBhcmdyZXByPSInb3V0ZXIuPGxvY2Fscz4uZi48bG9jYWxzPi5pbm5lciciLCBvZmZzZXQ9MjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdNQUtFX0NMT1NVUkUnLCBvcGNvZGU9MTM0LCBhcmc9MiwgYXJndmFsPTIsIGFyZ3JlcHI9JycsIG9mZnNldD0yNywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MiwgYXJndmFsPSdpbm5lcicsIGFyZ3JlcHI9J2lubmVyJywgb2Zmc2V0PTMwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MCwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTMzLCBzdGFydHNfbGluZT01LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0yLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTM2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0zLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTM5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0wLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTQyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0xLCBhcmd2YWw9J2QnLCBhcmdyZXByPSdkJywgb2Zmc2V0PTQ1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz00LCBhcmd2YWw9NCwgYXJncmVwcj0nNCBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD00OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NTEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MiwgYXJndmFsPSdpbm5lcicsIGFyZ3JlcHI9J2lubmVyJywgb2Zmc2V0PTUyLCBzdGFydHNfbGluZT02LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD01NSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPSg1LCA2KSwgYXJncmVwcj0nKDUsIDYpJywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MiwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DTE9TVVJFJywgb3Bjb2RlPTEzNSwgYXJnPTMsIGFyZ3ZhbD0nYicsIGFyZ3JlcHI9J2InLCBvZmZzZXQ9NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ0xPU1VSRScsIG9wY29kZT0xMzUsIGFyZz0wLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NMT1NVUkUnLCBvcGNvZGU9MTM1LCBhcmc9MSwgYXJndmFsPSdkJywgYXJncmVwcj0nZCcsIG9mZnNldD04LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQlVJTERfVFVQTEUnLCBvcGNvZGU9MTAyLCBhcmc9NCwgYXJndmFsPTQsIGFyZ3JlcHI9JycsIG9mZnNldD0xMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPWNvZGVfb2JqZWN0X2lubmVyLCBhcmdyZXByPXJlcHIoY29kZV9vYmplY3RfaW5uZXIpLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTQsIGFyZ3ZhbD0nb3V0ZXIuPGxvY2Fscz4uZi48bG9jYWxzPi5pbm5lcicsIGFyZ3JlcHI9IidvdXRlci48bG9jYWxzPi5mLjxsb2NhbHM+LmlubmVyJyIsIG9mZnNldD0xNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J01BS0VfRlVOQ1RJT04nLCBvcGNvZGU9MTMyLCBhcmc9OSwgYXJndmFsPTksIGFyZ3JlcHI9JycsIG9mZnNldD0xNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MiwgYXJndmFsPSdpbm5lcicsIGFyZ3JlcHI9J2lubmVyJywgb2Zmc2V0PTE4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MCwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTIwLCBzdGFydHNfbGluZT01LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0yLCBhcmd2YWw9J2EnLCBhcmdyZXByPSdhJywgb2Zmc2V0PTIyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0zLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0wLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTI2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0xLCBhcmd2YWw9J2QnLCBhcmdyZXByPSdkJywgb2Zmc2V0PTI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz00LCBhcmd2YWw9NCwgYXJncmVwcj0nNCBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0zMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MiwgYXJndmFsPSdpbm5lcicsIGFyZ3JlcHI9J2lubmVyJywgb2Zmc2V0PTM0LCBzdGFydHNfbGluZT02LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0zNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAogXQogCiBleHBlY3RlZF9vcGluZm9faW5uZXIgPSBbCiAgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MCwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTAsIHN0YXJ0c19saW5lPTQsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTAsIGFyZ3ZhbD0nYScsIGFyZ3JlcHI9J2EnLCBvZmZzZXQ9Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MSwgYXJndmFsPSdiJywgYXJncmVwcj0nYicsIG9mZnNldD02LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0yLCBhcmd2YWw9J2MnLCBhcmdyZXByPSdjJywgb2Zmc2V0PTksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTMsIGFyZ3ZhbD0nZCcsIGFyZ3JlcHI9J2QnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdlJywgYXJncmVwcj0nZScsIG9mZnNldD0xNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0xLCBhcmd2YWw9J2YnLCBhcmdyZXByPSdmJywgb2Zmc2V0PTE4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz02LCBhcmd2YWw9NiwgYXJncmVwcj0nNiBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0yMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTI1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MCwgYXJndmFsPSdhJywgYXJncmVwcj0nYScsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9ERVJFRicsIG9wY29kZT0xMzYsIGFyZz0xLCBhcmd2YWw9J2InLCBhcmdyZXByPSdiJywgb2Zmc2V0PTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0RFUkVGJywgb3Bjb2RlPTEzNiwgYXJnPTIsIGFyZ3ZhbD0nYycsIGFyZ3JlcHI9J2MnLCBvZmZzZXQ9Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfREVSRUYnLCBvcGNvZGU9MTM2LCBhcmc9MywgYXJndmFsPSdkJywgYXJncmVwcj0nZCcsIG9mZnNldD04LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0nZScsIGFyZ3JlcHI9J2UnLCBvZmZzZXQ9MTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MSwgYXJndmFsPSdmJywgYXJncmVwcj0nZicsIG9mZnNldD0xMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9NiwgYXJndmFsPTYsIGFyZ3JlcHI9JzYgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1JFVFVSTl9WQUxVRScsIG9wY29kZT04MywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKIF0KIAogZXhwZWN0ZWRfb3BpbmZvX2p1bXB5ID0gWwotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0xPT1AnLCBvcGNvZGU9MTIwLCBhcmc9NjgsIGFyZ3ZhbD03MSwgYXJncmVwcj0ndG8gNzEnLCBvZmZzZXQ9MCwgc3RhcnRzX2xpbmU9MywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncmFuZ2UnLCBhcmdyZXByPSdyYW5nZScsIG9mZnNldD0zLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JzEwJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdHRVRfSVRFUicsIG9wY29kZT02OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdGT1JfSVRFUicsIG9wY29kZT05MywgYXJnPTQ0LCBhcmd2YWw9NjAsIGFyZ3JlcHI9J3RvIDYwJywgb2Zmc2V0PTEzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTVE9SRV9GQVNUJywgb3Bjb2RlPTEyNSwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTksIHN0YXJ0c19saW5lPTQsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0yMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MjUsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MjksIHN0YXJ0c19saW5lPTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTMyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0wLCBhcmd2YWw9JzwnLCBhcmdyZXByPSc8Jywgb2Zmc2V0PTM1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9NDQsIGFyZ3ZhbD00NCwgYXJncmVwcj0nJywgb2Zmc2V0PTM4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMywgYXJndmFsPTEzLCBhcmdyZXByPScnLCBvZmZzZXQ9NDEsIHN0YXJ0c19saW5lPTYsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD00NCwgc3RhcnRzX2xpbmU9NywgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9NiwgYXJncmVwcj0nNicsIG9mZnNldD00Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9NCwgYXJndmFsPSc+JywgYXJncmVwcj0nPicsIG9mZnNldD01MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTEzLCBhcmd2YWw9MTMsIGFyZ3JlcHI9JycsIG9mZnNldD01Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0JSRUFLX0xPT1AnLCBvcGNvZGU9ODAsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTU2LCBzdGFydHNfbGluZT04LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9BQlNPTFVURScsIG9wY29kZT0xMTMsIGFyZz0xMywgYXJndmFsPTEzLCBhcmdyZXByPScnLCBvZmZzZXQ9NTcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfQkxPQ0snLCBvcGNvZGU9ODcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTYwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9NjEsIHN0YXJ0c19saW5lPTEwLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz00LCBhcmd2YWw9J0kgY2FuIGhheiBlbHNlIGNsYXVzZT8nLCBhcmdyZXByPSInSSBjYW4gaGF6IGVsc2UgY2xhdXNlPyciLCBvZmZzZXQ9NjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTY3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD03MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0xPT1AnLCBvcGNvZGU9MTIwLCBhcmc9NjgsIGFyZ3ZhbD0xNDIsIGFyZ3JlcHI9J3RvIDE0MicsIG9mZnNldD03MSwgc3RhcnRzX2xpbmU9MTEsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTc0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0xMzEsIGFyZ3ZhbD0xMzEsIGFyZ3JlcHI9JycsIG9mZnNldD03Nywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD04MCwgc3RhcnRzX2xpbmU9MTIsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD04Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9ODYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTg5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9OTAsIHN0YXJ0c19saW5lPTEzLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz01LCBhcmd2YWw9MSwgYXJncmVwcj0nMScsIG9mZnNldD05Mywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0lOUExBQ0VfU1VCVFJBQ1QnLCBvcGNvZGU9NTYsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTk2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTk3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTAwLCBzdGFydHNfbGluZT0xNCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MywgYXJndmFsPTYsIGFyZ3JlcHI9JzYnLCBvZmZzZXQ9MTAzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz00LCBhcmd2YWw9Jz4nLCBhcmdyZXByPSc+Jywgb2Zmc2V0PTEwNiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTExNSwgYXJndmFsPTExNSwgYXJncmVwcj0nJywgb2Zmc2V0PTEwOSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9NzQsIGFyZ3ZhbD03NCwgYXJncmVwcj0nJywgb2Zmc2V0PTExMiwgc3RhcnRzX2xpbmU9MTUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0xMTUsIHN0YXJ0c19saW5lPTE2LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTIsIGFyZ3ZhbD00LCBhcmdyZXByPSc0Jywgb2Zmc2V0PTExOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9MCwgYXJndmFsPSc8JywgYXJncmVwcj0nPCcsIG9mZnNldD0xMjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz03NCwgYXJndmFsPTc0LCBhcmdyZXByPScnLCBvZmZzZXQ9MTI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nQlJFQUtfTE9PUCcsIG9wY29kZT04MCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTI3LCBzdGFydHNfbGluZT0xNywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9NzQsIGFyZ3ZhbD03NCwgYXJncmVwcj0nJywgb2Zmc2V0PTEyOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTMxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTMyLCBzdGFydHNfbGluZT0xOSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NiwgYXJndmFsPSdXaG8gbGV0IGxvbGNhdHogaW50byB0aGlzIHRlc3Qgc3VpdGU/JywgYXJncmVwcj0iJ1dobyBsZXQgbG9sY2F0eiBpbnRvIHRoaXMgdGVzdCBzdWl0ZT8nIiwgb2Zmc2V0PTEzNSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTM4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNDEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9GSU5BTExZJywgb3Bjb2RlPTEyMiwgYXJnPTczLCBhcmd2YWw9MjE4LCBhcmdyZXByPSd0byAyMTgnLCBvZmZzZXQ9MTQyLCBzdGFydHNfbGluZT0yMCwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfRVhDRVBUJywgb3Bjb2RlPTEyMSwgYXJnPTEyLCBhcmd2YWw9MTYwLCBhcmdyZXByPSd0byAxNjAnLCBvZmZzZXQ9MTQ1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz01LCBhcmd2YWw9MSwgYXJncmVwcj0nMScsIG9mZnNldD0xNDgsIHN0YXJ0c19saW5lPTIxLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz03LCBhcmd2YWw9MCwgYXJncmVwcj0nMCcsIG9mZnNldD0xNTEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdCSU5BUllfVFJVRV9ESVZJREUnLCBvcGNvZGU9MjcsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE1NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTU1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0ZPUldBUkQnLCBvcGNvZGU9MTEwLCBhcmc9MjgsIGFyZ3ZhbD0xODgsIGFyZ3JlcHI9J3RvIDE4OCcsIG9mZnNldD0xNTcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdEVVBfVE9QJywgb3Bjb2RlPTQsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2MCwgc3RhcnRzX2xpbmU9MjIsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTIsIGFyZ3ZhbD0nWmVyb0RpdmlzaW9uRXJyb3InLCBhcmdyZXByPSdaZXJvRGl2aXNpb25FcnJvcicsIG9mZnNldD0xNjEsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTEwLCBhcmd2YWw9J2V4Y2VwdGlvbiBtYXRjaCcsIGFyZ3JlcHI9J2V4Y2VwdGlvbiBtYXRjaCcsIG9mZnNldD0xNjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0xODcsIGFyZ3ZhbD0xODcsIGFyZ3JlcHI9JycsIG9mZnNldD0xNjcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTcxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xNzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0xLCBhcmd2YWw9J3ByaW50JywgYXJncmVwcj0ncHJpbnQnLCBvZmZzZXQ9MTczLCBzdGFydHNfbGluZT0yMywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9OCwgYXJndmFsPSdIZXJlIHdlIGdvLCBoZXJlIHdlIGdvLCBoZXJlIHdlIGdvLi4uJywgYXJncmVwcj0iJ0hlcmUgd2UgZ28sIGhlcmUgd2UgZ28sIGhlcmUgd2UgZ28uLi4nIiwgb2Zmc2V0PTE3Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MTc5LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xODIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfRVhDRVBUJywgb3Bjb2RlPTg5LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xODMsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0ZPUldBUkQnLCBvcGNvZGU9MTEwLCBhcmc9MjcsIGFyZ3ZhbD0yMTQsIGFyZ3JlcHI9J3RvIDIxNCcsIG9mZnNldD0xODQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdFTkRfRklOQUxMWScsIG9wY29kZT04OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTg3LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0xODgsIHN0YXJ0c19saW5lPTI1LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdTRVRVUF9XSVRIJywgb3Bjb2RlPTE0MywgYXJnPTE3LCBhcmd2YWw9MjExLCBhcmdyZXByPSd0byAyMTEnLCBvZmZzZXQ9MTkxLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0xLCBhcmd2YWw9J2RvZGd5JywgYXJncmVwcj0nZG9kZ3knLCBvZmZzZXQ9MTk0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTE5Nywgc3RhcnRzX2xpbmU9MjYsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTksIGFyZ3ZhbD0nTmV2ZXIgcmVhY2ggdGhpcycsIGFyZ3JlcHI9IidOZXZlciByZWFjaCB0aGlzJyIsIG9mZnNldD0yMDAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTIwMywgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjA2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMDcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTIwOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J1dJVEhfQ0xFQU5VUF9TVEFSVCcsIG9wY29kZT04MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjExLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdXSVRIX0NMRUFOVVBfRklOSVNIJywgb3Bjb2RlPTgyLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdFTkRfRklOQUxMWScsIG9wY29kZT04OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjEzLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MjE1LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTIxOCwgc3RhcnRzX2xpbmU9MjgsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MTAsIGFyZ3ZhbD0iT0ssIG5vdyB3ZSdyZSBkb25lIiwgYXJncmVwcj0nIk9LLCBub3cgd2VcJ3JlIGRvbmUiJywgb2Zmc2V0PTIyMSwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAotICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9MjI0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0yMjcsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdFTkRfRklOQUxMWScsIG9wY29kZT04OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0yMjksIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKLSAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdSRVRVUk5fVkFMVUUnLCBvcGNvZGU9ODMsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIzMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0xPT1AnLCBvcGNvZGU9MTIwLCBhcmc9NTIsIGFyZ3ZhbD01NCwgYXJncmVwcj0ndG8gNTQnLCBvZmZzZXQ9MCwgc3RhcnRzX2xpbmU9MywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTAsIGFyZ3ZhbD0ncmFuZ2UnLCBhcmdyZXByPSdyYW5nZScsIG9mZnNldD0yLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0xLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JzEwJywgb2Zmc2V0PTQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdHRVRfSVRFUicsIG9wY29kZT02OCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0ZPUl9JVEVSJywgb3Bjb2RlPTkzLCBhcmc9MzIsIGFyZ3ZhbD00NCwgYXJncmVwcj0ndG8gNDQnLCBvZmZzZXQ9MTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0xMiwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xNCwgc3RhcnRzX2xpbmU9NCwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTE2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0xOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MjAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD0yMiwgc3RhcnRzX2xpbmU9NSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MiwgYXJndmFsPTQsIGFyZ3JlcHI9JzQnLCBvZmZzZXQ9MjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDT01QQVJFX09QJywgb3Bjb2RlPTEwNywgYXJnPTAsIGFyZ3ZhbD0nPCcsIGFyZ3JlcHI9JzwnLCBvZmZzZXQ9MjYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfSlVNUF9JRl9GQUxTRScsIG9wY29kZT0xMTQsIGFyZz0zMiwgYXJndmFsPTMyLCBhcmdyZXByPScnLCBvZmZzZXQ9MjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTEwLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JycsIG9mZnNldD0zMCwgc3RhcnRzX2xpbmU9NiwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTMyLCBzdGFydHNfbGluZT03LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTMsIGFyZ3ZhbD02LCBhcmdyZXByPSc2Jywgb2Zmc2V0PTM0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz00LCBhcmd2YWw9Jz4nLCBhcmdyZXByPSc+Jywgb2Zmc2V0PTM2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MTAsIGFyZ3ZhbD0xMCwgYXJncmVwcj0nJywgb2Zmc2V0PTM4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQlJFQUtfTE9PUCcsIG9wY29kZT04MCwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NDAsIHN0YXJ0c19saW5lPTgsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdKVU1QX0FCU09MVVRFJywgb3Bjb2RlPTExMywgYXJnPTEwLCBhcmd2YWw9MTAsIGFyZ3JlcHI9JycsIG9mZnNldD00Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9NDQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD00Niwgc3RhcnRzX2xpbmU9MTAsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTQsIGFyZ3ZhbD0nSSBjYW4gaGF6IGVsc2UgY2xhdXNlPycsIGFyZ3JlcHI9IidJIGNhbiBoYXogZWxzZSBjbGF1c2U/JyIsIG9mZnNldD00OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9NTAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTUyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfTE9PUCcsIG9wY29kZT0xMjAsIGFyZz01MiwgYXJndmFsPTEwOCwgYXJncmVwcj0ndG8gMTA4Jywgb2Zmc2V0PTU0LCBzdGFydHNfbGluZT0xMSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTk4LCBhcmd2YWw9OTgsIGFyZ3JlcHI9JycsIG9mZnNldD01OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD02MCwgc3RhcnRzX2xpbmU9MTIsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0ZBU1QnLCBvcGNvZGU9MTI0LCBhcmc9MCwgYXJndmFsPSdpJywgYXJncmVwcj0naScsIG9mZnNldD02Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NBTExfRlVOQ1RJT04nLCBvcGNvZGU9MTMxLCBhcmc9MSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEgcG9zaXRpb25hbCwgMCBrZXl3b3JkIHBhaXInLCBvZmZzZXQ9NjQsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTY2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NjgsIHN0YXJ0c19saW5lPTEzLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz01LCBhcmd2YWw9MSwgYXJncmVwcj0nMScsIG9mZnNldD03MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0lOUExBQ0VfU1VCVFJBQ1QnLCBvcGNvZGU9NTYsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTcyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nU1RPUkVfRkFTVCcsIG9wY29kZT0xMjUsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTc0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9NzYsIHN0YXJ0c19saW5lPTE0LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0zLCBhcmd2YWw9NiwgYXJncmVwcj0nNicsIG9mZnNldD03OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9NCwgYXJndmFsPSc+JywgYXJncmVwcj0nPicsIG9mZnNldD04MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTg2LCBhcmd2YWw9ODYsIGFyZ3JlcHI9JycsIG9mZnNldD04Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9NTYsIGFyZ3ZhbD01NiwgYXJncmVwcj0nJywgb2Zmc2V0PTg0LCBzdGFydHNfbGluZT0xNSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfRkFTVCcsIG9wY29kZT0xMjQsIGFyZz0wLCBhcmd2YWw9J2knLCBhcmdyZXByPSdpJywgb2Zmc2V0PTg2LCBzdGFydHNfbGluZT0xNiwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0yLCBhcmd2YWw9NCwgYXJncmVwcj0nNCcsIG9mZnNldD04OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0NPTVBBUkVfT1AnLCBvcGNvZGU9MTA3LCBhcmc9MCwgYXJndmFsPSc8JywgYXJncmVwcj0nPCcsIG9mZnNldD05MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9KVU1QX0lGX0ZBTFNFJywgb3Bjb2RlPTExNCwgYXJnPTU2LCBhcmd2YWw9NTYsIGFyZ3JlcHI9JycsIG9mZnNldD05Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0JSRUFLX0xPT1AnLCBvcGNvZGU9ODAsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTk0LCBzdGFydHNfbGluZT0xNywgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0pVTVBfQUJTT0xVVEUnLCBvcGNvZGU9MTEzLCBhcmc9NTYsIGFyZ3ZhbD01NiwgYXJncmVwcj0nJywgb2Zmc2V0PTk2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0JMT0NLJywgb3Bjb2RlPTg3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD05OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTEwMCwgc3RhcnRzX2xpbmU9MTksIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTYsIGFyZ3ZhbD0nV2hvIGxldCBsb2xjYXR6IGludG8gdGhpcyB0ZXN0IHN1aXRlPycsIGFyZ3JlcHI9IidXaG8gbGV0IGxvbGNhdHogaW50byB0aGlzIHRlc3Qgc3VpdGU/JyIsIG9mZnNldD0xMDIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTEwNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTA2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfRklOQUxMWScsIG9wY29kZT0xMjIsIGFyZz03MCwgYXJndmFsPTE4MCwgYXJncmVwcj0ndG8gMTgwJywgb2Zmc2V0PTEwOCwgc3RhcnRzX2xpbmU9MjAsIGlzX2p1bXBfdGFyZ2V0PVRydWUpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NFVFVQX0VYQ0VQVCcsIG9wY29kZT0xMjEsIGFyZz0xMiwgYXJndmFsPTEyNCwgYXJncmVwcj0ndG8gMTI0Jywgb2Zmc2V0PTExMCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NSwgYXJndmFsPTEsIGFyZ3JlcHI9JzEnLCBvZmZzZXQ9MTEyLCBzdGFydHNfbGluZT0yMSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9NywgYXJndmFsPTAsIGFyZ3JlcHI9JzAnLCBvZmZzZXQ9MTE0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQklOQVJZX1RSVUVfRElWSURFJywgb3Bjb2RlPTI3LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMTYsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTExOCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTIwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9GT1JXQVJEJywgb3Bjb2RlPTExMCwgYXJnPTI4LCBhcmd2YWw9MTUyLCBhcmdyZXByPSd0byAxNTInLCBvZmZzZXQ9MTIyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nRFVQX1RPUCcsIG9wY29kZT00LCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMjQsIHN0YXJ0c19saW5lPTIyLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0dMT0JBTCcsIG9wY29kZT0xMTYsIGFyZz0yLCBhcmd2YWw9J1plcm9EaXZpc2lvbkVycm9yJywgYXJncmVwcj0nWmVyb0RpdmlzaW9uRXJyb3InLCBvZmZzZXQ9MTI2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ09NUEFSRV9PUCcsIG9wY29kZT0xMDcsIGFyZz0xMCwgYXJndmFsPSdleGNlcHRpb24gbWF0Y2gnLCBhcmdyZXByPSdleGNlcHRpb24gbWF0Y2gnLCBvZmZzZXQ9MTI4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0pVTVBfSUZfRkFMU0UnLCBvcGNvZGU9MTE0LCBhcmc9MTUwLCBhcmd2YWw9MTUwLCBhcmdyZXByPScnLCBvZmZzZXQ9MTMwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX1RPUCcsIG9wY29kZT0xLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xMzIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTEzNCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTM2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9HTE9CQUwnLCBvcGNvZGU9MTE2LCBhcmc9MSwgYXJndmFsPSdwcmludCcsIGFyZ3JlcHI9J3ByaW50Jywgb2Zmc2V0PTEzOCwgc3RhcnRzX2xpbmU9MjMsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTgsIGFyZ3ZhbD0nSGVyZSB3ZSBnbywgaGVyZSB3ZSBnbywgaGVyZSB3ZSBnby4uLicsIGFyZ3JlcHI9IidIZXJlIHdlIGdvLCBoZXJlIHdlIGdvLCBoZXJlIHdlIGdvLi4uJyIsIG9mZnNldD0xNDAsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTE0Miwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTQ0LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUE9QX0VYQ0VQVCcsIG9wY29kZT04OSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTQ2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nSlVNUF9GT1JXQVJEJywgb3Bjb2RlPTExMCwgYXJnPTI2LCBhcmd2YWw9MTc2LCBhcmdyZXByPSd0byAxNzYnLCBvZmZzZXQ9MTQ4LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE1MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9GQVNUJywgb3Bjb2RlPTEyNCwgYXJnPTAsIGFyZ3ZhbD0naScsIGFyZ3JlcHI9J2knLCBvZmZzZXQ9MTUyLCBzdGFydHNfbGluZT0yNSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nU0VUVVBfV0lUSCcsIG9wY29kZT0xNDMsIGFyZz0xNCwgYXJndmFsPTE3MCwgYXJncmVwcj0ndG8gMTcwJywgb2Zmc2V0PTE1NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1NUT1JFX0ZBU1QnLCBvcGNvZGU9MTI1LCBhcmc9MSwgYXJndmFsPSdkb2RneScsIGFyZ3JlcHI9J2RvZGd5Jywgb2Zmc2V0PTE1Niwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xNTgsIHN0YXJ0c19saW5lPTI2LCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz05LCBhcmd2YWw9J05ldmVyIHJlYWNoIHRoaXMnLCBhcmdyZXByPSInTmV2ZXIgcmVhY2ggdGhpcyciLCBvZmZzZXQ9MTYwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nQ0FMTF9GVU5DVElPTicsIG9wY29kZT0xMzEsIGFyZz0xLCBhcmd2YWw9MSwgYXJncmVwcj0nMSBwb3NpdGlvbmFsLCAwIGtleXdvcmQgcGFpcicsIG9mZnNldD0xNjIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdQT1BfVE9QJywgb3Bjb2RlPTEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE2NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTY2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nTE9BRF9DT05TVCcsIG9wY29kZT0xMDAsIGFyZz0wLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nTm9uZScsIG9mZnNldD0xNjgsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdXSVRIX0NMRUFOVVBfU1RBUlQnLCBvcGNvZGU9ODEsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3MCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9VHJ1ZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nV0lUSF9DTEVBTlVQX0ZJTklTSCcsIG9wY29kZT04MiwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTcyLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE3NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9CTE9DSycsIG9wY29kZT04NywgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTc2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTAsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPSdOb25lJywgb2Zmc2V0PTE3OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfR0xPQkFMJywgb3Bjb2RlPTExNiwgYXJnPTEsIGFyZ3ZhbD0ncHJpbnQnLCBhcmdyZXByPSdwcmludCcsIG9mZnNldD0xODAsIHN0YXJ0c19saW5lPTI4LCBpc19qdW1wX3RhcmdldD1UcnVlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdMT0FEX0NPTlNUJywgb3Bjb2RlPTEwMCwgYXJnPTEwLCBhcmd2YWw9Ik9LLCBub3cgd2UncmUgZG9uZSIsIGFyZ3JlcHI9JyJPSywgbm93IHdlXCdyZSBkb25lIicsIG9mZnNldD0xODIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdDQUxMX0ZVTkNUSU9OJywgb3Bjb2RlPTEzMSwgYXJnPTEsIGFyZ3ZhbD0xLCBhcmdyZXByPScxIHBvc2l0aW9uYWwsIDAga2V5d29yZCBwYWlyJywgb2Zmc2V0PTE4NCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J1BPUF9UT1AnLCBvcGNvZGU9MSwgYXJnPU5vbmUsIGFyZ3ZhbD1Ob25lLCBhcmdyZXByPScnLCBvZmZzZXQ9MTg2LCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nRU5EX0ZJTkFMTFknLCBvcGNvZGU9ODgsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTE4OCwgc3RhcnRzX2xpbmU9Tm9uZSwgaXNfanVtcF90YXJnZXQ9RmFsc2UpLAorICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MTkwLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCisgIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0xOTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKSwKIF0KIAogIyBPbmUgbGFzdCBwaWVjZSBvZiBpbnNwZWN0IGZvZGRlciB0byBjaGVjayB0aGUgZGVmYXVsdCBsaW5lIG51bWJlciBoYW5kbGluZwogZGVmIHNpbXBsZSgpOiBwYXNzCiBleHBlY3RlZF9vcGluZm9fc2ltcGxlID0gWwogICBJbnN0cnVjdGlvbihvcG5hbWU9J0xPQURfQ09OU1QnLCBvcGNvZGU9MTAwLCBhcmc9MCwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9J05vbmUnLCBvZmZzZXQ9MCwgc3RhcnRzX2xpbmU9c2ltcGxlLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vLCBpc19qdW1wX3RhcmdldD1GYWxzZSksCi0gIEluc3RydWN0aW9uKG9wbmFtZT0nUkVUVVJOX1ZBTFVFJywgb3Bjb2RlPTgzLCBhcmc9Tm9uZSwgYXJndmFsPU5vbmUsIGFyZ3JlcHI9JycsIG9mZnNldD0zLCBzdGFydHNfbGluZT1Ob25lLCBpc19qdW1wX3RhcmdldD1GYWxzZSkKKyAgSW5zdHJ1Y3Rpb24ob3BuYW1lPSdSRVRVUk5fVkFMVUUnLCBvcGNvZGU9ODMsIGFyZz1Ob25lLCBhcmd2YWw9Tm9uZSwgYXJncmVwcj0nJywgb2Zmc2V0PTIsIHN0YXJ0c19saW5lPU5vbmUsIGlzX2p1bXBfdGFyZ2V0PUZhbHNlKQogXQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weSBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQppbmRleCAzMzE2M2I5Li5hOTUyMGE1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CkBAIC0xODc2LDcgKzE4NzYsNiBAQAogICAgICAgICBUbyBkZW1vbnN0cmF0ZSB0aGlzLCB3ZSdsbCBjcmVhdGUgYSBmYWtlIHN0YW5kYXJkIGlucHV0IHRoYXQKICAgICAgICAgY2FwdHVyZXMgb3VyIGRlYnVnZ2VyIGlucHV0OgogCi0gICAgICAgICAgPj4+IGltcG9ydCB0ZW1wZmlsZQogICAgICAgICAgID4+PiByZWFsX3N0ZGluID0gc3lzLnN0ZGluCiAgICAgICAgICAgPj4+IHN5cy5zdGRpbiA9IF9GYWtlSW5wdXQoWwogICAgICAgICAgIC4uLiAgICAncHJpbnQoeCknLCAgIyBwcmludCBkYXRhIGRlZmluZWQgYnkgdGhlIGV4YW1wbGUKQEAgLTE5MTcsNyArMTkxNiw3IEBACiAgICAgICAgICAgLi4uIGZpbmFsbHk6CiAgICAgICAgICAgLi4uICAgICBzeXMuc3RkaW4gPSByZWFsX3N0ZGluCiAgICAgICAgICAgLS1SZXR1cm4tLQotICAgICAgICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlWzhdPigzKWNhbGxzX3NldF90cmFjZSgpLT5Ob25lCisgICAgICAgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VbN10+KDMpY2FsbHNfc2V0X3RyYWNlKCktPk5vbmUKICAgICAgICAgICAtPiBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICAgICAoUGRiKSBwcmludCh5KQogICAgICAgICAgIDIKQEAgLTI3OTgsNyArMjc5Nyw2IEBACiAgICAgLi4uICAgICAgICAgXyA9IGYud3JpdGUoIiAgICAgICAnYWJjIGRlZidcbiIpCiAgICAgLi4uICAgICAgICAgXyA9IGYud3JpdGUoIlxuIikKICAgICAuLi4gICAgICAgICBfID0gZi53cml0ZSgnICAgXCJcIlwiXG4nKQotICAgIC4uLiAgICAgaW1wb3J0IHNodXRpbAogICAgIC4uLiAgICAgcmMxLCBvdXQxLCBlcnIxID0gc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX2ZhaWx1cmUoCiAgICAgLi4uICAgICAgICAgICAgICctbScsICdkb2N0ZXN0JywgZm4sIGZuMikKICAgICAuLi4gICAgIHJjMiwgb3V0MiwgZXJyMiA9IHNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9vaygKQEAgLTI5NDIsMTIgKzI5NDAsMTEgQEAKIGRlZiB0ZXN0X21haW4oKToKICAgICAjIENoZWNrIHRoZSBkb2N0ZXN0IGNhc2VzIGluIGRvY3Rlc3QgaXRzZWxmOgogICAgIHJldCA9IHN1cHBvcnQucnVuX2RvY3Rlc3QoZG9jdGVzdCwgdmVyYm9zaXR5PVRydWUpCisKICAgICAjIENoZWNrIHRoZSBkb2N0ZXN0IGNhc2VzIGRlZmluZWQgaGVyZToKICAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfZG9jdGVzdAogICAgIHN1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9kb2N0ZXN0LCB2ZXJib3NpdHk9VHJ1ZSkKIAotaW1wb3J0IHN5cywgcmUsIGlvCi0KIGRlZiB0ZXN0X2NvdmVyYWdlKGNvdmVyZGlyKToKICAgICB0cmFjZSA9IHN1cHBvcnQuaW1wb3J0X21vZHVsZSgndHJhY2UnKQogICAgIHRyYWNlciA9IHRyYWNlLlRyYWNlKGlnbm9yZWRpcnM9W3N5cy5iYXNlX3ByZWZpeCwgc3lzLmJhc2VfZXhlY19wcmVmaXgsXSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZHluYW1pYy5weSBiL0xpYi90ZXN0L3Rlc3RfZHluYW1pYy5weQppbmRleCA1MDgwZWM5Li4zYWUwOTBmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2R5bmFtaWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9keW5hbWljLnB5CkBAIC0xLDcgKzEsNiBAQAogIyBUZXN0IHRoZSBtb3N0IGR5bmFtaWMgY29ybmVyIGNhc2VzIG9mIFB5dGhvbidzIHJ1bnRpbWUgc2VtYW50aWNzLgogCiBpbXBvcnQgYnVpbHRpbnMKLWltcG9ydCBjb250ZXh0bGliCiBpbXBvcnQgdW5pdHRlc3QKIAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHN3YXBfaXRlbSwgc3dhcF9hdHRyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5IGIvTGliL3Rlc3QvdGVzdF9laW50ci5weQppbmRleCBhYWJhZDgzLi4yNWY4NmQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VpbnRyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZWludHIucHkKQEAgLTEsNyArMSw1IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzaWduYWwKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CkBAIC0xNiwxNCArMTQsOCBAQAogICAgICAgICAjIFJ1biB0aGUgdGVzdGVyIGluIGEgc3ViLXByb2Nlc3MsIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZQogICAgICAgICAjIHRocmVhZCAoZm9yIHJlbGlhYmxlIHNpZ25hbCBkZWxpdmVyeSkuCiAgICAgICAgIHRlc3RlciA9IHN1cHBvcnQuZmluZGZpbGUoImVpbnRyX3Rlc3Rlci5weSIsIHN1YmRpcj0iZWludHJkYXRhIikKLQotICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6Ci0gICAgICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCB0ZXN0ZXJdCi0gICAgICAgICAgICB3aXRoIHN1YnByb2Nlc3MuUG9wZW4oYXJncykgYXMgcHJvYzoKLSAgICAgICAgICAgICAgICBleGl0Y29kZSA9IHByb2Mud2FpdCgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4aXRjb2RlLCAwKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKHRlc3RlcikKKyAgICAgICAgIyB1c2UgLXUgdG8gdHJ5IHRvIGdldCB0aGUgZnVsbCBvdXRwdXQgaWYgdGhlIHRlc3QgaGFuZ3Mgb3IgY3Jhc2gKKyAgICAgICAgc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKCItdSIsIHRlc3RlcikKIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbC9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvX19pbml0X18ucHkKaW5kZXggZDJmN2QzMS4uMTYwMDE1OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL19faW5pdF9fLnB5CkBAIC0xLDUgKzEsNCBAQAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGVtYWlsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfYXNpYW5fY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2FzaWFuX2NvZGVjcy5weQppbmRleCBmOWNkN2Q5Li4xZTBjYWVlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfYXNpYW5fY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9hc2lhbl9jb2RlY3MucHkKQEAgLTMsNyArMyw2IEBACiAjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cyBmb3IgKG9wdGlvbmFsKSBBc2lhbiBjb2RlY3MKIAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKIGZyb20gdGVzdC50ZXN0X2VtYWlsIGltcG9ydCBUZXN0RW1haWxCYXNlCiBmcm9tIGVtYWlsLmNoYXJzZXQgaW1wb3J0IENoYXJzZXQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9lbWFpbC5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9lbWFpbC5weQppbmRleCA4OTRiODAwLi5hZjNmYjg1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfZW1haWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2VtYWlsLnB5CkBAIC0zNDIxLDcgKzM0MjEsNiBAQAogY2xhc3MgVGVzdEZlZWRQYXJzZXJzKFRlc3RFbWFpbEJhc2UpOgogCiAgICAgZGVmIHBhcnNlKHNlbGYsIGNodW5rcyk6Ci0gICAgICAgIGZyb20gZW1haWwuZmVlZHBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgogICAgICAgICBmZWVkcGFyc2VyID0gRmVlZFBhcnNlcigpCiAgICAgICAgIGZvciBjaHVuayBpbiBjaHVua3M6CiAgICAgICAgICAgICBmZWVkcGFyc2VyLmZlZWQoY2h1bmspCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfaGVhZGVycmVnaXN0cnkucHkgYi9MaWIvdGVzdC90ZXN0X2VtYWlsL3Rlc3RfaGVhZGVycmVnaXN0cnkucHkKaW5kZXggNTVlY2RlYS4uYWY4MzZkYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9lbWFpbC90ZXN0X2hlYWRlcnJlZ2lzdHJ5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWwvdGVzdF9oZWFkZXJyZWdpc3RyeS5weQpAQCAtMSw3ICsxLDYgQEAKIGltcG9ydCBkYXRldGltZQogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0eXBlcwogZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCiBmcm9tIGVtYWlsIGltcG9ydCBwb2xpY3kKIGZyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbnVtLnB5IGIvTGliL3Rlc3QvdGVzdF9lbnVtLnB5CmluZGV4IGU5NzBhMjYuLmIxYTU4NTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW51bS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2VudW0ucHkKQEAgLTYsNiArNiw3IEBACiBmcm9tIGVudW0gaW1wb3J0IEVudW0sIEludEVudW0sIEVudW1NZXRhLCB1bmlxdWUKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHBpY2tsZSBpbXBvcnQgZHVtcHMsIGxvYWRzLCBQaWNrbGluZ0Vycm9yLCBISUdIRVNUX1BST1RPQ09MCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogIyBmb3IgcGlja2xlIHRlc3RzCiB0cnk6CkBAIC0yODMsNiArMjg0LDI4IEBACiAgICAgICAgICAgICBjbGFzcyBXcm9uZyhFbnVtKToKICAgICAgICAgICAgICAgICBfYW55X25hbWVfID0gOQogCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgIyBwbGFpbiBFbnVtIG1lbWJlcnMgYXJlIGFsd2F5cyBUcnVlCisgICAgICAgIGNsYXNzIExvZ2ljKEVudW0pOgorICAgICAgICAgICAgdHJ1ZSA9IFRydWUKKyAgICAgICAgICAgIGZhbHNlID0gRmFsc2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKExvZ2ljLnRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShMb2dpYy5mYWxzZSkKKyAgICAgICAgIyB1bmxlc3Mgb3ZlcnJpZGRlbgorICAgICAgICBjbGFzcyBSZWFsTG9naWMoRW51bSk6CisgICAgICAgICAgICB0cnVlID0gVHJ1ZQorICAgICAgICAgICAgZmFsc2UgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3ZhbHVlXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFJlYWxMb2dpYy50cnVlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFJlYWxMb2dpYy5mYWxzZSkKKyAgICAgICAgIyBtaXhlZCBFbnVtcyBkZXBlbmQgb24gbWl4ZWQtaW4gdHlwZQorICAgICAgICBjbGFzcyBJbnRMb2dpYyhpbnQsIEVudW0pOgorICAgICAgICAgICAgdHJ1ZSA9IDEKKyAgICAgICAgICAgIGZhbHNlID0gMAorICAgICAgICBzZWxmLmFzc2VydFRydWUoSW50TG9naWMudHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShJbnRMb2dpYy5mYWxzZSkKKwogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgogICAgICAgICBTZWFzb24gPSBzZWxmLlNlYXNvbgogICAgICAgICBzZWxmLmFzc2VydEluKFNlYXNvbi5BVVRVTU4sIFNlYXNvbikKQEAgLTE3MzksNSArMTc2Miw0NyBAQAogICAgICAgICBpZiBmYWlsZWQ6CiAgICAgICAgICAgICBzZWxmLmZhaWwoInJlc3VsdCBkb2VzIG5vdCBlcXVhbCBleHBlY3RlZCwgc2VlIHByaW50IGFib3ZlIikKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgZW51bSkKKworCisjIFRoZXNlIGFyZSB1bm9yZGVyZWQgaGVyZSBvbiBwdXJwb3NlIHRvIGVuc3VyZSB0aGF0IGRlY2xhcmF0aW9uIG9yZGVyCisjIG1ha2VzIG5vIGRpZmZlcmVuY2UuCitDT05WRVJUX1RFU1RfTkFNRV9EID0gNQorQ09OVkVSVF9URVNUX05BTUVfQyA9IDUKK0NPTlZFUlRfVEVTVF9OQU1FX0IgPSA1CitDT05WRVJUX1RFU1RfTkFNRV9BID0gNSAgIyBUaGlzIG9uZSBzaG91bGQgc29ydCBmaXJzdC4KK0NPTlZFUlRfVEVTVF9OQU1FX0UgPSA1CitDT05WRVJUX1RFU1RfTkFNRV9GID0gNQorCitjbGFzcyBUZXN0SW50RW51bUNvbnZlcnQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NvbnZlcnRfdmFsdWVfbG9va3VwX3ByaW9yaXR5KHNlbGYpOgorICAgICAgICB0ZXN0X3R5cGUgPSBlbnVtLkludEVudW0uX2NvbnZlcnQoCisgICAgICAgICAgICAgICAgJ1VuaXR0ZXN0Q29udmVydCcsICd0ZXN0LnRlc3RfZW51bScsCisgICAgICAgICAgICAgICAgZmlsdGVyPWxhbWJkYSB4OiB4LnN0YXJ0c3dpdGgoJ0NPTlZFUlRfVEVTVF8nKSkKKyAgICAgICAgIyBXZSBkb24ndCB3YW50IHRoZSByZXZlcnNlIGxvb2t1cCB2YWx1ZSB0byB2YXJ5IHdoZW4gdGhlcmUgYXJlCisgICAgICAgICMgbXVsdGlwbGUgcG9zc2libGUgbmFtZXMgZm9yIGEgZ2l2ZW4gdmFsdWUuICBJdCBzaG91bGQgYWx3YXlzCisgICAgICAgICMgcmVwb3J0IHRoZSBmaXJzdCBsZXhpZ3JhcGhpY2FsIG5hbWUgaW4gdGhhdCBjYXNlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZSg1KS5uYW1lLCAnQ09OVkVSVF9URVNUX05BTUVfQScpCisKKyAgICBkZWYgdGVzdF9jb252ZXJ0KHNlbGYpOgorICAgICAgICB0ZXN0X3R5cGUgPSBlbnVtLkludEVudW0uX2NvbnZlcnQoCisgICAgICAgICAgICAgICAgJ1VuaXR0ZXN0Q29udmVydCcsICd0ZXN0LnRlc3RfZW51bScsCisgICAgICAgICAgICAgICAgZmlsdGVyPWxhbWJkYSB4OiB4LnN0YXJ0c3dpdGgoJ0NPTlZFUlRfVEVTVF8nKSkKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0ZXN0X3R5cGUgaGFzIGFsbCBvZiB0aGUgZGVzaXJlZCBuYW1lcyBhbmQgdmFsdWVzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9GLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9BKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9CLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9DLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9ELCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfdHlwZS5DT05WRVJUX1RFU1RfTkFNRV9FLCA1KQorICAgICAgICAjIEVuc3VyZSB0aGF0IHRlc3RfdHlwZSBvbmx5IHBpY2tlZCB1cCBuYW1lcyBtYXRjaGluZyB0aGUgZmlsdGVyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtuYW1lIGZvciBuYW1lIGluIGRpcih0ZXN0X3R5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVbMDoyXSBub3QgaW4gKCdDTycsICdfXycpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgbXNnPSdOYW1lcyBvdGhlciB0aGFuIENPTlZFUlRfVEVTVF8qIGZvdW5kLicpCisKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkgYi9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5CmluZGV4IGE3MzU5ZTkuLmE3YWZmOGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9lcG9sbC5weQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAogCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGlmIG5vdCBoYXNhdHRyKHNlbGVjdCwgImVwb2xsIik6CiAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInRlc3Qgd29ya3Mgb25seSBvbiBMaW51eCAyLjYiKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZhdWx0aGFuZGxlci5weSBiL0xpYi90ZXN0L3Rlc3RfZmF1bHRoYW5kbGVyLnB5CmluZGV4IDE1NjJlZWMuLmZjMmQ2ZDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmF1bHRoYW5kbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmF1bHRoYW5kbGVyLnB5CkBAIC0yMyw2ICsyMyw3IEBACiAgICAgX3Rlc3RjYXBpID0gTm9uZQogCiBUSU1FT1VUID0gMC41CitNU19XSU5ET1dTID0gKG9zLm5hbWUgPT0gJ250JykKIAogZGVmIGV4cGVjdGVkX3RyYWNlYmFjayhsaW5lbm8xLCBsaW5lbm8yLCBoZWFkZXIsIG1pbl9jb3VudD0xKToKICAgICByZWdleCA9IGhlYWRlcgpAQCAtNTgsOCArNTksOSBAQAogICAgICAgICAgICAgcGFzc19mZHMuYXBwZW5kKGZkKQogICAgICAgICB3aXRoIHN1cHBvcnQuU3VwcHJlc3NDcmFzaFJlcG9ydCgpOgogICAgICAgICAgICAgcHJvY2VzcyA9IHNjcmlwdF9oZWxwZXIuc3Bhd25fcHl0aG9uKCctYycsIGNvZGUsIHBhc3NfZmRzPXBhc3NfZmRzKQotICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQotICAgICAgICBleGl0Y29kZSA9IHByb2Nlc3Mud2FpdCgpCisgICAgICAgICAgICB3aXRoIHByb2Nlc3M6CisgICAgICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgICAgICBleGl0Y29kZSA9IHByb2Nlc3Mud2FpdCgpCiAgICAgICAgIG91dHB1dCA9IHN1cHBvcnQuc3RyaXBfcHl0aG9uX3N0ZGVycihzdGRvdXQpCiAgICAgICAgIG91dHB1dCA9IG91dHB1dC5kZWNvZGUoJ2FzY2lpJywgJ2JhY2tzbGFzaHJlcGxhY2UnKQogICAgICAgICBpZiBmaWxlbmFtZToKQEAgLTczLDE0ICs3NSwxMSBAQAogICAgICAgICAgICAgd2l0aCBvcGVuKGZkLCAicmIiLCBjbG9zZWZkPUZhbHNlKSBhcyBmcDoKICAgICAgICAgICAgICAgICBvdXRwdXQgPSBmcC5yZWFkKCkKICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5kZWNvZGUoJ2FzY2lpJywgJ2JhY2tzbGFzaHJlcGxhY2UnKQotICAgICAgICBvdXRwdXQgPSByZS5zdWIoJ0N1cnJlbnQgdGhyZWFkIDB4WzAtOWEtZl0rJywKLSAgICAgICAgICAgICAgICAgICAgICAgICdDdXJyZW50IHRocmVhZCBYWFgnLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KQogICAgICAgICByZXR1cm4gb3V0cHV0LnNwbGl0bGluZXMoKSwgZXhpdGNvZGUKIAotICAgIGRlZiBjaGVja19mYXRhbF9lcnJvcihzZWxmLCBjb2RlLCBsaW5lX251bWJlciwgbmFtZV9yZWdleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9Tm9uZSwgYWxsX3RocmVhZHM9VHJ1ZSwgb3RoZXJfcmVnZXg9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmQ9Tm9uZSk6CisgICAgZGVmIGNoZWNrX2Vycm9yKHNlbGYsIGNvZGUsIGxpbmVfbnVtYmVyLCBmYXRhbF9lcnJvciwgKiwKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9Tm9uZSwgYWxsX3RocmVhZHM9VHJ1ZSwgb3RoZXJfcmVnZXg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgZmQ9Tm9uZSwga25vd19jdXJyZW50X3RocmVhZD1UcnVlKToKICAgICAgICAgIiIiCiAgICAgICAgIENoZWNrIHRoYXQgdGhlIGZhdWx0IGhhbmRsZXIgZm9yIGZhdGFsIGVycm9ycyBpcyBlbmFibGVkIGFuZCBjaGVjayB0aGUKICAgICAgICAgdHJhY2ViYWNrIGZyb20gdGhlIGNoaWxkIHByb2Nlc3Mgb3V0cHV0LgpAQCAtODgsMTkgKzg3LDIyIEBACiAgICAgICAgIFJhaXNlIGFuIGVycm9yIGlmIHRoZSBvdXRwdXQgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgZm9ybWF0LgogICAgICAgICAiIiIKICAgICAgICAgaWYgYWxsX3RocmVhZHM6Ci0gICAgICAgICAgICBoZWFkZXIgPSAnQ3VycmVudCB0aHJlYWQgWFhYIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KScKKyAgICAgICAgICAgIGlmIGtub3dfY3VycmVudF90aHJlYWQ6CisgICAgICAgICAgICAgICAgaGVhZGVyID0gJ0N1cnJlbnQgdGhyZWFkIDB4WzAtOWEtZl0rJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAnVGhyZWFkIDB4WzAtOWEtZl0rJwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgaGVhZGVyID0gJ1N0YWNrIChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KScKKyAgICAgICAgICAgIGhlYWRlciA9ICdTdGFjaycKICAgICAgICAgcmVnZXggPSAiIiIKLSAgICAgICAgICAgIF5GYXRhbCBQeXRob24gZXJyb3I6IHtuYW1lfQorICAgICAgICAgICAgXntmYXRhbF9lcnJvcn0KIAotICAgICAgICAgICAge2hlYWRlcn06CisgICAgICAgICAgICB7aGVhZGVyfSBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKToKICAgICAgICAgICAgICAgRmlsZSAiPHN0cmluZz4iLCBsaW5lIHtsaW5lbm99IGluIDxtb2R1bGU+CiAgICAgICAgICAgICAiIiIKICAgICAgICAgcmVnZXggPSBkZWRlbnQocmVnZXguZm9ybWF0KAogICAgICAgICAgICAgbGluZW5vPWxpbmVfbnVtYmVyLAotICAgICAgICAgICAgbmFtZT1uYW1lX3JlZ2V4LAotICAgICAgICAgICAgaGVhZGVyPXJlLmVzY2FwZShoZWFkZXIpKSkuc3RyaXAoKQorICAgICAgICAgICAgZmF0YWxfZXJyb3I9ZmF0YWxfZXJyb3IsCisgICAgICAgICAgICBoZWFkZXI9aGVhZGVyKSkuc3RyaXAoKQogICAgICAgICBpZiBvdGhlcl9yZWdleDoKICAgICAgICAgICAgIHJlZ2V4ICs9ICd8JyArIG90aGVyX3JlZ2V4CiAgICAgICAgIG91dHB1dCwgZXhpdGNvZGUgPSBzZWxmLmdldF9vdXRwdXQoY29kZSwgZmlsZW5hbWU9ZmlsZW5hbWUsIGZkPWZkKQpAQCAtMTA4LDE3ICsxMTAsMzYgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSZWdleChvdXRwdXQsIHJlZ2V4KQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGV4aXRjb2RlLCAwKQogCisgICAgZGVmIGNoZWNrX2ZhdGFsX2Vycm9yKHNlbGYsIGNvZGUsIGxpbmVfbnVtYmVyLCBuYW1lX3JlZ2V4LCAqKmt3KToKKyAgICAgICAgZmF0YWxfZXJyb3IgPSAnRmF0YWwgUHl0aG9uIGVycm9yOiAlcycgJSBuYW1lX3JlZ2V4CisgICAgICAgIHNlbGYuY2hlY2tfZXJyb3IoY29kZSwgbGluZV9udW1iZXIsIGZhdGFsX2Vycm9yLCAqKmt3KQorCisgICAgZGVmIGNoZWNrX3dpbmRvd3NfZXhjZXB0aW9uKHNlbGYsIGNvZGUsIGxpbmVfbnVtYmVyLCBuYW1lX3JlZ2V4LCAqKmt3KToKKyAgICAgICAgZmF0YWxfZXJyb3IgPSAnV2luZG93cyBmYXRhbCBleGNlcHRpb246ICVzJyAlIG5hbWVfcmVnZXgKKyAgICAgICAgc2VsZi5jaGVja19lcnJvcihjb2RlLCBsaW5lX251bWJlciwgZmF0YWxfZXJyb3IsICoqa3cpCisKICAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdhaXgnKSwKICAgICAgICAgICAgICAgICAgICAgICJ0aGUgZmlyc3QgcGFnZSBvZiBtZW1vcnkgaXMgYSBtYXBwZWQgcmVhZC1vbmx5IG9uIEFJWCIpCiAgICAgZGVmIHRlc3RfcmVhZF9udWxsKHNlbGYpOgotICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgotICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgotICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmVuYWJsZSgpCi0gICAgICAgICAgICBmYXVsdGhhbmRsZXIuX3JlYWRfbnVsbCgpCi0gICAgICAgICAgICAiIiIsCi0gICAgICAgICAgICAzLAotICAgICAgICAgICAgIyBJc3N1ZSAjMTI3MDA6IFJlYWQgTlVMTCByYWlzZXMgU0lHSUxMIG9uIE1hYyBPUyBYIExpb24KLSAgICAgICAgICAgICcoPzpTZWdtZW50YXRpb24gZmF1bHR8QnVzIGVycm9yfElsbGVnYWwgaW5zdHJ1Y3Rpb24pJykKKyAgICAgICAgaWYgbm90IE1TX1dJTkRPV1M6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgorICAgICAgICAgICAgICAgIGltcG9ydCBmYXVsdGhhbmRsZXIKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKCkKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuX3JlYWRfbnVsbCgpCisgICAgICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgIyBJc3N1ZSAjMTI3MDA6IFJlYWQgTlVMTCByYWlzZXMgU0lHSUxMIG9uIE1hYyBPUyBYIExpb24KKyAgICAgICAgICAgICAgICAnKD86U2VnbWVudGF0aW9uIGZhdWx0JworICAgICAgICAgICAgICAgICAgICAnfEJ1cyBlcnJvcicKKyAgICAgICAgICAgICAgICAgICAgJ3xJbGxlZ2FsIGluc3RydWN0aW9uKScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3dpbmRvd3NfZXhjZXB0aW9uKCIiIgorICAgICAgICAgICAgICAgIGltcG9ydCBmYXVsdGhhbmRsZXIKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKCkKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXIuX3JlYWRfbnVsbCgpCisgICAgICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgJ2FjY2VzcyB2aW9sYXRpb24nKQogCiAgICAgZGVmIHRlc3Rfc2lnc2VndihzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19mYXRhbF9lcnJvcigiIiIKQEAgLTEyOSw2ICsxNTAsMTcgQEAKICAgICAgICAgICAgIDMsCiAgICAgICAgICAgICAnU2VnbWVudGF0aW9uIGZhdWx0JykKIAorICAgIEB1bml0dGVzdC5za2lwSWYobm90IEhBVkVfVEhSRUFEUywgJ25lZWQgdGhyZWFkcycpCisgICAgZGVmIHRlc3RfZmF0YWxfZXJyb3JfY190aHJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZmF0YWxfZXJyb3IoIiIiCisgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCisgICAgICAgICAgICBmYXVsdGhhbmRsZXIuZW5hYmxlKCkKKyAgICAgICAgICAgIGZhdWx0aGFuZGxlci5fZmF0YWxfZXJyb3JfY190aHJlYWQoKQorICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgMywKKyAgICAgICAgICAgICdpbiBuZXcgdGhyZWFkJywKKyAgICAgICAgICAgIGtub3dfY3VycmVudF90aHJlYWQ9RmFsc2UpCisKICAgICBkZWYgdGVzdF9zaWdhYnJ0KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2ZhdGFsX2Vycm9yKCIiIgogICAgICAgICAgICAgaW1wb3J0IGZhdWx0aGFuZGxlcgpAQCAtNDY1LDcgKzQ5Nyw3IEBACiAgICAgICAgICAgICAgIEZpbGUgIi4qdGhyZWFkaW5nLnB5IiwgbGluZSBbMC05XSsgaW4gX2Jvb3RzdHJhcF9pbm5lcgogICAgICAgICAgICAgICBGaWxlICIuKnRocmVhZGluZy5weSIsIGxpbmUgWzAtOV0rIGluIF9ib290c3RyYXAKIAotICAgICAgICAgICAgQ3VycmVudCB0aHJlYWQgWFhYIFwobW9zdCByZWNlbnQgY2FsbCBmaXJzdFwpOgorICAgICAgICAgICAgQ3VycmVudCB0aHJlYWQgMHhbMC05YS1mXSsgXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6CiAgICAgICAgICAgICAgIEZpbGUgIjxzdHJpbmc+IiwgbGluZSB7bGluZW5vfSBpbiBkdW1wCiAgICAgICAgICAgICAgIEZpbGUgIjxzdHJpbmc+IiwgbGluZSAyOCBpbiA8bW9kdWxlPiQKICAgICAgICAgICAgICIiIgpAQCAtNjM3LDcgKzY2OSw3IEBACiAgICAgICAgIHRyYWNlID0gJ1xuJy5qb2luKHRyYWNlKQogICAgICAgICBpZiBub3QgdW5yZWdpc3RlcjoKICAgICAgICAgICAgIGlmIGFsbF90aHJlYWRzOgotICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ0N1cnJlbnQgdGhyZWFkIFhYWCBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKTpcbicKKyAgICAgICAgICAgICAgICByZWdleCA9ICdDdXJyZW50IHRocmVhZCAweFswLTlhLWZdKyBcKG1vc3QgcmVjZW50IGNhbGwgZmlyc3RcKTpcbicKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcmVnZXggPSAnU3RhY2sgXChtb3N0IHJlY2VudCBjYWxsIGZpcnN0XCk6XG4nCiAgICAgICAgICAgICByZWdleCA9IGV4cGVjdGVkX3RyYWNlYmFjaygxNCwgMzIsIHJlZ2V4KQpAQCAtNjk2LDYgKzcyOCwyMiBAQAogICAgICAgICAgICAgd2l0aCBzZWxmLmNoZWNrX3N0ZGVycl9ub25lKCk6CiAgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLnJlZ2lzdGVyKHNpZ25hbC5TSUdVU1IxKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoTVNfV0lORE9XUywgJ3NwZWNpZmljIHRvIFdpbmRvd3MnKQorICAgIGRlZiB0ZXN0X3JhaXNlX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZm9yIGV4YywgbmFtZSBpbiAoCisgICAgICAgICAgICAoJ0VYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OJywgJ2FjY2VzcyB2aW9sYXRpb24nKSwKKyAgICAgICAgICAgICgnRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTycsICdpbnQgZGl2aWRlIGJ5IHplcm8nKSwKKyAgICAgICAgICAgICgnRVhDRVBUSU9OX1NUQUNLX09WRVJGTE9XJywgJ3N0YWNrIG92ZXJmbG93JyksCisgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3dpbmRvd3NfZXhjZXB0aW9uKGYiIiIKKyAgICAgICAgICAgICAgICBpbXBvcnQgZmF1bHRoYW5kbGVyCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLmVuYWJsZSgpCisgICAgICAgICAgICAgICAgZmF1bHRoYW5kbGVyLl9yYWlzZV9leGNlcHRpb24oZmF1bHRoYW5kbGVyLl97ZXhjfSkKKyAgICAgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICBuYW1lKQorCisKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQppbmRleCA0ZTM5MmI3Li42NWJlMzBmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CkBAIC03LDcgKzcsNyBAQAogaW1wb3J0IGlvCiBpbXBvcnQgX3B5aW8gYXMgcHlpbwogCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBURVNURk4KIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJMaXN0CiAKIGNsYXNzIEF1dG9GaWxlVGVzdHM6CkBAIC0xMzksNyArMTM5LDcgQEAKIAogICAgIGRlZiB0ZXN0TW9kZVN0cmluZ3Moc2VsZik6CiAgICAgICAgICMgY2hlY2sgaW52YWxpZCBtb2RlIHN0cmluZ3MKLSAgICAgICAgZm9yIG1vZGUgaW4gKCIiLCAiYVUiLCAid1UrIik6CisgICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIsICJVKyIsICIrVSIsICJyVSsiKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmID0gc2VsZi5vcGVuKFRFU1RGTiwgbW9kZSkKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weQppbmRleCA3ODRiYzkyLi41NjU2MzNmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weQpAQCAtMjIsOCArMjIsOSBAQAogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTywgU3RyaW5nSU8KIGZyb20gZmlsZWlucHV0IGltcG9ydCBGaWxlSW5wdXQsIGhvb2tfZW5jb2RlZAogCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVEVTVEZOLCBydW5fdW5pdHRlc3QsIGNoZWNrX3dhcm5pbmdzCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVEVTVEZOLCBjaGVja193YXJuaW5ncwogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHVubGluayBhcyBzYWZlX3VubGluaworZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCiAKIApAQCAtOTIsNyArOTMsMTEgQEAKICAgICAgICAgICAgICAgICB0MiA9IHdyaXRlVG1wKDIsIFsiTGluZSAlcyBvZiBmaWxlIDJcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxMCldKQogICAgICAgICAgICAgICAgIHQzID0gd3JpdGVUbXAoMywgWyJMaW5lICVzIG9mIGZpbGUgM1xuIiAlIChpKzEpIGZvciBpIGluIHJhbmdlKDUpXSkKICAgICAgICAgICAgICAgICB0NCA9IHdyaXRlVG1wKDQsIFsiTGluZSAlcyBvZiBmaWxlIDRcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxKV0pCi0gICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCisgICAgICAgICAgICAgICAgaWYgYnM6CisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIHJlbW92ZV90ZW1wZmlsZXModDEsIHQyLCB0MywgdDQpCiAKQEAgLTk0MCw3ICs5NDUsOCBAQAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAgICAgICAgIGVuY29kaW5nID0gb2JqZWN0KCkKLSAgICAgICAgcmVzdWx0ID0gZmlsZWlucHV0Lmhvb2tfZW5jb2RlZChlbmNvZGluZykKKyAgICAgICAgZXJyb3JzID0gb2JqZWN0KCkKKyAgICAgICAgcmVzdWx0ID0gZmlsZWlucHV0Lmhvb2tfZW5jb2RlZChlbmNvZGluZywgZXJyb3JzPWVycm9ycykKIAogICAgICAgICBmYWtlX29wZW4gPSBJbnZvY2F0aW9uUmVjb3JkZXIoKQogICAgICAgICBvcmlnaW5hbF9vcGVuID0gYnVpbHRpbnMub3BlbgpAQCAtOTU4LDggKzk2NCwyNiBAQAogICAgICAgICBzZWxmLmFzc2VydElzKGFyZ3NbMF0sIGZpbGVuYW1lKQogICAgICAgICBzZWxmLmFzc2VydElzKGFyZ3NbMV0sIG1vZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoa3dhcmdzLnBvcCgnZW5jb2RpbmcnKSwgZW5jb2RpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoa3dhcmdzLnBvcCgnZXJyb3JzJyksIGVycm9ycykKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrd2FyZ3MpCiAKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3YicpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGInXHg4MGFiYycpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzYWZlX3VubGluaywgVEVTVEZOKQorCisgICAgICAgIGRlZiBjaGVjayhlcnJvcnMsIGV4cGVjdGVkX2xpbmVzKToKKyAgICAgICAgICAgIHdpdGggRmlsZUlucHV0KGZpbGVzPVRFU1RGTiwgbW9kZT0ncicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuaG9vaz1ob29rX2VuY29kZWQoJ3V0Zi04JywgZXJyb3JzPWVycm9ycykpIGFzIGZpOgorICAgICAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIGV4cGVjdGVkX2xpbmVzKQorCisgICAgICAgIGNoZWNrKCdpZ25vcmUnLCBbJ2FiYyddKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgICAgICAgICBjaGVjaygnc3RyaWN0JywgWydhYmMnXSkKKyAgICAgICAgY2hlY2soJ3JlcGxhY2UnLCBbJ1x1ZmZmZGFiYyddKQorICAgICAgICBjaGVjaygnYmFja3NsYXNocmVwbGFjZScsIFsnXFx4ODBhYmMnXSkKKwogICAgIGRlZiB0ZXN0X21vZGVzKHNlbGYpOgogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAnd2InKSBhcyBmOgogICAgICAgICAgICAgIyBVVEYtNyBpcyBhIGNvbnZlbmllbnQsIHNlbGRvbSB1c2VkIGVuY29kaW5nCkBAIC05ODEsNSArMTAwNSwxMSBAQAogICAgICAgICAgICAgY2hlY2soJ3JiJywgWydBXG4nLCAnQlxyXG4nLCAnQ1xyJywgJ0RcdTIwYWMnXSkKIAogCitjbGFzcyBNaXNjVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZpbGVpbnB1dCkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mbG9hdC5weSBiL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkKaW5kZXggY2IxZjZkYi4uNjhiMjEyZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mbG9hdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5CkBAIC0xLDYgKzEsNSBAQAogCiBpbXBvcnQgZnJhY3Rpb25zCi1pbXBvcnQgbWF0aAogaW1wb3J0IG9wZXJhdG9yCiBpbXBvcnQgb3MKIGltcG9ydCByYW5kb20KQEAgLTE2MiwxMSArMTYxLDEyIEBACiAgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgogICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChzdHIoc2VsZikpICsgMQogCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vMSgpKSwgNDIuKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvbzIoKSksIDQyLikKLSAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb28zKDIxKSksIDQyLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChGb28xKCkpLCA0Mi4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRm9vMigpKSwgNDIuKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRm9vMygyMSkpLCA0Mi4pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmxvYXQsIEZvbzQoNDIpKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvb1N0cignOCcpKSwgOS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRm9vU3RyKCc4JykpLCA5LikKIAogICAgICAgICBjbGFzcyBGb281OgogICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKQEAgLTE3NywxMCArMTc3LDE0IEBACiAgICAgICAgIGNsYXNzIEY6CiAgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgogICAgICAgICAgICAgICAgIHJldHVybiBPdGhlckZsb2F0U3ViY2xhc3MoNDIuKQotICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEYoKSksIDQyLikKLSAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGZsb2F0KEYoKSkpLCBPdGhlckZsb2F0U3ViY2xhc3MpCi0gICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoRmxvYXRTdWJjbGFzcyhGKCkpLCA0Mi4pCi0gICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShGbG9hdFN1YmNsYXNzKEYoKSkpLCBGbG9hdFN1YmNsYXNzKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRigpKSwgNDIuKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShmbG9hdChGKCkpKSwgZmxvYXQpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGbG9hdFN1YmNsYXNzKEYoKSksIDQyLikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoRmxvYXRTdWJjbGFzcyhGKCkpKSwgRmxvYXRTdWJjbGFzcykKIAogICAgIGRlZiB0ZXN0X2lzX2ludGVnZXIoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKDEuMSkuaXNfaW50ZWdlcigpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mb3JtYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQppbmRleCA5YjEzNjMyLi44YWZkNWI4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Zvcm1hdC5weQpAQCAtMjc0LDcgKzI3NCw3IEBACiAgICAgICAgIHRlc3RfZXhjKCclZCcsICcxJywgVHlwZUVycm9yLCAiJWQgZm9ybWF0OiBhIG51bWJlciBpcyByZXF1aXJlZCwgbm90IHN0ciIpCiAgICAgICAgIHRlc3RfZXhjKCcleCcsICcxJywgVHlwZUVycm9yLCAiJXggZm9ybWF0OiBhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBub3Qgc3RyIikKICAgICAgICAgdGVzdF9leGMoJyV4JywgMy4xNCwgVHlwZUVycm9yLCAiJXggZm9ybWF0OiBhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkLCBub3QgZmxvYXQiKQotICAgICAgICB0ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgImEgZmxvYXQgaXMgcmVxdWlyZWQiKQorICAgICAgICB0ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgIm11c3QgYmUgcmVhbCBudW1iZXIsIG5vdCBzdHIiKQogICAgICAgICB0ZXN0X2V4Yygnbm8gZm9ybWF0JywgJzEnLCBUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIikKICAgICAgICAgdGVzdF9leGMoJyVjJywgLTEsIE92ZXJmbG93RXJyb3IsICIlYyBhcmcgbm90IGluIHJhbmdlKDB4MTEwMDAwKSIpCkBAIC0zMDAsNiArMzAwLDggQEAKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgNywgYiJceDA3IikKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgYiJaIiwgYiJaIikKICAgICAgICAgdGVzdGNvbW1vbihiIiVjIiwgYnl0ZWFycmF5KGIiWiIpLCBiIloiKQorICAgICAgICB0ZXN0Y29tbW9uKGIiJTVjIiwgNjUsIGIiICAgIEEiKQorICAgICAgICB0ZXN0Y29tbW9uKGIiJS01YyIsIDY1LCBiIkEgICAgIikKICAgICAgICAgIyAlYiB3aWxsIGluc2VydCBhIHNlcmllcyBvZiBieXRlcywgZWl0aGVyIGZyb20gYSB0eXBlIHRoYXQgc3VwcG9ydHMKICAgICAgICAgIyB0aGUgUHlfYnVmZmVyIHByb3RvY29sLCBvciBzb21ldGhpbmcgdGhhdCBoYXMgYSBfX2J5dGVzX18gbWV0aG9kCiAgICAgICAgIGNsYXNzIEZha2VCeXRlcyhvYmplY3QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mcmFjdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQppbmRleCAxNjk5ODUyLi43M2QyZGQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQpAQCAtMjYzLDEzICsyNjMsMTMgQEAKICAgICAgICAgbmFuID0gaW5mIC0gaW5mCiAgICAgICAgICMgYnVnIDE2NDY5OiBlcnJvciB0eXBlcyBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIGZsb2F0IC0+IGludAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCi0gICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiQ2Fubm90IGNvbnZlcnQgaW5mIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZmxvYXQsIGluZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IC1pbmYgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgLWluZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgVmFsdWVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IG5hbiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgVmFsdWVFcnJvciwgImNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgbmFuKQogCiAgICAgZGVmIHRlc3RGcm9tRGVjaW1hbChzZWxmKToKQEAgLTI4NCwxNiArMjg0LDE2IEBACiAKICAgICAgICAgIyBidWcgMTY0Njk6IGVycm9yIHR5cGVzIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggZGVjaW1hbCAtPiBpbnQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAotICAgICAgICAgICAgT3ZlcmZsb3dFcnJvciwgIkNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBPdmVyZmxvd0Vycm9yLCAiY2Fubm90IGNvbnZlcnQgSW5maW5pdHkgdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgiaW5mIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJDYW5ub3QgY29udmVydCAtSW5maW5pdHkgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIE92ZXJmbG93RXJyb3IsICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIiwKICAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCItaW5mIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIFZhbHVlRXJyb3IsICJDYW5ub3QgY29udmVydCBOYU4gdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJjYW5ub3QgY29udmVydCBOYU4gdG8gaW50ZWdlciByYXRpbyIsCiAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgibmFuIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKLSAgICAgICAgICAgIFZhbHVlRXJyb3IsICJDYW5ub3QgY29udmVydCBzTmFOIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iLAogICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoInNuYW4iKSkKIAogICAgIGRlZiB0ZXN0TGltaXREZW5vbWluYXRvcihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnN0cmluZy5weSBiL0xpYi90ZXN0L3Rlc3RfZnN0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJkZWRmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF9mc3RyaW5nLnB5CkBAIC0wLDAgKzEsNzQ1IEBACitpbXBvcnQgYXN0CitpbXBvcnQgdHlwZXMKK2ltcG9ydCBkZWNpbWFsCitpbXBvcnQgdW5pdHRlc3QKKworYV9nbG9iYWwgPSAnZ2xvYmFsIHZhcmlhYmxlJworCisjIFlvdSBjb3VsZCBhcmd1ZSB0aGF0IEknbSB0b28gc3RyaWN0IGluIGxvb2tpbmcgZm9yIHNwZWNpZmljIGVycm9yCisjICB2YWx1ZXMgd2l0aCBhc3NlcnRSYWlzZXNSZWdleCwgYnV0IHdpdGhvdXQgaXQgaXQncyB3YXkgdG9vIGVhc3kgdG8KKyMgIG1ha2UgYSBzeW50YXggZXJyb3IgaW4gdGhlIHRlc3Qgc3RyaW5ncy4gRXNwZWNpYWxseSB3aXRoIGFsbCBvZiB0aGUKKyMgIHRyaXBsZSBxdW90ZXMsIHJhdyBzdHJpbmdzLCBiYWNrc2xhc2hlcywgZXRjLiBJIHRoaW5rIGl0J3MgYQorIyAgd29ydGh3aGlsZSB0cmFkZW9mZi4gV2hlbiBJIHN3aXRjaGVkIHRvIHRoaXMgbWV0aG9kLCBJIGZvdW5kIG1hbnkKKyMgIGV4YW1wbGVzIHdoZXJlIEkgd2Fzbid0IHRlc3Rpbmcgd2hhdCBJIHRob3VnaHQgSSB3YXMuCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0QWxsUmFpc2Uoc2VsZiwgZXhjZXB0aW9uX3R5cGUsIHJlZ2V4LCBlcnJvcl9zdHJpbmdzKToKKyAgICAgICAgZm9yIHN0ciBpbiBlcnJvcl9zdHJpbmdzOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qoc3RyPXN0cik6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KGV4Y2VwdGlvbl90eXBlLCByZWdleCk6CisgICAgICAgICAgICAgICAgICAgIGV2YWwoc3RyKQorCisgICAgZGVmIHRlc3RfX2Zvcm1hdF9fbG9va3VwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBfX2Zvcm1hdF9fIGlzIGxvb2tlZCB1cCBvbiB0aGUgdHlwZSwgbm90IHRoZSBpbnN0YW5jZS4KKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiAnY2xhc3MnCisKKyAgICAgICAgeCA9IFgoKQorCisgICAgICAgICMgQWRkIGEgYm91bmQgX19mb3JtYXRfXyBtZXRob2QgdG8gdGhlICd5JyBpbnN0YW5jZSwgYnV0IG5vdAorICAgICAgICAjICB0aGUgJ3gnIGluc3RhbmNlLgorICAgICAgICB5ID0gWCgpCisgICAgICAgIHkuX19mb3JtYXRfXyA9IHR5cGVzLk1ldGhvZFR5cGUobGFtYmRhIHNlbGYsIHNwZWM6ICdpbnN0YW5jZScsIHkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t5fScsIGZvcm1hdCh5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t5fScsICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHgpLCBmb3JtYXQoeSkpCisKKyAgICAgICAgIyBfX2Zvcm1hdF9fIGlzIG5vdCBjYWxsZWQgdGhpcyB3YXksIGJ1dCBzdGlsbCBtYWtlIHN1cmUgaXQKKyAgICAgICAgIyAgcmV0dXJucyB3aGF0IHdlIGV4cGVjdCAoc28gd2UgY2FuIG1ha2Ugc3VyZSB3ZSdyZSBieXBhc3NpbmcKKyAgICAgICAgIyAgaXQpLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19mb3JtYXRfXygnJyksICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fX2Zvcm1hdF9fKCcnKSwgJ2luc3RhbmNlJykKKworICAgICAgICAjIFRoaXMgaXMgaG93IF9fZm9ybWF0X18gaXMgYWN0dWFsbHkgY2FsbGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeCkuX19mb3JtYXRfXyh4LCAnJyksICdjbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh5KS5fX2Zvcm1hdF9fKHksICcnKSwgJ2NsYXNzJykKKworICAgIGRlZiB0ZXN0X2FzdChzZWxmKToKKyAgICAgICAgIyBJbnNwaXJlZCBieSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjQ5NzUKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcmV0dXJuIDQKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBleHByID0gIiIiCithID0gMTAKK2Yne2EgKiB4KCl9JyIiIgorICAgICAgICB0ID0gYXN0LnBhcnNlKGV4cHIpCisgICAgICAgIGMgPSBjb21waWxlKHQsICcnLCAnZXhlYycpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgeCB3YXMgbm90IGNhbGxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4LmNhbGxlZCkKKworICAgICAgICAjIEFjdHVhbGx5IHJ1biB0aGUgY29kZS4KKyAgICAgICAgZXhlYyhjKQorCisgICAgICAgICMgTWFrZSBzdXJlIHggd2FzIGNhbGxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguY2FsbGVkKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbF9ldmFsKHNlbGYpOgorICAgICAgICAjIFdpdGggbm8gZXhwcmVzc2lvbnMsIGFuIGYtc3RyaW5nIGlzIG9rYXkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgiZid4JyIpLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgiZid4JyAneSciKSwgJ3h5JykKKworICAgICAgICAjIEJ1dCB0aGlzIHNob3VsZCByYWlzZSBhbiBlcnJvci4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmcnKToKKyAgICAgICAgICAgIGFzdC5saXRlcmFsX2V2YWwoImYneHszfSciKQorCisgICAgICAgICMgQXMgc2hvdWxkIHRoaXMsIHdoaWNoIHVzZXMgYSBkaWZmZXJlbnQgYXN0IG5vZGUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICdtYWxmb3JtZWQgbm9kZSBvciBzdHJpbmcnKToKKyAgICAgICAgICAgIGFzdC5saXRlcmFsX2V2YWwoImYnezN9JyIpCisKKyAgICBkZWYgdGVzdF9hc3RfY29tcGlsZV90aW1lX2NvbmNhdChzZWxmKToKKyAgICAgICAgeCA9IFsnJ10KKworICAgICAgICBleHByID0gIiIieFswXSA9ICdmb28nIGYnezN9JyIiIgorICAgICAgICB0ID0gYXN0LnBhcnNlKGV4cHIpCisgICAgICAgIGMgPSBjb21waWxlKHQsICcnLCAnZXhlYycpCisgICAgICAgIGV4ZWMoYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzBdLCAnZm9vMycpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhJywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnICcsICcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1xOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1xOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdcdTAzOTQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnXE57VHJ1ZX0nLCAnXHUyMmE4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZidcTntUcnVlfScsIHInXE5UcnVlJykKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9vcmRlcihzZWxmKToKKyAgICAgICAgIyBub3RlIHRoYXQgaGV4KG9yZCgneycpKSA9PSAweDdiLCBzbyB0aGlzCisgICAgICAgICMgIHN0cmluZyBiZWNvbWVzIGYnYXs0KjEwfWInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhXHUwMDdiNCoxMH1iJywgJ2E0MGInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYVx4N2I0KjEwfWInLCAnYTQwYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhXHg3YjQqMTBcTntSSUdIVCBDVVJMWSBCUkFDS0VUfWInLCAnYTQwYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ImEiIVxOe0xBVElOIFNNQUxMIExFVFRFUiBSfX0nLCAiJ2EnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMFx4M2EwMlh9JywgJzBBJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMDowMlxOe0xBVElOIENBUElUQUwgTEVUVEVSIFh9fScsICcwQScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciIiImYnYXtcdTAwN2I0KjEwfWInIiIiLCAgICAjIG1pcy1tYXRjaGVkIGJyYWNrZXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd1bmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciBsaW5lIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIiIiZid7ImEiXCFyfSciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiIiJmJ3thXCFyfSciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF91bnRlcm1pbmF0ZWRfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIiIiZid7IngnIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIiIiZid7Inh9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIiImYneygieCciIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiIiJmJ3soInh9JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X21pc21hdGNoZWRfcGFyZW5zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IG1pc21hdGNoZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7KCh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9kb3VibGVfYnJhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3snLCAneycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhe3snLCAnYXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3tiJywgJ3tiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2F7e2InLCAnYXtiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319JywgJ30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnYX19JywgJ2F9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319YicsICd9YicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidhfX1iJywgJ2F9YicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t7ezEwfScsICd7MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnfX17MTB9JywgJ30xMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid9fXt7ezEwfScsICd9ezEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ319YXt7ezEwfScsICd9YXsxMCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH17eycsICcxMHsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwfX19JywgJzEwfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MTB9fX17eycsICcxMH17JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMH19fWF7eycgJ30nLCAnMTB9YXt9JykKKworICAgICAgICAjIEluc2lkZSBvZiBzdHJpbmdzLCBkb24ndCBpbnRlcnByZXQgZG91YmxlZCBicmFja2V0cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sie3t9fSJ9JywgJ3t7fX0nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoVHlwZUVycm9yLCAndW5oYXNoYWJsZSB0eXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYneyB7e319IH0nIiwgIyBkaWN0IGluIGEgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jb21waWxlX3RpbWVfY29uY2F0KHNlbGYpOgorICAgICAgICB4ID0gJ2RlZicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJyBmJyMjIHt4fWdoaScsICdhYmMjIyBkZWZnaGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnIGYne3h9JyAnZ2hpJywgJ2FiY2RlZmdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiYycgZid7eH0nICdnaCcgZidpe3g6NH0nLCAnYWJjZGVmZ2hpZGVmICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t4fScgZid7eH0nLCAne3h9ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3gnIGYne3h9JywgJ3t4ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3h9JyBmJ3t4fScsICd7eH1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e3h9fScgZid7eH0nLCAne3t4fX1kZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e3gnIGYne3h9JywgJ3t7eGRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3h9fScgZid7eH0nLCAneH19ZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScgJ3h9fScsICdkZWZ4fX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAnJywgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZid7eH0nICcnLCAnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJ3t4fScsICdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9JyAnMicsICdkZWYyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMScgZid7eH0nICcyJywgJzFkZWYyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMScgZid7eH0nLCAnMWRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eH0nIGYnLXt4fScsICdkZWYtZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGYnJyAnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgZicnICcnIGYnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZicnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycgJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJyBmJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnJyAnJyBmJycgJycsICcnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwZWN0aW5nICd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szJyBmJ30nIiwgICMgY2FuJ3QgY29uY2F0IHRvIGdldCBhIHZhbGlkIGYtc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgIyBUaGVzZSBhcmVuJ3QgY29tbWVudHMsIHNpbmNlIHRoZXkncmUgaW4gc3RyaW5ncy4KKyAgICAgICAgZCA9IHsnIyc6ICdoYXNoJ30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIyJ9JywgJyMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbIiMiXX0nLCAnaGFzaCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nIGNhbm5vdCBpbmNsdWRlICcjJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3sxI30nIiwgICAjIGVycm9yIGJlY2F1c2UgdGhlIGV4cHJlc3Npb24gYmVjb21lcyAiKDEjKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMoIyl9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9tYW55X2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSBhIHN0cmluZyB3aXRoIG1hbnkgZXhwcmVzc2lvbnMgaW4gaXQuIE5vdGUgdGhhdAorICAgICAgICAjICBiZWNhdXNlIHdlIGhhdmUgYSBzcGFjZSBpbiBoZXJlIGFzIGEgbGl0ZXJhbCwgd2UncmUgYWN0dWFsbHkKKyAgICAgICAgIyAgZ29pbmcgdG8gdXNlIHR3aWNlIGFzIG1hbnkgYXN0IG5vZGVzOiBvbmUgZm9yIGVhY2ggbGl0ZXJhbAorICAgICAgICAjICBwbHVzIG9uZSBmb3IgZWFjaCBleHByZXNzaW9uLgorICAgICAgICBkZWYgYnVpbGRfZnN0cihuLCBleHRyYT0nJyk6CisgICAgICAgICAgICByZXR1cm4gImYnIiArICgne3h9ICcgKiBuKSArIGV4dHJhICsgIiciCisKKyAgICAgICAgeCA9ICdYJworICAgICAgICB3aWR0aCA9IDEKKworICAgICAgICAjIFRlc3QgYXJvdW5kIDI1Ni4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjUwLCAyNjApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGJ1aWxkX2ZzdHIoaSkpLCAoeCsnICcpKmkpCisKKyAgICAgICAgIyBUZXN0IGNvbmNhdGVuYXRpbmcgMiBsYXJncyBmc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGJ1aWxkX2ZzdHIoMjU1KSoyNTYpLCAoeCsnICcpKigyNTUqMjU2KSkKKworICAgICAgICBzID0gYnVpbGRfZnN0cigyNTMsICd7eDp7d2lkdGh9fSAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwocyksICh4KycgJykqMjU0KQorCisgICAgICAgICMgVGVzdCBsb3RzIG9mIGV4cHJlc3Npb25zIGFuZCBjb25zdGFudHMsIGNvbmNhdGVuYXRlZC4KKyAgICAgICAgcyA9ICJmJ3sxfScgJ3gnICd5JyIgKiAxMDI0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChzKSwgJzF4eScgKiAxMDI0KQorCisgICAgZGVmIHRlc3RfZm9ybWF0X3NwZWNpZmllcl9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgd2lkdGggPSAxMAorICAgICAgICBwcmVjaXNpb24gPSA0CisgICAgICAgIHZhbHVlID0gZGVjaW1hbC5EZWNpbWFsKCcxMi4zNDU2NycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7d2lkdGh9LntwcmVjaXNpb259fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6e3dpZHRoIXJ9LntwcmVjaXNpb259fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6e3dpZHRoOjB9LntwcmVjaXNpb246MX19JywgJ3Jlc3VsdDogICAgICAxMi4zNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidyZXN1bHQ6IHt2YWx1ZTp7MX17MDowfS57cHJlY2lzaW9uOjF9fScsICdyZXN1bHQ6ICAgICAgMTIuMzUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYncmVzdWx0OiB7dmFsdWU6eyAxfXsgMDowfS57IHByZWNpc2lvbjoxfX0nLCAncmVzdWx0OiAgICAgIDEyLjM1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sxMDojezF9MHh9JywgJyAgICAgICAweGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOnsiIyJ9MXswfXsieCJ9fScsICcgICAgICAgMHhhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3stMTA6LXsiIyJ9MXswfXh9JywgJyAgICAgIC0weGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYney0xMDp7Ii0ifSN7MX0weyJ4In19JywgJyAgICAgIC0weGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezEwOiN7MyAhPSB7NDo1fSBhbmQgd2lkdGh9eH0nLCAnICAgICAgIDB4YScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBleHBlY3RpbmcgJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIiIiZid7InMiIXJ7IjoxMCJ9fSciIiIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGxvb2tzIGxpa2UgYSBuZXN0ZWQgZm9ybWF0IHNwZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImludmFsaWQgc3ludGF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIyBJbnZhbGlkIHN5dGF4IGluc2lkZSBhIG5lc3RlZCBzcGVjLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7NDp7LzV9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICJmLXN0cmluZzogZXhwcmVzc2lvbnMgbmVzdGVkIHRvbyBkZWVwbHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsjIENhbid0IG5lc3QgZm9ybWF0IHNwZWNpZmllcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3Jlc3VsdDoge3ZhbHVlOnt3aWR0aDp7MH19LntwcmVjaXNpb246MX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2Ytc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIyBObyBleHBhbnNpb24gaW5zaWRlIGNvbnZlcnNpb24gb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIHRoZSA6IG9yICEgaXRzZWxmLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJmJ3sicyIheyJyIn19JyIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3NpZGVfZWZmZWN0X29yZGVyKHNlbGYpOgorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLmkpCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne3h9IHt4fScsICcxIDInKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19leHByZXNzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IH0nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZicge30gJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shcn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAhcn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezEwOnsgfX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnIHsgfSAnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3tcbn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3tcbiBcbn0nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENhdGNoIHRoZSBlbXB0eSBleHByZXNzaW9uIGJlZm9yZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgaW52YWxpZCBjb252ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3sgIXhyfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXg6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7IXg6YX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyAheHI6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7ICF4cjphfSciLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7On0nIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdlIGZpbmQgdGhlIGVtcHR5IGV4cHJlc3Npb24gYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBtaXNzaW5nIGNsb3NpbmcgYnJhY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3shczonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezonIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezp4JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9wYXJlbnNfaW5fZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Myx9JywgJygzLCknKQorCisgICAgICAgICMgQWRkIHRoZXNlIGJlY2F1c2Ugd2hlbiBhbiBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgcGFyZW5zCisgICAgICAgICMgIGFyZSBhZGRlZCBhcm91bmQgaXQuIEJ1dCB3ZSBzaG91bGRuJ3QgZ28gZnJvbSBhbiBpbnZhbGlkCisgICAgICAgICMgIGV4cHJlc3Npb24gdG8gYSB2YWxpZCBvbmUuIFRoZSBhZGRlZCBwYXJlbnMgYXJlIGp1c3QKKyAgICAgICAgIyAgc3VwcG9zZWQgdG8gYWxsb3cgd2hpdGVzcGFjZSAoaW5jbHVkaW5nIG5ld2xpbmVzKS4KKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYneyx9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3ssfSciLCAgIyB0aGlzIGlzICgsKSwgd2hpY2ggaXMgYW4gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7MykrKDR9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ0VPTCB3aGlsZSBzY2FubmluZyBzdHJpbmcgbGl0ZXJhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3tcbn0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X25ld2xpbmVzX2luX2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezB9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezBcbn0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MFxyfScsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tcbjBcbn0nLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7XHIwXHJ9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1xuMFxyfScsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tcbjB9JywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMrXG40fScsICc3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szK1xcXG40fScsICc3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZicnJ3szKworNH0nJycsICc3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycnezMrXAorNH0nJycsICc3JykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IGVtcHR5IGV4cHJlc3Npb24gbm90IGFsbG93ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyImYne1xufSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbGFtYmRhKHNlbGYpOgorICAgICAgICB4ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyhsYW1iZGEgeTp4KnkpKCI4Iikhcn0nLCAiJzg4ODg4JyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7KGxhbWJkYSB5OngqeSkoIjgiKSFyOjEwfScsICInODg4ODgnICAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sobGFtYmRhIHk6eCp5KSgiOCIpOjEwfScsICI4ODg4OCAgICAgIikKKworICAgICAgICAjIGxhbWJkYSBkb2Vzbid0IHdvcmsgd2l0aG91dCBwYXJlbnMsIGJlY2F1c2UgdGhlIGNvbG9uCisgICAgICAgICMgIG1ha2VzIHRoZSBwYXJzZXIgdGhpbmsgaXQncyBhIGZvcm1hdF9zcGVjCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICd1bmV4cGVjdGVkIEVPRiB3aGlsZSBwYXJzaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne2xhbWJkYSB4Onh9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF95aWVsZChzZWxmKToKKyAgICAgICAgIyBOb3QgdGVycmlibHkgdXNlZnVsLCBidXQgbWFrZSBzdXJlIHRoZSB5aWVsZCB0dXJucworICAgICAgICAjICBhIGZ1bmN0aW9uIGludG8gYSBnZW5lcmF0b3IKKyAgICAgICAgZGVmIGZuKHkpOgorICAgICAgICAgICAgZid5Ont5aWVsZCB5KjJ9JworCisgICAgICAgIGcgPSBmbig0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoZyksIDgpCisKKyAgICBkZWYgdGVzdF95aWVsZF9zZW5kKHNlbGYpOgorICAgICAgICBkZWYgZm4oeCk6CisgICAgICAgICAgICB5aWVsZCBmJ3g6e3lpZWxkIChsYW1iZGEgaTogeCAqIGkpfScKKworICAgICAgICBnID0gZm4oMTApCisgICAgICAgIHRoZV9sYW1iZGEgPSBuZXh0KGcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhlX2xhbWJkYSg0KSwgNDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5zZW5kKCdzdHJpbmcnKSwgJ3g6c3RyaW5nJykKKworICAgIGRlZiB0ZXN0X2V4cHJlc3Npb25zX3dpdGhfdHJpcGxlX3F1b3RlZF9zdHJpbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYieycnJ3gnJyd9IiwgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYieycnJ2VyaWMncycnJ30iLCAiZXJpYydzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJlcmljXCdzIiIifScsICJlcmljJ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYieycnJ2VyaWNcInMnJyd9IiwgJ2VyaWMicycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IiIiZXJpYyJzIiIifScsICdlcmljInMnKQorCisgICAgICAgICMgVGVzdCBjb25jYXRlbmF0aW9uIHdpdGhpbiBhbiBleHByZXNzaW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7IngiICIiImVyaWMicyIiIiAieSJ9JywgJ3hlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sieCIgIiIiZXJpYyJzIiIifScsICd4ZXJpYyJzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJlcmljInMiIiIgInkifScsICdlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJ4IiIiICIiImVyaWMicyIiIiAieSJ9JywgJ3hlcmljInN5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siIiJ4IiIiICIiImVyaWMicyIiIiAiIiJ5IiIifScsICd4ZXJpYyJzeScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ciIiIngiIiIgIiIiZXJpYyJzIiIiICIiInkiIiJ9JywgJ3hlcmljInN5JykKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX3ZhcnMoc2VsZik6CisgICAgICAgIHggPSA5OAorICAgICAgICB5ID0gJ2FiYycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fXt5fScsICc5OGFiYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ1h7eH17eX0nLCAnWDk4YWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fVh7eX0nLCAnOThYYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fXt5fVgnLCAnOThhYmNYJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnWHt4fVl7eX0nLCAnWDk4WWFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9e3l9WScsICdYOThhYmNZJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fVh7eX1ZJywgJzk4WGFiY1knKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidYe3h9WXt5fVonLCAnWDk4WWFiY1onKQorCisgICAgZGVmIHRlc3RfY2xvc3VyZShzZWxmKToKKyAgICAgICAgZGVmIG91dGVyKHgpOgorICAgICAgICAgICAgZGVmIGlubmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGYneDp7eH0nCisgICAgICAgICAgICByZXR1cm4gaW5uZXIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyKCc5ODcnKSgpLCAneDo5ODcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyKDcpKCksICd4OjcnKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICB5ID0gMgorICAgICAgICBkZWYgZih4LCB3aWR0aCk6CisgICAgICAgICAgICByZXR1cm4gZid4PXt4Knk6e3dpZHRofX0nCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKCdmb28nLCAxMCksICd4PWZvb2ZvbyAgICAnKQorICAgICAgICB4ID0gJ2JhcicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDEwLCAxMCksICd4PSAgICAgICAgMjAnKQorCisgICAgZGVmIHRlc3RfbG9jYWxzKHNlbGYpOgorICAgICAgICB2YWx1ZSA9IDEyMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYndjp7dmFsdWV9JywgJ3Y6MTIzJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfdmFyaWFibGUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yKToKKyAgICAgICAgICAgIGYndjp7dmFsdWV9JworCisgICAgZGVmIHRlc3RfbWlzc2luZ19mb3JtYXRfc3BlYyhzZWxmKToKKyAgICAgICAgY2xhc3MgTzoKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzcGVjOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyonCisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne08oKTp4fScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tPKCl9JywgJyonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne08oKTp9JywgJyonKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7Mzp9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMhczp9JywgJzMnKQorCisgICAgZGVmIHRlc3RfZ2xvYmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9JywgJ2c6Z2xvYmFsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywgImc6J2dsb2JhbCB2YXJpYWJsZSciKQorCisgICAgICAgIGFfbG9jYWwgPSAnbG9jYWwgdmFyaWFibGUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdnOmdsb2JhbCB2YXJpYWJsZSBsOmxvY2FsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzonZ2xvYmFsIHZhcmlhYmxlJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZidnOnthX2dsb2JhbH0gbDp7YV9sb2NhbCFyfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgImc6Z2xvYmFsIHZhcmlhYmxlIGw6J2xvY2FsIHZhcmlhYmxlJyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigibW9kdWxlICd1bml0dGVzdCcgZnJvbSIsIGYne3VuaXR0ZXN0fScpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dlZF9nbG9iYWwoc2VsZik6CisgICAgICAgIGFfZ2xvYmFsID0gJ3JlYWxseSBhIGxvY2FsJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9JywgJ2c6cmVhbGx5IGEgbG9jYWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWwhcn0nLCAiZzoncmVhbGx5IGEgbG9jYWwnIikKKworICAgICAgICBhX2xvY2FsID0gJ2xvY2FsIHZhcmlhYmxlJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZzp7YV9nbG9iYWx9IGw6e2FfbG9jYWx9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZzpyZWFsbHkgYSBsb2NhbCBsOmxvY2FsIHZhcmlhYmxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzoncmVhbGx5IGEgbG9jYWwnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2c6e2FfZ2xvYmFsfSBsOnthX2xvY2FsIXJ9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZzpyZWFsbHkgYSBsb2NhbCBsOidsb2NhbCB2YXJpYWJsZSciKQorCisgICAgZGVmIHRlc3RfY2FsbChzZWxmKToKKyAgICAgICAgZGVmIGZvbyh4KToKKyAgICAgICAgICAgIHJldHVybiAneD0nICsgc3RyKHgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmb28oMTApfScsICd4PTEwJykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9mc3RyaW5ncyhzZWxmKToKKyAgICAgICAgeSA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmInswfSIqM30nLCAnMDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmInt5fSIqM30nLCAnNTU1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tmIntcJ3hcJ30iKjN9JywgJ3h4eCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntyJ3gnIGYne1wic1wifSd9IiwgJ3hzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntyJ3gncmYne1wic1wifSd9IiwgJ3hzJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfc3RyaW5nX3ByZWZpeGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAndW5leHBlY3RlZCBFT0Ygd2hpbGUgcGFyc2luZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmdScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmVScnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidUYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1ZnInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdXInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZnUnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydWYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGVVInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdXInJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9sZWFkaW5nX3RyYWlsaW5nX3NwYWNlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sgM30nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7ICAzfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tcdDN9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne1x0XHQzfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szIH0nLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyAgfScsICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szXHR9JywgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezNcdFx0fScsICczJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnZXhwcj17IHt4OiB5IGZvciB4LCB5IGluIFsoMSwgMiksIF19fScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cHI9ezE6IDJ9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ2V4cHI9eyB7eDogeSBmb3IgeCwgeSBpbiBbKDEsIDIpLCBdfSB9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcj17MTogMn0nKQorCisgICAgZGVmIHRlc3RfY2hhcmFjdGVyX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7NH1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX17M30nLAorICAgICAgICAgICAgICAgICAgICAgICAgICc0XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7e319XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9ezN9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAne31cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0zJykKKworICAgIGRlZiB0ZXN0X25vdF9lcXVhbChzZWxmKToKKyAgICAgICAgIyBUaGVyZSdzIGEgc3BlY2lhbCB0ZXN0IGZvciB0aGlzIGJlY2F1c2UgdGhlcmUncyBhIHNwZWNpYWwKKyAgICAgICAgIyAgY2FzZSBpbiB0aGUgZi1zdHJpbmcgcGFyc2VyIHRvIGxvb2sgZm9yICE9IGFzIG5vdCBlbmRpbmcgYW4KKyAgICAgICAgIyAgZXhwcmVzc2lvbi4gTm9ybWFsbHkgaXQgd291bGQsIHdoaWxlIGxvb2tpbmcgZm9yICFzIG9yICFyLgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NH0nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NDp9JywgJ1RydWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMhPTQhc30nLCAnVHJ1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7MyE9NCFzOi4zfScsICdUcnUnKQorCisgICAgZGVmIHRlc3RfY29udmVyc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNDoxMC4xMH0nLCAnICAgICAgMy4xNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNCFzOjEwLjEwfScsICczLjE0ICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3szLjE0IXI6MTAuMTB9JywgJzMuMTQgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezMuMTQhYToxMC4xMH0nLCAnMy4xNCAgICAgICcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siYSJ9JywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIiFyfScsICInYSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJhIiFhfScsICInYSciKQorCisgICAgICAgICMgTm90IGEgY29udmVyc2lvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siYSFyIn0nLCAiYSFyIikKKworICAgICAgICAjIE5vdCBhIGNvbnZlcnNpb24sIGJ1dCBzaG93IHRoYXQgISBpcyBhbGxvd2VkIGluIGEgZm9ybWF0IHNwZWMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7My4xNDohPDEwLjEwfScsICczLjE0ISEhISEhJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0ifScsICdcdTAzOTQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYneyJcTntHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQX0iIXJ9JywgIidcdTAzOTQnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siXE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEF9IiFhfScsICInXFx1MDM5NCciKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdmLXN0cmluZzogaW52YWxpZCBjb252ZXJzaW9uIGNoYXJhY3RlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJmJ3szIWd9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIUF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szISF9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szITp9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBfX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhIHN9JyIsICAjIG5vIHNwYWNlIGJlZm9yZSBjb252ZXJzaW9uIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3ghXFx4MDA6LjwxMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7eCFze3l9fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzc30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhc3M6fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzczpzfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYXNzaWdubWVudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYnJyA9IDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MH0nID0geCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3t4fScgPSB4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2RlbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgJ2ludmFsaWQgc3ludGF4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImRlbCBmJyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsICcnIGYnJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9taXNtYXRjaGVkX2JyYWNlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShTeW50YXhFcnJvciwgImYtc3RyaW5nOiBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImYne3t9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3t7fX19JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ30nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneH14JyIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYW4ndCBoYXZlIHsgb3IgfSBpbiBhIGZvcm1hdCBzcGVjLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7Mzp9PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezM6XFx9PjEwfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7Mzp9fT4xMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZid7Mzp7ez4xMH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezMhJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szOiciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7MyFzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXM6JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmJ3szIXM6MyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4eyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid4e3gnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYnezM6cyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZid7e3snIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYne3t9fXsnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImYneyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7MzpcXHs+MTB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgIyBCdXQgdGhlc2UgYXJlIGp1c3Qgbm9ybWFsIHN0cmluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7InsifScsICd7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3sifSJ9JywgJ30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezM6eyJ9In0+MTB9JywgJ319fX19fX19fTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnezI6eyJ7In0+MTB9JywgJ3t7e3t7e3t7ezInKQorCisgICAgZGVmIHRlc3RfaWZfY29uZGl0aW9uYWwoc2VsZik6CisgICAgICAgICMgVGhlcmUncyBzcGVjaWFsIGxvZ2ljIGluIGNvbXBpbGUuYyB0byB0ZXN0IGlmIHRoZQorICAgICAgICAjICBjb25kaXRpb25hbCBmb3IgYW4gaWYgKGFuZCB3aGlsZSkgYXJlIGNvbnN0YW50cy4gRXhlcmNpc2UKKyAgICAgICAgIyAgdGhhdCBjb2RlLgorCisgICAgICAgIGRlZiB0ZXN0X2ZzdHJpbmcoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmIGYne3h9JzoKKyAgICAgICAgICAgICAgICBmbGFnID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmbGFnID0gMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFnLCBleHBlY3RlZCkKKworICAgICAgICBkZWYgdGVzdF9jb25jYXRfZW1wdHkoeCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgICAgIGlmICcnIGYne3h9JzoKKyAgICAgICAgICAgICAgICBmbGFnID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmbGFnID0gMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFnLCBleHBlY3RlZCkKKworICAgICAgICBkZWYgdGVzdF9jb25jYXRfbm9uX2VtcHR5KHgsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIGZsYWcgPSAwCisgICAgICAgICAgICBpZiAnICcgZid7eH0nOgorICAgICAgICAgICAgICAgIGZsYWcgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYWcgPSAyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIGV4cGVjdGVkKQorCisgICAgICAgIHRlc3RfZnN0cmluZygnJywgMikKKyAgICAgICAgdGVzdF9mc3RyaW5nKCcgJywgMSkKKworICAgICAgICB0ZXN0X2NvbmNhdF9lbXB0eSgnJywgMikKKyAgICAgICAgdGVzdF9jb25jYXRfZW1wdHkoJyAnLCAxKQorCisgICAgICAgIHRlc3RfY29uY2F0X25vbl9lbXB0eSgnJywgMSkKKyAgICAgICAgdGVzdF9jb25jYXRfbm9uX2VtcHR5KCcgJywgMSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2Zvcm1hdF9zcGVjaWZpZXIoc2VsZik6CisgICAgICAgIHggPSAndGVzdCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4fScsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3t4On0nLCAndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eCFzOn0nLCAndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZid7eCFyOn0nLCAiJ3Rlc3QnIikKKworICAgIGRlZiB0ZXN0X3N0cl9mb3JtYXRfZGlmZmVyZW5jZXMoc2VsZik6CisgICAgICAgIGQgPSB7J2EnOiAnc3RyaW5nJywKKyAgICAgICAgICAgICAwOiAnaW50ZWdlcicsCisgICAgICAgICAgICAgfQorICAgICAgICBhID0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbMF19JywgJ2ludGVnZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYne2RbImEiXX0nLCAnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkW2FdfScsICdpbnRlZ2VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne2RbYV19Jy5mb3JtYXQoZD1kKSwgJ3N0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3tkWzBdfScuZm9ybWF0KGQ9ZCksICdpbnRlZ2VyJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZXhwcmVzc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoU3ludGF4RXJyb3IsICdpbnZhbGlkIHN5bnRheCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7YVs0KX0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJmJ3thKDRdfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgICMgc2VlIGlzc3VlIDI2Mjg3CisgICAgICAgIHNlbGYuYXNzZXJ0QWxsUmFpc2UoVHlwZUVycm9yLCAnbm9uLWVtcHR5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJmJ3sobGFtYmRhOiAwKTp4fSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYneygwLCk6eH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbGxSYWlzZShWYWx1ZUVycm9yLCAnVW5rbm93biBmb3JtYXQgY29kZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiZid7MTAwMDpqfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByImYnezEwMDA6an0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbG9vcChzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYnaTp7aX0nLCAnaTonICsgc3RyKGkpKQorCisgICAgZGVmIHRlc3RfZGljdChzZWxmKToKKyAgICAgICAgZCA9IHsnIic6ICdkcXVvdGUnLAorICAgICAgICAgICAgICInIjogJ3NxdW90ZScsCisgICAgICAgICAgICAgJ2Zvbyc6ICdiYXInLAorICAgICAgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkWyJcJyJdfScsICdzcXVvdGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie2RbJ1wiJ119IiwgJ2RxdW90ZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJycne2RbIiciXX0nJycsICdzcXVvdGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYiIiJ7ZFsnIiddfSIiIiwgJ2RxdW90ZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkWyJmb28iXX0nLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmIntkWydmb28nXX0iLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3tkW1wnZm9vXCddfScsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYie2RbXCJmb29cIl19IiwgJ2JhcicpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVkX3F1b3RlcyhzZWxmKToKKyAgICAgICAgZCA9IHsnIic6ICdhJywKKyAgICAgICAgICAgICAiJyI6ICdiJ30KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyIntkWydcIiddfSIsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcid7ZFsiXCciXX0nLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnIieydcIid9IiwgJyInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyJ3siXCcifScsICInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmJ3siXFwiMyJ9JywgJyIzJykKKworICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAnZi1zdHJpbmc6IHVudGVybWluYXRlZCBzdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyJycnZid7IiIiXFx9JyAnJycsICAjIEJhY2tzbGFzaCBhdCBlbmQgb2YgZXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICBzZWxmLmFzc2VydEFsbFJhaXNlKFN5bnRheEVycm9yLCAndW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgbGluZSBjb250aW51YXRpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyInJmJ3szXH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQppbmRleCBhZWY2NmRhLi45ZDhkZTIxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weQpAQCAtMTA0OSwxMCArMTA0OSwxOSBAQAogICAgICAgICBmdHAuY2xvc2UoKQogCiAKK2NsYXNzIE1pc2NUZXN0Q2FzZShUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBibGFja2xpc3QgPSB7J01TR19PT0InLCAnRlRQX1BPUlQnLCAnTUFYTElORScsICdDUkxGJywgJ0JfQ1JMRicsCisgICAgICAgICAgICAgICAgICAgICAnRXJyb3InLCAncGFyc2UxNTAnLCAncGFyc2UyMjcnLCAncGFyc2UyMjknLCAncGFyc2UyNTcnLAorICAgICAgICAgICAgICAgICAgICAgJ3ByaW50X2xpbmUnLCAnZnRwY3AnLCAndGVzdCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGZ0cGxpYiwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdHMgPSBbVGVzdEZUUENsYXNzLCBUZXN0VGltZW91dHMsCiAgICAgICAgICAgICAgVGVzdElQdjZFbnZpcm9ubWVudCwKLSAgICAgICAgICAgICBUZXN0VExTX0ZUUENsYXNzTWl4aW4sIFRlc3RUTFNfRlRQQ2xhc3NdCisgICAgICAgICAgICAgVGVzdFRMU19GVFBDbGFzc01peGluLCBUZXN0VExTX0ZUUENsYXNzLAorICAgICAgICAgICAgIE1pc2NUZXN0Q2FzZV0KIAogICAgIHRocmVhZF9pbmZvID0gc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQogICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKaW5kZXggYWI1MWEzNS4uMDZlYWNmYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTE1NzcsNyArMTU3Nyw3IEBACiAgICAgICAgICAgICBtID0gbXJvKEQsIGJhc2VzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBbRCwgYy5NdXRhYmxlU2VxdWVuY2UsIGMuU2VxdWVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmRlZmF1bHRkaWN0LCBkaWN0LCBjLk11dGFibGVNYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5NYXBwaW5nLCBjLlNpemVkLCBjLkl0ZXJhYmxlLCBjLkNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuTWFwcGluZywgYy5TaXplZCwgYy5SZXZlcnNpYmxlLCBjLkl0ZXJhYmxlLCBjLkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF0pCiAKICAgICAgICAgIyBDb250YWluZXIgYW5kIENhbGxhYmxlIGFyZSByZWdpc3RlcmVkIG9uIGRpZmZlcmVudCBiYXNlIGNsYXNzZXMgYW5kCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2djLnB5IGIvTGliL3Rlc3QvdGVzdF9nYy5weQppbmRleCBhNGQ2ODRiLi5lNzI3NDk5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2djLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2MucHkKQEAgLTY4NCw3ICs2ODQsNiBAQAogICAgICAgICAjIENyZWF0ZSBhIHJlZmVyZW5jZSBjeWNsZSB0aHJvdWdoIHRoZSBfX21haW5fXyBtb2R1bGUgYW5kIGNoZWNrCiAgICAgICAgICMgaXQgZ2V0cyBjb2xsZWN0ZWQgYXQgaW50ZXJwcmV0ZXIgc2h1dGRvd24uCiAgICAgICAgIGNvZGUgPSAiIiJpZiAxOgotICAgICAgICAgICAgaW1wb3J0IHdlYWtyZWYKICAgICAgICAgICAgIGNsYXNzIEM6CiAgICAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICAgICAgICAgICAgIHByaW50KCdfX2RlbF9fIGNhbGxlZCcpCkBAIC02OTksNyArNjk4LDYgQEAKICAgICAgICAgIyBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhIG5vbi1fX21haW5fXyBtb2R1bGUuCiAgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgogICAgICAgICAgICAgbW9kdWxlID0gIiIiaWYgMToKLSAgICAgICAgICAgICAgICBpbXBvcnQgd2Vha3JlZgogICAgICAgICAgICAgICAgIGNsYXNzIEM6CiAgICAgICAgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ19fZGVsX18gY2FsbGVkJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2RiLnB5IGIvTGliL3Rlc3QvdGVzdF9nZGIucHkKaW5kZXggY2Q3ZDI5Mi4uNzMwYjYyOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZGIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZGIucHkKQEAgLTUsNyArNSw2IEBACiAKIGltcG9ydCBvcwogaW1wb3J0IHJlCi1pbXBvcnQgcHByaW50CiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cwogaW1wb3J0IHN5c2NvbmZpZwpAQCAtMTc2LDYgKzE3NSw3IEBACiAgICAgICAgIGFyZ3MgPSBbJy0tZXZhbC1jb21tYW5kPSVzJyAlIGNtZCBmb3IgY21kIGluIGNvbW1hbmRzXQogICAgICAgICBhcmdzICs9IFsiLS1hcmdzIiwKICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGVdCisgICAgICAgIGFyZ3MuZXh0ZW5kKHN1YnByb2Nlc3MuX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpKQogCiAgICAgICAgIGlmIG5vdCBpbXBvcnRfc2l0ZToKICAgICAgICAgICAgICMgLVMgc3VwcHJlc3NlcyB0aGUgZGVmYXVsdCAnaW1wb3J0IHNpdGUnCkBAIC0yOTEsNyArMjkxLDkgQEAKICAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGRpY3Rpb25hcmllcycKICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHt9KQogICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoeydmb28nOiAnYmFyJ30sICJ7J2Zvbyc6ICdiYXInfSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7J2Zvbyc6ICdiYXInLCAnZG91Z2xhcyc6IDQyfSwgInsnZG91Z2xhcyc6IDQyLCAnZm9vJzogJ2Jhcid9IikKKyAgICAgICAgIyBQWVRIT05IQVNIU0VFRCBpcyBuZWVkIHRvIGdldCB0aGUgZXhhY3QgaXRlbSBvcmRlcgorICAgICAgICBpZiBub3Qgc3lzLmZsYWdzLmlnbm9yZV9lbnZpcm9ubWVudDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7J2Zvbyc6ICdiYXInLCAnZG91Z2xhcyc6IDQyfSwgInsnZG91Z2xhcyc6IDQyLCAnZm9vJzogJ2Jhcid9IikKIAogICAgIGRlZiB0ZXN0X2xpc3RzKHNlbGYpOgogICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgbGlzdHMnCkBAIC0zNTQsOSArMzU2LDEyIEBACiAgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBzZXRzJwogICAgICAgICBpZiAoZ2RiX21ham9yX3ZlcnNpb24sIGdkYl9taW5vcl92ZXJzaW9uKSA8ICg3LCAzKToKICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInByZXR0eS1wcmludGluZyBvZiBzZXRzIG5lZWRzIGdkYiA3LjMgb3IgbGF0ZXIiKQotICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KCksICdzZXQoKScpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoWydhJywgJ2InXSksICJ7J2EnLCAnYid9IikKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldChbNCwgNSwgNl0pLCAiezQsIDUsIDZ9IikKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHNldCgpLCAic2V0KCkiKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFsnYSddKSwgInsnYSd9IikKKyAgICAgICAgIyBQWVRIT05IQVNIU0VFRCBpcyBuZWVkIHRvIGdldCB0aGUgZXhhY3QgZnJvemVuc2V0IGl0ZW0gb3JkZXIKKyAgICAgICAgaWYgbm90IHN5cy5mbGFncy5pZ25vcmVfZW52aXJvbm1lbnQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFsnYScsICdiJ10pLCAieydhJywgJ2InfSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KFs0LCA1LCA2XSksICJ7NCwgNSwgNn0iKQogCiAgICAgICAgICMgRW5zdXJlIHRoYXQgd2UgaGFuZGxlIHNldHMgY29udGFpbmluZyB0aGUgImR1bW15IiBrZXkgdmFsdWUsCiAgICAgICAgICMgd2hpY2ggaGFwcGVucyBvbiBkZWxldGlvbjoKQEAgLTM2OSw5ICszNzQsMTIgQEAKICAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGZyb3plbnNldHMnCiAgICAgICAgIGlmIChnZGJfbWFqb3JfdmVyc2lvbiwgZ2RiX21pbm9yX3ZlcnNpb24pIDwgKDcsIDMpOgogICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgicHJldHR5LXByaW50aW5nIG9mIGZyb3plbnNldHMgbmVlZHMgZ2RiIDcuMyBvciBsYXRlciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoKSwgJ2Zyb3plbnNldCgpJykKLSAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbJ2EnLCAnYiddKSwgImZyb3plbnNldCh7J2EnLCAnYid9KSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoWzQsIDUsIDZdKSwgImZyb3plbnNldCh7NCwgNSwgNn0pIikKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldCgpLCAiZnJvemVuc2V0KCkiKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KFsnYSddKSwgImZyb3plbnNldCh7J2EnfSkiKQorICAgICAgICAjIFBZVEhPTkhBU0hTRUVEIGlzIG5lZWQgdG8gZ2V0IHRoZSBleGFjdCBmcm96ZW5zZXQgaXRlbSBvcmRlcgorICAgICAgICBpZiBub3Qgc3lzLmZsYWdzLmlnbm9yZV9lbnZpcm9ubWVudDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoWydhJywgJ2InXSksICJmcm96ZW5zZXQoeydhJywgJ2InfSkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKGZyb3plbnNldChbNCwgNSwgNl0pLCAiZnJvemVuc2V0KHs0LCA1LCA2fSkiKQogCiAgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKICAgICAgICAgIyBUZXN0IGEgUnVudGltZUVycm9yCkBAIC01MDAsNiArNTA4LDEwIEBACiAKICAgICBkZWYgdGVzdF9idWlsdGluc19oZWxwKHNlbGYpOgogICAgICAgICAnRW5zdXJlIHRoYXQgdGhlIG5ldy1zdHlsZSBjbGFzcyBfSGVscGVyIGluIHNpdGUucHkgY2FuIGJlIGhhbmRsZWQnCisKKyAgICAgICAgaWYgc3lzLmZsYWdzLm5vX3NpdGU6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJuZWVkIHNpdGUgbW9kdWxlLCBidXQgLVMgb3B0aW9uIHdhcyB1c2VkIikKKwogICAgICAgICAjICh0aGlzIHdhcyB0aGUgaXNzdWUgY2F1c2luZyB0cmFjZWJhY2tzIGluCiAgICAgICAgICMgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU4MDMyI21zZzEwMDUzNyApCiAgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJ2lkKF9fYnVpbHRpbnNfXy5oZWxwKScsIGltcG9ydF9zaXRlPVRydWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKaW5kZXggM2Y4MjQ2Mi4uZjRiMzNhZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQpAQCAtMjQ1LDExICsyNDUsMTEgQEAKICAgICAgICAgICAgIHlpZWxkCiAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uKSwgXAotICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgorICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CiAKICAgICAgICAgICAgIG5leHQoZ2VuKCkpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdG9yIC4qIHJhaXNlZCBTdG9wSXRlcmF0aW9uIiksIFwKICAgICAgICAgICAgICB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogCkBAIC0yNjgsNyArMjY4LDcgQEAKICAgICAgICAgZyA9IGYoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoZyksIDEpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uKToKICAgICAgICAgICAgICAgICBuZXh0KGcpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CmluZGV4IDg2ZmMyZGUuLjljMjhhNjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQpAQCAtMTAsMTEgKzEwLDkgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKLWRlZiBzYWZlX3JtZGlyKGRpcm5hbWUpOgotICAgIHRyeToKLSAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKLSAgICBleGNlcHQgT1NFcnJvcjoKLSAgICAgICAgcGFzcworZGVmIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBkYXRhPWInZm9vJyk6CisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAneGInLCAwKSBhcyBmcDoKKyAgICAgICAgZnAud3JpdGUoZGF0YSkKIAogCiBjbGFzcyBHZW5lcmljVGVzdDoKQEAgLTk3LDUyICs5NSw0NyBAQAogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHMxW246bisxXSwgczJbbjpuKzFdKQogCiAgICAgZGVmIHRlc3RfZ2V0c2l6ZShzZWxmKToKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGF0aG1vZHVsZS5nZXRzaXplKHN1cHBvcnQuVEVTVEZOKSwgMykKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKLSAgICAgICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCiAKLSAgICBkZWYgdGVzdF90aW1lKHNlbGYpOgotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZi53cml0ZShiImZvbyIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAiYWIiKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidIZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXRobW9kdWxlLmdldHNpemUoZmlsZW5hbWUpLCA1KQorICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZW5hbWUsIGInSGVsbG8gV29ybGQhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhdGhtb2R1bGUuZ2V0c2l6ZShmaWxlbmFtZSksIDEyKQorCisgICAgZGVmIHRlc3RfZmlsZXRpbWUoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSwgYidmb28nKQorCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgImFiIiwgMCkgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoYiJiYXIiKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikKLSAgICAgICAgICAgIGQgPSBmLnJlYWQoKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGIiZm9vYmFyIikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoCi0gICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmdldGN0aW1lKHN1cHBvcnQuVEVTVEZOKSwKLSAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0bXRpbWUoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICApCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBub3QgZi5jbG9zZWQ6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiLCAwKSBhcyBmOgorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgYiJmb29iYXIiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKAorICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmdldGN0aW1lKGZpbGVuYW1lKSwKKyAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5nZXRtdGltZShmaWxlbmFtZSkKKyAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfZXhpc3RzKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5leGlzdHMoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgZiA9IG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCi0gICAgICAgIHRyeToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyhmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInhiIikgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoYiJmb28iKQotICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5leGlzdHMoc3VwcG9ydC5URVNURk4pLCBUcnVlKQotICAgICAgICAgICAgaWYgbm90IHNlbGYucGF0aG1vZHVsZSA9PSBnZW5lcmljcGF0aDoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5sZXhpc3RzKHN1cHBvcnQuVEVTVEZOKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKGZpbGVuYW1lKSwgVHJ1ZSkKKworICAgICAgICBpZiBub3Qgc2VsZi5wYXRobW9kdWxlID09IGdlbmVyaWNwYXRoOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUubGV4aXN0cyhmaWxlbmFtZSksIFRydWUpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAicGlwZSIpLCAicmVxdWlyZXMgb3MucGlwZSgpIikKICAgICBkZWYgdGVzdF9leGlzdHNfZmQoc2VsZik6CkBAIC0xNTQsNTMgKzE0Nyw2NiBAQAogICAgICAgICAgICAgb3MuY2xvc2UodykKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKHIpKQogCi0gICAgZGVmIHRlc3RfaXNkaXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKHN1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCi0gICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLndyaXRlKGIiZm9vIikKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKLSAgICAgICAgICAgIG9zLnJlbW92ZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIG9zLm1rZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoc3VwcG9ydC5URVNURk4pLCBUcnVlKQotICAgICAgICAgICAgb3Mucm1kaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgotICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCi0gICAgICAgICAgICBzYWZlX3JtZGlyKHN1cHBvcnQuVEVTVEZOKQorICAgIGRlZiB0ZXN0X2lzZGlyX2ZpbGUoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIoZmlsZW5hbWUpLCBGYWxzZSkKIAotICAgIGRlZiB0ZXN0X2lzZmlsZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHN1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCi0gICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmLndyaXRlKGIiZm9vIikKLSAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHN1cHBvcnQuVEVTVEZOKSwgVHJ1ZSkKLSAgICAgICAgICAgIG9zLnJlbW92ZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIG9zLm1rZGlyKHN1cHBvcnQuVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHN1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCi0gICAgICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgICAgIHNhZmVfcm1kaXIoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIEZhbHNlKQogCi0gICAgQHN0YXRpY21ldGhvZAotICAgIGRlZiBfY3JlYXRlX2ZpbGUoZmlsZW5hbWUpOgotICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3YicpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKGInZm9vJykKKyAgICBkZWYgdGVzdF9pc2Rpcl9kaXIoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm1kaXIsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIEZhbHNlKQorCisgICAgICAgIG9zLm1rZGlyKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2RpcihmaWxlbmFtZSksIFRydWUpCisKKyAgICBkZWYgdGVzdF9pc2ZpbGVfZmlsZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBGYWxzZSkKKworICAgICAgICBjcmVhdGVfZmlsZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKGZpbGVuYW1lKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2lzZmlsZV9kaXIoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm1kaXIsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUoZmlsZW5hbWUpLCBGYWxzZSkKKworICAgICAgICBvcy5ta2RpcihmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKGZpbGVuYW1lKSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9zYW1lZmlsZShzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGVzdF9mbiA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuLCB0ZXN0X2ZuKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4pCisgICAgICAgIGZpbGUxID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgZmlsZTIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGUxKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZpbGUyKQorCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKGZpbGUxLCBmaWxlMSkpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKGZpbGUxLCBmaWxlMikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUpCisKKyAgICBkZWYgX3Rlc3Rfc2FtZWZpbGVfb25fbGlua19mdW5jKHNlbGYsIGZ1bmMpOgorICAgICAgICB0ZXN0X2ZuMSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCB0ZXN0X2ZuMikKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMSkKKworICAgICAgICBmdW5jKHRlc3RfZm4xLCB0ZXN0X2ZuMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuMSwgdGVzdF9mbjIpKQorICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXRobW9kdWxlLnNhbWVmaWxlKHRlc3RfZm4xLCB0ZXN0X2ZuMikpCiAKICAgICBAc3VwcG9ydC5za2lwX3VubGVzc19zeW1saW5rCiAgICAgZGVmIHRlc3Rfc2FtZWZpbGVfb25fc3ltbGluayhzZWxmKToKQEAgLTIwOSwzMSArMjE1LDM3IEBACiAgICAgZGVmIHRlc3Rfc2FtZWZpbGVfb25fbGluayhzZWxmKToKICAgICAgICAgc2VsZi5fdGVzdF9zYW1lZmlsZV9vbl9saW5rX2Z1bmMob3MubGluaykKIAotICAgIGRlZiBfdGVzdF9zYW1lZmlsZV9vbl9saW5rX2Z1bmMoc2VsZiwgZnVuYyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4gKyAiMSIKLSAgICAgICAgICAgIHRlc3RfZm4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4xKQotCi0gICAgICAgICAgICBmdW5jKHRlc3RfZm4xLCB0ZXN0X2ZuMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZWZpbGUodGVzdF9mbjEsIHRlc3RfZm4yKSkKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKLQotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbjIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5zYW1lZmlsZSh0ZXN0X2ZuMSwgdGVzdF9mbjIpKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4xKQotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQotCiAgICAgZGVmIHRlc3Rfc2FtZXN0YXQoc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRlc3RfZm4gPSBzdXBwb3J0LlRFU1RGTiArICIxIgotICAgICAgICAgICAgc2VsZi5fY3JlYXRlX2ZpbGUodGVzdF9mbikKLSAgICAgICAgICAgIHRlc3RfZm5zID0gW3Rlc3RfZm5dKjIKLSAgICAgICAgICAgIHN0YXRzID0gbWFwKG9zLnN0YXQsIHRlc3RfZm5zKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdCgqc3RhdHMpKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4pCisgICAgICAgIHRlc3RfZm4xID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgdGVzdF9mbjIgPSBzdXBwb3J0LlRFU1RGTiArICIyIgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4xKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHRlc3RfZm4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4xKQorICAgICAgICBzdGF0MSA9IG9zLnN0YXQodGVzdF9mbjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZXN0YXQoc3RhdDEsIG9zLnN0YXQodGVzdF9mbjEpKSkKKworICAgICAgICBjcmVhdGVfZmlsZSh0ZXN0X2ZuMikKKyAgICAgICAgc3RhdDIgPSBvcy5zdGF0KHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdChzdGF0MSwgc3RhdDIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KQorCisgICAgZGVmIF90ZXN0X3NhbWVzdGF0X29uX2xpbmtfZnVuYyhzZWxmLCBmdW5jKToKKyAgICAgICAgdGVzdF9mbjEgPSBzdXBwb3J0LlRFU1RGTiArICIxIgorICAgICAgICB0ZXN0X2ZuMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgdGVzdF9mbjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUodGVzdF9mbjEpCisgICAgICAgIGZ1bmModGVzdF9mbjEsIHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KG9zLnN0YXQodGVzdF9mbjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQodGVzdF9mbjIpKSkKKyAgICAgICAgb3MucmVtb3ZlKHRlc3RfZm4yKQorCisgICAgICAgIGNyZWF0ZV9maWxlKHRlc3RfZm4yKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdChvcy5zdGF0KHRlc3RfZm4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X2ZuMikpKQogCiAgICAgQHN1cHBvcnQuc2tpcF91bmxlc3Nfc3ltbGluawogICAgIGRlZiB0ZXN0X3NhbWVzdGF0X29uX3N5bWxpbmsoc2VsZik6CkBAIC0yNDIsMzEgKzI1NCwxNyBAQAogICAgIGRlZiB0ZXN0X3NhbWVzdGF0X29uX2xpbmsoc2VsZik6CiAgICAgICAgIHNlbGYuX3Rlc3Rfc2FtZXN0YXRfb25fbGlua19mdW5jKG9zLmxpbmspCiAKLSAgICBkZWYgX3Rlc3Rfc2FtZXN0YXRfb25fbGlua19mdW5jKHNlbGYsIGZ1bmMpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ZXN0X2ZuMSA9IHN1cHBvcnQuVEVTVEZOICsgIjEiCi0gICAgICAgICAgICB0ZXN0X2ZuMiA9IHN1cHBvcnQuVEVTVEZOICsgIjIiCi0gICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSh0ZXN0X2ZuMSkKLSAgICAgICAgICAgIHRlc3RfZm5zID0gKHRlc3RfZm4xLCB0ZXN0X2ZuMikKLSAgICAgICAgICAgIGZ1bmMoKnRlc3RfZm5zKQotICAgICAgICAgICAgc3RhdHMgPSBtYXAob3Muc3RhdCwgdGVzdF9mbnMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVzdGF0KCpzdGF0cykpCi0gICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9mbjIpCi0KLSAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKHRlc3RfZm4yKQotICAgICAgICAgICAgc3RhdHMgPSBtYXAob3Muc3RhdCwgdGVzdF9mbnMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdCgqc3RhdHMpKQotCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucGF0aG1vZHVsZS5zYW1lc3RhdCkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMSkKLSAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X2ZuMikKLQogICAgIGRlZiB0ZXN0X3NhbWVvcGVuZmlsZShzZWxmKToKLSAgICAgICAgZm5hbWUgPSBzdXBwb3J0LlRFU1RGTiArICIxIgotICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICJ3YiIpIGFzIGEsIG9wZW4oZm5hbWUsICJ3YiIpIGFzIGI6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXRobW9kdWxlLnNhbWVvcGVuZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5maWxlbm8oKSwgYi5maWxlbm8oKSkpCisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZW5hbWUpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiLCAwKSBhcyBmcDE6CisgICAgICAgICAgICBmZDEgPSBmcDEuZmlsZW5vKCkKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInJiIiwgMCkgYXMgZnAyOgorICAgICAgICAgICAgICAgIGZkMiA9IGZwMi5maWxlbm8oKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhdGhtb2R1bGUuc2FtZW9wZW5maWxlKGZkMSwgZmQyKSkKKwogCiBjbGFzcyBUZXN0R2VuZXJpY1Rlc3QoR2VuZXJpY1Rlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAjIElzc3VlIDE2ODUyOiBHZW5lcmljVGVzdCBjYW4ndCBpbmhlcml0IGZyb20gdW5pdHRlc3QuVGVzdENhc2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CmluZGV4IDk4NGFhYzcuLjE2ZTE2M2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpAQCAtMzY1LDcgKzM2NSw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19mKEZsb2F0U3ViY2xhc3MoNy41KSksIDcuNSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2YoRmxvYXRTdWJjbGFzczIoNy41KSksIDcuNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX2YsIEJhZEZsb2F0KCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19mKEJhZEZsb2F0MigpKSwgNC4yNSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZihCYWRGbG9hdDIoKSksIDQuMjUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19mKEJhZEZsb2F0Myg3LjUpKSwgNy41KQogCiAgICAgICAgIGZvciB4IGluIChGTFRfTUlOLCAtRkxUX01JTiwgRkxUX01BWCwgLUZMVF9NQVgsIElORiwgLUlORik6CkBAIC0zOTAsNyArMzkxLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2QoRmxvYXRTdWJjbGFzcyg3LjUpKSwgNy41KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGFyZ3NfZChGbG9hdFN1YmNsYXNzMig3LjUpKSwgNy41KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZCwgQmFkRmxvYXQoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2QoQmFkRmxvYXQyKCkpLCA0LjI1KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19kKEJhZEZsb2F0MigpKSwgNC4yNSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhcmdzX2QoQmFkRmxvYXQzKDcuNSkpLCA3LjUpCiAKICAgICAgICAgZm9yIHggaW4gKERCTF9NSU4sIC1EQkxfTUlOLCBEQkxfTUFYLCAtREJMX01BWCwgSU5GLCAtSU5GKToKQEAgLTQ3NCw3ICs0NzYsNyBAQAogCiAgICAgICAgIHJldCA9IGdldF9hcmdzKCpUdXBsZVN1YmNsYXNzKFsxLCAyXSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCAoMSwgMikpCi0gICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyZXQsIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocmV0KSwgdHVwbGUpCiAKICAgICAgICAgcmV0ID0gZ2V0X2FyZ3MoKQogICAgICAgICBzZWxmLmFzc2VydEluKHJldCwgKCgpLCBOb25lKSkKQEAgLTUxMiw3ICs1MTQsNyBAQAogCiAgICAgICAgIHJldCA9IGdldF9rd2FyZ3MoKipEaWN0U3ViY2xhc3MoeydhJzogMSwgJ2InOiAyfSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCB7J2EnOiAxLCAnYic6IDJ9KQotICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmV0LCBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocmV0KSwgZGljdCkKIAogICAgICAgICByZXQgPSBnZXRfa3dhcmdzKCkKICAgICAgICAgc2VsZi5hc3NlcnRJbihyZXQsICh7fSwgTm9uZSkpCkBAIC02NTYsNiArNjU4LDM5IEBACiAgICAgICAgICAgICBnZXRhcmdzX2tleXdvcmRfb25seSgxLCAyLCAqKnsnXHVEQzgwJzogMTB9KQogCiAKK2NsYXNzIFBvc2l0aW9uYWxPbmx5QW5kS2V5d29yZHNfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX3Bvc2l0aW9uYWxfb25seV9hbmRfa2V5d29yZHMgYXMgZ2V0YXJncworCisgICAgZGVmIHRlc3RfcG9zaXRpb25hbF9hcmdzKHNlbGYpOgorICAgICAgICAjIHVzaW5nIGFsbCBwb3NzaWJsZSBwb3NpdGlvbmFsIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldGFyZ3MoMSwgMiwgMyksICgxLCAyLCAzKSkKKworICAgIGRlZiB0ZXN0X21peGVkX2FyZ3Moc2VsZik6CisgICAgICAgICMgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRhcmdzKDEsIDIsIGtleXdvcmQ9MyksICgxLCAyLCAzKSkKKworICAgIGRlZiB0ZXN0X29wdGlvbmFsX2FyZ3Moc2VsZik6CisgICAgICAgICMgbWlzc2luZyBvcHRpb25hbCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRhcmdzKDEsIDIpLCAoMSwgMiwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0YXJncygxLCBrZXl3b3JkPTMpLCAoMSwgLTEsIDMpKQorCisgICAgZGVmIHRlc3RfcmVxdWlyZWRfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldGFyZ3MoMSksICgxLCAtMSwgLTEpKQorICAgICAgICAjIHJlcXVpcmVkIHBvc2l0aW9uYWwgYXJnIG1pc3NpbmcKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKKyAgICAgICAgICAgICJGdW5jdGlvbiB0YWtlcyBhdCBsZWFzdCAxIHBvc2l0aW9uYWwgYXJndW1lbnRzIFwoMCBnaXZlblwpIik6CisgICAgICAgICAgICBzZWxmLmdldGFyZ3MoKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAiRnVuY3Rpb24gdGFrZXMgYXQgbGVhc3QgMSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBcKDAgZ2l2ZW5cKSIpOgorICAgICAgICAgICAgc2VsZi5nZXRhcmdzKGtleXdvcmQ9MykKKworICAgIGRlZiB0ZXN0X2VtcHR5X2tleXdvcmQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCisgICAgICAgICAgICAiJycgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50IGZvciB0aGlzIGZ1bmN0aW9uIik6CisgICAgICAgICAgICBzZWxmLmdldGFyZ3MoMSwgMiwgKip7Jyc6IDY2Nn0pCisKKwogY2xhc3MgQnl0ZXNfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Moc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2MKQEAgLTgyMiwxMCArODU3LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19lc19oYXNoKCdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZiksIGInYWJjXHhlOScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBieXRlYXJyYXkoYidhYmNceGU5XHgwMCcpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoYid4Jyo0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2VzX2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ3gnKjQpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXNfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2VzX2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKIAogICAgIGRlZiB0ZXN0X2V0X2hhc2goc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2V0X2hhc2gKQEAgLTg0OCwxMCArODgzLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXJnc19ldF9oYXNoKCdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZiksIGInYWJjXHhlOScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBieXRlYXJyYXkoYidhYmNceGU5XHgwMCcpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoYid4Jyo0KQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2V0X2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVhcnJheShiJ3gnKjQpKQogICAgICAgICBidWYgPSBieXRlYXJyYXkoKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfZXRfaGFzaCwgJ2FiY1x4ZTknLCAnbGF0aW4xJywgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRhcmdzX2V0X2hhc2gsICdhYmNceGU5JywgJ2xhdGluMScsIGJ1ZikKIAogICAgIGRlZiB0ZXN0X3Uoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX3UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weQppbmRleCBkZTYxMGM3Li5kMzQ1YmFhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CkBAIC0xLDYgKzEsNSBAQAogaW1wb3J0IG9zCiBpbXBvcnQgYmFzZTY0Ci1pbXBvcnQgc2h1dGlsCiBpbXBvcnQgZ2V0dGV4dAogaW1wb3J0IHVuaXR0ZXN0CiAKQEAgLTQ0MCw2ICs0MzksMTIgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Ll9fY2xhc3NfXywgRHVtbXlHTlVUcmFuc2xhdGlvbnMpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnYzJweScsICdFTk9FTlQnfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBnZXR0ZXh0LCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5IGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CmluZGV4IDE1NGUzYjYuLmJmZTUyMjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKQEAgLTI5NSw2ICsyOTUsMTAgQEAKICAgICAgICAgcG9zMmtleTJkaWN0KDEsMixrMj0xMDAsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCkKICAgICAgICAgcG9zMmtleTJkaWN0KDEsMix0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwLCBrMj0xMDApCiAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJkZWYgZigqKTogcGFzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZGVmIGYoKiwpOiBwYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJkZWYgZigqLCAqKmt3ZHMpOiBwYXNzIikKKwogICAgICAgICAjIGtleXdvcmQgYXJndW1lbnRzIGFmdGVyICphcmdsaXN0CiAgICAgICAgIGRlZiBmKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICByZXR1cm4gYXJncywga3dhcmdzCkBAIC0zNDEsNyArMzQ1LDcgQEAKICAgICAgICAgZGVmIGYoeCkgLT4gbGlzdDogcGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuX19hbm5vdGF0aW9uc19fLCB7J3JldHVybic6IGxpc3R9KQogCi0gICAgICAgICMgdGVzdCBNQUtFX0NMT1NVUkUgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmcncworICAgICAgICAjIHRlc3QgY2xvc3VyZXMgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmdzCiAgICAgICAgIGNsb3N1cmUgPSAxCiAgICAgICAgIGRlZiBmKCk6IHJldHVybiBjbG9zdXJlCiAgICAgICAgIGRlZiBmKHg9MSk6IHJldHVybiBjbG9zdXJlCkBAIC0zNTIsNiArMzU2LDIzIEBACiAgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigqZygxPTIpKSIpCiAgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigqKmcoMT0yKSkiKQogCisgICAgICAgICMgQ2hlY2sgdHJhaWxpbmcgY29tbWFzIGFyZSBwZXJtaXR0ZWQgaW4gZnVuY2RlZiBhcmd1bWVudCBsaXN0CisgICAgICAgIGRlZiBmKGEsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywpOiBwYXNzCisgICAgICAgIGRlZiBmKCoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKmFyZ3MsIGIsKTogcGFzcworICAgICAgICBkZWYgZigqLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKmFyZ3MsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCBiLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKiwgYiwpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICphcmdzLCAqKmt3ZHMsKTogcGFzcworICAgICAgICBkZWYgZigqYXJncywgYiwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoKiwgYiwgKiprd2RzLCk6IHBhc3MKKyAgICAgICAgZGVmIGYoYSwgKmFyZ3MsIGIsICoqa3dkcywpOiBwYXNzCisgICAgICAgIGRlZiBmKGEsICosIGIsICoqa3dkcywpOiBwYXNzCisKICAgICBkZWYgdGVzdF9sYW1iZGVmKHNlbGYpOgogICAgICAgICAjIyMgbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgdGVzdAogICAgICAgICBsMSA9IGxhbWJkYSA6IDAKQEAgLTM3MCw2ICszOTEsMjMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsNigxLDIpLCAxKzIrMjApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDYoMSwyLGs9MTApLCAxKzIrMTApCiAKKyAgICAgICAgIyBjaGVjayB0aGF0IHRyYWlsaW5nIGNvbW1hcyBhcmUgcGVybWl0dGVkCisgICAgICAgIGwxMCA9IGxhbWJkYSBhLDogMAorICAgICAgICBsMTEgPSBsYW1iZGEgKmFyZ3MsOiAwCisgICAgICAgIGwxMiA9IGxhbWJkYSAqKmt3ZHMsOiAwCisgICAgICAgIGwxMyA9IGxhbWJkYSBhLCAqYXJncyw6IDAKKyAgICAgICAgbDE0ID0gbGFtYmRhIGEsICoqa3dkcyw6IDAKKyAgICAgICAgbDE1ID0gbGFtYmRhICphcmdzLCBiLDogMAorICAgICAgICBsMTYgPSBsYW1iZGEgKiwgYiw6IDAKKyAgICAgICAgbDE3ID0gbGFtYmRhICphcmdzLCAqKmt3ZHMsOiAwCisgICAgICAgIGwxOCA9IGxhbWJkYSBhLCAqYXJncywgYiw6IDAKKyAgICAgICAgbDE5ID0gbGFtYmRhIGEsICosIGIsOiAwCisgICAgICAgIGwyMCA9IGxhbWJkYSBhLCAqYXJncywgKiprd2RzLDogMAorICAgICAgICBsMjEgPSBsYW1iZGEgKmFyZ3MsIGIsICoqa3dkcyw6IDAKKyAgICAgICAgbDIyID0gbGFtYmRhICosIGIsICoqa3dkcyw6IDAKKyAgICAgICAgbDIzID0gbGFtYmRhIGEsICphcmdzLCBiLCAqKmt3ZHMsOiAwCisgICAgICAgIGwyNCA9IGxhbWJkYSBhLCAqLCBiLCAqKmt3ZHMsOiAwCisKIAogICAgICMjIyBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKICAgICAjIFRlc3RlZCBiZWxvdwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncnAucHkgYi9MaWIvdGVzdC90ZXN0X2dycC5weQppbmRleCAyNzJiMDg2Li42OTA5NWEzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dycC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dycC5weQpAQCAtOTIsNSArOTIsMTUgQEAKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZ3JwLmdldGdyZ2lkLCBmYWtlZ2lkKQogCisgICAgZGVmIHRlc3Rfbm9uaW50ZWdlcl9naWQoc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBncnAuZ2V0Z3JhbGwoKQorICAgICAgICBpZiBub3QgZW50cmllczoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ25vIGdyb3VwcycpCisgICAgICAgICMgQ2hvb3NlIGFuIGV4aXN0ZW50IGdpZC4KKyAgICAgICAgZ2lkID0gZW50cmllc1swXVsyXQorICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgZ3JwLmdldGdyZ2lkLCBmbG9hdChnaWQpKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgZ3JwLmdldGdyZ2lkLCBzdHIoZ2lkKSkKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9oZWFwcS5weSBiL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKaW5kZXggYjdlODI1OS4uMmY4YzY0OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CkBAIC0xLDYgKzEsNSBAQAogIiIiVW5pdHRlc3RzIGZvciBoZWFwcS4iIiIKIAotaW1wb3J0IHN5cwogaW1wb3J0IHJhbmRvbQogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaG1hYy5weSBiL0xpYi90ZXN0L3Rlc3RfaG1hYy5weQppbmRleCA5ODgyNmI1Li4wNjdlMTNmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2htYWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9obWFjLnB5CkBAIC0zLDcgKzMsNiBAQAogaW1wb3J0IGhhc2hsaWIKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHdhcm5pbmdzCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCiBkZWYgaWdub3JlX3dhcm5pbmcoZnVuYyk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkKaW5kZXggMTE0MjBiMi4uYTdmNTNkMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weQpAQCAtMyw3ICszLDYgQEAKIGltcG9ydCBodG1sLnBhcnNlcgogaW1wb3J0IHBwcmludAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCiBjbGFzcyBFdmVudENvbGxlY3RvcihodG1sLnBhcnNlci5IVE1MUGFyc2VyKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkgYi9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CmluZGV4IDcyZTZlMDguLjdmNGIwZjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQpAQCAtMTgsNiArMTgsNyBAQAogaW1wb3J0IGh0bWwKIGltcG9ydCBodHRwLmNsaWVudAogaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQogZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwogCiBpbXBvcnQgdW5pdHRlc3QKQEAgLTM4OCw3ICszODksNyBAQAogICAgICAgICBxdW90ZWRuYW1lID0gdXJsbGliLnBhcnNlLnF1b3RlKGZpbGVuYW1lLCBlcnJvcnM9J3N1cnJvZ2F0ZXBhc3MnKQogICAgICAgICBzZWxmLmFzc2VydEluKCgnaHJlZj0iJXMiJyAlIHF1b3RlZG5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgLmVuY29kZShlbmMsICdzdXJyb2dhdGVlc2NhcGUnKSwgYm9keSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbigoJz4lczwnICUgaHRtbC5lc2NhcGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnPiVzPCcgJSBodG1sLmVzY2FwZShmaWxlbmFtZSwgcXVvdGU9RmFsc2UpKQogICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGUoZW5jLCAnc3Vycm9nYXRlZXNjYXBlJyksIGJvZHkpCiAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYuYmFzZV91cmwgKyAnLycgKyBxdW90ZWRuYW1lKQogICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCBIVFRQU3RhdHVzLk9LLApAQCAtNDY2LDYgKzQ2NywyNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLmdldGhlYWRlcigiTG9jYXRpb24iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlbXBkaXJfbmFtZSArICIvP2hpPTEiKQogCisgICAgZGVmIHRlc3RfaHRtbF9lc2NhcGVfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gJzx0ZXN0Jj4udHh0JworICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXIsIGZpbGVuYW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wZW4oZnVsbHBhdGgsICd3JykuY2xvc2UoKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdDYW4gbm90IGNyZWF0ZSBmaWxlICVzIG9uIGN1cnJlbnQgZmlsZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtJyAlIGZpbGVuYW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYuYmFzZV91cmwgKyAnLycpCisgICAgICAgICAgICBib2R5ID0gc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgSFRUUFN0YXR1cy5PSykKKyAgICAgICAgICAgIGVuYyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0X2NvbnRlbnRfY2hhcnNldCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsoZnVsbHBhdGgpICAjIGF2b2lkIGFmZmVjdGluZyB0ZXN0X3VuZGVjb2RhYmxlX2ZpbGVuYW1lCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZW5jKQorICAgICAgICBodG1sX3RleHQgPSAnPiVzPCcgJSBodG1sLmVzY2FwZShmaWxlbmFtZSwgcXVvdGU9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oaHRtbF90ZXh0LmVuY29kZShlbmMpLCBib2R5KQorCiAKIGNnaV9maWxlMSA9ICIiIlwKICMhJXMKQEAgLTkxNiw3ICs5MzgsNyBAQAogICAgICAgICAjIElzc3VlICM2NzkxOiBzYW1lIGZvciBoZWFkZXJzCiAgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VuZF90eXBpY2FsX3JlcXVlc3QoCiAgICAgICAgICAgICBiJ0dFVCAvIEhUVFAvMS4xXHJcblgtRm9vOiBiYXInICsgYidyJyAqIDY1NTM3ICsgYidcclxuXHJcbicpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdLCBiJ0hUVFAvMS4xIDQwMCBMaW5lIHRvbyBsb25nXHJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdLCBiJ0hUVFAvMS4xIDQzMSBMaW5lIHRvbyBsb25nXHJcbicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5oYW5kbGVyLmdldF9jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLnJlcXVlc3RsaW5lLCAnR0VUIC8gSFRUUC8xLjEnKQogCkBAIC05MjcsNiArOTQ5LDEzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5oYW5kbGVyLmdldF9jYWxsZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5oYW5kbGVyLnJlcXVlc3RsaW5lLCAnR0VUIC8gSFRUUC8xLjEnKQogCisgICAgZGVmIHRlc3RfaHRtbF9lc2NhcGVfb25fZXJyb3Ioc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VuZF90eXBpY2FsX3JlcXVlc3QoCisgICAgICAgICAgICBiJzxzY3JpcHQ+YWxlcnQoImhlbGxvIik8L3NjcmlwdD4gLyBIVFRQLzEuMScpCisgICAgICAgIHJlc3VsdCA9IGInJy5qb2luKHJlc3VsdCkKKyAgICAgICAgdGV4dCA9ICc8c2NyaXB0PmFsZXJ0KCJoZWxsbyIpPC9zY3JpcHQ+JworICAgICAgICBzZWxmLmFzc2VydEluKGh0bWwuZXNjYXBlKHRleHQsIHF1b3RlPUZhbHNlKS5lbmNvZGUoJ2FzY2lpJyksIHJlc3VsdCkKKwogICAgIGRlZiB0ZXN0X2Nsb3NlX2Nvbm5lY3Rpb24oc2VsZik6CiAgICAgICAgICMgaGFuZGxlX29uZV9yZXF1ZXN0KCkgc2hvdWxkIGJlIHJlcGVhdGVkbHkgY2FsbGVkIHVudGlsCiAgICAgICAgICMgaXQgc2V0cyBjbG9zZV9jb25uZWN0aW9uCkBAIC05NDIsNiArOTcxLDE5IEBACiAgICAgICAgIHNlbGYuaGFuZGxlci5oYW5kbGUoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBuZXh0LCBjbG9zZV92YWx1ZXMpCiAKKyAgICBkZWYgdGVzdF9kYXRlX3RpbWVfc3RyaW5nKHNlbGYpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICAjIHRoaXMgaXMgdGhlIG9sZCBjb2RlIHRoYXQgZm9ybWF0cyB0aGUgdGltZXN0YW1wCisgICAgICAgIHllYXIsIG1vbnRoLCBkYXksIGhoLCBtbSwgc3MsIHdkLCB5LCB6ID0gdGltZS5nbXRpbWUobm93KQorICAgICAgICBleHBlY3RlZCA9ICIlcywgJTAyZCAlM3MgJTRkICUwMmQ6JTAyZDolMDJkIEdNVCIgJSAoCisgICAgICAgICAgICBzZWxmLmhhbmRsZXIud2Vla2RheW5hbWVbd2RdLAorICAgICAgICAgICAgZGF5LAorICAgICAgICAgICAgc2VsZi5oYW5kbGVyLm1vbnRobmFtZVttb250aF0sCisgICAgICAgICAgICB5ZWFyLCBoaCwgbW0sIHNzCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhhbmRsZXIuZGF0ZV90aW1lX3N0cmluZyh0aW1lc3RhbXA9bm93KSwgZXhwZWN0ZWQpCisKKwogY2xhc3MgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIiBUZXN0IHVybCBwYXJzaW5nICIiIgogICAgIGRlZiBzZXRVcChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaWRsZS5weSBiL0xpYi90ZXN0L3Rlc3RfaWRsZS5weQppbmRleCAxNDFlODllLi5hZDg4ZTI0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2lkbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pZGxlLnB5CkBAIC0xLDE2ICsxLDIxIEBACiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IGltcG9ydF9tb2R1bGUKIAotIyBTa2lwIHRlc3QgaWYgX3RocmVhZCBvciBfdGtpbnRlciB3YXNuJ3QgYnVpbHQgb3IgaWRsZWxpYiB3YXMgZGVsZXRlZC4KKyMgU2tpcCB0ZXN0IGlmIF90aHJlYWQgb3IgX3RraW50ZXIgd2Fzbid0IGJ1aWx0LCBvciBpZGxlbGliIGlzIG1pc3NpbmcsCisjIG9yIGlmIHRjbC90ayB2ZXJzaW9uIGJlZm9yZSA4LjUsIHdoaWNoIGlzIG5lZWRlZCBmb3IgdHRrIHdpZGdldHMuCisKIGltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpICAjIGltcG9ydGVkIGJ5IFB5U2hlbGwsIGltcG9ydHMgX3RocmVhZAogdGsgPSBpbXBvcnRfbW9kdWxlKCd0a2ludGVyJykgICMgaW1wb3J0cyBfdGtpbnRlcgotaWRsZXRlc3QgPSBpbXBvcnRfbW9kdWxlKCdpZGxlbGliLmlkbGVfdGVzdCcpCitpZiB0ay5Ua1ZlcnNpb24gPCA4LjU6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIklETEUgcmVxdWlyZXMgdGsgOC41IG9yIGxhdGVyLiIpCit0ay5Ob0RlZmF1bHRSb290KCkKK2lkbGVsaWIgPSBpbXBvcnRfbW9kdWxlKCdpZGxlbGliJykKK2lkbGVsaWIudGVzdGluZyA9IFRydWUgICMgQXZvaWQgbG9jYWxlLWNoYW5nZWQgdGVzdCBlcnJvcgogCi0jIFdpdGhvdXQgdGVzdF9tYWluIHByZXNlbnQsIHJlZ3J0ZXN0LnJ1bnRlc3RfaW5uZXIgKGxpbmUxMjE5KSBjYWxscwotIyB1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbU1vZHVsZSh0aGlzX21vZHVsZSkgd2hpY2ggY2FsbHMKLSMgbG9hZF90ZXN0cygpIGlmIGl0IGZpbmRzIGl0LiAoVW5pdHRlc3QubWFpbiBkb2VzIHRoZSBzYW1lLikKLWxvYWRfdGVzdHMgPSBpZGxldGVzdC5sb2FkX3Rlc3RzCisjIFdpdGhvdXQgdGVzdF9tYWluIHByZXNlbnQsIHRlc3QubGlicmVncnRlc3QucnVudGVzdC5ydW50ZXN0X2lubmVyCisjIGNhbGxzIChsaW5lIDE3MykgdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21Nb2R1bGUobW9kdWxlKQorIyB3aGljaCBjYWxscyBsb2FkX3Rlc3RzKCkgaWYgaXQgZmluZHMgaXQuIChVbml0dGVzdC5tYWluIGRvZXMgdGhlIHNhbWUuKQorZnJvbSBpZGxlbGliLmlkbGVfdGVzdCBpbXBvcnQgbG9hZF90ZXN0cwogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4odmVyYm9zaXR5PTIsIGV4aXQ9RmFsc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltYXBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2ltYXBsaWIucHkKaW5kZXggMDcxNTdmNS4uOGU0OTkwYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbWFwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1hcGxpYi5weQpAQCAtMjQzLDYgKzI0Myw1NSBAQAogICAgICAgICAgICAgY2xpZW50LnNodXRkb3duKCkKIAogICAgIEByZWFwX3RocmVhZHMKKyAgICBkZWYgdGVzdF9icmFja2V0X2ZsYWdzKHNlbGYpOgorCisgICAgICAgICMgVGhpcyB2aW9sYXRlcyBSRkMgMzUwMSwgd2hpY2ggZGlzYWxsb3dzICddJyBjaGFyYWN0ZXJzIGluIHRhZyBuYW1lcywKKyAgICAgICAgIyBidXQgaW1hcGxpYiBoYXMgYWxsb3dlZCBwcm9kdWNpbmcgc3VjaCB0YWdzIGZvcmV2ZXIsIG90aGVyIHByb2dyYW1zCisgICAgICAgICMgYWxzbyBwcm9kdWNlIHRoZW0gKGVnOiBPdGhlckluYm94J3MgT3JnYW5pemVyIGFwcCBhcyBvZiAyMDE0MDcxNiksCisgICAgICAgICMgYW5kIEdtYWlsLCBmb3IgZXhhbXBsZSwgYWNjZXB0cyB0aGVtIGFuZCBwcm9kdWNlcyB0aGVtLiAgU28gd2UKKyAgICAgICAgIyBzdXBwb3J0IHRoZW0uICBTZWUgaXNzdWUgIzIxODE1LgorCisgICAgICAgIGNsYXNzIEJyYWNrZXRGbGFnSGFuZGxlcihTaW1wbGVJTUFQSGFuZGxlcik6CisKKyAgICAgICAgICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFncyA9IFsnQW5zd2VyZWQnLCAnRmxhZ2dlZCcsICdEZWxldGVkJywgJ1NlZW4nLCAnRHJhZnQnXQorICAgICAgICAgICAgICAgIHN1cGVyKCkuaGFuZGxlKCkKKworICAgICAgICAgICAgZGVmIGNtZF9BVVRIRU5USUNBVEUoc2VsZiwgdGFnLCBhcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX3RleHRsaW5lKCcrJykKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5yZXNwb25zZSA9IHlpZWxkCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF90YWdnZWQodGFnLCAnT0snLCAnRkFLRUFVVEggc3VjY2Vzc2Z1bCcpCisKKyAgICAgICAgICAgIGRlZiBjbWRfU0VMRUNUKHNlbGYsIHRhZywgYXJncyk6CisgICAgICAgICAgICAgICAgZmxhZ19tc2cgPSAnIFxcJy5qb2luKHNlbGYuZmxhZ3MpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF9saW5lKCgnKiBGTEFHUyAoJXMpJyAlIGZsYWdfbXNnKS5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF9saW5lKGInKiAyIEVYSVNUUycpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VuZF9saW5lKGInKiAwIFJFQ0VOVCcpCisgICAgICAgICAgICAgICAgbXNnID0gKCcqIE9LIFtQRVJNQU5FTlRGTEFHUyAlcyBcXCopXSBGbGFncyBwZXJtaXR0ZWQuJworICAgICAgICAgICAgICAgICAgICAgICAgJSBmbGFnX21zZykKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX2xpbmUobXNnLmVuY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kX3RhZ2dlZCh0YWcsICdPSycsICdbUkVBRC1XUklURV0gU0VMRUNUIGNvbXBsZXRlZC4nKQorCisgICAgICAgICAgICBkZWYgY21kX1NUT1JFKHNlbGYsIHRhZywgYXJncyk6CisgICAgICAgICAgICAgICAgbmV3X2ZsYWdzID0gYXJnc1syXS5zdHJpcCgnKCcpLnN0cmlwKCcpJykuc3BsaXQoKQorICAgICAgICAgICAgICAgIHNlbGYuZmxhZ3MuZXh0ZW5kKG5ld19mbGFncykKKyAgICAgICAgICAgICAgICBmbGFnc19tc2cgPSAnKEZMQUdTICglcykpJyAlICcgXFwnLmpvaW4oc2VsZi5mbGFncykKKyAgICAgICAgICAgICAgICBtc2cgPSAnKiAlcyBGRVRDSCAlcycgJSAoYXJnc1swXSwgZmxhZ3NfbXNnKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfbGluZShtc2cuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmRfdGFnZ2VkKHRhZywgJ09LJywgJ1NUT1JFIGNvbXBsZXRlZC4nKQorCisgICAgICAgIHdpdGggc2VsZi5yZWFwZWRfcGFpcihCcmFja2V0RmxhZ0hhbmRsZXIpIGFzIChzZXJ2ZXIsIGNsaWVudCk6CisgICAgICAgICAgICBjb2RlLCBkYXRhID0gY2xpZW50LmF1dGhlbnRpY2F0ZSgnTVlBVVRIJywgbGFtYmRhIHg6IGInZmFrZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUsICdPSycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5yZXNwb25zZSwgYidabUZyWlE9PVxyXG4nKQorICAgICAgICAgICAgY2xpZW50LnNlbGVjdCgndGVzdCcpCisgICAgICAgICAgICB0eXAsIFtkYXRhXSA9IGNsaWVudC5zdG9yZShiJzEnLCAiK0ZMQUdTIiwgIlt0ZXN0XSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGInW3Rlc3RdJywgZGF0YSkKKyAgICAgICAgICAgIGNsaWVudC5zZWxlY3QoJ3Rlc3QnKQorICAgICAgICAgICAgdHlwLCBbZGF0YV0gPSBjbGllbnQucmVzcG9uc2UoJ1BFUk1BTkVOVEZMQUdTJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidbdGVzdF0nLCBkYXRhKQorCisgICAgQHJlYXBfdGhyZWFkcwogICAgIGRlZiB0ZXN0X2lzc3VlNTk0OShzZWxmKToKIAogICAgICAgICBjbGFzcyBFT0ZIYW5kbGVyKHNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcC5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CmluZGV4IGVlOWVlMWEuLjRlY2UzNjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wLnB5CkBAIC02LDEzICs2LDEyIEBACiBpbXBvcnQgaW1wb3J0bGliLnV0aWwKIGltcG9ydCBvcwogaW1wb3J0IG9zLnBhdGgKLWltcG9ydCBzaHV0aWwKIGltcG9ydCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2FybmluZ3MKIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgaW1wb3J0IGltcAogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9jYXNlX3NlbnNpdGl2aXR5LnB5CmluZGV4IGMxMTJjYTcuLjBkZDljODYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weQpAQCAtMSw1ICsxLDQgQEAKIGZyb20gaW1wb3J0bGliIGltcG9ydCBfYm9vdHN0cmFwX2V4dGVybmFsCi1pbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCkBAIC05LDggKzgsNiBAQAogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAogCi0jIFhYWCBmaW5kX3NwZWMgdGVzdHMKLQogQHVuaXR0ZXN0LnNraXBJZih1dGlsLkVYVEVOU0lPTlMuZmlsZW5hbWUgaXMgTm9uZSwgJ190ZXN0Y2FwaSBub3QgYXZhaWxhYmxlJykKIEB1dGlsLmNhc2VfaW5zZW5zaXRpdmVfdGVzdHMKIGNsYXNzIEV4dGVuc2lvbk1vZHVsZUNhc2VTZW5zaXRpdml0eVRlc3QodXRpbC5DQVNFT0tUZXN0QmFzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9maW5kZXIucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9maW5kZXIucHkKaW5kZXggNzFiZjY3Zi4uYzliNGEzNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfZmluZGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X2ZpbmRlci5weQpAQCAtNiw3ICs2LDYgQEAKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHdhcm5pbmdzCiAKLSMgWFhYIGZpbmRfc3BlYyB0ZXN0cwogCiBjbGFzcyBGaW5kZXJUZXN0cyhhYmMuRmluZGVyVGVzdHMpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9wYXRoX2hvb2sucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9leHRlbnNpb24vdGVzdF9wYXRoX2hvb2sucHkKaW5kZXggOGY0YjhiYi4uYTRiNWE2NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZXh0ZW5zaW9uL3Rlc3RfcGF0aF9ob29rLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2V4dGVuc2lvbi90ZXN0X3BhdGhfaG9vay5weQpAQCAtMiw4ICsyLDYgQEAKIAogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAotaW1wb3J0IGNvbGxlY3Rpb25zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9mcm96ZW4vdGVzdF9sb2FkZXIucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9mcm96ZW4vdGVzdF9sb2FkZXIucHkKaW5kZXggNjAzYzdkNy4uMjllY2ZmMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvZnJvemVuL3Rlc3RfbG9hZGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2Zyb3plbi90ZXN0X2xvYWRlci5weQpAQCAtMyw4ICszLDYgQEAKIAogbWFjaGluZXJ5ID0gdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWIubWFjaGluZXJ5JykKIAotCi1pbXBvcnQgc3lzCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0CiBpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X19fcGFja2FnZV9fLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X19fcGFja2FnZV9fLnB5CmluZGV4IGM3ZDNhMmEuLjdmNjQ1NDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9fX3BhY2thZ2VfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfX19wYWNrYWdlX18ucHkKQEAgLTUsNiArNSw3IEBACiAKICIiIgogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKIGZyb20gLi4gaW1wb3J0IHV0aWwKIAogCkBAIC0zMywzMSArMzQsNTAgQEAKIAogICAgICIiIgogCi0gICAgZGVmIHRlc3RfdXNpbmdfX19wYWNrYWdlX18oc2VsZik6Ci0gICAgICAgICMgW19fcGFja2FnZV9fXQorICAgIGRlZiBpbXBvcnRfbW9kdWxlKHNlbGYsIGdsb2JhbHNfKToKICAgICAgICAgd2l0aCBzZWxmLm1vY2tfbW9kdWxlcygncGtnLl9faW5pdF9fJywgJ3BrZy5mYWtlJykgYXMgaW1wb3J0ZXI6CiAgICAgICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1baW1wb3J0ZXJdKToKICAgICAgICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3BrZy5mYWtlJykKICAgICAgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLl9faW1wb3J0X18oJycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9eydfX3BhY2thZ2VfXyc6ICdwa2cuZmFrZSd9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdD1bJ2F0dHInXSwgbGV2ZWw9MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscz1nbG9iYWxzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbWxpc3Q9WydhdHRyJ10sIGxldmVsPTIpCisgICAgICAgIHJldHVybiBtb2R1bGUKKworICAgIGRlZiB0ZXN0X3VzaW5nX19fcGFja2FnZV9fKHNlbGYpOgorICAgICAgICAjIFtfX3BhY2thZ2VfX10KKyAgICAgICAgbW9kdWxlID0gc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19wYWNrYWdlX18nOiAncGtnLmZha2UnfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdwa2cnKQogCi0gICAgZGVmIHRlc3RfdXNpbmdfX19uYW1lX18oc2VsZiwgcGFja2FnZV9hc19Ob25lPUZhbHNlKToKKyAgICBkZWYgdGVzdF91c2luZ19fX25hbWVfXyhzZWxmKToKICAgICAgICAgIyBbX19uYW1lX19dCi0gICAgICAgIGdsb2JhbHNfID0geydfX25hbWVfXyc6ICdwa2cuZmFrZScsICdfX3BhdGhfXyc6IFtdfQotICAgICAgICBpZiBwYWNrYWdlX2FzX05vbmU6Ci0gICAgICAgICAgICBnbG9iYWxzX1snX19wYWNrYWdlX18nXSA9IE5vbmUKLSAgICAgICAgd2l0aCBzZWxmLm1vY2tfbW9kdWxlcygncGtnLl9faW5pdF9fJywgJ3BrZy5mYWtlJykgYXMgaW1wb3J0ZXI6Ci0gICAgICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1baW1wb3J0ZXJdKToKLSAgICAgICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3BrZy5mYWtlJykKLSAgICAgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLl9faW1wb3J0X18oJycsIGdsb2JhbHM9IGdsb2JhbHNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbWxpc3Q9WydhdHRyJ10sIGxldmVsPTIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ3BrZycpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuaW1wb3J0X21vZHVsZSh7J19fbmFtZV9fJzogJ3BrZy5mYWtlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fcGF0aF9fJzogW119KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ3BrZycpCisKKyAgICBkZWYgdGVzdF93YXJuX3doZW5fdXNpbmdfX19uYW1lX18oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhJbXBvcnRXYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYuaW1wb3J0X21vZHVsZSh7J19fbmFtZV9fJzogJ3BrZy5mYWtlJywgJ19fcGF0aF9fJzogW119KQogCiAgICAgZGVmIHRlc3RfTm9uZV9hc19fX3BhY2thZ2VfXyhzZWxmKToKICAgICAgICAgIyBbTm9uZV0KLSAgICAgICAgc2VsZi50ZXN0X3VzaW5nX19fbmFtZV9fKHBhY2thZ2VfYXNfTm9uZT1UcnVlKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCisgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLmltcG9ydF9tb2R1bGUoeworICAgICAgICAgICAgICAgICdfX25hbWVfXyc6ICdwa2cuZmFrZScsICdfX3BhdGhfXyc6IFtdLCAnX19wYWNrYWdlX18nOiBOb25lIH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKKworICAgIGRlZiB0ZXN0X3NwZWNfZmFsbGJhY2soc2VsZik6CisgICAgICAgICMgSWYgX19wYWNrYWdlX18gaXNuJ3QgZGVmaW5lZCwgZmFsbCBiYWNrIG9uIF9fc3BlY19fLnBhcmVudC4KKyAgICAgICAgbW9kdWxlID0gc2VsZi5pbXBvcnRfbW9kdWxlKHsnX19zcGVjX18nOiBGYWtlU3BlYygncGtnLmZha2UnKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAncGtnJykKKworICAgIGRlZiB0ZXN0X3dhcm5fd2hlbl9wYWNrYWdlX2FuZF9zcGVjX2Rpc2FncmVlKHNlbGYpOgorICAgICAgICAjIFJhaXNlIGFuIEltcG9ydFdhcm5pbmcgaWYgX19wYWNrYWdlX18gIT0gX19zcGVjX18ucGFyZW50LgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoSW1wb3J0V2FybmluZyk6CisgICAgICAgICAgICBzZWxmLmltcG9ydF9tb2R1bGUoeydfX3BhY2thZ2VfXyc6ICdwa2cuZmFrZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfX3NwZWNfXyc6IEZha2VTcGVjKCdwa2cuZmFrZWZha2UnKX0pCiAKICAgICBkZWYgdGVzdF9iYWRfX3BhY2thZ2VfXyhzZWxmKToKICAgICAgICAgZ2xvYmFscyA9IHsnX19wYWNrYWdlX18nOiAnPG5vdCByZWFsPid9CkBAIC03MCw2ICs5MCwxMSBAQAogICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCcnLCBnbG9iYWxzLCB7fSwgWydyZWxpbXBvcnQnXSwgMSkKIAogCitjbGFzcyBGYWtlU3BlYzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50KToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKworCiBjbGFzcyBVc2luZ19fcGFja2FnZV9fUEVQMzAyKFVzaW5nX19wYWNrYWdlX18pOgogICAgIG1vY2tfbW9kdWxlcyA9IHV0aWwubW9ja19tb2R1bGVzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9tZXRhX3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfbWV0YV9wYXRoLnB5CmluZGV4IGM0NTJjZGQuLjVhNDFlODkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9tZXRhX3BhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X21ldGFfcGF0aC5weQpAQCAtNzYsNyArNzYsNiBAQAogICAgICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXyhtb2RfbmFtZSkKICAgICAgICAgICAgICAgICBhc3NlcnQgbGVuKGxvZykgPT0gMQogICAgICAgICAgICAgICAgIGFyZ3MgPSBsb2dbMF1bMF0KLSAgICAgICAgICAgICAgICBrd2FyZ3MgPSBsb2dbMF1bMV0KICAgICAgICAgICAgICAgICAjIEFzc3VtaW5nIGFsbCBhcmd1bWVudHMgYXJlIHBvc2l0aW9uYWwuCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzWzBdLCBtb2RfbmFtZSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShhcmdzWzFdKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhY2thZ2VzLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhY2thZ2VzLnB5CmluZGV4IDM3NTViODQuLjI0Mzk2MDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYWNrYWdlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9pbXBvcnRfL3Rlc3RfcGFja2FnZXMucHkKQEAgLTEsNyArMSw2IEBACiBmcm9tIC4uIGltcG9ydCB1dGlsCiBpbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCBpbXBvcnRsaWIKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9wYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhdGgucHkKaW5kZXggYjMyYTg3Ni4uN2FhMjZiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3BhdGgucHkKQEAgLTE2LDExICsxNiwxNCBAQAogCiAgICAgIiIiVGVzdHMgZm9yIFBhdGhGaW5kZXIuIiIiCiAKKyAgICBmaW5kID0gTm9uZQorICAgIGNoZWNrX2ZvdW5kID0gTm9uZQorCiAgICAgZGVmIHRlc3RfZmFpbHVyZShzZWxmKToKICAgICAgICAgIyBUZXN0IE5vbmUgcmV0dXJuZWQgdXBvbiBub3QgZmluZGluZyBhIHN1aXRhYmxlIGxvYWRlci4KICAgICAgICAgbW9kdWxlID0gJzx0ZXN0IG1vZHVsZT4nCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZmluZChtb2R1bGUpKQogCiAgICAgZGVmIHRlc3Rfc3lzX3BhdGgoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IHN5cy5wYXRoIGlzIHVzZWQgd2hlbiAncGF0aCcgaXMgTm9uZS4KQEAgLTMwLDggKzMzLDggQEAKICAgICAgICAgaW1wb3J0ZXIgPSB1dGlsLm1vY2tfc3BlYyhtb2R1bGUpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aF9pbXBvcnRlcl9jYWNoZT17cGF0aDogaW1wb3J0ZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg9W3BhdGhdKToKLSAgICAgICAgICAgIGxvYWRlciA9IHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhsb2FkZXIsIGltcG9ydGVyKQorICAgICAgICAgICAgZm91bmQgPSBzZWxmLmZpbmQobW9kdWxlKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3VuZChmb3VuZCwgaW1wb3J0ZXIpCiAKICAgICBkZWYgdGVzdF9wYXRoKHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCAncGF0aCcgaXMgdXNlZCB3aGVuIHNldC4KQEAgLTQwLDggKzQzLDggQEAKICAgICAgICAgcGF0aCA9ICc8dGVzdCBwYXRoPicKICAgICAgICAgaW1wb3J0ZXIgPSB1dGlsLm1vY2tfc3BlYyhtb2R1bGUpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aF9pbXBvcnRlcl9jYWNoZT17cGF0aDogaW1wb3J0ZXJ9KToKLSAgICAgICAgICAgIGxvYWRlciA9IHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlLCBbcGF0aF0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKGxvYWRlciwgaW1wb3J0ZXIpCisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZmluZChtb2R1bGUsIFtwYXRoXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm91bmQoZm91bmQsIGltcG9ydGVyKQogCiAgICAgZGVmIHRlc3RfZW1wdHlfbGlzdChzZWxmKToKICAgICAgICAgIyBBbiBlbXB0eSBsaXN0IHNob3VsZCBub3QgY291bnQgYXMgYXNraW5nIGZvciBzeXMucGF0aC4KQEAgLTUwLDcgKzUzLDcgQEAKICAgICAgICAgaW1wb3J0ZXIgPSB1dGlsLm1vY2tfc3BlYyhtb2R1bGUpCiAgICAgICAgIHdpdGggdXRpbC5pbXBvcnRfc3RhdGUocGF0aF9pbXBvcnRlcl9jYWNoZT17cGF0aDogaW1wb3J0ZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg9W3BhdGhdKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUoJ21vZHVsZScsIFtdKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZmluZCgnbW9kdWxlJywgW10pKQogCiAgICAgZGVmIHRlc3RfcGF0aF9ob29rcyhzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgc3lzLnBhdGhfaG9va3MgaXMgdXNlZC4KQEAgLTYwLDggKzYzLDggQEAKICAgICAgICAgaW1wb3J0ZXIgPSB1dGlsLm1vY2tfc3BlYyhtb2R1bGUpCiAgICAgICAgIGhvb2sgPSB1dGlsLm1vY2tfcGF0aF9ob29rKHBhdGgsIGltcG9ydGVyPWltcG9ydGVyKQogICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGhfaG9va3M9W2hvb2tdKToKLSAgICAgICAgICAgIGxvYWRlciA9IHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUobW9kdWxlLCBbcGF0aF0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKGxvYWRlciwgaW1wb3J0ZXIpCisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuZmluZChtb2R1bGUsIFtwYXRoXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm91bmQoZm91bmQsIGltcG9ydGVyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihwYXRoLCBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVbcGF0aF0sIGltcG9ydGVyKQogCkBAIC03Myw3ICs3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD1bcGF0aF9lbnRyeV0pOgogICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Fsd2F5cycpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5tYWNoaW5lcnkuUGF0aEZpbmRlci5maW5kX21vZHVsZSgnb3MnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLmZpbmQoJ29zJykpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVbcGF0aF9lbnRyeV0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDEpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Mod1stMV0uY2F0ZWdvcnksIEltcG9ydFdhcm5pbmcpKQpAQCAtODUsOCArODgsOCBAQAogICAgICAgICBpbXBvcnRlciA9IHV0aWwubW9ja19zcGVjKG1vZHVsZSkKICAgICAgICAgaG9vayA9IHV0aWwubW9ja19wYXRoX2hvb2sob3MuZ2V0Y3dkKCksIGltcG9ydGVyPWltcG9ydGVyKQogICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W3BhdGhdLCBwYXRoX2hvb2tzPVtob29rXSk6Ci0gICAgICAgICAgICBsb2FkZXIgPSBzZWxmLm1hY2hpbmVyeS5QYXRoRmluZGVyLmZpbmRfbW9kdWxlKG1vZHVsZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMobG9hZGVyLCBpbXBvcnRlcikKKyAgICAgICAgICAgIGZvdW5kID0gc2VsZi5maW5kKG1vZHVsZSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm91bmQoZm91bmQsIGltcG9ydGVyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihvcy5nZXRjd2QoKSwgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUpCiAKICAgICBkZWYgdGVzdF9Ob25lX29uX3N5c19wYXRoKHNlbGYpOgpAQCAtMTgyLDE1ICsxODUsNTAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCd3aGF0ZXZlcicpKQogCiAKK2NsYXNzIEZpbmRNb2R1bGVUZXN0cyhGaW5kZXJUZXN0cyk6CisgICAgZGVmIGZpbmQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBjaGVja19mb3VuZChzZWxmLCBmb3VuZCwgaW1wb3J0ZXIpOgorICAgICAgICBzZWxmLmFzc2VydElzKGZvdW5kLCBpbXBvcnRlcikKIAogCi0oRnJvemVuX0ZpbmRlclRlc3RzLAotIFNvdXJjZV9GaW5kZXJUZXN0cwotICkgPSB1dGlsLnRlc3RfYm90aChGaW5kZXJUZXN0cywgaW1wb3J0bGliPWltcG9ydGxpYiwgbWFjaGluZXJ5PW1hY2hpbmVyeSkKKyhGcm96ZW5fRmluZE1vZHVsZVRlc3RzLAorIFNvdXJjZV9GaW5kTW9kdWxlVGVzdHMKKykgPSB1dGlsLnRlc3RfYm90aChGaW5kTW9kdWxlVGVzdHMsIGltcG9ydGxpYj1pbXBvcnRsaWIsIG1hY2hpbmVyeT1tYWNoaW5lcnkpCisKKworY2xhc3MgRmluZFNwZWNUZXN0cyhGaW5kZXJUZXN0cyk6CisgICAgZGVmIGZpbmQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgY2hlY2tfZm91bmQoc2VsZiwgZm91bmQsIGltcG9ydGVyKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhmb3VuZC5sb2FkZXIsIGltcG9ydGVyKQorCisKKyhGcm96ZW5fRmluZFNwZWNUZXN0cywKKyBTb3VyY2VfRmluZFNwZWNUZXN0cworICkgPSB1dGlsLnRlc3RfYm90aChGaW5kU3BlY1Rlc3RzLCBpbXBvcnRsaWI9aW1wb3J0bGliLCBtYWNoaW5lcnk9bWFjaGluZXJ5KQogCiAKIGNsYXNzIFBhdGhFbnRyeUZpbmRlclRlc3RzOgogCisgICAgZGVmIHRlc3RfZmluZGVyX3dpdGhfZmFpbGluZ19maW5kX3NwZWMoc2VsZik6CisgICAgICAgICMgUGF0aEVudHJ5RmluZGVyIHdpdGggZmluZF9tb2R1bGUoKSBkZWZpbmVkIHNob3VsZCB3b3JrLgorICAgICAgICAjIElzc3VlICMyMDc2My4KKyAgICAgICAgY2xhc3MgRmluZGVyOgorICAgICAgICAgICAgcGF0aF9sb2NhdGlvbiA9ICd0ZXN0X2ZpbmRlcl93aXRoX2ZpbmRfbW9kdWxlJworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgorICAgICAgICAgICAgICAgIGlmIHBhdGggIT0gc2VsZi5wYXRoX2xvY2F0aW9uOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcgorCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgZmluZF9tb2R1bGUoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKworICAgICAgICB3aXRoIHV0aWwuaW1wb3J0X3N0YXRlKHBhdGg9W0ZpbmRlci5wYXRoX2xvY2F0aW9uXStzeXMucGF0aFs6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2hvb2tzPVtGaW5kZXJdKToKKyAgICAgICAgICAgIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9zcGVjKCdpbXBvcnRsaWInKQorCiAgICAgZGVmIHRlc3RfZmluZGVyX3dpdGhfZmFpbGluZ19maW5kX21vZHVsZShzZWxmKToKICAgICAgICAgIyBQYXRoRW50cnlGaW5kZXIgd2l0aCBmaW5kX21vZHVsZSgpIGRlZmluZWQgc2hvdWxkIHdvcmsuCiAgICAgICAgICMgSXNzdWUgIzIwNzYzLgpAQCAtMjA3LDcgKzI0NSw3IEBACiAKICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShwYXRoPVtGaW5kZXIucGF0aF9sb2NhdGlvbl0rc3lzLnBhdGhbOl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9ob29rcz1bRmluZGVyXSk6Ci0gICAgICAgICAgICBzZWxmLm1hY2hpbmVyeS5QYXRoRmluZGVyLmZpbmRfc3BlYygnaW1wb3J0bGliJykKKyAgICAgICAgICAgIHNlbGYubWFjaGluZXJ5LlBhdGhGaW5kZXIuZmluZF9tb2R1bGUoJ2ltcG9ydGxpYicpCiAKIAogKEZyb3plbl9QRUZUZXN0cywKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL2ltcG9ydF8vdGVzdF9yZWxhdGl2ZV9pbXBvcnRzLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3JlbGF0aXZlX2ltcG9ydHMucHkKaW5kZXggM2JiODE5Zi4uOGE5NWEzMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3JlbGF0aXZlX2ltcG9ydHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvaW1wb3J0Xy90ZXN0X3JlbGF0aXZlX2ltcG9ydHMucHkKQEAgLTEsNyArMSw4IEBACiAiIiJUZXN0IHJlbGF0aXZlIGltcG9ydHMgKFBFUCAzMjgpLiIiIgogZnJvbSAuLiBpbXBvcnQgdXRpbAotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKwogCiBjbGFzcyBSZWxhdGl2ZUltcG9ydHM6CiAKQEAgLTY1LDkgKzY2LDExIEBACiAgICAgICAgICAgICAgICAgdW5jYWNoZV9uYW1lcy5hcHBlbmQobmFtZVs6LWxlbignLl9faW5pdF9fJyldKQogICAgICAgICB3aXRoIHV0aWwubW9ja19zcGVjKCpjcmVhdGUpIGFzIGltcG9ydGVyOgogICAgICAgICAgICAgd2l0aCB1dGlsLmltcG9ydF9zdGF0ZShtZXRhX3BhdGg9W2ltcG9ydGVyXSk6Ci0gICAgICAgICAgICAgICAgZm9yIGdsb2JhbF8gaW4gZ2xvYmFsc186Ci0gICAgICAgICAgICAgICAgICAgIHdpdGggdXRpbC51bmNhY2hlKCp1bmNhY2hlX25hbWVzKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGdsb2JhbF8pCisgICAgICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCisgICAgICAgICAgICAgICAgICAgIGZvciBnbG9iYWxfIGluIGdsb2JhbHNfOgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB1dGlsLnVuY2FjaGUoKnVuY2FjaGVfbmFtZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGdsb2JhbF8pCiAKIAogICAgIGRlZiB0ZXN0X21vZHVsZV9mcm9tX21vZHVsZShzZWxmKToKQEAgLTIwNCwxMSArMjA3LDE4IEBACiAKICAgICBkZWYgdGVzdF9yZWxhdGl2ZV9pbXBvcnRfbm9fZ2xvYmFscyhzZWxmKToKICAgICAgICAgIyBObyBnbG9iYWxzIGZvciBhIHJlbGF0aXZlIGltcG9ydCBpcyBhbiBlcnJvci4KLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6Ci0gICAgICAgICAgICBzZWxmLl9faW1wb3J0X18oJ3N5cycsIGxldmVsPTEpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnc3lzJywgbGV2ZWw9MSkKKworICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF9ub19wYWNrYWdlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIHNlbGYuX19pbXBvcnRfXygnYScsIHsnX19wYWNrYWdlX18nOiAnJywgJ19fc3BlY19fJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9MSkKIAogICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF9ub19wYWNrYWdlX2V4aXN0c19hYnNvbHV0ZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvcik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgogICAgICAgICAgICAgc2VsZi5fX2ltcG9ydF9fKCdzeXMnLCB7J19fcGFja2FnZV9fJzogJycsICdfX3NwZWNfXyc6IE5vbmV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPTEpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3JlZ3J0ZXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvcmVncnRlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YmUxMWYuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvcmVncnRlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0iIiJSdW4gUHl0aG9uJ3Mgc3RhbmRhcmQgdGVzdCBzdWl0ZSB1c2luZyBpbXBvcnRsaWIuX19pbXBvcnRfXy4KLQotVGVzdHMga25vd24gdG8gZmFpbCBiZWNhdXNlIG9mIGFzc3VtcHRpb25zIHRoYXQgaW1wb3J0bGliIChwcm9wZXJseSkKLWludmFsaWRhdGVzIGFyZSBhdXRvbWF0aWNhbGx5IHNraXBwZWQgaWYgdGhlIGVudGlyZSB0ZXN0IHN1aXRlIGlzIHJ1bi4KLU90aGVyd2lzZSBhbGwgY29tbWFuZC1saW5lIG9wdGlvbnMgdmFsaWQgZm9yIHRlc3QucmVncnRlc3QgYXJlIGFsc28gdmFsaWQgZm9yCi10aGlzIHNjcmlwdC4KLQotIiIiCi1pbXBvcnQgaW1wb3J0bGliCi1pbXBvcnQgc3lzCi1mcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0Ci0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgX19idWlsdGluc19fLl9faW1wb3J0X18gPSBpbXBvcnRsaWIuX19pbXBvcnRfXwotICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNsZWFyKCkKLQotICAgIHJlZ3J0ZXN0Lm1haW4ocXVpZXQ9VHJ1ZSwgdmVyYm9zZTI9VHJ1ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9jYXNlX3NlbnNpdGl2aXR5LnB5CmluZGV4IDM0Yjg2Y2QuLjEyY2UwY2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfY2FzZV9zZW5zaXRpdml0eS5weQpAQCAtNSw3ICs1LDYgQEAKIG1hY2hpbmVyeSA9IHV0aWwuaW1wb3J0X2ltcG9ydGxpYignaW1wb3J0bGliLm1hY2hpbmVyeScpCiAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0IGFzIHRlc3Rfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X2ZpbGVfbG9hZGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfZmlsZV9sb2FkZXIucHkKaW5kZXggNzNmNGM2Mi4uYTE1MTE0OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfZmlsZV9sb2FkZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfZmlsZV9sb2FkZXIucHkKQEAgLTIxNyw3ICsyMTcsNyBAQAogICAgICAgICAgICAgIyBQRVAgMzAyCiAgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CiAgICAgICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdpZ25vcmUnLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICAgICAgbW9kID0gbG9hZGVyLmxvYWRfbW9kdWxlKCdfdGVtcCcpICMgWFhYCisgICAgICAgICAgICAgICAgbW9kID0gbG9hZGVyLmxvYWRfbW9kdWxlKCdfdGVtcCcpCiAgICAgICAgICAgICAjIFNhbml0eSBjaGVja3MuCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5fX2NhY2hlZF9fLCBjb21waWxlZCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLngsIDUpCkBAIC0yNDUsMTIgKzI0NSw3IEBACiBjbGFzcyBCYWRCeXRlY29kZVRlc3Q6CiAKICAgICBkZWYgaW1wb3J0XyhzZWxmLCBmaWxlLCBtb2R1bGVfbmFtZSk6Ci0gICAgICAgIGxvYWRlciA9IHNlbGYubG9hZGVyKG1vZHVsZV9uYW1lLCBmaWxlKQotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgICMgWFhYIENoYW5nZSB0byB1c2UgZXhlY19tb2R1bGUoKS4KLSAgICAgICAgICAgIG1vZHVsZSA9IGxvYWRlci5sb2FkX21vZHVsZShtb2R1bGVfbmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGVfbmFtZSwgc3lzLm1vZHVsZXMpCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKIAogICAgIGRlZiBtYW5pcHVsYXRlX2J5dGVjb2RlKHNlbGYsIG5hbWUsIG1hcHBpbmcsIG1hbmlwdWxhdG9yLCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbF9zb3VyY2U9RmFsc2UpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfcGF0aF9ob29rLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3RfcGF0aF9ob29rLnB5CmluZGV4IGU2YTI0MTUuLjc5NWQ0MzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3BhdGhfaG9vay5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9wYXRoX2hvb2sucHkKQEAgLTE2LDEwICsxNiwxOSBAQAogICAgIGRlZiB0ZXN0X3N1Y2Nlc3Moc2VsZik6CiAgICAgICAgIHdpdGggdXRpbC5jcmVhdGVfbW9kdWxlcygnZHVtbXknKSBhcyBtYXBwaW5nOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5wYXRoX2hvb2soKShtYXBwaW5nWycucm9vdCddKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5kX21vZHVsZScpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmRfc3BlYycpKQorCisgICAgZGVmIHRlc3Rfc3VjY2Vzc19sZWdhY3koc2VsZik6CisgICAgICAgIHdpdGggdXRpbC5jcmVhdGVfbW9kdWxlcygnZHVtbXknKSBhcyBtYXBwaW5nOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5wYXRoX2hvb2soKShtYXBwaW5nWycucm9vdCddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaW5kX21vZHVsZScpKQogCiAgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIFRoZSBlbXB0eSBzdHJpbmcgcmVwcmVzZW50cyB0aGUgY3dkLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnBhdGhfaG9vaygpKCcnKSwgJ2ZpbmRfc3BlYycpKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nX2xlZ2FjeShzZWxmKToKKyAgICAgICAgIyBUaGUgZW1wdHkgc3RyaW5nIHJlcHJlc2VudHMgdGhlIGN3ZC4KICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5wYXRoX2hvb2soKSgnJyksICdmaW5kX21vZHVsZScpKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3NvdXJjZV9lbmNvZGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3NvdXJjZS90ZXN0X3NvdXJjZV9lbmNvZGluZy5weQppbmRleCAxZTA3NzFiLi45ODA4NTVmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi9zb3VyY2UvdGVzdF9zb3VyY2VfZW5jb2RpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvc291cmNlL3Rlc3Rfc291cmNlX2VuY29kaW5nLnB5CkBAIC01LDcgKzUsNiBAQAogaW1wb3J0IGNvZGVjcwogaW1wb3J0IGltcG9ydGxpYi51dGlsCiBpbXBvcnQgcmUKLWltcG9ydCBzeXMKIGltcG9ydCB0eXBlcwogIyBCZWNhdXNlIHN5cy5wYXRoIGdldHMgZXNzZW50aWFsbHkgYmxhbmtlZCwgbmVlZCB0byBoYXZlIHVuaWNvZGVkYXRhIGFscmVhZHkKICMgaW1wb3J0ZWQgZm9yIHRoZSBwYXJzZXIgdG8gdXNlLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hYmMucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FiYy5weQppbmRleCBkNGJmOTE1Li5jODYyNDgwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FiYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2FiYy5weQpAQCAtMjA3LDYgKzIwNywxMCBAQAogCiAgICAgU1BMSVQgPSBtYWtlX2FiY19zdWJjbGFzc2VzKExvYWRlcikKIAorICAgIGRlZiB0ZXN0X2NyZWF0ZV9tb2R1bGUoc2VsZik6CisgICAgICAgIHNwZWMgPSAnYSBzcGVjJworICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLmlucy5jcmVhdGVfbW9kdWxlKHNwZWMpKQorCiAgICAgZGVmIHRlc3RfbG9hZF9tb2R1bGUoc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgogICAgICAgICAgICAgc2VsZi5pbnMubG9hZF9tb2R1bGUoJ3NvbWV0aGluZycpCkBAIC01MTksNiArNTIzLDEyIEBACiAgICAgICAgIHN1cHBvcnQudW5sb2FkKHNlbGYubW9kdWxlX25hbWUpCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubG9hZCwgc2VsZi5tb2R1bGVfbmFtZSkKIAorICAgIGRlZiBsb2FkKHNlbGYsIGxvYWRlcik6CisgICAgICAgIHNwZWMgPSBzZWxmLnV0aWwuc3BlY19mcm9tX2xvYWRlcihzZWxmLm1vZHVsZV9uYW1lLCBsb2FkZXIpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5pdC5fYm9vdHN0cmFwLl9sb2FkX3VubG9ja2VkKHNwZWMpCisKICAgICBkZWYgbW9ja19nZXRfY29kZShzZWxmKToKICAgICAgICAgcmV0dXJuIG1vY2sucGF0Y2gub2JqZWN0KHNlbGYuSW5zcGVjdExvYWRlclN1YmNsYXNzLCAnZ2V0X2NvZGUnKQogCkBAIC01MjgsOSArNTM4LDcgQEAKICAgICAgICAgICAgIG1vY2tlZF9nZXRfY29kZS5zaWRlX2VmZmVjdCA9IEltcG9ydEVycm9yCiAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKICAgICAgICAgICAgICAgICBsb2FkZXIgPSBzZWxmLkluc3BlY3RMb2FkZXJTdWJjbGFzcygpCi0gICAgICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKHNlbGYubW9kdWxlX25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5sb2FkKGxvYWRlcikKIAogICAgIGRlZiB0ZXN0X2dldF9jb2RlX05vbmUoc2VsZik6CiAgICAgICAgICMgSWYgZ2V0X2NvZGUoKSByZXR1cm5zIE5vbmUsIHJhaXNlIEltcG9ydEVycm9yLgpAQCAtNTM4LDcgKzU0Niw3IEBACiAgICAgICAgICAgICBtb2NrZWRfZ2V0X2NvZGUucmV0dXJuX3ZhbHVlID0gTm9uZQogICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CiAgICAgICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5JbnNwZWN0TG9hZGVyU3ViY2xhc3MoKQotICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkX21vZHVsZShzZWxmLm1vZHVsZV9uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYubG9hZChsb2FkZXIpCiAKICAgICBkZWYgdGVzdF9tb2R1bGVfcmV0dXJuZWQoc2VsZik6CiAgICAgICAgICMgVGhlIGxvYWRlZCBtb2R1bGUgc2hvdWxkIGJlIHJldHVybmVkLgpAQCAtNTQ2LDE0ICs1NTQsMTYgQEAKICAgICAgICAgd2l0aCBzZWxmLm1vY2tfZ2V0X2NvZGUoKSBhcyBtb2NrZWRfZ2V0X2NvZGU6CiAgICAgICAgICAgICBtb2NrZWRfZ2V0X2NvZGUucmV0dXJuX3ZhbHVlID0gY29kZQogICAgICAgICAgICAgbG9hZGVyID0gc2VsZi5JbnNwZWN0TG9hZGVyU3ViY2xhc3MoKQotICAgICAgICAgICAgbW9kdWxlID0gbG9hZGVyLmxvYWRfbW9kdWxlKHNlbGYubW9kdWxlX25hbWUpCisgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLmxvYWQobG9hZGVyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUsIHN5cy5tb2R1bGVzW3NlbGYubW9kdWxlX25hbWVdKQogCiAKIChGcm96ZW5fSUxMb2FkTW9kdWxlVGVzdHMsCiAgU291cmNlX0lMTG9hZE1vZHVsZVRlc3RzCiAgKSA9IHRlc3RfdXRpbC50ZXN0X2JvdGgoSW5zcGVjdExvYWRlckxvYWRNb2R1bGVUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbnNwZWN0TG9hZGVyU3ViY2xhc3M9U1BMSVRfSUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5zcGVjdExvYWRlclN1YmNsYXNzPVNQTElUX0lMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQ9aW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsPXV0aWwpCiAKIAogIyMjIyMgRXhlY3V0aW9uTG9hZGVyIGNvbmNyZXRlIG1ldGhvZHMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfYXBpLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hcGkucHkKaW5kZXggNmJjM2M1Ni4uYjBhOTRhYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hcGkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9hcGkucHkKQEAgLTk5LDkgKzk5LDcgQEAKIAogY2xhc3MgRmluZExvYWRlclRlc3RzOgogCi0gICAgY2xhc3MgRmFrZU1ldGFGaW5kZXI6Ci0gICAgICAgIEBzdGF0aWNtZXRob2QKLSAgICAgICAgZGVmIGZpbmRfbW9kdWxlKG5hbWUsIHBhdGg9Tm9uZSk6IHJldHVybiBuYW1lLCBwYXRoCisgICAgRmFrZU1ldGFGaW5kZXIgPSBOb25lCiAKICAgICBkZWYgdGVzdF9zeXNfbW9kdWxlcyhzZWxmKToKICAgICAgICAgIyBJZiBhIG1vZHVsZSB3aXRoIF9fbG9hZGVyX18gaXMgaW4gc3lzLm1vZHVsZXMsIHRoZW4gcmV0dXJuIGl0LgpAQCAtMTcxLDkgKzE2OSwzMCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5pbml0LmZpbmRfbG9hZGVyKCduZXZlcmdvaW5ndG9maW5kdGhpc21vZHVsZScpKQogCiAKLShGcm96ZW5fRmluZExvYWRlclRlc3RzLAotIFNvdXJjZV9GaW5kTG9hZGVyVGVzdHMKLSApID0gdGVzdF91dGlsLnRlc3RfYm90aChGaW5kTG9hZGVyVGVzdHMsIGluaXQ9aW5pdCkKK2NsYXNzIEZpbmRMb2FkZXJQRVA0NTFUZXN0cyhGaW5kTG9hZGVyVGVzdHMpOgorCisgICAgY2xhc3MgRmFrZU1ldGFGaW5kZXI6CisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVmIGZpbmRfc3BlYyhuYW1lLCBwYXRoPU5vbmUsIHRhcmdldD1Ob25lKToKKyAgICAgICAgICAgIHJldHVybiBtYWNoaW5lcnlbJ1NvdXJjZSddLk1vZHVsZVNwZWMobmFtZSwgKG5hbWUsIHBhdGgpKQorCisKKyhGcm96ZW5fRmluZExvYWRlclBFUDQ1MVRlc3RzLAorIFNvdXJjZV9GaW5kTG9hZGVyUEVQNDUxVGVzdHMKKyApID0gdGVzdF91dGlsLnRlc3RfYm90aChGaW5kTG9hZGVyUEVQNDUxVGVzdHMsIGluaXQ9aW5pdCkKKworCitjbGFzcyBGaW5kTG9hZGVyUEVQMzAyVGVzdHMoRmluZExvYWRlclRlc3RzKToKKworICAgIGNsYXNzIEZha2VNZXRhRmluZGVyOgorICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiBmaW5kX21vZHVsZShuYW1lLCBwYXRoPU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIG5hbWUsIHBhdGgKKworCisoRnJvemVuX0ZpbmRMb2FkZXJQRVAzMDJUZXN0cywKKyBTb3VyY2VfRmluZExvYWRlclBFUDMwMlRlc3RzCisgKSA9IHRlc3RfdXRpbC50ZXN0X2JvdGgoRmluZExvYWRlclBFUDMwMlRlc3RzLCBpbml0PWluaXQpCiAKIAogY2xhc3MgUmVsb2FkVGVzdHM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xhenkucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xhenkucHkKaW5kZXggY2MzODNjMi4uZmZkOGRjNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sYXp5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbGF6eS5weQpAQCAtNjYsNiArNjYsOCBAQAogICAgICAgICBzcGVjID0gdXRpbC5zcGVjX2Zyb21fbG9hZGVyKFRlc3RpbmdJbXBvcnRlci5tb2R1bGVfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLkxhenlMb2FkZXIobG9hZGVyKSkKICAgICAgICAgbW9kdWxlID0gc3BlYy5sb2FkZXIuY3JlYXRlX21vZHVsZShzcGVjKQorICAgICAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZHVsZSA9IHR5cGVzLk1vZHVsZVR5cGUoVGVzdGluZ0ltcG9ydGVyLm1vZHVsZV9uYW1lKQogICAgICAgICBtb2R1bGUuX19zcGVjX18gPSBzcGVjCiAgICAgICAgIG1vZHVsZS5fX2xvYWRlcl9fID0gc3BlYy5sb2FkZXIKICAgICAgICAgc3BlYy5sb2FkZXIuZXhlY19tb2R1bGUobW9kdWxlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sb2Nrcy5weSBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbG9ja3MucHkKaW5kZXggZGYwYWYxMi4uYjJhYWRmZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9sb2Nrcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X2xvY2tzLnB5CkBAIC0zLDcgKzMsNiBAQAogaW5pdCA9IHRlc3RfdXRpbC5pbXBvcnRfaW1wb3J0bGliKCdpbXBvcnRsaWInKQogCiBpbXBvcnQgc3lzCi1pbXBvcnQgdGltZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgd2Vha3JlZgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X25hbWVzcGFjZV9wa2dzLnB5IGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF9uYW1lc3BhY2VfcGtncy5weQppbmRleCA2NjM5NjEyLi5lMzdkOGExIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X25hbWVzcGFjZV9wa2dzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3RfbmFtZXNwYWNlX3BrZ3MucHkKQEAgLTEsMTMgKzEsMTAgQEAKIGltcG9ydCBjb250ZXh0bGliCi1pbXBvcnQgaW1wb3J0bGliLmFiYwotaW1wb3J0IGltcG9ydGxpYi5tYWNoaW5lcnkKK2ltcG9ydCBpbXBvcnRsaWIKIGltcG9ydCBvcwogaW1wb3J0IHN5cwotaW1wb3J0IHR5cGVzCiBpbXBvcnQgdW5pdHRlc3QKIAogZnJvbSB0ZXN0LnRlc3RfaW1wb3J0bGliIGltcG9ydCB1dGlsCi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CiAKICMgbmVlZGVkIHRlc3RzOgogIwpAQCAtNzEsNiArNjgsNyBAQAogICAgICAgICAjIFRPRE86IHdpbGwgd2UgZXZlciB3YW50IHRvIHBhc3MgZXhjX2luZm8gdG8gX19leGl0X18/CiAgICAgICAgIHNlbGYuY3R4Ll9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpCiAKKwogY2xhc3MgU2luZ2xlTmFtZXNwYWNlUGFja2FnZShOYW1lc3BhY2VQYWNrYWdlVGVzdCk6CiAgICAgcGF0aHMgPSBbJ3BvcnRpb24xJ10KIApAQCAtODcsNyArODUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZm9vKSwgIjxtb2R1bGUgJ2ZvbycgKG5hbWVzcGFjZSk+IikKIAogCi1jbGFzcyBEeW5hbWljUGF0aGVOYW1lc3BhY2VQYWNrYWdlKE5hbWVzcGFjZVBhY2thZ2VUZXN0KToKK2NsYXNzIER5bmFtaWNQYXRoTmFtZXNwYWNlUGFja2FnZShOYW1lc3BhY2VQYWNrYWdlVGVzdCk6CiAgICAgcGF0aHMgPSBbJ3BvcnRpb24xJ10KIAogICAgIGRlZiB0ZXN0X2R5bmFtaWNfcGF0aChzZWxmKToKQEAgLTI4OSw1ICsyODcsMzUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhX3Rlc3QuYXR0ciwgJ2luIG1vZHVsZScpCiAKIAorY2xhc3MgUmVsb2FkVGVzdHMoTmFtZXNwYWNlUGFja2FnZVRlc3QpOgorICAgIHBhdGhzID0gWydwb3J0aW9uMSddCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfcGFja2FnZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGZvby5vbmUKKyAgICAgICAgZm9vID0gaW1wb3J0bGliLnJlbG9hZChmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLm9uZS5hdHRyLCAncG9ydGlvbjEgZm9vIG9uZScpCisKKyAgICBkZWYgdGVzdF9jYW50X2ltcG9ydF9vdGhlcihzZWxmKToKKyAgICAgICAgaW1wb3J0IGZvbworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIGltcG9ydCBmb28udHdvCisgICAgICAgIGZvbyA9IGltcG9ydGxpYi5yZWxvYWQoZm9vKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIGltcG9ydCBmb28udHdvCisKKyAgICBkZWYgdGVzdF9keW5hbWljX3BhdGgoc2VsZik6CisgICAgICAgIGltcG9ydCBmb28ub25lCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgaW1wb3J0IGZvby50d28KKworICAgICAgICAjIE5vdyBtb2RpZnkgc3lzLnBhdGggYW5kIHJlbG9hZC4KKyAgICAgICAgc3lzLnBhdGguYXBwZW5kKG9zLnBhdGguam9pbihzZWxmLnJvb3QsICdwb3J0aW9uMicpKQorICAgICAgICBmb28gPSBpbXBvcnRsaWIucmVsb2FkKGZvbykKKworICAgICAgICAjIEFuZCBtYWtlIHN1cmUgZm9vLnR3byBpcyBub3cgaW1wb3J0YWJsZQorICAgICAgICBpbXBvcnQgZm9vLnR3bworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby50d28uYXR0ciwgJ3BvcnRpb24yIGZvbyB0d28nKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3dpbmRvd3MucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi90ZXN0X3dpbmRvd3MucHkKaW5kZXggYzg5M2JjZi4uMDA1YjY4NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdGVzdF93aW5kb3dzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3Rlc3Rfd2luZG93cy5weQpAQCAtNDAsNyArNDAsNyBAQAogICAgIGVsc2U6CiAgICAgICAgIHJvb3QgPSBtYWNoaW5lcnkuV2luZG93c1JlZ2lzdHJ5RmluZGVyLlJFR0lTVFJZX0tFWQogICAgIGtleSA9IHJvb3QuZm9ybWF0KGZ1bGxuYW1lPW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgc3lzX3ZlcnNpb249c3lzLnZlcnNpb25bOjNdKQorICAgICAgICAgICAgICAgICAgICAgIHN5c192ZXJzaW9uPSclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSkKICAgICB0cnk6CiAgICAgICAgIHdpdGggdGVtcF9tb2R1bGUobmFtZSwgImEgPSAxIikgYXMgbG9jYXRpb246CiAgICAgICAgICAgICBzdWJrZXkgPSBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIGtleSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3V0aWwucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGxpYi91dGlsLnB5CmluZGV4IDQzODk2YzUuLjY0ZTAzOWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0bGliL3V0aWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRsaWIvdXRpbC5weQpAQCAtMjY2LDcgKzI2Niw2IEBACiAgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIGlzX3BhY2thZ2UgPSBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJykKICAgICAgICAgc3BlYyA9IHV0aWwuc3BlY19mcm9tX2ZpbGVfbG9jYXRpb24oCiAgICAgICAgICAgICAgICAgZnVsbG5hbWUsIG1vZHVsZS5fX2ZpbGVfXywgbG9hZGVyPXNlbGYsCiAgICAgICAgICAgICAgICAgc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnM9Z2V0YXR0cihtb2R1bGUsICdfX3BhdGhfXycsIE5vbmUpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IDY3MWUwNWEuLjQ3MjQ0YWUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTMwLDYgKzMwLDcgQEAKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQogZnJvbSB0ZXN0IGltcG9ydCBpbnNwZWN0X2ZvZGRlciBhcyBtb2QKIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIyIGFzIG1vZDIKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiBmcm9tIHRlc3QudGVzdF9pbXBvcnQgaW1wb3J0IF9yZWFkeV90b19pbXBvcnQKIApAQCAtMzgsNyArMzksNyBAQAogIyBpc21vZHVsZSwgaXNjbGFzcywgaXNtZXRob2QsIGlzZnVuY3Rpb24sIGlzdHJhY2ViYWNrLCBpc2ZyYW1lLCBpc2NvZGUsCiAjIGlzYnVpbHRpbiwgaXNyb3V0aW5lLCBpc2dlbmVyYXRvciwgaXNnZW5lcmF0b3JmdW5jdGlvbiwgZ2V0bWVtYmVycywKICMgZ2V0ZG9jLCBnZXRmaWxlLCBnZXRtb2R1bGUsIGdldHNvdXJjZWZpbGUsIGdldGNvbW1lbnRzLCBnZXRzb3VyY2UsCi0jIGdldGNsYXNzdHJlZSwgZ2V0YXJnc3BlYywgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCisjIGdldGNsYXNzdHJlZSwgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCiAjIGN1cnJlbnRmcmFtZSwgc3RhY2ssIHRyYWNlLCBpc2RhdGFkZXNjcmlwdG9yCiAKICMgTk9URTogVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyByZWxhdGluZyB0byBpbnRlcmFjdGlvbiB3aXRoCkBAIC00MDAsNyArNDAxLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtY2FzZShpbnNwZWN0LmdldHNvdXJjZWZpbGUobW9kLnNwYW0pKSwgbW9kZmlsZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtY2FzZShpbnNwZWN0LmdldHNvdXJjZWZpbGUoZ2l0LmFidXNlKSksIG1vZGZpbGUpCiAgICAgICAgIGZuID0gIl9ub25fZXhpc3RpbmdfZmlsZW5hbWVfdXNlZF9mb3Jfc291cmNlZmlsZV90ZXN0LnB5IgotICAgICAgICBjbyA9IGNvbXBpbGUoIk5vbmUiLCBmbiwgImV4ZWMiKQorICAgICAgICBjbyA9IGNvbXBpbGUoIng9MSIsIGZuLCAiZXhlYyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKGNvKSwgTm9uZSkKICAgICAgICAgbGluZWNhY2hlLmNhY2hlW2NvLmNvX2ZpbGVuYW1lXSA9ICgxLCBOb25lLCAiTm9uZSIsIGNvLmNvX2ZpbGVuYW1lKQogICAgICAgICB0cnk6CkBAIC0yOTAyLDYgKzI5MDMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBub3QgYSB2YWxpZCBwYXJhbWV0ZXIgbmFtZScpOgogICAgICAgICAgICAgaW5zcGVjdC5QYXJhbWV0ZXIoJyQnLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlZBUl9LRVlXT1JEKQogCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIG5vdCBhIHZhbGlkIHBhcmFtZXRlciBuYW1lJyk6CisgICAgICAgICAgICBpbnNwZWN0LlBhcmFtZXRlcignLmEnLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlZBUl9LRVlXT1JEKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChWYWx1ZUVycm9yLCAnY2Fubm90IGhhdmUgZGVmYXVsdCB2YWx1ZXMnKToKICAgICAgICAgICAgIGluc3BlY3QuUGFyYW1ldGVyKCdhJywgZGVmYXVsdD00MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuVkFSX0tFWVdPUkQpCkBAIC0yOTg1LDYgKzI5OTAsMTcgQEAKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ25hbWUgbXVzdCBiZSBhIHN0cicpOgogICAgICAgICAgICAgaW5zcGVjdC5QYXJhbWV0ZXIoTm9uZSwga2luZD1pbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkpCiAKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2lnbmF0dXJlX3BhcmFtZXRlcl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wbGljaXQgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIGluIGFzJyk6CisgICAgICAgICAgICBpbnNwZWN0LlBhcmFtZXRlcignLjAnLCBraW5kPWluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWSkKKworICAgICAgICBwYXJhbSA9IGluc3BlY3QuUGFyYW1ldGVyKAorICAgICAgICAgICAgJy4wJywga2luZD1pbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09SX0tFWVdPUkQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0ua2luZCwgaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLm5hbWUsICdpbXBsaWNpdDAnKQorCiAgICAgZGVmIHRlc3Rfc2lnbmF0dXJlX3BhcmFtZXRlcl9pbW11dGFiaWxpdHkoc2VsZik6CiAgICAgICAgIHAgPSBpbnNwZWN0LlBhcmFtZXRlcignc3BhbScsIGtpbmQ9aW5zcGVjdC5QYXJhbWV0ZXIuS0VZV09SRF9PTkxZKQogCkBAIC0zMjMzLDYgKzMyNDksMTcgQEAKICAgICAgICAgYmEgPSBzaWcuYmluZChhcmdzPTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmEuYXJndW1lbnRzLCB7J2t3YXJncyc6IHsnYXJncyc6IDF9fSkKIAorICAgIEBjcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaWduYXR1cmVfYmluZF9pbXBsaWNpdF9hcmcoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE5NjExOiBnZXRjYWxsYXJncyBzaG91bGQgd29yayB3aXRoIHNldCBjb21wcmVoZW5zaW9ucworICAgICAgICBkZWYgbWFrZV9zZXQoKToKKyAgICAgICAgICAgIHJldHVybiB7eiAqIHogZm9yIHogaW4gcmFuZ2UoNSl9CisgICAgICAgIHNldGNvbXBfY29kZSA9IG1ha2Vfc2V0Ll9fY29kZV9fLmNvX2NvbnN0c1sxXQorICAgICAgICBzZXRjb21wX2Z1bmMgPSB0eXBlcy5GdW5jdGlvblR5cGUoc2V0Y29tcF9jb2RlLCB7fSkKKworICAgICAgICBpdGVyYXRvciA9IGl0ZXIocmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYWxsKHNldGNvbXBfZnVuYywgaXRlcmF0b3IpLCB7MCwgMSwgNCwgOSwgMTZ9KQorCiAKIGNsYXNzIFRlc3RCb3VuZEFyZ3VtZW50cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Rfc2lnbmF0dXJlX2JvdW5kX2FyZ3VtZW50c191bmhhc2hhYmxlKHNlbGYpOgpAQCAtMzU0MywxNCArMzU3MCwxNCBAQAogCiAgICAgZGVmIHRlc3RfZGV0YWlscyhzZWxmKToKICAgICAgICAgbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJ3VuaXR0ZXN0JykKLSAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLW0nLCAnaW5zcGVjdCcsCisgICAgICAgIGFyZ3MgPSBzdXBwb3J0Lm9wdGltX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soKmFyZ3MsICctbScsICdpbnNwZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5pdHRlc3QnLCAnLS1kZXRhaWxzJykKICAgICAgICAgb3V0cHV0ID0gb3V0LmRlY29kZSgpCiAgICAgICAgICMgSnVzdCBhIHF1aWNrIHNhbml0eSBjaGVjayBvbiB0aGUgb3V0cHV0CiAgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlLl9fbmFtZV9fLCBvdXRwdXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlLl9fZmlsZV9fLCBvdXRwdXQpCi0gICAgICAgIGlmIG5vdCBzeXMuZmxhZ3Mub3B0aW1pemU6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZS5fX2NhY2hlZF9fLCBvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlLl9fY2FjaGVkX18sIG91dHB1dCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2lvLnB5IGIvTGliL3Rlc3QvdGVzdF9pby5weQppbmRleCA1MTExODgyLi5jNDhlYzNhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2lvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW8ucHkKQEAgLTQ5Niw3ICs0OTYsMTEgQEAKICAgICBkZWYgdGVzdF9vcGVuX2hhbmRsZXNfTlVMX2NoYXJzKHNlbGYpOgogICAgICAgICBmbl93aXRoX05VTCA9ICdmb29cMGJhcicKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5vcGVuLCBmbl93aXRoX05VTCwgJ3cnKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm9wZW4sIGJ5dGVzKGZuX3dpdGhfTlVMLCAnYXNjaWknKSwgJ3cnKQorCisgICAgICAgIGJ5dGVzX2ZuID0gYnl0ZXMoZm5fd2l0aF9OVUwsICdhc2NpaScpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5vcGVuLCBieXRlc19mbiwgJ3cnKQogCiAgICAgZGVmIHRlc3RfcmF3X2ZpbGVfaW8oc2VsZik6CiAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiLCBidWZmZXJpbmc9MCkgYXMgZjoKQEAgLTg1Niw2ICs4NjAsMzIgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIoc3RyZWFtLCBtZXRob2QpKGJ1ZmZlciksIDUpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhidWZmZXIpLCBiIjEyMzQ1IikKIAorICAgIGRlZiB0ZXN0X2ZzcGF0aF9zdXBwb3J0KHNlbGYpOgorICAgICAgICBjbGFzcyBQYXRoTGlrZToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICAgICAgICAgIGRlZiBfX2ZzcGF0aF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGgKKworICAgICAgICBkZWYgY2hlY2tfcGF0aF9zdWNjZWVkcyhwYXRoKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHBhdGgsICJ3IikgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJlZ2dcbiIpCisKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHBhdGgsICJyIikgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAiZWdnXG4iKQorCisgICAgICAgIGNoZWNrX3BhdGhfc3VjY2VlZHMoUGF0aExpa2Uoc3VwcG9ydC5URVNURk4pKQorICAgICAgICBjaGVja19wYXRoX3N1Y2NlZWRzKFBhdGhMaWtlKHN1cHBvcnQuVEVTVEZOLmVuY29kZSgndXRmLTgnKSkpCisKKyAgICAgICAgYmFkX3BhdGggPSBQYXRoTGlrZShUeXBlRXJyb3IpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYub3BlbihiYWRfcGF0aCwgJ3cnKQorCisgICAgICAgICMgZW5zdXJlIHRoYXQgcmVmY291bnRpbmcgaXMgY29ycmVjdCB3aXRoIHNvbWUgZXJyb3IgY29uZGl0aW9ucworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVmFsdWVFcnJvciwgJ3JlYWQvd3JpdGUvYXBwZW5kIG1vZGUnKToKKyAgICAgICAgICAgIHNlbGYub3BlbihQYXRoTGlrZShzdXBwb3J0LlRFU1RGTiksICdyd3hhJykKKwogCiBjbGFzcyBDSU9UZXN0KElPVGVzdCk6CiAKQEAgLTMyNDYsOCArMzI3Niw3IEBACiAKIGNsYXNzIFB5VGV4dElPV3JhcHBlclRlc3QoVGV4dElPV3JhcHBlclRlc3QpOgogICAgIGlvID0gcHlpbwotICAgICNzaHV0ZG93bl9lcnJvciA9ICJMb29rdXBFcnJvcjogdW5rbm93biBlbmNvZGluZzogYXNjaWkiCi0gICAgc2h1dGRvd25fZXJyb3IgPSAiVHlwZUVycm9yOiAnTm9uZVR5cGUnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiCisgICAgc2h1dGRvd25fZXJyb3IgPSAiTG9va3VwRXJyb3I6IHVua25vd24gZW5jb2Rpbmc6IGFzY2lpIgogCiAKIGNsYXNzIEluY3JlbWVudGFsTmV3bGluZURlY29kZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaXBhZGRyZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9pcGFkZHJlc3MucHkKaW5kZXggOTRiZjRjZC4uMmUzMWY0MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pcGFkZHJlc3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pcGFkZHJlc3MucHkKQEAgLTExNzYsNiArMTE3Niw3IEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2VsZi5pcHY2X25ldHdvcmtbNV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICcyMDAxOjY1ODoyMmE6Y2FmZTo6NScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNlbGYuaXB2Nl9uZXR3b3JrLl9fZ2V0aXRlbV9fLCAxIDw8IDY0KQogCiAgICAgZGVmIHRlc3RHZXRpdGVtKHNlbGYpOgogICAgICAgICAjIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9pcGFkZHItcHkvaXNzdWVzL2RldGFpbD9pZD0xNQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5IGIvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5CmluZGV4IDE1MmY1ZmMuLjQxYzk3NTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKQEAgLTQyLDcgKzQyLDYgQEAKICIiIgogCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSBpdGVydG9vbHMgaW1wb3J0IHJlcGVhdAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKIGZyb20gb3BlcmF0b3IgaW1wb3J0IGxlbmd0aF9oaW50CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CmluZGV4IGY5NDA4NTIuLjk0NWM1OGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CkBAIC00LDcgKzQsNiBAQAogaW1wb3J0IHdlYWtyZWYKIGZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAogZnJvbSBmcmFjdGlvbnMgaW1wb3J0IEZyYWN0aW9uCi1pbXBvcnQgc3lzCiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCByYW5kb20KIGltcG9ydCBjb3B5CkBAIC02MTMsNiArNjEyLDU2IEBACiAgICAgICAgIGZvciBwcm90byBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgogICAgICAgICAgICAgc2VsZi5waWNrbGV0ZXN0KHByb3RvLCBjeWNsZSgnYWJjJykpCiAKKyAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAjIHRlc3Qgd2l0aCBwYXJ0aWFsIGNvbnN1bWVkIGlucHV0IGl0ZXJhYmxlCisgICAgICAgICAgICBpdCA9IGl0ZXIoJ2FiY2RlJykKKyAgICAgICAgICAgIGMgPSBjeWNsZShpdCkKKyAgICAgICAgICAgIF8gPSBbbmV4dChjKSBmb3IgaSBpbiByYW5nZSgyKV0gICAgICAjIGNvbnN1bWUgMiBvZiA1IGlucHV0cworICAgICAgICAgICAgcCA9IHBpY2tsZS5kdW1wcyhjLCBwcm90bykKKyAgICAgICAgICAgIGQgPSBwaWNrbGUubG9hZHMocCkgICAgICAgICAgICAgICAgICAjIHJlYnVpbGQgdGhlIGN5Y2xlIG9iamVjdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBkKSwgbGlzdCgnY2RlYWJjZGVhYmNkZWFiY2RlYWInKSkKKworICAgICAgICAgICAgIyB0ZXN0IHdpdGggY29tcGxldGVseSBjb25zdW1lZCBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgaXQgPSBpdGVyKCdhYmNkZScpCisgICAgICAgICAgICBjID0gY3ljbGUoaXQpCisgICAgICAgICAgICBfID0gW25leHQoYykgZm9yIGkgaW4gcmFuZ2UoNyldICAgICAgIyBjb25zdW1lIDcgb2YgNSBpbnB1dHMKKyAgICAgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoYywgcHJvdG8pCisgICAgICAgICAgICBkID0gcGlja2xlLmxvYWRzKHApICAgICAgICAgICAgICAgICAgIyByZWJ1aWxkIHRoZSBjeWNsZSBvYmplY3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgZCksIGxpc3QoJ2NkZWFiY2RlYWJjZGVhYmNkZWFiJykpCisKKyAgICBkZWYgdGVzdF9jeWNsZV9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgYm90aCBtb2RlcyBmb3IgcmVzdG9yaW5nIHN0YXRlCisKKyAgICAgICAgIyBNb2RlIDAgaXMgZWZmaWNpZW50LiAgSXQgdXNlcyBhbiBpbmNvbXBsZXRlbHkgY29uc3VtZWQgaW5wdXQKKyAgICAgICAgIyBpdGVyYXRvciB0byBidWlsZCBhIGN5Y2xlIG9iamVjdCBhbmQgdGhlbiBwYXNzZXMgaW4gc3RhdGUgd2l0aAorICAgICAgICAjIGEgbGlzdCBvZiBwcmV2aW91c2x5IGNvbnN1bWVkIHZhbHVlcy4gIFRoZXJlIGlzIG5vIGRhdGEKKyAgICAgICAgIyBvdmVybGFwIGJldHdlZW4gdGhlIHR3by4KKyAgICAgICAgYyA9IGN5Y2xlKCdkZWZnJykKKyAgICAgICAgYy5fX3NldHN0YXRlX18oKGxpc3QoJ2FiYycpLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBjKSwgbGlzdCgnZGVmZ2FiY2RlZmdhYmNkZWZnYWInKSkKKworICAgICAgICAjIE1vZGUgMSBpcyBpbmVmZmljaWVudC4gIEl0IHN0YXJ0cyB3aXRoIGEgY3ljbGUgb2JqZWN0IGJ1aWx0CisgICAgICAgICMgZnJvbSBhbiBpdGVyYXRvciBvdmVyIHRoZSByZW1haW5pbmcgZWxlbWVudHMgaW4gYSBwYXJ0aWFsCisgICAgICAgICMgY3ljbGUgYW5kIHRoZW4gcGFzc2VzIGluIHN0YXRlIHdpdGggYWxsIG9mIHRoZSBwcmV2aW91c2x5CisgICAgICAgICMgc2VlbiB2YWx1ZXMgKHRoaXMgb3ZlcmxhcHMgdmFsdWVzIGluY2x1ZGVkIGluIHRoZSBpdGVyYXRvcikuCisgICAgICAgIGMgPSBjeWNsZSgnZGVmZycpCisgICAgICAgIGMuX19zZXRzdGF0ZV9fKChsaXN0KCdhYmNkZWZnJyksIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGMpLCBsaXN0KCdkZWZnYWJjZGVmZ2FiY2RlZmdhYicpKQorCisgICAgICAgICMgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHNldHN0YXRlIG5lZWRzIHRvIGJlIGEgdHVwbGUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvcik6CisgICAgICAgICAgICBjeWNsZSgnZGVmZycpLl9fc2V0c3RhdGVfXyhbbGlzdCgnYWJjZGVmZycpLCAwXSkKKworICAgICAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpbiB0aGUgc2V0c3RhdGUgdHVwbGUgbXVzdCBiZSBhIGxpc3QKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgYyA9IGN5Y2xlKCdkZWZnJykKKyAgICAgICAgICAgIGMuX19zZXRzdGF0ZV9fKChkaWN0LmZyb21rZXlzKCdkZWZnJyksIDApKQorICAgICAgICAgICAgdGFrZSgyMCwgYykKKworICAgICAgICAjIFRoZSBmaXJzdCBhcmd1bWVudCBpbiB0aGUgc2V0c3RhdGUgdHVwbGUgbXVzdCBiZSBhIGxpc3QKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgY3ljbGUoJ2RlZmcnKS5fX3NldHN0YXRlX18oKGxpc3QoJ2FiY2RlZmcnKSwgJ3gnKSkKKwogICAgIGRlZiB0ZXN0X2dyb3VwYnkoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgd2hldGhlciBpdCBhY2NlcHRzIGFyZ3VtZW50cyBjb3JyZWN0bHkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgbGlzdChncm91cGJ5KFtdKSkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2pzb24vX19pbml0X18ucHkgYi9MaWIvdGVzdC90ZXN0X2pzb24vX19pbml0X18ucHkKaW5kZXggMDgwN2U2Zi4uYmFjMzcwZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9qc29uL19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfanNvbi9fX2luaXRfXy5weQpAQCAtMSw1ICsxLDQgQEAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwogaW1wb3J0IGpzb24KIGltcG9ydCBkb2N0ZXN0CiBpbXBvcnQgdW5pdHRlc3QKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfanNvbi90ZXN0X2ZhaWwucHkgYi9MaWIvdGVzdC90ZXN0X2pzb24vdGVzdF9mYWlsLnB5CmluZGV4IDk1ZmY1YjguLjc5MTA1MjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfanNvbi90ZXN0X2ZhaWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9qc29uL3Rlc3RfZmFpbC5weQpAQCAtMSw1ICsxLDQgQEAKIGZyb20gdGVzdC50ZXN0X2pzb24gaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKLWltcG9ydCByZQogCiAjIDIwMDctMTAtMDUKIEpTT05ET0NTID0gWwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkgYi9MaWIvdGVzdC90ZXN0X2txdWV1ZS5weQppbmRleCBmODIyMDI0Li45ZjQ5ODg2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2txdWV1ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2txdWV1ZS5weQpAQCAtNSw3ICs1LDYgQEAKIGltcG9ydCBvcwogaW1wb3J0IHNlbGVjdAogaW1wb3J0IHNvY2tldAotaW1wb3J0IHN5cwogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xpbmVjYWNoZS5weSBiL0xpYi90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5CmluZGV4IDQ3ZTJlZGQuLjM3NWQ5YzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5CkBAIC0zLDYgKzMsOCBAQAogaW1wb3J0IGxpbmVjYWNoZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MucGF0aAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdG9rZW5pemUKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKQEAgLTEwLDggKzEyLDYgQEAKIE5PTkVYSVNURU5UX0ZJTEVOQU1FID0gRklMRU5BTUUgKyAnLm1pc3NpbmcnCiBJTlZBTElEX05BTUUgPSAnIUAkKSghQCNfMScKIEVNUFRZID0gJycKLVRFU1RTID0gJ2luc3BlY3RfZm9kZGVyIGluc3BlY3RfZm9kZGVyMiBtYXBwaW5nX3Rlc3RzJwotVEVTVFMgPSBURVNUUy5zcGxpdCgpCiBURVNUX1BBVEggPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCiBNT0RVTEVTID0gImxpbmVjYWNoZSBhYmMiLnNwbGl0KCkKIE1PRFVMRV9QQVRIID0gb3MucGF0aC5kaXJuYW1lKEZJTEVOQU1FKQpAQCAtMzcsNiArMzcsNjUgQEAKICAgICByZXR1cm4gMycnJyAjIE5vIGVuZGluZyBuZXdsaW5lCiAKIAorY2xhc3MgVGVtcEZpbGU6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKCkuc2V0VXAoKQorICAgICAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShkZWxldGU9RmFsc2UpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5maWxlX25hbWUgPSBmcC5uYW1lCisgICAgICAgICAgICBmcC53cml0ZShzZWxmLmZpbGVfYnl0ZV9zdHJpbmcpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc2VsZi5maWxlX25hbWUpCisKKworY2xhc3MgR2V0TGluZVRlc3RzR29vZERhdGEoVGVtcEZpbGUpOgorICAgICMgZmlsZV9saXN0ICAgPSBbJ2xpc3RcbicsICdvZlxuJywgJ2dvb2RcbicsICdzdHJpbmdzXG4nXQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVfYnl0ZV9zdHJpbmcgPSAnJy5qb2luKHNlbGYuZmlsZV9saXN0KS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgc3VwZXIoKS5zZXRVcCgpCisKKyAgICBkZWYgdGVzdF9nZXRsaW5lKHNlbGYpOgorICAgICAgICB3aXRoIHRva2VuaXplLm9wZW4oc2VsZi5maWxlX25hbWUpIGFzIGZwOgorICAgICAgICAgICAgZm9yIGluZGV4LCBsaW5lIGluIGVudW1lcmF0ZShmcCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmUuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gJ1xuJworCisgICAgICAgICAgICAgICAgY2FjaGVkX2xpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShzZWxmLmZpbGVfbmFtZSwgaW5kZXggKyAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgY2FjaGVkX2xpbmUpCisKKyAgICBkZWYgdGVzdF9nZXRsaW5lcyhzZWxmKToKKyAgICAgICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoc2VsZi5maWxlX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIHNlbGYuZmlsZV9saXN0KQorCisKK2NsYXNzIEdldExpbmVUZXN0c0JhZERhdGEoVGVtcEZpbGUpOgorICAgICMgZmlsZV9ieXRlX3N0cmluZyA9IGInQmFkIGRhdGEgZ29lcyBoZXJlJworCisgICAgZGVmIHRlc3RfZ2V0bGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFN5bnRheEVycm9yLCBVbmljb2RlRGVjb2RlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lY2FjaGUuZ2V0bGluZSwgc2VsZi5maWxlX25hbWUsIDEpCisKKyAgICBkZWYgdGVzdF9nZXRsaW5lcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFN5bnRheEVycm9yLCBVbmljb2RlRGVjb2RlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lY2FjaGUuZ2V0bGluZXMsIHNlbGYuZmlsZV9uYW1lKQorCisKK2NsYXNzIEVtcHR5RmlsZShHZXRMaW5lVGVzdHNHb29kRGF0YSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZpbGVfbGlzdCA9IFtdCisKKworY2xhc3MgU2luZ2xlRW1wdHlMaW5lKEdldExpbmVUZXN0c0dvb2REYXRhLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZV9saXN0ID0gWydcbiddCisKKworY2xhc3MgR29vZFVuaWNvZGUoR2V0TGluZVRlc3RzR29vZERhdGEsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlX2xpc3QgPSBbJ8OhXG4nLCAnYlxuJywgJ2FiY2RlZlxuJywgJ8Ohw6HDocOhw6FcbiddCisKKworY2xhc3MgQmFkVW5pY29kZShHZXRMaW5lVGVzdHNCYWREYXRhLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZV9ieXRlX3N0cmluZyA9IGInXHg4MGFiYycKKworCiBjbGFzcyBMaW5lQ2FjaGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9nZXRsaW5lKHNlbGYpOgpAQCAtNTMsMTMgKzExMiw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0bGluZShFTVBUWSwgMSksIEVNUFRZKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGxpbmUoSU5WQUxJRF9OQU1FLCAxKSwgRU1QVFkpCiAKLSAgICAgICAgIyBDaGVjayB3aGV0aGVyIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhvc2UgZnJvbSBmaWxlIGl0ZXJhdGlvbgotICAgICAgICBmb3IgZW50cnkgaW4gVEVTVFM6Ci0gICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihURVNUX1BBVEgsIGVudHJ5KSArICcucHknCi0gICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGZpbGU6Ci0gICAgICAgICAgICAgICAgZm9yIGluZGV4LCBsaW5lIGluIGVudW1lcmF0ZShmaWxlKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBnZXRsaW5lKGZpbGVuYW1lLCBpbmRleCArIDEpKQotCiAgICAgICAgICMgQ2hlY2sgbW9kdWxlIGxvYWRpbmcKICAgICAgICAgZm9yIGVudHJ5IGluIE1PRFVMRVM6CiAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihNT0RVTEVfUEFUSCwgZW50cnkpICsgJy5weScKQEAgLTgwLDEyICsxMzIsMTMgQEAKIAogICAgIGRlZiB0ZXN0X2NsZWFyY2FjaGUoc2VsZik6CiAgICAgICAgIGNhY2hlZCA9IFtdCi0gICAgICAgIGZvciBlbnRyeSBpbiBURVNUUzoKLSAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFU1RfUEFUSCwgZW50cnkpICsgJy5weScKKyAgICAgICAgZm9yIGVudHJ5IGluIE1PRFVMRVM6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihNT0RVTEVfUEFUSCwgZW50cnkpICsgJy5weScKICAgICAgICAgICAgIGNhY2hlZC5hcHBlbmQoZmlsZW5hbWUpCiAgICAgICAgICAgICBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgMSkKIAogICAgICAgICAjIEFyZSBhbGwgZmlsZXMgY2FjaGVkPworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNhY2hlZCwgW10pCiAgICAgICAgIGNhY2hlZF9lbXB0eSA9IFtmbiBmb3IgZm4gaW4gY2FjaGVkIGlmIGZuIG5vdCBpbiBsaW5lY2FjaGUuY2FjaGVdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVkX2VtcHR5LCBbXSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9saXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9saXN0LnB5CmluZGV4IDhmODJhYjUuLmFlZTYyZGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbGlzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xpc3QucHkKQEAgLTEsNSArMSw1IEBACiBpbXBvcnQgc3lzCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIGxpc3RfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgbGlzdF90ZXN0cwogaW1wb3J0IHBpY2tsZQogaW1wb3J0IHVuaXR0ZXN0CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQppbmRleCBjYjZhNjI4Li4wNjJkZjBmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CkBAIC00MTYxLDYgKzQxNjEsMTcgQEAKICAgICAgICAgbXNnID0gJ1JlY29yZCBub3QgZm91bmQgaW4gZXZlbnQgbG9nLCB3ZW50IGJhY2sgJWQgcmVjb3JkcycgJSBHT19CQUNLCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCwgbXNnPW1zZykKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydsb2dUaHJlYWRzJywgJ2xvZ011bHRpcHJvY2Vzc2luZycsCisgICAgICAgICAgICAgICAgICAgICAnbG9nUHJvY2Vzc2VzJywgJ2N1cnJlbnRmcmFtZScsCisgICAgICAgICAgICAgICAgICAgICAnUGVyY2VudFN0eWxlJywgJ1N0ckZvcm1hdFN0eWxlJywgJ1N0cmluZ1RlbXBsYXRlU3R5bGUnLAorICAgICAgICAgICAgICAgICAgICAgJ0ZpbHRlcmVyJywgJ1BsYWNlSG9sZGVyJywgJ01hbmFnZXInLCAnUm9vdExvZ2dlcicsCisgICAgICAgICAgICAgICAgICAgICAncm9vdCd9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIGxvZ2dpbmcsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogIyBTZXQgdGhlIGxvY2FsZSB0byB0aGUgcGxhdGZvcm0tZGVwZW5kZW50IGRlZmF1bHQuICBJIGhhdmUgbm8gaWRlYQogIyB3aHkgdGhlIHRlc3QgZG9lcyB0aGlzLCBidXQgaW4gYW55IGNhc2Ugd2Ugc2F2ZSB0aGUgY3VycmVudCBsb2NhbGUKICMgZmlyc3QgYW5kIHJlc3RvcmUgaXQgYXQgdGhlIGVuZC4KQEAgLTQxNzcsNyArNDE4OCw4IEBACiAgICAgICAgIFJvdGF0aW5nRmlsZUhhbmRsZXJUZXN0LCAgTGFzdFJlc29ydFRlc3QsIExvZ1JlY29yZFRlc3QsCiAgICAgICAgIEV4Y2VwdGlvblRlc3QsIFN5c0xvZ0hhbmRsZXJUZXN0LCBIVFRQSGFuZGxlclRlc3QsCiAgICAgICAgIE5URXZlbnRMb2dIYW5kbGVyVGVzdCwgVGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyVGVzdCwKLSAgICAgICAgVW5peFNvY2tldEhhbmRsZXJUZXN0LCBVbml4RGF0YWdyYW1IYW5kbGVyVGVzdCwgVW5peFN5c0xvZ0hhbmRsZXJUZXN0KQorICAgICAgICBVbml4U29ja2V0SGFuZGxlclRlc3QsIFVuaXhEYXRhZ3JhbUhhbmRsZXJUZXN0LCBVbml4U3lzTG9nSGFuZGxlclRlc3QsCisgICAgICAgIE1pc2NUZXN0Q2FzZSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9sb25nLnB5IGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CmluZGV4IGIyZDAwOGIuLmYwZGQwNzQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xvbmcucHkKQEAgLTY4OSw2ICs2ODksMjAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgaW50LCBmbG9hdCgnLWluZicpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsIGZsb2F0KCduYW4nKSkKIAorICAgIGRlZiB0ZXN0X21vZF9kaXZpc2lvbihzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICBfID0gMSAlIDAKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzICUgMTAsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEzICUgMTAsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTMgJSAtMTAsIC03KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMyAlIC0xMCwgLTMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAlIDQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyICUgNCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAlIC00LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMiAlIC00LCAwKQorCiAgICAgZGVmIHRlc3RfdHJ1ZV9kaXZpc2lvbihzZWxmKToKICAgICAgICAgaHVnZSA9IDEgPDwgNDAwMDAKICAgICAgICAgbWh1Z2UgPSAtaHVnZQpAQCAtNzIzLDYgKzczNywyNSBAQAogICAgICAgICBmb3IgemVybyBpbiBbImh1Z2UgLyAwIiwgIm1odWdlIC8gMCJdOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGV2YWwsIHplcm8sIG5hbWVzcGFjZSkKIAorICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIF8gPSAxIC8vIDAKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIgLy8gMywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyIC8vIC0zLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiAvLyAzLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiAvLyAtMywgMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xMSAvLyAtMywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTEgLy8gMywgLTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTEgLy8gLTMsIC00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDExIC8vIDMsIDMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTIgLy8gLTMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyIC8vIDMsIC00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyIC8vIC0zLCAtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMiAvLyAzLCA0KQorCiAgICAgZGVmIGNoZWNrX3RydWVkaXYoc2VsZiwgYSwgYiwgc2tpcF9zbWFsbD1UcnVlKToKICAgICAgICAgIiIiVmVyaWZ5IHRoYXQgdGhlIHJlc3VsdCBvZiBhL2IgaXMgY29ycmVjdGx5IHJvdW5kZWQsIGJ5CiAgICAgICAgIGNvbXBhcmluZyBpdCB3aXRoIGEgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgY29ycmVjdGx5CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hY3BhdGgucHkgYi9MaWIvdGVzdC90ZXN0X21hY3BhdGgucHkKaW5kZXggODBiZWM3YS4uMDY5OGZmNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFjcGF0aC5weQpAQCAtMSw1ICsxLDUgQEAKIGltcG9ydCBtYWNwYXRoCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQsIHRlc3RfZ2VuZXJpY3BhdGgKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9nZW5lcmljcGF0aAogaW1wb3J0IHVuaXR0ZXN0CiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5IGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CmluZGV4IDA5OTFmNzQuLmFlYWJkYmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKQEAgLTcsMTcgKzcsMTIgQEAKIGltcG9ydCBlbWFpbC5tZXNzYWdlCiBpbXBvcnQgcmUKIGltcG9ydCBpbwotaW1wb3J0IHNodXRpbAogaW1wb3J0IHRlbXBmaWxlCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgbWFpbGJveAogaW1wb3J0IGdsb2IKLXRyeToKLSAgICBpbXBvcnQgZmNudGwKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBwYXNzCiAKIAogY2xhc3MgVGVzdEJhc2U6CkBAIC0yMjczLDEyICsyMjY4LDE4IEBACiAiIiIpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsibGluZXNlcCIsICJmY250bCJ9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIG1haWxib3gsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3RzID0gKFRlc3RNYWlsYm94U3VwZXJjbGFzcywgVGVzdE1haWxkaXIsIFRlc3RNYm94LCBUZXN0TU1ERiwgVGVzdE1ILAogICAgICAgICAgICAgIFRlc3RCYWJ5bCwgVGVzdE1lc3NhZ2UsIFRlc3RNYWlsZGlyTWVzc2FnZSwgVGVzdE1ib3hNZXNzYWdlLAogICAgICAgICAgICAgIFRlc3RNSE1lc3NhZ2UsIFRlc3RCYWJ5bE1lc3NhZ2UsIFRlc3RNTURGTWVzc2FnZSwKICAgICAgICAgICAgICBUZXN0TWVzc2FnZUNvbnZlcnNpb24sIFRlc3RQcm94eUZpbGUsIFRlc3RQYXJ0aWFsRmlsZSwKLSAgICAgICAgICAgICBNYWlsZGlyVGVzdENhc2UsIFRlc3RGYWtlTWFpbEJveCkKKyAgICAgICAgICAgICBNYWlsZGlyVGVzdENhc2UsIFRlc3RGYWtlTWFpbEJveCwgTWlzY1Rlc3RDYXNlKQogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKICAgICBzdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21haWxjYXAucHkgYi9MaWIvdGVzdC90ZXN0X21haWxjYXAucHkKaW5kZXggMjJiMmZjYy4uNjIzZmFkYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYWlsY2FwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFpbGNhcC5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCBtYWlsY2FwCiBpbXBvcnQgb3MKLWltcG9ydCBzaHV0aWwKIGltcG9ydCB0ZXN0LnN1cHBvcnQKIGltcG9ydCB1bml0dGVzdAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkgYi9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKaW5kZXggYzdkZWY5YS4uYjM3OGZmZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQpAQCAtMTM1LDYgKzEzNSwxMyBAQAogICAgICAgICBmb3IgY29uc3RydWN0b3IgaW4gKHNldCwgZnJvemVuc2V0KToKICAgICAgICAgICAgIHNlbGYuaGVscGVyKGNvbnN0cnVjdG9yKHNlbGYuZC5rZXlzKCkpKQogCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfZW1wdHlfZnJvemVuc2V0X3NpbmdsZXRvbihzZWxmKToKKyAgICAgICAgIyBtYXJzaGFsLmxvYWRzKCkgbXVzdCByZXVzZSB0aGUgZW1wdHkgZnJvemVuc2V0IHNpbmdsZXRvbgorICAgICAgICBvYmogPSBmcm96ZW5zZXQoKQorICAgICAgICBvYmoyID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKG9iaikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob2JqMiwgb2JqKQorCiAKIGNsYXNzIEJ1ZmZlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlLCBIZWxwZXJNaXhpbik6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWF0aC5weSBiL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQppbmRleCA2YzdiOTlkLi5kMGJjNzkwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CkBAIC02LDcgKzYsNiBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgbWF0aAogaW1wb3J0IG9zCi1pbXBvcnQgcGxhdGZvcm0KIGltcG9ydCBzeXMKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBzeXNjb25maWcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5IGIvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKaW5kZXggNjg1NjU5My4uNGUyYzkwOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKQEAgLTEwMSw1ICsxMDEsMTEgQEAKICAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJpbWFnZS5qcGciKSwgKCJpbWFnZS9qcGVnIiwgTm9uZSkpCiAgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiaW1hZ2UucG5nIiksICgiaW1hZ2UvcG5nIiwgTm9uZSkpCiAKKworY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIG1pbWV0eXBlcykKKworCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tbWFwLnB5IGIvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CmluZGV4IGIzNjVkODQuLmJiYjQwNzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21tYXAucHkKQEAgLTcxMyw2ICs3MTMsMTQgQEAKICAgICAgICAgZ2NfY29sbGVjdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMod3IoKSwgTm9uZSkKIAorICAgIGRlZiB0ZXN0X3dyaXRlX3JldHVybmluZ190aGVfbnVtYmVyX29mX2J5dGVzX3dyaXR0ZW4oc2VsZik6CisgICAgICAgIG1tID0gbW1hcC5tbWFwKC0xLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbS53cml0ZShiIiIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1tLndyaXRlKGIieCIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1tLndyaXRlKGIieXoiKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbS53cml0ZShiInB5dGhvbiIpLCA2KQorCisKIGNsYXNzIExhcmdlTW1hcFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbXNpbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9tc2lsaWIucHkKaW5kZXggOGVmMzM0Zi4uZjY1NmY3MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tc2lsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tc2lsaWIucHkKQEAgLTEsNiArMSw1IEBACiAiIiIgVGVzdCBzdWl0ZSBmb3IgdGhlIGNvZGUgaW4gbXNpbGliICIiIgogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgb3MKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBpbXBvcnRfbW9kdWxlCiBtc2lsaWIgPSBpbXBvcnRfbW9kdWxlKCdtc2lsaWInKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQppbmRleCA4ZDdhMjEzLi4wMWExY2QzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTUsNyArNSw3IEBACiAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTgotaW1wb3J0IHVuaXR0ZXN0LCBpbywgY29kZWNzLCBzeXMsIG9zCitpbXBvcnQgdW5pdHRlc3QsIGlvLCBjb2RlY3MsIHN5cwogaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYwogCiBBTExfQ0pLRU5DT0RJTkdTID0gWwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfbWFpbl9oYW5kbGluZy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nX21haW5faGFuZGxpbmcucHkKaW5kZXggNTIyNzNlYS4uMmUxNWNkOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmdfbWFpbl9oYW5kbGluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZ19tYWluX2hhbmRsaW5nLnB5CkBAIC02LDcgKzYsNiBAQAogCiBpbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQotaW1wb3J0IHppcGltcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKQEAgLTE1LDcgKzE0LDcgQEAKIAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgKAogICAgIG1ha2VfcGtnLCBtYWtlX3NjcmlwdCwgbWFrZV96aXBfcGtnLCBtYWtlX3ppcF9zY3JpcHQsCi0gICAgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlLCBzcGF3bl9weXRob24sIGtpbGxfcHl0aG9uKQorICAgIGFzc2VydF9weXRob25fb2spCiAKICMgTG9vayB1cCB3aGljaCBzdGFydCBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gdGVzdAogaW1wb3J0IG11bHRpcHJvY2Vzc2luZwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9uaXMucHkgYi9MaWIvdGVzdC90ZXN0X25pcy5weQppbmRleCAzODdhNGU3Li4yMTA3NGM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X25pcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X25pcy5weQpAQCAtMSw2ICsxLDUgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgc3lzCiAKICMgU2tpcCB0ZXN0IGlmIG5pcyBtb2R1bGUgZG9lcyBub3QgZXhpc3QuCiBuaXMgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoJ25pcycpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkgYi9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKaW5kZXggMzBmYTYxMi4uNWI1OTBlMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weQpAQCAtMyw3ICszLDYgQEAKIAogZnJvbSBodHRwLmNsaWVudCBpbXBvcnQgSFRUUEV4Y2VwdGlvbgogaW1wb3J0IHN5cwotaW1wb3J0IG9zCiBmcm9tIHVuaWNvZGVkYXRhIGltcG9ydCBub3JtYWxpemUsIHVuaWRhdGFfdmVyc2lvbgogCiBURVNUREFUQUZJTEUgPSAiTm9ybWFsaXphdGlvblRlc3QudHh0IgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weSBiL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKaW5kZXggYjViYTk3Ni4uNjI1NDA5MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CkBAIC0xMjAsNjMgKzEyMCw2MyBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFkZCwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmFkZCgzLCA0KSA9PSA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmFkZCgzLCA0KSwgNykKIAogICAgIGRlZiB0ZXN0X2JpdHdpc2VfYW5kKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hbmRfLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYW5kXygweGYsIDB4YSkgPT0gMHhhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmFuZF8oMHhmLCAweGEpLCAweGEpCiAKICAgICBkZWYgdGVzdF9jb25jYXQoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KCdweScsICd0aG9uJykgPT0gJ3B5dGhvbicpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoWzEsIDJdLCBbMywgNF0pID09IFsxLCAyLCAzLCA0XSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChTZXExKFs1LCA2XSksIFNlcTEoWzddKSkgPT0gWzUsIDYsIDddKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFNlcTIoWzUsIDZdKSwgU2VxMihbN10pKSA9PSBbNSwgNiwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY29uY2F0KCdweScsICd0aG9uJyksICdweXRob24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvbmNhdChbMSwgMl0sIFszLCA0XSksIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5jb25jYXQoU2VxMShbNSwgNl0pLCBTZXExKFs3XSkpLCBbNSwgNiwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY29uY2F0KFNlcTIoWzUsIDZdKSwgU2VxMihbN10pKSwgWzUsIDYsIDddKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgMTMsIDI5KQogCiAgICAgZGVmIHRlc3RfY291bnRPZihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY291bnRPZiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCAzKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDUpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCA1KSwgMCkKIAogICAgIGRlZiB0ZXN0X2RlbGl0ZW0oc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgYSA9IFs0LCAzLCAyLCAxXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGVsaXRlbSwgYSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmRlbGl0ZW0oYSwgMSkgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gWzQsIDIsIDFdKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShvcGVyYXRvci5kZWxpdGVtKGEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFs0LCAyLCAxXSkKIAogICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZmxvb3JkaXYsIDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZmxvb3JkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5mbG9vcmRpdig1LCAyKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmZsb29yZGl2KDUsIDIpLCAyKQogCiAgICAgZGVmIHRlc3RfdHJ1ZWRpdihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IudHJ1ZWRpdiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnRydWVkaXYoNSwgMikgPT0gMi41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnRydWVkaXYoNSwgMiksIDIuNSkKIAogICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgYSA9IHJhbmdlKDEwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgYSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdldGl0ZW0oYSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5nZXRpdGVtKGEsIDIpLCAyKQogCiAgICAgZGVmIHRlc3RfaW5kZXhPZihzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZiwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmluZGV4T2YoWzQsIDMsIDIsIDFdLCAzKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmluZGV4T2YoWzQsIDMsIDIsIDFdLCAzKSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZiwgWzQsIDMsIDIsIDFdLCAwKQogCiAgICAgZGVmIHRlc3RfaW52ZXJ0KHNlbGYpOgpAQCAtMTg5LDIxICsxODksMjEgQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIE5vbmUsIDQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDEpID09IDEwKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDApID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IubHNoaWZ0KDUsIDEpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5sc2hpZnQoNSwgMCksIDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCwgMiwgLTEpCiAKICAgICBkZWYgdGVzdF9tb2Qoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tb2QpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubW9kLCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm1vZCg1LCAyKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLm1vZCg1LCAyKSwgMSkKIAogICAgIGRlZiB0ZXN0X211bChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm11bCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tdWwsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5tdWwoNSwgMikgPT0gMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IubXVsKDUsIDIpLCAxMCkKIAogICAgIGRlZiB0ZXN0X21hdG11bChzZWxmKToKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQpAQCAtMjI3LDcgKzIyNyw3IEBACiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5vcl8pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iub3JfKDB4YSwgMHg1KSA9PSAweGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3Iub3JfKDB4YSwgMHg1KSwgMHhmKQogCiAgICAgZGVmIHRlc3RfcG9zKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCkBAIC0yNTAsOCArMjUwLDggQEAKICAgICAgICAgb3BlcmF0b3IgPSBzZWxmLm1vZHVsZQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQsIE5vbmUsIDQyKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucnNoaWZ0KDUsIDEpID09IDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yc2hpZnQoNSwgMCkgPT0gNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5yc2hpZnQoNSwgMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IucnNoaWZ0KDUsIDApLCA1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5yc2hpZnQsIDIsIC0xKQogCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CkBAIC0yNjYsMTUgKzI2NiwxNSBAQAogICAgICAgICBhID0gbGlzdChyYW5nZSgzKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5zZXRpdGVtKGEsIDAsIDIpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFsyLCAxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMiwgMSwgMl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEsIDQsIDIpCiAKICAgICBkZWYgdGVzdF9zdWIoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zdWIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc3ViKDUsIDIpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3Iuc3ViKDUsIDIpLCAzKQogCiAgICAgZGVmIHRlc3RfdHJ1dGgoc2VsZik6CiAgICAgICAgIG9wZXJhdG9yID0gc2VsZi5tb2R1bGUKQEAgLTI5Miw3ICsyOTIsNyBAQAogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IueG9yKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvciwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnhvcigweGIsIDB4YykgPT0gMHg3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLnhvcigweGIsIDB4YyksIDB4NykKIAogICAgIGRlZiB0ZXN0X2lzKHNlbGYpOgogICAgICAgICBvcGVyYXRvciA9IHNlbGYubW9kdWxlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQppbmRleCA3NjIxYzI0Li45MWEwMzE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKQEAgLTE2LDYgKzE2LDcgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiAKK2ltcG9ydCBvcHRwYXJzZQogZnJvbSBvcHRwYXJzZSBpbXBvcnQgbWFrZV9vcHRpb24sIE9wdGlvbiwgXAogICAgICBUaXRsZWRIZWxwRm9ybWF0dGVyLCBPcHRpb25QYXJzZXIsIE9wdGlvbkdyb3VwLCBcCiAgICAgIFNVUFBSRVNTX1VTQUdFLCBPcHRpb25FcnJvciwgT3B0aW9uQ29uZmxpY3RFcnJvciwgXApAQCAtMTY1MCw2ICsxNjUxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gLWw6IGludmFsaWQgaW50ZWdlciB2YWx1ZTogJzB4MTJ4JyIpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnY2hlY2tfYnVpbHRpbicsICdBbWJpZ3VvdXNPcHRpb25FcnJvcicsICdOT19ERUZBVUxUJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgb3B0cGFyc2UsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29yZGVyZWRfZGljdC5weSBiL0xpYi90ZXN0L3Rlc3Rfb3JkZXJlZF9kaWN0LnB5CmluZGV4IDkwMWQ0YjIuLjZmYmMxYjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3JkZXJlZF9kaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3JkZXJlZF9kaWN0LnB5CkBAIC0yOTgsOSArMjk4LDExIEBACiAgICAgICAgICMgZG8gbm90IHNhdmUgaW5zdGFuY2UgZGljdGlvbmFyeSBpZiBub3QgbmVlZGVkCiAgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCiAgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvZC5fX2RpY3RfXywgZGljdCkKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUob2QuX19yZWR1Y2VfXygpWzJdKQogICAgICAgICBvZC54ID0gMTAKLSAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUob2QuX19yZWR1Y2VfXygpWzJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLl9fZGljdF9fWyd4J10sIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLl9fcmVkdWNlX18oKVsyXSwgeyd4JzogMTB9KQogCiAgICAgZGVmIHRlc3RfcGlja2xlX3JlY3Vyc2l2ZShzZWxmKToKICAgICAgICAgT3JkZXJlZERpY3QgPSBzZWxmLk9yZGVyZWREaWN0CkBAIC00MDMsNiArNDA1LDE0IEBACiAgICAgICAgIG9kID0gT3JkZXJlZERpY3QoKipkKQogICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoc3lzLmdldHNpemVvZihvZCksIHN5cy5nZXRzaXplb2YoZCkpCiAKKyAgICBkZWYgdGVzdF92aWV3cyhzZWxmKToKKyAgICAgICAgT3JkZXJlZERpY3QgPSBzZWxmLk9yZGVyZWREaWN0CisgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNDI4NgorICAgICAgICBzID0gJ3RoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgYSBsYXp5IGRvZyB5ZXN0ZXJkYXkgYmVmb3JlIGRhd24nLnNwbGl0KCkKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdC5mcm9ta2V5cyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLmtleXMoKSwgZGljdChvZCkua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLml0ZW1zKCksIGRpY3Qob2QpLml0ZW1zKCkpCisKICAgICBkZWYgdGVzdF9vdmVycmlkZV91cGRhdGUoc2VsZik6CiAgICAgICAgIE9yZGVyZWREaWN0ID0gc2VsZi5PcmRlcmVkRGljdAogICAgICAgICAjIFZlcmlmeSB0aGF0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHVwZGF0ZSgpIHdpdGhvdXQgYnJlYWtpbmcgX19pbml0X18oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKaW5kZXggODc0ZjllNC4uNjQ5M2Q3NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zLnB5CkBAIC0xNSw3ICsxNSw2IEBACiBpbXBvcnQgbW1hcAogaW1wb3J0IG9zCiBpbXBvcnQgcGlja2xlCi1pbXBvcnQgcGxhdGZvcm0KIGltcG9ydCByZQogaW1wb3J0IHNodXRpbAogaW1wb3J0IHNpZ25hbApAQCAtNjYsNiArNjUsNyBAQAogCiBmcm9tIHRlc3Quc3VwcG9ydC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rCiAKKwogcm9vdF9pbl9wb3NpeCA9IEZhbHNlCiBpZiBoYXNhdHRyKG9zLCAnZ2V0ZXVpZCcpOgogICAgIHJvb3RfaW5fcG9zaXggPSAob3MuZ2V0ZXVpZCgpID09IDApCkBAIC04Miw2ICs4MiwyOCBAQAogIyBJc3N1ZSAjMTQxMTA6IFNvbWUgdGVzdHMgZmFpbCBvbiBGcmVlQlNEIGlmIHRoZSB1c2VyIGlzIGluIHRoZSB3aGVlbCBncm91cC4KIEhBVkVfV0hFRUxfR1JPVVAgPSBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnZnJlZWJzZCcpIGFuZCBvcy5nZXRnaWQoKSA9PSAwCiAKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MobXNnX3JlZ2V4LCBxdWlldD1GYWxzZSk6CisgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKChtc2dfcmVnZXgsIERlcHJlY2F0aW9uV2FybmluZyksIHF1aWV0PXF1aWV0KToKKyAgICAgICAgeWllbGQKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oZXhwZWN0ZWQpOgorICAgIG1zZyA9ICdUaGUgV2luZG93cyBieXRlcyBBUEkgaGFzIGJlZW4gZGVwcmVjYXRlZCcKKyAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgIHdpdGggaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzKG1zZywgcXVpZXQ9bm90IGV4cGVjdGVkKToKKyAgICAgICAgICAgIHlpZWxkCisgICAgZWxzZToKKyAgICAgICAgeWllbGQKKworCitkZWYgY3JlYXRlX2ZpbGUoZmlsZW5hbWUsIGNvbnRlbnQ9Yidjb250ZW50Jyk6CisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAieGIiLCAwKSBhcyBmcDoKKyAgICAgICAgZnAud3JpdGUoY29udGVudCkKKworCiAjIFRlc3RzIGNyZWF0aW5nIFRFU1RGTgogY2xhc3MgRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC0xNDAsOSArMTYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAibmVlZHMgSU5UX01BWCA8IFBZX1NTSVpFX1RfTUFYIikKICAgICBAc3VwcG9ydC5iaWdtZW10ZXN0KHNpemU9SU5UX01BWCArIDEwLCBtZW11c2U9MSwgZHJ5X3J1bj1GYWxzZSkKICAgICBkZWYgdGVzdF9sYXJnZV9yZWFkKHNlbGYsIHNpemUpOgotICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGZwOgotICAgICAgICAgICAgZnAud3JpdGUoYid0ZXN0JykKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgY3JlYXRlX2ZpbGUoc3VwcG9ydC5URVNURk4sIGIndGVzdCcpCiAKICAgICAgICAgIyBJc3N1ZSAjMjE5MzI6IE1ha2Ugc3VyZSB0aGF0IG9zLnJlYWQoKSBkb2VzIG5vdCByYWlzZSBhbgogICAgICAgICAjIE92ZXJmbG93RXJyb3IgZm9yIHNpemUgbGFyZ2VyIHRoYW4gSU5UX01BWApAQCAtMTk5LDExICsyMjAsMTIgQEAKIAogICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CiAgICAgICAgIFRFU1RGTjIgPSBzdXBwb3J0LlRFU1RGTiArICIuMiIKLSAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAndycpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKCIxIikKLSAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICd3JykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoIjIiKQotICAgICAgICBzZWxmLmFkZENsZWFudXAob3MudW5saW5rLCBURVNURk4yKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIFRFU1RGTjIpCisKKyAgICAgICAgY3JlYXRlX2ZpbGUoc3VwcG9ydC5URVNURk4sIGIiMSIpCisgICAgICAgIGNyZWF0ZV9maWxlKFRFU1RGTjIsIGIiMiIpCisKICAgICAgICAgb3MucmVwbGFjZShzdXBwb3J0LlRFU1RGTiwgVEVTVEZOMikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRmlsZU5vdEZvdW5kRXJyb3IsIG9zLnN0YXQsIHN1cHBvcnQuVEVTVEZOKQogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3InKSBhcyBmOgpAQCAtMjI2LDE1ICsyNDgsOSBAQAogIyBUZXN0IGF0dHJpYnV0ZXMgb24gcmV0dXJuIHZhbHVlcyBmcm9tIG9zLipzdGF0KiBmYW1pbHkuCiBjbGFzcyBTdGF0QXR0cmlidXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgb3MubWtkaXIoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHNlbGYuZm5hbWUgPSBvcy5wYXRoLmpvaW4oc3VwcG9ydC5URVNURk4sICJmMSIpCi0gICAgICAgIGYgPSBvcGVuKHNlbGYuZm5hbWUsICd3YicpCi0gICAgICAgIGYud3JpdGUoYiJBQkMiKQotICAgICAgICBmLmNsb3NlKCkKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgb3MudW5saW5rKHNlbGYuZm5hbWUpCi0gICAgICAgIG9zLnJtZGlyKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmZuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzZWxmLmZuYW1lKQorICAgICAgICBjcmVhdGVfZmlsZShzZWxmLmZuYW1lLCBiIkFCQyIpCiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3RhdCcpLCAndGVzdCBuZWVkcyBvcy5zdGF0KCknKQogICAgIGRlZiBjaGVja19zdGF0X2F0dHJpYnV0ZXMoc2VsZiwgZm5hbWUpOgpAQCAtMzEwLDggKzMyNiw3IEBACiAgICAgICAgICAgICBmbmFtZSA9IHNlbGYuZm5hbWUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImNhbm5vdCBlbmNvZGUgJWEgZm9yIHRoZSBmaWxlc3lzdGVtIiAlIHNlbGYuZm5hbWUpCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CiAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0YXRfYXR0cmlidXRlcyhmbmFtZSkKIAogICAgIGRlZiB0ZXN0X3N0YXRfcmVzdWx0X3BpY2tsZShzZWxmKToKQEAgLTQyNiw3ICs0NDEsMTEgQEAKICAgICAgICAgICAgIDApCiAKICAgICAgICAgIyB0ZXN0IGRpcmVjdG9yeSBzdF9maWxlX2F0dHJpYnV0ZXMgKEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSBzZXQpCi0gICAgICAgIHJlc3VsdCA9IG9zLnN0YXQoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGRpcm5hbWUgPSBzdXBwb3J0LlRFU1RGTiArICJkaXIiCisgICAgICAgIG9zLm1rZGlyKGRpcm5hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5ybWRpciwgZGlybmFtZSkKKworICAgICAgICByZXN1bHQgPSBvcy5zdGF0KGRpcm5hbWUpCiAgICAgICAgIHNlbGYuY2hlY2tfZmlsZV9hdHRyaWJ1dGVzKHJlc3VsdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHJlc3VsdC5zdF9maWxlX2F0dHJpYnV0ZXMgJiBzdGF0LkZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSwKQEAgLTQ0MCwxOSArNDU5LDE0IEBACiAKICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBzZWxmLmRpcm5hbWUpCiAgICAgICAgIG9zLm1rZGlyKHNlbGYuZGlybmFtZSkKLSAgICAgICAgd2l0aCBvcGVuKHNlbGYuZm5hbWUsICd3YicpIGFzIGZwOgotICAgICAgICAgICAgZnAud3JpdGUoYiJBQkMiKQorICAgICAgICBjcmVhdGVfZmlsZShzZWxmLmZuYW1lKQogCiAgICAgICAgIGRlZiByZXN0b3JlX2Zsb2F0X3RpbWVzKHN0YXRlKToKLSAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKLQorICAgICAgICAgICAgd2l0aCBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MoJ3N0YXRfZmxvYXRfdGltZXMnKToKICAgICAgICAgICAgICAgICBvcy5zdGF0X2Zsb2F0X3RpbWVzKHN0YXRlKQogCiAgICAgICAgICMgZW5zdXJlIHRoYXQgc3RfYXRpbWUgYW5kIHN0X210aW1lIGFyZSBmbG9hdAotICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6Ci0gICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIsIERlcHJlY2F0aW9uV2FybmluZykKLQorICAgICAgICB3aXRoIGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncygnc3RhdF9mbG9hdF90aW1lcycpOgogICAgICAgICAgICAgb2xkX2Zsb2F0X3RpbWVzID0gb3Muc3RhdF9mbG9hdF90aW1lcygtMSkKICAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2Zsb2F0X3RpbWVzLCBvbGRfZmxvYXRfdGltZXMpCiAKQEAgLTU0NCw3ICs1NTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJmZCBzdXBwb3J0IGZvciB1dGltZSByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LiIpCiAgICAgZGVmIHRlc3RfdXRpbWVfZmQoc2VsZik6CiAgICAgICAgIGRlZiBzZXRfdGltZShmaWxlbmFtZSwgbnMpOgotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd2InKSBhcyBmcDoKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3diJywgMCkgYXMgZnA6CiAgICAgICAgICAgICAgICAgIyB1c2UgYSBmaWxlIGRlc2NyaXB0b3IgdG8gdGVzdCBmdXRpbWVucyh0aW1lc3BlYykKICAgICAgICAgICAgICAgICAjIG9yIGZ1dGltZXModGltZXZhbCkKICAgICAgICAgICAgICAgICBvcy51dGltZShmcC5maWxlbm8oKSwgbnM9bnMpCkBAIC03OTgsNiArODEyLDcgQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgam9pbiA9IG9zLnBhdGguam9pbgorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIHN1cHBvcnQuVEVTVEZOKQogCiAgICAgICAgICMgQnVpbGQ6CiAgICAgICAgICMgICAgIFRFU1RGTi8KQEAgLTgzMCw5ICs4NDUsOCBAQAogICAgICAgICBvcy5tYWtlZGlycyh0Ml9wYXRoKQogCiAgICAgICAgIGZvciBwYXRoIGluIHRtcDFfcGF0aCwgdG1wMl9wYXRoLCB0bXAzX3BhdGgsIHRtcDRfcGF0aDoKLSAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKLSAgICAgICAgICAgIGYud3JpdGUoIkknbSAiICsgcGF0aCArICIgYW5kIHByb3VkIG9mIGl0LiAgQmxhbWUgdGVzdF9vcy5cbiIpCi0gICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAieCIpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiSSdtICIgKyBwYXRoICsgIiBhbmQgcHJvdWQgb2YgaXQuICBCbGFtZSB0ZXN0X29zLlxuIikKIAogICAgICAgICBpZiBzdXBwb3J0LmNhbl9zeW1saW5rKCk6CiAgICAgICAgICAgICBvcy5zeW1saW5rKG9zLnBhdGguYWJzcGF0aCh0Ml9wYXRoKSwgc2VsZi5saW5rX3BhdGgpCkBAIC04NzgsNyArODkyLDcgQEAKICAgICAgICAgIyBXYWxrIGJvdHRvbS11cC4KICAgICAgICAgYWxsID0gbGlzdChzZWxmLndhbGsoc2VsZi53YWxrX3BhdGgsIHRvcGRvd249RmFsc2UpKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFsbCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFsbCksIDQsIGFsbCkKICAgICAgICAgIyBXZSBjYW4ndCBrbm93IHdoaWNoIG9yZGVyIFNVQjEgYW5kIFNVQjIgd2lsbCBhcHBlYXIgaW4uCiAgICAgICAgICMgTm90IGZsaXBwZWQ6ICBTVUIxMSwgU1VCMSwgU1VCMiwgVEVTVEZOCiAgICAgICAgICMgICAgIGZsaXBwZWQ6ICBTVUIyLCBTVUIxMSwgU1VCMSwgVEVTVEZOCkBAIC05MDgsMjIgKzkyMiw2IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCBmb2xsb3cgc3ltbGluayB3aXRoIGZvbGxvd2xpbmtzPVRydWUiKQogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICAjIFRlYXIgZXZlcnl0aGluZyBkb3duLiAgVGhpcyBpcyBhIGRlY2VudCB1c2UgZm9yIGJvdHRvbS11cCBvbgotICAgICAgICAjIFdpbmRvd3MsIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIHJlY3Vyc2l2ZSBkZWxldGUgY29tbWFuZC4gIFRoZQotICAgICAgICAjIChub3Qgc28pIHN1YnRsZXR5IGlzIHRoYXQgcm1kaXIgd2lsbCBmYWlsIHVubGVzcyB0aGUgZGlyJ3MKLSAgICAgICAgIyBraWRzIGFyZSByZW1vdmVkIGZpcnN0LCBzbyBib3R0b20gdXAgaXMgZXNzZW50aWFsLgotICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzdXBwb3J0LlRFU1RGTiwgdG9wZG93bj1GYWxzZSk6Ci0gICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKLSAgICAgICAgICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHJvb3QsIG5hbWUpKQotICAgICAgICAgICAgZm9yIG5hbWUgaW4gZGlyczoKLSAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCi0gICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNsaW5rKGRpcm5hbWUpOgotICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkaXJuYW1lKQotICAgICAgICBvcy5ybWRpcihzdXBwb3J0LlRFU1RGTikKLQogICAgIGRlZiB0ZXN0X3dhbGtfYmFkX2RpcihzZWxmKToKICAgICAgICAgIyBXYWxrIHRvcC1kb3duLgogICAgICAgICBlcnJvcnMgPSBbXQpAQCAtMTAwNiwyNyArMTAwNCwxMyBAQAogICAgICAgICBzZWxmLmFkZENsZWFudXAob3MuY2xvc2UsIG5ld2ZkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2ZkLCBtaW5mZCkKIAotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgIyBjbGVhbnVwCi0gICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcywgcm9vdGZkIGluIG9zLmZ3YWxrKHN1cHBvcnQuVEVTVEZOLCB0b3Bkb3duPUZhbHNlKToKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgotICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lLCBkaXJfZmQ9cm9vdGZkKQotICAgICAgICAgICAgZm9yIG5hbWUgaW4gZGlyczoKLSAgICAgICAgICAgICAgICBzdCA9IG9zLnN0YXQobmFtZSwgZGlyX2ZkPXJvb3RmZCwgZm9sbG93X3N5bWxpbmtzPUZhbHNlKQotICAgICAgICAgICAgICAgIGlmIHN0YXQuU19JU0RJUihzdC5zdF9tb2RlKToKLSAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIobmFtZSwgZGlyX2ZkPXJvb3RmZCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSwgZGlyX2ZkPXJvb3RmZCkKLSAgICAgICAgb3Mucm1kaXIoc3VwcG9ydC5URVNURk4pCi0KIGNsYXNzIEJ5dGVzV2Fsa1Rlc3RzKFdhbGtUZXN0cyk6CiAgICAgIiIiVGVzdHMgZm9yIG9zLndhbGsoKSB3aXRoIGJ5dGVzLiIiIgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc3VwZXIoKS5zZXRVcCgpCiAgICAgICAgIHNlbGYuc3RhY2sgPSBjb250ZXh0bGliLkV4aXRTdGFjaygpCiAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKLSAgICAgICAgICAgIHNlbGYuc3RhY2suZW50ZXJfY29udGV4dCh3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpKQotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLnN0YWNrLmVudGVyX2NvbnRleHQoYnl0ZXNfZmlsZW5hbWVfd2FybihGYWxzZSkpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHNlbGYuc3RhY2suY2xvc2UoKQpAQCAtMTIwMyw4ICsxMTg3LDcgQEAKICAgICAgICAgb3MubWtkaXIoZGlyYSkKICAgICAgICAgZGlyYiA9IG9zLnBhdGguam9pbihkaXJhLCAnZGlyYicpCiAgICAgICAgIG9zLm1rZGlyKGRpcmIpCi0gICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGlyYSwgJ2ZpbGUudHh0JyksICd3JykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoJ3RleHQnKQorICAgICAgICBjcmVhdGVfZmlsZShvcy5wYXRoLmpvaW4oZGlyYSwgJ2ZpbGUudHh0JykpCiAgICAgICAgIG9zLnJlbW92ZWRpcnMoZGlyYikKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhkaXJiKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGRpcmEpKQpAQCAtMTIxNSw4ICsxMTk4LDcgQEAKICAgICAgICAgb3MubWtkaXIoZGlyYSkKICAgICAgICAgZGlyYiA9IG9zLnBhdGguam9pbihkaXJhLCAnZGlyYicpCiAgICAgICAgIG9zLm1rZGlyKGRpcmIpCi0gICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGlyYiwgJ2ZpbGUudHh0JyksICd3JykgYXMgZjoKLSAgICAgICAgICAgIGYud3JpdGUoJ3RleHQnKQorICAgICAgICBjcmVhdGVfZmlsZShvcy5wYXRoLmpvaW4oZGlyYiwgJ2ZpbGUudHh0JykpCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcik6CiAgICAgICAgICAgICBvcy5yZW1vdmVkaXJzKGRpcmIpCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhkaXJiKSkKQEAgLTEyMjYsNyArMTIwOCw3IEBACiAKIGNsYXNzIERldk51bGxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZGV2bnVsbChzZWxmKToKLSAgICAgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICd3YicpIGFzIGY6CisgICAgICAgIHdpdGggb3Blbihvcy5kZXZudWxsLCAnd2InLCAwKSBhcyBmOgogICAgICAgICAgICAgZi53cml0ZShiJ2hlbGxvJykKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3JiJykgYXMgZjoKQEAgLTEzMTMsOSArMTI5NSw5IEBACiAgICAgZGVmIHRlc3RfdXJhbmRvbV9mZF9yZW9wZW5lZChzZWxmKToKICAgICAgICAgIyBJc3N1ZSAjMjEyMDc6IHVyYW5kb20oKSBzaG91bGQgZGV0ZWN0IGl0cyBmZCB0byAvZGV2L3VyYW5kb20KICAgICAgICAgIyBjaGFuZ2VkIHRvIHNvbWV0aGluZyBlbHNlLCBhbmQgcmVvcGVuIGl0LgotICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICd3YicpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKGIieCIgKiAyNTYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBjcmVhdGVfZmlsZShzdXBwb3J0LlRFU1RGTiwgYiJ4IiAqIDI1NikKKwogICAgICAgICBjb2RlID0gIiIiaWYgMToKICAgICAgICAgICAgIGltcG9ydCBvcwogICAgICAgICAgICAgaW1wb3J0IHN5cwpAQCAtMTQ0NCw2ICsxNDI2LDE4IEBACiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luMzIgc3BlY2lmaWMgdGVzdHMiKQogY2xhc3MgV2luMzJFcnJvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnN0YXQoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIGV4aXN0cyA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGV4aXN0cyA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZmlsZSAlcyBtdXN0IG5vdCBleGlzdDsgb3Muc3RhdCBmYWlsZWQgd2l0aCAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAlIChzdXBwb3J0LlRFU1RGTiwgZXhjKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZmlsZSAlcyBtdXN0IG5vdCBleGlzdCIgJSBzdXBwb3J0LlRFU1RGTikKKwogICAgIGRlZiB0ZXN0X3JlbmFtZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MucmVuYW1lLCBzdXBwb3J0LlRFU1RGTiwgc3VwcG9ydC5URVNURk4rIi5iYWsiKQogCkBAIC0xNDU0LDEyICsxNDQ4LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLmNoZGlyLCBzdXBwb3J0LlRFU1RGTikKIAogICAgIGRlZiB0ZXN0X21rZGlyKHNlbGYpOgotICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgInciKQotICAgICAgICB0cnk6CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAieCIpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5ta2Rpciwgc3VwcG9ydC5URVNURk4pCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgIG9zLnVubGluayhzdXBwb3J0LlRFU1RGTikKIAogICAgIGRlZiB0ZXN0X3V0aW1lKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy51dGltZSwgc3VwcG9ydC5URVNURk4sIE5vbmUpCkBAIC0xNDY3LDYgKzE0NTksNyBAQAogICAgIGRlZiB0ZXN0X2NobW9kKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5jaG1vZCwgc3VwcG9ydC5URVNURk4sIDApCiAKKwogY2xhc3MgVGVzdEludmFsaWRGRCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgc2luZ2xlcyA9IFsiZmNoZGlyIiwgImR1cCIsICJmZG9wZW4iLCAiZmRhdGFzeW5jIiwgImZzdGF0IiwKICAgICAgICAgICAgICAgICJmc3RhdHZmcyIsICJmc3luYyIsICJ0Y2dldHBncnAiLCAidHR5bmFtZSJdCkBAIC0xNTc4LDExICsxNTcxLDkgQEAKICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZSkKIAogICAgIGRlZiBfdGVzdF9saW5rKHNlbGYsIGZpbGUxLCBmaWxlMik6Ci0gICAgICAgIHdpdGggb3BlbihmaWxlMSwgInciKSBhcyBmMToKLSAgICAgICAgICAgIGYxLndyaXRlKCJ0ZXN0IikKKyAgICAgICAgY3JlYXRlX2ZpbGUoZmlsZTEpCiAKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihGYWxzZSk6CiAgICAgICAgICAgICBvcy5saW5rKGZpbGUxLCBmaWxlMikKICAgICAgICAgd2l0aCBvcGVuKGZpbGUxLCAiciIpIGFzIGYxLCBvcGVuKGZpbGUyLCAiciIpIGFzIGYyOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguc2FtZW9wZW5maWxlKGYxLmZpbGVubygpLCBmMi5maWxlbm8oKSkpCkBAIC0xODc0LDEwICsxODY1LDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIoc3VwcG9ydC5URVNURk4pKSwKICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZWRfcGF0aHMpCisKICAgICAgICAgIyBieXRlcwotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKG9zLmZzZW5jb2RlKHN1cHBvcnQuVEVTVEZOKSkpLAotICAgICAgICAgICAgICAgIFtvcy5mc2VuY29kZShwYXRoKSBmb3IgcGF0aCBpbiBzZWxmLmNyZWF0ZWRfcGF0aHNdKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oRmFsc2UpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIob3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pKSksCisgICAgICAgICAgICAgICAgICAgIFtvcy5mc2VuY29kZShwYXRoKSBmb3IgcGF0aCBpbiBzZWxmLmNyZWF0ZWRfcGF0aHNdKQogCiAgICAgZGVmIHRlc3RfbGlzdGRpcl9leHRlbmRlZF9wYXRoKHNlbGYpOgogICAgICAgICAiIiJUZXN0IHdoZW4gdGhlIHBhdGggc3RhcnRzIHdpdGggJ1xcXFw/XFwnLiIiIgpAQCAtMTg4NywxMSArMTg4MCwxMyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgIHNvcnRlZChvcy5saXN0ZGlyKHBhdGgpKSwKICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZWRfcGF0aHMpCisKICAgICAgICAgIyBieXRlcwotICAgICAgICBwYXRoID0gYidcXFxcP1xcJyArIG9zLmZzZW5jb2RlKG9zLnBhdGguYWJzcGF0aChzdXBwb3J0LlRFU1RGTikpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIocGF0aCkpLAotICAgICAgICAgICAgICAgIFtvcy5mc2VuY29kZShwYXRoKSBmb3IgcGF0aCBpbiBzZWxmLmNyZWF0ZWRfcGF0aHNdKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oRmFsc2UpOgorICAgICAgICAgICAgcGF0aCA9IGInXFxcXD9cXCcgKyBvcy5mc2VuY29kZShvcy5wYXRoLmFic3BhdGgoc3VwcG9ydC5URVNURk4pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc29ydGVkKG9zLmxpc3RkaXIocGF0aCkpLAorICAgICAgICAgICAgICAgICAgICBbb3MuZnNlbmNvZGUocGF0aCkgZm9yIHBhdGggaW4gc2VsZi5jcmVhdGVkX3BhdGhzXSkKIAogCiBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3RzIikKQEAgLTE5NjYsNTEgKzE5NjEsNDUgQEAKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvcy5sc3RhdChsaW5rKSwgb3Muc3RhdChsaW5rKSkKIAogICAgICAgICBieXRlc19saW5rID0gb3MuZnNlbmNvZGUobGluaykKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihUcnVlKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChieXRlc19saW5rKSwgb3Muc3RhdCh0YXJnZXQpKQorICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9zLmxzdGF0KGJ5dGVzX2xpbmspLCBvcy5zdGF0KGJ5dGVzX2xpbmspKQogCiAgICAgZGVmIHRlc3RfMTIwODQoc2VsZik6CiAgICAgICAgIGxldmVsMSA9IG9zLnBhdGguYWJzcGF0aChzdXBwb3J0LlRFU1RGTikKICAgICAgICAgbGV2ZWwyID0gb3MucGF0aC5qb2luKGxldmVsMSwgImxldmVsMiIpCiAgICAgICAgIGxldmVsMyA9IG9zLnBhdGguam9pbihsZXZlbDIsICJsZXZlbDMiKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC5ybXRyZWUsIGxldmVsMSkKKworICAgICAgICBvcy5ta2RpcihsZXZlbDEpCisgICAgICAgIG9zLm1rZGlyKGxldmVsMikKKyAgICAgICAgb3MubWtkaXIobGV2ZWwzKQorCisgICAgICAgIGZpbGUxID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihsZXZlbDEsICJmaWxlMSIpKQorICAgICAgICBjcmVhdGVfZmlsZShmaWxlMSkKKworICAgICAgICBvcmlnX2RpciA9IG9zLmdldGN3ZCgpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLm1rZGlyKGxldmVsMSkKLSAgICAgICAgICAgIG9zLm1rZGlyKGxldmVsMikKLSAgICAgICAgICAgIG9zLm1rZGlyKGxldmVsMykKKyAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMikKKyAgICAgICAgICAgIGxpbmsgPSBvcy5wYXRoLmpvaW4obGV2ZWwyLCAibGluayIpCisgICAgICAgICAgICBvcy5zeW1saW5rKG9zLnBhdGgucmVscGF0aChmaWxlMSksICJsaW5rIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImxpbmsiLCBvcy5saXN0ZGlyKG9zLmdldGN3ZCgpKSkKIAotICAgICAgICAgICAgZmlsZTEgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGxldmVsMSwgImZpbGUxIikpCisgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSB0aGUgc2FtZSBkaXIgYXMgdGhlIGxpbmsKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksIG9zLnN0YXQoImxpbmsiKSkKIAotICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGUxLCAidyIpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZi53cml0ZSgiZmlsZTEiKQorICAgICAgICAgICAgIyBDaGVjayBvcy5zdGF0IGNhbGxzIGZyb20gYSBkaXIgYmVsb3cgdGhlIGxpbmsKKyAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQob3MucGF0aC5yZWxwYXRoKGxpbmspKSkKIAotICAgICAgICAgICAgb3JpZ19kaXIgPSBvcy5nZXRjd2QoKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMikKLSAgICAgICAgICAgICAgICBsaW5rID0gb3MucGF0aC5qb2luKGxldmVsMiwgImxpbmsiKQotICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsob3MucGF0aC5yZWxwYXRoKGZpbGUxKSwgImxpbmsiKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImxpbmsiLCBvcy5saXN0ZGlyKG9zLmdldGN3ZCgpKSkKLQotICAgICAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIHRoZSBzYW1lIGRpciBhcyB0aGUgbGluawotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksIG9zLnN0YXQoImxpbmsiKSkKLQotICAgICAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIGEgZGlyIGJlbG93IHRoZSBsaW5rCi0gICAgICAgICAgICAgICAgb3MuY2hkaXIobGV2ZWwxKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KG9zLnBhdGgucmVscGF0aChsaW5rKSkpCi0KLSAgICAgICAgICAgICAgICAjIENoZWNrIG9zLnN0YXQgY2FsbHMgZnJvbSBhIGRpciBhYm92ZSB0aGUgbGluawotICAgICAgICAgICAgICAgIG9zLmNoZGlyKGxldmVsMykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChvcy5wYXRoLnJlbHBhdGgobGluaykpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBvcy5jaGRpcihvcmlnX2RpcikKLSAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgotICAgICAgICAgICAgc2VsZi5mYWlsKGVycikKKyAgICAgICAgICAgICMgQ2hlY2sgb3Muc3RhdCBjYWxscyBmcm9tIGEgZGlyIGFib3ZlIHRoZSBsaW5rCisgICAgICAgICAgICBvcy5jaGRpcihsZXZlbDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoZmlsZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KG9zLnBhdGgucmVscGF0aChsaW5rKSkpCiAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBvcy5yZW1vdmUoZmlsZTEpCi0gICAgICAgICAgICBzaHV0aWwucm10cmVlKGxldmVsMSkKKyAgICAgICAgICAgIG9zLmNoZGlyKG9yaWdfZGlyKQogCiAKIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luMzIgc3BlY2lmaWMgdGVzdHMiKQpAQCAtMjE0Niw4ICsyMTM1LDggQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbmV3X3ByaW8gPSBvcy5nZXRwcmlvcml0eShvcy5QUklPX1BST0NFU1MsIG9zLmdldHBpZCgpKQogICAgICAgICAgICAgaWYgYmFzZSA+PSAxOSBhbmQgbmV3X3ByaW8gPD0gMTk6Ci0gICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoCi0gICAgICAidW5hYmxlIHRvIHJlbGlhYmx5IHRlc3Qgc2V0cHJpb3JpdHkgYXQgY3VycmVudCBuaWNlIGxldmVsIG9mICVzIiAlIGJhc2UpCisgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInVuYWJsZSB0byByZWxpYWJseSB0ZXN0IHNldHByaW9yaXR5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgY3VycmVudCBuaWNlIGxldmVsIG9mICVzIiAlIGJhc2UpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X3ByaW8sIGJhc2UgKyAxKQogICAgICAgICBmaW5hbGx5OgpAQCAtMjI1Nyw4ICsyMjQ2LDcgQEAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgICBjbHMua2V5ID0gc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQotICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6Ci0gICAgICAgICAgICBmLndyaXRlKGNscy5EQVRBKQorICAgICAgICBjcmVhdGVfZmlsZShzdXBwb3J0LlRFU1RGTiwgY2xzLkRBVEEpCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgpAQCAtMjQwOCwxMCArMjM5NiwxMSBAQAogICAgIGRlZiB0ZXN0X3RyYWlsZXJzKHNlbGYpOgogICAgICAgICBURVNURk4yID0gc3VwcG9ydC5URVNURk4gKyAiMiIKICAgICAgICAgZmlsZV9kYXRhID0gYiJhYmNkZWYiCi0gICAgICAgIHdpdGggb3BlbihURVNURk4yLCAnd2InKSBhcyBmOgotICAgICAgICAgICAgZi53cml0ZShmaWxlX2RhdGEpCi0gICAgICAgIHdpdGggb3BlbihURVNURk4yLCAncmInKWFzIGY6Ci0gICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBURVNURk4yKQorCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgVEVTVEZOMikKKyAgICAgICAgY3JlYXRlX2ZpbGUoVEVTVEZOMiwgZmlsZV9kYXRhKQorCisgICAgICAgIHdpdGggb3BlbihURVNURk4yLCAncmInKSBhcyBmOgogICAgICAgICAgICAgb3Muc2VuZGZpbGUoc2VsZi5zb2Nrbm8sIGYuZmlsZW5vKCksIDAsIGxlbihmaWxlX2RhdGEpLAogICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxlcnM9W2IiMTIzNCJdKQogICAgICAgICAgICAgc2VsZi5jbGllbnQuY2xvc2UoKQpAQCAtMjQzNCwzNSArMjQyMywzNyBAQAogZGVmIHN1cHBvcnRzX2V4dGVuZGVkX2F0dHJpYnV0ZXMoKToKICAgICBpZiBub3QgaGFzYXR0cihvcywgInNldHhhdHRyIik6CiAgICAgICAgIHJldHVybiBGYWxzZQorCiAgICAgdHJ5OgotICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICJ4YiIsIDApIGFzIGZwOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIG9zLnNldHhhdHRyKGZwLmZpbGVubygpLCBiInVzZXIudGVzdCIsIGIiIikKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgIGZpbmFsbHk6CiAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQotICAgICMgS2VybmVscyA8IDIuNi4zOSBkb24ndCByZXNwZWN0IHNldHhhdHRyIGZsYWdzLgotICAgIGtlcm5lbF92ZXJzaW9uID0gcGxhdGZvcm0ucmVsZWFzZSgpCi0gICAgbSA9IHJlLm1hdGNoKCIyLjYuKFxkezEsMn0pIiwga2VybmVsX3ZlcnNpb24pCi0gICAgcmV0dXJuIG0gaXMgTm9uZSBvciBpbnQobS5ncm91cCgxKSkgPj0gMzkKKworICAgIHJldHVybiBUcnVlCiAKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3VwcG9ydHNfZXh0ZW5kZWRfYXR0cmlidXRlcygpLAogICAgICAgICAgICAgICAgICAgICAgIm5vIG5vbi1icm9rZW4gZXh0ZW5kZWQgYXR0cmlidXRlIHN1cHBvcnQiKQorIyBLZXJuZWxzIDwgMi42LjM5IGRvbid0IHJlc3BlY3Qgc2V0eGF0dHIgZmxhZ3MuCitAc3VwcG9ydC5yZXF1aXJlc19saW51eF92ZXJzaW9uKDIsIDYsIDM5KQogY2xhc3MgRXh0ZW5kZWRBdHRyaWJ1dGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQotCiAgICAgZGVmIF9jaGVja194YXR0cnNfc3RyKHNlbGYsIHMsIGdldHhhdHRyLCBzZXR4YXR0ciwgcmVtb3ZleGF0dHIsIGxpc3R4YXR0ciwgKiprd2FyZ3MpOgogICAgICAgICBmbiA9IHN1cHBvcnQuVEVTVEZOCi0gICAgICAgIG9wZW4oZm4sICJ3YiIpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmbikKKyAgICAgICAgY3JlYXRlX2ZpbGUoZm4pCisKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBjbToKICAgICAgICAgICAgIGdldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QiKSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FTk9EQVRBKQorCiAgICAgICAgIGluaXRfeGF0dHIgPSBsaXN0eGF0dHIoZm4pCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpbml0X3hhdHRyLCBsaXN0KQorCiAgICAgICAgIHNldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QiKSwgYiIiLCAqKmt3YXJncykKICAgICAgICAgeGF0dHIgPSBzZXQoaW5pdF94YXR0cikKICAgICAgICAgeGF0dHIuYWRkKCJ1c2VyLnRlc3QiKQpAQCAtMjQ3MCwxOSArMjQ2MSwyNCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldHhhdHRyKGZuLCBiInVzZXIudGVzdCIsICoqa3dhcmdzKSwgYiIiKQogICAgICAgICBzZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksIGIiaGVsbG8iLCBvcy5YQVRUUl9SRVBMQUNFLCAqKmt3YXJncykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXR4YXR0cihmbiwgYiJ1c2VyLnRlc3QiLCAqKmt3YXJncyksIGIiaGVsbG8iKQorCiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgY206CiAgICAgICAgICAgICBzZXR4YXR0cihmbiwgcygidXNlci50ZXN0IiksIGIiYnllIiwgb3MuWEFUVFJfQ1JFQVRFLCAqKmt3YXJncykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVFWElTVCkKKwogICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGNtOgogICAgICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdDIiKSwgYiJieWUiLCBvcy5YQVRUUl9SRVBMQUNFLCAqKmt3YXJncykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVOT0RBVEEpCisKICAgICAgICAgc2V0eGF0dHIoZm4sIHMoInVzZXIudGVzdDIiKSwgYiJmb28iLCBvcy5YQVRUUl9DUkVBVEUsICoqa3dhcmdzKQogICAgICAgICB4YXR0ci5hZGQoInVzZXIudGVzdDIiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChsaXN0eGF0dHIoZm4pKSwgeGF0dHIpCiAgICAgICAgIHJlbW92ZXhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QiKSwgKiprd2FyZ3MpCisKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBjbToKICAgICAgICAgICAgIGdldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QiKSwgKiprd2FyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FTk9EQVRBKQorCiAgICAgICAgIHhhdHRyLnJlbW92ZSgidXNlci50ZXN0IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobGlzdHhhdHRyKGZuKSksIHhhdHRyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldHhhdHRyKGZuLCBzKCJ1c2VyLnRlc3QyIiksICoqa3dhcmdzKSwgYiJmb28iKQpAQCAtMjQ5NSwxMSArMjQ5MSwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChsaXN0eGF0dHIoZm4pKSwgc2V0KGluaXRfeGF0dHIpIHwgc2V0KG1hbnkpKQogCiAgICAgZGVmIF9jaGVja194YXR0cnMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgICAgZGVmIG1ha2VfYnl0ZXMocyk6Ci0gICAgICAgICAgICByZXR1cm4gYnl0ZXMocywgImFzY2lpIikKICAgICAgICAgc2VsZi5fY2hlY2tfeGF0dHJzX3N0cihzdHIsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHNlbGYuX2NoZWNrX3hhdHRyc19zdHIobWFrZV9ieXRlcywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIHNlbGYuX2NoZWNrX3hhdHRyc19zdHIob3MuZnNlbmNvZGUsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCiAKICAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrX3hhdHRycyhvcy5nZXR4YXR0ciwgb3Muc2V0eGF0dHIsIG9zLnJlbW92ZXhhdHRyLApAQCAtMjUxNCwxMCArMjUxMCwxMCBAQAogICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGZwOgogICAgICAgICAgICAgICAgIHJldHVybiBvcy5nZXR4YXR0cihmcC5maWxlbm8oKSwgKmFyZ3MpCiAgICAgICAgIGRlZiBzZXR4YXR0cihwYXRoLCAqYXJncyk6Ci0gICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgIndiIikgYXMgZnA6CisgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgIndiIiwgMCkgYXMgZnA6CiAgICAgICAgICAgICAgICAgb3Muc2V0eGF0dHIoZnAuZmlsZW5vKCksICphcmdzKQogICAgICAgICBkZWYgcmVtb3ZleGF0dHIocGF0aCwgKmFyZ3MpOgotICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJ3YiIsIDApIGFzIGZwOgogICAgICAgICAgICAgICAgIG9zLnJlbW92ZXhhdHRyKGZwLmZpbGVubygpLCAqYXJncykKICAgICAgICAgZGVmIGxpc3R4YXR0cihwYXRoLCAqYXJncyk6CiAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInJiIikgYXMgZnA6CkBAIC0yNTMwLDM2ICsyNTI2LDM5IEBACiAgICAgZGVmIHRlc3RfZGVwcmVjYXRlZChzZWxmKToKICAgICAgICAgaW1wb3J0IG50CiAgICAgICAgIGZpbGVuYW1lID0gb3MuZnNlbmNvZGUoc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKLSAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiZXJyb3IiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICBmb3IgZnVuYywgKmFyZ3MgaW4gKAotICAgICAgICAgICAgICAgIChudC5fZ2V0ZnVsbHBhdGhuYW1lLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG50Ll9pc2RpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5hY2Nlc3MsIGZpbGVuYW1lLCBvcy5SX09LKSwKLSAgICAgICAgICAgICAgICAob3MuY2hkaXIsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MuY2htb2QsIGZpbGVuYW1lLCAwbzc3NyksCi0gICAgICAgICAgICAgICAgKG9zLmdldGN3ZGIsKSwKLSAgICAgICAgICAgICAgICAob3MubGluaywgZmlsZW5hbWUsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAob3MubGlzdGRpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5sc3RhdCwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5ta2RpciwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5vcGVuLCBmaWxlbmFtZSwgb3MuT19SRE9OTFkpLAotICAgICAgICAgICAgICAgIChvcy5yZW5hbWUsIGZpbGVuYW1lLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLnJtZGlyLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLnN0YXJ0ZmlsZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy5zdGF0LCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgKG9zLnVubGluaywgZmlsZW5hbWUpLAotICAgICAgICAgICAgICAgIChvcy51dGltZSwgZmlsZW5hbWUpLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcsIGZ1bmMsICphcmdzKQorICAgICAgICBmb3IgZnVuYywgKmFyZ3MgaW4gKAorICAgICAgICAgICAgKG50Ll9nZXRmdWxscGF0aG5hbWUsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChudC5faXNkaXIsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5hY2Nlc3MsIGZpbGVuYW1lLCBvcy5SX09LKSwKKyAgICAgICAgICAgIChvcy5jaGRpciwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLmNobW9kLCBmaWxlbmFtZSwgMG83NzcpLAorICAgICAgICAgICAgKG9zLmdldGN3ZGIsKSwKKyAgICAgICAgICAgIChvcy5saW5rLCBmaWxlbmFtZSwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLmxpc3RkaXIsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5sc3RhdCwgZmlsZW5hbWUpLAorICAgICAgICAgICAgKG9zLm1rZGlyLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3Mub3BlbiwgZmlsZW5hbWUsIG9zLk9fUkRPTkxZKSwKKyAgICAgICAgICAgIChvcy5yZW5hbWUsIGZpbGVuYW1lLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3Mucm1kaXIsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5zdGFydGZpbGUsIGZpbGVuYW1lKSwKKyAgICAgICAgICAgIChvcy5zdGF0LCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MudW5saW5rLCBmaWxlbmFtZSksCisgICAgICAgICAgICAob3MudXRpbWUsIGZpbGVuYW1lKSwKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdpdGggYnl0ZXNfZmlsZW5hbWVfd2FybihUcnVlKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3MpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIE9TRXJyb3IsIHdlIG9ubHkgY2FyZSBhYm91dCBEZXByZWNhdGlvbldhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgcGFzcwogCiAgICAgQHN1cHBvcnQuc2tpcF91bmxlc3Nfc3ltbGluawogICAgIGRlZiB0ZXN0X3N5bWxpbmsoc2VsZik6CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisKICAgICAgICAgZmlsZW5hbWUgPSBvcy5mc2VuY29kZShzdXBwb3J0LlRFU1RGTikKLSAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgotICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJlcnJvciIsIERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERlcHJlY2F0aW9uV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN5bWxpbmssIGZpbGVuYW1lLCBmaWxlbmFtZSkKKyAgICAgICAgd2l0aCBieXRlc19maWxlbmFtZV93YXJuKFRydWUpOgorICAgICAgICAgICAgb3Muc3ltbGluayhmaWxlbmFtZSwgZmlsZW5hbWUpCiAKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldF90ZXJtaW5hbF9zaXplJyksICJyZXF1aXJlcyBvcy5nZXRfdGVybWluYWxfc2l6ZSIpCkBAIC0yNjk3LDcgKzI2OTYsOCBAQAogICAgICAgICBmb3IgZmlsZW5hbWVzLCBmdW5jLCAqZnVuY19hcmdzIGluIGZ1bmNzOgogICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgZnVuYyhuYW1lLCAqZnVuY19hcmdzKQorICAgICAgICAgICAgICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oRmFsc2UpOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyhuYW1lLCAqZnVuY19hcmdzKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhlcnIuZmlsZW5hbWUsIG5hbWUpCiAgICAgICAgICAgICAgICAgZWxzZToKQEAgLTI4MjAsMTUgKzI4MjAsMTggQEAKIAogCiBjbGFzcyBUZXN0U2NhbmRpcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZyA9IHN1cHBvcnQuY2hlY2tfbm9fcmVzb3VyY2Vfd2FybmluZworCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmJ5dGVzX3BhdGggPSBvcy5mc2VuY29kZShzZWxmLnBhdGgpCiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgc2VsZi5wYXRoKQogICAgICAgICBvcy5ta2RpcihzZWxmLnBhdGgpCiAKICAgICBkZWYgY3JlYXRlX2ZpbGUoc2VsZiwgbmFtZT0iZmlsZS50eHQiKToKLSAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBuYW1lKQotICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3YiIpIGFzIGZwOgotICAgICAgICAgICAgZnAud3JpdGUoYidweXRob24nKQorICAgICAgICBwYXRoID0gc2VsZi5ieXRlc19wYXRoIGlmIGlzaW5zdGFuY2UobmFtZSwgYnl0ZXMpIGVsc2Ugc2VsZi5wYXRoCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCisgICAgICAgIGNyZWF0ZV9maWxlKGZpbGVuYW1lLCBiJ3B5dGhvbicpCiAgICAgICAgIHJldHVybiBmaWxlbmFtZQogCiAgICAgZGVmIGdldF9lbnRyaWVzKHNlbGYsIG5hbWVzKToKQEAgLTI4NTEsNiArMjg1NCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQxLCBzdGF0MikKIAogICAgIGRlZiBjaGVja19lbnRyeShzZWxmLCBlbnRyeSwgbmFtZSwgaXNfZGlyLCBpc19maWxlLCBpc19zeW1saW5rKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVudHJ5LCBvcy5EaXJFbnRyeSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyeS5uYW1lLCBuYW1lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5LnBhdGgsIG9zLnBhdGguam9pbihzZWxmLnBhdGgsIG5hbWUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5Lmlub2RlKCksCkBAIC0yOTE2LDE1ICsyOTIwLDE2IEBACiAgICAgICAgICAgICBzZWxmLmNoZWNrX2VudHJ5KGVudHJ5LCAnc3ltbGlua19maWxlLnR4dCcsIEZhbHNlLCBUcnVlLCBUcnVlKQogCiAgICAgZGVmIGdldF9lbnRyeShzZWxmLCBuYW1lKToKLSAgICAgICAgZW50cmllcyA9IGxpc3Qob3Muc2NhbmRpcihzZWxmLnBhdGgpKQorICAgICAgICBwYXRoID0gc2VsZi5ieXRlc19wYXRoIGlmIGlzaW5zdGFuY2UobmFtZSwgYnl0ZXMpIGVsc2Ugc2VsZi5wYXRoCisgICAgICAgIGVudHJpZXMgPSBsaXN0KG9zLnNjYW5kaXIocGF0aCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVudHJpZXMpLCAxKQogCiAgICAgICAgIGVudHJ5ID0gZW50cmllc1swXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5Lm5hbWUsIG5hbWUpCiAgICAgICAgIHJldHVybiBlbnRyeQogCi0gICAgZGVmIGNyZWF0ZV9maWxlX2VudHJ5KHNlbGYpOgotICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3JlYXRlX2ZpbGUoKQorICAgIGRlZiBjcmVhdGVfZmlsZV9lbnRyeShzZWxmLCBuYW1lPSdmaWxlLnR4dCcpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3JlYXRlX2ZpbGUobmFtZT1uYW1lKQogICAgICAgICByZXR1cm4gc2VsZi5nZXRfZW50cnkob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAKICAgICBkZWYgdGVzdF9jdXJyZW50X2RpcmVjdG9yeShzZWxmKToKQEAgLTI5NDUsNiArMjk1MCwxOSBAQAogICAgICAgICBlbnRyeSA9IHNlbGYuY3JlYXRlX2ZpbGVfZW50cnkoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZW50cnkpLCAiPERpckVudHJ5ICdmaWxlLnR4dCc+IikKIAorICAgIGRlZiB0ZXN0X2ZzcGF0aF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgZW50cnkgPSBzZWxmLmNyZWF0ZV9maWxlX2VudHJ5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5mc3BhdGgoZW50cnkpLCBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnZmlsZS50eHQnKSkKKworICAgIEB1bml0dGVzdC5za2lwSWYob3MubmFtZSA9PSAibnQiLCAidGVzdCByZXF1aXJlcyBieXRlcyBwYXRoIHN1cHBvcnQiKQorICAgIGRlZiB0ZXN0X2ZzcGF0aF9wcm90b2NvbF9ieXRlcyhzZWxmKToKKyAgICAgICAgYnl0ZXNfZmlsZW5hbWUgPSBvcy5mc2VuY29kZSgnYnl0ZXNmaWxlLnR4dCcpCisgICAgICAgIGJ5dGVzX2VudHJ5ID0gc2VsZi5jcmVhdGVfZmlsZV9lbnRyeShuYW1lPWJ5dGVzX2ZpbGVuYW1lKQorICAgICAgICBmc3BhdGggPSBvcy5mc3BhdGgoYnl0ZXNfZW50cnkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmc3BhdGgsIGJ5dGVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MuZnNlbmNvZGUoc2VsZi5wYXRoKSxieXRlc19maWxlbmFtZSkpCisKICAgICBkZWYgdGVzdF9yZW1vdmVkX2RpcihzZWxmKToKICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsICdkaXInKQogCkBAIC0zMDEwLDcgKzMwMjgsOCBAQAogICAgIGRlZiB0ZXN0X2J5dGVzKHNlbGYpOgogICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIG9zLnNjYW5kaXIoYnl0ZXMpIG11c3QgcmFpc2UgYW4gZXhjZXB0aW9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9zLnNjYW5kaXIsIGInLicpCisgICAgICAgICAgICB3aXRoIGJ5dGVzX2ZpbGVuYW1lX3dhcm4oVHJ1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5zY2FuZGlyLCBiJy4nKQogICAgICAgICAgICAgcmV0dXJuCiAKICAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQpAQCAtMzA0Miw2ICszMDYxLDEyMSBAQAogICAgICAgICBmb3Igb2JqIGluIFsxMjM0LCAxLjIzNCwge30sIFtdXToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3Muc2NhbmRpciwgb2JqKQogCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUudHh0IikKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZTIudHh0IikKKyAgICAgICAgaXRlcmF0b3IgPSBvcy5zY2FuZGlyKHNlbGYucGF0aCkKKyAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgaXRlcmF0b3IuY2xvc2UoKQorICAgICAgICAjIG11bHRpcGxlIGNsb3NlcworICAgICAgICBpdGVyYXRvci5jbG9zZSgpCisgICAgICAgIHdpdGggc2VsZi5jaGVja19ub19yZXNvdXJjZV93YXJuaW5nKCk6CisgICAgICAgICAgICBkZWwgaXRlcmF0b3IKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICB3aXRoIG9zLnNjYW5kaXIoc2VsZi5wYXRoKSBhcyBpdGVyYXRvcjoKKyAgICAgICAgICAgIG5leHQoaXRlcmF0b3IpCisgICAgICAgIHdpdGggc2VsZi5jaGVja19ub19yZXNvdXJjZV93YXJuaW5nKCk6CisgICAgICAgICAgICBkZWwgaXRlcmF0b3IKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICB3aXRoIG9zLnNjYW5kaXIoc2VsZi5wYXRoKSBhcyBpdGVyYXRvcjoKKyAgICAgICAgICAgIG5leHQoaXRlcmF0b3IpCisgICAgICAgICAgICBpdGVyYXRvci5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXJfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlLnR4dCIpCisgICAgICAgIHNlbGYuY3JlYXRlX2ZpbGUoImZpbGUyLnR4dCIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgd2l0aCBvcy5zY2FuZGlyKHNlbGYucGF0aCkgYXMgaXRlcmF0b3I6CisgICAgICAgICAgICAgICAgbmV4dChpdGVyYXRvcikKKyAgICAgICAgICAgICAgICAxLzAKKyAgICAgICAgd2l0aCBzZWxmLmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorCisgICAgZGVmIHRlc3RfcmVzb3VyY2Vfd2FybmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVfZmlsZSgiZmlsZS50eHQiKQorICAgICAgICBzZWxmLmNyZWF0ZV9maWxlKCJmaWxlMi50eHQiKQorICAgICAgICBpdGVyYXRvciA9IG9zLnNjYW5kaXIoc2VsZi5wYXRoKQorICAgICAgICBuZXh0KGl0ZXJhdG9yKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoUmVzb3VyY2VXYXJuaW5nKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorICAgICAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgIyBleGhhdXN0ZWQgaXRlcmF0b3IKKyAgICAgICAgaXRlcmF0b3IgPSBvcy5zY2FuZGlyKHNlbGYucGF0aCkKKyAgICAgICAgbGlzdChpdGVyYXRvcikKKyAgICAgICAgd2l0aCBzZWxmLmNoZWNrX25vX3Jlc291cmNlX3dhcm5pbmcoKToKKyAgICAgICAgICAgIGRlbCBpdGVyYXRvcgorCisKK2NsYXNzIFRlc3RQRVA1MTkodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBBYnN0cmFjdGVkIHNvIGl0IGNhbiBiZSBvdmVycmlkZGVuIHRvIHRlc3QgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24KKyAgICAjIGlmIGEgQyB2ZXJzaW9uIGlzIHByb3ZpZGVkLgorICAgIGZzcGF0aCA9IHN0YXRpY21ldGhvZChvcy5mc3BhdGgpCisKKyAgICBjbGFzcyBQYXRoTGlrZToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9JycpOgorICAgICAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBkZWYgX19mc3BhdGhfXyhzZWxmKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5wYXRoLCBCYXNlRXhjZXB0aW9uKToKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLnBhdGgKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGF0aAorCisgICAgZGVmIHRlc3RfcmV0dXJuX2J5dGVzKHNlbGYpOgorICAgICAgICBmb3IgYiBpbiBiJ2hlbGxvJywgYidnb29kYnllJywgYidzb21lL3BhdGgvYW5kL2ZpbGUnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBzZWxmLmZzcGF0aChiKSkKKworICAgIGRlZiB0ZXN0X3JldHVybl9zdHJpbmcoc2VsZik6CisgICAgICAgIGZvciBzIGluICdoZWxsbycsICdnb29kYnllJywgJ3NvbWUvcGF0aC9hbmQvZmlsZSc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNlbGYuZnNwYXRoKHMpKQorCisgICAgZGVmIHRlc3RfZnNlbmNvZGVfZnNkZWNvZGUoc2VsZik6CisgICAgICAgIGZvciBwIGluICJwYXRoL2xpa2Uvb2JqZWN0IiwgYiJwYXRoL2xpa2Uvb2JqZWN0IjoKKyAgICAgICAgICAgIHBhdGhsaWtlID0gc2VsZi5QYXRoTGlrZShwKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIHNlbGYuZnNwYXRoKHBhdGhsaWtlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJwYXRoL2xpa2Uvb2JqZWN0Iiwgb3MuZnNlbmNvZGUocGF0aGxpa2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgicGF0aC9saWtlL29iamVjdCIsIG9zLmZzZGVjb2RlKHBhdGhsaWtlKSkKKworICAgIGRlZiB0ZXN0X3BhdGhsaWtlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcjZmVlbHRoZWdpbCcsIHNlbGYuZnNwYXRoKHNlbGYuUGF0aExpa2UoJyNmZWVsdGhlZ2lsJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzZWxmLlBhdGhMaWtlLCBvcy5QYXRoTGlrZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYuUGF0aExpa2UoKSwgb3MuUGF0aExpa2UpKQorCisgICAgZGVmIHRlc3RfZ2FyYmFnZV9pbl9leGNlcHRpb25fb3V0KHNlbGYpOgorICAgICAgICB2YXBvciA9IHR5cGUoJ2JsYWgnLCAoKSwge30pCisgICAgICAgIGZvciBvIGluIGludCwgdHlwZSwgb3MsIHZhcG9yKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZnNwYXRoLCBvKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRfcmVxdWlyZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mc3BhdGgpCisKKyAgICBkZWYgdGVzdF9iYWRfcGF0aGxpa2Uoc2VsZik6CisgICAgICAgICMgX19mc3BhdGhfXyByZXR1cm5zIGEgdmFsdWUgb3RoZXIgdGhhbiBzdHIgb3IgYnl0ZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mc3BhdGgsIHNlbGYuUGF0aExpa2UoNDIpKQorICAgICAgICAjIF9fZnNwYXRoX18gYXR0cmlidXRlIHRoYXQgaXMgbm90IGNhbGxhYmxlLgorICAgICAgICBjID0gdHlwZSgnZm9vJywgKCksIHt9KQorICAgICAgICBjLl9fZnNwYXRoX18gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mc3BhdGgsIGMoKSkKKyAgICAgICAgIyBfX2ZzcGF0aF9fIHJhaXNlcyBhbiBleGNlcHRpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBzZWxmLmZzcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5QYXRoTGlrZShaZXJvRGl2aXNpb25FcnJvcigpKSkKKworIyBPbmx5IHRlc3QgaWYgdGhlIEMgdmVyc2lvbiBpcyBwcm92aWRlZCwgb3RoZXJ3aXNlIFRlc3RQRVA1MTkgYWxyZWFkeSB0ZXN0ZWQKKyMgdGhlIHB1cmUgUHl0aG9uIGltcGxlbWVudGF0aW9uLgoraWYgaGFzYXR0cihvcywgIl9mc3BhdGgiKToKKyAgICBjbGFzcyBUZXN0UEVQNTE5UHVyZVB5dGhvbihUZXN0UEVQNTE5KToKKworICAgICAgICAiIiJFeHBsaWNpdGx5IHRlc3QgdGhlIHB1cmUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIG9zLmZzcGF0aCgpLiIiIgorCisgICAgICAgIGZzcGF0aCA9IHN0YXRpY21ldGhvZChvcy5fZnNwYXRoKQorCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CmluZGV4IGFiNjU3N2YuLjFlN2QzMzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGFyc2VyLnB5CkBAIC0xLDYgKzEsNSBAQAogaW1wb3J0IHBhcnNlcgogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgb3BlcmF0b3IKIGltcG9ydCBzdHJ1Y3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wYXRobGliLnB5IGIvTGliL3Rlc3QvdGVzdF9wYXRobGliLnB5CmluZGV4IGZhOTZkOWYuLjJmMmJhM2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGF0aGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BhdGhsaWIucHkKQEAgLTE5MCwxMyArMTkwLDE4IEBACiAgICAgICAgIFAgPSBzZWxmLmNscwogICAgICAgICBwID0gUCgnYScpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwLCBQKQorICAgICAgICBjbGFzcyBQYXRoTGlrZToKKyAgICAgICAgICAgIGRlZiBfX2ZzcGF0aF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiYS9iL2MiCiAgICAgICAgIFAoJ2EnLCAnYicsICdjJykKICAgICAgICAgUCgnL2EnLCAnYicsICdjJykKICAgICAgICAgUCgnYS9iL2MnKQogICAgICAgICBQKCcvYS9iL2MnKQorICAgICAgICBQKFBhdGhMaWtlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUChQKCdhJykpLCBQKCdhJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUChQKCdhJyksICdiJyksIFAoJ2EvYicpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFAoUCgnYScpLCBQKCdiJykpLCBQKCdhL2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQKFAoJ2EnKSwgUCgnYicpLCBQKCdjJykpLCBQKFBhdGhMaWtlKCkpKQogCiAgICAgZGVmIF9jaGVja19zdHJfc3ViY2xhc3Moc2VsZiwgKmFyZ3MpOgogICAgICAgICAjIElzc3VlICMyMTEyNzogaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCBhIFB1cmVQYXRoIG9iamVjdApAQCAtMzg0LDYgKzM4OSwxMiBAQAogICAgICAgICBwYXJ0cyA9IHAucGFydHMKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJ0cywgKHNlcCwgJ2EnLCAnYicpKQogCisgICAgZGVmIHRlc3RfZnNwYXRoX2NvbW1vbihzZWxmKToKKyAgICAgICAgUCA9IHNlbGYuY2xzCisgICAgICAgIHAgPSBQKCdhL2InKQorICAgICAgICBzZWxmLl9jaGVja19zdHIocC5fX2ZzcGF0aF9fKCksICgnYS9iJywpKQorICAgICAgICBzZWxmLl9jaGVja19zdHIob3MuZnNwYXRoKHApLCAoJ2EvYicsKSkKKwogICAgIGRlZiB0ZXN0X2VxdWl2YWxlbmNlcyhzZWxmKToKICAgICAgICAgZm9yIGssIHR1cGxlcyBpbiBzZWxmLmVxdWl2YWxlbmNlcy5pdGVtcygpOgogICAgICAgICAgICAgY2Fub24gPSBrLnJlcGxhY2UoJy8nLCBzZWxmLnNlcCkKQEAgLTE0NzQsMTMgKzE0ODUsMTMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQocC5nbG9iKCJkaXJBLy4uL2ZpbGUqIikpLCB7IFAoQkFTRSwgImRpckEvLi4vZmlsZUEiKSB9KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChwLmdsb2IoIi4uL3h5enp5IikpLCBzZXQoKSkKIAotICAgIGRlZiBfY2hlY2tfcmVzb2x2ZV9yZWxhdGl2ZShzZWxmLCBwLCBleHBlY3RlZCk6CisKKyAgICBkZWYgX2NoZWNrX3Jlc29sdmUoc2VsZiwgcCwgZXhwZWN0ZWQpOgogICAgICAgICBxID0gcC5yZXNvbHZlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLCBleHBlY3RlZCkKIAotICAgIGRlZiBfY2hlY2tfcmVzb2x2ZV9hYnNvbHV0ZShzZWxmLCBwLCBleHBlY3RlZCk6Ci0gICAgICAgIHEgPSBwLnJlc29sdmUoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEsIGV4cGVjdGVkKQorICAgICMgdGhpcyBjYW4gYmUgdXNlZCB0byBjaGVjayBib3RoIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSByZXNvbHV0aW9ucworICAgIF9jaGVja19yZXNvbHZlX3JlbGF0aXZlID0gX2NoZWNrX3Jlc29sdmVfYWJzb2x1dGUgPSBfY2hlY2tfcmVzb2x2ZQogCiAgICAgQHdpdGhfc3ltbGlua3MKICAgICBkZWYgdGVzdF9yZXNvbHZlX2NvbW1vbihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGRiLnB5IGIvTGliL3Rlc3QvdGVzdF9wZGIucHkKaW5kZXggNDViYTVhOS4uYTYzY2NkOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZGIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZGIucHkKQEAgLTU1OCw3ICs1NTgsNiBAQAogCiBkZWYgcGRiX2ludm9rZShtZXRob2QsIGFyZyk6CiAgICAgIiIiUnVuIHBkYi5tZXRob2QoYXJnKS4iIiIKLSAgICBpbXBvcnQgcGRiCiAgICAgZ2V0YXR0cihwZGIuUGRiKG5vc2lnaW50PVRydWUpLCBtZXRob2QpKGFyZykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlZXBob2xlci5weSBiL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CmluZGV4IDQxZTUwOTEuLmIwMzM2NDAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CkBAIC0xLDkgKzEsOCBAQAogaW1wb3J0IGRpcwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCi1mcm9tIGlvIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gbWF0aCBpbXBvcnQgY29weXNpZ24KIAogZnJvbSB0ZXN0LmJ5dGVjb2RlX2hlbHBlciBpbXBvcnQgQnl0ZWNvZGVUZXN0Q2FzZQogCkBAIC0zMCwyMiArMjksMjUgQEAKIAogICAgIGRlZiB0ZXN0X2dsb2JhbF9hc19jb25zdGFudChzZWxmKToKICAgICAgICAgIyBMT0FEX0dMT0JBTCBOb25lL1RydWUvRmFsc2UgIC0tPiAgTE9BRF9DT05TVCBOb25lL1RydWUvRmFsc2UKLSAgICAgICAgZGVmIGYoeCk6Ci0gICAgICAgICAgICBOb25lCi0gICAgICAgICAgICBOb25lCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICB4ID0gTm9uZQorICAgICAgICAgICAgeCA9IE5vbmUKICAgICAgICAgICAgIHJldHVybiB4Ci0gICAgICAgIGRlZiBnKHgpOgotICAgICAgICAgICAgVHJ1ZQorICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgeCA9IFRydWUKICAgICAgICAgICAgIHJldHVybiB4Ci0gICAgICAgIGRlZiBoKHgpOgotICAgICAgICAgICAgRmFsc2UKKyAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgIHggPSBGYWxzZQogICAgICAgICAgICAgcmV0dXJuIHgKKwogICAgICAgICBmb3IgZnVuYywgZWxlbSBpbiAoKGYsIE5vbmUpLCAoZywgVHJ1ZSksIChoLCBGYWxzZSkpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbkJ5dGVjb2RlKGZ1bmMsICdMT0FEX0dMT0JBTCcpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluQnl0ZWNvZGUoZnVuYywgJ0xPQURfQ09OU1QnLCBlbGVtKQorCiAgICAgICAgIGRlZiBmKCk6CiAgICAgICAgICAgICAnQWRkaW5nIGEgZG9jc3RyaW5nIG1hZGUgdGhpcyB0ZXN0IGZhaWwgaW4gUHkyLjUuMCcKICAgICAgICAgICAgIHJldHVybiBOb25lCisKICAgICAgICAgc2VsZi5hc3NlcnROb3RJbkJ5dGVjb2RlKGYsICdMT0FEX0dMT0JBTCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0SW5CeXRlY29kZShmLCAnTE9BRF9DT05TVCcsIE5vbmUpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMzE1MS5weSBiL0xpYi90ZXN0L3Rlc3RfcGVwMzE1MS5weQppbmRleCA3YjBkNDY1Li44NjQ5NTk2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlcDMxNTEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAzMTUxLnB5CkBAIC0yLDcgKzIsNiBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc29ja2V0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBlcnJubwogZnJvbSBlcnJubyBpbXBvcnQgRUVYSVNUCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weSBiL0xpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5CmluZGV4IDdjOThjNDYuLjI3ZDUxNGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGVwMzUyLnB5CkBAIC0xLDYgKzEsNSBAQAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgYnVpbHRpbnMKLWltcG9ydCB3YXJuaW5ncwogaW1wb3J0IG9zCiBmcm9tIHBsYXRmb3JtIGltcG9ydCBzeXN0ZW0gYXMgcGxhdGZvcm1fc3lzdGVtCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlja2xlLnB5IGIvTGliL3Rlc3QvdGVzdF9waWNrbGUucHkKaW5kZXggZDQ2N2Q1Mi4uMzY5NzBmZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9waWNrbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waWNrbGUucHkKQEAgLTM0LDggKzM0LDYgQEAKIAogICAgIHVucGlja2xlciA9IHBpY2tsZS5fVW5waWNrbGVyCiAgICAgYmFkX3N0YWNrX2Vycm9ycyA9IChJbmRleEVycm9yLCkKLSAgICBiYWRfbWFya19lcnJvcnMgPSAoSW5kZXhFcnJvciwgcGlja2xlLlVucGlja2xpbmdFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgRU9GRXJyb3IpCiAgICAgdHJ1bmNhdGVkX2Vycm9ycyA9IChwaWNrbGUuVW5waWNrbGluZ0Vycm9yLCBFT0ZFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yLCBWYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LmVycm9yLCBJbmRleEVycm9yLCBJbXBvcnRFcnJvcikKQEAgLTcwLDggKzY4LDYgQEAKICAgICBwaWNrbGVyID0gcGlja2xlLl9QaWNrbGVyCiAgICAgdW5waWNrbGVyID0gcGlja2xlLl9VbnBpY2tsZXIKICAgICBiYWRfc3RhY2tfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEluZGV4RXJyb3IpCi0gICAgYmFkX21hcmtfZXJyb3JzID0gKHBpY2tsZS5VbnBpY2tsaW5nRXJyb3IsIEluZGV4RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IsIEVPRkVycm9yKQogICAgIHRydW5jYXRlZF9lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5lcnJvciwgSW5kZXhFcnJvciwgSW1wb3J0RXJyb3IpCkBAIC0xNDMsNyArMTM5LDYgQEAKICAgICBjbGFzcyBDVW5waWNrbGVyVGVzdHMoUHlVbnBpY2tsZXJUZXN0cyk6CiAgICAgICAgIHVucGlja2xlciA9IF9waWNrbGUuVW5waWNrbGVyCiAgICAgICAgIGJhZF9zdGFja19lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwpCi0gICAgICAgIGJhZF9tYXJrX2Vycm9ycyA9IChFT0ZFcnJvciwpCiAgICAgICAgIHRydW5jYXRlZF9lcnJvcnMgPSAocGlja2xlLlVucGlja2xpbmdFcnJvciwgRU9GRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5CmluZGV4IGJiZTY4NzUuLjg2YmViZmEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waWNrbGV0b29scy5weQpAQCAtMSw5ICsxLDkgQEAKLWltcG9ydCBzdHJ1Y3QKIGltcG9ydCBwaWNrbGUKIGltcG9ydCBwaWNrbGV0b29scwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZVRlc3RzCiBmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzCitpbXBvcnQgdW5pdHRlc3QKIAogY2xhc3MgT3B0aW1pemVkUGlja2xlVGVzdHMoQWJzdHJhY3RQaWNrbGVUZXN0cywgQWJzdHJhY3RQaWNrbGVNb2R1bGVUZXN0cyk6CiAKQEAgLTU5LDggKzU5LDQwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocGlja2xlLkJJTlBVVCwgcGlja2xlZDIpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsnYnl0ZXNfdHlwZXMnLAorICAgICAgICAgICAgICAgICAgICAgJ1VQX1RPX05FV0xJTkUnLCAnVEFLRU5fRlJPTV9BUkdVTUVOVDEnLAorICAgICAgICAgICAgICAgICAgICAgJ1RBS0VOX0ZST01fQVJHVU1FTlQ0JywgJ1RBS0VOX0ZST01fQVJHVU1FTlQ0VScsCisgICAgICAgICAgICAgICAgICAgICAnVEFLRU5fRlJPTV9BUkdVTUVOVDhVJywgJ0FyZ3VtZW50RGVzY3JpcHRvcicsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91aW50MScsICdyZWFkX3VpbnQyJywgJ3JlYWRfaW50NCcsICdyZWFkX3VpbnQ0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3VpbnQ4JywgJ3JlYWRfc3RyaW5nbmwnLCAncmVhZF9zdHJpbmdubF9ub2VzY2FwZScsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9zdHJpbmdubF9ub2VzY2FwZV9wYWlyJywgJ3JlYWRfc3RyaW5nMScsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9zdHJpbmc0JywgJ3JlYWRfYnl0ZXMxJywgJ3JlYWRfYnl0ZXM0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX2J5dGVzOCcsICdyZWFkX3VuaWNvZGVzdHJpbmdubCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF91bmljb2Rlc3RyaW5nMScsICdyZWFkX3VuaWNvZGVzdHJpbmc0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX3VuaWNvZGVzdHJpbmc4JywgJ3JlYWRfZGVjaW1hbG5sX3Nob3J0JywKKyAgICAgICAgICAgICAgICAgICAgICdyZWFkX2RlY2ltYWxubF9sb25nJywgJ3JlYWRfZmxvYXRubCcsICdyZWFkX2Zsb2F0OCcsCisgICAgICAgICAgICAgICAgICAgICAncmVhZF9sb25nMScsICdyZWFkX2xvbmc0JywKKyAgICAgICAgICAgICAgICAgICAgICd1aW50MScsICd1aW50MicsICdpbnQ0JywgJ3VpbnQ0JywgJ3VpbnQ4JywgJ3N0cmluZ25sJywKKyAgICAgICAgICAgICAgICAgICAgICdzdHJpbmdubF9ub2VzY2FwZScsICdzdHJpbmdubF9ub2VzY2FwZV9wYWlyJywgJ3N0cmluZzEnLAorICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZzQnLCAnYnl0ZXMxJywgJ2J5dGVzNCcsICdieXRlczgnLAorICAgICAgICAgICAgICAgICAgICAgJ3VuaWNvZGVzdHJpbmdubCcsICd1bmljb2Rlc3RyaW5nMScsICd1bmljb2Rlc3RyaW5nNCcsCisgICAgICAgICAgICAgICAgICAgICAndW5pY29kZXN0cmluZzgnLCAnZGVjaW1hbG5sX3Nob3J0JywgJ2RlY2ltYWxubF9sb25nJywKKyAgICAgICAgICAgICAgICAgICAgICdmbG9hdG5sJywgJ2Zsb2F0OCcsICdsb25nMScsICdsb25nNCcsCisgICAgICAgICAgICAgICAgICAgICAnU3RhY2tPYmplY3QnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5aW50JywgJ3B5bG9uZycsICdweWludGVnZXJfb3JfYm9vbCcsICdweWJvb2wnLCAncHlmbG9hdCcsCisgICAgICAgICAgICAgICAgICAgICAncHlieXRlc19vcl9zdHInLCAncHlzdHJpbmcnLCAncHlieXRlcycsICdweXVuaWNvZGUnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5bm9uZScsICdweXR1cGxlJywgJ3B5bGlzdCcsICdweWRpY3QnLCAncHlzZXQnLAorICAgICAgICAgICAgICAgICAgICAgJ3B5ZnJvemVuc2V0JywgJ2FueW9iamVjdCcsICdtYXJrb2JqZWN0JywgJ3N0YWNrc2xpY2UnLAorICAgICAgICAgICAgICAgICAgICAgJ09wY29kZUluZm8nLCAnb3Bjb2RlcycsICdjb2RlMm9wJywKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgcGlja2xldG9vbHMsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KE9wdGltaXplZFBpY2tsZVRlc3RzKQorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KE1pc2NUZXN0Q2FzZSkKICAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHBpY2tsZXRvb2xzKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X3BpcGVzLnB5CmluZGV4IDZhN2I0NWYuLmFkMDFkMDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGlwZXMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9waXBlcy5weQpAQCAtMiw2ICsyLDcgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN0cmluZwogaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2h1dGlsCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QsIHVubGluaywgcmVhcF9jaGlsZHJlbgogCiBpZiBvcy5uYW1lICE9ICdwb3NpeCc6CkBAIC0xOCw2ICsxOSw4IEBACiAgICAgICAgICAgICB1bmxpbmsoZikKIAogICAgIGRlZiB0ZXN0U2ltcGxlUGlwZTEoc2VsZik6CisgICAgICAgIGlmIHNodXRpbC53aGljaCgndHInKSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndHIgaXMgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCiAgICAgICAgIHQuYXBwZW5kKHNfY29tbWFuZCwgcGlwZXMuU1RESU5fU1RET1VUKQogICAgICAgICBmID0gdC5vcGVuKFRFU1RGTiwgJ3cnKQpAQCAtMjcsNiArMzAsOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJ0hFTExPIFdPUkxEICMxJykKIAogICAgIGRlZiB0ZXN0U2ltcGxlUGlwZTIoc2VsZik6CisgICAgICAgIGlmIHNodXRpbC53aGljaCgndHInKSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndHIgaXMgbm90IGF2YWlsYWJsZScpCiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZjoKICAgICAgICAgICAgIGYud3JpdGUoJ2hlbGxvIHdvcmxkICMyJykKICAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKQEAgLTM2LDYgKzQxLDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdIRUxMTyBXT1JMRCAjMicpCiAKICAgICBkZWYgdGVzdFNpbXBsZVBpcGUzKHNlbGYpOgorICAgICAgICBpZiBzaHV0aWwud2hpY2goJ3RyJykgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3RyIGlzIG5vdCBhdmFpbGFibGUnKQogICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGY6CiAgICAgICAgICAgICBmLndyaXRlKCdoZWxsbyB3b3JsZCAjMicpCiAgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BrZ3V0aWwucHkgYi9MaWIvdGVzdC90ZXN0X3BrZ3V0aWwucHkKaW5kZXggOWQyMDM1NC4uYTgyMDU4NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wa2d1dGlsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGtndXRpbC5weQpAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoWzBdCiAKICAgICBkZWYgdGVzdF9nZXRkYXRhX3BlcDMwMihzZWxmKToKLSAgICAgICAgIyBVc2UgYSBkdW1teSBpbXBvcnRlci9sb2FkZXIKKyAgICAgICAgIyBVc2UgYSBkdW1teSBmaW5kZXIvbG9hZGVyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGtndXRpbC5nZXRfZGF0YSgnZm9vJywgJ2R1bW15JyksICJIZWxsbywgd29ybGQhIikKICAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydmb28nXQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BsaXN0bGliLnB5IGIvTGliL3Rlc3QvdGVzdF9wbGlzdGxpYi5weQppbmRleCAxNjExNGY5Li42MGZmOTE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BsaXN0bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGxpc3RsaWIucHkKQEAgLTcsNyArNyw2IEBACiBpbXBvcnQgY29kZWNzCiBpbXBvcnQgYmluYXNjaWkKIGltcG9ydCBjb2xsZWN0aW9ucwotaW1wb3J0IHN0cnVjdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCiAKQEAgLTUyNyw4ICs1MjYsMTQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdXIsIGluX2RhdGEpCiAKIAorY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsiUGxpc3RGb3JtYXQiLCAiUExJU1RIRUFERVIifQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBwbGlzdGxpYiwgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFBsaXN0bGliLCBUZXN0UGxpc3RsaWJEZXByZWNhdGVkKQorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RQbGlzdGxpYiwgVGVzdFBsaXN0bGliRGVwcmVjYXRlZCwgTWlzY1Rlc3RDYXNlKQogCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BvcGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CmluZGV4IGJjZWViOTMuLjdiOTYwNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5CkBAIC04LDcgKzgsNiBAQAogaW1wb3J0IGFzeW5jaGF0CiBpbXBvcnQgc29ja2V0CiBpbXBvcnQgb3MKLWltcG9ydCB0aW1lCiBpbXBvcnQgZXJybm8KIAogZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UsIHNraXBVbmxlc3MKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CmluZGV4IDJhNTljMzguLjZhMWM4MjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQpAQCAtMTEsNyArMTEsNiBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcGxhdGZvcm0KIGltcG9ydCBwd2QKLWltcG9ydCBzaHV0aWwKIGltcG9ydCBzdGF0CiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB1bml0dGVzdApAQCAtNDExLDcgKzQxMCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdGF0KGJ5dGVhcnJheShvcy5mc2VuY29kZShzdXBwb3J0LlRFU1RGTikpKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAnY2FuXCd0IHNwZWNpZnkgTm9uZSBmb3IgcGF0aCBhcmd1bWVudCcsCisgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBzdHJpbmcsIGJ5dGVzIG9yIGludGVnZXIsIG5vdCcsCiAgICAgICAgICAgICAgICAgcG9zaXguc3RhdCwgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBzdHJpbmcsIGJ5dGVzIG9yIGludGVnZXIsIG5vdCcsCkBAIC04NjMsOSArODYyLDkgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEsIHMyKQogICAgICAgICAgICAgczIgPSBwb3NpeC5zdGF0KHN1cHBvcnQuVEVTVEZOLCBkaXJfZmQ9Tm9uZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEsIHMyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleChUeXBlRXJyb3IsICdzaG91bGQgYmUgaW50ZWdlciwgbm90JywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnc2hvdWxkIGJlIGludGVnZXIgb3IgTm9uZSwgbm90JywKICAgICAgICAgICAgICAgICAgICAgcG9zaXguc3RhdCwgc3VwcG9ydC5URVNURk4sIGRpcl9mZD1wb3NpeC5nZXRjd2QoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoVHlwZUVycm9yLCAnc2hvdWxkIGJlIGludGVnZXIsIG5vdCcsCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgJ3Nob3VsZCBiZSBpbnRlZ2VyIG9yIE5vbmUsIG5vdCcsCiAgICAgICAgICAgICAgICAgICAgIHBvc2l4LnN0YXQsIHN1cHBvcnQuVEVTVEZOLCBkaXJfZmQ9ZmxvYXQoZikpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICBwb3NpeC5zdGF0LCBzdXBwb3J0LlRFU1RGTiwgZGlyX2ZkPTEwKioyMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkKaW5kZXggYWNmMTEwMi4uNGZmNDQ1ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkKQEAgLTEsNyArMSw1IEBACi1pbXBvcnQgaXRlcnRvb2xzCiBpbXBvcnQgb3MKIGltcG9ydCBwb3NpeHBhdGgKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIHBvc2l4cGF0aCBpbXBvcnQgcmVhbHBhdGgsIGFic3BhdGgsIGRpcm5hbWUsIGJhc2VuYW1lCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvdy5weSBiL0xpYi90ZXN0L3Rlc3RfcG93LnB5CmluZGV4IDZmZWFjNDAuLmNlOTlmZTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG93LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG93LnB5CkBAIC0xLDQgKzEsNCBAQAotaW1wb3J0IHRlc3Quc3VwcG9ydCwgdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAogCiBjbGFzcyBQb3dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wdHkucHkgYi9MaWIvdGVzdC90ZXN0X3B0eS5weQppbmRleCBlZjVlOTllLi4xNWY4OGU0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B0eS5weQpAQCAtMjc3LDcgKzI3Nyw2IEBACiAgICAgICAgIHNvY2tldHBhaXIgPSBzZWxmLl9zb2NrZXRwYWlyKCkKICAgICAgICAgbWFzdGVycyA9IFtzLmZpbGVubygpIGZvciBzIGluIHNvY2tldHBhaXJdCiAKLSAgICAgICAgb3MuY2xvc2UobWFzdGVyc1sxXSkKICAgICAgICAgc29ja2V0cGFpclsxXS5jbG9zZSgpCiAgICAgICAgIG9zLmNsb3NlKHdyaXRlX3RvX3N0ZGluX2ZkKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B1bGxkb20ucHkgYi9MaWIvdGVzdC90ZXN0X3B1bGxkb20ucHkKaW5kZXggMTkzMmM2Yi4uM2Q4OWUzYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wdWxsZG9tLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHVsbGRvbS5weQpAQCAtMSw2ICsxLDUgQEAKIGltcG9ydCBpbwogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgeG1sLnNheAogCiBmcm9tIHhtbC5zYXgueG1scmVhZGVyIGltcG9ydCBBdHRyaWJ1dGVzSW1wbApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQppbmRleCA2ZmZiYmJkLi4wNmMxMGMxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgICAgICMgVGhlc2Ugd2VyZSBvbmNlIGFib3V0IHRoZSAxMCBsb25nZXN0IG1vZHVsZXMKICAgICAgICAgY20oJ3JhbmRvbScsIGlnbm9yZT0oJ1JhbmRvbScsKSkgICMgZnJvbSBfcmFuZG9tIGltcG9ydCBSYW5kb20gYXMgQ29yZUdlbmVyYXRvcgogICAgICAgICBjbSgnY2dpJywgaWdub3JlPSgnbG9nJywpKSAgICAgICMgc2V0IHdpdGggPSBpbiBtb2R1bGUKLSAgICAgICAgY20oJ3BpY2tsZScpCisgICAgICAgIGNtKCdwaWNrbGUnLCBpZ25vcmU9KCdwYXJ0aWFsJywpKQogICAgICAgICBjbSgnYWlmYycsIGlnbm9yZT0oJ29wZW5mcCcsICdfYWlmY19wYXJhbXMnKSkgICMgc2V0IHdpdGggPSBpbiBtb2R1bGUKICAgICAgICAgY20oJ3NyZV9wYXJzZScsIGlnbm9yZT0oJ2R1bXAnLCAnZ3JvdXBzJykpICMgZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCAqOyBwcm9wZXJ0eQogICAgICAgICBjbSgncGRiJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkgYi9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CmluZGV4IGFlZTk3OWIuLjg4OWNlNTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWRvYy5weQpAQCAtODU1LDYgKzg1NSwyMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2dldF9zdW1tYXJ5X2xpbmUodC53cmFwKSwKICAgICAgICAgICAgICJ3cmFwKHRleHQpIG1ldGhvZCBvZiB0ZXh0d3JhcC5UZXh0V3JhcHBlciBpbnN0YW5jZSIpCiAKKyAgICBkZWYgdGVzdF9maWVsZF9vcmRlcl9mb3JfbmFtZWRfdHVwbGVzKHNlbGYpOgorICAgICAgICBQZXJzb24gPSBuYW1lZHR1cGxlKCdQZXJzb24nLCBbJ25pY2tuYW1lJywgJ2ZpcnN0bmFtZScsICdhZ2Vncm91cCddKQorICAgICAgICBzID0gcHlkb2MucmVuZGVyX2RvYyhQZXJzb24pCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhzLmluZGV4KCduaWNrbmFtZScpLCBzLmluZGV4KCdmaXJzdG5hbWUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKHMuaW5kZXgoJ2ZpcnN0bmFtZScpLCBzLmluZGV4KCdhZ2Vncm91cCcpKQorCisgICAgICAgIGNsYXNzIE5vbkl0ZXJhYmxlRmllbGRzOgorICAgICAgICAgICAgX2ZpZWxkcyA9IE5vbmUKKworICAgICAgICBjbGFzcyBOb25IYXNoYWJsZUZpZWxkczoKKyAgICAgICAgICAgIF9maWVsZHMgPSBbW11dCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlc2UgZG9lc24ndCBmYWlsCisgICAgICAgIHB5ZG9jLnJlbmRlcl9kb2MoTm9uSXRlcmFibGVGaWVsZHMpCisgICAgICAgIHB5ZG9jLnJlbmRlcl9kb2MoTm9uSGFzaGFibGVGaWVsZHMpCisKICAgICBAcmVxdWlyZXNfZG9jc3RyaW5ncwogICAgIGRlZiB0ZXN0X2JvdW5kX2J1aWx0aW5fbWV0aG9kKHNlbGYpOgogICAgICAgICBzID0gU3RyaW5nSU8oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkgYi9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weQppbmRleCA3Y2FjMDEzLi43MTU1NDRjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3F1b3ByaS5weQpAQCAtMSw2ICsxLDYgQEAKIGltcG9ydCB1bml0dGVzdAogCi1pbXBvcnQgc3lzLCBvcywgaW8sIHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMsIGlvLCBzdWJwcm9jZXNzCiBpbXBvcnQgcXVvcHJpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yYW5nZS5weSBiL0xpYi90ZXN0L3Rlc3RfcmFuZ2UucHkKaW5kZXggMTA2YzczMi4uZTAzYjU3MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yYW5nZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JhbmdlLnB5CkBAIC0xLDYgKzEsNiBAQAogIyBQeXRob24gdGVzdCBzZXQgLS0gYnVpbHQtaW4gZnVuY3Rpb25zCiAKLWltcG9ydCB0ZXN0LnN1cHBvcnQsIHVuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzeXMKIGltcG9ydCBwaWNrbGUKIGltcG9ydCBpdGVydG9vbHMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmUucHkgYi9MaWIvdGVzdC90ZXN0X3JlLnB5CmluZGV4IDdhNzQxNDEuLjI0YTA2MDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZS5weQpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNocig5KStjaHIoMTApK2NocigxMSkrY2hyKDEzKStjaHIoMTIpK2Nocig3KStjaHIoOCkpKQogICAgICAgICBmb3IgYyBpbiAnY2RlaGlqa2xtb3Bxc3V3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYyk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvcik6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdhJywgJ1xcJyArIGMsICdhJyksICdcXCcgKyBjKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdeXHMqJywgJ1gnLCAndGVzdCcpLCAnWHRlc3QnKQpAQCAtNDE0LDE5ICs0MTQsMzMgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQubWF0Y2goJ2JjJykuZ3JvdXBzKCksICgnYicsIE5vbmUsICdiJywgJ2MnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQubWF0Y2goJ2JjJykuZ3JvdXBzKCIiKSwgKCdiJywgIiIsICdiJywgJ2MnKSkKIAotICAgICAgICAjIEEgc2luZ2xlIGdyb3VwCi0gICAgICAgIG0gPSByZS5tYXRjaCgnKGEpJywgJ2EnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMCksICdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDApLCAnYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgxKSwgJ2EnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMSwgMSksICgnYScsICdhJykpCi0KICAgICAgICAgcGF0ID0gcmUuY29tcGlsZSgnKD86KD9QPGExPmEpfCg/UDxiMj5iKSkoP1A8YzM+Yyk/JykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQubWF0Y2goJ2EnKS5ncm91cCgxLCAyLCAzKSwgKCdhJywgTm9uZSwgTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdiJykuZ3JvdXAoJ2ExJywgJ2IyJywgJ2MzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICdiJywgTm9uZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdhYycpLmdyb3VwKDEsICdiMicsIDMpLCAoJ2EnLCBOb25lLCAnYycpKQogCisgICAgZGVmIHRlc3RfZ3JvdXAoc2VsZik6CisgICAgICAgIGNsYXNzIEluZGV4OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKyAgICAgICAgIyBBIHNpbmdsZSBncm91cAorICAgICAgICBtID0gcmUubWF0Y2goJyhhKShiKScsICdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgpLCAnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMCksICdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgxKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoSW5kZXgoMSkpLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG0uZ3JvdXAsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBtLmdyb3VwLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBtLmdyb3VwLCAxPDwxMDAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBtLmdyb3VwLCBJbmRleCgxPDwxMDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5ncm91cCwgJ3gnKQorICAgICAgICAjIE11bHRpcGxlIGdyb3VwcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMiwgMSksICgnYicsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cChJbmRleCgyKSwgSW5kZXgoMSkpLCAoJ2InLCAnYScpKQorCiAgICAgZGVmIHRlc3RfcmVfZnVsbG1hdGNoKHNlbGYpOgogICAgICAgICAjIElzc3VlIDE2MjAzOiBQcm9wb3NhbDogYWRkIHJlLmZ1bGxtYXRjaCgpIG1ldGhvZC4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5mdWxsbWF0Y2gociJhIiwgImEiKS5zcGFuKCksICgwLCAxKSkKQEAgLTYzMywxNCArNjQ3LDEwIEBACiAgICAgICAgIHJlLnB1cmdlKCkgICMgZm9yIHdhcm5pbmdzCiAgICAgICAgIGZvciBjIGluICdjZWdoaWprbG1vcHF5ekNFRkdISUpLTE1OT1BRUlRWWFknOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYyk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZnVsbG1hdGNoKCdcXCVjJyAlIGMsIGMpLmdyb3VwKCksIGMpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKCdcXCVjJyAlIGMsICdhJykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICdcXCVjJyAlIGMpCiAgICAgICAgIGZvciBjIGluICdjZWdoaWprbG1vcHF5ekFCQ0VGR0hJSktMTU5PUFFSVFZYWVonOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYyk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZnVsbG1hdGNoKCdbXFwlY10nICUgYywgYykuZ3JvdXAoKSwgYykKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2goJ1tcXCVjXScgJSBjLCAnYScpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnW1xcJWNdJyAlIGMpCiAKICAgICBkZWYgdGVzdF9zdHJpbmdfYm91bmRhcmllcyhzZWxmKToKICAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwNzEzCkBAIC05OTMsMTAgKzEwMDMsOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKChyIlx4JTAyeCIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiXHglMDJ4MCIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKStiIjAiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgociJceCUwMnh6IiAlIGkpLmVuY29kZSgpLCBieXRlcyhbaV0pK2IieiIpKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChiciJcdTEyMzQiLCBiJ3UxMjM0JykpCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIlxVMDAwMTIzNDUiLCBiJ1UwMDAxMjM0NScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgYnIiXHUxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsIGJyIlxVMDAwMTIzNDUiKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiXDAiLCBiIlwwMDAiKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIlwwOCIsIGIiXDAwMDgiKSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKGJyIlwwMSIsIGIiXDAwMSIpKQpAQCAtMTAxOCwxMCArMTAyNiw4IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiW1x4JTAyeF0iICUgaSkuZW5jb2RlKCksIGJ5dGVzKFtpXSkpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKChyIltceCUwMngwXSIgJSBpKS5lbmNvZGUoKSwgYnl0ZXMoW2ldKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goKHIiW1x4JTAyeHpdIiAlIGkpLmVuY29kZSgpLCBieXRlcyhbaV0pKSkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiW1x1MTIzNF0iLCBiJ3UnKSkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goYnIiW1xVMDAwMTIzNDVdIiwgYidVJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCBiciJbXHUxMjM0XSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCBiciJbXFUwMDAxMjM0NV0iKQogICAgICAgICBzZWxmLmNoZWNrUGF0dGVybkVycm9yKGJyIltcNTY3XSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidvY3RhbCBlc2NhcGUgdmFsdWUgXDU2NyBvdXRzaWRlIG9mICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ3JhbmdlIDAtMG8zNzcnLCAxKQpAQCAtMTM2MywxMiArMTM2OSwxMiBAQAogICAgICAgICBpZiBibGV0dGVyOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocGF0Lm1hdGNoKGJsZXR0ZXIpKQogICAgICAgICAjIEluY29tcGF0aWJpbGl0aWVzCi0gICAgICAgIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nLCByZS5jb21waWxlLCAnJywgcmUuTE9DQUxFKQotICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgcmUuY29tcGlsZSwgJyg/TCknKQotICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgcmUuY29tcGlsZSwgYicnLCByZS5MT0NBTEUgfCByZS5BU0NJSSkKLSAgICAgICAgc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcsIHJlLmNvbXBpbGUsIGInKD9MKScsIHJlLkFTQ0lJKQotICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgcmUuY29tcGlsZSwgYicoP2EpJywgcmUuTE9DQUxFKQotICAgICAgICBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZywgcmUuY29tcGlsZSwgYicoP2FMKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsICcnLCByZS5MT0NBTEUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsICcoP0wpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgYicnLCByZS5MT0NBTEUgfCByZS5BU0NJSSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgYicoP0wpJywgcmUuQVNDSUkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsIGInKD9hKScsIHJlLkxPQ0FMRSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgYicoP2FMKScpCiAKICAgICBkZWYgdGVzdF9idWdfNjUwOShzZWxmKToKICAgICAgICAgIyBSZXBsYWNlbWVudCBzdHJpbmdzIG9mIGJvdGggdHlwZXMgbXVzdCBwYXJzZSBwcm9wZXJseS4KQEAgLTE0MTksMTMgKzE0MjUsNiBAQAogICAgICAgICAjIFRlc3QgYmVoYXZpb3VyIHdoZW4gbm90IGdpdmVuIGEgc3RyaW5nIG9yIHBhdHRlcm4gYXMgcGFyYW1ldGVyCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmUuY29tcGlsZSwgMCkKIAotICAgIGRlZiB0ZXN0X2J1Z18xMzg5OShzZWxmKToKLSAgICAgICAgIyBJc3N1ZSAjMTM4OTk6IHJlIHBhdHRlcm4gciJbXEFdIiBzaG91bGQgd29yayBsaWtlICJBIiBidXQgbWF0Y2hlcwotICAgICAgICAjIG5vdGhpbmcuIERpdHRvIEIgYW5kIFouCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5maW5kYWxsKHInW1xBXEJcYlxDXFpdJywgJ0FCXGJDWicpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ0EnLCAnQicsICdcYicsICdDJywgJ1onXSkKLQogICAgIEBiaWdtZW10ZXN0KHNpemU9XzJHLCBtZW11c2U9MSkKICAgICBkZWYgdGVzdF9sYXJnZV9zZWFyY2goc2VsZiwgc2l6ZSk6CiAgICAgICAgICMgSXNzdWUgIzEwMTgyOiBpbmRpY2VzIHdlcmUgMzItYml0LXRydW5jYXRlZC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcmVhZGxpbmUucHkgYi9MaWIvdGVzdC90ZXN0X3JlYWRsaW5lLnB5CmluZGV4IDhjMmFkODUuLjljODk1YTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmVhZGxpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yZWFkbGluZS5weQpAQCAtMTIxLDYgKzEyMSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFUk09J3h0ZXJtLTI1NmNvbG9yJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsIGInJykKIAorICAgIGF1dG9faGlzdG9yeV9zY3JpcHQgPSAiIiJcCitpbXBvcnQgcmVhZGxpbmUKK3JlYWRsaW5lLnNldF9hdXRvX2hpc3Rvcnkoe30pCitpbnB1dCgpCitwcmludCgiSGlzdG9yeSBsZW5ndGg6IiwgcmVhZGxpbmUuZ2V0X2N1cnJlbnRfaGlzdG9yeV9sZW5ndGgoKSkKKyIiIgorCisgICAgZGVmIHRlc3RfYXV0b19oaXN0b3J5X2VuYWJsZWQoc2VsZik6CisgICAgICAgIG91dHB1dCA9IHJ1bl9wdHkoc2VsZi5hdXRvX2hpc3Rvcnlfc2NyaXB0LmZvcm1hdChUcnVlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiIkhpc3RvcnkgbGVuZ3RoOiAxXHJcbiIsIG91dHB1dCkKKworICAgIGRlZiB0ZXN0X2F1dG9faGlzdG9yeV9kaXNhYmxlZChzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gcnVuX3B0eShzZWxmLmF1dG9faGlzdG9yeV9zY3JpcHQuZm9ybWF0KEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiIkhpc3RvcnkgbGVuZ3RoOiAwXHJcbiIsIG91dHB1dCkKKwogICAgIGRlZiB0ZXN0X25vbmFzY2lpKHNlbGYpOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZWFkbGluZS5hZGRfaGlzdG9yeSgiXHhFQlx4RUYiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZWdydGVzdC5weSBiL0xpYi90ZXN0L3Rlc3RfcmVncnRlc3QucHkKaW5kZXggYTM5OGE0Zi4uMzJlZGZmOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZWdydGVzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlZ3J0ZXN0LnB5CkBAIC0xLDIxICsxLDQ4IEBACiAiIiIKIFRlc3RzIG9mIHJlZ3J0ZXN0LnB5LgorCitOb3RlOiB0ZXN0X3JlZ3J0ZXN0IGNhbm5vdCBiZSBydW4gdHdpY2UgaW4gcGFyYWxsZWwuCiAiIiIKIAotaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgY29udGV4dGxpYgogaW1wb3J0IGZhdWx0aGFuZGxlcgotaW1wb3J0IGdldG9wdAoraW1wb3J0IGlvCiBpbXBvcnQgb3MucGF0aAoraW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgc3lzY29uZmlnCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0LCBzdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IGxpYnJlZ3J0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKKworCitQeV9ERUJVRyA9IGhhc2F0dHIoc3lzLCAnZ2V0b2JqZWN0cycpCitST09UX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnLi4nLCAnLi4nKQorUk9PVF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aChST09UX0RJUikpCisKK1RFU1RfSU5URVJSVVBURUQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgZnJvbSBzaWduYWwgaW1wb3J0IFNJR0lOVAorICAgIHRyeToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHJhaXNlX3NpZ25hbAorICAgICAgICByYWlzZV9zaWduYWwoU0lHSU5UKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIG9zLmtpbGwob3MuZ2V0cGlkKCksIFNJR0lOVCkKKyAgICAiIiIpCisKIAogY2xhc3MgUGFyc2VBcmdzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gICAgIiIiVGVzdCByZWdydGVzdCdzIGFyZ3VtZW50IHBhcnNpbmcuIiIiCisgICAgIiIiCisgICAgVGVzdCByZWdydGVzdCdzIGFyZ3VtZW50IHBhcnNpbmcsIGZ1bmN0aW9uIF9wYXJzZV9hcmdzKCkuCisgICAgIiIiCiAKICAgICBkZWYgY2hlY2tFcnJvcihzZWxmLCBhcmdzLCBtc2cpOgogICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfc3RkZXJyKCkgYXMgZXJyLCBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0KToKLSAgICAgICAgICAgIHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKGFyZ3MpCisgICAgICAgICAgICBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhhcmdzKQogICAgICAgICBzZWxmLmFzc2VydEluKG1zZywgZXJyLmdldHZhbHVlKCkpCiAKICAgICBkZWYgdGVzdF9oZWxwKHNlbGYpOgpAQCAtMjMsODIgKzUwLDgyIEBACiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKICAgICAgICAgICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0LCBcCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0KToKLSAgICAgICAgICAgICAgICAgICAgcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgICAgIGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1J1biBQeXRob24gcmVncmVzc2lvbiB0ZXN0cy4nLCBvdXQuZ2V0dmFsdWUoKSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoZmF1bHRoYW5kbGVyLCAnZHVtcF90cmFjZWJhY2tfbGF0ZXInKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZmF1bHRoYW5kbGVyLmR1bXBfdHJhY2ViYWNrX2xhdGVyKCkgcmVxdWlyZWQiKQogICAgIGRlZiB0ZXN0X3RpbWVvdXQoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXRpbWVvdXQnLCAnNC4yJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXRpbWVvdXQnLCAnNC4yJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudGltZW91dCwgNC4yKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXRpbWVvdXQnXSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0tdGltZW91dCcsICdmb28nXSwgJ2ludmFsaWQgZmxvYXQgdmFsdWUnKQogCiAgICAgZGVmIHRlc3Rfd2FpdChzZWxmKToKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy0td2FpdCddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS13YWl0J10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy53YWl0KQogCiAgICAgZGVmIHRlc3Rfc2xhdmVhcmdzKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1zbGF2ZWFyZ3MnLCAnW1tdLCB7fV0nXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tc2xhdmVhcmdzJywgJ1tbXSwge31dJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuc2xhdmVhcmdzLCAnW1tdLCB7fV0nKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXNsYXZlYXJncyddLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKIAogICAgIGRlZiB0ZXN0X3N0YXJ0KHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctUycsICctLXN0YXJ0JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2ZvbyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuc3RhcnQsICdmb28nKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF92ZXJib3NlKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLXYnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy12J10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMSkKLSAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbJy12dnYnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy12dnYnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAzKQotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS12ZXJib3NlJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXZlcmJvc2UnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAxKQotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS12ZXJib3NlJ10gKiAzKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS12ZXJib3NlJ10gKiAzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDMpCi0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudmVyYm9zZSwgMCkKIAogICAgIGRlZiB0ZXN0X3ZlcmJvc2UyKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctdycsICctLXZlcmJvc2UyJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMudmVyYm9zZTIpCiAKICAgICBkZWYgdGVzdF92ZXJib3NlMyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLVcnLCAnLS12ZXJib3NlMyc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnZlcmJvc2UzKQogCiAgICAgZGVmIHRlc3RfcXVpZXQoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1xJywgJy0tcXVpZXQnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5xdWlldCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDApCiAKICAgICBkZWYgdGVzdF9zbG93KHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctbycsICctLXNsb3cnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5wcmludF9zbG93KQogCiAgICAgZGVmIHRlc3RfaGVhZGVyKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1oZWFkZXInXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0taGVhZGVyJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5oZWFkZXIpCiAKICAgICBkZWYgdGVzdF9yYW5kb21pemUoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1yJywgJy0tcmFuZG9taXplJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucmFuZG9taXplKQogCiAgICAgZGVmIHRlc3RfcmFuZHNlZWQoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXJhbmRzZWVkJywgJzEyMzQ1J10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXJhbmRzZWVkJywgJzEyMzQ1J10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMucmFuZG9tX3NlZWQsIDEyMzQ1KQogICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucmFuZG9taXplKQogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXJhbmRzZWVkJ10sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQpAQCAtMTA3LDcgKzEzNCw3IEBACiAgICAgZGVmIHRlc3RfZnJvbWZpbGUoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1mJywgJy0tZnJvbWZpbGUnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZm9vJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZm9vJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5mcm9tZmlsZSwgJ2ZvbycpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJ2ZvbycsICctcyddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQpAQCAtMTE1LDQyICsxNDIsNDIgQEAKICAgICBkZWYgdGVzdF9leGNsdWRlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICcteCcsICctLWV4Y2x1ZGUnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5leGNsdWRlKQogCiAgICAgZGVmIHRlc3Rfc2luZ2xlKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctcycsICctLXNpbmdsZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnNpbmdsZSkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJy1mJywgJ2ZvbyddLCAiZG9uJ3QgZ28gdG9nZXRoZXIiKQogCiAgICAgZGVmIHRlc3RfbWF0Y2goc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1tJywgJy0tbWF0Y2gnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAncGF0dGVybiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ3BhdHRlcm4nXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLm1hdGNoX3Rlc3RzLCAncGF0dGVybicpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKIAogICAgIGRlZiB0ZXN0X2ZhaWxmYXN0KHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctRycsICctLWZhaWxmYXN0JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJy12J10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnLXYnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMuZmFpbGZhc3QpCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnLVcnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICctVyddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5mYWlsZmFzdCkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICctRy8tLWZhaWxmYXN0IG5lZWRzIGVpdGhlciAtdiBvciAtVycpCiAKICAgICBkZWYgdGVzdF91c2Uoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy11JywgJy0tdXNlJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJ2d1aSxuZXR3b3JrJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZ3VpLG5ldHdvcmsnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnVzZV9yZXNvdXJjZXMsIFsnZ3VpJywgJ25ldHdvcmsnXSkKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdndWksbm9uZSxuZXR3b3JrJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZ3VpLG5vbmUsbmV0d29yayddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudXNlX3Jlc291cmNlcywgWyduZXR3b3JrJ10pCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsaXN0KHJlZ3J0ZXN0LlJFU09VUkNFX05BTUVTKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbGlzdChsaWJyZWdydGVzdC5SRVNPVVJDRV9OQU1FUykKICAgICAgICAgICAgICAgICBleHBlY3RlZC5yZW1vdmUoJ2d1aScpCi0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnYWxsLC1ndWknXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICdhbGwsLWd1aSddKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMudXNlX3Jlc291cmNlcywgZXhwZWN0ZWQpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdCwgJ2ZvbyddLCAnaW52YWxpZCByZXNvdXJjZScpCkBAIC0xNTgsMzEgKzE4NSwzMSBAQAogICAgIGRlZiB0ZXN0X21lbWxpbWl0KHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctTScsICctLW1lbWxpbWl0JzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzRHJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNEcnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLm1lbWxpbWl0LCAnNEcnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAKICAgICBkZWYgdGVzdF90ZXN0ZGlyKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS10ZXN0ZGlyJywgJ2ZvbyddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS10ZXN0ZGlyJywgJ2ZvbyddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnRlc3RkaXIsIG9zLnBhdGguam9pbihzdXBwb3J0LlNBVkVEQ1dELCAnZm9vJykpCiAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbJy0tdGVzdGRpciddLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKIAogICAgIGRlZiB0ZXN0X3J1bmxlYWtzKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctTCcsICctLXJ1bmxlYWtzJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMucnVubGVha3MpCiAKICAgICBkZWYgdGVzdF9odW50cmxlYWtzKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctUicsICctLWh1bnRybGVha3MnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnOiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzonXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmh1bnRybGVha3MsICg1LCA0LCAncmVmbG9nLnR4dCcpKQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzY6J10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnNjonXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmh1bnRybGVha3MsICg2LCA0LCAncmVmbG9nLnR4dCcpKQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzozJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnOjMnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmh1bnRybGVha3MsICg1LCAzLCAncmVmbG9nLnR4dCcpKQotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzY6MzpsZWFrcy5sb2cnXSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHQsICc2OjM6bGVha3MubG9nJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5odW50cmxlYWtzLCAoNiwgMywgJ2xlYWtzLmxvZycpKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0XSwgJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICc2J10sCkBAIC0xOTMsMjQgKzIyMCwyMyBAQAogICAgIGRlZiB0ZXN0X211bHRpcHJvY2VzcyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLWonLCAnLS1tdWx0aXByb2Nlc3MnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnMiddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzInXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnVzZV9tcCwgMikKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnZm9vJ10sICdpbnZhbGlkIGludCB2YWx1ZScpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICcyJywgJy1UJ10sICJkb24ndCBnbyB0b2dldGhlciIpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICcyJywgJy1sJ10sICJkb24ndCBnbyB0b2dldGhlciIpCi0gICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHQsICcyJywgJy1NJywgJzRHJ10sICJkb24ndCBnbyB0b2dldGhlciIpCiAKICAgICBkZWYgdGVzdF9jb3ZlcmFnZShzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLVQnLCAnLS1jb3ZlcmFnZSc6CiAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvcHQ9b3B0KToKLSAgICAgICAgICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnRyYWNlKQogCiAgICAgZGVmIHRlc3RfY292ZXJkaXIoc2VsZik6CiAgICAgICAgIGZvciBvcHQgaW4gJy1EJywgJy0tY292ZXJkaXInOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZm9vJ10pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnZm9vJ10pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5jb3ZlcmRpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzdXBwb3J0LlNBVkVEQ1dELCAnZm9vJykpCiAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0Vycm9yKFtvcHRdLCAnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JykKQEAgLTIxOCwxMyArMjQ0LDEzIEBACiAgICAgZGVmIHRlc3Rfbm9jb3ZlcmRpcihzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLU4nLCAnLS1ub2NvdmVyZGlyJzoKICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG9wdD1vcHQpOgotICAgICAgICAgICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdF0pCisgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShucy5jb3ZlcmRpcikKIAogICAgIGRlZiB0ZXN0X3RocmVzaG9sZChzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLXQnLCAnLS10aHJlc2hvbGQnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0LCAnMTAwMCddKQorICAgICAgICAgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoW29wdCwgJzEwMDAnXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnRocmVzaG9sZCwgMTAwMCkKICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRXJyb3IoW29wdF0sICdleHBlY3RlZCBvbmUgYXJndW1lbnQnKQogICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tFcnJvcihbb3B0LCAnZm9vJ10sICdpbnZhbGlkIGludCB2YWx1ZScpCkBAIC0yMzIsMTMgKzI1OCwxNiBAQAogICAgIGRlZiB0ZXN0X25vd2luZG93cyhzZWxmKToKICAgICAgICAgZm9yIG9wdCBpbiAnLW4nLCAnLS1ub3dpbmRvd3MnOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIucmVkaXJlY3Rfc3RkZXJyKGlvLlN0cmluZ0lPKCkpIGFzIHN0ZGVycjoKKyAgICAgICAgICAgICAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnMubm93aW5kb3dzKQorICAgICAgICAgICAgICAgIGVyciA9IHN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigndGhlIC0tbm93aW5kb3dzICgtbikgb3B0aW9uIGlzIGRlcHJlY2F0ZWQnLCBlcnIpCiAKICAgICBkZWYgdGVzdF9mb3JldmVyKHNlbGYpOgogICAgICAgICBmb3Igb3B0IGluICctRicsICctLWZvcmV2ZXInOgogICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob3B0PW9wdCk6Ci0gICAgICAgICAgICAgICAgbnMgPSByZWdydGVzdC5fcGFyc2VfYXJncyhbb3B0XSkKKyAgICAgICAgICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFtvcHRdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5mb3JldmVyKQogCiAKQEAgLTI0NiwzMCArMjc1LDUwNiBAQAogICAgICAgICBzZWxmLmNoZWNrRXJyb3IoWyctLXh4eCddLCAndXNhZ2U6JykKIAogICAgIGRlZiB0ZXN0X2xvbmdfb3B0aW9uX19wYXJ0aWFsKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWknXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tcXVpJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5xdWlldCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy52ZXJib3NlLCAwKQogCiAgICAgZGVmIHRlc3RfdHdvX29wdGlvbnMoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aWV0JywgJy0tZXhjbHVkZSddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWlldCcsICctLWV4Y2x1ZGUnXSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnF1aWV0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShucy5leGNsdWRlKQogCiAgICAgZGVmIHRlc3Rfb3B0aW9uX3dpdGhfZW1wdHlfc3RyaW5nX3ZhbHVlKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1zdGFydCcsICcnXSkKKyAgICAgICAgbnMgPSBsaWJyZWdydGVzdC5fcGFyc2VfYXJncyhbJy0tc3RhcnQnLCAnJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuc3RhcnQsICcnKQogCiAgICAgZGVmIHRlc3RfYXJnKHNlbGYpOgotICAgICAgICBucyA9IHJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnZm9vJ10pCisgICAgICAgIG5zID0gbGlicmVncnRlc3QuX3BhcnNlX2FyZ3MoWydmb28nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucy5hcmdzLCBbJ2ZvbyddKQogCiAgICAgZGVmIHRlc3Rfb3B0aW9uX2FuZF9hcmcoc2VsZik6Ci0gICAgICAgIG5zID0gcmVncnRlc3QuX3BhcnNlX2FyZ3MoWyctLXF1aWV0JywgJ2ZvbyddKQorICAgICAgICBucyA9IGxpYnJlZ3J0ZXN0Ll9wYXJzZV9hcmdzKFsnLS1xdWlldCcsICdmb28nXSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zLnF1aWV0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLnZlcmJvc2UsIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuYXJncywgWydmb28nXSkKIAogCitjbGFzcyBCYXNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIFRFU1RfVU5JUVVFX0lEID0gMQorICAgIFRFU1ROQU1FX1BSRUZJWCA9ICd0ZXN0X3JlZ3J0ZXN0XycKKyAgICBURVNUTkFNRV9SRUdFWCA9IHIndGVzdF9bYS16QS1aMC05X10rJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RkaXIgPSBvcy5wYXRoLnJlYWxwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisKKyAgICAgICAgc2VsZi50bXB0ZXN0ZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnJtdHJlZSwgc2VsZi50bXB0ZXN0ZGlyKQorCisgICAgZGVmIGNyZWF0ZV90ZXN0KHNlbGYsIG5hbWU9Tm9uZSwgY29kZT0nJyk6CisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgbmFtZSA9ICdub29wJXMnICUgQmFzZVRlc3RDYXNlLlRFU1RfVU5JUVVFX0lECisgICAgICAgICAgICBCYXNlVGVzdENhc2UuVEVTVF9VTklRVUVfSUQgKz0gMQorCisgICAgICAgICMgdGVzdF9yZWdydGVzdCBjYW5ub3QgYmUgcnVuIHR3aWNlIGluIHBhcmFsbGVsIGJlY2F1c2UKKyAgICAgICAgIyBvZiBzZXRVcCgpIGFuZCBjcmVhdGVfdGVzdCgpCisgICAgICAgIG5hbWUgPSBzZWxmLlRFU1ROQU1FX1BSRUZJWCArIG5hbWUKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRtcHRlc3RkaXIsIG5hbWUgKyAnLnB5JykKKworICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIHBhdGgpCisgICAgICAgICMgVXNlICd4JyBtb2RlIHRvIGVuc3VyZSB0aGF0IHdlIGRvIG5vdCBvdmVycmlkZSBleGlzdGluZyB0ZXN0cworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3gnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmcC53cml0ZShjb2RlKQorICAgICAgICBleGNlcHQgUGVybWlzc2lvbkVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIG5vdCBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2Fubm90IHdyaXRlICVzOiAlcyIgJSAocGF0aCwgZXhjKSkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBuYW1lCisKKyAgICBkZWYgcmVnZXhfc2VhcmNoKHNlbGYsIHJlZ2V4LCBvdXRwdXQpOgorICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaChyZWdleCwgb3V0cHV0LCByZS5NVUxUSUxJTkUpCisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiJXIgbm90IGZvdW5kIGluICVyIiAlIChyZWdleCwgb3V0cHV0KSkKKyAgICAgICAgcmV0dXJuIG1hdGNoCisKKyAgICBkZWYgY2hlY2tfbGluZShzZWxmLCBvdXRwdXQsIHJlZ2V4KToKKyAgICAgICAgcmVnZXggPSByZS5jb21waWxlKHInXicgKyByZWdleCwgcmUuTVVMVElMSU5FKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4KG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgcGFyc2VfZXhlY3V0ZWRfdGVzdHMoc2VsZiwgb3V0cHV0KToKKyAgICAgICAgcmVnZXggPSAocideWzAtOV0rOlswLTldKzpbMC05XSsgXFsgKlswLTldKyg/Oi8gKlswLTldKyk/XF0gKCVzKScKKyAgICAgICAgICAgICAgICAgJSBzZWxmLlRFU1ROQU1FX1JFR0VYKQorICAgICAgICBwYXJzZXIgPSByZS5maW5kaXRlcihyZWdleCwgb3V0cHV0LCByZS5NVUxUSUxJTkUpCisgICAgICAgIHJldHVybiBsaXN0KG1hdGNoLmdyb3VwKDEpIGZvciBtYXRjaCBpbiBwYXJzZXIpCisKKyAgICBkZWYgY2hlY2tfZXhlY3V0ZWRfdGVzdHMoc2VsZiwgb3V0cHV0LCB0ZXN0cywgc2tpcHBlZD0oKSwgZmFpbGVkPSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbWl0dGVkPSgpLCByYW5kb21pemU9RmFsc2UpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBzdHIpOgorICAgICAgICAgICAgdGVzdHMgPSBbdGVzdHNdCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2tpcHBlZCwgc3RyKToKKyAgICAgICAgICAgIHNraXBwZWQgPSBbc2tpcHBlZF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShmYWlsZWQsIHN0cik6CisgICAgICAgICAgICBmYWlsZWQgPSBbZmFpbGVkXQorICAgICAgICBpZiBpc2luc3RhbmNlKG9taXR0ZWQsIHN0cik6CisgICAgICAgICAgICBvbWl0dGVkID0gW29taXR0ZWRdCisgICAgICAgIG50ZXN0ID0gbGVuKHRlc3RzKQorICAgICAgICBuc2tpcHBlZCA9IGxlbihza2lwcGVkKQorICAgICAgICBuZmFpbGVkID0gbGVuKGZhaWxlZCkKKyAgICAgICAgbm9taXR0ZWQgPSBsZW4ob21pdHRlZCkKKworICAgICAgICBleGVjdXRlZCA9IHNlbGYucGFyc2VfZXhlY3V0ZWRfdGVzdHMob3V0cHV0KQorICAgICAgICBpZiByYW5kb21pemU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChleGVjdXRlZCksIHNldCh0ZXN0cyksIG91dHB1dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhlY3V0ZWQsIHRlc3RzLCBvdXRwdXQpCisKKyAgICAgICAgZGVmIHBsdXJhbChjb3VudCk6CisgICAgICAgICAgICByZXR1cm4gJ3MnIGlmIGNvdW50ICE9IDEgZWxzZSAnJworCisgICAgICAgIGRlZiBsaXN0X3JlZ2V4KGxpbmVfZm9ybWF0LCB0ZXN0cyk6CisgICAgICAgICAgICBjb3VudCA9IGxlbih0ZXN0cykKKyAgICAgICAgICAgIG5hbWVzID0gJyAnLmpvaW4oc29ydGVkKHRlc3RzKSkKKyAgICAgICAgICAgIHJlZ2V4ID0gbGluZV9mb3JtYXQgJSAoY291bnQsIHBsdXJhbChjb3VudCkpCisgICAgICAgICAgICByZWdleCA9IHInJXM6XG4gICAgJXMkJyAlIChyZWdleCwgbmFtZXMpCisgICAgICAgICAgICByZXR1cm4gcmVnZXgKKworICAgICAgICBpZiBza2lwcGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgc2tpcHBlZCcsIHNraXBwZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICByZWdleCA9IGxpc3RfcmVnZXgoJyVzIHRlc3QlcyBmYWlsZWQnLCBmYWlsZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBpZiBvbWl0dGVkOgorICAgICAgICAgICAgcmVnZXggPSBsaXN0X3JlZ2V4KCclcyB0ZXN0JXMgb21pdHRlZCcsIG9taXR0ZWQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgICAgICBnb29kID0gbnRlc3QgLSBuc2tpcHBlZCAtIG5mYWlsZWQgLSBub21pdHRlZAorICAgICAgICBpZiBnb29kOgorICAgICAgICAgICAgcmVnZXggPSByJyVzIHRlc3QlcyBPS1wuJCcgJSAoZ29vZCwgcGx1cmFsKGdvb2QpKQorICAgICAgICAgICAgaWYgbm90IHNraXBwZWQgYW5kIG5vdCBmYWlsZWQgYW5kIGdvb2QgPiAxOgorICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ0FsbCAlcycgJSByZWdleAorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgcGFyc2VfcmFuZG9tX3NlZWQoc2VsZiwgb3V0cHV0KToKKyAgICAgICAgbWF0Y2ggPSBzZWxmLnJlZ2V4X3NlYXJjaChyJ1VzaW5nIHJhbmRvbSBzZWVkIChbMC05XSspJywgb3V0cHV0KQorICAgICAgICByYW5kc2VlZCA9IGludChtYXRjaC5ncm91cCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gcmFuZHNlZWQgPD0gMTAwMDAwMDAsIHJhbmRzZWVkKQorICAgICAgICByZXR1cm4gcmFuZHNlZWQKKworICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBhcmdzLCBpbnB1dD1Ob25lLCBleGl0Y29kZT0wLCAqKmt3KToKKyAgICAgICAgaWYgbm90IGlucHV0OgorICAgICAgICAgICAgaW5wdXQgPSAnJworICAgICAgICBpZiAnc3RkZXJyJyBub3QgaW4ga3c6CisgICAgICAgICAgICBrd1snc3RkZXJyJ10gPSBzdWJwcm9jZXNzLlBJUEUKKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MucnVuKGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0PWlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3cpCisgICAgICAgIGlmIHByb2MucmV0dXJuY29kZSAhPSBleGl0Y29kZToKKyAgICAgICAgICAgIG1zZyA9ICgiQ29tbWFuZCAlcyBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJXNcbiIKKyAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgInN0ZG91dDpcbiIKKyAgICAgICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgIiVzXG4iCisgICAgICAgICAgICAgICAgICAgIi0tLVxuIgorICAgICAgICAgICAgICAgICAgICUgKHN0cihhcmdzKSwgcHJvYy5yZXR1cm5jb2RlLCBwcm9jLnN0ZG91dCkpCisgICAgICAgICAgICBpZiBwcm9jLnN0ZGVycjoKKyAgICAgICAgICAgICAgICBtc2cgKz0gKCJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdGRlcnI6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAiLS0tXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAlIHByb2Muc3RkZXJyKQorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKyAgICAgICAgcmV0dXJuIHByb2MKKworCisgICAgZGVmIHJ1bl9weXRob24oc2VsZiwgYXJncywgKiprdyk6CisgICAgICAgIGFyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsICctWCcsICdmYXVsdGhhbmRsZXInLCAnLUknLCAqYXJnc10KKyAgICAgICAgcHJvYyA9IHNlbGYucnVuX2NvbW1hbmQoYXJncywgKiprdykKKyAgICAgICAgcmV0dXJuIHByb2Muc3Rkb3V0CisKKworY2xhc3MgUHJvZ3JhbXNUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgdmFyaW91cyB3YXlzIHRvIHJ1biB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUuIFVzZSBvcHRpb25zIGNsb3NlCisgICAgdG8gb3B0aW9ucyB1c2VkIG9uIHRoZSBidWlsZGJvdC4KKyAgICAiIiIKKworICAgIE5URVNUID0gNAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcigpLnNldFVwKCkKKworICAgICAgICAjIENyZWF0ZSBOVEVTVCB0ZXN0cyBkb2luZyBub3RoaW5nCisgICAgICAgIHNlbGYudGVzdHMgPSBbc2VsZi5jcmVhdGVfdGVzdCgpIGZvciBpbmRleCBpbiByYW5nZShzZWxmLk5URVNUKV0KKworICAgICAgICBzZWxmLnB5dGhvbl9hcmdzID0gWyctV2QnLCAnLUUnLCAnLWJiJ10KKyAgICAgICAgc2VsZi5yZWdydGVzdF9hcmdzID0gWyctdWFsbCcsICctcndXJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXRlc3RkaXI9JXMnICUgc2VsZi50bXB0ZXN0ZGlyXQorICAgICAgICBpZiBoYXNhdHRyKGZhdWx0aGFuZGxlciwgJ2R1bXBfdHJhY2ViYWNrX2xhdGVyJyk6CisgICAgICAgICAgICBzZWxmLnJlZ3J0ZXN0X2FyZ3MuZXh0ZW5kKCgnLS10aW1lb3V0JywgJzM2MDAnLCAnLWo0JykpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgc2VsZi5yZWdydGVzdF9hcmdzLmFwcGVuZCgnLW4nKQorCisgICAgZGVmIGNoZWNrX291dHB1dChzZWxmLCBvdXRwdXQpOgorICAgICAgICBzZWxmLnBhcnNlX3JhbmRvbV9zZWVkKG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHNlbGYudGVzdHMsIHJhbmRvbWl6ZT1UcnVlKQorCisgICAgZGVmIHJ1bl90ZXN0cyhzZWxmLCBhcmdzKToKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fcHl0aG9uKGFyZ3MpCisgICAgICAgIHNlbGYuY2hlY2tfb3V0cHV0KG91dHB1dCkKKworICAgIGRlZiB0ZXN0X3NjcmlwdF9yZWdydGVzdChzZWxmKToKKyAgICAgICAgIyBMaWIvdGVzdC9yZWdydGVzdC5weQorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZXN0ZGlyLCAncmVncnRlc3QucHknKQorCisgICAgICAgIGFyZ3MgPSBbKnNlbGYucHl0aG9uX2FyZ3MsIHNjcmlwdCwgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfdGVzdChzZWxmKToKKyAgICAgICAgIyAtbSB0ZXN0CisgICAgICAgIGFyZ3MgPSBbKnNlbGYucHl0aG9uX2FyZ3MsICctbScsICd0ZXN0JywKKyAgICAgICAgICAgICAgICAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X21vZHVsZV9yZWdydGVzdChzZWxmKToKKyAgICAgICAgIyAtbSB0ZXN0LnJlZ3J0ZXN0CisgICAgICAgIGFyZ3MgPSBbKnNlbGYucHl0aG9uX2FyZ3MsICctbScsICd0ZXN0LnJlZ3J0ZXN0JywKKyAgICAgICAgICAgICAgICAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X21vZHVsZV9hdXRvdGVzdChzZWxmKToKKyAgICAgICAgIyAtbSB0ZXN0LmF1dG90ZXN0CisgICAgICAgIGFyZ3MgPSBbKnNlbGYucHl0aG9uX2FyZ3MsICctbScsICd0ZXN0LmF1dG90ZXN0JywKKyAgICAgICAgICAgICAgICAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIGRlZiB0ZXN0X21vZHVsZV9mcm9tX3Rlc3RfYXV0b3Rlc3Qoc2VsZik6CisgICAgICAgICMgZnJvbSB0ZXN0IGltcG9ydCBhdXRvdGVzdAorICAgICAgICBjb2RlID0gJ2Zyb20gdGVzdCBpbXBvcnQgYXV0b3Rlc3QnCisgICAgICAgIGFyZ3MgPSBbKnNlbGYucHl0aG9uX2FyZ3MsICctYycsIGNvZGUsCisgICAgICAgICAgICAgICAgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHNdCisgICAgICAgIHNlbGYucnVuX3Rlc3RzKGFyZ3MpCisKKyAgICBkZWYgdGVzdF9zY3JpcHRfYXV0b3Rlc3Qoc2VsZik6CisgICAgICAgICMgTGliL3Rlc3QvYXV0b3Rlc3QucHkKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKHNlbGYudGVzdGRpciwgJ2F1dG90ZXN0LnB5JykKKyAgICAgICAgYXJncyA9IFsqc2VsZi5weXRob25fYXJncywgc2NyaXB0LCAqc2VsZi5yZWdydGVzdF9hcmdzLCAqc2VsZi50ZXN0c10KKyAgICAgICAgc2VsZi5ydW5fdGVzdHMoYXJncykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAncnVuX3Rlc3RzLnB5IHNjcmlwdCBpcyBub3QgaW5zdGFsbGVkJykKKyAgICBkZWYgdGVzdF90b29sc19zY3JpcHRfcnVuX3Rlc3RzKHNlbGYpOgorICAgICAgICAjIFRvb2xzL3NjcmlwdHMvcnVuX3Rlc3RzLnB5CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihST09UX0RJUiwgJ1Rvb2xzJywgJ3NjcmlwdHMnLCAncnVuX3Rlc3RzLnB5JykKKyAgICAgICAgYXJncyA9IFtzY3JpcHQsICpzZWxmLnJlZ3J0ZXN0X2FyZ3MsICpzZWxmLnRlc3RzXQorICAgICAgICBzZWxmLnJ1bl90ZXN0cyhhcmdzKQorCisgICAgZGVmIHJ1bl9iYXRjaChzZWxmLCAqYXJncyk6CisgICAgICAgIHByb2MgPSBzZWxmLnJ1bl9jb21tYW5kKGFyZ3MpCisgICAgICAgIHNlbGYuY2hlY2tfb3V0cHV0KHByb2Muc3Rkb3V0KQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmJhdCBzY3JpcHQgaXMgbm90IGluc3RhbGxlZCcpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICd3aW4zMicsICdXaW5kb3dzIG9ubHknKQorICAgIGRlZiB0ZXN0X3Rvb2xzX2J1aWxkYm90X3Rlc3Qoc2VsZik6CisgICAgICAgICMgVG9vbHNcYnVpbGRib3RcdGVzdC5iYXQKKyAgICAgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKFJPT1RfRElSLCAnVG9vbHMnLCAnYnVpbGRib3QnLCAndGVzdC5iYXQnKQorICAgICAgICB0ZXN0X2FyZ3MgPSBbJy0tdGVzdGRpcj0lcycgJSBzZWxmLnRtcHRlc3RkaXJdCisgICAgICAgIGlmIHBsYXRmb3JtLmFyY2hpdGVjdHVyZSgpWzBdID09ICc2NGJpdCc6CisgICAgICAgICAgICB0ZXN0X2FyZ3MuYXBwZW5kKCcteDY0JykgICAjIDY0LWJpdCBidWlsZAorICAgICAgICBpZiBub3QgUHlfREVCVUc6CisgICAgICAgICAgICB0ZXN0X2FyZ3MuYXBwZW5kKCcrZCcpICAgICAjIFJlbGVhc2UgYnVpbGQsIHVzZSBweXRob24uZXhlCisgICAgICAgIHNlbGYucnVuX2JhdGNoKHNjcmlwdCwgKnRlc3RfYXJncywgKnNlbGYudGVzdHMpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgJ1dpbmRvd3Mgb25seScpCisgICAgZGVmIHRlc3RfcGNidWlsZF9ydChzZWxmKToKKyAgICAgICAgIyBQQ2J1aWxkXHJ0LmJhdAorICAgICAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oUk9PVF9ESVIsIHInUENidWlsZFxydC5iYXQnKQorICAgICAgICBydF9hcmdzID0gWyItcSJdICAgICAgICAgICAgICMgUXVpY2ssIGRvbid0IHJ1biB0ZXN0cyB0d2ljZQorICAgICAgICBpZiBwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKVswXSA9PSAnNjRiaXQnOgorICAgICAgICAgICAgcnRfYXJncy5hcHBlbmQoJy14NjQnKSAgICMgNjQtYml0IGJ1aWxkCisgICAgICAgIGlmIFB5X0RFQlVHOgorICAgICAgICAgICAgcnRfYXJncy5hcHBlbmQoJy1kJykgICAgICMgRGVidWcgYnVpbGQsIHVzZSBweXRob25fZC5leGUKKyAgICAgICAgc2VsZi5ydW5fYmF0Y2goc2NyaXB0LCAqcnRfYXJncywgKnNlbGYucmVncnRlc3RfYXJncywgKnNlbGYudGVzdHMpCisKKworY2xhc3MgQXJnc1Rlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCBhcmd1bWVudHMgb2YgdGhlIFB5dGhvbiB0ZXN0IHN1aXRlLgorICAgICIiIgorCisgICAgZGVmIHJ1bl90ZXN0cyhzZWxmLCAqdGVzdGFyZ3MsICoqa3cpOgorICAgICAgICBjbWRhcmdzID0gWyctbScsICd0ZXN0JywgJy0tdGVzdGRpcj0lcycgJSBzZWxmLnRtcHRlc3RkaXIsICp0ZXN0YXJnc10KKyAgICAgICAgcmV0dXJuIHNlbGYucnVuX3B5dGhvbihjbWRhcmdzLCAqKmt3KQorCisgICAgZGVmIHRlc3RfZmFpbGluZ190ZXN0KHNlbGYpOgorICAgICAgICAjIHRlc3QgYSBmYWlsaW5nIHRlc3QKKyAgICAgICAgY29kZSA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgICAgIGltcG9ydCB1bml0dGVzdAorCisgICAgICAgICAgICBjbGFzcyBGYWlsaW5nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgZGVmIHRlc3RfZmFpbGluZyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJidWciKQorICAgICAgICAiIiIpCisgICAgICAgIHRlc3Rfb2sgPSBzZWxmLmNyZWF0ZV90ZXN0KCdvaycpCisgICAgICAgIHRlc3RfZmFpbGluZyA9IHNlbGYuY3JlYXRlX3Rlc3QoJ2ZhaWxpbmcnLCBjb2RlPWNvZGUpCisgICAgICAgIHRlc3RzID0gW3Rlc3Rfb2ssIHRlc3RfZmFpbGluZ10KKworICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygqdGVzdHMsIGV4aXRjb2RlPTEpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0cywgZmFpbGVkPXRlc3RfZmFpbGluZykKKworICAgIGRlZiB0ZXN0X3Jlc291cmNlcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IC11IGNvbW1hbmQgbGluZSBvcHRpb24KKyAgICAgICAgdGVzdHMgPSB7fQorICAgICAgICBmb3IgcmVzb3VyY2UgaW4gKCdhdWRpbycsICduZXR3b3JrJyk6CisgICAgICAgICAgICBjb2RlID0gJ2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydFxuc3VwcG9ydC5yZXF1aXJlcyglciknICUgcmVzb3VyY2UKKyAgICAgICAgICAgIHRlc3RzW3Jlc291cmNlXSA9IHNlbGYuY3JlYXRlX3Rlc3QocmVzb3VyY2UsIGNvZGUpCisgICAgICAgIHRlc3RfbmFtZXMgPSBzb3J0ZWQodGVzdHMudmFsdWVzKCkpCisKKyAgICAgICAgIyAtdSBhbGw6IDIgcmVzb3VyY2VzIGVuYWJsZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy11JywgJ2FsbCcsICp0ZXN0X25hbWVzKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdF9uYW1lcykKKworICAgICAgICAjIC11IGF1ZGlvOiAxIHJlc291cmNlIGVuYWJsZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy11YXVkaW8nLCAqdGVzdF9uYW1lcykKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZD10ZXN0c1snbmV0d29yayddKQorCisgICAgICAgICMgbm8gb3B0aW9uOiAwIHJlc291cmNlcyBlbmFibGVkCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCp0ZXN0X25hbWVzKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkPXRlc3RfbmFtZXMpCisKKyAgICBkZWYgdGVzdF9yYW5kb20oc2VsZik6CisgICAgICAgICMgdGVzdCAtciBhbmQgLS1yYW5kc2VlZCBjb21tYW5kIGxpbmUgb3B0aW9uCisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgICAgICBwcmludCgiVEVTVFJBTkRPTTogJXMiICUgcmFuZG9tLnJhbmRpbnQoMSwgMTAwMCkpCisgICAgICAgICIiIikKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ3JhbmRvbScsIGNvZGUpCisKKyAgICAgICAgIyBmaXJzdCBydW4gdG8gZ2V0IHRoZSBvdXRwdXQgd2l0aCB0aGUgcmFuZG9tIHNlZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy1yJywgdGVzdCkKKyAgICAgICAgcmFuZHNlZWQgPSBzZWxmLnBhcnNlX3JhbmRvbV9zZWVkKG91dHB1dCkKKyAgICAgICAgbWF0Y2ggPSBzZWxmLnJlZ2V4X3NlYXJjaChyJ1RFU1RSQU5ET006IChbMC05XSspJywgb3V0cHV0KQorICAgICAgICB0ZXN0X3JhbmRvbSA9IGludChtYXRjaC5ncm91cCgxKSkKKworICAgICAgICAjIHRyeSB0byByZXByb2R1Y2Ugd2l0aCB0aGUgcmFuZG9tIHNlZWQKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy1yJywgJy0tcmFuZHNlZWQ9JXMnICUgcmFuZHNlZWQsIHRlc3QpCisgICAgICAgIHJhbmRzZWVkMiA9IHNlbGYucGFyc2VfcmFuZG9tX3NlZWQob3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmRzZWVkMiwgcmFuZHNlZWQpCisKKyAgICAgICAgbWF0Y2ggPSBzZWxmLnJlZ2V4X3NlYXJjaChyJ1RFU1RSQU5ET006IChbMC05XSspJywgb3V0cHV0KQorICAgICAgICB0ZXN0X3JhbmRvbTIgPSBpbnQobWF0Y2guZ3JvdXAoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9yYW5kb20yLCB0ZXN0X3JhbmRvbSkKKworICAgIGRlZiB0ZXN0X2Zyb21maWxlKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1mcm9tZmlsZQorICAgICAgICB0ZXN0cyA9IFtzZWxmLmNyZWF0ZV90ZXN0KCkgZm9yIGluZGV4IGluIHJhbmdlKDUpXQorCisgICAgICAgICMgV3JpdGUgdGhlIGxpc3Qgb2YgZmlsZXMgdXNpbmcgYSBmb3JtYXQgc2ltaWxhciB0byByZWdydGVzdCBvdXRwdXQ6CisgICAgICAgICMgWzEvMl0gdGVzdF8xCisgICAgICAgICMgWzIvMl0gdGVzdF8yCisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKworICAgICAgICAjIHRlc3QgZm9ybWF0ICcwOjAwOjAwIFsyLzddIHRlc3Rfb3Bjb2RlcyAtLSB0ZXN0X2dyYW1tYXIgdG9vayAwIHNlYycKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgcHJldmlvdXMgPSBOb25lCisgICAgICAgICAgICBmb3IgaW5kZXgsIG5hbWUgaW4gZW51bWVyYXRlKHRlc3RzLCAxKToKKyAgICAgICAgICAgICAgICBsaW5lID0gKCIwMDowMDolMDJpIFslcy8lc10gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAlIChpbmRleCwgaW5kZXgsIGxlbih0ZXN0cyksIG5hbWUpKQorICAgICAgICAgICAgICAgIGlmIHByZXZpb3VzOgorICAgICAgICAgICAgICAgICAgICBsaW5lICs9ICIgLS0gJXMgdG9vayAwIHNlYyIgJSBwcmV2aW91cworICAgICAgICAgICAgICAgIHByaW50KGxpbmUsIGZpbGU9ZnApCisgICAgICAgICAgICAgICAgcHJldmlvdXMgPSBuYW1lCisKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0tZnJvbWZpbGUnLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIHRlc3RzKQorCisgICAgICAgICMgdGVzdCBmb3JtYXQgJ1syLzddIHRlc3Rfb3Bjb2RlcycKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgZm9yIGluZGV4LCBuYW1lIGluIGVudW1lcmF0ZSh0ZXN0cywgMSk6CisgICAgICAgICAgICAgICAgcHJpbnQoIlslcy8lc10gJXMiICUgKGluZGV4LCBsZW4odGVzdHMpLCBuYW1lKSwgZmlsZT1mcCkKKworICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1mcm9tZmlsZScsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMpCisKKyAgICAgICAgIyB0ZXN0IGZvcm1hdCAndGVzdF9vcGNvZGVzJworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3IikgYXMgZnA6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiB0ZXN0czoKKyAgICAgICAgICAgICAgICBwcmludChuYW1lLCBmaWxlPWZwKQorCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWZyb21maWxlJywgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0cykKKworICAgIGRlZiB0ZXN0X2ludGVycnVwdGVkKHNlbGYpOgorICAgICAgICBjb2RlID0gVEVTVF9JTlRFUlJVUFRFRAorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgnc2lnaW50JywgY29kZT1jb2RlKQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cyh0ZXN0LCBleGl0Y29kZT0xKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdCwgb21pdHRlZD10ZXN0KQorCisgICAgZGVmIHRlc3Rfc2xvdyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tc2xvdworICAgICAgICB0ZXN0cyA9IFtzZWxmLmNyZWF0ZV90ZXN0KCkgZm9yIGluZGV4IGluIHJhbmdlKDMpXQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygiLS1zbG93IiwgKnRlc3RzKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgdGVzdHMpCisgICAgICAgIHJlZ2V4ID0gKCcxMCBzbG93ZXN0IHRlc3RzOlxuJworICAgICAgICAgICAgICAgICAnKD86JXM6IFswLTldK1wuWzAtOV0rc1xuKXslc30nCisgICAgICAgICAgICAgICAgICUgKHNlbGYuVEVTVE5BTUVfUkVHRVgsIGxlbih0ZXN0cykpKQorICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKworICAgIGRlZiB0ZXN0X3Nsb3dfaW50ZXJydXB0ZWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzI1MzczOiB0ZXN0IC0tc2xvdyB3aXRoIGFuIGludGVycnVwdGVkIHRlc3QKKyAgICAgICAgY29kZSA9IFRFU1RfSU5URVJSVVBURUQKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoInNpZ2ludCIsIGNvZGU9Y29kZSkKKworICAgICAgICBmb3IgbXVsdGlwcm9jZXNzaW5nIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICBpZiBtdWx0aXByb2Nlc3Npbmc6CisgICAgICAgICAgICAgICAgYXJncyA9ICgiLS1zbG93IiwgIi1qMiIsIHRlc3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFyZ3MgPSAoIi0tc2xvdyIsIHRlc3QpCisgICAgICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygqYXJncywgZXhpdGNvZGU9MSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCB0ZXN0LCBvbWl0dGVkPXRlc3QpCisgICAgICAgICAgICByZWdleCA9ICgnMTAgc2xvd2VzdCB0ZXN0czpcbicpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZWdleCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbGluZShvdXRwdXQsICdUZXN0IHN1aXRlIGludGVycnVwdGVkIGJ5IHNpZ25hbCBTSUdJTlQuJykKKworICAgIGRlZiB0ZXN0X2NvdmVyYWdlKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1jb3ZlcmFnZQorICAgICAgICB0ZXN0ID0gc2VsZi5jcmVhdGVfdGVzdCgnY292ZXJhZ2UnKQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygiLS1jb3ZlcmFnZSIsIHRlc3QpCisgICAgICAgIHNlbGYuY2hlY2tfZXhlY3V0ZWRfdGVzdHMob3V0cHV0LCBbdGVzdF0pCisgICAgICAgIHJlZ2V4ID0gKCdsaW5lcyArY292JSArbW9kdWxlICtcKHBhdGhcKVxuJworICAgICAgICAgICAgICAgICAnKD86ICpbMC05XSsgKlswLTldezEsMn0lICpbXiBdKyArXChbXildK1wpKykrJykKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgorICAgICAgICAjIHRlc3QgLS13YWl0CisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCd3YWl0JykKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoIi0td2FpdCIsIHRlc3QsIGlucHV0PSdrZXknKQorICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCAnUHJlc3MgYW55IGtleSB0byBjb250aW51ZScpCisKKyAgICBkZWYgdGVzdF9mb3JldmVyKHNlbGYpOgorICAgICAgICAjIHRlc3QgLS1mb3JldmVyCisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgYnVpbHRpbnMKKyAgICAgICAgICAgIGltcG9ydCB1bml0dGVzdAorCisgICAgICAgICAgICBjbGFzcyBGb3JldmVyVGVzdGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9ydW4oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICMgU3RvcmUgdGhlIHN0YXRlIGluIHRoZSBidWlsdGlucyBtb2R1bGUsIGJlY2F1c2UgdGhlIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgIyBtb2R1bGUgaXMgcmVsb2FkIGF0IGVhY2ggcnVuCisgICAgICAgICAgICAgICAgICAgIGlmICdSVU4nIGluIGJ1aWx0aW5zLl9fZGljdF9fOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbnMuX19kaWN0X19bJ1JVTiddICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJ1aWx0aW5zLl9fZGljdF9fWydSVU4nXSA+PSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbCBhdCB0aGUgM3JkIHJ1bnMiKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbnMuX19kaWN0X19bJ1JVTiddID0gMQorICAgICAgICAiIiIpCisgICAgICAgIHRlc3QgPSBzZWxmLmNyZWF0ZV90ZXN0KCdmb3JldmVyJywgY29kZT1jb2RlKQorICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl90ZXN0cygnLS1mb3JldmVyJywgdGVzdCwgZXhpdGNvZGU9MSkKKyAgICAgICAgc2VsZi5jaGVja19leGVjdXRlZF90ZXN0cyhvdXRwdXQsIFt0ZXN0XSozLCBmYWlsZWQ9dGVzdCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFB5X0RFQlVHLCAnbmVlZCBhIGRlYnVnIGJ1aWxkJykKKyAgICBkZWYgdGVzdF9odW50cmxlYWtzX2ZkX2xlYWsoc2VsZik6CisgICAgICAgICMgdGVzdCAtLWh1bnRybGVha3MgZm9yIGZpbGUgZGVzY3JpcHRvciBsZWFrCisgICAgICAgIGNvZGUgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcG9ydCB1bml0dGVzdAorCisgICAgICAgICAgICAjIElzc3VlICMyNTMwNjogRGlzYWJsZSBwb3B1cHMgYW5kIGxvZ3MgdG8gc3RkZXJyIG9uIGFzc2VydGlvbgorICAgICAgICAgICAgIyBmYWlsdXJlcyBpbiBNU0NSVAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBtc3ZjcnQKKyAgICAgICAgICAgICAgICBtc3ZjcnQuQ3J0U2V0UmVwb3J0TW9kZQorICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgICAgICMgbm8gV2luZG93cywgbyByZWxlYXNlIGJ1aWxkCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgbSBpbiBbbXN2Y3J0LkNSVF9XQVJOLCBtc3ZjcnQuQ1JUX0VSUk9SLCBtc3ZjcnQuQ1JUX0FTU0VSVF06CisgICAgICAgICAgICAgICAgICAgIG1zdmNydC5DcnRTZXRSZXBvcnRNb2RlKG0sIDApCisKKyAgICAgICAgICAgIGNsYXNzIEZETGVha1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X2xlYWsoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIGZkID0gb3Mub3BlbihfX2ZpbGVfXywgb3MuT19SRE9OTFkpCisgICAgICAgICAgICAgICAgICAgICMgYnVnOiBuZXZlciBjbG9lcyB0aGUgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgICIiIikKKyAgICAgICAgdGVzdCA9IHNlbGYuY3JlYXRlX3Rlc3QoJ2h1bnRybGVha3MnLCBjb2RlPWNvZGUpCisKKyAgICAgICAgZmlsZW5hbWUgPSAncmVmbG9nLnR4dCcKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5ydW5fdGVzdHMoJy0taHVudHJsZWFrcycsICczOjM6JywgdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdGNvZGU9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgICBzZWxmLmNoZWNrX2V4ZWN1dGVkX3Rlc3RzKG91dHB1dCwgW3Rlc3RdLCBmYWlsZWQ9dGVzdCkKKworICAgICAgICBsaW5lID0gJ2JlZ2lubmluZyA2IHJlcGV0aXRpb25zXG4xMjM0NTZcbi4uLi4uLlxuJworICAgICAgICBzZWxmLmNoZWNrX2xpbmUob3V0cHV0LCByZS5lc2NhcGUobGluZSkpCisKKyAgICAgICAgbGluZTIgPSAnJXMgbGVha2VkIFsxLCAxLCAxXSBmaWxlIGRlc2NyaXB0b3JzLCBzdW09M1xuJyAlIHRlc3QKKyAgICAgICAgc2VsZi5jaGVja19saW5lKG91dHB1dCwgcmUuZXNjYXBlKGxpbmUyKSkKKworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGZwOgorICAgICAgICAgICAgcmVmbG9nID0gZnAucmVhZCgpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ2dldGNvdW50cycpOgorICAgICAgICAgICAgICAgICMgVHlwZXMgYXJlIGltbXBvcnRhbCBpZiBDT1VOVF9BTExPQ1MgaXMgZGVmaW5lZAorICAgICAgICAgICAgICAgIHJlZmxvZyA9IHJlZmxvZy5zcGxpdGxpbmVzKFRydWUpWy0xXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWZsb2csIGxpbmUyKQorCisgICAgZGVmIHRlc3RfbGlzdF90ZXN0cyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IC0tbGlzdC10ZXN0cworICAgICAgICB0ZXN0cyA9IFtzZWxmLmNyZWF0ZV90ZXN0KCkgZm9yIGkgaW4gcmFuZ2UoNSldCisgICAgICAgIG91dHB1dCA9IHNlbGYucnVuX3Rlc3RzKCctLWxpc3QtdGVzdHMnLCAqdGVzdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LnJzdHJpcCgpLnNwbGl0bGluZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cykKKworCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5IGIvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CmluZGV4IDE1ODJjYWEuLjU4NzI5YTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKQEAgLTI1Myw2ICsyNTMsMzEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPCBiKQogCisgICAgZGVmIHRlc3RfZXhjZXB0aW9uX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGNsYXNzIFNwYW06CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IE5vbmUsIHIiJzwnIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiBOb25lIDwgNDIsIHIiJzwnIC4qIG9mICdOb25lVHlwZScgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA+IE5vbmUsIHIiJz4nIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiAiZm9vIiA8IE5vbmUsIHIiJzwnIC4qIG9mICdzdHInIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiAiZm9vIiA+PSA2NjYsIHIiJz49JyAuKiBvZiAnc3RyJyBhbmQgJ2ludCciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IDQyIDw9IE5vbmUsIHIiJzw9JyAuKiBvZiAnaW50JyBhbmQgJ05vbmVUeXBlJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogNDIgPj0gTm9uZSwgciInPj0nIC4qIG9mICdpbnQnIGFuZCAnTm9uZVR5cGUnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IFtdLCByIic8JyAuKiBvZiAnaW50JyBhbmQgJ2xpc3QnIiksCisgICAgICAgICAgICAobGFtYmRhOiAoKSA+IFtdLCByIic+JyAuKiBvZiAndHVwbGUnIGFuZCAnbGlzdCciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IE5vbmUgPj0gTm9uZSwgciInPj0nIC4qIG9mICdOb25lVHlwZScgYW5kICdOb25lVHlwZSciKSwKKyAgICAgICAgICAgIChsYW1iZGE6IFNwYW0oKSA8IDQyLCByIic8JyAuKiBvZiAnU3BhbScgYW5kICdpbnQnIiksCisgICAgICAgICAgICAobGFtYmRhOiA0MiA8IFNwYW0oKSwgciInPCcgLiogb2YgJ2ludCcgYW5kICdTcGFtJyIpLAorICAgICAgICAgICAgKGxhbWJkYTogU3BhbSgpIDw9IFNwYW0oKSwgciInPD0nIC4qIG9mICdTcGFtJyBhbmQgJ1NwYW0nIiksCisgICAgICAgIF0KKyAgICAgICAgZm9yIGksIHRlc3QgaW4gZW51bWVyYXRlKHRlc3RzKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHRlc3Q9aSk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFR5cGVFcnJvciwgdGVzdFsxXSk6CisgICAgICAgICAgICAgICAgICAgIHRlc3RbMF0oKQorCisKIGNsYXNzIERpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2RpY3RzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weSBiL0xpYi90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkKaW5kZXggODUzZTc3My4uMGRjMTA4MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5CkBAIC0xLDExICsxLDEyIEBACiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB1bml0dGVzdC5tb2NrCitmcm9tIHVuaXR0ZXN0Lm1vY2sgaW1wb3J0IHBhdGNoCiBpbXBvcnQgYnVpbHRpbnMKIGltcG9ydCBybGNvbXBsZXRlcgogCiBjbGFzcyBDb21wbGV0ZU1lOgogICAgICIiIiBUcml2aWFsIGNsYXNzIHVzZWQgaW4gdGVzdGluZyBybGNvbXBsZXRlci5Db21wbGV0ZXIuICIiIgogICAgIHNwYW0gPSAxCisgICAgX2hhbSA9IDIKIAogCiBjbGFzcyBUZXN0Umxjb21wbGV0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTIsMTggKzUzLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgWydzdHIue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zdGFydHN3aXRoKCdzJyldKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygndHVwbGUuZm9vc3BhbWVnZycpLCBbXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBzb3J0ZWQoeydOb25lLiVzJXMnICUgKHgsICcoJyBpZiB4ICE9ICdfX2RvY19fJyBlbHNlICcnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gZGlyKE5vbmUpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ05vbmUuJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnTm9uZS5fJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnTm9uZS5fXycpLCBleHBlY3RlZCkKIAogICAgICAgICAjIHRlc3Qgd2l0aCBhIGN1c3RvbWl6ZWQgbmFtZXNwYWNlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLnNwJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lLnNwYW0nXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlbWUuZWdnJyksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubXJvKCcsICdDb21wbGV0ZU1lLnNwYW0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuXycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5faGFtJ10pCisgICAgICAgIG1hdGNoZXMgPSBzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuX18nKQorICAgICAgICBmb3IgeCBpbiBtYXRjaGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguc3RhcnRzd2l0aCgnQ29tcGxldGVNZS5fXycpLCB4KQorICAgICAgICBzZWxmLmFzc2VydEluKCdDb21wbGV0ZU1lLl9fbmFtZV9fJywgbWF0Y2hlcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQ29tcGxldGVNZS5fX25ld19fKCcsIG1hdGNoZXMpCiAKLSAgICAgICAgQ29tcGxldGVNZS5tZSA9IENvbXBsZXRlTWUKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUubWUubWUuc3AnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubWUubWUuc3BhbSddKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbJ2VnZy57fSgnLmZvcm1hdCh4KSBmb3IgeCBpbiBkaXIoc3RyKQotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnN0YXJ0c3dpdGgoJ3MnKV0pCisgICAgICAgIHdpdGggcGF0Y2gub2JqZWN0KENvbXBsZXRlTWUsICJtZSIsIENvbXBsZXRlTWUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZU1lLm1lLm1lLnNwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5tZS5tZS5zcGFtJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydlZ2cue30oJy5mb3JtYXQoeCkgZm9yIHggaW4gZGlyKHN0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgncycpXSkKIAogICAgIGRlZiB0ZXN0X2V4Y2Vzc2l2ZV9nZXRhdHRyKHNlbGYpOgogICAgICAgICAjIEVuc3VyZSBnZXRhdHRyKCkgaXMgaW52b2tlZCBubyBtb3JlIHRoYW4gb25jZSBwZXIgYXR0cmlidXRlCkBAIC03OCwxNCArOTMsMjcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2YuYicsIDApLCAnZi5iYXInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2FsbHMsIDEpCiAKKyAgICBkZWYgdGVzdF91bmNyZWF0ZWRfYXR0cihzZWxmKToKKyAgICAgICAgIyBBdHRyaWJ1dGVzIGxpa2UgcHJvcGVydGllcyBhbmQgc2xvdHMgc2hvdWxkIGJlIGNvbXBsZXRlZCBldmVuIHdoZW4KKyAgICAgICAgIyB0aGV5IGhhdmVuJ3QgYmVlbiBjcmVhdGVkIG9uIGFuIGluc3RhbmNlCisgICAgICAgIGNsYXNzIEZvbzoKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9ICgiYmFyIiwpCisgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcihkaWN0KGY9Rm9vKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnZi4nLCAwKSwgJ2YuYmFyJykKKwogICAgIEB1bml0dGVzdC5tb2NrLnBhdGNoKCdybGNvbXBsZXRlci5fcmVhZGxpbmVfYXZhaWxhYmxlJywgRmFsc2UpCiAgICAgZGVmIHRlc3RfY29tcGxldGUoc2VsZik6CiAgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCcnLCAwKSwgJ1x0JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2EnLCAwKSwgJ2FuZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMSksICdhcycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhcycsIDIpLCAnYXNzZXJ0JykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2FuJywgMCksICdhbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYScsIDApLCAnYW5kICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhJywgMSksICdhcyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYXMnLCAyKSwgJ2Fzc2VydCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnYW4nLCAwKSwgJ2FuZCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgncGEnLCAwKSwgJ3Bhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgnRmEnLCAwKSwgJ0ZhbHNlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2VsJywgMCksICdlbGlmICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdlbCcsIDEpLCAnZWxzZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCd0cicsIDApLCAndHJ5OicpCiAKICAgICBkZWYgdGVzdF9kdXBsaWNhdGVfZ2xvYmFscyhzZWxmKToKICAgICAgICAgbmFtZXNwYWNlID0gewpAQCAtOTgsOSArMTI2LDEwIEBACiAgICAgICAgIGNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcihuYW1lc3BhY2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdGYWxzZScsIDApLCAnRmFsc2UnKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjb21wbGV0ZXIuY29tcGxldGUoJ0ZhbHNlJywgMSkpICAjIE5vIGR1cGxpY2F0ZXMKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV0ZXIuY29tcGxldGUoJ2Fzc2VydCcsIDApLCAnYXNzZXJ0JykKKyAgICAgICAgIyBTcGFjZSBvciBjb2xvbiBhZGRlZCBkdWUgdG8gYmVpbmcgYSByZXNlcnZlZCBrZXl3b3JkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdhc3NlcnQnLCAwKSwgJ2Fzc2VydCAnKQogICAgICAgICBzZWxmLmFzc2VydElzTm9uZShjb21wbGV0ZXIuY29tcGxldGUoJ2Fzc2VydCcsIDEpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMCksICd0cnknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlci5jb21wbGV0ZSgndHJ5JywgMCksICd0cnk6JykKICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoY29tcGxldGVyLmNvbXBsZXRlKCd0cnknLCAxKSkKICAgICAgICAgIyBObyBvcGVuaW5nIGJyYWNrZXQgIigiIGJlY2F1c2Ugd2Ugb3ZlcnJvZGUgdGhlIGJ1aWx0LWluIGNsYXNzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxldGVyLmNvbXBsZXRlKCdtZW1vcnl2aWV3JywgMCksICdtZW1vcnl2aWV3JykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CmluZGV4IGQwMTI2NmYuLjc2ZjRmN2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQpAQCAtMSw4ICsxLDcgQEAKIGltcG9ydCBpbwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgdXJsbGliLnJvYm90cGFyc2VyCi1mcm9tIHVybGxpYi5lcnJvciBpbXBvcnQgVVJMRXJyb3IsIEhUVFBFcnJvcgotZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIGh0dHAuc2VydmVyIGltcG9ydCBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLCBIVFRQU2VydmVyCiB0cnk6CkBAIC0xMiw3ICsxMSw4IEBACiAKIAogY2xhc3MgUm9ib3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4PU5vbmUsIHBhcnNlcj1Ob25lLCB1cmw9Tm9uZSwgZ29vZD1Ob25lLCBhZ2VudD1Ob25lKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXg9Tm9uZSwgcGFyc2VyPU5vbmUsIHVybD1Ob25lLCBnb29kPU5vbmUsCisgICAgICAgICAgICAgICAgIGFnZW50PU5vbmUsIHJlcXVlc3RfcmF0ZT1Ob25lLCBjcmF3bF9kZWxheT1Ob25lKToKICAgICAgICAgIyB3b3JrYXJvdW5kIHRvIG1ha2UgdW5pdHRlc3QgZGlzY292ZXJ5IHdvcmsgKHNlZSAjMTcwNjYpCiAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluZGV4LCBpbnQpOgogICAgICAgICAgICAgcmV0dXJuCkBAIC0yNSw2ICsyNSw4IEBACiAgICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgIHNlbGYuZ29vZCA9IGdvb2QKICAgICAgICAgc2VsZi5hZ2VudCA9IGFnZW50CisgICAgICAgIHNlbGYucmVxdWVzdF9yYXRlID0gcmVxdWVzdF9yYXRlCisgICAgICAgIHNlbGYuY3Jhd2xfZGVsYXkgPSBjcmF3bF9kZWxheQogCiAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi51cmwsIHR1cGxlKToKQEAgLTM0LDYgKzM2LDE4IEBACiAgICAgICAgICAgICBhZ2VudCA9IHNlbGYuYWdlbnQKICAgICAgICAgaWYgc2VsZi5nb29kOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuY3Jhd2xfZGVsYXkoYWdlbnQpLCBzZWxmLmNyYXdsX2RlbGF5KQorICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIGFjdHVhbCB2YWx1ZXMgZm9yIHJlcXVlc3QgcmF0ZQorICAgICAgICAgICAgaWYgc2VsZi5yZXF1ZXN0X3JhdGUgYW5kIHNlbGYucGFyc2VyLnJlcXVlc3RfcmF0ZShhZ2VudCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KS5yZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X3JhdGUucmVxdWVzdHMKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucmVxdWVzdF9yYXRlKGFnZW50KS5zZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXVlc3RfcmF0ZS5zZWNvbmRzCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5yZXF1ZXN0X3JhdGUoYWdlbnQpLCBzZWxmLnJlcXVlc3RfcmF0ZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuY2FuX2ZldGNoKGFnZW50LCB1cmwpKQogCkBAIC00MywxNSArNTcsMTcgQEAKIHRlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKIAogZGVmIFJvYm90VGVzdChpbmRleCwgcm9ib3RzX3R4dCwgZ29vZF91cmxzLCBiYWRfdXJscywKLSAgICAgICAgICAgICAgYWdlbnQ9InRlc3Rfcm9ib3RwYXJzZXIiKToKKyAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSwgYWdlbnQ9InRlc3Rfcm9ib3RwYXJzZXIiKToKIAogICAgIGxpbmVzID0gaW8uU3RyaW5nSU8ocm9ib3RzX3R4dCkucmVhZGxpbmVzKCkKICAgICBwYXJzZXIgPSB1cmxsaWIucm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyKCkKICAgICBwYXJzZXIucGFyc2UobGluZXMpCiAgICAgZm9yIHVybCBpbiBnb29kX3VybHM6Ci0gICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDEsIGFnZW50KSkKKyAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMSwgYWdlbnQsCisgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkpCiAgICAgZm9yIHVybCBpbiBiYWRfdXJsczoKLSAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMCwgYWdlbnQpKQorICAgICAgICB0ZXN0cy5hZGRUZXN0KFJvYm90VGVzdENhc2UoaW5kZXgsIHBhcnNlciwgdXJsLCAwLCBhZ2VudCwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5KSkKIAogIyBFeGFtcGxlcyBmcm9tIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy5odG1sIChmZXRjaGVkIDIwMDIpCiAKQEAgLTY1LDE0ICs4MSwxOCBAQAogCiBnb29kID0gWycvJywnL3Rlc3QuaHRtbCddCiBiYWQgPSBbJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJywnL3RtcC94eHgnLCcvZm9vLmh0bWwnXQorcmVxdWVzdF9yYXRlID0gTm9uZQorY3Jhd2xfZGVsYXkgPSBOb25lCiAKLVJvYm90VGVzdCgxLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgxLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyAyLgogZG9jID0gIiIiCiAjIHJvYm90cy50eHQgZm9yIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vCiAKIFVzZXItYWdlbnQ6ICoKK0NyYXdsLWRlbGF5OiAxCitSZXF1ZXN0LXJhdGU6IDMvMTUKIERpc2FsbG93OiAvY3liZXJ3b3JsZC9tYXAvICMgVGhpcyBpcyBhbiBpbmZpbml0ZSB2aXJ0dWFsIFVSTCBzcGFjZQogCiAjIEN5YmVybWFwcGVyIGtub3dzIHdoZXJlIHRvIGdvLgpAQCAtODMsOCArMTAzLDEwIEBACiAKIGdvb2QgPSBbJy8nLCcvdGVzdC5odG1sJywoJ2N5YmVybWFwcGVyJywnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnKV0KIGJhZCA9IFsnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnXQorcmVxdWVzdF9yYXRlID0gTm9uZSAgIyBUaGUgcGFyYW1ldGVycyBzaG91bGQgYmUgZXF1YWwgdG8gTm9uZSBzaW5jZSB0aGV5CitjcmF3bF9kZWxheSA9IE5vbmUgICAjIGRvbid0IGFwcGx5IHRvIHRoZSBjeWJlcm1hcHBlciB1c2VyIGFnZW50CiAKLVJvYm90VGVzdCgyLCBkb2MsIGdvb2QsIGJhZCkKK1JvYm90VGVzdCgyLCBkb2MsIGdvb2QsIGJhZCwgcmVxdWVzdF9yYXRlLCBjcmF3bF9kZWxheSkKIAogIyAzLgogZG9jID0gIiIiCkBAIC05NSwxNCArMTE3LDE4IEBACiAKIGdvb2QgPSBbXQogYmFkID0gWycvY3liZXJ3b3JsZC9tYXAvaW5kZXguaHRtbCcsJy8nLCcvdG1wLyddCityZXF1ZXN0X3JhdGUgPSBOb25lCitjcmF3bF9kZWxheSA9IE5vbmUKIAotUm9ib3RUZXN0KDMsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDMsIGRvYywgZ29vZCwgYmFkLCByZXF1ZXN0X3JhdGUsIGNyYXdsX2RlbGF5KQogCiAjIEV4YW1wbGVzIGZyb20gaHR0cDovL3d3dy5yb2JvdHN0eHQub3JnL3djL25vcm9ib3RzLXJmYy5odG1sIChmZXRjaGVkIDIwMDIpCiAKICMgNC4KIGRvYyA9ICIiIgogVXNlci1hZ2VudDogZmlndHJlZQorQ3Jhd2wtZGVsYXk6IDMKK1JlcXVlc3QtcmF0ZTogOS8zMAogRGlzYWxsb3c6IC90bXAKIERpc2FsbG93OiAvYSUzY2QuaHRtbAogRGlzYWxsb3c6IC9hJTJmYi5odG1sCkBAIC0xMTUsOCArMTQxLDE3IEBACiAgICAgICAgJy9+am9lL2luZGV4Lmh0bWwnCiAgICAgICAgXQogCi1Sb2JvdFRlc3QoNCwgZG9jLCBnb29kLCBiYWQsICdmaWd0cmVlJykKLVJvYm90VGVzdCg1LCBkb2MsIGdvb2QsIGJhZCwgJ0ZpZ1RyZWUgUm9ib3QgbGlid3d3LXBlcmwvNS4wNCcpCityZXF1ZXN0X3JhdGUgPSBuYW1lZHR1cGxlKCdyZXFfcmF0ZScsICdyZXF1ZXN0cyBzZWNvbmRzJykKK3JlcXVlc3RfcmF0ZS5yZXF1ZXN0cyA9IDkKK3JlcXVlc3RfcmF0ZS5zZWNvbmRzID0gMzAKK2NyYXdsX2RlbGF5ID0gMworcmVxdWVzdF9yYXRlX2JhZCA9IE5vbmUgICMgbm90IGFjdHVhbGx5IHRlc3RlZCwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcGFyc2UgaXQKK2NyYXdsX2RlbGF5X2JhZCA9IE5vbmUgICMgaW4gb3JkZXIgdG8gYWNjb21tb2RhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMKKworCitSb2JvdFRlc3QoNCwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZSwgY3Jhd2xfZGVsYXksICdmaWd0cmVlJyApCitSb2JvdFRlc3QoNSwgZG9jLCBnb29kLCBiYWQsIHJlcXVlc3RfcmF0ZV9iYWQsIGNyYXdsX2RlbGF5X2JhZCwKKyAgICAgICAgICAnRmlnVHJlZSBSb2JvdCBsaWJ3d3ctcGVybC81LjA0JykKIAogIyA2LgogZG9jID0gIiIiCkBAIC0xMjUsMTQgKzE2MCwxOCBAQAogRGlzYWxsb3c6IC9hJTNDZC5odG1sCiBEaXNhbGxvdzogL2EvYi5odG1sCiBEaXNhbGxvdzogLyU3ZWpvZS9pbmRleC5odG1sCitDcmF3bC1kZWxheTogMworUmVxdWVzdC1yYXRlOiA5L2JhbmFuYQogIiIiCiAKIGdvb2QgPSBbJy90bXAnLF0gIyBYRkFJTDogJy9hJTJmYi5odG1sJwogYmFkID0gWycvdG1wLycsJy90bXAvYS5odG1sJywKICAgICAgICAnL2ElM2NkLmh0bWwnLCcvYSUzQ2QuaHRtbCcsIi9hL2IuaHRtbCIsCiAgICAgICAgJy8lN0Vqb2UvaW5kZXguaHRtbCddCitjcmF3bF9kZWxheSA9IDMKK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgc2luY2UgcmVxdWVzdCByYXRlIGhhcyBpbnZhbGlkIHN5bnRheCwgcmV0dXJuIE5vbmUKIAotUm9ib3RUZXN0KDYsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDYsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lKQogCiAjIEZyb20gYnVnIHJlcG9ydCAjNTIzMDQxCiAKQEAgLTE0MCwxMiArMTc5LDE2IEBACiBkb2MgPSAiIiIKIFVzZXItQWdlbnQ6ICoKIERpc2FsbG93OiAvLgorQ3Jhd2wtZGVsYXk6IHBlYXJzCiAiIiIKIAogZ29vZCA9IFsnL2Zvby5odG1sJ10KLWJhZCA9IFtdICMgQnVnIHJlcG9ydCBzYXlzICIvIiBzaG91bGQgYmUgZGVuaWVkLCBidXQgdGhhdCBpcyBub3QgaW4gdGhlIFJGQworYmFkID0gW10gICMgYnVnIHJlcG9ydCBzYXlzICIvIiBzaG91bGQgYmUgZGVuaWVkLCBidXQgdGhhdCBpcyBub3QgaW4gdGhlIFJGQwogCi1Sb2JvdFRlc3QoNywgZG9jLCBnb29kLCBiYWQpCitjcmF3bF9kZWxheSA9IE5vbmUgICMgc2luY2UgY3Jhd2wgZGVsYXkgaGFzIGludmFsaWQgc3ludGF4LCByZXR1cm4gTm9uZQorcmVxdWVzdF9yYXRlID0gTm9uZQorCitSb2JvdFRlc3QoNywgZG9jLCBnb29kLCBiYWQsIGNyYXdsX2RlbGF5LCByZXF1ZXN0X3JhdGUpCiAKICMgRnJvbSBHb29nbGU6IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L3dlYm1hc3RlcnMvYmluL2Fuc3dlci5weT9obD1lbiZhbnN3ZXI9NDAzNjQKIApAQCAtMTU0LDEyICsxOTcsMTUgQEAKIFVzZXItYWdlbnQ6IEdvb2dsZWJvdAogQWxsb3c6IC9mb2xkZXIxL215ZmlsZS5odG1sCiBEaXNhbGxvdzogL2ZvbGRlcjEvCitSZXF1ZXN0LXJhdGU6IHdoYWxlL2JhbmFuYQogIiIiCiAKIGdvb2QgPSBbJy9mb2xkZXIxL215ZmlsZS5odG1sJ10KIGJhZCA9IFsnL2ZvbGRlcjEvYW5vdGhlcmZpbGUuaHRtbCddCitjcmF3bF9kZWxheSA9IE5vbmUKK3JlcXVlc3RfcmF0ZSA9IE5vbmUgICMgaW52YWxpZCBzeW50YXgsIHJldHVybiBub25lCiAKLVJvYm90VGVzdCg4LCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoOCwgZG9jLCBnb29kLCBiYWQsIGNyYXdsX2RlbGF5LCByZXF1ZXN0X3JhdGUsIGFnZW50PSJHb29nbGVib3QiKQogCiAjIDkuICBUaGlzIGZpbGUgaXMgaW5jb3JyZWN0IGJlY2F1c2UgIkdvb2dsZWJvdCIgaXMgYSBzdWJzdHJpbmcgb2YKICMgICAgICJHb29nbGVib3QtTW9iaWxlIiwgc28gdGVzdCAxMCB3b3JrcyBqdXN0IGxpa2UgdGVzdCA5LgpAQCAtMTc0LDEyICsyMjAsMTIgQEAKIGdvb2QgPSBbXQogYmFkID0gWycvc29tZXRoaW5nLmpwZyddCiAKLVJvYm90VGVzdCg5LCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCitSb2JvdFRlc3QoOSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJHb29nbGVib3QiKQogCiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoMTAsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCitSb2JvdFRlc3QoMTAsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCiAKICMgMTEuICBHZXQgdGhlIG9yZGVyIGNvcnJlY3QuCiBkb2MgPSAiIiIKQEAgLTE5MywxMiArMjM5LDEyIEBACiBnb29kID0gW10KIGJhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQogCi1Sb2JvdFRlc3QoMTEsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90IikKK1JvYm90VGVzdCgxMSwgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJHb29nbGVib3QiKQogCiBnb29kID0gWycvc29tZXRoaW5nLmpwZyddCiBiYWQgPSBbXQogCi1Sb2JvdFRlc3QoMTIsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCitSb2JvdFRlc3QoMTIsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCiAKIAogIyAxMy4gIEdvb2dsZSBhbHNvIGdvdCB0aGUgb3JkZXIgd3JvbmcgaW4gIzguICBZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZQpAQCAtMjEyLDcgKzI1OCw3IEBACiBnb29kID0gWycvZm9sZGVyMS9teWZpbGUuaHRtbCddCiBiYWQgPSBbJy9mb2xkZXIxL2Fub3RoZXJmaWxlLmh0bWwnXQogCi1Sb2JvdFRlc3QoMTMsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iZ29vZ2xlYm90IikKK1JvYm90VGVzdCgxMywgZG9jLCBnb29kLCBiYWQsIE5vbmUsIE5vbmUsIGFnZW50PSJnb29nbGVib3QiKQogCiAKICMgMTQuIEZvciBpc3N1ZSAjNjMyNSAocXVlcnkgc3RyaW5nIHN1cHBvcnQpCkBAIC0yMjQsNyArMjcwLDcgQEAKIGdvb2QgPSBbJy9zb21lL3BhdGgnXQogYmFkID0gWycvc29tZS9wYXRoP25hbWU9dmFsdWUnXQogCi1Sb2JvdFRlc3QoMTQsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE0LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyAxNS4gRm9yIGlzc3VlICM0MTA4IChvYmV5IGZpcnN0ICogZW50cnkpCiBkb2MgPSAiIiIKQEAgLTIzOCw3ICsyODQsNyBAQAogZ29vZCA9IFsnL2Fub3RoZXIvcGF0aCddCiBiYWQgPSBbJy9zb21lL3BhdGgnXQogCi1Sb2JvdFRlc3QoMTUsIGRvYywgZ29vZCwgYmFkKQorUm9ib3RUZXN0KDE1LCBkb2MsIGdvb2QsIGJhZCwgTm9uZSwgTm9uZSkKIAogIyAxNi4gRW1wdHkgcXVlcnkgKGlzc3VlICMxNzQwMykuIE5vcm1hbGl6aW5nIHRoZSB1cmwgZmlyc3QuCiBkb2MgPSAiIiIKQEAgLTI1MCw3ICsyOTYsNyBAQAogZ29vZCA9IFsnL3NvbWUvcGF0aD8nXQogYmFkID0gWycvYW5vdGhlci9wYXRoPyddCiAKLVJvYm90VGVzdCgxNiwgZG9jLCBnb29kLCBiYWQpCitSb2JvdFRlc3QoMTYsIGRvYywgZ29vZCwgYmFkLCBOb25lLCBOb25lKQogCiAKIGNsYXNzIFJvYm90SGFuZGxlcihCYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2NoZWQucHkgYi9MaWIvdGVzdC90ZXN0X3NjaGVkLnB5CmluZGV4IGZlOGU3ODUuLmY4NmY1OTkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2NoZWQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zY2hlZC5weQpAQCAtMiw3ICsyLDYgQEAKIGltcG9ydCBzY2hlZAogaW1wb3J0IHRpbWUKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiB0cnk6CiAgICAgaW1wb3J0IHRocmVhZGluZwogZXhjZXB0IEltcG9ydEVycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZWNyZXRzLnB5IGIvTGliL3Rlc3QvdGVzdF9zZWNyZXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjVjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3NlY3JldHMucHkKQEAgLTAsMCArMSwxMjMgQEAKKyIiIlRlc3QgdGhlIHNlY3JldHMgbW9kdWxlLgorCitBcyBtb3N0IG9mIHRoZSBmdW5jdGlvbnMgaW4gc2VjcmV0cyBhcmUgdGhpbiB3cmFwcGVycyBhcm91bmQgZnVuY3Rpb25zCitkZWZpbmVkIGVsc2V3aGVyZSwgd2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHRoZW0gZXhoYXVzdGl2ZWx5LgorIiIiCisKKworaW1wb3J0IHNlY3JldHMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN0cmluZworCisKKyMgPT09IFVuaXQgdGVzdHMgPT09CisKK2NsYXNzIENvbXBhcmVfRGlnZXN0X1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHNlY3JldHMuY29tcGFyZV9kaWdlc3QgZnVuY3Rpb24uIiIiCisKKyAgICBkZWYgdGVzdF9lcXVhbChzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvbXBhcmVfZGlnZXN0IGZ1bmN0aW9uYWxpdHkgd2l0aCBlcXVhbCAoYnl0ZS90ZXh0KSBzdHJpbmdzLgorICAgICAgICBmb3IgcyBpbiAoImEiLCAiYmNkIiwgInh5ejEyMyIpOgorICAgICAgICAgICAgYSA9IHMqMTAwCisgICAgICAgICAgICBiID0gcyoxMDAKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlY3JldHMuY29tcGFyZV9kaWdlc3QoYS5lbmNvZGUoJ3V0Zi04JyksIGIuZW5jb2RlKCd1dGYtOCcpKSkKKworICAgIGRlZiB0ZXN0X3VuZXF1YWwoc2VsZik6CisgICAgICAgICMgVGVzdCBjb21wYXJlX2RpZ2VzdCBmdW5jdGlvbmFsaXR5IHdpdGggdW5lcXVhbCAoYnl0ZS90ZXh0KSBzdHJpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlY3JldHMuY29tcGFyZV9kaWdlc3QoImFiYyIsICJhYmNkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VjcmV0cy5jb21wYXJlX2RpZ2VzdChiImFiYyIsIGIiYWJjZCIpKQorICAgICAgICBmb3IgcyBpbiAoIngiLCAibW4iLCAiYTFiMmMzIik6CisgICAgICAgICAgICBhID0gcyoxMDAgKyAicSIKKyAgICAgICAgICAgIGIgPSBzKjEwMCArICJrIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KGEsIGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWNyZXRzLmNvbXBhcmVfZGlnZXN0KGEuZW5jb2RlKCd1dGYtOCcpLCBiLmVuY29kZSgndXRmLTgnKSkpCisKKyAgICBkZWYgdGVzdF9iYWRfdHlwZXMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGNvbXBhcmVfZGlnZXN0IHJhaXNlcyB3aXRoIG1peGVkIHR5cGVzLgorICAgICAgICBhID0gJ2FiY2RlJworICAgICAgICBiID0gYS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYSwgc3RyKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShiLCBieXRlcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWNyZXRzLmNvbXBhcmVfZGlnZXN0LCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlY3JldHMuY29tcGFyZV9kaWdlc3QsIGIsIGEpCisKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBjb21wYXJlX2RpZ2VzdCByZXR1cm5zIGEgYm9vbC4KKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlY3JldHMuY29tcGFyZV9kaWdlc3QoImFiYyIsICJhYmMiKSwgYm9vbCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlY3JldHMuY29tcGFyZV9kaWdlc3QoImFiYyIsICJ4eXoiKSwgYm9vbCkKKworCitjbGFzcyBSYW5kb21fVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3Qgd3JhcHBlcnMgYXJvdW5kIFN5c3RlbVJhbmRvbSBtZXRob2RzLiIiIgorCisgICAgZGVmIHRlc3RfcmFuZGJpdHMoc2VsZik6CisgICAgICAgICMgVGVzdCByYW5kYml0cy4KKyAgICAgICAgZXJybXNnID0gInJhbmRiaXRzKCVkKSByZXR1cm5lZCAlZCIKKyAgICAgICAgZm9yIG51bWJpdHMgaW4gKDMsIDEyLCAzMCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg2KToKKyAgICAgICAgICAgICAgICBuID0gc2VjcmV0cy5yYW5kYml0cyhudW1iaXRzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IG4gPCAyKipudW1iaXRzLCBlcnJtc2cgJSAobnVtYml0cywgbikpCisKKyAgICBkZWYgdGVzdF9jaG9pY2Uoc2VsZik6CisgICAgICAgICMgVGVzdCBjaG9pY2UuCisgICAgICAgIGl0ZW1zID0gWzEsIDIsIDQsIDgsIDE2LCAzMiwgNjRdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWNyZXRzLmNob2ljZShpdGVtcykgaW4gaXRlbXMpCisKKyAgICBkZWYgdGVzdF9yYW5kYmVsb3coc2VsZik6CisgICAgICAgICMgVGVzdCByYW5kYmVsb3cuCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIsIDEwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VjcmV0cy5yYW5kYmVsb3coaSksIHJhbmdlKGkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWNyZXRzLnJhbmRiZWxvdywgMCkKKworCitjbGFzcyBUb2tlbl9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0b2tlbiBmdW5jdGlvbnMuIiIiCisKKyAgICBkZWYgdGVzdF90b2tlbl9kZWZhdWx0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdG9rZW5fKiBmdW5jdGlvbnMgaGFuZGxlIGRlZmF1bHQgc2l6ZSBjb3JyZWN0bHkuCisgICAgICAgIGZvciBmdW5jIGluIChzZWNyZXRzLnRva2VuX2J5dGVzLCBzZWNyZXRzLnRva2VuX2hleCwKKyAgICAgICAgICAgICAgICAgICAgIHNlY3JldHMudG9rZW5fdXJsc2FmZSk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChmdW5jPWZ1bmMpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBmdW5jLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBubyBhcmd1bWVudCIgJSBuYW1lKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYyhOb25lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXMgY2Fubm90IGJlIGNhbGxlZCB3aXRoIE5vbmUiICUgbmFtZSkKKyAgICAgICAgc2l6ZSA9IHNlY3JldHMuREVGQVVMVF9FTlRST1BZCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlY3JldHMudG9rZW5fYnl0ZXMoTm9uZSkpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWNyZXRzLnRva2VuX2hleChOb25lKSksIDIqc2l6ZSkKKworICAgIGRlZiB0ZXN0X3Rva2VuX2J5dGVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdG9rZW5fYnl0ZXMuCisgICAgICAgIGZvciBuIGluICgxLCA4LCAxNywgMTAwKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG49bik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlY3JldHMudG9rZW5fYnl0ZXMobiksIGJ5dGVzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlY3JldHMudG9rZW5fYnl0ZXMobikpLCBuKQorCisgICAgZGVmIHRlc3RfdG9rZW5faGV4KHNlbGYpOgorICAgICAgICAjIFRlc3QgdG9rZW5faGV4LgorICAgICAgICBmb3IgbiBpbiAoMSwgMTIsIDI1LCA5MCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuPW4pOgorICAgICAgICAgICAgICAgIHMgPSBzZWNyZXRzLnRva2VuX2hleChuKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzLCBzdHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIDIqbikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsKGMgaW4gc3RyaW5nLmhleGRpZ2l0cyBmb3IgYyBpbiBzKSkKKworICAgIGRlZiB0ZXN0X3Rva2VuX3VybHNhZmUoc2VsZik6CisgICAgICAgICMgVGVzdCB0b2tlbl91cmxzYWZlLgorICAgICAgICBsZWdhbCA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICctXycKKyAgICAgICAgZm9yIG4gaW4gKDEsIDExLCAyOCwgNzYpOgorICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qobj1uKToKKyAgICAgICAgICAgICAgICBzID0gc2VjcmV0cy50b2tlbl91cmxzYWZlKG4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHMsIHN0cikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsKGMgaW4gbGVnYWwgZm9yIGMgaW4gcykpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zZXQucHkKaW5kZXggMWE0OWVkZi4uNDlhYmZiMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZXQucHkKQEAgLTYsMTAgKzYsMTEgQEAKIGltcG9ydCBjb3B5CiBpbXBvcnQgcGlja2xlCiBmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlLCBzaHVmZmxlCi1pbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKIGltcG9ydCBjb2xsZWN0aW9ucwogaW1wb3J0IGNvbGxlY3Rpb25zLmFiYworaW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IHN0cmluZwogCiBjbGFzcyBQYXNzVGhydShFeGNlcHRpb24pOgogICAgIHBhc3MKQEAgLTcxNCw2ICs3MTUsMjggQEAKICAgICAgICAgICAgIGFkZGhhc2h2YWx1ZShoYXNoKGZyb3plbnNldChbZSBmb3IgZSwgbSBpbiBlbGVtbWFza3MgaWYgbSZpXSkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihoYXNodmFsdWVzKSwgMioqbikKIAorICAgICAgICBkZWYgbGV0dGVyX3JhbmdlKG4pOgorICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5hc2NpaV9sZXR0ZXJzWzpuXQorCisgICAgICAgIGRlZiB6Zl9yYW5nZShuKToKKyAgICAgICAgICAgICMgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2V0LXRoZW9yZXRpY19kZWZpbml0aW9uX29mX25hdHVyYWxfbnVtYmVycworICAgICAgICAgICAgbnVtcyA9IFtmcm96ZW5zZXQoKV0KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4tMSk6CisgICAgICAgICAgICAgICAgbnVtID0gZnJvemVuc2V0KG51bXMpCisgICAgICAgICAgICAgICAgbnVtcy5hcHBlbmQobnVtKQorICAgICAgICAgICAgcmV0dXJuIG51bXNbOm5dCisKKyAgICAgICAgZGVmIHBvd2Vyc2V0KHMpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpKzEpOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb20gbWFwKGZyb3plbnNldCwgaXRlcnRvb2xzLmNvbWJpbmF0aW9ucyhzLCBpKSkKKworICAgICAgICBmb3IgbiBpbiByYW5nZSgxOCk6CisgICAgICAgICAgICB0ID0gMiAqKiBuCisgICAgICAgICAgICBtYXNrID0gdCAtIDEKKyAgICAgICAgICAgIGZvciBudW1zIGluIChyYW5nZSwgbGV0dGVyX3JhbmdlLCB6Zl9yYW5nZSk6CisgICAgICAgICAgICAgICAgdSA9IGxlbih7aCAmIG1hc2sgZm9yIGggaW4gbWFwKGhhc2gsIHBvd2Vyc2V0KG51bXMobikpKX0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKDQqdSwgdCkKKwogY2xhc3MgRnJvemVuU2V0U3ViY2xhc3MoZnJvemVuc2V0KToKICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5IGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKaW5kZXggMWI4MGZmMC4uYWI0MmVkNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkKQEAgLTIyLDI5ICsyMiw2IEBACiAgICAgX3Rlc3RjYXBpID0gTm9uZQogCiAKLWNsYXNzIEhhbmRsZXJCQ2FsbGVkKEV4Y2VwdGlvbik6Ci0gICAgcGFzcwotCi0KLWRlZiBleGl0X3N1YnByb2Nlc3MoKToKLSAgICAiIiJVc2Ugb3MuX2V4aXQoMCkgdG8gZXhpdCB0aGUgY3VycmVudCBzdWJwcm9jZXNzLgotCi0gICAgT3RoZXJ3aXNlLCB0aGUgdGVzdCBjYXRjaGVzIHRoZSBTeXN0ZW1FeGl0IGFuZCBjb250aW51ZXMgZXhlY3V0aW5nCi0gICAgaW4gcGFyYWxsZWwgd2l0aCB0aGUgb3JpZ2luYWwgdGVzdCwgc28geW91IHdpbmQgdXAgd2l0aCBhbgotICAgIGV4cG9uZW50aWFsIG51bWJlciBvZiB0ZXN0cyBydW5uaW5nIGNvbmN1cnJlbnRseS4KLSAgICAiIiIKLSAgICBvcy5fZXhpdCgwKQotCi0KLWRlZiBpZ25vcmluZ19laW50cihfX2Z1bmMsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgdHJ5OgotICAgICAgICByZXR1cm4gX19mdW5jKCphcmdzLCAqKmt3YXJncykKLSAgICBleGNlcHQgT1NFcnJvciBhcyBlOgotICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVJTlRSOgotICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotCiBjbGFzcyBHZW5lcmljVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgQHVuaXR0ZXN0LnNraXBJZih0aHJlYWRpbmcgaXMgTm9uZSwgInRlc3QgbmVlZHMgdGhyZWFkaW5nIG1vZHVsZSIpCkBAIC02MywxNDUgKzQwLDYgQEAKIAogCiBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiTm90IHZhbGlkIG9uIFdpbmRvd3MiKQotY2xhc3MgSW50ZXJQcm9jZXNzU2lnbmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgotICAgIE1BWF9EVVJBVElPTiA9IDIwICAgIyBFbnRpcmUgdGVzdCBzaG91bGQgbGFzdCBhdCBtb3N0IDIwIHNlYy4KLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi51c2luZ19nYyA9IGdjLmlzZW5hYmxlZCgpCi0gICAgICAgIGdjLmRpc2FibGUoKQotCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnVzaW5nX2djOgotICAgICAgICAgICAgZ2MuZW5hYmxlKCkKLQotICAgIGRlZiBmb3JtYXRfZnJhbWUoc2VsZiwgZnJhbWUsIGxpbWl0PU5vbmUpOgotICAgICAgICByZXR1cm4gJycuam9pbih0cmFjZWJhY2suZm9ybWF0X3N0YWNrKGZyYW1lLCBsaW1pdD1saW1pdCkpCi0KLSAgICBkZWYgaGFuZGxlckEoc2VsZiwgc2lnbnVtLCBmcmFtZSk6Ci0gICAgICAgIHNlbGYuYV9jYWxsZWQgPSBUcnVlCi0KLSAgICBkZWYgaGFuZGxlckIoc2VsZiwgc2lnbnVtLCBmcmFtZSk6Ci0gICAgICAgIHNlbGYuYl9jYWxsZWQgPSBUcnVlCi0gICAgICAgIHJhaXNlIEhhbmRsZXJCQ2FsbGVkKHNpZ251bSwgc2VsZi5mb3JtYXRfZnJhbWUoZnJhbWUpKQotCi0gICAgZGVmIHdhaXQoc2VsZiwgY2hpbGQpOgotICAgICAgICAiIiJXYWl0IGZvciBjaGlsZCB0byBmaW5pc2gsIGlnbm9yaW5nIEVJTlRSLiIiIgotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNoaWxkLndhaXQoKQotICAgICAgICAgICAgICAgIHJldHVybgotICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKLSAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVJTlRSOgotICAgICAgICAgICAgICAgICAgICByYWlzZQotCi0gICAgZGVmIHJ1bl90ZXN0KHNlbGYpOgotICAgICAgICAjIEluc3RhbGwgaGFuZGxlcnMuIFRoaXMgZnVuY3Rpb24gcnVucyBpbiBhIHN1Yi1wcm9jZXNzLCBzbyB3ZQotICAgICAgICAjIGRvbid0IHdvcnJ5IGFib3V0IHJlLXNldHRpbmcgdGhlIGRlZmF1bHQgaGFuZGxlcnMuCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgc2VsZi5oYW5kbGVyQSkKLSAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMSwgc2VsZi5oYW5kbGVyQikKLSAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMiwgc2lnbmFsLlNJR19JR04pCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIHNpZ25hbC5kZWZhdWx0X2ludF9oYW5kbGVyKQotCi0gICAgICAgICMgVmFyaWFibGVzIHRoZSBzaWduYWxzIHdpbGwgbW9kaWZ5OgotICAgICAgICBzZWxmLmFfY2FsbGVkID0gRmFsc2UKLSAgICAgICAgc2VsZi5iX2NhbGxlZCA9IEZhbHNlCi0KLSAgICAgICAgIyBMZXQgdGhlIHN1Yi1wcm9jZXNzZXMga25vdyB3aG8gdG8gc2VuZCBzaWduYWxzIHRvLgotICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQotCi0gICAgICAgIGNoaWxkID0gaWdub3JpbmdfZWludHIoc3VicHJvY2Vzcy5Qb3BlbiwgWydraWxsJywgJy1IVVAnLCBzdHIocGlkKV0pCi0gICAgICAgIGlmIGNoaWxkOgotICAgICAgICAgICAgc2VsZi53YWl0KGNoaWxkKQotICAgICAgICAgICAgaWYgbm90IHNlbGYuYV9jYWxsZWQ6Ci0gICAgICAgICAgICAgICAgdGltZS5zbGVlcCgxKSAgIyBHaXZlIHRoZSBzaWduYWwgdGltZSB0byBiZSBkZWxpdmVyZWQuCi0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmFfY2FsbGVkKQotICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYl9jYWxsZWQpCi0gICAgICAgIHNlbGYuYV9jYWxsZWQgPSBGYWxzZQotCi0gICAgICAgICMgTWFrZSBzdXJlIHRoZSBzaWduYWwgaXNuJ3QgZGVsaXZlcmVkIHdoaWxlIHRoZSBwcmV2aW91cwotICAgICAgICAjIFBvcGVuIG9iamVjdCBpcyBiZWluZyBkZXN0cm95ZWQsIGJlY2F1c2UgX19kZWxfXyBzd2FsbG93cwotICAgICAgICAjIGV4Y2VwdGlvbnMuCi0gICAgICAgIGRlbCBjaGlsZAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjaGlsZCA9IHN1YnByb2Nlc3MuUG9wZW4oWydraWxsJywgJy1VU1IxJywgc3RyKHBpZCldKQotICAgICAgICAgICAgIyBUaGlzIHdhaXQgc2hvdWxkIGJlIGludGVycnVwdGVkIGJ5IHRoZSBzaWduYWwncyBleGNlcHRpb24uCi0gICAgICAgICAgICBzZWxmLndhaXQoY2hpbGQpCi0gICAgICAgICAgICB0aW1lLnNsZWVwKDEpICAjIEdpdmUgdGhlIHNpZ25hbCB0aW1lIHRvIGJlIGRlbGl2ZXJlZC4KLSAgICAgICAgICAgIHNlbGYuZmFpbCgnSGFuZGxlckJDYWxsZWQgZXhjZXB0aW9uIG5vdCByYWlzZWQnKQotICAgICAgICBleGNlcHQgSGFuZGxlckJDYWxsZWQ6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5iX2NhbGxlZCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5hX2NhbGxlZCkKLQotICAgICAgICBjaGlsZCA9IGlnbm9yaW5nX2VpbnRyKHN1YnByb2Nlc3MuUG9wZW4sIFsna2lsbCcsICctVVNSMicsIHN0cihwaWQpXSkKLSAgICAgICAgaWYgY2hpbGQ6Ci0gICAgICAgICAgICBzZWxmLndhaXQoY2hpbGQpICAjIE5vdGhpbmcgc2hvdWxkIGhhcHBlbi4KLQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKLSAgICAgICAgICAgICMgVGhlIHJhY2UgY29uZGl0aW9uIGluIHBhdXNlIGRvZXNuJ3QgbWF0dGVyIGluIHRoaXMgY2FzZSwKLSAgICAgICAgICAgICMgc2luY2UgYWxhcm0gaXMgZ29pbmcgdG8gcmFpc2UgYSBLZXlib2FyZEV4Y2VwdGlvbiwgd2hpY2gKLSAgICAgICAgICAgICMgd2lsbCBza2lwIHRoZSBjYWxsLgotICAgICAgICAgICAgc2lnbmFsLnBhdXNlKCkKLSAgICAgICAgICAgICMgQnV0IGlmIGFub3RoZXIgc2lnbmFsIGFycml2ZXMgYmVmb3JlIHRoZSBhbGFybSwgcGF1c2UKLSAgICAgICAgICAgICMgbWF5IHJldHVybiBlYXJseS4KLSAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKLSAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgcGFzcwotICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWwoIlNvbWUgb3RoZXIgZXhjZXB0aW9uIHdva2UgdXMgZnJvbSBwYXVzZTogJXMiICUKLSAgICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2suZm9ybWF0X2V4YygpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsKCJwYXVzZSByZXR1cm5lZCBvZiBpdHMgb3duIGFjY29yZCwgYW5kIHRoZSBzaWduYWwiCi0gICAgICAgICAgICAgICAgICAgICAgIiBkaWRuJ3QgYXJyaXZlIGFmdGVyIGFub3RoZXIgc2Vjb25kLiIpCi0KLSAgICAjIElzc3VlIDM4NjQsIHVua25vd24gaWYgdGhpcyBhZmZlY3RzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZnJlZWJzZCBhbHNvCi0gICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm09PSdmcmVlYnNkNicsCi0gICAgICAgICdpbnRlciBwcm9jZXNzIHNpZ25hbHMgbm90IHJlbGlhYmxlIChkbyBub3QgbWl4IHdlbGwgd2l0aCB0aHJlYWRpbmcpICcKLSAgICAgICAgJ29uIGZyZWVic2Q2JykKLSAgICBkZWYgdGVzdF9tYWluKHNlbGYpOgotICAgICAgICAjIFRoaXMgZnVuY3Rpb24gc3Bhd25zIGEgY2hpbGQgcHJvY2VzcyB0byBpbnN1bGF0ZSB0aGUgbWFpbgotICAgICAgICAjIHRlc3QtcnVubmluZyBwcm9jZXNzIGZyb20gYWxsIHRoZSBzaWduYWxzLiBJdCB0aGVuCi0gICAgICAgICMgY29tbXVuaWNhdGVzIHdpdGggdGhhdCBjaGlsZCBwcm9jZXNzIG92ZXIgYSBwaXBlIGFuZAotICAgICAgICAjIHJlLXJhaXNlcyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgZXhjZXB0aW9ucyB0aGUgY2hpbGQKLSAgICAgICAgIyByYWlzZXMuIFRoZSByZWFsIHdvcmsgaGFwcGVucyBpbiBzZWxmLnJ1bl90ZXN0KCkuCi0gICAgICAgIG9zX2RvbmVfciwgb3NfZG9uZV93ID0gb3MucGlwZSgpCi0gICAgICAgIHdpdGggY2xvc2luZyhvcy5mZG9wZW4ob3NfZG9uZV9yLCAncmInKSkgYXMgZG9uZV9yLCBcCi0gICAgICAgICAgICAgY2xvc2luZyhvcy5mZG9wZW4ob3NfZG9uZV93LCAnd2InKSkgYXMgZG9uZV93OgotICAgICAgICAgICAgY2hpbGQgPSBvcy5mb3JrKCkKLSAgICAgICAgICAgIGlmIGNoaWxkID09IDA6Ci0gICAgICAgICAgICAgICAgIyBJbiB0aGUgY2hpbGQgcHJvY2VzczsgcnVuIHRoZSB0ZXN0IGFuZCByZXBvcnQgcmVzdWx0cwotICAgICAgICAgICAgICAgICMgdGhyb3VnaCB0aGUgcGlwZS4KLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGRvbmVfci5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgICMgSGF2ZSB0byBjbG9zZSBkb25lX3cgYWdhaW4gaGVyZSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICMgZXhpdF9zdWJwcm9jZXNzKCkgd2lsbCBza2lwIHRoZSBlbmNsb3Npbmcgd2l0aCBibG9jay4KLSAgICAgICAgICAgICAgICAgICAgd2l0aCBjbG9zaW5nKGRvbmVfdyk6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5fdGVzdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXAodHJhY2ViYWNrLmZvcm1hdF9leGMoKSwgZG9uZV93KQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChOb25lLCBkb25lX3cpCi0gICAgICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgICAgICBwcmludCgnVWggb2gsIHJhaXNlZCBmcm9tIHBpY2tsZS4nKQotICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKLSAgICAgICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgICAgICBleGl0X3N1YnByb2Nlc3MoKQotCi0gICAgICAgICAgICBkb25lX3cuY2xvc2UoKQotICAgICAgICAgICAgIyBCbG9jayBmb3IgdXAgdG8gTUFYX0RVUkFUSU9OIHNlY29uZHMgZm9yIHRoZSB0ZXN0IHRvIGZpbmlzaC4KLSAgICAgICAgICAgIHIsIHcsIHggPSBzZWxlY3Quc2VsZWN0KFtkb25lX3JdLCBbXSwgW10sIHNlbGYuTUFYX0RVUkFUSU9OKQotICAgICAgICAgICAgaWYgZG9uZV9yIGluIHI6Ci0gICAgICAgICAgICAgICAgdGIgPSBwaWNrbGUubG9hZChkb25lX3IpCi0gICAgICAgICAgICAgICAgaWYgdGI6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCh0YikKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgb3Mua2lsbChjaGlsZCwgc2lnbmFsLlNJR0tJTEwpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdUZXN0IGRlYWRsb2NrZWQgYWZ0ZXIgJWQgc2Vjb25kcy4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5NQVhfRFVSQVRJT04pCi0KLQotQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIk5vdCB2YWxpZCBvbiBXaW5kb3dzIikKIGNsYXNzIFBvc2l4VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0cml2aWFsX3NpZ25hbF9oYW5kbGVyKHNlbGYsICphcmdzKToKICAgICAgICAgcGFzcwpAQCAtMjI0LDYgKzYyLDE1IEBACiAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgaHVwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0hVUCksIGh1cCkKIAorICAgICMgSXNzdWUgMzg2NCwgdW5rbm93biBpZiB0aGlzIGFmZmVjdHMgZWFybGllciB2ZXJzaW9ucyBvZiBmcmVlYnNkIGFsc28KKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybT09J2ZyZWVic2Q2JywKKyAgICAgICAgJ2ludGVyIHByb2Nlc3Mgc2lnbmFscyBub3QgcmVsaWFibGUgKGRvIG5vdCBtaXggd2VsbCB3aXRoIHRocmVhZGluZykgJworICAgICAgICAnb24gZnJlZWJzZDYnKQorICAgIGRlZiB0ZXN0X2ludGVycHJvY2Vzc19zaWduYWwoc2VsZik6CisgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihkaXJuYW1lLCAnc2lnbmFsaW50ZXJwcm9jdGVzdGVyLnB5JykKKyAgICAgICAgYXNzZXJ0X3B5dGhvbl9vayhzY3JpcHQpCisKIAogQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW5kb3dzIHNwZWNpZmljIikKIGNsYXNzIFdpbmRvd3NTaWduYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NpdGUucHkgYi9MaWIvdGVzdC90ZXN0X3NpdGUucHkKaW5kZXggZGEyMGEzZC4uZjY5ODkyNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQpAQCAtNzUsNyArNzUsNyBAQAogICAgIGRlZiB0ZXN0X2luaXRfcGF0aGluZm8oc2VsZik6CiAgICAgICAgIGRpcl9zZXQgPSBzaXRlLl9pbml0X3BhdGhpbmZvKCkKICAgICAgICAgZm9yIGVudHJ5IGluIFtzaXRlLm1ha2VwYXRoKHBhdGgpWzFdIGZvciBwYXRoIGluIHN5cy5wYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGFuZCBvcy5wYXRoLmlzZGlyKHBhdGgpXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhdGggYW5kIG9zLnBhdGguZXhpc3RzKHBhdGgpXToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZW50cnksIGRpcl9zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBmcm9tIHN5cy5wYXRoIG5vdCBmb3VuZCBpbiBzZXQgcmV0dXJuZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiYnkgX2luaXRfcGF0aGluZm8oKTogJXMiICUgKGVudHJ5LCBkaXJfc2V0KSkKQEAgLTI0MywxMyArMjQzLDE0IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMikKICAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbignL0xpYnJhcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclZC4lZCcgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMV0sIHdhbnRlZCkKICAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgICAgICAgIyBPUyBYIG5vbi1mcmFtd2V3b3JrIGJ1aWxkcywgTGludXgsIEZyZWVCU0QsIGV0YwogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlycyksIDEpCi0gICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJ3hveG8nLCAnbGliJywgJ3B5dGhvbicgKyBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJ3hveG8nLCAnbGliJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzBdLCB3YW50ZWQpCiAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NtdHBkLnB5IGIvTGliL3Rlc3QvdGVzdF9zbXRwZC5weQppbmRleCA4OGRiZmRmLi4zZWViZTk0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NtdHBkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc210cGQucHkKQEAgLTUzLDEwICs1Myw2IEBACiAgICAgICAgIHdyaXRlX2xpbmUoYidEQVRBJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgd3JpdGVfbGluZSwgYidzcGFtXHJcbi5cclxuJykKIAotICAgIGRlZiB0ZXN0X2RlY29kZV9kYXRhX2RlZmF1bHRfd2FybnMoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc210cGQuU01UUFNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCi0KICAgICBkZWYgdGVzdF9kZWNvZGVfZGF0YV9hbmRfZW5hYmxlX1NNVFBVVEY4X3JhaXNlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICBWYWx1ZUVycm9yLApAQCAtMTA4LDEwICsxMDQsOSBAQAogICAgICAgICAgICAgICIiIikpCiAKICAgICBkZWYgdGVzdF9wcm9jZXNzX21lc3NhZ2Vfd2l0aF9kZWNvZGVfZGF0YV9mYWxzZShzZWxmKToKLSAgICAgICAgc2VydmVyID0gc210cGQuRGVidWdnaW5nU2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoJ2InLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBzbXRwZC5EZWJ1Z2dpbmdTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQogICAgICAgICBjb25uLCBhZGRyID0gc2VydmVyLmFjY2VwdCgpCi0gICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIsIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBjaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VydmVyLCBjb25uLCBhZGRyKQogICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKICAgICAgICAgICAgIHNlbGYuc2VuZF9kYXRhKGNoYW5uZWwsIGInRnJvbTogdGVzdFxuXG5oXHhjM1x4YTlsbG9ceGZmXG4nKQogICAgICAgICBzdGRvdXQgPSBzLmdldHZhbHVlKCkKQEAgLTE3NSwxMyArMTcwLDExIEBACiAKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzdXBwb3J0LklQVjZfRU5BQkxFRCwgIklQdjYgbm90IGVuYWJsZWQiKQogICAgIGRlZiB0ZXN0X3NvY2tldF91c2VzX0lQdjYoc2VsZik6Ci0gICAgICAgIHNlcnZlciA9IHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVHY2LCAwKSwgKHN1cHBvcnQuSE9TVCwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIHNlcnZlciA9IHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVHY2LCAwKSwgKHN1cHBvcnQuSE9TVCwgMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnNvY2tldC5mYW1pbHksIHNvY2tldC5BRl9JTkVUNikKIAogICAgIGRlZiB0ZXN0X3NvY2tldF91c2VzX0lQdjQoc2VsZik6Ci0gICAgICAgIHNlcnZlciA9IHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksIChzdXBwb3J0LkhPU1R2NiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIHNlcnZlciA9IHNtdHBkLlNNVFBTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksIChzdXBwb3J0LkhPU1R2NiwgMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnNvY2tldC5mYW1pbHksIHNvY2tldC5BRl9JTkVUKQogCiAKQEAgLTIwNCwxOCArMTk3LDE4IEBACiAgICAgICAgIGNoYW5uZWwuaGFuZGxlX3JlYWQoKQogCiAgICAgZGVmIHRlc3RfcGFyYW1zX3JlamVjdGVkKHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkciwgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ0VITE8gZXhhbXBsZScpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ01BSUwgZnJvbTogPGZvb0BleGFtcGxlLmNvbT4gc2l6ZT0yMCcpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ1JDUFQgdG86IDxmb29AZXhhbXBsZS5jb20+IGZvbz1iYXInKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYW5uZWwuc29ja2V0Lmxhc3QsIHNlbGYuZXJyb3JfcmVzcG9uc2UpCiAKICAgICBkZWYgdGVzdF9ub3RoaW5nX2FjY2VwdGVkKHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkciwgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ0VITE8gZXhhbXBsZScpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ01BSUwgZnJvbTogPGZvb0BleGFtcGxlLmNvbT4gc2l6ZT0yMCcpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ1JDUFQgdG86IDxmb29AZXhhbXBsZS5jb20+JykKQEAgLTI1Nyw5ICsyNTAsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYW5uZWwuc29ja2V0Lmxhc3QsIGInMjUwIE9LXHJcbicpCiAKICAgICBkZWYgdGVzdF93aXRoX2RlY29kZV9kYXRhX2ZhbHNlKHNlbGYpOgotICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCksIGRlY29kZV9kYXRhPUZhbHNlKQorICAgICAgICBzZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgY2hhbm5lbCA9IHNtdHBkLlNNVFBDaGFubmVsKHNlcnZlciwgY29ubiwgYWRkciwgZGVjb2RlX2RhdGE9RmFsc2UpCisgICAgICAgIGNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIpCiAgICAgICAgIHNlbGYud3JpdGVfbGluZShjaGFubmVsLCBiJ0VITE8gZXhhbXBsZScpCiAgICAgICAgIGZvciBsaW5lIGluIFsKICAgICAgICAgICAgIGInTUFJTCBmcm9tOiA8Zm9vQGV4YW1wbGUuY29tPiBzaXplPTIwIFNNVFBVVEY4JywKQEAgLTc2NSwxMyArNzU4LDYgQEAKICAgICAgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgRGVwcmVjYXRpb25XYXJuaW5nKSk6CiAgICAgICAgICAgICBzZWxmLmNoYW5uZWwuX1NNVFBDaGFubmVsX19hZGRyID0gJ3NwYW0nCiAKLSAgICBkZWYgdGVzdF9kZWNvZGVfZGF0YV9kZWZhdWx0X3dhcm5pbmcoc2VsZik6Ci0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgc2VydmVyID0gRHVtbXlTZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksICgnYicsIDApKQotICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2ZXIuYWNjZXB0KCkKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBzbXRwZC5TTVRQQ2hhbm5lbChzZXJ2ZXIsIGNvbm4sIGFkZHIpCi0KIEB1bml0dGVzdC5za2lwVW5sZXNzKHN1cHBvcnQuSVBWNl9FTkFCTEVELCAiSVB2NiBub3QgZW5hYmxlZCIpCiBjbGFzcyBTTVRQRENoYW5uZWxJUHY2VGVzdChTTVRQRENoYW5uZWxUZXN0KToKICAgICBkZWYgc2V0VXAoc2VsZik6CkBAIC04NDUsMTIgKzgzMSw5IEBACiAgICAgICAgIHNtdHBkLnNvY2tldCA9IGFzeW5jb3JlLnNvY2tldCA9IG1vY2tfc29ja2V0CiAgICAgICAgIHNlbGYub2xkX2RlYnVnc3RyZWFtID0gc210cGQuREVCVUdTVFJFQU0KICAgICAgICAgc2VsZi5kZWJ1ZyA9IHNtdHBkLkRFQlVHU1RSRUFNID0gaW8uU3RyaW5nSU8oKQotICAgICAgICBzZWxmLnNlcnZlciA9IER1bW15U2VydmVyKChzdXBwb3J0LkhPU1QsIDApLCAoJ2InLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBEdW1teVNlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgKCdiJywgMCkpCiAgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLnNlcnZlci5hY2NlcHQoKQotICAgICAgICAjIFNldCBkZWNvZGVfZGF0YSB0byBGYWxzZQotICAgICAgICBzZWxmLmNoYW5uZWwgPSBzbXRwZC5TTVRQQ2hhbm5lbChzZWxmLnNlcnZlciwgY29ubiwgYWRkciwKLSAgICAgICAgICAgICAgICBkZWNvZGVfZGF0YT1GYWxzZSkKKyAgICAgICAgc2VsZi5jaGFubmVsID0gc210cGQuU01UUENoYW5uZWwoc2VsZi5zZXJ2ZXIsIGNvbm4sIGFkZHIpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbCgpCkBAIC0xMDE1LDUgKzk5OCwxNiBAQAogICAgICAgICAgICAgc2VsZi53cml0ZV9saW5lKGIndGVzdFxyXG4uJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jaGFubmVsLnNvY2tldC5sYXN0WzA6M10sIGInMjUwJykKIAorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geworICAgICAgICAgICAgInByb2dyYW0iLCAiRGV2bnVsbCIsICJERUJVR1NUUkVBTSIsICJORVdMSU5FIiwgIkNPTU1BU1BBQ0UiLAorICAgICAgICAgICAgIkRBVEFfU0laRV9ERUZBVUxUIiwgInVzYWdlIiwgIk9wdGlvbnMiLCAicGFyc2VhcmdzIiwKKworICAgICAgICB9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHNtdHBkLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CmluZGV4IGMxNTFhNTAuLmZhYWNkNjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CkBAIC0xMyw3ICsxMyw2IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBhcnJheQotaW1wb3J0IHBsYXRmb3JtCiBpbXBvcnQgY29udGV4dGxpYgogZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQogaW1wb3J0IHNpZ25hbApAQCAtMTE2MSw2ICsxMTYwLDE3IEBACiAgICAgICAgIHNvY2suY2xvc2UoKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzb2NrLnNlbmQsIGIic3BhbSIpCiAKKyAgICBkZWYgdGVzdENsb3NlRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNvY2tldC5zb2NrZXQoZmlsZW5vPXNvY2suZmlsZW5vKCkpLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKKyAgICAgICAgICAgICMgV2luc29jayBhcHBhcmVudGx5IHJhaXNlcyBFTk9UU09DSworICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlcnIuZXJybm8sIChlcnJuby5FQkFERiwgZXJybm8uRU5PVFNPQ0spKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJjbG9zZSgpIHNob3VsZCByYWlzZSBFQkFERi9FTk9UU09DSyIpCisKICAgICBkZWYgdGVzdE5ld0F0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICMgdGVzdGluZyAuZmFtaWx5LCAudHlwZSBhbmQgLnByb3RvY29sCiAKQEAgLTEyMDcsNiArMTIxNywyMiBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzLmlvY3RsLCAtMSwgTm9uZSkKICAgICAgICAgcy5pb2N0bChzb2NrZXQuU0lPX0tFRVBBTElWRV9WQUxTLCAoMSwgMTAwLCAxMDApKQogCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAibnQiLCAiV2luZG93cyBzcGVjaWZpYyIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzb2NrZXQsICdTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvb3BiYWNrIGZhc3QgcGF0aCBzdXBwb3J0IHJlcXVpcmVkIGZvciB0aGlzIHRlc3QnKQorICAgIGRlZiB0ZXN0X3Npb19sb29wYmFja19mYXN0X3BhdGgoc2VsZik6CisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMuaW9jdGwoc29ja2V0LlNJT19MT09QQkFDS19GQVNUX1BBVEgsIFRydWUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIFdTQUVPUE5PVFNVUFAgPSAxMDA0NQorICAgICAgICAgICAgaWYgZXhjLndpbmVycm9yID09IFdTQUVPUE5PVFNVUFA6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCBpcyBkZWZpbmVkIGJ1dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG9lc24ndCBpbXBsZW1lbnRlZCBpbiB0aGlzIFdpbmRvd3MgdmVyc2lvbiIpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHMuaW9jdGwsIHNvY2tldC5TSU9fTE9PUEJBQ0tfRkFTVF9QQVRILCBOb25lKQorCiAgICAgZGVmIHRlc3RHZXRhZGRyaW5mbyhzZWxmKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKCdsb2NhbGhvc3QnLCA4MCkKQEAgLTI4MjMsNiArMjg0OSw3IEBACiAgICAgICAgICAgICBuYnl0ZXMgPSBzZWxmLnNlbmRtc2dUb1NlcnZlcihbbXNnXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihtc2cpKQogCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gImRhcndpbiIsICJzZWUgaXNzdWUgIzI0NzI1IikKICAgICBkZWYgdGVzdEZEUGFzc0VtcHR5KHNlbGYpOgogICAgICAgICAjIFRyeSB0byBwYXNzIGFuIGVtcHR5IEZEIGFycmF5LiAgQ2FuIHJlY2VpdmUgZWl0aGVyIG5vIGFycmF5CiAgICAgICAgICMgb3IgYW4gZW1wdHkgYXJyYXkuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CmluZGV4IDBkMGY4NmYuLjNmNGRmYTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CkBAIC0zLDEyICszLDExIEBACiAiIiIKIAogaW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBpbwogaW1wb3J0IG9zCiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc2lnbmFsCiBpbXBvcnQgc29ja2V0Ci1pbXBvcnQgc2VsZWN0Ci1pbXBvcnQgZXJybm8KIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgc29ja2V0c2VydmVyCkBAIC00Niw3ICs0NSw3IEBACiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ0aW1lZCBvdXQgb24gJXIiICUgKHNvY2ssKSkKIAotaWYgSEFWRV9VTklYX1NPQ0tFVFM6CitpZiBIQVZFX1VOSVhfU09DS0VUUyBhbmQgSEFWRV9GT1JLSU5HOgogICAgIGNsYXNzIEZvcmtpbmdVbml4U3RyZWFtU2VydmVyKHNvY2tldHNlcnZlci5Gb3JraW5nTWl4SW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0c2VydmVyLlVuaXhTdHJlYW1TZXJ2ZXIpOgogICAgICAgICBwYXNzCkBAIC01OCw2ICs1Nyw3IEBACiAKIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiBkZWYgc2ltcGxlX3N1YnByb2Nlc3ModGVzdGNhc2UpOgorICAgICIiIlRlc3RzIHRoYXQgYSBjdXN0b20gY2hpbGQgcHJvY2VzcyBpcyBub3Qgd2FpdGVkIG9uIChJc3N1ZSAxNTQwMzg2KSIiIgogICAgIHBpZCA9IG9zLmZvcmsoKQogICAgIGlmIHBpZCA9PSAwOgogICAgICAgICAjIERvbid0IHJhaXNlIGFuIGV4Y2VwdGlvbjsgaXQgd291bGQgYmUgY2F1Z2h0IGJ5IHRoZSB0ZXN0IGhhcm5lc3MuCkBAIC0xMDMsNyArMTAzLDYgQEAKICAgICAgICAgY2xhc3MgTXlTZXJ2ZXIoc3ZyY2xzKToKICAgICAgICAgICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgogICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQotICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKICAgICAgICAgICAgICAgICByYWlzZQogCiAgICAgICAgIGNsYXNzIE15SGFuZGxlcihoZGxyYmFzZSk6CkBAIC0yNzksNiArMjc4LDE4MiBAQAogICAgICAgICAgICAgICAgIHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcikKIAorICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcihzZWxmKToKKyAgICAgICAgd2l0aCBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldHNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcikgYXMgc2VydmVyOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBzZXJ2ZXIuc29ja2V0LmZpbGVubygpKQorCisKK2NsYXNzIEVycm9ySGFuZGxlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCB0aGUgc2VydmVycyBwYXNzIG5vcm1hbCBleGNlcHRpb25zIGZyb20gdGhlIGhhbmRsZXIgdG8KKyAgICBoYW5kbGVfZXJyb3IoKSwgYW5kIHRoYXQgZXhpdGluZyBleGNlcHRpb25zIGxpa2UgU3lzdGVtRXhpdCBhbmQKKyAgICBLZXlib2FyZEludGVycnVwdCBhcmUgbm90IHBhc3NlZC4iIiIKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdGVzdC5zdXBwb3J0LnVubGluayh0ZXN0LnN1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3Rfc3luY19oYW5kbGVkKHNlbGYpOgorICAgICAgICBCYXNlRXJyb3JUZXN0U2VydmVyKFZhbHVlRXJyb3IpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N5bmNfbm90X2hhbmRsZWQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6CisgICAgICAgICAgICBCYXNlRXJyb3JUZXN0U2VydmVyKFN5c3RlbUV4aXQpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9RmFsc2UpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiB0ZXN0X3RocmVhZGluZ19oYW5kbGVkKHNlbGYpOgorICAgICAgICBUaHJlYWRpbmdFcnJvclRlc3RTZXJ2ZXIoVmFsdWVFcnJvcikKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1UcnVlKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF90aHJlYWRpbmdfbm90X2hhbmRsZWQoc2VsZik6CisgICAgICAgIFRocmVhZGluZ0Vycm9yVGVzdFNlcnZlcihTeXN0ZW1FeGl0KQorICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdChoYW5kbGVkPUZhbHNlKQorCisgICAgQHJlcXVpcmVzX2ZvcmtpbmcKKyAgICBkZWYgdGVzdF9mb3JraW5nX2hhbmRsZWQoc2VsZik6CisgICAgICAgIEZvcmtpbmdFcnJvclRlc3RTZXJ2ZXIoVmFsdWVFcnJvcikKKyAgICAgICAgc2VsZi5jaGVja19yZXN1bHQoaGFuZGxlZD1UcnVlKQorCisgICAgQHJlcXVpcmVzX2ZvcmtpbmcKKyAgICBkZWYgdGVzdF9mb3JraW5nX25vdF9oYW5kbGVkKHNlbGYpOgorICAgICAgICBGb3JraW5nRXJyb3JUZXN0U2VydmVyKFN5c3RlbUV4aXQpCisgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0KGhhbmRsZWQ9RmFsc2UpCisKKyAgICBkZWYgY2hlY2tfcmVzdWx0KHNlbGYsIGhhbmRsZWQpOgorICAgICAgICB3aXRoIG9wZW4odGVzdC5zdXBwb3J0LlRFU1RGTikgYXMgbG9nOgorICAgICAgICAgICAgZXhwZWN0ZWQgPSAnSGFuZGxlciBjYWxsZWRcbicgKyAnRXJyb3IgaGFuZGxlZFxuJyAqIGhhbmRsZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nLnJlYWQoKSwgZXhwZWN0ZWQpCisKKworY2xhc3MgQmFzZUVycm9yVGVzdFNlcnZlcihzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgc2VsZi5leGNlcHRpb24gPSBleGNlcHRpb24KKyAgICAgICAgc3VwZXIoKS5fX2luaXRfXygoSE9TVCwgMCksIEJhZEhhbmRsZXIpCisgICAgICAgIHdpdGggc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKHNlbGYuc2VydmVyX2FkZHJlc3MpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKKyAgICAgICAgc2VsZi53YWl0X2RvbmUoKQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgIHdpdGggb3Blbih0ZXN0LnN1cHBvcnQuVEVTVEZOLCAnYScpIGFzIGxvZzoKKyAgICAgICAgICAgIGxvZy53cml0ZSgnRXJyb3IgaGFuZGxlZFxuJykKKworICAgIGRlZiB3YWl0X2RvbmUoc2VsZik6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBCYWRIYW5kbGVyKHNvY2tldHNlcnZlci5CYXNlUmVxdWVzdEhhbmRsZXIpOgorICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgIHdpdGggb3Blbih0ZXN0LnN1cHBvcnQuVEVTVEZOLCAnYScpIGFzIGxvZzoKKyAgICAgICAgICAgIGxvZy53cml0ZSgnSGFuZGxlciBjYWxsZWRcbicpCisgICAgICAgIHJhaXNlIHNlbGYuc2VydmVyLmV4Y2VwdGlvbignVGVzdCBlcnJvcicpCisKKworY2xhc3MgVGhyZWFkaW5nRXJyb3JUZXN0U2VydmVyKHNvY2tldHNlcnZlci5UaHJlYWRpbmdNaXhJbiwKKyAgICAgICAgQmFzZUVycm9yVGVzdFNlcnZlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICpwb3MsICoqa3cpOgorICAgICAgICBzZWxmLmRvbmUgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzdXBlcigpLl9faW5pdF9fKCpwb3MsICoqa3cpCisKKyAgICBkZWYgc2h1dGRvd25fcmVxdWVzdChzZWxmLCAqcG9zLCAqKmt3KToKKyAgICAgICAgc3VwZXIoKS5zaHV0ZG93bl9yZXF1ZXN0KCpwb3MsICoqa3cpCisgICAgICAgIHNlbGYuZG9uZS5zZXQoKQorCisgICAgZGVmIHdhaXRfZG9uZShzZWxmKToKKyAgICAgICAgc2VsZi5kb25lLndhaXQoKQorCisKK2lmIEhBVkVfRk9SS0lORzoKKyAgICBjbGFzcyBGb3JraW5nRXJyb3JUZXN0U2VydmVyKHNvY2tldHNlcnZlci5Gb3JraW5nTWl4SW4sIEJhc2VFcnJvclRlc3RTZXJ2ZXIpOgorICAgICAgICBkZWYgd2FpdF9kb25lKHNlbGYpOgorICAgICAgICAgICAgW2NoaWxkXSA9IHNlbGYuYWN0aXZlX2NoaWxkcmVuCisgICAgICAgICAgICBvcy53YWl0cGlkKGNoaWxkLCAwKQorICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4uY2xlYXIoKQorCisKK2NsYXNzIFNvY2tldFdyaXRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgY2xhc3MgSGFuZGxlcihzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci53ZmlsZSA9IHNlbGYud2ZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci53ZmlsZV9maWxlbm8gPSBzZWxmLndmaWxlLmZpbGVubygpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVxdWVzdF9maWxlbm8gPSBzZWxmLnJlcXVlc3QuZmlsZW5vKCkKKworICAgICAgICBzZXJ2ZXIgPSBzb2NrZXRzZXJ2ZXIuVENQU2VydmVyKChIT1NULCAwKSwgSGFuZGxlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlcnZlci5zZXJ2ZXJfY2xvc2UpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KAorICAgICAgICAgICAgc2VydmVyLmFkZHJlc3NfZmFtaWx5LCBzb2NrZXQuU09DS19TVFJFQU0sIHNvY2tldC5JUFBST1RPX1RDUCkKKyAgICAgICAgd2l0aCBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlcnZlci5zZXJ2ZXJfYWRkcmVzcykKKyAgICAgICAgc2VydmVyLmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlcnZlci53ZmlsZSwgaW8uQnVmZmVyZWRJT0Jhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLndmaWxlX2ZpbGVubywgc2VydmVyLnJlcXVlc3RfZmlsZW5vKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgd2ZpbGUud3JpdGUoKSBzZW5kcyBkYXRhIGltbWVkaWF0ZWx5LCBhbmQgdGhhdCBpdCBkb2VzCisgICAgICAgICMgbm90IHRydW5jYXRlIHNlbmRzIHdoZW4gaW50ZXJydXB0ZWQgYnkgYSBVbml4IHNpZ25hbAorICAgICAgICBwdGhyZWFkX2tpbGwgPSB0ZXN0LnN1cHBvcnQuZ2V0X2F0dHJpYnV0ZShzaWduYWwsICdwdGhyZWFkX2tpbGwnKQorCisgICAgICAgIGNsYXNzIEhhbmRsZXIoc29ja2V0c2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2VudDEgPSBzZWxmLndmaWxlLndyaXRlKGInd3JpdGUgZGF0YVxuJykKKyAgICAgICAgICAgICAgICAjIFNob3VsZCBiZSBzZW50IGltbWVkaWF0ZWx5LCB3aXRob3V0IHJlcXVpcmluZyBmbHVzaCgpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVjZWl2ZWQgPSBzZWxmLnJmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBiaWdfY2h1bmsgPSBieXRlcyh0ZXN0LnN1cHBvcnQuU09DS19NQVhfU0laRSkKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5zZW50MiA9IHNlbGYud2ZpbGUud3JpdGUoYmlnX2NodW5rKQorCisgICAgICAgIHNlcnZlciA9IHNvY2tldHNlcnZlci5UQ1BTZXJ2ZXIoKEhPU1QsIDApLCBIYW5kbGVyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VydmVyLnNlcnZlcl9jbG9zZSkKKyAgICAgICAgaW50ZXJydXB0ZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQorCisgICAgICAgIGRlZiBzaWduYWxfaGFuZGxlcihzaWdudW0sIGZyYW1lKToKKyAgICAgICAgICAgIGludGVycnVwdGVkLnNldCgpCisKKyAgICAgICAgb3JpZ2luYWwgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBzaWduYWxfaGFuZGxlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNpZ25hbC5zaWduYWwsIHNpZ25hbC5TSUdVU1IxLCBvcmlnaW5hbCkKKyAgICAgICAgcmVzcG9uc2UxID0gTm9uZQorICAgICAgICByZWNlaXZlZDIgPSBOb25lCisgICAgICAgIG1haW5fdGhyZWFkID0gdGhyZWFkaW5nLmdldF9pZGVudCgpCisKKyAgICAgICAgZGVmIHJ1bl9jbGllbnQoKToKKyAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNlcnZlci5hZGRyZXNzX2ZhbWlseSwgc29ja2V0LlNPQ0tfU1RSRUFNLAorICAgICAgICAgICAgICAgIHNvY2tldC5JUFBST1RPX1RDUCkKKyAgICAgICAgICAgIHdpdGggcywgcy5tYWtlZmlsZSgncmInKSBhcyByZWFkZXI6CisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHNlcnZlci5zZXJ2ZXJfYWRkcmVzcykKKyAgICAgICAgICAgICAgICBub25sb2NhbCByZXNwb25zZTEKKyAgICAgICAgICAgICAgICByZXNwb25zZTEgPSByZWFkZXIucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIHMuc2VuZGFsbChiJ2NsaWVudCByZXNwb25zZVxuJykKKworICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkKDEwMCkKKyAgICAgICAgICAgICAgICAjIFRoZSBtYWluIHRocmVhZCBzaG91bGQgbm93IGJlIGJsb2NraW5nIGluIGEgc2VuZCgpIHN5c2NhbGwuCisgICAgICAgICAgICAgICAgIyBCdXQgaW4gdGhlb3J5LCBpdCBjb3VsZCBnZXQgaW50ZXJydXB0ZWQgYnkgb3RoZXIgc2lnbmFscywKKyAgICAgICAgICAgICAgICAjIGFuZCB0aGVuIHJldHJpZWQuIFNvIGtlZXAgc2VuZGluZyB0aGUgc2lnbmFsIGluIGEgbG9vcCwgaW4KKyAgICAgICAgICAgICAgICAjIGNhc2UgYW4gZWFybGllciBzaWduYWwgaGFwcGVucyB0byBiZSBkZWxpdmVyZWQgYXQgYW4KKyAgICAgICAgICAgICAgICAjIGluY29udmVuaWVudCBtb21lbnQuCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9raWxsKG1haW5fdGhyZWFkLCBzaWduYWwuU0lHVVNSMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaW50ZXJydXB0ZWQud2FpdCh0aW1lb3V0PWZsb2F0KDEpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbm9ubG9jYWwgcmVjZWl2ZWQyCisgICAgICAgICAgICAgICAgcmVjZWl2ZWQyID0gbGVuKHJlYWRlci5yZWFkKCkpCisKKyAgICAgICAgYmFja2dyb3VuZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1bl9jbGllbnQpCisgICAgICAgIGJhY2tncm91bmQuc3RhcnQoKQorICAgICAgICBzZXJ2ZXIuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICBiYWNrZ3JvdW5kLmpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5zZW50MSwgbGVuKHJlc3BvbnNlMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2UxLCBiJ3dyaXRlIGRhdGFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnJlY2VpdmVkLCBiJ2NsaWVudCByZXNwb25zZVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIuc2VudDIsIHRlc3Quc3VwcG9ydC5TT0NLX01BWF9TSVpFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY2VpdmVkMiwgdGVzdC5zdXBwb3J0LlNPQ0tfTUFYX1NJWkUgLSAxMDApCisKIAogY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb3J0LnB5CmluZGV4IGE1ZDBlYmYuLjk4Y2NhYjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvcnQucHkKQEAgLTEsNiArMSw1IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGltcG9ydCByYW5kb20KLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogZnJvbSBmdW5jdG9vbHMgaW1wb3J0IGNtcF90b19rZXkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zcHdkLnB5IGIvTGliL3Rlc3QvdGVzdF9zcHdkLnB5CmluZGV4IGJlYTdhYjEuLmU4OTNmM2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3B3ZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Nwd2QucHkKQEAgLTU2LDUgKzU2LDIwIEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNwd2QuZ2V0c3BuYW0sIGJ5dGVzX25hbWUpCiAKIAorQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldGV1aWQnKSBhbmQgb3MuZ2V0ZXVpZCgpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAnbm9uLXJvb3QgdXNlciByZXF1aXJlZCcpCitjbGFzcyBUZXN0U3B3ZE5vblJvb3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZ2V0c3BuYW1fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBuYW1lID0gJ2JpbicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhQZXJtaXNzaW9uRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgICAgIHNwd2QuZ2V0c3BuYW0obmFtZSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInNwd2QgZW50cnkgJXIgZG9lc24ndCBleGlzdDogJXMiICUgKG5hbWUsIGV4YykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAnW0Vycm5vIDEzXSBQZXJtaXNzaW9uIGRlbmllZCcpCisKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3NsLnB5IGIvTGliL3Rlc3QvdGVzdF9zc2wucHkKaW5kZXggZjQ4MTAzZS4uNmNkNTQ1NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zc2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zc2wucHkKQEAgLTIxLDYgKzIxLDEzIEBACiAKIHNzbCA9IHN1cHBvcnQuaW1wb3J0X21vZHVsZSgic3NsIikKIAordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfaGF2ZV90aHJlYWRzID0gRmFsc2UKK2Vsc2U6CisgICAgX2hhdmVfdGhyZWFkcyA9IFRydWUKKwogUFJPVE9DT0xTID0gc29ydGVkKHNzbC5fUFJPVE9DT0xfTkFNRVMpCiBIT1NUID0gc3VwcG9ydC5IT1NUCiAKQEAgLTUzLDEwICs2MCwxMCBAQAogIyBUd28ga2V5cyBhbmQgY2VydHMgc2lnbmVkIGJ5IHRoZSBzYW1lIENBIChmb3IgU05JIHRlc3RzKQogU0lHTkVEX0NFUlRGSUxFID0gZGF0YV9maWxlKCJrZXljZXJ0My5wZW0iKQogU0lHTkVEX0NFUlRGSUxFMiA9IGRhdGFfZmlsZSgia2V5Y2VydDQucGVtIikKLVNJR05JTkdfQ0EgPSBkYXRhX2ZpbGUoInB5Y2FjZXJ0LnBlbSIpCisjIFNhbWUgY2VydGlmaWNhdGUgYXMgcHljYWNlcnQucGVtLCBidXQgd2l0aG91dCBleHRyYSB0ZXh0IGluIGZpbGUKK1NJR05JTkdfQ0EgPSBkYXRhX2ZpbGUoImNhcGF0aCIsICJjZWZmMTcxMC4wIikKIAogUkVNT1RFX0hPU1QgPSAic2VsZi1zaWduZWQucHl0aG9udGVzdC5uZXQiCi1SRU1PVEVfUk9PVF9DRVJUID0gZGF0YV9maWxlKCJzZWxmc2lnbmVkX3B5dGhvbnRlc3Rkb3RuZXQucGVtIikKIAogRU1QVFlDRVJUID0gZGF0YV9maWxlKCJudWxsY2VydC5wZW0iKQogQkFEQ0VSVCA9IGRhdGFfZmlsZSgiYmFkY2VydC5wZW0iKQpAQCAtMzI4LDcgKzMzNSw3IEBACiAgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoc3MpCiAgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoIiIsIFJlc291cmNlV2FybmluZykpOgogICAgICAgICAgICAgZGVsIHNzCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3IoKSwgTm9uZSkKIAogICAgIGRlZiB0ZXN0X3dyYXBwZWRfdW5jb25uZWN0ZWQoc2VsZik6CiAgICAgICAgICMgTWV0aG9kcyBvbiBhbiB1bmNvbm5lY3RlZCBTU0xTb2NrZXQgcHJvcGFnYXRlIHRoZSBvcmlnaW5hbApAQCAtNzgzLDYgKzc5MCwyMiBAQAogICAgICAgICBzZWxmLmNlcnRfdGltZV9vaygiRmViICA5IDAwOjAwOjAwIDIwMDcgR01UIiwgMTE3MDk3OTIwMC4wKQogICAgICAgICBzZWxmLmNlcnRfdGltZV9mYWlsKGxvY2FsX2ZlYnJ1YXJ5X25hbWUoKSArICIgIDkgMDA6MDA6MDAgMjAwNyBHTVQiKQogCisgICAgZGVmIHRlc3RfY29ubmVjdF9leF9lcnJvcihzZWxmKToKKyAgICAgICAgc2VydmVyID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlcnZlci5jbG9zZSkKKyAgICAgICAgcG9ydCA9IHN1cHBvcnQuYmluZF9wb3J0KHNlcnZlcikgICMgUmVzZXJ2ZSBwb3J0IGJ1dCBkb24ndCBsaXN0ZW4KKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoSE9TVCwgcG9ydCkpCisgICAgICAgICMgSXNzdWUgIzE5OTE5OiBXaW5kb3dzIG1hY2hpbmVzIG9yIFZNcyBob3N0ZWQgb24gV2luZG93cworICAgICAgICAjIG1hY2hpbmVzIHNvbWV0aW1lcyByZXR1cm4gRVdPVUxEQkxPQ0suCisgICAgICAgIGVycm9ycyA9ICgKKyAgICAgICAgICAgIGVycm5vLkVDT05OUkVGVVNFRCwgZXJybm8uRUhPU1RVTlJFQUNILCBlcnJuby5FVElNRURPVVQsCisgICAgICAgICAgICBlcnJuby5FV09VTERCTE9DSywKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEluKHJjLCBlcnJvcnMpCisKIAogY2xhc3MgQ29udGV4dFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMTM2OSwxNDAgKzEzOTIsMTAzIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmlvLndyaXRlLCAxKQogCiAKLWNsYXNzIE5ldHdvcmtlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKK0B1bml0dGVzdC5za2lwVW5sZXNzKF9oYXZlX3RocmVhZHMsICJOZWVkcyB0aHJlYWRpbmcgbW9kdWxlIikKK2NsYXNzIFNpbXBsZUJhY2tncm91bmRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUZXN0cyB0aGF0IGNvbm5lY3QgdG8gYSBzaW1wbGUgc2VydmVyIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VydmVyID0gVGhyZWFkZWRFY2hvU2VydmVyKFNJR05FRF9DRVJURklMRSkKKyAgICAgICAgc2VsZi5zZXJ2ZXJfYWRkciA9IChIT1NULCBzZXJ2ZXIucG9ydCkKKyAgICAgICAgc2VydmVyLl9fZW50ZXJfXygpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXJ2ZXIuX19leGl0X18sIE5vbmUsIE5vbmUsIE5vbmUpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0KHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgcy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpIGFzIHM6CisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHMuZ2V0cGVlcmNlcnQoKSkKIAotICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoc3NsLlNTTEVycm9yLCAiY2VydGlmaWNhdGUgdmVyaWZ5IGZhaWxlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ubmVjdCwgKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICMgdGhpcyBzaG91bGQgc3VjY2VlZCBiZWNhdXNlIHdlIHNwZWNpZnkgdGhlIHJvb3QgY2VydAorICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U0lHTklOR19DQSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKIAotICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBzdWNjZWVkIGJlY2F1c2Ugd2Ugc3BlY2lmeSB0aGUgcm9vdCBjZXJ0Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICBkZWYgdGVzdF9jb25uZWN0X2ZhaWwoc2VsZik6CisgICAgICAgICMgVGhpcyBzaG91bGQgZmFpbCBiZWNhdXNlIHdlIGhhdmUgbm8gdmVyaWZpY2F0aW9uIGNlcnRzLiBDb25uZWN0aW9uCisgICAgICAgICMgZmFpbHVyZSBjcmFzaGVzIFRocmVhZGVkRWNob1NlcnZlciwgc28gcnVuIHRoaXMgaW4gYW4gaW5kZXBlbmRlbnQKKyAgICAgICAgIyB0ZXN0IG1ldGhvZC4KKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ubmVjdCwgc2VsZi5zZXJ2ZXJfYWRkcikKIAogICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZXgoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzExMzI2OiBjaGVjayBjb25uZWN0X2V4KCkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzLmNvbm5lY3RfZXgoKFJFTU9URV9IT1NULCA0NDMpKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U0lHTklOR19DQSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcy5jb25uZWN0X2V4KHNlbGYuc2VydmVyX2FkZHIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQogCiAgICAgZGVmIHRlc3Rfbm9uX2Jsb2NraW5nX2Nvbm5lY3RfZXgoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzExMzI2OiBub24tYmxvY2tpbmcgY29ubmVjdF9leCgpIHNob3VsZCBhbGxvdyBoYW5kc2hha2UKICAgICAgICAgIyB0byBwcm9jZWVkIGFmdGVyIHRoZSBzb2NrZXQgZ2V0cyByZWFkeS4KLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVJFTU9URV9ST09UX0NFUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1TSUdOSU5HX0NBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgIyBFV09VTERCTE9DSyB1bmRlciBXaW5kb3dzLCBFSU5QUk9HUkVTUyBlbHNld2hlcmUKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgKDAsIGVycm5vLkVJTlBST0dSRVNTLCBlcnJuby5FV09VTERCTE9DSykpCisgICAgICAgICMgV2FpdCBmb3IgY29ubmVjdCB0byBmaW5pc2gKKyAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSwgNS4wKQorICAgICAgICAjIE5vbi1ibG9ja2luZyBoYW5kc2hha2UKKyAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLnNldGJsb2NraW5nKEZhbHNlKQotICAgICAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICAjIEVXT1VMREJMT0NLIHVuZGVyIFdpbmRvd3MsIEVJTlBST0dSRVNTIGVsc2V3aGVyZQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsICgwLCBlcnJuby5FSU5QUk9HUkVTUywgZXJybm8uRVdPVUxEQkxPQ0spKQotICAgICAgICAgICAgICAgICMgV2FpdCBmb3IgY29ubmVjdCB0byBmaW5pc2gKKyAgICAgICAgICAgICAgICBzLmRvX2hhbmRzaGFrZSgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFJlYWRFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtzXSwgW10sIFtdLCA1LjApCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRXcml0ZUVycm9yOgogICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10sIDUuMCkKLSAgICAgICAgICAgICAgICAjIE5vbi1ibG9ja2luZyBoYW5kc2hha2UKLSAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLmRvX2hhbmRzaGFrZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRSZWFkRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtzXSwgW10sIFtdLCA1LjApCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFdyaXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdLCA1LjApCi0gICAgICAgICAgICAgICAgIyBTU0wgZXN0YWJsaXNoZWQKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKLQotICAgIGRlZiB0ZXN0X3RpbWVvdXRfY29ubmVjdF9leChzZWxmKToKLSAgICAgICAgIyBJc3N1ZSAjMTIwNjU6IG9uIGEgdGltZW91dCwgY29ubmVjdF9leCgpIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsCi0gICAgICAgICMgZXJybm8gKG1pbWlja2luZyB0aGUgYmVoYXZpb3VyIG9mIG5vbi1TU0wgc29ja2V0cykuCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1SRU1PVEVfUk9PVF9DRVJULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzLnNldHRpbWVvdXQoMC4wMDAwMDAxKQotICAgICAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgICAgICBpZiByYyA9PSAwOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJSRU1PVEVfSE9TVCByZXNwb25kZWQgdG9vIHF1aWNrbHkiKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsIChlcnJuby5FQUdBSU4sIGVycm5vLkVXT1VMREJMT0NLKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCi0KLSAgICBkZWYgdGVzdF9jb25uZWN0X2V4X2Vycm9yKHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9UkVNT1RFX1JPT1RfQ0VSVCkKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoUkVNT1RFX0hPU1QsIDQ0NCkpCi0gICAgICAgICAgICAgICAgIyBJc3N1ZSAjMTk5MTk6IFdpbmRvd3MgbWFjaGluZXMgb3IgVk1zIGhvc3RlZCBvbiBXaW5kb3dzCi0gICAgICAgICAgICAgICAgIyBtYWNoaW5lcyBzb21ldGltZXMgcmV0dXJuIEVXT1VMREJMT0NLLgotICAgICAgICAgICAgICAgIGVycm9ycyA9ICgKLSAgICAgICAgICAgICAgICAgICAgZXJybm8uRUNPTk5SRUZVU0VELCBlcnJuby5FSE9TVFVOUkVBQ0gsIGVycm5vLkVUSU1FRE9VVCwKLSAgICAgICAgICAgICAgICAgICAgZXJybm8uRVdPVUxEQkxPQ0ssCi0gICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsIGVycm9ycykKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICMgU1NMIGVzdGFibGlzaGVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmdldHBlZXJjZXJ0KCkpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X3dpdGhfY29udGV4dChzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICAjIFNhbWUgYXMgdGVzdF9jb25uZWN0LCBidXQgd2l0aCBhIHNlcGFyYXRlbHkgY3JlYXRlZCBjb250ZXh0Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgcy5nZXRwZWVyY2VydCgpKQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgICMgU2FtZSB3aXRoIGEgc2VydmVyIGhvc3RuYW1lCi0gICAgICAgICAgICBzID0gY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9UkVNT1RFX0hPU1QpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5jbG9zZSgpCi0gICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBoYXZlIG5vIHZlcmlmaWNhdGlvbiBjZXJ0cwotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0LCAoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgICMgVGhpcyBzaG91bGQgc3VjY2VlZCBiZWNhdXNlIHdlIHNwZWNpZnkgdGhlIHJvb3QgY2VydAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhSRU1PVEVfUk9PVF9DRVJUKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgIyBTYW1lIGFzIHRlc3RfY29ubmVjdCwgYnV0IHdpdGggYSBzZXBhcmF0ZWx5IGNyZWF0ZWQgY29udGV4dAorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fSwgcy5nZXRwZWVyY2VydCgpKQorICAgICAgICAjIFNhbWUgd2l0aCBhIHNlcnZlciBob3N0bmFtZQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfaG9zdG5hbWU9ImR1bW15IikgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICAjIFRoaXMgc2hvdWxkIHN1Y2NlZWQgYmVjYXVzZSB3ZSBzcGVjaWZ5IHRoZSByb290IGNlcnQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhTSUdOSU5HX0NBKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCisKKyAgICBkZWYgdGVzdF9jb25uZWN0X3dpdGhfY29udGV4dF9mYWlsKHNlbGYpOgorICAgICAgICAjIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBoYXZlIG5vIHZlcmlmaWNhdGlvbiBjZXJ0cy4gQ29ubmVjdGlvbgorICAgICAgICAjIGZhaWx1cmUgY3Jhc2hlcyBUaHJlYWRlZEVjaG9TZXJ2ZXIsIHNvIHJ1biB0aGlzIGluIGFuIGluZGVwZW5kZW50CisgICAgICAgICMgdGVzdCBtZXRob2QuCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KHNzbC5TU0xFcnJvciwgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QsIHNlbGYuc2VydmVyX2FkZHIpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X2NhcGF0aChzZWxmKToKICAgICAgICAgIyBWZXJpZnkgc2VydmVyIGNlcnRpZmljYXRlcyB1c2luZyB0aGUgYGNhcGF0aGAgYXJndW1lbnQKQEAgLTE1MTAsMTk4ICsxNDk2LDEzMCBAQAogICAgICAgICAjIE9wZW5TU0wgMC45LjhuIGFuZCAxLjAuMCwgYXMgYSByZXN1bHQgdGhlIGNhcGF0aCBkaXJlY3RvcnkgbXVzdAogICAgICAgICAjIGNvbnRhaW4gYm90aCB2ZXJzaW9ucyBvZiBlYWNoIGNlcnRpZmljYXRlIChzYW1lIGNvbnRlbnQsIGRpZmZlcmVudAogICAgICAgICAjIGZpbGVuYW1lKSBmb3IgdGhpcyB0ZXN0IHRvIGJlIHBvcnRhYmxlIGFjcm9zcyBPcGVuU1NMIHJlbGVhc2VzLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9Q0FQQVRIKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgICMgU2FtZSB3aXRoIGEgYnl0ZXMgYGNhcGF0aGAgYXJndW1lbnQKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9QllURVNfQ0FQQVRIKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9Q0FQQVRIKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCisgICAgICAgICMgU2FtZSB3aXRoIGEgYnl0ZXMgYGNhcGF0aGAgYXJndW1lbnQKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9QllURVNfQ0FQQVRIKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCiAKICAgICBkZWYgdGVzdF9jb25uZWN0X2NhZGF0YShzZWxmKToKLSAgICAgICAgd2l0aCBvcGVuKFJFTU9URV9ST09UX0NFUlQpIGFzIGY6CisgICAgICAgIHdpdGggb3BlbihTSUdOSU5HX0NBKSBhcyBmOgogICAgICAgICAgICAgcGVtID0gZi5yZWFkKCkKICAgICAgICAgZGVyID0gc3NsLlBFTV9jZXJ0X3RvX0RFUl9jZXJ0KHBlbSkKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FkYXRhPXBlbSkKLSAgICAgICAgICAgIHdpdGggY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZGF0YT1wZW0pCisgICAgICAgIHdpdGggY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKSBhcyBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICAgICBjZXJ0ID0gcy5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCkKIAotICAgICAgICAgICAgIyBzYW1lIHdpdGggREVSCi0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQotICAgICAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKLSAgICAgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FkYXRhPWRlcikKLSAgICAgICAgICAgIHdpdGggY3R4LndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQorICAgICAgICAjIHNhbWUgd2l0aCBERVIKKyAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKKyAgICAgICAgY3R4LnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfUkVRVUlSRUQKKyAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYWRhdGE9ZGVyKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCiAKICAgICBAdW5pdHRlc3Quc2tpcElmKG9zLm5hbWUgPT0gIm50IiwgIkNhbid0IHVzZSBhIHNvY2tldCBhcyBhIGZpbGUgdW5kZXIgV2luZG93cyIpCiAgICAgZGVmIHRlc3RfbWFrZWZpbGVfY2xvc2Uoc2VsZik6CiAgICAgICAgICMgSXNzdWUgIzUyMzg6IGNyZWF0aW5nIGEgZmlsZS1saWtlIG9iamVjdCB3aXRoIG1ha2VmaWxlKCkgc2hvdWxkbid0CiAgICAgICAgICMgZGVsYXkgY2xvc2luZyB0aGUgdW5kZXJseWluZyAicmVhbCBzb2NrZXQiIChoZXJlIHRlc3RlZCB3aXRoIGl0cwogICAgICAgICAjIGZpbGUgZGVzY3JpcHRvciwgaGVuY2Ugc2tpcHBpbmcgdGhlIHRlc3QgdW5kZXIgV2luZG93cykuCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgc3MgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCi0gICAgICAgICAgICBzcy5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIGZkID0gc3MuZmlsZW5vKCkKLSAgICAgICAgICAgIGYgPSBzcy5tYWtlZmlsZSgpCi0gICAgICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgICAgICMgVGhlIGZkIGlzIHN0aWxsIG9wZW4KKyAgICAgICAgc3MgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCisgICAgICAgIHNzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKKyAgICAgICAgZmQgPSBzcy5maWxlbm8oKQorICAgICAgICBmID0gc3MubWFrZWZpbGUoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgIyBUaGUgZmQgaXMgc3RpbGwgb3BlbgorICAgICAgICBvcy5yZWFkKGZkLCAwKQorICAgICAgICAjIENsb3NpbmcgdGhlIFNTTCBzb2NrZXQgc2hvdWxkIGNsb3NlIHRoZSBmZCB0b28KKyAgICAgICAgc3MuY2xvc2UoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBlOgogICAgICAgICAgICAgb3MucmVhZChmZCwgMCkKLSAgICAgICAgICAgICMgQ2xvc2luZyB0aGUgU1NMIHNvY2tldCBzaG91bGQgY2xvc2UgdGhlIGZkIHRvbwotICAgICAgICAgICAgc3MuY2xvc2UoKQotICAgICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGU6Ci0gICAgICAgICAgICAgICAgb3MucmVhZChmZCwgMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVCQURGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FQkFERikKIAogICAgIGRlZiB0ZXN0X25vbl9ibG9ja2luZ19oYW5kc2hha2Uoc2VsZik6Ci0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoUkVNT1RFX0hPU1QpOgotICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCi0gICAgICAgICAgICBzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKLSAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQotICAgICAgICAgICAgY291bnQgPSAwCi0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMQotICAgICAgICAgICAgICAgICAgICBzLmRvX2hhbmRzaGFrZSgpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xXYW50UmVhZEVycm9yOgotICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtzXSwgW10sIFtdKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFdyaXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10pCi0gICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbk5lZWRlZCAlZCBjYWxscyB0byBkb19oYW5kc2hha2UoKSB0byBlc3RhYmxpc2ggc2Vzc2lvbi5cbiIgJSBjb3VudCkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBzLnNldGJsb2NraW5nKEZhbHNlKQorICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTFdhbnRSZWFkRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMV2FudFdyaXRlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSkKKyAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5OZWVkZWQgJWQgY2FsbHMgdG8gZG9faGFuZHNoYWtlKCkgdG8gZXN0YWJsaXNoIHNlc3Npb24uXG4iICUgY291bnQpCiAKICAgICBkZWYgdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlKHNlbGYpOgotICAgICAgICBkZWYgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShob3N0LCBwb3J0LCBjZXJ0PU5vbmUpOgotICAgICAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChob3N0KToKLSAgICAgICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCkpCi0gICAgICAgICAgICAgICAgaWYgbm90IHBlbToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBzZXJ2ZXIgY2VydGlmaWNhdGUgb24gJXM6JXMhIiAlIChob3N0LCBwb3J0KSkKKyAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmLCAqc2VsZi5zZXJ2ZXJfYWRkciwgY2VydD1TSUdOSU5HX0NBKQogCi0gICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBwZW0gPSBzc2wuZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgoaG9zdCwgcG9ydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPUNFUlRGSUxFKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IgYXMgeDoKLSAgICAgICAgICAgICAgICAgICAgI3Nob3VsZCBmYWlsCi0gICAgICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiVzXG4iICUgeCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkdvdCBzZXJ2ZXIgY2VydGlmaWNhdGUgJXMgZm9yICVzOiVzISIgJSAocGVtLCBob3N0LCBwb3J0KSkKLQotICAgICAgICAgICAgICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1jZXJ0KQotICAgICAgICAgICAgICAgIGlmIG5vdCBwZW06Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uICVzOiVzISIgJSAoaG9zdCwgcG9ydCkpCi0gICAgICAgICAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgotICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcblZlcmlmaWVkIGNlcnRpZmljYXRlIGZvciAlczolcyBpc1xuJXNcbiIgJSAoaG9zdCwgcG9ydCAscGVtKSkKLQotICAgICAgICBfdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlKFJFTU9URV9IT1NULCA0NDMsIFJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgIGlmIHN1cHBvcnQuSVBWNl9FTkFCTEVEOgotICAgICAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSgnaXB2Ni5nb29nbGUuY29tJywgNDQzKQorICAgIGRlZiB0ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbChzZWxmKToKKyAgICAgICAgIyBDb25uZWN0aW9uIGZhaWx1cmUgY3Jhc2hlcyBUaHJlYWRlZEVjaG9TZXJ2ZXIsIHNvIHJ1biB0aGlzIGluIGFuCisgICAgICAgICMgaW5kZXBlbmRlbnQgdGVzdCBtZXRob2QKKyAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZV9mYWlsKHNlbGYsICpzZWxmLnNlcnZlcl9hZGRyKQogCiAgICAgZGVmIHRlc3RfY2lwaGVycyhzZWxmKToKLSAgICAgICAgcmVtb3RlID0gKFJFTU9URV9IT1NULCA0NDMpCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQocmVtb3RlWzBdKToKLSAgICAgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkFMTCIpIGFzIHM6Ci0gICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKLSAgICAgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkRFRkFVTFQiKSBhcyBzOgotICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCi0gICAgICAgICAgICAjIEVycm9yIGNoZWNraW5nIGNhbiBoYXBwZW4gYXQgaW5zdGFudGlhdGlvbiBvciB3aGVuIGNvbm5lY3RpbmcKLSAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChzc2wuU1NMRXJyb3IsICJObyBjaXBoZXIgY2FuIGJlIHNlbGVjdGVkIik6Ci0gICAgICAgICAgICAgICAgd2l0aCBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSBhcyBzb2NrOgotICAgICAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9Il4kOiw7PyonZG9yb3RoeXgiKQotICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQotCi0gICAgZGVmIHRlc3RfYWxnb3JpdGhtcyhzZWxmKToKLSAgICAgICAgIyBJc3N1ZSAjODQ4NDogYWxsIGFsZ29yaXRobXMgc2hvdWxkIGJlIGF2YWlsYWJsZSB3aGVuIHZlcmlmeWluZyBhCi0gICAgICAgICMgY2VydGlmaWNhdGUuCi0gICAgICAgICMgU0hBMjU2IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS44Ci0gICAgICAgIGlmIHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA8ICgwLCA5LCA4LCAwLCAxNSk6Ci0gICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTSEEyNTYgbm90IGF2YWlsYWJsZSBvbiAlciIgJSBzc2wuT1BFTlNTTF9WRVJTSU9OKQotICAgICAgICAjIHNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIG5lZWRzIFNOSSB0byB1c2UgdGhlIGNvcnJlY3QgY2VydGlmaWNhdGUKLSAgICAgICAgaWYgbm90IHNzbC5IQVNfU05JOgotICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU05JIG5lZWRlZCBmb3IgdGhpcyB0ZXN0IikKLSAgICAgICAgIyBodHRwczovL3NoYTIuaGJvZWNrLmRlLyB3YXMgdXNlZCB1bnRpbCAyMDExLTAxLTA4IChubyByb3V0ZSB0byBob3N0KQotICAgICAgICByZW1vdGUgPSAoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIiwgNDQzKQotICAgICAgICBzaGEyNTZfY2VydCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAic2hhMjU2LnBlbSIpCi0gICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIik6Ci0gICAgICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzaGEyNTZfY2VydCkKLSAgICAgICAgICAgIHMgPSBjdHgud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT0ic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCi0gICAgICAgICAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgotICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbkNpcGhlciB3aXRoICVyIGlzICVyXG4iICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVtb3RlLCBzLmNpcGhlcigpKSkKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiQ2VydGlmaWNhdGUgaXM6XG4lc1xuIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LnBmb3JtYXQocy5nZXRwZWVyY2VydCgpKSkKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHdpdGggc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2lwaGVycz0iQUxMIikgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICB3aXRoIHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9IkRFRkFVTFQiKSBhcyBzOgorICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgICMgRXJyb3IgY2hlY2tpbmcgY2FuIGhhcHBlbiBhdCBpbnN0YW50aWF0aW9uIG9yIHdoZW4gY29ubmVjdGluZworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoc3NsLlNTTEVycm9yLCAiTm8gY2lwaGVyIGNhbiBiZSBzZWxlY3RlZCIpOgorICAgICAgICAgICAgd2l0aCBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSBhcyBzb2NrOgorICAgICAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJeJDosOz8qJ2Rvcm90aHl4IikKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5zZXJ2ZXJfYWRkcikKIAogICAgIGRlZiB0ZXN0X2dldF9jYV9jZXJ0c19jYXBhdGgoc2VsZik6CiAgICAgICAgICMgY2FwYXRoIGNlcnRzIGFyZSBsb2FkZWQgb24gcmVxdWVzdAotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAotICAgICAgICAgICAgY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYXBhdGg9Q0FQQVRIKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdHguZ2V0X2NhX2NlcnRzKCksIFtdKQotICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKLSAgICAgICAgICAgIHMuY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0KQotICAgICAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgICAgICBzLmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGN0eC5nZXRfY2FfY2VydHMoKSksIDEpCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgIGN0eC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FwYXRoPUNBUEFUSCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdHguZ2V0X2NhX2NlcnRzKCksIFtdKQorICAgICAgICB3aXRoIGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkgYXMgczoKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNlcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGN0eC5nZXRfY2FfY2VydHMoKSksIDEpCiAKICAgICBAbmVlZHNfc25pCiAgICAgZGVmIHRlc3RfY29udGV4dF9zZXRnZXQoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgY29udGV4dCBvZiBhIGNvbm5lY3RlZCBzb2NrZXQgY2FuIGJlIHJlcGxhY2VkLgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIGN0eDEgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCi0gICAgICAgICAgICBjdHgyID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQotICAgICAgICAgICAgd2l0aCBjdHgxLndyYXBfc29ja2V0KHMpIGFzIHNzOgotICAgICAgICAgICAgICAgIHNzLmNvbm5lY3QoKFJFTU9URV9IT1NULCA0NDMpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLl9zc2xvYmouY29udGV4dCwgY3R4MSkKLSAgICAgICAgICAgICAgICBzcy5jb250ZXh0ID0gY3R4MgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3MuY29udGV4dCwgY3R4MikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzLl9zc2xvYmouY29udGV4dCwgY3R4MikKLQotCi1jbGFzcyBOZXR3b3JrZWRCSU9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIGN0eDEgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfVExTdjEpCisgICAgICAgIGN0eDIgPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgd2l0aCBjdHgxLndyYXBfc29ja2V0KHMpIGFzIHNzOgorICAgICAgICAgICAgc3MuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5jb250ZXh0LCBjdHgxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDEpCisgICAgICAgICAgICBzcy5jb250ZXh0ID0gY3R4MgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5jb250ZXh0LCBjdHgyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzcy5fc3Nsb2JqLmNvbnRleHQsIGN0eDIpCiAKICAgICBkZWYgc3NsX2lvX2xvb3Aoc2VsZiwgc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBmdW5jLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAjIEEgc2ltcGxlIElPIGxvb3AuIENhbGwgZnVuYygqYXJncykgZGVwZW5kaW5nIG9uIHRoZSBlcnJvciB3ZSBnZXQKQEAgLTE3MzcsNjQgKzE2NTUsMTI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGNvdW50LCBmdW5jLl9fbmFtZV9fKSkKICAgICAgICAgcmV0dXJuIHJldAogCi0gICAgZGVmIHRlc3RfaGFuZHNoYWtlKHNlbGYpOgotICAgICAgICB3aXRoIHN1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KFJFTU9URV9IT1NUKToKLSAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQotICAgICAgICAgICAgc29jay5jb25uZWN0KChSRU1PVEVfSE9TVCwgNDQzKSkKLSAgICAgICAgICAgIGluY29taW5nID0gc3NsLk1lbW9yeUJJTygpCi0gICAgICAgICAgICBvdXRnb2luZyA9IHNzbC5NZW1vcnlCSU8oKQotICAgICAgICAgICAgY3R4ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKLSAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECi0gICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKFJFTU9URV9ST09UX0NFUlQpCi0gICAgICAgICAgICBjdHguY2hlY2tfaG9zdG5hbWUgPSBUcnVlCi0gICAgICAgICAgICBzc2xvYmogPSBjdHgud3JhcF9iaW8oaW5jb21pbmcsIG91dGdvaW5nLCBGYWxzZSwgUkVNT1RFX0hPU1QpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzKHNzbG9iai5fc3Nsb2JqLm93bmVyLCBzc2xvYmopCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouY2lwaGVyKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouc2hhcmVkX2NpcGhlcnMoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNzbG9iai5nZXRwZWVyY2VydCkKLSAgICAgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNzbG9iai5nZXRfY2hhbm5lbF9iaW5kaW5nKCd0bHMtdW5pcXVlJykpCi0gICAgICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouY2lwaGVyKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouc2hhcmVkX2NpcGhlcnMoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouZ2V0cGVlcmNlcnQoKSkKLSAgICAgICAgICAgIGlmICd0bHMtdW5pcXVlJyBpbiBzc2wuQ0hBTk5FTF9CSU5ESU5HX1RZUEVTOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouZ2V0X2NoYW5uZWxfYmluZGluZygndGxzLXVuaXF1ZScpKQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoudW53cmFwKQotICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xTeXNjYWxsRXJyb3I6Ci0gICAgICAgICAgICAgICAgIyBzZWxmLXNpZ25lZC5weXRob250ZXN0Lm5ldCBwcm9iYWJseSBzaHV0cyBkb3duIHRoZSBUQ1AKLSAgICAgICAgICAgICAgICAjIGNvbm5lY3Rpb24gd2l0aG91dCBzZW5kaW5nIGEgc2VjdXJlIHNodXRkb3duIG1lc3NhZ2UsIGFuZAotICAgICAgICAgICAgICAgICMgdGhpcyBpcyByZXBvcnRlZCBhcyBTU0xfRVJST1JfU1lTQ0FMTAotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNzbC5TU0xFcnJvciwgc3Nsb2JqLndyaXRlLCBiJ2ZvbycpCi0gICAgICAgICAgICBzb2NrLmNsb3NlKCkKLQotICAgIGRlZiB0ZXN0X3JlYWRfd3JpdGVfZGF0YShzZWxmKToKLSAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6Ci0gICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKLSAgICAgICAgICAgIHNvY2suY29ubmVjdCgoUkVNT1RFX0hPU1QsIDQ0MykpCi0gICAgICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQotICAgICAgICAgICAgb3V0Z29pbmcgPSBzc2wuTWVtb3J5QklPKCkKLSAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCi0gICAgICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9OT05FCi0gICAgICAgICAgICBzc2xvYmogPSBjdHgud3JhcF9iaW8oaW5jb21pbmcsIG91dGdvaW5nLCBGYWxzZSkKLSAgICAgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmouZG9faGFuZHNoYWtlKQotICAgICAgICAgICAgcmVxID0gYidHRVQgLyBIVFRQLzEuMFxyXG5cclxuJwotICAgICAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai53cml0ZSwgcmVxKQotICAgICAgICAgICAgYnVmID0gc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai5yZWFkLCAxMDI0KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjVdLCBiJ0hUVFAvJykKKyAgICBkZWYgdGVzdF9iaW9faGFuZHNoYWtlKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIHNvY2suY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyKQorICAgICAgICBpbmNvbWluZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBvdXRnb2luZyA9IHNzbC5NZW1vcnlCSU8oKQorICAgICAgICBjdHggPSBzc2wuU1NMQ29udGV4dChzc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICBjdHgudmVyaWZ5X21vZGUgPSBzc2wuQ0VSVF9SRVFVSVJFRAorICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKFNJR05JTkdfQ0EpCisgICAgICAgIGN0eC5jaGVja19ob3N0bmFtZSA9IFRydWUKKyAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UsICdsb2NhbGhvc3QnKQorICAgICAgICBzZWxmLmFzc2VydElzKHNzbG9iai5fc3Nsb2JqLm93bmVyLCBzc2xvYmopCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNzbG9iai5jaXBoZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNzbG9iai5nZXRwZWVyY2VydCkKKyAgICAgICAgaWYgJ3Rscy11bmlxdWUnIGluIHNzbC5DSEFOTkVMX0JJTkRJTkdfVFlQRVM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzc2xvYmouZ2V0X2NoYW5uZWxfYmluZGluZygndGxzLXVuaXF1ZScpKQorICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLmRvX2hhbmRzaGFrZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNzbG9iai5jaXBoZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3Nsb2JqLnNoYXJlZF9jaXBoZXJzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzc2xvYmouZ2V0cGVlcmNlcnQoKSkKKyAgICAgICAgaWYgJ3Rscy11bmlxdWUnIGluIHNzbC5DSEFOTkVMX0JJTkRJTkdfVFlQRVM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Nsb2JqLmdldF9jaGFubmVsX2JpbmRpbmcoJ3Rscy11bmlxdWUnKSkKKyAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5zc2xfaW9fbG9vcChzb2NrLCBpbmNvbWluZywgb3V0Z29pbmcsIHNzbG9iai51bndyYXApCi0gICAgICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IHNzbC5TU0xTeXNjYWxsRXJyb3I6CisgICAgICAgICAgICAjIElmIHRoZSBzZXJ2ZXIgc2h1dHMgZG93biB0aGUgVENQIGNvbm5lY3Rpb24gd2l0aG91dCBzZW5kaW5nIGEKKyAgICAgICAgICAgICMgc2VjdXJlIHNodXRkb3duIG1lc3NhZ2UsIHRoaXMgaXMgcmVwb3J0ZWQgYXMgU1NMX0VSUk9SX1NZU0NBTEwKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3NsLlNTTEVycm9yLCBzc2xvYmoud3JpdGUsIGInZm9vJykKKworICAgIGRlZiB0ZXN0X2Jpb19yZWFkX3dyaXRlX2RhdGEoc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc29jay5jbG9zZSkKKyAgICAgICAgc29jay5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHIpCisgICAgICAgIGluY29taW5nID0gc3NsLk1lbW9yeUJJTygpCisgICAgICAgIG91dGdvaW5nID0gc3NsLk1lbW9yeUJJTygpCisgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgc3Nsb2JqID0gY3R4LndyYXBfYmlvKGluY29taW5nLCBvdXRnb2luZywgRmFsc2UpCisgICAgICAgIHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmouZG9faGFuZHNoYWtlKQorICAgICAgICByZXEgPSBiJ0ZPT1xuJworICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLndyaXRlLCByZXEpCisgICAgICAgIGJ1ZiA9IHNlbGYuc3NsX2lvX2xvb3Aoc29jaywgaW5jb21pbmcsIG91dGdvaW5nLCBzc2xvYmoucmVhZCwgMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGInZm9vXG4nKQorICAgICAgICBzZWxmLnNzbF9pb19sb29wKHNvY2ssIGluY29taW5nLCBvdXRnb2luZywgc3Nsb2JqLnVud3JhcCkKIAogCi10cnk6Ci0gICAgaW1wb3J0IHRocmVhZGluZwotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIF9oYXZlX3RocmVhZHMgPSBGYWxzZQotZWxzZToKLSAgICBfaGF2ZV90aHJlYWRzID0gVHJ1ZQorY2xhc3MgTmV0d29ya2VkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCisgICAgZGVmIHRlc3RfdGltZW91dF9jb25uZWN0X2V4KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMjA2NTogb24gYSB0aW1lb3V0LCBjb25uZWN0X2V4KCkgc2hvdWxkIHJldHVybiB0aGUgb3JpZ2luYWwKKyAgICAgICAgIyBlcnJubyAobWltaWNraW5nIHRoZSBiZWhhdmlvdXIgb2Ygbm9uLVNTTCBzb2NrZXRzKS4KKyAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChSRU1PVEVfSE9TVCk6CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHMuY2xvc2UpCisgICAgICAgICAgICBzLnNldHRpbWVvdXQoMC4wMDAwMDAxKQorICAgICAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKFJFTU9URV9IT1NULCA0NDMpKQorICAgICAgICAgICAgaWYgcmMgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJSRU1PVEVfSE9TVCByZXNwb25kZWQgdG9vIHF1aWNrbHkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgKGVycm5vLkVBR0FJTiwgZXJybm8uRVdPVUxEQkxPQ0spKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3VwcG9ydC5JUFY2X0VOQUJMRUQsICdOZWVkcyBJUHY2JykKKyAgICBkZWYgdGVzdF9nZXRfc2VydmVyX2NlcnRpZmljYXRlX2lwdjYoc2VsZik6CisgICAgICAgIHdpdGggc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoJ2lwdjYuZ29vZ2xlLmNvbScpOgorICAgICAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmLCAnaXB2Ni5nb29nbGUuY29tJywgNDQzKQorICAgICAgICAgICAgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZV9mYWlsKHNlbGYsICdpcHY2Lmdvb2dsZS5jb20nLCA0NDMpCisKKyAgICBkZWYgdGVzdF9hbGdvcml0aG1zKHNlbGYpOgorICAgICAgICAjIElzc3VlICM4NDg0OiBhbGwgYWxnb3JpdGhtcyBzaG91bGQgYmUgYXZhaWxhYmxlIHdoZW4gdmVyaWZ5aW5nIGEKKyAgICAgICAgIyBjZXJ0aWZpY2F0ZS4KKyAgICAgICAgIyBTSEEyNTYgd2FzIGFkZGVkIGluIE9wZW5TU0wgMC45LjgKKyAgICAgICAgaWYgc3NsLk9QRU5TU0xfVkVSU0lPTl9JTkZPIDwgKDAsIDksIDgsIDAsIDE1KToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlNIQTI1NiBub3QgYXZhaWxhYmxlIG9uICVyIiAlIHNzbC5PUEVOU1NMX1ZFUlNJT04pCisgICAgICAgICMgc2hhMjU2LnRicy1pbnRlcm5ldC5jb20gbmVlZHMgU05JIHRvIHVzZSB0aGUgY29ycmVjdCBjZXJ0aWZpY2F0ZQorICAgICAgICBpZiBub3Qgc3NsLkhBU19TTkk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTTkkgbmVlZGVkIGZvciB0aGlzIHRlc3QiKQorICAgICAgICAjIGh0dHBzOi8vc2hhMi5oYm9lY2suZGUvIHdhcyB1c2VkIHVudGlsIDIwMTEtMDEtMDggKG5vIHJvdXRlIHRvIGhvc3QpCisgICAgICAgIHJlbW90ZSA9ICgic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iLCA0NDMpCisgICAgICAgIHNoYTI1Nl9jZXJ0ID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJzaGEyNTYucGVtIikKKyAgICAgICAgd2l0aCBzdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKToKKyAgICAgICAgICAgIGN0eCA9IHNzbC5TU0xDb250ZXh0KHNzbC5QUk9UT0NPTF9UTFN2MSkKKyAgICAgICAgICAgIGN0eC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECisgICAgICAgICAgICBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKHNoYTI1Nl9jZXJ0KQorICAgICAgICAgICAgcyA9IGN0eC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPSJzaGEyNTYudGJzLWludGVybmV0LmNvbSIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKKyAgICAgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuQ2lwaGVyIHdpdGggJXIgaXMgJXJcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdGUsIHMuY2lwaGVyKCkpKQorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJDZXJ0aWZpY2F0ZSBpczpcbiVzXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChzLmdldHBlZXJjZXJ0KCkpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworCitkZWYgX3Rlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZSh0ZXN0LCBob3N0LCBwb3J0LCBjZXJ0PU5vbmUpOgorICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSkKKyAgICBpZiBub3QgcGVtOgorICAgICAgICB0ZXN0LmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiAlczolcyEiICUgKGhvc3QsIHBvcnQpKQorCisgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKGhvc3QsIHBvcnQpLCBjYV9jZXJ0cz1jZXJ0KQorICAgIGlmIG5vdCBwZW06CisgICAgICAgIHRlc3QuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uICVzOiVzISIgJSAoaG9zdCwgcG9ydCkpCisgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcblZlcmlmaWVkIGNlcnRpZmljYXRlIGZvciAlczolcyBpc1xuJXNcbiIgJSAoaG9zdCwgcG9ydCAscGVtKSkKKworZGVmIF90ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGVfZmFpbCh0ZXN0LCBob3N0LCBwb3J0KToKKyAgICB0cnk6CisgICAgICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKChob3N0LCBwb3J0KSwgY2FfY2VydHM9Q0VSVEZJTEUpCisgICAgZXhjZXB0IHNzbC5TU0xFcnJvciBhcyB4OgorICAgICAgICAjc2hvdWxkIGZhaWwKKyAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiJXNcbiIgJSB4KQorICAgIGVsc2U6CisgICAgICAgIHRlc3QuZmFpbCgiR290IHNlcnZlciBjZXJ0aWZpY2F0ZSAlcyBmb3IgJXM6JXMhIiAlIChwZW0sIGhvc3QsIHBvcnQpKQorCisKK2lmIF9oYXZlX3RocmVhZHM6CiAgICAgZnJvbSB0ZXN0LnNzbF9zZXJ2ZXJzIGltcG9ydCBtYWtlX2h0dHBzX3NlcnZlcgogCiAgICAgY2xhc3MgVGhyZWFkZWRFY2hvU2VydmVyKHRocmVhZGluZy5UaHJlYWQpOgpAQCAtMTg4Miw2ICsxODY0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RyaXBwZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlb2YsIHNvIHF1aXQgdGhpcyBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IHNlbGYuc3NsY29ubi51bndyYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1hbnkgdGVzdHMgc2h1dCB0aGUgVENQIGNvbm5lY3Rpb24gZG93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdpdGhvdXQgYW4gU1NMIHNodXRkb3duLiBUaGlzIGNhdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVud3JhcCgpIHRvIHJhaXNlIE9TRXJyb3Igd2l0aCBlcnJubz0wIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xjb25uID0gTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBzdHJpcHBlZCA9PSBiJ292ZXInOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5zZXJ2ZXIuY29ubmVjdGlvbmNoYXR0eToKQEAgLTI3MTksMTIgKzI3MTAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgY291bnQsIGFkZHIgPSBzLnJlY3Zmcm9tX2ludG8oYikKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJbOmNvdW50XQogCi0gICAgICAgICAgICAgICAgIyAobmFtZSwgbWV0aG9kLCB3aGV0aGVyIHRvIGV4cGVjdCBzdWNjZXNzLCAqYXJncykKKyAgICAgICAgICAgICAgICAjIChuYW1lLCBtZXRob2QsIGV4cGVjdCBzdWNjZXNzPywgKmFyZ3MsIHJldHVybiB2YWx1ZSBmdW5jKQogICAgICAgICAgICAgICAgIHNlbmRfbWV0aG9kcyA9IFsKLSAgICAgICAgICAgICAgICAgICAgKCdzZW5kJywgcy5zZW5kLCBUcnVlLCBbXSksCi0gICAgICAgICAgICAgICAgICAgICgnc2VuZHRvJywgcy5zZW5kdG8sIEZhbHNlLCBbInNvbWUuYWRkcmVzcyJdKSwKLSAgICAgICAgICAgICAgICAgICAgKCdzZW5kYWxsJywgcy5zZW5kYWxsLCBUcnVlLCBbXSksCisgICAgICAgICAgICAgICAgICAgICgnc2VuZCcsIHMuc2VuZCwgVHJ1ZSwgW10sIGxlbiksCisgICAgICAgICAgICAgICAgICAgICgnc2VuZHRvJywgcy5zZW5kdG8sIEZhbHNlLCBbInNvbWUuYWRkcmVzcyJdLCBsZW4pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmRhbGwnLCBzLnNlbmRhbGwsIFRydWUsIFtdLCBsYW1iZGEgeDogTm9uZSksCiAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICMgKG5hbWUsIG1ldGhvZCwgd2hldGhlciB0byBleHBlY3Qgc3VjY2VzcywgKmFyZ3MpCiAgICAgICAgICAgICAgICAgcmVjdl9tZXRob2RzID0gWwogICAgICAgICAgICAgICAgICAgICAoJ3JlY3YnLCBzLnJlY3YsIFRydWUsIFtdKSwKICAgICAgICAgICAgICAgICAgICAgKCdyZWN2ZnJvbScsIHMucmVjdmZyb20sIEZhbHNlLCBbInNvbWUuYWRkcmVzcyJdKSwKQEAgLTI3MzMsMTAgKzI3MjUsMTMgQEAKICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgZGF0YV9wcmVmaXggPSAiUFJFRklYXyIKIAotICAgICAgICAgICAgICAgIGZvciBtZXRoX25hbWUsIHNlbmRfbWV0aCwgZXhwZWN0X3N1Y2Nlc3MsIGFyZ3MgaW4gc2VuZF9tZXRob2RzOgorICAgICAgICAgICAgICAgIGZvciAobWV0aF9uYW1lLCBzZW5kX21ldGgsIGV4cGVjdF9zdWNjZXNzLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0X3ZhbF9tZXRoKSBpbiBzZW5kX21ldGhvZHM6CiAgICAgICAgICAgICAgICAgICAgIGluZGF0YSA9IChkYXRhX3ByZWZpeCArIG1ldGhfbmFtZSkuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbWV0aChpbmRhdGEsICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2VuZF9tZXRoKGluZGF0YSwgKmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAic2VuZGluZyB3aXRoIHt9Ii5mb3JtYXQobWV0aF9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsIHJldF92YWxfbWV0aChpbmRhdGEpLCBtc2c9bXNnKQogICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IHMucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvdXRkYXRhICE9IGluZGF0YS5sb3dlcigpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKQEAgLTMzNzQsMTggKzMzNjksMjAgQEAKICAgICAgICAgICAgIHBhc3MKIAogICAgIGZvciBmaWxlbmFtZSBpbiBbCi0gICAgICAgIENFUlRGSUxFLCBSRU1PVEVfUk9PVF9DRVJULCBCWVRFU19DRVJURklMRSwKKyAgICAgICAgQ0VSVEZJTEUsIEJZVEVTX0NFUlRGSUxFLAogICAgICAgICBPTkxZQ0VSVCwgT05MWUtFWSwgQllURVNfT05MWUNFUlQsIEJZVEVTX09OTFlLRVksCiAgICAgICAgIFNJR05FRF9DRVJURklMRSwgU0lHTkVEX0NFUlRGSUxFMiwgU0lHTklOR19DQSwKICAgICAgICAgQkFEQ0VSVCwgQkFES0VZLCBFTVBUWUNFUlRdOgogICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICAgcmFpc2Ugc3VwcG9ydC5UZXN0RmFpbGVkKCJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGZpbGUgJXIiICUgZmlsZW5hbWUpCiAKLSAgICB0ZXN0cyA9IFtDb250ZXh0VGVzdHMsIEJhc2ljU29ja2V0VGVzdHMsIFNTTEVycm9yVGVzdHMsIE1lbW9yeUJJT1Rlc3RzXQorICAgIHRlc3RzID0gWworICAgICAgICBDb250ZXh0VGVzdHMsIEJhc2ljU29ja2V0VGVzdHMsIFNTTEVycm9yVGVzdHMsIE1lbW9yeUJJT1Rlc3RzLAorICAgICAgICBTaW1wbGVCYWNrZ3JvdW5kVGVzdHMsCisgICAgXQogCiAgICAgaWYgc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCduZXR3b3JrJyk6CiAgICAgICAgIHRlc3RzLmFwcGVuZChOZXR3b3JrZWRUZXN0cykKLSAgICAgICAgdGVzdHMuYXBwZW5kKE5ldHdvcmtlZEJJT1Rlc3RzKQogCiAgICAgaWYgX2hhdmVfdGhyZWFkczoKICAgICAgICAgdGhyZWFkX2luZm8gPSBzdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkgYi9MaWIvdGVzdC90ZXN0X3N0YXRpc3RpY3MucHkKaW5kZXggMDA4OWFlOC4uY2NjYzFiOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdGF0aXN0aWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RhdGlzdGljcy5weQpAQCAtNzAyLDkgKzcwMiw5IEBACiAgICAgZGVmIHRlc3RfZGVjaW1hbChzZWxmKToKICAgICAgICAgRCA9IERlY2ltYWwKICAgICAgICAgX2V4YWN0X3JhdGlvID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiMC4xMjUiKSksICgxMjUsIDEwMDApKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9leGFjdF9yYXRpbyhEKCIxMi4zNDUiKSksICgxMjM0NSwgMTAwMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX2V4YWN0X3JhdGlvKEQoIi0xLjk4IikpLCAoLTE5OCwgMTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiMC4xMjUiKSksICgxLCA4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiMTIuMzQ1IikpLCAoMjQ2OSwgMjAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZXhhY3RfcmF0aW8oRCgiLTEuOTgiKSksICgtOTksIDUwKSkKIAogICAgIGRlZiB0ZXN0X2luZihzZWxmKToKICAgICAgICAgSU5GID0gZmxvYXQoIklORiIpCkBAIC03NDMsMTggKzc0MywxOCBAQAogCiAKIGNsYXNzIERlY2ltYWxUb1JhdGlvVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIyBUZXN0IF9kZWNpbWFsX3RvX3JhdGlvIHByaXZhdGUgZnVuY3Rpb24uCisgICAgIyBUZXN0IF9leGFjdF9yYXRpbyBwcml2YXRlIGZ1bmN0aW9uLgogCiAgICAgZGVmIHRlc3RfaW5maW5pdHkoc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IElORnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICBpbmYgPSBEZWNpbWFsKCdJTkYnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oaW5mKSwgKGluZiwgTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbygtaW5mKSwgKC1pbmYsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKGluZiksIChpbmYsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKC1pbmYpLCAoLWluZiwgTm9uZSkpCiAKICAgICBkZWYgdGVzdF9uYW4oc2VsZik6CiAgICAgICAgICMgVGVzdCB0aGF0IE5BTnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICBmb3IgbmFuIGluIChEZWNpbWFsKCdOQU4nKSwgRGVjaW1hbCgnc05BTicpKToKLSAgICAgICAgICAgIG51bSwgZGVuID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbyhuYW4pCisgICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKG5hbikKICAgICAgICAgICAgICMgQmVjYXVzZSBOQU5zIGFsd2F5cyBjb21wYXJlIG5vbi1lcXVhbCwgd2UgY2Fubm90IHVzZSBhc3NlcnRFcXVhbC4KICAgICAgICAgICAgICMgTm9yIGNhbiB3ZSB1c2UgYW4gaWRlbnRpdHkgdGVzdCwgYXMgd2UgZG9uJ3QgZ3VhcmFudGVlIGFueXRoaW5nCiAgICAgICAgICAgICAjIGFib3V0IHRoZSBvYmplY3QgaWRlbnRpdHkuCkBAIC03NjcsMzAgKzc2NywzMCBAQAogICAgICAgICBmb3IgZCBpbiBudW1iZXJzOgogICAgICAgICAgICAgIyBGaXJzdCB0ZXN0IHBvc2l0aXZlIGRlY2ltYWxzLgogICAgICAgICAgICAgYXNzZXJ0IGQgPiAwCi0gICAgICAgICAgICBudW0sIGRlbiA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oZCkKKyAgICAgICAgICAgIG51bSwgZGVuID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8oZCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG51bSwgMCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihkZW4sIDApCiAgICAgICAgICAgICAjIFRoZW4gdGVzdCBuZWdhdGl2ZSBkZWNpbWFscy4KLSAgICAgICAgICAgIG51bSwgZGVuID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbygtZCkKKyAgICAgICAgICAgIG51bSwgZGVuID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8oLWQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChudW0sIDApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZGVuLCAwKQogCiAgICAgZGVmIHRlc3RfbmVnYXRpdmVfZXhwb25lbnQoc2VsZik6CiAgICAgICAgICMgVGVzdCByZXN1bHQgd2hlbiB0aGUgZXhwb25lbnQgaXMgbmVnYXRpdmUuCi0gICAgICAgIHQgPSBzdGF0aXN0aWNzLl9kZWNpbWFsX3RvX3JhdGlvKERlY2ltYWwoIjAuMTIzNCIpKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxMjM0LCAxMDAwMCkpCisgICAgICAgIHQgPSBzdGF0aXN0aWNzLl9leGFjdF9yYXRpbyhEZWNpbWFsKCIwLjEyMzQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoNjE3LCA1MDAwKSkKIAogICAgIGRlZiB0ZXN0X3Bvc2l0aXZlX2V4cG9uZW50KHNlbGYpOgogICAgICAgICAjIFRlc3QgcmVzdWx0cyB3aGVuIHRoZSBleHBvbmVudCBpcyBwb3NpdGl2ZS4KLSAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2RlY2ltYWxfdG9fcmF0aW8oRGVjaW1hbCgiMS4yMzRlNyIpKQorICAgICAgICB0ID0gc3RhdGlzdGljcy5fZXhhY3RfcmF0aW8oRGVjaW1hbCgiMS4yMzRlNyIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxMjM0MDAwMCwgMSkpCiAKICAgICBkZWYgdGVzdF9yZWdyZXNzaW9uXzIwNTM2KHNlbGYpOgogICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaXNzdWUgMjA1MzYuCiAgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDUzNgotICAgICAgICB0ID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbyhEZWNpbWFsKCIxZTIiKSkKKyAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKERlY2ltYWwoIjFlMiIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxMDAsIDEpKQotICAgICAgICB0ID0gc3RhdGlzdGljcy5fZGVjaW1hbF90b19yYXRpbyhEZWNpbWFsKCIxLjQ3ZTUiKSkKKyAgICAgICAgdCA9IHN0YXRpc3RpY3MuX2V4YWN0X3JhdGlvKERlY2ltYWwoIjEuNDdlNSIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxNDcwMDAsIDEpKQogCiAKQEAgLTE2MDAsNiArMTYwMCwyMiBAQAogICAgICAgICBkYXRhID0gWzIyMCwgMjIwLCAyNDAsIDI2MCwgMjYwLCAyNjAsIDI2MCwgMjgwLCAyODAsIDMwMCwgMzIwLCAzNDBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mdW5jKGRhdGEsIDIwKSwgMjY1LjApCiAKKyAgICBkZWYgdGVzdF9kYXRhX3R5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgICMgVGVzdCBtZWRpYW5fZ3JvdXBlZCB3aXRoIHN0ciwgYnl0ZXMgZGF0YSB0eXBlcyBmb3IgZGF0YSBhbmQgaW50ZXJ2YWwKKyAgICAgICAgZGF0YSA9IFsiIiwgIiIsICIiXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZnVuYywgZGF0YSkKKyAgICAgICAgIy0tLQorICAgICAgICBkYXRhID0gW2IiIiwgYiIiLCBiIiJdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mdW5jLCBkYXRhKQorICAgICAgICAjLS0tCisgICAgICAgIGRhdGEgPSBbMSwgMiwgM10KKyAgICAgICAgaW50ZXJ2YWwgPSAiIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZnVuYywgZGF0YSwgaW50ZXJ2YWwpCisgICAgICAgICMtLS0KKyAgICAgICAgZGF0YSA9IFsxLCAyLCAzXQorICAgICAgICBpbnRlcnZhbCA9IGIiIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZnVuYywgZGF0YSwgaW50ZXJ2YWwpCisKIAogY2xhc3MgVGVzdE1vZGUoTnVtZXJpY1Rlc3RDYXNlLCBBdmVyYWdlTWl4aW4sIFVuaXZhcmlhdGVUeXBlTWl4aW4pOgogICAgICMgVGVzdCBjYXNlcyBmb3IgdGhlIGRpc2NyZXRlIHZlcnNpb24gb2YgbW9kZS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CmluZGV4IDg1MTI2ZTYuLjhjOGY5N2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQpAQCAtNSw3ICs1LDYgQEAKIGltcG9ydCBsb2NhbGUKIGltcG9ydCByZQogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGUgYXMgZGF0ZXRpbWVfZGF0ZQogCkBAIC0xNTMsOCArMTUyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyB1c2luZyAnJXMnOyBncm91cCAnYScgPSAnJXMnLCBncm91cCAnYicgPSAlcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAoZm91bmQuc3RyaW5nLCBmb3VuZC5yZS5wYXR0ZXJuLCBmb3VuZC5ncm91cCgnYScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5ncm91cCgnYicpKSkKLSAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCdBJywnYicsJ0InLCdjJywnZCcsJ0gnLCdJJywnaicsJ20nLCdNJywncCcsJ1MnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnVScsJ3cnLCdXJywneCcsJ1gnLCd5JywnWScsJ1onLCclJyk6CisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywnQScsJ2InLCdCJywnYycsJ2QnLCdHJywnSCcsJ0knLCdqJywnbScsJ00nLCdwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1MnLCd1JywnVScsJ1YnLCd3JywnVycsJ3gnLCdYJywneScsJ1knLCdaJywnJScpOgogICAgICAgICAgICAgY29tcGlsZWQgPSBzZWxmLnRpbWVfcmUuY29tcGlsZSgiJSIgKyBkaXJlY3RpdmUpCiAgICAgICAgICAgICBmb3VuZCA9IGNvbXBpbGVkLm1hdGNoKHRpbWUuc3RyZnRpbWUoIiUiICsgZGlyZWN0aXZlKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCwgIk1hdGNoaW5nIGZhaWxlZCBvbiAnJXMnIHVzaW5nICclcycgcmVnZXgiICUKQEAgLTIxOSw2ICsyMTgsMjYgQEAKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCInJXMnIGRpZCBub3QgcmFpc2UgVmFsdWVFcnJvciIgJSBiYWRfZm9ybWF0KQogCisgICAgICAgICMgQW1iaWd1b3VzIG9yIGluY29tcGxldGUgY2FzZXMgdXNpbmcgSVNPIHllYXIvd2Vlay93ZWVrZGF5IGRpcmVjdGl2ZXMKKyAgICAgICAgIyAxLiBJU08gd2VlayAoJVYpIGlzIHNwZWNpZmllZCwgYnV0IHRoZSB5ZWFyIGlzIHNwZWNpZmllZCB3aXRoICVZCisgICAgICAgICMgaW5zdGVhZCBvZiAlRworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZSgiMTk5OSA1MCIsICIlWSAlViIpCisgICAgICAgICMgMi4gSVNPIHllYXIgKCVHKSBhbmQgSVNPIHdlZWsgKCVWKSBhcmUgc3BlY2lmaWVkLCBidXQgd2Vla2RheSBpcyBub3QKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjE5OTkgNTEiLCAiJUcgJVYiKQorICAgICAgICAjIDMuIElTTyB5ZWFyICglRykgYW5kIHdlZWtkYXkgYXJlIHNwZWNpZmllZCwgYnV0IElTTyB3ZWVrICglVikgaXMgbm90CisgICAgICAgIGZvciB3IGluICgnQScsICdhJywgJ3cnLCAndScpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIxOTk5IDUxIiwiJUcgJXt9Ii5mb3JtYXQodykpCisgICAgICAgICMgNC4gSVNPIHllYXIgaXMgc3BlY2lmaWVkIGFsb25lIChlLmcuIHRpbWUuc3RycHRpbWUoJzIwMTUnLCAnJUcnKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWUoIjIwMTUiLCAiJUciKQorICAgICAgICAjIDUuIEp1bGlhbi9vcmRpbmFsIGRheSAoJWopIGlzIHNwZWNpZmllZCB3aXRoICVHLCBidXQgbm90ICVZCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lKCIxOTk5IDI1NiIsICIlRyAlaiIpCisKKwogICAgIGRlZiB0ZXN0X3N0cnB0aW1lX2V4Y2VwdGlvbl9jb250ZXh0KHNlbGYpOgogICAgICAgICAjIGNoZWNrIHRoYXQgdGhpcyBkb2Vzbid0IGNoYWluIGV4Y2VwdGlvbnMgbmVlZGxlc3NseSAoc2VlICMxNzU3MikKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBlOgpAQCAtMjkwLDcgKzMwOSw3IEBACiAKICAgICBkZWYgdGVzdF93ZWVrZGF5KHNlbGYpOgogICAgICAgICAjIFRlc3Qgd2Vla2RheSBkaXJlY3RpdmVzCi0gICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdBJywgJ2EnLCAndycpOgorICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnQScsICdhJywgJ3cnLCAndScpOgogICAgICAgICAgICAgc2VsZi5oZWxwZXIoZGlyZWN0aXZlLDYpCiAKICAgICBkZWYgdGVzdF9qdWxpYW4oc2VsZik6CkBAIC00NTcsMTYgKzQ3NiwyMCBAQAogICAgICAgICAjIFNob3VsZCBiZSBhYmxlIHRvIGluZmVyIGRhdGUgaWYgZ2l2ZW4geWVhciwgd2VlayBvZiB5ZWFyICglVSBvciAlVykKICAgICAgICAgIyBhbmQgZGF5IG9mIHRoZSB3ZWVrCiAgICAgICAgIGRlZiB0ZXN0X2hlbHBlcih5bWRfdHVwbGUsIHRlc3RfcmVhc29uKToKLSAgICAgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdXJywgJ1UnKToKLSAgICAgICAgICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiUlWSAlJSVzICUldyIgJSBkaXJlY3RpdmUKLSAgICAgICAgICAgICAgICBkdF9kYXRlID0gZGF0ZXRpbWVfZGF0ZSgqeW1kX3R1cGxlKQotICAgICAgICAgICAgICAgIHN0cnBfaW5wdXQgPSBkdF9kYXRlLnN0cmZ0aW1lKGZvcm1hdF9zdHJpbmcpCi0gICAgICAgICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RycF9pbnB1dCwgZm9ybWF0X3N0cmluZykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXRbOjNdID09IHltZF90dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcykgdGVzdCBmYWlsZWQgdy8gJyVzJzogJXMgIT0gJXMgKCVzICE9ICVzKSIgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0X3JlYXNvbiwgZGlyZWN0aXZlLCBzdHJwX2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFs6M10sIHltZF90dXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbN10sIGR0X2RhdGUudGltZXR1cGxlKClbN10pKQorICAgICAgICAgICAgZm9yIHllYXJfd2Vla19mb3JtYXQgaW4gKCclWSAlVycsICclWSAlVScsICclRyAlVicpOgorICAgICAgICAgICAgICAgIGZvciB3ZWVrZGF5X2Zvcm1hdCBpbiAoJyV3JywgJyV1JywgJyVhJywgJyVBJyk6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcgPSB5ZWFyX3dlZWtfZm9ybWF0ICsgJyAnICsgd2Vla2RheV9mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QodGVzdF9yZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU9eW1kX3R1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9Zm9ybWF0X3N0cmluZyk6CisgICAgICAgICAgICAgICAgICAgICAgICBkdF9kYXRlID0gZGF0ZXRpbWVfZGF0ZSgqeW1kX3R1cGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9pbnB1dCA9IGR0X2RhdGUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cnBfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gIiVyOiAlcyAhPSAlcyIgJSAoc3RycF9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRfZGF0ZS50aW1ldHVwbGUoKVs3XSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RycF9vdXRwdXRbOjNdLCB5bWRfdHVwbGUsIG1zZykKICAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDEsIDEsIDMpLCAid2VlayAwIikKICAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDEsIDEsIDgpLCAiY29tbW9uIGNhc2UiKQogICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgMTMpLCAiZGF5IG9uIFN1bmRheSIpCkBAIC00OTgsMzMgKzUyMSw0OCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUodmFsdWUsIGZvcm1hdClbOi0xXSwgZXhwZWN0ZWQpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMCcsICclWSAlVSAldycsIDIwMTQsIDEyLCAyOCwgMCwgMCwgMCwgNiwgMzYyKQogICAgICAgICBjaGVjaygnMjAxNSAwIDAnLCAnJVkgJVcgJXcnLCAyMDE1LCAxLCA0LCAwLCAwLCAwLCA2LCA0KQorICAgICAgICBjaGVjaygnMjAxNSAxIDEnLCAnJUcgJVYgJXUnLCAyMDE0LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2MykKICAgICAgICAgY2hlY2soJzIwMTUgMCAxJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjMpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMScsICclWSAlVyAldycsIDIwMTQsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzYzKQorICAgICAgICBjaGVjaygnMjAxNSAxIDInLCAnJUcgJVYgJXUnLCAyMDE0LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NCkKICAgICAgICAgY2hlY2soJzIwMTUgMCAyJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjQpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMicsICclWSAlVyAldycsIDIwMTQsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY0KQorICAgICAgICBjaGVjaygnMjAxNSAxIDMnLCAnJUcgJVYgJXUnLCAyMDE0LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMTUgMCAzJywgJyVZICVVICV3JywgMjAxNCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjUpCiAgICAgICAgIGNoZWNrKCcyMDE1IDAgMycsICclWSAlVyAldycsIDIwMTQsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY1KQorICAgICAgICBjaGVjaygnMjAxNSAxIDQnLCAnJUcgJVYgJXUnLCAyMDE1LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQogICAgICAgICBjaGVjaygnMjAxNSAwIDQnLCAnJVkgJVUgJXcnLCAyMDE1LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQogICAgICAgICBjaGVjaygnMjAxNSAwIDQnLCAnJVkgJVcgJXcnLCAyMDE1LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQorICAgICAgICBjaGVjaygnMjAxNSAxIDUnLCAnJUcgJVYgJXUnLCAyMDE1LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQogICAgICAgICBjaGVjaygnMjAxNSAwIDUnLCAnJVkgJVUgJXcnLCAyMDE1LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQogICAgICAgICBjaGVjaygnMjAxNSAwIDUnLCAnJVkgJVcgJXcnLCAyMDE1LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQorICAgICAgICBjaGVjaygnMjAxNSAxIDYnLCAnJUcgJVYgJXUnLCAyMDE1LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQogICAgICAgICBjaGVjaygnMjAxNSAwIDYnLCAnJVkgJVUgJXcnLCAyMDE1LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQogICAgICAgICBjaGVjaygnMjAxNSAwIDYnLCAnJVkgJVcgJXcnLCAyMDE1LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQorICAgICAgICBjaGVjaygnMjAxNSAxIDcnLCAnJUcgJVYgJXUnLCAyMDE1LCAxLCA0LCAwLCAwLCAwLCA2LCA0KQogCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMCcsICclWSAlVSAldycsIDIwMDgsIDEyLCAyOCwgMCwgMCwgMCwgNiwgMzYzKQogICAgICAgICBjaGVjaygnMjAwOSAwIDAnLCAnJVkgJVcgJXcnLCAyMDA5LCAxLCA0LCAwLCAwLCAwLCA2LCA0KQorICAgICAgICBjaGVjaygnMjAwOSAxIDEnLCAnJUcgJVYgJXUnLCAyMDA4LCAxMiwgMjksIDAsIDAsIDAsIDAsIDM2NCkKICAgICAgICAgY2hlY2soJzIwMDkgMCAxJywgJyVZICVVICV3JywgMjAwOCwgMTIsIDI5LCAwLCAwLCAwLCAwLCAzNjQpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMScsICclWSAlVyAldycsIDIwMDgsIDEyLCAyOSwgMCwgMCwgMCwgMCwgMzY0KQorICAgICAgICBjaGVjaygnMjAwOSAxIDInLCAnJUcgJVYgJXUnLCAyMDA4LCAxMiwgMzAsIDAsIDAsIDAsIDEsIDM2NSkKICAgICAgICAgY2hlY2soJzIwMDkgMCAyJywgJyVZICVVICV3JywgMjAwOCwgMTIsIDMwLCAwLCAwLCAwLCAxLCAzNjUpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMicsICclWSAlVyAldycsIDIwMDgsIDEyLCAzMCwgMCwgMCwgMCwgMSwgMzY1KQorICAgICAgICBjaGVjaygnMjAwOSAxIDMnLCAnJUcgJVYgJXUnLCAyMDA4LCAxMiwgMzEsIDAsIDAsIDAsIDIsIDM2NikKICAgICAgICAgY2hlY2soJzIwMDkgMCAzJywgJyVZICVVICV3JywgMjAwOCwgMTIsIDMxLCAwLCAwLCAwLCAyLCAzNjYpCiAgICAgICAgIGNoZWNrKCcyMDA5IDAgMycsICclWSAlVyAldycsIDIwMDgsIDEyLCAzMSwgMCwgMCwgMCwgMiwgMzY2KQorICAgICAgICBjaGVjaygnMjAwOSAxIDQnLCAnJUcgJVYgJXUnLCAyMDA5LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQogICAgICAgICBjaGVjaygnMjAwOSAwIDQnLCAnJVkgJVUgJXcnLCAyMDA5LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQogICAgICAgICBjaGVjaygnMjAwOSAwIDQnLCAnJVkgJVcgJXcnLCAyMDA5LCAxLCAxLCAwLCAwLCAwLCAzLCAxKQorICAgICAgICBjaGVjaygnMjAwOSAxIDUnLCAnJUcgJVYgJXUnLCAyMDA5LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQogICAgICAgICBjaGVjaygnMjAwOSAwIDUnLCAnJVkgJVUgJXcnLCAyMDA5LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQogICAgICAgICBjaGVjaygnMjAwOSAwIDUnLCAnJVkgJVcgJXcnLCAyMDA5LCAxLCAyLCAwLCAwLCAwLCA0LCAyKQorICAgICAgICBjaGVjaygnMjAwOSAxIDYnLCAnJUcgJVYgJXUnLCAyMDA5LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQogICAgICAgICBjaGVjaygnMjAwOSAwIDYnLCAnJVkgJVUgJXcnLCAyMDA5LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQogICAgICAgICBjaGVjaygnMjAwOSAwIDYnLCAnJVkgJVcgJXcnLCAyMDA5LCAxLCAzLCAwLCAwLCAwLCA1LCAzKQorICAgICAgICBjaGVjaygnMjAwOSAxIDcnLCAnJUcgJVYgJXUnLCAyMDA5LCAxLCA0LCAwLCAwLCAwLCA2LCA0KQorCiAKIGNsYXNzIENhY2hlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlRlc3QgdGhhdCBjYWNoaW5nIHdvcmtzIHByb3Blcmx5LiIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IDQ3MDRkNDkuLmJhOTFiYmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKQEAgLTEsMjAgKzEsMTYgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jawotZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHNjcmlwdF9oZWxwZXIKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIGltcG9ydCBzaWduYWwKIGltcG9ydCBpbwotaW1wb3J0IGxvY2FsZQogaW1wb3J0IG9zCiBpbXBvcnQgZXJybm8KIGltcG9ydCB0ZW1wZmlsZQogaW1wb3J0IHRpbWUKLWltcG9ydCByZQogaW1wb3J0IHNlbGVjdG9ycwogaW1wb3J0IHN5c2NvbmZpZwotaW1wb3J0IHdhcm5pbmdzCiBpbXBvcnQgc2VsZWN0CiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgZ2MKQEAgLTQ0OCw4ICs0NDQsOCBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3Rkb3V0LndyaXRlKCJvcmFuZ2UiKSddLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksIGIib3JhbmdlIikKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksIGIib3JhbmdlIikKIAogICAgIGRlZiB0ZXN0X3N0ZG91dF9maWxlZGVzKHNlbGYpOgogICAgICAgICAjIHN0ZG91dCBpcyBzZXQgdG8gb3BlbiBmaWxlIGRlc2NyaXB0b3IKQEAgLTQ3OSw4ICs0NzUsOCBAQAogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLndyaXRlKCJzdHJhd2JlcnJ5IiknXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwocC5zdGRlcnIucmVhZCgpLCBiInN0cmF3YmVycnkiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHAuc3RkZXJyLnJlYWQoKSwgYiJzdHJhd2JlcnJ5IikKIAogICAgIGRlZiB0ZXN0X3N0ZGVycl9maWxlZGVzKHNlbGYpOgogICAgICAgICAjIHN0ZGVyciBpcyBzZXQgdG8gb3BlbiBmaWxlIGRlc2NyaXB0b3IKQEAgLTUzNSw4ICs1MzEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRlcnIud3JpdGUoIm9yYW5nZSIpJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJhcHBsZW9yYW5nZSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwocC5zdGRvdXQucmVhZCgpLCBiImFwcGxlb3JhbmdlIikKIAogICAgIGRlZiB0ZXN0X3N0ZG91dF9zdGRlcnJfZmlsZShzZWxmKToKICAgICAgICAgIyBjYXB0dXJlIHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZSBzYW1lIG9wZW4gZmlsZQpAQCAtNzk0LDE4ICs3OTAsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9MSkKLSAgICAgICAgcC5zdGRpbi53cml0ZSgibGluZTFcbiIpCi0gICAgICAgIHAuc3RkaW4uZmx1c2goKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWRsaW5lKCksICJsaW5lMVxuIikKLSAgICAgICAgcC5zdGRpbi53cml0ZSgibGluZTNcbiIpCi0gICAgICAgIHAuc3RkaW4uY2xvc2UoKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZGxpbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTJcbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCg2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTNcbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lNFxubGluZTVcbmxpbmU2XG5saW5lN1xubGluZTgiKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCJsaW5lMVxuIikKKyAgICAgICAgICAgIHAuc3RkaW4uZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkbGluZSgpLCAibGluZTFcbiIpCisgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCJsaW5lM1xuIikKKyAgICAgICAgICAgIHAuc3RkaW4uY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTJcbiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lM1xuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTRcbmxpbmU1XG5saW5lNlxubGluZTdcbmxpbmU4IikKIAogICAgIGRlZiB0ZXN0X3VuaXZlcnNhbF9uZXdsaW5lc19jb21tdW5pY2F0ZShzZWxmKToKICAgICAgICAgIyB1bml2ZXJzYWwgbmV3bGluZXMgdGhyb3VnaCBjb21tdW5pY2F0ZSgpCkBAIC0xNDMxLDYgKzE0MjgsMjcgQEAKICAgICAgICAgICAgIHAud2FpdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLXAucmV0dXJuY29kZSwgc2lnbmFsLlNJR0FCUlQpCiAKKyAgICBkZWYgdGVzdF9DYWxsZWRQcm9jZXNzRXJyb3Jfc3RyX3NpZ25hbChzZWxmKToKKyAgICAgICAgZXJyID0gc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IoLWludChzaWduYWwuU0lHQUJSVCksICJmYWtlIGNtZCIpCisgICAgICAgIGVycm9yX3N0cmluZyA9IHN0cihlcnIpCisgICAgICAgICMgV2UncmUgcmVseWluZyBvbiB0aGUgcmVwcigpIG9mIHRoZSBzaWduYWwuU2lnbmFscyBpbnRlbnVtIHRvIHByb3ZpZGUKKyAgICAgICAgIyB0aGUgd29yZCBzaWduYWwsIHRoZSBzaWduYWwgbmFtZSBhbmQgdGhlIG51bWVyaWMgdmFsdWUuCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oInNpZ25hbCIsIGVycm9yX3N0cmluZy5sb3dlcigpKQorICAgICAgICAjIFdlJ3JlIG5vdCBiZWluZyBzcGVjaWZpYyBhYm91dCB0aGUgc2lnbmFsIG5hbWUgYXMgc29tZSBzaWduYWxzIGhhdmUKKyAgICAgICAgIyBtdWx0aXBsZSBuYW1lcyBhbmQgd2hpY2ggbmFtZSBpcyByZXZlYWxlZCBjYW4gdmFyeS4KKyAgICAgICAgc2VsZi5hc3NlcnRJbigiU0lHIiwgZXJyb3Jfc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEluKHN0cihzaWduYWwuU0lHQUJSVCksIGVycm9yX3N0cmluZykKKworICAgIGRlZiB0ZXN0X0NhbGxlZFByb2Nlc3NFcnJvcl9zdHJfdW5rbm93bl9zaWduYWwoc2VsZik6CisgICAgICAgIGVyciA9IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKC05ODc2NTQzLCAiZmFrZSBjbWQiKQorICAgICAgICBlcnJvcl9zdHJpbmcgPSBzdHIoZXJyKQorICAgICAgICBzZWxmLmFzc2VydEluKCJ1bmtub3duIHNpZ25hbCA5ODc2NTQzLiIsIGVycm9yX3N0cmluZykKKworICAgIGRlZiB0ZXN0X0NhbGxlZFByb2Nlc3NFcnJvcl9zdHJfbm9uX3plcm8oc2VsZik6CisgICAgICAgIGVyciA9IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKDIsICJmYWtlIGNtZCIpCisgICAgICAgIGVycm9yX3N0cmluZyA9IHN0cihlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5vbi16ZXJvIGV4aXQgc3RhdHVzIDIuIiwgZXJyb3Jfc3RyaW5nKQorCiAgICAgZGVmIHRlc3RfcHJlZXhlYyhzZWxmKToKICAgICAgICAgIyBESVNDTEFJTUVSOiBTZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBpcyAqbm90KiBhIGdvb2QgdXNlCiAgICAgICAgICMgb2YgYSBwcmVleGVjX2ZuLiAgVGhpcyBpcyBtZXJlbHkgYSB0ZXN0LgpAQCAtMTQzOSw4ICsxNDU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKG9zLmdldGVudigiRlJVSVQiKSknXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZXhlY19mbj1sYW1iZGE6IG9zLnB1dGVudigiRlJVSVQiLCAiYXBwbGUiKSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgYiJhcHBsZSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLCBiImFwcGxlIikKIAogICAgIGRlZiB0ZXN0X3ByZWV4ZWNfZXhjZXB0aW9uKHNlbGYpOgogICAgICAgICBkZWYgcmFpc2VfaXQoKToKQEAgLTE1ODgsOCArMTYwNiw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsiZWNobyAkRlJVSVQiXSwgc2hlbGw9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW5ld2VudikKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcChiIiBcdFxyXG5cZiIpLCBiImFwcGxlIikKKyAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCkuc3RyaXAoYiIgXHRcclxuXGYiKSwgYiJhcHBsZSIpCiAKICAgICBkZWYgdGVzdF9zaGVsbF9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgUnVuIGNvbW1hbmQgdGhyb3VnaCB0aGUgc2hlbGwgKHN0cmluZykKQEAgLTE1OTgsOCArMTYxNiw4IEBACiAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCJlY2hvICRGUlVJVCIsIHNoZWxsPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCkuc3RyaXAoYiIgXHRcclxuXGYiKSwgYiJhcHBsZSIpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKGIiIFx0XHJcblxmIiksIGIiYXBwbGUiKQogCiAgICAgZGVmIHRlc3RfY2FsbF9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgY2FsbCgpIGZ1bmN0aW9uIHdpdGggc3RyaW5nIGFyZ3VtZW50IG9uIFVOSVgKQEAgLTE2MzEsOCArMTY0OSw4IEBACiAgICAgICAgIGZvciBzaCBpbiBzaGVsbHM6CiAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigiZWNobyAkMCIsIGV4ZWN1dGFibGU9c2gsIHNoZWxsPVRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCkuc3RyaXAoKSwgYnl0ZXMoc2gsICdhc2NpaScpKQorICAgICAgICAgICAgd2l0aCBwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKCksIGJ5dGVzKHNoLCAnYXNjaWknKSkKIAogICAgIGRlZiBfa2lsbF9wcm9jZXNzKHNlbGYsIG1ldGhvZCwgKmFyZ3MpOgogICAgICAgICAjIERvIG5vdCBpbmhlcml0IGZpbGUgaGFuZGxlcyBmcm9tIHRoZSBwYXJlbnQuCkBAIC0yMjkwLDcgKzIzMDgsOSBAQAogICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCiAgICAgICAgIGlkZW50ID0gaWQocCkKICAgICAgICAgcGlkID0gcC5waWQKLSAgICAgICAgZGVsIHAKKyAgICAgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgUmVzb3VyY2VXYXJuaW5nKSk6CisgICAgICAgICAgICBwID0gTm9uZQorCiAgICAgICAgICMgY2hlY2sgdGhhdCBwIGlzIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3QKICAgICAgICAgc2VsZi5hc3NlcnRJbihpZGVudCwgW2lkKG8pIGZvciBvIGluIHN1YnByb2Nlc3MuX2FjdGl2ZV0pCiAKQEAgLTIzMDksNyArMjMyOSw5IEBACiAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKICAgICAgICAgaWRlbnQgPSBpZChwKQogICAgICAgICBwaWQgPSBwLnBpZAotICAgICAgICBkZWwgcAorICAgICAgICB3aXRoIHN1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCcnLCBSZXNvdXJjZVdhcm5pbmcpKToKKyAgICAgICAgICAgIHAgPSBOb25lCisKICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdLSUxMKQogICAgICAgICAjIGNoZWNrIHRoYXQgcCBpcyBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0CiAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaWRlbnQsIFtpZChvKSBmb3IgbyBpbiBzdWJwcm9jZXNzLl9hY3RpdmVdKQpAQCAtMjUwMSw4ICsyNTIzLDggQEAKICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJzZXQiXSwgc2hlbGw9MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW5ld2VudikKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQotICAgICAgICBzZWxmLmFzc2VydEluKGIicGh5c2FsaXMiLCBwLnN0ZG91dC5yZWFkKCkpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYiJwaHlzYWxpcyIsIHAuc3Rkb3V0LnJlYWQoKSkKIAogICAgIGRlZiB0ZXN0X3NoZWxsX3N0cmluZyhzZWxmKToKICAgICAgICAgIyBSdW4gY29tbWFuZCB0aHJvdWdoIHRoZSBzaGVsbCAoc3RyaW5nKQpAQCAtMjUxMSw4ICsyNTMzLDggQEAKICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oInNldCIsIHNoZWxsPTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRJbihiInBoeXNhbGlzIiwgcC5zdGRvdXQucmVhZCgpKQorICAgICAgICB3aXRoIHA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGIicGh5c2FsaXMiLCBwLnN0ZG91dC5yZWFkKCkpCiAKICAgICBkZWYgdGVzdF9jYWxsX3N0cmluZyhzZWxmKToKICAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBzdHJpbmcgYXJndW1lbnQgb24gV2luZG93cwpAQCAtMjUzMSwxNiArMjU1MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRpbi5jbG9zZSkKLSAgICAgICAgIyBXYWl0IGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgY29tcGxldGVseSBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgIyBzZW5kaW5nIGFueSBzaWduYWwuCi0gICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKLSAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQotICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsIGInJykKLSAgICAgICAgcmV0dXJuY29kZSA9IHAud2FpdCgpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICAgICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKKyAgICAgICAgICAgIGdldGF0dHIocCwgbWV0aG9kKSgqYXJncykKKyAgICAgICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsIGInJykKKyAgICAgICAgICAgIHJldHVybmNvZGUgPSBwLndhaXQoKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJldHVybmNvZGUsIDApCiAKICAgICBkZWYgX2tpbGxfZGVhZF9wcm9jZXNzKHNlbGYsIG1ldGhvZCwgKmFyZ3MpOgpAQCAtMjU1MywxOSArMjU3MywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQotICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRpbi5jbG9zZSkKLSAgICAgICAgIyBXYWl0IGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgY29tcGxldGVseSBpbml0aWFsaXplZCBiZWZvcmUKLSAgICAgICAgIyBzZW5kaW5nIGFueSBzaWduYWwuCi0gICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKLSAgICAgICAgIyBUaGUgcHJvY2VzcyBzaG91bGQgZW5kIGFmdGVyIHRoaXMKLSAgICAgICAgdGltZS5zbGVlcCgxKQotICAgICAgICAjIFRoaXMgc2hvdWxkbid0IHJhaXNlIGV2ZW4gdGhvdWdoIHRoZSBjaGlsZCBpcyBub3cgZGVhZAotICAgICAgICBnZXRhdHRyKHAsIG1ldGhvZCkoKmFyZ3MpCi0gICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQotICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgYicnKQotICAgICAgICByYyA9IHAud2FpdCgpCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICAgICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKKyAgICAgICAgICAgICMgVGhlIHByb2Nlc3Mgc2hvdWxkIGVuZCBhZnRlciB0aGlzCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICAgICAjIFRoaXMgc2hvdWxkbid0IHJhaXNlIGV2ZW4gdGhvdWdoIHRoZSBjaGlsZCBpcyBub3cgZGVhZAorICAgICAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQorICAgICAgICAgICAgXywgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgYicnKQorICAgICAgICAgICAgcmMgPSBwLndhaXQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCA0MikKIAogICAgIGRlZiB0ZXN0X3NlbmRfc2lnbmFsKHNlbGYpOgpAQCAtMjYwOCw4ICsyNjI2LDcgQEAKIAogICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKICAgICAgICAgIiIiRW5zdXJlIHRoYXQgX19hbGxfXyBpcyBwb3B1bGF0ZWQgcHJvcGVybHkuIiIiCi0gICAgICAgICMgU1RBUlRVUElORk8gYWRkZWQgdG8gX19hbGxfXyBpbiAzLjYKLSAgICAgICAgaW50ZW50aW9uYWxseV9leGNsdWRlZCA9IHsibGlzdDJjbWRsaW5lIiwgIlNUQVJUVVBJTkZPIiwgIkhhbmRsZSJ9CisgICAgICAgIGludGVudGlvbmFsbHlfZXhjbHVkZWQgPSB7Imxpc3QyY21kbGluZSIsICJIYW5kbGUifQogICAgICAgICBleHBvcnRlZCA9IHNldChzdWJwcm9jZXNzLl9fYWxsX18pCiAgICAgICAgIHBvc3NpYmxlX2V4cG9ydHMgPSBzZXQoKQogICAgICAgICBpbXBvcnQgdHlwZXMKQEAgLTI2NTQsMTEgKzI2NzEsMTEgQEAKICAgICBkZWYgd2l0aF9zcGFjZXMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAga3dhcmdzWydzdGRvdXQnXSA9IHN1YnByb2Nlc3MuUElQRQogICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigqYXJncywgKiprd2FyZ3MpCi0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgICBwLnN0ZG91dC5yZWFkICgpLmRlY29kZSgibWJjcyIpLAotICAgICAgICAgICIyIFslciwgJ2FiIGNkJ10iICUgc2VsZi5mbmFtZQotICAgICAgICApCisgICAgICAgIHdpdGggcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgIHAuc3Rkb3V0LnJlYWQgKCkuZGVjb2RlKCJtYmNzIiksCisgICAgICAgICAgICAgICIyIFslciwgJ2FiIGNkJ10iICUgc2VsZi5mbmFtZQorICAgICAgICAgICAgKQogCiAgICAgZGVmIHRlc3Rfc2hlbGxfc3RyaW5nX3dpdGhfc3BhY2VzKHNlbGYpOgogICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHN0cmluZyBhcmd1bWVudCB3aXRoIHNwYWNlcyBvbiBXaW5kb3dzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1bmF1LnB5IGIvTGliL3Rlc3QvdGVzdF9zdW5hdS5weQppbmRleCAwZjQxMzRlLi5iYzFmNDZjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N1bmF1LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VuYXUucHkKQEAgLTEsNCArMSwzIEBACi1mcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgVEVTVEZOCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgYXVkaW90ZXN0cwogZnJvbSBhdWRpb29wIGltcG9ydCBieXRlc3dhcApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CmluZGV4IDJjMDA0MTcuLjI2OWQ5YmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTksMTMgKzksMTEgQEAKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCiBURVNURk4gPSBzdXBwb3J0LlRFU1RGTgotVEVTVERJUk4gPSBvcy5wYXRoLmJhc2VuYW1lKHRlbXBmaWxlLm1rZHRlbXAoZGlyPScuJykpCiAKIAogY2xhc3MgVGVzdFN1cHBvcnQodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc3VwcG9ydC51bmxpbmsoVEVTVEZOKQotICAgICAgICBzdXBwb3J0LnJtdHJlZShURVNURElSTikKICAgICB0ZWFyRG93biA9IHNldFVwCiAKICAgICBkZWYgdGVzdF9pbXBvcnRfbW9kdWxlKHNlbGYpOgpAQCAtNDgsNiArNDYsMTAgQEAKICAgICAgICAgc3VwcG9ydC51bmxpbmsoVEVTVEZOKQogCiAgICAgZGVmIHRlc3Rfcm10cmVlKHNlbGYpOgorICAgICAgICBURVNURElSTiA9IG9zLnBhdGguYmFzZW5hbWUodGVtcGZpbGUubWtkdGVtcChkaXI9Jy4nKSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQucm10cmVlLCBURVNURElSTikKKyAgICAgICAgc3VwcG9ydC5ybXRyZWUoVEVTVERJUk4pCisKICAgICAgICAgb3MubWtkaXIoVEVTVERJUk4pCiAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihURVNURElSTiwgVEVTVERJUk4pKQogICAgICAgICBzdXBwb3J0LnJtdHJlZShURVNURElSTikKQEAgLTIyOCw3ICsyMzAsOCBAQAogCiAgICAgZGVmIHRlc3RfY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYpOgogICAgICAgICBzdXBwb3J0LmNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZGVmIGNsYXNzIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHN1cHBvcnQuY2hlY2tfc3ludGF4X2Vycm9yLCBzZWxmLCAiMSIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgc3VwcG9ydC5jaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIng9MSIpCiAKICAgICBkZWYgdGVzdF9DbGVhbkltcG9ydChzZWxmKToKICAgICAgICAgaW1wb3J0IGltcG9ydGxpYgpAQCAtMzEyLDYgKzMxNSwyOCBAQAogICAgICAgICAgICAgICAgIHNlbGYuT3RoZXJDbGFzcywgc2VsZi5SZWZDbGFzcywgaWdub3JlPWlnbm9yZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoKSwgbWlzc2luZ19pdGVtcykKIAorICAgIGRlZiB0ZXN0X2NoZWNrX19hbGxfXyhzZWxmKToKKyAgICAgICAgZXh0cmEgPSB7J3RlbXBkaXInfQorICAgICAgICBibGFja2xpc3QgPSB7J3RlbXBsYXRlJ30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisgICAgICAgIGV4dHJhID0geydUZXh0VGVzdFJlc3VsdCcsICdpbnN0YWxsSGFuZGxlcid9CisgICAgICAgIGJsYWNrbGlzdCA9IHsnbG9hZF90ZXN0cycsICJUZXN0UHJvZ3JhbSIsICJCYXNlVGVzdFN1aXRlIn0KKworICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ1bml0dGVzdC5yZXN1bHQiLCAidW5pdHRlc3QuY2FzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pdHRlc3Quc3VpdGUiLCAidW5pdHRlc3QubG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bml0dGVzdC5tYWluIiwgInVuaXR0ZXN0LnJ1bm5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pdHRlc3Quc2lnbmFscyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYT1leHRyYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxhY2tsaXN0PWJsYWNrbGlzdCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgc3VwcG9ydC5jaGVja19fYWxsX18sIHNlbGYsIHVuaXR0ZXN0KQorCiAgICAgIyBYWFggLWZvbGxvd3MgYSBsaXN0IG9mIHVudGVzdGVkIEFQSQogICAgICMgbWFrZV9sZWdhY3lfcHljCiAgICAgIyBpc19yZXNvdXJjZV9lbmFibGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5bWJvbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3ltYm9sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzA2ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3N5bWJvbC5weQpAQCAtMCwwICsxLDU0IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3VicHJvY2VzcworCisKK1NZTUJPTF9GSUxFICAgICAgICAgICAgICA9IHN1cHBvcnQuZmluZGZpbGUoJ3N5bWJvbC5weScpCitHUkFNTUFSX0ZJTEUgICAgICAgICAgICAgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLi4nLCAnLi4nLCAnSW5jbHVkZScsICdncmFtaW5pdC5oJykKK1RFU1RfUFlfRklMRSAgICAgICAgICAgICA9ICdzeW1ib2xfdGVzdC5weScKKworCitjbGFzcyBUZXN0U3ltYm9sR2VuZXJhdGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2NvcHlfZmlsZV93aXRob3V0X2dlbmVyYXRlZF9zeW1ib2xzKHNlbGYsIHNvdXJjZV9maWxlLCBkZXN0X2ZpbGUpOgorICAgICAgICB3aXRoIG9wZW4oc291cmNlX2ZpbGUpIGFzIGZwOgorICAgICAgICAgICAgbGluZXMgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICB3aXRoIG9wZW4oZGVzdF9maWxlLCAndycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGVsaW5lcyhsaW5lc1s6bGluZXMuaW5kZXgoIiMtLXN0YXJ0IGNvbnN0YW50cy0tXG4iKSArIDFdKQorICAgICAgICAgICAgZnAud3JpdGVsaW5lcyhsaW5lc1tsaW5lcy5pbmRleCgiIy0tZW5kIGNvbnN0YW50cy0tXG4iKTpdKQorCisgICAgZGVmIF9nZW5lcmF0ZV9zeW1ib2xzKHNlbGYsIGdyYW1tYXJfZmlsZSwgdGFyZ2V0X3N5bWJvbF9weV9maWxlKToKKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lNQk9MX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfc3ltYm9sX3B5X2ZpbGVdLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzdGRlcnIgPSBwcm9jLmNvbW11bmljYXRlKClbMV0KKyAgICAgICAgcmV0dXJuIHByb2MucmV0dXJuY29kZSwgc3RkZXJyCisKKyAgICBkZWYgY29tcGFyZV9maWxlcyhzZWxmLCBmaWxlMSwgZmlsZTIpOgorICAgICAgICB3aXRoIG9wZW4oZmlsZTEpIGFzIGZwOgorICAgICAgICAgICAgbGluZXMxID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGUyKSBhcyBmcDoKKyAgICAgICAgICAgIGxpbmVzMiA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMxLCBsaW5lczIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG5vdCBvcy5wYXRoLmV4aXN0cyhHUkFNTUFSX0ZJTEUpLAorICAgICAgICAgICAgICAgICAgICAgJ3Rlc3Qgb25seSB3b3JrcyBmcm9tIHNvdXJjZSBidWlsZCBkaXJlY3RvcnknKQorICAgIGRlZiB0ZXN0X3JlYWxfZ3JhbW1hcl9hbmRfc3ltYm9sX2ZpbGUoc2VsZik6CisgICAgICAgIG91dHB1dCA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgb3V0cHV0KQorCisgICAgICAgIHNlbGYuX2NvcHlfZmlsZV93aXRob3V0X2dlbmVyYXRlZF9zeW1ib2xzKFNZTUJPTF9GSUxFLCBvdXRwdXQpCisKKyAgICAgICAgZXhpdGNvZGUsIHN0ZGVyciA9IHNlbGYuX2dlbmVyYXRlX3N5bWJvbHMoR1JBTU1BUl9GSUxFLCBvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXhpdGNvZGUpCisKKyAgICAgICAgc2VsZi5jb21wYXJlX2ZpbGVzKFNZTUJPTF9GSUxFLCBvdXRwdXQpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3ludGF4LnB5IGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKaW5kZXggODNmNDlmNi4uZjQ3YmRmOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zeW50YXgucHkKQEAgLTM1LDE0ICszNSw2IEBACiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGtleXdvcmQKIAotSXQncyBhIHN5bnRheCBlcnJvciB0byBhc3NpZ24gdG8gdGhlIGVtcHR5IHR1cGxlLiAgV2h5IGlzbid0IGl0IGFuCi1lcnJvciB0byBhc3NpZ24gdG8gdGhlIGVtcHR5IGxpc3Q/ICBJdCB3aWxsIGFsd2F5cyByYWlzZSBzb21lIGVycm9yIGF0Ci1ydW50aW1lLgotCi0+Pj4gKCkgPSAxCi1UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci1TeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvICgpCi0KID4+PiBmKCkgPSAxCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGZ1bmN0aW9uIGNhbGwKQEAgLTQ5MywxMCArNDg1LDYgQEAKICAgIC4uLgogU3ludGF4RXJyb3I6IGtleXdvcmQgYXJndW1lbnQgcmVwZWF0ZWQKIAotPj4+IGRlbCAoKQotVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgotU3ludGF4RXJyb3I6IGNhbid0IGRlbGV0ZSAoKQotCiA+Pj4gezEsIDIsIDN9ID0gNDIKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gbGl0ZXJhbApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkgYi9MaWIvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weQppbmRleCA1MDliYzNlLi4yNWM1ODM1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weQpAQCAtMzM4LDggKzMzOCw4IEBACiAKICAgICBkZWYgdGVzdF8xNF9vbmxpbmVyX2lmKHNlbGYpOgogICAgICAgICBkZWYgb25saW5lcnMoKToKLSAgICAgICAgICAgIGlmIFRydWU6IEZhbHNlCi0gICAgICAgICAgICBlbHNlOiBUcnVlCisgICAgICAgICAgICBpZiBUcnVlOiB4PUZhbHNlCisgICAgICAgICAgICBlbHNlOiB4PVRydWUKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIHNlbGYucnVuX2FuZF9jb21wYXJlKAogICAgICAgICAgICAgb25saW5lcnMsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKaW5kZXggYWJmYjM0ZC4uZDc3ODVjZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQpAQCAtMjA3NCw2ICsyMDc0LDI0IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CiAgICAgICAgICAgICB0YXJmaWxlLml0bigweDEwMDAwMDAwMDAwLCA2LCB0YXJmaWxlLkdOVV9GT1JNQVQpCiAKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIGJsYWNrbGlzdCA9IHsndmVyc2lvbicsICdncnAnLCAncHdkJywgJ3N5bWxpbmtfZXhjZXB0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICdOVUwnLCAnQkxPQ0tTSVpFJywgJ1JFQ09SRFNJWkUnLCAnR05VX01BR0lDJywKKyAgICAgICAgICAgICAgICAgICAgICdQT1NJWF9NQUdJQycsICdMRU5HVEhfTkFNRScsICdMRU5HVEhfTElOSycsCisgICAgICAgICAgICAgICAgICAgICAnTEVOR1RIX1BSRUZJWCcsICdSRUdUWVBFJywgJ0FSRUdUWVBFJywgJ0xOS1RZUEUnLAorICAgICAgICAgICAgICAgICAgICAgJ1NZTVRZUEUnLCAnQ0hSVFlQRScsICdCTEtUWVBFJywgJ0RJUlRZUEUnLCAnRklGT1RZUEUnLAorICAgICAgICAgICAgICAgICAgICAgJ0NPTlRUWVBFJywgJ0dOVVRZUEVfTE9OR05BTUUnLCAnR05VVFlQRV9MT05HTElOSycsCisgICAgICAgICAgICAgICAgICAgICAnR05VVFlQRV9TUEFSU0UnLCAnWEhEVFlQRScsICdYR0xUWVBFJywgJ1NPTEFSSVNfWEhEVFlQRScsCisgICAgICAgICAgICAgICAgICAgICAnU1VQUE9SVEVEX1RZUEVTJywgJ1JFR1VMQVJfVFlQRVMnLCAnR05VX1RZUEVTJywKKyAgICAgICAgICAgICAgICAgICAgICdQQVhfRklFTERTJywgJ1BBWF9OQU1FX0ZJRUxEUycsICdQQVhfTlVNQkVSX0ZJRUxEUycsCisgICAgICAgICAgICAgICAgICAgICAnc3RuJywgJ250cycsICdudGknLCAnaXRuJywgJ2NhbGNfY2hrc3VtcycsICdjb3B5ZmlsZW9iaicsCisgICAgICAgICAgICAgICAgICAgICAnZmlsZW1vZGUnLAorICAgICAgICAgICAgICAgICAgICAgJ0VtcHR5SGVhZGVyRXJyb3InLCAnVHJ1bmNhdGVkSGVhZGVyRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgJ0VPRkhlYWRlckVycm9yJywgJ0ludmFsaWRIZWFkZXJFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICAnU3Vic2VxdWVudEhlYWRlckVycm9yJywgJ0V4RmlsZU9iamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAnbWFpbid9CisgICAgICAgIHN1cHBvcnQuY2hlY2tfX2FsbF9fKHNlbGYsIHRhcmZpbGUsIGJsYWNrbGlzdD1ibGFja2xpc3QpCisKIAogY2xhc3MgQ29tbWFuZExpbmVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkgYi9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQppbmRleCA4ZTIxOWY0Li41MWQ4MmUxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQpAQCAtMSw3ICsxLDYgQEAKIGltcG9ydCBzb2NrZXQKIGltcG9ydCBzZWxlY3RvcnMKIGltcG9ydCB0ZWxuZXRsaWIKLWltcG9ydCB0aW1lCiBpbXBvcnQgY29udGV4dGxpYgogCiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKQEAgLTQyLDYgKzQxLDExIEBACiAgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQogICAgICAgICB0ZWxuZXQuc29jay5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdENvbnRleHRNYW5hZ2VyKHNlbGYpOgorICAgICAgICB3aXRoIHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KSBhcyB0bjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHRuLmdldF9zb2NrZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUodG4uZ2V0X3NvY2tldCgpKQorCiAgICAgZGVmIHRlc3RUaW1lb3V0RGVmYXVsdChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKaW5kZXggMWM5YzFlYS4uYTRhYTQ5ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKQEAgLTgsNyArOCw2IEBACiBmcm9tIHRlc3Quc3VwcG9ydC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rLCBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUKIAogaW1wb3J0IHJhbmRvbQotaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiBfdGhyZWFkID0gaW1wb3J0X21vZHVsZSgnX3RocmVhZCcpCiB0aHJlYWRpbmcgPSBpbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQpAQCAtMTksNiArMTgsNyBAQAogaW1wb3J0IHN1YnByb2Nlc3MKIAogZnJvbSB0ZXN0IGltcG9ydCBsb2NrX3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAogCiAjIEJldHdlZW4gZm9yaygpIGFuZCBleGVjKCksIG9ubHkgYXN5bmMtc2FmZSBmdW5jdGlvbnMgYXJlIGFsbG93ZWQgKGlzc3VlcwpAQCAtMTA5OSw1ICsxMDk5LDEyIEBACiBjbGFzcyBCYXJyaWVyVGVzdHMobG9ja190ZXN0cy5CYXJyaWVyVGVzdHMpOgogICAgIGJhcnJpZXJ0eXBlID0gc3RhdGljbWV0aG9kKHRocmVhZGluZy5CYXJyaWVyKQogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgZXh0cmEgPSB7IlRocmVhZEVycm9yIn0KKyAgICAgICAgYmxhY2tsaXN0ID0geydjdXJyZW50VGhyZWFkJywgJ2FjdGl2ZUNvdW50J30KKyAgICAgICAgc3VwcG9ydC5jaGVja19fYWxsX18oc2VsZiwgdGhyZWFkaW5nLCAoJ3RocmVhZGluZycsICdfdGhyZWFkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhPWV4dHJhLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CmluZGV4IDc2Yjg5NGUuLmY4ODNjNDUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKQEAgLTEsNiArMSw4IEBACiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKK2ltcG9ydCBkZWNpbWFsCiBpbXBvcnQgZW51bQogaW1wb3J0IGxvY2FsZQoraW1wb3J0IG1hdGgKIGltcG9ydCBwbGF0Zm9ybQogaW1wb3J0IHN5cwogaW1wb3J0IHN5c2NvbmZpZwpAQCAtMjEsMTcgKzIzLDI3IEBACiBUSU1FX01BWFlFQVIgPSAoMSA8PCA4ICogU0laRU9GX0lOVCAtIDEpIC0gMQogVElNRV9NSU5ZRUFSID0gLVRJTUVfTUFYWUVBUiAtIDEKIAorU0VDX1RPX1VTID0gMTAgKiogNgogVVNfVE9fTlMgPSAxMCAqKiAzCiBNU19UT19OUyA9IDEwICoqIDYKIFNFQ19UT19OUyA9IDEwICoqIDkKK05TX1RPX1NFQyA9IDEwICoqIDkKIAogY2xhc3MgX1B5VGltZShlbnVtLkludEVudW0pOgogICAgICMgUm91bmQgdG93YXJkcyBtaW51cyBpbmZpbml0eSAoLWluZikKICAgICBST1VORF9GTE9PUiA9IDAKICAgICAjIFJvdW5kIHRvd2FyZHMgaW5maW5pdHkgKCtpbmYpCiAgICAgUk9VTkRfQ0VJTElORyA9IDEKKyAgICAjIFJvdW5kIHRvIG5lYXJlc3Qgd2l0aCB0aWVzIGdvaW5nIHRvIG5lYXJlc3QgZXZlbiBpbnRlZ2VyCisgICAgUk9VTkRfSEFMRl9FVkVOID0gMgogCi1BTExfUk9VTkRJTkdfTUVUSE9EUyA9IChfUHlUaW1lLlJPVU5EX0ZMT09SLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpCisjIFJvdW5kaW5nIG1vZGVzIHN1cHBvcnRlZCBieSBQeVRpbWUKK1JPVU5ESU5HX01PREVTID0gKAorICAgICMgKFB5VGltZSByb3VuZGluZyBtZXRob2QsIGRlY2ltYWwgcm91bmRpbmcgbWV0aG9kKQorICAgIChfUHlUaW1lLlJPVU5EX0ZMT09SLCBkZWNpbWFsLlJPVU5EX0ZMT09SKSwKKyAgICAoX1B5VGltZS5ST1VORF9DRUlMSU5HLCBkZWNpbWFsLlJPVU5EX0NFSUxJTkcpLAorICAgIChfUHlUaW1lLlJPVU5EX0hBTEZfRVZFTiwgZGVjaW1hbC5ST1VORF9IQUxGX0VWRU4pLAorKQogCiAKIGNsYXNzIFRpbWVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC02MDcsNzkgKzYxOSw2IEBACiAKIAogY2xhc3MgVGVzdFB5dGltZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLmludmFsaWRfdmFsdWVzID0gKAotICAgICAgICAgICAgLSgyICoqIDEwMCksIDIgKiogMTAwLAotICAgICAgICAgICAgLSgyLjAgKiogMTAwLjApLCAyLjAgKiogMTAwLjAsCi0gICAgICAgICkKLQotICAgIEBzdXBwb3J0LmNweXRob25fb25seQotICAgIGRlZiB0ZXN0X3RpbWVfdChzZWxmKToKLSAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZV90Ci0gICAgICAgIGZvciBvYmosIHRpbWVfdCwgcm5kIGluICgKLSAgICAgICAgICAgICMgUm91bmQgdG93YXJkcyBtaW51cyBpbmZpbml0eSAoLWluZikKLSAgICAgICAgICAgICgwLCAwLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMSwgLTEsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjAsIC0xLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS45LCAtMiwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMS4wLCAxLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgxLjksIDEsIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgIyBSb3VuZCB0b3dhcmRzIGluZmluaXR5ICgraW5mKQotICAgICAgICAgICAgKDAsIDAsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsIC0xLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjAsIC0xLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xLjksIC0xLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDEuMCwgMSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxLjksIDIsIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5dGltZV9vYmplY3RfdG9fdGltZV90KG9iaiwgcm5kKSwgdGltZV90KQotCi0gICAgICAgIHJuZCA9IF9QeVRpbWUuUk9VTkRfRkxPT1IKLSAgICAgICAgZm9yIGludmFsaWQgaW4gc2VsZi5pbnZhbGlkX3ZhbHVlczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXRpbWVfb2JqZWN0X3RvX3RpbWVfdCwgaW52YWxpZCwgcm5kKQotCi0gICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5Ci0gICAgZGVmIHRlc3RfdGltZXNwZWMoc2VsZik6Ci0gICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjCi0gICAgICAgIGZvciBvYmosIHRpbWVzcGVjLCBybmQgaW4gKAotICAgICAgICAgICAgIyBSb3VuZCB0b3dhcmRzIG1pbnVzIGluZmluaXR5ICgtaW5mKQotICAgICAgICAgICAgKDAsICgwLCAwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEsICgtMSwgMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjAsICgtMSwgMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKDFlLTksICgwLCAxKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMWUtMTAsICgwLCAwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTFlLTksICgtMSwgOTk5OTk5OTk5KSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTFlLTEwLCAoLTEsIDk5OTk5OTk5OSksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgKC0xLjIsICgtMiwgODAwMDAwMDAwKSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMC45OTk5OTk5OTk5LCAoMCwgOTk5OTk5OTk5KSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMS4xMjM0NTY3ODkwLCAoMSwgMTIzNDU2Nzg5KSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoMS4xMjM0NTY3ODk5LCAoMSwgMTIzNDU2Nzg5KSwgX1B5VGltZS5ST1VORF9GTE9PUiksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5MCwgKC0yLCA4NzY1NDMyMTEpLCBfUHlUaW1lLlJPVU5EX0ZMT09SKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODkxLCAoLTIsIDg3NjU0MzIxMCksIF9QeVRpbWUuUk9VTkRfRkxPT1IpLAotICAgICAgICAgICAgIyBSb3VuZCB0b3dhcmRzIGluZmluaXR5ICgraW5mKQotICAgICAgICAgICAgKDAsICgwLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgKC0xLCAwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4wLCAoLTEsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDFlLTksICgwLCAxKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgxZS0xMCwgKDAsIDEpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKC0xZS05LCAoLTEsIDk5OTk5OTk5OSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTFlLTEwLCAoMCwgMCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMiwgKC0yLCA4MDAwMDAwMDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDAuOTk5OTk5OTk5OSwgKDEsIDApLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICAgICAgKDEuMTIzNDU2Nzg5MCwgKDEsIDEyMzQ1Njc5MCksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoMS4xMjM0NTY3ODk5LCAoMSwgMTIzNDU2NzkwKSwgX1B5VGltZS5ST1VORF9DRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODkwLCAoLTIsIDg3NjU0MzIxMSksIF9QeVRpbWUuUk9VTkRfQ0VJTElORyksCi0gICAgICAgICAgICAoLTEuMTIzNDU2Nzg5MSwgKC0yLCA4NzY1NDMyMTEpLCBfUHlUaW1lLlJPVU5EX0NFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob2JqPW9iaiwgcm91bmQ9cm5kLCB0aW1lc3BlYz10aW1lc3BlYyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjKG9iaiwgcm5kKSwgdGltZXNwZWMpCi0KLSAgICAgICAgcm5kID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBmb3IgaW52YWxpZCBpbiBzZWxmLmludmFsaWRfdmFsdWVzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMsIGludmFsaWQsIHJuZCkKLQogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRpbWUuX1NUUlVDVF9UTV9JVEVNUyA9PSAxMSwgIm5lZWRzIHRtX3pvbmUgc3VwcG9ydCIpCiAgICAgZGVmIHRlc3RfbG9jYWx0aW1lX3RpbWV6b25lKHNlbGYpOgogCkBAIC03MzQsMjY2ICs2NzMsMjkxIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0SXMobHQudG1fem9uZSwgTm9uZSkKIAogCi1AdW5pdHRlc3Quc2tpcFVubGVzcyhfdGVzdGNhcGkgaXMgbm90IE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAnbmVlZCB0aGUgX3Rlc3RjYXBpIG1vZHVsZScpCi1jbGFzcyBUZXN0UHlUaW1lX3QodW5pdHRlc3QuVGVzdENhc2UpOgorQHVuaXR0ZXN0LnNraXBJZihfdGVzdGNhcGkgaXMgTm9uZSwgJ25lZWQgdGhlIF90ZXN0Y2FwaSBtb2R1bGUnKQorY2xhc3MgQ1B5VGltZVRlc3RDYXNlOgorICAgICIiIgorICAgIEJhc2UgY2xhc3MgdG8gdGVzdCB0aGUgQyBfUHlUaW1lX3QgQVBJLgorICAgICIiIgorICAgIE9WRVJGTE9XX1NFQ09ORFMgPSBOb25lCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBTSVpFT0ZfVElNRV9UCisgICAgICAgIGJpdHMgPSBTSVpFT0ZfVElNRV9UICogOCAtIDEKKyAgICAgICAgc2VsZi50aW1lX3RfbWluID0gLTIgKiogYml0cworICAgICAgICBzZWxmLnRpbWVfdF9tYXggPSAyICoqIGJpdHMgLSAxCisKKyAgICBkZWYgdGltZV90X2ZpbHRlcihzZWxmLCBzZWNvbmRzKToKKyAgICAgICAgcmV0dXJuIChzZWxmLnRpbWVfdF9taW4gPD0gc2Vjb25kcyA8PSBzZWxmLnRpbWVfdF9tYXgpCisKKyAgICBkZWYgX3JvdW5kaW5nX3ZhbHVlcyhzZWxmLCB1c2VfZmxvYXQpOgorICAgICAgICAiQnVpbGQgdGltZXN0YW1wcyB1c2VkIHRvIHRlc3Qgcm91bmRpbmcuIgorCisgICAgICAgIHVuaXRzID0gWzEsIFVTX1RPX05TLCBNU19UT19OUywgU0VDX1RPX05TXQorICAgICAgICBpZiB1c2VfZmxvYXQ6CisgICAgICAgICAgICAjIHBpY29zZWNvbmRzIGFyZSBvbmx5IHRlc3RlZCB0byBweXRpbWVfY29udmVydGVyIGFjY2VwdGluZyBmbG9hdHMKKyAgICAgICAgICAgIHVuaXRzLmFwcGVuZCgxZS0zKQorCisgICAgICAgIHZhbHVlcyA9ICgKKyAgICAgICAgICAgICMgc21hbGwgdmFsdWVzCisgICAgICAgICAgICAxLCAyLCA1LCA3LCAxMjMsIDQ1NiwgMTIzNCwKKyAgICAgICAgICAgICMgMTBeayAtIDEKKyAgICAgICAgICAgIDksCisgICAgICAgICAgICA5OSwKKyAgICAgICAgICAgIDk5OSwKKyAgICAgICAgICAgIDk5OTksCisgICAgICAgICAgICA5OTk5OSwKKyAgICAgICAgICAgIDk5OTk5OSwKKyAgICAgICAgICAgICMgdGVzdCBoYWxmIGV2ZW4gcm91bmRpbmcgbmVhciAwLjUsIDEuNSwgMi41LCAzLjUsIDQuNQorICAgICAgICAgICAgNDk5LCA1MDAsIDUwMSwKKyAgICAgICAgICAgIDE0OTksIDE1MDAsIDE1MDEsCisgICAgICAgICAgICAyNTAwLAorICAgICAgICAgICAgMzUwMCwKKyAgICAgICAgICAgIDQ1MDAsCisgICAgICAgICkKKworICAgICAgICBuc190aW1lc3RhbXBzID0gWzBdCisgICAgICAgIGZvciB1bml0IGluIHVuaXRzOgorICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlczoKKyAgICAgICAgICAgICAgICBucyA9IHZhbHVlICogdW5pdAorICAgICAgICAgICAgICAgIG5zX3RpbWVzdGFtcHMuZXh0ZW5kKCgtbnMsIG5zKSkKKyAgICAgICAgZm9yIHBvdzIgaW4gKDAsIDUsIDEwLCAxNSwgMjIsIDIzLCAyNCwgMzAsIDMzKToKKyAgICAgICAgICAgIG5zID0gKDIgKiogcG93MikgKiBTRUNfVE9fTlMKKyAgICAgICAgICAgIG5zX3RpbWVzdGFtcHMuZXh0ZW5kKCgKKyAgICAgICAgICAgICAgICAtbnMtMSwgLW5zLCAtbnMrMSwKKyAgICAgICAgICAgICAgICBucy0xLCBucywgbnMrMQorICAgICAgICAgICAgKSkKKyAgICAgICAgZm9yIHNlY29uZHMgaW4gKF90ZXN0Y2FwaS5JTlRfTUlOLCBfdGVzdGNhcGkuSU5UX01BWCk6CisgICAgICAgICAgICBuc190aW1lc3RhbXBzLmFwcGVuZChzZWNvbmRzICogU0VDX1RPX05TKQorICAgICAgICBpZiB1c2VfZmxvYXQ6CisgICAgICAgICAgICAjIG51bWJlcnMgd2l0aCBhbiBleHRyYWN0IHJlcHJlc2VudGF0aW9uIGluIElFRUUgNzU0IChiYXNlIDIpCisgICAgICAgICAgICBmb3IgcG93MiBpbiAoMywgNywgMTAsIDE1KToKKyAgICAgICAgICAgICAgICBucyA9IDIuMCAqKiAoLXBvdzIpCisgICAgICAgICAgICAgICAgbnNfdGltZXN0YW1wcy5leHRlbmQoKC1ucywgbnMpKQorCisgICAgICAgICMgc2Vjb25kcyBjbG9zZSB0byBfUHlUaW1lX3QgdHlwZSBsaW1pdAorICAgICAgICBucyA9ICgyICoqIDYzIC8vIFNFQ19UT19OUykgKiBTRUNfVE9fTlMKKyAgICAgICAgbnNfdGltZXN0YW1wcy5leHRlbmQoKC1ucywgbnMpKQorCisgICAgICAgIHJldHVybiBuc190aW1lc3RhbXBzCisKKyAgICBkZWYgX2NoZWNrX3JvdW5kaW5nKHNlbGYsIHB5dGltZV9jb252ZXJ0ZXIsIGV4cGVjdGVkX2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfZmxvYXQsIHVuaXRfdG9fc2VjLCB2YWx1ZV9maWx0ZXI9Tm9uZSk6CisKKyAgICAgICAgZGVmIGNvbnZlcnRfdmFsdWVzKG5zX3RpbWVzdGFtcHMpOgorICAgICAgICAgICAgaWYgdXNlX2Zsb2F0OgorICAgICAgICAgICAgICAgIHVuaXRfdG9fbnMgPSBTRUNfVE9fTlMgLyBmbG9hdCh1bml0X3RvX3NlYykKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbbnMgLyB1bml0X3RvX25zIGZvciBucyBpbiBuc190aW1lc3RhbXBzXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1bml0X3RvX25zID0gU0VDX1RPX05TIC8vIHVuaXRfdG9fc2VjCisgICAgICAgICAgICAgICAgdmFsdWVzID0gW25zIC8vIHVuaXRfdG9fbnMgZm9yIG5zIGluIG5zX3RpbWVzdGFtcHNdCisKKyAgICAgICAgICAgIGlmIHZhbHVlX2ZpbHRlcjoKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBmaWx0ZXIodmFsdWVfZmlsdGVyLCB2YWx1ZXMpCisKKyAgICAgICAgICAgICMgcmVtb3ZlIGR1cGxpY2F0ZXMgYW5kIHNvcnQKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoc2V0KHZhbHVlcykpCisKKyAgICAgICAgIyB0ZXN0IHJvdW5kaW5nCisgICAgICAgIG5zX3RpbWVzdGFtcHMgPSBzZWxmLl9yb3VuZGluZ192YWx1ZXModXNlX2Zsb2F0KQorICAgICAgICB2YWxpZF92YWx1ZXMgPSBjb252ZXJ0X3ZhbHVlcyhuc190aW1lc3RhbXBzKQorICAgICAgICBmb3IgdGltZV9ybmQsIGRlY2ltYWxfcm5kIGluIFJPVU5ESU5HX01PREVTIDoKKyAgICAgICAgICAgIGNvbnRleHQgPSBkZWNpbWFsLmdldGNvbnRleHQoKQorICAgICAgICAgICAgY29udGV4dC5yb3VuZGluZyA9IGRlY2ltYWxfcm5kCisKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWxpZF92YWx1ZXM6CisgICAgICAgICAgICAgICAgZGVidWdfaW5mbyA9IHsndmFsdWUnOiB2YWx1ZSwgJ3JvdW5kaW5nJzogZGVjaW1hbF9ybmR9CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBweXRpbWVfY29udmVydGVyKHZhbHVlLCB0aW1lX3JuZCkKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZF9mdW5jKHZhbHVlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIG9uIHRpbWVzdGFtcCBjb252ZXJzaW9uOiAlcyIgJSBkZWJ1Z19pbmZvKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19pbmZvKQorCisgICAgICAgICMgdGVzdCBvdmVyZmxvdworICAgICAgICBucyA9IHNlbGYuT1ZFUkZMT1dfU0VDT05EUyAqIFNFQ19UT19OUworICAgICAgICBuc190aW1lc3RhbXBzID0gKC1ucywgbnMpCisgICAgICAgIG92ZXJmbG93X3ZhbHVlcyA9IGNvbnZlcnRfdmFsdWVzKG5zX3RpbWVzdGFtcHMpCisgICAgICAgIGZvciB0aW1lX3JuZCwgXyBpbiBST1VORElOR19NT0RFUyA6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gb3ZlcmZsb3dfdmFsdWVzOgorICAgICAgICAgICAgICAgIGRlYnVnX2luZm8gPSB7J3ZhbHVlJzogdmFsdWUsICdyb3VuZGluZyc6IHRpbWVfcm5kfQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbXNnPWRlYnVnX2luZm8pOgorICAgICAgICAgICAgICAgICAgICBweXRpbWVfY29udmVydGVyKHZhbHVlLCB0aW1lX3JuZCkKKworICAgIGRlZiBjaGVja19pbnRfcm91bmRpbmcoc2VsZiwgcHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfdG9fc2VjPTEsIHZhbHVlX2ZpbHRlcj1Ob25lKToKKyAgICAgICAgc2VsZi5fY2hlY2tfcm91bmRpbmcocHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UsIHVuaXRfdG9fc2VjLCB2YWx1ZV9maWx0ZXIpCisKKyAgICBkZWYgY2hlY2tfZmxvYXRfcm91bmRpbmcoc2VsZiwgcHl0aW1lX2NvbnZlcnRlciwgZXhwZWN0ZWRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdF90b19zZWM9MSwgdmFsdWVfZmlsdGVyPU5vbmUpOgorICAgICAgICBzZWxmLl9jaGVja19yb3VuZGluZyhweXRpbWVfY29udmVydGVyLCBleHBlY3RlZF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlLCB1bml0X3RvX3NlYywgdmFsdWVfZmlsdGVyKQorCisgICAgZGVmIGRlY2ltYWxfcm91bmQoc2VsZiwgeCk6CisgICAgICAgIGQgPSBkZWNpbWFsLkRlY2ltYWwoeCkKKyAgICAgICAgZCA9IGQucXVhbnRpemUoMSkKKyAgICAgICAgcmV0dXJuIGludChkKQorCisKK2NsYXNzIFRlc3RDUHlUaW1lKENQeVRpbWVUZXN0Q2FzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgdGhlIEMgX1B5VGltZV90IEFQSS4KKyAgICAiIiIKKyAgICAjIF9QeVRpbWVfdCBpcyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlcgorICAgIE9WRVJGTE9XX1NFQ09ORFMgPSBtYXRoLmNlaWwoKDIqKjYzICsgMSkgLyBTRUNfVE9fTlMpCisKICAgICBkZWYgdGVzdF9Gcm9tU2Vjb25kcyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Gcm9tU2Vjb25kcwotICAgICAgICBmb3Igc2Vjb25kcyBpbiAoMCwgMywgLTQ1NiwgX3Rlc3RjYXBpLklOVF9NQVgsIF90ZXN0Y2FwaS5JTlRfTUlOKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHNlY29uZHM9c2Vjb25kcyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfRnJvbVNlY29uZHMoc2Vjb25kcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICogU0VDX1RPX05TKQorCisgICAgICAgICMgUHlUaW1lX0Zyb21TZWNvbmRzKCkgZXhwZWN0cyBhIEMgaW50LCByZWplY3QgdmFsdWVzIG91dCBvZiByYW5nZQorICAgICAgICBkZWYgY19pbnRfZmlsdGVyKHNlY3MpOgorICAgICAgICAgICAgcmV0dXJuIChfdGVzdGNhcGkuSU5UX01JTiA8PSBzZWNzIDw9IF90ZXN0Y2FwaS5JTlRfTUFYKQorCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKGxhbWJkYSBzZWNzLCBybmQ6IFB5VGltZV9Gcm9tU2Vjb25kcyhzZWNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHNlY3M6IHNlY3MgKiBTRUNfVE9fTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1jX2ludF9maWx0ZXIpCiAKICAgICBkZWYgdGVzdF9Gcm9tU2Vjb25kc09iamVjdChzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Gcm9tU2Vjb25kc09iamVjdAogCi0gICAgICAgICMgQ29udmVyc2lvbiBnaXZpbmcgdGhlIHNhbWUgcmVzdWx0IGZvciBhbGwgcm91bmRpbmcgbWV0aG9kcwotICAgICAgICBmb3Igcm5kIGluIEFMTF9ST1VORElOR19NRVRIT0RTOgotICAgICAgICAgICAgZm9yIG9iaiwgdHMgaW4gKAotICAgICAgICAgICAgICAgICMgaW50ZWdlcnMKLSAgICAgICAgICAgICAgICAoMCwgMCksCi0gICAgICAgICAgICAgICAgKDEsIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKC0zLCAtMyAqIFNFQ19UT19OUyksCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKAorICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0LAorICAgICAgICAgICAgbGFtYmRhIHNlY3M6IHNlY3MgKiBTRUNfVE9fTlMpCiAKLSAgICAgICAgICAgICAgICAjIGZsb2F0OiBzdWJzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDAuMCwgMCksCi0gICAgICAgICAgICAgICAgKDFlLTksIDEpLAotICAgICAgICAgICAgICAgICgxZS02LCAxMCAqKiAzKSwKLSAgICAgICAgICAgICAgICAoMWUtMywgMTAgKiogNiksCi0KLSAgICAgICAgICAgICAgICAjIGZsb2F0OiBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIuMCwgMiAqIFNFQ19UT19OUyksCi0gICAgICAgICAgICAgICAgKDEyMy4wLCAxMjMgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgICAgICgtNy4wLCAtNyAqIFNFQ19UT19OUyksCi0KLSAgICAgICAgICAgICAgICAjIG5hbm9zZWNvbmQgYXJlIGtlcHQgZm9yIHZhbHVlIDw9IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgICAgICgyKioyMiAtIDFlLTksICA0MTk0MzAzOTk5OTk5OTk5KSwKLSAgICAgICAgICAgICAgICAoMioqMjIsICAgICAgICAgNDE5NDMwNDAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjIyICsgMWUtOSwgIDQxOTQzMDQwMDAwMDAwMDEpLAotICAgICAgICAgICAgICAgICgyKioyMyAtIDFlLTksICA4Mzg4NjA3OTk5OTk5OTk5KSwKLSAgICAgICAgICAgICAgICAoMioqMjMsICAgICAgICAgODM4ODYwODAwMDAwMDAwMCksCi0KLSAgICAgICAgICAgICAgICAjIHN0YXJ0IGxvc2luZyBwcmVjaXNpb24gZm9yIHZhbHVlID4gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIqKjIzICsgMWUtOSwgIDgzODg2MDgwMDAwMDAwMDIpLAotCi0gICAgICAgICAgICAgICAgIyBuYW5vc2Vjb25kcyBhcmUgbG9zdCBmb3IgdmFsdWUgPiAyXjIzIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMioqMjQgLSAxZS05LCAxNjc3NzIxNTk5OTk5OTk5OCksCi0gICAgICAgICAgICAgICAgKDIqKjI0LCAgICAgICAgMTY3NzcyMTYwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyNCArIDFlLTksIDE2Nzc3MjE2MDAwMDAwMDAwKSwKLSAgICAgICAgICAgICAgICAoMioqMjUgLSAxZS05LCAzMzU1NDQzMjAwMDAwMDAwMCksCi0gICAgICAgICAgICAgICAgKDIqKjI1ICAgICAgICwgMzM1NTQ0MzIwMDAwMDAwMDApLAotICAgICAgICAgICAgICAgICgyKioyNSArIDFlLTksIDMzNTU0NDMyMDAwMDAwMDAwKSwKLQotICAgICAgICAgICAgICAgICMgY2xvc2UgdG8gMl42MyBuYW5vc2Vjb25kcyAoX1B5VGltZV90IGxpbWl0KQotICAgICAgICAgICAgICAgICg5MjIzMzcyMDM2LCA5MjIzMzcyMDM2ICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoOTIyMzM3MjAzNi4wLCA5MjIzMzcyMDM2ICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoLTkyMjMzNzIwMzYsIC05MjIzMzcyMDM2ICogU0VDX1RPX05TKSwKLSAgICAgICAgICAgICAgICAoLTkyMjMzNzIwMzYuMCwgLTkyMjMzNzIwMzYgKiBTRUNfVE9fTlMpLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChvYmo9b2JqLCByb3VuZD1ybmQsIHRpbWVzdGFtcD10cyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KG9iaiwgcm5kKSwgdHMpCi0KLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yKToKLSAgICAgICAgICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KDkyMjMzNzIwMzcsIHJuZCkKLSAgICAgICAgICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KDkyMjMzNzIwMzcuMCwgcm5kKQotICAgICAgICAgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QoLTkyMjMzNzIwMzcsIHJuZCkKLSAgICAgICAgICAgICAgICAgICAgUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KC05MjIzMzcyMDM3LjAsIHJuZCkKLQotICAgICAgICAjIENvbnZlcnNpb24gZ2l2aW5nIGRpZmZlcmVudCByZXN1bHRzIGRlcGVuZGluZyBvbiB0aGUgcm91bmRpbmcgbWV0aG9kCi0gICAgICAgIEZMT09SID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBDRUlMSU5HID0gX1B5VGltZS5ST1VORF9DRUlMSU5HCi0gICAgICAgIGZvciBvYmosIHRzLCBybmQgaW4gKAotICAgICAgICAgICAgIyBjbG9zZSB0byB6ZXJvCi0gICAgICAgICAgICAoIDFlLTEwLCAgMCwgRkxPT1IpLAotICAgICAgICAgICAgKCAxZS0xMCwgIDEsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xZS0xMCwgLTEsIEZMT09SKSwKLSAgICAgICAgICAgICgtMWUtMTAsICAwLCBDRUlMSU5HKSwKLQotICAgICAgICAgICAgIyB0ZXN0IHJvdW5kaW5nIG9mIHRoZSBsYXN0IG5hbm9zZWNvbmQKLSAgICAgICAgICAgICggMS4xMjM0NTY3ODk5LCAgMTEyMzQ1Njc4OSwgRkxPT1IpLAotICAgICAgICAgICAgKCAxLjEyMzQ1Njc4OTksICAxMTIzNDU2NzkwLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMS4xMjM0NTY3ODk5LCAtMTEyMzQ1Njc5MCwgRkxPT1IpLAotICAgICAgICAgICAgKC0xLjEyMzQ1Njc4OTksIC0xMTIzNDU2Nzg5LCBDRUlMSU5HKSwKLQotICAgICAgICAgICAgIyBjbG9zZSB0byAxIHNlY29uZAotICAgICAgICAgICAgKCAwLjk5OTk5OTk5OTksICAgOTk5OTk5OTk5LCBGTE9PUiksCi0gICAgICAgICAgICAoIDAuOTk5OTk5OTk5OSwgIDEwMDAwMDAwMDAsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0wLjk5OTk5OTk5OTksIC0xMDAwMDAwMDAwLCBGTE9PUiksCi0gICAgICAgICAgICAoLTAuOTk5OTk5OTk5OSwgIC05OTk5OTk5OTksIENFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qob2JqPW9iaiwgcm91bmQ9cm5kLCB0aW1lc3RhbXA9dHMpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KG9iaiwgcm5kKSwgdHMpCisgICAgICAgIHNlbGYuY2hlY2tfZmxvYXRfcm91bmRpbmcoCisgICAgICAgICAgICBQeVRpbWVfRnJvbVNlY29uZHNPYmplY3QsCisgICAgICAgICAgICBsYW1iZGEgbnM6IHNlbGYuZGVjaW1hbF9yb3VuZChucyAqIFNFQ19UT19OUykpCiAKICAgICBkZWYgdGVzdF9Bc1NlY29uZHNEb3VibGUoc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBQeVRpbWVfQXNTZWNvbmRzRG91YmxlCiAKLSAgICAgICAgZm9yIG5hbm9zZWNvbmRzLCBzZWNvbmRzIGluICgKLSAgICAgICAgICAgICMgbmVhciAxIG5hbm9zZWNvbmQKLSAgICAgICAgICAgICggMCwgIDAuMCksCi0gICAgICAgICAgICAoIDEsICAxZS05KSwKLSAgICAgICAgICAgICgtMSwgLTFlLTkpLAorICAgICAgICBkZWYgZmxvYXRfY29udmVydGVyKG5zKToKKyAgICAgICAgICAgIGlmIGFicyhucykgJSBTRUNfVE9fTlMgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQobnMgLy8gU0VDX1RPX05TKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQobnMpIC8gU0VDX1RPX05TCiAKLSAgICAgICAgICAgICMgbmVhciAxIHNlY29uZAotICAgICAgICAgICAgKFNFQ19UT19OUyArIDEsIDEuMCArIDFlLTkpLAotICAgICAgICAgICAgKFNFQ19UT19OUywgICAgIDEuMCksCi0gICAgICAgICAgICAoU0VDX1RPX05TIC0gMSwgMS4wIC0gMWUtOSksCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKGxhbWJkYSBucywgcm5kOiBQeVRpbWVfQXNTZWNvbmRzRG91YmxlKG5zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMpCiAKLSAgICAgICAgICAgICMgYSBmZXcgc2Vjb25kcwotICAgICAgICAgICAgKDEyMyAqIFNFQ19UT19OUywgMTIzLjApLAotICAgICAgICAgICAgKC01NjcgKiBTRUNfVE9fTlMsIC01NjcuMCksCisgICAgZGVmIGNyZWF0ZV9kZWNpbWFsX2NvbnZlcnRlcihzZWxmLCBkZW5vbWluYXRvcik6CisgICAgICAgIGRlbm9tID0gZGVjaW1hbC5EZWNpbWFsKGRlbm9taW5hdG9yKQogCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmQgYXJlIGtlcHQgZm9yIHZhbHVlIDw9IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgKDQxOTQzMDM5OTk5OTk5OTksIDIqKjIyIC0gMWUtOSksCi0gICAgICAgICAgICAoNDE5NDMwNDAwMDAwMDAwMCwgMioqMjIpLAotICAgICAgICAgICAgKDQxOTQzMDQwMDAwMDAwMDEsIDIqKjIyICsgMWUtOSksCisgICAgICAgIGRlZiBjb252ZXJ0ZXIodmFsdWUpOgorICAgICAgICAgICAgZCA9IGRlY2ltYWwuRGVjaW1hbCh2YWx1ZSkgLyBkZW5vbQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjaW1hbF9yb3VuZChkKQogCi0gICAgICAgICAgICAjIHN0YXJ0IGxvc2luZyBwcmVjaXNpb24gZm9yIHZhbHVlID4gMl4yMyBzZWNvbmRzCi0gICAgICAgICAgICAoODM4ODYwODAwMDAwMDAwMiwgMioqMjMgKyAxZS05KSwKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRlcgogCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzIGFyZSBsb3N0IGZvciB2YWx1ZSA+IDJeMjMgc2Vjb25kcwotICAgICAgICAgICAgKDE2Nzc3MjE1OTk5OTk5OTk4LCAyKioyNCAtIDFlLTkpLAotICAgICAgICAgICAgKDE2Nzc3MjE1OTk5OTk5OTk5LCAyKioyNCAtIDFlLTkpLAotICAgICAgICAgICAgKDE2Nzc3MjE2MDAwMDAwMDAwLCAyKioyNCAgICAgICApLAotICAgICAgICAgICAgKDE2Nzc3MjE2MDAwMDAwMDAxLCAyKioyNCAgICAgICApLAotICAgICAgICAgICAgKDE2Nzc3MjE2MDAwMDAwMDAyLCAyKioyNCArIDJlLTkpLAotCi0gICAgICAgICAgICAoMzM1NTQ0MzIwMDAwMDAwMDAsIDIqKjI1ICAgICAgICksCi0gICAgICAgICAgICAoMzM1NTQ0MzIwMDAwMDAwMDIsIDIqKjI1ICAgICAgICksCi0gICAgICAgICAgICAoMzM1NTQ0MzIwMDAwMDAwMDQsIDIqKjI1ICsgNGUtOSksCi0KLSAgICAgICAgICAgICMgY2xvc2UgdG8gMl42MyBuYW5vc2Vjb25kcyAoX1B5VGltZV90IGxpbWl0KQotICAgICAgICAgICAgKDkyMjMzNzIwMzYgKiBTRUNfVE9fTlMsIDkyMjMzNzIwMzYuMCksCi0gICAgICAgICAgICAoLTkyMjMzNzIwMzYgKiBTRUNfVE9fTlMsIC05MjIzMzcyMDM2LjApLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bmFub3NlY29uZHMsIHNlY29uZHM9c2Vjb25kcyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNTZWNvbmRzRG91YmxlKG5hbm9zZWNvbmRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMpCi0KLSAgICBkZWYgdGVzdF90aW1ldmFsKHNlbGYpOgorICAgIGRlZiB0ZXN0X0FzVGltZXZhbChzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc1RpbWV2YWwKLSAgICAgICAgZm9yIHJuZCBpbiBBTExfUk9VTkRJTkdfTUVUSE9EUzoKLSAgICAgICAgICAgIGZvciBucywgdHYgaW4gKAotICAgICAgICAgICAgICAgICMgbWljcm9zZWNvbmRzCi0gICAgICAgICAgICAgICAgKDAsICgwLCAwKSksCi0gICAgICAgICAgICAgICAgKDEwMDAsICgwLCAxKSksCi0gICAgICAgICAgICAgICAgKC0xMDAwLCAoLTEsIDk5OTk5OSkpLAogCi0gICAgICAgICAgICAgICAgIyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIgKiBTRUNfVE9fTlMsICgyLCAwKSksCi0gICAgICAgICAgICAgICAgKC0zICogU0VDX1RPX05TLCAoLTMsIDApKSwKLSAgICAgICAgICAgICk6Ci0gICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIHRpbWV2YWw9dHYsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlUaW1lX0FzVGltZXZhbChucywgcm5kKSwgdHYpCisgICAgICAgIHVzX2NvbnZlcnRlciA9IHNlbGYuY3JlYXRlX2RlY2ltYWxfY29udmVydGVyKFVTX1RPX05TKQogCi0gICAgICAgIEZMT09SID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBDRUlMSU5HID0gX1B5VGltZS5ST1VORF9DRUlMSU5HCi0gICAgICAgIGZvciBucywgdHYsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMSwgKDAsIDApLCBGTE9PUiksCi0gICAgICAgICAgICAoMSwgKDAsIDEpLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMSwgKC0xLCA5OTk5OTkpLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEsICgwLCAwKSwgQ0VJTElORyksCisgICAgICAgIGRlZiB0aW1ldmFsX2NvbnZlcnRlcihucyk6CisgICAgICAgICAgICB1cyA9IHVzX2NvbnZlcnRlcihucykKKyAgICAgICAgICAgIHJldHVybiBkaXZtb2QodXMsIFNFQ19UT19VUykKIAotICAgICAgICAgICAgIyBzZWNvbmRzICsgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxMjM0NTY3MDAxLCAoMSwgMjM0NTY3KSwgRkxPT1IpLAotICAgICAgICAgICAgKDEyMzQ1NjcwMDEsICgxLCAyMzQ1NjgpLCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMTIzNDU2NzAwMSwgKC0yLCA3NjU0MzIpLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEyMzQ1NjcwMDEsICgtMiwgNzY1NDMzKSwgQ0VJTElORyksCi0gICAgICAgICk6Ci0gICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXZhbD10diwgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc1RpbWV2YWwobnMsIHJuZCksIHR2KQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBMT05HX01JTiwgTE9OR19NQVgKKworICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCB0aW1ldmFsLnR2X3NlYyB0eXBlIGlzIGEgQyBsb25nCisgICAgICAgICAgICBkZWYgc2Vjb25kc19maWx0ZXIoc2Vjcyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkdfTUlOIDw9IHNlY3MgPD0gTE9OR19NQVgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlY29uZHNfZmlsdGVyID0gc2VsZi50aW1lX3RfZmlsdGVyCisKKyAgICAgICAgc2VsZi5jaGVja19pbnRfcm91bmRpbmcoUHlUaW1lX0FzVGltZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhbF9jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlY29uZHNfZmlsdGVyKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihfdGVzdGNhcGksICdQeVRpbWVfQXNUaW1lc3BlYycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICduZWVkIF90ZXN0Y2FwaS5QeVRpbWVfQXNUaW1lc3BlYycpCi0gICAgZGVmIHRlc3RfdGltZXNwZWMoc2VsZik6CisgICAgZGVmIHRlc3RfQXNUaW1lc3BlYyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc1RpbWVzcGVjCi0gICAgICAgIGZvciBucywgdHMgaW4gKAotICAgICAgICAgICAgIyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDAsICgwLCAwKSksCi0gICAgICAgICAgICAoMSwgKDAsIDEpKSwKLSAgICAgICAgICAgICgtMSwgKC0xLCA5OTk5OTk5OTkpKSwKIAotICAgICAgICAgICAgIyBzZWNvbmRzCi0gICAgICAgICAgICAoMiAqIFNFQ19UT19OUywgKDIsIDApKSwKLSAgICAgICAgICAgICgtMyAqIFNFQ19UT19OUywgKC0zLCAwKSksCisgICAgICAgIGRlZiB0aW1lc3BlY19jb252ZXJ0ZXIobnMpOgorICAgICAgICAgICAgcmV0dXJuIGRpdm1vZChucywgU0VDX1RPX05TKQogCi0gICAgICAgICAgICAjIHNlY29uZHMgKyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEyMzQ1Njc4OTAsICgxLCAyMzQ1Njc4OTApKSwKLSAgICAgICAgICAgICgtMTIzNDU2Nzg5MCwgKC0yLCA3NjU0MzIxMTApKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1lc3BlYz10cyk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNUaW1lc3BlYyhucyksIHRzKQorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhsYW1iZGEgbnMsIHJuZDogUHlUaW1lX0FzVGltZXNwZWMobnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3BlY19jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TX1RPX1NFQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKIAotICAgIGRlZiB0ZXN0X21pbGxpc2Vjb25kcyhzZWxmKToKKyAgICBkZWYgdGVzdF9Bc01pbGxpc2Vjb25kcyhzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IFB5VGltZV9Bc01pbGxpc2Vjb25kcwotICAgICAgICBmb3Igcm5kIGluIEFMTF9ST1VORElOR19NRVRIT0RTOgotICAgICAgICAgICAgZm9yIG5zLCB0diBpbiAoCi0gICAgICAgICAgICAgICAgIyBtaWxsaXNlY29uZHMKLSAgICAgICAgICAgICAgICAoMSAqIE1TX1RPX05TLCAxKSwKLSAgICAgICAgICAgICAgICAoLTIgKiBNU19UT19OUywgLTIpLAogCi0gICAgICAgICAgICAgICAgIyBzZWNvbmRzCi0gICAgICAgICAgICAgICAgKDIgKiBTRUNfVE9fTlMsIDIwMDApLAotICAgICAgICAgICAgICAgICgtMyAqIFNFQ19UT19OUywgLTMwMDApLAotICAgICAgICAgICAgKToKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdChuYW5vc2Vjb25kcz1ucywgdGltZXZhbD10diwgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNNaWxsaXNlY29uZHMobnMsIHJuZCksIHR2KQorICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhQeVRpbWVfQXNNaWxsaXNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2RlY2ltYWxfY29udmVydGVyKE1TX1RPX05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNfVE9fU0VDKQogCi0gICAgICAgIEZMT09SID0gX1B5VGltZS5ST1VORF9GTE9PUgotICAgICAgICBDRUlMSU5HID0gX1B5VGltZS5ST1VORF9DRUlMSU5HCi0gICAgICAgIGZvciBucywgbXMsIHJuZCBpbiAoCi0gICAgICAgICAgICAjIG5hbm9zZWNvbmRzCi0gICAgICAgICAgICAoMSwgMCwgRkxPT1IpLAotICAgICAgICAgICAgKDEsIDEsIENFSUxJTkcpLAotICAgICAgICAgICAgKC0xLCAtMSwgRkxPT1IpLAotICAgICAgICAgICAgKC0xLCAwLCBDRUlMSU5HKSwKLQotICAgICAgICAgICAgIyBzZWNvbmRzICsgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxMjM0ICogTVNfVE9fTlMgKyAxLCAxMjM0LCBGTE9PUiksCi0gICAgICAgICAgICAoMTIzNCAqIE1TX1RPX05TICsgMSwgMTIzNSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEyMzQgKiBNU19UT19OUyAtIDEsIC0xMjM1LCBGTE9PUiksCi0gICAgICAgICAgICAoLTEyMzQgKiBNU19UT19OUyAtIDEsIC0xMjM0LCBDRUlMSU5HKSwKLSAgICAgICAgKToKLSAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCBtaWxsaXNlY29uZHM9bXMsIHJvdW5kPXJuZCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVRpbWVfQXNNaWxsaXNlY29uZHMobnMsIHJuZCksIG1zKQotCi0gICAgZGVmIHRlc3RfbWljcm9zZWNvbmRzKHNlbGYpOgorICAgIGRlZiB0ZXN0X0FzTWljcm9zZWNvbmRzKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgUHlUaW1lX0FzTWljcm9zZWNvbmRzCi0gICAgICAgIGZvciBybmQgaW4gQUxMX1JPVU5ESU5HX01FVEhPRFM6Ci0gICAgICAgICAgICBmb3IgbnMsIHR2IGluICgKLSAgICAgICAgICAgICAgICAjIG1pY3Jvc2Vjb25kcwotICAgICAgICAgICAgICAgICgxICogVVNfVE9fTlMsIDEpLAotICAgICAgICAgICAgICAgICgtMiAqIFVTX1RPX05TLCAtMiksCiAKLSAgICAgICAgICAgICAgICAjIG1pbGxpc2Vjb25kcwotICAgICAgICAgICAgICAgICgxICogTVNfVE9fTlMsIDEwMDApLAotICAgICAgICAgICAgICAgICgtMiAqIE1TX1RPX05TLCAtMjAwMCksCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKFB5VGltZV9Bc01pY3Jvc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfZGVjaW1hbF9jb252ZXJ0ZXIoVVNfVE9fTlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU19UT19TRUMpCiAKLSAgICAgICAgICAgICAgICAjIHNlY29uZHMKLSAgICAgICAgICAgICAgICAoMiAqIFNFQ19UT19OUywgMjAwMDAwMCksCi0gICAgICAgICAgICAgICAgKC0zICogU0VDX1RPX05TLCAtMzAwMDAwMCksCi0gICAgICAgICAgICApOgotICAgICAgICAgICAgICAgIHdpdGggc2VsZi5zdWJUZXN0KG5hbm9zZWNvbmRzPW5zLCB0aW1ldmFsPXR2LCByb3VuZD1ybmQpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc01pY3Jvc2Vjb25kcyhucywgcm5kKSwgdHYpCiAKLSAgICAgICAgRkxPT1IgPSBfUHlUaW1lLlJPVU5EX0ZMT09SCi0gICAgICAgIENFSUxJTkcgPSBfUHlUaW1lLlJPVU5EX0NFSUxJTkcKLSAgICAgICAgZm9yIG5zLCBtcywgcm5kIGluICgKLSAgICAgICAgICAgICMgbmFub3NlY29uZHMKLSAgICAgICAgICAgICgxLCAwLCBGTE9PUiksCi0gICAgICAgICAgICAoMSwgMSwgQ0VJTElORyksCi0gICAgICAgICAgICAoLTEsIC0xLCBGTE9PUiksCi0gICAgICAgICAgICAoLTEsIDAsIENFSUxJTkcpLAorY2xhc3MgVGVzdE9sZFB5VGltZShDUHlUaW1lVGVzdENhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0IHRoZSBvbGQgQyBfUHlUaW1lX3QgQVBJOiBfUHlUaW1lX09iamVjdFRvWFhYKCkgZnVuY3Rpb25zLgorICAgICIiIgogCi0gICAgICAgICAgICAjIHNlY29uZHMgKyBuYW5vc2Vjb25kcwotICAgICAgICAgICAgKDEyMzQgKiBVU19UT19OUyArIDEsIDEyMzQsIEZMT09SKSwKLSAgICAgICAgICAgICgxMjM0ICogVVNfVE9fTlMgKyAxLCAxMjM1LCBDRUlMSU5HKSwKLSAgICAgICAgICAgICgtMTIzNCAqIFVTX1RPX05TIC0gMSwgLTEyMzUsIEZMT09SKSwKLSAgICAgICAgICAgICgtMTIzNCAqIFVTX1RPX05TIC0gMSwgLTEyMzQsIENFSUxJTkcpLAotICAgICAgICApOgotICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QobmFub3NlY29uZHM9bnMsIG1pbGxpc2Vjb25kcz1tcywgcm91bmQ9cm5kKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5VGltZV9Bc01pY3Jvc2Vjb25kcyhucywgcm5kKSwgbXMpCisgICAgIyB0aW1lX3QgaXMgYSAzMi1iaXQgb3IgNjQtYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgT1ZFUkZMT1dfU0VDT05EUyA9IDIgKiogNjQKKworICAgIGRlZiB0ZXN0X29iamVjdF90b190aW1lX3Qoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWVfdAorCisgICAgICAgIHNlbGYuY2hlY2tfaW50X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2Vjczogc2VjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X3JvdW5kaW5nKHB5dGltZV9vYmplY3RfdG9fdGltZV90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVjaW1hbF9yb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgZGVmIGNyZWF0ZV9jb252ZXJ0ZXIoc2VsZiwgc2VjX3RvX3VuaXQpOgorICAgICAgICBkZWYgY29udmVydGVyKHNlY3MpOgorICAgICAgICAgICAgZmxvYXRwYXJ0LCBpbnRwYXJ0ID0gbWF0aC5tb2RmKHNlY3MpCisgICAgICAgICAgICBpbnRwYXJ0ID0gaW50KGludHBhcnQpCisgICAgICAgICAgICBmbG9hdHBhcnQgKj0gc2VjX3RvX3VuaXQKKyAgICAgICAgICAgIGZsb2F0cGFydCA9IHNlbGYuZGVjaW1hbF9yb3VuZChmbG9hdHBhcnQpCisgICAgICAgICAgICBpZiBmbG9hdHBhcnQgPCAwOgorICAgICAgICAgICAgICAgIGZsb2F0cGFydCArPSBzZWNfdG9fdW5pdAorICAgICAgICAgICAgICAgIGludHBhcnQgLT0gMQorICAgICAgICAgICAgZWxpZiBmbG9hdHBhcnQgPj0gc2VjX3RvX3VuaXQ6CisgICAgICAgICAgICAgICAgZmxvYXRwYXJ0IC09IHNlY190b191bml0CisgICAgICAgICAgICAgICAgaW50cGFydCArPSAxCisgICAgICAgICAgICByZXR1cm4gKGludHBhcnQsIGZsb2F0cGFydCkKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRlcgorCisgICAgZGVmIHRlc3Rfb2JqZWN0X3RvX3RpbWV2YWwoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBweXRpbWVfb2JqZWN0X3RvX3RpbWV2YWwKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWV2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWNzOiAoc2VjcywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2ZpbHRlcj1zZWxmLnRpbWVfdF9maWx0ZXIpCisKKyAgICAgICAgc2VsZi5jaGVja19mbG9hdF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWV2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfY29udmVydGVyKFNFQ19UT19VUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfZmlsdGVyPXNlbGYudGltZV90X2ZpbHRlcikKKworICAgIGRlZiB0ZXN0X29iamVjdF90b190aW1lc3BlYyhzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHB5dGltZV9vYmplY3RfdG9fdGltZXNwZWMKKworICAgICAgICBzZWxmLmNoZWNrX2ludF9yb3VuZGluZyhweXRpbWVfb2JqZWN0X3RvX3RpbWVzcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2VjczogKHNlY3MsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQorCisgICAgICAgIHNlbGYuY2hlY2tfZmxvYXRfcm91bmRpbmcocHl0aW1lX29iamVjdF90b190aW1lc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9jb252ZXJ0ZXIoU0VDX1RPX05TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9maWx0ZXI9c2VsZi50aW1lX3RfZmlsdGVyKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5IGIvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQppbmRleCAzYjE3Y2E2Li45MDQzOGU3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKQEAgLTI0LDggKzI0LDcgQEAKICAgICAgICAgICAgIGlmIHR5cGUgPT0gRU5ETUFSS0VSOgogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICB0eXBlID0gdG9rX25hbWVbdHlwZV0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICAlKHR5cGUpLTEwLjEwcyAlKHRva2VuKS0xMy4xM3IgJShzdGFydClzICUoZW5kKXMiICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxzKCkpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGYiICAgIHt0eXBlOjEwfSB7dG9rZW4hcjoxM30ge3N0YXJ0fSB7ZW5kfSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgIFsiICAgIEVOQ09ESU5HICAgJ3V0Zi04JyAgICAgICAoMCwgMCkgKDAsIDApIl0gKwogICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLnJzdHJpcCgpLnNwbGl0bGluZXMoKSkKQEAgLTEzMiwxOCArMTMxLDE4IEBACiAgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoInggPSAweGZmZmZmZmZmZmZmIiwgIiIiXAogICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCiAgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKLSAgICBOVU1CRVIgICAgICcweGZmZmZmZmZmZmYgKDEsIDQpICgxLCAxNykKKyAgICBOVU1CRVIgICAgICcweGZmZmZmZmZmZmZmJyAoMSwgNCkgKDEsIDE3KQogICAgICIiIikKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgieCA9IDEyMzE0MTI0MjE1MTI1MTYxNjExMCIsICIiIlwKICAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQogICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCi0gICAgTlVNQkVSICAgICAnMTIzMTQxMjQyMTUxICgxLCA0KSAoMSwgMjUpCisgICAgTlVNQkVSICAgICAnMTIzMTQxMjQyMTUxMjUxNjE2MTEwJyAoMSwgNCkgKDEsIDI1KQogICAgICIiIikKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgieCA9IC0xNTkyMTU5MDIxNTAxMjU5MSIsICIiIlwKICAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQogICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCiAgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCA0KSAoMSwgNSkKLSAgICBOVU1CRVIgICAgICcxNTkyMTU5MDIxNTAgKDEsIDUpICgxLCAyMikKKyAgICBOVU1CRVIgICAgICcxNTkyMTU5MDIxNTAxMjU5MScgKDEsIDUpICgxLCAyMikKICAgICAiIiIpCiAKICAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKQEAgLTMwNyw2ICszMDYsNTAgQEAKICAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDI4KSAoMSwgMjkpCiAgICAgU1RSSU5HICAgICAnUkIiYWJjIicgICAgICgxLCAzMCkgKDEsIDM3KQogICAgICIiIikKKyAgICAgICAgIyBDaGVjayAwLCAxLCBhbmQgMiBjaGFyYWN0ZXIgc3RyaW5nIHByZWZpeGVzLgorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHInImFcCitkZVwKK2ZnIicsICIiIlwKKyAgICBTVFJJTkcgICAgICciYVxcXFxcXG5kZVxcXFxcXG5mZyJcJyAoMSwgMCkgKDMsIDMpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIndSJhXAorZGUiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3UiYVxcXFxcXG5kZSJcJyAgKDEsIDApICgyLCAzKQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ3JiImFcCitkIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdyYiJhXFxcXFxcbmQiXCcgICgxLCAwKSAoMiwgMikKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUociciIiJhXAorYiIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdcIlwiImFcXFxcXFxuYlwiXCIiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIndSIiImFcCitiIiIiJywgIiIiXAorICAgIFNUUklORyAgICAgJ3VcIlwiImFcXFxcXFxuYlwiXCIiJyAoMSwgMCkgKDIsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKHIncmIiIiJhXAorYlwKK2MiIiInLCAiIiJcCisgICAgU1RSSU5HICAgICAncmIiXCIiYVxcXFxcXG5iXFxcXFxcbmMiXCIiJyAoMSwgMCkgKDMsIDQpCisgICAgIiIiKQorICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCdmImFiYyInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZiJhYmMiJyAgICAgICgxLCAwKSAoMSwgNikKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUoJ2ZSImF7Yn1jIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdmUiJhe2J9YyInICAgKDEsIDApICgxLCA5KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgnZiIiImFiYyIiIicsICIiIlwKKyAgICBTVFJJTkcgICAgICdmXCJcIlwiYWJjXCJcIlwiJyAgKDEsIDApICgxLCAxMCkKKyAgICAiIiIpCisgICAgICAgIHNlbGYuY2hlY2tfdG9rZW5pemUocidmImFiY1wKK2RlZiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnZiJhYmNcXFxcXFxuZGVmIicgKDEsIDApICgyLCA0KQorICAgICIiIikKKyAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZShyJ1JmImFiY1wKK2RlZiInLCAiIiJcCisgICAgU1RSSU5HICAgICAnUmYiYWJjXFxcXFxcbmRlZiInICgxLCAwKSAoMiwgNCkKKyAgICAiIiIpCiAKICAgICBkZWYgdGVzdF9mdW5jdGlvbihzZWxmKToKICAgICAgICAgc2VsZi5jaGVja190b2tlbml6ZSgiZGVmIGQyMihhLCBiLCBjPTIsIGQ9MiwgKmspOiBwYXNzIiwgIiIiXApAQCAtNTA1LDcgKzU0OCw3IEBACiAgICAgICAgICMgTWV0aG9kcwogICAgICAgICBzZWxmLmNoZWNrX3Rva2VuaXplKCJAc3RhdGljbWV0aG9kXG5kZWYgZm9vKHgseSk6IHBhc3MiLCAiIiJcCiAgICAgT1AgICAgICAgICAnQCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKLSAgICBOQU1FICAgICAgICdzdGF0aWNtZXRob2QgKDEsIDEpICgxLCAxMykKKyAgICBOQU1FICAgICAgICdzdGF0aWNtZXRob2QnICgxLCAxKSAoMSwgMTMpCiAgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMSwgMTMpICgxLCAxNCkKICAgICBOQU1FICAgICAgICdkZWYnICAgICAgICAgKDIsIDApICgyLCAzKQogICAgIE5BTUUgICAgICAgJ2ZvbycgICAgICAgICAoMiwgNCkgKDIsIDcpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL19faW5pdF9fLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy9fX2luaXRfXy5weQppbmRleCAwNGM4NzI2Li40ZDBmY2EzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL19faW5pdF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvX19pbml0X18ucHkKQEAgLTMsNyArMyw2IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBpbXBvcnRsaWIKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAotZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoCiAKIGJhc2VwYXRoID0gb3MucGF0aC5kaXJuYW1lKCAgICAgICAgICAgICAgICAgIyA8c3JjL2luc3RhbGwgZGlyPgogICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZSggICAgICAgICAgICAgICAgIyBMaWIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9ncHJvZjJodG1sLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKaW5kZXggMGMyOTRlYy4uOTQ4OWVkOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X2dwcm9mMmh0bWwucHkKQEAgLTIsMTIgKzIsMTEgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1pbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKIGltcG9ydCB0ZW1wZmlsZQogCi1mcm9tIHRlc3QudGVzdF90b29scyBpbXBvcnQgc2NyaXB0c2Rpciwgc2tpcF9pZl9taXNzaW5nLCBpbXBvcnRfdG9vbAorZnJvbSB0ZXN0LnRlc3RfdG9vbHMgaW1wb3J0IHNraXBfaWZfbWlzc2luZywgaW1wb3J0X3Rvb2wKIAogc2tpcF9pZl9taXNzaW5nKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X21kNXN1bS5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9tZDVzdW0ucHkKaW5kZXggMTMwNTI5NS4uZmI1NjViNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X21kNXN1bS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfbWQ1c3VtLnB5CkBAIC0xLDEyICsxLDExIEBACiAiIiJUZXN0cyBmb3IgdGhlIG1kNXN1bSBzY3JpcHQgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeS4iIiIKIAogaW1wb3J0IG9zCi1pbXBvcnQgc3lzCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogZnJvbSB0ZXN0LnN1cHBvcnQuc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlCiAKLWZyb20gdGVzdC50ZXN0X3Rvb2xzIGltcG9ydCBzY3JpcHRzZGlyLCBpbXBvcnRfdG9vbCwgc2tpcF9pZl9taXNzaW5nCitmcm9tIHRlc3QudGVzdF90b29scyBpbXBvcnQgc2NyaXB0c2Rpciwgc2tpcF9pZl9taXNzaW5nCiAKIHNraXBfaWZfbWlzc2luZygpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9wZGVwcy5weSBiL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF9wZGVwcy5weQppbmRleCAwOTFmYTZhLi4yN2NiZmUyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rvb2xzL3Rlc3RfcGRlcHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3BkZXBzLnB5CkBAIC0xLDEyICsxLDEwIEBACiAiIiJUZXN0cyBmb3IgdGhlIHBkZXBzIHNjcmlwdCBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LiIiIgogCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCB1bml0dGVzdAogaW1wb3J0IHRlbXBmaWxlCi1mcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIAotZnJvbSB0ZXN0LnRlc3RfdG9vbHMgaW1wb3J0IHNjcmlwdHNkaXIsIHNraXBfaWZfbWlzc2luZywgaW1wb3J0X3Rvb2wKK2Zyb20gdGVzdC50ZXN0X3Rvb2xzIGltcG9ydCBza2lwX2lmX21pc3NpbmcsIGltcG9ydF90b29sCiAKIHNraXBfaWZfbWlzc2luZygpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdG9vbHMvdGVzdF91bnBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKaW5kZXggNzM0YmJjMi4uZDkxYWRlOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90b29scy90ZXN0X3VucGFyc2UucHkKQEAgLTEzNCw2ICsxMzQsMTUgQEAKIGNsYXNzIFVucGFyc2VUZXN0Q2FzZShBU1RUZXN0Q2FzZSk6CiAgICAgIyBUZXN0cyBmb3Igc3BlY2lmaWMgYnVncyBmb3VuZCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIHVucGFyc2UKIAorICAgIGRlZiB0ZXN0X2ZzdHJpbmdzKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAyNTE4MAorICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyIiIiZid7ZiJ7MH0iKjN9JyIiIikKKyAgICAgICAgc2VsZi5jaGVja19yb3VuZHRyaXAociIiImYne2Yie3l9IiozfSciIiIpCisgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKHIiIiJmJ3tmIntcJ3hcJ30iKjN9JyIiIikKKworICAgICAgICBzZWxmLmNoZWNrX3JvdW5kdHJpcChyJycnZiJ7cid4JyBmJ3tcInNcIn0nfSInJycpCisgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKHInJydmIntyJ3gncmYne1wic1wifSd9IicnJykKKwogICAgIGRlZiB0ZXN0X2RlbF9zdGF0ZW1lbnQoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcm91bmR0cmlwKCJkZWwgeCwgeSwgeiIpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CmluZGV4IDAzZGZmODQuLjFkODk0YWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZS5weQpAQCAtMSwxMSArMSwxMSBAQAogaW1wb3J0IG9zCi1pbXBvcnQgaW8KIGltcG9ydCBzeXMKIGZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBURVNURk4sIHJtdHJlZSwgdW5saW5rLCBjYXB0dXJlZF9zdGRvdXQKK2Zyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZQogaW1wb3J0IHVuaXR0ZXN0CiAKIGltcG9ydCB0cmFjZQotZnJvbSB0cmFjZSBpbXBvcnQgQ292ZXJhZ2VSZXN1bHRzLCBUcmFjZQorZnJvbSB0cmFjZSBpbXBvcnQgVHJhY2UKIAogZnJvbSB0ZXN0LnRyYWNlZG1vZHVsZXMgaW1wb3J0IHRlc3Rtb2QKIApAQCAtMzY1LDUxICszNjUsMjcgQEAKICAgICAgICAgIyBNYXRjaGVkIGJlZm9yZS4KICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlnbm9yZS5uYW1lcyhqbignYmFyJywgJ2Jhei5weScpLCAnYmF6JykpCiAKK2NsYXNzIFRlc3RDb21tYW5kTGluZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLWNsYXNzIFRlc3REZXByZWNhdGVkTWV0aG9kcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZmFpbHVyZXMoc2VsZik6CisgICAgICAgIF9lcnJvcnMgPSAoCisgICAgICAgICAgICAoYidmaWxlbmFtZSBpcyBtaXNzaW5nOiByZXF1aXJlZCB3aXRoIHRoZSBtYWluIG9wdGlvbnMnLCAnLWwnLCAnLVQnKSwKKyAgICAgICAgICAgIChiJ2Nhbm5vdCBzcGVjaWZ5IGJvdGggLS1saXN0ZnVuY3MgYW5kICgtLXRyYWNlIG9yIC0tY291bnQpJywgJy1sYycpLAorICAgICAgICAgICAgKGInYXJndW1lbnQgLVIvLS1uby1yZXBvcnQ6IG5vdCBhbGxvd2VkIHdpdGggYXJndW1lbnQgLXIvLS1yZXBvcnQnLCAnLXJSJyksCisgICAgICAgICAgICAoYidtdXN0IHNwZWNpZnkgb25lIG9mIC0tdHJhY2UsIC0tY291bnQsIC0tcmVwb3J0LCAtLWxpc3RmdW5jcywgb3IgLS10cmFja2NhbGxzJywgJy1nJyksCisgICAgICAgICAgICAoYictci8tLXJlcG9ydCByZXF1aXJlcyAtZi8tLWZpbGUnLCAnLXInKSwKKyAgICAgICAgICAgIChiJy0tc3VtbWFyeSBjYW4gb25seSBiZSB1c2VkIHdpdGggLS1jb3VudCBvciAtLXJlcG9ydCcsICctc1QnKSwKKyAgICAgICAgICAgIChiJ3VucmVjb2duaXplZCBhcmd1bWVudHM6IC15JywgJy15JykpCisgICAgICAgIGZvciBtZXNzYWdlLCAqYXJncyBpbiBfZXJyb3JzOgorICAgICAgICAgICAgKl8sIHN0ZGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLW0nLCAndHJhY2UnLCAqYXJncykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4obWVzc2FnZSwgc3RkZXJyKQogCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF91c2FnZShzZWxmKToKLSAgICAgICAgc2lvID0gaW8uU3RyaW5nSU8oKQotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHRyYWNlLnVzYWdlKHNpbykKLSAgICAgICAgc2VsZi5hc3NlcnRJbignVXNhZ2U6Jywgc2lvLmdldHZhbHVlKCkpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX0lnbm9yZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICB0cmFjZS5JZ25vcmUoKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9tb2RuYW1lKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInNwYW0iLCB0cmFjZS5tb2RuYW1lKCJzcGFtIikpCi0KLSAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2Z1bGxtb2RuYW1lKHNlbGYpOgotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInNwYW0iLCB0cmFjZS5mdWxsbW9kbmFtZSgic3BhbSIpKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9maW5kX2xpbmVzX2Zyb21fY29kZShzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBkZWYgZm9vKCk6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgdHJhY2UuZmluZF9saW5lc19mcm9tX2NvZGUoZm9vLl9fY29kZV9fLCBbImVnZ3MiXSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZmluZF9saW5lcyhzZWxmKToKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICBkZWYgZm9vKCk6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgdHJhY2UuZmluZF9saW5lcyhmb28uX19jb2RlX18sIFsiZWdncyJdKQotCi0gICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9maW5kX3N0cmluZ3Moc2VsZik6CisgICAgZGVmIHRlc3RfbGlzdGZ1bmNzX2ZsYWdfc3VjY2VzcyhzZWxmKToKICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmZDoKICAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh1bmxpbmssIFRFU1RGTikKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6Ci0gICAgICAgICAgICB0cmFjZS5maW5kX3N0cmluZ3MoZmQubmFtZSkKLQotICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfZmluZF9leGVjdXRhYmxlX2xpbmVub3Moc2VsZik6Ci0gICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZmQ6Ci0gICAgICAgICAgICBzZWxmLmFkZENsZWFudXAodW5saW5rLCBURVNURk4pCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgotICAgICAgICAgICAgdHJhY2UuZmluZF9leGVjdXRhYmxlX2xpbmVub3MoZmQubmFtZSkKLQorICAgICAgICAgICAgZmQud3JpdGUoImEgPSAxXG4iKQorICAgICAgICAgICAgc3RhdHVzLCBzdGRvdXQsIHN0ZGVyciA9IGFzc2VydF9weXRob25fb2soJy1tJywgJ3RyYWNlJywgJy1sJywgVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihiJ2Z1bmN0aW9ucyBjYWxsZWQ6Jywgc3Rkb3V0KQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQppbmRleCA1NDlkOGQxLi43ODc0MDljIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQpAQCAtMTI5LDEyICsxMjksMTIgQEAKICAgICAgICAgZGVmIGRvX3Rlc3QoZmlyc3RsaW5lcywgbWVzc2FnZSwgY2hhcnNldCwgbGluZW5vKToKICAgICAgICAgICAgICMgUmFpc2UgdGhlIG1lc3NhZ2UgaW4gYSBzdWJwcm9jZXNzLCBhbmQgY2F0Y2ggdGhlIG91dHB1dAogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG91dHB1dCA9IG9wZW4oVEVTVEZOLCAidyIsIGVuY29kaW5nPWNoYXJzZXQpCi0gICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKCIiInswfWlmIDE6Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignezF9JykKLSAgICAgICAgICAgICAgICAgICAgIiIiLmZvcm1hdChmaXJzdGxpbmVzLCBtZXNzYWdlKSkKLSAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3IiwgZW5jb2Rpbmc9Y2hhcnNldCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIiIiezB9aWYgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3sxfScpCisgICAgICAgICAgICAgICAgICAgICAgICAiIiIuZm9ybWF0KGZpcnN0bGluZXMsIG1lc3NhZ2UpKQorCiAgICAgICAgICAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCBURVNURk5dLAogICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCiAgICAgICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKQEAgLTE3NSw4ICsxNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICB0ZXh0LCBjaGFyc2V0LCA1KQogICAgICAgICAgICAgZG9fdGVzdCgiIFx0XGZcbiMgY29kaW5nOiB7MH1cbiIuZm9ybWF0KGNoYXJzZXQpLAogICAgICAgICAgICAgICAgICAgICB0ZXh0LCBjaGFyc2V0LCA1KQotICAgICAgICAjIElzc3VlICMxODk2MDogY29kaW5nIHNwZWMgc2hvdWxkIGhhcyBubyBlZmZlY3QKLSAgICAgICAgZG9fdGVzdCgiMFxuIyBjb2Rpbmc6IEdCS1xuIiwgImhceGU5IGhvIiwgJ3V0Zi04JywgNSkKKyAgICAgICAgIyBJc3N1ZSAjMTg5NjA6IGNvZGluZyBzcGVjIHNob3VsZCBoYXZlIG5vIGVmZmVjdAorICAgICAgICBkb190ZXN0KCJ4PTBcbiMgY29kaW5nOiBHQktcbiIsICJoXHhlOSBobyIsICd1dGYtOCcsIDUpCiAKICAgICBAc3VwcG9ydC5yZXF1aXJlc190eXBlX2NvbGxlY3RpbmcKICAgICBkZWYgdGVzdF9wcmludF90cmFjZWJhY2tfYXRfZXhpdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2VtYWxsb2MucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlbWFsbG9jLnB5CmluZGV4IGRhODlhOWEuLjc5MGFiN2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdHJhY2VtYWxsb2MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZW1hbGxvYy5weQpAQCAtMTEsOSArMTEsMTUgQEAKICAgICBpbXBvcnQgdGhyZWFkaW5nCiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgdGhyZWFkaW5nID0gTm9uZQordHJ5OgorICAgIGltcG9ydCBfdGVzdGNhcGkKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfdGVzdGNhcGkgPSBOb25lCisKIAogRU1QVFlfU1RSSU5HX1NJWkUgPSBzeXMuZ2V0c2l6ZW9mKGInJykKIAorCiBkZWYgZ2V0X2ZyYW1lcyhuZnJhbWUsIGxpbmVub19kZWx0YSk6CiAgICAgZnJhbWVzID0gW10KICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMSkKQEAgLTM3LDI4ICs0MywzMSBAQAogZGVmIGNyZWF0ZV9zbmFwc2hvdHMoKToKICAgICB0cmFjZWJhY2tfbGltaXQgPSAyCiAKKyAgICAjIF90cmFjZW1hbGxvYy5fZ2V0X3RyYWNlcygpIHJldHVybnMgYSBsaXN0IG9mIChkb21haW4sIHNpemUsCisgICAgIyB0cmFjZWJhY2tfZnJhbWVzKSB0dXBsZXMuIHRyYWNlYmFja19mcmFtZXMgaXMgYSB0dXBsZSBvZiAoZmlsZW5hbWUsCisgICAgIyBsaW5lX251bWJlcikgdHVwbGVzLgogICAgIHJhd190cmFjZXMgPSBbCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCiAKLSAgICAgICAgKDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDEsIDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKIAotICAgICAgICAoNjYsICgoJ2IucHknLCAxKSwpKSwKKyAgICAgICAgKDIsIDY2LCAoKCdiLnB5JywgMSksKSksCiAKLSAgICAgICAgKDcsICgoJzx1bmtub3duPicsIDApLCkpLAorICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCiAgICAgXQogICAgIHNuYXBzaG90ID0gdHJhY2VtYWxsb2MuU25hcHNob3QocmF3X3RyYWNlcywgdHJhY2ViYWNrX2xpbWl0KQogCiAgICAgcmF3X3RyYWNlczIgPSBbCi0gICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCiAKLSAgICAgICAgKDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgKDUwMDAsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDIsIDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgKDIsIDUwMDAsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKIAotICAgICAgICAoNDAwLCAoKCdjLnB5JywgNTc4KSwpKSwKKyAgICAgICAgKDQsIDQwMCwgKCgnYy5weScsIDU3OCksKSksCiAgICAgXQogICAgIHNuYXBzaG90MiA9IHRyYWNlbWFsbG9jLlNuYXBzaG90KHJhd190cmFjZXMyLCB0cmFjZWJhY2tfbGltaXQpCiAKQEAgLTEyNiw3ICsxMzUsNyBAQAogCiAgICAgZGVmIGZpbmRfdHJhY2Uoc2VsZiwgdHJhY2VzLCB0cmFjZWJhY2spOgogICAgICAgICBmb3IgdHJhY2UgaW4gdHJhY2VzOgotICAgICAgICAgICAgaWYgdHJhY2VbMV0gPT0gdHJhY2ViYWNrLl9mcmFtZXM6CisgICAgICAgICAgICBpZiB0cmFjZVsyXSA9PSB0cmFjZWJhY2suX2ZyYW1lczoKICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2UKIAogICAgICAgICBzZWxmLmZhaWwoInRyYWNlIG5vdCBmb3VuZCIpCkBAIC0xNDAsNyArMTQ5LDcgQEAKICAgICAgICAgdHJhY2UgPSBzZWxmLmZpbmRfdHJhY2UodHJhY2VzLCBvYmpfdHJhY2ViYWNrKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0cmFjZSwgdHVwbGUpCi0gICAgICAgIHNpemUsIHRyYWNlYmFjayA9IHRyYWNlCisgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2ViYWNrID0gdHJhY2UKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplLCBvYmpfc2l6ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZWJhY2ssIG9ial90cmFjZWJhY2suX2ZyYW1lcykKIApAQCAtMTY3LDkgKzE3Niw4IEBACiAKICAgICAgICAgdHJhY2UxID0gc2VsZi5maW5kX3RyYWNlKHRyYWNlcywgb2JqMV90cmFjZWJhY2spCiAgICAgICAgIHRyYWNlMiA9IHNlbGYuZmluZF90cmFjZSh0cmFjZXMsIG9iajJfdHJhY2ViYWNrKQotICAgICAgICBzaXplMSwgdHJhY2ViYWNrMSA9IHRyYWNlMQotICAgICAgICBzaXplMiwgdHJhY2ViYWNrMiA9IHRyYWNlMgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlYmFjazIsIHRyYWNlYmFjazEpCisgICAgICAgIGRvbWFpbjEsIHNpemUxLCB0cmFjZWJhY2sxID0gdHJhY2UxCisgICAgICAgIGRvbWFpbjIsIHNpemUyLCB0cmFjZWJhY2syID0gdHJhY2UyCiAgICAgICAgIHNlbGYuYXNzZXJ0SXModHJhY2ViYWNrMiwgdHJhY2ViYWNrMSkKIAogICAgIGRlZiB0ZXN0X2dldF90cmFjZWRfbWVtb3J5KHNlbGYpOgpAQCAtMjkyLDcgKzMwMCw3IEBACiAgICAgbWF4RGlmZiA9IDQwMDAKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV9zbmFwc2hvdChzZWxmKToKLSAgICAgICAgcmF3X3RyYWNlcyA9IFsoNSwgKCgnYS5weScsIDIpLCkpXQorICAgICAgICByYXdfdHJhY2VzID0gWygwLCA1LCAoKCdhLnB5JywgMiksKSldCiAKICAgICAgICAgd2l0aCBjb250ZXh0bGliLkV4aXRTdGFjaygpIGFzIHN0YWNrOgogICAgICAgICAgICAgc3RhY2suZW50ZXJfY29udGV4dChwYXRjaC5vYmplY3QodHJhY2VtYWxsb2MsICdpc190cmFjaW5nJywKQEAgLTMyMiwxMSArMzMwLDExIEBACiAgICAgICAgICMgZXhjbHVkZSBiLnB5CiAgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjEsKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMSwgMiwgKCgnYS5weScsIDUpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDMsIDcsICgoJzx1bmtub3duPicsIDApLCkpLAogICAgICAgICBdKQogCiAgICAgICAgICMgZmlsdGVyX3RyYWNlcygpIG11c3Qgbm90IHRvdWNoIHRoZSBvcmlnaW5hbCBzbmFwc2hvdApAQCAtMzM1LDEwICszNDMsMTAgQEAKICAgICAgICAgIyBvbmx5IGluY2x1ZGUgdHdvIGxpbmVzIG9mIGEucHkKICAgICAgICAgc25hcHNob3Q0ID0gc25hcHNob3QzLmZpbHRlcl90cmFjZXMoKGZpbHRlcjIsIGZpbHRlcjMpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90NC50cmFjZXMuX3RyYWNlcywgWwotICAgICAgICAgICAgKDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCi0gICAgICAgICAgICAoMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKLSAgICAgICAgICAgICgxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAotICAgICAgICAgICAgKDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgxLCAyLCAoKCdhLnB5JywgNSksICgnYi5weScsIDQpKSksCiAgICAgICAgIF0pCiAKICAgICAgICAgIyBObyBmaWx0ZXI6IGp1c3QgZHVwbGljYXRlIHRoZSBzbmFwc2hvdApAQCAtMzQ5LDYgKzM1Nyw1NCBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc25hcHNob3QuZmlsdGVyX3RyYWNlcywgZmlsdGVyMSkKIAorICAgIGRlZiB0ZXN0X2ZpbHRlcl90cmFjZXNfZG9tYWluKHNlbGYpOgorICAgICAgICBzbmFwc2hvdCwgc25hcHNob3QyID0gY3JlYXRlX3NuYXBzaG90cygpCisgICAgICAgIGZpbHRlcjEgPSB0cmFjZW1hbGxvYy5GaWx0ZXIoRmFsc2UsICJhLnB5IiwgZG9tYWluPTEpCisgICAgICAgIGZpbHRlcjIgPSB0cmFjZW1hbGxvYy5GaWx0ZXIoVHJ1ZSwgImEucHkiLCBkb21haW49MSkKKworICAgICAgICBvcmlnaW5hbF90cmFjZXMgPSBsaXN0KHNuYXBzaG90LnRyYWNlcy5fdHJhY2VzKQorCisgICAgICAgICMgZXhjbHVkZSBhLnB5IG9mIGRvbWFpbiAxCisgICAgICAgIHNuYXBzaG90MyA9IHNuYXBzaG90LmZpbHRlcl90cmFjZXMoKGZpbHRlcjEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmFwc2hvdDMudHJhY2VzLl90cmFjZXMsIFsKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgyLCA2NiwgKCgnYi5weScsIDEpLCkpLAorICAgICAgICAgICAgKDMsIDcsICgoJzx1bmtub3duPicsIDApLCkpLAorICAgICAgICBdKQorCisgICAgICAgICMgaW5jbHVkZSBkb21haW4gMQorICAgICAgICBzbmFwc2hvdDMgPSBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzKChmaWx0ZXIxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3QzLnRyYWNlcy5fdHJhY2VzLCBbCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMiwgNjYsICgoJ2IucHknLCAxKSwpKSwKKyAgICAgICAgICAgICgzLCA3LCAoKCc8dW5rbm93bj4nLCAwKSwpKSwKKyAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2ZpbHRlcl90cmFjZXNfZG9tYWluX2ZpbHRlcihzZWxmKToKKyAgICAgICAgc25hcHNob3QsIHNuYXBzaG90MiA9IGNyZWF0ZV9zbmFwc2hvdHMoKQorICAgICAgICBmaWx0ZXIxID0gdHJhY2VtYWxsb2MuRG9tYWluRmlsdGVyKEZhbHNlLCBkb21haW49MykKKyAgICAgICAgZmlsdGVyMiA9IHRyYWNlbWFsbG9jLkRvbWFpbkZpbHRlcihUcnVlLCBkb21haW49MykKKworICAgICAgICAjIGV4Y2x1ZGUgZG9tYWluIDIKKyAgICAgICAgc25hcHNob3QzID0gc25hcHNob3QuZmlsdGVyX3RyYWNlcygoZmlsdGVyMSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuYXBzaG90My50cmFjZXMuX3RyYWNlcywgWworICAgICAgICAgICAgKDAsIDEwLCAoKCdhLnB5JywgMiksICgnYi5weScsIDQpKSksCisgICAgICAgICAgICAoMCwgMTAsICgoJ2EucHknLCAyKSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgwLCAxMCwgKCgnYS5weScsIDIpLCAoJ2IucHknLCA0KSkpLAorICAgICAgICAgICAgKDEsIDIsICgoJ2EucHknLCA1KSwgKCdiLnB5JywgNCkpKSwKKyAgICAgICAgICAgICgyLCA2NiwgKCgnYi5weScsIDEpLCkpLAorICAgICAgICBdKQorCisgICAgICAgICMgaW5jbHVkZSBkb21haW4gMgorICAgICAgICBzbmFwc2hvdDMgPSBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzKChmaWx0ZXIyLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25hcHNob3QzLnRyYWNlcy5fdHJhY2VzLCBbCisgICAgICAgICAgICAoMywgNywgKCgnPHVua25vd24+JywgMCksKSksCisgICAgICAgIF0pCisKICAgICBkZWYgdGVzdF9zbmFwc2hvdF9ncm91cF9ieV9saW5lKHNlbGYpOgogICAgICAgICBzbmFwc2hvdCwgc25hcHNob3QyID0gY3JlYXRlX3NuYXBzaG90cygpCiAgICAgICAgIHRiXzAgPSB0cmFjZWJhY2tfbGluZW5vKCc8dW5rbm93bj4nLCAwKQpAQCAtODE2LDEyICs4NzIsMTIxIEBACiAgICAgICAgIGFzc2VydF9weXRob25fb2soJy1YJywgJ3RyYWNlbWFsbG9jJywgJy1jJywgY29kZSkKIAogCitAdW5pdHRlc3Quc2tpcElmKF90ZXN0Y2FwaSBpcyBOb25lLCAnbmVlZCBfdGVzdGNhcGknKQorY2xhc3MgVGVzdENBUEkodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIG1heERpZmYgPSA4MCAqIDIwCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIHRyYWNlbWFsbG9jLmlzX3RyYWNpbmcoKToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInRyYWNlbWFsbG9jIG11c3QgYmUgc3RvcHBlZCBiZWZvcmUgdGhlIHRlc3QiKQorCisgICAgICAgIHNlbGYuZG9tYWluID0gNQorICAgICAgICBzZWxmLnNpemUgPSAxMjMKKyAgICAgICAgc2VsZi5vYmogPSBhbGxvY2F0ZV9ieXRlcyhzZWxmLnNpemUpWzBdCisKKyAgICAgICAgIyBmb3IgdGhlIHR5cGUgIm9iamVjdCIsIGlkKG9iaikgaXMgdGhlIGFkZHJlc3Mgb2YgaXRzIG1lbW9yeSBibG9jay4KKyAgICAgICAgIyBUaGlzIHR5cGUgaXMgbm90IHRyYWNrZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yCisgICAgICAgIHNlbGYucHRyID0gaWQoc2VsZi5vYmopCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyYWNlbWFsbG9jLnN0b3AoKQorCisgICAgZGVmIGdldF90cmFjZWJhY2soc2VsZik6CisgICAgICAgIGZyYW1lcyA9IF90ZXN0Y2FwaS50cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKHNlbGYuZG9tYWluLCBzZWxmLnB0cikKKyAgICAgICAgaWYgZnJhbWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHRyYWNlbWFsbG9jLlRyYWNlYmFjayhmcmFtZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHRyYWNrKHNlbGYsIHJlbGVhc2VfZ2lsPUZhbHNlLCBuZnJhbWU9MSk6CisgICAgICAgIGZyYW1lcyA9IGdldF9mcmFtZXMobmZyYW1lLCAyKQorICAgICAgICBfdGVzdGNhcGkudHJhY2VtYWxsb2NfdHJhY2soc2VsZi5kb21haW4sIHNlbGYucHRyLCBzZWxmLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2dpbCkKKyAgICAgICAgcmV0dXJuIGZyYW1lcworCisgICAgZGVmIHVudHJhY2soc2VsZik6CisgICAgICAgIF90ZXN0Y2FwaS50cmFjZW1hbGxvY191bnRyYWNrKHNlbGYuZG9tYWluLCBzZWxmLnB0cikKKworICAgIGRlZiBnZXRfdHJhY2VkX21lbW9yeShzZWxmKToKKyAgICAgICAgIyBHZXQgdGhlIHRyYWNlZCBzaXplIGluIHRoZSBkb21haW4KKyAgICAgICAgc25hcHNob3QgPSB0cmFjZW1hbGxvYy50YWtlX3NuYXBzaG90KCkKKyAgICAgICAgZG9tYWluX2ZpbHRlciA9IHRyYWNlbWFsbG9jLkRvbWFpbkZpbHRlcihUcnVlLCBzZWxmLmRvbWFpbikKKyAgICAgICAgc25hcHNob3QgPSBzbmFwc2hvdC5maWx0ZXJfdHJhY2VzKFtkb21haW5fZmlsdGVyXSkKKyAgICAgICAgcmV0dXJuIHN1bSh0cmFjZS5zaXplIGZvciB0cmFjZSBpbiBzbmFwc2hvdC50cmFjZXMpCisKKyAgICBkZWYgY2hlY2tfdHJhY2soc2VsZiwgcmVsZWFzZV9naWwpOgorICAgICAgICBuZnJhbWUgPSA1CisgICAgICAgIHRyYWNlbWFsbG9jLnN0YXJ0KG5mcmFtZSkKKworICAgICAgICBzaXplID0gdHJhY2VtYWxsb2MuZ2V0X3RyYWNlZF9tZW1vcnkoKVswXQorCisgICAgICAgIGZyYW1lcyA9IHNlbGYudHJhY2socmVsZWFzZV9naWwsIG5mcmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF90cmFjZWJhY2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZW1hbGxvYy5UcmFjZWJhY2soZnJhbWVzKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlZF9tZW1vcnkoKSwgc2VsZi5zaXplKQorCisgICAgZGVmIHRlc3RfdHJhY2soc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHJhY2soRmFsc2UpCisKKyAgICBkZWYgdGVzdF90cmFja193aXRob3V0X2dpbChzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGNhbGxpbmcgX1B5VHJhY2VNYWxsb2NfVHJhY2soKSB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTAorICAgICAgICAjIHdvcmtzIHRvbworICAgICAgICBzZWxmLmNoZWNrX3RyYWNrKFRydWUpCisKKyAgICBkZWYgdGVzdF90cmFja19hbHJlYWR5X3RyYWNrZWQoc2VsZik6CisgICAgICAgIG5mcmFtZSA9IDUKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RhcnQobmZyYW1lKQorCisgICAgICAgICMgdHJhY2sgYSBmaXJzdCB0aW1lCisgICAgICAgIHNlbGYudHJhY2soKQorCisgICAgICAgICMgY2FsbGluZyBfUHlUcmFjZU1hbGxvY19UcmFjaygpIG11c3QgcmVtb3ZlIHRoZSBvbGQgdHJhY2UgYW5kIGFkZAorICAgICAgICAjIGEgbmV3IHRyYWNlIHdpdGggdGhlIG5ldyB0cmFjZWJhY2sKKyAgICAgICAgZnJhbWVzID0gc2VsZi50cmFjayhuZnJhbWU9bmZyYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlYmFjaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlbWFsbG9jLlRyYWNlYmFjayhmcmFtZXMpKQorCisgICAgZGVmIHRlc3RfdW50cmFjayhzZWxmKToKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RhcnQoKQorCisgICAgICAgIHNlbGYudHJhY2soKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShzZWxmLmdldF90cmFjZWJhY2soKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF90cmFjZWRfbWVtb3J5KCksIHNlbGYuc2l6ZSkKKworICAgICAgICAjIHVudHJhY2sgbXVzdCByZW1vdmUgdGhlIHRyYWNlCisgICAgICAgIHNlbGYudW50cmFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuZ2V0X3RyYWNlYmFjaygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3RyYWNlZF9tZW1vcnkoKSwgMCkKKworICAgICAgICAjIGNhbGxpbmcgX1B5VHJhY2VNYWxsb2NfVW50cmFjaygpIG11bHRpcGxlIHRpbWVzIG11c3Qgbm90IGNyYXNoCisgICAgICAgIHNlbGYudW50cmFjaygpCisgICAgICAgIHNlbGYudW50cmFjaygpCisKKyAgICBkZWYgdGVzdF9zdG9wX3RyYWNrKHNlbGYpOgorICAgICAgICB0cmFjZW1hbGxvYy5zdGFydCgpCisgICAgICAgIHRyYWNlbWFsbG9jLnN0b3AoKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYudHJhY2soKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLmdldF90cmFjZWJhY2soKSkKKworICAgIGRlZiB0ZXN0X3N0b3BfdW50cmFjayhzZWxmKToKKyAgICAgICAgdHJhY2VtYWxsb2Muc3RhcnQoKQorICAgICAgICBzZWxmLnRyYWNrKCkKKworICAgICAgICB0cmFjZW1hbGxvYy5zdG9wKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi51bnRyYWNrKCkKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoCiAgICAgICAgIFRlc3RUcmFjZW1hbGxvY0VuYWJsZWQsCiAgICAgICAgIFRlc3RTbmFwc2hvdCwKICAgICAgICAgVGVzdEZpbHRlcnMsCiAgICAgICAgIFRlc3RDb21tYW5kTGluZSwKKyAgICAgICAgVGVzdENBUEksCiAgICAgKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weSBiL0xpYi90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHkKaW5kZXggNDkwZTcyMy4uNDYyNjY1ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5CkBAIC0xLDQgKzEsMyBAQAotaW1wb3J0IG9zCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weSBiL0xpYi90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5CmluZGV4IDU2NmZjOWQuLjc1NDBhNDMxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weQpAQCAtMSw0ICsxLDMgQEAKLWltcG9ydCBvcwogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiAKICMgU2tpcCB0aGlzIHRlc3QgaWYgX3RraW50ZXIgZG9lcyBub3QgZXhpc3QuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VucGFjay5weSBiL0xpYi90ZXN0L3Rlc3RfdW5wYWNrLnB5CmluZGV4IGQxY2NiMzguLjNmY2IxOGYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5wYWNrLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5wYWNrLnB5CkBAIC0xMTcsNiArMTE3LDI3IEBACiAgICAgICAuLi4KICAgICB0ZXN0LnRlc3RfdW5wYWNrLkJvem9FcnJvcgogCitBbGxvdyB1bnBhY2tpbmcgZW1wdHkgaXRlcmFibGVzCisKKyAgICA+Pj4gKCkgPSBbXQorICAgID4+PiBbXSA9ICgpCisgICAgPj4+IFtdID0gW10KKyAgICA+Pj4gKCkgPSAoKQorCitVbnBhY2tpbmcgbm9uLWl0ZXJhYmxlcyBzaG91bGQgcmFpc2UgVHlwZUVycm9yCisKKyAgICA+Pj4gKCkgPSA0MgorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogJ2ludCcgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZQorCitVbnBhY2tpbmcgdG8gYW4gZW1wdHkgaXRlcmFibGUgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IKKworICAgID4+PiAoKSA9IFs0Ml0KKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiB0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrIChleHBlY3RlZCAwKQorCiAiIiIKIAogX190ZXN0X18gPSB7J2RvY3Rlc3RzJyA6IGRvY3Rlc3RzfQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bnBhY2tfZXgucHkgYi9MaWIvdGVzdC90ZXN0X3VucGFja19leC5weQppbmRleCA3NDM0NmI0Li42YmU4ZjU1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VucGFja19leC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VucGFja19leC5weQpAQCAtMzU3LDcgKzM1Nyw2IEBACiBfX3Rlc3RfXyA9IHsnZG9jdGVzdHMnIDogZG9jdGVzdHN9CiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1GYWxzZSk6Ci0gICAgaW1wb3J0IHN5cwogICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydAogICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF91bnBhY2tfZXgKICAgICBzdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfdW5wYWNrX2V4LCB2ZXJib3NlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CmluZGV4IGM4YjM3ZWUuLmU5NTY0ZmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKQEAgLTI4OSwxMiArMjg5LDEyIEBACiAgICAgICAgIGRlZiBodHRwX3NlcnZlcl93aXRoX2Jhc2ljX2F1dGhfaGFuZGxlcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAgcmV0dXJuIEJhc2ljQXV0aEhhbmRsZXIoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICBzZWxmLnNlcnZlciA9IExvb3BiYWNrSHR0cFNlcnZlclRocmVhZChodHRwX3NlcnZlcl93aXRoX2Jhc2ljX2F1dGhfaGFuZGxlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuc2VydmVyLnN0b3ApCiAgICAgICAgIHNlbGYuc2VydmVyX3VybCA9ICdodHRwOi8vMTI3LjAuMC4xOiVzJyAlIHNlbGYuc2VydmVyLnBvcnQKICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQogICAgICAgICBzZWxmLnNlcnZlci5yZWFkeS53YWl0KCkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCiAgICAgICAgIHN1cGVyKEJhc2ljQXV0aFRlc3RzLCBzZWxmKS50ZWFyRG93bigpCiAKICAgICBkZWYgdGVzdF9iYXNpY19hdXRoX3N1Y2Nlc3Moc2VsZik6CkBAIC00MzgsMTcgKzQzOCwxMyBAQAogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzdXBlcihUZXN0VXJsb3Blbiwgc2VsZikuc2V0VXAoKQotICAgICAgICAjIElnbm9yZSBwcm94aWVzIGZvciBsb2NhbGhvc3QgdGVzdHMuCi0gICAgICAgIHNlbGYub2xkX2Vudmlyb24gPSBvcy5lbnZpcm9uLmNvcHkoKQotICAgICAgICBvcy5lbnZpcm9uWydOT19QUk9YWSddID0gJyonCi0gICAgICAgIHNlbGYuc2VydmVyID0gTm9uZQogCi0gICAgZGVmIHRlYXJEb3duKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnNlcnZlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQotICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKLSAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoc2VsZi5vbGRfZW52aXJvbikKLSAgICAgICAgc3VwZXIoVGVzdFVybG9wZW4sIHNlbGYpLnRlYXJEb3duKCkKKyAgICAgICAgIyBJZ25vcmUgcHJveGllcyBmb3IgbG9jYWxob3N0IHRlc3RzLgorICAgICAgICBkZWYgcmVzdG9yZV9lbnZpcm9uKG9sZF9lbnZpcm9uKToKKyAgICAgICAgICAgIG9zLmVudmlyb24uY2xlYXIoKQorICAgICAgICAgICAgb3MuZW52aXJvbi51cGRhdGUob2xkX2Vudmlyb24pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2Vudmlyb24sIG9zLmVudmlyb24uY29weSgpKQorICAgICAgICBvcy5lbnZpcm9uWydOT19QUk9YWSddID0gJyonCiAKICAgICBkZWYgdXJsb3BlbihzZWxmLCB1cmwsIGRhdGE9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICBsID0gW10KQEAgLTQ2OSw2ICs0NjUsNyBAQAogICAgICAgICBoYW5kbGVyID0gR2V0UmVxdWVzdEhhbmRsZXIocmVzcG9uc2VzKQogCiAgICAgICAgIHNlbGYuc2VydmVyID0gTG9vcGJhY2tIdHRwU2VydmVyVGhyZWFkKGhhbmRsZXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLnNlcnZlci5zdG9wKQogICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCiAgICAgICAgIHNlbGYuc2VydmVyLnJlYWR5LndhaXQoKQogICAgICAgICBwb3J0ID0gc2VsZi5zZXJ2ZXIucG9ydApAQCAtNTkyLDcgKzU4OSw4IEBACiAgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcigpCiAgICAgICAgIHJlcSA9IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QoImh0dHA6Ly9sb2NhbGhvc3Q6JXMvIiAlIGhhbmRsZXIucG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiUmFuZ2UiOiAiYnl0ZXM9MjAtMzkifSkKLSAgICAgICAgdXJsbGliLnJlcXVlc3QudXJsb3BlbihyZXEpCisgICAgICAgIHdpdGggdXJsbGliLnJlcXVlc3QudXJsb3BlbihyZXEpOgorICAgICAgICAgICAgcGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXIuaGVhZGVyc19yZWNlaXZlZFsiUmFuZ2UiXSwgImJ5dGVzPTIwLTM5IikKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgpAQCAtNjA4LDIyICs2MDYsMjEgQEAKIAogICAgIGRlZiB0ZXN0X2luZm8oc2VsZik6CiAgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcigpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9wZW5fdXJsID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbigKLSAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgIG9wZW5fdXJsID0gdXJsbGliLnJlcXVlc3QudXJsb3BlbigKKyAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgd2l0aCBvcGVuX3VybDoKICAgICAgICAgICAgIGluZm9fb2JqID0gb3Blbl91cmwuaW5mbygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5mb19vYmosIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmVkIGJ5ICdpbmZvJyBpcyBub3QgYW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBvZiBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvX29iai5nZXRfY29udGVudF9zdWJ0eXBlKCksICJwbGFpbiIpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluZm9fb2JqLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmVkIGJ5ICdpbmZvJyBpcyBub3QgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlIG9mIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb19vYmouZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAicGxhaW4iKQogCiAgICAgZGVmIHRlc3RfZ2V0dXJsKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSBzYW1lIFVSTCBhcyBvcGVuZWQgaXMgcmV0dXJuZWQgYnkgZ2V0dXJsLgogICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoKQogICAgICAgICBvcGVuX3VybCA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4oImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQotICAgICAgICB1cmwgPSBvcGVuX3VybC5nZXR1cmwoKQorICAgICAgICB3aXRoIG9wZW5fdXJsOgorICAgICAgICAgICAgdXJsID0gb3Blbl91cmwuZ2V0dXJsKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmwsICJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKIAogICAgIGRlZiB0ZXN0X2l0ZXJhdGlvbihzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkKaW5kZXggYjgxMTkzMC4uOTQ5NzE2YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkKQEAgLTQsNyArNCw2IEBACiBpbXBvcnQgY29udGV4dGxpYgogaW1wb3J0IHNvY2tldAogaW1wb3J0IHVybGxpYi5yZXF1ZXN0Ci1pbXBvcnQgc3lzCiBpbXBvcnQgb3MKIGltcG9ydCBlbWFpbC5tZXNzYWdlCiBpbXBvcnQgdGltZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKaW5kZXggODI5OTk3Zi4uOTE2NWQ3MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CkBAIC02MDUsMjkgKzYwNSwyNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgODApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJsKQogCi0gICAgICAgICMgVmVyaWZ5IGFuIGlsbGVnYWwgcG9ydCBpcyByZXR1cm5lZCBhcyBOb25lCisgICAgICAgICMgVmVyaWZ5IGFuIGlsbGVnYWwgcG9ydCByYWlzZXMgVmFsdWVFcnJvcgogICAgICAgICB1cmwgPSBiIkhUVFA6Ly9XV1cuUFlUSE9OLk9SRzo2NTUzNi9kb2MvI2ZyYWciCiAgICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQodXJsKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgTm9uZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFZhbHVlRXJyb3IsICJvdXQgb2YgcmFuZ2UiKToKKyAgICAgICAgICAgIHAucG9ydAogCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlc19iYWRfcG9ydChzZWxmKToKLSAgICAgICAgIiIiQ2hlY2sgaGFuZGxpbmcgb2Ygbm9uLWludGVnZXIgcG9ydHMuIiIiCi0gICAgICAgIHAgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQoImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgInd3dy5leGFtcGxlLm5ldDpmb28iKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHAucG9ydCkKLQotICAgICAgICBwID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCi0KLSAgICAgICAgIyBPbmNlIGFnYWluLCByZXBlYXQgb3Vyc2VsdmVzIHRvIHRlc3QgYnl0ZXMKLSAgICAgICAgcCA9IHVybGxpYi5wYXJzZS51cmxzcGxpdChiImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgYiJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCi0KLSAgICAgICAgcCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShiImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgYiJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCisgICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIGludmFsaWQgcG9ydHMuIiIiCisgICAgICAgIGZvciBieXRlcyBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgZm9yIHBhcnNlIGluICh1cmxsaWIucGFyc2UudXJsc3BsaXQsIHVybGxpYi5wYXJzZS51cmxwYXJzZSk6CisgICAgICAgICAgICAgICAgZm9yIHBvcnQgaW4gKCJmb28iLCAiMS41IiwgIi0xIiwgIjB4MTAiKToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3QoYnl0ZXM9Ynl0ZXMsIHBhcnNlPXBhcnNlLCBwb3J0PXBvcnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV0bG9jID0gInd3dy5leGFtcGxlLm5ldDoiICsgcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gImh0dHA6Ly8iICsgbmV0bG9jCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBieXRlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRsb2MgPSBuZXRsb2MuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHBhcnNlKHVybCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsIG5ldGxvYykKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5wb3J0CiAKICAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX3dpdGhvdXRfbmV0bG9jKHNlbGYpOgogICAgICAgICAjIFRoaXMgZXhhbXBsZSBpcyBzdHJhaWdodCBmcm9tIFJGQyAzMjYxLiAgSXQgbG9va3MgbGlrZSBpdApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKaW5kZXggODM1N2Y4Yi4uNjYyYzdmNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CkBAIC0xLDYgKzEsNiBAQAogIyBDaGVjayBldmVyeSBwYXRoIHRocm91Z2ggZXZlcnkgbWV0aG9kIG9mIFVzZXJEaWN0CiAKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydCwgbWFwcGluZ190ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBtYXBwaW5nX3Rlc3RzCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBjb2xsZWN0aW9ucwogCkBAIC0zMCw3ICszMCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29sbGVjdGlvbnMuVXNlckRpY3Qob25lPTEsIHR3bz0yKSwgZDIpCiAgICAgICAgICMgaXRlbSBzZXF1ZW5jZSBjb25zdHJ1Y3RvcgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KFsoJ29uZScsMSksICgndHdvJywyKV0pLCBkMikKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIidkaWN0JyIpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsICInZGljdCciKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29sbGVjdGlvbnMuVXNlckRpY3QoZGljdD1bKCdvbmUnLDEpLCAoJ3R3bycsMildKSwgZDIpCiAgICAgICAgICMgYm90aCB0b2dldGhlcgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbGxlY3Rpb25zLlVzZXJEaWN0KFsoJ29uZScsMSksICgndHdvJywyKV0sIHR3bz0zLCB0aHJlZT01KSwgZDMpCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdkaWN0JywgNDIpXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbGxlY3Rpb25zLlVzZXJEaWN0KHt9LCBkaWN0PU5vbmUpLml0ZW1zKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2RpY3QnLCBOb25lKV0pCi0gICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJuc1JlZ2V4KFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsICInZGljdCciKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiJ2RpY3QnIik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29sbGVjdGlvbnMuVXNlckRpY3QoZGljdD17J2EnOiA0Mn0pLml0ZW1zKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdhJywgNDIpXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2xsZWN0aW9ucy5Vc2VyRGljdCwgNDIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5IGIvTGliL3Rlc3QvdGVzdF91c2VybGlzdC5weQppbmRleCBmOTJlNGQzLi44ZGU2YzE0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VzZXJsaXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcmxpc3QucHkKQEAgLTEsNyArMSw3IEBACiAjIENoZWNrIGV2ZXJ5IHBhdGggdGhyb3VnaCBldmVyeSBtZXRob2Qgb2YgVXNlckxpc3QKIAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgVXNlckxpc3QKLWZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydCwgbGlzdF90ZXN0cworZnJvbSB0ZXN0IGltcG9ydCBsaXN0X3Rlc3RzCiBpbXBvcnQgdW5pdHRlc3QKIAogY2xhc3MgVXNlckxpc3RUZXN0KGxpc3RfdGVzdHMuQ29tbW9uVGVzdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkgYi9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkKaW5kZXggOWJjOGVkZC4uNzE1MjgyMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQpAQCAtMSw5ICsxLDggQEAKICMgVXNlclN0cmluZyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgYnVpbHRpbiBzdHJpbmcgdHlwZS4KICMgVXNlclN0cmluZyBpbnN0YW5jZXMgc2hvdWxkIGJlaGF2ZSBzaW1pbGFyIHRvIGJ1aWx0aW4gc3RyaW5nIG9iamVjdHMuCiAKLWltcG9ydCBzdHJpbmcKIGltcG9ydCB1bml0dGVzdAotZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0LCBzdHJpbmdfdGVzdHMKK2Zyb20gdGVzdCBpbXBvcnQgc3RyaW5nX3Rlc3RzCiAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IFVzZXJTdHJpbmcKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91dS5weSBiL0xpYi90ZXN0L3Rlc3RfdXUucHkKaW5kZXggMjVmZmZiZi4uYWQyZjJjNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91dS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3V1LnB5CkBAIC04LDcgKzgsNiBAQAogCiBpbXBvcnQgc3lzLCBvcwogaW1wb3J0IHV1Ci1mcm9tIGlvIGltcG9ydCBCeXRlc0lPCiBpbXBvcnQgaW8KIAogcGxhaW50ZXh0ID0gYiJUaGUgc21vb3RoLXNjYWxlZCBweXRob24gY3JlcHQgb3ZlciB0aGUgc2xlZXBpbmcgZG9nXG4iCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ZlbnYucHkgYi9MaWIvdGVzdC90ZXN0X3ZlbnYucHkKaW5kZXggZDJjOTg2ZS4uYTI4NDJiMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF92ZW52LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdmVudi5weQpAQCAtMTUsNyArMTUsNiBAQAogaW1wb3J0IHRlbXBmaWxlCiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgKGNhcHR1cmVkX3N0ZG91dCwgY2FwdHVyZWRfc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5fc3ltbGluaywgRW52aXJvbm1lbnRWYXJHdWFyZCwgcm10cmVlKQotaW1wb3J0IHRleHR3cmFwCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB2ZW52CiAKQEAgLTMxLDE4ICszMCwxNyBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIHRocmVhZGluZyA9IE5vbmUKIAordHJ5OgorICAgIGltcG9ydCBjdHlwZXMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBjdHlwZXMgPSBOb25lCisKIHNraXBJblZlbnYgPSB1bml0dGVzdC5za2lwSWYoc3lzLnByZWZpeCAhPSBzeXMuYmFzZV9wcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUZXN0IG5vdCBhcHByb3ByaWF0ZSBpbiBhIHZlbnYnKQogCi0jIG9zLnBhdGguZXhpc3RzKCdudWwnKSBpcyBGYWxzZTogaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIwNTQxCi1pZiBvcy5kZXZudWxsLmxvd2VyKCkgPT0gJ251bCc6Ci0gICAgZmFpbHNPbldpbmRvd3MgPSB1bml0dGVzdC5leHBlY3RlZEZhaWx1cmUKLWVsc2U6Ci0gICAgZGVmIGZhaWxzT25XaW5kb3dzKGYpOgotICAgICAgICByZXR1cm4gZgotCiBjbGFzcyBCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiQmFzZSBjbGFzcyBmb3IgdmVudiB0ZXN0cy4iIiIKKyAgICBtYXhEaWZmID0gODAgKiA1MAogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmVudl9kaXIgPSBvcy5wYXRoLnJlYWxwYXRoKHRlbXBmaWxlLm1rZHRlbXAoKSkKQEAgLTUyLDcgKzUwLDcgQEAKICAgICAgICAgICAgIHNlbGYuaW5jbHVkZSA9ICdJbmNsdWRlJwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5iaW5kaXIgPSAnYmluJwotICAgICAgICAgICAgc2VsZi5saWIgPSAoJ2xpYicsICdweXRob24lcycgJSBzeXMudmVyc2lvbls6M10pCisgICAgICAgICAgICBzZWxmLmxpYiA9ICgnbGliJywgJ3B5dGhvbiVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdKQogICAgICAgICAgICAgc2VsZi5pbmNsdWRlID0gJ2luY2x1ZGUnCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgJ19fUFlWRU5WX0xBVU5DSEVSX18nIGluIG9zLmVudmlyb246CiAgICAgICAgICAgICBleGVjdXRhYmxlID0gb3MuZW52aXJvblsnX19QWVZFTlZfTEFVTkNIRVJfXyddCkBAIC0zMTMsMjAgKzMxMSwyNyBAQAogICAgICAgICBzZWxmLnJ1bl93aXRoX2NhcHR1cmUodmVudi5jcmVhdGUsIHNlbGYuZW52X2Rpciwgd2l0aF9waXA9RmFsc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0X3BpcF9ub3RfaW5zdGFsbGVkKCkKIAotICAgIEBmYWlsc09uV2luZG93cwotICAgIGRlZiB0ZXN0X2Rldm51bGxfZXhpc3RzX2FuZF9pc19lbXB0eShzZWxmKToKKyAgICBkZWYgdGVzdF9kZXZudWxsKHNlbGYpOgogICAgICAgICAjIEZpeCBmb3IgaXNzdWUgIzIwMDUzIHVzZXMgb3MuZGV2bnVsbCB0byBmb3JjZSBhIGNvbmZpZyBmaWxlIHRvCiAgICAgICAgICMgYXBwZWFyIGVtcHR5LiBIb3dldmVyIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDU0MSBtZWFucwogICAgICAgICAjIHRoYXQgZG9lc24ndCBjdXJyZW50bHkgd29yayBwcm9wZXJseSBvbiBXaW5kb3dzLiBPbmNlIHRoYXQgaXMKICAgICAgICAgIyBmaXhlZCwgdGhlICJ3aW5fbG9jYXRpb24iIHBhcnQgb2YgdGVzdF93aXRoX3BpcCBzaG91bGQgYmUgcmVzdG9yZWQKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLmRldm51bGwpKQogICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgInJiIikgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIiIikKIAorICAgICAgICAjIElzc3VlICMyMDU0MTogb3MucGF0aC5leGlzdHMoJ251bCcpIGlzIEZhbHNlIG9uIFdpbmRvd3MKKyAgICAgICAgaWYgb3MuZGV2bnVsbC5sb3dlcigpID09ICdudWwnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhvcy5kZXZudWxsKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5kZXZudWxsKSkKKworCiAgICAgIyBSZXF1ZXN0aW5nIHBpcCBmYWlscyB3aXRob3V0IFNTTCAoaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE5NzQ0KQogICAgIEB1bml0dGVzdC5za2lwSWYoc3NsIGlzIE5vbmUsIGVuc3VyZXBpcC5fTUlTU0lOR19TU0xfTUVTU0FHRSkKICAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdzb21lIGRlcGVuZGVuY2llcyBvZiBwaXAgaW1wb3J0IHRocmVhZGluZycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgbW9kdWxlIHVuY29uZGl0aW9uYWxseScpCisgICAgIyBJc3N1ZSAjMjY2MTA6IHBpcC9wZXA0MjV0YWdzLnB5IHJlcXVpcmVzIGN0eXBlcworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGN0eXBlcywgJ3BpcCByZXF1aXJlcyBjdHlwZXMnKQogICAgIGRlZiB0ZXN0X3dpdGhfcGlwKHNlbGYpOgogICAgICAgICBybXRyZWUoc2VsZi5lbnZfZGlyKQogICAgICAgICB3aXRoIEVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnZ2YXJzOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9fX2luaXRfXy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MvX19pbml0X18ucHkKaW5kZXggYTMzNDA0ZS4uZTdiODVmMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy9fX2luaXRfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzL19faW5pdF9fLnB5CkBAIC0yLDcgKzIsOSBAQAogaW1wb3J0IGxpbmVjYWNoZQogaW1wb3J0IG9zCiBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IHJlCiBpbXBvcnQgc3lzCitpbXBvcnQgdGV4dHdyYXAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3Quc3VwcG9ydC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rLCBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUKQEAgLTcwOCw2ICs3MTAsMTcgQEAKICAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHJlYW0uZ2V0dmFsdWUoKQogICAgICAgICBzZWxmLmFzc2VydEluKHRleHQsIHJlc3VsdCkKIAorICAgIGRlZiB0ZXN0X3Nob3d3YXJubXNnX21pc3Npbmcoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IF9zaG93d2Fybm1zZygpIG1pc3NpbmcgaXMgb2theS4KKyAgICAgICAgdGV4dCA9ICdkZWwgX3Nob3d3YXJubXNnIHRlc3QnCisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXNlbGYubW9kdWxlKToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJhbHdheXMiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIGRlbCBzZWxmLm1vZHVsZS5fc2hvd3dhcm5tc2cKKyAgICAgICAgICAgIHdpdGggc3VwcG9ydC5jYXB0dXJlZF9vdXRwdXQoJ3N0ZGVycicpIGFzIHN0cmVhbToKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKHRleHQpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih0ZXh0LCByZXN1bHQpCisKICAgICBkZWYgdGVzdF9zaG93d2FybmluZ19ub3RfY2FsbGFibGUoc2VsZik6CiAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXNlbGYubW9kdWxlKToKICAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJhbHdheXMiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKQEAgLTgwOSwxMiArODIyLDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfb2JqZWN0LCBleHBlY3RlZF9maWxlX2xpbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBmaWxlX29iamVjdC5nZXR2YWx1ZSgpKQogCisKIGNsYXNzIENXYXJuaW5nc0Rpc3BsYXlUZXN0cyhXYXJuaW5nc0Rpc3BsYXlUZXN0cywgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIG1vZHVsZSA9IGNfd2FybmluZ3MKIAogY2xhc3MgUHlXYXJuaW5nc0Rpc3BsYXlUZXN0cyhXYXJuaW5nc0Rpc3BsYXlUZXN0cywgdW5pdHRlc3QuVGVzdENhc2UpOgogICAgIG1vZHVsZSA9IHB5X3dhcm5pbmdzCiAKKyAgICBkZWYgdGVzdF90cmFjZW1hbGxvYyhzZWxmKToKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKworICAgICAgICB3aXRoIG9wZW4oc3VwcG9ydC5URVNURk4sICd3JykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZSh0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICAgICAgZGVmIGZ1bmMoKToKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4oX19maWxlX18pCisgICAgICAgICAgICAgICAgICAgICMgRW1pdCBSZXNvdXJjZVdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgZiA9IE5vbmUKKworICAgICAgICAgICAgICAgIGZ1bmMoKQorICAgICAgICAgICAgIiIiKSkKKworICAgICAgICByZXMgPSBhc3NlcnRfcHl0aG9uX29rKCctV2QnLCAnLVgnLCAndHJhY2VtYWxsb2M9MicsIHN1cHBvcnQuVEVTVEZOKQorCisgICAgICAgIHN0ZGVyciA9IHJlcy5lcnIuZGVjb2RlKCdhc2NpaScsICdyZXBsYWNlJykKKyAgICAgICAgIyBub3JtYWxpemUgbmV3bGluZXMKKyAgICAgICAgc3RkZXJyID0gJ1xuJy5qb2luKHN0ZGVyci5zcGxpdGxpbmVzKCkpCisgICAgICAgIHN0ZGVyciA9IHJlLnN1YignPC4qPicsICc8Li4uPicsIHN0ZGVycikKKyAgICAgICAgZXhwZWN0ZWQgPSB0ZXh0d3JhcC5kZWRlbnQoJycnCisgICAgICAgICAgICB7Zm5hbWV9OjU6IFJlc291cmNlV2FybmluZzogdW5jbG9zZWQgZmlsZSA8Li4uPgorICAgICAgICAgICAgICBmID0gTm9uZQorICAgICAgICAgICAgT2JqZWN0IGFsbG9jYXRlZCBhdCAobW9zdCByZWNlbnQgY2FsbCBmaXJzdCk6CisgICAgICAgICAgICAgIEZpbGUgIntmbmFtZX0iLCBsaW5lbm8gMworICAgICAgICAgICAgICAgIGYgPSBvcGVuKF9fZmlsZV9fKQorICAgICAgICAgICAgICBGaWxlICJ7Zm5hbWV9IiwgbGluZW5vIDcKKyAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgJycnKQorICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkLmZvcm1hdChmbmFtZT1zdXBwb3J0LlRFU1RGTikuc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZGVyciwgZXhwZWN0ZWQpCisKIAogY2xhc3MgQ2F0Y2hXYXJuaW5nVGVzdHMoQmFzZVRlc3QpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhdmUucHkgYi9MaWIvdGVzdC90ZXN0X3dhdmUucHkKaW5kZXggM2VmZjc3My4uODY2NmY3MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93YXZlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2F2ZS5weQpAQCAtMSw2ICsxLDYgQEAKLWZyb20gdGVzdC5zdXBwb3J0IGltcG9ydCBURVNURk4KIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCBhdWRpb3Rlc3RzCitmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIGZyb20gYXVkaW9vcCBpbXBvcnQgYnl0ZXN3YXAKIGltcG9ydCBzeXMKIGltcG9ydCB3YXZlCkBAIC0xMDMsNSArMTAzLDExIEBACiAgICAgICAgIGZyYW1lcyA9IGJ5dGVzd2FwKGZyYW1lcywgNCkKIAogCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgYmxhY2tsaXN0ID0geydXQVZFX0ZPUk1BVF9QQ00nfQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCB3YXZlLCBibGFja2xpc3Q9YmxhY2tsaXN0KQorCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dlYWtzZXQucHkgYi9MaWIvdGVzdC90ZXN0X3dlYWtzZXQucHkKaW5kZXggOWNlNjcyYi4uNjkxYjk1ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93ZWFrc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2Vha3NldC5weQpAQCAtMSwxMyArMSw2IEBACiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gd2Vha3JlZiBpbXBvcnQgcHJveHksIHJlZiwgV2Vha1NldAotaW1wb3J0IG9wZXJhdG9yCi1pbXBvcnQgY29weQorZnJvbSB3ZWFrcmVmIGltcG9ydCBXZWFrU2V0CiBpbXBvcnQgc3RyaW5nCi1pbXBvcnQgb3MKLWZyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UsIHNodWZmbGUKLWltcG9ydCBzeXMKLWltcG9ydCB3YXJuaW5ncwotaW1wb3J0IGNvbGxlY3Rpb25zCiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBVc2VyU3RyaW5nIGFzIHVzdHIKIGltcG9ydCBnYwogaW1wb3J0IGNvbnRleHRsaWIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5IGIvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKaW5kZXggMmM0YWMwOC4uZWY0MGU4YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKQEAgLTM3LDYgKzM3LDcgQEAKIAogdGVzdF9kYXRhID0gWwogICAgICgiSW50IFZhbHVlIiwgICAgIDQ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX0RXT1JEKSwKKyAgICAoIlF3b3JkIFZhbHVlIiwgICAweDExMjIzMzQ0NTU2Njc3ODgsICAgICAgICAgICAgICAgICAgICAgIFJFR19RV09SRCksCiAgICAgKCJTdHJpbmcgVmFsIiwgICAgIkEgc3RyaW5nIHZhbHVlIiwgICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1opLAogICAgICgiU3RyaW5nRXhwYW5kIiwgICJUaGUgcGF0aCBpcyAlcGF0aCUiLCAgICAgICAgICAgICAgICAgICAgUkVHX0VYUEFORF9TWiksCiAgICAgKCJNdWx0aS1zdHJpbmciLCAgWyJMb3RzIiwgIm9mIiwgInN0cmluZyIsICJ2YWx1ZXMiXSwgICAgICBSRUdfTVVMVElfU1opLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93aXRoLnB5IGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CmluZGV4IGU4ZDc4OWIuLmUyNDdmZjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dpdGgucHkKQEAgLTE0MCwxMSArMTQwLDYgQEAKICAgICAgICAgICAgICd3aXRoIG1vY2sgYXMgKE5vbmUpOlxuJwogICAgICAgICAgICAgJyAgcGFzcycpCiAKLSAgICBkZWYgdGVzdEFzc2lnbm1lbnRUb0VtcHR5VHVwbGVFcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNTeW50YXhFcnJvcigKLSAgICAgICAgICAgICd3aXRoIG1vY2sgYXMgKCk6XG4nCi0gICAgICAgICAgICAnICBwYXNzJykKLQogICAgIGRlZiB0ZXN0QXNzaWdubWVudFRvVHVwbGVPbmx5Q29udGFpbmluZ05vbmVFcnJvcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNTeW50YXhFcnJvcignd2l0aCBtb2NrIGFzIE5vbmUsOlxuICBwYXNzJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNTeW50YXhFcnJvcigKQEAgLTQ1NCw3ICs0NDksNyBAQAogICAgICAgICAgICAgd2l0aCBjbSgpOgogICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oImZyb20gd2l0aCIpCiAKLSAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgIlN0b3BJdGVyYXRpb24iKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zUmVnZXgoRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCiAKICAgICBkZWYgdGVzdFJhaXNlZFN0b3BJdGVyYXRpb24yKHNlbGYpOgpAQCAtNDgyLDcgKzQ3Nyw3IEBACiAgICAgICAgICAgICB3aXRoIGNtKCk6CiAgICAgICAgICAgICAgICAgcmFpc2UgbmV4dChpdGVyKFtdKSkKIAotICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAiU3RvcEl0ZXJhdGlvbiIpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnNSZWdleChEZXByZWNhdGlvbldhcm5pbmcsICJTdG9wSXRlcmF0aW9uIik6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBzaG91bGRUaHJvdykKIAogICAgIGRlZiB0ZXN0UmFpc2VkR2VuZXJhdG9yRXhpdDEoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weSBiL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5CmluZGV4IGJjMWRkMTQuLjZlNTQ2MjggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5CkBAIC05MSw4ICs5MSw2IEBACiAKIAogY2xhc3MgTW9kdWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgIyBUT0RPOiB0aGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2Ugd2UgZ2V0IHJpZCBvZiB0aGUgZ2xvYmFsIG1vZHVsZSB2YXJzCi0KICAgICBkZWYgdGVzdF9zYW5pdHkoc2VsZik6CiAgICAgICAgICMgSW1wb3J0IHNhbml0eS4KIApAQCAtMTAwLDYgKzk4LDEwIEBACiAgICAgICAgIGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQogICAgICAgICBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFBhdGgKIAorICAgIGRlZiB0ZXN0X2FsbChzZWxmKToKKyAgICAgICAgbmFtZXMgPSAoInhtbC5ldHJlZS5FbGVtZW50VHJlZSIsICJfZWxlbWVudHRyZWUiKQorICAgICAgICBzdXBwb3J0LmNoZWNrX19hbGxfXyhzZWxmLCBFVCwgbmFtZXMsIGJsYWNrbGlzdD0oIkhUTUxfRU1QVFkiLCkpCisKIAogZGVmIHNlcmlhbGl6ZShlbGVtLCB0b19zdHJpbmc9VHJ1ZSwgZW5jb2Rpbmc9J3VuaWNvZGUnLCAqKm9wdGlvbnMpOgogICAgIGlmIGVuY29kaW5nICE9ICd1bmljb2RlJzoKQEAgLTE4MiwxMCArMTg0LDEyIEBACiAKICAgICAgICAgZGVmIGNoZWNrX2VsZW1lbnQoZWxlbWVudCk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRVQuaXNlbGVtZW50KGVsZW1lbnQpLCBtc2c9Im5vdCBhbiBlbGVtZW50IikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVsZW1lbnQsICJ0YWciKSwgbXNnPSJubyB0YWcgbWVtYmVyIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVsZW1lbnQsICJhdHRyaWIiKSwgbXNnPSJubyBhdHRyaWIgbWVtYmVyIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVsZW1lbnQsICJ0ZXh0IiksIG1zZz0ibm8gdGV4dCBtZW1iZXIiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZWxlbWVudCwgInRhaWwiKSwgbXNnPSJubyB0YWlsIG1lbWJlciIpCisgICAgICAgICAgICBkaXJlbGVtID0gZGlyKGVsZW1lbnQpCisgICAgICAgICAgICBmb3IgYXR0ciBpbiAndGFnJywgJ2F0dHJpYicsICd0ZXh0JywgJ3RhaWwnOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVsZW1lbnQsIGF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdubyAlcyBtZW1iZXInICUgYXR0cikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGF0dHIsIGRpcmVsZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J25vICVzIHZpc2libGUgYnkgZGlyJyAlIGF0dHIpCiAKICAgICAgICAgICAgIGNoZWNrX3N0cmluZyhlbGVtZW50LnRhZykKICAgICAgICAgICAgIGNoZWNrX21hcHBpbmcoZWxlbWVudC5hdHRyaWIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQppbmRleCA5NmI0NDZlLi44N2YzZjI3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKQEAgLTEsNSArMSw1IEBACiAjIHhtbC5ldHJlZSB0ZXN0IGZvciBjRWxlbWVudFRyZWUKLWltcG9ydCBzeXMsIHN0cnVjdAoraW1wb3J0IHN0cnVjdAogZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0CiBmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgaW1wb3J0X2ZyZXNoX21vZHVsZQogaW1wb3J0IHR5cGVzCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LmNhbGNzaXplKCc4UCcpKQogCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3htbF9ldHJlZSwgdGVzdF94bWxfZXRyZWVfYworICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF94bWxfZXRyZWUKIAogICAgICMgUnVuIHRoZSB0ZXN0cyBzcGVjaWZpYyB0byB0aGUgQyBpbXBsZW1lbnRhdGlvbgogICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxycGMucHkgYi9MaWIvdGVzdC90ZXN0X3htbHJwYy5weQppbmRleCAwMmQ5ZjVjLi4wNzczYTg2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbHJwYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbHJwYy5weQpAQCAtOSw3ICs5LDYgQEAKIGltcG9ydCBodHRwLmNsaWVudAogaW1wb3J0IGh0dHAsIGh0dHAuc2VydmVyCiBpbXBvcnQgc29ja2V0Ci1pbXBvcnQgb3MKIGltcG9ydCByZQogaW1wb3J0IGlvCiBpbXBvcnQgY29udGV4dGxpYgpAQCAtMTE0Nyw3ICsxMTQ2LDYgQEAKICAgICAiIiJBIHZhcmlhdGlvbiBvbiBzdXBwb3J0LmNhcHR1cmVkX3N0ZG91dCgpIHdoaWNoIGdpdmVzIGEgdGV4dCBzdHJlYW0KICAgICBoYXZpbmcgYSBgYnVmZmVyYCBhdHRyaWJ1dGUuCiAgICAgIiIiCi0gICAgaW1wb3J0IGlvCiAgICAgb3JpZ19zdGRvdXQgPSBzeXMuc3Rkb3V0CiAgICAgc3lzLnN0ZG91dCA9IGlvLlRleHRJT1dyYXBwZXIoaW8uQnl0ZXNJTygpLCBlbmNvZGluZz1lbmNvZGluZykKICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3htbHJwY19uZXQucHkgYi9MaWIvdGVzdC90ZXN0X3htbHJwY19uZXQucHkKaW5kZXggYjYwYjgyZi4uYWUwYTI4ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxycGNfbmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfeG1scnBjX25ldC5weQpAQCAtMSw3ICsxLDQgQEAKIGltcG9ydCBjb2xsZWN0aW9ucy5hYmMKLWltcG9ydCBlcnJubwotaW1wb3J0IHNvY2tldAotaW1wb3J0IHN5cwogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHN1cHBvcnQKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CmluZGV4IGQyNzhlMDYuLmVmM2MzZDggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKQEAgLTEsOCArMSw4IEBACiBpbXBvcnQgY29udGV4dGxpYgogaW1wb3J0IGlvCiBpbXBvcnQgb3MKLWltcG9ydCBzeXMKIGltcG9ydCBpbXBvcnRsaWIudXRpbAoraW1wb3J0IHBvc2l4cGF0aAogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCB6aXBmaWxlCkBAIC0zOCwxMCArMzgsNiBAQAogICAgICAgICB5aWVsZCBmCiAgICAgICAgIHRlc3QuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCiAKLWRlZiBvcGVuVSh6aXBmcCwgZm4pOgotICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCcnLCBEZXByZWNhdGlvbldhcm5pbmcpKToKLSAgICAgICAgcmV0dXJuIHppcGZwLm9wZW4oZm4sICdyVScpCi0KIGNsYXNzIEFic3RyYWN0VGVzdHNXaXRoU291cmNlRmlsZToKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgpAQCAtNjEsNiArNTcsOSBAQAogICAgICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCAiYW5vdGhlci5uYW1lIikKICAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQogICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoInN0cmZpbGUiLCBzZWxmLmRhdGEpCisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oJ3dyaXR0ZW4tb3Blbi13JywgbW9kZT0ndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5saW5lX2dlbjoKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZShsaW5lKQogCiAgICAgZGVmIHppcF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKICAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKQEAgLTc2LDcgKzc1LDcgQEAKICAgICAgICAgICAgIHppcGZwLnByaW50ZGlyKGZpbGU9ZnApCiAgICAgICAgICAgICBkaXJlY3RvcnkgPSBmcC5nZXR2YWx1ZSgpCiAgICAgICAgICAgICBsaW5lcyA9IGRpcmVjdG9yeS5zcGxpdGxpbmVzKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgNCkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgNSkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKIAogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignRmlsZSBOYW1lJywgbGluZXNbMF0pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdNb2RpZmllZCcsIGxpbmVzWzBdKQpAQCAtOTAsMjMgKzg5LDI1IEBACiAKICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG5hbWVsaXN0CiAgICAgICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgNCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oVEVTVEZOLCBuYW1lcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImFub3RoZXIubmFtZSIsIG5hbWVzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic3RyZmlsZSIsIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigid3JpdHRlbi1vcGVuLXciLCBuYW1lcykKIAogICAgICAgICAgICAgIyBDaGVjayBpbmZvbGlzdAogICAgICAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCiAgICAgICAgICAgICBuYW1lcyA9IFtpLmZpbGVuYW1lIGZvciBpIGluIGluZm9zXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmFtZXMpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmFtZXMpLCA0KQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihURVNURk4sIG5hbWVzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiYW5vdGhlci5uYW1lIiwgbmFtZXMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJzdHJmaWxlIiwgbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJ3cml0dGVuLW9wZW4tdyIsIG5hbWVzKQogICAgICAgICAgICAgZm9yIGkgaW4gaW5mb3M6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCiAKICAgICAgICAgICAgICMgY2hlY2sgZ2V0aW5mbwotICAgICAgICAgICAgZm9yIG5tIGluIChURVNURk4sICJhbm90aGVyLm5hbWUiLCAic3RyZmlsZSIpOgorICAgICAgICAgICAgZm9yIG5tIGluIChURVNURk4sICJhbm90aGVyLm5hbWUiLCAic3RyZmlsZSIsICJ3cml0dGVuLW9wZW4tdyIpOgogICAgICAgICAgICAgICAgIGluZm8gPSB6aXBmcC5nZXRpbmZvKG5tKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5maWxlbmFtZSwgbm0pCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvLmZpbGVfc2l6ZSwgbGVuKHNlbGYuZGF0YSkpCkBAIC0zNzIsMTQgKzM3MywxOCBAQAogICAgIHRlc3RfbG93X2NvbXByZXNzaW9uID0gTm9uZQogCiAgICAgZGVmIHppcF90ZXN0X3dyaXRlc3RyX3Blcm1pc3Npb25zKHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3cml0ZXN0ciBjcmVhdGVzIGZpbGVzIHdpdGggbW9kZSAwNjAwLAotICAgICAgICAjIHdoZW4gaXQgaXMgcGFzc2VkIGEgbmFtZSByYXRoZXIgdGhhbiBhIFppcEluZm8gaW5zdGFuY2UuCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd3JpdGVzdHIgYW5kIG9wZW4oLi4uIG1vZGU9J3cnKSBjcmVhdGUgZmlsZXMgd2l0aAorICAgICAgICAjIG1vZGUgMDYwMCwgd2hlbiB0aGV5IGFyZSBwYXNzZWQgYSBuYW1lIHJhdGhlciB0aGFuIGEgWmlwSW5mbworICAgICAgICAjIGluc3RhbmNlLgogCiAgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CiAgICAgICAgICAgICB6aW5mbyA9IHppcGZwLmdldGluZm8oJ3N0cmZpbGUnKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aW5mby5leHRlcm5hbF9hdHRyLCAwbzYwMCA8PCAxNikKIAorICAgICAgICAgICAgemluZm8yID0gemlwZnAuZ2V0aW5mbygnd3JpdHRlbi1vcGVuLXcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aW5mbzIuZXh0ZXJuYWxfYXR0ciwgMG82MDAgPDwgMTYpCisKICAgICBkZWYgdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhzZWxmKToKICAgICAgICAgZm9yIGYgaW4gZ2V0X2ZpbGVzKHNlbGYpOgogICAgICAgICAgICAgc2VsZi56aXBfdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCkBAIC00NTEsNiArNDU2LDEwIEBACiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsIG1vZGU9InIiKSBhcyB6aXBmcDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZnAud3JpdGUsIFRFU1RGTikKIAorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJyIikgYXMgemlwZnA6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICAgICAgemlwZnAub3BlbihURVNURk4sIG1vZGU9J3cnKQorCiAgICAgZGVmIHRlc3RfYWRkX2ZpbGVfYmVmb3JlXzE5ODAoc2VsZik6CiAgICAgICAgICMgU2V0IGF0aW1lIGFuZCBtdGltZSB0byAxOTcwLTAxLTAxCiAgICAgICAgIG9zLnV0aW1lKFRFU1RGTiwgKDAsIDApKQpAQCAtMTAyMiwzMiArMTAzMSw2IEBACiAgICAgICAgICAgICAgICAgZGF0YSArPSB6aXBmcC5yZWFkKGluZm8pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGRhdGEsIHtiImZvb2JhciIsIGIiYmFyZm9vIn0pCiAKLSAgICBkZWYgdGVzdF91bml2ZXJzYWxfZGVwcmVjYXRpb24oc2VsZik6Ci0gICAgICAgIGYgPSBpby5CeXRlc0lPKCkKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCdzcGFtLnR4dCcsIGInYWJhYmFnYWxhbWFnYScpCi0KLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIGZvciBtb2RlIGluICdVJywgJ3JVJzoKLSAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKLSAgICAgICAgICAgICAgICAgICAgemlwb3BlbiA9IHppcGZwLm9wZW4oJ3NwYW0udHh0JywgbW9kZSkKLSAgICAgICAgICAgICAgICB6aXBvcGVuLmNsb3NlKCkKLQotICAgIGRlZiB0ZXN0X3VuaXZlcnNhbF9yZWFkYWhlYWRzKHNlbGYpOgotICAgICAgICBmID0gaW8uQnl0ZXNJTygpCi0KLSAgICAgICAgZGF0YSA9IGInYVxyXG4nICogMTYgKiAxMDI0Ci0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICd3JywgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKFRFU1RGTiwgZGF0YSkKLQotICAgICAgICBkYXRhMiA9IGInJwotICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAncicpIGFzIHppcGZwLCBcCi0gICAgICAgICAgICAgb3BlblUoemlwZnAsIFRFU1RGTikgYXMgemlwb3BlbjoKLSAgICAgICAgICAgIGZvciBsaW5lIGluIHppcG9wZW46Ci0gICAgICAgICAgICAgICAgZGF0YTIgKz0gbGluZQotCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZGF0YTIucmVwbGFjZShiJ1xuJywgYidcclxuJykpCi0KICAgICBkZWYgdGVzdF93cml0ZXN0cl9leHRlbmRlZF9sb2NhbF9oZWFkZXJfaXNzdWUxMjAyKHNlbGYpOgogICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAndycpIGFzIG9yaWdfemlwOgogICAgICAgICAgICAgZm9yIGRhdGEgaW4gJ2FiY2RlZmdoaWprbG1ub3AnOgpAQCAtMTI1NSw5ICsxMjM4LDEyIEBACiAgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQogCiAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0iciIpIGFzIHppcGY6Ci0gICAgICAgICMgcmVhZCB0aGUgZGF0YSB0byBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgdGhlcmUKKyAgICAgICAgICAgICMgcmVhZCB0aGUgZGF0YSB0byBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgdGhlcmUKICAgICAgICAgICAgIHppcGYucmVhZCgiZm9vLnR4dCIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiLCAicSIpCisgICAgICAgICAgICAjIHVuaXZlcnNhbCBuZXdsaW5lcyBzdXBwb3J0IGlzIHJlbW92ZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi5vcGVuLCAiZm9vLnR4dCIsICJVIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi5vcGVuLCAiZm9vLnR4dCIsICJyVSIpCiAKICAgICBkZWYgdGVzdF9yZWFkMChzZWxmKToKICAgICAgICAgIiIiQ2hlY2sgdGhhdCBjYWxsaW5nIHJlYWQoMCkgb24gYSBaaXBFeHRGaWxlIG9iamVjdCByZXR1cm5zIGFuIGVtcHR5CkBAIC0xNDI4LDYgKzE0MTQsMzUgQEAKICAgICAgICAgICAgICMgdGVzdHppcCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBjb3JydXB0IGZpbGUsIG9yIE5vbmUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHppcGYudGVzdHppcCgpKQogCisgICAgZGVmIHRlc3Rfb3Blbl9jb25mbGljdGluZ19oYW5kbGVzKHNlbGYpOgorICAgICAgICAjIEl0J3Mgb25seSBwb3NzaWJsZSB0byBvcGVuIG9uZSB3cml0YWJsZSBmaWxlIGhhbmRsZSBhdCBhIHRpbWUKKyAgICAgICAgbXNnMSA9IGIiSXQncyBmdW4gdG8gY2hhcnRlciBhbiBhY2NvdW50YW50ISIKKyAgICAgICAgbXNnMiA9IGIiQW5kIHNhaWwgdGhlIHdpZGUgYWNjb3VudGFudCBzZWEiCisgICAgICAgIG1zZzMgPSBiIlRvIGZpbmQsIGV4cGxvcmUgdGhlIGZ1bmRzIG9mZnNob3JlIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAndycsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZjoKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdmb28nLCBtb2RlPSd3JykgYXMgdzI6CisgICAgICAgICAgICAgICAgdzIud3JpdGUobXNnMSkKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdiYXInLCBtb2RlPSd3JykgYXMgdzE6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB6aXBmLm9wZW4oJ2hhbmRsZScsIG1vZGU9J3cnKQorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgemlwZi5vcGVuKCdmb28nLCBtb2RlPSdyJykKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHppcGYud3JpdGVzdHIoJ3N0cicsICdhYmNkZScpCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB6aXBmLndyaXRlKF9fZmlsZV9fLCAnZmlsZScpCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB6aXBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICB3MS53cml0ZShtc2cyKQorICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ2JheicsIG1vZGU9J3cnKSBhcyB3MjoKKyAgICAgICAgICAgICAgICB3Mi53cml0ZShtc2czKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICdyJykgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCdmb28nKSwgbXNnMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCdiYXInKSwgbXNnMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCdiYXonKSwgbXNnMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5uYW1lbGlzdCgpLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pCisKICAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgIHVubGluayhURVNURk4pCiAgICAgICAgIHVubGluayhURVNURk4yKQpAQCAtMTc2MSw2ICsxNzc2LDIyIEBACiAgICAgICAgICAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCd0d29zJykgYXMgem9wZW46CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpvcGVuLnJlYWQoKSwgYicyMjInKQogCisgICAgZGVmIHRlc3Rfb3Blbl93cml0ZShzZWxmKToKKyAgICAgICAgZm9yIHdyYXBwZXIgaW4gKGxhbWJkYSBmOiBmKSwgVGVsbGFibGUsIFVuc2Vla2FibGU6CisgICAgICAgICAgICB3aXRoIHNlbGYuc3ViVGVzdCh3cmFwcGVyPXdyYXBwZXIpOgorICAgICAgICAgICAgICAgIGYgPSBpby5CeXRlc0lPKCkKKyAgICAgICAgICAgICAgICBmLndyaXRlKGInYWJjJykKKyAgICAgICAgICAgICAgICBiZiA9IGlvLkJ1ZmZlcmVkV3JpdGVyKGYpCisgICAgICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUod3JhcHBlcihiZiksICd3JywgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmOgorICAgICAgICAgICAgICAgICAgICB3aXRoIHppcGYub3Blbignb25lcycsICd3JykgYXMgem9wZW46CisgICAgICAgICAgICAgICAgICAgICAgICB6b3Blbi53cml0ZShiJzExMScpCisgICAgICAgICAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCd0d29zJywgJ3cnKSBhcyB6b3BlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHpvcGVuLndyaXRlKGInMjIyJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0dmFsdWUoKVs6NV0sIGInYWJjUEsnKQorICAgICAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYpIGFzIHppcGY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5yZWFkKCdvbmVzJyksIGInMTExJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLnJlYWQoJ3R3b3MnKSwgYicyMjInKQorCiAKIEByZXF1aXJlc196bGliCiBjbGFzcyBUZXN0c1dpdGhNdWx0aXBsZU9wZW5zKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTE4NzEsNiArMTkwMiwxOSBAQAogICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCkgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhmLmZpbGVubygpLCAxMDApCiAKKyAgICBkZWYgdGVzdF93cml0ZV93aGlsZV9yZWFkaW5nKHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAndycsIHppcGZpbGUuWklQX0RFRkxBVEVEKSBhcyB6aXBmOgorICAgICAgICAgICAgemlwZi53cml0ZXN0cignb25lcycsIHNlbGYuZGF0YTEpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICdhJywgemlwZmlsZS5aSVBfREVGTEFURUQpIGFzIHppcGY6CisgICAgICAgICAgICB3aXRoIHppcGYub3Blbignb25lcycsICdyJykgYXMgcjE6CisgICAgICAgICAgICAgICAgZGF0YTEgPSByMS5yZWFkKDUwMCkKKyAgICAgICAgICAgICAgICB3aXRoIHppcGYub3BlbigndHdvcycsICd3JykgYXMgdzE6CisgICAgICAgICAgICAgICAgICAgIHcxLndyaXRlKHNlbGYuZGF0YTIpCisgICAgICAgICAgICAgICAgZGF0YTEgKz0gcjEucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YTEsIHNlbGYuZGF0YTEpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYucmVhZCgndHdvcycpLCBzZWxmLmRhdGEyKQorCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICB1bmxpbmsoVEVTVEZOMikKIApAQCAtMTk0MCwxMzcgKzE5ODQsMTkgQEAKICAgICAgICAgICAgIHVubGluayhURVNURk4pCiAKIAotY2xhc3MgQWJzdHJhY3RVbml2ZXJzYWxOZXdsaW5lVGVzdHM6Ci0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKLSAgICAgICAgY2xzLmxpbmVfZ2VuID0gW2J5dGVzKCJUZXN0IG9mIHppcGZpbGUgbGluZSAlZC4iICUgaSwgImFzY2lpIikKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKEZJWEVEVEVTVF9TSVpFKV0KLSAgICAgICAgY2xzLnNlcHMgPSAoYidccicsIGInXHJcbicsIGInXG4nKQotICAgICAgICBjbHMuYXJjZGF0YSA9IHt9Ci0gICAgICAgIGZvciBuLCBzIGluIGVudW1lcmF0ZShjbHMuc2Vwcyk6Ci0gICAgICAgICAgICBjbHMuYXJjZGF0YVtzXSA9IHMuam9pbihjbHMubGluZV9nZW4pICsgcworY2xhc3MgWmlwSW5mb1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9mcm9tX2ZpbGUoc2VsZik6CisgICAgICAgIHppID0gemlwZmlsZS5aaXBJbmZvLmZyb21fZmlsZShfX2ZpbGVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguYmFzZW5hbWUoemkuZmlsZW5hbWUpLCAndGVzdF96aXBmaWxlLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh6aS5pc19kaXIoKSkKIAotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5hcmNmaWxlcyA9IHt9Ci0gICAgICAgIGZvciBuLCBzIGluIGVudW1lcmF0ZShzZWxmLnNlcHMpOgotICAgICAgICAgICAgc2VsZi5hcmNmaWxlc1tzXSA9ICclcy0lZCcgJSAoVEVTVEZOLCBuKQotICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuYXJjZmlsZXNbc10sICJ3YiIpIGFzIGY6Ci0gICAgICAgICAgICAgICAgZi53cml0ZShzZWxmLmFyY2RhdGFbc10pCi0KLSAgICBkZWYgbWFrZV90ZXN0X2FyY2hpdmUoc2VsZiwgZiwgY29tcHJlc3Npb24pOgotICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5hcmNmaWxlcy52YWx1ZXMoKToKLSAgICAgICAgICAgICAgICB6aXBmcC53cml0ZShmbiwgZm4pCi0KLSAgICBkZWYgcmVhZF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIGZwOgotICAgICAgICAgICAgICAgICAgICB6aXBkYXRhID0gZnAucmVhZCgpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmFyY2RhdGFbc2VwXSwgemlwZGF0YSkKLQotICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6Ci0gICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYucmVhZF90ZXN0KGYsIHNlbGYuY29tcHJlc3Npb24pCi0KLSAgICBkZWYgcmVhZGxpbmVfcmVhZF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIHppcG9wZW46Ci0gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBiJycKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgPSB6aXBvcGVuLnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWQKLQotICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCA9IHppcG9wZW4ucmVhZCg1KQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gcmVhZAotCi0gICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNlbGYuYXJjZGF0YVtiJ1xuJ10pCi0KLSAgICBkZWYgdGVzdF9yZWFkbGluZV9yZWFkKHNlbGYpOgotICAgICAgICBmb3IgZiBpbiBnZXRfZmlsZXMoc2VsZik6Ci0gICAgICAgICAgICBzZWxmLnJlYWRsaW5lX3JlYWRfdGVzdChmLCBzZWxmLmNvbXByZXNzaW9uKQotCi0gICAgZGVmIHJlYWRsaW5lX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgotICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQotCi0gICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKLSAgICAgICAgICAgICAgICB3aXRoIG9wZW5VKHppcGZwLCBmbikgYXMgemlwb3BlbjoKLSAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5saW5lX2dlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVkYXRhID0gemlwb3Blbi5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVkYXRhLCBsaW5lICsgYidcbicpCi0KLSAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKLSAgICAgICAgZm9yIGYgaW4gZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5yZWFkbGluZV90ZXN0KGYsIHNlbGYuY29tcHJlc3Npb24pCi0KLSAgICBkZWYgcmVhZGxpbmVzX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgotICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQotCi0gICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKLSAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKLSAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKLSAgICAgICAgICAgICAgICB3aXRoIG9wZW5VKHppcGZwLCBmbikgYXMgZnA6Ci0gICAgICAgICAgICAgICAgICAgIHppcGxpbmVzID0gZnAucmVhZGxpbmVzKCkKLSAgICAgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgemlwbGluZXMpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGxpbmUsIGxpbmUgKyBiJ1xuJykKLQotICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKLSAgICAgICAgZm9yIGYgaW4gZ2V0X2ZpbGVzKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5yZWFkbGluZXNfdGVzdChmLCBzZWxmLmNvbXByZXNzaW9uKQotCi0gICAgZGVmIGl0ZXJsaW5lc190ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKLSAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKLQotICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCi0gICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6Ci0gICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcGVuVSh6aXBmcCwgZm4pIGFzIGZwOgotICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgZnApOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBsaW5lLCBsaW5lICsgYidcbicpCi0KLSAgICBkZWYgdGVzdF9pdGVybGluZXMoc2VsZik6Ci0gICAgICAgIGZvciBmIGluIGdldF9maWxlcyhzZWxmKToKLSAgICAgICAgICAgIHNlbGYuaXRlcmxpbmVzX3Rlc3QoZiwgc2VsZi5jb21wcmVzc2lvbikKLQotICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgotICAgICAgICAgICAgdW5saW5rKGZuKQotICAgICAgICB1bmxpbmsoVEVTVEZOKQotICAgICAgICB1bmxpbmsoVEVTVEZOMikKLQotCi1jbGFzcyBTdG9yZWRVbml2ZXJzYWxOZXdsaW5lVGVzdHMoQWJzdHJhY3RVbml2ZXJzYWxOZXdsaW5lVGVzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGNvbXByZXNzaW9uID0gemlwZmlsZS5aSVBfU1RPUkVECi0KLUByZXF1aXJlc196bGliCi1jbGFzcyBEZWZsYXRlVW5pdmVyc2FsTmV3bGluZVRlc3RzKEFic3RyYWN0VW5pdmVyc2FsTmV3bGluZVRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgY29tcHJlc3Npb24gPSB6aXBmaWxlLlpJUF9ERUZMQVRFRAotCi1AcmVxdWlyZXNfYnoyCi1jbGFzcyBCemlwMlVuaXZlcnNhbE5ld2xpbmVUZXN0cyhBYnN0cmFjdFVuaXZlcnNhbE5ld2xpbmVUZXN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBjb21wcmVzc2lvbiA9IHppcGZpbGUuWklQX0JaSVAyCi0KLUByZXF1aXJlc19sem1hCi1jbGFzcyBMem1hVW5pdmVyc2FsTmV3bGluZVRlc3RzKEFic3RyYWN0VW5pdmVyc2FsTmV3bGluZVRlc3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICAgY29tcHJlc3Npb24gPSB6aXBmaWxlLlpJUF9MWk1BCisgICAgZGVmIHRlc3RfZnJvbV9kaXIoc2VsZik6CisgICAgICAgIGRpcnBhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKKyAgICAgICAgemkgPSB6aXBmaWxlLlppcEluZm8uZnJvbV9maWxlKGRpcnBhdGgsICdzdGRsaWJfdGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmZpbGVuYW1lLCAnc3RkbGliX3Rlc3RzLycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6aS5pc19kaXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5jb21wcmVzc190eXBlLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZmlsZV9zaXplLCAwKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQppbmRleCA4ZTVlMTJkLi4yMDQ5MWNkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weQpAQCAtMzk4LDcgKzM5OCw4IEBACiAgICAgICAgIHBhY2tkaXIyID0gcGFja2RpciArIFRFU1RQQUNLMiArIG9zLnNlcAogICAgICAgICBmaWxlcyA9IHtwYWNrZGlyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKICAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyAiX19pbml0X18iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpLAotICAgICAgICAgICAgICAgICBwYWNrZGlyMiArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5Yyl9CisgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKKyAgICAgICAgICAgICAgICAgInNwYW0iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQogCiAgICAgICAgIHogPSBaaXBGaWxlKFRFTVBfWklQLCAidyIpCiAgICAgICAgIHRyeToKQEAgLTQxMiw2ICs0MTMsMTQgQEAKICAgICAgICAgICAgIHppID0gemlwaW1wb3J0LnppcGltcG9ydGVyKFRFTVBfWklQKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5hcmNoaXZlLCBURU1QX1pJUCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShURVNUUEFDSyksIFRydWUpCisKKyAgICAgICAgICAgIGZpbmRfbW9kID0gemkuZmluZF9tb2R1bGUoJ3NwYW0nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZmluZF9tb2QpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmluZF9tb2QsIHppcGltcG9ydC56aXBpbXBvcnRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmluZF9tb2QuaXNfcGFja2FnZSgnc3BhbScpKQorICAgICAgICAgICAgbG9hZF9tb2QgPSBmaW5kX21vZC5sb2FkX21vZHVsZSgnc3BhbScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmRfbW9kLmdldF9maWxlbmFtZSgnc3BhbScpLCBsb2FkX21vZC5fX2ZpbGVfXykKKwogICAgICAgICAgICAgbW9kID0gemkubG9hZF9tb2R1bGUoVEVTVFBBQ0spCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmdldF9maWxlbmFtZShURVNUUEFDSyksIG1vZC5fX2ZpbGVfXykKIApAQCAtNDcxLDYgKzQ4MCwxNiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgICB6aS5pc19wYWNrYWdlKFRFU1RQQUNLMiArIG9zLnNlcCArIFRFU1RNT0QpLCBGYWxzZSkKIAorICAgICAgICAgICAgcGtnX3BhdGggPSBURU1QX1pJUCArIG9zLnNlcCArIHBhY2tkaXIgKyBURVNUUEFDSzIKKyAgICAgICAgICAgIHppMiA9IHppcGltcG9ydC56aXBpbXBvcnRlcihwa2dfcGF0aCkKKyAgICAgICAgICAgIGZpbmRfbW9kX2RvdHRlZCA9IHppMi5maW5kX21vZHVsZShURVNUTU9EKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoZmluZF9tb2RfZG90dGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbmRfbW9kX2RvdHRlZCwgemlwaW1wb3J0LnppcGltcG9ydGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh6aTIuaXNfcGFja2FnZShURVNUTU9EKSkKKyAgICAgICAgICAgIGxvYWRfbW9kID0gZmluZF9tb2RfZG90dGVkLmxvYWRfbW9kdWxlKFRFU1RNT0QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIGZpbmRfbW9kX2RvdHRlZC5nZXRfZmlsZW5hbWUoVEVTVE1PRCksIGxvYWRfbW9kLl9fZmlsZV9fKQorCiAgICAgICAgICAgICBtb2RfcGF0aCA9IFRFU1RQQUNLMiArIG9zLnNlcCArIFRFU1RNT0QKICAgICAgICAgICAgIG1vZF9uYW1lID0gbW9kdWxlX3BhdGhfdG9fZG90dGVkX25hbWUobW9kX3BhdGgpCiAgICAgICAgICAgICBtb2QgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShtb2RfbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CmluZGV4IDU5MTM2MjIuLjg0ZDUyNmMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQpAQCAtMTIsNyArMTIsNiBAQAogaW1wb3J0IGRvY3Rlc3QKIGltcG9ydCBpbnNwZWN0CiBpbXBvcnQgbGluZWNhY2hlCi1pbXBvcnQgcGRiCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdC5zdXBwb3J0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IChzcGF3bl9weXRob24sIGtpbGxfcHl0aG9uLCBhc3NlcnRfcHl0aG9uX29rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2Vfc2NyaXB0LCBtYWtlX3ppcF9zY3JpcHQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3psaWIucHkgYi9MaWIvdGVzdC90ZXN0X3psaWIucHkKaW5kZXggNzhlY2FkZS4uYmI5MjkyYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96bGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQpAQCAtMTYyLDYgKzE2MiwxMiBAQAogICAgICAgICB4ID0gemxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHgpLCBIQU1MRVRfU0NFTkUpCiAKKyAgICBkZWYgdGVzdF9rZXl3b3JkcyhzZWxmKToKKyAgICAgICAgeCA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FLCBsZXZlbD0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyh4KSwgSEFNTEVUX1NDRU5FKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB6bGliLmNvbXByZXNzKGRhdGE9SEFNTEVUX1NDRU5FLCBsZXZlbD0zKQorCiAgICAgZGVmIHRlc3Rfc3BlZWNoMTI4KHNlbGYpOgogICAgICAgICAjIGNvbXByZXNzIG1vcmUgZGF0YQogICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FICogMTI4CmRpZmYgLS1naXQgYS9MaWIvdGhyZWFkaW5nLnB5IGIvTGliL3RocmVhZGluZy5weQppbmRleCBjOWY4Y2I2Li5kMDlmY2FlIDEwMDY0NAotLS0gYS9MaWIvdGhyZWFkaW5nLnB5CisrKyBiL0xpYi90aHJlYWRpbmcucHkKQEAgLTIyLDkgKzIyLDExIEBACiAjIHdpdGggdGhlIG11bHRpcHJvY2Vzc2luZyBtb2R1bGUsIHdoaWNoIGRvZXNuJ3QgcHJvdmlkZSB0aGUgb2xkCiAjIEphdmEgaW5zcGlyZWQgbmFtZXMuCiAKLV9fYWxsX18gPSBbJ2FjdGl2ZV9jb3VudCcsICdDb25kaXRpb24nLCAnY3VycmVudF90aHJlYWQnLCAnZW51bWVyYXRlJywgJ0V2ZW50JywKLSAgICAgICAgICAgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLCAnVGhyZWFkJywgJ0JhcnJpZXInLAotICAgICAgICAgICAnVGltZXInLCAnVGhyZWFkRXJyb3InLCAnc2V0cHJvZmlsZScsICdzZXR0cmFjZScsICdsb2NhbCcsICdzdGFja19zaXplJ10KK19fYWxsX18gPSBbJ2dldF9pZGVudCcsICdhY3RpdmVfY291bnQnLCAnQ29uZGl0aW9uJywgJ2N1cnJlbnRfdGhyZWFkJywKKyAgICAgICAgICAgJ2VudW1lcmF0ZScsICdtYWluX3RocmVhZCcsICdUSU1FT1VUX01BWCcsCisgICAgICAgICAgICdFdmVudCcsICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ1RocmVhZCcsCisgICAgICAgICAgICdCYXJyaWVyJywgJ0Jyb2tlbkJhcnJpZXJFcnJvcicsICdUaW1lcicsICdUaHJlYWRFcnJvcicsCisgICAgICAgICAgICdzZXRwcm9maWxlJywgJ3NldHRyYWNlJywgJ2xvY2FsJywgJ3N0YWNrX3NpemUnXQogCiAjIFJlbmFtZSBzb21lIHN0dWZmIHNvICJmcm9tIHRocmVhZGluZyBpbXBvcnQgKiIgaXMgc2FmZQogX3N0YXJ0X25ld190aHJlYWQgPSBfdGhyZWFkLnN0YXJ0X25ld190aHJlYWQKZGlmZiAtLWdpdCBhL0xpYi90aW1laXQucHkgYi9MaWIvdGltZWl0LnB5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggMmRlODhmNy4uOThjYjNlYgotLS0gYS9MaWIvdGltZWl0LnB5CisrKyBiL0xpYi90aW1laXQucHkKQEAgLTMxNywyMCArMzE3LDI2IEBACiAgICAgcHJpbnQoIiVkIGxvb3BzLCIgJSBudW1iZXIsIGVuZD0nICcpCiAgICAgdXNlYyA9IGJlc3QgKiAxZTYgLyBudW1iZXIKICAgICBpZiB0aW1lX3VuaXQgaXMgbm90IE5vbmU6Ci0gICAgICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnICVzIHBlciBsb29wIiAlIChyZXBlYXQsIHByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWMvdW5pdHNbdGltZV91bml0XSwgdGltZV91bml0KSkKKyAgICAgICAgc2NhbGUgPSB1bml0c1t0aW1lX3VuaXRdCiAgICAgZWxzZToKLSAgICAgICAgaWYgdXNlYyA8IDEwMDA6Ci0gICAgICAgICAgICBwcmludCgiYmVzdCBvZiAlZDogJS4qZyB1c2VjIHBlciBsb29wIiAlIChyZXBlYXQsIHByZWNpc2lvbiwgdXNlYykpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBtc2VjID0gdXNlYyAvIDEwMDAKLSAgICAgICAgICAgIGlmIG1zZWMgPCAxMDAwOgotICAgICAgICAgICAgICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnIG1zZWMgcGVyIGxvb3AiICUgKHJlcGVhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24sIG1zZWMpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWMgPSBtc2VjIC8gMTAwMAotICAgICAgICAgICAgICAgIHByaW50KCJiZXN0IG9mICVkOiAlLipnIHNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLCBzZWMpKQorICAgICAgICBzY2FsZXMgPSBbKHNjYWxlLCB1bml0KSBmb3IgdW5pdCwgc2NhbGUgaW4gdW5pdHMuaXRlbXMoKV0KKyAgICAgICAgc2NhbGVzLnNvcnQocmV2ZXJzZT1UcnVlKQorICAgICAgICBmb3Igc2NhbGUsIHRpbWVfdW5pdCBpbiBzY2FsZXM6CisgICAgICAgICAgICBpZiB1c2VjID49IHNjYWxlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgcHJpbnQoImJlc3Qgb2YgJWQ6ICUuKmcgJXMgcGVyIGxvb3AiICUgKHJlcGVhdCwgcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VjL3NjYWxlLCB0aW1lX3VuaXQpKQorICAgIGJlc3QgPSBtaW4ocikKKyAgICB1c2VjID0gYmVzdCAqIDFlNiAvIG51bWJlcgorICAgIHdvcnN0ID0gbWF4KHIpCisgICAgaWYgd29yc3QgPj0gYmVzdCAqIDQ6CisgICAgICAgIHVzZWMgPSB3b3JzdCAqIDFlNiAvIG51bWJlcgorICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgd2FybmluZ3Mud2Fybl9leHBsaWNpdCgKKyAgICAgICAgICAgICJUaGUgdGVzdCByZXN1bHRzIGFyZSBsaWtlbHkgdW5yZWxpYWJsZS4gVGhlIHdvcnN0XG4iCisgICAgICAgICAgICAidGltZSAoJS4qZyAlcykgd2FzIG1vcmUgdGhhbiBmb3VyIHRpbWVzIHNsb3dlciB0aGFuIHRoZSBiZXN0IHRpbWUuIiAlCisgICAgICAgICAgICAocHJlY2lzaW9uLCB1c2VjL3NjYWxlLCB0aW1lX3VuaXQpLAorICAgICAgICAgICAgIFVzZXJXYXJuaW5nLCAnJywgMCkKICAgICByZXR1cm4gTm9uZQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvX19pbml0X18ucHkgYi9MaWIvdGtpbnRlci9fX2luaXRfXy5weQppbmRleCA1NWJmYjdmLi4zNTY0M2U2IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci9fX2luaXRfXy5weQorKysgYi9MaWIvdGtpbnRlci9fX2luaXRfXy5weQpAQCAtMzAsNiArMzAsNyBAQAogdGsubWFpbmxvb3AoKQogIiIiCiAKK2ltcG9ydCBlbnVtCiBpbXBvcnQgc3lzCiAKIGltcG9ydCBfdGtpbnRlciAjIElmIHRoaXMgZmFpbHMgeW91ciBQeXRob24gbWF5IG5vdCBiZSBjb25maWd1cmVkIGZvciBUawpAQCAtMTMyLDYgKzEzMyw1MCBAQAogICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQogICAgIHJldHVybiBkaWN0CiAKKworY2xhc3MgRXZlbnRUeXBlKHN0ciwgZW51bS5FbnVtKToKKyAgICBLZXlQcmVzcyA9ICcyJworICAgIEtleSA9IEtleVByZXNzLAorICAgIEtleVJlbGVhc2UgPSAnMycKKyAgICBCdXR0b25QcmVzcyA9ICc0JworICAgIEJ1dHRvbiA9IEJ1dHRvblByZXNzLAorICAgIEJ1dHRvblJlbGVhc2UgPSAnNScKKyAgICBNb3Rpb24gPSAnNicKKyAgICBFbnRlciA9ICc3JworICAgIExlYXZlID0gJzgnCisgICAgRm9jdXNJbiA9ICc5JworICAgIEZvY3VzT3V0ID0gJzEwJworICAgIEtleW1hcCA9ICcxMScgICAgICAgICAgICMgdW5kb2N1bWVudGVkCisgICAgRXhwb3NlID0gJzEyJworICAgIEdyYXBoaWNzRXhwb3NlID0gJzEzJyAgICMgdW5kb2N1bWVudGVkCisgICAgTm9FeHBvc2UgPSAnMTQnICAgICAgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBWaXNpYmlsaXR5ID0gJzE1JworICAgIENyZWF0ZSA9ICcxNicKKyAgICBEZXN0cm95ID0gJzE3JworICAgIFVubWFwID0gJzE4JworICAgIE1hcCA9ICcxOScKKyAgICBNYXBSZXF1ZXN0ID0gJzIwJworICAgIFJlcGFyZW50ID0gJzIxJworICAgIENvbmZpZ3VyZSA9ICcyMicKKyAgICBDb25maWd1cmVSZXF1ZXN0ID0gJzIzJworICAgIEdyYXZpdHkgPSAnMjQnCisgICAgUmVzaXplUmVxdWVzdCA9ICcyNScKKyAgICBDaXJjdWxhdGUgPSAnMjYnCisgICAgQ2lyY3VsYXRlUmVxdWVzdCA9ICcyNycKKyAgICBQcm9wZXJ0eSA9ICcyOCcKKyAgICBTZWxlY3Rpb25DbGVhciA9ICcyOScgICAjIHVuZG9jdW1lbnRlZAorICAgIFNlbGVjdGlvblJlcXVlc3QgPSAnMzAnICMgdW5kb2N1bWVudGVkCisgICAgU2VsZWN0aW9uID0gJzMxJyAgICAgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBDb2xvcm1hcCA9ICczMicKKyAgICBDbGllbnRNZXNzYWdlID0gJzMzJyAgICAjIHVuZG9jdW1lbnRlZAorICAgIE1hcHBpbmcgPSAnMzQnICAgICAgICAgICMgdW5kb2N1bWVudGVkCisgICAgVmlydHVhbEV2ZW50ID0gJzM1JywgICAgIyB1bmRvY3VtZW50ZWQKKyAgICBBY3RpdmF0ZSA9ICczNicsCisgICAgRGVhY3RpdmF0ZSA9ICczNycsCisgICAgTW91c2VXaGVlbCA9ICczOCcsCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKwogY2xhc3MgRXZlbnQ6CiAgICAgIiIiQ29udGFpbmVyIGZvciB0aGUgcHJvcGVydGllcyBvZiBhbiBldmVudC4KIApAQCAtMTc0LDcgKzIxOSw0MyBAQAogICAgIHdpZGdldCAtIHdpZGdldCBpbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQKICAgICBkZWx0YSAtIGRlbHRhIG9mIHdoZWVsIG1vdmVtZW50IChNb3VzZVdoZWVsKQogICAgICIiIgotICAgIHBhc3MKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGF0dHJzID0ge2s6IHYgZm9yIGssIHYgaW4gc2VsZi5fX2RpY3RfXy5pdGVtcygpIGlmIHYgIT0gJz8/J30KKyAgICAgICAgaWYgbm90IHNlbGYuY2hhcjoKKyAgICAgICAgICAgIGRlbCBhdHRyc1snY2hhciddCisgICAgICAgIGVsaWYgc2VsZi5jaGFyICE9ICc/Pyc6CisgICAgICAgICAgICBhdHRyc1snY2hhciddID0gcmVwcihzZWxmLmNoYXIpCisgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYsICdzZW5kX2V2ZW50JywgVHJ1ZSk6CisgICAgICAgICAgICBkZWwgYXR0cnNbJ3NlbmRfZXZlbnQnXQorICAgICAgICBpZiBzZWxmLnN0YXRlID09IDA6CisgICAgICAgICAgICBkZWwgYXR0cnNbJ3N0YXRlJ10KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYuc3RhdGUsIGludCk6CisgICAgICAgICAgICBzdGF0ZSA9IHNlbGYuc3RhdGUKKyAgICAgICAgICAgIG1vZHMgPSAoJ1NoaWZ0JywgJ0xvY2snLCAnQ29udHJvbCcsCisgICAgICAgICAgICAgICAgICAgICdNb2QxJywgJ01vZDInLCAnTW9kMycsICdNb2Q0JywgJ01vZDUnLAorICAgICAgICAgICAgICAgICAgICAnQnV0dG9uMScsICdCdXR0b24yJywgJ0J1dHRvbjMnLCAnQnV0dG9uNCcsICdCdXR0b241JykKKyAgICAgICAgICAgIHMgPSBbXQorICAgICAgICAgICAgZm9yIGksIG4gaW4gZW51bWVyYXRlKG1vZHMpOgorICAgICAgICAgICAgICAgIGlmIHN0YXRlICYgKDEgPDwgaSk6CisgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kKG4pCisgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlICYgfigoMTw8IGxlbihtb2RzKSkgLSAxKQorICAgICAgICAgICAgaWYgc3RhdGUgb3Igbm90IHM6CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoaGV4KHN0YXRlKSkKKyAgICAgICAgICAgIGF0dHJzWydzdGF0ZSddID0gJ3wnLmpvaW4ocykKKyAgICAgICAgaWYgc2VsZi5kZWx0YSA9PSAwOgorICAgICAgICAgICAgZGVsIGF0dHJzWydkZWx0YSddCisgICAgICAgICMgd2lkZ2V0IHVzdWFsbHkgaXMga25vd24KKyAgICAgICAgIyBzZXJpYWwgYW5kIHRpbWUgYXJlIG5vdCB2ZXJ5IGludGVyZXNpbmcKKyAgICAgICAgIyBrZXlzeW1fbnVtIGR1cGxpY2F0ZXMga2V5c3ltCisgICAgICAgICMgeF9yb290IGFuZCB5X3Jvb3QgbW9zdGx5IGR1cGxpY2F0ZSB4IGFuZCB5CisgICAgICAgIGtleXMgPSAoJ3NlbmRfZXZlbnQnLAorICAgICAgICAgICAgICAgICdzdGF0ZScsICdrZXlzeW0nLCAna2V5Y29kZScsICdjaGFyJywKKyAgICAgICAgICAgICAgICAnbnVtJywgJ2RlbHRhJywgJ2ZvY3VzJywKKyAgICAgICAgICAgICAgICAneCcsICd5JywgJ3dpZHRoJywgJ2hlaWdodCcpCisgICAgICAgIHJldHVybiAnPCVzIGV2ZW50JXM+JyAlICgKKyAgICAgICAgICAgIHNlbGYudHlwZSwKKyAgICAgICAgICAgICcnLmpvaW4oJyAlcz0lcycgJSAoaywgYXR0cnNba10pIGZvciBrIGluIGtleXMgaWYgayBpbiBhdHRycykKKyAgICAgICAgKQogCiBfc3VwcG9ydF9kZWZhdWx0X3Jvb3QgPSAxCiBfZGVmYXVsdF9yb290ID0gTm9uZQpAQCAtMjYyLDE1ICszNDMsOCBAQAogICAgIGRlZiBnZXQoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB2YWx1ZSBvZiB2YXJpYWJsZS4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX3RrLmdsb2JhbGdldHZhcihzZWxmLl9uYW1lKQotICAgIGRlZiB0cmFjZV92YXJpYWJsZShzZWxmLCBtb2RlLCBjYWxsYmFjayk6Ci0gICAgICAgICIiIkRlZmluZSBhIHRyYWNlIGNhbGxiYWNrIGZvciB0aGUgdmFyaWFibGUuCiAKLSAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgotICAgICAgICBDQUxMQkFDSyBtdXN0IGJlIGEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4KLSAgICAgICAgdGhlIHZhcmlhYmxlIGlzIHJlYWQsIHdyaXR0ZW4gb3IgdW5kZWZpbmVkLgotCi0gICAgICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2FsbGJhY2suCi0gICAgICAgICIiIgorICAgIGRlZiBfcmVnaXN0ZXIoc2VsZiwgY2FsbGJhY2spOgogICAgICAgICBmID0gQ2FsbFdyYXBwZXIoY2FsbGJhY2ssIE5vbmUsIHNlbGYuX3Jvb3QpLl9fY2FsbF9fCiAgICAgICAgIGNibmFtZSA9IHJlcHIoaWQoZikpCiAgICAgICAgIHRyeToKQEAgLTI4NSwxOCArMzU5LDMzIEBACiAgICAgICAgIGlmIHNlbGYuX3RjbENvbW1hbmRzIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLl90Y2xDb21tYW5kcyA9IFtdCiAgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzLmFwcGVuZChjYm5hbWUpCi0gICAgICAgIHNlbGYuX3RrLmNhbGwoInRyYWNlIiwgInZhcmlhYmxlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQogICAgICAgICByZXR1cm4gY2JuYW1lCi0gICAgdHJhY2UgPSB0cmFjZV92YXJpYWJsZQotICAgIGRlZiB0cmFjZV92ZGVsZXRlKHNlbGYsIG1vZGUsIGNibmFtZSk6CisKKyAgICBkZWYgdHJhY2VfYWRkKHNlbGYsIG1vZGUsIGNhbGxiYWNrKToKKyAgICAgICAgIiIiRGVmaW5lIGEgdHJhY2UgY2FsbGJhY2sgZm9yIHRoZSB2YXJpYWJsZS4KKworICAgICAgICBNb2RlIGlzIG9uZSBvZiAicmVhZCIsICJ3cml0ZSIsICJ1bnNldCIsIG9yIGEgbGlzdCBvciB0dXBsZSBvZgorICAgICAgICBzdWNoIHN0cmluZ3MuCisgICAgICAgIENhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFyaWFibGUgaXMKKyAgICAgICAgcmVhZCwgd3JpdHRlbiBvciB1bnNldC4KKworICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrLgorICAgICAgICAiIiIKKyAgICAgICAgY2JuYW1lID0gc2VsZi5fcmVnaXN0ZXIoY2FsbGJhY2spCisgICAgICAgIHNlbGYuX3RrLmNhbGwoJ3RyYWNlJywgJ2FkZCcsICd2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbmFtZSwgbW9kZSwgKGNibmFtZSwpKQorICAgICAgICByZXR1cm4gY2JuYW1lCisKKyAgICBkZWYgdHJhY2VfcmVtb3ZlKHNlbGYsIG1vZGUsIGNibmFtZSk6CiAgICAgICAgICIiIkRlbGV0ZSB0aGUgdHJhY2UgY2FsbGJhY2sgZm9yIGEgdmFyaWFibGUuCiAKLSAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgotICAgICAgICBDQk5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gdHJhY2VfdmFyaWFibGUgb3IgdHJhY2UuCisgICAgICAgIE1vZGUgaXMgb25lIG9mICJyZWFkIiwgIndyaXRlIiwgInVuc2V0IiBvciBhIGxpc3Qgb3IgdHVwbGUgb2YKKyAgICAgICAgc3VjaCBzdHJpbmdzLiAgTXVzdCBiZSBzYW1lIGFzIHdlcmUgc3BlY2lmaWVkIGluIHRyYWNlX2FkZCgpLgorICAgICAgICBjYm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gdHJhY2VfYWRkKCkuCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2ZGVsZXRlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQotICAgICAgICBjYm5hbWUgPSBzZWxmLl90ay5zcGxpdGxpc3QoY2JuYW1lKVswXQotICAgICAgICBmb3IgbSwgY2EgaW4gc2VsZi50cmFjZV92aW5mbygpOgorICAgICAgICBzZWxmLl90ay5jYWxsKCd0cmFjZScsICdyZW1vdmUnLCAndmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25hbWUsIG1vZGUsIGNibmFtZSkKKyAgICAgICAgZm9yIG0sIGNhIGluIHNlbGYudHJhY2VfaW5mbygpOgogICAgICAgICAgICAgaWYgc2VsZi5fdGsuc3BsaXRsaXN0KGNhKVswXSA9PSBjYm5hbWU6CiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgZWxzZToKQEAgLTMwNSwxMCArMzk0LDY0IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMucmVtb3ZlKGNibmFtZSkKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICBkZWYgdHJhY2VfdmluZm8oc2VsZik6CisKKyAgICBkZWYgdHJhY2VfaW5mbyhzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGFsbCB0cmFjZSBjYWxsYmFjayBpbmZvcm1hdGlvbi4iIiIKKyAgICAgICAgc3BsaXRsaXN0ID0gc2VsZi5fdGsuc3BsaXRsaXN0CisgICAgICAgIHJldHVybiBbKHNwbGl0bGlzdChrKSwgdikgZm9yIGssIHYgaW4gbWFwKHNwbGl0bGlzdCwKKyAgICAgICAgICAgIHNwbGl0bGlzdChzZWxmLl90ay5jYWxsKCd0cmFjZScsICdpbmZvJywgJ3ZhcmlhYmxlJywgc2VsZi5fbmFtZSkpKV0KKworICAgIGRlZiB0cmFjZV92YXJpYWJsZShzZWxmLCBtb2RlLCBjYWxsYmFjayk6CisgICAgICAgICIiIkRlZmluZSBhIHRyYWNlIGNhbGxiYWNrIGZvciB0aGUgdmFyaWFibGUuCisKKyAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgorICAgICAgICBDQUxMQkFDSyBtdXN0IGJlIGEgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4KKyAgICAgICAgdGhlIHZhcmlhYmxlIGlzIHJlYWQsIHdyaXR0ZW4gb3IgdW5kZWZpbmVkLgorCisgICAgICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2FsbGJhY2suCisKKyAgICAgICAgVGhpcyBkZXByZWNhdGVkIG1ldGhvZCB3cmFwcyBhIGRlcHJlY2F0ZWQgVGNsIG1ldGhvZCB0aGF0IHdpbGwKKyAgICAgICAgbGlrZWx5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIFVzZSB0cmFjZV9hZGQoKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUT0RPOiBBZGQgZGVwcmVjYXRpb24gd2FybmluZworICAgICAgICBjYm5hbWUgPSBzZWxmLl9yZWdpc3RlcihjYWxsYmFjaykKKyAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmFyaWFibGUiLCBzZWxmLl9uYW1lLCBtb2RlLCBjYm5hbWUpCisgICAgICAgIHJldHVybiBjYm5hbWUKKworICAgIHRyYWNlID0gdHJhY2VfdmFyaWFibGUKKworICAgIGRlZiB0cmFjZV92ZGVsZXRlKHNlbGYsIG1vZGUsIGNibmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSB0aGUgdHJhY2UgY2FsbGJhY2sgZm9yIGEgdmFyaWFibGUuCisKKyAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgorICAgICAgICBDQk5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gdHJhY2VfdmFyaWFibGUgb3IgdHJhY2UuCisKKyAgICAgICAgVGhpcyBkZXByZWNhdGVkIG1ldGhvZCB3cmFwcyBhIGRlcHJlY2F0ZWQgVGNsIG1ldGhvZCB0aGF0IHdpbGwKKyAgICAgICAgbGlrZWx5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIFVzZSB0cmFjZV9yZW1vdmUoKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUT0RPOiBBZGQgZGVwcmVjYXRpb24gd2FybmluZworICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2ZGVsZXRlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQorICAgICAgICBjYm5hbWUgPSBzZWxmLl90ay5zcGxpdGxpc3QoY2JuYW1lKVswXQorICAgICAgICBmb3IgbSwgY2EgaW4gc2VsZi50cmFjZV9pbmZvKCk6CisgICAgICAgICAgICBpZiBzZWxmLl90ay5zcGxpdGxpc3QoY2EpWzBdID09IGNibmFtZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdGsuZGVsZXRlY29tbWFuZChjYm5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMucmVtb3ZlKGNibmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0cmFjZV92aW5mbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCB0cmFjZSBjYWxsYmFjayBpbmZvcm1hdGlvbi4KKworICAgICAgICBUaGlzIGRlcHJlY2F0ZWQgbWV0aG9kIHdyYXBzIGEgZGVwcmVjYXRlZCBUY2wgbWV0aG9kIHRoYXQgd2lsbAorICAgICAgICBsaWtlbHkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiAgVXNlIHRyYWNlX2luZm8oKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUT0RPOiBBZGQgZGVwcmVjYXRpb24gd2FybmluZwogICAgICAgICByZXR1cm4gW3NlbGYuX3RrLnNwbGl0bGlzdCh4KSBmb3IgeCBpbiBzZWxmLl90ay5zcGxpdGxpc3QoCiAgICAgICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2aW5mbyIsIHNlbGYuX25hbWUpKV0KKwogICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAiIiJDb21wYXJpc29uIGZvciBlcXVhbGl0eSAoPT0pLgogCkBAIC00MjYsNiArNTY5LDkgQEAKIAogICAgIEJhc2UgY2xhc3Mgd2hpY2ggZGVmaW5lcyBtZXRob2RzIGNvbW1vbiBmb3IgaW50ZXJpb3Igd2lkZ2V0cy4iIiIKIAorICAgICMgdXNlZCBmb3IgZ2VuZXJhdGluZyBjaGlsZCB3aWRnZXQgbmFtZXMKKyAgICBfbGFzdF9jaGlsZF9pZHMgPSBOb25lCisKICAgICAjIFhYWCBmb250IGNvbW1hbmQ/CiAgICAgX3RjbENvbW1hbmRzID0gTm9uZQogICAgIGRlZiBkZXN0cm95KHNlbGYpOgpAQCAtNDczLDEyICs2MTksNiBAQAogICAgICAgICBkaXNhYmxlZEZvcmVncm91bmQsIGluc2VydEJhY2tncm91bmQsIHRyb3VnaENvbG9yLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoKCd0a19zZXRQYWxldHRlJywpCiAgICAgICAgICAgICAgICsgX2ZsYXR0ZW4oYXJncykgKyBfZmxhdHRlbihsaXN0KGt3Lml0ZW1zKCkpKSkKLSAgICBkZWYgdGtfbWVudUJhcihzZWxmLCAqYXJncyk6Ci0gICAgICAgICIiIkRvIG5vdCB1c2UuIE5lZWRlZCBpbiBUayAzLjYgYW5kIGVhcmxpZXIuIiIiCi0gICAgICAgICMgb2Jzb2xldGUgc2luY2UgVGsgNC4wCi0gICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICB3YXJuaW5ncy53YXJuKCd0a19tZW51QmFyKCkgZG9lcyBub3RoaW5nIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gMy42JywKLSAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICBkZWYgd2FpdF92YXJpYWJsZShzZWxmLCBuYW1lPSdQWV9WQVInKToKICAgICAgICAgIiIiV2FpdCB1bnRpbCB0aGUgdmFyaWFibGUgaXMgbW9kaWZpZWQuCiAKQEAgLTg1MCw4ICs5OTAsNyBAQAogICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdoZWlnaHQnLCBzZWxmLl93KSkKICAgICBkZWYgd2luZm9faWQoc2VsZik6CiAgICAgICAgICIiIlJldHVybiBpZGVudGlmaWVyIElEIGZvciB0aGlzIHdpZGdldC4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0aW50KAotICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdpZCcsIHNlbGYuX3cpKQorICAgICAgICByZXR1cm4gaW50KHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaWQnLCBzZWxmLl93KSwgMCkKICAgICBkZWYgd2luZm9faW50ZXJwcyhzZWxmLCBkaXNwbGF5b2Y9MCk6CiAgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiBhbGwgVGNsIGludGVycHJldGVycyBmb3IgdGhpcyBkaXNwbGF5LiIiIgogICAgICAgICBhcmdzID0gKCd3aW5mbycsICdpbnRlcnBzJykgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKQpAQCAtOTcxLDE4ICsxMTEwLDE2IEBACiAgICAgZGVmIHdpbmZvX3Zpc3VhbGlkKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIFggaWRlbnRpZmllciBmb3IgdGhlIHZpc3VhbCBmb3IgdGhpcyB3aWRnZXQuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Zpc3VhbGlkJywgc2VsZi5fdykKLSAgICBkZWYgd2luZm9fdmlzdWFsc2F2YWlsYWJsZShzZWxmLCBpbmNsdWRlaWRzPTApOgorICAgIGRlZiB3aW5mb192aXN1YWxzYXZhaWxhYmxlKHNlbGYsIGluY2x1ZGVpZHM9RmFsc2UpOgogICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB2aXN1YWxzIGF2YWlsYWJsZSBmb3IgdGhlIHNjcmVlbgogICAgICAgICBvZiB0aGlzIHdpZGdldC4KIAogICAgICAgICBFYWNoIGl0ZW0gaW4gdGhlIGxpc3QgY29uc2lzdHMgb2YgYSB2aXN1YWwgbmFtZSAoc2VlIHdpbmZvX3Zpc3VhbCksIGEKLSAgICAgICAgZGVwdGggYW5kIGlmIElOQ0xVREVJRFM9MSBpcyBnaXZlbiBhbHNvIHRoZSBYIGlkZW50aWZpZXIuIiIiCi0gICAgICAgIGRhdGEgPSBzZWxmLnRrLnNwbGl0KAotICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWxzYXZhaWxhYmxlJywgc2VsZi5fdywKLSAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVpZHMgYW5kICdpbmNsdWRlaWRzJyBvciBOb25lKSkKLSAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpOgotICAgICAgICAgICAgZGF0YSA9IFtzZWxmLnRrLnNwbGl0KGRhdGEpXQotICAgICAgICByZXR1cm4gW3NlbGYuX193aW5mb19wYXJzZWl0ZW0oeCkgZm9yIHggaW4gIGRhdGFdCisgICAgICAgIGRlcHRoIGFuZCBpZiBpbmNsdWRlaWRzIGlzIHRydWUgaXMgZ2l2ZW4gYWxzbyB0aGUgWCBpZGVudGlmaWVyLiIiIgorICAgICAgICBkYXRhID0gc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWxzYXZhaWxhYmxlJywgc2VsZi5fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZWlkcycgaWYgaW5jbHVkZWlkcyBlbHNlIE5vbmUpCisgICAgICAgIGRhdGEgPSBbc2VsZi50ay5zcGxpdGxpc3QoeCkgZm9yIHggaW4gc2VsZi50ay5zcGxpdGxpc3QoZGF0YSldCisgICAgICAgIHJldHVybiBbc2VsZi5fX3dpbmZvX3BhcnNlaXRlbSh4KSBmb3IgeCBpbiBkYXRhXQogICAgIGRlZiBfX3dpbmZvX3BhcnNlaXRlbShzZWxmLCB0KToKICAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCiAgICAgICAgIHJldHVybiB0WzoxXSArIHR1cGxlKG1hcChzZWxmLl9fd2luZm9fZ2V0aW50LCB0WzE6XSkpCkBAIC0xMjgzLDcgKzE0MjAsMTAgQEAKICAgICAgICAgZXhjZXB0IFRjbEVycm9yOiBwYXNzCiAgICAgICAgIGUua2V5c3ltID0gSwogICAgICAgICBlLmtleXN5bV9udW0gPSBnZXRpbnRfZXZlbnQoTikKLSAgICAgICAgZS50eXBlID0gVAorICAgICAgICB0cnk6CisgICAgICAgICAgICBlLnR5cGUgPSBFdmVudFR5cGUoVCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBlLnR5cGUgPSBUCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGUud2lkZ2V0ID0gc2VsZi5fbmFtZXRvd2lkZ2V0KFcpCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKQEAgLTE4OTMsOSArMjAzMyw2IEBACiAgICAgICAgIGlmIHRjbF92ZXJzaW9uICE9IF90a2ludGVyLlRDTF9WRVJTSU9OOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ0Y2wuaCB2ZXJzaW9uICglcykgZG9lc24ndCBtYXRjaCBsaWJ0Y2wuYSB2ZXJzaW9uICglcykiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChfdGtpbnRlci5UQ0xfVkVSU0lPTiwgdGNsX3ZlcnNpb24pKQotICAgICAgICBpZiBUa1ZlcnNpb24gPCA0LjA6Ci0gICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlRrIDQuMCBvciBoaWdoZXIgaXMgcmVxdWlyZWQ7IGZvdW5kIFRrICVzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RyKFRrVmVyc2lvbikpCiAgICAgICAgICMgQ3JlYXRlIGFuZCByZWdpc3RlciB0aGUgdGtlcnJvciBhbmQgZXhpdCBjb21tYW5kcwogICAgICAgICAjIFdlIG5lZWQgdG8gaW5saW5lIHBhcnRzIG9mIF9yZWdpc3RlciBoZXJlLCBfIHJlZ2lzdGVyCiAgICAgICAgICMgd291bGQgcmVnaXN0ZXIgZGlmZmVyZW50bHktbmFtZWQgY29tbWFuZHMuCkBAIC0yMTE4LDcgKzIyNTUsMTUgQEAKICAgICAgICAgICAgIG5hbWUgPSBjbmZbJ25hbWUnXQogICAgICAgICAgICAgZGVsIGNuZlsnbmFtZSddCiAgICAgICAgIGlmIG5vdCBuYW1lOgotICAgICAgICAgICAgbmFtZSA9IHJlcHIoaWQoc2VsZikpCisgICAgICAgICAgICBuYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18ubG93ZXIoKQorICAgICAgICAgICAgaWYgbWFzdGVyLl9sYXN0X2NoaWxkX2lkcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIG1hc3Rlci5fbGFzdF9jaGlsZF9pZHMgPSB7fQorICAgICAgICAgICAgY291bnQgPSBtYXN0ZXIuX2xhc3RfY2hpbGRfaWRzLmdldChuYW1lLCAwKSArIDEKKyAgICAgICAgICAgIG1hc3Rlci5fbGFzdF9jaGlsZF9pZHNbbmFtZV0gPSBjb3VudAorICAgICAgICAgICAgaWYgY291bnQgPT0gMToKKyAgICAgICAgICAgICAgICBuYW1lID0gJ2AlcycgJSAobmFtZSwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUgPSAnYCVzJWQnICUgKG5hbWUsIGNvdW50KQogICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgICAgICBpZiBtYXN0ZXIuX3c9PScuJzoKICAgICAgICAgICAgIHNlbGYuX3cgPSAnLicgKyBuYW1lCkBAIC0yNzE0LDEyICsyODU5LDYgQEAKICAgICBkZWYgdGtfcG9wdXAoc2VsZiwgeCwgeSwgZW50cnk9IiIpOgogICAgICAgICAiIiJQb3N0IHRoZSBtZW51IGF0IHBvc2l0aW9uIFgsWSB3aXRoIGVudHJ5IEVOVFJZLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX3BvcHVwJywgc2VsZi5fdywgeCwgeSwgZW50cnkpCi0gICAgZGVmIHRrX2JpbmRGb3JUcmF2ZXJzYWwoc2VsZik6Ci0gICAgICAgICMgb2Jzb2xldGUgc2luY2UgVGsgNC4wCi0gICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICB3YXJuaW5ncy53YXJuKCd0a19iaW5kRm9yVHJhdmVyc2FsKCkgZG9lcyBub3RoaW5nIGFuZCAnCi0gICAgICAgICAgICAgICAgICAgICAgJ3dpbGwgYmUgcmVtb3ZlZCBpbiAzLjYnLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBpbmRleCk6CiAgICAgICAgICIiIkFjdGl2YXRlIGVudHJ5IGF0IElOREVYLiIiIgogICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FjdGl2YXRlJywgaW5kZXgpCkBAIC0zMzQyLDkgKzM0ODEsNiBAQAogICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgIEltYWdlLl9sYXN0X2lkICs9IDEKICAgICAgICAgICAgIG5hbWUgPSAicHlpbWFnZSVyIiAlIChJbWFnZS5fbGFzdF9pZCwpICMgdGsgaXRzZWxmIHdvdWxkIHVzZSBpbWFnZTx4PgotICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGlzIG5lZWRlZCBmb3Igc3lzdGVtcyB3aGVyZSBpZCh4KQotICAgICAgICAgICAgIyBjYW4gcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyLCBzdWNoIGFzIExpbnV4L202OGs6Ci0gICAgICAgICAgICBpZiBuYW1lWzBdID09ICctJzogbmFtZSA9ICdfJyArIG5hbWVbMTpdCiAgICAgICAgIGlmIGt3IGFuZCBjbmY6IGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCiAgICAgICAgIGVsaWYga3c6IGNuZiA9IGt3CiAgICAgICAgIG9wdGlvbnMgPSAoKQpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvY29tbW9uZGlhbG9nLnB5IGIvTGliL3RraW50ZXIvY29tbW9uZGlhbG9nLnB5CmluZGV4IGQyNjg4ZGIuLjFlNzVjYWUgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL2NvbW1vbmRpYWxvZy5weQorKysgYi9MaWIvdGtpbnRlci9jb21tb25kaWFsb2cucHkKQEAgLTE1LDExICsxNSw2IEBACiAgICAgY29tbWFuZCAgPSBOb25lCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqb3B0aW9ucyk6Ci0KLSAgICAgICAgIyBGSVhNRTogc2hvdWxkIHRoaXMgYmUgcGxhY2VkIG9uIHRoZSBtb2R1bGUgbGV2ZWwgaW5zdGVhZD8KLSAgICAgICAgaWYgVGtWZXJzaW9uIDwgNC4yOgotICAgICAgICAgICAgcmFpc2UgVGNsRXJyb3IoInRoaXMgbW9kdWxlIHJlcXVpcmVzIFRrIDQuMiBvciBuZXdlciIpCi0KICAgICAgICAgc2VsZi5tYXN0ZXIgID0gbWFzdGVyCiAgICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKICAgICAgICAgaWYgbm90IG1hc3RlciBhbmQgb3B0aW9ucy5nZXQoJ3BhcmVudCcpOgpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvZGlhbG9nLnB5IGIvTGliL3RraW50ZXIvZGlhbG9nLnB5CmluZGV4IGJlMDg1YWIuLmY2MWM1ZjcgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL2RpYWxvZy5weQorKysgYi9MaWIvdGtpbnRlci9kaWFsb2cucHkKQEAgLTMsMTAgKzMsNyBAQAogZnJvbSB0a2ludGVyIGltcG9ydCAqCiBmcm9tIHRraW50ZXIgaW1wb3J0IF9jbmZtZXJnZQogCi1pZiBUa1ZlcnNpb24gPD0gMy42OgotICAgIERJQUxPR19JQ09OID0gJ3dhcm5pbmcnCi1lbHNlOgotICAgIERJQUxPR19JQ09OID0gJ3F1ZXN0aGVhZCcKK0RJQUxPR19JQ09OID0gJ3F1ZXN0aGVhZCcKIAogCiBjbGFzcyBEaWFsb2coV2lkZ2V0KToKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvcnVudGt0ZXN0cy5weSBiL0xpYi90a2ludGVyL3Rlc3QvcnVudGt0ZXN0cy5weQppbmRleCBkYmU1ZTg4Li4zM2RjNTRhIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3J1bnRrdGVzdHMucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC9ydW50a3Rlc3RzLnB5CkBAIC03LDggKzcsNiBAQAogIiIiCiAKIGltcG9ydCBvcwotaW1wb3J0IHN5cwotaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaW1wb3J0bGliCiBpbXBvcnQgdGVzdC5zdXBwb3J0CiAKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbWlzYy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbWlzYy5weQppbmRleCA4NWVlMmM3Li45ZGMxZTM3IDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X21pc2MucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9taXNjLnB5CkBAIC0xMiw2ICsxMiwxNCBAQAogICAgICAgICBmID0gdGtpbnRlci5GcmFtZSh0LCBuYW1lPSdjaGlsZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmKSwgJzx0a2ludGVyLkZyYW1lIG9iamVjdCAudG9wLmNoaWxkPicpCiAKKyAgICBkZWYgdGVzdF9nZW5lcmF0ZWRfbmFtZXMoc2VsZik6CisgICAgICAgIHQgPSB0a2ludGVyLlRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgZiA9IHRraW50ZXIuRnJhbWUodCkKKyAgICAgICAgZjIgPSB0a2ludGVyLkZyYW1lKHQpCisgICAgICAgIGIgPSB0a2ludGVyLkJ1dHRvbihmMikKKyAgICAgICAgZm9yIG5hbWUgaW4gc3RyKGIpLnNwbGl0KCcuJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG5hbWUuaXNpZGVudGlmaWVyKCksIG1zZz1yZXByKG5hbWUpKQorCiAgICAgZGVmIHRlc3RfdGtfc2V0UGFsZXR0ZShzZWxmKToKICAgICAgICAgcm9vdCA9IHNlbGYucm9vdAogICAgICAgICByb290LnRrX3NldFBhbGV0dGUoJ2JsYWNrJykKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdmFyaWFibGVzLnB5IGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF92YXJpYWJsZXMucHkKaW5kZXggMWY3NDQ1My4uNDQ4NTgxNyAxMDA2NDQKLS0tIGEvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF92YXJpYWJsZXMucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF92YXJpYWJsZXMucHkKQEAgLTg3LDcgKzg3LDggQEAKICAgICAgICAgdi5zZXQoInZhbHVlIikKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYuc2lkZV9lZmZlY3QpCiAKLSAgICBkZWYgdGVzdF90cmFjZShzZWxmKToKKyAgICBkZWYgdGVzdF90cmFjZV9vbGQoc2VsZik6CisgICAgICAgICMgT2xkIGludGVyZmFjZQogICAgICAgICB2ID0gVmFyaWFibGUoc2VsZi5yb290KQogICAgICAgICB2bmFtZSA9IHN0cih2KQogICAgICAgICB0cmFjZSA9IFtdCkBAIC0xMzYsNiArMTM3LDU1IEBACiAgICAgICAgIGdjLmNvbGxlY3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCd3cml0ZScsIHZuYW1lLCAnJywgJ3UnKV0pCiAKKyAgICBkZWYgdGVzdF90cmFjZShzZWxmKToKKyAgICAgICAgdiA9IFZhcmlhYmxlKHNlbGYucm9vdCkKKyAgICAgICAgdm5hbWUgPSBzdHIodikKKyAgICAgICAgdHJhY2UgPSBbXQorICAgICAgICBkZWYgcmVhZF90cmFjZXIoKmFyZ3MpOgorICAgICAgICAgICAgdHJhY2UuYXBwZW5kKCgncmVhZCcsKSArIGFyZ3MpCisgICAgICAgIGRlZiB3cml0ZV90cmFjZXIoKmFyZ3MpOgorICAgICAgICAgICAgdHJhY2UuYXBwZW5kKCgnd3JpdGUnLCkgKyBhcmdzKQorICAgICAgICB0cjEgPSB2LnRyYWNlX2FkZCgncmVhZCcsIHJlYWRfdHJhY2VyKQorICAgICAgICB0cjIgPSB2LnRyYWNlX2FkZChbJ3dyaXRlJywgJ3Vuc2V0J10sIHdyaXRlX3RyYWNlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQodi50cmFjZV9pbmZvKCkpLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgncmVhZCcsKSwgdHIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCd3cml0ZScsICd1bnNldCcpLCB0cjIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgW10pCisKKyAgICAgICAgdi5zZXQoJ3NwYW0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCd3cml0ZScsIHZuYW1lLCAnJywgJ3dyaXRlJyldKQorCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgdi5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCdyZWFkJywgdm5hbWUsICcnLCAncmVhZCcpXSkKKworICAgICAgICB0cmFjZSA9IFtdCisgICAgICAgIGluZm8gPSBzb3J0ZWQodi50cmFjZV9pbmZvKCkpCisgICAgICAgIHYudHJhY2VfcmVtb3ZlKCd3cml0ZScsIHRyMSkgICMgV3JvbmcgbW9kZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZCh2LnRyYWNlX2luZm8oKSksIGluZm8pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IpOgorICAgICAgICAgICAgdi50cmFjZV9yZW1vdmUoJ3JlYWQnLCAnc3BhbScpICAjIFdyb25nIGNvbW1hbmQgbmFtZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZCh2LnRyYWNlX2luZm8oKSksIGluZm8pCisgICAgICAgIHYuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cmFjZSwgWygncmVhZCcsIHZuYW1lLCAnJywgJ3JlYWQnKV0pCisKKyAgICAgICAgdHJhY2UgPSBbXQorICAgICAgICB2LnRyYWNlX3JlbW92ZSgncmVhZCcsIHRyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnRyYWNlX2luZm8oKSwgWygoJ3dyaXRlJywgJ3Vuc2V0JyksIHRyMildKQorICAgICAgICB2LmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2UsIFtdKQorCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgZGVsIHdyaXRlX3RyYWNlcgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgdi5zZXQoJ2VnZ3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlLCBbKCd3cml0ZScsIHZuYW1lLCAnJywgJ3dyaXRlJyldKQorCisgICAgICAgIHRyYWNlID0gW10KKyAgICAgICAgZGVsIHYKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2UsIFsoJ3dyaXRlJywgdm5hbWUsICcnLCAndW5zZXQnKV0pCisKIAogY2xhc3MgVGVzdFN0cmluZ1ZhcihUZXN0QmFzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3Rfd2lkZ2V0cy5weQppbmRleCBjOTI0ZDU1Li44MWI1MmVhIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3dpZGdldHMucHkKKysrIGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF93aWRnZXRzLnB5CkBAIC05MSw5ICs5MSwxMCBAQAogICAgICAgICB3aWRnZXQgPSBzZWxmLmNyZWF0ZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0Wyd1c2UnXSwgJycpCiAgICAgICAgIHBhcmVudCA9IHNlbGYuY3JlYXRlKGNvbnRhaW5lcj1UcnVlKQotICAgICAgICB3aWQgPSBwYXJlbnQud2luZm9faWQoKQotICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUodXNlPXdpZCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQod2lkZ2V0MlsndXNlJ10pLCB3aWQpCisgICAgICAgIHdpZCA9IGhleChwYXJlbnQud2luZm9faWQoKSkKKyAgICAgICAgd2l0aCBzZWxmLnN1YlRlc3Qod2lkPXdpZCk6CisgICAgICAgICAgICB3aWRnZXQyID0gc2VsZi5jcmVhdGUodXNlPXdpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2lkZ2V0MlsndXNlJ10sIHdpZCkKIAogCiBAYWRkX3N0YW5kYXJkX29wdGlvbnMoU3RhbmRhcmRPcHRpb25zVGVzdHMpCmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5IGIvTGliL3RraW50ZXIvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQppbmRleCBjNjhhNjUwLi5hMWI3Y2RmIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKQEAgLTEsNiArMSw1IEBACiAjIC0qLSBlbmNvZGluZzogdXRmLTggLSotCiBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB0a2ludGVyCiBmcm9tIHRraW50ZXIgaW1wb3J0IHR0awogCiBjbGFzcyBNb2NrVGtBcHA6CmRpZmYgLS1naXQgYS9MaWIvdGtpbnRlci90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weSBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CmluZGV4IDhiZDIyZDAuLjI2NzY2YTggMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CisrKyBiL0xpYi90a2ludGVyL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CkBAIC0xNDg3LDYgKzE0ODcsNyBAQAogCiAKICAgICBkZWYgdGVzdF9zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50di5zZWxlY3Rpb24sICdzcGFtJykKICAgICAgICAgIyBpdGVtICdub25lJyBkb2Vzbid0IGV4aXN0CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2VsZWN0aW9uX3NldCwgJ25vbmUnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0a2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNlbGVjdGlvbl9hZGQsICdub25lJykKQEAgLTE1MDAsMjUgKzE1MDEsMzEgQEAKICAgICAgICAgYzMgPSBzZWxmLnR2Lmluc2VydChpdGVtMSwgJ2VuZCcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKCkpCiAKLSAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fc2V0KChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoYzEsIGl0ZW0yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoYzIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMyLCkpCiAKLSAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fYWRkKChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9hZGQoYzEsIGl0ZW0yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgYzIsIGl0ZW0yKSkKICAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fYWRkKGl0ZW0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChpdGVtMSwgYzEsIGMyLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX2FkZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGl0ZW0xLCBjMSwgYzIsIGl0ZW0yKSkKIAotICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoKGl0ZW0xLCBjMykpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3JlbW92ZShpdGVtMSwgYzMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBjMiwgaXRlbTIpKQogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9yZW1vdmUoYzIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3JlbW92ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBpdGVtMikpCiAKLSAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fdG9nZ2xlKChjMSwgYzMpKQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl90b2dnbGUoYzEsIGMzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMywgaXRlbTIpKQogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl90b2dnbGUoaXRlbTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMzLCkpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3RvZ2dsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMzLCkpCiAKICAgICAgICAgc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCBpZD0nd2l0aCBzcGFjZXMnKQogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoJ3dpdGggc3BhY2VzJykKQEAgLTE1MzYsNiArMTU0Myw0MCBAQAogICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoYidieXRlc1x4ZTJceDgyXHhhYycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKCdieXRlc1x4ZTJceDgyXHhhYycsKSkKIAorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksICgpKQorCisgICAgICAgICMgT2xkIGludGVyZmFjZQorICAgICAgICBzZWxmLnR2LnNlbGVjdGlvbl9zZXQoKGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX2FkZCgoYzEsIGl0ZW0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoaXRlbTEsIGMxLCBpdGVtMikpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3JlbW92ZSgoaXRlbTEsIGMzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzEsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi50di5zZWxlY3Rpb25fdG9nZ2xlKChjMSwgYzMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMywgaXRlbTIpKQorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDcpOgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICdEZXByZWNhdGVkIEFQSSBvZiBUcmVldmlldy5zZWxlY3Rpb24oKSBzaG91bGQgYmUgcmVtb3ZlZCcpCisgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uX3NldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZWxlY3Rpb24oKSwgKCkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi50di5zZWxlY3Rpb24oJ3NldCcsIChjMSwgaXRlbTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uKCdhZGQnLCAoYzEsIGl0ZW0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoaXRlbTEsIGMxLCBpdGVtMikpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRXYXJucyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgc2VsZi50di5zZWxlY3Rpb24oJ3JlbW92ZScsIChpdGVtMSwgYzMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2VsZWN0aW9uKCksIChjMSwgaXRlbTIpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0V2FybnMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgIHNlbGYudHYuc2VsZWN0aW9uKCd0b2dnbGUnLCAoYzEsIGMzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNlbGVjdGlvbigpLCAoYzMsIGl0ZW0yKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFdhcm5zKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLnR2LnNlbGVjdGlvbihOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGVjdGlvbiwgKGMzLCBpdGVtMikpCiAKICAgICBkZWYgdGVzdF9zZXQoc2VsZik6CiAgICAgICAgIHNlbGYudHZbJ2NvbHVtbnMnXSA9IFsnQScsICdCJ10KZGlmZiAtLWdpdCBhL0xpYi90a2ludGVyL3RpeC5weSBiL0xpYi90a2ludGVyL3RpeC5weQppbmRleCBmNjY3OTMzLi4zZDM4ZTVkIDEwMDY0NAotLS0gYS9MaWIvdGtpbnRlci90aXgucHkKKysrIGIvTGliL3RraW50ZXIvdGl4LnB5CkBAIC0yOSwxMCArMjksNiBAQAogZnJvbSB0a2ludGVyIGltcG9ydCAqCiBmcm9tIHRraW50ZXIgaW1wb3J0IF9jbmZtZXJnZSwgX2RlZmF1bHRfcm9vdAogCi0jIFdBUk5JTkcgLSBUa1ZlcnNpb24gaXMgYSBsaW1pdGVkIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIKLWlmIFRrVmVyc2lvbiA8IDMuOTk5OgotICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIHZlcnNpb24gb2YgVGl4LnB5IHJlcXVpcmVzIFRrIDQuMCBvciBoaWdoZXIiKQotCiBpbXBvcnQgX3RraW50ZXIgIyBJZiB0aGlzIGZhaWxzIHlvdXIgUHl0aG9uIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgVGsKIAogIyBTb21lIG1vcmUgY29uc3RhbnRzIChmb3IgY29uc2lzdGVuY3kgd2l0aCBUa2ludGVyKQpAQCAtMTExMCw3ICsxMTA2LDcgQEAKIAogICAgIGRlZiBwYWdlcyhzZWxmKToKICAgICAgICAgIyBDYW4ndCBjYWxsIHN1YndpZGdldHNfYWxsIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCAubmJmcmFtZQotICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYWdlcycpKQorICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKICAgICAgICAgcmV0ID0gW10KICAgICAgICAgZm9yIHggaW4gbmFtZXM6CiAgICAgICAgICAgICByZXQuYXBwZW5kKHNlbGYuc3Vid2lkZ2V0KHgpKQpAQCAtMTE1Niw3ICsxMTUyLDcgQEAKIAogICAgIGRlZiBwYWdlcyhzZWxmKToKICAgICAgICAgIyBDYW4ndCBjYWxsIHN1YndpZGdldHNfYWxsIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCAubmJmcmFtZQotICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYWdlcycpKQorICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKICAgICAgICAgcmV0ID0gW10KICAgICAgICAgZm9yIHggaW4gbmFtZXM6CiAgICAgICAgICAgICByZXQuYXBwZW5kKHNlbGYuc3Vid2lkZ2V0KHgpKQpAQCAtMTU3OSw4ICsxNTc1LDcgQEAKICAgICAgICAgJycnUmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2hvc2Ugc3RhdHVzIG1hdGNoZXMgc3RhdHVzLiBJZiBzdGF0dXMgaXMKICAgICAgbm90IHNwZWNpZmllZCwgdGhlIGxpc3Qgb2YgaXRlbXMgaW4gdGhlICJvbiIgc3RhdHVzIHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgIE1vZGUgY2FuIGJlIG9uLCBvZmYsIGRlZmF1bHQnJycKLSAgICAgICAgYyA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXRzZWxlY3Rpb24nLCBtb2RlKSkKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KGMpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldHNlbGVjdGlvbicsIG1vZGUpKQogCiAgICAgZGVmIGdldHN0YXR1cyhzZWxmLCBlbnRyeXBhdGgpOgogICAgICAgICAnJydSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBlbnRyeVBhdGguJycnCkBAIC0xOTAxLDcgKzE4OTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgb3IgYSByZWFsIG51bWJlciBmb2xsb3dpbmcgYnkgdGhlIHdvcmQgY2hhcnMKICAgICAgICAgICAgICAgICAgICAgIChlLmcuIDMuNGNoYXJzKSB0aGF0IHNldHMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBudW1iZXIgb2YgY2hhcmFjdGVycy4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdzaXplJywgJ2NvbHVtbicsIGluZGV4LAorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX3csICdzaXplJywgJ2NvbHVtbicsIGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZi5fb3B0aW9ucyh7fSwga3cpKSkKIAogICAgIGRlZiBzaXplX3JvdyhzZWxmLCBpbmRleCwgKiprdyk6CkBAIC0xOTI2LDcgKzE5MjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgb3IgYSByZWFsIG51bWJlciBmb2xsb3dpbmcgYnkgdGhlIHdvcmQgY2hhcnMKICAgICAgICAgICAgICAgICAgICAgIChlLmcuIDMuNGNoYXJzKSB0aGF0IHNldHMgdGhlIGhlaWdodCBvZiB0aGUgcm93IHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbCgKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKICAgICAgICAgICAgICAgICAgICAgc2VsZiwgJ3NpemUnLCAncm93JywgaW5kZXgsICpzZWxmLl9vcHRpb25zKHt9LCBrdykpKQogCiAgICAgZGVmIHVuc2V0KHNlbGYsIHgsIHkpOgpkaWZmIC0tZ2l0IGEvTGliL3RraW50ZXIvdHRrLnB5IGIvTGliL3RraW50ZXIvdHRrLnB5CmluZGV4IDBlNTc1OWQuLjcxYWMyYTcgMTAwNjQ0Ci0tLSBhL0xpYi90a2ludGVyL3R0ay5weQorKysgYi9MaWIvdGtpbnRlci90dGsucHkKQEAgLTI4LDYgKzI4LDggQEAKIGltcG9ydCB0a2ludGVyCiBmcm9tIHRraW50ZXIgaW1wb3J0IF9mbGF0dGVuLCBfam9pbiwgX3N0cmluZ2lmeSwgX3NwbGl0ZGljdAogCitfc2VudGluZWwgPSBvYmplY3QoKQorCiAjIFZlcmlmeSBpZiBUayBpcyBuZXcgZW5vdWdoIHRvIG5vdCBuZWVkIHRoZSBUaWxlIHBhY2thZ2UKIF9SRVFVSVJFX1RJTEUgPSBUcnVlIGlmIHRraW50ZXIuVGtWZXJzaW9uIDwgOC41IGVsc2UgRmFsc2UKIApAQCAtMzgxLDcgKzM4Myw5IEBACiAgICAgICAgIGEgc2VxdWVuY2UgaWRlbnRpZnlpbmcgdGhlIHZhbHVlIGZvciB0aGF0IG9wdGlvbi4iIiIKICAgICAgICAgaWYgcXVlcnlfb3B0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAga3dbcXVlcnlfb3B0XSA9IE5vbmUKLSAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChzZWxmLnRrLCBrdywgc2VsZi5fbmFtZSwgImNvbmZpZ3VyZSIsIHN0eWxlKQorICAgICAgICByZXN1bHQgPSBfdmFsX29yX2RpY3Qoc2VsZi50aywga3csIHNlbGYuX25hbWUsICJjb25maWd1cmUiLCBzdHlsZSkKKyAgICAgICAgaWYgcmVzdWx0IG9yIHF1ZXJ5X29wdDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKIAogCiAgICAgZGVmIG1hcChzZWxmLCBzdHlsZSwgcXVlcnlfb3B0PU5vbmUsICoqa3cpOgpAQCAtNDY2LDEyICs0NzAsMTQgQEAKIAogICAgIGRlZiBlbGVtZW50X25hbWVzKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm5zIHRoZSBsaXN0IG9mIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgdGhlbWUuIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAibmFtZXMiKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG4ubHN0cmlwKCctJykgZm9yIG4gaW4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAibmFtZXMiKSkpCiAKIAogICAgIGRlZiBlbGVtZW50X29wdGlvbnMoc2VsZiwgZWxlbWVudG5hbWUpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgZWxlbWVudG5hbWUncyBvcHRpb25zLiIiIgotICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm9wdGlvbnMiLCBlbGVtZW50bmFtZSkpCisgICAgICAgIHJldHVybiB0dXBsZShvLmxzdHJpcCgnLScpIGZvciBvIGluIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm9wdGlvbnMiLCBlbGVtZW50bmFtZSkpKQogCiAKICAgICBkZWYgdGhlbWVfY3JlYXRlKHNlbGYsIHRoZW1lbmFtZSwgcGFyZW50PU5vbmUsIHNldHRpbmdzPU5vbmUpOgpAQCAtMTM5MCwzMSArMTM5Niw1MyBAQAogICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNlZSIsIGl0ZW0pCiAKIAotICAgIGRlZiBzZWxlY3Rpb24oc2VsZiwgc2Vsb3A9Tm9uZSwgaXRlbXM9Tm9uZSk6Ci0gICAgICAgICIiIklmIHNlbG9wIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgc2VsZWN0ZWQgaXRlbXMuIiIiCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbXMsIChzdHIsIGJ5dGVzKSk6Ci0gICAgICAgICAgICBpdGVtcyA9IChpdGVtcywpCisgICAgZGVmIHNlbGVjdGlvbihzZWxmLCBzZWxvcD1fc2VudGluZWwsIGl0ZW1zPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSB0dXBsZSBvZiBzZWxlY3RlZCBpdGVtcy4iIiIKKyAgICAgICAgaWYgc2Vsb3AgaXMgX3NlbnRpbmVsOgorICAgICAgICAgICAgc2Vsb3AgPSBOb25lCisgICAgICAgIGVsaWYgc2Vsb3AgaXMgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiVGhlIHNlbG9wPU5vbmUgYXJndW1lbnQgb2Ygc2VsZWN0aW9uKCkgaXMgZGVwcmVjYXRlZCAiCisgICAgICAgICAgICAgICAgImFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuNyIsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAzKQorICAgICAgICBlbGlmIHNlbG9wIGluICgnc2V0JywgJ2FkZCcsICdyZW1vdmUnLCAndG9nZ2xlJyk6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIlRoZSBzZWxvcCBhcmd1bWVudCBvZiBzZWxlY3Rpb24oKSBpcyBkZXByZWNhdGVkICIKKyAgICAgICAgICAgICAgICAiYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy43LCAiCisgICAgICAgICAgICAgICAgInVzZSBzZWxlY3Rpb25fJXMoKSBpbnN0ZWFkIiAlIChzZWxvcCwpLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVW5zdXBwb3J0ZWQgb3BlcmF0aW9uJykKICAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAic2VsZWN0aW9uIiwgc2Vsb3AsIGl0ZW1zKSkKIAogCi0gICAgZGVmIHNlbGVjdGlvbl9zZXQoc2VsZiwgaXRlbXMpOgotICAgICAgICAiIiJpdGVtcyBiZWNvbWVzIHRoZSBuZXcgc2VsZWN0aW9uLiIiIgotICAgICAgICBzZWxmLnNlbGVjdGlvbigic2V0IiwgaXRlbXMpCisgICAgZGVmIF9zZWxlY3Rpb24oc2VsZiwgc2Vsb3AsIGl0ZW1zKToKKyAgICAgICAgaWYgbGVuKGl0ZW1zKSA9PSAxIGFuZCBpc2luc3RhbmNlKGl0ZW1zWzBdLCAodHVwbGUsIGxpc3QpKToKKyAgICAgICAgICAgIGl0ZW1zID0gaXRlbXNbMF0KKworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNlbGVjdGlvbiIsIHNlbG9wLCBpdGVtcykKIAogCi0gICAgZGVmIHNlbGVjdGlvbl9hZGQoc2VsZiwgaXRlbXMpOgotICAgICAgICAiIiJBZGQgaXRlbXMgdG8gdGhlIHNlbGVjdGlvbi4iIiIKLSAgICAgICAgc2VsZi5zZWxlY3Rpb24oImFkZCIsIGl0ZW1zKQorICAgIGRlZiBzZWxlY3Rpb25fc2V0KHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIlRoZSBzcGVjaWZpZWQgaXRlbXMgYmVjb21lcyB0aGUgbmV3IHNlbGVjdGlvbi4iIiIKKyAgICAgICAgc2VsZi5fc2VsZWN0aW9uKCJzZXQiLCBpdGVtcykKIAogCi0gICAgZGVmIHNlbGVjdGlvbl9yZW1vdmUoc2VsZiwgaXRlbXMpOgotICAgICAgICAiIiJSZW1vdmUgaXRlbXMgZnJvbSB0aGUgc2VsZWN0aW9uLiIiIgotICAgICAgICBzZWxmLnNlbGVjdGlvbigicmVtb3ZlIiwgaXRlbXMpCisgICAgZGVmIHNlbGVjdGlvbl9hZGQoc2VsZiwgKml0ZW1zKToKKyAgICAgICAgIiIiQWRkIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbigiYWRkIiwgaXRlbXMpCiAKIAotICAgIGRlZiBzZWxlY3Rpb25fdG9nZ2xlKHNlbGYsIGl0ZW1zKToKLSAgICAgICAgIiIiVG9nZ2xlIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBpdGVtIGluIGl0ZW1zLiIiIgotICAgICAgICBzZWxmLnNlbGVjdGlvbigidG9nZ2xlIiwgaXRlbXMpCisgICAgZGVmIHNlbGVjdGlvbl9yZW1vdmUoc2VsZiwgKml0ZW1zKToKKyAgICAgICAgIiIiUmVtb3ZlIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNlbGVjdGlvbi4iIiIKKyAgICAgICAgc2VsZi5fc2VsZWN0aW9uKCJyZW1vdmUiLCBpdGVtcykKKworCisgICAgZGVmIHNlbGVjdGlvbl90b2dnbGUoc2VsZiwgKml0ZW1zKToKKyAgICAgICAgIiIiVG9nZ2xlIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBzcGVjaWZpZWQgaXRlbS4iIiIKKyAgICAgICAgc2VsZi5fc2VsZWN0aW9uKCJ0b2dnbGUiLCBpdGVtcykKIAogCiAgICAgZGVmIHNldChzZWxmLCBpdGVtLCBjb2x1bW49Tm9uZSwgdmFsdWU9Tm9uZSk6CmRpZmYgLS1naXQgYS9MaWIvdG9rZW5pemUucHkgYi9MaWIvdG9rZW5pemUucHkKaW5kZXggYjFkMGM4My4uZWM3OWVjOCAxMDA2NDQKLS0tIGEvTGliL3Rva2VuaXplLnB5CisrKyBiL0xpYi90b2tlbml6ZS5weQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IGNvbGxlY3Rpb25zCiBmcm9tIGlvIGltcG9ydCBUZXh0SU9XcmFwcGVyCiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KK2ltcG9ydCBpdGVydG9vbHMgYXMgX2l0ZXJ0b29scwogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCiBmcm9tIHRva2VuIGltcG9ydCAqCkBAIC0xMzEsNyArMTMyLDI4IEBACiBJbWFnbnVtYmVyID0gZ3JvdXAocidbMC05XStbakpdJywgRmxvYXRudW1iZXIgKyByJ1tqSl0nKQogTnVtYmVyID0gZ3JvdXAoSW1hZ251bWJlciwgRmxvYXRudW1iZXIsIEludG51bWJlcikKIAotU3RyaW5nUHJlZml4ID0gcicoPzpbYkJdW3JSXT98W3JSXVtiQl0/fFt1VV0pPycKKyMgUmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcsIHBsdXMgYWxsIG9mIHRoZSB2YWxpZCBzdHJpbmcgcHJlZml4ZXMuCitkZWYgX2FsbF9zdHJpbmdfcHJlZml4ZXMoKToKKyAgICAjIFRoZSB2YWxpZCBzdHJpbmcgcHJlZml4ZXMuIE9ubHkgY29udGFpbiB0aGUgbG93ZXIgY2FzZSB2ZXJzaW9ucywKKyAgICAjICBhbmQgZG9uJ3QgY29udGFpbiBhbnkgcGVybXVhdGlvbnMgKGluY2x1ZGUgJ2ZyJywgYnV0IG5vdAorICAgICMgICdyZicpLiBUaGUgdmFyaW91cyBwZXJtdXRhdGlvbnMgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgX3ZhbGlkX3N0cmluZ19wcmVmaXhlcyA9IFsnYicsICdyJywgJ3UnLCAnZicsICdicicsICdmciddCisgICAgIyBpZiB3ZSBhZGQgYmluYXJ5IGYtc3RyaW5ncywgYWRkOiBbJ2ZiJywgJ2ZiciddCisgICAgcmVzdWx0ID0gc2V0KFsnJ10pCisgICAgZm9yIHByZWZpeCBpbiBfdmFsaWRfc3RyaW5nX3ByZWZpeGVzOgorICAgICAgICBmb3IgdCBpbiBfaXRlcnRvb2xzLnBlcm11dGF0aW9ucyhwcmVmaXgpOgorICAgICAgICAgICAgIyBjcmVhdGUgYSBsaXN0IHdpdGggdXBwZXIgYW5kIGxvd2VyIHZlcnNpb25zIG9mIGVhY2gKKyAgICAgICAgICAgICMgIGNoYXJhY3RlcgorICAgICAgICAgICAgZm9yIHUgaW4gX2l0ZXJ0b29scy5wcm9kdWN0KCpbKGMsIGMudXBwZXIoKSkgZm9yIGMgaW4gdF0pOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoJycuam9pbih1KSkKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBfY29tcGlsZShleHByKToKKyAgICByZXR1cm4gcmUuY29tcGlsZShleHByLCByZS5VTklDT0RFKQorCisjIE5vdGUgdGhhdCBzaW5jZSBfYWxsX3N0cmluZ19wcmVmaXhlcyBpbmNsdWRlcyB0aGUgZW1wdHkgc3RyaW5nLAorIyAgU3RyaW5nUHJlZml4IGNhbiBiZSB0aGUgZW1wdHkgc3RyaW5nIChtYWtpbmcgaXQgb3B0aW9uYWwpLgorU3RyaW5nUHJlZml4ID0gZ3JvdXAoKl9hbGxfc3RyaW5nX3ByZWZpeGVzKCkpCiAKICMgVGFpbCBlbmQgb2YgJyBzdHJpbmcuCiBTaW5nbGUgPSByIlteJ1xcXSooPzpcXC5bXidcXF0qKSonIgpAQCAtMTY5LDUwICsxOTEsMjUgQEAKIFBzZXVkb0V4dHJhcyA9IGdyb3VwKHInXFxccj9cbnxcWicsIENvbW1lbnQsIFRyaXBsZSkKIFBzZXVkb1Rva2VuID0gV2hpdGVzcGFjZSArIGdyb3VwKFBzZXVkb0V4dHJhcywgTnVtYmVyLCBGdW5ueSwgQ29udFN0ciwgTmFtZSkKIAotZGVmIF9jb21waWxlKGV4cHIpOgotICAgIHJldHVybiByZS5jb21waWxlKGV4cHIsIHJlLlVOSUNPREUpCisjIEZvciBhIGdpdmVuIHN0cmluZyBwcmVmaXggcGx1cyBxdW90ZXMsIGVuZHBhdHMgbWFwcyBpdCB0byBhIHJlZ2V4CisjICB0byBtYXRjaCB0aGUgcmVtYWluZGVyIG9mIHRoYXQgc3RyaW5nLiBfcHJlZml4IGNhbiBiZSBlbXB0eSwgZm9yCisjICBhIG5vcm1hbCBzaW5nbGUgb3IgdHJpcGxlIHF1b3RlZCBzdHJpbmcgKHdpdGggbm8gcHJlZml4KS4KK2VuZHBhdHMgPSB7fQorZm9yIF9wcmVmaXggaW4gX2FsbF9zdHJpbmdfcHJlZml4ZXMoKToKKyAgICBlbmRwYXRzW19wcmVmaXggKyAiJyJdID0gU2luZ2xlCisgICAgZW5kcGF0c1tfcHJlZml4ICsgJyInXSA9IERvdWJsZQorICAgIGVuZHBhdHNbX3ByZWZpeCArICInJyciXSA9IFNpbmdsZTMKKyAgICBlbmRwYXRzW19wcmVmaXggKyAnIiIiJ10gPSBEb3VibGUzCiAKLWVuZHBhdHMgPSB7IiciOiBTaW5nbGUsICciJzogRG91YmxlLAotICAgICAgICAgICAiJycnIjogU2luZ2xlMywgJyIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJyJycnIjogU2luZ2xlMywgJ3IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYicnJyI6IFNpbmdsZTMsICdiIiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlInJyciOiBTaW5nbGUzLCAnUiIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICJCJycnIjogU2luZ2xlMywgJ0IiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYnInJyciOiBTaW5nbGUzLCAnYnIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiYlInJyciOiBTaW5nbGUzLCAnYlIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQnInJyciOiBTaW5nbGUzLCAnQnIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiQlInJyciOiBTaW5nbGUzLCAnQlIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAicmInJyciOiBTaW5nbGUzLCAncmIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiUmInJyciOiBTaW5nbGUzLCAnUmIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAickInJyciOiBTaW5nbGUzLCAnckIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAiUkInJyciOiBTaW5nbGUzLCAnUkIiIiInOiBEb3VibGUzLAotICAgICAgICAgICAidScnJyI6IFNpbmdsZTMsICd1IiIiJzogRG91YmxlMywKLSAgICAgICAgICAgIlUnJyciOiBTaW5nbGUzLCAnVSIiIic6IERvdWJsZTMsCi0gICAgICAgICAgICdyJzogTm9uZSwgJ1InOiBOb25lLCAnYic6IE5vbmUsICdCJzogTm9uZSwKLSAgICAgICAgICAgJ3UnOiBOb25lLCAnVSc6IE5vbmV9Ci0KLXRyaXBsZV9xdW90ZWQgPSB7fQotZm9yIHQgaW4gKCInJyciLCAnIiIiJywKLSAgICAgICAgICAicicnJyIsICdyIiIiJywgIlInJyciLCAnUiIiIicsCi0gICAgICAgICAgImInJyciLCAnYiIiIicsICJCJycnIiwgJ0IiIiInLAotICAgICAgICAgICJicicnJyIsICdiciIiIicsICJCcicnJyIsICdCciIiIicsCi0gICAgICAgICAgImJSJycnIiwgJ2JSIiIiJywgIkJSJycnIiwgJ0JSIiIiJywKLSAgICAgICAgICAicmInJyciLCAncmIiIiInLCAickInJyciLCAnckIiIiInLAotICAgICAgICAgICJSYicnJyIsICdSYiIiIicsICJSQicnJyIsICdSQiIiIicsCi0gICAgICAgICAgInUnJyciLCAndSIiIicsICJVJycnIiwgJ1UiIiInLAotICAgICAgICAgICk6Ci0gICAgdHJpcGxlX3F1b3RlZFt0XSA9IHQKLXNpbmdsZV9xdW90ZWQgPSB7fQotZm9yIHQgaW4gKCInIiwgJyInLAotICAgICAgICAgICJyJyIsICdyIicsICJSJyIsICdSIicsCi0gICAgICAgICAgImInIiwgJ2IiJywgIkInIiwgJ0IiJywKLSAgICAgICAgICAiYnInIiwgJ2JyIicsICJCciciLCAnQnIiJywKLSAgICAgICAgICAiYlInIiwgJ2JSIicsICJCUiciLCAnQlIiJyAsCi0gICAgICAgICAgInJiJyIsICdyYiInLCAickInIiwgJ3JCIicsCi0gICAgICAgICAgIlJiJyIsICdSYiInLCAiUkInIiwgJ1JCIicgLAotICAgICAgICAgICJ1JyIsICd1IicsICJVJyIsICdVIicsCi0gICAgICAgICAgKToKLSAgICBzaW5nbGVfcXVvdGVkW3RdID0gdAorIyBBIHNldCBvZiBhbGwgb2YgdGhlIHNpbmdsZSBhbmQgdHJpcGxlIHF1b3RlZCBzdHJpbmcgcHJlZml4ZXMsCisjICBpbmNsdWRpbmcgdGhlIG9wZW5pbmcgcXVvdGVzLgorc2luZ2xlX3F1b3RlZCA9IHNldCgpCit0cmlwbGVfcXVvdGVkID0gc2V0KCkKK2ZvciB0IGluIF9hbGxfc3RyaW5nX3ByZWZpeGVzKCk6CisgICAgZm9yIHUgaW4gKHQgKyAnIicsIHQgKyAiJyIpOgorICAgICAgICBzaW5nbGVfcXVvdGVkLmFkZCh1KQorICAgIGZvciB1IGluICh0ICsgJyIiIicsIHQgKyAiJycnIik6CisgICAgICAgIHRyaXBsZV9xdW90ZWQuYWRkKHUpCiAKIHRhYnNpemUgPSA4CiAKQEAgLTYyNiw2ICs2MjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc3Rhc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgc3Rhc2hlZCA9IE5vbmUKICAgICAgICAgICAgICAgICAgICAgeWllbGQgVG9rZW5JbmZvKENPTU1FTlQsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorCiAgICAgICAgICAgICAgICAgZWxpZiB0b2tlbiBpbiB0cmlwbGVfcXVvdGVkOgogICAgICAgICAgICAgICAgICAgICBlbmRwcm9nID0gX2NvbXBpbGUoZW5kcGF0c1t0b2tlbl0pCiAgICAgICAgICAgICAgICAgICAgIGVuZG1hdGNoID0gZW5kcHJvZy5tYXRjaChsaW5lLCBwb3MpCkBAIC02MzgsMTkgKzYzNiwzNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciA9IGxpbmVbc3RhcnQ6XQogICAgICAgICAgICAgICAgICAgICAgICAgY29udGxpbmUgPSBsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiBzaW5nbGVfcXVvdGVkIG9yIFwKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjJdIGluIHNpbmdsZV9xdW90ZWQgb3IgXAotICAgICAgICAgICAgICAgICAgICB0b2tlbls6M10gaW4gc2luZ2xlX3F1b3RlZDoKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgdXAgdG8gdGhlIGZpcnN0IDMgY2hhcnMgb2YgdGhlIHRva2VuIHRvIHNlZSBpZgorICAgICAgICAgICAgICAgICMgIHRoZXkncmUgaW4gdGhlIHNpbmdsZV9xdW90ZWQgc2V0LiBJZiBzbywgdGhleSBzdGFydAorICAgICAgICAgICAgICAgICMgIGEgc3RyaW5nLgorICAgICAgICAgICAgICAgICMgV2UncmUgdXNpbmcgdGhlIGZpcnN0IDMsIGJlY2F1c2Ugd2UncmUgbG9va2luZyBmb3IKKyAgICAgICAgICAgICAgICAjICAicmInIiAoZm9yIGV4YW1wbGUpIGF0IHRoZSBzdGFydCBvZiB0aGUgdG9rZW4uIElmCisgICAgICAgICAgICAgICAgIyAgd2Ugc3dpdGNoIHRvIGxvbmdlciBwcmVmaXhlcywgdGhpcyBuZWVkcyB0byBiZQorICAgICAgICAgICAgICAgICMgIGFkanVzdGVkLgorICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IGluaXRpYWwgPT0gdG9rZW5bOjFdLgorICAgICAgICAgICAgICAgICMgQWxzbyBub3RlIHRoYXQgc2luZ2xlIHF1b3RlIGNoZWNraW5nIG11c3QgY29tZSBhZnRlcgorICAgICAgICAgICAgICAgICMgIHRyaXBsZSBxdW90ZSBjaGVja2luZyAoYWJvdmUpLgorICAgICAgICAgICAgICAgIGVsaWYgKGluaXRpYWwgaW4gc2luZ2xlX3F1b3RlZCBvcgorICAgICAgICAgICAgICAgICAgICAgIHRva2VuWzoyXSBpbiBzaW5nbGVfcXVvdGVkIG9yCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjNdIGluIHNpbmdsZV9xdW90ZWQpOgogICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblstMV0gPT0gJ1xuJzogICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlZCBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0ID0gKGxudW0sIHN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHNbaW5pdGlhbF0gb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwYXRzW3Rva2VuWzFdXSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBhdHNbdG9rZW5bMl1dKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBBZ2FpbiwgdXNpbmcgdGhlIGZpcnN0IDMgY2hhcnMgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjICB0b2tlbi4gVGhpcyBpcyBsb29raW5nIGZvciB0aGUgbWF0Y2hpbmcgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAjICByZWdleCBmb3IgdGhlIGNvcnJlY3QgdHlwZSBvZiBxdW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyAgY2hhcmFjdGVyLiBTbyBpdCdzIHJlYWxseSBsb29raW5nIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgIyAgZW5kcGF0c1siJyJdIG9yIGVuZHBhdHNbJyInXSwgYnkgdHJ5aW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAjICBza2lwIHN0cmluZyBwcmVmaXggY2hhcmFjdGVycywgaWYgYW55LgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IF9jb21waWxlKGVuZHBhdHMuZ2V0KGluaXRpYWwpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0cy5nZXQodG9rZW5bMV0pIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcGF0cy5nZXQodG9rZW5bMl0pKQogICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciwgbmVlZGNvbnQgPSBsaW5lW3N0YXJ0Ol0sIDEKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcmRpbmFyeSBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIFRva2VuSW5mbyhTVFJJTkcsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorCiAgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsLmlzaWRlbnRpZmllcigpOiAgICAgICAgICAgICAgICMgb3JkaW5hcnkgbmFtZQogICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiBpbiAoJ2FzeW5jJywgJ2F3YWl0Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhc3luY19kZWY6CmRpZmYgLS1naXQgYS9MaWIvdHJhY2UucHkgYi9MaWIvdHJhY2UucHkKaW5kZXggZjEwODI2Ni4uYWUxNTQ2MSAxMDA3NTUKLS0tIGEvTGliL3RyYWNlLnB5CisrKyBiL0xpYi90cmFjZS5weQpAQCAtNDgsNiArNDgsNyBAQAogICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIGNvdmVyZGlyPSIvdG1wIikKICIiIgogX19hbGxfXyA9IFsnVHJhY2UnLCAnQ292ZXJhZ2VSZXN1bHRzJ10KK2ltcG9ydCBhcmdwYXJzZQogaW1wb3J0IGxpbmVjYWNoZQogaW1wb3J0IG9zCiBpbXBvcnQgcmUKQEAgLTU4LDcgKzU5LDYgQEAKIGltcG9ydCBnYwogaW1wb3J0IGRpcwogaW1wb3J0IHBpY2tsZQotZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybiBhcyBfd2FybgogZnJvbSB0aW1lIGltcG9ydCBtb25vdG9uaWMgYXMgX3RpbWUKIAogdHJ5OgpAQCAtNzcsNTEgKzc3LDYgQEAKICAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCiAgICAgICAgIHRocmVhZGluZy5zZXR0cmFjZShOb25lKQogCi1kZWYgX3VzYWdlKG91dGZpbGUpOgotICAgIG91dGZpbGUud3JpdGUoIiIiVXNhZ2U6ICVzIFtPUFRJT05TXSA8ZmlsZT4gW0FSR1NdCi0KLU1ldGEtb3B0aW9uczoKLS0taGVscCAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCB0aGVuIGV4aXQuCi0tLXZlcnNpb24gICAgICAgICAgICAgT3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gdGhlbiBleGl0LgotCi1PdGhlcndpc2UsIGV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhyZWUgb3B0aW9ucyBtdXN0IGJlIGdpdmVuOgotLXQsIC0tdHJhY2UgICAgICAgICAgIFByaW50IGVhY2ggbGluZSB0byBzeXMuc3Rkb3V0IGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KLS1jLCAtLWNvdW50ICAgICAgICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbGluZSBpcyBleGVjdXRlZAotICAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZSB0aGUgY291bnRzIHRvIDxtb2R1bGU+LmNvdmVyIGZvciBlYWNoCi0gICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGV4ZWN1dGVkLCBpbiB0aGUgbW9kdWxlJ3MgZGlyZWN0b3J5LgotICAgICAgICAgICAgICAgICAgICAgIFNlZSBhbHNvIGAtLWNvdmVyZGlyJywgYC0tZmlsZScsIGAtLW5vLXJlcG9ydCcgYmVsb3cuCi0tbCwgLS1saXN0ZnVuY3MgICAgICAgS2VlcCB0cmFjayBvZiB3aGljaCBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGF0IGxlYXN0Ci0gICAgICAgICAgICAgICAgICAgICAgb25jZSBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGV4aXRzLgotLVQsIC0tdHJhY2tjYWxscyAgICAgIEtlZXAgdHJhY2sgb2YgY2FsbGVyL2NhbGxlZCBwYWlycyBhbmQgd3JpdGUgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyB0byBzeXMuc3Rkb3V0IGFmdGVyIHRoZSBwcm9ncmFtIGV4aXRzLgotLXIsIC0tcmVwb3J0ICAgICAgICAgIEdlbmVyYXRlIGEgcmVwb3J0IGZyb20gYSBjb3VudHMgZmlsZTsgZG8gbm90IGV4ZWN1dGUKLSAgICAgICAgICAgICAgICAgICAgICBhbnkgY29kZS4gIGAtLWZpbGUnIG11c3Qgc3BlY2lmeSB0aGUgcmVzdWx0cyBmaWxlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgcmVhZCwgd2hpY2ggbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIHJ1bgotICAgICAgICAgICAgICAgICAgICAgIHdpdGggYC0tY291bnQgLS1maWxlPUZJTEUnLgotCi1Nb2RpZmllcnM6Ci0tZiwgLS1maWxlPTxmaWxlPiAgICAgRmlsZSB0byBhY2N1bXVsYXRlIGNvdW50cyBvdmVyIHNldmVyYWwgcnVucy4KLS1SLCAtLW5vLXJlcG9ydCAgICAgICBEbyBub3QgZ2VuZXJhdGUgdGhlIGNvdmVyYWdlIHJlcG9ydCBmaWxlcy4KLSAgICAgICAgICAgICAgICAgICAgICBVc2VmdWwgaWYgeW91IHdhbnQgdG8gYWNjdW11bGF0ZSBvdmVyIHNldmVyYWwgcnVucy4KLS1DLCAtLWNvdmVyZGlyPTxkaXI+ICBEaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCBmaWxlcy4gIFRoZSBjb3ZlcmFnZQotICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBmb3IgPHBhY2thZ2U+Ljxtb2R1bGU+IGlzIHdyaXR0ZW4gdG8gZmlsZQotICAgICAgICAgICAgICAgICAgICAgIDxkaXI+LzxwYWNrYWdlPi88bW9kdWxlPi5jb3Zlci4KLS1tLCAtLW1pc3NpbmcgICAgICAgICBBbm5vdGF0ZSBleGVjdXRhYmxlIGxpbmVzIHRoYXQgd2VyZSBub3QgZXhlY3V0ZWQKLSAgICAgICAgICAgICAgICAgICAgICB3aXRoICc+Pj4+Pj4gJy4KLS1zLCAtLXN1bW1hcnkgICAgICAgICBXcml0ZSBhIGJyaWVmIHN1bW1hcnkgb24gc3Rkb3V0IGZvciBlYWNoIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgICAgKENhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0LikKLS1nLCAtLXRpbWluZyAgICAgICAgICBQcmVmaXggZWFjaCBsaW5lIHdpdGggdGhlIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gc3RhcnRlZC4KLSAgICAgICAgICAgICAgICAgICAgICBPbmx5IHVzZWQgd2hpbGUgdHJhY2luZy4KLQotRmlsdGVycywgbWF5IGJlIHJlcGVhdGVkIG11bHRpcGxlIHRpbWVzOgotLS1pZ25vcmUtbW9kdWxlPTxtb2Q+IElnbm9yZSB0aGUgZ2l2ZW4gbW9kdWxlKHMpIGFuZCBpdHMgc3VibW9kdWxlcwotICAgICAgICAgICAgICAgICAgICAgIChpZiBpdCBpcyBhIHBhY2thZ2UpLiAgQWNjZXB0cyBjb21tYSBzZXBhcmF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICBsaXN0IG9mIG1vZHVsZSBuYW1lcwotLS1pZ25vcmUtZGlyPTxkaXI+ICAgIElnbm9yZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IChtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGNhbiBiZSBqb2luZWQgYnkgb3MucGF0aHNlcCkuCi0iIiIgJSBzeXMuYXJndlswXSkKLQogUFJBR01BX05PQ09WRVIgPSAiI3ByYWdtYSBOTyBDT1ZFUiIKIAogIyBTaW1wbGUgcnggdG8gZmluZCBsaW5lcyB3aXRoIG5vIGNvZGUuCkBAIC0yNjUsNyArMjIwLDEzIEBACiAKICAgICBkZWYgd3JpdGVfcmVzdWx0cyhzZWxmLCBzaG93X21pc3Npbmc9VHJ1ZSwgc3VtbWFyeT1GYWxzZSwgY292ZXJkaXI9Tm9uZSk6CiAgICAgICAgICIiIgotICAgICAgICBAcGFyYW0gY292ZXJkaXIKKyAgICAgICAgV3JpdGUgdGhlIGNvdmVyYWdlIHJlc3VsdHMuCisKKyAgICAgICAgOnBhcmFtIHNob3dfbWlzc2luZzogU2hvdyBsaW5lcyB0aGF0IGhhZCBubyBoaXRzLgorICAgICAgICA6cGFyYW0gc3VtbWFyeTogSW5jbHVkZSBjb3ZlcmFnZSBzdW1tYXJ5IHBlciBtb2R1bGUuCisgICAgICAgIDpwYXJhbSBjb3ZlcmRpcjogSWYgTm9uZSwgdGhlIHJlc3VsdHMgb2YgZWFjaCBtb2R1bGUgYXJlIHBsYWNlZCBpbiBpdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnksIG90aGVyd2lzZSBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLgogICAgICAgICAiIiIKICAgICAgICAgaWYgc2VsZi5jYWxsZWRmdW5jczoKICAgICAgICAgICAgIHByaW50KCkKQEAgLTY0NywyMTAgKzYwOCwxMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWRmdW5jcz1zZWxmLl9jYWxsZWRmdW5jcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZXJzPXNlbGYuX2NhbGxlcnMpCiAKLWRlZiBfZXJyX2V4aXQobXNnKToKLSAgICBzeXMuc3RkZXJyLndyaXRlKCIlczogJXNcbiIgJSAoc3lzLmFyZ3ZbMF0sIG1zZykpCi0gICAgc3lzLmV4aXQoMSkKK2RlZiBtYWluKCk6CiAKLWRlZiBtYWluKGFyZ3Y9Tm9uZSk6Ci0gICAgaW1wb3J0IGdldG9wdAorICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcnNpb24nLCBhY3Rpb249J3ZlcnNpb24nLCB2ZXJzaW9uPSd0cmFjZSAyLjAnKQogCi0gICAgaWYgYXJndiBpcyBOb25lOgotICAgICAgICBhcmd2ID0gc3lzLmFyZ3YKKyAgICBncnAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdNYWluIG9wdGlvbnMnLAorICAgICAgICAgICAgJ09uZSBvZiB0aGVzZSAob3IgLS1yZXBvcnQpIG11c3QgYmUgZ2l2ZW4nKQorCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLWMnLCAnLS1jb3VudCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbGluZSBpcyBleGVjdXRlZCBhbmQgd3JpdGUgJworICAgICAgICAgICAgICAgICAndGhlIGNvdW50cyB0byA8bW9kdWxlPi5jb3ZlciBmb3IgZWFjaCBtb2R1bGUgZXhlY3V0ZWQsIGluICcKKyAgICAgICAgICAgICAgICAgJ3RoZSBtb2R1bGVcJ3MgZGlyZWN0b3J5LiBTZWUgYWxzbyAtLWNvdmVyZGlyLCAtLWZpbGUsICcKKyAgICAgICAgICAgICAgICAgJy0tbm8tcmVwb3J0IGJlbG93LicpCisgICAgZ3JwLmFkZF9hcmd1bWVudCgnLXQnLCAnLS10cmFjZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdQcmludCBlYWNoIGxpbmUgdG8gc3lzLnN0ZG91dCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQnKQorICAgIGdycC5hZGRfYXJndW1lbnQoJy1sJywgJy0tbGlzdGZ1bmNzJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J0tlZXAgdHJhY2sgb2Ygd2hpY2ggZnVuY3Rpb25zIGFyZSBleGVjdXRlZCBhdCBsZWFzdCBvbmNlICcKKyAgICAgICAgICAgICAgICAgJ2FuZCB3cml0ZSB0aGUgcmVzdWx0cyB0byBzeXMuc3Rkb3V0IGFmdGVyIHRoZSBwcm9ncmFtIGV4aXRzLiAnCisgICAgICAgICAgICAgICAgICdDYW5ub3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSAtLXRyYWNlIG9yIC0tY291bnQuJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctVCcsICctLXRyYWNrY2FsbHMnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nS2VlcCB0cmFjayBvZiBjYWxsZXIvY2FsbGVkIHBhaXJzIGFuZCB3cml0ZSB0aGUgcmVzdWx0cyB0byAnCisgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0IGFmdGVyIHRoZSBwcm9ncmFtIGV4aXRzLicpCisKKyAgICBncnAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdNb2RpZmllcnMnKQorCisgICAgX2dycCA9IGdycC5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKCkKKyAgICBfZ3JwLmFkZF9hcmd1bWVudCgnLXInLCAnLS1yZXBvcnQnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nR2VuZXJhdGUgYSByZXBvcnQgZnJvbSBhIGNvdW50cyBmaWxlOyBkb2VzIG5vdCBleGVjdXRlIGFueSAnCisgICAgICAgICAgICAgICAgICdjb2RlLiAtLWZpbGUgbXVzdCBzcGVjaWZ5IHRoZSByZXN1bHRzIGZpbGUgdG8gcmVhZCwgd2hpY2ggJworICAgICAgICAgICAgICAgICAnbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIHJ1biB3aXRoIC0tY291bnQgJworICAgICAgICAgICAgICAgICAnLS1maWxlPUZJTEUnKQorICAgIF9ncnAuYWRkX2FyZ3VtZW50KCctUicsICctLW5vLXJlcG9ydCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICBoZWxwPSdEbyBub3QgZ2VuZXJhdGUgdGhlIGNvdmVyYWdlIHJlcG9ydCBmaWxlcy4gJworICAgICAgICAgICAgICAgICAnVXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY3VtdWxhdGUgb3ZlciBzZXZlcmFsIHJ1bnMuJykKKworICAgIGdycC5hZGRfYXJndW1lbnQoJy1mJywgJy0tZmlsZScsCisgICAgICAgICAgICBoZWxwPSdGaWxlIHRvIGFjY3VtdWxhdGUgY291bnRzIG92ZXIgc2V2ZXJhbCBydW5zJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctQycsICctLWNvdmVyZGlyJywKKyAgICAgICAgICAgIGhlbHA9J0RpcmVjdG9yeSB3aGVyZSB0aGUgcmVwb3J0IGZpbGVzIGdvLiBUaGUgY292ZXJhZ2UgcmVwb3J0ICcKKyAgICAgICAgICAgICAgICAgJ2ZvciA8cGFja2FnZT4uPG1vZHVsZT4gd2lsbCBiZSB3cml0dGVuIHRvIGZpbGUgJworICAgICAgICAgICAgICAgICAnPGRpcj4vPHBhY2thZ2U+Lzxtb2R1bGU+LmNvdmVyJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctbScsICctLW1pc3NpbmcnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nQW5ub3RhdGUgZXhlY3V0YWJsZSBsaW5lcyB0aGF0IHdlcmUgbm90IGV4ZWN1dGVkIHdpdGggJworICAgICAgICAgICAgICAgICAnIj4+Pj4+PiAiJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctcycsICctLXN1bW1hcnknLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgaGVscD0nV3JpdGUgYSBicmllZiBzdW1tYXJ5IGZvciBlYWNoIGZpbGUgdG8gc3lzLnN0ZG91dC4gJworICAgICAgICAgICAgICAgICAnQ2FuIG9ubHkgYmUgdXNlZCB3aXRoIC0tY291bnQgb3IgLS1yZXBvcnQnKQorICAgIGdycC5hZGRfYXJndW1lbnQoJy1nJywgJy0tdGltaW5nJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgIGhlbHA9J1ByZWZpeCBlYWNoIGxpbmUgd2l0aCB0aGUgdGltZSBzaW5jZSB0aGUgcHJvZ3JhbSBzdGFydGVkLiAnCisgICAgICAgICAgICAgICAgICdPbmx5IHVzZWQgd2hpbGUgdHJhY2luZycpCisKKyAgICBncnAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdGaWx0ZXJzJywKKyAgICAgICAgICAgICdDYW4gYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctLWlnbm9yZS1tb2R1bGUnLCBhY3Rpb249J2FwcGVuZCcsIGRlZmF1bHQ9W10sCisgICAgICAgICAgICBoZWxwPSdJZ25vcmUgdGhlIGdpdmVuIG1vZHVsZShzKSBhbmQgaXRzIHN1Ym1vZHVsZXMnCisgICAgICAgICAgICAgICAgICcoaWYgaXQgaXMgYSBwYWNrYWdlKS4gQWNjZXB0cyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiAnCisgICAgICAgICAgICAgICAgICdtb2R1bGUgbmFtZXMuJykKKyAgICBncnAuYWRkX2FyZ3VtZW50KCctLWlnbm9yZS1kaXInLCBhY3Rpb249J2FwcGVuZCcsIGRlZmF1bHQ9W10sCisgICAgICAgICAgICBoZWxwPSdJZ25vcmUgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSAnCisgICAgICAgICAgICAgICAgICcobXVsdGlwbGUgZGlyZWN0b3JpZXMgY2FuIGJlIGpvaW5lZCBieSBvcy5wYXRoc2VwKS4nKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZmlsZW5hbWUnLCBuYXJncz0nPycsCisgICAgICAgICAgICBoZWxwPSdmaWxlIHRvIHJ1biBhcyBtYWluIHByb2dyYW0nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2FyZ3VtZW50cycsIG5hcmdzPWFyZ3BhcnNlLlJFTUFJTkRFUiwKKyAgICAgICAgICAgIGhlbHA9J2FyZ3VtZW50cyB0byB0aGUgcHJvZ3JhbScpCisKKyAgICBvcHRzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgaWYgb3B0cy5pZ25vcmVfZGlyOgorICAgICAgICByZWxfcGF0aCA9ICdsaWInLCAncHl0aG9uezAubWFqb3J9LnswLm1pbm9yfScuZm9ybWF0KHN5cy52ZXJzaW9uX2luZm8pCisgICAgICAgIF9wcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLmJhc2VfcHJlZml4LCAqcmVsX3BhdGgpCisgICAgICAgIF9leGVjX3ByZWZpeCA9IG9zLnBhdGguam9pbihzeXMuYmFzZV9leGVjX3ByZWZpeCwgKnJlbF9wYXRoKQorCisgICAgZGVmIHBhcnNlX2lnbm9yZV9kaXIocyk6CisgICAgICAgIHMgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3MucGF0aC5leHBhbmR2YXJzKHMpKQorICAgICAgICBzID0gcy5yZXBsYWNlKCckcHJlZml4JywgX3ByZWZpeCkucmVwbGFjZSgnJGV4ZWNfcHJlZml4JywgX2V4ZWNfcHJlZml4KQorICAgICAgICByZXR1cm4gb3MucGF0aC5ub3JtcGF0aChzKQorCisgICAgb3B0cy5pZ25vcmVfbW9kdWxlID0gW21vZC5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIG9wdHMuaWdub3JlX21vZHVsZSBmb3IgbW9kIGluIGkuc3BsaXQoJywnKV0KKyAgICBvcHRzLmlnbm9yZV9kaXIgPSBbcGFyc2VfaWdub3JlX2RpcihzKQorICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBvcHRzLmlnbm9yZV9kaXIgZm9yIHMgaW4gaS5zcGxpdChvcy5wYXRoc2VwKV0KKworICAgIGlmIG9wdHMucmVwb3J0OgorICAgICAgICBpZiBub3Qgb3B0cy5maWxlOgorICAgICAgICAgICAgcGFyc2VyLmVycm9yKCctci8tLXJlcG9ydCByZXF1aXJlcyAtZi8tLWZpbGUnKQorICAgICAgICByZXN1bHRzID0gQ292ZXJhZ2VSZXN1bHRzKGluZmlsZT1vcHRzLmZpbGUsIG91dGZpbGU9b3B0cy5maWxlKQorICAgICAgICByZXR1cm4gcmVzdWx0cy53cml0ZV9yZXN1bHRzKG9wdHMubWlzc2luZywgb3B0cy5zdW1tYXJ5LCBvcHRzLmNvdmVyZGlyKQorCisgICAgaWYgbm90IGFueShbb3B0cy50cmFjZSwgb3B0cy5jb3VudCwgb3B0cy5saXN0ZnVuY3MsIG9wdHMudHJhY2tjYWxsc10pOgorICAgICAgICBwYXJzZXIuZXJyb3IoJ211c3Qgc3BlY2lmeSBvbmUgb2YgLS10cmFjZSwgLS1jb3VudCwgLS1yZXBvcnQsICcKKyAgICAgICAgICAgICAgICAgICAgICctLWxpc3RmdW5jcywgb3IgLS10cmFja2NhbGxzJykKKworICAgIGlmIG9wdHMubGlzdGZ1bmNzIGFuZCAob3B0cy5jb3VudCBvciBvcHRzLnRyYWNlKToKKyAgICAgICAgcGFyc2VyLmVycm9yKCdjYW5ub3Qgc3BlY2lmeSBib3RoIC0tbGlzdGZ1bmNzIGFuZCAoLS10cmFjZSBvciAtLWNvdW50KScpCisKKyAgICBpZiBvcHRzLnN1bW1hcnkgYW5kIG5vdCBvcHRzLmNvdW50OgorICAgICAgICBwYXJzZXIuZXJyb3IoJy0tc3VtbWFyeSBjYW4gb25seSBiZSB1c2VkIHdpdGggLS1jb3VudCBvciAtLXJlcG9ydCcpCisKKyAgICBpZiBvcHRzLmZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgIHBhcnNlci5lcnJvcignZmlsZW5hbWUgaXMgbWlzc2luZzogcmVxdWlyZWQgd2l0aCB0aGUgbWFpbiBvcHRpb25zJykKKworICAgIHN5cy5hcmd2ID0gb3B0cy5maWxlbmFtZSwgKm9wdHMuYXJndW1lbnRzCisgICAgc3lzLnBhdGhbMF0gPSBvcy5wYXRoLmRpcm5hbWUob3B0cy5maWxlbmFtZSkKKworICAgIHQgPSBUcmFjZShvcHRzLmNvdW50LCBvcHRzLnRyYWNlLCBjb3VudGZ1bmNzPW9wdHMubGlzdGZ1bmNzLAorICAgICAgICAgICAgICBjb3VudGNhbGxlcnM9b3B0cy50cmFja2NhbGxzLCBpZ25vcmVtb2RzPW9wdHMuaWdub3JlX21vZHVsZSwKKyAgICAgICAgICAgICAgaWdub3JlZGlycz1vcHRzLmlnbm9yZV9kaXIsIGluZmlsZT1vcHRzLmZpbGUsCisgICAgICAgICAgICAgIG91dGZpbGU9b3B0cy5maWxlLCB0aW1pbmc9b3B0cy50aW1pbmcpCiAgICAgdHJ5OgotICAgICAgICBvcHRzLCBwcm9nX2FyZ3YgPSBnZXRvcHQuZ2V0b3B0KGFyZ3ZbMTpdLCAidGNyUmY6ZDptc0M6bFRnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbHAiLCAidmVyc2lvbiIsICJ0cmFjZSIsICJjb3VudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBvcnQiLCAibm8tcmVwb3J0IiwgInN1bW1hcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZT0iLCAibWlzc2luZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmUtbW9kdWxlPSIsICJpZ25vcmUtZGlyPSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3ZlcmRpcj0iLCAibGlzdGZ1bmNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNrY2FsbHMiLCAidGltaW5nIl0pCisgICAgICAgIHdpdGggb3BlbihvcHRzLmZpbGVuYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGZwLnJlYWQoKSwgb3B0cy5maWxlbmFtZSwgJ2V4ZWMnKQorICAgICAgICAjIHRyeSB0byBlbXVsYXRlIF9fbWFpbl9fIG5hbWVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlCisgICAgICAgIGdsb2JzID0geworICAgICAgICAgICAgJ19fZmlsZV9fJzogb3B0cy5maWxlbmFtZSwKKyAgICAgICAgICAgICdfX25hbWVfXyc6ICdfX21haW5fXycsCisgICAgICAgICAgICAnX19wYWNrYWdlX18nOiBOb25lLAorICAgICAgICAgICAgJ19fY2FjaGVkX18nOiBOb25lLAorICAgICAgICB9CisgICAgICAgIHQucnVuY3R4KGNvZGUsIGdsb2JzLCBnbG9icykKKyAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6CisgICAgICAgIHN5cy5leGl0KCJDYW5ub3QgcnVuIGZpbGUgJXIgYmVjYXVzZTogJXMiICUgKHN5cy5hcmd2WzBdLCBlcnIpKQorICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICBwYXNzCiAKLSAgICBleGNlcHQgZ2V0b3B0LmVycm9yIGFzIG1zZzoKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6ICVzXG4iICUgKHN5cy5hcmd2WzBdLCBtc2cpKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJUcnkgYCVzIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAlIHN5cy5hcmd2WzBdKQotICAgICAgICBzeXMuZXhpdCgxKQorICAgIHJlc3VsdHMgPSB0LnJlc3VsdHMoKQogCi0gICAgdHJhY2UgPSAwCi0gICAgY291bnQgPSAwCi0gICAgcmVwb3J0ID0gMAotICAgIG5vX3JlcG9ydCA9IDAKLSAgICBjb3VudHNfZmlsZSA9IE5vbmUKLSAgICBtaXNzaW5nID0gMAotICAgIGlnbm9yZV9tb2R1bGVzID0gW10KLSAgICBpZ25vcmVfZGlycyA9IFtdCi0gICAgY292ZXJkaXIgPSBOb25lCi0gICAgc3VtbWFyeSA9IDAKLSAgICBsaXN0ZnVuY3MgPSBGYWxzZQotICAgIGNvdW50Y2FsbGVycyA9IEZhbHNlCi0gICAgdGltaW5nID0gRmFsc2UKLQotICAgIGZvciBvcHQsIHZhbCBpbiBvcHRzOgotICAgICAgICBpZiBvcHQgPT0gIi0taGVscCI6Ci0gICAgICAgICAgICBfdXNhZ2Uoc3lzLnN0ZG91dCkKLSAgICAgICAgICAgIHN5cy5leGl0KDApCi0KLSAgICAgICAgaWYgb3B0ID09ICItLXZlcnNpb24iOgotICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgidHJhY2UgMi4wXG4iKQotICAgICAgICAgICAgc3lzLmV4aXQoMCkKLQotICAgICAgICBpZiBvcHQgPT0gIi1UIiBvciBvcHQgPT0gIi0tdHJhY2tjYWxscyI6Ci0gICAgICAgICAgICBjb3VudGNhbGxlcnMgPSBUcnVlCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLWwiIG9yIG9wdCA9PSAiLS1saXN0ZnVuY3MiOgotICAgICAgICAgICAgbGlzdGZ1bmNzID0gVHJ1ZQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1nIiBvciBvcHQgPT0gIi0tdGltaW5nIjoKLSAgICAgICAgICAgIHRpbWluZyA9IFRydWUKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItdCIgb3Igb3B0ID09ICItLXRyYWNlIjoKLSAgICAgICAgICAgIHRyYWNlID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1jIiBvciBvcHQgPT0gIi0tY291bnQiOgotICAgICAgICAgICAgY291bnQgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLXIiIG9yIG9wdCA9PSAiLS1yZXBvcnQiOgotICAgICAgICAgICAgcmVwb3J0ID0gMQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi1SIiBvciBvcHQgPT0gIi0tbm8tcmVwb3J0IjoKLSAgICAgICAgICAgIG5vX3JlcG9ydCA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItZiIgb3Igb3B0ID09ICItLWZpbGUiOgotICAgICAgICAgICAgY291bnRzX2ZpbGUgPSB2YWwKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItbSIgb3Igb3B0ID09ICItLW1pc3NpbmciOgotICAgICAgICAgICAgbWlzc2luZyA9IDEKLSAgICAgICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICAgaWYgb3B0ID09ICItQyIgb3Igb3B0ID09ICItLWNvdmVyZGlyIjoKLSAgICAgICAgICAgIGNvdmVyZGlyID0gdmFsCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLXMiIG9yIG9wdCA9PSAiLS1zdW1tYXJ5IjoKLSAgICAgICAgICAgIHN1bW1hcnkgPSAxCi0gICAgICAgICAgICBjb250aW51ZQotCi0gICAgICAgIGlmIG9wdCA9PSAiLS1pZ25vcmUtbW9kdWxlIjoKLSAgICAgICAgICAgIGZvciBtb2QgaW4gdmFsLnNwbGl0KCIsIik6Ci0gICAgICAgICAgICAgICAgaWdub3JlX21vZHVsZXMuYXBwZW5kKG1vZC5zdHJpcCgpKQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBpZiBvcHQgPT0gIi0taWdub3JlLWRpciI6Ci0gICAgICAgICAgICBmb3IgcyBpbiB2YWwuc3BsaXQob3MucGF0aHNlcCk6Ci0gICAgICAgICAgICAgICAgcyA9IG9zLnBhdGguZXhwYW5kdmFycyhzKQotICAgICAgICAgICAgICAgICMgc2hvdWxkIEkgYWxzbyBjYWxsIGV4cGFuZHVzZXI/IChhZnRlciBhbGwsIGNvdWxkIHVzZSAkSE9NRSkKLQotICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoIiRwcmVmaXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5iYXNlX3ByZWZpeCwgImxpYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10pKQotICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoIiRleGVjX3ByZWZpeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3lzLmJhc2VfZXhlY19wcmVmaXgsICJsaWIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdKSkKLSAgICAgICAgICAgICAgICBzID0gb3MucGF0aC5ub3JtcGF0aChzKQotICAgICAgICAgICAgICAgIGlnbm9yZV9kaXJzLmFwcGVuZChzKQotICAgICAgICAgICAgY29udGludWUKLQotICAgICAgICBhc3NlcnQgMCwgIlNob3VsZCBuZXZlciBnZXQgaGVyZSIKLQotICAgIGlmIGxpc3RmdW5jcyBhbmQgKGNvdW50IG9yIHRyYWNlKToKLSAgICAgICAgX2Vycl9leGl0KCJjYW5ub3Qgc3BlY2lmeSBib3RoIC0tbGlzdGZ1bmNzIGFuZCAoLS10cmFjZSBvciAtLWNvdW50KSIpCi0KLSAgICBpZiBub3QgKGNvdW50IG9yIHRyYWNlIG9yIHJlcG9ydCBvciBsaXN0ZnVuY3Mgb3IgY291bnRjYWxsZXJzKToKLSAgICAgICAgX2Vycl9leGl0KCJtdXN0IHNwZWNpZnkgb25lIG9mIC0tdHJhY2UsIC0tY291bnQsIC0tcmVwb3J0LCAiCi0gICAgICAgICAgICAgICAgICAiLS1saXN0ZnVuY3MsIG9yIC0tdHJhY2tjYWxscyIpCi0KLSAgICBpZiByZXBvcnQgYW5kIG5vX3JlcG9ydDoKLSAgICAgICAgX2Vycl9leGl0KCJjYW5ub3Qgc3BlY2lmeSBib3RoIC0tcmVwb3J0IGFuZCAtLW5vLXJlcG9ydCIpCi0KLSAgICBpZiByZXBvcnQgYW5kIG5vdCBjb3VudHNfZmlsZToKLSAgICAgICAgX2Vycl9leGl0KCItLXJlcG9ydCByZXF1aXJlcyBhIC0tZmlsZSIpCi0KLSAgICBpZiBub19yZXBvcnQgYW5kIGxlbihwcm9nX2FyZ3YpID09IDA6Ci0gICAgICAgIF9lcnJfZXhpdCgibWlzc2luZyBuYW1lIG9mIGZpbGUgdG8gcnVuIikKLQotICAgICMgZXZlcnl0aGluZyBpcyByZWFkeQotICAgIGlmIHJlcG9ydDoKLSAgICAgICAgcmVzdWx0cyA9IENvdmVyYWdlUmVzdWx0cyhpbmZpbGU9Y291bnRzX2ZpbGUsIG91dGZpbGU9Y291bnRzX2ZpbGUpCi0gICAgICAgIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhtaXNzaW5nLCBzdW1tYXJ5PXN1bW1hcnksIGNvdmVyZGlyPWNvdmVyZGlyKQotICAgIGVsc2U6Ci0gICAgICAgIHN5cy5hcmd2ID0gcHJvZ19hcmd2Ci0gICAgICAgIHByb2duYW1lID0gcHJvZ19hcmd2WzBdCi0gICAgICAgIHN5cy5wYXRoWzBdID0gb3MucGF0aC5zcGxpdChwcm9nbmFtZSlbMF0KLQotICAgICAgICB0ID0gVHJhY2UoY291bnQsIHRyYWNlLCBjb3VudGZ1bmNzPWxpc3RmdW5jcywKLSAgICAgICAgICAgICAgICAgIGNvdW50Y2FsbGVycz1jb3VudGNhbGxlcnMsIGlnbm9yZW1vZHM9aWdub3JlX21vZHVsZXMsCi0gICAgICAgICAgICAgICAgICBpZ25vcmVkaXJzPWlnbm9yZV9kaXJzLCBpbmZpbGU9Y291bnRzX2ZpbGUsCi0gICAgICAgICAgICAgICAgICBvdXRmaWxlPWNvdW50c19maWxlLCB0aW1pbmc9dGltaW5nKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3aXRoIG9wZW4ocHJvZ25hbWUpIGFzIGZwOgotICAgICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGZwLnJlYWQoKSwgcHJvZ25hbWUsICdleGVjJykKLSAgICAgICAgICAgICMgdHJ5IHRvIGVtdWxhdGUgX19tYWluX18gbmFtZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUKLSAgICAgICAgICAgIGdsb2JzID0gewotICAgICAgICAgICAgICAgICdfX2ZpbGVfXyc6IHByb2duYW1lLAotICAgICAgICAgICAgICAgICdfX25hbWVfXyc6ICdfX21haW5fXycsCi0gICAgICAgICAgICAgICAgJ19fcGFja2FnZV9fJzogTm9uZSwKLSAgICAgICAgICAgICAgICAnX19jYWNoZWRfXyc6IE5vbmUsCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0LnJ1bmN0eChjb2RlLCBnbG9icywgZ2xvYnMpCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycjoKLSAgICAgICAgICAgIF9lcnJfZXhpdCgiQ2Fubm90IHJ1biBmaWxlICVyIGJlY2F1c2U6ICVzIiAlIChzeXMuYXJndlswXSwgZXJyKSkKLSAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6Ci0gICAgICAgICAgICBwYXNzCi0KLSAgICAgICAgcmVzdWx0cyA9IHQucmVzdWx0cygpCi0KLSAgICAgICAgaWYgbm90IG5vX3JlcG9ydDoKLSAgICAgICAgICAgIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhtaXNzaW5nLCBzdW1tYXJ5PXN1bW1hcnksIGNvdmVyZGlyPWNvdmVyZGlyKQotCi0jICBEZXByZWNhdGVkIEFQSQotZGVmIHVzYWdlKG91dGZpbGUpOgotICAgIF93YXJuKCJUaGUgdHJhY2UudXNhZ2UoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICBfdXNhZ2Uob3V0ZmlsZSkKLQotY2xhc3MgSWdub3JlKF9JZ25vcmUpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGVzPU5vbmUsIGRpcnM9Tm9uZSk6Ci0gICAgICAgIF93YXJuKCJUaGUgY2xhc3MgdHJhY2UuSWdub3JlIGlzIGRlcHJlY2F0ZWQiLAotICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgX0lnbm9yZS5fX2luaXRfXyhzZWxmLCBtb2R1bGVzLCBkaXJzKQotCi1kZWYgbW9kbmFtZShwYXRoKToKLSAgICBfd2FybigiVGhlIHRyYWNlLm1vZG5hbWUoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICByZXR1cm4gX21vZG5hbWUocGF0aCkKLQotZGVmIGZ1bGxtb2RuYW1lKHBhdGgpOgotICAgIF93YXJuKCJUaGUgdHJhY2UuZnVsbG1vZG5hbWUoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICByZXR1cm4gX2Z1bGxtb2RuYW1lKHBhdGgpCi0KLWRlZiBmaW5kX2xpbmVzX2Zyb21fY29kZShjb2RlLCBzdHJzKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZpbmRfbGluZXNfZnJvbV9jb2RlKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX2xpbmVzX2Zyb21fY29kZShjb2RlLCBzdHJzKQotCi1kZWYgZmluZF9saW5lcyhjb2RlLCBzdHJzKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZpbmRfbGluZXMoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICByZXR1cm4gX2ZpbmRfbGluZXMoY29kZSwgc3RycykKLQotZGVmIGZpbmRfc3RyaW5ncyhmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSk6Ci0gICAgX3dhcm4oIlRoZSB0cmFjZS5maW5kX3N0cmluZ3MoKSBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIiwKLSAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICByZXR1cm4gX2ZpbmRfc3RyaW5ncyhmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSkKLQotZGVmIGZpbmRfZXhlY3V0YWJsZV9saW5lbm9zKGZpbGVuYW1lKToKLSAgICBfd2FybigiVGhlIHRyYWNlLmZpbmRfZXhlY3V0YWJsZV9saW5lbm9zKCkgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCi0gICAgcmV0dXJuIF9maW5kX2V4ZWN1dGFibGVfbGluZW5vcyhmaWxlbmFtZSkKKyAgICBpZiBub3Qgb3B0cy5ub19yZXBvcnQ6CisgICAgICAgIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhvcHRzLm1pc3NpbmcsIG9wdHMuc3VtbWFyeSwgb3B0cy5jb3ZlcmRpcikKIAogaWYgX19uYW1lX189PSdfX21haW5fXyc6CiAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdHJhY2ViYWNrLnB5IGIvTGliL3RyYWNlYmFjay5weQppbmRleCBhMmViNTM5Li4zYjQ2YzBiIDEwMDY0NAotLS0gYS9MaWIvdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90cmFjZWJhY2sucHkKQEAgLTQ4NywxMCArNDg3LDkgQEAKICAgICAgICAgICAgIHNlbGYuX2xvYWRfbGluZXMoKQogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIGZyb21fZXhjZXB0aW9uKHNlbGYsIGV4YywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICBkZWYgZnJvbV9leGNlcHRpb24oY2xzLCBleGMsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICIiIkNyZWF0ZSBhIFRyYWNlYmFja0V4Y2VwdGlvbiBmcm9tIGFuIGV4Y2VwdGlvbi4iIiIKLSAgICAgICAgcmV0dXJuIFRyYWNlYmFja0V4Y2VwdGlvbigKLSAgICAgICAgICAgIHR5cGUoZXhjKSwgZXhjLCBleGMuX190cmFjZWJhY2tfXywgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICByZXR1cm4gY2xzKHR5cGUoZXhjKSwgZXhjLCBleGMuX190cmFjZWJhY2tfXywgKmFyZ3MsICoqa3dhcmdzKQogCiAgICAgZGVmIF9sb2FkX2xpbmVzKHNlbGYpOgogICAgICAgICAiIiJQcml2YXRlIEFQSS4gZm9yY2UgYWxsIGxpbmVzIGluIHRoZSBzdGFjayB0byBiZSBsb2FkZWQuIiIiCmRpZmYgLS1naXQgYS9MaWIvdHJhY2VtYWxsb2MucHkgYi9MaWIvdHJhY2VtYWxsb2MucHkKaW5kZXggNjI4OGRhOC4uNzViMzkxOCAxMDA2NDQKLS0tIGEvTGliL3RyYWNlbWFsbG9jLnB5CisrKyBiL0xpYi90cmFjZW1hbGxvYy5weQpAQCAtMjQ0LDE3ICsyNDQsMjEgQEAKICAgICBfX3Nsb3RzX18gPSAoIl90cmFjZSIsKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyYWNlKToKLSAgICAgICAgIyB0cmFjZSBpcyBhIHR1cGxlOiAoc2l6ZSwgdHJhY2ViYWNrKSwgc2VlIFRyYWNlYmFjayBjb25zdHJ1Y3RvcgotICAgICAgICAjIGZvciB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjZWJhY2sgdHVwbGUKKyAgICAgICAgIyB0cmFjZSBpcyBhIHR1cGxlOiAoZG9tYWluOiBpbnQsIHNpemU6IGludCwgdHJhY2ViYWNrOiB0dXBsZSkuCisgICAgICAgICMgU2VlIFRyYWNlYmFjayBjb25zdHJ1Y3RvciBmb3IgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2ViYWNrIHR1cGxlLgogICAgICAgICBzZWxmLl90cmFjZSA9IHRyYWNlCiAKICAgICBAcHJvcGVydHkKLSAgICBkZWYgc2l6ZShzZWxmKToKKyAgICBkZWYgZG9tYWluKHNlbGYpOgogICAgICAgICByZXR1cm4gc2VsZi5fdHJhY2VbMF0KIAogICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdHJhY2VbMV0KKworICAgIEBwcm9wZXJ0eQogICAgIGRlZiB0cmFjZWJhY2soc2VsZik6Ci0gICAgICAgIHJldHVybiBUcmFjZWJhY2soc2VsZi5fdHJhY2VbMV0pCisgICAgICAgIHJldHVybiBUcmFjZWJhY2soc2VsZi5fdHJhY2VbMl0pCiAKICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgcmV0dXJuIChzZWxmLl90cmFjZSA9PSBvdGhlci5fdHJhY2UpCkBAIC0yNjYsOCArMjcwLDggQEAKICAgICAgICAgcmV0dXJuICIlczogJXMiICUgKHNlbGYudHJhY2ViYWNrLCBfZm9ybWF0X3NpemUoc2VsZi5zaXplLCBGYWxzZSkpCiAKICAgICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgICAgIHJldHVybiAoIjxUcmFjZSBzaXplPSVzLCB0cmFjZWJhY2s9JXI+IgotICAgICAgICAgICAgICAgICUgKF9mb3JtYXRfc2l6ZShzZWxmLnNpemUsIEZhbHNlKSwgc2VsZi50cmFjZWJhY2spKQorICAgICAgICByZXR1cm4gKCI8VHJhY2UgZG9tYWluPSVzIHNpemU9JXMsIHRyYWNlYmFjaz0lcj4iCisgICAgICAgICAgICAgICAgJSAoc2VsZi5kb21haW4sIF9mb3JtYXRfc2l6ZShzZWxmLnNpemUsIEZhbHNlKSwgc2VsZi50cmFjZWJhY2spKQogCiAKIGNsYXNzIF9UcmFjZXMoU2VxdWVuY2UpOgpAQCAtMzAyLDE5ICszMDYsMjkgQEAKICAgICByZXR1cm4gZmlsZW5hbWUKIAogCi1jbGFzcyBGaWx0ZXI6CitjbGFzcyBCYXNlRmlsdGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmNsdXNpdmUpOgorICAgICAgICBzZWxmLmluY2x1c2l2ZSA9IGluY2x1c2l2ZQorCisgICAgZGVmIF9tYXRjaChzZWxmLCB0cmFjZSk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBGaWx0ZXIoQmFzZUZpbHRlcik6CiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluY2x1c2l2ZSwgZmlsZW5hbWVfcGF0dGVybiwKLSAgICAgICAgICAgICAgICAgbGluZW5vPU5vbmUsIGFsbF9mcmFtZXM9RmFsc2UpOgorICAgICAgICAgICAgICAgICBsaW5lbm89Tm9uZSwgYWxsX2ZyYW1lcz1GYWxzZSwgZG9tYWluPU5vbmUpOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKGluY2x1c2l2ZSkKICAgICAgICAgc2VsZi5pbmNsdXNpdmUgPSBpbmNsdXNpdmUKICAgICAgICAgc2VsZi5fZmlsZW5hbWVfcGF0dGVybiA9IF9ub3JtYWxpemVfZmlsZW5hbWUoZmlsZW5hbWVfcGF0dGVybikKICAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KICAgICAgICAgc2VsZi5hbGxfZnJhbWVzID0gYWxsX2ZyYW1lcworICAgICAgICBzZWxmLmRvbWFpbiA9IGRvbWFpbgogCiAgICAgQHByb3BlcnR5CiAgICAgZGVmIGZpbGVuYW1lX3BhdHRlcm4oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9maWxlbmFtZV9wYXR0ZXJuCiAKLSAgICBkZWYgX19tYXRjaF9mcmFtZShzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICBkZWYgX21hdGNoX2ZyYW1lX2ltcGwoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CiAgICAgICAgIGZpbGVuYW1lID0gX25vcm1hbGl6ZV9maWxlbmFtZShmaWxlbmFtZSkKICAgICAgICAgaWYgbm90IGZubWF0Y2guZm5tYXRjaChmaWxlbmFtZSwgc2VsZi5fZmlsZW5hbWVfcGF0dGVybik6CiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKQEAgLTMyNCwxMSArMzM4LDExIEBACiAgICAgICAgICAgICByZXR1cm4gKGxpbmVubyA9PSBzZWxmLmxpbmVubykKIAogICAgIGRlZiBfbWF0Y2hfZnJhbWUoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6Ci0gICAgICAgIHJldHVybiBzZWxmLl9fbWF0Y2hfZnJhbWUoZmlsZW5hbWUsIGxpbmVubykgXiAobm90IHNlbGYuaW5jbHVzaXZlKQorICAgICAgICByZXR1cm4gc2VsZi5fbWF0Y2hfZnJhbWVfaW1wbChmaWxlbmFtZSwgbGluZW5vKSBeIChub3Qgc2VsZi5pbmNsdXNpdmUpCiAKICAgICBkZWYgX21hdGNoX3RyYWNlYmFjayhzZWxmLCB0cmFjZWJhY2spOgogICAgICAgICBpZiBzZWxmLmFsbF9mcmFtZXM6Ci0gICAgICAgICAgICBpZiBhbnkoc2VsZi5fX21hdGNoX2ZyYW1lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICBpZiBhbnkoc2VsZi5fbWF0Y2hfZnJhbWVfaW1wbChmaWxlbmFtZSwgbGluZW5vKQogICAgICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSwgbGluZW5vIGluIHRyYWNlYmFjayk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5jbHVzaXZlCiAgICAgICAgICAgICBlbHNlOgpAQCAtMzM3LDYgKzM1MSwzMCBAQAogICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVubyA9IHRyYWNlYmFja1swXQogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21hdGNoX2ZyYW1lKGZpbGVuYW1lLCBsaW5lbm8pCiAKKyAgICBkZWYgX21hdGNoKHNlbGYsIHRyYWNlKToKKyAgICAgICAgZG9tYWluLCBzaXplLCB0cmFjZWJhY2sgPSB0cmFjZQorICAgICAgICByZXMgPSBzZWxmLl9tYXRjaF90cmFjZWJhY2sodHJhY2ViYWNrKQorICAgICAgICBpZiBzZWxmLmRvbWFpbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuaW5jbHVzaXZlOgorICAgICAgICAgICAgICAgIHJldHVybiByZXMgYW5kIChkb21haW4gPT0gc2VsZi5kb21haW4pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiByZXMgb3IgKGRvbWFpbiAhPSBzZWxmLmRvbWFpbikKKyAgICAgICAgcmV0dXJuIHJlcworCisKK2NsYXNzIERvbWFpbkZpbHRlcihCYXNlRmlsdGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5jbHVzaXZlLCBkb21haW4pOgorICAgICAgICBzdXBlcigpLl9faW5pdF9fKGluY2x1c2l2ZSkKKyAgICAgICAgc2VsZi5fZG9tYWluID0gZG9tYWluCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZG9tYWluKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZG9tYWluCisKKyAgICBkZWYgX21hdGNoKHNlbGYsIHRyYWNlKToKKyAgICAgICAgZG9tYWluLCBzaXplLCB0cmFjZWJhY2sgPSB0cmFjZQorICAgICAgICByZXR1cm4gKGRvbWFpbiA9PSBzZWxmLmRvbWFpbikgXiAobm90IHNlbGYuaW5jbHVzaXZlKQorCiAKIGNsYXNzIFNuYXBzaG90OgogICAgICIiIgpAQCAtMzY1LDEzICs0MDMsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBwaWNrbGUubG9hZChmcCkKIAogICAgIGRlZiBfZmlsdGVyX3RyYWNlKHNlbGYsIGluY2x1ZGVfZmlsdGVycywgZXhjbHVkZV9maWx0ZXJzLCB0cmFjZSk6Ci0gICAgICAgIHRyYWNlYmFjayA9IHRyYWNlWzFdCiAgICAgICAgIGlmIGluY2x1ZGVfZmlsdGVyczoKLSAgICAgICAgICAgIGlmIG5vdCBhbnkodHJhY2VfZmlsdGVyLl9tYXRjaF90cmFjZWJhY2sodHJhY2ViYWNrKQorICAgICAgICAgICAgaWYgbm90IGFueSh0cmFjZV9maWx0ZXIuX21hdGNoKHRyYWNlKQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHJhY2VfZmlsdGVyIGluIGluY2x1ZGVfZmlsdGVycyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIGlmIGV4Y2x1ZGVfZmlsdGVyczoKLSAgICAgICAgICAgIGlmIGFueShub3QgdHJhY2VfZmlsdGVyLl9tYXRjaF90cmFjZWJhY2sodHJhY2ViYWNrKQorICAgICAgICAgICAgaWYgYW55KG5vdCB0cmFjZV9maWx0ZXIuX21hdGNoKHRyYWNlKQogICAgICAgICAgICAgICAgICAgIGZvciB0cmFjZV9maWx0ZXIgaW4gZXhjbHVkZV9maWx0ZXJzKToKICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgcmV0dXJuIFRydWUKQEAgLTM3OSw4ICs0MTYsOCBAQAogICAgIGRlZiBmaWx0ZXJfdHJhY2VzKHNlbGYsIGZpbHRlcnMpOgogICAgICAgICAiIiIKICAgICAgICAgQ3JlYXRlIGEgbmV3IFNuYXBzaG90IGluc3RhbmNlIHdpdGggYSBmaWx0ZXJlZCB0cmFjZXMgc2VxdWVuY2UsIGZpbHRlcnMKLSAgICAgICAgaXMgYSBsaXN0IG9mIEZpbHRlciBpbnN0YW5jZXMuICBJZiBmaWx0ZXJzIGlzIGFuIGVtcHR5IGxpc3QsIHJldHVybiBhCi0gICAgICAgIG5ldyBTbmFwc2hvdCBpbnN0YW5jZSB3aXRoIGEgY29weSBvZiB0aGUgdHJhY2VzLgorICAgICAgICBpcyBhIGxpc3Qgb2YgRmlsdGVyIG9yIERvbWFpbkZpbHRlciBpbnN0YW5jZXMuICBJZiBmaWx0ZXJzIGlzIGFuIGVtcHR5CisgICAgICAgIGxpc3QsIHJldHVybiBhIG5ldyBTbmFwc2hvdCBpbnN0YW5jZSB3aXRoIGEgY29weSBvZiB0aGUgdHJhY2VzLgogICAgICAgICAiIiIKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZmlsdGVycywgSXRlcmFibGUpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJmaWx0ZXJzIG11c3QgYmUgYSBsaXN0IG9mIGZpbHRlcnMsIG5vdCAlcyIKQEAgLTQxMiw3ICs0NDksNyBAQAogICAgICAgICB0cmFjZWJhY2tzID0ge30KICAgICAgICAgaWYgbm90IGN1bXVsYXRpdmU6CiAgICAgICAgICAgICBmb3IgdHJhY2UgaW4gc2VsZi50cmFjZXMuX3RyYWNlczoKLSAgICAgICAgICAgICAgICBzaXplLCB0cmFjZV90cmFjZWJhY2sgPSB0cmFjZQorICAgICAgICAgICAgICAgIGRvbWFpbiwgc2l6ZSwgdHJhY2VfdHJhY2ViYWNrID0gdHJhY2UKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjayA9IHRyYWNlYmFja3NbdHJhY2VfdHJhY2ViYWNrXQogICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKQEAgLTQzMyw3ICs0NzAsNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBjdW11bGF0aXZlIHN0YXRpc3RpY3MKICAgICAgICAgICAgIGZvciB0cmFjZSBpbiBzZWxmLnRyYWNlcy5fdHJhY2VzOgotICAgICAgICAgICAgICAgIHNpemUsIHRyYWNlX3RyYWNlYmFjayA9IHRyYWNlCisgICAgICAgICAgICAgICAgZG9tYWluLCBzaXplLCB0cmFjZV90cmFjZWJhY2sgPSB0cmFjZQogICAgICAgICAgICAgICAgIGZvciBmcmFtZSBpbiB0cmFjZV90cmFjZWJhY2s6CiAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjayA9IHRyYWNlYmFja3NbZnJhbWVdCmRpZmYgLS1naXQgYS9MaWIvdHVydGxlZGVtby9fX21haW5fXy5weSBiL0xpYi90dXJ0bGVkZW1vL19fbWFpbl9fLnB5CmluZGV4IDcxMWQwYWIuLjBhNTgzMzIgMTAwNjQ0Ci0tLSBhL0xpYi90dXJ0bGVkZW1vL19fbWFpbl9fLnB5CisrKyBiL0xpYi90dXJ0bGVkZW1vL19fbWFpbl9fLnB5CkBAIC04OSwxMyArODksMTIgQEAKIGltcG9ydCBvcwogCiBmcm9tIHRraW50ZXIgaW1wb3J0ICoKLWZyb20gaWRsZWxpYi5Db2xvckRlbGVnYXRvciBpbXBvcnQgQ29sb3JEZWxlZ2F0b3IsIGNvbG9yX2NvbmZpZwotZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKLWZyb20gaWRsZWxpYi50ZXh0VmlldyBpbXBvcnQgdmlld190ZXh0Citmcm9tIGlkbGVsaWIuY29sb3JpemVyIGltcG9ydCBDb2xvckRlbGVnYXRvciwgY29sb3JfY29uZmlnCitmcm9tIGlkbGVsaWIucGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorZnJvbSBpZGxlbGliLnRleHR2aWV3IGltcG9ydCB2aWV3X3RleHQKIGZyb20gdHVydGxlZGVtbyBpbXBvcnQgX19kb2NfXyBhcyBhYm91dF90dXJ0bGVkZW1vCiAKIGltcG9ydCB0dXJ0bGUKLWltcG9ydCB0aW1lCiAKIGRlbW9fZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCiBkYXJ3aW4gPSBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicKZGlmZiAtLWdpdCBhL0xpYi90dXJ0bGVkZW1vL2J5dGVkZXNpZ24ucHkgYi9MaWIvdHVydGxlZGVtby9ieXRlZGVzaWduLnB5CmluZGV4IDY0YjFkN2QuLmIzYjA5NWIgMTAwNzU1Ci0tLSBhL0xpYi90dXJ0bGVkZW1vL2J5dGVkZXNpZ24ucHkKKysrIGIvTGliL3R1cnRsZWRlbW8vYnl0ZWRlc2lnbi5weQpAQCAtMjIsNyArMjIsNiBAQAogbW9kZSBhcyBmYXN0IGFzIHBvc3NpYmxlLgogIiIiCiAKLWltcG9ydCBtYXRoCiBmcm9tIHR1cnRsZSBpbXBvcnQgVHVydGxlLCBtYWlubG9vcAogZnJvbSB0aW1lIGltcG9ydCBjbG9jawogCmRpZmYgLS1naXQgYS9MaWIvdHVydGxlZGVtby9wbGFuZXRfYW5kX21vb24ucHkgYi9MaWIvdHVydGxlZGVtby9wbGFuZXRfYW5kX21vb24ucHkKaW5kZXggMjZhYmZkYi4uMDIxZmY5OSAxMDA3NTUKLS0tIGEvTGliL3R1cnRsZWRlbW8vcGxhbmV0X2FuZF9tb29uLnB5CisrKyBiL0xpYi90dXJ0bGVkZW1vL3BsYW5ldF9hbmRfbW9vbi5weQpAQCAtMTgsNyArMTgsNiBAQAogCiAiIiIKIGZyb20gdHVydGxlIGltcG9ydCBTaGFwZSwgVHVydGxlLCBtYWlubG9vcCwgVmVjMkQgYXMgVmVjCi1mcm9tIHRpbWUgaW1wb3J0IHNsZWVwCiAKIEcgPSA4CiAKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC9tb2NrLnB5IGIvTGliL3VuaXR0ZXN0L21vY2sucHkKaW5kZXggN2YzMGIyOC4uNGY5MWM0NCAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L21vY2sucHkKKysrIGIvTGliL3VuaXR0ZXN0L21vY2sucHkKQEAgLTUyMyw3ICs1MjMsNyBAQAogICAgIHNpZGVfZWZmZWN0ID0gcHJvcGVydHkoX19nZXRfc2lkZV9lZmZlY3QsIF9fc2V0X3NpZGVfZWZmZWN0KQogCiAKLSAgICBkZWYgcmVzZXRfbW9jayhzZWxmLCB2aXNpdGVkPU5vbmUpOgorICAgIGRlZiByZXNldF9tb2NrKHNlbGYsICB2aXNpdGVkPU5vbmUsKiwgcmV0dXJuX3ZhbHVlPUZhbHNlLCBzaWRlX2VmZmVjdD1GYWxzZSk6CiAgICAgICAgICJSZXN0b3JlIHRoZSBtb2NrIG9iamVjdCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4iCiAgICAgICAgIGlmIHZpc2l0ZWQgaXMgTm9uZToKICAgICAgICAgICAgIHZpc2l0ZWQgPSBbXQpAQCAtNTM4LDYgKzUzOCwxMSBAQAogICAgICAgICBzZWxmLmNhbGxfYXJnc19saXN0ID0gX0NhbGxMaXN0KCkKICAgICAgICAgc2VsZi5tZXRob2RfY2FsbHMgPSBfQ2FsbExpc3QoKQogCisgICAgICAgIGlmIHJldHVybl92YWx1ZToKKyAgICAgICAgICAgIHNlbGYuX21vY2tfcmV0dXJuX3ZhbHVlID0gREVGQVVMVAorICAgICAgICBpZiBzaWRlX2VmZmVjdDoKKyAgICAgICAgICAgIHNlbGYuX21vY2tfc2lkZV9lZmZlY3QgPSBOb25lCisKICAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuX21vY2tfY2hpbGRyZW4udmFsdWVzKCk6CiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNoaWxkLCBfU3BlY1N0YXRlKToKICAgICAgICAgICAgICAgICBjb250aW51ZQpAQCAtNzcyLDYgKzc3NywyNCBAQAogICAgICAgICAgICAgICAgICAgIChzZWxmLl9tb2NrX25hbWUgb3IgJ21vY2snLCBzZWxmLmNhbGxfY291bnQpKQogICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQogCisgICAgZGVmIGFzc2VydF9jYWxsZWQoX21vY2tfc2VsZik6CisgICAgICAgICIiImFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgYXQgbGVhc3Qgb25jZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZiA9IF9tb2NrX3NlbGYKKyAgICAgICAgaWYgc2VsZi5jYWxsX2NvdW50ID09IDA6CisgICAgICAgICAgICBtc2cgPSAoIkV4cGVjdGVkICclcycgdG8gaGF2ZSBiZWVuIGNhbGxlZC4iICUKKyAgICAgICAgICAgICAgICAgICBzZWxmLl9tb2NrX25hbWUgb3IgJ21vY2snKQorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobXNnKQorCisgICAgZGVmIGFzc2VydF9jYWxsZWRfb25jZShfbW9ja19zZWxmKToKKyAgICAgICAgIiIiYXNzZXJ0IHRoYXQgdGhlIG1vY2sgd2FzIGNhbGxlZCBvbmx5IG9uY2UuCisgICAgICAgICIiIgorICAgICAgICBzZWxmID0gX21vY2tfc2VsZgorICAgICAgICBpZiBub3Qgc2VsZi5jYWxsX2NvdW50ID09IDE6CisgICAgICAgICAgICBtc2cgPSAoIkV4cGVjdGVkICclcycgdG8gaGF2ZSBiZWVuIGNhbGxlZCBvbmNlLiBDYWxsZWQgJXMgdGltZXMuIiAlCisgICAgICAgICAgICAgICAgICAgKHNlbGYuX21vY2tfbmFtZSBvciAnbW9jaycsIHNlbGYuY2FsbF9jb3VudCkpCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcihtc2cpCisKICAgICBkZWYgYXNzZXJ0X2NhbGxlZF93aXRoKF9tb2NrX3NlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICIiImFzc2VydCB0aGF0IHRoZSBtb2NrIHdhcyBjYWxsZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4KIApAQCAtODIwLDcgKzg0Myw3IEBACiAgICAgICAgICAgICBpZiBleHBlY3RlZCBub3QgaW4gYWxsX2NhbGxzOgogICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAnQ2FsbHMgbm90IGZvdW5kLlxuRXhwZWN0ZWQ6ICVyXG4nCi0gICAgICAgICAgICAgICAgICAgICdBY3R1YWw6ICVyJyAlIChjYWxscywgc2VsZi5tb2NrX2NhbGxzKQorICAgICAgICAgICAgICAgICAgICAnQWN0dWFsOiAlcicgJSAoX0NhbGxMaXN0KGNhbGxzKSwgc2VsZi5tb2NrX2NhbGxzKQogICAgICAgICAgICAgICAgICkgZnJvbSBjYXVzZQogICAgICAgICAgICAgcmV0dXJuCiAKZGlmZiAtLWdpdCBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3N1cHBvcnQucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay9zdXBwb3J0LnB5CmluZGV4IGY0NzM4NzkuLjIwNTQzMWEgMTAwNjQ0Ci0tLSBhL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3N1cHBvcnQucHkKKysrIGIvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svc3VwcG9ydC5weQpAQCAtMSw1ICsxLDMgQEAKLWltcG9ydCBzeXMKLQogZGVmIGlzX2luc3RhbmNlKG9iaiwga2xhc3MpOgogICAgICIiIlZlcnNpb24gb2YgaXNfaW5zdGFuY2UgdGhhdCBkb2Vzbid0IGFjY2VzcyBfX2NsYXNzX18iIiIKICAgICByZXR1cm4gaXNzdWJjbGFzcyh0eXBlKG9iaiksIGtsYXNzKQpkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1hZ2ljbWV0aG9kcy5weSBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RtYWdpY21ldGhvZHMucHkKaW5kZXggYmI5Yjk1Ni4uMjQ1NjliNSAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1hZ2ljbWV0aG9kcy5weQorKysgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bWFnaWNtZXRob2RzLnB5CkBAIC0xLDUgKzEsNCBAQAogaW1wb3J0IHVuaXR0ZXN0Ci1pbXBvcnQgaW5zcGVjdAogaW1wb3J0IHN5cwogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCBNb2NrLCBNYWdpY01vY2ssIF9tYWdpY3MKIApkaWZmIC0tZ2l0IGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdG1vY2sucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bW9jay5weQppbmRleCA1ZjgyYjgyLi5iMDdhN2NjIDEwMDY0NAotLS0gYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bW9jay5weQorKysgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0bW9jay5weQpAQCAtMTIzOSw2ICsxMjM5LDI3IEBACiAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgogICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfbm90X2NhbGxlZCgpCiAKKyAgICBkZWYgdGVzdF9hc3NlcnRfY2FsbGVkKHNlbGYpOgorICAgICAgICBtID0gTW9jaygpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkKCkKKyAgICAgICAgbS5oZWxsbygpCisgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZCgpCisKKyAgICAgICAgbS5oZWxsbygpCisgICAgICAgIG0uaGVsbG8uYXNzZXJ0X2NhbGxlZCgpCisKKyAgICBkZWYgdGVzdF9hc3NlcnRfY2FsbGVkX29uY2Uoc2VsZik6CisgICAgICAgIG0gPSBNb2NrKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvcik6CisgICAgICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWRfb25jZSgpCisgICAgICAgIG0uaGVsbG8oKQorICAgICAgICBtLmhlbGxvLmFzc2VydF9jYWxsZWRfb25jZSgpCisKKyAgICAgICAgbS5oZWxsbygpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgbS5oZWxsby5hc3NlcnRfY2FsbGVkX29uY2UoKQorCiAgICAgI0lzc3VlMjEyNTYgcHJpbnRvdXQgb2Yga2V5d29yZCBhcmdzIHNob3VsZCBiZSBpbiBkZXRlcm1pbmlzdGljIG9yZGVyCiAgICAgZGVmIHRlc3Rfc29ydGVkX2NhbGxfc2lnbmF0dXJlKHNlbGYpOgogICAgICAgICBtID0gTW9jaygpCkBAIC0xMjU2LDYgKzEyNzcsMjQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLm1ldGhvZF9jYWxsc1swXSwgYykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLm1ldGhvZF9jYWxsc1sxXSwgaSkKIAorICAgIGRlZiB0ZXN0X3Jlc2V0X3JldHVybl9zaWRlZWZmZWN0KHNlbGYpOgorICAgICAgICBtID0gTW9jayhyZXR1cm5fdmFsdWU9MTAsIHNpZGVfZWZmZWN0PVsyLDNdKQorICAgICAgICBtLnJlc2V0X21vY2socmV0dXJuX3ZhbHVlPVRydWUsIHNpZGVfZWZmZWN0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtLnJldHVybl92YWx1ZSwgTW9jaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNpZGVfZWZmZWN0LCBOb25lKQorCisgICAgZGVmIHRlc3RfcmVzZXRfcmV0dXJuKHNlbGYpOgorICAgICAgICBtID0gTW9jayhyZXR1cm5fdmFsdWU9MTAsIHNpZGVfZWZmZWN0PVsyLDNdKQorICAgICAgICBtLnJlc2V0X21vY2socmV0dXJuX3ZhbHVlPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtLnJldHVybl92YWx1ZSwgTW9jaykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChtLnNpZGVfZWZmZWN0LCBOb25lKQorCisgICAgZGVmIHRlc3RfcmVzZXRfc2lkZWVmZmVjdChzZWxmKToKKyAgICAgICAgbSA9IE1vY2socmV0dXJuX3ZhbHVlPTEwLCBzaWRlX2VmZmVjdD1bMiwzXSkKKyAgICAgICAgbS5yZXNldF9tb2NrKHNpZGVfZWZmZWN0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZXR1cm5fdmFsdWUsIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uc2lkZV9lZmZlY3QsIE5vbmUpCisKICAgICBkZWYgdGVzdF9tb2NrX2FkZF9zcGVjKHNlbGYpOgogICAgICAgICBjbGFzcyBfT25lKG9iamVjdCk6CiAgICAgICAgICAgICBvbmUgPSAxCmRpZmYgLS1naXQgYS9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0cGF0Y2gucHkgYi9MaWIvdW5pdHRlc3QvdGVzdC90ZXN0bW9jay90ZXN0cGF0Y2gucHkKaW5kZXggZGZjZTM2OS4uMmUwYzA4ZiAxMDA2NDQKLS0tIGEvTGliL3VuaXR0ZXN0L3Rlc3QvdGVzdG1vY2svdGVzdHBhdGNoLnB5CisrKyBiL0xpYi91bml0dGVzdC90ZXN0L3Rlc3Rtb2NrL3Rlc3RwYXRjaC5weQpAQCAtMTAsOSArMTAsOSBAQAogZnJvbSB1bml0dGVzdC50ZXN0LnRlc3Rtb2NrLnN1cHBvcnQgaW1wb3J0IFNvbWVDbGFzcywgaXNfaW5zdGFuY2UKIAogZnJvbSB1bml0dGVzdC5tb2NrIGltcG9ydCAoCi0gICAgTm9uQ2FsbGFibGVNb2NrLCBDYWxsYWJsZU1peGluLCBwYXRjaCwgc2VudGluZWwsCisgICAgTm9uQ2FsbGFibGVNb2NrLCBDYWxsYWJsZU1peGluLCBzZW50aW5lbCwKICAgICBNYWdpY01vY2ssIE1vY2ssIE5vbkNhbGxhYmxlTWFnaWNNb2NrLCBwYXRjaCwgX3BhdGNoLAotICAgIERFRkFVTFQsIGNhbGwsIF9nZXRfdGFyZ2V0LCBfcGF0Y2gKKyAgICBERUZBVUxULCBjYWxsLCBfZ2V0X3RhcmdldAogKQogCiAKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIvcGFyc2UucHkgYi9MaWIvdXJsbGliL3BhcnNlLnB5CmluZGV4IDRkN2ZjZWMuLjk5YTY5NzcgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIvcGFyc2UucHkKKysrIGIvTGliL3VybGxpYi9wYXJzZS5weQpAQCAtMTU2LDkgKzE1Niw4IEBACiAgICAgICAgIHBvcnQgPSBzZWxmLl9ob3N0aW5mb1sxXQogICAgICAgICBpZiBwb3J0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgcG9ydCA9IGludChwb3J0LCAxMCkKLSAgICAgICAgICAgICMgUmV0dXJuIE5vbmUgb24gYW4gaWxsZWdhbCBwb3J0CiAgICAgICAgICAgICBpZiBub3QgKCAwIDw9IHBvcnQgPD0gNjU1MzUpOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUG9ydCBvdXQgb2YgcmFuZ2UgMC02NTUzNSIpCiAgICAgICAgIHJldHVybiBwb3J0CiAKIApAQCAtMjI1LDggKzIyNCw3MSBAQAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQogCiBfRGVmcmFnUmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoJ0RlZnJhZ1Jlc3VsdCcsICd1cmwgZnJhZ21lbnQnKQotX1NwbGl0UmVzdWx0QmFzZSA9IG5hbWVkdHVwbGUoJ1NwbGl0UmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBxdWVyeSBmcmFnbWVudCcpCi1fUGFyc2VSZXN1bHRCYXNlID0gbmFtZWR0dXBsZSgnUGFyc2VSZXN1bHQnLCAnc2NoZW1lIG5ldGxvYyBwYXRoIHBhcmFtcyBxdWVyeSBmcmFnbWVudCcpCitfU3BsaXRSZXN1bHRCYXNlID0gbmFtZWR0dXBsZSgKKyAgICAnU3BsaXRSZXN1bHQnLCAnc2NoZW1lIG5ldGxvYyBwYXRoIHF1ZXJ5IGZyYWdtZW50JykKK19QYXJzZVJlc3VsdEJhc2UgPSBuYW1lZHR1cGxlKAorICAgICdQYXJzZVJlc3VsdCcsICdzY2hlbWUgbmV0bG9jIHBhdGggcGFyYW1zIHF1ZXJ5IGZyYWdtZW50JykKKworX0RlZnJhZ1Jlc3VsdEJhc2UuX19kb2NfXyA9ICIiIgorRGVmcmFnUmVzdWx0KHVybCwgZnJhZ21lbnQpCisKK0EgMi10dXBsZSB0aGF0IGNvbnRhaW5zIHRoZSB1cmwgd2l0aG91dCBmcmFnbWVudCBpZGVudGlmaWVyIGFuZCB0aGUgZnJhZ21lbnQKK2lkZW50aWZpZXIgYXMgYSBzZXBhcmF0ZSBhcmd1bWVudC4KKyIiIgorCitfRGVmcmFnUmVzdWx0QmFzZS51cmwuX19kb2NfXyA9ICIiIlRoZSBVUkwgd2l0aCBubyBmcmFnbWVudCBpZGVudGlmaWVyLiIiIgorCitfRGVmcmFnUmVzdWx0QmFzZS5mcmFnbWVudC5fX2RvY19fID0gIiIiCitGcmFnbWVudCBpZGVudGlmaWVyIHNlcGFyYXRlZCBmcm9tIFVSTCwgdGhhdCBhbGxvd3MgaW5kaXJlY3QgaWRlbnRpZmljYXRpb24gb2YgYQorc2Vjb25kYXJ5IHJlc291cmNlIGJ5IHJlZmVyZW5jZSB0byBhIHByaW1hcnkgcmVzb3VyY2UgYW5kIGFkZGl0aW9uYWwgaWRlbnRpZnlpbmcKK2luZm9ybWF0aW9uLgorIiIiCisKK19TcGxpdFJlc3VsdEJhc2UuX19kb2NfXyA9ICIiIgorU3BsaXRSZXN1bHQoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkKKworQSA1LXR1cGxlIHRoYXQgY29udGFpbnMgdGhlIGRpZmZlcmVudCBjb21wb25lbnRzIG9mIGEgVVJMLiBTaW1pbGFyIHRvCitQYXJzZVJlc3VsdCwgYnV0IGRvZXMgbm90IHNwbGl0IHBhcmFtcy4KKyIiIgorCitfU3BsaXRSZXN1bHRCYXNlLnNjaGVtZS5fX2RvY19fID0gIiIiU3BlY2lmaWVzIFVSTCBzY2hlbWUgZm9yIHRoZSByZXF1ZXN0LiIiIgorCitfU3BsaXRSZXN1bHRCYXNlLm5ldGxvYy5fX2RvY19fID0gIiIiCitOZXR3b3JrIGxvY2F0aW9uIHdoZXJlIHRoZSByZXF1ZXN0IGlzIG1hZGUgdG8uCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5wYXRoLl9fZG9jX18gPSAiIiIKK1RoZSBoaWVyYXJjaGljYWwgcGF0aCwgc3VjaCBhcyB0aGUgcGF0aCB0byBhIGZpbGUgdG8gZG93bmxvYWQuCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5xdWVyeS5fX2RvY19fID0gIiIiCitUaGUgcXVlcnkgY29tcG9uZW50LCB0aGF0IGNvbnRhaW5zIG5vbi1oaWVyYXJjaGljYWwgZGF0YSwgdGhhdCBhbG9uZyB3aXRoIGRhdGEKK2luIHBhdGggY29tcG9uZW50LCBpZGVudGlmaWVzIGEgcmVzb3VyY2UgaW4gdGhlIHNjb3BlIG9mIFVSSSdzIHNjaGVtZSBhbmQKK25ldHdvcmsgbG9jYXRpb24uCisiIiIKKworX1NwbGl0UmVzdWx0QmFzZS5mcmFnbWVudC5fX2RvY19fID0gIiIiCitGcmFnbWVudCBpZGVudGlmaWVyLCB0aGF0IGFsbG93cyBpbmRpcmVjdCBpZGVudGlmaWNhdGlvbiBvZiBhIHNlY29uZGFyeSByZXNvdXJjZQorYnkgcmVmZXJlbmNlIHRvIGEgcHJpbWFyeSByZXNvdXJjZSBhbmQgYWRkaXRpb25hbCBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4KKyIiIgorCitfUGFyc2VSZXN1bHRCYXNlLl9fZG9jX18gPSAiIiIKK1BhcnNlUmVzdWx0KHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsICBxdWVyeSwgZnJhZ21lbnQpCisKK0EgNi10dXBsZSB0aGF0IGNvbnRhaW5zIGNvbXBvbmVudHMgb2YgYSBwYXJzZWQgVVJMLgorIiIiCisKK19QYXJzZVJlc3VsdEJhc2Uuc2NoZW1lLl9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLnNjaGVtZS5fX2RvY19fCitfUGFyc2VSZXN1bHRCYXNlLm5ldGxvYy5fX2RvY19fID0gX1NwbGl0UmVzdWx0QmFzZS5uZXRsb2MuX19kb2NfXworX1BhcnNlUmVzdWx0QmFzZS5wYXRoLl9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLnBhdGguX19kb2NfXworX1BhcnNlUmVzdWx0QmFzZS5wYXJhbXMuX19kb2NfXyA9ICIiIgorUGFyYW1ldGVycyBmb3IgbGFzdCBwYXRoIGVsZW1lbnQgdXNlZCB0byBkZXJlZmVyZW5jZSB0aGUgVVJJIGluIG9yZGVyIHRvIHByb3ZpZGUKK2FjY2VzcyB0byBwZXJmb3JtIHNvbWUgb3BlcmF0aW9uIG9uIHRoZSByZXNvdXJjZS4KKyIiIgorCitfUGFyc2VSZXN1bHRCYXNlLnF1ZXJ5Ll9fZG9jX18gPSBfU3BsaXRSZXN1bHRCYXNlLnF1ZXJ5Ll9fZG9jX18KK19QYXJzZVJlc3VsdEJhc2UuZnJhZ21lbnQuX19kb2NfXyA9IF9TcGxpdFJlc3VsdEJhc2UuZnJhZ21lbnQuX19kb2NfXworCiAKICMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbGlhcyBfTmV0bG9jUmVzdWx0TWl4aW5TdHIKICMgUmVzdWx0QmFzZSBpcyBubyBsb25nZXIgcGFydCBvZiB0aGUgZG9jdW1lbnRlZCBBUEksIGJ1dCBpdCBpcwpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYi9yZXF1ZXN0LnB5IGIvTGliL3VybGxpYi9yZXF1ZXN0LnB5CmluZGV4IDE3MzFmZTMuLjY3ZTczZjkgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIvcmVxdWVzdC5weQorKysgYi9MaWIvdXJsbGliL3JlcXVlc3QucHkKQEAgLTEzNCwxMSArMTM0LDc2IEBACiBdCiAKICMgdXNlZCBpbiBVc2VyLUFnZW50IGhlYWRlciBzZW50Ci1fX3ZlcnNpb25fXyA9IHN5cy52ZXJzaW9uWzozXQorX192ZXJzaW9uX18gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIAogX29wZW5lciA9IE5vbmUKIGRlZiB1cmxvcGVuKHVybCwgZGF0YT1Ob25lLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICosIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSwgY2FkZWZhdWx0PUZhbHNlLCBjb250ZXh0PU5vbmUpOgorICAgICcnJ09wZW4gdGhlIFVSTCB1cmwsIHdoaWNoIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBSZXF1ZXN0IG9iamVjdC4KKworICAgICpkYXRhKiBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IHNwZWNpZnlpbmcgYWRkaXRpb25hbCBkYXRhIHRvIGJlIHNlbnQgdG8gdGhlCisgICAgc2VydmVyLCBvciBOb25lIGlmIG5vIHN1Y2ggZGF0YSBpcyBuZWVkZWQuIGRhdGEgbWF5IGFsc28gYmUgYW4gaXRlcmFibGUKKyAgICBvYmplY3QgYW5kIGluIHRoYXQgY2FzZSBDb250ZW50LUxlbmd0aCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUKKyAgICBoZWFkZXJzLiBDdXJyZW50bHkgSFRUUCByZXF1ZXN0cyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHVzZSBkYXRhOyB0aGUgSFRUUAorICAgIHJlcXVlc3Qgd2lsbCBiZSBhIFBPU1QgaW5zdGVhZCBvZiBhIEdFVCB3aGVuIHRoZSBkYXRhIHBhcmFtZXRlciBpcworICAgIHByb3ZpZGVkLgorCisgICAgKmRhdGEqIHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUgc3RhbmRhcmQgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkCisgICAgZm9ybWF0LiBUaGUgdXJsbGliLnBhcnNlLnVybGVuY29kZSgpIGZ1bmN0aW9uIHRha2VzIGEgbWFwcGluZyBvciBzZXF1ZW5jZQorICAgIG9mIDItdHVwbGVzIGFuZCByZXR1cm5zIGFuIEFTQ0lJIHRleHQgc3RyaW5nIGluIHRoaXMgZm9ybWF0LiBJdCBzaG91bGQgYmUKKyAgICBlbmNvZGVkIHRvIGJ5dGVzIGJlZm9yZSBiZWluZyB1c2VkIGFzIHRoZSBkYXRhIHBhcmFtZXRlci4KKworICAgIHVybGxpYi5yZXF1ZXN0IG1vZHVsZSB1c2VzIEhUVFAvMS4xIGFuZCBpbmNsdWRlcyBhICJDb25uZWN0aW9uOmNsb3NlIgorICAgIGhlYWRlciBpbiBpdHMgSFRUUCByZXF1ZXN0cy4KKworICAgIFRoZSBvcHRpb25hbCAqdGltZW91dCogcGFyYW1ldGVyIHNwZWNpZmllcyBhIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IKKyAgICBibG9ja2luZyBvcGVyYXRpb25zIGxpa2UgdGhlIGNvbm5lY3Rpb24gYXR0ZW1wdCAoaWYgbm90IHNwZWNpZmllZCwgdGhlCisgICAgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBzZXR0aW5nIHdpbGwgYmUgdXNlZCkuIFRoaXMgb25seSB3b3JrcyBmb3IgSFRUUCwKKyAgICBIVFRQUyBhbmQgRlRQIGNvbm5lY3Rpb25zLgorCisgICAgSWYgKmNvbnRleHQqIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBhIHNzbC5TU0xDb250ZXh0IGluc3RhbmNlIGRlc2NyaWJpbmcKKyAgICB0aGUgdmFyaW91cyBTU0wgb3B0aW9ucy4gU2VlIEhUVFBTQ29ubmVjdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgVGhlIG9wdGlvbmFsICpjYWZpbGUqIGFuZCAqY2FwYXRoKiBwYXJhbWV0ZXJzIHNwZWNpZnkgYSBzZXQgb2YgdHJ1c3RlZCBDQQorICAgIGNlcnRpZmljYXRlcyBmb3IgSFRUUFMgcmVxdWVzdHMuIGNhZmlsZSBzaG91bGQgcG9pbnQgdG8gYSBzaW5nbGUgZmlsZQorICAgIGNvbnRhaW5pbmcgYSBidW5kbGUgb2YgQ0EgY2VydGlmaWNhdGVzLCB3aGVyZWFzIGNhcGF0aCBzaG91bGQgcG9pbnQgdG8gYQorICAgIGRpcmVjdG9yeSBvZiBoYXNoZWQgY2VydGlmaWNhdGUgZmlsZXMuIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluCisgICAgc3NsLlNTTENvbnRleHQubG9hZF92ZXJpZnlfbG9jYXRpb25zKCkuCisKKyAgICBUaGUgKmNhZGVmYXVsdCogcGFyYW1ldGVyIGlzIGlnbm9yZWQuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIG9iamVjdCB3aGljaCBjYW4gd29yayBhcyBhIGNvbnRleHQKKyAgICBtYW5hZ2VyIGFuZCBoYXMgbWV0aG9kcyBzdWNoIGFzCisKKyAgICAqIGdldHVybCgpIC0gcmV0dXJuIHRoZSBVUkwgb2YgdGhlIHJlc291cmNlIHJldHJpZXZlZCwgY29tbW9ubHkgdXNlZCB0bworICAgICAgZGV0ZXJtaW5lIGlmIGEgcmVkaXJlY3Qgd2FzIGZvbGxvd2VkCisKKyAgICAqIGluZm8oKSAtIHJldHVybiB0aGUgbWV0YS1pbmZvcm1hdGlvbiBvZiB0aGUgcGFnZSwgc3VjaCBhcyBoZWFkZXJzLCBpbiB0aGUKKyAgICAgIGZvcm0gb2YgYW4gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygpIGluc3RhbmNlIChzZWUgUXVpY2sgUmVmZXJlbmNlIHRvCisgICAgICBIVFRQIEhlYWRlcnMpCisKKyAgICAqIGdldGNvZGUoKSAtIHJldHVybiB0aGUgSFRUUCBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UuICBSYWlzZXMgVVJMRXJyb3IKKyAgICAgIG9uIGVycm9ycy4KKworICAgIEZvciBIVFRQIGFuZCBIVFRQUyBVUkxzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBodHRwLmNsaWVudC5IVFRQUmVzcG9uc2UKKyAgICBvYmplY3Qgc2xpZ2h0bHkgbW9kaWZpZWQuIEluIGFkZGl0aW9uIHRvIHRoZSB0aHJlZSBuZXcgbWV0aG9kcyBhYm92ZSwgdGhlCisgICAgbXNnIGF0dHJpYnV0ZSBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgcmVhc29uIGF0dHJpYnV0ZSAtLS0KKyAgICB0aGUgcmVhc29uIHBocmFzZSByZXR1cm5lZCBieSB0aGUgc2VydmVyIC0tLSBpbnN0ZWFkIG9mIHRoZSByZXNwb25zZQorICAgIGhlYWRlcnMgYXMgaXQgaXMgc3BlY2lmaWVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBIVFRQUmVzcG9uc2UuCisKKyAgICBGb3IgRlRQLCBmaWxlLCBhbmQgZGF0YSBVUkxzIGFuZCByZXF1ZXN0cyBleHBsaWNpdGx5IGhhbmRsZWQgYnkgbGVnYWN5CisgICAgVVJMb3BlbmVyIGFuZCBGYW5jeVVSTG9wZW5lciBjbGFzc2VzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYQorICAgIHVybGxpYi5yZXNwb25zZS5hZGRpbmZvdXJsIG9iamVjdC4KKworICAgIE5vdGUgdGhhdCBOb25lIG1heSBiZSByZXR1cm5lZCBpZiBubyBoYW5kbGVyIGhhbmRsZXMgdGhlIHJlcXVlc3QgKHRob3VnaAorICAgIHRoZSBkZWZhdWx0IGluc3RhbGxlZCBnbG9iYWwgT3BlbmVyRGlyZWN0b3IgdXNlcyBVbmtub3duSGFuZGxlciB0byBlbnN1cmUKKyAgICB0aGlzIG5ldmVyIGhhcHBlbnMpLgorCisgICAgSW4gYWRkaXRpb24sIGlmIHByb3h5IHNldHRpbmdzIGFyZSBkZXRlY3RlZCAoZm9yIGV4YW1wbGUsIHdoZW4gYSAqX3Byb3h5CisgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSBodHRwX3Byb3h5IGlzIHNldCksIFByb3h5SGFuZGxlciBpcyBkZWZhdWx0CisgICAgaW5zdGFsbGVkIGFuZCBtYWtlcyBzdXJlIHRoZSByZXF1ZXN0cyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSBwcm94eS4KKworICAgICcnJwogICAgIGdsb2JhbCBfb3BlbmVyCiAgICAgaWYgY2FmaWxlIG9yIGNhcGF0aCBvciBjYWRlZmF1bHQ6CiAgICAgICAgIGlmIGNvbnRleHQgaXMgbm90IE5vbmU6CmRpZmYgLS1naXQgYS9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5IGIvTGliL3VybGxpYi9yb2JvdHBhcnNlci5weQppbmRleCA4YjY5ZmQ5Li44NWFkZDE2IDEwMDY0NAotLS0gYS9MaWIvdXJsbGliL3JvYm90cGFyc2VyLnB5CisrKyBiL0xpYi91cmxsaWIvcm9ib3RwYXJzZXIucHkKQEAgLTEwLDcgKzEwLDkgQEAKICAgICBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcvbm9yb2JvdHMtcmZjLnR4dAogIiIiCiAKLWltcG9ydCB1cmxsaWIucGFyc2UsIHVybGxpYi5yZXF1ZXN0CitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCB1cmxsaWIucGFyc2UKK2ltcG9ydCB1cmxsaWIucmVxdWVzdAogCiBfX2FsbF9fID0gWyJSb2JvdEZpbGVQYXJzZXIiXQogCkBAIC0xMjAsMTAgKzEyMiwyOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucnVsZWxpbmVzLmFwcGVuZChSdWxlTGluZShsaW5lWzFdLCBUcnVlKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgorICAgICAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAiY3Jhd2wtZGVsYXkiOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWZvcmUgdHJ5aW5nIHRvIGNvbnZlcnQgdG8gaW50IHdlIG5lZWQgdG8gbWFrZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBzdXJlIHRoYXQgcm9ib3RzLnR4dCBoYXMgdmFsaWQgc3ludGF4IG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCB3aWxsIGNyYXNoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lWzFdLnN0cmlwKCkuaXNkaWdpdCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRlbGF5ID0gaW50KGxpbmVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gInJlcXVlc3QtcmF0ZSI6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXRlICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJzID0gbGluZVsxXS5zcGxpdCgnLycpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGFsbCB2YWx1ZXMgYXJlIHNhbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4obnVtYmVycykgPT0gMiBhbmQgbnVtYmVyc1swXS5zdHJpcCgpLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBudW1iZXJzWzFdLnN0cmlwKCkuaXNkaWdpdCgpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfcmF0ZSA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoJ3JlcV9yYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVlc3RzIHNlY29uZHMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlcV9yYXRlID0gcmVxX3JhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5yZXFfcmF0ZS5yZXF1ZXN0cyA9IGludChudW1iZXJzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJlcV9yYXRlLnNlY29uZHMgPSBpbnQobnVtYmVyc1sxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgogICAgICAgICBpZiBzdGF0ZSA9PSAyOgogICAgICAgICAgICAgc2VsZi5fYWRkX2VudHJ5KGVudHJ5KQogCi0KICAgICBkZWYgY2FuX2ZldGNoKHNlbGYsIHVzZXJhZ2VudCwgdXJsKToKICAgICAgICAgIiIidXNpbmcgdGhlIHBhcnNlZCByb2JvdHMudHh0IGRlY2lkZSBpZiB1c2VyYWdlbnQgY2FuIGZldGNoIHVybCIiIgogICAgICAgICBpZiBzZWxmLmRpc2FsbG93X2FsbDoKQEAgLTE1Myw2ICsxNzQsMTggQEAKICAgICAgICAgIyBhZ2VudCBub3QgZm91bmQgPT0+IGFjY2VzcyBncmFudGVkCiAgICAgICAgIHJldHVybiBUcnVlCiAKKyAgICBkZWYgY3Jhd2xfZGVsYXkoc2VsZiwgdXNlcmFnZW50KToKKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LmFwcGxpZXNfdG8odXNlcmFnZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZGVsYXkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiByZXF1ZXN0X3JhdGUoc2VsZiwgdXNlcmFnZW50KToKKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LmFwcGxpZXNfdG8odXNlcmFnZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkucmVxX3JhdGUKKyAgICAgICAgcmV0dXJuIE5vbmUKKwogICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gJycuam9pbihbc3RyKGVudHJ5KSArICJcbiIgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllc10pCiAKQEAgLTE4MCw2ICsyMTMsOCBAQAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi51c2VyYWdlbnRzID0gW10KICAgICAgICAgc2VsZi5ydWxlbGluZXMgPSBbXQorICAgICAgICBzZWxmLmRlbGF5ID0gTm9uZQorICAgICAgICBzZWxmLnJlcV9yYXRlID0gTm9uZQogCiAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIHJldCA9IFtdCmRpZmYgLS1naXQgYS9MaWIvdXVpZC5weSBiL0xpYi91dWlkLnB5CmluZGV4IGU5NmU3ZTAuLjIwMGM4MDAgMTAwNjQ0Ci0tLSBhL0xpYi91dWlkLnB5CisrKyBiL0xpYi91dWlkLnB5CkBAIC00ODcsNyArNDg3LDYgQEAKICAgICAjIEFzc3VtZSB0aGF0IHRoZSB1dWlkX2dlbmVyYXRlIGZ1bmN0aW9ucyBhcmUgYnJva2VuIGZyb20gMTAuNSBvbndhcmQsCiAgICAgIyB0aGUgdGVzdCBjYW4gYmUgYWRqdXN0ZWQgd2hlbiBhIGxhdGVyIHZlcnNpb24gaXMgZml4ZWQuCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgotICAgICAgICBpbXBvcnQgb3MKICAgICAgICAgaWYgaW50KG9zLnVuYW1lKCkucmVsZWFzZS5zcGxpdCgnLicpWzBdKSA+PSA5OgogICAgICAgICAgICAgX3V1aWRfZ2VuZXJhdGVfdGltZSA9IE5vbmUKIApkaWZmIC0tZ2l0IGEvTGliL3ZlbnYvX19pbml0X18ucHkgYi9MaWIvdmVudi9fX2luaXRfXy5weQppbmRleCA3NDI0NWFiLi5mYTNkMmEzIDEwMDY0NAotLS0gYS9MaWIvdmVudi9fX2luaXRfXy5weQorKysgYi9MaWIvdmVudi9fX2luaXRfXy5weQpAQCAtMywyOCArMyw2IEBACiAKIENvcHlyaWdodCAoQykgMjAxMS0yMDE0IFZpbmF5IFNhamlwLgogTGljZW5zZWQgdG8gdGhlIFBTRiB1bmRlciBhIGNvbnRyaWJ1dG9yIGFncmVlbWVudC4KLQotdXNhZ2U6IHB5dGhvbiAtbSB2ZW52IFstaF0gWy0tc3lzdGVtLXNpdGUtcGFja2FnZXNdIFstLXN5bWxpbmtzXSBbLS1jbGVhcl0KLSAgICAgICAgICAgIFstLXVwZ3JhZGVdCi0gICAgICAgICAgICBFTlZfRElSIFtFTlZfRElSIC4uLl0KLQotQ3JlYXRlcyB2aXJ0dWFsIFB5dGhvbiBlbnZpcm9ubWVudHMgaW4gb25lIG9yIG1vcmUgdGFyZ2V0IGRpcmVjdG9yaWVzLgotCi1wb3NpdGlvbmFsIGFyZ3VtZW50czoKLSAgRU5WX0RJUiAgICAgICAgICAgICAgIEEgZGlyZWN0b3J5IHRvIGNyZWF0ZSB0aGUgZW52aXJvbm1lbnQgaW4uCi0KLW9wdGlvbmFsIGFyZ3VtZW50czoKLSAgLWgsIC0taGVscCAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKLSAgLS1zeXN0ZW0tc2l0ZS1wYWNrYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgR2l2ZSB0aGUgdmlydHVhbCBlbnZpcm9ubWVudCBhY2Nlc3MgdG8gdGhlIHN5c3RlbQotICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZS1wYWNrYWdlcyBkaXIuCi0gIC0tc3ltbGlua3MgICAgICAgICAgICBBdHRlbXB0IHRvIHN5bWxpbmsgcmF0aGVyIHRoYW4gY29weS4KLSAgLS1jbGVhciAgICAgICAgICAgICAgIERlbGV0ZSB0aGUgY29udGVudHMgb2YgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSBpZiBpdAotICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBleGlzdHMsIGJlZm9yZSBlbnZpcm9ubWVudCBjcmVhdGlvbi4KLSAgLS11cGdyYWRlICAgICAgICAgICAgIFVwZ3JhZGUgdGhlIGVudmlyb25tZW50IGRpcmVjdG9yeSB0byB1c2UgdGhpcyB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBvZiBQeXRob24sIGFzc3VtaW5nIFB5dGhvbiBoYXMgYmVlbiB1cGdyYWRlZCBpbi1wbGFjZS4KLSAgLS13aXRob3V0LXBpcCAgICAgICAgIFNraXBzIGluc3RhbGxpbmcgb3IgdXBncmFkaW5nIHBpcCBpbiB0aGUgdmlydHVhbAotICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgKHBpcCBpcyBib290c3RyYXBwZWQgYnkgZGVmYXVsdCkKICIiIgogaW1wb3J0IGxvZ2dpbmcKIGltcG9ydCBvcwpAQCAtMzQ5LDIzICszMjcsNyBAQAogCiBkZWYgY3JlYXRlKGVudl9kaXIsIHN5c3RlbV9zaXRlX3BhY2thZ2VzPUZhbHNlLCBjbGVhcj1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgc3ltbGlua3M9RmFsc2UsIHdpdGhfcGlwPUZhbHNlKToKLSAgICAiIiIKLSAgICBDcmVhdGUgYSB2aXJ0dWFsIGVudmlyb25tZW50IGluIGEgZGlyZWN0b3J5LgotCi0gICAgQnkgZGVmYXVsdCwgbWFrZXMgdGhlIHN5c3RlbSAoZ2xvYmFsKSBzaXRlLXBhY2thZ2VzIGRpciAqdW4qYXZhaWxhYmxlIHRvCi0gICAgdGhlIGNyZWF0ZWQgZW52aXJvbm1lbnQsIGFuZCB1c2VzIGNvcHlpbmcgcmF0aGVyIHRoYW4gc3ltbGlua2luZyBmb3IgZmlsZXMKLSAgICBvYnRhaW5lZCBmcm9tIHRoZSBzb3VyY2UgUHl0aG9uIGluc3RhbGxhdGlvbi4KLQotICAgIDpwYXJhbSBlbnZfZGlyOiBUaGUgdGFyZ2V0IGRpcmVjdG9yeSB0byBjcmVhdGUgYW4gZW52aXJvbm1lbnQgaW4uCi0gICAgOnBhcmFtIHN5c3RlbV9zaXRlX3BhY2thZ2VzOiBJZiBUcnVlLCB0aGUgc3lzdGVtIChnbG9iYWwpIHNpdGUtcGFja2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciBpcyBhdmFpbGFibGUgdG8gdGhlIGVudmlyb25tZW50LgotICAgIDpwYXJhbSBjbGVhcjogSWYgVHJ1ZSwgZGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgZW52aXJvbm1lbnQgZGlyZWN0b3J5IGlmCi0gICAgICAgICAgICAgICAgICBpdCBhbHJlYWR5IGV4aXN0cywgYmVmb3JlIGVudmlyb25tZW50IGNyZWF0aW9uLgotICAgIDpwYXJhbSBzeW1saW5rczogSWYgVHJ1ZSwgYXR0ZW1wdCB0byBzeW1saW5rIHJhdGhlciB0aGFuIGNvcHkgZmlsZXMgaW50bwotICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBlbnZpcm9ubWVudC4KLSAgICA6cGFyYW0gd2l0aF9waXA6IElmIFRydWUsIGVuc3VyZSBwaXAgaXMgaW5zdGFsbGVkIGluIHRoZSB2aXJ0dWFsCi0gICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudAotICAgICIiIgorICAgICIiIkNyZWF0ZSBhIHZpcnR1YWwgZW52aXJvbm1lbnQgaW4gYSBkaXJlY3RvcnkuIiIiCiAgICAgYnVpbGRlciA9IEVudkJ1aWxkZXIoc3lzdGVtX3NpdGVfcGFja2FnZXM9c3lzdGVtX3NpdGVfcGFja2FnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXI9Y2xlYXIsIHN5bWxpbmtzPXN5bWxpbmtzLCB3aXRoX3BpcD13aXRoX3BpcCkKICAgICBidWlsZGVyLmNyZWF0ZShlbnZfZGlyKQpkaWZmIC0tZ2l0IGEvTGliL3dhcm5pbmdzLnB5IGIvTGliL3dhcm5pbmdzLnB5CmluZGV4IGM2NjMxZmMuLjJiNDA3ZmYgMTAwNjQ0Ci0tLSBhL0xpYi93YXJuaW5ncy5weQorKysgYi9MaWIvd2FybmluZ3MucHkKQEAgLTIsMzkgKzIsMTEyIEBACiAKIGltcG9ydCBzeXMKIAorCiBfX2FsbF9fID0gWyJ3YXJuIiwgIndhcm5fZXhwbGljaXQiLCAic2hvd3dhcm5pbmciLAogICAgICAgICAgICAiZm9ybWF0d2FybmluZyIsICJmaWx0ZXJ3YXJuaW5ncyIsICJzaW1wbGVmaWx0ZXIiLAogICAgICAgICAgICAicmVzZXR3YXJuaW5ncyIsICJjYXRjaF93YXJuaW5ncyJdCiAKLQogZGVmIHNob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsIGxpbmU9Tm9uZSk6CiAgICAgIiIiSG9vayB0byB3cml0ZSBhIHdhcm5pbmcgdG8gYSBmaWxlOyByZXBsYWNlIGlmIHlvdSBsaWtlLiIiIgotICAgIGlmIGZpbGUgaXMgTm9uZToKLSAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKLSAgICAgICAgaWYgZmlsZSBpcyBOb25lOgotICAgICAgICAgICAgIyBzeXMuc3RkZXJyIGlzIE5vbmUgd2hlbiBydW4gd2l0aCBweXRob253LmV4ZSAtIHdhcm5pbmdzIGdldCBsb3N0Ci0gICAgICAgICAgICByZXR1cm4KLSAgICB0cnk6Ci0gICAgICAgIGZpbGUud3JpdGUoZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZSkpCi0gICAgZXhjZXB0IE9TRXJyb3I6Ci0gICAgICAgIHBhc3MgIyB0aGUgZmlsZSAocHJvYmFibHkgc3RkZXJyKSBpcyBpbnZhbGlkIC0gdGhpcyB3YXJuaW5nIGdldHMgbG9zdC4KKyAgICBtc2cgPSBXYXJuaW5nTWVzc2FnZShtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZSwgbGluZSkKKyAgICBfc2hvd3dhcm5tc2dfaW1wbChtc2cpCiAKIGRlZiBmb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lPU5vbmUpOgogICAgICIiIkZ1bmN0aW9uIHRvIGZvcm1hdCBhIHdhcm5pbmcgdGhlIHN0YW5kYXJkIHdheS4iIiIKLSAgICBzID0gICIlczolczogJXM6ICVzXG4iICUgKGZpbGVuYW1lLCBsaW5lbm8sIGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlKQotICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICBtc2cgPSBXYXJuaW5nTWVzc2FnZShtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgTm9uZSwgbGluZSkKKyAgICByZXR1cm4gX2Zvcm1hdHdhcm5tc2dfaW1wbChtc2cpCisKK2RlZiBfc2hvd3dhcm5tc2dfaW1wbChtc2cpOgorICAgIGZpbGUgPSBtc2cuZmlsZQorICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKKyAgICAgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgIyBzeXMuc3RkZXJyIGlzIE5vbmUgd2hlbiBydW4gd2l0aCBweXRob253LmV4ZToKKyAgICAgICAgICAgICMgd2FybmluZ3MgZ2V0IGxvc3QKKyAgICAgICAgICAgIHJldHVybgorICAgIHRleHQgPSBfZm9ybWF0d2Fybm1zZyhtc2cpCisgICAgdHJ5OgorICAgICAgICBmaWxlLndyaXRlKHRleHQpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICMgdGhlIGZpbGUgKHByb2JhYmx5IHN0ZGVycikgaXMgaW52YWxpZCAtIHRoaXMgd2FybmluZyBnZXRzIGxvc3QuCisgICAgICAgIHBhc3MKKworZGVmIF9mb3JtYXR3YXJubXNnX2ltcGwobXNnKToKKyAgICBzID0gICgiJXM6JXM6ICVzOiAlc1xuIgorICAgICAgICAgICUgKG1zZy5maWxlbmFtZSwgbXNnLmxpbmVubywgbXNnLmNhdGVnb3J5Ll9fbmFtZV9fLAorICAgICAgICAgICAgIG1zZy5tZXNzYWdlKSkKKworICAgIGlmIG1zZy5saW5lIGlzIE5vbmU6CiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGltcG9ydCBsaW5lY2FjaGUKLSAgICAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKG1zZy5maWxlbmFtZSwgbXNnLmxpbmVubykKICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICMgV2hlbiBhIHdhcm5pbmcgaXMgbG9nZ2VkIGR1cmluZyBQeXRob24gc2h1dGRvd24sIGxpbmVjYWNoZQogICAgICAgICAgICAgIyBhbmQgdGhlIGltcG9ydCBtYWNoaW5lcnkgZG9uJ3Qgd29yayBhbnltb3JlCiAgICAgICAgICAgICBsaW5lID0gTm9uZQorICAgICAgICAgICAgbGluZWNhY2hlID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGxpbmUgPSBtc2cubGluZQogICAgIGlmIGxpbmU6CiAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgcyArPSAiICAlc1xuIiAlIGxpbmUKKworICAgIGlmIG1zZy5zb3VyY2UgaXMgbm90IE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZW1hbGxvYworICAgICAgICAgICAgdGIgPSB0cmFjZW1hbGxvYy5nZXRfb2JqZWN0X3RyYWNlYmFjayhtc2cuc291cmNlKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgIyBXaGVuIGEgd2FybmluZyBpcyBsb2dnZWQgZHVyaW5nIFB5dGhvbiBzaHV0ZG93biwgdHJhY2VtYWxsb2MKKyAgICAgICAgICAgICMgYW5kIHRoZSBpbXBvcnQgbWFjaGluZXJ5IGRvbid0IHdvcmsgYW55bW9yZQorICAgICAgICAgICAgdGIgPSBOb25lCisKKyAgICAgICAgaWYgdGIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzICs9ICdPYmplY3QgYWxsb2NhdGVkIGF0IChtb3N0IHJlY2VudCBjYWxsIGZpcnN0KTpcbicKKyAgICAgICAgICAgIGZvciBmcmFtZSBpbiB0YjoKKyAgICAgICAgICAgICAgICBzICs9ICgnICBGaWxlICIlcyIsIGxpbmVubyAlc1xuJworICAgICAgICAgICAgICAgICAgICAgICUgKGZyYW1lLmZpbGVuYW1lLCBmcmFtZS5saW5lbm8pKQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lY2FjaGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZnJhbWUuZmlsZW5hbWUsIGZyYW1lLmxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBOb25lCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIHMgKz0gJyAgICAlc1xuJyAlIGxpbmUKICAgICByZXR1cm4gcwogCisjIEtlZXAgYSByZWZlcmVuY2UgdG8gY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIHdhcyByZXBsYWNlZAorX3Nob3d3YXJuaW5nID0gc2hvd3dhcm5pbmcKKworZGVmIF9zaG93d2Fybm1zZyhtc2cpOgorICAgICIiIkhvb2sgdG8gd3JpdGUgYSB3YXJuaW5nIHRvIGEgZmlsZTsgcmVwbGFjZSBpZiB5b3UgbGlrZS4iIiIKKyAgICBzaG93d2FybmluZyA9IGdsb2JhbHMoKS5nZXQoJ3Nob3d3YXJuaW5nJywgX3Nob3d3YXJuaW5nKQorICAgIGlmIHNob3d3YXJuaW5nIGlzIG5vdCBfc2hvd3dhcm5pbmc6CisgICAgICAgICMgd2FybmluZ3Muc2hvd3dhcm5pbmcoKSB3YXMgcmVwbGFjZWQKKyAgICAgICAgaWYgbm90IGNhbGxhYmxlKHNob3d3YXJuaW5nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigid2FybmluZ3Muc2hvd3dhcm5pbmcoKSBtdXN0IGJlIHNldCB0byBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuY3Rpb24gb3IgbWV0aG9kIikKKworICAgICAgICBzaG93d2FybmluZyhtc2cubWVzc2FnZSwgbXNnLmNhdGVnb3J5LCBtc2cuZmlsZW5hbWUsIG1zZy5saW5lbm8sCisgICAgICAgICAgICAgICAgICAgIG1zZy5maWxlLCBtc2cubGluZSkKKyAgICAgICAgcmV0dXJuCisgICAgX3Nob3d3YXJubXNnX2ltcGwobXNnKQorCisjIEtlZXAgYSByZWZlcmVuY2UgdG8gY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIHdhcyByZXBsYWNlZAorX2Zvcm1hdHdhcm5pbmcgPSBmb3JtYXR3YXJuaW5nCisKK2RlZiBfZm9ybWF0d2Fybm1zZyhtc2cpOgorICAgICIiIkZ1bmN0aW9uIHRvIGZvcm1hdCBhIHdhcm5pbmcgdGhlIHN0YW5kYXJkIHdheS4iIiIKKyAgICBmb3JtYXR3YXJuaW5nID0gZ2xvYmFscygpLmdldCgnZm9ybWF0d2FybmluZycsIF9mb3JtYXR3YXJuaW5nKQorICAgIGlmIGZvcm1hdHdhcm5pbmcgaXMgbm90IF9mb3JtYXR3YXJuaW5nOgorICAgICAgICAjIHdhcm5pbmdzLmZvcm1hdHdhcm5pbmcoKSB3YXMgcmVwbGFjZWQKKyAgICAgICAgcmV0dXJuIGZvcm1hdHdhcm5pbmcobXNnLm1lc3NhZ2UsIG1zZy5jYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLmZpbGVuYW1lLCBtc2cubGluZW5vLCBsaW5lPW1zZy5saW5lKQorICAgIHJldHVybiBfZm9ybWF0d2Fybm1zZ19pbXBsKG1zZykKKwogZGVmIGZpbHRlcndhcm5pbmdzKGFjdGlvbiwgbWVzc2FnZT0iIiwgY2F0ZWdvcnk9V2FybmluZywgbW9kdWxlPSIiLCBsaW5lbm89MCwKICAgICAgICAgICAgICAgICAgICBhcHBlbmQ9RmFsc2UpOgogICAgICIiIkluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBsaXN0IG9mIHdhcm5pbmdzIGZpbHRlcnMgKGF0IHRoZSBmcm9udCkuCkBAIC0xODUsNyArMjU4LDcgQEAKIAogCiAjIENvZGUgdHlwaWNhbGx5IHJlcGxhY2VkIGJ5IF93YXJuaW5ncwotZGVmIHdhcm4obWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xKToKK2RlZiB3YXJuKG1lc3NhZ2UsIGNhdGVnb3J5PU5vbmUsIHN0YWNrbGV2ZWw9MSwgc291cmNlPU5vbmUpOgogICAgICIiIklzc3VlIGEgd2FybmluZywgb3IgbWF5YmUgaWdub3JlIGl0IG9yIHJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIKICAgICAjIENoZWNrIGlmIG1lc3NhZ2UgaXMgYWxyZWFkeSBhIFdhcm5pbmcgb2JqZWN0CiAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBXYXJuaW5nKToKQEAgLTIzNSwxMCArMzA4LDExIEBACiAgICAgICAgICAgICBmaWxlbmFtZSA9IG1vZHVsZQogICAgIHJlZ2lzdHJ5ID0gZ2xvYmFscy5zZXRkZWZhdWx0KCJfX3dhcm5pbmdyZWdpc3RyeV9fIiwge30pCiAgICAgd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLCByZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgIGdsb2JhbHMpCisgICAgICAgICAgICAgICAgICBnbG9iYWxzLCBzb3VyY2UpCiAKIGRlZiB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLAotICAgICAgICAgICAgICAgICAgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgICAgICAgICAgICAgICAgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUsCisgICAgICAgICAgICAgICAgICBzb3VyY2U9Tm9uZSk6CiAgICAgbGluZW5vID0gaW50KGxpbmVubykKICAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICAgbW9kdWxlID0gZmlsZW5hbWUgb3IgIjx1bmtub3duPiIKQEAgLTMwMywyMiArMzc3LDE4IEBACiAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBhY3Rpb24gKCVyKSBpbiB3YXJuaW5ncy5maWx0ZXJzOlxuICVzIiAlCiAgICAgICAgICAgICAgIChhY3Rpb24sIGl0ZW0pKQotICAgIGlmIG5vdCBjYWxsYWJsZShzaG93d2FybmluZyk6Ci0gICAgICAgIHJhaXNlIFR5cGVFcnJvcigid2FybmluZ3Muc2hvd3dhcm5pbmcoKSBtdXN0IGJlIHNldCB0byBhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiBvciBtZXRob2QiKQogICAgICMgUHJpbnQgbWVzc2FnZSBhbmQgY29udGV4dAotICAgIHNob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vKQorICAgIG1zZyA9IFdhcm5pbmdNZXNzYWdlKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBzb3VyY2UpCisgICAgX3Nob3d3YXJubXNnKG1zZykKIAogCiBjbGFzcyBXYXJuaW5nTWVzc2FnZShvYmplY3QpOgogCi0gICAgIiIiSG9sZHMgdGhlIHJlc3VsdCBvZiBhIHNpbmdsZSBzaG93d2FybmluZygpIGNhbGwuIiIiCi0KICAgICBfV0FSTklOR19ERVRBSUxTID0gKCJtZXNzYWdlIiwgImNhdGVnb3J5IiwgImZpbGVuYW1lIiwgImxpbmVubyIsICJmaWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lIikKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lIiwgInNvdXJjZSIpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgbGluZT1Ob25lKToKKyAgICAgICAgICAgICAgICAgbGluZT1Ob25lLCBzb3VyY2U9Tm9uZSk6CiAgICAgICAgIGxvY2FsX3ZhbHVlcyA9IGxvY2FscygpCiAgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX1dBUk5JTkdfREVUQUlMUzoKICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgbG9jYWxfdmFsdWVzW2F0dHJdKQpAQCAtMzc2LDExICs0NDYsMTIgQEAKICAgICAgICAgc2VsZi5fbW9kdWxlLmZpbHRlcnMgPSBzZWxmLl9maWx0ZXJzWzpdCiAgICAgICAgIHNlbGYuX21vZHVsZS5fZmlsdGVyc19tdXRhdGVkKCkKICAgICAgICAgc2VsZi5fc2hvd3dhcm5pbmcgPSBzZWxmLl9tb2R1bGUuc2hvd3dhcm5pbmcKKyAgICAgICAgc2VsZi5fc2hvd3dhcm5tc2cgPSBzZWxmLl9tb2R1bGUuX3Nob3d3YXJubXNnCiAgICAgICAgIGlmIHNlbGYuX3JlY29yZDoKICAgICAgICAgICAgIGxvZyA9IFtdCi0gICAgICAgICAgICBkZWYgc2hvd3dhcm5pbmcoKmFyZ3MsICoqa3dhcmdzKToKLSAgICAgICAgICAgICAgICBsb2cuYXBwZW5kKFdhcm5pbmdNZXNzYWdlKCphcmdzLCAqKmt3YXJncykpCi0gICAgICAgICAgICBzZWxmLl9tb2R1bGUuc2hvd3dhcm5pbmcgPSBzaG93d2FybmluZworICAgICAgICAgICAgZGVmIHNob3dhcm5tc2cobXNnKToKKyAgICAgICAgICAgICAgICBsb2cuYXBwZW5kKG1zZykKKyAgICAgICAgICAgIHNlbGYuX21vZHVsZS5fc2hvd3dhcm5tc2cgPSBzaG93YXJubXNnCiAgICAgICAgICAgICByZXR1cm4gbG9nCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gTm9uZQpAQCAtMzkxLDYgKzQ2Miw3IEBACiAgICAgICAgIHNlbGYuX21vZHVsZS5maWx0ZXJzID0gc2VsZi5fZmlsdGVycwogICAgICAgICBzZWxmLl9tb2R1bGUuX2ZpbHRlcnNfbXV0YXRlZCgpCiAgICAgICAgIHNlbGYuX21vZHVsZS5zaG93d2FybmluZyA9IHNlbGYuX3Nob3d3YXJuaW5nCisgICAgICAgIHNlbGYuX21vZHVsZS5fc2hvd3dhcm5tc2cgPSBzZWxmLl9zaG93d2Fybm1zZwogCiAKICMgZmlsdGVycyBjb250YWlucyBhIHNlcXVlbmNlIG9mIGZpbHRlciA1LXR1cGxlcwpkaWZmIC0tZ2l0IGEvTGliL3dhdmUucHkgYi9MaWIvd2F2ZS5weQppbmRleCA4YTEwMWUzLi5mNzFmN2U1IDEwMDY0NAotLS0gYS9MaWIvd2F2ZS5weQorKysgYi9MaWIvd2F2ZS5weQpAQCAtNzMsNyArNzMsNyBAQAogCiBpbXBvcnQgYnVpbHRpbnMKIAotX19hbGxfXyA9IFsib3BlbiIsICJvcGVuZnAiLCAiRXJyb3IiXQorX19hbGxfXyA9IFsib3BlbiIsICJvcGVuZnAiLCAiRXJyb3IiLCAiV2F2ZV9yZWFkIiwgIldhdmVfd3JpdGUiXQogCiBjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkgYi9MaWIvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CmluZGV4IDdmZGRiZTguLmY3MTU2M2EgMTAwNjQ0Ci0tLSBhL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKKysrIGIvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weQpAQCAtMTEsNyArMTEsNiBAQAogIiIiCiAKIGZyb20gaHR0cC5zZXJ2ZXIgaW1wb3J0IEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIsIEhUVFBTZXJ2ZXIKLWZyb20gaW8gaW1wb3J0IEJ1ZmZlcmVkV3JpdGVyCiBpbXBvcnQgc3lzCiBpbXBvcnQgdXJsbGliLnBhcnNlCiBmcm9tIHdzZ2lyZWYuaGFuZGxlcnMgaW1wb3J0IFNpbXBsZUhhbmRsZXIKQEAgLTEyNywxNyArMTI2LDExIEBACiAgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlX3JlcXVlc3QoKTogIyBBbiBlcnJvciBjb2RlIGhhcyBiZWVuIHNlbnQsIGp1c3QgZXhpdAogICAgICAgICAgICAgcmV0dXJuCiAKLSAgICAgICAgIyBBdm9pZCBwYXNzaW5nIHRoZSByYXcgZmlsZSBvYmplY3Qgd2ZpbGUsIHdoaWNoIGNhbiBkbyBwYXJ0aWFsCi0gICAgICAgICMgd3JpdGVzIChJc3N1ZSAyNDI5MSkKLSAgICAgICAgc3Rkb3V0ID0gQnVmZmVyZWRXcml0ZXIoc2VsZi53ZmlsZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgaGFuZGxlciA9IFNlcnZlckhhbmRsZXIoCi0gICAgICAgICAgICAgICAgc2VsZi5yZmlsZSwgc3Rkb3V0LCBzZWxmLmdldF9zdGRlcnIoKSwgc2VsZi5nZXRfZW52aXJvbigpCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBoYW5kbGVyLnJlcXVlc3RfaGFuZGxlciA9IHNlbGYgICAgICAjIGJhY2twb2ludGVyIGZvciBsb2dnaW5nCi0gICAgICAgICAgICBoYW5kbGVyLnJ1bihzZWxmLnNlcnZlci5nZXRfYXBwKCkpCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBzdGRvdXQuZGV0YWNoKCkKKyAgICAgICAgaGFuZGxlciA9IFNlcnZlckhhbmRsZXIoCisgICAgICAgICAgICBzZWxmLnJmaWxlLCBzZWxmLndmaWxlLCBzZWxmLmdldF9zdGRlcnIoKSwgc2VsZi5nZXRfZW52aXJvbigpCisgICAgICAgICkKKyAgICAgICAgaGFuZGxlci5yZXF1ZXN0X2hhbmRsZXIgPSBzZWxmICAgICAgIyBiYWNrcG9pbnRlciBmb3IgbG9nZ2luZworICAgICAgICBoYW5kbGVyLnJ1bihzZWxmLnNlcnZlci5nZXRfYXBwKCkpCiAKIAogCkBAIC0xNjMsMTAgKzE1Niw5IEBACiAKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkKLSAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCi0gICAgcHJpbnQoIlNlcnZpbmcgSFRUUCBvbiIsIHNhWzBdLCAicG9ydCIsIHNhWzFdLCAiLi4uIikKLSAgICBpbXBvcnQgd2ViYnJvd3NlcgotICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovL2xvY2FsaG9zdDo4MDAwL3h5ej9hYmMnKQotICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkgICMgc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAotICAgIGh0dHBkLnNlcnZlcl9jbG9zZSgpCisgICAgd2l0aCBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApIGFzIGh0dHBkOgorICAgICAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgIHByaW50KCJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIpCisgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCisgICAgICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovL2xvY2FsaG9zdDo4MDAwL3h5ej9hYmMnKQorICAgICAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpICAjIHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKZGlmZiAtLWdpdCBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkgYi9MaWIveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CmluZGV4IDZkMWIwYWIuLjY3YjdmMmIgMTAwNjQ0Ci0tLSBhL0xpYi94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKKysrIGIvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQpAQCAtODUsNyArODUsNyBAQAogICAgICJUcmVlQnVpbGRlciIsCiAgICAgIlZFUlNJT04iLAogICAgICJYTUwiLCAiWE1MSUQiLAotICAgICJYTUxQYXJzZXIiLAorICAgICJYTUxQYXJzZXIiLCAiWE1MUHVsbFBhcnNlciIsCiAgICAgInJlZ2lzdGVyX25hbWVzcGFjZSIsCiAgICAgXQogCkBAIC05NSw2ICs5NSw3IEBACiBpbXBvcnQgcmUKIGltcG9ydCB3YXJuaW5ncwogaW1wb3J0IGlvCitpbXBvcnQgY29sbGVjdGlvbnMKIGltcG9ydCBjb250ZXh0bGliCiAKIGZyb20gLiBpbXBvcnQgRWxlbWVudFBhdGgKQEAgLTEyMDAsMTYgKzEyMDEsMzcgQEAKICAgICBSZXR1cm5zIGFuIGl0ZXJhdG9yIHByb3ZpZGluZyAoZXZlbnQsIGVsZW0pIHBhaXJzLgogCiAgICAgIiIiCisgICAgIyBVc2UgdGhlIGludGVybmFsLCB1bmRvY3VtZW50ZWQgX3BhcnNlciBhcmd1bWVudCBmb3Igbm93OyBXaGVuIHRoZQorICAgICMgcGFyc2VyIGFyZ3VtZW50IG9mIGl0ZXJwYXJzZSBpcyByZW1vdmVkLCB0aGlzIGNhbiBiZSBraWxsZWQuCisgICAgcHVsbHBhcnNlciA9IFhNTFB1bGxQYXJzZXIoZXZlbnRzPWV2ZW50cywgX3BhcnNlcj1wYXJzZXIpCisgICAgZGVmIGl0ZXJhdG9yKCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgeWllbGQgZnJvbSBwdWxscGFyc2VyLnJlYWRfZXZlbnRzKCkKKyAgICAgICAgICAgICAgICAjIGxvYWQgZXZlbnQgYnVmZmVyCisgICAgICAgICAgICAgICAgZGF0YSA9IHNvdXJjZS5yZWFkKDE2ICogMTAyNCkKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBwdWxscGFyc2VyLmZlZWQoZGF0YSkKKyAgICAgICAgICAgIHJvb3QgPSBwdWxscGFyc2VyLl9jbG9zZV9hbmRfcmV0dXJuX3Jvb3QoKQorICAgICAgICAgICAgeWllbGQgZnJvbSBwdWxscGFyc2VyLnJlYWRfZXZlbnRzKCkKKyAgICAgICAgICAgIGl0LnJvb3QgPSByb290CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBjbG9zZV9zb3VyY2U6CisgICAgICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKKworICAgIGNsYXNzIEl0ZXJQYXJzZUl0ZXJhdG9yKGNvbGxlY3Rpb25zLkl0ZXJhdG9yKToKKyAgICAgICAgX19uZXh0X18gPSBpdGVyYXRvcigpLl9fbmV4dF9fCisgICAgaXQgPSBJdGVyUGFyc2VJdGVyYXRvcigpCisgICAgaXQucm9vdCA9IE5vbmUKKyAgICBkZWwgaXRlcmF0b3IsIEl0ZXJQYXJzZUl0ZXJhdG9yCisKICAgICBjbG9zZV9zb3VyY2UgPSBGYWxzZQogICAgIGlmIG5vdCBoYXNhdHRyKHNvdXJjZSwgInJlYWQiKToKICAgICAgICAgc291cmNlID0gb3Blbihzb3VyY2UsICJyYiIpCiAgICAgICAgIGNsb3NlX3NvdXJjZSA9IFRydWUKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBfSXRlclBhcnNlSXRlcmF0b3Ioc291cmNlLCBldmVudHMsIHBhcnNlciwgY2xvc2Vfc291cmNlKQotICAgIGV4Y2VwdDoKLSAgICAgICAgaWYgY2xvc2Vfc291cmNlOgotICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKLSAgICAgICAgcmFpc2UKKworICAgIHJldHVybiBpdAogCiAKIGNsYXNzIFhNTFB1bGxQYXJzZXI6CkBAIC0xMjE5LDkgKzEyNDEsNyBAQAogICAgICAgICAjIHVwb24gaW4gdXNlciBjb2RlLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE3NzQxIGZvciBtb3JlIGRldGFpbHMuCiAKLSAgICAgICAgIyBfZWxlbWVudHRyZWUuYyBleHBlY3RzIGEgbGlzdCwgbm90IGEgZGVxdWUKLSAgICAgICAgc2VsZi5fZXZlbnRzX3F1ZXVlID0gW10KLSAgICAgICAgc2VsZi5faW5kZXggPSAwCisgICAgICAgIHNlbGYuX2V2ZW50c19xdWV1ZSA9IGNvbGxlY3Rpb25zLmRlcXVlKCkKICAgICAgICAgc2VsZi5fcGFyc2VyID0gX3BhcnNlciBvciBYTUxQYXJzZXIodGFyZ2V0PVRyZWVCdWlsZGVyKCkpCiAgICAgICAgICMgd2lyZSB1cCB0aGUgcGFyc2VyIGZvciBldmVudCByZXBvcnRpbmcKICAgICAgICAgaWYgZXZlbnRzIGlzIE5vbmU6CkBAIC0xMjU5LDY0ICsxMjc5LDE0IEBACiAgICAgICAgIHJldHJpZXZlZCBmcm9tIHRoZSBpdGVyYXRvci4KICAgICAgICAgIiIiCiAgICAgICAgIGV2ZW50cyA9IHNlbGYuX2V2ZW50c19xdWV1ZQotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgaW5kZXggPSBzZWxmLl9pbmRleAotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGV2ZW50ID0gZXZlbnRzW3NlbGYuX2luZGV4XQotICAgICAgICAgICAgICAgICMgQXZvaWQgcmV0YWluaW5nIHJlZmVyZW5jZXMgdG8gcGFzdCBldmVudHMKLSAgICAgICAgICAgICAgICBldmVudHNbc2VsZi5faW5kZXhdID0gTm9uZQotICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgIGluZGV4ICs9IDEKLSAgICAgICAgICAgICMgQ29tcGFjdCB0aGUgbGlzdCBpbiBhIE8oMSkgYW1vcnRpemVkIGZhc2hpb24KLSAgICAgICAgICAgICMgQXMgbm90ZWQgYWJvdmUsIF9lbGVtZW50cmVlLmMgbmVlZHMgYSBsaXN0LCBub3QgYSBkZXF1ZQotICAgICAgICAgICAgaWYgaW5kZXggKiAyID49IGxlbihldmVudHMpOgotICAgICAgICAgICAgICAgIGV2ZW50c1s6aW5kZXhdID0gW10KLSAgICAgICAgICAgICAgICBzZWxmLl9pbmRleCA9IDAKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5faW5kZXggPSBpbmRleAorICAgICAgICB3aGlsZSBldmVudHM6CisgICAgICAgICAgICBldmVudCA9IGV2ZW50cy5wb3BsZWZ0KCkKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXZlbnQsIEV4Y2VwdGlvbik6CiAgICAgICAgICAgICAgICAgcmFpc2UgZXZlbnQKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgeWllbGQgZXZlbnQKIAogCi1jbGFzcyBfSXRlclBhcnNlSXRlcmF0b3I6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCBldmVudHMsIHBhcnNlciwgY2xvc2Vfc291cmNlPUZhbHNlKToKLSAgICAgICAgIyBVc2UgdGhlIGludGVybmFsLCB1bmRvY3VtZW50ZWQgX3BhcnNlciBhcmd1bWVudCBmb3Igbm93OyBXaGVuIHRoZQotICAgICAgICAjIHBhcnNlciBhcmd1bWVudCBvZiBpdGVycGFyc2UgaXMgcmVtb3ZlZCwgdGhpcyBjYW4gYmUga2lsbGVkLgotICAgICAgICBzZWxmLl9wYXJzZXIgPSBYTUxQdWxsUGFyc2VyKGV2ZW50cz1ldmVudHMsIF9wYXJzZXI9cGFyc2VyKQotICAgICAgICBzZWxmLl9maWxlID0gc291cmNlCi0gICAgICAgIHNlbGYuX2Nsb3NlX2ZpbGUgPSBjbG9zZV9zb3VyY2UKLSAgICAgICAgc2VsZi5yb290ID0gc2VsZi5fcm9vdCA9IE5vbmUKLQotICAgIGRlZiBfX25leHRfXyhzZWxmKToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgd2hpbGUgMToKLSAgICAgICAgICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi5fcGFyc2VyLnJlYWRfZXZlbnRzKCk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudAotICAgICAgICAgICAgICAgIGlmIHNlbGYuX3BhcnNlci5fcGFyc2VyIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgIyBsb2FkIGV2ZW50IGJ1ZmZlcgotICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9maWxlLnJlYWQoMTYgKiAxMDI0KQotICAgICAgICAgICAgICAgIGlmIGRhdGE6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlci5mZWVkKGRhdGEpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fcm9vdCA9IHNlbGYuX3BhcnNlci5fY2xvc2VfYW5kX3JldHVybl9yb290KCkKLSAgICAgICAgICAgIHNlbGYucm9vdCA9IHNlbGYuX3Jvb3QKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgaWYgc2VsZi5fY2xvc2VfZmlsZToKLSAgICAgICAgICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKLSAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIGlmIHNlbGYuX2Nsb3NlX2ZpbGU6Ci0gICAgICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKLSAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgotCi0gICAgZGVmIF9faXRlcl9fKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZgotCi0KIGRlZiBYTUwodGV4dCwgcGFyc2VyPU5vbmUpOgogICAgICIiIlBhcnNlIFhNTCBkb2N1bWVudCBmcm9tIHN0cmluZyBjb25zdGFudC4KIApkaWZmIC0tZ2l0IGEvTGliL3htbHJwYy9jbGllbnQucHkgYi9MaWIveG1scnBjL2NsaWVudC5weQppbmRleCBiYmY5ZWU2Li41ODFhM2I5IDEwMDY0NAotLS0gYS9MaWIveG1scnBjL2NsaWVudC5weQorKysgYi9MaWIveG1scnBjL2NsaWVudC5weQpAQCAtMTUxLDcgKzE1MSw3IEBACiAgICAgcmV0dXJuIHMucmVwbGFjZSgiPiIsICImZ3Q7IiwpCiAKICMgdXNlZCBpbiBVc2VyLUFnZW50IGhlYWRlciBzZW50Ci1fX3ZlcnNpb25fXyA9IHN5cy52ZXJzaW9uWzozXQorX192ZXJzaW9uX18gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIAogIyB4bWxycGMgaW50ZWdlciBsaW1pdHMKIE1BWElOVCA9ICAyKiozMS0xCmRpZmYgLS1naXQgYS9MaWIveG1scnBjL3NlcnZlci5weSBiL0xpYi94bWxycGMvc2VydmVyLnB5CmluZGV4IDc4MTc2OTMuLjg0OWJmZGQgMTAwNjQ0Ci0tLSBhL0xpYi94bWxycGMvc2VydmVyLnB5CisrKyBiL0xpYi94bWxycGMvc2VydmVyLnB5CkBAIC05NzEsMTYgKzk3MSwxNSBAQAogICAgICAgICAgICAgZGVmIGdldEN1cnJlbnRUaW1lKCk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCiAKLSAgICBzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQotICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQotICAgIHNlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShFeGFtcGxlU2VydmljZSgpLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSkKLSAgICBzZXJ2ZXIucmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucygpCi0gICAgcHJpbnQoJ1NlcnZpbmcgWE1MLVJQQyBvbiBsb2NhbGhvc3QgcG9ydCA4MDAwJykKLSAgICBwcmludCgnSXQgaXMgYWR2aXNhYmxlIHRvIHJ1biB0aGlzIGV4YW1wbGUgc2VydmVyIHdpdGhpbiBhIHNlY3VyZSwgY2xvc2VkIG5ldHdvcmsuJykKLSAgICB0cnk6Ci0gICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKLSAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0gICAgICAgIHByaW50KCJcbktleWJvYXJkIGludGVycnVwdCByZWNlaXZlZCwgZXhpdGluZy4iKQotICAgICAgICBzZXJ2ZXIuc2VydmVyX2Nsb3NlKCkKLSAgICAgICAgc3lzLmV4aXQoMCkKKyAgICB3aXRoIFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKSBhcyBzZXJ2ZXI6CisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQorICAgICAgICBzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoRXhhbXBsZVNlcnZpY2UoKSwgYWxsb3dfZG90dGVkX25hbWVzPVRydWUpCisgICAgICAgIHNlcnZlci5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKKyAgICAgICAgcHJpbnQoJ1NlcnZpbmcgWE1MLVJQQyBvbiBsb2NhbGhvc3QgcG9ydCA4MDAwJykKKyAgICAgICAgcHJpbnQoJ0l0IGlzIGFkdmlzYWJsZSB0byBydW4gdGhpcyBleGFtcGxlIHNlcnZlciB3aXRoaW4gYSBzZWN1cmUsIGNsb3NlZCBuZXR3b3JrLicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcHJpbnQoIlxuS2V5Ym9hcmQgaW50ZXJydXB0IHJlY2VpdmVkLCBleGl0aW5nLiIpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQpkaWZmIC0tZ2l0IGEvTGliL3ppcGZpbGUucHkgYi9MaWIvemlwZmlsZS5weQppbmRleCA1NmEyNDc5Li44ZGQwNjRhIDEwMDY0NAotLS0gYS9MaWIvemlwZmlsZS5weQorKysgYi9MaWIvemlwZmlsZS5weQpAQCAtMzcxLDcgKzM3MSw3IEBACiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgZmlsZW1vZGU9JXInICUgc3RhdC5maWxlbW9kZShoaSkpCiAgICAgICAgIGlmIGxvOgogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIGV4dGVybmFsX2F0dHI9JSN4JyAlIGxvKQotICAgICAgICBpc2RpciA9IHNlbGYuZmlsZW5hbWVbLTE6XSA9PSAnLycKKyAgICAgICAgaXNkaXIgPSBzZWxmLmlzX2RpcigpCiAgICAgICAgIGlmIG5vdCBpc2RpciBvciBzZWxmLmZpbGVfc2l6ZToKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyBmaWxlX3NpemU9JXInICUgc2VsZi5maWxlX3NpemUpCiAgICAgICAgIGlmICgobm90IGlzZGlyIG9yIHNlbGYuY29tcHJlc3Nfc2l6ZSkgYW5kCkBAIC00NjksNiArNDY5LDQyIEBACiAKICAgICAgICAgICAgIGV4dHJhID0gZXh0cmFbbG4rNDpdCiAKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9maWxlKGNscywgZmlsZW5hbWUsIGFyY25hbWU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhbiBhcHByb3ByaWF0ZSBaaXBJbmZvIGZvciBhIGZpbGUgb24gdGhlIGZpbGVzeXN0ZW0uCisKKyAgICAgICAgZmlsZW5hbWUgc2hvdWxkIGJlIHRoZSBwYXRoIHRvIGEgZmlsZSBvciBkaXJlY3Rvcnkgb24gdGhlIGZpbGVzeXN0ZW0uCisKKyAgICAgICAgYXJjbmFtZSBpcyB0aGUgbmFtZSB3aGljaCBpdCB3aWxsIGhhdmUgd2l0aGluIHRoZSBhcmNoaXZlIChieSBkZWZhdWx0LAorICAgICAgICB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgZmlsZW5hbWUsIGJ1dCB3aXRob3V0IGEgZHJpdmUgbGV0dGVyIGFuZCB3aXRoCisgICAgICAgIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3JzIHJlbW92ZWQpLgorICAgICAgICAiIiIKKyAgICAgICAgc3QgPSBvcy5zdGF0KGZpbGVuYW1lKQorICAgICAgICBpc2RpciA9IHN0YXQuU19JU0RJUihzdC5zdF9tb2RlKQorICAgICAgICBtdGltZSA9IHRpbWUubG9jYWx0aW1lKHN0LnN0X210aW1lKQorICAgICAgICBkYXRlX3RpbWUgPSBtdGltZVswOjZdCisgICAgICAgICMgQ3JlYXRlIFppcEluZm8gaW5zdGFuY2UgdG8gc3RvcmUgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBhcmNuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgYXJjbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpWzFdKQorICAgICAgICB3aGlsZSBhcmNuYW1lWzBdIGluIChvcy5zZXAsIG9zLmFsdHNlcCk6CisgICAgICAgICAgICBhcmNuYW1lID0gYXJjbmFtZVsxOl0KKyAgICAgICAgaWYgaXNkaXI6CisgICAgICAgICAgICBhcmNuYW1lICs9ICcvJworICAgICAgICB6aW5mbyA9IGNscyhhcmNuYW1lLCBkYXRlX3RpbWUpCisgICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgPSAoc3Quc3RfbW9kZSAmIDB4RkZGRikgPDwgMTYgICMgVW5peCBhdHRyaWJ1dGVzCisgICAgICAgIGlmIGlzZGlyOgorICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gMAorICAgICAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciB8PSAweDEwICAjIE1TLURPUyBkaXJlY3RvcnkgZmxhZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gc3Quc3Rfc2l6ZQorCisgICAgICAgIHJldHVybiB6aW5mbworCisgICAgZGVmIGlzX2RpcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhpcyBhcmNoaXZlIG1lbWJlciBpcyBhIGRpcmVjdG9yeS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWVbLTFdID09ICcvJworCiAKIGNsYXNzIF9aaXBEZWNyeXB0ZXI6CiAgICAgIiIiQ2xhc3MgdG8gaGFuZGxlIGRlY3J5cHRpb24gb2YgZmlsZXMgc3RvcmVkIHdpdGhpbiBhIFpJUCBhcmNoaXZlLgpAQCAtNjUxLDE0ICs2ODcsMTkgQEAKIAogCiBjbGFzcyBfU2hhcmVkRmlsZToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgcG9zLCBjbG9zZSwgbG9jayk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIHBvcywgY2xvc2UsIGxvY2ssIHdyaXRpbmcpOgogICAgICAgICBzZWxmLl9maWxlID0gZmlsZQogICAgICAgICBzZWxmLl9wb3MgPSBwb3MKICAgICAgICAgc2VsZi5fY2xvc2UgPSBjbG9zZQogICAgICAgICBzZWxmLl9sb2NrID0gbG9jaworICAgICAgICBzZWxmLl93cml0aW5nID0gd3JpdGluZwogCiAgICAgZGVmIHJlYWQoc2VsZiwgbj0tMSk6CiAgICAgICAgIHdpdGggc2VsZi5fbG9jazoKKyAgICAgICAgICAgIGlmIHNlbGYuX3dyaXRpbmcoKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbid0IHJlYWQgZnJvbSB0aGUgWklQIGZpbGUgd2hpbGUgdGhlcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgImlzIGFuIG9wZW4gd3JpdGluZyBoYW5kbGUgb24gaXQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJDbG9zZSB0aGUgd3JpdGluZyBoYW5kbGUgYmVmb3JlIHRyeWluZyB0byByZWFkLiIpCiAgICAgICAgICAgICBzZWxmLl9maWxlLnNlZWsoc2VsZi5fcG9zKQogICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZpbGUucmVhZChuKQogICAgICAgICAgICAgc2VsZi5fcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKQEAgLTcwMiw5ICs3NDMsNiBAQAogICAgICMgUmVhZCBmcm9tIGNvbXByZXNzZWQgZmlsZXMgaW4gNGsgYmxvY2tzLgogICAgIE1JTl9SRUFEX1NJWkUgPSA0MDk2CiAKLSAgICAjIFNlYXJjaCBmb3IgdW5pdmVyc2FsIG5ld2xpbmVzIG9yIGxpbmUgY2h1bmtzLgotICAgIFBBVFRFUk4gPSByZS5jb21waWxlKGJyJ14oP1A8Y2h1bms+W15cclxuXSspfCg/UDxuZXdsaW5lPlxufFxyXG4/KScpCi0KICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgbW9kZSwgemlwaW5mbywgZGVjcnlwdGVyPU5vbmUsCiAgICAgICAgICAgICAgICAgIGNsb3NlX2ZpbGVvYmo9RmFsc2UpOgogICAgICAgICBzZWxmLl9maWxlb2JqID0gZmlsZW9iagpAQCAtNzIxLDcgKzc1OSw2IEBACiAgICAgICAgIHNlbGYuX3JlYWRidWZmZXIgPSBiJycKICAgICAgICAgc2VsZi5fb2Zmc2V0ID0gMAogCi0gICAgICAgIHNlbGYuX3VuaXZlcnNhbCA9ICdVJyBpbiBtb2RlCiAgICAgICAgIHNlbGYubmV3bGluZXMgPSBOb25lCiAKICAgICAgICAgIyBBZGp1c3QgcmVhZCBzaXplIGZvciBlbmNyeXB0ZWQgZmlsZXMgc2luY2UgdGhlIGZpcnN0IDEyIGJ5dGVzCkBAIC03NTgsNyArNzk1LDcgQEAKICAgICAgICAgSWYgbGltaXQgaXMgc3BlY2lmaWVkLCBhdCBtb3N0IGxpbWl0IGJ5dGVzIHdpbGwgYmUgcmVhZC4KICAgICAgICAgIiIiCiAKLSAgICAgICAgaWYgbm90IHNlbGYuX3VuaXZlcnNhbCBhbmQgbGltaXQgPCAwOgorICAgICAgICBpZiBsaW1pdCA8IDA6CiAgICAgICAgICAgICAjIFNob3J0Y3V0IGNvbW1vbiBjYXNlIC0gbmV3bGluZSBmb3VuZCBpbiBidWZmZXIuCiAgICAgICAgICAgICBpID0gc2VsZi5fcmVhZGJ1ZmZlci5maW5kKGInXG4nLCBzZWxmLl9vZmZzZXQpICsgMQogICAgICAgICAgICAgaWYgaSA+IDA6CkBAIC03NjYsNDEgKzgwMyw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ID0gaQogICAgICAgICAgICAgICAgIHJldHVybiBsaW5lCiAKLSAgICAgICAgaWYgbm90IHNlbGYuX3VuaXZlcnNhbDoKLSAgICAgICAgICAgIHJldHVybiBpby5CdWZmZXJlZElPQmFzZS5yZWFkbGluZShzZWxmLCBsaW1pdCkKLQotICAgICAgICBsaW5lID0gYicnCi0gICAgICAgIHdoaWxlIGxpbWl0IDwgMCBvciBsZW4obGluZSkgPCBsaW1pdDoKLSAgICAgICAgICAgIHJlYWRhaGVhZCA9IHNlbGYucGVlaygyKQotICAgICAgICAgICAgaWYgcmVhZGFoZWFkID09IGInJzoKLSAgICAgICAgICAgICAgICByZXR1cm4gbGluZQotCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICAjIFNlYXJjaCBmb3IgdW5pdmVyc2FsIG5ld2xpbmVzIG9yIGxpbmUgY2h1bmtzLgotICAgICAgICAgICAgIwotICAgICAgICAgICAgIyBUaGUgcGF0dGVybiByZXR1cm5zIGVpdGhlciBhIGxpbmUgY2h1bmsgb3IgYSBuZXdsaW5lLCBidXQgbm90Ci0gICAgICAgICAgICAjIGJvdGguIENvbWJpbmVkIHdpdGggcGVlaygyKSwgd2UgYXJlIGFzc3VyZWQgdGhhdCB0aGUgc2VxdWVuY2UKLSAgICAgICAgICAgICMgJ1xyXG4nIGlzIGFsd2F5cyByZXRyaWV2ZWQgY29tcGxldGVseSBhbmQgbmV2ZXIgc3BsaXQgaW50bwotICAgICAgICAgICAgIyBzZXBhcmF0ZSBuZXdsaW5lcyAtICdccicsICdcbicgZHVlIHRvIGNvaW5jaWRlbnRhbCByZWFkYWhlYWRzLgotICAgICAgICAgICAgIwotICAgICAgICAgICAgbWF0Y2ggPSBzZWxmLlBBVFRFUk4uc2VhcmNoKHJlYWRhaGVhZCkKLSAgICAgICAgICAgIG5ld2xpbmUgPSBtYXRjaC5ncm91cCgnbmV3bGluZScpCi0gICAgICAgICAgICBpZiBuZXdsaW5lIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIGlmIHNlbGYubmV3bGluZXMgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lcyA9IFtdCi0gICAgICAgICAgICAgICAgaWYgbmV3bGluZSBub3QgaW4gc2VsZi5uZXdsaW5lczoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lcy5hcHBlbmQobmV3bGluZSkKLSAgICAgICAgICAgICAgICBzZWxmLl9vZmZzZXQgKz0gbGVuKG5ld2xpbmUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUgKyBiJ1xuJwotCi0gICAgICAgICAgICBjaHVuayA9IG1hdGNoLmdyb3VwKCdjaHVuaycpCi0gICAgICAgICAgICBpZiBsaW1pdCA+PSAwOgotICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmtbOiBsaW1pdCAtIGxlbihsaW5lKV0KLQotICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ICs9IGxlbihjaHVuaykKLSAgICAgICAgICAgIGxpbmUgKz0gY2h1bmsKLQotICAgICAgICByZXR1cm4gbGluZQorICAgICAgICByZXR1cm4gaW8uQnVmZmVyZWRJT0Jhc2UucmVhZGxpbmUoc2VsZiwgbGltaXQpCiAKICAgICBkZWYgcGVlayhzZWxmLCBuPTEpOgogICAgICAgICAiIiJSZXR1cm5zIGJ1ZmZlcmVkIGJ5dGVzIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBwb3NpdGlvbi4iIiIKQEAgLTk1OCw2ICs5NjEsNzYgQEAKICAgICAgICAgICAgIHN1cGVyKCkuY2xvc2UoKQogCiAKK2NsYXNzIF9aaXBXcml0ZUZpbGUoaW8uQnVmZmVyZWRJT0Jhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB6ZiwgemluZm8sIHppcDY0KToKKyAgICAgICAgc2VsZi5femluZm8gPSB6aW5mbworICAgICAgICBzZWxmLl96aXA2NCA9IHppcDY0CisgICAgICAgIHNlbGYuX3ppcGZpbGUgPSB6ZgorICAgICAgICBzZWxmLl9jb21wcmVzc29yID0gX2dldF9jb21wcmVzc29yKHppbmZvLmNvbXByZXNzX3R5cGUpCisgICAgICAgIHNlbGYuX2ZpbGVfc2l6ZSA9IDAKKyAgICAgICAgc2VsZi5fY29tcHJlc3Nfc2l6ZSA9IDAKKyAgICAgICAgc2VsZi5fY3JjID0gMAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9maWxlb2JqKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5femlwZmlsZS5mcAorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBuYnl0ZXMgPSBsZW4oZGF0YSkKKyAgICAgICAgc2VsZi5fZmlsZV9zaXplICs9IG5ieXRlcworICAgICAgICBzZWxmLl9jcmMgPSBjcmMzMihkYXRhLCBzZWxmLl9jcmMpCisgICAgICAgIGlmIHNlbGYuX2NvbXByZXNzb3I6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fY29tcHJlc3Nvci5jb21wcmVzcyhkYXRhKQorICAgICAgICAgICAgc2VsZi5fY29tcHJlc3Nfc2l6ZSArPSBsZW4oZGF0YSkKKyAgICAgICAgc2VsZi5fZmlsZW9iai53cml0ZShkYXRhKQorICAgICAgICByZXR1cm4gbmJ5dGVzCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHN1cGVyKCkuY2xvc2UoKQorICAgICAgICAjIEZsdXNoIGFueSBkYXRhIGZyb20gdGhlIGNvbXByZXNzb3IsIGFuZCB1cGRhdGUgaGVhZGVyIGluZm8KKyAgICAgICAgaWYgc2VsZi5fY29tcHJlc3NvcjoKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2NvbXByZXNzb3IuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5fY29tcHJlc3Nfc2l6ZSArPSBsZW4oYnVmKQorICAgICAgICAgICAgc2VsZi5fZmlsZW9iai53cml0ZShidWYpCisgICAgICAgICAgICBzZWxmLl96aW5mby5jb21wcmVzc19zaXplID0gc2VsZi5fY29tcHJlc3Nfc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5femluZm8uY29tcHJlc3Nfc2l6ZSA9IHNlbGYuX2ZpbGVfc2l6ZQorICAgICAgICBzZWxmLl96aW5mby5DUkMgPSBzZWxmLl9jcmMKKyAgICAgICAgc2VsZi5femluZm8uZmlsZV9zaXplID0gc2VsZi5fZmlsZV9zaXplCisKKyAgICAgICAgIyBXcml0ZSB1cGRhdGVkIGhlYWRlciBpbmZvCisgICAgICAgIGlmIHNlbGYuX3ppbmZvLmZsYWdfYml0cyAmIDB4MDg6CisgICAgICAgICAgICAjIFdyaXRlIENSQyBhbmQgZmlsZSBzaXplcyBhZnRlciB0aGUgZmlsZSBkYXRhCisgICAgICAgICAgICBmbXQgPSAnPExRUScgaWYgc2VsZi5femlwNjQgZWxzZSAnPExMTCcKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soZm10LCBzZWxmLl96aW5mby5DUkMsCisgICAgICAgICAgICAgICAgc2VsZi5femluZm8uY29tcHJlc3Nfc2l6ZSwgc2VsZi5femluZm8uZmlsZV9zaXplKSkKKyAgICAgICAgICAgIHNlbGYuX3ppcGZpbGUuc3RhcnRfZGlyID0gc2VsZi5fZmlsZW9iai50ZWxsKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl96aXA2NDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9maWxlX3NpemUgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdGaWxlIHNpemUgdW5leHBlY3RlZGx5IGV4Y2VlZGVkIFpJUDY0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaW1pdCcpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0NvbXByZXNzZWQgc2l6ZSB1bmV4cGVjdGVkbHkgZXhjZWVkZWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1pJUDY0IGxpbWl0JykKKyAgICAgICAgICAgICMgU2VlayBiYWNrd2FyZHMgYW5kIHdyaXRlIGZpbGUgaGVhZGVyICh3aGljaCB3aWxsIG5vdyBpbmNsdWRlCisgICAgICAgICAgICAjIGNvcnJlY3QgQ1JDIGFuZCBmaWxlIHNpemVzKQorCisgICAgICAgICAgICAjIFByZXNlcnZlIGN1cnJlbnQgcG9zaXRpb24gaW4gZmlsZQorICAgICAgICAgICAgc2VsZi5femlwZmlsZS5zdGFydF9kaXIgPSBzZWxmLl9maWxlb2JqLnRlbGwoKQorICAgICAgICAgICAgc2VsZi5fZmlsZW9iai5zZWVrKHNlbGYuX3ppbmZvLmhlYWRlcl9vZmZzZXQpCisgICAgICAgICAgICBzZWxmLl9maWxlb2JqLndyaXRlKHNlbGYuX3ppbmZvLkZpbGVIZWFkZXIoc2VsZi5femlwNjQpKQorICAgICAgICAgICAgc2VsZi5fZmlsZW9iai5zZWVrKHNlbGYuX3ppcGZpbGUuc3RhcnRfZGlyKQorCisgICAgICAgIHNlbGYuX3ppcGZpbGUuX3dyaXRpbmcgPSBGYWxzZQorCisgICAgICAgICMgU3VjY2Vzc2Z1bGx5IHdyaXR0ZW46IEFkZCBmaWxlIHRvIG91ciBjYWNoZXMKKyAgICAgICAgc2VsZi5femlwZmlsZS5maWxlbGlzdC5hcHBlbmQoc2VsZi5femluZm8pCisgICAgICAgIHNlbGYuX3ppcGZpbGUuTmFtZVRvSW5mb1tzZWxmLl96aW5mby5maWxlbmFtZV0gPSBzZWxmLl96aW5mbworCiBjbGFzcyBaaXBGaWxlOgogICAgICIiIiBDbGFzcyB3aXRoIG1ldGhvZHMgdG8gb3BlbiwgcmVhZCwgd3JpdGUsIGNsb3NlLCBsaXN0IHppcCBmaWxlcy4KIApAQCAtMTAyMCw2ICsxMDkzLDcgQEAKICAgICAgICAgc2VsZi5fZmlsZVJlZkNudCA9IDEKICAgICAgICAgc2VsZi5fbG9jayA9IHRocmVhZGluZy5STG9jaygpCiAgICAgICAgIHNlbGYuX3NlZWthYmxlID0gVHJ1ZQorICAgICAgICBzZWxmLl93cml0aW5nID0gRmFsc2UKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpZiBtb2RlID09ICdyJzoKQEAgLTEyMzIsMzAgKzEzMDYsNTUgQEAKICAgICAgICAgd2l0aCBzZWxmLm9wZW4obmFtZSwgInIiLCBwd2QpIGFzIGZwOgogICAgICAgICAgICAgcmV0dXJuIGZwLnJlYWQoKQogCi0gICAgZGVmIG9wZW4oc2VsZiwgbmFtZSwgbW9kZT0iciIsIHB3ZD1Ob25lKToKLSAgICAgICAgIiIiUmV0dXJuIGZpbGUtbGlrZSBvYmplY3QgZm9yICduYW1lJy4iIiIKLSAgICAgICAgaWYgbW9kZSBub3QgaW4gKCJyIiwgIlUiLCAiclUiKToKLSAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignb3BlbigpIHJlcXVpcmVzIG1vZGUgInIiLCAiVSIsIG9yICJyVSInKQotICAgICAgICBpZiAnVScgaW4gbW9kZToKLSAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncwotICAgICAgICAgICAgd2FybmluZ3Mud2FybigiJ1UnIG1vZGUgaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICBkZWYgb3BlbihzZWxmLCBuYW1lLCBtb2RlPSJyIiwgcHdkPU5vbmUsICosIGZvcmNlX3ppcDY0PUZhbHNlKToKKyAgICAgICAgIiIiUmV0dXJuIGZpbGUtbGlrZSBvYmplY3QgZm9yICduYW1lJy4KKworICAgICAgICBuYW1lIGlzIGEgc3RyaW5nIGZvciB0aGUgZmlsZSBuYW1lIHdpdGhpbiB0aGUgWklQIGZpbGUsIG9yIGEgWmlwSW5mbworICAgICAgICBvYmplY3QuCisKKyAgICAgICAgbW9kZSBzaG91bGQgYmUgJ3InIHRvIHJlYWQgYSBmaWxlIGFscmVhZHkgaW4gdGhlIFpJUCBmaWxlLCBvciAndycgdG8KKyAgICAgICAgd3JpdGUgdG8gYSBmaWxlIG5ld2x5IGFkZGVkIHRvIHRoZSBhcmNoaXZlLgorCisgICAgICAgIHB3ZCBpcyB0aGUgcGFzc3dvcmQgdG8gZGVjcnlwdCBmaWxlcyAob25seSB1c2VkIGZvciByZWFkaW5nKS4KKworICAgICAgICBXaGVuIHdyaXRpbmcsIGlmIHRoZSBmaWxlIHNpemUgaXMgbm90IGtub3duIGluIGFkdmFuY2UgYnV0IG1heSBleGNlZWQKKyAgICAgICAgMiBHaUIsIHBhc3MgZm9yY2VfemlwNjQgdG8gdXNlIHRoZSBaSVA2NCBmb3JtYXQsIHdoaWNoIGNhbiBoYW5kbGUgbGFyZ2UKKyAgICAgICAgZmlsZXMuICBJZiB0aGUgc2l6ZSBpcyBrbm93biBpbiBhZHZhbmNlLCBpdCBpcyBiZXN0IHRvIHBhc3MgYSBaaXBJbmZvCisgICAgICAgIGluc3RhbmNlIGZvciBuYW1lLCB3aXRoIHppbmZvLmZpbGVfc2l6ZSBzZXQuCisgICAgICAgICIiIgorICAgICAgICBpZiBtb2RlIG5vdCBpbiB7InIiLCAidyJ9OgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdvcGVuKCkgcmVxdWlyZXMgbW9kZSAiciIgb3IgInciJykKICAgICAgICAgaWYgcHdkIGFuZCBub3QgaXNpbnN0YW5jZShwd2QsIGJ5dGVzKToKICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigicHdkOiBleHBlY3RlZCBieXRlcywgZ290ICVzIiAlIHR5cGUocHdkKSkKKyAgICAgICAgaWYgcHdkIGFuZCAobW9kZSA9PSAidyIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicHdkIGlzIG9ubHkgc3VwcG9ydGVkIGZvciByZWFkaW5nIGZpbGVzIikKICAgICAgICAgaWYgbm90IHNlbGYuZnA6CiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCi0gICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gcmVhZCBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIpCisgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gdXNlIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKIAogICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGluZm8gb2JqZWN0CiAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgWmlwSW5mbyk6CiAgICAgICAgICAgICAjICduYW1lJyBpcyBhbHJlYWR5IGFuIGluZm8gb2JqZWN0CiAgICAgICAgICAgICB6aW5mbyA9IG5hbWUKKyAgICAgICAgZWxpZiBtb2RlID09ICd3JzoKKyAgICAgICAgICAgIHppbmZvID0gWmlwSW5mbyhuYW1lKQorICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgR2V0IGluZm8gb2JqZWN0IGZvciBuYW1lCiAgICAgICAgICAgICB6aW5mbyA9IHNlbGYuZ2V0aW5mbyhuYW1lKQogCisgICAgICAgIGlmIG1vZGUgPT0gJ3cnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29wZW5fdG9fd3JpdGUoemluZm8sIGZvcmNlX3ppcDY0PWZvcmNlX3ppcDY0KQorCisgICAgICAgIGlmIHNlbGYuX3dyaXRpbmc6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbid0IHJlYWQgZnJvbSB0aGUgWklQIGZpbGUgd2hpbGUgdGhlcmUgIgorICAgICAgICAgICAgICAgICAgICAiaXMgYW4gb3BlbiB3cml0aW5nIGhhbmRsZSBvbiBpdC4gIgorICAgICAgICAgICAgICAgICAgICAiQ2xvc2UgdGhlIHdyaXRpbmcgaGFuZGxlIGJlZm9yZSB0cnlpbmcgdG8gcmVhZC4iKQorCisgICAgICAgICMgT3BlbiBmb3IgcmVhZGluZzoKICAgICAgICAgc2VsZi5fZmlsZVJlZkNudCArPSAxCi0gICAgICAgIHplZl9maWxlID0gX1NoYXJlZEZpbGUoc2VsZi5mcCwgemluZm8uaGVhZGVyX29mZnNldCwgc2VsZi5fZnBjbG9zZSwgc2VsZi5fbG9jaykKKyAgICAgICAgemVmX2ZpbGUgPSBfU2hhcmVkRmlsZShzZWxmLmZwLCB6aW5mby5oZWFkZXJfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZwY2xvc2UsIHNlbGYuX2xvY2ssIGxhbWJkYTogc2VsZi5fd3JpdGluZykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIyBTa2lwIHRoZSBmaWxlIGhlYWRlcjoKICAgICAgICAgICAgIGZoZWFkZXIgPSB6ZWZfZmlsZS5yZWFkKHNpemVGaWxlSGVhZGVyKQpAQCAtMTMyMCw2ICsxNDE5LDQ5IEBACiAgICAgICAgICAgICB6ZWZfZmlsZS5jbG9zZSgpCiAgICAgICAgICAgICByYWlzZQogCisgICAgZGVmIF9vcGVuX3RvX3dyaXRlKHNlbGYsIHppbmZvLCBmb3JjZV96aXA2ND1GYWxzZSk6CisgICAgICAgIGlmIGZvcmNlX3ppcDY0IGFuZCBub3Qgc2VsZi5fYWxsb3daaXA2NDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgImZvcmNlX3ppcDY0IGlzIFRydWUsIGJ1dCBhbGxvd1ppcDY0IHdhcyBGYWxzZSB3aGVuIG9wZW5pbmcgIgorICAgICAgICAgICAgICAgICJ0aGUgWklQIGZpbGUuIgorICAgICAgICAgICAgKQorICAgICAgICBpZiBzZWxmLl93cml0aW5nOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW4ndCB3cml0ZSB0byB0aGUgWklQIGZpbGUgd2hpbGUgdGhlcmUgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbm90aGVyIHdyaXRlIGhhbmRsZSBvcGVuIG9uIGl0LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNsb3NlIHRoZSBmaXJzdCBoYW5kbGUgYmVmb3JlIG9wZW5pbmcgYW5vdGhlci4iKQorCisgICAgICAgICMgU2l6ZXMgYW5kIENSQyBhcmUgb3ZlcndyaXR0ZW4gd2l0aCBjb3JyZWN0IGRhdGEgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZmlsZQorICAgICAgICBpZiBub3QgaGFzYXR0cih6aW5mbywgJ2ZpbGVfc2l6ZScpOgorICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gMAorICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gMAorICAgICAgICB6aW5mby5DUkMgPSAwCisKKyAgICAgICAgemluZm8uZmxhZ19iaXRzID0gMHgwMAorICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlID09IFpJUF9MWk1BOgorICAgICAgICAgICAgIyBDb21wcmVzc2VkIGRhdGEgaW5jbHVkZXMgYW4gZW5kLW9mLXN0cmVhbSAoRU9TKSBtYXJrZXIKKyAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDAyCisgICAgICAgIGlmIG5vdCBzZWxmLl9zZWVrYWJsZToKKyAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cyB8PSAweDA4CisKKyAgICAgICAgaWYgbm90IHppbmZvLmV4dGVybmFsX2F0dHI6CisgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gMG82MDAgPDwgMTYgICMgcGVybWlzc2lvbnM6ID9ydy0tLS0tLS0KKworICAgICAgICAjIENvbXByZXNzZWQgc2l6ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdW5jb21wcmVzc2VkIHNpemUKKyAgICAgICAgemlwNjQgPSBzZWxmLl9hbGxvd1ppcDY0IGFuZCBcCisgICAgICAgICAgICAgICAgKGZvcmNlX3ppcDY0IG9yIHppbmZvLmZpbGVfc2l6ZSAqIDEuMDUgPiBaSVA2NF9MSU1JVCkKKworICAgICAgICBpZiBzZWxmLl9zZWVrYWJsZToKKyAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0X2RpcikKKyAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpCisKKyAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorCisgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCisKKyAgICAgICAgc2VsZi5fd3JpdGluZyA9IFRydWUKKyAgICAgICAgcmV0dXJuIF9aaXBXcml0ZUZpbGUoc2VsZiwgemluZm8sIHppcDY0KQorCiAgICAgZGVmIGV4dHJhY3Qoc2VsZiwgbWVtYmVyLCBwYXRoPU5vbmUsIHB3ZD1Ob25lKToKICAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LAogICAgICAgICAgICB1c2luZyBpdHMgZnVsbCBuYW1lLiBJdHMgZmlsZSBpbmZvcm1hdGlvbiBpcyBleHRyYWN0ZWQgYXMgYWNjdXJhdGVseQpAQCAtMTM4OSw3ICsxNTMxLDcgQEAKICAgICAgICAgaWYgdXBwZXJkaXJzIGFuZCBub3Qgb3MucGF0aC5leGlzdHModXBwZXJkaXJzKToKICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHVwcGVyZGlycykKIAotICAgICAgICBpZiBtZW1iZXIuZmlsZW5hbWVbLTFdID09ICcvJzoKKyAgICAgICAgaWYgbWVtYmVyLmlzX2RpcigpOgogICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIodGFyZ2V0cGF0aCk6CiAgICAgICAgICAgICAgICAgb3MubWtkaXIodGFyZ2V0cGF0aCkKICAgICAgICAgICAgIHJldHVybiB0YXJnZXRwYXRoCkBAIC0xNDI5LDEwMyArMTU3MSw0MSBAQAogICAgICAgICBpZiBub3Qgc2VsZi5mcDoKICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB3cml0ZSB0byBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIpCisgICAgICAgIGlmIHNlbGYuX3dyaXRpbmc6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHdyaXRlIHRvIFpJUCBhcmNoaXZlIHdoaWxlIGFuIG9wZW4gd3JpdGluZyBoYW5kbGUgZXhpc3RzIgorICAgICAgICAgICAgKQogCi0gICAgICAgIHN0ID0gb3Muc3RhdChmaWxlbmFtZSkKLSAgICAgICAgaXNkaXIgPSBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSkKLSAgICAgICAgbXRpbWUgPSB0aW1lLmxvY2FsdGltZShzdC5zdF9tdGltZSkKLSAgICAgICAgZGF0ZV90aW1lID0gbXRpbWVbMDo2XQotICAgICAgICAjIENyZWF0ZSBaaXBJbmZvIGluc3RhbmNlIHRvIHN0b3JlIGZpbGUgaW5mb3JtYXRpb24KLSAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgotICAgICAgICAgICAgYXJjbmFtZSA9IGZpbGVuYW1lCi0gICAgICAgIGFyY25hbWUgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguc3BsaXRkcml2ZShhcmNuYW1lKVsxXSkKLSAgICAgICAgd2hpbGUgYXJjbmFtZVswXSBpbiAob3Muc2VwLCBvcy5hbHRzZXApOgotICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWVbMTpdCi0gICAgICAgIGlmIGlzZGlyOgotICAgICAgICAgICAgYXJjbmFtZSArPSAnLycKLSAgICAgICAgemluZm8gPSBaaXBJbmZvKGFyY25hbWUsIGRhdGVfdGltZSkKLSAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciA9IChzdFswXSAmIDB4RkZGRikgPDwgMTYgICAgICAjIFVuaXggYXR0cmlidXRlcwotICAgICAgICBpZiBpc2RpcjoKLSAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBaSVBfU1RPUkVECi0gICAgICAgIGVsaWYgY29tcHJlc3NfdHlwZSBpcyBOb25lOgotICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KKyAgICAgICAgemluZm8gPSBaaXBJbmZvLmZyb21fZmlsZShmaWxlbmFtZSwgYXJjbmFtZSkKKworICAgICAgICBpZiB6aW5mby5pc19kaXIoKToKKyAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSAwCisgICAgICAgICAgICB6aW5mby5DUkMgPSAwCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gY29tcHJlc3NfdHlwZQorICAgICAgICAgICAgaWYgY29tcHJlc3NfdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gY29tcHJlc3NfdHlwZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgogCi0gICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IHN0LnN0X3NpemUKLSAgICAgICAgemluZm8uZmxhZ19iaXRzID0gMHgwMAotICAgICAgICB3aXRoIHNlbGYuX2xvY2s6Ci0gICAgICAgICAgICBpZiBzZWxmLl9zZWVrYWJsZToKLSAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydF9kaXIpCi0gICAgICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgYnl0ZXMKLSAgICAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0xaTUE6CisgICAgICAgIGlmIHppbmZvLmlzX2RpcigpOgorICAgICAgICAgICAgd2l0aCBzZWxmLl9sb2NrOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NlZWthYmxlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydF9kaXIpCisgICAgICAgICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAjIFN0YXJ0IG9mIGhlYWRlciBieXRlcworICAgICAgICAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0xaTUE6CiAgICAgICAgICAgICAgICAgIyBDb21wcmVzc2VkIGRhdGEgaW5jbHVkZXMgYW4gZW5kLW9mLXN0cmVhbSAoRU9TKSBtYXJrZXIKLSAgICAgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMgfD0gMHgwMgorICAgICAgICAgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMgfD0gMHgwMgogCi0gICAgICAgICAgICBzZWxmLl93cml0ZWNoZWNrKHppbmZvKQotICAgICAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCisgICAgICAgICAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQogCi0gICAgICAgICAgICBpZiBpc2RpcjoKLSAgICAgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSAwCi0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IDAKLSAgICAgICAgICAgICAgICB6aW5mby5DUkMgPSAwCi0gICAgICAgICAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciB8PSAweDEwICAjIE1TLURPUyBkaXJlY3RvcnkgZmxhZwogICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHppbmZvKQogICAgICAgICAgICAgICAgIHNlbGYuTmFtZVRvSW5mb1t6aW5mby5maWxlbmFtZV0gPSB6aW5mbwogICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcihGYWxzZSkpCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydF9kaXIgPSBzZWxmLmZwLnRlbGwoKQotICAgICAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgICAgICBjbXByID0gX2dldF9jb21wcmVzc29yKHppbmZvLmNvbXByZXNzX3R5cGUpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5fc2Vla2FibGU6Ci0gICAgICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzIHw9IDB4MDgKLSAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInJiIikgYXMgZnA6Ci0gICAgICAgICAgICAgICAgIyBNdXN0IG92ZXJ3cml0ZSBDUkMgYW5kIHNpemVzIHdpdGggY29ycmVjdCBkYXRhIGxhdGVyCi0gICAgICAgICAgICAgICAgemluZm8uQ1JDID0gQ1JDID0gMAotICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplID0gMAotICAgICAgICAgICAgICAgICMgQ29tcHJlc3NlZCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB1bmNvbXByZXNzZWQgc2l6ZQotICAgICAgICAgICAgICAgIHppcDY0ID0gc2VsZi5fYWxsb3daaXA2NCBhbmQgXAotICAgICAgICAgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgKiAxLjA1ID4gWklQNjRfTElNSVQKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoemlwNjQpKQotICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IDAKLSAgICAgICAgICAgICAgICB3aGlsZSAxOgotICAgICAgICAgICAgICAgICAgICBidWYgPSBmcC5yZWFkKDEwMjQgKiA4KQotICAgICAgICAgICAgICAgICAgICBpZiBub3QgYnVmOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gZmlsZV9zaXplICsgbGVuKGJ1ZikKLSAgICAgICAgICAgICAgICAgICAgQ1JDID0gY3JjMzIoYnVmLCBDUkMpCi0gICAgICAgICAgICAgICAgICAgIGlmIGNtcHI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBjbXByLmNvbXByZXNzKGJ1ZikKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplICsgbGVuKGJ1ZikKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShidWYpCi0gICAgICAgICAgICBpZiBjbXByOgotICAgICAgICAgICAgICAgIGJ1ZiA9IGNtcHIuZmx1c2goKQotICAgICAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplICsgbGVuKGJ1ZikKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGJ1ZikKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gY29tcHJlc3Nfc2l6ZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gZmlsZV9zaXplCi0gICAgICAgICAgICB6aW5mby5DUkMgPSBDUkMKLSAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IGZpbGVfc2l6ZQotICAgICAgICAgICAgaWYgemluZm8uZmxhZ19iaXRzICYgMHgwODoKLSAgICAgICAgICAgICAgICAjIFdyaXRlIENSQyBhbmQgZmlsZSBzaXplcyBhZnRlciB0aGUgZmlsZSBkYXRhCi0gICAgICAgICAgICAgICAgZm10ID0gJzxMUVEnIGlmIHppcDY0IGVsc2UgJzxMTEwnCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShzdHJ1Y3QucGFjayhmbXQsIHppbmZvLkNSQywgemluZm8uY29tcHJlc3Nfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSkpCi0gICAgICAgICAgICAgICAgc2VsZi5zdGFydF9kaXIgPSBzZWxmLmZwLnRlbGwoKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBub3QgemlwNjQgYW5kIHNlbGYuX2FsbG93WmlwNjQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIGZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUOgotICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdGaWxlIHNpemUgaGFzIGluY3JlYXNlZCBkdXJpbmcgY29tcHJlc3NpbmcnKQotICAgICAgICAgICAgICAgICAgICBpZiBjb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0NvbXByZXNzZWQgc2l6ZSBsYXJnZXIgdGhhbiB1bmNvbXByZXNzZWQgc2l6ZScpCi0gICAgICAgICAgICAgICAgIyBTZWVrIGJhY2t3YXJkcyBhbmQgd3JpdGUgZmlsZSBoZWFkZXIgKHdoaWNoIHdpbGwgbm93IGluY2x1ZGUKLSAgICAgICAgICAgICAgICAjIGNvcnJlY3QgQ1JDIGFuZCBmaWxlIHNpemVzKQotICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRfZGlyID0gc2VsZi5mcC50ZWxsKCkgIyBQcmVzZXJ2ZSBjdXJyZW50IHBvc2l0aW9uIGluIGZpbGUKLSAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsoemluZm8uaGVhZGVyX29mZnNldCkKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoemlwNjQpKQotICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0X2RpcikKLSAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHppbmZvKQotICAgICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3ppbmZvLmZpbGVuYW1lXSA9IHppbmZvCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIpIGFzIHNyYywgc2VsZi5vcGVuKHppbmZvLCAndycpIGFzIGRlc3Q6CisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKHNyYywgZGVzdCwgMTAyNCo4KQogCiAgICAgZGVmIHdyaXRlc3RyKHNlbGYsIHppbmZvX29yX2FyY25hbWUsIGRhdGEsIGNvbXByZXNzX3R5cGU9Tm9uZSk6CiAgICAgICAgICIiIldyaXRlIGEgZmlsZSBpbnRvIHRoZSBhcmNoaXZlLiAgVGhlIGNvbnRlbnRzIGlzICdkYXRhJywgd2hpY2gKQEAgLTE1NTAsNDUgKzE2MzAsMTggQEAKICAgICAgICAgaWYgbm90IHNlbGYuZnA6CiAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCiAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gd3JpdGUgdG8gWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiKQorICAgICAgICBpZiBzZWxmLl93cml0aW5nOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICAgICAgICJDYW4ndCB3cml0ZSB0byBaSVAgYXJjaGl2ZSB3aGlsZSBhbiBvcGVuIHdyaXRpbmcgaGFuZGxlIGV4aXN0cy4iCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgY29tcHJlc3NfdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCiAKICAgICAgICAgemluZm8uZmlsZV9zaXplID0gbGVuKGRhdGEpICAgICAgICAgICAgIyBVbmNvbXByZXNzZWQgc2l6ZQogICAgICAgICB3aXRoIHNlbGYuX2xvY2s6Ci0gICAgICAgICAgICBpZiBzZWxmLl9zZWVrYWJsZToKLSAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydF9kaXIpCi0gICAgICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgZGF0YQotICAgICAgICAgICAgaWYgY29tcHJlc3NfdHlwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gY29tcHJlc3NfdHlwZQotICAgICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGRhdGEKLSAgICAgICAgICAgIGlmIGNvbXByZXNzX3R5cGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKLSAgICAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0xaTUE6Ci0gICAgICAgICAgICAgICAgIyBDb21wcmVzc2VkIGRhdGEgaW5jbHVkZXMgYW4gZW5kLW9mLXN0cmVhbSAoRU9TKSBtYXJrZXIKLSAgICAgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMgfD0gMHgwMgotCi0gICAgICAgICAgICBzZWxmLl93cml0ZWNoZWNrKHppbmZvKQotICAgICAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQotICAgICAgICAgICAgemluZm8uQ1JDID0gY3JjMzIoZGF0YSkgICAgICAgIyBDUkMtMzIgY2hlY2tzdW0KLSAgICAgICAgICAgIGNvID0gX2dldF9jb21wcmVzc29yKHppbmZvLmNvbXByZXNzX3R5cGUpCi0gICAgICAgICAgICBpZiBjbzoKLSAgICAgICAgICAgICAgICBkYXRhID0gY28uY29tcHJlc3MoZGF0YSkgKyBjby5mbHVzaCgpCi0gICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGxlbihkYXRhKSAgICAjIENvbXByZXNzZWQgc2l6ZQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gemluZm8uZmlsZV9zaXplCi0gICAgICAgICAgICB6aXA2NCA9IHppbmZvLmZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUIG9yIFwKLSAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID4gWklQNjRfTElNSVQKLSAgICAgICAgICAgIGlmIHppcDY0IGFuZCBub3Qgc2VsZi5fYWxsb3daaXA2NDoKLSAgICAgICAgICAgICAgICByYWlzZSBMYXJnZVppcEZpbGUoIkZpbGVzaXplIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucyIpCi0gICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoemlwNjQpKQotICAgICAgICAgICAgc2VsZi5mcC53cml0ZShkYXRhKQotICAgICAgICAgICAgaWYgemluZm8uZmxhZ19iaXRzICYgMHgwODoKLSAgICAgICAgICAgICAgICAjIFdyaXRlIENSQyBhbmQgZmlsZSBzaXplcyBhZnRlciB0aGUgZmlsZSBkYXRhCi0gICAgICAgICAgICAgICAgZm10ID0gJzxMUVEnIGlmIHppcDY0IGVsc2UgJzxMTEwnCi0gICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShzdHJ1Y3QucGFjayhmbXQsIHppbmZvLkNSQywgemluZm8uY29tcHJlc3Nfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSkpCi0gICAgICAgICAgICBzZWxmLmZwLmZsdXNoKCkKLSAgICAgICAgICAgIHNlbGYuc3RhcnRfZGlyID0gc2VsZi5mcC50ZWxsKCkKLSAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHppbmZvKQotICAgICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3ppbmZvLmZpbGVuYW1lXSA9IHppbmZvCisgICAgICAgICAgICB3aXRoIHNlbGYub3Blbih6aW5mbywgbW9kZT0ndycpIGFzIGRlc3Q6CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZShkYXRhKQogCiAgICAgZGVmIF9fZGVsX18oc2VsZik6CiAgICAgICAgICIiIkNhbGwgdGhlICJjbG9zZSgpIiBtZXRob2QgaW4gY2FzZSB0aGUgdXNlciBmb3Jnb3QuIiIiCkBAIC0xNjAwLDYgKzE2NTMsMTEgQEAKICAgICAgICAgaWYgc2VsZi5mcCBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCiAKKyAgICAgICAgaWYgc2VsZi5fd3JpdGluZzoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2FuJ3QgY2xvc2UgdGhlIFpJUCBmaWxlIHdoaWxlIHRoZXJlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW4gb3BlbiB3cml0aW5nIGhhbmRsZSBvbiBpdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbG9zZSB0aGUgd3JpdGluZyBoYW5kbGUgYmVmb3JlIGNsb3NpbmcgdGhlIHppcC4iKQorCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGlmIHNlbGYubW9kZSBpbiAoJ3cnLCAneCcsICdhJykgYW5kIHNlbGYuX2RpZE1vZGlmeTogIyB3cml0ZSBlbmRpbmcgcmVjb3JkcwogICAgICAgICAgICAgICAgIHdpdGggc2VsZi5fbG9jazoKZGlmZiAtLWdpdCBhL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvUmVhZE1lLnJ0ZiBiL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvUmVhZE1lLnJ0ZgppbmRleCA2NWUzZjE0Li4xYWYyNDUxIDEwMDY0NAotLS0gYS9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1JlYWRNZS5ydGYKKysrIGIvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9SZWFkTWUucnRmCkBAIC0xLDI5ICsxLDI1IEBACi17XHJ0ZjFcYW5zaVxhbnNpY3BnMTI1Mlxjb2NvYXJ0ZjEzNDhcY29jb2FzdWJydGYxNzAKK3tccnRmMVxhbnNpXGFuc2ljcGcxMjUyXGNvY29hcnRmMTQwNFxjb2NvYXN1YnJ0ZjQ2MAoge1xmb250dGJsXGYwXGZzd2lzc1xmY2hhcnNldDAgSGVsdmV0aWNhO1xmMVxmbW9kZXJuXGZjaGFyc2V0MCBDb3VyaWVyTmV3UFNNVDt9CiB7XGNvbG9ydGJsO1xyZWQyNTVcZ3JlZW4yNTVcYmx1ZTI1NTt9CiBcbWFyZ2wxNDQwXG1hcmdyMTQ0MFx2aWV3dzEzMzgwXHZpZXdoMTQ2MDBcdmlld2tpbmQwCi1ccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHBhcmRpcm5hdHVyYWwKK1xwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbFxwYXJ0aWdodGVuZmFjdG9yMAogCiBcZjBcZnMyNCBcY2YwIFRoaXMgcGFja2FnZSB3aWxsIGluc3RhbGwgUHl0aG9uICRGVUxMX1ZFUlNJT04gZm9yIE1hYyBPUyBYICRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgZm9yIHRoZSBmb2xsb3dpbmcgYXJjaGl0ZWN0dXJlKHMpOiAkQVJDSElURUNUVVJFUy5cCiBcCi1ccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHBhcmRpcm5hdHVyYWwKK1xwYXJkXHR4NzIwXHR4MTQ0MFx0eDIxNjBcdHgyODgwXHR4MzYwMFx0eDQzMjBcdHg1MDQwXHR4NTc2MFx0eDY0ODBcdHg3MjAwXHR4NzkyMFx0eDg2NDBccGFyZGlybmF0dXJhbFxwYXJ0aWdodGVuZmFjdG9yMAogCiBcYiBcY2YwIFx1bCBcdWxjMCBXaGljaCBpbnN0YWxsZXIgdmFyaWFudCBzaG91bGQgSSB1c2U/CiBcYjAgXHVsbm9uZSBcCiBcCi1QeXRob24ub3JnIHByb3ZpZGVzIHR3byBpbnN0YWxsZXIgdmFyaWFudHMgZm9yIGRvd25sb2FkOiBvbmUgdGhhdCBpbnN0YWxscyBhIAorRm9yIHRoZSBpbml0aWFsIGFscGhhIHJlbGVhc2VzIG9mIFB5dGhvbiAzLjYsIFB5dGhvbi5vcmcgcHJvdmlkZXMgb25seSBvbmUgaW5zdGFsbGVyIHZhcmlhbnQgZm9yIGRvd25sb2FkOiBvbmUgdGhhdCBpbnN0YWxscyBhIAogXGkgNjQtYml0LzMyLWJpdCBJbnRlbAogXGkwICBQeXRob24gY2FwYWJsZSBvZiBydW5uaW5nIG9uIAogXGkgTWFjIE9TIFggMTAuNiAoU25vdyBMZW9wYXJkKQotXGkwICBvciBsYXRlcjsgYW5kIG9uZSB0aGF0IGluc3RhbGxzIGEgCi1caSAzMi1iaXQtb25seSAoSW50ZWwgYW5kIFBQQykKLVxpMCAgUHl0aG9uIGNhcGFibGUgb2YgcnVubmluZyBvbiAKLVxpIE1hYyBPUyBYIDEwLjUgKExlb3BhcmQpCi1caTAgIG9yIGxhdGVyLiAgVGhpcyBSZWFkTWUgd2FzIGluc3RhbGxlZCB3aXRoIHRoZSAKK1xpMCAgb3IgbGF0ZXIuICBUaGlzIHdpbGwgY2hhbmdlIHByaW9yIHRvIHRoZSBiZXRhIHJlbGVhc2VzIG9mIDMuNi4wLiAgVGhpcyBSZWFkTWUgd2FzIGluc3RhbGxlZCB3aXRoIHRoZSAKIFxpICRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQKLVxpMCAgdmFyaWFudC4gIFVubGVzcyB5b3UgYXJlIGluc3RhbGxpbmcgdG8gYW4gMTAuNSBzeXN0ZW0gb3IgeW91IG5lZWQgdG8gYnVpbGQgYXBwbGljYXRpb25zIHRoYXQgY2FuIHJ1biBvbiAxMC41IHN5c3RlbXMsIHVzZSB0aGUgMTAuNiB2YXJpYW50IGlmIHBvc3NpYmxlLiAgVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCBvcGVyYXRpbmcgc3lzdGVtIGZ1bmN0aW9ucyB0aGF0IGFyZSBzdXBwb3J0ZWQgc3RhcnRpbmcgd2l0aCAxMC42IGFuZCB5b3UgbWF5IHNlZSBiZXR0ZXIgcGVyZm9ybWFuY2UgdXNpbmcgNjQtYml0IG1vZGUuICBCeSBkZWZhdWx0LCBQeXRob24gd2lsbCBhdXRvbWF0aWNhbGx5IHJ1biBpbiA2NC1iaXQgbW9kZSBpZiB5b3VyIHN5c3RlbSBzdXBwb3J0cyBpdC4gIEFsc28gc2VlIAorXGkwICB2YXJpYW50LiAgQnkgZGVmYXVsdCwgUHl0aG9uIHdpbGwgYXV0b21hdGljYWxseSBydW4gaW4gNjQtYml0IG1vZGUgaWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgaXQuICBBbHNvIHNlZSAKIFxpIENlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhbmQgT3BlblNTTAotXGkwICBiZWxvdy4gIFRoZSBQeXRob25zIGluc3RhbGxlZCBieSB0aGVzZSBpbnN0YWxsZXJzIGFyZSBidWlsdCB3aXRoIHByaXZhdGUgY29waWVzIG9mIHNvbWUgdGhpcmQtcGFydHkgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCB3aXRoIG9yIG5ld2VyIHRoYW4gdGhvc2UgaW4gT1MgWCBpdHNlbGYuICBUaGUgbGlzdCBvZiB0aGVzZSBsaWJyYXJpZXMgdmFyaWVzIGJ5IGluc3RhbGxlciB2YXJpYW50IGFuZCBpcyBpbmNsdWRlZCBhdCB0aGUgZW5kIG9mIHRoZSBMaWNlbnNlLnJ0ZiBmaWxlLgorXGkwICBiZWxvdy4gIFRoZSBQeXRob25zIGluc3RhbGxlZCBieSB0aGlzIGluc3RhbGxlciBpcyBidWlsdCB3aXRoIHByaXZhdGUgY29waWVzIG9mIHNvbWUgdGhpcmQtcGFydHkgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCB3aXRoIG9yIG5ld2VyIHRoYW4gdGhvc2UgaW4gT1MgWCBpdHNlbGYuICBUaGUgbGlzdCBvZiB0aGVzZSBsaWJyYXJpZXMgdmFyaWVzIGJ5IGluc3RhbGxlciB2YXJpYW50IGFuZCBpcyBpbmNsdWRlZCBhdCB0aGUgZW5kIG9mIHRoZSBMaWNlbnNlLnJ0ZiBmaWxlLgogXGIgXHVsIFwKIFwKIFVwZGF0ZSB5b3VyIHZlcnNpb24gb2YgVGNsL1RrIHRvIHVzZSBJRExFIG9yIG90aGVyIFRrIGFwcGxpY2F0aW9ucwpAQCAtMzMsMTMgKzI5LDEzIEBACiBcaSBUY2wvVGsKIFxpMCAgZnJhbWV3b3Jrcy4gIFZpc2l0IHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvbWFjL3RjbHRrLyJ9fXtcZmxkcnNsdCBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL21hYy90Y2x0ay99fSBmb3IgY3VycmVudCBpbmZvcm1hdGlvbiBhYm91dCBzdXBwb3J0ZWQgYW5kIHJlY29tbWVuZGVkIHZlcnNpb25zIG9mIAogXGkgVGNsL1RrCi1caTAgIGZvciB0aGlzIHZlcnNpb24gb2YgUHl0aG9uIGFuZCBvZiBNYWMgT1MgWC5cCitcaTAgIGZvciB0aGlzIHZlcnNpb24gb2YgUHl0aG9uIGFuZCBvZiBNYWMgT1MgWC4gIEZvciB0aGUgaW5pdGlhbCBhbHBoYSByZWxlYXNlcyBvZiBQeXRob24gMy42LCB0aGUgaW5zdGFsbGVyIGlzIGxpbmtlZCB3aXRoIFRjbC9UayA4LjU7IHRoaXMgd2lsbCBjaGFuZ2UgcHJpb3IgdG8gdGhlIGJldGEgcmVsZWFzZXMgb2YgMy42LjAuXAogCiBcYiBcdWwgXAogQ2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGFuZCBPcGVuU1NMXAogCiBcYjAgXHVsbm9uZSBcCi1QeXRob24gMy41IGluY2x1ZGVzIGEgbnVtYmVyIG9mIG5ldHdvcmsgc2VjdXJpdHkgZW5oYW5jZW1lbnRzIHRoYXQgd2VyZSByZWxlYXNlZCBpbiBQeXRob24gMy40LjMgYW5kIFB5dGhvbiAyLjcuMTAuICB7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDc2LyJ9fXtcZmxkcnNsdCBQRVAgNDc2fX0gY2hhbmdlcyBzZXZlcmFsIHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlcywgbGlrZSAKK1B5dGhvbiAzLjYgaW5jbHVkZXMgYSBudW1iZXIgb2YgbmV0d29yayBzZWN1cml0eSBlbmhhbmNlbWVudHMgdGhhdCB3ZXJlIHJlbGVhc2VkIGluIFB5dGhvbiAzLjQuMyBhbmQgUHl0aG9uIDIuNy4xMC4gIHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0NzYvIn19e1xmbGRyc2x0IFBFUCA0NzZ9fSBjaGFuZ2VzIHNldmVyYWwgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGVzLCBsaWtlIAogXGkgaHR0cGxpYgogXGkwICwgCiBcaSB1cmxsaWIKQEAgLTUxLDU2ICs0NywzMyBAQAogXGkgc2VjdXJpdHkKIFxpMCAgY29tbWFuZCBsaW5lIHV0aWxpdHkuXAogXAotRm9yIE9TIFggMTAuNSwgQXBwbGUgcHJvdmlkZXMgCi1caSBPcGVuU1NMIDAuOS43Ci1caTAgIGxpYnJhcmllcy4gIFRoaXMgdmVyc2lvbiBvZiBBcHBsZSdzIE9wZW5TU0wgCi1cYiBkb2VzIG5vdAotXGIwICB1c2UgdGhlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBzeXN0ZW0gc2VjdXJpdHkgZnJhbWV3b3JrLCBldmVuIHdoZW4gdXNlZCBvbiBuZXdlciB2ZXJzaW9ucyBvZiBPUyBYLiAgSW5zdGVhZCBpdCBjb25zdWx0cyBhIHRyYWRpdGlvbmFsIE9wZW5TU0wgY29uY2F0ZW5hdGVkIGNlcnRpZmljYXRlIGZpbGUgKAotXGkgY2FmaWxlCi1caTAgKSBvciBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnkgKAotXGkgY2FwYXRoCi1caTAgKSwgbG9jYXRlZCBpbiAKLVxmMSAvU3lzdGVtL0xpYnJhcnkvT3BlblNTTAotXGYwIC4gIFRoZXNlIGRpcmVjdG9yaWVzIGFyZSB0eXBpY2FsbHkgZW1wdHkgYW5kIG5vdCBtYW5hZ2VkIGJ5IE9TIFg7IHlvdSBtdXN0IG1hbmFnZSB0aGVtIHlvdXJzZWxmIG9yIHN1cHBseSB5b3VyIG93biBTU0wgY29udGV4dHMuICBPcGVuU1NMIDAuOS43IGlzIG9ic29sZXRlIGJ5IGN1cnJlbnQgc2VjdXJpdHkgc3RhbmRhcmRzLCBsYWNraW5nIGEgbnVtYmVyIG9mIGltcG9ydGFudCBmZWF0dXJlcyBmb3VuZCBpbiBsYXRlciB2ZXJzaW9ucy4gIEFtb25nIHRoZSBwcm9ibGVtcyB0aGlzIGNhdXNlcyBpcyB0aGUgaW5hYmlsaXR5IHRvIHZlcmlmeSBoaWdoZXItc2VjdXJpdHkgY2VydGlmaWNhdGVzIG5vdyB1c2VkIGJ5IHB5dGhvbi5vcmcgc2VydmljZXMsIGluY2x1ZGluZyAKLVxpIHR7XGZpZWxke1wqXGZsZGluc3R7SFlQRVJMSU5LICJodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpIn19e1xmbGRyc2x0IGhlIFB5dGhvbiBQYWNrYWdlIEluZGV4LCBQeVBJfX0KLVxpMCAuICBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHRoZSAKLVxpIDEwLjUrIDMyLWJpdC1vbmx5IHB5dGhvbi5vcmcgdmFyaWFudAotXGkwICBpcyBsaW5rZWQgd2l0aCBhIHByaXZhdGUgY29weSBvZiAKLVxpIE9wZW5TU0wgMS4wLjIKLVxpMCA7IGl0IGNvbnN1bHRzIHRoZSBzYW1lIGRlZmF1bHQgY2VydGlmaWNhdGUgZGlyZWN0b3J5LCAKLVxmMSAvU3lzdGVtL0xpYnJhcnkvT3BlblNTTAotXGYwIC4gICBBcyBiZWZvcmUsIGl0IGlzIHN0aWxsIG5lY2Vzc2FyeSB0byBtYW5hZ2UgY2VydGlmaWNhdGVzIHlvdXJzZWxmIHdoZW4geW91IHVzZSB0aGlzIFB5dGhvbiB2YXJpYW50IGFuZCwgd2l0aCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gbm93IGVuYWJsZWQgYnkgZGVmYXVsdCwgeW91IG1heSBub3cgbmVlZCB0byB0YWtlIGFkZGl0aW9uYWwgc3RlcHMgdG8gZW5zdXJlIHlvdXIgUHl0aG9uIHByb2dyYW1zIGhhdmUgYWNjZXNzIHRvIENBIGNlcnRpZmljYXRlcyB5b3UgdHJ1c3QuICBJZiB5b3UgdXNlIHRoaXMgUHl0aG9uIHZhcmlhbnQgdG8gYnVpbGQgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMgd2l0aCB0aGlyZC1wYXJ0eSB0b29scyBsaWtlIHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGkvcHkyYXBwLyJ9fXtcZmxkcnNsdCAKLVxmMSBweTJhcHB9fSwgeW91IG1heSBub3cgbmVlZCB0byBidW5kbGUgQ0EgY2VydGlmaWNhdGVzIGluIHRoZW0gb3Igb3RoZXJ3aXNlIHN1cHBseSBub24tZGVmYXVsdCBTU0wgY29udGV4dHMuXAotXAogRm9yIE9TIFggMTAuNissIEFwcGxlIGFsc28gcHJvdmlkZXMgCiBcaSBPcGVuU1NMCiBcaTAgIAogXGkgMC45LjggbGlicmFyaWVzCiBcaTAgLiAgQXBwbGUncyAwLjkuOCB2ZXJzaW9uIGluY2x1ZGVzIGFuIGltcG9ydGFudCBhZGRpdGlvbmFsIGZlYXR1cmU6IGlmIGEgY2VydGlmaWNhdGUgY2Fubm90IGJlIHZlcmlmaWVkIHVzaW5nIHRoZSBtYW51YWxseSBhZG1pbmlzdGVyZWQgY2VydGlmaWNhdGVzIGluIAogXGYxIC9TeXN0ZW0vTGlicmFyeS9PcGVuU1NMCi1cZjAgLCB0aGUgY2VydGlmaWNhdGVzIG1hbmFnZWQgYnkgdGhlIHN5c3RlbSBzZWN1cml0eSBmcmFtZXdvcmsgSW4gdGhlIHVzZXIgYW5kIHN5c3RlbSBrZXljaGFpbnMgYXJlIGFsc28gY29uc3VsdGVkICh1c2luZyBBcHBsZSBwcml2YXRlIEFQSXMpLiAgRm9yIHRoaXMgcmVhc29uLCB0aGUgCitcZjAgLCB0aGUgY2VydGlmaWNhdGVzIG1hbmFnZWQgYnkgdGhlIHN5c3RlbSBzZWN1cml0eSBmcmFtZXdvcmsgSW4gdGhlIHVzZXIgYW5kIHN5c3RlbSBrZXljaGFpbnMgYXJlIGFsc28gY29uc3VsdGVkICh1c2luZyBBcHBsZSBwcml2YXRlIEFQSXMpLiAgRm9yIHRoZSBpbml0aWFsIGFscGhhIHJlbGVhc2VzIG9mIFB5dGhvbiAzLjYsIHRoZSAKIFxpIDY0LWJpdC8zMi1iaXQgMTAuNisgcHl0aG9uLm9yZyB2YXJpYW50Ci1caTAgIGNvbnRpbnVlcyB0byBiZSBkeW5hbWljYWxseSBsaW5rZWQgd2l0aCBBcHBsZSdzIE9wZW5TU0wgMC45Ljggc2luY2UgaXQgd2FzIGZlbHQgdGhhdCB0aGUgbG9zcyBvZiB0aGUgc3lzdGVtLXByb3ZpZGVkIGNlcnRpZmljYXRlcyBhbmQgbWFuYWdlbWVudCB0b29scyBvdXR3ZWlnaHMgdGhlIGFkZGl0aW9uYWwgc2VjdXJpdHkgZmVhdHVyZXMgcHJvdmlkZWQgYnkgbmV3ZXIgdmVyc2lvbnMgb2YgT3BlblNTTC4gIFRoaXMgd2lsbCBsaWtlbHkgY2hhbmdlIGluIGZ1dHVyZSByZWxlYXNlcyBvZiB0aGUgcHl0aG9uLm9yZyBpbnN0YWxsZXJzIGFzIEFwcGxlIGhhcyBkZXByZWNhdGVkIHVzZSBvZiB0aGUgc3lzdGVtLXN1cHBsaWVkIE9wZW5TU0wgbGlicmFyaWVzLiAgSWYgeW91IGRvIG5lZWQgZmVhdHVyZXMgZnJvbSBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMLCB0aGVyZSBhcmUgdGhpcmQtcGFydHkgT3BlblNTTCB3cmFwcGVyIHBhY2thZ2VzIGF2YWlsYWJsZSB0aHJvdWdoIAorXGkwICBjb250aW51ZXMgdG8gYmUgZHluYW1pY2FsbHkgbGlua2VkIHdpdGggQXBwbGUncyBPcGVuU1NMIDAuOS44IHNpbmNlIGl0IHdhcyBmZWx0IHRoYXQgdGhlIGxvc3Mgb2YgdGhlIHN5c3RlbS1wcm92aWRlZCBjZXJ0aWZpY2F0ZXMgYW5kIG1hbmFnZW1lbnQgdG9vbHMgb3V0d2VpZ2hzIHRoZSBhZGRpdGlvbmFsIHNlY3VyaXR5IGZlYXR1cmVzIHByb3ZpZGVkIGJ5IG5ld2VyIHZlcnNpb25zIG9mIE9wZW5TU0wuICBUaGlzIHdpbGwgY2hhbmdlIHByaW9yIHRvIHRoZSBiZXRhIHJlbGVhc2VzIG9mIDMuNi4wIGFzIEFwcGxlIGhhcyBkZXByZWNhdGVkIHVzZSBvZiB0aGUgc3lzdGVtLXN1cHBsaWVkIE9wZW5TU0wgbGlicmFyaWVzLiAgSWYgeW91IGRvIG5lZWQgZmVhdHVyZXMgZnJvbSBuZXdlciB2ZXJzaW9ucyBvZiBPcGVuU1NMLCB0aGVyZSBhcmUgdGhpcmQtcGFydHkgT3BlblNTTCB3cmFwcGVyIHBhY2thZ2VzIGF2YWlsYWJsZSB0aHJvdWdoIAogXGkgUHlQSQogXGkwIC5cCiBcCiBUaGUgYnVuZGxlZCAKIFxmMSBwaXAKLVxmMCAgaW5jbHVkZWQgd2l0aCB0aGUgUHl0aG9uIDMuNSBpbnN0YWxsZXJzIGhhcyBpdHMgb3duIGRlZmF1bHQgY2VydGlmaWNhdGUgc3RvcmUgZm9yIHZlcmlmeWluZyBkb3dubG9hZCBjb25uZWN0aW9ucy5cCitcZjAgIGluY2x1ZGVkIHdpdGggdGhlIFB5dGhvbiAzLjYgaW5zdGFsbGVycyBoYXMgaXRzIG93biBkZWZhdWx0IGNlcnRpZmljYXRlIHN0b3JlIGZvciB2ZXJpZnlpbmcgZG93bmxvYWQgY29ubmVjdGlvbnMuXAogXAogCiBcYiBcdWwgT3RoZXIgY2hhbmdlc1wKIAogXGIwIFx1bG5vbmUgXAotXHBhcmRcdHg3MjBcdHgxNDQwXHR4MjE2MFx0eDI4ODBcdHgzNjAwXHR4NDMyMFx0eDUwNDBcdHg1NzYwXHR4NjQ4MFx0eDcyMDBcdHg3OTIwXHR4ODY0MFxwYXJkaXJuYXR1cmFsCi1cY2YwIEZvciBvdGhlciBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSwgc2VlIHRoZSAKK0ZvciBvdGhlciBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZSwgc2VlIHRoZSAKIFxpIFdoYXQncyBuZXcKIFxpMCAgc2VjdGlvbiBpbiB0aGUge1xmaWVsZHtcKlxmbGRpbnN0e0hZUEVSTElOSyAiaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kb2MvIn19e1xmbGRyc2x0IERvY3VtZW50YXRpb24gU2V0fX0gZm9yIHRoaXMgcmVsZWFzZSBhbmQgaXRzIAogXGkgUmVsZWFzZSBOb3RlcwogXGkwICBsaW5rIGF0IHtcZmllbGR7XCpcZmxkaW5zdHtIWVBFUkxJTksgImh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWRzLyJ9fXtcZmxkcnNsdCBodHRwczovL3d3dy5weXRob24ub3JnL2Rvd25sb2Fkcy99fS5cCi1ccGFyZFx0eDcyMFx0eDE0NDBcdHgyMTYwXHR4Mjg4MFx0eDM2MDBcdHg0MzIwXHR4NTA0MFx0eDU3NjBcdHg2NDgwXHR4NzIwMFx0eDc5MjBcdHg4NjQwXHBhcmRpcm5hdHVyYWwKIAotXGIgXGNmMCBcdWwgXAorXGIgXHVsIFwKIFB5dGhvbiAzIGFuZCBQeXRob24gMiBDby1leGlzdGVuY2VcCiAKIFxiMCBcdWxub25lIFwKZGlmZiAtLWdpdCBhL01hYy9JRExFL0lETEUuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9pZGxlbWFpbi5weSBiL01hYy9JRExFL0lETEUuYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9pZGxlbWFpbi5weQppbmRleCA5ODY3NjBkLi41OTk0YzE4IDEwMDY0NAotLS0gYS9NYWMvSURMRS9JRExFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvaWRsZW1haW4ucHkKKysrIGIvTWFjL0lETEUvSURMRS5hcHAvQ29udGVudHMvUmVzb3VyY2VzL2lkbGVtYWluLnB5CkBAIC02OCw2ICs2OCw2IEBACiAgICAgICAgIGJyZWFrCiAKICMgTm93IGl0IGlzIHNhZmUgdG8gaW1wb3J0IGlkbGVsaWIuCi1mcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgbWFpbgorZnJvbSBpZGxlbGliLnB5c2hlbGwgaW1wb3J0IG1haW4KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5wcmUuaW4gYi9NYWtlZmlsZS5wcmUuaW4KaW5kZXggODc1MjhhMC4uMmJjOTFkNyAxMDA2NDQKLS0tIGEvTWFrZWZpbGUucHJlLmluCisrKyBiL01ha2VmaWxlLnByZS5pbgpAQCAtMTA5LDYgKzEwOSw3IEBACiAKICMgTXVsdGlhcmNoIGRpcmVjdG9yeSAobWF5IGJlIGVtcHR5KQogTVVMVElBUkNIPQlATVVMVElBUkNIQAorTVVMVElBUkNIX0NQUEZMQUdTID0gQE1VTFRJQVJDSF9DUFBGTEFHU0AKIAogIyBJbnN0YWxsIHByZWZpeCBmb3IgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzCiBwcmVmaXg9CQlAcHJlZml4QApAQCAtNTcxLDcgKzU3Miw3IEBACiAJJChMSU5LQ0MpICQoUFlfTERGTEFHUykgJChMSU5LRk9SU0hBUkVEKSAtbyAkQCBQcm9ncmFtcy9weXRob24ubyAkKEJMRExJQlJBUlkpICQoTElCUykgJChNT0RMSUJTKSAkKFNZU0xJQlMpICQoTERMQVNUKQogCiBwbGF0Zm9ybTogJChCVUlMRFBZVEhPTikgcHlidWlsZGRpci50eHQKLQkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAtYyAnaW1wb3J0IHN5cyA7IGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0gOyBwcmludChnZXRfcGxhdGZvcm0oKSsiLSIrc3lzLnZlcnNpb25bMDozXSknID5wbGF0Zm9ybQorCSQoUlVOU0hBUkVEKSAkKFBZVEhPTl9GT1JfQlVJTEQpIC1jICdpbXBvcnQgc3lzIDsgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wbGF0Zm9ybSA7IHByaW50KCIlcy0lZC4lZCIgJSAoZ2V0X3BsYXRmb3JtKCksICpzeXMudmVyc2lvbl9pbmZvWzoyXSkpJyA+cGxhdGZvcm0KIAogIyBDcmVhdGUgYnVpbGQgZGlyZWN0b3J5IGFuZCBnZW5lcmF0ZSB0aGUgc3lzY29uZmlnIGJ1aWxkLXRpbWUgZGF0YSB0aGVyZS4KICMgcHlidWlsZGRpci50eHQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGJ1aWxkIGRpciBhbmQgaXMgdXNlZCBmb3IKQEAgLTc4NCw2ICs3ODUsNyBAQAogUHl0aG9uL3N5c21vZHVsZS5vOiAkKHNyY2RpcikvUHl0aG9uL3N5c21vZHVsZS5jIE1ha2VmaWxlCiAJJChDQykgLWMgJChQWV9DT1JFX0NGTEFHUykgXAogCQktREFCSUZMQUdTPSciJChBQklGTEFHUykiJyBcCisJCSQoTVVMVElBUkNIX0NQUEZMQUdTKSBcCiAJCS1vICRAICQoc3JjZGlyKS9QeXRob24vc3lzbW9kdWxlLmMKIAogJChJT19PQkpTKTogJChJT19IKQpAQCAtOTQzLDYgKzk0NSw3IEBACiAJCSQoc3JjZGlyKS9JbmNsdWRlL29iamltcGwuaCBcCiAJCSQoT1BDT0RFX0gpIFwKIAkJJChzcmNkaXIpL0luY2x1ZGUvb3NkZWZzLmggXAorCQkkKHNyY2RpcikvSW5jbHVkZS9vc21vZHVsZS5oIFwKIAkJJChzcmNkaXIpL0luY2x1ZGUvcGF0Y2hsZXZlbC5oIFwKIAkJJChzcmNkaXIpL0luY2x1ZGUvcGdlbi5oIFwKIAkJJChzcmNkaXIpL0luY2x1ZGUvcGdlbmhlYWRlcnMuaCBcCkBAIC05OTIsNyArOTk1LDcgQEAKIFRFU1RPUFRTPQkkKEVYVFJBVEVTVE9QVFMpCiBURVNUUFlUSE9OPQkkKFJVTlNIQVJFRCkgLi8kKEJVSUxEUFlUSE9OKSAkKFRFU1RQWVRIT05PUFRTKQogVEVTVFJVTk5FUj0JJChURVNUUFlUSE9OKSAkKHNyY2RpcikvVG9vbHMvc2NyaXB0cy9ydW5fdGVzdHMucHkKLVRFU1RUSU1FT1VUPQkzNjAwCitURVNUVElNRU9VVD0JOTAwCiAKICMgUnVuIGEgYmFzaWMgc2V0IG9mIHJlZ3Jlc3Npb24gdGVzdHMuCiAjIFRoaXMgZXhjbHVkZXMgc29tZSB0ZXN0cyB0aGF0IGFyZSBwYXJ0aWN1bGFybHkgcmVzb3VyY2UtaW50ZW5zaXZlLgpAQCAtMTE5Myw2ICsxMTk2LDcgQEAKIAkJdGVzdC9jamtlbmNvZGluZ3MgdGVzdC9kZWNpbWFsdGVzdGRhdGEgdGVzdC94bWx0ZXN0ZGF0YSBcCiAJCXRlc3QvZWludHJkYXRhIFwKIAkJdGVzdC9pbWdoZHJkYXRhIFwKKwkJdGVzdC9saWJyZWdydGVzdCBcCiAJCXRlc3Qvc3VicHJvY2Vzc2RhdGEgdGVzdC9zbmRoZHJkYXRhIHRlc3Qvc3VwcG9ydCBcCiAJCXRlc3QvdHJhY2VkbW9kdWxlcyB0ZXN0L2VuY29kZWRfbW9kdWxlcyBcCiAJCXRlc3QvdGVzdF9pbXBvcnQgXApAQCAtMTI2MSw3ICsxMjY1LDcgQEAKIAkJZWxzZQl0cnVlOyBcCiAJCWZpOyBcCiAJZG9uZQotCUBmb3IgaSBpbiAkKHNyY2RpcikvTGliLyoucHkgYGNhdCBweWJ1aWxkZGlyLnR4dGAvX3N5c2NvbmZpZ2RhdGEucHk7IFwKKwlAZm9yIGkgaW4gJChzcmNkaXIpL0xpYi8qLnB5OyBcCiAJZG8gXAogCQlpZiB0ZXN0IC14ICQkaTsgdGhlbiBcCiAJCQkkKElOU1RBTExfU0NSSVBUKSAkJGkgJChERVNURElSKSQoTElCREVTVCk7IFwKQEAgLTEyOTYsNiArMTMwMCwxMCBAQAogCQkJZXNhYzsgXAogCQlkb25lOyBcCiAJZG9uZQorCSQoSU5TVEFMTF9EQVRBKSBgY2F0IHB5YnVpbGRkaXIudHh0YC9fc3lzY29uZmlnZGF0YV8kKEFCSUZMQUdTKS5weSBcCisJCSQoREVTVERJUikkKExJQkRFU1QpLyQoUExBVERJUik7IFwKKwllY2hvICQoSU5TVEFMTF9EQVRBKSBgY2F0IHB5YnVpbGRkaXIudHh0YC9fc3lzY29uZmlnZGF0YV8kKEFCSUZMQUdTKS5weSBcCisJCSQoTElCREVTVCkvJChQTEFURElSKQogCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTElDRU5TRSAkKERFU1RESVIpJChMSUJERVNUKS9MSUNFTlNFLnR4dAogCWlmIHRlc3QgLWQgJChERVNURElSKSQoTElCREVTVCkvZGlzdHV0aWxzL3Rlc3RzOyB0aGVuIFwKIAkJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9Nb2R1bGVzL3h4bW9kdWxlLmMgXApAQCAtMTMzNCwxMyArMTM0MiwxOSBAQAogCQkkKFBZVEhPTl9GT1JfQlVJTEQpIC1tIGxpYjJ0bzMucGdlbjIuZHJpdmVyICQoREVTVERJUikkKExJQkRFU1QpL2xpYjJ0bzMvUGF0dGVybkdyYW1tYXIudHh0CiAKICMgQ3JlYXRlIHRoZSBQTEFURElSIHNvdXJjZSBkaXJlY3RvcnksIGlmIG9uZSB3YXNuJ3QgZGlzdHJpYnV0ZWQuLgorIyBGb3IgbXVsdGlhcmNoIHRhcmdldHMsIHVzZSB0aGUgcGxhdC1saW51eC9yZWdlbiBzY3JpcHQuCiAkKHNyY2RpcikvTGliLyQoUExBVERJUik6CiAJbWtkaXIgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpCi0JY3AgJChzcmNkaXIpL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4gJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpL3JlZ2VuCisJaWYgWyAtbiAiJChNVUxUSUFSQ0gpIiBdOyB0aGVuIFwKKwkgIGNwICQoc3JjZGlyKS9MaWIvcGxhdC1saW51eC9yZWdlbiAkKHNyY2RpcikvTGliLyQoUExBVERJUikvcmVnZW47IFwKKwllbHNlIFwKKwkgIGNwICQoc3JjZGlyKS9MaWIvcGxhdC1nZW5lcmljL3JlZ2VuICQoc3JjZGlyKS9MaWIvJChQTEFURElSKS9yZWdlbjsgXAorCWZpOyBcCiAJZXhwb3J0IFBBVEg7IFBBVEg9ImBwd2RgOiQkUEFUSCI7IFwKIAlleHBvcnQgUFlUSE9OUEFUSDsgUFlUSE9OUEFUSD0iYHB3ZGAvTGliIjsgXAogCWV4cG9ydCBEWUxEX0ZSQU1FV09SS19QQVRIOyBEWUxEX0ZSQU1FV09SS19QQVRIPSJgcHdkYCI7IFwKIAlleHBvcnQgRVhFOyBFWEU9IiQoQlVJTERFWEUpIjsgXAorCWV4cG9ydCBDQzsgQ0M9IiQoQ0MpIjsgXAogCWlmIFsgLW4gIiQoTVVMVElBUkNIKSIgXTsgdGhlbiBleHBvcnQgTVVMVElBUkNIOyBNVUxUSUFSQ0g9JChNVUxUSUFSQ0gpOyBmaTsgXAogCWV4cG9ydCBQWVRIT05fRk9SX0JVSUxEOyBcCiAJaWYgWyAiJChCVUlMRF9HTlVfVFlQRSkiID0gIiQoSE9TVF9HTlVfVFlQRSkiIF07IHRoZW4gXApAQCAtMTM0OCw2ICsxMzYyLDcgQEAKIAllbHNlIFwKIAkgIFBZVEhPTl9GT1JfQlVJTEQ9IiQoUFlUSE9OX0ZPUl9CVUlMRCkiOyBcCiAJZmk7IFwKKwlleHBvcnQgSDJQWTsgSDJQWT0iJCRQWVRIT05fRk9SX0JVSUxEICQoYWJzX3NyY2RpcikvVG9vbHMvc2NyaXB0cy9oMnB5LnB5IjsgXAogCWNkICQoc3JjZGlyKS9MaWIvJChQTEFURElSKTsgJChSVU5TSEFSRUQpIC4vcmVnZW4KIAogcHl0aG9uLWNvbmZpZzogJChzcmNkaXIpL01pc2MvcHl0aG9uLWNvbmZpZy5pbiBNaXNjL3B5dGhvbi1jb25maWcuc2gKQEAgLTE0NDYsNyArMTQ2MSw3IEBACiAJCS0taW5zdGFsbC1zY3JpcHRzPSQoQklORElSKSBcCiAJCS0taW5zdGFsbC1wbGF0bGliPSQoREVTVFNIQVJFRCkgXAogCQktLXJvb3Q9JChERVNURElSKS8KLQktcm0gJChERVNURElSKSQoREVTVFNIQVJFRCkvX3N5c2NvbmZpZ2RhdGEucHkKKwktcm0gJChERVNURElSKSQoREVTVFNIQVJFRCkvX3N5c2NvbmZpZ2RhdGFfJChBQklGTEFHUykucHkKIAktcm0gLXIgJChERVNURElSKSQoREVTVFNIQVJFRCkvX19weWNhY2hlX18KIAogIyBIZXJlIGFyZSBhIGNvdXBsZSBvZiB0YXJnZXRzIGZvciBNYWNPU1ggYWdhaW4sIHRvIGluc3RhbGwgYSBmdWxsCkBAIC0xNDkyLDEwICsxNTA3LDEwIEBACiAjIEluc3RhbGwgYSBudW1iZXIgb2Ygc3ltbGlua3MgdG8ga2VlcCBzb2Z0d2FyZSB0aGF0IGV4cGVjdHMgYSBub3JtYWwgdW5peAogIyBpbnN0YWxsICh3aGljaCBpbmNsdWRlcyBweXRob24tY29uZmlnKSBoYXBweS4KIGZyYW1ld29ya2luc3RhbGxtYWNsaWI6Ci0JJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9weXRob24kKFZFUlNJT04pL2NvbmZpZy0kKExEVkVSU0lPTikvbGlicHl0aG9uJChMRFZFUlNJT04pLmEiCi0JJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChwcmVmaXgpL2xpYi9weXRob24kKFZFUlNJT04pL2NvbmZpZy0kKExEVkVSU0lPTikvbGlicHl0aG9uJChMRFZFUlNJT04pLmR5bGliIgotCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWctJChMRFZFUlNJT04pL2xpYnB5dGhvbiQoVkVSU0lPTikuYSIKLQkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL3B5dGhvbiQoVkVSU0lPTikvY29uZmlnLSQoTERWRVJTSU9OKS9saWJweXRob24kKFZFUlNJT04pLmR5bGliIgorCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQoTElCUEwpL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5hIgorCSQoTE4pIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQoTElCUEwpL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5keWxpYiIKKwkkKExOKSAtZnMgIi4uLy4uLy4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKExJQlBMKS9saWJweXRob24kKFZFUlNJT04pLmEiCisJJChMTikgLWZzICIuLi8uLi8uLi8kKFBZVEhPTkZSQU1FV09SSykiICIkKERFU1RESVIpJChMSUJQTCkvbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYiIKIAkkKExOKSAtZnMgIi4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL2xpYnB5dGhvbiQoTERWRVJTSU9OKS5keWxpYiIKIAkkKExOKSAtZnMgIi4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL2xpYnB5dGhvbiQoVkVSU0lPTikuZHlsaWIiCiAKQEAgLTE2MjUsNiArMTY0MCw5IEBACiAJLXJtIC1yZiBidWlsZCBwbGF0Zm9ybQogCS1ybSAtcmYgJChQWVRIT05GUkFNRVdPUktESVIpCiAJLXJtIC1mIHB5dGhvbi1jb25maWcucHkgcHl0aG9uLWNvbmZpZworCWlmIFsgLW4gIiQoTVVMVElBUkNIKSIgXTsgdGhlbiBcCisJICBybSAtcmYgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpOyBcCisJZmkKIAogIyBNYWtlIHRoaW5ncyBleHRyYSBjbGVhbiwgYmVmb3JlIG1ha2luZyBhIGRpc3RyaWJ1dGlvbjoKICMgcmVtb3ZlIGFsbCBnZW5lcmF0ZWQgZmlsZXMsIGV2ZW4gTWFrZWZpbGVbLnByZV0KZGlmZiAtLWdpdCBhL01pc2MvQUNLUyBiL01pc2MvQUNLUwppbmRleCA4OTdiMTAzLi45NDJmMzExIDEwMDY0NAotLS0gYS9NaXNjL0FDS1MKKysrIGIvTWlzYy9BQ0tTCkBAIC0xNTQsNiArMTU0LDcgQEAKIFBhdWwgQm9kZGllCiBNYXR0aGV3IEJvZWRpY2tlcgogUm9iaW4gQm9lcmRpamsKK05pa29sYXkgQm9nb3ljaGV2CiBEYXZpZCBCb2xlbgogV291dGVyIEJvbHN0ZXJsZWUKIEdhd2FpbiBCb2x0b24KQEAgLTIzOSw2ICsyNDAsNyBAQAogTWljaGFlbCBDZXRydWxvCiBEYXZlIENoYW1iZXJzCiBQYXNjYWwgQ2hhbWJvbgorTmljaG9sYXMgQ2hhbW1hcwogSm9obiBDaGFuZGxlcgogSHllLVNoaWsgQ2hhbmcKIEplZmZyZXkgQ2hhbmcKQEAgLTMwOSw5ICszMTEsMTEgQEAKIENocmlzdG9waGVyIEEuIENyYWlnCiBKZXJlbXkgQ3JhdmVuCiBMYXVyYSBDcmVpZ2h0b24KK1R5bGVyIENyb21wdG9uCiBTaW1vbiBDcm9zcwogRmVsaXBlIENydXoKIERyZXcgQ3NpbGxhZworQWxlc3NhbmRybyBDdWNjaQogSm9hcXVpbiBDdWVuY2EgQWJlbGEKIEpvaG4gQ3VnaW5pCiBUb20gQ3VsbGl0b24KQEAgLTM1NSw2ICszNTksNyBAQAogWXZlcyBEaW9ubmUKIERhbmllbCBEaXR0bWFyCiBKb3NpcCBEam9sb25nYQorV2FsdGVyIETDtnJ3YWxkCiBKYXJvbWlyIERvbGVjZWsKIElzbWFpbCBEb25tZXoKIFJvYmVydCBEb25vaHVlCkBAIC0zODIsNyArMzg3LDYgQEAKIEthcm1lbiBEeWtzdHJhCiBKb3NpcCBEem9sb25nYQogTWF4aW0gRHp1bWFuZW5rbwotV2FsdGVyIETDtnJ3YWxkCiBIYW5zIEVja2FyZHQKIFJvZG9scGhvIEVja2hhcmR0CiBVbHJpY2ggRWNraGFyZHQKQEAgLTU0MCw2ICs1NDQsNyBAQAogTGFycyBHdXN0w6RiZWwKIFRob21hcyBHw7x0dGxlcgogSm9uYXMgSC4KK0pvc2VwaCBIYWNrbWFuCiBCYXJyeSBIYWRkb3cKIFBoaWxpcHAgSGFnZW1laXN0ZXIKIFBhdWwgdGVuIEhhZ2VuCkBAIC03NzcsNiArNzgyLDcgQEAKIE1hcmtvIEtvaHRhbGEKIFZhanJhc2t5IEtvawogR3VpZG8gS29sbGVyaWUKK0phY2VrIEtvxYJvZHppZWoKIEphY2VrIEtvbmllY3pueQogQXJrYWR5IEtvcGx5YXJvdgogUGV0ZXIgQS4gS29yZW4KQEAgLTgyMCw2ICs4MjYsNyBAQAogVGlubyBMYW5nZQogR2xlbm4gTGFuZ2ZvcmQKIEFuZHJldyBMYW5nbWVhZAorV29sZmdhbmcgTGFuZ25lcgogRGV0bGVmIExhbm5lcnQKIFNvcmVuIExhcnNlbgogQW1vcyBMYXR0ZWllcgpAQCAtODgxLDI0ICs4ODgsMjcgQEAKIEdyZWdvciBMaW5nbAogRXZlcmV0dCBMaXBtYW4KIE1pcmtvIExpc3MKK0FsZXhhbmRlciBMaXUKIE5pY2sgTG9ja3dvb2QKIFN0ZXBoYW5pZSBMb2Nrd29vZAorTWFydGluIHZvbiBMw7Z3aXMKIEh1Z28gTG9wZXMgVGF2YXJlcwogR3VpbGxlcm1vIEzDs3Blei1BbmdsYWRhCiBBbm5lIExvcmQKK0FsZXggTG9yZFRob3JzZW4KIFRvbSBMb3JlZG8KIEp1c3RpbiBMb3ZlCiBOZWQgSmFja3NvbiBMb3ZlbHkKIFBldGVyIExvdmV0dAogQ2hhbG1lciBMb3dlCiBKYXNvbiBMb3dlCi1NYXJ0aW4gdm9uIEzDtndpcwogVG9ueSBMb3duZHMKIFJheSBMb3l6YWdhCiBLYW5nLUhhbyAoS2VubnkpIEx1CiBMdWthcyBMdWVnCiBMb3JlbiBMdWtlCiBGcmVkcmlrIEx1bmRoCitNaWtlIEx1bmR5CiBaaG9uZ3l1ZSBMdW8KIE1hcmsgTHV0egogVGFyYXMgTHlhcHVuCkBAIC05ODksNiArOTk5LDcgQEAKIEphc29uIFYuIE1pbGxlcgogSmF5IFQuIE1pbGxlcgogS2F0aWUgTWlsbGVyCitPcmVuIE1pbG1hbgogUm9tYW4gTWlsbmVyCiBKdWxpZW4gTWlvdHRlCiBBbmRyaWkgVi4gTWlzaGtvdnNreWkKQEAgLTExMzcsOSArMTE0OCwxMSBAQAogR2VvZmYgUGhpbGJyaWNrCiBHYXZyaWUgUGhpbGlwc29uCiBBZHJpYW4gUGhpbGxpcHMKK0R1c3R5IFBoaWxsaXBzCiBDaHJpc3RvcGhlciBKLiBQaG9lbml4CiBKYW1lcyBQaWNrZXJpbmcKIE5lYWxlIFBpY2tldHQKK1N0ZXZlIFBpZXJjeQogSmltIFN0LiBQaWVycmUKIERhbiBQaWVyc29uCiBNYXJ0aWpuIFBpZXRlcnMKQEAgLTEyNDAsNiArMTI1Myw3IEBACiBLZXZpbiBSb2RnZXJzCiBTZWFuIFJvZG1hbgogR2lhbXBhb2xvIFJvZG9sYQorTWF1cm8gUy4gTS4gUm9kcmlndWVzCiBFbHNvbiBSb2RyaWd1ZXoKIEFkaSBSb2liYW4KIEx1aXMgUm9qYXMKQEAgLTEyODEsNiArMTI5NSw3IEBACiBDb25zdGFudGluYSBTLgogUGF0cmljayBTYWJpbgogU8OpYmFzdGllbiBTYWJsw6kKK0FtaXQgU2FoYQogU3VtYW4gU2FoYQogSGFqaW1lIFNhaXRvdQogR2VvcmdlIFNha2tpcwpAQCAtMTM4Niw2ICsxNDAxLDcgQEAKIFJveSBTbWl0aAogUnlhbiBTbWl0aC1Sb2JlcnRzCiBSYWZhbCBTbW90cnp5aworSm9zaCBTbmlkZXIKIEVyaWMgU25vdwogRGlyayBTb2VkZQogTmlyIFNvZmZlcgpAQCAtMTQxOCw2ICsxNDM0LDcgQEAKIFJpY2hhcmQgU3RvYWtsZXkKIFBldGVyIFN0b2VocgogQ2FzcGVyIFN0b2VsCitEYW5pZWwgU3Rva2VzCiBNaWNoYWVsIFN0b25lCiBTZXJoaXkgU3RvcmNoYWthCiBLZW4gU3RveApAQCAtMTQ0Miw2ICsxNDU5LDcgQEAKIEpvaG4gU3pha21laXN0ZXIKIEFtaXIgU3pla2VseQogTWFjaWVqIFN6dWxpaworSm9lbCBUYWRkZWkKIEFyZnJldmVyIEZyZWh0ZXMgVGFpZmVyc2FyIEFyYWhlc2lzCiBIaWRlYWtpIFRha2FoYXNoaQogVGFrYXNlIEFyaWhpcm8KQEAgLTE0NTMsNiArMTQ3MSw3IEBACiBDaHJpc3RpYW4gVGFuemVyCiBTdGV2ZW4gVGFzY2h1awogQW15IFRheWxvcgorSnVsaWFuIFRheWxvcgogTW9udHkgVGF5bG9yCiBBbmF0b2x5IFRlY2h0b25pawogR3VzdGF2byBUZW1wbGUKQEAgLTE2MzQsNiArMTY1Myw3IEBACiBBcm5vbiBZYWFyaQogSGlyb2thenUgWWFtYW1vdG8KIEthLVBpbmcgWWVlCitDaGkgSHN1YW4gWWVuCiBKYXNvbiBZZW8KIEV1bmdKdW4gWWkKIEJvYiBZb2Rsb3dza2kKZGlmZiAtLWdpdCBhL01pc2MvTkVXUyBiL01pc2MvTkVXUwppbmRleCBhNzljZmFmLi44NDg3MDBhIDEwMDY0NAotLS0gYS9NaXNjL05FV1MKKysrIGIvTWlzYy9ORVdTCkBAIC0yLDEwICsyLDEwIEBACiBQeXRob24gTmV3cwogKysrKysrKysrKysKIAotV2hhdCdzIE5ldyBpbiBQeXRob24gMy41LjMgcmVsZWFzZSBjYW5kaWRhdGUgMT8KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjYuMCBhbHBoYSA0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVJlbGVhc2UgZGF0ZTogVEJBCisqUmVsZWFzZSBkYXRlOiBYWFhYLVhYLVhYKgogCiBDb3JlIGFuZCBCdWlsdGlucwogLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1LDEyICsxNSw2IEBACiAtIElzc3VlICMyNzUxNDogTWFrZSBoYXZpbmcgdG9vIG1hbnkgc3RhdGljYWxseSBuZXN0ZWQgYmxvY2tzIGEgU3ludGF4RXJyb3IKICAgaW5zdGVhZCBvZiBTeXN0ZW1FcnJvci4KIAotLSBJc3N1ZSAjMjc0NzM6IEZpeGVkIHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gYnl0ZXMgYW5kIGJ5dGVhcnJheQotICBjb25jYXRlbmF0aW9ucy4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgotCi0tIElzc3VlICMyNzQ0MzogX19sZW5ndGhfaGludF9fKCkgb2YgYnl0ZWFycmF5IGl0ZXJhdG9ycyBubyBsb25nZXIgcmV0dXJuIGEKLSAgbmVnYXRpdmUgaW50ZWdlciBmb3IgYSByZXNpemVkIGJ5dGVhcnJheS4KLQogTGlicmFyeQogLS0tLS0tLQogCkBAIC0yOSw2ICsyMyw0MSBAQAogCiAtIElzc3VlICMyNzUyMjogQXZvaWQgYW4gdW5pbnRlbnRpb25hbCByZWZlcmVuY2UgY3ljbGUgaW4gZW1haWwuZmVlZHBhcnNlci4KIAorLSBJc3N1ZSAyNzUxMjogRml4IGEgc2VnZmF1bHQgd2hlbiBvcy5mc3BhdGgoKSBjYWxsZWQgYSBhbiBfX2ZzcGF0aF9fKCkgbWV0aG9kCisgIHRoYXQgcmFpc2VkIGFuIGV4Y2VwdGlvbi4gUGF0Y2ggYnkgWGlhbmcgWmhhbmcuCisKK1Rlc3RzCistLS0tLQorCistIElzc3VlICMyNzM2OTogSW4gdGVzdF9weWV4cGF0LCBhdm9pZCB0ZXN0aW5nIGFuIGVycm9yIG1lc3NhZ2UgZGV0YWlsIHRoYXQKKyAgY2hhbmdlZCBpbiBFeHBhdCAyLjIuMC4KKworCitXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjYuMCBhbHBoYSAzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDIwMTYtMDctMTEqCisKK0NvcmUgYW5kIEJ1aWx0aW5zCistLS0tLS0tLS0tLS0tLS0tLQorCistIElzc3VlICMyNzQ3MzogRml4ZWQgcG9zc2libGUgaW50ZWdlciBvdmVyZmxvdyBpbiBieXRlcyBhbmQgYnl0ZWFycmF5CisgIGNvbmNhdGVuYXRpb25zLiAgUGF0Y2ggYnkgWGlhbmcgWmhhbmcuCisKKy0gSXNzdWUgIzIzMDM0OiBUaGUgb3V0cHV0IG9mIGEgc3BlY2lhbCBQeXRob24gYnVpbGQgd2l0aCBkZWZpbmVkIENPVU5UX0FMTE9DUywKKyAgU0hPV19BTExPQ19DT1VOVCBvciBTSE9XX1RSQUNLX0NPVU5UIG1hY3JvcyBpcyBub3cgb2ZmIGJ5ICBkZWZhdWx0LiAgSXQgY2FuCisgIGJlIHJlLWVuYWJsZWQgdXNpbmcgdGhlICItWCBzaG93YWxsb2Njb3VudCIgb3B0aW9uLiAgSXQgbm93IG91dHB1dHMgdG8gc3RkZXJyCisgIGluc3RlYWQgb2Ygc3Rkb3V0LgorCistIElzc3VlICMyNzQ0MzogX19sZW5ndGhfaGludF9fKCkgb2YgYnl0ZWFycmF5IGl0ZXJhdG9ycyBubyBsb25nZXIgcmV0dXJuIGEKKyAgbmVnYXRpdmUgaW50ZWdlciBmb3IgYSByZXNpemVkIGJ5dGVhcnJheS4KKworLSBJc3N1ZSAjMjcwMDc6IFRoZSBmcm9taGV4KCkgY2xhc3MgbWV0aG9kcyBvZiBieXRlcyBhbmQgYnl0ZWFycmF5IHN1YmNsYXNzZXMKKyAgbm93IHJldHVybiBhbiBpbnN0YW5jZSBvZiBjb3JyZXNwb25kaW5nIHN1YmNsYXNzLgorCitMaWJyYXJ5CistLS0tLS0tCisKIC0gSXNzdWUgIzI2ODQ0OiBGaXggZXJyb3IgbWVzc2FnZSBmb3IgaW1wLmZpbmRfbW9kdWxlKCkgdG8gcmVmZXIgdG8gJ3BhdGgnCiAgIGluc3RlYWQgb2YgJ25hbWUnLiBQYXRjaCBieSBMZXYgTWF4aW1vdi4KIApAQCAtMzksMjIgKzY4LDU0IEBACiAgIGNvbmZpcm1pbmcgdGhlIG5ldHNjYXBlIGNvb2tpZSBmb3JtYXQgYW5kIG1ha2luZyBpdCBjb25zaXN0ZW50IHdpdGgKICAgZG9jdW1lbnRhdGlvbi4KIAotLSBJc3N1ZSAjMjY2NjQ6IEZpeCBhY3RpdmF0ZS5maXNoIGJ5IHJlbW92aW5nIG1pcy11c2Ugb2YgYGAkYGAuCistIElzc3VlICMyMTcwODogRGVwcmVjYXRlZCBkYm0uZHVtYiBiZWhhdmlvciB0aGF0IGRpZmZlcnMgZnJvbSBjb21tb24gZGJtCisgIGJlaGF2aW9yOiBjcmVhdGluZyBhIGRhdGFiYXNlIGluICdyJyBhbmQgJ3cnIG1vZGVzIGFuZCBtb2RpZnlpbmcgYSBkYXRhYmFzZQorICBpbiAncicgbW9kZS4KIAotLSBJc3N1ZSAjMjIxMTU6IEZpeGVkIHRyYWNpbmcgVGtpbnRlciB2YXJpYWJsZXM6IHRyYWNlX3ZkZWxldGUoKSB3aXRoIHdyb25nCi0gIG1vZGUgbm8gbG9uZ2VyIGJyZWFrIHRyYWNpbmcsIHRyYWNlX3ZpbmZvKCkgbm93IGFsd2F5cyByZXR1cm5zIGEgbGlzdCBvZgotICBwYWlycyBvZiBzdHJpbmdzLCB0cmFjaW5nIGluIHRoZSAidSIgbW9kZSBub3cgd29ya3MuCistIElzc3VlICMyNjcyMTogQ2hhbmdlIHRoZSBzb2NrZXRzZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIud2ZpbGUgYXR0cmlidXRlCisgIHRvIGltcGxlbWVudCBCdWZmZXJlZElPQmFzZS4gSW4gcGFydGljdWxhciwgdGhlIHdyaXRlKCkgbWV0aG9kIG5vIGxvbmdlcgorICBkb2VzIHBhcnRpYWwgd3JpdGVzLgogCi0tIEZpeCBhIHNjb3BpbmcgaXNzdWUgaW4gaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlciB3aGljaCB0cmlnZ2VyZWQgYW4KLSAgVW5ib3VuZExvY2FsRXJyb3Igd2hlbiBsYXp5LWxvYWRpbmcgYSBtb2R1bGUgdGhhdCB3YXMgYWxyZWFkeSBwdXQgaW50bwotICBzeXMubW9kdWxlcy4KKy0gSXNzdWUgIzIyMTE1OiBBZGRlZCBtZXRob2RzIHRyYWNlX2FkZCwgdHJhY2VfcmVtb3ZlIGFuZCB0cmFjZV9pbmZvIGluIHRoZQorICB0a2ludGVyLlZhcmlhYmxlIGNsYXNzLiAgVGhleSByZXBsYWNlIG9sZCBtZXRob2RzIHRyYWNlX3ZhcmlhYmxlLCB0cmFjZSwKKyAgdHJhY2VfdmRlbGV0ZSBhbmQgdHJhY2VfdmluZm8gdGhhdCB1c2Ugb2Jzb2xldGUgVGNsIGNvbW1hbmRzIGFuZCBtaWdodAorICBub3Qgd29yayBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgVGNsLiAgRml4ZWQgb2xkIHRyYWNpbmcgbWV0aG9kczoKKyAgdHJhY2VfdmRlbGV0ZSgpIHdpdGggd3JvbmcgbW9kZSBubyBsb25nZXIgYnJlYWsgdHJhY2luZywgdHJhY2VfdmluZm8oKSBub3cKKyAgYWx3YXlzIHJldHVybnMgYSBsaXN0IG9mIHBhaXJzIG9mIHN0cmluZ3MsIHRyYWNpbmcgaW4gdGhlICJ1IiBtb2RlIG5vdyB3b3Jrcy4KKworLSBJc3N1ZSAjMjYyNDM6IE9ubHkgdGhlIGxldmVsIGFyZ3VtZW50IHRvIHpsaWIuY29tcHJlc3MoKSBpcyBrZXl3b3JkIGFyZ3VtZW50CisgIG5vdy4gIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBwb3NpdGlvbmFsLW9ubHkuCisKKy0gSXNzdWUgIzI3MDM4OiBFeHBvc2UgdGhlIERpckVudHJ5IHR5cGUgYXMgb3MuRGlyRW50cnkuIENvZGUgcGF0Y2ggYnkKKyAgSmVsbGUgWmlqbHN0cmEuCisKKy0gSXNzdWUgIzI3MTg2OiBVcGRhdGUgb3MuZnNwYXRoKCkvUHlPU19GU1BhdGgoKSB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mCisgIF9fZnNwYXRoX18oKSB0byBiZSBlaXRoZXIgc3RyIG9yIGJ5dGVzLgorCistIElzc3VlICMxODcyNjogQWxsIG9wdGlvbmFsIHBhcmFtZXRlcnMgb2YgdGhlIGR1bXAoKSwgZHVtcHMoKSwKKyAgbG9hZCgpIGFuZCBsb2FkcygpIGZ1bmN0aW9ucyBhbmQgSlNPTkVuY29kZXIgYW5kIEpTT05EZWNvZGVyIGNsYXNzCisgIGNvbnN0cnVjdG9ycyBpbiB0aGUganNvbiBtb2R1bGUgYXJlIG5vdyBrZXl3b3JkLW9ubHkuCisKKy0gSXNzdWUgIzI3MzE5OiBNZXRob2RzIHNlbGVjdGlvbl9zZXQoKSwgc2VsZWN0aW9uX2FkZCgpLCBzZWxlY3Rpb25fcmVtb3ZlKCkKKyAgYW5kIHNlbGVjdGlvbl90b2dnbGUoKSBvZiB0dGsuVHJlZVZpZXcgbm93IGFsbG93IHBhc3NpbmcgbXVsdGlwbGUgaXRlbXMgYXMKKyAgbXVsdGlwbGUgYXJndW1lbnRzIGluc3RlYWQgb2YgcGFzc2luZyB0aGVtIGFzIGEgdHVwbGUuICBEZXByZWNhdGVkCisgIHVuZG9jdW1lbnRlZCBhYmlsaXR5IG9mIGNhbGxpbmcgdGhlIHNlbGVjdGlvbigpIG1ldGhvZCB3aXRoIGFyZ3VtZW50cy4KIAogLSBJc3N1ZSAjMjcwNzk6IEZpeGVkIGN1cnNlcy5hc2NpaSBmdW5jdGlvbnMgaXNibGFuaygpLCBpc2NudHJsKCkgYW5kIGlzcHVuY3QoKS4KIAorLSBJc3N1ZSAjMjcyOTQ6IE51bWVyaWNhbCBzdGF0ZSBpbiB0aGUgcmVwciBmb3IgVGtpbnRlciBldmVudCBvYmplY3RzIGlzIG5vdworICByZXByZXNlbnRlZCBhcyBhIGNvbXBpbmF0aW9uIG9mIGtub3duIGZsYWdzLgorCistIElzc3VlICMyNzE3NzogTWF0Y2ggb2JqZWN0cyBpbiB0aGUgcmUgbW9kdWxlIG5vdyBzdXBwb3J0IGluZGV4LWxpa2Ugb2JqZWN0cworICBhcyBncm91cCBpbmRpY2VzLiAgQmFzZWQgb24gcGF0Y2hlcyBieSBKZXJvZW4gRGVtZXllciBhbmQgWGlhbmcgWmhhbmcuCisKIC0gSXNzdWUgIzI2NzU0OiBTb21lIGZ1bmN0aW9ucyAoY29tcGlsZSgpIGV0YykgYWNjZXB0ZWQgYSBmaWxlbmFtZSBhcmd1bWVudAogICBlbmNvZGVkIGFzIGFuIGl0ZXJhYmxlIG9mIGludGVnZXJzLiBOb3cgb25seSBzdHJpbmdzIGFuZCBieXRlLWxpa2Ugb2JqZWN0cwogICBhcmUgYWNjZXB0ZWQuCiAKKy0gSXNzdWUgIzI2NTM2OiBzb2NrZXQuaW9jdGwgbm93IHN1cHBvcnRzIFNJT19MT09QQkFDS19GQVNUX1BBVEguIFBhdGNoIGJ5CisgIERhbmllbCBTdG9rZXMuCisKIC0gSXNzdWUgIzI3MDQ4OiBQcmV2ZW50cyBkaXN0dXRpbHMgZmFpbGluZyBvbiBXaW5kb3dzIHdoZW4gZW52aXJvbm1lbnQKICAgdmFyaWFibGVzIGNvbnRhaW4gbm9uLUFTQ0lJIGNoYXJhY3RlcnMKIApAQCAtNzMsOSArMTM0LDE1IEBACiAgIFRydW5jYXRlIHNpemUgdG8gSU5UX01BWCBhbmQgbG9vcCB1bnRpbCB3ZSBjb2xsZWN0ZWQgZW5vdWdoIHJhbmRvbSBieXRlcywKICAgaW5zdGVhZCBvZiBjYXN0aW5nIGEgZGlyZWN0bHkgUHlfc3NpemVfdCB0byBpbnQuCiAKKy0gSXNzdWUgIzE2ODY0OiBzcWxpdGUzLkN1cnNvci5sYXN0cm93aWQgbm93IHN1cHBvcnRzIFJFUExBQ0Ugc3RhdGVtZW50LgorICBJbml0aWFsIHBhdGNoIGJ5IEFsZXggTG9yZFRob3JzZW4uCisKIC0gSXNzdWUgIzI2Mzg2OiBGaXhlZCB0dGsuVHJlZVZpZXcgc2VsZWN0aW9uIG9wZXJhdGlvbnMgd2l0aCBpdGVtIGlkJ3MKICAgY29udGFpbmluZyBzcGFjZXMuCiAKKy0gSXNzdWUgIzg2Mzc6IEhvbm9yIGEgcGFnZXIgc2V0IGJ5IHRoZSBlbnYgdmFyIE1BTlBBR0VSIChpbiBwcmVmZXJlbmNlIHRvCisgIG9uZSBzZXQgYnkgdGhlIGVudiB2YXIgUEFHRVIpLgorCiAtIElzc3VlICMyMjYzNjogQXZvaWQgc2hlbGwgaW5qZWN0aW9uIHByb2JsZW1zIHdpdGgKICAgY3R5cGVzLnV0aWwuZmluZF9saWJyYXJ5KCkuCiAKQEAgLTgzLDMxICsxNTAsNjkgQEAKICAgbG9jYWxlIGVuY29kaW5nLCBhbmQgZml4IGdldF9iZWdpZHgoKSBhbmQgZ2V0X2VuZGlkeCgpIHRvIHJldHVybiBjb2RlIHBvaW50CiAgIGluZGV4ZXMuCiAKLS0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgV2luZG93cyBidWlsZHMgdG8gdXNlIE9wZW5TU0wgMS4wLjJoLgotCiAtIElzc3VlICMyNzM5MjogQWRkIGxvb3AuY29ubmVjdF9hY2NlcHRlZF9zb2NrZXQoKS4KICAgUGF0Y2ggYnkgSmltIEZ1bHRvbi4KIAogSURMRQogLS0tLQogCistIElzc3VlICMyNzQ3NzogSURMRSBzZWFyY2ggZGlhbG9ncyBub3cgdXNlIHR0ayB3aWRnZXRzLgorCistIElzc3VlICMyNzE3MzogQWRkICdJRExFIE1vZGVybiBVbml4JyB0byB0aGUgYnVpbHQtaW4ga2V5IHNldHMuCisgIE1ha2UgdGhlIGRlZmF1bHQga2V5IHNldCBkZXBlbmQgb24gdGhlIHBsYXRmb3JtLgorICBBZGQgdGVzdHMgZm9yIHRoZSBjaGFuZ2VzIHRvIHRoZSBjb25maWcgbW9kdWxlLgorCistIElzc3VlICMyNzQ1MjogbWFrZSBjb21tYW5kIGxpbmUgImlkbGUtdGVzdD4gcHl0aG9uIHRlc3RfaGVscC5weSIgd29yay4KKyAgX19maWxlX18gaXMgcmVsYXRpdmUgd2hlbiBweXRob24gaXMgc3RhcnRlZCBpbiB0aGUgZmlsZSdzIGRpcmVjdG9yeS4KKworLSBJc3N1ZSAjMjc0NTI6IGFkZCBsaW5lIGNvdW50ZXIgYW5kIGNyYyB0byBJRExFIGNvbmZpZ0hhbmRsZXIgdGVzdCBkdW1wLgorCistIElzc3VlICMyNzM4MDogSURMRTogYWRkIHF1ZXJ5LnB5IHdpdGggYmFzZSBRdWVyeSBkaWFsb2cgYW5kIHR0ayB3aWRnZXRzLgorICBNb2R1bGUgaGFkIHN1YmNsYXNzZXMgU2VjdGlvbk5hbWUsIE1vZHVsZU5hbWUsIGFuZCBIZWxwU291cmNlLCB3aGljaCBhcmUKKyAgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gZnJvbSB1c2VycyBieSBjb25maWdkaWFsb2cgYW5kIGZpbGUgPT5Mb2FkIE1vZHVsZS4KKyAgRWFjaCBzdWJjbGFzcyBoYXMgaXR3IG93biB2YWxpZGl0eSBjaGVja3MuICBVc2luZyBNb2R1bGVOYW1lIGFsbG93cyB1c2VycworICB0byBlZGl0IGJhZCBtb2R1bGUgbmFtZXMgaW5zdGVhZCBvZiBzdGFydGluZyBvdmVyLgorICBBZGQgdGVzdHMgYW5kIGRlbGV0ZSB0aGUgdHdvIGZpbGVzIGNvbWJpbmVkIGludG8gdGhlIG5ldyBvbmUuCisKKy0gSXNzdWUgIzI3MzcyOiBUZXN0X2lkbGUgbm8gbG9uZ2VyIGNoYW5nZXMgdGhlIGxvY2FsZS4KKwogLSBJc3N1ZSAjMjczNjU6IEFsbG93IG5vbi1hc2NpaSBjaGFycyBpbiBJRExFIE5FV1MudHh0LCBmb3IgY29udHJpYnV0b3IgbmFtZXMuCiAKIC0gSXNzdWUgIzI3MjQ1OiBJRExFOiBDbGVhbmx5IGRlbGV0ZSBjdXN0b20gdGhlbWVzIGFuZCBrZXkgYmluZGluZ3MuCiAgIFByZXZpb3VzbHksIHdoZW4gSURMRSB3YXMgc3RhcnRlZCBmcm9tIGEgY29uc29sZSBvciBieSBpbXBvcnQsIGEgY2FzY2FkZQogICBvZiB3YXJuaW5ncyB3YXMgZW1pdHRlZC4gIFBhdGNoIGJ5IFNlcmhpeSBTdG9yY2hha2EuCiAKKy0gSXNzdWUgIzI0MTM3OiBSdW4gSURMRSwgdGVzdF9pZGxlLCBhbmQgaHRlc3Qgd2l0aCB0a2ludGVyIGRlZmF1bHQgcm9vdCBkaXNhYmxlZC4KKyAgRml4IGNvZGUgYW5kIHRlc3RzIHRoYXQgZmFpbCB3aXRoIHRoaXMgcmVzdHJpY3Rpb24uCisgIEZpeCBodGVzdHMgdG8gbm90IGNyZWF0ZSBhIHNlY29uZCBhbmQgcmVkdW5kYW50IHJvb3QgYW5kIG1haW5sb29wLgorCistIElzc3VlICMyNzMxMDogRml4IElETEUuYXBwIGZhaWx1cmUgdG8gbGF1bmNoIG9uIE9TIFggZHVlIHRvIHZlc3RpZ2lhbCBpbXBvcnQuCisKIEMgQVBJCiAtLS0tLQogCiAtIElzc3VlICMyNjc1NDogUHlVbmljb2RlX0ZTRGVjb2RlcigpIGFjY2VwdGVkIGEgZmlsZW5hbWUgYXJndW1lbnQgZW5jb2RlZCBhcwotICBhbiBpdGVyYWJsZSBvZiBpbnRlZ2Vycy4gTm93IG9ubHkgc3RyaW5ncyBhbmQgYnl0ZXMtbGlrZSBvYmplY3RzIGFyZSBhY2NlcHRlZC4KKyAgYW4gaXRlcmFibGUgb2YgaW50ZWdlcnMuIE5vdyBvbmx5IHN0cmluZ3MgYW5kIGJ5dGUtbGlrZSBvYmplY3RzIGFyZSBhY2NlcHRlZC4KIAotVGVzdHMKK0J1aWxkCiAtLS0tLQogCi0tIElzc3VlICMyNzM2OTogSW4gdGVzdF9weWV4cGF0LCBhdm9pZCB0ZXN0aW5nIGFuIGVycm9yIG1lc3NhZ2UgZGV0YWlsIHRoYXQKLSAgY2hhbmdlZCBpbiBFeHBhdCAyLjIuMC4KKy0gSXNzdWUgIzI3NDQyOiBFeHBvc2UgdGhlIEFuZHJvaWQgQVBJIGxldmVsIHRoYXQgcHl0aG9uIHdhcyBidWlsdCBhZ2FpbnN0LCBpbgorICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCkgYXMgJ0FORFJPSURfQVBJX0xFVkVMJy4KKworLSBJc3N1ZSAjMjc0MzQ6IFRoZSBpbnRlcnByZXRlciB0aGF0IHJ1bnMgdGhlIGNyb3NzLWJ1aWxkLCBmb3VuZCBpbiBQQVRILCBtdXN0CisgIG5vdyBiZSBvZiB0aGUgc2FtZSBmZWF0dXJlIHZlcnNpb24gKGUuZy4gMy42KSBhcyB0aGUgc291cmNlIGJlaW5nIGJ1aWx0LgorCistIElzc3VlICMyNjkzMDogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIHRvIHVzZSBPcGVuU1NMIDEuMC4yaC4KKworLSBJc3N1ZSAjMjM5Njg6IFJlbmFtZSB0aGUgcGxhdGZvcm0gZGlyZWN0b3J5IGZyb20gcGxhdC0kKE1BQ0hERVApIHRvCisgIHBsYXQtJChQTEFURk9STV9UUklQTEVUKS4KKyAgUmVuYW1lIHRoZSBjb25maWcgZGlyZWN0b3J5IChMSUJQTCkgZnJvbSBjb25maWctJChMRFZFUlNJT04pIHRvCisgIGNvbmZpZy0kKExEVkVSU0lPTiktJChQTEFURk9STV9UUklQTEVUKS4KKyAgSW5zdGFsbCB0aGUgcGxhdGZvcm0gc3BlY2lmYyBfc3lzY29uZmlnZGF0YSBtb2R1bGUgaW50byB0aGUgcGxhdGZvcm0KKyAgZGlyZWN0b3J5IGFuZCByZW5hbWUgaXQgdG8gaW5jbHVkZSB0aGUgQUJJRkxBR1MuCisKKy0gRG9uJ3QgdXNlIGxhcmdlZmlsZSBzdXBwb3J0IGZvciBHTlUvSHVyZC4KIAogVG9vbHMvRGVtb3MKIC0tLS0tLS0tLS0tCkBAIC0xMTcsMzkgKzIyMiwzMjEgQEAKIAogLSBJc3N1ZSAjMjc0MTg6IEZpeGVkIFRvb2xzL2ltcG9ydGJlbmNoL2ltcG9ydGJlbmNoLnB5LgogCitEb2N1bWVudGF0aW9uCistLS0tLS0tLS0tLS0tCiAKLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4yPwotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJlbGVhc2UgZGF0ZTogMjAxNi0wNi0yNgotCi1Db3JlIGFuZCBCdWlsdGlucwotLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBJc3N1ZSAjMjY5MzA6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyB0byB1c2UgT3BlblNTTCAxLjAuMmguCistIElzc3VlICMyNzI4NTogVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gcmVmbGVjdCB0aGUgZGVwcmVjYXRpb24gb2YgYGBweXZlbnZgYAorICBhbmQgbm9ybWFsaXplIG9uIHRoZSB0ZXJtICJ2aXJ0dWFsIGVudmlyb25tZW50Ii4gUGF0Y2ggYnkgU3RldmUgUGllcmN5LgogCiBUZXN0cwogLS0tLS0KIAotLSBJc3N1ZSAjMjY4Njc6IFVidW50dSdzIG9wZW5zc2wgT1BfTk9fU1NMdjMgaXMgZm9yY2VkIG9uIGJ5IGRlZmF1bHQ7IGZpeCB0ZXN0LgotCi1JRExFCi0tLS0tCi0KLS0gSXNzdWUgIzI3MzY1OiBBbGxvdyBub24tYXNjaWkgaW4gaWRsZWxpYi9ORVdTLnR4dCAtIG1pbmltYWwgcGFydCBmb3IgMy41LjIuCistIElzc3VlICMyNzAyNzogQWRkZWQgdGVzdC5zdXBwb3J0LmlzX2FuZHJvaWQgdGhhdCBpcyBUcnVlIHdoZW4gdGhpcyBpcyBhbgorICBBbmRyb2lkIGJ1aWxkLgogCiAKLVdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4yIHJlbGVhc2UgY2FuZGlkYXRlIDE/Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorV2hhdCdzIE5ldyBpbiBQeXRob24gMy42LjAgYWxwaGEgMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZWxlYXNlIGRhdGU6IDIwMTYtMDYtMTIKKypSZWxlYXNlIGRhdGU6IDIwMTYtMDYtMTMqCiAKIENvcmUgYW5kIEJ1aWx0aW5zCiAtLS0tLS0tLS0tLS0tLS0tLQogCistIElzc3VlICMyNzA5NTogU2ltcGxpZmllZCBNQUtFX0ZVTkNUSU9OIGFuZCByZW1vdmVkIE1BS0VfQ0xPU1VSRSBvcGNvZGVzLgorICBQYXRjaCBieSBEZW11ciBSdW1lZC4KKworLSBJc3N1ZSAjMjcxOTA6IFJhaXNlIE5vdFN1cHBvcnRlZEVycm9yIGlmIHNxbGl0ZTMgaXMgb2xkZXIgdGhhbiAzLjMuMS4KKyAgUGF0Y2ggYnkgRGF2ZSBTYXd5ZXIuCisKKy0gSXNzdWUgIzI3Mjg2OiBGaXhlZCBjb21waWxpbmcgQlVJTERfTUFQX1VOUEFDS19XSVRIX0NBTEwgb3Bjb2RlLiAgQ2FsbGluZworICBmdW5jdGlvbiB3aXRoIGdlbmVyYWxpemVkIHVucGFja2luZyAoUEVQIDQ0OCkgYW5kIGNvbmZsaWN0aW5nIGtleXdvcmQgbmFtZXMKKyAgY291bGQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorCistIElzc3VlICMyNzE0MDogQWRkZWQgQlVJTERfQ09OU1RfS0VZX01BUCBvcGNvZGUuCisKKy0gSXNzdWUgIzI3MTg2OiBBZGQgc3VwcG9ydCBmb3Igb3MuUGF0aExpa2Ugb2JqZWN0cyB0byBvcGVuKCkgKHBhcnQgb2YgUEVQIDUxOSkuCisKIC0gSXNzdWUgIzI3MDY2OiBGaXhlZCBTeXN0ZW1FcnJvciBpZiBhIGN1c3RvbSBvcGVuZXIgKGZvciBvcGVuKCkpIHJldHVybnMgYQogICBuZWdhdGl2ZSBudW1iZXIgd2l0aG91dCBzZXR0aW5nIGFuIGV4Y2VwdGlvbi4KIAorLSBJc3N1ZSAjMjY5ODM6IGZsb2F0KCkgbm93IGFsd2F5cyByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgZXhhY3QgZmxvYXQuCisgIFRoZSBkZXByZWNhdGlvbiB3YXJuaW5nIGlzIGVtaXR0ZWQgaWYgX19mbG9hdF9fIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YKKyAgYSBzdHJpY3Qgc3ViY2xhc3Mgb2YgZmxvYXQuICBJbiBhIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQeXRob24gdGhpcyBjYW4KKyAgYmUgYW4gZXJyb3IuCisKKy0gSXNzdWUgIzI3MDk3OiBQeXRob24gaW50ZXJwcmV0ZXIgaXMgbm93IGFib3V0IDclIGZhc3RlciBkdWUgdG8gb3B0aW1pemVkCisgIGluc3RydWN0aW9uIGRlY29kaW5nLiAgQmFzZWQgb24gcGF0Y2ggYnkgRGVtdXIgUnVtZWQuCisKKy0gSXNzdWUgIzI2NjQ3OiBQeXRob24gaW50ZXJwcmV0ZXIgbm93IHVzZXMgMTYtYml0IHdvcmRjb2RlIGluc3RlYWQgb2YgYnl0ZWNvZGUuCisgIFBhdGNoIGJ5IERlbXVyIFJ1bWVkLgorCistIElzc3VlICMyMzI3NTogQWxsb3cgYXNzaWduaW5nIHRvIGFuIGVtcHR5IHRhcmdldCBsaXN0IGluIHJvdW5kIGJyYWNrZXRzOgorICAoKSA9IGl0ZXJhYmxlLgorCistIElzc3VlICMyNzI0MzogVXBkYXRlIHRoZSBfX2FpdGVyX18gcHJvdG9jb2w6IGluc3RlYWQgb2YgcmV0dXJuaW5nCisgIGFuIGF3YWl0YWJsZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFzeW5jaHJvbm91cyBpdGVyYXRvciwgdGhlIGFzeW5jaHJvbm91cworICBpdGVyYXRvciBzaG91bGQgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBEb2luZyB0aGUgZm9ybWVyIHdpbGwgdHJpZ2dlciBhCisgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcuCisKKworTGlicmFyeQorLS0tLS0tLQorCistIENvbW1lbnQgb3V0IHNvY2tldCAoU09fUkVVU0VQT1JUKSBhbmQgcG9zaXggKE9fU0hMT0NLLCBPX0VYTE9DSykgY29uc3RhbnRzCisgIGV4cG9zZWQgb24gdGhlIEFQSSB3aGljaCBhcmUgbm90IGltcGxlbWVudGVkIG9uIEdOVS9IdXJkLiBUaGV5IHdvdWxkIG5vdAorICB3b3JrIGF0IHJ1bnRpbWUgYW55d2F5LgorCistIElzc3VlICMyNTQ1NTogRml4ZWQgY3Jhc2hlcyBpbiByZXByIG9mIHJlY3Vyc2l2ZSBFbGVtZW50VHJlZS5FbGVtZW50IGFuZAorICBmdW5jdG9vbHMucGFydGlhbCBvYmplY3RzLgorCistIElzc3VlICMyNzI5NDogSW1wcm92ZWQgcmVwciBmb3IgVGtpbnRlciBldmVudCBvYmplY3RzLgorCistIElzc3VlICMyMDUwODogSW1wcm92ZSBleGNlcHRpb24gbWVzc2FnZSBvZiBJUHZ7NCw2fU5ldHdvcmsuX19nZXRpdGVtX18uCisgIFBhdGNoIGJ5IEdhcmV0aCBSZWVzLgorCistIElzc3VlICMyNjU1NjogVXBkYXRlIGV4cGF0IHRvIDIuMS4xLCBmaXhlcyBDVkUtMjAxNS0xMjgzLgorCistIEZpeCBUTFMgc3RyaXBwaW5nIHZ1bG5lcmFiaWxpdHkgaW4gc210cGxpYiwgQ1ZFLTIwMTYtMDc3Mi4gIFJlcG9ydGVkIGJ5IFRlYW0KKyAgT3N0c3Ryb20KKworLSBJc3N1ZSAjMjEzODY6IEltcGxlbWVudCBtaXNzaW5nIElQdjRBZGRyZXNzLmlzX2dsb2JhbCBwcm9wZXJ0eS4gIEl0IHdhcworICBkb2N1bWVudGVkIHNpbmNlIDA3YTU2MTBiYWU5ZC4gIEluaXRpYWwgcGF0Y2ggYnkgUm9nZXIgTHVldGhpLgorCistIElzc3VlICMyNzAyOTogUmVtb3ZlZCBkZXByZWNhdGVkIHN1cHBvcnQgb2YgdW5pdmVyc2FsIG5ld2xpbmVzIG1vZGUgZnJvbQorICBaaXBGaWxlLm9wZW4oKS4KKworLSBJc3N1ZSAjMjcwMzA6IFVua25vd24gZXNjYXBlcyBjb25zaXN0aW5nIG9mIGBgJ1wnYGAgYW5kIGFuIEFTQ0lJIGxldHRlciBpbgorICByZWd1bGFyIGV4cHJlc3Npb25zIG5vdyBhcmUgZXJyb3JzLiAgVGhlIHJlLkxPQ0FMRSBmbGFnIG5vdyBjYW4gYmUgdXNlZAorICBvbmx5IHdpdGggYnl0ZXMgcGF0dGVybnMuCisKKy0gSXNzdWUgIzI3MTg2OiBBZGQgb3MuUGF0aExpa2Ugc3VwcG9ydCB0byBEaXJFbnRyeSAocGFydCBvZiBQRVAgNTE5KS4KKyAgSW5pdGlhbCBwYXRjaCBieSBKZWxsZSBaaWpsc3RyYS4KKworLSBJc3N1ZSAjMjA5MDA6IGRpc3R1dGlscyByZWdpc3RlciBjb21tYW5kIG5vdyBkZWNvZGVzIEhUVFAgcmVzcG9uc2VzCisgIGNvcnJlY3RseS4gIEluaXRpYWwgcGF0Y2ggYnkgaW5ncmlkLgorCistIElzc3VlICMyNzE4NjogQWRkIG9zLlBhdGhMaWtlIHN1cHBvcnQgdG8gcGF0aGxpYiwgcmVtb3ZpbmcgaXRzIHByb3Zpc2lvbmFsCisgIHN0YXR1cyAocGFydCBvZiBQRVAgNTE5KS4gSW5pdGlhbCBwYXRjaCBieSBEdXN0eSBQaGlsbGlwcy4KKworLSBJc3N1ZSAjMjcxODY6IEFkZCBzdXBwb3J0IGZvciBvcy5QYXRoTGlrZSBvYmplY3RzIHRvIG9zLmZzZW5jb2RlKCkgYW5kCisgIG9zLmZzZGVjb2RlKCkgKHBhcnQgb2YgUEVQIDUxOSkuCisKKy0gSXNzdWUgIzI3MTg2OiBJbnRyb2R1Y2Ugb3MuUGF0aExpa2UgYW5kIG9zLmZzcGF0aCgpIChwYXJ0IG9mIFBFUCA1MTkpLgorCistIEEgbmV3IHZlcnNpb24gb2YgdHlwaW5nLnB5IHByb3ZpZGVzIHNldmVyYWwgbmV3IGNsYXNzZXMgYW5kCisgIGZlYXR1cmVzOiBAb3ZlcmxvYWQgb3V0c2lkZSBzdHVicywgUmV2ZXJzaWJsZSwgRGVmYXVsdERpY3QsIFRleHQsCisgIENvbnRleHRNYW5hZ2VyLCBUeXBlW10sIE5ld1R5cGUoKSwgVFlQRV9DSEVDS0lORywgYW5kIG51bWVyb3VzIGJ1ZworICBmaXhlcyAobm90ZSB0aGF0IHNvbWUgb2YgdGhlIG5ldyBmZWF0dXJlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCBpbgorICBteXB5IG9yIG90aGVyIHN0YXRpYyBhbmFseXplcnMpLiAgQWxzbyBjbGFzc2VzIGZvciBQRVAgNDkyCisgIChBd2FpdGFibGUsIEFzeW5jSXRlcmFibGUsIEFzeW5jSXRlcmF0b3IpIGhhdmUgYmVlbiBhZGRlZCAoaW4gZmFjdAorICB0aGV5IG1hZGUgaXQgaW50byAzLjUuMSBidXQgd2VyZSBuZXZlciBtZW50aW9uZWQpLgorCistIElzc3VlICMyNTczODogU3RvcCBodHRwLnNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLnNlbmRfZXJyb3IoKSBmcm9tCisgIHNlbmRpbmcgYSBtZXNzYWdlIGJvZHkgZm9yIDIwNSBSZXNldCBDb250ZW50LiAgQWxzbywgZG9uJ3Qgc2VuZCBDb250ZW50CisgIGhlYWRlciBmaWVsZHMgaW4gcmVzcG9uc2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJvZHkuICBQYXRjaCBieSBTdXN1bXUKKyAgS29zaGliYS4KKworLSBJc3N1ZSAjMjEzMTM6IEZpeCB0aGUgInBsYXRmb3JtIiBtb2R1bGUgdG8gdG9sZXJhdGUgd2hlbiBzeXMudmVyc2lvbgorICBjb250YWlucyB0cnVuY2F0ZWQgYnVpbGQgaW5mb3JtYXRpb24uCisKKy0gSXNzdWUgIzI2ODM5OiBPbiBMaW51eCwgOmZ1bmM6YG9zLnVyYW5kb21gIG5vdyBjYWxscyBgYGdldHJhbmRvbSgpYGAgd2l0aAorICBgYEdSTkRfTk9OQkxPQ0tgYCB0byBmYWxsIGJhY2sgb24gcmVhZGluZyBgYC9kZXYvdXJhbmRvbWBgIGlmIHRoZSB1cmFuZG9tCisgIGVudHJvcHkgcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQYXRjaCB3cml0dGVuIGJ5IENvbG0gQnVja2xleS4KKworLSBJc3N1ZSAjMjM4ODM6IEFkZGVkIG1pc3NpbmcgQVBJcyB0byBfX2FsbF9fIHRvIG1hdGNoIHRoZSBkb2N1bWVudGVkIEFQSXMKKyAgZm9yIHRoZSBmb2xsb3dpbmcgbW9kdWxlczogY2dpLCBtYWlsYm94LCBtaW1ldHlwZXMsIHBsaXN0bGliIGFuZCBzbXRwZC4KKyAgUGF0Y2hlcyBieSBKYWNlayBLb8WCb2R6aWVqLgorCistIElzc3VlICMyNzE2NDogSW4gdGhlIHpsaWIgbW9kdWxlLCBhbGxvdyBkZWNvbXByZXNzaW5nIHJhdyBEZWZsYXRlIHN0cmVhbXMKKyAgd2l0aCBhIHByZWRlZmluZWQgemRpY3QuICBCYXNlZCBvbiBwYXRjaCBieSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjQyOTE6IEZpeCB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIuV1NHSVJlcXVlc3RIYW5kbGVyIHRvIGNvbXBsZXRlbHkKKyAgd3JpdGUgZGF0YSB0byB0aGUgY2xpZW50LiAgUHJldmlvdXNseSBpdCBjb3VsZCBkbyBwYXJ0aWFsIHdyaXRlcyBhbmQKKyAgdHJ1bmNhdGUgZGF0YS4gIEFsc28sIHdzZ2lyZWYuaGFuZGxlci5TZXJ2ZXJIYW5kbGVyIGNhbiBub3cgaGFuZGxlIHN0ZG91dAorICBkb2luZyBwYXJ0aWFsIHdyaXRlcywgYnV0IHRoaXMgaXMgZGVwcmVjYXRlZC4KKworLSBJc3N1ZSAjMjEyNzI6IFVzZSBfc3lzY29uZmlnZGF0YS5weSB0byBpbml0aWFsaXplIGRpc3R1dGlscy5zeXNjb25maWcuCisKKy0gSXNzdWUgIzE5NjExOiA6bW9kOmBpbnNwZWN0YCBub3cgcmVwb3J0cyB0aGUgaW1wbGljaXQgYGAuMGBgIHBhcmFtZXRlcnMKKyAgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgY29tcHJlaGVuc2lvbiBhbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gc2NvcGVzCisgIGFzIGlmIHRoZXkgd2VyZSBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycyBjYWxsZWQgYGBpbXBsaWNpdDBgYC4KKyAgUGF0Y2ggYnkgSmVsbGUgWmlqbHN0cmEuCisKKy0gSXNzdWUgIzI2ODA5OiBBZGQgYGBfX2FsbF9fYGAgdG8gOm1vZDpgc3RyaW5nYC4gIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCisKKy0gSXNzdWUgIzI2MzczOiBzdWJwcm9jZXNzLlBvcGVuLmNvbW11bmljYXRlIG5vdyBjb3JyZWN0bHkgaWdub3JlcworICBCcm9rZW5QaXBlRXJyb3Igd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVzIGJlZm9yZSAuY29tbXVuaWNhdGUoKQorICBpcyBjYWxsZWQgaW4gbW9yZS9hbGwgY2lyY3Vtc3RhbmNlcy4KKworLSBzaWduYWwsIHNvY2tldCwgYW5kIHNzbCBtb2R1bGUgSW50RW51bSBjb25zdGFudCBuYW1lIGxvb2t1cHMgbm93IHJldHVybiBhCisgIGNvbnNpc3RlbnQgbmFtZSBmb3IgdmFsdWVzIGhhdmluZyBtdWx0aXBsZSBuYW1lcy4gIEV4OiBzaWduYWwuU2lnbmFscyg2KQorICBub3cgcmVmZXJzIHRvIGl0c2VsZiBhcyBzaWduYWwuU0lHQUxSTSByYXRoZXIgdGhhbiBmbGlwcGluZyBiZXR3ZWVuIHRoYXQKKyAgYW5kIHNpZ25hbC5TSUdJT1QgYmFzZWQgb24gdGhlIGludGVycHJldGVyJ3MgaGFzaCByYW5kb21pemF0aW9uIHNlZWQuCisKKy0gSXNzdWUgIzI3MTY3OiBDbGFyaWZ5IHRoZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBlcnJvciBtZXNzYWdlIHRleHQKKyAgd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVkIGR1ZSB0byBhIHNpZ25hbC4KKworLSBJc3N1ZSAjMjU5MzE6IERvbid0IGRlZmluZSBzb2NrZXRzZXJ2ZXIuRm9ya2luZyogbmFtZXMgb24gcGxhdGZvcm1zIHN1Y2gKKyAgYXMgV2luZG93cyB0aGF0IGRvIG5vdCBzdXBwb3J0IG9zLmZvcmsoKS4KKworLSBJc3N1ZSAjMjE3NzY6IGRpc3R1dGlscy51cGxvYWQgbm93IGNvcnJlY3RseSBoYW5kbGVzIEhUVFBFcnJvci4KKyAgSW5pdGlhbCBwYXRjaCBieSBDbGF1ZGl1IFBvcGEuCisKKy0gSXNzdWUgIzI2NTI2OiBSZXBsYWNlIGN1c3RvbSBwYXJzZSB0cmVlIHZhbGlkYXRpb24gaW4gdGhlIHBhcnNlcgorICBtb2R1bGUgd2l0aCBhIHNpbXBsZSBERkEgdmFsaWRhdG9yLgorCistIElzc3VlICMyNzExNDogRml4IFNTTENvbnRleHQuX2xvYWRfd2luZG93c19zdG9yZV9jZXJ0cyBmYWlscyB3aXRoCisgIFBlcm1pc3Npb25FcnJvcgorCistIElzc3VlICMxODM4MzogQXZvaWQgY3JlYXRpbmcgZHVwbGljYXRlIGZpbHRlcnMgd2hlbiB1c2luZyBmaWx0ZXJ3YXJuaW5ncworICBhbmQgc2ltcGxlZmlsdGVyLiAgQmFzZWQgb24gcGF0Y2ggYnkgQWxleCBTaGtvcC4KKworLSBJc3N1ZSAjMjMwMjY6IHdpbnJlZy5RdWVyeVZhbHVlRXgoKSBub3cgcmV0dXJuIGFuIGludGVnZXIgZm9yIFJFR19RV09SRCB0eXBlLgorCistIElzc3VlICMyNjc0MTogc3VicHJvY2Vzcy5Qb3BlbiBkZXN0cnVjdG9yIG5vdyBlbWl0cyBhIFJlc291cmNlV2FybmluZyB3YXJuaW5nCisgIGlmIHRoZSBjaGlsZCBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcuCisKKy0gSXNzdWUgIzI3MDU2OiBPcHRpbWl6ZSBwaWNrbGUubG9hZCgpIGFuZCBwaWNrbGUubG9hZHMoKSwgdXAgdG8gMTAlIGZhc3RlcgorICB0byBkZXNlcmlhbGl6ZSBhIGxvdCBvZiBzbWFsbCBvYmplY3RzLgorCistIElzc3VlICMyMTI3MTogTmV3IGtleXdvcmQgb25seSBwYXJhbWV0ZXJzIGluIHJlc2V0X21vY2sgY2FsbC4KKworSURMRQorLS0tLQorCistIElzc3VlICM1MTI0OiBQYXN0ZSB3aXRoIHRleHQgc2VsZWN0ZWQgbm93IHJlcGxhY2VzIHRoZSBzZWxlY3Rpb24gb24gWDExLgorICBUaGlzIG1hdGNoZXMgaG93IHBhc3RlIHdvcmtzIG9uIFdpbmRvd3MsIE1hYywgbW9zdCBtb2Rlcm4gTGludXggYXBwcywKKyAgYW5kIHR0ayB3aWRnZXRzLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjQ3NTA6IFN3aXRjaCBhbGwgc2Nyb2xsYmFycyBpbiBJRExFIHRvIHR0ayB2ZXJzaW9ucy4KKyAgV2hlcmUgbmVlZGVkLCBtaW5pbWFsIHRlc3RzIGFyZSBhZGRlZCB0byBjb3ZlciBjaGFuZ2VzLgorCistIElzc3VlICMyNDc1OTogSURMRSByZXF1aXJlcyB0ayA4LjUgYW5kIGF2YWlsYWJpbGl0eSB0dGsgd2lkZ2V0cy4KKyAgRGVsZXRlIG5vdyB1bm5lZWRlZCB0ayB2ZXJzaW9uIHRlc3RzIGFuZCBjb2RlIGZvciBvbGRlciB2ZXJzaW9ucy4KKyAgQWRkIHRlc3QgZm9yIElETEUgc3ludGF4IGNvbG9yaXpvZXIuCisKKy0gSXNzdWUgIzI3MjM5OiBpZGxlbGliLm1hY29zeC5pc1h5elRrIGZ1bmN0aW9ucyBpbml0aWFsaXplIGFzIG5lZWRlZC4KKworLSBJc3N1ZSAjMjcyNjI6IG1vdmUgQXF1YSB1bmJpbmRpbmcgY29kZSwgd2hpY2ggZW5hYmxlIGNvbnRleHQgbWVudXMsIHRvIG1heG9zeC4KKworLSBJc3N1ZSAjMjQ3NTk6IE1ha2UgY2xlYXIgaW4gaWRsZWxpYi5pZGxlX3Rlc3QuX19pbml0X18gdGhhdCB0aGUgZGlyZWN0b3J5CisgIGlzIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXN0LnRlc3RfaWRsZSBhbmQgdG9vbCBmb3IgbWFpbnRhaW5lcnMuCisKKy0gSXNzdWUgIzI3MTk2OiBTdG9wICdUaGVtZUNoYW5nZWQnIHdhcm5pbmdzIHdoZW4gcnVubmluZyBJRExFIHRlc3RzLgorICBUaGVzZSBwZXJzaXN0ZWQgYWZ0ZXIgb3RoZXIgd2FybmluZ3Mgd2VyZSBzdXBwcmVzc2VkIGluICMyMDU2Ny4KKyAgQXBwbHkgU2VyaGl5IFN0b3JjaGFrYSdzIHVwZGF0ZV9pZGxldGFza3Mgc29sdXRpb24gdG8gZm91ciB0ZXN0IGZpbGVzLgorICBSZWNvcmQgdGhpcyBhZGRpdGlvbmFsIGFkdmljZSBpbiBpZGxlX3Rlc3QvUkVBRE1FLnR4dAorCistIElzc3VlICMyMDU2NzogUmV2aXNlIGlkbGVfdGVzdC9SRUFETUUudHh0IHdpdGggYWR2aWNlIGFib3V0IGF2b2lkaW5nCisgIHRrIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0ZXN0cy4gIEFwcGx5IGFkdmljZSB0byBzZXZlcmFsIElETEUgdGVzdHMuCisKKy0gSXNzdWUgIzI0MjI1OiBVcGRhdGUgaWRsZWxpYi9SRUFETUUudHh0IHdpdGggbmV3IGZpbGUgbmFtZXMKKyAgYW5kIGV2ZW50IGhhbmRsZXJzLgorCistIElzc3VlICMyNzE1NjogUmVtb3ZlIG9ic29sZXRlIGNvZGUgbm90IHVzZWQgYnkgSURMRS4gIFJlcGxhY2VtZW50czoKKyAgMS4gaGVscC50eHQsIHJlcGxhY2VkIGJ5IGhlbHAuaHRtbCwgaXMgb3V0LW9mLWRhdGUgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4KKyAgSXRzIGRlZGljYXRlZCB2aWV3ZXIgaGFzIGJlIHJlcGxhY2VkIGJ5IHRoZSBodG1sIHZpZXdlciBpbiBoZWxwLnB5LgorICAyLiDigJhgaW1wb3J0IGlkbGV2ZXI7IEkgPSBpZGxldmVyLklETEVfVkVSU0lPTmDigJkgaXMgdGhlIHNhbWUgYXMKKyAg4oCYYGltcG9ydCBzeXM7IEkgPSB2ZXJzaW9uWzp2ZXJzaW9uLmluZGV4KCcgJyldYOKAmQorICAzLiBBZnRlciDigJhgb2IgPSBzdGFja3ZpZXdlci5WYXJpYWJsZXNUcmVlSXRlbSgqYXJncylg4oCZLAorICDigJhgb2Iua2V5cygpID09IGxpc3Qob2Iub2JqZWN0LmtleXMpYOKAmS4KKyAgNC4gSW4gbWFjb3NjLCBydW5uaW5nQXNPU1hBUFAgPT0gaXNBcXVhVGs7IGlkQ2FyYm9uQXF1YVRrID09IGlzQ2FyYm9uVGsKKworLSBJc3N1ZSAjMjcxMTc6IE1ha2UgY29sb3JpemVyIGh0ZXN0IGFuZCB0dXJ0bGVkZW1vIHdvcmsgd2l0aCBkYXJrIHRoZW1lcy4KKyAgTW92ZSBjb2RlIGZvciBjb25maWd1cmluZyB0ZXh0IHdpZGdldCBjb2xvcnMgdG8gYSBuZXcgZnVuY3Rpb24uCisKKy0gSXNzdWUgIzI0MjI1OiBSZW5hbWUgbWFueSBgaWRsZWxpYi8qLnB5YCBhbmQgYGlkbGVfdGVzdC90ZXN0XyoucHlgIGZpbGVzLgorICBFZGl0IGZpbGVzIHRvIHJlcGxhY2Ugb2xkIG5hbWVzIHdpdGggbmV3IG5hbWVzIHdoZW4gdGhlIG9sZCBuYW1lCisgIHJlZmVycmVkIHRvIHRoZSBtb2R1bGUgcmF0aGVyIHRoYW4gdGhlIGNsYXNzIGl0IGNvbnRhaW5lZC4KKyAgU2VlIHRoZSBpc3N1ZSBhbmQgSURMRSBzZWN0aW9uIGluIFdoYXQncyBOZXcgaW4gMy42IGZvciBtb3JlLgorCistIElzc3VlICMyNjY3MzogV2hlbiB0ayByZXBvcnRzIGZvbnQgc2l6ZSBhcyAwLCBjaGFuZ2UgdG8gc2l6ZSAxMC4KKyAgU3VjaCBmb250cyBvbiBMaW51eCBwcmV2ZW50ZWQgdGhlIGNvbmZpZ3VyYXRpb24gZGlhbG9nIGZyb20gb3BlbmluZy4KKworLSBJc3N1ZSAjMjE5Mzk6IEFkZCB0ZXN0IGZvciBJRExFJ3MgcGVyY29sYXRvci4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgorCistIElzc3VlICMyMTY3NjogQWRkIHRlc3QgZm9yIElETEUncyByZXBsYWNlIGRpYWxvZy4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgorCistIElzc3VlICMxODQxMDogQWRkIHRlc3QgZm9yIElETEUncyBzZWFyY2ggZGlhbG9nLgorICBPcmlnaW5hbCBwYXRjaCBieSBXZXN0bGV5IE1hcnTDrW5lei4KKworLSBJc3N1ZSAjMjE3MDM6IEFkZCB0ZXN0IGZvciB1bmRvIGRlbGVnYXRvci4gIFBhdGNoIG1vc3RseSBieQorICBTYWltYWRoYXYgSGVibGlrYXIgLgorCistIElzc3VlICMyNzA0NDogQWRkIENvbmZpZ0RpYWxvZy5yZW1vdmVfdmFyX2NhbGxiYWNrcyB0byBzdG9wIG1lbW9yeSBsZWFrcy4KKworLSBJc3N1ZSAjMjM5Nzc6IEFkZCBtb3JlIGFzc2VydHMgdG8gdGVzdF9kZWxlZ2F0b3IuCisKK0RvY3VtZW50YXRpb24KKy0tLS0tLS0tLS0tLS0KKworLSBJc3N1ZSAjMTY0ODQ6IENoYW5nZSB0aGUgZGVmYXVsdCBQWVRIT05ET0NTIFVSTCB0byAiaHR0cHM6IiwgYW5kIGZpeCB0aGUKKyAgcmVzdWx0aW5nIGxpbmtzIHRvIHVzZSBsb3dlcmNhc2UuICBQYXRjaCBieSBTZWFuIFJvZG1hbiwgdGVzdCBieSBLYXVzaGlrCisgIE5hZGlrdWRpdGkuCisKKy0gSXNzdWUgIzI0MTM2OiBEb2N1bWVudCB0aGUgbmV3IFBFUCA0NDggdW5wYWNraW5nIHN5bnRheCBvZiAzLjUuCisKKy0gSXNzdWUgIzIyNTU4OiBBZGQgcmVtYWluaW5nIGRvYyBsaW5rcyB0byBzb3VyY2UgY29kZSBmb3IgUHl0aG9uLWNvZGVkIG1vZHVsZXMuCisgIFBhdGNoIGJ5IFlvbmkgTGF2aS4KKworVGVzdHMKKy0tLS0tCisKKy0gSXNzdWUgIzI1Mjg1OiByZWdydGVzdCBub3cgdXNlcyBzdWJwcm9jZXNzZXMgd2hlbiB0aGUgLWoxIGNvbW1hbmQgbGluZSBvcHRpb24KKyAgaXMgdXNlZDogZWFjaCB0ZXN0IGZpbGUgcnVucyBpbiBhIGZyZXNoIGNoaWxkIHByb2Nlc3MuIEJlZm9yZSwgdGhlIC1qMSBvcHRpb24KKyAgd2FzIGlnbm9yZWQuCisKKy0gSXNzdWUgIzI1Mjg1OiBUb29scy9idWlsZGJvdC90ZXN0LmJhdCBzY3JpcHQgbm93IHVzZXMgLWoxIGJ5IGRlZmF1bHQgdG8gcnVuCisgIGVhY2ggdGVzdCBmaWxlIGluIGZyZXNoIGNoaWxkIHByb2Nlc3MuCisKK1dpbmRvd3MKKy0tLS0tLS0KKworLSBJc3N1ZSAjMjcwNjQ6IFRoZSBweS5leGUgbGF1bmNoZXIgbm93IGRlZmF1bHRzIHRvIFB5dGhvbiAzLgorICBUaGUgV2luZG93cyBsYXVuY2hlciBgYHB5LmV4ZWBgIG5vIGxvbmdlciBwcmVmZXJzIGFuIGluc3RhbGxlZAorICBQeXRob24gMiB2ZXJzaW9uIG92ZXIgUHl0aG9uIDMgYnkgZGVmYXVsdCB3aGVuIHVzZWQgaW50ZXJhY3RpdmVseS4KKworQnVpbGQKKy0tLS0tCisKKy0gSXNzdWUgIzI3MjI5OiBGaXggdGhlIGNyb3NzLWNvbXBpbGluZyBwZ2VuIHJ1bGUgZm9yIGluLXRyZWUgYnVpbGRzLiAgUGF0Y2gKKyAgYnkgWGF2aWVyIGRlIEdheWUuCisKKy0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgT1MgWCAxMC41KyAzMi1iaXQtb25seSBpbnN0YWxsZXIgdG8gYnVpbGQKKyAgYW5kIGxpbmsgd2l0aCBPcGVuU1NMIDEuMC4yaC4KKworTWlzYworLS0tLQorCistIElzc3VlICMxNzUwMCwgYW5kIGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vcHl0aG9uZG90b3JnL2lzc3Vlcy85NDU6IFJlbW92ZQorICB1bnVzZWQgYW5kIG91dGRhdGVkIGljb25zLgorCitDIEFQSQorLS0tLS0KKworLSBJc3N1ZSAjMjcxODY6IEFkZCB0aGUgUHlPU19GU1BhdGgoKSBmdW5jdGlvbiAocGFydCBvZiBQRVAgNTE5KS4KKworLSBJc3N1ZSAjMjYyODI6IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpIG5vdyBzdXBwb3J0cyBwb3NpdGlvbmFsLW9ubHkKKyAgcGFyYW1ldGVycy4KKworVG9vbHMvRGVtb3MKKy0tLS0tLS0tLS0tCisKKy0gSXNzdWUgIzI2MjgyOiBBcmd1bWVudCBDbGluaWMgbm93IHN1cHBvcnRzIHBvc2l0aW9uYWwtb25seSBhbmQga2V5d29yZAorICBwYXJhbWV0ZXJzIGluIHRoZSBzYW1lIGZ1bmN0aW9uLgorCisKK1doYXQncyBOZXcgaW4gUHl0aG9uIDMuNi4wIGFscGhhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZWxlYXNlIGRhdGU6IDIwMTYtMDUtMTYKKworQ29yZSBhbmQgQnVpbHRpbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKIC0gSXNzdWUgIzIwMDQxOiBGaXhlZCBUeXBlRXJyb3Igd2hlbiBmcmFtZS5mX3RyYWNlIGlzIHNldCB0byBOb25lLgogICBQYXRjaCBieSBYYXZpZXIgZGUgR2F5ZS4KIApAQCAtMTU4LDExICs1NDUsMTcgQEAKIAogLSBJc3N1ZSAjMjY5OTE6IEZpeCBwb3NzaWJsZSByZWZsZWFrIHdoZW4gY3JlYXRpbmcgYSBmdW5jdGlvbiB3aXRoIGFubm90YXRpb25zLgogCi0tIElzc3VlICMyNzAzOTogRml4ZWQgYnl0ZWFycmF5LnJlbW92ZSgpIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNy4gIFBhdGNoIGJ5Ci0gIEpvZSBKZXZuaWsuCistIElzc3VlICMyNzAzOTogRml4ZWQgYnl0ZWFycmF5LnJlbW92ZSgpIGZvciB2YWx1ZXMgZ3JlYXRlciB0aGFuIDEyNy4gIEJhc2VkIG9uCisgIHBhdGNoIGJ5IEpvZSBKZXZuaWsuCiAKIC0gSXNzdWUgIzIzNjQwOiBpbnQuZnJvbV9ieXRlcygpIG5vIGxvbmdlciBieXBhc3NlcyBjb25zdHJ1Y3RvcnMgZm9yIHN1YmNsYXNzZXMuCiAKKy0gSXNzdWUgIzI3MDA1OiBPcHRpbWl6ZWQgdGhlIGZsb2F0LmZyb21oZXgoKSBjbGFzcyBtZXRob2QgZm9yIGV4YWN0IGZsb2F0LgorICBJdCBpcyBub3cgMiB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzE4NTMxOiBTaW5nbGUgdmFyLWtleXdvcmQgYXJndW1lbnQgb2YgZGljdCBzdWJ0eXBlIHdhcyBwYXNzZWQKKyAgdW5zY2F0aGVkIHRvIHRoZSBDLWRlZmluZWQgZnVuY3Rpb24uICBOb3cgaXQgaXMgY29udmVydGVkIHRvIGV4YWN0IGRpY3QuCisKIC0gSXNzdWUgIzI2ODExOiBnYy5nZXRfb2JqZWN0cygpIG5vIGxvbmdlciBjb250YWlucyBhIGJyb2tlbiB0dXBsZSB3aXRoIE5VTEwKICAgcG9pbnRlci4KIApAQCAtMTcyLDExICs1NjUsMjYgQEAKICAgaW50ZXJwb2xhdGlvbiBpbiAucHlwaXJjIGZpbGVzLCBtYXRjaGluZyBiZWhhdmlvciBpbiBQeXRob24KICAgMi43IGFuZCBTZXR1cHRvb2xzIDE5LjAuCiAKKy0gSXNzdWUgIzI2MjQ5OiBNZW1vcnkgZnVuY3Rpb25zIG9mIHRoZSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIGRvbWFpbgorICAoOmM6ZGF0YTpgUFlNRU1fRE9NQUlOX01FTWApIG5vdyB1c2UgdGhlIDpyZWY6YHB5bWFsbG9jIGFsbG9jYXRvciA8cHltYWxsb2M+YAorICByYXRoZXIgdGhhbiBzeXN0ZW0gOmM6ZnVuYzpgbWFsbG9jYC4gQXBwbGljYXRpb25zIGNhbGxpbmcKKyAgOmM6ZnVuYzpgUHlNZW1fTWFsbG9jYCB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTCBjYW4gbm93IGNyYXNoOiB1c2UKKyAgYGBQWVRIT05NQUxMT0M9ZGVidWdgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB2YWxpZGF0ZSB0aGUgdXNhZ2Ugb2YgbWVtb3J5CisgIGFsbG9jYXRvcnMgaW4geW91ciBhcHBsaWNhdGlvbi4KKworLSBJc3N1ZSAjMjY4MDI6IE9wdGltaXplIGZ1bmN0aW9uIGNhbGxzIG9ubHkgdXNpbmcgdW5wYWNraW5nIGxpa2UKKyAgYGBmdW5jKCp0dXBsZSlgYCAobm8gb3RoZXIgcG9zaXRpb25hbCBhcmd1bWVudCwgbm8ga2V5d29yZCk6IGF2b2lkIGNvcHlpbmcKKyAgdGhlIHR1cGxlLiBQYXRjaCB3cml0dGVuIGJ5IEpvZSBKZXZuaWsuCisKIC0gSXNzdWUgIzI2NjU5OiBNYWtlIHRoZSBidWlsdGluIHNsaWNlIHR5cGUgc3VwcG9ydCBjeWNsZSBjb2xsZWN0aW9uLgogCiAtIElzc3VlICMyNjcxODogc3VwZXIuX19pbml0X18gbm8gbG9uZ2VyIGxlYWtzIG1lbW9yeSBpZiBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCiAgIE5PVEU6IEEgZGlyZWN0IGNhbGwgb2Ygc3VwZXIuX19pbml0X18gaXMgbm90IGVuZG9yc2VkIQogCistIElzc3VlICMyNzEzODogRml4IHRoZSBkb2MgY29tbWVudCBmb3IgRmlsZUZpbmRlci5maW5kX3NwZWMoKS4KKworLSBJc3N1ZSAjMjcxNDc6IE1lbnRpb24gUEVQIDQyMCBpbiB0aGUgaW1wb3J0bGliIGRvY3MuCisKIC0gSXNzdWUgIzI1MzM5OiBQWVRIT05JT0VOQ09ESU5HIG5vdyBoYXMgcHJpb3JpdHkgb3ZlciBsb2NhbGUgaW4gc2V0dGluZyB0aGUKICAgZXJyb3IgaGFuZGxlciBmb3Igc3RkaW4gYW5kIHN0ZG91dC4KIApAQCAtMTg1LDkgKzU5Myw0MSBAQAogICBieXRlYXJyYXksIGxpc3QsIHR1cGxlLCBzZXQsIGZyb3plbnNldCwgZGljdCwgT3JkZXJlZERpY3QsIGNvcnJlc3BvbmRpbmcKICAgdmlld3MgYW5kIG9zLnNjYW5kaXIoKSBpdGVyYXRvci4KIAorLSBJc3N1ZSAjMjY1NzQ6IE9wdGltaXplIGBgYnl0ZXMucmVwbGFjZShiJycsIGInLicpYGAgYW5kCisgIGBgYnl0ZWFycmF5LnJlcGxhY2UoYicnLCBiJy4nKWBgLiBQYXRjaCB3cml0dGVuIGJ5IEpvc2ggU25pZGVyLgorCiAtIElzc3VlICMyNjU4MTogSWYgY29kaW5nIGNvb2tpZSBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMgb24gYSBsaW5lIGluCiAgIFB5dGhvbiBzb3VyY2UgY29kZSBmaWxlLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgdGFrZW4gdG8gYWNjb3VudC4KIAorLSBJc3N1ZSAjMTk3MTE6IEFkZCB0ZXN0cyBmb3IgcmVsb2FkaW5nIG5hbWVzcGFjZSBwYWNrYWdlcy4KKworLSBJc3N1ZSAjMjEwOTk6IFN3aXRjaCBhcHBsaWNhYmxlIGltcG9ydGxpYiB0ZXN0cyB0byB1c2UgUEVQIDQ1MSBBUEkuCisKKy0gSXNzdWUgIzI2NTYzOiBEZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHJhaXNlIGEgZmF0YWwKKyAgZXJyb3IgaWYgZnVuY3Rpb25zIG9mIHRoZSA6YzpmdW5jOmBQeU1lbV9NYWxsb2NgIGZhbWlseSBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgaG9sZGluZyB0aGUgR0lMLgorCistIElzc3VlICMyNjU2NDogT24gZXJyb3IsIHRoZSBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgbm93IHVzZQorICB0aGUgOm1vZDpgdHJhY2VtYWxsb2NgIG1vZHVsZSB0byBnZXQgdGhlIHRyYWNlYmFjayB3aGVyZSBhIG1lbW9yeSBibG9jayB3YXMKKyAgYWxsb2NhdGVkLgorCistIElzc3VlICMyNjU1ODogVGhlIGRlYnVnIGhvb2tzIG9uIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yCisgIDpjOmZ1bmM6YFB5T2JqZWN0X01hbGxvY2Agbm93IGRldGVjdCB3aGVuIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGhvdXQKKyAgaG9sZGluZyB0aGUgR0lMLgorCistIElzc3VlICMyNjUxNjogQWRkIDplbnZ2YXI6YFBZVEhPTk1BTExPQ2AgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gc2V0IHRoZQorICBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnMgYW5kL29yIGluc3RhbGwgZGVidWcgaG9va3MuCisKKy0gSXNzdWUgIzI2NTE2OiBUaGUgOmM6ZnVuYzpgUHlNZW1fU2V0dXBEZWJ1Z0hvb2tzYCBmdW5jdGlvbiBjYW4gbm93IGFsc28gYmUKKyAgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLgorCistIElzc3VlICMyNjUxNjogVGhlIDplbnZ2YXI6YFBZVEhPTk1BTExPQ1NUQVRTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gbm93CisgIGFsc28gYmUgdXNlZCBvbiBQeXRob24gY29tcGlsZWQgaW4gcmVsZWFzZSBtb2RlLiBJdCBub3cgaGFzIG5vIGVmZmVjdCBpZgorICBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLgorCistIElzc3VlICMyNjUxNjogSW4gZGVidWcgbW9kZSwgZGVidWcgaG9va3MgYXJlIG5vdyBhbHNvIGluc3RhbGxlZCBvbiBQeXRob24KKyAgbWVtb3J5IGFsbG9jYXRvcnMgd2hlbiBQeXRob24gaXMgY29uZmlndXJlZCB3aXRob3V0IHB5bWFsbG9jLgorCiAtIElzc3VlICMyNjQ2NDogRml4IHN0ci50cmFuc2xhdGUoKSB3aGVuIHN0cmluZyBpcyBBU0NJSSBhbmQgZmlyc3QgcmVwbGFjZW1lbnRzCiAgIHJlbW92ZXMgY2hhcmFjdGVyLCBidXQgbmV4dCByZXBsYWNlbWVudCB1c2VzIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciBvciBhCiAgIHN0cmluZyBsb25nZXIgdGhhbiAxIGNoYXJhY3Rlci4gUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjUuMC4KQEAgLTIwMCwxMSArNjQwLDM3IEBACiAtIElzc3VlICMyNjMwMjogQ29ycmVjdCBiZWhhdmlvciB0byByZWplY3QgY29tbWEgYXMgYSBsZWdhbCBjaGFyYWN0ZXIgZm9yCiAgIGNvb2tpZSBuYW1lcy4KIAorLSBJc3N1ZSAjMjYxMzY6IFVwZ3JhZGUgdGhlIHdhcm5pbmcgd2hlbiBhIGdlbmVyYXRvciByYWlzZXMgU3RvcEl0ZXJhdGlvbgorICBmcm9tIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgdG8gRGVwcmVjYXRpb25XYXJuaW5nLiAgUGF0Y2ggYnkgQW5pc2gKKyAgU2hhaC4KKworLSBJc3N1ZSAjMjYyMDQ6IFRoZSBjb21waWxlciBub3cgaWdub3JlcyBhbGwgY29uc3RhbnQgc3RhdGVtZW50czogYnl0ZXMsIHN0ciwKKyAgaW50LCBmbG9hdCwgY29tcGxleCwgbmFtZSBjb25zdGFudHMgKE5vbmUsIEZhbHNlLCBUcnVlKSwgRWxsaXBzaXMKKyAgYW5kIGFzdC5Db25zdGFudDsgbm90IG9ubHkgc3RyIGFuZCBpbnQuIEZvciBleGFtcGxlLCBgYDEuMGBgIGlzIG5vdyBpZ25vcmVkCisgIGluIGBgZGVmIGYoKTogMS4wYGAuCisKIC0gSXNzdWUgIzQ4MDY6IEF2b2lkIG1hc2tpbmcgdGhlIG9yaWdpbmFsIFR5cGVFcnJvciBleGNlcHRpb24gd2hlbiB1c2luZyBzdGFyCiAgICgqKSB1bnBhY2tpbmcgaW4gZnVuY3Rpb24gY2FsbHMuICBCYXNlZCBvbiBwYXRjaCBieSBIYWdlbiBGw7xyc3RlbmF1IGFuZAogICBEYW5pZWwgVXJiYW4uCiAKLS0gSXNzdWUgIzI3MTM4OiBGaXggdGhlIGRvYyBjb21tZW50IGZvciBGaWxlRmluZGVyLmZpbmRfc3BlYygpLgorLSBJc3N1ZSAjMjYxNDY6IEFkZCBhIG5ldyBraW5kIG9mIEFTVCBub2RlOiBgYGFzdC5Db25zdGFudGBgLiBJdCBjYW4gYmUgdXNlZAorICBieSBleHRlcm5hbCBBU1Qgb3B0aW1pemVycywgYnV0IHRoZSBjb21waWxlciBkb2VzIG5vdCBlbWl0IGRpcmVjdGx5IHN1Y2gKKyAgbm9kZS4KKworLSBJc3N1ZSAjMjM2MDE6ICBTcGVkLXVwIGFsbG9jYXRpb24gb2YgZGljdCBrZXkgb2JqZWN0cyBieSB1c2luZyBQeXRob24ncworICBzbWFsbCBvYmplY3QgYWxsb2NhdG9yLiAgKENvbnRyaWJ1dGVkIGJ5IEp1bGlhbiBUYXlsb3IuKQorCistIElzc3VlICMxODAxODogSW1wb3J0IHJhaXNlcyBJbXBvcnRFcnJvciBpbnN0ZWFkIG9mIFN5c3RlbUVycm9yIGlmIGEgcmVsYXRpdmUKKyAgaW1wb3J0IGlzIGF0dGVtcHRlZCB3aXRob3V0IGEga25vd24gcGFyZW50IHBhY2thZ2UuCisKKy0gSXNzdWUgIzI1ODQzOiBXaGVuIGNvbXBpbGluZyBjb2RlLCBkb24ndCBtZXJnZSBjb25zdGFudHMgaWYgdGhleSBhcmUgZXF1YWwKKyAgYnV0IGhhdmUgYSBkaWZmZXJlbnQgdHlwZXMuIEZvciBleGFtcGxlLCBgYGYxLCBmMiA9IGxhbWJkYTogMSwgbGFtYmRhOiAxLjBgYAorICBpcyBub3cgY29ycmVjdGx5IGNvbXBpbGVkIHRvIHR3byBkaWZmZXJlbnQgZnVuY3Rpb25zOiBgYGYxKClgYCByZXR1cm5zIGBgMWBgCisgIChgYGludGBgKSBhbmQgYGBmMigpYGAgcmV0dXJucyBgYDEuMGBgIChgYGZsb2F0YGApLCBldmVuIGlmIGBgMWBgIGFuZCBgYDEuMGBgCisgIGFyZSBlcXVhbC4KKworLSBJc3N1ZSAjMjYxMDc6IFRoZSBmb3JtYXQgb2YgdGhlIGBgY29fbG5vdGFiYGAgYXR0cmlidXRlIG9mIGNvZGUgb2JqZWN0cworICBjaGFuZ2VzIHRvIHN1cHBvcnQgbmVnYXRpdmUgbGluZSBudW1iZXIgZGVsdGEuCiAKIC0gSXNzdWUgIzI2MTU0OiBBZGQgYSBuZXcgcHJpdmF0ZSBfUHlUaHJlYWRTdGF0ZV9VbmNoZWNrZWRHZXQoKSBmdW5jdGlvbiB0byBnZXQKICAgdGhlIGN1cnJlbnQgUHl0aG9uIHRocmVhZCBzdGF0ZSwgYnV0IGRvbid0IGlzc3VlIGEgZmF0YWwgZXJyb3IgaWYgaXQgaXMgTlVMTC4KQEAgLTIxMywxNSArNjc5LDggQEAKICAgUHl0aG9uIDMuNS4xIHRvIGhpZGUgdGhlIGV4YWN0IGltcGxlbWVudGF0aW9uIG9mIGF0b21pYyBDIHR5cGVzLCB0byBhdm9pZAogICBjb21waWxlciBpc3N1ZXMuCiAKLS0gSXNzdWUgIzI2MTk0OiAgRGVxdWUuaW5zZXJ0KCkgZ2F2ZSBvZGQgcmVzdWx0cyBmb3IgYm91bmRlZCBkZXF1ZXMgdGhhdCBoYWQKLSAgcmVhY2hlZCB0aGVpciBtYXhpbXVtIHNpemUuICBOb3cgYW4gSW5kZXhFcnJvciB3aWxsIGJlIHJhaXNlZCB3aGVuIGF0dGVtcHRpbmcKLSAgdG8gaW5zZXJ0IGludG8gYSBmdWxsIGRlcXVlLgotCi0tIElzc3VlICMyNTg0MzogV2hlbiBjb21waWxpbmcgY29kZSwgZG9uJ3QgbWVyZ2UgY29uc3RhbnRzIGlmIHRoZXkgYXJlIGVxdWFsCi0gIGJ1dCBoYXZlIGEgZGlmZmVyZW50IHR5cGVzLiBGb3IgZXhhbXBsZSwgYGBmMSwgZjIgPSBsYW1iZGE6IDEsIGxhbWJkYTogMS4wYGAKLSAgaXMgbm93IGNvcnJlY3RseSBjb21waWxlZCB0byB0d28gZGlmZmVyZW50IGZ1bmN0aW9uczogYGBmMSgpYGAgcmV0dXJucyBgYDFgYAotICAoYGBpbnRgYCkgYW5kIGBgZjIoKWBgIHJldHVybnMgYGAxLjBgYCAoYGBpbnRgYCksIGV2ZW4gaWYgYGAxYGAgYW5kIGBgMS4wYGAKLSAgYXJlIGVxdWFsLgorLSBJc3N1ZSAjMjU3OTE6IElmIF9fcGFja2FnZV9fICE9IF9fc3BlY19fLnBhcmVudCBvciBpZiBuZWl0aGVyIF9fcGFja2FnZV9fIG9yCisgIF9fc3BlY19fIGFyZSBkZWZpbmVkIHRoZW4gSW1wb3J0V2FybmluZyBpcyByYWlzZWQuCiAKIC0gSXNzdWUgIzIyOTk1OiBbVVBEQVRFXSBDb21tZW50IG91dCB0aGUgb25lIG9mIHRoZSBwaWNrbGVhYmlsaXR5IHRlc3RzIGluCiAgIF9QeU9iamVjdF9HZXRTdGF0ZSgpIGR1ZSB0byByZWdyZXNzaW9ucyBvYnNlcnZlZCBpbiBDeXRob24tYmFzZWQgcHJvamVjdHMuCkBAIC0yNDcsNyArNzA2LDEwIEBACiAKIC0gSXNzdWUgIzI1NzA5OiBGaXhlZCBwcm9ibGVtIHdpdGggaW4tcGxhY2Ugc3RyaW5nIGNvbmNhdGVuYXRpb24gYW5kIHV0Zi04IGNhY2hlLgogCi0tIElzc3VlICMyNzE0NzogTWVudGlvbiBQRVAgNDIwIGluIHRoZSBpbXBvcnRsaWIgZG9jcy4KKy0gSXNzdWUgIzUzMTk6IE5ldyBQeV9GaW5hbGl6ZUV4KCkgQVBJIGFsbG93aW5nIFB5dGhvbiB0byBzZXQgYW4gZXhpdCBzdGF0dXMKKyAgb2YgMTIwIG9uIGZhaWx1cmUgdG8gZmx1c2ggYnVmZmVyZWQgc3RyZWFtcy4KKworLSBJc3N1ZSAjMjU0ODU6IHRlbG5ldGxpYi5UZWxuZXQgaXMgbm93IGEgY29udGV4dCBtYW5hZ2VyLgogCiAtIElzc3VlICMyNDA5NzogRml4ZWQgY3Jhc2ggaW4gb2JqZWN0Ll9fcmVkdWNlX18oKSBpZiBzbG90IG5hbWUgaXMgZnJlZWQgaW5zaWRlCiAgIF9fZ2V0YXR0cl9fLgpAQCAtMjU2LDYgKzcxOCw4OCBAQAogICBfX2J5dGVzX18sIF9fdHJ1bmNfXywgYW5kIF9fZmxvYXRfXyByZXR1cm5pbmcgaW5zdGFuY2VzIG9mIHN1YmNsYXNzZXMgb2YKICAgYnl0ZXMsIGludCwgYW5kIGZsb2F0IHRvIHN1YmNsYXNzZXMgb2YgYnl0ZXMsIGludCwgYW5kIGZsb2F0IGNvcnJlc3BvbmRpbmdseS4KIAorLSBJc3N1ZSAjMjU2MzA6IEZpeCBhIHBvc3NpYmxlIHNlZ2ZhdWx0IGR1cmluZyBhcmd1bWVudCBwYXJzaW5nIGluIGZ1bmN0aW9ucworICB0aGF0IGFjY2VwdCBmaWxlc3lzdGVtIHBhdGhzLgorCistIElzc3VlICMyMzU2NDogRml4ZWQgYSBwYXJ0aWFsbHkgYnJva2VuIHNhbml0eSBjaGVjayBpbiB0aGUgX3Bvc2l4c3VicHJvY2VzcworICBpbnRlcm5hbHMgcmVnYXJkaW5nIGhvdyBmZHNfdG9fcGFzcyB3ZXJlIHBhc3NlZCB0byB0aGUgY2hpbGQuICBUaGUgYnVnIGhhZAorICBubyBhY3R1YWwgaW1wYWN0IGFzIHN1YnByb2Nlc3MucHkgYWxyZWFkeSBhdm9pZGVkIGl0LgorCistIElzc3VlICMyNTM4ODogRml4ZWQgdG9rZW5pemVyIGNyYXNoIHdoZW4gcHJvY2Vzc2luZyB1bmRlY29kYWJsZSBzb3VyY2UgY29kZQorICB3aXRoIGEgbnVsbCBieXRlLgorCistIElzc3VlICMyNTQ2MjogVGhlIGhhc2ggb2YgdGhlIGtleSBub3cgaXMgY2FsY3VsYXRlZCBvbmx5IG9uY2UgaW4gbW9zdAorICBvcGVyYXRpb25zIGluIEMgaW1wbGVtZW50YXRpb24gb2YgT3JkZXJlZERpY3QuCisKKy0gSXNzdWUgIzIyOTk1OiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIF9fcmVkdWNlX18gYW5kIF9fcmVkdWNlX2V4X18gbm93CisgIHJlamVjdHMgYnVpbHRpbiB0eXBlcyB3aXRoIG5vdCBkZWZpbmVkIF9fbmV3X18uCisKKy0gSXNzdWUgIzI0ODAyOiBBdm9pZCBidWZmZXIgb3ZlcnJlYWRzIHdoZW4gaW50KCksIGZsb2F0KCksIGNvbXBpbGUoKSwgZXhlYygpCisgIGFuZCBldmFsKCkgYXJlIHBhc3NlZCBieXRlcy1saWtlIG9iamVjdHMuICBUaGVzZSBvYmplY3RzIGFyZSBub3QKKyAgbmVjZXNzYXJpbHkgdGVybWluYXRlZCBieSBhIG51bGwgYnl0ZSwgYnV0IHRoZSBmdW5jdGlvbnMgYXNzdW1lZCB0aGV5IHdlcmUuCisKKy0gSXNzdWUgIzI1NTU1OiBGaXggcGFyc2VyIGFuZCBBU1Q6IGZpbGwgbGluZW5vIGFuZCBjb2xfb2Zmc2V0IG9mICJhcmciIG5vZGUKKyAgd2hlbiBjb21waWxpbmcgQVNUIGZyb20gUHl0aG9uIG9iamVjdHMuCisKKy0gSXNzdWUgIzI0NzI2OiBGaXhlZCBhIGNyYXNoIGFuZCBsZWFraW5nIE5VTEwgaW4gcmVwcigpIG9mIE9yZGVyZWREaWN0IHRoYXQKKyAgd2FzIG11dGF0ZWQgYnkgZGlyZWN0IGNhbGxzIG9mIGRpY3QgbWV0aG9kcy4KKworLSBJc3N1ZSAjMjU0NDk6IEl0ZXJhdGluZyBPcmRlcmVkRGljdCB3aXRoIGtleXMgd2l0aCB1bnN0YWJsZSBoYXNoIG5vdyByYWlzZXMKKyAgS2V5RXJyb3IgaW4gQyBpbXBsZW1lbnRhdGlvbnMgYXMgd2VsbCBhcyBpbiBQeXRob24gaW1wbGVtZW50YXRpb24uCisKKy0gSXNzdWUgIzI1Mzk1OiBGaXhlZCBjcmFzaCB3aGVuIGhpZ2hseSBuZXN0ZWQgT3JkZXJlZERpY3Qgc3RydWN0dXJlcyB3ZXJlCisgIGdhcmJhZ2UgY29sbGVjdGVkLgorCistIElzc3VlICMyNTQwMTogT3B0aW1pemUgYnl0ZXMuZnJvbWhleCgpIGFuZCBieXRlYXJyYXkuZnJvbWhleCgpOiB0aGV5IGFyZSBub3cKKyAgYmV0d2VlbiAyeCBhbmQgMy41eCBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1Mzk5OiBPcHRpbWl6ZSBieXRlYXJyYXkgJSBhcmdzIHVzaW5nIHRoZSBuZXcgcHJpdmF0ZSBfUHlCeXRlc1dyaXRlcgorICBBUEkuIEZvcm1hdHRpbmcgaXMgbm93IGJldHdlZW4gMi41IGFuZCA1IHRpbWVzIGZhc3Rlci4KKworLSBJc3N1ZSAjMjUyNzQ6IHN5cy5zZXRyZWN1cnNpb25saW1pdCgpIG5vdyByYWlzZXMgYSBSZWN1cnNpb25FcnJvciBpZiB0aGUgbmV3CisgIHJlY3Vyc2lvbiBsaW1pdCBpcyB0b28gbG93IGRlcGVuZGluZyBhdCB0aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGguIE1vZGlmeQorICBhbHNvIHRoZSAibG93ZXItd2F0ZXIgbWFyayIgZm9ybXVsYSB0byBtYWtlIGl0IG1vbm90b25pYy4gVGhpcyBtYXJrIGlzIHVzZWQKKyAgdG8gZGVjaWRlIHdoZW4gdGhlIG92ZXJmbG93ZWQgZmxhZyBvZiB0aGUgdGhyZWFkIHN0YXRlIGlzIHJlc2V0LgorCistIElzc3VlICMyNDQwMjogRml4IGlucHV0KCkgdG8gcHJvbXB0IHRvIHRoZSByZWRpcmVjdGVkIHN0ZG91dCB3aGVuCisgIHN5cy5zdGRvdXQuZmlsZW5vKCkgZmFpbHMuCisKKy0gSXNzdWUgIzI1MzQ5OiBPcHRpbWl6ZSBieXRlcyAlIGFyZ3MgdXNpbmcgdGhlIG5ldyBwcml2YXRlIF9QeUJ5dGVzV3JpdGVyIEFQSS4KKyAgRm9ybWF0dGluZyBpcyBub3cgdXAgdG8gMiB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzI0ODA2OiBQcmV2ZW50IGJ1aWx0aW4gdHlwZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgc3ViY2xhc3NlZCBmcm9tCisgIGJlaW5nIHN1YmNsYXNzZWQgdGhyb3VnaCBtdWx0aXBsZSBpbmhlcml0YW5jZS4KKworLSBJc3N1ZSAjMjUzMDE6IFRoZSBVVEYtOCBkZWNvZGVyIGlzIG5vdyB1cCB0byAxNSB0aW1lcyBhcyBmYXN0IGZvciBlcnJvcgorICBoYW5kbGVyczogYGBpZ25vcmVgYCwgYGByZXBsYWNlYGAgYW5kIGBgc3Vycm9nYXRlZXNjYXBlYGAuCisKKy0gSXNzdWUgIzI0ODQ4OiBGaXhlZCBhIG51bWJlciBvZiBidWdzIGluIFVURi03IGRlY29kaW5nIG9mIG1pc2Zvcm1lZCBkYXRhLgorCistIElzc3VlICMyNTI2NzogVGhlIFVURi04IGVuY29kZXIgaXMgbm93IHVwIHRvIDc1IHRpbWVzIGFzIGZhc3QgZm9yIGVycm9yCisgIGhhbmRsZXJzOiBgYGlnbm9yZWBgLCBgYHJlcGxhY2VgYCwgYGBzdXJyb2dhdGVlc2NhcGVgYCwgYGBzdXJyb2dhdGVwYXNzYGAuCisgIFBhdGNoIGNvLXdyaXR0ZW4gd2l0aCBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMyNTI4MDogSW1wb3J0IHRyYWNlIG1lc3NhZ2VzIGVtaXR0ZWQgaW4gdmVyYm9zZSAoLXYpIG1vZGUgYXJlIG5vCisgIGxvbmdlciBmb3JtYXR0ZWQgdHdpY2UuCisKKy0gSXNzdWUgIzI1MjI3OiBPcHRpbWl6ZSBBU0NJSSBhbmQgbGF0aW4xIGVuY29kZXJzIHdpdGggdGhlIGBgc3Vycm9nYXRlZXNjYXBlYGAKKyAgZXJyb3IgaGFuZGxlcjogdGhlIGVuY29kZXJzIGFyZSBub3cgdXAgdG8gMyB0aW1lcyBhcyBmYXN0LiBJbml0aWFsIHBhdGNoCisgIHdyaXR0ZW4gYnkgU2VyaGl5IFN0b3JjaGFrYS4KKworLSBJc3N1ZSAjMjUwMDM6IE9uIFNvbGFyaXMgMTEuMyBvciBuZXdlciwgb3MudXJhbmRvbSgpIG5vdyB1c2VzIHRoZQorICBnZXRyYW5kb20oKSBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBnZXRlbnRyb3B5KCkgZnVuY3Rpb24uIFRoZSBnZXRlbnRyb3B5KCkKKyAgZnVuY3Rpb24gaXMgYmxvY2tpbmcgdG8gZ2VuZXJhdGUgdmVyeSBnb29kIHF1YWxpdHkgZW50cm9weSwgb3MudXJhbmRvbSgpCisgIGRvZXNuJ3QgbmVlZCBzdWNoIGhpZ2gtcXVhbGl0eSBlbnRyb3B5LgorCistIElzc3VlICM5MjMyOiBNb2RpZnkgUHl0aG9uJ3MgZ3JhbW1hciB0byBhbGxvdyB0cmFpbGluZyBjb21tYXMgaW4gdGhlCisgIGFyZ3VtZW50IGxpc3Qgb2YgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gIEZvciBleGFtcGxlLCAiZGVmIGYoXCosIGEgPQorICAzLCk6IHBhc3MiIGlzIG5vdyBsZWdhbC4gUGF0Y2ggZnJvbSBNYXJrIERpY2tpbnNvbi4KKworLSBJc3N1ZSAjMjQ5NjU6IEltcGxlbWVudCBQRVAgNDk4ICJMaXRlcmFsIFN0cmluZyBJbnRlcnBvbGF0aW9uIi4gVGhpcworICBhbGxvd3MgeW91IHRvIGVtYmVkIGV4cHJlc3Npb25zIGluc2lkZSBmLXN0cmluZ3MsIHdoaWNoIGFyZQorICBjb252ZXJ0ZWQgdG8gbm9ybWFsIHN0cmluZ3MgYXQgcnVuIHRpbWUuIEdpdmVuIHg9MywgdGhlbgorICBmJ3ZhbHVlPXt4fScgPT0gJ3ZhbHVlPTMnLiBQYXRjaCBieSBFcmljIFYuIFNtaXRoLgorCiAtIElzc3VlICMyNjQ3ODogRml4IHNlbWFudGljIGJ1Z3Mgd2hlbiB1c2luZyBiaW5hcnkgb3BlcmF0b3JzIHdpdGggZGljdGlvbmFyeQogICB2aWV3cyBhbmQgdHVwbGVzLgogCkBAIC0yNjQsNzggKzgwOCwyNyBAQAogCiAtIElzc3VlICMyNTY2MDogRml4IFRBQiBrZXkgYmVoYXZpb3VyIGluIFJFUEwgd2l0aCByZWFkbGluZS4KIAorLSBJc3N1ZSAjMjYyODg6IE9wdGltaXplIFB5TG9uZ19Bc0RvdWJsZS4KKworLSBJc3N1ZXMgIzI2Mjg5IGFuZCAjMjYzMTU6IE9wdGltaXplIGZsb29yIGFuZCBtb2R1bG8gZGl2aXNpb24gZm9yCisgIHNpbmdsZS1kaWdpdCBsb25ncy4gIE1pY3JvYmVuY2htYXJrcyBzaG93IDItMi41eCBpbXByb3ZlbWVudC4gIEJ1aWx0LWluCisgICdkaXZtb2QnIGZ1bmN0aW9uIGlzIG5vdyBhbHNvIH4xMCUgZmFzdGVyLgorCiAtIElzc3VlICMyNTg4NzogUmFpc2UgYSBSdW50aW1lRXJyb3Igd2hlbiBhIGNvcm91dGluZSBvYmplY3QgaXMgYXdhaXRlZAogICBtb3JlIHRoYW4gb25jZS4KIAotLSBJc3N1ZSAjMjcyNDM6IFVwZGF0ZSB0aGUgX19haXRlcl9fIHByb3RvY29sOiBpbnN0ZWFkIG9mIHJldHVybmluZwotICBhbiBhd2FpdGFibGUgdGhhdCByZXNvbHZlcyB0byBhbiBhc3luY2hyb25vdXMgaXRlcmF0b3IsIHRoZSBhc3luY2hyb25vdXMKLSAgaXRlcmF0b3Igc2hvdWxkIGJlIHJldHVybmVkIGRpcmVjdGx5LiAgRG9pbmcgdGhlIGZvcm1lciB3aWxsIHRyaWdnZXIgYQotICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLgotCi0KIExpYnJhcnkKIC0tLS0tLS0KIAotLSBJc3N1ZSAjMjY1NTY6IFVwZGF0ZSBleHBhdCB0byAyLjEuMSwgZml4ZXMgQ1ZFLTIwMTUtMTI4My4KLQotLSBGaXggVExTIHN0cmlwcGluZyB2dWxuZXJhYmlsaXR5IGluIHNtdHBsaWIsIENWRS0yMDE2LTA3NzIuICBSZXBvcnRlZCBieSBUZWFtCi0gIE9zdHN0cm9tCi0KLS0gSXNzdWUgIzIxMzg2OiBJbXBsZW1lbnQgbWlzc2luZyBJUHY0QWRkcmVzcy5pc19nbG9iYWwgcHJvcGVydHkuICBJdCB3YXMKLSAgZG9jdW1lbnRlZCBzaW5jZSAwN2E1NjEwYmFlOWQuICBJbml0aWFsIHBhdGNoIGJ5IFJvZ2VyIEx1ZXRoaS4KLQotLSBJc3N1ZSAjMjA5MDA6IGRpc3R1dGlscyByZWdpc3RlciBjb21tYW5kIG5vdyBkZWNvZGVzIEhUVFAgcmVzcG9uc2VzCi0gIGNvcnJlY3RseS4gIEluaXRpYWwgcGF0Y2ggYnkgaW5ncmlkLgotCi0tIEEgbmV3IHZlcnNpb24gb2YgdHlwaW5nLnB5IHByb3ZpZGVzIHNldmVyYWwgbmV3IGNsYXNzZXMgYW5kCi0gIGZlYXR1cmVzOiBAb3ZlcmxvYWQgb3V0c2lkZSBzdHVicywgUmV2ZXJzaWJsZSwgRGVmYXVsdERpY3QsIFRleHQsCi0gIENvbnRleHRNYW5hZ2VyLCBUeXBlW10sIE5ld1R5cGUoKSwgVFlQRV9DSEVDS0lORywgYW5kIG51bWVyb3VzIGJ1ZwotICBmaXhlcyAobm90ZSB0aGF0IHNvbWUgb2YgdGhlIG5ldyBmZWF0dXJlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZCBpbgotICBteXB5IG9yIG90aGVyIHN0YXRpYyBhbmFseXplcnMpLiAgQWxzbyBjbGFzc2VzIGZvciBQRVAgNDkyCi0gIChBd2FpdGFibGUsIEFzeW5jSXRlcmFibGUsIEFzeW5jSXRlcmF0b3IpIGhhdmUgYmVlbiBhZGRlZCAoaW4gZmFjdAotICB0aGV5IG1hZGUgaXQgaW50byAzLjUuMSBidXQgd2VyZSBuZXZlciBtZW50aW9uZWQpLgotCi0tIElzc3VlICMyNTczODogU3RvcCBodHRwLnNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLnNlbmRfZXJyb3IoKSBmcm9tCi0gIHNlbmRpbmcgYSBtZXNzYWdlIGJvZHkgZm9yIDIwNSBSZXNldCBDb250ZW50LiAgQWxzbywgZG9uJ3Qgc2VuZCBDb250ZW50Ci0gIGhlYWRlciBmaWVsZHMgaW4gcmVzcG9uc2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIGJvZHkuICBQYXRjaCBieSBTdXN1bXUKLSAgS29zaGliYS4KLQotLSBJc3N1ZSAjMjEzMTM6IEZpeCB0aGUgInBsYXRmb3JtIiBtb2R1bGUgdG8gdG9sZXJhdGUgd2hlbiBzeXMudmVyc2lvbgotICBjb250YWlucyB0cnVuY2F0ZWQgYnVpbGQgaW5mb3JtYXRpb24uCi0KLS0gSXNzdWUgIzI2ODM5OiBPbiBMaW51eCwgOmZ1bmM6YG9zLnVyYW5kb21gIG5vdyBjYWxscyBgYGdldHJhbmRvbSgpYGAgd2l0aAotICBgYEdSTkRfTk9OQkxPQ0tgYCB0byBmYWxsIGJhY2sgb24gcmVhZGluZyBgYC9kZXYvdXJhbmRvbWBgIGlmIHRoZSB1cmFuZG9tCi0gIGVudHJvcHkgcG9vbCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LiBQYXRjaCB3cml0dGVuIGJ5IENvbG0gQnVja2xleS4KLQotLSBJc3N1ZSAjMjcxNjQ6IEluIHRoZSB6bGliIG1vZHVsZSwgYWxsb3cgZGVjb21wcmVzc2luZyByYXcgRGVmbGF0ZSBzdHJlYW1zCi0gIHdpdGggYSBwcmVkZWZpbmVkIHpkaWN0LiAgQmFzZWQgb24gcGF0Y2ggYnkgWGlhbmcgWmhhbmcuCi0KLS0gSXNzdWUgIzI0MjkxOiBGaXggd3NnaXJlZi5zaW1wbGVfc2VydmVyLldTR0lSZXF1ZXN0SGFuZGxlciB0byBjb21wbGV0ZWx5Ci0gIHdyaXRlIGRhdGEgdG8gdGhlIGNsaWVudC4gIFByZXZpb3VzbHkgaXQgY291bGQgZG8gcGFydGlhbCB3cml0ZXMgYW5kCi0gIHRydW5jYXRlIGRhdGEuICBBbHNvLCB3c2dpcmVmLmhhbmRsZXIuU2VydmVySGFuZGxlciBjYW4gbm93IGhhbmRsZSBzdGRvdXQKLSAgZG9pbmcgcGFydGlhbCB3cml0ZXMsIGJ1dCB0aGlzIGlzIGRlcHJlY2F0ZWQuCi0KLS0gSXNzdWUgIzI2ODA5OiBBZGQgYGBfX2FsbF9fYGAgdG8gOm1vZDpgc3RyaW5nYC4gIFBhdGNoIGJ5IEVtYW51ZWwgQmFycnkuCi0KLS0gSXNzdWUgIzI2MzczOiBzdWJwcm9jZXNzLlBvcGVuLmNvbW11bmljYXRlIG5vdyBjb3JyZWN0bHkgaWdub3JlcwotICBCcm9rZW5QaXBlRXJyb3Igd2hlbiB0aGUgY2hpbGQgcHJvY2VzcyBkaWVzIGJlZm9yZSAuY29tbXVuaWNhdGUoKQotICBpcyBjYWxsZWQgaW4gbW9yZS9hbGwgY2lyY3Vtc3RhbmNlcy4KLQotLSBJc3N1ZSAjMjE3NzY6IGRpc3R1dGlscy51cGxvYWQgbm93IGNvcnJlY3RseSBoYW5kbGVzIEhUVFBFcnJvci4KLSAgSW5pdGlhbCBwYXRjaCBieSBDbGF1ZGl1IFBvcGEuCi0KLS0gSXNzdWUgIzI3MTE0OiBGaXggU1NMQ29udGV4dC5fbG9hZF93aW5kb3dzX3N0b3JlX2NlcnRzIGZhaWxzIHdpdGgKLSAgUGVybWlzc2lvbkVycm9yCi0KLS0gSXNzdWUgIzE4MzgzOiBBdm9pZCBjcmVhdGluZyBkdXBsaWNhdGUgZmlsdGVycyB3aGVuIHVzaW5nIGZpbHRlcndhcm5pbmdzCi0gIGFuZCBzaW1wbGVmaWx0ZXIuICBCYXNlZCBvbiBwYXRjaCBieSBBbGV4IFNoa29wLgotCiAtIElzc3VlICMyNzA1NzogRml4IG9zLnNldF9pbmhlcml0YWJsZSgpIG9uIEFuZHJvaWQsIGlvY3RsKCkgaXMgYmxvY2tlZCBieQogICBTRUxpbnV4IGFuZCBmYWlscyB3aXRoIEVBQ0NFU1MuIFRoZSBmdW5jdGlvbiBub3cgZmFsbHMgYmFjayB0byBmY250bCgpLgogICBQYXRjaCB3cml0dGVuIGJ5IE1pY2hhxYIgQmVkbmFyc2tpLgogCiAtIElzc3VlICMyNzAxNDogRml4IGluZmluaXRlIHJlY3Vyc2lvbiB1c2luZyB0eXBpbmcucHkuICBUaGFua3MgdG8gS2FsbGUgVHV1cmUhCiAKKy0gSXNzdWUgIzI3MDMxOiBSZW1vdmVkIGR1bW15IG1ldGhvZHMgaW4gVGtpbnRlciB3aWRnZXQgY2xhc3NlczogdGtfbWVudUJhcigpCisgIGFuZCB0a19iaW5kRm9yVHJhdmVyc2FsKCkuCisKIC0gSXNzdWUgIzE0MTMyOiBGaXggdXJsbGliLnJlcXVlc3QgcmVkaXJlY3QgaGFuZGxpbmcgd2hlbiB0aGUgdGFyZ2V0IG9ubHkgaGFzCiAgIGEgcXVlcnkgc3RyaW5nLiAgT3JpZ2luYWwgZml4IGJ5IErDoW4gSmFuZWNoLgogCkBAIC0zNDUsNiArODM4LDE4IEBACiAgIHRvIGJlIEFTQ0lJLWVuY29kYWJsZSwgb3RoZXJ3aXNlIGEgVW5pY29kZUVuY29kZUVycm9yIGlzIHJhaXNlZC4gIEJhc2VkIG9uCiAgIHBhdGNoIGJ5IENocmlzdGlhbiBIZWltZXMuCiAKKy0gSXNzdWUgIzI3MDMzOiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZGVjb2RlX2RhdGEgcGFyYW1ldGVyIGZvcgorICBzbXRwZC5TTVRQQ2hhbm5lbCBhbmQgc210cGQuU01UUFNlcnZlciBjb25zdHJ1Y3RvcnMgaXMgY2hhbmdlZCB0byBGYWxzZS4KKworLSBJc3N1ZSAjMjcwMzQ6IFJlbW92ZWQgZGVwcmVjYXRlZCBjbGFzcyBhc3luY2hhdC5maWZvLgorCistIElzc3VlICMyNjg3MDogQWRkZWQgcmVhZGxpbmUuc2V0X2F1dG9faGlzdG9yeSgpLCB3aGljaCBjYW4gc3RvcCBlbnRyaWVzCisgIGJlaW5nIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGhpc3RvcnkgbGlzdC4gIEJhc2VkIG9uIHBhdGNoIGJ5IFR5bGVyCisgIENyb21wdG9uLgorCistIElzc3VlICMyNjAzOTogemlwZmlsZS5aaXBGaWxlLm9wZW4oKSBjYW4gbm93IGJlIHVzZWQgdG8gd3JpdGUgZGF0YSBpbnRvIGEgWklQCisgIGZpbGUsIGFzIHdlbGwgYXMgZm9yIGV4dHJhY3RpbmcgZGF0YS4gIFBhdGNoIGJ5IFRob21hcyBLbHV5dmVyLgorCiAtIElzc3VlICMyNjg5MjogSG9ub3IgZGVidWdsZXZlbCBmbGFnIGluIHVybGxpYi5yZXF1ZXN0LkhUVFBIYW5kbGVyLiBQYXRjaAogICBjb250cmlidXRlZCBieSBDaGkgSHN1YW4gWWVuLgogCkBAIC0zNTksNiArODY0LDE0IEBACiAtIElzc3VlICMyNjk3NzogUmVtb3ZlZCB1bm5lY2Vzc2FyeSwgYW5kIGlnbm9yZWQsIGNhbGwgdG8gc3VtIG9mIHNxdWFyZXMgaGVscGVyCiAgIGluIHN0YXRpc3RpY3MucHZhcmlhbmNlLgogCistIElzc3VlICMyNjAwMjogVXNlIGJpc2VjdCBpbiBzdGF0aXN0aWNzLm1lZGlhbiBpbnN0ZWFkIG9mIGEgbGluZWFyIHNlYXJjaC4KKyAgUGF0Y2ggYnkgVXBlbmRyYSBLdW1hLgorCistIElzc3VlICMyNTk3NDogTWFrZSB1c2Ugb2YgbmV3IERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbygpIG1ldGhvZCBpbiBzdGF0aXN0aWNzCisgIG1vZHVsZS4gUGF0Y2ggYnkgU3RlZmFuIEtyYWguCisKKy0gSXNzdWUgIzI2OTk2OiBBZGQgc2VjcmV0cyBtb2R1bGUgYXMgZGVzY3JpYmVkIGluIFBFUCA1MDYuCisKIC0gSXNzdWUgIzI2ODgxOiBUaGUgbW9kdWxlZmluZGVyIG1vZHVsZSBub3cgc3VwcG9ydHMgZXh0ZW5kZWQgb3Bjb2RlIGFyZ3VtZW50cy4KIAogLSBJc3N1ZSAjMjM4MTU6IEZpeGVkIGNyYXNoZXMgcmVsYXRlZCB0byBkaXJlY3RseSBjcmVhdGVkIGluc3RhbmNlcyBvZiB0eXBlcyBpbgpAQCAtMzcwLDYgKzg4MywxMSBAQAogLSBJc3N1ZSAjMjY4NzM6IHhtbHJwYyBub3cgcmFpc2VzIFJlc3BvbnNlRXJyb3Igb24gdW5zdXBwb3J0ZWQgdHlwZSB0YWdzCiAgIGluc3RlYWQgb2Ygc2lsZW50bHkgcmV0dXJuIGluY29ycmVjdCByZXN1bHQuCiAKKy0gSXNzdWUgIzI2OTE1OiAgVGhlIF9fY29udGFpbnNfXyBtZXRob2RzIGluIHRoZSBjb2xsZWN0aW9ucyBBQkNzIG5vdyBjaGVjaworICBmb3IgaWRlbnRpdHkgYmVmb3JlIGNoZWNraW5nIGVxdWFsaXR5LiAgVGhpcyBiZXR0ZXIgbWF0Y2hlcyB0aGUgYmVoYXZpb3IKKyAgb2YgdGhlIGNvbmNyZXRlIGNsYXNzZXMsIGFsbG93cyBzZW5zaWJsZSBoYW5kbGluZyBvZiBOYU5zLCBhbmQgbWFrZXMgaXQKKyAgZWFzaWVyIHRvIHJlYXNvbiBhYm91dCBjb250YWluZXIgaW52YXJpYW50cy4KKwogLSBJc3N1ZSAjMjY3MTE6IEZpeGVkIHRoZSBjb21wYXJpc29uIG9mIHBsaXN0bGliLkRhdGEgd2l0aCBvdGhlciB0eXBlcy4KIAogLSBJc3N1ZSAjMjQxMTQ6IEZpeCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGluIGBjdHlwZXMudXRpbGAuCkBAIC0zODMsNiArOTAxLDEyIEBACiAgIG5hbWVzIHRoYXQgaGFwcGVuIHRvIGhhdmUgYSBieXBhc3NlZCBob3N0bmFtZSBhcyBhIHN1ZmZpeC4gIFBhdGNoIGJ5IFhpYW5nCiAgIFpoYW5nLgogCistIElzc3VlICMyNDkwMjogUHJpbnQgc2VydmVyIFVSTCBvbiBodHRwLnNlcnZlciBzdGFydHVwLiAgSW5pdGlhbCBwYXRjaCBieQorICBGZWxpeCBLYWlzZXIuCisKKy0gSXNzdWUgIzI1Nzg4OiBmaWxlaW5wdXQuaG9va19lbmNvZGVkKCkgbm93IHN1cHBvcnRzIGFuICJlcnJvcnMiIGFyZ3VtZW50CisgIGZvciBwYXNzaW5nIHRvIG9wZW4uICBPcmlnaW5hbCBwYXRjaCBieSBKb3NlcGggSGFja21hbi4KKwogLSBJc3N1ZSAjMjY2MzQ6IHJlY3Vyc2l2ZV9yZXByKCkgbm93IHNldHMgX19xdWFsbmFtZV9fIG9mIHdyYXBwZXIuICBQYXRjaCBieQogICBYaWFuZyBaaGFuZy4KIApAQCAtNDE4LDI2ICs5NDIsNTQgQEAKIC0gSXNzdWUgIzI2NzE3OiBTdG9wIGVuY29kaW5nIExhdGluLTEtaXplZCBXU0dJIHBhdGhzIHdpdGggVVRGLTguICBQYXRjaCBieQogICBBbnRob255IFNvdHRpbGUuCiAKKy0gSXNzdWUgIzI2NzgyOiBBZGQgU1RBUlRVUElORk8gdG8gc3VicHJvY2Vzcy5fX2FsbF9fIG9uIFdpbmRvd3MuCisKKy0gSXNzdWUgIzI2NDA0OiBBZGQgY29udGV4dCBtYW5hZ2VyIHRvIHNvY2tldHNlcnZlci4gIFBhdGNoIGJ5IEF2aXYgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2NzM1OiBGaXggOmZ1bmM6YG9zLnVyYW5kb21gIG9uIFNvbGFyaXMgMTEuMyBhbmQgbmV3ZXIgd2hlbiByZWFkaW5nCiAgIG1vcmUgdGhhbiAxLDAyNCBieXRlczogY2FsbCBgYGdldHJhbmRvbSgpYGAgbXVsdGlwbGUgdGltZXMgd2l0aCBhIGxpbWl0IG9mCiAgIDEwMjQgYnl0ZXMgcGVyIGNhbGwuCiAKKy0gSXNzdWUgIzI2NTg1OiBFbGltaW5hdGUgaHR0cC5zZXJ2ZXIuX3F1b3RlX2h0bWwoKSBhbmQgdXNlCisgIGh0bWwuZXNjYXBlKHF1b3RlPUZhbHNlKS4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgorCistIElzc3VlICMyNjY4NTogUmFpc2UgT1NFcnJvciBpZiBjbG9zaW5nIGEgc29ja2V0IGZhaWxzLgorCiAtIElzc3VlICMxNjMyOTogQWRkIC53ZWJtIHRvIG1pbWV0eXBlcy50eXBlc19tYXAuICBQYXRjaCBieSBHaWFtcGFvbG8gUm9kb2xhJy4KIAogLSBJc3N1ZSAjMTM5NTI6IEFkZCAuY3N2IHRvIG1pbWV0eXBlcy50eXBlc19tYXAuICBQYXRjaCBieSBHZW9mZiBXaWxzb24uCiAKKy0gSXNzdWUgIzI2NTg3OiB0aGUgc2l0ZSBtb2R1bGUgbm93IGFsbG93cyAucHRoIGZpbGVzIHRvIHNwZWNpZnkgZmlsZXMgdG8gYmUKKyAgYWRkZWQgdG8gc3lzLnBhdGggKGUuZy4gemlwIGZpbGVzKS4KKworLSBJc3N1ZSAjMjU2MDk6IEludHJvZHVjZSBjb250ZXh0bGliLkFic3RyYWN0Q29udGV4dE1hbmFnZXIgYW5kCisgIHR5cGluZy5Db250ZXh0TWFuYWdlci4KKwogLSBJc3N1ZSAjMjY3MDk6IEZpeGVkIFkyMDM4IHByb2JsZW0gaW4gbG9hZGluZyBiaW5hcnkgUExpc3RzLgogCiAtIElzc3VlICMyMzczNTogSGFuZGxlIHRlcm1pbmFsIHJlc2l6aW5nIHdpdGggUmVhZGxpbmUgNi4zKyBieSBpbnN0YWxsaW5nIG91cgogICBvd24gU0lHV0lOQ0ggaGFuZGxlci4gIFBhdGNoIGJ5IEVyaWMgUHJpY2UuCiAKKy0gSXNzdWUgIzI1OTUxOiBDaGFuZ2UgU1NMU29ja2V0LnNlbmRhbGwoKSB0byByZXR1cm4gTm9uZSwgYXMgZXhwbGljaXRseQorICBkb2N1bWVudGVkIGZvciBwbGFpbiBzb2NrZXQgb2JqZWN0cy4gIFBhdGNoIGJ5IEF2aXYgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2NTg2OiBJbiBodHRwLnNlcnZlciwgcmVzcG9uZCB3aXRoICI0MTMgUmVxdWVzdCBoZWFkZXIgZmllbGRzIHRvbwogICBsYXJnZSIgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGhlYWRlciBmaWVsZHMgdG8gcGFyc2UsIHJhdGhlciB0aGFuIGtpbGxpbmcKICAgdGhlIGNvbm5lY3Rpb24gYW5kIHJhaXNpbmcgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbi4gIFBhdGNoIGJ5IFhpYW5nIFpoYW5nLgogCistIElzc3VlICMyNjY3NjogQWRkZWQgbWlzc2luZyBYTUxQdWxsUGFyc2VyIHRvIEVsZW1lbnRUcmVlLl9fYWxsX18uCisKIC0gSXNzdWUgIzIyODU0OiBDaGFuZ2UgQnVmZmVyZWRSZWFkZXIud3JpdGFibGUoKSBhbmQKICAgQnVmZmVyZWRXcml0ZXIucmVhZGFibGUoKSB0byBhbHdheXMgcmV0dXJuIEZhbHNlLgogCistIElzc3VlICMyNjQ5MjogRXhoYXVzdGVkIGl0ZXJhdG9yIG9mIGFycmF5LmFycmF5IG5vdyBjb25mb3JtcyB3aXRoIHRoZSBiZWhhdmlvcgorICBvZiBpdGVyYXRvcnMgb2Ygb3RoZXIgbXV0YWJsZSBzZXF1ZW5jZXM6IGl0IGxlZnRzIGV4aGF1c3RlZCBldmVuIGlmIGl0ZXJhdGVkCisgIGFycmF5IGlzIGV4dGVuZGVkLgorCistIElzc3VlICMyNjY0MTogZG9jdGVzdC5Eb2NGaWxlVGVzdCBhbmQgZG9jdGVzdC50ZXN0ZmlsZSgpIG5vdyBzdXBwb3J0CisgIHBhY2thZ2VzIChtb2R1bGUgc3BsaXR0ZWQgaW50byBtdWx0aXBsZSBkaXJlY3RvcmllcykgZm9yIHRoZSBwYWNrYWdlCisgIHBhcmFtZXRlci4KKwogLSBJc3N1ZSAjMjUxOTU6IEZpeCBhIHJlZ3Jlc3Npb24gaW4gbW9jay5NYWdpY01vY2suIF9DYWxsIGlzIGEgc3ViY2xhc3Mgb2YKICAgdHVwbGUgKGNoYW5nZXNldCAzNjAzYmFlNjNjMTMgb25seSB3b3JrcyBmb3IgY2xhc3Nlcykgc28gd2UgbmVlZCB0bwogICBpbXBsZW1lbnQgX19uZV9fIG91cnNlbHZlcy4gIFBhdGNoIGJ5IEFuZHJldyBQbHVtbWVyLgpAQCAtNDUwLDE2ICsxMDAyLDQ1IEBACiAKIC0gSXNzdWUgIzI2NjE2OiBGaXhlZCBhIGJ1ZyBpbiBkYXRldGltZS5hc3RpbWV6b25lKCkgbWV0aG9kLgogCi0tIElzc3VlICMyMTkyNTogOmZ1bmM6YHdhcm5pbmdzLmZvcm1hdHdhcm5pbmdgIG5vdyBjYXRjaGVzIGV4Y2VwdGlvbnMgb24KLSAgYGBsaW5lY2FjaGUuZ2V0bGluZSguLi4pYGAgdG8gYmUgYWJsZSB0byBsb2cgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCBlbWl0dGVkCi0gIGxhdGUgZHVyaW5nIHRoZSBQeXRob24gc2h1dGRvd24gcHJvY2Vzcy4KKy0gSXNzdWUgIzI2NjM3OiBUaGUgOm1vZDpgaW1wb3J0bGliYCBtb2R1bGUgbm93IGVtaXRzIGFuIDpleGM6YEltcG9ydEVycm9yYAorICByYXRoZXIgdGhhbiBhIDpleGM6YFR5cGVFcnJvcmAgaWYgOmZ1bmM6YF9faW1wb3J0X19gIGlzIHRyaWVkIGR1cmluZyB0aGUKKyAgUHl0aG9uIHNodXRkb3duIHByb2Nlc3MgYnV0IDpkYXRhOmBzeXMucGF0aGAgaXMgYWxyZWFkeSBjbGVhcmVkIChzZXQgdG8KKyAgYGBOb25lYGApLgorCistIElzc3VlICMyMTkyNTogOmZ1bmM6YHdhcm5pbmdzLmZvcm1hdHdhcm5pbmdgIG5vdyBjYXRjaGVzIGV4Y2VwdGlvbnMgd2hlbgorICBjYWxsaW5nIDpmdW5jOmBsaW5lY2FjaGUuZ2V0bGluZWAgYW5kCisgIDpmdW5jOmB0cmFjZW1hbGxvYy5nZXRfb2JqZWN0X3RyYWNlYmFja2AgdG8gYmUgYWJsZSB0byBsb2cKKyAgOmV4YzpgUmVzb3VyY2VXYXJuaW5nYCBlbWl0dGVkIGxhdGUgZHVyaW5nIHRoZSBQeXRob24gc2h1dGRvd24gcHJvY2Vzcy4KKworLSBJc3N1ZSAjMjM4NDg6IE9uIFdpbmRvd3MsIGZhdWx0aGFuZGxlci5lbmFibGUoKSBub3cgYWxzbyBpbnN0YWxscyBhbgorICBleGNlcHRpb24gaGFuZGxlciB0byBkdW1wIHRoZSB0cmFjZWJhY2sgb2YgYWxsIFB5dGhvbiB0aHJlYWRzIG9uIGFueSBXaW5kb3dzCisgIGV4Y2VwdGlvbiwgbm90IG9ubHkgb24gVU5JWCBzaWduYWxzIChTSUdTRUdWLCBTSUdGUEUsIFNJR0FCUlQpLgorCistIElzc3VlICMyNjUzMDogQWRkIEMgZnVuY3Rpb25zIDpjOmZ1bmM6YF9QeVRyYWNlTWFsbG9jX1RyYWNrYCBhbmQKKyAgOmM6ZnVuYzpgX1B5VHJhY2VNYWxsb2NfVW50cmFja2AgdG8gdHJhY2sgbWVtb3J5IGJsb2NrcyB1c2luZyB0aGUKKyAgOm1vZDpgdHJhY2VtYWxsb2NgIG1vZHVsZS4gQWRkIDpjOmZ1bmM6YF9QeVRyYWNlTWFsbG9jX0dldFRyYWNlYmFja2AgdG8gZ2V0CisgIHRoZSB0cmFjZWJhY2sgb2YgYW4gb2JqZWN0LgorCistIElzc3VlICMyNjU4ODogVGhlIF90cmFjZW1hbGxvYyBub3cgc3VwcG9ydHMgdHJhY2luZyBtZW1vcnkgYWxsb2NhdGlvbnMgb2YKKyAgbXVsdGlwbGUgYWRkcmVzcyBzcGFjZXMgKGRvbWFpbnMpLgogCiAtIElzc3VlICMyNDI2NjogQ3RybCtDIGR1cmluZyBSZWFkbGluZSBoaXN0b3J5IHNlYXJjaCBub3cgY2FuY2VscyB0aGUgc2VhcmNoCiAgIG1vZGUgd2hlbiBjb21waWxlZCB3aXRoIFJlYWRsaW5lIDcuCiAKKy0gSXNzdWUgIzI2NTkwOiBJbXBsZW1lbnQgYSBzYWZlIGZpbmFsaXplciBmb3IgdGhlIF9zb2NrZXQuc29ja2V0IHR5cGUuIEl0IG5vdworICByZWxlYXNlcyB0aGUgR0lMIHRvIGNsb3NlIHRoZSBzb2NrZXQuCisKKy0gSXNzdWUgIzE4Nzg3OiBzcHdkLmdldHNwbmFtKCkgbm93IHJhaXNlcyBhIFBlcm1pc3Npb25FcnJvciBpZiB0aGUgdXNlcgorICBkb2Vzbid0IGhhdmUgcHJpdmlsZWdlcy4KKwogLSBJc3N1ZSAjMjY1NjA6IEF2b2lkIHBvdGVudGlhbCBWYWx1ZUVycm9yIGluIEJhc2VIYW5kbGVyLnN0YXJ0X3Jlc3BvbnNlLgogICBJbml0aWFsIHBhdGNoIGJ5IFBldGVyIEluZ2xlc2J5LgogCistIElzc3VlICMyNjU2NzogQWRkIGEgbmV3IGZ1bmN0aW9uIDpjOmZ1bmM6YFB5RXJyX1Jlc291cmNlV2FybmluZ2AgZnVuY3Rpb24gdG8KKyAgcGFzcyB0aGUgZGVzdHJveWVkIG9iamVjdC4gQWRkIGEgKnNvdXJjZSogYXR0cmlidXRlIHRvCisgIDpjbGFzczpgd2FybmluZ3MuV2FybmluZ01lc3NhZ2VgLiBBZGQgd2FybmluZ3MuX3Nob3d3YXJubXNnKCkgd2hpY2ggdXNlcworICB0cmFjZW1hbGxvYyB0byBnZXQgdGhlIHRyYWNlYmFjayB3aGVyZSBzb3VyY2Ugb2JqZWN0IHdhcyBhbGxvY2F0ZWQuCisKIC0gSXNzdWUgIzI2MzEzOiBzc2wucHkgX2xvYWRfd2luZG93c19zdG9yZV9jZXJ0cyBmYWlscyBpZiB3aW5kb3dzIGNlcnQgc3RvcmUKICAgaXMgZW1wdHkuIFBhdGNoIGJ5IEJhamkuCiAKQEAgLTQ4MSwyMyArMTA2MiwzOCBAQAogLSBJc3N1ZSAjMjM3MTg6IEZpeGVkIHBhcnNpbmcgdGltZSBpbiB3ZWVrIDAgYmVmb3JlIEphbiAxLiAgT3JpZ2luYWwgcGF0Y2ggYnkKICAgVGFtw6FzIEJlbmNlIEdlZGFpLgogCistIElzc3VlICMyNjMyMzogQWRkIE1vY2suYXNzZXJ0X2NhbGxlZCgpIGFuZCBNb2NrLmFzc2VydF9jYWxsZWRfb25jZSgpCisgIG1ldGhvZHMgdG8gdW5pdHRlc3QubW9jay4gUGF0Y2ggd3JpdHRlbiBieSBBbWl0IFNhaGEuCisKIC0gSXNzdWUgIzIwNTg5OiBJbnZva2luZyBQYXRoLm93bmVyKCkgYW5kIFBhdGguZ3JvdXAoKSBvbiBXaW5kb3dzIG5vdyByYWlzZQogICBOb3RJbXBsZW1lbnRlZEVycm9yIGluc3RlYWQgb2YgSW1wb3J0RXJyb3IuCiAKIC0gSXNzdWUgIzI2MTc3OiBGaXhlZCB0aGUga2V5cygpIG1ldGhvZCBmb3IgQ2FudmFzIGFuZCBTY3JvbGxiYXIgd2lkZ2V0cy4KIAotLSBJc3N1ZSAjMTUwNjg6IEdvdCByaWQgb2YgZXhjZXNzaXZlIGJ1ZmZlcmluZyBpbiB0aGUgZmlsZWlucHV0IG1vZHVsZS4KLSAgVGhlIGJ1ZnNpemUgcGFyYW1ldGVyIGlzIG5vIGxvbmdlciB1c2VkLgorLSBJc3N1ZSAjMTUwNjg6IEdvdCByaWQgb2YgZXhjZXNzaXZlIGJ1ZmZlcmluZyBpbiBmaWxlaW5wdXQuCisgIFRoZSBidWZzaXplIHBhcmFtZXRlciBpcyBub3cgZGVwcmVjYXRlZCBhbmQgaWdub3JlZC4KKworLSBJc3N1ZSAjMTk0NzU6IEFkZGVkIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRpbWVzcGVjIHRvIHRoZSBkYXRldGltZQorICBpc29mb3JtYXQoKSBtZXRob2QgdG8gY2hvb3NlIHRoZSBwcmVjaXNpb24gb2YgdGhlIHRpbWUgY29tcG9uZW50LgogCiAtIElzc3VlICMyMjAyOiBGaXggVW5ib3VuZExvY2FsRXJyb3IgaW4KICAgQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlci5nZXRfYWxnb3JpdGhtX2ltcGxzLiAgSW5pdGlhbCBwYXRjaCBieSBNYXRoaWV1IER1cHV5LgogCistIElzc3VlICMyNjE2NzogTWluaW1pemVkIG92ZXJoZWFkIGluIGNvcHkuY29weSgpIGFuZCBjb3B5LmRlZXBjb3B5KCkuCisgIE9wdGltaXplZCBjb3B5aW5nIGFuZCBkZWVwY29weWluZyBieXRlYXJyYXlzLCBOb3RJbXBsZW1lbnRlZCwgc2xpY2VzLAorICBzaG9ydCBsaXN0cywgdHVwbGVzLCBkaWN0cywgc2V0cy4KKwogLSBJc3N1ZSAjMjU3MTg6IEZpeGVkIHBpY2tsaW5nIGFuZCBjb3B5aW5nIHRoZSBhY2N1bXVsYXRlKCkgaXRlcmF0b3Igd2l0aAogICB0b3RhbCBpcyBOb25lLgogCiAtIElzc3VlICMyNjQ3NTogRml4ZWQgZGVidWdnaW5nIG91dHB1dCBmb3IgcmVndWxhciBleHByZXNzaW9ucyB3aXRoIHRoZSAoP3gpCiAgIGZsYWcuCiAKKy0gSXNzdWUgIzI2NDgyOiBBbGxvd2VkIHBpY2tsaW5nIHJlY3Vyc2l2ZSBkZXF1ZXVlcy4KKworLSBJc3N1ZSAjMjYzMzU6IE1ha2UgbW1hcC53cml0ZSgpIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gbGlrZQorICBvdGhlciB3cml0ZSBtZXRob2RzLiAgUGF0Y2ggYnkgSmFrdWIgU3Rhc2lhay4KKwogLSBJc3N1ZSAjMjY0NTc6IEZpeGVkIHRoZSBzdWJuZXRzKCkgbWV0aG9kcyBpbiBJUCBuZXR3b3JrIGNsYXNzZXMgZm9yIHRoZSBjYXNlCiAgIHdoZW4gcmVzdWx0aW5nIHByZWZpeCBsZW5ndGggaXMgZXF1YWwgdG8gbWF4aW1hbCBwcmVmaXggbGVuZ3RoLgogICBCYXNlZCBvbiBwYXRjaCBieSBYaWFuZyBaaGFuZy4KQEAgLTUxNCw3ICsxMTEwLDcgQEAKIAogLSBJc3N1ZSAjMjYxODY6IFJlbW92ZSBhbiBpbnZhbGlkIHR5cGUgY2hlY2sgaW4gaW1wb3J0bGliLnV0aWwuTGF6eUxvYWRlci4KIAotLSBJc3N1ZSAjMjYzNjc6IGltcG9ydGxpYi5fX2ltcG9ydF9fKCkgcmFpc2VzIFN5c3RlbUVycm9yIGxpa2UKKy0gSXNzdWUgIzI2MzY3OiBpbXBvcnRsaWIuX19pbXBvcnRfXygpIHJhaXNlcyBJbXBvcnRFcnJvciBsaWtlCiAgIGJ1aWx0aW5zLl9faW1wb3J0X18oKSB3aGVuIGBgbGV2ZWxgYCBpcyBzcGVjaWZpZWQgYnV0IHdpdGhvdXQgYW4gYWNjb21wYW55aW5nCiAgIHBhY2thZ2Ugc3BlY2lmaWVkLgogCkBAIC01MjIsMTggKzExMTgsMzggQEAKICAgdGhlIGNvbm5lY3RlZCBzb2NrZXQpIHdoZW4gdmVyaWZ5X3JlcXVlc3QoKSByZXR1cm5zIGZhbHNlLiAgUGF0Y2ggYnkgQXZpdgogICBQYWxpdm9kYS4KIAorLSBJc3N1ZSAjMjM0MzA6IENoYW5nZSB0aGUgc29ja2V0c2VydmVyIG1vZHVsZSB0byBvbmx5IGNhdGNoIGV4Y2VwdGlvbnMKKyAgcmFpc2VkIGZyb20gYSByZXF1ZXN0IGhhbmRsZXIgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIEV4Y2VwdGlvbiAoaW5zdGVhZCBvZgorICBCYXNlRXhjZXB0aW9uKS4gIFRoZXJlZm9yZSBTeXN0ZW1FeGl0IGFuZCBLZXlib2FyZEludGVycnVwdCBubyBsb25nZXIKKyAgdHJpZ2dlciB0aGUgaGFuZGxlX2Vycm9yKCkgbWV0aG9kLCBhbmQgd2lsbCBub3cgdG8gc3RvcCBhIHNpbmdsZS10aHJlYWRlZAorICBzZXJ2ZXIuCisKIC0gSXNzdWUgIzI1OTM5OiBPbiBXaW5kb3dzIG9wZW4gdGhlIGNlcnQgc3RvcmUgcmVhZG9ubHkgaW4gc3NsLmVudW1fY2VydGlmaWNhdGVzLgogCiAtIElzc3VlICMyNTk5NTogb3Mud2FsaygpIG5vIGxvbmdlciB1c2VzIEZEcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHRyZWUgZGVwdGguCiAKKy0gSXNzdWUgIzI1OTk0OiBBZGRlZCB0aGUgY2xvc2UoKSBtZXRob2QgYW5kIHRoZSBzdXBwb3J0IG9mIHRoZSBjb250ZXh0IG1hbmFnZXIKKyAgcHJvdG9jb2wgZm9yIHRoZSBvcy5zY2FuZGlyKCkgaXRlcmF0b3IuCisKKy0gSXNzdWUgIzIzOTkyOiBtdWx0aXByb2Nlc3Npbmc6IG1ha2UgTWFwUmVzdWx0IG5vdCBmYWlsLWZhc3QgdXBvbiBleGNlcHRpb24uCisKKy0gSXNzdWUgIzI2MjQzOiBTdXBwb3J0IGtleXdvcmQgYXJndW1lbnRzIHRvIHpsaWIuY29tcHJlc3MoKS4gIFBhdGNoIGJ5IEF2aXYKKyAgUGFsaXZvZGEuCisKIC0gSXNzdWUgIzI2MTE3OiBUaGUgb3Muc2NhbmRpcigpIGl0ZXJhdG9yIG5vdyBjbG9zZXMgZmlsZSBkZXNjcmlwdG9yIG5vdCBvbmx5CiAgIHdoZW4gdGhlIGl0ZXJhdGlvbiBpcyBmaW5pc2hlZCwgYnV0IHdoZW4gaXQgd2FzIGZhaWxlZCB3aXRoIGVycm9yLgogCistIElzc3VlICMyNTk0OTogX19kaWN0X18gZm9yIGFuIE9yZGVyZWREaWN0IGluc3RhbmNlIGlzIG5vdyBjcmVhdGVkIG9ubHkgd2hlbgorICBuZWVkZWQuCisKIC0gSXNzdWUgIzI1OTExOiBSZXN0b3JlZCBzdXBwb3J0IG9mIGJ5dGVzIHBhdGhzIGluIG9zLndhbGsoKSBvbiBXaW5kb3dzLgogCiAtIElzc3VlICMyNjA0NTogQWRkIFVURi04IHN1Z2dlc3Rpb24gdG8gZXJyb3IgbWVzc2FnZSB3aGVuIHBvc3RpbmcgYQogICBub24tTGF0aW4tMSBzdHJpbmcgd2l0aCBodHRwLmNsaWVudC4KIAorLSBJc3N1ZSAjMjYwMzk6IEFkZGVkIHppcGZpbGUuWmlwSW5mby5mcm9tX2ZpbGUoKSBhbmQgemlwaW5mby5aaXBJbmZvLmlzX2RpcigpLgorICBQYXRjaCBieSBUaG9tYXMgS2x1eXZlci4KKwogLSBJc3N1ZSAjMTI5MjM6IFJlc2V0IEZhbmN5VVJMb3BlbmVyJ3MgcmVkaXJlY3QgY291bnRlciBldmVuIGlmIHRoZXJlIGlzIGFuCiAgIGV4Y2VwdGlvbi4gIEJhc2VkIG9uIHBhdGNoZXMgYnkgQnJpYW4gQnJhemlsIGFuZCBEYW5pZWwgUm9jY28uCiAKQEAgLTU1NCw2ICsxMTcwLDEwIEBACiAgIGdldGhvc3RieW5hbWVfZXgoKSBmdW5jdGlvbnMgb2YgdGhlIHNvY2tldCBtb2R1bGUgbm93IGRlY29kZSB0aGUgaG9zdG5hbWUKICAgZnJvbSB0aGUgQU5TSSBjb2RlIHBhZ2UgcmF0aGVyIHRoYW4gVVRGLTguCiAKKy0gSXNzdWUgIzI2MDk5OiBUaGUgc2l0ZSBtb2R1bGUgbm93IHdyaXRlcyBhbiBlcnJvciBpbnRvIHN0ZGVyciBpZgorICBzaXRlY3VzdG9taXplIG1vZHVsZSBjYW4gYmUgaW1wb3J0ZWQgYnV0IGV4ZWN1dGluZyB0aGUgbW9kdWxlIHJhaXNlIGFuCisgIEltcG9ydEVycm9yLiBTYW1lIGNoYW5nZSBmb3IgdXNlcmN1c3RvbWl6ZS4KKwogLSBJc3N1ZSAjMjYxNDc6IHhtbHJwYyBub3cgd29ya3Mgd2l0aCBzdHJpbmdzIG5vdCBlbmNvZGFibGUgd2l0aCB1c2VkCiAgIG5vbi1VVEYtOCBlbmNvZGluZy4KIApAQCAtNTY0LDEzICsxMTg0LDIxIEBACiAtIElzc3VlICMyNjAxMzogQWRkZWQgY29tcGF0aWJpbGl0eSB3aXRoIGJyb2tlbiBwcm90b2NvbCAyIHBpY2tsZXMgY3JlYXRlZAogICBpbiBvbGQgUHl0aG9uIDMgdmVyc2lvbnMgKDMuNC4zIGFuZCBsb3dlcikuCiAKKy0gSXNzdWUgIzI2MTI5OiBEZXByZWNhdGVkIGFjY2VwdGluZyBub24taW50ZWdlcnMgaW4gZ3JwLmdldGdyZ2lkKCkuCisKIC0gSXNzdWUgIzI1ODUwOiBVc2UgY3Jvc3MtY29tcGlsYXRpb24gYnkgZGVmYXVsdCBmb3IgNjQtYml0IFdpbmRvd3MuCiAKLS0gSXNzdWUgIzE3NjMzOiBJbXByb3ZlIHppcGltcG9ydCdzIHN1cHBvcnQgZm9yIG5hbWVzcGFjZSBwYWNrYWdlcy4KKy0gSXNzdWUgIzI1ODIyOiBBZGQgZG9jc3RyaW5ncyB0byB0aGUgZmllbGRzIG9mIHVybGxpYi5wYXJzZSByZXN1bHRzLgorICBQYXRjaCBjb250cmlidXRlZCBieSBTd2F0aSBKYWlzd2FsLgorCistIElzc3VlICMyMjY0MjogQ29udmVydCB0cmFjZSBtb2R1bGUgb3B0aW9uIHBhcnNpbmcgbWVjaGFuaXNtIHRvIGFyZ3BhcnNlLgorICBQYXRjaCBjb250cmlidXRlZCBieSBTaWxlbnRHaG9zdC4KIAogLSBJc3N1ZSAjMjQ3MDU6IEZpeCBzeXNjb25maWcuX3BhcnNlX21ha2VmaWxlIG5vdCBleHBhbmRpbmcgJHt9IHZhcnMKICAgYXBwZWFyaW5nIGJlZm9yZSAkKCkgdmFycy4KIAorLSBJc3N1ZSAjMjYwNjk6IFJlbW92ZSB0aGUgZGVwcmVjYXRlZCBhcGlzIGluIHRoZSB0cmFjZSBtb2R1bGUuCisKIC0gSXNzdWUgIzIyMTM4OiBGaXggbW9jay5wYXRjaCBiZWhhdmlvciB3aGVuIHBhdGNoaW5nIGRlc2NyaXB0b3JzLiBSZXN0b3JlCiAgIG9yaWdpbmFsIHZhbHVlcyBhZnRlciBwYXRjaGluZy4gUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2VhbiBNY0N1bGx5LgogCkBAIC01ODMsMTMgKzEyMTEsMjggQEAKIC0gSXNzdWUgIzI0MTIwOiBJZ25vcmUgUGVybWlzc2lvbkVycm9yIHdoZW4gdHJhdmVyc2luZyBhIHRyZWUgd2l0aAogICBwYXRobGliLlBhdGguW3JdZ2xvYigpLiAgUGF0Y2ggYnkgVWxyaWNoIFBldHJpLgogCistIElzc3VlICMyMTgxNTogQWNjZXB0IF0gY2hhcmFjdGVycyBpbiB0aGUgZGF0YSBwb3J0aW9uIG9mIGltYXAgcmVzcG9uc2VzLAorICBpbiBvcmRlciB0byBoYW5kbGUgdGhlIGZsYWdzIHdpdGggc3F1YXJlIGJyYWNrZXRzIGFjY2VwdGVkIGFuZCBwcm9kdWNlZAorICBieSBzZXJ2ZXJzIHN1Y2ggYXMgZ21haWwuCisKIC0gSXNzdWUgIzI1NDQ3OiBmaWxlaW5wdXQgbm93IHVzZXMgc3lzLnN0ZGluIGFzLWlzIGlmIGl0IGRvZXMgbm90IGhhdmUgYQogICBidWZmZXIgYXR0cmlidXRlIChyZXN0b3JlcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KIAorLSBJc3N1ZSAjMjU5NzE6IE9wdGltaXplZCBjcmVhdGluZyBGcmFjdGlvbnMgZnJvbSBmbG9hdHMgYnkgMiB0aW1lcyBhbmQgZnJvbQorICBEZWNpbWFscyBieSAzIHRpbWVzLgorCistIElzc3VlICMyNTgwMjogRG9jdW1lbnQgYXMgZGVwcmVjYXRlZCB0aGUgcmVtYWluaW5nIGltcGxlbWVudGF0aW9ucyBvZgorICBpbXBvcnRsaWIuYWJjLkxvYWRlci5sb2FkX21vZHVsZSgpLgorCistIElzc3VlICMyNTkyODogQWRkIERlY2ltYWwuYXNfaW50ZWdlcl9yYXRpbygpLgorCiAtIElzc3VlICMyNTQ0NzogQ29weWluZyB0aGUgbHJ1X2NhY2hlKCkgd3JhcHBlciBvYmplY3Qgbm93IGFsd2F5cyB3b3JrcywKLSAgaW5kZXBlbmRlZGx5IGZyb20gdGhlIHR5cGUgb2YgdGhlIHdyYXBwZWQgb2JqZWN0IChieSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsCisgIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgdHlwZSBvZiB0aGUgd3JhcHBlZCBvYmplY3QgKGJ5IHJldHVybmluZyB0aGUgb3JpZ2luYWwKICAgb2JqZWN0IHVuY2hhbmdlZCkuCiAKKy0gSXNzdWUgIzI1NzY4OiBIYXZlIHRoZSBmdW5jdGlvbnMgaW4gY29tcGlsZWFsbCByZXR1cm4gYm9vbGVhbnMgaW5zdGVhZCBvZgorICBpbnRzIGFuZCBhZGQgcHJvcGVyIGRvY3VtZW50YXRpb24gYW5kIHRlc3RzIGZvciB0aGUgcmV0dXJuIHZhbHVlcy4KKwogLSBJc3N1ZSAjMjQxMDM6IEZpeGVkIHBvc3NpYmxlIHVzZSBhZnRlciBmcmVlIGluIEVsZW1lbnRUcmVlLlhNTFB1bGxQYXJzZXIuCiAKIC0gSXNzdWUgIzI1ODYwOiBvcy5md2FsaygpIG5vIGxvbmdlciBza2lwcyByZW1haW5pbmcgZGlyZWN0b3JpZXMgd2hlbiBlcnJvcgpAQCAtNTk3LDggKzEyNDAsMjIgQEAKIAogLSBJc3N1ZSAjMjU5MTQ6IEZpeGVkIGFuZCBzaW1wbGlmaWVkIE9yZGVyZWREaWN0Ll9fc2l6ZW9mX18uCiAKKy0gSXNzdWUgIzI1ODY5OiBPcHRpbWl6ZWQgZGVlcGNvcHlpbmcgRWxlbWVudFRyZWU7IGl0IGlzIG5vdyAyMCB0aW1lcyBmYXN0ZXIuCisKKy0gSXNzdWUgIzI1ODczOiBPcHRpbWl6ZWQgaXRlcmF0aW5nIEVsZW1lbnRUcmVlLiAgSXRlcmF0aW5nIGVsZW1lbnRzCisgIEVsZW1lbnQuaXRlcigpIGlzIG5vdyA0MCUgZmFzdGVyLCBpdGVyYXRpbmcgdGV4dCBFbGVtZW50Lml0ZXJ0ZXh0KCkKKyAgaXMgbm93IHVwIHRvIDIuNSB0aW1lcyBmYXN0ZXIuCisKIC0gSXNzdWUgIzI1OTAyOiBGaXhlZCB2YXJpb3VzIHJlZmNvdW50IGlzc3VlcyBpbiBFbGVtZW50VHJlZSBpdGVyYXRpb24uCiAKKy0gSXNzdWUgIzIyMjI3OiBUaGUgVGFyRmlsZSBpdGVyYXRvciBpcyByZWltcGxlbWVudGVkIHVzaW5nIGdlbmVyYXRvci4KKyAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzaW1wbGVyIHRoYXQgdXNpbmcgY2xhc3MuCisKKy0gSXNzdWUgIzI1NjM4OiBPcHRpbWl6ZWQgRWxlbWVudFRyZWUuaXRlcnBhcnNlKCk7IGl0IGlzIG5vdyAyeCBmYXN0ZXIuCisgIE9wdGltaXplZCBFbGVtZW50VHJlZSBwYXJzaW5nOyBpdCBpcyBub3cgMTAlIGZhc3Rlci4KKworLSBJc3N1ZSAjMjU3NjE6IEltcHJvdmVkIGRldGVjdGluZyBlcnJvcnMgaW4gYnJva2VuIHBpY2tsZSBkYXRhLgorCiAtIElzc3VlICMyNTcxNzogUmVzdG9yZSB0aGUgcHJldmlvdXMgYmVoYXZpb3VyIG9mIHRvbGVyYXRpbmcgbW9zdCBmc3RhdCgpCiAgIGVycm9ycyB3aGVuIG9wZW5pbmcgZmlsZXMuICBUaGlzIHdhcyBhIHJlZ3Jlc3Npb24gaW4gMy41YTEsIGFuZCBzdG9wcGVkCiAgIGFub255bW91cyB0ZW1wb3JhcnkgZmlsZXMgZnJvbSB3b3JraW5nIGluIHNwZWNpYWwgY2FzZXMuCkBAIC02MTAsNiArMTI2Nyw5IEBACiAtIElzc3VlICMyNTc2NDogSW4gdGhlIHN1YnByb2Nlc3MgbW9kdWxlLCBwcmVzZXJ2ZSBhbnkgZXhjZXB0aW9uIGNhdXNlZCBieQogICBmb3JrKCkgZmFpbHVyZSB3aGVuIHByZWV4ZWNfZm4gaXMgdXNlZC4KIAorLSBJc3N1ZSAjMjU3NzE6IFR3ZWFrIHRoZSBleGNlcHRpb24gbWVzc2FnZSBmb3IgaW1wb3J0bGliLnV0aWwucmVzb2x2ZV9uYW1lKCkKKyAgd2hlbiAncGFja2FnZScgaXNuJ3Qgc3BlY2lmaWVkIGJ1dCBuZWNlc3NhcnkuCisKIC0gSXNzdWUgIzY0Nzg6IF9zdHJwdGltZSdzIHJlZ2V4cCBjYWNoZSBub3cgaXMgcmVzZXQgYWZ0ZXIgY2hhbmdpbmcgdGltZXpvbmUKICAgd2l0aCB0aW1lLnR6c2V0KCkuCiAKQEAgLTYzMSw2ICsxMjkxLDkgQEAKIC0gSXNzdWUgIzEwMTMxOiBGaXhlZCBkZWVwIGNvcHlpbmcgb2YgbWluaWRvbSBkb2N1bWVudHMuICBCYXNlZCBvbiBwYXRjaAogICBieSBNYXJpYW4gR2FuaXNpbi4KIAorLSBJc3N1ZSAjNzk5MDogZGlyKCkgb24gRWxlbWVudFRyZWUuRWxlbWVudCBub3cgbGlzdHMgcHJvcGVydGllczogInRhZyIsCisgICJ0ZXh0IiwgInRhaWwiIGFuZCAiYXR0cmliIi4gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhbnRvc28gV2lqYXlhLgorCiAtIElzc3VlICMyNTcyNTogRml4ZWQgYSByZWZlcmVuY2UgbGVhayBpbiBwaWNrbGUubG9hZHMoKSB3aGVuIHVucGlja2xpbmcKICAgaW52YWxpZCBkYXRhIGluY2x1ZGluZyB0dXBsZSBpbnN0cnVjdGlvbnMuCiAKQEAgLTY0Niw2ICsxMzA5LDIwMiBAQAogLSBJc3N1ZSAjMjU2MjQ6IFppcEZpbGUgbm93IGFsd2F5cyB3cml0ZXMgYSBaSVBfU1RPUkVEIGhlYWRlciBmb3IgZGlyZWN0b3J5CiAgIGVudHJpZXMuICBQYXRjaCBieSBEaW5neXVhbiBXYW5nLgogCistIElzc3VlICMyNTYyNjogQ2hhbmdlIHRocmVlIHpsaWIgZnVuY3Rpb25zIHRvIGFjY2VwdCBzaXplcyB0aGF0IGZpdCBpbgorICBQeV9zc2l6ZV90LCBidXQgaW50ZXJuYWxseSBjYXAgdGhvc2Ugc2l6ZXMgdG8gVUlOVF9NQVguICBUaGlzIHJlc29sdmVzIGEKKyAgcmVncmVzc2lvbiBpbiAzLjUgd2hlcmUgR3ppcEZpbGUucmVhZCgpIGZhaWxlZCB0byByZWFkIGNodW5rcyBsYXJnZXIgdGhhbiAyCisgIG9yIDQgR2lCLiAgVGhlIGNoYW5nZSBhZmZlY3RzIHRoZSB6bGliLkRlY29tcHJlc3MuZGVjb21wcmVzcygpIG1heF9sZW5ndGgKKyAgcGFyYW1ldGVyLCB0aGUgemxpYi5kZWNvbXByZXNzKCkgYnVmc2l6ZSBwYXJhbWV0ZXIsIGFuZCB0aGUKKyAgemxpYi5EZWNvbXByZXNzLmZsdXNoKCkgbGVuZ3RoIHBhcmFtZXRlci4KKworLSBJc3N1ZSAjMjU1ODM6IEF2b2lkIGluY29ycmVjdCBlcnJvcnMgcmFpc2VkIGJ5IG9zLm1ha2VkaXJzKGV4aXN0X29rPVRydWUpCisgIHdoZW4gdGhlIE9TIGdpdmVzIHByaW9yaXR5IHRvIGVycm9ycyBzdWNoIGFzIEVBQ0NFUyBvdmVyIEVFWElTVC4KKworLSBJc3N1ZSAjMjU1OTM6IENoYW5nZSBzZW1hbnRpY3Mgb2YgRXZlbnRMb29wLnN0b3AoKSBpbiBhc3luY2lvLgorCistIElzc3VlICM2OTczOiBXaGVuIHdlIGtub3cgYSBzdWJwcm9jZXNzLlBvcGVuIHByb2Nlc3MgaGFzIGRpZWQsIGRvCisgIG5vdCBhbGxvdyB0aGUgc2VuZF9zaWduYWwoKSwgdGVybWluYXRlKCksIG9yIGtpbGwoKSBtZXRob2RzIHRvIGRvCisgIGFueXRoaW5nIGFzIHRoZXkgY291bGQgcG90ZW50aWFsbHkgc2lnbmFsIGEgZGlmZmVyZW50IHByb2Nlc3MuCisKKy0gSXNzdWUgIzIzODgzOiBBZGRlZCBtaXNzaW5nIEFQSXMgdG8gX19hbGxfXyB0byBtYXRjaCB0aGUgZG9jdW1lbnRlZCBBUElzCisgIGZvciB0aGUgZm9sbG93aW5nIG1vZHVsZXM6IGNhbGVuZGFyLCBjc3YsIGVudW0sIGZpbGVpbnB1dCwgZnRwbGliLCBsb2dnaW5nLAorICBvcHRwYXJzZSwgdGFyZmlsZSwgdGhyZWFkaW5nIGFuZCB3YXZlLiAgQWxzbyBhZGRlZCBhCisgIHRlc3Quc3VwcG9ydC5jaGVja19fYWxsX18oKSBoZWxwZXIuICBQYXRjaGVzIGJ5IEphY2VrIEtvxYJvZHppZWosIE1hdXJvCisgIFMuIE0uIFJvZHJpZ3VlcyBhbmQgSm9lbCBUYWRkZWkuCisKKy0gSXNzdWUgIzI1NTkwOiBJbiB0aGUgUmVhZGxpbmUgY29tcGxldGVyLCBvbmx5IGNhbGwgZ2V0YXR0cigpIG9uY2UgcGVyCisgIGF0dHJpYnV0ZS4gIEFsc28gY29tcGxldGUgbmFtZXMgb2YgYXR0cmlidXRlcyBzdWNoIGFzIHByb3BlcnRpZXMgYW5kIHNsb3RzCisgIHdoaWNoIGFyZSBsaXN0ZWQgYnkgZGlyKCkgYnV0IG5vdCB5ZXQgY3JlYXRlZCBvbiBhbiBpbnN0YW5jZS4KKworLSBJc3N1ZSAjMjU0OTg6IEZpeCBhIGNyYXNoIHdoZW4gZ2FyYmFnZS1jb2xsZWN0aW5nIGN0eXBlcyBvYmplY3RzIGNyZWF0ZWQKKyAgYnkgd3JhcHBpbmcgYSBtZW1vcnl2aWV3LiAgVGhpcyB3YXMgYSByZWdyZXNzaW9uIG1hZGUgaW4gMy41YTEuICBCYXNlZAorICBvbiBwYXRjaCBieSBFcnlrc3VuLgorCistIElzc3VlICMyNTU4NDogQWRkZWQgImVzY2FwZSIgdG8gdGhlIF9fYWxsX18gbGlzdCBpbiB0aGUgZ2xvYiBtb2R1bGUuCisKKy0gSXNzdWUgIzI1NTg0OiBGaXhlZCByZWN1cnNpdmUgZ2xvYigpIHdpdGggcGF0dGVybnMgc3RhcnRpbmcgd2l0aCAnXCpcKicuCisKKy0gSXNzdWUgIzI1NDQ2OiBGaXggcmVncmVzc2lvbiBpbiBzbXRwbGliJ3MgQVVUSCBMT0dJTiBzdXBwb3J0LgorCistIElzc3VlICMxODAxMDogRml4IHRoZSBweWRvYyB3ZWIgc2VydmVyJ3MgbW9kdWxlIHNlYXJjaCBmdW5jdGlvbiB0byBoYW5kbGUKKyAgZXhjZXB0aW9ucyBmcm9tIGltcG9ydGluZyBwYWNrYWdlcy4KKworLSBJc3N1ZSAjMjU1NTQ6IEdvdCByaWQgb2YgY2lyY3VsYXIgcmVmZXJlbmNlcyBpbiByZWd1bGFyIGV4cHJlc3Npb24gcGFyc2luZy4KKworLSBJc3N1ZSAjMTg5NzM6IENvbW1hbmQtbGluZSBpbnRlcmZhY2Ugb2YgdGhlIGNhbGVuZGFyIG1vZHVsZSBub3cgdXNlcyBhcmdwYXJzZQorICBpbnN0ZWFkIG9mIG9wdHBhcnNlLgorCistIElzc3VlICMyNTUxMDogZmlsZWlucHV0LkZpbGVJbnB1dC5yZWFkbGluZSgpIG5vdyByZXR1cm5zIGInJyBpbnN0ZWFkIG9mICcnCisgIGF0IHRoZSBlbmQgaWYgdGhlIEZpbGVJbnB1dCB3YXMgb3BlbmVkIHdpdGggYmluYXJ5IG1vZGUuCisgIFBhdGNoIGJ5IFJ5b3N1a2UgSXRvLgorCistIElzc3VlICMyNTUwMzogRml4ZWQgaW5zcGVjdC5nZXRkb2MoKSBmb3IgaW5oZXJpdGVkIGRvY3N0cmluZ3Mgb2YgcHJvcGVydGllcy4KKyAgT3JpZ2luYWwgcGF0Y2ggYnkgSm9obiBNYXJrIFZhbmRlbmJlcmcuCisKKy0gSXNzdWUgIzI1NTE1OiBBbHdheXMgdXNlIG9zLnVyYW5kb20gYXMgYSBzb3VyY2Ugb2YgcmFuZG9tbmVzcyBpbiB1dWlkLnV1aWQ0LgorCistIElzc3VlICMyMTgyNzogRml4ZWQgdGV4dHdyYXAuZGVkZW50KCkgZm9yIHRoZSBjYXNlIHdoZW4gbGFyZ2VzdCBjb21tb24KKyAgd2hpdGVzcGFjZSBpcyBhIHN1YnN0cmluZyBvZiBzbWFsbGVzdCBsZWFkaW5nIHdoaXRlc3BhY2UuCisgIEJhc2VkIG9uIHBhdGNoIGJ5IFJvYmVydCBMaS4KKworLSBJc3N1ZSAjMjU0NDc6IFRoZSBscnVfY2FjaGUoKSB3cmFwcGVyIG9iamVjdHMgbm93IGNhbiBiZSBjb3BpZWQgYW5kIHBpY2tsZWQKKyAgKGJ5IHJldHVybmluZyB0aGUgb3JpZ2luYWwgb2JqZWN0IHVuY2hhbmdlZCkuCisKKy0gSXNzdWUgIzI1MzkwOiB0eXBpbmc6IERvbid0IGNyYXNoIG9uIFVuaW9uW3N0ciwgUGF0dGVybl0uCisKKy0gSXNzdWUgIzI1NDQxOiBhc3luY2lvOiBSYWlzZSBlcnJvciBmcm9tIGRyYWluKCkgd2hlbiBzb2NrZXQgaXMgY2xvc2VkLgorCistIElzc3VlICMyNTQxMDogQ2xlYW5lZCB1cCBhbmQgZml4ZWQgbWlub3IgYnVncyBpbiBDIGltcGxlbWVudGF0aW9uIG9mCisgIE9yZGVyZWREaWN0LgorCistIElzc3VlICMyNTQxMTogSW1wcm92ZWQgVW5pY29kZSBzdXBwb3J0IGluIFNNVFBIYW5kbGVyIHRocm91Z2ggYmV0dGVyIHVzZSBvZgorICB0aGUgZW1haWwgcGFja2FnZS4gVGhhbmtzIHRvIHVzZXIgc2ltb24wNCBmb3IgdGhlIHBhdGNoLgorCistIE1vdmUgdGhlIGltcCBtb2R1bGUgZnJvbSBhIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgdG8gRGVwcmVjYXRpb25XYXJuaW5nLgorCistIElzc3VlICMyNTQwNzogUmVtb3ZlIG1lbnRpb25zIG9mIHRoZSBmb3JtYXR0ZXIgbW9kdWxlIGJlaW5nIHJlbW92ZWQgaW4KKyAgUHl0aG9uIDMuNi4KKworLSBJc3N1ZSAjMjU0MDY6IEZpeGVkIGEgYnVnIGluIEMgaW1wbGVtZW50YXRpb24gb2YgT3JkZXJlZERpY3QubW92ZV90b19lbmQoKQorICB0aGF0IGNhdXNlZCBzZWdtZW50YXRpb24gZmF1bHQgb3IgaGFuZyBpbiBpdGVyYXRpbmcgYWZ0ZXIgbW92aW5nIHNldmVyYWwKKyAgaXRlbXMgdG8gdGhlIHN0YXJ0IG9mIG9yZGVyZWQgZGljdC4KKworLSBJc3N1ZSAjMjUzODI6IHBpY2tsZXRvb2xzLmRpcygpIG5vdyBvdXRwdXRzIGltcGxpY2l0IG1lbW8gaW5kZXggZm9yIHRoZQorICBNRU1PSVpFIG9wY29kZS4KKworLSBJc3N1ZSAjMjUzNTc6IEFkZCBhbiBvcHRpb25hbCBuZXdsaW5lIHBhcmFtZXIgdG8gYmluYXNjaWkuYjJhX2Jhc2U2NCgpLgorICBiYXNlNjQuYjY0ZW5jb2RlKCkgdXNlcyBpdCB0byBhdm9pZCBhIG1lbW9yeSBjb3B5LgorCistIElzc3VlICMyNDE2NDogT2JqZWN0cyB0aGF0IG5lZWQgY2FsbGluZyBgYF9fbmV3X19gYCB3aXRoIGtleXdvcmQgYXJndW1lbnRzLAorICBjYW4gbm93IGJlIHBpY2tsZWQgdXNpbmcgcGlja2xlIHByb3RvY29scyBvbGRlciB0aGFuIHByb3RvY29sIHZlcnNpb24gNC4KKworLSBJc3N1ZSAjMjUzNjQ6IHppcGZpbGUgbm93IHdvcmtzIGluIHRocmVhZHMgZGlzYWJsZWQgYnVpbGRzLgorCistIElzc3VlICMyNTMyODogc210cGQncyBTTVRQQ2hhbm5lbCBub3cgY29ycmVjdGx5IHJhaXNlcyBhIFZhbHVlRXJyb3IgaWYgYm90aAorICBkZWNvZGVfZGF0YSBhbmQgZW5hYmxlX1NNVFBVVEY4IGFyZSBzZXQgdG8gdHJ1ZS4KKworLSBJc3N1ZSAjMTYwOTk6IFJvYm90RmlsZVBhcnNlciBub3cgc3VwcG9ydHMgQ3Jhd2wtZGVsYXkgYW5kIFJlcXVlc3QtcmF0ZQorICBleHRlbnNpb25zLiAgUGF0Y2ggYnkgTmlrb2xheSBCb2dveWNoZXYuCisKKy0gSXNzdWUgIzI1MzE2OiBkaXN0dXRpbHMgcmFpc2VzIE9TRXJyb3IgaW5zdGVhZCBvZiBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCisgIHdoZW4gTVNWQyBpcyBub3QgaW5zdGFsbGVkLgorCistIElzc3VlICMyNTM4MDogRml4ZWQgcHJvdG9jb2wgZm9yIHRoZSBTVEFDS19HTE9CQUwgb3Bjb2RlIGluCisgIHBpY2tsZXRvb2xzLm9wY29kZXMuCisKKy0gSXNzdWUgIzIzOTcyOiBVcGRhdGVzIGFzeW5jaW8gZGF0YWdyYW0gY3JlYXRlIG1ldGhvZCBhbGxvd2luZyByZXVzZXBvcnQKKyAgYW5kIHJldXNlYWRkciBzb2NrZXQgb3B0aW9ucyB0byBiZSBzZXQgcHJpb3IgdG8gYmluZGluZyB0aGUgc29ja2V0LgorICBNaXJyb3JpbmcgdGhlIGV4aXN0aW5nIGFzeW5jaW8gY3JlYXRlX3NlcnZlciBtZXRob2QgdGhlIHJldXNlYWRkciBvcHRpb24KKyAgZm9yIGRhdGFncmFtIHNvY2tldHMgZGVmYXVsdHMgdG8gVHJ1ZSBpZiB0aGUgTy9TIGlzICdwb3NpeCcgKGV4Y2VwdCBpZiB0aGUKKyAgcGxhdGZvcm0gaXMgQ3lnd2luKS4gUGF0Y2ggYnkgQ2hyaXMgTGF3cy4KKworLSBJc3N1ZSAjMjUzMDQ6IEFkZCBhc3luY2lvLnJ1bl9jb3JvdXRpbmVfdGhyZWFkc2FmZSgpLiAgVGhpcyBsZXRzIHlvdQorICBzdWJtaXQgYSBjb3JvdXRpbmUgdG8gYSBsb29wIGZyb20gYW5vdGhlciB0aHJlYWQsIHJldHVybmluZyBhCisgIGNvbmN1cnJlbnQuZnV0dXJlcy5GdXR1cmUuICBCeSBWaW5jZW50IE1pY2hlbC4KKworLSBJc3N1ZSAjMjUyMzI6IEZpeCBDR0lSZXF1ZXN0SGFuZGxlciB0byBzcGxpdCB0aGUgcXVlcnkgZnJvbSB0aGUgVVJMIGF0IHRoZQorICBmaXJzdCBxdWVzdGlvbiBtYXJrICg/KSByYXRoZXIgdGhhbiB0aGUgbGFzdC4gUGF0Y2ggZnJvbSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjQ2NTc6IFByZXZlbnQgQ0dJUmVxdWVzdEhhbmRsZXIgZnJvbSBjb2xsYXBzaW5nIHNsYXNoZXMgaW4gdGhlCisgIHF1ZXJ5IHBhcnQgb2YgdGhlIFVSTCBhcyBpZiBpdCB3ZXJlIGEgcGF0aC4gUGF0Y2ggZnJvbSBYaWFuZyBaaGFuZy4KKworLSBJc3N1ZSAjMjUyODc6IERvbid0IGFkZCBjcnlwdC5NRVRIT0RfQ1JZUFQgdG8gY3J5cHQubWV0aG9kcyBpZiBpdCdzIG5vdAorICBzdXBwb3J0ZWQuIENoZWNrIGlmIGl0IGlzIHN1cHBvcnRlZCwgaXQgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgb24gT3BlbkJTRCBmb3IKKyAgZXhhbXBsZS4KKworLSBJc3N1ZSAjMjM2MDA6IERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdHppbmZvLmZyb211dGMoKSB3YXMgcmV0dXJuaW5nCisgIHdyb25nIHJlc3VsdHMgaW4gc29tZSBjYXNlcy4KKworLSBJc3N1ZSAjMjUyMDM6IEZhaWxlZCByZWFkbGluZS5zZXRfY29tcGxldGVyX2RlbGltcygpIG5vIGxvbmdlciBsZWZ0IHRoZQorICBtb2R1bGUgaW4gaW5jb25zaXN0ZW50IHN0YXRlLgorCistIElzc3VlICMyNTAxMTogcmxjb21wbGV0ZXIgbm93IG9taXRzIHByaXZhdGUgYW5kIHNwZWNpYWwgYXR0cmlidXRlIG5hbWVzIHVubGVzcworICB0aGUgcHJlZml4IHN0YXJ0cyB3aXRoIHVuZGVyc2NvcmVzLgorCistIElzc3VlICMyNTIwOTogcmxjb21wbGV0ZXIgbm93IGNhbiBhZGQgYSBzcGFjZSBvciBhIGNvbG9uIGFmdGVyIGNvbXBsZXRlZCBrZXl3b3JkLgorCistIElzc3VlICMyMjI0MTogdGltZXpvbmUudXRjIG5hbWUgaXMgbm93IHBsYWluICdVVEMnLCBub3QgJ1VUQy0wMDowMCcuCisKKy0gSXNzdWUgIzIzNTE3OiBmcm9tdGltZXN0YW1wKCkgYW5kIHV0Y2Zyb210aW1lc3RhbXAoKSBtZXRob2RzIG9mCisgIGRhdGV0aW1lLmRhdGV0aW1lIG5vdyByb3VuZCBtaWNyb3NlY29uZHMgdG8gbmVhcmVzdCB3aXRoIHRpZXMgZ29pbmcgdG8KKyAgbmVhcmVzdCBldmVuIGludGVnZXIgKFJPVU5EX0hBTEZfRVZFTiksIGFzIHJvdW5kKGZsb2F0KSwgaW5zdGVhZCBvZiByb3VuZGluZworICB0b3dhcmRzIC1JbmZpbml0eSAoUk9VTkRfRkxPT1IpLgorCistIElzc3VlICMyMzU1MjogVGltZWl0IG5vdyB3YXJucyB3aGVuIHRoZXJlIGlzIHN1YnN0YW50aWFsICg0eCkgdmFyaWFuY2UKKyAgYmV0d2VlbiBiZXN0IGFuZCB3b3JzdCB0aW1lcy4gUGF0Y2ggZnJvbSBTZXJoaXkgU3RvcmNoYWthLgorCistIElzc3VlICMyNDYzMzogc2l0ZS1wYWNrYWdlcy9SRUFETUUgLT4gUkVBRE1FLnR4dC4KKworLSBJc3N1ZSAjMjQ4Nzk6IGhlbHAoKSBhbmQgcHlkb2MgY2FuIG5vdyBsaXN0IG5hbWVkIHR1cGxlIGZpZWxkcyBpbiB0aGUKKyAgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgcmF0aGVyIHRoYW4gYWxwaGFiZXRpY2FsbHkuICBUaGUgb3JkZXJpbmcgaXMKKyAgZGV0ZXJtaW5lZCBieSB0aGUgX2ZpZWxkcyBhdHRyaWJ1dGUgaWYgcHJlc2VudC4KKworLSBJc3N1ZSAjMjQ4NzQ6IEltcHJvdmUgc3BlZWQgb2YgaXRlcnRvb2xzLmN5Y2xlKCkgYW5kIG1ha2UgaXRzCisgIHBpY2tsZSBtb3JlIGNvbXBhY3QuCisKKy0gRml4IGNyYXNoIGluIGl0ZXJ0b29scy5jeWNsZS5fX3NldHN0YXRlX18oKSB3aGVuIHRoZSBmaXJzdCBhcmd1bWVudCB3YXNuJ3QKKyAgYSBsaXN0LgorCistIElzc3VlICMyMDA1OTogdXJsbGliLnBhcnNlIHJhaXNlcyBWYWx1ZUVycm9yIG9uIGFsbCBpbnZhbGlkIHBvcnRzLgorICBQYXRjaCBieSBNYXJ0aW4gUGFudGVyLgorCistIElzc3VlICMyNDM2MDogSW1wcm92ZSBfX3JlcHJfXyBvZiBhcmdwYXJzZS5OYW1lc3BhY2UoKSBmb3IgaW52YWxpZAorICBpZGVudGlmaWVycy4gIFBhdGNoIGJ5IE1hdHRoaWFzIEJ1c3Nvbm5pZXIuCisKKy0gSXNzdWUgIzIzNDI2OiBydW5fc2V0dXAgd2FzIGJyb2tlbiBpbiBkaXN0dXRpbHMuCisgIFBhdGNoIGZyb20gQWxleGFuZGVyIEJlbG9wb2xza3kuCisKKy0gSXNzdWUgIzEzOTM4OiAydG8zIGNvbnZlcnRzIFN0cmluZ1R5cGVzIHRvIGEgdHVwbGUuIFBhdGNoIGZyb20gTWFyayBIYW1tb25kLgorCistIElzc3VlICMyMDkxOiBvcGVuKCkgYWNjZXB0ZWQgYSAnVScgbW9kZSBzdHJpbmcgY29udGFpbmluZyAnKycsIGJ1dCAnVScgY2FuCisgIG9ubHkgYmUgdXNlZCB3aXRoICdyJy4gUGF0Y2ggZnJvbSBKZWZmIEJhbG9naCBhbmQgSm9obiBPJ0Nvbm5vci4KKworLSBJc3N1ZSAjODU4NTogaW1wcm92ZWQgdGVzdHMgZm9yIHppcGltcG9ydGVyMi4gUGF0Y2ggZnJvbSBNYXJrIExhd3JlbmNlLgorCistIElzc3VlICMxODYyMjogdW5pdHRlc3QubW9jay5tb2NrX29wZW4oKS5yZXNldF9tb2NrIHdvdWxkIHJlY3Vyc2UgaW5maW5pdGVseS4KKyAgUGF0Y2ggZnJvbSBOaWNvbGEgUGFsdW1ibyBhbmQgTGF1cmVudCBEZSBCdXlzdC4KKworLSBJc3N1ZSAjMjQ0MjY6IEZhc3Qgc2VhcmNoaW5nIG9wdGltaXphdGlvbiBpbiByZWd1bGFyIGV4cHJlc3Npb25zIG5vdyB3b3JrcworICBmb3IgcGF0dGVybnMgdGhhdCBzdGFydHMgd2l0aCBjYXB0dXJpbmcgZ3JvdXBzLiAgRmFzdCBzZWFyY2hpbmcgb3B0aW1pemF0aW9uCisgIG5vdyBjYW4ndCBiZSBkaXNhYmxlZCBhdCBjb21waWxlIHRpbWUuCisKKy0gSXNzdWUgIzIzNjYxOiB1bml0dGVzdC5tb2NrIHNpZGVfZWZmZWN0cyBjYW4gbm93IGJlIGV4Y2VwdGlvbnMgYWdhaW4uIFRoaXMKKyAgd2FzIGEgcmVncmVzc2lvbiB2cyBQeXRob24gMy40LiBQYXRjaCBmcm9tIElnbmFjaW8gUm9zc2kKKworLSBJc3N1ZSAjMTMyNDg6IFJlbW92ZSBkZXByZWNhdGVkIGluc3BlY3QuZ2V0bW9kdWxlaW5mbyBmdW5jdGlvbi4KKworLSBJc3N1ZSAjMjU1Nzg6IEZpeCAoYW5vdGhlcikgbWVtb3J5IGxlYWsgaW4gU1NMU29ja2V0LmdldHBlZXJjZXIoKS4KKworLSBJc3N1ZSAjMjU1MzA6IERpc2FibGUgdGhlIHZ1bG5lcmFibGUgU1NMdjMgcHJvdG9jb2wgYnkgZGVmYXVsdCB3aGVuIGNyZWF0aW5nCisgIHNzbC5TU0xDb250ZXh0LgorCistIElzc3VlICMyNTU2OTogRml4IG1lbW9yeSBsZWFrIGluIFNTTFNvY2tldC5nZXRwZWVyY2VydCgpLgorCistIElzc3VlICMyNTQ3MTogU29ja2V0cyByZXR1cm5lZCBmcm9tIGFjY2VwdCgpIHNob3VsZG4ndCBhcHBlYXIgdG8gYmUKKyAgbm9uYmxvY2tpbmcuCisKKy0gSXNzdWUgIzI1MzE5OiBXaGVuIHRocmVhZGluZy5FdmVudCBpcyByZWluaXRpYWxpemVkLCB0aGUgdW5kZXJseWluZyBjb25kaXRpb24KKyAgc2hvdWxkIHVzZSBhIHJlZ3VsYXIgbG9jayByYXRoZXIgdGhhbiBhIHJlY3Vyc2l2ZSBsb2NrLgorCiAtIFNraXAgZ2V0YWRkcmluZm8gaWYgaG9zdCBpcyBhbHJlYWR5IHJlc29sdmVkLgogICBQYXRjaCBieSBBLiBKZXNzZSBKaXJ5dSBEYXZpcy4KIApAQCAtNjY1LDUzICsxNTI0LDkgQEAKIAogLSBJc3N1ZSAjMjcwNDE6IGFzeW5jaW86IEFkZCBsb29wLmNyZWF0ZV9mdXR1cmUgbWV0aG9kCiAKLS0gSXNzdWUgIzI3MjIzOiBhc3luY2lvOiBGaXggX3JlYWRfcmVhZHkgYW5kIF93cml0ZV9yZWFkeSB0byByZXNwZWN0Ci0gIF9jb25uX2xvc3QuCi0gIFBhdGNoIGJ5IMWBdWthc3ogTGFuZ2EuCi0KLS0gSXNzdWUgIzIyOTcwOiBhc3luY2lvOiBGaXggaW5jb25zaXN0ZW5jeSBjYW5jZWxsaW5nIENvbmRpdGlvbi53YWl0LgotICBQYXRjaCBieSBEYXZpZCBDb2xlcy4KLQogSURMRQogLS0tLQogCi0tIElzc3VlICM1MTI0OiBQYXN0ZSB3aXRoIHRleHQgc2VsZWN0ZWQgbm93IHJlcGxhY2VzIHRoZSBzZWxlY3Rpb24gb24gWDExLgotICBUaGlzIG1hdGNoZXMgaG93IHBhc3RlIHdvcmtzIG9uIFdpbmRvd3MsIE1hYywgbW9zdCBtb2Rlcm4gTGludXggYXBwcywKLSAgYW5kIHR0ayB3aWRnZXRzLiAgT3JpZ2luYWwgcGF0Y2ggYnkgU2VyaGl5IFN0b3JjaGFrYS4KLQotLSBJc3N1ZSAjMjQ3NTk6IE1ha2UgY2xlYXIgaW4gaWRsZWxpYi5pZGxlX3Rlc3QuX19pbml0X18gdGhhdCB0aGUgZGlyZWN0b3J5Ci0gIGlzIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXN0LnRlc3RfaWRsZSBhbmQgdG9vbCBmb3IgbWFpbnRhaW5lcnMuCi0KLS0gSXNzdWUgIzI3MTk2OiBTdG9wICdUaGVtZUNoYW5nZWQnIHdhcm5pbmdzIHdoZW4gcnVubmluZyBJRExFIHRlc3RzLgotICBUaGVzZSBwZXJzaXN0ZWQgYWZ0ZXIgb3RoZXIgd2FybmluZ3Mgd2VyZSBzdXBwcmVzc2VkIGluICMyMDU2Ny4KLSAgQXBwbHkgU2VyaGl5IFN0b3JjaGFrYSdzIHVwZGF0ZV9pZGxldGFza3Mgc29sdXRpb24gdG8gZm91ciB0ZXN0IGZpbGVzLgotICBSZWNvcmQgdGhpcyBhZGRpdGlvbmFsIGFkdmljZSBpbiBpZGxlX3Rlc3QvUkVBRE1FLnR4dAotCi0tIElzc3VlICMyMDU2NzogUmV2aXNlIGlkbGVfdGVzdC9SRUFETUUudHh0IHdpdGggYWR2aWNlIGFib3V0IGF2b2lkaW5nCi0gIHRrIHdhcm5pbmcgbWVzc2FnZXMgZnJvbSB0ZXN0cy4gIEFwcGx5IGFkdmljZSB0byBzZXZlcmFsIElETEUgdGVzdHMuCi0KLS0gSXNzdWUgIzI3MTE3OiBNYWtlIGNvbG9yaXplciBodGVzdCBhbmQgdHVydGxlZGVtbyB3b3JrIHdpdGggZGFyayB0aGVtZXMuCi0gIE1vdmUgY29kZSBmb3IgY29uZmlndXJpbmcgdGV4dCB3aWRnZXQgY29sb3JzIHRvIGEgbmV3IGZ1bmN0aW9uLgotCi0tIElzc3VlICMyNjY3MzogV2hlbiB0ayByZXBvcnRzIGZvbnQgc2l6ZSBhcyAwLCBjaGFuZ2UgdG8gc2l6ZSAxMC4KLSAgU3VjaCBmb250cyBvbiBMaW51eCBwcmV2ZW50ZWQgdGhlIGNvbmZpZ3VyYXRpb24gZGlhbG9nIGZyb20gb3BlbmluZy4KLQotLSBJc3N1ZSAjMjE5Mzk6IEFkZCB0ZXN0IGZvciBJRExFJ3MgcGVyY29sYXRvci4KLSAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgotCi0tIElzc3VlICMyMTY3NjogQWRkIHRlc3QgZm9yIElETEUncyByZXBsYWNlIGRpYWxvZy4KLSAgT3JpZ2luYWwgcGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgotCi0tIElzc3VlICMxODQxMDogQWRkIHRlc3QgZm9yIElETEUncyBzZWFyY2ggZGlhbG9nLgotICBPcmlnaW5hbCBwYXRjaCBieSBXZXN0bGV5IE1hcnTDrW5lei4KLQotLSBJc3N1ZSAjMjE3MDM6IEFkZCB0ZXN0IGZvciBJRExFJ3MgdW5kbyBkZWxlZ2F0b3IuCi0gIE9yaWdpbmFsIHBhdGNoIGJ5IFNhaW1hZGhhdiBIZWJsaWthciAuCi0KLS0gSXNzdWUgIzI3MDQ0OiBBZGQgQ29uZmlnRGlhbG9nLnJlbW92ZV92YXJfY2FsbGJhY2tzIHRvIHN0b3AgbWVtb3J5IGxlYWtzLgotCi0tIElzc3VlICMyMzk3NzogQWRkIG1vcmUgYXNzZXJ0cyB0byB0ZXN0X2RlbGVnYXRvci4KLQogLSBJc3N1ZSAjMjA2NDA6IEFkZCB0ZXN0cyBmb3IgaWRsZWxpYi5jb25maWdIZWxwU291cmNlRWRpdC4KICAgUGF0Y2ggYnkgU2FpbWFkaGF2IEhlYmxpa2FyLgogCkBAIC03MjUsMTEgKzE1NDAsMTAzIEBACiAgIE1BUksgaW4gUkVBRE1FLnR4dCBhbmQgb3BlbiB0aGlzIGFuZCBORVdTLnR4dCB3aXRoICdhc2NpaScuCiAgIFJlLWVuY29kZSBDUkVESVRTLnR4dCB0byB1dGYtOCBhbmQgb3BlbiBpdCB3aXRoICd1dGYtOCcuCiAKKy0gSXNzdWUgIzE1MzQ4OiBTdG9wIHRoZSBkZWJ1Z2dlciBlbmdpbmUgKG5vcm1hbGx5IGluIGEgdXNlciBwcm9jZXNzKQorICBiZWZvcmUgY2xvc2luZyB0aGUgZGVidWdnZXIgd2luZG93IChydW5uaW5nIGluIHRoZSBJRExFIHByb2Nlc3MpLgorICBUaGlzIHByZXZlbnRzIHRoZSBSdW50aW1lRXJyb3JzIHRoYXQgd2VyZSBiZWluZyBjYXVnaHQgYW5kIGlnbm9yZWQuCisKKy0gSXNzdWUgIzI0NDU1OiBQcmV2ZW50IElETEUgZnJvbSBoYW5naW5nIHdoZW4gYSkgY2xvc2luZyB0aGUgc2hlbGwgd2hpbGUgdGhlCisgIGRlYnVnZ2VyIGlzIGFjdGl2ZSAoMTUzNDcpOyBiKSBjbG9zaW5nIHRoZSBkZWJ1Z2dlciB3aXRoIHRoZSBbWF0gYnV0dG9uCisgICgxNTM0OCk7IGFuZCBjKSBhY3RpdmF0aW5nIHRoZSBkZWJ1Z2dlciB3aGVuIGFscmVhZHkgYWN0aXZlICgyNDQ1NSkuCisgIFRoZSBwYXRjaCBieSBNYXJrIFJvc2VtYW4gZG9lcyB0aGlzIGJ5IG1ha2luZyB0d28gY2hhbmdlcy4KKyAgMS4gU3VzcGVuZCBhbmQgcmVzdW1lIHRoZSBndWkuaW50ZXJhY3Rpb24gbWV0aG9kIHdpdGggdGhlIHRjbCB2d2FpdAorICBtZWNoYW5pc20gaW50ZW5kZWQgZm9yIHRoaXMgcHVycG9zZSAoaW5zdGVhZCBvZiByb290Lm1haW5sb29wICYgLnF1aXQpLgorICAyLiBJbiBndWkucnVuLCBhbGxvdyBhbnkgZXhpc3RpbmcgaW50ZXJhY3Rpb24gdG8gdGVybWluYXRlIGZpcnN0LgorCistIENoYW5nZSAnVGhlIHByb2dyYW0nIHRvICdZb3VyIHByb2dyYW0nIGluIGFuIElETEUgJ2tpbGwgcHJvZ3JhbT8nIG1lc3NhZ2UKKyAgdG8gbWFrZSBpdCBjbGVhcmVyIHRoYXQgdGhlIHByb2dyYW0gcmVmZXJyZWQgdG8gaXMgdGhlIGN1cnJlbnRseSBydW5uaW5nCisgIHVzZXIgcHJvZ3JhbSwgbm90IElETEUgaXRzZWxmLgorCistIElzc3VlICMyNDc1MDogSW1wcm92ZSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgSURMRSBlZGl0b3Igd2luZG93IHN0YXR1cyBiYXIuCisgIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjUzMTM6IENoYW5nZSB0aGUgaGFuZGxpbmcgb2YgbmV3IGJ1aWx0LWluIHRleHQgY29sb3IgdGhlbWVzIHRvIGJldHRlcgorICBhZGRyZXNzIHRoZSBjb21wYXRpYmlsaXR5IHByb2JsZW0gaW50cm9kdWNlZCBieSB0aGUgYWRkaXRpb24gb2YgSURMRSBEYXJrLgorICBDb25zaXN0ZW50bHkgdXNlIHRoZSByZXZpc2VkIGlkbGVDb25mLkN1cnJlbnRUaGVtZSBldmVyeXdoZXJlIGluIGlkbGVsaWIuCisKKy0gSXNzdWUgIzI0NzgyOiBFeHRlbnNpb24gY29uZmlndXJhdGlvbiBpcyBub3cgYSB0YWIgaW4gdGhlIElETEUgUHJlZmVyZW5jZXMKKyAgZGlhbG9nIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgZGlhbG9nLiAgVGhlIGZvcm1lciB0YWJzIGFyZSBub3cgYSBzb3J0ZWQKKyAgbGlzdC4gIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjI3MjY6IFJlLWFjdGl2YXRlIHRoZSBjb25maWcgZGlhbG9nIGhlbHAgYnV0dG9uIHdpdGggc29tZSBjb250ZW50CisgIGFib3V0IHRoZSBvdGhlciBidXR0b25zIGFuZCB0aGUgbmV3IElETEUgRGFyayB0aGVtZS4KKworLSBJc3N1ZSAjMjQ4MjA6IElETEUgbm93IGhhcyBhbiAnSURMRSBEYXJrJyBidWlsdC1pbiB0ZXh0IGNvbG9yIHRoZW1lLgorICBJdCBpcyBtb3JlIG9yIGxlc3MgSURMRSBDbGFzc2ljIGludmVydGVkLCB3aXRoIGEgY29iYWx0IGJsdWUgYmFja2dyb3VuZC4KKyAgU3RyaW5ncywgY29tbWVudHMsIGtleXdvcmRzLCAuLi4gYXJlIHN0aWxsIGdyZWVuLCByZWQsIG9yYW5nZSwgLi4uIC4KKyAgVG8gdXNlIGl0IHdpdGggSURMRXMgcmVsZWFzZWQgYmVmb3JlIE5vdmVtYmVyIDIwMTUsIGhpdCB0aGUKKyAgJ1NhdmUgYXMgTmV3IEN1c3RvbSBUaGVtZScgYnV0dG9uIGFuZCBlbnRlciBhIG5ldyBuYW1lLAorICBzdWNoIGFzICdDdXN0b20gRGFyaycuICBUaGUgY3VzdG9tIHRoZW1lIHdpbGwgd29yayB3aXRoIGFueSBJRExFCisgIHJlbGVhc2UsIGFuZCBjYW4gYmUgbW9kaWZpZWQuCisKKy0gSXNzdWUgIzI1MjI0OiBSRUFETUUudHh0IGlzIG5vdyBhbiBpZGxlbGliIGluZGV4IGZvciBJRExFIGRldmVsb3BlcnMgYW5kCisgIGN1cmlvdXMgdXNlcnMuICBUaGUgcHJldmlvdXMgdXNlciBjb250ZW50IGlzIG5vdyBpbiB0aGUgSURMRSBkb2MgY2hhcHRlci4KKyAgJ0lETEUnIG5vdyBtZWFucyAnSW50ZWdyYXRlZCBEZXZlbG9wbWVudCBhbmQgTGVhcm5pbmcgRW52aXJvbm1lbnQnLgorCistIElzc3VlICMyNDgyMDogVXNlcnMgY2FuIG5vdyBzZXQgYnJlYWtwb2ludCBjb2xvcnMgaW4KKyAgU2V0dGluZ3MgLT4gQ3VzdG9tIEhpZ2hsaWdodGluZy4gIE9yaWdpbmFsIHBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjQ5NzI6IEluYWN0aXZlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kIG5vdyBtYXRjaGVzIGFjdGl2ZSBzZWxlY3Rpb24KKyAgYmFja2dyb3VuZCwgYXMgY29uZmlndXJlZCBieSB1c2Vycywgb24gYWxsIHN5c3RlbXMuICBGb3VuZCBpdGVtcyBhcmUgbm93CisgIGFsd2F5cyBoaWdobGlnaHRlZCBvbiBXaW5kb3dzLiAgSW5pdGlhbCBwYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI0NTcwOiBJZGxlOiBtYWtlIGNhbGx0aXAgYW5kIGNvbXBsZXRpb24gYm94ZXMgYXBwZWFyIG9uIE1hY3MKKyAgYWZmZWN0ZWQgYnkgYSB0ayByZWdyZXNzaW9uLiAgSW5pdGlhbCBwYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI0OTg4OiBJZGxlIFNjcm9sbGVkTGlzdCBjb250ZXh0IG1lbnVzICh1c2VkIGluIGRlYnVnZ2VyKQorICBub3cgd29yayBvbiBNYWMgQXF1YS4gIFBhdGNoIGJ5IE1hcmsgUm9zZW1hbi4KKworLSBJc3N1ZSAjMjQ4MDE6IE1ha2UgcmlnaHQtY2xpY2sgZm9yIGNvbnRleHQgbWVudSB3b3JrIG9uIE1hYyBBcXVhLgorICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI1MTczOiBBc3NvY2lhdGUgdGtpbnRlciBtZXNzYWdlYm94ZXMgd2l0aCBhIHNwZWNpZmljIHdpZGdldC4KKyAgRm9yIE1hYyBPU1gsIG1ha2UgdGhlbSBhICdzaGVldCcuICBQYXRjaCBieSBNYXJrIFJvc2VtYW4uCisKKy0gSXNzdWUgIzI1MTk4OiBFbmhhbmNlIHRoZSBpbml0aWFsIGh0bWwgdmlld2VyIG5vdyB1c2VkIGZvciBJZGxlIEhlbHAuCisgICogUHJvcGVybHkgaW5kZW50IGZpeGVkLXBpdGNoIHRleHQgKHBhdGNoIGJ5IE1hcmsgUm9zZW1hbikuCisgICogR2l2ZSBjb2RlIHNuaXBwZXQgYSB2ZXJ5IFNwaGlueC1saWtlIGxpZ2h0IGJsdWVpc2gtZ3JheSBiYWNrZ3JvdW5kLgorICAqIFJlLXVzZSBpbml0aWFsIHdpZHRoIGFuZCBoZWlnaHQgc2V0IGJ5IHVzZXJzIGZvciBzaGVsbCBhbmQgZWRpdG9yLgorICAqIFdoZW4gdGhlIFRhYmxlIG9mIENvbnRlbnRzIChUT0MpIG1lbnUgaXMgdXNlZCwgcHV0IHRoZSBzZWN0aW9uIGhlYWRlcgorICBhdCB0aGUgdG9wIG9mIHRoZSBzY3JlZW4uCisKKy0gSXNzdWUgIzI1MjI1OiBDb25kZW5zZSBhbmQgcmV3cml0ZSBJZGxlIGRvYyBzZWN0aW9uIG9uIHRleHQgY29sb3JzLgorCistIElzc3VlICMyMTk5NTogRXhwbGFpbiBzb21lIGRpZmZlcmVuY2VzIGJldHdlZW4gSURMRSBhbmQgY29uc29sZSBQeXRob24uCisKKy0gSXNzdWUgIzIyODIwOiBFeHBsYWluIG5lZWQgZm9yICpwcmludCogd2hlbiBydW5uaW5nIGZpbGUgZnJvbSBJZGxlIGVkaXRvci4KKworLSBJc3N1ZSAjMjUyMjQ6IERvYzogYXVnbWVudCBJZGxlIGZlYXR1cmUgbGlzdCBhbmQgbm8tc3VicHJvY2VzcyBzZWN0aW9uLgorCistIElzc3VlICMyNTIxOTogVXBkYXRlIGRvYyBmb3IgSWRsZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKyAgU29tZSB3ZXJlIG1pc3NpbmcgYW5kIG5vdGVzIHdlcmUgbm90IGNvcnJlY3QuCisKKy0gSXNzdWUgIzI0ODYxOiBNb3N0IG9mIGlkbGVsaWIgaXMgcHJpdmF0ZSBhbmQgc3ViamVjdCB0byBjaGFuZ2UuCisgIFVzZSBpZGxlaWIuaWRsZS4qIHRvIHN0YXJ0IElkbGUuIFNlZSBpZGxlbGliLl9faW5pdF9fLl9fZG9jX18uCisKKy0gSXNzdWUgIzI1MTk5OiBJZGxlOiBhZGQgc3luY2hyb25pemF0aW9uIGNvbW1lbnRzIGZvciBmdXR1cmUgbWFpbnRhaW5lcnMuCisKKy0gSXNzdWUgIzE2ODkzOiBSZXBsYWNlIGhlbHAudHh0IHdpdGggaGVscC5odG1sIGZvciBJZGxlIGRvYyBkaXNwbGF5LgorICBUaGUgbmV3IGlkbGVsaWIvaGVscC5odG1sIGlzIHJzdHJpcHBlZCBEb2MvYnVpbGQvaHRtbC9saWJyYXJ5L2lkbGUuaHRtbC4KKyAgSXQgbG9va3MgYmV0dGVyIHRoYW4gaGVscC50eHQgYW5kIHdpbGwgYmV0dGVyIGRvY3VtZW50IElkbGUgYXMgcmVsZWFzZWQuCisgIFRoZSB0a2ludGVyIGh0bWwgdmlld2VyIHRoYXQgd29ya3MgZm9yIHRoaXMgZmlsZSB3YXMgd3JpdHRlbiBieSBSb3NlIFJvc2VtYW4uCisgIFRoZSBub3cgdW51c2VkIEVkaXRvcldpbmRvdy5IZWxwRGlhbG9nIGNsYXNzIGFuZCBoZWx0LnR4dCBmaWxlIGFyZSBkZXByZWNhdGVkLgorCistIElzc3VlICMyNDE5OTogRGVwcmVjYXRlIHVudXNlZCBpZGxlbGliLmlkbGV2ZXIgd2l0aCBwb3NzaWJsZSByZW1vdmFsIGluIDMuNi4KKworLSBJc3N1ZSAjMjQ3OTA6IFJlbW92ZSBleHRyYW5lb3VzIGNvZGUgKHdoaWNoIGFsc28gY3JlYXRlIDIgJiAzIGNvbmZsaWN0cykuCisKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotLSBJc3N1ZSAjMjQxMzY6IERvY3VtZW50IHRoZSBuZXcgUEVQIDQ0OCB1bnBhY2tpbmcgc3ludGF4IG9mIDMuNS4KLQogLSBJc3N1ZSAjMjY3MzY6IFVzZWQgSFRUUFMgZm9yIGV4dGVybmFsIGxpbmtzIGluIHRoZSBkb2N1bWVudGF0aW9uIGlmIHBvc3NpYmxlLgogCiAtIElzc3VlICM2OTUzOiBSZXdvcmsgdGhlIFJlYWRsaW5lIG1vZHVsZSBkb2N1bWVudGF0aW9uIHRvIGdyb3VwIHJlbGF0ZWQKQEAgLTczOCw4ICsxNjQ1LDggQEAKIAogLSBJc3N1ZSAjMjM2MDY6IEFkZHMgbm90ZSB0byBjdHlwZXMgZG9jdW1lbnRhdGlvbiByZWdhcmRpbmcgY2RsbC5tc3ZjcnQuCiAKLS0gSXNzdWUgIzI1NTAwOiBGaXggZG9jdW1lbnRhdGlvbiB0byBub3QgY2xhaW0gdGhhdCBfX2ltcG9ydF9fIGlzIHNlYXJjaGVkIGZvcgotICBpbiB0aGUgZ2xvYmFsIHNjb3BlLgorLSBJc3N1ZSAjMjQ5NTI6IENsYXJpZnkgdGhlIGRlZmF1bHQgc2l6ZSBhcmd1bWVudCBvZiBzdGFja19zaXplKCkgaW4KKyAgdGhlICJ0aHJlYWRpbmciIGFuZCAiX3RocmVhZCIgbW9kdWxlcy4gUGF0Y2ggZnJvbSBNYXR0aXAuCiAKIC0gSXNzdWUgIzI2MDE0OiBVcGRhdGUgMy54IHBhY2thZ2luZyBkb2N1bWVudGF0aW9uOgogICAqICJTZWUgYWxzbyIgbGlua3MgdG8gdGhlIG5ldyBkb2NzIGFyZSBub3cgcHJvdmlkZWQgaW4gdGhlIGxlZ2FjeSBwYWdlcwpAQCAtNzUxLDYgKzE2NTgsOSBAQAogLSBJc3N1ZSAjMjE5MTY6IEFkZGVkIHRlc3RzIGZvciB0aGUgdHVydGxlIG1vZHVsZS4gIFBhdGNoIGJ5IGluZ3JpZCwKICAgR3JlZ29yeSBMb3lzZSBhbmQgSmVsbGUgWmlqbHN0cmEuCiAKKy0gSXNzdWUgIzI2Mjk1OiBXaGVuIHVzaW5nICJweXRob24zIC1tIHRlc3QgLS10ZXN0ZGlyPVRFU1RESVIiLCByZWdydGVzdAorICBkb2Vzbid0IGFkZCAidGVzdC4iIHByZWZpeCB0byB0ZXN0IG1vZHVsZSBuYW1lcy4KKwogLSBJc3N1ZSAjMjY1MjM6IFRoZSBtdWx0aXByb2Nlc3NpbmcgdGhyZWFkIHBvb2wgKG11bHRpcHJvY2Vzc2luZy5kdW1teS5Qb29sKQogICB3YXMgdW50ZXN0ZWQuCiAKQEAgLTc1OSwzMSArMTY2OSw1MCBAQAogLSBJc3N1ZSAjMjYzMjU6IEFkZGVkIHRlc3Quc3VwcG9ydC5jaGVja19ub19yZXNvdXJjZV93YXJuaW5nKCkgdG8gY2hlY2sgdGhhdAogICBubyBSZXNvdXJjZVdhcm5pbmcgaXMgZW1pdHRlZC4KIAotLSBJc3N1ZSAjMjU5NDA6IENoYW5nZWQgdGVzdF9zc2wgdG8gdXNlIHNlbGYtc2lnbmVkLnB5dGhvbnRlc3QubmV0LiAgVGhpcworLSBJc3N1ZSAjMjU5NDA6IENoYW5nZWQgdGVzdF9zc2wgdG8gdXNlIGl0cyBpbnRlcm5hbCBsb2NhbCBzZXJ2ZXIgbW9yZS4gIFRoaXMKICAgYXZvaWRzIHJlbHlpbmcgb24gc3ZuLnB5dGhvbi5vcmcsIHdoaWNoIHJlY2VudGx5IGNoYW5nZWQgcm9vdCBjZXJ0aWZpY2F0ZS4KIAogLSBJc3N1ZSAjMjU2MTY6IFRlc3RzIGZvciBPcmRlcmVkRGljdCBhcmUgZXh0cmFjdGVkIGZyb20gdGVzdF9jb2xsZWN0aW9ucwogICBpbnRvIHNlcGFyYXRlIGZpbGUgdGVzdF9vcmRlcmVkX2RpY3QuCiAKKy0gSXNzdWUgIzI1NDQ5OiBBZGRlZCB0ZXN0cyBmb3IgT3JkZXJlZERpY3Qgc3ViY2xhc3Nlcy4KKworLSBJc3N1ZSAjMjUxODg6IEFkZCAtUC8tLXBnbyB0byB0ZXN0LnJlZ3J0ZXN0IHRvIHN1cHByZXNzIGVycm9yIG91dHB1dCB3aGVuCisgIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgZm9yIHRoZSBwdXJwb3NlcyBvZiBhIFBHTyBidWlsZC4gSW5pdGlhbCBwYXRjaCBieQorICBBbGVjc2FuZHJ1IFBhdHJhc2N1LgorCistIElzc3VlICMyMjgwNjogQWRkIGBgcHl0aG9uIC1tIHRlc3QgLS1saXN0LXRlc3RzYGAgY29tbWFuZCB0byBsaXN0IHRlc3RzLgorCistIElzc3VlICMxODE3NDogYGBweXRob24gLW0gdGVzdCAtLWh1bnRybGVha3MgLi4uYGAgbm93IGFsc28gY2hlY2tzIGZvciBsZWFrIG9mCisgIGZpbGUgZGVzY3JpcHRvcnMuIFBhdGNoIHdyaXR0ZW4gYnkgUmljaGFyZCBPdWRrZXJrLgorCistIElzc3VlICMyNTI2MDogRml4IGBgcHl0aG9uIC1tIHRlc3QgLS1jb3ZlcmFnZWBgIG9uIFdpbmRvd3MuIFJlbW92ZSB0aGUKKyAgbGlzdCBvZiBpZ25vcmVkIGRpcmVjdG9yaWVzLgorCistIGBgUENidWlsZFxydC5iYXRgYCBub3cgYWNjZXB0cyBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBwYXNzIGFsb25nCisgIHRvIHJlZ3J0ZXN0LnB5LiAgUHJldmlvdXNseSB0aGVyZSB3YXMgYSBsaW1pdCBvZiA5LgorCiAtIElzc3VlICMyNjU4MzogU2tpcCB0ZXN0X3RpbWVzdGFtcF9vdmVyZmxvdyBpbiB0ZXN0X2ltcG9ydCBpZiBieXRlY29kZQogICBmaWxlcyBjYW5ub3QgYmUgd3JpdHRlbi4KIAogQnVpbGQKIC0tLS0tCiAKKy0gSXNzdWUgIzIxMjc3OiBEb24ndCB0cnkgdG8gbGluayBfY3R5cGVzIHdpdGggYSBmZmlfY29udmVuaWVuY2UgbGlicmFyeS4KKwogLSBJc3N1ZSAjMjY4ODQ6IEZpeCBsaW5raW5nIGV4dGVuc2lvbiBtb2R1bGVzIGZvciBjcm9zcyBidWlsZHMuCiAgIFBhdGNoIGJ5IFhhdmllciBkZSBHYXllLgogCistIElzc3VlICMyNjkzMjogRml4ZWQgc3VwcG9ydCBvZiBSVExEXyogY29uc3RhbnRzIGRlZmluZWQgYXMgZW51bSB2YWx1ZXMsCisgIG5vdCB2aWEgbWFjcm9zIChpbiBwYXJ0aWN1bGFyIG9uIEFuZHJvaWQpLiAgUGF0Y2ggYnkgQ2hpIEhzdWFuIFllbi4KKwogLSBJc3N1ZSAjMjIzNTk6IERpc2FibGUgdGhlIHJ1bGVzIGZvciBydW5uaW5nIF9mcmVlemVfaW1wb3J0bGliIGFuZCBwZ2VuIHdoZW4KICAgY3Jvc3MtY29tcGlsaW5nLiAgVGhlIG91dHB1dCBvZiB0aGVzZSBwcm9ncmFtcyBpcyBub3JtYWxseSBzYXZlZCB3aXRoIHRoZQogICBzb3VyY2UgY29kZSBhbnl3YXksIGFuZCBpcyBzdGlsbCByZWdlbmVyYXRlZCB3aGVuIGRvaW5nIGEgbmF0aXZlIGJ1aWxkLgogICBQYXRjaCBieSBYYXZpZXIgZGUgR2F5ZS4KIAotLSBJc3N1ZSAjMjcyMjk6IEZpeCB0aGUgY3Jvc3MtY29tcGlsaW5nIHBnZW4gcnVsZSBmb3IgaW4tdHJlZSBidWlsZHMuICBQYXRjaAotICBieSBYYXZpZXIgZGUgR2F5ZS4KLQogLSBJc3N1ZSAjMjE2Njg6IExpbmsgYXVkaW9vcCwgX2RhdGV0aW1lLCBfY3R5cGVzX3Rlc3QgbW9kdWxlcyB0byBsaWJtLAotICBleGNlcHQgb24gTWFjIE9TIFguIFBhdGNoIHdyaXR0ZW4gYnkgWGF2aWVyIGRlIEdheWUuCisgIGV4Y2VwdCBvbiBNYWMgT1MgWC4gUGF0Y2ggd3JpdHRlbiBieSBDaGkgSHN1YW4gWWVuLgogCiAtIElzc3VlICMyNTcwMjogQSAtLXdpdGgtbHRvIGNvbmZpZ3VyZSBvcHRpb24gaGFzIGJlZW4gYWRkZWQgdGhhdCB3aWxsCiAgIGVuYWJsZSBsaW5rIHRpbWUgb3B0aW1pemF0aW9ucyBhdCBidWlsZCB0aW1lIGR1cmluZyBhIG1ha2UgcHJvZmlsZS1vcHQuCkBAIC04MDIsMjIgKzE3MzEsMjQgQEAKIAogLSBJc3N1ZSAjMjY0NjU6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyB0byB1c2UgT3BlblNTTCAxLjAuMmcuCiAKLS0gSXNzdWUgIzI0NDIxOiBDb21waWxlIE1vZHVsZXMvX21hdGguYyBvbmNlLCBiZWZvcmUgYnVpbGRpbmcgZXh0ZW5zaW9ucy4KLSAgUHJldmlvdXNseSBpdCBjb3VsZCBmYWlsIHRvIGNvbXBpbGUgcHJvcGVybHkgaWYgdGhlIG1hdGggYW5kIGNtYXRoIGJ1aWxkcwotICB3ZXJlIGNvbmN1cnJlbnQuCi0KIC0gSXNzdWUgIzI1MzQ4OiBBZGRlZCBgYC0tcGdvYGAgYW5kIGBgLS1wZ28tam9iYGAgYXJndW1lbnRzIHRvCiAgIGBgUENidWlsZFxidWlsZC5iYXRgYCBmb3IgYnVpbGRpbmcgd2l0aCBQcm9maWxlLUd1aWRlZCBPcHRpbWl6YXRpb24uICBUaGUKLSAgb2xkIGBgUENidWlsZFxidWlsZF9wZ28uYmF0YGAgc2NyaXB0IGlzIG5vdyBkZXByZWNhdGVkLCBhbmQgc2ltcGx5IGNhbGxzCi0gIGBgUENidWlsZFxidWlsZC5iYXQgLS1wZ28gJSpgYC4KKyAgb2xkIGBgUENidWlsZFxidWlsZF9wZ28uYmF0YGAgc2NyaXB0IGlzIHJlbW92ZWQuCiAKIC0gSXNzdWUgIzI1ODI3OiBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgd2l0aCBJQ0MgdG8gYGBjb25maWd1cmVgYCwgaW5jbHVkaW5nCiAgIGEgbmV3IGBgLS13aXRoLWljY2BgIGZsYWcuCiAKIC0gSXNzdWUgIzI1Njk2OiBGaXggaW5zdGFsbGF0aW9uIG9mIFB5dGhvbiBvbiBVTklYIHdpdGggbWFrZSAtajkuCiAKLS0gSXNzdWUgIzI2OTMwOiBVcGRhdGUgT1MgWCAxMC41KyAzMi1iaXQtb25seSBpbnN0YWxsZXIgdG8gYnVpbGQKLSAgYW5kIGxpbmsgd2l0aCBPcGVuU1NMIDEuMC4yaC4KKy0gSXNzdWUgIzI0OTg2OiBJdCBpcyBub3cgcG9zc2libGUgdG8gYnVpbGQgUHl0aG9uIG9uIFdpbmRvd3Mgd2l0aG91dCBlcnJvcnMKKyAgd2hlbiBleHRlcm5hbCBsaWJyYXJpZXMgYXJlIG5vdCBhdmFpbGFibGUuCisKKy0gSXNzdWUgIzI0NDIxOiBDb21waWxlIE1vZHVsZXMvX21hdGguYyBvbmNlLCBiZWZvcmUgYnVpbGRpbmcgZXh0ZW5zaW9ucy4KKyAgUHJldmlvdXNseSBpdCBjb3VsZCBmYWlsIHRvIGNvbXBpbGUgcHJvcGVybHkgaWYgdGhlIG1hdGggYW5kIGNtYXRoIGJ1aWxkcworICB3ZXJlIGNvbmN1cnJlbnQuCisKKy0gSXNzdWUgIzI2NDY1OiBVcGRhdGUgT1MgWCAxMC41KyAzMi1iaXQtb25seSBpbnN0YWxsZXIgdG8gYnVpbGQKKyAgYW5kIGxpbmsgd2l0aCBPcGVuU1NMIDEuMC4yZy4KIAogLSBJc3N1ZSAjMjYyNjg6IFVwZGF0ZSBXaW5kb3dzIGJ1aWxkcyB0byB1c2UgT3BlblNTTCAxLjAuMmYuCiAKQEAgLTg0NCw2ICsxNzc1LDggQEAKIC0gSXNzdWUgIzI2MDY1OiBFeGNsdWRlcyB2ZW52IGZyb20gbGlicmFyeSB3aGVuIGdlbmVyYXRpbmcgZW1iZWRkYWJsZQogICBkaXN0cm8uCiAKKy0gSXNzdWUgIzI1MDIyOiBSZW1vdmVkIHZlcnkgb3V0ZGF0ZWQgUEMvZXhhbXBsZV9udC8gZGlyZWN0b3J5LgorCiBUb29scy9EZW1vcwogLS0tLS0tLS0tLS0KIApAQCAtODYwLDExICsxNzkzLDIxIEBACiAKIC0gSXNzdWUgIzI2MzE2OiBGaXggdmFyaWFibGUgbmFtZSB0eXBvIGluIEFyZ3VtZW50IENsaW5pYy4KIAotTWlzYwotLS0tLQorLSBJc3N1ZSAjMjU0NDA6IEZpeCBvdXRwdXQgb2YgcHl0aG9uLWNvbmZpZyAtLWV4dGVuc2lvbi1zdWZmaXguCiAKLS0gSXNzdWUgIzE3NTAwLCBhbmQgaHR0cHM6Ly9naXRodWIuY29tL3B5dGhvbi9weXRob25kb3RvcmcvaXNzdWVzLzk0NTogUmVtb3ZlCi0gIHVudXNlZCBhbmQgb3V0ZGF0ZWQgaWNvbnMuCistIElzc3VlICMyNTE1NDogVGhlIHB5dmVudiBzY3JpcHQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YKKyAgYHB5dGhvbjMgLW0gdmVudmAuCisKK0MgQVBJCistLS0tLQorCistIElzc3VlICMyNjMxMjogU3lzdGVtRXJyb3IgaXMgbm93IHJhaXNlZCBpbiBhbGwgcHJvZ3JhbW1pbmcgYnVncyB3aXRoIHVzaW5nCisgIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcygpLiAgUnVudGltZUVycm9yIGRpZCByYWlzZWQgYmVmb3JlIGluIHNvbWUKKyAgcHJvZ3JhbW1pbmcgYnVncy4KKworLSBJc3N1ZSAjMjYxOTg6IFZhbHVlRXJyb3IgaXMgbm93IHJhaXNlZCBpbnN0ZWFkIG9mIFR5cGVFcnJvciBvbiBidWZmZXIKKyAgb3ZlcmZsb3cgaW4gcGFyc2luZyAiZXMjIiBhbmQgImV0IyIgZm9ybWF0IHVuaXRzLiAgU3lzdGVtRXJyb3IgaXMgbm93IHJhaXNlZAorICBpbnN0ZWFkIG9mIFR5cGVFcnJvciBvbiBwcm9ncmFtbWljYWwgZXJyb3IgaW4gcGFyc2luZyBmb3JtYXQgc3RyaW5nLgogCiAKIFdoYXQncyBOZXcgaW4gUHl0aG9uIDMuNS4xIGZpbmFsPwpAQCAtMTI4Niw5ICsyMjI5LDYgQEAKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotLSBJc3N1ZSAjMjI1NTg6IEFkZCByZW1haW5pbmcgZG9jIGxpbmtzIHRvIHNvdXJjZSBjb2RlIGZvciBQeXRob24tY29kZWQgbW9kdWxlcy4KLSAgUGF0Y2ggYnkgWW9uaSBMYXZpLgotCiAtIElzc3VlICMxMjA2NzogUmV3cml0ZSBDb21wYXJpc29ucyBzZWN0aW9uIGluIHRoZSBFeHByZXNzaW9ucyBjaGFwdGVyIG9mIHRoZQogICBsYW5ndWFnZSByZWZlcmVuY2UuIFNvbWUgb2YgdGhlIGRldGFpbHMgb2YgY29tcGFyaW5nIG1peGVkIHR5cGVzIHdlcmUKICAgaW5jb3JyZWN0IG9yIGFtYmlndW91cy4gTm90SW1wbGVtZW50ZWQgaXMgb25seSByZWxldmFudCBhdCBhIGxvd2VyIGxldmVsCkBAIC0xNjE4LDEyICsyNTU4LDYgQEAKIAogLSBJc3N1ZSAjMjQ2MzE6IEZpeGVkIHJlZ3Jlc3Npb24gaW4gdGhlIHRpbWVpdCBtb2R1bGUgd2l0aCBtdWx0aWxpbmUgc2V0dXAuCiAKLS0gSXNzdWUgIzE4NjIyOiB1bml0dGVzdC5tb2NrLm1vY2tfb3BlbigpLnJlc2V0X21vY2sgd291bGQgcmVjdXJzZSBpbmZpbml0ZWx5LgotICBQYXRjaCBmcm9tIE5pY29sYSBQYWx1bWJvIGFuZCBMYXVyZW50IERlIEJ1eXN0LgotCi0tIElzc3VlICMyMzY2MTogdW5pdHRlc3QubW9jayBzaWRlX2VmZmVjdHMgY2FuIG5vdyBiZSBleGNlcHRpb25zIGFnYWluLiBUaGlzCi0gIHdhcyBhIHJlZ3Jlc3Npb24gdnMgUHl0aG9uIDMuNC4gUGF0Y2ggZnJvbSBJZ25hY2lvIFJvc3NpCi0KIC0gSXNzdWUgIzI0NjA4OiBjaHVuay5DaHVuay5yZWFkKCkgbm93IGFsd2F5cyByZXR1cm5zIGJ5dGVzLCBub3Qgc3RyLgogCiAtIElzc3VlICMxODY4NDogRml4ZWQgcmVhZGluZyBvdXQgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgcmUgbW9kdWxlLgpAQCAtMTYzNCw2ICsyNTY4LDkgQEAKIC0gSXNzdWUgIzE1MDE0OiBTTVRQLmF1dGgoKSBhbmQgU01UUC5sb2dpbigpIG5vdyBzdXBwb3J0IFJGQyA0OTU0J3Mgb3B0aW9uYWwKICAgaW5pdGlhbC1yZXNwb25zZSBhcmd1bWVudCB0byB0aGUgU01UUCBBVVRIIGNvbW1hbmQuCiAKKy0gSXNzdWUgIzY1NDk6IFJlbW92ZSBoeXBoZW4gZnJvbSB0dGsuU3R5bGUoKS5lbGVtZW50IG9wdGlvbnMuICBPbmx5IHJldHVybiByZXN1bHQKKyAgZnJvbSB0dGsuU3R5bGUoKS5jb25maWd1cmUgaWYgYSByZXN1bHQgd2FzIGdlbmVyYXRlZCBvciBhIHF1ZXJ5IHN1Ym1pdHRlZC4KKwogLSBJc3N1ZSAjMjQ2Njk6IEZpeCBpbnNwZWN0LmdldHNvdXJjZSgpIGZvciAnYXN5bmMgZGVmJyBmdW5jdGlvbnMuCiAgIFBhdGNoIGJ5IEthaSBHcm9uZXIuCiAKQEAgLTE2NDUsNyArMjU4Miw2IEBACiAtIElzc3VlICMyNDYwMzogVXBkYXRlIFdpbmRvd3MgYnVpbGRzIGFuZCBPUyBYIDEwLjUgaW5zdGFsbGVyIHRvIHVzZSBPcGVuU1NMCiAgIDEuMC4yZC4KIAotCiBXaGF0J3MgTmV3IGluIFB5dGhvbiAzLjUuMCBiZXRhIDM/CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTE4MDYsNiArMjc0Miw5IEBACiAtIElzc3VlICMyNDI2ODogUEVQIDQ4OTogTXVsdGktcGhhc2UgZXh0ZW5zaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbi4KICAgUGF0Y2ggYnkgUGV0ciBWaWt0b3Jpbi4KIAorLSBJc3N1ZSAjMjMzNTk6IE9wdGltaXplIHNldCBvYmplY3QgaW50ZXJuYWxzIGJ5IHNwZWNpYWxpemluZyB0aGUKKyAgaGFzaCB0YWJsZSBzZWFyY2ggaW50byBhIGxvb2t1cCBmdW5jdGlvbiBhbmQgYW4gaW5zZXJ0IGZ1bmN0aW9uLgorCiAtIElzc3VlICMyMzk1NTogQWRkIHB5dmVudi5jZmcgb3B0aW9uIHRvIHN1cHByZXNzIHJlZ2lzdHJ5L2Vudmlyb25tZW50CiAgIGxvb2t1cCBmb3IgZ2VuZXJhdGluZyBzeXMucGF0aCBvbiBXaW5kb3dzLgogCkBAIC0yMzQ4LDggKzMyODcsOCBAQAogICB3cml0ZXIgZmFpbGVkIGluIEJ1ZmZlcmVkUldQYWlyLmNsb3NlKCkuCiAKIC0gSXNzdWUgIzIzNjIyOiBVbmtub3duIGVzY2FwZXMgaW4gcmVndWxhciBleHByZXNzaW9ucyB0aGF0IGNvbnNpc3Qgb2YgYGAnXCdgYAotICBhbmQgQVNDSUkgbGV0dGVyIG5vdyByYWlzZSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgYW5kIHdpbGwgYmUgZm9yYmlkZGVuIGluCi0gIFB5dGhvbiAzLjYuCisgIGFuZCBhbiBBU0NJSSBsZXR0ZXIgbm93IHJhaXNlIGEgZGVwcmVjYXRpb24gd2FybmluZyBhbmQgd2lsbCBiZSBmb3JiaWRkZW4KKyAgaW4gUHl0aG9uIDMuNi4KIAogLSBJc3N1ZSAjMjM2NzE6IHN0cmluZy5UZW1wbGF0ZSBub3cgYWxsb3dzIHNwZWNpZnlpbmcgdGhlICJzZWxmIiBwYXJhbWV0ZXIgYXMKICAgYSBrZXl3b3JkIGFyZ3VtZW50LiAgc3RyaW5nLkZvcm1hdHRlciBub3cgYWxsb3dzIHNwZWNpZnlpbmcgdGhlICJzZWxmIiBhbmQKZGlmZiAtLWdpdCBhL01pc2MvUkVBRE1FLnZhbGdyaW5kIGIvTWlzYy9SRUFETUUudmFsZ3JpbmQKaW5kZXggYjVhOWEzMi4uOTA4ZjEzNyAxMDA2NDQKLS0tIGEvTWlzYy9SRUFETUUudmFsZ3JpbmQKKysrIGIvTWlzYy9SRUFETUUudmFsZ3JpbmQKQEAgLTIsNiArMiw5IEBACiBQeXRob24uICBWYWxncmluZCBpcyB1c2VkIHBlcmlvZGljYWxseSBieSBQeXRob24gZGV2ZWxvcGVycyB0byB0cnkKIHRvIGVuc3VyZSB0aGVyZSBhcmUgbm8gbWVtb3J5IGxlYWtzIG9yIGludmFsaWQgbWVtb3J5IHJlYWRzL3dyaXRlcy4KIAorVVBEQVRFOiBQeXRob24gMy42IG5vdyBzdXBwb3J0cyBQWVRIT05NQUxMT0M9bWFsbG9jIGVudmlyb25tZW50IHZhcmlhYmxlIHdoaWNoCitjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgdXNhZ2Ugb2YgdGhlIG1hbGxvYygpIGFsbG9jYXRvciBvZiB0aGUgQyBsaWJyYXJ5LgorCiBJZiB5b3UgZG9uJ3Qgd2FudCB0byByZWFkIGFib3V0IHRoZSBkZXRhaWxzIG9mIHVzaW5nIFZhbGdyaW5kLCB0aGVyZQogYXJlIHN0aWxsIHR3byB0aGluZ3MgeW91IG11c3QgZG8gdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmdzLiAgRmlyc3QsCiB5b3UgbXVzdCB1c2UgYSBzdXBwcmVzc2lvbnMgZmlsZS4gIE9uZSBpcyBzdXBwbGllZCBpbgpkaWZmIC0tZ2l0IGEvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dCBiL01pc2MvU3BlY2lhbEJ1aWxkcy50eHQKaW5kZXggMzAwNDE3NC4uNGI2NzNmZCAxMDA2NDQKLS0tIGEvTWlzYy9TcGVjaWFsQnVpbGRzLnR4dAorKysgYi9NaXNjL1NwZWNpYWxCdWlsZHMudHh0CkBAIC02NSw5ICs2NSw5IEBACiAgICAgc2ltcGx5IGJ5IHZpcnR1ZSBvZiBiZWluZyBpbiB0aGUgbGlzdC4KIAogZW52dmFyIFBZVEhPTkRVTVBSRUZTCi0gICAgSWYgdGhpcyBlbnZ2YXIgZXhpc3RzLCBQeV9GaW5hbGl6ZSgpIGFycmFuZ2VzIHRvIHByaW50IGEgbGlzdCBvZiBhbGwKKyAgICBJZiB0aGlzIGVudnZhciBleGlzdHMsIFB5X0ZpbmFsaXplRXgoKSBhcnJhbmdlcyB0byBwcmludCBhIGxpc3Qgb2YgYWxsCiAgICAgc3RpbGwtbGl2ZSBoZWFwIG9iamVjdHMuICBUaGlzIGlzIHByaW50ZWQgdHdpY2UsIGluIGRpZmZlcmVudCBmb3JtYXRzLAotICAgIGJlZm9yZSBhbmQgYWZ0ZXIgUHlfRmluYWxpemUgaGFzIGNsZWFuZWQgdXAgZXZlcnl0aGluZyBpdCBjYW4gY2xlYW4gdXAuICBUaGUKKyAgICBiZWZvcmUgYW5kIGFmdGVyIFB5X0ZpbmFsaXplRXggaGFzIGNsZWFuZWQgdXAgZXZlcnl0aGluZyBpdCBjYW4gY2xlYW4gdXAuICBUaGUKICAgICBmaXJzdCBvdXRwdXQgYmxvY2sgcHJvZHVjZXMgdGhlIHJlcHIoKSBvZiBlYWNoIG9iamVjdCBzbyBpcyBtb3JlCiAgICAgaW5mb3JtYXRpdmU7IGhvd2V2ZXIsIGEgbG90IG9mIHN0dWZmIGRlc3RpbmVkIHRvIGRpZSBpcyBzdGlsbCBhbGl2ZSB0aGVuLgogICAgIFRoZSBzZWNvbmQgb3V0cHV0IGJsb2NrIGlzIG11Y2ggaGFyZGVyIHRvIHdvcmsgd2l0aCAocmVwcigpIGNhbid0IGJlIGludm9rZWQKQEAgLTE0NCw3ICsxNDQsNyBAQAogCiBlbnZ2YXIgUFlUSE9OTUFMTE9DU1RBVFMKICAgICBJZiB0aGlzIGVudnZhciBleGlzdHMsIGEgcmVwb3J0IG9mIHB5bWFsbG9jIHN1bW1hcnkgc3RhdGlzdGljcyBpcyBwcmludGVkIHRvCi0gICAgc3RkZXJyIHdoZW5ldmVyIGEgbmV3IGFyZW5hIGlzIGFsbG9jYXRlZCwgYW5kIGFsc28gYnkgUHlfRmluYWxpemUoKS4KKyAgICBzdGRlcnIgd2hlbmV2ZXIgYSBuZXcgYXJlbmEgaXMgYWxsb2NhdGVkLCBhbmQgYWxzbyBieSBQeV9GaW5hbGl6ZUV4KCkuCiAKIENoYW5nZWQgaW4gMi41OiAgVGhlIG51bWJlciBvZiBleHRyYSBieXRlcyBhbGxvY2F0ZWQgaXMgNCpzaXplb2Yoc2l6ZV90KS4KIEJlZm9yZSBpdCB3YXMgMTYgb24gYWxsIGJveGVzLCByZWZsZWN0aW5nIHRoYXQgUHl0aG9uIGNvdWxkbid0IG1ha2UgdXNlIG9mCkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgKi8KICAgICBpbnQgdHBfbWF4YWxsb2M7CiAKLUFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiBjb2RlIGtlZXBzIHRoZXNlIGNvdW50cyB1cCB0byBkYXRlLiAgUHlfRmluYWxpemUoKQorQWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGNvZGUga2VlcHMgdGhlc2UgY291bnRzIHVwIHRvIGRhdGUuICBQeV9GaW5hbGl6ZUV4KCkKIGRpc3BsYXlzIGEgc3VtbWFyeSBvZiB0aGUgaW5mbyByZXR1cm5lZCBieSBzeXMuZ2V0Y291bnRzKCkgKHNlZSBiZWxvdyksIGFsb25nCiB3aXRoIGFzc29ydGVkIG90aGVyIHNwZWNpYWwgYWxsb2NhdGlvbiBjb3VudHMgKGxpa2UgdGhlIG51bWJlciBvZiB0dXBsZQogYWxsb2NhdGlvbnMgc2F0aXNmaWVkIGJ5IGEgdHVwbGUgZnJlZS1saXN0LCB0aGUgbnVtYmVyIG9mIDEtY2hhcmFjdGVyIHN0cmluZ3MKZGlmZiAtLWdpdCBhL01pc2MvY292ZXJpdHlfbW9kZWwuYyBiL01pc2MvY292ZXJpdHlfbW9kZWwuYwppbmRleCA0OTNlN2MxLi5mNzc2ZDc2IDEwMDY0NAotLS0gYS9NaXNjL2NvdmVyaXR5X21vZGVsLmMKKysrIGIvTWlzYy9jb3Zlcml0eV9tb2RlbC5jCkBAIC05NCw3ICs5NCw3IEBACiB9CiAKIC8qIFBhcnNlci9wZ2VubWFpbi5jICovCi1ncmFtbWFyICpnZXRncmFtbWFyKGNoYXIgKmZpbGVuYW1lKQorZ3JhbW1hciAqZ2V0Z3JhbW1hcihjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKICAgICBncmFtbWFyICpnOwogICAgIF9fY292ZXJpdHlfdGFpbnRlZF9kYXRhX3NpbmtfXyhmaWxlbmFtZSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19iaXNlY3Rtb2R1bGUuYyBiL01vZHVsZXMvX2Jpc2VjdG1vZHVsZS5jCmluZGV4IDAyYjU1ZDEuLjIyZGRiZjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2Jpc2VjdG1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2Jpc2VjdG1vZHVsZS5jCkBAIC0xMiw3ICsxMiw4IEBACiBpbnRlcm5hbF9iaXNlY3RfcmlnaHQoUHlPYmplY3QgKmxpc3QsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IGxvLCBQeV9zc2l6ZV90IGhpKQogewogICAgIFB5T2JqZWN0ICpsaXRlbTsKLSAgICBQeV9zc2l6ZV90IG1pZCwgcmVzOworICAgIFB5X3NzaXplX3QgbWlkOworICAgIGludCByZXM7CiAKICAgICBpZiAobG8gPCAwKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibG8gbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKQEAgLTExNSw3ICsxMTYsOCBAQAogaW50ZXJuYWxfYmlzZWN0X2xlZnQoUHlPYmplY3QgKmxpc3QsIFB5T2JqZWN0ICppdGVtLCBQeV9zc2l6ZV90IGxvLCBQeV9zc2l6ZV90IGhpKQogewogICAgIFB5T2JqZWN0ICpsaXRlbTsKLSAgICBQeV9zc2l6ZV90IG1pZCwgcmVzOworICAgIFB5X3NzaXplX3QgbWlkOworICAgIGludCByZXM7CiAKICAgICBpZiAobG8gPCAwKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAibG8gbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2J6Mm1vZHVsZS5jIGIvTW9kdWxlcy9fYnoybW9kdWxlLmMKaW5kZXggZTNlMGViMS4uZjQwNzdmYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fYnoybW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fYnoybW9kdWxlLmMKQEAgLTU5Miw3ICs1OTIsNiBAQAogLypbY2xpbmljIGlucHV0XQogX2J6Mi5CWjJEZWNvbXByZXNzb3IuZGVjb21wcmVzcwogCi0gICAgc2VsZjogc2VsZih0eXBlPSJCWjJEZWNvbXByZXNzb3IgKiIpCiAgICAgZGF0YTogUHlfYnVmZmVyCiAgICAgbWF4X2xlbmd0aDogUHlfc3NpemVfdD0tMQogCkBAIC02MTUsNyArNjE0LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfYnoyX0JaMkRlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoQloyRGVjb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhfbGVuZ3RoKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTIzZTQxMDQ1ZGViMjQwYTMgaW5wdXQ9OTU1OGI0MjRjOGIwMDUxNl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTIzZTQxMDQ1ZGViMjQwYTMgaW5wdXQ9NTJlMWZmYzY2YThlYTYyNF0qLwogewogICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYyBiL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCmluZGV4IDliMTE5NGUuLjRlNzU5OTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvZGVjc21vZHVsZS5jCkBAIC0yMCwxMCArMjAsNiBAQAogICAgICA8ZW5jb2Rpbmc+X2RlY29kZShjaGFyX2J1ZmZlcl9vYmpbLGVycm9ycz0nc3RyaWN0J10pIC0+CiAgICAgICAgIChVbmljb2RlIG9iamVjdCwgYnl0ZXMgY29uc3VtZWQpCiAKLSAgIDxlbmNvZGluZz5fZW5jb2RlKCkgaW50ZXJmYWNlcyBhbHNvIGFjY2VwdCBub24tVW5pY29kZSBvYmplY3QgYXMKLSAgIGlucHV0LiBUaGUgb2JqZWN0cyBhcmUgdGhlbiBjb252ZXJ0ZWQgdG8gVW5pY29kZSB1c2luZwotICAgUHlVbmljb2RlX0Zyb21PYmplY3QoKSBwcmlvciB0byBhcHBseWluZyB0aGUgY29udmVyc2lvbi4KLQogICAgVGhlc2UgPGVuY29kaW5nPnMgYXJlIGF2YWlsYWJsZTogdXRmXzgsIHVuaWNvZGVfZXNjYXBlLAogICAgcmF3X3VuaWNvZGVfZXNjYXBlLCB1bmljb2RlX2ludGVybmFsLCBsYXRpbl8xLCBhc2NpaSAoNy1iaXQpLAogICAgbWJjcyAob24gd2luMzIpLgpAQCAtNzE4LDcgKzcxNCw3IEBACiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzdfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC03MjYsMjQgKzcyMiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzdfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBmZWRhMjFmZmM5MjFiYzggaW5wdXQ9ZmQ5MWE3OGYxMDNiMDQyMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTBmZWRhMjFmZmM5MjFiYzggaW5wdXQ9ZDFhNDc1NzllNzljYmUxNV0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjcoc3RyLCAwLCAwLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEY3KHN0ciwgMCwgMCwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzhfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC03NTEsMTkgKzczOCwxMCBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzhfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTAyYmY0NzMzMmI5Yzc5NmMgaW5wdXQ9MmMyMmQ0MDUzMmYwNzFmM10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTAyYmY0NzMzMmI5Yzc5NmMgaW5wdXQ9NDJlM2JhNzNjNDM5MmVlZl0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKHN0ciwgInV0Zi04IiwgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHN0ciwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qIFRoaXMgdmVyc2lvbiBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGJ5dGVvcmRlciBwYXJhbWV0ZXIgb2YgdGhlCkBAIC03NzUsNyArNzUzLDcgQEAKIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMTZfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICBieXRlb3JkZXI6IGludCA9IDAKICAgICAvCkBAIC03ODQsMjQgKzc2MiwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzE2X2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsIGludCBieXRlb3JkZXIpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzY1NGUxM2VmYTJlNjRlNCBpbnB1dD0zOTM1YTQ4OWIyZDUzODVlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzY1NGUxM2VmYTJlNjRlNCBpbnB1dD1mZjQ2NDE2YjA0ZWRiOTQ0XSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsIGJ5dGVvcmRlciksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCBieXRlb3JkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51dGZfMTZfbGVfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC04MDksMjQgKzc3OCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfdXRmXzE2X2xlX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDMxYjAxZTU1ZjJkNDk5NSBpbnB1dD1iYzI3ZGYwNWQxZDIwZGZlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDMxYjAxZTU1ZjJkNDk5NSBpbnB1dD1jYjM4NTQ1NWVhOGYyZmUwXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsIC0xKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfRW5jb2RlVVRGMTYoc3RyLCBlcnJvcnMsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzE2X2JlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtODM0LDE5ICs3OTQsMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8xNl9iZV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk2ODg2YTZmZDU0ZGNhZTMgaW5wdXQ9NWE2OWQ0MTEyNzYzNDYyYl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk2ODg2YTZmZDU0ZGNhZTMgaW5wdXQ9OTExOTk5NzA2NmJkYWVmZF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCArMSksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjE2KHN0ciwgZXJyb3JzLCArMSksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKiBUaGlzIHZlcnNpb24gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBieXRlb3JkZXIgcGFyYW1ldGVyIG9mIHRoZQpAQCAtODU4LDcgKzgwOSw3IEBACiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzMyX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgYnl0ZW9yZGVyOiBpbnQgPSAwCiAgICAgLwpAQCAtODY3LDI0ICs4MTgsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8zMl9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBpbnQgYnl0ZW9yZGVyKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVjNzYwZGEwYzA5YThiODMgaW5wdXQ9NDM0YTFlZmE0OTJiOGQ1OF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVjNzYwZGEwYzA5YThiODMgaW5wdXQ9YzVlNzdkYTgyZmJlNWMyYV0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCBieXRlb3JkZXIpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgYnl0ZW9yZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MudXRmXzMyX2xlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtODkyLDI0ICs4MzQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3V0Zl8zMl9sZV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI2NWNkMTc2ZGU4ZTM2ZDYgaW5wdXQ9ZGZhMmQ3ZGM3OGI5OTQyMl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWI2NWNkMTc2ZGU4ZTM2ZDYgaW5wdXQ9OTk5M2IyNWZlMDg3Nzg0OF0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCAtMSksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZVVURjMyKHN0ciwgZXJyb3JzLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLnV0Zl8zMl9iZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTkxNywyNCArODUwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191dGZfMzJfYmVfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xZDllNzFhOTM1ODcwOWU5IGlucHV0PTQ1OTU2MTdiMTgxNjkwMDJdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xZDllNzFhOTM1ODcwOWU5IGlucHV0PWQzZTBjY2FhMDI5MjA0MzFdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgKzEpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVVVEYzMihzdHIsIGVycm9ycywgKzEpLAorICAgICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogX2NvZGVjcy51bmljb2RlX2VzY2FwZV9lbmNvZGUKLSAgICBzdHI6IG9iamVjdAorICAgIHN0cjogdW5pY29kZQogICAgIGVycm9yczogc3RyKGFjY2VwdD17c3RyLCBOb25lVHlwZX0pID0gTlVMTAogICAgIC8KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KQEAgLTk0MiwyNCArODY2LDE1IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc191bmljb2RlX2VzY2FwZV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjYyNzFiMzBiYzRmN2EzYyBpbnB1dD04MjczNTA2ZjE0MDc2OTEyXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjYyNzFiMzBiYzRmN2EzYyBpbnB1dD02NWQ5ZWVmY2E2NWI0NTVhXSovCiB7Ci0gICAgUHlPYmplY3QgKnY7Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmIChzdHIgPT0gTlVMTCB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA8IDApIHsKLSAgICAgICAgUHlfWERFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgdiA9IGNvZGVjX3R1cGxlKFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoc3RyKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZQotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtOTY3LDI0ICs4ODIsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX3Jhd191bmljb2RlX2VzY2FwZV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE2NmE4MDZlZDAxYzgzMGEgaW5wdXQ9MTgxNzU1ZDVkZmFjZWYzY10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE2NmE4MDZlZDAxYzgzMGEgaW5wdXQ9NWFhMzNlNGExMzMzOTFhYl0qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nKHN0ciksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nKHN0ciksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmxhdGluXzFfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC05OTIsMjQgKzg5OCwxNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF9jb2RlY3NfbGF0aW5fMV9lbmNvZGVfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYzI4YzgzYTI3ODg0ZTA4IGlucHV0PWYwM2Y2ZGNmMWQ4NGJlZTRdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYzI4YzgzYTI3ODg0ZTA4IGlucHV0PTMwYjExYzllNDlhNjUxNTBdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9Bc0xhdGluMVN0cmluZyhzdHIsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShfUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nKHN0ciwgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KIF9jb2RlY3MuYXNjaWlfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCkBAIC0xMDE3LDI0ICs5MTQsMTUgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX2FzY2lpX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iNWUwMzUxODJkMzNiZWZjIGlucHV0PWQ4N2UyNWExMGE1OTNmZWVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iNWUwMzUxODJkMzNiZWZjIGlucHV0PTg0M2ExZDI2OGU2ZGZhOGVdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nKHN0ciwgZXJyb3JzKSwKLSAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgcmV0dXJuIHY7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKF9QeVVuaWNvZGVfQXNBU0NJSVN0cmluZyhzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmNoYXJtYXBfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICBtYXBwaW5nOiBvYmplY3QgPSBOVUxMCiAgICAgLwpAQCAtMTA0MywyMiArOTMxLDEzIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19jaGFybWFwX2VuY29kZV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5T2JqZWN0ICpzdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLCBQeU9iamVjdCAqbWFwcGluZykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wNDc0NzZmNDg0OTVhOWU5IGlucHV0PTg1ZjQxNzI2NjFlOGRhZDldKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wNDc0NzZmNDg0OTVhOWU5IGlucHV0PTA3NTJjZGUwN2E2ZDZkMDBdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQogICAgIGlmIChtYXBwaW5nID09IFB5X05vbmUpCiAgICAgICAgIG1hcHBpbmcgPSBOVUxMOwogCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShfUHlVbmljb2RlX0VuY29kZUNoYXJtYXAoc3RyLCBtYXBwaW5nLCBlcnJvcnMpLAotICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICByZXR1cm4gdjsKKyAgICByZXR1cm4gY29kZWNfdHVwbGUoX1B5VW5pY29kZV9FbmNvZGVDaGFybWFwKHN0ciwgbWFwcGluZywgZXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CiB9CiAKIC8qW2NsaW5pYyBpbnB1dF0KQEAgLTEwNzgsMzIgKzk1NywyMyBAQAogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLm1iY3NfZW5jb2RlCi0gICAgc3RyOiBvYmplY3QKKyAgICBzdHI6IHVuaWNvZGUKICAgICBlcnJvcnM6IHN0cihhY2NlcHQ9e3N0ciwgTm9uZVR5cGV9KSA9IE5VTEwKICAgICAvCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfY29kZWNzX21iY3NfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnN0ciwgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc2ZTJlMTcwYzk2NmMwODAgaW5wdXQ9NjVjMDllZTFlNDIwMzI2M10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTc2ZTJlMTcwYzk2NmMwODAgaW5wdXQ9ZGU0NzFlMDgxNTk0NzU1M10qLwogewotICAgIFB5T2JqZWN0ICp2OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwgfHwgUHlVbmljb2RlX1JFQURZKHN0cikgPCAwKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoc3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHYgPSBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoQ1BfQUNQLCBzdHIsIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoQ1BfQUNQLCBzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCiBfY29kZWNzLmNvZGVfcGFnZV9lbmNvZGUKICAgICBjb2RlX3BhZ2U6IGludAotICAgIHN0cjogb2JqZWN0CisgICAgc3RyOiB1bmljb2RlCiAgICAgZXJyb3JzOiBzdHIoYWNjZXB0PXtzdHIsIE5vbmVUeXBlfSkgPSBOVUxMCiAgICAgLwogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwpAQCAtMTExMSwyMSArOTgxLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2NvZGVjc19jb2RlX3BhZ2VfZW5jb2RlX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgaW50IGNvZGVfcGFnZSwgUHlPYmplY3QgKnN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00NTY3M2Y2MDg1NjU3YTllIGlucHV0PWM4NTYyZWM0NjBjMmUzMDldKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00NTY3M2Y2MDg1NjU3YTllIGlucHV0PTc4NjQyMWFlNjE3ZDY4MGJdKi8KIHsKLSAgICBQeU9iamVjdCAqdjsKLQotICAgIHN0ciA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cik7Ci0gICAgaWYgKHN0ciA9PSBOVUxMIHx8IFB5VW5pY29kZV9SRUFEWShzdHIpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB2ID0gY29kZWNfdHVwbGUoUHlVbmljb2RlX0VuY29kZUNvZGVQYWdlKGNvZGVfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyksCi0gICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiB2OworICAgIHJldHVybiBjb2RlY190dXBsZShQeVVuaWNvZGVfRW5jb2RlQ29kZVBhZ2UoY29kZV9wYWdlLCBzdHIsIGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOwogfQogCiAjZW5kaWYgLyogSEFWRV9NQkNTICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9fY29sbGVjdGlvbnNtb2R1bGUuYwppbmRleCAxMGZiY2ZlLi4zNDEwZGZlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2xsZWN0aW9uc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsgICAgICAgLyogMCA8PSBsZWZ0aW5kZXggPCBCTE9DS0xFTiAqLwogICAgIFB5X3NzaXplX3QgcmlnaHRpbmRleDsgICAgICAvKiAwIDw9IHJpZ2h0aW5kZXggPCBCTE9DS0xFTiAqLwogICAgIHNpemVfdCBzdGF0ZTsgICAgICAgICAgICAgICAvKiBpbmNyZW1lbnRlZCB3aGVuZXZlciB0aGUgaW5kaWNlcyBtb3ZlICovCi0gICAgUHlfc3NpemVfdCBtYXhsZW47CisgICAgUHlfc3NpemVfdCBtYXhsZW47ICAgICAgICAgIC8qIG1heGxlbiBpcyAtMSBmb3IgdW5ib3VuZGVkIGRlcXVlcyAqLwogICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsKIH0gZGVxdWVvYmplY3Q7CiAKQEAgLTEwOCwyOSArMTA4LDE4IEBACiAjZGVmaW5lIENIRUNLX05PVF9FTkQobGluaykKICNlbmRpZgogCi0vKiBUbyBwcmV2ZW50IGxlbiBmcm9tIG92ZXJmbG93aW5nIFBZX1NTSVpFX1RfTUFYLCB3ZSByZWZ1c2UgdG8KLSAgIGFsbG9jYXRlIG5ldyBibG9ja3MgaWYgdGhlIGN1cnJlbnQgbGVuIGlzIG5lYXJpbmcgb3ZlcmZsb3cuCi0qLwotCi0jZGVmaW5lIE1BWF9ERVFVRV9MRU4gKFBZX1NTSVpFX1RfTUFYIC0gMypCTE9DS0xFTikKLQogLyogQSBzaW1wbGUgZnJlZWxpc3Rpbmcgc2NoZW1lIGlzIHVzZWQgdG8gbWluaW1pemUgY2FsbHMgdG8gdGhlIG1lbW9yeQogICAgYWxsb2NhdG9yLiAgSXQgYWNjb21tb2RhdGVzIGNvbW1vbiB1c2UgY2FzZXMgd2hlcmUgbmV3IGJsb2NrcyBhcmUgYmVpbmcKICAgIGFkZGVkIGF0IGFib3V0IHRoZSBzYW1lIHJhdGUgYXMgb2xkIGJsb2NrcyBhcmUgYmVpbmcgZnJlZWQuCiAgKi8KIAotI2RlZmluZSBNQVhGUkVFQkxPQ0tTIDEwCisjZGVmaW5lIE1BWEZSRUVCTE9DS1MgMTYKIHN0YXRpYyBQeV9zc2l6ZV90IG51bWZyZWVibG9ja3MgPSAwOwogc3RhdGljIGJsb2NrICpmcmVlYmxvY2tzW01BWEZSRUVCTE9DS1NdOwogCiBzdGF0aWMgYmxvY2sgKgotbmV3YmxvY2soUHlfc3NpemVfdCBsZW4pIHsKK25ld2Jsb2NrKHZvaWQpIHsKICAgICBibG9jayAqYjsKLSAgICBpZiAobGVuID49IE1BWF9ERVFVRV9MRU4pIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGFkZCBtb3JlIGJsb2NrcyB0byB0aGUgZGVxdWUiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogICAgIGlmIChudW1mcmVlYmxvY2tzKSB7CiAgICAgICAgIG51bWZyZWVibG9ja3MtLTsKICAgICAgICAgcmV0dXJuIGZyZWVibG9ja3NbbnVtZnJlZWJsb2Nrc107CkBAIC0xNTQsMTIgKzE0Myw2IEBACiAgICAgfQogfQogCi0vKiBYWFggVG9kbzoKLSAgIElmIGFsaWduZWQgbWVtb3J5IGFsbG9jYXRpb25zIGJlY29tZSBhdmFpbGFibGUsIG1ha2UgdGhlCi0gICBkZXF1ZSBvYmplY3QgNjQgYnl0ZSBhbGlnbmVkIHNvIHRoYXQgYWxsIG9mIHRoZSBmaWVsZHMKLSAgIGNhbiBiZSByZXRyaWV2ZWQgb3IgdXBkYXRlZCBpbiBhIHNpbmdsZSBjYWNoZSBsaW5lLgotKi8KLQogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX25ldyhQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTE3MSw3ICsxNTQsNyBAQAogICAgIGlmIChkZXF1ZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGIgPSBuZXdibG9jaygwKTsKKyAgICBiID0gbmV3YmxvY2soKTsKICAgICBpZiAoYiA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihkZXF1ZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjA3LDcgKzE5MCw3IEBACiAgICAgUHlfU0laRShkZXF1ZSktLTsKICAgICBkZXF1ZS0+c3RhdGUrKzsKIAotICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSAtMSkgeworICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA8IDApIHsKICAgICAgICAgaWYgKFB5X1NJWkUoZGVxdWUpKSB7CiAgICAgICAgICAgICBwcmV2YmxvY2sgPSBkZXF1ZS0+cmlnaHRibG9jay0+bGVmdGxpbms7CiAgICAgICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayAhPSBkZXF1ZS0+cmlnaHRibG9jayk7CkBAIC0yNzAsNDIgKzI1MywyNCBAQAogLyogVGhlIGRlcXVlJ3Mgc2l6ZSBsaW1pdCBpcyBkLm1heGxlbi4gIFRoZSBsaW1pdCBjYW4gYmUgemVybyBvciBwb3NpdGl2ZS4KICAqIElmIHRoZXJlIGlzIG5vIGxpbWl0LCB0aGVuIGQubWF4bGVuID09IC0xLgogICoKLSAqIEFmdGVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gYSBkZXF1ZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzaXplIGhhcyBncm93biBwYXN0Ci0gKiB0aGUgbGltaXQuIElmIGl0IGhhcywgd2UgZ2V0IHRoZSBzaXplIGJhY2sgZG93biB0byB0aGUgbGltaXQgYnkgcG9wcGluZyBhbgotICogaXRlbSBvZmYgb2YgdGhlIG9wcG9zaXRlIGVuZC4gIFRoZSBtZXRob2RzIHRoYXQgY2FuIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksCi0gKiBhcHBlbmRsZWZ0KCksIGV4dGVuZCgpLCBhbmQgZXh0ZW5kbGVmdCgpLgorICogQWZ0ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byBhIGRlcXVlLCB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIHNpemUgaGFzCisgKiBncm93biBwYXN0IHRoZSBsaW1pdC4gSWYgaXQgaGFzLCB3ZSBnZXQgdGhlIHNpemUgYmFjayBkb3duIHRvIHRoZSBsaW1pdAorICogYnkgcG9wcGluZyBhbiBpdGVtIG9mZiBvZiB0aGUgb3Bwb3NpdGUgZW5kLiAgVGhlIG1ldGhvZHMgdGhhdCBjYW4KKyAqIHRyaWdnZXIgdGhpcyBhcmUgYXBwZW5kKCksIGFwcGVuZGxlZnQoKSwgZXh0ZW5kKCksIGFuZCBleHRlbmRsZWZ0KCkuCisgKgorICogVGhlIG1hY3JvIHRvIGNoZWNrIHdoZXRoZXIgYSBkZXF1ZSBuZWVkcyB0byBiZSB0cmltbWVkIHVzZXMgYSBzaW5nbGUKKyAqIHVuc2lnbmVkIHRlc3QgdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgMCA8PSBtYXhsZW4gPCBQeV9TSVpFKGRlcXVlKS4KICAqLwogCi1zdGF0aWMgdm9pZAotZGVxdWVfdHJpbV9yaWdodChkZXF1ZW9iamVjdCAqZGVxdWUpCi17Ci0gICAgaWYgKGRlcXVlLT5tYXhsZW4gIT0gLTEgJiYgUHlfU0laRShkZXF1ZSkgPiBkZXF1ZS0+bWF4bGVuKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpydiA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7Ci0gICAgICAgIGFzc2VydChydiAhPSBOVUxMKTsKLSAgICAgICAgYXNzZXJ0KFB5X1NJWkUoZGVxdWUpIDw9IGRlcXVlLT5tYXhsZW4pOwotICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgIH0KLX0KKyNkZWZpbmUgTkVFRFNfVFJJTShkZXF1ZSwgbWF4bGVuKSAoKHNpemVfdCkobWF4bGVuKSA8IChzaXplX3QpKFB5X1NJWkUoZGVxdWUpKSkKIAotc3RhdGljIHZvaWQKLWRlcXVlX3RyaW1fbGVmdChkZXF1ZW9iamVjdCAqZGVxdWUpCitzdGF0aWMgaW50CitkZXF1ZV9hcHBlbmRfaW50ZXJuYWwoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSwgUHlfc3NpemVfdCBtYXhsZW4pCiB7Ci0gICAgaWYgKGRlcXVlLT5tYXhsZW4gIT0gLTEgJiYgUHlfU0laRShkZXF1ZSkgPiBkZXF1ZS0+bWF4bGVuKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpydiA9IGRlcXVlX3BvcGxlZnQoZGVxdWUsIE5VTEwpOwotICAgICAgICBhc3NlcnQocnYgIT0gTlVMTCk7Ci0gICAgICAgIGFzc2VydChQeV9TSVpFKGRlcXVlKSA8PSBkZXF1ZS0+bWF4bGVuKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9hcHBlbmQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSkKLXsKLSAgICBkZXF1ZS0+c3RhdGUrKzsKICAgICBpZiAoZGVxdWUtPnJpZ2h0aW5kZXggPT0gQkxPQ0tMRU4gLSAxKSB7Ci0gICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soUHlfU0laRShkZXF1ZSkpOworICAgICAgICBibG9jayAqYiA9IG5ld2Jsb2NrKCk7CiAgICAgICAgIGlmIChiID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgYi0+bGVmdGxpbmsgPSBkZXF1ZS0+cmlnaHRibG9jazsKICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmspOwogICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKQEAgLTMxMywyNCArMjc4LDM2IEBACiAgICAgICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7CiAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gLTE7CiAgICAgfQotICAgIFB5X0lOQ1JFRihpdGVtKTsKICAgICBQeV9TSVpFKGRlcXVlKSsrOwogICAgIGRlcXVlLT5yaWdodGluZGV4Kys7CiAgICAgZGVxdWUtPnJpZ2h0YmxvY2stPmRhdGFbZGVxdWUtPnJpZ2h0aW5kZXhdID0gaXRlbTsKLSAgICBkZXF1ZV90cmltX2xlZnQoZGVxdWUpOworICAgIGlmIChORUVEU19UUklNKGRlcXVlLCBtYXhsZW4pKSB7CisgICAgICAgIFB5T2JqZWN0ICpvbGRpdGVtID0gZGVxdWVfcG9wbGVmdChkZXF1ZSwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitkZXF1ZV9hcHBlbmQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqaXRlbSkKK3sKKyAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgaWYgKGRlcXVlX2FwcGVuZF9pbnRlcm5hbChkZXF1ZSwgaXRlbSwgZGVxdWUtPm1heGxlbikgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKGFwcGVuZF9kb2MsICJBZGQgYW4gZWxlbWVudCB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgZGVxdWUuIik7CiAKLXN0YXRpYyBQeU9iamVjdCAqCi1kZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCitzdGF0aWMgaW50CitkZXF1ZV9hcHBlbmRsZWZ0X2ludGVybmFsKGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0sIFB5X3NzaXplX3QgbWF4bGVuKQogewotICAgIGRlcXVlLT5zdGF0ZSsrOwogICAgIGlmIChkZXF1ZS0+bGVmdGluZGV4ID09IDApIHsKLSAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7CisgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soKTsKICAgICAgICAgaWYgKGIgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICBiLT5yaWdodGxpbmsgPSBkZXF1ZS0+bGVmdGJsb2NrOwogICAgICAgICBDSEVDS19FTkQoZGVxdWUtPmxlZnRibG9jay0+bGVmdGxpbmspOwogICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5sZWZ0bGluayA9IGI7CkBAIC0zMzgsMzcgKzMxNSw2NSBAQAogICAgICAgICBNQVJLX0VORChiLT5sZWZ0bGluayk7CiAgICAgICAgIGRlcXVlLT5sZWZ0aW5kZXggPSBCTE9DS0xFTjsKICAgICB9Ci0gICAgUHlfSU5DUkVGKGl0ZW0pOwogICAgIFB5X1NJWkUoZGVxdWUpKys7CiAgICAgZGVxdWUtPmxlZnRpbmRleC0tOwogICAgIGRlcXVlLT5sZWZ0YmxvY2stPmRhdGFbZGVxdWUtPmxlZnRpbmRleF0gPSBpdGVtOwotICAgIGRlcXVlX3RyaW1fcmlnaHQoZGVxdWUpOworICAgIGlmIChORUVEU19UUklNKGRlcXVlLCBkZXF1ZS0+bWF4bGVuKSkgeworICAgICAgICBQeU9iamVjdCAqb2xkaXRlbSA9IGRlcXVlX3BvcChkZXF1ZSwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihvbGRpdGVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitkZXF1ZV9hcHBlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZW0pCit7CisgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgIGlmIChkZXF1ZV9hcHBlbmRsZWZ0X2ludGVybmFsKGRlcXVlLCBpdGVtLCBkZXF1ZS0+bWF4bGVuKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBQeURvY19TVFJWQVIoYXBwZW5kbGVmdF9kb2MsICJBZGQgYW4gZWxlbWVudCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBkZXF1ZS4iKTsKIAorc3RhdGljIFB5T2JqZWN0KgorZmluYWxpemVfaXRlcmF0b3IoUHlPYmplY3QgKml0KQoreworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1N0b3BJdGVyYXRpb24pKQorICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgUHlfREVDUkVGKGl0KTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KIAogLyogUnVuIGFuIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24uICBTaG9ydGN1dCBmb3IKICAgIHRoZSBleHRlbmQvZXh0ZW5kbGVmdCBtZXRob2RzIHdoZW4gbWF4bGVuID09IDAuICovCiBzdGF0aWMgUHlPYmplY3QqCiBjb25zdW1lX2l0ZXJhdG9yKFB5T2JqZWN0ICppdCkKIHsKKyAgICBQeU9iamVjdCAqKCppdGVybmV4dCkoUHlPYmplY3QgKik7CiAgICAgUHlPYmplY3QgKml0ZW07CiAKLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CisgICAgd2hpbGUgKChpdGVtID0gaXRlcm5leHQoaXQpKSAhPSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKICAgICB9Ci0gICAgUHlfREVDUkVGKGl0KTsKLSAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgUHlfUkVUVVJOX05PTkU7CisgICAgcmV0dXJuIGZpbmFsaXplX2l0ZXJhdG9yKGl0KTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2V4dGVuZChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICppdGVyYWJsZSkKIHsKICAgICBQeU9iamVjdCAqaXQsICppdGVtOworICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBQeV9zc2l6ZV90IG1heGxlbiA9IGRlcXVlLT5tYXhsZW47CiAKICAgICAvKiBIYW5kbGUgY2FzZSB3aGVyZSBpZChkZXF1ZSkgPT0gaWQoaXRlcmFibGUpICovCiAgICAgaWYgKChQeU9iamVjdCAqKWRlcXVlID09IGl0ZXJhYmxlKSB7CkBAIC0zODEsNiArMzg2LDEzIEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobWF4bGVuID09IDApCisgICAgICAgIHJldHVybiBjb25zdW1lX2l0ZXJhdG9yKGl0KTsKKwogICAgIC8qIFNwYWNlIHNhdmluZyBoZXVyaXN0aWMuICBTdGFydCBmaWxsaW5nIGZyb20gdGhlIGxlZnQgKi8KICAgICBpZiAoUHlfU0laRShkZXF1ZSkgPT0gMCkgewogICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7CkBAIC0zODksNDAgKzQwMSwxNSBAQAogICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IDA7CiAgICAgfQogCi0gICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKGl0ZXJhYmxlKTsKLSAgICBpZiAoaXQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoZGVxdWUtPm1heGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gY29uc3VtZV9pdGVyYXRvcihpdCk7Ci0KLSAgICB3aGlsZSAoKGl0ZW0gPSBQeUl0ZXJfTmV4dChpdCkpICE9IE5VTEwpIHsKLSAgICAgICAgZGVxdWUtPnN0YXRlKys7Ci0gICAgICAgIGlmIChkZXF1ZS0+cmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKLSAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soUHlfU0laRShkZXF1ZSkpOwotICAgICAgICAgICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYi0+bGVmdGxpbmsgPSBkZXF1ZS0+cmlnaHRibG9jazsKLSAgICAgICAgICAgIENIRUNLX0VORChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rKTsKLSAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5yaWdodGxpbmsgPSBiOwotICAgICAgICAgICAgZGVxdWUtPnJpZ2h0YmxvY2sgPSBiOwotICAgICAgICAgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKLSAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4ID0gLTE7CisgICAgaXRlcm5leHQgPSAqUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0OworICAgIHdoaWxlICgoaXRlbSA9IGl0ZXJuZXh0KGl0KSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVxdWVfYXBwZW5kX2ludGVybmFsKGRlcXVlLCBpdGVtLCBtYXhsZW4pIDwgMCkgeworICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIFB5X1NJWkUoZGVxdWUpKys7Ci0gICAgICAgIGRlcXVlLT5yaWdodGluZGV4Kys7Ci0gICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07Ci0gICAgICAgIGRlcXVlX3RyaW1fbGVmdChkZXF1ZSk7CiAgICAgfQotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBmaW5hbGl6ZV9pdGVyYXRvcihpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihleHRlbmRfZG9jLApAQCAtNDMyLDYgKzQxOSw4IEBACiBkZXF1ZV9leHRlbmRsZWZ0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlPYmplY3QgKml0ZXJhYmxlKQogewogICAgIFB5T2JqZWN0ICppdCwgKml0ZW07CisgICAgUHlPYmplY3QgKigqaXRlcm5leHQpKFB5T2JqZWN0ICopOworICAgIFB5X3NzaXplX3QgbWF4bGVuID0gZGVxdWUtPm1heGxlbjsKIAogICAgIC8qIEhhbmRsZSBjYXNlIHdoZXJlIGlkKGRlcXVlKSA9PSBpZChpdGVyYWJsZSkgKi8KICAgICBpZiAoKFB5T2JqZWN0ICopZGVxdWUgPT0gaXRlcmFibGUpIHsKQEAgLTQ0NCw2ICs0MzMsMTMgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOworICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChtYXhsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIGNvbnN1bWVfaXRlcmF0b3IoaXQpOworCiAgICAgLyogU3BhY2Ugc2F2aW5nIGhldXJpc3RpYy4gIFN0YXJ0IGZpbGxpbmcgZnJvbSB0aGUgcmlnaHQgKi8KICAgICBpZiAoUHlfU0laRShkZXF1ZSkgPT0gMCkgewogICAgICAgICBhc3NlcnQoZGVxdWUtPmxlZnRibG9jayA9PSBkZXF1ZS0+cmlnaHRibG9jayk7CkBAIC00NTIsNDAgKzQ0OCwxNSBAQAogICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IEJMT0NLTEVOIC0gMjsKICAgICB9CiAKLSAgICBpdCA9IFB5T2JqZWN0X0dldEl0ZXIoaXRlcmFibGUpOwotICAgIGlmIChpdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IDApCi0gICAgICAgIHJldHVybiBjb25zdW1lX2l0ZXJhdG9yKGl0KTsKLQotICAgIHdoaWxlICgoaXRlbSA9IFB5SXRlcl9OZXh0KGl0KSkgIT0gTlVMTCkgewotICAgICAgICBkZXF1ZS0+c3RhdGUrKzsKLSAgICAgICAgaWYgKGRlcXVlLT5sZWZ0aW5kZXggPT0gMCkgewotICAgICAgICAgICAgYmxvY2sgKmIgPSBuZXdibG9jayhQeV9TSVpFKGRlcXVlKSk7Ci0gICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiLT5yaWdodGxpbmsgPSBkZXF1ZS0+bGVmdGJsb2NrOwotICAgICAgICAgICAgQ0hFQ0tfRU5EKGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rKTsKLSAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2stPmxlZnRsaW5rID0gYjsKLSAgICAgICAgICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBiOwotICAgICAgICAgICAgTUFSS19FTkQoYi0+bGVmdGxpbmspOwotICAgICAgICAgICAgZGVxdWUtPmxlZnRpbmRleCA9IEJMT0NLTEVOOworICAgIGl0ZXJuZXh0ID0gKlB5X1RZUEUoaXQpLT50cF9pdGVybmV4dDsKKyAgICB3aGlsZSAoKGl0ZW0gPSBpdGVybmV4dChpdCkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKGRlcXVlX2FwcGVuZGxlZnRfaW50ZXJuYWwoZGVxdWUsIGl0ZW0sIG1heGxlbikgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgUHlfU0laRShkZXF1ZSkrKzsKLSAgICAgICAgZGVxdWUtPmxlZnRpbmRleC0tOwotICAgICAgICBkZXF1ZS0+bGVmdGJsb2NrLT5kYXRhW2RlcXVlLT5sZWZ0aW5kZXhdID0gaXRlbTsKLSAgICAgICAgZGVxdWVfdHJpbV9yaWdodChkZXF1ZSk7CiAgICAgfQotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihpdCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIFB5X1JFVFVSTl9OT05FOworICAgIHJldHVybiBmaW5hbGl6ZV9pdGVyYXRvcihpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihleHRlbmRsZWZ0X2RvYywKQEAgLTUwNCw3ICs0NzUsNDAgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKLXN0YXRpYyBQeU9iamVjdCAqZGVxdWVfY29weShQeU9iamVjdCAqZGVxdWUpOworc3RhdGljIFB5T2JqZWN0ICoKK2RlcXVlX2NvcHkoUHlPYmplY3QgKmRlcXVlKQoreworICAgIGRlcXVlb2JqZWN0ICpvbGRfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZTsKKyAgICBpZiAoUHlfVFlQRShkZXF1ZSkgPT0gJmRlcXVlX3R5cGUpIHsKKyAgICAgICAgZGVxdWVvYmplY3QgKm5ld19kZXF1ZTsKKyAgICAgICAgUHlPYmplY3QgKnJ2OworCisgICAgICAgIG5ld19kZXF1ZSA9IChkZXF1ZW9iamVjdCAqKWRlcXVlX25ldygmZGVxdWVfdHlwZSwgKFB5T2JqZWN0ICopTlVMTCwgKFB5T2JqZWN0ICopTlVMTCk7CisgICAgICAgIGlmIChuZXdfZGVxdWUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBuZXdfZGVxdWUtPm1heGxlbiA9IG9sZF9kZXF1ZS0+bWF4bGVuOworICAgICAgICAvKiBGYXN0IHBhdGggZm9yIHRoZSBkZXF1ZV9yZXBlYXQoKSBjb21tb24gY2FzZSB3aGVyZSBsZW4oZGVxdWUpID09IDEgKi8KKyAgICAgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gb2xkX2RlcXVlLT5sZWZ0YmxvY2stPmRhdGFbb2xkX2RlcXVlLT5sZWZ0aW5kZXhdOworICAgICAgICAgICAgcnYgPSBkZXF1ZV9hcHBlbmQobmV3X2RlcXVlLCBpdGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ2ID0gZGVxdWVfZXh0ZW5kKG5ld19kZXF1ZSwgZGVxdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChydiAhPSBOVUxMKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKW5ld19kZXF1ZTsKKyAgICAgICAgfQorICAgICAgICBQeV9ERUNSRUYobmV3X2RlcXVlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChvbGRfZGVxdWUtPm1heGxlbiA8IDApCisgICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk8iLCBkZXF1ZSwgTlVMTCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKShQeV9UWVBFKGRlcXVlKSksICJPaSIsCisgICAgICAgICAgICBkZXF1ZSwgb2xkX2RlcXVlLT5tYXhsZW4sIE5VTEwpOworfQorCitQeURvY19TVFJWQVIoY29weV9kb2MsICJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2NvbmNhdChkZXF1ZW9iamVjdCAqZGVxdWUsIFB5T2JqZWN0ICpvdGhlcikKQEAgLTUzNCwzOCArNTM4LDEwMiBAQAogICAgIHJldHVybiBuZXdfZGVxdWU7CiB9CiAKLXN0YXRpYyB2b2lkIGRlcXVlX2NsZWFyKGRlcXVlb2JqZWN0ICpkZXF1ZSk7CitzdGF0aWMgdm9pZAorZGVxdWVfY2xlYXIoZGVxdWVvYmplY3QgKmRlcXVlKQoreworICAgIGJsb2NrICpiOworICAgIGJsb2NrICpwcmV2YmxvY2s7CisgICAgYmxvY2sgKmxlZnRibG9jazsKKyAgICBQeV9zc2l6ZV90IGxlZnRpbmRleDsKKyAgICBQeV9zc2l6ZV90IG4sIG07CisgICAgUHlPYmplY3QgKml0ZW07CisgICAgUHlPYmplY3QgKippdGVtcHRyLCAqKmxpbWl0OworCisgICAgaWYgKFB5X1NJWkUoZGVxdWUpID09IDApCisgICAgICAgIHJldHVybjsKKworICAgIC8qIER1cmluZyB0aGUgcHJvY2VzcyBvZiBjbGVhcmluZyBhIGRlcXVlLCBkZWNyZWZzIGNhbiBjYXVzZSB0aGUKKyAgICAgICBkZXF1ZSB0byBtdXRhdGUuICBUbyBhdm9pZCBmYXRhbCBjb25mdXNpb24sIHdlIGhhdmUgdG8gbWFrZSB0aGUKKyAgICAgICBkZXF1ZSBlbXB0eSBiZWZvcmUgY2xlYXJpbmcgdGhlIGJsb2NrcyBhbmQgbmV2ZXIgcmVmZXIgdG8KKyAgICAgICBhbnl0aGluZyB2aWEgZGVxdWUtPnJlZiB3aGlsZSBjbGVhcmluZy4gIChUaGlzIGlzIHRoZSBzYW1lCisgICAgICAgdGVjaG5pcXVlIHVzZWQgZm9yIGNsZWFyaW5nIGxpc3RzLCBzZXRzLCBhbmQgZGljdHMuKQorCisgICAgICAgTWFraW5nIHRoZSBkZXF1ZSBlbXB0eSByZXF1aXJlcyBhbGxvY2F0aW5nIGEgbmV3IGVtcHR5IGJsb2NrLiAgSW4KKyAgICAgICB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBtZW1vcnkgaXMgZnVsbCwgd2UgZmFsbCBiYWNrIHRvIGFuCisgICAgICAgYWx0ZXJuYXRlIG1ldGhvZCB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhIG5ldyBibG9jay4gIFJlcGVhdGluZworICAgICAgIHBvcHMgaW4gYSB3aGlsZS1sb29wIGlzIHNsb3dlciwgcG9zc2libHkgcmUtZW50cmFudCAoYW5kIGEgY2xldmVyCisgICAgICAgYWR2ZXJzYXJ5IGNvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHRlcm1pbmF0ZSkuCisgICAgKi8KKworICAgIGIgPSBuZXdibG9jaygpOworICAgIGlmIChiID09IE5VTEwpIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgZ290byBhbHRlcm5hdGVfbWV0aG9kOworICAgIH0KKworICAgIC8qIFJlbWVtYmVyIHRoZSBvbGQgc2l6ZSwgbGVmdGJsb2NrLCBhbmQgbGVmdGluZGV4ICovCisgICAgbiA9IFB5X1NJWkUoZGVxdWUpOworICAgIGxlZnRibG9jayA9IGRlcXVlLT5sZWZ0YmxvY2s7CisgICAgbGVmdGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKKworICAgIC8qIFNldCB0aGUgZGVxdWUgdG8gYmUgZW1wdHkgdXNpbmcgdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9jayAqLworICAgIE1BUktfRU5EKGItPmxlZnRsaW5rKTsKKyAgICBNQVJLX0VORChiLT5yaWdodGxpbmspOworICAgIFB5X1NJWkUoZGVxdWUpID0gMDsKKyAgICBkZXF1ZS0+bGVmdGJsb2NrID0gYjsKKyAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7CisgICAgZGVxdWUtPmxlZnRpbmRleCA9IENFTlRFUiArIDE7CisgICAgZGVxdWUtPnJpZ2h0aW5kZXggPSBDRU5URVI7CisgICAgZGVxdWUtPnN0YXRlKys7CisKKyAgICAvKiBOb3cgdGhlIG9sZCBzaXplLCBsZWZ0YmxvY2ssIGFuZCBsZWZ0aW5kZXggYXJlIGRpc2Nvbm5lY3RlZCBmcm9tCisgICAgICAgdGhlIGVtcHR5IGRlcXVlIGFuZCB3ZSBjYW4gdXNlIHRoZW0gdG8gZGVjcmVmIHRoZSBwb2ludGVycy4KKyAgICAqLworICAgIG0gPSAoQkxPQ0tMRU4gLSBsZWZ0aW5kZXggPiBuKSA/IG4gOiBCTE9DS0xFTiAtIGxlZnRpbmRleDsKKyAgICBpdGVtcHRyID0gJmxlZnRibG9jay0+ZGF0YVtsZWZ0aW5kZXhdOworICAgIGxpbWl0ID0gaXRlbXB0ciArIG07CisgICAgbiAtPSBtOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChpdGVtcHRyID09IGxpbWl0KSB7CisgICAgICAgICAgICBpZiAobiA9PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQ0hFQ0tfTk9UX0VORChsZWZ0YmxvY2stPnJpZ2h0bGluayk7CisgICAgICAgICAgICBwcmV2YmxvY2sgPSBsZWZ0YmxvY2s7CisgICAgICAgICAgICBsZWZ0YmxvY2sgPSBsZWZ0YmxvY2stPnJpZ2h0bGluazsKKyAgICAgICAgICAgIG0gPSAobiA+IEJMT0NLTEVOKSA/IEJMT0NLTEVOIDogbjsKKyAgICAgICAgICAgIGl0ZW1wdHIgPSBsZWZ0YmxvY2stPmRhdGE7CisgICAgICAgICAgICBsaW1pdCA9IGl0ZW1wdHIgKyBtOworICAgICAgICAgICAgbiAtPSBtOworICAgICAgICAgICAgZnJlZWJsb2NrKHByZXZibG9jayk7CisgICAgICAgIH0KKyAgICAgICAgaXRlbSA9ICooaXRlbXB0cisrKTsKKyAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgIH0KKyAgICBDSEVDS19FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOworICAgIGZyZWVibG9jayhsZWZ0YmxvY2spOworICAgIHJldHVybjsKKworICBhbHRlcm5hdGVfbWV0aG9kOgorICAgIHdoaWxlIChQeV9TSVpFKGRlcXVlKSkgeworICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKKyAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOworICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CisgICAgfQorfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVxdWVfcmVwZWF0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBuKQorZGVxdWVfY2xlYXJtZXRob2QoZGVxdWVvYmplY3QgKmRlcXVlKQogewotICAgIGRlcXVlb2JqZWN0ICpuZXdfZGVxdWU7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQotICAgIC8qIFhYWCBhZGQgYSBzcGVjaWFsIGNhc2UgZm9yIHdoZW4gbWF4bGVuIGlzIGRlZmluZWQgKi8KLSAgICBpZiAobiA8IDApCi0gICAgICAgIG4gPSAwOwotICAgIGVsc2UgaWYgKG4gPiAwICYmIFB5X1NJWkUoZGVxdWUpID4gTUFYX0RFUVVFX0xFTiAvIG4pCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCi0gICAgbmV3X2RlcXVlID0gKGRlcXVlb2JqZWN0ICopZGVxdWVfbmV3KCZkZXF1ZV90eXBlLCAoUHlPYmplY3QgKilOVUxMLCAoUHlPYmplY3QgKilOVUxMKTsKLSAgICBuZXdfZGVxdWUtPm1heGxlbiA9IGRlcXVlLT5tYXhsZW47Ci0KLSAgICBmb3IgKCA7IG4gOyBuLS0pIHsKLSAgICAgICAgcmVzdWx0ID0gZGVxdWVfZXh0ZW5kKG5ld19kZXF1ZSwgKFB5T2JqZWN0ICopZGVxdWUpOwotICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdfZGVxdWUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiAoUHlPYmplY3QgKiluZXdfZGVxdWU7CisgICAgZGVxdWVfY2xlYXIoZGVxdWUpOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCitQeURvY19TVFJWQVIoY2xlYXJfZG9jLCAiUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBkZXF1ZS4iKTsKKwogc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX2lucGxhY2VfcmVwZWF0KGRlcXVlb2JqZWN0ICpkZXF1ZSwgUHlfc3NpemVfdCBuKQogewotICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKKyAgICBQeV9zc2l6ZV90IGksIG0sIHNpemU7CiAgICAgUHlPYmplY3QgKnNlcTsKICAgICBQeU9iamVjdCAqcnY7CiAKQEAgLTU4MSwyNyArNjQ5LDQ3IEBACiAgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilkZXF1ZTsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA+IE1BWF9ERVFVRV9MRU4gLyBuKSB7Ci0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgIH0KLQogICAgIGlmIChzaXplID09IDEpIHsKICAgICAgICAgLyogY29tbW9uIGNhc2UsIHJlcGVhdGluZyBhIHNpbmdsZSBlbGVtZW50ICovCiAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gZGVxdWUtPmxlZnRibG9jay0+ZGF0YVtkZXF1ZS0+bGVmdGluZGV4XTsKIAotICAgICAgICBpZiAoZGVxdWUtPm1heGxlbiAhPSAtMSAmJiBuID4gZGVxdWUtPm1heGxlbikKKyAgICAgICAgaWYgKGRlcXVlLT5tYXhsZW4gPj0gMCAmJiBuID4gZGVxdWUtPm1heGxlbikKICAgICAgICAgICAgIG4gPSBkZXF1ZS0+bWF4bGVuOwogCi0gICAgICAgIGZvciAoaSA9IDAgOyBpIDwgbi0xIDsgaSsrKSB7Ci0gICAgICAgICAgICBydiA9IGRlcXVlX2FwcGVuZChkZXF1ZSwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAocnYgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIGRlcXVlLT5zdGF0ZSsrOworICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IG4tMSA7ICkgeworICAgICAgICAgICAgaWYgKGRlcXVlLT5yaWdodGluZGV4ID09IEJMT0NLTEVOIC0gMSkgeworICAgICAgICAgICAgICAgIGJsb2NrICpiID0gbmV3YmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X1NJWkUoZGVxdWUpICs9IGk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiLT5sZWZ0bGluayA9IGRlcXVlLT5yaWdodGJsb2NrOworICAgICAgICAgICAgICAgIENIRUNLX0VORChkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rKTsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jay0+cmlnaHRsaW5rID0gYjsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRibG9jayA9IGI7CisgICAgICAgICAgICAgICAgTUFSS19FTkQoYi0+cmlnaHRsaW5rKTsKKyAgICAgICAgICAgICAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbSA9IG4gLSAxIC0gaTsKKyAgICAgICAgICAgIGlmIChtID4gQkxPQ0tMRU4gLSAxIC0gZGVxdWUtPnJpZ2h0aW5kZXgpCisgICAgICAgICAgICAgICAgbSA9IEJMT0NLTEVOIC0gMSAtIGRlcXVlLT5yaWdodGluZGV4OworICAgICAgICAgICAgaSArPSBtOworICAgICAgICAgICAgd2hpbGUgKG0tLSkgeworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGluZGV4Kys7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGRlcXVlLT5yaWdodGJsb2NrLT5kYXRhW2RlcXVlLT5yaWdodGluZGV4XSA9IGl0ZW07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgUHlfU0laRShkZXF1ZSkgKz0gaTsKICAgICAgICAgUHlfSU5DUkVGKGRlcXVlKTsKICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWRlcXVlOwogICAgIH0KIAorICAgIGlmICgoc2l6ZV90KXNpemUgPiBQWV9TU0laRV9UX01BWCAvIChzaXplX3QpbikgeworICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICB9CisKICAgICBzZXEgPSBQeVNlcXVlbmNlX0xpc3QoKFB5T2JqZWN0ICopZGVxdWUpOwogICAgIGlmIChzZXEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIHNlcTsKQEAgLTYxOSw2ICs3MDcsMjAgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopZGVxdWU7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitkZXF1ZV9yZXBlYXQoZGVxdWVvYmplY3QgKmRlcXVlLCBQeV9zc2l6ZV90IG4pCit7CisgICAgZGVxdWVvYmplY3QgKm5ld19kZXF1ZTsKKyAgICBQeU9iamVjdCAqcnY7CisKKyAgICBuZXdfZGVxdWUgPSAoZGVxdWVvYmplY3QgKilkZXF1ZV9jb3B5KChQeU9iamVjdCAqKSBkZXF1ZSk7CisgICAgaWYgKG5ld19kZXF1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBydiA9IGRlcXVlX2lucGxhY2VfcmVwZWF0KG5ld19kZXF1ZSwgbik7CisgICAgUHlfREVDUkVGKG5ld19kZXF1ZSk7CisgICAgcmV0dXJuIHJ2OworfQorCiAvKiBUaGUgcm90YXRlKCkgbWV0aG9kIGlzIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgYW5kIGlzIHVzZWQgaW50ZXJuYWxseQogYXMgYSBwcmltaXRpdmUgZm9yIG90aGVyIG1ldGhvZHMuCiAKQEAgLTY3MSw3ICs3NzMsNyBAQAogICAgIHdoaWxlIChuID4gMCkgewogICAgICAgICBpZiAobGVmdGluZGV4ID09IDApIHsKICAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBiID0gbmV3YmxvY2sobGVuKTsKKyAgICAgICAgICAgICAgICBiID0gbmV3YmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICB9CkBAIC03MDIsNyArODA0LDcgQEAKICAgICAgICAgICAgICAgICAqKGRlc3QrKykgPSAqKHNyYysrKTsKICAgICAgICAgICAgIH0gd2hpbGUgKC0tbSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJpZ2h0aW5kZXggPT0gLTEpIHsKKyAgICAgICAgaWYgKHJpZ2h0aW5kZXggPCAwKSB7CiAgICAgICAgICAgICBhc3NlcnQobGVmdGJsb2NrICE9IHJpZ2h0YmxvY2spOwogICAgICAgICAgICAgYXNzZXJ0KGIgPT0gTlVMTCk7CiAgICAgICAgICAgICBiID0gcmlnaHRibG9jazsKQEAgLTcxNSw3ICs4MTcsNyBAQAogICAgIHdoaWxlIChuIDwgMCkgewogICAgICAgICBpZiAocmlnaHRpbmRleCA9PSBCTE9DS0xFTiAtIDEpIHsKICAgICAgICAgICAgIGlmIChiID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBiID0gbmV3YmxvY2sobGVuKTsKKyAgICAgICAgICAgICAgICBiID0gbmV3YmxvY2soKTsKICAgICAgICAgICAgICAgICBpZiAoYiA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CiAgICAgICAgICAgICB9CkBAIC03OTAsMTEgKzg5MiwxMSBAQAogICAgIGJsb2NrICpyaWdodGJsb2NrID0gZGVxdWUtPnJpZ2h0YmxvY2s7CiAgICAgUHlfc3NpemVfdCBsZWZ0aW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwogICAgIFB5X3NzaXplX3QgcmlnaHRpbmRleCA9IGRlcXVlLT5yaWdodGluZGV4OwotICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoZGVxdWUpIC8gMjsKLSAgICBQeV9zc2l6ZV90IGk7CisgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShkZXF1ZSkgPj4gMTsKICAgICBQeU9iamVjdCAqdG1wOwogCi0gICAgZm9yIChpPTAgOyBpPG4gOyBpKyspIHsKKyAgICBuKys7CisgICAgd2hpbGUgKC0tbikgewogICAgICAgICAvKiBWYWxpZGF0ZSB0aGF0IHBvaW50ZXJzIGhhdmVuJ3QgbWV0IGluIHRoZSBtaWRkbGUgKi8KICAgICAgICAgYXNzZXJ0KGxlZnRibG9jayAhPSByaWdodGJsb2NrIHx8IGxlZnRpbmRleCA8IHJpZ2h0aW5kZXgpOwogICAgICAgICBDSEVDS19OT1RfRU5EKGxlZnRibG9jayk7CkBAIC04MTQsNyArOTE2LDcgQEAKIAogICAgICAgICAvKiBTdGVwIGJhY2t3YXJkcyB3aXRoIHRoZSByaWdodCBibG9jay9pbmRleCBwYWlyICovCiAgICAgICAgIHJpZ2h0aW5kZXgtLTsKLSAgICAgICAgaWYgKHJpZ2h0aW5kZXggPT0gLTEpIHsKKyAgICAgICAgaWYgKHJpZ2h0aW5kZXggPCAwKSB7CiAgICAgICAgICAgICByaWdodGJsb2NrID0gcmlnaHRibG9jay0+bGVmdGxpbms7CiAgICAgICAgICAgICByaWdodGluZGV4ID0gQkxPQ0tMRU4gLSAxOwogICAgICAgICB9CkBAIC04MzEsMjAgKzkzMywxOSBAQAogICAgIGJsb2NrICpiID0gZGVxdWUtPmxlZnRibG9jazsKICAgICBQeV9zc2l6ZV90IGluZGV4ID0gZGVxdWUtPmxlZnRpbmRleDsKICAgICBQeV9zc2l6ZV90IG4gPSBQeV9TSVpFKGRlcXVlKTsKLSAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CiAgICAgc2l6ZV90IHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOwogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIGludCBjbXA7CiAKLSAgICBmb3IgKGk9MCA7IGk8biA7IGkrKykgeworICAgIG4rKzsKKyAgICB3aGlsZSAoLS1uKSB7CiAgICAgICAgIENIRUNLX05PVF9FTkQoYik7CiAgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKICAgICAgICAgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKGl0ZW0sIHYsIFB5X0VRKTsKLSAgICAgICAgaWYgKGNtcCA+IDApCi0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICBlbHNlIGlmIChjbXAgPCAwKQorICAgICAgICBpZiAoY21wIDwgMCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBjb3VudCArPSBjbXA7CiAKICAgICAgICAgaWYgKHN0YXJ0X3N0YXRlICE9IGRlcXVlLT5zdGF0ZSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKQEAgLTg3MSwxMiArOTcyLDEyIEBACiAgICAgYmxvY2sgKmIgPSBkZXF1ZS0+bGVmdGJsb2NrOwogICAgIFB5X3NzaXplX3QgaW5kZXggPSBkZXF1ZS0+bGVmdGluZGV4OwogICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoZGVxdWUpOwotICAgIFB5X3NzaXplX3QgaTsKICAgICBzaXplX3Qgc3RhcnRfc3RhdGUgPSBkZXF1ZS0+c3RhdGU7CiAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgaW50IGNtcDsKIAotICAgIGZvciAoaT0wIDsgaTxuIDsgaSsrKSB7CisgICAgbisrOworICAgIHdoaWxlICgtLW4pIHsKICAgICAgICAgQ0hFQ0tfTk9UX0VORChiKTsKICAgICAgICAgaXRlbSA9IGItPmRhdGFbaW5kZXhdOwogICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOwpAQCAtOTA2LDExICsxMDA3LDEyIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfaW5kZXgoZGVxdWVvYmplY3QgKmRlcXVlLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IGksIHN0YXJ0PTAsIHN0b3A9UHlfU0laRShkZXF1ZSk7CisgICAgUHlfc3NpemVfdCBpLCBuLCBzdGFydD0wLCBzdG9wPVB5X1NJWkUoZGVxdWUpOwogICAgIFB5T2JqZWN0ICp2LCAqaXRlbTsKICAgICBibG9jayAqYiA9IGRlcXVlLT5sZWZ0YmxvY2s7CiAgICAgUHlfc3NpemVfdCBpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7CiAgICAgc2l6ZV90IHN0YXJ0X3N0YXRlID0gZGVxdWUtPnN0YXRlOworICAgIGludCBjbXA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjppbmRleCIsICZ2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwKQEAgLTkyOCwyMiArMTAzMCwzMiBAQAogICAgIH0KICAgICBpZiAoc3RvcCA+IFB5X1NJWkUoZGVxdWUpKQogICAgICAgICBzdG9wID0gUHlfU0laRShkZXF1ZSk7CisgICAgaWYgKHN0YXJ0ID4gc3RvcCkKKyAgICAgICAgc3RhcnQgPSBzdG9wOworICAgIGFzc2VydCgwIDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IHN0b3AgJiYgc3RvcCA8PSBQeV9TSVpFKGRlcXVlKSk7CiAKLSAgICBmb3IgKGk9MCA7IGk8c3RvcCA7IGkrKykgewotICAgICAgICBpZiAoaSA+PSBzdGFydCkgewotICAgICAgICAgICAgaW50IGNtcDsKLSAgICAgICAgICAgIENIRUNLX05PVF9FTkQoYik7Ci0gICAgICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07Ci0gICAgICAgICAgICBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woaXRlbSwgdiwgUHlfRVEpOwotICAgICAgICAgICAgaWYgKGNtcCA+IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBpZiAoc3RhcnRfc3RhdGUgIT0gZGVxdWUtPnN0YXRlKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQorICAgIC8qIFhYWCBSZXBsYWNlIHRoaXMgbG9vcCB3aXRoIGZhc3RlciBjb2RlIGZyb20gZGVxdWVfaXRlbSgpICovCisgICAgZm9yIChpPTAgOyBpPHN0YXJ0IDsgaSsrKSB7CisgICAgICAgIGluZGV4Kys7CisgICAgICAgIGlmIChpbmRleCA9PSBCTE9DS0xFTikgeworICAgICAgICAgICAgYiA9IGItPnJpZ2h0bGluazsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG4gPSBzdG9wIC0gaSArIDE7CisgICAgd2hpbGUgKC0tbikgeworICAgICAgICBDSEVDS19OT1RfRU5EKGIpOworICAgICAgICBpdGVtID0gYi0+ZGF0YVtpbmRleF07CisgICAgICAgIGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2LCBQeV9FUSk7CisgICAgICAgIGlmIChjbXAgPiAwKQorICAgICAgICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChzdG9wIC0gbik7CisgICAgICAgIGlmIChjbXAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChzdGFydF9zdGF0ZSAhPSBkZXF1ZS0+c3RhdGUpIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcXVlIG11dGF0ZWQgZHVyaW5nIGl0ZXJhdGlvbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgaWYgKGluZGV4ID09IEJMT0NLTEVOKSB7CkBAIC0xMDM3LDg0ICsxMTQ5LDEwIEBACiBQeURvY19TVFJWQVIocmVtb3ZlX2RvYywKICJELnJlbW92ZSh2YWx1ZSkgLS0gcmVtb3ZlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdmFsdWUuIik7CiAKLXN0YXRpYyB2b2lkCi1kZXF1ZV9jbGVhcihkZXF1ZW9iamVjdCAqZGVxdWUpCi17Ci0gICAgYmxvY2sgKmI7Ci0gICAgYmxvY2sgKnByZXZibG9jazsKLSAgICBibG9jayAqbGVmdGJsb2NrOwotICAgIFB5X3NzaXplX3QgbGVmdGluZGV4OwotICAgIFB5X3NzaXplX3QgbjsKLSAgICBQeU9iamVjdCAqaXRlbTsKLQotICAgIGlmIChQeV9TSVpFKGRlcXVlKSA9PSAwKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgY2xlYXJpbmcgYSBkZXF1ZSwgZGVjcmVmcyBjYW4gY2F1c2UgdGhlCi0gICAgICAgZGVxdWUgdG8gbXV0YXRlLiAgVG8gYXZvaWQgZmF0YWwgY29uZnVzaW9uLCB3ZSBoYXZlIHRvIG1ha2UgdGhlCi0gICAgICAgZGVxdWUgZW1wdHkgYmVmb3JlIGNsZWFyaW5nIHRoZSBibG9ja3MgYW5kIG5ldmVyIHJlZmVyIHRvCi0gICAgICAgYW55dGhpbmcgdmlhIGRlcXVlLT5yZWYgd2hpbGUgY2xlYXJpbmcuICAoVGhpcyBpcyB0aGUgc2FtZQotICAgICAgIHRlY2huaXF1ZSB1c2VkIGZvciBjbGVhcmluZyBsaXN0cywgc2V0cywgYW5kIGRpY3RzLikKLQotICAgICAgIE1ha2luZyB0aGUgZGVxdWUgZW1wdHkgcmVxdWlyZXMgYWxsb2NhdGluZyBhIG5ldyBlbXB0eSBibG9jay4gIEluCi0gICAgICAgdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgbWVtb3J5IGlzIGZ1bGwsIHdlIGZhbGwgYmFjayB0byBhbgotICAgICAgIGFsdGVybmF0ZSBtZXRob2QgdGhhdCBkb2Vzbid0IHJlcXVpcmUgYSBuZXcgYmxvY2suICBSZXBlYXRpbmcKLSAgICAgICBwb3BzIGluIGEgd2hpbGUtbG9vcCBpcyBzbG93ZXIsIHBvc3NpYmx5IHJlLWVudHJhbnQgKGFuZCBhIGNsZXZlcgotICAgICAgIGFkdmVyc2FyeSBjb3VsZCBjYXVzZSBpdCB0byBuZXZlciB0ZXJtaW5hdGUpLgotICAgICovCi0KLSAgICBiID0gbmV3YmxvY2soMCk7Ci0gICAgaWYgKGIgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBnb3RvIGFsdGVybmF0ZV9tZXRob2Q7Ci0gICAgfQotCi0gICAgLyogUmVtZW1iZXIgdGhlIG9sZCBzaXplLCBsZWZ0YmxvY2ssIGFuZCBsZWZ0aW5kZXggKi8KLSAgICBsZWZ0YmxvY2sgPSBkZXF1ZS0+bGVmdGJsb2NrOwotICAgIGxlZnRpbmRleCA9IGRlcXVlLT5sZWZ0aW5kZXg7Ci0gICAgbiA9IFB5X1NJWkUoZGVxdWUpOwotCi0gICAgLyogU2V0IHRoZSBkZXF1ZSB0byBiZSBlbXB0eSB1c2luZyB0aGUgbmV3bHkgYWxsb2NhdGVkIGJsb2NrICovCi0gICAgTUFSS19FTkQoYi0+bGVmdGxpbmspOwotICAgIE1BUktfRU5EKGItPnJpZ2h0bGluayk7Ci0gICAgUHlfU0laRShkZXF1ZSkgPSAwOwotICAgIGRlcXVlLT5sZWZ0YmxvY2sgPSBiOwotICAgIGRlcXVlLT5yaWdodGJsb2NrID0gYjsKLSAgICBkZXF1ZS0+bGVmdGluZGV4ID0gQ0VOVEVSICsgMTsKLSAgICBkZXF1ZS0+cmlnaHRpbmRleCA9IENFTlRFUjsKLSAgICBkZXF1ZS0+c3RhdGUrKzsKLQotICAgIC8qIE5vdyB0aGUgb2xkIHNpemUsIGxlZnRibG9jaywgYW5kIGxlZnRpbmRleCBhcmUgZGlzY29ubmVjdGVkIGZyb20KLSAgICAgICB0aGUgZW1wdHkgZGVxdWUgYW5kIHdlIGNhbiB1c2UgdGhlbSB0byBkZWNyZWYgdGhlIHBvaW50ZXJzLgotICAgICovCi0gICAgd2hpbGUgKG4tLSkgewotICAgICAgICBpdGVtID0gbGVmdGJsb2NrLT5kYXRhW2xlZnRpbmRleF07Ci0gICAgICAgIFB5X0RFQ1JFRihpdGVtKTsKLSAgICAgICAgbGVmdGluZGV4Kys7Ci0gICAgICAgIGlmIChsZWZ0aW5kZXggPT0gQkxPQ0tMRU4gJiYgbikgewotICAgICAgICAgICAgQ0hFQ0tfTk9UX0VORChsZWZ0YmxvY2stPnJpZ2h0bGluayk7Ci0gICAgICAgICAgICBwcmV2YmxvY2sgPSBsZWZ0YmxvY2s7Ci0gICAgICAgICAgICBsZWZ0YmxvY2sgPSBsZWZ0YmxvY2stPnJpZ2h0bGluazsKLSAgICAgICAgICAgIGxlZnRpbmRleCA9IDA7Ci0gICAgICAgICAgICBmcmVlYmxvY2socHJldmJsb2NrKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBDSEVDS19FTkQobGVmdGJsb2NrLT5yaWdodGxpbmspOwotICAgIGZyZWVibG9jayhsZWZ0YmxvY2spOwotICAgIHJldHVybjsKLQotICBhbHRlcm5hdGVfbWV0aG9kOgotICAgIHdoaWxlIChQeV9TSVpFKGRlcXVlKSkgewotICAgICAgICBpdGVtID0gZGVxdWVfcG9wKGRlcXVlLCBOVUxMKTsKLSAgICAgICAgYXNzZXJ0IChpdGVtICE9IE5VTEwpOwotICAgICAgICBQeV9ERUNSRUYoaXRlbSk7Ci0gICAgfQotfQotCiBzdGF0aWMgaW50CiB2YWxpZF9pbmRleChQeV9zc2l6ZV90IGksIFB5X3NzaXplX3QgbGltaXQpCiB7Ci0gICAgLyogVGhlIGNhc3QgdG8gc2l6ZV90IGxldCB1cyB1c2UganVzdCBhIHNpbmdsZSBjb21wYXJpc29uCisgICAgLyogVGhlIGNhc3QgdG8gc2l6ZV90IGxldHMgdXMgdXNlIGp1c3QgYSBzaW5nbGUgY29tcGFyaXNvbgogICAgICAgIHRvIGNoZWNrIHdoZXRoZXIgaSBpcyBpbiB0aGUgcmFuZ2U6IDAgPD0gaSA8IGxpbWl0ICovCiAgICAgcmV0dXJuIChzaXplX3QpIGkgPCAoc2l6ZV90KSBsaW1pdDsKIH0KQEAgLTExNDMsMTQgKzExODEsMTYgQEAKICAgICAgICAgaSA9IChQeV9zc2l6ZV90KSgoc2l6ZV90KSBpICUgQkxPQ0tMRU4pOwogICAgICAgICBpZiAoaW5kZXggPCAoUHlfU0laRShkZXF1ZSkgPj4gMSkpIHsKICAgICAgICAgICAgIGIgPSBkZXF1ZS0+bGVmdGJsb2NrOwotICAgICAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIHdoaWxlICgtLW4pCiAgICAgICAgICAgICAgICAgYiA9IGItPnJpZ2h0bGluazsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG4gPSAoUHlfc3NpemVfdCkoCiAgICAgICAgICAgICAgICAgICAgICgoc2l6ZV90KShkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgLSAxKSkKICAgICAgICAgICAgICAgICAgICAgLyBCTE9DS0xFTiAtIG4pOwogICAgICAgICAgICAgYiA9IGRlcXVlLT5yaWdodGJsb2NrOwotICAgICAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgIHdoaWxlICgtLW4pCiAgICAgICAgICAgICAgICAgYiA9IGItPmxlZnRsaW5rOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE5NCwxNCArMTIzNCwxNiBAQAogICAgIGkgPSAoUHlfc3NpemVfdCkoKHNpemVfdCkgaSAlIEJMT0NLTEVOKTsKICAgICBpZiAoaW5kZXggPD0gaGFsZmxlbikgewogICAgICAgICBiID0gZGVxdWUtPmxlZnRibG9jazsKLSAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgbisrOworICAgICAgICB3aGlsZSAoLS1uKQogICAgICAgICAgICAgYiA9IGItPnJpZ2h0bGluazsKICAgICB9IGVsc2UgewogICAgICAgICBuID0gKFB5X3NzaXplX3QpKAogICAgICAgICAgICAgICAgICgoc2l6ZV90KShkZXF1ZS0+bGVmdGluZGV4ICsgUHlfU0laRShkZXF1ZSkgLSAxKSkKICAgICAgICAgICAgICAgICAvIEJMT0NLTEVOIC0gbik7CiAgICAgICAgIGIgPSBkZXF1ZS0+cmlnaHRibG9jazsKLSAgICAgICAgd2hpbGUgKG4tLSkKKyAgICAgICAgbisrOworICAgICAgICB3aGlsZSAoLS1uKQogICAgICAgICAgICAgYiA9IGItPmxlZnRsaW5rOwogICAgIH0KICAgICBQeV9JTkNSRUYodik7CkBAIC0xMjExLDE1ICsxMjUzLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIFB5T2JqZWN0ICoKLWRlcXVlX2NsZWFybWV0aG9kKGRlcXVlb2JqZWN0ICpkZXF1ZSkKLXsKLSAgICBkZXF1ZV9jbGVhcihkZXF1ZSk7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLVB5RG9jX1NUUlZBUihjbGVhcl9kb2MsICJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGRlcXVlLiIpOwotCiBzdGF0aWMgdm9pZAogZGVxdWVfZGVhbGxvYyhkZXF1ZW9iamVjdCAqZGVxdWUpCiB7CkBAIC0xMjQzLDYgKzEyNzYsNyBAQAogICAgIFB5T2JqZWN0ICppdGVtOwogICAgIFB5X3NzaXplX3QgaW5kZXg7CiAgICAgUHlfc3NpemVfdCBpbmRleGxvID0gZGVxdWUtPmxlZnRpbmRleDsKKyAgICBQeV9zc2l6ZV90IGluZGV4aGlnaDsKIAogICAgIGZvciAoYiA9IGRlcXVlLT5sZWZ0YmxvY2s7IGIgIT0gZGVxdWUtPnJpZ2h0YmxvY2s7IGIgPSBiLT5yaWdodGxpbmspIHsKICAgICAgICAgZm9yIChpbmRleCA9IGluZGV4bG87IGluZGV4IDwgQkxPQ0tMRU4gOyBpbmRleCsrKSB7CkBAIC0xMjUxLDcgKzEyODUsOCBAQAogICAgICAgICB9CiAgICAgICAgIGluZGV4bG8gPSAwOwogICAgIH0KLSAgICBmb3IgKGluZGV4ID0gaW5kZXhsbzsgaW5kZXggPD0gZGVxdWUtPnJpZ2h0aW5kZXg7IGluZGV4KyspIHsKKyAgICBpbmRleGhpZ2ggPSBkZXF1ZS0+cmlnaHRpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gaW5kZXhsbzsgaW5kZXggPD0gaW5kZXhoaWdoOyBpbmRleCsrKSB7CiAgICAgICAgIGl0ZW0gPSBiLT5kYXRhW2luZGV4XTsKICAgICAgICAgUHlfVklTSVQoaXRlbSk7CiAgICAgfQpAQCAtMTI1OSw0NSArMTI5NCwzMyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZGVxdWVfY29weShQeU9iamVjdCAqZGVxdWUpCi17Ci0gICAgaWYgKCgoZGVxdWVvYmplY3QgKilkZXF1ZSktPm1heGxlbiA9PSAtMSkKLSAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QgKikoUHlfVFlQRShkZXF1ZSkpLCAiTyIsIGRlcXVlLCBOVUxMKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopKFB5X1RZUEUoZGVxdWUpKSwgIk9pIiwKLSAgICAgICAgICAgIGRlcXVlLCAoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4sIE5VTEwpOwotfQotCi1QeURvY19TVFJWQVIoY29weV9kb2MsICJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBkZXF1ZS4iKTsKLQotc3RhdGljIFB5T2JqZWN0ICoKIGRlcXVlX3JlZHVjZShkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0gICAgUHlPYmplY3QgKmRpY3QsICpyZXN1bHQsICphc2xpc3Q7CisgICAgUHlPYmplY3QgKmRpY3QsICppdDsKICAgICBfUHlfSURFTlRJRklFUihfX2RpY3RfXyk7CiAKICAgICBkaWN0ID0gX1B5T2JqZWN0X0dldEF0dHJJZCgoUHlPYmplY3QgKilkZXF1ZSwgJlB5SWRfX19kaWN0X18pOwotICAgIGlmIChkaWN0ID09IE5VTEwpCisgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICBpZiAoIVB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfQXR0cmlidXRlRXJyb3IpKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBQeUVycl9DbGVhcigpOwotICAgIGFzbGlzdCA9IFB5U2VxdWVuY2VfTGlzdCgoUHlPYmplY3QgKilkZXF1ZSk7Ci0gICAgaWYgKGFzbGlzdCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgICAgIGRpY3QgPSBQeV9Ob25lOworICAgICAgICBQeV9JTkNSRUYoZGljdCk7CisgICAgfQorCisgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKChQeU9iamVjdCAqKWRlcXVlKTsKKyAgICBpZiAoaXQgPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYoZGljdCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoZGljdCA9PSBOVUxMKSB7Ci0gICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXN1bHQgPSBQeV9CdWlsZFZhbHVlKCJPKE9uKSIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChkZXF1ZS0+bWF4bGVuID09IC0xKQotICAgICAgICAgICAgcmVzdWx0ID0gUHlfQnVpbGRWYWx1ZSgiTyhPTylPIiwgUHlfVFlQRShkZXF1ZSksIGFzbGlzdCwgUHlfTm9uZSwgZGljdCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5X0J1aWxkVmFsdWUoIk8oT24pTyIsIFB5X1RZUEUoZGVxdWUpLCBhc2xpc3QsIGRlcXVlLT5tYXhsZW4sIGRpY3QpOworCisgICAgaWYgKGRlcXVlLT5tYXhsZW4gPCAwKSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPKClOTiIsIFB5X1RZUEUoZGVxdWUpLCBkaWN0LCBpdCk7CiAgICAgfQotICAgIFB5X1hERUNSRUYoZGljdCk7Ci0gICAgUHlfREVDUkVGKGFzbGlzdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8oKCluKU5OIiwgUHlfVFlQRShkZXF1ZSksIGRlcXVlLT5tYXhsZW4sIGRpY3QsIGl0KTsKKyAgICB9CiB9CiAKIFB5RG9jX1NUUlZBUihyZWR1Y2VfZG9jLCAiUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZy4iKTsKQEAgLTEzMjAsNyArMTM0Myw3IEBACiAgICAgICAgIFB5X1JlcHJMZWF2ZShkZXF1ZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuICE9IC0xKQorICAgIGlmICgoKGRlcXVlb2JqZWN0ICopZGVxdWUpLT5tYXhsZW4gPj0gMCkKICAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoImRlcXVlKCVSLCBtYXhsZW49JXpkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbGlzdCwgKChkZXF1ZW9iamVjdCAqKWRlcXVlKS0+bWF4bGVuKTsKICAgICBlbHNlCkBAIC0xMzgxLDcgKzE0MDQsNyBAQAogICAgICAgICB9CiAgICAgICAgIFB5X0RFQ1JFRih4KTsKICAgICAgICAgUHlfREVDUkVGKHkpOwotICAgICAgICBpZiAoYiA9PSAtMSkKKyAgICAgICAgaWYgKGIgPCAwKQogICAgICAgICAgICAgZ290byBkb25lOwogICAgIH0KICAgICAvKiBXZSByZWFjaGVkIHRoZSBlbmQgb2Ygb25lIGRlcXVlIG9yIGJvdGggKi8KQEAgLTE0MTYsOCArMTQzOSwxNCBAQAogICAgIFB5X3NzaXplX3QgbWF4bGVuID0gLTE7CiAgICAgY2hhciAqa3dsaXN0W10gPSB7Iml0ZXJhYmxlIiwgIm1heGxlbiIsIDB9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkYXJncywgInxPTzpkZXF1ZSIsIGt3bGlzdCwgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChrd2RhcmdzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGVxdWUoKSIsIDAsIDIsICZpdGVyYWJsZSwgJm1heGxlbm9iaikpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkYXJncywgInxPTzpkZXF1ZSIsIGt3bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJml0ZXJhYmxlLCAmbWF4bGVub2JqKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAgICAgaWYgKG1heGxlbm9iaiAhPSBOVUxMICYmIG1heGxlbm9iaiAhPSBQeV9Ob25lKSB7CiAgICAgICAgIG1heGxlbiA9IFB5TG9uZ19Bc1NzaXplX3QobWF4bGVub2JqKTsKICAgICAgICAgaWYgKG1heGxlbiA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQpAQCAtMTQ0Niw3ICsxNDc1LDcgQEAKICAgICBQeV9zc2l6ZV90IGJsb2NrczsKIAogICAgIHJlcyA9IF9QeU9iamVjdF9TSVpFKFB5X1RZUEUoZGVxdWUpKTsKLSAgICBibG9ja3MgPSAoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpICsgQkxPQ0tMRU4gLSAxKSAvIEJMT0NLTEVOOworICAgIGJsb2NrcyA9IChzaXplX3QpKGRlcXVlLT5sZWZ0aW5kZXggKyBQeV9TSVpFKGRlcXVlKSArIEJMT0NLTEVOIC0gMSkgLyBCTE9DS0xFTjsKICAgICBhc3NlcnQoZGVxdWUtPmxlZnRpbmRleCArIFB5X1NJWkUoZGVxdWUpIC0gMSA9PQogICAgICAgICAgICAoYmxvY2tzIC0gMSkgKiBCTE9DS0xFTiArIGRlcXVlLT5yaWdodGluZGV4KTsKICAgICByZXMgKz0gYmxvY2tzICogc2l6ZW9mKGJsb2NrKTsKQEAgLTE0NjUsNyArMTQ5NCw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGVxdWVfZ2V0X21heGxlbihkZXF1ZW9iamVjdCAqZGVxdWUpCiB7Ci0gICAgaWYgKGRlcXVlLT5tYXhsZW4gPT0gLTEpCisgICAgaWYgKGRlcXVlLT5tYXhsZW4gPCAwKQogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICByZXR1cm4gUHlMb25nX0Zyb21Tc2l6ZV90KGRlcXVlLT5tYXhsZW4pOwogfQpAQCAtMTgwNiw3ICsxODM1LDcgQEAKICAgICBpdGVtID0gaXQtPmItPmRhdGFbaXQtPmluZGV4XTsKICAgICBpdC0+aW5kZXgtLTsKICAgICBpdC0+Y291bnRlci0tOwotICAgIGlmIChpdC0+aW5kZXggPT0gLTEgJiYgaXQtPmNvdW50ZXIgPiAwKSB7CisgICAgaWYgKGl0LT5pbmRleCA8IDAgJiYgaXQtPmNvdW50ZXIgPiAwKSB7CiAgICAgICAgIENIRUNLX05PVF9FTkQoaXQtPmItPmxlZnRsaW5rKTsKICAgICAgICAgaXQtPmIgPSBpdC0+Yi0+bGVmdGxpbms7CiAgICAgICAgIGl0LT5pbmRleCA9IEJMT0NLTEVOIC0gMTsKQEAgLTIyMzUsMTMgKzIyNjQsMTMgQEAKIAogICAgICAgICAgICAgb2xkdmFsID0gX1B5RGljdF9HZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIGhhc2gpOwogICAgICAgICAgICAgaWYgKG9sZHZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKF9QeURpY3RfU2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBvbmUsIGhhc2gpID09IC0xKQorICAgICAgICAgICAgICAgIGlmIChfUHlEaWN0X1NldEl0ZW1fS25vd25IYXNoKG1hcHBpbmcsIGtleSwgb25lLCBoYXNoKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbmV3dmFsID0gUHlOdW1iZXJfQWRkKG9sZHZhbCwgb25lKTsKICAgICAgICAgICAgICAgICBpZiAobmV3dmFsID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgICAgICAgICBpZiAoX1B5RGljdF9TZXRJdGVtX0tub3duSGFzaChtYXBwaW5nLCBrZXksIG5ld3ZhbCwgaGFzaCkgPT0gLTEpCisgICAgICAgICAgICAgICAgaWYgKF9QeURpY3RfU2V0SXRlbV9Lbm93bkhhc2gobWFwcGluZywga2V5LCBuZXd2YWwsIGhhc2gpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICAgICAgICAgIFB5X0NMRUFSKG5ld3ZhbCk7CiAgICAgICAgICAgICB9CkBAIC0yMjY3LDcgKzIyOTYsNyBAQAogICAgICAgICAgICAgUHlfREVDUkVGKG9sZHZhbCk7CiAgICAgICAgICAgICBpZiAobmV3dmFsID09IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShtYXBwaW5nLCBrZXksIG5ld3ZhbCkgPT0gLTEpCisgICAgICAgICAgICBpZiAoUHlPYmplY3RfU2V0SXRlbShtYXBwaW5nLCBrZXksIG5ld3ZhbCkgPCAwKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgUHlfQ0xFQVIobmV3dmFsKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3N2LmMgYi9Nb2R1bGVzL19jc3YuYwppbmRleCAxMDFmNDQ5Li40Mjg0NDc3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jc3YuYworKysgYi9Nb2R1bGVzL19jc3YuYwpAQCAtNjAsMTAgKzYwLDEwIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBRdW90ZVN0eWxlIHN0eWxlOwotICAgIGNoYXIgKm5hbWU7CisgICAgY29uc3QgY2hhciAqbmFtZTsKIH0gU3R5bGVEZXNjOwogCi1zdGF0aWMgU3R5bGVEZXNjIHF1b3RlX3N0eWxlc1tdID0geworc3RhdGljIGNvbnN0IFN0eWxlRGVzYyBxdW90ZV9zdHlsZXNbXSA9IHsKICAgICB7IFFVT1RFX01JTklNQUwsICAgICJRVU9URV9NSU5JTUFMIiB9LAogICAgIHsgUVVPVEVfQUxMLCAgICAgICAgIlFVT1RFX0FMTCIgfSwKICAgICB7IFFVT1RFX05PTk5VTUVSSUMsICJRVU9URV9OT05OVU1FUklDIiB9LApAQCAtMjg2LDcgKzI4Niw3IEBACiBzdGF0aWMgaW50CiBkaWFsZWN0X2NoZWNrX3F1b3RpbmcoaW50IHF1b3RpbmcpCiB7Ci0gICAgU3R5bGVEZXNjICpxczsKKyAgICBjb25zdCBTdHlsZURlc2MgKnFzOwogCiAgICAgZm9yIChxcyA9IHF1b3RlX3N0eWxlczsgcXMtPm5hbWU7IHFzKyspIHsKICAgICAgICAgaWYgKChpbnQpcXMtPnN0eWxlID09IHF1b3RpbmcpCkBAIC0xNjMzLDcgKzE2MzMsNyBAQAogUHlJbml0X19jc3Yodm9pZCkKIHsKICAgICBQeU9iamVjdCAqbW9kdWxlOwotICAgIFN0eWxlRGVzYyAqc3R5bGU7CisgICAgY29uc3QgU3R5bGVEZXNjICpzdHlsZTsKIAogICAgIGlmIChQeVR5cGVfUmVhZHkoJkRpYWxlY3RfVHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCmluZGV4IGE3YTgxMDUuLjMzMTM0M2IgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwpAQCAtNDM1LDcgKzQzNSw3IEBACiAgICAgcmV0dXJuIFN0cnVjdFVuaW9uVHlwZV9uZXcodHlwZSwgYXJncywga3dkcywgMCk7CiB9CiAKLXN0YXRpYyBjaGFyIGZyb21fYWRkcmVzc19kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcm9tX2FkZHJlc3NfZG9jW10gPQogIkMuZnJvbV9hZGRyZXNzKGludGVnZXIpIC0+IEMgaW5zdGFuY2VcbmFjY2VzcyBhIEMgaW5zdGFuY2UgYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTQ1Myw3ICs0NTMsNyBAQAogICAgIHJldHVybiBQeUNEYXRhX0F0QWRkcmVzcyh0eXBlLCBidWYpOwogfQogCi1zdGF0aWMgY2hhciBmcm9tX2J1ZmZlcl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcm9tX2J1ZmZlcl9kb2NbXSA9CiAiQy5mcm9tX2J1ZmZlcihvYmplY3QsIG9mZnNldD0wKSAtPiBDIGluc3RhbmNlXG5jcmVhdGUgYSBDIGluc3RhbmNlIGZyb20gYSB3cml0ZWFibGUgYnVmZmVyIjsKIAogc3RhdGljIGludApAQCAtNTI0LDcgKzUyNCw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGNoYXIgZnJvbV9idWZmZXJfY29weV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcm9tX2J1ZmZlcl9jb3B5X2RvY1tdID0KICJDLmZyb21fYnVmZmVyX2NvcHkob2JqZWN0LCBvZmZzZXQ9MCkgLT4gQyBpbnN0YW5jZVxuY3JlYXRlIGEgQyBpbnN0YW5jZSBmcm9tIGEgcmVhZGFibGUgYnVmZmVyIjsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTU2Niw3ICs1NjYsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBjaGFyIGluX2RsbF9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBpbl9kbGxfZG9jW10gPQogIkMuaW5fZGxsKGRsbCwgbmFtZSkgLT4gQyBpbnN0YW5jZVxuYWNjZXNzIGEgQyBpbnN0YW5jZSBpbiBhIGRsbCI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC02MjMsNyArNjIzLDcgQEAKICAgICByZXR1cm4gUHlDRGF0YV9BdEFkZHJlc3ModHlwZSwgYWRkcmVzcyk7CiB9CiAKLXN0YXRpYyBjaGFyIGZyb21fcGFyYW1fZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZnJvbV9wYXJhbV9kb2NbXSA9CiAiQ29udmVydCBhIFB5dGhvbiBvYmplY3QgaW50byBhIGZ1bmN0aW9uIGNhbGwgcGFyYW1ldGVyLiI7CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNDg3LDcgKzE0ODcsNyBAQAogCiAqLwogCi1zdGF0aWMgY2hhciAqU0lNUExFX1RZUEVfQ0hBUlMgPSAiY2JCaEhpSWxMZGZ1elpxUVBYT3Y/ZyI7CitzdGF0aWMgY29uc3QgY2hhciBTSU1QTEVfVFlQRV9DSEFSU1tdID0gImNiQmhIaUlsTGRmdXpacVFQWE92P2ciOwogCiBzdGF0aWMgUHlPYmplY3QgKgogY193Y2hhcl9wX2Zyb21fcGFyYW0oUHlPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKQEAgLTI0MTIsNyArMjQxMiw3IEBACiAgICAgY2hhciAqY3AgPSBzdHJpbmc7CiAgICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CiAKLSAgICBhc3NlcnQoc2l6ZW9mKHN0cmluZykgLSAxID4gc2l6ZW9mKFB5X3NzaXplX3QpICogMik7CisgICAgUHlfQlVJTERfQVNTRVJUKHNpemVvZihzdHJpbmcpIC0gMSA+IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpOwogICAgIGNwICs9IHNwcmludGYoY3AsICIleCIsIFB5X1NBRkVfRE9XTkNBU1QoaW5kZXgsIFB5X3NzaXplX3QsIGludCkpOwogICAgIHdoaWxlICh0YXJnZXQtPmJfYmFzZSkgewogICAgICAgICBieXRlc19sZWZ0ID0gc2l6ZW9mKHN0cmluZykgLSAoY3AgLSBzdHJpbmcpIC0gMTsKQEAgLTMyMDcsNyArMzIwNyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLV9nZXRfbmFtZShQeU9iamVjdCAqb2JqLCBjaGFyICoqcG5hbWUpCitfZ2V0X25hbWUoUHlPYmplY3QgKm9iaiwgY29uc3QgY2hhciAqKnBuYW1lKQogewogI2lmZGVmIE1TX1dJTjMyCiAgICAgaWYgKFB5TG9uZ19DaGVjayhvYmopKSB7CkBAIC0zMjM1LDcgKzMyMzUsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIFB5Q0Z1bmNQdHJfRnJvbURsbChQeVR5cGVPYmplY3QgKnR5cGUsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKLSAgICBjaGFyICpuYW1lOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgaW50ICgqIGFkZHJlc3MpKHZvaWQpOwogICAgIFB5T2JqZWN0ICpmdHVwbGU7CiAgICAgUHlPYmplY3QgKmRsbDsKQEAgLTUxMjUsMjkgKzUxMjUsMjggQEAKIAogI2lmZGVmIE1TX1dJTjMyCiAKLXN0YXRpYyBjaGFyIGNvbWVycm9yX2RvY1tdID0gIlJhaXNlZCB3aGVuIGEgQ09NIG1ldGhvZCBjYWxsIGZhaWxlZC4iOworc3RhdGljIGNvbnN0IGNoYXIgY29tZXJyb3JfZG9jW10gPSAiUmFpc2VkIHdoZW4gYSBDT00gbWV0aG9kIGNhbGwgZmFpbGVkLiI7CiAKIGludAogY29tZXJyb3JfaW5pdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewogICAgIFB5T2JqZWN0ICpocmVzdWx0LCAqdGV4dCwgKmRldGFpbHM7Ci0gICAgUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICpic2VsZjsKICAgICBQeU9iamVjdCAqYTsKICAgICBpbnQgc3RhdHVzOwogCiAgICAgaWYgKCFfUHlBcmdfTm9LZXl3b3JkcyhQeV9UWVBFKHNlbGYpLT50cF9uYW1lLCBrd2RzKSkKLSAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT09POkNPTUVycm9yIiwgJmhyZXN1bHQsICZ0ZXh0LCAmZGV0YWlscykpCiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGEgPSBQeVNlcXVlbmNlX0dldFNsaWNlKGFyZ3MsIDEsIFB5U2VxdWVuY2VfU2l6ZShhcmdzKSk7CiAgICAgaWYgKCFhKQotICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIHN0YXR1cyA9IFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoc2VsZiwgImFyZ3MiLCBhKTsKICAgICBQeV9ERUNSRUYoYSk7CiAgICAgaWYgKHN0YXR1cyA8IDApCi0gICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiaHJlc3VsdCIsIGhyZXN1bHQpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNTE1OCw5ICs1MTU3LDggQEAKICAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZyhzZWxmLCAiZGV0YWlscyIsIGRldGFpbHMpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgYnNlbGYgPSAoUHlCYXNlRXhjZXB0aW9uT2JqZWN0ICopc2VsZjsKICAgICBQeV9JTkNSRUYoYXJncyk7Ci0gICAgUHlfU0VUUkVGKGJzZWxmLT5hcmdzLCBhcmdzKTsKKyAgICBQeV9TRVRSRUYoKChQeUJhc2VFeGNlcHRpb25PYmplY3QgKilzZWxmKS0+YXJncywgYXJncyk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTU0OTAsMTQgKzU0ODgsMTQgQEAKICNlbmRpZgogCiAvKiBJZiBSVExEX0xPQ0FMIGlzIG5vdCBkZWZpbmVkIChXaW5kb3dzISksIHNldCBpdCB0byB6ZXJvLiAqLwotI2lmbmRlZiBSVExEX0xPQ0FMCisjaWYgIUhBVkVfREVDTF9SVExEX0xPQ0FMCiAjZGVmaW5lIFJUTERfTE9DQUwgMAogI2VuZGlmCiAKIC8qIElmIFJUTERfR0xPQkFMIGlzIG5vdCBkZWZpbmVkIChjeWd3aW4pLCBzZXQgaXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMKICAgIFJUTERfTE9DQUwuCiAqLwotI2lmbmRlZiBSVExEX0dMT0JBTAorI2lmICFIQVZFX0RFQ0xfUlRMRF9HTE9CQUwKICNkZWZpbmUgUlRMRF9HTE9CQUwgUlRMRF9MT0NBTAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwppbmRleCA3Y2Q2MTY0Li4wMGU4ZTY2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCkBAIC03Nyw3ICs3Nyw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1QcmludEVycm9yKGNoYXIgKm1zZywgLi4uKQorUHJpbnRFcnJvcihjb25zdCBjaGFyICptc2csIC4uLikKIHsKICAgICBjaGFyIGJ1Zls1MTJdOwogICAgIFB5T2JqZWN0ICpmID0gUHlTeXNfR2V0T2JqZWN0KCJzdGRlcnIiKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKaW5kZXggMzBlM2E5Ni4uYTI3NmZjZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxwcm9jLmMKQEAgLTM4Miw3ICszODIsNyBAQAogICAgICAgICAgICB3aG9zZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgaW4gdGhlIGN1cnJlbnQKICAgICAgICAgICAgbWFjaGluZSBtb2RlLiAqLwogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT1NFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb246IHByaXZpbGVkZ2VkIGluc3RydWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uOiBwcml2aWxlZ2VkIGluc3RydWN0aW9uIik7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBFWENFUFRJT05fTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OOgpAQCAtOTMwLDcgKzkzMCw3IEBACiAgKiBSYWlzZSBhIG5ldyBleGNlcHRpb24gJ2V4Y19jbGFzcycsIGFkZGluZyBhZGRpdGlvbmFsIHRleHQgdG8gdGhlIG9yaWdpbmFsCiAgKiBleGNlcHRpb24gc3RyaW5nLgogICovCi12b2lkIF9jdHlwZXNfZXh0ZW5kX2Vycm9yKFB5T2JqZWN0ICpleGNfY2xhc3MsIGNoYXIgKmZtdCwgLi4uKQordm9pZCBfY3R5cGVzX2V4dGVuZF9lcnJvcihQeU9iamVjdCAqZXhjX2NsYXNzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKICAgICB2YV9saXN0IHZhcmdzOwogICAgIFB5T2JqZWN0ICp0cCwgKnYsICp0YiwgKnMsICpjbHNfc3RyLCAqbXNnX3N0cjsKQEAgLTEyMDMsNyArMTIwMyw3IEBACiAKICNpZmRlZiBNU19XSU4zMgogCi1zdGF0aWMgY2hhciBmb3JtYXRfZXJyb3JfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0X2Vycm9yX2RvY1tdID0KICJGb3JtYXRFcnJvcihbaW50ZWdlcl0pIC0+IHN0cmluZ1xuXAogXG5cCiBDb252ZXJ0IGEgd2luMzIgZXJyb3IgY29kZSBpbnRvIGEgc3RyaW5nLiBJZiB0aGUgZXJyb3IgY29kZSBpcyBub3RcblwKQEAgLTEyMjcsNyArMTIyNyw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIGNoYXIgbG9hZF9saWJyYXJ5X2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGxvYWRfbGlicmFyeV9kb2NbXSA9CiAiTG9hZExpYnJhcnkobmFtZSkgLT4gaGFuZGxlXG5cCiBcblwKIExvYWQgYW4gZXhlY3V0YWJsZSAodXN1YWxseSBhIERMTCksIGFuZCByZXR1cm4gYSBoYW5kbGUgdG8gaXQuXG5cCkBAIC0xMjU2LDcgKzEyNTYsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBjaGFyIGZyZWVfbGlicmFyeV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBmcmVlX2xpYnJhcnlfZG9jW10gPQogIkZyZWVMaWJyYXJ5KGhhbmRsZSkgLT4gdm9pZFxuXAogXG5cCiBGcmVlIHRoZSBoYW5kbGUgb2YgYW4gZXhlY3V0YWJsZSBwcmV2aW91c2x5IGxvYWRlZCBieSBMb2FkTGlicmFyeS5cbiI7CkBAIC0xMjcxLDcgKzEyNzEsNyBAQAogICAgIHJldHVybiBQeV9Ob25lOwogfQogCi1zdGF0aWMgY2hhciBjb3B5X2NvbV9wb2ludGVyX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlfY29tX3BvaW50ZXJfZG9jW10gPQogIkNvcHlDb21Qb2ludGVyKHNyYywgZHN0KSAtPiBIUkVTVUxUIHZhbHVlXG4iOwogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtMTMwOSw3ICsxMzA5LDcgQEAKICAgICBQeU9iamVjdCAqbmFtZSwgKm5hbWUyOwogICAgIGNoYXIgKm5hbWVfc3RyOwogICAgIHZvaWQgKiBoYW5kbGU7Ci0jaWZkZWYgUlRMRF9MT0NBTAorI2lmIEhBVkVfREVDTF9SVExEX0xPQ0FMCiAgICAgaW50IG1vZGUgPSBSVExEX05PVyB8IFJUTERfTE9DQUw7CiAjZWxzZQogICAgIC8qIGN5Z3dpbiBkb2Vzbid0IGRlZmluZSBSVExEX0xPQ0FMICovCkBAIC0xNDQxLDcgKzE0NDEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBmdW5jdGlvbnMKICAqLwotc3RhdGljIGNoYXIgc2l6ZW9mX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIHNpemVvZl9kb2NbXSA9CiAic2l6ZW9mKEMgdHlwZSkgLT4gaW50ZWdlclxuIgogInNpemVvZihDIGluc3RhbmNlKSAtPiBpbnRlZ2VyXG4iCiAiUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgQyBpbnN0YW5jZSI7CkBAIC0xNDYyLDcgKzE0NjIsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgY2hhciBhbGlnbm1lbnRfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgYWxpZ25tZW50X2RvY1tdID0KICJhbGlnbm1lbnQoQyB0eXBlKSAtPiBpbnRlZ2VyXG4iCiAiYWxpZ25tZW50KEMgaW5zdGFuY2UpIC0+IGludGVnZXJcbiIKICJSZXR1cm4gdGhlIGFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgYSBDIGluc3RhbmNlIjsKQEAgLTE0ODUsNyArMTQ4NSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBjaGFyIGJ5cmVmX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGJ5cmVmX2RvY1tdID0KICJieXJlZihDIGluc3RhbmNlWywgb2Zmc2V0PTBdKSAtPiBieXJlZi1vYmplY3RcbiIKICJSZXR1cm4gYSBwb2ludGVyIGxvb2thbGlrZSB0byBhIEMgaW5zdGFuY2UsIG9ubHkgdXNhYmxlXG4iCiAiYXMgZnVuY3Rpb24gYXJndW1lbnQiOwpAQCAtMTUyOSw3ICsxNTI5LDcgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopcGFyZzsKIH0KIAotc3RhdGljIGNoYXIgYWRkcmVzc29mX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGFkZHJlc3NvZl9kb2NbXSA9CiAiYWRkcmVzc29mKEMgaW5zdGFuY2UpIC0+IGludGVnZXJcbiIKICJSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIEMgaW5zdGFuY2UgaW50ZXJuYWwgYnVmZmVyIjsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCmluZGV4IDBkM2Y3MjQuLmIwNmJhOGEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKQEAgLTMyNyw3ICszMjcsNyBAQAogUHlDRGF0YV9zZXQoUHlPYmplY3QgKmRzdCwgUHlPYmplY3QgKnR5cGUsIFNFVEZVTkMgc2V0ZnVuYywgUHlPYmplY3QgKnZhbHVlLAogICAgICAgICAgIFB5X3NzaXplX3QgaW5kZXgsIFB5X3NzaXplX3Qgc2l6ZSwgY2hhciAqcHRyKTsKIAotZXh0ZXJuIHZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIHZvaWQgX2N0eXBlc19leHRlbmRfZXJyb3IoUHlPYmplY3QgKmV4Y19jbGFzcywgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiBzdHJ1Y3QgYmFzZXNwZWMgewogICAgIENEYXRhT2JqZWN0ICpiYXNlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3Vyc2VzX3BhbmVsLmMgYi9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYwppbmRleCAyMjhmNDk3Li4xOGVmMzM1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYworKysgYi9Nb2R1bGVzL19jdXJzZXNfcGFuZWwuYwpAQCAtNiw3ICs2LDcgQEAKIAogLyogUmVsZWFzZSBOdW1iZXIgKi8KIAotc3RhdGljIGNoYXIgKlB5Q3Vyc2VzVmVyc2lvbiA9ICIyLjEiOworc3RhdGljIGNvbnN0IGNoYXIgUHlDdXJzZXNWZXJzaW9uW10gPSAiMi4xIjsKIAogLyogSW5jbHVkZXMgKi8KIApAQCAtNTYsNyArNTYsNyBAQAogICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1QeUN1cnNlc0NoZWNrRVJSKGludCBjb2RlLCBjaGFyICpmbmFtZSkKK1B5Q3Vyc2VzQ2hlY2tFUlIoaW50IGNvZGUsIGNvbnN0IGNoYXIgKmZuYW1lKQogewogICAgIGlmIChjb2RlICE9IEVSUikgewogICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jIGIvTW9kdWxlcy9fZGF0ZXRpbWVtb2R1bGUuYwppbmRleCBmNDE5Y2IyLi42MWI2NmE2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kYXRldGltZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2RhdGV0aW1lbW9kdWxlLmMKQEAgLTE4NCwxMiArMTg0LDEyIEBACiAgKiBhbmQgdGhlIG51bWJlciBvZiBkYXlzIGJlZm9yZSB0aGF0IG1vbnRoIGluIHRoZSBzYW1lIHllYXIuICBUaGVzZQogICogYXJlIGNvcnJlY3QgZm9yIG5vbi1sZWFwIHllYXJzIG9ubHkuCiAgKi8KLXN0YXRpYyBpbnQgX2RheXNfaW5fbW9udGhbXSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgX2RheXNfaW5fbW9udGhbXSA9IHsKICAgICAwLCAvKiB1bnVzZWQ7IHRoaXMgdmVjdG9yIHVzZXMgMS1iYXNlZCBpbmRleGluZyAqLwogICAgIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKIH07CiAKLXN0YXRpYyBpbnQgX2RheXNfYmVmb3JlX21vbnRoW10gPSB7CitzdGF0aWMgY29uc3QgaW50IF9kYXlzX2JlZm9yZV9tb250aFtdID0gewogICAgIDAsIC8qIHVudXNlZDsgdGhpcyB2ZWN0b3IgdXNlcyAxLWJhc2VkIGluZGV4aW5nICovCiAgICAgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQKIH07CkBAIC04NzMsNyArODczLDcgQEAKICAqIHRoaXMgcmV0dXJucyBOVUxMLiAgRWxzZSByZXN1bHQgaXMgcmV0dXJuZWQuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1jYWxsX3R6aW5mb19tZXRob2QoUHlPYmplY3QgKnR6aW5mbywgY2hhciAqbmFtZSwgUHlPYmplY3QgKnR6aW5mb2FyZykKK2NhbGxfdHppbmZvX21ldGhvZChQeU9iamVjdCAqdHppbmZvLCBjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdHppbmZvYXJnKQogewogICAgIFB5T2JqZWN0ICpvZmZzZXQ7CiAKQEAgLTEwMDksMTAgKzEwMDksMTAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBmb3JtYXRfY3RpbWUoUHlEYXRlVGltZV9EYXRlICpkYXRlLCBpbnQgaG91cnMsIGludCBtaW51dGVzLCBpbnQgc2Vjb25kcykKIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqRGF5TmFtZXNbXSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IERheU5hbWVzW10gPSB7CiAgICAgICAgICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iCiAgICAgfTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqTW9udGhOYW1lc1tdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgTW9udGhOYW1lc1tdID0gewogICAgICAgICAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAogICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiCiAgICAgfTsKQEAgLTEwNTcsMTAgKzEwNTcsOCBAQAogICAgIH0KICAgICAvKiBPZmZzZXQgaXMgbm9ybWFsaXplZCwgc28gaXQgaXMgbmVnYXRpdmUgaWYgZGF5cyA8IDAgKi8KICAgICBpZiAoR0VUX1REX0RBWVMob2Zmc2V0KSA8IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBvZmZzZXQ7CiAgICAgICAgIHNpZ24gPSAnLSc7Ci0gICAgICAgIG9mZnNldCA9IGRlbHRhX25lZ2F0aXZlKChQeURhdGVUaW1lX0RlbHRhICopb2Zmc2V0KTsKLSAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICBQeV9TRVRSRUYob2Zmc2V0LCBkZWx0YV9uZWdhdGl2ZSgoUHlEYXRlVGltZV9EZWx0YSAqKW9mZnNldCkpOwogICAgICAgICBpZiAob2Zmc2V0ID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMjMwNyw3ICsyMzA1LDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfSwKIH07CiAKLXN0YXRpYyBjaGFyIGRlbHRhX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGRlbHRhX2RvY1tdID0KIFB5RG9jX1NUUigiRGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBkYXRldGltZSB2YWx1ZXMuIik7CiAKIHN0YXRpYyBQeU51bWJlck1ldGhvZHMgZGVsdGFfYXNfbnVtYmVyID0gewpAQCAtMjg4Niw3ICsyODg0LDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgZGF0ZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBkYXRlX2RvY1tdID0KIFB5RG9jX1NUUigiZGF0ZSh5ZWFyLCBtb250aCwgZGF5KSAtLT4gZGF0ZSBvYmplY3QiKTsKIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBkYXRlX2FzX251bWJlciA9IHsKQEAgLTMwNDcsMTAgKzMwNDUsOCBAQAogICAgIGlmIChkc3QgPT0gUHlfTm9uZSkKICAgICAgICAgZ290byBJbmNvbnNpc3RlbnQ7CiAgICAgaWYgKGRlbHRhX2Jvb2woKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QpICE9IDApIHsKLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9IGFkZF9kYXRldGltZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilyZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QsIDEpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIGFkZF9kYXRldGltZV90aW1lZGVsdGEoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKilyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5RGF0ZVRpbWVfRGVsdGEgKilkc3QsIDEpKTsKICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQogICAgICAgICAgICAgZ290byBGYWlsOwogICAgIH0KQEAgLTMxNTUsNyArMzE1MSw3IEBACiAgICAge05VTEwsIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciB0emluZm9fZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgdHppbmZvX2RvY1tdID0KIFB5RG9jX1NUUigiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdGltZSB6b25lIGluZm8gb2JqZWN0cy4iKTsKIAogc3RhdGljIFB5VHlwZU9iamVjdCBQeURhdGVUaW1lX1RaSW5mb1R5cGUgPSB7CkBAIC0zMjg3LDYgKzMyODMsMTEgQEAKICAgICAgICAgUHlfSU5DUkVGKHNlbGYtPm5hbWUpOwogICAgICAgICByZXR1cm4gc2VsZi0+bmFtZTsKICAgICB9CisgICAgaWYgKChQeU9iamVjdCAqKXNlbGYgPT0gUHlEYXRlVGltZV9UaW1lWm9uZV9VVEMgfHwKKyAgICAgICAgICAgKEdFVF9URF9EQVlTKHNlbGYtPm9mZnNldCkgPT0gMCAmJgorICAgICAgICAgICAgR0VUX1REX1NFQ09ORFMoc2VsZi0+b2Zmc2V0KSA9PSAwICYmCisgICAgICAgICAgICBHRVRfVERfTUlDUk9TRUNPTkRTKHNlbGYtPm9mZnNldCkgPT0gMCkpCisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbVN0cmluZygiVVRDIik7CiAgICAgLyogT2Zmc2V0IGlzIG5vcm1hbGl6ZWQsIHNvIGl0IGlzIG5lZ2F0aXZlIGlmIGRheXMgPCAwICovCiAgICAgaWYgKEdFVF9URF9EQVlTKHNlbGYtPm9mZnNldCkgPCAwKSB7CiAgICAgICAgIHNpZ24gPSAnLSc7CkBAIC0zMzgyLDcgKzMzODMsNyBAQAogICAgIHtOVUxMLCBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgdGltZXpvbmVfZG9jW10gPQorc3RhdGljIGNvbnN0IGNoYXIgdGltZXpvbmVfZG9jW10gPQogUHlEb2NfU1RSKCJGaXhlZCBvZmZzZXQgZnJvbSBVVEMgaW1wbGVtZW50YXRpb24gb2YgdHppbmZvLiIpOwogCiBzdGF0aWMgUHlUeXBlT2JqZWN0IFB5RGF0ZVRpbWVfVGltZVpvbmVUeXBlID0gewpAQCAtMzYwNywyMyArMzYwOCw1NiBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotdGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqdW51c2VkKQordGltZV9pc29mb3JtYXQoUHlEYXRlVGltZV9UaW1lICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewogICAgIGNoYXIgYnVmWzEwMF07CisgICAgY2hhciAqdGltZXNwZWMgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJ0aW1lc3BlYyIsIE5VTEx9OwogICAgIFB5T2JqZWN0ICpyZXN1bHQ7CiAgICAgaW50IHVzID0gVElNRV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgc3RhdGljIGNoYXIgKnNwZWNzW11bMl0gPSB7CisgICAgICAgIHsiaG91cnMiLCAiJTAyZCJ9LAorICAgICAgICB7Im1pbnV0ZXMiLCAiJTAyZDolMDJkIn0sCisgICAgICAgIHsic2Vjb25kcyIsICIlMDJkOiUwMmQ6JTAyZCJ9LAorICAgICAgICB7Im1pbGxpc2Vjb25kcyIsICIlMDJkOiUwMmQ6JTAyZC4lMDNkIn0sCisgICAgICAgIHsibWljcm9zZWNvbmRzIiwgIiUwMmQ6JTAyZDolMDJkLiUwNmQifSwKKyAgICB9OworICAgIHNpemVfdCBnaXZlbl9zcGVjOwogCi0gICAgaWYgKHVzKQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTAyZDolMDJkOiUwMmQuJTA2ZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX01JTlVURShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cyk7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9IT1VSKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FX0dFVF9NSU5VVEUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX1NFQ09ORChzZWxmKSk7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJ8czppc29mb3JtYXQiLCBrZXl3b3JkcywgJnRpbWVzcGVjKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAodGltZXNwZWMgPT0gTlVMTCB8fCBzdHJjbXAodGltZXNwZWMsICJhdXRvIikgPT0gMCkgeworICAgICAgICBpZiAodXMgPT0gMCkgeworICAgICAgICAgICAgLyogc2Vjb25kcyAqLworICAgICAgICAgICAgZ2l2ZW5fc3BlYyA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvKiBtaWNyb3NlY29uZHMgKi8KKyAgICAgICAgICAgIGdpdmVuX3NwZWMgPSA0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGdpdmVuX3NwZWMgPSAwOyBnaXZlbl9zcGVjIDwgUHlfQVJSQVlfTEVOR1RIKHNwZWNzKTsgZ2l2ZW5fc3BlYysrKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKHRpbWVzcGVjLCBzcGVjc1tnaXZlbl9zcGVjXVswXSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnaXZlbl9zcGVjID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogbWlsbGlzZWNvbmRzICovCisgICAgICAgICAgICAgICAgICAgIHVzID0gdXMgLyAxMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnaXZlbl9zcGVjID09IFB5X0FSUkFZX0xFTkdUSChzcGVjcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIHRpbWVzcGVjIHZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoc3BlY3NbZ2l2ZW5fc3BlY11bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTUVfR0VUX0hPVVIoc2VsZiksIFRJTUVfR0VUX01JTlVURShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNRV9HRVRfU0VDT05EKHNlbGYpLCB1cyk7CisgICAgfQogCiAgICAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFIQVNUWklORk8oc2VsZikgfHwgc2VsZi0+dHppbmZvID09IFB5X05vbmUpCiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0zODQ0LDkgKzM4NzgsMTAgQEAKIAogc3RhdGljIFB5TWV0aG9kRGVmIHRpbWVfbWV0aG9kc1tdID0gewogCi0gICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbil0aW1lX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfTk9BUkdTLAotICAgICBQeURvY19TVFIoIlJldHVybiBzdHJpbmcgaW4gSVNPIDg2MDEgZm9ybWF0LCBISDpNTTpTU1subW1tbW1tXSIKLSAgICAgICAgICAgICAgICJbK0hIOk1NXS4iKX0sCisgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbil0aW1lX2lzb2Zvcm1hdCwgICAgICAgIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCisgICAgIFB5RG9jX1NUUigiUmV0dXJuIHN0cmluZyBpbiBJU08gODYwMSBmb3JtYXQsIFtISFs6TU1bOlNTWy5tbW1bdXV1XV1dXV0iCisgICAgICAgICAgICAgICAiWytISDpNTV0uXG5cbiIKKyAgICAgICAgICAgICAgICJ0aW1lc3BlYyBzcGVjaWZpZXMgd2hhdCBjb21wb25lbnRzIG9mIHRoZSB0aW1lIHRvIGluY2x1ZGUuXG4iKX0sCiAKICAgICB7InN0cmZ0aW1lIiwgICAgICAgIChQeUNGdW5jdGlvbil0aW1lX3N0cmZ0aW1lLCAgICAgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKICAgICAgUHlEb2NfU1RSKCJmb3JtYXQgLT4gc3RyZnRpbWUoKSBzdHlsZSBzdHJpbmcuIil9LApAQCAtMzg3Miw3ICszOTA3LDcgQEAKICAgICB7TlVMTCwgICAgICBOVUxMfQogfTsKIAotc3RhdGljIGNoYXIgdGltZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciB0aW1lX2RvY1tdID0KIFB5RG9jX1NUUigidGltZShbaG91clssIG1pbnV0ZVssIHNlY29uZFssIG1pY3Jvc2Vjb25kWywgdHppbmZvXV1dXV0pIC0tPiBhIHRpbWUgb2JqZWN0XG5cCiBcblwKIEFsbCBhcmd1bWVudHMgYXJlIG9wdGlvbmFsLiB0emluZm8gbWF5IGJlIE5vbmUsIG9yIGFuIGluc3RhbmNlIG9mXG5cCkBAIC00MDgzLDQ0ICs0MTE4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CiB9CiAKLXN0YXRpYyB0aW1lX3QKLV9QeVRpbWVfRG91YmxlVG9UaW1ldChkb3VibGUgeCkKLXsKLSAgICB0aW1lX3QgcmVzdWx0OwotICAgIGRvdWJsZSBkaWZmOwotCi0gICAgcmVzdWx0ID0gKHRpbWVfdCl4OwotICAgIC8qIEhvdyBtdWNoIGluZm8gZGlkIHdlIGxvc2U/ICB0aW1lX3QgbWF5IGJlIGFuIGludGVncmFsIG9yCi0gICAgICogZmxvYXRpbmcgdHlwZSwgYW5kIHdlIGRvbid0IGtub3cgd2hpY2guICBJZiBpdCdzIGludGVncmFsLAotICAgICAqIHdlIGRvbid0IGtub3cgd2hldGhlciBDIHRydW5jYXRlcywgcm91bmRzLCByZXR1cm5zIHRoZSBmbG9vciwKLSAgICAgKiBldGMuICBJZiB3ZSBsb3N0IGEgc2Vjb25kIG9yIG1vcmUsIHRoZSBDIHJvdW5kaW5nIGlzCi0gICAgICogdW5yZWFzb25hYmxlLCBvciB0aGUgaW5wdXQganVzdCBkb2Vzbid0IGZpdCBpbiBhIHRpbWVfdDsKLSAgICAgKiBjYWxsIGl0IGFuIGVycm9yIHJlZ2FyZGxlc3MuICBOb3RlIHRoYXQgdGhlIG9yaWdpbmFsIGNhc3QgdG8KLSAgICAgKiB0aW1lX3QgY2FuIGNhdXNlIGEgQyBlcnJvciB0b28sIGJ1dCBub3RoaW5nIHdlIGNhbiBkbyB0bwotICAgICAqIHdvcm0gYXJvdW5kIHRoYXQuCi0gICAgICovCi0gICAgZGlmZiA9IHggLSAoZG91YmxlKXJlc3VsdDsKLSAgICBpZiAoZGlmZiA8PSAtMS4wIHx8IGRpZmYgPj0gMS4wKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvdXQgb2YgcmFuZ2UgZm9yIHBsYXRmb3JtIHRpbWVfdCIpOwotICAgICAgICByZXN1bHQgPSAodGltZV90KS0xOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBSb3VuZCBhIGRvdWJsZSB0byB0aGUgbmVhcmVzdCBsb25nLiAgfHh8IG11c3QgYmUgc21hbGwgZW5vdWdoIHRvIGZpdAotICogaW4gYSBDIGxvbmc7IHRoaXMgaXMgbm90IGNoZWNrZWQuCi0gKi8KLXN0YXRpYyBkb3VibGUKLV9QeVRpbWVfUm91bmRIYWxmRXZlbihkb3VibGUgeCkKLXsKLSAgICBkb3VibGUgcm91bmRlZCA9IHJvdW5kKHgpOwotICAgIGlmIChmYWJzKHgtcm91bmRlZCkgPT0gMC41KQotICAgICAgICAvKiBoYWxmd2F5IGNhc2U6IHJvdW5kIHRvIGV2ZW4gKi8KLSAgICAgICAgcm91bmRlZCA9IDIuMCpyb3VuZCh4LzIuMCk7Ci0gICAgcmV0dXJuIHJvdW5kZWQ7Ci19Ci0KIC8qIEludGVybmFsIGhlbHBlci4KICAqIEJ1aWxkIGRhdGV0aW1lIGZyb20gYSBQeXRob24gdGltZXN0YW1wLiAgUGFzcyBsb2NhbHRpbWUgb3IgZ210aW1lIGZvciBmLAogICogdG8gY29udHJvbCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHRpbWVzdGFtcC4gIFNpbmNlIGEgZG91YmxlIGRvZXNuJ3QKQEAgLTQxMjksMzIgKzQxMjYsMTcgQEAKICAqIHRvIGdldCB0aGF0IG11Y2ggcHJlY2lzaW9uIChlLmcuLCBDIHRpbWUoKSBpc24ndCBnb29kIGVub3VnaCkuCiAgKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1kYXRldGltZV9mcm9tX3RpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIGRvdWJsZSB0aW1lc3RhbXAsCitkYXRldGltZV9mcm9tX3RpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBUTV9GVU5DIGYsIFB5T2JqZWN0ICp0aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdHppbmZvKQogewogICAgIHRpbWVfdCB0aW1ldDsKLSAgICBkb3VibGUgZnJhY3Rpb247Ci0gICAgaW50IHVzOworICAgIGxvbmcgdXM7CiAKLSAgICB0aW1ldCA9IF9QeVRpbWVfRG91YmxlVG9UaW1ldCh0aW1lc3RhbXApOwotICAgIGlmICh0aW1ldCA9PSAodGltZV90KS0xICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKF9QeVRpbWVfT2JqZWN0VG9UaW1ldmFsKHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRpbWV0LCAmdXMsIF9QeVRpbWVfUk9VTkRfSEFMRl9FVkVOKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgZnJhY3Rpb24gPSB0aW1lc3RhbXAgLSAoZG91YmxlKXRpbWV0OwotICAgIHVzID0gKGludClfUHlUaW1lX1JvdW5kSGFsZkV2ZW4oZnJhY3Rpb24gKiAxZTYpOwotICAgIGlmICh1cyA8IDApIHsKLSAgICAgICAgLyogVHJ1bmNhdGlvbiB0b3dhcmRzIHplcm8gaXMgbm90IHdoYXQgd2Ugd2FudGVkCi0gICAgICAgICAgIGZvciBuZWdhdGl2ZSBudW1iZXJzIChQeXRob24ncyBtb2Qgc2VtYW50aWNzKSAqLwotICAgICAgICB0aW1ldCAtPSAxOwotICAgICAgICB1cyArPSAxMDAwMDAwOwotICAgIH0KLSAgICAvKiBJZiB0aW1lc3RhbXAgaXMgbGVzcyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYQotICAgICAqIGZ1bGwgc2Vjb25kLCByb3VuZCB1cC4gT3RoZXJ3aXNlLCBWYWx1ZUVycm9ycyBhcmUgcmFpc2VkCi0gICAgICogZm9yIHNvbWUgZmxvYXRzLiAqLwotICAgIGlmICh1cyA9PSAxMDAwMDAwKSB7Ci0gICAgICAgIHRpbWV0ICs9IDE7Ci0gICAgICAgIHVzID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIHVzLCB0emluZm8pOworCisgICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXRfYW5kX3VzKGNscywgZiwgdGltZXQsIChpbnQpdXMsIHR6aW5mbyk7CiB9CiAKIC8qIEludGVybmFsIGhlbHBlci4KQEAgLTQyMDUsMTAgKzQxODcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6KTsKICAgICBpZiAoc2VsZiAhPSBOVUxMICYmIHR6ICE9IFB5X05vbmUpIHsKICAgICAgICAgLyogQ29udmVydCBVVEMgdG8gdHppbmZvJ3Mgem9uZS4gKi8KLSAgICAgICAgUHlPYmplY3QgKnRlbXAgPSBzZWxmOwotCi0gICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6LCAmUHlJZF9mcm9tdXRjLCAiTyIsIHNlbGYpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6LCAmUHlJZF9mcm9tdXRjLCAiTiIsIHNlbGYpOwogICAgIH0KICAgICByZXR1cm4gc2VsZjsKIH0KQEAgLTQyMjcsMTEgKzQyMDYsMTEgQEAKIGRhdGV0aW1lX2Zyb210aW1lc3RhbXAoUHlPYmplY3QgKmNscywgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdykKIHsKICAgICBQeU9iamVjdCAqc2VsZjsKLSAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICp0aW1lc3RhbXA7CiAgICAgUHlPYmplY3QgKnR6aW5mbyA9IFB5X05vbmU7CiAgICAgc3RhdGljIGNoYXIgKmtleXdvcmRzW10gPSB7InRpbWVzdGFtcCIsICJ0eiIsIE5VTEx9OwogCi0gICAgaWYgKCEgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiZHxPOmZyb210aW1lc3RhbXAiLAorICAgIGlmICghIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98Tzpmcm9tdGltZXN0YW1wIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHMsICZ0aW1lc3RhbXAsICZ0emluZm8pKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoY2hlY2tfdHppbmZvX3N1YmNsYXNzKHR6aW5mbykgPCAwKQpAQCAtNDI0MywxMCArNDIyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbyk7CiAgICAgaWYgKHNlbGYgIT0gTlVMTCAmJiB0emluZm8gIT0gUHlfTm9uZSkgewogICAgICAgICAvKiBDb252ZXJ0IFVUQyB0byB0emluZm8ncyB6b25lLiAqLwotICAgICAgICBQeU9iamVjdCAqdGVtcCA9IHNlbGY7Ci0KLSAgICAgICAgc2VsZiA9IF9QeU9iamVjdF9DYWxsTWV0aG9kSWQodHppbmZvLCAmUHlJZF9mcm9tdXRjLCAiTyIsIHNlbGYpOwotICAgICAgICBQeV9ERUNSRUYodGVtcCk7CisgICAgICAgIHNlbGYgPSBfUHlPYmplY3RfQ2FsbE1ldGhvZElkKHR6aW5mbywgJlB5SWRfZnJvbXV0YywgIk4iLCBzZWxmKTsKICAgICB9CiAgICAgcmV0dXJuIHNlbGY7CiB9CkBAIC00MjU1LDEwICs0MjMxLDEwIEBACiBzdGF0aWMgUHlPYmplY3QgKgogZGF0ZXRpbWVfdXRjZnJvbXRpbWVzdGFtcChQeU9iamVjdCAqY2xzLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBkb3VibGUgdGltZXN0YW1wOworICAgIFB5T2JqZWN0ICp0aW1lc3RhbXA7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKLSAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZDp1dGNmcm9tdGltZXN0YW1wIiwgJnRpbWVzdGFtcCkpCisgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86dXRjZnJvbXRpbWVzdGFtcCIsICZ0aW1lc3RhbXApKQogICAgICAgICByZXN1bHQgPSBkYXRldGltZV9mcm9tX3RpbWVzdGFtcChjbHMsIGdtdGltZSwgdGltZXN0YW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtNDQ2OSw5ICs0NDQ1LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgICAgICAgICAgaWYgKG9mZmRpZmYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gcmVzdWx0OwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRlbHRhX3N1YnRyYWN0KHJlc3VsdCwgb2ZmZGlmZik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHRlbXApOworICAgICAgICAgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIGRlbHRhX3N1YnRyYWN0KHJlc3VsdCwgb2ZmZGlmZikpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihvZmZkaWZmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDUzNiwyNSArNDUxMCw1NSBAQAogZGF0ZXRpbWVfaXNvZm9ybWF0KFB5RGF0ZVRpbWVfRGF0ZVRpbWUgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpCiB7CiAgICAgaW50IHNlcCA9ICdUJzsKLSAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsic2VwIiwgTlVMTH07CisgICAgY2hhciAqdGltZXNwZWMgPSBOVUxMOworICAgIHN0YXRpYyBjaGFyICprZXl3b3Jkc1tdID0geyJzZXAiLCAidGltZXNwZWMiLCBOVUxMfTsKICAgICBjaGFyIGJ1ZmZlclsxMDBdOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAgICAgaW50IHVzID0gREFURV9HRVRfTUlDUk9TRUNPTkQoc2VsZik7CisgICAgc3RhdGljIGNoYXIgKnNwZWNzW11bMl0gPSB7CisgICAgICAgIHsiaG91cnMiLCAiJTA0ZC0lMDJkLSUwMmQlYyUwMmQifSwKKyAgICAgICAgeyJtaW51dGVzIiwgIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQifSwKKyAgICAgICAgeyJzZWNvbmRzIiwgIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQ6JTAyZCJ9LAorICAgICAgICB7Im1pbGxpc2Vjb25kcyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQuJTAzZCJ9LAorICAgICAgICB7Im1pY3Jvc2Vjb25kcyIsICIlMDRkLSUwMmQtJTAyZCVjJTAyZDolMDJkOiUwMmQuJTA2ZCJ9LAorICAgIH07CisgICAgc2l6ZV90IGdpdmVuX3NwZWM7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxDOmlzb2Zvcm1hdCIsIGtleXdvcmRzLCAmc2VwKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgInxDczppc29mb3JtYXQiLCBrZXl3b3JkcywgJnNlcCwgJnRpbWVzcGVjKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHVzKQotICAgICAgICByZXN1bHQgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJTA0ZC0lMDJkLSUwMmQlYyUwMmQ6JTAyZDolMDJkLiUwNmQiLAorCisgICAgaWYgKHRpbWVzcGVjID09IE5VTEwgfHwgc3RyY21wKHRpbWVzcGVjLCAiYXV0byIpID09IDApIHsKKyAgICAgICAgaWYgKHVzID09IDApIHsKKyAgICAgICAgICAgIC8qIHNlY29uZHMgKi8KKyAgICAgICAgICAgIGdpdmVuX3NwZWMgPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLyogbWljcm9zZWNvbmRzICovCisgICAgICAgICAgICBnaXZlbl9zcGVjID0gNDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yIChnaXZlbl9zcGVjID0gMDsgZ2l2ZW5fc3BlYyA8IFB5X0FSUkFZX0xFTkdUSChzcGVjcyk7IGdpdmVuX3NwZWMrKykgeworICAgICAgICAgICAgaWYgKHN0cmNtcCh0aW1lc3BlYywgc3BlY3NbZ2l2ZW5fc3BlY11bMF0pID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2l2ZW5fc3BlYyA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIHVzID0gdXMgLyAxMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnaXZlbl9zcGVjID09IFB5X0FSUkFZX0xFTkdUSChzcGVjcykpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIHRpbWVzcGVjIHZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoc3BlY3NbZ2l2ZW5fc3BlY11bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZiksIChpbnQpc2VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSwgdXMpOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gUHlVbmljb2RlX0Zyb21Gb3JtYXQoIiUwNGQtJTAyZC0lMDJkJWMlMDJkOiUwMmQ6JTAyZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9ZRUFSKHNlbGYpLCBHRVRfTU9OVEgoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9EQVkoc2VsZiksIChpbnQpc2VwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFX0dFVF9IT1VSKHNlbGYpLCBEQVRFX0dFVF9NSU5VVEUoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEVfR0VUX1NFQ09ORChzZWxmKSk7CisgICAgfQogCiAgICAgaWYgKCFyZXN1bHQgfHwgIUhBU1RaSU5GTyhzZWxmKSkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTQ3NjYsNyArNDc3MCw3IEBACiAgICAgaWYgKHNlY29uZHMgPT0gTlVMTCkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBQeV9ERUNSRUYoZGVsdGEpOwotICAgIHRpbWVzdGFtcCA9IFB5TG9uZ19Bc0xvbmcoc2Vjb25kcyk7CisgICAgdGltZXN0YW1wID0gX1B5TG9uZ19Bc1RpbWVfdChzZWNvbmRzKTsKICAgICBQeV9ERUNSRUYoc2Vjb25kcyk7CiAgICAgaWYgKHRpbWVzdGFtcCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTUwOTMsOSArNTA5NywxMiBAQAogCiAgICAgeyJpc29mb3JtYXQiLCAgIChQeUNGdW5jdGlvbilkYXRldGltZV9pc29mb3JtYXQsIE1FVEhfVkFSQVJHUyB8IE1FVEhfS0VZV09SRFMsCiAgICAgIFB5RG9jX1NUUigiW3NlcF0gLT4gc3RyaW5nIGluIElTTyA4NjAxIGZvcm1hdCwgIgotICAgICAgICAgICAgICAgIllZWVktTU0tRERUSEg6TU06U1NbLm1tbW1tbV1bK0hIOk1NXS5cblxuIgorICAgICAgICAgICAgICAgIllZWVktTU0tRERUW0hIWzpNTVs6U1NbLm1tbVt1dXVdXV1dXVsrSEg6TU1dLlxuIgogICAgICAgICAgICAgICAgInNlcCBpcyB1c2VkIHRvIHNlcGFyYXRlIHRoZSB5ZWFyIGZyb20gdGhlIHRpbWUsIGFuZCAiCi0gICAgICAgICAgICAgICAiZGVmYXVsdHMgdG8gJ1QnLiIpfSwKKyAgICAgICAgICAgICAgICJkZWZhdWx0cyB0byAnVCcuXG4iCisgICAgICAgICAgICAgICAidGltZXNwZWMgc3BlY2lmaWVzIHdoYXQgY29tcG9uZW50cyBvZiB0aGUgdGltZSB0byBpbmNsdWRlIgorICAgICAgICAgICAgICAgIiAoYWxsb3dlZCB2YWx1ZXMgYXJlICdhdXRvJywgJ2hvdXJzJywgJ21pbnV0ZXMnLCAnc2Vjb25kcycsIgorICAgICAgICAgICAgICAgIiAnbWlsbGlzZWNvbmRzJywgYW5kICdtaWNyb3NlY29uZHMnKS5cbiIpfSwKIAogICAgIHsidXRjb2Zmc2V0IiwgICAgICAgKFB5Q0Z1bmN0aW9uKWRhdGV0aW1lX3V0Y29mZnNldCwgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiUmV0dXJuIHNlbGYudHppbmZvLnV0Y29mZnNldChzZWxmKS4iKX0sCkBAIC01MTE4LDcgKzUxMjUsNyBAQAogICAgIHtOVUxMLCAgICAgIE5VTEx9CiB9OwogCi1zdGF0aWMgY2hhciBkYXRldGltZV9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBkYXRldGltZV9kb2NbXSA9CiBQeURvY19TVFIoImRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXlbLCBob3VyWywgbWludXRlWywgc2Vjb25kWywgbWljcm9zZWNvbmRbLHR6aW5mb11dXV1dKVxuXAogXG5cCiBUaGUgeWVhciwgbW9udGggYW5kIGRheSBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLiB0emluZm8gbWF5IGJlIE5vbmUsIG9yIGFuXG5cCkBAIC01MzgyLDE5ICs1Mzg5LDE5IEBACiAgICAgLyogQSA0LXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkIGdldCBmcm9tCiAgICAgICogcGFzdGluZyB0b2dldGhlciA0IHNpbmdsZSB5ZWFycy4KICAgICAgKi8KLSAgICBhc3NlcnQoREk0WSA9PSA0ICogMzY1ICsgMSk7CisgICAgUHlfQlVJTERfQVNTRVJUKERJNFkgPT0gNCAqIDM2NSArIDEpOwogICAgIGFzc2VydChESTRZID09IGRheXNfYmVmb3JlX3llYXIoNCsxKSk7CiAKICAgICAvKiBTaW1pbGFybHksIGEgNDAwLXllYXIgY3ljbGUgaGFzIGFuIGV4dHJhIGxlYXAgZGF5IG92ZXIgd2hhdCB3ZSdkCiAgICAgICogZ2V0IGZyb20gcGFzdGluZyB0b2dldGhlciA0IDEwMC15ZWFyIGN5Y2xlcy4KICAgICAgKi8KLSAgICBhc3NlcnQoREk0MDBZID09IDQgKiBESTEwMFkgKyAxKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoREk0MDBZID09IDQgKiBESTEwMFkgKyAxKTsKICAgICBhc3NlcnQoREk0MDBZID09IGRheXNfYmVmb3JlX3llYXIoNDAwKzEpKTsKIAogICAgIC8qIE9UT0gsIGEgMTAwLXllYXIgY3ljbGUgaGFzIG9uZSBmZXdlciBsZWFwIGRheSB0aGFuIHdlJ2QgZ2V0IGZyb20KICAgICAgKiBwYXN0aW5nIHRvZ2V0aGVyIDI1IDQteWVhciBjeWNsZXMuCiAgICAgICovCi0gICAgYXNzZXJ0KERJMTAwWSA9PSAyNSAqIERJNFkgLSAxKTsKKyAgICBQeV9CVUlMRF9BU1NFUlQoREkxMDBZID09IDI1ICogREk0WSAtIDEpOwogICAgIGFzc2VydChESTEwMFkgPT0gZGF5c19iZWZvcmVfeWVhcigxMDArMSkpOwogCiAgICAgb25lID0gUHlMb25nX0Zyb21Mb25nKDEpOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGJtbW9kdWxlLmMgYi9Nb2R1bGVzL19kYm1tb2R1bGUuYwppbmRleCBlYTg3OTBiLi44MDQ5NzhhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kYm1tb2R1bGUuYworKysgYi9Nb2R1bGVzL19kYm1tb2R1bGUuYwpAQCAtMTQsMTYgKzE0LDE2IEBACiAgKi8KICNpZiBkZWZpbmVkKEhBVkVfTkRCTV9IKQogI2luY2x1ZGUgPG5kYm0uaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiR05VIGdkYm0iOyAgLyogRU1YIHBvcnQgb2YgR0RCTSAqLworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiR05VIGdkYm0iOyAgLyogRU1YIHBvcnQgb2YgR0RCTSAqLwogI2VsaWYgZGVmaW5lZChIQVZFX0dEQk1fTkRCTV9IKQogI2luY2x1ZGUgPGdkYm0vbmRibS5oPgotc3RhdGljIGNoYXIgKndoaWNoX2RibSA9ICJHTlUgZ2RibSI7CitzdGF0aWMgY29uc3QgY2hhciB3aGljaF9kYm1bXSA9ICJHTlUgZ2RibSI7CiAjZWxpZiBkZWZpbmVkKEhBVkVfR0RCTV9EQVNIX05EQk1fSCkKICNpbmNsdWRlIDxnZGJtLW5kYm0uaD4KLXN0YXRpYyBjaGFyICp3aGljaF9kYm0gPSAiR05VIGdkYm0iOworc3RhdGljIGNvbnN0IGNoYXIgd2hpY2hfZGJtW10gPSAiR05VIGdkYm0iOwogI2VsaWYgZGVmaW5lZChIQVZFX0JFUktEQl9IKQogI2luY2x1ZGUgPGRiLmg+Ci1zdGF0aWMgY2hhciAqd2hpY2hfZGJtID0gIkJlcmtlbGV5IERCIjsKK3N0YXRpYyBjb25zdCBjaGFyIHdoaWNoX2RibVtdID0gIkJlcmtlbGV5IERCIjsKICNlbHNlCiAjZXJyb3IgIk5vIG5kYm0uaCBhdmFpbGFibGUhIgogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMgYi9Nb2R1bGVzL19kZWNpbWFsL19kZWNpbWFsLmMKaW5kZXggMjIwNTNiNC4uZGQzM2Y5NyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9fZGVjaW1hbC5jCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvX2RlY2ltYWwuYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSAiZG9jc3RyaW5ncy5oIgotI2luY2x1ZGUgIm1lbW9yeS5oIgogCiAKICNpZiAhZGVmaW5lZChNUERfVkVSU0lPTl9IRVgpIHx8IE1QRF9WRVJTSU9OX0hFWCA8IDB4MDIwNDAxMDAKQEAgLTMzODYsNiArMzM4NSwxMDYgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopIHB5bG9uZzsKIH0KIAorLyogQ29udmVydCBhIERlY2ltYWwgdG8gaXRzIGV4YWN0IGludGVnZXIgcmF0aW8gcmVwcmVzZW50YXRpb24uICovCitzdGF0aWMgUHlPYmplY3QgKgorZGVjX2FzX2ludGVnZXJfcmF0aW8oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzIFVOVVNFRCkKK3sKKyAgICBQeU9iamVjdCAqbnVtZXJhdG9yID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZGVub21pbmF0b3IgPSBOVUxMOworICAgIFB5T2JqZWN0ICpleHBvbmVudCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnRtcDsKKyAgICBtcGRfc3NpemVfdCBleHA7CisgICAgUHlPYmplY3QgKmNvbnRleHQ7CisgICAgdWludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBQeU51bWJlck1ldGhvZHMgKmxvbmdfbWV0aG9kcyA9IFB5TG9uZ19UeXBlLnRwX2FzX251bWJlcjsKKworICAgIGlmIChtcGRfaXNzcGVjaWFsKE1QRChzZWxmKSkpIHsKKyAgICAgICAgaWYgKG1wZF9pc25hbihNUEQoc2VsZikpKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAiY2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIgcmF0aW8iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBpbnRlZ2VyIHJhdGlvIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQ1VSUkVOVF9DT05URVhUKGNvbnRleHQpOworCisgICAgdG1wID0gZGVjX2FsbG9jKCk7CisgICAgaWYgKHRtcCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghbXBkX3Fjb3B5KE1QRCh0bXApLCBNUEQoc2VsZiksICZzdGF0dXMpKSB7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBleHAgPSBtcGRfaXN6ZXJvKE1QRCh0bXApKSA/IDAgOiBNUEQodG1wKS0+ZXhwOworICAgIE1QRCh0bXApLT5leHAgPSAwOworCisgICAgLyogY29udGV4dCBhbmQgcm91bmRpbmcgYXJlIHVudXNlZCBoZXJlOiB0aGUgY29udmVyc2lvbiBpcyBleGFjdCAqLworICAgIG51bWVyYXRvciA9IGRlY19hc19sb25nKHRtcCwgY29udGV4dCwgTVBEX1JPVU5EX0ZMT09SKTsKKyAgICBQeV9ERUNSRUYodG1wKTsKKyAgICBpZiAobnVtZXJhdG9yID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBleHBvbmVudCA9IFB5TG9uZ19Gcm9tU3NpemVfdChleHAgPCAwID8gLWV4cCA6IGV4cCk7CisgICAgaWYgKGV4cG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICB0bXAgPSBQeUxvbmdfRnJvbUxvbmcoMTApOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIFB5X1NFVFJFRihleHBvbmVudCwgbG9uZ19tZXRob2RzLT5uYl9wb3dlcih0bXAsIGV4cG9uZW50LCBQeV9Ob25lKSk7CisgICAgUHlfREVDUkVGKHRtcCk7CisgICAgaWYgKGV4cG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBpZiAoZXhwID49IDApIHsKKyAgICAgICAgUHlfU0VUUkVGKG51bWVyYXRvciwgbG9uZ19tZXRob2RzLT5uYl9tdWx0aXBseShudW1lcmF0b3IsIGV4cG9uZW50KSk7CisgICAgICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBkZW5vbWluYXRvciA9IFB5TG9uZ19Gcm9tTG9uZygxKTsKKyAgICAgICAgaWYgKGRlbm9taW5hdG9yID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRlbm9taW5hdG9yID0gZXhwb25lbnQ7CisgICAgICAgIGV4cG9uZW50ID0gTlVMTDsKKyAgICAgICAgdG1wID0gX1B5TG9uZ19HQ0QobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CisgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBQeV9TRVRSRUYobnVtZXJhdG9yLCBsb25nX21ldGhvZHMtPm5iX2Zsb29yX2RpdmlkZShudW1lcmF0b3IsIHRtcCkpOworICAgICAgICBQeV9TRVRSRUYoZGVub21pbmF0b3IsIGxvbmdfbWV0aG9kcy0+bmJfZmxvb3JfZGl2aWRlKGRlbm9taW5hdG9yLCB0bXApKTsKKyAgICAgICAgUHlfREVDUkVGKHRtcCk7CisgICAgICAgIGlmIChudW1lcmF0b3IgPT0gTlVMTCB8fCBkZW5vbWluYXRvciA9PSBOVUxMKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOworCisKK2Vycm9yOgorICAgIFB5X1hERUNSRUYoZXhwb25lbnQpOworICAgIFB5X1hERUNSRUYoZGVub21pbmF0b3IpOworICAgIFB5X1hERUNSRUYobnVtZXJhdG9yKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBzdGF0aWMgUHlPYmplY3QgKgogUHlEZWNfVG9JbnRlZ3JhbFZhbHVlKFB5T2JqZWN0ICpkZWMsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKQEAgLTQ2OTQsNiArNDc5Myw3IEBACiAgIC8qIE1pc2NlbGxhbmVvdXMgKi8KICAgeyAiZnJvbV9mbG9hdCIsIGRlY19mcm9tX2Zsb2F0LCBNRVRIX098TUVUSF9DTEFTUywgZG9jX2Zyb21fZmxvYXQgfSwKICAgeyAiYXNfdHVwbGUiLCBQeURlY19Bc1R1cGxlLCBNRVRIX05PQVJHUywgZG9jX2FzX3R1cGxlIH0sCisgIHsgImFzX2ludGVnZXJfcmF0aW8iLCBkZWNfYXNfaW50ZWdlcl9yYXRpbywgTUVUSF9OT0FSR1MsIGRvY19hc19pbnRlZ2VyX3JhdGlvIH0sCiAKICAgLyogU3BlY2lhbCBtZXRob2RzICovCiAgIHsgIl9fY29weV9fIiwgZGVjX2NvcHksIE1FVEhfTk9BUkdTLCBOVUxMIH0sCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2RvY3N0cmluZ3MuaCBiL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCmluZGV4IDcxMDI5YTkuLmY3ZmQ2ZTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvZG9jc3RyaW5ncy5oCkBAIC03MCw2ICs3MCwxNSBAQAogUmV0dXJuIGEgdHVwbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci5cblwKIFxuIik7CiAKK1B5RG9jX1NUUlZBUihkb2NfYXNfaW50ZWdlcl9yYXRpbywKKyJhc19pbnRlZ2VyX3JhdGlvKCRzZWxmLCAvKVxuLS1cblxuXAorRGVjaW1hbC5hc19pbnRlZ2VyX3JhdGlvKCkgLT4gKGludCwgaW50KVxuXAorXG5cCitSZXR1cm4gYSBwYWlyIG9mIGludGVnZXJzLCB3aG9zZSByYXRpbyBpcyBleGFjdGx5IGVxdWFsIHRvIHRoZSBvcmlnaW5hbFxuXAorRGVjaW1hbCBhbmQgd2l0aCBhIHBvc2l0aXZlIGRlbm9taW5hdG9yLiBUaGUgcmF0aW8gaXMgaW4gbG93ZXN0IHRlcm1zLlxuXAorUmFpc2UgT3ZlcmZsb3dFcnJvciBvbiBpbmZpbml0aWVzIGFuZCBhIFZhbHVlRXJyb3Igb24gTmFOcy5cblwKK1xuIik7CisKIFB5RG9jX1NUUlZBUihkb2NfY2Fub25pY2FsLAogImNhbm9uaWNhbCgkc2VsZiwgLylcbi0tXG5cblwKIFJldHVybiB0aGUgY2Fub25pY2FsIGVuY29kaW5nIG9mIHRoZSBhcmd1bWVudC4gIEN1cnJlbnRseSwgdGhlIGVuY29kaW5nXG5cCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2Jhc2Vhcml0aC5jIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9iYXNlYXJpdGguYwppbmRleCAzNWRlNmI4Li5kZmUxNTIzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2Jhc2Vhcml0aC5jCisrKyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvYmFzZWFyaXRoLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlICJjb25zdGFudHMuaCIKLSNpbmNsdWRlICJtZW1vcnkuaCIKICNpbmNsdWRlICJ0eXBlYXJpdGguaCIKICNpbmNsdWRlICJiYXNlYXJpdGguaCIKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9pby5jIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9pby5jCmluZGV4IGE0NWE0MjkuLjNhYWRmYjAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvaW8uYworKysgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL2lvLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsb2NhbGUuaD4KICNpbmNsdWRlICJiaXRzLmgiCiAjaW5jbHVkZSAiY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCiAjaW5jbHVkZSAidHlwZWFyaXRoLmgiCiAjaW5jbHVkZSAiaW8uaCIKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuYyBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmMKaW5kZXggMGY0MWZlNS4uYTg1NGUwOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuYworKysgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21lbW9yeS5jCkBAIC0zMCw3ICszMCwxMiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAidHlwZWFyaXRoLmgiCi0jaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAibXBhbGxvYy5oIgorCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQyMzIpCisjZW5kaWYKIAogCiAvKiBHdWFyYW50ZWVkIG1pbmltdW0gYWxsb2NhdGlvbiBmb3IgYSBjb2VmZmljaWVudC4gTWF5IGJlIGNoYW5nZWQgb25jZQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuaCBiL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBhbGxvYy5oCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIE1vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmgKcmVuYW1lIHRvIE1vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBhbGxvYy5oCmluZGV4IDljOThkMWEuLmVmZDcxMTkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbWVtb3J5LmgKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGFsbG9jLmgKQEAgLTI2LDggKzI2LDggQEAKICAqLwogCiAKLSNpZm5kZWYgTUVNT1JZX0gKLSNkZWZpbmUgTUVNT1JZX0gKKyNpZm5kZWYgTVBBTExPQ19ICisjZGVmaW5lIE1QQUxMT0NfSAogCiAKICNpbmNsdWRlICJtcGRlY2ltYWwuaCIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmMgYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5jCmluZGV4IDU5M2Y5ZjUuLjMyOGFiOTIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmMKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgImJpdHMuaCIKICNpbmNsdWRlICJjb252b2x1dGUuaCIKICNpbmNsdWRlICJjcnQuaCIKLSNpbmNsdWRlICJtZW1vcnkuaCIKKyNpbmNsdWRlICJtcGFsbG9jLmgiCiAjaW5jbHVkZSAidHlwZWFyaXRoLmgiCiAjaW5jbHVkZSAidW1vZGFyaXRoLmgiCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmggYi9Nb2R1bGVzL19kZWNpbWFsL2xpYm1wZGVjL21wZGVjaW1hbC5oCmluZGV4IDVjYTc0MTMuLjU2ZTQ4ODcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmgKKysrIGIvTW9kdWxlcy9fZGVjaW1hbC9saWJtcGRlYy9tcGRlY2ltYWwuaApAQCAtMTA4LDkgKzEwOCw5IEBACiAKICNkZWZpbmUgTVBEX01BSk9SX1ZFUlNJT04gMgogI2RlZmluZSBNUERfTUlOT1JfVkVSU0lPTiA0Ci0jZGVmaW5lIE1QRF9NSUNST19WRVJTSU9OIDEKKyNkZWZpbmUgTVBEX01JQ1JPX1ZFUlNJT04gMgogCi0jZGVmaW5lIE1QRF9WRVJTSU9OICIyLjQuMSIKKyNkZWZpbmUgTVBEX1ZFUlNJT04gIjIuNC4yIgogCiAjZGVmaW5lIE1QRF9WRVJTSU9OX0hFWCAoKE1QRF9NQUpPUl9WRVJTSU9OIDw8IDI0KSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAoTVBEX01JTk9SX1ZFUlNJT04gPDwgMTYpIHwgXApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fZGVjaW1hbC90ZXN0cy9kZWNjaGVjay5weSBiL01vZHVsZXMvX2RlY2ltYWwvdGVzdHMvZGVjY2hlY2sucHkKaW5kZXggYWI3ZDViZC4uZjkwNzUzMSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fZGVjaW1hbC90ZXN0cy9kZWNjaGVjay5weQorKysgYi9Nb2R1bGVzL19kZWNpbWFsL3Rlc3RzL2RlY2NoZWNrLnB5CkBAIC01MCw4ICs1MCw4IEBACiAgICAgICAgICdfX2Fic19fJywgJ19fYm9vbF9fJywgJ19fY2VpbF9fJywgJ19fY29tcGxleF9fJywgJ19fY29weV9fJywKICAgICAgICAgJ19fZmxvb3JfXycsICdfX2Zsb2F0X18nLCAnX19oYXNoX18nLCAnX19pbnRfXycsICdfX25lZ19fJywKICAgICAgICAgJ19fcG9zX18nLCAnX19yZWR1Y2VfXycsICdfX3JlcHJfXycsICdfX3N0cl9fJywgJ19fdHJ1bmNfXycsCi0gICAgICAgICdhZGp1c3RlZCcsICdhc190dXBsZScsICdjYW5vbmljYWwnLCAnY29uanVnYXRlJywgJ2NvcHlfYWJzJywKLSAgICAgICAgJ2NvcHlfbmVnYXRlJywgJ2lzX2Nhbm9uaWNhbCcsICdpc19maW5pdGUnLCAnaXNfaW5maW5pdGUnLAorICAgICAgICAnYWRqdXN0ZWQnLCAnYXNfaW50ZWdlcl9yYXRpbycsICdhc190dXBsZScsICdjYW5vbmljYWwnLCAnY29uanVnYXRlJywKKyAgICAgICAgJ2NvcHlfYWJzJywgJ2NvcHlfbmVnYXRlJywgJ2lzX2Nhbm9uaWNhbCcsICdpc19maW5pdGUnLCAnaXNfaW5maW5pdGUnLAogICAgICAgICAnaXNfbmFuJywgJ2lzX3FuYW4nLCAnaXNfc2lnbmVkJywgJ2lzX3NuYW4nLCAnaXNfemVybycsICdyYWRpeCcKICAgICApLAogICAgICMgVW5hcnkgd2l0aCBvcHRpb25hbCBjb250ZXh0OgpAQCAtMTI4LDcgKzEyOCw3IEBACiAjIEZ1bmN0aW9ucyB0aGF0IHJlcXVpcmUgYSByZXN0cmljdGVkIGV4cG9uZW50IHJhbmdlIGZvciByZWFzb25hYmxlIHJ1bnRpbWVzLgogVW5hcnlSZXN0cmljdGVkID0gWwogICAnX19jZWlsX18nLCAnX19mbG9vcl9fJywgJ19faW50X18nLCAnX190cnVuY19fJywKLSAgJ3RvX2ludGVncmFsJywgJ3RvX2ludGVncmFsX3ZhbHVlJworICAnYXNfaW50ZWdlcl9yYXRpbycsICd0b19pbnRlZ3JhbCcsICd0b19pbnRlZ3JhbF92YWx1ZScKIF0KIAogQmluYXJ5UmVzdHJpY3RlZCA9IFsnX19yb3VuZF9fJ10KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMgYi9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCmluZGV4IDg1ZmZjYTIuLmIzMmYyYWQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKKysrIGIvTW9kdWxlcy9fZWxlbWVudHRyZWUuYwpAQCAtMTI5LDMwICsxMjksNiBAQAogLyogaGVscGVycyAqLwogCiBMT0NBTChQeU9iamVjdCopCi1kZWVwY29weShQeU9iamVjdCogb2JqZWN0LCBQeU9iamVjdCogbWVtbykKLXsKLSAgICAvKiBkbyBhIGRlZXAgY29weSBvZiB0aGUgZ2l2ZW4gb2JqZWN0ICovCi0gICAgUHlPYmplY3QqIGFyZ3M7Ci0gICAgUHlPYmplY3QqIHJlc3VsdDsKLSAgICBlbGVtZW50dHJlZXN0YXRlICpzdCA9IEVUX1NUQVRFX0dMT0JBTDsKLQotICAgIGlmICghc3QtPmRlZXBjb3B5X29iaikgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoCi0gICAgICAgICAgICBQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAiZGVlcGNvcHkgaGVscGVyIG5vdCBmb3VuZCIKLSAgICAgICAgICAgICk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soMiwgb2JqZWN0LCBtZW1vKTsKLSAgICBpZiAoIWFyZ3MpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdCA9IFB5T2JqZWN0X0NhbGxPYmplY3Qoc3QtPmRlZXBjb3B5X29iaiwgYXJncyk7Ci0gICAgUHlfREVDUkVGKGFyZ3MpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLUxPQ0FMKFB5T2JqZWN0KikKIGxpc3Rfam9pbihQeU9iamVjdCogbGlzdCkKIHsKICAgICAvKiBqb2luIGxpc3QgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIGxpc3QgaW4gdGhlIHByb2Nlc3MpICovCkBAIC00MjAsMTAgKzM5Niw4IEBACiAgICAgUHlfWERFQ1JFRihhdHRyaWIpOwogCiAgICAgLyogUmVwbGFjZSB0aGUgb2JqZWN0cyBhbHJlYWR5IHBvaW50ZWQgdG8gYnkgdGFnLCB0ZXh0IGFuZCB0YWlsLiAqLwotICAgIHRtcCA9IHNlbGZfZWxlbS0+dGFnOwogICAgIFB5X0lOQ1JFRih0YWcpOwotICAgIHNlbGZfZWxlbS0+dGFnID0gdGFnOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X1hTRVRSRUYoc2VsZl9lbGVtLT50YWcsIHRhZyk7CiAKICAgICB0bXAgPSBzZWxmX2VsZW0tPnRleHQ7CiAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwpAQCAtNzQ4LDYgKzcyMiw5IEBACiAgICAgcmV0dXJuIChQeU9iamVjdCopIGVsZW1lbnQ7CiB9CiAKKy8qIEhlbHBlciBmb3IgYSBkZWVwIGNvcHkuICovCitMT0NBTChQeU9iamVjdCAqKSBkZWVwY29weShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKwogLypbY2xpbmljIGlucHV0XQogX2VsZW1lbnR0cmVlLkVsZW1lbnQuX19kZWVwY29weV9fCiAKQEAgLTgzOCw2ICs4MTUsNTcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorTE9DQUwoUHlPYmplY3QgKikKK2RlZXBjb3B5KFB5T2JqZWN0ICpvYmplY3QsIFB5T2JqZWN0ICptZW1vKQoreworICAgIC8qIGRvIGEgZGVlcCBjb3B5IG9mIHRoZSBnaXZlbiBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGVsZW1lbnR0cmVlc3RhdGUgKnN0OworCisgICAgLyogRmFzdCBwYXRocyAqLworICAgIGlmIChvYmplY3QgPT0gUHlfTm9uZSB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmplY3QpKSB7CisgICAgICAgIFB5X0lOQ1JFRihvYmplY3QpOworICAgICAgICByZXR1cm4gb2JqZWN0OworICAgIH0KKworICAgIGlmIChQeV9SRUZDTlQob2JqZWN0KSA9PSAxKSB7CisgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChvYmplY3QpKSB7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5LCAqdmFsdWU7CisgICAgICAgICAgICBQeV9zc2l6ZV90IHBvcyA9IDA7CisgICAgICAgICAgICBpbnQgc2ltcGxlID0gMTsKKyAgICAgICAgICAgIHdoaWxlIChQeURpY3RfTmV4dChvYmplY3QsICZwb3MsICZrZXksICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkgfHwgIVB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBzaW1wbGUgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2ltcGxlKQorICAgICAgICAgICAgICAgIHJldHVybiBQeURpY3RfQ29weShvYmplY3QpOworICAgICAgICAgICAgLyogRmFsbCB0aHJvdWdoIHRvIGdlbmVyYWwgY2FzZSAqLworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEVsZW1lbnRfQ2hlY2tFeGFjdChvYmplY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gX2VsZW1lbnR0cmVlX0VsZW1lbnRfX19kZWVwY29weV9fKChFbGVtZW50T2JqZWN0ICopb2JqZWN0LCBtZW1vKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEdlbmVyYWwgY2FzZSAqLworICAgIHN0ID0gRVRfU1RBVEVfR0xPQkFMOworICAgIGlmICghc3QtPmRlZXBjb3B5X29iaikgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImRlZXBjb3B5IGhlbHBlciBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgYXJncyA9IFB5VHVwbGVfUGFjaygyLCBvYmplY3QsIG1lbW8pOworICAgIGlmICghYXJncykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChzdC0+ZGVlcGNvcHlfb2JqLCBhcmdzKTsKKyAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCiAvKltjbGluaWMgaW5wdXRdCiBfZWxlbWVudHRyZWUuRWxlbWVudC5fX3NpemVvZl9fIC0+IFB5X3NzaXplX3QKIApAQCAtMTg5Miw5MiArMTkyMCw5MCBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QqCi1lbGVtZW50X2dldGF0dHJvKEVsZW1lbnRPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBuYW1lb2JqKQorZWxlbWVudF90YWdfZ2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0gICAgUHlPYmplY3QqIHJlczsKLSAgICBjaGFyICpuYW1lID0gIiI7Ci0KLSAgICBpZiAoUHlVbmljb2RlX0NoZWNrKG5hbWVvYmopKQotICAgICAgICBuYW1lID0gX1B5VW5pY29kZV9Bc1N0cmluZyhuYW1lb2JqKTsKLQotICAgIGlmIChuYW1lID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogaGFuZGxlIGNvbW1vbiBhdHRyaWJ1dGVzIGZpcnN0ICovCi0gICAgaWYgKHN0cmNtcChuYW1lLCAidGFnIikgPT0gMCkgewotICAgICAgICByZXMgPSBzZWxmLT50YWc7Ci0gICAgICAgIFB5X0lOQ1JFRihyZXMpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJ0ZXh0IikgPT0gMCkgewotICAgICAgICByZXMgPSBlbGVtZW50X2dldF90ZXh0KHNlbGYpOwotICAgICAgICBQeV9YSU5DUkVGKHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfQotCi0gICAgLyogbWV0aG9kcyAqLwotICAgIHJlcyA9IFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyKChQeU9iamVjdCopIHNlbGYsIG5hbWVvYmopOwotICAgIGlmIChyZXMpCi0gICAgICAgIHJldHVybiByZXM7Ci0KLSAgICAvKiBsZXNzIGNvbW1vbiBhdHRyaWJ1dGVzICovCi0gICAgaWYgKHN0cmNtcChuYW1lLCAidGFpbCIpID09IDApIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgcmVzID0gZWxlbWVudF9nZXRfdGFpbChzZWxmKTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAiYXR0cmliIikgPT0gMCkgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBpZiAoIXNlbGYtPmV4dHJhKSB7Ci0gICAgICAgICAgICBpZiAoY3JlYXRlX2V4dHJhKHNlbGYsIE5VTEwpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXMgPSBlbGVtZW50X2dldF9hdHRyaWIoc2VsZik7Ci0gICAgfQotCi0gICAgaWYgKCFyZXMpCi0gICAgICAgIHJldHVybiBOVUxMOwotCisgICAgUHlPYmplY3QgKnJlcyA9IHNlbGYtPnRhZzsKICAgICBQeV9JTkNSRUYocmVzKTsKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgaW50Ci1lbGVtZW50X3NldGF0dHJvKEVsZW1lbnRPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBuYW1lb2JqLCBQeU9iamVjdCogdmFsdWUpCitzdGF0aWMgUHlPYmplY3QqCitlbGVtZW50X3RleHRfZ2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpCiB7Ci0gICAgY2hhciAqbmFtZSA9ICIiOworICAgIFB5T2JqZWN0ICpyZXMgPSBlbGVtZW50X2dldF90ZXh0KHNlbGYpOworICAgIFB5X1hJTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQogCi0gICAgaWYgKHZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotICAgICAgICAgICAgImNhbid0IGRlbGV0ZSBhdHRyaWJ1dGUiKTsKLSAgICAgICAgcmV0dXJuIC0xOworc3RhdGljIFB5T2JqZWN0KgorZWxlbWVudF90YWlsX2dldHRlcihFbGVtZW50T2JqZWN0ICpzZWxmLCB2b2lkICpjbG9zdXJlKQoreworICAgIFB5T2JqZWN0ICpyZXMgPSBlbGVtZW50X2dldF90YWlsKHNlbGYpOworICAgIFB5X1hJTkNSRUYocmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgUHlPYmplY3QqCitlbGVtZW50X2F0dHJpYl9nZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBQeU9iamVjdCAqcmVzOworICAgIGlmICghc2VsZi0+ZXh0cmEpIHsKKyAgICAgICAgaWYgKGNyZWF0ZV9leHRyYShzZWxmLCBOVUxMKSA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9DaGVjayhuYW1lb2JqKSkKLSAgICAgICAgbmFtZSA9IF9QeVVuaWNvZGVfQXNTdHJpbmcobmFtZW9iaik7Ci0gICAgaWYgKG5hbWUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOworICAgIHJlcyA9IGVsZW1lbnRfZ2V0X2F0dHJpYihzZWxmKTsKKyAgICBQeV9YSU5DUkVGKHJlcyk7CisgICAgcmV0dXJuIHJlczsKK30KIAotICAgIGlmIChzdHJjbXAobmFtZSwgInRhZyIpID09IDApIHsKLSAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgICAgICAgUHlfU0VUUkVGKHNlbGYtPnRhZywgdmFsdWUpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKG5hbWUsICJ0ZXh0IikgPT0gMCkgewotICAgICAgICBQeV9ERUNSRUYoSk9JTl9PQkooc2VsZi0+dGV4dCkpOwotICAgICAgICBzZWxmLT50ZXh0ID0gdmFsdWU7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmLT50ZXh0KTsKLSAgICB9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCAidGFpbCIpID09IDApIHsKLSAgICAgICAgUHlfREVDUkVGKEpPSU5fT0JKKHNlbGYtPnRhaWwpKTsKLSAgICAgICAgc2VsZi0+dGFpbCA9IHZhbHVlOwotICAgICAgICBQeV9JTkNSRUYoc2VsZi0+dGFpbCk7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAobmFtZSwgImF0dHJpYiIpID09IDApIHsKLSAgICAgICAgaWYgKCFzZWxmLT5leHRyYSkgewotICAgICAgICAgICAgaWYgKGNyZWF0ZV9leHRyYShzZWxmLCBOVUxMKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgICAgIFB5X1NFVFJFRihzZWxmLT5leHRyYS0+YXR0cmliLCB2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotICAgICAgICAgICAgIkNhbid0IHNldCBhcmJpdHJhcnkgYXR0cmlidXRlcyBvbiBFbGVtZW50Iik7Ci0gICAgICAgIHJldHVybiAtMTsKKy8qIG1hY3JvIGZvciBzZXR0ZXIgdmFsaWRhdGlvbiAqLworI2RlZmluZSBfVkFMSURBVEVfQVRUUl9WQUxVRShWKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKFYpID09IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5RXJyX1NldFN0cmluZyggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlFeGNfQXR0cmlidXRlRXJyb3IsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJjYW4ndCBkZWxldGUgZWxlbWVudCBhdHRyaWJ1dGUiKTsgICAgICBcCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAorc3RhdGljIGludAorZWxlbWVudF90YWdfc2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBfVkFMSURBVEVfQVRUUl9WQUxVRSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9TRVRSRUYoc2VsZi0+dGFnLCB2YWx1ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VsZW1lbnRfdGV4dF9zZXR0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKQoreworICAgIF9WQUxJREFURV9BVFRSX1ZBTFVFKHZhbHVlKTsKKyAgICBQeV9JTkNSRUYodmFsdWUpOworICAgIFB5X0RFQ1JFRihKT0lOX09CSihzZWxmLT50ZXh0KSk7CisgICAgc2VsZi0+dGV4dCA9IHZhbHVlOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitlbGVtZW50X3RhaWxfc2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBfVkFMSURBVEVfQVRUUl9WQUxVRSh2YWx1ZSk7CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9ERUNSRUYoSk9JTl9PQkooc2VsZi0+dGFpbCkpOworICAgIHNlbGYtPnRhaWwgPSB2YWx1ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZWxlbWVudF9hdHRyaWJfc2V0dGVyKEVsZW1lbnRPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY2xvc3VyZSkKK3sKKyAgICBfVkFMSURBVEVfQVRUUl9WQUxVRSh2YWx1ZSk7CisgICAgaWYgKCFzZWxmLT5leHRyYSkgeworICAgICAgICBpZiAoY3JlYXRlX2V4dHJhKHNlbGYsIE5VTEwpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgUHlfSU5DUkVGKHZhbHVlKTsKKyAgICBQeV9TRVRSRUYoc2VsZi0+ZXh0cmEtPmF0dHJpYiwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0xOTk3LDIyICsyMDIzLDIyIEBACiAgKiBwcmUtb3JkZXIgdHJhdmVyc2FsLiBUbyBrZWVwIHRyYWNrIG9mIHdoaWNoIHN1Yi1lbGVtZW50IHNob3VsZCBiZSByZXR1cm5lZAogICogbmV4dCwgYSBzdGFjayBvZiBwYXJlbnRzIGlzIG1haW50YWluZWQuIFRoaXMgaXMgYSBzdGFuZGFyZCBzdGFjay1iYXNlZAogICogaXRlcmF0aXZlIHByZS1vcmRlciB0cmF2ZXJzYWwgb2YgYSB0cmVlLgotICogVGhlIHN0YWNrIGlzIG1hbmFnZWQgdXNpbmcgYSBzaW5nbGUtbGlua2VkIGxpc3Qgc3RhcnRpbmcgYXQgcGFyZW50X3N0YWNrLgotICogRWFjaCBzdGFjayBub2RlIGNvbnRhaW5zIHRoZSBzYXZlZCBwYXJlbnQgdG8gd2hpY2ggd2Ugc2hvdWxkIHJldHVybiBhZnRlcgorICogVGhlIHN0YWNrIGlzIG1hbmFnZWQgdXNpbmcgYSBjb250aW51b3VzIGFycmF5LgorICogRWFjaCBzdGFjayBpdGVtIGNvbnRhaW5zIHRoZSBzYXZlZCBwYXJlbnQgdG8gd2hpY2ggd2Ugc2hvdWxkIHJldHVybiBhZnRlcgogICogdGhlIGN1cnJlbnQgb25lIGlzIGV4aGF1c3RlZCwgYW5kIHRoZSBuZXh0IGNoaWxkIHRvIGV4YW1pbmUgaW4gdGhhdCBwYXJlbnQuCiAgKi8KIHR5cGVkZWYgc3RydWN0IFBhcmVudExvY2F0b3JfdCB7CiAgICAgRWxlbWVudE9iamVjdCAqcGFyZW50OwogICAgIFB5X3NzaXplX3QgY2hpbGRfaW5kZXg7Ci0gICAgc3RydWN0IFBhcmVudExvY2F0b3JfdCAqbmV4dDsKIH0gUGFyZW50TG9jYXRvcjsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFB5T2JqZWN0X0hFQUQKICAgICBQYXJlbnRMb2NhdG9yICpwYXJlbnRfc3RhY2s7CisgICAgUHlfc3NpemVfdCBwYXJlbnRfc3RhY2tfdXNlZDsKKyAgICBQeV9zc2l6ZV90IHBhcmVudF9zdGFja19zaXplOwogICAgIEVsZW1lbnRPYmplY3QgKnJvb3RfZWxlbWVudDsKICAgICBQeU9iamVjdCAqc291Z2h0X3RhZzsKLSAgICBpbnQgcm9vdF9kb25lOwogICAgIGludCBnZXR0ZXh0OwogfSBFbGVtZW50SXRlck9iamVjdDsKIApAQCAtMjAyMCwxMyArMjA0NiwxMSBAQAogc3RhdGljIHZvaWQKIGVsZW1lbnRpdGVyX2RlYWxsb2MoRWxlbWVudEl0ZXJPYmplY3QgKml0KQogewotICAgIFBhcmVudExvY2F0b3IgKnAgPSBpdC0+cGFyZW50X3N0YWNrOwotICAgIHdoaWxlIChwKSB7Ci0gICAgICAgIFBhcmVudExvY2F0b3IgKnRlbXAgPSBwOwotICAgICAgICBQeV9YREVDUkVGKHAtPnBhcmVudCk7Ci0gICAgICAgIHAgPSBwLT5uZXh0OwotICAgICAgICBQeU9iamVjdF9GcmVlKHRlbXApOwotICAgIH0KKyAgICBQeV9zc2l6ZV90IGkgPSBpdC0+cGFyZW50X3N0YWNrX3VzZWQ7CisgICAgaXQtPnBhcmVudF9zdGFja191c2VkID0gMDsKKyAgICB3aGlsZSAoaS0tKQorICAgICAgICBQeV9YREVDUkVGKGl0LT5wYXJlbnRfc3RhY2tbaV0ucGFyZW50KTsKKyAgICBQeU1lbV9GcmVlKGl0LT5wYXJlbnRfc3RhY2spOwogCiAgICAgUHlfWERFQ1JFRihpdC0+c291Z2h0X3RhZyk7CiAgICAgUHlfWERFQ1JFRihpdC0+cm9vdF9lbGVtZW50KTsKQEAgLTIwMzgsMTEgKzIwNjIsOSBAQAogc3RhdGljIGludAogZWxlbWVudGl0ZXJfdHJhdmVyc2UoRWxlbWVudEl0ZXJPYmplY3QgKml0LCB2aXNpdHByb2MgdmlzaXQsIHZvaWQgKmFyZykKIHsKLSAgICBQYXJlbnRMb2NhdG9yICpwID0gaXQtPnBhcmVudF9zdGFjazsKLSAgICB3aGlsZSAocCkgewotICAgICAgICBQeV9WSVNJVChwLT5wYXJlbnQpOwotICAgICAgICBwID0gcC0+bmV4dDsKLSAgICB9CisgICAgUHlfc3NpemVfdCBpID0gaXQtPnBhcmVudF9zdGFja191c2VkOworICAgIHdoaWxlIChpLS0pCisgICAgICAgIFB5X1ZJU0lUKGl0LT5wYXJlbnRfc3RhY2tbaV0ucGFyZW50KTsKIAogICAgIFB5X1ZJU0lUKGl0LT5yb290X2VsZW1lbnQpOwogICAgIFB5X1ZJU0lUKGl0LT5zb3VnaHRfdGFnKTsKQEAgLTIwNTEsMTcgKzIwNzMsMjUgQEAKIAogLyogSGVscGVyIGZ1bmN0aW9uIGZvciBlbGVtZW50aXRlcl9uZXh0LiBBZGQgYSBuZXcgcGFyZW50IHRvIHRoZSBwYXJlbnQgc3RhY2suCiAgKi8KLXN0YXRpYyBQYXJlbnRMb2NhdG9yICoKLXBhcmVudF9zdGFja19wdXNoX25ldyhQYXJlbnRMb2NhdG9yICpzdGFjaywgRWxlbWVudE9iamVjdCAqcGFyZW50KQorc3RhdGljIGludAorcGFyZW50X3N0YWNrX3B1c2hfbmV3KEVsZW1lbnRJdGVyT2JqZWN0ICppdCwgRWxlbWVudE9iamVjdCAqcGFyZW50KQogewotICAgIFBhcmVudExvY2F0b3IgKm5ld19ub2RlID0gUHlPYmplY3RfTWFsbG9jKHNpemVvZihQYXJlbnRMb2NhdG9yKSk7Ci0gICAgaWYgKG5ld19ub2RlKSB7Ci0gICAgICAgIG5ld19ub2RlLT5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIFB5X0lOQ1JFRihwYXJlbnQpOwotICAgICAgICBuZXdfbm9kZS0+Y2hpbGRfaW5kZXggPSAwOwotICAgICAgICBuZXdfbm9kZS0+bmV4dCA9IHN0YWNrOworICAgIFBhcmVudExvY2F0b3IgKml0ZW07CisKKyAgICBpZiAoaXQtPnBhcmVudF9zdGFja191c2VkID49IGl0LT5wYXJlbnRfc3RhY2tfc2l6ZSkgeworICAgICAgICBQeV9zc2l6ZV90IG5ld19zaXplID0gaXQtPnBhcmVudF9zdGFja19zaXplICogMjsgIC8qIG5ldmVyIG92ZXJmbG93ICovCisgICAgICAgIFBhcmVudExvY2F0b3IgKnBhcmVudF9zdGFjayA9IGl0LT5wYXJlbnRfc3RhY2s7CisgICAgICAgIFB5TWVtX1Jlc2l6ZShwYXJlbnRfc3RhY2ssIFBhcmVudExvY2F0b3IsIG5ld19zaXplKTsKKyAgICAgICAgaWYgKHBhcmVudF9zdGFjayA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpdC0+cGFyZW50X3N0YWNrID0gcGFyZW50X3N0YWNrOworICAgICAgICBpdC0+cGFyZW50X3N0YWNrX3NpemUgPSBuZXdfc2l6ZTsKICAgICB9Ci0gICAgcmV0dXJuIG5ld19ub2RlOworICAgIGl0ZW0gPSBpdC0+cGFyZW50X3N0YWNrICsgaXQtPnBhcmVudF9zdGFja191c2VkKys7CisgICAgUHlfSU5DUkVGKHBhcmVudCk7CisgICAgaXRlbS0+cGFyZW50ID0gcGFyZW50OworICAgIGl0ZW0tPmNoaWxkX2luZGV4ID0gMDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTIwNzgsMTUxICsyMTA4LDkxIEBACiAgICAgICogICAtIGl0ZXJ0ZXh0KCkgYWxzbyBoYXMgdG8gaGFuZGxlIHRhaWwsIGFmdGVyIGZpbmlzaGluZyB3aXRoIGFsbCB0aGUKICAgICAgKiAgICAgY2hpbGRyZW4gb2YgYSBub2RlLgogICAgICAqLwotICAgIEVsZW1lbnRPYmplY3QgKmN1cl9wYXJlbnQ7Ci0gICAgUHlfc3NpemVfdCBjaGlsZF9pbmRleDsKICAgICBpbnQgcmM7CiAgICAgRWxlbWVudE9iamVjdCAqZWxlbTsKKyAgICBQeU9iamVjdCAqdGV4dDsKIAogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIC8qIEhhbmRsZSB0aGUgY2FzZSByZWFjaGVkIGluIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBpdGVyYXRpb24sIHdoZXJlCi0gICAgICAgICAqIHRoZSBwYXJlbnQgc3RhY2sgaXMgZW1wdHkuIFRoZSByb290X2RvbmUgZmxhZyBnaXZlcyB1cyBpbmRpY2F0aW9uCi0gICAgICAgICAqIHdoZXRoZXIgd2UndmUganVzdCBzdGFydGVkIGl0ZXJhdGluZyAoc28gcm9vdF9kb25lIGlzIDApLCBpbiB3aGljaAotICAgICAgICAgKiBjYXNlIHRoZSByb290IGlzIHJldHVybmVkLiBJZiByb290X2RvbmUgaXMgMSBhbmQgd2UncmUgaGVyZSwgdGhlCisgICAgICAgICAqIHRoZSBwYXJlbnQgc3RhY2sgaXMgZW1wdHkuIElmIHJvb3RfZWxlbWVudCBpcyBOVUxMIGFuZCB3ZSdyZSBoZXJlLCB0aGUKICAgICAgICAgICogaXRlcmF0b3IgaXMgZXhoYXVzdGVkLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKCFpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQpIHsKLSAgICAgICAgICAgIGlmIChpdC0+cm9vdF9kb25lKSB7CisgICAgICAgIGlmICghaXQtPnBhcmVudF9zdGFja191c2VkKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5yb290X2VsZW1lbnQpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXROb25lKFB5RXhjX1N0b3BJdGVyYXRpb24pOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlbGVtID0gaXQtPnJvb3RfZWxlbWVudDsKLSAgICAgICAgICAgICAgICBpdC0+cGFyZW50X3N0YWNrID0gcGFyZW50X3N0YWNrX3B1c2hfbmV3KGl0LT5wYXJlbnRfc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtKTsKLSAgICAgICAgICAgICAgICBpZiAoIWl0LT5wYXJlbnRfc3RhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgIGl0LT5yb290X2RvbmUgPSAxOwotICAgICAgICAgICAgICAgIHJjID0gKGl0LT5zb3VnaHRfdGFnID09IFB5X05vbmUpOwotICAgICAgICAgICAgICAgIGlmICghcmMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWxlbS0+dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c291Z2h0X3RhZywgUHlfRVEpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0LT5nZXR0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGV4dCA9IGVsZW1lbnRfZ2V0X3RleHQoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYyA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWVsZW07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTZWUgaWYgdGhlcmUgYXJlIGNoaWxkcmVuIGxlZnQgdG8gdHJhdmVyc2UgaW4gdGhlIGN1cnJlbnQgcGFyZW50LiBJZgotICAgICAgICAgKiB5ZXMsIHZpc2l0IHRoZSBuZXh0IGNoaWxkLiBJZiBub3QsIHBvcCB0aGUgc3RhY2sgYW5kIHRyeSBhZ2Fpbi4KLSAgICAgICAgICovCi0gICAgICAgIGN1cl9wYXJlbnQgPSBpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQ7Ci0gICAgICAgIGNoaWxkX2luZGV4ID0gaXQtPnBhcmVudF9zdGFjay0+Y2hpbGRfaW5kZXg7Ci0gICAgICAgIGlmIChjdXJfcGFyZW50LT5leHRyYSAmJiBjaGlsZF9pbmRleCA8IGN1cl9wYXJlbnQtPmV4dHJhLT5sZW5ndGgpIHsKLSAgICAgICAgICAgIGVsZW0gPSAoRWxlbWVudE9iamVjdCAqKWN1cl9wYXJlbnQtPmV4dHJhLT5jaGlsZHJlbltjaGlsZF9pbmRleF07Ci0gICAgICAgICAgICBpdC0+cGFyZW50X3N0YWNrLT5jaGlsZF9pbmRleCsrOwotICAgICAgICAgICAgaXQtPnBhcmVudF9zdGFjayA9IHBhcmVudF9zdGFja19wdXNoX25ldyhpdC0+cGFyZW50X3N0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtKTsKLSAgICAgICAgICAgIGlmICghaXQtPnBhcmVudF9zdGFjaykgewotICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKLSAgICAgICAgICAgIGlmIChpdC0+Z2V0dGV4dCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp0ZXh0ID0gZWxlbWVudF9nZXRfdGV4dChlbGVtKTsKLSAgICAgICAgICAgICAgICBpZiAoIXRleHQpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHRleHQpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICByYyA9IFB5T2JqZWN0X0lzVHJ1ZSh0ZXh0KTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPiAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJjID0gKGl0LT5zb3VnaHRfdGFnID09IFB5X05vbmUpOwotICAgICAgICAgICAgICAgIGlmICghcmMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWxlbS0+dGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+c291Z2h0X3RhZywgUHlfRVEpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWVsZW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsZW0gPSBpdC0+cm9vdF9lbGVtZW50OyAgLyogc3RlYWxzIGEgcmVmZXJlbmNlICovCisgICAgICAgICAgICBpdC0+cm9vdF9lbGVtZW50ID0gTlVMTDsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICp0YWlsOwotICAgICAgICAgICAgUGFyZW50TG9jYXRvciAqbmV4dDsKLSAgICAgICAgICAgIGlmIChpdC0+Z2V0dGV4dCkgewotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihjdXJfcGFyZW50KTsKLSAgICAgICAgICAgICAgICB0YWlsID0gZWxlbWVudF9nZXRfdGFpbChjdXJfcGFyZW50KTsKLSAgICAgICAgICAgICAgICBpZiAoIXRhaWwpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGN1cl9wYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHRhaWwpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJfcGFyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRhaWwgPSBQeV9Ob25lOwotICAgICAgICAgICAgICAgIFB5X0lOQ1JFRih0YWlsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5leHQgPSBpdC0+cGFyZW50X3N0YWNrLT5uZXh0OwotICAgICAgICAgICAgY3VyX3BhcmVudCA9IGl0LT5wYXJlbnRfc3RhY2stPnBhcmVudDsKLSAgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUoaXQtPnBhcmVudF9zdGFjayk7Ci0gICAgICAgICAgICBpdC0+cGFyZW50X3N0YWNrID0gbmV4dDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYoY3VyX3BhcmVudCk7Ci0KLSAgICAgICAgICAgIC8qIE5vdGUgdGhhdCBleHRyYSBjb25kaXRpb24gb24gaXQtPnBhcmVudF9zdGFjay0+cGFyZW50IGhlcmU7Ci0gICAgICAgICAgICAgKiB0aGlzIGlzIGJlY2F1c2UgaXRlcnRleHQoKSBpcyBzdXBwb3NlZCB0byBvbmx5IHJldHVybiAqaW5uZXIqCi0gICAgICAgICAgICAgKiB0ZXh0LCBub3QgdGV4dCBmb2xsb3dpbmcgdGhlIGVsZW1lbnQgaXQgYmVnYW4gaXRlcmF0aW9uIHdpdGguCisgICAgICAgICAgICAvKiBTZWUgaWYgdGhlcmUgYXJlIGNoaWxkcmVuIGxlZnQgdG8gdHJhdmVyc2UgaW4gdGhlIGN1cnJlbnQgcGFyZW50LiBJZgorICAgICAgICAgICAgICogeWVzLCB2aXNpdCB0aGUgbmV4dCBjaGlsZC4gSWYgbm90LCBwb3AgdGhlIHN0YWNrIGFuZCB0cnkgYWdhaW4uCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChpdC0+cGFyZW50X3N0YWNrLT5wYXJlbnQpIHsKLSAgICAgICAgICAgICAgICByYyA9IFB5T2JqZWN0X0lzVHJ1ZSh0YWlsKTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPiAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFpbDsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGFpbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBQYXJlbnRMb2NhdG9yICppdGVtID0gJml0LT5wYXJlbnRfc3RhY2tbaXQtPnBhcmVudF9zdGFja191c2VkIC0gMV07CisgICAgICAgICAgICBQeV9zc2l6ZV90IGNoaWxkX2luZGV4ID0gaXRlbS0+Y2hpbGRfaW5kZXg7CisgICAgICAgICAgICBFbGVtZW50T2JqZWN0RXh0cmEgKmV4dHJhOworICAgICAgICAgICAgZWxlbSA9IGl0ZW0tPnBhcmVudDsKKyAgICAgICAgICAgIGV4dHJhID0gZWxlbS0+ZXh0cmE7CisgICAgICAgICAgICBpZiAoIWV4dHJhIHx8IGNoaWxkX2luZGV4ID49IGV4dHJhLT5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpdC0+cGFyZW50X3N0YWNrX3VzZWQtLTsKKyAgICAgICAgICAgICAgICAvKiBOb3RlIHRoYXQgZXh0cmEgY29uZGl0aW9uIG9uIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCBoZXJlOworICAgICAgICAgICAgICAgICAqIHRoaXMgaXMgYmVjYXVzZSBpdGVydGV4dCgpIGlzIHN1cHBvc2VkIHRvIG9ubHkgcmV0dXJuICppbm5lcioKKyAgICAgICAgICAgICAgICAgKiB0ZXh0LCBub3QgdGV4dCBmb2xsb3dpbmcgdGhlIGVsZW1lbnQgaXQgYmVnYW4gaXRlcmF0aW9uIHdpdGguCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGl0LT5nZXR0ZXh0ICYmIGl0LT5wYXJlbnRfc3RhY2tfdXNlZCkgeworICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF9nZXRfdGFpbChlbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBnZXR0ZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodGFpbCk7Ci0gICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVsZW0gPSAoRWxlbWVudE9iamVjdCAqKWV4dHJhLT5jaGlsZHJlbltjaGlsZF9pbmRleF07CisgICAgICAgICAgICBpdGVtLT5jaGlsZF9pbmRleCsrOworICAgICAgICAgICAgUHlfSU5DUkVGKGVsZW0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmVudF9zdGFja19wdXNoX25ldyhpdCwgZWxlbSkgPCAwKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYoZWxlbSk7CisgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0LT5nZXR0ZXh0KSB7CisgICAgICAgICAgICB0ZXh0ID0gZWxlbWVudF9nZXRfdGV4dChlbGVtKTsKKyAgICAgICAgICAgIGdvdG8gZ2V0dGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpdC0+c291Z2h0X3RhZyA9PSBQeV9Ob25lKQorICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWVsZW07CisKKyAgICAgICAgcmMgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWxlbS0+dGFnLCBpdC0+c291Z2h0X3RhZywgUHlfRVEpOworICAgICAgICBpZiAocmMgPiAwKQorICAgICAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWVsZW07CisKKyAgICAgICAgUHlfREVDUkVGKGVsZW0pOworICAgICAgICBpZiAocmMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGNvbnRpbnVlOworCitnZXR0ZXh0OgorICAgICAgICBpZiAoIXRleHQpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICh0ZXh0ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih0ZXh0KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihlbGVtKTsKKyAgICAgICAgICAgIHJjID0gUHlPYmplY3RfSXNUcnVlKHRleHQpOworICAgICAgICAgICAgaWYgKHJjID4gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgICAgIFB5X0RFQ1JFRih0ZXh0KTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyNzQsNiArMjI0NCw3IEBACiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KIH07CiAKKyNkZWZpbmUgSU5JVF9QQVJFTlRfU1RBQ0tfU0laRSA4CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjcmVhdGVfZWxlbWVudGl0ZXIoRWxlbWVudE9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnRhZywgaW50IGdldHRleHQpCkBAIC0yMjg2LDIyICsyMjU3LDIwIEBACiAKICAgICBQeV9JTkNSRUYodGFnKTsKICAgICBpdC0+c291Z2h0X3RhZyA9IHRhZzsKLSAgICBpdC0+cm9vdF9kb25lID0gMDsKICAgICBpdC0+Z2V0dGV4dCA9IGdldHRleHQ7CiAgICAgUHlfSU5DUkVGKHNlbGYpOwogICAgIGl0LT5yb290X2VsZW1lbnQgPSBzZWxmOwogCiAgICAgUHlPYmplY3RfR0NfVHJhY2soaXQpOwogCi0gICAgaXQtPnBhcmVudF9zdGFjayA9IFB5T2JqZWN0X01hbGxvYyhzaXplb2YoUGFyZW50TG9jYXRvcikpOworICAgIGl0LT5wYXJlbnRfc3RhY2sgPSBQeU1lbV9OZXcoUGFyZW50TG9jYXRvciwgSU5JVF9QQVJFTlRfU1RBQ0tfU0laRSk7CiAgICAgaWYgKGl0LT5wYXJlbnRfc3RhY2sgPT0gTlVMTCkgewogICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaXQtPnBhcmVudF9zdGFjay0+cGFyZW50ID0gTlVMTDsKLSAgICBpdC0+cGFyZW50X3N0YWNrLT5jaGlsZF9pbmRleCA9IDA7Ci0gICAgaXQtPnBhcmVudF9zdGFjay0+bmV4dCA9IE5VTEw7CisgICAgaXQtPnBhcmVudF9zdGFja191c2VkID0gMDsKKyAgICBpdC0+cGFyZW50X3N0YWNrX3NpemUgPSBJTklUX1BBUkVOVF9TVEFDS19TSVpFOwogCiAgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQpAQCAtMjMyNiw3ICsyMjk1LDcgQEAKICAgICBQeU9iamVjdCAqZWxlbWVudF9mYWN0b3J5OwogCiAgICAgLyogZWxlbWVudCB0cmFjaW5nICovCi0gICAgUHlPYmplY3QgKmV2ZW50czsgLyogbGlzdCBvZiBldmVudHMsIG9yIE5VTEwgaWYgbm90IGNvbGxlY3RpbmcgKi8KKyAgICBQeU9iamVjdCAqZXZlbnRzX2FwcGVuZDsgLyogdGhlIGFwcGVuZCBtZXRob2Qgb2YgdGhlIGxpc3Qgb2YgZXZlbnRzLCBvciBOVUxMICovCiAgICAgUHlPYmplY3QgKnN0YXJ0X2V2ZW50X29iajsgLyogZXZlbnQgb2JqZWN0cyAoTlVMTCB0byBpZ25vcmUpICovCiAgICAgUHlPYmplY3QgKmVuZF9ldmVudF9vYmo7CiAgICAgUHlPYmplY3QgKnN0YXJ0X25zX2V2ZW50X29iajsKQEAgLTIzNjEsNyArMjMzMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgdC0+aW5kZXggPSAwOwogCi0gICAgICAgIHQtPmV2ZW50cyA9IE5VTEw7CisgICAgICAgIHQtPmV2ZW50c19hcHBlbmQgPSBOVUxMOwogICAgICAgICB0LT5zdGFydF9ldmVudF9vYmogPSB0LT5lbmRfZXZlbnRfb2JqID0gTlVMTDsKICAgICAgICAgdC0+c3RhcnRfbnNfZXZlbnRfb2JqID0gdC0+ZW5kX25zX2V2ZW50X29iaiA9IE5VTEw7CiAgICAgfQpAQCAtMjM4MCwxMyArMjM0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZWxlbWVudF9mYWN0b3J5KQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkxY2ZhNzU1ODk3MGVlOTYgaW5wdXQ9MWI0MjRlZWVmYzM1MjQ5Y10qLwogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAoZWxlbWVudF9mYWN0b3J5KSB7CiAgICAgICAgIFB5X0lOQ1JFRihlbGVtZW50X2ZhY3RvcnkpOwotICAgICAgICB0bXAgPSBzZWxmLT5lbGVtZW50X2ZhY3Rvcnk7Ci0gICAgICAgIHNlbGYtPmVsZW1lbnRfZmFjdG9yeSA9IGVsZW1lbnRfZmFjdG9yeTsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICBQeV9YU0VUUkVGKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSwgZWxlbWVudF9mYWN0b3J5KTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTI0MTEsNyArMjM3Niw3IEBACiAgICAgUHlfQ0xFQVIoc2VsZi0+c3RhcnRfbnNfZXZlbnRfb2JqKTsKICAgICBQeV9DTEVBUihzZWxmLT5lbmRfZXZlbnRfb2JqKTsKICAgICBQeV9DTEVBUihzZWxmLT5zdGFydF9ldmVudF9vYmopOwotICAgIFB5X0NMRUFSKHNlbGYtPmV2ZW50cyk7CisgICAgUHlfQ0xFQVIoc2VsZi0+ZXZlbnRzX2FwcGVuZCk7CiAgICAgUHlfQ0xFQVIoc2VsZi0+c3RhY2spOwogICAgIFB5X0NMRUFSKHNlbGYtPmRhdGEpOwogICAgIFB5X0NMRUFSKHNlbGYtPmxhc3QpOwpAQCAtMjQ5MiwxMyArMjQ1NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpub2RlKQogewogICAgIGlmIChhY3Rpb24gIT0gTlVMTCkgewotICAgICAgICBQeU9iamVjdCAqcmVzID0gUHlUdXBsZV9QYWNrKDIsIGFjdGlvbiwgbm9kZSk7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgIFB5T2JqZWN0ICpldmVudCA9IFB5VHVwbGVfUGFjaygyLCBhY3Rpb24sIG5vZGUpOworICAgICAgICBpZiAoZXZlbnQgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmVzID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhzZWxmLT5ldmVudHNfYXBwZW5kLCBldmVudCwgTlVMTCk7CisgICAgICAgIFB5X0RFQ1JFRihldmVudCk7CiAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQoc2VsZi0+ZXZlbnRzLCByZXMpIDwgMCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KICAgICAgICAgUHlfREVDUkVGKHJlcyk7CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtMjUyNywxMCArMjQ5MywxNyBAQAogICAgICAgICBzZWxmLT5kYXRhID0gTlVMTDsKICAgICB9CiAKLSAgICBpZiAoc2VsZi0+ZWxlbWVudF9mYWN0b3J5ICYmIHNlbGYtPmVsZW1lbnRfZmFjdG9yeSAhPSBQeV9Ob25lKSB7Ci0gICAgICAgIG5vZGUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+ZWxlbWVudF9mYWN0b3J5LCAiT08iLCB0YWcsIGF0dHJpYik7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoIXNlbGYtPmVsZW1lbnRfZmFjdG9yeSB8fCBzZWxmLT5lbGVtZW50X2ZhY3RvcnkgPT0gUHlfTm9uZSkgewogICAgICAgICBub2RlID0gY3JlYXRlX25ld19lbGVtZW50KHRhZywgYXR0cmliKTsKKyAgICB9IGVsc2UgaWYgKGF0dHJpYiA9PSBQeV9Ob25lKSB7CisgICAgICAgIGF0dHJpYiA9IFB5RGljdF9OZXcoKTsKKyAgICAgICAgaWYgKCFhdHRyaWIpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbm9kZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihzZWxmLT5lbGVtZW50X2ZhY3RvcnksICJPTyIsIHRhZywgYXR0cmliKTsKKyAgICAgICAgUHlfREVDUkVGKGF0dHJpYik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBub2RlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKHNlbGYtPmVsZW1lbnRfZmFjdG9yeSwgIk9PIiwgdGFnLCBhdHRyaWIpOwogICAgIH0KICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yOTg5LDEyICsyOTYyLDggQEAKICAgICAgICAgICAgIGF0dHJpYl9pbiArPSAyOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogUGFzcyBhbiBlbXB0eSBkaWN0aW9uYXJ5IG9uICovCi0gICAgICAgIGF0dHJpYiA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgaWYgKCFhdHRyaWIpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih0YWcpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgYXR0cmliID0gUHlfTm9uZTsKICAgICB9CiAKICAgICBpZiAoVHJlZUJ1aWxkZXJfQ2hlY2tFeGFjdChzZWxmLT50YXJnZXQpKSB7CkBAIC0zMDAzLDYgKzI5NzIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgYXR0cmliKTsKICAgICB9CiAgICAgZWxzZSBpZiAoc2VsZi0+aGFuZGxlX3N0YXJ0KSB7CisgICAgICAgIGlmIChhdHRyaWIgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgUHlfREVDUkVGKGF0dHJpYik7CisgICAgICAgICAgICBhdHRyaWIgPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgICBpZiAoIWF0dHJpYikgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih0YWcpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oc2VsZi0+aGFuZGxlX3N0YXJ0LCAiT08iLCB0YWcsIGF0dHJpYik7CiAgICAgfSBlbHNlCiAgICAgICAgIHJlcyA9IE5VTEw7CkBAIC0zMDc2LDcgKzMwNTMsNyBAQAogICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoIXRhcmdldC0+ZXZlbnRzIHx8ICF0YXJnZXQtPnN0YXJ0X25zX2V2ZW50X29iaikKKyAgICBpZiAoIXRhcmdldC0+ZXZlbnRzX2FwcGVuZCB8fCAhdGFyZ2V0LT5zdGFydF9uc19ldmVudF9vYmopCiAgICAgICAgIHJldHVybjsKIAogICAgIGlmICghdXJpKQpAQCAtMzA5OSw3ICszMDc2LDcgQEAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgaWYgKCF0YXJnZXQtPmV2ZW50cykKKyAgICBpZiAoIXRhcmdldC0+ZXZlbnRzX2FwcGVuZCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgdHJlZWJ1aWxkZXJfYXBwZW5kX2V2ZW50KHRhcmdldCwgdGFyZ2V0LT5lbmRfbnNfZXZlbnRfb2JqLCBQeV9Ob25lKTsKQEAgLTM1ODgsNyArMzU2NSw3IEBACiAvKltjbGluaWMgaW5wdXRdCiBfZWxlbWVudHRyZWUuWE1MUGFyc2VyLl9zZXRldmVudHMKIAotICAgIGV2ZW50c19xdWV1ZTogb2JqZWN0KHN1YmNsYXNzX29mPScmUHlMaXN0X1R5cGUnKQorICAgIGV2ZW50c19xdWV1ZTogb2JqZWN0CiAgICAgZXZlbnRzX3RvX3JlcG9ydDogb2JqZWN0ID0gTm9uZQogICAgIC8KIApAQCAtMzU5OCwxMiArMzU3NSwxMiBAQAogX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9fc2V0ZXZlbnRzX2ltcGwoWE1MUGFyc2VyT2JqZWN0ICpzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmV2ZW50c19xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpldmVudHNfdG9fcmVwb3J0KQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0NDAwOTI5MjJiMTNlZDEgaW5wdXQ9NTlkYjk3NDI5MTBjNjE3NF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE0NDAwOTI5MjJiMTNlZDEgaW5wdXQ9YWJmOTA4MzBhMWMzYjBmY10qLwogewogICAgIC8qIGFjdGl2YXRlIGVsZW1lbnQgZXZlbnQgcmVwb3J0aW5nICovCiAgICAgUHlfc3NpemVfdCBpOwogICAgIFRyZWVCdWlsZGVyT2JqZWN0ICp0YXJnZXQ7Ci0gICAgUHlPYmplY3QgKmV2ZW50c19zZXE7CisgICAgUHlPYmplY3QgKmV2ZW50c19hcHBlbmQsICpldmVudHNfc2VxOwogCiAgICAgaWYgKCFUcmVlQnVpbGRlcl9DaGVja0V4YWN0KHNlbGYtPnRhcmdldCkpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKApAQCAtMzYxNiw4ICszNTkzLDEwIEBACiAKICAgICB0YXJnZXQgPSAoVHJlZUJ1aWxkZXJPYmplY3QqKSBzZWxmLT50YXJnZXQ7CiAKLSAgICBQeV9JTkNSRUYoZXZlbnRzX3F1ZXVlKTsKLSAgICBQeV9YU0VUUkVGKHRhcmdldC0+ZXZlbnRzLCBldmVudHNfcXVldWUpOworICAgIGV2ZW50c19hcHBlbmQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGV2ZW50c19xdWV1ZSwgImFwcGVuZCIpOworICAgIGlmIChldmVudHNfYXBwZW5kID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X1hTRVRSRUYodGFyZ2V0LT5ldmVudHNfYXBwZW5kLCBldmVudHNfYXBwZW5kKTsKIAogICAgIC8qIGNsZWFyIG91dCBleGlzdGluZyBldmVudHMgKi8KICAgICBQeV9DTEVBUih0YXJnZXQtPnN0YXJ0X2V2ZW50X29iaik7CkBAIC0zNzUwLDYgKzM3MjksMjYgQEAKICAgICAob2Jqb2JqYXJncHJvYykgZWxlbWVudF9hc3Nfc3Vic2NyLAogfTsKIAorc3RhdGljIFB5R2V0U2V0RGVmIGVsZW1lbnRfZ2V0c2V0bGlzdFtdID0geworICAgIHsidGFnIiwKKyAgICAgICAgKGdldHRlcillbGVtZW50X3RhZ19nZXR0ZXIsCisgICAgICAgIChzZXR0ZXIpZWxlbWVudF90YWdfc2V0dGVyLAorICAgICAgICAiQSBzdHJpbmcgaWRlbnRpZnlpbmcgd2hhdCBraW5kIG9mIGRhdGEgdGhpcyBlbGVtZW50IHJlcHJlc2VudHMifSwKKyAgICB7InRleHQiLAorICAgICAgICAoZ2V0dGVyKWVsZW1lbnRfdGV4dF9nZXR0ZXIsCisgICAgICAgIChzZXR0ZXIpZWxlbWVudF90ZXh0X3NldHRlciwKKyAgICAgICAgIkEgc3RyaW5nIG9mIHRleHQgZGlyZWN0bHkgYWZ0ZXIgdGhlIHN0YXJ0IHRhZywgb3IgTm9uZSJ9LAorICAgIHsidGFpbCIsCisgICAgICAgIChnZXR0ZXIpZWxlbWVudF90YWlsX2dldHRlciwKKyAgICAgICAgKHNldHRlcillbGVtZW50X3RhaWxfc2V0dGVyLAorICAgICAgICAiQSBzdHJpbmcgb2YgdGV4dCBkaXJlY3RseSBhZnRlciB0aGUgZW5kIHRhZywgb3IgTm9uZSJ9LAorICAgIHsiYXR0cmliIiwKKyAgICAgICAgKGdldHRlcillbGVtZW50X2F0dHJpYl9nZXR0ZXIsCisgICAgICAgIChzZXR0ZXIpZWxlbWVudF9hdHRyaWJfc2V0dGVyLAorICAgICAgICAiQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzIn0sCisgICAge05VTEx9LAorfTsKKwogc3RhdGljIFB5VHlwZU9iamVjdCBFbGVtZW50X1R5cGUgPSB7CiAgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCiAgICAgInhtbC5ldHJlZS5FbGVtZW50VHJlZS5FbGVtZW50Iiwgc2l6ZW9mKEVsZW1lbnRPYmplY3QpLCAwLApAQCAtMzc2Niw4ICszNzY1LDggQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N0ciAqLwotICAgIChnZXRhdHRyb2Z1bmMpZWxlbWVudF9nZXRhdHRybywgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCi0gICAgKHNldGF0dHJvZnVuYyllbGVtZW50X3NldGF0dHJvLCAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSB8IFB5X1RQRkxBR1NfSEFWRV9HQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLwpAQCAtMzc4MCw3ICszNzc5LDcgQEAKICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgIGVsZW1lbnRfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgZWxlbWVudF9nZXRzZXRsaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2dkYm1tb2R1bGUuYyBiL01vZHVsZXMvX2dkYm1tb2R1bGUuYwppbmRleCBiODQwYmY1Li5kYWFlNzFkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19nZGJtbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fZ2RibW1vZHVsZS5jCkBAIC02MTQsNyArNjE0LDcgQEAKICAgICByZXR1cm4gbmV3ZGJtb2JqZWN0KG5hbWUsIGlmbGFncywgbW9kZSk7CiB9CiAKLXN0YXRpYyBjaGFyIGRibW1vZHVsZV9vcGVuX2ZsYWdzW10gPSAicndjbiIKK3N0YXRpYyBjb25zdCBjaGFyIGRibW1vZHVsZV9vcGVuX2ZsYWdzW10gPSAicndjbiIKICNpZmRlZiBHREJNX0ZBU1QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZiIKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faGVhcHFtb2R1bGUuYyBiL01vZHVsZXMvX2hlYXBxbW9kdWxlLmMKaW5kZXggMTM2YWJmNS4uYjQ5OWUxZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faGVhcHFtb2R1bGUuYworKysgYi9Nb2R1bGVzL19oZWFwcW1vZHVsZS5jCkBAIC02Niw3ICs2Niw3IEBACiAKICAgICAvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCiAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsKLSAgICBsaW1pdCA9IGVuZHBvcyAvIDI7ICAgICAgICAgIC8qIHNtYWxsZXN0IHBvcyB0aGF0IGhhcyBubyBjaGlsZCAqLworICAgIGxpbWl0ID0gZW5kcG9zID4+IDE7ICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCiAgICAgd2hpbGUgKHBvcyA8IGxpbWl0KSB7CiAgICAgICAgIC8qIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLiAgICovCiAgICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KQEAgLTc4LDYgKzc4LDcgQEAKICAgICAgICAgICAgIGlmIChjbXAgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIGNoaWxkcG9zICs9ICgodW5zaWduZWQpY21wIF4gMSk7ICAgLyogaW5jcmVtZW50IHdoZW4gY21wPT0wICovCisgICAgICAgICAgICBhcnIgPSBfUHlMaXN0X0lURU1TKGhlYXApOyAgICAgICAgIC8qIGFyciBtYXkgaGF2ZSBjaGFuZ2VkICovCiAgICAgICAgICAgICBpZiAoZW5kcG9zICE9IFB5TGlzdF9HRVRfU0laRShoZWFwKSkgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIik7CkBAIC04NSw3ICs4Niw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4gKi8KLSAgICAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsKICAgICAgICAgdG1wMSA9IGFycltjaGlsZHBvc107CiAgICAgICAgIHRtcDIgPSBhcnJbcG9zXTsKICAgICAgICAgYXJyW2NoaWxkcG9zXSA9IHRtcDI7CkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICAgICBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzICgyKmorMS0xKS8yID0gaiBzbyBqLTEgaXMgdGhlIGxhcmdlc3QsCiAgICAgICAgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCiAgICAgKi8KLSAgICBmb3IgKGkgPSBuLzIgLSAxIDsgaSA+PSAwIDsgaS0tKQorICAgIGZvciAoaSA9IChuID4+IDEpIC0gMSA7IGkgPj0gMCA7IGktLSkKICAgICAgICAgaWYgKHNpZnR1cF9mdW5jKChQeUxpc3RPYmplY3QgKiloZWFwLCBpKSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgIFB5X1JFVFVSTl9OT05FOwpAQCAtNDIwLDcgKzQyMCw3IEBACiAKICAgICAvKiBCdWJibGUgdXAgdGhlIHNtYWxsZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuICovCiAgICAgYXJyID0gX1B5TGlzdF9JVEVNUyhoZWFwKTsKLSAgICBsaW1pdCA9IGVuZHBvcyAvIDI7ICAgICAgICAgIC8qIHNtYWxsZXN0IHBvcyB0aGF0IGhhcyBubyBjaGlsZCAqLworICAgIGxpbWl0ID0gZW5kcG9zID4+IDE7ICAgICAgICAgLyogc21hbGxlc3QgcG9zIHRoYXQgaGFzIG5vIGNoaWxkICovCiAgICAgd2hpbGUgKHBvcyA8IGxpbWl0KSB7CiAgICAgICAgIC8qIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBzbWFsbGVyIGNoaWxkLiAgICovCiAgICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxOyAgICAvKiBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbiAgKi8KQEAgLTQzMiw2ICs0MzIsNyBAQAogICAgICAgICAgICAgaWYgKGNtcCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgY2hpbGRwb3MgKz0gKCh1bnNpZ25lZCljbXAgXiAxKTsgICAvKiBpbmNyZW1lbnQgd2hlbiBjbXA9PTAgKi8KKyAgICAgICAgICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7ICAgICAgICAgLyogYXJyIG1heSBoYXZlIGNoYW5nZWQgKi8KICAgICAgICAgICAgIGlmIChlbmRwb3MgIT0gUHlMaXN0X0dFVF9TSVpFKGhlYXApKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3QgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24iKTsKQEAgLTQzOSw3ICs0NDAsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8qIE1vdmUgdGhlIHNtYWxsZXIgY2hpbGQgdXAuICovCi0gICAgICAgIGFyciA9IF9QeUxpc3RfSVRFTVMoaGVhcCk7CiAgICAgICAgIHRtcDEgPSBhcnJbY2hpbGRwb3NdOwogICAgICAgICB0bXAyID0gYXJyW3Bvc107CiAgICAgICAgIGFycltjaGlsZHBvc10gPSB0bXAyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmMgYi9Nb2R1bGVzL19pby9faW9tb2R1bGUuYwppbmRleCA2NWM5NTVhLi5lYzcwMGY2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuYworKysgYi9Nb2R1bGVzL19pby9faW9tb2R1bGUuYwpAQCAtMjM4LDIwICsyMzgsMzMgQEAKICAgICBpbnQgdGV4dCA9IDAsIGJpbmFyeSA9IDAsIHVuaXZlcnNhbCA9IDA7CiAKICAgICBjaGFyIHJhd21vZGVbNl0sICptOwotICAgIGludCBsaW5lX2J1ZmZlcmluZywgaXNhdHR5OworICAgIGludCBsaW5lX2J1ZmZlcmluZywgaXNfbnVtYmVyOworICAgIGxvbmcgaXNhdHR5OwogCi0gICAgUHlPYmplY3QgKnJhdywgKm1vZGVvYmogPSBOVUxMLCAqYnVmZmVyLCAqd3JhcHBlciwgKnJlc3VsdCA9IE5VTEw7CisgICAgUHlPYmplY3QgKnJhdywgKm1vZGVvYmogPSBOVUxMLCAqYnVmZmVyLCAqd3JhcHBlciwgKnJlc3VsdCA9IE5VTEwsICpwYXRoX29yX2ZkID0gTlVMTDsKIAogICAgIF9QeV9JREVOVElGSUVSKF9ibGtzaXplKTsKICAgICBfUHlfSURFTlRJRklFUihpc2F0dHkpOwogICAgIF9QeV9JREVOVElGSUVSKG1vZGUpOwogICAgIF9QeV9JREVOVElGSUVSKGNsb3NlKTsKIAotICAgIGlmICghUHlVbmljb2RlX0NoZWNrKGZpbGUpICYmCi0JIVB5Qnl0ZXNfQ2hlY2soZmlsZSkgJiYKLQkhUHlOdW1iZXJfQ2hlY2soZmlsZSkpIHsKKyAgICBpc19udW1iZXIgPSBQeU51bWJlcl9DaGVjayhmaWxlKTsKKworICAgIGlmIChpc19udW1iZXIpIHsKKyAgICAgICAgcGF0aF9vcl9mZCA9IGZpbGU7CisgICAgICAgIFB5X0lOQ1JFRihwYXRoX29yX2ZkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXRoX29yX2ZkID0gUHlPU19GU1BhdGgoZmlsZSk7CisgICAgICAgIGlmIChwYXRoX29yX2ZkID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFpc19udW1iZXIgJiYKKyAgICAgICAgIVB5VW5pY29kZV9DaGVjayhwYXRoX29yX2ZkKSAmJgorICAgICAgICAhUHlCeXRlc19DaGVjayhwYXRoX29yX2ZkKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiaW52YWxpZCBmaWxlOiAlUiIsIGZpbGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICAvKiBEZWNvZGUgbW9kZSAqLwpAQCAtMjkyLDcgKzMwNSw3IEBACiAgICAgICAgIGlmIChzdHJjaHIobW9kZStpKzEsIGMpKSB7CiAgICAgICAgICAgaW52YWxpZF9tb2RlOgogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIG1vZGU6ICclcyciLCBtb2RlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCiAgICAgfQpAQCAtMzA3LDU0ICszMjAsNTcgQEAKIAogICAgIC8qIFBhcmFtZXRlcnMgdmFsaWRhdGlvbiAqLwogICAgIGlmICh1bml2ZXJzYWwpIHsKLSAgICAgICAgaWYgKHdyaXRpbmcgfHwgYXBwZW5kaW5nKSB7CisgICAgICAgIGlmIChjcmVhdGluZyB8fCB3cml0aW5nIHx8IGFwcGVuZGluZyB8fCB1cGRhdGluZykgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IHVzZSBVIGFuZCB3cml0aW5nIG1vZGUgYXQgb25jZSIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZGUgVSBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCB4JywgJ3cnLCAnYScsIG9yICcrJyIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAiJ1UnIG1vZGUgaXMgZGVwcmVjYXRlZCIsIDEpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgcmVhZGluZyA9IDE7CiAgICAgfQogCiAgICAgaWYgKHRleHQgJiYgYmluYXJ5KSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGhhdmUgdGV4dCBhbmQgYmluYXJ5IG1vZGUgYXQgb25jZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBpZiAoY3JlYXRpbmcgKyByZWFkaW5nICsgd3JpdGluZyArIGFwcGVuZGluZyA+IDEpIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBoYXZlIGV4YWN0bHkgb25lIG9mIGNyZWF0ZS9yZWFkL3dyaXRlL2FwcGVuZCBtb2RlIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGlmIChiaW5hcnkgJiYgZW5jb2RpbmcgIT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5hcnkgbW9kZSBkb2Vzbid0IHRha2UgYW4gZW5jb2RpbmcgYXJndW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgaWYgKGJpbmFyeSAmJiBlcnJvcnMgIT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJiaW5hcnkgbW9kZSBkb2Vzbid0IHRha2UgYW4gZXJyb3JzIGFyZ3VtZW50Iik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGlmIChiaW5hcnkgJiYgbmV3bGluZSAhPSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImJpbmFyeSBtb2RlIGRvZXNuJ3QgdGFrZSBhIG5ld2xpbmUgYXJndW1lbnQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgLyogQ3JlYXRlIHRoZSBSYXcgZmlsZSBzdHJlYW0gKi8KICAgICByYXcgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopJlB5RmlsZUlPX1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPc2lPIiwgZmlsZSwgcmF3bW9kZSwgY2xvc2VmZCwgb3BlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9zaU8iLCBwYXRoX29yX2ZkLCByYXdtb2RlLCBjbG9zZWZkLCBvcGVuZXIpOwogICAgIGlmIChyYXcgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgcmVzdWx0ID0gcmF3OwogCisgICAgUHlfREVDUkVGKHBhdGhfb3JfZmQpOworICAgIHBhdGhfb3JfZmQgPSBOVUxMOworCiAgICAgbW9kZW9iaiA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKG1vZGUpOwogICAgIGlmIChtb2Rlb2JqID09IE5VTEwpCiAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC00MzcsMTAgKzQ1MywxMCBAQAogCiAgICAgLyogd3JhcHMgaW50byBhIFRleHRJT1dyYXBwZXIgKi8KICAgICB3cmFwcGVyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKSZQeVRleHRJT1dyYXBwZXJfVHlwZSwKLQkJCQkgICAgIk9zc3NpIiwKLQkJCQkgICAgYnVmZmVyLAotCQkJCSAgICBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLAotCQkJCSAgICBsaW5lX2J1ZmZlcmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3Nzc2kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIGVycm9ycywgbmV3bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfYnVmZmVyaW5nKTsKICAgICBpZiAod3JhcHBlciA9PSBOVUxMKQogICAgICAgICBnb3RvIGVycm9yOwogICAgIHJlc3VsdCA9IHdyYXBwZXI7CkBAIC00NjAsNiArNDc2LDcgQEAKICAgICAgICAgUHlfWERFQ1JFRihjbG9zZV9yZXN1bHQpOwogICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICB9CisgICAgUHlfWERFQ1JFRihwYXRoX29yX2ZkKTsKICAgICBQeV9YREVDUkVGKG1vZGVvYmopOwogICAgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vX2lvbW9kdWxlLmggYi9Nb2R1bGVzL19pby9faW9tb2R1bGUuaAppbmRleCAwYzZlYWUyLi4zYzQ4ZmYzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9faW9tb2R1bGUuaAorKysgYi9Nb2R1bGVzL19pby9faW9tb2R1bGUuaApAQCAtNjAsNyArNjAsNyBAQAogICAgKiBPdGhlcndpc2UsIHRoZSBsaW5lIGVuZGluZyBpcyBzcGVjaWZpZWQgYnkgcmVhZG5sLCBhIHN0ciBvYmplY3QgKi8KIGV4dGVybiBQeV9zc2l6ZV90IF9QeUlPX2ZpbmRfbGluZV9lbmRpbmcoCiAgICAgaW50IHRyYW5zbGF0ZWQsIGludCB1bml2ZXJzYWwsIFB5T2JqZWN0ICpyZWFkbmwsCi0gICAgaW50IGtpbmQsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKTsKKyAgICBpbnQga2luZCwgY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKmVuZCwgUHlfc3NpemVfdCAqY29uc3VtZWQpOwogCiAvKiBSZXR1cm4gMSBpZiBhbiBFbnZpcm9ubWVudEVycm9yIHdpdGggZXJybm8gPT0gRUlOVFIgaXMgc2V0IChhbmQgdGhlbgogICAgY2xlYXJzIHRoZSBlcnJvciBpbmRpY2F0b3IpLCAwIG90aGVyd2lzZS4KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYyBiL01vZHVsZXMvX2lvL2J1ZmZlcmVkaW8uYwppbmRleCA2ZDY3NzUxLi5jYmU3NDI1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9idWZmZXJlZGlvLmMKKysrIGIvTW9kdWxlcy9faW8vYnVmZmVyZWRpby5jCkBAIC02NTksNyArNjU5LDcgQEAKIAogLyogU2V0cyB0aGUgY3VycmVudCBlcnJvciB0byBCbG9ja2luZ0lPRXJyb3IgKi8KIHN0YXRpYyB2b2lkCi1fc2V0X0Jsb2NraW5nSU9FcnJvcihjaGFyICptc2csIFB5X3NzaXplX3Qgd3JpdHRlbikKK19zZXRfQmxvY2tpbmdJT0Vycm9yKGNvbnN0IGNoYXIgKm1zZywgUHlfc3NpemVfdCB3cml0dGVuKQogewogICAgIFB5T2JqZWN0ICplcnI7CiAgICAgUHlFcnJfQ2xlYXIoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2J5dGVzaW8uYyBiL01vZHVsZXMvX2lvL2J5dGVzaW8uYwppbmRleCA5ZTVkNzhiLi5hMWJhMTIxIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9ieXRlc2lvLmMKKysrIGIvTW9kdWxlcy9faW8vYnl0ZXNpby5jCkBAIC04Nyw3ICs4Nyw3IEBACiBzdGF0aWMgaW50CiB1bnNoYXJlX2J1ZmZlcihieXRlc2lvICpzZWxmLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBQeU9iamVjdCAqbmV3X2J1ZiwgKm9sZF9idWY7CisgICAgUHlPYmplY3QgKm5ld19idWY7CiAgICAgYXNzZXJ0KFNIQVJFRF9CVUYoc2VsZikpOwogICAgIGFzc2VydChzZWxmLT5leHBvcnRzID09IDApOwogICAgIGFzc2VydChzaXplID49IChzaXplX3Qpc2VsZi0+c3RyaW5nX3NpemUpOwpAQCAtOTYsOSArOTYsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgbWVtY3B5KFB5Qnl0ZXNfQVNfU1RSSU5HKG5ld19idWYpLCBQeUJ5dGVzX0FTX1NUUklORyhzZWxmLT5idWYpLAogICAgICAgICAgICBzZWxmLT5zdHJpbmdfc2l6ZSk7Ci0gICAgb2xkX2J1ZiA9IHNlbGYtPmJ1ZjsKLSAgICBzZWxmLT5idWYgPSBuZXdfYnVmOwotICAgIFB5X0RFQ1JFRihvbGRfYnVmKTsKKyAgICBQeV9TRVRSRUYoc2VsZi0+YnVmLCBuZXdfYnVmKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vY2xpbmljL19pb21vZHVsZS5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvX2lvbW9kdWxlLmMuaAppbmRleCA2Yzg4ZTMyLi5lZTAxY2ZiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9jbGluaWMvX2lvbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL19pby9jbGluaWMvX2lvbW9kdWxlLmMuaApAQCAtMTQ5LDExICsxNDksMTIgQEAKICAgICBQeU9iamVjdCAqb3BlbmVyID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c2l6enppTzpvcGVuIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJm1vZGUsICZidWZmZXJpbmcsICZlbmNvZGluZywgJmVycm9ycywgJm5ld2xpbmUsICZjbG9zZWZkLCAmb3BlbmVyKSkKKyAgICAgICAgJmZpbGUsICZtb2RlLCAmYnVmZmVyaW5nLCAmZW5jb2RpbmcsICZlcnJvcnMsICZuZXdsaW5lLCAmY2xvc2VmZCwgJm9wZW5lcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fb3Blbl9pbXBsKG1vZHVsZSwgZmlsZSwgbW9kZSwgYnVmZmVyaW5nLCBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLCBjbG9zZWZkLCBvcGVuZXIpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmMyYzAwM2NiN2RhZWFmZSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YWUyZmFjZjI2MmNmNDY0ZSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvYnVmZmVyZWRpby5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvYnVmZmVyZWRpby5jLmgKaW5kZXggNDM3ZTI3NS4uYzRkZmMxNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vY2xpbmljL2J1ZmZlcmVkaW8uYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9idWZmZXJlZGlvLmMuaApAQCAtMTksMTQgKzE5LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkSU9CYXNlX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00OCwxNCArNTAsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYnVmZmVyID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50bzEiLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvMSIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZElPQmFzZV9yZWFkaW50bzFfaW1wbChzZWxmLCAmYnVmZmVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBidWZmZXIgKi8KLSAgICBpZiAoYnVmZmVyLm9iaikKKyAgICBpZiAoYnVmZmVyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1ZmZlcik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTk5LDggKzEwMyw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cGVlayIsCi0gICAgICAgICZzaXplKSkKKyAgICAgICAgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZF9wZWVrX2ltcGwoc2VsZiwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC0xMjUsOCArMTMwLDkgQEAKICAgICBQeV9zc2l6ZV90IG4gPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOnJlYWQiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJm4pKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZF9yZWFkX2ltcGwoc2VsZiwgbik7CiAKIGV4aXQ6CkBAIC0xNTAsOCArMTU2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IG47CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIm46cmVhZDEiLCAmbikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJuOnJlYWQxIiwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19CdWZmZXJlZF9yZWFkMV9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMTc1LDE0ICsxODIsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYnVmZmVyID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50byIsICZidWZmZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZGludG9faW1wbChzZWxmLCAmYnVmZmVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBidWZmZXIgKi8KLSAgICBpZiAoYnVmZmVyLm9iaikKKyAgICBpZiAoYnVmZmVyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1ZmZlcik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTIwNCwxNCArMjEzLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8xIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50bzEiLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZGludG8xX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMzQsOCArMjQ1LDkgQEAKICAgICBQeV9zc2l6ZV90IHNpemUgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOnJlYWRsaW5lIiwKLSAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZzaXplKSkKKyAgICAgICAgX1B5SU9fQ29udmVydFNzaXplX3QsICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfcmVhZGxpbmVfaW1wbChzZWxmLCBzaXplKTsKIAogZXhpdDoKQEAgLTI2MSw4ICsyNzMsOSBAQAogICAgIGludCB3aGVuY2UgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6c2VlayIsCi0gICAgICAgICZ0YXJnZXRvYmosICZ3aGVuY2UpKQorICAgICAgICAmdGFyZ2V0b2JqLCAmd2hlbmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fQnVmZmVyZWRfc2Vla19pbXBsKHNlbGYsIHRhcmdldG9iaiwgd2hlbmNlKTsKIAogZXhpdDoKQEAgLTI4OCw4ICszMDEsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmcG9zKSkKKyAgICAgICAgJnBvcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fX0J1ZmZlcmVkX3RydW5jYXRlX2ltcGwoc2VsZiwgcG9zKTsKIAogZXhpdDoKQEAgLTMxNSw4ICszMjksOSBAQAogICAgIFB5X3NzaXplX3QgYnVmZmVyX3NpemUgPSBERUZBVUxUX0JVRkZFUl9TSVpFOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xuOkJ1ZmZlcmVkUmVhZGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUpKQorICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkUmVhZGVyX19faW5pdF9fX2ltcGwoKGJ1ZmZlcmVkICopc2VsZiwgcmF3LCBidWZmZXJfc2l6ZSk7CiAKIGV4aXQ6CkBAIC0zNDYsOCArMzYxLDkgQEAKICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gREVGQVVMVF9CVUZGRVJfU0laRTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98bjpCdWZmZXJlZFdyaXRlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJnJhdywgJmJ1ZmZlcl9zaXplKSkKKyAgICAgICAgJnJhdywgJmJ1ZmZlcl9zaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CdWZmZXJlZFdyaXRlcl9fX2luaXRfX19pbXBsKChidWZmZXJlZCAqKXNlbGYsIHJhdywgYnVmZmVyX3NpemUpOwogCiBleGl0OgpAQCAtMzcxLDE0ICszODcsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYnVmZmVyID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZidWZmZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYnVmZmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CdWZmZXJlZFdyaXRlcl93cml0ZV9pbXBsKHNlbGYsICZidWZmZXIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDEwLDExICs0MjgsMTMgQEAKICAgICBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplID0gREVGQVVMVF9CVUZGRVJfU0laRTsKIAogICAgIGlmICgoUHlfVFlQRShzZWxmKSA9PSAmUHlCdWZmZXJlZFJXUGFpcl9UeXBlKSAmJgotICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJ1ZmZlcmVkUldQYWlyIiwga3dhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJCdWZmZXJlZFJXUGFpciIsIGt3YXJncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9PfG46QnVmZmVyZWRSV1BhaXIiLAotICAgICAgICAmcmVhZGVyLCAmd3JpdGVyLCAmYnVmZmVyX3NpemUpKQorICAgICAgICAmcmVhZGVyLCAmd3JpdGVyLCAmYnVmZmVyX3NpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkUldQYWlyX19faW5pdF9fX2ltcGwoKHJ3cGFpciAqKXNlbGYsIHJlYWRlciwgd3JpdGVyLCBidWZmZXJfc2l6ZSk7CiAKIGV4aXQ6CkBAIC00NDQsMTEgKzQ2NCwxMiBAQAogICAgIFB5X3NzaXplX3QgYnVmZmVyX3NpemUgPSBERUZBVUxUX0JVRkZFUl9TSVpFOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xuOkJ1ZmZlcmVkUmFuZG9tIiwgX2tleXdvcmRzLAotICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUpKQorICAgICAgICAmcmF3LCAmYnVmZmVyX3NpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J1ZmZlcmVkUmFuZG9tX19faW5pdF9fX2ltcGwoKGJ1ZmZlcmVkICopc2VsZiwgcmF3LCBidWZmZXJfc2l6ZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYmJiNWUyMzliNGZmZTZmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00ZjYxOTZjNzU2Yjg4MGM4IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy9ieXRlc2lvLmMuaCBiL01vZHVsZXMvX2lvL2NsaW5pYy9ieXRlc2lvLmMuaAppbmRleCA1ZjJhYmIwLi4xZjczNmZlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby9jbGluaWMvYnl0ZXNpby5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL2J5dGVzaW8uYy5oCkBAIC0xNzEsOCArMTcxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWQiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYXJnKSkKKyAgICAgICAgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnl0ZXNJT19yZWFkX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTIxNSw4ICsyMTYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZGxpbmUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYXJnKSkKKyAgICAgICAgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnl0ZXNJT19yZWFkbGluZV9pbXBsKHNlbGYsIGFyZyk7CiAKIGV4aXQ6CkBAIC0yNDcsOCArMjQ5LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lcyIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX3JlYWRsaW5lc19pbXBsKHNlbGYsIGFyZyk7CiAKIGV4aXQ6CkBAIC0yNzYsMTQgKzI3OSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ3KjpyZWFkaW50byIsICZidWZmZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0J5dGVzSU9fcmVhZGludG9faW1wbChzZWxmLCAmYnVmZmVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBidWZmZXIgKi8KLSAgICBpZiAoYnVmZmVyLm9iaikKKyAgICBpZiAoYnVmZmVyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1ZmZlcik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTMxMSw4ICszMTYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYXJnKSkKKyAgICAgICAgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnl0ZXNJT190cnVuY2F0ZV9pbXBsKHNlbGYsIGFyZyk7CiAKIGV4aXQ6CkBAIC0zNDUsOCArMzUxLDkgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibnxpOnNlZWsiLAotICAgICAgICAmcG9zLCAmd2hlbmNlKSkKKyAgICAgICAgJnBvcywgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fQnl0ZXNJT19zZWVrX2ltcGwoc2VsZiwgcG9zLCB3aGVuY2UpOwogCiBleGl0OgpAQCAtNDEyLDExICs0MTksMTIgQEAKICAgICBQeU9iamVjdCAqaW5pdHZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOkJ5dGVzSU8iLCBfa2V5d29yZHMsCi0gICAgICAgICZpbml0dmFsdWUpKQorICAgICAgICAmaW5pdHZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19CeXRlc0lPX19faW5pdF9fX2ltcGwoKGJ5dGVzaW8gKilzZWxmLCBpbml0dmFsdWUpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NjBjZTJjNjI3MjcxODQzMSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9M2ZkYjYyZjNlM2IwNTQ0ZCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvZmlsZWlvLmMuaCBiL01vZHVsZXMvX2lvL2NsaW5pYy9maWxlaW8uYy5oCmluZGV4IDEwNDIwMDguLjAzODgzNmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9maWxlaW8uYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9maWxlaW8uYy5oCkBAIC01Niw4ICs1Niw5IEBACiAgICAgUHlPYmplY3QgKm9wZW5lciA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHNpTzpGaWxlSU8iLCBfa2V5d29yZHMsCi0gICAgICAgICZuYW1lb2JqLCAmbW9kZSwgJmNsb3NlZmQsICZvcGVuZXIpKQorICAgICAgICAmbmFtZW9iaiwgJm1vZGUsICZjbG9zZWZkLCAmb3BlbmVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19GaWxlSU9fX19pbml0X19faW1wbCgoZmlsZWlvICopc2VsZiwgbmFtZW9iaiwgbW9kZSwgY2xvc2VmZCwgb3BlbmVyKTsKIAogZXhpdDoKQEAgLTE1NCwxNCArMTU1LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGJ1ZmZlciA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidyo6cmVhZGludG8iLCAmYnVmZmVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIncqOnJlYWRpbnRvIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fRmlsZUlPX3JlYWRpbnRvX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yMTAsOCArMjEzLDkgQEAKICAgICBQeV9zc2l6ZV90IHNpemUgPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOnJlYWQiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJnNpemUpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT19yZWFkX2ltcGwoc2VsZiwgc2l6ZSk7CiAKIGV4aXQ6CkBAIC0yNDAsMTQgKzI0NCwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBiID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZiKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT193cml0ZV9pbXBsKHNlbGYsICZiKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBiICovCi0gICAgaWYgKGIub2JqKQorICAgIGlmIChiLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODAsOCArMjg2LDkgQEAKICAgICBpbnQgd2hlbmNlID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpOnNlZWsiLAotICAgICAgICAmcG9zLCAmd2hlbmNlKSkKKyAgICAgICAgJnBvcywgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fRmlsZUlPX3NlZWtfaW1wbChzZWxmLCBwb3MsIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0zMzMsOCArMzQwLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInRydW5jYXRlIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnBvc29iaikpCisgICAgICAgICZwb3NvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0ZpbGVJT190cnVuY2F0ZV9pbXBsKHNlbGYsIHBvc29iaik7CiAKIGV4aXQ6CkBAIC0zNjQsNCArMzcyLDQgQEAKICNpZm5kZWYgX0lPX0ZJTEVJT19UUlVOQ0FURV9NRVRIT0RERUYKICAgICAjZGVmaW5lIF9JT19GSUxFSU9fVFJVTkNBVEVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX0lPX0ZJTEVJT19UUlVOQ0FURV9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGNiYzM5YjQ2NjU5ODQ5MiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmY0YjRiZDZiOTc2MzQ2ZCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvaW9iYXNlLmMuaCBiL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCmluZGV4IDk3NjJmMTEuLmVkYmY3M2EgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy9pb2Jhc2UuYy5oCkBAIC0xODYsOCArMTg2LDkgQEAKICAgICBQeV9zc2l6ZV90IGxpbWl0ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZSIsCi0gICAgICAgIF9QeUlPX0NvbnZlcnRTc2l6ZV90LCAmbGltaXQpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmxpbWl0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19fSU9CYXNlX3JlYWRsaW5lX2ltcGwoc2VsZiwgbGltaXQpOwogCiBleGl0OgpAQCAtMjE3LDggKzIxOCw5IEBACiAgICAgUHlfc3NpemVfdCBoaW50ID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPJjpyZWFkbGluZXMiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmhpbnQpKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJmhpbnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19JT0Jhc2VfcmVhZGxpbmVzX2ltcGwoc2VsZiwgaGludCk7CiAKIGV4aXQ6CkBAIC0yNTEsOCArMjUzLDkgQEAKICAgICBQeV9zc2l6ZV90IG4gPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46cmVhZCIsCi0gICAgICAgICZuKSkKKyAgICAgICAgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX19SYXdJT0Jhc2VfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMjc2LDQgKzI3OSw0IEBACiB7CiAgICAgcmV0dXJuIF9pb19fUmF3SU9CYXNlX3JlYWRhbGxfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iODc0OTUyZjVjYzI0OGE0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZjUzZmVkOTI4ZDhlMDJmIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2NsaW5pYy9zdHJpbmdpby5jLmggYi9Nb2R1bGVzL19pby9jbGluaWMvc3RyaW5naW8uYy5oCmluZGV4IGE4ZTMyYTMuLmNlOWY0NmUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy9zdHJpbmdpby5jLmgKKysrIGIvTW9kdWxlcy9faW8vY2xpbmljL3N0cmluZ2lvLmMuaApAQCAtNjEsOCArNjEsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZhcmcpKQorICAgICAgICAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19TdHJpbmdJT19yZWFkX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTkxLDggKzkyLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmFyZykpCisgICAgICAgICZhcmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX3JlYWRsaW5lX2ltcGwoc2VsZiwgYXJnKTsKIAogZXhpdDoKQEAgLTEyMyw4ICsxMjUsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmYXJnKSkKKyAgICAgICAgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fU3RyaW5nSU9fdHJ1bmNhdGVfaW1wbChzZWxmLCBhcmcpOwogCiBleGl0OgpAQCAtMTU3LDggKzE2MCw5IEBACiAgICAgaW50IHdoZW5jZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIm58aTpzZWVrIiwKLSAgICAgICAgJnBvcywgJndoZW5jZSkpCisgICAgICAgICZwb3MsICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1N0cmluZ0lPX3NlZWtfaW1wbChzZWxmLCBwb3MsIHdoZW5jZSk7CiAKIGV4aXQ6CkBAIC0yMjIsOCArMjI2LDkgQEAKICAgICBQeU9iamVjdCAqbmV3bGluZV9vYmogPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9POlN0cmluZ0lPIiwgX2tleXdvcmRzLAotICAgICAgICAmdmFsdWUsICZuZXdsaW5lX29iaikpCisgICAgICAgICZ2YWx1ZSwgJm5ld2xpbmVfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19TdHJpbmdJT19fX2luaXRfX19pbXBsKChzdHJpbmdpbyAqKXNlbGYsIHZhbHVlLCBuZXdsaW5lX29iaik7CiAKIGV4aXQ6CkBAIC0yODMsNCArMjg4LDQgQEAKIHsKICAgICByZXR1cm4gX2lvX1N0cmluZ0lPX3NlZWthYmxlX2ltcGwoc2VsZik7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjA2MWNmM2EyMGNkMTRlZCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDUxMzIxOTU4MWNiZTk1MiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19pby9jbGluaWMvdGV4dGlvLmMuaCBiL01vZHVsZXMvX2lvL2NsaW5pYy90ZXh0aW8uYy5oCmluZGV4IGRjN2U4YzcuLmYxMTUzMjYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL2NsaW5pYy90ZXh0aW8uYy5oCisrKyBiL01vZHVsZXMvX2lvL2NsaW5pYy90ZXh0aW8uYy5oCkBAIC0zMCw4ICszMCw5IEBACiAgICAgUHlPYmplY3QgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPaXxPOkluY3JlbWVudGFsTmV3bGluZURlY29kZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZkZWNvZGVyLCAmdHJhbnNsYXRlLCAmZXJyb3JzKSkKKyAgICAgICAgJmRlY29kZXIsICZ0cmFuc2xhdGUsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX0luY3JlbWVudGFsTmV3bGluZURlY29kZXJfX19pbml0X19faW1wbCgobmxkZWNvZGVyX29iamVjdCAqKXNlbGYsIGRlY29kZXIsIHRyYW5zbGF0ZSwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTU5LDggKzYwLDkgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xpOmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZmluYWwpKQorICAgICAgICAmaW5wdXQsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fSW5jcmVtZW50YWxOZXdsaW5lRGVjb2Rlcl9kZWNvZGVfaW1wbChzZWxmLCBpbnB1dCwgZmluYWwpOwogCiBleGl0OgpAQCAtMTYyLDggKzE2NCw5IEBACiAgICAgaW50IHdyaXRlX3Rocm91Z2ggPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3x6enppaTpUZXh0SU9XcmFwcGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmYnVmZmVyLCAmZW5jb2RpbmcsICZlcnJvcnMsICZuZXdsaW5lLCAmbGluZV9idWZmZXJpbmcsICZ3cml0ZV90aHJvdWdoKSkKKyAgICAgICAgJmJ1ZmZlciwgJmVuY29kaW5nLCAmZXJyb3JzLCAmbmV3bGluZSwgJmxpbmVfYnVmZmVyaW5nLCAmd3JpdGVfdGhyb3VnaCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl9fX2luaXRfX19pbXBsKCh0ZXh0aW8gKilzZWxmLCBidWZmZXIsIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nLCB3cml0ZV90aHJvdWdoKTsKIAogZXhpdDoKQEAgLTIwNCw4ICsyMDcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICp0ZXh0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOndyaXRlIiwgJnRleHQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTp3cml0ZSIsICZ0ZXh0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pb19UZXh0SU9XcmFwcGVyX3dyaXRlX2ltcGwoc2VsZiwgdGV4dCk7CiAKIGV4aXQ6CkBAIC0yMzAsOCArMjM0LDkgQEAKICAgICBQeV9zc2l6ZV90IG4gPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOnJlYWQiLAotICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJm4pKQorICAgICAgICBfUHlJT19Db252ZXJ0U3NpemVfdCwgJm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfcmVhZF9pbXBsKHNlbGYsIG4pOwogCiBleGl0OgpAQCAtMjU2LDggKzI2MSw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnJlYWRsaW5lIiwKLSAgICAgICAgJnNpemUpKQorICAgICAgICAmc2l6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl9yZWFkbGluZV9pbXBsKHNlbGYsIHNpemUpOwogCiBleGl0OgpAQCAtMjgzLDggKzI4OSw5IEBACiAgICAgaW50IHdoZW5jZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aTpzZWVrIiwKLSAgICAgICAgJmNvb2tpZU9iaiwgJndoZW5jZSkpCisgICAgICAgICZjb29raWVPYmosICZ3aGVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2lvX1RleHRJT1dyYXBwZXJfc2Vla19pbXBsKHNlbGYsIGNvb2tpZU9iaiwgd2hlbmNlKTsKIAogZXhpdDoKQEAgLTMyNyw4ICszMzQsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAidHJ1bmNhdGUiLAogICAgICAgICAwLCAxLAotICAgICAgICAmcG9zKSkKKyAgICAgICAgJnBvcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW9fVGV4dElPV3JhcHBlcl90cnVuY2F0ZV9pbXBsKHNlbGYsIHBvcyk7CiAKIGV4aXQ6CkBAIC00NTMsNCArNDYxLDQgQEAKIHsKICAgICByZXR1cm4gX2lvX1RleHRJT1dyYXBwZXJfY2xvc2VfaW1wbChzZWxmKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OTA2MDhmODVhYWI4YmE1IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zMWEzOWJiYmUwN2FlNGU3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2ZpbGVpby5jIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKaW5kZXggOTE5Y2Y1MC4uMTJlNTE1NiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vZmlsZWlvLmMKKysrIGIvTW9kdWxlcy9faW8vZmlsZWlvLmMKQEAgLTkyLDggKzkyLDcgQEAKICAgICBpZiAoc2VsZi0+ZmQgPj0gMCAmJiBzZWxmLT5jbG9zZWZkKSB7CiAgICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKICAgICAgICAgUHlFcnJfRmV0Y2goJmV4YywgJnZhbCwgJnRiKTsKLSAgICAgICAgaWYgKFB5RXJyX1dhcm5Gb3JtYXQoUHlFeGNfUmVzb3VyY2VXYXJuaW5nLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5jbG9zZWQgZmlsZSAlUiIsIHNvdXJjZSkpIHsKKyAgICAgICAgaWYgKFB5RXJyX1Jlc291cmNlV2FybmluZyhzb3VyY2UsIDEsICJ1bmNsb3NlZCBmaWxlICVSIiwgc291cmNlKSkgewogICAgICAgICAgICAgLyogU3B1cmlvdXMgZXJyb3JzIGNhbiBhcHBlYXIgYXQgc2h1dGRvd24gKi8KICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1dhcm5pbmcpKQogICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKikgc2VsZik7CkBAIC01NDYsNyArNTQ1LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWVycl9tb2RlKGNoYXIgKmFjdGlvbikKK2Vycl9tb2RlKGNvbnN0IGNoYXIgKmFjdGlvbikKIHsKICAgICBfUHlJT19TdGF0ZSAqc3RhdGUgPSBJT19TVEFURSgpOwogICAgIGlmIChzdGF0ZSAhPSBOVUxMKQpAQCAtMTA0OSw3ICsxMDQ4LDcgQEAKIH0KICNlbmRpZiAvKiBIQVZFX0ZUUlVOQ0FURSAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBtb2RlX3N0cmluZyhmaWxlaW8gKnNlbGYpCiB7CiAgICAgaWYgKHNlbGYtPmNyZWF0ZWQpIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL2lvYmFzZS5jIGIvTW9kdWxlcy9faW8vaW9iYXNlLmMKaW5kZXggMjEyYjBkZC4uZjA3YTBjYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faW8vaW9iYXNlLmMKKysrIGIvTW9kdWxlcy9faW8vaW9iYXNlLmMKQEAgLTgyOCw3ICs4MjgsNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdCAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdmVyc2lvbl90YWcgKi8KLSAgICAoZGVzdHJ1Y3Rvcilpb2Jhc2VfZmluYWxpemUsIC8qIHRwX2ZpbmFsaXplICovCisgICAgaW9iYXNlX2ZpbmFsaXplLCAgICAgICAgICAgIC8qIHRwX2ZpbmFsaXplICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2lvL3N0cmluZ2lvLmMgYi9Nb2R1bGVzL19pby9zdHJpbmdpby5jCmluZGV4IDA2YjQxNDQuLmVjZjZkYzEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2lvL3N0cmluZ2lvLmMKKysrIGIvTW9kdWxlcy9faW8vc3RyaW5naW8uYwpAQCAtNDM4LDcgKzQzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5SU9fc3RyX3JlYWRsaW5lLCBOVUxMKTsKICAgICAgICAgaWYgKGxpbmUgJiYgIVB5VW5pY29kZV9DaGVjayhsaW5lKSkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0lPRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgYW4gc3RyIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZSgpIHNob3VsZCBoYXZlIHJldHVybmVkIGEgc3RyIG9iamVjdCwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJyUuMjAwcyciLCBQeV9UWVBFKGxpbmUpLT50cF9uYW1lKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihsaW5lKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9faW8vdGV4dGlvLmMgYi9Nb2R1bGVzL19pby90ZXh0aW8uYwppbmRleCAwNjNjYWE2Li45NmM4ZTdiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19pby90ZXh0aW8uYworKysgYi9Nb2R1bGVzL19pby90ZXh0aW8uYwpAQCAtNzcyLDcgKzc3Miw3IEBACiAgICAgZW5jb2RlZnVuY190IGVuY29kZWZ1bmM7CiB9IGVuY29kZWZ1bmNlbnRyeTsKIAotc3RhdGljIGVuY29kZWZ1bmNlbnRyeSBlbmNvZGVmdW5jc1tdID0geworc3RhdGljIGNvbnN0IGVuY29kZWZ1bmNlbnRyeSBlbmNvZGVmdW5jc1tdID0gewogICAgIHsiYXNjaWkiLCAgICAgICAoZW5jb2RlZnVuY190KSBhc2NpaV9lbmNvZGV9LAogICAgIHsiaXNvODg1OS0xIiwgICAoZW5jb2RlZnVuY190KSBsYXRpbjFfZW5jb2RlfSwKICAgICB7InV0Zi04IiwgICAgICAgKGVuY29kZWZ1bmNfdCkgdXRmOF9lbmNvZGV9LApAQCAtMTAyMSw3ICsxMDIxLDcgQEAKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhyZXMpKSB7Ci0gICAgICAgICAgICBlbmNvZGVmdW5jZW50cnkgKmUgPSBlbmNvZGVmdW5jczsKKyAgICAgICAgICAgIGNvbnN0IGVuY29kZWZ1bmNlbnRyeSAqZSA9IGVuY29kZWZ1bmNzOwogICAgICAgICAgICAgd2hpbGUgKGUtPm5hbWUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcocmVzLCBlLT5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBzZWxmLT5lbmNvZGVmdW5jID0gZS0+ZW5jb2RlZnVuYzsKQEAgLTE2NDQsOCArMTY0NCw4IEBACiAvKiBOT1RFOiBgZW5kYCBtdXN0IHBvaW50IHRvIHRoZSByZWFsIGVuZCBvZiB0aGUgUHlfVUNTNCBzdG9yYWdlLAogICAgdGhhdCBpcyB0byB0aGUgTlVMIGNoYXJhY3Rlci4gT3RoZXJ3aXNlIHRoZSBmdW5jdGlvbiB3aWxsIHByb2R1Y2UKICAgIGluY29ycmVjdCByZXN1bHRzLiAqLwotc3RhdGljIGNoYXIgKgotZmluZF9jb250cm9sX2NoYXIoaW50IGtpbmQsIGNoYXIgKnMsIGNoYXIgKmVuZCwgUHlfVUNTNCBjaCkKK3N0YXRpYyBjb25zdCBjaGFyICoKK2ZpbmRfY29udHJvbF9jaGFyKGludCBraW5kLCBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICplbmQsIFB5X1VDUzQgY2gpCiB7CiAgICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgYXNzZXJ0KGNoIDwgMjU2KTsKQEAgLTE2NjUsMTMgKzE2NjUsMTMgQEAKIFB5X3NzaXplX3QKIF9QeUlPX2ZpbmRfbGluZV9lbmRpbmcoCiAgICAgaW50IHRyYW5zbGF0ZWQsIGludCB1bml2ZXJzYWwsIFB5T2JqZWN0ICpyZWFkbmwsCi0gICAgaW50IGtpbmQsIGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsIFB5X3NzaXplX3QgKmNvbnN1bWVkKQorICAgIGludCBraW5kLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kLCBQeV9zc2l6ZV90ICpjb25zdW1lZCkKIHsKICAgICBQeV9zc2l6ZV90IGxlbiA9ICgoY2hhciopZW5kIC0gKGNoYXIqKXN0YXJ0KS9raW5kOwogCiAgICAgaWYgKHRyYW5zbGF0ZWQpIHsKICAgICAgICAgLyogTmV3bGluZXMgYXJlIGFscmVhZHkgdHJhbnNsYXRlZCwgb25seSBzZWFyY2ggZm9yIFxuICovCi0gICAgICAgIGNoYXIgKnBvcyA9IGZpbmRfY29udHJvbF9jaGFyKGtpbmQsIHN0YXJ0LCBlbmQsICdcbicpOworICAgICAgICBjb25zdCBjaGFyICpwb3MgPSBmaW5kX2NvbnRyb2xfY2hhcihraW5kLCBzdGFydCwgZW5kLCAnXG4nKTsKICAgICAgICAgaWYgKHBvcyAhPSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIChwb3MgLSBzdGFydCkva2luZCArIDE7CiAgICAgICAgIGVsc2UgewpAQCAtMTY4Myw3ICsxNjgzLDcgQEAKICAgICAgICAgLyogVW5pdmVyc2FsIG5ld2xpbmUgc2VhcmNoLiBGaW5kIGFueSBvZiBcciwgXHJcbiwgXG4KICAgICAgICAgICogVGhlIGRlY29kZXIgZW5zdXJlcyB0aGF0IFxyXG4gYXJlIG5vdCBzcGxpdCBpbiB0d28gcGllY2VzCiAgICAgICAgICAqLwotICAgICAgICBjaGFyICpzID0gc3RhcnQ7CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdGFydDsKICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgUHlfVUNTNCBjaDsKICAgICAgICAgICAgIC8qIEZhc3QgcGF0aCBmb3Igbm9uLWNvbnRyb2wgY2hhcnMuIFRoZSBsb29wIGFsd2F5cyBlbmRzCkBAIC0xNzEzLDIxICsxNzEzLDIxIEBACiAgICAgICAgIC8qIEFzc3VtZSB0aGF0IHJlYWRubCBpcyBhbiBBU0NJSSBjaGFyYWN0ZXIuICovCiAgICAgICAgIGFzc2VydChQeVVuaWNvZGVfS0lORChyZWFkbmwpID09IFB5VW5pY29kZV8xQllURV9LSU5EKTsKICAgICAgICAgaWYgKHJlYWRubF9sZW4gPT0gMSkgewotICAgICAgICAgICAgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgc3RhcnQsIGVuZCwgbmxbMF0pOworICAgICAgICAgICAgY29uc3QgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgc3RhcnQsIGVuZCwgbmxbMF0pOwogICAgICAgICAgICAgaWYgKHBvcyAhPSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiAocG9zIC0gc3RhcnQpL2tpbmQgKyAxOwogICAgICAgICAgICAgKmNvbnN1bWVkID0gbGVuOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgY2hhciAqcyA9IHN0YXJ0OwotICAgICAgICAgICAgY2hhciAqZSA9IGVuZCAtIChyZWFkbmxfbGVuIC0gMSkqa2luZDsKLSAgICAgICAgICAgIGNoYXIgKnBvczsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBzdGFydDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmUgPSBlbmQgLSAocmVhZG5sX2xlbiAtIDEpKmtpbmQ7CisgICAgICAgICAgICBjb25zdCBjaGFyICpwb3M7CiAgICAgICAgICAgICBpZiAoZSA8IHMpCiAgICAgICAgICAgICAgICAgZSA9IHM7CiAgICAgICAgICAgICB3aGlsZSAocyA8IGUpIHsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgICAgICAgICAgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgcywgZW5kLCBubFswXSk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcG9zID0gZmluZF9jb250cm9sX2NoYXIoa2luZCwgcywgZW5kLCBubFswXSk7CiAgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBOVUxMIHx8IHBvcyA+PSBlKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcmVhZG5sX2xlbjsgaSsrKSB7CkBAIC0yNjg5LDcgKzI2ODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeUlPX3N0cl9yZWFkbGluZSwgTlVMTCk7CiAgICAgICAgIGlmIChsaW5lICYmICFQeVVuaWNvZGVfQ2hlY2sobGluZSkpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JT0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZSgpIHNob3VsZCBoYXZlIHJldHVybmVkIGFuIHN0ciBvYmplY3QsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmUoKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBhIHN0ciBvYmplY3QsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICclLjIwMHMnIiwgUHlfVFlQRShsaW5lKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYobGluZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2pzb24uYyBiL01vZHVsZXMvX2pzb24uYwppbmRleCBmODJhZjM0Li5kM2RiZjk4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19qc29uLmMKKysrIGIvTW9kdWxlcy9fanNvbi5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBfZW5jb2RlZF9jb25zdChQeU9iamVjdCAqb2JqKTsKIHN0YXRpYyB2b2lkCi1yYWlzZV9lcnJtc2coY2hhciAqbXNnLCBQeU9iamVjdCAqcywgUHlfc3NpemVfdCBlbmQpOworcmFpc2VfZXJybXNnKGNvbnN0IGNoYXIgKm1zZywgUHlPYmplY3QgKnMsIFB5X3NzaXplX3QgZW5kKTsKIHN0YXRpYyBQeU9iamVjdCAqCiBlbmNvZGVyX2VuY29kZV9zdHJpbmcoUHlFbmNvZGVyT2JqZWN0ICpzLCBQeU9iamVjdCAqb2JqKTsKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0zMjEsNyArMzIxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXJhaXNlX2Vycm1zZyhjaGFyICptc2csIFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGVuZCkKK3JhaXNlX2Vycm1zZyhjb25zdCBjaGFyICptc2csIFB5T2JqZWN0ICpzLCBQeV9zc2l6ZV90IGVuZCkKIHsKICAgICAvKiBVc2UgSlNPTkRlY29kZUVycm9yIGV4Y2VwdGlvbiB0byByYWlzZSBhIG5pY2UgbG9va2luZyBWYWx1ZUVycm9yIHN1YmNsYXNzICovCiAgICAgc3RhdGljIFB5T2JqZWN0ICpKU09ORGVjb2RlRXJyb3IgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbG9jYWxlbW9kdWxlLmMgYi9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYwppbmRleCBiMWQ2YWRkLi5hOTJmYjEwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYworKysgYi9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYwpAQCAtNDksNyArNDksNyBAQAogCiAvKiB0aGUgZ3JvdXBpbmcgaXMgdGVybWluYXRlZCBieSBlaXRoZXIgMCBvciBDSEFSX01BWCAqLwogc3RhdGljIFB5T2JqZWN0KgotY29weV9ncm91cGluZyhjaGFyKiBzKQorY29weV9ncm91cGluZyhjb25zdCBjaGFyKiBzKQogewogICAgIGludCBpOwogICAgIFB5T2JqZWN0ICpyZXN1bHQsICp2YWwgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbHNwcm9mLmMgYi9Nb2R1bGVzL19sc3Byb2YuYwppbmRleCA2NmU1MzRmLi5jY2ZiNTEzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19sc3Byb2YuYworKysgYi9Nb2R1bGVzL19sc3Byb2YuYwpAQCAtNzYyLDcgKzc2Miw2IEBACiBzdGF0aWMgaW50CiBwcm9maWxlcl9pbml0KFByb2ZpbGVyT2JqZWN0ICpwT2JqLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3KQogewotICAgIFB5T2JqZWN0ICpvOwogICAgIFB5T2JqZWN0ICp0aW1lciA9IE5VTEw7CiAgICAgZG91YmxlIHRpbWV1bml0ID0gMC4wOwogICAgIGludCBzdWJjYWxscyA9IDE7CkBAIC03NzcsMTEgKzc3Niw5IEBACiAKICAgICBpZiAoc2V0U3ViY2FsbHMocE9iaiwgc3ViY2FsbHMpIDwgMCB8fCBzZXRCdWlsdGlucyhwT2JqLCBidWlsdGlucykgPCAwKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgbyA9IHBPYmotPmV4dGVybmFsVGltZXI7Ci0gICAgcE9iai0+ZXh0ZXJuYWxUaW1lciA9IHRpbWVyOwotICAgIFB5X1hJTkNSRUYodGltZXIpOwotICAgIFB5X1hERUNSRUYobyk7CiAgICAgcE9iai0+ZXh0ZXJuYWxUaW1lclVuaXQgPSB0aW1ldW5pdDsKKyAgICBQeV9YSU5DUkVGKHRpbWVyKTsKKyAgICBQeV9YU0VUUkVGKHBPYmotPmV4dGVybmFsVGltZXIsIHRpbWVyKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fbHptYW1vZHVsZS5jIGIvTW9kdWxlcy9fbHptYW1vZHVsZS5jCmluZGV4IGJjMDFmZmUuLmNlNGUxN2YgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2x6bWFtb2R1bGUuYworKysgYi9Nb2R1bGVzL19sem1hbW9kdWxlLmMKQEAgLTU1Myw3ICs1NTMsNiBAQAogLypbY2xpbmljIGlucHV0XQogX2x6bWEuTFpNQUNvbXByZXNzb3IuY29tcHJlc3MKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iQ29tcHJlc3NvciAqIikKICAgICBkYXRhOiBQeV9idWZmZXIKICAgICAvCiAKQEAgLTU2Nyw3ICs1NjYsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogX2x6bWFfTFpNQUNvbXByZXNzb3JfY29tcHJlc3NfaW1wbChDb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzFmNjE1MTM2OTYzZTAwZiBpbnB1dD04YjYwY2IxM2UwY2U2NDIwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzFmNjE1MTM2OTYzZTAwZiBpbnB1dD02NDAxOWVhYzdmMmNjOGQwXSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKQEAgLTU4Myw4ICs1ODIsNiBAQAogLypbY2xpbmljIGlucHV0XQogX2x6bWEuTFpNQUNvbXByZXNzb3IuZmx1c2gKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iQ29tcHJlc3NvciAqIikKLQogRmluaXNoIHRoZSBjb21wcmVzc2lvbiBwcm9jZXNzLgogCiBSZXR1cm5zIHRoZSBjb21wcmVzc2VkIGRhdGEgbGVmdCBpbiBpbnRlcm5hbCBidWZmZXJzLgpAQCAtNTk0LDcgKzU5MSw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfbHptYV9MWk1BQ29tcHJlc3Nvcl9mbHVzaF9pbXBsKENvbXByZXNzb3IgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmVjMjFmM2UyMjUwNGY1MCBpbnB1dD0zMDYwZmIyNmY5YjQwNDJjXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmVjMjFmM2UyMjUwNGY1MCBpbnB1dD02YjM2OTMwM2Y2N2FkMGE4XSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKQEAgLTY5OCw3ICs2OTUsNiBAQAogLypbLWNsaW5pYyBpbnB1dF0KIF9sem1hLkxaTUFDb21wcmVzc29yLl9faW5pdF9fCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkNvbXByZXNzb3IgKiIpCiAgICAgZm9ybWF0OiBpbnQoY19kZWZhdWx0PSJGT1JNQVRfWFoiKSA9IEZPUk1BVF9YWgogICAgICAgICBUaGUgY29udGFpbmVyIGZvcm1hdCB0byB1c2UgZm9yIHRoZSBvdXRwdXQuICBUaGlzIGNhbgogICAgICAgICBiZSBGT1JNQVRfWFogKGRlZmF1bHQpLCBGT1JNQVRfQUxPTkUsIG9yIEZPUk1BVF9SQVcuCkBAIC0xMDYzLDcgKzEwNTksNiBAQAogLypbY2xpbmljIGlucHV0XQogX2x6bWEuTFpNQURlY29tcHJlc3Nvci5kZWNvbXByZXNzCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkRlY29tcHJlc3NvciAqIikKICAgICBkYXRhOiBQeV9idWZmZXIKICAgICBtYXhfbGVuZ3RoOiBQeV9zc2l6ZV90PS0xCiAKQEAgLTEwODYsNyArMTA4MSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogX2x6bWFfTFpNQURlY29tcHJlc3Nvcl9kZWNvbXByZXNzX2ltcGwoRGVjb21wcmVzc29yICpzZWxmLCBQeV9idWZmZXIgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heF9sZW5ndGgpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWY0ZTIwZWM3MTIyMjQxZCBpbnB1dD1mMmJiOTAyY2MxY2FmMjAzXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZWY0ZTIwZWM3MTIyMjQxZCBpbnB1dD02MGMxZjEzNTgyMGUzMDlkXSovCiB7CiAgICAgUHlPYmplY3QgKnJlc3VsdCA9IE5VTEw7CiAKQEAgLTExMjYsNyArMTEyMSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBfbHptYS5MWk1BRGVjb21wcmVzc29yLl9faW5pdF9fCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IkRlY29tcHJlc3NvciAqIikKICAgICBmb3JtYXQ6IGludChjX2RlZmF1bHQ9IkZPUk1BVF9BVVRPIikgPSBGT1JNQVRfQVVUTwogICAgICAgICBTcGVjaWZpZXMgdGhlIGNvbnRhaW5lciBmb3JtYXQgb2YgdGhlIGlucHV0IHN0cmVhbS4gIElmIHRoaXMgaXMKICAgICAgICAgRk9STUFUX0FVVE8gKHRoZSBkZWZhdWx0KSwgdGhlIGRlY29tcHJlc3NvciB3aWxsIGF1dG9tYXRpY2FsbHkgZGV0ZWN0CkBAIC0xMTUyLDcgKzExNDYsNyBAQAogc3RhdGljIGludAogX2x6bWFfTFpNQURlY29tcHJlc3Nvcl9fX2luaXRfX19pbXBsKERlY29tcHJlc3NvciAqc2VsZiwgaW50IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbWVtbGltaXQsIFB5T2JqZWN0ICpmaWx0ZXJzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNlMTgyMWY4YWEzNjU2NGMgaW5wdXQ9NDU4Y2E2MTMyZWYyOTgwMV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTNlMTgyMWY4YWEzNjU2NGMgaW5wdXQ9ODFmZTY4NGE2YzJmOGEyN10qLwogewogICAgIGNvbnN0IHVpbnQzMl90IGRlY29kZXJfZmxhZ3MgPSBMWk1BX1RFTExfQU5ZX0NIRUNLIHwgTFpNQV9URUxMX05PX0NIRUNLOwogICAgIHVpbnQ2NF90IG1lbWxpbWl0XyA9IFVJTlQ2NF9NQVg7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMgYi9Nb2R1bGVzL19tdWx0aXByb2Nlc3NpbmcvbXVsdGlwcm9jZXNzaW5nLmMKaW5kZXggNGFlNjM4ZS4uZDkyYThiZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fbXVsdGlwcm9jZXNzaW5nL211bHRpcHJvY2Vzc2luZy5jCisrKyBiL01vZHVsZXMvX211bHRpcHJvY2Vzc2luZy9tdWx0aXByb2Nlc3NpbmcuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgeyJyZWN2IiwgbXVsdGlwcm9jZXNzaW5nX3JlY3YsIE1FVEhfVkFSQVJHUywgIiJ9LAogICAgIHsic2VuZCIsIG11bHRpcHJvY2Vzc2luZ19zZW5kLCBNRVRIX1ZBUkFSR1MsICIifSwKICNlbmRpZgotI2lmbmRlZiBQT1NJWF9TRU1BUEhPUkVTX05PVF9FTkFCTEVECisjaWYgIWRlZmluZWQoUE9TSVhfU0VNQVBIT1JFU19OT1RfRU5BQkxFRCkgJiYgIWRlZmluZWQoX19BTkRST0lEX18pCiAgICAgeyJzZW1fdW5saW5rIiwgX1B5TXBfc2VtX3VubGluaywgTUVUSF9WQVJBUkdTLCAiIn0sCiAjZW5kaWYKICAgICB7TlVMTH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvX3BpY2tsZS5jIGIvTW9kdWxlcy9fcGlja2xlLmMKaW5kZXggM2MyMWI2YS4uZGRhYzI0MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fcGlja2xlLmMKKysrIGIvTW9kdWxlcy9fcGlja2xlLmMKQEAgLTE1Myw2ICsxNTMsOSBAQAogICAgIFB5T2JqZWN0ICpjb2RlY3NfZW5jb2RlOwogICAgIC8qIGJ1aWx0aW5zLmdldGF0dHIsIHVzZWQgZm9yIHNhdmluZyBuZXN0ZWQgbmFtZXMgd2l0aCBwcm90b2NvbCA8IDQgKi8KICAgICBQeU9iamVjdCAqZ2V0YXR0cjsKKyAgICAvKiBmdW5jdG9vbHMucGFydGlhbCwgdXNlZCBmb3IgaW1wbGVtZW50aW5nIF9fbmV3b2JqX2V4X18gd2l0aCBwcm90b2NvbHMKKyAgICAgICAyIGFuZCAzICovCisgICAgUHlPYmplY3QgKnBhcnRpYWw7CiB9IFBpY2tsZVN0YXRlOwogCiAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBfcGlja2xlIG1vZHVsZSBkZWZpbml0aW9uLiAqLwpAQCAtMTkwLDYgKzE5Myw3IEBACiAgICAgUHlfQ0xFQVIoc3QtPmltcG9ydF9tYXBwaW5nXzN0bzIpOwogICAgIFB5X0NMRUFSKHN0LT5jb2RlY3NfZW5jb2RlKTsKICAgICBQeV9DTEVBUihzdC0+Z2V0YXR0cik7CisgICAgUHlfQ0xFQVIoc3QtPnBhcnRpYWwpOwogfQogCiAvKiBJbml0aWFsaXplIHRoZSBnaXZlbiBwaWNrbGUgbW9kdWxlIHN0YXRlLiAqLwpAQCAtMjAwLDYgKzIwNCw3IEBACiAgICAgUHlPYmplY3QgKmNvcHlyZWcgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpjb21wYXRfcGlja2xlID0gTlVMTDsKICAgICBQeU9iamVjdCAqY29kZWNzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqZnVuY3Rvb2xzID0gTlVMTDsKIAogICAgIGJ1aWx0aW5zID0gUHlFdmFsX0dldEJ1aWx0aW5zKCk7CiAgICAgaWYgKGJ1aWx0aW5zID09IE5VTEwpCkBAIC0zMTQsMTIgKzMxOSwyMSBAQAogICAgIH0KICAgICBQeV9DTEVBUihjb2RlY3MpOwogCisgICAgZnVuY3Rvb2xzID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJmdW5jdG9vbHMiKTsKKyAgICBpZiAoIWZ1bmN0b29scykKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICBzdC0+cGFydGlhbCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZnVuY3Rvb2xzLCAicGFydGlhbCIpOworICAgIGlmICghc3QtPnBhcnRpYWwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgUHlfQ0xFQVIoZnVuY3Rvb2xzKTsKKwogICAgIHJldHVybiAwOwogCiAgIGVycm9yOgogICAgIFB5X0NMRUFSKGNvcHlyZWcpOwogICAgIFB5X0NMRUFSKGNvbXBhdF9waWNrbGUpOwogICAgIFB5X0NMRUFSKGNvZGVjcyk7CisgICAgUHlfQ0xFQVIoZnVuY3Rvb2xzKTsKICAgICBfUGlja2xlX0NsZWFyU3RhdGUoc3QpOwogICAgIHJldHVybiAtMTsKIH0KQEAgLTM1NiwxOCArMzcwLDEyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgaW50Ci1zdGFja191bmRlcmZsb3codm9pZCkKLXsKLSAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJ1bnBpY2tsaW5nIHN0YWNrIHVuZGVyZmxvdyIpOwotICAgIHJldHVybiAtMTsKLX0KLQogLyogSW50ZXJuYWwgZGF0YSB0eXBlIHVzZWQgYXMgdGhlIHVucGlja2xpbmcgc3RhY2suICovCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfVkFSX0hFQUQKICAgICBQeU9iamVjdCAqKmRhdGE7CisgICAgaW50IG1hcmtfc2V0OyAgICAgICAgICAvKiBpcyBNQVJLIHNldD8gKi8KKyAgICBQeV9zc2l6ZV90IGZlbmNlOyAgICAgIC8qIHBvc2l0aW9uIG9mIHRvcCBNQVJLIG9yIDAgKi8KICAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsgIC8qIG51bWJlciBvZiBzbG90cyBpbiBkYXRhIGFsbG9jYXRlZCAqLwogfSBQZGF0YTsKIApAQCAtMzk4LDYgKzQwNiw4IEBACiAgICAgaWYgKCEoc2VsZiA9IFB5T2JqZWN0X05ldyhQZGF0YSwgJlBkYXRhX1R5cGUpKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgUHlfU0laRShzZWxmKSA9IDA7CisgICAgc2VsZi0+bWFya19zZXQgPSAwOworICAgIHNlbGYtPmZlbmNlID0gMDsKICAgICBzZWxmLT5hbGxvY2F0ZWQgPSA4OwogICAgIHNlbGYtPmRhdGEgPSBQeU1lbV9NQUxMT0Moc2VsZi0+YWxsb2NhdGVkICogc2l6ZW9mKFB5T2JqZWN0ICopKTsKICAgICBpZiAoc2VsZi0+ZGF0YSkKQEAgLTQxNSw4ICs0MjUsNyBAQAogewogICAgIFB5X3NzaXplX3QgaSA9IFB5X1NJWkUoc2VsZik7CiAKLSAgICBpZiAoY2xlYXJ0byA8IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBhc3NlcnQoY2xlYXJ0byA+PSBzZWxmLT5mZW5jZSk7CiAgICAgaWYgKGNsZWFydG8gPj0gaSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTQ1Miw2ICs0NjEsMTcgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBpbnQKK1BkYXRhX3N0YWNrX3VuZGVyZmxvdyhQZGF0YSAqc2VsZikKK3sKKyAgICBQaWNrbGVTdGF0ZSAqc3QgPSBfUGlja2xlX0dldEdsb2JhbFN0YXRlKCk7CisgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIHNlbGYtPm1hcmtfc2V0ID8KKyAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgTUFSSyBmb3VuZCIgOgorICAgICAgICAgICAgICAgICAgICAidW5waWNrbGluZyBzdGFjayB1bmRlcmZsb3ciKTsKKyAgICByZXR1cm4gLTE7Cit9CisKIC8qIEQgaXMgYSBQZGF0YSouICBQb3AgdGhlIHRvcG1vc3QgZWxlbWVudCBhbmQgc3RvcmUgaXQgaW50byBWLCB3aGljaAogICogbXVzdCBiZSBhbiBsdmFsdWUgaG9sZGluZyBQeU9iamVjdCouICBPbiBzdGFjayB1bmRlcmZsb3csIFVucGlja2xpbmdFcnJvcgogICogaXMgcmFpc2VkIGFuZCBWIGlzIHNldCB0byBOVUxMLgpAQCAtNDU5LDkgKzQ3OSw4IEBACiBzdGF0aWMgUHlPYmplY3QgKgogUGRhdGFfcG9wKFBkYXRhICpzZWxmKQogewotICAgIGlmIChQeV9TSVpFKHNlbGYpID09IDApIHsKLSAgICAgICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOwotICAgICAgICBQeUVycl9TZXRTdHJpbmcoc3QtPlVucGlja2xpbmdFcnJvciwgImJhZCBwaWNrbGUgZGF0YSIpOworICAgIGlmIChQeV9TSVpFKHNlbGYpIDw9IHNlbGYtPmZlbmNlKSB7CisgICAgICAgIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHJldHVybiBzZWxmLT5kYXRhWy0tUHlfU0laRShzZWxmKV07CkBAIC00OTMsNiArNTEyLDEwIEBACiAgICAgUHlPYmplY3QgKnR1cGxlOwogICAgIFB5X3NzaXplX3QgbGVuLCBpLCBqOwogCisgICAgaWYgKHN0YXJ0IDwgc2VsZi0+ZmVuY2UpIHsKKyAgICAgICAgUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgbGVuID0gUHlfU0laRShzZWxmKSAtIHN0YXJ0OwogICAgIHR1cGxlID0gUHlUdXBsZV9OZXcobGVuKTsKICAgICBpZiAodHVwbGUgPT0gTlVMTCkKQEAgLTg2MCw3ICs4ODMsNyBAQAogewogICAgIHNpemVfdCBpOwogCi0gICAgYXNzZXJ0KHNpemVvZihzaXplX3QpIDw9IDgpOworICAgIFB5X0JVSUxEX0FTU0VSVChzaXplb2Yoc2l6ZV90KSA8PSA4KTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoc2l6ZV90KTsgaSsrKSB7CiAgICAgICAgIG91dFtpXSA9ICh1bnNpZ25lZCBjaGFyKSgodmFsdWUgPj4gKDggKiBpKSkgJiAweGZmKTsKQEAgLTExNzQsMjEgKzExOTcsOSBAQAogICAgIHJldHVybiByZWFkX3NpemU7CiB9CiAKLS8qIFJlYWQgYG5gIGJ5dGVzIGZyb20gdGhlIHVucGlja2xlcidzIGRhdGEgc291cmNlLCBzdG9yaW5nIHRoZSByZXN1bHQgaW4gYCpzYC4KLQotICAgVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIGRhdGEgcmVhZHMsIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgdW5waWNrbGVyJ3MKLSAgIGlucHV0IGJ1ZmZlciBkaXJlY3RseS4gVGhpcyBtZXRob2QgZGVhbHMgY29ycmVjdGx5IHdpdGggcmVhZGluZyBmcm9tIGlucHV0Ci0gICBzdHJlYW1zLCB3aGljaCB0aGUgaW5wdXQgYnVmZmVyIGRvZXNuJ3QgZGVhbCB3aXRoLgotCi0gICBOb3RlIHRoYXQgd2hlbiByZWFkaW5nIGZyb20gYSBmaWxlLWxpa2Ugb2JqZWN0LCBzZWxmLT5uZXh0X3JlYWRfaWR4IHdvbid0Ci0gICBiZSB1cGRhdGVkIChpdCBzaG91bGQgcmVtYWluIGF0IDAgZm9yIHRoZSBlbnRpcmUgdW5waWNrbGluZyBwcm9jZXNzKS4gWW91Ci0gICBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUgdG8ga25vdyBob3cgbWFueSBieXRlcyB5b3UgY2FuCi0gICBjb25zdW1lLgotCi0gICBSZXR1cm5zIC0xICh3aXRoIGFuIGV4Y2VwdGlvbiBzZXQpIG9uIGZhaWx1cmUuIE9uIHN1Y2Nlc3MsIHJldHVybiB0aGUKLSAgIG51bWJlciBvZiBjaGFycyByZWFkLiAqLworLyogRG9uJ3QgY2FsbCBpdCBkaXJlY3RseTogdXNlIF9VbnBpY2tsZXJfUmVhZCgpICovCiBzdGF0aWMgUHlfc3NpemVfdAotX1VucGlja2xlcl9SZWFkKFVucGlja2xlck9iamVjdCAqc2VsZiwgY2hhciAqKnMsIFB5X3NzaXplX3QgbikKK19VbnBpY2tsZXJfUmVhZEltcGwoVW5waWNrbGVyT2JqZWN0ICpzZWxmLCBjaGFyICoqcywgUHlfc3NpemVfdCBuKQogewogICAgIFB5X3NzaXplX3QgbnVtX3JlYWQ7CiAKQEAgLTExOTksMTEgKzEyMTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkIHdvdWxkIG92ZXJmbG93IChpbnZhbGlkIGJ5dGVjb2RlKSIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChzZWxmLT5uZXh0X3JlYWRfaWR4ICsgbiA8PSBzZWxmLT5pbnB1dF9sZW4pIHsKLSAgICAgICAgKnMgPSBzZWxmLT5pbnB1dF9idWZmZXIgKyBzZWxmLT5uZXh0X3JlYWRfaWR4OwotICAgICAgICBzZWxmLT5uZXh0X3JlYWRfaWR4ICs9IG47Ci0gICAgICAgIHJldHVybiBuOwotICAgIH0KKworICAgIC8qIFRoaXMgY2FzZSBpcyBoYW5kbGVkIGJ5IHRoZSBfVW5waWNrbGVyX1JlYWQoKSBtYWNybyBmb3IgZWZmaWNpZW5jeSAqLworICAgIGFzc2VydChzZWxmLT5uZXh0X3JlYWRfaWR4ICsgbiA+IHNlbGYtPmlucHV0X2xlbik7CisKICAgICBpZiAoIXNlbGYtPnJlYWQpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0VPRkVycm9yLCAiUmFuIG91dCBvZiBpbnB1dCIpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0xMjIwLDYgKzEyMzAsMjYgQEAKICAgICByZXR1cm4gbjsKIH0KIAorLyogUmVhZCBgbmAgYnl0ZXMgZnJvbSB0aGUgdW5waWNrbGVyJ3MgZGF0YSBzb3VyY2UsIHN0b3JpbmcgdGhlIHJlc3VsdCBpbiBgKnNgLgorCisgICBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBhbGwgZGF0YSByZWFkcywgcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSB1bnBpY2tsZXIncworICAgaW5wdXQgYnVmZmVyIGRpcmVjdGx5LiBUaGlzIG1ldGhvZCBkZWFscyBjb3JyZWN0bHkgd2l0aCByZWFkaW5nIGZyb20gaW5wdXQKKyAgIHN0cmVhbXMsIHdoaWNoIHRoZSBpbnB1dCBidWZmZXIgZG9lc24ndCBkZWFsIHdpdGguCisKKyAgIE5vdGUgdGhhdCB3aGVuIHJlYWRpbmcgZnJvbSBhIGZpbGUtbGlrZSBvYmplY3QsIHNlbGYtPm5leHRfcmVhZF9pZHggd29uJ3QKKyAgIGJlIHVwZGF0ZWQgKGl0IHNob3VsZCByZW1haW4gYXQgMCBmb3IgdGhlIGVudGlyZSB1bnBpY2tsaW5nIHByb2Nlc3MpLiBZb3UKKyAgIHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSB0byBrbm93IGhvdyBtYW55IGJ5dGVzIHlvdSBjYW4KKyAgIGNvbnN1bWUuCisKKyAgIFJldHVybnMgLTEgKHdpdGggYW4gZXhjZXB0aW9uIHNldCkgb24gZmFpbHVyZS4gT24gc3VjY2VzcywgcmV0dXJuIHRoZQorICAgbnVtYmVyIG9mIGNoYXJzIHJlYWQuICovCisjZGVmaW5lIF9VbnBpY2tsZXJfUmVhZChzZWxmLCBzLCBuKSBcCisgICAgKCgobikgPD0gKHNlbGYpLT5pbnB1dF9sZW4gLSAoc2VsZiktPm5leHRfcmVhZF9pZHgpICAgICAgXAorICAgICA/ICgqKHMpID0gKHNlbGYpLT5pbnB1dF9idWZmZXIgKyAoc2VsZiktPm5leHRfcmVhZF9pZHgsIFwKKyAgICAgICAgKHNlbGYpLT5uZXh0X3JlYWRfaWR4ICs9IChuKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChuKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICA6IF9VbnBpY2tsZXJfUmVhZEltcGwoc2VsZiwgKHMpLCAobikpKQorCiBzdGF0aWMgUHlfc3NpemVfdAogX1VucGlja2xlcl9Db3B5TGluZShVbnBpY2tsZXJPYmplY3QgKnNlbGYsIGNoYXIgKmxpbmUsIFB5X3NzaXplX3QgbGVuLAogICAgICAgICAgICAgICAgICAgICBjaGFyICoqcmVzdWx0KQpAQCAtMjA5NiwzOCArMjEyNiwzNSBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHJhd191bmljb2RlX2VzY2FwZShQeU9iamVjdCAqb2JqKQogewotICAgIFB5T2JqZWN0ICpyZXByOwogICAgIGNoYXIgKnA7CiAgICAgUHlfc3NpemVfdCBpLCBzaXplOwotICAgIHNpemVfdCBleHBhbmRzaXplOwogICAgIHZvaWQgKmRhdGE7CiAgICAgdW5zaWduZWQgaW50IGtpbmQ7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShvYmopKQogICAgICAgICByZXR1cm4gTlVMTDsKIAorICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisKICAgICBzaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgob2JqKTsKICAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEob2JqKTsKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQob2JqKTsKLSAgICBpZiAoa2luZCA9PSBQeVVuaWNvZGVfNEJZVEVfS0lORCkKLSAgICAgICAgZXhwYW5kc2l6ZSA9IDEwOwotICAgIGVsc2UKLSAgICAgICAgZXhwYW5kc2l6ZSA9IDY7CiAKLSAgICBpZiAoKHNpemVfdClzaXplID4gKHNpemVfdClQWV9TU0laRV9UX01BWCAvIGV4cGFuZHNpemUpCi0gICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotICAgIHJlcHIgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGV4cGFuZHNpemUgKiBzaXplKTsKLSAgICBpZiAocmVwciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgICAgICByZXR1cm4gcmVwcjsKLSAgICBhc3NlcnQoUHlfUkVGQ05UKHJlcHIpID09IDEpOworICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBzaXplKTsKKyAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOwogCi0gICAgcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpOwogICAgIGZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKICAgICAgICAgLyogTWFwIDMyLWJpdCBjaGFyYWN0ZXJzIHRvICdcVXh4eHh4eHh4JyAqLwogICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgeworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAxMC0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ1UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMjgpICYgMHhmXTsKQEAgLTIxMzksOCArMjE2NiwxMyBAQAogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gNCkgJiAweGZdOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1tjaCAmIDE1XTsKICAgICAgICAgfQotICAgICAgICAvKiBNYXAgMTYtYml0IGNoYXJhY3RlcnMgdG8gJ1x1eHh4eCcgKi8KKyAgICAgICAgLyogTWFwIDE2LWJpdCBjaGFyYWN0ZXJzLCAnXFwnIGFuZCAnXG4nIHRvICdcdXh4eHgnICovCiAgICAgICAgIGVsc2UgaWYgKGNoID49IDI1NiB8fCBjaCA9PSAnXFwnIHx8IGNoID09ICdcbicpIHsKKyAgICAgICAgICAgIC8qIC0xOiBzdWJzdHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgNi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMTIpICYgMHhmXTsKQEAgLTIxNTIsMTQgKzIxODQsMTYgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICB9Ci0gICAgc2l6ZSA9IHAgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXByKTsKLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXByLCBzaXplKSA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXByOworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKworZXJyb3I6CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGludAotd3JpdGVfdXRmOChQaWNrbGVyT2JqZWN0ICpzZWxmLCBjaGFyICpkYXRhLCBQeV9zc2l6ZV90IHNpemUpCit3cml0ZV91dGY4KFBpY2tsZXJPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKmRhdGEsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKICAgICBjaGFyIGhlYWRlcls5XTsKICAgICBQeV9zc2l6ZV90IGxlbjsKQEAgLTM1MzUsMTEgKzM1NjksOSBAQAogICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sobmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChzZWxmLT5wcm90byA+PSA0KSB7Ci0gICAgICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoX19uZXdvYmpfZXhfXyk7Ci0gICAgICAgICAgICAgICAgdXNlX25ld29ial9leCA9IFB5VW5pY29kZV9Db21wYXJlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgX1B5VW5pY29kZV9Gcm9tSWQoJlB5SWRfX19uZXdvYmpfZXhfXykpID09IDA7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld29ial9leF9fKTsKKyAgICAgICAgICAgIHVzZV9uZXdvYmpfZXggPSBQeVVuaWNvZGVfQ29tcGFyZSgKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgX1B5VW5pY29kZV9Gcm9tSWQoJlB5SWRfX19uZXdvYmpfZXhfXykpID09IDA7CiAgICAgICAgICAgICBpZiAoIXVzZV9uZXdvYmpfZXgpIHsKICAgICAgICAgICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld29ial9fKTsKICAgICAgICAgICAgICAgICB1c2VfbmV3b2JqID0gUHlVbmljb2RlX0NvbXBhcmUoCkBAIC0zNTgzLDExICszNjE1LDU4IEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc2F2ZShzZWxmLCBjbHMsIDApIDwgMCB8fAotICAgICAgICAgICAgc2F2ZShzZWxmLCBhcmdzLCAwKSA8IDAgfHwKLSAgICAgICAgICAgIHNhdmUoc2VsZiwga3dhcmdzLCAwKSA8IDAgfHwKLSAgICAgICAgICAgIF9QaWNrbGVyX1dyaXRlKHNlbGYsICZuZXdvYmpfZXhfb3AsIDEpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoc2VsZi0+cHJvdG8gPj0gNCkgeworICAgICAgICAgICAgaWYgKHNhdmUoc2VsZiwgY2xzLCAwKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBzYXZlKHNlbGYsIGFyZ3MsIDApIDwgMCB8fAorICAgICAgICAgICAgICAgIHNhdmUoc2VsZiwga3dhcmdzLCAwKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBfUGlja2xlcl9Xcml0ZShzZWxmLCAmbmV3b2JqX2V4X29wLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBQeU9iamVjdCAqbmV3YXJnczsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjbHNfbmV3OworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgX1B5X0lERU5USUZJRVIoX19uZXdfXyk7CisKKyAgICAgICAgICAgIG5ld2FyZ3MgPSBQeVR1cGxlX05ldyhQeV9TSVpFKGFyZ3MpICsgMik7CisgICAgICAgICAgICBpZiAobmV3YXJncyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgY2xzX25ldyA9IF9QeU9iamVjdF9HZXRBdHRySWQoY2xzLCAmUHlJZF9fX25ld19fKTsKKyAgICAgICAgICAgIGlmIChjbHNfbmV3ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCAwLCBjbHNfbmV3KTsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihjbHMpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCAxLCBjbHMpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5X1NJWkUoYXJncyk7IGkrKykgeworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXRlbSk7CisgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShuZXdhcmdzLCBpICsgMiwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhbGxhYmxlID0gUHlPYmplY3RfQ2FsbChzdC0+cGFydGlhbCwgbmV3YXJncywga3dhcmdzKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihuZXdhcmdzKTsKKyAgICAgICAgICAgIGlmIChjYWxsYWJsZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgbmV3YXJncyA9IFB5VHVwbGVfTmV3KDApOworICAgICAgICAgICAgaWYgKG5ld2FyZ3MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjYWxsYWJsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2F2ZShzZWxmLCBjYWxsYWJsZSwgMCkgPCAwIHx8CisgICAgICAgICAgICAgICAgc2F2ZShzZWxmLCBuZXdhcmdzLCAwKSA8IDAgfHwKKyAgICAgICAgICAgICAgICBfUGlja2xlcl9Xcml0ZShzZWxmLCAmcmVkdWNlX29wLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGNhbGxhYmxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9ERUNSRUYobmV3YXJncyk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY2FsbGFibGUpOwogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgaWYgKHVzZV9uZXdvYmopIHsKQEAgLTQzOTcsNyArNDQ3Niw3IEBACiAgICAgfQogICAgIGVsc2UgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIidtZW1vJyBhdHRyaWJ1dGUgbXVzdCBiZSBhbiBQaWNrbGVyTWVtb1Byb3h5IG9iamVjdCIKKyAgICAgICAgICAgICAgICAgICAgICInbWVtbycgYXR0cmlidXRlIG11c3QgYmUgYSBQaWNrbGVyTWVtb1Byb3h5IG9iamVjdCIKICAgICAgICAgICAgICAgICAgICAgICJvciBkaWN0LCBub3QgJS4yMDBzIiwgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTQ0MjYsOCArNDUwNSw2IEBACiBzdGF0aWMgaW50CiBQaWNrbGVyX3NldF9wZXJzaWQoUGlja2xlck9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnZhbHVlKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAodmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZSBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkIik7CkBAIC00NDM5LDEwICs0NTE2LDggQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHRtcCA9IHNlbGYtPnBlcnNfZnVuYzsKICAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIHNlbGYtPnBlcnNfZnVuYyA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYodG1wKTsgICAgICAvKiBzZWxmLT5wZXJzX2Z1bmMgY2FuIGJlIE5VTEwsIHNvIGJlIGNhcmVmdWwuICovCisgICAgUHlfWFNFVFJFRihzZWxmLT5wZXJzX2Z1bmMsIHZhbHVlKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNDUyNCwxMyArNDU5OSwxOSBAQAogc3RhdGljIFB5X3NzaXplX3QKIG1hcmtlcihVbnBpY2tsZXJPYmplY3QgKnNlbGYpCiB7Ci0gICAgUGlja2xlU3RhdGUgKnN0ID0gX1BpY2tsZV9HZXRHbG9iYWxTdGF0ZSgpOworICAgIFB5X3NzaXplX3QgbWFyazsKKwogICAgIGlmIChzZWxmLT5udW1fbWFya3MgPCAxKSB7CisgICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJjb3VsZCBub3QgZmluZCBNQVJLIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByZXR1cm4gc2VsZi0+bWFya3NbLS1zZWxmLT5udW1fbWFya3NdOworICAgIG1hcmsgPSBzZWxmLT5tYXJrc1stLXNlbGYtPm51bV9tYXJrc107CisgICAgc2VsZi0+c3RhY2stPm1hcmtfc2V0ID0gc2VsZi0+bnVtX21hcmtzICE9IDA7CisgICAgc2VsZi0+c3RhY2stPmZlbmNlID0gc2VsZi0+bnVtX21hcmtzID8KKyAgICAgICAgICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdIDogMDsKKyAgICByZXR1cm4gbWFyazsKIH0KIAogc3RhdGljIGludApAQCAtNDk5MSw3ICs1MDcyLDcgQEAKICAgICBQeU9iamVjdCAqdHVwbGU7CiAKICAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPCBsZW4pCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAKICAgICB0dXBsZSA9IFBkYXRhX3BvcHR1cGxlKHNlbGYtPnN0YWNrLCBQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIGxlbik7CiAgICAgaWYgKHR1cGxlID09IE5VTEwpCkBAIC01MDczLDYgKzUxNTQsMTMgQEAKICAgICBpZiAoKGRpY3QgPSBQeURpY3RfTmV3KCkpID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKIAorICAgIGlmICgoaiAtIGkpICUgMiAhPSAwKSB7CisgICAgICAgIFBpY2tsZVN0YXRlICpzdCA9IF9QaWNrbGVfR2V0R2xvYmFsU3RhdGUoKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHN0LT5VbnBpY2tsaW5nRXJyb3IsICJvZGQgbnVtYmVyIG9mIGl0ZW1zIGZvciBESUNUIik7CisgICAgICAgIFB5X0RFQ1JFRihkaWN0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKwogICAgIGZvciAoayA9IGkgKyAxOyBrIDwgajsgayArPSAyKSB7CiAgICAgICAgIGtleSA9IHNlbGYtPnN0YWNrLT5kYXRhW2sgLSAxXTsKICAgICAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtrXTsKQEAgLTUxNDAsNyArNTIyOCw3IEBACiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIGkgPCAxKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogCiAgICAgYXJncyA9IFBkYXRhX3BvcHR1cGxlKHNlbGYtPnN0YWNrLCBpICsgMSk7CiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKQEAgLTU0NjMsMTIgKzU1NTEsMTUgQEAKICAgICAgKi8KICAgICBpZiAoc2VsZi0+bnVtX21hcmtzID4gMCAmJiBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MgLSAxXSA9PSBsZW4pIHsKICAgICAgICAgc2VsZi0+bnVtX21hcmtzLS07Ci0gICAgfSBlbHNlIGlmIChsZW4gPiAwKSB7CisgICAgICAgIHNlbGYtPnN0YWNrLT5tYXJrX3NldCA9IHNlbGYtPm51bV9tYXJrcyAhPSAwOworICAgICAgICBzZWxmLT5zdGFjay0+ZmVuY2UgPSBzZWxmLT5udW1fbWFya3MgPworICAgICAgICAgICAgICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcyAtIDFdIDogMDsKKyAgICB9IGVsc2UgaWYgKGxlbiA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOworICAgIGVsc2UgewogICAgICAgICBsZW4tLTsKICAgICAgICAgUHlfREVDUkVGKHNlbGYtPnN0YWNrLT5kYXRhW2xlbl0pOwogICAgICAgICBQeV9TSVpFKHNlbGYtPnN0YWNrKSA9IGxlbjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtNTQ5MCwxMCArNTU4MSwxMCBAQAogbG9hZF9kdXAoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewogICAgIFB5T2JqZWN0ICpsYXN0OwotICAgIFB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgbGVuID0gUHlfU0laRShzZWxmLT5zdGFjayk7CiAKLSAgICBpZiAoKGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKGxlbiA8PSBzZWxmLT5zdGFjay0+ZmVuY2UpCisgICAgICAgIHJldHVybiBQZGF0YV9zdGFja191bmRlcmZsb3coc2VsZi0+c3RhY2spOwogICAgIGxhc3QgPSBzZWxmLT5zdGFjay0+ZGF0YVtsZW4gLSAxXTsKICAgICBQREFUQV9BUFBFTkQoc2VsZi0+c3RhY2ssIGxhc3QsIC0xKTsKICAgICByZXR1cm4gMDsKQEAgLTU2NzYsOCArNTc2Nyw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAobGVuIDwgMikKICAgICAgICAgcmV0dXJuIGJhZF9yZWFkbGluZSgpOwotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAga2V5ID0gUHlMb25nX0Zyb21TdHJpbmcocywgTlVMTCwgMTApOwpAQCAtNTcwNSw4ICs1Nzk2LDggQEAKICAgICBpZiAoX1VucGlja2xlcl9SZWFkKHNlbGYsICZzLCAxKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAgaWR4ID0gUHlfQ0hBUk1BU0soc1swXSk7CkBAIC01NzI0LDggKzU4MTUsOCBAQAogICAgIGlmIChfVW5waWNrbGVyX1JlYWQoc2VsZiwgJnMsIDQpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICB2YWx1ZSA9IHNlbGYtPnN0YWNrLT5kYXRhW1B5X1NJWkUoc2VsZi0+c3RhY2spIC0gMV07CiAKICAgICBpZHggPSBjYWxjX2JpbnNpemUocywgNCk7CkBAIC01NzQzLDggKzU4MzQsOCBAQAogewogICAgIFB5T2JqZWN0ICp2YWx1ZTsKIAotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSA8PSAwKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgdmFsdWUgPSBzZWxmLT5zdGFjay0+ZGF0YVtQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDFdOwogCiAgICAgcmV0dXJuIF9VbnBpY2tsZXJfTWVtb1B1dChzZWxmLCBzZWxmLT5tZW1vX2xlbiwgdmFsdWUpOwpAQCAtNTc1OCw4ICs1ODQ5LDggQEAKICAgICBQeV9zc2l6ZV90IGxlbiwgaTsKIAogICAgIGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwotICAgIGlmICh4ID4gbGVuIHx8IHggPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmICh4ID4gbGVuIHx8IHggPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBpZiAobGVuID09IHgpICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgIHJldHVybiAwOwogCkBAIC01ODA4LDggKzU4OTksOCBAQAogc3RhdGljIGludAogbG9hZF9hcHBlbmQoVW5waWNrbGVyT2JqZWN0ICpzZWxmKQogewotICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDEgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSAtIDEgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICByZXR1cm4gZG9fYXBwZW5kKHNlbGYsIFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMSk7CiB9CiAKQEAgLTU4MzEsOCArNTkyMiw4IEBACiAgICAgaW50IHN0YXR1cyA9IDA7CiAKICAgICBsZW4gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKLSAgICBpZiAoeCA+IGxlbiB8fCB4IDw9IDApCi0gICAgICAgIHJldHVybiBzdGFja191bmRlcmZsb3coKTsKKyAgICBpZiAoeCA+IGxlbiB8fCB4IDw9IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAgICAgaWYgKGxlbiA9PSB4KSAgLyogbm90aGluZyB0byBkbyAqLwogICAgICAgICByZXR1cm4gMDsKICAgICBpZiAoKGxlbiAtIHgpICUgMiAhPSAwKSB7CkBAIC01ODg1LDggKzU5NzYsOCBAQAogICAgIGlmIChtYXJrIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGxlbiA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwotICAgIGlmIChtYXJrID4gbGVuIHx8IG1hcmsgPD0gMCkKLSAgICAgICAgcmV0dXJuIHN0YWNrX3VuZGVyZmxvdygpOworICAgIGlmIChtYXJrID4gbGVuIHx8IG1hcmsgPD0gc2VsZi0+c3RhY2stPmZlbmNlKQorICAgICAgICByZXR1cm4gUGRhdGFfc3RhY2tfdW5kZXJmbG93KHNlbGYtPnN0YWNrKTsKICAgICBpZiAobGVuID09IG1hcmspICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgICAgIHJldHVybiAwOwogCkBAIC01OTQxLDggKzYwMzIsOCBAQAogICAgIC8qIFN0YWNrIGlzIC4uLiBpbnN0YW5jZSwgc3RhdGUuICBXZSB3YW50IHRvIGxlYXZlIGluc3RhbmNlIGF0CiAgICAgICogdGhlIHN0YWNrIHRvcCwgcG9zc2libHkgbXV0YXRlZCB2aWEgaW5zdGFuY2UuX19zZXRzdGF0ZV9fKHN0YXRlKS4KICAgICAgKi8KLSAgICBpZiAoUHlfU0laRShzZWxmLT5zdGFjaykgPCAyKQotICAgICAgICByZXR1cm4gc3RhY2tfdW5kZXJmbG93KCk7CisgICAgaWYgKFB5X1NJWkUoc2VsZi0+c3RhY2spIC0gMiA8IHNlbGYtPnN0YWNrLT5mZW5jZSkKKyAgICAgICAgcmV0dXJuIFBkYXRhX3N0YWNrX3VuZGVyZmxvdyhzZWxmLT5zdGFjayk7CiAKICAgICBQREFUQV9QT1Aoc2VsZi0+c3RhY2ssIHN0YXRlKTsKICAgICBpZiAoc3RhdGUgPT0gTlVMTCkKQEAgLTYwNzgsNyArNjE2OSw4IEBACiAgICAgICAgIHNlbGYtPm1hcmtzX3NpemUgPSAoUHlfc3NpemVfdClhbGxvYzsKICAgICB9CiAKLSAgICBzZWxmLT5tYXJrc1tzZWxmLT5udW1fbWFya3MrK10gPSBQeV9TSVpFKHNlbGYtPnN0YWNrKTsKKyAgICBzZWxmLT5zdGFjay0+bWFya19zZXQgPSAxOworICAgIHNlbGYtPm1hcmtzW3NlbGYtPm51bV9tYXJrcysrXSA9IHNlbGYtPnN0YWNrLT5mZW5jZSA9IFB5X1NJWkUoc2VsZi0+c3RhY2spOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC02MTYxLDYgKzYyNTMsOCBAQAogICAgIGNoYXIgKnMgPSBOVUxMOwogCiAgICAgc2VsZi0+bnVtX21hcmtzID0gMDsKKyAgICBzZWxmLT5zdGFjay0+bWFya19zZXQgPSAwOworICAgIHNlbGYtPnN0YWNrLT5mZW5jZSA9IDA7CiAgICAgc2VsZi0+cHJvdG8gPSAwOwogICAgIGlmIChQeV9TSVpFKHNlbGYtPnN0YWNrKSkKICAgICAgICAgUGRhdGFfY2xlYXIoc2VsZi0+c3RhY2ssIDApOwpAQCAtNjg2NSw4ICs2OTU5LDYgQEAKIHN0YXRpYyBpbnQKIFVucGlja2xlcl9zZXRfcGVyc2xvYWQoVW5waWNrbGVyT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdmFsdWUpCiB7Ci0gICAgUHlPYmplY3QgKnRtcDsKLQogICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKQEAgLTY4NzksMTAgKzY5NzEsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgdG1wID0gc2VsZi0+cGVyc19mdW5jOwogICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgc2VsZi0+cGVyc19mdW5jID0gdmFsdWU7Ci0gICAgUHlfWERFQ1JFRih0bXApOyAgICAgIC8qIHNlbGYtPnBlcnNfZnVuYyBjYW4gYmUgTlVMTCwgc28gYmUgY2FyZWZ1bC4gKi8KKyAgICBQeV9YU0VUUkVGKHNlbGYtPnBlcnNfZnVuYywgdmFsdWUpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19wb3NpeHN1YnByb2Nlc3MuYyBiL01vZHVsZXMvX3Bvc2l4c3VicHJvY2Vzcy5jCmluZGV4IDhiZWRhYjUuLjBjYTBhYTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Bvc2l4c3VicHJvY2Vzcy5jCisrKyBiL01vZHVsZXMvX3Bvc2l4c3VicHJvY2Vzcy5jCkBAIC0yMSw4ICsyMSw3IEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmICFkZWZpbmVkKFNZU19nZXRkZW50czY0KQotLyogQW5kcm9pZCBkb2Vzbid0IGV4cG9zZSBzeXNjYWxscywgYWRkIHRoZSBkZWZpbml0aW9uIG1hbnVhbGx5LiAqLworI2lmIGRlZmluZWQoX19BTkRST0lEX18pICYmIF9fQU5EUk9JRF9BUElfXyA8IDIxICYmICFkZWZpbmVkKFNZU19nZXRkZW50czY0KQogIyBpbmNsdWRlIDxzeXMvbGludXgtc3lzY2FsbHMuaD4KICMgZGVmaW5lIFNZU19nZXRkZW50czY0ICBfX05SX2dldGRlbnRzNjQKICNlbmRpZgpAQCAtNzIsNyArNzEsNyBAQAogCiAvKiBDb252ZXJ0IEFTQ0lJIHRvIGEgcG9zaXRpdmUgaW50LCBubyBsaWJjIGNhbGwuIG5vIG92ZXJmbG93LiAtMSBvbiBlcnJvci4gKi8KIHN0YXRpYyBpbnQKLV9wb3NfaW50X2Zyb21fYXNjaWkoY2hhciAqbmFtZSkKK19wb3NfaW50X2Zyb21fYXNjaWkoY29uc3QgY2hhciAqbmFtZSkKIHsKICAgICBpbnQgbnVtID0gMDsKICAgICB3aGlsZSAoKm5hbWUgPj0gJzAnICYmICpuYW1lIDw9ICc5JykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMgYi9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYwppbmRleCA5NWFkNGE0Li5mZDZiMjMwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYworKysgYi9Nb2R1bGVzL19yYW5kb21tb2R1bGUuYwpAQCAtOTksNyArOTksNyBAQAogZ2VucmFuZF9pbnQzMihSYW5kb21PYmplY3QgKnNlbGYpCiB7CiAgICAgUFlfVUlOVDMyX1QgeTsKLSAgICBzdGF0aWMgUFlfVUlOVDMyX1QgbWFnMDFbMl09ezB4MFUsIE1BVFJJWF9BfTsKKyAgICBzdGF0aWMgY29uc3QgUFlfVUlOVDMyX1QgbWFnMDFbMl0gPSB7MHgwVSwgTUFUUklYX0F9OwogICAgIC8qIG1hZzAxW3hdID0geCAqIE1BVFJJWF9BICBmb3IgeD0wLDEgKi8KICAgICBQWV9VSU5UMzJfVCAqbXQ7CiAKQEAgLTEzNiw3ICsxMzYsNyBAQAogICogb3B0aW1pemUgdGhlIGRpdmlzaW9uIGF3YXkgYXQgY29tcGlsZS10aW1lLiAgNjcxMDg4NjQgaXMgMioqMjYuICBJbgogICogZWZmZWN0LCBhIGNvbnRhaW5zIDI3IHJhbmRvbSBiaXRzIHNoaWZ0ZWQgbGVmdCAyNiwgYW5kIGIgZmlsbHMgaW4gdGhlCiAgKiBsb3dlciAyNiBiaXRzIG9mIHRoZSA1My1iaXQgbnVtZXJhdG9yLgotICogVGhlIG9yZ2luYWwgY29kZSBjcmVkaXRlZCBJc2FrdSBXYWRhIGZvciB0aGlzIGFsZ29yaXRobSwgMjAwMi8wMS8wOS4KKyAqIFRoZSBvcmlnaW5hbCBjb2RlIGNyZWRpdGVkIElzYWt1IFdhZGEgZm9yIHRoaXMgYWxnb3JpdGhtLCAyMDAyLzAxLzA5LgogICovCiBzdGF0aWMgUHlPYmplY3QgKgogcmFuZG9tX3JhbmRvbShSYW5kb21PYmplY3QgKnNlbGYpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zY3Byb3h5LmMgYi9Nb2R1bGVzL19zY3Byb3h5LmMKaW5kZXggNjZiNmUzNC4uNjhiZTQ1OCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc2Nwcm94eS5jCisrKyBiL01vZHVsZXMvX3NjcHJveHkuYwpAQCAtMTMwLDcgKzEzMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNldF9wcm94eShQeU9iamVjdCogcHJveGllcywgY2hhciogcHJvdG8sIENGRGljdGlvbmFyeVJlZiBwcm94eURpY3QsCitzZXRfcHJveHkoUHlPYmplY3QqIHByb3hpZXMsIGNvbnN0IGNoYXIqIHByb3RvLCBDRkRpY3Rpb25hcnlSZWYgcHJveHlEaWN0LAogICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmIGVuYWJsZWRLZXksCiAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgaG9zdEtleSwgQ0ZTdHJpbmdSZWYgcG9ydEtleSkKIHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9jYWNoZS5jIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKaW5kZXggMzY4OWE0ZS4uNjJjNTg5MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL2NhY2hlLmMKQEAgLTI0NCw4ICsyNDQsNyBAQAogICAgICAgICBwdHIgPSBwdHItPm5leHQ7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlNZXRob2REZWYgY2FjaGVfbWV0aG9kc1tdID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKaW5kZXggNmFhNDc2NC4uNTM0OTI5OSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCkBAIC0zNTIsOCArMzUyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogLyoKQEAgLTg2MSw4ICs4NjAsNyBAQAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGZ1bmMsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC04OTMsOCArODkxLDcgQEAKICAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtKHNlbGYtPmZ1bmN0aW9uX3BpbmJvYXJkLCBhZ2dyZWdhdGVfY2xhc3MsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC0xMDI5LDggKzEwMjYsNyBAQAogICAgICAgICBpZiAoUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGF1dGhvcml6ZXJfY2IsIFB5X05vbmUpID09IC0xKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogfQogCkBAIC0xMDU5LDggKzEwNTUsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiBzdGF0aWMgUHlPYmplY3QqIHB5c3FsaXRlX2Nvbm5lY3Rpb25fc2V0X3RyYWNlX2NhbGxiYWNrKHB5c3FsaXRlX0Nvbm5lY3Rpb24qIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQpAQCAtMTA4Nyw4ICsxMDgyLDcgQEAKICAgICAgICAgc3FsaXRlM190cmFjZShzZWxmLT5kYiwgX3RyYWNlX2NhbGxiYWNrLCB0cmFjZV9jYWxsYmFjayk7CiAgICAgfQogCi0gICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgIHJldHVybiBQeV9Ob25lOworICAgIFB5X1JFVFVSTl9OT05FOwogfQogCiAjaWZkZWYgSEFWRV9MT0FEX0VYVEVOU0lPTgpAQCAtMTExMSw4ICsxMTA1LDcgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBlbmFibGluZyBsb2FkIGV4dGVuc2lvbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAKQEAgLTExMzUsOCArMTEyOCw3IEBACiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhweXNxbGl0ZV9PcGVyYXRpb25hbEVycm9yLCBlcnJtc2cpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiB9CiAjZW5kaWYKQEAgLTE2MjYsNyArMTYxOCw3IEBACiAgICAgUHlfUkVUVVJOX0ZBTFNFOwogfQogCi1zdGF0aWMgY2hhciBjb25uZWN0aW9uX2RvY1tdID0KK3N0YXRpYyBjb25zdCBjaGFyIGNvbm5lY3Rpb25fZG9jW10gPQogUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbiBvYmplY3QuIik7CiAKIHN0YXRpYyBQeUdldFNldERlZiBjb25uZWN0aW9uX2dldHNldFtdID0gewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCmluZGV4IDMwMGRhMjguLjliMjA2NzggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9pdGVybmV4dChweXNxbGl0ZV9DdXJzb3IqIHNlbGYpOwogCi1zdGF0aWMgY2hhciogZXJybXNnX2ZldGNoX2Fjcm9zc19yb2xsYmFjayA9ICJDdXJzb3IgbmVlZGVkIHRvIGJlIHJlc2V0IGJlY2F1c2Ugb2YgY29tbWl0L3JvbGxiYWNrIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIGZldGNoZWQgZnJvbS4iOworc3RhdGljIGNvbnN0IGNoYXIgZXJybXNnX2ZldGNoX2Fjcm9zc19yb2xsYmFja1tdID0gIkN1cnNvciBuZWVkZWQgdG8gYmUgcmVzZXQgYmVjYXVzZSBvZiBjb21taXQvcm9sbGJhY2sgYW5kIGNhbiBubyBsb25nZXIgYmUgZmV0Y2hlZCBmcm9tLiI7CiAKIHN0YXRpYyBweXNxbGl0ZV9TdGF0ZW1lbnRLaW5kIGRldGVjdF9zdGF0ZW1lbnRfdHlwZShjb25zdCBjaGFyKiBzdGF0ZW1lbnQpCiB7CkBAIC0yNDIsOCArMjQyLDcgQEAKICAgICBjb25zdCBjaGFyKiBwb3M7CiAKICAgICBpZiAoIWNvbG5hbWUpIHsKLSAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOwotICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgUHlfUkVUVVJOX05PTkU7CiAgICAgfQogCiAgICAgZm9yIChwb3MgPSBjb2xuYW1lOzsgcG9zKyspIHsKQEAgLTY5OSw3ICs2OTgsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgUHlfREVDUkVGKHNlbGYtPmxhc3Ryb3dpZCk7Ci0gICAgICAgIGlmICghbXVsdGlwbGUgJiYgc3RhdGVtZW50X3R5cGUgPT0gU1RBVEVNRU5UX0lOU0VSVCkgeworICAgICAgICBpZiAoIW11bHRpcGxlICYmCisgICAgICAgICAgICAvKiBSRVBMQUNFIGlzIGFuIGFsaWFzIGZvciBJTlNFUlQgT1IgUkVQTEFDRSAqLworICAgICAgICAgICAgKHN0YXRlbWVudF90eXBlID09IFNUQVRFTUVOVF9JTlNFUlQgfHwgc3RhdGVtZW50X3R5cGUgPT0gU1RBVEVNRU5UX1JFUExBQ0UpKSB7CiAgICAgICAgICAgICBzcWxpdGVfaW50NjQgbGFzdHJvd2lkOwogICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgICAgICAgbGFzdHJvd2lkID0gc3FsaXRlM19sYXN0X2luc2VydF9yb3dpZChzZWxmLT5jb25uZWN0aW9uLT5kYik7CkBAIC05MTQsOCArOTE1LDcgQEAKIAogICAgIHJvdyA9IHB5c3FsaXRlX2N1cnNvcl9pdGVybmV4dChzZWxmKTsKICAgICBpZiAoIXJvdyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICBQeV9SRVRVUk5fTk9ORTsKICAgICB9CiAKICAgICByZXR1cm4gcm93OwpAQCAtOTk2LDggKzk5Niw3IEBACiBQeU9iamVjdCogcHlzcWxpdGVfbm9vcChweXNxbGl0ZV9Db25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKICAgICAvKiBkb24ndCBjYXJlLCByZXR1cm4gTm9uZSAqLwotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlPYmplY3QqIHB5c3FsaXRlX2N1cnNvcl9jbG9zZShweXNxbGl0ZV9DdXJzb3IqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQpAQCAtMTAxMyw4ICsxMDEyLDcgQEAKIAogICAgIHNlbGYtPmNsb3NlZCA9IDE7CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBjdXJzb3JfbWV0aG9kc1tdID0gewpAQCAtMTA1MCw3ICsxMDQ4LDcgQEAKICAgICB7TlVMTH0KIH07CiAKLXN0YXRpYyBjaGFyIGN1cnNvcl9kb2NbXSA9CitzdGF0aWMgY29uc3QgY2hhciBjdXJzb3JfZG9jW10gPQogUHlEb2NfU1RSKCJTUUxpdGUgZGF0YWJhc2UgY3Vyc29yIGNsYXNzLiIpOwogCiBQeVR5cGVPYmplY3QgcHlzcWxpdGVfQ3Vyc29yVHlwZSA9IHsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYyBiL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYwppbmRleCA3YTdlODYwLi43Y2Q2ZDJhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCkBAIC0xMzksOCArMTM5LDcgQEAKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3IsICJDaGFuZ2luZyB0aGUgc2hhcmVkX2NhY2hlIGZsYWcgZmFpbGVkIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgIFB5X1JFVFVSTl9OT05FOwogICAgIH0KIH0KIApAQCAtMTcyLDggKzE3MSw3IEBACiAgICAgaWYgKHJjID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICByZXR1cm4gUHlfTm9uZTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKIH0KIAogUHlEb2NfU1RSVkFSKG1vZHVsZV9yZWdpc3Rlcl9hZGFwdGVyX2RvYywKQEAgLTIyMSw4ICsyMTksNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihlbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrc19kb2MsCkBAIC0yNjEsMTMgKzI1OCwxMyBAQAogfTsKIAogc3RydWN0IF9JbnRDb25zdGFudFBhaXIgewotICAgIGNoYXIqIGNvbnN0YW50X25hbWU7CisgICAgY29uc3QgY2hhciAqY29uc3RhbnRfbmFtZTsKICAgICBpbnQgY29uc3RhbnRfdmFsdWU7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBfSW50Q29uc3RhbnRQYWlyIEludENvbnN0YW50UGFpcjsKIAotc3RhdGljIEludENvbnN0YW50UGFpciBfaW50X2NvbnN0YW50c1tdID0geworc3RhdGljIGNvbnN0IEludENvbnN0YW50UGFpciBfaW50X2NvbnN0YW50c1tdID0gewogICAgIHsiUEFSU0VfREVDTFRZUEVTIiwgUEFSU0VfREVDTFRZUEVTfSwKICAgICB7IlBBUlNFX0NPTE5BTUVTIiwgUEFSU0VfQ09MTkFNRVN9LAogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcmUuYyBiL01vZHVsZXMvX3NyZS5jCmluZGV4IDg0Yzg3NjkuLjUxMmIzZjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NyZS5jCisrKyBiL01vZHVsZXMvX3NyZS5jCkBAIC0zNSw3ICszNSw3IEBACiAgKiBvdGhlciBjb21wYXRpYmlsaXR5IHdvcmsuCiAgKi8KIAotc3RhdGljIGNoYXIgY29weXJpZ2h0W10gPQorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gPQogICAgICIgU1JFIDIuMi4yIENvcHlyaWdodCAoYykgMTk5Ny0yMDAyIGJ5IFNlY3JldCBMYWJzIEFCICI7CiAKICNkZWZpbmUgUFlfU1NJWkVfVF9DTEVBTgpAQCAtNjIsOSArNjIsNiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIG9wdGlvbmFsIGZlYXR1cmVzICovCiAKLS8qIGVuYWJsZXMgZmFzdCBzZWFyY2hpbmcgKi8KLSNkZWZpbmUgVVNFX0ZBU1RfU0VBUkNICi0KIC8qIGVuYWJsZXMgY29weS9kZWVwY29weSBoYW5kbGluZyAod29yayBpbiBwcm9ncmVzcykgKi8KICN1bmRlZiBVU0VfQlVJTFRJTl9DT1BZCiAKQEAgLTcxNyw3ICs3MTQsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QqCi1jYWxsKGNoYXIqIG1vZHVsZSwgY2hhciogZnVuY3Rpb24sIFB5T2JqZWN0KiBhcmdzKQorY2FsbChjb25zdCBjaGFyKiBtb2R1bGUsIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBQeU9iamVjdCogYXJncykKIHsKICAgICBQeU9iamVjdCogbmFtZTsKICAgICBQeU9iamVjdCogbW9kOwpAQCAtMjA1Miw4ICsyMDQ5LDkgQEAKICAgICAgICAgLyogRGVmYXVsdCB2YWx1ZSAqLwogICAgICAgICByZXR1cm4gMDsKIAotICAgIGlmIChQeUxvbmdfQ2hlY2soaW5kZXgpKQotICAgICAgICByZXR1cm4gUHlMb25nX0FzU3NpemVfdChpbmRleCk7CisgICAgaWYgKFB5SW5kZXhfQ2hlY2soaW5kZXgpKSB7CisgICAgICAgIHJldHVybiBQeU51bWJlcl9Bc1NzaXplX3QoaW5kZXgsIE5VTEwpOworICAgIH0KIAogICAgIGkgPSAtMTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3NsLmMgYi9Nb2R1bGVzL19zc2wuYwppbmRleCAyNzMyNDE2Li4wZTk3OWUwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zc2wuYworKysgYi9Nb2R1bGVzL19zc2wuYwpAQCAtMzc4LDcgKzM3OCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1QeVNTTF9TZXRFcnJvcihQeVNTTFNvY2tldCAqb2JqLCBpbnQgcmV0LCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVubykKK1B5U1NMX1NldEVycm9yKFB5U1NMU29ja2V0ICpvYmosIGludCByZXQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKQogewogICAgIFB5T2JqZWN0ICp0eXBlID0gUHlTU0xFcnJvck9iamVjdDsKICAgICBjaGFyICplcnJzdHIgPSBOVUxMOwpAQCAtNDYwLDcgKzQ2MCw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1fc2V0U1NMRXJyb3IgKGNoYXIgKmVycnN0ciwgaW50IGVycmNvZGUsIGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKSB7Citfc2V0U1NMRXJyb3IgKGNvbnN0IGNoYXIgKmVycnN0ciwgaW50IGVycmNvZGUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKSB7CiAKICAgICBpZiAoZXJyc3RyID09IE5VTEwpCiAgICAgICAgIGVycmNvZGUgPSBFUlJfcGVla19sYXN0X2Vycm9yKCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zdHJ1Y3QuYyBiL01vZHVsZXMvX3N0cnVjdC5jCmluZGV4IGY5NjU1NDEuLmRmODE5MDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3N0cnVjdC5jCisrKyBiL01vZHVsZXMvX3N0cnVjdC5jCkBAIC03MjMsNyArNzIzLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGZvcm1hdGRlZiBuYXRpdmVfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBmb3JtYXRkZWYgbmF0aXZlX3RhYmxlW10gPSB7CiAgICAgeyd4JywgICAgICAgc2l6ZW9mKGNoYXIpLCAgIDAsICAgICAgICAgICAgICBOVUxMfSwKICAgICB7J2InLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIG51X2J5dGUsICAgICAgICBucF9ieXRlfSwKICAgICB7J0InLCAgICAgICBzaXplb2YoY2hhciksICAgMCwgICAgICAgICAgICAgIG51X3VieXRlLCAgICAgICBucF91Ynl0ZX0sCkBAIC0xMTg5LDcgKzExODksNyBAQAogCiAKIHN0YXRpYyBjb25zdCBmb3JtYXRkZWYgKgotd2hpY2h0YWJsZShjaGFyICoqcGZtdCkKK3doaWNodGFibGUoY29uc3QgY2hhciAqKnBmbXQpCiB7CiAgICAgY29uc3QgY2hhciAqZm10ID0gKCpwZm10KSsrOyAvKiBNYXkgYmUgYmFja2VkIG91dCBvZiBsYXRlciAqLwogICAgIHN3aXRjaCAoKmZtdCkgewpAQCAtMTI2OCw3ICsxMjY4LDcgQEAKIAogICAgIGZtdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYtPnNfZm9ybWF0KTsKIAotICAgIGYgPSB3aGljaHRhYmxlKChjaGFyICoqKSZmbXQpOworICAgIGYgPSB3aGljaHRhYmxlKCZmbXQpOwogCiAgICAgcyA9IGZtdDsKICAgICBzaXplID0gMDsKQEAgLTE0NTYsNyArMTQ1Niw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1zX3VucGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBjaGFyICpzdGFydGZyb20pIHsKK3NfdW5wYWNrX2ludGVybmFsKFB5U3RydWN0T2JqZWN0ICpzb3NlbGYsIGNvbnN0IGNoYXIgKnN0YXJ0ZnJvbSkgewogICAgIGZvcm1hdGNvZGUgKmNvZGU7CiAgICAgUHlfc3NpemVfdCBpID0gMDsKICAgICBQeU9iamVjdCAqcmVzdWx0ID0gUHlUdXBsZV9OZXcoc29zZWxmLT5zX2xlbik7CkBAIC0yMjc5LDcgKzIyNzksNyBAQAogCiAgICAgLyogQ2hlY2sgZW5kaWFuIGFuZCBzd2FwIGluIGZhc3RlciBmdW5jdGlvbnMgKi8KICAgICB7Ci0gICAgICAgIGZvcm1hdGRlZiAqbmF0aXZlID0gbmF0aXZlX3RhYmxlOworICAgICAgICBjb25zdCBmb3JtYXRkZWYgKm5hdGl2ZSA9IG5hdGl2ZV90YWJsZTsKICAgICAgICAgZm9ybWF0ZGVmICpvdGhlciwgKnB0cjsKICNpZiBQWV9MSVRUTEVfRU5ESUFOCiAgICAgICAgIG90aGVyID0gbGlsZW5kaWFuX3RhYmxlOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jIGIvTW9kdWxlcy9fdGVzdGJ1ZmZlci5jCmluZGV4IDQzZGI4YTguLjEzZDNjY2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RidWZmZXIuYworKysgYi9Nb2R1bGVzL190ZXN0YnVmZmVyLmMKQEAgLTEzLDcgKzEzLDcgQEAKIFB5T2JqZWN0ICpjYWxjc2l6ZSA9IE5VTEw7CiAKIC8qIGNhY2hlIHNpbXBsZSBmb3JtYXQgc3RyaW5nICovCi1zdGF0aWMgY29uc3QgY2hhciAqc2ltcGxlX2ZtdCA9ICJCIjsKK3N0YXRpYyBjb25zdCBjaGFyIHNpbXBsZV9mbXRbXSA9ICJCIjsKIFB5T2JqZWN0ICpzaW1wbGVfZm9ybWF0ID0gTlVMTDsKICNkZWZpbmUgU0lNUExFX0ZPUk1BVChmbXQpIChmbXQgPT0gTlVMTCB8fCBzdHJjbXAoZm10LCAiQiIpID09IDApCiAjZGVmaW5lIEZJWF9GT1JNQVQoZm10KSAoZm10ID09IE5VTEwgPyAiQiIgOiBmbXQpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jIGIvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYwppbmRleCAzODEwZTk0Li41ZDY2MWY3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKQEAgLTEwMDEsNyArMTAwMSw3IEBACiBnZXRhcmdzX2tleXdvcmRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiYXJnMSIsImFyZzIiLCJhcmczIiwiYXJnNCIsImFyZzUiLCBOVUxMfTsKLSAgICBzdGF0aWMgY2hhciAqZm10PSIoaWkpaXwoaShpaSkpKGlpaSlpIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICIoaWkpaXwoaShpaSkpKGlpaSlpIjsKICAgICBpbnQgaW50X2FyZ3NbMTBdPXstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsIGZtdCwga2V5d29yZHMsCkBAIC0xMDI4LDYgKzEwMjgsMjEgQEAKICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgcmVxdWlyZWQsIG9wdGlvbmFsLCBrZXl3b3JkX29ubHkpOwogfQogCisvKiB0ZXN0IFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyBwb3NpdGlvbmFsLW9ubHkgYXJndW1lbnRzICovCitzdGF0aWMgUHlPYmplY3QgKgorZ2V0YXJnc19wb3NpdGlvbmFsX29ubHlfYW5kX2tleXdvcmRzKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKK3sKKyAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsiIiwgIiIsICJrZXl3b3JkIiwgTlVMTH07CisgICAgaW50IHJlcXVpcmVkID0gLTE7CisgICAgaW50IG9wdGlvbmFsID0gLTE7CisgICAgaW50IGtleXdvcmQgPSAtMTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIml8aWkiLCBrZXl3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVxdWlyZWQsICZvcHRpb25hbCwgJmtleXdvcmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaWlpIiwgcmVxdWlyZWQsIG9wdGlvbmFsLCBrZXl3b3JkKTsKK30KKwogLyogRnVuY3Rpb25zIHRvIGNhbGwgUHlBcmdfUGFyc2VUdXBsZSB3aXRoIGludGVnZXIgZm9ybWF0IGNvZGVzLAogICAgYW5kIHJldHVybiB0aGUgcmVzdWx0LgogKi8KQEAgLTExNjEsNyArMTE3Niw3IEBACiAgICAgdmFsdWUgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKG51bSk7CiAgICAgaWYgKHZhbHVlICE9IFVMT05HX01BWCkKICAgICAgICAgcmV0dXJuIHJhaXNlVGVzdEVycm9yKCJ0ZXN0X2tfY29kZSIsCi0gICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKKyAgICAgICAgICAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKCkgcmV0dXJuZWQgd3JvbmcgdmFsdWUgZm9yIGxvbmcgMHhGRkYuLi5GRkYiKTsKIAogICAgIFB5VHVwbGVfU0VUX0lURU0odHVwbGUsIDAsIG51bSk7CiAKQEAgLTExODAsNyArMTE5NSw3IEBACiAgICAgdmFsdWUgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrKG51bSk7CiAgICAgaWYgKHZhbHVlICE9ICh1bnNpZ25lZCBsb25nKS0weDQyKQogICAgICAgICByZXR1cm4gcmFpc2VUZXN0RXJyb3IoInRlc3Rfa19jb2RlIiwKLSAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOworICAgICAgICAgICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soKSByZXR1cm5lZCB3cm9uZyB2YWx1ZSBmb3IgbG9uZyAweEZGRi4uLkZGRiIpOwogCiAgICAgUHlUdXBsZV9TRVRfSVRFTSh0dXBsZSwgMCwgbnVtKTsKIApAQCAtMjkwNCw3ICsyOTE5LDkgQEAKIHN0YXRpYyBpbnQKIGNoZWNrX3RpbWVfcm91bmRpbmcoaW50IHJvdW5kKQogewotICAgIGlmIChyb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0ZMT09SICYmIHJvdW5kICE9IF9QeVRpbWVfUk9VTkRfQ0VJTElORykgeworICAgIGlmIChyb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0ZMT09SCisgICAgICAgICYmIHJvdW5kICE9IF9QeVRpbWVfUk9VTkRfQ0VJTElORworICAgICAgICAmJiByb3VuZCAhPSBfUHlUaW1lX1JPVU5EX0hBTEZfRVZFTikgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImludmFsaWQgcm91bmRpbmciKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTM3ODUsNiArMzgwMiwxMzcgQEAKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHRzdGF0ZS0+cmVjdXJzaW9uX2RlcHRoIC0gMSk7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCoKK3B5bWVtX2J1ZmZlcl9vdmVyZmxvdyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqYnVmZmVyOworCisgICAgLyogRGVsaWJlcmF0ZSBidWZmZXIgb3ZlcmZsb3cgdG8gY2hlY2sgdGhhdCBQeU1lbV9GcmVlKCkgZGV0ZWN0cworICAgICAgIHRoZSBvdmVyZmxvdyB3aGVuIGRlYnVnIGhvb2tzIGFyZSBpbnN0YWxsZWQuICovCisgICAgYnVmZmVyID0gUHlNZW1fTWFsbG9jKDE2KTsKKyAgICBidWZmZXJbMTZdID0gJ3gnOworICAgIFB5TWVtX0ZyZWUoYnVmZmVyKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqCitweW1lbV9hcGlfbWlzdXNlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBjaGFyICpidWZmZXI7CisKKyAgICAvKiBEZWxpYmVyYXRlIG1pc3VzYWdlIG9mIFB5dGhvbiBhbGxvY2F0b3JzOgorICAgICAgIGFsbG9jb2NhdGUgd2l0aCBQeU1lbSBidXQgcmVsZWFzZSB3aXRoIFB5TWVtX1Jhdy4gKi8KKyAgICBidWZmZXIgPSBQeU1lbV9NYWxsb2MoMTYpOworICAgIFB5TWVtX1Jhd0ZyZWUoYnVmZmVyKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QqCitweW1lbV9tYWxsb2Nfd2l0aG91dF9naWwoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGNoYXIgKmJ1ZmZlcjsKKworICAgIC8qIERlbGliZXJhdGUgYnVnIHRvIHRlc3QgZGVidWcgaG9va3Mgb24gUHl0aG9uIG1lbW9yeSBhbGxvY2F0b3JzOgorICAgICAgIGNhbGwgUHlNZW1fTWFsbG9jKCkgd2l0aG91dCBob2xkaW5nIHRoZSBHSUwgKi8KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgYnVmZmVyID0gUHlNZW1fTWFsbG9jKDEwKTsKKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworCisgICAgUHlNZW1fRnJlZShidWZmZXIpOworCisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK3B5b2JqZWN0X21hbGxvY193aXRob3V0X2dpbChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgY2hhciAqYnVmZmVyOworCisgICAgLyogRGVsaWJlcmF0ZSBidWcgdG8gdGVzdCBkZWJ1ZyBob29rcyBvbiBQeXRob24gbWVtb3J5IGFsbG9jYXRvcnM6CisgICAgICAgY2FsbCBQeU9iamVjdF9NYWxsb2MoKSB3aXRob3V0IGhvbGRpbmcgdGhlIEdJTCAqLworICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKKyAgICBidWZmZXIgPSBQeU9iamVjdF9NYWxsb2MoMTApOworICAgIFB5X0VORF9BTExPV19USFJFQURTCisKKyAgICBQeU9iamVjdF9GcmVlKGJ1ZmZlcik7CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3RyYWNlbWFsbG9jX3RyYWNrKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICB1bnNpZ25lZCBpbnQgZG9tYWluOworICAgIFB5T2JqZWN0ICpwdHJfb2JqOworICAgIHZvaWQgKnB0cjsKKyAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgaW50IHJlbGVhc2VfZ2lsID0gMDsKKyAgICBpbnQgcmVzOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJJT258aSIsICZkb21haW4sICZwdHJfb2JqLCAmc2l6ZSwgJnJlbGVhc2VfZ2lsKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcHRyID0gUHlMb25nX0FzVm9pZFB0cihwdHJfb2JqKTsKKyAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAocmVsZWFzZV9naWwpIHsKKyAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgICAgICByZXMgPSBfUHlUcmFjZU1hbGxvY19UcmFjayhkb21haW4sIChQeV91aW50cHRyX3QpcHRyLCBzaXplKTsKKyAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJlcyA9IF9QeVRyYWNlTWFsbG9jX1RyYWNrKGRvbWFpbiwgKFB5X3VpbnRwdHJfdClwdHIsIHNpemUpOworICAgIH0KKworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJfUHlUcmFjZU1hbGxvY19UcmFjayBlcnJvciIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK3RyYWNlbWFsbG9jX3VudHJhY2soUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIHVuc2lnbmVkIGludCBkb21haW47CisgICAgUHlPYmplY3QgKnB0cl9vYmo7CisgICAgdm9pZCAqcHRyOworICAgIGludCByZXM7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIklPIiwgJmRvbWFpbiwgJnB0cl9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBQeUxvbmdfQXNWb2lkUHRyKHB0cl9vYmopOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJlcyA9IF9QeVRyYWNlTWFsbG9jX1VudHJhY2soZG9tYWluLCAoUHlfdWludHB0cl90KXB0cik7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIl9QeVRyYWNlTWFsbG9jX1RyYWNrIGVycm9yIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIFB5X1JFVFVSTl9OT05FOworfQorCitzdGF0aWMgUHlPYmplY3QgKgordHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGRvbWFpbjsKKyAgICBQeU9iamVjdCAqcHRyX29iajsKKyAgICB2b2lkICpwdHI7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIklPIiwgJmRvbWFpbiwgJnB0cl9vYmopKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwdHIgPSBQeUxvbmdfQXNWb2lkUHRyKHB0cl9vYmopOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBfUHlUcmFjZU1hbGxvY19HZXRUcmFjZWJhY2soZG9tYWluLCAoUHlfdWludHB0cl90KXB0cik7Cit9CisKIAogc3RhdGljIFB5TWV0aG9kRGVmIFRlc3RNZXRob2RzW10gPSB7CiAgICAgeyJyYWlzZV9leGNlcHRpb24iLCAgICAgICAgIHJhaXNlX2V4Y2VwdGlvbiwgICAgICAgICAgICAgICAgIE1FVEhfVkFSQVJHU30sCkBAIC0zODMwLDYgKzM5NzgsOSBAQAogICAgICAgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFN9LAogICAgIHsiZ2V0YXJnc19rZXl3b3JkX29ubHkiLCAoUHlDRnVuY3Rpb24pZ2V0YXJnc19rZXl3b3JkX29ubHksCiAgICAgICBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEU30sCisgICAgeyJnZXRhcmdzX3Bvc2l0aW9uYWxfb25seV9hbmRfa2V5d29yZHMiLAorICAgICAgKFB5Q0Z1bmN0aW9uKWdldGFyZ3NfcG9zaXRpb25hbF9vbmx5X2FuZF9rZXl3b3JkcywKKyAgICAgIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTfSwKICAgICB7ImdldGFyZ3NfYiIsICAgICAgICAgICAgICAgZ2V0YXJnc19iLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldGFyZ3NfQiIsICAgICAgICAgICAgICAgZ2V0YXJnc19CLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldGFyZ3NfaCIsICAgICAgICAgICAgICAgZ2V0YXJnc19oLCAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTfSwKQEAgLTM5NzYsNiArNDEyNywxMyBAQAogICAgIHsiUHlUaW1lX0FzTWlsbGlzZWNvbmRzIiwgdGVzdF9QeVRpbWVfQXNNaWxsaXNlY29uZHMsIE1FVEhfVkFSQVJHU30sCiAgICAgeyJQeVRpbWVfQXNNaWNyb3NlY29uZHMiLCB0ZXN0X1B5VGltZV9Bc01pY3Jvc2Vjb25kcywgTUVUSF9WQVJBUkdTfSwKICAgICB7ImdldF9yZWN1cnNpb25fZGVwdGgiLCBnZXRfcmVjdXJzaW9uX2RlcHRoLCBNRVRIX05PQVJHU30sCisgICAgeyJweW1lbV9idWZmZXJfb3ZlcmZsb3ciLCBweW1lbV9idWZmZXJfb3ZlcmZsb3csIE1FVEhfTk9BUkdTfSwKKyAgICB7InB5bWVtX2FwaV9taXN1c2UiLCBweW1lbV9hcGlfbWlzdXNlLCBNRVRIX05PQVJHU30sCisgICAgeyJweW1lbV9tYWxsb2Nfd2l0aG91dF9naWwiLCBweW1lbV9tYWxsb2Nfd2l0aG91dF9naWwsIE1FVEhfTk9BUkdTfSwKKyAgICB7InB5b2JqZWN0X21hbGxvY193aXRob3V0X2dpbCIsIHB5b2JqZWN0X21hbGxvY193aXRob3V0X2dpbCwgTUVUSF9OT0FSR1N9LAorICAgIHsidHJhY2VtYWxsb2NfdHJhY2siLCB0cmFjZW1hbGxvY190cmFjaywgTUVUSF9WQVJBUkdTfSwKKyAgICB7InRyYWNlbWFsbG9jX3VudHJhY2siLCB0cmFjZW1hbGxvY191bnRyYWNrLCBNRVRIX1ZBUkFSR1N9LAorICAgIHsidHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayIsIHRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2ssIE1FVEhfVkFSQVJHU30sCiAgICAge05VTEwsIE5VTEx9IC8qIHNlbnRpbmVsICovCiB9OwogCkBAIC00MDM5LDcgKzQxOTcsNyBAQAogICAgICAgICAiVF9MT05HTE9ORyIsICJUX1VMT05HTE9ORyIsCiAjZW5kaWYKICAgICAgICAgTlVMTH07Ci0gICAgc3RhdGljIGNoYXIgKmZtdCA9ICJ8YmJCaEhpSWxrbmZkcyMiCisgICAgc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAifGJiQmhIaUlsa25mZHMjIgogI2lmZGVmIEhBVkVfTE9OR19MT05HCiAgICAgICAgICJMSyIKICNlbmRpZgpAQCAtNDM5NCw2ICs0NTUyLDcgQEAKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIlBZX1NTSVpFX1RfTUFYIiwgUHlMb25nX0Zyb21Tc2l6ZV90KFBZX1NTSVpFX1RfTUFYKSk7CiAgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJQWV9TU0laRV9UX01JTiIsIFB5TG9uZ19Gcm9tU3NpemVfdChQWV9TU0laRV9UX01JTikpOwogICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0laRU9GX1BZR0NfSEVBRCIsIFB5TG9uZ19Gcm9tU3NpemVfdChzaXplb2YoUHlHQ19IZWFkKSkpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU0laRU9GX1RJTUVfVCIsIFB5TG9uZ19Gcm9tU3NpemVfdChzaXplb2YodGltZV90KSkpOwogICAgIFB5X0lOQ1JFRigmUHlJbnN0YW5jZU1ldGhvZF9UeXBlKTsKICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgImluc3RhbmNlbWV0aG9kIiwgKFB5T2JqZWN0ICopJlB5SW5zdGFuY2VNZXRob2RfVHlwZSk7CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3Rlc3RtdWx0aXBoYXNlLmMgYi9Nb2R1bGVzL190ZXN0bXVsdGlwaGFzZS5jCmluZGV4IDIwMDUyMDUuLjAzZWRhMjcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3Rlc3RtdWx0aXBoYXNlLmMKKysrIGIvTW9kdWxlcy9fdGVzdG11bHRpcGhhc2UuYwpAQCAtNjEsNyArNjEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1FeGFtcGxlX3NldGF0dHIoRXhhbXBsZU9iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCitFeGFtcGxlX3NldGF0dHIoRXhhbXBsZU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7CiAgICAgaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKSB7CiAgICAgICAgIHNlbGYtPnhfYXR0ciA9IFB5RGljdF9OZXcoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3RraW50ZXIuYyBiL01vZHVsZXMvX3RraW50ZXIuYwppbmRleCAzMTZmOTMyLi40Mjc3MWUzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL190a2ludGVyLmMKKysrIGIvTW9kdWxlcy9fdGtpbnRlci5jCkBAIC00NjIsNyArNDYyLDcgQEAKICAgICAgICAgICAgICAgICB2ID0gTlVMTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbSh2LCBpLCB3KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0odiwgaSwgdyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgVGNsX0ZyZWUoRlJFRUNBU1QgYXJndik7CkBAIC00ODAsMTMgKzQ4MCwxMyBAQAogICAgICAgICBQeV9zc2l6ZV90IGksIHNpemU7CiAgICAgICAgIFB5T2JqZWN0ICplbGVtLCAqbmV3ZWxlbSwgKnJlc3VsdDsKIAotICAgICAgICBzaXplID0gUHlUdXBsZV9TaXplKGFyZyk7CisgICAgICAgIHNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZyk7CiAgICAgICAgIHJlc3VsdCA9IE5VTEw7CiAgICAgICAgIC8qIFJlY3Vyc2l2ZWx5IGludm9rZSBTcGxpdE9iaiBmb3IgYWxsIHR1cGxlIGl0ZW1zLgogICAgICAgICAgICBJZiB0aGlzIGRvZXMgbm90IHJldHVybiBhIG5ldyBvYmplY3QsIG5vIGFjdGlvbiBpcwogICAgICAgICAgICBuZWVkZWQuICovCiAgICAgICAgIGZvcihpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmcsIGkpOworICAgICAgICAgICAgZWxlbSA9IFB5VHVwbGVfR0VUX0lURU0oYXJnLCBpKTsKICAgICAgICAgICAgIG5ld2VsZW0gPSBTcGxpdE9iaihlbGVtKTsKICAgICAgICAgICAgIGlmICghbmV3ZWxlbSkgewogICAgICAgICAgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKQEAgLTUwMiwxMiArNTAyLDEyIEBACiAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IGk7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBlbGVtID0gUHlUdXBsZV9HZXRJdGVtKGFyZywgayk7CisgICAgICAgICAgICAgICAgICAgIGVsZW0gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZywgayk7CiAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJlc3VsdCwgaywgZWxlbSk7CisgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBrLCBlbGVtKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocmVzdWx0LCBpLCBuZXdlbGVtKTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpLCBuZXdlbGVtKTsKICAgICAgICAgfQogICAgICAgICBpZiAocmVzdWx0KQogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTUyOSw3ICs1MjksNyBAQAogICAgICAgICAgICAgICAgIFB5X1hERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGksIG5ld2VsZW0pOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIG5ld2VsZW0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNTUxLDcgKzU1MSw3IEBACiAgICAgZWxzZSBpZiAoUHlCeXRlc19DaGVjayhhcmcpKSB7CiAgICAgICAgIGludCBhcmdjOwogICAgICAgICBjb25zdCBjaGFyICoqYXJndjsKLSAgICAgICAgY2hhciAqbGlzdCA9IFB5Qnl0ZXNfQXNTdHJpbmcoYXJnKTsKKyAgICAgICAgY2hhciAqbGlzdCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGFyZyk7CiAKICAgICAgICAgaWYgKFRjbF9TcGxpdExpc3QoKFRjbF9JbnRlcnAgKilOVUxMLCBsaXN0LCAmYXJnYywgJmFyZ3YpICE9IFRDTF9PSykgewogICAgICAgICAgICAgUHlfSU5DUkVGKGFyZyk7CkBAIC01NTksNyArNTU5LDcgQEAKICAgICAgICAgfQogICAgICAgICBUY2xfRnJlZShGUkVFQ0FTVCBhcmd2KTsKICAgICAgICAgaWYgKGFyZ2MgPiAxKQotICAgICAgICAgICAgcmV0dXJuIFNwbGl0KFB5Qnl0ZXNfQXNTdHJpbmcoYXJnKSk7CisgICAgICAgICAgICByZXR1cm4gU3BsaXQoUHlCeXRlc19BU19TVFJJTkcoYXJnKSk7CiAgICAgICAgIC8qIEZhbGwgdGhyb3VnaCwgcmV0dXJuaW5nIGFyZy4gKi8KICAgICB9CiAgICAgUHlfSU5DUkVGKGFyZyk7CkBAIC03NTgsNyArNzU4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgVGNsX1NldFZhcih2LT5pbnRlcnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGNsX2xpYnJhcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19Bc1N0cmluZyh1dGY4X3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcodXRmOF9wYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDTF9HTE9CQUxfT05MWSk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHV0ZjhfcGF0aCk7CiAgICAgICAgICAgICB9CkBAIC04NDEsNyArODQxLDcgQEAKICAgICBQeV9ERUNSRUYodHApOwogfQogCi1zdGF0aWMgY2hhcioKK3N0YXRpYyBjb25zdCBjaGFyICoKIFB5VGNsT2JqZWN0X1RjbFN0cmluZyhQeU9iamVjdCAqc2VsZikKIHsKICAgICByZXR1cm4gVGNsX0dldFN0cmluZygoKFB5VGNsT2JqZWN0KilzZWxmKS0+dmFsdWUpOwpAQCAtMTMwNiw3ICsxMzA2LDcgQEAKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVzdWx0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB5VHVwbGVfU2V0SXRlbShyZXN1bHQsIGksIGVsZW0pOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGksIGVsZW0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMTUxNyw4ICsxNTE3LDggQEAKICAgICBpbnQgZmxhZ3MgPSBUQ0xfRVZBTF9ESVJFQ1QgfCBUQ0xfRVZBTF9HTE9CQUw7CiAKICAgICAvKiBJZiBhcmdzIGlzIGEgc2luZ2xlIHR1cGxlLCByZXBsYWNlIHdpdGggY29udGVudHMgb2YgdHVwbGUgKi8KLSAgICBpZiAoMSA9PSBQeVR1cGxlX1NpemUoYXJncykpewotICAgICAgICBQeU9iamVjdCogaXRlbSA9IFB5VHVwbGVfR2V0SXRlbShhcmdzLCAwKTsKKyAgICBpZiAoUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxKSB7CisgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCAwKTsKICAgICAgICAgaWYgKFB5VHVwbGVfQ2hlY2soaXRlbSkpCiAgICAgICAgICAgICBhcmdzID0gaXRlbTsKICAgICB9CkBAIC0xNzI2LDE0ICsxNzI2LDE0IEBACiB2YXJuYW1lX2NvbnZlcnRlcihQeU9iamVjdCAqaW4sIHZvaWQgKl9vdXQpCiB7CiAgICAgY2hhciAqczsKLSAgICBjaGFyICoqb3V0ID0gKGNoYXIqKilfb3V0OworICAgIGNvbnN0IGNoYXIgKipvdXQgPSAoY29uc3QgY2hhcioqKV9vdXQ7CiAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2soaW4pKSB7Ci0gICAgICAgIGlmIChQeUJ5dGVzX1NpemUoaW4pID4gSU5UX01BWCkgeworICAgICAgICBpZiAoUHlCeXRlc19HRVRfU0laRShpbikgPiBJTlRfTUFYKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwgImJ5dGVzIG9iamVjdCBpcyB0b28gbG9uZyIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgcyA9IFB5Qnl0ZXNfQXNTdHJpbmcoaW4pOwotICAgICAgICBpZiAoc3RybGVuKHMpICE9IChzaXplX3QpUHlCeXRlc19TaXplKGluKSkgeworICAgICAgICBzID0gUHlCeXRlc19BU19TVFJJTkcoaW4pOworICAgICAgICBpZiAoc3RybGVuKHMpICE9IChzaXplX3QpUHlCeXRlc19HRVRfU0laRShpbikpIHsKICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiZW1iZWRkZWQgbnVsbCBieXRlIik7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtMTg0Niw3ICsxODQ2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBTZXRWYXIoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBpbnQgZmxhZ3MpCiB7Ci0gICAgY2hhciAqbmFtZTEsICpuYW1lMjsKKyAgICBjb25zdCBjaGFyICpuYW1lMSwgKm5hbWUyOwogICAgIFB5T2JqZWN0ICpuZXdWYWx1ZTsKICAgICBQeU9iamVjdCAqcmVzID0gTlVMTDsKICAgICBUY2xfT2JqICpuZXd2YWwsICpvazsKQEAgLTE5MTUsNyArMTkxNSw3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogR2V0VmFyKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGZsYWdzKQogewotICAgIGNoYXIgKm5hbWUxLCAqbmFtZTI9TlVMTDsKKyAgICBjb25zdCBjaGFyICpuYW1lMSwgKm5hbWUyPU5VTEw7CiAgICAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CiAgICAgVGNsX09iaiAqdHJlczsKIApAQCAtMjI3NCwxMCArMjI3NCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmpjOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzID0gRnJvbU9iaigoUHlPYmplY3QqKXNlbGYsIG9ianZbaV0pOwotICAgICAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBzKSkgeworICAgICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCBzKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdjsKICAgICB9CkBAIC0yMzA0LDExICsyMzA1LDEyIEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0ICpzID0gdW5pY29kZUZyb21UY2xTdHJpbmcoYXJndltpXSk7Ci0gICAgICAgIGlmICghcyB8fCBQeVR1cGxlX1NldEl0ZW0odiwgaSwgcykpIHsKKyAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYodik7CiAgICAgICAgICAgICB2ID0gTlVMTDsKICAgICAgICAgICAgIGdvdG8gZmluYWxseTsKICAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKHYsIGksIHMpOwogICAgIH0KIAogICBmaW5hbGx5OgpAQCAtMjM0OSwxMCArMjM1MSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYmpjOyBpKyspIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzID0gRnJvbU9iaigoUHlPYmplY3QqKXNlbGYsIG9ianZbaV0pOwotICAgICAgICAgICAgaWYgKCFzIHx8IFB5VHVwbGVfU2V0SXRlbSh2LCBpLCBzKSkgeworICAgICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHYpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTSh2LCBpLCBzKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdjsKICAgICB9CkBAIC0yNDEwLDEwICsyNDEzLDExIEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgKGFyZ2MgLSAxKTsgaSsrKSB7CiAgICAgICAgIFB5T2JqZWN0ICpzID0gdW5pY29kZUZyb21UY2xTdHJpbmcoYXJndltpICsgMV0pOwotICAgICAgICBpZiAoIXMgfHwgUHlUdXBsZV9TZXRJdGVtKGFyZywgaSwgcykpIHsKKyAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoYXJnKTsKICAgICAgICAgICAgIHJldHVybiBQeXRob25DbWRfRXJyb3IoaW50ZXJwKTsKICAgICAgICAgfQorICAgICAgICBQeVR1cGxlX1NFVF9JVEVNKGFyZywgaSwgcyk7CiAgICAgfQogICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZyk7CiAgICAgUHlfREVDUkVGKGFyZyk7CkBAIC0yNDg1LDcgKzI0ODksNiBAQAogLypbY2xpbmljIGlucHV0XQogX3RraW50ZXIudGthcHAuY3JlYXRlY29tbWFuZAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJUa2FwcE9iamVjdCAqIikKICAgICBuYW1lOiBzdHIKICAgICBmdW5jOiBvYmplY3QKICAgICAvCkBAIC0yNDk1LDcgKzI0OTgsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIF90a2ludGVyX3RrYXBwX2NyZWF0ZWNvbW1hbmRfaW1wbChUa2FwcE9iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnVuYykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYTFjNzlhNGVlMmFmNDEwIGlucHV0PTJiYzJjMDQ2YTA5MTQyMzRdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yYTFjNzlhNGVlMmFmNDEwIGlucHV0PTI1NTc4NWNiNzBlZGM2YTBdKi8KIHsKICAgICBQeXRob25DbWRfQ2xpZW50RGF0YSAqZGF0YTsKICAgICBpbnQgZXJyOwpAQCAtMjU2MSw3ICsyNTY0LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrYXBwLmRlbGV0ZWNvbW1hbmQKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iVGthcHBPYmplY3QgKiIpCiAgICAgbmFtZTogc3RyCiAgICAgLwogCkBAIC0yNTY5LDcgKzI1NzEsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogX3RraW50ZXJfdGthcHBfZGVsZXRlY29tbWFuZF9pbXBsKFRrYXBwT2JqZWN0ICpzZWxmLCBjb25zdCBjaGFyICpuYW1lKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE2N2U4Y2I1ODQ1ZTBkMmQgaW5wdXQ9YjYzMDY0NjhmMTBiMjE5Y10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE2N2U4Y2I1ODQ1ZTBkMmQgaW5wdXQ9NTNlOTk1MmVhZTFmODVmNV0qLwogewogICAgIGludCBlcnI7CiAKQEAgLTI3NjIsMTMgKzI3NjQsMTEgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrdGltZXJ0b2tlbi5kZWxldGV0aW1lcmhhbmRsZXIKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iVGt0dE9iamVjdCAqIikKLQogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogX3RraW50ZXJfdGt0aW1lcnRva2VuX2RlbGV0ZXRpbWVyaGFuZGxlcl9pbXBsKFRrdHRPYmplY3QgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmQ3ZmUxN2YzMjhjZmE1NSBpbnB1dD0yNWJhNWRkNTk0ZTUyMDg0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmQ3ZmUxN2YzMjhjZmE1NSBpbnB1dD00MGJkMDcwZmY4NWY1Y2YzXSovCiB7CiAgICAgVGt0dE9iamVjdCAqdiA9IHNlbGY7CiAgICAgUHlPYmplY3QgKmZ1bmMgPSB2LT5mdW5jOwpAQCAtMjg5NCw3ICsyODk0LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIF90a2ludGVyLnRrYXBwLm1haW5sb29wCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlRrYXBwT2JqZWN0ICoiKQogICAgIHRocmVzaG9sZDogaW50ID0gMAogICAgIC8KIApAQCAtMjkwMiw3ICsyOTAxLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIF90a2ludGVyX3RrYXBwX21haW5sb29wX2ltcGwoVGthcHBPYmplY3QgKnNlbGYsIGludCB0aHJlc2hvbGQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGJhOGVhYmJlNTc4NDFiMCBpbnB1dD1hZDU3YzljMWRkMmI5NDcwXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGJhOGVhYmJlNTc4NDFiMCBpbnB1dD0wMzZiY2RjZjAzZDVlY2EwXSovCiB7CiAjaWZkZWYgV0lUSF9USFJFQUQKICAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOwpAQCAtMzA3MiwxMyArMzA3MSwxMSBAQAogLypbY2xpbmljIGlucHV0XQogX3RraW50ZXIudGthcHAud2lsbGRpc3BhdGNoCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlRrYXBwT2JqZWN0ICoiKQotCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBfdGtpbnRlcl90a2FwcF93aWxsZGlzcGF0Y2hfaW1wbChUa2FwcE9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZTNmNDZkMjQ0NjQyMTU1IGlucHV0PTI2MzA2OTk3Njc4MDg5NzBdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wZTNmNDZkMjQ0NjQyMTU1IGlucHV0PWQ4OGY1OTcwODQzZDZkYWJdKi8KIHsKICAgICBzZWxmLT5kaXNwYXRjaGluZyA9IDE7CiAKQEAgLTM2MjksMTQgKzM2MjYsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeUJ5dGVzX0FzU3RyaW5nKGNleGUpKTsKKyAgICAgICAgICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeUJ5dGVzX0FTX1NUUklORyhjZXhlKSk7CiAKICAgICAgICAgICAgIGlmIChzZXRfdmFyKSB7CiAgICAgICAgICAgICAgICAgU2V0RW52aXJvbm1lbnRWYXJpYWJsZVcoTCJUQ0xfTElCUkFSWSIsIE5VTEwpOwogICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUod2NzX3BhdGgpOwogICAgICAgICAgICAgfQogI2Vsc2UKLSAgICAgICAgICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeUJ5dGVzX0FzU3RyaW5nKGNleGUpKTsKKyAgICAgICAgICAgIFRjbF9GaW5kRXhlY3V0YWJsZShQeUJ5dGVzX0FTX1NUUklORyhjZXhlKSk7CiAjZW5kaWYgLyogTVNfV0lORE9XUyAqLwogICAgICAgICB9CiAgICAgICAgIFB5X1hERUNSRUYoY2V4ZSk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL190cmFjZW1hbGxvYy5jIGIvTW9kdWxlcy9fdHJhY2VtYWxsb2MuYwppbmRleCA3OTZhYzBmLi5lMzMyOWM3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190cmFjZW1hbGxvYy5jCisrKyBiL01vZHVsZXMvX3RyYWNlbWFsbG9jLmMKQEAgLTM5LDcgKzM5LDExIEBACiAgICAgLyogbGltaXQgb2YgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gYSB0cmFjZWJhY2ssIDEgYnkgZGVmYXVsdC4KICAgICAgICBWYXJpYWJsZSBwcm90ZWN0ZWQgYnkgdGhlIEdJTC4gKi8KICAgICBpbnQgbWF4X25mcmFtZTsKLX0gdHJhY2VtYWxsb2NfY29uZmlnID0ge1RSQUNFTUFMTE9DX05PVF9JTklUSUFMSVpFRCwgMCwgMX07CisKKyAgICAvKiB1c2UgZG9tYWluIGluIHRyYWNlIGtleT8KKyAgICAgICBWYXJpYWJsZSBwcm90ZWN0ZWQgYnkgdGhlIEdJTC4gKi8KKyAgICBpbnQgdXNlX2RvbWFpbjsKK30gdHJhY2VtYWxsb2NfY29uZmlnID0ge1RSQUNFTUFMTE9DX05PVF9JTklUSUFMSVpFRCwgMCwgMSwgMH07CiAKICNpZiBkZWZpbmVkKFRSQUNFX1JBV19NQUxMT0MpICYmIGRlZmluZWQoV0lUSF9USFJFQUQpCiAvKiBUaGlzIGxvY2sgaXMgbmVlZGVkIGJlY2F1c2UgdHJhY2VtYWxsb2NfZnJlZSgpIGlzIGNhbGxlZCB3aXRob3V0CkBAIC01NCwxMCArNTgsMjEgQEAKICMgIGRlZmluZSBUQUJMRVNfVU5MT0NLKCkKICNlbmRpZgogCisKKyNkZWZpbmUgREVGQVVMVF9ET01BSU4gMAorCisvKiBQYWNrIHRoZSBmcmFtZV90IHN0cnVjdHVyZSB0byByZWR1Y2UgdGhlIG1lbW9yeSBmb290cHJpbnQuICovCit0eXBlZGVmIHN0cnVjdAorI2lmZGVmIF9fR05VQ19fCitfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKQorI2VuZGlmCit7CisgICAgUHlfdWludHB0cl90IHB0cjsKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW47Cit9IHBvaW50ZXJfdDsKKwogLyogUGFjayB0aGUgZnJhbWVfdCBzdHJ1Y3R1cmUgdG8gcmVkdWNlIHRoZSBtZW1vcnkgZm9vdHByaW50IG9uIDY0LWJpdAotICAgYXJjaGl0ZWN0dXJlczogMTIgYnl0ZXMgaW5zdGVhZCBvZiAxNi4gVGhpcyBvcHRpbWl6YXRpb24gbWlnaHQgcHJvZHVjZQotICAgU0lHQlVTIG9uIGFyY2hpdGVjdHVyZXMgbm90IHN1cHBvcnRpbmcgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3NlcyAoNjQtYml0Ci0gICBNSVBTIENQVT8pOiBvbiBzdWNoIGFyY2hpdGVjdHVyZSwgdGhlIHN0cnVjdHVyZSBtdXN0IG5vdCBiZSBwYWNrZWQuICovCisgICBhcmNoaXRlY3R1cmVzOiAxMiBieXRlcyBpbnN0ZWFkIG9mIDE2LiAqLwogdHlwZWRlZiBzdHJ1Y3QKICNpZmRlZiBfX0dOVUNfXwogX19hdHRyaWJ1dGVfXygocGFja2VkKSkKQEAgLTY1LDEwICs4MCwxMyBAQAogX2RlY2xzcGVjKGFsaWduKDQpKQogI2VuZGlmCiB7CisgICAgLyogZmlsZW5hbWUgY2Fubm90IGJlIE5VTEw6ICI8dW5rbm93bj4iIGlzIHVzZWQgaWYgdGhlIFB5dGhvbiBmcmFtZQorICAgICAgIGZpbGVuYW1lIGlzIE5VTEwgKi8KICAgICBQeU9iamVjdCAqZmlsZW5hbWU7CiAgICAgdW5zaWduZWQgaW50IGxpbmVubzsKIH0gZnJhbWVfdDsKIAorCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlfdWhhc2hfdCBoYXNoOwogICAgIGludCBuZnJhbWU7CkBAIC04MSw2ICs5OSw3IEBACiAjZGVmaW5lIE1BWF9ORlJBTUUgXAogICAgICAgICAoKElOVF9NQVggLSAoaW50KXNpemVvZih0cmFjZWJhY2tfdCkpIC8gKGludClzaXplb2YoZnJhbWVfdCkgKyAxKQogCisKIHN0YXRpYyBQeU9iamVjdCAqdW5rbm93bl9maWxlbmFtZSA9IE5VTEw7CiBzdGF0aWMgdHJhY2ViYWNrX3QgdHJhY2VtYWxsb2NfZW1wdHlfdHJhY2ViYWNrOwogCkBAIC05Myw2ICsxMTIsNyBAQAogICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CiB9IHRyYWNlX3Q7CiAKKwogLyogU2l6ZSBpbiBieXRlcyBvZiBjdXJyZW50bHkgdHJhY2VkIG1lbW9yeS4KICAgIFByb3RlY3RlZCBieSBUQUJMRVNfTE9DSygpLiAqLwogc3RhdGljIHNpemVfdCB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ID0gMDsKQEAgLTExOSw2ICsxMzksNyBAQAogICAgUHJvdGVjdGVkIGJ5IFRBQkxFU19MT0NLKCkuICovCiBzdGF0aWMgX1B5X2hhc2h0YWJsZV90ICp0cmFjZW1hbGxvY190cmFjZXMgPSBOVUxMOwogCisKICNpZmRlZiBUUkFDRV9ERUJVRwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2Vycm9yKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQpAQCAtMTMzLDYgKzE1NCw3IEBACiB9CiAjZW5kaWYKIAorCiAjaWYgZGVmaW5lZChXSVRIX1RIUkVBRCkgJiYgZGVmaW5lZChUUkFDRV9SQVdfTUFMTE9DKQogI2RlZmluZSBSRUVOVFJBTlRfVEhSRUFETE9DQUwKIApAQCAtMTQzLDcgKzE2NSw3IEBACiAjICBlcnJvciAibmVlZCBuYXRpdmUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKFRMUykiCiAjZW5kaWYKIAotc3RhdGljIGludCB0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5Oworc3RhdGljIGludCB0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5ID0gLTE7CiAKIC8qIEFueSBub24tTlVMTCBwb2ludGVyIGNhbiBiZSB1c2VkICovCiAjZGVmaW5lIFJFRU5UUkFOVCBQeV9UcnVlCkBAIC0xNTEsNyArMTczLDEwIEBACiBzdGF0aWMgaW50CiBnZXRfcmVlbnRyYW50KHZvaWQpCiB7Ci0gICAgdm9pZCAqcHRyID0gUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KTsKKyAgICB2b2lkICpwdHI7CisKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSAhPSAtMSk7CisgICAgcHRyID0gUHlUaHJlYWRfZ2V0X2tleV92YWx1ZSh0cmFjZW1hbGxvY19yZWVudHJhbnRfa2V5KTsKICAgICBpZiAocHRyICE9IE5VTEwpIHsKICAgICAgICAgYXNzZXJ0KHB0ciA9PSBSRUVOVFJBTlQpOwogICAgICAgICByZXR1cm4gMTsKQEAgLTE2NCwxMiArMTg5LDE0IEBACiBzZXRfcmVlbnRyYW50KGludCByZWVudHJhbnQpCiB7CiAgICAgYXNzZXJ0KHJlZW50cmFudCA9PSAwIHx8IHJlZW50cmFudCA9PSAxKTsKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSAhPSAtMSk7CisKICAgICBpZiAocmVlbnRyYW50KSB7Ci0gICAgICAgIGFzc2VydChQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkpID09IE5VTEwpOworICAgICAgICBhc3NlcnQoIWdldF9yZWVudHJhbnQoKSk7CiAgICAgICAgIFB5VGhyZWFkX3NldF9rZXlfdmFsdWUodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSwgUkVFTlRSQU5UKTsKICAgICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIGFzc2VydChQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXkpID09IFJFRU5UUkFOVCk7CisgICAgICAgIGFzc2VydChnZXRfcmVlbnRyYW50KCkpOwogICAgICAgICBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlKHRyYWNlbWFsbG9jX3JlZW50cmFudF9rZXksIE5VTEwpOwogICAgIH0KIH0KQEAgLTE5NCwyNyArMjIxLDc1IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludAotaGFzaHRhYmxlX2NvbXBhcmVfdW5pY29kZShjb25zdCB2b2lkICprZXksIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpCisKK3N0YXRpYyBQeV91aGFzaF90CitoYXNodGFibGVfaGFzaF9weW9iamVjdChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5KQogewotICAgIGlmIChrZXkgIT0gTlVMTCAmJiBlbnRyeS0+a2V5ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiAoUHlVbmljb2RlX0NvbXBhcmUoKFB5T2JqZWN0ICopa2V5LCAoUHlPYmplY3QgKillbnRyeS0+a2V5KSA9PSAwKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBrZXkgPT0gZW50cnktPmtleTsKKyAgICBQeU9iamVjdCAqb2JqOworCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgb2JqKTsKKyAgICByZXR1cm4gUHlPYmplY3RfSGFzaChvYmopOwogfQogCi1zdGF0aWMgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCBoYXNodGFibGVfYWxsb2MgPSB7bWFsbG9jLCBmcmVlfTsKKworc3RhdGljIGludAoraGFzaHRhYmxlX2NvbXBhcmVfdW5pY29kZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQoreworICAgIFB5T2JqZWN0ICprZXkxLCAqa2V5MjsKKworICAgIF9QeV9IQVNIVEFCTEVfUkVBRF9LRVkoaHQsIHBrZXksIGtleTEpOworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCBrZXkyKTsKKworICAgIGlmIChrZXkxICE9IE5VTEwgJiYga2V5MiAhPSBOVUxMKQorICAgICAgICByZXR1cm4gKFB5VW5pY29kZV9Db21wYXJlKGtleTEsIGtleTIpID09IDApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGtleTEgPT0ga2V5MjsKK30KKworCitzdGF0aWMgUHlfdWhhc2hfdAoraGFzaHRhYmxlX2hhc2hfcG9pbnRlcl90KF9QeV9oYXNodGFibGVfdCAqaHQsIGNvbnN0IHZvaWQgKnBrZXkpCit7CisgICAgcG9pbnRlcl90IHB0cjsKKyAgICBQeV91aGFzaF90IGhhc2g7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCBwdHIpOworCisgICAgaGFzaCA9IChQeV91aGFzaF90KV9QeV9IYXNoUG9pbnRlcigodm9pZCopcHRyLnB0cik7CisgICAgaGFzaCBePSBwdHIuZG9tYWluOworICAgIHJldHVybiBoYXNoOworfQorCisKK3N0YXRpYyBpbnQKK2hhc2h0YWJsZV9jb21wYXJlX3BvaW50ZXJfdChfUHlfaGFzaHRhYmxlX3QgKmh0LCBjb25zdCB2b2lkICpwa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnkpCit7CisgICAgcG9pbnRlcl90IHB0cjEsIHB0cjI7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCBwdHIxKTsKKyAgICBfUHlfSEFTSFRBQkxFX0VOVFJZX1JFQURfS0VZKGh0LCBlbnRyeSwgcHRyMik7CisKKyAgICAvKiBjb21wYXJlIHBvaW50ZXIgYmVmb3JlIGRvbWFpbiwgYmVjYXVzZSBwb2ludGVyIGlzIG1vcmUgbGlrZWx5IHRvIGJlCisgICAgICAgZGlmZmVyZW50ICovCisgICAgcmV0dXJuIChwdHIxLnB0ciA9PSBwdHIyLnB0ciAmJiBwdHIxLmRvbWFpbiA9PSBwdHIyLmRvbWFpbik7CisKK30KKwogCiBzdGF0aWMgX1B5X2hhc2h0YWJsZV90ICoKLWhhc2h0YWJsZV9uZXcoc2l6ZV90IGRhdGFfc2l6ZSwKK2hhc2h0YWJsZV9uZXcoc2l6ZV90IGtleV9zaXplLCBzaXplX3QgZGF0YV9zaXplLAogICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyBoYXNoX2Z1bmMsCiAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jIGNvbXBhcmVfZnVuYykKIHsKLSAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChkYXRhX3NpemUsIDAsCisgICAgX1B5X2hhc2h0YWJsZV9hbGxvY2F0b3JfdCBoYXNodGFibGVfYWxsb2MgPSB7bWFsbG9jLCBmcmVlfTsKKyAgICByZXR1cm4gX1B5X2hhc2h0YWJsZV9uZXdfZnVsbChrZXlfc2l6ZSwgZGF0YV9zaXplLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfZnVuYywgY29tcGFyZV9mdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsICZoYXNodGFibGVfYWxsb2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNodGFibGVfYWxsb2MpOwogfQogCisKIHN0YXRpYyB2b2lkKgogcmF3X21hbGxvYyhzaXplX3Qgc2l6ZSkKIHsKQEAgLTIyNywyMSArMzAyLDI4IEBACiAgICAgYWxsb2NhdG9ycy5yYXcuZnJlZShhbGxvY2F0b3JzLnJhdy5jdHgsIHB0cik7CiB9CiAKKwogc3RhdGljIFB5X3VoYXNoX3QKLWhhc2h0YWJsZV9oYXNoX3RyYWNlYmFjayhjb25zdCB2b2lkICprZXkpCitoYXNodGFibGVfaGFzaF90cmFjZWJhY2soX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSkKIHsKLSAgICBjb25zdCB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrID0ga2V5OworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisKKyAgICBfUHlfSEFTSFRBQkxFX1JFQURfS0VZKGh0LCBwa2V5LCB0cmFjZWJhY2spOwogICAgIHJldHVybiB0cmFjZWJhY2stPmhhc2g7CiB9CiAKKwogc3RhdGljIGludAotaGFzaHRhYmxlX2NvbXBhcmVfdHJhY2ViYWNrKGNvbnN0IHRyYWNlYmFja190ICp0cmFjZWJhY2sxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9QeV9oYXNodGFibGVfZW50cnlfdCAqaGUpCitoYXNodGFibGVfY29tcGFyZV90cmFjZWJhY2soX1B5X2hhc2h0YWJsZV90ICpodCwgY29uc3Qgdm9pZCAqcGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5KQogewotICAgIGNvbnN0IHRyYWNlYmFja190ICp0cmFjZWJhY2syID0gaGUtPmtleTsKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrMSwgKnRyYWNlYmFjazI7CiAgICAgY29uc3QgZnJhbWVfdCAqZnJhbWUxLCAqZnJhbWUyOwogICAgIGludCBpOwogCisgICAgX1B5X0hBU0hUQUJMRV9SRUFEX0tFWShodCwgcGtleSwgdHJhY2ViYWNrMSk7CisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIHRyYWNlYmFjazIpOworCiAgICAgaWYgKHRyYWNlYmFjazEtPm5mcmFtZSAhPSB0cmFjZWJhY2syLT5uZnJhbWUpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC0yNjAsNiArMzQyLDcgQEAKICAgICByZXR1cm4gMTsKIH0KIAorCiBzdGF0aWMgdm9pZAogdHJhY2VtYWxsb2NfZ2V0X2ZyYW1lKFB5RnJhbWVPYmplY3QgKnB5ZnJhbWUsIGZyYW1lX3QgKmZyYW1lKQogewpAQCAtMzEwLDE1ICszOTMsMTUgQEAKICAgICB9CiAKICAgICAvKiBpbnRlcm4gdGhlIGZpbGVuYW1lICovCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeSh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGZpbGVuYW1lKTsKKyAgICBlbnRyeSA9IF9QeV9IQVNIVEFCTEVfR0VUX0VOVFJZKHRyYWNlbWFsbG9jX2ZpbGVuYW1lcywgZmlsZW5hbWUpOwogICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7Ci0gICAgICAgIGZpbGVuYW1lID0gKFB5T2JqZWN0ICopZW50cnktPmtleTsKKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWSh0cmFjZW1hbGxvY19maWxlbmFtZXMsIGVudHJ5LCBmaWxlbmFtZSk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICAvKiB0cmFjZW1hbGxvY19maWxlbmFtZXMgaXMgcmVzcG9uc2libGUgdG8ga2VlcCBhIHJlZmVyZW5jZQogICAgICAgICAgICB0byB0aGUgZmlsZW5hbWUgKi8KICAgICAgICAgUHlfSU5DUkVGKGZpbGVuYW1lKTsKLSAgICAgICAgaWYgKF9QeV9oYXNodGFibGVfc2V0KHRyYWNlbWFsbG9jX2ZpbGVuYW1lcywgZmlsZW5hbWUsIE5VTEwsIDApIDwgMCkgeworICAgICAgICBpZiAoX1B5X0hBU0hUQUJMRV9TRVRfTk9EQVRBKHRyYWNlbWFsbG9jX2ZpbGVuYW1lcywgZmlsZW5hbWUpIDwgMCkgewogICAgICAgICAgICAgUHlfREVDUkVGKGZpbGVuYW1lKTsKICNpZmRlZiBUUkFDRV9ERUJVRwogICAgICAgICAgICAgdHJhY2VtYWxsb2NfZXJyb3IoImZhaWxlZCB0byBpbnRlcm4gdGhlIGZpbGVuYW1lIik7CkBAIC0zMzEsNiArNDE0LDcgQEAKICAgICBmcmFtZS0+ZmlsZW5hbWUgPSBmaWxlbmFtZTsKIH0KIAorCiBzdGF0aWMgUHlfdWhhc2hfdAogdHJhY2ViYWNrX2hhc2godHJhY2ViYWNrX3QgKnRyYWNlYmFjaykKIHsKQEAgLTM1NSw2ICs0MzksNyBAQAogICAgIHJldHVybiB4OwogfQogCisKIHN0YXRpYyB2b2lkCiB0cmFjZWJhY2tfZ2V0X2ZyYW1lcyh0cmFjZWJhY2tfdCAqdHJhY2ViYWNrKQogewpAQCAtMzgyLDYgKzQ2Nyw3IEBACiAgICAgfQogfQogCisKIHN0YXRpYyB0cmFjZWJhY2tfdCAqCiB0cmFjZWJhY2tfbmV3KHZvaWQpCiB7CkBAIC00MDEsOSArNDg3LDkgQEAKICAgICB0cmFjZWJhY2stPmhhc2ggPSB0cmFjZWJhY2tfaGFzaCh0cmFjZWJhY2spOwogCiAgICAgLyogaW50ZXJuIHRoZSB0cmFjZWJhY2sgKi8KLSAgICBlbnRyeSA9IF9QeV9oYXNodGFibGVfZ2V0X2VudHJ5KHRyYWNlbWFsbG9jX3RyYWNlYmFja3MsIHRyYWNlYmFjayk7CisgICAgZW50cnkgPSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWSh0cmFjZW1hbGxvY190cmFjZWJhY2tzLCB0cmFjZWJhY2spOwogICAgIGlmIChlbnRyeSAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYWNlYmFjayA9ICh0cmFjZWJhY2tfdCAqKWVudHJ5LT5rZXk7CisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgZW50cnksIHRyYWNlYmFjayk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICB0cmFjZWJhY2tfdCAqY29weTsKQEAgLTQyMCw3ICs1MDYsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1lbWNweShjb3B5LCB0cmFjZWJhY2ssIHRyYWNlYmFja19zaXplKTsKIAotICAgICAgICBpZiAoX1B5X2hhc2h0YWJsZV9zZXQodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgY29weSwgTlVMTCwgMCkgPCAwKSB7CisgICAgICAgIGlmIChfUHlfSEFTSFRBQkxFX1NFVF9OT0RBVEEodHJhY2VtYWxsb2NfdHJhY2ViYWNrcywgY29weSkgPCAwKSB7CiAgICAgICAgICAgICByYXdfZnJlZShjb3B5KTsKICNpZmRlZiBUUkFDRV9ERUJVRwogICAgICAgICAgICAgdHJhY2VtYWxsb2NfZXJyb3IoImZhaWxlZCB0byBpbnRlcm4gdGhlIHRyYWNlYmFjazogcHV0ZGF0YSBmYWlsZWQiKTsKQEAgLTQzMiw0NiArNTE4LDE1NCBAQAogICAgIHJldHVybiB0cmFjZWJhY2s7CiB9CiAKKwogc3RhdGljIGludAotdHJhY2VtYWxsb2NfYWRkX3RyYWNlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCit0cmFjZW1hbGxvY191c2VfZG9tYWluX2NiKF9QeV9oYXNodGFibGVfdCAqb2xkX3RyYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksIHZvaWQgKnVzZXJfZGF0YSkKIHsKLSAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOwotICAgIHRyYWNlX3QgdHJhY2U7Ci0gICAgaW50IHJlczsKKyAgICBQeV91aW50cHRyX3QgcHRyOworICAgIHBvaW50ZXJfdCBrZXk7CisgICAgX1B5X2hhc2h0YWJsZV90ICpuZXdfdHJhY2VzID0gKF9QeV9oYXNodGFibGVfdCAqKXVzZXJfZGF0YTsKKyAgICBjb25zdCB2b2lkICpwZGF0YSA9IF9QeV9IQVNIVEFCTEVfRU5UUllfUERBVEEob2xkX3RyYWNlcywgZW50cnkpOwogCi0jaWZkZWYgV0lUSF9USFJFQUQKLSAgICBhc3NlcnQoUHlHSUxTdGF0ZV9DaGVjaygpKTsKLSNlbmRpZgorICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkob2xkX3RyYWNlcywgZW50cnksIHB0cik7CisgICAga2V5LnB0ciA9IHB0cjsKKyAgICBrZXkuZG9tYWluID0gREVGQVVMVF9ET01BSU47CiAKLSAgICB0cmFjZWJhY2sgPSB0cmFjZWJhY2tfbmV3KCk7Ci0gICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKQorICAgIHJldHVybiBfUHlfaGFzaHRhYmxlX3NldChuZXdfdHJhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa2V5KSwgJmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3RyYWNlcy0+ZGF0YV9zaXplLCBwZGF0YSk7Cit9CisKKworLyogQ29udmVydCB0cmFjZW1hbGxvY190cmFjZXMgZnJvbSBjb21wYWN0IGtleSAoUHlfdWludHB0cl90KSB0byBwb2ludGVyX3Qga2V5LgorICogUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICovCitzdGF0aWMgaW50Cit0cmFjZW1hbGxvY191c2VfZG9tYWluKHZvaWQpCit7CisgICAgX1B5X2hhc2h0YWJsZV90ICpuZXdfdHJhY2VzID0gTlVMTDsKKworICAgIGFzc2VydCghdHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pOworCisgICAgbmV3X3RyYWNlcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKHBvaW50ZXJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9oYXNoX3BvaW50ZXJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfY29tcGFyZV9wb2ludGVyX3QpOworICAgIGlmIChuZXdfdHJhY2VzID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgdHJhY2Uuc2l6ZSA9IHNpemU7Ci0gICAgdHJhY2UudHJhY2ViYWNrID0gdHJhY2ViYWNrOwotCi0gICAgcmVzID0gX1B5X0hBU0hUQUJMRV9TRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBwdHIsIHRyYWNlKTsKLSAgICBpZiAocmVzID09IDApIHsKLSAgICAgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPD0gUFlfU0laRV9NQVggLSBzaXplKTsKLSAgICAgICAgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSArPSBzaXplOwotICAgICAgICBpZiAodHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA+IHRyYWNlbWFsbG9jX3BlYWtfdHJhY2VkX21lbW9yeSkKLSAgICAgICAgICAgIHRyYWNlbWFsbG9jX3BlYWtfdHJhY2VkX21lbW9yeSA9IHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnk7CiAgICAgfQogCi0gICAgcmV0dXJuIHJlczsKKyAgICBpZiAoX1B5X2hhc2h0YWJsZV9mb3JlYWNoKHRyYWNlbWFsbG9jX3RyYWNlcywgdHJhY2VtYWxsb2NfdXNlX2RvbWFpbl9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld190cmFjZXMpIDwgMCkKKyAgICB7CisgICAgICAgIF9QeV9oYXNodGFibGVfZGVzdHJveShuZXdfdHJhY2VzKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh0cmFjZW1hbGxvY190cmFjZXMpOworICAgIHRyYWNlbWFsbG9jX3RyYWNlcyA9IG5ld190cmFjZXM7CisKKyAgICB0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbiA9IDE7CisKKyAgICByZXR1cm4gMDsKIH0KIAorCiBzdGF0aWMgdm9pZAotdHJhY2VtYWxsb2NfcmVtb3ZlX3RyYWNlKHZvaWQgKnB0cikKK3RyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIFB5X3VpbnRwdHJfdCBwdHIpCiB7CiAgICAgdHJhY2VfdCB0cmFjZTsKKyAgICBpbnQgcmVtb3ZlZDsKIAotICAgIGlmIChfUHlfaGFzaHRhYmxlX3BvcCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgJnRyYWNlLCBzaXplb2YodHJhY2UpKSkgeworICAgIGFzc2VydCh0cmFjZW1hbGxvY19jb25maWcudHJhY2luZyk7CisKKyAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgcG9pbnRlcl90IGtleSA9IHtwdHIsIGRvbWFpbn07CisgICAgICAgIHJlbW92ZWQgPSBfUHlfSEFTSFRBQkxFX1BPUCh0cmFjZW1hbGxvY190cmFjZXMsIGtleSwgdHJhY2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmVtb3ZlZCA9IF9QeV9IQVNIVEFCTEVfUE9QKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7CisgICAgfQorICAgIGlmICghcmVtb3ZlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPj0gdHJhY2Uuc2l6ZSk7CisgICAgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSAtPSB0cmFjZS5zaXplOworfQorCisjZGVmaW5lIFJFTU9WRV9UUkFDRShwdHIpIFwKKyAgICAgICAgICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShERUZBVUxUX0RPTUFJTiwgKFB5X3VpbnRwdHJfdCkocHRyKSkKKworCitzdGF0aWMgaW50Cit0cmFjZW1hbGxvY19hZGRfdHJhY2UoX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCBQeV91aW50cHRyX3QgcHRyLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQoreworICAgIHBvaW50ZXJfdCBrZXkgPSB7cHRyLCBkb21haW59OworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisgICAgdHJhY2VfdCB0cmFjZTsKKyAgICBfUHlfaGFzaHRhYmxlX2VudHJ5X3QqIGVudHJ5OworICAgIGludCByZXM7CisKKyAgICBhc3NlcnQodHJhY2VtYWxsb2NfY29uZmlnLnRyYWNpbmcpOworCisgICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrX25ldygpOworICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbiAmJiBkb21haW4gIT0gREVGQVVMVF9ET01BSU4pIHsKKyAgICAgICAgLyogZmlyc3QgdHJhY2UgdXNpbmcgYSBub24temVybyBkb21haW4gd2hlcmVhcyB0cmFjZXMgdXNlIGNvbXBhY3QKKyAgICAgICAgICAgKFB5X3VpbnRwdHJfdCkga2V5czogc3dpdGNoIHRvIHBvaW50ZXJfdCBrZXlzLiAqLworICAgICAgICBpZiAodHJhY2VtYWxsb2NfdXNlX2RvbWFpbigpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkodHJhY2VtYWxsb2NfdHJhY2VzLCBrZXkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZW50cnkgPSBfUHlfSEFTSFRBQkxFX0dFVF9FTlRSWSh0cmFjZW1hbGxvY190cmFjZXMsIHB0cik7CisgICAgfQorCisgICAgaWYgKGVudHJ5ICE9IE5VTEwpIHsKKyAgICAgICAgLyogdGhlIG1lbW9yeSBibG9jayBpcyBhbHJlYWR5IHRyYWNrZWQgKi8KKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0RBVEEodHJhY2VtYWxsb2NfdHJhY2VzLCBlbnRyeSwgdHJhY2UpOwogICAgICAgICBhc3NlcnQodHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSA+PSB0cmFjZS5zaXplKTsKICAgICAgICAgdHJhY2VtYWxsb2NfdHJhY2VkX21lbW9yeSAtPSB0cmFjZS5zaXplOworCisgICAgICAgIHRyYWNlLnNpemUgPSBzaXplOworICAgICAgICB0cmFjZS50cmFjZWJhY2sgPSB0cmFjZWJhY2s7CisgICAgICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfV1JJVEVfREFUQSh0cmFjZW1hbGxvY190cmFjZXMsIGVudHJ5LCB0cmFjZSk7CiAgICAgfQorICAgIGVsc2UgeworICAgICAgICB0cmFjZS5zaXplID0gc2l6ZTsKKyAgICAgICAgdHJhY2UudHJhY2ViYWNrID0gdHJhY2ViYWNrOworCisgICAgICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICAgICAgcmVzID0gX1B5X0hBU0hUQUJMRV9TRVQodHJhY2VtYWxsb2NfdHJhY2VzLCBrZXksIHRyYWNlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IF9QeV9IQVNIVEFCTEVfU0VUKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPD0gUFlfU0laRV9NQVggLSBzaXplKTsKKyAgICB0cmFjZW1hbGxvY190cmFjZWRfbWVtb3J5ICs9IHNpemU7CisgICAgaWYgKHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnkgPiB0cmFjZW1hbGxvY19wZWFrX3RyYWNlZF9tZW1vcnkpCisgICAgICAgIHRyYWNlbWFsbG9jX3BlYWtfdHJhY2VkX21lbW9yeSA9IHRyYWNlbWFsbG9jX3RyYWNlZF9tZW1vcnk7CisgICAgcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgQUREX1RSQUNFKHB0ciwgc2l6ZSkgXAorICAgICAgICAgICAgdHJhY2VtYWxsb2NfYWRkX3RyYWNlKERFRkFVTFRfRE9NQUlOLCAoUHlfdWludHB0cl90KShwdHIpLCBzaXplKQorCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfYWxsb2MoaW50IHVzZV9jYWxsb2MsIHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQogewpAQCAtNDg4LDcgKzY4Miw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICBpZiAodHJhY2VtYWxsb2NfYWRkX3RyYWNlKHB0ciwgbmVsZW0gKiBlbHNpemUpIDwgMCkgeworICAgIGlmIChBRERfVFJBQ0UocHRyLCBuZWxlbSAqIGVsc2l6ZSkgPCAwKSB7CiAgICAgICAgIC8qIEZhaWxlZCB0byBhbGxvY2F0ZSBhIHRyYWNlIGZvciB0aGUgbmV3IG1lbW9yeSBibG9jayAqLwogICAgICAgICBUQUJMRVNfVU5MT0NLKCk7CiAgICAgICAgIGFsbG9jLT5mcmVlKGFsbG9jLT5jdHgsIHB0cik7CkBAIC00OTgsNiArNjkyLDcgQEAKICAgICByZXR1cm4gcHRyOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmVhbGxvYyh2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IG5ld19zaXplKQogewpAQCAtNTEyLDkgKzcwNywxNCBAQAogICAgICAgICAvKiBhbiBleGlzdGluZyBtZW1vcnkgYmxvY2sgaGFzIGJlZW4gcmVzaXplZCAqLwogCiAgICAgICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShwdHIpOwogCi0gICAgICAgIGlmICh0cmFjZW1hbGxvY19hZGRfdHJhY2UocHRyMiwgbmV3X3NpemUpIDwgMCkgeworICAgICAgICAvKiB0cmFjZW1hbGxvY19hZGRfdHJhY2UoKSB1cGRhdGVzIHRoZSB0cmFjZSBpZiB0aGVyZSBpcyBhbHJlYWR5CisgICAgICAgICAgIGEgdHJhY2UgYXQgYWRkcmVzcyAoZG9tYWluLCBwdHIyKSAqLworICAgICAgICBpZiAocHRyMiAhPSBwdHIpIHsKKyAgICAgICAgICAgIFJFTU9WRV9UUkFDRShwdHIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFERF9UUkFDRShwdHIyLCBuZXdfc2l6ZSkgPCAwKSB7CiAgICAgICAgICAgICAvKiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIFRoZSBlcnJvciBjYW5ub3QgYmUgcmVwb3J0ZWQgdG8KICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIsIGJlY2F1c2UgcmVhbGxvYygpIG1heSBhbHJlYWR5IGhhdmUgc2hyaW5rZWQgdGhlCiAgICAgICAgICAgICAgICBtZW1vcnkgYmxvY2sgYW5kIHNvIHJlbW92ZWQgYnl0ZXMuCkBAIC01MzIsNyArNzMyLDcgQEAKICAgICAgICAgLyogbmV3IGFsbG9jYXRpb24gKi8KIAogICAgICAgICBUQUJMRVNfTE9DSygpOwotICAgICAgICBpZiAodHJhY2VtYWxsb2NfYWRkX3RyYWNlKHB0cjIsIG5ld19zaXplKSA8IDApIHsKKyAgICAgICAgaWYgKEFERF9UUkFDRShwdHIyLCBuZXdfc2l6ZSkgPCAwKSB7CiAgICAgICAgICAgICAvKiBGYWlsZWQgdG8gYWxsb2NhdGUgYSB0cmFjZSBmb3IgdGhlIG5ldyBtZW1vcnkgYmxvY2sgKi8KICAgICAgICAgICAgIFRBQkxFU19VTkxPQ0soKTsKICAgICAgICAgICAgIGFsbG9jLT5mcmVlKGFsbG9jLT5jdHgsIHB0cjIpOwpAQCAtNTQzLDYgKzc0Myw3IEBACiAgICAgcmV0dXJuIHB0cjI7CiB9CiAKKwogc3RhdGljIHZvaWQKIHRyYWNlbWFsbG9jX2ZyZWUodm9pZCAqY3R4LCB2b2lkICpwdHIpCiB7CkBAIC01NTcsMTAgKzc1OCwxMSBAQAogICAgIGFsbG9jLT5mcmVlKGFsbG9jLT5jdHgsIHB0cik7CiAKICAgICBUQUJMRVNfTE9DSygpOwotICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShwdHIpOworICAgIFJFTU9WRV9UUkFDRShwdHIpOwogICAgIFRBQkxFU19VTkxPQ0soKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX2FsbG9jX2dpbChpbnQgdXNlX2NhbGxvYywgdm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCiB7CkBAIC01ODUsMTggKzc4NywyMSBAQAogICAgIHJldHVybiBwdHI7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19tYWxsb2NfZ2lsKHZvaWQgKmN0eCwgc2l6ZV90IHNpemUpCiB7CiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX2FsbG9jX2dpbCgwLCBjdHgsIDEsIHNpemUpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfY2FsbG9jX2dpbCh2b2lkICpjdHgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSkKIHsKICAgICByZXR1cm4gdHJhY2VtYWxsb2NfYWxsb2NfZ2lsKDEsIGN0eCwgbmVsZW0sIGVsc2l6ZSk7CiB9CiAKKwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yZWFsbG9jX2dpbCh2b2lkICpjdHgsIHZvaWQgKnB0ciwgc2l6ZV90IG5ld19zaXplKQogewpAQCAtNjEyLDcgKzgxNyw3IEBACiAgICAgICAgIHB0cjIgPSBhbGxvYy0+cmVhbGxvYyhhbGxvYy0+Y3R4LCBwdHIsIG5ld19zaXplKTsKICAgICAgICAgaWYgKHB0cjIgIT0gTlVMTCAmJiBwdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgVEFCTEVTX0xPQ0soKTsKLSAgICAgICAgICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShwdHIpOworICAgICAgICAgICAgUkVNT1ZFX1RSQUNFKHB0cik7CiAgICAgICAgICAgICBUQUJMRVNfVU5MT0NLKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHB0cjI7CkBAIC02MjksNiArODM0LDcgQEAKICAgICByZXR1cm4gcHRyMjsKIH0KIAorCiAjaWZkZWYgVFJBQ0VfUkFXX01BTExPQwogc3RhdGljIHZvaWQqCiB0cmFjZW1hbGxvY19yYXdfYWxsb2MoaW50IHVzZV9jYWxsb2MsIHZvaWQgKmN0eCwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKQpAQCAtNjYzLDE4ICs4NjksMjEgQEAKICAgICByZXR1cm4gcHRyOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmF3X21hbGxvYyh2b2lkICpjdHgsIHNpemVfdCBzaXplKQogewogICAgIHJldHVybiB0cmFjZW1hbGxvY19yYXdfYWxsb2MoMCwgY3R4LCAxLCBzaXplKTsKIH0KIAorCiBzdGF0aWMgdm9pZCoKIHRyYWNlbWFsbG9jX3Jhd19jYWxsb2Modm9pZCAqY3R4LCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpCiB7CiAgICAgcmV0dXJuIHRyYWNlbWFsbG9jX3Jhd19hbGxvYygxLCBjdHgsIG5lbGVtLCBlbHNpemUpOwogfQogCisKIHN0YXRpYyB2b2lkKgogdHJhY2VtYWxsb2NfcmF3X3JlYWxsb2Modm9pZCAqY3R4LCB2b2lkICpwdHIsIHNpemVfdCBuZXdfc2l6ZSkKIHsKQEAgLTY5MSw3ICs5MDAsNyBAQAogCiAgICAgICAgIGlmIChwdHIyICE9IE5VTEwgJiYgcHRyICE9IE5VTEwpIHsKICAgICAgICAgICAgIFRBQkxFU19MT0NLKCk7Ci0gICAgICAgICAgICB0cmFjZW1hbGxvY19yZW1vdmVfdHJhY2UocHRyKTsKKyAgICAgICAgICAgIFJFTU9WRV9UUkFDRShwdHIpOwogICAgICAgICAgICAgVEFCTEVTX1VOTE9DSygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwdHIyOwpAQCAtNzE1LDIyICs5MjQsMzEgQEAKIH0KICNlbmRpZiAgIC8qIFRSQUNFX1JBV19NQUxMT0MgKi8KIAorCiBzdGF0aWMgaW50Ci10cmFjZW1hbGxvY19jbGVhcl9maWxlbmFtZShfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCit0cmFjZW1hbGxvY19jbGVhcl9maWxlbmFtZShfUHlfaGFzaHRhYmxlX3QgKmh0LCBfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQogewotICAgIFB5T2JqZWN0ICpmaWxlbmFtZSA9IChQeU9iamVjdCAqKWVudHJ5LT5rZXk7CisgICAgUHlPYmplY3QgKmZpbGVuYW1lOworCisgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWShodCwgZW50cnksIGZpbGVuYW1lKTsKICAgICBQeV9ERUNSRUYoZmlsZW5hbWUpOwogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyBpbnQKLXRyYWNlYmFja19mcmVlX3RyYWNlYmFjayhfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCit0cmFjZWJhY2tfZnJlZV90cmFjZWJhY2soX1B5X2hhc2h0YWJsZV90ICpodCwgX1B5X2hhc2h0YWJsZV9lbnRyeV90ICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCiB7Ci0gICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjayA9ICh0cmFjZWJhY2tfdCAqKWVudHJ5LT5rZXk7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKKworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9LRVkoaHQsIGVudHJ5LCB0cmFjZWJhY2spOwogICAgIHJhd19mcmVlKHRyYWNlYmFjayk7CiAgICAgcmV0dXJuIDA7CiB9CiAKKwogLyogcmVlbnRyYW50IGZsYWcgbXVzdCBiZSBzZXQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFuZCBHSUwgbXVzdCBiZSBoZWxkICovCiBzdGF0aWMgdm9pZAogdHJhY2VtYWxsb2NfY2xlYXJfdHJhY2VzKHZvaWQpCkBAIC03NTMsNiArOTcxLDcgQEAKICAgICBfUHlfaGFzaHRhYmxlX2NsZWFyKHRyYWNlbWFsbG9jX2ZpbGVuYW1lcyk7CiB9CiAKKwogc3RhdGljIGludAogdHJhY2VtYWxsb2NfaW5pdCh2b2lkKQogewpAQCAtNzg5LDIxICsxMDA4LDI5IEBACiAgICAgfQogI2VuZGlmCiAKLSAgICB0cmFjZW1hbGxvY19maWxlbmFtZXMgPSBoYXNodGFibGVfbmV3KDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX1B5X2hhc2h0YWJsZV9oYXNoX2Z1bmMpUHlPYmplY3RfSGFzaCwKKyAgICB0cmFjZW1hbGxvY19maWxlbmFtZXMgPSBoYXNodGFibGVfbmV3KHNpemVvZihQeU9iamVjdCAqKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9oYXNoX3B5b2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhYmxlX2NvbXBhcmVfdW5pY29kZSk7CiAKLSAgICB0cmFjZW1hbGxvY190cmFjZWJhY2tzID0gaGFzaHRhYmxlX25ldygwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfUHlfaGFzaHRhYmxlX2hhc2hfZnVuYyloYXNodGFibGVfaGFzaF90cmFjZWJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9QeV9oYXNodGFibGVfY29tcGFyZV9mdW5jKWhhc2h0YWJsZV9jb21wYXJlX3RyYWNlYmFjayk7CisgICAgdHJhY2VtYWxsb2NfdHJhY2ViYWNrcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKHRyYWNlYmFja190ICopLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9oYXNoX3RyYWNlYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfY29tcGFyZV90cmFjZWJhY2spOwogCi0gICAgdHJhY2VtYWxsb2NfdHJhY2VzID0gaGFzaHRhYmxlX25ldyhzaXplb2YodHJhY2VfdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdCk7CisgICAgaWYgKHRyYWNlbWFsbG9jX2NvbmZpZy51c2VfZG9tYWluKSB7CisgICAgICAgIHRyYWNlbWFsbG9jX3RyYWNlcyA9IGhhc2h0YWJsZV9uZXcoc2l6ZW9mKHBvaW50ZXJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHRyYWNlX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWJsZV9oYXNoX3BvaW50ZXJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFibGVfY29tcGFyZV9wb2ludGVyX3QpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdHJhY2VtYWxsb2NfdHJhY2VzID0gaGFzaHRhYmxlX25ldyhzaXplb2YoUHlfdWludHB0cl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodHJhY2VfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9oYXNoX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2NvbXBhcmVfZGlyZWN0KTsKKyAgICB9CiAKICAgICBpZiAodHJhY2VtYWxsb2NfZmlsZW5hbWVzID09IE5VTEwgfHwgdHJhY2VtYWxsb2NfdHJhY2ViYWNrcyA9PSBOVUxMCi0gICAgICAgIHx8IHRyYWNlbWFsbG9jX3RyYWNlcyA9PSBOVUxMKQotICAgIHsKKyAgICAgICB8fCB0cmFjZW1hbGxvY190cmFjZXMgPT0gTlVMTCkgewogICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtODIzLDYgKzEwNTAsNyBAQAogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19kZWluaXQodm9pZCkKIHsKQEAgLTgzMyw5ICsxMDYxLDkgQEAKICAgICB0cmFjZW1hbGxvY19zdG9wKCk7CiAKICAgICAvKiBkZXN0cm95IGhhc2ggdGFibGVzICovCi0gICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX3RyYWNlcyk7CiAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KHRyYWNlbWFsbG9jX3RyYWNlYmFja3MpOwogICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh0cmFjZW1hbGxvY19maWxlbmFtZXMpOworICAgIF9QeV9oYXNodGFibGVfZGVzdHJveSh0cmFjZW1hbGxvY190cmFjZXMpOwogCiAjaWYgZGVmaW5lZChXSVRIX1RIUkVBRCkgJiYgZGVmaW5lZChUUkFDRV9SQVdfTUFMTE9DKQogICAgIGlmICh0YWJsZXNfbG9jayAhPSBOVUxMKSB7CkBAIC04NDYsMTEgKzEwNzQsMTMgQEAKIAogI2lmZGVmIFJFRU5UUkFOVF9USFJFQURMT0NBTAogICAgIFB5VGhyZWFkX2RlbGV0ZV9rZXkodHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSk7CisgICAgdHJhY2VtYWxsb2NfcmVlbnRyYW50X2tleSA9IC0xOwogI2VuZGlmCiAKICAgICBQeV9YREVDUkVGKHVua25vd25fZmlsZW5hbWUpOwogfQogCisKIHN0YXRpYyBpbnQKIHRyYWNlbWFsbG9jX3N0YXJ0KGludCBtYXhfbmZyYW1lKQogewpAQCAtOTA3LDYgKzExMzcsNyBAQAogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyB2b2lkCiB0cmFjZW1hbGxvY19zdG9wKHZvaWQpCiB7CkBAIC05MjMsOCArMTE1NCw5IEBACiAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9NRU0sICZhbGxvY2F0b3JzLm1lbSk7CiAgICAgUHlNZW1fU2V0QWxsb2NhdG9yKFBZTUVNX0RPTUFJTl9PQkosICZhbGxvY2F0b3JzLm9iaik7CiAKLSAgICAvKiByZWxlYXNlIG1lbW9yeSAqLwogICAgIHRyYWNlbWFsbG9jX2NsZWFyX3RyYWNlcygpOworCisgICAgLyogcmVsZWFzZSBtZW1vcnkgKi8KICAgICByYXdfZnJlZSh0cmFjZW1hbGxvY190cmFjZWJhY2spOwogICAgIHRyYWNlbWFsbG9jX3RyYWNlYmFjayA9IE5VTEw7CiB9CkBAIC05MzUsNiArMTE2Nyw3IEBACiAgICAgIlRydWUgaWYgdGhlIHRyYWNlbWFsbG9jIG1vZHVsZSBpcyB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMsXG4iCiAgICAgIkZhbHNlIG90aGVyd2lzZS4iKTsKIAorCiBzdGF0aWMgUHlPYmplY3QqCiBweV90cmFjZW1hbGxvY19pc190cmFjaW5nKFB5T2JqZWN0ICpzZWxmKQogewpAQCAtOTQ2LDYgKzExNzksNyBAQAogICAgICJcbiIKICAgICAiQ2xlYXIgdHJhY2VzIG9mIG1lbW9yeSBibG9ja3MgYWxsb2NhdGVkIGJ5IFB5dGhvbi4iKTsKIAorCiBzdGF0aWMgUHlPYmplY3QqCiBweV90cmFjZW1hbGxvY19jbGVhcl90cmFjZXMoUHlPYmplY3QgKnNlbGYpCiB7CkBAIC05NTksNiArMTE5Myw3IEBACiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKKwogc3RhdGljIFB5T2JqZWN0KgogZnJhbWVfdG9fcHlvYmplY3QoZnJhbWVfdCAqZnJhbWUpCiB7CkBAIC05NjgsOCArMTIwMyw2IEBACiAgICAgaWYgKGZyYW1lX29iaiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChmcmFtZS0+ZmlsZW5hbWUgPT0gTlVMTCkKLSAgICAgICAgZnJhbWUtPmZpbGVuYW1lID0gUHlfTm9uZTsKICAgICBQeV9JTkNSRUYoZnJhbWUtPmZpbGVuYW1lKTsKICAgICBQeVR1cGxlX1NFVF9JVEVNKGZyYW1lX29iaiwgMCwgZnJhbWUtPmZpbGVuYW1lKTsKIApAQCAtOTgzLDYgKzEyMTYsNyBAQAogICAgIHJldHVybiBmcmFtZV9vYmo7CiB9CiAKKwogc3RhdGljIFB5T2JqZWN0KgogdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlYmFja190ICp0cmFjZWJhY2ssIF9QeV9oYXNodGFibGVfdCAqaW50ZXJuX3RhYmxlKQogewpAQCAtMTAyMSwzMyArMTI1NSw0MyBAQAogICAgIHJldHVybiBmcmFtZXM7CiB9CiAKKwogc3RhdGljIFB5T2JqZWN0KgotdHJhY2VfdG9fcHlvYmplY3QodHJhY2VfdCAqdHJhY2UsIF9QeV9oYXNodGFibGVfdCAqaW50ZXJuX3RyYWNlYmFja3MpCit0cmFjZV90b19weW9iamVjdChfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW4sIHRyYWNlX3QgKnRyYWNlLAorICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV90ICppbnRlcm5fdHJhY2ViYWNrcykKIHsKICAgICBQeU9iamVjdCAqdHJhY2Vfb2JqID0gTlVMTDsKLSAgICBQeU9iamVjdCAqc2l6ZSwgKnRyYWNlYmFjazsKKyAgICBQeU9iamVjdCAqb2JqOwogCi0gICAgdHJhY2Vfb2JqID0gUHlUdXBsZV9OZXcoMik7CisgICAgdHJhY2Vfb2JqID0gUHlUdXBsZV9OZXcoMyk7CiAgICAgaWYgKHRyYWNlX29iaiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHNpemUgPSBQeUxvbmdfRnJvbVNpemVfdCh0cmFjZS0+c2l6ZSk7Ci0gICAgaWYgKHNpemUgPT0gTlVMTCkgeworICAgIG9iaiA9IFB5TG9uZ19Gcm9tU2l6ZV90KGRvbWFpbik7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRih0cmFjZV9vYmopOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDAsIHNpemUpOworICAgIFB5VHVwbGVfU0VUX0lURU0odHJhY2Vfb2JqLCAwLCBvYmopOwogCi0gICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlLT50cmFjZWJhY2ssIGludGVybl90cmFjZWJhY2tzKTsKLSAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpIHsKKyAgICBvYmogPSBQeUxvbmdfRnJvbVNpemVfdCh0cmFjZS0+c2l6ZSk7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRih0cmFjZV9vYmopOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDEsIHRyYWNlYmFjayk7CisgICAgUHlUdXBsZV9TRVRfSVRFTSh0cmFjZV9vYmosIDEsIG9iaik7CisKKyAgICBvYmogPSB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2UtPnRyYWNlYmFjaywgaW50ZXJuX3RyYWNlYmFja3MpOworICAgIGlmIChvYmogPT0gTlVMTCkgeworICAgICAgICBQeV9ERUNSRUYodHJhY2Vfb2JqKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5VHVwbGVfU0VUX0lURU0odHJhY2Vfb2JqLCAyLCBvYmopOwogCiAgICAgcmV0dXJuIHRyYWNlX29iajsKIH0KIAorCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgX1B5X2hhc2h0YWJsZV90ICp0cmFjZXM7CiAgICAgX1B5X2hhc2h0YWJsZV90ICp0cmFjZWJhY2tzOwpAQCAtMTA1NSwxNiArMTI5OSwyNiBAQAogfSBnZXRfdHJhY2VzX3Q7CiAKIHN0YXRpYyBpbnQKLXRyYWNlbWFsbG9jX2dldF90cmFjZXNfZmlsbChfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCit0cmFjZW1hbGxvY19nZXRfdHJhY2VzX2ZpbGwoX1B5X2hhc2h0YWJsZV90ICp0cmFjZXMsIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQogewogICAgIGdldF90cmFjZXNfdCAqZ2V0X3RyYWNlcyA9IHVzZXJfZGF0YTsKLSAgICB0cmFjZV90ICp0cmFjZTsKKyAgICBfUHlUcmFjZU1hbGxvY19kb21haW5fdCBkb21haW47CisgICAgdHJhY2VfdCB0cmFjZTsKICAgICBQeU9iamVjdCAqdHJhY2VtYWxsb2Nfb2JqOwogICAgIGludCByZXM7CiAKLSAgICB0cmFjZSA9ICh0cmFjZV90ICopX1B5X0hBU0hUQUJMRV9FTlRSWV9EQVRBKGVudHJ5KTsKKyAgICBpZiAodHJhY2VtYWxsb2NfY29uZmlnLnVzZV9kb21haW4pIHsKKyAgICAgICAgcG9pbnRlcl90IGtleTsKKyAgICAgICAgX1B5X0hBU0hUQUJMRV9FTlRSWV9SRUFEX0tFWSh0cmFjZXMsIGVudHJ5LCBrZXkpOworICAgICAgICBkb21haW4gPSBrZXkuZG9tYWluOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZG9tYWluID0gREVGQVVMVF9ET01BSU47CisgICAgfQorICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHRyYWNlcywgZW50cnksIHRyYWNlKTsKIAotICAgIHRyYWNlbWFsbG9jX29iaiA9IHRyYWNlX3RvX3B5b2JqZWN0KHRyYWNlLCBnZXRfdHJhY2VzLT50cmFjZWJhY2tzKTsKKyAgICB0cmFjZW1hbGxvY19vYmogPSB0cmFjZV90b19weW9iamVjdChkb21haW4sICZ0cmFjZSwgZ2V0X3RyYWNlcy0+dHJhY2ViYWNrcyk7CiAgICAgaWYgKHRyYWNlbWFsbG9jX29iaiA9PSBOVUxMKQogICAgICAgICByZXR1cm4gMTsKIApAQCAtMTA3NiwxNCArMTMzMCwxOSBAQAogICAgIHJldHVybiAwOwogfQogCisKIHN0YXRpYyBpbnQKLXRyYWNlbWFsbG9jX3B5b2JqZWN0X2RlY3JlZl9jYihfUHlfaGFzaHRhYmxlX2VudHJ5X3QgKmVudHJ5LCB2b2lkICp1c2VyX2RhdGEpCit0cmFjZW1hbGxvY19weW9iamVjdF9kZWNyZWZfY2IoX1B5X2hhc2h0YWJsZV90ICp0cmFjZWJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9QeV9oYXNodGFibGVfZW50cnlfdCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQogewotICAgIFB5T2JqZWN0ICpvYmogPSAoUHlPYmplY3QgKilfUHlfSEFTSFRBQkxFX0VOVFJZX0RBVEFfQVNfVk9JRF9QKGVudHJ5KTsKKyAgICBQeU9iamVjdCAqb2JqOworICAgIF9QeV9IQVNIVEFCTEVfRU5UUllfUkVBRF9EQVRBKHRyYWNlYmFja3MsIGVudHJ5LCBvYmopOwogICAgIFB5X0RFQ1JFRihvYmopOwogICAgIHJldHVybiAwOwogfQogCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19nZXRfdHJhY2VzX2RvYywKICAgICAiX2dldF90cmFjZXMoKSAtPiBsaXN0XG4iCiAgICAgIlxuIgpAQCAtMTExMCw3ICsxMzY5LDggQEAKIAogICAgIC8qIHRoZSB0cmFjZWJhY2sgaGFzaCB0YWJsZSBpcyB1c2VkIHRlbXBvcmFyaWx5IHRvIGludGVybiB0cmFjZWJhY2sgdHVwbGUKICAgICAgICBvZiAoZmlsZW5hbWUsIGxpbmVubykgdHVwbGVzICovCi0gICAgZ2V0X3RyYWNlcy50cmFjZWJhY2tzID0gaGFzaHRhYmxlX25ldyhzaXplb2YoUHlPYmplY3QgKiksCisgICAgZ2V0X3RyYWNlcy50cmFjZWJhY2tzID0gaGFzaHRhYmxlX25ldyhzaXplb2YodHJhY2ViYWNrX3QgKiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUHlPYmplY3QgKiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlfaGFzaHRhYmxlX2hhc2hfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1B5X2hhc2h0YWJsZV9jb21wYXJlX2RpcmVjdCk7CiAgICAgaWYgKGdldF90cmFjZXMudHJhY2ViYWNrcyA9PSBOVUxMKSB7CkBAIC0xMTQyLDE1ICsxNDAyLDQzIEBACiBmaW5hbGx5OgogICAgIGlmIChnZXRfdHJhY2VzLnRyYWNlYmFja3MgIT0gTlVMTCkgewogICAgICAgICBfUHlfaGFzaHRhYmxlX2ZvcmVhY2goZ2V0X3RyYWNlcy50cmFjZWJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlbWFsbG9jX3B5b2JqZWN0X2RlY3JlZl9jYiwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZW1hbGxvY19weW9iamVjdF9kZWNyZWZfY2IsIE5VTEwpOwogICAgICAgICBfUHlfaGFzaHRhYmxlX2Rlc3Ryb3koZ2V0X3RyYWNlcy50cmFjZWJhY2tzKTsKICAgICB9Ci0gICAgaWYgKGdldF90cmFjZXMudHJhY2VzICE9IE5VTEwpCisgICAgaWYgKGdldF90cmFjZXMudHJhY2VzICE9IE5VTEwpIHsKICAgICAgICAgX1B5X2hhc2h0YWJsZV9kZXN0cm95KGdldF90cmFjZXMudHJhY2VzKTsKKyAgICB9CiAKICAgICByZXR1cm4gZ2V0X3RyYWNlcy5saXN0OwogfQogCisKK3N0YXRpYyB0cmFjZWJhY2tfdCoKK3RyYWNlbWFsbG9jX2dldF90cmFjZWJhY2soX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCBQeV91aW50cHRyX3QgcHRyKQoreworICAgIHRyYWNlX3QgdHJhY2U7CisgICAgaW50IGZvdW5kOworCisgICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudHJhY2luZykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBUQUJMRVNfTE9DSygpOworICAgIGlmICh0cmFjZW1hbGxvY19jb25maWcudXNlX2RvbWFpbikgeworICAgICAgICBwb2ludGVyX3Qga2V5ID0ge3B0ciwgZG9tYWlufTsKKyAgICAgICAgZm91bmQgPSBfUHlfSEFTSFRBQkxFX0dFVCh0cmFjZW1hbGxvY190cmFjZXMsIGtleSwgdHJhY2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm91bmQgPSBfUHlfSEFTSFRBQkxFX0dFVCh0cmFjZW1hbGxvY190cmFjZXMsIHB0ciwgdHJhY2UpOworICAgIH0KKyAgICBUQUJMRVNfVU5MT0NLKCk7CisKKyAgICBpZiAoIWZvdW5kKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiB0cmFjZS50cmFjZWJhY2s7Cit9CisKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF9vYmplY3RfdHJhY2ViYWNrX2RvYywKICAgICAiX2dldF9vYmplY3RfdHJhY2ViYWNrKG9iailcbiIKICAgICAiXG4iCkBAIC0xMTY1LDExICsxNDUzLDcgQEAKIHsKICAgICBQeVR5cGVPYmplY3QgKnR5cGU7CiAgICAgdm9pZCAqcHRyOwotICAgIHRyYWNlX3QgdHJhY2U7Ci0gICAgaW50IGZvdW5kOwotCi0gICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudHJhY2luZykKLSAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgdHJhY2ViYWNrX3QgKnRyYWNlYmFjazsKIAogICAgIHR5cGUgPSBQeV9UWVBFKG9iaik7CiAgICAgaWYgKFB5VHlwZV9JU19HQyh0eXBlKSkKQEAgLTExNzcsMTYgKzE0NjEsNDggQEAKICAgICBlbHNlCiAgICAgICAgIHB0ciA9ICh2b2lkICopb2JqOwogCi0gICAgVEFCTEVTX0xPQ0soKTsKLSAgICBmb3VuZCA9IF9QeV9IQVNIVEFCTEVfR0VUKHRyYWNlbWFsbG9jX3RyYWNlcywgcHRyLCB0cmFjZSk7Ci0gICAgVEFCTEVTX1VOTE9DSygpOwotCi0gICAgaWYgKCFmb3VuZCkKKyAgICB0cmFjZWJhY2sgPSB0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKERFRkFVTFRfRE9NQUlOLCAoUHlfdWludHB0cl90KXB0cik7CisgICAgaWYgKHRyYWNlYmFjayA9PSBOVUxMKQogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKIAotICAgIHJldHVybiB0cmFjZWJhY2tfdG9fcHlvYmplY3QodHJhY2UudHJhY2ViYWNrLCBOVUxMKTsKKyAgICByZXR1cm4gdHJhY2ViYWNrX3RvX3B5b2JqZWN0KHRyYWNlYmFjaywgTlVMTCk7CiB9CiAKKworI2RlZmluZSBQVVRTKGZkLCBzdHIpIF9QeV93cml0ZV9ub3JhaXNlKGZkLCBzdHIsIChpbnQpc3RybGVuKHN0cikpCisKK3N0YXRpYyB2b2lkCitfUHlNZW1fRHVtcEZyYW1lKGludCBmZCwgZnJhbWVfdCAqIGZyYW1lKQoreworICAgIFBVVFMoZmQsICIgIEZpbGUgXCIiKTsKKyAgICBfUHlfRHVtcEFTQ0lJKGZkLCBmcmFtZS0+ZmlsZW5hbWUpOworICAgIFBVVFMoZmQsICJcIiwgbGluZSAiKTsKKyAgICBfUHlfRHVtcERlY2ltYWwoZmQsIGZyYW1lLT5saW5lbm8pOworICAgIFBVVFMoZmQsICJcbiIpOworfQorCisvKiBEdW1wIHRoZSB0cmFjZWJhY2sgd2hlcmUgYSBtZW1vcnkgYmxvY2sgd2FzIGFsbG9jYXRlZCBpbnRvIGZpbGUgZGVzY3JpcHRvcgorICAgZmQuIFRoZSBmdW5jdGlvbiBtYXkgYmxvY2sgb24gVEFCTEVTX0xPQ0soKSBidXQgaXQgaXMgdW5saWtlbHkuICovCit2b2lkCitfUHlNZW1fRHVtcFRyYWNlYmFjayhpbnQgZmQsIGNvbnN0IHZvaWQgKnB0cikKK3sKKyAgICB0cmFjZWJhY2tfdCAqdHJhY2ViYWNrOworICAgIGludCBpOworCisgICAgdHJhY2ViYWNrID0gdHJhY2VtYWxsb2NfZ2V0X3RyYWNlYmFjayhERUZBVUxUX0RPTUFJTiwgKFB5X3VpbnRwdHJfdClwdHIpOworICAgIGlmICh0cmFjZWJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgUFVUUyhmZCwgIk1lbW9yeSBibG9jayBhbGxvY2F0ZWQgYXQgKG1vc3QgcmVjZW50IGNhbGwgZmlyc3QpOlxuIik7CisgICAgZm9yIChpPTA7IGkgPCB0cmFjZWJhY2stPm5mcmFtZTsgaSsrKSB7CisgICAgICAgIF9QeU1lbV9EdW1wRnJhbWUoZmQsICZ0cmFjZWJhY2stPmZyYW1lc1tpXSk7CisgICAgfQorICAgIFBVVFMoZmQsICJcbiIpOworfQorCisjdW5kZWYgUFVUUworCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19zdGFydF9kb2MsCiAgICAgInN0YXJ0KG5mcmFtZTogaW50PTEpXG4iCiAgICAgIlxuIgpAQCAtMTIyMiw2ICsxNTM4LDcgQEAKICAgICAiU3RvcCB0cmFjaW5nIFB5dGhvbiBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIGNsZWFyIHRyYWNlc1xuIgogICAgICJvZiBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZCBieSBQeXRob24uIik7CiAKKwogc3RhdGljIFB5T2JqZWN0KgogcHlfdHJhY2VtYWxsb2Nfc3RvcChQeU9iamVjdCAqc2VsZikKIHsKQEAgLTEyMjksNiArMTU0Niw3IEBACiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKKwogUHlEb2NfU1RSVkFSKHRyYWNlbWFsbG9jX2dldF90cmFjZWJhY2tfbGltaXRfZG9jLAogICAgICJnZXRfdHJhY2ViYWNrX2xpbWl0KCkgLT4gaW50XG4iCiAgICAgIlxuIgpAQCAtMTI0NCw2ICsxNTYyLDcgQEAKICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHRyYWNlbWFsbG9jX2NvbmZpZy5tYXhfbmZyYW1lKTsKIH0KIAorCiBQeURvY19TVFJWQVIodHJhY2VtYWxsb2NfZ2V0X3RyYWNlbWFsbG9jX21lbW9yeV9kb2MsCiAgICAgImdldF90cmFjZW1hbGxvY19tZW1vcnkoKSAtPiBpbnRcbiIKICAgICAiXG4iCkBAIC0xMjY3LDYgKzE1ODYsNyBAQAogICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOIiwgc2l6ZV9vYmopOwogfQogCisKIFB5RG9jX1NUUlZBUih0cmFjZW1hbGxvY19nZXRfdHJhY2VkX21lbW9yeV9kb2MsCiAgICAgImdldF90cmFjZWRfbWVtb3J5KCkgLT4gKGludCwgaW50KVxuIgogICAgICJcbiIKQEAgLTEyOTIsNiArMTYxMiw3IEBACiAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5OIiwgc2l6ZV9vYmosIHBlYWtfc2l6ZV9vYmopOwogfQogCisKIHN0YXRpYyBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0gewogICAgIHsiaXNfdHJhY2luZyIsIChQeUNGdW5jdGlvbilweV90cmFjZW1hbGxvY19pc190cmFjaW5nLAogICAgICBNRVRIX05PQVJHUywgdHJhY2VtYWxsb2NfaXNfdHJhY2luZ19kb2N9LApAQCAtMTM0Miw2ICsxNjYzLDcgQEAKICAgICByZXR1cm4gbTsKIH0KIAorCiBzdGF0aWMgaW50CiBwYXJzZV9zeXNfeG9wdGlvbnMoUHlPYmplY3QgKnZhbHVlKQogewpAQCAtMTM3MCw2ICsxNjkyLDcgQEAKICAgICByZXR1cm4gUHlfU0FGRV9ET1dOQ0FTVChuZnJhbWUsIGxvbmcsIGludCk7CiB9CiAKKwogaW50CiBfUHlUcmFjZU1hbGxvY19Jbml0KHZvaWQpCiB7CkBAIC0xNDI4LDYgKzE3NTEsNyBAQAogICAgIHJldHVybiB0cmFjZW1hbGxvY19zdGFydChuZnJhbWUpOwogfQogCisKIHZvaWQKIF9QeVRyYWNlTWFsbG9jX0Zpbmkodm9pZCkKIHsKQEAgLTE0MzcsMyArMTc2MSw1OSBAQAogICAgIHRyYWNlbWFsbG9jX2RlaW5pdCgpOwogfQogCitpbnQKK19QeVRyYWNlTWFsbG9jX1RyYWNrKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgUHlfdWludHB0cl90IHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQoreworICAgIGludCByZXM7CisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeUdJTFN0YXRlX1NUQVRFIGdpbF9zdGF0ZTsKKyNlbmRpZgorCisgICAgaWYgKCF0cmFjZW1hbGxvY19jb25maWcudHJhY2luZykgeworICAgICAgICAvKiB0cmFjZW1hbGxvYyBpcyBub3QgdHJhY2luZzogZG8gbm90aGluZyAqLworICAgICAgICByZXR1cm4gLTI7CisgICAgfQorCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBnaWxfc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworI2VuZGlmCisKKyAgICBUQUJMRVNfTE9DSygpOworICAgIHJlcyA9IHRyYWNlbWFsbG9jX2FkZF90cmFjZShkb21haW4sIHB0ciwgc2l6ZSk7CisgICAgVEFCTEVTX1VOTE9DSygpOworCisjaWZkZWYgV0lUSF9USFJFQUQKKyAgICBQeUdJTFN0YXRlX1JlbGVhc2UoZ2lsX3N0YXRlKTsKKyNlbmRpZgorICAgIHJldHVybiByZXM7Cit9CisKKworaW50CitfUHlUcmFjZU1hbGxvY19VbnRyYWNrKF9QeVRyYWNlTWFsbG9jX2RvbWFpbl90IGRvbWFpbiwgUHlfdWludHB0cl90IHB0cikKK3sKKyAgICBpZiAoIXRyYWNlbWFsbG9jX2NvbmZpZy50cmFjaW5nKSB7CisgICAgICAgIC8qIHRyYWNlbWFsbG9jIGlzIG5vdCB0cmFjaW5nOiBkbyBub3RoaW5nICovCisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBUQUJMRVNfTE9DSygpOworICAgIHRyYWNlbWFsbG9jX3JlbW92ZV90cmFjZShkb21haW4sIHB0cik7CisgICAgVEFCTEVTX1VOTE9DSygpOworCisgICAgcmV0dXJuIDA7Cit9CisKKworUHlPYmplY3QqCitfUHlUcmFjZU1hbGxvY19HZXRUcmFjZWJhY2soX1B5VHJhY2VNYWxsb2NfZG9tYWluX3QgZG9tYWluLCBQeV91aW50cHRyX3QgcHRyKQoreworICAgIHRyYWNlYmFja190ICp0cmFjZWJhY2s7CisKKyAgICB0cmFjZWJhY2sgPSB0cmFjZW1hbGxvY19nZXRfdHJhY2ViYWNrKGRvbWFpbiwgcHRyKTsKKyAgICBpZiAodHJhY2ViYWNrID09IE5VTEwpCisgICAgICAgIFB5X1JFVFVSTl9OT05FOworCisgICAgcmV0dXJuIHRyYWNlYmFja190b19weW9iamVjdCh0cmFjZWJhY2ssIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fd2luYXBpLmMgYi9Nb2R1bGVzL193aW5hcGkuYwppbmRleCBlZGM2Y2Y0Li5mNGRhOGFhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL193aW5hcGkuYworKysgYi9Nb2R1bGVzL193aW5hcGkuYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICAgIHNlbGYuZGVjbGFyZShkYXRhKQogICAgICAgICBzZWxmLmVycl9vY2N1cnJlZF9pZigiX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSIsIGRhdGEpCiAgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKAotICAgICAgICAgICAgJ2lmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpXG4gICAgUHlfUkVUVVJOX05PTkU7XG4nKQorICAgICAgICAgICAgJ2lmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHtcbiAgICBQeV9SRVRVUk5fTk9ORTtcbn1cbicpCiAgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKAogICAgICAgICAgICAgJ3JldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTtcbicpCiAKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgICAgICBkYXRhLnJldHVybl9jb252ZXJzaW9uLmFwcGVuZCgKICAgICAgICAgICAgICdyZXR1cm5fdmFsdWUgPSBQeV9CdWlsZFZhbHVlKCJrIiwgX3JldHVybl92YWx1ZSk7XG4nKQogW3B5dGhvbiBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwotLypbcHl0aG9uIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9Mzc0MDc2OTc5NTk2ZWJiYV0qLworLypbcHl0aG9uIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9OTQ4MTllNzJkMmM2ZDU1OF0qLwogCiAjaW5jbHVkZSAiY2xpbmljL193aW5hcGkuYy5oIgogCkBAIC02NzQsNyArNjc0LDcgQEAKIC8qIGhlbHBlcnMgZm9yIGNyZWF0ZXByb2Nlc3MgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldHVsb25nKFB5T2JqZWN0KiBvYmosIGNoYXIqIG5hbWUpCitnZXR1bG9uZyhQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIFB5T2JqZWN0KiB2YWx1ZTsKICAgICB1bnNpZ25lZCBsb25nIHJldDsKQEAgLTY5MCw3ICs2OTAsNyBAQAogfQogCiBzdGF0aWMgSEFORExFCi1nZXRoYW5kbGUoUHlPYmplY3QqIG9iaiwgY2hhciogbmFtZSkKK2dldGhhbmRsZShQeU9iamVjdCogb2JqLCBjb25zdCBjaGFyKiBuYW1lKQogewogICAgIFB5T2JqZWN0KiB2YWx1ZTsKICAgICBIQU5ETEUgcmV0OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9hcnJheW1vZHVsZS5jIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCmluZGV4IGI5Zjg3YWUuLmM3ODU4NzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXJyYXltb2R1bGUuYworKysgYi9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKQEAgLTMxLDcgKzMxLDcgQEAKICAgICBpbnQgaXRlbXNpemU7CiAgICAgUHlPYmplY3QgKiAoKmdldGl0ZW0pKHN0cnVjdCBhcnJheW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKICAgICBpbnQgKCpzZXRpdGVtKShzdHJ1Y3QgYXJyYXlvYmplY3QgKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7Ci0gICAgY2hhciAqZm9ybWF0czsKKyAgICBjb25zdCBjaGFyICpmb3JtYXRzOwogICAgIGludCBpc19pbnRlZ2VyX3R5cGU7CiAgICAgaW50IGlzX3NpZ25lZDsKIH07CkBAIC00MCw3ICs0MCw3IEBACiAgICAgUHlPYmplY3RfVkFSX0hFQUQKICAgICBjaGFyICpvYl9pdGVtOwogICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpvYl9kZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqb2JfZGVzY3I7CiAgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLwogICAgIGludCBvYl9leHBvcnRzOyAgLyogTnVtYmVyIG9mIGV4cG9ydGVkIGJ1ZmZlcnMgKi8KIH0gYXJyYXlvYmplY3Q7CkBAIC01MTEsNyArNTExLDcgQEAKICAqIERvbid0IGZvcmdldCB0byB1cGRhdGUgdHlwZWNvZGVfdG9fbWZvcm1hdF9jb2RlKCkgaWYgeW91IGFkZCBhIG5ldwogICogdHlwZWNvZGUuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXJyYXlkZXNjciBkZXNjcmlwdG9yc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyIGRlc2NyaXB0b3JzW10gPSB7CiAgICAgeydiJywgMSwgYl9nZXRpdGVtLCBiX3NldGl0ZW0sICJiIiwgMSwgMX0sCiAgICAgeydCJywgMSwgQkJfZ2V0aXRlbSwgQkJfc2V0aXRlbSwgIkIiLCAxLCAwfSwKICAgICB7J3UnLCBzaXplb2YoUHlfVU5JQ09ERSksIHVfZ2V0aXRlbSwgdV9zZXRpdGVtLCAidSIsIDAsIDB9LApAQCAtNTM5LDcgKzUzOSw3IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD1hZDQzZDM3ZTk0MmE4ODU0XSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1uZXdhcnJheW9iamVjdChQeVR5cGVPYmplY3QgKnR5cGUsIFB5X3NzaXplX3Qgc2l6ZSwgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyKQorbmV3YXJyYXlvYmplY3QoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeV9zc2l6ZV90IHNpemUsIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcikKIHsKICAgICBhcnJheW9iamVjdCAqb3A7CiAgICAgc2l6ZV90IG5ieXRlczsKQEAgLTE5NDYsNyArMTk0Niw3IEBACiB7CiAgICAgUHlPYmplY3QgKmNvbnZlcnRlZF9pdGVtczsKICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKKyAgICBjb25zdCBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CiAKICAgICBpZiAoIVB5VHlwZV9DaGVjayhhcnJheXR5cGUpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCkBAIC0yMDg0LDcgKzIwODQsNyBAQAogICAgICAgICBQeV9zc2l6ZV90IGl0ZW1jb3VudCA9IFB5X1NJWkUoaXRlbXMpIC8gbWZfZGVzY3Iuc2l6ZTsKICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqbWVtc3RyID0KICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcoaXRlbXMpOwotICAgICAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgICAgICAvKiBJZiBwb3NzaWJsZSwgdHJ5IHRvIHBhY2sgYXJyYXkncyBpdGVtcyB1c2luZyBhIGRhdGEgdHlwZQogICAgICAgICAgKiB0aGF0IGZpdHMgYmV0dGVyLiBUaGlzIG1heSByZXN1bHQgaW4gYW4gYXJyYXkgd2l0aCBuYXJyb3dlcgpAQCAtMjU1NCw3ICsyNTU0LDcgQEAKICAgICB2aWV3LT5mb3JtYXQgPSBOVUxMOwogICAgIHZpZXctPmludGVybmFsID0gTlVMTDsKICAgICBpZiAoKGZsYWdzICYgUHlCVUZfRk9STUFUKSA9PSBQeUJVRl9GT1JNQVQpIHsKLSAgICAgICAgdmlldy0+Zm9ybWF0ID0gc2VsZi0+b2JfZGVzY3ItPmZvcm1hdHM7CisgICAgICAgIHZpZXctPmZvcm1hdCA9IChjaGFyICopc2VsZi0+b2JfZGVzY3ItPmZvcm1hdHM7CiAjaWZkZWYgUHlfVU5JQ09ERV9XSURFCiAgICAgICAgIGlmIChzZWxmLT5vYl9kZXNjci0+dHlwZWNvZGUgPT0gJ3UnKSB7CiAgICAgICAgICAgICB2aWV3LT5mb3JtYXQgPSAidyI7CkBAIC0yNTk1LDcgKzI1OTUsNyBAQAogewogICAgIGludCBjOwogICAgIFB5T2JqZWN0ICppbml0aWFsID0gTlVMTCwgKml0ID0gTlVMTDsKLSAgICBzdHJ1Y3QgYXJyYXlkZXNjciAqZGVzY3I7CisgICAgY29uc3Qgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOwogCiAgICAgaWYgKHR5cGUgPT0gJkFycmF5dHlwZSAmJiAhX1B5QXJnX05vS2V5d29yZHMoImFycmF5LmFycmF5KCkiLCBrd2RzKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yODc1LDkgKzI4NzUsMjAgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBhcnJheWl0ZXJfbmV4dChhcnJheWl0ZXJvYmplY3QgKml0KQogeworICAgIGFycmF5b2JqZWN0ICphbzsKKworICAgIGFzc2VydChpdCAhPSBOVUxMKTsKICAgICBhc3NlcnQoUHlBcnJheUl0ZXJfQ2hlY2soaXQpKTsKLSAgICBpZiAoaXQtPmluZGV4IDwgUHlfU0laRShpdC0+YW8pKQotICAgICAgICByZXR1cm4gKCppdC0+Z2V0aXRlbSkoaXQtPmFvLCBpdC0+aW5kZXgrKyk7CisgICAgYW8gPSBpdC0+YW87CisgICAgaWYgKGFvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGFzc2VydChhcnJheV9DaGVjayhhbykpOworICAgIGlmIChpdC0+aW5kZXggPCBQeV9TSVpFKGFvKSkgeworICAgICAgICByZXR1cm4gKCppdC0+Z2V0aXRlbSkoYW8sIGl0LT5pbmRleCsrKTsKKyAgICB9CisgICAgaXQtPmFvID0gTlVMTDsKKyAgICBQeV9ERUNSRUYoYW8pOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0yOTA2LDggKzI5MTcsMTEgQEAKIGFycmF5X2FycmF5aXRlcmF0b3JfX19yZWR1Y2VfX19pbXBsKGFycmF5aXRlcm9iamVjdCAqc2VsZikKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ODk4YTUyZThlNjZlMDE2IGlucHV0PWEwNjJlYTFlOTk1MTQxN2FdKi8KIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTihPKW4iLCBfUHlPYmplY3RfR2V0QnVpbHRpbigiaXRlciIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmFvLCBzZWxmLT5pbmRleCk7CisgICAgUHlPYmplY3QgKmZ1bmMgPSBfUHlPYmplY3RfR2V0QnVpbHRpbigiaXRlciIpOworICAgIGlmIChzZWxmLT5hbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJOKCgpKSIsIGZ1bmMpOworICAgIH0KKyAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTihPKW4iLCBmdW5jLCBzZWxmLT5hbywgc2VsZi0+aW5kZXgpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC0yOTg3LDcgKzMwMDEsNyBAQAogICAgIGNoYXIgYnVmZmVyW1B5X0FSUkFZX0xFTkdUSChkZXNjcmlwdG9ycyldLCAqcDsKICAgICBQeU9iamVjdCAqdHlwZWNvZGVzOwogICAgIFB5X3NzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgc3RydWN0IGFycmF5ZGVzY3IgKmRlc2NyOworICAgIGNvbnN0IHN0cnVjdCBhcnJheWRlc2NyICpkZXNjcjsKIAogICAgIGlmIChQeVR5cGVfUmVhZHkoJkFycmF5dHlwZSkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2F1ZGlvb3AuYyBiL01vZHVsZXMvYXVkaW9vcC5jCmluZGV4IDFlMTMxZDIuLjhjYTY0YzYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYXVkaW9vcC5jCisrKyBiL01vZHVsZXMvYXVkaW9vcC5jCkBAIC01MSwxMyArNTEsMTUgQEAKICNkZWZpbmUgU0VHX1NISUZUICAgICAgICg0KSAgICAgICAgICAgICAvKiBMZWZ0IHNoaWZ0IGZvciBzZWdtZW50IG51bWJlci4gKi8KICNkZWZpbmUgU0VHX01BU0sgICAgICAgICgweDcwKSAgICAgICAgICAvKiBTZWdtZW50IGZpZWxkIG1hc2suICovCiAKLXN0YXRpYyBQeUludDE2IHNlZ19hZW5kWzhdID0gezB4MUYsIDB4M0YsIDB4N0YsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGRiwgMHgzRkYsIDB4N0ZGLCAweEZGRn07Ci1zdGF0aWMgUHlJbnQxNiBzZWdfdWVuZFs4XSA9IHsweDNGLCAweDdGLCAweEZGLCAweDFGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGLCAweDdGRiwgMHhGRkYsIDB4MUZGRn07CitzdGF0aWMgY29uc3QgUHlJbnQxNiBzZWdfYWVuZFs4XSA9IHsKKyAgICAweDFGLCAweDNGLCAweDdGLCAweEZGLCAweDFGRiwgMHgzRkYsIDB4N0ZGLCAweEZGRgorfTsKK3N0YXRpYyBjb25zdCBQeUludDE2IHNlZ191ZW5kWzhdID0geworICAgIDB4M0YsIDB4N0YsIDB4RkYsIDB4MUZGLCAweDNGRiwgMHg3RkYsIDB4RkZGLCAweDFGRkYKK307CiAKIHN0YXRpYyBQeUludDE2Ci1zZWFyY2goUHlJbnQxNiB2YWwsIFB5SW50MTYgKnRhYmxlLCBpbnQgc2l6ZSkKK3NlYXJjaChQeUludDE2IHZhbCwgY29uc3QgUHlJbnQxNiAqdGFibGUsIGludCBzaXplKQogewogICAgIGludCBpOwogCkBAIC03MCw3ICs3Miw3IEBACiAjZGVmaW5lIHN0X3VsYXcybGluZWFyMTYodWMpIChfc3RfdWxhdzJsaW5lYXIxNlt1Y10pCiAjZGVmaW5lIHN0X2FsYXcybGluZWFyMTYodWMpIChfc3RfYWxhdzJsaW5lYXIxNlt1Y10pCiAKLXN0YXRpYyBQeUludDE2IF9zdF91bGF3MmxpbmVhcjE2WzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgUHlJbnQxNiBfc3RfdWxhdzJsaW5lYXIxNlsyNTZdID0gewogICAgIC0zMjEyNCwgIC0zMTEwMCwgIC0zMDA3NiwgIC0yOTA1MiwgIC0yODAyOCwgIC0yNzAwNCwgIC0yNTk4MCwKICAgICAtMjQ5NTYsICAtMjM5MzIsICAtMjI5MDgsICAtMjE4ODQsICAtMjA4NjAsICAtMTk4MzYsICAtMTg4MTIsCiAgICAgLTE3Nzg4LCAgLTE2NzY0LCAgLTE1OTk2LCAgLTE1NDg0LCAgLTE0OTcyLCAgLTE0NDYwLCAgLTEzOTQ4LApAQCAtMTc2LDcgKzE3OCw3IEBACiAKIH0KIAotc3RhdGljIFB5SW50MTYgX3N0X2FsYXcybGluZWFyMTZbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCBQeUludDE2IF9zdF9hbGF3MmxpbmVhcjE2WzI1Nl0gPSB7CiAgICAgIC01NTA0LCAgIC01MjQ4LCAgIC02MDE2LCAgIC01NzYwLCAgIC00NDgwLCAgIC00MjI0LCAgIC00OTkyLAogICAgICAtNDczNiwgICAtNzU1MiwgICAtNzI5NiwgICAtODA2NCwgICAtNzgwOCwgICAtNjUyOCwgICAtNjI3MiwKICAgICAgLTcwNDAsICAgLTY3ODQsICAgLTI3NTIsICAgLTI2MjQsICAgLTMwMDgsICAgLTI4ODAsICAgLTIyNDAsCkBAIC0yNzAsMTIgKzI3MiwxMiBAQAogLyogRW5kIG9mIGNvZGUgdGFrZW4gZnJvbSBzb3ggKi8KIAogLyogSW50ZWwgQURQQ00gc3RlcCB2YXJpYXRpb24gdGFibGUgKi8KLXN0YXRpYyBpbnQgaW5kZXhUYWJsZVsxNl0gPSB7CitzdGF0aWMgY29uc3QgaW50IGluZGV4VGFibGVbMTZdID0gewogICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAogICAgIC0xLCAtMSwgLTEsIC0xLCAyLCA0LCA2LCA4LAogfTsKIAotc3RhdGljIGludCBzdGVwc2l6ZVRhYmxlWzg5XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQgc3RlcHNpemVUYWJsZVs4OV0gPSB7CiAgICAgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNiwgMTcsCiAgICAgMTksIDIxLCAyMywgMjUsIDI4LCAzMSwgMzQsIDM3LCA0MSwgNDUsCiAgICAgNTAsIDU1LCA2MCwgNjYsIDczLCA4MCwgODgsIDk3LCAxMDcsIDExOCwKZGlmZiAtLWdpdCBhL01vZHVsZXMvYmluYXNjaWkuYyBiL01vZHVsZXMvYmluYXNjaWkuYwppbmRleCAxMzc4MGIyLi42MjNjMjk4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2JpbmFzY2lpLmMKKysrIGIvTW9kdWxlcy9iaW5hc2NpaS5jCkBAIC03NCw3ICs3NCw3IEBACiAjZGVmaW5lIFNLSVAgMHg3RQogI2RlZmluZSBGQUlMIDB4N0QKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdGFibGVfYTJiX2hxeFsyNTZdID0gewogLyogICAgICAgXkAgICAgXkEgICAgXkIgICAgXkMgICAgXkQgICAgXkUgICAgXkYgICAgXkcgICAqLwogLyogMCovICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogLyogICAgICAgXGIgICAgXHQgICAgXG4gICAgXksgICAgXkwgICAgXHIgICAgXk4gICAgXk8gICAqLwpAQCAtMTI1LDEwICsxMjUsMTAgQEAKICAgICBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLCBGQUlMLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdGFibGVfYjJhX2hxeFtdID0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9ocXhbXSA9CiAiIVwiIyQlJicoKSorLC0wMTIzNDU2ODlAQUJDREVGR0hJSktMTU5QUVJTVFVWWFlaW2BhYmNkZWZoaWprbG1wcXIiOwogCi1zdGF0aWMgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7CitzdGF0aWMgY29uc3QgY2hhciB0YWJsZV9hMmJfYmFzZTY0W10gPSB7CiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSw2MiwgLTEsLTEsLTEsNjMsCkBAIC0xNDQsMTIgKzE0NCwxMiBAQAogLyogTWF4IGJpbmFyeSBjaHVuayBzaXplOyBsaW1pdGVkIG9ubHkgYnkgYXZhaWxhYmxlIG1lbW9yeSAqLwogI2RlZmluZSBCQVNFNjRfTUFYQklOICgoUFlfU1NJWkVfVF9NQVggLSAzKSAvIDIpCiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIHRhYmxlX2IyYV9iYXNlNjRbXSA9CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0YWJsZV9iMmFfYmFzZTY0W10gPQogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwogCiAKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IGNyY3RhYl9ocXhbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBjcmN0YWJfaHF4WzI1Nl0gPSB7CiAgICAgMHgwMDAwLCAweDEwMjEsIDB4MjA0MiwgMHgzMDYzLCAweDQwODQsIDB4NTBhNSwgMHg2MGM2LCAweDcwZTcsCiAgICAgMHg4MTA4LCAweDkxMjksIDB4YTE0YSwgMHhiMTZiLCAweGMxOGMsIDB4ZDFhZCwgMHhlMWNlLCAweGYxZWYsCiAgICAgMHgxMjMxLCAweDAyMTAsIDB4MzI3MywgMHgyMjUyLCAweDUyYjUsIDB4NDI5NCwgMHg3MmY3LCAweDYyZDYsCkBAIC0yNTYsNyArMjU2LDggQEAKIGJpbmFzY2lpX2EyYl91dV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lMDI3ZjhlMGIwNTk4NzQyIGlucHV0PTdjYWZlYWY3M2RmNjNkMWNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwpAQCAtMzQyLDEzICszNDMsMTUgQEAKIGJpbmFzY2lpX2IyYV91dV9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wMDcwNjcwZTUyZTRhYTZiIGlucHV0PTAwZmRmNDU4Y2U4YjQ2NWJdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKLSAgICBQeV9zc2l6ZV90IGJpbl9sZW47CisgICAgUHlfc3NpemVfdCBiaW5fbGVuLCBvdXRfbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAorICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CiAgICAgYmluX2RhdGEgPSBkYXRhLT5idWY7CiAgICAgYmluX2xlbiA9IGRhdGEtPmxlbjsKICAgICBpZiAoIGJpbl9sZW4gPiA0NSApIHsKQEAgLTM1OCw5ICszNjEsMTAgQEAKICAgICB9CiAKICAgICAvKiBXZSdyZSBsYXp5IGFuZCBhbGxvY2F0ZSB0byBtdWNoIChmaXhlZCB1cCBsYXRlcikgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDIgKyAoYmluX2xlbisyKS8zKjQpKSA9PSBOVUxMICkKKyAgICBvdXRfbGVuID0gMiArIChiaW5fbGVuICsgMikgLyAzICogNDsKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgb3V0X2xlbik7CisgICAgaWYgKGFzY2lpX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgLyogU3RvcmUgdGhlIGxlbmd0aCAqLwogICAgICphc2NpaV9kYXRhKysgPSAnICcgKyAoYmluX2xlbiAmIDA3Nyk7CkBAIC0zODIsMTcgKzM4NiwxMiBAQAogICAgIH0KICAgICAqYXNjaWlfZGF0YSsrID0gJ1xuJzsgICAgICAgLyogQXBwZW5kIGEgY291cnRlc3kgbmV3bGluZSAqLwogCi0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChhc2NpaV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYXNjaWlfZGF0YSk7CiB9CiAKIAogc3RhdGljIGludAotYmluYXNjaWlfZmluZF92YWxpZCh1bnNpZ25lZCBjaGFyICpzLCBQeV9zc2l6ZV90IHNsZW4sIGludCBudW0pCitiaW5hc2NpaV9maW5kX3ZhbGlkKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMsIFB5X3NzaXplX3Qgc2xlbiwgaW50IG51bSkKIHsKICAgICAvKiBGaW5kcyAmIHJldHVybnMgdGhlIChudW0rMSl0aAogICAgICoqIHZhbGlkIGNoYXJhY3RlciBmb3IgYmFzZTY0LCBvciAtMSBpZiBub25lLgpAQCAtNDI5LDEzICs0MjgsMTQgQEAKIGJpbmFzY2lpX2EyYl9iYXNlNjRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDYyODIyM2YxOWZkM2Y5YiBpbnB1dD01ODcyYWNmNmUxY2FjMjQzXSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YSwgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYmluX2RhdGE7CiAgICAgaW50IGxlZnRiaXRzID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIHRoaXNfY2g7CiAgICAgdW5zaWduZWQgaW50IGxlZnRjaGFyID0gMDsKLSAgICBQeU9iamVjdCAqcnY7CiAgICAgUHlfc3NpemVfdCBhc2NpaV9sZW4sIGJpbl9sZW47CiAgICAgaW50IHF1YWRfcG9zID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc2NpaV9kYXRhID0gZGF0YS0+YnVmOwogICAgIGFzY2lpX2xlbiA9IGRhdGEtPmxlbjsKQEAgLTQ0NywxMSArNDQ3LDEyIEBACiAKICAgICBiaW5fbGVuID0gKChhc2NpaV9sZW4rMykvNCkqMzsgLyogVXBwZXIgYm91bmQsIGNvcnJlY3RlZCBsYXRlciAqLwogCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKwogICAgIC8qIEFsbG9jYXRlIHRoZSBidWZmZXIgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJpbl9sZW4pKSA9PSBOVUxMICkKKyAgICBiaW5fZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGJpbl9sZW4pOworICAgIGlmIChiaW5fZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwotICAgIGJpbl9sZW4gPSAwOwogCiAgICAgZm9yKCA7IGFzY2lpX2xlbiA+IDA7IGFzY2lpX2xlbi0tLCBhc2NpaV9kYXRhKyspIHsKICAgICAgICAgdGhpc19jaCA9ICphc2NpaV9kYXRhOwpAQCAtNDk2LDMxICs0OTcsMTcgQEAKICAgICAgICAgaWYgKCBsZWZ0Yml0cyA+PSA4ICkgewogICAgICAgICAgICAgbGVmdGJpdHMgLT0gODsKICAgICAgICAgICAgICpiaW5fZGF0YSsrID0gKGxlZnRjaGFyID4+IGxlZnRiaXRzKSAmIDB4ZmY7Ci0gICAgICAgICAgICBiaW5fbGVuKys7CiAgICAgICAgICAgICBsZWZ0Y2hhciAmPSAoKDEgPDwgbGVmdGJpdHMpIC0gMSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobGVmdGJpdHMgIT0gMCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoRXJyb3IsICJJbmNvcnJlY3QgcGFkZGluZyIpOwotICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvKiBBbmQgc2V0IHN0cmluZyBzaXplIGNvcnJlY3RseS4gSWYgdGhlIHJlc3VsdCBzdHJpbmcgaXMgZW1wdHkKLSAgICAqKiAoYmVjYXVzZSB0aGUgaW5wdXQgd2FzIGFsbCBpbnZhbGlkKSByZXR1cm4gdGhlIHNoYXJlZCBlbXB0eQotICAgICoqIHN0cmluZyBpbnN0ZWFkOyBfUHlCeXRlc19SZXNpemUoKSB3b24ndCBkbyB0aGlzIGZvciB1cy4KLSAgICAqLwotICAgIGlmIChiaW5fbGVuID4gMCkgewotICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwgYmluX2xlbikgPCAwKSB7Ci0gICAgICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7Ci0gICAgICAgIHJ2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgiIiwgMCk7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJpbl9kYXRhKTsKIH0KIAogCkBAIC01MjgsMjQgKzUxNSwyNyBAQAogYmluYXNjaWkuYjJhX2Jhc2U2NAogCiAgICAgZGF0YTogUHlfYnVmZmVyCi0gICAgLworICAgICoKKyAgICBuZXdsaW5lOiBpbnQoY19kZWZhdWx0PSIxIikgPSBUcnVlCiAKIEJhc2U2NC1jb2RlIGxpbmUgb2YgZGF0YS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGQ5NjY2MzE3MDc3OGRjMyBpbnB1dD0xNGVjNGU0NzM3MTE3NGE5XSovCitiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbmV3bGluZSkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00YWQ2MmM4ZTg0ODVkM2IzIGlucHV0PTdiMmVhNmZhMzhkODkyNGNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKLSAgICBQeV9zc2l6ZV90IGJpbl9sZW47CisgICAgUHlfc3NpemVfdCBiaW5fbGVuLCBvdXRfbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGJpbl9sZW4gPSBkYXRhLT5sZW47CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAogICAgIGFzc2VydChiaW5fbGVuID49IDApOwogCkBAIC01NTUsMTEgKzU0NSwxNCBAQAogICAgIH0KIAogICAgIC8qIFdlJ3JlIGxhenkgYW5kIGFsbG9jYXRlIHRvbyBtdWNoIChmaXhlZCB1cCBsYXRlcikuCi0gICAgICAgIiszIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzIGFuZCBhIHRyYWlsaW5nCi0gICAgICAgbmV3bGluZS4gIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCi0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBiaW5fbGVuKjIgKyAzKSkgPT0gTlVMTCApCisgICAgICAgIisyIiBsZWF2ZXMgcm9vbSBmb3IgdXAgdG8gdHdvIHBhZCBjaGFyYWN0ZXJzLgorICAgICAgIE5vdGUgdGhhdCAnYicgZ2V0cyBlbmNvZGVkIGFzICdZZz09XG4nICgxIGluLCA1IG91dCkuICovCisgICAgb3V0X2xlbiA9IGJpbl9sZW4qMiArIDI7CisgICAgaWYgKG5ld2xpbmUpCisgICAgICAgIG91dF9sZW4rKzsKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgb3V0X2xlbik7CisgICAgaWYgKGFzY2lpX2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNjaWlfZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgZm9yKCA7IGJpbl9sZW4gPiAwIDsgYmluX2xlbi0tLCBiaW5fZGF0YSsrICkgewogICAgICAgICAvKiBTaGlmdCB0aGUgZGF0YSBpbnRvIG91ciBidWZmZXIgKi8KQEAgLTU4MSwxNCArNTc0LDEwIEBACiAgICAgICAgICphc2NpaV9kYXRhKysgPSB0YWJsZV9iMmFfYmFzZTY0WyhsZWZ0Y2hhciYweGYpIDw8IDJdOwogICAgICAgICAqYXNjaWlfZGF0YSsrID0gQkFTRTY0X1BBRDsKICAgICB9Ci0gICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KKyAgICBpZiAobmV3bGluZSkKKyAgICAgICAgKmFzY2lpX2RhdGErKyA9ICdcbic7ICAgICAgIC8qIEFwcGVuZCBhIGNvdXJ0ZXN5IG5ld2xpbmUgKi8KIAotICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJ2LAotICAgICAgICAgICAgICAgICAgICAgICAoYXNjaWlfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGFzY2lpX2RhdGEpOwogfQogCiAvKltjbGluaWMgaW5wdXRdCkBAIC02MDQsMTYgKzU5MywxOSBAQAogYmluYXNjaWlfYTJiX2hxeF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00ZDZkOGM1NGQ1NGVhMWMxIGlucHV0PTBkOTE0YzY4MGUwZWVkNTVdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqYmluX2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBpbnQgbGVmdGJpdHMgPSAwOwogICAgIHVuc2lnbmVkIGNoYXIgdGhpc19jaDsKICAgICB1bnNpZ25lZCBpbnQgbGVmdGNoYXIgPSAwOwotICAgIFB5T2JqZWN0ICpydjsKKyAgICBQeU9iamVjdCAqcmVzOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIGludCBkb25lID0gMDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBhc2NpaV9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIApAQCAtNjIzLDkgKzYxNSw5IEBACiAgICAgLyogQWxsb2NhdGUgYSBzdHJpbmcgdGhhdCBpcyB0b28gYmlnIChmaXhlZCBsYXRlcikKICAgICAgICBBZGQgdHdvIHRvIHRoZSBpbml0aWFsIGxlbmd0aCB0byBwcmV2ZW50IGludGVybmluZyB3aGljaAogICAgICAgIHdvdWxkIHByZWNsdWRlIHN1YnNlcXVlbnQgcmVzaXppbmcuICAqLwotICAgIGlmICggKHJ2PVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbGVuKzIpKSA9PSBOVUxMICkKKyAgICBiaW5fZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiArIDIpOworICAgIGlmIChiaW5fZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBiaW5fZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpOwogCiAgICAgZm9yKCA7IGxlbiA+IDAgOyBsZW4tLSwgYXNjaWlfZGF0YSsrICkgewogICAgICAgICAvKiBHZXQgdGhlIGJ5dGUgYW5kIGxvb2sgaXQgdXAgKi8KQEAgLTYzNCw3ICs2MjYsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmICggdGhpc19jaCA9PSBGQUlMICkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEVycm9yLCAiSWxsZWdhbCBjaGFyIik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICAgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgICAgIGlmICggdGhpc19jaCA9PSBET05FICkgewpAQCAtNjU2LDIxICs2NDgsMTQgQEAKICAgICBpZiAoIGxlZnRiaXRzICYmICFkb25lICkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoSW5jb21wbGV0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgaGFzIGluY29tcGxldGUgbnVtYmVyIG9mIGJ5dGVzIik7Ci0gICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGJpbl9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgaWYgKHJ2KSB7Ci0gICAgICAgIFB5T2JqZWN0ICpycnYgPSBQeV9CdWlsZFZhbHVlKCJPaSIsIHJ2LCBkb25lKTsKLSAgICAgICAgUHlfREVDUkVGKHJ2KTsKLSAgICAgICAgcmV0dXJuIHJydjsKLSAgICB9CiAKLSAgICByZXR1cm4gTlVMTDsKKyAgICByZXMgPSBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgYmluX2RhdGEpOworICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk5pIiwgcmVzLCBkb25lKTsKIH0KIAogCkBAIC02ODcsMTEgKzY3MiwxMyBAQAogYmluYXNjaWlfcmxlY29kZV9ocXhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MzkzZDc5MzM4ZjVmNTYyOSBpbnB1dD1lMWYxNzEyNDQ3YTgyYjA5XSovCiB7Ci0gICAgdW5zaWduZWQgY2hhciAqaW5fZGF0YSwgKm91dF9kYXRhOwotICAgIFB5T2JqZWN0ICpydjsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbl9kYXRhOworICAgIHVuc2lnbmVkIGNoYXIgKm91dF9kYXRhOwogICAgIHVuc2lnbmVkIGNoYXIgY2g7CiAgICAgUHlfc3NpemVfdCBpbiwgaW5lbmQsIGxlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogICAgIGluX2RhdGEgPSBkYXRhLT5idWY7CiAgICAgbGVuID0gZGF0YS0+bGVuOwogCkBAIC03MDEsOSArNjg4LDkgQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAvKiBXb3JzdCBjYXNlOiBvdXRwdXQgaXMgdHdpY2UgYXMgYmlnIGFzIGlucHV0IChmaXhlZCBsYXRlcikgKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICBvdXRfZGF0YSA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbiAqIDIgKyAyKTsKKyAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggaW49MDsgaW48bGVuOyBpbisrKSB7CiAgICAgICAgIGNoID0gaW5fZGF0YVtpbl07CkBAIC03MjksMTIgKzcxNiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChvdXRfZGF0YSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSkpIDwgMCkgewotICAgICAgICBQeV9DTEVBUihydik7Ci0gICAgfQotICAgIHJldHVybiBydjsKKworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgb3V0X2RhdGEpOwogfQogCiAKQEAgLTc1MSwxNSArNzM0LDE3IEBACiBiaW5hc2NpaV9iMmFfaHF4X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQwYWE1YTcwNGJjOWY3ZGUgaW5wdXQ9OTU5NmViZTAxOWZlMTJiYV0qLwogewotICAgIHVuc2lnbmVkIGNoYXIgKmFzY2lpX2RhdGEsICpiaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIGludCBsZWZ0Yml0cyA9IDA7CiAgICAgdW5zaWduZWQgY2hhciB0aGlzX2NoOwogICAgIHVuc2lnbmVkIGludCBsZWZ0Y2hhciA9IDA7Ci0gICAgUHlPYmplY3QgKnJ2OwogICAgIFB5X3NzaXplX3QgbGVuOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGJpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGxlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGxlbiA+PSAwKTsKIApAQCAtNzY3LDkgKzc1Miw5IEBACiAgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiAgICAgLyogQWxsb2NhdGUgYSBidWZmZXIgdGhhdCBpcyBhdCBsZWFzdCBsYXJnZSBlbm91Z2ggKi8KLSAgICBpZiAoIChydj1QeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGxlbioyKzIpKSA9PSBOVUxMICkKKyAgICBhc2NpaV9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgbGVuICogMiArIDIpOworICAgIGlmIChhc2NpaV9kYXRhID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGFzY2lpX2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KTsKIAogICAgIGZvciggOyBsZW4gPiAwIDsgbGVuLS0sIGJpbl9kYXRhKysgKSB7CiAgICAgICAgIC8qIFNoaWZ0IGludG8gb3VyIGJ1ZmZlciwgYW5kIG91dHB1dCBhbnkgNmJpdHMgcmVhZHkgKi8KQEAgLTc4NiwxMiArNzcxLDggQEAKICAgICAgICAgbGVmdGNoYXIgPDw9ICg2LWxlZnRiaXRzKTsKICAgICAgICAgKmFzY2lpX2RhdGErKyA9IHRhYmxlX2IyYV9ocXhbbGVmdGNoYXIgJiAweDNmXTsKICAgICB9Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsCi0gICAgICAgICAgICAgICAgICAgICAgIChhc2NpaV9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBhc2NpaV9kYXRhKTsKIH0KIAogCkBAIC04MDgsMTMgKzc4OSwxNSBAQAogYmluYXNjaWlfcmxlZGVjb2RlX2hxeF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05ODI2NjE5NTY1ZGUxYzZjIGlucHV0PTU0Y2RkNDlmYzAxNDQwMmNdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICppbl9kYXRhLCAqb3V0X2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW5fZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvdXRfZGF0YTsKICAgICB1bnNpZ25lZCBjaGFyIGluX2J5dGUsIGluX3JlcGVhdDsKLSAgICBQeU9iamVjdCAqcnY7Ci0gICAgUHlfc3NpemVfdCBpbl9sZW4sIG91dF9sZW4sIG91dF9sZW5fbGVmdDsKKyAgICBQeV9zc2l6ZV90IGluX2xlbjsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICBpbl9kYXRhID0gZGF0YS0+YnVmOwogICAgIGluX2xlbiA9IGRhdGEtPmxlbjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOwogCiAgICAgYXNzZXJ0KGluX2xlbiA+PSAwKTsKIApAQCAtODI1LDU5ICs4MDgsNDggQEAKICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAKICAgICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBvZiByZWFzb25hYmxlIHNpemUuIFJlc2l6ZWQgd2hlbiBuZWVkZWQgKi8KLSAgICBvdXRfbGVuID0gaW5fbGVuKjI7Ci0gICAgaWYgKCAocnY9UHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBvdXRfbGVuKSkgPT0gTlVMTCApCisgICAgb3V0X2RhdGEgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBpbl9sZW4pOworICAgIGlmIChvdXRfZGF0YSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBvdXRfbGVuX2xlZnQgPSBvdXRfbGVuOwotICAgIG91dF9kYXRhID0gKHVuc2lnbmVkIGNoYXIgKilQeUJ5dGVzX0FTX1NUUklORyhydik7CisKKyAgICAvKiBVc2Ugb3ZlcmFsbG9jYXRpb24gKi8KKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAogICAgIC8qCiAgICAgKiogV2UgbmVlZCB0d28gbWFjcm9zIGhlcmUgdG8gZ2V0L3B1dCBieXRlcyBhbmQgaGFuZGxlCiAgICAgKiogZW5kLW9mLWJ1ZmZlciBmb3IgaW5wdXQgYW5kIG91dHB1dCBzdHJpbmdzLgogICAgICovCi0jZGVmaW5lIElOQllURShiKSBcCi0gICAgZG8geyBcCi0gICAgICAgICAgICAgaWYgKCAtLWluX2xlbiA8IDAgKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgXAotICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyBcCi0gICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgYiA9ICppbl9kYXRhKys7IFwKKyNkZWZpbmUgSU5CWVRFKGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGlmICggLS1pbl9sZW4gPCAwICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEluY29tcGxldGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZ290byBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGIgPSAqaW5fZGF0YSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9IHdoaWxlKDApCiAKLSNkZWZpbmUgT1VUQllURShiKSBcCi0gICAgZG8geyBcCi0gICAgICAgICAgICAgaWYgKCAtLW91dF9sZW5fbGVmdCA8IDAgKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICBpZiAoIG91dF9sZW4gPiBQWV9TU0laRV9UX01BWCAvIDIpIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcnYsIDIqb3V0X2xlbikgPCAwKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICB7IFB5X1hERUNSRUYocnYpOyByZXR1cm4gTlVMTDsgfSBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2RhdGEgPSAodW5zaWduZWQgY2hhciAqKVB5Qnl0ZXNfQVNfU1RSSU5HKHJ2KSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRfbGVuOyBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbl9sZWZ0ID0gb3V0X2xlbi0xOyBcCi0gICAgICAgICAgICAgICAgICAgICAgb3V0X2xlbiA9IG91dF9sZW4gKiAyOyBcCi0gICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgKm91dF9kYXRhKysgPSBiOyBcCi0gICAgfSB3aGlsZSgwKQotCi0gICAgICAgIC8qCi0gICAgICAgICoqIEhhbmRsZSBmaXJzdCBieXRlIHNlcGFyYXRlbHkgKHNpbmNlIHdlIGhhdmUgdG8gZ2V0IGFuZ3J5Ci0gICAgICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgotICAgICAgICAqLwotICAgICAgICBJTkJZVEUoaW5fYnl0ZSk7CisgICAgLyoKKyAgICAqKiBIYW5kbGUgZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5IChzaW5jZSB3ZSBoYXZlIHRvIGdldCBhbmdyeQorICAgICoqIGluIGNhc2Ugb2YgYW4gb3JwaGFuZWQgUkxFIGNvZGUpLgorICAgICovCisgICAgSU5CWVRFKGluX2J5dGUpOwogCiAgICAgaWYgKGluX2J5dGUgPT0gUlVOQ0hBUikgewogICAgICAgICBJTkJZVEUoaW5fcmVwZWF0KTsKKyAgICAgICAgLyogb25seSAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCBidXQgMiBieXRlcyB3ZXJlIHByZWFsbG9jYXRlZDoKKyAgICAgICAgICAgc3Vic3RyYWN0IDEgYnl0ZSB0byBwcmV2ZW50IG92ZXJhbGxvY2F0aW9uICovCisgICAgICAgIHdyaXRlci5taW5fc2l6ZS0tOworCiAgICAgICAgIGlmIChpbl9yZXBlYXQgIT0gMCkgewogICAgICAgICAgICAgLyogTm90ZSBFcnJvciwgbm90IEluY29tcGxldGUgKHdoaWNoIGlzIGF0IHRoZSBlbmQKICAgICAgICAgICAgICoqIG9mIHRoZSBzdHJpbmcgb25seSkuIFRoaXMgaXMgYSBwcm9ncmFtbWVyIGVycm9yLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhFcnJvciwgIk9ycGhhbmVkIFJMRSBjb2RlIGF0IHN0YXJ0Iik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocnYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgIE9VVEJZVEUoUlVOQ0hBUik7CisgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKICAgICB9IGVsc2UgewotICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgfQogCiAgICAgd2hpbGUoIGluX2xlbiA+IDAgKSB7CkBAIC04ODUsMjYgKzg1NywzOSBAQAogCiAgICAgICAgIGlmIChpbl9ieXRlID09IFJVTkNIQVIpIHsKICAgICAgICAgICAgIElOQllURShpbl9yZXBlYXQpOworICAgICAgICAgICAgLyogb25seSAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCBidXQgMiBieXRlcyB3ZXJlIHByZWFsbG9jYXRlZDoKKyAgICAgICAgICAgICAgIHN1YnN0cmFjdCAxIGJ5dGUgdG8gcHJldmVudCBvdmVyYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplLS07CisKICAgICAgICAgICAgIGlmICggaW5fcmVwZWF0ID09IDAgKSB7CiAgICAgICAgICAgICAgICAgLyogSnVzdCBhbiBlc2NhcGVkIFJVTkNIQVIgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBPVVRCWVRFKFJVTkNIQVIpOworICAgICAgICAgICAgICAgICpvdXRfZGF0YSsrID0gUlVOQ0hBUjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogUGljayB1cCB2YWx1ZSBhbmQgb3V0cHV0IGEgc2VxdWVuY2Ugb2YgaXQgKi8KICAgICAgICAgICAgICAgICBpbl9ieXRlID0gb3V0X2RhdGFbLTFdOworCisgICAgICAgICAgICAgICAgLyogZW5sYXJnZSB0aGUgYnVmZmVyIGlmIG5lZWRlZCAqLworICAgICAgICAgICAgICAgIGlmIChpbl9yZXBlYXQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIC0xIGJlY2F1c2Ugd2UgYWxyZWFkeSBwcmVhbGxvY2F0ZWQgMSBieXRlICovCisgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX3JlcGVhdCAtIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0X2RhdGEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgd2hpbGUgKCAtLWluX3JlcGVhdCA+IDAgKQotICAgICAgICAgICAgICAgICAgICBPVVRCWVRFKGluX2J5dGUpOworICAgICAgICAgICAgICAgICAgICAqb3V0X2RhdGErKyA9IGluX2J5dGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBOb3JtYWwgYnl0ZSAqLwotICAgICAgICAgICAgT1VUQllURShpbl9ieXRlKTsKKyAgICAgICAgICAgICpvdXRfZGF0YSsrID0gaW5fYnl0ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZydiwKLSAgICAgICAgICAgICAgICAgICAgICAgKG91dF9kYXRhIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopUHlCeXRlc19BU19TVFJJTkcocnYpKSkgPCAwKSB7Ci0gICAgICAgIFB5X0NMRUFSKHJ2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJ2OworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgb3V0X2RhdGEpOworCitlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiAKQEAgLTkyMiw3ICs5MDcsNyBAQAogYmluYXNjaWlfY3JjX2hxeF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgdW5zaWduZWQgaW50IGNyYykKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04ZWMyYTc4NTkwZDE5MTcwIGlucHV0PWFkZDhjNTM3MTJjY2NlZGFdKi8KIHsKLSAgICB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpiaW5fZGF0YTsKICAgICBQeV9zc2l6ZV90IGxlbjsKIAogICAgIGNyYyAmPSAweGZmZmY7CkBAIC0xMDAwLDcgKzk4NSw3IEBACiAgICAgIHVzaW5nIGJ5dGUtc3dhcCBpbnN0cnVjdGlvbnMuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBjcmNfMzJfdGFiWzI1Nl0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNyY18zMl90YWJbMjU2XSA9IHsKIDB4MDAwMDAwMDBVLCAweDc3MDczMDk2VSwgMHhlZTBlNjEyY1UsIDB4OTkwOTUxYmFVLCAweDA3NmRjNDE5VSwKIDB4NzA2YWY0OGZVLCAweGU5NjNhNTM1VSwgMHg5ZTY0OTVhM1UsIDB4MGVkYjg4MzJVLCAweDc5ZGNiOGE0VSwKIDB4ZTBkNWU5MWVVLCAweDk3ZDJkOTg4VSwgMHgwOWI2NGMyYlUsIDB4N2ViMTdjYmRVLCAweGU3YjgyZDA3VSwKQEAgLTEwNzMsNyArMTA1OCw3IEBACiAjaWZkZWYgVVNFX1pMSUJfQ1JDMzIKIC8qIFRoaXMgd2FzIHRha2VuIGZyb20gemxpYm1vZHVsZS5jIFB5WmxpYl9jcmMzMiAoYnV0IGlzIFBZX1NTSVpFX1RfQ0xFQU4pICovCiB7Ci0gICAgQnl0ZSAqYnVmOworICAgIGNvbnN0IEJ5dGUgKmJ1ZjsKICAgICBQeV9zc2l6ZV90IGxlbjsKICAgICBpbnQgc2lnbmVkX3ZhbDsKIApAQCAtMTA4NCw3ICsxMDY5LDcgQEAKIH0KICNlbHNlICAvKiBVU0VfWkxJQl9DUkMzMiAqLwogeyAvKiBCeSBKaW0gQWhsc3Ryb207IEFsbCByaWdodHMgdHJhbnNmZXJyZWQgdG8gQ05SSSAqLwotICAgIHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJpbl9kYXRhOwogICAgIFB5X3NzaXplX3QgbGVuOwogICAgIHVuc2lnbmVkIGludCByZXN1bHQ7CiAKQEAgLTExNjcsNyArMTE1Miw3IEBACiBiaW5hc2NpaV9hMmJfaGV4X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpoZXhzdHIpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGNjMWExMzlhZjBlZWVjYiBpbnB1dD05ZTFlN2YyZjk0ZGIyNGZkXSovCiB7Ci0gICAgY2hhciogYXJnYnVmOworICAgIGNvbnN0IGNoYXIqIGFyZ2J1ZjsKICAgICBQeV9zc2l6ZV90IGFyZ2xlbjsKICAgICBQeU9iamVjdCAqcmV0dmFsOwogICAgIGNoYXIqIHJldGJ1ZjsKQEAgLTEyMjQsNyArMTIwOSw3IEBACiAgICAgcmV0dXJuIGJpbmFzY2lpX2EyYl9oZXhfaW1wbChtb2R1bGUsIGhleHN0cik7CiB9CiAKLXN0YXRpYyBpbnQgdGFibGVfaGV4WzEyOF0gPSB7CitzdGF0aWMgY29uc3QgaW50IHRhYmxlX2hleFsxMjhdID0gewogICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwKICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsCiAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLApAQCAtMTI1NSw3ICsxMjQwLDggQEAKIHsKICAgICBQeV9zc2l6ZV90IGluLCBvdXQ7CiAgICAgY2hhciBjaDsKLSAgICB1bnNpZ25lZCBjaGFyICphc2NpaV9kYXRhLCAqb2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYXNjaWlfZGF0YTsKKyAgICB1bnNpZ25lZCBjaGFyICpvZGF0YTsKICAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwOwogICAgIFB5T2JqZWN0ICpydjsKIApAQCAtMTM2MSwxMyArMTM0NywxNCBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWU5ODg0NDcyZWJiMWE5NGMgaW5wdXQ9N2YyYTlhYWEwMDhlOTJiMl0qLwogewogICAgIFB5X3NzaXplX3QgaW4sIG91dDsKLSAgICB1bnNpZ25lZCBjaGFyICpkYXRhYnVmLCAqb2RhdGE7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YWJ1ZjsKKyAgICB1bnNpZ25lZCBjaGFyICpvZGF0YTsKICAgICBQeV9zc2l6ZV90IGRhdGFsZW4gPSAwLCBvZGF0YWxlbiA9IDA7CiAgICAgUHlPYmplY3QgKnJ2OwogICAgIHVuc2lnbmVkIGludCBsaW5lbGVuID0gMDsKICAgICB1bnNpZ25lZCBjaGFyIGNoOwogICAgIGludCBjcmxmID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICpwOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CiAKICAgICBkYXRhYnVmID0gZGF0YS0+YnVmOwogICAgIGRhdGFsZW4gPSBkYXRhLT5sZW47CkBAIC0xMzc2LDcgKzEzNjMsNyBAQAogICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNvbnZlcnRpbmcgYWxsIG9mCiAgICAgICogdGhlIGVuZCBvZiBsaW5lcyB0byBiZSB0aGUgc2FtZSBkZXBlbmRpbmcgb24gdGhpcyBkZXRlY3Rpb24KICAgICAgKiBoZXJlICovCi0gICAgcCA9ICh1bnNpZ25lZCBjaGFyICopIG1lbWNocihkYXRhYnVmLCAnXG4nLCBkYXRhbGVuKTsKKyAgICBwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgbWVtY2hyKGRhdGFidWYsICdcbicsIGRhdGFsZW4pOwogICAgIGlmICgocCAhPSBOVUxMKSAmJiAocCA+IGRhdGFidWYpICYmICgqKHAtMSkgPT0gJ1xyJykpCiAgICAgICAgIGNybGYgPSAxOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2Nqa2NvZGVjcy9jbGluaWMvbXVsdGlieXRlY29kZWMuYy5oIGIvTW9kdWxlcy9jamtjb2RlY3MvY2xpbmljL211bHRpYnl0ZWNvZGVjLmMuaAppbmRleCA4YTQ3ZmY4Li4wZDhhM2UwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2Nqa2NvZGVjcy9jbGluaWMvbXVsdGlieXRlY29kZWMuYy5oCisrKyBiL01vZHVsZXMvY2prY29kZWNzL2NsaW5pYy9tdWx0aWJ5dGVjb2RlYy5jLmgKQEAgLTMwLDggKzMwLDkgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3x6OmVuY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZXJyb3JzKSkKKyAgICAgICAgJmlucHV0LCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVDb2RlY19lbmNvZGVfaW1wbChzZWxmLCBpbnB1dCwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTY2LDE0ICs2NywxNiBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5Knx6OmRlY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmlucHV0LCAmZXJyb3JzKSkKKyAgICAgICAgJmlucHV0LCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVDb2RlY19kZWNvZGVfaW1wbChzZWxmLCAmaW5wdXQsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgaW5wdXQgKi8KLSAgICBpZiAoaW5wdXQub2JqKQorICAgIGlmIChpbnB1dC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZpbnB1dCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTEwMCw4ICsxMDMsOSBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfGk6ZW5jb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmaW5wdXQsICZmaW5hbCkpCisgICAgICAgICZpbnB1dCwgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXJfZW5jb2RlX2ltcGwoc2VsZiwgaW5wdXQsIGZpbmFsKTsKIAogZXhpdDoKQEAgLTE0NywxNCArMTUxLDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfGk6ZGVjb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmaW5wdXQsICZmaW5hbCkpCisgICAgICAgICZpbnB1dCwgJmZpbmFsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tdWx0aWJ5dGVjb2RlY19NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXJfZGVjb2RlX2ltcGwoc2VsZiwgJmlucHV0LCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgaW5wdXQgKi8KLSAgICBpZiAoaW5wdXQub2JqKQorICAgIGlmIChpbnB1dC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZpbnB1dCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE5Niw4ICsyMDIsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAicmVhZCIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZzaXplb2JqKSkKKyAgICAgICAgJnNpemVvYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX211bHRpYnl0ZWNvZGVjX011bHRpYnl0ZVN0cmVhbVJlYWRlcl9yZWFkX2ltcGwoc2VsZiwgc2l6ZW9iaik7CiAKIGV4aXQ6CkBAIC0yMjQsOCArMjMxLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJnNpemVvYmopKQorICAgICAgICAmc2l6ZW9iaikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlU3RyZWFtUmVhZGVyX3JlYWRsaW5lX2ltcGwoc2VsZiwgc2l6ZW9iaik7CiAKIGV4aXQ6CkBAIC0yNTIsOCArMjYwLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInJlYWRsaW5lcyIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZzaXplaGludG9iaikpCisgICAgICAgICZzaXplaGludG9iaikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbXVsdGlieXRlY29kZWNfTXVsdGlieXRlU3RyZWFtUmVhZGVyX3JlYWRsaW5lc19pbXBsKHNlbGYsIHNpemVoaW50b2JqKTsKIAogZXhpdDoKQEAgLTMxNyw0ICszMjYsNCBAQAogCiAjZGVmaW5lIF9NVUxUSUJZVEVDT0RFQ19fX0NSRUFURV9DT0RFQ19NRVRIT0RERUYgICAgXAogICAgIHsiX19jcmVhdGVfY29kZWMiLCAoUHlDRnVuY3Rpb24pX211bHRpYnl0ZWNvZGVjX19fY3JlYXRlX2NvZGVjLCBNRVRIX08sIF9tdWx0aWJ5dGVjb2RlY19fX2NyZWF0ZV9jb2RlY19fZG9jX199LAotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVlYmIyMWUxOGMzMDQzZDEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY4MzdiYzU2YjJmYTJhNGUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2J6Mm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaAppbmRleCAzZWQ4MzAzLi45NDUxZmQzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fYnoybW9kdWxlLmMuaApAQCAtMjUsMTQgKzI1LDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfYnoyX0JaMkNvbXByZXNzb3JfY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODAsMTEgKzgyLDEzIEBACiAgICAgaW50IGNvbXByZXNzbGV2ZWwgPSA5OwogCiAgICAgaWYgKChQeV9UWVBFKHNlbGYpID09ICZCWjJDb21wcmVzc29yX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQloyQ29tcHJlc3NvciIsIGt3YXJncykpCisgICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiQloyQ29tcHJlc3NvciIsIGt3YXJncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOkJaMkNvbXByZXNzb3IiLAotICAgICAgICAmY29tcHJlc3NsZXZlbCkpCisgICAgICAgICZjb21wcmVzc2xldmVsKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9iejJfQloyQ29tcHJlc3Nvcl9fX2luaXRfX19pbXBsKChCWjJDb21wcmVzc29yICopc2VsZiwgY29tcHJlc3NsZXZlbCk7CiAKIGV4aXQ6CkBAIC0xMjYsMTQgKzEzMCwxNiBAQAogICAgIFB5X3NzaXplX3QgbWF4X2xlbmd0aCA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAieSp8bjpkZWNvbXByZXNzIiwgX2tleXdvcmRzLAotICAgICAgICAmZGF0YSwgJm1heF9sZW5ndGgpKQorICAgICAgICAmZGF0YSwgJm1heF9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2J6Ml9CWjJEZWNvbXByZXNzb3JfZGVjb21wcmVzc19pbXBsKHNlbGYsICZkYXRhLCBtYXhfbGVuZ3RoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xNTUsMTQgKzE2MSwxNiBAQAogICAgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKIAogICAgIGlmICgoUHlfVFlQRShzZWxmKSA9PSAmQloyRGVjb21wcmVzc29yX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJCWjJEZWNvbXByZXNzb3IiLCBhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIkJaMkRlY29tcHJlc3NvciIsIGFyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgaWYgKChQeV9UWVBFKHNlbGYpID09ICZCWjJEZWNvbXByZXNzb3JfVHlwZSkgJiYKLSAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJCWjJEZWNvbXByZXNzb3IiLCBrd2FyZ3MpKQorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIkJaMkRlY29tcHJlc3NvciIsIGt3YXJncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfYnoyX0JaMkRlY29tcHJlc3Nvcl9fX2luaXRfX19pbXBsKChCWjJEZWNvbXByZXNzb3IgKilzZWxmKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZlZjI5Yjc2YjMzMTRmYzcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTcxYmUyMmYzODIyNGZlODQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2NvZGVjc21vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fY29kZWNzbW9kdWxlLmMuaAppbmRleCBhZjA2YzZkLi41MmM2MWM1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fY29kZWNzbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fY29kZWNzbW9kdWxlLmMuaApAQCAtMzMsOCArMzMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmxvb2t1cCIsICZlbmNvZGluZykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmxvb2t1cCIsICZlbmNvZGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2xvb2t1cF9pbXBsKG1vZHVsZSwgZW5jb2RpbmcpOwogCiBleGl0OgpAQCAtNzAsOCArNzEsOSBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfHNzOmVuY29kZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJm9iaiwgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICAgICAgJm9iaiwgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfZW5jb2RlX2ltcGwobW9kdWxlLCBvYmosIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMTA3LDggKzEwOSw5IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98c3M6ZGVjb2RlIiwgX2tleXdvcmRzLAotICAgICAgICAmb2JqLCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgICAgICAmb2JqLCAmZW5jb2RpbmcsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19kZWNvZGVfaW1wbChtb2R1bGUsIG9iaiwgZW5jb2RpbmcsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMzMsOCArMTM2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICplbmNvZGluZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpfZm9yZ2V0X2NvZGVjIiwgJmVuY29kaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6X2ZvcmdldF9jb2RlYyIsICZlbmNvZGluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX19mb3JnZXRfY29kZWNfaW1wbChtb2R1bGUsIGVuY29kaW5nKTsKIAogZXhpdDoKQEAgLTE2MSwxNCArMTY1LDE2IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyp8ejplc2NhcGVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2VzY2FwZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTE5Myw4ICsxOTksOSBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hfHo6ZXNjYXBlX2VuY29kZSIsCi0gICAgICAgICZQeUJ5dGVzX1R5cGUsICZkYXRhLCAmZXJyb3JzKSkKKyAgICAgICAgJlB5Qnl0ZXNfVHlwZSwgJmRhdGEsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19lc2NhcGVfZW5jb2RlX2ltcGwobW9kdWxlLCBkYXRhLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMjIxLDggKzIyOCw5IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlIiwKLSAgICAgICAgJm9iaiwgJmVycm9ycykpCisgICAgICAgICZvYmosICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191bmljb2RlX2ludGVybmFsX2RlY29kZV9pbXBsKG1vZHVsZSwgb2JqLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMjUwLDE0ICsyNTgsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6aTp1dGZfN19kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl83X2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycywgZmluYWwpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI4MywxNCArMjkzLDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6dXRmXzhfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfOF9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMTYsMTQgKzMyOCwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl8xNl9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8xNl9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zNDksMTQgKzM2MywxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl8xNl9sZV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8xNl9sZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zODIsMTQgKzM5OCwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl8xNl9iZV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8xNl9iZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MTcsMTQgKzQzNSwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppaTp1dGZfMTZfZXhfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfZXhfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBieXRlb3JkZXIsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00NTAsMTQgKzQ3MCwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl8zMl9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8zMl9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00ODMsMTQgKzUwNSwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl8zMl9sZV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8zMl9sZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC01MTYsMTQgKzU0MCwxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppOnV0Zl8zMl9iZV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8zMl9iZV9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC01NTEsMTQgKzU3NywxNiBAQAogICAgIGludCBmaW5hbCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHppaTp1dGZfMzJfZXhfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZieXRlb3JkZXIsICZmaW5hbCkpCisgICAgICAgICZkYXRhLCAmZXJyb3JzLCAmYnl0ZW9yZGVyLCAmZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfZXhfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBieXRlb3JkZXIsIGZpbmFsKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC01ODMsMTQgKzYxMSwxNiBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqfHo6dW5pY29kZV9lc2NhcGVfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3VuaWNvZGVfZXNjYXBlX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNjE1LDE0ICs2NDUsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycykpCisgICAgICAgICZkYXRhLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfcmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNjQ3LDE0ICs2NzksMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Knx6OmxhdGluXzFfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2xhdGluXzFfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC02NzksMTQgKzcxMywxNiBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHo6YXNjaWlfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2FzY2lpX2RlY29kZV9pbXBsKG1vZHVsZSwgJmRhdGEsIGVycm9ycyk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNzEyLDE0ICs3NDgsMTYgQEAKICAgICBQeU9iamVjdCAqbWFwcGluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfHpPOmNoYXJtYXBfZGVjb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMsICZtYXBwaW5nKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZtYXBwaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfY2hhcm1hcF9kZWNvZGVfaW1wbChtb2R1bGUsICZkYXRhLCBlcnJvcnMsIG1hcHBpbmcpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTc0NywxNCArNzg1LDE2IEBACiAgICAgaW50IGZpbmFsID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp8emk6bWJjc19kZWNvZGUiLAotICAgICAgICAmZGF0YSwgJmVycm9ycywgJmZpbmFsKSkKKyAgICAgICAgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX21iY3NfZGVjb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNzg1LDE0ICs4MjUsMTYgQEAKICAgICBpbnQgZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpeSp8emk6Y29kZV9wYWdlX2RlY29kZSIsCi0gICAgICAgICZjb2RlcGFnZSwgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpCisgICAgICAgICZjb2RlcGFnZSwgJmRhdGEsICZlcnJvcnMsICZmaW5hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX2NvZGVfcGFnZV9kZWNvZGVfaW1wbChtb2R1bGUsIGNvZGVwYWdlLCAmZGF0YSwgZXJyb3JzLCBmaW5hbCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODE5LDE0ICs4NjEsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzKnx6OnJlYWRidWZmZXJfZW5jb2RlIiwKLSAgICAgICAgJmRhdGEsICZlcnJvcnMpKQorICAgICAgICAmZGF0YSwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3JlYWRidWZmZXJfZW5jb2RlX2ltcGwobW9kdWxlLCAmZGF0YSwgZXJyb3JzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC04NTEsOCArODk1LDkgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dW5pY29kZV9pbnRlcm5hbF9lbmNvZGUiLAotICAgICAgICAmb2JqLCAmZXJyb3JzKSkKKyAgICAgICAgJm9iaiwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3VuaWNvZGVfaW50ZXJuYWxfZW5jb2RlX2ltcGwobW9kdWxlLCBvYmosIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC04NzgsOSArOTIzLDEwIEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzdfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzdfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl83X2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtOTA2LDkgKzk1MiwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl84X2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl84X2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfOF9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTkzNSw5ICs5ODIsMTAgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHppOnV0Zl8xNl9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8emk6dXRmXzE2X2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycywgYnl0ZW9yZGVyKTsKIAogZXhpdDoKQEAgLTk2Myw5ICsxMDExLDEwIEBACiAgICAgUHlPYmplY3QgKnN0cjsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHo6dXRmXzE2X2xlX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnV0Zl8xNl9sZV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfdXRmXzE2X2xlX2VuY29kZV9pbXBsKG1vZHVsZSwgc3RyLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtOTkxLDkgKzEwNDAsMTAgQEAKICAgICBQeU9iamVjdCAqc3RyOwogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98ejp1dGZfMTZfYmVfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6dXRmXzE2X2JlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMTZfYmVfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMDIwLDkgKzEwNzAsMTAgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOwogICAgIGludCBieXRlb3JkZXIgPSAwOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHppOnV0Zl8zMl9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzLCAmYnl0ZW9yZGVyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8emk6dXRmXzMyX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMsICZieXRlb3JkZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191dGZfMzJfZW5jb2RlX2ltcGwobW9kdWxlLCBzdHIsIGVycm9ycywgYnl0ZW9yZGVyKTsKIAogZXhpdDoKQEAgLTEwNDgsOSArMTA5OSwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl8zMl9sZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1dGZfMzJfbGVfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8zMl9sZV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTEwNzYsOSArMTEyOCwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnV0Zl8zMl9iZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejp1dGZfMzJfYmVfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3V0Zl8zMl9iZV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTExMDQsOSArMTE1NywxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnVuaWNvZGVfZXNjYXBlX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OnVuaWNvZGVfZXNjYXBlX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc191bmljb2RlX2VzY2FwZV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTExMzIsOSArMTE4NiwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUiLAotICAgICAgICAmc3RyLCAmZXJyb3JzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlV8ejpyYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlIiwKKyAgICAgICAgJnN0ciwgJmVycm9ycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfY29kZWNzX3Jhd191bmljb2RlX2VzY2FwZV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTExNjAsOSArMTIxNSwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OmxhdGluXzFfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6bGF0aW5fMV9lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfbGF0aW5fMV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTExODgsOSArMTI0NCwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6OmFzY2lpX2VuY29kZSIsCi0gICAgICAgICZzdHIsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6OmFzY2lpX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19hc2NpaV9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTEyMTcsOSArMTI3NCwxMCBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1hcHBpbmcgPSBOVUxMOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfHpPOmNoYXJtYXBfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycywgJm1hcHBpbmcpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVXx6TzpjaGFybWFwX2VuY29kZSIsCisgICAgICAgICZzdHIsICZlcnJvcnMsICZtYXBwaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfY2hhcm1hcF9lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzLCBtYXBwaW5nKTsKIAogZXhpdDoKQEAgLTEyNDMsOCArMTMwMSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1hcDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTpjaGFybWFwX2J1aWxkIiwgJm1hcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmNoYXJtYXBfYnVpbGQiLCAmbWFwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfY2hhcm1hcF9idWlsZF9pbXBsKG1vZHVsZSwgbWFwKTsKIAogZXhpdDoKQEAgLTEyNzEsOSArMTMzMCwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3x6Om1iY3NfZW5jb2RlIiwKLSAgICAgICAgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJVfHo6bWJjc19lbmNvZGUiLAorICAgICAgICAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfbWJjc19lbmNvZGVfaW1wbChtb2R1bGUsIHN0ciwgZXJyb3JzKTsKIAogZXhpdDoKQEAgLTEzMDQsOSArMTM2NCwxMCBAQAogICAgIFB5T2JqZWN0ICpzdHI7CiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU98ejpjb2RlX3BhZ2VfZW5jb2RlIiwKLSAgICAgICAgJmNvZGVfcGFnZSwgJnN0ciwgJmVycm9ycykpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpVXx6OmNvZGVfcGFnZV9lbmNvZGUiLAorICAgICAgICAmY29kZV9wYWdlLCAmc3RyLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfY29kZV9wYWdlX2VuY29kZV9pbXBsKG1vZHVsZSwgY29kZV9wYWdlLCBzdHIsIGVycm9ycyk7CiAKIGV4aXQ6CkBAIC0xMzQwLDggKzE0MDEsOSBAQAogICAgIFB5T2JqZWN0ICpoYW5kbGVyOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzTzpyZWdpc3Rlcl9lcnJvciIsCi0gICAgICAgICZlcnJvcnMsICZoYW5kbGVyKSkKKyAgICAgICAgJmVycm9ycywgJmhhbmRsZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2NvZGVjc19yZWdpc3Rlcl9lcnJvcl9pbXBsKG1vZHVsZSwgZXJyb3JzLCBoYW5kbGVyKTsKIAogZXhpdDoKQEAgLTEzNjksOCArMTQzMSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpsb29rdXBfZXJyb3IiLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmxvb2t1cF9lcnJvciIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9jb2RlY3NfbG9va3VwX2Vycm9yX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTEzOTIsNCArMTQ1NSw0IEBACiAjaWZuZGVmIF9DT0RFQ1NfQ09ERV9QQUdFX0VOQ09ERV9NRVRIT0RERUYKICAgICAjZGVmaW5lIF9DT0RFQ1NfQ09ERV9QQUdFX0VOQ09ERV9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfQ09ERUNTX0NPREVfUEFHRV9FTkNPREVfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQyZmVkOTRlMmFiNzY1YmEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTZlODlmZjQ0MjNjMTJhOWIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2NyeXB0bW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19jcnlwdG1vZHVsZS5jLmgKaW5kZXggYTNjMzcxYy4uNDEyYzZmZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2NyeXB0bW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fY3J5cHRtb2R1bGUuYy5oCkBAIC0yNywxMSArMjcsMTIgQEAKICAgICBjb25zdCBjaGFyICpzYWx0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzczpjcnlwdCIsCi0gICAgICAgICZ3b3JkLCAmc2FsdCkpCisgICAgICAgICZ3b3JkLCAmc2FsdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjcnlwdF9jcnlwdF9pbXBsKG1vZHVsZSwgd29yZCwgc2FsdCk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lMDQ5M2E5NjkxNTM3NjkwIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04ZGZjODgyNjRlNjYyZGY0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19jdXJzZXNtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2N1cnNlc21vZHVsZS5jLmgKaW5kZXggNWUxMTc0Mi4uNjJmZjFjOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2N1cnNlc21vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2N1cnNlc21vZHVsZS5jLmgKQEAgLTQwLDIyICs0MCwyNiBAQAogCiAgICAgc3dpdGNoIChQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzphZGRjaCIsICZjaCkpCisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YWRkY2giLCAmY2gpKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2w6YWRkY2giLCAmY2gsICZhdHRyKSkKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2w6YWRkY2giLCAmY2gsICZhdHRyKSkgewogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdyb3VwX3JpZ2h0XzEgPSAxOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlPOmFkZGNoIiwgJnksICZ4LCAmY2gpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU86YWRkY2giLCAmeSwgJngsICZjaCkpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBncm91cF9sZWZ0XzEgPSAxOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWlPbDphZGRjaCIsICZ5LCAmeCwgJmNoLCAmYXR0cikpCisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpT2w6YWRkY2giLCAmeSwgJngsICZjaCwgJmF0dHIpKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgZ3JvdXBfcmlnaHRfMSA9IDE7CiAgICAgICAgICAgICBncm91cF9sZWZ0XzEgPSAxOwogICAgICAgICAgICAgYnJlYWs7CkBAIC02OCw0ICs3Miw0IEBACiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTgyYjFlNzA5NTc3ZjNlYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MTNmZmM1ZjhkNzljYmZiZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fZGF0ZXRpbWVtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2RhdGV0aW1lbW9kdWxlLmMuaAppbmRleCA2ODhjOTAzLi5jZjk4NjBiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fZGF0ZXRpbWVtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19kYXRldGltZW1vZHVsZS5jLmgKQEAgLTI3LDExICsyNywxMiBAQAogICAgIFB5T2JqZWN0ICp0eiA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8Tzpub3ciLCBfa2V5d29yZHMsCi0gICAgICAgICZ0eikpCisgICAgICAgICZ0eikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBkYXRldGltZV9kYXRldGltZV9ub3dfaW1wbCh0eXBlLCB0eik7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD03ZjQ1YzY3MGQ2ZTQ5NTNhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hODJlNmJkMDU3YTVkYWI5IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19kYm1tb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKaW5kZXggNDljYmNlYi4uMDZjZjdlNiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2RibW1vZHVsZS5jLmgKQEAgLTYwLDggKzYwLDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfE86Z2V0IiwKLSAgICAgICAgJmtleSwgJmtleV9sZW5ndGgsICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmtleV9sZW5ndGgsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9kYm1fZGJtX2dldF9pbXBsKHNlbGYsIGtleSwga2V5X2xlbmd0aCwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC05Myw4ICs5NCw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzI3xPOnNldGRlZmF1bHQiLAotICAgICAgICAma2V5LCAma2V5X2xlbmd0aCwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAma2V5LCAma2V5X2xlbmd0aCwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2RibV9kYm1fc2V0ZGVmYXVsdF9pbXBsKHNlbGYsIGtleSwga2V5X2xlbmd0aCwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xMzEsMTEgKzEzMywxMiBAQAogICAgIGludCBtb2RlID0gNDM4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHNpOm9wZW4iLAotICAgICAgICAmZmlsZW5hbWUsICZmbGFncywgJm1vZGUpKQorICAgICAgICAmZmlsZW5hbWUsICZmbGFncywgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZGJtb3Blbl9pbXBsKG1vZHVsZSwgZmlsZW5hbWUsIGZsYWdzLCBtb2RlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWZmZjEyZjE2OGNkZjhiNDMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTk5YWRmOTY2ZWYwNDc1ZmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaCBiL01vZHVsZXMvY2xpbmljL19lbGVtZW50dHJlZS5jLmgKaW5kZXggODZiNGM0Yy4uMjY2YjkyZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX2VsZW1lbnR0cmVlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fZWxlbWVudHRyZWUuYy5oCkBAIC0xOSw4ICsxOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnN1YmVsZW1lbnQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8hOmFwcGVuZCIsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8hOmFwcGVuZCIsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2FwcGVuZF9pbXBsKHNlbGYsIHN1YmVsZW1lbnQpOwogCiBleGl0OgpAQCAtODcsOCArODgsOSBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9fX3NpemVvZl9fX2ltcGwoc2VsZik7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE0OSw4ICsxNTEsOSBAQAogICAgIFB5T2JqZWN0ICpuYW1lc3BhY2VzID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzpmaW5kIiwgX2tleXdvcmRzLAotICAgICAgICAmcGF0aCwgJm5hbWVzcGFjZXMpKQorICAgICAgICAmcGF0aCwgJm5hbWVzcGFjZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfZmluZF9pbXBsKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXMpOwogCiBleGl0OgpAQCAtMTgwLDggKzE4Myw5IEBACiAgICAgUHlPYmplY3QgKm5hbWVzcGFjZXMgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xPTzpmaW5kdGV4dCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgsICZkZWZhdWx0X3ZhbHVlLCAmbmFtZXNwYWNlcykpCisgICAgICAgICZwYXRoLCAmZGVmYXVsdF92YWx1ZSwgJm5hbWVzcGFjZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfZmluZHRleHRfaW1wbChzZWxmLCBwYXRoLCBkZWZhdWx0X3ZhbHVlLCBuYW1lc3BhY2VzKTsKIAogZXhpdDoKQEAgLTIwOSw4ICsyMTMsOSBAQAogICAgIFB5T2JqZWN0ICpuYW1lc3BhY2VzID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzpmaW5kYWxsIiwgX2tleXdvcmRzLAotICAgICAgICAmcGF0aCwgJm5hbWVzcGFjZXMpKQorICAgICAgICAmcGF0aCwgJm5hbWVzcGFjZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfZmluZGFsbF9pbXBsKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXMpOwogCiBleGl0OgpAQCAtMjM4LDggKzI0Myw5IEBACiAgICAgUHlPYmplY3QgKm5hbWVzcGFjZXMgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xPOml0ZXJmaW5kIiwgX2tleXdvcmRzLAotICAgICAgICAmcGF0aCwgJm5hbWVzcGFjZXMpKQorICAgICAgICAmcGF0aCwgJm5hbWVzcGFjZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfaXRlcmZpbmRfaW1wbChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzKTsKIAogZXhpdDoKQEAgLTI2Nyw4ICsyNzMsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98TzpnZXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmtleSwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfZ2V0X2ltcGwoc2VsZiwga2V5LCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTMxMSw4ICszMTgsOSBAQAogICAgIFB5T2JqZWN0ICp0YWcgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86aXRlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJnRhZykpCisgICAgICAgICZ0YWcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX0VsZW1lbnRfaXRlcl9pbXBsKHNlbGYsIHRhZyk7CiAKIGV4aXQ6CkBAIC0zNTYsOCArMzY0LDkgQEAKICAgICBQeU9iamVjdCAqc3ViZWxlbWVudDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk8hOmluc2VydCIsCi0gICAgICAgICZpbmRleCwgJkVsZW1lbnRfVHlwZSwgJnN1YmVsZW1lbnQpKQorICAgICAgICAmaW5kZXgsICZFbGVtZW50X1R5cGUsICZzdWJlbGVtZW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X2luc2VydF9pbXBsKHNlbGYsIGluZGV4LCBzdWJlbGVtZW50KTsKIAogZXhpdDoKQEAgLTQxOSw4ICs0MjgsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAibWFrZWVsZW1lbnQiLAogICAgICAgICAyLCAyLAotICAgICAgICAmdGFnLCAmYXR0cmliKSkKKyAgICAgICAgJnRhZywgJmF0dHJpYikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9tYWtlZWxlbWVudF9pbXBsKHNlbGYsIHRhZywgYXR0cmliKTsKIAogZXhpdDoKQEAgLTQ0NCw4ICs0NTQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpzdWJlbGVtZW50OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPITpyZW1vdmUiLCAmRWxlbWVudF9UeXBlLCAmc3ViZWxlbWVudCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPITpyZW1vdmUiLCAmRWxlbWVudF9UeXBlLCAmc3ViZWxlbWVudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfZWxlbWVudHRyZWVfRWxlbWVudF9yZW1vdmVfaW1wbChzZWxmLCBzdWJlbGVtZW50KTsKIAogZXhpdDoKQEAgLTQ3Myw4ICs0ODQsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic2V0IiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJmtleSwgJnZhbHVlKSkKKyAgICAgICAgJmtleSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9FbGVtZW50X3NldF9pbXBsKHNlbGYsIGtleSwgdmFsdWUpOwogCiBleGl0OgpAQCAtNDkzLDggKzUwNSw5IEBACiAgICAgUHlPYmplY3QgKmVsZW1lbnRfZmFjdG9yeSA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpUcmVlQnVpbGRlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmVsZW1lbnRfZmFjdG9yeSkpCisgICAgICAgICZlbGVtZW50X2ZhY3RvcnkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1RyZWVCdWlsZGVyX19faW5pdF9fX2ltcGwoKFRyZWVCdWlsZGVyT2JqZWN0ICopc2VsZiwgZWxlbWVudF9mYWN0b3J5KTsKIAogZXhpdDoKQEAgLTU1NSw4ICs1NjgsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RhcnQiLAogICAgICAgICAxLCAyLAotICAgICAgICAmdGFnLCAmYXR0cnMpKQorICAgICAgICAmdGFnLCAmYXR0cnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1RyZWVCdWlsZGVyX3N0YXJ0X2ltcGwoc2VsZiwgdGFnLCBhdHRycyk7CiAKIGV4aXQ6CkBAIC01NzcsOCArNTkxLDkgQEAKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8T096OlhNTFBhcnNlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJmh0bWwsICZ0YXJnZXQsICZlbmNvZGluZykpCisgICAgICAgICZodG1sLCAmdGFyZ2V0LCAmZW5jb2RpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2VsZW1lbnR0cmVlX1hNTFBhcnNlcl9fX2luaXRfX19pbXBsKChYTUxQYXJzZXJPYmplY3QgKilzZWxmLCBodG1sLCB0YXJnZXQsIGVuY29kaW5nKTsKIAogZXhpdDoKQEAgLTY0MCw4ICs2NTUsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZG9jdHlwZSIsCiAgICAgICAgIDMsIDMsCi0gICAgICAgICZuYW1lLCAmcHViaWQsICZzeXN0ZW0pKQorICAgICAgICAmbmFtZSwgJnB1YmlkLCAmc3lzdGVtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9YTUxQYXJzZXJfZG9jdHlwZV9pbXBsKHNlbGYsIG5hbWUsIHB1YmlkLCBzeXN0ZW0pOwogCiBleGl0OgpAQCAtNjY4LDEyICs2ODQsMTQgQEAKICAgICBQeU9iamVjdCAqZXZlbnRzX3F1ZXVlOwogICAgIFB5T2JqZWN0ICpldmVudHNfdG9fcmVwb3J0ID0gUHlfTm9uZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyF8Tzpfc2V0ZXZlbnRzIiwKLSAgICAgICAgJlB5TGlzdF9UeXBlLCAmZXZlbnRzX3F1ZXVlLCAmZXZlbnRzX3RvX3JlcG9ydCkpCisgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiX3NldGV2ZW50cyIsCisgICAgICAgIDEsIDIsCisgICAgICAgICZldmVudHNfcXVldWUsICZldmVudHNfdG9fcmVwb3J0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9lbGVtZW50dHJlZV9YTUxQYXJzZXJfX3NldGV2ZW50c19pbXBsKHNlbGYsIGV2ZW50c19xdWV1ZSwgZXZlbnRzX3RvX3JlcG9ydCk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yNWI4YmY3ZTdmMjE1MWNhIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00OTFlYjU3MThjMWFlNjRiIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19nZGJtbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL19nZGJtbW9kdWxlLmMuaAppbmRleCAyZDg3Y2ZjLi5mZGQ1ODljIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fZ2RibW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX2dkYm1tb2R1bGUuYy5oCkBAIC0yMyw4ICsyMyw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJnZXQiLAogICAgICAgICAxLCAyLAotICAgICAgICAma2V5LCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9nZGJtX2dkYm1fZ2V0X2ltcGwoc2VsZiwga2V5LCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTUzLDggKzU0LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldGRlZmF1bHQiLAogICAgICAgICAxLCAyLAotICAgICAgICAma2V5LCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZrZXksICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9nZGJtX2dkYm1fc2V0ZGVmYXVsdF9pbXBsKHNlbGYsIGtleSwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xNDcsOCArMTQ5LDkgQEAKICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgUHlfc3NpemVfY2xlYW5fdCBrZXlfbGVuZ3RoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzIzpuZXh0a2V5IiwgJmtleSwgJmtleV9sZW5ndGgpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAicyM6bmV4dGtleSIsICZrZXksICZrZXlfbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9nZGJtX2dkYm1fbmV4dGtleV9pbXBsKHNlbGYsIGtleSwga2V5X2xlbmd0aCk7CiAKIGV4aXQ6CkBAIC0yNDIsMTEgKzI0NSwxMiBAQAogICAgIGludCBtb2RlID0gNDM4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzfHNpOm9wZW4iLAotICAgICAgICAmbmFtZSwgJmZsYWdzLCAmbW9kZSkpCisgICAgICAgICZuYW1lLCAmZmxhZ3MsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGRibW9wZW5faW1wbChtb2R1bGUsIG5hbWUsIGZsYWdzLCBtb2RlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTlhYzdhODk4NThhOTc2NWYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVkMGY1ZDRlM2Q3OWI4MGMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX2x6bWFtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX2x6bWFtb2R1bGUuYy5oCmluZGV4IGY4ZDM4ZWEuLjg5OWQ1YzAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19sem1hbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fbHptYW1vZHVsZS5jLmgKQEAgLTI1LDE0ICsyNSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpjb21wcmVzcyIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2x6bWFfTFpNQUNvbXByZXNzb3JfY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtOTQsMTQgKzk2LDE2IEBACiAgICAgUHlfc3NpemVfdCBtYXhfbGVuZ3RoID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ5KnxuOmRlY29tcHJlc3MiLCBfa2V5d29yZHMsCi0gICAgICAgICZkYXRhLCAmbWF4X2xlbmd0aCkpCisgICAgICAgICZkYXRhLCAmbWF4X2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9MWk1BRGVjb21wcmVzc29yX2RlY29tcHJlc3NfaW1wbChzZWxmLCAmZGF0YSwgbWF4X2xlbmd0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTQzLDggKzE0Nyw5IEBACiAgICAgUHlPYmplY3QgKmZpbHRlcnMgPSBQeV9Ob25lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGlPTzpMWk1BRGVjb21wcmVzc29yIiwgX2tleXdvcmRzLAotICAgICAgICAmZm9ybWF0LCAmbWVtbGltaXQsICZmaWx0ZXJzKSkKKyAgICAgICAgJmZvcm1hdCwgJm1lbWxpbWl0LCAmZmlsdGVycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9MWk1BRGVjb21wcmVzc29yX19faW5pdF9fX2ltcGwoKERlY29tcHJlc3NvciAqKXNlbGYsIGZvcm1hdCwgbWVtbGltaXQsIGZpbHRlcnMpOwogCiBleGl0OgpAQCAtMTcxLDggKzE3Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGNoZWNrX2lkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmlzX2NoZWNrX3N1cHBvcnRlZCIsICZjaGVja19pZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmlzX2NoZWNrX3N1cHBvcnRlZCIsICZjaGVja19pZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9pc19jaGVja19zdXBwb3J0ZWRfaW1wbChtb2R1bGUsIGNoZWNrX2lkKTsKIAogZXhpdDoKQEAgLTE5OSw4ICsyMDUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGx6bWFfZmlsdGVyIGZpbHRlciA9IHtMWk1BX1ZMSV9VTktOT1dOLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X2VuY29kZV9maWx0ZXJfcHJvcGVydGllcyIsIGx6bWFfZmlsdGVyX2NvbnZlcnRlciwgJmZpbHRlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpfZW5jb2RlX2ZpbHRlcl9wcm9wZXJ0aWVzIiwgbHptYV9maWx0ZXJfY29udmVydGVyLCAmZmlsdGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9sem1hX19lbmNvZGVfZmlsdGVyX3Byb3BlcnRpZXNfaW1wbChtb2R1bGUsIGZpbHRlcik7CiAKIGV4aXQ6CkBAIC0yMzQsMTUgKzI0MSwxNyBAQAogICAgIFB5X2J1ZmZlciBlbmNvZGVkX3Byb3BzID0ge05VTEwsIE5VTEx9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnkqOl9kZWNvZGVfZmlsdGVyX3Byb3BlcnRpZXMiLAotICAgICAgICBsem1hX3ZsaV9jb252ZXJ0ZXIsICZmaWx0ZXJfaWQsICZlbmNvZGVkX3Byb3BzKSkKKyAgICAgICAgbHptYV92bGlfY29udmVydGVyLCAmZmlsdGVyX2lkLCAmZW5jb2RlZF9wcm9wcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfbHptYV9fZGVjb2RlX2ZpbHRlcl9wcm9wZXJ0aWVzX2ltcGwobW9kdWxlLCBmaWx0ZXJfaWQsICZlbmNvZGVkX3Byb3BzKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBlbmNvZGVkX3Byb3BzICovCi0gICAgaWYgKGVuY29kZWRfcHJvcHMub2JqKQorICAgIGlmIChlbmNvZGVkX3Byb3BzLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmVuY29kZWRfcHJvcHMpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmFkYTA2MDIwZmQzMThjYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjViZjU3YTA4NDVkMTQ3YSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fb3Bjb2RlLmMuaCBiL01vZHVsZXMvY2xpbmljL19vcGNvZGUuYy5oCmluZGV4IGE1ZjY0NDIuLjUxM2NiZmQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL19vcGNvZGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL19vcGNvZGUuYy5oCkBAIC0yMywxNCArMjMsMTYgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXxPOnN0YWNrX2VmZmVjdCIsCi0gICAgICAgICZvcGNvZGUsICZvcGFyZykpCisgICAgICAgICZvcGNvZGUsICZvcGFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX29wY29kZV9zdGFja19lZmZlY3RfaW1wbChtb2R1bGUsIG9wY29kZSwgb3BhcmcpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05ODRkNmRlMTQwMzAzZDEwIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00ZDkxYzZhNzY1MDk3ODUzIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL19waWNrbGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3BpY2tsZS5jLmgKaW5kZXggYmQxMmQyYS4uMDUyODYxNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3BpY2tsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvX3BpY2tsZS5jLmgKQEAgLTUzLDggKzUzLDkgQEAKICAgICBQeV9zc2l6ZV90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX3BpY2tsZV9QaWNrbGVyX19fc2l6ZW9mX19faW1wbChzZWxmKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtOTgsOCArOTksOSBAQAogICAgIGludCBmaXhfaW1wb3J0cyA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfE9wOlBpY2tsZXIiLCBfa2V5d29yZHMsCi0gICAgICAgICZmaWxlLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpCisgICAgICAgICZmaWxlLCAmcHJvdG9jb2wsICZmaXhfaW1wb3J0cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfcGlja2xlX1BpY2tsZXJfX19pbml0X19faW1wbCgoUGlja2xlck9iamVjdCAqKXNlbGYsIGZpbGUsIHByb3RvY29sLCBmaXhfaW1wb3J0cyk7CiAKIGV4aXQ6CkBAIC0yMTIsOCArMjE0LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImZpbmRfY2xhc3MiLAogICAgICAgICAyLCAyLAotICAgICAgICAmbW9kdWxlX25hbWUsICZnbG9iYWxfbmFtZSkpCisgICAgICAgICZtb2R1bGVfbmFtZSwgJmdsb2JhbF9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX2ZpbmRfY2xhc3NfaW1wbChzZWxmLCBtb2R1bGVfbmFtZSwgZ2xvYmFsX25hbWUpOwogCiBleGl0OgpAQCAtMjM5LDggKzI0Miw5IEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF9waWNrbGVfVW5waWNrbGVyX19fc2l6ZW9mX19faW1wbChzZWxmKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjg4LDggKzI5Miw5IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gInN0cmljdCI7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfCRwc3M6VW5waWNrbGVyIiwgX2tleXdvcmRzLAotICAgICAgICAmZmlsZSwgJmZpeF9pbXBvcnRzLCAmZW5jb2RpbmcsICZlcnJvcnMpKQorICAgICAgICAmZmlsZSwgJmZpeF9pbXBvcnRzLCAmZW5jb2RpbmcsICZlcnJvcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3BpY2tsZV9VbnBpY2tsZXJfX19pbml0X19faW1wbCgoVW5waWNrbGVyT2JqZWN0ICopc2VsZiwgZmlsZSwgZml4X2ltcG9ydHMsIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtMzk0LDggKzM5OSw5IEBACiAgICAgaW50IGZpeF9pbXBvcnRzID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PfE8kcDpkdW1wIiwgX2tleXdvcmRzLAotICAgICAgICAmb2JqLCAmZmlsZSwgJnByb3RvY29sLCAmZml4X2ltcG9ydHMpKQorICAgICAgICAmb2JqLCAmZmlsZSwgJnByb3RvY29sLCAmZml4X2ltcG9ydHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3BpY2tsZV9kdW1wX2ltcGwobW9kdWxlLCBvYmosIGZpbGUsIHByb3RvY29sLCBmaXhfaW1wb3J0cyk7CiAKIGV4aXQ6CkBAIC00MzcsOCArNDQzLDkgQEAKICAgICBpbnQgZml4X2ltcG9ydHMgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xPJHA6ZHVtcHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZvYmosICZwcm90b2NvbCwgJmZpeF9pbXBvcnRzKSkKKyAgICAgICAgJm9iaiwgJnByb3RvY29sLCAmZml4X2ltcG9ydHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3BpY2tsZV9kdW1wc19pbXBsKG1vZHVsZSwgb2JqLCBwcm90b2NvbCwgZml4X2ltcG9ydHMpOwogCiBleGl0OgpAQCAtNDkyLDggKzQ5OSw5IEBACiAgICAgY29uc3QgY2hhciAqZXJyb3JzID0gInN0cmljdCI7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfCRwc3M6bG9hZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZpbGUsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICAgICAgJmZpbGUsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfbG9hZF9pbXBsKG1vZHVsZSwgZmlsZSwgZml4X2ltcG9ydHMsIGVuY29kaW5nLCBlcnJvcnMpOwogCiBleGl0OgpAQCAtNTM4LDExICs1NDYsMTIgQEAKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSAic3RyaWN0IjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98JHBzczpsb2FkcyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmRhdGEsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkKKyAgICAgICAgJmRhdGEsICZmaXhfaW1wb3J0cywgJmVuY29kaW5nLCAmZXJyb3JzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9waWNrbGVfbG9hZHNfaW1wbChtb2R1bGUsIGRhdGEsIGZpeF9pbXBvcnRzLCBlbmNvZGluZywgZXJyb3JzKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTkzNjU3ZTU1ZDZhNzQ4YWYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVjNWY5MTQ5ZGYyOTJjZTQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3NyZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fc3JlLmMuaAppbmRleCAzMjgxNzE3Li4yYThiMjIwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fc3JlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fc3JlLmMuaApAQCAtMjAsOCArMjAsOSBAQAogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF9zcmVfZ2V0Y29kZXNpemVfaW1wbChtb2R1bGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00OCwxMSArNDksMTMgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6Z2V0bG93ZXIiLAotICAgICAgICAmY2hhcmFjdGVyLCAmZmxhZ3MpKQorICAgICAgICAmY2hhcmFjdGVyLCAmZmxhZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF9zcmVfZ2V0bG93ZXJfaW1wbChtb2R1bGUsIGNoYXJhY3RlciwgZmxhZ3MpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC04NCw4ICs4Nyw5IEBACiAgICAgUHlPYmplY3QgKnBhdHRlcm4gPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9ubiRPOm1hdGNoIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmcGF0dGVybikpCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MsICZwYXR0ZXJuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX1BhdHRlcm5fbWF0Y2hfaW1wbChzZWxmLCBzdHJpbmcsIHBvcywgZW5kcG9zLCBwYXR0ZXJuKTsKIAogZXhpdDoKQEAgLTExOCw4ICsxMjIsOSBAQAogICAgIFB5T2JqZWN0ICpwYXR0ZXJuID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbm4kTzpmdWxsbWF0Y2giLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MsICZwYXR0ZXJuKSkKKyAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcywgJnBhdHRlcm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9mdWxsbWF0Y2hfaW1wbChzZWxmLCBzdHJpbmcsIHBvcywgZW5kcG9zLCBwYXR0ZXJuKTsKIAogZXhpdDoKQEAgLTE1NCw4ICsxNTksOSBAQAogICAgIFB5T2JqZWN0ICpwYXR0ZXJuID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbm4kTzpzZWFyY2giLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MsICZwYXR0ZXJuKSkKKyAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcywgJnBhdHRlcm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9zZWFyY2hfaW1wbChzZWxmLCBzdHJpbmcsIHBvcywgZW5kcG9zLCBwYXR0ZXJuKTsKIAogZXhpdDoKQEAgLTE4OCw4ICsxOTQsOSBAQAogICAgIFB5T2JqZWN0ICpzb3VyY2UgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9ubiRPOmZpbmRhbGwiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MsICZzb3VyY2UpKQorICAgICAgICAmc3RyaW5nLCAmcG9zLCAmZW5kcG9zLCAmc291cmNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX1BhdHRlcm5fZmluZGFsbF9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MsIHNvdXJjZSk7CiAKIGV4aXQ6CkBAIC0yMjEsOCArMjI4LDkgQEAKICAgICBQeV9zc2l6ZV90IGVuZHBvcyA9IFBZX1NTSVpFX1RfTUFYOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT3xubjpmaW5kaXRlciIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcykpCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9maW5kaXRlcl9pbXBsKHNlbGYsIHN0cmluZywgcG9zLCBlbmRwb3MpOwogCiBleGl0OgpAQCAtMjUxLDggKzI1OSw5IEBACiAgICAgUHlfc3NpemVfdCBlbmRwb3MgPSBQWV9TU0laRV9UX01BWDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98bm46c2Nhbm5lciIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZywgJnBvcywgJmVuZHBvcykpCisgICAgICAgICZzdHJpbmcsICZwb3MsICZlbmRwb3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9zY2FubmVyX2ltcGwoc2VsZiwgc3RyaW5nLCBwb3MsIGVuZHBvcyk7CiAKIGV4aXQ6CkBAIC0yODIsOCArMjkxLDkgQEAKICAgICBQeU9iamVjdCAqc291cmNlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPbiRPOnNwbGl0IiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nLCAmbWF4c3BsaXQsICZzb3VyY2UpKQorICAgICAgICAmc3RyaW5nLCAmbWF4c3BsaXQsICZzb3VyY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfUGF0dGVybl9zcGxpdF9pbXBsKHNlbGYsIHN0cmluZywgbWF4c3BsaXQsIHNvdXJjZSk7CiAKIGV4aXQ6CkBAIC0zMTMsOCArMzIzLDkgQEAKICAgICBQeV9zc2l6ZV90IGNvdW50ID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk9PfG46c3ViIiwgX2tleXdvcmRzLAotICAgICAgICAmcmVwbCwgJnN0cmluZywgJmNvdW50KSkKKyAgICAgICAgJnJlcGwsICZzdHJpbmcsICZjb3VudCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX3N1Yl9pbXBsKHNlbGYsIHJlcGwsIHN0cmluZywgY291bnQpOwogCiBleGl0OgpAQCAtMzQ0LDggKzM1NSw5IEBACiAgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT3xuOnN1Ym4iLCBfa2V5d29yZHMsCi0gICAgICAgICZyZXBsLCAmc3RyaW5nLCAmY291bnQpKQorICAgICAgICAmcmVwbCwgJnN0cmluZywgJmNvdW50KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zcmVfU1JFX1BhdHRlcm5fc3Vibl9pbXBsKHNlbGYsIHJlcGwsIHN0cmluZywgY291bnQpOwogCiBleGl0OgpAQCAtMzg4LDggKzQwMCw5IEBACiAgICAgUHlPYmplY3QgKm1lbW87CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPOl9fZGVlcGNvcHlfXyIsIF9rZXl3b3JkcywKLSAgICAgICAgJm1lbW8pKQorICAgICAgICAmbWVtbykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9QYXR0ZXJuX19fZGVlcGNvcHlfX19pbXBsKHNlbGYsIG1lbW8pOwogCiBleGl0OgpAQCAtNDIzLDggKzQzNiw5IEBACiAgICAgUHlPYmplY3QgKmluZGV4Z3JvdXA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPaU8hbk9POmNvbXBpbGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZwYXR0ZXJuLCAmZmxhZ3MsICZQeUxpc3RfVHlwZSwgJmNvZGUsICZncm91cHMsICZncm91cGluZGV4LCAmaW5kZXhncm91cCkpCisgICAgICAgICZwYXR0ZXJuLCAmZmxhZ3MsICZQeUxpc3RfVHlwZSwgJmNvZGUsICZncm91cHMsICZncm91cGluZGV4LCAmaW5kZXhncm91cCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX2NvbXBpbGVfaW1wbChtb2R1bGUsIHBhdHRlcm4sIGZsYWdzLCBjb2RlLCBncm91cHMsIGdyb3VwaW5kZXgsIGluZGV4Z3JvdXApOwogCiBleGl0OgpAQCAtNDUxLDggKzQ2NSw5IEBACiAgICAgUHlPYmplY3QgKnRlbXBsYXRlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpleHBhbmQiLCBfa2V5d29yZHMsCi0gICAgICAgICZ0ZW1wbGF0ZSkpCisgICAgICAgICZ0ZW1wbGF0ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9leHBhbmRfaW1wbChzZWxmLCB0ZW1wbGF0ZSk7CiAKIGV4aXQ6CkBAIC00ODIsOCArNDk3LDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8Tzpncm91cHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfTWF0Y2hfZ3JvdXBzX2ltcGwoc2VsZiwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01MTMsOCArNTI5LDkgQEAKICAgICBQeU9iamVjdCAqZGVmYXVsdF92YWx1ZSA9IFB5X05vbmU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8Tzpncm91cGRpY3QiLCBfa2V5d29yZHMsCi0gICAgICAgICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NyZV9TUkVfTWF0Y2hfZ3JvdXBkaWN0X2ltcGwoc2VsZiwgZGVmYXVsdF92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01NDIsMTEgKzU1OSwxMyBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3RhcnQiLAogICAgICAgICAwLCAxLAotICAgICAgICAmZ3JvdXApKQorICAgICAgICAmZ3JvdXApKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF9zcmVfU1JFX01hdGNoX3N0YXJ0X2ltcGwoc2VsZiwgZ3JvdXApOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01NzQsMTEgKzU5MywxMyBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZW5kIiwKICAgICAgICAgMCwgMSwKLSAgICAgICAgJmdyb3VwKSkKKyAgICAgICAgJmdyb3VwKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9lbmRfaW1wbChzZWxmLCBncm91cCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTYwNSw4ICs2MjYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3BhbiIsCiAgICAgICAgIDAsIDEsCi0gICAgICAgICZncm91cCkpCisgICAgICAgICZncm91cCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9zcGFuX2ltcGwoc2VsZiwgZ3JvdXApOwogCiBleGl0OgpAQCAtNjQ5LDggKzY3MSw5IEBACiAgICAgUHlPYmplY3QgKm1lbW87CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPOl9fZGVlcGNvcHlfXyIsIF9rZXl3b3JkcywKLSAgICAgICAgJm1lbW8pKQorICAgICAgICAmbWVtbykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3JlX1NSRV9NYXRjaF9fX2RlZXBjb3B5X19faW1wbChzZWxmLCBtZW1vKTsKIAogZXhpdDoKQEAgLTY5MCw0ICs3MTMsNCBAQAogewogICAgIHJldHVybiBfc3JlX1NSRV9TY2FubmVyX3NlYXJjaF9pbXBsKHNlbGYpOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE0Y2U5ZTViNzQ4Y2U1MzIgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWFmOTQ1NWNiNTRiMmE5MDcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3NzbC5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fc3NsLmMuaAppbmRleCA4NTJlMzY1Li5mZDE4NGQ1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fc3NsLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fc3NsLmMuaApAQCAtMzYsOCArMzYsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpwYXRoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpfdGVzdF9kZWNvZGVfY2VydCIsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X3Rlc3RfZGVjb2RlX2NlcnQiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX3Rlc3RfZGVjb2RlX2NlcnRfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtNzEsOCArNzIsOSBAQAogICAgIGludCBiaW5hcnlfbW9kZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxwOnBlZXJfY2VydGlmaWNhdGUiLAotICAgICAgICAmYmluYXJ5X21vZGUpKQorICAgICAgICAmYmluYXJ5X21vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMU29ja2V0X3BlZXJfY2VydGlmaWNhdGVfaW1wbChzZWxmLCBiaW5hcnlfbW9kZSk7CiAKIGV4aXQ6CkBAIC0yMDksMTQgKzIxMSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBiID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZiKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOndyaXRlIiwgJmIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMU29ja2V0X3dyaXRlX2ltcGwoc2VsZiwgJmIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGIgKi8KLSAgICBpZiAoYi5vYmopCisgICAgaWYgKGIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI2MCwxMiArMjY0LDE0IEBACiAKICAgICBzd2l0Y2ggKFB5VHVwbGVfR0VUX1NJWkUoYXJncykpIHsKICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnJlYWQiLCAmbGVuKSkKKyAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpyZWFkIiwgJmxlbikpIHsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpdyo6cmVhZCIsICZsZW4sICZidWZmZXIpKQorICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpdyo6cmVhZCIsICZsZW4sICZidWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgZ3JvdXBfcmlnaHRfMSA9IDE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTI3Niw4ICsyODIsOSBAQAogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGJ1ZmZlciAqLwotICAgIGlmIChidWZmZXIub2JqKQorICAgIGlmIChidWZmZXIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnVmZmVyKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzMyLDExICszMzksMTMgQEAKICAgICBpbnQgcHJvdG9fdmVyc2lvbjsKIAogICAgIGlmICgodHlwZSA9PSAmUHlTU0xDb250ZXh0X1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiX1NTTENvbnRleHQiLCBrd2FyZ3MpKQorICAgICAgICAhX1B5QXJnX05vS2V5d29yZHMoIl9TU0xDb250ZXh0Iiwga3dhcmdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTpfU1NMQ29udGV4dCIsCi0gICAgICAgICZwcm90b192ZXJzaW9uKSkKKyAgICAgICAgJnByb3RvX3ZlcnNpb24pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9pbXBsKHR5cGUsIHByb3RvX3ZlcnNpb24pOwogCiBleGl0OgpAQCAtMzYwLDggKzM2OSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqY2lwaGVybGlzdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpzZXRfY2lwaGVycyIsICZjaXBoZXJsaXN0KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6c2V0X2NpcGhlcnMiLCAmY2lwaGVybGlzdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X3NldF9jaXBoZXJzX2ltcGwoc2VsZiwgY2lwaGVybGlzdCk7CiAKIGV4aXQ6CkBAIC0zODYsMTQgKzM5NiwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBwcm90b3MgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOl9zZXRfbnBuX3Byb3RvY29scyIsICZwcm90b3MpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6X3NldF9ucG5fcHJvdG9jb2xzIiwgJnByb3RvcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X19zZXRfbnBuX3Byb3RvY29sc19pbXBsKHNlbGYsICZwcm90b3MpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIHByb3RvcyAqLwotICAgIGlmIChwcm90b3Mub2JqKQorICAgIGlmIChwcm90b3Mub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcHJvdG9zKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDE2LDE0ICs0MjgsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgcHJvdG9zID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpfc2V0X2FscG5fcHJvdG9jb2xzIiwgJnByb3RvcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjpfc2V0X2FscG5fcHJvdG9jb2xzIiwgJnByb3RvcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX19TU0xDb250ZXh0X19zZXRfYWxwbl9wcm90b2NvbHNfaW1wbChzZWxmLCAmcHJvdG9zKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBwcm90b3MgKi8KLSAgICBpZiAocHJvdG9zLm9iaikKKyAgICBpZiAocHJvdG9zLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnByb3Rvcyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ1MCw4ICs0NjQsOSBAQAogICAgIFB5T2JqZWN0ICpwYXNzd29yZCA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPfE9POmxvYWRfY2VydF9jaGFpbiIsIF9rZXl3b3JkcywKLSAgICAgICAgJmNlcnRmaWxlLCAma2V5ZmlsZSwgJnBhc3N3b3JkKSkKKyAgICAgICAgJmNlcnRmaWxlLCAma2V5ZmlsZSwgJnBhc3N3b3JkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfbG9hZF9jZXJ0X2NoYWluX2ltcGwoc2VsZiwgY2VydGZpbGUsIGtleWZpbGUsIHBhc3N3b3JkKTsKIAogZXhpdDoKQEAgLTQ4Miw4ICs0OTcsOSBAQAogICAgIFB5T2JqZWN0ICpjYWRhdGEgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE9PTzpsb2FkX3ZlcmlmeV9sb2NhdGlvbnMiLCBfa2V5d29yZHMsCi0gICAgICAgICZjYWZpbGUsICZjYXBhdGgsICZjYWRhdGEpKQorICAgICAgICAmY2FmaWxlLCAmY2FwYXRoLCAmY2FkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfbG9hZF92ZXJpZnlfbG9jYXRpb25zX2ltcGwoc2VsZiwgY2FmaWxlLCBjYXBhdGgsIGNhZGF0YSk7CiAKIGV4aXQ6CkBAIC01MjAsOCArNTM2LDkgQEAKICAgICBQeU9iamVjdCAqaG9zdG5hbWVfb2JqID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8haXxPOl93cmFwX3NvY2tldCIsIF9rZXl3b3JkcywKLSAgICAgICAgUHlTb2NrZXRNb2R1bGUuU29ja19UeXBlLCAmc29jaywgJnNlcnZlcl9zaWRlLCAmaG9zdG5hbWVfb2JqKSkKKyAgICAgICAgUHlTb2NrZXRNb2R1bGUuU29ja19UeXBlLCAmc29jaywgJnNlcnZlcl9zaWRlLCAmaG9zdG5hbWVfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfX3dyYXBfc29ja2V0X2ltcGwoc2VsZiwgc29jaywgc2VydmVyX3NpZGUsIGhvc3RuYW1lX29iaik7CiAKIGV4aXQ6CkBAIC01NTMsOCArNTcwLDkgQEAKICAgICBQeU9iamVjdCAqaG9zdG5hbWVfb2JqID0gUHlfTm9uZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8hTyFpfE86X3dyYXBfYmlvIiwgX2tleXdvcmRzLAotICAgICAgICAmUHlTU0xNZW1vcnlCSU9fVHlwZSwgJmluY29taW5nLCAmUHlTU0xNZW1vcnlCSU9fVHlwZSwgJm91dGdvaW5nLCAmc2VydmVyX3NpZGUsICZob3N0bmFtZV9vYmopKQorICAgICAgICAmUHlTU0xNZW1vcnlCSU9fVHlwZSwgJmluY29taW5nLCAmUHlTU0xNZW1vcnlCSU9fVHlwZSwgJm91dGdvaW5nLCAmc2VydmVyX3NpZGUsICZob3N0bmFtZV9vYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9fU1NMQ29udGV4dF9fd3JhcF9iaW9faW1wbChzZWxmLCBpbmNvbWluZywgb3V0Z29pbmcsIHNlcnZlcl9zaWRlLCBob3N0bmFtZV9vYmopOwogCiBleGl0OgpAQCAtNjcwLDggKzY4OCw5IEBACiAgICAgaW50IGJpbmFyeV9mb3JtID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxwOmdldF9jYV9jZXJ0cyIsIF9rZXl3b3JkcywKLSAgICAgICAgJmJpbmFyeV9mb3JtKSkKKyAgICAgICAgJmJpbmFyeV9mb3JtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfX1NTTENvbnRleHRfZ2V0X2NhX2NlcnRzX2ltcGwoc2VsZiwgYmluYXJ5X2Zvcm0pOwogCiBleGl0OgpAQCAtNjg3LDExICs3MDYsMTMgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICgodHlwZSA9PSAmUHlTU0xNZW1vcnlCSU9fVHlwZSkgJiYKLSAgICAgICAgIV9QeUFyZ19Ob1Bvc2l0aW9uYWwoIk1lbW9yeUJJTyIsIGFyZ3MpKQorICAgICAgICAhX1B5QXJnX05vUG9zaXRpb25hbCgiTWVtb3J5QklPIiwgYXJncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBpZiAoKHR5cGUgPT0gJlB5U1NMTWVtb3J5QklPX1R5cGUpICYmCi0gICAgICAgICFfUHlBcmdfTm9LZXl3b3JkcygiTWVtb3J5QklPIiwga3dhcmdzKSkKKyAgICAgICAgIV9QeUFyZ19Ob0tleXdvcmRzKCJNZW1vcnlCSU8iLCBrd2FyZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9NZW1vcnlCSU9faW1wbCh0eXBlKTsKIAogZXhpdDoKQEAgLTcyMiw4ICs3NDMsOSBAQAogICAgIGludCBsZW4gPSAtMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6cmVhZCIsCi0gICAgICAgICZsZW4pKQorICAgICAgICAmbGVuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfTWVtb3J5QklPX3JlYWRfaW1wbChzZWxmLCBsZW4pOwogCiBleGl0OgpAQCAtNzUwLDE0ICs3NzIsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYiA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6d3JpdGUiLCAmYikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5Kjp3cml0ZSIsICZiKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfTWVtb3J5QklPX3dyaXRlX2ltcGwoc2VsZiwgJmIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGIgKi8KLSAgICBpZiAoYi5vYmopCisgICAgaWYgKGIub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTgwNSwxNCArODI5LDE2IEBACiAgICAgZG91YmxlIGVudHJvcHk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMqZDpSQU5EX2FkZCIsCi0gICAgICAgICZ2aWV3LCAmZW50cm9weSkpCisgICAgICAgICZ2aWV3LCAmZW50cm9weSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX1JBTkRfYWRkX2ltcGwobW9kdWxlLCAmdmlldywgZW50cm9weSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgdmlldyAqLwotICAgIGlmICh2aWV3Lm9iaikKKyAgICBpZiAodmlldy5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODM1LDggKzg2MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG47CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6UkFORF9ieXRlcyIsICZuKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6UkFORF9ieXRlcyIsICZuKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfUkFORF9ieXRlc19pbXBsKG1vZHVsZSwgbik7CiAKIGV4aXQ6CkBAIC04NjQsOCArODkxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgbjsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpSQU5EX3BzZXVkb19ieXRlcyIsICZuKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6UkFORF9wc2V1ZG9fYnl0ZXMiLCAmbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX1JBTkRfcHNldWRvX2J5dGVzX2ltcGwobW9kdWxlLCBuKTsKIAogZXhpdDoKQEAgLTkxNiw4ICs5NDQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpwYXRoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpSQU5EX2VnZCIsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UkFORF9lZ2QiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfUkFORF9lZ2RfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtOTcwLDggKzk5OSw5IEBACiAgICAgaW50IG5hbWUgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3xwOnR4dDJvYmoiLCBfa2V5d29yZHMsCi0gICAgICAgICZ0eHQsICZuYW1lKSkKKyAgICAgICAgJnR4dCwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF90eHQyb2JqX2ltcGwobW9kdWxlLCB0eHQsIG5hbWUpOwogCiBleGl0OgpAQCAtOTk2LDggKzEwMjYsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBuaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6bmlkMm9iaiIsICZuaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpuaWQyb2JqIiwgJm5pZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc3NsX25pZDJvYmpfaW1wbChtb2R1bGUsIG5pZCk7CiAKIGV4aXQ6CkBAIC0xMDMyLDggKzEwNjMsOSBAQAogICAgIGNvbnN0IGNoYXIgKnN0b3JlX25hbWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzOmVudW1fY2VydGlmaWNhdGVzIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RvcmVfbmFtZSkpCisgICAgICAgICZzdG9yZV9uYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9zc2xfZW51bV9jZXJ0aWZpY2F0ZXNfaW1wbChtb2R1bGUsIHN0b3JlX25hbWUpOwogCiBleGl0OgpAQCAtMTA2OSw4ICsxMTAxLDkgQEAKICAgICBjb25zdCBjaGFyICpzdG9yZV9uYW1lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiczplbnVtX2NybHMiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdG9yZV9uYW1lKSkKKyAgICAgICAgJnN0b3JlX25hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NzbF9lbnVtX2NybHNfaW1wbChtb2R1bGUsIHN0b3JlX25hbWUpOwogCiBleGl0OgpAQCAtMTEwMiw0ICsxMTM1LDQgQEAKICNpZm5kZWYgX1NTTF9FTlVNX0NSTFNfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfU1NMX0VOVU1fQ1JMU19NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfU1NMX0VOVU1fQ1JMU19NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmZiMTA1OTRkODM1MWRjNSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MDI0NDQ3MzJjMTk3MjJiMyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9fdGtpbnRlci5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fdGtpbnRlci5jLmgKaW5kZXggNzdhZjA4My4uZWRkNTM4MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvX3RraW50ZXIuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL190a2ludGVyLmMuaApAQCAtMTksOCArMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKnNjcmlwdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpldmFsIiwgJnNjcmlwdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV2YWwiLCAmc2NyaXB0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V2YWxfaW1wbChzZWxmLCBzY3JpcHQpOwogCiBleGl0OgpAQCAtNDQsOCArNDUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV2YWxmaWxlIiwgJmZpbGVOYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6ZXZhbGZpbGUiLCAmZmlsZU5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfZXZhbGZpbGVfaW1wbChzZWxmLCBmaWxlTmFtZSk7CiAKIGV4aXQ6CkBAIC02OSw4ICs3MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqc2NyaXB0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOnJlY29yZCIsICZzY3JpcHQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpyZWNvcmQiLCAmc2NyaXB0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX3JlY29yZF9pbXBsKHNlbGYsIHNjcmlwdCk7CiAKIGV4aXQ6CkBAIC05NCw4ICs5Nyw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqbXNnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmFkZGVycmluZm8iLCAmbXNnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInM6YWRkZXJyaW5mbyIsICZtc2cpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfYWRkZXJyaW5mb19pbXBsKHNlbGYsIG1zZyk7CiAKIGV4aXQ6CkBAIC0xNDMsOCArMTQ3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJzdHJpbmciLCAmcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJzdHJpbmciLCAmcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9leHByc3RyaW5nX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0xNjgsOCArMTczLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJsb25nIiwgJnMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHBybG9uZyIsICZzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V4cHJsb25nX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0xOTMsOCArMTk5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJkb3VibGUiLCAmcykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJkb3VibGUiLCAmcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9leHByZG91YmxlX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0yMTgsOCArMjI1LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmV4cHJib29sZWFuIiwgJnMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiczpleHByYm9vbGVhbiIsICZzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2V4cHJib29sZWFuX2ltcGwoc2VsZiwgcyk7CiAKIGV4aXQ6CkBAIC0yNjIsOCArMjcwLDkgQEAKICAgICBQeU9iamVjdCAqZnVuYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic086Y3JlYXRlY29tbWFuZCIsCi0gICAgICAgICZuYW1lLCAmZnVuYykpCisgICAgICAgICZuYW1lLCAmZnVuYykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9jcmVhdGVjb21tYW5kX2ltcGwoc2VsZiwgbmFtZSwgZnVuYyk7CiAKIGV4aXQ6CkBAIC0yODcsOCArMjk2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmRlbGV0ZWNvbW1hbmQiLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOmRlbGV0ZWNvbW1hbmQiLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9kZWxldGVjb21tYW5kX2ltcGwoc2VsZiwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0zMTgsOCArMzI4LDkgQEAKICAgICBQeU9iamVjdCAqZnVuYzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2lPOmNyZWF0ZWZpbGVoYW5kbGVyIiwKLSAgICAgICAgJmZpbGUsICZtYXNrLCAmZnVuYykpCisgICAgICAgICZmaWxlLCAmbWFzaywgJmZ1bmMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfdGthcHBfY3JlYXRlZmlsZWhhbmRsZXJfaW1wbChzZWxmLCBmaWxlLCBtYXNrLCBmdW5jKTsKIAogZXhpdDoKQEAgLTM3Nyw4ICszODgsOSBAQAogICAgIFB5T2JqZWN0ICpmdW5jOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpjcmVhdGV0aW1lcmhhbmRsZXIiLAotICAgICAgICAmbWlsbGlzZWNvbmRzLCAmZnVuYykpCisgICAgICAgICZtaWxsaXNlY29uZHMsICZmdW5jKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2NyZWF0ZXRpbWVyaGFuZGxlcl9pbXBsKHNlbGYsIG1pbGxpc2Vjb25kcywgZnVuYyk7CiAKIGV4aXQ6CkBAIC00MDMsOCArNDE1LDkgQEAKICAgICBpbnQgdGhyZXNob2xkID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6bWFpbmxvb3AiLAotICAgICAgICAmdGhyZXNob2xkKSkKKyAgICAgICAgJnRocmVzaG9sZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl90a2FwcF9tYWlubG9vcF9pbXBsKHNlbGYsIHRocmVzaG9sZCk7CiAKIGV4aXQ6CkBAIC00MjksOCArNDQyLDkgQEAKICAgICBpbnQgZmxhZ3MgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpkb29uZWV2ZW50IiwKLSAgICAgICAgJmZsYWdzKSkKKyAgICAgICAgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX3RrYXBwX2Rvb25lZXZlbnRfaW1wbChzZWxmLCBmbGFncyk7CiAKIGV4aXQ6CkBAIC01NTEsOCArNTY1LDkgQEAKICAgICBjb25zdCBjaGFyICp1c2UgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8enNzaWlpaXo6Y3JlYXRlIiwKLSAgICAgICAgJnNjcmVlbk5hbWUsICZiYXNlTmFtZSwgJmNsYXNzTmFtZSwgJmludGVyYWN0aXZlLCAmd2FudG9iamVjdHMsICZ3YW50VGssICZzeW5jLCAmdXNlKSkKKyAgICAgICAgJnNjcmVlbk5hbWUsICZiYXNlTmFtZSwgJmNsYXNzTmFtZSwgJmludGVyYWN0aXZlLCAmd2FudG9iamVjdHMsICZ3YW50VGssICZzeW5jLCAmdXNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF90a2ludGVyX2NyZWF0ZV9pbXBsKG1vZHVsZSwgc2NyZWVuTmFtZSwgYmFzZU5hbWUsIGNsYXNzTmFtZSwgaW50ZXJhY3RpdmUsIHdhbnRvYmplY3RzLCB3YW50VGssIHN5bmMsIHVzZSk7CiAKIGV4aXQ6CkBAIC01NzksOCArNTk0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgbmV3X3ZhbDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzZXRidXN5d2FpdGludGVydmFsIiwgJm5ld192YWwpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzZXRidXN5d2FpdGludGVydmFsIiwgJm5ld192YWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3RraW50ZXJfc2V0YnVzeXdhaXRpbnRlcnZhbF9pbXBsKG1vZHVsZSwgbmV3X3ZhbCk7CiAKIGV4aXQ6CkBAIC02MDYsOCArNjIyLDkgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfdGtpbnRlcl9nZXRidXN5d2FpdGludGVydmFsX2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNjIxLDQgKzYzOCw0IEBACiAjaWZuZGVmIF9US0lOVEVSX1RLQVBQX0RFTEVURUZJTEVIQU5ETEVSX01FVEhPRERFRgogICAgICNkZWZpbmUgX1RLSU5URVJfVEtBUFBfREVMRVRFRklMRUhBTkRMRVJfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoX1RLSU5URVJfVEtBUFBfREVMRVRFRklMRUhBTkRMRVJfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWY5MDU3YzhiZjI4ODYzM2QgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTgzNmM1NzhiNzFkNjkwOTcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3dlYWtyZWYuYy5oIGIvTW9kdWxlcy9jbGluaWMvX3dlYWtyZWYuYy5oCmluZGV4IGI4M2IzM2UuLmMxOTJlNzIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL193ZWFrcmVmLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fd2Vha3JlZi5jLmgKQEAgLTIxLDExICsyMSwxMiBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2Vha3JlZl9nZXR3ZWFrcmVmY291bnRfaW1wbChtb2R1bGUsIG9iamVjdCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tU3NpemVfdChfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ5MDg2Yzg1NzZkNDY5MzMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWUxYWQ1ODcxNDczMjNlMTkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvX3dpbmFwaS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaAppbmRleCBhYzM4ZDM3Li5lMGM3ZDZjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9fd2luYXBpLmMuaApAQCAtMTksOCArMTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB3YWl0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJwOkdldE92ZXJsYXBwZWRSZXN1bHQiLCAmd2FpdCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJwOkdldE92ZXJsYXBwZWRSZXN1bHQiLCAmd2FpdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX092ZXJsYXBwZWRfR2V0T3ZlcmxhcHBlZFJlc3VsdF9pbXBsKHNlbGYsIHdhaXQpOwogCiBleGl0OgpAQCAtNzksOCArODAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIEhBTkRMRSBoYW5kbGU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgRl9IQU5ETEUgIjpDbG9zZUhhbmRsZSIsICZoYW5kbGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBGX0hBTkRMRSAiOkNsb3NlSGFuZGxlIiwgJmhhbmRsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0Nsb3NlSGFuZGxlX2ltcGwobW9kdWxlLCBoYW5kbGUpOwogCiBleGl0OgpAQCAtMTA4LDggKzExMCw5IEBACiAgICAgaW50IHVzZV9vdmVybGFwcGVkID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIiIgRl9IQU5ETEUgInxpOkNvbm5lY3ROYW1lZFBpcGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZoYW5kbGUsICZ1c2Vfb3ZlcmxhcHBlZCkpCisgICAgICAgICZoYW5kbGUsICZ1c2Vfb3ZlcmxhcHBlZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0Nvbm5lY3ROYW1lZFBpcGVfaW1wbChtb2R1bGUsIGhhbmRsZSwgdXNlX292ZXJsYXBwZWQpOwogCiBleGl0OgpAQCAtMTQ3LDEzICsxNTAsMTYgQEAKICAgICBIQU5ETEUgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2trIiBGX1BPSU5URVIgImtrIiBGX0hBTkRMRSAiOkNyZWF0ZUZpbGUiLAotICAgICAgICAmZmlsZV9uYW1lLCAmZGVzaXJlZF9hY2Nlc3MsICZzaGFyZV9tb2RlLCAmc2VjdXJpdHlfYXR0cmlidXRlcywgJmNyZWF0aW9uX2Rpc3Bvc2l0aW9uLCAmZmxhZ3NfYW5kX2F0dHJpYnV0ZXMsICZ0ZW1wbGF0ZV9maWxlKSkKKyAgICAgICAgJmZpbGVfbmFtZSwgJmRlc2lyZWRfYWNjZXNzLCAmc2hhcmVfbW9kZSwgJnNlY3VyaXR5X2F0dHJpYnV0ZXMsICZjcmVhdGlvbl9kaXNwb3NpdGlvbiwgJmZsYWdzX2FuZF9hdHRyaWJ1dGVzLCAmdGVtcGxhdGVfZmlsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9DcmVhdGVGaWxlX2ltcGwobW9kdWxlLCBmaWxlX25hbWUsIGRlc2lyZWRfYWNjZXNzLCBzaGFyZV9tb2RlLCBzZWN1cml0eV9hdHRyaWJ1dGVzLCBjcmVhdGlvbl9kaXNwb3NpdGlvbiwgZmxhZ3NfYW5kX2F0dHJpYnV0ZXMsIHRlbXBsYXRlX2ZpbGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgfQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgUHlfUkVUVVJOX05PTkU7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IEhBTkRMRV9UT19QWU5VTShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTE4MCw4ICsxODYsOSBAQAogICAgIExQV1NUUiBkc3RfcGF0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidXU6Q3JlYXRlSnVuY3Rpb24iLAotICAgICAgICAmc3JjX3BhdGgsICZkc3RfcGF0aCkpCisgICAgICAgICZzcmNfcGF0aCwgJmRzdF9wYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfQ3JlYXRlSnVuY3Rpb25faW1wbChtb2R1bGUsIHNyY19wYXRoLCBkc3RfcGF0aCk7CiAKIGV4aXQ6CkBAIC0yMjAsMTMgKzIyNywxNiBAQAogICAgIEhBTkRMRSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJza2tra2trIiBGX1BPSU5URVIgIjpDcmVhdGVOYW1lZFBpcGUiLAotICAgICAgICAmbmFtZSwgJm9wZW5fbW9kZSwgJnBpcGVfbW9kZSwgJm1heF9pbnN0YW5jZXMsICZvdXRfYnVmZmVyX3NpemUsICZpbl9idWZmZXJfc2l6ZSwgJmRlZmF1bHRfdGltZW91dCwgJnNlY3VyaXR5X2F0dHJpYnV0ZXMpKQorICAgICAgICAmbmFtZSwgJm9wZW5fbW9kZSwgJnBpcGVfbW9kZSwgJm1heF9pbnN0YW5jZXMsICZvdXRfYnVmZmVyX3NpemUsICZpbl9idWZmZXJfc2l6ZSwgJmRlZmF1bHRfdGltZW91dCwgJnNlY3VyaXR5X2F0dHJpYnV0ZXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfQ3JlYXRlTmFtZWRQaXBlX2ltcGwobW9kdWxlLCBuYW1lLCBvcGVuX21vZGUsIHBpcGVfbW9kZSwgbWF4X2luc3RhbmNlcywgb3V0X2J1ZmZlcl9zaXplLCBpbl9idWZmZXJfc2l6ZSwgZGVmYXVsdF90aW1lb3V0LCBzZWN1cml0eV9hdHRyaWJ1dGVzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0yNTgsOCArMjY4LDkgQEAKICAgICBEV09SRCBzaXplOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPazpDcmVhdGVQaXBlIiwKLSAgICAgICAgJnBpcGVfYXR0cnMsICZzaXplKSkKKyAgICAgICAgJnBpcGVfYXR0cnMsICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfQ3JlYXRlUGlwZV9pbXBsKG1vZHVsZSwgcGlwZV9hdHRycywgc2l6ZSk7CiAKIGV4aXQ6CkBAIC0zMDgsOCArMzE5LDkgQEAKICAgICBQeU9iamVjdCAqc3RhcnR1cF9pbmZvOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJaWk9PaWtPWk86Q3JlYXRlUHJvY2VzcyIsCi0gICAgICAgICZhcHBsaWNhdGlvbl9uYW1lLCAmY29tbWFuZF9saW5lLCAmcHJvY19hdHRycywgJnRocmVhZF9hdHRycywgJmluaGVyaXRfaGFuZGxlcywgJmNyZWF0aW9uX2ZsYWdzLCAmZW52X21hcHBpbmcsICZjdXJyZW50X2RpcmVjdG9yeSwgJnN0YXJ0dXBfaW5mbykpCisgICAgICAgICZhcHBsaWNhdGlvbl9uYW1lLCAmY29tbWFuZF9saW5lLCAmcHJvY19hdHRycywgJnRocmVhZF9hdHRycywgJmluaGVyaXRfaGFuZGxlcywgJmNyZWF0aW9uX2ZsYWdzLCAmZW52X21hcHBpbmcsICZjdXJyZW50X2RpcmVjdG9yeSwgJnN0YXJ0dXBfaW5mbykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0NyZWF0ZVByb2Nlc3NfaW1wbChtb2R1bGUsIGFwcGxpY2F0aW9uX25hbWUsIGNvbW1hbmRfbGluZSwgcHJvY19hdHRycywgdGhyZWFkX2F0dHJzLCBpbmhlcml0X2hhbmRsZXMsIGNyZWF0aW9uX2ZsYWdzLCBlbnZfbWFwcGluZywgY3VycmVudF9kaXJlY3RvcnksIHN0YXJ0dXBfaW5mbyk7CiAKIGV4aXQ6CkBAIC0zNTEsMTMgKzM2MywxNiBAQAogICAgIEhBTkRMRSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIEZfSEFORExFICIiIEZfSEFORExFICIiIEZfSEFORExFICJraXxrOkR1cGxpY2F0ZUhhbmRsZSIsCi0gICAgICAgICZzb3VyY2VfcHJvY2Vzc19oYW5kbGUsICZzb3VyY2VfaGFuZGxlLCAmdGFyZ2V0X3Byb2Nlc3NfaGFuZGxlLCAmZGVzaXJlZF9hY2Nlc3MsICZpbmhlcml0X2hhbmRsZSwgJm9wdGlvbnMpKQorICAgICAgICAmc291cmNlX3Byb2Nlc3NfaGFuZGxlLCAmc291cmNlX2hhbmRsZSwgJnRhcmdldF9wcm9jZXNzX2hhbmRsZSwgJmRlc2lyZWRfYWNjZXNzLCAmaW5oZXJpdF9oYW5kbGUsICZvcHRpb25zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0R1cGxpY2F0ZUhhbmRsZV9pbXBsKG1vZHVsZSwgc291cmNlX3Byb2Nlc3NfaGFuZGxlLCBzb3VyY2VfaGFuZGxlLCB0YXJnZXRfcHJvY2Vzc19oYW5kbGUsIGRlc2lyZWRfYWNjZXNzLCBpbmhlcml0X2hhbmRsZSwgb3B0aW9ucyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICB9CisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gSEFORExFX1RPX1BZTlVNKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzgxLDggKzM5Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgVUlOVCBFeGl0Q29kZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiSTpFeGl0UHJvY2VzcyIsICZFeGl0Q29kZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJJOkV4aXRQcm9jZXNzIiwgJkV4aXRDb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfRXhpdFByb2Nlc3NfaW1wbChtb2R1bGUsIEV4aXRDb2RlKTsKIAogZXhpdDoKQEAgLTQwOCwxMCArNDI0LDEyIEBACiAgICAgSEFORExFIF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9HZXRDdXJyZW50UHJvY2Vzc19pbXBsKG1vZHVsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICB9CisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gSEFORExFX1RPX1BZTlVNKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDM3LDExICs0NTUsMTMgQEAKICAgICBIQU5ETEUgcHJvY2VzczsKICAgICBEV09SRCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIEZfSEFORExFICI6R2V0RXhpdENvZGVQcm9jZXNzIiwgJnByb2Nlc3MpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBGX0hBTkRMRSAiOkdldEV4aXRDb2RlUHJvY2VzcyIsICZwcm9jZXNzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0dldEV4aXRDb2RlUHJvY2Vzc19pbXBsKG1vZHVsZSwgcHJvY2Vzcyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IERXT1JEX01BWCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gRFdPUkRfTUFYKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlfQnVpbGRWYWx1ZSgiayIsIF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDY2LDggKzQ4Niw5IEBACiAgICAgRFdPUkQgX3JldHVybl92YWx1ZTsKIAogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0dldExhc3RFcnJvcl9pbXBsKG1vZHVsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IERXT1JEX01BWCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gRFdPUkRfTUFYKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlfQnVpbGRWYWx1ZSgiayIsIF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDk5LDggKzUyMCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgSE1PRFVMRSBtb2R1bGVfaGFuZGxlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIEZfSEFORExFICI6R2V0TW9kdWxlRmlsZU5hbWUiLCAmbW9kdWxlX2hhbmRsZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIEZfSEFORExFICI6R2V0TW9kdWxlRmlsZU5hbWUiLCAmbW9kdWxlX2hhbmRsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX0dldE1vZHVsZUZpbGVOYW1lX2ltcGwobW9kdWxlLCBtb2R1bGVfaGFuZGxlKTsKIAogZXhpdDoKQEAgLTUzMSwxMyArNTUzLDE2IEBACiAgICAgRFdPUkQgc3RkX2hhbmRsZTsKICAgICBIQU5ETEUgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiazpHZXRTdGRIYW5kbGUiLCAmc3RkX2hhbmRsZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJrOkdldFN0ZEhhbmRsZSIsICZzdGRfaGFuZGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBfd2luYXBpX0dldFN0ZEhhbmRsZV9pbXBsKG1vZHVsZSwgc3RkX2hhbmRsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICB9CisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBQeV9SRVRVUk5fTk9ORTsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gSEFORExFX1RPX1BZTlVNKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNTYzLDggKzU4OCw5IEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfR2V0VmVyc2lvbl9pbXBsKG1vZHVsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTU5MywxMyArNjE5LDE2IEBACiAgICAgSEFORExFIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImtpazpPcGVuUHJvY2VzcyIsCi0gICAgICAgICZkZXNpcmVkX2FjY2VzcywgJmluaGVyaXRfaGFuZGxlLCAmcHJvY2Vzc19pZCkpCisgICAgICAgICZkZXNpcmVkX2FjY2VzcywgJmluaGVyaXRfaGFuZGxlLCAmcHJvY2Vzc19pZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9PcGVuUHJvY2Vzc19pbXBsKG1vZHVsZSwgZGVzaXJlZF9hY2Nlc3MsIGluaGVyaXRfaGFuZGxlLCBwcm9jZXNzX2lkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIH0KKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5X1JFVFVSTl9OT05FOworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBIQU5ETEVfVE9fUFlOVU0oX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC02MjUsOCArNjU0LDkgQEAKICAgICBpbnQgc2l6ZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgRl9IQU5ETEUgInxpOlBlZWtOYW1lZFBpcGUiLAotICAgICAgICAmaGFuZGxlLCAmc2l6ZSkpCisgICAgICAgICZoYW5kbGUsICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfUGVla05hbWVkUGlwZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCBzaXplKTsKIAogZXhpdDoKQEAgLTY1NSw4ICs2ODUsOSBAQAogICAgIGludCB1c2Vfb3ZlcmxhcHBlZCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICIiIEZfSEFORExFICJpfGk6UmVhZEZpbGUiLCBfa2V5d29yZHMsCi0gICAgICAgICZoYW5kbGUsICZzaXplLCAmdXNlX292ZXJsYXBwZWQpKQorICAgICAgICAmaGFuZGxlLCAmc2l6ZSwgJnVzZV9vdmVybGFwcGVkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfUmVhZEZpbGVfaW1wbChtb2R1bGUsIGhhbmRsZSwgc2l6ZSwgdXNlX292ZXJsYXBwZWQpOwogCiBleGl0OgpAQCAtNjg4LDggKzcxOSw5IEBACiAgICAgUHlPYmplY3QgKmNvbGxlY3RfZGF0YV90aW1lb3V0OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIEZfSEFORExFICJPT086U2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUiLAotICAgICAgICAmbmFtZWRfcGlwZSwgJm1vZGUsICZtYXhfY29sbGVjdGlvbl9jb3VudCwgJmNvbGxlY3RfZGF0YV90aW1lb3V0KSkKKyAgICAgICAgJm5hbWVkX3BpcGUsICZtb2RlLCAmbWF4X2NvbGxlY3Rpb25fY291bnQsICZjb2xsZWN0X2RhdGFfdGltZW91dCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1NldE5hbWVkUGlwZUhhbmRsZVN0YXRlX2ltcGwobW9kdWxlLCBuYW1lZF9waXBlLCBtb2RlLCBtYXhfY29sbGVjdGlvbl9jb3VudCwgY29sbGVjdF9kYXRhX3RpbWVvdXQpOwogCiBleGl0OgpAQCAtNzE3LDggKzc0OSw5IEBACiAgICAgVUlOVCBleGl0X2NvZGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgRl9IQU5ETEUgIkk6VGVybWluYXRlUHJvY2VzcyIsCi0gICAgICAgICZoYW5kbGUsICZleGl0X2NvZGUpKQorICAgICAgICAmaGFuZGxlLCAmZXhpdF9jb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF93aW5hcGlfVGVybWluYXRlUHJvY2Vzc19pbXBsKG1vZHVsZSwgaGFuZGxlLCBleGl0X2NvZGUpOwogCiBleGl0OgpAQCAtNzQ0LDggKzc3Nyw5IEBACiAgICAgRFdPUkQgdGltZW91dDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic2s6V2FpdE5hbWVkUGlwZSIsCi0gICAgICAgICZuYW1lLCAmdGltZW91dCkpCisgICAgICAgICZuYW1lLCAmdGltZW91dCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfd2luYXBpX1dhaXROYW1lZFBpcGVfaW1wbChtb2R1bGUsIG5hbWUsIHRpbWVvdXQpOwogCiBleGl0OgpAQCAtNzc0LDggKzgwOCw5IEBACiAgICAgRFdPUkQgbWlsbGlzZWNvbmRzID0gSU5GSU5JVEU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pfGs6V2FpdEZvck11bHRpcGxlT2JqZWN0cyIsCi0gICAgICAgICZoYW5kbGVfc2VxLCAmd2FpdF9mbGFnLCAmbWlsbGlzZWNvbmRzKSkKKyAgICAgICAgJmhhbmRsZV9zZXEsICZ3YWl0X2ZsYWcsICZtaWxsaXNlY29uZHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9XYWl0Rm9yTXVsdGlwbGVPYmplY3RzX2ltcGwobW9kdWxlLCBoYW5kbGVfc2VxLCB3YWl0X2ZsYWcsIG1pbGxpc2Vjb25kcyk7CiAKIGV4aXQ6CkBAIC04MDgsMTEgKzg0MywxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBGX0hBTkRMRSAiazpXYWl0Rm9yU2luZ2xlT2JqZWN0IiwKLSAgICAgICAgJmhhbmRsZSwgJm1pbGxpc2Vjb25kcykpCisgICAgICAgICZoYW5kbGUsICZtaWxsaXNlY29uZHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IF93aW5hcGlfV2FpdEZvclNpbmdsZU9iamVjdF9pbXBsKG1vZHVsZSwgaGFuZGxlLCBtaWxsaXNlY29uZHMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC04NDEsMTEgKzg3OCwxMiBAQAogICAgIGludCB1c2Vfb3ZlcmxhcHBlZCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICIiIEZfSEFORExFICJPfGk6V3JpdGVGaWxlIiwgX2tleXdvcmRzLAotICAgICAgICAmaGFuZGxlLCAmYnVmZmVyLCAmdXNlX292ZXJsYXBwZWQpKQorICAgICAgICAmaGFuZGxlLCAmYnVmZmVyLCAmdXNlX292ZXJsYXBwZWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3dpbmFwaV9Xcml0ZUZpbGVfaW1wbChtb2R1bGUsIGhhbmRsZSwgYnVmZmVyLCB1c2Vfb3ZlcmxhcHBlZCk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1hNGM0YjJhOWZjYjBiZWExIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04MDMyZjMzNzFjMTQ3NDllIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL2FycmF5bW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL2FycmF5bW9kdWxlLmMuaAppbmRleCAwYzcwNjFhLi4zYjlmY2RhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9hcnJheW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvYXJyYXltb2R1bGUuYy5oCkBAIC03Nyw4ICs3Nyw5IEBACiAgICAgUHlfc3NpemVfdCBpID0gLTE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxuOnBvcCIsCi0gICAgICAgICZpKSkKKyAgICAgICAgJmkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXJyYXlfYXJyYXlfcG9wX2ltcGwoc2VsZiwgaSk7CiAKIGV4aXQ6CkBAIC0xMTQsOCArMTE1LDkgQEAKICAgICBQeU9iamVjdCAqdjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibk86aW5zZXJ0IiwKLSAgICAgICAgJmksICZ2KSkKKyAgICAgICAgJmksICZ2KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGFycmF5X2FycmF5X2luc2VydF9pbXBsKHNlbGYsIGksIHYpOwogCiBleGl0OgpAQCAtMjExLDggKzIxMyw5IEBACiAgICAgUHlfc3NpemVfdCBuOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPbjpmcm9tZmlsZSIsCi0gICAgICAgICZmLCAmbikpCisgICAgICAgICZmLCAmbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9hcnJheV9mcm9tZmlsZV9pbXBsKHNlbGYsIGYsIG4pOwogCiBleGl0OgpAQCAtMjc1LDE0ICsyNzgsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgYnVmZmVyID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzKjpmcm9tc3RyaW5nIiwgJmJ1ZmZlcikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzKjpmcm9tc3RyaW5nIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9hcnJheV9mcm9tc3RyaW5nX2ltcGwoc2VsZiwgJmJ1ZmZlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMDUsMTQgKzMxMCwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBidWZmZXIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmZyb21ieXRlcyIsICZidWZmZXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6ZnJvbWJ5dGVzIiwgJmJ1ZmZlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9hcnJheV9mcm9tYnl0ZXNfaW1wbChzZWxmLCAmYnVmZmVyKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBidWZmZXIgKi8KLSAgICBpZiAoYnVmZmVyLm9iaikKKyAgICBpZiAoYnVmZmVyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmJ1ZmZlcik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM3OSw4ICszODYsOSBAQAogICAgIFB5X1VOSUNPREUgKnVzdHI7CiAgICAgUHlfc3NpemVfY2xlYW5fdCB1c3RyX2xlbmd0aDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidSM6ZnJvbXVuaWNvZGUiLCAmdXN0ciwgJnVzdHJfbGVuZ3RoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInUjOmZyb211bmljb2RlIiwgJnVzdHIsICZ1c3RyX2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhcnJheV9hcnJheV9mcm9tdW5pY29kZV9pbXBsKHNlbGYsIHVzdHIsIHVzdHJfbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTQ1Myw4ICs0NjEsOSBAQAogICAgIFB5T2JqZWN0ICppdGVtczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT0NpTzpfYXJyYXlfcmVjb25zdHJ1Y3RvciIsCi0gICAgICAgICZhcnJheXR5cGUsICZ0eXBlY29kZSwgJm1mb3JtYXRfY29kZSwgJml0ZW1zKSkKKyAgICAgICAgJmFycmF5dHlwZSwgJnR5cGVjb2RlLCAmbWZvcm1hdF9jb2RlLCAmaXRlbXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXJyYXlfX2FycmF5X3JlY29uc3RydWN0b3JfaW1wbChtb2R1bGUsIGFycmF5dHlwZSwgdHlwZWNvZGUsIG1mb3JtYXRfY29kZSwgaXRlbXMpOwogCiBleGl0OgpAQCAtNDk2LDQgKzUwNSw0IEBACiAKICNkZWZpbmUgQVJSQVlfQVJSQVlJVEVSQVRPUl9fX1NFVFNUQVRFX19fTUVUSE9EREVGICAgIFwKICAgICB7Il9fc2V0c3RhdGVfXyIsIChQeUNGdW5jdGlvbilhcnJheV9hcnJheWl0ZXJhdG9yX19fc2V0c3RhdGVfXywgTUVUSF9PLCBhcnJheV9hcnJheWl0ZXJhdG9yX19fc2V0c3RhdGVfX19fZG9jX199LAotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTMwNWRmM2Y1Nzk2MDM5ZTQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWIyMDU0ZmI3NjRjOGNjNjQgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvYXVkaW9vcC5jLmggYi9Nb2R1bGVzL2NsaW5pYy9hdWRpb29wLmMuaAppbmRleCA2MmUzMTNiNS4uYmU0YjcxOCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvYXVkaW9vcC5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvYXVkaW9vcC5jLmgKQEAgLTI0LDE0ICsyNCwxNiBAQAogICAgIFB5X3NzaXplX3QgaW5kZXg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaW46Z2V0c2FtcGxlIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZpbmRleCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmaW5kZXgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9nZXRzYW1wbGVfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIGluZGV4KTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTYsMTQgKzU4LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6bWF4IiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX21heF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTg4LDE0ICs5MiwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOm1pbm1heCIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9taW5tYXhfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xMjAsMTQgKzEyNiwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOmF2ZyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9hdmdfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xNTIsMTQgKzE2MCwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOnJtcyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9ybXNfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0xODUsMTcgKzE5NSwyMCBAQAogICAgIFB5X2J1ZmZlciByZWZlcmVuY2UgPSB7TlVMTCwgTlVMTH07CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqeSo6ZmluZGZpdCIsCi0gICAgICAgICZmcmFnbWVudCwgJnJlZmVyZW5jZSkpCisgICAgICAgICZmcmFnbWVudCwgJnJlZmVyZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2ZpbmRmaXRfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgJnJlZmVyZW5jZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogICAgIC8qIENsZWFudXAgZm9yIHJlZmVyZW5jZSAqLwotICAgIGlmIChyZWZlcmVuY2Uub2JqKQorICAgIGlmIChyZWZlcmVuY2Uub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmVmZXJlbmNlKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjIxLDE3ICsyMzQsMjAgQEAKICAgICBQeV9idWZmZXIgcmVmZXJlbmNlID0ge05VTEwsIE5VTEx9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnkqOmZpbmRmYWN0b3IiLAotICAgICAgICAmZnJhZ21lbnQsICZyZWZlcmVuY2UpKQorICAgICAgICAmZnJhZ21lbnQsICZyZWZlcmVuY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9maW5kZmFjdG9yX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsICZyZWZlcmVuY2UpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciByZWZlcmVuY2UgKi8KLSAgICBpZiAocmVmZXJlbmNlLm9iaikKKyAgICBpZiAocmVmZXJlbmNlLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJlZmVyZW5jZSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI1NywxNCArMjczLDE2IEBACiAgICAgUHlfc3NpemVfdCBsZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqbjpmaW5kbWF4IiwKLSAgICAgICAgJmZyYWdtZW50LCAmbGVuZ3RoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfZmluZG1heF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCBsZW5ndGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODksMTQgKzMwNywxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOmF2Z3BwIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2F2Z3BwX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzIxLDE0ICszNDEsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTptYXhwcCIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9tYXhwcF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTM1MywxNCArMzc1LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6Y3Jvc3MiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfY3Jvc3NfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zODcsMTQgKzQxMSwxNiBAQAogICAgIGRvdWJsZSBmYWN0b3I7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaWQ6bXVsIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZmYWN0b3IpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmZhY3RvcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX211bF9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCwgZmFjdG9yKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNDIyLDE0ICs0NDgsMTYgQEAKICAgICBkb3VibGUgcmZhY3RvcjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppZGQ6dG9tb25vIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZsZmFjdG9yLCAmcmZhY3RvcikpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbGZhY3RvciwgJnJmYWN0b3IpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF90b21vbm9faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIGxmYWN0b3IsIHJmYWN0b3IpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00NTcsMTQgKzQ4NSwxNiBAQAogICAgIGRvdWJsZSByZmFjdG9yOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KmlkZDp0b3N0ZXJlbyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbGZhY3RvciwgJnJmYWN0b3IpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJmxmYWN0b3IsICZyZmFjdG9yKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfdG9zdGVyZW9faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIGxmYWN0b3IsIHJmYWN0b3IpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00OTEsMTcgKzUyMSwyMCBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSp5Kmk6YWRkIiwKLSAgICAgICAgJmZyYWdtZW50MSwgJmZyYWdtZW50MiwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50MSwgJmZyYWdtZW50MiwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYWRkX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQxLCAmZnJhZ21lbnQyLCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQxICovCi0gICAgaWYgKGZyYWdtZW50MS5vYmopCisgICAgaWYgKGZyYWdtZW50MS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudDEpOworICAgIH0KICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudDIgKi8KLSAgICBpZiAoZnJhZ21lbnQyLm9iaikKKyAgICBpZiAoZnJhZ21lbnQyLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50Mik7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTUyNywxNCArNTYwLDE2IEBACiAgICAgaW50IGJpYXM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaWk6YmlhcyIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmYmlhcykpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmYmlhcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2JpYXNfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIGJpYXMpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC01NTksMTQgKzU5NCwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOnJldmVyc2UiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfcmV2ZXJzZV9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTU5MSwxNCArNjI4LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6Ynl0ZXN3YXAiLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfYnl0ZXN3YXBfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC02MjUsMTQgKzY2NCwxNiBAQAogICAgIGludCBuZXd3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppaTpsaW4ybGluIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZuZXd3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbmV3d2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9saW4ybGluX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoLCBuZXd3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTY2NiwxNCArNzA3LDE2IEBACiAgICAgaW50IHdlaWdodEIgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KmlpaWlPfGlpOnJhdGVjdiIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmbmNoYW5uZWxzLCAmaW5yYXRlLCAmb3V0cmF0ZSwgJnN0YXRlLCAmd2VpZ2h0QSwgJndlaWdodEIpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCwgJm5jaGFubmVscywgJmlucmF0ZSwgJm91dHJhdGUsICZzdGF0ZSwgJndlaWdodEEsICZ3ZWlnaHRCKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfcmF0ZWN2X2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoLCBuY2hhbm5lbHMsIGlucmF0ZSwgb3V0cmF0ZSwgc3RhdGUsIHdlaWdodEEsIHdlaWdodEIpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC02OTgsMTQgKzc0MSwxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOmxpbjJ1bGF3IiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2xpbjJ1bGF3X2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNzMwLDE0ICs3NzUsMTYgQEAKICAgICBpbnQgd2lkdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaTp1bGF3MmxpbiIsCi0gICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkKKyAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF91bGF3Mmxpbl9pbXBsKG1vZHVsZSwgJmZyYWdtZW50LCB3aWR0aCk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZnJhZ21lbnQgKi8KLSAgICBpZiAoZnJhZ21lbnQub2JqKQorICAgIGlmIChmcmFnbWVudC5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZmcmFnbWVudCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTc2MiwxNCArODA5LDE2IEBACiAgICAgaW50IHdpZHRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5Kmk6bGluMmFsYXciLAotICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGF1ZGlvb3BfbGluMmFsYXdfaW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGZyYWdtZW50ICovCi0gICAgaWYgKGZyYWdtZW50Lm9iaikKKyAgICBpZiAoZnJhZ21lbnQub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZnJhZ21lbnQpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC03OTQsMTQgKzg0MywxNiBAQAogICAgIGludCB3aWR0aDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSppOmFsYXcybGluIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgpKQorICAgICAgICAmZnJhZ21lbnQsICZ3aWR0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBhdWRpb29wX2FsYXcybGluX2ltcGwobW9kdWxlLCAmZnJhZ21lbnQsIHdpZHRoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODI4LDE0ICs4NzksMTYgQEAKICAgICBQeU9iamVjdCAqc3RhdGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaU86bGluMmFkcGNtIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZzdGF0ZSkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmc3RhdGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9saW4yYWRwY21faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIHN0YXRlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODYyLDE1ICs5MTUsMTcgQEAKICAgICBQeU9iamVjdCAqc3RhdGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqaU86YWRwY20ybGluIiwKLSAgICAgICAgJmZyYWdtZW50LCAmd2lkdGgsICZzdGF0ZSkpCisgICAgICAgICZmcmFnbWVudCwgJndpZHRoLCAmc3RhdGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYXVkaW9vcF9hZHBjbTJsaW5faW1wbChtb2R1bGUsICZmcmFnbWVudCwgd2lkdGgsIHN0YXRlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBmcmFnbWVudCAqLwotICAgIGlmIChmcmFnbWVudC5vYmopCisgICAgaWYgKGZyYWdtZW50Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmZyYWdtZW50KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTM4NWZiMDlmYTIxYTYyYzAgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWUwYWI3NGMzZmE1N2MzOWMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvYmluYXNjaWkuYy5oIGIvTW9kdWxlcy9jbGluaWMvYmluYXNjaWkuYy5oCmluZGV4IGUyMGNhYzIuLjY4YzM0ZjkgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2JpbmFzY2lpLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9iaW5hc2NpaS5jLmgKQEAgLTIwLDggKzIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YTJiX3V1IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YTJiX3V1IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYTJiX3V1X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CkBAIC01MCwxNCArNTEsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX3V1IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX3V1IiwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX3V1X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtODAsOCArODMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfYmFzZTY0IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6YTJiX2Jhc2U2NCIsIGFzY2lpX2J1ZmZlcl9jb252ZXJ0ZXIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2EyYl9iYXNlNjRfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKQEAgLTkzLDMxICs5NywzNiBAQAogfQogCiBQeURvY19TVFJWQVIoYmluYXNjaWlfYjJhX2Jhc2U2NF9fZG9jX18sCi0iYjJhX2Jhc2U2NCgkbW9kdWxlLCBkYXRhLCAvKVxuIgorImIyYV9iYXNlNjQoJG1vZHVsZSwgLywgZGF0YSwgKiwgbmV3bGluZT1UcnVlKVxuIgogIi0tXG4iCiAiXG4iCiAiQmFzZTY0LWNvZGUgbGluZSBvZiBkYXRhLiIpOwogCiAjZGVmaW5lIEJJTkFTQ0lJX0IyQV9CQVNFNjRfTUVUSE9EREVGICAgIFwKLSAgICB7ImIyYV9iYXNlNjQiLCAoUHlDRnVuY3Rpb24pYmluYXNjaWlfYjJhX2Jhc2U2NCwgTUVUSF9PLCBiaW5hc2NpaV9iMmFfYmFzZTY0X19kb2NfX30sCisgICAgeyJiMmFfYmFzZTY0IiwgKFB5Q0Z1bmN0aW9uKWJpbmFzY2lpX2IyYV9iYXNlNjQsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLCBiaW5hc2NpaV9iMmFfYmFzZTY0X19kb2NfX30sCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1iaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhKTsKK2JpbmFzY2lpX2IyYV9iYXNlNjRfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeV9idWZmZXIgKmRhdGEsIGludCBuZXdsaW5lKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKLWJpbmFzY2lpX2IyYV9iYXNlNjQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZykKK2JpbmFzY2lpX2IyYV9iYXNlNjQoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJkYXRhIiwgIm5ld2xpbmUiLCBOVUxMfTsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKKyAgICBpbnQgbmV3bGluZSA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmIyYV9iYXNlNjQiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAieSp8JGk6YjJhX2Jhc2U2NCIsIF9rZXl3b3JkcywKKyAgICAgICAgJmRhdGEsICZuZXdsaW5lKSkgewogICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX2Jhc2U2NF9pbXBsKG1vZHVsZSwgJmRhdGEpOworICAgIH0KKyAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfYmFzZTY0X2ltcGwobW9kdWxlLCAmZGF0YSwgbmV3bGluZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTQwLDggKzE0OSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmEyYl9ocXgiLCBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfaHF4IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYTJiX2hxeF9pbXBsKG1vZHVsZSwgJmRhdGEpOwogCiBleGl0OgpAQCAtMTcwLDE0ICsxODAsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cmxlY29kZV9ocXgiLCAmZGF0YSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpybGVjb2RlX2hxeCIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX3JsZWNvZGVfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjAwLDE0ICsyMTIsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX2hxeCIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmIyYV9ocXgiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9iMmFfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjMwLDE0ICsyNDQsMTYgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgZGF0YSA9IHtOVUxMLCBOVUxMfTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6cmxlZGVjb2RlX2hxeCIsICZkYXRhKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOnJsZWRlY29kZV9ocXgiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9ybGVkZWNvZGVfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMjYzLDE3ICsyNzksMjAgQEAKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAieSpJOmNyY19ocXgiLAotICAgICAgICAmZGF0YSwgJmNyYykpCisgICAgICAgICZkYXRhLCAmY3JjKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9jcmNfaHF4X2ltcGwobW9kdWxlLCAmZGF0YSwgY3JjKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI5OSwxNyArMzE4LDIwIEBACiAgICAgdW5zaWduZWQgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfEk6Y3JjMzIiLAotICAgICAgICAmZGF0YSwgJmNyYykpCisgICAgICAgICZkYXRhLCAmY3JjKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9jcmMzMl9pbXBsKG1vZHVsZSwgJmRhdGEsIGNyYyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09ICh1bnNpZ25lZCBpbnQpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09ICh1bnNpZ25lZCBpbnQpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygodW5zaWduZWQgbG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zMzUsMTQgKzM1NywxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpiMmFfaGV4IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6YjJhX2hleCIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2IyYV9oZXhfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zNjcsMTQgKzM5MSwxNiBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBkYXRhID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJ5KjpoZXhsaWZ5IiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6aGV4bGlmeSIsICZkYXRhKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJpbmFzY2lpX2hleGxpZnlfaW1wbChtb2R1bGUsICZkYXRhKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MDAsOCArNDI2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9idWZmZXIgaGV4c3RyID0ge05VTEwsIE5VTEx9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfaGV4IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmhleHN0cikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjphMmJfaGV4IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmhleHN0cikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfaGV4X2ltcGwobW9kdWxlLCAmaGV4c3RyKTsKIAogZXhpdDoKQEAgLTQzMiw4ICs0NTksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2J1ZmZlciBoZXhzdHIgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnVuaGV4bGlmeSIsIGFzY2lpX2J1ZmZlcl9jb252ZXJ0ZXIsICZoZXhzdHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6dW5oZXhsaWZ5IiwgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmhleHN0cikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV91bmhleGxpZnlfaW1wbChtb2R1bGUsICZoZXhzdHIpOwogCiBleGl0OgpAQCAtNDY1LDggKzQ5Myw5IEBACiAgICAgaW50IGhlYWRlciA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxpOmEyYl9xcCIsIF9rZXl3b3JkcywKLSAgICAgICAgYXNjaWlfYnVmZmVyX2NvbnZlcnRlciwgJmRhdGEsICZoZWFkZXIpKQorICAgICAgICBhc2NpaV9idWZmZXJfY29udmVydGVyLCAmZGF0YSwgJmhlYWRlcikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBiaW5hc2NpaV9hMmJfcXBfaW1wbChtb2R1bGUsICZkYXRhLCBoZWFkZXIpOwogCiBleGl0OgpAQCAtNTA1LDE1ICs1MzQsMTcgQEAKICAgICBpbnQgaGVhZGVyID0gMDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfGlpaTpiMmFfcXAiLCBfa2V5d29yZHMsCi0gICAgICAgICZkYXRhLCAmcXVvdGV0YWJzLCAmaXN0ZXh0LCAmaGVhZGVyKSkKKyAgICAgICAgJmRhdGEsICZxdW90ZXRhYnMsICZpc3RleHQsICZoZWFkZXIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYmluYXNjaWlfYjJhX3FwX2ltcGwobW9kdWxlLCAmZGF0YSwgcXVvdGV0YWJzLCBpc3RleHQsIGhlYWRlcik7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUxMTczZmM5NzE4YTVlZGMgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ5MWQxMDU4ZGMwNTkwZTEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvY21hdGhtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvY21hdGhtb2R1bGUuYy5oCmluZGV4IGEyNTUzNTMuLmNiYTAzNWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2NtYXRobW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9jbWF0aG1vZHVsZS5jLmgKQEAgLTIxLDggKzIxLDkgQEAKICAgICBQeV9jb21wbGV4IHo7CiAgICAgUHlfY29tcGxleCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFjb3MiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmFjb3MiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYWNvc19pbXBsKG1vZHVsZSwgeik7CkBAIC02Miw4ICs2Myw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphY29zaCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YWNvc2giLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYWNvc2hfaW1wbChtb2R1bGUsIHopOwpAQCAtMTAzLDggKzEwNSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphc2luIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphc2luIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2FzaW5faW1wbChtb2R1bGUsIHopOwpAQCAtMTQ0LDggKzE0Nyw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphc2luaCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YXNpbmgiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYXNpbmhfaW1wbChtb2R1bGUsIHopOwpAQCAtMTg1LDggKzE4OSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphdGFuIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphdGFuIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2F0YW5faW1wbChtb2R1bGUsIHopOwpAQCAtMjI2LDggKzIzMSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDphdGFuaCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6YXRhbmgiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfYXRhbmhfaW1wbChtb2R1bGUsIHopOwpAQCAtMjY3LDggKzI3Myw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpjb3MiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmNvcyIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9jb3NfaW1wbChtb2R1bGUsIHopOwpAQCAtMzA4LDggKzMxNSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpjb3NoIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpjb3NoIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX2Nvc2hfaW1wbChtb2R1bGUsIHopOwpAQCAtMzQ5LDggKzM1Nyw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpleHAiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmV4cCIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9leHBfaW1wbChtb2R1bGUsIHopOwpAQCAtMzkwLDggKzM5OSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpsb2cxMCIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6bG9nMTAiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICAvKiBtb2RpZmljYXRpb25zIGZvciB6ICovCiAgICAgZXJybm8gPSAwOyBQeUZQRV9TVEFSVF9QUk9URUNUKCJjb21wbGV4IGZ1bmN0aW9uIiwgZ290byBleGl0KTsKICAgICBfcmV0dXJuX3ZhbHVlID0gY21hdGhfbG9nMTBfaW1wbChtb2R1bGUsIHopOwpAQCAtNDMxLDggKzQ0MSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzaW4iLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnNpbiIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9zaW5faW1wbChtb2R1bGUsIHopOwpAQCAtNDcyLDggKzQ4Myw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzaW5oIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzaW5oIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3NpbmhfaW1wbChtb2R1bGUsIHopOwpAQCAtNTEzLDggKzUyNSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzcXJ0IiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpzcXJ0IiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3NxcnRfaW1wbChtb2R1bGUsIHopOwpAQCAtNTU0LDggKzU2Nyw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDp0YW4iLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnRhbiIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIC8qIG1vZGlmaWNhdGlvbnMgZm9yIHogKi8KICAgICBlcnJubyA9IDA7IFB5RlBFX1NUQVJUX1BST1RFQ1QoImNvbXBsZXggZnVuY3Rpb24iLCBnb3RvIGV4aXQpOwogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF90YW5faW1wbChtb2R1bGUsIHopOwpAQCAtNTk1LDggKzYwOSw5IEBACiAgICAgUHlfY29tcGxleCB6OwogICAgIFB5X2NvbXBsZXggX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDp0YW5oIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDp0YW5oIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgLyogbW9kaWZpY2F0aW9ucyBmb3IgeiAqLwogICAgIGVycm5vID0gMDsgUHlGUEVfU1RBUlRfUFJPVEVDVCgiY29tcGxleCBmdW5jdGlvbiIsIGdvdG8gZXhpdCk7CiAgICAgX3JldHVybl92YWx1ZSA9IGNtYXRoX3RhbmhfaW1wbChtb2R1bGUsIHopOwpAQCAtNjM5LDggKzY1NCw5IEBACiAgICAgUHlPYmplY3QgKnlfb2JqID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiRHxPOmxvZyIsCi0gICAgICAgICZ4LCAmeV9vYmopKQorICAgICAgICAmeCwgJnlfb2JqKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX2xvZ19pbXBsKG1vZHVsZSwgeCwgeV9vYmopOwogCiBleGl0OgpAQCAtNjY1LDggKzY4MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfY29tcGxleCB6OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOnBoYXNlIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpwaGFzZSIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX3BoYXNlX2ltcGwobW9kdWxlLCB6KTsKIAogZXhpdDoKQEAgLTY5Myw4ICs3MTAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2NvbXBsZXggejsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDpwb2xhciIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6cG9sYXIiLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjbWF0aF9wb2xhcl9pbXBsKG1vZHVsZSwgeik7CiAKIGV4aXQ6CkBAIC03MjEsOCArNzM5LDkgQEAKICAgICBkb3VibGUgcGhpOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJkZDpyZWN0IiwKLSAgICAgICAgJnIsICZwaGkpKQorICAgICAgICAmciwgJnBoaSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjbWF0aF9yZWN0X2ltcGwobW9kdWxlLCByLCBwaGkpOwogCiBleGl0OgpAQCAtNzQ3LDggKzc2Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfY29tcGxleCB6OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmlzZmluaXRlIiwgJnopKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDppc2Zpbml0ZSIsICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGNtYXRoX2lzZmluaXRlX2ltcGwobW9kdWxlLCB6KTsKIAogZXhpdDoKQEAgLTc3Myw4ICs3OTMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X2NvbXBsZXggejsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiRDppc25hbiIsICZ6KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6aXNuYW4iLCAmeikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBjbWF0aF9pc25hbl9pbXBsKG1vZHVsZSwgeik7CiAKIGV4aXQ6CkBAIC03OTksOCArODIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9jb21wbGV4IHo7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkQ6aXNpbmYiLCAmeikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJEOmlzaW5mIiwgJnopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gY21hdGhfaXNpbmZfaW1wbChtb2R1bGUsIHopOwogCiBleGl0OgpAQCAtODQ3LDE0ICs4NjksMTYgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIkREfCRkZDppc2Nsb3NlIiwgX2tleXdvcmRzLAotICAgICAgICAmYSwgJmIsICZyZWxfdG9sLCAmYWJzX3RvbCkpCisgICAgICAgICZhLCAmYiwgJnJlbF90b2wsICZhYnNfdG9sKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBjbWF0aF9pc2Nsb3NlX2ltcGwobW9kdWxlLCBhLCBiLCByZWxfdG9sLCBhYnNfdG9sKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzMyMTk0MDI5YjdmYjFlNyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGY0OWRkMTFiNTAxNzViYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9mY250bG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9mY250bG1vZHVsZS5jLmgKaW5kZXggNjc2NjBlYi4uODRhMDA0YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvZmNudGxtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL2ZjbnRsbW9kdWxlLmMuaApAQCAtMzMsOCArMzMsOSBAQAogICAgIFB5T2JqZWN0ICphcmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJml8TzpmY250bCIsCi0gICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpCisgICAgICAgIGNvbnZfZGVzY3JpcHRvciwgJmZkLCAmY29kZSwgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBmY250bF9mY250bF9pbXBsKG1vZHVsZSwgZmQsIGNvZGUsIGFyZyk7CiAKIGV4aXQ6CkBAIC05MSw4ICs5Miw5IEBACiAgICAgaW50IG11dGF0ZV9hcmcgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJkl8T3A6aW9jdGwiLAotICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZvYl9hcmcsICZtdXRhdGVfYXJnKSkKKyAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmb2JfYXJnLCAmbXV0YXRlX2FyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBmY250bF9pb2N0bF9pbXBsKG1vZHVsZSwgZmQsIGNvZGUsIG9iX2FyZywgbXV0YXRlX2FyZyk7CiAKIGV4aXQ6CkBAIC0xMjIsOCArMTI0LDkgQEAKICAgICBpbnQgY29kZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZpOmZsb2NrIiwKLSAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlKSkKKyAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGZjbnRsX2Zsb2NrX2ltcGwobW9kdWxlLCBmZCwgY29kZSk7CiAKIGV4aXQ6CkBAIC0xNzUsMTEgKzE3OCwxMiBAQAogICAgIGludCB3aGVuY2UgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJml8T09pOmxvY2tmIiwKLSAgICAgICAgY29udl9kZXNjcmlwdG9yLCAmZmQsICZjb2RlLCAmbGVub2JqLCAmc3RhcnRvYmosICZ3aGVuY2UpKQorICAgICAgICBjb252X2Rlc2NyaXB0b3IsICZmZCwgJmNvZGUsICZsZW5vYmosICZzdGFydG9iaiwgJndoZW5jZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBmY250bF9sb2NrZl9pbXBsKG1vZHVsZSwgZmQsIGNvZGUsIGxlbm9iaiwgc3RhcnRvYmosIHdoZW5jZSk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05N2IxMzA2Yjg2NGMwMWM4IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0zNmNmZjc2YThmYjJjOWE2IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL2dycG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9ncnBtb2R1bGUuYy5oCmluZGV4IDJjNDdhNDIuLjgyZGNkNTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL2dycG1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvZ3JwbW9kdWxlLmMuaApAQCAtMjQsOCArMjQsOSBAQAogICAgIFB5T2JqZWN0ICppZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk86Z2V0Z3JnaWQiLCBfa2V5d29yZHMsCi0gICAgICAgICZpZCkpCisgICAgICAgICZpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBncnBfZ2V0Z3JnaWRfaW1wbChtb2R1bGUsIGlkKTsKIAogZXhpdDoKQEAgLTU0LDggKzU1LDkgQEAKICAgICBQeU9iamVjdCAqbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIlU6Z2V0Z3JuYW0iLCBfa2V5d29yZHMsCi0gICAgICAgICZuYW1lKSkKKyAgICAgICAgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gZ3JwX2dldGdybmFtX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTgyLDQgKzg0LDQgQEAKIHsKICAgICByZXR1cm4gZ3JwX2dldGdyYWxsX2ltcGwobW9kdWxlKTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1iZWUwOWZlZWZjNTRhMmNiIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04Yjc1MDI5NzBhMjllN2YxIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL21kNW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9tZDVtb2R1bGUuYy5oCmluZGV4IDBiZDk1OGEuLjI1ZGM3YmIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL21kNW1vZHVsZS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvbWQ1bW9kdWxlLmMuaApAQCAtODUsMTEgKzg1LDEyIEBACiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzptZDUiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdHJpbmcpKQorICAgICAgICAmc3RyaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9tZDVfbWQ1X2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NGNkM2NjOTZlMzU1NjNkMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OGY2NDBhOTg3NjFkYWZmZSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9wb3NpeG1vZHVsZS5jLmgKaW5kZXggYmUyZTVhNi4uYzU1MGI5ZCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvcG9zaXhtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3Bvc2l4bW9kdWxlLmMuaApAQCAtNDIsOCArNDIsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mcDpzdGF0IiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIEZTVEFUQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgRlNUQVRBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N0YXRfaW1wbChtb2R1bGUsICZwYXRoLCBkaXJfZmQsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC03Nyw4ICs3OCw5IEBACiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mOmxzdGF0IiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIEZTVEFUQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgRlNUQVRBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xzdGF0X2ltcGwobW9kdWxlLCAmcGF0aCwgZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTE0MCwxMSArMTQyLDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJml8JE8mcHA6YWNjZXNzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQUNDRVNTQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmVmZmVjdGl2ZV9pZHMsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQUNDRVNTQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmVmZmVjdGl2ZV9pZHMsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX2FjY2Vzc19pbXBsKG1vZHVsZSwgJnBhdGgsIG1vZGUsIGRpcl9mZCwgZWZmZWN0aXZlX2lkcywgZm9sbG93X3N5bWxpbmtzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTc4LDExICsxODIsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgY2hhciAqX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTp0dHluYW1lIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dHR5bmFtZSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfdHR5bmFtZV9pbXBsKG1vZHVsZSwgZmQpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0yMzcsOCArMjQzLDkgQEAKICAgICBwYXRoX3QgcGF0aCA9IFBBVEhfVF9JTklUSUFMSVpFKCJjaGRpciIsICJwYXRoIiwgMCwgUEFUSF9IQVZFX0ZDSERJUik7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpjaGRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2NoZGlyX2ltcGwobW9kdWxlLCAmcGF0aCk7CiAKIGV4aXQ6CkBAIC0yNzMsOCArMjgwLDkgQEAKICAgICBpbnQgZmQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpmY2hkaXIiLCBfa2V5d29yZHMsCi0gICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpCisgICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mY2hkaXJfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTMyNyw4ICszMzUsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZpfCRPJnA6Y2htb2QiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIEZDSE1PREFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBGQ0hNT0RBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2NobW9kX2ltcGwobW9kdWxlLCAmcGF0aCwgbW9kZSwgZGlyX2ZkLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtMzYzLDggKzM3Miw5IEBACiAgICAgaW50IG1vZGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpaTpmY2htb2QiLCBfa2V5d29yZHMsCi0gICAgICAgICZmZCwgJm1vZGUpKQorICAgICAgICAmZmQsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2ZjaG1vZF9pbXBsKG1vZHVsZSwgZmQsIG1vZGUpOwogCiBleGl0OgpAQCAtMzk5LDggKzQwOSw5IEBACiAgICAgaW50IG1vZGU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJmk6bGNobW9kIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmbW9kZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19sY2htb2RfaW1wbChtb2R1bGUsICZwYXRoLCBtb2RlKTsKIAogZXhpdDoKQEAgLTQ0Myw4ICs0NTQsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZrfHA6Y2hmbGFncyIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncywgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jaGZsYWdzX2ltcGwobW9kdWxlLCAmcGF0aCwgZmxhZ3MsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC00ODIsOCArNDk0LDkgQEAKICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZrOmxjaGZsYWdzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncykpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZsYWdzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xjaGZsYWdzX2ltcGwobW9kdWxlLCAmcGF0aCwgZmxhZ3MpOwogCiBleGl0OgpAQCAtNTE3LDggKzUzMCw5IEBACiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiY2hyb290IiwgInBhdGgiLCAwLCAwKTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mOmNocm9vdCIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2Nocm9vdF9pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtNTUyLDggKzU2Niw5IEBACiAgICAgaW50IGZkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6ZnN5bmMiLCBfa2V5d29yZHMsCi0gICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpCisgICAgICAgIGZpbGRlc19jb252ZXJ0ZXIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mc3luY19pbXBsKG1vZHVsZSwgZmQpOwogCiBleGl0OgpAQCAtNjA2LDggKzYyMSw5IEBACiAgICAgaW50IGZkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyY6ZmRhdGFzeW5jIiwgX2tleXdvcmRzLAotICAgICAgICBmaWxkZXNfY29udmVydGVyLCAmZmQpKQorICAgICAgICBmaWxkZXNfY29udmVydGVyLCAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZmRhdGFzeW5jX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC02NjcsOCArNjgzLDkgQEAKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZPJnwkTyZwOmNob3duIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCwgRkNIT1dOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZ2lkLCBGQ0hPV05BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2Nob3duX2ltcGwobW9kdWxlLCAmcGF0aCwgdWlkLCBnaWQsIGRpcl9mZCwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTcwNiw4ICs3MjMsOSBAQAogICAgIGdpZF90IGdpZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImlPJk8mOmZjaG93biIsIF9rZXl3b3JkcywKLSAgICAgICAgJmZkLCBfUHlfVWlkX0NvbnZlcnRlciwgJnVpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKQorICAgICAgICAmZmQsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mY2hvd25faW1wbChtb2R1bGUsIGZkLCB1aWQsIGdpZCk7CiAKIGV4aXQ6CkBAIC03NDMsOCArNzYxLDkgQEAKICAgICBnaWRfdCBnaWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mTyY6bGNob3duIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIF9QeV9VaWRfQ29udmVydGVyLCAmdWlkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmdpZCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZ2lkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xjaG93bl9pbXBsKG1vZHVsZSwgJnBhdGgsIHVpZCwgZ2lkKTsKIAogZXhpdDoKQEAgLTgzMCw4ICs4NDksOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJnwkTyZPJnA6bGluayIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnNyYywgcGF0aF9jb252ZXJ0ZXIsICZkc3QsIGRpcl9mZF9jb252ZXJ0ZXIsICZzcmNfZGlyX2ZkLCBkaXJfZmRfY29udmVydGVyLCAmZHN0X2Rpcl9mZCwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19saW5rX2ltcGwobW9kdWxlLCAmc3JjLCAmZHN0LCBzcmNfZGlyX2ZkLCBkc3RfZGlyX2ZkLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtODc2LDggKzg5Niw5IEBACiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgibGlzdGRpciIsICJwYXRoIiwgMSwgUEFUSF9IQVZFX0ZET1BFTkRJUik7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyY6bGlzdGRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xpc3RkaXJfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTkwNiw4ICs5MjcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoIl9nZXRmdWxscGF0aG5hbWUiLCAicGF0aCIsIDAsIDApOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpfZ2V0ZnVsbHBhdGhuYW1lIiwgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9nZXRmdWxscGF0aG5hbWUiLCBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfX2dldGZ1bGxwYXRobmFtZV9pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtOTM5LDggKzk2MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnBhdGg7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6X2dldGZpbmFscGF0aG5hbWUiLCAmcGF0aCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOl9nZXRmaW5hbHBhdGhuYW1lIiwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfX2dldGZpbmFscGF0aG5hbWVfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtOTY4LDggKzk5MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGF0aF90IHBhdGggPSBQQVRIX1RfSU5JVElBTElaRSgiX2lzZGlyIiwgInBhdGgiLCAwLCAwKTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6X2lzZGlyIiwgcGF0aF9jb252ZXJ0ZXIsICZwYXRoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOl9pc2RpciIsIHBhdGhfY29udmVydGVyLCAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19faXNkaXJfaW1wbChtb2R1bGUsICZwYXRoKTsKIAogZXhpdDoKQEAgLTEwMDMsOCArMTAyNyw5IEBACiAgICAgUHlPYmplY3QgKnBhdGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJVOl9nZXR2b2x1bWVwYXRobmFtZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBhdGgpKQorICAgICAgICAmcGF0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19fZ2V0dm9sdW1lcGF0aG5hbWVfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtMTA0Miw4ICsxMDY3LDkgQEAKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxpJE8mOm1rZGlyIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBNS0RJUkFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBNS0RJUkFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbWtkaXJfaW1wbChtb2R1bGUsICZwYXRoLCBtb2RlLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMTA3Myw4ICsxMDk5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgaW5jcmVtZW50OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOm5pY2UiLCAmaW5jcmVtZW50KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6bmljZSIsICZpbmNyZW1lbnQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfbmljZV9pbXBsKG1vZHVsZSwgaW5jcmVtZW50KTsKIAogZXhpdDoKQEAgLTExMDYsOCArMTEzMyw5IEBACiAgICAgaW50IHdobzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImlpOmdldHByaW9yaXR5IiwgX2tleXdvcmRzLAotICAgICAgICAmd2hpY2gsICZ3aG8pKQorICAgICAgICAmd2hpY2gsICZ3aG8pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZ2V0cHJpb3JpdHlfaW1wbChtb2R1bGUsIHdoaWNoLCB3aG8pOwogCiBleGl0OgpAQCAtMTE0MCw4ICsxMTY4LDkgQEAKICAgICBpbnQgcHJpb3JpdHk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpaWk6c2V0cHJpb3JpdHkiLCBfa2V5d29yZHMsCi0gICAgICAgICZ3aGljaCwgJndobywgJnByaW9yaXR5KSkKKyAgICAgICAgJndoaWNoLCAmd2hvLCAmcHJpb3JpdHkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cHJpb3JpdHlfaW1wbChtb2R1bGUsIHdoaWNoLCB3aG8sIHByaW9yaXR5KTsKIAogZXhpdDoKQEAgLTExODAsOCArMTIwOSw5IEBACiAgICAgaW50IGRzdF9kaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JE8mTyY6cmVuYW1lIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnNyYywgcGF0aF9jb252ZXJ0ZXIsICZkc3QsIGRpcl9mZF9jb252ZXJ0ZXIsICZzcmNfZGlyX2ZkLCBkaXJfZmRfY29udmVydGVyLCAmZHN0X2Rpcl9mZCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgZGlyX2ZkX2NvbnZlcnRlciwgJnNyY19kaXJfZmQsIGRpcl9mZF9jb252ZXJ0ZXIsICZkc3RfZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlbmFtZV9pbXBsKG1vZHVsZSwgJnNyYywgJmRzdCwgc3JjX2Rpcl9mZCwgZHN0X2Rpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xMjIzLDggKzEyNTMsOSBAQAogICAgIGludCBkc3RfZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mfCRPJk8mOnJlcGxhY2UiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgZGlyX2ZkX2NvbnZlcnRlciwgJnNyY19kaXJfZmQsIGRpcl9mZF9jb252ZXJ0ZXIsICZkc3RfZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZzcmMsIHBhdGhfY29udmVydGVyLCAmZHN0LCBkaXJfZmRfY29udmVydGVyLCAmc3JjX2Rpcl9mZCwgZGlyX2ZkX2NvbnZlcnRlciwgJmRzdF9kaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcmVwbGFjZV9pbXBsKG1vZHVsZSwgJnNyYywgJmRzdCwgc3JjX2Rpcl9mZCwgZHN0X2Rpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xMjYyLDggKzEyOTMsOSBAQAogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfCRPJjpybWRpciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JtZGlyX2ltcGwobW9kdWxlLCAmcGF0aCwgZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTEyOTYsMTEgKzEzMjgsMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ1OnN5c3RlbSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmNvbW1hbmQpKQorICAgICAgICAmY29tbWFuZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3Nfc3lzdGVtX2ltcGwobW9kdWxlLCBjb21tYW5kKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTMzMiwxMSArMTM2NiwxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mOnN5c3RlbSIsIF9rZXl3b3JkcywKLSAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmY29tbWFuZCkpCisgICAgICAgIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJmNvbW1hbmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c3RlbV9pbXBsKG1vZHVsZSwgY29tbWFuZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTEzNjYsOCArMTQwMiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG1hc2s7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dW1hc2siLCAmbWFzaykpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnVtYXNrIiwgJm1hc2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdW1hc2tfaW1wbChtb2R1bGUsIG1hc2spOwogCiBleGl0OgpAQCAtMTQwMCw4ICsxNDM3LDkgQEAKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnwkTyY6dW5saW5rIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIFVOTElOS0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIFVOTElOS0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdW5saW5rX2ltcGwobW9kdWxlLCAmcGF0aCwgZGlyX2ZkKTsKIAogZXhpdDoKQEAgLTE0MzcsOCArMTQ3NSw5IEBACiAgICAgaW50IGRpcl9mZCA9IERFRkFVTFRfRElSX0ZEOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8JE8mOnJlbW92ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBVTkxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlbW92ZV9pbXBsKG1vZHVsZSwgJnBhdGgsIGRpcl9mZCk7CiAKIGV4aXQ6CkBAIC0xNTIxLDggKzE1NjAsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZ8TyRPTyZwOnV0aW1lIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZ0aW1lcywgJm5zLCBGVVRJTUVOU0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZ0aW1lcywgJm5zLCBGVVRJTUVOU0FUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQsICZmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdXRpbWVfaW1wbChtb2R1bGUsICZwYXRoLCB0aW1lcywgbnMsIGRpcl9mZCwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTE1NTIsOCArMTU5Miw5IEBACiAgICAgaW50IHN0YXR1czsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6X2V4aXQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX19leGl0X2ltcGwobW9kdWxlLCBzdGF0dXMpOwogCiBleGl0OgpAQCAtMTU4Nyw4ICsxNjI4LDkgQEAKICAgICBQeU9iamVjdCAqYXJndjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPOmV4ZWN2IiwKLSAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YpKQorICAgICAgICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZwYXRoLCAmYXJndikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19leGVjdl9pbXBsKG1vZHVsZSwgcGF0aCwgYXJndik7CiAKIGV4aXQ6CkBAIC0xNjMxLDggKzE2NzMsOSBAQAogICAgIFB5T2JqZWN0ICplbnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk9POmV4ZWN2ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmYXJndiwgJmVudikpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZXhlY3ZlX2ltcGwobW9kdWxlLCAmcGF0aCwgYXJndiwgZW52KTsKIAogZXhpdDoKQEAgLTE2NzQsOCArMTcxNyw5IEBACiAgICAgUHlPYmplY3QgKmFyZ3Y7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk86c3Bhd252IiwKLSAgICAgICAgJm1vZGUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkKKyAgICAgICAgJm1vZGUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnBhdGgsICZhcmd2KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NwYXdudl9pbXBsKG1vZHVsZSwgbW9kZSwgcGF0aCwgYXJndik7CiAKIGV4aXQ6CkBAIC0xNzIxLDggKzE3NjUsOSBAQAogICAgIFB5T2JqZWN0ICplbnY7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk9POnNwYXdudmUiLAotICAgICAgICAmbW9kZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKQorICAgICAgICAmbW9kZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmcGF0aCwgJmFyZ3YsICZlbnYpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3Bhd252ZV9pbXBsKG1vZHVsZSwgbW9kZSwgcGF0aCwgYXJndiwgZW52KTsKIAogZXhpdDoKQEAgLTE4MDQsOCArMTg0OSw5IEBACiAgICAgaW50IHBvbGljeTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6c2NoZWRfZ2V0X3ByaW9yaXR5X21heCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBvbGljeSkpCisgICAgICAgICZwb2xpY3kpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF9pbXBsKG1vZHVsZSwgcG9saWN5KTsKIAogZXhpdDoKQEAgLTE4MzYsOCArMTg4Miw5IEBACiAgICAgaW50IHBvbGljeTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6c2NoZWRfZ2V0X3ByaW9yaXR5X21pbiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBvbGljeSkpCisgICAgICAgICZwb2xpY3kpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbl9pbXBsKG1vZHVsZSwgcG9saWN5KTsKIAogZXhpdDoKQEAgLTE4NjgsOCArMTkxNSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgcGlkX3QgcGlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpzY2hlZF9nZXRzY2hlZHVsZXIiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldHNjaGVkdWxlciIsICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfZ2V0c2NoZWR1bGVyX2ltcGwobW9kdWxlLCBwaWQpOwogCiBleGl0OgpAQCAtMTkwMCw4ICsxOTQ4LDkgQEAKICAgICBQeU9iamVjdCAqc2NoZWRfcHJpb3JpdHk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPOnNjaGVkX3BhcmFtIiwgX2tleXdvcmRzLAotICAgICAgICAmc2NoZWRfcHJpb3JpdHkpKQorICAgICAgICAmc2NoZWRfcHJpb3JpdHkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfcGFyYW1faW1wbCh0eXBlLCBzY2hlZF9wcmlvcml0eSk7CiAKIGV4aXQ6CkBAIC0xOTM3LDggKzE5ODYsOSBAQAogICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfUElEICJpTyY6c2NoZWRfc2V0c2NoZWR1bGVyIiwKLSAgICAgICAgJnBpZCwgJnBvbGljeSwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkKKyAgICAgICAgJnBpZCwgJnBvbGljeSwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX3NldHNjaGVkdWxlcl9pbXBsKG1vZHVsZSwgcGlkLCBwb2xpY3ksICZwYXJhbSk7CiAKIGV4aXQ6CkBAIC0xOTcwLDggKzIwMjAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0cGFyYW0iLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldHBhcmFtIiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRwYXJhbV9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTIwMDYsOCArMjA1Nyw5IEBACiAgICAgc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgIk8mOnNjaGVkX3NldHBhcmFtIiwKLSAgICAgICAgJnBpZCwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkKKyAgICAgICAgJnBpZCwgY29udmVydF9zY2hlZF9wYXJhbSwgJnBhcmFtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NjaGVkX3NldHBhcmFtX2ltcGwobW9kdWxlLCBwaWQsICZwYXJhbSk7CiAKIGV4aXQ6CkBAIC0yMDM5LDExICsyMDkxLDEzIEBACiAgICAgcGlkX3QgcGlkOwogICAgIGRvdWJsZSBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpzY2hlZF9ycl9nZXRfaW50ZXJ2YWwiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX3JyX2dldF9pbnRlcnZhbCIsICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3NjaGVkX3JyX2dldF9pbnRlcnZhbF9pbXBsKG1vZHVsZSwgcGlkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEuMCkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5RmxvYXRfRnJvbURvdWJsZShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTIwOTgsOCArMjE1Miw5IEBACiAgICAgUHlPYmplY3QgKm1hc2s7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAiTzpzY2hlZF9zZXRhZmZpbml0eSIsCi0gICAgICAgICZwaWQsICZtYXNrKSkKKyAgICAgICAgJnBpZCwgJm1hc2spKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2NoZWRfc2V0YWZmaW5pdHlfaW1wbChtb2R1bGUsIHBpZCwgbWFzayk7CiAKIGV4aXQ6CkBAIC0yMTE0LDcgKzIxNjksNyBAQAogInNjaGVkX2dldGFmZmluaXR5KCRtb2R1bGUsIHBpZCwgLylcbiIKICItLVxuIgogIlxuIgotIlJldHVybiB0aGUgYWZmaW5pdHkgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllZCBieSBwaWQuXG4iCisiUmV0dXJuIHRoZSBhZmZpbml0eSBvZiB0aGUgcHJvY2VzcyBpZGVudGlmaWVkIGJ5IHBpZCAob3IgdGhlIGN1cnJlbnQgcHJvY2VzcyBpZiB6ZXJvKS5cbiIKICJcbiIKICJUaGUgYWZmaW5pdHkgaXMgcmV0dXJuZWQgYXMgYSBzZXQgb2YgQ1BVIGlkZW50aWZpZXJzLiIpOwogCkBAIC0yMTMwLDggKzIxODUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6c2NoZWRfZ2V0YWZmaW5pdHkiLCAmcGlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX1BJRCAiOnNjaGVkX2dldGFmZmluaXR5IiwgJnBpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zY2hlZF9nZXRhZmZpbml0eV9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTIzMjAsOCArMjM3Niw5IEBACiAgICAgcGlkX3QgcGlkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiIiBfUHlfUEFSU0VfUElEICI6Z2V0cGdpZCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBpZCkpCisgICAgICAgICZwaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZ2V0cGdpZF9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTI0NjUsOCArMjUyMiw5IEBACiAgICAgUHlfc3NpemVfdCBzaWduYWw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAibjpraWxsIiwKLSAgICAgICAgJnBpZCwgJnNpZ25hbCkpCisgICAgICAgICZwaWQsICZzaWduYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfa2lsbF9pbXBsKG1vZHVsZSwgcGlkLCBzaWduYWwpOwogCiBleGl0OgpAQCAtMjQ5Nyw4ICsyNTU1LDkgQEAKICAgICBpbnQgc2lnbmFsOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICIiIF9QeV9QQVJTRV9QSUQgImk6a2lsbHBnIiwKLSAgICAgICAgJnBnaWQsICZzaWduYWwpKQorICAgICAgICAmcGdpZCwgJnNpZ25hbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19raWxscGdfaW1wbChtb2R1bGUsIHBnaWQsIHNpZ25hbCk7CiAKIGV4aXQ6CkBAIC0yNTI3LDggKzI1ODYsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBvcDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpwbG9jayIsICZvcCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnBsb2NrIiwgJm9wKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3Bsb2NrX2ltcGwobW9kdWxlLCBvcCk7CiAKIGV4aXQ6CkBAIC0yNTU3LDggKzI2MTcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHVpZF90IHVpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0dWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0dWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZ1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0dWlkX2ltcGwobW9kdWxlLCB1aWQpOwogCiBleGl0OgpAQCAtMjU4Nyw4ICsyNjQ4LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICB1aWRfdCBldWlkOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpzZXRldWlkIiwgX1B5X1VpZF9Db252ZXJ0ZXIsICZldWlkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnNldGV1aWQiLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0ZXVpZF9pbXBsKG1vZHVsZSwgZXVpZCk7CiAKIGV4aXQ6CkBAIC0yNjE3LDggKzI2NzksOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGdpZF90IGVnaWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnNldGVnaWQiLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0ZWdpZCIsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRlZ2lkX2ltcGwobW9kdWxlLCBlZ2lkKTsKIAogZXhpdDoKQEAgLTI2NDksOCArMjcxMiw5IEBACiAgICAgdWlkX3QgZXVpZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZPJjpzZXRyZXVpZCIsCi0gICAgICAgIF9QeV9VaWRfQ29udmVydGVyLCAmcnVpZCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZldWlkKSkKKyAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cmV1aWRfaW1wbChtb2R1bGUsIHJ1aWQsIGV1aWQpOwogCiBleGl0OgpAQCAtMjY4MSw4ICsyNzQ1LDkgQEAKICAgICBnaWRfdCBlZ2lkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnNldHJlZ2lkIiwKLSAgICAgICAgX1B5X0dpZF9Db252ZXJ0ZXIsICZyZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQpKQorICAgICAgICBfUHlfR2lkX0NvbnZlcnRlciwgJnJnaWQsIF9QeV9HaWRfQ29udmVydGVyLCAmZWdpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRyZWdpZF9pbXBsKG1vZHVsZSwgcmdpZCwgZWdpZCk7CiAKIGV4aXQ6CkBAIC0yNzExLDggKzI3NzYsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGdpZF90IGdpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0Z2lkIiwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c2V0Z2lkIiwgX1B5X0dpZF9Db252ZXJ0ZXIsICZnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0Z2lkX2ltcGwobW9kdWxlLCBnaWQpOwogCiBleGl0OgpAQCAtMjc1OSw4ICsyODI1LDkgQEAKICAgICBpbnQgb3B0aW9uczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6d2FpdDMiLCBfa2V5d29yZHMsCi0gICAgICAgICZvcHRpb25zKSkKKyAgICAgICAgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfd2FpdDNfaW1wbChtb2R1bGUsIG9wdGlvbnMpOwogCiBleGl0OgpAQCAtMjc5NSw4ICsyODYyLDkgQEAKICAgICBpbnQgb3B0aW9uczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIiIgX1B5X1BBUlNFX1BJRCAiaTp3YWl0NCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnBpZCwgJm9wdGlvbnMpKQorICAgICAgICAmcGlkLCAmb3B0aW9ucykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc193YWl0NF9pbXBsKG1vZHVsZSwgcGlkLCBvcHRpb25zKTsKIAogZXhpdDoKQEAgLTI4MzksOCArMjkwNyw5IEBACiAgICAgaW50IG9wdGlvbnM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkiIF9QeV9QQVJTRV9QSUQgImk6d2FpdGlkIiwKLSAgICAgICAgJmlkdHlwZSwgJmlkLCAmb3B0aW9ucykpCisgICAgICAgICZpZHR5cGUsICZpZCwgJm9wdGlvbnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfd2FpdGlkX2ltcGwobW9kdWxlLCBpZHR5cGUsIGlkLCBvcHRpb25zKTsKIAogZXhpdDoKQEAgLTI4NzYsOCArMjk0NSw5IEBACiAgICAgaW50IG9wdGlvbnM7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIiIgX1B5X1BBUlNFX1BJRCAiaTp3YWl0cGlkIiwKLSAgICAgICAgJnBpZCwgJm9wdGlvbnMpKQorICAgICAgICAmcGlkLCAmb3B0aW9ucykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc193YWl0cGlkX2ltcGwobW9kdWxlLCBwaWQsIG9wdGlvbnMpOwogCiBleGl0OgpAQCAtMjkxMyw4ICsyOTgzLDkgQEAKICAgICBpbnQgb3B0aW9uczsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfSU5UUFRSICJpOndhaXRwaWQiLAotICAgICAgICAmcGlkLCAmb3B0aW9ucykpCisgICAgICAgICZwaWQsICZvcHRpb25zKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3dhaXRwaWRfaW1wbChtb2R1bGUsIHBpZCwgb3B0aW9ucyk7CiAKIGV4aXQ6CkBAIC0yOTg0LDggKzMwNTUsOSBAQAogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8cCRPJjpzeW1saW5rIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnNyYywgcGF0aF9jb252ZXJ0ZXIsICZkc3QsICZ0YXJnZXRfaXNfZGlyZWN0b3J5LCBTWU1MSU5LQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmc3JjLCBwYXRoX2NvbnZlcnRlciwgJmRzdCwgJnRhcmdldF9pc19kaXJlY3RvcnksIFNZTUxJTktBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N5bWxpbmtfaW1wbChtb2R1bGUsICZzcmMsICZkc3QsIHRhcmdldF9pc19kaXJlY3RvcnksIGRpcl9mZCk7CiAKIGV4aXQ6CkBAIC0zMDQ1LDggKzMxMTcsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIHBpZF90IHBpZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiIiBfUHlfUEFSU0VfUElEICI6Z2V0c2lkIiwgJnBpZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICIiIF9QeV9QQVJTRV9QSUQgIjpnZXRzaWQiLCAmcGlkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2dldHNpZF9pbXBsKG1vZHVsZSwgcGlkKTsKIAogZXhpdDoKQEAgLTMwOTksOCArMzE3Miw5IEBACiAgICAgcGlkX3QgcGdycDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfUElEICIiIF9QeV9QQVJTRV9QSUQgIjpzZXRwZ2lkIiwKLSAgICAgICAgJnBpZCwgJnBncnApKQorICAgICAgICAmcGlkLCAmcGdycCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRwZ2lkX2ltcGwobW9kdWxlLCBwaWQsIHBncnApOwogCiBleGl0OgpAQCAtMzEyOSw4ICszMjAzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgZmQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dGNnZXRwZ3JwIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6dGNnZXRwZ3JwIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3RjZ2V0cGdycF9pbXBsKG1vZHVsZSwgZmQpOwogCiBleGl0OgpAQCAtMzE2MSw4ICszMjM2LDkgQEAKICAgICBwaWRfdCBwZ2lkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpIiBfUHlfUEFSU0VfUElEICI6dGNzZXRwZ3JwIiwKLSAgICAgICAgJmZkLCAmcGdpZCkpCisgICAgICAgICZmZCwgJnBnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfdGNzZXRwZ3JwX2ltcGwobW9kdWxlLCBmZCwgcGdpZCk7CiAKIGV4aXQ6CkBAIC0zMjAwLDExICszMjc2LDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJml8aSRPJjpvcGVuIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZmbGFncywgJm1vZGUsIE9QRU5BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmZmxhZ3MsICZtb2RlLCBPUEVOQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3Nfb3Blbl9pbXBsKG1vZHVsZSwgJnBhdGgsIGZsYWdzLCBtb2RlLCBkaXJfZmQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMjM0LDggKzMzMTIsOSBAQAogICAgIGludCBmZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6Y2xvc2UiLCBfa2V5d29yZHMsCi0gICAgICAgICZmZCkpCisgICAgICAgICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19jbG9zZV9pbXBsKG1vZHVsZSwgZmQpOwogCiBleGl0OgpAQCAtMzI2Miw4ICszMzQxLDkgQEAKICAgICBpbnQgZmRfaGlnaDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6Y2xvc2VyYW5nZSIsCi0gICAgICAgICZmZF9sb3csICZmZF9oaWdoKSkKKyAgICAgICAgJmZkX2xvdywgJmZkX2hpZ2gpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfY2xvc2VyYW5nZV9pbXBsKG1vZHVsZSwgZmRfbG93LCBmZF9oaWdoKTsKIAogZXhpdDoKQEAgLTMyODksMTEgKzMzNjksMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6ZHVwIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6ZHVwIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19kdXBfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzMyMiw4ICszNDA0LDkgQEAKICAgICBpbnQgaW5oZXJpdGFibGUgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaWl8cDpkdXAyIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQsICZmZDIsICZpbmhlcml0YWJsZSkpCisgICAgICAgICZmZCwgJmZkMiwgJmluaGVyaXRhYmxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2R1cDJfaW1wbChtb2R1bGUsIGZkLCBmZDIsIGluaGVyaXRhYmxlKTsKIAogZXhpdDoKQEAgLTMzNjAsOCArMzQ0Myw5IEBACiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaU8mOmxvY2tmIiwKLSAgICAgICAgJmZkLCAmY29tbWFuZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICAgICAgJmZkLCAmY29tbWFuZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2xvY2tmX2ltcGwobW9kdWxlLCBmZCwgY29tbWFuZCwgbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTMzOTUsMTEgKzM0NzksMTMgQEAKICAgICBQeV9vZmZfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyZpOmxzZWVrIiwKLSAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZwb3NpdGlvbiwgJmhvdykpCisgICAgICAgICZmZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmcG9zaXRpb24sICZob3cpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX2xzZWVrX2ltcGwobW9kdWxlLCBmZCwgcG9zaXRpb24sIGhvdyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tUHlfb2ZmX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zNDI2LDggKzM1MTIsOSBAQAogICAgIFB5X3NzaXplX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpbjpyZWFkIiwKLSAgICAgICAgJmZkLCAmbGVuZ3RoKSkKKyAgICAgICAgJmZkLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlYWRfaW1wbChtb2R1bGUsIGZkLCBsZW5ndGgpOwogCiBleGl0OgpAQCAtMzQ2NSwxMSArMzU1MiwxMyBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86cmVhZHYiLAotICAgICAgICAmZmQsICZidWZmZXJzKSkKKyAgICAgICAgJmZkLCAmYnVmZmVycykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfcmVhZHZfaW1wbChtb2R1bGUsIGZkLCBidWZmZXJzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Tc2l6ZV90KF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzUwNCw4ICszNTkzLDkgQEAKICAgICBQeV9vZmZfdCBvZmZzZXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpTyY6cHJlYWQiLAotICAgICAgICAmZmQsICZsZW5ndGgsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCkpCisgICAgICAgICZmZCwgJmxlbmd0aCwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3ByZWFkX2ltcGwobW9kdWxlLCBmZCwgbGVuZ3RoLCBvZmZzZXQpOwogCiBleGl0OgpAQCAtMzUzNSwxNyArMzYyNSwyMCBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaXkqOndyaXRlIiwKLSAgICAgICAgJmZkLCAmZGF0YSkpCisgICAgICAgICZmZCwgJmRhdGEpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3dyaXRlX2ltcGwobW9kdWxlLCBmZCwgJmRhdGEpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgZGF0YSAqLwotICAgIGlmIChkYXRhLm9iaikKKyAgICBpZiAoZGF0YS5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMzU3Myw4ICszNjY2LDkgQEAKICAgICBpbnQgZmQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOmZzdGF0IiwgX2tleXdvcmRzLAotICAgICAgICAmZmQpKQorICAgICAgICAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZnN0YXRfaW1wbChtb2R1bGUsIGZkKTsKIAogZXhpdDoKQEAgLTM2MDMsMTEgKzM2OTcsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNhdHR5IiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6aXNhdHR5IiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19pc2F0dHlfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlCb29sX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzY2NSw4ICszNzYxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgZmxhZ3M7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6cGlwZTIiLCAmZmxhZ3MpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpwaXBlMiIsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19waXBlMl9pbXBsKG1vZHVsZSwgZmxhZ3MpOwogCiBleGl0OgpAQCAtMzcwMSwxMSArMzc5OCwxMyBAQAogICAgIFB5X3NzaXplX3QgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86d3JpdGV2IiwKLSAgICAgICAgJmZkLCAmYnVmZmVycykpCisgICAgICAgICZmZCwgJmJ1ZmZlcnMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3dyaXRldl9pbXBsKG1vZHVsZSwgZmQsIGJ1ZmZlcnMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zNzQyLDE3ICszODQxLDIwIEBACiAgICAgUHlfc3NpemVfdCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpeSpPJjpwd3JpdGUiLAotICAgICAgICAmZmQsICZidWZmZXIsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCkpCisgICAgICAgICZmZCwgJmJ1ZmZlciwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19wd3JpdGVfaW1wbChtb2R1bGUsIGZkLCAmYnVmZmVyLCBvZmZzZXQpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbVNzaXplX3QoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CiAgICAgLyogQ2xlYW51cCBmb3IgYnVmZmVyICovCi0gICAgaWYgKGJ1ZmZlci5vYmopCisgICAgaWYgKGJ1ZmZlci5vYmopIHsKICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZidWZmZXIpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0zNzg4LDggKzM4OTAsOSBAQAogICAgIGludCBkaXJfZmQgPSBERUZBVUxUX0RJUl9GRDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mfGkkTyY6bWtmaWZvIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBNS0ZJRk9BVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCAmbW9kZSwgTUtGSUZPQVRfRElSX0ZEX0NPTlZFUlRFUiwgJmRpcl9mZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19ta2ZpZm9faW1wbChtb2R1bGUsICZwYXRoLCBtb2RlLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMzgzOSw4ICszOTQyLDkgQEAKICAgICBpbnQgZGlyX2ZkID0gREVGQVVMVF9ESVJfRkQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnxpTyYkTyY6bWtub2QiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJm1vZGUsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlLCBNS05PREFUX0RJUl9GRF9DT05WRVJURVIsICZkaXJfZmQpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsICZtb2RlLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSwgTUtOT0RBVF9ESVJfRkRfQ09OVkVSVEVSLCAmZGlyX2ZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX21rbm9kX2ltcGwobW9kdWxlLCAmcGF0aCwgbW9kZSwgZGV2aWNlLCBkaXJfZmQpOwogCiBleGl0OgpAQCAtMzg3MywxMSArMzk3NywxMyBAQAogICAgIGRldl90IGRldmljZTsKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6bWFqb3IiLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjptYWpvciIsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19tYWpvcl9pbXBsKG1vZHVsZSwgZGV2aWNlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzkwNywxMSArNDAxMywxMyBAQAogICAgIGRldl90IGRldmljZTsKICAgICB1bnNpZ25lZCBpbnQgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6bWlub3IiLCBfUHlfRGV2X0NvbnZlcnRlciwgJmRldmljZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjptaW5vciIsIF9QeV9EZXZfQ29udmVydGVyLCAmZGV2aWNlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19taW5vcl9pbXBsKG1vZHVsZSwgZGV2aWNlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gKHVuc2lnbmVkIGludCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKCh1bnNpZ25lZCBsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzk0MywxMSArNDA1MSwxMyBAQAogICAgIGRldl90IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlpOm1ha2VkZXYiLAotICAgICAgICAmbWFqb3IsICZtaW5vcikpCisgICAgICAgICZtYWpvciwgJm1pbm9yKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19tYWtlZGV2X2ltcGwobW9kdWxlLCBtYWpvciwgbWlub3IpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAoZGV2X3QpLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IChkZXZfdCktMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9QeUxvbmdfRnJvbURldihfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM5NzgsOCArNDA4OCw5IEBACiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyY6ZnRydW5jYXRlIiwKLSAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgpKQorICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19mdHJ1bmNhdGVfaW1wbChtb2R1bGUsIGZkLCBsZW5ndGgpOwogCiBleGl0OgpAQCAtNDAxNCw4ICs0MTI1LDkgQEAKICAgICBQeV9vZmZfdCBsZW5ndGg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mOnRydW5jYXRlIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3RydW5jYXRlX2ltcGwobW9kdWxlLCAmcGF0aCwgbGVuZ3RoKTsKIAogZXhpdDoKQEAgLTQwNTQsOCArNDE2Niw5IEBACiAgICAgUHlfb2ZmX3QgbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTyZPJjpwb3NpeF9mYWxsb2NhdGUiLAotICAgICAgICAmZmQsIFB5X29mZl90X2NvbnZlcnRlciwgJm9mZnNldCwgUHlfb2ZmX3RfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19wb3NpeF9mYWxsb2NhdGVfaW1wbChtb2R1bGUsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC00MDk3LDggKzQyMTAsOSBAQAogICAgIGludCBhZHZpY2U7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImlPJk8maTpwb3NpeF9mYWR2aXNlIiwKLSAgICAgICAgJmZkLCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZvZmZzZXQsIFB5X29mZl90X2NvbnZlcnRlciwgJmxlbmd0aCwgJmFkdmljZSkpCisgICAgICAgICZmZCwgUHlfb2ZmX3RfY29udmVydGVyLCAmb2Zmc2V0LCBQeV9vZmZfdF9jb252ZXJ0ZXIsICZsZW5ndGgsICZhZHZpY2UpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcG9zaXhfZmFkdmlzZV9pbXBsKG1vZHVsZSwgZmQsIG9mZnNldCwgbGVuZ3RoLCBhZHZpY2UpOwogCiBleGl0OgpAQCAtNDEyOSw4ICs0MjQzLDkgQEAKICAgICBQeU9iamVjdCAqdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlVVOnB1dGVudiIsCi0gICAgICAgICZuYW1lLCAmdmFsdWUpKQorICAgICAgICAmbmFtZSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3B1dGVudl9pbXBsKG1vZHVsZSwgbmFtZSwgdmFsdWUpOwogCiBleGl0OgpAQCAtNDE2MSw4ICs0Mjc2LDkgQEAKICAgICBQeU9iamVjdCAqdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mOnB1dGVudiIsCi0gICAgICAgIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJm5hbWUsIFB5VW5pY29kZV9GU0NvbnZlcnRlciwgJnZhbHVlKSkKKyAgICAgICAgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmbmFtZSwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfcHV0ZW52X2ltcGwobW9kdWxlLCBuYW1lLCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MTk2LDggKzQzMTIsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6dW5zZXRlbnYiLCBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOnVuc2V0ZW52IiwgUHlVbmljb2RlX0ZTQ29udmVydGVyLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc191bnNldGVudl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC00MjI3LDggKzQzNDQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnN0cmVycm9yIiwgJmNvZGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzdHJlcnJvciIsICZjb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3N0cmVycm9yX2ltcGwobW9kdWxlLCBjb2RlKTsKIAogZXhpdDoKQEAgLTQyNTYsMTEgKzQzNzQsMTMgQEAKICAgICBpbnQgc3RhdHVzOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOldDT1JFRFVNUCIsICZzdGF0dXMpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpXQ09SRURVTVAiLCAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XQ09SRURVTVBfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQyOTUsMTEgKzQ0MTUsMTMgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V0lGQ09OVElOVUVEIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGQ09OVElOVUVEX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MzMxLDExICs0NDUzLDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldJRlNUT1BQRUQiLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XSUZTVE9QUEVEX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00MzY3LDExICs0NDkxLDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldJRlNJR05BTEVEIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGU0lHTkFMRURfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ0MDMsMTEgKzQ1MjksMTMgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V0lGRVhJVEVEIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0lGRVhJVEVEX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NDM5LDExICs0NTY3LDEzIEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJpOldFWElUU1RBVFVTIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RhdHVzKSkKKyAgICAgICAgJnN0YXR1cykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfV0VYSVRTVEFUVVNfaW1wbChtb2R1bGUsIHN0YXR1cyk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ0NzUsMTEgKzQ2MDUsMTMgQEAKICAgICBpbnQgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6V1RFUk1TSUciLCBfa2V5d29yZHMsCi0gICAgICAgICZzdGF0dXMpKQorICAgICAgICAmc3RhdHVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19XVEVSTVNJR19pbXBsKG1vZHVsZSwgc3RhdHVzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNDUxMSwxMSArNDY0MywxMyBAQAogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiaTpXU1RPUFNJRyIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0YXR1cykpCisgICAgICAgICZzdGF0dXMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX1dTVE9QU0lHX2ltcGwobW9kdWxlLCBzdGF0dXMpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00NTQ2LDggKzQ2ODAsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBmZDsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpmc3RhdHZmcyIsICZmZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmZzdGF0dmZzIiwgJmZkKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2ZzdGF0dmZzX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC00NTgyLDggKzQ3MTcsOSBAQAogICAgIHBhdGhfdCBwYXRoID0gUEFUSF9UX0lOSVRJQUxJWkUoInN0YXR2ZnMiLCAicGF0aCIsIDAsIFBBVEhfSEFWRV9GU1RBVFZGUyk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJjpzdGF0dmZzIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc3RhdHZmc19pbXBsKG1vZHVsZSwgJnBhdGgpOwogCiBleGl0OgpAQCAtNDYxNyw4ICs0NzUzLDkgQEAKICAgICBQeV9VTklDT0RFICpwYXRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAidTpfZ2V0ZGlza3VzYWdlIiwgX2tleXdvcmRzLAotICAgICAgICAmcGF0aCkpCisgICAgICAgICZwYXRoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX19nZXRkaXNrdXNhZ2VfaW1wbChtb2R1bGUsIHBhdGgpOwogCiBleGl0OgpAQCAtNDY1MiwxMSArNDc4OSwxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU8mOmZwYXRoY29uZiIsCi0gICAgICAgICZmZCwgY29udl9wYXRoX2NvbmZuYW1lLCAmbmFtZSkpCisgICAgICAgICZmZCwgY29udl9wYXRoX2NvbmZuYW1lLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfZnBhdGhjb25mX2ltcGwobW9kdWxlLCBmZCwgbmFtZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ2OTMsMTEgKzQ4MzIsMTMgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mOnBhdGhjb25mIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIGNvbnZfcGF0aF9jb25mbmFtZSwgJm5hbWUpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIGNvbnZfcGF0aF9jb25mbmFtZSwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3BhdGhjb25mX2ltcGwobW9kdWxlLCAmcGF0aCwgbmFtZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ3MjksOCArNDg3MCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IG5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmNvbmZzdHIiLCBjb252X2NvbmZzdHJfY29uZm5hbWUsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOmNvbmZzdHIiLCBjb252X2NvbmZzdHJfY29uZm5hbWUsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX2NvbmZzdHJfaW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtNDc2MCwxMSArNDkwMiwxMyBAQAogICAgIGludCBuYW1lOwogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c3lzY29uZiIsIGNvbnZfc3lzY29uZl9jb25mbmFtZSwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6c3lzY29uZiIsIGNvbnZfc3lzY29uZl9jb25mbmFtZSwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG9zX3N5c2NvbmZfaW1wbChtb2R1bGUsIG5hbWUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC00ODQzLDggKzQ5ODcsOSBAQAogICAgIGludCBmZDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgImk6ZGV2aWNlX2VuY29kaW5nIiwgX2tleXdvcmRzLAotICAgICAgICAmZmQpKQorICAgICAgICAmZmQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3NfZGV2aWNlX2VuY29kaW5nX2ltcGwobW9kdWxlLCBmZCk7CiAKIGV4aXQ6CkBAIC00ODc0LDggKzUwMTksOSBAQAogICAgIHVpZF90IHN1aWQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mTyZPJjpzZXRyZXN1aWQiLAotICAgICAgICBfUHlfVWlkX0NvbnZlcnRlciwgJnJ1aWQsIF9QeV9VaWRfQ29udmVydGVyLCAmZXVpZCwgX1B5X1VpZF9Db252ZXJ0ZXIsICZzdWlkKSkKKyAgICAgICAgX1B5X1VpZF9Db252ZXJ0ZXIsICZydWlkLCBfUHlfVWlkX0NvbnZlcnRlciwgJmV1aWQsIF9QeV9VaWRfQ29udmVydGVyLCAmc3VpZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXRyZXN1aWRfaW1wbChtb2R1bGUsIHJ1aWQsIGV1aWQsIHN1aWQpOwogCiBleGl0OgpAQCAtNDkwNyw4ICs1MDUzLDkgQEAKICAgICBnaWRfdCBzZ2lkOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJk8mTyY6c2V0cmVzZ2lkIiwKLSAgICAgICAgX1B5X0dpZF9Db252ZXJ0ZXIsICZyZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJmVnaWQsIF9QeV9HaWRfQ29udmVydGVyLCAmc2dpZCkpCisgICAgICAgIF9QeV9HaWRfQ29udmVydGVyLCAmcmdpZCwgX1B5X0dpZF9Db252ZXJ0ZXIsICZlZ2lkLCBfUHlfR2lkX0NvbnZlcnRlciwgJnNnaWQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0cmVzZ2lkX2ltcGwobW9kdWxlLCByZ2lkLCBlZ2lkLCBzZ2lkKTsKIAogZXhpdDoKQEAgLTQ5OTEsOCArNTEzOCw5IEBACiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJk8mfCRwOmdldHhhdHRyIiwgX2tleXdvcmRzLAotICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmZm9sbG93X3N5bWxpbmtzKSkKKyAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBwYXRoX2NvbnZlcnRlciwgJmF0dHJpYnV0ZSwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19nZXR4YXR0cl9pbXBsKG1vZHVsZSwgJnBhdGgsICZhdHRyaWJ1dGUsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC01MDM5LDggKzUxODcsOSBAQAogICAgIGludCBmb2xsb3dfc3ltbGlua3MgPSAxOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZPJnkqfGkkcDpzZXR4YXR0ciIsIF9rZXl3b3JkcywKLSAgICAgICAgcGF0aF9jb252ZXJ0ZXIsICZwYXRoLCBwYXRoX2NvbnZlcnRlciwgJmF0dHJpYnV0ZSwgJnZhbHVlLCAmZmxhZ3MsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmdmFsdWUsICZmbGFncywgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19zZXR4YXR0cl9pbXBsKG1vZHVsZSwgJnBhdGgsICZhdHRyaWJ1dGUsICZ2YWx1ZSwgZmxhZ3MsIGZvbGxvd19zeW1saW5rcyk7CiAKIGV4aXQ6CkBAIC01MDQ5LDggKzUxOTgsOSBAQAogICAgIC8qIENsZWFudXAgZm9yIGF0dHJpYnV0ZSAqLwogICAgIHBhdGhfY2xlYW51cCgmYXR0cmlidXRlKTsKICAgICAvKiBDbGVhbnVwIGZvciB2YWx1ZSAqLwotICAgIGlmICh2YWx1ZS5vYmopCisgICAgaWYgKHZhbHVlLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZhbHVlKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNTA4Nyw4ICs1MjM3LDkgQEAKICAgICBpbnQgZm9sbG93X3N5bWxpbmtzID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk8mTyZ8JHA6cmVtb3ZleGF0dHIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgcGF0aF9jb252ZXJ0ZXIsICZhdHRyaWJ1dGUsICZmb2xsb3dfc3ltbGlua3MpKQorICAgICAgICBwYXRoX2NvbnZlcnRlciwgJnBhdGgsIHBhdGhfY29udmVydGVyLCAmYXR0cmlidXRlLCAmZm9sbG93X3N5bWxpbmtzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3JlbW92ZXhhdHRyX2ltcGwobW9kdWxlLCAmcGF0aCwgJmF0dHJpYnV0ZSwgZm9sbG93X3N5bWxpbmtzKTsKIAogZXhpdDoKQEAgLTUxMzEsOCArNTI4Miw5IEBACiAgICAgaW50IGZvbGxvd19zeW1saW5rcyA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TyYkcDpsaXN0eGF0dHIiLCBfa2V5d29yZHMsCi0gICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZvbGxvd19zeW1saW5rcykpCisgICAgICAgIHBhdGhfY29udmVydGVyLCAmcGF0aCwgJmZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBvc19saXN0eGF0dHJfaW1wbChtb2R1bGUsICZwYXRoLCBmb2xsb3dfc3ltbGlua3MpOwogCiBleGl0OgpAQCAtNTE2Miw4ICs1MzE0LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeV9zc2l6ZV90IHNpemU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIm46dXJhbmRvbSIsICZzaXplKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIm46dXJhbmRvbSIsICZzaXplKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3VyYW5kb21faW1wbChtb2R1bGUsIHNpemUpOwogCiBleGl0OgpAQCAtNTE3NCw3ICs1MzI3LDExIEBACiAiY3B1X2NvdW50KCRtb2R1bGUsIC8pXG4iCiAiLS1cbiIKICJcbiIKLSJSZXR1cm4gdGhlIG51bWJlciBvZiBDUFVzIGluIHRoZSBzeXN0ZW07IHJldHVybiBOb25lIGlmIGluZGV0ZXJtaW5hYmxlLiIpOworIlJldHVybiB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbTsgcmV0dXJuIE5vbmUgaWYgaW5kZXRlcm1pbmFibGUuXG4iCisiXG4iCisiVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuXG4iCisidXNlLiAgVGhlIG51bWJlciBvZiB1c2FibGUgQ1BVcyBjYW4gYmUgb2J0YWluZWQgd2l0aFxuIgorImBgbGVuKG9zLnNjaGVkX2dldGFmZmluaXR5KDApKWBgIik7CiAKICNkZWZpbmUgT1NfQ1BVX0NPVU5UX01FVEhPRERFRiAgICBcCiAgICAgeyJjcHVfY291bnQiLCAoUHlDRnVuY3Rpb24pb3NfY3B1X2NvdW50LCBNRVRIX05PQVJHUywgb3NfY3B1X2NvdW50X19kb2NfX30sCkBAIC01MjA3LDExICs1MzY0LDEzIEBACiAgICAgaW50IGZkOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldF9pbmhlcml0YWJsZSIsICZmZCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldF9pbmhlcml0YWJsZSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gb3NfZ2V0X2luaGVyaXRhYmxlX2ltcGwobW9kdWxlLCBmZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5Qm9vbF9Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTUyMzgsOCArNTM5Nyw5IEBACiAgICAgaW50IGluaGVyaXRhYmxlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpzZXRfaW5oZXJpdGFibGUiLAotICAgICAgICAmZmQsICZpbmhlcml0YWJsZSkpCisgICAgICAgICZmZCwgJmluaGVyaXRhYmxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG9zX3NldF9pbmhlcml0YWJsZV9pbXBsKG1vZHVsZSwgZmQsIGluaGVyaXRhYmxlKTsKIAogZXhpdDoKQEAgLTUyNjcsMTEgKzU0MjcsMTMgQEAKICAgICBQeV9pbnRwdHJfdCBoYW5kbGU7CiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX0lOVFBUUiAiOmdldF9oYW5kbGVfaW5oZXJpdGFibGUiLCAmaGFuZGxlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIiIgX1B5X1BBUlNFX0lOVFBUUiAiOmdldF9oYW5kbGVfaW5oZXJpdGFibGUiLCAmaGFuZGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBvc19nZXRfaGFuZGxlX2luaGVyaXRhYmxlX2ltcGwobW9kdWxlLCBoYW5kbGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01MzAzLDggKzU0NjUsOSBAQAogICAgIGludCBpbmhlcml0YWJsZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIiBfUHlfUEFSU0VfSU5UUFRSICJwOnNldF9oYW5kbGVfaW5oZXJpdGFibGUiLAotICAgICAgICAmaGFuZGxlLCAmaW5oZXJpdGFibGUpKQorICAgICAgICAmaGFuZGxlLCAmaW5oZXJpdGFibGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gb3Nfc2V0X2hhbmRsZV9pbmhlcml0YWJsZV9pbXBsKG1vZHVsZSwgaGFuZGxlLCBpbmhlcml0YWJsZSk7CiAKIGV4aXQ6CkBAIC01MzEzLDYgKzU0NzYsMzkgQEAKIAogI2VuZGlmIC8qIGRlZmluZWQoTVNfV0lORE9XUykgKi8KIAorUHlEb2NfU1RSVkFSKG9zX2ZzcGF0aF9fZG9jX18sCisiZnNwYXRoKCRtb2R1bGUsIC8sIHBhdGgpXG4iCisiLS1cbiIKKyJcbiIKKyJSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC5cbiIKKyJcbiIKKyJJZiB0aGUgb2JqZWN0IGlzIHN0ciBvciBieXRlcywgdGhlbiBhbGxvdyBpdCB0byBwYXNzIHRocm91Z2ggYXMtaXMuIElmIHRoZVxuIgorIm9iamVjdCBkZWZpbmVzIF9fZnNwYXRoX18oKSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0IG1ldGhvZC4gQWxsIG90aGVyXG4iCisidHlwZXMgcmFpc2UgYSBUeXBlRXJyb3IuIik7CisKKyNkZWZpbmUgT1NfRlNQQVRIX01FVEhPRERFRiAgICBcCisgICAgeyJmc3BhdGgiLCAoUHlDRnVuY3Rpb24pb3NfZnNwYXRoLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgb3NfZnNwYXRoX19kb2NfX30sCisKK3N0YXRpYyBQeU9iamVjdCAqCitvc19mc3BhdGhfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqcGF0aCk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitvc19mc3BhdGgoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCit7CisgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKl9rZXl3b3Jkc1tdID0geyJwYXRoIiwgTlVMTH07CisgICAgUHlPYmplY3QgKnBhdGg7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPOmZzcGF0aCIsIF9rZXl3b3JkcywKKyAgICAgICAgJnBhdGgpKSB7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gb3NfZnNwYXRoX2ltcGwobW9kdWxlLCBwYXRoKTsKKworZXhpdDoKKyAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOworfQorCiAjaWZuZGVmIE9TX1RUWU5BTUVfTUVUSE9EREVGCiAgICAgI2RlZmluZSBPU19UVFlOQU1FX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKE9TX1RUWU5BTUVfTUVUSE9EREVGKSAqLwpAQCAtNTc4NCw0ICs1OTgwLDQgQEAKICNpZm5kZWYgT1NfU0VUX0hBTkRMRV9JTkhFUklUQUJMRV9NRVRIT0RERUYKICAgICAjZGVmaW5lIE9TX1NFVF9IQU5ETEVfSU5IRVJJVEFCTEVfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoT1NfU0VUX0hBTkRMRV9JTkhFUklUQUJMRV9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzI3MjIxOTg3Zjk4N2NmMyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTkxZTYyZDhlOGYxYjZhYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9wd2Rtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvcHdkbW9kdWxlLmMuaAppbmRleCBjYjE5MWEwLi5mOWUwNjQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9wd2Rtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3B3ZG1vZHVsZS5jLmgKQEAgLTMzLDggKzMzLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqYXJnOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmdfLCAiVTpnZXRwd25hbSIsICZhcmcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnXywgIlU6Z2V0cHduYW0iLCAmYXJnKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB3ZF9nZXRwd25hbV9pbXBsKG1vZHVsZSwgYXJnKTsKIAogZXhpdDoKQEAgLTY4LDQgKzY5LDQgQEAKICNpZm5kZWYgUFdEX0dFVFBXQUxMX01FVEhPRERFRgogICAgICNkZWZpbmUgUFdEX0dFVFBXQUxMX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKFBXRF9HRVRQV0FMTF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDBlYTFjNWM4MzJmMGMxYSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZmM0MWQ4ZDg4ZWMyMDZkOCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9weWV4cGF0LmMuaCBiL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCmluZGV4IGM1YjVjNzEuLmQ5Y2Y3M2QgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3B5ZXhwYXQuYy5oCkBAIC0yNSw4ICsyNSw5IEBACiAgICAgaW50IGlzZmluYWwgPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGk6UGFyc2UiLAotICAgICAgICAmZGF0YSwgJmlzZmluYWwpKQorICAgICAgICAmZGF0YSwgJmlzZmluYWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF94bWxwYXJzZXJfUGFyc2VfaW1wbChzZWxmLCBkYXRhLCBpc2ZpbmFsKTsKIAogZXhpdDoKQEAgLTYwLDggKzYxLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpiYXNlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOlNldEJhc2UiLCAmYmFzZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzOlNldEJhc2UiLCAmYmFzZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X3htbHBhcnNlcl9TZXRCYXNlX2ltcGwoc2VsZiwgYmFzZSk7CiAKIGV4aXQ6CkBAIC0xMjksOCArMTMxLDkgQEAKICAgICBjb25zdCBjaGFyICplbmNvZGluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInp8czpFeHRlcm5hbEVudGl0eVBhcnNlckNyZWF0ZSIsCi0gICAgICAgICZjb250ZXh0LCAmZW5jb2RpbmcpKQorICAgICAgICAmY29udGV4dCwgJmVuY29kaW5nKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB5ZXhwYXRfeG1scGFyc2VyX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlX2ltcGwoc2VsZiwgY29udGV4dCwgZW5jb2RpbmcpOwogCiBleGl0OgpAQCAtMTYwLDggKzE2Myw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGZsYWc7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6U2V0UGFyYW1FbnRpdHlQYXJzaW5nIiwgJmZsYWcpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpTZXRQYXJhbUVudGl0eVBhcnNpbmciLCAmZmxhZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBweWV4cGF0X3htbHBhcnNlcl9TZXRQYXJhbUVudGl0eVBhcnNpbmdfaW1wbChzZWxmLCBmbGFnKTsKIAogZXhpdDoKQEAgLTE5Myw4ICsxOTcsOSBAQAogICAgIGludCBmbGFnID0gMTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifHA6VXNlRm9yZWlnbkRURCIsCi0gICAgICAgICZmbGFnKSkKKyAgICAgICAgJmZsYWcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF94bWxwYXJzZXJfVXNlRm9yZWlnbkRURF9pbXBsKHNlbGYsIGZsYWcpOwogCiBleGl0OgpAQCAtMjQ0LDggKzI0OSw5IEBACiAgICAgUHlPYmplY3QgKmludGVybiA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8enpPOlBhcnNlckNyZWF0ZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJmVuY29kaW5nLCAmbmFtZXNwYWNlX3NlcGFyYXRvciwgJmludGVybikpCisgICAgICAgICZlbmNvZGluZywgJm5hbWVzcGFjZV9zZXBhcmF0b3IsICZpbnRlcm4pKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gcHlleHBhdF9QYXJzZXJDcmVhdGVfaW1wbChtb2R1bGUsIGVuY29kaW5nLCBuYW1lc3BhY2Vfc2VwYXJhdG9yLCBpbnRlcm4pOwogCiBleGl0OgpAQCAtMjcwLDggKzI3Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgbG9uZyBjb2RlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJsOkVycm9yU3RyaW5nIiwgJmNvZGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAibDpFcnJvclN0cmluZyIsICZjb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHB5ZXhwYXRfRXJyb3JTdHJpbmdfaW1wbChtb2R1bGUsIGNvZGUpOwogCiBleGl0OgpAQCAtMjgxLDQgKzI4OCw0IEBACiAjaWZuZGVmIFBZRVhQQVRfWE1MUEFSU0VSX1VTRUZPUkVJR05EVERfTUVUSE9EREVGCiAgICAgI2RlZmluZSBQWUVYUEFUX1hNTFBBUlNFUl9VU0VGT1JFSUdORFREX01FVEhPRERFRgogI2VuZGlmIC8qICFkZWZpbmVkKFBZRVhQQVRfWE1MUEFSU0VSX1VTRUZPUkVJR05EVERfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ0NzljZmFiNjA3ZTlkYzggaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTlkZTIxZjQ2NzM0YjEzMTEgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvc2hhMW1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy9zaGExbW9kdWxlLmMuaAppbmRleCA1YjhkYjgwLi44MDMwZmJkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zaGExbW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9zaGExbW9kdWxlLmMuaApAQCAtODUsMTEgKzg1LDEyIEBACiAgICAgUHlPYmplY3QgKnN0cmluZyA9IE5VTEw7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJ8TzpzaGExIiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nKSkKKyAgICAgICAgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc2hhMV9zaGExX2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGI2YTE5NGZiYjBiOTRmMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDc1YzRjYzc0OWFiMzFiMSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zaGEyNTZtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvc2hhMjU2bW9kdWxlLmMuaAppbmRleCA2NjE1NjljLi40ODMxMDlmIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zaGEyNTZtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3NoYTI1Nm1vZHVsZS5jLmgKQEAgLTg1LDggKzg1LDkgQEAKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTI1NiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgICAgICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTI1Nl9zaGEyNTZfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC0xMTMsMTEgKzExNCwxMiBAQAogICAgIFB5T2JqZWN0ICpzdHJpbmcgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE86c2hhMjI0IiwgX2tleXdvcmRzLAotICAgICAgICAmc3RyaW5nKSkKKyAgICAgICAgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfc2hhMjU2X3NoYTIyNF9pbXBsKG1vZHVsZSwgc3RyaW5nKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTVhMWZjNTQ4MGUzOTlmOTUgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWE0MWEyMWMwOGZjZGRkNzAgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvc2hhNTEybW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3NoYTUxMm1vZHVsZS5jLmgKaW5kZXggZDY0YzJhNC4uZWM1YTBjMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9jbGluaWMvc2hhNTEybW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy9zaGE1MTJtb2R1bGUuYy5oCkBAIC0xMDMsOCArMTAzLDkgQEAKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTUxMiIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgICAgICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTUxMl9zaGE1MTJfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC0xMzUsOCArMTM2LDkgQEAKICAgICBQeU9iamVjdCAqc3RyaW5nID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxPOnNoYTM4NCIsIF9rZXl3b3JkcywKLSAgICAgICAgJnN0cmluZykpCisgICAgICAgICZzdHJpbmcpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX3NoYTUxMl9zaGEzODRfaW1wbChtb2R1bGUsIHN0cmluZyk7CiAKIGV4aXQ6CkBAIC0xNjgsNCArMTcwLDQgQEAKICNpZm5kZWYgX1NIQTUxMl9TSEEzODRfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfU0hBNTEyX1NIQTM4NF9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfU0hBNTEyX1NIQTM4NF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YmI4N2Y0OTRkZjUwZmZjMCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZTMxNGMwZjc3M2FiZDVkNyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zaWduYWxtb2R1bGUuYy5oIGIvTW9kdWxlcy9jbGluaWMvc2lnbmFsbW9kdWxlLmMuaAppbmRleCBjOGY0Y2Q1Li5mOGQ1YmQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy9zaWduYWxtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3NpZ25hbG1vZHVsZS5jLmgKQEAgLTIzLDExICsyMywxMyBAQAogICAgIGludCBzZWNvbmRzOwogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTphbGFybSIsICZzZWNvbmRzKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6YWxhcm0iLCAmc2Vjb25kcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gc2lnbmFsX2FsYXJtX2ltcGwobW9kdWxlLCBzZWNvbmRzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtODUsOCArODcsOSBAQAogICAgIFB5T2JqZWN0ICpoYW5kbGVyOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpTzpzaWduYWwiLAotICAgICAgICAmc2lnbmFsbnVtLCAmaGFuZGxlcikpCisgICAgICAgICZzaWduYWxudW0sICZoYW5kbGVyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHNpZ25hbF9zaWduYWxfaW1wbChtb2R1bGUsIHNpZ25hbG51bSwgaGFuZGxlcik7CiAKIGV4aXQ6CkBAIC0xMTcsOCArMTIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgc2lnbmFsbnVtOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldHNpZ25hbCIsICZzaWduYWxudW0pKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRzaWduYWwiLCAmc2lnbmFsbnVtKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHNpZ25hbF9nZXRzaWduYWxfaW1wbChtb2R1bGUsIHNpZ25hbG51bSk7CiAKIGV4aXQ6CkBAIC0xNTAsOCArMTU0LDkgQEAKICAgICBpbnQgZmxhZzsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6c2lnaW50ZXJydXB0IiwKLSAgICAgICAgJnNpZ25hbG51bSwgJmZsYWcpKQorICAgICAgICAmc2lnbmFsbnVtLCAmZmxhZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfc2lnaW50ZXJydXB0X2ltcGwobW9kdWxlLCBzaWduYWxudW0sIGZsYWcpOwogCiBleGl0OgpAQCAtMTg5LDggKzE5NCw5IEBACiAgICAgZG91YmxlIGludGVydmFsID0gMC4wOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpZHxkOnNldGl0aW1lciIsCi0gICAgICAgICZ3aGljaCwgJnNlY29uZHMsICZpbnRlcnZhbCkpCisgICAgICAgICZ3aGljaCwgJnNlY29uZHMsICZpbnRlcnZhbCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfc2V0aXRpbWVyX2ltcGwobW9kdWxlLCB3aGljaCwgc2Vjb25kcywgaW50ZXJ2YWwpOwogCiBleGl0OgpAQCAtMjE5LDggKzIyNSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IHdoaWNoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldGl0aW1lciIsICZ3aGljaCkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmdldGl0aW1lciIsICZ3aGljaCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfZ2V0aXRpbWVyX2ltcGwobW9kdWxlLCB3aGljaCk7CiAKIGV4aXQ6CkBAIC0yNTEsOCArMjU4LDkgQEAKICAgICBQeU9iamVjdCAqbWFzazsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaU86cHRocmVhZF9zaWdtYXNrIiwKLSAgICAgICAgJmhvdywgJm1hc2spKQorICAgICAgICAmaG93LCAmbWFzaykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfcHRocmVhZF9zaWdtYXNrX2ltcGwobW9kdWxlLCBob3csIG1hc2spOwogCiBleGl0OgpAQCAtMzQ0LDggKzM1Miw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzaWd0aW1lZHdhaXQiLAogICAgICAgICAyLCAyLAotICAgICAgICAmc2lnc2V0LCAmdGltZW91dF9vYmopKQorICAgICAgICAmc2lnc2V0LCAmdGltZW91dF9vYmopKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gc2lnbmFsX3NpZ3RpbWVkd2FpdF9pbXBsKG1vZHVsZSwgc2lnc2V0LCB0aW1lb3V0X29iaik7CiAKIGV4aXQ6CkBAIC0zNzYsOCArMzg1LDkgQEAKICAgICBpbnQgc2lnbmFsbnVtOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJsaTpwdGhyZWFkX2tpbGwiLAotICAgICAgICAmdGhyZWFkX2lkLCAmc2lnbmFsbnVtKSkKKyAgICAgICAgJnRocmVhZF9pZCwgJnNpZ25hbG51bSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzaWduYWxfcHRocmVhZF9raWxsX2ltcGwobW9kdWxlLCB0aHJlYWRfaWQsIHNpZ25hbG51bSk7CiAKIGV4aXQ6CkBAIC00MjksNCArNDM5LDQgQEAKICNpZm5kZWYgU0lHTkFMX1BUSFJFQURfS0lMTF9NRVRIT0RERUYKICAgICAjZGVmaW5lIFNJR05BTF9QVEhSRUFEX0tJTExfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoU0lHTkFMX1BUSFJFQURfS0lMTF9NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGFmYTU5ODQxMmJmYjhkMiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzY5OTBlZjBkMGJhNzJiNiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NsaW5pYy9zcHdkbW9kdWxlLmMuaCBiL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCmluZGV4IGUyNmFjZjEuLmIyNDc5ZmYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCisrKyBiL01vZHVsZXMvY2xpbmljL3Nwd2Rtb2R1bGUuYy5oCkBAIC0yNCw4ICsyNCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmFyZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnXywgIlU6Z2V0c3BuYW0iLCAmYXJnKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZ18sICJVOmdldHNwbmFtIiwgJmFyZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBzcHdkX2dldHNwbmFtX2ltcGwobW9kdWxlLCBhcmcpOwogCiBleGl0OgpAQCAtNjUsNCArNjYsNCBAQAogI2lmbmRlZiBTUFdEX0dFVFNQQUxMX01FVEhPRERFRgogICAgICNkZWZpbmUgU1BXRF9HRVRTUEFMTF9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChTUFdEX0dFVFNQQUxMX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MTBmNjgxYjM2ZjU0YzMwIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wN2NkOGFmMGFmZDc3ZmU3IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvY2xpbmljL3VuaWNvZGVkYXRhLmMuaCBiL01vZHVsZXMvY2xpbmljL3VuaWNvZGVkYXRhLmMuaAppbmRleCBkNTIwYzFlLi5kNDgxY2NiIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy91bmljb2RlZGF0YS5jLmgKKysrIGIvTW9kdWxlcy9jbGluaWMvdW5pY29kZWRhdGEuYy5oCkBAIC0yNyw4ICsyNyw5IEBACiAgICAgUHlPYmplY3QgKmRlZmF1bHRfdmFsdWUgPSBOVUxMOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJDfE86ZGVjaW1hbCIsCi0gICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2RlY2ltYWxfaW1wbChzZWxmLCBjaHIsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtNTksOCArNjAsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOmRpZ2l0IiwKLSAgICAgICAgJmNociwgJmRlZmF1bHRfdmFsdWUpKQorICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfZGlnaXRfaW1wbChzZWxmLCBjaHIsIGRlZmF1bHRfdmFsdWUpOwogCiBleGl0OgpAQCAtOTIsOCArOTQsOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOm51bWVyaWMiLAotICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9udW1lcmljX2ltcGwoc2VsZiwgY2hyLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTExOCw4ICsxMjEsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjaHI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6Y2F0ZWdvcnkiLCAmY2hyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6Y2F0ZWdvcnkiLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9jYXRlZ29yeV9pbXBsKHNlbGYsIGNocik7CiAKIGV4aXQ6CkBAIC0xNDYsOCArMTUwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgY2hyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmJpZGlyZWN0aW9uYWwiLCAmY2hyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6YmlkaXJlY3Rpb25hbCIsICZjaHIpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2JpZGlyZWN0aW9uYWxfaW1wbChzZWxmLCBjaHIpOwogCiBleGl0OgpAQCAtMTc1LDExICsxODAsMTMgQEAKICAgICBpbnQgY2hyOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmNvbWJpbmluZyIsICZjaHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpjb21iaW5pbmciLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfY29tYmluaW5nX2ltcGwoc2VsZiwgY2hyKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjA4LDExICsyMTUsMTMgQEAKICAgICBpbnQgY2hyOwogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOm1pcnJvcmVkIiwgJmNocikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOm1pcnJvcmVkIiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX21pcnJvcmVkX2ltcGwoc2VsZiwgY2hyKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKChsb25nKV9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMjM3LDggKzI0Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgaW50IGNocjsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzplYXN0X2FzaWFuX3dpZHRoIiwgJmNocikpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOmVhc3RfYXNpYW5fd2lkdGgiLCAmY2hyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9lYXN0X2FzaWFuX3dpZHRoX2ltcGwoc2VsZiwgY2hyKTsKIAogZXhpdDoKQEAgLTI2NSw4ICsyNzUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCBjaHI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6ZGVjb21wb3NpdGlvbiIsICZjaHIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpkZWNvbXBvc2l0aW9uIiwgJmNocikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB1bmljb2RlZGF0YV9VQ0RfZGVjb21wb3NpdGlvbl9pbXBsKHNlbGYsIGNocik7CiAKIGV4aXQ6CkBAIC0yOTYsOCArMzA3LDkgQEAKICAgICBQeU9iamVjdCAqaW5wdXQ7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNPITpub3JtYWxpemUiLAotICAgICAgICAmZm9ybSwgJlB5VW5pY29kZV9UeXBlLCAmaW5wdXQpKQorICAgICAgICAmZm9ybSwgJlB5VW5pY29kZV9UeXBlLCAmaW5wdXQpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX25vcm1hbGl6ZV9pbXBsKHNlbGYsIGZvcm0sIGlucHV0KTsKIAogZXhpdDoKQEAgLTMyNyw4ICszMzksOSBAQAogICAgIFB5T2JqZWN0ICpkZWZhdWx0X3ZhbHVlID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiQ3xPOm5hbWUiLAotICAgICAgICAmY2hyLCAmZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICZjaHIsICZkZWZhdWx0X3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHVuaWNvZGVkYXRhX1VDRF9uYW1lX2ltcGwoc2VsZiwgY2hyLCBkZWZhdWx0X3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM1OCwxMSArMzcxLDEyIEBACiAgICAgY29uc3QgY2hhciAqbmFtZTsKICAgICBQeV9zc2l6ZV9jbGVhbl90IG5hbWVfbGVuZ3RoOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJzIzpsb29rdXAiLCAmbmFtZSwgJm5hbWVfbGVuZ3RoKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInMjOmxvb2t1cCIsICZuYW1lLCAmbmFtZV9sZW5ndGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gdW5pY29kZWRhdGFfVUNEX2xvb2t1cF9pbXBsKHNlbGYsIG5hbWUsIG5hbWVfbGVuZ3RoKTsKIAogZXhpdDoKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTRmOGRhMzNjNmJjNmVmYzkgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUzMTNjZTEyOWRhODdiMmYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jbGluaWMvemxpYm1vZHVsZS5jLmggYi9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaAppbmRleCA3MWRhMDI3Li4xYjJiN2ZlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaAorKysgYi9Nb2R1bGVzL2NsaW5pYy96bGlibW9kdWxlLmMuaApAQCAtMywzOCArMyw0MSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBQeURvY19TVFJWQVIoemxpYl9jb21wcmVzc19fZG9jX18sCi0iY29tcHJlc3MoJG1vZHVsZSwgYnl0ZXMsIGxldmVsPVpfREVGQVVMVF9DT01QUkVTU0lPTiwgLylcbiIKKyJjb21wcmVzcygkbW9kdWxlLCBkYXRhLCAvLCBsZXZlbD1aX0RFRkFVTFRfQ09NUFJFU1NJT04pXG4iCiAiLS1cbiIKICJcbiIKICJSZXR1cm5zIGEgYnl0ZXMgb2JqZWN0IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBkYXRhLlxuIgogIlxuIgotIiAgYnl0ZXNcbiIKKyIgIGRhdGFcbiIKICIgICAgQmluYXJ5IGRhdGEgdG8gYmUgY29tcHJlc3NlZC5cbiIKICIgIGxldmVsXG4iCi0iICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkuIik7CisiICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkgb3IgLTEuIik7CiAKICNkZWZpbmUgWkxJQl9DT01QUkVTU19NRVRIT0RERUYgICAgXAotICAgIHsiY29tcHJlc3MiLCAoUHlDRnVuY3Rpb24pemxpYl9jb21wcmVzcywgTUVUSF9WQVJBUkdTLCB6bGliX2NvbXByZXNzX19kb2NfX30sCisgICAgeyJjb21wcmVzcyIsIChQeUNGdW5jdGlvbil6bGliX2NvbXByZXNzLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywgemxpYl9jb21wcmVzc19fZG9jX199LAogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzc19pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqYnl0ZXMsIGludCBsZXZlbCk7Cit6bGliX2NvbXByZXNzX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpkYXRhLCBpbnQgbGV2ZWwpOwogCiBzdGF0aWMgUHlPYmplY3QgKgotemxpYl9jb21wcmVzcyhQeU9iamVjdCAqbW9kdWxlLCBQeU9iamVjdCAqYXJncykKK3psaWJfY29tcHJlc3MoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCiB7CiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7Ci0gICAgUHlfYnVmZmVyIGJ5dGVzID0ge05VTEwsIE5VTEx9OworICAgIHN0YXRpYyBjaGFyICpfa2V5d29yZHNbXSA9IHsiIiwgImxldmVsIiwgTlVMTH07CisgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAgICAgaW50IGxldmVsID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnxpOmNvbXByZXNzIiwKLSAgICAgICAgJmJ5dGVzLCAmbGV2ZWwpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInkqfGk6Y29tcHJlc3MiLCBfa2V5d29yZHMsCisgICAgICAgICZkYXRhLCAmbGV2ZWwpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKLSAgICByZXR1cm5fdmFsdWUgPSB6bGliX2NvbXByZXNzX2ltcGwobW9kdWxlLCAmYnl0ZXMsIGxldmVsKTsKKyAgICB9CisgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9jb21wcmVzc19pbXBsKG1vZHVsZSwgJmRhdGEsIGxldmVsKTsKIAogZXhpdDoKLSAgICAvKiBDbGVhbnVwIGZvciBieXRlcyAqLwotICAgIGlmIChieXRlcy5vYmopCi0gICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmYnl0ZXMpOworICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KKyAgICBpZiAoZGF0YS5vYmopIHsKKyAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZkYXRhKTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtNjgsMTQgKzcxLDE2IEBACiAgICAgdW5zaWduZWQgaW50IGJ1ZnNpemUgPSBERUZfQlVGX1NJWkU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfGlPJjpkZWNvbXByZXNzIiwKLSAgICAgICAgJmRhdGEsICZ3Yml0cywgY2FwcGVkX3VpbnRfY29udmVydGVyLCAmYnVmc2l6ZSkpCisgICAgICAgICZkYXRhLCAmd2JpdHMsIGNhcHBlZF91aW50X2NvbnZlcnRlciwgJmJ1ZnNpemUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9kZWNvbXByZXNzX2ltcGwobW9kdWxlLCAmZGF0YSwgd2JpdHMsIGJ1ZnNpemUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTEzMCwxNCArMTM1LDE2IEBACiAgICAgUHlfYnVmZmVyIHpkaWN0ID0ge05VTEwsIE5VTEx9OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifGlpaWlpeSo6Y29tcHJlc3NvYmoiLCBfa2V5d29yZHMsCi0gICAgICAgICZsZXZlbCwgJm1ldGhvZCwgJndiaXRzLCAmbWVtTGV2ZWwsICZzdHJhdGVneSwgJnpkaWN0KSkKKyAgICAgICAgJmxldmVsLCAmbWV0aG9kLCAmd2JpdHMsICZtZW1MZXZlbCwgJnN0cmF0ZWd5LCAmemRpY3QpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9jb21wcmVzc29ial9pbXBsKG1vZHVsZSwgbGV2ZWwsIG1ldGhvZCwgd2JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSwgJnpkaWN0KTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciB6ZGljdCAqLwotICAgIGlmICh6ZGljdC5vYmopCisgICAgaWYgKHpkaWN0Lm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnpkaWN0KTsKKyAgICB9CiAKICAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwogfQpAQCAtMTY5LDggKzE3Niw5IEBACiAgICAgUHlPYmplY3QgKnpkaWN0ID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInxpTzpkZWNvbXByZXNzb2JqIiwgX2tleXdvcmRzLAotICAgICAgICAmd2JpdHMsICZ6ZGljdCkpCisgICAgICAgICZ3Yml0cywgJnpkaWN0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfZGVjb21wcmVzc29ial9pbXBsKG1vZHVsZSwgd2JpdHMsIHpkaWN0KTsKIAogZXhpdDoKQEAgLTIwMiwxNCArMjEwLDE2IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlfYnVmZmVyIGRhdGEgPSB7TlVMTCwgTlVMTH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInkqOmNvbXByZXNzIiwgJmRhdGEpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAieSo6Y29tcHJlc3MiLCAmZGF0YSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX0NvbXByZXNzX2NvbXByZXNzX2ltcGwoc2VsZiwgJmRhdGEpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTI0NiwxNCArMjU2LDE2IEBACiAgICAgdW5zaWduZWQgaW50IG1heF9sZW5ndGggPSAwOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ5KnxPJjpkZWNvbXByZXNzIiwKLSAgICAgICAgJmRhdGEsIGNhcHBlZF91aW50X2NvbnZlcnRlciwgJm1heF9sZW5ndGgpKQorICAgICAgICAmZGF0YSwgY2FwcGVkX3VpbnRfY29udmVydGVyLCAmbWF4X2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX0RlY29tcHJlc3NfZGVjb21wcmVzc19pbXBsKHNlbGYsICZkYXRhLCBtYXhfbGVuZ3RoKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC0yODMsOCArMjk1LDkgQEAKICAgICBpbnQgbW9kZSA9IFpfRklOSVNIOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8aTpmbHVzaCIsCi0gICAgICAgICZtb2RlKSkKKyAgICAgICAgJm1vZGUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gemxpYl9Db21wcmVzc19mbHVzaF9pbXBsKHNlbGYsIG1vZGUpOwogCiBleGl0OgpAQCAtMzU3LDggKzM3MCw5IEBACiAgICAgdW5zaWduZWQgaW50IGxlbmd0aCA9IERFRl9CVUZfU0laRTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifE8mOmZsdXNoIiwKLSAgICAgICAgY2FwcGVkX3VpbnRfY29udmVydGVyLCAmbGVuZ3RoKSkKKyAgICAgICAgY2FwcGVkX3VpbnRfY29udmVydGVyLCAmbGVuZ3RoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfRGVjb21wcmVzc19mbHVzaF9pbXBsKHNlbGYsIGxlbmd0aCk7CiAKIGV4aXQ6CkBAIC0zOTAsMTQgKzQwNCwxNiBAQAogICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IDE7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfEk6YWRsZXIzMiIsCi0gICAgICAgICZkYXRhLCAmdmFsdWUpKQorICAgICAgICAmZGF0YSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHpsaWJfYWRsZXIzMl9pbXBsKG1vZHVsZSwgJmRhdGEsIHZhbHVlKTsKIAogZXhpdDoKICAgICAvKiBDbGVhbnVwIGZvciBkYXRhICovCi0gICAgaWYgKGRhdGEub2JqKQorICAgIGlmIChkYXRhLm9iaikgewogICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJmRhdGEpOworICAgIH0KIAogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9CkBAIC00MjcsMTQgKzQ0MywxNiBAQAogICAgIHVuc2lnbmVkIGludCB2YWx1ZSA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInkqfEk6Y3JjMzIiLAotICAgICAgICAmZGF0YSwgJnZhbHVlKSkKKyAgICAgICAgJmRhdGEsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB6bGliX2NyYzMyX2ltcGwobW9kdWxlLCAmZGF0YSwgdmFsdWUpOwogCiBleGl0OgogICAgIC8qIENsZWFudXAgZm9yIGRhdGEgKi8KLSAgICBpZiAoZGF0YS5vYmopCisgICAgaWYgKGRhdGEub2JqKSB7CiAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmZGF0YSk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KQEAgLTQ0Miw0ICs0NjAsNCBAQAogI2lmbmRlZiBaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGCiAgICAgI2RlZmluZSBaTElCX0NPTVBSRVNTX0NPUFlfTUVUSE9EREVGCiAjZW5kaWYgLyogIWRlZmluZWQoWkxJQl9DT01QUkVTU19DT1BZX01FVEhPRERFRikgKi8KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04NTQ1NTY1YjFhMTgyMmRlIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MTk0NDZhZjkxMmY0ZTcyIGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMgYi9Nb2R1bGVzL2ZhdWx0aGFuZGxlci5jCmluZGV4IGYxZmRhNDguLmQ2MzIyZDAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZmF1bHRoYW5kbGVyLmMKKysrIGIvTW9kdWxlcy9mYXVsdGhhbmRsZXIuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgaGFuZGxlciBmYWlscyBpbiBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IoKSAqLwogICAgIHtTSUdTRUdWLCAwLCAiU2VnbWVudGF0aW9uIGZhdWx0IiwgfQogfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZhdWx0aGFuZGxlcl9uc2lnbmFscyA9IFwKK3N0YXRpYyBjb25zdCBzaXplX3QgZmF1bHRoYW5kbGVyX25zaWduYWxzID0gXAogICAgIFB5X0FSUkFZX0xFTkdUSChmYXVsdGhhbmRsZXJfaGFuZGxlcnMpOwogCiAjaWZkZWYgSEFWRV9TSUdBTFRTVEFDSwpAQCAtMjAyLDggKzIwMiw5IEBACiBzdGF0aWMgUHlUaHJlYWRTdGF0ZSoKIGdldF90aHJlYWRfc3RhdGUodm9pZCkKIHsKLSAgICBQeVRocmVhZFN0YXRlICp0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOwogICAgIGlmICh0c3RhdGUgPT0gTlVMTCkgeworICAgICAgICAvKiBqdXN0IGluIGNhc2UgYnV0IHZlcnkgdW5saWtlbHkuLi4gKi8KICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gZ2V0IHRoZSBjdXJyZW50IHRocmVhZCBzdGF0ZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTIzNCwxMSArMjM1LDEyIEBACiAgICAgICAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUoKS4gKi8KICAgICB0c3RhdGUgPSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSgpOwogI2Vsc2UKLSAgICB0c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dldCgpOworICAgIHRzdGF0ZSA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOwogI2VuZGlmCiAKLSAgICBpZiAoYWxsX3RocmVhZHMpCi0gICAgICAgIF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyhmZCwgaW50ZXJwLCB0c3RhdGUpOworICAgIGlmIChhbGxfdGhyZWFkcykgeworICAgICAgICAodm9pZClfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIE5VTEwsIHRzdGF0ZSk7CisgICAgfQogICAgIGVsc2UgewogICAgICAgICBpZiAodHN0YXRlICE9IE5VTEwpCiAgICAgICAgICAgICBfUHlfRHVtcFRyYWNlYmFjayhmZCwgdHN0YXRlKTsKQEAgLTI3Miw3ICsyNzQsNyBAQAogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChhbGxfdGhyZWFkcykgewotICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIHRzdGF0ZS0+aW50ZXJwLCB0c3RhdGUpOworICAgICAgICBlcnJtc2cgPSBfUHlfRHVtcFRyYWNlYmFja1RocmVhZHMoZmQsIE5VTEwsIHRzdGF0ZSk7CiAgICAgICAgIGlmIChlcnJtc2cgIT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgZXJybXNnKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjg4LDYgKzI5MCwxOSBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCitzdGF0aWMgdm9pZAorZmF1bHRoYW5kbGVyX2Rpc2FibGVfZmF0YWxfaGFuZGxlcihmYXVsdF9oYW5kbGVyX3QgKmhhbmRsZXIpCit7CisgICAgaWYgKCFoYW5kbGVyLT5lbmFibGVkKQorICAgICAgICByZXR1cm47CisgICAgaGFuZGxlci0+ZW5hYmxlZCA9IDA7CisjaWZkZWYgSEFWRV9TSUdBQ1RJT04KKyAgICAodm9pZClzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmaGFuZGxlci0+cHJldmlvdXMsIE5VTEwpOworI2Vsc2UKKyAgICAodm9pZClzaWduYWwoaGFuZGxlci0+c2lnbnVtLCBoYW5kbGVyLT5wcmV2aW91cyk7CisjZW5kaWYKK30KKwogCiAvKiBIYW5kbGVyIGZvciBTSUdTRUdWLCBTSUdGUEUsIFNJR0FCUlQsIFNJR0JVUyBhbmQgU0lHSUxMIHNpZ25hbHMuCiAKQEAgLTMwNiw3ICszMjEsNyBAQAogZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yKGludCBzaWdudW0pCiB7CiAgICAgY29uc3QgaW50IGZkID0gZmF0YWxfZXJyb3IuZmQ7Ci0gICAgdW5zaWduZWQgaW50IGk7CisgICAgc2l6ZV90IGk7CiAgICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyID0gTlVMTDsKICAgICBpbnQgc2F2ZV9lcnJubyA9IGVycm5vOwogCkBAIC0zMjQsMTIgKzMzOSw3IEBACiAgICAgfQogCiAgICAgLyogcmVzdG9yZSB0aGUgcHJldmlvdXMgaGFuZGxlciAqLwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0gICAgKHZvaWQpc2lnYWN0aW9uKHNpZ251bSwgJmhhbmRsZXItPnByZXZpb3VzLCBOVUxMKTsKLSNlbHNlCi0gICAgKHZvaWQpc2lnbmFsKHNpZ251bSwgaGFuZGxlci0+cHJldmlvdXMpOwotI2VuZGlmCi0gICAgaGFuZGxlci0+ZW5hYmxlZCA9IDA7CisgICAgZmF1bHRoYW5kbGVyX2Rpc2FibGVfZmF0YWxfaGFuZGxlcihoYW5kbGVyKTsKIAogICAgIFBVVFMoZmQsICJGYXRhbCBQeXRob24gZXJyb3I6ICIpOwogICAgIFBVVFMoZmQsIGhhbmRsZXItPm5hbWUpOwpAQCAtMzUxLDIwICszNjEsMTE3IEBACiAgICAgcmFpc2Uoc2lnbnVtKTsKIH0KIAorI2lmZGVmIE1TX1dJTkRPV1MKK3N0YXRpYyBMT05HIFdJTkFQSQorZmF1bHRoYW5kbGVyX2V4Y19oYW5kbGVyKHN0cnVjdCBfRVhDRVBUSU9OX1BPSU5URVJTICpleGNfaW5mbykKK3sKKyAgICBjb25zdCBpbnQgZmQgPSBmYXRhbF9lcnJvci5mZDsKKyAgICBEV09SRCBjb2RlID0gZXhjX2luZm8tPkV4Y2VwdGlvblJlY29yZC0+RXhjZXB0aW9uQ29kZTsKKyAgICBEV09SRCBmbGFncyA9IGV4Y19pbmZvLT5FeGNlcHRpb25SZWNvcmQtPkV4Y2VwdGlvbkZsYWdzOworCisgICAgLyogb25seSBsb2cgZmF0YWwgZXhjZXB0aW9ucyAqLworICAgIGlmIChmbGFncyAmIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRSkgeworICAgICAgICAvKiBjYWxsIHRoZSBuZXh0IGV4Y2VwdGlvbiBoYW5kbGVyICovCisgICAgICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworICAgIH0KKworICAgIFBVVFMoZmQsICJXaW5kb3dzIGZhdGFsIGV4Y2VwdGlvbjogIik7CisgICAgc3dpdGNoIChjb2RlKQorICAgIHsKKyAgICAvKiBvbmx5IGZvcm1hdCBtb3N0IGNvbW1vbiBlcnJvcnMgKi8KKyAgICBjYXNlIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OOiBQVVRTKGZkLCAiYWNjZXNzIHZpb2xhdGlvbiIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfRElWSURFX0JZX1pFUk86IFBVVFMoZmQsICJmbG9hdCBkaXZpZGUgYnkgemVybyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9GTFRfT1ZFUkZMT1c6IFBVVFMoZmQsICJmbG9hdCBvdmVyZmxvdyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk86IFBVVFMoZmQsICJpbnQgZGl2aWRlIGJ5IHplcm8iKTsgYnJlYWs7CisgICAgY2FzZSBFWENFUFRJT05fSU5UX09WRVJGTE9XOiBQVVRTKGZkLCAiaW50ZWdlciBvdmVyZmxvdyIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9JTl9QQUdFX0VSUk9SOiBQVVRTKGZkLCAicGFnZSBlcnJvciIpOyBicmVhazsKKyAgICBjYXNlIEVYQ0VQVElPTl9TVEFDS19PVkVSRkxPVzogUFVUUyhmZCwgInN0YWNrIG92ZXJmbG93Iik7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFBVVFMoZmQsICJjb2RlICIpOworICAgICAgICBfUHlfRHVtcERlY2ltYWwoZmQsIGNvZGUpOworICAgIH0KKyAgICBQVVRTKGZkLCAiXG5cbiIpOworCisgICAgaWYgKGNvZGUgPT0gRVhDRVBUSU9OX0FDQ0VTU19WSU9MQVRJT04pIHsKKyAgICAgICAgLyogZGlzYWJsZSBzaWduYWwgaGFuZGxlciBmb3IgU0lHU0VHViAqLworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBmYXVsdGhhbmRsZXJfbnNpZ25hbHM7IGkrKykgeworICAgICAgICAgICAgZmF1bHRfaGFuZGxlcl90ICpoYW5kbGVyID0gJmZhdWx0aGFuZGxlcl9oYW5kbGVyc1tpXTsKKyAgICAgICAgICAgIGlmIChoYW5kbGVyLT5zaWdudW0gPT0gU0lHU0VHVikgeworICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9kaXNhYmxlX2ZhdGFsX2hhbmRsZXIoaGFuZGxlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmYXVsdGhhbmRsZXJfZHVtcF90cmFjZWJhY2soZmQsIGZhdGFsX2Vycm9yLmFsbF90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXRhbF9lcnJvci5pbnRlcnApOworCisgICAgLyogY2FsbCB0aGUgbmV4dCBleGNlcHRpb24gaGFuZGxlciAqLworICAgIHJldHVybiBFWENFUFRJT05fQ09OVElOVUVfU0VBUkNIOworfQorI2VuZGlmCisKIC8qIEluc3RhbGwgdGhlIGhhbmRsZXIgZm9yIGZhdGFsIHNpZ25hbHMsIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcigpLiAqLwogCitzdGF0aWMgaW50CitmYXVsdGhhbmRsZXJfZW5hYmxlKHZvaWQpCit7CisgICAgc2l6ZV90IGk7CisKKyAgICBpZiAoZmF0YWxfZXJyb3IuZW5hYmxlZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZmF0YWxfZXJyb3IuZW5hYmxlZCA9IDE7CisKKyAgICBmb3IgKGk9MDsgaSA8IGZhdWx0aGFuZGxlcl9uc2lnbmFsczsgaSsrKSB7CisgICAgICAgIGZhdWx0X2hhbmRsZXJfdCAqaGFuZGxlcjsKKyNpZmRlZiBIQVZFX1NJR0FDVElPTgorICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKKyNlbmRpZgorICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGhhbmRsZXIgPSAmZmF1bHRoYW5kbGVyX2hhbmRsZXJzW2ldOworICAgICAgICBhc3NlcnQoIWhhbmRsZXItPmVuYWJsZWQpOworI2lmZGVmIEhBVkVfU0lHQUNUSU9OCisgICAgICAgIGFjdGlvbi5zYV9oYW5kbGVyID0gZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yOworICAgICAgICBzaWdlbXB0eXNldCgmYWN0aW9uLnNhX21hc2spOworICAgICAgICAvKiBEbyBub3QgcHJldmVudCB0aGUgc2lnbmFsIGZyb20gYmVpbmcgcmVjZWl2ZWQgZnJvbSB3aXRoaW4KKyAgICAgICAgICAgaXRzIG93biBzaWduYWwgaGFuZGxlciAqLworICAgICAgICBhY3Rpb24uc2FfZmxhZ3MgPSBTQV9OT0RFRkVSOworI2lmZGVmIEhBVkVfU0lHQUxUU1RBQ0sKKyAgICAgICAgaWYgKHN0YWNrLnNzX3NwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIENhbGwgdGhlIHNpZ25hbCBoYW5kbGVyIG9uIGFuIGFsdGVybmF0ZSBzaWduYWwgc3RhY2sKKyAgICAgICAgICAgICAgIHByb3ZpZGVkIGJ5IHNpZ2FsdHN0YWNrKCkgKi8KKyAgICAgICAgICAgIGFjdGlvbi5zYV9mbGFncyB8PSBTQV9PTlNUQUNLOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZXJyID0gc2lnYWN0aW9uKGhhbmRsZXItPnNpZ251bSwgJmFjdGlvbiwgJmhhbmRsZXItPnByZXZpb3VzKTsKKyNlbHNlCisgICAgICAgIGhhbmRsZXItPnByZXZpb3VzID0gc2lnbmFsKGhhbmRsZXItPnNpZ251bSwKKyAgICAgICAgICAgICAgICBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3IpOworICAgICAgICBlcnIgPSAoaGFuZGxlci0+cHJldmlvdXMgPT0gU0lHX0VSUik7CisjZW5kaWYKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX1J1bnRpbWVFcnJvcik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBoYW5kbGVyLT5lbmFibGVkID0gMTsKKyAgICB9CisKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgQWRkVmVjdG9yZWRFeGNlcHRpb25IYW5kbGVyKDEsIGZhdWx0aGFuZGxlcl9leGNfaGFuZGxlcik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIFB5T2JqZWN0KgotZmF1bHRoYW5kbGVyX2VuYWJsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MpCitmYXVsdGhhbmRsZXJfcHlfZW5hYmxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3YXJncykKIHsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImZpbGUiLCAiYWxsX3RocmVhZHMiLCBOVUxMfTsKICAgICBQeU9iamVjdCAqZmlsZSA9IE5VTEw7CiAgICAgaW50IGFsbF90aHJlYWRzID0gMTsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBmYXVsdF9oYW5kbGVyX3QgKmhhbmRsZXI7Ci0jaWZkZWYgSEFWRV9TSUdBQ1RJT04KLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIGFjdGlvbjsKLSNlbmRpZgotICAgIGludCBlcnI7CiAgICAgaW50IGZkOwogICAgIFB5VGhyZWFkU3RhdGUgKnRzdGF0ZTsKIApAQCAtMzg2LDM3ICs0OTMsMTAgQEAKICAgICBmYXRhbF9lcnJvci5hbGxfdGhyZWFkcyA9IGFsbF90aHJlYWRzOwogICAgIGZhdGFsX2Vycm9yLmludGVycCA9IHRzdGF0ZS0+aW50ZXJwOwogCi0gICAgaWYgKCFmYXRhbF9lcnJvci5lbmFibGVkKSB7Ci0gICAgICAgIGZhdGFsX2Vycm9yLmVuYWJsZWQgPSAxOwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgZmF1bHRoYW5kbGVyX25zaWduYWxzOyBpKyspIHsKLSAgICAgICAgICAgIGhhbmRsZXIgPSAmZmF1bHRoYW5kbGVyX2hhbmRsZXJzW2ldOwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0gICAgICAgICAgICBhY3Rpb24uc2FfaGFuZGxlciA9IGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcjsKLSAgICAgICAgICAgIHNpZ2VtcHR5c2V0KCZhY3Rpb24uc2FfbWFzayk7Ci0gICAgICAgICAgICAvKiBEbyBub3QgcHJldmVudCB0aGUgc2lnbmFsIGZyb20gYmVpbmcgcmVjZWl2ZWQgZnJvbSB3aXRoaW4KLSAgICAgICAgICAgICAgIGl0cyBvd24gc2lnbmFsIGhhbmRsZXIgKi8KLSAgICAgICAgICAgIGFjdGlvbi5zYV9mbGFncyA9IFNBX05PREVGRVI7Ci0jaWZkZWYgSEFWRV9TSUdBTFRTVEFDSwotICAgICAgICAgICAgaWYgKHN0YWNrLnNzX3NwICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvKiBDYWxsIHRoZSBzaWduYWwgaGFuZGxlciBvbiBhbiBhbHRlcm5hdGUgc2lnbmFsIHN0YWNrCi0gICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgYnkgc2lnYWx0c3RhY2soKSAqLwotICAgICAgICAgICAgICAgIGFjdGlvbi5zYV9mbGFncyB8PSBTQV9PTlNUQUNLOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBlcnIgPSBzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmYWN0aW9uLCAmaGFuZGxlci0+cHJldmlvdXMpOwotI2Vsc2UKLSAgICAgICAgICAgIGhhbmRsZXItPnByZXZpb3VzID0gc2lnbmFsKGhhbmRsZXItPnNpZ251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdWx0aGFuZGxlcl9mYXRhbF9lcnJvcik7Ci0gICAgICAgICAgICBlcnIgPSAoaGFuZGxlci0+cHJldmlvdXMgPT0gU0lHX0VSUik7Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmIChlcnIpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfUnVudGltZUVycm9yKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZXItPmVuYWJsZWQgPSAxOwotICAgICAgICB9CisgICAgaWYgKGZhdWx0aGFuZGxlcl9lbmFibGUoKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQorCiAgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKQEAgLTQzMCwxNCArNTEwLDcgQEAKICAgICAgICAgZmF0YWxfZXJyb3IuZW5hYmxlZCA9IDA7CiAgICAgICAgIGZvciAoaT0wOyBpIDwgZmF1bHRoYW5kbGVyX25zaWduYWxzOyBpKyspIHsKICAgICAgICAgICAgIGhhbmRsZXIgPSAmZmF1bHRoYW5kbGVyX2hhbmRsZXJzW2ldOwotICAgICAgICAgICAgaWYgKCFoYW5kbGVyLT5lbmFibGVkKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotI2lmZGVmIEhBVkVfU0lHQUNUSU9OCi0gICAgICAgICAgICAodm9pZClzaWdhY3Rpb24oaGFuZGxlci0+c2lnbnVtLCAmaGFuZGxlci0+cHJldmlvdXMsIE5VTEwpOwotI2Vsc2UKLSAgICAgICAgICAgICh2b2lkKXNpZ25hbChoYW5kbGVyLT5zaWdudW0sIGhhbmRsZXItPnByZXZpb3VzKTsKLSNlbmRpZgotICAgICAgICAgICAgaGFuZGxlci0+ZW5hYmxlZCA9IDA7CisgICAgICAgICAgICBmYXVsdGhhbmRsZXJfZGlzYWJsZV9mYXRhbF9oYW5kbGVyKGhhbmRsZXIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NjksNyArNTQyLDYgQEAKIHsKICAgICBQeUxvY2tTdGF0dXMgc3Q7CiAgICAgY29uc3QgY2hhciogZXJybXNnOwotICAgIFB5VGhyZWFkU3RhdGUgKmN1cnJlbnQ7CiAgICAgaW50IG9rOwogI2lmIGRlZmluZWQoSEFWRV9QVEhSRUFEX1NJR01BU0spICYmICFkZWZpbmVkKEhBVkVfQlJPS0VOX1BUSFJFQURfU0lHTUFTSykKICAgICBzaWdzZXRfdCBzZXQ7CkBAIC00ODksMTIgKzU2MSw5IEBACiAgICAgICAgIC8qIFRpbWVvdXQgPT4gZHVtcCB0cmFjZWJhY2sgKi8KICAgICAgICAgYXNzZXJ0KHN0ID09IFBZX0xPQ0tfRkFJTFVSRSk7CiAKLSAgICAgICAgLyogZ2V0IHRoZSB0aHJlYWQgaG9sZGluZyB0aGUgR0lMLCBOVUxMIGlmIG5vIHRocmVhZCBob2xkIHRoZSBHSUwgKi8KLSAgICAgICAgY3VycmVudCA9IF9QeVRocmVhZFN0YXRlX1VuY2hlY2tlZEdldCgpOwotCiAgICAgICAgIF9QeV93cml0ZV9ub3JhaXNlKHRocmVhZC5mZCwgdGhyZWFkLmhlYWRlciwgKGludCl0aHJlYWQuaGVhZGVyX2xlbik7CiAKLSAgICAgICAgZXJybXNnID0gX1B5X0R1bXBUcmFjZWJhY2tUaHJlYWRzKHRocmVhZC5mZCwgdGhyZWFkLmludGVycCwgY3VycmVudCk7CisgICAgICAgIGVycm1zZyA9IF9QeV9EdW1wVHJhY2ViYWNrVGhyZWFkcyh0aHJlYWQuZmQsIHRocmVhZC5pbnRlcnAsIE5VTEwpOwogICAgICAgICBvayA9IChlcnJtc2cgPT0gTlVMTCk7CiAKICAgICAgICAgaWYgKHRocmVhZC5leGl0KQpAQCAtODk0LDcgKzk2Myw3IEBACiBmYXVsdGhhbmRsZXJfc2lnc2VndihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgaW50IHJlbGVhc2VfZ2lsID0gMDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOl9yZWFkX251bGwiLCAmcmVsZWFzZV9naWwpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifGk6X3NpZ3NlZ3YiLCAmcmVsZWFzZV9naWwpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGlmIChyZWxlYXNlX2dpbCkgewpAQCAtOTA3LDYgKzk3Niw0OSBAQAogICAgIFB5X1JFVFVSTl9OT05FOwogfQogCisjaWZkZWYgV0lUSF9USFJFQUQKK3N0YXRpYyB2b2lkCitmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfdGhyZWFkKHZvaWQgKnBsb2NrKQoreworICAgIFB5VGhyZWFkX3R5cGVfbG9jayAqbG9jayA9IChQeVRocmVhZF90eXBlX2xvY2sgKilwbG9jazsKKworICAgIFB5X0ZhdGFsRXJyb3IoImluIG5ldyB0aHJlYWQiKTsKKworICAgIC8qIG5vdGlmeSB0aGUgY2FsbGVyIHRoYXQgd2UgYXJlIGRvbmUgKi8KKyAgICBQeVRocmVhZF9yZWxlYXNlX2xvY2sobG9jayk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfY190aHJlYWQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGxvbmcgdGhyZWFkOworICAgIFB5VGhyZWFkX3R5cGVfbG9jayBsb2NrOworCisgICAgZmF1bHRoYW5kbGVyX3N1cHByZXNzX2NyYXNoX3JlcG9ydCgpOworCisgICAgbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKyAgICBpZiAobG9jayA9PSBOVUxMKQorICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhsb2NrLCBXQUlUX0xPQ0spOworCisgICAgdGhyZWFkID0gUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZChmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfdGhyZWFkLCBsb2NrKTsKKyAgICBpZiAodGhyZWFkID09IC0xKSB7CisgICAgICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhsb2NrKTsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInVuYWJsZSB0byBzdGFydCB0aGUgdGhyZWFkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIHdhaXQgdW50aWwgdGhlIHRocmVhZCBjb21wbGV0ZXM6IGl0IHdpbGwgbmV2ZXIgb2NjdXIsIHNpbmNlIFB5X0ZhdGFsRXJyb3IoKQorICAgICAgIGV4aXRzIHRoZSBwcm9jZXNzIGltbWVkaWFsdHkuICovCisgICAgUHlUaHJlYWRfYWNxdWlyZV9sb2NrKGxvY2ssIFdBSVRfTE9DSyk7CisgICAgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKGxvY2spOworICAgIFB5VGhyZWFkX2ZyZWVfbG9jayhsb2NrKTsKKworICAgIFB5X1JFVFVSTl9OT05FOworfQorI2VuZGlmCisKIHN0YXRpYyBQeU9iamVjdCAqCiBmYXVsdGhhbmRsZXJfc2lnZnBlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKQEAgLTk1MSw2ICsxMDYzLDggQEAKIH0KIAogI2lmIGRlZmluZWQoSEFWRV9TSUdBTFRTVEFDSykgJiYgZGVmaW5lZChIQVZFX1NJR0FDVElPTikKKyNkZWZpbmUgRkFVTFRIQU5ETEVSX1NUQUNLX09WRVJGTE9XCisKICNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCiAgICAvKiBJc3N1ZSAjMjM2NTQ6IFR1cm4gb2ZmIElDQydzIHRhaWwgY2FsbCBvcHRpbWl6YXRpb24gZm9yIHRoZQogICAgICogc3RhY2tfb3ZlcmZsb3cgZ2VuZXJhdG9yLiBJQ0MgdHVybnMgdGhlIHJlY3Vyc2l2ZSB0YWlsIGNhbGwgaW50bwpAQCAtOTk0LDcgKzExMDgsNyBAQAogICAgICAgICBzaXplLCBkZXB0aCk7CiAgICAgcmV0dXJuIE5VTEw7CiB9Ci0jZW5kaWYKKyNlbmRpZiAgIC8qIGRlZmluZWQoSEFWRV9TSUdBTFRTVEFDSykgJiYgZGVmaW5lZChIQVZFX1NJR0FDVElPTikgKi8KIAogCiBzdGF0aWMgaW50CkBAIC0xMDE3LDEyICsxMTMxLDI1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBNU19XSU5ET1dTCitzdGF0aWMgUHlPYmplY3QgKgorZmF1bHRoYW5kbGVyX3JhaXNlX2V4Y2VwdGlvbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgdW5zaWduZWQgaW50IGNvZGUsIGZsYWdzID0gMDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIkl8STpfcmFpc2VfZXhjZXB0aW9uIiwgJmNvZGUsICZmbGFncykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGZhdWx0aGFuZGxlcl9zdXBwcmVzc19jcmFzaF9yZXBvcnQoKTsKKyAgICBSYWlzZUV4Y2VwdGlvbihjb2RlLCBmbGFncywgMCwgTlVMTCk7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisjZW5kaWYKKwogUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCiAiZmF1bHRoYW5kbGVyIG1vZHVsZS4iKTsKIAogc3RhdGljIFB5TWV0aG9kRGVmIG1vZHVsZV9tZXRob2RzW10gPSB7CiAgICAgeyJlbmFibGUiLAotICAgICAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX2VuYWJsZSwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgIChQeUNGdW5jdGlvbilmYXVsdGhhbmRsZXJfcHlfZW5hYmxlLCBNRVRIX1ZBUkFSR1N8TUVUSF9LRVlXT1JEUywKICAgICAgUHlEb2NfU1RSKCJlbmFibGUoZmlsZT1zeXMuc3RkZXJyLCBhbGxfdGhyZWFkcz1UcnVlKTogIgogICAgICAgICAgICAgICAgImVuYWJsZSB0aGUgZmF1bHQgaGFuZGxlciIpfSwKICAgICB7ImRpc2FibGUiLCAoUHlDRnVuY3Rpb24pZmF1bHRoYW5kbGVyX2Rpc2FibGVfcHksIE1FVEhfTk9BUkdTLApAQCAtMTA2NSwxNiArMTE5MiwyNSBAQAogICAgICAgICAgICAgICAgImEgU0lHU0VHViBvciBTSUdCVVMgc2lnbmFsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0iKX0sCiAgICAgeyJfc2lnc2VndiIsIGZhdWx0aGFuZGxlcl9zaWdzZWd2LCBNRVRIX1ZBUkFSR1MsCiAgICAgIFB5RG9jX1NUUigiX3NpZ3NlZ3YocmVsZWFzZV9naWw9RmFsc2UpOiByYWlzZSBhIFNJR1NFR1Ygc2lnbmFsIil9LAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgeyJfZmF0YWxfZXJyb3JfY190aHJlYWQiLCBmYXVsdGhhbmRsZXJfZmF0YWxfZXJyb3JfY190aHJlYWQsIE1FVEhfTk9BUkdTLAorICAgICBQeURvY19TVFIoImZhdGFsX2Vycm9yX2NfdGhyZWFkKCk6ICIKKyAgICAgICAgICAgICAgICJjYWxsIFB5X0ZhdGFsRXJyb3IoKSBpbiBhIG5ldyBDIHRocmVhZC4iKX0sCisjZW5kaWYKICAgICB7Il9zaWdhYnJ0IiwgZmF1bHRoYW5kbGVyX3NpZ2FicnQsIE1FVEhfTk9BUkdTLAogICAgICBQeURvY19TVFIoIl9zaWdhYnJ0KCk6IHJhaXNlIGEgU0lHQUJSVCBzaWduYWwiKX0sCiAgICAgeyJfc2lnZnBlIiwgKFB5Q0Z1bmN0aW9uKWZhdWx0aGFuZGxlcl9zaWdmcGUsIE1FVEhfTk9BUkdTLAogICAgICBQeURvY19TVFIoIl9zaWdmcGUoKTogcmFpc2UgYSBTSUdGUEUgc2lnbmFsIil9LAogICAgIHsiX2ZhdGFsX2Vycm9yIiwgZmF1bHRoYW5kbGVyX2ZhdGFsX2Vycm9yX3B5LCBNRVRIX1ZBUkFSR1MsCiAgICAgIFB5RG9jX1NUUigiX2ZhdGFsX2Vycm9yKG1lc3NhZ2UpOiBjYWxsIFB5X0ZhdGFsRXJyb3IobWVzc2FnZSkiKX0sCi0jaWYgZGVmaW5lZChIQVZFX1NJR0FMVFNUQUNLKSAmJiBkZWZpbmVkKEhBVkVfU0lHQUNUSU9OKQorI2lmZGVmIEZBVUxUSEFORExFUl9TVEFDS19PVkVSRkxPVwogICAgIHsiX3N0YWNrX292ZXJmbG93IiwgKFB5Q0Z1bmN0aW9uKWZhdWx0aGFuZGxlcl9zdGFja19vdmVyZmxvdywgTUVUSF9OT0FSR1MsCiAgICAgIFB5RG9jX1NUUigiX3N0YWNrX292ZXJmbG93KCk6IHJlY3Vyc2l2ZSBjYWxsIHRvIHJhaXNlIGEgc3RhY2sgb3ZlcmZsb3ciKX0sCiAjZW5kaWYKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgeyJfcmFpc2VfZXhjZXB0aW9uIiwgZmF1bHRoYW5kbGVyX3JhaXNlX2V4Y2VwdGlvbiwgTUVUSF9WQVJBUkdTLAorICAgICBQeURvY19TVFIoInJhaXNlX2V4Y2VwdGlvbihjb2RlLCBmbGFncz0wKTogQ2FsbCBSYWlzZUV4Y2VwdGlvbihjb2RlLCBmbGFncykuIil9LAorI2VuZGlmCiAgICAge05VTEwsIE5VTEx9ICAvKiBzZW50aW5lbCAqLwogfTsKIApAQCAtMTA5Myw3ICsxMjI5LDMzIEBACiBQeU1PRElOSVRfRlVOQwogUHlJbml0X2ZhdWx0aGFuZGxlcih2b2lkKQogewotICAgIHJldHVybiBQeU1vZHVsZV9DcmVhdGUoJm1vZHVsZV9kZWYpOworICAgIFB5T2JqZWN0ICptID0gUHlNb2R1bGVfQ3JlYXRlKCZtb2R1bGVfZGVmKTsKKyAgICBpZiAobSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIEFkZCBjb25zdGFudHMgZm9yIHVuaXQgdGVzdHMgKi8KKyNpZmRlZiBNU19XSU5ET1dTCisgICAgLyogUmFpc2VFeGNlcHRpb24oKSBjb2RlcyAocHJlZml4ZWQgYnkgYW4gdW5kZXJzY29yZSkgKi8KKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fQUNDRVNTX1ZJT0xBVElPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9BQ0NFU1NfVklPTEFUSU9OKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9JTlRfRElWSURFX0JZX1pFUk8pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9FWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWENFUFRJT05fU1RBQ0tfT1ZFUkZMT1cpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFJhaXNlRXhjZXB0aW9uKCkgZmxhZ3MgKHByZWZpeGVkIGJ5IGFuIHVuZGVyc2NvcmUpICovCisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJfRVhDRVBUSU9OX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQ0VQVElPTl9OT05DT05USU5VQUJMRV9FWENFUFRJT04pKQorICAgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorCisgICAgcmV0dXJuIG07CiB9CiAKIC8qIENhbGwgZmF1bHRoYW5kbGVyLmVuYWJsZSgpIGlmIHRoZSBQWVRIT05GQVVMVEhBTkRMRVIgZW52aXJvbm1lbnQgdmFyaWFibGUKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ2Ntb2R1bGUuYyBiL01vZHVsZXMvZ2Ntb2R1bGUuYwppbmRleCBjYjcyMjJkLi4wYzZmNDQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2djbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9nY21vZHVsZS5jCkBAIC03MzgsNyArNzM4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWRlYnVnX2N5Y2xlKGNoYXIgKm1zZywgUHlPYmplY3QgKm9wKQorZGVidWdfY3ljbGUoY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqb3ApCiB7CiAgICAgUHlTeXNfRm9ybWF0U3RkZXJyKCJnYzogJXMgPCVzICVwPlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgbXNnLCBQeV9UWVBFKG9wKS0+dHBfbmFtZSwgb3ApOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRhZGRyaW5mby5jIGIvTW9kdWxlcy9nZXRhZGRyaW5mby5jCmluZGV4IGQ4MTY3ZWEuLmI2ZmI1M2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0YWRkcmluZm8uYworKysgYi9Nb2R1bGVzL2dldGFkZHJpbmZvLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFkZHJpbmZvICosIGludCk7CiBzdGF0aWMgaW50IHN0cl9pc251bWJlcihjb25zdCBjaGFyICopOwogCi1zdGF0aWMgY2hhciAqYWlfZXJybGlzdFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhaV9lcnJsaXN0W10gPSB7CiAgICAgInN1Y2Nlc3MuIiwKICAgICAiYWRkcmVzcyBmYW1pbHkgZm9yIGhvc3RuYW1lIG5vdCBzdXBwb3J0ZWQuIiwgICAgICAgLyogRUFJX0FERFJGQU1JTFkgKi8KICAgICAidGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uLiIsICAgICAgICAgICAgLyogRUFJX0FHQUlOICAgICAgKi8KQEAgLTE5OCw3ICsxOTgsNyBAQAogCiAjZGVmaW5lIEVSUihlcnIpIHsgZXJyb3IgPSAoZXJyKTsgZ290byBiYWQ7IH0KIAotY2hhciAqCitjb25zdCBjaGFyICoKIGdhaV9zdHJlcnJvcihpbnQgZWNvZGUpCiB7CiAgICAgaWYgKGVjb2RlIDwgMCB8fCBlY29kZSA+IEVBSV9NQVgpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2dldHBhdGguYyBiL01vZHVsZXMvZ2V0cGF0aC5jCmluZGV4IDE4ZGViNjAuLjY1YjQ3YTMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ2V0cGF0aC5jCisrKyBiL01vZHVsZXMvZ2V0cGF0aC5jCkBAIC00NjAsOCArNDYwLDggQEAKIHsKICAgICBleHRlcm4gd2NoYXJfdCAqUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CiAKLSAgICBzdGF0aWMgd2NoYXJfdCBkZWxpbWl0ZXJbMl0gPSB7REVMSU0sICdcMCd9OwotICAgIHN0YXRpYyB3Y2hhcl90IHNlcGFyYXRvclsyXSA9IHtTRVAsICdcMCd9OworICAgIHN0YXRpYyBjb25zdCB3Y2hhcl90IGRlbGltaXRlclsyXSA9IHtERUxJTSwgJ1wwJ307CisgICAgc3RhdGljIGNvbnN0IHdjaGFyX3Qgc2VwYXJhdG9yWzJdID0ge1NFUCwgJ1wwJ307CiAgICAgY2hhciAqX3J0cHlwYXRoID0gUHlfR0VURU5WKCJQWVRIT05QQVRIIik7IC8qIFhYWCB1c2Ugd2lkZSB2ZXJzaW9uIG9uIFdpbmRvd3MgKi8KICAgICB3Y2hhcl90ICpydHB5cGF0aCA9IE5VTEw7CiAgICAgd2NoYXJfdCAqaG9tZSA9IFB5X0dldFB5dGhvbkhvbWUoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZ3JwbW9kdWxlLmMgYi9Nb2R1bGVzL2dycG1vZHVsZS5jCmluZGV4IDNhMTM0YTAuLjk0MzdhZTcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZ3JwbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9ncnBtb2R1bGUuYwpAQCAtMTAwLDE0ICsxMDAsMjUgQEAKICAgICBnaWRfdCBnaWQ7CiAgICAgc3RydWN0IGdyb3VwICpwOwogCi0gICAgcHlfaW50X2lkID0gUHlOdW1iZXJfTG9uZyhpZCk7Ci0gICAgaWYgKCFweV9pbnRfaWQpCisgICAgaWYgKCFfUHlfR2lkX0NvbnZlcnRlcihpZCwgJmdpZCkpIHsKKyAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICghX1B5X0dpZF9Db252ZXJ0ZXIocHlfaW50X2lkLCAmZ2lkKSkgeworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChQeUVycl9XYXJuRm9ybWF0KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwIGlkIG11c3QgYmUgaW50LCBub3QgJS4yMDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZC0+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+PSAwKQotICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVfbnR5cGUoQ0hJTEQodHJlZSwgbmNoKSwgRU5ETUFSS0VSKSk7Ci0KLSAgICBmb3IgKGogPSAwOyByZXMgJiYgKGogPCBuY2gpOyArK2opIHsKLSAgICAgICAgaWYgKFRZUEUoQ0hJTEQodHJlZSwgaikpID09IHN0bXQpCi0gICAgICAgICAgICByZXMgPSB2YWxpZGF0ZV9zdG10KENISUxEKHRyZWUsIGopKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmVzID0gdmFsaWRhdGVfbmV3bGluZShDSElMRCh0cmVlLCBqKSk7Ci0gICAgfQotICAgIC8qICBUaGlzIHN0YXlzIGluIHRvIHByZXZlbnQgYW55IGludGVybmFsIGZhaWx1cmVzIGZyb20gZ2V0dGluZyB0byB0aGUKLSAgICAgKiAgdXNlci4gIEhvcGVmdWxseSwgdGhpcyB3b24ndCBiZSBuZWVkZWQuICBJZiBhIHVzZXIgcmVwb3J0cyBnZXR0aW5nCi0gICAgICogIHRoaXMsIHdlIGhhdmUgc29tZSBkZWJ1Z2dpbmcgdG8gZG8uCi0gICAgICovCi0gICAgaWYgKCFyZXMgJiYgIVB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgIGVycl9zdHJpbmcoIlZBTElEQVRJT04gRkFJTFVSRTogcmVwb3J0IHRoaXMgdG8gdGhlIG1haW50YWluZXIhIik7Ci0KLSAgICByZXR1cm4gKHJlcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXZhbGlkYXRlX2VuY29kaW5nX2RlY2wobm9kZSAqdHJlZSkKLXsKLSAgICBpbnQgbmNoID0gTkNIKHRyZWUpOwotICAgIGludCByZXMgPSAoKG5jaCA9PSAxKQotICAgICAgICAmJiB2YWxpZGF0ZV9maWxlX2lucHV0KENISUxEKHRyZWUsIDApKSk7Ci0KLSAgICBpZiAoIXJlcyAmJiAhUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgZXJyX3N0cmluZygiRXJyb3IgUGFyc2luZyBlbmNvZGluZ19kZWNsIik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCiBzdGF0aWMgUHlPYmplY3QqCiBwaWNrbGVfY29uc3RydWN0b3IgPSBOVUxMOwogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgYi9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKaW5kZXggM2MzZjgwNi4uN2YxNmE4MyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCisrKyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwpAQCAtMzIsNiArMzIsMTIgQEAKICNpbmNsdWRlICJ3aW5yZXBhcnNlLmgiCiAjZW5kaWYKIAorLyogT24gYW5kcm9pZCBBUEkgbGV2ZWwgMjEsICdBVF9FQUNDRVNTJyBpcyBub3QgZGVjbGFyZWQgYWx0aG91Z2gKKyAqIEhBVkVfRkFDQ0VTU0FUIGlzIGRlZmluZWQuICovCisjaWZkZWYgX19BTkRST0lEX18KKyN1bmRlZiBIQVZFX0ZBQ0NFU1NBVAorI2VuZGlmCisKICNpbmNsdWRlIDxzdGRpby5oPiAgLyogbmVlZGVkIGZvciBjdGVybWlkKCkgKi8KIAogI2lmZGVmIF9fY3BsdXNwbHVzCkBAIC02NzEsMjEgKzY3NywyMCBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbnQKLV9mZF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIGludCAqcCwgY29uc3QgY2hhciAqYWxsb3dlZCkKK19mZF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIGludCAqcCkKIHsKICAgICBpbnQgb3ZlcmZsb3c7CiAgICAgbG9uZyBsb25nX3ZhbHVlOwogCiAgICAgUHlPYmplY3QgKmluZGV4ID0gUHlOdW1iZXJfSW5kZXgobyk7CiAgICAgaWYgKGluZGV4ID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCBzaG91bGQgYmUgJXMsIG5vdCAlLjIwMHMiLAotICAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCwgUHlfVFlQRShvKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIGFzc2VydChQeUxvbmdfQ2hlY2soaW5kZXgpKTsKICAgICBsb25nX3ZhbHVlID0gUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93KGluZGV4LCAmb3ZlcmZsb3cpOwogICAgIFB5X0RFQ1JFRihpbmRleCk7CisgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKICAgICBpZiAob3ZlcmZsb3cgPiAwIHx8IGxvbmdfdmFsdWUgPiBJTlRfTUFYKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgImZkIGlzIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIik7CkBAIC03MDgsNyArNzEzLDE1IEBACiAgICAgICAgICooaW50ICopcCA9IERFRkFVTFRfRElSX0ZEOwogICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgcmV0dXJuIF9mZF9jb252ZXJ0ZXIobywgKGludCAqKXAsICJpbnRlZ2VyIik7CisgICAgZWxzZSBpZiAoUHlJbmRleF9DaGVjayhvKSkgeworICAgICAgICByZXR1cm4gX2ZkX2NvbnZlcnRlcihvLCAoaW50ICopcCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50IHNob3VsZCBiZSBpbnRlZ2VyIG9yIE5vbmUsIG5vdCAlLjIwMHMiLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShvKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KIAogCkBAIC03OTksOCArODEyLDggQEAKICAgICBjb25zdCBjaGFyICphcmd1bWVudF9uYW1lOwogICAgIGludCBudWxsYWJsZTsKICAgICBpbnQgYWxsb3dfZmQ7Ci0gICAgd2NoYXJfdCAqd2lkZTsKLSAgICBjaGFyICpuYXJyb3c7CisgICAgY29uc3Qgd2NoYXJfdCAqd2lkZTsKKyAgICBjb25zdCBjaGFyICpuYXJyb3c7CiAgICAgaW50IGZkOwogICAgIFB5X3NzaXplX3QgbGVuZ3RoOwogICAgIFB5T2JqZWN0ICpvYmplY3Q7CkBAIC04MTgsMTEgKzgzMSwxMiBAQAogfQogCiBzdGF0aWMgaW50Ci1wYXRoX2NvbnZlcnRlcihQeU9iamVjdCAqbywgdm9pZCAqcCkgeworcGF0aF9jb252ZXJ0ZXIoUHlPYmplY3QgKm8sIHZvaWQgKnApCit7CiAgICAgcGF0aF90ICpwYXRoID0gKHBhdGhfdCAqKXA7Ci0gICAgUHlPYmplY3QgKnVuaWNvZGUsICpieXRlczsKKyAgICBQeU9iamVjdCAqYnl0ZXM7CiAgICAgUHlfc3NpemVfdCBsZW5ndGg7Ci0gICAgY2hhciAqbmFycm93OworICAgIGNvbnN0IGNoYXIgKm5hcnJvdzsKIAogI2RlZmluZSBGT1JNQVRfRVhDRVBUSU9OKGV4YywgZm10KSBcCiAgICAgUHlFcnJfRm9ybWF0KGV4YywgIiVzJXMiIGZtdCwgXApAQCAtODM5LDEyICs4NTMsNyBAQAogICAgIC8qIGVuc3VyZSBpdCdzIGFsd2F5cyBzYWZlIHRvIGNhbGwgcGF0aF9jbGVhbnVwKCkgKi8KICAgICBwYXRoLT5jbGVhbnVwID0gTlVMTDsKIAotICAgIGlmIChvID09IFB5X05vbmUpIHsKLSAgICAgICAgaWYgKCFwYXRoLT5udWxsYWJsZSkgewotICAgICAgICAgICAgRk9STUFUX0VYQ0VQVElPTihQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBzcGVjaWZ5IE5vbmUgZm9yICVzIGFyZ3VtZW50Iik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgIGlmICgobyA9PSBQeV9Ob25lKSAmJiBwYXRoLT5udWxsYWJsZSkgewogICAgICAgICBwYXRoLT53aWRlID0gTlVMTDsKICAgICAgICAgcGF0aC0+bmFycm93ID0gTlVMTDsKICAgICAgICAgcGF0aC0+bGVuZ3RoID0gMDsKQEAgLTg1MywyNCArODYyLDIwIEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIHVuaWNvZGUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChvKTsKLSAgICBpZiAodW5pY29kZSkgeworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2sobykpIHsKICNpZmRlZiBNU19XSU5ET1dTCi0gICAgICAgIHdjaGFyX3QgKndpZGU7CisgICAgICAgIGNvbnN0IHdjaGFyX3QgKndpZGU7CiAKLSAgICAgICAgd2lkZSA9IFB5VW5pY29kZV9Bc1VuaWNvZGVBbmRTaXplKHVuaWNvZGUsICZsZW5ndGgpOworICAgICAgICB3aWRlID0gUHlVbmljb2RlX0FzVW5pY29kZUFuZFNpemUobywgJmxlbmd0aCk7CiAgICAgICAgIGlmICghd2lkZSkgewotICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxlbmd0aCA+IDMyNzY3KSB7CiAgICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICIlcyB0b28gbG9uZyBmb3IgV2luZG93cyIpOwotICAgICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHdjc2xlbih3aWRlKSAhPSBsZW5ndGgpIHsKLSAgICAgICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVmFsdWVFcnJvciwgImVtYmVkZGVkIG51bGwgY2hhcmFjdGVyIik7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodW5pY29kZSk7CisgICAgICAgICAgICBGT1JNQVRfRVhDRVBUSU9OKFB5RXhjX1ZhbHVlRXJyb3IsICJlbWJlZGRlZCBudWxsIGNoYXJhY3RlciBpbiAlcyIpOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KIApAQCAtODc5LDUyICs4ODQsNDcgQEAKICAgICAgICAgcGF0aC0+bGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICBwYXRoLT5vYmplY3QgPSBvOwogICAgICAgICBwYXRoLT5mZCA9IC0xOwotICAgICAgICBwYXRoLT5jbGVhbnVwID0gdW5pY29kZTsKLSAgICAgICAgcmV0dXJuIFB5X0NMRUFOVVBfU1VQUE9SVEVEOworICAgICAgICByZXR1cm4gMTsKICNlbHNlCi0gICAgICAgIGludCBjb252ZXJ0ZWQgPSBQeVVuaWNvZGVfRlNDb252ZXJ0ZXIodW5pY29kZSwgJmJ5dGVzKTsKLSAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwotICAgICAgICBpZiAoIWNvbnZlcnRlZCkKLSAgICAgICAgICAgIGJ5dGVzID0gTlVMTDsKKyAgICAgICAgaWYgKCFQeVVuaWNvZGVfRlNDb252ZXJ0ZXIobywgJmJ5dGVzKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KICNlbmRpZgogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0NoZWNrQnVmZmVyKG8pKQotICAgICAgICAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21PYmplY3Qobyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJ5dGVzID0gTlVMTDsKKyAgICBlbHNlIGlmIChQeU9iamVjdF9DaGVja0J1ZmZlcihvKSkgeworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKHdpbjMyX3dhcm5fYnl0ZXNfYXBpKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21PYmplY3Qobyk7CiAgICAgICAgIGlmICghYnl0ZXMpIHsKLSAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgICAgICBpZiAocGF0aC0+YWxsb3dfZmQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZmQ7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IF9mZF9jb252ZXJ0ZXIobywgJmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZywgYnl0ZXMgb3IgaW50ZWdlciIpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aC0+d2lkZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPm5hcnJvdyA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPmxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPm9iamVjdCA9IG87Ci0gICAgICAgICAgICAgICAgICAgIHBhdGgtPmZkID0gZmQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoIWJ5dGVzKSB7Ci0gICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgIEZPUk1BVF9FWENFUFRJT04oUHlFeGNfVHlwZUVycm9yLCAiaWxsZWdhbCB0eXBlIGZvciAlcyBwYXJhbWV0ZXIiKTsKKyAgICBlbHNlIGlmIChwYXRoLT5hbGxvd19mZCAmJiBQeUluZGV4X0NoZWNrKG8pKSB7CisgICAgICAgIGlmICghX2ZkX2NvbnZlcnRlcihvLCAmcGF0aC0+ZmQpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBwYXRoLT53aWRlID0gTlVMTDsKKyAgICAgICAgcGF0aC0+bmFycm93ID0gTlVMTDsKKyAgICAgICAgcGF0aC0+bGVuZ3RoID0gMDsKKyAgICAgICAgcGF0aC0+b2JqZWN0ID0gbzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMlcyVzIHNob3VsZCBiZSAlcywgbm90ICUuMjAwcyIsCisgICAgICAgICAgICBwYXRoLT5mdW5jdGlvbl9uYW1lID8gcGF0aC0+ZnVuY3Rpb25fbmFtZSA6ICIiLAorICAgICAgICAgICAgcGF0aC0+ZnVuY3Rpb25fbmFtZSA/ICI6ICIgICAgICAgICAgICAgICAgOiAiIiwKKyAgICAgICAgICAgIHBhdGgtPmFyZ3VtZW50X25hbWUgPyBwYXRoLT5hcmd1bWVudF9uYW1lIDogInBhdGgiLAorICAgICAgICAgICAgcGF0aC0+YWxsb3dfZmQgJiYgcGF0aC0+bnVsbGFibGUgPyAic3RyaW5nLCBieXRlcywgaW50ZWdlciBvciBOb25lIiA6CisgICAgICAgICAgICBwYXRoLT5hbGxvd19mZCA/ICJzdHJpbmcsIGJ5dGVzIG9yIGludGVnZXIiIDoKKyAgICAgICAgICAgIHBhdGgtPm51bGxhYmxlID8gInN0cmluZywgYnl0ZXMgb3IgTm9uZSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIG9yIGJ5dGVzIiwKKyAgICAgICAgICAgIFB5X1RZUEUobyktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSNpZmRlZiBNU19XSU5ET1dTCi0gICAgaWYgKHdpbjMyX3dhcm5fYnl0ZXNfYXBpKCkpIHsKLSAgICAgICAgUHlfREVDUkVGKGJ5dGVzKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotI2VuZGlmCi0KICAgICBsZW5ndGggPSBQeUJ5dGVzX0dFVF9TSVpFKGJ5dGVzKTsKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgaWYgKGxlbmd0aCA+IE1BWF9QQVRILTEpIHsKQEAgLTk1MSw3ICs5NTEsOCBAQAogfQogCiBzdGF0aWMgdm9pZAotYXJndW1lbnRfdW5hdmFpbGFibGVfZXJyb3IoY2hhciAqZnVuY3Rpb25fbmFtZSwgY2hhciAqYXJndW1lbnRfbmFtZSkgeworYXJndW1lbnRfdW5hdmFpbGFibGVfZXJyb3IoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgY29uc3QgY2hhciAqYXJndW1lbnRfbmFtZSkKK3sKICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciwKICAgICAgICAgIiVzJXMlcyB1bmF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIiwKICAgICAgICAgKGZ1bmN0aW9uX25hbWUgIT0gTlVMTCkgPyBmdW5jdGlvbl9uYW1lIDogIiIsCkBAIC05NzQsNyArOTc1LDggQEAKIH0KIAogc3RhdGljIGludAotZmRfc3BlY2lmaWVkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCkgeworZmRfc3BlY2lmaWVkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCkKK3sKICAgICBpZiAoZmQgPT0gLTEpCiAgICAgICAgIHJldHVybiAwOwogCkBAIC05ODMsNyArOTg1LDggQEAKIH0KIAogc3RhdGljIGludAotZm9sbG93X3N5bWxpbmtzX3NwZWNpZmllZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZm9sbG93X3N5bWxpbmtzKSB7Citmb2xsb3dfc3ltbGlua3Nfc3BlY2lmaWVkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmb2xsb3dfc3ltbGlua3MpCit7CiAgICAgaWYgKGZvbGxvd19zeW1saW5rcykKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTk5Miw3ICs5OTUsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1wYXRoX2FuZF9kaXJfZmRfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsIGludCBkaXJfZmQpIHsKK3BhdGhfYW5kX2Rpcl9mZF9pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIHBhdGhfdCAqcGF0aCwgaW50IGRpcl9mZCkKK3sKICAgICBpZiAoIXBhdGgtPm5hcnJvdyAmJiAhcGF0aC0+d2lkZSAmJiAoZGlyX2ZkICE9IERFRkFVTFRfRElSX0ZEKSkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICIlczogY2FuJ3Qgc3BlY2lmeSBkaXJfZmQgd2l0aG91dCBtYXRjaGluZyBwYXRoIiwKQEAgLTEwMDMsNyArMTAwNyw4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpcl9mZF9hbmRfZmRfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLCBpbnQgZmQpIHsKK2Rpcl9mZF9hbmRfZmRfaW52YWxpZChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZGlyX2ZkLCBpbnQgZmQpCit7CiAgICAgaWYgKChkaXJfZmQgIT0gREVGQVVMVF9ESVJfRkQpICYmIChmZCAhPSAtMSkpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbid0IHNwZWNpZnkgYm90aCBkaXJfZmQgYW5kIGZkIiwKQEAgLTEwMTQsOCArMTAxOSw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWZkX2FuZF9mb2xsb3dfc3ltbGlua3NfaW52YWxpZChjaGFyICpmdW5jdGlvbl9uYW1lLCBpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykgeworZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9sbG93X3N5bWxpbmtzKQorewogICAgIGlmICgoZmQgPiAwKSAmJiAoIWZvbGxvd19zeW1saW5rcykpIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCB1c2UgZmQgYW5kIGZvbGxvd19zeW1saW5rcyB0b2dldGhlciIsCkBAIC0xMDI2LDggKzEwMzIsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1kaXJfZmRfYW5kX2ZvbGxvd19zeW1saW5rc19pbnZhbGlkKGNoYXIgKmZ1bmN0aW9uX25hbWUsIGludCBkaXJfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb2xsb3dfc3ltbGlua3MpIHsKK2Rpcl9mZF9hbmRfZm9sbG93X3N5bWxpbmtzX2ludmFsaWQoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgaW50IGRpcl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbGxvd19zeW1saW5rcykKK3sKICAgICBpZiAoKGRpcl9mZCAhPSBERUZBVUxUX0RJUl9GRCkgJiYgKCFmb2xsb3dfc3ltbGlua3MpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgdXNlIGRpcl9mZCBhbmQgZm9sbG93X3N5bWxpbmtzIHRvZ2V0aGVyIiwKQEAgLTExNTksNyArMTE2Niw3IEBACiAgICAgZm9yIChlID0gX3dlbnZpcm9uOyAqZSAhPSBOVUxMOyBlKyspIHsKICAgICAgICAgUHlPYmplY3QgKms7CiAgICAgICAgIFB5T2JqZWN0ICp2OwotICAgICAgICB3Y2hhcl90ICpwID0gd2NzY2hyKCplLCBMJz0nKTsKKyAgICAgICAgY29uc3Qgd2NoYXJfdCAqcCA9IHdjc2NocigqZSwgTCc9Jyk7CiAgICAgICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgayA9IFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoKmUsIChQeV9zc2l6ZV90KShwLSplKSk7CkBAIC0xMTg3LDcgKzExOTQsNyBAQAogICAgIGZvciAoZSA9IGVudmlyb247ICplICE9IE5VTEw7IGUrKykgewogICAgICAgICBQeU9iamVjdCAqazsKICAgICAgICAgUHlPYmplY3QgKnY7Ci0gICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoKmUsICc9Jyk7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzdHJjaHIoKmUsICc9Jyk7CiAgICAgICAgIGlmIChwID09IE5VTEwpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgayA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKmUsIChpbnQpKHAtKmUpKTsKQEAgLTEyMjIsNyArMTIyOSw3IEBACiAKICNpZmRlZiBNU19XSU5ET1dTCiBzdGF0aWMgUHlPYmplY3QgKgotd2luMzJfZXJyb3IoY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQord2luMzJfZXJyb3IoY29uc3QgY2hhciogZnVuY3Rpb24sIGNvbnN0IGNoYXIqIGZpbGVuYW1lKQogewogICAgIC8qIFhYWCBXZSBzaG91bGQgcGFzcyB0aGUgZnVuY3Rpb24gbmFtZSBhbG9uZyBpbiB0aGUgZnV0dXJlLgogICAgICAgICh3aW5yZWcuYyBhbHNvIHdhbnRzIHRvIHBhc3MgdGhlIGZ1bmN0aW9uIG5hbWUuKQpAQCAtMTIzNyw3ICsxMjQ0LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLXdpbjMyX2Vycm9yX29iamVjdChjaGFyKiBmdW5jdGlvbiwgUHlPYmplY3QqIGZpbGVuYW1lKQord2luMzJfZXJyb3Jfb2JqZWN0KGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBQeU9iamVjdCogZmlsZW5hbWUpCiB7CiAgICAgLyogWFhYIC0gc2VlIHdpbjMyX2Vycm9yIGZvciBjb21tZW50cyBvbiAnZnVuY3Rpb24nICovCiAgICAgZXJybm8gPSBHZXRMYXN0RXJyb3IoKTsKQEAgLTE0NTgsNyArMTQ2NSw3IEBACiAgICAgaWYoIWJ1Zl9zaXplKQogICAgICAgICByZXR1cm4gRkFMU0U7CiAKLSAgICBidWYgPSBQeU1lbV9OZXcod2NoYXJfdCwgYnVmX3NpemUrMSk7CisgICAgYnVmID0gKHdjaGFyX3QgKilQeU1lbV9SYXdNYWxsb2MoKGJ1Zl9zaXplICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogICAgIGlmICghYnVmKSB7CiAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9PVVRPRk1FTU9SWSk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKQEAgLTE0NjgsMTIgKzE0NzUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfc2l6ZSwgVk9MVU1FX05BTUVfRE9TKTsKIAogICAgIGlmKCFyZXN1bHRfbGVuZ3RoKSB7Ci0gICAgICAgIFB5TWVtX0ZyZWUoYnVmKTsKKyAgICAgICAgUHlNZW1fUmF3RnJlZShidWYpOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCiAgICAgaWYoIUNsb3NlSGFuZGxlKGhkbCkpIHsKLSAgICAgICAgUHlNZW1fRnJlZShidWYpOworICAgICAgICBQeU1lbV9SYXdGcmVlKGJ1Zik7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKQEAgLTE1NTgsNyArMTU2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICAgICAgICAgIGNvZGUgPSB3aW4zMl94c3RhdF9pbXBsX3codGFyZ2V0X3BhdGgsIHJlc3VsdCwgRkFMU0UpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUodGFyZ2V0X3BhdGgpOworICAgICAgICAgICAgICAgIFB5TWVtX1Jhd0ZyZWUodGFyZ2V0X3BhdGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb2RlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UKQEAgLTE2NDgsNyArMTY1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICAgICAgICAgIGNvZGUgPSB3aW4zMl94c3RhdF9pbXBsX3codGFyZ2V0X3BhdGgsIHJlc3VsdCwgRkFMU0UpOwotICAgICAgICAgICAgICAgIFB5TWVtX0ZyZWUodGFyZ2V0X3BhdGgpOworICAgICAgICAgICAgICAgIFB5TWVtX1Jhd0ZyZWUodGFyZ2V0X3BhdGgpOwogICAgICAgICAgICAgICAgIHJldHVybiBjb2RlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UKQEAgLTIxMDIsNyArMjEwOSw3IEBACiAKIAogc3RhdGljIFB5T2JqZWN0ICoKLXBvc2l4X2RvX3N0YXQoY2hhciAqZnVuY3Rpb25fbmFtZSwgcGF0aF90ICpwYXRoLAorcG9zaXhfZG9fc3RhdChjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBwYXRoX3QgKnBhdGgsCiAgICAgICAgICAgICAgIGludCBkaXJfZmQsIGludCBmb2xsb3dfc3ltbGlua3MpCiB7CiAgICAgU1RSVUNUX1NUQVQgc3Q7CkBAIC0zMzE0LDEyICszMzIxLDIyIEBACiAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgIGRvIHsKICAgICAgICAgYnVmbGVuICs9IGNodW5rOworI2lmZGVmIE1TX1dJTkRPV1MKKyAgICAgICAgaWYgKGJ1ZmxlbiA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorI2VuZGlmCiAgICAgICAgIHRtcGJ1ZiA9IFB5TWVtX1Jhd1JlYWxsb2MoYnVmLCBidWZsZW4pOwogICAgICAgICBpZiAodG1wYnVmID09IE5VTEwpCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBidWYgPSB0bXBidWY7CisjaWZkZWYgTVNfV0lORE9XUworICAgICAgICBjd2QgPSBnZXRjd2QoYnVmLCAoaW50KWJ1Zmxlbik7CisjZWxzZQogICAgICAgICBjd2QgPSBnZXRjd2QoYnVmLCBidWZsZW4pOworI2VuZGlmCiAgICAgfSB3aGlsZSAoY3dkID09IE5VTEwgJiYgZXJybm8gPT0gRVJBTkdFKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogCkBAIC0zNDYxLDE1ICszNDc4LDEzIEBACiAgICAgQk9PTCByZXN1bHQ7CiAgICAgV0lOMzJfRklORF9EQVRBIEZpbGVEYXRhOwogICAgIGNoYXIgbmFtZWJ1ZltNQVhfUEFUSCs0XTsgLyogT3ZlcmFsbG9jYXRlIGZvciAiXCouKiIgKi8KLSAgICBjaGFyICpidWZwdHIgPSBuYW1lYnVmOwogICAgIC8qIG9ubHkgY2xhaW0gdG8gaGF2ZSBzcGFjZSBmb3IgTUFYX1BBVEggKi8KICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5X0FSUkFZX0xFTkdUSChuYW1lYnVmKS00OwotICAgIFB5T2JqZWN0ICpwbyA9IE5VTEw7CiAgICAgd2NoYXJfdCAqd25hbWVidWYgPSBOVUxMOwogCiAgICAgaWYgKCFwYXRoLT5uYXJyb3cpIHsKICAgICAgICAgV0lOMzJfRklORF9EQVRBVyB3RmlsZURhdGE7Ci0gICAgICAgIHdjaGFyX3QgKnBvX3djaGFyczsKKyAgICAgICAgY29uc3Qgd2NoYXJfdCAqcG9fd2NoYXJzOwogCiAgICAgICAgIGlmICghcGF0aC0+d2lkZSkgeyAvKiBEZWZhdWx0IGFyZzogIi4iICovCiAgICAgICAgICAgICBwb193Y2hhcnMgPSBMIi4iOwpAQCAtMzYzNSw3ICszNjUwLDcgQEAKICAgICBlbHNlCiAjZW5kaWYKICAgICB7Ci0gICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgICAgIGlmIChwYXRoLT5uYXJyb3cpIHsKICAgICAgICAgICAgIG5hbWUgPSBwYXRoLT5uYXJyb3c7CiAgICAgICAgICAgICAvKiBvbmx5IHJldHVybiBieXRlcyBpZiB0aGV5IHNwZWNpZmllZCBhIGJ5dGVzIG9iamVjdCAqLwpAQCAtMzgxNyw3ICszODMyLDcgQEAKICAgICB3Y2hhcl90ICp0YXJnZXRfcGF0aDsKICAgICBpbnQgcmVzdWx0X2xlbmd0aDsKICAgICBQeU9iamVjdCAqcmVzdWx0OwotICAgIHdjaGFyX3QgKnBhdGhfd2NoYXI7CisgICAgY29uc3Qgd2NoYXJfdCAqcGF0aF93Y2hhcjsKIAogICAgIHBhdGhfd2NoYXIgPSBQeVVuaWNvZGVfQXNVbmljb2RlKHBhdGgpOwogICAgIGlmIChwYXRoX3djaGFyID09IE5VTEwpCkBAIC0zOTA2LDcgKzM5MjEsOCBAQAogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWNiZGNiZDEwNTljZWVmNGMgaW5wdXQ9N2VhY2FkYzQwYWNiZGE2Yl0qLwogewogICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0gICAgd2NoYXJfdCAqcGF0aF93Y2hhciwgKm1vdW50cGF0aD1OVUxMOworICAgIGNvbnN0IHdjaGFyX3QgKnBhdGhfd2NoYXI7CisgICAgd2NoYXJfdCAqbW91bnRwYXRoPU5VTEw7CiAgICAgc2l6ZV90IGJ1ZmxlbjsKICAgICBCT09MIHJldDsKIApAQCAtNDEwNCw3ICs0MTIwLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBpbnRlcm5hbF9yZW5hbWUocGF0aF90ICpzcmMsIHBhdGhfdCAqZHN0LCBpbnQgc3JjX2Rpcl9mZCwgaW50IGRzdF9kaXJfZmQsIGludCBpc19yZXBsYWNlKQogewotICAgIGNoYXIgKmZ1bmN0aW9uX25hbWUgPSBpc19yZXBsYWNlID8gInJlcGxhY2UiIDogInJlbmFtZSI7CisgICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSA9IGlzX3JlcGxhY2UgPyAicmVwbGFjZSIgOiAicmVuYW1lIjsKICAgICBpbnQgZGlyX2ZkX3NwZWNpZmllZDsKIAogI2lmZGVmIE1TX1dJTkRPV1MKQEAgLTQyODQsNyArNDMwMCw3IEBACiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MjkwZmM0MzdkZDRmMzNhMCBpbnB1dD04NmE1ODU1NGJhNjA5NGFmXSovCiB7CiAgICAgbG9uZyByZXN1bHQ7Ci0gICAgY2hhciAqYnl0ZXMgPSBQeUJ5dGVzX0FzU3RyaW5nKGNvbW1hbmQpOworICAgIGNvbnN0IGNoYXIgKmJ5dGVzID0gUHlCeXRlc19Bc1N0cmluZyhjb21tYW5kKTsKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgcmVzdWx0ID0gc3lzdGVtKGJ5dGVzKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwpAQCAtNDU2NCw3ICs0NTgwLDcgQEAKICNpZiBkZWZpbmVkKEhBVkVfRlVUSU1FU0FUKSB8fCBkZWZpbmVkKEhBVkVfVVRJTUVOU0FUKQogCiBzdGF0aWMgaW50Ci11dGltZV9kaXJfZmQodXRpbWVfdCAqdXQsIGludCBkaXJfZmQsIGNoYXIgKnBhdGgsIGludCBmb2xsb3dfc3ltbGlua3MpCit1dGltZV9kaXJfZmQodXRpbWVfdCAqdXQsIGludCBkaXJfZmQsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBmb2xsb3dfc3ltbGlua3MpCiB7CiAjaWZkZWYgSEFWRV9VVElNRU5TQVQKICAgICBpbnQgZmxhZ3MgPSBmb2xsb3dfc3ltbGlua3MgPyAwIDogQVRfU1lNTElOS19OT0ZPTExPVzsKQEAgLTQ2MDYsMTQgKzQ2MjIsMTQgQEAKICAgICAjZGVmaW5lIFBBVEhfVVRJTUVfSEFWRV9GRCAwCiAjZW5kaWYKIAorI2lmIGRlZmluZWQoSEFWRV9VVElNRU5TQVQpIHx8IGRlZmluZWQoSEFWRV9MVVRJTUVTKQorIyAgZGVmaW5lIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKKyNlbmRpZgogCi0jZGVmaW5lIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MgXAotICAgICAgICAoZGVmaW5lZChIQVZFX1VUSU1FTlNBVCkgfHwgZGVmaW5lZChIQVZFX0xVVElNRVMpKQotCi0jaWYgVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmZGVmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKIAogc3RhdGljIGludAotdXRpbWVfbm9mb2xsb3dfc3ltbGlua3ModXRpbWVfdCAqdXQsIGNoYXIgKnBhdGgpCit1dGltZV9ub2ZvbGxvd19zeW1saW5rcyh1dGltZV90ICp1dCwgY29uc3QgY2hhciAqcGF0aCkKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIFVUSU1FX1RPX1RJTUVTUEVDOwpAQCAtNDYyOSw3ICs0NjQ1LDcgQEAKICNpZm5kZWYgTVNfV0lORE9XUwogCiBzdGF0aWMgaW50Ci11dGltZV9kZWZhdWx0KHV0aW1lX3QgKnV0LCBjaGFyICpwYXRoKQordXRpbWVfZGVmYXVsdCh1dGltZV90ICp1dCwgY29uc3QgY2hhciAqcGF0aCkKIHsKICNpZmRlZiBIQVZFX1VUSU1FTlNBVAogICAgIFVUSU1FX1RPX1RJTUVTUEVDOwpAQCAtNDc3Miw3ICs0Nzg4LDcgQEAKICAgICAgICAgdXRpbWUubm93ID0gMTsKICAgICB9CiAKLSNpZiAhVVRJTUVfSEFWRV9OT0ZPTExPV19TWU1MSU5LUworI2lmICFkZWZpbmVkKFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MpCiAgICAgaWYgKGZvbGxvd19zeW1saW5rc19zcGVjaWZpZWQoInV0aW1lIiwgZm9sbG93X3N5bWxpbmtzKSkKICAgICAgICAgZ290byBleGl0OwogI2VuZGlmCkBAIC00ODI2LDcgKzQ4NDIsNyBAQAogI2Vsc2UgLyogTVNfV0lORE9XUyAqLwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAotI2lmIFVUSU1FX0hBVkVfTk9GT0xMT1dfU1lNTElOS1MKKyNpZmRlZiBVVElNRV9IQVZFX05PRk9MTE9XX1NZTUxJTktTCiAgICAgaWYgKCghZm9sbG93X3N5bWxpbmtzKSAmJiAoZGlyX2ZkID09IERFRkFVTFRfRElSX0ZEKSkKICAgICAgICAgcmVzdWx0ID0gdXRpbWVfbm9mb2xsb3dfc3ltbGlua3MoJnV0aW1lLCBwYXRoLT5uYXJyb3cpOwogICAgIGVsc2UKQEAgLTQ5MjMsNyArNDkzOSw4IEBACiAgICAgUHlfc3NpemVfdCBpLCBwb3MsIGVudmM7CiAgICAgUHlPYmplY3QgKmtleXM9TlVMTCwgKnZhbHM9TlVMTDsKICAgICBQeU9iamVjdCAqa2V5LCAqdmFsLCAqa2V5MiwgKnZhbDI7Ci0gICAgY2hhciAqcCwgKmssICp2OworICAgIGNoYXIgKnA7CisgICAgY29uc3QgY2hhciAqaywgKnY7CiAgICAgc2l6ZV90IGxlbjsKIAogICAgIGkgPSBQeU1hcHBpbmdfU2l6ZShlbnYpOwpAQCAtNTAzOCw3ICs1MDU1LDcgQEAKIG9zX2V4ZWN2X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnBhdGgsIFB5T2JqZWN0ICphcmd2KQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWIyMWRjMzRkZWViNWIwMDQgaW5wdXQ9OTYwNDE1NTk5MjVlNTIyOV0qLwogewotICAgIGNoYXIgKnBhdGhfY2hhcjsKKyAgICBjb25zdCBjaGFyICpwYXRoX2NoYXI7CiAgICAgY2hhciAqKmFyZ3ZsaXN0OwogICAgIFB5X3NzaXplX3QgYXJnYzsKIApAQCAtNTE1OCw3ICs1MTc1LDcgQEAKIG9zX3NwYXdudl9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIGludCBtb2RlLCBQeU9iamVjdCAqcGF0aCwgUHlPYmplY3QgKmFyZ3YpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzQyN2MwY2U0MGYxMDYzOCBpbnB1dD0wNDJjOTFkZmMxZTZkZWJjXSovCiB7Ci0gICAgY2hhciAqcGF0aF9jaGFyOworICAgIGNvbnN0IGNoYXIgKnBhdGhfY2hhcjsKICAgICBjaGFyICoqYXJndmxpc3Q7CiAgICAgaW50IGk7CiAgICAgUHlfc3NpemVfdCBhcmdjOwpAQCAtNTIzNiw3ICs1MjUzLDcgQEAKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZW52KQogLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWViY2ZhNWY3YmEyZjQyMTkgaW5wdXQ9MDIzNjJmZDkzNzk2M2Y4Zl0qLwogewotICAgIGNoYXIgKnBhdGhfY2hhcjsKKyAgICBjb25zdCBjaGFyICpwYXRoX2NoYXI7CiAgICAgY2hhciAqKmFyZ3ZsaXN0OwogICAgIGNoYXIgKiplbnZsaXN0OwogICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOwpAQCAtNTc1NiwxNCArNTc3MywxNCBAQAogICAgIHBpZDogcGlkX3QKICAgICAvCiAKLVJldHVybiB0aGUgYWZmaW5pdHkgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllZCBieSBwaWQuCitSZXR1cm4gdGhlIGFmZmluaXR5IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZWQgYnkgcGlkIChvciB0aGUgY3VycmVudCBwcm9jZXNzIGlmIHplcm8pLgogCiBUaGUgYWZmaW5pdHkgaXMgcmV0dXJuZWQgYXMgYSBzZXQgb2YgQ1BVIGlkZW50aWZpZXJzLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3Nfc2NoZWRfZ2V0YWZmaW5pdHlfaW1wbChQeU9iamVjdCAqbW9kdWxlLCBwaWRfdCBwaWQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjcyNmYyYzE5M2MxN2E0ZiBpbnB1dD1lYWYxNjE5MzY4NzRiOGExXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjcyNmYyYzE5M2MxN2E0ZiBpbnB1dD05ODNjZTdjYjRhNTY1OTgwXSovCiB7CiAgICAgaW50IGNwdSwgbmNwdXMsIGNvdW50OwogICAgIHNpemVfdCBzZXRzaXplOwpAQCAtNTkyNCw3ICs1OTQxLDcgQEAKICAgICBpZiAoX1B5X3NldF9pbmhlcml0YWJsZShtYXN0ZXJfZmQsIDAsIE5VTEwpIDwgMCkKICAgICAgICAgZ290byBwb3NpeF9lcnJvcjsKIAotI2lmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKEhBVkVfREVWX1BUQykKKyNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX0FORFJPSURfXykgJiYgIWRlZmluZWQoSEFWRV9ERVZfUFRDKQogICAgIGlvY3RsKHNsYXZlX2ZkLCBJX1BVU0gsICJwdGVtIik7IC8qIHB1c2ggcHRlbSAqLwogICAgIGlvY3RsKHNsYXZlX2ZkLCBJX1BVU0gsICJsZHRlcm0iKTsgLyogcHVzaCBsZHRlcm0gKi8KICNpZm5kZWYgX19ocHV4CkBAIC02MjQ5LDcgKzYyNjYsNyBAQAogcG9zaXhfaW5pdGdyb3VwcyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKm9uYW1lOwotICAgIGNoYXIgKnVzZXJuYW1lOworICAgIGNvbnN0IGNoYXIgKnVzZXJuYW1lOwogICAgIGludCByZXM7CiAjaWZkZWYgX19BUFBMRV9fCiAgICAgaW50IGdpZDsKQEAgLTcxMjMsMTYgKzcxNDAsMTYgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW5fcmVhZGxpbmsoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dhcmdzKQogewotICAgIHdjaGFyX3QgKnBhdGg7CisgICAgY29uc3Qgd2NoYXJfdCAqcGF0aDsKICAgICBEV09SRCBuX2J5dGVzX3JldHVybmVkOwogICAgIERXT1JEIGlvX3Jlc3VsdDsKICAgICBQeU9iamVjdCAqcG8sICpyZXN1bHQ7Ci0gICAgICAgIGludCBkaXJfZmQ7CisgICAgaW50IGRpcl9mZDsKICAgICBIQU5ETEUgcmVwYXJzZV9wb2ludF9oYW5kbGU7CiAKICAgICBjaGFyIHRhcmdldF9idWZmZXJbTUFYSU1VTV9SRVBBUlNFX0RBVEFfQlVGRkVSX1NJWkVdOwogICAgIFJFUEFSU0VfREFUQV9CVUZGRVIgKnJkYiA9IChSRVBBUlNFX0RBVEFfQlVGRkVSICopdGFyZ2V0X2J1ZmZlcjsKLSAgICB3Y2hhcl90ICpwcmludF9uYW1lOworICAgIGNvbnN0IHdjaGFyX3QgKnByaW50X25hbWU7CiAKICAgICBzdGF0aWMgY2hhciAqa2V5d29yZHNbXSA9IHsicGF0aCIsICJkaXJfZmQiLCBOVUxMfTsKIApAQCAtNzIwMCw4ICs3MjE3LDggQEAKICNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpCiAKIC8qIEdyYWIgQ3JlYXRlU3ltYm9saWNMaW5rVyBkeW5hbWljYWxseSBmcm9tIGtlcm5lbDMyICovCi1zdGF0aWMgRFdPUkQgKENBTExCQUNLICpQeV9DcmVhdGVTeW1ib2xpY0xpbmtXKShMUFdTVFIsIExQV1NUUiwgRFdPUkQpID0gTlVMTDsKLXN0YXRpYyBEV09SRCAoQ0FMTEJBQ0sgKlB5X0NyZWF0ZVN5bWJvbGljTGlua0EpKExQU1RSLCBMUFNUUiwgRFdPUkQpID0gTlVMTDsKK3N0YXRpYyBEV09SRCAoQ0FMTEJBQ0sgKlB5X0NyZWF0ZVN5bWJvbGljTGlua1cpKExQQ1dTVFIsIExQQ1dTVFIsIERXT1JEKSA9IE5VTEw7CitzdGF0aWMgRFdPUkQgKENBTExCQUNLICpQeV9DcmVhdGVTeW1ib2xpY0xpbmtBKShMUENTVFIsIExQQ1NUUiwgRFdPUkQpID0gTlVMTDsKIAogc3RhdGljIGludAogY2hlY2tfQ3JlYXRlU3ltYm9saWNMaW5rKHZvaWQpCkBAIC03MzA2LDcgKzczMjMsNyBAQAogCiAvKiBSZXR1cm4gVHJ1ZSBpZiB0aGUgcGF0aCBhdCBzcmMgcmVsYXRpdmUgdG8gZGVzdCBpcyBhIGRpcmVjdG9yeSAqLwogc3RhdGljIGludAotX2NoZWNrX2RpclcoV0NIQVIgKnNyYywgV0NIQVIgKmRlc3QpCitfY2hlY2tfZGlyVyhMUENXU1RSIHNyYywgTFBDV1NUUiBkZXN0KQogewogICAgIFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEEgc3JjX2luZm87CiAgICAgV0NIQVIgZGVzdF9wYXJlbnRbTUFYX1BBVEhdOwpAQCAtNzMyNSw3ICs3MzQyLDcgQEAKIAogLyogUmV0dXJuIFRydWUgaWYgdGhlIHBhdGggYXQgc3JjIHJlbGF0aXZlIHRvIGRlc3QgaXMgYSBkaXJlY3RvcnkgKi8KIHN0YXRpYyBpbnQKLV9jaGVja19kaXJBKGNoYXIgKnNyYywgY2hhciAqZGVzdCkKK19jaGVja19kaXJBKExQQ1NUUiBzcmMsIExQQ1NUUiBkZXN0KQogewogICAgIFdJTjMyX0ZJTEVfQVRUUklCVVRFX0RBVEEgc3JjX2luZm87CiAgICAgY2hhciBkZXN0X3BhcmVudFtNQVhfUEFUSF07CkBAIC05MDEzLDcgKzkwMzAsNyBAQAogb3NfcHV0ZW52X2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKm5hbWUsIFB5T2JqZWN0ICp2YWx1ZSkKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kMjlhNTY3ZDZiMjMyN2QyIGlucHV0PWJhNTg2NTgxYzJlNjEwNWZdKi8KIHsKLSAgICB3Y2hhcl90ICplbnY7CisgICAgY29uc3Qgd2NoYXJfdCAqZW52OwogCiAgICAgUHlPYmplY3QgKnVuaWNvZGUgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJVU9JVUiLCBuYW1lLCB2YWx1ZSk7CiAgICAgaWYgKHVuaWNvZGUgPT0gTlVMTCkgewpAQCAtOTA1OSw4ICs5MDc2LDggQEAKIHsKICAgICBQeU9iamVjdCAqYnl0ZXMgPSBOVUxMOwogICAgIGNoYXIgKmVudjsKLSAgICBjaGFyICpuYW1lX3N0cmluZyA9IFB5Qnl0ZXNfQXNTdHJpbmcobmFtZSk7Ci0gICAgY2hhciAqdmFsdWVfc3RyaW5nID0gUHlCeXRlc19Bc1N0cmluZyh2YWx1ZSk7CisgICAgY29uc3QgY2hhciAqbmFtZV9zdHJpbmcgPSBQeUJ5dGVzX0FzU3RyaW5nKG5hbWUpOworICAgIGNvbnN0IGNoYXIgKnZhbHVlX3N0cmluZyA9IFB5Qnl0ZXNfQXNTdHJpbmcodmFsdWUpOwogCiAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21Gb3JtYXQoIiVzPSVzIiwgbmFtZV9zdHJpbmcsIHZhbHVlX3N0cmluZyk7CiAgICAgaWYgKGJ5dGVzID09IE5VTEwpIHsKQEAgLTk0NzksOCArOTQ5Niw4IEBACiAgKiBzdWZmaWNpZW50bHkgcGVydmFzaXZlIHRoYXQgaXQncyBub3Qgd29ydGggdGhlIGxvc3Mgb2YgcmVhZGFiaWxpdHkuCiAgKi8KIHN0cnVjdCBjb25zdGRlZiB7Ci0gICAgY2hhciAqbmFtZTsKLSAgICBsb25nIHZhbHVlOworICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgaW50IHZhbHVlOwogfTsKIAogc3RhdGljIGludApAQCAtOTQ4OCw3ICs5NTA1LDEwIEBACiAgICAgICAgICAgICAgIHNpemVfdCB0YWJsZXNpemUpCiB7CiAgICAgaWYgKFB5TG9uZ19DaGVjayhhcmcpKSB7Ci0gICAgICAgICp2YWx1ZXAgPSBQeUxvbmdfQVNfTE9ORyhhcmcpOworICAgICAgICBpbnQgdmFsdWUgPSBfUHlMb25nX0FzSW50KGFyZyk7CisgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICp2YWx1ZXAgPSB2YWx1ZTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogICAgIGVsc2UgewpAQCAtMTA0NDksNyArMTA0NjksNyBAQAogCiBzdGF0aWMgaW50CiBzZXR1cF9jb25mbmFtZV90YWJsZShzdHJ1Y3QgY29uc3RkZWYgKnRhYmxlLCBzaXplX3QgdGFibGVzaXplLAotICAgICAgICAgICAgICAgICAgICAgY2hhciAqdGFibGVuYW1lLCBQeU9iamVjdCAqbW9kdWxlKQorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFibGVuYW1lLCBQeU9iamVjdCAqbW9kdWxlKQogewogICAgIFB5T2JqZWN0ICpkID0gTlVMTDsKICAgICBzaXplX3QgaTsKQEAgLTEwNTc2LDkgKzEwNTk2LDkgQEAKIHdpbjMyX3N0YXJ0ZmlsZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgUHlPYmplY3QgKm9maWxlcGF0aDsKLSAgICBjaGFyICpmaWxlcGF0aDsKLSAgICBjaGFyICpvcGVyYXRpb24gPSBOVUxMOwotICAgIHdjaGFyX3QgKndwYXRoLCAqd29wZXJhdGlvbjsKKyAgICBjb25zdCBjaGFyICpmaWxlcGF0aDsKKyAgICBjb25zdCBjaGFyICpvcGVyYXRpb24gPSBOVUxMOworICAgIGNvbnN0IHdjaGFyX3QgKndwYXRoLCAqd29wZXJhdGlvbjsKICAgICBISU5TVEFOQ0UgcmM7CiAKICAgICBQeU9iamVjdCAqdW5pcGF0aCwgKnVvcGVyYXRpb24gPSBOVUxMOwpAQCAtMTA4MTksNyArMTA4MzksNyBAQAogICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CiAgICAgICAgIHZvaWQgKnB0cjsKICAgICAgICAgc3NpemVfdCByZXN1bHQ7Ci0gICAgICAgIHN0YXRpYyBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0gezEyOCwgWEFUVFJfU0laRV9NQVgsIDB9OworICAgICAgICBzdGF0aWMgY29uc3QgUHlfc3NpemVfdCBidWZmZXJfc2l6ZXNbXSA9IHsxMjgsIFhBVFRSX1NJWkVfTUFYLCAwfTsKICAgICAgICAgUHlfc3NpemVfdCBidWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplc1tpXTsKICAgICAgICAgaWYgKCFidWZmZXJfc2l6ZSkgewogICAgICAgICAgICAgcGF0aF9lcnJvcihwYXRoKTsKQEAgLTEwOTgzLDkgKzExMDAzLDkgQEAKICAgICBuYW1lID0gcGF0aC0+bmFycm93ID8gcGF0aC0+bmFycm93IDogIi4iOwogCiAgICAgZm9yIChpID0gMDsgOyBpKyspIHsKLSAgICAgICAgY2hhciAqc3RhcnQsICp0cmFjZSwgKmVuZDsKKyAgICAgICAgY29uc3QgY2hhciAqc3RhcnQsICp0cmFjZSwgKmVuZDsKICAgICAgICAgc3NpemVfdCBsZW5ndGg7Ci0gICAgICAgIHN0YXRpYyBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0geyAyNTYsIFhBVFRSX0xJU1RfTUFYLCAwIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBQeV9zc2l6ZV90IGJ1ZmZlcl9zaXplc1tdID0geyAyNTYsIFhBVFRSX0xJU1RfTUFYLCAwIH07CiAgICAgICAgIFB5X3NzaXplX3QgYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZXNbaV07CiAgICAgICAgIGlmICghYnVmZmVyX3NpemUpIHsKICAgICAgICAgICAgIC8qIEVSQU5HRSAqLwpAQCAtMTExOTcsMTEgKzExMjE3LDE1IEBACiBvcy5jcHVfY291bnQKIAogUmV0dXJuIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtOyByZXR1cm4gTm9uZSBpZiBpbmRldGVybWluYWJsZS4KKworVGhpcyBudW1iZXIgaXMgbm90IGVxdWl2YWxlbnQgdG8gdGhlIG51bWJlciBvZiBDUFVzIHRoZSBjdXJyZW50IHByb2Nlc3MgY2FuCit1c2UuICBUaGUgbnVtYmVyIG9mIHVzYWJsZSBDUFVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCitgYGxlbihvcy5zY2hlZF9nZXRhZmZpbml0eSgwKSlgYAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogb3NfY3B1X2NvdW50X2ltcGwoUHlPYmplY3QgKm1vZHVsZSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZmMyOTQ2M2MzOTM2YTljIGlucHV0PWQ1NWUyZjhmMzgyM2E2MjhdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01ZmMyOTQ2M2MzOTM2YTljIGlucHV0PWU3YzhmNGJhNmRiYmFkZDNdKi8KIHsKICAgICBpbnQgbmNwdSA9IDA7CiAjaWZkZWYgTVNfV0lORE9XUwpAQCAtMTE0NTgsNyArMTE0ODIsNyBAQAogICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc3Q7CiAKICNpZmRlZiBNU19XSU5ET1dTCi0gICAgd2NoYXJfdCAqcGF0aDsKKyAgICBjb25zdCB3Y2hhcl90ICpwYXRoOwogCiAgICAgcGF0aCA9IFB5VW5pY29kZV9Bc1VuaWNvZGUoc2VsZi0+cGF0aCk7CiAgICAgaWYgKCFwYXRoKQpAQCAtMTE0NzUsNyArMTE0OTksNyBAQAogICAgIH0KICNlbHNlIC8qIFBPU0lYICovCiAgICAgUHlPYmplY3QgKmJ5dGVzOwotICAgIGNoYXIgKnBhdGg7CisgICAgY29uc3QgY2hhciAqcGF0aDsKIAogICAgIGlmICghUHlVbmljb2RlX0ZTQ29udmVydGVyKHNlbGYtPnBhdGgsICZieXRlcykpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE2NTksNyArMTE2ODMsNyBAQAogewogI2lmZGVmIE1TX1dJTkRPV1MKICAgICBpZiAoIXNlbGYtPmdvdF9maWxlX2luZGV4KSB7Ci0gICAgICAgIHdjaGFyX3QgKnBhdGg7CisgICAgICAgIGNvbnN0IHdjaGFyX3QgKnBhdGg7CiAgICAgICAgIHN0cnVjdCBfUHlfc3RhdF9zdHJ1Y3Qgc3RhdDsKIAogICAgICAgICBwYXRoID0gUHlVbmljb2RlX0FzVW5pY29kZShzZWxmLT5wYXRoKTsKQEAgLTExNjkwLDYgKzExNzE0LDEzIEBACiAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tRm9ybWF0KCI8RGlyRW50cnkgJVI+Iiwgc2VsZi0+bmFtZSk7CiB9CiAKK3N0YXRpYyBQeU9iamVjdCAqCitEaXJFbnRyeV9mc3BhdGgoRGlyRW50cnkgKnNlbGYpCit7CisgICAgUHlfSU5DUkVGKHNlbGYtPnBhdGgpOworICAgIHJldHVybiBzZWxmLT5wYXRoOworfQorCiBzdGF0aWMgUHlNZW1iZXJEZWYgRGlyRW50cnlfbWVtYmVyc1tdID0gewogICAgIHsibmFtZSIsIFRfT0JKRUNUX0VYLCBvZmZzZXRvZihEaXJFbnRyeSwgbmFtZSksIFJFQURPTkxZLAogICAgICAidGhlIGVudHJ5J3MgYmFzZSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gc2NhbmRpcigpIFwicGF0aFwiIGFyZ3VtZW50In0sCkBAIC0xMTcxNCw2ICsxMTc0NSw5IEBACiAgICAgeyJpbm9kZSIsIChQeUNGdW5jdGlvbilEaXJFbnRyeV9pbm9kZSwgTUVUSF9OT0FSR1MsCiAgICAgICJyZXR1cm4gaW5vZGUgb2YgdGhlIGVudHJ5OyBjYWNoZWQgcGVyIGVudHJ5IiwKICAgICB9LAorICAgIHsiX19mc3BhdGhfXyIsIChQeUNGdW5jdGlvbilEaXJFbnRyeV9mc3BhdGgsIE1FVEhfTk9BUkdTLAorICAgICAicmV0dXJucyB0aGUgcGF0aCBmb3IgdGhlIGVudHJ5IiwKKyAgICB9LAogICAgIHtOVUxMfQogfTsKIApAQCAtMTE3NTMsNyArMTE3ODcsNyBAQAogI2lmZGVmIE1TX1dJTkRPV1MKIAogc3RhdGljIHdjaGFyX3QgKgotam9pbl9wYXRoX2ZpbGVuYW1lVyh3Y2hhcl90ICpwYXRoX3dpZGUsIHdjaGFyX3QqIGZpbGVuYW1lKQoram9pbl9wYXRoX2ZpbGVuYW1lVyhjb25zdCB3Y2hhcl90ICpwYXRoX3dpZGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVuYW1lKQogewogICAgIFB5X3NzaXplX3QgcGF0aF9sZW47CiAgICAgUHlfc3NpemVfdCBzaXplOwpAQCAtMTE4MjgsNyArMTE4NjIsNyBAQAogI2Vsc2UgLyogUE9TSVggKi8KIAogc3RhdGljIGNoYXIgKgotam9pbl9wYXRoX2ZpbGVuYW1lKGNoYXIgKnBhdGhfbmFycm93LCBjaGFyKiBmaWxlbmFtZSwgUHlfc3NpemVfdCBmaWxlbmFtZV9sZW4pCitqb2luX3BhdGhfZmlsZW5hbWUoY29uc3QgY2hhciAqcGF0aF9uYXJyb3csIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBQeV9zc2l6ZV90IGZpbGVuYW1lX2xlbikKIHsKICAgICBQeV9zc2l6ZV90IHBhdGhfbGVuOwogICAgIFB5X3NzaXplX3Qgc2l6ZTsKQEAgLTExODYwLDcgKzExODk0LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLURpckVudHJ5X2Zyb21fcG9zaXhfaW5mbyhwYXRoX3QgKnBhdGgsIGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgbmFtZV9sZW4sCitEaXJFbnRyeV9mcm9tX3Bvc2l4X2luZm8ocGF0aF90ICpwYXRoLCBjb25zdCBjaGFyICpuYW1lLCBQeV9zc2l6ZV90IG5hbWVfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlub190IGRfaW5vCiAjaWZkZWYgSEFWRV9ESVJFTlRfRF9UWVBFCiAgICAgICAgICAgICAgICAgICAgICAgICAgLCB1bnNpZ25lZCBjaGFyIGRfdHlwZQpAQCAtMTE5MjMsOCArMTE5NTcsMTQgQEAKIAogI2lmZGVmIE1TX1dJTkRPV1MKIAorc3RhdGljIGludAorU2NhbmRpckl0ZXJhdG9yX2lzX2Nsb3NlZChTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIHJldHVybiBpdGVyYXRvci0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCiBzdGF0aWMgdm9pZAotU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCitTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKIHsKICAgICBIQU5ETEUgaGFuZGxlID0gaXRlcmF0b3ItPmhhbmRsZTsKIApAQCAtMTE5NDQsNyArMTE5ODQsNyBAQAogICAgIEJPT0wgc3VjY2VzczsKICAgICBQeU9iamVjdCAqZW50cnk7CiAKLSAgICAvKiBIYXBwZW5zIGlmIHRoZSBpdGVyYXRvciBpcyBpdGVyYXRlZCB0d2ljZSAqLworICAgIC8qIEhhcHBlbnMgaWYgdGhlIGl0ZXJhdG9yIGlzIGl0ZXJhdGVkIHR3aWNlLCBvciBjbG9zZWQgZXhwbGljaXRseSAqLwogICAgIGlmIChpdGVyYXRvci0+aGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMTE5NzUsMTQgKzEyMDE1LDIwIEBACiAgICAgfQogCiAgICAgLyogRXJyb3Igb3Igbm8gbW9yZSBmaWxlcyAqLwotICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZShpdGVyYXRvcik7CisgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKGl0ZXJhdG9yKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIAogI2Vsc2UgLyogUE9TSVggKi8KIAorc3RhdGljIGludAorU2NhbmRpckl0ZXJhdG9yX2lzX2Nsb3NlZChTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQoreworICAgIHJldHVybiAhaXRlcmF0b3ItPmRpcnA7Cit9CisKIHN0YXRpYyB2b2lkCi1TY2FuZGlySXRlcmF0b3JfY2xvc2UoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK1NjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihTY2FuZGlySXRlcmF0b3IgKml0ZXJhdG9yKQogewogICAgIERJUiAqZGlycCA9IGl0ZXJhdG9yLT5kaXJwOwogCkBAIC0xMjAwNCw3ICsxMjA1MCw3IEBACiAgICAgaW50IGlzX2RvdDsKICAgICBQeU9iamVjdCAqZW50cnk7CiAKLSAgICAvKiBIYXBwZW5zIGlmIHRoZSBpdGVyYXRvciBpcyBpdGVyYXRlZCB0d2ljZSAqLworICAgIC8qIEhhcHBlbnMgaWYgdGhlIGl0ZXJhdG9yIGlzIGl0ZXJhdGVkIHR3aWNlLCBvciBjbG9zZWQgZXhwbGljaXRseSAqLwogICAgIGlmICghaXRlcmF0b3ItPmRpcnApCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0xMjA0MSwyMSArMTIwODcsNzYgQEAKICAgICB9CiAKICAgICAvKiBFcnJvciBvciBubyBtb3JlIGZpbGVzICovCi0gICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKGl0ZXJhdG9yKTsKKyAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoaXRlcmF0b3IpOwogICAgIHJldHVybiBOVUxMOwogfQogCiAjZW5kaWYKIAorc3RhdGljIFB5T2JqZWN0ICoKK1NjYW5kaXJJdGVyYXRvcl9jbG9zZShTY2FuZGlySXRlcmF0b3IgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFNjYW5kaXJJdGVyYXRvcl9jbG9zZWRpcihzZWxmKTsKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK1NjYW5kaXJJdGVyYXRvcl9lbnRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlfSU5DUkVGKHNlbGYpOworICAgIHJldHVybiBzZWxmOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorU2NhbmRpckl0ZXJhdG9yX2V4aXQoU2NhbmRpckl0ZXJhdG9yICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBTY2FuZGlySXRlcmF0b3JfY2xvc2VkaXIoc2VsZik7CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkCitTY2FuZGlySXRlcmF0b3JfZmluYWxpemUoU2NhbmRpckl0ZXJhdG9yICppdGVyYXRvcikKK3sKKyAgICBQeU9iamVjdCAqZXJyb3JfdHlwZSwgKmVycm9yX3ZhbHVlLCAqZXJyb3JfdHJhY2ViYWNrOworCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBleGNlcHRpb24sIGlmIGFueS4gKi8KKyAgICBQeUVycl9GZXRjaCgmZXJyb3JfdHlwZSwgJmVycm9yX3ZhbHVlLCAmZXJyb3JfdHJhY2ViYWNrKTsKKworICAgIGlmICghU2NhbmRpckl0ZXJhdG9yX2lzX2Nsb3NlZChpdGVyYXRvcikpIHsKKyAgICAgICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlZGlyKGl0ZXJhdG9yKTsKKworICAgICAgICBpZiAoUHlFcnJfUmVzb3VyY2VXYXJuaW5nKChQeU9iamVjdCAqKWl0ZXJhdG9yLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmNsb3NlZCBzY2FuZGlyIGl0ZXJhdG9yICVSIiwgaXRlcmF0b3IpKSB7CisgICAgICAgICAgICAvKiBTcHVyaW91cyBlcnJvcnMgY2FuIGFwcGVhciBhdCBzaHV0ZG93biAqLworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfV2FybmluZykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoKFB5T2JqZWN0ICopIGl0ZXJhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFB5X0NMRUFSKGl0ZXJhdG9yLT5wYXRoLm9iamVjdCk7CisgICAgcGF0aF9jbGVhbnVwKCZpdGVyYXRvci0+cGF0aCk7CisKKyAgICAvKiBSZXN0b3JlIHRoZSBzYXZlZCBleGNlcHRpb24uICovCisgICAgUHlFcnJfUmVzdG9yZShlcnJvcl90eXBlLCBlcnJvcl92YWx1ZSwgZXJyb3JfdHJhY2ViYWNrKTsKK30KKwogc3RhdGljIHZvaWQKIFNjYW5kaXJJdGVyYXRvcl9kZWFsbG9jKFNjYW5kaXJJdGVyYXRvciAqaXRlcmF0b3IpCiB7Ci0gICAgU2NhbmRpckl0ZXJhdG9yX2Nsb3NlKGl0ZXJhdG9yKTsKLSAgICBQeV9YREVDUkVGKGl0ZXJhdG9yLT5wYXRoLm9iamVjdCk7Ci0gICAgcGF0aF9jbGVhbnVwKCZpdGVyYXRvci0+cGF0aCk7CisgICAgaWYgKFB5T2JqZWN0X0NhbGxGaW5hbGl6ZXJGcm9tRGVhbGxvYygoUHlPYmplY3QgKilpdGVyYXRvcikgPCAwKQorICAgICAgICByZXR1cm47CisKICAgICBQeV9UWVBFKGl0ZXJhdG9yKS0+dHBfZnJlZSgoUHlPYmplY3QgKilpdGVyYXRvcik7CiB9CiAKK3N0YXRpYyBQeU1ldGhvZERlZiBTY2FuZGlySXRlcmF0b3JfbWV0aG9kc1tdID0geworICAgIHsiX19lbnRlcl9fIiwgKFB5Q0Z1bmN0aW9uKVNjYW5kaXJJdGVyYXRvcl9lbnRlciwgTUVUSF9OT0FSR1N9LAorICAgIHsiX19leGl0X18iLCAoUHlDRnVuY3Rpb24pU2NhbmRpckl0ZXJhdG9yX2V4aXQsIE1FVEhfVkFSQVJHU30sCisgICAgeyJjbG9zZSIsIChQeUNGdW5jdGlvbilTY2FuZGlySXRlcmF0b3JfY2xvc2UsIE1FVEhfTk9BUkdTfSwKKyAgICB7TlVMTH0KK307CisKIHN0YXRpYyBQeVR5cGVPYmplY3QgU2NhbmRpckl0ZXJhdG9yVHlwZSA9IHsKICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICBNT0ROQU1FICIuU2NhbmRpckl0ZXJhdG9yIiwgICAgICAgICAgICAgLyogdHBfbmFtZSAqLwpAQCAtMTIwNzcsNyArMTIxNzgsOCBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLwogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQKKyAgICAgICAgfCBQeV9UUEZMQUdTX0hBVkVfRklOQUxJWkUsICAgICAgICAgLyogdHBfZmxhZ3MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCkBAIC0xMjA4NSw2ICsxMjE4NywyNyBAQAogICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVyICovCiAgICAgKGl0ZXJuZXh0ZnVuYylTY2FuZGlySXRlcmF0b3JfaXRlcm5leHQsIC8qIHRwX2l0ZXJuZXh0ICovCisgICAgU2NhbmRpckl0ZXJhdG9yX21ldGhvZHMsICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pbml0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX25ldyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2lzX2djICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWNoZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdWJjbGFzc2VzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RlbCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF92ZXJzaW9uX3RhZyAqLworICAgIChkZXN0cnVjdG9yKVNjYW5kaXJJdGVyYXRvcl9maW5hbGl6ZSwgICAvKiB0cF9maW5hbGl6ZSAqLwogfTsKIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEyMDk1LDcgKzEyMjE4LDcgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgd2NoYXJfdCAqcGF0aF9zdHJXOwogI2Vsc2UKLSAgICBjaGFyICpwYXRoOworICAgIGNvbnN0IGNoYXIgKnBhdGg7CiAjZW5kaWYKIAogICAgIGl0ZXJhdG9yID0gUHlPYmplY3RfTmV3KFNjYW5kaXJJdGVyYXRvciwgJlNjYW5kaXJJdGVyYXRvclR5cGUpOwpAQCAtMTIxNjcsNiArMTIyOTAsNjkgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorLyoKKyAgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KKworICAgIElmIHRoZSBvYmplY3QgaXMgc3RyIG9yIGJ5dGVzLCB0aGVuIGFsbG93IGl0IHRvIHBhc3MgdGhyb3VnaCB3aXRoCisgICAgYW4gaW5jcmVtZW50ZWQgcmVmY291bnQuIElmIHRoZSBvYmplY3QgZGVmaW5lcyBfX2ZzcGF0aF9fKCksIHRoZW4KKyAgICByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGF0IG1ldGhvZC4gQWxsIG90aGVyIHR5cGVzIHJhaXNlIGEgVHlwZUVycm9yLgorKi8KK1B5T2JqZWN0ICoKK1B5T1NfRlNQYXRoKFB5T2JqZWN0ICpwYXRoKQoreworICAgIF9QeV9JREVOVElGSUVSKF9fZnNwYXRoX18pOworICAgIFB5T2JqZWN0ICpmdW5jID0gTlVMTDsKKyAgICBQeU9iamVjdCAqcGF0aF9yZXByID0gTlVMTDsKKworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2socGF0aCkgfHwgUHlCeXRlc19DaGVjayhwYXRoKSkgeworICAgICAgICBQeV9JTkNSRUYocGF0aCk7CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIGZ1bmMgPSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChwYXRoLCAmUHlJZF9fX2ZzcGF0aF9fKTsKKyAgICBpZiAoTlVMTCA9PSBmdW5jKSB7CisgICAgICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHIsIGJ5dGVzIG9yIG9zLlBhdGhMaWtlIG9iamVjdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJS4yMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHBhdGgpLT50cF9uYW1lKTsKKyAgICB9CisKKyAgICBwYXRoX3JlcHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmMsIE5VTEwpOworICAgIFB5X0RFQ1JFRihmdW5jKTsKKyAgICBpZiAoTlVMTCA9PSBwYXRoX3JlcHIpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCEoUHlVbmljb2RlX0NoZWNrKHBhdGhfcmVwcikgfHwgUHlCeXRlc19DaGVjayhwYXRoX3JlcHIpKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICUuMjAwcy5fX2ZzcGF0aF9fKCkgdG8gcmV0dXJuIHN0ciBvciBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgIm5vdCAlLjIwMHMiLCBQeV9UWVBFKHBhdGgpLT50cF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShwYXRoX3JlcHIpLT50cF9uYW1lKTsKKyAgICAgICAgUHlfREVDUkVGKHBhdGhfcmVwcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBwYXRoX3JlcHI7Cit9CisKKy8qW2NsaW5pYyBpbnB1dF0KK29zLmZzcGF0aAorCisgICAgcGF0aDogb2JqZWN0CisKK1JldHVybiB0aGUgZmlsZSBzeXN0ZW0gcGF0aCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorCitJZiB0aGUgb2JqZWN0IGlzIHN0ciBvciBieXRlcywgdGhlbiBhbGxvdyBpdCB0byBwYXNzIHRocm91Z2ggYXMtaXMuIElmIHRoZQorb2JqZWN0IGRlZmluZXMgX19mc3BhdGhfXygpLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoYXQgbWV0aG9kLiBBbGwgb3RoZXIKK3R5cGVzIHJhaXNlIGEgVHlwZUVycm9yLgorW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLworCitzdGF0aWMgUHlPYmplY3QgKgorb3NfZnNwYXRoX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnBhdGgpCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzNjM2I3OGVjZmYyOTE0ZiBpbnB1dD1lMzU3MTY1ZjdiMjI0OTBmXSovCit7CisgICAgcmV0dXJuIFB5T1NfRlNQYXRoKHBhdGgpOworfQogCiAjaW5jbHVkZSAiY2xpbmljL3Bvc2l4bW9kdWxlLmMuaCIKIApAQCAtMTIzNjcsNiArMTI1NTMsNyBAQAogICAgIHsic2NhbmRpciIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKXBvc2l4X3NjYW5kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAogICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXhfc2NhbmRpcl9fZG9jX199LAorICAgIE9TX0ZTUEFUSF9NRVRIT0RERUYKICAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAgLyogU2VudGluZWwgKi8KIH07CiAKQEAgLTEyMzc4LDcgKzEyNTY1LDYgQEAKICAgICBIQU5ETEUgdG9rOwogICAgIFRPS0VOX1BSSVZJTEVHRVMgdG9rX3ByaXY7CiAgICAgTFVJRCBsdWlkOwotICAgIGludCBtZXRoX2lkeCA9IDA7CiAKICAgICBpZiAoIU9wZW5Qcm9jZXNzVG9rZW4oR2V0Q3VycmVudFByb2Nlc3MoKSwgVE9LRU5fQUxMX0FDQ0VTUywgJnRvaykpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMTI0ODEsMTIgKzEyNjY3LDE0IEBACiAjaWZkZWYgT19MQVJHRUZJTEUKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgT19MQVJHRUZJTEUpKSByZXR1cm4gLTE7CiAjZW5kaWYKKyNpZm5kZWYgX19HTlVfXwogI2lmZGVmIE9fU0hMT0NLCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIE9fU0hMT0NLKSkgcmV0dXJuIC0xOwogI2VuZGlmCiAjaWZkZWYgT19FWExPQ0sKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgT19FWExPQ0spKSByZXR1cm4gLTE7CiAjZW5kaWYKKyNlbmRpZgogI2lmZGVmIE9fRVhFQwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBPX0VYRUMpKSByZXR1cm4gLTE7CiAjZW5kaWYKQEAgLTEyNzgzLDI1ICsxMjk3MSwyNSBAQAogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBYQVRUUl9TSVpFX01BWCkpIHJldHVybiAtMTsKICNlbmRpZgogCi0jaWZkZWYgUlRMRF9MQVpZCisjaWYgSEFWRV9ERUNMX1JUTERfTEFaWQogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX0xBWlkpKSByZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBSVExEX05PVworI2lmIEhBVkVfREVDTF9SVExEX05PVwogICAgIGlmIChQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBSVExEX05PVykpIHJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFJUTERfR0xPQkFMCisjaWYgSEFWRV9ERUNMX1JUTERfR0xPQkFMCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfR0xPQkFMKSkgcmV0dXJuIC0xOwogI2VuZGlmCi0jaWZkZWYgUlRMRF9MT0NBTAorI2lmIEhBVkVfREVDTF9SVExEX0xPQ0FMCiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfTE9DQUwpKSByZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBSVExEX05PREVMRVRFCisjaWYgSEFWRV9ERUNMX1JUTERfTk9ERUxFVEUKICAgICBpZiAoUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgUlRMRF9OT0RFTEVURSkpIHJldHVybiAtMTsKICNlbmRpZgotI2lmZGVmIFJUTERfTk9MT0FECisjaWYgSEFWRV9ERUNMX1JUTERfTk9MT0FECiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfTk9MT0FEKSkgcmV0dXJuIC0xOwogI2VuZGlmCi0jaWZkZWYgUlRMRF9ERUVQQklORAorI2lmIEhBVkVfREVDTF9SVExEX0RFRVBCSU5ECiAgICAgaWYgKFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFJUTERfREVFUEJJTkQpKSByZXR1cm4gLTE7CiAjZW5kaWYKIApAQCAtMTI4MjIsNyArMTMwMTAsNyBAQAogfTsKIAogCi1zdGF0aWMgY2hhciAqaGF2ZV9mdW5jdGlvbnNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGF2ZV9mdW5jdGlvbnNbXSA9IHsKIAogI2lmZGVmIEhBVkVfRkFDQ0VTU0FUCiAgICAgIkhBVkVfRkFDQ0VTU0FUIiwKQEAgLTEyOTU3LDcgKzEzMTQ1LDcgQEAKIHsKICAgICBQeU9iamVjdCAqbSwgKnY7CiAgICAgUHlPYmplY3QgKmxpc3Q7Ci0gICAgY2hhciAqKnRyYWNlOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqdHJhY2U7CiAKICNpZiBkZWZpbmVkKEhBVkVfU1lNTElOSykgJiYgZGVmaW5lZChNU19XSU5ET1dTKQogICAgIHdpbjMyX2Nhbl9zeW1saW5rID0gZW5hYmxlX3N5bWxpbmsoKTsKQEAgLTEzMTMyLDYgKzEzMzIwLDcgQEAKICAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwogICAgIH0KICAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIl9oYXZlX2Z1bmN0aW9ucyIsIGxpc3QpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRGlyRW50cnkiLCAoUHlPYmplY3QgKikmRGlyRW50cnlUeXBlKTsKIAogICAgIGluaXRpYWxpemVkID0gMTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9wd2Rtb2R1bGUuYyBiL01vZHVsZXMvcHdkbW9kdWxlLmMKaW5kZXggNzQxNmNmNy4uNzg0ZTlkMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9wd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3B3ZG1vZHVsZS5jCkBAIC03NSwxMCArNzUsMTggQEAKICNkZWZpbmUgU0VUUyhpLHZhbCkgc2V0cyh2LCBpLCB2YWwpCiAKICAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X25hbWUpOworI2lmIGRlZmluZWQoSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX1BBU1NXRCkgJiYgIWRlZmluZWQoX19BTkRST0lEX18pCiAgICAgU0VUUyhzZXRJbmRleCsrLCBwLT5wd19wYXNzd2QpOworI2Vsc2UKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKKyNlbmRpZgogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgc2V0SW5kZXgrKywgX1B5TG9uZ19Gcm9tVWlkKHAtPnB3X3VpZCkpOwogICAgIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0odiwgc2V0SW5kZXgrKywgX1B5TG9uZ19Gcm9tR2lkKHAtPnB3X2dpZCkpOworI2lmIGRlZmluZWQoSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX0dFQ09TKQogICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfZ2Vjb3MpOworI2Vsc2UKKyAgICBTRVRTKHNldEluZGV4KyssICIiKTsKKyNlbmRpZgogICAgIFNFVFMoc2V0SW5kZXgrKywgcC0+cHdfZGlyKTsKICAgICBTRVRTKHNldEluZGV4KyssIHAtPnB3X3NoZWxsKTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9weWV4cGF0LmMgYi9Nb2R1bGVzL3B5ZXhwYXQuYwppbmRleCBlYjMyMmMyLi5kYzk3ZTlkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B5ZXhwYXQuYworKysgYi9Nb2R1bGVzL3B5ZXhwYXQuYwpAQCAtOTEsNyArOTEsNyBAQAogICogZmFsc2Ugb24gYW4gZXhjZXB0aW9uLgogICovCiBzdGF0aWMgaW50Ci1zZXRfZXJyb3JfYXR0cihQeU9iamVjdCAqZXJyLCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCitzZXRfZXJyb3JfYXR0cihQeU9iamVjdCAqZXJyLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdmFsdWUpCiB7CiAgICAgUHlPYmplY3QgKnYgPSBQeUxvbmdfRnJvbUxvbmcodmFsdWUpOwogCkBAIC0yMTgsNyArMjE4LDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0KgotY2FsbF93aXRoX2ZyYW1lKGNoYXIgKmZ1bmNuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCogZnVuYywgUHlPYmplY3QqIGFyZ3MsCitjYWxsX3dpdGhfZnJhbWUoY29uc3QgY2hhciAqZnVuY25hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0KiBmdW5jLCBQeU9iamVjdCogYXJncywKICAgICAgICAgICAgICAgICB4bWxwYXJzZW9iamVjdCAqc2VsZikKIHsKICAgICBQeU9iamVjdCAqcmVzOwpAQCAtNzQ3LDcgKzc0Nyw4IEBACiAgICAgICAgIHMgKz0gTUFYX0NIVU5LX1NJWkU7CiAgICAgICAgIHNsZW4gLT0gTUFYX0NIVU5LX1NJWkU7CiAgICAgfQotICAgIGFzc2VydChNQVhfQ0hVTktfU0laRSA8IElOVF9NQVggJiYgc2xlbiA8IElOVF9NQVgpOworICAgIFB5X0JVSUxEX0FTU0VSVChNQVhfQ0hVTktfU0laRSA8PSBJTlRfTUFYKTsKKyAgICBhc3NlcnQoc2xlbiA8PSBJTlRfTUFYKTsKICAgICByYyA9IFhNTF9QYXJzZShzZWxmLT5pdHNlbGYsIHMsIChpbnQpc2xlbiwgaXNmaW5hbCk7CiAKIGRvbmU6CkBAIC03NjUsNyArNzY2LDcgQEAKIHsKICAgICBQeU9iamVjdCAqc3RyOwogICAgIFB5X3NzaXplX3QgbGVuOwotICAgIGNoYXIgKnB0cjsKKyAgICBjb25zdCBjaGFyICpwdHI7CiAKICAgICBzdHIgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24obWV0aCwgIm4iLCBidWZfc2l6ZSk7CiAgICAgaWYgKHN0ciA9PSBOVUxMKQpAQCAtMTIyNSwxMiArMTIyNiw4IEBACiAgICAgc2VsZi0+aXRzZWxmID0gTlVMTDsKIAogICAgIGlmIChzZWxmLT5oYW5kbGVycyAhPSBOVUxMKSB7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wOwotICAgICAgICBmb3IgKGkgPSAwOyBoYW5kbGVyX2luZm9baV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7Ci0gICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAgICAgUHlfQ0xFQVIoc2VsZi0+aGFuZGxlcnNbaV0pOwogICAgICAgICBQeU1lbV9GcmVlKHNlbGYtPmhhbmRsZXJzKTsKICAgICAgICAgc2VsZi0+aGFuZGxlcnMgPSBOVUxMOwogICAgIH0KQEAgLTEzNDQsNyArMTM0MSw2IEBACiAgICAgaW50IGhhbmRsZXJudW0gPSBoYW5kbGVybmFtZTJpbnQobmFtZSk7CiAgICAgaWYgKGhhbmRsZXJudW0gPj0gMCkgewogICAgICAgICB4bWxoYW5kbGVyIGNfaGFuZGxlciA9IE5VTEw7Ci0gICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV07CiAKICAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgewogICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciwgYW5kIGEgY2hhcmFjdGVyCkBAIC0xMzY2LDggKzEzNjIsNyBAQAogICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwogICAgICAgICAgICAgY19oYW5kbGVyID0gaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLmhhbmRsZXI7CiAgICAgICAgIH0KLSAgICAgICAgc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV0gPSB2OwotICAgICAgICBQeV9YREVDUkVGKHRlbXApOworICAgICAgICBQeV9YU0VUUkVGKHNlbGYtPmhhbmRsZXJzW2hhbmRsZXJudW1dLCB2KTsKICAgICAgICAgaGFuZGxlcl9pbmZvW2hhbmRsZXJudW1dLnNldHRlcihzZWxmLT5pdHNlbGYsIGNfaGFuZGxlcik7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTE4OTcsMTUgKzE4OTIsMTIgQEAKIGNsZWFyX2hhbmRsZXJzKHhtbHBhcnNlb2JqZWN0ICpzZWxmLCBpbnQgaW5pdGlhbCkKIHsKICAgICBpbnQgaSA9IDA7Ci0gICAgUHlPYmplY3QgKnRlbXA7CiAKICAgICBmb3IgKDsgaGFuZGxlcl9pbmZvW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CiAgICAgICAgIGlmIChpbml0aWFsKQogICAgICAgICAgICAgc2VsZi0+aGFuZGxlcnNbaV0gPSBOVUxMOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHRlbXAgPSBzZWxmLT5oYW5kbGVyc1tpXTsKLSAgICAgICAgICAgIHNlbGYtPmhhbmRsZXJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7CisgICAgICAgICAgICBQeV9DTEVBUihzZWxmLT5oYW5kbGVyc1tpXSk7CiAgICAgICAgICAgICBoYW5kbGVyX2luZm9baV0uc2V0dGVyKHNlbGYtPml0c2VsZiwgTlVMTCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3JlYWRsaW5lLmMgYi9Nb2R1bGVzL3JlYWRsaW5lLmMKaW5kZXggOTFmN2NjYS4uZjg4NzZlMCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9yZWFkbGluZS5jCisrKyBiL01vZHVsZXMvcmVhZGxpbmUuYwpAQCAtMzQzLDEwICszNDMsOCBAQAogICAgICAgICBQeV9DTEVBUigqaG9va192YXIpOwogICAgIH0KICAgICBlbHNlIGlmIChQeUNhbGxhYmxlX0NoZWNrKGZ1bmN0aW9uKSkgewotICAgICAgICBQeU9iamVjdCAqdG1wID0gKmhvb2tfdmFyOwogICAgICAgICBQeV9JTkNSRUYoZnVuY3Rpb24pOwotICAgICAgICAqaG9va192YXIgPSBmdW5jdGlvbjsKLSAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICBQeV9YU0VUUkVGKCpob29rX3ZhciwgZnVuY3Rpb24pOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKQEAgLTYwNCw2ICs2MDIsMjQgQEAKICJhZGRfaGlzdG9yeShzdHJpbmcpIC0+IE5vbmVcblwKIGFkZCBhbiBpdGVtIHRvIHRoZSBoaXN0b3J5IGJ1ZmZlciIpOwogCitzdGF0aWMgaW50IHNob3VsZF9hdXRvX2FkZF9oaXN0b3J5ID0gMTsKKworLyogRW5hYmxlIG9yIGRpc2FibGUgYXV0b21hdGljIGhpc3RvcnkgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK3B5X3NldF9hdXRvX2hpc3RvcnkoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicDpzZXRfYXV0b19oaXN0b3J5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnNob3VsZF9hdXRvX2FkZF9oaXN0b3J5KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgUHlfUkVUVVJOX05PTkU7Cit9CisKK1B5RG9jX1NUUlZBUihkb2Nfc2V0X2F1dG9faGlzdG9yeSwKKyJzZXRfYXV0b19oaXN0b3J5KGVuYWJsZWQpIC0+IE5vbmVcblwKK0VuYWJsZXMgb3IgZGlzYWJsZXMgYXV0b21hdGljIGhpc3RvcnkuIik7CisKIAogLyogR2V0IHRoZSB0YWItY29tcGxldGlvbiB3b3JkLWRlbGltaXRlcnMgdGhhdCByZWFkbGluZSB1c2VzICovCiAKQEAgLTgyMiw2ICs4MzgsNyBAQAogCiAgICAgeyJzZXRfY29tcGxldGVyX2RlbGltcyIsIHNldF9jb21wbGV0ZXJfZGVsaW1zLAogICAgICBNRVRIX08sIGRvY19zZXRfY29tcGxldGVyX2RlbGltc30sCisgICAgeyJzZXRfYXV0b19oaXN0b3J5IiwgcHlfc2V0X2F1dG9faGlzdG9yeSwgTUVUSF9WQVJBUkdTLCBkb2Nfc2V0X2F1dG9faGlzdG9yeX0sCiAgICAgeyJhZGRfaGlzdG9yeSIsIHB5X2FkZF9oaXN0b3J5LCBNRVRIX08sIGRvY19hZGRfaGlzdG9yeX0sCiAgICAgeyJyZW1vdmVfaGlzdG9yeV9pdGVtIiwgcHlfcmVtb3ZlX2hpc3RvcnksIE1FVEhfVkFSQVJHUywgZG9jX3JlbW92ZV9oaXN0b3J5fSwKICAgICB7InJlcGxhY2VfaGlzdG9yeV9pdGVtIiwgcHlfcmVwbGFjZV9oaXN0b3J5LCBNRVRIX1ZBUkFSR1MsIGRvY19yZXBsYWNlX2hpc3Rvcnl9LApAQCAtODU3LDcgKzg3NCw3IEBACiAgICAgICAgIGlmIChyID09IFB5X05vbmUpCiAgICAgICAgICAgICByZXN1bHQgPSAwOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFB5TG9uZ19Bc0xvbmcocik7CisgICAgICAgICAgICByZXN1bHQgPSBfUHlMb25nX0FzSW50KHIpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KQEAgLTEzMjQsNyArMTM0MSw3IEBACiAKICAgICAvKiB3ZSBoYXZlIGEgdmFsaWQgbGluZSAqLwogICAgIG4gPSBzdHJsZW4ocCk7Ci0gICAgaWYgKG4gPiAwKSB7CisgICAgaWYgKHNob3VsZF9hdXRvX2FkZF9oaXN0b3J5ICYmIG4gPiAwKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmxpbmU7CiAgICAgICAgIGludCBsZW5ndGggPSBfcHlfZ2V0X2hpc3RvcnlfbGVuZ3RoKCk7CiAgICAgICAgIGlmIChsZW5ndGggPiAwKQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKaW5kZXggMDAzMjRhNS4uYTZiNjNkMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCkBAIC0xODQyLDcgKzE4NDIsNyBAQAogICAgIFB5T2JqZWN0ICpwZmQ7CiAgICAgc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJpZGVudCIsICJmaWx0ZXIiLCAiZmxhZ3MiLCAiZmZsYWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiLCAidWRhdGEiLCBOVUxMfTsKLSAgICBzdGF0aWMgY2hhciAqZm10ID0gIk98aEhJIiBEQVRBX0ZNVF9VTklUIFVJTlRQVFJUX0ZNVF9VTklUICI6a2V2ZW50IjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBmbXRbXSA9ICJPfGhISSIgREFUQV9GTVRfVU5JVCBVSU5UUFRSVF9GTVRfVU5JVCAiOmtldmVudCI7CiAKICAgICBFVl9TRVQoJihzZWxmLT5lKSwgMCwgRVZGSUxUX1JFQUQsIEVWX0FERCwgMCwgMCwgMCk7IC8qIGRlZmF1bHRzICovCiAKQEAgLTIxMjcsNyArMjEyNyw3IEBACiAgICAgICAgIGlmIChfUHlUaW1lX0Zyb21TZWNvbmRzT2JqZWN0KCZ0aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGltZW91dCwgX1B5VGltZV9ST1VORF9DRUlMSU5HKSA8IDApIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgInRpbWVvdXQgYXJndW1lbnQgbXVzdCBiZSBhbiBudW1iZXIgIgorICAgICAgICAgICAgICAgICJ0aW1lb3V0IGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXIgIgogICAgICAgICAgICAgICAgICJvciBOb25lLCBnb3QgJS4yMDBzIiwKICAgICAgICAgICAgICAgICBQeV9UWVBFKG90aW1lb3V0KS0+dHBfbmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMgYi9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCmluZGV4IDhmNTcxYTIuLmY3ZmUyMTggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwpAQCAtMTYzLDcgKzE2MywxMSBAQAogIyBpbmNsdWRlIDxzeXMvdWlvLmg+CiAjZW5kaWYKIAotI2lmbmRlZiBXSVRIX1RIUkVBRAorI2lmICFkZWZpbmVkKFdJVEhfVEhSRUFEKQorIyB1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBfX0FORFJPSURfQVBJX18gPCAyMwogIyB1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUgogI2VuZGlmCiAKQEAgLTkyNiw3ICs5MzAsNyBAQAogICAgYW4gZXJyb3Igb2NjdXJyZWQ7IHRoZW4gYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4gKi8KIAogc3RhdGljIGludAotc2V0aXBhZGRyKGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqYWRkcl9yZXQsIHNpemVfdCBhZGRyX3JldF9zaXplLCBpbnQgYWYpCitzZXRpcGFkZHIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHNvY2thZGRyICphZGRyX3JldCwgc2l6ZV90IGFkZHJfcmV0X3NpemUsIGludCBhZikKIHsKICAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7CiAgICAgaW50IGVycm9yOwpAQCAtMTEwNyw3ICsxMTExLDcgQEAKICAgIGFuIGVycm9yIG9jY3VycmVkLiAqLwogCiBzdGF0aWMgaW50Ci1zZXRiZGFkZHIoY2hhciAqbmFtZSwgYmRhZGRyX3QgKmJkYWRkcikKK3NldGJkYWRkcihjb25zdCBjaGFyICpuYW1lLCBiZGFkZHJfdCAqYmRhZGRyKQogewogICAgIHVuc2lnbmVkIGludCBiMCwgYjEsIGIyLCBiMywgYjQsIGI1OwogICAgIGNoYXIgY2g7CkBAIC0xNDAxLDcgKzE0MDUsNyBAQAogaWRuYV9jb252ZXJ0ZXIoUHlPYmplY3QgKm9iaiwgc3RydWN0IG1heWJlX2lkbmEgKmRhdGEpCiB7CiAgICAgc2l6ZV90IGxlbjsKLSAgICBQeU9iamVjdCAqb2JqMiwgKm9iajM7CisgICAgUHlPYmplY3QgKm9iajI7CiAgICAgaWYgKG9iaiA9PSBOVUxMKSB7CiAgICAgICAgIGlkbmFfY2xlYW51cChkYXRhKTsKICAgICAgICAgcmV0dXJuIDE7CkBAIC0xNDE2LDMxICsxNDIwLDI3IEBACiAgICAgICAgIGRhdGEtPmJ1ZiA9IFB5Qnl0ZUFycmF5X0FzU3RyaW5nKG9iaik7CiAgICAgICAgIGxlbiA9IFB5Qnl0ZUFycmF5X1NpemUob2JqKTsKICAgICB9Ci0gICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikgJiYgUHlVbmljb2RlX1JFQURZKG9iaikgPT0gMCAmJiBQeVVuaWNvZGVfSVNfQ09NUEFDVF9BU0NJSShvYmopKSB7Ci0gICAgICAgIGRhdGEtPmJ1ZiA9IFB5VW5pY29kZV9EQVRBKG9iaik7Ci0gICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaik7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKG9iaikpIHsKKyAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShvYmopID09IDAgJiYgUHlVbmljb2RlX0lTX0NPTVBBQ1RfQVNDSUkob2JqKSkgeworICAgICAgICAgICAgZGF0YS0+YnVmID0gUHlVbmljb2RlX0RBVEEob2JqKTsKKyAgICAgICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKG9iaik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBvYmoyID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyhvYmosICJpZG5hIiwgTlVMTCk7CisgICAgICAgICAgICBpZiAoIW9iajIpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2Rpbmcgb2YgaG9zdG5hbWUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhvYmoyKSk7CisgICAgICAgICAgICBkYXRhLT5vYmogPSBvYmoyOworICAgICAgICAgICAgZGF0YS0+YnVmID0gUHlCeXRlc19BU19TVFJJTkcob2JqMik7CisgICAgICAgICAgICBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKG9iajIpOworICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBvYmoyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qob2JqKTsKLSAgICAgICAgaWYgKCFvYmoyKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAic3RyaW5nIG9yIHVuaWNvZGUgdGV4dCBidWZmZXIgZXhwZWN0ZWQsIG5vdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG9iajMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG9iajIsICJpZG5hIiwgTlVMTCk7Ci0gICAgICAgIFB5X0RFQ1JFRihvYmoyKTsKLSAgICAgICAgaWYgKCFvYmozKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZW5jb2Rpbmcgb2YgaG9zdG5hbWUgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2sob2JqMykpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihvYmozKTsKLSAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJlbmNvZGluZyBvZiBob3N0bmFtZSBmYWlsZWQgdG8gcmV0dXJuIGJ5dGVzIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBkYXRhLT5vYmogPSBvYmozOwotICAgICAgICBkYXRhLT5idWYgPSBQeUJ5dGVzX0FTX1NUUklORyhvYmozKTsKLSAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShvYmozKTsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0ciwgYnl0ZXMgb3IgYnl0ZWFycmF5IGV4cGVjdGVkLCBub3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgb2JqLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGlmIChzdHJsZW4oZGF0YS0+YnVmKSAhPSBsZW4pIHsKICAgICAgICAgUHlfQ0xFQVIoZGF0YS0+b2JqKTsKQEAgLTI0NTgsMTMgKzI0NTgsMjYgQEAKICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaXkqOnNldHNvY2tvcHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxldmVsLCAmb3B0bmFtZSwgJm9wdHZhbCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyNpZmRlZiBNU19XSU5ET1dTCisgICAgICAgIGlmIChvcHR2YWwubGVuID4gSU5UX01BWCkgeworICAgICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmb3B0dmFsKTsKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19PdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQgb3B0aW9uIGlzIGxhcmdlciB0aGFuICVpIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJTlRfTUFYKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHJlcyA9IHNldHNvY2tvcHQocy0+c29ja19mZCwgbGV2ZWwsIG9wdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3B0dmFsLmJ1ZiwgKGludClvcHR2YWwubGVuKTsKKyNlbHNlCiAgICAgICAgIHJlcyA9IHNldHNvY2tvcHQocy0+c29ja19mZCwgbGV2ZWwsIG9wdG5hbWUsIG9wdHZhbC5idWYsIG9wdHZhbC5sZW4pOworI2VuZGlmCiAgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJm9wdHZhbCk7CiAgICAgfQotICAgIGlmIChyZXMgPCAwKQorICAgIGlmIChyZXMgPCAwKSB7CiAgICAgICAgIHJldHVybiBzLT5lcnJvcmhhbmRsZXIoKTsKLSAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorCisgICAgUHlfUkVUVVJOX05PTkU7CiB9CiAKIFB5RG9jX1NUUlZBUihzZXRzb2Nrb3B0X2RvYywKQEAgLTI1NjMsMTYgKzI1NzYsMjIgQEAKIHNvY2tfY2xvc2UoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewogICAgIFNPQ0tFVF9UIGZkOworICAgIGludCByZXM7CiAKLSAgICAvKiBXZSBkbyBub3Qgd2FudCB0byByZXRyeSB1cG9uIEVJTlRSOiBzZWUgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvNTc2NDc4LwotICAgICAqIGFuZCBodHRwOi8vbGludXguZGVya2VpbGVyLmNvbS9NYWlsaW5nLUxpc3RzL0tlcm5lbC8yMDA1LTA5LzMwMDAuaHRtbAotICAgICAqIGZvciBtb3JlIGRldGFpbHMuCi0gICAgICovCi0gICAgaWYgKChmZCA9IHMtPnNvY2tfZmQpICE9IC0xKSB7CisgICAgZmQgPSBzLT5zb2NrX2ZkOworICAgIGlmIChmZCAhPSAtMSkgewogICAgICAgICBzLT5zb2NrX2ZkID0gLTE7CisKKyAgICAgICAgLyogV2UgZG8gbm90IHdhbnQgdG8gcmV0cnkgdXBvbiBFSU5UUjogc2VlCisgICAgICAgICAgIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzU3NjQ3OC8gYW5kCisgICAgICAgICAgIGh0dHA6Ly9saW51eC5kZXJrZWlsZXIuY29tL01haWxpbmctTGlzdHMvS2VybmVsLzIwMDUtMDkvMzAwMC5odG1sCisgICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuICovCiAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKLSAgICAgICAgKHZvaWQpIFNPQ0tFVENMT1NFKGZkKTsKKyAgICAgICAgcmVzID0gU09DS0VUQ0xPU0UoZmQpOwogICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOworICAgICAgICB9CiAgICAgfQogICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICByZXR1cm4gUHlfTm9uZTsKQEAgLTQwMzQsNiArNDA1MywxNyBAQAogICAgICAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhyZWN2KTsgfQorI2lmIGRlZmluZWQoU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCkKKyAgICBjYXNlIFNJT19MT09QQkFDS19GQVNUX1BBVEg6IHsKKyAgICAgICAgdW5zaWduZWQgaW50IG9wdGlvbjsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZywgImtJOmlvY3RsIiwgJmNtZCwgJm9wdGlvbikpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKFdTQUlvY3RsKHMtPnNvY2tfZmQsIGNtZCwgJm9wdGlvbiwgc2l6ZW9mKG9wdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgJnJlY3YsIE5VTEwsIE5VTEwpID09IFNPQ0tFVF9FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHNldF9lcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyhyZWN2KTsgfQorI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJpbnZhbGlkIGlvY3RsIGNvbW1hbmQgJWQiLCBjbWQpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQwNDQsNyArNDA3NCw4IEBACiBcblwKIENvbnRyb2wgdGhlIHNvY2tldCB3aXRoIFdTQUlvY3RsIHN5c2NhbGwuIEN1cnJlbnRseSBzdXBwb3J0ZWQgJ2NtZCcgdmFsdWVzIGFyZVxuXAogU0lPX1JDVkFMTDogICdvcHRpb24nIG11c3QgYmUgb25lIG9mIHRoZSBzb2NrZXQuUkNWQUxMXyogY29uc3RhbnRzLlxuXAotU0lPX0tFRVBBTElWRV9WQUxTOiAgJ29wdGlvbicgaXMgYSB0dXBsZSBvZiAob25vZmYsIHRpbWVvdXQsIGludGVydmFsKS4iKTsKK1NJT19LRUVQQUxJVkVfVkFMUzogICdvcHRpb24nIGlzIGEgdHVwbGUgb2YgKG9ub2ZmLCB0aW1lb3V0LCBpbnRlcnZhbCkuXG5cCitTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIOiAnb3B0aW9uJyBpcyBhIGJvb2xlYW4gdmFsdWUsIGFuZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Iik7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoTVNfV0lORE9XUykKQEAgLTQxNjMsMjIgKzQxOTQsNDUgQEAKICAgIEZpcnN0IGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0aW9uLiAqLwogCiBzdGF0aWMgdm9pZAorc29ja19maW5hbGl6ZShQeVNvY2tldFNvY2tPYmplY3QgKnMpCit7CisgICAgU09DS0VUX1QgZmQ7CisgICAgUHlPYmplY3QgKmVycm9yX3R5cGUsICplcnJvcl92YWx1ZSwgKmVycm9yX3RyYWNlYmFjazsKKworICAgIC8qIFNhdmUgdGhlIGN1cnJlbnQgZXhjZXB0aW9uLCBpZiBhbnkuICovCisgICAgUHlFcnJfRmV0Y2goJmVycm9yX3R5cGUsICZlcnJvcl92YWx1ZSwgJmVycm9yX3RyYWNlYmFjayk7CisKKyAgICBpZiAocy0+c29ja19mZCAhPSAtMSkgeworICAgICAgICBpZiAoUHlFcnJfUmVzb3VyY2VXYXJuaW5nKChQeU9iamVjdCAqKXMsIDEsICJ1bmNsb3NlZCAlUiIsIHMpKSB7CisgICAgICAgICAgICAvKiBTcHVyaW91cyBlcnJvcnMgY2FuIGFwcGVhciBhdCBzaHV0ZG93biAqLworICAgICAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfV2FybmluZykpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoKFB5T2JqZWN0ICopcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBPbmx5IGNsb3NlIHRoZSBzb2NrZXQgKmFmdGVyKiBsb2dnaW5nIHRoZSBSZXNvdXJjZVdhcm5pbmcgd2FybmluZworICAgICAgICAgICB0byBhbGxvdyB0aGUgbG9nZ2VyIHRvIGNhbGwgc29ja2V0IG1ldGhvZHMgbGlrZQorICAgICAgICAgICBzb2NrZXQuZ2V0c29ja25hbWUoKS4gSWYgdGhlIHNvY2tldCBpcyBjbG9zZWQgYmVmb3JlLCBzb2NrZXQKKyAgICAgICAgICAgbWV0aG9kcyBmYWlscyB3aXRoIHRoZSBFQkFERiBlcnJvci4gKi8KKyAgICAgICAgZmQgPSBzLT5zb2NrX2ZkOworICAgICAgICBzLT5zb2NrX2ZkID0gLTE7CisKKyAgICAgICAgLyogV2UgZG8gbm90IHdhbnQgdG8gcmV0cnkgdXBvbiBFSU5UUjogc2VlIHNvY2tfY2xvc2UoKSAqLworICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgICAgICh2b2lkKSBTT0NLRVRDTE9TRShmZCk7CisgICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgfQorCisgICAgLyogUmVzdG9yZSB0aGUgc2F2ZWQgZXhjZXB0aW9uLiAqLworICAgIFB5RXJyX1Jlc3RvcmUoZXJyb3JfdHlwZSwgZXJyb3JfdmFsdWUsIGVycm9yX3RyYWNlYmFjayk7Cit9CisKK3N0YXRpYyB2b2lkCiBzb2NrX2RlYWxsb2MoUHlTb2NrZXRTb2NrT2JqZWN0ICpzKQogewotICAgIGlmIChzLT5zb2NrX2ZkICE9IC0xKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpleGMsICp2YWwsICp0YjsKLSAgICAgICAgUHlfc3NpemVfdCBvbGRfcmVmY291bnQgPSBQeV9SRUZDTlQocyk7Ci0gICAgICAgICsrUHlfUkVGQ05UKHMpOwotICAgICAgICBQeUVycl9GZXRjaCgmZXhjLCAmdmFsLCAmdGIpOwotICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19SZXNvdXJjZVdhcm5pbmcsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmNsb3NlZCAlUiIsIHMpKQotICAgICAgICAgICAgLyogU3B1cmlvdXMgZXJyb3JzIGNhbiBhcHBlYXIgYXQgc2h1dGRvd24gKi8KLSAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1dhcm5pbmcpKQotICAgICAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSgoUHlPYmplY3QgKikgcyk7Ci0gICAgICAgIFB5RXJyX1Jlc3RvcmUoZXhjLCB2YWwsIHRiKTsKLSAgICAgICAgKHZvaWQpIFNPQ0tFVENMT1NFKHMtPnNvY2tfZmQpOwotICAgICAgICBQeV9SRUZDTlQocykgPSBvbGRfcmVmY291bnQ7Ci0gICAgfQorICAgIGlmIChQeU9iamVjdF9DYWxsRmluYWxpemVyRnJvbURlYWxsb2MoKFB5T2JqZWN0ICopcykgPCAwKQorICAgICAgICByZXR1cm47CisKICAgICBQeV9UWVBFKHMpLT50cF9mcmVlKChQeU9iamVjdCAqKXMpOwogfQogCkBAIC00Mzk1LDcgKzQ0NDksOCBAQAogICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKiB0cF9mbGFncyAqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUKKyAgICAgICAgfCBQeV9UUEZMQUdTX0hBVkVfRklOQUxJWkUsICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCiAgICAgc29ja19kb2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCiAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwpAQCAtNDQxNSw2ICs0NDcwLDE1IEBACiAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLwogICAgIHNvY2tfbmV3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mcmVlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pc19nYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ybyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FjaGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0ICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb25fdGFnICovCisgICAgKGRlc3RydWN0b3Ipc29ja19maW5hbGl6ZSwgICAgICAgICAgICAgICAgICAvKiB0cF9maW5hbGl6ZSAqLwogfTsKIAogCkBAIC01NDUwLDEwICs1NTE0LDYgQEAKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21TdHJpbmcocmV0dmFsKTsKICAgICB9Ci0KLSAgICAvKiBOT1RSRUFDSEVEICovCi0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImludmFsaWQgaGFuZGxpbmcgb2YgaW5ldF9udG9wIik7Ci0gICAgcmV0dXJuIE5VTEw7CiB9CiAKICNlbGlmIGRlZmluZWQoTVNfV0lORE9XUykKQEAgLTYxODcsOSArNjI0Nyw2IEBACiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfVU5TUEVDKTsKICNlbmRpZgogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFGX0lORVQpOwotI2lmZGVmIEFGX0lORVQ2Ci0gICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgQUZfSU5FVDYpOwotI2VuZGlmIC8qIEFGX0lORVQ2ICovCiAjaWYgZGVmaW5lZChBRl9VTklYKQogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIEFGX1VOSVgpOwogI2VuZGlmIC8qIEFGX1VOSVggKi8KQEAgLTY0ODEsOSArNjUzOCwxMSBAQAogI2lmZGVmICBTT19PT0JJTkxJTkUKICAgICBQeU1vZHVsZV9BZGRJbnRNYWNybyhtLCBTT19PT0JJTkxJTkUpOwogI2VuZGlmCisjaWZuZGVmIF9fR05VX18KICNpZmRlZiAgU09fUkVVU0VQT1JUCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgU09fUkVVU0VQT1JUKTsKICNlbmRpZgorI2VuZGlmCiAjaWZkZWYgIFNPX1NOREJVRgogICAgIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIFNPX1NOREJVRik7CiAjZW5kaWYKQEAgLTcyMjQsOCArNzI4MywxNiBAQAogCiAjaWZkZWYgU0lPX1JDVkFMTAogICAgIHsKLSAgICAgICAgRFdPUkQgY29kZXNbXSA9IHtTSU9fUkNWQUxMLCBTSU9fS0VFUEFMSVZFX1ZBTFN9OwotICAgICAgICBjb25zdCBjaGFyICpuYW1lc1tdID0geyJTSU9fUkNWQUxMIiwgIlNJT19LRUVQQUxJVkVfVkFMUyJ9OworICAgICAgICBEV09SRCBjb2Rlc1tdID0ge1NJT19SQ1ZBTEwsIFNJT19LRUVQQUxJVkVfVkFMUywKKyNpZiBkZWZpbmVkKFNJT19MT09QQkFDS19GQVNUX1BBVEgpCisgICAgICAgICAgICBTSU9fTE9PUEJBQ0tfRkFTVF9QQVRICisjZW5kaWYKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZXNbXSA9IHsiU0lPX1JDVkFMTCIsICJTSU9fS0VFUEFMSVZFX1ZBTFMiLAorI2lmIGRlZmluZWQoU0lPX0xPT1BCQUNLX0ZBU1RfUEFUSCkKKyAgICAgICAgICAgICJTSU9fTE9PUEJBQ0tfRkFTVF9QQVRIIgorI2VuZGlmCisgICAgICAgIH07CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IoaSA9IDA7IGk8UHlfQVJSQVlfTEVOR1RIKGNvZGVzKTsgKytpKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdG1wOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9zcHdkbW9kdWxlLmMgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwppbmRleCA0YjlmM2NkLi41NTZhNzE1IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYworKysgYi9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYwpAQCAtMTM3LDcgKzEzNywxMCBAQAogICAgIGlmIChQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShieXRlcywgJm5hbWUsIE5VTEwpID09IC0xKQogICAgICAgICBnb3RvIG91dDsKICAgICBpZiAoKHAgPSBnZXRzcG5hbShuYW1lKSkgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJnZXRzcG5hbSgpOiBuYW1lIG5vdCBmb3VuZCIpOworICAgICAgICBpZiAoZXJybm8gIT0gMCkKKyAgICAgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19PU0Vycm9yKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLCAiZ2V0c3BuYW0oKTogbmFtZSBub3QgZm91bmQiKTsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQogICAgIHJldHZhbCA9IG1rc3BlbnQocCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NyZV9saWIuaCBiL01vZHVsZXMvc3JlX2xpYi5oCmluZGV4IDEyOGM3MWUuLjc4ZjdhYzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3JlX2xpYi5oCisrKyBiL01vZHVsZXMvc3JlX2xpYi5oCkBAIC0zNjcsMTQgKzM2NywxMiBAQAogI2RlZmluZSBSRVRVUk5fT05fRkFJTFVSRShpKSBcCiAgICAgZG8geyBSRVRVUk5fT05fRVJST1IoaSk7IGlmIChpID09IDApIFJFVFVSTl9GQUlMVVJFOyB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFNGWSh4KSAjeAotCiAjZGVmaW5lIERBVEFfU1RBQ0tfQUxMT0Moc3RhdGUsIHR5cGUsIHB0cikgXAogZG8geyBcCiAgICAgYWxsb2NfcG9zID0gc3RhdGUtPmRhdGFfc3RhY2tfYmFzZTsgXAogICAgIFRSQUNFKCgiYWxsb2NhdGluZyAlcyBpbiAlIiBQWV9GT1JNQVRfU0laRV9UICJkICIgXAogICAgICAgICAgICAiKCUiIFBZX0ZPUk1BVF9TSVpFX1QgImQpXG4iLCBcCi0gICAgICAgICAgIFNGWSh0eXBlKSwgYWxsb2NfcG9zLCBzaXplb2YodHlwZSkpKTsgXAorICAgICAgICAgICBQeV9TVFJJTkdJRlkodHlwZSksIGFsbG9jX3Bvcywgc2l6ZW9mKHR5cGUpKSk7IFwKICAgICBpZiAoc2l6ZW9mKHR5cGUpID4gc3RhdGUtPmRhdGFfc3RhY2tfc2l6ZSAtIGFsbG9jX3BvcykgeyBcCiAgICAgICAgIGludCBqID0gZGF0YV9zdGFja19ncm93KHN0YXRlLCBzaXplb2YodHlwZSkpOyBcCiAgICAgICAgIGlmIChqIDwgMCkgcmV0dXJuIGo7IFwKQEAgLTM4Nyw3ICszODUsNyBAQAogCiAjZGVmaW5lIERBVEFfU1RBQ0tfTE9PS1VQX0FUKHN0YXRlLCB0eXBlLCBwdHIsIHBvcykgXAogZG8geyBcCi0gICAgVFJBQ0UoKCJsb29raW5nIHVwICVzIGF0ICUiIFBZX0ZPUk1BVF9TSVpFX1QgImRcbiIsIFNGWSh0eXBlKSwgcG9zKSk7IFwKKyAgICBUUkFDRSgoImxvb2tpbmcgdXAgJXMgYXQgJSIgUFlfRk9STUFUX1NJWkVfVCAiZFxuIiwgUHlfU1RSSU5HSUZZKHR5cGUpLCBwb3MpKTsgXAogICAgIHB0ciA9ICh0eXBlKikoc3RhdGUtPmRhdGFfc3RhY2srcG9zKTsgXAogfSB3aGlsZSAoMCkKIApAQCAtMTI1Niw3ICsxMjU0LDMyIEBACiAgICAgICAgICAgIHByZWZpeCwgcHJlZml4X2xlbiwgcHJlZml4X3NraXApKTsKICAgICBUUkFDRSgoImNoYXJzZXQgPSAlcFxuIiwgY2hhcnNldCkpOwogCi0jaWYgZGVmaW5lZChVU0VfRkFTVF9TRUFSQ0gpCisgICAgaWYgKHByZWZpeF9sZW4gPT0gMSkgeworICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgKi8KKyAgICAgICAgU1JFX0NIQVIgYyA9IChTUkVfQ0hBUikgcHJlZml4WzBdOworI2lmIFNJWkVPRl9TUkVfQ0hBUiA8IDQKKyAgICAgICAgaWYgKChTUkVfQ09ERSkgYyAhPSBwcmVmaXhbMF0pCisgICAgICAgICAgICByZXR1cm4gMDsgLyogbGl0ZXJhbCBjYW4ndCBtYXRjaDogZG9lc24ndCBmaXQgaW4gY2hhciB3aWR0aCAqLworI2VuZGlmCisgICAgICAgIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7CisgICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKKyAgICAgICAgICAgIHdoaWxlICgqcHRyICE9IGMpIHsKKyAgICAgICAgICAgICAgICBpZiAoKytwdHIgPj0gZW5kKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFRSQUNFKCgifCVwfCVwfFNFQVJDSCBMSVRFUkFMXG4iLCBwYXR0ZXJuLCBwdHIpKTsKKyAgICAgICAgICAgIHN0YXRlLT5zdGFydCA9IHB0cjsKKyAgICAgICAgICAgIHN0YXRlLT5wdHIgPSBwdHIgKyBwcmVmaXhfc2tpcDsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIFNSRV9JTkZPX0xJVEVSQUwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIHdlIGdvdCBhbGwgb2YgaXQgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IFNSRShtYXRjaCkoc3RhdGUsIHBhdHRlcm4gKyAyKnByZWZpeF9za2lwLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgKytwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgaWYgKHByZWZpeF9sZW4gPiAxKSB7CiAgICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBrbm93biBwcmVmaXguICB1c2UgdGhlIG92ZXJsYXAKICAgICAgICAgICAgdGFibGUgdG8gc2tpcCBmb3J3YXJkIGFzIGZhc3QgYXMgd2UgcG9zc2libHkgY2FuICovCkBAIC0xMzA1LDMyICsxMzI4LDggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0jZW5kaWYKIAotICAgIGlmIChwYXR0ZXJuWzBdID09IFNSRV9PUF9MSVRFUkFMKSB7Ci0gICAgICAgIC8qIHBhdHRlcm4gc3RhcnRzIHdpdGggYSBsaXRlcmFsIGNoYXJhY3Rlci4gIHRoaXMgaXMgdXNlZAotICAgICAgICAgICBmb3Igc2hvcnQgcHJlZml4ZXMsIGFuZCBpZiBmYXN0IHNlYXJjaCBpcyBkaXNhYmxlZCAqLwotICAgICAgICBTUkVfQ0hBUiBjID0gKFNSRV9DSEFSKSBwYXR0ZXJuWzFdOwotI2lmIFNJWkVPRl9TUkVfQ0hBUiA8IDQKLSAgICAgICAgaWYgKChTUkVfQ09ERSkgYyAhPSBwYXR0ZXJuWzFdKQotICAgICAgICAgICAgcmV0dXJuIDA7IC8qIGxpdGVyYWwgY2FuJ3QgbWF0Y2g6IGRvZXNuJ3QgZml0IGluIGNoYXIgd2lkdGggKi8KLSNlbmRpZgotICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwotICAgICAgICB3aGlsZSAocHRyIDwgZW5kKSB7Ci0gICAgICAgICAgICB3aGlsZSAoKnB0ciAhPSBjKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCsrcHRyID49IGVuZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUUkFDRSgoInwlcHwlcHxTRUFSQ0ggTElURVJBTFxuIiwgcGF0dGVybiwgcHRyKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+c3RhcnQgPSBwdHI7Ci0gICAgICAgICAgICBzdGF0ZS0+cHRyID0gKytwdHI7Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBTUkVfSU5GT19MSVRFUkFMKQotICAgICAgICAgICAgICAgIHJldHVybiAxOyAvKiB3ZSBnb3QgYWxsIG9mIGl0ICovCi0gICAgICAgICAgICBzdGF0dXMgPSBTUkUobWF0Y2gpKHN0YXRlLCBwYXR0ZXJuICsgMiwgMCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNoYXJzZXQpIHsKKyAgICBpZiAoY2hhcnNldCkgewogICAgICAgICAvKiBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGEgY2hhcmFjdGVyIGZyb20gYSBrbm93biBzZXQgKi8KICAgICAgICAgZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKICAgICAgICAgZm9yICg7OykgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCBkMmNhYWNkLi45NDc0NjQ0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtMzExLDcgKzMxMSw3IEBACiAgICBSZXR1cm5zIG5vbi16ZXJvIG9uIHN1Y2Nlc3MgKHBhcmFsbGVscyBQeUFyZ19QYXJzZVR1cGxlKS4KICovCiBzdGF0aWMgaW50Ci1wYXJzZV90aW1lX3RfYXJncyhQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB0aW1lX3QgKnB3aGVuKQorcGFyc2VfdGltZV90X2FyZ3MoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdGltZV90ICpwd2hlbikKIHsKICAgICBQeU9iamVjdCAqb3QgPSBOVUxMOwogICAgIHRpbWVfdCB3aGVudDsKQEAgLTczMiwxMCArNzMyLDEwIEBACiB7CiAgICAgLyogSW5zcGlyZWQgYnkgT3BlbiBHcm91cCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIGF0CiAgICAgICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS9mdW5jdGlvbnMvYXNjdGltZS5odG1sICovCi0gICAgc3RhdGljIGNoYXIgd2RheV9uYW1lWzddWzRdID0geworICAgIHN0YXRpYyBjb25zdCBjaGFyIHdkYXlfbmFtZVs3XVs0XSA9IHsKICAgICAgICAgIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIKICAgICB9OwotICAgIHN0YXRpYyBjaGFyIG1vbl9uYW1lWzEyXVs0XSA9IHsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb25fbmFtZVsxMl1bNF0gPSB7CiAgICAgICAgICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCiAgICAgICAgICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyIKICAgICB9OwpAQCAtMTAzNCw2ICsxMDM0LDcgQEAKICAgICB9CiAjZW5kaWYKIAorICAgIC8qIEN1cnJlbnRseSwgUHl0aG9uIDMgcmVxdWlyZXMgY2xvY2soKSB0byBidWlsZDogc2VlIGlzc3VlICMyMjYyNCAqLwogICAgIHJldHVybiBmbG9hdGNsb2NrKGluZm8pOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMgYi9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKaW5kZXggZmU0ZTkwOC4uN2Q1MThmYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy91bmljb2RlZGF0YS5jCisrKyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwpAQCAtODg0LDcgKzg4NCw3IEBACiAgICAgcmV0dXJuIGg7CiB9CiAKLXN0YXRpYyBjaGFyICpoYW5ndWxfc3lsbGFibGVzW11bM10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGhhbmd1bF9zeWxsYWJsZXNbXVszXSA9IHsKICAgICB7ICJHIiwgICJBIiwgICAiIiAgIH0sCiAgICAgeyAiR0ciLCAiQUUiLCAgIkciICB9LAogICAgIHsgIk4iLCAgIllBIiwgICJHRyIgfSwKQEAgLTEwNTcsNyArMTA1Nyw3IEBACiAgICAgaW50IGksIGxlbjE7CiAgICAgKmxlbiA9IC0xOwogICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CisgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBoYW5ndWxfc3lsbGFibGVzW2ldW2NvbHVtbl07CiAgICAgICAgIGxlbjEgPSBQeV9TQUZFX0RPV05DQVNUKHN0cmxlbihzKSwgc2l6ZV90LCBpbnQpOwogICAgICAgICBpZiAobGVuMSA8PSAqbGVuKQogICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3h4bGltaXRlZC5jIGIvTW9kdWxlcy94eGxpbWl0ZWQuYwppbmRleCA0MGMxNzYwLi5jMWE5YmU5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3h4bGltaXRlZC5jCisrKyBiL01vZHVsZXMveHhsaW1pdGVkLmMKQEAgLTg5LDcgKzg5LDcgQEAKIH0KIAogc3RhdGljIGludAotWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKK1h4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCiB7CiAgICAgaWYgKHNlbGYtPnhfYXR0ciA9PSBOVUxMKSB7CiAgICAgICAgIHNlbGYtPnhfYXR0ciA9IFB5RGljdF9OZXcoKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMveHhtb2R1bGUuYyBiL01vZHVsZXMveHhtb2R1bGUuYwppbmRleCA4NTIzMGQ5Li4wNzY0NDA3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3h4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy94eG1vZHVsZS5jCkBAIC03Niw3ICs3Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLVh4b19zZXRhdHRyKFh4b09iamVjdCAqc2VsZiwgY2hhciAqbmFtZSwgUHlPYmplY3QgKnYpCitYeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQogewogICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgewogICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3psaWJtb2R1bGUuYyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCmluZGV4IGFiNWI2NWQuLjI4ZjdmMTUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvemxpYm1vZHVsZS5jCisrKyBiL01vZHVsZXMvemxpYm1vZHVsZS5jCkBAIC01Nyw3ICs1Nyw3IEBACiB9IGNvbXBvYmplY3Q7CiAKIHN0YXRpYyB2b2lkCi16bGliX2Vycm9yKHpfc3RyZWFtIHpzdCwgaW50IGVyciwgY2hhciAqbXNnKQoremxpYl9lcnJvcih6X3N0cmVhbSB6c3QsIGludCBlcnIsIGNvbnN0IGNoYXIgKm1zZykKIHsKICAgICBjb25zdCBjaGFyICp6bXNnID0gWl9OVUxMOwogICAgIC8qIEluIGNhc2Ugb2YgYSB2ZXJzaW9uIG1pc21hdGNoLCB6c3QubXNnIHdvbid0IGJlIGluaXRpYWxpemVkLgpAQCAtMTQxLDE4ICsxNDEsMTggQEAKIC8qW2NsaW5pYyBpbnB1dF0KIHpsaWIuY29tcHJlc3MKIAotICAgIGJ5dGVzOiBQeV9idWZmZXIKKyAgICBkYXRhOiBQeV9idWZmZXIKICAgICAgICAgQmluYXJ5IGRhdGEgdG8gYmUgY29tcHJlc3NlZC4KLSAgICBsZXZlbDogaW50KGNfZGVmYXVsdD0iWl9ERUZBVUxUX0NPTVBSRVNTSU9OIikgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT04KLSAgICAgICAgQ29tcHJlc3Npb24gbGV2ZWwsIGluIDAtOS4KICAgICAvCisgICAgbGV2ZWw6IGludChjX2RlZmF1bHQ9IlpfREVGQVVMVF9DT01QUkVTU0lPTiIpID0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OCisgICAgICAgIENvbXByZXNzaW9uIGxldmVsLCBpbiAwLTkgb3IgLTEuCiAKIFJldHVybnMgYSBieXRlcyBvYmplY3QgY29udGFpbmluZyBjb21wcmVzc2VkIGRhdGEuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi16bGliX2NvbXByZXNzX2ltcGwoUHlPYmplY3QgKm1vZHVsZSwgUHlfYnVmZmVyICpieXRlcywgaW50IGxldmVsKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWFlNjRjMmMzMDc2MzIxYTAgaW5wdXQ9YmUzYWJlOTkzNGJkYTRiM10qLworemxpYl9jb21wcmVzc19pbXBsKFB5T2JqZWN0ICptb2R1bGUsIFB5X2J1ZmZlciAqZGF0YSwgaW50IGxldmVsKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWQ4MDkwNmQ3M2Y2Mjk0YzggaW5wdXQ9NjM4ZDU0YjYzMTVkYmVkM10qLwogewogICAgIFB5T2JqZWN0ICpSZXR1cm5WYWwgPSBOVUxMOwogICAgIEJ5dGUgKmlucHV0LCAqb3V0cHV0ID0gTlVMTDsKQEAgLTE2MCwxMyArMTYwLDEzIEBACiAgICAgaW50IGVycjsKICAgICB6X3N0cmVhbSB6c3Q7CiAKLSAgICBpZiAoKHNpemVfdClieXRlcy0+bGVuID4gVUlOVF9NQVgpIHsKKyAgICBpZiAoKHNpemVfdClkYXRhLT5sZW4gPiBVSU5UX01BWCkgewogICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJTaXplIGRvZXMgbm90IGZpdCBpbiBhbiB1bnNpZ25lZCBpbnQiKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9Ci0gICAgaW5wdXQgPSBieXRlcy0+YnVmOwotICAgIGxlbmd0aCA9ICh1bnNpZ25lZCBpbnQpYnl0ZXMtPmxlbjsKKyAgICBpbnB1dCA9IGRhdGEtPmJ1ZjsKKyAgICBsZW5ndGggPSAodW5zaWduZWQgaW50KWRhdGEtPmxlbjsKIAogICAgIHpzdC5hdmFpbF9vdXQgPSBsZW5ndGggKyBsZW5ndGgvMTAwMCArIDEyICsgMTsKIApAQCAtMTM1Miw3ICsxMzUyLDcgQEAKICJ6bGliIGxpYnJhcnksIHdoaWNoIGlzIGJhc2VkIG9uIEdOVSB6aXAuXG4iCiAiXG4iCiAiYWRsZXIzMihzdHJpbmdbLCBzdGFydF0pIC0tIENvbXB1dGUgYW4gQWRsZXItMzIgY2hlY2tzdW0uXG4iCi0iY29tcHJlc3Moc3RyaW5nWywgbGV2ZWxdKSAtLSBDb21wcmVzcyBzdHJpbmcsIHdpdGggY29tcHJlc3Npb24gbGV2ZWwgaW4gMC05LlxuIgorImNvbXByZXNzKGRhdGFbLCBsZXZlbF0pIC0tIENvbXByZXNzIGRhdGEsIHdpdGggY29tcHJlc3Npb24gbGV2ZWwgMC05IG9yIC0xLlxuIgogImNvbXByZXNzb2JqKFtsZXZlbFssIC4uLl1dKSAtLSBSZXR1cm4gYSBjb21wcmVzc29yIG9iamVjdC5cbiIKICJjcmMzMihzdHJpbmdbLCBzdGFydF0pIC0tIENvbXB1dGUgYSBDUkMtMzIgY2hlY2tzdW0uXG4iCiAiZGVjb21wcmVzcyhzdHJpbmcsW3diaXRzXSxbYnVmc2l6ZV0pIC0tIERlY29tcHJlc3NlcyBhIGNvbXByZXNzZWQgc3RyaW5nLlxuIgpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9hYnN0cmFjdC5jIGIvT2JqZWN0cy9hYnN0cmFjdC5jCmluZGV4IDU4NTk5MmQuLjg4NWQ4ZGUgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYWJzdHJhY3QuYworKysgYi9PYmplY3RzL2Fic3RyYWN0LmMKQEAgLTE0MSw4ICsxNDEsMTEgQEAKICAgICAgICAgcmV0dXJuIG51bGxfZXJyb3IoKTsKIAogICAgIG0gPSBvLT5vYl90eXBlLT50cF9hc19tYXBwaW5nOwotICAgIGlmIChtICYmIG0tPm1wX3N1YnNjcmlwdCkKLSAgICAgICAgcmV0dXJuIG0tPm1wX3N1YnNjcmlwdChvLCBrZXkpOworICAgIGlmIChtICYmIG0tPm1wX3N1YnNjcmlwdCkgeworICAgICAgICBQeU9iamVjdCAqaXRlbSA9IG0tPm1wX3N1YnNjcmlwdChvLCBrZXkpOworICAgICAgICBhc3NlcnQoKGl0ZW0gIT0gTlVMTCkgXiAoUHlFcnJfT2NjdXJyZWQoKSAhPSBOVUxMKSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KIAogICAgIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZSkgewogICAgICAgICBpZiAoUHlJbmRleF9DaGVjayhrZXkpKSB7CkBAIC0xMzQ4LDIxICsxMzUxLDM5IEBACiAKICAgICBpZiAobyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gbnVsbF9lcnJvcigpOworICAgIGlmIChQeUZsb2F0X0NoZWNrRXhhY3QobykpIHsKKyAgICAgICAgUHlfSU5DUkVGKG8pOworICAgICAgICByZXR1cm4gbzsKKyAgICB9CiAgICAgbSA9IG8tPm9iX3R5cGUtPnRwX2FzX251bWJlcjsKICAgICBpZiAobSAmJiBtLT5uYl9mbG9hdCkgeyAvKiBUaGlzIHNob3VsZCBpbmNsdWRlIHN1YmNsYXNzZXMgb2YgZmxvYXQgKi8KICAgICAgICAgUHlPYmplY3QgKnJlcyA9IG0tPm5iX2Zsb2F0KG8pOwotICAgICAgICBpZiAocmVzICYmICFQeUZsb2F0X0NoZWNrKHJlcykpIHsKKyAgICAgICAgZG91YmxlIHZhbDsKKyAgICAgICAgaWYgKCFyZXMgfHwgUHlGbG9hdF9DaGVja0V4YWN0KHJlcykpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFQeUZsb2F0X0NoZWNrKHJlcykpIHsKICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICJfX2Zsb2F0X18gcmV0dXJuZWQgbm9uLWZsb2F0ICh0eXBlICUuMjAwcykiLAotICAgICAgICAgICAgICByZXMtPm9iX3R5cGUtPnRwX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICIlLjUwcy5fX2Zsb2F0X18gcmV0dXJuZWQgbm9uLWZsb2F0ICh0eXBlICUuNTBzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgby0+b2JfdHlwZS0+dHBfbmFtZSwgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXMpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgLyogSXNzdWUgIzI2OTgzOiB3YXJuIGlmICdyZXMnIG5vdCBvZiBleGFjdCB0eXBlIGZsb2F0LiAqLworICAgICAgICBpZiAoUHlFcnJfV2FybkZvcm1hdChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIDEsCisgICAgICAgICAgICAgICAgIiUuNTBzLl9fZmxvYXRfXyByZXR1cm5lZCBub24tZmxvYXQgKHR5cGUgJS41MHMpLiAgIgorICAgICAgICAgICAgICAgICJUaGUgYWJpbGl0eSB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYSBzdHJpY3Qgc3ViY2xhc3Mgb2YgZmxvYXQgIgorICAgICAgICAgICAgICAgICJpcyBkZXByZWNhdGVkLCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBQeXRob24uIiwKKyAgICAgICAgICAgICAgICBvLT5vYl90eXBlLT50cF9uYW1lLCByZXMtPm9iX3R5cGUtPnRwX25hbWUpKSB7CisgICAgICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHZhbCA9IFB5RmxvYXRfQVNfRE9VQkxFKHJlcyk7CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbCk7CiAgICAgfQogICAgIGlmIChQeUZsb2F0X0NoZWNrKG8pKSB7IC8qIEEgZmxvYXQgc3ViY2xhc3Mgd2l0aCBuYl9mbG9hdCA9PSBOVUxMICovCi0gICAgICAgIFB5RmxvYXRPYmplY3QgKnBvID0gKFB5RmxvYXRPYmplY3QgKilvOwotICAgICAgICByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKHBvLT5vYl9mdmFsKTsKKyAgICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShQeUZsb2F0X0FTX0RPVUJMRShvKSk7CiAgICAgfQogICAgIHJldHVybiBQeUZsb2F0X0Zyb21TdHJpbmcobyk7CiB9CkBAIC0xNTQ0LDggKzE1NjUsMTAgQEAKICAgICAgICAgaWYgKGkgPCAwKSB7CiAgICAgICAgICAgICBpZiAobS0+c3FfbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsID0gKCptLT5zcV9sZW5ndGgpKHMpOwotICAgICAgICAgICAgICAgIGlmIChsIDwgMCkKKyAgICAgICAgICAgICAgICBpZiAobCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaSArPSBsOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jIGIvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYwppbmRleCBiMjFhY2ZiLi40OTkwYjNlIDEwMDY0NAotLS0gYS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jCisrKyBiL09iamVjdHMvYnl0ZWFycmF5b2JqZWN0LmMKQEAgLTI3OCwzMSArMjc4LDYgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0ICopcmVzdWx0OwogfQogCi1zdGF0aWMgUHlPYmplY3QgKgotYnl0ZWFycmF5X2Zvcm1hdChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCi17Ci0gICAgUHlPYmplY3QgKmJ5dGVzX2luLCAqYnl0ZXNfb3V0LCAqcmVzOwotICAgIGNoYXIgKmJ5dGVzdHJpbmc7Ci0KLSAgICBpZiAoc2VsZiA9PSBOVUxMIHx8ICFQeUJ5dGVBcnJheV9DaGVjayhzZWxmKSB8fCBhcmdzID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBieXRlc3RyaW5nID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIGJ5dGVzX2luID0gUHlCeXRlc19Gcm9tU3RyaW5nKGJ5dGVzdHJpbmcpOwotICAgIGlmIChieXRlc19pbiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBieXRlc19vdXQgPSBfUHlCeXRlc19Gb3JtYXQoYnl0ZXNfaW4sIGFyZ3MpOwotICAgIFB5X0RFQ1JFRihieXRlc19pbik7Ci0gICAgaWYgKGJ5dGVzX291dCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXMgPSBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0KGJ5dGVzX291dCk7Ci0gICAgUHlfREVDUkVGKGJ5dGVzX291dCk7Ci0gICAgaWYgKHJlcyA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVzOwotfQotCiAvKiBGdW5jdGlvbnMgc3R1ZmZlZCBpbnRvIHRoZSB0eXBlIG9iamVjdCAqLwogCiBzdGF0aWMgUHlfc3NpemVfdApAQCAtMTExOSwxNjEgKzEwOTQsMjcgQEAKICNpbmNsdWRlICJzdHJpbmdsaWIvdHJhbnNtb2dyaWZ5LmgiCiAKIAotLyogVGhlIGZvbGxvd2luZyBQeV9MT0NBTF9JTkxJTkUgYW5kIFB5X0xPQ0FMIGZ1bmN0aW9ucwotd2VyZSBjb3BpZWQgZnJvbSB0aGUgb2xkIGNoYXIqIHN0eWxlIHN0cmluZyBvYmplY3QuICovCi0KLS8qIGhlbHBlciBtYWNybyB0byBmaXh1cCBzdGFydC9lbmQgc2xpY2UgdmFsdWVzICovCi0jZGVmaW5lIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbikgICAgICAgICBcCi0gICAgaWYgKGVuZCA+IGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCA9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAoZW5kIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChlbmQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHN0YXJ0IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0YXJ0ICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChzdGFydCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1QeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWJ5dGVhcnJheV9maW5kX2ludGVybmFsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKLXsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9idWZmZXIgc3ViYnVmOwotICAgIGNvbnN0IGNoYXIgKnN1YjsKLSAgICBQeV9zc2l6ZV90IGxlbiwgc3ViX2xlbjsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0PTAsIGVuZD1QWV9TU0laRV9UX01BWDsKLSAgICBQeV9zc2l6ZV90IHJlczsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCAmc3Vib2JqLCAmYnl0ZSwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgaWYgKHN1Ym9iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Ym9iaiwgJnN1YmJ1ZiwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgICAgIHN1YiA9IHN1YmJ1Zi5idWY7Ci0gICAgICAgIHN1Yl9sZW4gPSBzdWJidWYubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLSAgICBsZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7Ci0gICAgaWYgKGVuZCAtIHN0YXJ0IDwgc3ViX2xlbikKLSAgICAgICAgcmVzID0gLTE7Ci0gICAgZWxzZSBpZiAoc3ViX2xlbiA9PSAxCi0jaWZuZGVmIEhBVkVfTUVNUkNIUgotICAgICAgICAgICAgJiYgZGlyID4gMAotI2VuZGlmCi0gICAgKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbmVlZGxlID0gKnN1YjsKLSAgICAgICAgaW50IG1vZGUgPSAoZGlyID4gMCkgPyBGQVNUX1NFQVJDSCA6IEZBU1RfUlNFQVJDSDsKLSAgICAgICAgcmVzID0gc3RyaW5nbGliX2Zhc3RzZWFyY2hfbWVtY2hyXzFjaGFyKAotICAgICAgICAgICAgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAotICAgICAgICAgICAgbmVlZGxlLCBuZWVkbGUsIG1vZGUpOwotICAgICAgICBpZiAocmVzID49IDApCi0gICAgICAgICAgICByZXMgKz0gc3RhcnQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoZGlyID4gMCkKLSAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9maW5kX3NsaWNlKAotICAgICAgICAgICAgICAgIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgbGVuLAotICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9yZmluZF9zbGljZSgKLSAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIGxlbiwKLSAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOwotICAgIH0KLQotICAgIGlmIChzdWJvYmopCi0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1YmJ1Zik7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1QeURvY19TVFJWQVIoZmluZF9fZG9jX18sCi0iQi5maW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1SZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxuXAotc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXG5cCi1hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCi1cblwKLVJldHVybiAtMSBvbiBmYWlsdXJlLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2ZpbmQoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gYnl0ZWFycmF5X2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2ZpbmQoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLVB5RG9jX1NUUlZBUihjb3VudF9fZG9jX18sCi0iQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnNlY3Rpb24gc3ViIGluXG5cCi1ieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcblwKLWFzIGluIHNsaWNlIG5vdGF0aW9uLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2NvdW50KFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeU9iamVjdCAqc3ViX29iajsKLSAgICBjb25zdCBjaGFyICpzdHIgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksICpzdWI7Ci0gICAgUHlfc3NpemVfdCBzdWJfbGVuOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0KLSAgICBQeV9idWZmZXIgdnN1YjsKLSAgICBQeU9iamVjdCAqY291bnRfb2JqOwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc19ieXRlKCJjb3VudCIsIGFyZ3MsICZzdWJfb2JqLCAmYnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoc3ViX29iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Yl9vYmosICZ2c3ViLCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBzdWIgPSB2c3ViLmJ1ZjsKLSAgICAgICAgc3ViX2xlbiA9IHZzdWIubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpKTsKLQotICAgIGNvdW50X29iaiA9IFB5TG9uZ19Gcm9tU3NpemVfdCgKLSAgICAgICAgc3RyaW5nbGliX2NvdW50KHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwgc3ViLCBzdWJfbGVuLCBQWV9TU0laRV9UX01BWCkKLSAgICAgICAgKTsKLQotICAgIGlmIChzdWJfb2JqKQotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2c3ViKTsKLQotICAgIHJldHVybiBjb3VudF9vYmo7CisgICAgcmV0dXJuIF9QeV9ieXRlc19jb3VudChQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LmNsZWFyCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQotCiBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGJ5dGVhcnJheS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9jbGVhcl9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTg1YzJmZTZhZWRlMDk1NmMgaW5wdXQ9ZTUyNGZkMzMwYWJjZGMxOF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTg1YzJmZTZhZWRlMDk1NmMgaW5wdXQ9ZWQ2ZWRhZTlkZTQ0N2FjNF0qLwogewogICAgIGlmIChQeUJ5dGVBcnJheV9SZXNpemUoKFB5T2JqZWN0ICopc2VsZiwgMCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTEyODMsMjM2ICsxMTI0LDU3IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuY29weQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKLQogUmV0dXJuIGEgY29weSBvZiBCLgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X2NvcHlfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OGNmYmNmZWQ0ODRjMTMyIGlucHV0PTZkNWQyOTc1YWEwZjMzZjNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02OGNmYmNmZWQ0ODRjMTMyIGlucHV0PTY1OTdiMGMwMWJjY2FhOWVdKi8KIHsKICAgICByZXR1cm4gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKChQeU9iamVjdCAqKXNlbGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSk7CiB9CiAKLVB5RG9jX1NUUlZBUihpbmRleF9fZG9jX18sCi0iQi5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotTGlrZSBCLmZpbmQoKSBidXQgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzZWN0aW9uIGlzIG5vdCBmb3VuZC4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9pbmRleChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfaW5kZXgoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLQotUHlEb2NfU1RSVkFSKHJmaW5kX19kb2NfXywKLSJCLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAotXG5cCi1SZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzZWN0aW9uIHN1YiBpcyBmb3VuZCxcblwKLXN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBCW3N0YXJ0LGVuZF0uICBPcHRpb25hbFxuXAotYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLlxuXAotXG5cCi1SZXR1cm4gLTEgb24gZmFpbHVyZS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9yZmluZChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfcmZpbmQoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLQotUHlEb2NfU1RSVkFSKHJpbmRleF9fZG9jX18sCi0iQi5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLUxpa2UgQi5yZmluZCgpIGJ1dCByYWlzZSBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnNlY3Rpb24gaXMgbm90IGZvdW5kLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JpbmRleChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlYXJyYXlfZmluZF9pbnRlcm5hbChzZWxmLCBhcmdzLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMikKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfcmluZGV4KFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi0KIHN0YXRpYyBpbnQKIGJ5dGVhcnJheV9jb250YWlucyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZykKIHsKLSAgICBQeV9zc2l6ZV90IGl2YWwgPSBQeU51bWJlcl9Bc1NzaXplX3QoYXJnLCBQeUV4Y19WYWx1ZUVycm9yKTsKLSAgICBpZiAoaXZhbCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIFB5X2J1ZmZlciB2YXJnOwotICAgICAgICBQeV9zc2l6ZV90IHBvczsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihhcmcsICZ2YXJnLCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIHBvcyA9IHN0cmluZ2xpYl9maW5kKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlfU0laRShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyZy5idWYsIHZhcmcubGVuLCAwKTsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmFyZyk7Ci0gICAgICAgIHJldHVybiBwb3MgPj0gMDsKLSAgICB9Ci0gICAgaWYgKGl2YWwgPCAwIHx8IGl2YWwgPj0gMjU2KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBtZW1jaHIoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCAoaW50KSBpdmFsLCBQeV9TSVpFKHNlbGYpKSAhPSBOVUxMOworICAgIHJldHVybiBfUHlfYnl0ZXNfY29udGFpbnMoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJnKTsKIH0KIAotCi0vKiBNYXRjaGVzIHRoZSBlbmQgKGRpcmVjdGlvbiA+PSAwKSBvciBzdGFydCAoZGlyZWN0aW9uIDwgMCkgb2Ygc2VsZgotICogYWdhaW5zdCBzdWJzdHIsIHVzaW5nIHRoZSBzdGFydCBhbmQgZW5kIGFyZ3VtZW50cy4gUmV0dXJucwotICogLTEgb24gZXJyb3IsIDAgaWYgbm90IGZvdW5kIGFuZCAxIGlmIGZvdW5kLgotICovCi1QeV9MT0NBTChpbnQpCi1fYnl0ZWFycmF5X3RhaWxtYXRjaChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwKLSAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCi17Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLSAgICBjb25zdCBjaGFyKiBzdHI7Ci0gICAgUHlfYnVmZmVyIHZzdWJzdHI7Ci0gICAgaW50IHJ2ID0gMDsKLQotICAgIHN0ciA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKTsKLQotICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3Vic3RyLCAmdnN1YnN0ciwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOwotCi0gICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKLSAgICAgICAgLyogc3RhcnRzd2l0aCAqLwotICAgICAgICBpZiAoc3RhcnQrdnN1YnN0ci5sZW4gPiBsZW4pIHsKLSAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGVuZHN3aXRoICovCi0gICAgICAgIGlmIChlbmQtc3RhcnQgPCB2c3Vic3RyLmxlbiB8fCBzdGFydCA+IGxlbikgewotICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVuZC12c3Vic3RyLmxlbiA+IHN0YXJ0KQotICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSB2c3Vic3RyLmxlbjsKLSAgICB9Ci0gICAgaWYgKGVuZC1zdGFydCA+PSB2c3Vic3RyLmxlbikKLSAgICAgICAgcnYgPSAhIG1lbWNtcChzdHIrc3RhcnQsIHZzdWJzdHIuYnVmLCB2c3Vic3RyLmxlbik7Ci0KLWRvbmU6Ci0gICAgUHlCdWZmZXJfUmVsZWFzZSgmdnN1YnN0cik7Ci0gICAgcmV0dXJuIHJ2OwotfQotCi0KLVB5RG9jX1NUUlZBUihzdGFydHN3aXRoX19kb2NfXywKLSJCLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAotXG5cCi1SZXR1cm4gVHJ1ZSBpZiBCIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCi1XaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IEIgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgQiBhdCB0aGF0IHBvc2l0aW9uLlxuXAotcHJlZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2YgYnl0ZXMgdG8gdHJ5LiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3N0YXJ0c3dpdGgoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwotICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnN1Ym9iajsKLSAgICBpbnQgcmVzdWx0OwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygic3RhcnRzd2l0aCIsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ieXRlYXJyYXlfdGFpbG1hdGNoKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgLTEpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gX2J5dGVhcnJheV90YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInN0YXJ0c3dpdGggZmlyc3QgYXJnIG11c3QgYmUgYnl0ZXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIHR1cGxlIG9mIGJ5dGVzLCBub3QgJXMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CisgICAgcmV0dXJuIF9QeV9ieXRlc19zdGFydHN3aXRoKFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi1QeURvY19TVFJWQVIoZW5kc3dpdGhfX2RvY19fLAotIkIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAotXG5cCi1SZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAotV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKLXN1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9lbmRzd2l0aChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCJlbmRzd2l0aCIsIGFyZ3MsICZzdWJvYmosICZzdGFydCwgJmVuZCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9ieXRlYXJyYXlfdGFpbG1hdGNoKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgKzEpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgewotICAgICAgICAgICAgICAgIFB5X1JFVFVSTl9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gX2J5dGVhcnJheV90YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7Ci0gICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKQotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImVuZHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBieXRlcywgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfZW5kc3dpdGgoUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKIAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnRyYW5zbGF0ZQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICB0YWJsZTogb2JqZWN0CiAgICAgICAgIFRyYW5zbGF0aW9uIHRhYmxlLCB3aGljaCBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IG9mIGxlbmd0aCAyNTYuCiAgICAgWwpAQCAtMTUyOSw3ICsxMTkxLDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfdHJhbnNsYXRlX2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICp0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBfcmlnaHRfMSwgUHlPYmplY3QgKmRlbGV0ZWNoYXJzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJiZWJjODZhOWExZmYwODMgaW5wdXQ9Yjc0OWFkODVmNDg2MDgyNF0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJiZWJjODZhOWExZmYwODMgaW5wdXQ9ODQ2YTAxNjcxYmNjYzFjNV0qLwogewogICAgIGNoYXIgKmlucHV0LCAqb3V0cHV0OwogICAgIGNvbnN0IGNoYXIgKnRhYmxlX2NoYXJzOwpAQCAtMTU3Miw3ICsxMjM0LDcgQEAKICAgICByZXN1bHQgPSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGlubGVuKTsKICAgICBpZiAocmVzdWx0ID09IE5VTEwpCiAgICAgICAgIGdvdG8gZG9uZTsKLSAgICBvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeUJ5dGVBcnJheV9Bc1N0cmluZyhyZXN1bHQpOworICAgIG91dHB1dF9zdGFydCA9IG91dHB1dCA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwogICAgIGlucHV0ID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKGlucHV0X29iaik7CiAKICAgICBpZiAodmRlbC5sZW4gPT0gMCAmJiB0YWJsZV9jaGFycyAhPSBOVUxMKSB7CkBAIC0xNjQyLDQ5MyArMTMwNCw2IEBACiB9CiAKIAotLyogZmluZCBhbmQgY291bnQgY2hhcmFjdGVycyBhbmQgc3Vic3RyaW5ncyAqLwotCi0jZGVmaW5lIGZpbmRjaGFyKHRhcmdldCwgdGFyZ2V0X2xlbiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKGNoYXIgKiltZW1jaHIoKGNvbnN0IHZvaWQgKikodGFyZ2V0KSwgYywgdGFyZ2V0X2xlbikpCi0KLQotLyogQnl0ZXMgb3BzIG11c3QgcmV0dXJuIGEgc3RyaW5nLCBjcmVhdGUgYSBjb3B5ICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmV0dXJuX3NlbGYoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYpCi17Ci0gICAgLyogYWx3YXlzIHJldHVybiBhIG5ldyBieXRlYXJyYXkgKi8KLSAgICByZXR1cm4gKFB5Qnl0ZUFycmF5T2JqZWN0ICopUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoCi0gICAgICAgICAgICBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZiksCi0gICAgICAgICAgICBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSk7Ci19Ci0KLVB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQotY291bnRjaGFyKGNvbnN0IGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLCBjaGFyIGMsIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgUHlfc3NpemVfdCBjb3VudD0wOwotICAgIGNvbnN0IGNoYXIgKnN0YXJ0PXRhcmdldDsKLSAgICBjb25zdCBjaGFyICplbmQ9dGFyZ2V0K3RhcmdldF9sZW47Ci0KLSAgICB3aGlsZSAoIChzdGFydD1maW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBjKSkgIT0gTlVMTCApIHsKLSAgICAgICAgY291bnQrKzsKLSAgICAgICAgaWYgKGNvdW50ID49IG1heGNvdW50KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgfQotICAgIHJldHVybiBjb3VudDsKLX0KLQotCi0vKiBBbGdvcml0aG1zIGZvciBkaWZmZXJlbnQgY2FzZXMgb2Ygc3RyaW5nIHJlcGxhY2VtZW50ICovCi0KLS8qIGxlbihzZWxmKT49MSwgZnJvbT0iIiwgbGVuKHRvKT49MSwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlX2ludGVybGVhdmUoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIGk7Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICAvKiAxIGF0IHRoZSBlbmQgcGx1cyAxIGFmdGVyIGV2ZXJ5IGNoYXJhY3RlcjsKLSAgICAgICBjb3VudCA9IG1pbihtYXhjb3VudCwgc2VsZl9sZW4gKyAxKSAqLwotICAgIGlmIChtYXhjb3VudCA8PSBzZWxmX2xlbikKLSAgICAgICAgY291bnQgPSBtYXhjb3VudDsKLSAgICBlbHNlCi0gICAgICAgIC8qIENhbid0IG92ZXJmbG93OiBzZWxmX2xlbiArIDEgPD0gbWF4Y291bnQgPD0gUFlfU1NJWkVfVF9NQVguICovCi0gICAgICAgIGNvdW50ID0gc2VsZl9sZW4gKyAxOwotCi0gICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gICAgLyogICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsgKi8KLSAgICBhc3NlcnQoY291bnQgPiAwKTsKLSAgICBpZiAodG9fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJlc3VsdF9sZW4gPSBjb3VudCAqIHRvX2xlbiArIHNlbGZfbGVuOwotCi0gICAgaWYgKCEgKHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKQotICAgICAgICAgICAgICAgICAgICAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpICkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIC8qIFRPRE86IHNwZWNpYWwgY2FzZSBzaW5nbGUgY2hhcmFjdGVyLCB3aGljaCBkb2Vzbid0IG5lZWQgbWVtY3B5ICovCi0KLSAgICAvKiBMYXkgdGhlIGZpcnN0IG9uZSBkb3duIChndWFyYW50ZWVkIHRoaXMgd2lsbCBvY2N1cikgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgIGNvdW50IC09IDE7Ci0KLSAgICBmb3IgKGk9MDsgaTxjb3VudDsgaSsrKSB7Ci0gICAgICAgICpyZXN1bHRfcysrID0gKnNlbGZfcysrOwotICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICB9Ci0KLSAgICAvKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4taSk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBTcGVjaWFsIGNhc2UgZm9yIGRlbGV0aW5nIGEgc2luZ2xlIGNoYXJhY3RlciAqLwotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIHRvPSIiLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLCBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQ7Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0gICAgc2VsZl9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotCi0gICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIGNvdW50OyAgLyogZnJvbV9sZW4gPT0gMSAqLwotICAgIGFzc2VydChyZXN1bHRfbGVuPj0wKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKQotICAgICAgICAgICAgICAgICAgICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBuZXh0ID0gZmluZGNoYXIoc3RhcnQsIGVuZC1zdGFydCwgZnJvbV9jKTsKLSAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLSAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICBzdGFydCA9IG5leHQrMTsKLSAgICB9Ci0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KLQotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0gICAgc2VsZl9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotCi0gICAgY291bnQgPSBzdHJpbmdsaWJfY291bnQoc2VsZl9zLCBzZWxmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLQotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIC8qIG5vIG1hdGNoZXMgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIChjb3VudCAqIGZyb21fbGVuKTsKLSAgICBhc3NlcnQgKHJlc3VsdF9sZW4+PTApOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi0gICAgICAgIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMICkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBuZXh0ID0gc3RhcnQgKyBvZmZzZXQ7Ci0KLSAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0KLSAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICBzdGFydCA9IG5leHQrZnJvbV9sZW47Ci0gICAgfQotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk9PTEsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVBcnJheU9iamVjdCAqKQotcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyX2luX3BsYWNlKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZnJvbV9jLCBjaGFyIHRvX2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kLCAqbmV4dDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuOwotICAgIFB5Qnl0ZUFycmF5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICAvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIG5leHQgPSBmaW5kY2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MpOwotCi0gICAgaWYgKG5leHQgPT0gTlVMTCkgewotICAgICAgICAvKiBObyBtYXRjaGVzOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBOZWVkIHRvIG1ha2UgYSBuZXcgYnl0ZXMgKi8KLSAgICByZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2VsZl9sZW4pOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcocmVzdWx0KTsKLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOwotCi0gICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KLSAgICBzdGFydCA9ICByZXN1bHRfcyArIChuZXh0LXNlbGZfcyk7Ci0gICAgKnN0YXJ0ID0gdG9fYzsKLSAgICBzdGFydCsrOwotICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47Ci0KLSAgICB3aGlsZSAoLS1tYXhjb3VudCA+IDApIHsKLSAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgKm5leHQgPSB0b19jOwotICAgICAgICBzdGFydCA9IG5leHQrMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZShQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRvX3MsIFB5X3NzaXplX3QgdG9fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpyZXN1bHRfcywgKnN0YXJ0LCAqZW5kOwotICAgIGNoYXIgKnNlbGZfczsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCBvZmZzZXQ7Ci0gICAgUHlCeXRlQXJyYXlPYmplY3QgKnJlc3VsdDsKLQotICAgIC8qIFRoZSByZXN1bHQgYnl0ZXMgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCi0KLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHNlbGZfcywgc2VsZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICBpZiAob2Zmc2V0ID09IC0xKSB7Ci0gICAgICAgIC8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBieXRlcyAqLwotICAgIHJlc3VsdCA9IChQeUJ5dGVBcnJheU9iamVjdCAqKSBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzZWxmX2xlbik7Ci0gICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhyZXN1bHQpOwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc2VsZl9zLCBzZWxmX2xlbik7Ci0KLSAgICAvKiBjaGFuZ2UgZXZlcnl0aGluZyBpbi1wbGFjZSwgc3RhcnRpbmcgd2l0aCB0aGlzIG9uZSAqLwotICAgIHN0YXJ0ID0gIHJlc3VsdF9zICsgb2Zmc2V0OwotICAgIFB5X01FTUNQWShzdGFydCwgdG9fcywgZnJvbV9sZW4pOwotICAgIHN0YXJ0ICs9IGZyb21fbGVuOwotICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47Ci0KLSAgICB3aGlsZSAoIC0tbWF4Y291bnQgPiAwKSB7Ci0gICAgICAgIG9mZnNldCA9IHN0cmluZ2xpYl9maW5kKHN0YXJ0LCBlbmQtc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICBpZiAob2Zmc2V0PT0tMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBQeV9NRU1DUFkoc3RhcnQrb2Zmc2V0LCB0b19zLCBmcm9tX2xlbik7Ci0gICAgICAgIHN0YXJ0ICs9IG9mZnNldCtmcm9tX2xlbjsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09MSwgbGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi1yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBjaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgcmVzdWx0X2xlbjsKLSAgICBQeV9zc2l6ZV90IGNvdW50OwotICAgIFB5Qnl0ZUFycmF5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX3MgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKTsKLQotICAgIGNvdW50ID0gY291bnRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYywgbWF4Y291bnQpOwotICAgIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgICAgIC8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIHVzZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5ldywgaGVuY2UgdGhlICItMSIgKi8KLSAgICAvKiAgIHJlc3VsdF9sZW4gPSBzZWxmX2xlbiArIGNvdW50ICogKHRvX2xlbi0xKSAgKi8KLSAgICBhc3NlcnQoY291bnQgPiAwKTsKLSAgICBpZiAodG9fbGVuIC0gMSA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBieXRlcyBpcyB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuIC0gMSk7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlQXJyYXlPYmplY3QgKikKLSAgICAgICAgICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAobmV4dCA9PSBzdGFydCkgewotICAgICAgICAgICAgLyogcmVwbGFjZSB3aXRoIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY29weSB0aGUgdW5jaGFuZ2VkIG9sZCB0aGVuIHRoZSAndG8nICovCi0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IChuZXh0LXN0YXJ0KTsKLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKLSAgICAgICAgICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICAgICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIGJ5dGVzICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2Vfc3Vic3RyaW5nKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKLSAgICBQeUJ5dGVBcnJheU9iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlQXJyYXlfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBjb3VudCA9IHN0cmluZ2xpYl9jb3VudChzZWxmX3MsIHNlbGZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwotCi0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCi0gICAgLyogICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLWZyb21fbGVuKSAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gLSBmcm9tX2xlbiA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBieXRlcyBpcyB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuIC0gZnJvbV9sZW4pOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZUFycmF5T2JqZWN0ICopCi0gICAgICAgICAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlQXJyYXlfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbmV4dCA9IHN0YXJ0K29mZnNldDsKLSAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKLSAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgKz0gZnJvbV9sZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgPSBuZXh0K2Zyb21fbGVuOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIGJ5dGVzICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotUHlfTE9DQUwoUHlCeXRlQXJyYXlPYmplY3QgKikKLXJlcGxhY2UoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsCi0gICAgICAgIGNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKLSAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgaWYgKG1heGNvdW50IDwgMCkgewotICAgICAgICBtYXhjb3VudCA9IFBZX1NTSVpFX1RfTUFYOwotICAgIH0gZWxzZSBpZiAobWF4Y291bnQgPT0gMCB8fCBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSA9PSAwKSB7Ci0gICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgYnl0ZXMgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIGlmIChtYXhjb3VudCA9PSAwIHx8Ci0gICAgICAgIChmcm9tX2xlbiA9PSAwICYmIHRvX2xlbiA9PSAwKSkgewotICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIGJ5dGVzICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgemVyby1sZW5ndGggc3BlY2lhbCBjYXNlcyAqLwotCi0gICAgaWYgKGZyb21fbGVuID09IDApIHsKLSAgICAgICAgLyogaW5zZXJ0IHRoZSAndG8nIGJ5dGVzIGV2ZXJ5d2hlcmUuICAgKi8KLSAgICAgICAgLyogICAgPj4+ICJQeXRob24iLnJlcGxhY2UoIiIsICIuIikgICAgICovCi0gICAgICAgIC8qICAgICcuUC55LnQuaC5vLm4uJyAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICByZXR1cm4gcmVwbGFjZV9pbnRlcmxlYXZlKHNlbGYsIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotICAgIH0KLQotICAgIC8qIEV4Y2VwdCBmb3IgIiIucmVwbGFjZSgiIiwgIkEiKSA9PSAiQSIgdGhlcmUgaXMgbm8gd2F5IGJleW9uZCB0aGlzICovCi0gICAgLyogcG9pbnQgZm9yIGFuIGVtcHR5IHNlbGYgYnl0ZXMgdG8gZ2VuZXJhdGUgYSBub24tZW1wdHkgYnl0ZXMgKi8KLSAgICAvKiBTcGVjaWFsIGNhc2Ugc28gdGhlIHJlbWFpbmluZyBjb2RlIGFsd2F5cyBnZXRzIGEgbm9uLWVtcHR5IGJ5dGVzICovCi0gICAgaWYgKFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIGlmICh0b19sZW4gPT0gMCkgewotICAgICAgICAvKiBkZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mICdmcm9tJyBieXRlcyAqLwotICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fc1swXSwgbWF4Y291bnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCBtYXhjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZXJlIGJvdGggYnl0ZXMgaGF2ZSB0aGUgc2FtZSBsZW5ndGggKi8KLQotICAgIGlmIChmcm9tX2xlbiA9PSB0b19sZW4pIHsKLSAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoCi0gICAgICAgICAgICAgICAgICAgIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgIGZyb21fc1swXSwKLSAgICAgICAgICAgICAgICAgICAgdG9fc1swXSwKLSAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKAotICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fcywgZnJvbV9sZW4sIHRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogT3RoZXJ3aXNlIHVzZSB0aGUgbW9yZSBnZW5lcmljIGFsZ29yaXRobXMgKi8KLSAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICByZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKHNlbGYsIGZyb21fc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBsZW4oJ2Zyb20nKT49MiwgbGVuKCd0bycpPj0xICovCi0gICAgICAgIHJldHVybiByZXBsYWNlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLSAgICB9Ci19Ci0KLQogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnJlcGxhY2UKIApAQCAtMjE1MCw5ICsxMzI1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgUHlfYnVmZmVyICpuZXcsIFB5X3NzaXplX3QgY291bnQpCiAvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDM5ODg0YzRkYzU5NDEyYSBpbnB1dD1hYTM3OWQ5ODg2MzdjN2ZiXSovCiB7Ci0gICAgcmV0dXJuIChQeU9iamVjdCAqKXJlcGxhY2UoKFB5Qnl0ZUFycmF5T2JqZWN0ICopIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLT5idWYsIG9sZC0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy0+YnVmLCBuZXctPmxlbiwgY291bnQpOworICAgIHJldHVybiBzdHJpbmdsaWJfcmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW9sZC0+YnVmLCBvbGQtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiluZXctPmJ1ZiwgbmV3LT5sZW4sIGNvdW50KTsKIH0KIAogLypbY2xpbmljIGlucHV0XQpAQCAtMjIwMCw3ICsxMzc1LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVhcnJheS5wYXJ0aXRpb24KIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgc2VwOiBvYmplY3QKICAgICAvCiAKQEAgLTIyMTYsNyArMTM5MCw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcGFydGl0aW9uKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ1ZDI1MjVkZGQzNWY5NTcgaW5wdXQ9N2Q3ZmUzN2IxNjk2ZDUwNl0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTQ1ZDI1MjVkZGQzNWY5NTcgaW5wdXQ9ODZmODkyMjM4OTJiNzBiNV0qLwogewogICAgIFB5T2JqZWN0ICpieXRlc2VwLCAqcmVzdWx0OwogCkBAIC0yMjM4LDcgKzE0MTIsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnJwYXJ0aXRpb24KIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCiAgICAgc2VwOiBvYmplY3QKICAgICAvCiAKQEAgLTIyNTQsNyArMTQyNyw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfcnBhcnRpdGlvbihQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00NDBkZTNjOTQyNjExNWU4IGlucHV0PTliOGNkNTQwYzFiNzU4NTNdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD00NDBkZTNjOTQyNjExNWU4IGlucHV0PTVmNDA5NGYyZGU4N2M4ZjNdKi8KIHsKICAgICBQeU9iamVjdCAqYnl0ZXNlcCwgKnJlc3VsdDsKIApAQCAtMjMxMiwxNCArMTQ4NSwxMiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LnJldmVyc2UKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlQXJyYXlPYmplY3QgKiIpCi0KIFJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSB2YWx1ZXMgaW4gQiBpbiBwbGFjZS4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9yZXZlcnNlX2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OWY3NjE2ZjI5YWIzMDlkMyBpbnB1dD03OTMzYTQ5OWI4NTk3YmQxXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OWY3NjE2ZjI5YWIzMDlkMyBpbnB1dD01NDMzNTYzMTlmYzc4NTU3XSovCiB7CiAgICAgY2hhciBzd2FwLCAqaGVhZCwgKnRhaWw7CiAgICAgUHlfc3NpemVfdCBpLCBqLCBuID0gUHlfU0laRShzZWxmKTsKQEAgLTIzNDgsNyArMTUxOSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuaW5zZXJ0CiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIGluZGV4OiBQeV9zc2l6ZV90CiAgICAgICAgIFRoZSBpbmRleCB3aGVyZSB0aGUgdmFsdWUgaXMgdG8gYmUgaW5zZXJ0ZWQuCiAgICAgaXRlbTogYnl0ZXN2YWx1ZQpAQCAtMjM2MCw3ICsxNTMwLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9pbnNlcnRfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgaW50IGl0ZW0pCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzZjNzc1YTcwZTdiMDdiNyBpbnB1dD04MzM3NjY4MzZiYTMwZTFlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzZjNzc1YTcwZTdiMDdiNyBpbnB1dD1iMmI1ZDA3ZTlkZTZjMDcwXSovCiB7CiAgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShzZWxmKTsKICAgICBjaGFyICpidWY7CkBAIC0yMzkwLDcgKzE1NjAsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5LmFwcGVuZAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBpdGVtOiBieXRlc3ZhbHVlCiAgICAgICAgIFRoZSBpdGVtIHRvIGJlIGFwcGVuZGVkLgogICAgIC8KQEAgLTI0MDAsNyArMTU2OSw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfYXBwZW5kX2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYsIGludCBpdGVtKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWExNTRlMTllZDE4ODZjYjYgaW5wdXQ9YWU1NmVhODczODA0MDdjY10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWExNTRlMTllZDE4ODZjYjYgaW5wdXQ9MjBkNmJlYzNkMTM0MDU5M10qLwogewogICAgIFB5X3NzaXplX3QgbiA9IFB5X1NJWkUoc2VsZik7CiAKQEAgLTI0MjAsNyArMTU4OSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuZXh0ZW5kCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIGl0ZXJhYmxlX29mX2ludHM6IG9iamVjdAogICAgICAgICBUaGUgaXRlcmFibGUgb2YgaXRlbXMgdG8gYXBwZW5kLgogICAgIC8KQEAgLTI0MzAsNyArMTU5OCw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfZXh0ZW5kKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqaXRlcmFibGVfb2ZfaW50cykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05ODE1NWRiZTI0OTE3MGIxIGlucHV0PWNlODNhNWQ3NWI3MGQ4NTBdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD05ODE1NWRiZTI0OTE3MGIxIGlucHV0PWM2MTdiM2E5MzI0OWJhMjhdKi8KIHsKICAgICBQeU9iamVjdCAqaXQsICppdGVtLCAqYnl0ZWFycmF5X29iajsKICAgICBQeV9zc2l6ZV90IGJ1Zl9zaXplID0gMCwgbGVuID0gMDsKQEAgLTI1MDUsNyArMTY3Myw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucG9wCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIGluZGV4OiBQeV9zc2l6ZV90ID0gLTEKICAgICAgICAgVGhlIGluZGV4IGZyb20gd2hlcmUgdG8gcmVtb3ZlIHRoZSBpdGVtLgogICAgICAgICAtMSAodGhlIGRlZmF1bHQgdmFsdWUpIG1lYW5zIHJlbW92ZSB0aGUgbGFzdCBpdGVtLgpAQCAtMjUxOCw3ICsxNjg1LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9wb3BfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgUHlfc3NpemVfdCBpbmRleCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lMGNjZDQwMWY4MDIxZGE4IGlucHV0PTA3OTdlNmMwY2E5ZDVhODVdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1lMGNjZDQwMWY4MDIxZGE4IGlucHV0PTM1OTFkZjJkMDZjMGQyMzddKi8KIHsKICAgICBpbnQgdmFsdWU7CiAgICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShzZWxmKTsKQEAgLTI1NTAsNyArMTcxNyw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkucmVtb3ZlCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQogICAgIHZhbHVlOiBieXRlc3ZhbHVlCiAgICAgICAgIFRoZSB2YWx1ZSB0byByZW1vdmUuCiAgICAgLwpAQCAtMjU2MCwyMCArMTcyNiwyMCBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZWFycmF5X3JlbW92ZV9pbXBsKFB5Qnl0ZUFycmF5T2JqZWN0ICpzZWxmLCBpbnQgdmFsdWUpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDY1OWUzNzg2NjcwOWMxMyBpbnB1dD00NzU2MGIxMWZkODU2YzI0XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDY1OWUzNzg2NjcwOWMxMyBpbnB1dD0xMjE4MzEyNDBjZDUxZGRmXSovCiB7Ci0gICAgUHlfc3NpemVfdCBuID0gUHlfU0laRShzZWxmKTsKKyAgICBQeV9zc2l6ZV90IHdoZXJlLCBuID0gUHlfU0laRShzZWxmKTsKICAgICBjaGFyICpidWYgPSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZik7Ci0gICAgY2hhciAqd2hlcmUgPSBtZW1jaHIoYnVmLCB2YWx1ZSwgbik7CiAKLSAgICBpZiAoIXdoZXJlKSB7CisgICAgd2hlcmUgPSBzdHJpbmdsaWJfZmluZF9jaGFyKGJ1ZiwgbiwgdmFsdWUpOworICAgIGlmICh3aGVyZSA8IDApIHsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ2YWx1ZSBub3QgZm91bmQgaW4gYnl0ZWFycmF5Iik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBpZiAoIV9jYW5yZXNpemUoc2VsZikpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgbWVtbW92ZSh3aGVyZSwgd2hlcmUgKyAxLCBidWYgKyBuIC0gd2hlcmUpOworICAgIG1lbW1vdmUoYnVmICsgd2hlcmUsIGJ1ZiArIHdoZXJlICsgMSwgbiAtIHdoZXJlKTsKICAgICBpZiAoUHlCeXRlQXJyYXlfUmVzaXplKChQeU9iamVjdCAqKXNlbGYsIG4gLSAxKSA8IDApCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0yNTgzLDggKzE3NDksOCBAQAogLyogWFhYIFRoZXNlIHR3byBoZWxwZXJzIGNvdWxkIGJlIG9wdGltaXplZCBpZiBhcmdzaXplID09IDEgKi8KIAogc3RhdGljIFB5X3NzaXplX3QKLWxzdHJpcF9oZWxwZXIoY2hhciAqbXlwdHIsIFB5X3NzaXplX3QgbXlzaXplLAotICAgICAgICAgICAgICB2b2lkICphcmdwdHIsIFB5X3NzaXplX3QgYXJnc2l6ZSkKK2xzdHJpcF9oZWxwZXIoY29uc3QgY2hhciAqbXlwdHIsIFB5X3NzaXplX3QgbXlzaXplLAorICAgICAgICAgICAgICBjb25zdCB2b2lkICphcmdwdHIsIFB5X3NzaXplX3QgYXJnc2l6ZSkKIHsKICAgICBQeV9zc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChpIDwgbXlzaXplICYmIG1lbWNocihhcmdwdHIsICh1bnNpZ25lZCBjaGFyKSBteXB0cltpXSwgYXJnc2l6ZSkpCkBAIC0yNTkzLDggKzE3NTksOCBAQAogfQogCiBzdGF0aWMgUHlfc3NpemVfdAotcnN0cmlwX2hlbHBlcihjaGFyICpteXB0ciwgUHlfc3NpemVfdCBteXNpemUsCi0gICAgICAgICAgICAgIHZvaWQgKmFyZ3B0ciwgUHlfc3NpemVfdCBhcmdzaXplKQorcnN0cmlwX2hlbHBlcihjb25zdCBjaGFyICpteXB0ciwgUHlfc3NpemVfdCBteXNpemUsCisgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmFyZ3B0ciwgUHlfc3NpemVfdCBhcmdzaXplKQogewogICAgIFB5X3NzaXplX3QgaSA9IG15c2l6ZSAtIDE7CiAgICAgd2hpbGUgKGkgPj0gMCAmJiBtZW1jaHIoYXJncHRyLCAodW5zaWduZWQgY2hhcikgbXlwdHJbaV0sIGFyZ3NpemUpKQpAQCAtMjc5NSwyNyArMTk2MSwxMCBAQAogICAgICAgICApOwogfQogCi1zdGF0aWMgaW50Ci1oZXhfZGlnaXRfdG9faW50KFB5X1VDUzQgYykKLXsKLSAgICBpZiAoYyA+PSAxMjgpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgcmV0dXJuIGMgLSAnMCc7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChQeV9JU1VQUEVSKGMpKQotICAgICAgICAgICAgYyA9IFB5X1RPTE9XRVIoYyk7Ci0gICAgICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKLSAgICAgICAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLX0KLQogLypbY2xpbmljIGlucHV0XQogQGNsYXNzbWV0aG9kCiBieXRlYXJyYXkuZnJvbWhleAogCi0gICAgY2xzOiBzZWxmKHR5cGU9IlB5T2JqZWN0KiIpCiAgICAgc3RyaW5nOiB1bmljb2RlCiAgICAgLwogCkBAIC0yODI2LDUxICsxOTc1LDE1IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlYXJyYXlfZnJvbWhleF9pbXBsKFB5T2JqZWN0KmNscywgUHlPYmplY3QgKnN0cmluZykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1kZjNkYTYwMTI5YjM3MDBjIGlucHV0PTkwN2JiZDJkMzRkOTM2N2FdKi8KK2J5dGVhcnJheV9mcm9taGV4X2ltcGwoUHlUeXBlT2JqZWN0ICp0eXBlLCBQeU9iamVjdCAqc3RyaW5nKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PThmMGYwYjZkMzBmYjNiYTAgaW5wdXQ9ZjAzM2ExNmQxZmIyMWY0OF0qLwogewotICAgIFB5T2JqZWN0ICpuZXdieXRlczsKLSAgICBjaGFyICpidWY7Ci0gICAgUHlfc3NpemVfdCBoZXhsZW4sIGJ5dGVzbGVuLCBpLCBqOwotICAgIGludCB0b3AsIGJvdDsKLSAgICB2b2lkICpkYXRhOwotICAgIHVuc2lnbmVkIGludCBraW5kOwotCi0gICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVjayhzdHJpbmcpKTsKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN0cmluZykpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHJpbmcpOwotICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHJpbmcpOwotICAgIGhleGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cmluZyk7Ci0KLSAgICBieXRlc2xlbiA9IGhleGxlbi8yOyAvKiBUaGlzIG92ZXJlc3RpbWF0ZXMgaWYgdGhlcmUgYXJlIHNwYWNlcyAqLwotICAgIG5ld2J5dGVzID0gUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgYnl0ZXNsZW4pOwotICAgIGlmICghbmV3Ynl0ZXMpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGJ1ZiA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhuZXdieXRlcyk7Ci0gICAgZm9yIChpID0gaiA9IDA7IGkgPCBoZXhsZW47IGkgKz0gMikgewotICAgICAgICAvKiBza2lwIG92ZXIgc3BhY2VzIGluIHRoZSBpbnB1dCAqLwotICAgICAgICB3aGlsZSAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkgPT0gJyAnKQotICAgICAgICAgICAgaSsrOwotICAgICAgICBpZiAoaSA+PSBoZXhsZW4pCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgdG9wID0gaGV4X2RpZ2l0X3RvX2ludChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSk7Ci0gICAgICAgIGJvdCA9IGhleF9kaWdpdF90b19pbnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSsxKSk7Ci0gICAgICAgIGlmICh0b3AgPT0gLTEgfHwgYm90ID09IC0xKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImZyb21oZXgoKSBhcmcgYXQgcG9zaXRpb24gJXpkIiwgaSk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZltqKytdID0gKHRvcCA8PCA0KSArIGJvdDsKKyAgICBQeU9iamVjdCAqcmVzdWx0ID0gX1B5Qnl0ZXNfRnJvbUhleChzdHJpbmcsIHR5cGUgPT0gJlB5Qnl0ZUFycmF5X1R5cGUpOworICAgIGlmICh0eXBlICE9ICZQeUJ5dGVBcnJheV9UeXBlICYmIHJlc3VsdCAhPSBOVUxMKSB7CisgICAgICAgIFB5X1NFVFJFRihyZXN1bHQsIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoKFB5T2JqZWN0ICopdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIE5VTEwpKTsKICAgICB9Ci0gICAgaWYgKFB5Qnl0ZUFycmF5X1Jlc2l6ZShuZXdieXRlcywgaikgPCAwKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIHJldHVybiBuZXdieXRlczsKLQotICBlcnJvcjoKLSAgICBQeV9ERUNSRUYobmV3Ynl0ZXMpOwotICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIFB5RG9jX1NUUlZBUihoZXhfX2RvY19fLApAQCAtMjkyNSwxNCArMjAzOCwxMiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5Ll9fcmVkdWNlX18gYXMgYnl0ZWFycmF5X3JlZHVjZQogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKLQogUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZy4KIFtjbGluaWMgc3RhcnQgZ2VuZXJhdGVkIGNvZGVdKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9yZWR1Y2VfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZikKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MmJmMzA0MDg2NDY0Y2FiIGlucHV0PWZiYjA3ZGU0ZDEwMmEwM2FdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MmJmMzA0MDg2NDY0Y2FiIGlucHV0PTQ0YjU3MzdhZGE2MmRkM2ZdKi8KIHsKICAgICByZXR1cm4gX2NvbW1vbl9yZWR1Y2Uoc2VsZiwgMik7CiB9CkBAIC0yOTQwLDcgKzIwNTEsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZWFycmF5Ll9fcmVkdWNlX2V4X18gYXMgYnl0ZWFycmF5X3JlZHVjZV9leAogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVBcnJheU9iamVjdCAqIikKICAgICBwcm90bzogaW50ID0gMAogICAgIC8KIApAQCAtMjk0OSw3ICsyMDU5LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVhcnJheV9yZWR1Y2VfZXhfaW1wbChQeUJ5dGVBcnJheU9iamVjdCAqc2VsZiwgaW50IHByb3RvKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUyZWFjMzMzNzcxOTc1MjAgaW5wdXQ9MGUwOTFhNDJjYTZkYmQ5MV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTUyZWFjMzMzNzcxOTc1MjAgaW5wdXQ9ZjEyOWJjMWExYWExNTFlZV0qLwogewogICAgIHJldHVybiBfY29tbW9uX3JlZHVjZShzZWxmLCBwcm90byk7CiB9CkBAIC0yOTU3LDE0ICsyMDY3LDEyIEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlYXJyYXkuX19zaXplb2ZfXyBhcyBieXRlYXJyYXlfc2l6ZW9mCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZUFycmF5T2JqZWN0ICoiKQotCiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBieXRlYXJyYXkgb2JqZWN0IGluIG1lbW9yeSwgaW4gYnl0ZXMuCiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlYXJyYXlfc2l6ZW9mX2ltcGwoUHlCeXRlQXJyYXlPYmplY3QgKnNlbGYpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzM4YWJkZDE3OTUxYzQyNyBpbnB1dD02YjIzZDMwNTM2MmI0NjJiXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NzM4YWJkZDE3OTUxYzQyNyBpbnB1dD1lMjczMjBmZDk4YTRiYzVhXSovCiB7CiAgICAgUHlfc3NpemVfdCByZXM7CiAKQEAgLTMwMDUsMTkgKzIxMTMsMjIgQEAKICAgICBCWVRFQVJSQVlfQVBQRU5EX01FVEhPRERFRgogICAgIHsiY2FwaXRhbGl6ZSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfY2FwaXRhbGl6ZSwgTUVUSF9OT0FSR1MsCiAgICAgIF9QeV9jYXBpdGFsaXplX19kb2NfX30sCi0gICAgeyJjZW50ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2NlbnRlciwgTUVUSF9WQVJBUkdTLCBjZW50ZXJfX2RvY19ffSwKKyAgICB7ImNlbnRlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfY2VudGVyLCBNRVRIX1ZBUkFSR1MsIF9QeV9jZW50ZXJfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfQ0xFQVJfTUVUSE9EREVGCiAgICAgQllURUFSUkFZX0NPUFlfTUVUSE9EREVGCi0gICAgeyJjb3VudCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfY291bnQsIE1FVEhfVkFSQVJHUywgY291bnRfX2RvY19ffSwKKyAgICB7ImNvdW50IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9jb3VudCwgTUVUSF9WQVJBUkdTLAorICAgICBfUHlfY291bnRfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfREVDT0RFX01FVEhPRERFRgotICAgIHsiZW5kc3dpdGgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2VuZHN3aXRoLCBNRVRIX1ZBUkFSR1MsIGVuZHN3aXRoX19kb2NfX30sCisgICAgeyJlbmRzd2l0aCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfZW5kc3dpdGgsIE1FVEhfVkFSQVJHUywKKyAgICAgX1B5X2VuZHN3aXRoX19kb2NfX30sCiAgICAgeyJleHBhbmR0YWJzIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9leHBhbmR0YWJzLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotICAgICBleHBhbmR0YWJzX19kb2NfX30sCisgICAgIF9QeV9leHBhbmR0YWJzX19kb2NfX30sCiAgICAgQllURUFSUkFZX0VYVEVORF9NRVRIT0RERUYKLSAgICB7ImZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2ZpbmQsIE1FVEhfVkFSQVJHUywgZmluZF9fZG9jX199LAorICAgIHsiZmluZCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfZmluZCwgTUVUSF9WQVJBUkdTLAorICAgICBfUHlfZmluZF9fZG9jX199LAogICAgIEJZVEVBUlJBWV9GUk9NSEVYX01FVEhPRERFRgogICAgIHsiaGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9oZXgsIE1FVEhfTk9BUkdTLCBoZXhfX2RvY19ffSwKLSAgICB7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVhcnJheV9pbmRleCwgTUVUSF9WQVJBUkdTLCBpbmRleF9fZG9jX199LAorICAgIHsiaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X2luZGV4LCBNRVRIX1ZBUkFSR1MsIF9QeV9pbmRleF9fZG9jX199LAogICAgIEJZVEVBUlJBWV9JTlNFUlRfTUVUSE9EREVGCiAgICAgeyJpc2FsbnVtIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9pc2FsbnVtLCBNRVRIX05PQVJHUywKICAgICAgX1B5X2lzYWxudW1fX2RvY19ffSwKQEAgLTMwMzQsNyArMjE0NSw3IEBACiAgICAgeyJpc3VwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9pc3VwcGVyLCBNRVRIX05PQVJHUywKICAgICAgX1B5X2lzdXBwZXJfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfSk9JTl9NRVRIT0RERUYKLSAgICB7ImxqdXN0IiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9sanVzdCwgTUVUSF9WQVJBUkdTLCBsanVzdF9fZG9jX199LAorICAgIHsibGp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2xqdXN0LCBNRVRIX1ZBUkFSR1MsIF9QeV9sanVzdF9fZG9jX199LAogICAgIHsibG93ZXIiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2xvd2VyLCBNRVRIX05PQVJHUywgX1B5X2xvd2VyX19kb2NfX30sCiAgICAgQllURUFSUkFZX0xTVFJJUF9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfTUFLRVRSQU5TX01FVEhPRERFRgpAQCAtMzA0MywyMyArMjE1NCwyMyBAQAogICAgIEJZVEVBUlJBWV9SRU1PVkVfTUVUSE9EREVGCiAgICAgQllURUFSUkFZX1JFUExBQ0VfTUVUSE9EREVGCiAgICAgQllURUFSUkFZX1JFVkVSU0VfTUVUSE9EREVGCi0gICAgeyJyZmluZCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfcmZpbmQsIE1FVEhfVkFSQVJHUywgcmZpbmRfX2RvY19ffSwKLSAgICB7InJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfcmluZGV4LCBNRVRIX1ZBUkFSR1MsIHJpbmRleF9fZG9jX199LAotICAgIHsicmp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3JqdXN0LCBNRVRIX1ZBUkFSR1MsIHJqdXN0X19kb2NfX30sCisgICAgeyJyZmluZCIsIChQeUNGdW5jdGlvbilieXRlYXJyYXlfcmZpbmQsIE1FVEhfVkFSQVJHUywgX1B5X3JmaW5kX19kb2NfX30sCisgICAgeyJyaW5kZXgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X3JpbmRleCwgTUVUSF9WQVJBUkdTLCBfUHlfcmluZGV4X19kb2NfX30sCisgICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfcmp1c3QsIE1FVEhfVkFSQVJHUywgX1B5X3JqdXN0X19kb2NfX30sCiAgICAgQllURUFSUkFZX1JQQVJUSVRJT05fTUVUSE9EREVGCiAgICAgQllURUFSUkFZX1JTUExJVF9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfUlNUUklQX01FVEhPRERFRgogICAgIEJZVEVBUlJBWV9TUExJVF9NRVRIT0RERUYKICAgICBCWVRFQVJSQVlfU1BMSVRMSU5FU19NRVRIT0RERUYKICAgICB7InN0YXJ0c3dpdGgiLCAoUHlDRnVuY3Rpb24pYnl0ZWFycmF5X3N0YXJ0c3dpdGgsIE1FVEhfVkFSQVJHUyAsCi0gICAgIHN0YXJ0c3dpdGhfX2RvY19ffSwKKyAgICAgX1B5X3N0YXJ0c3dpdGhfX2RvY19ffSwKICAgICBCWVRFQVJSQVlfU1RSSVBfTUVUSE9EREVGCiAgICAgeyJzd2FwY2FzZSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfc3dhcGNhc2UsIE1FVEhfTk9BUkdTLAogICAgICBfUHlfc3dhcGNhc2VfX2RvY19ffSwKICAgICB7InRpdGxlIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl90aXRsZSwgTUVUSF9OT0FSR1MsIF9QeV90aXRsZV9fZG9jX199LAogICAgIEJZVEVBUlJBWV9UUkFOU0xBVEVfTUVUSE9EREVGCiAgICAgeyJ1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfdXBwZXIsIE1FVEhfTk9BUkdTLCBfUHlfdXBwZXJfX2RvY19ffSwKLSAgICB7InpmaWxsIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl96ZmlsbCwgTUVUSF9WQVJBUkdTLCB6ZmlsbF9fZG9jX199LAorICAgIHsiemZpbGwiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3pmaWxsLCBNRVRIX1ZBUkFSR1MsIF9QeV96ZmlsbF9fZG9jX199LAogICAgIHtOVUxMfQogfTsKIApAQCAtMzA2OCw3ICsyMTc5LDcgQEAKIHsKICAgICBpZiAoIVB5Qnl0ZUFycmF5X0NoZWNrKHYpKQogICAgICAgICBQeV9SRVRVUk5fTk9USU1QTEVNRU5URUQ7Ci0gICAgcmV0dXJuIGJ5dGVhcnJheV9mb3JtYXQoKFB5Qnl0ZUFycmF5T2JqZWN0ICopdiwgdyk7CisgICAgcmV0dXJuIF9QeUJ5dGVzX0Zvcm1hdEV4KFB5Qnl0ZUFycmF5X0FTX1NUUklORyh2KSwgUHlCeXRlQXJyYXlfR0VUX1NJWkUodiksIHcsIDEpOwogfQogCiBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIGJ5dGVhcnJheV9hc19udW1iZXIgPSB7CmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVzX21ldGhvZHMuYyBiL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCmluZGV4IGEyOTk5MTUuLmQ3ZjA2MWIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCisrKyBiL09iamVjdHMvYnl0ZXNfbWV0aG9kcy5jCkBAIC0xLDMgKzEsNCBAQAorI2RlZmluZSBQWV9TU0laRV9UX0NMRUFOCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSAiYnl0ZXNfbWV0aG9kcy5oIgogCkBAIC0yNzcsNyArMjc4LDcgQEAKIGNoYXJhY3RlcnMsIGFsbCByZW1haW5pbmcgY2FzZWQgY2hhcmFjdGVycyBoYXZlIGxvd2VyY2FzZS4iKTsKIAogdm9pZAotX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pCitfUHlfYnl0ZXNfdGl0bGUoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgaW50IHByZXZpb3VzX2lzX2Nhc2VkID0gMDsKQEAgLTMwNiw3ICszMDcsNyBAQAogYW5kIHRoZSByZXN0IGxvd2VyLWNhc2VkLiIpOwogCiB2b2lkCi1fUHlfYnl0ZXNfY2FwaXRhbGl6ZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQorX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjb25zdCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKIHsKICAgICBQeV9zc2l6ZV90IGk7CiAKQEAgLTMzNiw3ICszMzcsNyBAQAogdG8gbG93ZXJjYXNlIEFTQ0lJIGFuZCB2aWNlIHZlcnNhLiIpOwogCiB2b2lkCi1fUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbikKK19QeV9ieXRlc19zd2FwY2FzZShjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKQogewogICAgIFB5X3NzaXplX3QgaTsKIApAQCAtMzg3LDMgKzM4OCw0MjcgQEAKIAogICAgIHJldHVybiByZXM7CiB9CisKKyNkZWZpbmUgRkFTVFNFQVJDSCBmYXN0c2VhcmNoCisjZGVmaW5lIFNUUklOR0xJQihGKSBzdHJpbmdsaWJfIyNGCisjZGVmaW5lIFNUUklOR0xJQl9DSEFSIGNoYXIKKyNkZWZpbmUgU1RSSU5HTElCX1NJWkVPRl9DSEFSIDEKKworI2luY2x1ZGUgInN0cmluZ2xpYi9mYXN0c2VhcmNoLmgiCisjaW5jbHVkZSAic3RyaW5nbGliL2NvdW50LmgiCisjaW5jbHVkZSAic3RyaW5nbGliL2ZpbmQuaCIKKworLyoKK1dyYXBzIHN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCkgYW5kIGFkZGl0aW9uYWxseSBjaGVja3Mgd2hldGhlciB0aGUKK2ZpcnN0IGFyZ3VtZW50IGlzIGFuIGludGVnZXIgaW4gcmFuZ2UoMCwgMjU2KS4KKworSWYgdGhpcyBpcyB0aGUgY2FzZSwgd3JpdGVzIHRoZSBpbnRlZ2VyIHZhbHVlIHRvIHRoZSBieXRlIHBhcmFtZXRlcgorYW5kIHNldHMgc3Vib2JqIHRvIE5VTEwuIE90aGVyd2lzZSwgc2V0cyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gc3Vib2JqCithbmQgZG9lc24ndCB0b3VjaCBieXRlLiBUaGUgb3RoZXIgcGFyYW1ldGVycyBhcmUgc2ltaWxhciB0byB0aG9zZSBvZgorc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoKS4KKyovCisKK1B5X0xPQ0FMX0lOTElORShpbnQpCitwYXJzZV9hcmdzX2ZpbmRzX2J5dGUoY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKipzdWJvYmosIGNoYXIgKmJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKmVuZCkKK3sKKyAgICBQeU9iamVjdCAqdG1wX3N1Ym9iajsKKyAgICBQeV9zc2l6ZV90IGl2YWw7CisgICAgUHlPYmplY3QgKmVycjsKKworICAgIGlmKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcyhmdW5jdGlvbl9uYW1lLCBhcmdzLCAmdG1wX3N1Ym9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFQeU51bWJlcl9DaGVjayh0bXBfc3Vib2JqKSkgeworICAgICAgICAqc3Vib2JqID0gdG1wX3N1Ym9iajsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaXZhbCA9IFB5TnVtYmVyX0FzU3NpemVfdCh0bXBfc3Vib2JqLCBQeUV4Y19PdmVyZmxvd0Vycm9yKTsKKyAgICBpZiAoaXZhbCA9PSAtMSkgeworICAgICAgICBlcnIgPSBQeUVycl9PY2N1cnJlZCgpOworICAgICAgICBpZiAoZXJyICYmICFQeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMoZXJyLCBQeUV4Y19PdmVyZmxvd0Vycm9yKSkgeworICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgICpzdWJvYmogPSB0bXBfc3Vib2JqOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXZhbCA8IDAgfHwgaXZhbCA+IDI1NSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImJ5dGUgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICpzdWJvYmogPSBOVUxMOworICAgICpieXRlID0gKGNoYXIpaXZhbDsKKyAgICByZXR1cm4gMTsKK30KKworLyogaGVscGVyIG1hY3JvIHRvIGZpeHVwIHN0YXJ0L2VuZCBzbGljZSB2YWx1ZXMgKi8KKyNkZWZpbmUgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKSAgICAgICAgIFwKKyAgICBpZiAoZW5kID4gbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbmQgPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoZW5kIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZW5kICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZW5kIDwgMCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVuZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0YXJ0IDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhcnQgKz0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc3RhcnQgPCAwKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXJ0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCitmaW5kX2ludGVybmFsKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sCisgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLCBpbnQgZGlyKQoreworICAgIFB5T2JqZWN0ICpzdWJvYmo7CisgICAgY2hhciBieXRlOworICAgIFB5X2J1ZmZlciBzdWJidWY7CisgICAgY29uc3QgY2hhciAqc3ViOworICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7CisgICAgUHlfc3NpemVfdCByZXM7CisKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfYnl0ZShmdW5jdGlvbl9uYW1lLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJvYmosICZieXRlLCAmc3RhcnQsICZlbmQpKQorICAgICAgICByZXR1cm4gLTI7CisKKyAgICBpZiAoc3Vib2JqKSB7CisgICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3Vib2JqLCAmc3ViYnVmLCBQeUJVRl9TSU1QTEUpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTI7CisKKyAgICAgICAgc3ViID0gc3ViYnVmLmJ1ZjsKKyAgICAgICAgc3ViX2xlbiA9IHN1YmJ1Zi5sZW47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdWIgPSAmYnl0ZTsKKyAgICAgICAgc3ViX2xlbiA9IDE7CisgICAgfQorCisgICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKKyAgICBpZiAoZW5kIC0gc3RhcnQgPCBzdWJfbGVuKQorICAgICAgICByZXMgPSAtMTsKKyAgICBlbHNlIGlmIChzdWJfbGVuID09IDEpIHsKKyAgICAgICAgaWYgKGRpciA+IDApCisgICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmluZF9jaGFyKAorICAgICAgICAgICAgICAgIHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAqc3ViKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzID0gc3RyaW5nbGliX3JmaW5kX2NoYXIoCisgICAgICAgICAgICAgICAgc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgICpzdWIpOworICAgICAgICBpZiAocmVzID49IDApCisgICAgICAgICAgICByZXMgKz0gc3RhcnQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoZGlyID4gMCkKKyAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9maW5kX3NsaWNlKAorICAgICAgICAgICAgICAgIHN0ciwgbGVuLAorICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9yZmluZF9zbGljZSgKKyAgICAgICAgICAgICAgICBzdHIsIGxlbiwKKyAgICAgICAgICAgICAgICBzdWIsIHN1Yl9sZW4sIHN0YXJ0LCBlbmQpOworICAgIH0KKworICAgIGlmIChzdWJvYmopCisgICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1YmJ1Zik7CisKKyAgICByZXR1cm4gcmVzOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9maW5kX19kb2NfXywKKyJCLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCitcblwKK1JldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIEIgd2hlcmUgc3Vic2VjdGlvbiBzdWIgaXMgZm91bmQsXG5cCitzdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydCxlbmRdLiAgT3B0aW9uYWxcblwKK2FyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblwKK1xuXAorUmV0dXJuIC0xIG9uIGZhaWx1cmUuIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19maW5kKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gZmluZF9pbnRlcm5hbChzdHIsIGxlbiwgImZpbmQiLCBhcmdzLCArMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9pbmRleF9fZG9jX18sCisiQi5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKK1xuXAorTGlrZSBCLmZpbmQoKSBidXQgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzZWN0aW9uIGlzIG5vdCBmb3VuZC4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX2luZGV4KGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5X3NzaXplX3QgcmVzdWx0ID0gZmluZF9pbnRlcm5hbChzdHIsIGxlbiwgImluZGV4IiwgYXJncywgKzEpOworICAgIGlmIChyZXN1bHQgPT0gLTIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAic3Vic2VjdGlvbiBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfcmZpbmRfX2RvY19fLAorIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCitcblwKK1JldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnNlY3Rpb24gc3ViIGlzIGZvdW5kLFxuXAorc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQsZW5kXS4gIE9wdGlvbmFsXG5cCithcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCitcblwKK1JldHVybiAtMSBvbiBmYWlsdXJlLiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfcmZpbmQoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlfc3NpemVfdCByZXN1bHQgPSBmaW5kX2ludGVybmFsKHN0ciwgbGVuLCAicmZpbmQiLCBhcmdzLCAtMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9yaW5kZXhfX2RvY19fLAorIkIucmluZGV4KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAorXG5cCitMaWtlIEIucmZpbmQoKSBidXQgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzZWN0aW9uIGlzIG5vdCBmb3VuZC4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX3JpbmRleChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGZpbmRfaW50ZXJuYWwoc3RyLCBsZW4sICJyaW5kZXgiLCBhcmdzLCAtMSk7CisgICAgaWYgKHJlc3VsdCA9PSAtMikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdWJzZWN0aW9uIG5vdCBmb3VuZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworfQorCitQeURvY19TVFJWQVJfc2hhcmVkKF9QeV9jb3VudF9fZG9jX18sCisiQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKK1xuXAorUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnNlY3Rpb24gc3ViIGluXG5cCitieXRlcyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcblwKK2FzIGluIHNsaWNlIG5vdGF0aW9uLiIpOworCitQeU9iamVjdCAqCitfUHlfYnl0ZXNfY291bnQoY29uc3QgY2hhciAqc3RyLCBQeV9zc2l6ZV90IGxlbiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKnN1Yl9vYmo7CisgICAgY29uc3QgY2hhciAqc3ViOworICAgIFB5X3NzaXplX3Qgc3ViX2xlbjsKKyAgICBjaGFyIGJ5dGU7CisgICAgUHlfc3NpemVfdCBzdGFydCA9IDAsIGVuZCA9IFBZX1NTSVpFX1RfTUFYOworCisgICAgUHlfYnVmZmVyIHZzdWI7CisgICAgUHlPYmplY3QgKmNvdW50X29iajsKKworICAgIGlmICghcGFyc2VfYXJnc19maW5kc19ieXRlKCJjb3VudCIsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1Yl9vYmosICZieXRlLCAmc3RhcnQsICZlbmQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChzdWJfb2JqKSB7CisgICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3ViX29iaiwgJnZzdWIsIFB5QlVGX1NJTVBMRSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIHN1YiA9IHZzdWIuYnVmOworICAgICAgICBzdWJfbGVuID0gdnN1Yi5sZW47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdWIgPSAmYnl0ZTsKKyAgICAgICAgc3ViX2xlbiA9IDE7CisgICAgfQorCisgICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKKworICAgIGNvdW50X29iaiA9IFB5TG9uZ19Gcm9tU3NpemVfdCgKKyAgICAgICAgc3RyaW5nbGliX2NvdW50KHN0ciArIHN0YXJ0LCBlbmQgLSBzdGFydCwgc3ViLCBzdWJfbGVuLCBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgKTsKKworICAgIGlmIChzdWJfb2JqKQorICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2c3ViKTsKKworICAgIHJldHVybiBjb3VudF9vYmo7Cit9CisKK2ludAorX1B5X2J5dGVzX2NvbnRhaW5zKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmcpCit7CisgICAgUHlfc3NpemVfdCBpdmFsID0gUHlOdW1iZXJfQXNTc2l6ZV90KGFyZywgTlVMTCk7CisgICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBQeV9idWZmZXIgdmFyZzsKKyAgICAgICAgUHlfc3NpemVfdCBwb3M7CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYXJnLCAmdmFyZywgUHlCVUZfU0lNUExFKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBwb3MgPSBzdHJpbmdsaWJfZmluZChzdHIsIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyZy5idWYsIHZhcmcubGVuLCAwKTsKKyAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmFyZyk7CisgICAgICAgIHJldHVybiBwb3MgPj0gMDsKKyAgICB9CisgICAgaWYgKGl2YWwgPCAwIHx8IGl2YWwgPj0gMjU2KSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBtZW1jaHIoc3RyLCAoaW50KSBpdmFsLCBsZW4pICE9IE5VTEw7Cit9CisKKworLyogTWF0Y2hlcyB0aGUgZW5kIChkaXJlY3Rpb24gPj0gMCkgb3Igc3RhcnQgKGRpcmVjdGlvbiA8IDApIG9mIHRoZSBidWZmZXIKKyAqIGFnYWluc3Qgc3Vic3RyLCB1c2luZyB0aGUgc3RhcnQgYW5kIGVuZCBhcmd1bWVudHMuIFJldHVybnMKKyAqIC0xIG9uIGVycm9yLCAwIGlmIG5vdCBmb3VuZCBhbmQgMSBpZiBmb3VuZC4KKyAqLworUHlfTE9DQUwoaW50KQordGFpbG1hdGNoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICpzdWJzdHIsCisgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCit7CisgICAgUHlfYnVmZmVyIHN1Yl92aWV3ID0ge05VTEwsIE5VTEx9OworICAgIGNvbnN0IGNoYXIgKnN1YjsKKyAgICBQeV9zc2l6ZV90IHNsZW47CisKKyAgICBpZiAoUHlCeXRlc19DaGVjayhzdWJzdHIpKSB7CisgICAgICAgIHN1YiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHN1YnN0cik7CisgICAgICAgIHNsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHN1YnN0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1YnN0ciwgJnN1Yl92aWV3LCBQeUJVRl9TSU1QTEUpICE9IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHN1YiA9IHN1Yl92aWV3LmJ1ZjsKKyAgICAgICAgc2xlbiA9IHN1Yl92aWV3LmxlbjsKKyAgICB9CisKKyAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4pOworCisgICAgaWYgKGRpcmVjdGlvbiA8IDApIHsKKyAgICAgICAgLyogc3RhcnRzd2l0aCAqLworICAgICAgICBpZiAoc3RhcnQgKyBzbGVuID4gbGVuKQorICAgICAgICAgICAgZ290byBub3Rmb3VuZDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBlbmRzd2l0aCAqLworICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPCBzbGVuIHx8IHN0YXJ0ID4gbGVuKQorICAgICAgICAgICAgZ290byBub3Rmb3VuZDsKKworICAgICAgICBpZiAoZW5kIC0gc2xlbiA+IHN0YXJ0KQorICAgICAgICAgICAgc3RhcnQgPSBlbmQgLSBzbGVuOworICAgIH0KKyAgICBpZiAoZW5kIC0gc3RhcnQgPCBzbGVuKQorICAgICAgICBnb3RvIG5vdGZvdW5kOworICAgIGlmIChtZW1jbXAoc3RyICsgc3RhcnQsIHN1Yiwgc2xlbikgIT0gMCkKKyAgICAgICAgZ290byBub3Rmb3VuZDsKKworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1Yl92aWV3KTsKKyAgICByZXR1cm4gMTsKKworbm90Zm91bmQ6CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViX3ZpZXcpOworICAgIHJldHVybiAwOworfQorCitQeV9MT0NBTChQeU9iamVjdCAqKQorX1B5X2J5dGVzX3RhaWxtYXRjaChjb25zdCBjaGFyICpzdHIsIFB5X3NzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBQeU9iamVjdCAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKK3sKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOworICAgIFB5T2JqZWN0ICpzdWJvYmo7CisgICAgaW50IHJlc3VsdDsKKworICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoZnVuY3Rpb25fbmFtZSwgYXJncywgJnN1Ym9iaiwgJnN0YXJ0LCAmZW5kKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHN0ciwgbGVuLCBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBQeV9SRVRVUk5fRkFMU0U7CisgICAgfQorICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzdHIsIGxlbiwgc3Vib2JqLCBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzIG9yIGEgdHVwbGUgb2YgYnl0ZXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X3N0YXJ0c3dpdGhfX2RvY19fLAorIkIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKSAtPiBib29sXG5cCitcblwKK1JldHVybiBUcnVlIGlmIEIgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cblwKK1dpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cblwKK1dpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXG5cCitwcmVmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuIik7CisKK1B5T2JqZWN0ICoKK19QeV9ieXRlc19zdGFydHN3aXRoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIHJldHVybiBfUHlfYnl0ZXNfdGFpbG1hdGNoKHN0ciwgbGVuLCAic3RhcnRzd2l0aCIsIGFyZ3MsIC0xKTsKK30KKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfZW5kc3dpdGhfX2RvY19fLAorIkIuZW5kc3dpdGgoc3VmZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAorXG5cCitSZXR1cm4gVHJ1ZSBpZiBCIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAorV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAorV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKK3N1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKKworUHlPYmplY3QgKgorX1B5X2J5dGVzX2VuZHN3aXRoKGNvbnN0IGNoYXIgKnN0ciwgUHlfc3NpemVfdCBsZW4sIFB5T2JqZWN0ICphcmdzKQoreworICAgIHJldHVybiBfUHlfYnl0ZXNfdGFpbG1hdGNoKHN0ciwgbGVuLCAiZW5kc3dpdGgiLCBhcmdzLCArMSk7Cit9CisKK1B5RG9jX1NUUlZBUl9zaGFyZWQoX1B5X2V4cGFuZHRhYnNfX2RvY19fLAorIkIuZXhwYW5kdGFicyh0YWJzaXplPTgpIC0+IGNvcHkgb2YgQlxuXAorXG5cCitSZXR1cm4gYSBjb3B5IG9mIEIgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSBleHBhbmRlZCB1c2luZyBzcGFjZXMuXG5cCitJZiB0YWJzaXplIGlzIG5vdCBnaXZlbiwgYSB0YWIgc2l6ZSBvZiA4IGNoYXJhY3RlcnMgaXMgYXNzdW1lZC4iKTsKKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfbGp1c3RfX2RvY19fLAorIkIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxuIgorIlxuIgorIlJldHVybiBCIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCB3aWR0aC4gUGFkZGluZyBpc1xuIgorImRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS4iKTsKKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfcmp1c3RfX2RvY19fLAorIkIucmp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pIC0+IGNvcHkgb2YgQlxuIgorIlxuIgorIlJldHVybiBCIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggd2lkdGguIFBhZGRpbmcgaXNcbiIKKyJkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgZmlsbCBjaGFyYWN0ZXIgKGRlZmF1bHQgaXMgYSBzcGFjZSkiKTsKKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfY2VudGVyX19kb2NfXywKKyJCLmNlbnRlcih3aWR0aFssIGZpbGxjaGFyXSkgLT4gY29weSBvZiBCXG4iCisiXG4iCisiUmV0dXJuIEIgY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoIHdpZHRoLiAgUGFkZGluZyBpc1xuIgorImRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCBmaWxsIGNoYXJhY3RlciAoZGVmYXVsdCBpcyBhIHNwYWNlKS4iKTsKKworUHlEb2NfU1RSVkFSX3NoYXJlZChfUHlfemZpbGxfX2RvY19fLAorIkIuemZpbGwod2lkdGgpIC0+IGNvcHkgb2YgQlxuIgorIlxuIgorIlBhZCBhIG51bWVyaWMgc3RyaW5nIEIgd2l0aCB6ZXJvcyBvbiB0aGUgbGVmdCwgdG8gZmlsbCBhIGZpZWxkXG4iCisib2YgdGhlIHNwZWNpZmllZCB3aWR0aC4gIEIgaXMgbmV2ZXIgdHJ1bmNhdGVkLiIpOworCmRpZmYgLS1naXQgYS9PYmplY3RzL2J5dGVzb2JqZWN0LmMgYi9PYmplY3RzL2J5dGVzb2JqZWN0LmMKaW5kZXggNTkzNDMzNi4uNWY3Nzg2NyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9ieXRlc29iamVjdC5jCisrKyBiL09iamVjdHMvYnl0ZXNvYmplY3QuYwpAQCAtOSw5ICs5LDkgQEAKICNpbmNsdWRlIDxzdGRkZWYuaD4KIAogLypbY2xpbmljIGlucHV0XQotY2xhc3MgYnl0ZXMgIlB5Qnl0ZXNPYmplY3QqIiAiJlB5Qnl0ZXNfVHlwZSIKK2NsYXNzIGJ5dGVzICJQeUJ5dGVzT2JqZWN0ICoiICImUHlCeXRlc19UeXBlIgogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9MWExZDkxMDJhZmMxYjAwY10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWRhMzlhM2VlNWU2YjRiMGQgaW5wdXQ9N2EyMzhmOTY1ZDY0ODkyYl0qLwogCiAjaW5jbHVkZSAiY2xpbmljL2J5dGVzb2JqZWN0LmMuaCIKIApAQCAtMzAsNiArMzAsMTAgQEAKICovCiAjZGVmaW5lIFB5Qnl0ZXNPYmplY3RfU0laRSAob2Zmc2V0b2YoUHlCeXRlc09iamVjdCwgb2Jfc3ZhbCkgKyAxKQogCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9uICovCitQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkgX1B5Qnl0ZXNXcml0ZXJfR2V0U2l6ZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyKTsKKwogLyoKICAgIEZvciBQeUJ5dGVzX0Zyb21TdHJpbmcoKSwgdGhlIHBhcmFtZXRlciBgc3RyJyBwb2ludHMgdG8gYSBudWxsLXRlcm1pbmF0ZWQKICAgIHN0cmluZyBjb250YWluaW5nIGV4YWN0bHkgYHNpemUnIGJ5dGVzLgpAQCAtMTc0LDE5MCArMTc4LDE4NCBAQAogUHlPYmplY3QgKgogUHlCeXRlc19Gcm9tRm9ybWF0Vihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmFyZ3MpCiB7Ci0gICAgdmFfbGlzdCBjb3VudDsKLSAgICBQeV9zc2l6ZV90IG4gPSAwOwotICAgIGNvbnN0IGNoYXIqIGY7CiAgICAgY2hhciAqczsKLSAgICBQeU9iamVjdCogc3RyaW5nOworICAgIGNvbnN0IGNoYXIgKmY7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBQeV9zc2l6ZV90IHByZWM7CisgICAgaW50IGxvbmdmbGFnOworICAgIGludCBzaXplX3RmbGFnOworICAgIC8qIExvbmdlc3QgNjQtYml0IGZvcm1hdHRlZCBudW1iZXJzOgorICAgICAgIC0gIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XDAiICgyMSBieXRlcykKKyAgICAgICAtICItOTIyMzM3MjAzNjg1NDc3NTgwOFwwIiAoMjEgYnl0ZXMpCisgICAgICAgRGVjaW1hbCB0YWtlcyB0aGUgbW9zdCBzcGFjZSAoaXQgaXNuJ3QgZW5vdWdoIGZvciBvY3RhbC4pCiAKLSAgICBQeV9WQV9DT1BZKGNvdW50LCB2YXJncyk7Ci0gICAgLyogc3RlcCAxOiBmaWd1cmUgb3V0IGhvdyBsYXJnZSBhIGJ1ZmZlciB3ZSBuZWVkICovCi0gICAgZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7Ci0gICAgICAgIGlmICgqZiA9PSAnJScpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBmOwotICAgICAgICAgICAgd2hpbGUgKCorK2YgJiYgKmYgIT0gJyUnICYmICFQeV9JU0FMUEhBKCpmKSkKLSAgICAgICAgICAgICAgICA7CisgICAgICAgTG9uZ2VzdCA2NC1iaXQgcG9pbnRlciByZXByZXNlbnRhdGlvbjoKKyAgICAgICAiMHhmZmZmZmZmZmZmZmZmZmZmXDAiICgxOSBieXRlcykuICovCisgICAgY2hhciBidWZmZXJbMjFdOworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAotICAgICAgICAgICAgLyogc2tpcCB0aGUgJ2wnIG9yICd6JyBpbiB7JWxkLCAlemQsICVsdSwgJXp1fSBzaW5jZQotICAgICAgICAgICAgICogdGhleSBkb24ndCBhZmZlY3QgdGhlIGFtb3VudCBvZiBzcGFjZSB3ZSByZXNlcnZlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKCpmID09ICdsJyB8fCAqZiA9PSAneicpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkKLSAgICAgICAgICAgICAgICArK2Y7CisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKIAotICAgICAgICAgICAgc3dpdGNoICgqZikgewotICAgICAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSB2YV9hcmcoY291bnQsIGludCk7Ci0gICAgICAgICAgICAgICAgaWYgKGMgPCAwIHx8IGMgPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHlCeXRlc19Gcm9tRm9ybWF0VigpOiAlYyBmb3JtYXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdHMgYW4gaW50ZWdlciBpbiByYW5nZSBbMDsgMjU1XSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnZCc6IGNhc2UgJ3UnOiBjYXNlICdpJzogY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZyhjb3VudCwgaW50KTsKLSAgICAgICAgICAgICAgICAvKiAyMCBieXRlcyBpcyBlbm91Z2ggdG8gaG9sZCBhIDY0LWJpdAotICAgICAgICAgICAgICAgICAgIGludGVnZXIuICBEZWNpbWFsIHRha2VzIHRoZSBtb3N0IHNwYWNlLgotICAgICAgICAgICAgICAgICAgIFRoaXMgaXNuJ3QgZW5vdWdoIGZvciBvY3RhbC4gKi8KLSAgICAgICAgICAgICAgICBuICs9IDIwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgcyA9IHZhX2FyZyhjb3VudCwgY2hhciopOwotICAgICAgICAgICAgICAgIG4gKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgKHZvaWQpIHZhX2FyZyhjb3VudCwgaW50KTsKLSAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIDY0LWJpdCBwb2ludGVyIHJlcHJlc2VudGF0aW9uOgotICAgICAgICAgICAgICAgICAqIDB4ZmZmZmZmZmZmZmZmZmZmZgotICAgICAgICAgICAgICAgICAqIHNvIDE5IGNoYXJhY3RlcnMgaXMgZW5vdWdoLgotICAgICAgICAgICAgICAgICAqIFhYWCBJIGNvdW50IDE4IC0tIHdoYXQncyB0aGUgZXh0cmEgZm9yPwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG4gKz0gMTk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8qIGlmIHdlIHN0dW1ibGUgdXBvbiBhbiB1bmtub3duCi0gICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZyBjb2RlLCBjb3B5IHRoZSByZXN0IG9mCi0gICAgICAgICAgICAgICAgICAgdGhlIGZvcm1hdCBzdHJpbmcgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgIHN0cmluZy4gKHdlIGNhbm5vdCBqdXN0IHNraXAgdGhlCi0gICAgICAgICAgICAgICAgICAgY29kZSwgc2luY2UgdGhlcmUncyBubyB3YXkgdG8ga25vdwotICAgICAgICAgICAgICAgICAgIHdoYXQncyBpbiB0aGUgYXJndW1lbnQgbGlzdCkgKi8KLSAgICAgICAgICAgICAgICBuICs9IHN0cmxlbihwKTsKLSAgICAgICAgICAgICAgICBnb3RvIGV4cGFuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuKys7Ci0gICAgfQotIGV4cGFuZDoKLSAgICAvKiBzdGVwIDI6IGZpbGwgdGhlIGJ1ZmZlciAqLwotICAgIC8qIFNpbmNlIHdlJ3ZlIGFuYWx5emVkIGhvdyBtdWNoIHNwYWNlIHdlIG5lZWQgZm9yIHRoZSB3b3JzdCBjYXNlLAotICAgICAgIHVzZSBzcHJpbnRmIGRpcmVjdGx5IGluc3RlYWQgb2YgdGhlIHNsb3dlciBQeU9TX3NucHJpbnRmLiAqLwotICAgIHN0cmluZyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgbik7Ci0gICAgaWYgKCFzdHJpbmcpCisgICAgcyA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHN0cmxlbihmb3JtYXQpKTsKKyAgICBpZiAocyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAotICAgIHMgPSBQeUJ5dGVzX0FzU3RyaW5nKHN0cmluZyk7CisjZGVmaW5lIFdSSVRFX0JZVEVTKHN0cikgXAorICAgIGRvIHsgXAorICAgICAgICBzID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBzLCAoc3RyKSwgc3RybGVuKHN0cikpOyBcCisgICAgICAgIGlmIChzID09IE5VTEwpIFwKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7IFwKKyAgICB9IHdoaWxlICgwKQogCiAgICAgZm9yIChmID0gZm9ybWF0OyAqZjsgZisrKSB7Ci0gICAgICAgIGlmICgqZiA9PSAnJScpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHAgPSBmKys7CisgICAgICAgIGlmICgqZiAhPSAnJScpIHsKKyAgICAgICAgICAgICpzKysgPSAqZjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcCA9IGYrKzsKKworICAgICAgICAvKiBpZ25vcmUgdGhlIHdpZHRoIChleDogMTAgaW4gIiUxMHMiKSAqLworICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqZikpCisgICAgICAgICAgICBmKys7CisKKyAgICAgICAgLyogcGFyc2UgdGhlIHByZWNpc2lvbiAoZXg6IDEwIGluICIlLjEwcyIpICovCisgICAgICAgIHByZWMgPSAwOworICAgICAgICBpZiAoKmYgPT0gJy4nKSB7CisgICAgICAgICAgICBmKys7CisgICAgICAgICAgICBmb3IgKDsgUHlfSVNESUdJVCgqZik7IGYrKykgeworICAgICAgICAgICAgICAgIHByZWMgPSAocHJlYyAqIDEwKSArICgqZiAtICcwJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAoKmYgJiYgKmYgIT0gJyUnICYmICFQeV9JU0FMUEhBKCpmKSkKKyAgICAgICAgICAgIGYrKzsKKworICAgICAgICAvKiBoYW5kbGUgdGhlIGxvbmcgZmxhZyAoJ2wnKSwgYnV0IG9ubHkgZm9yICVsZCBhbmQgJWx1LgorICAgICAgICAgICBvdGhlcnMgY2FuIGJlIGFkZGVkIHdoZW4gbmVjZXNzYXJ5LiAqLworICAgICAgICBsb25nZmxhZyA9IDA7CisgICAgICAgIGlmICgqZiA9PSAnbCcgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgeworICAgICAgICAgICAgbG9uZ2ZsYWcgPSAxOworICAgICAgICAgICAgKytmOworICAgICAgICB9CisKKyAgICAgICAgLyogaGFuZGxlIHRoZSBzaXplX3QgZmxhZyAoJ3onKS4gKi8KKyAgICAgICAgc2l6ZV90ZmxhZyA9IDA7CisgICAgICAgIGlmICgqZiA9PSAneicgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgeworICAgICAgICAgICAgc2l6ZV90ZmxhZyA9IDE7CisgICAgICAgICAgICArK2Y7CisgICAgICAgIH0KKworICAgICAgICAvKiBzdWJzdHJhY3QgYnl0ZXMgcHJlYWxsb2NhdGVkIGZvciB0aGUgZm9ybWF0IHN0cmluZworICAgICAgICAgICAoZXg6IDIgZm9yICIlcyIpICovCisgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAoZiAtIHAgKyAxKTsKKworICAgICAgICBzd2l0Y2ggKCpmKSB7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYyA9IHZhX2FyZyh2YXJncywgaW50KTsKKyAgICAgICAgICAgIGlmIChjIDwgMCB8fCBjID4gMjU1KSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQeUJ5dGVzX0Zyb21Gb3JtYXRWKCk6ICVjIGZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RzIGFuIGludGVnZXIgaW4gcmFuZ2UgWzA7IDI1NV0iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplKys7CisgICAgICAgICAgICAqcysrID0gKHVuc2lnbmVkIGNoYXIpYzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlbGQiLCB2YV9hcmcodmFyZ3MsIGxvbmcpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfU0laRV9UICJkIiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBQeV9zc2l6ZV90KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlZCIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICBhc3NlcnQoc3RybGVuKGJ1ZmZlcikgPCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBXUklURV9CWVRFUyhidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAndSc6CisgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlbHUiLAorICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHVuc2lnbmVkIGxvbmcpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCisgICAgICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBzaXplX3QpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiV1IiwKKyAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCB1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgICAgIGFzc2VydChzdHJsZW4oYnVmZmVyKSA8IHNpemVvZihidWZmZXIpKTsKKyAgICAgICAgICAgIFdSSVRFX0JZVEVTKGJ1ZmZlcik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdpJzoKKyAgICAgICAgICAgIHNwcmludGYoYnVmZmVyLCAiJWkiLCB2YV9hcmcodmFyZ3MsIGludCkpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgc3ByaW50ZihidWZmZXIsICIleCIsIHZhX2FyZyh2YXJncywgaW50KSk7CisgICAgICAgICAgICBhc3NlcnQoc3RybGVuKGJ1ZmZlcikgPCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICBXUklURV9CWVRFUyhidWZmZXIpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgIHsKICAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKLSAgICAgICAgICAgIGludCBsb25nZmxhZyA9IDA7Ci0gICAgICAgICAgICBpbnQgc2l6ZV90ZmxhZyA9IDA7Ci0gICAgICAgICAgICAvKiBwYXJzZSB0aGUgd2lkdGgucHJlY2lzaW9uIHBhcnQgKHdlJ3JlIG9ubHkKLSAgICAgICAgICAgICAgIGludGVyZXN0ZWQgaW4gdGhlIHByZWNpc2lvbiB2YWx1ZSwgaWYgYW55KSAqLwotICAgICAgICAgICAgbiA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoUHlfSVNESUdJVCgqZikpCi0gICAgICAgICAgICAgICAgbiA9IChuKjEwKSArICpmKysgLSAnMCc7Ci0gICAgICAgICAgICBpZiAoKmYgPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgZisrOwotICAgICAgICAgICAgICAgIG4gPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChQeV9JU0RJR0lUKCpmKSkKLSAgICAgICAgICAgICAgICAgICAgbiA9IChuKjEwKSArICpmKysgLSAnMCc7CisKKyAgICAgICAgICAgIHAgPSB2YV9hcmcodmFyZ3MsIGNvbnN0IGNoYXIqKTsKKyAgICAgICAgICAgIGkgPSBzdHJsZW4ocCk7CisgICAgICAgICAgICBpZiAocHJlYyA+IDAgJiYgaSA+IHByZWMpCisgICAgICAgICAgICAgICAgaSA9IHByZWM7CisgICAgICAgICAgICBzID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBzLCBwLCBpKTsKKyAgICAgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSAncCc6CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlciwgIiVwIiwgdmFfYXJnKHZhcmdzLCB2b2lkKikpOworICAgICAgICAgICAgYXNzZXJ0KHN0cmxlbihidWZmZXIpIDwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgLyogJXAgaXMgaWxsLWRlZmluZWQ6ICBlbnN1cmUgbGVhZGluZyAweC4gKi8KKyAgICAgICAgICAgIGlmIChidWZmZXJbMV0gPT0gJ1gnKQorICAgICAgICAgICAgICAgIGJ1ZmZlclsxXSA9ICd4JzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJ1ZmZlclsxXSAhPSAneCcpIHsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKGJ1ZmZlcisyLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKzEpOworICAgICAgICAgICAgICAgIGJ1ZmZlclswXSA9ICcwJzsKKyAgICAgICAgICAgICAgICBidWZmZXJbMV0gPSAneCc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoKmYgJiYgKmYgIT0gJyUnICYmICFQeV9JU0FMUEhBKCpmKSkKLSAgICAgICAgICAgICAgICBmKys7Ci0gICAgICAgICAgICAvKiBoYW5kbGUgdGhlIGxvbmcgZmxhZywgYnV0IG9ubHkgZm9yICVsZCBhbmQgJWx1LgotICAgICAgICAgICAgICAgb3RoZXJzIGNhbiBiZSBhZGRlZCB3aGVuIG5lY2Vzc2FyeS4gKi8KLSAgICAgICAgICAgIGlmICgqZiA9PSAnbCcgJiYgKGZbMV0gPT0gJ2QnIHx8IGZbMV0gPT0gJ3UnKSkgewotICAgICAgICAgICAgICAgIGxvbmdmbGFnID0gMTsKLSAgICAgICAgICAgICAgICArK2Y7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBoYW5kbGUgdGhlIHNpemVfdCBmbGFnLiAqLwotICAgICAgICAgICAgaWYgKCpmID09ICd6JyAmJiAoZlsxXSA9PSAnZCcgfHwgZlsxXSA9PSAndScpKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90ZmxhZyA9IDE7Ci0gICAgICAgICAgICAgICAgKytmOworICAgICAgICAgICAgV1JJVEVfQllURVMoYnVmZmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplKys7CisgICAgICAgICAgICAqcysrID0gJyUnOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICgqZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogZml4IG1pbl9zaXplIGlmIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZm9ybWF0IHN0cmluZyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSsrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzd2l0Y2ggKCpmKSB7Ci0gICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IHZhX2FyZyh2YXJncywgaW50KTsKLSAgICAgICAgICAgICAgICAvKiBjIGhhcyBiZWVuIGNoZWNrZWQgZm9yIG92ZXJmbG93IGluIHRoZSBmaXJzdCBzdGVwICovCi0gICAgICAgICAgICAgICAgKnMrKyA9ICh1bnNpZ25lZCBjaGFyKWM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVsZCIsIHZhX2FyZyh2YXJncywgbG9uZykpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNpemVfdGZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiUiIFBZX0ZPUk1BVF9TSVpFX1QgImQiLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFfYXJnKHZhcmdzLCBQeV9zc2l6ZV90KSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlZCIsIHZhX2FyZyh2YXJncywgaW50KSk7Ci0gICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICAgICAgICBpZiAobG9uZ2ZsYWcpCi0gICAgICAgICAgICAgICAgICAgIHNwcmludGYocywgIiVsdSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHVuc2lnbmVkIGxvbmcpKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzaXplX3RmbGFnKQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIlIiBQWV9GT1JNQVRfU0laRV9UICJ1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2FyZyh2YXJncywgc2l6ZV90KSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHMsICIldSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YV9hcmcodmFyZ3MsIHVuc2lnbmVkIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJWkiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXgiLCB2YV9hcmcodmFyZ3MsIGludCkpOwotICAgICAgICAgICAgICAgIHMgKz0gc3RybGVuKHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgICAgcCA9IHZhX2FyZyh2YXJncywgY2hhciopOwotICAgICAgICAgICAgICAgIGkgPSBzdHJsZW4ocCk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gPiAwICYmIGkgPiBuKQotICAgICAgICAgICAgICAgICAgICBpID0gbjsKLSAgICAgICAgICAgICAgICBQeV9NRU1DUFkocywgcCwgaSk7Ci0gICAgICAgICAgICAgICAgcyArPSBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihzLCAiJXAiLCB2YV9hcmcodmFyZ3MsIHZvaWQqKSk7Ci0gICAgICAgICAgICAgICAgLyogJXAgaXMgaWxsLWRlZmluZWQ6ICBlbnN1cmUgbGVhZGluZyAweC4gKi8KLSAgICAgICAgICAgICAgICBpZiAoc1sxXSA9PSAnWCcpCi0gICAgICAgICAgICAgICAgICAgIHNbMV0gPSAneCc7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc1sxXSAhPSAneCcpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShzKzIsIHMsIHN0cmxlbihzKSsxKTsKLSAgICAgICAgICAgICAgICAgICAgc1swXSA9ICcwJzsKLSAgICAgICAgICAgICAgICAgICAgc1sxXSA9ICd4JzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICAqcysrID0gJyUnOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBzdHJjcHkocywgcCk7Ci0gICAgICAgICAgICAgICAgcyArPSBzdHJsZW4ocyk7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgKnMrKyA9ICpmOworICAgICAgICAgICAgLyogaW52YWxpZCBmb3JtYXQgc3RyaW5nOiBjb3B5IHVuZm9ybWF0dGVkIHN0cmluZyBhbmQgZXhpdCAqLworICAgICAgICAgICAgV1JJVEVfQllURVMocCk7CisgICAgICAgICAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHMpOworICAgICAgICB9CiAgICAgfQogCi0gZW5kOgotICAgIF9QeUJ5dGVzX1Jlc2l6ZSgmc3RyaW5nLCBzIC0gUHlCeXRlc19BU19TVFJJTkcoc3RyaW5nKSk7Ci0gICAgcmV0dXJuIHN0cmluZzsKKyN1bmRlZiBXUklURV9CWVRFUworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzKTsKKworIGVycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTQwOSwxMiArNDA3LDE0IEBACiAKIC8qIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlIHRvIGEgUHlCeXRlcyBvYmplY3QsIG9yIE5VTEwgb24gZmFpbHVyZS4gKi8KIAotc3RhdGljIFB5T2JqZWN0ICoKLWZvcm1hdGZsb2F0KFB5T2JqZWN0ICp2LCBpbnQgZmxhZ3MsIGludCBwcmVjLCBpbnQgdHlwZSkKK3N0YXRpYyBjaGFyKgorZm9ybWF0ZmxvYXQoUHlPYmplY3QgKnYsIGludCBmbGFncywgaW50IHByZWMsIGludCB0eXBlLAorICAgICAgICAgICAgUHlPYmplY3QgKipwX3Jlc3VsdCwgX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyKQogewogICAgIGNoYXIgKnA7CiAgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBkb3VibGUgeDsKKyAgICBzaXplX3QgbGVuOwogCiAgICAgeCA9IFB5RmxvYXRfQXNEb3VibGUodik7CiAgICAgaWYgKHggPT0gLTEuMCAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CkBAIC00MzEsOSArNDMxLDIyIEBACiAKICAgICBpZiAocCA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHQgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHAsIHN0cmxlbihwKSk7CisKKyAgICBsZW4gPSBzdHJsZW4ocCk7CisgICAgaWYgKHdyaXRlciAhPSBOVUxMKSB7CisgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzdHIsIGxlbik7CisgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBQeV9NRU1DUFkoc3RyLCBwLCBsZW4pOworICAgICAgICBQeU1lbV9GcmVlKHApOworICAgICAgICBzdHIgKz0gbGVuOworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKworICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUocCwgbGVuKTsKICAgICBQeU1lbV9GcmVlKHApOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgKnBfcmVzdWx0ID0gcmVzdWx0OworICAgIHJldHVybiBzdHI7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00NzMsMTEgKzQ4NiwxMSBAQAogc3RhdGljIGludAogYnl0ZV9jb252ZXJ0ZXIoUHlPYmplY3QgKmFyZywgY2hhciAqcCkKIHsKLSAgICBpZiAoUHlCeXRlc19DaGVjayhhcmcpICYmIFB5Qnl0ZXNfU2l6ZShhcmcpID09IDEpIHsKKyAgICBpZiAoUHlCeXRlc19DaGVjayhhcmcpICYmIFB5Qnl0ZXNfR0VUX1NJWkUoYXJnKSA9PSAxKSB7CiAgICAgICAgICpwID0gUHlCeXRlc19BU19TVFJJTkcoYXJnKVswXTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIGVsc2UgaWYgKFB5Qnl0ZUFycmF5X0NoZWNrKGFyZykgJiYgUHlCeXRlQXJyYXlfU2l6ZShhcmcpID09IDEpIHsKKyAgICBlbHNlIGlmIChQeUJ5dGVBcnJheV9DaGVjayhhcmcpICYmIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKGFyZykgPT0gMSkgewogICAgICAgICAqcCA9IFB5Qnl0ZUFycmF5X0FTX1NUUklORyhhcmcpWzBdOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC01NTcsMzYgKzU3MCwzNiBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi0vKiBmbXQlKHYxLHYyLC4uLikgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHNwcmludGYoZm10LCB2MSwgdjIsIC4uLikKLQotICAgRk9STUFUQlVGTEVOIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpbiB3aGljaCB0aGUgaW50cyAmCi0gICBjaGFycyBhcmUgZm9ybWF0dGVkLiBYWFggVGhpcyBpcyBhIG1hZ2ljIG51bWJlci4gRWFjaCBmb3JtYXR0aW5nCi0gICByb3V0aW5lIGRvZXMgYm91bmRzIGNoZWNraW5nIHRvIGVuc3VyZSBubyBvdmVyZmxvdywgYnV0IGEgYmV0dGVyCi0gICBzb2x1dGlvbiBtYXkgYmUgdG8gbWFsbG9jIGEgYnVmZmVyIG9mIGFwcHJvcHJpYXRlIHNpemUgZm9yIGVhY2gKLSAgIGZvcm1hdC4gRm9yIG5vdywgdGhlIGN1cnJlbnQgc29sdXRpb24gaXMgc3VmZmljaWVudC4KLSovCi0jZGVmaW5lIEZPUk1BVEJVRkxFTiAoc2l6ZV90KTEyMAorLyogZm10JSh2MSx2MiwuLi4pIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBzcHJpbnRmKGZtdCwgdjEsIHYyLCAuLi4pICovCiAKIFB5T2JqZWN0ICoKLV9QeUJ5dGVzX0Zvcm1hdChQeU9iamVjdCAqZm9ybWF0LCBQeU9iamVjdCAqYXJncykKK19QeUJ5dGVzX0Zvcm1hdEV4KGNvbnN0IGNoYXIgKmZvcm1hdCwgUHlfc3NpemVfdCBmb3JtYXRfbGVuLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIGludCB1c2VfYnl0ZWFycmF5KQogewotICAgIGNoYXIgKmZtdCwgKnJlczsKKyAgICBjb25zdCBjaGFyICpmbXQ7CisgICAgY2hhciAqcmVzOwogICAgIFB5X3NzaXplX3QgYXJnbGVuLCBhcmdpZHg7Ci0gICAgUHlfc3NpemVfdCByZXNsZW4sIHJlc2NudCwgZm10Y250OworICAgIFB5X3NzaXplX3QgZm10Y250OwogICAgIGludCBhcmdzX293bmVkID0gMDsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwogICAgIFB5T2JqZWN0ICpkaWN0ID0gTlVMTDsKLSAgICBpZiAoZm9ybWF0ID09IE5VTEwgfHwgIVB5Qnl0ZXNfQ2hlY2soZm9ybWF0KSB8fCBhcmdzID09IE5VTEwpIHsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBpZiAoYXJncyA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgZm10ID0gUHlCeXRlc19BU19TVFJJTkcoZm9ybWF0KTsKLSAgICBmbXRjbnQgPSBQeUJ5dGVzX0dFVF9TSVpFKGZvcm1hdCk7Ci0gICAgcmVzbGVuID0gcmVzY250ID0gZm10Y250ICsgMTAwOwotICAgIHJlc3VsdCA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKilOVUxMLCByZXNsZW4pOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkKKyAgICBmbXQgPSBmb3JtYXQ7CisgICAgZm10Y250ID0gZm9ybWF0X2xlbjsKKworICAgIF9QeUJ5dGVzV3JpdGVyX0luaXQoJndyaXRlcik7CisgICAgd3JpdGVyLnVzZV9ieXRlYXJyYXkgPSB1c2VfYnl0ZWFycmF5OworCisgICAgcmVzID0gX1B5Qnl0ZXNXcml0ZXJfQWxsb2MoJndyaXRlciwgZm10Y250KTsKKyAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlcyA9IFB5Qnl0ZXNfQXNTdHJpbmcocmVzdWx0KTsKKyAgICBpZiAoIXVzZV9ieXRlYXJyYXkpCisgICAgICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAxOworCiAgICAgaWYgKFB5VHVwbGVfQ2hlY2soYXJncykpIHsKICAgICAgICAgYXJnbGVuID0gUHlUdXBsZV9HRVRfU0laRShhcmdzKTsKICAgICAgICAgYXJnaWR4ID0gMDsKQEAgLTYwMCwxOCArNjEzLDIzIEBACiAgICAgICAgICFQeUJ5dGVBcnJheV9DaGVjayhhcmdzKSkgewogICAgICAgICAgICAgZGljdCA9IGFyZ3M7CiAgICAgfQorCiAgICAgd2hpbGUgKC0tZm10Y250ID49IDApIHsKICAgICAgICAgaWYgKCpmbXQgIT0gJyUnKSB7Ci0gICAgICAgICAgICBpZiAoLS1yZXNjbnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmVzY250ID0gZm10Y250ICsgMTAwOwotICAgICAgICAgICAgICAgIHJlc2xlbiArPSByZXNjbnQ7Ci0gICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4pKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICByZXMgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICsgcmVzbGVuIC0gcmVzY250OwotICAgICAgICAgICAgICAgIC0tcmVzY250OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnJlcysrID0gKmZtdCsrOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW47CisgICAgICAgICAgICBjaGFyICpwb3M7CisKKyAgICAgICAgICAgIHBvcyA9IHN0cmNocihmbXQgKyAxLCAnJScpOworICAgICAgICAgICAgaWYgKHBvcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIGxlbiA9IHBvcyAtIGZtdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsZW4gPSBmb3JtYXRfbGVuIC0gKGZtdCAtIGZvcm1hdCk7CisgICAgICAgICAgICBhc3NlcnQobGVuICE9IDApOworCisgICAgICAgICAgICBQeV9NRU1DUFkocmVzLCBmbXQsIGxlbik7CisgICAgICAgICAgICByZXMgKz0gbGVuOworICAgICAgICAgICAgZm10ICs9IGxlbjsKKyAgICAgICAgICAgIGZtdGNudCAtPSAobGVuIC0gMSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAvKiBHb3QgYSBmb3JtYXQgc3BlY2lmaWVyICovCkBAIC02MjYsMTAgKzY0NCwxNCBAQAogICAgICAgICAgICAgaW50IHNpZ247CiAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiA9IDA7CiAgICAgICAgICAgICBjaGFyIG9uZWNoYXI7IC8qIEZvciBieXRlX2NvbnZlcnRlcigpICovCisgICAgICAgICAgICBQeV9zc2l6ZV90IGFsbG9jOworI2lmZGVmIFB5X0RFQlVHCisgICAgICAgICAgICBjaGFyICpiZWZvcmU7CisjZW5kaWYKIAogICAgICAgICAgICAgZm10Kys7CiAgICAgICAgICAgICBpZiAoKmZtdCA9PSAnKCcpIHsKLSAgICAgICAgICAgICAgICBjaGFyICprZXlzdGFydDsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXlzdGFydDsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGtleWxlbjsKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqa2V5OwogICAgICAgICAgICAgICAgIGludCBwY291bnQgPSAxOwpAQCAtNjczLDYgKzY5NSw4IEBACiAgICAgICAgICAgICAgICAgYXJnbGVuID0gLTE7CiAgICAgICAgICAgICAgICAgYXJnaWR4ID0gLTI7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhcnNlIGZsYWdzLiBFeGFtcGxlOiAiJStpIiA9PiBmbGFncz1GX1NJR04uICovCiAgICAgICAgICAgICB3aGlsZSAoLS1mbXRjbnQgPj0gMCkgewogICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA9ICpmbXQrKykgewogICAgICAgICAgICAgICAgIGNhc2UgJy0nOiBmbGFncyB8PSBGX0xKVVNUOyBjb250aW51ZTsKQEAgLTY4Myw2ICs3MDcsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUGFyc2Ugd2lkdGguIEV4YW1wbGU6ICIlMTBzIiA9PiB3aWR0aD0xMCAqLwogICAgICAgICAgICAgaWYgKGMgPT0gJyonKSB7CiAgICAgICAgICAgICAgICAgdiA9IGdldG5leHRhcmcoYXJncywgYXJnbGVuLCAmYXJnaWR4KTsKICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQpAQCAtNzE3LDYgKzc0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGgqMTAgKyAoYyAtICcwJyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBQYXJzZSBwcmVjaXNpb24uIEV4YW1wbGU6ICIlLjNmIiA9PiBwcmVjPTMgKi8KICAgICAgICAgICAgIGlmIChjID09ICcuJykgewogICAgICAgICAgICAgICAgIHByZWMgPSAwOwogICAgICAgICAgICAgICAgIGlmICgtLWZtdGNudCA+PSAwKQpAQCAtNzcxLDEzICs3OTksMTkgQEAKICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm10Y250IDwgMCkgeworICAgICAgICAgICAgICAgIC8qIGxhc3Qgd3JpdGVyOiBkaXNhYmxlIHdyaXRlciBvdmVyYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgICAgIHdyaXRlci5vdmVyYWxsb2NhdGUgPSAwOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzaWduID0gMDsKICAgICAgICAgICAgIGZpbGwgPSAnICc7CiAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKICAgICAgICAgICAgIGNhc2UgJyUnOgotICAgICAgICAgICAgICAgIHBidWYgPSAiJSI7Ci0gICAgICAgICAgICAgICAgbGVuID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAqcmVzKysgPSAnJSc7CisgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICAgICAgIC8vICVyIGlzIG9ubHkgZm9yIDIvMyBjb2RlOyAzIG9ubHkgY29kZSBzaG91bGQgdXNlICVhCiAgICAgICAgICAgICBjYXNlICdhJzoKQEAgLTc5MCw2ICs4MjQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChwcmVjID49IDAgJiYgbGVuID4gcHJlYykKICAgICAgICAgICAgICAgICAgICAgbGVuID0gcHJlYzsKICAgICAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAgLy8gJXMgaXMgb25seSBmb3IgMi8zIGNvZGU7IDMgb25seSBjb2RlIHNob3VsZCB1c2UgJWIKICAgICAgICAgICAgIGNhc2UgJ2InOgpAQCAtNzk5LDEyICs4MzQsNDkgQEAKICAgICAgICAgICAgICAgICBpZiAocHJlYyA+PSAwICYmIGxlbiA+IHByZWMpCiAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHByZWM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgIGNhc2UgJ28nOgogICAgICAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgICBjYXNlICdYJzoKKyAgICAgICAgICAgICAgICBpZiAoUHlMb25nX0NoZWNrRXhhY3QodikKKyAgICAgICAgICAgICAgICAgICAgJiYgd2lkdGggPT0gLTEgJiYgcHJlYyA9PSAtMQorICAgICAgICAgICAgICAgICAgICAmJiAhKGZsYWdzICYgKEZfU0lHTiB8IEZfQkxBTkspKQorICAgICAgICAgICAgICAgICAgICAmJiBjICE9ICdYJykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZhc3QgcGF0aCAqLworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0ZXJuYXRlID0gZmxhZ3MgJiBGX0FMVDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJhc2U7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDAgJiYgIid0eXBlJyBub3QgaW4gW2RpdW94WF0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnWCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogRmFzdCBwYXRoICovCisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAyOyAvKiBzaXplIHByZWFsbG9jYXRlZCBmb3IgIiVkIiAqLworICAgICAgICAgICAgICAgICAgICByZXMgPSBfUHlMb25nX0Zvcm1hdEJ5dGVzV3JpdGVyKCZ3cml0ZXIsIHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LCBiYXNlLCBhbHRlcm5hdGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICB0ZW1wID0gZm9ybWF0bG9uZyh2LCBmbGFncywgcHJlYywgYyk7CiAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtODE1LDE0ICs4ODcsMjUgQEAKICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGX1pFUk8pCiAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSAnMCc7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgIGNhc2UgJ2UnOgogICAgICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgIGNhc2UgJ0YnOgogICAgICAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgICBjYXNlICdHJzoKLSAgICAgICAgICAgICAgICB0ZW1wID0gZm9ybWF0ZmxvYXQodiwgZmxhZ3MsIHByZWMsIGMpOwotICAgICAgICAgICAgICAgIGlmICh0ZW1wID09IE5VTEwpCisgICAgICAgICAgICAgICAgaWYgKHdpZHRoID09IC0xICYmIHByZWMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgJiYgIShmbGFncyAmIChGX1NJR04gfCBGX0JMQU5LKSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IDI7IC8qIHNpemUgcHJlYWxsb2NhdGVkIGZvciAiJWYiICovCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjLCBOVUxMLCAmd3JpdGVyLCByZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWZvcm1hdGZsb2F0KHYsIGZsYWdzLCBwcmVjLCBjLCAmdGVtcCwgTlVMTCwgcmVzKSkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICBwYnVmID0gUHlCeXRlc19BU19TVFJJTkcodGVtcCk7CiAgICAgICAgICAgICAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRSh0ZW1wKTsKQEAgLTgzMCwyMSArOTEzLDI4IEBACiAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRl9aRVJPKQogICAgICAgICAgICAgICAgICAgICBmaWxsID0gJzAnOwogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgICAgICBwYnVmID0gJm9uZWNoYXI7CiAgICAgICAgICAgICAgICAgbGVuID0gYnl0ZV9jb252ZXJ0ZXIodiwgJm9uZWNoYXIpOwogICAgICAgICAgICAgICAgIGlmICghbGVuKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIGlmICh3aWR0aCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGggKi8KKyAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gb25lY2hhcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJyVjJyAoMHgleCkgIgogICAgICAgICAgICAgICAgICAgImF0IGluZGV4ICV6ZCIsCiAgICAgICAgICAgICAgICAgICBjLCBjLAotICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpKGZtdCAtIDEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQXNTdHJpbmcoZm9ybWF0KSkpOworICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3QpKGZtdCAtIDEgLSBmb3JtYXQpKTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoc2lnbikgewogICAgICAgICAgICAgICAgIGlmICgqcGJ1ZiA9PSAnLScgfHwgKnBidWYgPT0gJysnKSB7CiAgICAgICAgICAgICAgICAgICAgIHNpZ24gPSAqcGJ1ZisrOwpAQCAtODU5LDI5ICs5NDksMzEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh3aWR0aCA8IGxlbikKICAgICAgICAgICAgICAgICB3aWR0aCA9IGxlbjsKLSAgICAgICAgICAgIGlmIChyZXNjbnQgLSAoc2lnbiAhPSAwKSA8IHdpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcmVzbGVuIC09IHJlc2NudDsKLSAgICAgICAgICAgICAgICByZXNjbnQgPSB3aWR0aCArIGZtdGNudCArIDEwMDsKLSAgICAgICAgICAgICAgICByZXNsZW4gKz0gcmVzY250OwotICAgICAgICAgICAgICAgIGlmIChyZXNsZW4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBQeV9YREVDUkVGKHRlbXApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzdWx0LCByZXNsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X1hERUNSRUYodGVtcCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXMgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgICAgICsgcmVzbGVuIC0gcmVzY250OworCisgICAgICAgICAgICBhbGxvYyA9IHdpZHRoOworICAgICAgICAgICAgaWYgKHNpZ24gIT0gMCAmJiBsZW4gPT0gd2lkdGgpCisgICAgICAgICAgICAgICAgYWxsb2MrKzsKKyAgICAgICAgICAgIC8qIDI6IHNpemUgcHJlYWxsb2NhdGVkIGZvciAlcyAqLworICAgICAgICAgICAgaWYgKGFsbG9jID4gMikgeworICAgICAgICAgICAgICAgIHJlcyA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcmVzLCBhbGxvYyAtIDIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKyNpZmRlZiBQeV9ERUJVRworICAgICAgICAgICAgYmVmb3JlID0gcmVzOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIFdyaXRlIHRoZSBzaWduIGlmIG5lZWRlZCAqLwogICAgICAgICAgICAgaWYgKHNpZ24pIHsKICAgICAgICAgICAgICAgICBpZiAoZmlsbCAhPSAnICcpCiAgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9IHNpZ247Ci0gICAgICAgICAgICAgICAgcmVzY250LS07CiAgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gbGVuKQogICAgICAgICAgICAgICAgICAgICB3aWR0aC0tOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBXcml0ZSB0aGUgbnVtZXJpYyBwcmVmaXggZm9yICJ4IiwgIlgiIGFuZCAibyIgZm9ybWF0cworICAgICAgICAgICAgICAgaWYgdGhlIGFsdGVybmF0ZSBmb3JtIGlzIHVzZWQuCisgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgd3JpdGUgIjB4IiBmb3IgdGhlICIlI3giIGZvcm1hdC4gKi8KICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBGX0FMVCkgJiYgKGMgPT0gJ3gnIHx8IGMgPT0gJ1gnKSkgewogICAgICAgICAgICAgICAgIGFzc2VydChwYnVmWzBdID09ICcwJyk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0KHBidWZbMV0gPT0gYyk7CkBAIC04ODksMTggKzk4MSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOwogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSAqcGJ1ZisrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXNjbnQgLT0gMjsKICAgICAgICAgICAgICAgICB3aWR0aCAtPSAyOwogICAgICAgICAgICAgICAgIGlmICh3aWR0aCA8IDApCiAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMDsKICAgICAgICAgICAgICAgICBsZW4gLT0gMjsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogUGFkIGxlZnQgd2l0aCB0aGUgZmlsbCBjaGFyYWN0ZXIgaWYgbmVlZGVkICovCiAgICAgICAgICAgICBpZiAod2lkdGggPiBsZW4gJiYgIShmbGFncyAmIEZfTEpVU1QpKSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAtLXJlc2NudDsKLSAgICAgICAgICAgICAgICAgICAgKnJlcysrID0gZmlsbDsKLSAgICAgICAgICAgICAgICB9IHdoaWxlICgtLXdpZHRoID4gbGVuKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQocmVzLCBmaWxsLCB3aWR0aCAtIGxlbik7CisgICAgICAgICAgICAgICAgcmVzICs9ICh3aWR0aCAtIGxlbik7CisgICAgICAgICAgICAgICAgd2lkdGggPSBsZW47CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIHBhZGRpbmcgd2l0aCBzcGFjZXM6IHdyaXRlIHNpZ24gaWYgbmVlZGVkIGFuZC9vciBudW1lcmljCisgICAgICAgICAgICAgICBwcmVmaXggaWYgdGhlIGFsdGVybmF0ZSBmb3JtIGlzIHVzZWQgKi8KICAgICAgICAgICAgIGlmIChmaWxsID09ICcgJykgewogICAgICAgICAgICAgICAgIGlmIChzaWduKQogICAgICAgICAgICAgICAgICAgICAqcmVzKysgPSBzaWduOwpAQCAtOTEyLDEzICsxMDA3LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICpyZXMrKyA9ICpwYnVmKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb3B5IGJ5dGVzICovCiAgICAgICAgICAgICBQeV9NRU1DUFkocmVzLCBwYnVmLCBsZW4pOwogICAgICAgICAgICAgcmVzICs9IGxlbjsKLSAgICAgICAgICAgIHJlc2NudCAtPSBsZW47Ci0gICAgICAgICAgICB3aGlsZSAoLS13aWR0aCA+PSBsZW4pIHsKLSAgICAgICAgICAgICAgICAtLXJlc2NudDsKLSAgICAgICAgICAgICAgICAqcmVzKysgPSAnICc7CisKKyAgICAgICAgICAgIC8qIFBhZCByaWdodCB3aXRoIHRoZSBmaWxsIGNoYXJhY3RlciBpZiBuZWVkZWQgKi8KKyAgICAgICAgICAgIGlmICh3aWR0aCA+IGxlbikgeworICAgICAgICAgICAgICAgIG1lbXNldChyZXMsICcgJywgd2lkdGggLSBsZW4pOworICAgICAgICAgICAgICAgIHJlcyArPSAod2lkdGggLSBsZW4pOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoZGljdCAmJiAoYXJnaWR4IDwgYXJnbGVuKSAmJiBjICE9ICclJykgewogICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBieXRlcyBmb3JtYXR0aW5nIik7CkBAIC05MjYsMjIgKzEwMjUsMzEgQEAKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgUHlfWERFQ1JFRih0ZW1wKTsKKworI2lmZGVmIFB5X0RFQlVHCisgICAgICAgICAgICAvKiBjaGVjayB0aGF0IHdlIGNvbXB1dGVkIHRoZSBleGFjdCBzaXplIGZvciB0aGlzIHdyaXRlICovCisgICAgICAgICAgICBhc3NlcnQoKHJlcyAtIGJlZm9yZSkgPT0gYWxsb2MpOworI2VuZGlmCiAgICAgICAgIH0gLyogJyUnICovCisKKyAgICAgICAgLyogSWYgb3ZlcmFsbG9jYXRpb24gd2FzIGRpc2FibGVkLCBlbnN1cmUgdGhhdCBpdCB3YXMgdGhlIGxhc3QKKyAgICAgICAgICAgd3JpdGUuIE90aGVyd2lzZSwgd2UgbWlzc2VkIGFuIG9wdGltaXphdGlvbiAqLworICAgICAgICBhc3NlcnQod3JpdGVyLm92ZXJhbGxvY2F0ZSB8fCBmbXRjbnQgPCAwIHx8IHVzZV9ieXRlYXJyYXkpOwogICAgIH0gLyogdW50aWwgZW5kICovCisKICAgICBpZiAoYXJnaWR4IDwgYXJnbGVuICYmICFkaWN0KSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBieXRlcyBmb3JtYXR0aW5nIik7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQorCiAgICAgaWYgKGFyZ3Nfb3duZWQpIHsKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIH0KLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXN1bHQsIHJlc2xlbiAtIHJlc2NudCkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCByZXMpOwogCiAgZXJyb3I6Ci0gICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICBpZiAoYXJnc19vd25lZCkgewogICAgICAgICBQeV9ERUNSRUYoYXJncyk7CiAgICAgfQpAQCAtOTYxLDYgKzEwNjksNDIgQEAKICAgIHRoZSBzdHJpbmcgaXMgVVRGLTggZW5jb2RlZCBhbmQgc2hvdWxkIGJlIHJlLWVuY29kZWQgaW4gdGhlCiAgICBzcGVjaWZpZWQgZW5jb2RpbmcuICAqLwogCitzdGF0aWMgY2hhciAqCitfUHlCeXRlc19EZWNvZGVFc2NhcGVSZWNvZGUoY29uc3QgY2hhciAqKnMsIGNvbnN0IGNoYXIgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsIGNvbnN0IGNoYXIgKnJlY29kZV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpwKQoreworICAgIFB5T2JqZWN0ICp1LCAqdzsKKyAgICBjb25zdCBjaGFyKiB0OworCisgICAgdCA9ICpzOworICAgIC8qIERlY29kZSBub24tQVNDSUkgYnl0ZXMgYXMgVVRGLTguICovCisgICAgd2hpbGUgKHQgPCBlbmQgJiYgKCp0ICYgMHg4MCkpCisgICAgICAgIHQrKzsKKyAgICB1ID0gUHlVbmljb2RlX0RlY29kZVVURjgoKnMsIHQgLSAqcywgZXJyb3JzKTsKKyAgICBpZiAodSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFJlY29kZSB0aGVtIGluIHRhcmdldCBlbmNvZGluZy4gKi8KKyAgICB3ID0gUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyh1LCByZWNvZGVfZW5jb2RpbmcsIGVycm9ycyk7CisgICAgUHlfREVDUkVGKHUpOworICAgIGlmICAodyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBhc3NlcnQoUHlCeXRlc19DaGVjayh3KSk7CisKKyAgICAvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KKyAgICB3cml0ZXItPm1pbl9zaXplLS07ICAgLyogc3Vic3RyYWN0IDEgcHJlYWxsb2NhdGVkIGJ5dGUgKi8KKyAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcyh3cml0ZXIsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19BU19TVFJJTkcodyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19HRVRfU0laRSh3KSk7CisgICAgUHlfREVDUkVGKHcpOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKnMgPSB0OworICAgIHJldHVybiBwOworfQorCiBQeU9iamVjdCAqUHlCeXRlc19EZWNvZGVFc2NhcGUoY29uc3QgY2hhciAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKQEAgLTk2OCw1NCArMTExMiw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyZWNvZGVfZW5jb2RpbmcpCiB7CiAgICAgaW50IGM7Ci0gICAgY2hhciAqcCwgKmJ1ZjsKKyAgICBjaGFyICpwOwogICAgIGNvbnN0IGNoYXIgKmVuZDsKLSAgICBQeU9iamVjdCAqdjsKLSAgICBQeV9zc2l6ZV90IG5ld2xlbiA9IHJlY29kZV9lbmNvZGluZyA/IDQqbGVuOmxlbjsKLSAgICB2ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIG5ld2xlbik7Ci0gICAgaWYgKHYgPT0gTlVMTCkKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworCisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcCA9IGJ1ZiA9IFB5Qnl0ZXNfQXNTdHJpbmcodik7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CisKICAgICBlbmQgPSBzICsgbGVuOwogICAgIHdoaWxlIChzIDwgZW5kKSB7CiAgICAgICAgIGlmICgqcyAhPSAnXFwnKSB7CiAgICAgICAgICAgbm9uX2VzYzoKLSAgICAgICAgICAgIGlmIChyZWNvZGVfZW5jb2RpbmcgJiYgKCpzICYgMHg4MCkpIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdSwgKnc7Ci0gICAgICAgICAgICAgICAgY2hhciAqcjsKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0OwotICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgcm47Ci0gICAgICAgICAgICAgICAgdCA9IHM7Ci0gICAgICAgICAgICAgICAgLyogRGVjb2RlIG5vbi1BU0NJSSBieXRlcyBhcyBVVEYtOC4gKi8KLSAgICAgICAgICAgICAgICB3aGlsZSAodCA8IGVuZCAmJiAoKnQgJiAweDgwKSkgdCsrOwotICAgICAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOChzLCB0IC0gcywgZXJyb3JzKTsKLSAgICAgICAgICAgICAgICBpZighdSkgZ290byBmYWlsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBSZWNvZGUgdGhlbSBpbiB0YXJnZXQgZW5jb2RpbmcuICovCi0gICAgICAgICAgICAgICAgdyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHUsIHJlY29kZV9lbmNvZGluZywgZXJyb3JzKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF3KSAgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKiBBcHBlbmQgYnl0ZXMgdG8gb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayh3KSk7Ci0gICAgICAgICAgICAgICAgciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHcpOwotICAgICAgICAgICAgICAgIHJuID0gUHlCeXRlc19HRVRfU0laRSh3KTsKLSAgICAgICAgICAgICAgICBQeV9NRU1DUFkocCwgciwgcm4pOwotICAgICAgICAgICAgICAgIHAgKz0gcm47Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHcpOwotICAgICAgICAgICAgICAgIHMgPSB0OwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKHJlY29kZV9lbmNvZGluZyAmJiAoKnMgJiAweDgwKSkpIHsKICAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIG5vbi1BU0NJSSBjaGFyYWN0ZXIgYW5kIG5lZWQgdG8gcmVjb2RlICovCisgICAgICAgICAgICAgICAgcCA9IF9QeUJ5dGVzX0RlY29kZUVzY2FwZVJlY29kZSgmcywgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCByZWNvZGVfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVyLCBwKTsKKyAgICAgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisKICAgICAgICAgcysrOwotICAgICAgICBpZiAocz09ZW5kKSB7CisgICAgICAgIGlmIChzID09IGVuZCkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWlsaW5nIFxcIGluIHN0cmluZyIpOwogICAgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIH0KKwogICAgICAgICBzd2l0Y2ggKCpzKyspIHsKICAgICAgICAgLyogWFhYIFRoaXMgYXNzdW1lcyBBU0NJSSEgKi8KICAgICAgICAgY2FzZSAnXG4nOiBicmVhazsKQEAgLTEwNDAsMjggKzExNzIsMTggQEAKICAgICAgICAgICAgICpwKysgPSBjOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJ3gnOgotICAgICAgICAgICAgaWYgKHMrMSA8IGVuZCAmJiBQeV9JU1hESUdJVChzWzBdKSAmJiBQeV9JU1hESUdJVChzWzFdKSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB4ID0gMDsKLSAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgICAgICAgICAgICAgeCA9IGMgLSAnMCc7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUHlfSVNMT1dFUihjKSkKLSAgICAgICAgICAgICAgICAgICAgeCA9IDEwICsgYyAtICdhJzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHggPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgICAgICAgICAgeCA9IHggPDwgNDsKLSAgICAgICAgICAgICAgICBjID0gUHlfQ0hBUk1BU0soKnMpOwotICAgICAgICAgICAgICAgIHMrKzsKLSAgICAgICAgICAgICAgICBpZiAoUHlfSVNESUdJVChjKSkKLSAgICAgICAgICAgICAgICAgICAgeCArPSBjIC0gJzAnOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKFB5X0lTTE9XRVIoYykpCi0gICAgICAgICAgICAgICAgICAgIHggKz0gMTAgKyBjIC0gJ2EnOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgeCArPSAxMCArIGMgLSAnQSc7Ci0gICAgICAgICAgICAgICAgKnArKyA9IHg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocysxIDwgZW5kKSB7CisgICAgICAgICAgICAgICAgaW50IGRpZ2l0MSwgZGlnaXQyOworICAgICAgICAgICAgICAgIGRpZ2l0MSA9IF9QeUxvbmdfRGlnaXRWYWx1ZVtQeV9DSEFSTUFTSyhzWzBdKV07CisgICAgICAgICAgICAgICAgZGlnaXQyID0gX1B5TG9uZ19EaWdpdFZhbHVlW1B5X0NIQVJNQVNLKHNbMV0pXTsKKyAgICAgICAgICAgICAgICBpZiAoZGlnaXQxIDwgMTYgJiYgZGlnaXQyIDwgMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgKnArKyA9ICh1bnNpZ25lZCBjaGFyKSgoZGlnaXQxIDw8IDQpICsgZGlnaXQyKTsKKyAgICAgICAgICAgICAgICAgICAgcyArPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBpbnZhbGlkIGhleGFkZWNpbWFsIGRpZ2l0cyAqLworCiAgICAgICAgICAgICBpZiAoIWVycm9ycyB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkgewogICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBcXHggZXNjYXBlIGF0IHBvc2l0aW9uICVkIiwKQEAgLTEwODMsNiArMTIwNSw3IEBACiAgICAgICAgICAgICBpZiAocyA8IGVuZCAmJiBQeV9JU1hESUdJVChzWzBdKSkKICAgICAgICAgICAgICAgICBzKys7IC8qIGFuZCBhIGhleGRpZ2l0ICovCiAgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICBzLS07CkBAIC0xMDkwLDExICsxMjEzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURi04IGJ5dGVzIG1heSBmb2xsb3cuICovCiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHAtYnVmIDwgbmV3bGVuKQotICAgICAgICBfUHlCeXRlc19SZXNpemUoJnYsIHAgLSBidWYpOwotICAgIHJldHVybiB2OworCisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBwKTsKKwogICBmYWlsZWQ6Ci0gICAgUHlfREVDUkVGKHYpOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTEzNjMsMjQgKzE0ODYsNyBAQAogc3RhdGljIGludAogYnl0ZXNfY29udGFpbnMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmcpCiB7Ci0gICAgUHlfc3NpemVfdCBpdmFsID0gUHlOdW1iZXJfQXNTc2l6ZV90KGFyZywgUHlFeGNfVmFsdWVFcnJvcik7Ci0gICAgaWYgKGl2YWwgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICBQeV9idWZmZXIgdmFyZzsKLSAgICAgICAgUHlfc3NpemVfdCBwb3M7Ci0gICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYXJnLCAmdmFyZywgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBwb3MgPSBzdHJpbmdsaWJfZmluZChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlfU0laRShzZWxmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyZy5idWYsIHZhcmcubGVuLCAwKTsKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdmFyZyk7Ci0gICAgICAgIHJldHVybiBwb3MgPj0gMDsKLSAgICB9Ci0gICAgaWYgKGl2YWwgPCAwIHx8IGl2YWwgPj0gMjU2KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiYnl0ZSBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldHVybiBtZW1jaHIoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIChpbnQpIGl2YWwsIFB5X1NJWkUoc2VsZikpICE9IE5VTEw7CisgICAgcmV0dXJuIF9QeV9ieXRlc19jb250YWlucyhQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJnKTsKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTE2MjcsOCArMTczMyw4IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19zcGxpdF9pbXBsKFB5Qnl0ZXNPYmplY3Qqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD04YmRlNDRkYWNiMzZlZjJlIGlucHV0PThiODA5YjM5MDc0YWJiZmFdKi8KK2J5dGVzX3NwbGl0X2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnNlcCwgUHlfc3NpemVfdCBtYXhzcGxpdCkKKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01MjEyNmI1ODQ0YzFkOGVmIGlucHV0PThiODA5YjM5MDc0YWJiZmFdKi8KIHsKICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIG47CiAgICAgY29uc3QgY2hhciAqcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCAqc3ViOwpAQCAtMTY1Miw3ICsxNzU4LDYgQEAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnBhcnRpdGlvbgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVzT2JqZWN0ICoiKQogICAgIHNlcDogUHlfYnVmZmVyCiAgICAgLwogCkBAIC0xNjY4LDcgKzE3NzMsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfcGFydGl0aW9uX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpzZXApCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjUzMmIzOTJhMTdmZjY5NSBpbnB1dD1iYzg1NWRjNjNjYTk0OWRlXSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZjUzMmIzOTJhMTdmZjY5NSBpbnB1dD02MWNjYTk1NTE5NDA2MDk5XSovCiB7CiAgICAgcmV0dXJuIHN0cmluZ2xpYl9wYXJ0aXRpb24oCiAgICAgICAgIChQeU9iamVjdCopIHNlbGYsCkBAIC0xNjgwLDcgKzE3ODUsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMucnBhcnRpdGlvbgogCi0gICAgc2VsZjogc2VsZih0eXBlPSJQeUJ5dGVzT2JqZWN0ICoiKQogICAgIHNlcDogUHlfYnVmZmVyCiAgICAgLwogCkBAIC0xNjk2LDcgKzE4MDAsNyBAQAogCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfcnBhcnRpdGlvbl9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5X2J1ZmZlciAqc2VwKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE5MWIxMTRjYmIwMjhlNTAgaW5wdXQ9NjU4OGZmZjI2MmE5MTcwZV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTE5MWIxMTRjYmIwMjhlNTAgaW5wdXQ9NjdmNjg5ZTYzYTYyZDQ3OF0qLwogewogICAgIHJldHVybiBzdHJpbmdsaWJfcnBhcnRpdGlvbigKICAgICAgICAgKFB5T2JqZWN0Kikgc2VsZiwKQEAgLTE3MTQsOCArMTgxOCw4IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19yc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9MGI2NTcwYjk3NzkxMWQ4OCBpbnB1dD0wZjg2YzlmMjhmN2Q3YjdiXSovCitieXRlc19yc3BsaXRfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWJhNjk4ZDllYTAxZTFjOGYgaW5wdXQ9MGY4NmM5ZjI4ZjdkN2I3Yl0qLwogewogICAgIFB5X3NzaXplX3QgbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKSwgbjsKICAgICBjb25zdCBjaGFyICpzID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZiksICpzdWI7CkBAIC0xNzUzLDggKzE4NTcsOCBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfam9pbihQeUJ5dGVzT2JqZWN0KnNlbGYsIFB5T2JqZWN0ICppdGVyYWJsZV9vZl9ieXRlcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD02MzRhZmYxNDc2NGZmOTk3IGlucHV0PTdmZTM3N2I5NWJkNTQ5ZDJdKi8KK2J5dGVzX2pvaW4oUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKml0ZXJhYmxlX29mX2J5dGVzKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWEwNDZmMzc5ZjYyNmY2ZjggaW5wdXQ9N2ZlMzc3Yjk1YmQ1NDlkMl0qLwogewogICAgIHJldHVybiBzdHJpbmdsaWJfYnl0ZXNfam9pbigoUHlPYmplY3QqKXNlbGYsIGl0ZXJhYmxlX29mX2J5dGVzKTsKIH0KQEAgLTE3NjcsMTU4ICsxODcxLDMwIEBACiAgICAgcmV0dXJuIGJ5dGVzX2pvaW4oKFB5Qnl0ZXNPYmplY3QqKXNlcCwgeCk7CiB9CiAKLS8qIGhlbHBlciBtYWNybyB0byBmaXh1cCBzdGFydC9lbmQgc2xpY2UgdmFsdWVzICovCi0jZGVmaW5lIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbikgICAgICAgICBcCi0gICAgaWYgKGVuZCA+IGxlbikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZW5kID0gbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKGVuZCA8IDApIHsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGVuZCArPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGVuZCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBlbmQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChzdGFydCA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0YXJ0ICs9IGxlbjsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHN0YXJ0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGFydCA9IDA7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLVB5X0xPQ0FMX0lOTElORShQeV9zc2l6ZV90KQotYnl0ZXNfZmluZF9pbnRlcm5hbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgaW50IGRpcikKLXsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9idWZmZXIgc3ViYnVmOwotICAgIGNvbnN0IGNoYXIgKnN1YjsKLSAgICBQeV9zc2l6ZV90IGxlbiwgc3ViX2xlbjsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0PTAsIGVuZD1QWV9TU0laRV9UX01BWDsKLSAgICBQeV9zc2l6ZV90IHJlczsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHNfYnl0ZSgiZmluZC9yZmluZC9pbmRleC9yaW5kZXgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLCAmc3Vib2JqLCAmYnl0ZSwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgaWYgKHN1Ym9iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Ym9iaiwgJnN1YmJ1ZiwgUHlCVUZfU0lNUExFKSAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIC0yOwotCi0gICAgICAgIHN1YiA9IHN1YmJ1Zi5idWY7Ci0gICAgICAgIHN1Yl9sZW4gPSBzdWJidWYubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLSAgICBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuKTsKLSAgICBpZiAoZW5kIC0gc3RhcnQgPCBzdWJfbGVuKQotICAgICAgICByZXMgPSAtMTsKLSAgICBlbHNlIGlmIChzdWJfbGVuID09IDEKLSNpZm5kZWYgSEFWRV9NRU1SQ0hSCi0gICAgICAgICAgICAmJiBkaXIgPiAwCi0jZW5kaWYKLSAgICApIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBuZWVkbGUgPSAqc3ViOwotICAgICAgICBpbnQgbW9kZSA9IChkaXIgPiAwKSA/IEZBU1RfU0VBUkNIIDogRkFTVF9SU0VBUkNIOwotICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmFzdHNlYXJjaF9tZW1jaHJfMWNoYXIoCi0gICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKLSAgICAgICAgICAgIG5lZWRsZSwgbmVlZGxlLCBtb2RlKTsKLSAgICAgICAgaWYgKHJlcyA+PSAwKQotICAgICAgICAgICAgcmVzICs9IHN0YXJ0OwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKGRpciA+IDApCi0gICAgICAgICAgICByZXMgPSBzdHJpbmdsaWJfZmluZF9zbGljZSgKLSAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgbGVuLAotICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJlcyA9IHN0cmluZ2xpYl9yZmluZF9zbGljZSgKLSAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgbGVuLAotICAgICAgICAgICAgICAgIHN1Yiwgc3ViX2xlbiwgc3RhcnQsIGVuZCk7Ci0gICAgfQotCi0gICAgaWYgKHN1Ym9iaikKLSAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmc3ViYnVmKTsKLQotICAgIHJldHVybiByZXM7Ci19Ci0KLQotUHlEb2NfU1RSVkFSKGZpbmRfX2RvY19fLAotIkIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gQiB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLFxuXAotc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIEJbc3RhcnQ6ZW5kXS4gIE9wdGlvbmFsXG5cCi1hcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cCi1cblwKLVJldHVybiAtMSBvbiBmYWlsdXJlLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfZmluZChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGJ5dGVzX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2ZpbmQoUHlCeXRlc19BU19TVFJJTkcoc2VsZiksIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZiksIGFyZ3MpOwogfQogCi0KLVB5RG9jX1NUUlZBUihpbmRleF9fZG9jX18sCi0iQi5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotTGlrZSBCLmZpbmQoKSBidXQgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfaW5kZXgoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCByZXN1bHQgPSBieXRlc19maW5kX2ludGVybmFsKHNlbGYsIGFyZ3MsICsxKTsKLSAgICBpZiAocmVzdWx0ID09IC0yKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInN1YnN0cmluZyBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2luZGV4KFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCi1QeURvY19TVFJWQVIocmZpbmRfX2RvY19fLAotIkIucmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSkgLT4gaW50XG5cCi1cblwKLVJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBCIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsXG5cCi1zdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gQltzdGFydDplbmRdLiAgT3B0aW9uYWxcblwKLWFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblwKLVxuXAotUmV0dXJuIC0xIG9uIGZhaWx1cmUuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19yZmluZChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGJ5dGVzX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBQeUxvbmdfRnJvbVNzaXplX3QocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX3JmaW5kKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCi1QeURvY19TVFJWQVIocmluZGV4X19kb2NfXywKLSJCLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotTGlrZSBCLnJmaW5kKCkgYnV0IHJhaXNlIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdCBmb3VuZC4iKTsKLQogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3JpbmRleChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHJlc3VsdCA9IGJ5dGVzX2ZpbmRfaW50ZXJuYWwoc2VsZiwgYXJncywgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTIpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAic3Vic3RyaW5nIG5vdCBmb3VuZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIFB5TG9uZ19Gcm9tU3NpemVfdChyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfcmluZGV4KFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCkBAIC0yMDA1LDcgKzE5ODEsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMuc3RyaXAKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICBieXRlczogb2JqZWN0ID0gTm9uZQogICAgIC8KIApAQCAtMjAxNiw3ICsxOTkxLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3N0cmlwX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmJ5dGVzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM3YzIyOGQzYmQxMDRhMWIgaW5wdXQ9MzdkYWE1ZmFkMTM5NWQ5NV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWM3YzIyOGQzYmQxMDRhMWIgaW5wdXQ9OGEzNTQ2NDBlNGUwYjNlZl0qLwogewogICAgIHJldHVybiBkb19hcmdzdHJpcChzZWxmLCBCT1RIU1RSSVAsIGJ5dGVzKTsKIH0KQEAgLTIwMjQsNyArMTk5OSw2IEBACiAvKltjbGluaWMgaW5wdXRdCiBieXRlcy5sc3RyaXAKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICBieXRlczogb2JqZWN0ID0gTm9uZQogICAgIC8KIApAQCAtMjAzNSw3ICsyMDA5LDcgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX2xzdHJpcF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpieXRlcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yODYwMmU1ODZmNTI0ZTgyIGlucHV0PTg4ODExYjA5ZGZiYzI5ODhdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0yODYwMmU1ODZmNTI0ZTgyIGlucHV0PTliYWZmNDM5OGMzZjY4NTddKi8KIHsKICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgTEVGVFNUUklQLCBieXRlcyk7CiB9CkBAIC0yMDQzLDcgKzIwMTcsNiBAQAogLypbY2xpbmljIGlucHV0XQogYnl0ZXMucnN0cmlwCiAKLSAgICBzZWxmOiBzZWxmKHR5cGU9IlB5Qnl0ZXNPYmplY3QgKiIpCiAgICAgYnl0ZXM6IG9iamVjdCA9IE5vbmUKICAgICAvCiAKQEAgLTIwNTQsNjQgKzIwMjcsMjIgQEAKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3JzdHJpcF9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpieXRlcykKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01NDdlMzgxNWM5NTQ0N2RhIGlucHV0PThmOTNjOWNkMzYxZjAxNDBdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD01NDdlMzgxNWM5NTQ0N2RhIGlucHV0PWI3OGFmNDQ1YzcyN2UzMmJdKi8KIHsKICAgICByZXR1cm4gZG9fYXJnc3RyaXAoc2VsZiwgUklHSFRTVFJJUCwgYnl0ZXMpOwogfQogCiAKLVB5RG9jX1NUUlZBUihjb3VudF9fZG9jX18sCi0iQi5jb3VudChzdWJbLCBzdGFydFssIGVuZF1dKSAtPiBpbnRcblwKLVxuXAotUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBzdWIgaW5cblwKLXN0cmluZyBCW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWRcblwKLWFzIGluIHNsaWNlIG5vdGF0aW9uLiIpOwotCiBzdGF0aWMgUHlPYmplY3QgKgogYnl0ZXNfY291bnQoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlPYmplY3QgKnN1Yl9vYmo7Ci0gICAgY29uc3QgY2hhciAqc3RyID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZiksICpzdWI7Ci0gICAgUHlfc3NpemVfdCBzdWJfbGVuOwotICAgIGNoYXIgYnl0ZTsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMCwgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0KLSAgICBQeV9idWZmZXIgdnN1YjsKLSAgICBQeU9iamVjdCAqY291bnRfb2JqOwotCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc19ieXRlKCJjb3VudCIsIGFyZ3MsICZzdWJfb2JqLCAmYnl0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoc3ViX29iaikgewotICAgICAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHN1Yl9vYmosICZ2c3ViLCBQeUJVRl9TSU1QTEUpICE9IDApCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICBzdWIgPSB2c3ViLmJ1ZjsKLSAgICAgICAgc3ViX2xlbiA9IHZzdWIubGVuOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3ViID0gJmJ5dGU7Ci0gICAgICAgIHN1Yl9sZW4gPSAxOwotICAgIH0KLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZikpOwotCi0gICAgY291bnRfb2JqID0gUHlMb25nX0Zyb21Tc2l6ZV90KAotICAgICAgICBzdHJpbmdsaWJfY291bnQoc3RyICsgc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdWIsIHN1Yl9sZW4sIFBZX1NTSVpFX1RfTUFYKQotICAgICAgICApOwotCi0gICAgaWYgKHN1Yl9vYmopCi0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZzdWIpOwotCi0gICAgcmV0dXJuIGNvdW50X29iajsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2NvdW50KFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCiAvKltjbGluaWMgaW5wdXRdCiBieXRlcy50cmFuc2xhdGUKIAotICAgIHNlbGY6IHNlbGYodHlwZT0iUHlCeXRlc09iamVjdCAqIikKICAgICB0YWJsZTogb2JqZWN0CiAgICAgICAgIFRyYW5zbGF0aW9uIHRhYmxlLCB3aGljaCBtdXN0IGJlIGEgYnl0ZXMgb2JqZWN0IG9mIGxlbmd0aCAyNTYuCiAgICAgWwpAQCAtMjEyOCw3ICsyMDU5LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc190cmFuc2xhdGVfaW1wbChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqdGFibGUsIGludCBncm91cF9yaWdodF8xLAogICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlbGV0ZWNoYXJzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTIzM2RmODUwZWI1MGJmOGQgaW5wdXQ9ZDhmYTU1MTlkN2NjNGJlN10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTIzM2RmODUwZWI1MGJmOGQgaW5wdXQ9Y2EyMGVkZjM5ZDc4MGQ0OV0qLwogewogICAgIGNoYXIgKmlucHV0LCAqb3V0cHV0OwogICAgIFB5X2J1ZmZlciB0YWJsZV92aWV3ID0ge05VTEwsIE5VTEx9OwpAQCAtMjE4OSw3ICsyMTIwLDcgQEAKICAgICAgICAgUHlCdWZmZXJfUmVsZWFzZSgmdGFibGVfdmlldyk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBvdXRwdXRfc3RhcnQgPSBvdXRwdXQgPSBQeUJ5dGVzX0FzU3RyaW5nKHJlc3VsdCk7CisgICAgb3V0cHV0X3N0YXJ0ID0gb3V0cHV0ID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKICAgICBpbnB1dCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGlucHV0X29iaik7CiAKICAgICBpZiAoZGVsbGVuID09IDAgJiYgdGFibGVfY2hhcnMgIT0gTlVMTCkgewpAQCAtMjI2NSw0OTggKzIxOTYsNiBAQAogICAgIHJldHVybiBfUHlfYnl0ZXNfbWFrZXRyYW5zKGZybSwgdG8pOwogfQogCi0vKiBmaW5kIGFuZCBjb3VudCBjaGFyYWN0ZXJzIGFuZCBzdWJzdHJpbmdzICovCi0KLSNkZWZpbmUgZmluZGNoYXIodGFyZ2V0LCB0YXJnZXRfbGVuLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICgoY2hhciAqKW1lbWNocigoY29uc3Qgdm9pZCAqKSh0YXJnZXQpLCBjLCB0YXJnZXRfbGVuKSkKLQotLyogU3RyaW5nIG9wcyBtdXN0IHJldHVybiBhIHN0cmluZy4gICovCi0vKiBJZiB0aGUgb2JqZWN0IGlzIHN1YmNsYXNzIG9mIHN0cmluZywgY3JlYXRlIGEgY29weSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmV0dXJuX3NlbGYoUHlCeXRlc09iamVjdCAqc2VsZikKLXsKLSAgICBpZiAoUHlCeXRlc19DaGVja0V4YWN0KHNlbGYpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIHNlbGY7Ci0gICAgfQotICAgIHJldHVybiAoUHlCeXRlc09iamVjdCAqKVB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoCi0gICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLAotICAgICAgICBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpKTsKLX0KLQotUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCi1jb3VudGNoYXIoY29uc3QgY2hhciAqdGFyZ2V0LCBQeV9zc2l6ZV90IHRhcmdldF9sZW4sIGNoYXIgYywgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBQeV9zc2l6ZV90IGNvdW50PTA7Ci0gICAgY29uc3QgY2hhciAqc3RhcnQ9dGFyZ2V0OwotICAgIGNvbnN0IGNoYXIgKmVuZD10YXJnZXQrdGFyZ2V0X2xlbjsKLQotICAgIHdoaWxlICggKHN0YXJ0PWZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGMpKSAhPSBOVUxMICkgewotICAgICAgICBjb3VudCsrOwotICAgICAgICBpZiAoY291bnQgPj0gbWF4Y291bnQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RhcnQgKz0gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0KLS8qIEFsZ29yaXRobXMgZm9yIGRpZmZlcmVudCBjYXNlcyBvZiBzdHJpbmcgcmVwbGFjZW1lbnQgKi8KLQotLyogbGVuKHNlbGYpPj0xLCBmcm9tPSIiLCBsZW4odG8pPj0xLCBtYXhjb3VudD49MSAqLwotUHlfTE9DQUwoUHlCeXRlc09iamVjdCAqKQotcmVwbGFjZV9pbnRlcmxlYXZlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBjaGFyICpzZWxmX3MsICpyZXN1bHRfczsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIGk7Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgLyogMSBhdCB0aGUgZW5kIHBsdXMgMSBhZnRlciBldmVyeSBjaGFyYWN0ZXI7Ci0gICAgICAgY291bnQgPSBtaW4obWF4Y291bnQsIHNlbGZfbGVuICsgMSkgKi8KLSAgICBpZiAobWF4Y291bnQgPD0gc2VsZl9sZW4pCi0gICAgICAgIGNvdW50ID0gbWF4Y291bnQ7Ci0gICAgZWxzZQotICAgICAgICAvKiBDYW4ndCBvdmVyZmxvdzogc2VsZl9sZW4gKyAxIDw9IG1heGNvdW50IDw9IFBZX1NTSVpFX1RfTUFYLiAqLwotICAgICAgICBjb3VudCA9IHNlbGZfbGVuICsgMTsKLQotICAgIC8qIENoZWNrIGZvciBvdmVyZmxvdyAqLwotICAgIC8qICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47ICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiA+IChQWV9TU0laRV9UX01BWCAtIHNlbGZfbGVuKSAvIGNvdW50KSB7Ci0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGxhY2VtZW50IGJ5dGVzIGFyZSB0b28gbG9uZyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmVzdWx0X2xlbiA9IGNvdW50ICogdG9fbGVuICsgc2VsZl9sZW47Ci0KLSAgICBpZiAoISAocmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikKLSAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpICkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICAvKiBUT0RPOiBzcGVjaWFsIGNhc2Ugc2luZ2xlIGNoYXJhY3Rlciwgd2hpY2ggZG9lc24ndCBuZWVkIG1lbWNweSAqLwotCi0gICAgLyogTGF5IHRoZSBmaXJzdCBvbmUgZG93biAoZ3VhcmFudGVlZCB0aGlzIHdpbGwgb2NjdXIpICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgIHJlc3VsdF9zICs9IHRvX2xlbjsKLSAgICBjb3VudCAtPSAxOwotCi0gICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykgewotICAgICAgICAqcmVzdWx0X3MrKyA9ICpzZWxmX3MrKzsKLSAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgfQotCi0gICAgLyogQ29weSB0aGUgcmVzdCBvZiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0gICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuLWkpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogU3BlY2lhbCBjYXNlIGZvciBkZWxldGluZyBhIHNpbmdsZSBjaGFyYWN0ZXIgKi8KLS8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT0xLCB0bz0iIiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2VfZGVsZXRlX3NpbmdsZV9jaGFyYWN0ZXIoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmcm9tX2MsIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudDsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBjb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gY291bnQ7ICAvKiBmcm9tX2xlbiA9PSAxICovCi0gICAgYXNzZXJ0KHJlc3VsdF9sZW4+PTApOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikKLSAgICAgICAgICAgICAgICAgICAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgIHN0YXJ0ID0gbmV4dCsxOwotICAgIH0KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIHRvPSIiLCBtYXhjb3VudD49MSAqLwotCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtYXhjb3VudCkgewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0KLSAgICBjb3VudCA9IHN0cmluZ2xpYl9jb3VudChzZWxmX3MsIHNlbGZfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fcywgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Y291bnQpOwotCi0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuIC0gKGNvdW50ICogZnJvbV9sZW4pOwotICAgIGFzc2VydCAocmVzdWx0X2xlbj49MCk7Ci0KLSAgICBpZiAoIChyZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKQotICAgICAgICAgIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwgKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLQotICAgIHN0YXJ0ID0gc2VsZl9zOwotICAgIGVuZCA9IHNlbGZfcyArIHNlbGZfbGVuOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBuZXh0ID0gc3RhcnQgKyBvZmZzZXQ7Ci0KLSAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0KLSAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICBzdGFydCA9IG5leHQrZnJvbV9sZW47Ci0gICAgfQotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PWxlbih0byk9PTEsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywgY2hhciB0b19jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3MsICpzdGFydCwgKmVuZCwgKm5leHQ7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbjsKLSAgICBQeUJ5dGVzT2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICAvKiBUaGUgcmVzdWx0IHN0cmluZyB3aWxsIGJlIHRoZSBzYW1lIHNpemUgKi8KLSAgICBzZWxmX3MgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLSAgICBzZWxmX2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZik7Ci0KLSAgICBuZXh0ID0gZmluZGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jKTsKLQotICAgIGlmIChuZXh0ID09IE5VTEwpIHsKLSAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBzdHJpbmcgKi8KLSAgICByZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOwotCi0gICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KLSAgICBzdGFydCA9ICByZXN1bHRfcyArIChuZXh0LXNlbGZfcyk7Ci0gICAgKnN0YXJ0ID0gdG9fYzsKLSAgICBzdGFydCsrOwotICAgIGVuZCA9IHJlc3VsdF9zICsgc2VsZl9sZW47Ci0KLSAgICB3aGlsZSAoLS1tYXhjb3VudCA+IDApIHsKLSAgICAgICAgbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7Ci0gICAgICAgIGlmIChuZXh0ID09IE5VTEwpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgKm5leHQgPSB0b19jOwotICAgICAgICBzdGFydCA9IG5leHQrMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vKiBsZW4oc2VsZik+PTEsIGxlbihmcm9tKT09bGVuKHRvKT49MiwgbWF4Y291bnQ+PTEgKi8KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKFB5Qnl0ZXNPYmplY3QgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWF4Y291bnQpCi17Ci0gICAgY2hhciAqcmVzdWx0X3MsICpzdGFydCwgKmVuZDsKLSAgICBjaGFyICpzZWxmX3M7Ci0gICAgUHlfc3NpemVfdCBzZWxmX2xlbiwgb2Zmc2V0OwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIC8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwotCi0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc2VsZl9zLCBzZWxmX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKLSAgICAgICAgLyogTm8gbWF0Y2hlczsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIC8qIE5lZWQgdG8gbWFrZSBhIG5ldyBzdHJpbmcgKi8KLSAgICByZXN1bHQgPSAoUHlCeXRlc09iamVjdCAqKSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJlc3VsdF9zID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOwotCi0gICAgLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KLSAgICBzdGFydCA9ICByZXN1bHRfcyArIG9mZnNldDsKLSAgICBQeV9NRU1DUFkoc3RhcnQsIHRvX3MsIGZyb21fbGVuKTsKLSAgICBzdGFydCArPSBmcm9tX2xlbjsKLSAgICBlbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwotCi0gICAgd2hpbGUgKCAtLW1heGNvdW50ID4gMCkgewotICAgICAgICBvZmZzZXQgPSBzdHJpbmdsaWJfZmluZChzdGFydCwgZW5kLXN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX3MsIGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgaWYgKG9mZnNldD09LTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgUHlfTUVNQ1BZKHN0YXJ0K29mZnNldCwgdG9fcywgZnJvbV9sZW4pOwotICAgICAgICBzdGFydCArPSBvZmZzZXQrZnJvbV9sZW47Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk9PTEsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXIoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZyb21fYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQotewotICAgIGNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwotICAgIGNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLSAgICBQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwotICAgIFB5X3NzaXplX3QgY291bnQ7Ci0gICAgUHlCeXRlc09iamVjdCAqcmVzdWx0OwotCi0gICAgc2VsZl9zID0gUHlCeXRlc19BU19TVFJJTkcoc2VsZik7Ci0gICAgc2VsZl9sZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotCi0gICAgY291bnQgPSBjb3VudGNoYXIoc2VsZl9zLCBzZWxmX2xlbiwgZnJvbV9jLCBtYXhjb3VudCk7Ci0gICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgLyogbm8gbWF0Y2hlcywgcmV0dXJuIHVuY2hhbmdlZCAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLwotICAgIC8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLwotICAgIGFzc2VydChjb3VudCA+IDApOwotICAgIGlmICh0b19sZW4gLSAxID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZW1lbnQgYnl0ZXMgYXJlIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4gLSAxKTsKLQotICAgIGlmICggKHJlc3VsdCA9IChQeUJ5dGVzT2JqZWN0ICopCi0gICAgICAgICAgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCByZXN1bHRfbGVuKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmVzdWx0X3MgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXN1bHQpOwotCi0gICAgc3RhcnQgPSBzZWxmX3M7Ci0gICAgZW5kID0gc2VsZl9zICsgc2VsZl9sZW47Ci0gICAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgICAgIG5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwotICAgICAgICBpZiAobmV4dCA9PSBOVUxMKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKLSAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgKz0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGNvcHkgdGhlIHVuY2hhbmdlZCBvbGQgdGhlbiB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgbmV4dC1zdGFydCk7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSAobmV4dC1zdGFydCk7Ci0gICAgICAgICAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHRvX3MsIHRvX2xlbik7Ci0gICAgICAgICAgICByZXN1bHRfcyArPSB0b19sZW47Ci0gICAgICAgICAgICBzdGFydCA9IG5leHQrMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHJlbWFpbmluZyBzdHJpbmcgKi8KLSAgICBQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIGxlbih0byk+PTIsIG1heGNvdW50Pj0xICovCi1QeV9MT0NBTChQeUJ5dGVzT2JqZWN0ICopCi1yZXBsYWNlX3N1YnN0cmluZyhQeUJ5dGVzT2JqZWN0ICpzZWxmLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnJvbV9zLCBQeV9zc2l6ZV90IGZyb21fbGVuLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KSB7Ci0gICAgY2hhciAqc2VsZl9zLCAqcmVzdWx0X3M7Ci0gICAgY2hhciAqc3RhcnQsICpuZXh0LCAqZW5kOwotICAgIFB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47Ci0gICAgUHlfc3NpemVfdCBjb3VudCwgb2Zmc2V0OwotICAgIFB5Qnl0ZXNPYmplY3QgKnJlc3VsdDsKLQotICAgIHNlbGZfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpOwotICAgIHNlbGZfbGVuID0gUHlCeXRlc19HRVRfU0laRShzZWxmKTsKLQotICAgIGNvdW50ID0gc3RyaW5nbGliX2NvdW50KHNlbGZfcywgc2VsZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0KLSAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICAvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KLSAgICAvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCi0gICAgYXNzZXJ0KGNvdW50ID4gMCk7Ci0gICAgaWYgKHRvX2xlbiAtIGZyb21fbGVuID4gKFBZX1NTSVpFX1RfTUFYIC0gc2VsZl9sZW4pIC8gY291bnQpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZW1lbnQgYnl0ZXMgYXJlIHRvbyBsb25nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pOwotCi0gICAgaWYgKCAocmVzdWx0ID0gKFB5Qnl0ZXNPYmplY3QgKikKLSAgICAgICAgICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHJlc3VsdF9sZW4pKSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHRfcyA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlc3VsdCk7Ci0KLSAgICBzdGFydCA9IHNlbGZfczsKLSAgICBlbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKLSAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICAgICAgb2Zmc2V0ID0gc3RyaW5nbGliX2ZpbmQoc3RhcnQsIGVuZC1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbV9zLCBmcm9tX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgIGlmIChvZmZzZXQgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgbmV4dCA9IHN0YXJ0K29mZnNldDsKLSAgICAgICAgaWYgKG5leHQgPT0gc3RhcnQpIHsKLSAgICAgICAgICAgIC8qIHJlcGxhY2Ugd2l0aCB0aGUgJ3RvJyAqLwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgKz0gZnJvbV9sZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBjb3B5IHRoZSB1bmNoYW5nZWQgb2xkIHRoZW4gdGhlICd0bycgKi8KLSAgICAgICAgICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIG5leHQtc3RhcnQpOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwotICAgICAgICAgICAgUHlfTUVNQ1BZKHJlc3VsdF9zLCB0b19zLCB0b19sZW4pOwotICAgICAgICAgICAgcmVzdWx0X3MgKz0gdG9fbGVuOwotICAgICAgICAgICAgc3RhcnQgPSBuZXh0K2Zyb21fbGVuOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIENvcHkgdGhlIHJlbWFpbmRlciBvZiB0aGUgcmVtYWluaW5nIHN0cmluZyAqLwotICAgIFB5X01FTUNQWShyZXN1bHRfcywgc3RhcnQsIGVuZC1zdGFydCk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLVB5X0xPQ0FMKFB5Qnl0ZXNPYmplY3QgKikKLXJlcGxhY2UoUHlCeXRlc09iamVjdCAqc2VsZiwKLSAgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCi0gICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCi0gICAgUHlfc3NpemVfdCBtYXhjb3VudCkKLXsKLSAgICBpZiAobWF4Y291bnQgPCAwKSB7Ci0gICAgICAgIG1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgfSBlbHNlIGlmIChtYXhjb3VudCA9PSAwIHx8IFB5Qnl0ZXNfR0VUX1NJWkUoc2VsZikgPT0gMCkgewotICAgICAgICAvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwotICAgICAgICByZXR1cm4gcmV0dXJuX3NlbGYoc2VsZik7Ci0gICAgfQotCi0gICAgaWYgKG1heGNvdW50ID09IDAgfHwKLSAgICAgICAgKGZyb21fbGVuID09IDAgJiYgdG9fbGVuID09IDApKSB7Ci0gICAgICAgIC8qIG5vdGhpbmcgdG8gZG87IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCi0gICAgICAgIHJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgemVyby1sZW5ndGggc3BlY2lhbCBjYXNlcyAqLwotCi0gICAgaWYgKGZyb21fbGVuID09IDApIHsKLSAgICAgICAgLyogaW5zZXJ0IHRoZSAndG8nIHN0cmluZyBldmVyeXdoZXJlLiAgICovCi0gICAgICAgIC8qICAgID4+PiAiUHl0aG9uIi5yZXBsYWNlKCIiLCAiLiIpICAgICAqLwotICAgICAgICAvKiAgICAnLlAueS50Lmguby5uLicgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIHJlcGxhY2VfaW50ZXJsZWF2ZShzZWxmLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLSAgICB9Ci0KLSAgICAvKiBFeGNlcHQgZm9yICIiLnJlcGxhY2UoIiIsICJBIikgPT0gIkEiIHRoZXJlIGlzIG5vIHdheSBiZXlvbmQgdGhpcyAqLwotICAgIC8qIHBvaW50IGZvciBhbiBlbXB0eSBzZWxmIHN0cmluZyB0byBnZW5lcmF0ZSBhIG5vbi1lbXB0eSBzdHJpbmcgKi8KLSAgICAvKiBTcGVjaWFsIGNhc2Ugc28gdGhlIHJlbWFpbmluZyBjb2RlIGFsd2F5cyBnZXRzIGEgbm9uLWVtcHR5IHN0cmluZyAqLwotICAgIGlmIChQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwotICAgIH0KLQotICAgIGlmICh0b19sZW4gPT0gMCkgewotICAgICAgICAvKiBkZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mICdmcm9tJyBzdHJpbmcgKi8KLSAgICAgICAgaWYgKGZyb21fbGVuID09IDEpIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX2RlbGV0ZV9zaW5nbGVfY2hhcmFjdGVyKAotICAgICAgICAgICAgICAgIHNlbGYsIGZyb21fc1swXSwgbWF4Y291bnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fbGVuLCBtYXhjb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBIYW5kbGUgc3BlY2lhbCBjYXNlIHdoZXJlIGJvdGggc3RyaW5ncyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAqLwotCi0gICAgaWYgKGZyb21fbGVuID09IHRvX2xlbikgewotICAgICAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3Rlcl9pbl9wbGFjZSgKLSAgICAgICAgICAgICAgICBzZWxmLAotICAgICAgICAgICAgICAgIGZyb21fc1swXSwKLSAgICAgICAgICAgICAgICB0b19zWzBdLAotICAgICAgICAgICAgICAgIG1heGNvdW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXBsYWNlX3N1YnN0cmluZ19pbl9wbGFjZSgKLSAgICAgICAgICAgICAgICBzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sCi0gICAgICAgICAgICAgICAgbWF4Y291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogT3RoZXJ3aXNlIHVzZSB0aGUgbW9yZSBnZW5lcmljIGFsZ29yaXRobXMgKi8KLSAgICBpZiAoZnJvbV9sZW4gPT0gMSkgewotICAgICAgICByZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKHNlbGYsIGZyb21fc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBsZW4oJ2Zyb20nKT49MiwgbGVuKCd0bycpPj0xICovCi0gICAgICAgIHJldHVybiByZXBsYWNlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhjb3VudCk7Ci0gICAgfQotfQotCiAKIC8qW2NsaW5pYyBpbnB1dF0KIGJ5dGVzLnJlcGxhY2UKQEAgLTI3NzUsMTU2ICsyMjE0LDI4IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19yZXBsYWNlX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBQeV9idWZmZXIgKm9sZCwgUHlfYnVmZmVyICpuZXcsCitieXRlc19yZXBsYWNlX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlfYnVmZmVyICpvbGQsIFB5X2J1ZmZlciAqbmV3LAogICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NDAzZGM5ZDdhODNjNWExZCBpbnB1dD1iMmZiYmYwYmYwNGRlOGU1XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTk0ZmE1ODhiNmI5YzEwNCBpbnB1dD1iMmZiYmYwYmYwNGRlOGU1XSovCiB7Ci0gICAgcmV0dXJuIChQeU9iamVjdCAqKXJlcGxhY2UoKFB5Qnl0ZXNPYmplY3QgKikgc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW9sZC0+YnVmLCBvbGQtPmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW5ldy0+YnVmLCBuZXctPmxlbiwgY291bnQpOworICAgIHJldHVybiBzdHJpbmdsaWJfcmVwbGFjZSgoUHlPYmplY3QgKilzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKW9sZC0+YnVmLCBvbGQtPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiluZXctPmJ1ZiwgbmV3LT5sZW4sIGNvdW50KTsKIH0KIAogLyoqIEVuZCBEQUxLRSAqKi8KIAotLyogTWF0Y2hlcyB0aGUgZW5kIChkaXJlY3Rpb24gPj0gMCkgb3Igc3RhcnQgKGRpcmVjdGlvbiA8IDApIG9mIHNlbGYKLSAqIGFnYWluc3Qgc3Vic3RyLCB1c2luZyB0aGUgc3RhcnQgYW5kIGVuZCBhcmd1bWVudHMuIFJldHVybnMKLSAqIC0xIG9uIGVycm9yLCAwIGlmIG5vdCBmb3VuZCBhbmQgMSBpZiBmb3VuZC4KLSAqLwotUHlfTE9DQUwoaW50KQotX2J5dGVzX3RhaWxtYXRjaChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqc3Vic3RyLCBQeV9zc2l6ZV90IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsIGludCBkaXJlY3Rpb24pCi17Ci0gICAgUHlfc3NpemVfdCBsZW4gPSBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpOwotICAgIFB5X3NzaXplX3Qgc2xlbjsKLSAgICBQeV9idWZmZXIgc3ViX3ZpZXcgPSB7TlVMTCwgTlVMTH07Ci0gICAgY29uc3QgY2hhciogc3ViOwotICAgIGNvbnN0IGNoYXIqIHN0cjsKLQotICAgIGlmIChQeUJ5dGVzX0NoZWNrKHN1YnN0cikpIHsKLSAgICAgICAgc3ViID0gUHlCeXRlc19BU19TVFJJTkcoc3Vic3RyKTsKLSAgICAgICAgc2xlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoc3Vic3RyKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoc3Vic3RyLCAmc3ViX3ZpZXcsIFB5QlVGX1NJTVBMRSkgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgc3ViID0gc3ViX3ZpZXcuYnVmOwotICAgICAgICBzbGVuID0gc3ViX3ZpZXcubGVuOwotICAgIH0KLSAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhzZWxmKTsKLQotICAgIEFESlVTVF9JTkRJQ0VTKHN0YXJ0LCBlbmQsIGxlbik7Ci0KLSAgICBpZiAoZGlyZWN0aW9uIDwgMCkgewotICAgICAgICAvKiBzdGFydHN3aXRoICovCi0gICAgICAgIGlmIChzdGFydCtzbGVuID4gbGVuKQotICAgICAgICAgICAgZ290byBub3Rmb3VuZDsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBlbmRzd2l0aCAqLwotICAgICAgICBpZiAoZW5kLXN0YXJ0IDwgc2xlbiB8fCBzdGFydCA+IGxlbikKLSAgICAgICAgICAgIGdvdG8gbm90Zm91bmQ7Ci0KLSAgICAgICAgaWYgKGVuZC1zbGVuID4gc3RhcnQpCi0gICAgICAgICAgICBzdGFydCA9IGVuZCAtIHNsZW47Ci0gICAgfQotICAgIGlmIChlbmQtc3RhcnQgPCBzbGVuKQotICAgICAgICBnb3RvIG5vdGZvdW5kOwotICAgIGlmIChtZW1jbXAoc3RyK3N0YXJ0LCBzdWIsIHNsZW4pICE9IDApCi0gICAgICAgIGdvdG8gbm90Zm91bmQ7Ci0KLSAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZzdWJfdmlldyk7Ci0gICAgcmV0dXJuIDE7Ci0KLW5vdGZvdW5kOgotICAgIFB5QnVmZmVyX1JlbGVhc2UoJnN1Yl92aWV3KTsKLSAgICByZXR1cm4gMDsKLX0KLQotCi1QeURvY19TVFJWQVIoc3RhcnRzd2l0aF9fZG9jX18sCi0iQi5zdGFydHN3aXRoKHByZWZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKLVxuXAotUmV0dXJuIFRydWUgaWYgQiBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgRmFsc2Ugb3RoZXJ3aXNlLlxuXAotV2l0aCBvcHRpb25hbCBzdGFydCwgdGVzdCBCIGJlZ2lubmluZyBhdCB0aGF0IHBvc2l0aW9uLlxuXAotV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIEIgYXQgdGhhdCBwb3NpdGlvbi5cblwKLXByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIGJ5dGVzIHRvIHRyeS4iKTsKIAogc3RhdGljIFB5T2JqZWN0ICoKIGJ5dGVzX3N0YXJ0c3dpdGgoUHlCeXRlc09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7Ci0gICAgUHlfc3NpemVfdCBzdGFydCA9IDA7Ci0gICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBQeU9iamVjdCAqc3Vib2JqOwotICAgIGludCByZXN1bHQ7Ci0KLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzKCJzdGFydHN3aXRoIiwgYXJncywgJnN1Ym9iaiwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewotICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0ID0gX2J5dGVzX3RhaWxtYXRjaChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCAtMSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwotICAgIH0KLSAgICByZXN1bHQgPSBfYnl0ZXNfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgLTEpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJzdGFydHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIGJ5dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYSB0dXBsZSBvZiBieXRlcywgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOworICAgIHJldHVybiBfUHlfYnl0ZXNfc3RhcnRzd2l0aChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwgYXJncyk7CiB9CiAKLQotUHlEb2NfU1RSVkFSKGVuZHN3aXRoX19kb2NfXywKLSJCLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pIC0+IGJvb2xcblwKLVxuXAotUmV0dXJuIFRydWUgaWYgQiBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIEZhbHNlIG90aGVyd2lzZS5cblwKLVdpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgQiBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cblwKLVdpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBCIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1zdWZmaXggY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBieXRlcyB0byB0cnkuIik7Ci0KIHN0YXRpYyBQeU9iamVjdCAqCiBieXRlc19lbmRzd2l0aChQeUJ5dGVzT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLSAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKLSAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwotICAgIFB5T2JqZWN0ICpzdWJvYmo7Ci0gICAgaW50IHJlc3VsdDsKLQotICAgIGlmICghc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoImVuZHN3aXRoIiwgYXJncywgJnN1Ym9iaiwgJnN0YXJ0LCAmZW5kKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgewotICAgICAgICBQeV9zc2l6ZV90IGk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0ID0gX2J5dGVzX3RhaWxtYXRjaChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCArMSk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOwotICAgIH0KLSAgICByZXN1bHQgPSBfYnl0ZXNfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgKzEpOwotICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJlbmRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBieXRlcyBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2YgYnl0ZXMsIG5vdCAlcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKKyAgICByZXR1cm4gX1B5X2J5dGVzX2VuZHN3aXRoKFB5Qnl0ZXNfQVNfU1RSSU5HKHNlbGYpLCBQeUJ5dGVzX0dFVF9TSVpFKHNlbGYpLCBhcmdzKTsKIH0KIAogCkBAIC0yOTQ0LDkgKzIyNTUsOSBAQAogW2NsaW5pYyBzdGFydCBnZW5lcmF0ZWQgY29kZV0qLwogCiBzdGF0aWMgUHlPYmplY3QgKgotYnl0ZXNfZGVjb2RlX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBjb25zdCBjaGFyICplbmNvZGluZywKK2J5dGVzX2RlY29kZV9pbXBsKFB5Qnl0ZXNPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIgKmVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3JzKQotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJkMjAxNmZmOGUwYmIxNzYgaW5wdXQ9OTU4MTc0NzY5ZDJhNDBjYV0qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTU2NDlhNTNkZGUyN2IzMTQgaW5wdXQ9OTU4MTc0NzY5ZDJhNDBjYV0qLwogewogICAgIHJldHVybiBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoKFB5T2JqZWN0KilzZWxmLCBlbmNvZGluZywgZXJyb3JzKTsKIH0KQEAgLTI5NjQsOCArMjI3NSw4IEBACiBbY2xpbmljIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19zcGxpdGxpbmVzX2ltcGwoUHlCeXRlc09iamVjdCpzZWxmLCBpbnQga2VlcGVuZHMpCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTk1YzM1OThmNzgzM2NhZCBpbnB1dD03ZjRhYWM2NzE0NGY5OTQ0XSovCitieXRlc19zcGxpdGxpbmVzX2ltcGwoUHlCeXRlc09iamVjdCAqc2VsZiwgaW50IGtlZXBlbmRzKQorLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTM0ODQxNDlhNWQ4ODBmZmIgaW5wdXQ9N2Y0YWFjNjcxNDRmOTk0NF0qLwogewogICAgIHJldHVybiBzdHJpbmdsaWJfc3BsaXRsaW5lcygKICAgICAgICAgKFB5T2JqZWN0Kikgc2VsZiwgUHlCeXRlc19BU19TVFJJTkcoc2VsZiksCkBAIC0yOTczLDIyICsyMjg0LDYgQEAKICAgICAgICAgKTsKIH0KIAotc3RhdGljIGludAotaGV4X2RpZ2l0X3RvX2ludChQeV9VQ1M0IGMpCi17Ci0gICAgaWYgKGMgPj0gMTI4KQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKFB5X0lTRElHSVQoYykpCi0gICAgICAgIHJldHVybiBjIC0gJzAnOwotICAgIGVsc2UgewotICAgICAgICBpZiAoUHlfSVNVUFBFUihjKSkKLSAgICAgICAgICAgIGMgPSBQeV9UT0xPV0VSKGMpOwotICAgICAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCi0gICAgICAgICAgICByZXR1cm4gYyAtICdhJyArIDEwOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci19Ci0KIC8qW2NsaW5pYyBpbnB1dF0KIEBjbGFzc21ldGhvZAogYnl0ZXMuZnJvbWhleApAQCAtMzAwNiw0NyArMjMwMSw4OCBAQAogYnl0ZXNfZnJvbWhleF9pbXBsKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKnN0cmluZykKIC8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0wOTczYWNjNjM2NjFiYjJlIGlucHV0PWJmNGQxYzM2MTY3MGFjZDNdKi8KIHsKLSAgICBQeU9iamVjdCAqbmV3c3RyaW5nOworICAgIFB5T2JqZWN0ICpyZXN1bHQgPSBfUHlCeXRlc19Gcm9tSGV4KHN0cmluZywgMCk7CisgICAgaWYgKHR5cGUgIT0gJlB5Qnl0ZXNfVHlwZSAmJiByZXN1bHQgIT0gTlVMTCkgeworICAgICAgICBQeV9TRVRSRUYocmVzdWx0LCBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKChQeU9iamVjdCAqKXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBOVUxMKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1B5T2JqZWN0KgorX1B5Qnl0ZXNfRnJvbUhleChQeU9iamVjdCAqc3RyaW5nLCBpbnQgdXNlX2J5dGVhcnJheSkKK3sKICAgICBjaGFyICpidWY7Ci0gICAgUHlfc3NpemVfdCBoZXhsZW4sIGJ5dGVzbGVuLCBpLCBqOwotICAgIGludCB0b3AsIGJvdDsKLSAgICB2b2lkICpkYXRhOwotICAgIHVuc2lnbmVkIGludCBraW5kOworICAgIFB5X3NzaXplX3QgaGV4bGVuLCBpbnZhbGlkX2NoYXI7CisgICAgdW5zaWduZWQgaW50IHRvcCwgYm90OworICAgIFB5X1VDUzEgKnN0ciwgKmVuZDsKKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHdyaXRlci51c2VfYnl0ZWFycmF5ID0gdXNlX2J5dGVhcnJheTsKIAogICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2soc3RyaW5nKSk7CiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHJpbmcpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBraW5kID0gUHlVbmljb2RlX0tJTkQoc3RyaW5nKTsKLSAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEoc3RyaW5nKTsKICAgICBoZXhsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHJpbmcpOwogCi0gICAgYnl0ZXNsZW4gPSBoZXhsZW4vMjsgLyogVGhpcyBvdmVyZXN0aW1hdGVzIGlmIHRoZXJlIGFyZSBzcGFjZXMgKi8KLSAgICBuZXdzdHJpbmcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGJ5dGVzbGVuKTsKLSAgICBpZiAoIW5ld3N0cmluZykKKyAgICBpZiAoIVB5VW5pY29kZV9JU19BU0NJSShzdHJpbmcpKSB7CisgICAgICAgIHZvaWQgKmRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHJpbmcpOworICAgICAgICB1bnNpZ25lZCBpbnQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cmluZyk7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKworICAgICAgICAvKiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBub24tQVNDSUkgY2hhcmFjdGVyICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZXhsZW47IGkrKykgeworICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpID49IDEyOCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpbnZhbGlkX2NoYXIgPSBpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGFzc2VydChQeVVuaWNvZGVfS0lORChzdHJpbmcpID09IFB5VW5pY29kZV8xQllURV9LSU5EKTsKKyAgICBzdHIgPSBQeVVuaWNvZGVfMUJZVEVfREFUQShzdHJpbmcpOworCisgICAgLyogVGhpcyBvdmVyZXN0aW1hdGVzIGlmIHRoZXJlIGFyZSBzcGFjZXMgKi8KKyAgICBidWYgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBoZXhsZW4gLyAyKTsKKyAgICBpZiAoYnVmID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGJ1ZiA9IFB5Qnl0ZXNfQVNfU1RSSU5HKG5ld3N0cmluZyk7Ci0gICAgZm9yIChpID0gaiA9IDA7IGkgPCBoZXhsZW47IGkgKz0gMikgeworCisgICAgZW5kID0gc3RyICsgaGV4bGVuOworICAgIHdoaWxlIChzdHIgPCBlbmQpIHsKICAgICAgICAgLyogc2tpcCBvdmVyIHNwYWNlcyBpbiB0aGUgaW5wdXQgKi8KLSAgICAgICAgd2hpbGUgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpID09ICcgJykKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgaWYgKGkgPj0gaGV4bGVuKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRvcCA9IGhleF9kaWdpdF90b19pbnQoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgaSkpOwotICAgICAgICBib3QgPSBoZXhfZGlnaXRfdG9faW50KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkrMSkpOwotICAgICAgICBpZiAodG9wID09IC0xIHx8IGJvdCA9PSAtMSkgewotICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1oZXhhZGVjaW1hbCBudW1iZXIgZm91bmQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uICV6ZCIsIGkpOworICAgICAgICBpZiAoKnN0ciA9PSAnICcpIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzdHIrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKCpzdHIgPT0gJyAnKTsKKyAgICAgICAgICAgIGlmIChzdHIgPj0gZW5kKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdG9wID0gX1B5TG9uZ19EaWdpdFZhbHVlWypzdHJdOworICAgICAgICBpZiAodG9wID49IDE2KSB7CisgICAgICAgICAgICBpbnZhbGlkX2NoYXIgPSBzdHIgLSBQeVVuaWNvZGVfMUJZVEVfREFUQShzdHJpbmcpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBidWZbaisrXSA9ICh0b3AgPDwgNCkgKyBib3Q7CisgICAgICAgIHN0cisrOworCisgICAgICAgIGJvdCA9IF9QeUxvbmdfRGlnaXRWYWx1ZVsqc3RyXTsKKyAgICAgICAgaWYgKGJvdCA+PSAxNikgeworICAgICAgICAgICAgaW52YWxpZF9jaGFyID0gc3RyIC0gUHlVbmljb2RlXzFCWVRFX0RBVEEoc3RyaW5nKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgc3RyKys7CisKKyAgICAgICAgKmJ1ZisrID0gKHVuc2lnbmVkIGNoYXIpKCh0b3AgPDwgNCkgKyBib3QpOwogICAgIH0KLSAgICBpZiAoaiAhPSBieXRlc2xlbiAmJiBfUHlCeXRlc19SZXNpemUoJm5ld3N0cmluZywgaikgPCAwKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIHJldHVybiBuZXdzdHJpbmc7CisKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIGJ1Zik7CiAKICAgZXJyb3I6Ci0gICAgUHlfWERFQ1JFRihuZXdzdHJpbmcpOworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAibm9uLWhleGFkZWNpbWFsIG51bWJlciBmb3VuZCBpbiAiCisgICAgICAgICAgICAgICAgICJmcm9taGV4KCkgYXJnIGF0IHBvc2l0aW9uICV6ZCIsIGludmFsaWRfY2hhcik7CisgICAgX1B5Qnl0ZXNXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMzA3NiwxNyArMjQxMiwyMCBAQAogICAgIHsiX19nZXRuZXdhcmdzX18iLCAgICAgICAgICAoUHlDRnVuY3Rpb24pYnl0ZXNfZ2V0bmV3YXJncywgIE1FVEhfTk9BUkdTfSwKICAgICB7ImNhcGl0YWxpemUiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2NhcGl0YWxpemUsIE1FVEhfTk9BUkdTLAogICAgICBfUHlfY2FwaXRhbGl6ZV9fZG9jX199LAotICAgIHsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jZW50ZXIsIE1FVEhfVkFSQVJHUywgY2VudGVyX19kb2NfX30sCi0gICAgeyJjb3VudCIsIChQeUNGdW5jdGlvbilieXRlc19jb3VudCwgTUVUSF9WQVJBUkdTLCBjb3VudF9fZG9jX199LAorICAgIHsiY2VudGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9jZW50ZXIsIE1FVEhfVkFSQVJHUywKKyAgICAgX1B5X2NlbnRlcl9fZG9jX199LAorICAgIHsiY291bnQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfY291bnQsIE1FVEhfVkFSQVJHUywKKyAgICAgX1B5X2NvdW50X19kb2NfX30sCiAgICAgQllURVNfREVDT0RFX01FVEhPRERFRgogICAgIHsiZW5kc3dpdGgiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfZW5kc3dpdGgsIE1FVEhfVkFSQVJHUywKLSAgICAgZW5kc3dpdGhfX2RvY19ffSwKKyAgICAgX1B5X2VuZHN3aXRoX19kb2NfX30sCiAgICAgeyJleHBhbmR0YWJzIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9leHBhbmR0YWJzLCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotICAgICBleHBhbmR0YWJzX19kb2NfX30sCi0gICAgeyJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2ZpbmQsIE1FVEhfVkFSQVJHUywgZmluZF9fZG9jX199LAorICAgICBfUHlfZXhwYW5kdGFic19fZG9jX199LAorICAgIHsiZmluZCIsIChQeUNGdW5jdGlvbilieXRlc19maW5kLCBNRVRIX1ZBUkFSR1MsCisgICAgIF9QeV9maW5kX19kb2NfX30sCiAgICAgQllURVNfRlJPTUhFWF9NRVRIT0RERUYKICAgICB7ImhleCIsIChQeUNGdW5jdGlvbilieXRlc19oZXgsIE1FVEhfTk9BUkdTLCBoZXhfX2RvY19ffSwKLSAgICB7ImluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX2luZGV4LCBNRVRIX1ZBUkFSR1MsIGluZGV4X19kb2NfX30sCisgICAgeyJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlc19pbmRleCwgTUVUSF9WQVJBUkdTLCBfUHlfaW5kZXhfX2RvY19ffSwKICAgICB7ImlzYWxudW0iLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2lzYWxudW0sIE1FVEhfTk9BUkdTLAogICAgICBfUHlfaXNhbG51bV9fZG9jX199LAogICAgIHsiaXNhbHBoYSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfaXNhbHBoYSwgTUVUSF9OT0FSR1MsCkBAIC0zMTAyLDM4ICsyNDQxLDQwIEBACiAgICAgeyJpc3VwcGVyIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl9pc3VwcGVyLCBNRVRIX05PQVJHUywKICAgICAgX1B5X2lzdXBwZXJfX2RvY19ffSwKICAgICBCWVRFU19KT0lOX01FVEhPRERFRgotICAgIHsibGp1c3QiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX2xqdXN0LCBNRVRIX1ZBUkFSR1MsIGxqdXN0X19kb2NfX30sCisgICAgeyJsanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbGp1c3QsIE1FVEhfVkFSQVJHUywgX1B5X2xqdXN0X19kb2NfX30sCiAgICAgeyJsb3dlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfbG93ZXIsIE1FVEhfTk9BUkdTLCBfUHlfbG93ZXJfX2RvY19ffSwKICAgICBCWVRFU19MU1RSSVBfTUVUSE9EREVGCiAgICAgQllURVNfTUFLRVRSQU5TX01FVEhPRERFRgogICAgIEJZVEVTX1BBUlRJVElPTl9NRVRIT0RERUYKICAgICBCWVRFU19SRVBMQUNFX01FVEhPRERFRgotICAgIHsicmZpbmQiLCAoUHlDRnVuY3Rpb24pYnl0ZXNfcmZpbmQsIE1FVEhfVkFSQVJHUywgcmZpbmRfX2RvY19ffSwKLSAgICB7InJpbmRleCIsIChQeUNGdW5jdGlvbilieXRlc19yaW5kZXgsIE1FVEhfVkFSQVJHUywgcmluZGV4X19kb2NfX30sCi0gICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfcmp1c3QsIE1FVEhfVkFSQVJHUywgcmp1c3RfX2RvY19ffSwKKyAgICB7InJmaW5kIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3JmaW5kLCBNRVRIX1ZBUkFSR1MsIF9QeV9yZmluZF9fZG9jX199LAorICAgIHsicmluZGV4IiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3JpbmRleCwgTUVUSF9WQVJBUkdTLCBfUHlfcmluZGV4X19kb2NfX30sCisgICAgeyJyanVzdCIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfcmp1c3QsIE1FVEhfVkFSQVJHUywgX1B5X3JqdXN0X19kb2NfX30sCiAgICAgQllURVNfUlBBUlRJVElPTl9NRVRIT0RERUYKICAgICBCWVRFU19SU1BMSVRfTUVUSE9EREVGCiAgICAgQllURVNfUlNUUklQX01FVEhPRERFRgogICAgIEJZVEVTX1NQTElUX01FVEhPRERFRgogICAgIEJZVEVTX1NQTElUTElORVNfTUVUSE9EREVGCiAgICAgeyJzdGFydHN3aXRoIiwgKFB5Q0Z1bmN0aW9uKWJ5dGVzX3N0YXJ0c3dpdGgsIE1FVEhfVkFSQVJHUywKLSAgICAgc3RhcnRzd2l0aF9fZG9jX199LAorICAgICBfUHlfc3RhcnRzd2l0aF9fZG9jX199LAogICAgIEJZVEVTX1NUUklQX01FVEhPRERFRgogICAgIHsic3dhcGNhc2UiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3N3YXBjYXNlLCBNRVRIX05PQVJHUywKICAgICAgX1B5X3N3YXBjYXNlX19kb2NfX30sCiAgICAgeyJ0aXRsZSIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfdGl0bGUsIE1FVEhfTk9BUkdTLCBfUHlfdGl0bGVfX2RvY19ffSwKICAgICBCWVRFU19UUkFOU0xBVEVfTUVUSE9EREVGCiAgICAgeyJ1cHBlciIsIChQeUNGdW5jdGlvbilzdHJpbmdsaWJfdXBwZXIsIE1FVEhfTk9BUkdTLCBfUHlfdXBwZXJfX2RvY19ffSwKLSAgICB7InpmaWxsIiwgKFB5Q0Z1bmN0aW9uKXN0cmluZ2xpYl96ZmlsbCwgTUVUSF9WQVJBUkdTLCB6ZmlsbF9fZG9jX199LAorICAgIHsiemZpbGwiLCAoUHlDRnVuY3Rpb24pc3RyaW5nbGliX3pmaWxsLCBNRVRIX1ZBUkFSR1MsIF9QeV96ZmlsbF9fZG9jX199LAogICAgIHtOVUxMLCAgICAgTlVMTH0gICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VudGluZWwgKi8KIH07CiAKIHN0YXRpYyBQeU9iamVjdCAqCi1ieXRlc19tb2QoUHlPYmplY3QgKnYsIFB5T2JqZWN0ICp3KQorYnl0ZXNfbW9kKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJnKQogewotICAgIGlmICghUHlCeXRlc19DaGVjayh2KSkKKyAgICBpZiAoIVB5Qnl0ZXNfQ2hlY2soc2VsZikpIHsKICAgICAgICAgUHlfUkVUVVJOX05PVElNUExFTUVOVEVEOwotICAgIHJldHVybiBfUHlCeXRlc19Gb3JtYXQodiwgdyk7CisgICAgfQorICAgIHJldHVybiBfUHlCeXRlc19Gb3JtYXRFeChQeUJ5dGVzX0FTX1NUUklORyhzZWxmKSwgUHlCeXRlc19HRVRfU0laRShzZWxmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCAwKTsKIH0KIAogc3RhdGljIFB5TnVtYmVyTWV0aG9kcyBieXRlc19hc19udW1iZXIgPSB7CkBAIC0zMjQyLDEwOCArMjU4Myw5MyBAQAogICAgIHJldHVybiBQeUJ5dGVzX0Zyb21PYmplY3QoeCk7CiB9CiAKLVB5T2JqZWN0ICoKLVB5Qnl0ZXNfRnJvbU9iamVjdChQeU9iamVjdCAqeCkKK3N0YXRpYyBQeU9iamVjdCoKK19QeUJ5dGVzX0Zyb21CdWZmZXIoUHlPYmplY3QgKngpCiB7Ci0gICAgUHlPYmplY3QgKm5ldywgKml0OworICAgIFB5T2JqZWN0ICpuZXc7CisgICAgUHlfYnVmZmVyIHZpZXc7CisKKyAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKHgsICZ2aWV3LCBQeUJVRl9GVUxMX1JPKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCB2aWV3Lmxlbik7CisgICAgaWYgKCFuZXcpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoUHlCdWZmZXJfVG9Db250aWd1b3VzKCgoUHlCeXRlc09iamVjdCAqKW5ldyktPm9iX3N2YWwsCisgICAgICAgICAgICAgICAgJnZpZXcsIHZpZXcubGVuLCAnQycpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgIHJldHVybiBuZXc7CisKK2ZhaWw6CisgICAgUHlfWERFQ1JFRihuZXcpOworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOworICAgIHJldHVybiBOVUxMOworfQorCisjZGVmaW5lIF9QeUJ5dGVzX0ZST01fTElTVF9CT0RZKHgsIEdFVF9JVEVNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlPYmplY3QgKmJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5X3NzaXplX3QgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQeV9zc2l6ZV90IHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2hhciAqc3RyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFB5T2JqZWN0ICppdGVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnl0ZXMgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIFB5X1NJWkUoeCkpOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChieXRlcyA9PSBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyID0gKChQeUJ5dGVzT2JqZWN0ICopYnl0ZXMpLT5vYl9zdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlfU0laRSh4KTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGl0ZW0gPSBHRVRfSVRFTSgoeCksIGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWx1ZSA9IFB5TnVtYmVyX0FzU3NpemVfdChpdGVtLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZhbHVlID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSAyNTYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NikiKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqc3RyKysgPSAoY2hhcikgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIGJ5dGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUHlfREVDUkVGKGJ5dGVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBQeU9iamVjdCoKK19QeUJ5dGVzX0Zyb21MaXN0KFB5T2JqZWN0ICp4KQoreworICAgIF9QeUJ5dGVzX0ZST01fTElTVF9CT0RZKHgsIFB5TGlzdF9HRVRfSVRFTSk7Cit9CisKK3N0YXRpYyBQeU9iamVjdCoKK19QeUJ5dGVzX0Zyb21UdXBsZShQeU9iamVjdCAqeCkKK3sKKyAgICBfUHlCeXRlc19GUk9NX0xJU1RfQk9EWSh4LCBQeVR1cGxlX0dFVF9JVEVNKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK19QeUJ5dGVzX0Zyb21JdGVyYXRvcihQeU9iamVjdCAqaXQsIFB5T2JqZWN0ICp4KQoreworICAgIGNoYXIgKnN0cjsKICAgICBQeV9zc2l6ZV90IGksIHNpemU7Ci0KLSAgICBpZiAoeCA9PSBOVUxMKSB7Ci0gICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoUHlCeXRlc19DaGVja0V4YWN0KHgpKSB7Ci0gICAgICAgIFB5X0lOQ1JFRih4KTsKLSAgICAgICAgcmV0dXJuIHg7Ci0gICAgfQotCi0gICAgLyogVXNlIHRoZSBtb2Rlcm4gYnVmZmVyIGludGVyZmFjZSAqLwotICAgIGlmIChQeU9iamVjdF9DaGVja0J1ZmZlcih4KSkgewotICAgICAgICBQeV9idWZmZXIgdmlldzsKLSAgICAgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcih4LCAmdmlldywgUHlCVUZfRlVMTF9STykgPCAwKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIG5ldyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgdmlldy5sZW4pOwotICAgICAgICBpZiAoIW5ldykKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgaWYgKFB5QnVmZmVyX1RvQ29udGlndW91cygoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aWV3LCB2aWV3LmxlbiwgJ0MnKSA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIFB5QnVmZmVyX1JlbGVhc2UoJnZpZXcpOwotICAgICAgICByZXR1cm4gbmV3OwotICAgICAgZmFpbDoKLSAgICAgICAgUHlfWERFQ1JFRihuZXcpOwotICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soeCkpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgY29udmVydCB1bmljb2RlIG9iamVjdCB0byBieXRlcyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoUHlMaXN0X0NoZWNrRXhhY3QoeCkpIHsKLSAgICAgICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBQeV9TSVpFKHgpKTsKLSAgICAgICAgaWYgKG5ldyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHgpOyBpKyspIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoCi0gICAgICAgICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKHgsIGkpLCBQeUV4Y19WYWx1ZUVycm9yKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID49IDI1NikgewotICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZXMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpIik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG5ldyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAoKFB5Qnl0ZXNPYmplY3QgKiluZXcpLT5vYl9zdmFsW2ldID0gKGNoYXIpIHZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXc7Ci0gICAgfQotICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3QoeCkpIHsKLSAgICAgICAgbmV3ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBQeV9TSVpFKHgpKTsKLSAgICAgICAgaWYgKG5ldyA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeV9TSVpFKHgpOyBpKyspIHsKLSAgICAgICAgICAgIFB5X3NzaXplX3QgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoCi0gICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTSh4LCBpKSwgUHlFeGNfVmFsdWVFcnJvcik7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSAyNTYpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KSIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXcpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbFtpXSA9IChjaGFyKSB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3OwotICAgIH0KKyAgICBfUHlCeXRlc1dyaXRlciB3cml0ZXI7CiAKICAgICAvKiBGb3IgaXRlcmF0b3IgdmVyc2lvbiwgY3JlYXRlIGEgc3RyaW5nIG9iamVjdCBhbmQgcmVzaXplIGFzIG5lZWRlZCAqLwogICAgIHNpemUgPSBQeU9iamVjdF9MZW5ndGhIaW50KHgsIDY0KTsKICAgICBpZiAoc2l6ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAvKiBBbGxvY2F0ZSBhbiBleHRyYSBieXRlIHRvIHByZXZlbnQgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgpIGZyb20KLSAgICAgICByZXR1cm5pbmcgYSBzaGFyZWQgZW1wdHkgYnl0ZXMgc3RyaW5nLiBUaGlzIHJlcXVpcmVkIGJlY2F1c2Ugd2UKLSAgICAgICB3YW50IHRvIGNhbGwgX1B5Qnl0ZXNfUmVzaXplKCkgdGhlIHJldHVybmVkIG9iamVjdCwgd2hpY2ggd2UgY2FuCi0gICAgICAgb25seSBkbyBvbiBieXRlcyBvYmplY3RzIHdpdGggcmVmY291bnQgPT0gMS4gKi8KLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgICAgICBzaXplID0gMTsKLSAgICBuZXcgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotICAgIGlmIChuZXcgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgYXNzZXJ0KFB5X1JFRkNOVChuZXcpID09IDEpOwogCi0gICAgLyogR2V0IHRoZSBpdGVyYXRvciAqLwotICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih4KTsKLSAgICBpZiAoaXQgPT0gTlVMTCkKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CisgICAgc2l6ZSA9IHdyaXRlci5hbGxvY2F0ZWQ7CiAKICAgICAvKiBSdW4gdGhlIGl0ZXJhdG9yIHRvIGV4aGF1c3Rpb24gKi8KICAgICBmb3IgKGkgPSAwOyA7IGkrKykgewpAQCAtMzM1OSw3ICsyNjg1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qIEludGVycHJldCBpdCBhcyBhbiBpbnQgKF9faW5kZXhfXykgKi8KLSAgICAgICAgdmFsdWUgPSBQeU51bWJlcl9Bc1NzaXplX3QoaXRlbSwgUHlFeGNfVmFsdWVFcnJvcik7CisgICAgICAgIHZhbHVlID0gUHlOdW1iZXJfQXNTc2l6ZV90KGl0ZW0sIE5VTEwpOwogICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTMzNzMsMjEgKzI2OTksNTggQEAKIAogICAgICAgICAvKiBBcHBlbmQgdGhlIGJ5dGUgKi8KICAgICAgICAgaWYgKGkgPj0gc2l6ZSkgewotICAgICAgICAgICAgc2l6ZSA9IDIgKiBzaXplICsgMTsKLSAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJm5ldywgc2l6ZSkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9SZXNpemUoJndyaXRlciwgc3RyLCBzaXplKzEpOworICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgc2l6ZSA9IHdyaXRlci5hbGxvY2F0ZWQ7CiAgICAgICAgIH0KLSAgICAgICAgKChQeUJ5dGVzT2JqZWN0ICopbmV3KS0+b2Jfc3ZhbFtpXSA9IChjaGFyKSB2YWx1ZTsKKyAgICAgICAgKnN0cisrID0gKGNoYXIpIHZhbHVlOwogICAgIH0KLSAgICBfUHlCeXRlc19SZXNpemUoJm5ldywgaSk7CiAKLSAgICAvKiBDbGVhbiB1cCBhbmQgcmV0dXJuIHN1Y2Nlc3MgKi8KLSAgICBQeV9ERUNSRUYoaXQpOwotICAgIHJldHVybiBuZXc7CisgICAgcmV0dXJuIF9QeUJ5dGVzV3JpdGVyX0ZpbmlzaCgmd3JpdGVyLCBzdHIpOwogCiAgIGVycm9yOgotICAgIFB5X1hERUNSRUYoaXQpOwotICAgIFB5X1hERUNSRUYobmV3KTsKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOworfQorCitQeU9iamVjdCAqCitQeUJ5dGVzX0Zyb21PYmplY3QoUHlPYmplY3QgKngpCit7CisgICAgUHlPYmplY3QgKml0LCAqcmVzdWx0OworCisgICAgaWYgKHggPT0gTlVMTCkgeworICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKFB5Qnl0ZXNfQ2hlY2tFeGFjdCh4KSkgeworICAgICAgICBQeV9JTkNSRUYoeCk7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKworICAgIC8qIFVzZSB0aGUgbW9kZXJuIGJ1ZmZlciBpbnRlcmZhY2UgKi8KKyAgICBpZiAoUHlPYmplY3RfQ2hlY2tCdWZmZXIoeCkpCisgICAgICAgIHJldHVybiBfUHlCeXRlc19Gcm9tQnVmZmVyKHgpOworCisgICAgaWYgKFB5TGlzdF9DaGVja0V4YWN0KHgpKQorICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbUxpc3QoeCk7CisKKyAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHgpKQorICAgICAgICByZXR1cm4gX1B5Qnl0ZXNfRnJvbVR1cGxlKHgpOworCisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soeCkpIHsKKyAgICAgICAgaXQgPSBQeU9iamVjdF9HZXRJdGVyKHgpOworICAgICAgICBpZiAoaXQgIT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdWx0ID0gX1B5Qnl0ZXNfRnJvbUl0ZXJhdG9yKGl0LCB4KTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImNhbm5vdCBjb252ZXJ0ICclLjIwMHMnIG9iamVjdCB0byBieXRlcyIsCisgICAgICAgICAgICAgICAgIHgtPm9iX3R5cGUtPnRwX25hbWUpOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC0zNzM4LDMgKzMxMDEsMjgyIEBACiAgICAgX1B5T2JqZWN0X0dDX1RSQUNLKGl0KTsKICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CisKKworLyogX1B5Qnl0ZXNXcml0ZXIgQVBJICovCisKKyNpZmRlZiBNU19XSU5ET1dTCisgICAvKiBPbiBXaW5kb3dzLCBvdmVyYWxsb2NhdGUgYnkgNTAlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgMgorI2Vsc2UKKyAgIC8qIE9uIExpbnV4LCBvdmVyYWxsb2NhdGUgYnkgMjUlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgNAorI2VuZGlmCisKK3ZvaWQKK19QeUJ5dGVzV3JpdGVyX0luaXQoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlcikKK3sKKyAgICAvKiBTZXQgYWxsIGF0dHJpYnV0ZXMgYmVmb3JlIHNtYWxsX2J1ZmZlciB0byAwICovCisgICAgbWVtc2V0KHdyaXRlciwgMCwgb2Zmc2V0b2YoX1B5Qnl0ZXNXcml0ZXIsIHNtYWxsX2J1ZmZlcikpOworI2lmZGVmIFB5X0RFQlVHCisgICAgbWVtc2V0KHdyaXRlci0+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+PSAwKSB7CiAgICAgICAgICAgICBhZGRyICs9ICpwKys7Ci0gICAgICAgICAgICBpZiAoKnArKykKKyAgICAgICAgICAgIGlmICgoc2lnbmVkIGNoYXIpKnApCiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwKys7CiAgICAgICAgIH0KICAgICAgICAgYm91bmRzLT5hcF91cHBlciA9IGFkZHI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kZXNjcm9iamVjdC5jIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCmluZGV4IGRhNjhlM2IuLjRiYzczYjkgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGVzY3JvYmplY3QuYworKysgYi9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKQEAgLTIyLDcgKzIyLDcgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNoYXIgKmZvcm1hdCkKK2Rlc2NyX3JlcHIoUHlEZXNjck9iamVjdCAqZGVzY3IsIGNvbnN0IGNoYXIgKmZvcm1hdCkKIHsKICAgICBQeU9iamVjdCAqbmFtZSA9IE5VTEw7CiAgICAgaWYgKGRlc2NyLT5kX25hbWUgIT0gTlVMTCAmJiBQeVVuaWNvZGVfQ2hlY2soZGVzY3ItPmRfbmFtZSkpCmRpZmYgLS1naXQgYS9PYmplY3RzL2RpY3RvYmplY3QuYyBiL09iamVjdHMvZGljdG9iamVjdC5jCmluZGV4IGUwNGFiMmIuLjdhM2VkNDIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGljdG9iamVjdC5jCisrKyBiL09iamVjdHMvZGljdG9iamVjdC5jCkBAIC0zMjEsNyArMzIxLDcgQEAKIAogICAgIGFzc2VydChzaXplID49IFB5RGljdF9NSU5TSVpFX1NQTElUKTsKICAgICBhc3NlcnQoSVNfUE9XRVJfT0ZfMihzaXplKSk7Ci0gICAgZGsgPSBQeU1lbV9NQUxMT0Moc2l6ZW9mKFB5RGljdEtleXNPYmplY3QpICsKKyAgICBkayA9IFB5T2JqZWN0X01BTExPQyhzaXplb2YoUHlEaWN0S2V5c09iamVjdCkgKwogICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQeURpY3RLZXlFbnRyeSkgKiAoc2l6ZS0xKSk7CiAgICAgaWYgKGRrID09IE5VTEwpIHsKICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKQEAgLTM1MCw3ICszNTAsNyBAQAogICAgICAgICBQeV9YREVDUkVGKGVudHJpZXNbaV0ubWVfa2V5KTsKICAgICAgICAgUHlfWERFQ1JFRihlbnRyaWVzW2ldLm1lX3ZhbHVlKTsKICAgICB9Ci0gICAgUHlNZW1fRlJFRShrZXlzKTsKKyAgICBQeU9iamVjdF9GUkVFKGtleXMpOwogfQogCiAjZGVmaW5lIG5ld192YWx1ZXMoc2l6ZSkgUHlNZW1fTkVXKFB5T2JqZWN0ICosIHNpemUpCkBAIC05NjEsNyArOTYxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhc3NlcnQob2xka2V5cy0+ZGtfcmVmY250ID09IDEpOwotICAgICAgICBES19ERUJVR19ERUNSRUYgUHlNZW1fRlJFRShvbGRrZXlzKTsKKyAgICAgICAgREtfREVCVUdfREVDUkVGIFB5T2JqZWN0X0ZSRUUob2xka2V5cyk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTE2MCwzOSArMTE2MCw0MiBAQAogICAgIHJldHVybiBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcihkcCwga3YpOwogfQogCi0vKiBGYXN0IHZlcnNpb24gb2YgZ2xvYmFsIHZhbHVlIGxvb2t1cC4KKy8qIEZhc3QgdmVyc2lvbiBvZiBnbG9iYWwgdmFsdWUgbG9va3VwIChMT0FEX0dMT0JBTCkuCiAgKiBMb29rdXAgaW4gZ2xvYmFscywgdGhlbiBidWlsdGlucy4KKyAqCisgKiBSYWlzZSBhbiBleGNlcHRpb24gYW5kIHJldHVybiBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkIChleDogY29tcHV0aW5nIHRoZQorICoga2V5IGhhc2ggZmFpbGVkLCBrZXkgY29tcGFyaXNvbiBmYWlsZWQsIC4uLikuIFJldHVybiBOVUxMIGlmIHRoZSBrZXkgZG9lc24ndAorICogZXhpc3QuIFJldHVybiB0aGUgdmFsdWUgaWYgdGhlIGtleSBleGlzdHMuCiAgKi8KIFB5T2JqZWN0ICoKIF9QeURpY3RfTG9hZEdsb2JhbChQeURpY3RPYmplY3QgKmdsb2JhbHMsIFB5RGljdE9iamVjdCAqYnVpbHRpbnMsIFB5T2JqZWN0ICprZXkpCiB7Ci0gICAgUHlPYmplY3QgKng7Ci0gICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KGtleSkpIHsKLSAgICAgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOwotICAgICAgICBQeV9oYXNoX3QgaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKWtleSktPmhhc2g7Ci0gICAgICAgIGlmIChoYXNoICE9IC0xKSB7Ci0gICAgICAgICAgICBQeURpY3RLZXlFbnRyeSAqZTsKLSAgICAgICAgICAgIGUgPSBnbG9iYWxzLT5tYV9rZXlzLT5ka19sb29rdXAoZ2xvYmFscywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7Ci0gICAgICAgICAgICBpZiAoZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4ID0gKnZhbHVlX2FkZHI7Ci0gICAgICAgICAgICBpZiAoeCAhPSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiB4OwotICAgICAgICAgICAgZSA9IGJ1aWx0aW5zLT5tYV9rZXlzLT5ka19sb29rdXAoYnVpbHRpbnMsIGtleSwgaGFzaCwgJnZhbHVlX2FkZHIpOwotICAgICAgICAgICAgaWYgKGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgeCA9ICp2YWx1ZV9hZGRyOwotICAgICAgICAgICAgcmV0dXJuIHg7Ci0gICAgICAgIH0KKyAgICBQeV9oYXNoX3QgaGFzaDsKKyAgICBQeURpY3RLZXlFbnRyeSAqZW50cnk7CisgICAgUHlPYmplY3QgKip2YWx1ZV9hZGRyOworICAgIFB5T2JqZWN0ICp2YWx1ZTsKKworICAgIGlmICghUHlVbmljb2RlX0NoZWNrRXhhY3Qoa2V5KSB8fAorICAgICAgICAoaGFzaCA9ICgoUHlBU0NJSU9iamVjdCAqKSBrZXkpLT5oYXNoKSA9PSAtMSkKKyAgICB7CisgICAgICAgIGhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CisgICAgICAgIGlmIChoYXNoID09IC0xKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHggPSBQeURpY3RfR2V0SXRlbVdpdGhFcnJvcigoUHlPYmplY3QgKilnbG9iYWxzLCBrZXkpOwotICAgIGlmICh4ICE9IE5VTEwpCi0gICAgICAgIHJldHVybiB4OwotICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQorCisgICAgLyogbmFtZXNwYWNlIDE6IGdsb2JhbHMgKi8KKyAgICBlbnRyeSA9IGdsb2JhbHMtPm1hX2tleXMtPmRrX2xvb2t1cChnbG9iYWxzLCBrZXksIGhhc2gsICZ2YWx1ZV9hZGRyKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yKChQeU9iamVjdCAqKWJ1aWx0aW5zLCBrZXkpOworICAgIHZhbHVlID0gKnZhbHVlX2FkZHI7CisgICAgaWYgKHZhbHVlICE9IE5VTEwpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIC8qIG5hbWVzcGFjZSAyOiBidWlsdGlucyAqLworICAgIGVudHJ5ID0gYnVpbHRpbnMtPm1hX2tleXMtPmRrX2xvb2t1cChidWlsdGlucywga2V5LCBoYXNoLCAmdmFsdWVfYWRkcik7CisgICAgaWYgKGVudHJ5ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAqdmFsdWVfYWRkcjsKIH0KIAogLyogQ0FVVElPTjogUHlEaWN0X1NldEl0ZW0oKSBtdXN0IGd1YXJhbnRlZSB0aGF0IGl0IHdvbid0IHJlc2l6ZSB0aGUKQEAgLTE5MTcsNyArMTkyMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWRpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjaGFyICptZXRobmFtZSkKK2RpY3RfdXBkYXRlX2NvbW1vbihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzLCBjb25zdCBjaGFyICptZXRobmFtZSkKIHsKICAgICBQeU9iamVjdCAqYXJnID0gTlVMTDsKICAgICBpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL09iamVjdHMvZXhjZXB0aW9ucy5jIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKaW5kZXggYWFmZjBiYy4uN2JjOTMxMCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9leGNlcHRpb25zLmMKKysrIGIvT2JqZWN0cy9leGNlcHRpb25zLmMKQEAgLTU5LDE1ICs1OSwxMSBAQAogc3RhdGljIGludAogQmFzZUV4Y2VwdGlvbl9pbml0KFB5QmFzZUV4Y2VwdGlvbk9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIFB5T2JqZWN0ICp0bXA7Ci0KICAgICBpZiAoIV9QeUFyZ19Ob0tleXdvcmRzKFB5X1RZUEUoc2VsZiktPnRwX25hbWUsIGt3ZHMpKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICB0bXAgPSBzZWxmLT5hcmdzOwotICAgIHNlbGYtPmFyZ3MgPSBhcmdzOwotICAgIFB5X0lOQ1JFRihzZWxmLT5hcmdzKTsKLSAgICBQeV9YREVDUkVGKHRtcCk7CisgICAgUHlfSU5DUkVGKGFyZ3MpOworICAgIFB5X1hTRVRSRUYoc2VsZi0+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+IG9iX2l0ZW0gKyBpOwotICAgIG9sZGl0ZW0gPSAqcDsKLSAgICAqcCA9IG5ld2l0ZW07Ci0gICAgUHlfWERFQ1JFRihvbGRpdGVtKTsKKyAgICBQeV9YU0VUUkVGKCpwLCBuZXdpdGVtKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy90eXBlb2JqZWN0LmMgYi9PYmplY3RzL3R5cGVvYmplY3QuYwppbmRleCA4YzVjNzdlLi41MjI3ZjZhIDEwMDY0NAotLS0gYS9PYmplY3RzL3R5cGVvYmplY3QuYworKysgYi9PYmplY3RzL3R5cGVvYmplY3QuYwpAQCAtNDYwLDcgKzQ2MCw3IEBACiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJfX21vZHVsZV9fIik7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBQeV9YSU5DUkVGKG1vZCk7CisgICAgICAgIFB5X0lOQ1JFRihtb2QpOwogICAgICAgICByZXR1cm4gbW9kOwogICAgIH0KICAgICBlbHNlIHsKQEAgLTUwMCw3ICs1MDAsNyBAQAogICAgICAgICAgICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLCBtZXNzYWdlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIFB5X1hJTkNSRUYobW9kKTsKKyAgICBQeV9JTkNSRUYobW9kKTsKICAgICByZXR1cm4gbW9kOwogfQogCkBAIC01NDgsNyArNTQ4LDcgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgKmJlc3RfYmFzZShQeU9iamVjdCAqKTsKIHN0YXRpYyBpbnQgbXJvX2ludGVybmFsKFB5VHlwZU9iamVjdCAqLCBQeU9iamVjdCAqKik7CiBQeV9MT0NBTF9JTkxJTkUoaW50KSB0eXBlX2lzX3N1YnR5cGVfYmFzZV9jaGFpbihQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwotc3RhdGljIGludCBjb21wYXRpYmxlX2Zvcl9hc3NpZ25tZW50KFB5VHlwZU9iamVjdCAqLCBQeVR5cGVPYmplY3QgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgY29tcGF0aWJsZV9mb3JfYXNzaWdubWVudChQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgaW50IGFkZF9zdWJjbGFzcyhQeVR5cGVPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKIHN0YXRpYyBpbnQgYWRkX2FsbF9zdWJjbGFzc2VzKFB5VHlwZU9iamVjdCAqdHlwZSwgUHlPYmplY3QgKmJhc2VzKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9zdWJjbGFzcyhQeVR5cGVPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOwpAQCAtODg4LDI1ICs4ODgsMzMgQEAKICNlbmRpZgogCiAgICAgb2JqID0gdHlwZS0+dHBfbmV3KHR5cGUsIGFyZ3MsIGt3ZHMpOwotICAgIGlmIChvYmogIT0gTlVMTCkgewotICAgICAgICAvKiBVZ2x5IGV4Y2VwdGlvbjogd2hlbiB0aGUgY2FsbCB3YXMgdHlwZShzb21ldGhpbmcpLAotICAgICAgICAgICBkb24ndCBjYWxsIHRwX2luaXQgb24gdGhlIHJlc3VsdC4gKi8KLSAgICAgICAgaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlICYmCi0gICAgICAgICAgICBQeVR1cGxlX0NoZWNrKGFyZ3MpICYmIFB5VHVwbGVfR0VUX1NJWkUoYXJncykgPT0gMSAmJgotICAgICAgICAgICAgKGt3ZHMgPT0gTlVMTCB8fAotICAgICAgICAgICAgIChQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPT0gMCkpKQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgLyogSWYgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSwKLSAgICAgICAgICAgaXQgd29uJ3QgYmUgaW5pdGlhbGl6ZWQuICovCi0gICAgICAgIGlmICghUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iaiksIHR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgICAgdHlwZSA9IFB5X1RZUEUob2JqKTsKLSAgICAgICAgaWYgKHR5cGUtPnRwX2luaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50IHJlcyA9IHR5cGUtPnRwX2luaXQob2JqLCBhcmdzLCBrd2RzKTsKLSAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgICAgICAgICAgb2JqID0gTlVMTDsKLSAgICAgICAgICAgIH0KKyAgICBvYmogPSBfUHlfQ2hlY2tGdW5jdGlvblJlc3VsdCgoUHlPYmplY3QqKXR5cGUsIG9iaiwgTlVMTCk7CisgICAgaWYgKG9iaiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFVnbHkgZXhjZXB0aW9uOiB3aGVuIHRoZSBjYWxsIHdhcyB0eXBlKHNvbWV0aGluZyksCisgICAgICAgZG9uJ3QgY2FsbCB0cF9pbml0IG9uIHRoZSByZXN1bHQuICovCisgICAgaWYgKHR5cGUgPT0gJlB5VHlwZV9UeXBlICYmCisgICAgICAgIFB5VHVwbGVfQ2hlY2soYXJncykgJiYgUHlUdXBsZV9HRVRfU0laRShhcmdzKSA9PSAxICYmCisgICAgICAgIChrd2RzID09IE5VTEwgfHwKKyAgICAgICAgIChQeURpY3RfQ2hlY2soa3dkcykgJiYgUHlEaWN0X1NpemUoa3dkcykgPT0gMCkpKQorICAgICAgICByZXR1cm4gb2JqOworCisgICAgLyogSWYgdGhlIHJldHVybmVkIG9iamVjdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgdHlwZSwKKyAgICAgICBpdCB3b24ndCBiZSBpbml0aWFsaXplZC4gKi8KKyAgICBpZiAoIVB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYmopLCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIG9iajsKKworICAgIHR5cGUgPSBQeV9UWVBFKG9iaik7CisgICAgaWYgKHR5cGUtPnRwX2luaXQgIT0gTlVMTCkgeworICAgICAgICBpbnQgcmVzID0gdHlwZS0+dHBfaW5pdChvYmosIGFyZ3MsIGt3ZHMpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgYXNzZXJ0KFB5RXJyX09jY3VycmVkKCkpOworICAgICAgICAgICAgUHlfREVDUkVGKG9iaik7CisgICAgICAgICAgICBvYmogPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KCFQeUVycl9PY2N1cnJlZCgpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2JqOwpAQCAtMTQxMSw3ICsxNDE5LDcgQEAKICAgIGFzIGxvb2t1cF9tZXRob2QgdG8gY2FjaGUgdGhlIGludGVybmVkIG5hbWUgc3RyaW5nIG9iamVjdC4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKLWNhbGxfbWV0aG9kKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjaGFyICpmb3JtYXQsIC4uLikKK2NhbGxfbWV0aG9kKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICB2YV9saXN0IHZhOwogICAgIFB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7CkBAIC0xNDQ3LDcgKzE0NTUsNyBAQAogLyogQ2xvbmUgb2YgY2FsbF9tZXRob2QoKSB0aGF0IHJldHVybnMgTm90SW1wbGVtZW50ZWQgd2hlbiB0aGUgbG9va3VwIGZhaWxzLiAqLwogCiBzdGF0aWMgUHlPYmplY3QgKgotY2FsbF9tYXliZShQeU9iamVjdCAqbywgX1B5X0lkZW50aWZpZXIgKm5hbWVpZCwgY2hhciAqZm9ybWF0LCAuLi4pCitjYWxsX21heWJlKFB5T2JqZWN0ICpvLCBfUHlfSWRlbnRpZmllciAqbmFtZWlkLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICB2YV9saXN0IHZhOwogICAgIFB5T2JqZWN0ICphcmdzLCAqZnVuYyA9IDAsICpyZXR2YWw7CkBAIC0xNTI2LDcgKzE1MzQsNiBAQAogICAgIFB5T2JqZWN0ICpuYW1lID0gX1B5T2JqZWN0X0dldEF0dHJJZChjbHMsICZQeUlkX19fbmFtZV9fKTsKICAgICBpZiAobmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgICAgIFB5X1hERUNSRUYobmFtZSk7CiAgICAgICAgIG5hbWUgPSBQeU9iamVjdF9SZXByKGNscyk7CiAgICAgfQogICAgIGlmIChuYW1lID09IE5VTEwpCkBAIC0yMDg0LDcgKzIwOTEsNyBAQAogc3RhdGljIGludAogc3VidHlwZV9zZXRkaWN0KFB5T2JqZWN0ICpvYmosIFB5T2JqZWN0ICp2YWx1ZSwgdm9pZCAqY29udGV4dCkKIHsKLSAgICBQeU9iamVjdCAqZGljdCwgKipkaWN0cHRyOworICAgIFB5T2JqZWN0ICoqZGljdHB0cjsKICAgICBQeVR5cGVPYmplY3QgKmJhc2U7CiAKICAgICBiYXNlID0gZ2V0X2J1aWx0aW5fYmFzZV93aXRoX2RpY3QoUHlfVFlQRShvYmopKTsKQEAgLTIxMTUsMTAgKzIxMjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgIm5vdCBhICclLjIwMHMnIiwgUHlfVFlQRSh2YWx1ZSktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGRpY3QgPSAqZGljdHB0cjsKICAgICBQeV9YSU5DUkVGKHZhbHVlKTsKLSAgICAqZGljdHB0ciA9IHZhbHVlOwotICAgIFB5X1hERUNSRUYoZGljdCk7CisgICAgUHlfWFNFVFJFRigqZGljdHB0ciwgdmFsdWUpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNjczLDcgKzI2NzgsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc2hvcnQgc2xvdG9mZnNldHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzaG9ydCBzbG90b2Zmc2V0c1tdID0gewogICAgIC0xLCAvKiBpbnZhbGlkIHNsb3QgKi8KICNpbmNsdWRlICJ0eXBlc2xvdHMuaW5jIgogfTsKQEAgLTM1OTIsNyArMzU5Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGR0bywgUHlUeXBlT2JqZWN0KiBuZXd0bywgY2hhciogYXR0cikKK2NvbXBhdGlibGVfZm9yX2Fzc2lnbm1lbnQoUHlUeXBlT2JqZWN0KiBvbGR0bywgUHlUeXBlT2JqZWN0KiBuZXd0bywgY29uc3QgY2hhciogYXR0cikKIHsKICAgICBQeVR5cGVPYmplY3QgKm5ld2Jhc2UsICpvbGRiYXNlOwogCkBAIC0zODY4LDYgKzM4NzMsMjQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGFzc2VydChzbG90bmFtZXMgPT0gUHlfTm9uZSB8fCBQeUxpc3RfQ2hlY2soc2xvdG5hbWVzKSk7CisgICAgICAgIGlmIChyZXF1aXJlZCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBiYXNpY3NpemUgPSBQeUJhc2VPYmplY3RfVHlwZS50cF9iYXNpY3NpemU7CisgICAgICAgICAgICBpZiAob2JqLT5vYl90eXBlLT50cF9kaWN0b2Zmc2V0KQorICAgICAgICAgICAgICAgIGJhc2ljc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKik7CisgICAgICAgICAgICBpZiAob2JqLT5vYl90eXBlLT50cF93ZWFrbGlzdG9mZnNldCkKKyAgICAgICAgICAgICAgICBiYXNpY3NpemUgKz0gc2l6ZW9mKFB5T2JqZWN0ICopOworICAgICAgICAgICAgaWYgKHNsb3RuYW1lcyAhPSBQeV9Ob25lKQorICAgICAgICAgICAgICAgIGJhc2ljc2l6ZSArPSBzaXplb2YoUHlPYmplY3QgKikgKiBQeV9TSVpFKHNsb3RuYW1lcyk7CisgICAgICAgICAgICBpZiAob2JqLT5vYl90eXBlLT50cF9iYXNpY3NpemUgPiBiYXNpY3NpemUpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc2xvdG5hbWVzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoc3RhdGUpOworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW4ndCBwaWNrbGUgJS4yMDBzIG9iamVjdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9UWVBFKG9iaiktPnRwX25hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaWYgKHNsb3RuYW1lcyAhPSBQeV9Ob25lICYmIFB5X1NJWkUoc2xvdG5hbWVzKSA+IDApIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpzbG90czsKICAgICAgICAgICAgIFB5X3NzaXplX3Qgc2xvdG5hbWVzX3NpemUsIGk7CkBAIC0zOTIyLDcgKzM5NDUsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBJZiB3ZSBmb3VuZCBzb21lIHNsb3QgYXR0cmlidXRlcywgcGFjayB0aGVtIGluIGEgdHVwbGUgYWxvbmcKLSAgICAgICAgICAgICAgIHRoZSBvcmdpbmFsIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LiAqLworICAgICAgICAgICAgICAgdGhlIG9yaWdpbmFsIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LiAqLwogICAgICAgICAgICAgaWYgKFB5RGljdF9TaXplKHNsb3RzKSA+IDApIHsKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3RhdGUyOwogCkBAIC00MDkxLDcgKzQxMTQsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotcmVkdWNlX25ld29iaihQeU9iamVjdCAqb2JqLCBpbnQgcHJvdG8pCityZWR1Y2VfbmV3b2JqKFB5T2JqZWN0ICpvYmopCiB7CiAgICAgUHlPYmplY3QgKmFyZ3MgPSBOVUxMLCAqa3dhcmdzID0gTlVMTDsKICAgICBQeU9iamVjdCAqY29weXJlZzsKQEAgLTQxNDQsNyArNDE2Nyw3IEBACiAgICAgICAgIH0KICAgICAgICAgUHlfWERFQ1JFRihhcmdzKTsKICAgICB9Ci0gICAgZWxzZSBpZiAocHJvdG8gPj0gNCkgeworICAgIGVsc2UgewogICAgICAgICBfUHlfSURFTlRJRklFUihfX25ld29ial9leF9fKTsKIAogICAgICAgICBuZXdvYmogPSBfUHlPYmplY3RfR2V0QXR0cklkKGNvcHlyZWcsICZQeUlkX19fbmV3b2JqX2V4X18pOwpAQCAtNDE2MiwxNiArNDE4NSw2IEBACiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAibXVzdCB1c2UgcHJvdG9jb2wgNCBvciBncmVhdGVyIHRvIGNvcHkgdGhpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0OyBzaW5jZSBfX2dldG5ld2FyZ3NfZXhfXyByZXR1cm5lZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZCBhcmd1bWVudHMuIik7Ci0gICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKLSAgICAgICAgUHlfREVDUkVGKGt3YXJncyk7Ci0gICAgICAgIFB5X0RFQ1JFRihjb3B5cmVnKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCiAgICAgc3RhdGUgPSBfUHlPYmplY3RfR2V0U3RhdGUob2JqLAogICAgICAgICAgICAgICAgICFoYXNhcmdzICYmICFQeUxpc3RfQ2hlY2sob2JqKSAmJiAhUHlEaWN0X0NoZWNrKG9iaikpOwpAQCAtNDIxNyw3ICs0MjMwLDcgQEAKICAgICBQeU9iamVjdCAqY29weXJlZywgKnJlczsKIAogICAgIGlmIChwcm90byA+PSAyKQotICAgICAgICByZXR1cm4gcmVkdWNlX25ld29iaihzZWxmLCBwcm90byk7CisgICAgICAgIHJldHVybiByZWR1Y2VfbmV3b2JqKHNlbGYpOwogCiAgICAgY29weXJlZyA9IGltcG9ydF9jb3B5cmVnKCk7CiAgICAgaWYgKCFjb3B5cmVnKQpAQCAtNTM0OCw3ICs1MzYxLDcgQEAKIC8qIEhlbHBlciB0byBjaGVjayBmb3Igb2JqZWN0Ll9fc2V0YXR0cl9fIG9yIF9fZGVsYXR0cl9fIGFwcGxpZWQgdG8gYSB0eXBlLgogICAgVGhpcyBpcyBjYWxsZWQgdGhlIENhcmxvIFZlcnJlIGhhY2sgYWZ0ZXIgaXRzIGRpc2NvdmVyZXIuICovCiBzdGF0aWMgaW50Ci1oYWNrY2hlY2soUHlPYmplY3QgKnNlbGYsIHNldGF0dHJvZnVuYyBmdW5jLCBjaGFyICp3aGF0KQoraGFja2NoZWNrKFB5T2JqZWN0ICpzZWxmLCBzZXRhdHRyb2Z1bmMgZnVuYywgY29uc3QgY2hhciAqd2hhdCkKIHsKICAgICBQeVR5cGVPYmplY3QgKnR5cGUgPSBQeV9UWVBFKHNlbGYpOwogICAgIHdoaWxlICh0eXBlICYmIHR5cGUtPnRwX2ZsYWdzICYgUHlfVFBGTEFHU19IRUFQVFlQRSkKQEAgLTU3NjgsOCArNTc4MSw4IEBACiAgICAgICAgICAgICBpZiAoYXJncyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCBpdmFsKTsKICAgICAgICAgICAgICAgICByZXR2YWwgPSBQeU9iamVjdF9DYWxsKGZ1bmMsIGFyZ3MsIE5VTEwpOwotICAgICAgICAgICAgICAgIFB5X1hERUNSRUYoYXJncyk7Ci0gICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmdW5jKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGZ1bmMpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvdW5pY29kZW9iamVjdC5jIGIvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKaW5kZXggMWZjYzgzZS4uZGI2YTUxYyAxMDA2NDQKLS0tIGEvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKKysrIGIvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJ1Y25oYXNoLmgiCiAjaW5jbHVkZSAiYnl0ZXNfbWV0aG9kcy5oIgorI2luY2x1ZGUgInN0cmluZ2xpYi9lcS5oIgogCiAjaWZkZWYgTVNfV0lORE9XUwogI2luY2x1ZGUgPHdpbmRvd3MuaD4KQEAgLTE2Miw2ICsxNjMsMTQgQEAKICAgICAgICAgICAgICpfdG8rKyA9ICh0b190eXBlKSAqX2l0ZXIrKzsgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKKyNpZmRlZiBNU19XSU5ET1dTCisgICAvKiBPbiBXaW5kb3dzLCBvdmVyYWxsb2NhdGUgYnkgNTAlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgMgorI2Vsc2UKKyAgIC8qIE9uIExpbnV4LCBvdmVyYWxsb2NhdGUgYnkgMjUlIGlzIHRoZSBiZXN0IGZhY3RvciAqLworIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgNAorI2VuZGlmCisKIC8qIFRoaXMgZGljdGlvbmFyeSBob2xkcyBhbGwgaW50ZXJuZWQgdW5pY29kZSBzdHJpbmdzLiAgTm90ZSB0aGF0IHJlZmVyZW5jZXMKICAgIHRvIHN0cmluZ3MgaW4gdGhpcyBkaWN0aW9uYXJ5IGFyZSAqbm90KiBjb3VudGVkIGluIHRoZSBzdHJpbmcncyBvYl9yZWZjbnQuCiAgICBXaGVuIHRoZSBpbnRlcm5lZCBzdHJpbmcgcmVhY2hlcyBhIHJlZmNudCBvZiAwIHRoZSBzdHJpbmcgZGVhbGxvY2F0aW9uCkBAIC0yNjMsNyArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmVhc29uKTsKIAogLyogU2FtZSBmb3IgbGluZWJyZWFrcyAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNjaWlfbGluZWJyZWFrW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhc2NpaV9saW5lYnJlYWtbXSA9IHsKICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogLyogICAgICAgICAweDAwMEEsICogTElORSBGRUVEICovCiAvKiAgICAgICAgIDB4MDAwQiwgKiBMSU5FIFRBQlVMQVRJT04gKi8KQEAgLTI5Miw2ICszMDEsMzggQEAKIAogI2luY2x1ZGUgImNsaW5pYy91bmljb2Rlb2JqZWN0LmMuaCIKIAordHlwZWRlZiBlbnVtIHsKKyAgICBfUHlfRVJST1JfVU5LTk9XTj0wLAorICAgIF9QeV9FUlJPUl9TVFJJQ1QsCisgICAgX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRSwKKyAgICBfUHlfRVJST1JfUkVQTEFDRSwKKyAgICBfUHlfRVJST1JfSUdOT1JFLAorICAgIF9QeV9FUlJPUl9CQUNLU0xBU0hSRVBMQUNFLAorICAgIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTLAorICAgIF9QeV9FUlJPUl9YTUxDSEFSUkVGUkVQTEFDRSwKKyAgICBfUHlfRVJST1JfT1RIRVIKK30gX1B5X2Vycm9yX2hhbmRsZXI7CisKK3N0YXRpYyBfUHlfZXJyb3JfaGFuZGxlcgorZ2V0X2Vycm9yX2hhbmRsZXIoY29uc3QgY2hhciAqZXJyb3JzKQoreworICAgIGlmIChlcnJvcnMgPT0gTlVMTCB8fCBzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9TVFJJQ1Q7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdXJyb2dhdGVlc2NhcGUiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1NVUlJPR0FURUVTQ0FQRTsKKyAgICBpZiAoc3RyY21wKGVycm9ycywgInJlcGxhY2UiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1JFUExBQ0U7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX0lHTk9SRTsKKyAgICBpZiAoc3RyY21wKGVycm9ycywgImJhY2tzbGFzaHJlcGxhY2UiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX0JBQ0tTTEFTSFJFUExBQ0U7CisgICAgaWYgKHN0cmNtcChlcnJvcnMsICJzdXJyb2dhdGVwYXNzIikgPT0gMCkKKyAgICAgICAgcmV0dXJuIF9QeV9FUlJPUl9TVVJST0dBVEVQQVNTOworICAgIGlmIChzdHJjbXAoZXJyb3JzLCAieG1sY2hhcnJlZnJlcGxhY2UiKSA9PSAwKQorICAgICAgICByZXR1cm4gX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFOworICAgIHJldHVybiBfUHlfRVJST1JfT1RIRVI7Cit9CisKIC8qIFRoZSBtYXggdW5pY29kZSB2YWx1ZSBpcyBhbHdheXMgMHgxMEZGRkYgd2hpbGUgdXNpbmcgdGhlIFBFUC0zOTMgQVBJLgogICAgVGhpcyBmdW5jdGlvbiBpcyBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBBUEkuICovCiBQeV9VTklDT0RFCkBAIC01MjEsNiArNTYyLDEyOSBAQAogICAgICAgICByZXR1cm4gX1B5VW5pY29kZV9Db3B5KHVuaWNvZGUpOwogfQogCisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgImJhY2tzbGFzaHJlcGxhY2UiIGVycm9yIGhhbmRsZXIgZm9yIDgtYml0IGVuY29kaW5nczoKKyAgIEFTQ0lJLCBMYXRpbjEsIFVURi04LCBldGMuICovCitzdGF0aWMgY2hhcioKK2JhY2tzbGFzaHJlcGxhY2UoX1B5Qnl0ZXNXcml0ZXIgKndyaXRlciwgY2hhciAqc3RyLAorICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW5pY29kZSwgUHlfc3NpemVfdCBjb2xsc3RhcnQsIFB5X3NzaXplX3QgY29sbGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IHNpemUsIGk7CisgICAgUHlfVUNTNCBjaDsKKyAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIGFzc2VydChQeVVuaWNvZGVfSVNfUkVBRFkodW5pY29kZSkpOworICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKKyAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7CisKKyAgICBzaXplID0gMDsKKyAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBQeV9zc2l6ZV90IGluY3I7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgaWYgKGNoIDwgMHgxMDApCisgICAgICAgICAgICBpbmNyID0gMisyOworICAgICAgICBlbHNlIGlmIChjaCA8IDB4MTAwMDApCisgICAgICAgICAgICBpbmNyID0gMis0OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7CisgICAgICAgICAgICBpbmNyID0gMis4OworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID4gUFlfU1NJWkVfVF9NQVggLSBpbmNyKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBpbmNyOworICAgIH0KKworICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUod3JpdGVyLCBzdHIsIHNpemUpOworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOworICAgICAgICAqc3RyKysgPSAnXFwnOworICAgICAgICBpZiAoY2ggPj0gMHgwMDAxMDAwMCkgeworICAgICAgICAgICAgKnN0cisrID0gJ1UnOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MjgpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4yNCkmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjIwKSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+MTYpJjB4Zl07CisgICAgICAgICAgICAqc3RyKysgPSBQeV9oZXhkaWdpdHNbKGNoPj4xMikmMHhmXTsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjgpJjB4Zl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY2ggPj0gMHgxMDApIHsKKyAgICAgICAgICAgICpzdHIrKyA9ICd1JzsKKyAgICAgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjEyKSYweGZdOworICAgICAgICAgICAgKnN0cisrID0gUHlfaGV4ZGlnaXRzWyhjaD4+OCkmMHhmXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqc3RyKysgPSAneCc7CisgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1soY2g+PjQpJjB4Zl07CisgICAgICAgICpzdHIrKyA9IFB5X2hleGRpZ2l0c1tjaCYweGZdOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgInhtbGNoYXJyZWZyZXBsYWNlIiBlcnJvciBoYW5kbGVyIGZvciA4LWJpdCBlbmNvZGluZ3M6CisgICBBU0NJSSwgTGF0aW4xLCBVVEYtOCwgZXRjLiAqLworc3RhdGljIGNoYXIqCit4bWxjaGFycmVmcmVwbGFjZShfUHlCeXRlc1dyaXRlciAqd3JpdGVyLCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdW5pY29kZSwgUHlfc3NpemVfdCBjb2xsc3RhcnQsIFB5X3NzaXplX3QgY29sbGVuZCkKK3sKKyAgICBQeV9zc2l6ZV90IHNpemUsIGk7CisgICAgUHlfVUNTNCBjaDsKKyAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQ7CisgICAgdm9pZCAqZGF0YTsKKworICAgIGFzc2VydChQeVVuaWNvZGVfSVNfUkVBRFkodW5pY29kZSkpOworICAgIGtpbmQgPSBQeVVuaWNvZGVfS0lORCh1bmljb2RlKTsKKyAgICBkYXRhID0gUHlVbmljb2RlX0RBVEEodW5pY29kZSk7CisKKyAgICBzaXplID0gMDsKKyAgICAvKiBkZXRlcm1pbmUgcmVwbGFjZW1lbnQgc2l6ZSAqLworICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICBQeV9zc2l6ZV90IGluY3I7CisKKyAgICAgICAgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKKyAgICAgICAgaWYgKGNoIDwgMTApCisgICAgICAgICAgICBpbmNyID0gMisxKzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwKQorICAgICAgICAgICAgaW5jciA9IDIrMisxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDApCisgICAgICAgICAgICBpbmNyID0gMiszKzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDApCisgICAgICAgICAgICBpbmNyID0gMis0KzE7CisgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwKQorICAgICAgICAgICAgaW5jciA9IDIrNSsxOworICAgICAgICBlbHNlIGlmIChjaCA8IDEwMDAwMDApCisgICAgICAgICAgICBpbmNyID0gMis2KzE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKyAgICAgICAgICAgIGluY3IgPSAyKzcrMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gaW5jcikgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kZWQgcmVzdWx0IGlzIHRvbyBsb25nIGZvciBhIFB5dGhvbiBzdHJpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gaW5jcjsKKyAgICB9CisKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKHdyaXRlciwgc3RyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KKyAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKKyAgICAgICAgc3RyICs9IHNwcmludGYoc3RyLCAiJiMlZDsiLCBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSk7CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKIC8qIC0tLSBCbG9vbSBGaWx0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIHN0dWZmIHRvIGltcGxlbWVudCBzaW1wbGUgImJsb29tIGZpbHRlcnMiIGZvciBVbmljb2RlIGNoYXJhY3RlcnMuCkBAIC01ODcsNiArNzUxLDE4IEBACiAjdW5kZWYgQkxPT01fVVBEQVRFCiB9CiAKK3N0YXRpYyBpbnQKK2Vuc3VyZV91bmljb2RlKFB5T2JqZWN0ICpvYmopCit7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIFB5VW5pY29kZV9SRUFEWShvYmopOworfQorCiAvKiBDb21waWxhdGlvbiBvZiB0ZW1wbGF0ZWQgcm91dGluZXMgKi8KIAogI2luY2x1ZGUgInN0cmluZ2xpYi9hc2NpaWxpYi5oIgpAQCAtNjQ3LDI3ICs4MjMsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsIFB5X1VDUzQgY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKIHsKLSAgICBpbnQgbW9kZSA9IChkaXJlY3Rpb24gPT0gMSkgPyBGQVNUX1NFQVJDSCA6IEZBU1RfUlNFQVJDSDsKLQogICAgIHN3aXRjaCAoa2luZCkgewogICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFB5X1VDUzEgY2gxID0gKFB5X1VDUzEpIGNoOwotICAgICAgICAgICAgaWYgKGNoMSA9PSBjaCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdWNzMWxpYl9mYXN0c2VhcmNoKChQeV9VQ1MxICopIHMsIHNpemUsICZjaDEsIDEsIDAsIG1vZGUpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQorICAgICAgICBpZiAoKFB5X1VDUzEpIGNoICE9IGNoKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoZGlyZWN0aW9uID4gMCkKKyAgICAgICAgICAgIHJldHVybiB1Y3MxbGliX2ZpbmRfY2hhcigoUHlfVUNTMSAqKSBzLCBzaXplLCAoUHlfVUNTMSkgY2gpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gdWNzMWxpYl9yZmluZF9jaGFyKChQeV9VQ1MxICopIHMsIHNpemUsIChQeV9VQ1MxKSBjaCk7CiAgICAgY2FzZSBQeVVuaWNvZGVfMkJZVEVfS0lORDoKLSAgICAgICAgewotICAgICAgICAgICAgUHlfVUNTMiBjaDIgPSAoUHlfVUNTMikgY2g7Ci0gICAgICAgICAgICBpZiAoY2gyID09IGNoKQotICAgICAgICAgICAgICAgIHJldHVybiB1Y3MybGliX2Zhc3RzZWFyY2goKFB5X1VDUzIgKikgcywgc2l6ZSwgJmNoMiwgMSwgMCwgbW9kZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgICAgIGlmICgoUHlfVUNTMikgY2ggIT0gY2gpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPiAwKQorICAgICAgICAgICAgcmV0dXJuIHVjczJsaWJfZmluZF9jaGFyKChQeV9VQ1MyICopIHMsIHNpemUsIChQeV9VQ1MyKSBjaCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiB1Y3MybGliX3JmaW5kX2NoYXIoKFB5X1VDUzIgKikgcywgc2l6ZSwgKFB5X1VDUzIpIGNoKTsKICAgICBjYXNlIFB5VW5pY29kZV80QllURV9LSU5EOgotICAgICAgICByZXR1cm4gdWNzNGxpYl9mYXN0c2VhcmNoKChQeV9VQ1M0ICopIHMsIHNpemUsICZjaCwgMSwgMCwgbW9kZSk7CisgICAgICAgIGlmIChkaXJlY3Rpb24gPiAwKQorICAgICAgICAgICAgcmV0dXJuIHVjczRsaWJfZmluZF9jaGFyKChQeV9VQ1M0ICopIHMsIHNpemUsIGNoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHVjczRsaWJfcmZpbmRfY2hhcigoUHlfVUNTNCAqKSBzLCBzaXplLCBjaCk7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXNzZXJ0KDApOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yOTAzLDcgKzMwNzgsNyBAQAogICAgIC8qIFJldHJpZXZlIGEgYnl0ZXMgYnVmZmVyIHZpZXcgdGhyb3VnaCB0aGUgUEVQIDMxMTggYnVmZmVyIGludGVyZmFjZSAqLwogICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqLCAmYnVmZmVyLCBQeUJVRl9TSU1QTEUpIDwgMCkgewogICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgImNvZXJjaW5nIHRvIHN0cjogbmVlZCBhIGJ5dGVzLWxpa2Ugb2JqZWN0LCAlLjgwcyBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAiZGVjb2RpbmcgdG8gc3RyOiBuZWVkIGEgYnl0ZXMtbGlrZSBvYmplY3QsICUuODBzIGZvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUob2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTMxNjcsMjQgKzMzNDIsMjIgQEAKIHN0YXRpYyBpbnQKIGxvY2FsZV9lcnJvcl9oYW5kbGVyKGNvbnN0IGNoYXIgKmVycm9ycywgaW50ICpzdXJyb2dhdGVlc2NhcGUpCiB7Ci0gICAgaWYgKGVycm9ycyA9PSBOVUxMKSB7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisgICAgc3dpdGNoIChlcnJvcl9oYW5kbGVyKQorICAgIHsKKyAgICBjYXNlIF9QeV9FUlJPUl9TVFJJQ1Q6CiAgICAgICAgICpzdXJyb2dhdGVlc2NhcGUgPSAwOwogICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoc3RyY21wKGVycm9ycywgInN0cmljdCIpID09IDApIHsKLSAgICAgICAgKnN1cnJvZ2F0ZWVzY2FwZSA9IDA7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpZiAoc3RyY21wKGVycm9ycywgInN1cnJvZ2F0ZWVzY2FwZSIpID09IDApIHsKKyAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CiAgICAgICAgICpzdXJyb2dhdGVlc2NhcGUgPSAxOwogICAgICAgICByZXR1cm4gMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJvbmx5ICdzdHJpY3QnIGFuZCAnc3Vycm9nYXRlZXNjYXBlJyBlcnJvciBoYW5kbGVycyAiCisgICAgICAgICAgICAgICAgICAgICAiYXJlIHN1cHBvcnRlZCwgbm90ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgIm9ubHkgJ3N0cmljdCcgYW5kICdzdXJyb2dhdGVlc2NhcGUnIGVycm9yIGhhbmRsZXJzICIKLSAgICAgICAgICAgICAgICAgImFyZSBzdXBwb3J0ZWQsIG5vdCAnJXMnIiwKLSAgICAgICAgICAgICAgICAgZXJyb3JzKTsKLSAgICByZXR1cm4gLTE7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTM2MjYsMTkgKzM3OTksMTcgQEAKICAgICAgICAgb3V0cHV0ID0gYXJnOwogICAgICAgICBQeV9JTkNSRUYob3V0cHV0KTsKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFyZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KGFyZyk7Ci0gICAgICAgIGlmICghYXJnKQotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKICAgICAgICAgb3V0cHV0ID0gUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdChhcmcpOwotICAgICAgICBQeV9ERUNSRUYoYXJnKTsKICAgICAgICAgaWYgKCFvdXRwdXQpCiAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKG91dHB1dCkpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihvdXRwdXQpOwotICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBieXRlcyIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2sob3V0cHV0KSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyIG9yIGJ5dGVzLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBzaXplID0gUHlCeXRlc19HRVRfU0laRShvdXRwdXQpOwogICAgIGRhdGEgPSBQeUJ5dGVzX0FTX1NUUklORyhvdXRwdXQpOwpAQCAtMzcxNiw3ICszODg3LDcgQEAKIAogICAgIGlmIChQeVVuaWNvZGVfVVRGOCh1bmljb2RlKSA9PSBOVUxMKSB7CiAgICAgICAgIGFzc2VydCghUHlVbmljb2RlX0lTX0NPTVBBQ1RfQVNDSUkodW5pY29kZSkpOwotICAgICAgICBieXRlcyA9IF9QeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHVuaWNvZGUsICJzdHJpY3QiKTsKKyAgICAgICAgYnl0ZXMgPSBfUHlVbmljb2RlX0FzVVRGOFN0cmluZyh1bmljb2RlLCBOVUxMKTsKICAgICAgICAgaWYgKGJ5dGVzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgX1B5VW5pY29kZV9VVEY4KHVuaWNvZGUpID0gUHlPYmplY3RfTUFMTE9DKFB5Qnl0ZXNfR0VUX1NJWkUoYnl0ZXMpICsgMSk7CkBAIC0zOTgyLDcgKzQxNTMsNyBAQAogICAgIFB5X3NzaXplX3QgKmVuZGlucG9zLCBQeU9iamVjdCAqKmV4Y2VwdGlvbk9iamVjdCwgY29uc3QgY2hhciAqKmlucHRyLAogICAgIFB5T2JqZWN0ICoqb3V0cHV0LCBQeV9zc2l6ZV90ICpvdXRwb3MpCiB7Ci0gICAgc3RhdGljIGNoYXIgKmFyZ3BhcnNlID0gIk8hbjtkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphcmdwYXJzZSA9ICJPIW47ZGVjb2RpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKIAogICAgIFB5T2JqZWN0ICpyZXN0dXBsZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnJlcHVuaWNvZGUgPSBOVUxMOwpAQCAtNDA5MCw3ICs0MjYxLDcgQEAKICAgICBQeV9zc2l6ZV90ICplbmRpbnBvcywgUHlPYmplY3QgKipleGNlcHRpb25PYmplY3QsIGNvbnN0IGNoYXIgKippbnB0ciwKICAgICBfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIgLyogUHlPYmplY3QgKipvdXRwdXQsIFB5X3NzaXplX3QgKm91dHBvcyAqLykKIHsKLSAgICBzdGF0aWMgY2hhciAqYXJncGFyc2UgPSAiTyFuO2RlY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ciwgaW50KSB0dXBsZSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3BhcnNlID0gIk8hbjtkZWNvZGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOwogCiAgICAgUHlPYmplY3QgKnJlc3R1cGxlID0gTlVMTDsKICAgICBQeU9iamVjdCAqcmVwdW5pY29kZSA9IE5VTEw7CkBAIC00Njk2LDggKzQ4NjcsOSBAQAogICAgIFB5X3NzaXplX3Qgc3RhcnRpbnBvczsKICAgICBQeV9zc2l6ZV90IGVuZGlucG9zOwogICAgIGNvbnN0IGNoYXIgKmVycm1zZyA9ICIiOwotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CisgICAgX1B5X2Vycm9yX2hhbmRsZXIgZXJyb3JfaGFuZGxlciA9IF9QeV9FUlJPUl9VTktOT1dOOwogCiAgICAgaWYgKHNpemUgPT0gMCkgewogICAgICAgICBpZiAoY29uc3VtZWQpCkBAIC00NzIyLDYgKzQ4OTQsNyBAQAogICAgIHdoaWxlIChzIDwgZW5kKSB7CiAgICAgICAgIFB5X1VDUzQgY2g7CiAgICAgICAgIGludCBraW5kID0gd3JpdGVyLmtpbmQ7CisKICAgICAgICAgaWYgKGtpbmQgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpIHsKICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfSVNfQVNDSUkod3JpdGVyLmJ1ZmZlcikpCiAgICAgICAgICAgICAgICAgY2ggPSBhc2NpaWxpYl91dGY4X2RlY29kZSgmcywgZW5kLCB3cml0ZXIuZGF0YSwgJndyaXRlci5wb3MpOwpAQCAtNDc2MCwyNCArNDkzMyw1NiBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXJfd3JpdGVyKAotICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKLSAgICAgICAgICAgICAgICAidXRmLTgiLCBlcnJtc2csCi0gICAgICAgICAgICAgICAgJnN0YXJ0cywgJmVuZCwgJnN0YXJ0aW5wb3MsICZlbmRpbnBvcywgJmV4YywgJnMsCi0gICAgICAgICAgICAgICAgJndyaXRlcikpCi0gICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIGlmIChlcnJvcl9oYW5kbGVyID09IF9QeV9FUlJPUl9VTktOT1dOKQorICAgICAgICAgICAgZXJyb3JfaGFuZGxlciA9IGdldF9lcnJvcl9oYW5kbGVyKGVycm9ycyk7CisKKyAgICAgICAgc3dpdGNoIChlcnJvcl9oYW5kbGVyKSB7CisgICAgICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKKyAgICAgICAgICAgIHMgKz0gKGVuZGlucG9zIC0gc3RhcnRpbnBvcyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF9QeV9FUlJPUl9SRVBMQUNFOgorICAgICAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfV3JpdGVDaGFySW5saW5lKCZ3cml0ZXIsIDB4ZmZmZCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKyAgICAgICAgICAgIHMgKz0gKGVuZGlucG9zIC0gc3RhcnRpbnBvcyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVVJST0dBVEVFU0NBUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKKworICAgICAgICAgICAgaWYgKF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUtpbmQoJndyaXRlciwgUHlVbmljb2RlXzJCWVRFX0tJTkQpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICBmb3IgKGk9c3RhcnRpbnBvczsgaTxlbmRpbnBvczsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2ggPSAoUHlfVUNTNCkodW5zaWduZWQgY2hhcikoc3RhcnRzW2ldKTsKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfV1JJVEUod3JpdGVyLmtpbmQsIHdyaXRlci5kYXRhLCB3cml0ZXIucG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCArIDB4ZGMwMCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLnBvcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyArPSAoZW5kaW5wb3MgLSBzdGFydGlucG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcl93cml0ZXIoCisgICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9yX2hhbmRsZXJfb2JqLAorICAgICAgICAgICAgICAgICAgICAidXRmLTgiLCBlcnJtc2csCisgICAgICAgICAgICAgICAgICAgICZzdGFydHMsICZlbmQsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAorICAgICAgICAgICAgICAgICAgICAmd3JpdGVyKSkKKyAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgIH0KICAgICB9CiAKIEVuZDoKICAgICBpZiAoY29uc3VtZWQpCiAgICAgICAgICpjb25zdW1lZCA9IHMgLSBzdGFydHM7CiAKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgUHlfWERFQ1JFRihleGMpOwogICAgIHJldHVybiBfUHlVbmljb2RlV3JpdGVyX0ZpbmlzaCgmd3JpdGVyKTsKIAogb25FcnJvcjoKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgUHlfWERFQ1JFRihleGMpOwogICAgIF9QeVVuaWNvZGVXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKICAgICByZXR1cm4gTlVMTDsKQEAgLTU4NjgsMTEgKzYwNzMsMTAgQEAKIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoUHlPYmplY3QgKnVuaWNvZGUpCiB7CiAgICAgUHlfc3NpemVfdCBpLCBsZW47Ci0gICAgUHlPYmplY3QgKnJlcHI7CiAgICAgY2hhciAqcDsKICAgICBpbnQga2luZDsKICAgICB2b2lkICpkYXRhOwotICAgIFB5X3NzaXplX3QgZXhwYW5kc2l6ZSA9IDA7CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgLyogSW5pdGlhbCBhbGxvY2F0aW9uIGlzIGJhc2VkIG9uIHRoZSBsb25nZXN0LXBvc3NpYmxlIGNoYXJhY3RlcgogICAgICAgIGVzY2FwZS4KQEAgLTU4ODgsMzUgKzYwOTIsMjggQEAKICAgICB9CiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWSh1bmljb2RlKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworCiAgICAgbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodW5pY29kZSk7CiAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHVuaWNvZGUpOwogICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQSh1bmljb2RlKTsKLSAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOiBleHBhbmRzaXplID0gNDsgYnJlYWs7Ci0gICAgY2FzZSBQeVVuaWNvZGVfMkJZVEVfS0lORDogZXhwYW5kc2l6ZSA9IDY7IGJyZWFrOwotICAgIGNhc2UgUHlVbmljb2RlXzRCWVRFX0tJTkQ6IGV4cGFuZHNpemUgPSAxMDsgYnJlYWs7Ci0gICAgfQogCi0gICAgaWYgKGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCAwKTsKLQotICAgIGlmIChsZW4gPiAoUFlfU1NJWkVfVF9NQVggLSAyIC0gMSkgLyBleHBhbmRzaXplKQotICAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKLQotICAgIHJlcHIgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXhwYW5kc2l6ZSpsZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEpOwotICAgIGlmIChyZXByID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcCA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpOworICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBsZW4pOworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IDE7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwogCiAgICAgICAgIC8qIEVzY2FwZSBiYWNrc2xhc2hlcyAqLwogICAgICAgICBpZiAoY2ggPT0gJ1xcJykgeworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAyLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTU5MjUsNiArNjEyMiwxMSBAQAogICAgICAgICAvKiBNYXAgMjEtYml0IGNoYXJhY3RlcnMgdG8gJ1xVMDB4eHh4eHgnICovCiAgICAgICAgIGVsc2UgaWYgKGNoID49IDB4MTAwMDApIHsKICAgICAgICAgICAgIGFzc2VydChjaCA8PSBNQVhfVU5JQ09ERSk7CisKKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDEwLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAnVSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAyOCkgJiAweDAwMDAwMDBGXTsKQEAgLTU5NDAsNiArNjE0MiwxMCBAQAogCiAgICAgICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLwogICAgICAgICBpZiAoY2ggPj0gMjU2KSB7CisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCA2LTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAndSc7CiAgICAgICAgICAgICAqcCsrID0gUHlfaGV4ZGlnaXRzWyhjaCA+PiAxMikgJiAweDAwMEZdOwpAQCAtNTk1MCwyMCArNjE1NiwzNyBAQAogCiAgICAgICAgIC8qIE1hcCBzcGVjaWFsIHdoaXRlc3BhY2UgdG8gJ1x0JywgXG4nLCAnXHInICovCiAgICAgICAgIGVsc2UgaWYgKGNoID09ICdcdCcpIHsKKyAgICAgICAgICAgIHAgPSBfUHlCeXRlc1dyaXRlcl9QcmVwYXJlKCZ3cml0ZXIsIHAsIDItMSk7CisgICAgICAgICAgICBpZiAocCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICAgICAgICAgICpwKysgPSAnXFwnOwogICAgICAgICAgICAgKnArKyA9ICd0JzsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChjaCA9PSAnXG4nKSB7CisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAyLTEpOworICAgICAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCiAgICAgICAgICAgICAqcCsrID0gJ1xcJzsKICAgICAgICAgICAgICpwKysgPSAnbic7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ1xyJykgeworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgMi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3InOwogICAgICAgICB9CiAKICAgICAgICAgLyogTWFwIG5vbi1wcmludGFibGUgVVMgQVNDSUkgdG8gJ1x4aGgnICovCiAgICAgICAgIGVsc2UgaWYgKGNoIDwgJyAnIHx8IGNoID49IDB4N0YpIHsKKyAgICAgICAgICAgIC8qIC0xOiBzdWJzdHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgNC0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3gnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gNCkgJiAweDAwMEZdOwpAQCAtNTk3NSwxMCArNjE5OCwxMSBAQAogICAgICAgICAgICAgKnArKyA9IChjaGFyKSBjaDsKICAgICB9CiAKLSAgICBhc3NlcnQocCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpID4gMCk7Ci0gICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVwciwgcCAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpKSA8IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiByZXByOworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgcCk7CisKK2Vycm9yOgorICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTYxMDcsMTMgKzYzMzEsMTIgQEAKIFB5T2JqZWN0ICoKIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoUHlPYmplY3QgKnVuaWNvZGUpCiB7Ci0gICAgUHlPYmplY3QgKnJlcHI7CiAgICAgY2hhciAqcDsKLSAgICBjaGFyICpxOwotICAgIFB5X3NzaXplX3QgZXhwYW5kc2l6ZSwgcG9zOworICAgIFB5X3NzaXplX3QgcG9zOwogICAgIGludCBraW5kOwogICAgIHZvaWQgKmRhdGE7CiAgICAgUHlfc3NpemVfdCBsZW47CisgICAgX1B5Qnl0ZXNXcml0ZXIgd3JpdGVyOwogCiAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sodW5pY29kZSkpIHsKICAgICAgICAgUHlFcnJfQmFkQXJndW1lbnQoKTsKQEAgLTYxMjEsMjggKzYzNDQsMjkgQEAKICAgICB9CiAgICAgaWYgKFB5VW5pY29kZV9SRUFEWSh1bmljb2RlKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBfUHlCeXRlc1dyaXRlcl9Jbml0KCZ3cml0ZXIpOworCiAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHVuaWNvZGUpOwogICAgIGRhdGEgPSBQeVVuaWNvZGVfREFUQSh1bmljb2RlKTsKICAgICBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSCh1bmljb2RlKTsKLSAgICAvKiA0IGJ5dGUgY2hhcmFjdGVycyBjYW4gdGFrZSB1cCAxMCBieXRlcywgMiBieXRlIGNoYXJhY3RlcnMgY2FuIHRha2UgdXAgNgotICAgICAgIGJ5dGVzLCBhbmQgMSBieXRlIGNoYXJhY3RlcnMgNC4gKi8KLSAgICBleHBhbmRzaXplID0ga2luZCAqIDIgKyAyOwogCi0gICAgaWYgKGxlbiA+IFBZX1NTSVpFX1RfTUFYIC8gZXhwYW5kc2l6ZSkKLSAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX0FsbG9jKCZ3cml0ZXIsIGxlbik7CisgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB3cml0ZXIub3ZlcmFsbG9jYXRlID0gMTsKIAotICAgIHJlcHIgPSBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIGV4cGFuZHNpemUgKiBsZW4pOwotICAgIGlmIChyZXByID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChsZW4gPT0gMCkKLSAgICAgICAgcmV0dXJuIHJlcHI7Ci0KLSAgICBwID0gcSA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcHIpOwogICAgIGZvciAocG9zID0gMDsgcG9zIDwgbGVuOyBwb3MrKykgewogICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgcG9zKTsKICAgICAgICAgLyogTWFwIDMyLWJpdCBjaGFyYWN0ZXJzIHRvICdcVXh4eHh4eHh4JyAqLwogICAgICAgICBpZiAoY2ggPj0gMHgxMDAwMCkgewogICAgICAgICAgICAgYXNzZXJ0KGNoIDw9IE1BWF9VTklDT0RFKTsKKworICAgICAgICAgICAgLyogLTE6IHN1YnN0cmFjdCAxIHByZWFsbG9jYXRlZCBieXRlICovCisgICAgICAgICAgICBwID0gX1B5Qnl0ZXNXcml0ZXJfUHJlcGFyZSgmd3JpdGVyLCBwLCAxMC0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ1UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMjgpICYgMHhmXTsKQEAgLTYxNTYsNiArNjM4MCwxMSBAQAogICAgICAgICB9CiAgICAgICAgIC8qIE1hcCAxNi1iaXQgY2hhcmFjdGVycyB0byAnXHV4eHh4JyAqLwogICAgICAgICBlbHNlIGlmIChjaCA+PSAyNTYpIHsKKyAgICAgICAgICAgIC8qIC0xOiBzdWJzdHJhY3QgMSBwcmVhbGxvY2F0ZWQgYnl0ZSAqLworICAgICAgICAgICAgcCA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgcCwgNi0xKTsKKyAgICAgICAgICAgIGlmIChwID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgICAgICAqcCsrID0gJ3UnOwogICAgICAgICAgICAgKnArKyA9IFB5X2hleGRpZ2l0c1soY2ggPj4gMTIpICYgMHhmXTsKQEAgLTYxNjgsMTAgKzYzOTcsMTEgQEAKICAgICAgICAgICAgICpwKysgPSAoY2hhcikgY2g7CiAgICAgfQogCi0gICAgYXNzZXJ0KHAgPiBxKTsKLSAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXByLCBwIC0gcSkgPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gcmVwcjsKKyAgICByZXR1cm4gX1B5Qnl0ZXNXcml0ZXJfRmluaXNoKCZ3cml0ZXIsIHApOworCitlcnJvcjoKKyAgICBfUHlCeXRlc1dyaXRlcl9EZWFsbG9jKCZ3cml0ZXIpOworICAgIHJldHVybiBOVUxMOwogfQogCiBQeU9iamVjdCAqCkBAIC02MzQ4LDcgKzY1NzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBlbmRwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpuZXdwb3MpCiB7Ci0gICAgc3RhdGljIGNoYXIgKmFyZ3BhcnNlID0gIk9uO2VuY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ci9ieXRlcywgaW50KSB0dXBsZSI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmFyZ3BhcnNlID0gIk9uO2VuY29kaW5nIGVycm9yIGhhbmRsZXIgbXVzdCByZXR1cm4gKHN0ci9ieXRlcywgaW50KSB0dXBsZSI7CiAgICAgUHlfc3NpemVfdCBsZW47CiAgICAgUHlPYmplY3QgKnJlc3R1cGxlOwogICAgIFB5T2JqZWN0ICpyZXN1bmljb2RlOwpAQCAtNjQwMiwyNSArNjYzMiwyMiBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHVuaWNvZGVfZW5jb2RlX3VjczEoUHlPYmplY3QgKnVuaWNvZGUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycywKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxpbWl0KQorICAgICAgICAgICAgICAgICAgICBjb25zdCBQeV9VQ1M0IGxpbWl0KQogewogICAgIC8qIGlucHV0IHN0YXRlICovCiAgICAgUHlfc3NpemVfdCBwb3M9MCwgc2l6ZTsKICAgICBpbnQga2luZDsKICAgICB2b2lkICpkYXRhOwotICAgIC8qIG91dHB1dCBvYmplY3QgKi8KLSAgICBQeU9iamVjdCAqcmVzOwogICAgIC8qIHBvaW50ZXIgaW50byB0aGUgb3V0cHV0ICovCiAgICAgY2hhciAqc3RyOwotICAgIC8qIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uICovCi0gICAgUHlfc3NpemVfdCByZXNzaXplOwogICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nID0gKGxpbWl0ID09IDI1NikgPyAibGF0aW4tMSIgOiAiYXNjaWkiOwogICAgIGNvbnN0IGNoYXIgKnJlYXNvbiA9IChsaW1pdCA9PSAyNTYpID8gIm9yZGluYWwgbm90IGluIHJhbmdlKDI1NikiIDogIm9yZGluYWwgbm90IGluIHJhbmdlKDEyOCkiOwotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7Ci0gICAgLyogdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBpcyB1c2VkIGZvciBjYWNoaW5nIHN0cmluZyBjb21wYXJpc29ucwotICAgICAqIC0xPW5vdCBpbml0aWFsaXplZCwgMD11bmtub3duLCAxPXN0cmljdCwgMj1yZXBsYWNlLCAzPWlnbm9yZSwgND14bWxjaGFycmVmcmVwbGFjZSAqLwotICAgIGludCBrbm93bl9lcnJvckhhbmRsZXIgPSAtMTsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gX1B5X0VSUk9SX1VOS05PV047CisgICAgUHlPYmplY3QgKnJlcCA9IE5VTEw7CisgICAgLyogb3V0cHV0IG9iamVjdCAqLworICAgIF9QeUJ5dGVzV3JpdGVyIHdyaXRlcjsKIAogICAgIGlmIChQeVVuaWNvZGVfUkVBRFkodW5pY29kZSkgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjQzMSwxODYgKzY2NTgsMTU3IEBACiAgICAgICAgcmVwbGFjZW1lbnRzLCBpZiB3ZSBuZWVkIG1vcmUsIHdlJ2xsIHJlc2l6ZSAqLwogICAgIGlmIChzaXplID09IDApCiAgICAgICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIDApOwotICAgIHJlcyA9IFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSk7Ci0gICAgaWYgKHJlcyA9PSBOVUxMKQorCisgICAgX1B5Qnl0ZXNXcml0ZXJfSW5pdCgmd3JpdGVyKTsKKyAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9BbGxvYygmd3JpdGVyLCBzaXplKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcyk7Ci0gICAgcmVzc2l6ZSA9IHNpemU7CiAKICAgICB3aGlsZSAocG9zIDwgc2l6ZSkgewotICAgICAgICBQeV9VQ1M0IGMgPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBwb3MpOworICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgcG9zKTsKIAogICAgICAgICAvKiBjYW4gd2UgZW5jb2RlIHRoaXM/ICovCi0gICAgICAgIGlmIChjPGxpbWl0KSB7CisgICAgICAgIGlmIChjaCA8IGxpbWl0KSB7CiAgICAgICAgICAgICAvKiBubyBvdmVyZmxvdyBjaGVjaywgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlIHNwYWNlIGlzIGVub3VnaCAqLwotICAgICAgICAgICAgKnN0cisrID0gKGNoYXIpYzsKKyAgICAgICAgICAgICpzdHIrKyA9IChjaGFyKWNoOwogICAgICAgICAgICAgKytwb3M7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQeV9zc2l6ZV90IHJlcXVpcmVkc2l6ZTsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpyZXB1bmljb2RlOwotICAgICAgICAgICAgUHlfc3NpemVfdCByZXBzaXplLCBuZXdwb3MsIHJlc3BvcywgaTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbmV3cG9zLCBpOwogICAgICAgICAgICAgLyogc3RhcnRwb3MgZm9yIGNvbGxlY3RpbmcgdW5lbmNvZGFibGUgY2hhcnMgKi8KICAgICAgICAgICAgIFB5X3NzaXplX3QgY29sbHN0YXJ0ID0gcG9zOwotICAgICAgICAgICAgUHlfc3NpemVfdCBjb2xsZW5kID0gcG9zOworICAgICAgICAgICAgUHlfc3NpemVfdCBjb2xsZW5kID0gY29sbHN0YXJ0ICsgMTsKICAgICAgICAgICAgIC8qIGZpbmQgYWxsIHVuZWNvZGFibGUgY2hhcmFjdGVycyAqLworCiAgICAgICAgICAgICB3aGlsZSAoKGNvbGxlbmQgPCBzaXplKSAmJiAoUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgY29sbGVuZCkgPj0gbGltaXQpKQogICAgICAgICAgICAgICAgICsrY29sbGVuZDsKKworICAgICAgICAgICAgLyogT25seSBvdmVyYWxsb2NhdGUgdGhlIGJ1ZmZlciBpZiBpdCdzIG5vdCB0aGUgbGFzdCB3cml0ZSAqLworICAgICAgICAgICAgd3JpdGVyLm92ZXJhbGxvY2F0ZSA9IChjb2xsZW5kIDwgc2l6ZSk7CisKICAgICAgICAgICAgIC8qIGNhY2hlIGNhbGxiYWNrIG5hbWUgbG9va3VwIChpZiBub3QgZG9uZSB5ZXQsIGkuZS4gaXQncyB0aGUgZmlyc3QgZXJyb3IpICovCi0gICAgICAgICAgICBpZiAoa25vd25fZXJyb3JIYW5kbGVyPT0tMSkgewotICAgICAgICAgICAgICAgIGlmICgoZXJyb3JzPT1OVUxMKSB8fCAoIXN0cmNtcChlcnJvcnMsICJzdHJpY3QiKSkpCi0gICAgICAgICAgICAgICAgICAgIGtub3duX2Vycm9ySGFuZGxlciA9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJyZXBsYWNlIikpCi0gICAgICAgICAgICAgICAgICAgIGtub3duX2Vycm9ySGFuZGxlciA9IDI7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJpZ25vcmUiKSkKLSAgICAgICAgICAgICAgICAgICAga25vd25fZXJyb3JIYW5kbGVyID0gMzsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGVycm9ycywgInhtbGNoYXJyZWZyZXBsYWNlIikpCi0gICAgICAgICAgICAgICAgICAgIGtub3duX2Vycm9ySGFuZGxlciA9IDQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBrbm93bl9lcnJvckhhbmRsZXIgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChrbm93bl9lcnJvckhhbmRsZXIpIHsKLSAgICAgICAgICAgIGNhc2UgMTogLyogc3RyaWN0ICovCisgICAgICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgICAgICAgICBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKworICAgICAgICAgICAgc3dpdGNoIChlcnJvcl9oYW5kbGVyKSB7CisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9TVFJJQ1Q6CiAgICAgICAgICAgICAgICAgcmFpc2VfZW5jb2RlX2V4Y2VwdGlvbigmZXhjLCBlbmNvZGluZywgdW5pY29kZSwgY29sbHN0YXJ0LCBjb2xsZW5kLCByZWFzb24pOwogICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIGNhc2UgMjogLyogcmVwbGFjZSAqLwotICAgICAgICAgICAgICAgIHdoaWxlIChjb2xsc3RhcnQrKyA8IGNvbGxlbmQpCi0gICAgICAgICAgICAgICAgICAgICpzdHIrKyA9ICc/JzsgLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICBjYXNlIDM6IC8qIGlnbm9yZSAqLworCisgICAgICAgICAgICBjYXNlIF9QeV9FUlJPUl9SRVBMQUNFOgorICAgICAgICAgICAgICAgIG1lbXNldChzdHIsICc/JywgY29sbGVuZCAtIGNvbGxzdGFydCk7CisgICAgICAgICAgICAgICAgc3RyICs9IChjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggaWdub3JlIGVycm9yIGhhbmRsZXIgKi8KKyAgICAgICAgICAgIGNhc2UgX1B5X0VSUk9SX0lHTk9SRToKICAgICAgICAgICAgICAgICBwb3MgPSBjb2xsZW5kOwogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OiAvKiB4bWxjaGFycmVmcmVwbGFjZSAqLwotICAgICAgICAgICAgICAgIHJlc3BvcyA9IHN0ciAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcyk7Ci0gICAgICAgICAgICAgICAgcmVxdWlyZWRzaXplID0gcmVzcG9zOwotICAgICAgICAgICAgICAgIC8qIGRldGVybWluZSByZXBsYWNlbWVudCBzaXplICovCi0gICAgICAgICAgICAgICAgZm9yIChpID0gY29sbHN0YXJ0OyBpIDwgY29sbGVuZDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X1VDUzQgY2ggPSBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBpbmNyOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAxMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzErMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMisyKzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzMrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzQrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPCAxMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gMis1KzE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoIDwgMTAwMDAwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgPSAyKzYrMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoY2ggPD0gTUFYX1VOSUNPREUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5jciA9IDIrNysxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlZHNpemUgPiBQWV9TU0laRV9UX01BWCAtIGluY3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgKz0gaW5jcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gKHNpemUgLSBjb2xsZW5kKSkKLSAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgKz0gc2l6ZSAtIGNvbGxlbmQ7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IHJlc3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3NpemUgPD0gUFlfU1NJWkVfVF9NQVgvMiAmJiByZXF1aXJlZHNpemUgPCAyKnJlc3NpemUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgPSAyKnJlc3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfUHlCeXRlc19SZXNpemUoJnJlcywgcmVxdWlyZWRzaXplKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgc3RyID0gUHlCeXRlc19BU19TVFJJTkcocmVzKSArIHJlc3BvczsKLSAgICAgICAgICAgICAgICAgICAgcmVzc2l6ZSA9IHJlcXVpcmVkc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogZ2VuZXJhdGUgcmVwbGFjZW1lbnQgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGkgPSBjb2xsc3RhcnQ7IGkgPCBjb2xsZW5kOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyICs9IHNwcmludGYoc3RyLCAiJiMlZDsiLCBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCBpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBvcyA9IGNvbGxlbmQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJlcHVuaWNvZGUgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcihlcnJvcnMsICZlcnJvckhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCByZWFzb24sIHVuaWNvZGUsICZleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxzdGFydCwgY29sbGVuZCwgJm5ld3Bvcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcHVuaWNvZGUgPT0gTlVMTCB8fCAoUHlVbmljb2RlX0NoZWNrKHJlcHVuaWNvZGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQURZKHJlcHVuaWNvZGUpID09IC0xKSkKKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfQkFDS1NMQVNIUkVQTEFDRToKKyAgICAgICAgICAgICAgICAvKiBzdWJzdHJhY3QgcHJlYWxsb2NhdGVkIGJ5dGVzICovCisgICAgICAgICAgICAgICAgd3JpdGVyLm1pbl9zaXplIC09IChjb2xsZW5kIC0gY29sbHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzdHIgPSBiYWNrc2xhc2hyZXBsYWNlKCZ3cml0ZXIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIGNvbGxzdGFydCwgY29sbGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2socmVwdW5pY29kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0bHkgY29weSBieXRlcyByZXN1bHQgdG8gb3V0cHV0LiAqLwotICAgICAgICAgICAgICAgICAgICByZXBzaXplID0gUHlCeXRlc19TaXplKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVwc2l6ZSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgYWxsIGFkZGl0aW9uYWwgYnl0ZXMuICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNwb3MgPSBzdHIgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3NpemUgPiBQWV9TU0laRV9UX01BWCAtIHJlcHNpemUgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHVuaWNvZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX1B5Qnl0ZXNfUmVzaXplKCZyZXMsIHJlc3NpemUrcmVwc2l6ZS0xKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpICsgcmVzcG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzc2l6ZSArPSByZXBzaXplLTE7CisgICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfWE1MQ0hBUlJFRlJFUExBQ0U6CisgICAgICAgICAgICAgICAgLyogc3Vic3RyYWN0IHByZWFsbG9jYXRlZCBieXRlcyAqLworICAgICAgICAgICAgICAgIHdyaXRlci5taW5fc2l6ZSAtPSAoY29sbGVuZCAtIGNvbGxzdGFydCk7CisgICAgICAgICAgICAgICAgc3RyID0geG1sY2hhcnJlZnJlcGxhY2UoJndyaXRlciwgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUsIGNvbGxzdGFydCwgY29sbGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICAgICAgcG9zID0gY29sbGVuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOgorICAgICAgICAgICAgICAgIGZvciAoaSA9IGNvbGxzdGFydDsgaSA8IGNvbGxlbmQ7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPCAweGRjODAgfHwgMHhkY2ZmIDwgY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBhIFVURi04YiBzdXJyb2dhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShzdHIsIFB5Qnl0ZXNfQXNTdHJpbmcocmVwdW5pY29kZSksIHJlcHNpemUpOwotICAgICAgICAgICAgICAgICAgICBzdHIgKz0gcmVwc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgcG9zID0gbmV3cG9zOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgICAgICpzdHIrKyA9IChjaGFyKShjaCAtIDB4ZGMwMCk7CisgICAgICAgICAgICAgICAgICAgICsrcG9zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBjb2xsZW5kKQogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogbmVlZCBtb3JlIHNwYWNlPyAoYXQgbGVhc3QgZW5vdWdoIGZvciB3aGF0IHdlCi0gICAgICAgICAgICAgICAgICAgaGF2ZSt0aGUgcmVwbGFjZW1lbnQrdGhlIHJlc3Qgb2YgdGhlIHN0cmluZywgc28KLSAgICAgICAgICAgICAgICAgICB3ZSB3b24ndCBoYXZlIHRvIGNoZWNrIHNwYWNlIGZvciBlbmNvZGFibGUgY2hhcmFjdGVycykgKi8KLSAgICAgICAgICAgICAgICByZXNwb3MgPSBzdHIgLSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpOwotICAgICAgICAgICAgICAgIHJlcHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChyZXB1bmljb2RlKTsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgPSByZXNwb3M7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVkc2l6ZSA+IFBZX1NTSVpFX1RfTUFYIC0gcmVwc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgZ290byBvdmVyZmxvdzsKLSAgICAgICAgICAgICAgICByZXF1aXJlZHNpemUgKz0gcmVwc2l6ZTsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gUFlfU1NJWkVfVF9NQVggLSAoc2l6ZSAtIGNvbGxlbmQpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG92ZXJmbG93OwotICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSArPSBzaXplIC0gY29sbGVuZDsKLSAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRzaXplID4gcmVzc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVzc2l6ZSA8PSBQWV9TU0laRV9UX01BWC8yICYmIHJlcXVpcmVkc2l6ZSA8IDIqcmVzc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkc2l6ZSA9IDIqcmVzc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzLCByZXF1aXJlZHNpemUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVwdW5pY29kZSk7CisgICAgICAgICAgICAgICAgY29sbHN0YXJ0ID0gcG9zOworICAgICAgICAgICAgICAgIGFzc2VydChjb2xsc3RhcnQgIT0gY29sbGVuZCk7CisgICAgICAgICAgICAgICAgLyogZmFsbGJhY2sgdG8gZ2VuZXJhbCBlcnJvciBoYW5kbGluZyAqLworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJlcCA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgJmVycm9yX2hhbmRsZXJfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCByZWFzb24sIHVuaWNvZGUsICZleGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbHN0YXJ0LCBjb2xsZW5kLCAmbmV3cG9zKTsKKyAgICAgICAgICAgICAgICBpZiAocmVwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKKworICAgICAgICAgICAgICAgIC8qIHN1YnN0cmFjdCBwcmVhbGxvY2F0ZWQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICB3cml0ZXIubWluX3NpemUgLT0gMTsKKworICAgICAgICAgICAgICAgIGlmIChQeUJ5dGVzX0NoZWNrKHJlcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRGlyZWN0bHkgY29weSBieXRlcyByZXN1bHQgdG8gb3V0cHV0LiAqLworICAgICAgICAgICAgICAgICAgICBzdHIgPSBfUHlCeXRlc1dyaXRlcl9Xcml0ZUJ5dGVzKCZ3cml0ZXIsIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUJ5dGVzX0FTX1NUUklORyhyZXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfR0VUX1NJWkUocmVwKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdHIgPSBQeUJ5dGVzX0FTX1NUUklORyhyZXMpICsgcmVzcG9zOwotICAgICAgICAgICAgICAgICAgICByZXNzaXplID0gcmVxdWlyZWRzaXplOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB1bmVuY29kYWJsZSBpbiB0aGUgcmVwbGFjZW1lbnQKLSAgICAgICAgICAgICAgICAgICBhbmQgY29weSBpdCB0byB0aGUgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgcmVwc2l6ZS0tPjA7ICsraSwgKytzdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgYyA9IFB5VW5pY29kZV9SRUFEX0NIQVIocmVwdW5pY29kZSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID49IGxpbWl0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWlzZV9lbmNvZGVfZXhjZXB0aW9uKCZleGMsIGVuY29kaW5nLCB1bmljb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MsIHBvcysxLCByZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHVuaWNvZGUpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0NoZWNrKHJlcCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocmVwKSA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9JU19BU0NJSShyZXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IHBhdGg6IGFsbCBjaGFyYWN0ZXJzIGFyZSBzbWFsbGVyIHRoYW4gbGltaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChsaW1pdCA+PSAxMjgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9LSU5EKHJlcCkgPT0gUHlVbmljb2RlXzFCWVRFX0tJTkQpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyID0gX1B5Qnl0ZXNXcml0ZXJfV3JpdGVCeXRlcygmd3JpdGVyLCBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9EQVRBKHJlcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9HRVRfTEVOR1RIKHJlcCkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICpzdHIgPSAoY2hhciljOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgcmVwc2l6ZSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHJlcCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IF9QeUJ5dGVzV3JpdGVyX1ByZXBhcmUoJndyaXRlciwgc3RyLCByZXBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIGFueXRoaW5nIHVuZW5jb2RhYmxlIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgYW5kIGNvcHkgaXQgdG8gdGhlIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgcmVwc2l6ZS0tPjA7ICsraSwgKytzdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IFB5VW5pY29kZV9SRUFEX0NIQVIocmVwLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gbGltaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2VfZW5jb2RlX2V4Y2VwdGlvbigmZXhjLCBlbmNvZGluZywgdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MsIHBvcysxLCByZWFzb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdHIgPSAoY2hhciljaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwb3MgPSBuZXdwb3M7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcHVuaWNvZGUpOworICAgICAgICAgICAgICAgIFB5X0NMRUFSKHJlcCk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIElmIG92ZXJhbGxvY2F0aW9uIHdhcyBkaXNhYmxlZCwgZW5zdXJlIHRoYXQgaXQgd2FzIHRoZSBsYXN0CisgICAgICAgICAgICAgICB3cml0ZS4gT3RoZXJ3aXNlLCB3ZSBtaXNzZWQgYW4gb3B0aW1pemF0aW9uICovCisgICAgICAgICAgICBhc3NlcnQod3JpdGVyLm92ZXJhbGxvY2F0ZSB8fCBwb3MgPT0gc2l6ZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgLyogUmVzaXplIGlmIHdlIGFsbG9jYXRlZCB0byBtdWNoICovCi0gICAgc2l6ZSA9IHN0ciAtIFB5Qnl0ZXNfQVNfU1RSSU5HKHJlcyk7Ci0gICAgaWYgKHNpemUgPCByZXNzaXplKSB7IC8qIElmIHRoaXMgZmFsbHMgcmVzIHdpbGwgYmUgTlVMTCAqLwotICAgICAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKLSAgICAgICAgaWYgKF9QeUJ5dGVzX1Jlc2l6ZSgmcmVzLCBzaXplKSA8IDApCi0gICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgfQogCi0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIFB5X1hERUNSRUYoZXhjKTsKLSAgICByZXR1cm4gcmVzOwotCi0gIG92ZXJmbG93OgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAotICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgIHJldHVybiBfUHlCeXRlc1dyaXRlcl9GaW5pc2goJndyaXRlciwgc3RyKTsKIAogICBvbkVycm9yOgotICAgIFB5X1hERUNSRUYocmVzKTsKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihyZXApOworICAgIF9QeUJ5dGVzV3JpdGVyX0RlYWxsb2MoJndyaXRlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgUHlfWERFQ1JFRihleGMpOwogICAgIHJldHVybiBOVUxMOwogfQpAQCAtNjY3MCw4ICs2ODY4LDkgQEAKICAgICBQeV9zc2l6ZV90IGVuZGlucG9zOwogICAgIFB5X3NzaXplX3Qgb3V0cG9zOwogICAgIGNvbnN0IGNoYXIgKmU7Ci0gICAgUHlPYmplY3QgKmVycm9ySGFuZGxlciA9IE5VTEw7CisgICAgUHlPYmplY3QgKmVycm9yX2hhbmRsZXJfb2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKKyAgICBfUHlfZXJyb3JfaGFuZGxlciBlcnJvcl9oYW5kbGVyID0gX1B5X0VSUk9SX1VOS05PV047CiAKICAgICBpZiAoc2l6ZSA9PSAwKQogICAgICAgICBfUHlfUkVUVVJOX1VOSUNPREVfRU1QVFkoKTsKQEAgLTY3MDAsMTIgKzY4OTksNDIgQEAKICAgICAgICAgICAgIFB5VW5pY29kZV9XUklURShraW5kLCBkYXRhLCB3cml0ZXIucG9zLCBjKTsKICAgICAgICAgICAgIHdyaXRlci5wb3MrKzsKICAgICAgICAgICAgICsrczsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgeworCisgICAgICAgIC8qIGJ5dGUgb3V0c2l6ZSByYW5nZSAweDAwLi4weDdmOiBjYWxsIHRoZSBlcnJvciBoYW5kbGVyICovCisKKyAgICAgICAgaWYgKGVycm9yX2hhbmRsZXIgPT0gX1B5X0VSUk9SX1VOS05PV04pCisgICAgICAgICAgICBlcnJvcl9oYW5kbGVyID0gZ2V0X2Vycm9yX2hhbmRsZXIoZXJyb3JzKTsKKworICAgICAgICBzd2l0Y2ggKGVycm9yX2hhbmRsZXIpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfUkVQTEFDRToKKyAgICAgICAgY2FzZSBfUHlfRVJST1JfU1VSUk9HQVRFRVNDQVBFOgorICAgICAgICAgICAgLyogRmFzdC1wYXRoOiB0aGUgZXJyb3IgaGFuZGxlciBvbmx5IHdyaXRlcyBvbmUgY2hhcmFjdGVyLAorICAgICAgICAgICAgICAgYnV0IHdlIG1heSBzd2l0Y2ggdG8gVUNTMiBhdCB0aGUgZmlyc3Qgd3JpdGUgKi8KKyAgICAgICAgICAgIGlmIChfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCZ3cml0ZXIsIFB5VW5pY29kZV8yQllURV9LSU5EKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAga2luZCA9IHdyaXRlci5raW5kOworICAgICAgICAgICAgZGF0YSA9IHdyaXRlci5kYXRhOworCisgICAgICAgICAgICBpZiAoZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfUkVQTEFDRSkKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfV1JJVEUoa2luZCwgZGF0YSwgd3JpdGVyLnBvcywgMHhmZmZkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfV1JJVEUoa2luZCwgZGF0YSwgd3JpdGVyLnBvcywgYyArIDB4ZGMwMCk7CisgICAgICAgICAgICB3cml0ZXIucG9zKys7CisgICAgICAgICAgICArK3M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CisgICAgICAgICAgICArK3M7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3RhcnRpbnBvcyA9IHMtc3RhcnRzOwogICAgICAgICAgICAgZW5kaW5wb3MgPSBzdGFydGlucG9zICsgMTsKICAgICAgICAgICAgIGlmICh1bmljb2RlX2RlY29kZV9jYWxsX2Vycm9yaGFuZGxlcl93cml0ZXIoCi0gICAgICAgICAgICAgICAgICAgIGVycm9ycywgJmVycm9ySGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLCAmZXJyb3JfaGFuZGxlcl9vYmosCiAgICAgICAgICAgICAgICAgICAgICJhc2NpaSIsICJvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpIiwKICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0cywgJmUsICZzdGFydGlucG9zLCAmZW5kaW5wb3MsICZleGMsICZzLAogICAgICAgICAgICAgICAgICAgICAmd3JpdGVyKSkKQEAgLTY3MTQsMTMgKzY5NDMsMTMgQEAKICAgICAgICAgICAgIGRhdGEgPSB3cml0ZXIuZGF0YTsKICAgICAgICAgfQogICAgIH0KLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgUHlfWERFQ1JFRihleGMpOwogICAgIHJldHVybiBfUHlVbmljb2RlV3JpdGVyX0ZpbmlzaCgmd3JpdGVyKTsKIAogICBvbkVycm9yOgogICAgIF9QeVVuaWNvZGVXcml0ZXJfRGVhbGxvYygmd3JpdGVyKTsKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgUHlfWERFQ1JFRihleGMpOwogICAgIHJldHVybiBOVUxMOwogfQpAQCAtNjc3NSw3ICs3MDA0LDcgQEAKICMgIGRlZmluZSBXQ19FUlJfSU5WQUxJRF9DSEFSUyAweDAwODAKICNlbmRpZgogCi1zdGF0aWMgY2hhcioKK3N0YXRpYyBjb25zdCBjaGFyKgogY29kZV9wYWdlX25hbWUoVUlOVCBjb2RlX3BhZ2UsIFB5T2JqZWN0ICoqb2JqKQogewogICAgICpvYmogPSBOVUxMOwpAQCAtNjg4Myw3ICs3MTEyLDcgQEAKICAgICBQeU9iamVjdCAqZXJyb3JIYW5kbGVyID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXhjID0gTlVMTDsKICAgICBQeU9iamVjdCAqZW5jb2Rpbmdfb2JqID0gTlVMTDsKLSAgICBjaGFyICplbmNvZGluZzsKKyAgICBjb25zdCBjaGFyICplbmNvZGluZzsKICAgICBEV09SRCBlcnI7CiAgICAgaW50IHJldCA9IC0xOwogCkBAIC03MTE5LDcgKzczNDgsNiBAQAogICAgIEJPT0wgdXNlZERlZmF1bHRDaGFyID0gRkFMU0U7CiAgICAgQk9PTCAqcHVzZWREZWZhdWx0Q2hhciA9ICZ1c2VkRGVmYXVsdENoYXI7CiAgICAgaW50IG91dHNpemU7Ci0gICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7CiAgICAgd2NoYXJfdCAqcDsKICAgICBQeV9zc2l6ZV90IHNpemU7CiAgICAgY29uc3QgRFdPUkQgZmxhZ3MgPSBlbmNvZGVfY29kZV9wYWdlX2ZsYWdzKGNvZGVfcGFnZSwgTlVMTCk7CkBAIC03MjI4LDcgKzc0NTYsNyBAQAogICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpleGMgPSBOVUxMOwogICAgIFB5T2JqZWN0ICplbmNvZGluZ19vYmogPSBOVUxMOwotICAgIGNoYXIgKmVuY29kaW5nOworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nOwogICAgIFB5X3NzaXplX3QgbmV3cG9zLCBuZXdvdXRzaXplOwogICAgIFB5T2JqZWN0ICpyZXA7CiAgICAgaW50IHJldCA9IC0xOwpAQCAtODA4Niw3ICs4MzE0LDcgQEAKIGNoYXJtYXBfZW5jb2RpbmdfZXJyb3IoCiAgICAgUHlPYmplY3QgKnVuaWNvZGUsIFB5X3NzaXplX3QgKmlucG9zLCBQeU9iamVjdCAqbWFwcGluZywKICAgICBQeU9iamVjdCAqKmV4Y2VwdGlvbk9iamVjdCwKLSAgICBpbnQgKmtub3duX2Vycm9ySGFuZGxlciwgUHlPYmplY3QgKiplcnJvckhhbmRsZXIsIGNvbnN0IGNoYXIgKmVycm9ycywKKyAgICBfUHlfZXJyb3JfaGFuZGxlciAqZXJyb3JfaGFuZGxlciwgUHlPYmplY3QgKiplcnJvcl9oYW5kbGVyX29iaiwgY29uc3QgY2hhciAqZXJyb3JzLAogICAgIFB5T2JqZWN0ICoqcmVzLCBQeV9zc2l6ZV90ICpyZXNwb3MpCiB7CiAgICAgUHlPYmplY3QgKnJlcHVuaWNvZGUgPSBOVUxMOyAvKiBpbml0aWFsaXplIHRvIHByZXZlbnQgZ2NjIHdhcm5pbmcgKi8KQEAgLTgxMzMsMjMgKzgzNjEsMTUgQEAKICAgICB9CiAgICAgLyogY2FjaGUgY2FsbGJhY2sgbmFtZSBsb29rdXAKICAgICAgKiAoaWYgbm90IGRvbmUgeWV0LCBpLmUuIGl0J3MgdGhlIGZpcnN0IGVycm9yKSAqLwotICAgIGlmICgqa25vd25fZXJyb3JIYW5kbGVyPT0tMSkgewotICAgICAgICBpZiAoKGVycm9ycz09TlVMTCkgfHwgKCFzdHJjbXAoZXJyb3JzLCAic3RyaWN0IikpKQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAicmVwbGFjZSIpKQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDI7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAiaWdub3JlIikpCi0gICAgICAgICAgICAqa25vd25fZXJyb3JIYW5kbGVyID0gMzsKLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJ4bWxjaGFycmVmcmVwbGFjZSIpKQotICAgICAgICAgICAgKmtub3duX2Vycm9ySGFuZGxlciA9IDQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICprbm93bl9lcnJvckhhbmRsZXIgPSAwOwotICAgIH0KLSAgICBzd2l0Y2ggKCprbm93bl9lcnJvckhhbmRsZXIpIHsKLSAgICBjYXNlIDE6IC8qIHN0cmljdCAqLworICAgIGlmICgqZXJyb3JfaGFuZGxlciA9PSBfUHlfRVJST1JfVU5LTk9XTikKKyAgICAgICAgKmVycm9yX2hhbmRsZXIgPSBnZXRfZXJyb3JfaGFuZGxlcihlcnJvcnMpOworCisgICAgc3dpdGNoICgqZXJyb3JfaGFuZGxlcikgeworICAgIGNhc2UgX1B5X0VSUk9SX1NUUklDVDoKICAgICAgICAgcmFpc2VfZW5jb2RlX2V4Y2VwdGlvbihleGNlcHRpb25PYmplY3QsIGVuY29kaW5nLCB1bmljb2RlLCBjb2xsc3RhcnRwb3MsIGNvbGxlbmRwb3MsIHJlYXNvbik7CiAgICAgICAgIHJldHVybiAtMTsKLSAgICBjYXNlIDI6IC8qIHJlcGxhY2UgKi8KKworICAgIGNhc2UgX1B5X0VSUk9SX1JFUExBQ0U6CiAgICAgICAgIGZvciAoY29sbHBvcyA9IGNvbGxzdGFydHBvczsgY29sbHBvczxjb2xsZW5kcG9zOyArK2NvbGxwb3MpIHsKICAgICAgICAgICAgIHggPSBjaGFybWFwZW5jb2RlX291dHB1dCgnPycsIG1hcHBpbmcsIHJlcywgcmVzcG9zKTsKICAgICAgICAgICAgIGlmICh4PT1lbmNfRVhDRVBUSU9OKSB7CkBAIC04MTYxLDEwICs4MzgxLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSAzOiAvKiBpZ25vcmUgKi8KKyAgICBjYXNlIF9QeV9FUlJPUl9JR05PUkU6CiAgICAgICAgICppbnBvcyA9IGNvbGxlbmRwb3M7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDogLyogeG1sY2hhcnJlZnJlcGxhY2UgKi8KKworICAgIGNhc2UgX1B5X0VSUk9SX1hNTENIQVJSRUZSRVBMQUNFOgogICAgICAgICAvKiBnZW5lcmF0ZSByZXBsYWNlbWVudCAodGVtcG9yYXJpbHkgKG1pcyl1c2VzIHApICovCiAgICAgICAgIGZvciAoY29sbHBvcyA9IGNvbGxzdGFydHBvczsgY29sbHBvcyA8IGNvbGxlbmRwb3M7ICsrY29sbHBvcykgewogICAgICAgICAgICAgY2hhciBidWZmZXJbMisyOSsxKzFdOwpAQCAtODE4Miw4ICs4NDAzLDkgQEAKICAgICAgICAgfQogICAgICAgICAqaW5wb3MgPSBjb2xsZW5kcG9zOwogICAgICAgICBicmVhazsKKwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJlcHVuaWNvZGUgPSB1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcihlcnJvcnMsIGVycm9ySGFuZGxlciwKKyAgICAgICAgcmVwdW5pY29kZSA9IHVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKGVycm9ycywgZXJyb3JfaGFuZGxlcl9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgcmVhc29uLCB1bmljb2RlLCBleGNlcHRpb25PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsc3RhcnRwb3MsIGNvbGxlbmRwb3MsICZuZXdwb3MpOwogICAgICAgICBpZiAocmVwdW5pY29kZSA9PSBOVUxMKQpAQCAtODI0NiwxMiArODQ2OCw5IEBACiAgICAgUHlfc3NpemVfdCBzaXplOwogICAgIC8qIGN1cnJlbnQgb3V0cHV0IHBvc2l0aW9uICovCiAgICAgUHlfc3NpemVfdCByZXNwb3MgPSAwOwotICAgIFB5T2JqZWN0ICplcnJvckhhbmRsZXIgPSBOVUxMOworICAgIFB5T2JqZWN0ICplcnJvcl9oYW5kbGVyX29iaiA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmV4YyA9IE5VTEw7Ci0gICAgLyogdGhlIGZvbGxvd2luZyB2YXJpYWJsZSBpcyB1c2VkIGZvciBjYWNoaW5nIHN0cmluZyBjb21wYXJpc29ucwotICAgICAqIC0xPW5vdCBpbml0aWFsaXplZCwgMD11bmtub3duLCAxPXN0cmljdCwgMj1yZXBsYWNlLAotICAgICAqIDM9aWdub3JlLCA0PXhtbGNoYXJyZWZyZXBsYWNlICovCi0gICAgaW50IGtub3duX2Vycm9ySGFuZGxlciA9IC0xOworICAgIF9QeV9lcnJvcl9oYW5kbGVyIGVycm9yX2hhbmRsZXIgPSBfUHlfRVJST1JfVU5LTk9XTjsKICAgICB2b2lkICpkYXRhOwogICAgIGludCBraW5kOwogCkBAIC04MjgyLDcgKzg1MDEsNyBAQAogICAgICAgICBpZiAoeD09ZW5jX0ZBSUxFRCkgeyAvKiB1bmVuY29kYWJsZSBjaGFyYWN0ZXIgKi8KICAgICAgICAgICAgIGlmIChjaGFybWFwX2VuY29kaW5nX2Vycm9yKHVuaWNvZGUsICZpbnBvcywgbWFwcGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma25vd25fZXJyb3JIYW5kbGVyLCAmZXJyb3JIYW5kbGVyLCBlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JfaGFuZGxlciwgJmVycm9yX2hhbmRsZXJfb2JqLCBlcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzLCAmcmVzcG9zKSkgewogICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICAgICAgICAgIH0KQEAgLTgyOTgsMTMgKzg1MTcsMTMgQEAKICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKIAogICAgIFB5X1hERUNSRUYoZXhjKTsKLSAgICBQeV9YREVDUkVGKGVycm9ySGFuZGxlcik7CisgICAgUHlfWERFQ1JFRihlcnJvcl9oYW5kbGVyX29iaik7CiAgICAgcmV0dXJuIHJlczsKIAogICBvbkVycm9yOgogICAgIFB5X1hERUNSRUYocmVzKTsKICAgICBQeV9YREVDUkVGKGV4Yyk7Ci0gICAgUHlfWERFQ1JFRihlcnJvckhhbmRsZXIpOworICAgIFB5X1hERUNSRUYoZXJyb3JfaGFuZGxlcl9vYmopOwogICAgIHJldHVybiBOVUxMOwogfQogCkBAIC04MzcxLDcgKzg1OTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydHBvcywgUHlfc3NpemVfdCBlbmRwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpuZXdwb3MpCiB7Ci0gICAgc3RhdGljIGNoYXIgKmFyZ3BhcnNlID0gIk8hbjt0cmFuc2xhdGluZyBlcnJvciBoYW5kbGVyIG11c3QgcmV0dXJuIChzdHIsIGludCkgdHVwbGUiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphcmdwYXJzZSA9ICJPIW47dHJhbnNsYXRpbmcgZXJyb3IgaGFuZGxlciBtdXN0IHJldHVybiAoc3RyLCBpbnQpIHR1cGxlIjsKIAogICAgIFB5X3NzaXplX3QgaV9uZXdwb3M7CiAgICAgUHlPYmplY3QgKnJlc3R1cGxlOwpAQCAtODYyOCw3ICs4ODQ3LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1QeU9iamVjdCAqCitzdGF0aWMgUHlPYmplY3QgKgogX1B5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwKFB5T2JqZWN0ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbWFwcGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMpCkBAIC04NjU3LDEwICs4ODc2LDggQEAKICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQoaW5wdXQpOwogICAgIHNpemUgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChpbnB1dCk7CiAKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIFB5X0lOQ1JFRihpbnB1dCk7Ci0gICAgICAgIHJldHVybiBpbnB1dDsKLSAgICB9CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tT2JqZWN0KGlucHV0KTsKIAogICAgIC8qIGFsbG9jYXRlIGVub3VnaCBmb3IgYSBzaW1wbGUgMToxIHRyYW5zbGF0aW9uIHdpdGhvdXQKICAgICAgICByZXBsYWNlbWVudHMsIGlmIHdlIG5lZWQgbW9yZSwgd2UnbGwgcmVzaXplICovCkBAIC04NzcxLDE0ICs4OTg4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm1hcHBpbmcsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycykKIHsKLSAgICBQeU9iamVjdCAqcmVzdWx0OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXN1bHQgPSBfUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAoc3RyLCBtYXBwaW5nLCBlcnJvcnMpOwotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIF9QeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcChzdHIsIG1hcHBpbmcsIGVycm9ycyk7CiB9CiAKIHN0YXRpYyBQeV9VQ1M0CkBAIC04OTYwLDkgKzkxNzIsMTAgQEAKICAgICB9CiAKIHN0YXRpYyBQeV9zc2l6ZV90Ci1hbnlfZmluZF9zbGljZShpbnQgZGlyZWN0aW9uLCBQeU9iamVjdCogczEsIFB5T2JqZWN0KiBzMiwKK2FueV9maW5kX3NsaWNlKFB5T2JqZWN0KiBzMSwgUHlPYmplY3QqIHMyLAogICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFydCwKLSAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kKQorICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsCisgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewogICAgIGludCBraW5kMSwga2luZDI7CiAgICAgdm9pZCAqYnVmMSwgKmJ1ZjI7CkBAIC05MTMxLDU0ICs5MzQ0LDM1IEBACiAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQpCiB7CiAgICAgUHlfc3NpemVfdCByZXN1bHQ7Ci0gICAgUHlPYmplY3QqIHN0cl9vYmo7Ci0gICAgUHlPYmplY3QqIHN1Yl9vYmo7CiAgICAgaW50IGtpbmQxLCBraW5kMjsKICAgICB2b2lkICpidWYxID0gTlVMTCwgKmJ1ZjIgPSBOVUxMOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMjsKIAotICAgIHN0cl9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHIpOwotICAgIGlmICghc3RyX29iaikKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc3Vic3RyKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBzdWJfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyKTsKLSAgICBpZiAoIXN1Yl9vYmopIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3ViX29iaikgPT0gLTEgfHwgUHlVbmljb2RlX1JFQURZKHN0cl9vYmopID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQogCi0gICAga2luZDEgPSBQeVVuaWNvZGVfS0lORChzdHJfb2JqKTsKLSAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1Yl9vYmopOwotICAgIGlmIChraW5kMSA8IGtpbmQyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOworICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKKyAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1YnN0cik7CisgICAgaWYgKGtpbmQxIDwga2luZDIpCiAgICAgICAgIHJldHVybiAwOwotICAgIH0KIAotICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHJfb2JqKTsKLSAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3ViX29iaik7CisgICAgbGVuMSA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cik7CisgICAgbGVuMiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN1YnN0cik7CiAgICAgQURKVVNUX0lORElDRVMoc3RhcnQsIGVuZCwgbGVuMSk7Ci0gICAgaWYgKGVuZCAtIHN0YXJ0IDwgbGVuMikgewotICAgICAgICBQeV9ERUNSRUYoc3ViX29iaik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKKyAgICBpZiAoZW5kIC0gc3RhcnQgPCBsZW4yKQogICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAKLSAgICBidWYxID0gUHlVbmljb2RlX0RBVEEoc3RyX29iaik7Ci0gICAgYnVmMiA9IFB5VW5pY29kZV9EQVRBKHN1Yl9vYmopOworICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHIpOworICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJzdHIpOwogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewotICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3ViX29iaiwga2luZDEpOworICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3Vic3RyLCBraW5kMSk7CiAgICAgICAgIGlmICghYnVmMikKICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKICAgICB9CiAKICAgICBzd2l0Y2ggKGtpbmQxKSB7CiAgICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDoKLSAgICAgICAgaWYgKFB5VW5pY29kZV9JU19BU0NJSShzdHJfb2JqKSAmJiBQeVVuaWNvZGVfSVNfQVNDSUkoc3ViX29iaikpCisgICAgICAgIGlmIChQeVVuaWNvZGVfSVNfQVNDSUkoc3RyKSAmJiBQeVVuaWNvZGVfSVNfQVNDSUkoc3Vic3RyKSkKICAgICAgICAgICAgIHJlc3VsdCA9IGFzY2lpbGliX2NvdW50KAogICAgICAgICAgICAgICAgICgoUHlfVUNTMSopYnVmMSkgKyBzdGFydCwgZW5kIC0gc3RhcnQsCiAgICAgICAgICAgICAgICAgYnVmMiwgbGVuMiwgUFlfU1NJWkVfVF9NQVgKQEAgLTkyMDUsMTYgKzkzOTksMTEgQEAKICAgICAgICAgYXNzZXJ0KDApOyByZXN1bHQgPSAwOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0KICAgICBpZiAoa2luZDIgIT0ga2luZDEpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAKICAgICByZXR1cm4gcmVzdWx0OwogICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihzdWJfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxICYmIGJ1ZjIpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAgICAgcmV0dXJuIC0xOwpAQCAtOTIyMiwzNSArOTQxMSwxNSBAQAogCiBQeV9zc2l6ZV90CiBQeVVuaWNvZGVfRmluZChQeU9iamVjdCAqc3RyLAotICAgICAgICAgICAgICAgUHlPYmplY3QgKnN1YiwKKyAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIsCiAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LAogICAgICAgICAgICAgICAgUHlfc3NpemVfdCBlbmQsCiAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoIXN0cikKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc3Vic3RyKSA8IDApCiAgICAgICAgIHJldHVybiAtMjsKLSAgICBzdWIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdWIpOwotICAgIGlmICghc3ViKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICByZXR1cm4gLTI7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3ViKSA9PSAtMSB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiAtMjsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShkaXJlY3Rpb24sCi0gICAgICAgIHN0ciwgc3ViLCBzdGFydCwgZW5kCi0gICAgICAgICk7Ci0KLSAgICBQeV9ERUNSRUYoc3RyKTsKLSAgICBQeV9ERUNSRUYoc3ViKTsKLQotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIGFueV9maW5kX3NsaWNlKHN0ciwgc3Vic3RyLCBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogfQogCiBQeV9zc2l6ZV90CkBAIC05MzUzLDIyICs5NTIyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZW5kLAogICAgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQogewotICAgIFB5X3NzaXplX3QgcmVzdWx0OwotCi0gICAgc3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyKTsKLSAgICBpZiAoc3RyID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHN1YnN0cikgPCAwKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3Vic3RyID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vic3RyKTsKLSAgICBpZiAoc3Vic3RyID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9CiAKLSAgICByZXN1bHQgPSB0YWlsbWF0Y2goc3RyLCBzdWJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIGRpcmVjdGlvbik7Ci0gICAgUHlfREVDUkVGKHN0cik7Ci0gICAgUHlfREVDUkVGKHN1YnN0cik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gdGFpbG1hdGNoKHN0ciwgc3Vic3RyLCBzdGFydCwgZW5kLCBkaXJlY3Rpb24pOwogfQogCiAvKiBBcHBseSBmaXhmY3QgZmlsdGVyIHRvIHRoZSBVbmljb2RlIG9iamVjdCBzZWxmIGFuZCByZXR1cm4gYQpAQCAtOTk3NCwxMyArMTAxMzEsOCBAQAogewogICAgIFB5T2JqZWN0ICpsaXN0OwogCi0gICAgc3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyaW5nKTsKLSAgICBpZiAoc3RyaW5nID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKHN0cmluZykgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN0cmluZykgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cmluZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAogICAgIHN3aXRjaCAoUHlVbmljb2RlX0tJTkQoc3RyaW5nKSkgewogICAgIGNhc2UgUHlVbmljb2RlXzFCWVRFX0tJTkQ6CkBAIC0xMDAwNyw3ICsxMDE1OSw2IEBACiAgICAgICAgIGFzc2VydCgwKTsKICAgICAgICAgbGlzdCA9IDA7CiAgICAgfQotICAgIFB5X0RFQ1JFRihzdHJpbmcpOwogICAgIHJldHVybiBsaXN0OwogfQogCkBAIC0xMDU2OCwyOCArMTA3MTksMjcgQEAKIH0KIAogCi0vKiBBcmd1bWVudCBjb252ZXJ0ZXIuICBDb2VyY2VzIHRvIGEgc2luZ2xlIHVuaWNvZGUgY2hhcmFjdGVyICovCisvKiBBcmd1bWVudCBjb252ZXJ0ZXIuIEFjY2VwdHMgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIuICovCiAKIHN0YXRpYyBpbnQKIGNvbnZlcnRfdWMoUHlPYmplY3QgKm9iaiwgdm9pZCAqYWRkcikKIHsKICAgICBQeV9VQ1M0ICpmaWxsY2hhcmxvYyA9IChQeV9VQ1M0ICopYWRkcjsKLSAgICBQeU9iamVjdCAqdW5pb2JqOwogCi0gICAgdW5pb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qob2JqKTsKLSAgICBpZiAodW5pb2JqID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgZmlsbCBjaGFyYWN0ZXIgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBVbmljb2RlIik7CisgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2sob2JqKSkgeworICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgIlRoZSBmaWxsIGNoYXJhY3RlciBtdXN0IGJlIGEgdW5pY29kZSBjaGFyYWN0ZXIsICIKKyAgICAgICAgICAgICAgICAgICAgICJub3QgJS4xMDBzIiwgUHlfVFlQRShvYmopLT50cF9uYW1lKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmIChQeVVuaWNvZGVfR0VUX0xFTkdUSCh1bmlvYmopICE9IDEpIHsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKG9iaikgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgob2JqKSAhPSAxKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGZpbGwgY2hhcmFjdGVyIG11c3QgYmUgZXhhY3RseSBvbmUgY2hhcmFjdGVyIGxvbmciKTsKLSAgICAgICAgUHlfREVDUkVGKHVuaW9iaik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAqZmlsbGNoYXJsb2MgPSBQeVVuaWNvZGVfUkVBRF9DSEFSKHVuaW9iaiwgMCk7Ci0gICAgUHlfREVDUkVGKHVuaW9iaik7CisgICAgKmZpbGxjaGFybG9jID0gUHlVbmljb2RlX1JFQURfQ0hBUihvYmosIDApOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xMDkwNSw1OSArMTEwNTUsNDkgQEAKIH0KIAogaW50Ci1QeVVuaWNvZGVfQ29udGFpbnMoUHlPYmplY3QgKmNvbnRhaW5lciwgUHlPYmplY3QgKmVsZW1lbnQpCitfUHlVbmljb2RlX0VRKFB5T2JqZWN0ICphYSwgUHlPYmplY3QgKmJiKQogewotICAgIFB5T2JqZWN0ICpzdHIsICpzdWI7CisgICAgcmV0dXJuIHVuaWNvZGVfZXEoYWEsIGJiKTsKK30KKworaW50CitQeVVuaWNvZGVfQ29udGFpbnMoUHlPYmplY3QgKnN0ciwgUHlPYmplY3QgKnN1YnN0cikKK3sKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMjsKICAgICBpbnQgcmVzdWx0OwogCi0gICAgLyogQ29lcmNlIHRoZSB0d28gYXJndW1lbnRzICovCi0gICAgc3ViID0gUHlVbmljb2RlX0Zyb21PYmplY3QoZWxlbWVudCk7Ci0gICAgaWYgKCFzdWIpIHsKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJzdHIpKSB7CiAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kLCBub3QgJXMiLAotICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAiJ2luIDxzdHJpbmc+JyByZXF1aXJlcyBzdHJpbmcgYXMgbGVmdCBvcGVyYW5kLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0KLSAgICBzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChjb250YWluZXIpOwotICAgIGlmICghc3RyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWIpOworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3Vic3RyKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAogICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc3RyKTsKLSAgICBraW5kMiA9IFB5VW5pY29kZV9LSU5EKHN1Yik7Ci0gICAgaWYgKGtpbmQxIDwga2luZDIpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1Yik7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc3Vic3RyKTsKKyAgICBpZiAoa2luZDEgPCBraW5kMikKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOwotICAgIGxlbjIgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdWIpOwotICAgIGlmIChsZW4xIDwgbGVuMikgewotICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cik7CisgICAgbGVuMiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN1YnN0cik7CisgICAgaWYgKGxlbjEgPCBsZW4yKQogICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAgICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHN0cik7Ci0gICAgYnVmMiA9IFB5VW5pY29kZV9EQVRBKHN1Yik7CisgICAgYnVmMiA9IFB5VW5pY29kZV9EQVRBKHN1YnN0cik7CiAgICAgaWYgKGxlbjIgPT0gMSkgewogICAgICAgICBQeV9VQ1M0IGNoID0gUHlVbmljb2RlX1JFQUQoa2luZDIsIGJ1ZjIsIDApOwogICAgICAgICByZXN1bHQgPSBmaW5kY2hhcigoY29uc3QgY2hhciAqKWJ1ZjEsIGtpbmQxLCBsZW4xLCBjaCwgMSkgIT0gLTE7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWIpOwotICAgICAgICBQeV9ERUNSRUYoc3RyKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKSB7Ci0gICAgICAgIGJ1ZjIgPSBfUHlVbmljb2RlX0FzS2luZChzdWIsIGtpbmQxKTsKLSAgICAgICAgaWYgKCFidWYyKSB7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3ViKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOworICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3Vic3RyLCBraW5kMSk7CisgICAgICAgIGlmICghYnVmMikKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHN3aXRjaCAoa2luZDEpIHsKQEAgLTEwOTc1LDkgKzExMTE1LDYgQEAKICAgICAgICAgYXNzZXJ0KDApOwogICAgIH0KIAotICAgIFB5X0RFQ1JFRihzdHIpOwotICAgIFB5X0RFQ1JFRihzdWIpOwotCiAgICAgaWYgKGtpbmQyICE9IGtpbmQxKQogICAgICAgICBQeU1lbV9GcmVlKGJ1ZjIpOwogCkBAIC0xMDk4OSw1NiArMTExMjYsNDAgQEAKIFB5T2JqZWN0ICoKIFB5VW5pY29kZV9Db25jYXQoUHlPYmplY3QgKmxlZnQsIFB5T2JqZWN0ICpyaWdodCkKIHsKLSAgICBQeU9iamVjdCAqdSA9IE5VTEwsICp2ID0gTlVMTCwgKnc7CisgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeV9VQ1M0IG1heGNoYXIsIG1heGNoYXIyOwotICAgIFB5X3NzaXplX3QgdV9sZW4sIHZfbGVuLCBuZXdfbGVuOworICAgIFB5X3NzaXplX3QgbGVmdF9sZW4sIHJpZ2h0X2xlbiwgbmV3X2xlbjsKIAotICAgIC8qIENvZXJjZSB0aGUgdHdvIGFyZ3VtZW50cyAqLwotICAgIHUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChsZWZ0KTsKLSAgICBpZiAodSA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgdiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHJpZ2h0KTsKLSAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICBnb3RvIG9uRXJyb3I7CisgICAgaWYgKGVuc3VyZV91bmljb2RlKGxlZnQpIDwgMCB8fCBlbnN1cmVfdW5pY29kZShyaWdodCkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8qIFNob3J0Y3V0cyAqLwotICAgIGlmICh2ID09IHVuaWNvZGVfZW1wdHkpIHsKLSAgICAgICAgUHlfREVDUkVGKHYpOwotICAgICAgICByZXR1cm4gdTsKLSAgICB9Ci0gICAgaWYgKHUgPT0gdW5pY29kZV9lbXB0eSkgewotICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KKyAgICBpZiAobGVmdCA9PSB1bmljb2RlX2VtcHR5KQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21PYmplY3QocmlnaHQpOworICAgIGlmIChyaWdodCA9PSB1bmljb2RlX2VtcHR5KQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0Zyb21PYmplY3QobGVmdCk7CiAKLSAgICB1X2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHUpOwotICAgIHZfbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodik7Ci0gICAgaWYgKHVfbGVuID4gUFlfU1NJWkVfVF9NQVggLSB2X2xlbikgeworICAgIGxlZnRfbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgobGVmdCk7CisgICAgcmlnaHRfbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgocmlnaHQpOworICAgIGlmIChsZWZ0X2xlbiA+IFBZX1NTSVpFX1RfTUFYIC0gcmlnaHRfbGVuKSB7CiAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MgYXJlIHRvbyBsYXJnZSB0byBjb25jYXQiKTsKLSAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgbmV3X2xlbiA9IHVfbGVuICsgdl9sZW47CisgICAgbmV3X2xlbiA9IGxlZnRfbGVuICsgcmlnaHRfbGVuOwogCi0gICAgbWF4Y2hhciA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRSh1KTsKLSAgICBtYXhjaGFyMiA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRSh2KTsKKyAgICBtYXhjaGFyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKGxlZnQpOworICAgIG1heGNoYXIyID0gUHlVbmljb2RlX01BWF9DSEFSX1ZBTFVFKHJpZ2h0KTsKICAgICBtYXhjaGFyID0gUHlfTUFYKG1heGNoYXIsIG1heGNoYXIyKTsKIAogICAgIC8qIENvbmNhdCB0aGUgdHdvIFVuaWNvZGUgc3RyaW5ncyAqLwotICAgIHcgPSBQeVVuaWNvZGVfTmV3KG5ld19sZW4sIG1heGNoYXIpOwotICAgIGlmICh3ID09IE5VTEwpCi0gICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICBfUHlVbmljb2RlX0Zhc3RDb3B5Q2hhcmFjdGVycyh3LCAwLCB1LCAwLCB1X2xlbik7Ci0gICAgX1B5VW5pY29kZV9GYXN0Q29weUNoYXJhY3RlcnModywgdV9sZW4sIHYsIDAsIHZfbGVuKTsKLSAgICBQeV9ERUNSRUYodSk7Ci0gICAgUHlfREVDUkVGKHYpOwotICAgIGFzc2VydChfUHlVbmljb2RlX0NoZWNrQ29uc2lzdGVuY3kodywgMSkpOwotICAgIHJldHVybiB3OwotCi0gIG9uRXJyb3I6Ci0gICAgUHlfWERFQ1JFRih1KTsKLSAgICBQeV9YREVDUkVGKHYpOwotICAgIHJldHVybiBOVUxMOworICAgIHJlc3VsdCA9IFB5VW5pY29kZV9OZXcobmV3X2xlbiwgbWF4Y2hhcik7CisgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBfUHlVbmljb2RlX0Zhc3RDb3B5Q2hhcmFjdGVycyhyZXN1bHQsIDAsIGxlZnQsIDAsIGxlZnRfbGVuKTsKKyAgICBfUHlVbmljb2RlX0Zhc3RDb3B5Q2hhcmFjdGVycyhyZXN1bHQsIGxlZnRfbGVuLCByaWdodCwgMCwgcmlnaHRfbGVuKTsKKyAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHJlc3VsdCwgMSkpOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQKQEAgLTExMTI5LDYgKzExMjUwLDI1IEBACiAgICAgUHlfWERFQ1JFRihyaWdodCk7CiB9CiAKKy8qCitXcmFwcyBzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kcygpIGFuZCBhZGRpdGlvbmFsbHkgZW5zdXJlcyB0aGF0IHRoZQorZmlyc3QgYXJndW1lbnQgaXMgYSB1bmljb2RlIG9iamVjdC4KKyovCisKK1B5X0xPQ0FMX0lOTElORShpbnQpCitwYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoY29uc3QgY2hhciAqIGZ1bmN0aW9uX25hbWUsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICoqc3Vic3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICplbmQpCit7CisgICAgaWYoc3RyaW5nbGliX3BhcnNlX2FyZ3NfZmluZHMoZnVuY3Rpb25fbmFtZSwgYXJncywgc3Vic3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQpKSB7CisgICAgICAgIGlmIChlbnN1cmVfdW5pY29kZSgqc3Vic3RyaW5nKSA8IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBQeURvY19TVFJWQVIoY291bnRfX2RvY19fLAogICAgICAgICAgICAgICJTLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pIC0+IGludFxuXAogXG5cCkBAIC0xMTE0NywzMSArMTEyODcsMjYgQEAKICAgICB2b2lkICpidWYxLCAqYnVmMjsKICAgICBQeV9zc2l6ZV90IGxlbjEsIGxlbjIsIGlyZXN1bHQ7CiAKLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoImNvdW50IiwgYXJncywgJnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgiY291bnQiLCBhcmdzLCAmc3Vic3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGtpbmQxID0gUHlVbmljb2RlX0tJTkQoc2VsZik7CiAgICAga2luZDIgPSBQeVVuaWNvZGVfS0lORChzdWJzdHJpbmcpOwotICAgIGlmIChraW5kMSA8IGtpbmQyKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChraW5kMSA8IGtpbmQyKQogICAgICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKDApOwotICAgIH0KKwogICAgIGxlbjEgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzZWxmKTsKICAgICBsZW4yID0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3Vic3RyaW5nKTsKICAgICBBREpVU1RfSU5ESUNFUyhzdGFydCwgZW5kLCBsZW4xKTsKLSAgICBpZiAoZW5kIC0gc3RhcnQgPCBsZW4yKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChlbmQgLSBzdGFydCA8IGxlbjIpCiAgICAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmcoMCk7Ci0gICAgfQorCiAgICAgYnVmMSA9IFB5VW5pY29kZV9EQVRBKHNlbGYpOwogICAgIGJ1ZjIgPSBQeVVuaWNvZGVfREFUQShzdWJzdHJpbmcpOwogICAgIGlmIChraW5kMiAhPSBraW5kMSkgewogICAgICAgICBidWYyID0gX1B5VW5pY29kZV9Bc0tpbmQoc3Vic3RyaW5nLCBraW5kMSk7Ci0gICAgICAgIGlmICghYnVmMikgewotICAgICAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgICAgIGlmICghYnVmMikKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CiAgICAgfQogICAgIHN3aXRjaCAoa2luZDEpIHsKICAgICBjYXNlIFB5VW5pY29kZV8xQllURV9LSU5EOgpAQCAtMTEyMDEsOCArMTEzMzYsNiBAQAogICAgIGlmIChraW5kMiAhPSBraW5kMSkKICAgICAgICAgUHlNZW1fRnJlZShidWYyKTsKIAotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTEzMzYsMjIgKzExNDY5LDEzIEBACiAgICAgUHlfc3NpemVfdCBlbmQgPSAwOwogICAgIFB5X3NzaXplX3QgcmVzdWx0OwogCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJmaW5kIiwgYXJncywgJnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgiZmluZCIsIGFyZ3MsICZzdWJzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdWJzdHJpbmcpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKLSAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZSgxLCBzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQpOwotCi0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2Uoc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAxKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTE0MjQsMjIgKzExNTQ4LDEzIEBACiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmQgPSAwOwogCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJpbmRleCIsIGFyZ3MsICZzdWJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwgJmVuZCkpCisgICAgaWYgKCFwYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoImluZGV4IiwgYXJncywgJnN1YnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKHN1YnN0cmluZykgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KIAotICAgIHJlc3VsdCA9IGFueV9maW5kX3NsaWNlKDEsIHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCk7Ci0KLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIDEpOwogCiAgICAgaWYgKHJlc3VsdCA9PSAtMikKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTk1Myw3ICsxMjA2OCw3IEBACiAjZGVmaW5lIEJPVEhTVFJJUCAyCiAKIC8qIEFycmF5cyBpbmRleGVkIGJ5IGFib3ZlICovCi1zdGF0aWMgY29uc3QgY2hhciAqc3RyaXBmb3JtYXRbXSA9IHsifE86bHN0cmlwIiwgInxPOnJzdHJpcCIsICJ8TzpzdHJpcCJ9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpcGZvcm1hdFtdID0geyJ8Tzpsc3RyaXAiLCAifE86cnN0cmlwIiwgInxPOnN0cmlwIn07CiAKICNkZWZpbmUgU1RSSVBOQU1FKGkpIChzdHJpcGZvcm1hdFtpXSszKQogCkBAIC0xMjI0OCw0MCArMTIzNjMsMTUgQEAKIH0KIAogUHlPYmplY3QgKgotUHlVbmljb2RlX1JlcGxhY2UoUHlPYmplY3QgKm9iaiwKLSAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJvYmosCi0gICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVwbG9iaiwKK1B5VW5pY29kZV9SZXBsYWNlKFB5T2JqZWN0ICpzdHIsCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqc3Vic3RyLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJlcGxzdHIsCiAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1heGNvdW50KQogewotICAgIFB5T2JqZWN0ICpzZWxmOwotICAgIFB5T2JqZWN0ICpzdHIxOwotICAgIFB5T2JqZWN0ICpzdHIyOwotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzZWxmID0gUHlVbmljb2RlX0Zyb21PYmplY3Qob2JqKTsKLSAgICBpZiAoc2VsZiA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHIpIDwgMCB8fCBlbnN1cmVfdW5pY29kZShzdWJzdHIpIDwgMCB8fAorICAgICAgICAgICAgZW5zdXJlX3VuaWNvZGUocmVwbHN0cikgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdHIxID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vib2JqKTsKLSAgICBpZiAoc3RyMSA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHN0cjIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChyZXBsb2JqKTsKLSAgICBpZiAoc3RyMiA9PSBOVUxMKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzZWxmKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cjEpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSB8fAotICAgICAgICBQeVVuaWNvZGVfUkVBRFkoc3RyMSkgPT0gLTEgfHwKLSAgICAgICAgUHlVbmljb2RlX1JFQURZKHN0cjIpID09IC0xKQotICAgICAgICByZXN1bHQgPSBOVUxMOwotICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gcmVwbGFjZShzZWxmLCBzdHIxLCBzdHIyLCBtYXhjb3VudCk7Ci0gICAgUHlfREVDUkVGKHNlbGYpOwotICAgIFB5X0RFQ1JFRihzdHIxKTsKLSAgICBQeV9ERUNSRUYoc3RyMik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVwbGFjZShzdHIsIHN1YnN0ciwgcmVwbHN0ciwgbWF4Y291bnQpOwogfQogCiBQeURvY19TVFJWQVIocmVwbGFjZV9fZG9jX18sCkBAIC0xMjI5NywyOCArMTIzODcsMTIgQEAKICAgICBQeU9iamVjdCAqc3RyMTsKICAgICBQeU9iamVjdCAqc3RyMjsKICAgICBQeV9zc2l6ZV90IG1heGNvdW50ID0gLTE7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT098bjpyZXBsYWNlIiwgJnN0cjEsICZzdHIyLCAmbWF4Y291bnQpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiVVV8bjpyZXBsYWNlIiwgJnN0cjEsICZzdHIyLCAmbWF4Y291bnQpKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlVbmljb2RlX1JFQURZKHNlbGYpID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdHIxID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3RyMSk7Ci0gICAgaWYgKHN0cjEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RyMiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cjIpOwotICAgIGlmIChzdHIyID09IE5VTEwpIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cjEpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKFB5VW5pY29kZV9SRUFEWShzdHIxKSA9PSAtMSB8fCBQeVVuaWNvZGVfUkVBRFkoc3RyMikgPT0gLTEpCi0gICAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgZWxzZQotICAgICAgICByZXN1bHQgPSByZXBsYWNlKHNlbGYsIHN0cjEsIHN0cjIsIG1heGNvdW50KTsKLQotICAgIFB5X0RFQ1JFRihzdHIxKTsKLSAgICBQeV9ERUNSRUYoc3RyMik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gcmVwbGFjZShzZWxmLCBzdHIxLCBzdHIyLCBtYXhjb3VudCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xMjUwMywyMiArMTI1NzcsMTMgQEAKICAgICBQeV9zc2l6ZV90IGVuZCA9IDA7CiAgICAgUHlfc3NpemVfdCByZXN1bHQ7CiAKLSAgICBpZiAoIXN0cmluZ2xpYl9wYXJzZV9hcmdzX2ZpbmRzX3VuaWNvZGUoInJmaW5kIiwgYXJncywgJnN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCAmZW5kKSkKKyAgICBpZiAoIXBhcnNlX2FyZ3NfZmluZHNfdW5pY29kZSgicmZpbmQiLCBhcmdzLCAmc3Vic3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3Vic3RyaW5nKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2UoLTEsIHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCk7Ci0KLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTI1NDAsMjIgKzEyNjA1LDEzIEBACiAgICAgUHlfc3NpemVfdCBlbmQgPSAwOwogICAgIFB5X3NzaXplX3QgcmVzdWx0OwogCi0gICAgaWYgKCFzdHJpbmdsaWJfcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJyaW5kZXgiLCBhcmdzLCAmc3Vic3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsICZlbmQpKQorICAgIGlmICghcGFyc2VfYXJnc19maW5kc191bmljb2RlKCJyaW5kZXgiLCBhcmdzLCAmc3Vic3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VsZikgPT0gLTEpIHsKLSAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEWShzZWxmKSA9PSAtMSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc3Vic3RyaW5nKSA9PSAtMSkgewotICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gYW55X2ZpbmRfc2xpY2UoLTEsIHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCk7Ci0KLSAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICByZXN1bHQgPSBhbnlfZmluZF9zbGljZShzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsIC0xKTsKIAogICAgIGlmIChyZXN1bHQgPT0gLTIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTI1OTUsMjQgKzEyNjUxLDEwIEBACiBQeU9iamVjdCAqCiBQeVVuaWNvZGVfU3BsaXQoUHlPYmplY3QgKnMsIFB5T2JqZWN0ICpzZXAsIFB5X3NzaXplX3QgbWF4c3BsaXQpCiB7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKLQotICAgIHMgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzKTsKLSAgICBpZiAocyA9PSBOVUxMKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzKSA8IDAgfHwgKHNlcCAhPSBOVUxMICYmIGVuc3VyZV91bmljb2RlKHNlcCkgPCAwKSkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKHNlcCAhPSBOVUxMKSB7Ci0gICAgICAgIHNlcCA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHNlcCk7Ci0gICAgICAgIGlmIChzZXAgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9CiAKLSAgICByZXN1bHQgPSBzcGxpdChzLCBzZXAsIG1heHNwbGl0KTsKLQotICAgIFB5X0RFQ1JFRihzKTsKLSAgICBQeV9YREVDUkVGKHNlcCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gc3BsaXQocywgc2VwLCBtYXhzcGxpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihzcGxpdF9fZG9jX18sCkBAIC0xMjYzNywzNSArMTI2NzksMjYgQEAKIAogICAgIGlmIChzdWJzdHJpbmcgPT0gUHlfTm9uZSkKICAgICAgICAgcmV0dXJuIHNwbGl0KHNlbGYsIE5VTEwsIG1heGNvdW50KTsKLSAgICBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkKKworICAgIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkKICAgICAgICAgcmV0dXJuIHNwbGl0KHNlbGYsIHN1YnN0cmluZywgbWF4Y291bnQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9TcGxpdChzZWxmLCBzdWJzdHJpbmcsIG1heGNvdW50KTsKKworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJtdXN0IGJlIHN0ciBvciBOb25lLCBub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgUHlfVFlQRShzdWJzdHJpbmcpLT50cF9uYW1lKTsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogUHlPYmplY3QgKgotUHlVbmljb2RlX1BhcnRpdGlvbihQeU9iamVjdCAqc3RyX2luLCBQeU9iamVjdCAqc2VwX2luKQorUHlVbmljb2RlX1BhcnRpdGlvbihQeU9iamVjdCAqc3RyX29iaiwgUHlPYmplY3QgKnNlcF9vYmopCiB7Ci0gICAgUHlPYmplY3QqIHN0cl9vYmo7Ci0gICAgUHlPYmplY3QqIHNlcF9vYmo7CiAgICAgUHlPYmplY3QqIG91dDsKICAgICBpbnQga2luZDEsIGtpbmQyOwogICAgIHZvaWQgKmJ1ZjEsICpidWYyOwogICAgIFB5X3NzaXplX3QgbGVuMSwgbGVuMjsKIAotICAgIHN0cl9vYmogPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzdHJfaW4pOwotICAgIGlmICghc3RyX29iaikKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUoc3RyX29iaikgPCAwIHx8IGVuc3VyZV91bmljb2RlKHNlcF9vYmopIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc2VwX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHNlcF9pbik7Ci0gICAgaWYgKCFzZXBfb2JqKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChQeVVuaWNvZGVfUkVBRFkoc2VwX29iaikgPT0gLTEgfHwgUHlVbmljb2RlX1JFQURZKHN0cl9vYmopID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKICAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cl9vYmopOwogICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc2VwX29iaik7CkBAIC0xMjY3OSw4ICsxMjcxMiw2IEBACiAgICAgICAgICAgICBvdXQgPSBQeVR1cGxlX1BhY2soMywgc3RyX29iaiwgdW5pY29kZV9lbXB0eSwgdW5pY29kZV9lbXB0eSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYodW5pY29kZV9lbXB0eSk7CiAgICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgfQogICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHJfb2JqKTsKQEAgLTEyNjg4LDcgKzEyNzE5LDcgQEAKICAgICBpZiAoa2luZDIgIT0ga2luZDEpIHsKICAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHNlcF9vYmosIGtpbmQxKTsKICAgICAgICAgaWYgKCFidWYyKQotICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgc3dpdGNoIChraW5kMSkgewpAQCAtMTI3MDksMzkgKzEyNzQwLDIzIEBACiAgICAgICAgIG91dCA9IDA7CiAgICAgfQogCi0gICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKICAgICBpZiAoa2luZDIgIT0ga2luZDEpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAKICAgICByZXR1cm4gb3V0OwotICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgaWYgKGtpbmQyICE9IGtpbmQxICYmIGJ1ZjIpCi0gICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7Ci0gICAgcmV0dXJuIE5VTEw7CiB9CiAKIAogUHlPYmplY3QgKgotUHlVbmljb2RlX1JQYXJ0aXRpb24oUHlPYmplY3QgKnN0cl9pbiwgUHlPYmplY3QgKnNlcF9pbikKK1B5VW5pY29kZV9SUGFydGl0aW9uKFB5T2JqZWN0ICpzdHJfb2JqLCBQeU9iamVjdCAqc2VwX29iaikKIHsKLSAgICBQeU9iamVjdCogc3RyX29iajsKLSAgICBQeU9iamVjdCogc2VwX29iajsKICAgICBQeU9iamVjdCogb3V0OwogICAgIGludCBraW5kMSwga2luZDI7CiAgICAgdm9pZCAqYnVmMSwgKmJ1ZjI7CiAgICAgUHlfc3NpemVfdCBsZW4xLCBsZW4yOwogCi0gICAgc3RyX29iaiA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KHN0cl9pbik7Ci0gICAgaWYgKCFzdHJfb2JqKQorICAgIGlmIChlbnN1cmVfdW5pY29kZShzdHJfb2JqKSA8IDAgfHwgZW5zdXJlX3VuaWNvZGUoc2VwX29iaikgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzZXBfb2JqID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc2VwX2luKTsKLSAgICBpZiAoIXNlcF9vYmopIHsKLSAgICAgICAgUHlfREVDUkVGKHN0cl9vYmopOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CiAKICAgICBraW5kMSA9IFB5VW5pY29kZV9LSU5EKHN0cl9vYmopOwogICAgIGtpbmQyID0gUHlVbmljb2RlX0tJTkQoc2VwX29iaik7CkBAIC0xMjc1NSw4ICsxMjc3MCw2IEBACiAgICAgICAgICAgICBvdXQgPSBQeVR1cGxlX1BhY2soMywgdW5pY29kZV9lbXB0eSwgdW5pY29kZV9lbXB0eSwgc3RyX29iaik7CiAgICAgICAgICAgICBQeV9ERUNSRUYodW5pY29kZV9lbXB0eSk7CiAgICAgICAgIH0KLSAgICAgICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgICAgICBQeV9ERUNSRUYoc3RyX29iaik7CiAgICAgICAgIHJldHVybiBvdXQ7CiAgICAgfQogICAgIGJ1ZjEgPSBQeVVuaWNvZGVfREFUQShzdHJfb2JqKTsKQEAgLTEyNzY0LDcgKzEyNzc3LDcgQEAKICAgICBpZiAoa2luZDIgIT0ga2luZDEpIHsKICAgICAgICAgYnVmMiA9IF9QeVVuaWNvZGVfQXNLaW5kKHNlcF9vYmosIGtpbmQxKTsKICAgICAgICAgaWYgKCFidWYyKQotICAgICAgICAgICAgZ290byBvbkVycm9yOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgc3dpdGNoIChraW5kMSkgewpAQCAtMTI3ODUsMTggKzEyNzk4LDEwIEBACiAgICAgICAgIG91dCA9IDA7CiAgICAgfQogCi0gICAgUHlfREVDUkVGKHNlcF9vYmopOwotICAgIFB5X0RFQ1JFRihzdHJfb2JqKTsKICAgICBpZiAoa2luZDIgIT0ga2luZDEpCiAgICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7CiAKICAgICByZXR1cm4gb3V0OwotICBvbkVycm9yOgotICAgIFB5X0RFQ1JFRihzZXBfb2JqKTsKLSAgICBQeV9ERUNSRUYoc3RyX29iaik7Ci0gICAgaWYgKGtpbmQyICE9IGtpbmQxICYmIGJ1ZjIpCi0gICAgICAgIFB5TWVtX0ZyZWUoYnVmMik7Ci0gICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihwYXJ0aXRpb25fX2RvY19fLApAQCAtMTI4MjgsMjQgKzEyODMzLDEwIEBACiBQeU9iamVjdCAqCiBQeVVuaWNvZGVfUlNwbGl0KFB5T2JqZWN0ICpzLCBQeU9iamVjdCAqc2VwLCBQeV9zc2l6ZV90IG1heHNwbGl0KQogewotICAgIFB5T2JqZWN0ICpyZXN1bHQ7Ci0KLSAgICBzID0gUHlVbmljb2RlX0Zyb21PYmplY3Qocyk7Ci0gICAgaWYgKHMgPT0gTlVMTCkKKyAgICBpZiAoZW5zdXJlX3VuaWNvZGUocykgPCAwIHx8IChzZXAgIT0gTlVMTCAmJiBlbnN1cmVfdW5pY29kZShzZXApIDwgMCkpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmIChzZXAgIT0gTlVMTCkgewotICAgICAgICBzZXAgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChzZXApOwotICAgICAgICBpZiAoc2VwID09IE5VTEwpIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQogCi0gICAgcmVzdWx0ID0gcnNwbGl0KHMsIHNlcCwgbWF4c3BsaXQpOwotCi0gICAgUHlfREVDUkVGKHMpOwotICAgIFB5X1hERUNSRUYoc2VwKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiByc3BsaXQocywgc2VwLCBtYXhzcGxpdCk7CiB9CiAKIFB5RG9jX1NUUlZBUihyc3BsaXRfX2RvY19fLApAQCAtMTI4NzAsMTAgKzEyODYxLDE0IEBACiAKICAgICBpZiAoc3Vic3RyaW5nID09IFB5X05vbmUpCiAgICAgICAgIHJldHVybiByc3BsaXQoc2VsZiwgTlVMTCwgbWF4Y291bnQpOwotICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKQorCisgICAgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKQogICAgICAgICByZXR1cm4gcnNwbGl0KHNlbGYsIHN1YnN0cmluZywgbWF4Y291bnQpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9SU3BsaXQoc2VsZiwgc3Vic3RyaW5nLCBtYXhjb3VudCk7CisKKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAibXVzdCBiZSBzdHIgb3IgTm9uZSwgbm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyaW5nKS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKIFB5RG9jX1NUUlZBUihzcGxpdGxpbmVzX19kb2NfXywKQEAgLTEzMTU0LDExICsxMzE0OSwxNSBAQAogICAgIGlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKICAgICAgICAgUHlfc3NpemVfdCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKLSAgICAgICAgICAgIHN1YnN0cmluZyA9IFB5VW5pY29kZV9Gcm9tT2JqZWN0KFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSk7Ci0gICAgICAgICAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCisgICAgICAgICAgICBzdWJzdHJpbmcgPSBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSk7CisgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJzdHJpbmcpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlIGZvciBzdGFydHN3aXRoIG11c3Qgb25seSBjb250YWluIHN0ciwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90ICUuMTAwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X1RZUEUoc3Vic3RyaW5nKS0+dHBfbmFtZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CkBAIC0xMzE2OCwxNSArMTMxNjcsMTMgQEAKICAgICAgICAgLyogbm90aGluZyBtYXRjaGVkICovCiAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9Ci0gICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vib2JqKTsKLSAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJzdGFydHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImEgdHVwbGUgb2Ygc3RyLCBub3QgJXMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOworICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHN1Ym9iaikpIHsKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJzdGFydHN3aXRoIGZpcnN0IGFyZyBtdXN0IGJlIHN0ciBvciAiCisgICAgICAgICAgICAgICAgICAgICAiYSB0dXBsZSBvZiBzdHIsIG5vdCAlLjEwMHMiLCBQeV9UWVBFKHN1Ym9iaiktPnRwX25hbWUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOwotICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOworICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJvYmosIHN0YXJ0LCBlbmQsIC0xKTsKICAgICBpZiAocmVzdWx0ID09IC0xKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CkBAIC0xMzIwNiwxMiArMTMyMDMsMTUgQEAKICAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CiAgICAgICAgIFB5X3NzaXplX3QgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7Ci0gICAgICAgICAgICBzdWJzdHJpbmcgPSBQeVVuaWNvZGVfRnJvbU9iamVjdCgKLSAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSkpOwotICAgICAgICAgICAgaWYgKHN1YnN0cmluZyA9PSBOVUxMKQorICAgICAgICAgICAgc3Vic3RyaW5nID0gUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpOworICAgICAgICAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2soc3Vic3RyaW5nKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0dXBsZSBmb3IgZW5kc3dpdGggbXVzdCBvbmx5IGNvbnRhaW4gc3RyLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgJS4xMDBzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShzdWJzdHJpbmcpLT50cF9uYW1lKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsICsxKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKQEAgLTEzMjIwLDE1ICsxMzIyMCwxMyBAQAogICAgICAgICB9CiAgICAgICAgIFB5X1JFVFVSTl9GQUxTRTsKICAgICB9Ci0gICAgc3Vic3RyaW5nID0gUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vib2JqKTsKLSAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpIHsKLSAgICAgICAgaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJlbmRzd2l0aCBmaXJzdCBhcmcgbXVzdCBiZSBzdHIgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJhIHR1cGxlIG9mIHN0ciwgbm90ICVzIiwgUHlfVFlQRShzdWJvYmopLT50cF9uYW1lKTsKKyAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiZW5kc3dpdGggZmlyc3QgYXJnIG11c3QgYmUgc3RyIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICJhIHR1cGxlIG9mIHN0ciwgbm90ICUuMTAwcyIsIFB5X1RZUEUoc3Vib2JqKS0+dHBfbmFtZSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCArMSk7Ci0gICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgKzEpOwogICAgIGlmIChyZXN1bHQgPT0gLTEpCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKQEAgLTEzMjM3LDQ0ICsxMzIzNSw1MCBAQAogUHlfTE9DQUxfSU5MSU5FKHZvaWQpCiBfUHlVbmljb2RlV3JpdGVyX1VwZGF0ZShfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIpCiB7Ci0gICAgaWYgKCF3cml0ZXItPnJlYWRvbmx5KQorICAgIHdyaXRlci0+bWF4Y2hhciA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRSh3cml0ZXItPmJ1ZmZlcik7CisgICAgd3JpdGVyLT5kYXRhID0gUHlVbmljb2RlX0RBVEEod3JpdGVyLT5idWZmZXIpOworCisgICAgaWYgKCF3cml0ZXItPnJlYWRvbmx5KSB7CisgICAgICAgIHdyaXRlci0+a2luZCA9IFB5VW5pY29kZV9LSU5EKHdyaXRlci0+YnVmZmVyKTsKICAgICAgICAgd3JpdGVyLT5zaXplID0gUHlVbmljb2RlX0dFVF9MRU5HVEgod3JpdGVyLT5idWZmZXIpOworICAgIH0KICAgICBlbHNlIHsKKyAgICAgICAgLyogdXNlIGEgdmFsdWUgc21hbGxlciB0aGFuIFB5VW5pY29kZV8xQllURV9LSU5EKCkgc28KKyAgICAgICAgICAgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCgpIHdpbGwgY29weSB0aGUgYnVmZmVyLiAqLworICAgICAgICB3cml0ZXItPmtpbmQgPSBQeVVuaWNvZGVfV0NIQVJfS0lORDsKKyAgICAgICAgYXNzZXJ0KHdyaXRlci0+a2luZCA8PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CisKICAgICAgICAgLyogQ29weS1vbi13cml0ZSBtb2RlOiBzZXQgYnVmZmVyIHNpemUgdG8gMCBzbwogICAgICAgICAgKiBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmUoKSB3aWxsIGNvcHkgKGFuZCBlbmxhcmdlKSB0aGUgYnVmZmVyIG9uCiAgICAgICAgICAqIG5leHQgd3JpdGUuICovCiAgICAgICAgIHdyaXRlci0+c2l6ZSA9IDA7CiAgICAgfQotICAgIHdyaXRlci0+bWF4Y2hhciA9IFB5VW5pY29kZV9NQVhfQ0hBUl9WQUxVRSh3cml0ZXItPmJ1ZmZlcik7Ci0gICAgd3JpdGVyLT5kYXRhID0gUHlVbmljb2RlX0RBVEEod3JpdGVyLT5idWZmZXIpOwotICAgIHdyaXRlci0+a2luZCA9IFB5VW5pY29kZV9LSU5EKHdyaXRlci0+YnVmZmVyKTsKIH0KIAogdm9pZAogX1B5VW5pY29kZVdyaXRlcl9Jbml0KF9QeVVuaWNvZGVXcml0ZXIgKndyaXRlcikKIHsKICAgICBtZW1zZXQod3JpdGVyLCAwLCBzaXplb2YoKndyaXRlcikpOwotI2lmZGVmIFB5X0RFQlVHCi0gICAgd3JpdGVyLT5raW5kID0gNTsgICAgLyogaW52YWxpZCBraW5kICovCi0jZW5kaWYKKworICAgIC8qIEFTQ0lJIGlzIHRoZSBiYXJlIG1pbmltdW0gKi8KICAgICB3cml0ZXItPm1pbl9jaGFyID0gMTI3OworCisgICAgLyogdXNlIGEgdmFsdWUgc21hbGxlciB0aGFuIFB5VW5pY29kZV8xQllURV9LSU5EKCkgc28KKyAgICAgICBfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kKCkgd2lsbCBjb3B5IHRoZSBidWZmZXIuICovCisgICAgd3JpdGVyLT5raW5kID0gUHlVbmljb2RlX1dDSEFSX0tJTkQ7CisgICAgYXNzZXJ0KHdyaXRlci0+a2luZCA8PSBQeVVuaWNvZGVfMUJZVEVfS0lORCk7CiB9CiAKIGludAogX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlSW50ZXJuYWwoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW5ndGgsIFB5X1VDUzQgbWF4Y2hhcikKIHsKLSNpZmRlZiBNU19XSU5ET1dTCi0gICAvKiBPbiBXaW5kb3dzLCBvdmVyYWxsb2NhdGUgYnkgNTAlIGlzIHRoZSBiZXN0IGZhY3RvciAqLwotIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgMgotI2Vsc2UKLSAgIC8qIE9uIExpbnV4LCBvdmVyYWxsb2NhdGUgYnkgMjUlIGlzIHRoZSBiZXN0IGZhY3RvciAqLwotIyAgZGVmaW5lIE9WRVJBTExPQ0FURV9GQUNUT1IgNAotI2VuZGlmCiAgICAgUHlfc3NpemVfdCBuZXdsZW47CiAgICAgUHlPYmplY3QgKm5ld2J1ZmZlcjsKIAotICAgIGFzc2VydChsZW5ndGggPiAwKTsKKyAgICAvKiBlbnN1cmUgdGhhdCB0aGUgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlIG1hY3JvIHdhcyB1c2VkICovCisgICAgYXNzZXJ0KChtYXhjaGFyID4gd3JpdGVyLT5tYXhjaGFyICYmIGxlbmd0aCA+PSAwKQorICAgICAgICAgICB8fCBsZW5ndGggPiAwKTsKIAogICAgIGlmIChsZW5ndGggPiBQWV9TU0laRV9UX01BWCAtIHdyaXRlci0+cG9zKSB7CiAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CkBAIC0xMzM0MCw2ICsxMzM0NCwyOCBAQAogI3VuZGVmIE9WRVJBTExPQ0FURV9GQUNUT1IKIH0KIAoraW50CitfUHlVbmljb2RlV3JpdGVyX1ByZXBhcmVLaW5kSW50ZXJuYWwoX1B5VW5pY29kZVdyaXRlciAqd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCkKK3sKKyAgICBQeV9VQ1M0IG1heGNoYXI7CisKKyAgICAvKiBlbnN1cmUgdGhhdCB0aGUgX1B5VW5pY29kZVdyaXRlcl9QcmVwYXJlS2luZCBtYWNybyB3YXMgdXNlZCAqLworICAgIGFzc2VydCh3cml0ZXItPmtpbmQgPCBraW5kKTsKKworICAgIHN3aXRjaCAoa2luZCkKKyAgICB7CisgICAgY2FzZSBQeVVuaWNvZGVfMUJZVEVfS0lORDogbWF4Y2hhciA9IDB4ZmY7IGJyZWFrOworICAgIGNhc2UgUHlVbmljb2RlXzJCWVRFX0tJTkQ6IG1heGNoYXIgPSAweGZmZmY7IGJyZWFrOworICAgIGNhc2UgUHlVbmljb2RlXzRCWVRFX0tJTkQ6IG1heGNoYXIgPSAweDEwZmZmZjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDAgJiYgImludmFsaWQga2luZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIF9QeVVuaWNvZGVXcml0ZXJfUHJlcGFyZUludGVybmFsKHdyaXRlciwgMCwgbWF4Y2hhcik7Cit9CisKIFB5X0xPQ0FMX0lOTElORShpbnQpCiBfUHlVbmljb2RlV3JpdGVyX1dyaXRlQ2hhcklubGluZShfUHlVbmljb2RlV3JpdGVyICp3cml0ZXIsIFB5X1VDUzQgY2gpCiB7CkBAIC0xMzUxMCwxNyArMTM1MzYsMjYgQEAKICAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgPT0gd3JpdGVyLT5wb3MpOwogICAgICAgICByZXR1cm4gc3RyOwogICAgIH0KLSAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgod3JpdGVyLT5idWZmZXIpICE9IHdyaXRlci0+cG9zKSB7Ci0gICAgICAgIFB5T2JqZWN0ICpuZXdidWZmZXI7Ci0gICAgICAgIG5ld2J1ZmZlciA9IHJlc2l6ZV9jb21wYWN0KHdyaXRlci0+YnVmZmVyLCB3cml0ZXItPnBvcyk7Ci0gICAgICAgIGlmIChuZXdidWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgUHlfQ0xFQVIod3JpdGVyLT5idWZmZXIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVyLT5idWZmZXIgPSBuZXdidWZmZXI7CisgICAgaWYgKHdyaXRlci0+cG9zID09IDApIHsKKyAgICAgICAgUHlfQ0xFQVIod3JpdGVyLT5idWZmZXIpOworCisgICAgICAgIC8qIEdldCB0aGUgZW1wdHkgVW5pY29kZSBzdHJpbmcgc2luZ2xldG9uICgnJykgKi8KKyAgICAgICAgX1B5X0lOQ1JFRl9VTklDT0RFX0VNUFRZKCk7CisgICAgICAgIHN0ciAgPSB1bmljb2RlX2VtcHR5OwogICAgIH0KLSAgICBzdHIgPSB3cml0ZXItPmJ1ZmZlcjsKLSAgICB3cml0ZXItPmJ1ZmZlciA9IE5VTEw7CisgICAgZWxzZSB7CisgICAgICAgIHN0ciA9IHdyaXRlci0+YnVmZmVyOworICAgICAgICB3cml0ZXItPmJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgIT0gd3JpdGVyLT5wb3MpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpzdHIyOworICAgICAgICAgICAgc3RyMiA9IHJlc2l6ZV9jb21wYWN0KHN0ciwgd3JpdGVyLT5wb3MpOworICAgICAgICAgICAgaWYgKHN0cjIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHN0ciA9IHN0cjI7CisgICAgICAgIH0KKyAgICB9CisKICAgICBhc3NlcnQoX1B5VW5pY29kZV9DaGVja0NvbnNpc3RlbmN5KHN0ciwgMSkpOwogICAgIHJldHVybiB1bmljb2RlX3Jlc3VsdF9yZWFkeShzdHIpOwogfQpAQCAtMTQ2NjEsMTMgKzE0Njk2LDEwIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGN0eC5mbXRzdHIgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChmb3JtYXQpOwotICAgIGlmIChjdHguZm10c3RyID09IE5VTEwpCisgICAgaWYgKGVuc3VyZV91bmljb2RlKGZvcm1hdCkgPCAwKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoUHlVbmljb2RlX1JFQURZKGN0eC5mbXRzdHIpID09IC0xKSB7Ci0gICAgICAgIFB5X0RFQ1JFRihjdHguZm10c3RyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorCisgICAgY3R4LmZtdHN0ciA9IGZvcm1hdDsKICAgICBjdHguZm10ZGF0YSA9IFB5VW5pY29kZV9EQVRBKGN0eC5mbXRzdHIpOwogICAgIGN0eC5mbXRraW5kID0gUHlVbmljb2RlX0tJTkQoY3R4LmZtdHN0cik7CiAgICAgY3R4LmZtdGNudCA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKGN0eC5mbXRzdHIpOwpAQCAtMTQ3MjcsMTEgKzE0NzU5LDkgQEAKICAgICBpZiAoY3R4LmFyZ3Nfb3duZWQpIHsKICAgICAgICAgUHlfREVDUkVGKGN0eC5hcmdzKTsKICAgICB9Ci0gICAgUHlfREVDUkVGKGN0eC5mbXRzdHIpOwogICAgIHJldHVybiBfUHlVbmljb2RlV3JpdGVyX0ZpbmlzaCgmY3R4LndyaXRlcik7CiAKICAgb25FcnJvcjoKLSAgICBQeV9ERUNSRUYoY3R4LmZtdHN0cik7CiAgICAgX1B5VW5pY29kZVdyaXRlcl9EZWFsbG9jKCZjdHgud3JpdGVyKTsKICAgICBpZiAoY3R4LmFyZ3Nfb3duZWQpIHsKICAgICAgICAgUHlfREVDUkVGKGN0eC5hcmdzKTsKZGlmZiAtLWdpdCBhL09iamVjdHMvd2Vha3JlZm9iamVjdC5jIGIvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMKaW5kZXggN2U2ZjM2NC4uZjc1YjFlOCAxMDA2NDQKLS0tIGEvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMKKysrIGIvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1wYXJzZV93ZWFrcmVmX2luaXRfYXJncyhjaGFyICpmdW5jbmFtZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MsCitwYXJzZV93ZWFrcmVmX2luaXRfYXJncyhjb25zdCBjaGFyICpmdW5jbmFtZSwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2FyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKm9icCwgUHlPYmplY3QgKipjYWxsYmFja3ApCiB7CiAgICAgcmV0dXJuIFB5QXJnX1VucGFja1R1cGxlKGFyZ3MsIGZ1bmNuYW1lLCAxLCAyLCBvYnAsIGNhbGxiYWNrcCk7CmRpZmYgLS1naXQgYS9QQy9fbXNpLmMgYi9QQy9fbXNpLmMKaW5kZXggODZhNTk0My4uYjY2YjE4YiAxMDA2NDQKLS0tIGEvUEMvX21zaS5jCisrKyBiL1BDL19tc2kuYwpAQCAtMTAzMiwxMiArMTAzMiwxMiBAQAogICAgIGlmIChtID09IE5VTEwpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9DUkVBVEVESVJFQ1QiLCAoaW50KU1TSURCT1BFTl9DUkVBVEVESVJFQ1QpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFIiwgKGludClNU0lEQk9QRU5fQ1JFQVRFKTsKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0RJUkVDVCIsIChpbnQpTVNJREJPUEVOX0RJUkVDVCk7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9SRUFET05MWSIsIChpbnQpTVNJREJPUEVOX1JFQURPTkxZKTsKLSAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1RSQU5TQUNUIiwgKGludClNU0lEQk9QRU5fVFJBTlNBQ1QpOwotICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fUEFUQ0hGSUxFIiwgKGludClNU0lEQk9QRU5fUEFUQ0hGSUxFKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX0NSRUFURURJUkVDVCIsIChsb25nKU1TSURCT1BFTl9DUkVBVEVESVJFQ1QpOworICAgIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICJNU0lEQk9QRU5fQ1JFQVRFIiwgKGxvbmcpTVNJREJPUEVOX0NSRUFURSk7CisgICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIk1TSURCT1BFTl9ESVJFQ1QiLCAobG9uZylNU0lEQk9QRU5fRElSRUNUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1JFQURPTkxZIiwgKGxvbmcpTVNJREJPUEVOX1JFQURPTkxZKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1RSQU5TQUNUIiwgKGxvbmcpTVNJREJPUEVOX1RSQU5TQUNUKTsKKyAgICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiTVNJREJPUEVOX1BBVENIRklMRSIsIChsb25nKU1TSURCT1BFTl9QQVRDSEZJTEUpOwogCiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTVNJQ09MSU5GT19OQU1FUyk7CiAgICAgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgTVNJQ09MSU5GT19UWVBFUyk7CmRpZmYgLS1naXQgYS9QQy9iZGlzdF93aW5pbnN0L2luc3RhbGwuYyBiL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCmluZGV4IGNiMDM3ZmYuLmUwMWRiYTYgMTAwNjQ0Ci0tLSBhL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCisrKyBiL1BDL2JkaXN0X3dpbmluc3QvaW5zdGFsbC5jCkBAIC03MTgsNyArNzE4LDcgQEAKICAqIDEgaWYgdGhlIFB5dGhvbi1kbGwgZG9lcyBub3QgZXhwb3J0IHRoZSBmdW5jdGlvbnMgd2UgbmVlZAogICogMiBpZiBubyBpbnN0YWxsLXNjcmlwdCBpcyBzcGVjaWZpZWQgaW4gcGF0aG5hbWUKICAqIDMgaWYgdGhlIGluc3RhbGwtc2NyaXB0IGZpbGUgY291bGQgbm90IGJlIG9wZW5lZAotICogdGhlIHJldHVybiB2YWx1ZSBvZiBQeVJ1bl9TaW1wbGVTdHJpbmcoKSBvdGhlcndpc2UsCisgKiB0aGUgcmV0dXJuIHZhbHVlIG9mIFB5UnVuX1NpbXBsZVN0cmluZygpIG9yIFB5X0ZpbmFsaXplRXgoKSBvdGhlcndpc2UsCiAgKiB3aGljaCBpcyAwIGlmIGV2ZXJ5dGhpbmcgaXMgb2ssIC0xIGlmIGFuIGV4Y2VwdGlvbiBoYWQgb2NjdXJyZWQKICAqIGluIHRoZSBpbnN0YWxsLXNjcmlwdC4KICAqLwpAQCAtNzMxLDcgKzczMSw3IEBACiAgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfSW5pdGlhbGl6ZSwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5U3lzX1NldEFyZ3YsIChpbnQsIHdjaGFyX3QgKiopKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5UnVuX1NpbXBsZVN0cmluZywgKGNoYXIgKikpOwotICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0ZpbmFsaXplLCAodm9pZCkpOworICAgIERFQ0xQUk9DKGhQeXRob24sIGludCwgUHlfRmluYWxpemVFeCwgKHZvaWQpKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeV9CdWlsZFZhbHVlLCAoY2hhciAqLCAuLi4pKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCBQeU9iamVjdCAqLCBQeUNGdW5jdGlvbl9OZXcsCiAgICAgICAgICAgICAgKFB5TWV0aG9kRGVmICosIFB5T2JqZWN0ICopKTsKQEAgLTczOSw3ICs3MzksNyBAQAogICAgIERFQ0xQUk9DKGhQeXRob24sIFB5T2JqZWN0ICosIFB5RXJyX0Zvcm1hdCwgKFB5T2JqZWN0ICosIGNoYXIgKikpOwogCiAgICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeVN5c19TZXRBcmd2Ci0gICAgICAgIHx8ICFQeVJ1bl9TaW1wbGVTdHJpbmcgfHwgIVB5X0ZpbmFsaXplKQorICAgICAgICB8fCAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeV9GaW5hbGl6ZUV4KQogICAgICAgICByZXR1cm4gMTsKIAogICAgIGlmICghUHlfQnVpbGRWYWx1ZSB8fCAhUHlBcmdfUGFyc2VUdXBsZSB8fCAhUHlFcnJfRm9ybWF0KQpAQCAtNzg2LDcgKzc4Niw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICByZXN1bHQgPSAtMTsKKyAgICB9CiAKICAgICBjbG9zZShmaCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTg0OCwxMSArODUwLDExIEBACiAgICAgaW50IHJjOwogICAgIERFQ0xQUk9DKGhQeXRob24sIHZvaWQsIFB5X0luaXRpYWxpemUsICh2b2lkKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgdm9pZCwgUHlfU2V0UHJvZ3JhbU5hbWUsICh3Y2hhcl90ICopKTsKLSAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeV9GaW5hbGl6ZSwgKHZvaWQpKTsKKyAgICBERUNMUFJPQyhoUHl0aG9uLCBpbnQsIFB5X0ZpbmFsaXplRXgsICh2b2lkKSk7CiAgICAgREVDTFBST0MoaFB5dGhvbiwgaW50LCBQeVJ1bl9TaW1wbGVTdHJpbmcsIChjaGFyICopKTsKICAgICBERUNMUFJPQyhoUHl0aG9uLCB2b2lkLCBQeUVycl9QcmludCwgKHZvaWQpKTsKIAotICAgIGlmICghUHlfSW5pdGlhbGl6ZSB8fCAhUHlfU2V0UHJvZ3JhbU5hbWUgfHwgIVB5X0ZpbmFsaXplIHx8CisgICAgaWYgKCFQeV9Jbml0aWFsaXplIHx8ICFQeV9TZXRQcm9ncmFtTmFtZSB8fCAhUHlfRmluYWxpemVFeCB8fAogICAgICAgICAhUHlSdW5fU2ltcGxlU3RyaW5nIHx8ICFQeUVycl9QcmludCkKICAgICAgICAgcmV0dXJuIC0xOwogCkBAIC04NjIsNyArODY0LDkgQEAKICAgICByYyA9IFB5UnVuX1NpbXBsZVN0cmluZyhzY3JpcHQpOwogICAgIGlmIChyYykKICAgICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICBQeV9GaW5hbGl6ZSgpOworICAgIGlmIChQeV9GaW5hbGl6ZUV4KCkgPCAwKSB7CisgICAgICAgIHJjID0gLTE7CisgICAgfQogICAgIHJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvUEMvY2xpbmljL21zdmNydG1vZHVsZS5jLmggYi9QQy9jbGluaWMvbXN2Y3J0bW9kdWxlLmMuaAppbmRleCBlN2E3MmM0Li5hNWI0Y2NmIDEwMDY0NAotLS0gYS9QQy9jbGluaWMvbXN2Y3J0bW9kdWxlLmMuaAorKysgYi9QQy9jbGluaWMvbXN2Y3J0bW9kdWxlLmMuaApAQCAtNTEsOCArNTEsOSBAQAogICAgIGxvbmcgbmJ5dGVzOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaWw6bG9ja2luZyIsCi0gICAgICAgICZmZCwgJm1vZGUsICZuYnl0ZXMpKQorICAgICAgICAmZmQsICZtb2RlLCAmbmJ5dGVzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF9sb2NraW5nX2ltcGwobW9kdWxlLCBmZCwgbW9kZSwgbmJ5dGVzKTsKIAogZXhpdDoKQEAgLTg1LDExICs4NiwxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6c2V0bW9kZSIsCi0gICAgICAgICZmZCwgJmZsYWdzKSkKKyAgICAgICAgJmZkLCAmZmxhZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IG1zdmNydF9zZXRtb2RlX2ltcGwobW9kdWxlLCBmZCwgZmxhZ3MpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xMjEsMTEgKzEyNCwxMyBAQAogICAgIGxvbmcgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiIl9QeV9QQVJTRV9JTlRQVFIiaTpvcGVuX29zZmhhbmRsZSIsCi0gICAgICAgICZoYW5kbGUsICZmbGFncykpCisgICAgICAgICZoYW5kbGUsICZmbGFncykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X29wZW5fb3NmaGFuZGxlX2ltcGwobW9kdWxlLCBoYW5kbGUsIGZsYWdzKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMTUzLDExICsxNTgsMTMgQEAKICAgICBpbnQgZmQ7CiAgICAgUHlfaW50cHRyX3QgX3JldHVybl92YWx1ZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpnZXRfb3NmaGFuZGxlIiwgJmZkKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImk6Z2V0X29zZmhhbmRsZSIsICZmZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X2dldF9vc2ZoYW5kbGVfaW1wbChtb2R1bGUsIGZkKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Wb2lkUHRyKCh2b2lkICopX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xODMsOCArMTkwLDkgQEAKICAgICBsb25nIF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gbXN2Y3J0X2tiaGl0X2ltcGwobW9kdWxlKTsKLSAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpCisgICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlMb25nX0Zyb21Mb25nKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtMzExLDggKzMxOSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgY2hhciBjaGFyX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJjOnB1dGNoIiwgJmNoYXJfdmFsdWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiYzpwdXRjaCIsICZjaGFyX3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF9wdXRjaF9pbXBsKG1vZHVsZSwgY2hhcl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zMzcsOCArMzQ2LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgdW5pY29kZV9jaGFyOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJDOnB1dHdjaCIsICZ1bmljb2RlX2NoYXIpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiQzpwdXR3Y2giLCAmdW5pY29kZV9jaGFyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF9wdXR3Y2hfaW1wbChtb2R1bGUsIHVuaWNvZGVfY2hhcik7CiAKIGV4aXQ6CkBAIC0zNjcsOCArMzc3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBjaGFyIGNoYXJfdmFsdWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImM6dW5nZXRjaCIsICZjaGFyX3ZhbHVlKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgImM6dW5nZXRjaCIsICZjaGFyX3ZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF91bmdldGNoX2ltcGwobW9kdWxlLCBjaGFyX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTM5Myw4ICs0MDQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIGludCB1bmljb2RlX2NoYXI7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6dW5nZXR3Y2giLCAmdW5pY29kZV9jaGFyKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIkM6dW5nZXR3Y2giLCAmdW5pY29kZV9jaGFyKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF91bmdldHdjaF9pbXBsKG1vZHVsZSwgdW5pY29kZV9jaGFyKTsKIAogZXhpdDoKQEAgLTQyNiwxMSArNDM4LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpDcnRTZXRSZXBvcnRGaWxlIiwKLSAgICAgICAgJnR5cGUsICZmaWxlKSkKKyAgICAgICAgJnR5cGUsICZmaWxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfQ3J0U2V0UmVwb3J0RmlsZV9pbXBsKG1vZHVsZSwgdHlwZSwgZmlsZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTQ2NCwxMSArNDc4LDEzIEBACiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpaTpDcnRTZXRSZXBvcnRNb2RlIiwKLSAgICAgICAgJnR5cGUsICZtb2RlKSkKKyAgICAgICAgJnR5cGUsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfQ3J0U2V0UmVwb3J0TW9kZV9pbXBsKG1vZHVsZSwgdHlwZSwgbW9kZSk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZyhfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTUwMCwxMSArNTE2LDEzIEBACiAgICAgaW50IG1vZGU7CiAgICAgbG9uZyBfcmV0dXJuX3ZhbHVlOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOnNldF9lcnJvcl9tb2RlIiwgJm1vZGUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpzZXRfZXJyb3JfbW9kZSIsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSBtc3ZjcnRfc2V0X2Vycm9yX21vZGVfaW1wbChtb2R1bGUsIG1vZGUpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC01MzEsOCArNTQ5LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICB1bnNpZ25lZCBpbnQgbW9kZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiSTpTZXRFcnJvck1vZGUiLCAmbW9kZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJJOlNldEVycm9yTW9kZSIsICZtb2RlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IG1zdmNydF9TZXRFcnJvck1vZGVfaW1wbChtb2R1bGUsIG1vZGUpOwogCiBleGl0OgpAQCAtNTUwLDQgKzU2OSw0IEBACiAjaWZuZGVmIE1TVkNSVF9TRVRfRVJST1JfTU9ERV9NRVRIT0RERUYKICAgICAjZGVmaW5lIE1TVkNSVF9TRVRfRVJST1JfTU9ERV9NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChNU1ZDUlRfU0VUX0VSUk9SX01PREVfTUVUSE9EREVGKSAqLwotLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PTJhNzk0YzUyMGQ2YWU4ODcgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLworLypbY2xpbmljIGVuZCBnZW5lcmF0ZWQgY29kZTogb3V0cHV0PWVjZTgxMDZjMDU5MmZmMWYgaW5wdXQ9YTkwNDkwNTQwMTNhMWI3N10qLwpkaWZmIC0tZ2l0IGEvUEMvY2xpbmljL3dpbnJlZy5jLmggYi9QQy9jbGluaWMvd2lucmVnLmMuaAppbmRleCBmNmFlMmMwLi4yNjRkY2YwIDEwMDY0NAotLS0gYS9QQy9jbGluaWMvd2lucmVnLmMuaAorKysgYi9QQy9jbGluaWMvd2lucmVnLmMuaApAQCAtOTMsOCArOTMsOSBAQAogICAgIFB5T2JqZWN0ICp0cmFjZWJhY2s7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPT086X19leGl0X18iLCBfa2V5d29yZHMsCi0gICAgICAgICZleGNfdHlwZSwgJmV4Y192YWx1ZSwgJnRyYWNlYmFjaykpCisgICAgICAgICZleGNfdHlwZSwgJmV4Y192YWx1ZSwgJnRyYWNlYmFjaykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfSEtFWVR5cGVfX19leGl0X19faW1wbChzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spOwogCiBleGl0OgpAQCAtMTQ3LDExICsxNDgsMTMgQEAKICAgICBIS0VZIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlpPJjpDb25uZWN0UmVnaXN0cnkiLAotICAgICAgICAmY29tcHV0ZXJfbmFtZSwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkKKyAgICAgICAgJmNvbXB1dGVyX25hbWUsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gd2lucmVnX0Nvbm5lY3RSZWdpc3RyeV9pbXBsKG1vZHVsZSwgY29tcHV0ZXJfbmFtZSwga2V5KTsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUhLRVlfRnJvbUhLRVkoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0xOTIsMTEgKzE5NSwxMyBAQAogICAgIEhLRVkgX3JldHVybl92YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaOkNyZWF0ZUtleSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXkpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIF9yZXR1cm5fdmFsdWUgPSB3aW5yZWdfQ3JlYXRlS2V5X2ltcGwobW9kdWxlLCBrZXksIHN1Yl9rZXkpOwotICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpCisgICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5SEtFWV9Gcm9tSEtFWShfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTI0NywxMSArMjUyLDEzIEBACiAgICAgSEtFWSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZafGlpOkNyZWF0ZUtleUV4IiwgX2tleXdvcmRzLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHdpbnJlZ19DcmVhdGVLZXlFeF9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5LCByZXNlcnZlZCwgYWNjZXNzKTsKLSAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKQorICAgIGlmIChfcmV0dXJuX3ZhbHVlID09IE5VTEwpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUhLRVlfRnJvbUhLRVkoX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0yOTAsOCArMjk3LDkgQEAKICAgICBQeV9VTklDT0RFICpzdWJfa2V5OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJnU6RGVsZXRlS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0RlbGV0ZUtleV9pbXBsKG1vZHVsZSwga2V5LCBzdWJfa2V5KTsKIAogZXhpdDoKQEAgLTM0MSw4ICszNDksOSBAQAogICAgIGludCByZXNlcnZlZCA9IDA7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJnV8aWk6RGVsZXRlS2V5RXgiLCBfa2V5d29yZHMsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZhY2Nlc3MsICZyZXNlcnZlZCkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZhY2Nlc3MsICZyZXNlcnZlZCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRGVsZXRlS2V5RXhfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSwgYWNjZXNzLCByZXNlcnZlZCk7CiAKIGV4aXQ6CkBAIC0zNzQsOCArMzgzLDkgQEAKICAgICBQeV9VTklDT0RFICp2YWx1ZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZaOkRlbGV0ZVZhbHVlIiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmdmFsdWUpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRGVsZXRlVmFsdWVfaW1wbChtb2R1bGUsIGtleSwgdmFsdWUpOwogCiBleGl0OgpAQCAtNDExLDggKzQyMSw5IEBACiAgICAgaW50IGluZGV4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6RW51bUtleSIsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJmluZGV4KSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmaW5kZXgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0VudW1LZXlfaW1wbChtb2R1bGUsIGtleSwgaW5kZXgpOwogCiBleGl0OgpAQCAtNDU3LDggKzQ2OCw5IEBACiAgICAgaW50IGluZGV4OwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJmk6RW51bVZhbHVlIiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmaW5kZXgpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZpbmRleCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRW51bVZhbHVlX2ltcGwobW9kdWxlLCBrZXksIGluZGV4KTsKIAogZXhpdDoKQEAgLTQ4Myw4ICs0OTUsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5X1VOSUNPREUgKnN0cmluZzsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAidTpFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3MiLCAmc3RyaW5nKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgInU6RXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzIiwgJnN0cmluZykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRXhwYW5kRW52aXJvbm1lbnRTdHJpbmdzX2ltcGwobW9kdWxlLCBzdHJpbmcpOwogCiBleGl0OgpAQCAtNTIyLDggKzUzNSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgSEtFWSBrZXk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOkZsdXNoS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOkZsdXNoS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19GbHVzaEtleV9pbXBsKG1vZHVsZSwga2V5KTsKIAogZXhpdDoKQEAgLTU3NCw4ICs1ODgsOSBAQAogICAgIFB5X1VOSUNPREUgKmZpbGVfbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ1dTpMb2FkS2V5IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJmZpbGVfbmFtZSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZmaWxlX25hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX0xvYWRLZXlfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSwgZmlsZV9uYW1lKTsKIAogZXhpdDoKQEAgLTYyMCwxMSArNjM1LDEzIEBACiAgICAgSEtFWSBfcmV0dXJuX3ZhbHVlOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTyZafGlpOk9wZW5LZXkiLCBfa2V5d29yZHMsCi0gICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXksICZyZXNlcnZlZCwgJmFjY2VzcykpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICBfcmV0dXJuX3ZhbHVlID0gd2lucmVnX09wZW5LZXlfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSwgcmVzZXJ2ZWQsIGFjY2Vzcyk7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlIS0VZX0Zyb21IS0VZKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNjY5LDExICs2ODYsMTMgQEAKICAgICBIS0VZIF9yZXR1cm5fdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJPJlp8aWk6T3BlbktleUV4IiwgX2tleXdvcmRzLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmcmVzZXJ2ZWQsICZhY2Nlc3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgX3JldHVybl92YWx1ZSA9IHdpbnJlZ19PcGVuS2V5RXhfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSwgcmVzZXJ2ZWQsIGFjY2Vzcyk7Ci0gICAgaWYgKF9yZXR1cm5fdmFsdWUgPT0gTlVMTCkKKyAgICBpZiAoX3JldHVybl92YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gUHlIS0VZX0Zyb21IS0VZKF9yZXR1cm5fdmFsdWUpOwogCiBleGl0OgpAQCAtNzA3LDggKzcyNiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgSEtFWSBrZXk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOlF1ZXJ5SW5mb0tleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJPJjpRdWVyeUluZm9LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX1F1ZXJ5SW5mb0tleV9pbXBsKG1vZHVsZSwga2V5KTsKIAogZXhpdDoKQEAgLTc0OSw4ICs3NjksOSBAQAogICAgIFB5X1VOSUNPREUgKnN1Yl9rZXk7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mWjpRdWVyeVZhbHVlIiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJnN1Yl9rZXkpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX1F1ZXJ5VmFsdWVfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSk7CiAKIGV4aXQ6CkBAIC03ODcsOCArODA4LDkgQEAKICAgICBQeV9VTklDT0RFICpuYW1lOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJlo6UXVlcnlWYWx1ZUV4IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmbmFtZSkpCisgICAgICAgIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX1F1ZXJ5VmFsdWVFeF9pbXBsKG1vZHVsZSwga2V5LCBuYW1lKTsKIAogZXhpdDoKQEAgLTgzMCw4ICs4NTIsOSBAQAogICAgIFB5X1VOSUNPREUgKmZpbGVfbmFtZTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyZ1OlNhdmVLZXkiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZmaWxlX25hbWUpKQorICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZmaWxlX25hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2lucmVnX1NhdmVLZXlfaW1wbChtb2R1bGUsIGtleSwgZmlsZV9uYW1lKTsKIAogZXhpdDoKQEAgLTg4Myw4ICs5MDYsOSBAQAogICAgIFB5X3NzaXplX2NsZWFuX3QgdmFsdWVfbGVuZ3RoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPJlprdSM6U2V0VmFsdWUiLAotICAgICAgICBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXksICZzdWJfa2V5LCAmdHlwZSwgJnZhbHVlLCAmdmFsdWVfbGVuZ3RoKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmc3ViX2tleSwgJnR5cGUsICZ2YWx1ZSwgJnZhbHVlX2xlbmd0aCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfU2V0VmFsdWVfaW1wbChtb2R1bGUsIGtleSwgc3ViX2tleSwgdHlwZSwgdmFsdWUsIHZhbHVlX2xlbmd0aCk7CiAKIGV4aXQ6CkBAIC05MDcsNyArOTMxLDcgQEAKICIgICAgQW4gaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aGUgZGF0YSwgb25lIG9mOlxuIgogIiAgICBSRUdfQklOQVJZIC0tIEJpbmFyeSBkYXRhIGluIGFueSBmb3JtLlxuIgogIiAgICBSRUdfRFdPUkQgLS0gQSAzMi1iaXQgbnVtYmVyLlxuIgotIiAgICBSRUdfRFdPUkRfTElUVExFX0VORElBTiAtLSBBIDMyLWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuXG4iCisiICAgIFJFR19EV09SRF9MSVRUTEVfRU5ESUFOIC0tIEEgMzItYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4gRXF1aXZhbGVudCB0byBSRUdfRFdPUkRcbiIKICIgICAgUkVHX0RXT1JEX0JJR19FTkRJQU4gLS0gQSAzMi1iaXQgbnVtYmVyIGluIGJpZy1lbmRpYW4gZm9ybWF0LlxuIgogIiAgICBSRUdfRVhQQU5EX1NaIC0tIEEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0aGF0IGNvbnRhaW5zIHVuZXhwYW5kZWRcbiIKICIgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VzIHRvIGVudmlyb25tZW50IHZhcmlhYmxlcyAoZm9yIGV4YW1wbGUsXG4iCkBAIC05MTcsNiArOTQxLDggQEAKICIgICAgICAgICAgICAgICAgICAgIGJ5IHR3byBudWxsIGNoYXJhY3RlcnMuICBOb3RlIHRoYXQgUHl0aG9uIGhhbmRsZXNcbiIKICIgICAgICAgICAgICAgICAgICAgIHRoaXMgdGVybWluYXRpb24gYXV0b21hdGljYWxseS5cbiIKICIgICAgUkVHX05PTkUgLS0gTm8gZGVmaW5lZCB2YWx1ZSB0eXBlLlxuIgorIiAgICBSRUdfUVdPUkQgLS0gQSA2NC1iaXQgbnVtYmVyLlxuIgorIiAgICBSRUdfUVdPUkRfTElUVExFX0VORElBTiAtLSBBIDY0LWJpdCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuIEVxdWl2YWxlbnQgdG8gUkVHX1FXT1JELlxuIgogIiAgICBSRUdfUkVTT1VSQ0VfTElTVCAtLSBBIGRldmljZS1kcml2ZXIgcmVzb3VyY2UgbGlzdC5cbiIKICIgICAgUkVHX1NaIC0tIEEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy5cbiIKICIgIHZhbHVlXG4iCkBAIC05NTAsOCArOTc2LDkgQEAKICAgICBQeU9iamVjdCAqdmFsdWU7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8mWk9rTzpTZXRWYWx1ZUV4IiwKLSAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmdmFsdWVfbmFtZSwgJnJlc2VydmVkLCAmdHlwZSwgJnZhbHVlKSkKKyAgICAgICAgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5LCAmdmFsdWVfbmFtZSwgJnJlc2VydmVkLCAmdHlwZSwgJnZhbHVlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19TZXRWYWx1ZUV4X2ltcGwobW9kdWxlLCBrZXksIHZhbHVlX25hbWUsIHJlc2VydmVkLCB0eXBlLCB2YWx1ZSk7CiAKIGV4aXQ6CkBAIC05ODUsOCArMTAxMiw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgSEtFWSBrZXk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOkRpc2FibGVSZWZsZWN0aW9uS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOkRpc2FibGVSZWZsZWN0aW9uS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IHdpbnJlZ19EaXNhYmxlUmVmbGVjdGlvbktleV9pbXBsKG1vZHVsZSwga2V5KTsKIAogZXhpdDoKQEAgLTEwMTgsOCArMTA0Niw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgSEtFWSBrZXk7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOkVuYWJsZVJlZmxlY3Rpb25LZXkiLCBjbGluaWNfSEtFWV9jb252ZXJ0ZXIsICZrZXkpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6RW5hYmxlUmVmbGVjdGlvbktleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfRW5hYmxlUmVmbGVjdGlvbktleV9pbXBsKG1vZHVsZSwga2V5KTsKIAogZXhpdDoKQEAgLTEwNDksMTEgKzEwNzgsMTIgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBIS0VZIGtleTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiTyY6UXVlcnlSZWZsZWN0aW9uS2V5IiwgY2xpbmljX0hLRVlfY29udmVydGVyLCAma2V5KSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIk8mOlF1ZXJ5UmVmbGVjdGlvbktleSIsIGNsaW5pY19IS0VZX2NvbnZlcnRlciwgJmtleSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5yZWdfUXVlcnlSZWZsZWN0aW9uS2V5X2ltcGwobW9kdWxlLCBrZXkpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9N2I4OTQwYTIzZjYwNWRkYyBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9YzM1Y2U3MWY4MjU0MjRkMSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9QQy9jbGluaWMvd2luc291bmQuYy5oIGIvUEMvY2xpbmljL3dpbnNvdW5kLmMuaAppbmRleCBiMDBiNDQyLi5jZGIyMDQ1IDEwMDY0NAotLS0gYS9QQy9jbGluaWMvd2luc291bmQuYy5oCisrKyBiL1BDL2NsaW5pYy93aW5zb3VuZC5jLmgKQEAgLTI3LDggKzI3LDkgQEAKICAgICBpbnQgZmxhZ3M7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIlppOlBsYXlTb3VuZCIsCi0gICAgICAgICZzb3VuZCwgJmZsYWdzKSkKKyAgICAgICAgJnNvdW5kLCAmZmxhZ3MpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gd2luc291bmRfUGxheVNvdW5kX2ltcGwobW9kdWxlLCBzb3VuZCwgZmxhZ3MpOwogCiBleGl0OgpAQCAtNjEsOCArNjIsOSBAQAogICAgIGludCBkdXJhdGlvbjsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaWk6QmVlcCIsCi0gICAgICAgICZmcmVxdWVuY3ksICZkdXJhdGlvbikpCisgICAgICAgICZmcmVxdWVuY3ksICZkdXJhdGlvbikpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5zb3VuZF9CZWVwX2ltcGwobW9kdWxlLCBmcmVxdWVuY3ksIGR1cmF0aW9uKTsKIAogZXhpdDoKQEAgLTkwLDExICs5MiwxMiBAQAogICAgIGludCB4ID0gTUJfT0s7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxpOk1lc3NhZ2VCZWVwIiwKLSAgICAgICAgJngpKQorICAgICAgICAmeCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSB3aW5zb3VuZF9NZXNzYWdlQmVlcF9pbXBsKG1vZHVsZSwgeCk7CiAKIGV4aXQ6CiAgICAgcmV0dXJuIHJldHVybl92YWx1ZTsKIH0KLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jMGIyOTBkYWYyMzMwZGM5IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD0xMDQ0YjJhZGYzYzY3MDE0IGlucHV0PWE5MDQ5MDU0MDEzYTFiNzddKi8KZGlmZiAtLWdpdCBhL1BDL2dldHBhdGhwLmMgYi9QQy9nZXRwYXRocC5jCmluZGV4IGM3ZGRmMWUuLmNiOWYxZGIgMTAwNjQ0Ci0tLSBhL1BDL2dldHBhdGhwLmMKKysrIGIvUEMvZ2V0cGF0aHAuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiBzdGF0aWMgaW50CiBpc21vZHVsZSh3Y2hhcl90ICpmaWxlbmFtZSwgaW50IHVwZGF0ZV9maWxlbmFtZSkgLyogSXMgbW9kdWxlIC0tIGNoZWNrIGZvciAucHljLy5weW8gdG9vICovCiB7Ci0gICAgaW50IG47CisgICAgc2l6ZV90IG47CiAKICAgICBpZiAoZXhpc3RzKGZpbGVuYW1lKSkKICAgICAgICAgcmV0dXJuIDE7CkBAIC01NTMsNyArNTUzLDcgQEAKICAgICAgICAgICAgICAgICBlbnZwYXRoID0gTlVMTDsKICAgICAgICAgICAgICAgICBweXRob25ob21lID0gYXJndjBfcGF0aDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvKiBMb29rIGZvciBhICdob21lJyB2YXJpYWJsZSBhbmQgc2V0IGFyZ3YwX3BhdGggdG8gaXQsIGlmIGZvdW5kICovCiAgICAgICAgICAgICBpZiAoZmluZF9lbnZfY29uZmlnX3ZhbHVlKGVudl9maWxlLCBMImhvbWUiLCB0bXBidWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgd2NzY3B5X3MoYXJndjBfcGF0aCwgTUFYUEFUSExFTisxLCB0bXBidWZmZXIpOwpkaWZmIC0tZ2l0IGEvUEMvbGF1bmNoZXIuYyBiL1BDL2xhdW5jaGVyLmMKaW5kZXggNDBkNGNiNS4uZmE2OTQzOCAxMDA2NDQKLS0tIGEvUEMvbGF1bmNoZXIuYworKysgYi9QQy9sYXVuY2hlci5jCkBAIC05OCw3ICs5OCw3IEBACiAgICAgTWVzc2FnZUJveChOVUxMLCBtZXNzYWdlLCBURVhUKCJQeXRob24gTGF1bmNoZXIgaXMgc29ycnkgdG8gc2F5IC4uLiIpLAogICAgICAgICAgICAgICAgTUJfT0spOwogI2VuZGlmCi0gICAgRXhpdFByb2Nlc3MocmMpOworICAgIGV4aXQocmMpOwogfQogCiAvKgpAQCAtNDY1LDcgKzQ2NSw3IEBACiB9CiAKIHN0YXRpYyBJTlNUQUxMRURfUFlUSE9OICoKLWxvY2F0ZV9weXRob24od2NoYXJfdCAqIHdhbnRlZF92ZXIpCitsb2NhdGVfcHl0aG9uKHdjaGFyX3QgKiB3YW50ZWRfdmVyLCBCT09MIGZyb21fc2hlYmFuZykKIHsKICAgICBzdGF0aWMgd2NoYXJfdCBjb25maWdfa2V5IFtdID0geyBMInB5dGhvblgiIH07CiAgICAgc3RhdGljIHdjaGFyX3QgKiBsYXN0X2NoYXIgPSAmY29uZmlnX2tleVtzaXplb2YoY29uZmlnX2tleSkgLwpAQCAtNDk3LDEwICs0OTcsMTcgQEAKICAgICAgICAgY29uZmlndXJlZF92YWx1ZSA9IGdldF9jb25maWd1cmVkX3ZhbHVlKGNvbmZpZ19rZXkpOwogICAgICAgICBpZiAoY29uZmlndXJlZF92YWx1ZSkKICAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfcHl0aG9uX2J5X3ZlcnNpb24oY29uZmlndXJlZF92YWx1ZSk7CisgICAgICAgIC8qIE5vdCBmb3VuZCBhIHZhbHVlIHlldCAtIHRyeSBieSBtYWpvciB2ZXJzaW9uLgorICAgICAgICAgKiBJZiB3ZSdyZSBsb29raW5nIGZvciBhbiBpbnRlcnByZXRlciBzcGVjaWZpZWQgaW4gYSBzaGViYW5nIGxpbmUsCisgICAgICAgICAqIHdlIHdhbnQgdG8gdHJ5IFB5dGhvbiAyIGZpcnN0LCB0aGVuIFB5dGhvbiAzIChmb3IgVW5peCBhbmQgYmFja3dhcmQKKyAgICAgICAgICogY29tcGF0aWJpbGl0eSkuIElmIHdlJ3JlIGJlaW5nIGNhbGxlZCBpbnRlcmFjdGl2ZWx5LCBhc3N1bWUgdGhlIHVzZXIKKyAgICAgICAgICogd2FudHMgdGhlIGxhdGVzdCB2ZXJzaW9uIGF2YWlsYWJsZSwgc28gdHJ5IFB5dGhvbiAzIGZpcnN0LCB0aGVuCisgICAgICAgICAqIFB5dGhvbiAyLgorICAgICAgICAgKi8KICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKQotICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9weXRob25fYnlfdmVyc2lvbihMIjIiKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfcHl0aG9uX2J5X3ZlcnNpb24oZnJvbV9zaGViYW5nID8gTCIyIiA6IEwiMyIpOwogICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpCi0gICAgICAgICAgICByZXN1bHQgPSBmaW5kX3B5dGhvbl9ieV92ZXJzaW9uKEwiMyIpOworICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9weXRob25fYnlfdmVyc2lvbihmcm9tX3NoZWJhbmcgPyBMIjMiIDogTCIyIik7CiAgICAgICAgIGRlYnVnKEwic2VhcmNoIGZvciBkZWZhdWx0IFB5dGhvbiBmb3VuZCAiKTsKICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgZGVidWcoTCJ2ZXJzaW9uICVscyBhdCAnJWxzJ1xuIiwKQEAgLTY1NSw3ICs2NjIsNyBAQAogICAgIGlmICghb2spCiAgICAgICAgIGVycm9yKFJDX0NSRUFURV9QUk9DRVNTLCBMIkZhaWxlZCB0byBnZXQgZXhpdCBjb2RlIG9mIHByb2Nlc3MiKTsKICAgICBkZWJ1ZyhMImNoaWxkIHByb2Nlc3MgZXhpdCBjb2RlOiAlZFxuIiwgcmMpOwotICAgIEV4aXRQcm9jZXNzKHJjKTsKKyAgICBleGl0KHJjKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwODIsNyArMTA4OSw3IEBACiAgICAgeyAzMTkwLCAzMjMwLCBMIjMuMyIgfSwKICAgICB7IDMyNTAsIDMzMTAsIEwiMy40IiB9LAogICAgIHsgMzMyMCwgMzM1MSwgTCIzLjUiIH0sCi0gICAgeyAzMzYwLCAzMzYxLCBMIjMuNiIgfSwKKyAgICB7IDMzNjAsIDMzNzEsIEwiMy42IiB9LAogICAgIHsgMCB9CiB9OwogCkBAIC0xMDk0LDcgKzExMDEsNyBAQAogCiAgICAgZm9yIChtcCA9IG1hZ2ljX3ZhbHVlczsgbXAtPm1pbjsgbXArKykgewogICAgICAgICBpZiAoKG1hZ2ljID49IG1wLT5taW4pICYmIChtYWdpYyA8PSBtcC0+bWF4KSkgewotICAgICAgICAgICAgcmVzdWx0ID0gbG9jYXRlX3B5dGhvbihtcC0+dmVyc2lvbik7CisgICAgICAgICAgICByZXN1bHQgPSBsb2NhdGVfcHl0aG9uKG1wLT52ZXJzaW9uLCBGQUxTRSk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE5VTEwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMTQsNyArMTEyMSw3IEBACiAgKi8KICAgICBGSUxFICogZnA7CiAgICAgZXJybm9fdCByYyA9IF93Zm9wZW5fcygmZnAsICphcmd2LCBMInJiIik7Ci0gICAgdW5zaWduZWQgY2hhciBidWZmZXJbQlVGU0laRV07CisgICAgY2hhciBidWZmZXJbQlVGU0laRV07CiAgICAgd2NoYXJfdCBzaGViYW5nX2xpbmVbQlVGU0laRSArIDFdOwogICAgIHNpemVfdCByZWFkOwogICAgIGNoYXIgKnA7CkBAIC0xMTM2LDcgKzExNDMsOCBAQAogICAgICAgICBmY2xvc2UoZnApOwogCiAgICAgICAgIGlmICgocmVhZCA+PSA0KSAmJiAoYnVmZmVyWzNdID09ICdcbicpICYmIChidWZmZXJbMl0gPT0gJ1xyJykpIHsKLSAgICAgICAgICAgIGlwID0gZmluZF9ieV9tYWdpYygoYnVmZmVyWzFdIDw8IDggfCBidWZmZXJbMF0pICYgMHhGRkZGKTsKKyAgICAgICAgICAgIGlwID0gZmluZF9ieV9tYWdpYygoKCh1bnNpZ25lZCBjaGFyKWJ1ZmZlclsxXSkgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKWJ1ZmZlclswXSkgJiAweEZGRkYpOwogICAgICAgICAgICAgaWYgKGlwICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBkZWJ1ZyhMInNjcmlwdCBmaWxlIGlzIGNvbXBpbGVkIGFnYWluc3QgUHl0aG9uICVsc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBpcC0+dmVyc2lvbik7CkBAIC0xMjc4LDcgKzEyODYsNyBAQAogZm9sbG93ZWQgYnkgYSB2YWxpZCB2ZXJzaW9uIHNwZWNpZmllci5cblBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBjb3VsZCBjYWxsIHZhbGlkYXRlX3ZlcnNpb24oY29tbWFuZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbihjb21tYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbihjb21tYW5kLCBUUlVFKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoUkNfTk9fUFlUSE9OLCBMIlJlcXVlc3RlZCBQeXRob24gdmVyc2lvbiBcCiAoJWxzKSBpcyBub3QgaW5zdGFsbGVkIiwgY29tbWFuZCk7CkBAIC0xMzYyLDYgKzEzNzAsNyBAQAogICAgIHdjaGFyX3QgKiBhdlsyXTsKICNlbmRpZgogCisgICAgc2V0dmJ1ZihzdGRlcnIsIChjaGFyICopTlVMTCwgX0lPTkJGLCAwKTsKICAgICB3cCA9IGdldF9lbnYoTCJQWUxBVU5DSF9ERUJVRyIpOwogICAgIGlmICgod3AgIT0gTlVMTCkgJiYgKCp3cCAhPSBMJ1wwJykpCiAgICAgICAgIGxvZ19mcCA9IHN0ZGVycjsKQEAgLTE0ODMsNyArMTQ5Miw3IEBACiAgICAgICAgIHBsZW4gPSB3Y3NsZW4ocCk7CiAgICAgICAgIHZhbGlkID0gKCpwID09IEwnLScpICYmIHZhbGlkYXRlX3ZlcnNpb24oJnBbMV0pOwogICAgICAgICBpZiAodmFsaWQpIHsKLSAgICAgICAgICAgIGlwID0gbG9jYXRlX3B5dGhvbigmcFsxXSk7CisgICAgICAgICAgICBpcCA9IGxvY2F0ZV9weXRob24oJnBbMV0sIEZBTFNFKTsKICAgICAgICAgICAgIGlmIChpcCA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGVycm9yKFJDX05PX1BZVEhPTiwgTCJSZXF1ZXN0ZWQgUHl0aG9uIHZlcnNpb24gKCVscykgbm90IFwKIGluc3RhbGxlZCIsICZwWzFdKTsKQEAgLTE1MTAsNyArMTUxOSw3IEBACiAKICAgICAgICAgLyogSWYgd2UgZGlkbid0IGZpbmQgb25lLCBsb29rIGZvciB0aGUgZGVmYXVsdCBQeXRob24gKi8KICAgICAgICAgaWYgKGV4ZWN1dGFibGUgPT0gTlVMTCkgewotICAgICAgICAgICAgaXAgPSBsb2NhdGVfcHl0aG9uKEwiIik7CisgICAgICAgICAgICBpcCA9IGxvY2F0ZV9weXRob24oTCIiLCBGQUxTRSk7CiAgICAgICAgICAgICBpZiAoaXAgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBlcnJvcihSQ19OT19QWVRIT04sIEwiQ2FuJ3QgZmluZCBhIGRlZmF1bHQgUHl0aG9uLiIpOwogICAgICAgICAgICAgZXhlY3V0YWJsZSA9IGlwLT5leGVjdXRhYmxlOwpkaWZmIC0tZ2l0IGEvUEMvbXN2Y3J0bW9kdWxlLmMgYi9QQy9tc3ZjcnRtb2R1bGUuYwppbmRleCBiMDczOWQwLi5hNmJkMDgzIDEwMDY0NAotLS0gYS9QQy9tc3ZjcnRtb2R1bGUuYworKysgYi9QQy9tc3ZjcnRtb2R1bGUuYwpAQCAtNTQwLDcgKzU0MCw2IEBACiAjZW5kaWYKIAogICAgIC8qIGNvbnN0YW50cyBmb3IgdGhlIGNydCB2ZXJzaW9ucyAqLwotICAgICh2b2lkKXN0OwogI2lmZGVmIF9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTgogICAgIHN0ID0gUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIlZDX0FTU0VNQkxZX1BVQkxJQ0tFWVRPS0VOIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9WQ19BU1NFTUJMWV9QVUJMSUNLRVlUT0tFTik7CkBAIC01NjYsNiArNTY1LDggQEAKICAgICBzdCA9IFB5TW9kdWxlX0FkZE9iamVjdChtLCAiQ1JUX0FTU0VNQkxZX1ZFUlNJT04iLCB2ZXJzaW9uKTsKICAgICBpZiAoc3QgPCAwKSByZXR1cm4gTlVMTDsKICNlbmRpZgorICAgIC8qIG1ha2UgY29tcGlsZXIgd2FybmluZyBxdWlldCBpZiBzdCBpcyB1bnVzZWQgKi8KKyAgICAodm9pZClzdDsKIAogICAgIHJldHVybiBtOwogfQpkaWZmIC0tZ2l0IGEvUEMvcHljb25maWcuaCBiL1BDL3B5Y29uZmlnLmgKaW5kZXggYWM0ZjhmMi4uMTQ2M2VlNiAxMDA2NDQKLS0tIGEvUEMvcHljb25maWcuaAorKysgYi9QQy9weWNvbmZpZy5oCkBAIC0zMTIsMTEgKzMxMiwxMSBAQAogCQkJdGhlaXIgTWFrZWZpbGUgKG90aGVyIGNvbXBpbGVycyBhcmUgZ2VuZXJhbGx5CiAJCQl0YWtlbiBjYXJlIG9mIGJ5IGRpc3R1dGlscy4pICovCiAjCQkJaWYgZGVmaW5lZChfREVCVUcpCi0jCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMzVfZC5saWIiKQorIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjM2X2QubGliIikKICMJCQllbGlmIGRlZmluZWQoUHlfTElNSVRFRF9BUEkpCiAjCQkJCXByYWdtYSBjb21tZW50KGxpYiwicHl0aG9uMy5saWIiKQogIwkJCWVsc2UKLSMJCQkJcHJhZ21hIGNvbW1lbnQobGliLCJweXRob24zNS5saWIiKQorIwkJCQlwcmFnbWEgY29tbWVudChsaWIsInB5dGhvbjM2LmxpYiIpCiAjCQkJZW5kaWYgLyogX0RFQlVHICovCiAjCQllbmRpZiAvKiBfTVNDX1ZFUiAqLwogIwllbmRpZiAvKiBQeV9CVUlMRF9DT1JFICovCmRpZmYgLS1naXQgYS9QQy9weXRob24zLmRlZiBiL1BDL3B5dGhvbjMuZGVmCmluZGV4IDg4YzA3NDIuLmU4ZDJkOGMgMTAwNjQ0Ci0tLSBhL1BDL3B5dGhvbjMuZGVmCisrKyBiL1BDL3B5dGhvbjMuZGVmCkBAIC0yLDcxMiArMiw3MTMgQEAKIDsgSXQgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIHB5dGhvbjNkbGwudmN4cHJvagogTElCUkFSWQkicHl0aG9uMyIKIEVYUE9SVFMKLSAgUHlBcmdfUGFyc2U9cHl0aG9uMzUuUHlBcmdfUGFyc2UKLSAgUHlBcmdfUGFyc2VUdXBsZT1weXRob24zNS5QeUFyZ19QYXJzZVR1cGxlCi0gIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkcz1weXRob24zNS5QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMKLSAgUHlBcmdfVW5wYWNrVHVwbGU9cHl0aG9uMzUuUHlBcmdfVW5wYWNrVHVwbGUKLSAgUHlBcmdfVmFQYXJzZT1weXRob24zNS5QeUFyZ19WYVBhcnNlCi0gIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzPXB5dGhvbjM1LlB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzCi0gIFB5QXJnX1ZhbGlkYXRlS2V5d29yZEFyZ3VtZW50cz1weXRob24zNS5QeUFyZ19WYWxpZGF0ZUtleXdvcmRBcmd1bWVudHMKLSAgUHlCYXNlT2JqZWN0X1R5cGU9cHl0aG9uMzUuUHlCYXNlT2JqZWN0X1R5cGUgREFUQQotICBQeUJvb2xfRnJvbUxvbmc9cHl0aG9uMzUuUHlCb29sX0Zyb21Mb25nCi0gIFB5Qm9vbF9UeXBlPXB5dGhvbjM1LlB5Qm9vbF9UeXBlIERBVEEKLSAgUHlCeXRlQXJyYXlJdGVyX1R5cGU9cHl0aG9uMzUuUHlCeXRlQXJyYXlJdGVyX1R5cGUgREFUQQotICBQeUJ5dGVBcnJheV9Bc1N0cmluZz1weXRob24zNS5QeUJ5dGVBcnJheV9Bc1N0cmluZwotICBQeUJ5dGVBcnJheV9Db25jYXQ9cHl0aG9uMzUuUHlCeXRlQXJyYXlfQ29uY2F0Ci0gIFB5Qnl0ZUFycmF5X0Zyb21PYmplY3Q9cHl0aG9uMzUuUHlCeXRlQXJyYXlfRnJvbU9iamVjdAotICBQeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNS5QeUJ5dGVBcnJheV9Gcm9tU3RyaW5nQW5kU2l6ZQotICBQeUJ5dGVBcnJheV9SZXNpemU9cHl0aG9uMzUuUHlCeXRlQXJyYXlfUmVzaXplCi0gIFB5Qnl0ZUFycmF5X1NpemU9cHl0aG9uMzUuUHlCeXRlQXJyYXlfU2l6ZQotICBQeUJ5dGVBcnJheV9UeXBlPXB5dGhvbjM1LlB5Qnl0ZUFycmF5X1R5cGUgREFUQQotICBQeUJ5dGVzSXRlcl9UeXBlPXB5dGhvbjM1LlB5Qnl0ZXNJdGVyX1R5cGUgREFUQQotICBQeUJ5dGVzX0FzU3RyaW5nPXB5dGhvbjM1LlB5Qnl0ZXNfQXNTdHJpbmcKLSAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemU9cHl0aG9uMzUuUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUKLSAgUHlCeXRlc19Db25jYXQ9cHl0aG9uMzUuUHlCeXRlc19Db25jYXQKLSAgUHlCeXRlc19Db25jYXRBbmREZWw9cHl0aG9uMzUuUHlCeXRlc19Db25jYXRBbmREZWwKLSAgUHlCeXRlc19EZWNvZGVFc2NhcGU9cHl0aG9uMzUuUHlCeXRlc19EZWNvZGVFc2NhcGUKLSAgUHlCeXRlc19Gcm9tRm9ybWF0PXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbUZvcm1hdAotICBQeUJ5dGVzX0Zyb21Gb3JtYXRWPXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbUZvcm1hdFYKLSAgUHlCeXRlc19Gcm9tT2JqZWN0PXB5dGhvbjM1LlB5Qnl0ZXNfRnJvbU9iamVjdAotICBQeUJ5dGVzX0Zyb21TdHJpbmc9cHl0aG9uMzUuUHlCeXRlc19Gcm9tU3RyaW5nCi0gIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzUuUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZQotICBQeUJ5dGVzX1JlcHI9cHl0aG9uMzUuUHlCeXRlc19SZXByCi0gIFB5Qnl0ZXNfU2l6ZT1weXRob24zNS5QeUJ5dGVzX1NpemUKLSAgUHlCeXRlc19UeXBlPXB5dGhvbjM1LlB5Qnl0ZXNfVHlwZSBEQVRBCi0gIFB5Q0Z1bmN0aW9uX0NhbGw9cHl0aG9uMzUuUHlDRnVuY3Rpb25fQ2FsbAotICBQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0PXB5dGhvbjM1LlB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3QKLSAgUHlDRnVuY3Rpb25fR2V0RmxhZ3M9cHl0aG9uMzUuUHlDRnVuY3Rpb25fR2V0RmxhZ3MKLSAgUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb249cHl0aG9uMzUuUHlDRnVuY3Rpb25fR2V0RnVuY3Rpb24KLSAgUHlDRnVuY3Rpb25fR2V0U2VsZj1weXRob24zNS5QeUNGdW5jdGlvbl9HZXRTZWxmCi0gIFB5Q0Z1bmN0aW9uX05ldz1weXRob24zNS5QeUNGdW5jdGlvbl9OZXcKLSAgUHlDRnVuY3Rpb25fTmV3RXg9cHl0aG9uMzUuUHlDRnVuY3Rpb25fTmV3RXgKLSAgUHlDRnVuY3Rpb25fVHlwZT1weXRob24zNS5QeUNGdW5jdGlvbl9UeXBlIERBVEEKLSAgUHlDYWxsSXRlcl9OZXc9cHl0aG9uMzUuUHlDYWxsSXRlcl9OZXcKLSAgUHlDYWxsSXRlcl9UeXBlPXB5dGhvbjM1LlB5Q2FsbEl0ZXJfVHlwZSBEQVRBCi0gIFB5Q2FsbGFibGVfQ2hlY2s9cHl0aG9uMzUuUHlDYWxsYWJsZV9DaGVjawotICBQeUNhcHN1bGVfR2V0Q29udGV4dD1weXRob24zNS5QeUNhcHN1bGVfR2V0Q29udGV4dAotICBQeUNhcHN1bGVfR2V0RGVzdHJ1Y3Rvcj1weXRob24zNS5QeUNhcHN1bGVfR2V0RGVzdHJ1Y3RvcgotICBQeUNhcHN1bGVfR2V0TmFtZT1weXRob24zNS5QeUNhcHN1bGVfR2V0TmFtZQotICBQeUNhcHN1bGVfR2V0UG9pbnRlcj1weXRob24zNS5QeUNhcHN1bGVfR2V0UG9pbnRlcgotICBQeUNhcHN1bGVfSW1wb3J0PXB5dGhvbjM1LlB5Q2Fwc3VsZV9JbXBvcnQKLSAgUHlDYXBzdWxlX0lzVmFsaWQ9cHl0aG9uMzUuUHlDYXBzdWxlX0lzVmFsaWQKLSAgUHlDYXBzdWxlX05ldz1weXRob24zNS5QeUNhcHN1bGVfTmV3Ci0gIFB5Q2Fwc3VsZV9TZXRDb250ZXh0PXB5dGhvbjM1LlB5Q2Fwc3VsZV9TZXRDb250ZXh0Ci0gIFB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yPXB5dGhvbjM1LlB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yCi0gIFB5Q2Fwc3VsZV9TZXROYW1lPXB5dGhvbjM1LlB5Q2Fwc3VsZV9TZXROYW1lCi0gIFB5Q2Fwc3VsZV9TZXRQb2ludGVyPXB5dGhvbjM1LlB5Q2Fwc3VsZV9TZXRQb2ludGVyCi0gIFB5Q2Fwc3VsZV9UeXBlPXB5dGhvbjM1LlB5Q2Fwc3VsZV9UeXBlIERBVEEKLSAgUHlDbGFzc01ldGhvZERlc2NyX1R5cGU9cHl0aG9uMzUuUHlDbGFzc01ldGhvZERlc2NyX1R5cGUgREFUQQotICBQeUNvZGVjX0JhY2tzbGFzaFJlcGxhY2VFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzCi0gIFB5Q29kZWNfRGVjb2RlPXB5dGhvbjM1LlB5Q29kZWNfRGVjb2RlCi0gIFB5Q29kZWNfRGVjb2Rlcj1weXRob24zNS5QeUNvZGVjX0RlY29kZXIKLSAgUHlDb2RlY19FbmNvZGU9cHl0aG9uMzUuUHlDb2RlY19FbmNvZGUKLSAgUHlDb2RlY19FbmNvZGVyPXB5dGhvbjM1LlB5Q29kZWNfRW5jb2RlcgotICBQeUNvZGVjX0lnbm9yZUVycm9ycz1weXRob24zNS5QeUNvZGVjX0lnbm9yZUVycm9ycwotICBQeUNvZGVjX0luY3JlbWVudGFsRGVjb2Rlcj1weXRob24zNS5QeUNvZGVjX0luY3JlbWVudGFsRGVjb2RlcgotICBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2Rlcj1weXRob24zNS5QeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlcgotICBQeUNvZGVjX0tub3duRW5jb2Rpbmc9cHl0aG9uMzUuUHlDb2RlY19Lbm93bkVuY29kaW5nCi0gIFB5Q29kZWNfTG9va3VwRXJyb3I9cHl0aG9uMzUuUHlDb2RlY19Mb29rdXBFcnJvcgotICBQeUNvZGVjX1JlZ2lzdGVyPXB5dGhvbjM1LlB5Q29kZWNfUmVnaXN0ZXIKLSAgUHlDb2RlY19SZWdpc3RlckVycm9yPXB5dGhvbjM1LlB5Q29kZWNfUmVnaXN0ZXJFcnJvcgotICBQeUNvZGVjX1JlcGxhY2VFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19SZXBsYWNlRXJyb3JzCi0gIFB5Q29kZWNfU3RyZWFtUmVhZGVyPXB5dGhvbjM1LlB5Q29kZWNfU3RyZWFtUmVhZGVyCi0gIFB5Q29kZWNfU3RyZWFtV3JpdGVyPXB5dGhvbjM1LlB5Q29kZWNfU3RyZWFtV3JpdGVyCi0gIFB5Q29kZWNfU3RyaWN0RXJyb3JzPXB5dGhvbjM1LlB5Q29kZWNfU3RyaWN0RXJyb3JzCi0gIFB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnM9cHl0aG9uMzUuUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycwotICBQeUNvbXBsZXhfRnJvbURvdWJsZXM9cHl0aG9uMzUuUHlDb21wbGV4X0Zyb21Eb3VibGVzCi0gIFB5Q29tcGxleF9JbWFnQXNEb3VibGU9cHl0aG9uMzUuUHlDb21wbGV4X0ltYWdBc0RvdWJsZQotICBQeUNvbXBsZXhfUmVhbEFzRG91YmxlPXB5dGhvbjM1LlB5Q29tcGxleF9SZWFsQXNEb3VibGUKLSAgUHlDb21wbGV4X1R5cGU9cHl0aG9uMzUuUHlDb21wbGV4X1R5cGUgREFUQQotICBQeURlc2NyX05ld0NsYXNzTWV0aG9kPXB5dGhvbjM1LlB5RGVzY3JfTmV3Q2xhc3NNZXRob2QKLSAgUHlEZXNjcl9OZXdHZXRTZXQ9cHl0aG9uMzUuUHlEZXNjcl9OZXdHZXRTZXQKLSAgUHlEZXNjcl9OZXdNZW1iZXI9cHl0aG9uMzUuUHlEZXNjcl9OZXdNZW1iZXIKLSAgUHlEZXNjcl9OZXdNZXRob2Q9cHl0aG9uMzUuUHlEZXNjcl9OZXdNZXRob2QKLSAgUHlEaWN0SXRlbXNfVHlwZT1weXRob24zNS5QeURpY3RJdGVtc19UeXBlIERBVEEKLSAgUHlEaWN0SXRlckl0ZW1fVHlwZT1weXRob24zNS5QeURpY3RJdGVySXRlbV9UeXBlIERBVEEKLSAgUHlEaWN0SXRlcktleV9UeXBlPXB5dGhvbjM1LlB5RGljdEl0ZXJLZXlfVHlwZSBEQVRBCi0gIFB5RGljdEl0ZXJWYWx1ZV9UeXBlPXB5dGhvbjM1LlB5RGljdEl0ZXJWYWx1ZV9UeXBlIERBVEEKLSAgUHlEaWN0S2V5c19UeXBlPXB5dGhvbjM1LlB5RGljdEtleXNfVHlwZSBEQVRBCi0gIFB5RGljdFByb3h5X05ldz1weXRob24zNS5QeURpY3RQcm94eV9OZXcKLSAgUHlEaWN0UHJveHlfVHlwZT1weXRob24zNS5QeURpY3RQcm94eV9UeXBlIERBVEEKLSAgUHlEaWN0VmFsdWVzX1R5cGU9cHl0aG9uMzUuUHlEaWN0VmFsdWVzX1R5cGUgREFUQQotICBQeURpY3RfQ2xlYXI9cHl0aG9uMzUuUHlEaWN0X0NsZWFyCi0gIFB5RGljdF9Db250YWlucz1weXRob24zNS5QeURpY3RfQ29udGFpbnMKLSAgUHlEaWN0X0NvcHk9cHl0aG9uMzUuUHlEaWN0X0NvcHkKLSAgUHlEaWN0X0RlbEl0ZW09cHl0aG9uMzUuUHlEaWN0X0RlbEl0ZW0KLSAgUHlEaWN0X0RlbEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlEaWN0X0RlbEl0ZW1TdHJpbmcKLSAgUHlEaWN0X0dldEl0ZW09cHl0aG9uMzUuUHlEaWN0X0dldEl0ZW0KLSAgUHlEaWN0X0dldEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlEaWN0X0dldEl0ZW1TdHJpbmcKLSAgUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3I9cHl0aG9uMzUuUHlEaWN0X0dldEl0ZW1XaXRoRXJyb3IKLSAgUHlEaWN0X0l0ZW1zPXB5dGhvbjM1LlB5RGljdF9JdGVtcwotICBQeURpY3RfS2V5cz1weXRob24zNS5QeURpY3RfS2V5cwotICBQeURpY3RfTWVyZ2U9cHl0aG9uMzUuUHlEaWN0X01lcmdlCi0gIFB5RGljdF9NZXJnZUZyb21TZXEyPXB5dGhvbjM1LlB5RGljdF9NZXJnZUZyb21TZXEyCi0gIFB5RGljdF9OZXc9cHl0aG9uMzUuUHlEaWN0X05ldwotICBQeURpY3RfTmV4dD1weXRob24zNS5QeURpY3RfTmV4dAotICBQeURpY3RfU2V0SXRlbT1weXRob24zNS5QeURpY3RfU2V0SXRlbQotICBQeURpY3RfU2V0SXRlbVN0cmluZz1weXRob24zNS5QeURpY3RfU2V0SXRlbVN0cmluZwotICBQeURpY3RfU2l6ZT1weXRob24zNS5QeURpY3RfU2l6ZQotICBQeURpY3RfVHlwZT1weXRob24zNS5QeURpY3RfVHlwZSBEQVRBCi0gIFB5RGljdF9VcGRhdGU9cHl0aG9uMzUuUHlEaWN0X1VwZGF0ZQotICBQeURpY3RfVmFsdWVzPXB5dGhvbjM1LlB5RGljdF9WYWx1ZXMKLSAgUHlFbGxpcHNpc19UeXBlPXB5dGhvbjM1LlB5RWxsaXBzaXNfVHlwZSBEQVRBCi0gIFB5RW51bV9UeXBlPXB5dGhvbjM1LlB5RW51bV9UeXBlIERBVEEKLSAgUHlFcnJfQmFkQXJndW1lbnQ9cHl0aG9uMzUuUHlFcnJfQmFkQXJndW1lbnQKLSAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsPXB5dGhvbjM1LlB5RXJyX0JhZEludGVybmFsQ2FsbAotICBQeUVycl9DaGVja1NpZ25hbHM9cHl0aG9uMzUuUHlFcnJfQ2hlY2tTaWduYWxzCi0gIFB5RXJyX0NsZWFyPXB5dGhvbjM1LlB5RXJyX0NsZWFyCi0gIFB5RXJyX0Rpc3BsYXk9cHl0aG9uMzUuUHlFcnJfRGlzcGxheQotICBQeUVycl9FeGNlcHRpb25NYXRjaGVzPXB5dGhvbjM1LlB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMKLSAgUHlFcnJfRmV0Y2g9cHl0aG9uMzUuUHlFcnJfRmV0Y2gKLSAgUHlFcnJfRm9ybWF0PXB5dGhvbjM1LlB5RXJyX0Zvcm1hdAotICBQeUVycl9Gb3JtYXRWPXB5dGhvbjM1LlB5RXJyX0Zvcm1hdFYKLSAgUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzPXB5dGhvbjM1LlB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcwotICBQeUVycl9OZXdFeGNlcHRpb249cHl0aG9uMzUuUHlFcnJfTmV3RXhjZXB0aW9uCi0gIFB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2M9cHl0aG9uMzUuUHlFcnJfTmV3RXhjZXB0aW9uV2l0aERvYwotICBQeUVycl9Ob01lbW9yeT1weXRob24zNS5QeUVycl9Ob01lbW9yeQotICBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb249cHl0aG9uMzUuUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uCi0gIFB5RXJyX09jY3VycmVkPXB5dGhvbjM1LlB5RXJyX09jY3VycmVkCi0gIFB5RXJyX1ByaW50PXB5dGhvbjM1LlB5RXJyX1ByaW50Ci0gIFB5RXJyX1ByaW50RXg9cHl0aG9uMzUuUHlFcnJfUHJpbnRFeAotICBQeUVycl9Qcm9ncmFtVGV4dD1weXRob24zNS5QeUVycl9Qcm9ncmFtVGV4dAotICBQeUVycl9SZXN0b3JlPXB5dGhvbjM1LlB5RXJyX1Jlc3RvcmUKLSAgUHlFcnJfU2V0RnJvbUVycm5vPXB5dGhvbjM1LlB5RXJyX1NldEZyb21FcnJubwotICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWU9cHl0aG9uMzUuUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lCi0gIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZU9iamVjdD1weXRob24zNS5QeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QKLSAgUHlFcnJfU2V0SW50ZXJydXB0PXB5dGhvbjM1LlB5RXJyX1NldEludGVycnVwdAotICBQeUVycl9TZXROb25lPXB5dGhvbjM1LlB5RXJyX1NldE5vbmUKLSAgUHlFcnJfU2V0T2JqZWN0PXB5dGhvbjM1LlB5RXJyX1NldE9iamVjdAotICBQeUVycl9TZXRTdHJpbmc9cHl0aG9uMzUuUHlFcnJfU2V0U3RyaW5nCi0gIFB5RXJyX1N5bnRheExvY2F0aW9uPXB5dGhvbjM1LlB5RXJyX1N5bnRheExvY2F0aW9uCi0gIFB5RXJyX1dhcm5FeD1weXRob24zNS5QeUVycl9XYXJuRXgKLSAgUHlFcnJfV2FybkV4cGxpY2l0PXB5dGhvbjM1LlB5RXJyX1dhcm5FeHBsaWNpdAotICBQeUVycl9XYXJuRm9ybWF0PXB5dGhvbjM1LlB5RXJyX1dhcm5Gb3JtYXQKLSAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlPXB5dGhvbjM1LlB5RXJyX1dyaXRlVW5yYWlzYWJsZQotICBQeUV2YWxfQWNxdWlyZUxvY2s9cHl0aG9uMzUuUHlFdmFsX0FjcXVpcmVMb2NrCi0gIFB5RXZhbF9BY3F1aXJlVGhyZWFkPXB5dGhvbjM1LlB5RXZhbF9BY3F1aXJlVGhyZWFkCi0gIFB5RXZhbF9DYWxsRnVuY3Rpb249cHl0aG9uMzUuUHlFdmFsX0NhbGxGdW5jdGlvbgotICBQeUV2YWxfQ2FsbE1ldGhvZD1weXRob24zNS5QeUV2YWxfQ2FsbE1ldGhvZAotICBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3Jkcz1weXRob24zNS5QeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcwotICBQeUV2YWxfRXZhbENvZGU9cHl0aG9uMzUuUHlFdmFsX0V2YWxDb2RlCi0gIFB5RXZhbF9FdmFsQ29kZUV4PXB5dGhvbjM1LlB5RXZhbF9FdmFsQ29kZUV4Ci0gIFB5RXZhbF9FdmFsRnJhbWU9cHl0aG9uMzUuUHlFdmFsX0V2YWxGcmFtZQotICBQeUV2YWxfRXZhbEZyYW1lRXg9cHl0aG9uMzUuUHlFdmFsX0V2YWxGcmFtZUV4Ci0gIFB5RXZhbF9HZXRCdWlsdGlucz1weXRob24zNS5QeUV2YWxfR2V0QnVpbHRpbnMKLSAgUHlFdmFsX0dldENhbGxTdGF0cz1weXRob24zNS5QeUV2YWxfR2V0Q2FsbFN0YXRzCi0gIFB5RXZhbF9HZXRGcmFtZT1weXRob24zNS5QeUV2YWxfR2V0RnJhbWUKLSAgUHlFdmFsX0dldEZ1bmNEZXNjPXB5dGhvbjM1LlB5RXZhbF9HZXRGdW5jRGVzYwotICBQeUV2YWxfR2V0RnVuY05hbWU9cHl0aG9uMzUuUHlFdmFsX0dldEZ1bmNOYW1lCi0gIFB5RXZhbF9HZXRHbG9iYWxzPXB5dGhvbjM1LlB5RXZhbF9HZXRHbG9iYWxzCi0gIFB5RXZhbF9HZXRMb2NhbHM9cHl0aG9uMzUuUHlFdmFsX0dldExvY2FscwotICBQeUV2YWxfSW5pdFRocmVhZHM9cHl0aG9uMzUuUHlFdmFsX0luaXRUaHJlYWRzCi0gIFB5RXZhbF9SZUluaXRUaHJlYWRzPXB5dGhvbjM1LlB5RXZhbF9SZUluaXRUaHJlYWRzCi0gIFB5RXZhbF9SZWxlYXNlTG9jaz1weXRob24zNS5QeUV2YWxfUmVsZWFzZUxvY2sKLSAgUHlFdmFsX1JlbGVhc2VUaHJlYWQ9cHl0aG9uMzUuUHlFdmFsX1JlbGVhc2VUaHJlYWQKLSAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQ9cHl0aG9uMzUuUHlFdmFsX1Jlc3RvcmVUaHJlYWQKLSAgUHlFdmFsX1NhdmVUaHJlYWQ9cHl0aG9uMzUuUHlFdmFsX1NhdmVUaHJlYWQKLSAgUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZD1weXRob24zNS5QeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkCi0gIFB5RXhjX0FyaXRobWV0aWNFcnJvcj1weXRob24zNS5QeUV4Y19Bcml0aG1ldGljRXJyb3IgREFUQQotICBQeUV4Y19Bc3NlcnRpb25FcnJvcj1weXRob24zNS5QeUV4Y19Bc3NlcnRpb25FcnJvciBEQVRBCi0gIFB5RXhjX0F0dHJpYnV0ZUVycm9yPXB5dGhvbjM1LlB5RXhjX0F0dHJpYnV0ZUVycm9yIERBVEEKLSAgUHlFeGNfQmFzZUV4Y2VwdGlvbj1weXRob24zNS5QeUV4Y19CYXNlRXhjZXB0aW9uIERBVEEKLSAgUHlFeGNfQnVmZmVyRXJyb3I9cHl0aG9uMzUuUHlFeGNfQnVmZmVyRXJyb3IgREFUQQotICBQeUV4Y19CeXRlc1dhcm5pbmc9cHl0aG9uMzUuUHlFeGNfQnl0ZXNXYXJuaW5nIERBVEEKLSAgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nPXB5dGhvbjM1LlB5RXhjX0RlcHJlY2F0aW9uV2FybmluZyBEQVRBCi0gIFB5RXhjX0VPRkVycm9yPXB5dGhvbjM1LlB5RXhjX0VPRkVycm9yIERBVEEKLSAgUHlFeGNfRW52aXJvbm1lbnRFcnJvcj1weXRob24zNS5QeUV4Y19FbnZpcm9ubWVudEVycm9yIERBVEEKLSAgUHlFeGNfRXhjZXB0aW9uPXB5dGhvbjM1LlB5RXhjX0V4Y2VwdGlvbiBEQVRBCi0gIFB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvcj1weXRob24zNS5QeUV4Y19GbG9hdGluZ1BvaW50RXJyb3IgREFUQQotICBQeUV4Y19GdXR1cmVXYXJuaW5nPXB5dGhvbjM1LlB5RXhjX0Z1dHVyZVdhcm5pbmcgREFUQQotICBQeUV4Y19HZW5lcmF0b3JFeGl0PXB5dGhvbjM1LlB5RXhjX0dlbmVyYXRvckV4aXQgREFUQQotICBQeUV4Y19JT0Vycm9yPXB5dGhvbjM1LlB5RXhjX0lPRXJyb3IgREFUQQotICBQeUV4Y19JbXBvcnRFcnJvcj1weXRob24zNS5QeUV4Y19JbXBvcnRFcnJvciBEQVRBCi0gIFB5RXhjX0ltcG9ydFdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfSW1wb3J0V2FybmluZyBEQVRBCi0gIFB5RXhjX0luZGVudGF0aW9uRXJyb3I9cHl0aG9uMzUuUHlFeGNfSW5kZW50YXRpb25FcnJvciBEQVRBCi0gIFB5RXhjX0luZGV4RXJyb3I9cHl0aG9uMzUuUHlFeGNfSW5kZXhFcnJvciBEQVRBCi0gIFB5RXhjX0tleUVycm9yPXB5dGhvbjM1LlB5RXhjX0tleUVycm9yIERBVEEKLSAgUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQ9cHl0aG9uMzUuUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQgREFUQQotICBQeUV4Y19Mb29rdXBFcnJvcj1weXRob24zNS5QeUV4Y19Mb29rdXBFcnJvciBEQVRBCi0gIFB5RXhjX01lbW9yeUVycm9yPXB5dGhvbjM1LlB5RXhjX01lbW9yeUVycm9yIERBVEEKLSAgUHlFeGNfTWVtb3J5RXJyb3JJbnN0PXB5dGhvbjM1LlB5RXhjX01lbW9yeUVycm9ySW5zdCBEQVRBCi0gIFB5RXhjX05hbWVFcnJvcj1weXRob24zNS5QeUV4Y19OYW1lRXJyb3IgREFUQQotICBQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yPXB5dGhvbjM1LlB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IgREFUQQotICBQeUV4Y19PU0Vycm9yPXB5dGhvbjM1LlB5RXhjX09TRXJyb3IgREFUQQotICBQeUV4Y19PdmVyZmxvd0Vycm9yPXB5dGhvbjM1LlB5RXhjX092ZXJmbG93RXJyb3IgREFUQQotICBQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nPXB5dGhvbjM1LlB5RXhjX1BlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcgREFUQQotICBQeUV4Y19SZWN1cnNpb25FcnJvckluc3Q9cHl0aG9uMzUuUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0IERBVEEKLSAgUHlFeGNfUmVmZXJlbmNlRXJyb3I9cHl0aG9uMzUuUHlFeGNfUmVmZXJlbmNlRXJyb3IgREFUQQotICBQeUV4Y19SdW50aW1lRXJyb3I9cHl0aG9uMzUuUHlFeGNfUnVudGltZUVycm9yIERBVEEKLSAgUHlFeGNfUnVudGltZVdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfUnVudGltZVdhcm5pbmcgREFUQQotICBQeUV4Y19TdG9wSXRlcmF0aW9uPXB5dGhvbjM1LlB5RXhjX1N0b3BJdGVyYXRpb24gREFUQQotICBQeUV4Y19TeW50YXhFcnJvcj1weXRob24zNS5QeUV4Y19TeW50YXhFcnJvciBEQVRBCi0gIFB5RXhjX1N5bnRheFdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfU3ludGF4V2FybmluZyBEQVRBCi0gIFB5RXhjX1N5c3RlbUVycm9yPXB5dGhvbjM1LlB5RXhjX1N5c3RlbUVycm9yIERBVEEKLSAgUHlFeGNfU3lzdGVtRXhpdD1weXRob24zNS5QeUV4Y19TeXN0ZW1FeGl0IERBVEEKLSAgUHlFeGNfVGFiRXJyb3I9cHl0aG9uMzUuUHlFeGNfVGFiRXJyb3IgREFUQQotICBQeUV4Y19UeXBlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVHlwZUVycm9yIERBVEEKLSAgUHlFeGNfVW5ib3VuZExvY2FsRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5pY29kZURlY29kZUVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZUVuY29kZUVycm9yPXB5dGhvbjM1LlB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvciBEQVRBCi0gIFB5RXhjX1VuaWNvZGVFcnJvcj1weXRob24zNS5QeUV4Y19Vbmljb2RlRXJyb3IgREFUQQotICBQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yIERBVEEKLSAgUHlFeGNfVW5pY29kZVdhcm5pbmc9cHl0aG9uMzUuUHlFeGNfVW5pY29kZVdhcm5pbmcgREFUQQotICBQeUV4Y19Vc2VyV2FybmluZz1weXRob24zNS5QeUV4Y19Vc2VyV2FybmluZyBEQVRBCi0gIFB5RXhjX1ZhbHVlRXJyb3I9cHl0aG9uMzUuUHlFeGNfVmFsdWVFcnJvciBEQVRBCi0gIFB5RXhjX1dhcm5pbmc9cHl0aG9uMzUuUHlFeGNfV2FybmluZyBEQVRBCi0gIFB5RXhjX1plcm9EaXZpc2lvbkVycm9yPXB5dGhvbjM1LlB5RXhjX1plcm9EaXZpc2lvbkVycm9yIERBVEEKLSAgUHlFeGNlcHRpb25fR2V0Q2F1c2U9cHl0aG9uMzUuUHlFeGNlcHRpb25fR2V0Q2F1c2UKLSAgUHlFeGNlcHRpb25fR2V0Q29udGV4dD1weXRob24zNS5QeUV4Y2VwdGlvbl9HZXRDb250ZXh0Ci0gIFB5RXhjZXB0aW9uX0dldFRyYWNlYmFjaz1weXRob24zNS5QeUV4Y2VwdGlvbl9HZXRUcmFjZWJhY2sKLSAgUHlFeGNlcHRpb25fU2V0Q2F1c2U9cHl0aG9uMzUuUHlFeGNlcHRpb25fU2V0Q2F1c2UKLSAgUHlFeGNlcHRpb25fU2V0Q29udGV4dD1weXRob24zNS5QeUV4Y2VwdGlvbl9TZXRDb250ZXh0Ci0gIFB5RXhjZXB0aW9uX1NldFRyYWNlYmFjaz1weXRob24zNS5QeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2sKLSAgUHlGaWxlX0Zyb21GZD1weXRob24zNS5QeUZpbGVfRnJvbUZkCi0gIFB5RmlsZV9HZXRMaW5lPXB5dGhvbjM1LlB5RmlsZV9HZXRMaW5lCi0gIFB5RmlsZV9Xcml0ZU9iamVjdD1weXRob24zNS5QeUZpbGVfV3JpdGVPYmplY3QKLSAgUHlGaWxlX1dyaXRlU3RyaW5nPXB5dGhvbjM1LlB5RmlsZV9Xcml0ZVN0cmluZwotICBQeUZpbHRlcl9UeXBlPXB5dGhvbjM1LlB5RmlsdGVyX1R5cGUgREFUQQotICBQeUZsb2F0X0FzRG91YmxlPXB5dGhvbjM1LlB5RmxvYXRfQXNEb3VibGUKLSAgUHlGbG9hdF9Gcm9tRG91YmxlPXB5dGhvbjM1LlB5RmxvYXRfRnJvbURvdWJsZQotICBQeUZsb2F0X0Zyb21TdHJpbmc9cHl0aG9uMzUuUHlGbG9hdF9Gcm9tU3RyaW5nCi0gIFB5RmxvYXRfR2V0SW5mbz1weXRob24zNS5QeUZsb2F0X0dldEluZm8KLSAgUHlGbG9hdF9HZXRNYXg9cHl0aG9uMzUuUHlGbG9hdF9HZXRNYXgKLSAgUHlGbG9hdF9HZXRNaW49cHl0aG9uMzUuUHlGbG9hdF9HZXRNaW4KLSAgUHlGbG9hdF9UeXBlPXB5dGhvbjM1LlB5RmxvYXRfVHlwZSBEQVRBCi0gIFB5RnJvemVuU2V0X05ldz1weXRob24zNS5QeUZyb3plblNldF9OZXcKLSAgUHlGcm96ZW5TZXRfVHlwZT1weXRob24zNS5QeUZyb3plblNldF9UeXBlIERBVEEKLSAgUHlHQ19Db2xsZWN0PXB5dGhvbjM1LlB5R0NfQ29sbGVjdAotICBQeUdJTFN0YXRlX0Vuc3VyZT1weXRob24zNS5QeUdJTFN0YXRlX0Vuc3VyZQotICBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZT1weXRob24zNS5QeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZQotICBQeUdJTFN0YXRlX1JlbGVhc2U9cHl0aG9uMzUuUHlHSUxTdGF0ZV9SZWxlYXNlCi0gIFB5R2V0U2V0RGVzY3JfVHlwZT1weXRob24zNS5QeUdldFNldERlc2NyX1R5cGUgREFUQQotICBQeUltcG9ydF9BZGRNb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfQWRkTW9kdWxlCi0gIFB5SW1wb3J0X0FwcGVuZEluaXR0YWI9cHl0aG9uMzUuUHlJbXBvcnRfQXBwZW5kSW5pdHRhYgotICBQeUltcG9ydF9DbGVhbnVwPXB5dGhvbjM1LlB5SW1wb3J0X0NsZWFudXAKLSAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGUKLSAgUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeD1weXRob24zNS5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4Ci0gIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlV2l0aFBhdGhuYW1lcz1weXRob24zNS5QeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXMKLSAgUHlJbXBvcnRfR2V0SW1wb3J0ZXI9cHl0aG9uMzUuUHlJbXBvcnRfR2V0SW1wb3J0ZXIKLSAgUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXI9cHl0aG9uMzUuUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIKLSAgUHlJbXBvcnRfR2V0TWFnaWNUYWc9cHl0aG9uMzUuUHlJbXBvcnRfR2V0TWFnaWNUYWcKLSAgUHlJbXBvcnRfR2V0TW9kdWxlRGljdD1weXRob24zNS5QeUltcG9ydF9HZXRNb2R1bGVEaWN0Ci0gIFB5SW1wb3J0X0ltcG9ydD1weXRob24zNS5QeUltcG9ydF9JbXBvcnQKLSAgUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlPXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZQotICBQeUltcG9ydF9JbXBvcnRNb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0TW9kdWxlCi0gIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsPXB5dGhvbjM1LlB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsCi0gIFB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2s9cHl0aG9uMzUuUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jawotICBQeUltcG9ydF9SZWxvYWRNb2R1bGU9cHl0aG9uMzUuUHlJbXBvcnRfUmVsb2FkTW9kdWxlCi0gIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcj1weXRob24zNS5QeUludGVycHJldGVyU3RhdGVfQ2xlYXIKLSAgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZT1weXRob24zNS5QeUludGVycHJldGVyU3RhdGVfRGVsZXRlCi0gIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXc9cHl0aG9uMzUuUHlJbnRlcnByZXRlclN0YXRlX05ldwotICBQeUl0ZXJfTmV4dD1weXRob24zNS5QeUl0ZXJfTmV4dAotICBQeUxpc3RJdGVyX1R5cGU9cHl0aG9uMzUuUHlMaXN0SXRlcl9UeXBlIERBVEEKLSAgUHlMaXN0UmV2SXRlcl9UeXBlPXB5dGhvbjM1LlB5TGlzdFJldkl0ZXJfVHlwZSBEQVRBCi0gIFB5TGlzdF9BcHBlbmQ9cHl0aG9uMzUuUHlMaXN0X0FwcGVuZAotICBQeUxpc3RfQXNUdXBsZT1weXRob24zNS5QeUxpc3RfQXNUdXBsZQotICBQeUxpc3RfR2V0SXRlbT1weXRob24zNS5QeUxpc3RfR2V0SXRlbQotICBQeUxpc3RfR2V0U2xpY2U9cHl0aG9uMzUuUHlMaXN0X0dldFNsaWNlCi0gIFB5TGlzdF9JbnNlcnQ9cHl0aG9uMzUuUHlMaXN0X0luc2VydAotICBQeUxpc3RfTmV3PXB5dGhvbjM1LlB5TGlzdF9OZXcKLSAgUHlMaXN0X1JldmVyc2U9cHl0aG9uMzUuUHlMaXN0X1JldmVyc2UKLSAgUHlMaXN0X1NldEl0ZW09cHl0aG9uMzUuUHlMaXN0X1NldEl0ZW0KLSAgUHlMaXN0X1NldFNsaWNlPXB5dGhvbjM1LlB5TGlzdF9TZXRTbGljZQotICBQeUxpc3RfU2l6ZT1weXRob24zNS5QeUxpc3RfU2l6ZQotICBQeUxpc3RfU29ydD1weXRob24zNS5QeUxpc3RfU29ydAotICBQeUxpc3RfVHlwZT1weXRob24zNS5QeUxpc3RfVHlwZSBEQVRBCi0gIFB5TG9uZ1JhbmdlSXRlcl9UeXBlPXB5dGhvbjM1LlB5TG9uZ1JhbmdlSXRlcl9UeXBlIERBVEEKLSAgUHlMb25nX0FzRG91YmxlPXB5dGhvbjM1LlB5TG9uZ19Bc0RvdWJsZQotICBQeUxvbmdfQXNMb25nPXB5dGhvbjM1LlB5TG9uZ19Bc0xvbmcKLSAgUHlMb25nX0FzTG9uZ0FuZE92ZXJmbG93PXB5dGhvbjM1LlB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdwotICBQeUxvbmdfQXNMb25nTG9uZz1weXRob24zNS5QeUxvbmdfQXNMb25nTG9uZwotICBQeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93PXB5dGhvbjM1LlB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3cKLSAgUHlMb25nX0FzU2l6ZV90PXB5dGhvbjM1LlB5TG9uZ19Bc1NpemVfdAotICBQeUxvbmdfQXNTc2l6ZV90PXB5dGhvbjM1LlB5TG9uZ19Bc1NzaXplX3QKLSAgUHlMb25nX0FzVW5zaWduZWRMb25nPXB5dGhvbjM1LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZwotICBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nPXB5dGhvbjM1LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcKLSAgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2s9cHl0aG9uMzUuUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2sKLSAgUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaz1weXRob24zNS5QeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrCi0gIFB5TG9uZ19Bc1ZvaWRQdHI9cHl0aG9uMzUuUHlMb25nX0FzVm9pZFB0cgotICBQeUxvbmdfRnJvbURvdWJsZT1weXRob24zNS5QeUxvbmdfRnJvbURvdWJsZQotICBQeUxvbmdfRnJvbUxvbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21Mb25nCi0gIFB5TG9uZ19Gcm9tTG9uZ0xvbmc9cHl0aG9uMzUuUHlMb25nX0Zyb21Mb25nTG9uZwotICBQeUxvbmdfRnJvbVNpemVfdD1weXRob24zNS5QeUxvbmdfRnJvbVNpemVfdAotICBQeUxvbmdfRnJvbVNzaXplX3Q9cHl0aG9uMzUuUHlMb25nX0Zyb21Tc2l6ZV90Ci0gIFB5TG9uZ19Gcm9tU3RyaW5nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tU3RyaW5nCi0gIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nPXB5dGhvbjM1LlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nCi0gIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZz1weXRob24zNS5QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcKLSAgUHlMb25nX0Zyb21Wb2lkUHRyPXB5dGhvbjM1LlB5TG9uZ19Gcm9tVm9pZFB0cgotICBQeUxvbmdfR2V0SW5mbz1weXRob24zNS5QeUxvbmdfR2V0SW5mbwotICBQeUxvbmdfVHlwZT1weXRob24zNS5QeUxvbmdfVHlwZSBEQVRBCi0gIFB5TWFwX1R5cGU9cHl0aG9uMzUuUHlNYXBfVHlwZSBEQVRBCi0gIFB5TWFwcGluZ19DaGVjaz1weXRob24zNS5QeU1hcHBpbmdfQ2hlY2sKLSAgUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlNYXBwaW5nX0dldEl0ZW1TdHJpbmcKLSAgUHlNYXBwaW5nX0hhc0tleT1weXRob24zNS5QeU1hcHBpbmdfSGFzS2V5Ci0gIFB5TWFwcGluZ19IYXNLZXlTdHJpbmc9cHl0aG9uMzUuUHlNYXBwaW5nX0hhc0tleVN0cmluZwotICBQeU1hcHBpbmdfSXRlbXM9cHl0aG9uMzUuUHlNYXBwaW5nX0l0ZW1zCi0gIFB5TWFwcGluZ19LZXlzPXB5dGhvbjM1LlB5TWFwcGluZ19LZXlzCi0gIFB5TWFwcGluZ19MZW5ndGg9cHl0aG9uMzUuUHlNYXBwaW5nX0xlbmd0aAotICBQeU1hcHBpbmdfU2V0SXRlbVN0cmluZz1weXRob24zNS5QeU1hcHBpbmdfU2V0SXRlbVN0cmluZwotICBQeU1hcHBpbmdfU2l6ZT1weXRob24zNS5QeU1hcHBpbmdfU2l6ZQotICBQeU1hcHBpbmdfVmFsdWVzPXB5dGhvbjM1LlB5TWFwcGluZ19WYWx1ZXMKLSAgUHlNZW1fRnJlZT1weXRob24zNS5QeU1lbV9GcmVlCi0gIFB5TWVtX01hbGxvYz1weXRob24zNS5QeU1lbV9NYWxsb2MKLSAgUHlNZW1fUmVhbGxvYz1weXRob24zNS5QeU1lbV9SZWFsbG9jCi0gIFB5TWVtYmVyRGVzY3JfVHlwZT1weXRob24zNS5QeU1lbWJlckRlc2NyX1R5cGUgREFUQQotICBQeU1lbW9yeVZpZXdfRnJvbU9iamVjdD1weXRob24zNS5QeU1lbW9yeVZpZXdfRnJvbU9iamVjdAotICBQeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cz1weXRob24zNS5QeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cwotICBQeU1lbW9yeVZpZXdfVHlwZT1weXRob24zNS5QeU1lbW9yeVZpZXdfVHlwZSBEQVRBCi0gIFB5TWV0aG9kRGVzY3JfVHlwZT1weXRob24zNS5QeU1ldGhvZERlc2NyX1R5cGUgREFUQQotICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudD1weXRob24zNS5QeU1vZHVsZV9BZGRJbnRDb25zdGFudAotICBQeU1vZHVsZV9BZGRPYmplY3Q9cHl0aG9uMzUuUHlNb2R1bGVfQWRkT2JqZWN0Ci0gIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50PXB5dGhvbjM1LlB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50Ci0gIFB5TW9kdWxlX0NyZWF0ZTI9cHl0aG9uMzUuUHlNb2R1bGVfQ3JlYXRlMgotICBQeU1vZHVsZV9HZXREZWY9cHl0aG9uMzUuUHlNb2R1bGVfR2V0RGVmCi0gIFB5TW9kdWxlX0dldERpY3Q9cHl0aG9uMzUuUHlNb2R1bGVfR2V0RGljdAotICBQeU1vZHVsZV9HZXRGaWxlbmFtZT1weXRob24zNS5QeU1vZHVsZV9HZXRGaWxlbmFtZQotICBQeU1vZHVsZV9HZXRGaWxlbmFtZU9iamVjdD1weXRob24zNS5QeU1vZHVsZV9HZXRGaWxlbmFtZU9iamVjdAotICBQeU1vZHVsZV9HZXROYW1lPXB5dGhvbjM1LlB5TW9kdWxlX0dldE5hbWUKLSAgUHlNb2R1bGVfR2V0U3RhdGU9cHl0aG9uMzUuUHlNb2R1bGVfR2V0U3RhdGUKLSAgUHlNb2R1bGVfTmV3PXB5dGhvbjM1LlB5TW9kdWxlX05ldwotICBQeU1vZHVsZV9UeXBlPXB5dGhvbjM1LlB5TW9kdWxlX1R5cGUgREFUQQotICBQeU1vZHVsZURlZl9Jbml0PXB5dGhvbjM1LlB5TW9kdWxlRGVmX0luaXQKLSAgUHlNb2R1bGVEZWZfVHlwZT1weXRob24zNS5QeU1vZHVsZURlZl9UeXBlIERBVEEKLSAgUHlOdWxsSW1wb3J0ZXJfVHlwZT1weXRob24zNS5QeU51bGxJbXBvcnRlcl9UeXBlIERBVEEKLSAgUHlOdW1iZXJfQWJzb2x1dGU9cHl0aG9uMzUuUHlOdW1iZXJfQWJzb2x1dGUKLSAgUHlOdW1iZXJfQWRkPXB5dGhvbjM1LlB5TnVtYmVyX0FkZAotICBQeU51bWJlcl9BbmQ9cHl0aG9uMzUuUHlOdW1iZXJfQW5kCi0gIFB5TnVtYmVyX0FzU3NpemVfdD1weXRob24zNS5QeU51bWJlcl9Bc1NzaXplX3QKLSAgUHlOdW1iZXJfQ2hlY2s9cHl0aG9uMzUuUHlOdW1iZXJfQ2hlY2sKLSAgUHlOdW1iZXJfRGl2bW9kPXB5dGhvbjM1LlB5TnVtYmVyX0Rpdm1vZAotICBQeU51bWJlcl9GbG9hdD1weXRob24zNS5QeU51bWJlcl9GbG9hdAotICBQeU51bWJlcl9GbG9vckRpdmlkZT1weXRob24zNS5QeU51bWJlcl9GbG9vckRpdmlkZQotICBQeU51bWJlcl9JblBsYWNlQWRkPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VBZGQKLSAgUHlOdW1iZXJfSW5QbGFjZUFuZD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlQW5kCi0gIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZT1weXRob24zNS5QeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGUKLSAgUHlOdW1iZXJfSW5QbGFjZUxzaGlmdD1weXRob24zNS5QeU51bWJlcl9JblBsYWNlTHNoaWZ0Ci0gIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseT1weXRob24zNS5QeU51bWJlcl9JblBsYWNlTXVsdGlwbHkKLSAgUHlOdW1iZXJfSW5QbGFjZU9yPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VPcgotICBQeU51bWJlcl9JblBsYWNlUG93ZXI9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVBvd2VyCi0gIFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXI9cHl0aG9uMzUuUHlOdW1iZXJfSW5QbGFjZVJlbWFpbmRlcgotICBQeU51bWJlcl9JblBsYWNlUnNoaWZ0PXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VSc2hpZnQKLSAgUHlOdW1iZXJfSW5QbGFjZVN1YnRyYWN0PXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdAotICBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZT1weXRob24zNS5QeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZQotICBQeU51bWJlcl9JblBsYWNlWG9yPXB5dGhvbjM1LlB5TnVtYmVyX0luUGxhY2VYb3IKLSAgUHlOdW1iZXJfSW5kZXg9cHl0aG9uMzUuUHlOdW1iZXJfSW5kZXgKLSAgUHlOdW1iZXJfSW52ZXJ0PXB5dGhvbjM1LlB5TnVtYmVyX0ludmVydAotICBQeU51bWJlcl9Mb25nPXB5dGhvbjM1LlB5TnVtYmVyX0xvbmcKLSAgUHlOdW1iZXJfTHNoaWZ0PXB5dGhvbjM1LlB5TnVtYmVyX0xzaGlmdAotICBQeU51bWJlcl9NdWx0aXBseT1weXRob24zNS5QeU51bWJlcl9NdWx0aXBseQotICBQeU51bWJlcl9OZWdhdGl2ZT1weXRob24zNS5QeU51bWJlcl9OZWdhdGl2ZQotICBQeU51bWJlcl9Pcj1weXRob24zNS5QeU51bWJlcl9PcgotICBQeU51bWJlcl9Qb3NpdGl2ZT1weXRob24zNS5QeU51bWJlcl9Qb3NpdGl2ZQotICBQeU51bWJlcl9Qb3dlcj1weXRob24zNS5QeU51bWJlcl9Qb3dlcgotICBQeU51bWJlcl9SZW1haW5kZXI9cHl0aG9uMzUuUHlOdW1iZXJfUmVtYWluZGVyCi0gIFB5TnVtYmVyX1JzaGlmdD1weXRob24zNS5QeU51bWJlcl9Sc2hpZnQKLSAgUHlOdW1iZXJfU3VidHJhY3Q9cHl0aG9uMzUuUHlOdW1iZXJfU3VidHJhY3QKLSAgUHlOdW1iZXJfVG9CYXNlPXB5dGhvbjM1LlB5TnVtYmVyX1RvQmFzZQotICBQeU51bWJlcl9UcnVlRGl2aWRlPXB5dGhvbjM1LlB5TnVtYmVyX1RydWVEaXZpZGUKLSAgUHlOdW1iZXJfWG9yPXB5dGhvbjM1LlB5TnVtYmVyX1hvcgotICBQeU9TX0FmdGVyRm9yaz1weXRob24zNS5QeU9TX0FmdGVyRm9yawotICBQeU9TX0luaXRJbnRlcnJ1cHRzPXB5dGhvbjM1LlB5T1NfSW5pdEludGVycnVwdHMKLSAgUHlPU19JbnB1dEhvb2s9cHl0aG9uMzUuUHlPU19JbnB1dEhvb2sgREFUQQotICBQeU9TX0ludGVycnVwdE9jY3VycmVkPXB5dGhvbjM1LlB5T1NfSW50ZXJydXB0T2NjdXJyZWQKLSAgUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlcj1weXRob24zNS5QeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyIERBVEEKLSAgUHlPU19kb3VibGVfdG9fc3RyaW5nPXB5dGhvbjM1LlB5T1NfZG91YmxlX3RvX3N0cmluZwotICBQeU9TX2dldHNpZz1weXRob24zNS5QeU9TX2dldHNpZwotICBQeU9TX215c3RyaWNtcD1weXRob24zNS5QeU9TX215c3RyaWNtcAotICBQeU9TX215c3RybmljbXA9cHl0aG9uMzUuUHlPU19teXN0cm5pY21wCi0gIFB5T1Nfc2V0c2lnPXB5dGhvbjM1LlB5T1Nfc2V0c2lnCi0gIFB5T1Nfc25wcmludGY9cHl0aG9uMzUuUHlPU19zbnByaW50ZgotICBQeU9TX3N0cmluZ190b19kb3VibGU9cHl0aG9uMzUuUHlPU19zdHJpbmdfdG9fZG91YmxlCi0gIFB5T1Nfc3RydG9sPXB5dGhvbjM1LlB5T1Nfc3RydG9sCi0gIFB5T1Nfc3RydG91bD1weXRob24zNS5QeU9TX3N0cnRvdWwKLSAgUHlPU192c25wcmludGY9cHl0aG9uMzUuUHlPU192c25wcmludGYKLSAgUHlPYmplY3RfQVNDSUk9cHl0aG9uMzUuUHlPYmplY3RfQVNDSUkKLSAgUHlPYmplY3RfQXNDaGFyQnVmZmVyPXB5dGhvbjM1LlB5T2JqZWN0X0FzQ2hhckJ1ZmZlcgotICBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yPXB5dGhvbjM1LlB5T2JqZWN0X0FzRmlsZURlc2NyaXB0b3IKLSAgUHlPYmplY3RfQXNSZWFkQnVmZmVyPXB5dGhvbjM1LlB5T2JqZWN0X0FzUmVhZEJ1ZmZlcgotICBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyPXB5dGhvbjM1LlB5T2JqZWN0X0FzV3JpdGVCdWZmZXIKLSAgUHlPYmplY3RfQnl0ZXM9cHl0aG9uMzUuUHlPYmplY3RfQnl0ZXMKLSAgUHlPYmplY3RfQ2FsbD1weXRob24zNS5QeU9iamVjdF9DYWxsCi0gIFB5T2JqZWN0X0NhbGxGdW5jdGlvbj1weXRob24zNS5QeU9iamVjdF9DYWxsRnVuY3Rpb24KLSAgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncz1weXRob24zNS5QeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzCi0gIFB5T2JqZWN0X0NhbGxNZXRob2Q9cHl0aG9uMzUuUHlPYmplY3RfQ2FsbE1ldGhvZAotICBQeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncz1weXRob24zNS5QeU9iamVjdF9DYWxsTWV0aG9kT2JqQXJncwotICBQeU9iamVjdF9DYWxsT2JqZWN0PXB5dGhvbjM1LlB5T2JqZWN0X0NhbGxPYmplY3QKLSAgUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyPXB5dGhvbjM1LlB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcgotICBQeU9iamVjdF9DbGVhcldlYWtSZWZzPXB5dGhvbjM1LlB5T2JqZWN0X0NsZWFyV2Vha1JlZnMKLSAgUHlPYmplY3RfRGVsSXRlbT1weXRob24zNS5QeU9iamVjdF9EZWxJdGVtCi0gIFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmc9cHl0aG9uMzUuUHlPYmplY3RfRGVsSXRlbVN0cmluZwotICBQeU9iamVjdF9EaXI9cHl0aG9uMzUuUHlPYmplY3RfRGlyCi0gIFB5T2JqZWN0X0Zvcm1hdD1weXRob24zNS5QeU9iamVjdF9Gb3JtYXQKLSAgUHlPYmplY3RfRnJlZT1weXRob24zNS5QeU9iamVjdF9GcmVlCi0gIFB5T2JqZWN0X0dDX0RlbD1weXRob24zNS5QeU9iamVjdF9HQ19EZWwKLSAgUHlPYmplY3RfR0NfVHJhY2s9cHl0aG9uMzUuUHlPYmplY3RfR0NfVHJhY2sKLSAgUHlPYmplY3RfR0NfVW5UcmFjaz1weXRob24zNS5QeU9iamVjdF9HQ19VblRyYWNrCi0gIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyCi0gIFB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X0dlbmVyaWNTZXRBdHRyCi0gIFB5T2JqZWN0X0dldEF0dHI9cHl0aG9uMzUuUHlPYmplY3RfR2V0QXR0cgotICBQeU9iamVjdF9HZXRBdHRyU3RyaW5nPXB5dGhvbjM1LlB5T2JqZWN0X0dldEF0dHJTdHJpbmcKLSAgUHlPYmplY3RfR2V0SXRlbT1weXRob24zNS5QeU9iamVjdF9HZXRJdGVtCi0gIFB5T2JqZWN0X0dldEl0ZXI9cHl0aG9uMzUuUHlPYmplY3RfR2V0SXRlcgotICBQeU9iamVjdF9IYXNBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X0hhc0F0dHIKLSAgUHlPYmplY3RfSGFzQXR0clN0cmluZz1weXRob24zNS5QeU9iamVjdF9IYXNBdHRyU3RyaW5nCi0gIFB5T2JqZWN0X0hhc2g9cHl0aG9uMzUuUHlPYmplY3RfSGFzaAotICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQ9cHl0aG9uMzUuUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkCi0gIFB5T2JqZWN0X0luaXQ9cHl0aG9uMzUuUHlPYmplY3RfSW5pdAotICBQeU9iamVjdF9Jbml0VmFyPXB5dGhvbjM1LlB5T2JqZWN0X0luaXRWYXIKLSAgUHlPYmplY3RfSXNJbnN0YW5jZT1weXRob24zNS5QeU9iamVjdF9Jc0luc3RhbmNlCi0gIFB5T2JqZWN0X0lzU3ViY2xhc3M9cHl0aG9uMzUuUHlPYmplY3RfSXNTdWJjbGFzcwotICBQeU9iamVjdF9Jc1RydWU9cHl0aG9uMzUuUHlPYmplY3RfSXNUcnVlCi0gIFB5T2JqZWN0X0xlbmd0aD1weXRob24zNS5QeU9iamVjdF9MZW5ndGgKLSAgUHlPYmplY3RfTWFsbG9jPXB5dGhvbjM1LlB5T2JqZWN0X01hbGxvYwotICBQeU9iamVjdF9Ob3Q9cHl0aG9uMzUuUHlPYmplY3RfTm90Ci0gIFB5T2JqZWN0X1JlYWxsb2M9cHl0aG9uMzUuUHlPYmplY3RfUmVhbGxvYwotICBQeU9iamVjdF9SZXByPXB5dGhvbjM1LlB5T2JqZWN0X1JlcHIKLSAgUHlPYmplY3RfUmljaENvbXBhcmU9cHl0aG9uMzUuUHlPYmplY3RfUmljaENvbXBhcmUKLSAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sPXB5dGhvbjM1LlB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbAotICBQeU9iamVjdF9TZWxmSXRlcj1weXRob24zNS5QeU9iamVjdF9TZWxmSXRlcgotICBQeU9iamVjdF9TZXRBdHRyPXB5dGhvbjM1LlB5T2JqZWN0X1NldEF0dHIKLSAgUHlPYmplY3RfU2V0QXR0clN0cmluZz1weXRob24zNS5QeU9iamVjdF9TZXRBdHRyU3RyaW5nCi0gIFB5T2JqZWN0X1NldEl0ZW09cHl0aG9uMzUuUHlPYmplY3RfU2V0SXRlbQotICBQeU9iamVjdF9TaXplPXB5dGhvbjM1LlB5T2JqZWN0X1NpemUKLSAgUHlPYmplY3RfU3RyPXB5dGhvbjM1LlB5T2JqZWN0X1N0cgotICBQeU9iamVjdF9UeXBlPXB5dGhvbjM1LlB5T2JqZWN0X1R5cGUgREFUQQotICBQeU9EaWN0X0RlbEl0ZW09cHl0aG9uMzUuUHlPRGljdF9EZWxJdGVtCi0gIFB5T0RpY3RfTmV3PXB5dGhvbjM1LlB5T0RpY3RfTmV3Ci0gIFB5T0RpY3RfU2V0SXRlbT1weXRob24zNS5QeU9EaWN0X1NldEl0ZW0KLSAgUHlPRGljdF9UeXBlPXB5dGhvbjM1LlB5T0RpY3RfVHlwZSBEQVRBCi0gIFB5T0RpY3RJdGVtc19UeXBlPXB5dGhvbjM1LlB5T0RpY3RJdGVtc19UeXBlIERBVEEKLSAgUHlPRGljdEl0ZXJfVHlwZT1weXRob24zNS5QeU9EaWN0SXRlcl9UeXBlIERBVEEKLSAgUHlPRGljdEtleXNfVHlwZT1weXRob24zNS5QeU9EaWN0S2V5c19UeXBlIERBVEEKLSAgUHlPRGljdFZhbHVlc19UeXBlPXB5dGhvbjM1LlB5T0RpY3RWYWx1ZXNfVHlwZSBEQVRBCi0gIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzPXB5dGhvbjM1LlB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzCi0gIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3M9cHl0aG9uMzUuUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncwotICBQeVByb3BlcnR5X1R5cGU9cHl0aG9uMzUuUHlQcm9wZXJ0eV9UeXBlIERBVEEKLSAgUHlSYW5nZUl0ZXJfVHlwZT1weXRob24zNS5QeVJhbmdlSXRlcl9UeXBlIERBVEEKLSAgUHlSYW5nZV9UeXBlPXB5dGhvbjM1LlB5UmFuZ2VfVHlwZSBEQVRBCi0gIFB5UmV2ZXJzZWRfVHlwZT1weXRob24zNS5QeVJldmVyc2VkX1R5cGUgREFUQQotICBQeVNlcUl0ZXJfTmV3PXB5dGhvbjM1LlB5U2VxSXRlcl9OZXcKLSAgUHlTZXFJdGVyX1R5cGU9cHl0aG9uMzUuUHlTZXFJdGVyX1R5cGUgREFUQQotICBQeVNlcXVlbmNlX0NoZWNrPXB5dGhvbjM1LlB5U2VxdWVuY2VfQ2hlY2sKLSAgUHlTZXF1ZW5jZV9Db25jYXQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9Db25jYXQKLSAgUHlTZXF1ZW5jZV9Db250YWlucz1weXRob24zNS5QeVNlcXVlbmNlX0NvbnRhaW5zCi0gIFB5U2VxdWVuY2VfQ291bnQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9Db3VudAotICBQeVNlcXVlbmNlX0RlbEl0ZW09cHl0aG9uMzUuUHlTZXF1ZW5jZV9EZWxJdGVtCi0gIFB5U2VxdWVuY2VfRGVsU2xpY2U9cHl0aG9uMzUuUHlTZXF1ZW5jZV9EZWxTbGljZQotICBQeVNlcXVlbmNlX0Zhc3Q9cHl0aG9uMzUuUHlTZXF1ZW5jZV9GYXN0Ci0gIFB5U2VxdWVuY2VfR2V0SXRlbT1weXRob24zNS5QeVNlcXVlbmNlX0dldEl0ZW0KLSAgUHlTZXF1ZW5jZV9HZXRTbGljZT1weXRob24zNS5QeVNlcXVlbmNlX0dldFNsaWNlCi0gIFB5U2VxdWVuY2VfSW49cHl0aG9uMzUuUHlTZXF1ZW5jZV9JbgotICBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0Ci0gIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdD1weXRob24zNS5QeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQKLSAgUHlTZXF1ZW5jZV9JbmRleD1weXRob24zNS5QeVNlcXVlbmNlX0luZGV4Ci0gIFB5U2VxdWVuY2VfTGVuZ3RoPXB5dGhvbjM1LlB5U2VxdWVuY2VfTGVuZ3RoCi0gIFB5U2VxdWVuY2VfTGlzdD1weXRob24zNS5QeVNlcXVlbmNlX0xpc3QKLSAgUHlTZXF1ZW5jZV9SZXBlYXQ9cHl0aG9uMzUuUHlTZXF1ZW5jZV9SZXBlYXQKLSAgUHlTZXF1ZW5jZV9TZXRJdGVtPXB5dGhvbjM1LlB5U2VxdWVuY2VfU2V0SXRlbQotICBQeVNlcXVlbmNlX1NldFNsaWNlPXB5dGhvbjM1LlB5U2VxdWVuY2VfU2V0U2xpY2UKLSAgUHlTZXF1ZW5jZV9TaXplPXB5dGhvbjM1LlB5U2VxdWVuY2VfU2l6ZQotICBQeVNlcXVlbmNlX1R1cGxlPXB5dGhvbjM1LlB5U2VxdWVuY2VfVHVwbGUKLSAgUHlTZXRJdGVyX1R5cGU9cHl0aG9uMzUuUHlTZXRJdGVyX1R5cGUgREFUQQotICBQeVNldF9BZGQ9cHl0aG9uMzUuUHlTZXRfQWRkCi0gIFB5U2V0X0NsZWFyPXB5dGhvbjM1LlB5U2V0X0NsZWFyCi0gIFB5U2V0X0NvbnRhaW5zPXB5dGhvbjM1LlB5U2V0X0NvbnRhaW5zCi0gIFB5U2V0X0Rpc2NhcmQ9cHl0aG9uMzUuUHlTZXRfRGlzY2FyZAotICBQeVNldF9OZXc9cHl0aG9uMzUuUHlTZXRfTmV3Ci0gIFB5U2V0X1BvcD1weXRob24zNS5QeVNldF9Qb3AKLSAgUHlTZXRfU2l6ZT1weXRob24zNS5QeVNldF9TaXplCi0gIFB5U2V0X1R5cGU9cHl0aG9uMzUuUHlTZXRfVHlwZSBEQVRBCi0gIFB5U2xpY2VfR2V0SW5kaWNlcz1weXRob24zNS5QeVNsaWNlX0dldEluZGljZXMKLSAgUHlTbGljZV9HZXRJbmRpY2VzRXg9cHl0aG9uMzUuUHlTbGljZV9HZXRJbmRpY2VzRXgKLSAgUHlTbGljZV9OZXc9cHl0aG9uMzUuUHlTbGljZV9OZXcKLSAgUHlTbGljZV9UeXBlPXB5dGhvbjM1LlB5U2xpY2VfVHlwZSBEQVRBCi0gIFB5U29ydFdyYXBwZXJfVHlwZT1weXRob24zNS5QeVNvcnRXcmFwcGVyX1R5cGUgREFUQQotICBQeVN0YXRlX0ZpbmRNb2R1bGU9cHl0aG9uMzUuUHlTdGF0ZV9GaW5kTW9kdWxlCi0gIFB5U3RhdGVfQWRkTW9kdWxlPXB5dGhvbjM1LlB5U3RhdGVfQWRkTW9kdWxlCi0gIFB5U3RhdGVfUmVtb3ZlTW9kdWxlPXB5dGhvbjM1LlB5U3RhdGVfUmVtb3ZlTW9kdWxlCi0gIFB5U3RydWN0U2VxdWVuY2VfR2V0SXRlbT1weXRob24zNS5QeVN0cnVjdFNlcXVlbmNlX0dldEl0ZW0KLSAgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXc9cHl0aG9uMzUuUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcKLSAgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXdUeXBlPXB5dGhvbjM1LlB5U3RydWN0U2VxdWVuY2VfTmV3VHlwZQotICBQeVN0cnVjdFNlcXVlbmNlX1NldEl0ZW09cHl0aG9uMzUuUHlTdHJ1Y3RTZXF1ZW5jZV9TZXRJdGVtCi0gIFB5U3VwZXJfVHlwZT1weXRob24zNS5QeVN1cGVyX1R5cGUgREFUQQotICBQeVN5c19BZGRXYXJuT3B0aW9uPXB5dGhvbjM1LlB5U3lzX0FkZFdhcm5PcHRpb24KLSAgUHlTeXNfQWRkV2Fybk9wdGlvblVuaWNvZGU9cHl0aG9uMzUuUHlTeXNfQWRkV2Fybk9wdGlvblVuaWNvZGUKLSAgUHlTeXNfRm9ybWF0U3RkZXJyPXB5dGhvbjM1LlB5U3lzX0Zvcm1hdFN0ZGVycgotICBQeVN5c19Gb3JtYXRTdGRvdXQ9cHl0aG9uMzUuUHlTeXNfRm9ybWF0U3Rkb3V0Ci0gIFB5U3lzX0dldE9iamVjdD1weXRob24zNS5QeVN5c19HZXRPYmplY3QKLSAgUHlTeXNfSGFzV2Fybk9wdGlvbnM9cHl0aG9uMzUuUHlTeXNfSGFzV2Fybk9wdGlvbnMKLSAgUHlTeXNfUmVzZXRXYXJuT3B0aW9ucz1weXRob24zNS5QeVN5c19SZXNldFdhcm5PcHRpb25zCi0gIFB5U3lzX1NldEFyZ3Y9cHl0aG9uMzUuUHlTeXNfU2V0QXJndgotICBQeVN5c19TZXRBcmd2RXg9cHl0aG9uMzUuUHlTeXNfU2V0QXJndkV4Ci0gIFB5U3lzX1NldE9iamVjdD1weXRob24zNS5QeVN5c19TZXRPYmplY3QKLSAgUHlTeXNfU2V0UGF0aD1weXRob24zNS5QeVN5c19TZXRQYXRoCi0gIFB5U3lzX1dyaXRlU3RkZXJyPXB5dGhvbjM1LlB5U3lzX1dyaXRlU3RkZXJyCi0gIFB5U3lzX1dyaXRlU3Rkb3V0PXB5dGhvbjM1LlB5U3lzX1dyaXRlU3Rkb3V0Ci0gIFB5VGhyZWFkU3RhdGVfQ2xlYXI9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9DbGVhcgotICBQeVRocmVhZFN0YXRlX0RlbGV0ZT1weXRob24zNS5QeVRocmVhZFN0YXRlX0RlbGV0ZQotICBQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQ9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50Ci0gIFB5VGhyZWFkU3RhdGVfR2V0PXB5dGhvbjM1LlB5VGhyZWFkU3RhdGVfR2V0Ci0gIFB5VGhyZWFkU3RhdGVfR2V0RGljdD1weXRob24zNS5QeVRocmVhZFN0YXRlX0dldERpY3QKLSAgUHlUaHJlYWRTdGF0ZV9OZXc9cHl0aG9uMzUuUHlUaHJlYWRTdGF0ZV9OZXcKLSAgUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4Yz1weXRob24zNS5QeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjCi0gIFB5VGhyZWFkU3RhdGVfU3dhcD1weXRob24zNS5QeVRocmVhZFN0YXRlX1N3YXAKLSAgUHlUcmFjZUJhY2tfSGVyZT1weXRob24zNS5QeVRyYWNlQmFja19IZXJlCi0gIFB5VHJhY2VCYWNrX1ByaW50PXB5dGhvbjM1LlB5VHJhY2VCYWNrX1ByaW50Ci0gIFB5VHJhY2VCYWNrX1R5cGU9cHl0aG9uMzUuUHlUcmFjZUJhY2tfVHlwZSBEQVRBCi0gIFB5VHVwbGVJdGVyX1R5cGU9cHl0aG9uMzUuUHlUdXBsZUl0ZXJfVHlwZSBEQVRBCi0gIFB5VHVwbGVfQ2xlYXJGcmVlTGlzdD1weXRob24zNS5QeVR1cGxlX0NsZWFyRnJlZUxpc3QKLSAgUHlUdXBsZV9HZXRJdGVtPXB5dGhvbjM1LlB5VHVwbGVfR2V0SXRlbQotICBQeVR1cGxlX0dldFNsaWNlPXB5dGhvbjM1LlB5VHVwbGVfR2V0U2xpY2UKLSAgUHlUdXBsZV9OZXc9cHl0aG9uMzUuUHlUdXBsZV9OZXcKLSAgUHlUdXBsZV9QYWNrPXB5dGhvbjM1LlB5VHVwbGVfUGFjawotICBQeVR1cGxlX1NldEl0ZW09cHl0aG9uMzUuUHlUdXBsZV9TZXRJdGVtCi0gIFB5VHVwbGVfU2l6ZT1weXRob24zNS5QeVR1cGxlX1NpemUKLSAgUHlUdXBsZV9UeXBlPXB5dGhvbjM1LlB5VHVwbGVfVHlwZSBEQVRBCi0gIFB5VHlwZV9DbGVhckNhY2hlPXB5dGhvbjM1LlB5VHlwZV9DbGVhckNhY2hlCi0gIFB5VHlwZV9Gcm9tU3BlYz1weXRob24zNS5QeVR5cGVfRnJvbVNwZWMKLSAgUHlUeXBlX0Zyb21TcGVjV2l0aEJhc2VzPXB5dGhvbjM1LlB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcwotICBQeVR5cGVfR2VuZXJpY0FsbG9jPXB5dGhvbjM1LlB5VHlwZV9HZW5lcmljQWxsb2MKLSAgUHlUeXBlX0dlbmVyaWNOZXc9cHl0aG9uMzUuUHlUeXBlX0dlbmVyaWNOZXcKLSAgUHlUeXBlX0dldEZsYWdzPXB5dGhvbjM1LlB5VHlwZV9HZXRGbGFncwotICBQeVR5cGVfR2V0U2xvdD1weXRob24zNS5QeVR5cGVfR2V0U2xvdAotICBQeVR5cGVfSXNTdWJ0eXBlPXB5dGhvbjM1LlB5VHlwZV9Jc1N1YnR5cGUKLSAgUHlUeXBlX01vZGlmaWVkPXB5dGhvbjM1LlB5VHlwZV9Nb2RpZmllZAotICBQeVR5cGVfUmVhZHk9cHl0aG9uMzUuUHlUeXBlX1JlYWR5Ci0gIFB5VHlwZV9UeXBlPXB5dGhvbjM1LlB5VHlwZV9UeXBlIERBVEEKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZQotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZz1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmNvZGluZwotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kCi0gIFB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3QKLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbgotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydAotICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kCi0gIFB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24KLSAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2Rpbmc9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2RpbmcKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0Ci0gIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb24KLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQKLSAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0RW5kPXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZAotICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzUuUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uCi0gIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM1LlB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0Ci0gIFB5VW5pY29kZUl0ZXJfVHlwZT1weXRob24zNS5QeVVuaWNvZGVJdGVyX1R5cGUgREFUQQotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3QKLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uPXB5dGhvbjM1LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbgotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydD1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydAotICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRFbmQ9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kCi0gIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbj1weXRob24zNS5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24KLSAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQ9cHl0aG9uMzUuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQKLSAgUHlVbmljb2RlX0FwcGVuZD1weXRob24zNS5QeVVuaWNvZGVfQXBwZW5kCi0gIFB5VW5pY29kZV9BcHBlbmRBbmREZWw9cHl0aG9uMzUuUHlVbmljb2RlX0FwcGVuZEFuZERlbAotICBQeVVuaWNvZGVfQXNBU0NJSVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNBU0NJSVN0cmluZwotICBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmcKLSAgUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdD1weXRob24zNS5QeVVuaWNvZGVfQXNEZWNvZGVkT2JqZWN0Ci0gIFB5VW5pY29kZV9Bc0RlY29kZWRVbmljb2RlPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0RlY29kZWRVbmljb2RlCi0gIFB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3Q9cHl0aG9uMzUuUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdAotICBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcKLSAgUHlVbmljb2RlX0FzRW5jb2RlZFVuaWNvZGU9cHl0aG9uMzUuUHlVbmljb2RlX0FzRW5jb2RlZFVuaWNvZGUKLSAgUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc0xhdGluMVN0cmluZwotICBQeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nPXB5dGhvbjM1LlB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcKLSAgUHlVbmljb2RlX0FzVVRGMTZTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcKLSAgUHlVbmljb2RlX0FzVVRGMzJTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzVVRGMzJTdHJpbmcKLSAgUHlVbmljb2RlX0FzVVRGOFN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfQXNVVEY4U3RyaW5nCi0gIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZwotICBQeVVuaWNvZGVfQXNXaWRlQ2hhcj1weXRob24zNS5QeVVuaWNvZGVfQXNXaWRlQ2hhcgotICBQeVVuaWNvZGVfQ2xlYXJGcmVlbGlzdD1weXRob24zNS5QeVVuaWNvZGVfQ2xlYXJGcmVlbGlzdAotICBQeVVuaWNvZGVfQ29tcGFyZT1weXRob24zNS5QeVVuaWNvZGVfQ29tcGFyZQotICBQeVVuaWNvZGVfQ29uY2F0PXB5dGhvbjM1LlB5VW5pY29kZV9Db25jYXQKLSAgUHlVbmljb2RlX0NvbnRhaW5zPXB5dGhvbjM1LlB5VW5pY29kZV9Db250YWlucwotICBQeVVuaWNvZGVfQ291bnQ9cHl0aG9uMzUuUHlVbmljb2RlX0NvdW50Ci0gIFB5VW5pY29kZV9EZWNvZGU9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZQotICBQeVVuaWNvZGVfRGVjb2RlQVNDSUk9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUFTQ0lJCi0gIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVDaGFybWFwCi0gIFB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQ9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdAotICBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0QW5kU2l6ZQotICBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVMYXRpbjEKLSAgUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGU9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUKLSAgUHlVbmljb2RlX0RlY29kZVVURjE2PXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEYxNgotICBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bAotICBQeVVuaWNvZGVfRGVjb2RlVVRGMzI9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjMyCi0gIFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsPXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsCi0gIFB5VW5pY29kZV9EZWNvZGVVVEY4PXB5dGhvbjM1LlB5VW5pY29kZV9EZWNvZGVVVEY4Ci0gIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWw9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjhTdGF0ZWZ1bAotICBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZT1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZQotICBQeVVuaWNvZGVfRlNDb252ZXJ0ZXI9cHl0aG9uMzUuUHlVbmljb2RlX0ZTQ29udmVydGVyCi0gIFB5VW5pY29kZV9GU0RlY29kZXI9cHl0aG9uMzUuUHlVbmljb2RlX0ZTRGVjb2RlcgotICBQeVVuaWNvZGVfRmluZD1weXRob24zNS5QeVVuaWNvZGVfRmluZAotICBQeVVuaWNvZGVfRm9ybWF0PXB5dGhvbjM1LlB5VW5pY29kZV9Gb3JtYXQKLSAgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdAotICBQeVVuaWNvZGVfRnJvbUZvcm1hdD1weXRob24zNS5QeVVuaWNvZGVfRnJvbUZvcm1hdAotICBQeVVuaWNvZGVfRnJvbUZvcm1hdFY9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21Gb3JtYXRWCi0gIFB5VW5pY29kZV9Gcm9tT2JqZWN0PXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tT2JqZWN0Ci0gIFB5VW5pY29kZV9Gcm9tT3JkaW5hbD1weXRob24zNS5QeVVuaWNvZGVfRnJvbU9yZGluYWwKLSAgUHlVbmljb2RlX0Zyb21TdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0Zyb21TdHJpbmcKLSAgUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZQotICBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyPXB5dGhvbjM1LlB5VW5pY29kZV9Gcm9tV2lkZUNoYXIKLSAgUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZz1weXRob24zNS5QeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nCi0gIFB5VW5pY29kZV9HZXRTaXplPXB5dGhvbjM1LlB5VW5pY29kZV9HZXRTaXplCi0gIFB5VW5pY29kZV9Jc0lkZW50aWZpZXI9cHl0aG9uMzUuUHlVbmljb2RlX0lzSWRlbnRpZmllcgotICBQeVVuaWNvZGVfSm9pbj1weXRob24zNS5QeVVuaWNvZGVfSm9pbgotICBQeVVuaWNvZGVfUGFydGl0aW9uPXB5dGhvbjM1LlB5VW5pY29kZV9QYXJ0aXRpb24KLSAgUHlVbmljb2RlX1JQYXJ0aXRpb249cHl0aG9uMzUuUHlVbmljb2RlX1JQYXJ0aXRpb24KLSAgUHlVbmljb2RlX1JTcGxpdD1weXRob24zNS5QeVVuaWNvZGVfUlNwbGl0Ci0gIFB5VW5pY29kZV9SZXBsYWNlPXB5dGhvbjM1LlB5VW5pY29kZV9SZXBsYWNlCi0gIFB5VW5pY29kZV9SZXNpemU9cHl0aG9uMzUuUHlVbmljb2RlX1Jlc2l6ZQotICBQeVVuaWNvZGVfUmljaENvbXBhcmU9cHl0aG9uMzUuUHlVbmljb2RlX1JpY2hDb21wYXJlCi0gIFB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzUuUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZwotICBQeVVuaWNvZGVfU3BsaXQ9cHl0aG9uMzUuUHlVbmljb2RlX1NwbGl0Ci0gIFB5VW5pY29kZV9TcGxpdGxpbmVzPXB5dGhvbjM1LlB5VW5pY29kZV9TcGxpdGxpbmVzCi0gIFB5VW5pY29kZV9UYWlsbWF0Y2g9cHl0aG9uMzUuUHlVbmljb2RlX1RhaWxtYXRjaAotICBQeVVuaWNvZGVfVHJhbnNsYXRlPXB5dGhvbjM1LlB5VW5pY29kZV9UcmFuc2xhdGUKLSAgUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXA9cHl0aG9uMzUuUHlVbmljb2RlX0J1aWxkRW5jb2RpbmdNYXAKLSAgUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmc9cHl0aG9uMzUuUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcKLSAgUHlVbmljb2RlX0RlY29kZVVURjc9cHl0aG9uMzUuUHlVbmljb2RlX0RlY29kZVVURjcKLSAgUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bD1weXRob24zNS5QeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsCi0gIFB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQ9cHl0aG9uMzUuUHlVbmljb2RlX0VuY29kZUZTRGVmYXVsdAotICBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZz1weXRob24zNS5QeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZwotICBQeVVuaWNvZGVfSW50ZXJuSW1tb3J0YWw9cHl0aG9uMzUuUHlVbmljb2RlX0ludGVybkltbW9ydGFsCi0gIFB5VW5pY29kZV9JbnRlcm5JblBsYWNlPXB5dGhvbjM1LlB5VW5pY29kZV9JbnRlcm5JblBsYWNlCi0gIFB5VW5pY29kZV9UeXBlPXB5dGhvbjM1LlB5VW5pY29kZV9UeXBlIERBVEEKLSAgUHlXZWFrcmVmX0dldE9iamVjdD1weXRob24zNS5QeVdlYWtyZWZfR2V0T2JqZWN0IERBVEEKLSAgUHlXZWFrcmVmX05ld1Byb3h5PXB5dGhvbjM1LlB5V2Vha3JlZl9OZXdQcm94eQotICBQeVdlYWtyZWZfTmV3UmVmPXB5dGhvbjM1LlB5V2Vha3JlZl9OZXdSZWYKLSAgUHlXcmFwcGVyRGVzY3JfVHlwZT1weXRob24zNS5QeVdyYXBwZXJEZXNjcl9UeXBlIERBVEEKLSAgUHlXcmFwcGVyX05ldz1weXRob24zNS5QeVdyYXBwZXJfTmV3Ci0gIFB5WmlwX1R5cGU9cHl0aG9uMzUuUHlaaXBfVHlwZSBEQVRBCi0gIFB5X0FkZFBlbmRpbmdDYWxsPXB5dGhvbjM1LlB5X0FkZFBlbmRpbmdDYWxsCi0gIFB5X0F0RXhpdD1weXRob24zNS5QeV9BdEV4aXQKLSAgUHlfQnVpbGRWYWx1ZT1weXRob24zNS5QeV9CdWlsZFZhbHVlCi0gIFB5X0NvbXBpbGVTdHJpbmc9cHl0aG9uMzUuUHlfQ29tcGlsZVN0cmluZwotICBQeV9EZWNSZWY9cHl0aG9uMzUuUHlfRGVjUmVmCi0gIFB5X0VuZEludGVycHJldGVyPXB5dGhvbjM1LlB5X0VuZEludGVycHJldGVyCi0gIFB5X0V4aXQ9cHl0aG9uMzUuUHlfRXhpdAotICBQeV9GYXRhbEVycm9yPXB5dGhvbjM1LlB5X0ZhdGFsRXJyb3IKLSAgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZz1weXRob24zNS5QeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIERBVEEKLSAgUHlfRmluYWxpemU9cHl0aG9uMzUuUHlfRmluYWxpemUKLSAgUHlfR2V0QnVpbGRJbmZvPXB5dGhvbjM1LlB5X0dldEJ1aWxkSW5mbwotICBQeV9HZXRDb21waWxlcj1weXRob24zNS5QeV9HZXRDb21waWxlcgotICBQeV9HZXRDb3B5cmlnaHQ9cHl0aG9uMzUuUHlfR2V0Q29weXJpZ2h0Ci0gIFB5X0dldEV4ZWNQcmVmaXg9cHl0aG9uMzUuUHlfR2V0RXhlY1ByZWZpeAotICBQeV9HZXRQYXRoPXB5dGhvbjM1LlB5X0dldFBhdGgKLSAgUHlfR2V0UGxhdGZvcm09cHl0aG9uMzUuUHlfR2V0UGxhdGZvcm0KLSAgUHlfR2V0UHJlZml4PXB5dGhvbjM1LlB5X0dldFByZWZpeAotICBQeV9HZXRQcm9ncmFtRnVsbFBhdGg9cHl0aG9uMzUuUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoCi0gIFB5X0dldFByb2dyYW1OYW1lPXB5dGhvbjM1LlB5X0dldFByb2dyYW1OYW1lCi0gIFB5X0dldFB5dGhvbkhvbWU9cHl0aG9uMzUuUHlfR2V0UHl0aG9uSG9tZQotICBQeV9HZXRSZWN1cnNpb25MaW1pdD1weXRob24zNS5QeV9HZXRSZWN1cnNpb25MaW1pdAotICBQeV9HZXRWZXJzaW9uPXB5dGhvbjM1LlB5X0dldFZlcnNpb24KLSAgUHlfSGFzRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZz1weXRob24zNS5QeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nIERBVEEKLSAgUHlfSW5jUmVmPXB5dGhvbjM1LlB5X0luY1JlZgotICBQeV9Jbml0aWFsaXplPXB5dGhvbjM1LlB5X0luaXRpYWxpemUKLSAgUHlfSW5pdGlhbGl6ZUV4PXB5dGhvbjM1LlB5X0luaXRpYWxpemVFeAotICBQeV9Jc0luaXRpYWxpemVkPXB5dGhvbjM1LlB5X0lzSW5pdGlhbGl6ZWQKLSAgUHlfTWFpbj1weXRob24zNS5QeV9NYWluCi0gIFB5X01ha2VQZW5kaW5nQ2FsbHM9cHl0aG9uMzUuUHlfTWFrZVBlbmRpbmdDYWxscwotICBQeV9OZXdJbnRlcnByZXRlcj1weXRob24zNS5QeV9OZXdJbnRlcnByZXRlcgotICBQeV9SZXByRW50ZXI9cHl0aG9uMzUuUHlfUmVwckVudGVyCi0gIFB5X1JlcHJMZWF2ZT1weXRob24zNS5QeV9SZXByTGVhdmUKLSAgUHlfU2V0UHJvZ3JhbU5hbWU9cHl0aG9uMzUuUHlfU2V0UHJvZ3JhbU5hbWUKLSAgUHlfU2V0UHl0aG9uSG9tZT1weXRob24zNS5QeV9TZXRQeXRob25Ib21lCi0gIFB5X1NldFJlY3Vyc2lvbkxpbWl0PXB5dGhvbjM1LlB5X1NldFJlY3Vyc2lvbkxpbWl0Ci0gIFB5X1N5bXRhYmxlU3RyaW5nPXB5dGhvbjM1LlB5X1N5bXRhYmxlU3RyaW5nCi0gIFB5X1ZhQnVpbGRWYWx1ZT1weXRob24zNS5QeV9WYUJ1aWxkVmFsdWUKLSAgX1B5RXJyX0JhZEludGVybmFsQ2FsbD1weXRob24zNS5fUHlFcnJfQmFkSW50ZXJuYWxDYWxsCi0gIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQ9cHl0aG9uMzUuX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVAotICBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVD1weXRob24zNS5fUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVAotICBfUHlPYmplY3RfR0NfTWFsbG9jPXB5dGhvbjM1Ll9QeU9iamVjdF9HQ19NYWxsb2MKLSAgX1B5T2JqZWN0X0dDX05ldz1weXRob24zNS5fUHlPYmplY3RfR0NfTmV3Ci0gIF9QeU9iamVjdF9HQ19OZXdWYXI9cHl0aG9uMzUuX1B5T2JqZWN0X0dDX05ld1ZhcgotICBfUHlPYmplY3RfR0NfUmVzaXplPXB5dGhvbjM1Ll9QeU9iamVjdF9HQ19SZXNpemUKLSAgX1B5T2JqZWN0X05ldz1weXRob24zNS5fUHlPYmplY3RfTmV3Ci0gIF9QeU9iamVjdF9OZXdWYXI9cHl0aG9uMzUuX1B5T2JqZWN0X05ld1ZhcgotICBfUHlTdGF0ZV9BZGRNb2R1bGU9cHl0aG9uMzUuX1B5U3RhdGVfQWRkTW9kdWxlCi0gIF9QeVRocmVhZFN0YXRlX0luaXQ9cHl0aG9uMzUuX1B5VGhyZWFkU3RhdGVfSW5pdAotICBfUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYz1weXRob24zNS5fUHlUaHJlYWRTdGF0ZV9QcmVhbGxvYwotICBfUHlUcmFzaF9kZWxldGVfbGF0ZXI9cHl0aG9uMzUuX1B5VHJhc2hfZGVsZXRlX2xhdGVyIERBVEEKLSAgX1B5VHJhc2hfZGVsZXRlX25lc3Rpbmc9cHl0aG9uMzUuX1B5VHJhc2hfZGVsZXRlX25lc3RpbmcgREFUQQotICBfUHlUcmFzaF9kZXBvc2l0X29iamVjdD1weXRob24zNS5fUHlUcmFzaF9kZXBvc2l0X29iamVjdAotICBfUHlUcmFzaF9kZXN0cm95X2NoYWluPXB5dGhvbjM1Ll9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW4KLSAgX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZT1weXRob24zNS5fUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlIERBVEEKLSAgX1B5V2Vha3JlZl9Qcm94eVR5cGU9cHl0aG9uMzUuX1B5V2Vha3JlZl9Qcm94eVR5cGUgREFUQQotICBfUHlXZWFrcmVmX1JlZlR5cGU9cHl0aG9uMzUuX1B5V2Vha3JlZl9SZWZUeXBlIERBVEEKLSAgX1B5X0J1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzUuX1B5X0J1aWxkVmFsdWVfU2l6ZVQKLSAgX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQ9cHl0aG9uMzUuX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQgREFUQQotICBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsPXB5dGhvbjM1Ll9QeV9DaGVja1JlY3Vyc2l2ZUNhbGwKLSAgX1B5X0RlYWxsb2M9cHl0aG9uMzUuX1B5X0RlYWxsb2MKLSAgX1B5X0VsbGlwc2lzT2JqZWN0PXB5dGhvbjM1Ll9QeV9FbGxpcHNpc09iamVjdCBEQVRBCi0gIF9QeV9GYWxzZVN0cnVjdD1weXRob24zNS5fUHlfRmFsc2VTdHJ1Y3QgREFUQQotICBfUHlfTm9uZVN0cnVjdD1weXRob24zNS5fUHlfTm9uZVN0cnVjdCBEQVRBCi0gIF9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdD1weXRob24zNS5fUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3QgREFUQQotICBfUHlfU3dhcHBlZE9wPXB5dGhvbjM1Ll9QeV9Td2FwcGVkT3AgREFUQQotICBfUHlfVHJ1ZVN0cnVjdD1weXRob24zNS5fUHlfVHJ1ZVN0cnVjdCBEQVRBCi0gIF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzUuX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVAotICBfUHlBcmdfUGFyc2VfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1BhcnNlX1NpemVUCi0gIF9QeUFyZ19QYXJzZVR1cGxlX1NpemVUPXB5dGhvbjM1Ll9QeUFyZ19QYXJzZVR1cGxlX1NpemVUCi0gIF9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAotICBfUHlBcmdfVmFQYXJzZV9TaXplVD1weXRob24zNS5fUHlBcmdfVmFQYXJzZV9TaXplVAotICBfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQ9cHl0aG9uMzUuX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCi0gIF9QeV9CdWlsZFZhbHVlX1NpemVUPXB5dGhvbjM1Ll9QeV9CdWlsZFZhbHVlX1NpemVUCisgIFB5QXJnX1BhcnNlPXB5dGhvbjM2LlB5QXJnX1BhcnNlCisgIFB5QXJnX1BhcnNlVHVwbGU9cHl0aG9uMzYuUHlBcmdfUGFyc2VUdXBsZQorICBQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHM9cHl0aG9uMzYuUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzCisgIFB5QXJnX1VucGFja1R1cGxlPXB5dGhvbjM2LlB5QXJnX1VucGFja1R1cGxlCisgIFB5QXJnX1ZhUGFyc2U9cHl0aG9uMzYuUHlBcmdfVmFQYXJzZQorICBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkcz1weXRob24zNi5QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcworICBQeUFyZ19WYWxpZGF0ZUtleXdvcmRBcmd1bWVudHM9cHl0aG9uMzYuUHlBcmdfVmFsaWRhdGVLZXl3b3JkQXJndW1lbnRzCisgIFB5QmFzZU9iamVjdF9UeXBlPXB5dGhvbjM2LlB5QmFzZU9iamVjdF9UeXBlIERBVEEKKyAgUHlCb29sX0Zyb21Mb25nPXB5dGhvbjM2LlB5Qm9vbF9Gcm9tTG9uZworICBQeUJvb2xfVHlwZT1weXRob24zNi5QeUJvb2xfVHlwZSBEQVRBCisgIFB5Qnl0ZUFycmF5SXRlcl9UeXBlPXB5dGhvbjM2LlB5Qnl0ZUFycmF5SXRlcl9UeXBlIERBVEEKKyAgUHlCeXRlQXJyYXlfQXNTdHJpbmc9cHl0aG9uMzYuUHlCeXRlQXJyYXlfQXNTdHJpbmcKKyAgUHlCeXRlQXJyYXlfQ29uY2F0PXB5dGhvbjM2LlB5Qnl0ZUFycmF5X0NvbmNhdAorICBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0PXB5dGhvbjM2LlB5Qnl0ZUFycmF5X0Zyb21PYmplY3QKKyAgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemU9cHl0aG9uMzYuUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUKKyAgUHlCeXRlQXJyYXlfUmVzaXplPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X1Jlc2l6ZQorICBQeUJ5dGVBcnJheV9TaXplPXB5dGhvbjM2LlB5Qnl0ZUFycmF5X1NpemUKKyAgUHlCeXRlQXJyYXlfVHlwZT1weXRob24zNi5QeUJ5dGVBcnJheV9UeXBlIERBVEEKKyAgUHlCeXRlc0l0ZXJfVHlwZT1weXRob24zNi5QeUJ5dGVzSXRlcl9UeXBlIERBVEEKKyAgUHlCeXRlc19Bc1N0cmluZz1weXRob24zNi5QeUJ5dGVzX0FzU3RyaW5nCisgIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplPXB5dGhvbjM2LlB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplCisgIFB5Qnl0ZXNfQ29uY2F0PXB5dGhvbjM2LlB5Qnl0ZXNfQ29uY2F0CisgIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsPXB5dGhvbjM2LlB5Qnl0ZXNfQ29uY2F0QW5kRGVsCisgIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlPXB5dGhvbjM2LlB5Qnl0ZXNfRGVjb2RlRXNjYXBlCisgIFB5Qnl0ZXNfRnJvbUZvcm1hdD1weXRob24zNi5QeUJ5dGVzX0Zyb21Gb3JtYXQKKyAgUHlCeXRlc19Gcm9tRm9ybWF0Vj1weXRob24zNi5QeUJ5dGVzX0Zyb21Gb3JtYXRWCisgIFB5Qnl0ZXNfRnJvbU9iamVjdD1weXRob24zNi5QeUJ5dGVzX0Zyb21PYmplY3QKKyAgUHlCeXRlc19Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbVN0cmluZworICBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplPXB5dGhvbjM2LlB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUKKyAgUHlCeXRlc19SZXByPXB5dGhvbjM2LlB5Qnl0ZXNfUmVwcgorICBQeUJ5dGVzX1NpemU9cHl0aG9uMzYuUHlCeXRlc19TaXplCisgIFB5Qnl0ZXNfVHlwZT1weXRob24zNi5QeUJ5dGVzX1R5cGUgREFUQQorICBQeUNGdW5jdGlvbl9DYWxsPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0NhbGwKKyAgUHlDRnVuY3Rpb25fQ2xlYXJGcmVlTGlzdD1weXRob24zNi5QeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0CisgIFB5Q0Z1bmN0aW9uX0dldEZsYWdzPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0dldEZsYWdzCisgIFB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uPXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uCisgIFB5Q0Z1bmN0aW9uX0dldFNlbGY9cHl0aG9uMzYuUHlDRnVuY3Rpb25fR2V0U2VsZgorICBQeUNGdW5jdGlvbl9OZXc9cHl0aG9uMzYuUHlDRnVuY3Rpb25fTmV3CisgIFB5Q0Z1bmN0aW9uX05ld0V4PXB5dGhvbjM2LlB5Q0Z1bmN0aW9uX05ld0V4CisgIFB5Q0Z1bmN0aW9uX1R5cGU9cHl0aG9uMzYuUHlDRnVuY3Rpb25fVHlwZSBEQVRBCisgIFB5Q2FsbEl0ZXJfTmV3PXB5dGhvbjM2LlB5Q2FsbEl0ZXJfTmV3CisgIFB5Q2FsbEl0ZXJfVHlwZT1weXRob24zNi5QeUNhbGxJdGVyX1R5cGUgREFUQQorICBQeUNhbGxhYmxlX0NoZWNrPXB5dGhvbjM2LlB5Q2FsbGFibGVfQ2hlY2sKKyAgUHlDYXBzdWxlX0dldENvbnRleHQ9cHl0aG9uMzYuUHlDYXBzdWxlX0dldENvbnRleHQKKyAgUHlDYXBzdWxlX0dldERlc3RydWN0b3I9cHl0aG9uMzYuUHlDYXBzdWxlX0dldERlc3RydWN0b3IKKyAgUHlDYXBzdWxlX0dldE5hbWU9cHl0aG9uMzYuUHlDYXBzdWxlX0dldE5hbWUKKyAgUHlDYXBzdWxlX0dldFBvaW50ZXI9cHl0aG9uMzYuUHlDYXBzdWxlX0dldFBvaW50ZXIKKyAgUHlDYXBzdWxlX0ltcG9ydD1weXRob24zNi5QeUNhcHN1bGVfSW1wb3J0CisgIFB5Q2Fwc3VsZV9Jc1ZhbGlkPXB5dGhvbjM2LlB5Q2Fwc3VsZV9Jc1ZhbGlkCisgIFB5Q2Fwc3VsZV9OZXc9cHl0aG9uMzYuUHlDYXBzdWxlX05ldworICBQeUNhcHN1bGVfU2V0Q29udGV4dD1weXRob24zNi5QeUNhcHN1bGVfU2V0Q29udGV4dAorICBQeUNhcHN1bGVfU2V0RGVzdHJ1Y3Rvcj1weXRob24zNi5QeUNhcHN1bGVfU2V0RGVzdHJ1Y3RvcgorICBQeUNhcHN1bGVfU2V0TmFtZT1weXRob24zNi5QeUNhcHN1bGVfU2V0TmFtZQorICBQeUNhcHN1bGVfU2V0UG9pbnRlcj1weXRob24zNi5QeUNhcHN1bGVfU2V0UG9pbnRlcgorICBQeUNhcHN1bGVfVHlwZT1weXRob24zNi5QeUNhcHN1bGVfVHlwZSBEQVRBCisgIFB5Q2xhc3NNZXRob2REZXNjcl9UeXBlPXB5dGhvbjM2LlB5Q2xhc3NNZXRob2REZXNjcl9UeXBlIERBVEEKKyAgUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycworICBQeUNvZGVjX0RlY29kZT1weXRob24zNi5QeUNvZGVjX0RlY29kZQorICBQeUNvZGVjX0RlY29kZXI9cHl0aG9uMzYuUHlDb2RlY19EZWNvZGVyCisgIFB5Q29kZWNfRW5jb2RlPXB5dGhvbjM2LlB5Q29kZWNfRW5jb2RlCisgIFB5Q29kZWNfRW5jb2Rlcj1weXRob24zNi5QeUNvZGVjX0VuY29kZXIKKyAgUHlDb2RlY19JZ25vcmVFcnJvcnM9cHl0aG9uMzYuUHlDb2RlY19JZ25vcmVFcnJvcnMKKyAgUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXI9cHl0aG9uMzYuUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIKKyAgUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXI9cHl0aG9uMzYuUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIKKyAgUHlDb2RlY19Lbm93bkVuY29kaW5nPXB5dGhvbjM2LlB5Q29kZWNfS25vd25FbmNvZGluZworICBQeUNvZGVjX0xvb2t1cEVycm9yPXB5dGhvbjM2LlB5Q29kZWNfTG9va3VwRXJyb3IKKyAgUHlDb2RlY19SZWdpc3Rlcj1weXRob24zNi5QeUNvZGVjX1JlZ2lzdGVyCisgIFB5Q29kZWNfUmVnaXN0ZXJFcnJvcj1weXRob24zNi5QeUNvZGVjX1JlZ2lzdGVyRXJyb3IKKyAgUHlDb2RlY19SZXBsYWNlRXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfUmVwbGFjZUVycm9ycworICBQeUNvZGVjX1N0cmVhbVJlYWRlcj1weXRob24zNi5QeUNvZGVjX1N0cmVhbVJlYWRlcgorICBQeUNvZGVjX1N0cmVhbVdyaXRlcj1weXRob24zNi5QeUNvZGVjX1N0cmVhbVdyaXRlcgorICBQeUNvZGVjX1N0cmljdEVycm9ycz1weXRob24zNi5QeUNvZGVjX1N0cmljdEVycm9ycworICBQeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzPXB5dGhvbjM2LlB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnMKKyAgUHlDb21wbGV4X0Zyb21Eb3VibGVzPXB5dGhvbjM2LlB5Q29tcGxleF9Gcm9tRG91YmxlcworICBQeUNvbXBsZXhfSW1hZ0FzRG91YmxlPXB5dGhvbjM2LlB5Q29tcGxleF9JbWFnQXNEb3VibGUKKyAgUHlDb21wbGV4X1JlYWxBc0RvdWJsZT1weXRob24zNi5QeUNvbXBsZXhfUmVhbEFzRG91YmxlCisgIFB5Q29tcGxleF9UeXBlPXB5dGhvbjM2LlB5Q29tcGxleF9UeXBlIERBVEEKKyAgUHlEZXNjcl9OZXdDbGFzc01ldGhvZD1weXRob24zNi5QeURlc2NyX05ld0NsYXNzTWV0aG9kCisgIFB5RGVzY3JfTmV3R2V0U2V0PXB5dGhvbjM2LlB5RGVzY3JfTmV3R2V0U2V0CisgIFB5RGVzY3JfTmV3TWVtYmVyPXB5dGhvbjM2LlB5RGVzY3JfTmV3TWVtYmVyCisgIFB5RGVzY3JfTmV3TWV0aG9kPXB5dGhvbjM2LlB5RGVzY3JfTmV3TWV0aG9kCisgIFB5RGljdEl0ZW1zX1R5cGU9cHl0aG9uMzYuUHlEaWN0SXRlbXNfVHlwZSBEQVRBCisgIFB5RGljdEl0ZXJJdGVtX1R5cGU9cHl0aG9uMzYuUHlEaWN0SXRlckl0ZW1fVHlwZSBEQVRBCisgIFB5RGljdEl0ZXJLZXlfVHlwZT1weXRob24zNi5QeURpY3RJdGVyS2V5X1R5cGUgREFUQQorICBQeURpY3RJdGVyVmFsdWVfVHlwZT1weXRob24zNi5QeURpY3RJdGVyVmFsdWVfVHlwZSBEQVRBCisgIFB5RGljdEtleXNfVHlwZT1weXRob24zNi5QeURpY3RLZXlzX1R5cGUgREFUQQorICBQeURpY3RQcm94eV9OZXc9cHl0aG9uMzYuUHlEaWN0UHJveHlfTmV3CisgIFB5RGljdFByb3h5X1R5cGU9cHl0aG9uMzYuUHlEaWN0UHJveHlfVHlwZSBEQVRBCisgIFB5RGljdFZhbHVlc19UeXBlPXB5dGhvbjM2LlB5RGljdFZhbHVlc19UeXBlIERBVEEKKyAgUHlEaWN0X0NsZWFyPXB5dGhvbjM2LlB5RGljdF9DbGVhcgorICBQeURpY3RfQ29udGFpbnM9cHl0aG9uMzYuUHlEaWN0X0NvbnRhaW5zCisgIFB5RGljdF9Db3B5PXB5dGhvbjM2LlB5RGljdF9Db3B5CisgIFB5RGljdF9EZWxJdGVtPXB5dGhvbjM2LlB5RGljdF9EZWxJdGVtCisgIFB5RGljdF9EZWxJdGVtU3RyaW5nPXB5dGhvbjM2LlB5RGljdF9EZWxJdGVtU3RyaW5nCisgIFB5RGljdF9HZXRJdGVtPXB5dGhvbjM2LlB5RGljdF9HZXRJdGVtCisgIFB5RGljdF9HZXRJdGVtU3RyaW5nPXB5dGhvbjM2LlB5RGljdF9HZXRJdGVtU3RyaW5nCisgIFB5RGljdF9HZXRJdGVtV2l0aEVycm9yPXB5dGhvbjM2LlB5RGljdF9HZXRJdGVtV2l0aEVycm9yCisgIFB5RGljdF9JdGVtcz1weXRob24zNi5QeURpY3RfSXRlbXMKKyAgUHlEaWN0X0tleXM9cHl0aG9uMzYuUHlEaWN0X0tleXMKKyAgUHlEaWN0X01lcmdlPXB5dGhvbjM2LlB5RGljdF9NZXJnZQorICBQeURpY3RfTWVyZ2VGcm9tU2VxMj1weXRob24zNi5QeURpY3RfTWVyZ2VGcm9tU2VxMgorICBQeURpY3RfTmV3PXB5dGhvbjM2LlB5RGljdF9OZXcKKyAgUHlEaWN0X05leHQ9cHl0aG9uMzYuUHlEaWN0X05leHQKKyAgUHlEaWN0X1NldEl0ZW09cHl0aG9uMzYuUHlEaWN0X1NldEl0ZW0KKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlEaWN0X1NldEl0ZW1TdHJpbmcKKyAgUHlEaWN0X1NpemU9cHl0aG9uMzYuUHlEaWN0X1NpemUKKyAgUHlEaWN0X1R5cGU9cHl0aG9uMzYuUHlEaWN0X1R5cGUgREFUQQorICBQeURpY3RfVXBkYXRlPXB5dGhvbjM2LlB5RGljdF9VcGRhdGUKKyAgUHlEaWN0X1ZhbHVlcz1weXRob24zNi5QeURpY3RfVmFsdWVzCisgIFB5RWxsaXBzaXNfVHlwZT1weXRob24zNi5QeUVsbGlwc2lzX1R5cGUgREFUQQorICBQeUVudW1fVHlwZT1weXRob24zNi5QeUVudW1fVHlwZSBEQVRBCisgIFB5RXJyX0JhZEFyZ3VtZW50PXB5dGhvbjM2LlB5RXJyX0JhZEFyZ3VtZW50CisgIFB5RXJyX0JhZEludGVybmFsQ2FsbD1weXRob24zNi5QeUVycl9CYWRJbnRlcm5hbENhbGwKKyAgUHlFcnJfQ2hlY2tTaWduYWxzPXB5dGhvbjM2LlB5RXJyX0NoZWNrU2lnbmFscworICBQeUVycl9DbGVhcj1weXRob24zNi5QeUVycl9DbGVhcgorICBQeUVycl9EaXNwbGF5PXB5dGhvbjM2LlB5RXJyX0Rpc3BsYXkKKyAgUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcz1weXRob24zNi5QeUVycl9FeGNlcHRpb25NYXRjaGVzCisgIFB5RXJyX0ZldGNoPXB5dGhvbjM2LlB5RXJyX0ZldGNoCisgIFB5RXJyX0Zvcm1hdD1weXRob24zNi5QeUVycl9Gb3JtYXQKKyAgUHlFcnJfRm9ybWF0Vj1weXRob24zNi5QeUVycl9Gb3JtYXRWCisgIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcz1weXRob24zNi5QeUVycl9HaXZlbkV4Y2VwdGlvbk1hdGNoZXMKKyAgUHlFcnJfTmV3RXhjZXB0aW9uPXB5dGhvbjM2LlB5RXJyX05ld0V4Y2VwdGlvbgorICBQeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jPXB5dGhvbjM2LlB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2MKKyAgUHlFcnJfTm9NZW1vcnk9cHl0aG9uMzYuUHlFcnJfTm9NZW1vcnkKKyAgUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uPXB5dGhvbjM2LlB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbgorICBQeUVycl9PY2N1cnJlZD1weXRob24zNi5QeUVycl9PY2N1cnJlZAorICBQeUVycl9QcmludD1weXRob24zNi5QeUVycl9QcmludAorICBQeUVycl9QcmludEV4PXB5dGhvbjM2LlB5RXJyX1ByaW50RXgKKyAgUHlFcnJfUHJvZ3JhbVRleHQ9cHl0aG9uMzYuUHlFcnJfUHJvZ3JhbVRleHQKKyAgUHlFcnJfUmVzdG9yZT1weXRob24zNi5QeUVycl9SZXN0b3JlCisgIFB5RXJyX1NldEZyb21FcnJubz1weXRob24zNi5QeUVycl9TZXRGcm9tRXJybm8KKyAgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lPXB5dGhvbjM2LlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZQorICBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3Q9cHl0aG9uMzYuUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0CisgIFB5RXJyX1NldEludGVycnVwdD1weXRob24zNi5QeUVycl9TZXRJbnRlcnJ1cHQKKyAgUHlFcnJfU2V0Tm9uZT1weXRob24zNi5QeUVycl9TZXROb25lCisgIFB5RXJyX1NldE9iamVjdD1weXRob24zNi5QeUVycl9TZXRPYmplY3QKKyAgUHlFcnJfU2V0U3RyaW5nPXB5dGhvbjM2LlB5RXJyX1NldFN0cmluZworICBQeUVycl9TeW50YXhMb2NhdGlvbj1weXRob24zNi5QeUVycl9TeW50YXhMb2NhdGlvbgorICBQeUVycl9XYXJuRXg9cHl0aG9uMzYuUHlFcnJfV2FybkV4CisgIFB5RXJyX1dhcm5FeHBsaWNpdD1weXRob24zNi5QeUVycl9XYXJuRXhwbGljaXQKKyAgUHlFcnJfV2FybkZvcm1hdD1weXRob24zNi5QeUVycl9XYXJuRm9ybWF0CisgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZT1weXRob24zNi5QeUVycl9Xcml0ZVVucmFpc2FibGUKKyAgUHlFdmFsX0FjcXVpcmVMb2NrPXB5dGhvbjM2LlB5RXZhbF9BY3F1aXJlTG9jaworICBQeUV2YWxfQWNxdWlyZVRocmVhZD1weXRob24zNi5QeUV2YWxfQWNxdWlyZVRocmVhZAorICBQeUV2YWxfQ2FsbEZ1bmN0aW9uPXB5dGhvbjM2LlB5RXZhbF9DYWxsRnVuY3Rpb24KKyAgUHlFdmFsX0NhbGxNZXRob2Q9cHl0aG9uMzYuUHlFdmFsX0NhbGxNZXRob2QKKyAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHM9cHl0aG9uMzYuUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMKKyAgUHlFdmFsX0V2YWxDb2RlPXB5dGhvbjM2LlB5RXZhbF9FdmFsQ29kZQorICBQeUV2YWxfRXZhbENvZGVFeD1weXRob24zNi5QeUV2YWxfRXZhbENvZGVFeAorICBQeUV2YWxfRXZhbEZyYW1lPXB5dGhvbjM2LlB5RXZhbF9FdmFsRnJhbWUKKyAgUHlFdmFsX0V2YWxGcmFtZUV4PXB5dGhvbjM2LlB5RXZhbF9FdmFsRnJhbWVFeAorICBQeUV2YWxfR2V0QnVpbHRpbnM9cHl0aG9uMzYuUHlFdmFsX0dldEJ1aWx0aW5zCisgIFB5RXZhbF9HZXRDYWxsU3RhdHM9cHl0aG9uMzYuUHlFdmFsX0dldENhbGxTdGF0cworICBQeUV2YWxfR2V0RnJhbWU9cHl0aG9uMzYuUHlFdmFsX0dldEZyYW1lCisgIFB5RXZhbF9HZXRGdW5jRGVzYz1weXRob24zNi5QeUV2YWxfR2V0RnVuY0Rlc2MKKyAgUHlFdmFsX0dldEZ1bmNOYW1lPXB5dGhvbjM2LlB5RXZhbF9HZXRGdW5jTmFtZQorICBQeUV2YWxfR2V0R2xvYmFscz1weXRob24zNi5QeUV2YWxfR2V0R2xvYmFscworICBQeUV2YWxfR2V0TG9jYWxzPXB5dGhvbjM2LlB5RXZhbF9HZXRMb2NhbHMKKyAgUHlFdmFsX0luaXRUaHJlYWRzPXB5dGhvbjM2LlB5RXZhbF9Jbml0VGhyZWFkcworICBQeUV2YWxfUmVJbml0VGhyZWFkcz1weXRob24zNi5QeUV2YWxfUmVJbml0VGhyZWFkcworICBQeUV2YWxfUmVsZWFzZUxvY2s9cHl0aG9uMzYuUHlFdmFsX1JlbGVhc2VMb2NrCisgIFB5RXZhbF9SZWxlYXNlVGhyZWFkPXB5dGhvbjM2LlB5RXZhbF9SZWxlYXNlVGhyZWFkCisgIFB5RXZhbF9SZXN0b3JlVGhyZWFkPXB5dGhvbjM2LlB5RXZhbF9SZXN0b3JlVGhyZWFkCisgIFB5RXZhbF9TYXZlVGhyZWFkPXB5dGhvbjM2LlB5RXZhbF9TYXZlVGhyZWFkCisgIFB5RXZhbF9UaHJlYWRzSW5pdGlhbGl6ZWQ9cHl0aG9uMzYuUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZAorICBQeUV4Y19Bcml0aG1ldGljRXJyb3I9cHl0aG9uMzYuUHlFeGNfQXJpdGhtZXRpY0Vycm9yIERBVEEKKyAgUHlFeGNfQXNzZXJ0aW9uRXJyb3I9cHl0aG9uMzYuUHlFeGNfQXNzZXJ0aW9uRXJyb3IgREFUQQorICBQeUV4Y19BdHRyaWJ1dGVFcnJvcj1weXRob24zNi5QeUV4Y19BdHRyaWJ1dGVFcnJvciBEQVRBCisgIFB5RXhjX0Jhc2VFeGNlcHRpb249cHl0aG9uMzYuUHlFeGNfQmFzZUV4Y2VwdGlvbiBEQVRBCisgIFB5RXhjX0J1ZmZlckVycm9yPXB5dGhvbjM2LlB5RXhjX0J1ZmZlckVycm9yIERBVEEKKyAgUHlFeGNfQnl0ZXNXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX0J5dGVzV2FybmluZyBEQVRBCisgIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZz1weXRob24zNi5QeUV4Y19EZXByZWNhdGlvbldhcm5pbmcgREFUQQorICBQeUV4Y19FT0ZFcnJvcj1weXRob24zNi5QeUV4Y19FT0ZFcnJvciBEQVRBCisgIFB5RXhjX0Vudmlyb25tZW50RXJyb3I9cHl0aG9uMzYuUHlFeGNfRW52aXJvbm1lbnRFcnJvciBEQVRBCisgIFB5RXhjX0V4Y2VwdGlvbj1weXRob24zNi5QeUV4Y19FeGNlcHRpb24gREFUQQorICBQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3I9cHl0aG9uMzYuUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yIERBVEEKKyAgUHlFeGNfRnV0dXJlV2FybmluZz1weXRob24zNi5QeUV4Y19GdXR1cmVXYXJuaW5nIERBVEEKKyAgUHlFeGNfR2VuZXJhdG9yRXhpdD1weXRob24zNi5QeUV4Y19HZW5lcmF0b3JFeGl0IERBVEEKKyAgUHlFeGNfSU9FcnJvcj1weXRob24zNi5QeUV4Y19JT0Vycm9yIERBVEEKKyAgUHlFeGNfSW1wb3J0RXJyb3I9cHl0aG9uMzYuUHlFeGNfSW1wb3J0RXJyb3IgREFUQQorICBQeUV4Y19JbXBvcnRXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX0ltcG9ydFdhcm5pbmcgREFUQQorICBQeUV4Y19JbmRlbnRhdGlvbkVycm9yPXB5dGhvbjM2LlB5RXhjX0luZGVudGF0aW9uRXJyb3IgREFUQQorICBQeUV4Y19JbmRleEVycm9yPXB5dGhvbjM2LlB5RXhjX0luZGV4RXJyb3IgREFUQQorICBQeUV4Y19LZXlFcnJvcj1weXRob24zNi5QeUV4Y19LZXlFcnJvciBEQVRBCisgIFB5RXhjX0tleWJvYXJkSW50ZXJydXB0PXB5dGhvbjM2LlB5RXhjX0tleWJvYXJkSW50ZXJydXB0IERBVEEKKyAgUHlFeGNfTG9va3VwRXJyb3I9cHl0aG9uMzYuUHlFeGNfTG9va3VwRXJyb3IgREFUQQorICBQeUV4Y19NZW1vcnlFcnJvcj1weXRob24zNi5QeUV4Y19NZW1vcnlFcnJvciBEQVRBCisgIFB5RXhjX01lbW9yeUVycm9ySW5zdD1weXRob24zNi5QeUV4Y19NZW1vcnlFcnJvckluc3QgREFUQQorICBQeUV4Y19OYW1lRXJyb3I9cHl0aG9uMzYuUHlFeGNfTmFtZUVycm9yIERBVEEKKyAgUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcj1weXRob24zNi5QeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yIERBVEEKKyAgUHlFeGNfT1NFcnJvcj1weXRob24zNi5QeUV4Y19PU0Vycm9yIERBVEEKKyAgUHlFeGNfT3ZlcmZsb3dFcnJvcj1weXRob24zNi5QeUV4Y19PdmVyZmxvd0Vycm9yIERBVEEKKyAgUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZz1weXRob24zNi5QeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIERBVEEKKyAgUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0PXB5dGhvbjM2LlB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdCBEQVRBCisgIFB5RXhjX1JlZmVyZW5jZUVycm9yPXB5dGhvbjM2LlB5RXhjX1JlZmVyZW5jZUVycm9yIERBVEEKKyAgUHlFeGNfUnVudGltZUVycm9yPXB5dGhvbjM2LlB5RXhjX1J1bnRpbWVFcnJvciBEQVRBCisgIFB5RXhjX1J1bnRpbWVXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1J1bnRpbWVXYXJuaW5nIERBVEEKKyAgUHlFeGNfU3RvcEl0ZXJhdGlvbj1weXRob24zNi5QeUV4Y19TdG9wSXRlcmF0aW9uIERBVEEKKyAgUHlFeGNfU3ludGF4RXJyb3I9cHl0aG9uMzYuUHlFeGNfU3ludGF4RXJyb3IgREFUQQorICBQeUV4Y19TeW50YXhXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1N5bnRheFdhcm5pbmcgREFUQQorICBQeUV4Y19TeXN0ZW1FcnJvcj1weXRob24zNi5QeUV4Y19TeXN0ZW1FcnJvciBEQVRBCisgIFB5RXhjX1N5c3RlbUV4aXQ9cHl0aG9uMzYuUHlFeGNfU3lzdGVtRXhpdCBEQVRBCisgIFB5RXhjX1RhYkVycm9yPXB5dGhvbjM2LlB5RXhjX1RhYkVycm9yIERBVEEKKyAgUHlFeGNfVHlwZUVycm9yPXB5dGhvbjM2LlB5RXhjX1R5cGVFcnJvciBEQVRBCisgIFB5RXhjX1VuYm91bmRMb2NhbEVycm9yPXB5dGhvbjM2LlB5RXhjX1VuYm91bmRMb2NhbEVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZURlY29kZUVycm9yPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVEZWNvZGVFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvcj1weXRob24zNi5QeUV4Y19Vbmljb2RlRW5jb2RlRXJyb3IgREFUQQorICBQeUV4Y19Vbmljb2RlRXJyb3I9cHl0aG9uMzYuUHlFeGNfVW5pY29kZUVycm9yIERBVEEKKyAgUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvciBEQVRBCisgIFB5RXhjX1VuaWNvZGVXYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1VuaWNvZGVXYXJuaW5nIERBVEEKKyAgUHlFeGNfVXNlcldhcm5pbmc9cHl0aG9uMzYuUHlFeGNfVXNlcldhcm5pbmcgREFUQQorICBQeUV4Y19WYWx1ZUVycm9yPXB5dGhvbjM2LlB5RXhjX1ZhbHVlRXJyb3IgREFUQQorICBQeUV4Y19XYXJuaW5nPXB5dGhvbjM2LlB5RXhjX1dhcm5pbmcgREFUQQorICBQeUV4Y19aZXJvRGl2aXNpb25FcnJvcj1weXRob24zNi5QeUV4Y19aZXJvRGl2aXNpb25FcnJvciBEQVRBCisgIFB5RXhjZXB0aW9uX0dldENhdXNlPXB5dGhvbjM2LlB5RXhjZXB0aW9uX0dldENhdXNlCisgIFB5RXhjZXB0aW9uX0dldENvbnRleHQ9cHl0aG9uMzYuUHlFeGNlcHRpb25fR2V0Q29udGV4dAorICBQeUV4Y2VwdGlvbl9HZXRUcmFjZWJhY2s9cHl0aG9uMzYuUHlFeGNlcHRpb25fR2V0VHJhY2ViYWNrCisgIFB5RXhjZXB0aW9uX1NldENhdXNlPXB5dGhvbjM2LlB5RXhjZXB0aW9uX1NldENhdXNlCisgIFB5RXhjZXB0aW9uX1NldENvbnRleHQ9cHl0aG9uMzYuUHlFeGNlcHRpb25fU2V0Q29udGV4dAorICBQeUV4Y2VwdGlvbl9TZXRUcmFjZWJhY2s9cHl0aG9uMzYuUHlFeGNlcHRpb25fU2V0VHJhY2ViYWNrCisgIFB5RmlsZV9Gcm9tRmQ9cHl0aG9uMzYuUHlGaWxlX0Zyb21GZAorICBQeUZpbGVfR2V0TGluZT1weXRob24zNi5QeUZpbGVfR2V0TGluZQorICBQeUZpbGVfV3JpdGVPYmplY3Q9cHl0aG9uMzYuUHlGaWxlX1dyaXRlT2JqZWN0CisgIFB5RmlsZV9Xcml0ZVN0cmluZz1weXRob24zNi5QeUZpbGVfV3JpdGVTdHJpbmcKKyAgUHlGaWx0ZXJfVHlwZT1weXRob24zNi5QeUZpbHRlcl9UeXBlIERBVEEKKyAgUHlGbG9hdF9Bc0RvdWJsZT1weXRob24zNi5QeUZsb2F0X0FzRG91YmxlCisgIFB5RmxvYXRfRnJvbURvdWJsZT1weXRob24zNi5QeUZsb2F0X0Zyb21Eb3VibGUKKyAgUHlGbG9hdF9Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5RmxvYXRfRnJvbVN0cmluZworICBQeUZsb2F0X0dldEluZm89cHl0aG9uMzYuUHlGbG9hdF9HZXRJbmZvCisgIFB5RmxvYXRfR2V0TWF4PXB5dGhvbjM2LlB5RmxvYXRfR2V0TWF4CisgIFB5RmxvYXRfR2V0TWluPXB5dGhvbjM2LlB5RmxvYXRfR2V0TWluCisgIFB5RmxvYXRfVHlwZT1weXRob24zNi5QeUZsb2F0X1R5cGUgREFUQQorICBQeUZyb3plblNldF9OZXc9cHl0aG9uMzYuUHlGcm96ZW5TZXRfTmV3CisgIFB5RnJvemVuU2V0X1R5cGU9cHl0aG9uMzYuUHlGcm96ZW5TZXRfVHlwZSBEQVRBCisgIFB5R0NfQ29sbGVjdD1weXRob24zNi5QeUdDX0NvbGxlY3QKKyAgUHlHSUxTdGF0ZV9FbnN1cmU9cHl0aG9uMzYuUHlHSUxTdGF0ZV9FbnN1cmUKKyAgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGU9cHl0aG9uMzYuUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUKKyAgUHlHSUxTdGF0ZV9SZWxlYXNlPXB5dGhvbjM2LlB5R0lMU3RhdGVfUmVsZWFzZQorICBQeUdldFNldERlc2NyX1R5cGU9cHl0aG9uMzYuUHlHZXRTZXREZXNjcl9UeXBlIERBVEEKKyAgUHlJbXBvcnRfQWRkTW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X0FkZE1vZHVsZQorICBQeUltcG9ydF9BcHBlbmRJbml0dGFiPXB5dGhvbjM2LlB5SW1wb3J0X0FwcGVuZEluaXR0YWIKKyAgUHlJbXBvcnRfQ2xlYW51cD1weXRob24zNi5QeUltcG9ydF9DbGVhbnVwCisgIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlCisgIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXg9cHl0aG9uMzYuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVFeAorICBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZVdpdGhQYXRobmFtZXM9cHl0aG9uMzYuUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGVXaXRoUGF0aG5hbWVzCisgIFB5SW1wb3J0X0dldEltcG9ydGVyPXB5dGhvbjM2LlB5SW1wb3J0X0dldEltcG9ydGVyCisgIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyPXB5dGhvbjM2LlB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyCisgIFB5SW1wb3J0X0dldE1hZ2ljVGFnPXB5dGhvbjM2LlB5SW1wb3J0X0dldE1hZ2ljVGFnCisgIFB5SW1wb3J0X0dldE1vZHVsZURpY3Q9cHl0aG9uMzYuUHlJbXBvcnRfR2V0TW9kdWxlRGljdAorICBQeUltcG9ydF9JbXBvcnQ9cHl0aG9uMzYuUHlJbXBvcnRfSW1wb3J0CisgIFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZT1weXRob24zNi5QeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUKKyAgUHlJbXBvcnRfSW1wb3J0TW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydE1vZHVsZQorICBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbD1weXRob24zNi5QeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbAorICBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrPXB5dGhvbjM2LlB5SW1wb3J0X0ltcG9ydE1vZHVsZU5vQmxvY2sKKyAgUHlJbXBvcnRfUmVsb2FkTW9kdWxlPXB5dGhvbjM2LlB5SW1wb3J0X1JlbG9hZE1vZHVsZQorICBQeUludGVycHJldGVyU3RhdGVfQ2xlYXI9cHl0aG9uMzYuUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyCisgIFB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGU9cHl0aG9uMzYuUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZQorICBQeUludGVycHJldGVyU3RhdGVfTmV3PXB5dGhvbjM2LlB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcKKyAgUHlJdGVyX05leHQ9cHl0aG9uMzYuUHlJdGVyX05leHQKKyAgUHlMaXN0SXRlcl9UeXBlPXB5dGhvbjM2LlB5TGlzdEl0ZXJfVHlwZSBEQVRBCisgIFB5TGlzdFJldkl0ZXJfVHlwZT1weXRob24zNi5QeUxpc3RSZXZJdGVyX1R5cGUgREFUQQorICBQeUxpc3RfQXBwZW5kPXB5dGhvbjM2LlB5TGlzdF9BcHBlbmQKKyAgUHlMaXN0X0FzVHVwbGU9cHl0aG9uMzYuUHlMaXN0X0FzVHVwbGUKKyAgUHlMaXN0X0dldEl0ZW09cHl0aG9uMzYuUHlMaXN0X0dldEl0ZW0KKyAgUHlMaXN0X0dldFNsaWNlPXB5dGhvbjM2LlB5TGlzdF9HZXRTbGljZQorICBQeUxpc3RfSW5zZXJ0PXB5dGhvbjM2LlB5TGlzdF9JbnNlcnQKKyAgUHlMaXN0X05ldz1weXRob24zNi5QeUxpc3RfTmV3CisgIFB5TGlzdF9SZXZlcnNlPXB5dGhvbjM2LlB5TGlzdF9SZXZlcnNlCisgIFB5TGlzdF9TZXRJdGVtPXB5dGhvbjM2LlB5TGlzdF9TZXRJdGVtCisgIFB5TGlzdF9TZXRTbGljZT1weXRob24zNi5QeUxpc3RfU2V0U2xpY2UKKyAgUHlMaXN0X1NpemU9cHl0aG9uMzYuUHlMaXN0X1NpemUKKyAgUHlMaXN0X1NvcnQ9cHl0aG9uMzYuUHlMaXN0X1NvcnQKKyAgUHlMaXN0X1R5cGU9cHl0aG9uMzYuUHlMaXN0X1R5cGUgREFUQQorICBQeUxvbmdSYW5nZUl0ZXJfVHlwZT1weXRob24zNi5QeUxvbmdSYW5nZUl0ZXJfVHlwZSBEQVRBCisgIFB5TG9uZ19Bc0RvdWJsZT1weXRob24zNi5QeUxvbmdfQXNEb3VibGUKKyAgUHlMb25nX0FzTG9uZz1weXRob24zNi5QeUxvbmdfQXNMb25nCisgIFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdz1weXRob24zNi5QeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3cKKyAgUHlMb25nX0FzTG9uZ0xvbmc9cHl0aG9uMzYuUHlMb25nX0FzTG9uZ0xvbmcKKyAgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdz1weXRob24zNi5QeUxvbmdfQXNMb25nTG9uZ0FuZE92ZXJmbG93CisgIFB5TG9uZ19Bc1NpemVfdD1weXRob24zNi5QeUxvbmdfQXNTaXplX3QKKyAgUHlMb25nX0FzU3NpemVfdD1weXRob24zNi5QeUxvbmdfQXNTc2l6ZV90CisgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZz1weXRob24zNi5QeUxvbmdfQXNVbnNpZ25lZExvbmcKKyAgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZz1weXRob24zNi5QeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nCisgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrPXB5dGhvbjM2LlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrCisgIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2s9cHl0aG9uMzYuUHlMb25nX0FzVW5zaWduZWRMb25nTWFzaworICBQeUxvbmdfQXNWb2lkUHRyPXB5dGhvbjM2LlB5TG9uZ19Bc1ZvaWRQdHIKKyAgUHlMb25nX0Zyb21Eb3VibGU9cHl0aG9uMzYuUHlMb25nX0Zyb21Eb3VibGUKKyAgUHlMb25nX0Zyb21Mb25nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tTG9uZworICBQeUxvbmdfRnJvbUxvbmdMb25nPXB5dGhvbjM2LlB5TG9uZ19Gcm9tTG9uZ0xvbmcKKyAgUHlMb25nX0Zyb21TaXplX3Q9cHl0aG9uMzYuUHlMb25nX0Zyb21TaXplX3QKKyAgUHlMb25nX0Zyb21Tc2l6ZV90PXB5dGhvbjM2LlB5TG9uZ19Gcm9tU3NpemVfdAorICBQeUxvbmdfRnJvbVN0cmluZz1weXRob24zNi5QeUxvbmdfRnJvbVN0cmluZworICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZz1weXRob24zNi5QeUxvbmdfRnJvbVVuc2lnbmVkTG9uZworICBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmc9cHl0aG9uMzYuUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nCisgIFB5TG9uZ19Gcm9tVm9pZFB0cj1weXRob24zNi5QeUxvbmdfRnJvbVZvaWRQdHIKKyAgUHlMb25nX0dldEluZm89cHl0aG9uMzYuUHlMb25nX0dldEluZm8KKyAgUHlMb25nX1R5cGU9cHl0aG9uMzYuUHlMb25nX1R5cGUgREFUQQorICBQeU1hcF9UeXBlPXB5dGhvbjM2LlB5TWFwX1R5cGUgREFUQQorICBQeU1hcHBpbmdfQ2hlY2s9cHl0aG9uMzYuUHlNYXBwaW5nX0NoZWNrCisgIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nPXB5dGhvbjM2LlB5TWFwcGluZ19HZXRJdGVtU3RyaW5nCisgIFB5TWFwcGluZ19IYXNLZXk9cHl0aG9uMzYuUHlNYXBwaW5nX0hhc0tleQorICBQeU1hcHBpbmdfSGFzS2V5U3RyaW5nPXB5dGhvbjM2LlB5TWFwcGluZ19IYXNLZXlTdHJpbmcKKyAgUHlNYXBwaW5nX0l0ZW1zPXB5dGhvbjM2LlB5TWFwcGluZ19JdGVtcworICBQeU1hcHBpbmdfS2V5cz1weXRob24zNi5QeU1hcHBpbmdfS2V5cworICBQeU1hcHBpbmdfTGVuZ3RoPXB5dGhvbjM2LlB5TWFwcGluZ19MZW5ndGgKKyAgUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmc9cHl0aG9uMzYuUHlNYXBwaW5nX1NldEl0ZW1TdHJpbmcKKyAgUHlNYXBwaW5nX1NpemU9cHl0aG9uMzYuUHlNYXBwaW5nX1NpemUKKyAgUHlNYXBwaW5nX1ZhbHVlcz1weXRob24zNi5QeU1hcHBpbmdfVmFsdWVzCisgIFB5TWVtX0ZyZWU9cHl0aG9uMzYuUHlNZW1fRnJlZQorICBQeU1lbV9NYWxsb2M9cHl0aG9uMzYuUHlNZW1fTWFsbG9jCisgIFB5TWVtX1JlYWxsb2M9cHl0aG9uMzYuUHlNZW1fUmVhbGxvYworICBQeU1lbWJlckRlc2NyX1R5cGU9cHl0aG9uMzYuUHlNZW1iZXJEZXNjcl9UeXBlIERBVEEKKyAgUHlNZW1vcnlWaWV3X0Zyb21PYmplY3Q9cHl0aG9uMzYuUHlNZW1vcnlWaWV3X0Zyb21PYmplY3QKKyAgUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXM9cHl0aG9uMzYuUHlNZW1vcnlWaWV3X0dldENvbnRpZ3VvdXMKKyAgUHlNZW1vcnlWaWV3X1R5cGU9cHl0aG9uMzYuUHlNZW1vcnlWaWV3X1R5cGUgREFUQQorICBQeU1ldGhvZERlc2NyX1R5cGU9cHl0aG9uMzYuUHlNZXRob2REZXNjcl9UeXBlIERBVEEKKyAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQ9cHl0aG9uMzYuUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQKKyAgUHlNb2R1bGVfQWRkT2JqZWN0PXB5dGhvbjM2LlB5TW9kdWxlX0FkZE9iamVjdAorICBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudD1weXRob24zNi5QeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudAorICBQeU1vZHVsZV9DcmVhdGUyPXB5dGhvbjM2LlB5TW9kdWxlX0NyZWF0ZTIKKyAgUHlNb2R1bGVfR2V0RGVmPXB5dGhvbjM2LlB5TW9kdWxlX0dldERlZgorICBQeU1vZHVsZV9HZXREaWN0PXB5dGhvbjM2LlB5TW9kdWxlX0dldERpY3QKKyAgUHlNb2R1bGVfR2V0RmlsZW5hbWU9cHl0aG9uMzYuUHlNb2R1bGVfR2V0RmlsZW5hbWUKKyAgUHlNb2R1bGVfR2V0RmlsZW5hbWVPYmplY3Q9cHl0aG9uMzYuUHlNb2R1bGVfR2V0RmlsZW5hbWVPYmplY3QKKyAgUHlNb2R1bGVfR2V0TmFtZT1weXRob24zNi5QeU1vZHVsZV9HZXROYW1lCisgIFB5TW9kdWxlX0dldFN0YXRlPXB5dGhvbjM2LlB5TW9kdWxlX0dldFN0YXRlCisgIFB5TW9kdWxlX05ldz1weXRob24zNi5QeU1vZHVsZV9OZXcKKyAgUHlNb2R1bGVfVHlwZT1weXRob24zNi5QeU1vZHVsZV9UeXBlIERBVEEKKyAgUHlNb2R1bGVEZWZfSW5pdD1weXRob24zNi5QeU1vZHVsZURlZl9Jbml0CisgIFB5TW9kdWxlRGVmX1R5cGU9cHl0aG9uMzYuUHlNb2R1bGVEZWZfVHlwZSBEQVRBCisgIFB5TnVsbEltcG9ydGVyX1R5cGU9cHl0aG9uMzYuUHlOdWxsSW1wb3J0ZXJfVHlwZSBEQVRBCisgIFB5TnVtYmVyX0Fic29sdXRlPXB5dGhvbjM2LlB5TnVtYmVyX0Fic29sdXRlCisgIFB5TnVtYmVyX0FkZD1weXRob24zNi5QeU51bWJlcl9BZGQKKyAgUHlOdW1iZXJfQW5kPXB5dGhvbjM2LlB5TnVtYmVyX0FuZAorICBQeU51bWJlcl9Bc1NzaXplX3Q9cHl0aG9uMzYuUHlOdW1iZXJfQXNTc2l6ZV90CisgIFB5TnVtYmVyX0NoZWNrPXB5dGhvbjM2LlB5TnVtYmVyX0NoZWNrCisgIFB5TnVtYmVyX0Rpdm1vZD1weXRob24zNi5QeU51bWJlcl9EaXZtb2QKKyAgUHlOdW1iZXJfRmxvYXQ9cHl0aG9uMzYuUHlOdW1iZXJfRmxvYXQKKyAgUHlOdW1iZXJfRmxvb3JEaXZpZGU9cHl0aG9uMzYuUHlOdW1iZXJfRmxvb3JEaXZpZGUKKyAgUHlOdW1iZXJfSW5QbGFjZUFkZD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlQWRkCisgIFB5TnVtYmVyX0luUGxhY2VBbmQ9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZUFuZAorICBQeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGU9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlCisgIFB5TnVtYmVyX0luUGxhY2VMc2hpZnQ9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZUxzaGlmdAorICBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHk9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZU11bHRpcGx5CisgIFB5TnVtYmVyX0luUGxhY2VPcj1weXRob24zNi5QeU51bWJlcl9JblBsYWNlT3IKKyAgUHlOdW1iZXJfSW5QbGFjZVBvd2VyPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VQb3dlcgorICBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyPXB5dGhvbjM2LlB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIKKyAgUHlOdW1iZXJfSW5QbGFjZVJzaGlmdD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlUnNoaWZ0CisgIFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdD1weXRob24zNi5QeU51bWJlcl9JblBsYWNlU3VidHJhY3QKKyAgUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGU9cHl0aG9uMzYuUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGUKKyAgUHlOdW1iZXJfSW5QbGFjZVhvcj1weXRob24zNi5QeU51bWJlcl9JblBsYWNlWG9yCisgIFB5TnVtYmVyX0luZGV4PXB5dGhvbjM2LlB5TnVtYmVyX0luZGV4CisgIFB5TnVtYmVyX0ludmVydD1weXRob24zNi5QeU51bWJlcl9JbnZlcnQKKyAgUHlOdW1iZXJfTG9uZz1weXRob24zNi5QeU51bWJlcl9Mb25nCisgIFB5TnVtYmVyX0xzaGlmdD1weXRob24zNi5QeU51bWJlcl9Mc2hpZnQKKyAgUHlOdW1iZXJfTXVsdGlwbHk9cHl0aG9uMzYuUHlOdW1iZXJfTXVsdGlwbHkKKyAgUHlOdW1iZXJfTmVnYXRpdmU9cHl0aG9uMzYuUHlOdW1iZXJfTmVnYXRpdmUKKyAgUHlOdW1iZXJfT3I9cHl0aG9uMzYuUHlOdW1iZXJfT3IKKyAgUHlOdW1iZXJfUG9zaXRpdmU9cHl0aG9uMzYuUHlOdW1iZXJfUG9zaXRpdmUKKyAgUHlOdW1iZXJfUG93ZXI9cHl0aG9uMzYuUHlOdW1iZXJfUG93ZXIKKyAgUHlOdW1iZXJfUmVtYWluZGVyPXB5dGhvbjM2LlB5TnVtYmVyX1JlbWFpbmRlcgorICBQeU51bWJlcl9Sc2hpZnQ9cHl0aG9uMzYuUHlOdW1iZXJfUnNoaWZ0CisgIFB5TnVtYmVyX1N1YnRyYWN0PXB5dGhvbjM2LlB5TnVtYmVyX1N1YnRyYWN0CisgIFB5TnVtYmVyX1RvQmFzZT1weXRob24zNi5QeU51bWJlcl9Ub0Jhc2UKKyAgUHlOdW1iZXJfVHJ1ZURpdmlkZT1weXRob24zNi5QeU51bWJlcl9UcnVlRGl2aWRlCisgIFB5TnVtYmVyX1hvcj1weXRob24zNi5QeU51bWJlcl9Yb3IKKyAgUHlPU19BZnRlckZvcms9cHl0aG9uMzYuUHlPU19BZnRlckZvcmsKKyAgUHlPU19Jbml0SW50ZXJydXB0cz1weXRob24zNi5QeU9TX0luaXRJbnRlcnJ1cHRzCisgIFB5T1NfSW5wdXRIb29rPXB5dGhvbjM2LlB5T1NfSW5wdXRIb29rIERBVEEKKyAgUHlPU19JbnRlcnJ1cHRPY2N1cnJlZD1weXRob24zNi5QeU9TX0ludGVycnVwdE9jY3VycmVkCisgIFB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXI9cHl0aG9uMzYuUHlPU19SZWFkbGluZUZ1bmN0aW9uUG9pbnRlciBEQVRBCisgIFB5T1NfZG91YmxlX3RvX3N0cmluZz1weXRob24zNi5QeU9TX2RvdWJsZV90b19zdHJpbmcKKyAgUHlPU19nZXRzaWc9cHl0aG9uMzYuUHlPU19nZXRzaWcKKyAgUHlPU19teXN0cmljbXA9cHl0aG9uMzYuUHlPU19teXN0cmljbXAKKyAgUHlPU19teXN0cm5pY21wPXB5dGhvbjM2LlB5T1NfbXlzdHJuaWNtcAorICBQeU9TX3NldHNpZz1weXRob24zNi5QeU9TX3NldHNpZworICBQeU9TX3NucHJpbnRmPXB5dGhvbjM2LlB5T1Nfc25wcmludGYKKyAgUHlPU19zdHJpbmdfdG9fZG91YmxlPXB5dGhvbjM2LlB5T1Nfc3RyaW5nX3RvX2RvdWJsZQorICBQeU9TX3N0cnRvbD1weXRob24zNi5QeU9TX3N0cnRvbAorICBQeU9TX3N0cnRvdWw9cHl0aG9uMzYuUHlPU19zdHJ0b3VsCisgIFB5T1NfdnNucHJpbnRmPXB5dGhvbjM2LlB5T1NfdnNucHJpbnRmCisgIFB5T2JqZWN0X0FTQ0lJPXB5dGhvbjM2LlB5T2JqZWN0X0FTQ0lJCisgIFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcj1weXRob24zNi5QeU9iamVjdF9Bc0NoYXJCdWZmZXIKKyAgUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcj1weXRob24zNi5QeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yCisgIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcj1weXRob24zNi5QeU9iamVjdF9Bc1JlYWRCdWZmZXIKKyAgUHlPYmplY3RfQXNXcml0ZUJ1ZmZlcj1weXRob24zNi5QeU9iamVjdF9Bc1dyaXRlQnVmZmVyCisgIFB5T2JqZWN0X0J5dGVzPXB5dGhvbjM2LlB5T2JqZWN0X0J5dGVzCisgIFB5T2JqZWN0X0NhbGw9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbAorICBQeU9iamVjdF9DYWxsRnVuY3Rpb249cHl0aG9uMzYuUHlPYmplY3RfQ2FsbEZ1bmN0aW9uCisgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3M9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncworICBQeU9iamVjdF9DYWxsTWV0aG9kPXB5dGhvbjM2LlB5T2JqZWN0X0NhbGxNZXRob2QKKyAgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3M9cHl0aG9uMzYuUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MKKyAgUHlPYmplY3RfQ2FsbE9iamVjdD1weXRob24zNi5QeU9iamVjdF9DYWxsT2JqZWN0CisgIFB5T2JqZWN0X0NoZWNrUmVhZEJ1ZmZlcj1weXRob24zNi5QeU9iamVjdF9DaGVja1JlYWRCdWZmZXIKKyAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcz1weXRob24zNi5QeU9iamVjdF9DbGVhcldlYWtSZWZzCisgIFB5T2JqZWN0X0RlbEl0ZW09cHl0aG9uMzYuUHlPYmplY3RfRGVsSXRlbQorICBQeU9iamVjdF9EZWxJdGVtU3RyaW5nPXB5dGhvbjM2LlB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcKKyAgUHlPYmplY3RfRGlyPXB5dGhvbjM2LlB5T2JqZWN0X0RpcgorICBQeU9iamVjdF9Gb3JtYXQ9cHl0aG9uMzYuUHlPYmplY3RfRm9ybWF0CisgIFB5T2JqZWN0X0ZyZWU9cHl0aG9uMzYuUHlPYmplY3RfRnJlZQorICBQeU9iamVjdF9HQ19EZWw9cHl0aG9uMzYuUHlPYmplY3RfR0NfRGVsCisgIFB5T2JqZWN0X0dDX1RyYWNrPXB5dGhvbjM2LlB5T2JqZWN0X0dDX1RyYWNrCisgIFB5T2JqZWN0X0dDX1VuVHJhY2s9cHl0aG9uMzYuUHlPYmplY3RfR0NfVW5UcmFjaworICBQeU9iamVjdF9HZW5lcmljR2V0QXR0cj1weXRob24zNi5QeU9iamVjdF9HZW5lcmljR2V0QXR0cgorICBQeU9iamVjdF9HZW5lcmljU2V0QXR0cj1weXRob24zNi5QeU9iamVjdF9HZW5lcmljU2V0QXR0cgorICBQeU9iamVjdF9HZXRBdHRyPXB5dGhvbjM2LlB5T2JqZWN0X0dldEF0dHIKKyAgUHlPYmplY3RfR2V0QXR0clN0cmluZz1weXRob24zNi5QeU9iamVjdF9HZXRBdHRyU3RyaW5nCisgIFB5T2JqZWN0X0dldEl0ZW09cHl0aG9uMzYuUHlPYmplY3RfR2V0SXRlbQorICBQeU9iamVjdF9HZXRJdGVyPXB5dGhvbjM2LlB5T2JqZWN0X0dldEl0ZXIKKyAgUHlPYmplY3RfSGFzQXR0cj1weXRob24zNi5QeU9iamVjdF9IYXNBdHRyCisgIFB5T2JqZWN0X0hhc0F0dHJTdHJpbmc9cHl0aG9uMzYuUHlPYmplY3RfSGFzQXR0clN0cmluZworICBQeU9iamVjdF9IYXNoPXB5dGhvbjM2LlB5T2JqZWN0X0hhc2gKKyAgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkPXB5dGhvbjM2LlB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZAorICBQeU9iamVjdF9Jbml0PXB5dGhvbjM2LlB5T2JqZWN0X0luaXQKKyAgUHlPYmplY3RfSW5pdFZhcj1weXRob24zNi5QeU9iamVjdF9Jbml0VmFyCisgIFB5T2JqZWN0X0lzSW5zdGFuY2U9cHl0aG9uMzYuUHlPYmplY3RfSXNJbnN0YW5jZQorICBQeU9iamVjdF9Jc1N1YmNsYXNzPXB5dGhvbjM2LlB5T2JqZWN0X0lzU3ViY2xhc3MKKyAgUHlPYmplY3RfSXNUcnVlPXB5dGhvbjM2LlB5T2JqZWN0X0lzVHJ1ZQorICBQeU9iamVjdF9MZW5ndGg9cHl0aG9uMzYuUHlPYmplY3RfTGVuZ3RoCisgIFB5T2JqZWN0X01hbGxvYz1weXRob24zNi5QeU9iamVjdF9NYWxsb2MKKyAgUHlPYmplY3RfTm90PXB5dGhvbjM2LlB5T2JqZWN0X05vdAorICBQeU9iamVjdF9SZWFsbG9jPXB5dGhvbjM2LlB5T2JqZWN0X1JlYWxsb2MKKyAgUHlPYmplY3RfUmVwcj1weXRob24zNi5QeU9iamVjdF9SZXByCisgIFB5T2JqZWN0X1JpY2hDb21wYXJlPXB5dGhvbjM2LlB5T2JqZWN0X1JpY2hDb21wYXJlCisgIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbD1weXRob24zNi5QeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wKKyAgUHlPYmplY3RfU2VsZkl0ZXI9cHl0aG9uMzYuUHlPYmplY3RfU2VsZkl0ZXIKKyAgUHlPYmplY3RfU2V0QXR0cj1weXRob24zNi5QeU9iamVjdF9TZXRBdHRyCisgIFB5T2JqZWN0X1NldEF0dHJTdHJpbmc9cHl0aG9uMzYuUHlPYmplY3RfU2V0QXR0clN0cmluZworICBQeU9iamVjdF9TZXRJdGVtPXB5dGhvbjM2LlB5T2JqZWN0X1NldEl0ZW0KKyAgUHlPYmplY3RfU2l6ZT1weXRob24zNi5QeU9iamVjdF9TaXplCisgIFB5T2JqZWN0X1N0cj1weXRob24zNi5QeU9iamVjdF9TdHIKKyAgUHlPYmplY3RfVHlwZT1weXRob24zNi5QeU9iamVjdF9UeXBlIERBVEEKKyAgUHlPRGljdF9EZWxJdGVtPXB5dGhvbjM2LlB5T0RpY3RfRGVsSXRlbQorICBQeU9EaWN0X05ldz1weXRob24zNi5QeU9EaWN0X05ldworICBQeU9EaWN0X1NldEl0ZW09cHl0aG9uMzYuUHlPRGljdF9TZXRJdGVtCisgIFB5T0RpY3RfVHlwZT1weXRob24zNi5QeU9EaWN0X1R5cGUgREFUQQorICBQeU9EaWN0SXRlbXNfVHlwZT1weXRob24zNi5QeU9EaWN0SXRlbXNfVHlwZSBEQVRBCisgIFB5T0RpY3RJdGVyX1R5cGU9cHl0aG9uMzYuUHlPRGljdEl0ZXJfVHlwZSBEQVRBCisgIFB5T0RpY3RLZXlzX1R5cGU9cHl0aG9uMzYuUHlPRGljdEtleXNfVHlwZSBEQVRBCisgIFB5T0RpY3RWYWx1ZXNfVHlwZT1weXRob24zNi5QeU9EaWN0VmFsdWVzX1R5cGUgREFUQQorICBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncz1weXRob24zNi5QeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncworICBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzPXB5dGhvbjM2LlB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MKKyAgUHlQcm9wZXJ0eV9UeXBlPXB5dGhvbjM2LlB5UHJvcGVydHlfVHlwZSBEQVRBCisgIFB5UmFuZ2VJdGVyX1R5cGU9cHl0aG9uMzYuUHlSYW5nZUl0ZXJfVHlwZSBEQVRBCisgIFB5UmFuZ2VfVHlwZT1weXRob24zNi5QeVJhbmdlX1R5cGUgREFUQQorICBQeVJldmVyc2VkX1R5cGU9cHl0aG9uMzYuUHlSZXZlcnNlZF9UeXBlIERBVEEKKyAgUHlTZXFJdGVyX05ldz1weXRob24zNi5QeVNlcUl0ZXJfTmV3CisgIFB5U2VxSXRlcl9UeXBlPXB5dGhvbjM2LlB5U2VxSXRlcl9UeXBlIERBVEEKKyAgUHlTZXF1ZW5jZV9DaGVjaz1weXRob24zNi5QeVNlcXVlbmNlX0NoZWNrCisgIFB5U2VxdWVuY2VfQ29uY2F0PXB5dGhvbjM2LlB5U2VxdWVuY2VfQ29uY2F0CisgIFB5U2VxdWVuY2VfQ29udGFpbnM9cHl0aG9uMzYuUHlTZXF1ZW5jZV9Db250YWlucworICBQeVNlcXVlbmNlX0NvdW50PXB5dGhvbjM2LlB5U2VxdWVuY2VfQ291bnQKKyAgUHlTZXF1ZW5jZV9EZWxJdGVtPXB5dGhvbjM2LlB5U2VxdWVuY2VfRGVsSXRlbQorICBQeVNlcXVlbmNlX0RlbFNsaWNlPXB5dGhvbjM2LlB5U2VxdWVuY2VfRGVsU2xpY2UKKyAgUHlTZXF1ZW5jZV9GYXN0PXB5dGhvbjM2LlB5U2VxdWVuY2VfRmFzdAorICBQeVNlcXVlbmNlX0dldEl0ZW09cHl0aG9uMzYuUHlTZXF1ZW5jZV9HZXRJdGVtCisgIFB5U2VxdWVuY2VfR2V0U2xpY2U9cHl0aG9uMzYuUHlTZXF1ZW5jZV9HZXRTbGljZQorICBQeVNlcXVlbmNlX0luPXB5dGhvbjM2LlB5U2VxdWVuY2VfSW4KKyAgUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0PXB5dGhvbjM2LlB5U2VxdWVuY2VfSW5QbGFjZUNvbmNhdAorICBQeVNlcXVlbmNlX0luUGxhY2VSZXBlYXQ9cHl0aG9uMzYuUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0CisgIFB5U2VxdWVuY2VfSW5kZXg9cHl0aG9uMzYuUHlTZXF1ZW5jZV9JbmRleAorICBQeVNlcXVlbmNlX0xlbmd0aD1weXRob24zNi5QeVNlcXVlbmNlX0xlbmd0aAorICBQeVNlcXVlbmNlX0xpc3Q9cHl0aG9uMzYuUHlTZXF1ZW5jZV9MaXN0CisgIFB5U2VxdWVuY2VfUmVwZWF0PXB5dGhvbjM2LlB5U2VxdWVuY2VfUmVwZWF0CisgIFB5U2VxdWVuY2VfU2V0SXRlbT1weXRob24zNi5QeVNlcXVlbmNlX1NldEl0ZW0KKyAgUHlTZXF1ZW5jZV9TZXRTbGljZT1weXRob24zNi5QeVNlcXVlbmNlX1NldFNsaWNlCisgIFB5U2VxdWVuY2VfU2l6ZT1weXRob24zNi5QeVNlcXVlbmNlX1NpemUKKyAgUHlTZXF1ZW5jZV9UdXBsZT1weXRob24zNi5QeVNlcXVlbmNlX1R1cGxlCisgIFB5U2V0SXRlcl9UeXBlPXB5dGhvbjM2LlB5U2V0SXRlcl9UeXBlIERBVEEKKyAgUHlTZXRfQWRkPXB5dGhvbjM2LlB5U2V0X0FkZAorICBQeVNldF9DbGVhcj1weXRob24zNi5QeVNldF9DbGVhcgorICBQeVNldF9Db250YWlucz1weXRob24zNi5QeVNldF9Db250YWlucworICBQeVNldF9EaXNjYXJkPXB5dGhvbjM2LlB5U2V0X0Rpc2NhcmQKKyAgUHlTZXRfTmV3PXB5dGhvbjM2LlB5U2V0X05ldworICBQeVNldF9Qb3A9cHl0aG9uMzYuUHlTZXRfUG9wCisgIFB5U2V0X1NpemU9cHl0aG9uMzYuUHlTZXRfU2l6ZQorICBQeVNldF9UeXBlPXB5dGhvbjM2LlB5U2V0X1R5cGUgREFUQQorICBQeVNsaWNlX0dldEluZGljZXM9cHl0aG9uMzYuUHlTbGljZV9HZXRJbmRpY2VzCisgIFB5U2xpY2VfR2V0SW5kaWNlc0V4PXB5dGhvbjM2LlB5U2xpY2VfR2V0SW5kaWNlc0V4CisgIFB5U2xpY2VfTmV3PXB5dGhvbjM2LlB5U2xpY2VfTmV3CisgIFB5U2xpY2VfVHlwZT1weXRob24zNi5QeVNsaWNlX1R5cGUgREFUQQorICBQeVNvcnRXcmFwcGVyX1R5cGU9cHl0aG9uMzYuUHlTb3J0V3JhcHBlcl9UeXBlIERBVEEKKyAgUHlTdGF0ZV9GaW5kTW9kdWxlPXB5dGhvbjM2LlB5U3RhdGVfRmluZE1vZHVsZQorICBQeVN0YXRlX0FkZE1vZHVsZT1weXRob24zNi5QeVN0YXRlX0FkZE1vZHVsZQorICBQeVN0YXRlX1JlbW92ZU1vZHVsZT1weXRob24zNi5QeVN0YXRlX1JlbW92ZU1vZHVsZQorICBQeVN0cnVjdFNlcXVlbmNlX0dldEl0ZW09cHl0aG9uMzYuUHlTdHJ1Y3RTZXF1ZW5jZV9HZXRJdGVtCisgIFB5U3RydWN0U2VxdWVuY2VfTmV3PXB5dGhvbjM2LlB5U3RydWN0U2VxdWVuY2VfTmV3CisgIFB5U3RydWN0U2VxdWVuY2VfTmV3VHlwZT1weXRob24zNi5QeVN0cnVjdFNlcXVlbmNlX05ld1R5cGUKKyAgUHlTdHJ1Y3RTZXF1ZW5jZV9TZXRJdGVtPXB5dGhvbjM2LlB5U3RydWN0U2VxdWVuY2VfU2V0SXRlbQorICBQeVN1cGVyX1R5cGU9cHl0aG9uMzYuUHlTdXBlcl9UeXBlIERBVEEKKyAgUHlTeXNfQWRkV2Fybk9wdGlvbj1weXRob24zNi5QeVN5c19BZGRXYXJuT3B0aW9uCisgIFB5U3lzX0FkZFdhcm5PcHRpb25Vbmljb2RlPXB5dGhvbjM2LlB5U3lzX0FkZFdhcm5PcHRpb25Vbmljb2RlCisgIFB5U3lzX0Zvcm1hdFN0ZGVycj1weXRob24zNi5QeVN5c19Gb3JtYXRTdGRlcnIKKyAgUHlTeXNfRm9ybWF0U3Rkb3V0PXB5dGhvbjM2LlB5U3lzX0Zvcm1hdFN0ZG91dAorICBQeVN5c19HZXRPYmplY3Q9cHl0aG9uMzYuUHlTeXNfR2V0T2JqZWN0CisgIFB5U3lzX0hhc1dhcm5PcHRpb25zPXB5dGhvbjM2LlB5U3lzX0hhc1dhcm5PcHRpb25zCisgIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnM9cHl0aG9uMzYuUHlTeXNfUmVzZXRXYXJuT3B0aW9ucworICBQeVN5c19TZXRBcmd2PXB5dGhvbjM2LlB5U3lzX1NldEFyZ3YKKyAgUHlTeXNfU2V0QXJndkV4PXB5dGhvbjM2LlB5U3lzX1NldEFyZ3ZFeAorICBQeVN5c19TZXRPYmplY3Q9cHl0aG9uMzYuUHlTeXNfU2V0T2JqZWN0CisgIFB5U3lzX1NldFBhdGg9cHl0aG9uMzYuUHlTeXNfU2V0UGF0aAorICBQeVN5c19Xcml0ZVN0ZGVycj1weXRob24zNi5QeVN5c19Xcml0ZVN0ZGVycgorICBQeVN5c19Xcml0ZVN0ZG91dD1weXRob24zNi5QeVN5c19Xcml0ZVN0ZG91dAorICBQeVRocmVhZFN0YXRlX0NsZWFyPXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfQ2xlYXIKKyAgUHlUaHJlYWRTdGF0ZV9EZWxldGU9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9EZWxldGUKKyAgUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50PXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfRGVsZXRlQ3VycmVudAorICBQeVRocmVhZFN0YXRlX0dldD1weXRob24zNi5QeVRocmVhZFN0YXRlX0dldAorICBQeVRocmVhZFN0YXRlX0dldERpY3Q9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9HZXREaWN0CisgIFB5VGhyZWFkU3RhdGVfTmV3PXB5dGhvbjM2LlB5VGhyZWFkU3RhdGVfTmV3CisgIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGM9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4YworICBQeVRocmVhZFN0YXRlX1N3YXA9cHl0aG9uMzYuUHlUaHJlYWRTdGF0ZV9Td2FwCisgIFB5VHJhY2VCYWNrX0hlcmU9cHl0aG9uMzYuUHlUcmFjZUJhY2tfSGVyZQorICBQeVRyYWNlQmFja19QcmludD1weXRob24zNi5QeVRyYWNlQmFja19QcmludAorICBQeVRyYWNlQmFja19UeXBlPXB5dGhvbjM2LlB5VHJhY2VCYWNrX1R5cGUgREFUQQorICBQeVR1cGxlSXRlcl9UeXBlPXB5dGhvbjM2LlB5VHVwbGVJdGVyX1R5cGUgREFUQQorICBQeVR1cGxlX0NsZWFyRnJlZUxpc3Q9cHl0aG9uMzYuUHlUdXBsZV9DbGVhckZyZWVMaXN0CisgIFB5VHVwbGVfR2V0SXRlbT1weXRob24zNi5QeVR1cGxlX0dldEl0ZW0KKyAgUHlUdXBsZV9HZXRTbGljZT1weXRob24zNi5QeVR1cGxlX0dldFNsaWNlCisgIFB5VHVwbGVfTmV3PXB5dGhvbjM2LlB5VHVwbGVfTmV3CisgIFB5VHVwbGVfUGFjaz1weXRob24zNi5QeVR1cGxlX1BhY2sKKyAgUHlUdXBsZV9TZXRJdGVtPXB5dGhvbjM2LlB5VHVwbGVfU2V0SXRlbQorICBQeVR1cGxlX1NpemU9cHl0aG9uMzYuUHlUdXBsZV9TaXplCisgIFB5VHVwbGVfVHlwZT1weXRob24zNi5QeVR1cGxlX1R5cGUgREFUQQorICBQeVR5cGVfQ2xlYXJDYWNoZT1weXRob24zNi5QeVR5cGVfQ2xlYXJDYWNoZQorICBQeVR5cGVfRnJvbVNwZWM9cHl0aG9uMzYuUHlUeXBlX0Zyb21TcGVjCisgIFB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcz1weXRob24zNi5QeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXMKKyAgUHlUeXBlX0dlbmVyaWNBbGxvYz1weXRob24zNi5QeVR5cGVfR2VuZXJpY0FsbG9jCisgIFB5VHlwZV9HZW5lcmljTmV3PXB5dGhvbjM2LlB5VHlwZV9HZW5lcmljTmV3CisgIFB5VHlwZV9HZXRGbGFncz1weXRob24zNi5QeVR5cGVfR2V0RmxhZ3MKKyAgUHlUeXBlX0dldFNsb3Q9cHl0aG9uMzYuUHlUeXBlX0dldFNsb3QKKyAgUHlUeXBlX0lzU3VidHlwZT1weXRob24zNi5QeVR5cGVfSXNTdWJ0eXBlCisgIFB5VHlwZV9Nb2RpZmllZD1weXRob24zNi5QeVR5cGVfTW9kaWZpZWQKKyAgUHlUeXBlX1JlYWR5PXB5dGhvbjM2LlB5VHlwZV9SZWFkeQorICBQeVR5cGVfVHlwZT1weXRob24zNi5QeVR5cGVfVHlwZSBEQVRBCisgIFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZT1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9DcmVhdGUKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2Rpbmc9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2RpbmcKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZAorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0T2JqZWN0CisgIFB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRSZWFzb24KKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQKKyAgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX1NldEVuZAorICBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0UmVhc29uCisgIFB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0CisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuY29kaW5nCisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldE9iamVjdAorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0UmVhc29uCisgIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0CisgIFB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQKKyAgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0UmVhc29uPXB5dGhvbjM2LlB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbgorICBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydD1weXRob24zNi5QeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRTdGFydAorICBQeVVuaWNvZGVJdGVyX1R5cGU9cHl0aG9uMzYuUHlVbmljb2RlSXRlcl9UeXBlIERBVEEKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZAorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0CisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFJlYXNvbj1weXRob24zNi5QeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb24KKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQ9cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0U3RhcnQKKyAgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kPXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZAorICBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb249cHl0aG9uMzYuUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0UmVhc29uCisgIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0PXB5dGhvbjM2LlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0CisgIFB5VW5pY29kZV9BcHBlbmQ9cHl0aG9uMzYuUHlVbmljb2RlX0FwcGVuZAorICBQeVVuaWNvZGVfQXBwZW5kQW5kRGVsPXB5dGhvbjM2LlB5VW5pY29kZV9BcHBlbmRBbmREZWwKKyAgUHlVbmljb2RlX0FzQVNDSUlTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcKKyAgUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nCisgIFB5VW5pY29kZV9Bc0RlY29kZWRPYmplY3Q9cHl0aG9uMzYuUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdAorICBQeVVuaWNvZGVfQXNEZWNvZGVkVW5pY29kZT1weXRob24zNi5QeVVuaWNvZGVfQXNEZWNvZGVkVW5pY29kZQorICBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0PXB5dGhvbjM2LlB5VW5pY29kZV9Bc0VuY29kZWRPYmplY3QKKyAgUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nCisgIFB5VW5pY29kZV9Bc0VuY29kZWRVbmljb2RlPXB5dGhvbjM2LlB5VW5pY29kZV9Bc0VuY29kZWRVbmljb2RlCisgIFB5VW5pY29kZV9Bc0xhdGluMVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcKKyAgUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZz1weXRob24zNi5QeVVuaWNvZGVfQXNSYXdVbmljb2RlRXNjYXBlU3RyaW5nCisgIFB5VW5pY29kZV9Bc1VURjE2U3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1VURjE2U3RyaW5nCisgIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1VURjMyU3RyaW5nCisgIFB5VW5pY29kZV9Bc1VURjhTdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0FzVVRGOFN0cmluZworICBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcKKyAgUHlVbmljb2RlX0FzV2lkZUNoYXI9cHl0aG9uMzYuUHlVbmljb2RlX0FzV2lkZUNoYXIKKyAgUHlVbmljb2RlX0NsZWFyRnJlZWxpc3Q9cHl0aG9uMzYuUHlVbmljb2RlX0NsZWFyRnJlZWxpc3QKKyAgUHlVbmljb2RlX0NvbXBhcmU9cHl0aG9uMzYuUHlVbmljb2RlX0NvbXBhcmUKKyAgUHlVbmljb2RlX0NvbmNhdD1weXRob24zNi5QeVVuaWNvZGVfQ29uY2F0CisgIFB5VW5pY29kZV9Db250YWlucz1weXRob24zNi5QeVVuaWNvZGVfQ29udGFpbnMKKyAgUHlVbmljb2RlX0NvdW50PXB5dGhvbjM2LlB5VW5pY29kZV9Db3VudAorICBQeVVuaWNvZGVfRGVjb2RlPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGUKKyAgUHlVbmljb2RlX0RlY29kZUFTQ0lJPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVBU0NJSQorICBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcAorICBQeVVuaWNvZGVfRGVjb2RlRlNEZWZhdWx0PXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVGU0RlZmF1bHQKKyAgUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemU9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZUZTRGVmYXVsdEFuZFNpemUKKyAgUHlVbmljb2RlX0RlY29kZUxhdGluMT1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlTGF0aW4xCisgIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlCisgIFB5VW5pY29kZV9EZWNvZGVVVEYxNj1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGMTYKKyAgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWw9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwKKyAgUHlVbmljb2RlX0RlY29kZVVURjMyPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEYzMgorICBQeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGMzJTdGF0ZWZ1bAorICBQeVVuaWNvZGVfRGVjb2RlVVRGOD1weXRob24zNi5QeVVuaWNvZGVfRGVjb2RlVVRGOAorICBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsPXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwKKyAgUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGU9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUKKyAgUHlVbmljb2RlX0ZTQ29udmVydGVyPXB5dGhvbjM2LlB5VW5pY29kZV9GU0NvbnZlcnRlcgorICBQeVVuaWNvZGVfRlNEZWNvZGVyPXB5dGhvbjM2LlB5VW5pY29kZV9GU0RlY29kZXIKKyAgUHlVbmljb2RlX0ZpbmQ9cHl0aG9uMzYuUHlVbmljb2RlX0ZpbmQKKyAgUHlVbmljb2RlX0Zvcm1hdD1weXRob24zNi5QeVVuaWNvZGVfRm9ybWF0CisgIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdD1weXRob24zNi5QeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QKKyAgUHlVbmljb2RlX0Zyb21Gb3JtYXQ9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21Gb3JtYXQKKyAgUHlVbmljb2RlX0Zyb21Gb3JtYXRWPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tRm9ybWF0VgorICBQeVVuaWNvZGVfRnJvbU9iamVjdD1weXRob24zNi5QeVVuaWNvZGVfRnJvbU9iamVjdAorICBQeVVuaWNvZGVfRnJvbU9yZGluYWw9cHl0aG9uMzYuUHlVbmljb2RlX0Zyb21PcmRpbmFsCisgIFB5VW5pY29kZV9Gcm9tU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Gcm9tU3RyaW5nCisgIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZT1weXRob24zNi5QeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUKKyAgUHlVbmljb2RlX0Zyb21XaWRlQ2hhcj1weXRob24zNi5QeVVuaWNvZGVfRnJvbVdpZGVDaGFyCisgIFB5VW5pY29kZV9HZXREZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZworICBQeVVuaWNvZGVfR2V0U2l6ZT1weXRob24zNi5QeVVuaWNvZGVfR2V0U2l6ZQorICBQeVVuaWNvZGVfSXNJZGVudGlmaWVyPXB5dGhvbjM2LlB5VW5pY29kZV9Jc0lkZW50aWZpZXIKKyAgUHlVbmljb2RlX0pvaW49cHl0aG9uMzYuUHlVbmljb2RlX0pvaW4KKyAgUHlVbmljb2RlX1BhcnRpdGlvbj1weXRob24zNi5QeVVuaWNvZGVfUGFydGl0aW9uCisgIFB5VW5pY29kZV9SUGFydGl0aW9uPXB5dGhvbjM2LlB5VW5pY29kZV9SUGFydGl0aW9uCisgIFB5VW5pY29kZV9SU3BsaXQ9cHl0aG9uMzYuUHlVbmljb2RlX1JTcGxpdAorICBQeVVuaWNvZGVfUmVwbGFjZT1weXRob24zNi5QeVVuaWNvZGVfUmVwbGFjZQorICBQeVVuaWNvZGVfUmVzaXplPXB5dGhvbjM2LlB5VW5pY29kZV9SZXNpemUKKyAgUHlVbmljb2RlX1JpY2hDb21wYXJlPXB5dGhvbjM2LlB5VW5pY29kZV9SaWNoQ29tcGFyZQorICBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2RpbmcKKyAgUHlVbmljb2RlX1NwbGl0PXB5dGhvbjM2LlB5VW5pY29kZV9TcGxpdAorICBQeVVuaWNvZGVfU3BsaXRsaW5lcz1weXRob24zNi5QeVVuaWNvZGVfU3BsaXRsaW5lcworICBQeVVuaWNvZGVfVGFpbG1hdGNoPXB5dGhvbjM2LlB5VW5pY29kZV9UYWlsbWF0Y2gKKyAgUHlVbmljb2RlX1RyYW5zbGF0ZT1weXRob24zNi5QeVVuaWNvZGVfVHJhbnNsYXRlCisgIFB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwPXB5dGhvbjM2LlB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwCisgIFB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nPXB5dGhvbjM2LlB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nCisgIFB5VW5pY29kZV9EZWNvZGVVVEY3PXB5dGhvbjM2LlB5VW5pY29kZV9EZWNvZGVVVEY3CisgIFB5VW5pY29kZV9EZWNvZGVVVEY3U3RhdGVmdWw9cHl0aG9uMzYuUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bAorICBQeVVuaWNvZGVfRW5jb2RlRlNEZWZhdWx0PXB5dGhvbjM2LlB5VW5pY29kZV9FbmNvZGVGU0RlZmF1bHQKKyAgUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmc9cHl0aG9uMzYuUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcKKyAgUHlVbmljb2RlX0ludGVybkltbW9ydGFsPXB5dGhvbjM2LlB5VW5pY29kZV9JbnRlcm5JbW1vcnRhbAorICBQeVVuaWNvZGVfSW50ZXJuSW5QbGFjZT1weXRob24zNi5QeVVuaWNvZGVfSW50ZXJuSW5QbGFjZQorICBQeVVuaWNvZGVfVHlwZT1weXRob24zNi5QeVVuaWNvZGVfVHlwZSBEQVRBCisgIFB5V2Vha3JlZl9HZXRPYmplY3Q9cHl0aG9uMzYuUHlXZWFrcmVmX0dldE9iamVjdCBEQVRBCisgIFB5V2Vha3JlZl9OZXdQcm94eT1weXRob24zNi5QeVdlYWtyZWZfTmV3UHJveHkKKyAgUHlXZWFrcmVmX05ld1JlZj1weXRob24zNi5QeVdlYWtyZWZfTmV3UmVmCisgIFB5V3JhcHBlckRlc2NyX1R5cGU9cHl0aG9uMzYuUHlXcmFwcGVyRGVzY3JfVHlwZSBEQVRBCisgIFB5V3JhcHBlcl9OZXc9cHl0aG9uMzYuUHlXcmFwcGVyX05ldworICBQeVppcF9UeXBlPXB5dGhvbjM2LlB5WmlwX1R5cGUgREFUQQorICBQeV9BZGRQZW5kaW5nQ2FsbD1weXRob24zNi5QeV9BZGRQZW5kaW5nQ2FsbAorICBQeV9BdEV4aXQ9cHl0aG9uMzYuUHlfQXRFeGl0CisgIFB5X0J1aWxkVmFsdWU9cHl0aG9uMzYuUHlfQnVpbGRWYWx1ZQorICBQeV9Db21waWxlU3RyaW5nPXB5dGhvbjM2LlB5X0NvbXBpbGVTdHJpbmcKKyAgUHlfRGVjUmVmPXB5dGhvbjM2LlB5X0RlY1JlZgorICBQeV9FbmRJbnRlcnByZXRlcj1weXRob24zNi5QeV9FbmRJbnRlcnByZXRlcgorICBQeV9FeGl0PXB5dGhvbjM2LlB5X0V4aXQKKyAgUHlfRmF0YWxFcnJvcj1weXRob24zNi5QeV9GYXRhbEVycm9yCisgIFB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2Rpbmc9cHl0aG9uMzYuUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZyBEQVRBCisgIFB5X0ZpbmFsaXplPXB5dGhvbjM2LlB5X0ZpbmFsaXplCisgIFB5X0ZpbmFsaXplRXg9cHl0aG9uMzYuUHlfRmluYWxpemVFeAorICBQeV9HZXRCdWlsZEluZm89cHl0aG9uMzYuUHlfR2V0QnVpbGRJbmZvCisgIFB5X0dldENvbXBpbGVyPXB5dGhvbjM2LlB5X0dldENvbXBpbGVyCisgIFB5X0dldENvcHlyaWdodD1weXRob24zNi5QeV9HZXRDb3B5cmlnaHQKKyAgUHlfR2V0RXhlY1ByZWZpeD1weXRob24zNi5QeV9HZXRFeGVjUHJlZml4CisgIFB5X0dldFBhdGg9cHl0aG9uMzYuUHlfR2V0UGF0aAorICBQeV9HZXRQbGF0Zm9ybT1weXRob24zNi5QeV9HZXRQbGF0Zm9ybQorICBQeV9HZXRQcmVmaXg9cHl0aG9uMzYuUHlfR2V0UHJlZml4CisgIFB5X0dldFByb2dyYW1GdWxsUGF0aD1weXRob24zNi5QeV9HZXRQcm9ncmFtRnVsbFBhdGgKKyAgUHlfR2V0UHJvZ3JhbU5hbWU9cHl0aG9uMzYuUHlfR2V0UHJvZ3JhbU5hbWUKKyAgUHlfR2V0UHl0aG9uSG9tZT1weXRob24zNi5QeV9HZXRQeXRob25Ib21lCisgIFB5X0dldFJlY3Vyc2lvbkxpbWl0PXB5dGhvbjM2LlB5X0dldFJlY3Vyc2lvbkxpbWl0CisgIFB5X0dldFZlcnNpb249cHl0aG9uMzYuUHlfR2V0VmVyc2lvbgorICBQeV9IYXNGaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nPXB5dGhvbjM2LlB5X0hhc0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmcgREFUQQorICBQeV9JbmNSZWY9cHl0aG9uMzYuUHlfSW5jUmVmCisgIFB5X0luaXRpYWxpemU9cHl0aG9uMzYuUHlfSW5pdGlhbGl6ZQorICBQeV9Jbml0aWFsaXplRXg9cHl0aG9uMzYuUHlfSW5pdGlhbGl6ZUV4CisgIFB5X0lzSW5pdGlhbGl6ZWQ9cHl0aG9uMzYuUHlfSXNJbml0aWFsaXplZAorICBQeV9NYWluPXB5dGhvbjM2LlB5X01haW4KKyAgUHlfTWFrZVBlbmRpbmdDYWxscz1weXRob24zNi5QeV9NYWtlUGVuZGluZ0NhbGxzCisgIFB5X05ld0ludGVycHJldGVyPXB5dGhvbjM2LlB5X05ld0ludGVycHJldGVyCisgIFB5X1JlcHJFbnRlcj1weXRob24zNi5QeV9SZXByRW50ZXIKKyAgUHlfUmVwckxlYXZlPXB5dGhvbjM2LlB5X1JlcHJMZWF2ZQorICBQeV9TZXRQcm9ncmFtTmFtZT1weXRob24zNi5QeV9TZXRQcm9ncmFtTmFtZQorICBQeV9TZXRQeXRob25Ib21lPXB5dGhvbjM2LlB5X1NldFB5dGhvbkhvbWUKKyAgUHlfU2V0UmVjdXJzaW9uTGltaXQ9cHl0aG9uMzYuUHlfU2V0UmVjdXJzaW9uTGltaXQKKyAgUHlfU3ltdGFibGVTdHJpbmc9cHl0aG9uMzYuUHlfU3ltdGFibGVTdHJpbmcKKyAgUHlfVmFCdWlsZFZhbHVlPXB5dGhvbjM2LlB5X1ZhQnVpbGRWYWx1ZQorICBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsPXB5dGhvbjM2Ll9QeUVycl9CYWRJbnRlcm5hbENhbGwKKyAgX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVD1weXRob24zNi5fUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUCisgIF9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUPXB5dGhvbjM2Ll9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUCisgIF9QeU9iamVjdF9HQ19NYWxsb2M9cHl0aG9uMzYuX1B5T2JqZWN0X0dDX01hbGxvYworICBfUHlPYmplY3RfR0NfTmV3PXB5dGhvbjM2Ll9QeU9iamVjdF9HQ19OZXcKKyAgX1B5T2JqZWN0X0dDX05ld1Zhcj1weXRob24zNi5fUHlPYmplY3RfR0NfTmV3VmFyCisgIF9QeU9iamVjdF9HQ19SZXNpemU9cHl0aG9uMzYuX1B5T2JqZWN0X0dDX1Jlc2l6ZQorICBfUHlPYmplY3RfTmV3PXB5dGhvbjM2Ll9QeU9iamVjdF9OZXcKKyAgX1B5T2JqZWN0X05ld1Zhcj1weXRob24zNi5fUHlPYmplY3RfTmV3VmFyCisgIF9QeVN0YXRlX0FkZE1vZHVsZT1weXRob24zNi5fUHlTdGF0ZV9BZGRNb2R1bGUKKyAgX1B5VGhyZWFkU3RhdGVfSW5pdD1weXRob24zNi5fUHlUaHJlYWRTdGF0ZV9Jbml0CisgIF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jPXB5dGhvbjM2Ll9QeVRocmVhZFN0YXRlX1ByZWFsbG9jCisgIF9QeVRyYXNoX2RlbGV0ZV9sYXRlcj1weXRob24zNi5fUHlUcmFzaF9kZWxldGVfbGF0ZXIgREFUQQorICBfUHlUcmFzaF9kZWxldGVfbmVzdGluZz1weXRob24zNi5fUHlUcmFzaF9kZWxldGVfbmVzdGluZyBEQVRBCisgIF9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0PXB5dGhvbjM2Ll9QeVRyYXNoX2RlcG9zaXRfb2JqZWN0CisgIF9QeVRyYXNoX2Rlc3Ryb3lfY2hhaW49cHl0aG9uMzYuX1B5VHJhc2hfZGVzdHJveV9jaGFpbgorICBfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlPXB5dGhvbjM2Ll9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGUgREFUQQorICBfUHlXZWFrcmVmX1Byb3h5VHlwZT1weXRob24zNi5fUHlXZWFrcmVmX1Byb3h5VHlwZSBEQVRBCisgIF9QeVdlYWtyZWZfUmVmVHlwZT1weXRob24zNi5fUHlXZWFrcmVmX1JlZlR5cGUgREFUQQorICBfUHlfQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNi5fUHlfQnVpbGRWYWx1ZV9TaXplVAorICBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdD1weXRob24zNi5fUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCBEQVRBCisgIF9QeV9DaGVja1JlY3Vyc2l2ZUNhbGw9cHl0aG9uMzYuX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbAorICBfUHlfRGVhbGxvYz1weXRob24zNi5fUHlfRGVhbGxvYworICBfUHlfRWxsaXBzaXNPYmplY3Q9cHl0aG9uMzYuX1B5X0VsbGlwc2lzT2JqZWN0IERBVEEKKyAgX1B5X0ZhbHNlU3RydWN0PXB5dGhvbjM2Ll9QeV9GYWxzZVN0cnVjdCBEQVRBCisgIF9QeV9Ob25lU3RydWN0PXB5dGhvbjM2Ll9QeV9Ob25lU3RydWN0IERBVEEKKyAgX1B5X05vdEltcGxlbWVudGVkU3RydWN0PXB5dGhvbjM2Ll9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdCBEQVRBCisgIF9QeV9Td2FwcGVkT3A9cHl0aG9uMzYuX1B5X1N3YXBwZWRPcCBEQVRBCisgIF9QeV9UcnVlU3RydWN0PXB5dGhvbjM2Ll9QeV9UcnVlU3RydWN0IERBVEEKKyAgX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVD1weXRob24zNi5fUHlfVmFCdWlsZFZhbHVlX1NpemVUCisgIF9QeUFyZ19QYXJzZV9TaXplVD1weXRob24zNi5fUHlBcmdfUGFyc2VfU2l6ZVQKKyAgX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQ9cHl0aG9uMzYuX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQKKyAgX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVD1weXRob24zNi5fUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCisgIF9QeUFyZ19WYVBhcnNlX1NpemVUPXB5dGhvbjM2Ll9QeUFyZ19WYVBhcnNlX1NpemVUCisgIF9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVD1weXRob24zNi5fUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKKyAgX1B5X0J1aWxkVmFsdWVfU2l6ZVQ9cHl0aG9uMzYuX1B5X0J1aWxkVmFsdWVfU2l6ZVQKZGlmZiAtLWdpdCBhL1BDL3Rlc3RweS5weSBiL1BDL3Rlc3RweS5weQppbmRleCA0ZWYzZDRmLi43MDlmMzVjIDEwMDY0NAotLS0gYS9QQy90ZXN0cHkucHkKKysrIGIvUEMvdGVzdHB5LnB5CkBAIC0yNiw1ICsyNiw1IEBACiAgICAgICAgICAgICAjIEFkZCB0aGUgInRlc3QiIGRpcmVjdG9yeSB0byBQWVRIT05QQVRILgogICAgICAgICAgICAgc3lzLnBhdGggPSBzeXMucGF0aCArIFt0ZXN0XQogCi1pbXBvcnQgcmVncnRlc3QgIyBTdGFuZGFyZCBQeXRob24gdGVzdGVyLgotcmVncnRlc3QubWFpbigpCitpbXBvcnQgbGlicmVncnRlc3QgIyBTdGFuZGFyZCBQeXRob24gdGVzdGVyLgorbGlicmVncnRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9QQy93aW5yZWcuYyBiL1BDL3dpbnJlZy5jCmluZGV4IGYwOGQ5YTQuLjk1MjQ4MzggMTAwNjQ0Ci0tLSBhL1BDL3dpbnJlZy5jCisrKyBiL1BDL3dpbnJlZy5jCkBAIC01NDksNyArNTQ5LDcgQEAKICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBQeV9Ob25lICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKQogICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoRFdPUkQsIDEpOwotICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmPT1OVUxMKXsKKyAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1ZiA9PSBOVUxMKXsKICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIH0KQEAgLTU2Myw2ICs1NjMsMjQgQEAKICAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsICZkLCBzaXplb2YoRFdPUkQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFR19RV09SRDoKKyAgICAgICAgICBpZiAodmFsdWUgIT0gUHlfTm9uZSAmJiAhUHlMb25nX0NoZWNrKHZhbHVlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKERXT1JENjQsIDEpOworICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmID09IE5VTEwpeworICAgICAgICAgICAgICAgIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnJldERhdGFTaXplID0gc2l6ZW9mKERXT1JENjQpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBEV09SRDY0IHplcm8gPSAwOworICAgICAgICAgICAgICAgIG1lbWNweSgqcmV0RGF0YUJ1ZiwgJnplcm8sIHNpemVvZihEV09SRDY0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBEV09SRDY0IGQgPSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKnJldERhdGFCdWYsICZkLCBzaXplb2YoRFdPUkQ2NCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVHX1NaOgogICAgICAgICBjYXNlIFJFR19FWFBBTkRfU1o6CiAgICAgICAgICAgICB7CkBAIC02MTksNyArNjM3LDcgQEAKICAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUgPSBzaXplICsgMjsKICAgICAgICAgICAgICAgICAqcmV0RGF0YUJ1ZiA9IChCWVRFICopUHlNZW1fTkVXKGNoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmV0RGF0YVNpemUpOwotICAgICAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmID09IE5VTEwpewogICAgICAgICAgICAgICAgICAgICBQeUVycl9Ob01lbW9yeSgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgICAgICAgICAgfQpAQCAtNjY1LDcgKzY4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKIAogICAgICAgICAgICAgICAgICpyZXREYXRhQnVmID0gKEJZVEUgKilQeU1lbV9ORVcoY2hhciwgdmlldy5sZW4pOwotICAgICAgICAgICAgICAgIGlmICgqcmV0RGF0YUJ1Zj09TlVMTCl7CisgICAgICAgICAgICAgICAgaWYgKCpyZXREYXRhQnVmID09IE5VTEwpewogICAgICAgICAgICAgICAgICAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZ2aWV3KTsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtNjkwLDcgKzcwOCwxMyBAQAogICAgICAgICAgICAgaWYgKHJldERhdGFTaXplID09IDApCiAgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoMCk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgb2JEYXRhID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmcoKihpbnQgKilyZXREYXRhQnVmKTsKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZygqKERXT1JEICopcmV0RGF0YUJ1Zik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfUVdPUkQ6CisgICAgICAgICAgICBpZiAocmV0RGF0YVNpemUgPT0gMCkKKyAgICAgICAgICAgICAgICBvYkRhdGEgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb2JEYXRhID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKCooRFdPUkQ2NCAqKXJldERhdGFCdWYpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUkVHX1NaOgogICAgICAgICBjYXNlIFJFR19FWFBBTkRfU1o6CkBAIC0xNTk5LDcgKzE2MjMsNyBAQAogICAgICAgICBBbiBpbnRlZ2VyIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBkYXRhLCBvbmUgb2Y6CiAgICAgICAgIFJFR19CSU5BUlkgLS0gQmluYXJ5IGRhdGEgaW4gYW55IGZvcm0uCiAgICAgICAgIFJFR19EV09SRCAtLSBBIDMyLWJpdCBudW1iZXIuCi0gICAgICAgIFJFR19EV09SRF9MSVRUTEVfRU5ESUFOIC0tIEEgMzItYml0IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC4KKyAgICAgICAgUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4gLS0gQSAzMi1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBFcXVpdmFsZW50IHRvIFJFR19EV09SRAogICAgICAgICBSRUdfRFdPUkRfQklHX0VORElBTiAtLSBBIDMyLWJpdCBudW1iZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQuCiAgICAgICAgIFJFR19FWFBBTkRfU1ogLS0gQSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRoYXQgY29udGFpbnMgdW5leHBhbmRlZAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gZW52aXJvbm1lbnQgdmFyaWFibGVzIChmb3IgZXhhbXBsZSwKQEAgLTE2MDksNiArMTYzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBieSB0d28gbnVsbCBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0IFB5dGhvbiBoYW5kbGVzCiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHRlcm1pbmF0aW9uIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgIFJFR19OT05FIC0tIE5vIGRlZmluZWQgdmFsdWUgdHlwZS4KKyAgICAgICAgUkVHX1FXT1JEIC0tIEEgNjQtYml0IG51bWJlci4KKyAgICAgICAgUkVHX1FXT1JEX0xJVFRMRV9FTkRJQU4gLS0gQSA2NC1iaXQgbnVtYmVyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBFcXVpdmFsZW50IHRvIFJFR19RV09SRC4KICAgICAgICAgUkVHX1JFU09VUkNFX0xJU1QgLS0gQSBkZXZpY2UtZHJpdmVyIHJlc291cmNlIGxpc3QuCiAgICAgICAgIFJFR19TWiAtLSBBIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCiAgICAgdmFsdWU6IG9iamVjdApAQCAtMTYzMSw3ICsxNjU3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiB3aW5yZWdfU2V0VmFsdWVFeF9pbXBsKFB5T2JqZWN0ICptb2R1bGUsIEhLRVkga2V5LCBQeV9VTklDT0RFICp2YWx1ZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqcmVzZXJ2ZWQsIERXT1JEIHR5cGUsIFB5T2JqZWN0ICp2YWx1ZSkKLS8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jODhjODQyNmI2YzAwZWM3IGlucHV0PWYxYjE2Y2JjYzNlZDQxMDFdKi8KKy8qW2NsaW5pYyBlbmQgZ2VuZXJhdGVkIGNvZGU6IG91dHB1dD1jODhjODQyNmI2YzAwZWM3IGlucHV0PTkwMGE5ZTM5OTBiZmIxOTZdKi8KIHsKICAgICBCWVRFICpkYXRhOwogICAgIERXT1JEIGxlbjsKQEAgLTE5MTgsNiArMTk0NCw4IEBACiAgICAgQUREX0lOVChSRUdfRFdPUkQpOwogICAgIEFERF9JTlQoUkVHX0RXT1JEX0xJVFRMRV9FTkRJQU4pOwogICAgIEFERF9JTlQoUkVHX0RXT1JEX0JJR19FTkRJQU4pOworICAgIEFERF9JTlQoUkVHX1FXT1JEKTsKKyAgICBBRERfSU5UKFJFR19RV09SRF9MSVRUTEVfRU5ESUFOKTsKICAgICBBRERfSU5UKFJFR19MSU5LKTsKICAgICBBRERfSU5UKFJFR19NVUxUSV9TWik7CiAgICAgQUREX0lOVChSRUdfUkVTT1VSQ0VfTElTVCk7CmRpZmYgLS1naXQgYS9QQ2J1aWxkL2J1aWxkX3Bnby5iYXQgYi9QQ2J1aWxkL2J1aWxkX3Bnby5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MmMzODIuLjAwMDAwMDAKLS0tIGEvUENidWlsZC9idWlsZF9wZ28uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1AZWNobyBvZmYNCi1lY2hvLkRlcHJlY2F0aW9uV2FybmluZzoNCi1lY2hvLiAgICBUaGlzIHNjcmlwdCBpcyBkZXByZWNhdGVkLCB1c2UgYGJ1aWxkLmJhdCAtLXBnb2AgaW5zdGVhZC4NCi1lY2hvLg0KLQ0KLWNhbGwgIiV+ZHAwYnVpbGQuYmF0IiAtLXBnbyAlKg0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHJlcGFyZV9zc2wuYmF0IGIvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQKaW5kZXggMWJlNzNlNi4uMmY0MWFlOCAxMDA2NDQKLS0tIGEvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQKKysrIGIvUENidWlsZC9wcmVwYXJlX3NzbC5iYXQKQEAgLTMsMTAgKzMsMTAgQEAKICAgaWYgIiUxIiBFUVUgIkRlYnVnIiAoDQogICAgIHNoaWZ0DQogICAgIHNldCBIT1NUX1BZVEhPTj1weXRob25fZC5leGUNCi0gICAgaWYgbm90IGV4aXN0IHB5dGhvbjM1X2QuZGxsIGV4aXQgMQ0KKyAgICBpZiBub3QgZXhpc3QgcHl0aG9uMzZfZC5kbGwgZXhpdCAxDQogICApIEVMU0UgKA0KICAgICBzZXQgSE9TVF9QWVRIT049cHl0aG9uLmV4ZQ0KLSAgICBpZiBub3QgZXhpc3QgcHl0aG9uMzUuZGxsIGV4aXQgMQ0KKyAgICBpZiBub3QgZXhpc3QgcHl0aG9uMzYuZGxsIGV4aXQgMQ0KICAgKQ0KICkNCiAlSE9TVF9QWVRIT04lICIlfmRwMHByZXBhcmVfc3NsLnB5IiAlMQ0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qIGIvUENidWlsZC9weXRob25jb3JlLnZjeHByb2oKaW5kZXggM2ExYjViYS4uOWRmZTllMyAxMDA2NDQKLS0tIGEvUENidWlsZC9weXRob25jb3JlLnZjeHByb2oKKysrIGIvUENidWlsZC9weXRob25jb3JlLnZjeHByb2oKQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxvZGljdG9iamVjdC5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxvcGNvZGUuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVcb3NkZWZzLmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9zbW9kdWxlLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXHBhcnNldG9rLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXHBhdGNobGV2ZWwuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXEluY2x1ZGVccGdlbi5oIiAvPgpAQCAtMjA5LDYgKzIxMCw3IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cY29uZHZhci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cUHl0aG9uXGltcG9ydGRsLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cdGhyZWFkX250LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cd29yZGNvZGVfaGVscGVycy5oIiAvPgogICA8L0l0ZW1Hcm91cD4KICAgPEl0ZW1Hcm91cD4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXE1vZHVsZXNcX2Jpc2VjdG1vZHVsZS5jIiAvPgpAQCAtNDE2LDQgKzQxOCw0IEBACiAgIDxUYXJnZXQgTmFtZT0iX1dhcm5BYm91dFRvb2xzZXQiIEJlZm9yZVRhcmdldHM9IlByZXBhcmVGb3JCdWlsZCIgQ29uZGl0aW9uPSIkKFBsYXRmb3JtVG9vbHNldCkgIT0gJ3YxNDAnIj4KICAgICA8V2FybmluZyBUZXh0PSJUb29sc2V0ICQoUGxhdGZvcm1Ub29sc2V0KSBpcyBub3QgdXNlZCBmb3Igb2ZmaWNpYWwgYnVpbGRzLiBZb3VyIGJ1aWxkIG1heSBoYXZlIGVycm9ycyBvciBpbmNvbXBhdGliaWxpdGllcy4iIC8+CiAgIDwvVGFyZ2V0PgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qLmZpbHRlcnMgYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmN4cHJvai5maWx0ZXJzCmluZGV4IDgzN2I3MzYuLmNlMmVhNjAgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvcHl0aG9uY29yZS52Y3hwcm9qLmZpbHRlcnMKKysrIGIvUENidWlsZC9weXRob25jb3JlLnZjeHByb2ouZmlsdGVycwpAQCAtMTc3LDYgKzE3Nyw5IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxJbmNsdWRlXG9zZGVmcy5oIj4KICAgICAgIDxGaWx0ZXI+SW5jbHVkZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxvc21vZHVsZS5oIj4KKyAgICAgIDxGaWx0ZXI+SW5jbHVkZTwvRmlsdGVyPgorICAgIDwvQ2xJbmNsdWRlPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iLi5cSW5jbHVkZVxwYXJzZXRvay5oIj4KICAgICAgIDxGaWx0ZXI+SW5jbHVkZTwvRmlsdGVyPgogICAgIDwvQ2xJbmNsdWRlPgpAQCAtNDIwLDYgKzQyMyw5IEBACiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxQeXRob25cdGhyZWFkX250LmgiPgogICAgICAgPEZpbHRlcj5QeXRob248L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblx3b3JkY29kZV9oZWxwZXJzLmgiPgorICAgICAgPEZpbHRlcj5QeXRob248L0ZpbHRlcj4KKyAgICA8L0NsSW5jbHVkZT4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4uXFB5dGhvblxjb25kdmFyLmgiPgogICAgICAgPEZpbHRlcj5QeXRob248L0ZpbHRlcj4KICAgICA8L0NsSW5jbHVkZT4KQEAgLTk4MCw0ICs5ODYsNCBAQAogICAgICAgPEZpbHRlcj5SZXNvdXJjZSBGaWxlczwvRmlsdGVyPgogICAgIDwvUmVzb3VyY2VDb21waWxlPgogICA8L0l0ZW1Hcm91cD4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L1Byb2plY3Q+CmRpZmYgLS1naXQgYS9QQ2J1aWxkL3JlYWRtZS50eHQgYi9QQ2J1aWxkL3JlYWRtZS50eHQKaW5kZXggZDQ1ZWIyNy4uMjA0NmFmOSAxMDA2NDQKLS0tIGEvUENidWlsZC9yZWFkbWUudHh0CisrKyBiL1BDYnVpbGQvcmVhZG1lLnR4dApAQCAtNDgsNyArNDgsNyBAQAogICAgIFVzZWQgdG8gYnVpbGQgUHl0aG9uIHdpdGggZXh0cmEgZGVidWdnaW5nIGNhcGFiaWxpdGllcywgZXF1aXZhbGVudA0KICAgICB0byB1c2luZyAuL2NvbmZpZ3VyZSAtLXdpdGgtcHlkZWJ1ZyBvbiBVTklYLiAgQWxsIGJpbmFyaWVzIGJ1aWx0DQogICAgIHVzaW5nIHRoaXMgY29uZmlndXJhdGlvbiBoYXZlICJfZCIgYWRkZWQgdG8gdGhlaXIgbmFtZToNCi0gICAgcHl0aG9uMzVfZC5kbGwsIHB5dGhvbl9kLmV4ZSwgcGFyc2VyX2QucHlkLCBhbmQgc28gb24uICBCb3RoIHRoZQ0KKyAgICBweXRob24zNl9kLmRsbCwgcHl0aG9uX2QuZXhlLCBwYXJzZXJfZC5weWQsIGFuZCBzbyBvbi4gIEJvdGggdGhlDQogICAgIGJ1aWxkIGFuZCBydCAocnVuIHRlc3QpIGJhdGNoIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFjY2VwdCBhIC1kDQogICAgIG9wdGlvbiBmb3IgZGVidWcgYnVpbGRzLiAgSWYgeW91IGFyZSBidWlsZGluZyBQeXRob24gdG8gaGVscCB3aXRoDQogICAgIGRldmVsb3BtZW50IG9mIENQeXRob24sIHlvdSB3aWxsIG1vc3QgbGlrZWx5IHVzZSB0aGlzIGNvbmZpZ3VyYXRpb24uDQpkaWZmIC0tZ2l0IGEvUENidWlsZC9ydC5iYXQgYi9QQ2J1aWxkL3J0LmJhdAppbmRleCAyZDkzYjgwLi43ZDRkMDcxIDEwMDY0NAotLS0gYS9QQ2J1aWxkL3J0LmJhdAorKysgYi9QQ2J1aWxkL3J0LmJhdApAQCAtNDIsNyArNDIsNyBAQAogaWYgTk9UICIlMSI9PSIiIChzZXQgcmVncnRlc3RhcmdzPSVyZWdydGVzdGFyZ3MlICUxKSAmIHNoaWZ0ICYgZ290byBDaGVja09wdHMNCiANCiBzZXQgZXhlPSVwcmVmaXglcHl0aG9uJXN1ZmZpeCUuZXhlDQotc2V0IGNtZD0iJWV4ZSUiICVkYXNoTyUgLVdkIC1FIC1iYiAiJXBjYnVpbGQlLi5cbGliXHRlc3RccmVncnRlc3QucHkiICVyZWdydGVzdGFyZ3MlDQorc2V0IGNtZD0iJWV4ZSUiICVkYXNoTyUgLVdkIC1FIC1iYiAtbSB0ZXN0ICVyZWdydGVzdGFyZ3MlDQogaWYgZGVmaW5lZCBxbW9kZSBnb3RvIFFtb2RlDQogDQogZWNobyBEZWxldGluZyAucHljLy5weW8gZmlsZXMgLi4uDQpkaWZmIC0tZ2l0IGEvUENidWlsZC94eGxpbWl0ZWQudmN4cHJvaiBiL1BDYnVpbGQveHhsaW1pdGVkLnZjeHByb2oKaW5kZXggMDE0NGZhOS4uOWRiZGM3NyAxMDA2NDQKLS0tIGEvUENidWlsZC94eGxpbWl0ZWQudmN4cHJvagorKysgYi9QQ2J1aWxkL3h4bGltaXRlZC52Y3hwcm9qCkBAIC02Miw3ICs2Miw3IEBACiAgIDwvUHJvcGVydHlHcm91cD4KICAgPEl0ZW1EZWZpbml0aW9uR3JvdXA+CiAgICAgPENsQ29tcGlsZT4KLSAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTtQeV9MSU1JVEVEX0FQST0weDAzMDUwMDAwPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4lKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTtQeV9MSU1JVEVEX0FQST0weDAzMDYwMDAwPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4KICAgICA8L0NsQ29tcGlsZT4KICAgICA8TGluaz4KICAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPndzb2NrMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+CmRpZmYgLS1naXQgYS9QYXJzZXIvUHl0aG9uLmFzZGwgYi9QYXJzZXIvUHl0aG9uLmFzZGwKaW5kZXggY2QwODMyZC4uYWFkZGY2MSAxMDA2NDQKLS0tIGEvUGFyc2VyL1B5dGhvbi5hc2RsCisrKyBiL1BhcnNlci9QeXRob24uYXNkbApAQCAtMSw0ICsxLDggQEAKLS0tIEFTREwncyBzaXggYnVpbHRpbiB0eXBlcyBhcmUgaWRlbnRpZmllciwgaW50LCBzdHJpbmcsIGJ5dGVzLCBvYmplY3QsIHNpbmdsZXRvbgorLS0gQVNETCdzIDcgYnVpbHRpbiB0eXBlcyBhcmU6CistLSBpZGVudGlmaWVyLCBpbnQsIHN0cmluZywgYnl0ZXMsIG9iamVjdCwgc2luZ2xldG9uLCBjb25zdGFudAorLS0KKy0tIHNpbmdsZXRvbjogTm9uZSwgVHJ1ZSBvciBGYWxzZQorLS0gY29uc3RhbnQgY2FuIGJlIE5vbmUsIHdoZXJlYXMgTm9uZSBtZWFucyAibm8gdmFsdWUiIGZvciBvYmplY3QuCiAKIG1vZHVsZSBQeXRob24KIHsKQEAgLTcxLDkgKzc1LDEyIEBACiAgICAgICAgICB8IENhbGwoZXhwciBmdW5jLCBleHByKiBhcmdzLCBrZXl3b3JkKiBrZXl3b3JkcykKICAgICAgICAgIHwgTnVtKG9iamVjdCBuKSAtLSBhIG51bWJlciBhcyBhIFB5T2JqZWN0LgogICAgICAgICAgfCBTdHIoc3RyaW5nIHMpIC0tIG5lZWQgdG8gc3BlY2lmeSByYXcsIHVuaWNvZGUsIGV0Yz8KKyAgICAgICAgIHwgRm9ybWF0dGVkVmFsdWUoZXhwciB2YWx1ZSwgaW50PyBjb252ZXJzaW9uLCBleHByPyBmb3JtYXRfc3BlYykKKyAgICAgICAgIHwgSm9pbmVkU3RyKGV4cHIqIHZhbHVlcykKICAgICAgICAgIHwgQnl0ZXMoYnl0ZXMgcykKICAgICAgICAgIHwgTmFtZUNvbnN0YW50KHNpbmdsZXRvbiB2YWx1ZSkKICAgICAgICAgIHwgRWxsaXBzaXMKKyAgICAgICAgIHwgQ29uc3RhbnQoY29uc3RhbnQgdmFsdWUpCiAKICAgICAgICAgIC0tIHRoZSBmb2xsb3dpbmcgZXhwcmVzc2lvbiBjYW4gYXBwZWFyIGluIGFzc2lnbm1lbnQgY29udGV4dAogICAgICAgICAgfCBBdHRyaWJ1dGUoZXhwciB2YWx1ZSwgaWRlbnRpZmllciBhdHRyLCBleHByX2NvbnRleHQgY3R4KQpkaWZmIC0tZ2l0IGEvUGFyc2VyL2FzZGwucHkgYi9QYXJzZXIvYXNkbC5weQppbmRleCAxMjFjZGFiLi42MmY1YzE5IDEwMDY0NAotLS0gYS9QYXJzZXIvYXNkbC5weQorKysgYi9QYXJzZXIvYXNkbC5weQpAQCAtMzMsNyArMzMsOCBAQAogIyBTZWUgdGhlIEVCTkYgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSB0byB1bmRlcnN0YW5kIHRoZSBsb2dpY2FsIGNvbm5lY3Rpb24KICMgYmV0d2VlbiB0aGUgdmFyaW91cyBub2RlIHR5cGVzLgogCi1idWlsdGluX3R5cGVzID0geydpZGVudGlmaWVyJywgJ3N0cmluZycsICdieXRlcycsICdpbnQnLCAnb2JqZWN0JywgJ3NpbmdsZXRvbid9CitidWlsdGluX3R5cGVzID0geydpZGVudGlmaWVyJywgJ3N0cmluZycsICdieXRlcycsICdpbnQnLCAnb2JqZWN0JywgJ3NpbmdsZXRvbicsCisgICAgICAgICAgICAgICAgICdjb25zdGFudCd9CiAKIGNsYXNzIEFTVDoKICAgICBkZWYgX19yZXByX18oc2VsZik6CmRpZmYgLS1naXQgYS9QYXJzZXIvYXNkbF9jLnB5IGIvUGFyc2VyL2FzZGxfYy5weQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmluZGV4IGYzOGMyNTMuLjE3Yzg1MTcKLS0tIGEvUGFyc2VyL2FzZGxfYy5weQorKysgYi9QYXJzZXIvYXNkbF9jLnB5CkBAIC04MzQsNiArODM0LDcgQEAKICAgICByZXR1cm4gKFB5T2JqZWN0KilvOwogfQogI2RlZmluZSBhc3Qyb2JqX3NpbmdsZXRvbiBhc3Qyb2JqX29iamVjdAorI2RlZmluZSBhc3Qyb2JqX2NvbnN0YW50IGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfaWRlbnRpZmllciBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX3N0cmluZyBhc3Qyb2JqX29iamVjdAogI2RlZmluZSBhc3Qyb2JqX2J5dGVzIGFzdDJvYmpfb2JqZWN0CkBAIC04NzEsNiArODcyLDE5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb2JqMmFzdF9jb25zdGFudChQeU9iamVjdCogb2JqLCBQeU9iamVjdCoqIG91dCwgUHlBcmVuYSogYXJlbmEpCit7CisgICAgaWYgKG9iaikgeworICAgICAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChhcmVuYSwgb2JqKSA8IDApIHsKKyAgICAgICAgICAgICpvdXQgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgIH0KKyAgICAqb3V0ID0gb2JqOworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG9iajJhc3RfaWRlbnRpZmllcihQeU9iamVjdCogb2JqLCBQeU9iamVjdCoqIG91dCwgUHlBcmVuYSogYXJlbmEpCiB7CiAgICAgaWYgKCFQeVVuaWNvZGVfQ2hlY2tFeGFjdChvYmopICYmIG9iaiAhPSBQeV9Ob25lKSB7CkBAIC05MDYsNyArOTIwLDcgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgaSA9IChpbnQpUHlMb25nX0FzTG9uZyhvYmopOworICAgIGkgPSBfUHlMb25nX0FzSW50KG9iaik7CiAgICAgaWYgKGkgPT0gLTEgJiYgUHlFcnJfT2NjdXJyZWQoKSkKICAgICAgICAgcmV0dXJuIDE7CiAgICAgKm91dCA9IGk7CmRpZmYgLS1naXQgYS9QYXJzZXIvcGFyc2VyLmMgYi9QYXJzZXIvcGFyc2VyLmMKaW5kZXggNTZlYzUxNC4uNDEwNzJjNCAxMDA2NDQKLS0tIGEvUGFyc2VyL3BhcnNlci5jCisrKyBiL1BhcnNlci9wYXJzZXIuYwpAQCAtMTQwLDIxICsxNDAsMjAgQEAKICAgICBpbnQgbiA9IGctPmdfbGwubGxfbmxhYmVsczsKIAogICAgIGlmICh0eXBlID09IE5BTUUpIHsKLSAgICAgICAgY29uc3QgY2hhciAqcyA9IHN0cjsKICAgICAgICAgbGFiZWwgKmwgPSBnLT5nX2xsLmxsX2xhYmVsOwogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gbjsgaSA+IDA7IGktLSwgbCsrKSB7CiAgICAgICAgICAgICBpZiAobC0+bGJfdHlwZSAhPSBOQU1FIHx8IGwtPmxiX3N0ciA9PSBOVUxMIHx8Ci0gICAgICAgICAgICAgICAgbC0+bGJfc3RyWzBdICE9IHNbMF0gfHwKLSAgICAgICAgICAgICAgICBzdHJjbXAobC0+bGJfc3RyLCBzKSAhPSAwKQorICAgICAgICAgICAgICAgIGwtPmxiX3N0clswXSAhPSBzdHJbMF0gfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAobC0+bGJfc3RyLCBzdHIpICE9IDApCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAjaWZkZWYgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECiAjaWYgMAogICAgICAgICAgICAgLyogTGVhdmluZyB0aGlzIGluIGFzIGFuIGV4YW1wbGUgKi8KICAgICAgICAgICAgIGlmICghKHBzLT5wX2ZsYWdzICYgQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UKSkgewotICAgICAgICAgICAgICAgIGlmIChzWzBdID09ICd3JyAmJiBzdHJjbXAocywgIndpdGgiKSA9PSAwKQorICAgICAgICAgICAgICAgIGlmIChzdHJbMF0gPT0gJ3cnICYmIHN0cmNtcChzdHIsICJ3aXRoIikgPT0gMCkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIG5vdCBhIGtleXdvcmQgeWV0ICovCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc1swXSA9PSAnYScgJiYgc3RyY21wKHMsICJhcyIpID09IDApCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyWzBdID09ICdhJyAmJiBzdHJjbXAoc3RyLCAiYXMiKSA9PSAwKQogICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogbm90IGEga2V5d29yZCB5ZXQgKi8KICAgICAgICAgICAgIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BhcnNldG9rLmMgYi9QYXJzZXIvcGFyc2V0b2suYwppbmRleCA2MjlkZWU1Li5lYmU5NDk1IDEwMDY0NAotLS0gYS9QYXJzZXIvcGFyc2V0b2suYworKysgYi9QYXJzZXIvcGFyc2V0b2suYwpAQCAtMTYxLDEwICsxNjEsMTAgQEAKIAogI2lmZGVmIFBZX1BBUlNFUl9SRVFVSVJFU19GVVRVUkVfS0VZV09SRAogI2lmIDAKLXN0YXRpYyBjaGFyIHdpdGhfbXNnW10gPQorc3RhdGljIGNvbnN0IGNoYXIgd2l0aF9tc2dbXSA9CiAiJXM6JWQ6IFdhcm5pbmc6ICd3aXRoJyB3aWxsIGJlY29tZSBhIHJlc2VydmVkIGtleXdvcmQgaW4gUHl0aG9uIDIuNlxuIjsKIAotc3RhdGljIGNoYXIgYXNfbXNnW10gPQorc3RhdGljIGNvbnN0IGNoYXIgYXNfbXNnW10gPQogIiVzOiVkOiBXYXJuaW5nOiAnYXMnIHdpbGwgYmVjb21lIGEgcmVzZXJ2ZWQga2V5d29yZCBpbiBQeXRob24gMi42XG4iOwogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvUGFyc2VyL3BnZW4uYyBiL1BhcnNlci9wZ2VuLmMKaW5kZXggZjMwMzFhZS4uYmUzNWUwMiAxMDA2NDQKLS0tIGEvUGFyc2VyL3BnZW4uYworKysgYi9QYXJzZXIvcGdlbi5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogI2lmZGVmIFB5X0RFQlVHCiAKLXN0YXRpYyBjaGFyIFJFUU5GTVRbXSA9ICJtZXRhY29tcGlsZTogbGVzcyB0aGFuICVkIGNoaWxkcmVuXG4iOworc3RhdGljIGNvbnN0IGNoYXIgUkVRTkZNVFtdID0gIm1ldGFjb21waWxlOiBsZXNzIHRoYW4gJWQgY2hpbGRyZW5cbiI7CiAKICNkZWZpbmUgUkVRTihpLCBjb3VudCkgZG8geyBcCiAgICAgaWYgKGkgPCBjb3VudCkgeyBcCkBAIC0zNzksNyArMzc5LDcgQEAKIAogLyogRm9yd2FyZCAqLwogc3RhdGljIHZvaWQgcHJpbnRzc2RmYShpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlLCBpbnQgbmJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNoYXIgKm1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsbGlzdCAqbGwsIGNvbnN0IGNoYXIgKm1zZyk7CiBzdGF0aWMgdm9pZCBzaW1wbGlmeShpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlKTsKIHN0YXRpYyB2b2lkIGNvbnZlcnQoZGZhICpkLCBpbnQgeHhfbnN0YXRlcywgc3Nfc3RhdGUgKnh4X3N0YXRlKTsKIApAQCAtNDk0LDcgKzQ5NCw3IEBACiAKIHN0YXRpYyB2b2lkCiBwcmludHNzZGZhKGludCB4eF9uc3RhdGVzLCBzc19zdGF0ZSAqeHhfc3RhdGUsIGludCBuYml0cywKLSAgICAgICAgICAgbGFiZWxsaXN0ICpsbCwgY2hhciAqbXNnKQorICAgICAgICAgICBsYWJlbGxpc3QgKmxsLCBjb25zdCBjaGFyICptc2cpCiB7CiAgICAgaW50IGksIGliaXQsIGlhcmM7CiAgICAgc3Nfc3RhdGUgKnl5OwpkaWZmIC0tZ2l0IGEvUGFyc2VyL3BnZW5tYWluLmMgYi9QYXJzZXIvcGdlbm1haW4uYwppbmRleCAwZjA1NWQ2Li5lOWQzMDgyIDEwMDY0NAotLS0gYS9QYXJzZXIvcGdlbm1haW4uYworKysgYi9QYXJzZXIvcGdlbm1haW4uYwpAQCAtMjcsNyArMjcsNyBAQAogaW50IFB5X0lnbm9yZUVudmlyb25tZW50RmxhZzsKIAogLyogRm9yd2FyZCAqLwotZ3JhbW1hciAqZ2V0Z3JhbW1hcihjaGFyICpmaWxlbmFtZSk7CitncmFtbWFyICpnZXRncmFtbWFyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKIAogdm9pZCBQeV9FeGl0KGludCkgX1B5X05PX1JFVFVSTjsKIApAQCAtMzcsNiArMzcsMTUgQEAKICAgICBleGl0KHN0cyk7CiB9CiAKKyNpZmRlZiBXSVRIX1RIUkVBRAorLyogTmVlZGVkIGJ5IG9ibWFsbG9jLmMgKi8KK2ludCBQeUdJTFN0YXRlX0NoZWNrKHZvaWQpCit7IHJldHVybiAxOyB9CisjZW5kaWYKKwordm9pZCBfUHlNZW1fRHVtcFRyYWNlYmFjayhpbnQgZmQsIGNvbnN0IHZvaWQgKnB0cikKK3t9CisKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CkBAIC03Niw3ICs4NSw3IEBACiB9CiAKIGdyYW1tYXIgKgotZ2V0Z3JhbW1hcihjaGFyICpmaWxlbmFtZSkKK2dldGdyYW1tYXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAgICAgRklMRSAqZnA7CiAgICAgbm9kZSAqbjsKZGlmZiAtLWdpdCBhL1BhcnNlci90b2tlbml6ZXIuYyBiL1BhcnNlci90b2tlbml6ZXIuYwppbmRleCAxODRmZmU3Li45MGE4MjcwIDEwMDY0NAotLS0gYS9QYXJzZXIvdG9rZW5pemVyLmMKKysrIGIvUGFyc2VyL3Rva2VuaXplci5jCkBAIC0yMDIsOCArMjAyLDggQEAKIH0KIAogCi1zdGF0aWMgY2hhciAqCi1nZXRfbm9ybWFsX25hbWUoY2hhciAqcykgICAgICAgIC8qIGZvciB1dGYtOCBhbmQgbGF0aW4tMSAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorZ2V0X25vcm1hbF9uYW1lKGNvbnN0IGNoYXIgKnMpICAvKiBmb3IgdXRmLTggYW5kIGxhdGluLTEgKi8KIHsKICAgICBjaGFyIGJ1ZlsxM107CiAgICAgaW50IGk7CkBAIC0yNjQsNyArMjY0LDcgQEAKIAogICAgICAgICAgICAgaWYgKGJlZ2luIDwgdCkgewogICAgICAgICAgICAgICAgIGNoYXIqIHIgPSBuZXdfc3RyaW5nKGJlZ2luLCB0IC0gYmVnaW4sIHRvayk7Ci0gICAgICAgICAgICAgICAgY2hhciogcTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBxOwogICAgICAgICAgICAgICAgIGlmICghcikKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgcSA9IGdldF9ub3JtYWxfbmFtZShyKTsKQEAgLTE0NzUsMTcgKzE0NzUsMTkgQEAKICAgICBub25hc2NpaSA9IDA7CiAgICAgaWYgKGlzX3BvdGVudGlhbF9pZGVudGlmaWVyX3N0YXJ0KGMpKSB7CiAgICAgICAgIC8qIFByb2Nlc3MgYiIiLCByIiIsIHUiIiwgYnIiIiBhbmQgcmIiIiAqLwotICAgICAgICBpbnQgc2F3X2IgPSAwLCBzYXdfciA9IDAsIHNhd191ID0gMDsKKyAgICAgICAgaW50IHNhd19iID0gMCwgc2F3X3IgPSAwLCBzYXdfdSA9IDAsIHNhd19mID0gMDsKICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIGlmICghKHNhd19iIHx8IHNhd191KSAmJiAoYyA9PSAnYicgfHwgYyA9PSAnQicpKQorICAgICAgICAgICAgaWYgKCEoc2F3X2IgfHwgc2F3X3UgfHwgc2F3X2YpICYmIChjID09ICdiJyB8fCBjID09ICdCJykpCiAgICAgICAgICAgICAgICAgc2F3X2IgPSAxOwogICAgICAgICAgICAgLyogU2luY2UgdGhpcyBpcyBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1cHBvcnQgbGl0ZXJhbCB3ZSBkb24ndAogICAgICAgICAgICAgICAgd2FudCB0byBzdXBwb3J0IGl0IGluIGFyYml0cmFyeSBvcmRlciBsaWtlIGJ5dGUgbGl0ZXJhbHMuICovCi0gICAgICAgICAgICBlbHNlIGlmICghKHNhd19iIHx8IHNhd191IHx8IHNhd19yKSAmJiAoYyA9PSAndScgfHwgYyA9PSAnVScpKQorICAgICAgICAgICAgZWxzZSBpZiAoIShzYXdfYiB8fCBzYXdfdSB8fCBzYXdfciB8fCBzYXdfZikgJiYgKGMgPT0gJ3UnIHx8IGMgPT0gJ1UnKSkKICAgICAgICAgICAgICAgICBzYXdfdSA9IDE7CiAgICAgICAgICAgICAvKiB1ciIiIGFuZCBydSIiIGFyZSBub3Qgc3VwcG9ydGVkICovCiAgICAgICAgICAgICBlbHNlIGlmICghKHNhd19yIHx8IHNhd191KSAmJiAoYyA9PSAncicgfHwgYyA9PSAnUicpKQogICAgICAgICAgICAgICAgIHNhd19yID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCEoc2F3X2YgfHwgc2F3X2IgfHwgc2F3X3UpICYmIChjID09ICdmJyB8fCBjID09ICdGJykpCisgICAgICAgICAgICAgICAgc2F3X2YgPSAxOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOwpAQCAtMTU4NSwxMCArMTU4Nyw2IEBACiAgICAgICAgIGlmIChjID09ICcwJykgewogICAgICAgICAgICAgLyogSGV4LCBvY3RhbCBvciBiaW5hcnkgLS0gbWF5YmUuICovCiAgICAgICAgICAgICBjID0gdG9rX25leHRjKHRvayk7Ci0gICAgICAgICAgICBpZiAoYyA9PSAnLicpCi0gICAgICAgICAgICAgICAgZ290byBmcmFjdGlvbjsKLSAgICAgICAgICAgIGlmIChjID09ICdqJyB8fCBjID09ICdKJykKLSAgICAgICAgICAgICAgICBnb3RvIGltYWdpbmFyeTsKICAgICAgICAgICAgIGlmIChjID09ICd4JyB8fCBjID09ICdYJykgewogCiAgICAgICAgICAgICAgICAgLyogSGV4ICovCkBAIC0xNzM5LDcgKzE3MzcsNyBAQAogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgZW5kX3F1b3RlX3NpemUgPSAwOwogICAgICAgICAgICAgICAgIGlmIChjID09ICdcXCcpCi0gICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOyAgLyogc2tpcCBlc2NhcGVkIGNoYXIgKi8KKyAgICAgICAgICAgICAgICAgICAgYyA9IHRva19uZXh0Yyh0b2spOyAgLyogc2tpcCBlc2NhcGVkIGNoYXIgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9Qcm9ncmFtcy9weXRob24uYyBiL1Byb2dyYW1zL3B5dGhvbi5jCmluZGV4IDM3YjEwYjguLmE3YWZiYzcgMTAwNjQ0Ci0tLSBhL1Byb2dyYW1zL3B5dGhvbi5jCisrKyBiL1Byb2dyYW1zL3B5dGhvbi5jCkBAIC0yNCw2ICsyNCw5IEBACiAgICAgaW50IGksIHJlczsKICAgICBjaGFyICpvbGRsb2M7CiAKKyAgICAvKiBGb3JjZSBtYWxsb2MoKSBhbGxvY2F0b3IgdG8gYm9vdHN0cmFwIFB5dGhvbiAqLworICAgICh2b2lkKV9QeU1lbV9TZXR1cEFsbG9jYXRvcnMoIm1hbGxvYyIpOworCiAgICAgYXJndl9jb3B5ID0gKHdjaGFyX3QgKiopUHlNZW1fUmF3TWFsbG9jKHNpemVvZih3Y2hhcl90KikgKiAoYXJnYysxKSk7CiAgICAgYXJndl9jb3B5MiA9ICh3Y2hhcl90ICoqKVB5TWVtX1Jhd01hbGxvYyhzaXplb2Yod2NoYXJfdCopICogKGFyZ2MrMSkpOwogICAgIGlmICghYXJndl9jb3B5IHx8ICFhcmd2X2NvcHkyKSB7CkBAIC02Miw3ICs2NSwxMyBAQAogCiAgICAgc2V0bG9jYWxlKExDX0FMTCwgb2xkbG9jKTsKICAgICBQeU1lbV9SYXdGcmVlKG9sZGxvYyk7CisKICAgICByZXMgPSBQeV9NYWluKGFyZ2MsIGFyZ3ZfY29weSk7CisKKyAgICAvKiBGb3JjZSBhZ2FpbiBtYWxsb2MoKSBhbGxvY2F0b3IgdG8gcmVsZWFzZSBtZW1vcnkgYmxvY2tzIGFsbG9jYXRlZAorICAgICAgIGJlZm9yZSBQeV9NYWluKCkgKi8KKyAgICAodm9pZClfUHlNZW1fU2V0dXBBbGxvY2F0b3JzKCJtYWxsb2MiKTsKKwogICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgUHlNZW1fUmF3RnJlZShhcmd2X2NvcHkyW2ldKTsKICAgICB9CmRpZmYgLS1naXQgYS9QeXRob24vUHl0aG9uLWFzdC5jIGIvUHl0aG9uL1B5dGhvbi1hc3QuYwppbmRleCBlZGZjYmFkLi4xMTkzYzdjIDEwMDY0NAotLS0gYS9QeXRob24vUHl0aG9uLWFzdC5jCisrKyBiL1B5dGhvbi9QeXRob24tYXN0LmMKQEAgLTI4NSw2ICsyODUsMTggQEAKIHN0YXRpYyBjaGFyICpTdHJfZmllbGRzW109ewogICAgICJzIiwKIH07CitzdGF0aWMgUHlUeXBlT2JqZWN0ICpGb3JtYXR0ZWRWYWx1ZV90eXBlOworX1B5X0lERU5USUZJRVIoY29udmVyc2lvbik7CitfUHlfSURFTlRJRklFUihmb3JtYXRfc3BlYyk7CitzdGF0aWMgY2hhciAqRm9ybWF0dGVkVmFsdWVfZmllbGRzW109eworICAgICJ2YWx1ZSIsCisgICAgImNvbnZlcnNpb24iLAorICAgICJmb3JtYXRfc3BlYyIsCit9Oworc3RhdGljIFB5VHlwZU9iamVjdCAqSm9pbmVkU3RyX3R5cGU7CitzdGF0aWMgY2hhciAqSm9pbmVkU3RyX2ZpZWxkc1tdPXsKKyAgICAidmFsdWVzIiwKK307CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpCeXRlc190eXBlOwogc3RhdGljIGNoYXIgKkJ5dGVzX2ZpZWxkc1tdPXsKICAgICAicyIsCkBAIC0yOTQsNiArMzA2LDEwIEBACiAgICAgInZhbHVlIiwKIH07CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpFbGxpcHNpc190eXBlOworc3RhdGljIFB5VHlwZU9iamVjdCAqQ29uc3RhbnRfdHlwZTsKK3N0YXRpYyBjaGFyICpDb25zdGFudF9maWVsZHNbXT17CisgICAgInZhbHVlIiwKK307CiBzdGF0aWMgUHlUeXBlT2JqZWN0ICpBdHRyaWJ1dGVfdHlwZTsKIF9QeV9JREVOVElGSUVSKGF0dHIpOwogX1B5X0lERU5USUZJRVIoY3R4KTsKQEAgLTY5Nyw2ICs3MTMsNyBAQAogICAgIHJldHVybiAoUHlPYmplY3QqKW87CiB9CiAjZGVmaW5lIGFzdDJvYmpfc2luZ2xldG9uIGFzdDJvYmpfb2JqZWN0CisjZGVmaW5lIGFzdDJvYmpfY29uc3RhbnQgYXN0Mm9ial9vYmplY3QKICNkZWZpbmUgYXN0Mm9ial9pZGVudGlmaWVyIGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfc3RyaW5nIGFzdDJvYmpfb2JqZWN0CiAjZGVmaW5lIGFzdDJvYmpfYnl0ZXMgYXN0Mm9ial9vYmplY3QKQEAgLTczNCw2ICs3NTEsMTkgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvYmoyYXN0X2NvbnN0YW50KFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0Kiogb3V0LCBQeUFyZW5hKiBhcmVuYSkKK3sKKyAgICBpZiAob2JqKSB7CisgICAgICAgIGlmIChQeUFyZW5hX0FkZFB5T2JqZWN0KGFyZW5hLCBvYmopIDwgMCkgeworICAgICAgICAgICAgKm91dCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgfQorICAgICpvdXQgPSBvYmo7CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgb2JqMmFzdF9pZGVudGlmaWVyKFB5T2JqZWN0KiBvYmosIFB5T2JqZWN0Kiogb3V0LCBQeUFyZW5hKiBhcmVuYSkKIHsKICAgICBpZiAoIVB5VW5pY29kZV9DaGVja0V4YWN0KG9iaikgJiYgb2JqICE9IFB5X05vbmUpIHsKQEAgLTc2OSw3ICs3OTksNyBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBpID0gKGludClQeUxvbmdfQXNMb25nKG9iaik7CisgICAgaSA9IF9QeUxvbmdfQXNJbnQob2JqKTsKICAgICBpZiAoaSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICByZXR1cm4gMTsKICAgICAqb3V0ID0gaTsKQEAgLTkxNyw2ICs5NDcsMTEgQEAKICAgICBpZiAoIU51bV90eXBlKSByZXR1cm4gMDsKICAgICBTdHJfdHlwZSA9IG1ha2VfdHlwZSgiU3RyIiwgZXhwcl90eXBlLCBTdHJfZmllbGRzLCAxKTsKICAgICBpZiAoIVN0cl90eXBlKSByZXR1cm4gMDsKKyAgICBGb3JtYXR0ZWRWYWx1ZV90eXBlID0gbWFrZV90eXBlKCJGb3JtYXR0ZWRWYWx1ZSIsIGV4cHJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdHRlZFZhbHVlX2ZpZWxkcywgMyk7CisgICAgaWYgKCFGb3JtYXR0ZWRWYWx1ZV90eXBlKSByZXR1cm4gMDsKKyAgICBKb2luZWRTdHJfdHlwZSA9IG1ha2VfdHlwZSgiSm9pbmVkU3RyIiwgZXhwcl90eXBlLCBKb2luZWRTdHJfZmllbGRzLCAxKTsKKyAgICBpZiAoIUpvaW5lZFN0cl90eXBlKSByZXR1cm4gMDsKICAgICBCeXRlc190eXBlID0gbWFrZV90eXBlKCJCeXRlcyIsIGV4cHJfdHlwZSwgQnl0ZXNfZmllbGRzLCAxKTsKICAgICBpZiAoIUJ5dGVzX3R5cGUpIHJldHVybiAwOwogICAgIE5hbWVDb25zdGFudF90eXBlID0gbWFrZV90eXBlKCJOYW1lQ29uc3RhbnQiLCBleHByX3R5cGUsCkBAIC05MjQsNiArOTU5LDggQEAKICAgICBpZiAoIU5hbWVDb25zdGFudF90eXBlKSByZXR1cm4gMDsKICAgICBFbGxpcHNpc190eXBlID0gbWFrZV90eXBlKCJFbGxpcHNpcyIsIGV4cHJfdHlwZSwgTlVMTCwgMCk7CiAgICAgaWYgKCFFbGxpcHNpc190eXBlKSByZXR1cm4gMDsKKyAgICBDb25zdGFudF90eXBlID0gbWFrZV90eXBlKCJDb25zdGFudCIsIGV4cHJfdHlwZSwgQ29uc3RhbnRfZmllbGRzLCAxKTsKKyAgICBpZiAoIUNvbnN0YW50X3R5cGUpIHJldHVybiAwOwogICAgIEF0dHJpYnV0ZV90eXBlID0gbWFrZV90eXBlKCJBdHRyaWJ1dGUiLCBleHByX3R5cGUsIEF0dHJpYnV0ZV9maWVsZHMsIDMpOwogICAgIGlmICghQXR0cmlidXRlX3R5cGUpIHJldHVybiAwOwogICAgIFN1YnNjcmlwdF90eXBlID0gbWFrZV90eXBlKCJTdWJzY3JpcHQiLCBleHByX3R5cGUsIFN1YnNjcmlwdF9maWVsZHMsIDMpOwpAQCAtMjA2Myw2ICsyMTAwLDQyIEBACiB9CiAKIGV4cHJfdHkKK0Zvcm1hdHRlZFZhbHVlKGV4cHJfdHkgdmFsdWUsIGludCBjb252ZXJzaW9uLCBleHByX3R5IGZvcm1hdF9zcGVjLCBpbnQgbGluZW5vLAorICAgICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImZpZWxkIHZhbHVlIGlzIHJlcXVpcmVkIGZvciBGb3JtYXR0ZWRWYWx1ZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcCA9IChleHByX3R5KVB5QXJlbmFfTWFsbG9jKGFyZW5hLCBzaXplb2YoKnApKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAtPmtpbmQgPSBGb3JtYXR0ZWRWYWx1ZV9raW5kOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUgPSB2YWx1ZTsKKyAgICBwLT52LkZvcm1hdHRlZFZhbHVlLmNvbnZlcnNpb24gPSBjb252ZXJzaW9uOworICAgIHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMgPSBmb3JtYXRfc3BlYzsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKK0pvaW5lZFN0cihhc2RsX3NlcSAqIHZhbHVlcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKQoreworICAgIGV4cHJfdHkgcDsKKyAgICBwID0gKGV4cHJfdHkpUHlBcmVuYV9NYWxsb2MoYXJlbmEsIHNpemVvZigqcCkpOworICAgIGlmICghcCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcC0+a2luZCA9IEpvaW5lZFN0cl9raW5kOworICAgIHAtPnYuSm9pbmVkU3RyLnZhbHVlcyA9IHZhbHVlczsKKyAgICBwLT5saW5lbm8gPSBsaW5lbm87CisgICAgcC0+Y29sX29mZnNldCA9IGNvbF9vZmZzZXQ7CisgICAgcmV0dXJuIHA7Cit9CisKK2V4cHJfdHkKIEJ5dGVzKGJ5dGVzIHMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSkKIHsKICAgICBleHByX3R5IHA7CkBAIC0yMTE0LDYgKzIxODcsMjUgQEAKIH0KIAogZXhwcl90eQorQ29uc3RhbnQoY29uc3RhbnQgdmFsdWUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSkKK3sKKyAgICBleHByX3R5IHA7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgQ29uc3RhbnQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHAgPSAoZXhwcl90eSlQeUFyZW5hX01hbGxvYyhhcmVuYSwgc2l6ZW9mKCpwKSk7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBwLT5raW5kID0gQ29uc3RhbnRfa2luZDsKKyAgICBwLT52LkNvbnN0YW50LnZhbHVlID0gdmFsdWU7CisgICAgcC0+bGluZW5vID0gbGluZW5vOworICAgIHAtPmNvbF9vZmZzZXQgPSBjb2xfb2Zmc2V0OworICAgIHJldHVybiBwOworfQorCitleHByX3R5CiBBdHRyaWJ1dGUoZXhwcl90eSB2YWx1ZSwgaWRlbnRpZmllciBhdHRyLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQgbGluZW5vLCBpbnQKICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSkKIHsKQEAgLTMxNjQsNiArMzI1NiwzNCBAQAogICAgICAgICAgICAgZ290byBmYWlsZWQ7CiAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKKyAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoRm9ybWF0dGVkVmFsdWVfdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2V4cHIoby0+di5Gb3JtYXR0ZWRWYWx1ZS52YWx1ZSk7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX3ZhbHVlLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2ludChvLT52LkZvcm1hdHRlZFZhbHVlLmNvbnZlcnNpb24pOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF9jb252ZXJzaW9uLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2V4cHIoby0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyk7CisgICAgICAgIGlmICghdmFsdWUpIGdvdG8gZmFpbGVkOworICAgICAgICBpZiAoX1B5T2JqZWN0X1NldEF0dHJJZChyZXN1bHQsICZQeUlkX2Zvcm1hdF9zcGVjLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKb2luZWRTdHJfa2luZDoKKyAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoSm9pbmVkU3RyX3R5cGUsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CisgICAgICAgIHZhbHVlID0gYXN0Mm9ial9saXN0KG8tPnYuSm9pbmVkU3RyLnZhbHVlcywgYXN0Mm9ial9leHByKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkgZ290byBmYWlsZWQ7CisgICAgICAgIGlmIChfUHlPYmplY3RfU2V0QXR0cklkKHJlc3VsdCwgJlB5SWRfdmFsdWVzLCB2YWx1ZSkgPT0gLTEpCisgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBCeXRlc19raW5kOgogICAgICAgICByZXN1bHQgPSBQeVR5cGVfR2VuZXJpY05ldyhCeXRlc190eXBlLCBOVUxMLCBOVUxMKTsKICAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOwpAQCAtMzE4Niw2ICszMzA2LDE1IEBACiAgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEVsbGlwc2lzX3R5cGUsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAoIXJlc3VsdCkgZ290byBmYWlsZWQ7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKKyAgICAgICAgcmVzdWx0ID0gUHlUeXBlX0dlbmVyaWNOZXcoQ29uc3RhbnRfdHlwZSwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmICghcmVzdWx0KSBnb3RvIGZhaWxlZDsKKyAgICAgICAgdmFsdWUgPSBhc3Qyb2JqX2NvbnN0YW50KG8tPnYuQ29uc3RhbnQudmFsdWUpOworICAgICAgICBpZiAoIXZhbHVlKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgaWYgKF9QeU9iamVjdF9TZXRBdHRySWQocmVzdWx0LCAmUHlJZF92YWx1ZSwgdmFsdWUpID09IC0xKQorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQXR0cmlidXRlX2tpbmQ6CiAgICAgICAgIHJlc3VsdCA9IFB5VHlwZV9HZW5lcmljTmV3KEF0dHJpYnV0ZV90eXBlLCBOVUxMLCBOVUxMKTsKICAgICAgICAgaWYgKCFyZXN1bHQpIGdvdG8gZmFpbGVkOwpAQCAtNjAyNSw2ICs2MTU0LDg2IEBACiAgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUZvcm1hdHRlZFZhbHVlX3R5cGUpOworICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoaXNpbnN0YW5jZSkgeworICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICBpbnQgY29udmVyc2lvbjsKKyAgICAgICAgZXhwcl90eSBmb3JtYXRfc3BlYzsKKworICAgICAgICBpZiAoX1B5T2JqZWN0X0hhc0F0dHJJZChvYmosICZQeUlkX3ZhbHVlKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIHRtcCA9IF9QeU9iamVjdF9HZXRBdHRySWQob2JqLCAmUHlJZF92YWx1ZSk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9leHByKHRtcCwgJnZhbHVlLCBhcmVuYSk7CisgICAgICAgICAgICBpZiAocmVzICE9IDApIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgUHlfQ0xFQVIodG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJyZXF1aXJlZCBmaWVsZCBcInZhbHVlXCIgbWlzc2luZyBmcm9tIEZvcm1hdHRlZFZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhpc3RzX25vdF9ub25lKG9iaiwgJlB5SWRfY29udmVyc2lvbikpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfY29udmVyc2lvbik7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgcmVzID0gb2JqMmFzdF9pbnQodG1wLCAmY29udmVyc2lvbiwgYXJlbmEpOworICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIFB5X0NMRUFSKHRtcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb252ZXJzaW9uID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhpc3RzX25vdF9ub25lKG9iaiwgJlB5SWRfZm9ybWF0X3NwZWMpKSB7CisgICAgICAgICAgICBpbnQgcmVzOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX2Zvcm1hdF9zcGVjKTsKKyAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICByZXMgPSBvYmoyYXN0X2V4cHIodG1wLCAmZm9ybWF0X3NwZWMsIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9ybWF0X3NwZWMgPSBOVUxMOworICAgICAgICB9CisgICAgICAgICpvdXQgPSBGb3JtYXR0ZWRWYWx1ZSh2YWx1ZSwgY29udmVyc2lvbiwgZm9ybWF0X3NwZWMsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIGFyZW5hKTsKKyAgICAgICAgaWYgKCpvdXQgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpc2luc3RhbmNlID0gUHlPYmplY3RfSXNJbnN0YW5jZShvYmosIChQeU9iamVjdCopSm9pbmVkU3RyX3R5cGUpOworICAgIGlmIChpc2luc3RhbmNlID09IC0xKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoaXNpbnN0YW5jZSkgeworICAgICAgICBhc2RsX3NlcSogdmFsdWVzOworCisgICAgICAgIGlmIChfUHlPYmplY3RfSGFzQXR0cklkKG9iaiwgJlB5SWRfdmFsdWVzKSkgeworICAgICAgICAgICAgaW50IHJlczsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuOworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgdG1wID0gX1B5T2JqZWN0X0dldEF0dHJJZChvYmosICZQeUlkX3ZhbHVlcyk7CisgICAgICAgICAgICBpZiAodG1wID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgaWYgKCFQeUxpc3RfQ2hlY2sodG1wKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJKb2luZWRTdHIgZmllbGQgXCJ2YWx1ZXNcIiBtdXN0IGJlIGEgbGlzdCwgbm90IGEgJS4yMDBzIiwgdG1wLT5vYl90eXBlLT50cF9uYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiA9IFB5TGlzdF9HRVRfU0laRSh0bXApOworICAgICAgICAgICAgdmFsdWVzID0gX1B5X2FzZGxfc2VxX25ldyhsZW4sIGFyZW5hKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfZXhwcihQeUxpc3RfR0VUX0lURU0odG1wLCBpKSwgJnZhbHVlLCBhcmVuYSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSAwKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQodmFsdWVzLCBpLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcXVpcmVkIGZpZWxkIFwidmFsdWVzXCIgbWlzc2luZyBmcm9tIEpvaW5lZFN0ciIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgKm91dCA9IEpvaW5lZFN0cih2YWx1ZXMsIGxpbmVubywgY29sX29mZnNldCwgYXJlbmEpOworICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilCeXRlc190eXBlKTsKICAgICBpZiAoaXNpbnN0YW5jZSA9PSAtMSkgewogICAgICAgICByZXR1cm4gMTsKQEAgLTYwNzksNiArNjI4OCwyOCBAQAogICAgICAgICBpZiAoKm91dCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGlzaW5zdGFuY2UgPSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0KilDb25zdGFudF90eXBlKTsKKyAgICBpZiAoaXNpbnN0YW5jZSA9PSAtMSkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKGlzaW5zdGFuY2UpIHsKKyAgICAgICAgY29uc3RhbnQgdmFsdWU7CisKKyAgICAgICAgaWYgKF9QeU9iamVjdF9IYXNBdHRySWQob2JqLCAmUHlJZF92YWx1ZSkpIHsKKyAgICAgICAgICAgIGludCByZXM7CisgICAgICAgICAgICB0bXAgPSBfUHlPYmplY3RfR2V0QXR0cklkKG9iaiwgJlB5SWRfdmFsdWUpOworICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJlcyA9IG9iajJhc3RfY29uc3RhbnQodG1wLCAmdmFsdWUsIGFyZW5hKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gMCkgZ290byBmYWlsZWQ7CisgICAgICAgICAgICBQeV9DTEVBUih0bXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInJlcXVpcmVkIGZpZWxkIFwidmFsdWVcIiBtaXNzaW5nIGZyb20gQ29uc3RhbnQiKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICpvdXQgPSBDb25zdGFudCh2YWx1ZSwgbGluZW5vLCBjb2xfb2Zmc2V0LCBhcmVuYSk7CisgICAgICAgIGlmICgqb3V0ID09IE5VTEwpIGdvdG8gZmFpbGVkOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgaXNpbnN0YW5jZSA9IFB5T2JqZWN0X0lzSW5zdGFuY2Uob2JqLCAoUHlPYmplY3QqKUF0dHJpYnV0ZV90eXBlKTsKICAgICBpZiAoaXNpbnN0YW5jZSA9PSAtMSkgewogICAgICAgICByZXR1cm4gMTsKQEAgLTczNDYsMTIgKzc1NzcsMTggQEAKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkNhbGwiLCAoUHlPYmplY3QqKUNhbGxfdHlwZSkgPCAwKSByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIk51bSIsIChQeU9iamVjdCopTnVtX3R5cGUpIDwgMCkgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdHIiLCAoUHlPYmplY3QqKVN0cl90eXBlKSA8IDApIHJldHVybiBOVUxMOworICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRm9ybWF0dGVkVmFsdWUiLAorICAgICAgICAoUHlPYmplY3QqKUZvcm1hdHRlZFZhbHVlX3R5cGUpIDwgMCkgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJKb2luZWRTdHIiLCAoUHlPYmplY3QqKUpvaW5lZFN0cl90eXBlKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiQnl0ZXMiLCAoUHlPYmplY3QqKUJ5dGVzX3R5cGUpIDwgMCkgcmV0dXJuCiAgICAgICAgIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJOYW1lQ29uc3RhbnQiLCAoUHlPYmplY3QqKU5hbWVDb25zdGFudF90eXBlKSA8CiAgICAgICAgIDApIHJldHVybiBOVUxMOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiRWxsaXBzaXMiLCAoUHlPYmplY3QqKUVsbGlwc2lzX3R5cGUpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJDb25zdGFudCIsIChQeU9iamVjdCopQ29uc3RhbnRfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgIkF0dHJpYnV0ZSIsIChQeU9iamVjdCopQXR0cmlidXRlX3R5cGUpIDwgMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJTdWJzY3JpcHQiLCAoUHlPYmplY3QqKVN1YnNjcmlwdF90eXBlKSA8IDApCmRpZmYgLS1naXQgYS9QeXRob24vX3dhcm5pbmdzLmMgYi9QeXRob24vX3dhcm5pbmdzLmMKaW5kZXggOTc4YmFkMS4uNDBmNWM4ZSAxMDA2NDQKLS0tIGEvUHl0aG9uL193YXJuaW5ncy5jCisrKyBiL1B5dGhvbi9fd2FybmluZ3MuYwpAQCAtNDAsMTIgKzQwLDExIEBACiAgICBBIE5VTEwgcmV0dXJuIHZhbHVlIGNhbiBtZWFuIGZhbHNlIG9yIGFuIGVycm9yLgogKi8KIHN0YXRpYyBQeU9iamVjdCAqCi1nZXRfd2FybmluZ3NfYXR0cihjb25zdCBjaGFyICphdHRyKQorZ2V0X3dhcm5pbmdzX2F0dHIoY29uc3QgY2hhciAqYXR0ciwgaW50IHRyeV9pbXBvcnQpCiB7CiAgICAgc3RhdGljIFB5T2JqZWN0ICp3YXJuaW5nc19zdHIgPSBOVUxMOwogICAgIFB5T2JqZWN0ICphbGxfbW9kdWxlczsKLSAgICBQeU9iamVjdCAqd2FybmluZ3NfbW9kdWxlOwotICAgIGludCByZXN1bHQ7CisgICAgUHlPYmplY3QgKndhcm5pbmdzX21vZHVsZSwgKm9iajsKIAogICAgIGlmICh3YXJuaW5nc19zdHIgPT0gTlVMTCkgewogICAgICAgICB3YXJuaW5nc19zdHIgPSBQeVVuaWNvZGVfSW50ZXJuRnJvbVN0cmluZygid2FybmluZ3MiKTsKQEAgLTUzLDE1ICs1MiwzNCBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgYWxsX21vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7Ci0gICAgcmVzdWx0ID0gUHlEaWN0X0NvbnRhaW5zKGFsbF9tb2R1bGVzLCB3YXJuaW5nc19zdHIpOwotICAgIGlmIChyZXN1bHQgPT0gLTEgfHwgcmVzdWx0ID09IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgd2FybmluZ3NfbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0oYWxsX21vZHVsZXMsIHdhcm5pbmdzX3N0cik7Ci0gICAgaWYgKCFQeU9iamVjdF9IYXNBdHRyU3RyaW5nKHdhcm5pbmdzX21vZHVsZSwgYXR0cikpCisgICAgLyogZG9uJ3QgdHJ5IHRvIGltcG9ydCBhZnRlciB0aGUgc3RhcnQgb2YgdGhlIFB5dGhvbiBmaW5hbGxpemF0aW9uICovCisgICAgaWYgKHRyeV9pbXBvcnQgJiYgX1B5X0ZpbmFsaXppbmcgPT0gTlVMTCkgeworICAgICAgICB3YXJuaW5nc19tb2R1bGUgPSBQeUltcG9ydF9JbXBvcnQod2FybmluZ3Nfc3RyKTsKKyAgICAgICAgaWYgKHdhcm5pbmdzX21vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBGYWxsYmFjayB0byB0aGUgQyBpbXBsZW1lbnRhdGlvbiBpZiB3ZSBjYW5ub3QgZ2V0CisgICAgICAgICAgICAgICB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uICovCisgICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcod2FybmluZ3NfbW9kdWxlLCBhdHRyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgYWxsX21vZHVsZXMgPSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KCk7CisKKyAgICAgICAgd2FybmluZ3NfbW9kdWxlID0gUHlEaWN0X0dldEl0ZW0oYWxsX21vZHVsZXMsIHdhcm5pbmdzX3N0cik7CisgICAgICAgIGlmICh3YXJuaW5nc19tb2R1bGUgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIFB5X0lOQ1JFRih3YXJuaW5nc19tb2R1bGUpOworICAgIH0KKworICAgIGlmICghUHlPYmplY3RfSGFzQXR0clN0cmluZyh3YXJuaW5nc19tb2R1bGUsIGF0dHIpKSB7CisgICAgICAgIFB5X0RFQ1JFRih3YXJuaW5nc19tb2R1bGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBvYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHdhcm5pbmdzX21vZHVsZSwgYXR0cik7CisgICAgUHlfREVDUkVGKHdhcm5pbmdzX21vZHVsZSk7CisgICAgcmV0dXJuIG9iajsKIH0KIAogCkBAIC03MCw3ICs4OCw3IEBACiB7CiAgICAgUHlPYmplY3QgKnJlZ2lzdHJ5OwogCi0gICAgcmVnaXN0cnkgPSBnZXRfd2FybmluZ3NfYXR0cigib25jZXJlZ2lzdHJ5Iik7CisgICAgcmVnaXN0cnkgPSBnZXRfd2FybmluZ3NfYXR0cigib25jZXJlZ2lzdHJ5IiwgMCk7CiAgICAgaWYgKHJlZ2lzdHJ5ID09IE5VTEwpIHsKICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTg3LDcgKzEwNSw3IEBACiB7CiAgICAgUHlPYmplY3QgKmRlZmF1bHRfYWN0aW9uOwogCi0gICAgZGVmYXVsdF9hY3Rpb24gPSBnZXRfd2FybmluZ3NfYXR0cigiZGVmYXVsdGFjdGlvbiIpOworICAgIGRlZmF1bHRfYWN0aW9uID0gZ2V0X3dhcm5pbmdzX2F0dHIoImRlZmF1bHRhY3Rpb24iLCAwKTsKICAgICBpZiAoZGVmYXVsdF9hY3Rpb24gPT0gTlVMTCkgewogICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTAsNyArMTI4LDcgQEAKICAgICBQeV9zc2l6ZV90IGk7CiAgICAgUHlPYmplY3QgKndhcm5pbmdzX2ZpbHRlcnM7CiAKLSAgICB3YXJuaW5nc19maWx0ZXJzID0gZ2V0X3dhcm5pbmdzX2F0dHIoImZpbHRlcnMiKTsKKyAgICB3YXJuaW5nc19maWx0ZXJzID0gZ2V0X3dhcm5pbmdzX2F0dHIoImZpbHRlcnMiLCAwKTsKICAgICBpZiAod2FybmluZ3NfZmlsdGVycyA9PSBOVUxMKSB7CiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0yODcsOCArMzA1LDggQEAKIH0KIAogc3RhdGljIHZvaWQKLXNob3dfd2FybmluZyhQeU9iamVjdCAqZmlsZW5hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0ICp0ZXh0LCBQeU9iamVjdAotICAgICAgICAgICAgICAgICpjYXRlZ29yeSwgUHlPYmplY3QgKnNvdXJjZWxpbmUpCitzaG93X3dhcm5pbmcoUHlPYmplY3QgKmZpbGVuYW1lLCBpbnQgbGluZW5vLCBQeU9iamVjdCAqdGV4dCwKKyAgICAgICAgICAgICBQeU9iamVjdCAqY2F0ZWdvcnksIFB5T2JqZWN0ICpzb3VyY2VsaW5lKQogewogICAgIFB5T2JqZWN0ICpmX3N0ZGVycjsKICAgICBQeU9iamVjdCAqbmFtZTsKQEAgLTM1OSwxMCArMzc3LDY0IEBACiAgICAgUHlFcnJfQ2xlYXIoKTsKIH0KIAorc3RhdGljIGludAorY2FsbF9zaG93X3dhcm5pbmcoUHlPYmplY3QgKmNhdGVnb3J5LCBQeU9iamVjdCAqdGV4dCwgUHlPYmplY3QgKm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZmlsZW5hbWUsIGludCBsaW5lbm8sIFB5T2JqZWN0ICpsaW5lbm9fb2JqLAorICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnNvdXJjZWxpbmUsIFB5T2JqZWN0ICpzb3VyY2UpCit7CisgICAgUHlPYmplY3QgKnNob3dfZm4sICptc2csICpyZXMsICp3YXJubXNnX2NscyA9IE5VTEw7CisKKyAgICAvKiBJZiB0aGUgc291cmNlIHBhcmFtZXRlciBpcyBzZXQsIHRyeSB0byBnZXQgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICBUaGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGlzIGFibGUgdG8gbG9nIHRoZSB0cmFjZWJhY2sgd2hlcmUgdGhlIHNvdXJjZQorICAgICAgIHdhcyBhbGxvY2F0ZWQsIHdoZXJlYXMgdGhlIEMgaW1wbGVtZW50YXRpb24gZG9lc250LiAqLworICAgIHNob3dfZm4gPSBnZXRfd2FybmluZ3NfYXR0cigiX3Nob3d3YXJubXNnIiwgc291cmNlICE9IE5VTEwpOworICAgIGlmIChzaG93X2ZuID09IE5VTEwpIHsKKyAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHNob3dfd2FybmluZyhmaWxlbmFtZSwgbGluZW5vLCB0ZXh0LCBjYXRlZ29yeSwgc291cmNlbGluZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghUHlDYWxsYWJsZV9DaGVjayhzaG93X2ZuKSkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICJ3YXJuaW5ncy5fc2hvd3dhcm5tc2coKSBtdXN0IGJlIHNldCB0byBhIGNhbGxhYmxlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgd2Fybm1zZ19jbHMgPSBnZXRfd2FybmluZ3NfYXR0cigiV2FybmluZ01lc3NhZ2UiLCAwKTsKKyAgICBpZiAod2Fybm1zZ19jbHMgPT0gTlVMTCkgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gZ2V0IHdhcm5pbmdzLldhcm5pbmdNZXNzYWdlIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgbXNnID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyh3YXJubXNnX2NscywgbWVzc2FnZSwgY2F0ZWdvcnksCisgICAgICAgICAgICBmaWxlbmFtZSwgbGluZW5vX29iaiwgUHlfTm9uZSwgUHlfTm9uZSwgc291cmNlLAorICAgICAgICAgICAgTlVMTCk7CisgICAgUHlfREVDUkVGKHdhcm5tc2dfY2xzKTsKKyAgICBpZiAobXNnID09IE5VTEwpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNob3dfZm4sIG1zZywgTlVMTCk7CisgICAgUHlfREVDUkVGKHNob3dfZm4pOworICAgIFB5X0RFQ1JFRihtc2cpOworCisgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBQeV9ERUNSRUYocmVzKTsKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihzaG93X2ZuKTsKKyAgICByZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBQeU9iamVjdCAqCiB3YXJuX2V4cGxpY2l0KFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlPYmplY3QgKm1lc3NhZ2UsCiAgICAgICAgICAgICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwgaW50IGxpbmVubywKLSAgICAgICAgICAgICAgUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnJlZ2lzdHJ5LCBQeU9iamVjdCAqc291cmNlbGluZSkKKyAgICAgICAgICAgICAgUHlPYmplY3QgKm1vZHVsZSwgUHlPYmplY3QgKnJlZ2lzdHJ5LCBQeU9iamVjdCAqc291cmNlbGluZSwKKyAgICAgICAgICAgICAgUHlPYmplY3QgKnNvdXJjZSkKIHsKICAgICBQeU9iamVjdCAqa2V5ID0gTlVMTCwgKnRleHQgPSBOVUxMLCAqcmVzdWx0ID0gTlVMTCwgKmxpbmVub19vYmogPSBOVUxMOwogICAgIFB5T2JqZWN0ICppdGVtID0gTlVMTDsKQEAgLTQ3MCwzMSArNTQyLDkgQEAKICAgICBpZiAocmMgPT0gMSkgIC8qIEFscmVhZHkgd2FybmVkIGZvciB0aGlzIG1vZHVsZS4gKi8KICAgICAgICAgZ290byByZXR1cm5fbm9uZTsKICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICBQeU9iamVjdCAqc2hvd19meG4gPSBnZXRfd2FybmluZ3NfYXR0cigic2hvd3dhcm5pbmciKTsKLSAgICAgICAgaWYgKHNob3dfZnhuID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgICAgIHNob3dfd2FybmluZyhmaWxlbmFtZSwgbGluZW5vLCB0ZXh0LCBjYXRlZ29yeSwgc291cmNlbGluZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqcmVzOwotCi0gICAgICAgICAgICBpZiAoIVB5Q2FsbGFibGVfQ2hlY2soc2hvd19meG4pKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmdzLnNob3d3YXJuaW5nKCkgbXVzdCBiZSBzZXQgdG8gYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYWJsZSIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzaG93X2Z4bik7Ci0gICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKHNob3dfZnhuLCBtZXNzYWdlLCBjYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm9fb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoc2hvd19meG4pOwotICAgICAgICAgICAgUHlfWERFQ1JFRihyZXMpOwotICAgICAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgfQorICAgICAgICBpZiAoY2FsbF9zaG93X3dhcm5pbmcoY2F0ZWdvcnksIHRleHQsIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm9fb2JqLCBzb3VyY2VsaW5lLCBzb3VyY2UpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICB9CiAgICAgZWxzZSAvKiBpZiAocmMgPT0gLTEpICovCiAgICAgICAgIGdvdG8gY2xlYW51cDsKQEAgLTczOCw3ICs3ODgsOCBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotZG9fd2FybihQeU9iamVjdCAqbWVzc2FnZSwgUHlPYmplY3QgKmNhdGVnb3J5LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsKQorZG9fd2FybihQeU9iamVjdCAqbWVzc2FnZSwgUHlPYmplY3QgKmNhdGVnb3J5LCBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLAorICAgICAgICBQeU9iamVjdCAqc291cmNlKQogewogICAgIFB5T2JqZWN0ICpmaWxlbmFtZSwgKm1vZHVsZSwgKnJlZ2lzdHJ5LCAqcmVzOwogICAgIGludCBsaW5lbm87CkBAIC03NDcsNyArNzk4LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICByZXMgPSB3YXJuX2V4cGxpY2l0KGNhdGVnb3J5LCBtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsIHJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBzb3VyY2UpOwogICAgIFB5X0RFQ1JFRihmaWxlbmFtZSk7CiAgICAgUHlfREVDUkVGKHJlZ2lzdHJ5KTsKICAgICBQeV9ERUNSRUYobW9kdWxlKTsKQEAgLTc1NywyNSArODA4LDI3IEBACiBzdGF0aWMgUHlPYmplY3QgKgogd2FybmluZ3Nfd2FybihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprd2RzKQogewotICAgIHN0YXRpYyBjaGFyICprd19saXN0W10gPSB7ICJtZXNzYWdlIiwgImNhdGVnb3J5IiwgInN0YWNrbGV2ZWwiLCAwIH07Ci0gICAgUHlPYmplY3QgKm1lc3NhZ2UsICpjYXRlZ29yeSA9IE5VTEw7CisgICAgc3RhdGljIGNoYXIgKmt3X2xpc3RbXSA9IHsibWVzc2FnZSIsICJjYXRlZ29yeSIsICJzdGFja2xldmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2UiLCBOVUxMfTsKKyAgICBQeU9iamVjdCAqbWVzc2FnZSwgKmNhdGVnb3J5ID0gTlVMTCwgKnNvdXJjZSA9IE5VTEw7CiAgICAgUHlfc3NpemVfdCBzdGFja19sZXZlbCA9IDE7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT3xPbjp3YXJuIiwga3dfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwgJmNhdGVnb3J5LCAmc3RhY2tfbGV2ZWwpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPfE9uTzp3YXJuIiwga3dfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwgJmNhdGVnb3J5LCAmc3RhY2tfbGV2ZWwsICZzb3VyY2UpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGNhdGVnb3J5ID0gZ2V0X2NhdGVnb3J5KG1lc3NhZ2UsIGNhdGVnb3J5KTsKICAgICBpZiAoY2F0ZWdvcnkgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIGRvX3dhcm4obWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrX2xldmVsKTsKKyAgICByZXR1cm4gZG9fd2FybihtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwsIHNvdXJjZSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB3YXJuaW5nc193YXJuX2V4cGxpY2l0KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCiB7CiAgICAgc3RhdGljIGNoYXIgKmt3ZF9saXN0W10gPSB7Im1lc3NhZ2UiLCAiY2F0ZWdvcnkiLCAiZmlsZW5hbWUiLCAibGluZW5vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSIsICJyZWdpc3RyeSIsICJtb2R1bGVfZ2xvYmFscyIsIDB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlIiwgInJlZ2lzdHJ5IiwgIm1vZHVsZV9nbG9iYWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSIsIDB9OwogICAgIFB5T2JqZWN0ICptZXNzYWdlOwogICAgIFB5T2JqZWN0ICpjYXRlZ29yeTsKICAgICBQeU9iamVjdCAqZmlsZW5hbWU7CkBAIC03ODMsMTAgKzgzNiwxMSBAQAogICAgIFB5T2JqZWN0ICptb2R1bGUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpyZWdpc3RyeSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1vZHVsZV9nbG9iYWxzID0gTlVMTDsKKyAgICBQeU9iamVjdCAqc291cmNlb2JqID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsICJPT1VpfE9PTzp3YXJuX2V4cGxpY2l0IiwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCAiT09VaXxPT09POndhcm5fZXhwbGljaXQiLAogICAgICAgICAgICAgICAgIGt3ZF9saXN0LCAmbWVzc2FnZSwgJmNhdGVnb3J5LCAmZmlsZW5hbWUsICZsaW5lbm8sICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgJnJlZ2lzdHJ5LCAmbW9kdWxlX2dsb2JhbHMpKQorICAgICAgICAgICAgICAgICZyZWdpc3RyeSwgJm1vZHVsZV9nbG9iYWxzLCAmc291cmNlb2JqKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBpZiAobW9kdWxlX2dsb2JhbHMpIHsKQEAgLTg0MiwxNCArODk2LDE0IEBACiAKICAgICAgICAgLyogSGFuZGxlIHRoZSB3YXJuaW5nLiAqLwogICAgICAgICByZXR1cm5lZCA9IHdhcm5fZXhwbGljaXQoY2F0ZWdvcnksIG1lc3NhZ2UsIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LCBzb3VyY2VfbGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeSwgc291cmNlX2xpbmUsIHNvdXJjZW9iaik7CiAgICAgICAgIFB5X0RFQ1JFRihzb3VyY2VfbGlzdCk7CiAgICAgICAgIHJldHVybiByZXR1cm5lZDsKICAgICB9CiAKICBzdGFuZGFyZF9jYWxsOgogICAgIHJldHVybiB3YXJuX2V4cGxpY2l0KGNhdGVnb3J5LCBtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5LCBOVUxMLCBzb3VyY2VvYmopOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtODY0LDE0ICs5MTgsMTQgQEAKIAogc3RhdGljIGludAogd2Fybl91bmljb2RlKFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlPYmplY3QgKm1lc3NhZ2UsCi0gICAgICAgICAgICAgUHlfc3NpemVfdCBzdGFja19sZXZlbCkKKyAgICAgICAgICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsLCBQeU9iamVjdCAqc291cmNlKQogewogICAgIFB5T2JqZWN0ICpyZXM7CiAKICAgICBpZiAoY2F0ZWdvcnkgPT0gTlVMTCkKICAgICAgICAgY2F0ZWdvcnkgPSBQeUV4Y19SdW50aW1lV2FybmluZzsKIAotICAgIHJlcyA9IGRvX3dhcm4obWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrX2xldmVsKTsKKyAgICByZXMgPSBkb193YXJuKG1lc3NhZ2UsIGNhdGVnb3J5LCBzdGFja19sZXZlbCwgc291cmNlKTsKICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBQeV9ERUNSRUYocmVzKTsKQEAgLTg3OSwxMiArOTMzLDI4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQKK19QeUVycl9XYXJuRm9ybWF0VihQeU9iamVjdCAqc291cmNlLAorICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlfc3NpemVfdCBzdGFja19sZXZlbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgdmFyZ3MpCit7CisgICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgaW50IHJlczsKKworICAgIG1lc3NhZ2UgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdFYoZm9ybWF0LCB2YXJncyk7CisgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmVzID0gd2Fybl91bmljb2RlKGNhdGVnb3J5LCBtZXNzYWdlLCBzdGFja19sZXZlbCwgc291cmNlKTsKKyAgICBQeV9ERUNSRUYobWVzc2FnZSk7CisgICAgcmV0dXJuIHJlczsKK30KKwogaW50CiBQeUVycl9XYXJuRm9ybWF0KFB5T2JqZWN0ICpjYXRlZ29yeSwgUHlfc3NpemVfdCBzdGFja19sZXZlbCwKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0gICAgaW50IHJldDsKLSAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBpbnQgcmVzOwogICAgIHZhX2xpc3QgdmFyZ3M7CiAKICNpZmRlZiBIQVZFX1NUREFSR19QUk9UT1RZUEVTCkBAIC04OTIsMjUgKzk2MiwzOCBAQAogI2Vsc2UKICAgICB2YV9zdGFydCh2YXJncyk7CiAjZW5kaWYKLSAgICBtZXNzYWdlID0gUHlVbmljb2RlX0Zyb21Gb3JtYXRWKGZvcm1hdCwgdmFyZ3MpOwotICAgIGlmIChtZXNzYWdlICE9IE5VTEwpIHsKLSAgICAgICAgcmV0ID0gd2Fybl91bmljb2RlKGNhdGVnb3J5LCBtZXNzYWdlLCBzdGFja19sZXZlbCk7Ci0gICAgICAgIFB5X0RFQ1JFRihtZXNzYWdlKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICByZXQgPSAtMTsKKyAgICByZXMgPSBfUHlFcnJfV2FybkZvcm1hdFYoTlVMTCwgY2F0ZWdvcnksIHN0YWNrX2xldmVsLCBmb3JtYXQsIHZhcmdzKTsKICAgICB2YV9lbmQodmFyZ3MpOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIHJlczsKIH0KIAogaW50CitQeUVycl9SZXNvdXJjZVdhcm5pbmcoUHlPYmplY3QgKnNvdXJjZSwgUHlfc3NpemVfdCBzdGFja19sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKyAgICBpbnQgcmVzOworICAgIHZhX2xpc3QgdmFyZ3M7CisKKyNpZmRlZiBIQVZFX1NUREFSR19QUk9UT1RZUEVTCisgICAgdmFfc3RhcnQodmFyZ3MsIGZvcm1hdCk7CisjZWxzZQorICAgIHZhX3N0YXJ0KHZhcmdzKTsKKyNlbmRpZgorICAgIHJlcyA9IF9QeUVycl9XYXJuRm9ybWF0Vihzb3VyY2UsIFB5RXhjX1Jlc291cmNlV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfbGV2ZWwsIGZvcm1hdCwgdmFyZ3MpOworICAgIHZhX2VuZCh2YXJncyk7CisgICAgcmV0dXJuIHJlczsKK30KKworCitpbnQKIFB5RXJyX1dhcm5FeChQeU9iamVjdCAqY2F0ZWdvcnksIGNvbnN0IGNoYXIgKnRleHQsIFB5X3NzaXplX3Qgc3RhY2tfbGV2ZWwpCiB7CiAgICAgaW50IHJldDsKICAgICBQeU9iamVjdCAqbWVzc2FnZSA9IFB5VW5pY29kZV9Gcm9tU3RyaW5nKHRleHQpOwogICAgIGlmIChtZXNzYWdlID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICByZXQgPSB3YXJuX3VuaWNvZGUoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrX2xldmVsKTsKKyAgICByZXQgPSB3YXJuX3VuaWNvZGUoY2F0ZWdvcnksIG1lc3NhZ2UsIHN0YWNrX2xldmVsLCBOVUxMKTsKICAgICBQeV9ERUNSRUYobWVzc2FnZSk7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTkyMSw3ICsxMDA0LDcgQEAKICN1bmRlZiBQeUVycl9XYXJuCiAKIFB5QVBJX0ZVTkMoaW50KQotUHlFcnJfV2FybihQeU9iamVjdCAqY2F0ZWdvcnksIGNoYXIgKnRleHQpCitQeUVycl9XYXJuKFB5T2JqZWN0ICpjYXRlZ29yeSwgY29uc3QgY2hhciAqdGV4dCkKIHsKICAgICByZXR1cm4gUHlFcnJfV2FybkV4KGNhdGVnb3J5LCB0ZXh0LCAxKTsKIH0KQEAgLTkzNiw3ICsxMDE5LDcgQEAKICAgICBpZiAoY2F0ZWdvcnkgPT0gTlVMTCkKICAgICAgICAgY2F0ZWdvcnkgPSBQeUV4Y19SdW50aW1lV2FybmluZzsKICAgICByZXMgPSB3YXJuX2V4cGxpY2l0KGNhdGVnb3J5LCBtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLCByZWdpc3RyeSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUsIHJlZ2lzdHJ5LCBOVUxMLCBOVUxMKTsKICAgICBpZiAocmVzID09IE5VTEwpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBQeV9ERUNSRUYocmVzKTsKQEAgLTEwMDAsNyArMTA4Myw3IEBACiAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgewogICAgICAgICBQeU9iamVjdCAqcmVzOwogICAgICAgICByZXMgPSB3YXJuX2V4cGxpY2l0KGNhdGVnb3J5LCBtZXNzYWdlLCBmaWxlbmFtZSwgbGluZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgcmVnaXN0cnksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSwgcmVnaXN0cnksIE5VTEwsIE5VTEwpOwogICAgICAgICBQeV9ERUNSRUYobWVzc2FnZSk7CiAgICAgICAgIGlmIChyZXMgIT0gTlVMTCkgewogICAgICAgICAgICAgUHlfREVDUkVGKHJlcyk7CmRpZmYgLS1naXQgYS9QeXRob24vYXN0LmMgYi9QeXRob24vYXN0LmMKaW5kZXggNzc0M2MzMS4uOGMxM2UwYiAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzdC5jCisrKyBiL1B5dGhvbi9hc3QuYwpAQCAtMTMyLDYgKzEzMiw1MiBAQAogfQogCiBzdGF0aWMgaW50Cit2YWxpZGF0ZV9jb25zdGFudChQeU9iamVjdCAqdmFsdWUpCit7CisgICAgaWYgKHZhbHVlID09IFB5X05vbmUgfHwgdmFsdWUgPT0gUHlfRWxsaXBzaXMpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHZhbHVlKQorICAgICAgICAgICAgfHwgUHlGbG9hdF9DaGVja0V4YWN0KHZhbHVlKQorICAgICAgICAgICAgfHwgUHlDb21wbGV4X0NoZWNrRXhhY3QodmFsdWUpCisgICAgICAgICAgICB8fCBQeUJvb2xfQ2hlY2sodmFsdWUpCisgICAgICAgICAgICB8fCBQeVVuaWNvZGVfQ2hlY2tFeGFjdCh2YWx1ZSkKKyAgICAgICAgICAgIHx8IFB5Qnl0ZXNfQ2hlY2tFeGFjdCh2YWx1ZSkpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKFB5VHVwbGVfQ2hlY2tFeGFjdCh2YWx1ZSkgfHwgUHlGcm96ZW5TZXRfQ2hlY2tFeGFjdCh2YWx1ZSkpIHsKKyAgICAgICAgUHlPYmplY3QgKml0OworCisgICAgICAgIGl0ID0gUHlPYmplY3RfR2V0SXRlcih2YWx1ZSk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIFB5T2JqZWN0ICppdGVtID0gUHlJdGVyX05leHQoaXQpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZV9jb25zdGFudChpdGVtKSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICB9CisKKyAgICAgICAgUHlfREVDUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKIHZhbGlkYXRlX2V4cHIoZXhwcl90eSBleHAsIGV4cHJfY29udGV4dF90eSBjdHgpCiB7CiAgICAgaW50IGNoZWNrX2N0eCA9IDE7CkBAIC0yNDAsNiArMjg2LDE0IEBACiAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9leHByKGV4cC0+di5DYWxsLmZ1bmMsIExvYWQpICYmCiAgICAgICAgICAgICB2YWxpZGF0ZV9leHBycyhleHAtPnYuQ2FsbC5hcmdzLCBMb2FkLCAwKSAmJgogICAgICAgICAgICAgdmFsaWRhdGVfa2V5d29yZHMoZXhwLT52LkNhbGwua2V5d29yZHMpOworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKKyAgICAgICAgaWYgKCF2YWxpZGF0ZV9jb25zdGFudChleHAtPnYuQ29uc3RhbnQudmFsdWUpKSB7CisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnb3QgYW4gaW52YWxpZCB0eXBlIGluIENvbnN0YW50OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVFlQRShleHAtPnYuQ29uc3RhbnQudmFsdWUpLT50cF9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOwogICAgIGNhc2UgTnVtX2tpbmQ6IHsKICAgICAgICAgUHlPYmplY3QgKm4gPSBleHAtPnYuTnVtLm47CiAgICAgICAgIGlmICghUHlMb25nX0NoZWNrRXhhY3QobikgJiYgIVB5RmxvYXRfQ2hlY2tFeGFjdChuKSAmJgpAQCAtMjU3LDYgKzMxMSwxNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KKyAgICBjYXNlIEpvaW5lZFN0cl9raW5kOgorICAgICAgICByZXR1cm4gdmFsaWRhdGVfZXhwcnMoZXhwLT52LkpvaW5lZFN0ci52YWx1ZXMsIExvYWQsIDApOworICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKKyAgICAgICAgaWYgKHZhbGlkYXRlX2V4cHIoZXhwLT52LkZvcm1hdHRlZFZhbHVlLnZhbHVlLCBMb2FkKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChleHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMpCisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVfZXhwcihleHAtPnYuRm9ybWF0dGVkVmFsdWUuZm9ybWF0X3NwZWMsIExvYWQpOworICAgICAgICByZXR1cm4gMTsKICAgICBjYXNlIEJ5dGVzX2tpbmQ6IHsKICAgICAgICAgUHlPYmplY3QgKmIgPSBleHAtPnYuQnl0ZXMuczsKICAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrRXhhY3QoYikpIHsKQEAgLTQxMyw4ICs0NzUsOCBAQAogICAgIGNhc2UgSW1wb3J0X2tpbmQ6CiAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9ub25lbXB0eV9zZXEoc3RtdC0+di5JbXBvcnQubmFtZXMsICJuYW1lcyIsICJJbXBvcnQiKTsKICAgICBjYXNlIEltcG9ydEZyb21fa2luZDoKLSAgICAgICAgaWYgKHN0bXQtPnYuSW1wb3J0RnJvbS5sZXZlbCA8IC0xKSB7Ci0gICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkltcG9ydEZyb20gbGV2ZWwgbGVzcyB0aGFuIC0xIik7CisgICAgICAgIGlmIChzdG10LT52LkltcG9ydEZyb20ubGV2ZWwgPCAwKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIk5lZ2F0aXZlIEltcG9ydEZyb20gbGV2ZWwiKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB2YWxpZGF0ZV9ub25lbXB0eV9zZXEoc3RtdC0+di5JbXBvcnRGcm9tLm5hbWVzLCAibmFtZXMiLCAiSW1wb3J0RnJvbSIpOwpAQCAtNTEyLDggKzU3NCw3IEBACiAKIC8qIERhdGEgc3RydWN0dXJlIHVzZWQgaW50ZXJuYWxseSAqLwogc3RydWN0IGNvbXBpbGluZyB7Ci0gICAgY2hhciAqY19lbmNvZGluZzsgLyogc291cmNlIGVuY29kaW5nICovCi0gICAgUHlBcmVuYSAqY19hcmVuYTsgLyogYXJlbmEgZm9yIGFsbG9jYXRpbmcgbWVtZW9yeSAqLworICAgIFB5QXJlbmEgKmNfYXJlbmE7IC8qIEFyZW5hIGZvciBhbGxvY2F0aW5nIG1lbW9yeS4gKi8KICAgICBQeU9iamVjdCAqY19maWxlbmFtZTsgLyogZmlsZW5hbWUgKi8KICAgICBQeU9iamVjdCAqY19ub3JtYWxpemU7IC8qIE5vcm1hbGl6YXRpb24gZnVuY3Rpb24gZnJvbSB1bmljb2RlZGF0YS4gKi8KICAgICBQeU9iamVjdCAqY19ub3JtYWxpemVfYXJnczsgLyogTm9ybWFsaXphdGlvbiBhcmd1bWVudCB0dXBsZS4gKi8KQEAgLTUzNSw5ICs1OTYsNyBAQAogc3RhdGljIGV4cHJfdHkgYXN0X2Zvcl9jYWxsKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqLCBleHByX3R5KTsKIAogc3RhdGljIFB5T2JqZWN0ICpwYXJzZW51bWJlcihzdHJ1Y3QgY29tcGlsaW5nICosIGNvbnN0IGNoYXIgKik7Ci1zdGF0aWMgUHlPYmplY3QgKnBhcnNlc3RyKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUpOwotc3RhdGljIFB5T2JqZWN0ICpwYXJzZXN0cnBsdXMoc3RydWN0IGNvbXBpbGluZyAqLCBjb25zdCBub2RlICpuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpieXRlc21vZGUpOworc3RhdGljIGV4cHJfdHkgcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKiwgY29uc3Qgbm9kZSAqbik7CiAKICNkZWZpbmUgQ09NUF9HRU5FWFAgICAwCiAjZGVmaW5lIENPTVBfTElTVENPTVAgMQpAQCAtNzAxLDIzICs3NjAsMTEgQEAKICAgICBjLmNfYXJlbmEgPSBhcmVuYTsKICAgICAvKiBib3Jyb3dlZCByZWZlcmVuY2UgKi8KICAgICBjLmNfZmlsZW5hbWUgPSBmaWxlbmFtZTsKLSAgICBjLmNfbm9ybWFsaXplID0gYy5jX25vcm1hbGl6ZV9hcmdzID0gTlVMTDsKLSAgICBpZiAoZmxhZ3MgJiYgZmxhZ3MtPmNmX2ZsYWdzICYgUHlDRl9TT1VSQ0VfSVNfVVRGOCkgewotICAgICAgICBjLmNfZW5jb2RpbmcgPSAidXRmLTgiOwotICAgICAgICBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKSB7Ci0jaWYgMAotICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJlbmNvZGluZyBkZWNsYXJhdGlvbiBpbiBVbmljb2RlIHN0cmluZyIpOwotICAgICAgICAgICAgZ290byBvdXQ7Ci0jZW5kaWYKLSAgICAgICAgICAgIG4gPSBDSElMRChuLCAwKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoVFlQRShuKSA9PSBlbmNvZGluZ19kZWNsKSB7Ci0gICAgICAgIGMuY19lbmNvZGluZyA9IFNUUihuKTsKKyAgICBjLmNfbm9ybWFsaXplID0gTlVMTDsKKyAgICBjLmNfbm9ybWFsaXplX2FyZ3MgPSBOVUxMOworCisgICAgaWYgKFRZUEUobikgPT0gZW5jb2RpbmdfZGVjbCkKICAgICAgICAgbiA9IENISUxEKG4sIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFBFUCAzMTIwICovCi0gICAgICAgIGMuY19lbmNvZGluZyA9ICJ1dGYtOCI7Ci0gICAgfQogCiAgICAgayA9IDA7CiAgICAgc3dpdGNoIChUWVBFKG4pKSB7CkBAIC04NjQsNyArOTExLDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyKiBGT1JCSURERU5bXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgRk9SQklEREVOW10gPSB7CiAgICAgIk5vbmUiLAogICAgICJUcnVlIiwKICAgICAiRmFsc2UiLApAQCAtODgxLDcgKzkyOCw3IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBpZiAoZnVsbF9jaGVja3MpIHsKLSAgICAgICAgY29uc3QgY2hhciAqKnA7CisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKICAgICAgICAgZm9yIChwID0gRk9SQklEREVOOyAqcDsgcCsrKSB7CiAgICAgICAgICAgICBpZiAoUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcobmFtZSwgKnApID09IDApIHsKICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImFzc2lnbm1lbnQgdG8ga2V5d29yZCIpOwpAQCAtOTQzLDEzICs5OTAsOCBAQAogICAgICAgICAgICAgcyA9IGUtPnYuTGlzdC5lbHRzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVHVwbGVfa2luZDoKLSAgICAgICAgICAgIGlmIChhc2RsX3NlcV9MRU4oZS0+di5UdXBsZS5lbHRzKSkgIHsKLSAgICAgICAgICAgICAgICBlLT52LlR1cGxlLmN0eCA9IGN0eDsKLSAgICAgICAgICAgICAgICBzID0gZS0+di5UdXBsZS5lbHRzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXhwcl9uYW1lID0gIigpIjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGUtPnYuVHVwbGUuY3R4ID0gY3R4OworICAgICAgICAgICAgcyA9IGUtPnYuVHVwbGUuZWx0czsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIExhbWJkYV9raW5kOgogICAgICAgICAgICAgZXhwcl9uYW1lID0gImxhbWJkYSI7CkBAIC05ODYsNiArMTAyOCw4IEBACiAgICAgICAgIGNhc2UgTnVtX2tpbmQ6CiAgICAgICAgIGNhc2UgU3RyX2tpbmQ6CiAgICAgICAgIGNhc2UgQnl0ZXNfa2luZDoKKyAgICAgICAgY2FzZSBKb2luZWRTdHJfa2luZDoKKyAgICAgICAgY2FzZSBGb3JtYXR0ZWRWYWx1ZV9raW5kOgogICAgICAgICAgICAgZXhwcl9uYW1lID0gImxpdGVyYWwiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTmFtZUNvbnN0YW50X2tpbmQ6CkBAIC0xMjU5LDE2ICsxMzAzLDIwIEBACiAgICAgICAgYW5kIHZhcmFyZ3NsaXN0IChsYW1iZGEgZGVmaW5pdGlvbikuCiAKICAgICAgICBwYXJhbWV0ZXJzOiAnKCcgW3R5cGVkYXJnc2xpc3RdICcpJwotICAgICAgIHR5cGVkYXJnc2xpc3Q6ICgodGZwZGVmIFsnPScgdGVzdF0gJywnKSoKLSAgICAgICAgICAgKCcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0KLSAgICAgICAgICAgfCAnKionIHRmcGRlZikKLSAgICAgICAgICAgfCB0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10pCisgICAgICAgdHlwZWRhcmdzbGlzdDogKHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsKKyAgICAgICAgICAgICAgICcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgICAgICAgIHwgJyoqJyB0ZnBkZWYgWycsJ11dXQorICAgICAgICAgfCAnKicgW3RmcGRlZl0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdGZwZGVmIFsnLCddXV0KKyAgICAgICAgIHwgJyoqJyB0ZnBkZWYgWycsJ10pCiAgICAgICAgdGZwZGVmOiBOQU1FIFsnOicgdGVzdF0KLSAgICAgICB2YXJhcmdzbGlzdDogKCh2ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgotICAgICAgICAgICAoJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiAgWycsJyAnKionIHZmcGRlZl0KLSAgICAgICAgICAgfCAnKionIHZmcGRlZikKLSAgICAgICAgICAgfCB2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10pCisgICAgICAgdmFyYXJnc2xpc3Q6ICh2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJyBbCisgICAgICAgICAgICAgICAnKicgW3ZmcGRlZl0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCcgWycqKicgdmZwZGVmIFsnLCddXV0KKyAgICAgICAgICAgICB8ICcqKicgdmZwZGVmIFsnLCddXV0KKyAgICAgICAgIHwgJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnIFsnKionIHZmcGRlZiBbJywnXV1dCisgICAgICAgICB8ICcqKicgdmZwZGVmIFsnLCddCisgICAgICAgKQogICAgICAgIHZmcGRlZjogTkFNRQorCiAgICAgKi8KICAgICBpbnQgaSwgaiwgaywgbnBvc2FyZ3MgPSAwLCBua3dvbmx5YXJncyA9IDA7CiAgICAgaW50IG5wb3NkZWZhdWx0cyA9IDAsIGZvdW5kX2RlZmF1bHQgPSAwOwpAQCAtMTM3MCw3ICsxNDE4LDggQEAKICAgICAgICAgICAgICAgICBpICs9IDI7IC8qIHRoZSBuYW1lIGFuZCB0aGUgY29tbWEgKi8KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgU1RBUjoKLSAgICAgICAgICAgICAgICBpZiAoaSsxID49IE5DSChuKSkgeworICAgICAgICAgICAgICAgIGlmIChpKzEgPj0gTkNIKG4pIHx8CisgICAgICAgICAgICAgICAgICAgIChpKzIgPT0gTkNIKG4pICYmIFRZUEUoQ0hJTEQobiwgaSsxKSkgPT0gQ09NTUEpKSB7CiAgICAgICAgICAgICAgICAgICAgIGFzdF9lcnJvcihjLCBDSElMRChuLCBpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lZCBhcmd1bWVudHMgbXVzdCBmb2xsb3cgYmFyZSAqIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTk5Myw3ICsyMDQyLDYgQEAKICAgICAgICB8ICcuLi4nIHwgJ05vbmUnIHwgJ1RydWUnIHwgJ0ZhbHNlJwogICAgICovCiAgICAgbm9kZSAqY2ggPSBDSElMRChuLCAwKTsKLSAgICBpbnQgYnl0ZXNtb2RlID0gMDsKIAogICAgIHN3aXRjaCAoVFlQRShjaCkpIHsKICAgICBjYXNlIE5BTUU6IHsKQEAgLTIwMTUsNyArMjA2Myw3IEBACiAgICAgICAgIHJldHVybiBOYW1lKG5hbWUsIExvYWQsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKICAgICB9CiAgICAgY2FzZSBTVFJJTkc6IHsKLSAgICAgICAgUHlPYmplY3QgKnN0ciA9IHBhcnNlc3RycGx1cyhjLCBuLCAmYnl0ZXNtb2RlKTsKKyAgICAgICAgZXhwcl90eSBzdHIgPSBwYXJzZXN0cnBsdXMoYywgbik7CiAgICAgICAgIGlmICghc3RyKSB7CiAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJ0eXBlID0gTlVMTDsKICAgICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1VuaWNvZGVFcnJvcikpCkBAIC0yMDMyLDYgKzIwODAsNyBAQAogICAgICAgICAgICAgICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIoJXMpICVzIiwgZXJydHlwZSwgcyk7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihlcnJzdHIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiglcykgdW5rbm93biBlcnJvciIsIGVycnR5cGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgYnVmKTsKQEAgLTIwNDEsMTQgKzIwOTAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYy0+Y19hcmVuYSwgc3RyKSA8IDApIHsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihzdHIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzbW9kZSkKLSAgICAgICAgICAgIHJldHVybiBCeXRlcyhzdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFN0cihzdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICAgICAgcmV0dXJuIHN0cjsKICAgICB9CiAgICAgY2FzZSBOVU1CRVI6IHsKICAgICAgICAgUHlPYmplY3QgKnB5bnVtID0gcGFyc2VudW1iZXIoYywgU1RSKGNoKSk7CkBAIC0zMjA4LDE0ICszMjUwLDE0IEBACiAgICAgICAgICAgICBhbGlhc190eSBpbXBvcnRfYWxpYXMgPSBhbGlhc19mb3JfaW1wb3J0X25hbWUoYywgbiwgMSk7CiAgICAgICAgICAgICBpZiAoIWltcG9ydF9hbGlhcykKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoYWxpYXNlcywgMCwgaW1wb3J0X2FsaWFzKTsKKyAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhbGlhc2VzLCAwLCBpbXBvcnRfYWxpYXMpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSArPSAyKSB7CiAgICAgICAgICAgICAgICAgYWxpYXNfdHkgaW1wb3J0X2FsaWFzID0gYWxpYXNfZm9yX2ltcG9ydF9uYW1lKGMsIENISUxEKG4sIGkpLCAxKTsKICAgICAgICAgICAgICAgICBpZiAoIWltcG9ydF9hbGlhcykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChhbGlhc2VzLCBpIC8gMiwgaW1wb3J0X2FsaWFzKTsKKyAgICAgICAgICAgICAgICBhc2RsX3NlcV9TRVQoYWxpYXNlcywgaSAvIDIsIGltcG9ydF9hbGlhcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1vZCAhPSBOVUxMKQpAQCAtMzkzNSw4MiArMzk3Nyw5MzIgQEAKIH0KIAogc3RhdGljIFB5T2JqZWN0ICoKLWRlY29kZV91bmljb2RlKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIGludCByYXdtb2RlLCBjb25zdCBjaGFyICplbmNvZGluZykKK2RlY29kZV91bmljb2RlX3dpdGhfZXNjYXBlcyhzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKQogewogICAgIFB5T2JqZWN0ICp2LCAqdTsKICAgICBjaGFyICpidWY7CiAgICAgY2hhciAqcDsKICAgICBjb25zdCBjaGFyICplbmQ7CiAKLSAgICBpZiAoZW5jb2RpbmcgPT0gTlVMTCkgewotICAgICAgICB1ID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvdyAqLwotICAgICAgICBpZiAobGVuID4gUFlfU0laRV9NQVggLyA2KQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIC8qICLDpCIgKDIgYnl0ZXMpIG1heSBiZWNvbWUgIlxVMDAwMDAwRTQiICgxMCBieXRlcyksIG9yIDE6NQotICAgICAgICAgICAiXMOkIiAoMyBieXRlcykgbWF5IGJlY29tZSAiXHUwMDVjXFUwMDAwMDBFNCIgKDE2IGJ5dGVzKSwgb3IgfjE6NiAqLwotICAgICAgICB1ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGxlbiAqIDYpOwotICAgICAgICBpZiAodSA9PSBOVUxMKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIHAgPSBidWYgPSBQeUJ5dGVzX0FzU3RyaW5nKHUpOwotICAgICAgICBlbmQgPSBzICsgbGVuOwotICAgICAgICB3aGlsZSAocyA8IGVuZCkgewotICAgICAgICAgICAgaWYgKCpzID09ICdcXCcpIHsKLSAgICAgICAgICAgICAgICAqcCsrID0gKnMrKzsKLSAgICAgICAgICAgICAgICBpZiAoKnMgJiAweDgwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweShwLCAidTAwNWMiKTsKLSAgICAgICAgICAgICAgICAgICAgcCArPSA1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgqcyAmIDB4ODApIHsgLyogWFhYIGluZWZmaWNpZW50ICovCi0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnc7Ci0gICAgICAgICAgICAgICAgaW50IGtpbmQ7Ci0gICAgICAgICAgICAgICAgdm9pZCAqZGF0YTsKLSAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgaTsKLSAgICAgICAgICAgICAgICB3ID0gZGVjb2RlX3V0ZjgoYywgJnMsIGVuZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHcgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBraW5kID0gUHlVbmljb2RlX0tJTkQodyk7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHcpOwotICAgICAgICAgICAgICAgIGxlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHcpOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICBQeV9VQ1M0IGNociA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOwotICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHAsICJcXFUlMDh4IiwgY2hyKTsKLSAgICAgICAgICAgICAgICAgICAgcCArPSAxMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogU2hvdWxkIGJlIGltcG9zc2libGUgdG8gb3ZlcmZsb3cgKi8KLSAgICAgICAgICAgICAgICBhc3NlcnQocCAtIGJ1ZiA8PSBQeV9TSVpFKHUpKTsKLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYodyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpwKysgPSAqcysrOworICAgIC8qIGNoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisgICAgaWYgKGxlbiA+IFBZX1NJWkVfTUFYIC8gNikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgLyogIsOkIiAoMiBieXRlcykgbWF5IGJlY29tZSAiXFUwMDAwMDBFNCIgKDEwIGJ5dGVzKSwgb3IgMTo1CisgICAgICAgIlzDpCIgKDMgYnl0ZXMpIG1heSBiZWNvbWUgIlx1MDA1Y1xVMDAwMDAwRTQiICgxNiBieXRlcyksIG9yIH4xOjYgKi8KKyAgICB1ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKU5VTEwsIGxlbiAqIDYpOworICAgIGlmICh1ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHAgPSBidWYgPSBQeUJ5dGVzX0FzU3RyaW5nKHUpOworICAgIGVuZCA9IHMgKyBsZW47CisgICAgd2hpbGUgKHMgPCBlbmQpIHsKKyAgICAgICAgaWYgKCpzID09ICdcXCcpIHsKKyAgICAgICAgICAgICpwKysgPSAqcysrOworICAgICAgICAgICAgaWYgKCpzICYgMHg4MCkgeworICAgICAgICAgICAgICAgIHN0cmNweShwLCAidTAwNWMiKTsKKyAgICAgICAgICAgICAgICBwICs9IDU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbGVuID0gcCAtIGJ1ZjsKLSAgICAgICAgcyA9IGJ1ZjsKKyAgICAgICAgaWYgKCpzICYgMHg4MCkgeyAvKiBYWFggaW5lZmZpY2llbnQgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICp3OworICAgICAgICAgICAgaW50IGtpbmQ7CisgICAgICAgICAgICB2b2lkICpkYXRhOworICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sIGk7CisgICAgICAgICAgICB3ID0gZGVjb2RlX3V0ZjgoYywgJnMsIGVuZCk7CisgICAgICAgICAgICBpZiAodyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAga2luZCA9IFB5VW5pY29kZV9LSU5EKHcpOworICAgICAgICAgICAgZGF0YSA9IFB5VW5pY29kZV9EQVRBKHcpOworICAgICAgICAgICAgbGVuID0gUHlVbmljb2RlX0dFVF9MRU5HVEgodyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBQeV9VQ1M0IGNociA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsIGkpOworICAgICAgICAgICAgICAgIHNwcmludGYocCwgIlxcVSUwOHgiLCBjaHIpOworICAgICAgICAgICAgICAgIHAgKz0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTaG91bGQgYmUgaW1wb3NzaWJsZSB0byBvdmVyZmxvdyAqLworICAgICAgICAgICAgYXNzZXJ0KHAgLSBidWYgPD0gUHlfU0laRSh1KSk7CisgICAgICAgICAgICBQeV9ERUNSRUYodyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcCsrID0gKnMrKzsKKyAgICAgICAgfQogICAgIH0KLSAgICBpZiAocmF3bW9kZSkKLSAgICAgICAgdiA9IFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlKHMsIGxlbiwgTlVMTCk7Ci0gICAgZWxzZQotICAgICAgICB2ID0gUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUocywgbGVuLCBOVUxMKTsKKyAgICBsZW4gPSBwIC0gYnVmOworICAgIHMgPSBidWY7CisKKyAgICB2ID0gUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUocywgbGVuLCBOVUxMKTsKICAgICBQeV9YREVDUkVGKHUpOwogICAgIHJldHVybiB2OwogfQogCi0vKiBzIGlzIGEgUHl0aG9uIHN0cmluZyBsaXRlcmFsLCBpbmNsdWRpbmcgdGhlIGJyYWNrZXRpbmcgcXVvdGUgY2hhcmFjdGVycywKLSAqIGFuZCByICYvb3IgYiBwcmVmaXhlcyAoaWYgYW55KSwgYW5kIGVtYmVkZGVkIGVzY2FwZSBzZXF1ZW5jZXMgKGlmIGFueSkuCi0gKiBwYXJzZXN0ciBwYXJzZXMgaXQsIGFuZCByZXR1cm5zIHRoZSBkZWNvZGVkIFB5dGhvbiBzdHJpbmcgb2JqZWN0LgotICovCisvKiBDb21waWxlIHRoaXMgZXhwcmVzc2lvbiBpbiB0byBhbiBleHByX3R5LiBXZSBrbm93IHRoYXQgd2UgY2FuCisgICB0ZW1wb3JhcmlseSBtb2RpZnkgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoaXMgc3RyaW5nCisgICAoaXQncyAneycpLCBhbmQgd2Uga25vdyB3ZSBjYW4gdGVtcG9yYXJpbHkgbW9kaWZ5IHRoZSBjaGFyYWN0ZXIKKyAgIGFmdGVyIHRoaXMgc3RyaW5nIChpdCBpcyBhICd9JykuICBMZXZlcmFnZSB0aGlzIHRvIGNyZWF0ZSBhCisgICBzdWItc3RyaW5nIHdpdGggZW5vdWdoIHJvb20gZm9yIHVzIHRvIGFkZCBwYXJlbnMgYXJvdW5kIHRoZQorICAgZXhwcmVzc2lvbi4gVGhpcyBpcyB0byBhbGxvdyBzdHJpbmdzIHdpdGggZW1iZWRkZWQgbmV3bGluZXMsIGZvcgorICAgZXhhbXBsZS4gKi8KK3N0YXRpYyBleHByX3R5Citmc3RyaW5nX2NvbXBpbGVfZXhwcihQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90IGV4cHJfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGV4cHJfZW5kLCBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQorCit7CisgICAgUHlDb21waWxlckZsYWdzIGNmOworICAgIG1vZF90eSBtb2Q7CisgICAgY2hhciAqdXRmX2V4cHI7CisgICAgUHlfc3NpemVfdCBpOworICAgIFB5X1VDUzQgZW5kX2NoID0gLTE7CisgICAgaW50IGFsbF93aGl0ZXNwYWNlOworICAgIFB5T2JqZWN0ICpzdWIgPSBOVUxMOworCisgICAgLyogV2Ugb25seSBkZWNyZWYgc3ViIGlmIHdlIGFsbG9jYXRlZCBpdCB3aXRoIGEgUHlVbmljb2RlX1N1YnN0cmluZy4KKyAgICAgICBkZWNyZWZfc3ViIHJlY29yZHMgdGhhdC4gKi8KKyAgICBpbnQgZGVjcmVmX3N1YiA9IDA7CisKKyAgICBhc3NlcnQoc3RyKTsKKworICAgIGFzc2VydChleHByX3N0YXJ0ID49IDAgJiYgZXhwcl9zdGFydCA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpOworICAgIGFzc2VydChleHByX2VuZCA+PSAwICYmIGV4cHJfZW5kIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CisgICAgYXNzZXJ0KGV4cHJfZW5kID49IGV4cHJfc3RhcnQpOworCisgICAgLyogVGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgb24gZWFjaCBzaWRlIG9mIHRoZQorICAgICAgIGV4cHJlc3Npb24gaW5zaWRlIHRoaXMgc3RyLiBUaGlzIHdpbGwgaGF2ZSBiZWVuIGNhdWdodCBiZWZvcmUKKyAgICAgICB3ZSdyZSBjYWxsZWQuICovCisgICAgYXNzZXJ0KGV4cHJfc3RhcnQgPj0gMSk7CisgICAgYXNzZXJ0KGV4cHJfZW5kIDw9IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0ciktMSk7CisKKyAgICAvKiBJZiB0aGUgc3Vic3RyaW5nIGlzIGFsbCB3aGl0ZXNwYWNlLCBpdCdzIGFuIGVycm9yLiBXZSBuZWVkIHRvCisgICAgICAgIGNhdGNoIHRoaXMgaGVyZSwgYW5kIG5vdCB3aGVuIHdlIGNhbGwgUHlQYXJzZXJfQVNURnJvbVN0cmluZywKKyAgICAgICAgYmVjYXVzZSB0dXJuaW5nIHRoZSBleHByZXNzaW9uICcnIGluIHRvICcoKScgd291bGQgZ28gZnJvbQorICAgICAgICBiZWluZyBpbnZhbGlkIHRvIHZhbGlkLiAqLworICAgIC8qIE5vdGUgdGhhdCB0aGlzIGNvZGUgc2F5cyBhbiBlbXB0eSBzdHJpbmcgaXMgYWxsCisgICAgICAgIHdoaXRlc3BhY2UuIFRoYXQncyBpbXBvcnRhbnQuIFRoZXJlJ3MgYSB0ZXN0IGZvciBpdDogZid7fScuICovCisgICAgYWxsX3doaXRlc3BhY2UgPSAxOworICAgIGZvciAoaSA9IGV4cHJfc3RhcnQ7IGkgPCBleHByX2VuZDsgaSsrKSB7CisgICAgICAgIGlmICghUHlfVU5JQ09ERV9JU1NQQUNFKFB5VW5pY29kZV9SRUFEX0NIQVIoc3RyLCBpKSkpIHsKKyAgICAgICAgICAgIGFsbF93aGl0ZXNwYWNlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhbGxfd2hpdGVzcGFjZSkgeworICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiBlbXB0eSBleHByZXNzaW9uIG5vdCBhbGxvd2VkIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogSWYgdGhlIHN1YnN0cmluZyB3aWxsIGJlIHRoZSBlbnRpcmUgc291cmNlIHN0cmluZywgd2UgY2FuJ3QgdXNlCisgICAgICAgIFB5VW5pY29kZV9TdWJzdHJpbmcsIHNpbmNlIGl0IHdpbGwgcmV0dXJuIGFub3RoZXIgcmVmZXJlbmNlIHRvCisgICAgICAgIG91ciBvcmlnaW5hbCBzdHJpbmcuIEJlY2F1c2Ugd2UncmUgbW9kaWZ5aW5nIHRoZSBzdHJpbmcgaW4KKyAgICAgICAgcGxhY2UsIHRoYXQncyBhIG5vLW5vLiBTbywgZGV0ZWN0IHRoYXQgY2FzZSBhbmQganVzdCB1c2Ugb3VyCisgICAgICAgIHN0cmluZyBkaXJlY3RseS4gKi8KKworICAgIGlmIChleHByX3N0YXJ0LTEgPT0gMCAmJiBleHByX2VuZCsxID09IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpIHsKKyAgICAgICAgLyogSWYgc3RyIGlzIHdlbGwgZm9ybWVkLCB0aGVuIHRoZSBmaXJzdCBhbmQgbGFzdCBjaGFycyBtdXN0CisgICAgICAgICAgIGJlICd7JyBhbmQgJ30nLCByZXNwZWN0aXZlbHkuIEJ1dCwgaWYgdGhlcmUncyBhIHN5bnRheAorICAgICAgICAgICBlcnJvciwgZm9yIGV4YW1wbGUgZid7MyEnLCB0aGVuIHRoZSBsYXN0IGNoYXIgd29uJ3QgYmUgYQorICAgICAgICAgICBjbG9zaW5nIGJyYWNlLiBTbywgcmVtZW1iZXIgdGhlIGxhc3QgY2hhcmFjdGVyIHdlIHJlYWQgaW4KKyAgICAgICAgICAgb3JkZXIgZm9yIHVzIHRvIHJlc3RvcmUgaXQuICovCisgICAgICAgIGVuZF9jaCA9IFB5VW5pY29kZV9SZWFkQ2hhcihzdHIsIGV4cHJfZW5kLWV4cHJfc3RhcnQrMSk7CisgICAgICAgIGFzc2VydChlbmRfY2ggIT0gKFB5X1VDUzQpLTEpOworCisgICAgICAgIC8qIEluIGFsbCBjYXNlcywgaG93ZXZlciwgc3RhcnRfY2ggbXVzdCBiZSAneycuICovCisgICAgICAgIGFzc2VydChQeVVuaWNvZGVfUmVhZENoYXIoc3RyLCAwKSA9PSAneycpOworCisgICAgICAgIHN1YiA9IHN0cjsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBDcmVhdGUgYSBzdWJzdHJpbmcgb2JqZWN0LiBJdCBtdXN0IGJlIGEgbmV3IG9iamVjdCwgd2l0aAorICAgICAgICAgICByZWZjb3VudD09MSwgc28gdGhhdCB3ZSBjYW4gbW9kaWZ5IGl0LiAqLworICAgICAgICBzdWIgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKHN0ciwgZXhwcl9zdGFydC0xLCBleHByX2VuZCsxKTsKKyAgICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBhc3NlcnQoc3ViICE9IHN0cik7ICAvKiBNYWtlIHN1cmUgaXQncyBhIG5ldyBzdHJpbmcuICovCisgICAgICAgIGRlY3JlZl9zdWIgPSAxOyAgICAgIC8qIFJlbWVtYmVyIHRvIGRlYWxsb2NhdGUgaXQgb24gZXJyb3IuICovCisgICAgfQorCisgICAgLyogUHV0ICgpIGFyb3VuZCB0aGUgZXhwcmVzc2lvbi4gKi8KKyAgICBpZiAoUHlVbmljb2RlX1dyaXRlQ2hhcihzdWIsIDAsICcoJykgPCAwIHx8CisgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3ViLCBleHByX2VuZC1leHByX3N0YXJ0KzEsICcpJykgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgLyogTm8gbmVlZCB0byBmcmVlIHRoZSBtZW1vcnkgcmV0dXJuZWQgaGVyZTogaXQncyBtYW5hZ2VkIGJ5IHRoZQorICAgICAgIHN0cmluZy4gKi8KKyAgICB1dGZfZXhwciA9IFB5VW5pY29kZV9Bc1VURjgoc3ViKTsKKyAgICBpZiAoIXV0Zl9leHByKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgY2YuY2ZfZmxhZ3MgPSBQeUNGX09OTFlfQVNUOworICAgIG1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcodXRmX2V4cHIsICI8ZnN0cmluZz4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfZXZhbF9pbnB1dCwgJmNmLCBjLT5jX2FyZW5hKTsKKyAgICBpZiAoIW1vZCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGlmIChzdWIgIT0gc3RyKQorICAgICAgICAvKiBDbGVhciBpbnN0ZWFkIG9mIGRlY3JlZiBpbiBjYXNlIHdlIGV2ZXIgbW9kaWZ5IHRoaXMgY29kZSB0byBjaGFuZ2UKKyAgICAgICAgICAgdGhlIGVycm9yIGhhbmRsaW5nOiB0aGlzIGlzIHNhZmVzdCBiZWNhdXNlIHRoZSBYREVDUkVGIHdvbid0IHRyeQorICAgICAgICAgICBhbmQgZGVjcmVmIGl0IHdoZW4gaXQncyBOVUxMLiAqLworICAgICAgICAvKiBObyBuZWVkIHRvIHJlc3RvcmUgdGhlIGNoYXJzIGluIHN1Yiwgc2luY2Ugd2Uga25vdyBpdCdzIGdldHRpbmcKKyAgICAgICAgICAgcmVhZHkgdG8gZ2V0IGRlbGV0ZWQgKHJlZmNvdW50IG11c3QgYmUgMSwgc2luY2Ugd2UgZ290IGEgbmV3IHN0cmluZworICAgICAgICAgICBpbiBQeVVuaWNvZGVfU3Vic3RyaW5nKS4gKi8KKyAgICAgICAgUHlfQ0xFQVIoc3ViKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KCFkZWNyZWZfc3ViKTsKKyAgICAgICAgYXNzZXJ0KGVuZF9jaCAhPSAoUHlfVUNTNCktMSk7CisgICAgICAgIC8qIFJlc3RvcmUgc3RyLCB3aGljaCB3ZSBlYXJsaWVyIG1vZGlmaWVkIGRpcmVjdGx5LiAqLworICAgICAgICBpZiAoUHlVbmljb2RlX1dyaXRlQ2hhcihzdHIsIDAsICd7JykgPCAwIHx8CisgICAgICAgICAgICBQeVVuaWNvZGVfV3JpdGVDaGFyKHN0ciwgZXhwcl9lbmQtZXhwcl9zdGFydCsxLCBlbmRfY2gpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHJldHVybiBtb2QtPnYuRXhwcmVzc2lvbi5ib2R5OworCitlcnJvcjoKKyAgICAvKiBPbmx5IGRlY3JlZiBzdWIgaWYgaXQgd2FzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIFN1YlN0cmluZy4gKi8KKyAgICBpZiAoZGVjcmVmX3N1YikKKyAgICAgICAgUHlfWERFQ1JFRihzdWIpOworCisgICAgaWYgKGVuZF9jaCAhPSAoUHlfVUNTNCktMSkgeworICAgICAgICAvKiBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIG1vZGlmaWVkIHN0ci4gTWFrZSBzdXJlIHRoYXQncyB0aGUKKyAgICAgICAgICAgY2FzZTogc3RyIHdpbGwgYmUgZXF1YWwgdG8gc3ViLiAqLworICAgICAgICBpZiAoc3RyID09IHN1YikgeworICAgICAgICAgICAgLyogRG9uJ3QgY2hlY2sgdGhlIGVycm9yLCBiZWNhdXNlIHdlJ3ZlIGFscmVhZHkgc2V0IHRoZQorICAgICAgICAgICAgICAgZXJyb3Igc3RhdGUgKHRoYXQncyB3aHkgd2UncmUgaW4gJ2Vycm9yJywgYWZ0ZXIKKyAgICAgICAgICAgICAgIGFsbCkuICovCisgICAgICAgICAgICBQeVVuaWNvZGVfV3JpdGVDaGFyKHN0ciwgMCwgJ3snKTsKKyAgICAgICAgICAgIFB5VW5pY29kZV9Xcml0ZUNoYXIoc3RyLCBleHByX2VuZC1leHByX3N0YXJ0KzEsIGVuZF9jaCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJldHVybiAtMSBvbiBlcnJvci4KKworICAgUmV0dXJuIDAgaWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBsaXRlcmFsLgorCisgICBSZXR1cm4gMSBpZiB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbGl0ZXJhbCwgYnV0IHdlIHdhbnQKKyAgIHRoZSBjYWxsZXIgdG8gcHJvY2VzcyB0aGUgbGl0ZXJhbCB1cCB0byB0aGlzIHBvaW50LiBVc2VkIGZvcgorICAgZG91YmxlZCBicmFjZXMuCisqLworc3RhdGljIGludAorZnN0cmluZ19maW5kX2xpdGVyYWwoUHlPYmplY3QgKnN0ciwgUHlfc3NpemVfdCAqb2ZzLCBQeU9iamVjdCAqKmxpdGVyYWwsCisgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdXJzZV9sdmwsIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgLyogR2V0IGFueSBsaXRlcmFsIHN0cmluZy4gSXQgZW5kcyB3aGVuIHdlIGhpdCBhbiB1bi1kb3VibGVkIGJyYWNlLCBvciB0aGUKKyAgICAgICBlbmQgb2YgdGhlIHN0cmluZy4gKi8KKworICAgIFB5X3NzaXplX3QgbGl0ZXJhbF9zdGFydCwgbGl0ZXJhbF9lbmQ7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBlbnVtIFB5VW5pY29kZV9LaW5kIGtpbmQgPSBQeVVuaWNvZGVfS0lORChzdHIpOworICAgIHZvaWQgKmRhdGEgPSBQeVVuaWNvZGVfREFUQShzdHIpOworCisgICAgYXNzZXJ0KCpsaXRlcmFsID09IE5VTEwpOworCisgICAgbGl0ZXJhbF9zdGFydCA9ICpvZnM7CisgICAgZm9yICg7ICpvZnMgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpOyAqb2ZzICs9IDEpIHsKKyAgICAgICAgUHlfVUNTNCBjaCA9IFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpOworICAgICAgICBpZiAoY2ggPT0gJ3snIHx8IGNoID09ICd9JykgeworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIGRvdWJsZWQgYnJhY2VzLCBidXQgb25seSBhdCB0aGUgdG9wIGxldmVsLiBJZgorICAgICAgICAgICAgICAgd2UgY2hlY2tlZCBhdCBldmVyeSBsZXZlbCwgdGhlbiBmJ3swOnszfX0nIHdvdWxkIGZhaWwKKyAgICAgICAgICAgICAgIHdpdGggdGhlIHR3byBjbG9zaW5nIGJyYWNlcy4gKi8KKyAgICAgICAgICAgIGlmIChyZWN1cnNlX2x2bCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCpvZnMgKyAxIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzICsgMSkgPT0gY2gpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgZ29pbmcgdG8gdGVsbCB0aGUgY2FsbGVyIHRoYXQgdGhlIGxpdGVyYWwgZW5kcworICAgICAgICAgICAgICAgICAgICAgICBoZXJlLCBidXQgdGhhdCB0aGV5IHNob3VsZCBjb250aW51ZSBzY2FubmluZy4gQnV0IGFsc28KKyAgICAgICAgICAgICAgICAgICAgICAgc2tpcCBvdmVyIHRoZSBzZWNvbmQgYnJhY2Ugd2hlbiB3ZSByZXN1bWUgc2Nhbm5pbmcuICovCisgICAgICAgICAgICAgICAgICAgIGxpdGVyYWxfZW5kID0gKm9mcyArIDE7CisgICAgICAgICAgICAgICAgICAgICpvZnMgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFdoZXJlIGEgc2luZ2xlICd7JyBpcyB0aGUgc3RhcnQgb2YgYSBuZXcgZXhwcmVzc2lvbiwgYQorICAgICAgICAgICAgICAgICAgIHNpbmdsZSAnfScgaXMgbm90IGFsbG93ZWQuICovCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICd9JykgeworICAgICAgICAgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiBzaW5nbGUgJ30nIGlzIG5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdlJ3JlIGVpdGhlciBhdCBhICd7Jywgd2hpY2ggbWVhbnMgd2UncmUgc3RhcnRpbmcgYW5vdGhlcgorICAgICAgICAgICAgICAgZXhwcmVzc2lvbjsgb3IgYSAnfScsIHdoaWNoIG1lYW5zIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhpcworICAgICAgICAgICAgICAgZi1zdHJpbmcgKGZvciBhIG5lc3RlZCBmb3JtYXRfc3BlYykuICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBsaXRlcmFsX2VuZCA9ICpvZnM7CisKKyAgICBhc3NlcnQoKm9mcyA9PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpIHx8CisgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd7JyB8fAorICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKSA9PSAnfScpOworZG9uZToKKyAgICBpZiAobGl0ZXJhbF9zdGFydCAhPSBsaXRlcmFsX2VuZCkgeworICAgICAgICAqbGl0ZXJhbCA9IFB5VW5pY29kZV9TdWJzdHJpbmcoc3RyLCBsaXRlcmFsX3N0YXJ0LCBsaXRlcmFsX2VuZCk7CisgICAgICAgIGlmICghKmxpdGVyYWwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogRm9yd2FyZCBkZWNsYXJhdGlvbiBiZWNhdXNlIHBhcnNpbmcgaXMgcmVjdXJzaXZlLiAqLworc3RhdGljIGV4cHJfdHkKK2ZzdHJpbmdfcGFyc2UoUHlPYmplY3QgKnN0ciwgUHlfc3NpemVfdCAqb2ZzLCBpbnQgcmVjdXJzZV9sdmwsCisgICAgICAgICAgICAgIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pOworCisvKiBQYXJzZSB0aGUgZi1zdHJpbmcgc3RyLCBzdGFydGluZyBhdCBvZnMuIFdlIGtub3cgKm9mcyBzdGFydHMgYW4KKyAgIGV4cHJlc3Npb24gKHNvIGl0IG11c3QgYmUgYSAneycpLiBSZXR1cm5zIHRoZSBGb3JtYXR0ZWRWYWx1ZSBub2RlLAorICAgd2hpY2ggaW5jbHVkZXMgdGhlIGV4cHJlc3Npb24sIGNvbnZlcnNpb24gY2hhcmFjdGVyLCBhbmQKKyAgIGZvcm1hdF9zcGVjIGV4cHJlc3Npb24uCisKKyAgIE5vdGUgdGhhdCBJIGRvbid0IGRvIGEgcGVyZmVjdCBqb2IgaGVyZTogSSBkb24ndCBtYWtlIHN1cmUgdGhhdCBhCisgICBjbG9zaW5nIGJyYWNlIGRvZXNuJ3QgbWF0Y2ggYW4gb3BlbmluZyBwYXJlbiwgZm9yIGV4YW1wbGUuIEl0CisgICBkb2Vzbid0IG5lZWQgdG8gZXJyb3Igb24gYWxsIGludmFsaWQgZXhwcmVzc2lvbnMsIGp1c3QgY29ycmVjdGx5CisgICBmaW5kIHRoZSBlbmQgb2YgYWxsIHZhbGlkIG9uZXMuIEFueSBlcnJvcnMgaW5zaWRlIHRoZSBleHByZXNzaW9uCisgICB3aWxsIGJlIGNhdWdodCB3aGVuIHdlIHBhcnNlIGl0IGxhdGVyLiAqLworc3RhdGljIGludAorZnN0cmluZ19maW5kX2V4cHIoUHlPYmplY3QgKnN0ciwgUHlfc3NpemVfdCAqb2ZzLCBpbnQgcmVjdXJzZV9sdmwsCisgICAgICAgICAgICAgICAgICBleHByX3R5ICpleHByZXNzaW9uLCBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIC8qIFJldHVybiAtMSBvbiBlcnJvciwgZWxzZSAwLiAqLworCisgICAgUHlfc3NpemVfdCBleHByX3N0YXJ0OworICAgIFB5X3NzaXplX3QgZXhwcl9lbmQ7CisgICAgZXhwcl90eSBzaW1wbGVfZXhwcmVzc2lvbjsKKyAgICBleHByX3R5IGZvcm1hdF9zcGVjID0gTlVMTDsgLyogT3B0aW9uYWwgZm9ybWF0IHNwZWNpZmllci4gKi8KKyAgICBQeV9VQ1M0IGNvbnZlcnNpb24gPSAtMTsgLyogVGhlIGNvbnZlcnNpb24gY2hhci4gLTEgaWYgbm90IHNwZWNpZmllZC4gKi8KKworICAgIGVudW0gUHlVbmljb2RlX0tpbmQga2luZCA9IFB5VW5pY29kZV9LSU5EKHN0cik7CisgICAgdm9pZCAqZGF0YSA9IFB5VW5pY29kZV9EQVRBKHN0cik7CisKKyAgICAvKiAwIGlmIHdlJ3JlIG5vdCBpbiBhIHN0cmluZywgZWxzZSB0aGUgcXVvdGUgY2hhciB3ZSdyZSB0cnlpbmcgdG8KKyAgICAgICBtYXRjaCAoc2luZ2xlIG9yIGRvdWJsZSBxdW90ZSkuICovCisgICAgUHlfVUNTNCBxdW90ZV9jaGFyID0gMDsKKworICAgIC8qIElmIHdlJ3JlIGluc2lkZSBhIHN0cmluZywgMT1ub3JtYWwsIDM9dHJpcGxlLXF1b3RlZC4gKi8KKyAgICBpbnQgc3RyaW5nX3R5cGUgPSAwOworCisgICAgLyogS2VlcCB0cmFjayBvZiBuZXN0aW5nIGxldmVsIGZvciBicmFjZXMvcGFyZW5zL2JyYWNrZXRzIGluCisgICAgICAgZXhwcmVzc2lvbnMuICovCisgICAgUHlfc3NpemVfdCBuZXN0ZWRfZGVwdGggPSAwOworCisgICAgLyogQ2FuIG9ubHkgbmVzdCBvbmUgbGV2ZWwgZGVlcC4gKi8KKyAgICBpZiAocmVjdXJzZV9sdmwgPj0gMikgeworICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiBleHByZXNzaW9ucyBuZXN0ZWQgdG9vIGRlZXBseSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogVGhlIGZpcnN0IGNoYXIgbXVzdCBiZSBhIGxlZnQgYnJhY2UsIG9yIHdlIHdvdWxkbid0IGhhdmUgZ290dGVuCisgICAgICAgaGVyZS4gU2tpcCBvdmVyIGl0LiAqLworICAgIGFzc2VydChQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKSA9PSAneycpOworICAgICpvZnMgKz0gMTsKKworICAgIGV4cHJfc3RhcnQgPSAqb2ZzOworICAgIGZvciAoOyAqb2ZzIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKTsgKm9mcyArPSAxKSB7CisgICAgICAgIFB5X1VDUzQgY2g7CisKKyAgICAgICAgLyogTG9vcCBpbnZhcmlhbnRzLiAqLworICAgICAgICBhc3NlcnQobmVzdGVkX2RlcHRoID49IDApOworICAgICAgICBhc3NlcnQoKm9mcyA+PSBleHByX3N0YXJ0KTsKKyAgICAgICAgaWYgKHF1b3RlX2NoYXIpCisgICAgICAgICAgICBhc3NlcnQoc3RyaW5nX3R5cGUgPT0gMSB8fCBzdHJpbmdfdHlwZSA9PSAzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0KHN0cmluZ190eXBlID09IDApOworCisgICAgICAgIGNoID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcyk7CisgICAgICAgIGlmIChxdW90ZV9jaGFyKSB7CisgICAgICAgICAgICAvKiBXZSdyZSBpbnNpZGUgYSBzdHJpbmcuIFNlZSBpZiB3ZSdyZSBhdCB0aGUgZW5kLiAqLworICAgICAgICAgICAgLyogVGhpcyBjb2RlIG5lZWRzIHRvIGltcGxlbWVudCB0aGUgc2FtZSBub24tZXJyb3IgbG9naWMKKyAgICAgICAgICAgICAgIGFzIHRva19nZXQgZnJvbSB0b2tlbml6ZXIuYywgYXQgdGhlIGxldHRlcl9xdW90ZQorICAgICAgICAgICAgICAgbGFiZWwuIFRvIGFjdHVhbGx5IHNoYXJlIHRoYXQgY29kZSB3b3VsZCBiZSBhCisgICAgICAgICAgICAgICBuaWdodG1hcmUuIEJ1dCwgaXQncyB1bmxpa2VseSB0byBjaGFuZ2UgYW5kIGlzIHNtYWxsLAorICAgICAgICAgICAgICAgc28gZHVwbGljYXRlIGl0IGhlcmUuIE5vdGUgd2UgZG9uJ3QgbmVlZCB0byBjYXRjaCBhbGwKKyAgICAgICAgICAgICAgIG9mIHRoZSBlcnJvcnMsIHNpbmNlIHRoZXknbGwgYmUgY2F1Z2h0IHdoZW4gcGFyc2luZyB0aGUKKyAgICAgICAgICAgICAgIGV4cHJlc3Npb24uIFdlIGp1c3QgbmVlZCB0byBtYXRjaCB0aGUgbm9uLWVycm9yCisgICAgICAgICAgICAgICBjYXNlcy4gVGh1cyB3ZSBjYW4gaWdub3JlIFxuIGluIHNpbmdsZS1xdW90ZWQgc3RyaW5ncywKKyAgICAgICAgICAgICAgIGZvciBleGFtcGxlLiBPciBub24tdGVybWluYXRlZCBzdHJpbmdzLiAqLworICAgICAgICAgICAgaWYgKGNoID09IHF1b3RlX2NoYXIpIHsKKyAgICAgICAgICAgICAgICAvKiBEb2VzIHRoaXMgbWF0Y2ggdGhlIHN0cmluZ190eXBlIChzaW5nbGUgb3IgdHJpcGxlCisgICAgICAgICAgICAgICAgICAgcXVvdGVkKT8gKi8KKyAgICAgICAgICAgICAgICBpZiAoc3RyaW5nX3R5cGUgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKm9mcysyIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcysxKSA9PSBjaCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcysyKSA9PSBjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogV2UncmUgYXQgdGhlIGVuZCBvZiBhIHRyaXBsZSBxdW90ZWQgc3RyaW5nLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgKm9mcyArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFdlJ3JlIGF0IHRoZSBlbmQgb2YgYSBub3JtYWwgc3RyaW5nLiAqLworICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3R5cGUgPSAwOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBXZSdyZSBpbnNpZGUgYSBzdHJpbmcsIGFuZCBub3QgZmluaXNoZWQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgIHN0cmluZy4gSWYgdGhpcyBpcyBhIGJhY2tzbGFzaCwgc2tpcCB0aGUgbmV4dCBjaGFyIChpdAorICAgICAgICAgICAgICAgbWlnaHQgYmUgYW4gZW5kIHF1b3RlIHRoYXQgbmVlZHMgc2tpcHBpbmcpLiBPdGhlcndpc2UsCisgICAgICAgICAgICAgICBqdXN0IGNvbnN1bWUgdGhpcyBjaGFyYWN0ZXIgbm9ybWFsbHkuICovCisgICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyAmJiAqb2ZzKzEgPCBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKSB7CisgICAgICAgICAgICAgICAgLyogSnVzdCBza2lwIHRoZSBuZXh0IGNoYXIsIHdoYXRldmVyIGl0IGlzLiAqLworICAgICAgICAgICAgICAgICpvZnMgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCcnIHx8IGNoID09ICciJykgeworICAgICAgICAgICAgLyogSXMgdGhpcyBhIHRyaXBsZSBxdW90ZWQgc3RyaW5nPyAqLworICAgICAgICAgICAgaWYgKCpvZnMrMiA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgJiYKKyAgICAgICAgICAgICAgICBQeVVuaWNvZGVfUkVBRChraW5kLCBkYXRhLCAqb2ZzKzEpID09IGNoICYmCisgICAgICAgICAgICAgICAgUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcysyKSA9PSBjaCkgeworICAgICAgICAgICAgICAgIHN0cmluZ190eXBlID0gMzsKKyAgICAgICAgICAgICAgICAqb2ZzICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFN0YXJ0IG9mIGEgbm9ybWFsIHN0cmluZy4gKi8KKyAgICAgICAgICAgICAgICBzdHJpbmdfdHlwZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBTdGFydCBsb29raW5nIGZvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICovCisgICAgICAgICAgICBxdW90ZV9jaGFyID0gY2g7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1snIHx8IGNoID09ICd7JyB8fCBjaCA9PSAnKCcpIHsKKyAgICAgICAgICAgIG5lc3RlZF9kZXB0aCsrOworICAgICAgICB9IGVsc2UgaWYgKG5lc3RlZF9kZXB0aCAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgKGNoID09ICddJyB8fCBjaCA9PSAnfScgfHwgY2ggPT0gJyknKSkgeworICAgICAgICAgICAgbmVzdGVkX2RlcHRoLS07CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyMnKSB7CisgICAgICAgICAgICAvKiBFcnJvcjogY2FuJ3QgaW5jbHVkZSBhIGNvbW1lbnQgY2hhcmFjdGVyLCBpbnNpZGUgcGFyZW5zCisgICAgICAgICAgICAgICBvciBub3QuICovCisgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nIGNhbm5vdCBpbmNsdWRlICcjJyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKG5lc3RlZF9kZXB0aCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgKGNoID09ICchJyB8fCBjaCA9PSAnOicgfHwgY2ggPT0gJ30nKSkgeworICAgICAgICAgICAgLyogRmlyc3QsIHRlc3QgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgIiE9Ii4gU2luY2UgJz0nIGlzCisgICAgICAgICAgICAgICBub3QgYW4gYWxsb3dlZCBjb252ZXJzaW9uIGNoYXJhY3Rlciwgbm90aGluZyBpcyBsb3N0IGluCisgICAgICAgICAgICAgICB0aGlzIHRlc3QuICovCisgICAgICAgICAgICBpZiAoY2ggPT0gJyEnICYmICpvZnMrMSA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgJiYKKyAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMrMSkgPT0gJz0nKQorICAgICAgICAgICAgICAgIC8qIFRoaXMgaXNuJ3QgYSBjb252ZXJzaW9uIGNoYXJhY3RlciwganVzdCBjb250aW51ZS4gKi8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLyogTm9ybWFsIHdheSBvdXQgb2YgdGhpcyBsb29wLiAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBKdXN0IGNvbnN1bWUgdGhpcyBjaGFyIGFuZCBsb29wIGFyb3VuZC4gKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBleHByX2VuZCA9ICpvZnM7CisgICAgLyogSWYgd2UgbGVhdmUgdGhpcyBsb29wIGluIGEgc3RyaW5nIG9yIHdpdGggbWlzbWF0Y2hlZCBwYXJlbnMsIHdlCisgICAgICAgZG9uJ3QgY2FyZS4gV2UnbGwgZ2V0IGEgc3ludGF4IGVycm9yIHdoZW4gY29tcGlsaW5nIHRoZQorICAgICAgIGV4cHJlc3Npb24uIEJ1dCwgd2UgY2FuIHByb2R1Y2UgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSwgc28KKyAgICAgICBsZXQncyBqdXN0IGRvIHRoYXQuKi8KKyAgICBpZiAocXVvdGVfY2hhcikgeworICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiB1bnRlcm1pbmF0ZWQgc3RyaW5nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG5lc3RlZF9kZXB0aCkgeworICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiBtaXNtYXRjaGVkICcoJywgJ3snLCBvciAnWyciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICgqb2ZzID49IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpCisgICAgICAgIGdvdG8gdW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOworCisgICAgLyogQ29tcGlsZSB0aGUgZXhwcmVzc2lvbiBhcyBzb29uIGFzIHBvc3NpYmxlLCBzbyB3ZSBzaG93IGVycm9ycworICAgICAgIHJlbGF0ZWQgdG8gdGhlIGV4cHJlc3Npb24gYmVmb3JlIGVycm9ycyByZWxhdGVkIHRvIHRoZQorICAgICAgIGNvbnZlcnNpb24gb3IgZm9ybWF0X3NwZWMuICovCisgICAgc2ltcGxlX2V4cHJlc3Npb24gPSBmc3RyaW5nX2NvbXBpbGVfZXhwcihzdHIsIGV4cHJfc3RhcnQsIGV4cHJfZW5kLCBjLCBuKTsKKyAgICBpZiAoIXNpbXBsZV9leHByZXNzaW9uKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBDaGVjayBmb3IgYSBjb252ZXJzaW9uIGNoYXIsIGlmIHByZXNlbnQuICovCisgICAgaWYgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICchJykgeworICAgICAgICAqb2ZzICs9IDE7CisgICAgICAgIGlmICgqb2ZzID49IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpCisgICAgICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKworICAgICAgICBjb252ZXJzaW9uID0gUHlVbmljb2RlX1JFQUQoa2luZCwgZGF0YSwgKm9mcyk7CisgICAgICAgICpvZnMgKz0gMTsKKworICAgICAgICAvKiBWYWxpZGF0ZSB0aGUgY29udmVyc2lvbi4gKi8KKyAgICAgICAgaWYgKCEoY29udmVyc2lvbiA9PSAncycgfHwgY29udmVyc2lvbiA9PSAncicKKyAgICAgICAgICAgICAgfHwgY29udmVyc2lvbiA9PSAnYScpKSB7CisgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiBpbnZhbGlkIGNvbnZlcnNpb24gY2hhcmFjdGVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICdzJywgJ3InLCBvciAnYSciKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoZWNrIGZvciB0aGUgZm9ybWF0IHNwZWMsIGlmIHByZXNlbnQuICovCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkKKyAgICAgICAgZ290byB1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc7CisgICAgaWYgKFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICc6JykgeworICAgICAgICAqb2ZzICs9IDE7CisgICAgICAgIGlmICgqb2ZzID49IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikpCisgICAgICAgICAgICBnb3RvIHVuZXhwZWN0ZWRfZW5kX29mX3N0cmluZzsKKworICAgICAgICAvKiBQYXJzZSB0aGUgZm9ybWF0IHNwZWMuICovCisgICAgICAgIGZvcm1hdF9zcGVjID0gZnN0cmluZ19wYXJzZShzdHIsIG9mcywgcmVjdXJzZV9sdmwrMSwgYywgbik7CisgICAgICAgIGlmICghZm9ybWF0X3NwZWMpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCpvZnMgPj0gUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSB8fAorICAgICAgICAgIFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpICE9ICd9JykKKyAgICAgICAgZ290byB1bmV4cGVjdGVkX2VuZF9vZl9zdHJpbmc7CisKKyAgICAvKiBXZSdyZSBhdCBhIHJpZ2h0IGJyYWNlLiBDb25zdW1lIGl0LiAqLworICAgIGFzc2VydCgqb2ZzIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSk7CisgICAgYXNzZXJ0KFB5VW5pY29kZV9SRUFEKGtpbmQsIGRhdGEsICpvZnMpID09ICd9Jyk7CisgICAgKm9mcyArPSAxOworCisgICAgLyogQW5kIG5vdyBjcmVhdGUgdGhlIEZvcm1hdHRlZFZhbHVlIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoaXMgZW50aXJlCisgICAgICAgZXhwcmVzc2lvbiB3aXRoIHRoZSBjb252ZXJzaW9uIGFuZCBmb3JtYXQgc3BlYy4gKi8KKyAgICAqZXhwcmVzc2lvbiA9IEZvcm1hdHRlZFZhbHVlKHNpbXBsZV9leHByZXNzaW9uLCAoaW50KWNvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3BlYywgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jX2FyZW5hKTsKKyAgICBpZiAoISpleHByZXNzaW9uKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gMDsKKwordW5leHBlY3RlZF9lbmRfb2Zfc3RyaW5nOgorICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIFJldHVybiAtMSBvbiBlcnJvci4KKworICAgUmV0dXJuIDAgaWYgd2UgaGF2ZSBhIGxpdGVyYWwgKHBvc3NpYmxlIHplcm8gbGVuZ3RoKSBhbmQgYW4KKyAgIGV4cHJlc3Npb24gKHplcm8gbGVuZ3RoIGlmIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKworICAgUmV0dXJuIDEgaWYgd2UgaGF2ZSBhIGxpdGVyYWwsIGJ1dCBubyBleHByZXNzaW9uLCBhbmQgd2Ugd2FudCB0aGUKKyAgIGNhbGxlciB0byBjYWxsIHVzIGFnYWluLiBUaGlzIGlzIHVzZWQgdG8gZGVhbCB3aXRoIGRvdWJsZWQKKyAgIGJyYWNlcy4KKworICAgV2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgb24gdGhlIHN0cmluZyAnYXt7YnswfWMnLCB0aGlzIGZ1bmN0aW9uCisgICB3aWxsIHJldHVybjoKKworICAgMS4gdGhlIGxpdGVyYWwgJ2F7JyB3aXRoIG5vIGV4cHJlc3Npb24sIGFuZCBhIHJldHVybiB2YWx1ZQorICAgICAgb2YgMS4gRGVzcGl0ZSB0aGUgZmFjdCB0aGF0IHRoZXJlJ3Mgbm8gZXhwcmVzc2lvbiwgdGhlIHJldHVybgorICAgICAgdmFsdWUgb2YgMSBtZWFucyB3ZSdyZSBub3QgZmluaXNoZWQgeWV0LgorCisgICAyLiB0aGUgbGl0ZXJhbCAnYicgYW5kIHRoZSBleHByZXNzaW9uICcwJywgd2l0aCBhIHJldHVybiB2YWx1ZSBvZgorICAgICAgMC4gVGhlIGZhY3QgdGhhdCB0aGVyZSdzIGFuIGV4cHJlc3Npb24gbWVhbnMgd2UncmUgbm90IGZpbmlzaGVkLgorCisgICAzLiBsaXRlcmFsICdjJyB3aXRoIG5vIGV4cHJlc3Npb24gYW5kIGEgcmV0dXJuIHZhbHVlIG9mIDAuIFRoZQorICAgICAgY29tYmluYXRpb24gb2YgdGhlIHJldHVybiB2YWx1ZSBvZiAwIHdpdGggbm8gZXhwcmVzc2lvbiBtZWFucworICAgICAgd2UncmUgZmluaXNoZWQuCisqLworc3RhdGljIGludAorZnN0cmluZ19maW5kX2xpdGVyYWxfYW5kX2V4cHIoUHlPYmplY3QgKnN0ciwgUHlfc3NpemVfdCAqb2ZzLCBpbnQgcmVjdXJzZV9sdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqKmxpdGVyYWwsIGV4cHJfdHkgKmV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIGludCByZXN1bHQ7CisKKyAgICBhc3NlcnQoKmxpdGVyYWwgPT0gTlVMTCAmJiAqZXhwcmVzc2lvbiA9PSBOVUxMKTsKKworICAgIC8qIEdldCBhbnkgbGl0ZXJhbCBzdHJpbmcuICovCisgICAgcmVzdWx0ID0gZnN0cmluZ19maW5kX2xpdGVyYWwoc3RyLCBvZnMsIGxpdGVyYWwsIHJlY3Vyc2VfbHZsLCBjLCBuKTsKKyAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGFzc2VydChyZXN1bHQgPT0gMCB8fCByZXN1bHQgPT0gMSk7CisKKyAgICBpZiAocmVzdWx0ID09IDEpCisgICAgICAgIC8qIFdlIGhhdmUgYSBsaXRlcmFsLCBidXQgZG9uJ3QgbG9vayBhdCB0aGUgZXhwcmVzc2lvbi4gKi8KKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBhc3NlcnQoKm9mcyA8PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKworICAgIGlmICgqb2ZzID49IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgfHwKKyAgICAgICAgUHlVbmljb2RlX1JFQURfQ0hBUihzdHIsICpvZnMpID09ICd9JykKKyAgICAgICAgLyogV2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIG9yIHRoZSBlbmQgb2YgYSBuZXN0ZWQKKyAgICAgICAgICAgZi1zdHJpbmc6IG5vIGV4cHJlc3Npb24uIFRoZSB0b3AtbGV2ZWwgZXJyb3IgY2FzZSB3aGVyZSB3ZQorICAgICAgICAgICBleHBlY3QgdG8gYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGJ1dCB3ZSdyZSBhdCBhICd9JyBpcworICAgICAgICAgICBoYW5kbGVkIGxhdGVyLiAqLworICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIFdlIG11c3Qgbm93IGJlIHRoZSBzdGFydCBvZiBhbiBleHByZXNzaW9uLCBvbiBhICd7Jy4gKi8KKyAgICBhc3NlcnQoKm9mcyA8IFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgJiYKKyAgICAgICAgICAgUHlVbmljb2RlX1JFQURfQ0hBUihzdHIsICpvZnMpID09ICd7Jyk7CisKKyAgICBpZiAoZnN0cmluZ19maW5kX2V4cHIoc3RyLCBvZnMsIHJlY3Vyc2VfbHZsLCBleHByZXNzaW9uLCBjLCBuKSA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgUHlfQ0xFQVIoKmxpdGVyYWwpOworICAgIHJldHVybiAtMTsKK30KKworI2RlZmluZSBFWFBSTElTVF9OX0NBQ0hFRCAgNjQKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIEluY3JlbWVudGFsbHkgYnVpbGQgYW4gYXJyYXkgb2YgZXhwcl90eSwgc28gYmUgdXNlZCBpbiBhbgorICAgICAgIGFzZGxfc2VxLiBDYWNoZSBzb21lIHNtYWxsIGJ1dCByZWFzb25hYmx5IHNpemVkIG51bWJlciBvZgorICAgICAgIGV4cHJfdHkncywgYW5kIHRoZW4gYWZ0ZXIgdGhhdCBzdGFydCBkeW5hbWljYWxseSBhbGxvY2F0aW5nLAorICAgICAgIGRvdWJsaW5nIHRoZSBudW1iZXIgYWxsb2NhdGVkIGVhY2ggdGltZS4gTm90ZSB0aGF0IHRoZSBmLXN0cmluZworICAgICAgIGYnezB9YXsxfScgY29udGFpbnMgMyBleHByX3R5J3M6IDIgRm9ybWF0dGVkVmFsdWUncywgYW5kIG9uZQorICAgICAgIFN0ciBmb3IgdGhlIGxpdGVyYWwgJ2EnLiBTbyB5b3UgYWRkIGV4cHJfdHkncyBhYm91dCB0d2ljZSBhcworICAgICAgIGZhc3QgYXMgeW91IGFkZCBleHJlc3Npb25zIGluIGFuIGYtc3RyaW5nLiAqLworCisgICAgUHlfc3NpemVfdCBhbGxvY2F0ZWQ7ICAvKiBOdW1iZXIgd2UndmUgYWxsb2NhdGVkLiAqLworICAgIFB5X3NzaXplX3Qgc2l6ZTsgICAgICAgLyogTnVtYmVyIHdlJ3ZlIHVzZWQuICovCisgICAgZXhwcl90eSAgICAqcDsgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBtZW1vcnkgd2UncmUgYWN0dWFsbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nLiBXaWxsIHBvaW50IHRvICdkYXRhJyB1bnRpbCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgZHluYW1pY2FsbHkgYWxsb2NhdGluZy4gKi8KKyAgICBleHByX3R5ICAgIGRhdGFbRVhQUkxJU1RfTl9DQUNIRURdOworfSBFeHByTGlzdDsKKworI2lmZGVmIE5ERUJVRworI2RlZmluZSBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpCisjZWxzZQorc3RhdGljIHZvaWQKK0V4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMoRXhwckxpc3QgKmwpCit7CisgICAgLyogQ2hlY2sgb3VyIGludmFyaWFudHMuIE1ha2Ugc3VyZSB0aGlzIG9iamVjdCBpcyAibGl2ZSIsIGFuZAorICAgICAgIGhhc24ndCBiZWVuIGRlYWxsb2NhdGVkLiAqLworICAgIGFzc2VydChsLT5zaXplID49IDApOworICAgIGFzc2VydChsLT5wICE9IE5VTEwpOworICAgIGlmIChsLT5zaXplIDw9IEVYUFJMSVNUX05fQ0FDSEVEKQorICAgICAgICBhc3NlcnQobC0+ZGF0YSA9PSBsLT5wKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorRXhwckxpc3RfSW5pdChFeHByTGlzdCAqbCkKK3sKKyAgICBsLT5hbGxvY2F0ZWQgPSBFWFBSTElTVF9OX0NBQ0hFRDsKKyAgICBsLT5zaXplID0gMDsKKworICAgIC8qIFVudGlsIHdlIHN0YXJ0IGFsbG9jYXRpbmcgZHluYW1pY2FsbHksIHAgcG9pbnRzIHRvIGRhdGEuICovCisgICAgbC0+cCA9IGwtPmRhdGE7CisKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpOworfQorCitzdGF0aWMgaW50CitFeHByTGlzdF9BcHBlbmQoRXhwckxpc3QgKmwsIGV4cHJfdHkgZXhwKQoreworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMobCk7CisgICAgaWYgKGwtPnNpemUgPj0gbC0+YWxsb2NhdGVkKSB7CisgICAgICAgIC8qIFdlIG5lZWQgdG8gYWxsb2MgKG9yIHJlYWxsb2MpIHRoZSBtZW1vcnkuICovCisgICAgICAgIFB5X3NzaXplX3QgbmV3X3NpemUgPSBsLT5hbGxvY2F0ZWQgKiAyOworCisgICAgICAgIC8qIFNlZSBpZiB3ZSd2ZSBldmVyIGFsbG9jYXRlZCBhbnl0aGluZyBkeW5hbWljYWxseS4gKi8KKyAgICAgICAgaWYgKGwtPnAgPT0gbC0+ZGF0YSkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBpOworICAgICAgICAgICAgLyogV2UncmUgc3RpbGwgdXNpbmcgdGhlIGNhY2hlZCBkYXRhLiBTd2l0Y2ggdG8KKyAgICAgICAgICAgICAgIGFsbG9jLWluZy4gKi8KKyAgICAgICAgICAgIGwtPnAgPSBQeU1lbV9SYXdNYWxsb2Moc2l6ZW9mKGV4cHJfdHkpICogbmV3X3NpemUpOworICAgICAgICAgICAgaWYgKCFsLT5wKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIC8qIENvcHkgdGhlIGNhY2hlZCBkYXRhIGludG8gdGhlIG5ldyBidWZmZXIuICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbC0+c2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIGwtPnBbaV0gPSBsLT5kYXRhW2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogSnVzdCByZWFsbG9jLiAqLworICAgICAgICAgICAgZXhwcl90eSAqdG1wID0gUHlNZW1fUmF3UmVhbGxvYyhsLT5wLCBzaXplb2YoZXhwcl90eSkgKiBuZXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXRtcCkgeworICAgICAgICAgICAgICAgIFB5TWVtX1Jhd0ZyZWUobC0+cCk7CisgICAgICAgICAgICAgICAgbC0+cCA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbC0+cCA9IHRtcDsKKyAgICAgICAgfQorCisgICAgICAgIGwtPmFsbG9jYXRlZCA9IG5ld19zaXplOworICAgICAgICBhc3NlcnQobC0+YWxsb2NhdGVkID09IDIgKiBsLT5zaXplKTsKKyAgICB9CisKKyAgICBsLT5wW2wtPnNpemUrK10gPSBleHA7CisKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorRXhwckxpc3RfRGVhbGxvYyhFeHByTGlzdCAqbCkKK3sKKyAgICBFeHByTGlzdF9jaGVja19pbnZhcmlhbnRzKGwpOworCisgICAgLyogSWYgdGhlcmUncyBiZWVuIGFuIGVycm9yLCBvciB3ZSd2ZSBuZXZlciBkeW5hbWljYWxseSBhbGxvY2F0ZWQsCisgICAgICAgZG8gbm90aGluZy4gKi8KKyAgICBpZiAoIWwtPnAgfHwgbC0+cCA9PSBsLT5kYXRhKSB7CisgICAgICAgIC8qIERvIG5vdGhpbmcuICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogV2UgaGF2ZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQuIEZyZWUgdGhlIG1lbW9yeS4gKi8KKyAgICAgICAgUHlNZW1fUmF3RnJlZShsLT5wKTsKKyAgICB9CisgICAgbC0+cCA9IE5VTEw7CisgICAgbC0+c2l6ZSA9IC0xOworfQorCitzdGF0aWMgYXNkbF9zZXEgKgorRXhwckxpc3RfRmluaXNoKEV4cHJMaXN0ICpsLCBQeUFyZW5hICphcmVuYSkKK3sKKyAgICBhc2RsX3NlcSAqc2VxOworCisgICAgRXhwckxpc3RfY2hlY2tfaW52YXJpYW50cyhsKTsKKworICAgIC8qIEFsbG9jYXRlIHRoZSBhc2RsX3NlcSBhbmQgY29weSB0aGUgZXhwcmVzc2lvbnMgaW4gdG8gaXQuICovCisgICAgc2VxID0gX1B5X2FzZGxfc2VxX25ldyhsLT5zaXplLCBhcmVuYSk7CisgICAgaWYgKHNlcSkgeworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsLT5zaXplOyBpKyspCisgICAgICAgICAgICBhc2RsX3NlcV9TRVQoc2VxLCBpLCBsLT5wW2ldKTsKKyAgICB9CisgICAgRXhwckxpc3RfRGVhbGxvYyhsKTsKKyAgICByZXR1cm4gc2VxOworfQorCisvKiBUaGUgRnN0cmluZ1BhcnNlciBpcyBkZXNpZ25lZCB0byBhZGQgYSBtaXggb2Ygc3RyaW5ncyBhbmQKKyAgIGYtc3RyaW5ncywgYW5kIGNvbmNhdCB0aGVtIHRvZ2V0aGVyIGFzIG5lZWRlZC4gVWx0aW1hdGVseSwgaXQKKyAgIGdlbmVyYXRlcyBhbiBleHByX3R5LiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0ICpsYXN0X3N0cjsKKyAgICBFeHByTGlzdCBleHByX2xpc3Q7Cit9IEZzdHJpbmdQYXJzZXI7CisKKyNpZmRlZiBOREVCVUcKKyNkZWZpbmUgRnN0cmluZ1BhcnNlcl9jaGVja19pbnZhcmlhbnRzKHN0YXRlKQorI2Vsc2UKK3N0YXRpYyB2b2lkCitGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoRnN0cmluZ1BhcnNlciAqc3RhdGUpCit7CisgICAgaWYgKHN0YXRlLT5sYXN0X3N0cikKKyAgICAgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVja0V4YWN0KHN0YXRlLT5sYXN0X3N0cikpOworICAgIEV4cHJMaXN0X2NoZWNrX2ludmFyaWFudHMoJnN0YXRlLT5leHByX2xpc3QpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitGc3RyaW5nUGFyc2VyX0luaXQoRnN0cmluZ1BhcnNlciAqc3RhdGUpCit7CisgICAgc3RhdGUtPmxhc3Rfc3RyID0gTlVMTDsKKyAgICBFeHByTGlzdF9Jbml0KCZzdGF0ZS0+ZXhwcl9saXN0KTsKKyAgICBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpOworfQorCitzdGF0aWMgdm9pZAorRnN0cmluZ1BhcnNlcl9EZWFsbG9jKEZzdHJpbmdQYXJzZXIgKnN0YXRlKQoreworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICBQeV9YREVDUkVGKHN0YXRlLT5sYXN0X3N0cik7CisgICAgRXhwckxpc3RfRGVhbGxvYygmc3RhdGUtPmV4cHJfbGlzdCk7Cit9CisKKy8qIE1ha2UgYSBTdHIgbm9kZSwgYnV0IGRlY3JlZiB0aGUgUHlVbmljb2RlIG9iamVjdCBiZWluZyBhZGRlZC4gKi8KK3N0YXRpYyBleHByX3R5CittYWtlX3N0cl9ub2RlX2FuZF9kZWwoUHlPYmplY3QgKipzdHIsIHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUqIG4pCit7CisgICAgUHlPYmplY3QgKnMgPSAqc3RyOworICAgICpzdHIgPSBOVUxMOworICAgIGFzc2VydChQeVVuaWNvZGVfQ2hlY2tFeGFjdChzKSk7CisgICAgaWYgKFB5QXJlbmFfQWRkUHlPYmplY3QoYy0+Y19hcmVuYSwgcykgPCAwKSB7CisgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBTdHIocywgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworfQorCisvKiBBZGQgYSBub24tZi1zdHJpbmcgKHRoYXQgaXMsIGEgcmVndWxhciBsaXRlcmFsIHN0cmluZykuIHN0ciBpcworICAgZGVjcmVmJ2QuICovCitzdGF0aWMgaW50CitGc3RyaW5nUGFyc2VyX0NvbmNhdEFuZERlbChGc3RyaW5nUGFyc2VyICpzdGF0ZSwgUHlPYmplY3QgKnN0cikKK3sKKyAgICBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpOworCisgICAgYXNzZXJ0KFB5VW5pY29kZV9DaGVja0V4YWN0KHN0cikpOworCisgICAgaWYgKFB5VW5pY29kZV9HRVRfTEVOR1RIKHN0cikgPT0gMCkgeworICAgICAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpIHsKKyAgICAgICAgLyogV2UgZGlkbid0IGhhdmUgYSBzdHJpbmcgYmVmb3JlLCBzbyBqdXN0IHJlbWVtYmVyIHRoaXMgb25lLiAqLworICAgICAgICBzdGF0ZS0+bGFzdF9zdHIgPSBzdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ29uY2F0ZW5hdGUgdGhpcyB3aXRoIHRoZSBwcmV2aW91cyBzdHJpbmcuICovCisgICAgICAgIFB5VW5pY29kZV9BcHBlbmRBbmREZWwoJnN0YXRlLT5sYXN0X3N0ciwgc3RyKTsKKyAgICAgICAgaWYgKCFzdGF0ZS0+bGFzdF9zdHIpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFBhcnNlIGFuIGYtc3RyaW5nLiBUaGUgZi1zdHJpbmcgaXMgaW4gc3RyLCBzdGFydGluZyBhdCBvZnMsIHdpdGggbm8gJ2YnCisgICBvciBxdW90ZXMuIHN0ciBpcyBub3QgZGVjcmVmJ2QsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgaXQncyB1c2VkIGVsc2V3aGVyZS4KKyAgIEFuZCBpZiB3ZSdyZSBvbmx5IGxvb2tpbmcgYXQgYSBwYXJ0IG9mIGEgc3RyaW5nLCB0aGVuIGRlY3JlZidpbmcgaXMKKyAgIGRlZmluaXRlbHkgbm90IHRoZSByaWdodCB0aGluZyB0byBkbyEgKi8KK3N0YXRpYyBpbnQKK0ZzdHJpbmdQYXJzZXJfQ29uY2F0RnN0cmluZyhGc3RyaW5nUGFyc2VyICpzdGF0ZSwgUHlPYmplY3QgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29tcGlsaW5nICpjLCBjb25zdCBub2RlICpuKQoreworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisKKyAgICAvKiBQYXJzZSB0aGUgZi1zdHJpbmcuICovCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgUHlPYmplY3QgKmxpdGVyYWwgPSBOVUxMOworICAgICAgICBleHByX3R5IGV4cHJlc3Npb24gPSBOVUxMOworCisgICAgICAgIC8qIElmIHRoZXJlJ3MgYSB6ZXJvIGxlbmd0aCBsaXRlcmFsIGluIGZyb250IG9mIHRoZQorICAgICAgICAgICBleHByZXNzaW9uLCBsaXRlcmFsIHdpbGwgYmUgTlVMTC4gSWYgd2UncmUgYXQgdGhlIGVuZCBvZgorICAgICAgICAgICB0aGUgZi1zdHJpbmcsIGV4cHJlc3Npb24gd2lsbCBiZSBOVUxMICh1bmxlc3MgcmVzdWx0ID09IDEsCisgICAgICAgICAgIHNlZSBiZWxvdykuICovCisgICAgICAgIGludCByZXN1bHQgPSBmc3RyaW5nX2ZpbmRfbGl0ZXJhbF9hbmRfZXhwcihzdHIsIG9mcywgcmVjdXJzZV9sdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0ZXJhbCwgJmV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLCBuKTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgLyogQWRkIHRoZSBsaXRlcmFsLCBpZiBhbnkuICovCisgICAgICAgIGlmICghbGl0ZXJhbCkgeworICAgICAgICAgICAgLyogRG8gbm90aGluZy4gSnVzdCBsZWF2ZSBsYXN0X3N0ciBhbG9uZSAoYW5kIHBvc3NpYmx5CisgICAgICAgICAgICAgICBOVUxMKS4gKi8KKyAgICAgICAgfSBlbHNlIGlmICghc3RhdGUtPmxhc3Rfc3RyKSB7CisgICAgICAgICAgICBzdGF0ZS0+bGFzdF9zdHIgPSBsaXRlcmFsOworICAgICAgICAgICAgbGl0ZXJhbCA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBXZSBoYXZlIGEgbGl0ZXJhbCwgY29uY2F0ZW5hdGUgaXQuICovCisgICAgICAgICAgICBhc3NlcnQoUHlVbmljb2RlX0dFVF9MRU5HVEgobGl0ZXJhbCkgIT0gMCk7CisgICAgICAgICAgICBpZiAoRnN0cmluZ1BhcnNlcl9Db25jYXRBbmREZWwoc3RhdGUsIGxpdGVyYWwpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBsaXRlcmFsID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoIXN0YXRlLT5sYXN0X3N0ciB8fAorICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RhdGUtPmxhc3Rfc3RyKSAhPSAwKTsKKworICAgICAgICAvKiBXZSd2ZSBkZWFsdCB3aXRoIHRoZSBsaXRlcmFsIG5vdy4gSXQgY2FuJ3QgYmUgbGVha2VkIG9uIGZ1cnRoZXIKKyAgICAgICAgICAgZXJyb3JzLiAqLworICAgICAgICBhc3NlcnQobGl0ZXJhbCA9PSBOVUxMKTsKKworICAgICAgICAvKiBTZWUgaWYgd2Ugc2hvdWxkIGp1c3QgbG9vcCBhcm91bmQgdG8gZ2V0IHRoZSBuZXh0IGxpdGVyYWwKKyAgICAgICAgICAgYW5kIGV4cHJlc3Npb24sIHdoaWxlIGlnbm9yaW5nIHRoZSBleHByZXNzaW9uIHRoaXMKKyAgICAgICAgICAgdGltZS4gVGhpcyBpcyB1c2VkIGZvciB1bi1kb3VibGluZyBicmFjZXMsIGFzIGFuCisgICAgICAgICAgIG9wdGltaXphdGlvbi4gKi8KKyAgICAgICAgaWYgKHJlc3VsdCA9PSAxKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKCFleHByZXNzaW9uKQorICAgICAgICAgICAgLyogV2UncmUgZG9uZSB3aXRoIHRoaXMgZi1zdHJpbmcuICovCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBXZSBrbm93IHdlIGhhdmUgYW4gZXhwcmVzc2lvbi4gQ29udmVydCBhbnkgZXhpc3Rpbmcgc3RyaW5nCisgICAgICAgICAgIHRvIGEgU3RyIG5vZGUuICovCisgICAgICAgIGlmICghc3RhdGUtPmxhc3Rfc3RyKSB7CisgICAgICAgICAgICAvKiBEbyBub3RoaW5nLiBObyBwcmV2aW91cyBsaXRlcmFsLiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogQ29udmVydCB0aGUgZXhpc3RpbmcgbGFzdF9zdHIgbGl0ZXJhbCB0byBhIFN0ciBub2RlLiAqLworICAgICAgICAgICAgZXhwcl90eSBzdHIgPSBtYWtlX3N0cl9ub2RlX2FuZF9kZWwoJnN0YXRlLT5sYXN0X3N0ciwgYywgbik7CisgICAgICAgICAgICBpZiAoIXN0ciB8fCBFeHByTGlzdF9BcHBlbmQoJnN0YXRlLT5leHByX2xpc3QsIHN0cikgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChFeHByTGlzdF9BcHBlbmQoJnN0YXRlLT5leHByX2xpc3QsIGV4cHJlc3Npb24pIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBhc3NlcnQoKm9mcyA8PSBQeVVuaWNvZGVfR0VUX0xFTkdUSChzdHIpKTsKKworICAgIC8qIElmIHJlY3Vyc2VfbHZsIGlzIHplcm8sIHRoZW4gd2UgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgIHN0cmluZy4gT3RoZXJ3aXNlLCB3ZSBtdXN0IGJlIGF0IGEgcmlnaHQgYnJhY2UuICovCisKKyAgICBpZiAocmVjdXJzZV9sdmwgPT0gMCAmJiAqb2ZzIDwgUHlVbmljb2RlX0dFVF9MRU5HVEgoc3RyKSkgeworICAgICAgICBhc3RfZXJyb3IoYywgbiwgImYtc3RyaW5nOiB1bmV4cGVjdGVkIGVuZCBvZiBzdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocmVjdXJzZV9sdmwgIT0gMCAmJiBQeVVuaWNvZGVfUkVBRF9DSEFSKHN0ciwgKm9mcykgIT0gJ30nKSB7CisgICAgICAgIGFzdF9lcnJvcihjLCBuLCAiZi1zdHJpbmc6IGV4cGVjdGluZyAnfSciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEZzdHJpbmdQYXJzZXJfY2hlY2tfaW52YXJpYW50cyhzdGF0ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIENvbnZlcnQgdGhlIHBhcnRpYWwgc3RhdGUgcmVmbGVjdGVkIGluIGxhc3Rfc3RyIGFuZCBleHByX2xpc3QgdG8gYW4KKyAgIGV4cHJfdHkuIFRoZSBleHByX3R5IGNhbiBiZSBhIFN0ciwgb3IgYSBKb2luZWRTdHIuICovCitzdGF0aWMgZXhwcl90eQorRnN0cmluZ1BhcnNlcl9GaW5pc2goRnN0cmluZ1BhcnNlciAqc3RhdGUsIHN0cnVjdCBjb21waWxpbmcgKmMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlICpuKQoreworICAgIGFzZGxfc2VxICpzZXE7CisKKyAgICBGc3RyaW5nUGFyc2VyX2NoZWNrX2ludmFyaWFudHMoc3RhdGUpOworCisgICAgLyogSWYgd2UncmUganVzdCBhIGNvbnN0YW50IHN0cmluZyB3aXRoIG5vIGV4cHJlc3Npb25zLCByZXR1cm4KKyAgICAgICB0aGF0LiAqLworICAgIGlmKHN0YXRlLT5leHByX2xpc3Quc2l6ZSA9PSAwKSB7CisgICAgICAgIGlmICghc3RhdGUtPmxhc3Rfc3RyKSB7CisgICAgICAgICAgICAvKiBDcmVhdGUgYSB6ZXJvIGxlbmd0aCBzdHJpbmcuICovCisgICAgICAgICAgICBzdGF0ZS0+bGFzdF9zdHIgPSBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgMCk7CisgICAgICAgICAgICBpZiAoIXN0YXRlLT5sYXN0X3N0cikKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYWtlX3N0cl9ub2RlX2FuZF9kZWwoJnN0YXRlLT5sYXN0X3N0ciwgYywgbik7CisgICAgfQorCisgICAgLyogQ3JlYXRlIGEgU3RyIG5vZGUgb3V0IG9mIGxhc3Rfc3RyLCBpZiBuZWVkZWQuIEl0IHdpbGwgYmUgdGhlCisgICAgICAgbGFzdCBub2RlIGluIG91ciBleHByZXNzaW9uIGxpc3QuICovCisgICAgaWYgKHN0YXRlLT5sYXN0X3N0cikgeworICAgICAgICBleHByX3R5IHN0ciA9IG1ha2Vfc3RyX25vZGVfYW5kX2RlbCgmc3RhdGUtPmxhc3Rfc3RyLCBjLCBuKTsKKyAgICAgICAgaWYgKCFzdHIgfHwgRXhwckxpc3RfQXBwZW5kKCZzdGF0ZS0+ZXhwcl9saXN0LCBzdHIpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIC8qIFRoaXMgaGFzIGFscmVhZHkgYmVlbiBmcmVlZC4gKi8KKyAgICBhc3NlcnQoc3RhdGUtPmxhc3Rfc3RyID09IE5VTEwpOworCisgICAgc2VxID0gRXhwckxpc3RfRmluaXNoKCZzdGF0ZS0+ZXhwcl9saXN0LCBjLT5jX2FyZW5hKTsKKyAgICBpZiAoIXNlcSkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIC8qIElmIHRoZXJlJ3Mgb25seSBvbmUgZXhwcmVzc2lvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UsIHdlIG5lZWQKKyAgICAgICB0byBqb2luIHRoZW0gdG9nZXRoZXIuICovCisgICAgaWYgKHNlcS0+c2l6ZSA9PSAxKQorICAgICAgICByZXR1cm4gc2VxLT5lbGVtZW50c1swXTsKKworICAgIHJldHVybiBKb2luZWRTdHIoc2VxLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwgYy0+Y19hcmVuYSk7CisKK2Vycm9yOgorICAgIEZzdHJpbmdQYXJzZXJfRGVhbGxvYyhzdGF0ZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qIEdpdmVuIGFuIGYtc3RyaW5nICh3aXRoIG5vICdmJyBvciBxdW90ZXMpIHRoYXQncyBpbiBzdHIgc3RhcnRpbmcgYXQKKyAgIG9mcywgcGFyc2UgaXQgaW50byBhbiBleHByX3R5LiBSZXR1cm4gTlVMTCBvbiBlcnJvci4gRG9lcyBub3QKKyAgIGRlY3JlZiBzdHIuICovCitzdGF0aWMgZXhwcl90eQorZnN0cmluZ19wYXJzZShQeU9iamVjdCAqc3RyLCBQeV9zc2l6ZV90ICpvZnMsIGludCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKK3sKKyAgICBGc3RyaW5nUGFyc2VyIHN0YXRlOworCisgICAgRnN0cmluZ1BhcnNlcl9Jbml0KCZzdGF0ZSk7CisgICAgaWYgKEZzdHJpbmdQYXJzZXJfQ29uY2F0RnN0cmluZygmc3RhdGUsIHN0ciwgb2ZzLCByZWN1cnNlX2x2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIG4pIDwgMCkgeworICAgICAgICBGc3RyaW5nUGFyc2VyX0RlYWxsb2MoJnN0YXRlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIEZzdHJpbmdQYXJzZXJfRmluaXNoKCZzdGF0ZSwgYywgbik7Cit9CisKKy8qIG4gaXMgYSBQeXRob24gc3RyaW5nIGxpdGVyYWwsIGluY2x1ZGluZyB0aGUgYnJhY2tldGluZyBxdW90ZQorICAgY2hhcmFjdGVycywgYW5kIHIsIGIsIHUsICYvb3IgZiBwcmVmaXhlcyAoaWYgYW55KSwgYW5kIGVtYmVkZGVkCisgICBlc2NhcGUgc2VxdWVuY2VzIChpZiBhbnkpLiBwYXJzZXN0ciBwYXJzZXMgaXQsIGFuZCByZXR1cm5zIHRoZQorICAgZGVjb2RlZCBQeXRob24gc3RyaW5nIG9iamVjdC4gIElmIHRoZSBzdHJpbmcgaXMgYW4gZi1zdHJpbmcsIHNldAorICAgKmZtb2RlIGFuZCByZXR1cm4gdGhlIHVucGFyc2VkIHN0cmluZyBvYmplY3QuCisqLwogc3RhdGljIFB5T2JqZWN0ICoKLXBhcnNlc3RyKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4sIGludCAqYnl0ZXNtb2RlKQorcGFyc2VzdHIoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbiwgaW50ICpieXRlc21vZGUsIGludCAqZm1vZGUpCiB7CiAgICAgc2l6ZV90IGxlbjsKICAgICBjb25zdCBjaGFyICpzID0gU1RSKG4pOwogICAgIGludCBxdW90ZSA9IFB5X0NIQVJNQVNLKCpzKTsKICAgICBpbnQgcmF3bW9kZSA9IDA7Ci0gICAgaW50IG5lZWRfZW5jb2Rpbmc7CiAgICAgaWYgKFB5X0lTQUxQSEEocXVvdGUpKSB7CiAgICAgICAgIHdoaWxlICghKmJ5dGVzbW9kZSB8fCAhcmF3bW9kZSkgewogICAgICAgICAgICAgaWYgKHF1b3RlID09ICdiJyB8fCBxdW90ZSA9PSAnQicpIHsKQEAgLTQwMjQsMTUgKzQ5MTYsMjQgQEAKICAgICAgICAgICAgICAgICBxdW90ZSA9ICorK3M7CiAgICAgICAgICAgICAgICAgcmF3bW9kZSA9IDE7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChxdW90ZSA9PSAnZicgfHwgcXVvdGUgPT0gJ0YnKSB7CisgICAgICAgICAgICAgICAgcXVvdGUgPSAqKytzOworICAgICAgICAgICAgICAgICpmbW9kZSA9IDE7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoKmZtb2RlICYmICpieXRlc21vZGUpIHsKKyAgICAgICAgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBpZiAocXVvdGUgIT0gJ1wnJyAmJiBxdW90ZSAhPSAnXCInKSB7CiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CisgICAgLyogU2tpcCB0aGUgbGVhZGluZyBxdW90ZSBjaGFyLiAqLwogICAgIHMrKzsKICAgICBsZW4gPSBzdHJsZW4ocyk7CiAgICAgaWYgKGxlbiA+IElOVF9NQVgpIHsKQEAgLTQwNDEsMjIgKzQ5NDIsMjYgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIGlmIChzWy0tbGVuXSAhPSBxdW90ZSkgeworICAgICAgICAvKiBMYXN0IHF1b3RlIGNoYXIgbXVzdCBtYXRjaCB0aGUgZmlyc3QuICovCiAgICAgICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgaWYgKGxlbiA+PSA0ICYmIHNbMF0gPT0gcXVvdGUgJiYgc1sxXSA9PSBxdW90ZSkgeworICAgICAgICAvKiBBIHRyaXBsZSBxdW90ZWQgc3RyaW5nLiBXZSd2ZSBhbHJlYWR5IHNraXBwZWQgb25lIHF1b3RlIGF0CisgICAgICAgICAgIHRoZSBzdGFydCBhbmQgb25lIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gTm93IHNraXAgdGhlCisgICAgICAgICAgIHR3byBhdCB0aGUgc3RhcnQuICovCiAgICAgICAgIHMgKz0gMjsKICAgICAgICAgbGVuIC09IDI7CisgICAgICAgIC8qIEFuZCBjaGVjayB0aGF0IHRoZSBsYXN0IHR3byBtYXRjaC4gKi8KICAgICAgICAgaWYgKHNbLS1sZW5dICE9IHF1b3RlIHx8IHNbLS1sZW5dICE9IHF1b3RlKSB7CiAgICAgICAgICAgICBQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQotICAgIGlmICghKmJ5dGVzbW9kZSAmJiAhcmF3bW9kZSkgewotICAgICAgICByZXR1cm4gZGVjb2RlX3VuaWNvZGUoYywgcywgbGVuLCByYXdtb2RlLCBjLT5jX2VuY29kaW5nKTsKLSAgICB9CisgICAgLyogQXZvaWQgaW52b2tpbmcgZXNjYXBlIGRlY29kaW5nIHJvdXRpbmVzIGlmIHBvc3NpYmxlLiAqLworICAgIHJhd21vZGUgPSByYXdtb2RlIHx8IHN0cmNocihzLCAnXFwnKSA9PSBOVUxMOwogICAgIGlmICgqYnl0ZXNtb2RlKSB7Ci0gICAgICAgIC8qIERpc2FsbG93IG5vbi1hc2NpaSBjaGFyYWN0ZXJzIChidXQgbm90IGVzY2FwZXMpICovCisgICAgICAgIC8qIERpc2FsbG93IG5vbi1BU0NJSSBjaGFyYWN0ZXJzLiAqLwogICAgICAgICBjb25zdCBjaGFyICpjaDsKICAgICAgICAgZm9yIChjaCA9IHM7ICpjaDsgY2grKykgewogICAgICAgICAgICAgaWYgKFB5X0NIQVJNQVNLKCpjaCkgPj0gMHg4MCkgewpAQCAtNDA2NSw3MSArNDk3MCw5MyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIG5lZWRfZW5jb2RpbmcgPSAoISpieXRlc21vZGUgJiYgYy0+Y19lbmNvZGluZyAhPSBOVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICBzdHJjbXAoYy0+Y19lbmNvZGluZywgInV0Zi04IikgIT0gMCk7Ci0gICAgaWYgKHJhd21vZGUgfHwgc3RyY2hyKHMsICdcXCcpID09IE5VTEwpIHsKLSAgICAgICAgaWYgKG5lZWRfZW5jb2RpbmcpIHsKLSAgICAgICAgICAgIFB5T2JqZWN0ICp2LCAqdSA9IFB5VW5pY29kZV9EZWNvZGVVVEY4KHMsIGxlbiwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAodSA9PSBOVUxMIHx8ICEqYnl0ZXNtb2RlKQotICAgICAgICAgICAgICAgIHJldHVybiB1OwotICAgICAgICAgICAgdiA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwgYy0+Y19lbmNvZGluZywgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodSk7Ci0gICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgfSBlbHNlIGlmICgqYnl0ZXNtb2RlKSB7CisgICAgICAgIGlmIChyYXdtb2RlKQogICAgICAgICAgICAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUocywgbGVuKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoYy0+Y19lbmNvZGluZywgInV0Zi04IikgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZShzLCBsZW4pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEocywgbGVuLCBOVUxMKTsKLSAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gUHlCeXRlc19EZWNvZGVFc2NhcGUocywgbGVuLCBOVUxMLCAvKiBpZ25vcmVkICovIDAsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyYXdtb2RlKQorICAgICAgICAgICAgcmV0dXJuIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwocywgbGVuLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGRlY29kZV91bmljb2RlX3dpdGhfZXNjYXBlcyhjLCBzLCBsZW4pOwogICAgIH0KLSAgICByZXR1cm4gUHlCeXRlc19EZWNvZGVFc2NhcGUocywgbGVuLCBOVUxMLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9lbmNvZGluZyA/IGMtPmNfZW5jb2RpbmcgOiBOVUxMKTsKIH0KIAotLyogQnVpbGQgYSBQeXRob24gc3RyaW5nIG9iamVjdCBvdXQgb2YgYSBTVFJJTkcrIGF0b20uICBUaGlzIHRha2VzIGNhcmUgb2YKLSAqIGNvbXBpbGUtdGltZSBsaXRlcmFsIGNhdGVuYXRpb24sIGNhbGxpbmcgcGFyc2VzdHIoKSBvbiBlYWNoIHBpZWNlLCBhbmQKLSAqIHBhc3RpbmcgdGhlIGludGVybWVkaWF0ZSByZXN1bHRzIHRvZ2V0aGVyLgotICovCi1zdGF0aWMgUHlPYmplY3QgKgotcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4sIGludCAqYnl0ZXNtb2RlKQorLyogQWNjZXB0cyBhIFNUUklORysgYXRvbSwgYW5kIHByb2R1Y2VzIGFuIGV4cHJfdHkgbm9kZS4gUnVuIHRocm91Z2gKKyAgIGVhY2ggU1RSSU5HIGF0b20sIGFuZCBwcm9jZXNzIGl0IGFzIG5lZWRlZC4gRm9yIGJ5dGVzLCBqdXN0CisgICBjb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIGEgQnl0ZXMgbm9kZS4gRm9yCisgICBub3JtYWwgc3RyaW5ncyBhbmQgZi1zdHJpbmdzLCBjb25jYXRlbmF0ZSB0aGVtIHRvZ2V0aGVyLiBUaGUgcmVzdWx0CisgICB3aWxsIGJlIGEgU3RyIG5vZGUgaWYgdGhlcmUgd2VyZSBubyBmLXN0cmluZ3M7IGEgRm9ybWF0dGVkVmFsdWUKKyAgIG5vZGUgaWYgdGhlcmUncyBqdXN0IGFuIGYtc3RyaW5nICh3aXRoIG5vIGxlYWRpbmcgb3IgdHJhaWxpbmcKKyAgIGxpdGVyYWxzKSwgb3IgYSBKb2luZWRTdHIgbm9kZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZi1zdHJpbmdzIG9yCisgICBhbnkgbGl0ZXJhbHMgaW52b2x2ZWQuICovCitzdGF0aWMgZXhwcl90eQorcGFyc2VzdHJwbHVzKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCiB7Ci0gICAgUHlPYmplY3QgKnY7CisgICAgaW50IGJ5dGVzbW9kZSA9IDA7CisgICAgUHlPYmplY3QgKmJ5dGVzX3N0ciA9IE5VTEw7CiAgICAgaW50IGk7Ci0gICAgUkVRKENISUxEKG4sIDApLCBTVFJJTkcpOwotICAgIHYgPSBwYXJzZXN0cihjLCBDSElMRChuLCAwKSwgYnl0ZXNtb2RlKTsKLSAgICBpZiAodiAhPSBOVUxMKSB7Ci0gICAgICAgIC8qIFN0cmluZyBsaXRlcmFsIGNvbmNhdGVuYXRpb24gKi8KLSAgICAgICAgZm9yIChpID0gMTsgaSA8IE5DSChuKTsgaSsrKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqczsKLSAgICAgICAgICAgIGludCBzdWJibSA9IDA7Ci0gICAgICAgICAgICBzID0gcGFyc2VzdHIoYywgQ0hJTEQobiwgaSksICZzdWJibSk7Ci0gICAgICAgICAgICBpZiAocyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gb25FcnJvcjsKLSAgICAgICAgICAgIGlmICgqYnl0ZXNtb2RlICE9IHN1YmJtKSB7Ci0gICAgICAgICAgICAgICAgYXN0X2Vycm9yKGMsIG4sICJjYW5ub3QgbWl4IGJ5dGVzIGFuZCBub25ieXRlcyBsaXRlcmFscyIpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7CisKKyAgICBGc3RyaW5nUGFyc2VyIHN0YXRlOworICAgIEZzdHJpbmdQYXJzZXJfSW5pdCgmc3RhdGUpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5DSChuKTsgaSsrKSB7CisgICAgICAgIGludCB0aGlzX2J5dGVzbW9kZSA9IDA7CisgICAgICAgIGludCB0aGlzX2Ztb2RlID0gMDsKKyAgICAgICAgUHlPYmplY3QgKnM7CisKKyAgICAgICAgUkVRKENISUxEKG4sIGkpLCBTVFJJTkcpOworICAgICAgICBzID0gcGFyc2VzdHIoYywgQ0hJTEQobiwgaSksICZ0aGlzX2J5dGVzbW9kZSwgJnRoaXNfZm1vZGUpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIC8qIENoZWNrIHRoYXQgd2UncmUgbm90IG1peGluZyBieXRlcyB3aXRoIHVuaWNvZGUuICovCisgICAgICAgIGlmIChpICE9IDAgJiYgYnl0ZXNtb2RlICE9IHRoaXNfYnl0ZXNtb2RlKSB7CisgICAgICAgICAgICBhc3RfZXJyb3IoYywgbiwgImNhbm5vdCBtaXggYnl0ZXMgYW5kIG5vbmJ5dGVzIGxpdGVyYWxzIik7CisgICAgICAgICAgICBQeV9ERUNSRUYocyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGJ5dGVzbW9kZSA9IHRoaXNfYnl0ZXNtb2RlOworCisgICAgICAgIGFzc2VydChieXRlc21vZGUgPyBQeUJ5dGVzX0NoZWNrRXhhY3QocykgOiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChzKSk7CisKKyAgICAgICAgaWYgKGJ5dGVzbW9kZSkgeworICAgICAgICAgICAgLyogRm9yIGJ5dGVzLCBjb25jYXQgYXMgd2UgZ28uICovCisgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLyogRmlyc3QgdGltZSwganVzdCByZW1lbWJlciB0aGlzIHZhbHVlLiAqLworICAgICAgICAgICAgICAgIGJ5dGVzX3N0ciA9IHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsKCZieXRlc19zdHIsIHMpOworICAgICAgICAgICAgICAgIGlmICghYnl0ZXNfc3RyKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFB5Qnl0ZXNfQ2hlY2sodikgJiYgUHlCeXRlc19DaGVjayhzKSkgewotICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsKCZ2LCBzKTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGVtcCA9IFB5VW5pY29kZV9Db25jYXQodiwgcyk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgICAgICAgICB2ID0gdGVtcDsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICBnb3RvIG9uRXJyb3I7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodGhpc19mbW9kZSkgeworICAgICAgICAgICAgLyogVGhpcyBpcyBhbiBmLXN0cmluZy4gQ29uY2F0ZW5hdGUgYW5kIGRlY3JlZiBpdC4gKi8KKyAgICAgICAgICAgIFB5X3NzaXplX3Qgb2ZzID0gMDsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBGc3RyaW5nUGFyc2VyX0NvbmNhdEZzdHJpbmcoJnN0YXRlLCBzLCAmb2ZzLCAwLCBjLCBuKTsKKyAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBUaGlzIGlzIGEgcmVndWxhciBzdHJpbmcuIENvbmNhdGVuYXRlIGl0LiAqLworICAgICAgICAgICAgaWYgKEZzdHJpbmdQYXJzZXJfQ29uY2F0QW5kRGVsKCZzdGF0ZSwgcykgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIHY7CisgICAgaWYgKGJ5dGVzbW9kZSkgeworICAgICAgICAvKiBKdXN0IHJldHVybiB0aGUgYnl0ZXMgb2JqZWN0IGFuZCB3ZSdyZSBkb25lLiAqLworICAgICAgICBpZiAoUHlBcmVuYV9BZGRQeU9iamVjdChjLT5jX2FyZW5hLCBieXRlc19zdHIpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIHJldHVybiBCeXRlcyhieXRlc19zdHIsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKyAgICB9CiAKLSAgb25FcnJvcjoKLSAgICBQeV9YREVDUkVGKHYpOworICAgIC8qIFdlJ3JlIG5vdCBhIGJ5dGVzIHN0cmluZywgYnl0ZXNfc3RyIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gc2V0LiAqLworICAgIGFzc2VydChieXRlc19zdHIgPT0gTlVMTCk7CisKKyAgICByZXR1cm4gRnN0cmluZ1BhcnNlcl9GaW5pc2goJnN0YXRlLCBjLCBuKTsKKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihieXRlc19zdHIpOworICAgIEZzdHJpbmdQYXJzZXJfRGVhbGxvYygmc3RhdGUpOwogICAgIHJldHVybiBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2JsdGlubW9kdWxlLmMgYi9QeXRob24vYmx0aW5tb2R1bGUuYwppbmRleCBlZWRkN2MzLi4yMjBjOTJkIDEwMDY0NAotLS0gYS9QeXRob24vYmx0aW5tb2R1bGUuYworKysgYi9QeXRob24vYmx0aW5tb2R1bGUuYwpAQCAtMzMxLDcgKzMzMSw3IEBACiAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGNtcCA9PSAxKSB7CisgICAgICAgIGlmIChjbXAgPiAwKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoaXQpOwogICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CiAgICAgICAgIH0KQEAgLTQ2OSw2ICs0NjksNyBAQAogICAgIFB5T2JqZWN0ICppdCA9IGx6LT5pdDsKICAgICBsb25nIG9rOwogICAgIFB5T2JqZWN0ICooKml0ZXJuZXh0KShQeU9iamVjdCAqKTsKKyAgICBpbnQgY2hlY2t0cnVlID0gbHotPmZ1bmMgPT0gUHlfTm9uZSB8fCBsei0+ZnVuYyA9PSAoUHlPYmplY3QgKikmUHlCb29sX1R5cGU7CiAKICAgICBpdGVybmV4dCA9ICpQeV9UWVBFKGl0KS0+dHBfaXRlcm5leHQ7CiAgICAgZm9yICg7OykgewpAQCAtNDc2LDEyICs0NzcsMTEgQEAKICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgICAgIGlmIChsei0+ZnVuYyA9PSBQeV9Ob25lIHx8IGx6LT5mdW5jID09IChQeU9iamVjdCAqKSZQeUJvb2xfVHlwZSkgeworICAgICAgICBpZiAoY2hlY2t0cnVlKSB7CiAgICAgICAgICAgICBvayA9IFB5T2JqZWN0X0lzVHJ1ZShpdGVtKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpnb29kOwotICAgICAgICAgICAgZ29vZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MobHotPmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLCBOVUxMKTsKKyAgICAgICAgICAgIGdvb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGx6LT5mdW5jLCBpdGVtLCBOVUxMKTsKICAgICAgICAgICAgIGlmIChnb29kID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoaXRlbSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMTczLDEzICsxMTczLDE0IEBACiAgICAgUHlPYmplY3QgKnJlc3VsdDsKICAgICBQeV9zc2l6ZV90IG51bWFyZ3MsIGk7CiAKLSAgICBudW1hcmdzID0gUHlUdXBsZV9TaXplKGx6LT5pdGVycyk7CisgICAgbnVtYXJncyA9IFB5VHVwbGVfR0VUX1NJWkUobHotPml0ZXJzKTsKICAgICBhcmd0dXBsZSA9IFB5VHVwbGVfTmV3KG51bWFyZ3MpOwogICAgIGlmIChhcmd0dXBsZSA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGZvciAoaT0wIDsgaTxudW1hcmdzIDsgaSsrKSB7Ci0gICAgICAgIHZhbCA9IFB5SXRlcl9OZXh0KFB5VHVwbGVfR0VUX0lURU0obHotPml0ZXJzLCBpKSk7CisgICAgICAgIFB5T2JqZWN0ICppdCA9IFB5VHVwbGVfR0VUX0lURU0obHotPml0ZXJzLCBpKTsKKyAgICAgICAgdmFsID0gUHlfVFlQRShpdCktPnRwX2l0ZXJuZXh0KGl0KTsKICAgICAgICAgaWYgKHZhbCA9PSBOVUxMKSB7CiAgICAgICAgICAgICBQeV9ERUNSRUYoYXJndHVwbGUpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xOTI5LDkgKzE5MzAsOCBAQAogICAgICAgICAgICAgUHlfQ0xFQVIoc3RyaW5ncG8pOwogICAgICAgICAgICAgaWYgKHBvID09IE5VTEwpCiAgICAgICAgICAgICAgICAgZ290byBfcmVhZGxpbmVfZXJyb3JzOwotICAgICAgICAgICAgcHJvbXB0c3RyID0gUHlCeXRlc19Bc1N0cmluZyhwbyk7Ci0gICAgICAgICAgICBpZiAocHJvbXB0c3RyID09IE5VTEwpCi0gICAgICAgICAgICAgICAgZ290byBfcmVhZGxpbmVfZXJyb3JzOworICAgICAgICAgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2socG8pKTsKKyAgICAgICAgICAgIHByb21wdHN0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHBvKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIHBvID0gTlVMTDsKQEAgLTI3MTAsMTAgKzI3MTAsMTAgQEAKICAgICBTRVRCVUlMVElOKCJ6aXAiLCAgICAgICAgICAgICAgICAgICAmUHlaaXBfVHlwZSk7CiAgICAgZGVidWcgPSBQeUJvb2xfRnJvbUxvbmcoUHlfT3B0aW1pemVGbGFnID09IDApOwogICAgIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiX19kZWJ1Z19fIiwgZGVidWcpIDwgMCkgewotICAgICAgICBQeV9YREVDUkVGKGRlYnVnKTsKKyAgICAgICAgUHlfREVDUkVGKGRlYnVnKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIFB5X1hERUNSRUYoZGVidWcpOworICAgIFB5X0RFQ1JFRihkZWJ1Zyk7CiAKICAgICByZXR1cm4gbW9kOwogI3VuZGVmIEFERF9UT19BTEwKZGlmZiAtLWdpdCBhL1B5dGhvbi9jZXZhbC5jIGIvUHl0aG9uL2NldmFsLmMKaW5kZXggM2Q2OTAzOC4uMmI0ZjdjYyAxMDA2NDQKLS0tIGEvUHl0aG9uL2NldmFsLmMKKysrIGIvUHl0aG9uL2NldmFsLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCiAjaWZkZWYgTExUUkFDRQogc3RhdGljIGludCBsbHRyYWNlOwotc3RhdGljIGludCBwcnRyYWNlKFB5T2JqZWN0ICosIGNoYXIgKik7CitzdGF0aWMgaW50IHBydHJhY2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKICNlbmRpZgogc3RhdGljIGludCBjYWxsX3RyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKiwKICAgICAgICAgICAgICAgICAgICAgICBQeVRocmVhZFN0YXRlICosIFB5RnJhbWVPYmplY3QgKiwKQEAgLTE0NCw3ICsxNDQsNyBAQAogc3RhdGljIHZvaWQgZm9ybWF0X2V4Y19jaGVja19hcmcoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqKTsKIHN0YXRpYyB2b2lkIGZvcm1hdF9leGNfdW5ib3VuZChQeUNvZGVPYmplY3QgKmNvLCBpbnQgb3BhcmcpOwogc3RhdGljIFB5T2JqZWN0ICogdW5pY29kZV9jb25jYXRlbmF0ZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUZyYW1lT2JqZWN0ICosIHVuc2lnbmVkIGNoYXIgKik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnJhbWVPYmplY3QgKiwgY29uc3QgdW5zaWduZWQgc2hvcnQgKik7CiBzdGF0aWMgUHlPYmplY3QgKiBzcGVjaWFsX2xvb2t1cChQeU9iamVjdCAqLCBfUHlfSWRlbnRpZmllciAqKTsKIAogI2RlZmluZSBOQU1FX0VSUk9SX01TRyBcCkBAIC04MDAsNyArODAwLDcgQEAKICAgICBpbnQgbGFzdG9wY29kZSA9IDA7CiAjZW5kaWYKICAgICBQeU9iamVjdCAqKnN0YWNrX3BvaW50ZXI7ICAvKiBOZXh0IGZyZWUgc2xvdCBpbiB2YWx1ZSBzdGFjayAqLwotICAgIHVuc2lnbmVkIGNoYXIgKm5leHRfaW5zdHI7CisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKm5leHRfaW5zdHI7CiAgICAgaW50IG9wY29kZTsgICAgICAgIC8qIEN1cnJlbnQgb3Bjb2RlICovCiAgICAgaW50IG9wYXJnOyAgICAgICAgIC8qIEN1cnJlbnQgb3Bjb2RlIGFyZ3VtZW50LCBpZiBhbnkgKi8KICAgICBlbnVtIHdoeV9jb2RlIHdoeTsgLyogUmVhc29uIGZvciBibG9jayBzdGFjayB1bndpbmQgKi8KQEAgLTgxOCw3ICs4MTgsNyBAQAogICAgICAgIHRpbWUgaXQgaXMgdGVzdGVkLiAqLwogICAgIGludCBpbnN0cl91YiA9IC0xLCBpbnN0cl9sYiA9IDAsIGluc3RyX3ByZXYgPSAtMTsKIAotICAgIHVuc2lnbmVkIGNoYXIgKmZpcnN0X2luc3RyOworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpmaXJzdF9pbnN0cjsKICAgICBQeU9iamVjdCAqbmFtZXM7CiAgICAgUHlPYmplY3QgKmNvbnN0czsKIApAQCAtODg2LDI0ICs4ODYsMTAgQEAKIC8qIEltcG9ydCB0aGUgc3RhdGljIGp1bXAgdGFibGUgKi8KICNpbmNsdWRlICJvcGNvZGVfdGFyZ2V0cy5oIgogCi0vKiBUaGlzIG1hY3JvIGlzIHVzZWQgd2hlbiBzZXZlcmFsIG9wY29kZXMgZGVmZXIgdG8gdGhlIHNhbWUgaW1wbGVtZW50YXRpb24KLSAgIChlLmcuIFNFVFVQX0xPT1AsIFNFVFVQX0ZJTkFMTFkpICovCi0jZGVmaW5lIFRBUkdFVF9XSVRIX0lNUEwob3AsIGltcGwpIFwKLSAgICBUQVJHRVRfIyNvcDogXAotICAgICAgICBvcGNvZGUgPSBvcDsgXAotICAgICAgICBpZiAoSEFTX0FSRyhvcCkpIFwKLSAgICAgICAgICAgIG9wYXJnID0gTkVYVEFSRygpOyBcCi0gICAgY2FzZSBvcDogXAotICAgICAgICBnb3RvIGltcGw7IFwKLQogI2RlZmluZSBUQVJHRVQob3ApIFwKICAgICBUQVJHRVRfIyNvcDogXAotICAgICAgICBvcGNvZGUgPSBvcDsgXAotICAgICAgICBpZiAoSEFTX0FSRyhvcCkpIFwKLSAgICAgICAgICAgIG9wYXJnID0gTkVYVEFSRygpOyBcCiAgICAgY2FzZSBvcDoKIAotCiAjZGVmaW5lIERJU1BBVENIKCkgXAogICAgIHsgXAogICAgICAgICBpZiAoIV9QeV9hdG9taWNfbG9hZF9yZWxheGVkKCZldmFsX2JyZWFrZXIpKSB7ICAgICAgXApAQCAtOTE3LDcgKzkwMyw4IEBACiAgICAgeyBcCiAgICAgICAgIGlmICghbGx0cmFjZSAmJiAhX1B5X1RyYWNpbmdQb3NzaWJsZSkgeyBcCiAgICAgICAgICAgICBmLT5mX2xhc3RpID0gSU5TVFJfT0ZGU0VUKCk7IFwKLSAgICAgICAgICAgIGdvdG8gKm9wY29kZV90YXJnZXRzWypuZXh0X2luc3RyKytdOyBcCisgICAgICAgICAgICBORVhUT1BBUkcoKTsgXAorICAgICAgICAgICAgZ290byAqb3Bjb2RlX3RhcmdldHNbb3Bjb2RlXTsgXAogICAgICAgICB9IFwKICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOyBcCiAgICAgfQpAQCAtOTI2LDcgKzkxMyw4IEBACiAgICAgeyBcCiAgICAgICAgIGlmICghX1B5X1RyYWNpbmdQb3NzaWJsZSkgeyBcCiAgICAgICAgICAgICBmLT5mX2xhc3RpID0gSU5TVFJfT0ZGU0VUKCk7IFwKLSAgICAgICAgICAgIGdvdG8gKm9wY29kZV90YXJnZXRzWypuZXh0X2luc3RyKytdOyBcCisgICAgICAgICAgICBORVhUT1BBUkcoKTsgXAorICAgICAgICAgICAgZ290byAqb3Bjb2RlX3RhcmdldHNbb3Bjb2RlXTsgXAogICAgICAgICB9IFwKICAgICAgICAgZ290byBmYXN0X25leHRfb3Bjb2RlOyBcCiAgICAgfQpAQCAtOTM1LDEwICs5MjMsNyBAQAogI2Vsc2UKICNkZWZpbmUgVEFSR0VUKG9wKSBcCiAgICAgY2FzZSBvcDoKLSNkZWZpbmUgVEFSR0VUX1dJVEhfSU1QTChvcCwgaW1wbCkgXAotICAgIC8qIHNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgYGltcGxgIHVudXNlZCAqLyBcCi0gICAgaWYgKDApIGdvdG8gaW1wbDsgXAotICAgIGNhc2Ugb3A6CisKICNkZWZpbmUgRElTUEFUQ0goKSBjb250aW51ZQogI2RlZmluZSBGQVNUX0RJU1BBVENIKCkgZ290byBmYXN0X25leHRfb3Bjb2RlCiAjZW5kaWYKQEAgLTk5NCwyOCArOTc5LDM4IEBACiAKIC8qIENvZGUgYWNjZXNzIG1hY3JvcyAqLwogCi0jZGVmaW5lIElOU1RSX09GRlNFVCgpICAoKGludCkobmV4dF9pbnN0ciAtIGZpcnN0X2luc3RyKSkKLSNkZWZpbmUgTkVYVE9QKCkgICAgICAgICgqbmV4dF9pbnN0cisrKQotI2RlZmluZSBORVhUQVJHKCkgICAgICAgKG5leHRfaW5zdHIgKz0gMiwgKG5leHRfaW5zdHJbLTFdPDw4KSArIG5leHRfaW5zdHJbLTJdKQotI2RlZmluZSBQRUVLQVJHKCkgICAgICAgKChuZXh0X2luc3RyWzJdPDw4KSArIG5leHRfaW5zdHJbMV0pCi0jZGVmaW5lIEpVTVBUTyh4KSAgICAgICAobmV4dF9pbnN0ciA9IGZpcnN0X2luc3RyICsgKHgpKQotI2RlZmluZSBKVU1QQlkoeCkgICAgICAgKG5leHRfaW5zdHIgKz0gKHgpKQorI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICAgICNkZWZpbmUgT1BDT0RFKHdvcmQpICgod29yZCkgPj4gOCkKKyAgICAjZGVmaW5lIE9QQVJHKHdvcmQpICgod29yZCkgJiAyNTUpCisjZWxzZQorICAgICNkZWZpbmUgT1BDT0RFKHdvcmQpICgod29yZCkgJiAyNTUpCisgICAgI2RlZmluZSBPUEFSRyh3b3JkKSAoKHdvcmQpID4+IDgpCisjZW5kaWYKKy8qIFRoZSBpbnRlZ2VyIG92ZXJmbG93IGlzIGNoZWNrZWQgYnkgYW4gYXNzZXJ0aW9uIGJlbG93LiAqLworI2RlZmluZSBJTlNUUl9PRkZTRVQoKSAgKDIqKGludCkobmV4dF9pbnN0ciAtIGZpcnN0X2luc3RyKSkKKyNkZWZpbmUgTkVYVE9QQVJHKCkgIGRvIHsgXAorICAgICAgICB1bnNpZ25lZCBzaG9ydCB3b3JkID0gKm5leHRfaW5zdHI7IFwKKyAgICAgICAgb3Bjb2RlID0gT1BDT0RFKHdvcmQpOyBcCisgICAgICAgIG9wYXJnID0gT1BBUkcod29yZCk7IFwKKyAgICAgICAgbmV4dF9pbnN0cisrOyBcCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgSlVNUFRPKHgpICAgICAgIChuZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyAoeCkvMikKKyNkZWZpbmUgSlVNUEJZKHgpICAgICAgIChuZXh0X2luc3RyICs9ICh4KS8yKQogCiAvKiBPcENvZGUgcHJlZGljdGlvbiBtYWNyb3MKICAgICBTb21lIG9wY29kZXMgdGVuZCB0byBjb21lIGluIHBhaXJzIHRodXMgbWFraW5nIGl0IHBvc3NpYmxlIHRvCiAgICAgcHJlZGljdCB0aGUgc2Vjb25kIGNvZGUgd2hlbiB0aGUgZmlyc3QgaXMgcnVuLiAgRm9yIGV4YW1wbGUsCi0gICAgQ09NUEFSRV9PUCBpcyBvZnRlbiBmb2xsb3dlZCBieSBKVU1QX0lGX0ZBTFNFIG9yIEpVTVBfSUZfVFJVRS4gIEFuZCwKLSAgICB0aG9zZSBvcGNvZGVzIGFyZSBvZnRlbiBmb2xsb3dlZCBieSBhIFBPUF9UT1AuCisgICAgQ09NUEFSRV9PUCBpcyBvZnRlbiBmb2xsb3dlZCBieSBQT1BfSlVNUF9JRl9GQUxTRSBvciBQT1BfSlVNUF9JRl9UUlVFLgogCiAgICAgVmVyaWZ5aW5nIHRoZSBwcmVkaWN0aW9uIGNvc3RzIGEgc2luZ2xlIGhpZ2gtc3BlZWQgdGVzdCBvZiBhIHJlZ2lzdGVyCiAgICAgdmFyaWFibGUgYWdhaW5zdCBhIGNvbnN0YW50LiAgSWYgdGhlIHBhaXJpbmcgd2FzIGdvb2QsIHRoZW4gdGhlCiAgICAgcHJvY2Vzc29yJ3Mgb3duIGludGVybmFsIGJyYW5jaCBwcmVkaWNhdGlvbiBoYXMgYSBoaWdoIGxpa2VsaWhvb2Qgb2YKICAgICBzdWNjZXNzLCByZXN1bHRpbmcgaW4gYSBuZWFybHkgemVyby1vdmVyaGVhZCB0cmFuc2l0aW9uIHRvIHRoZQogICAgIG5leHQgb3Bjb2RlLiAgQSBzdWNjZXNzZnVsIHByZWRpY3Rpb24gc2F2ZXMgYSB0cmlwIHRocm91Z2ggdGhlIGV2YWwtbG9vcAotICAgIGluY2x1ZGluZyBpdHMgdHdvIHVucHJlZGljdGFibGUgYnJhbmNoZXMsIHRoZSBIQVNfQVJHIHRlc3QgYW5kIHRoZQotICAgIHN3aXRjaC1jYXNlLiAgQ29tYmluZWQgd2l0aCB0aGUgcHJvY2Vzc29yJ3MgaW50ZXJuYWwgYnJhbmNoIHByZWRpY3Rpb24sCi0gICAgYSBzdWNjZXNzZnVsIFBSRURJQ1QgaGFzIHRoZSBlZmZlY3Qgb2YgbWFraW5nIHRoZSB0d28gb3Bjb2RlcyBydW4gYXMgaWYKLSAgICB0aGV5IHdlcmUgYSBzaW5nbGUgbmV3IG9wY29kZSB3aXRoIHRoZSBib2RpZXMgY29tYmluZWQuCisgICAgaW5jbHVkaW5nIGl0cyB1bnByZWRpY3RhYmxlIHN3aXRjaC1jYXNlIGJyYW5jaC4gIENvbWJpbmVkIHdpdGggdGhlCisgICAgcHJvY2Vzc29yJ3MgaW50ZXJuYWwgYnJhbmNoIHByZWRpY3Rpb24sIGEgc3VjY2Vzc2Z1bCBQUkVESUNUIGhhcyB0aGUKKyAgICBlZmZlY3Qgb2YgbWFraW5nIHRoZSB0d28gb3Bjb2RlcyBydW4gYXMgaWYgdGhleSB3ZXJlIGEgc2luZ2xlIG5ldyBvcGNvZGUKKyAgICB3aXRoIHRoZSBib2RpZXMgY29tYmluZWQuCiAKICAgICBJZiBjb2xsZWN0aW5nIG9wY29kZSBzdGF0aXN0aWNzLCB5b3VyIGNob2ljZXMgYXJlIHRvIGVpdGhlciBrZWVwIHRoZQogICAgIHByZWRpY3Rpb25zIHR1cm5lZC1vbiBhbmQgaW50ZXJwcmV0IHRoZSByZXN1bHRzIGFzIGlmIHNvbWUgb3Bjb2RlcwpAQCAtMTAzMCwxMyArMTAyNSwxOSBAQAogCiAjaWYgZGVmaW5lZChEWU5BTUlDX0VYRUNVVElPTl9QUk9GSUxFKSB8fCBVU0VfQ09NUFVURURfR09UT1MKICNkZWZpbmUgUFJFRElDVChvcCkgICAgICAgICAgICAgaWYgKDApIGdvdG8gUFJFRF8jI29wCi0jZGVmaW5lIFBSRURJQ1RFRChvcCkgICAgICAgICAgIFBSRURfIyNvcDoKLSNkZWZpbmUgUFJFRElDVEVEX1dJVEhfQVJHKG9wKSAgUFJFRF8jI29wOgogI2Vsc2UKLSNkZWZpbmUgUFJFRElDVChvcCkgICAgICAgICAgICAgaWYgKCpuZXh0X2luc3RyID09IG9wKSBnb3RvIFBSRURfIyNvcAotI2RlZmluZSBQUkVESUNURUQob3ApICAgICAgICAgICBQUkVEXyMjb3A6IG5leHRfaW5zdHIrKwotI2RlZmluZSBQUkVESUNURURfV0lUSF9BUkcob3ApICBQUkVEXyMjb3A6IG9wYXJnID0gUEVFS0FSRygpOyBuZXh0X2luc3RyICs9IDMKKyNkZWZpbmUgUFJFRElDVChvcCkgXAorICAgIGRveyBcCisgICAgICAgIHVuc2lnbmVkIHNob3J0IHdvcmQgPSAqbmV4dF9pbnN0cjsgXAorICAgICAgICBvcGNvZGUgPSBPUENPREUod29yZCk7IFwKKyAgICAgICAgaWYgKG9wY29kZSA9PSBvcCl7IFwKKyAgICAgICAgICAgIG9wYXJnID0gT1BBUkcod29yZCk7IFwKKyAgICAgICAgICAgIG5leHRfaW5zdHIrKzsgXAorICAgICAgICAgICAgZ290byBQUkVEXyMjb3A7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSgwKQogI2VuZGlmCisjZGVmaW5lIFBSRURJQ1RFRChvcCkgICAgICAgICAgIFBSRURfIyNvcDoKIAogCiAvKiBTdGFjayBtYW5pcHVsYXRpb24gbWFjcm9zICovCkBAIC0xMTAwLDcgKzExMDEsNyBAQAogICAgIH0KIAogI2RlZmluZSBVTldJTkRfRVhDRVBUX0hBTkRMRVIoYikgXAotICAgIHsgXAorICAgIGRvIHsgXAogICAgICAgICBQeU9iamVjdCAqdHlwZSwgKnZhbHVlLCAqdHJhY2ViYWNrOyBcCiAgICAgICAgIGFzc2VydChTVEFDS19MRVZFTCgpID49IChiKS0+Yl9sZXZlbCArIDMpOyBcCiAgICAgICAgIHdoaWxlIChTVEFDS19MRVZFTCgpID4gKGIpLT5iX2xldmVsICsgMykgeyBcCkBAIC0xMTE2LDcgKzExMTcsNyBAQAogICAgICAgICBQeV9YREVDUkVGKHR5cGUpOyBcCiAgICAgICAgIFB5X1hERUNSRUYodmFsdWUpOyBcCiAgICAgICAgIFB5X1hERUNSRUYodHJhY2ViYWNrKTsgXAotICAgIH0KKyAgICB9IHdoaWxlKDApCiAKIC8qIFN0YXJ0IG9mIGNvZGUgKi8KIApAQCAtMTE2NSwxNiArMTE2NiwxNiBAQAogICAgIGNvbnN0cyA9IGNvLT5jb19jb25zdHM7CiAgICAgZmFzdGxvY2FscyA9IGYtPmZfbG9jYWxzcGx1czsKICAgICBmcmVldmFycyA9IGYtPmZfbG9jYWxzcGx1cyArIGNvLT5jb19ubG9jYWxzOwotICAgIGZpcnN0X2luc3RyID0gKHVuc2lnbmVkIGNoYXIqKSBQeUJ5dGVzX0FTX1NUUklORyhjby0+Y29fY29kZSk7Ci0gICAgLyogQW4gZXhwbGFuYXRpb24gaXMgaW4gb3JkZXIgZm9yIHRoZSBuZXh0IGxpbmUuCisgICAgYXNzZXJ0KFB5Qnl0ZXNfQ2hlY2soY28tPmNvX2NvZGUpKTsKKyAgICBhc3NlcnQoUHlCeXRlc19HRVRfU0laRShjby0+Y29fY29kZSkgPD0gSU5UX01BWCk7CisgICAgYXNzZXJ0KFB5Qnl0ZXNfR0VUX1NJWkUoY28tPmNvX2NvZGUpICUgMiA9PSAwKTsKKyAgICBhc3NlcnQoX1B5X0lTX0FMSUdORUQoUHlCeXRlc19BU19TVFJJTkcoY28tPmNvX2NvZGUpLCAyKSk7CisgICAgZmlyc3RfaW5zdHIgPSAodW5zaWduZWQgc2hvcnQqKSBQeUJ5dGVzX0FTX1NUUklORyhjby0+Y29fY29kZSk7CisgICAgLyoKKyAgICAgICBmLT5mX2xhc3RpIHJlZmVycyB0byB0aGUgaW5kZXggb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24sCisgICAgICAgdW5sZXNzIGl0J3MgLTEgaW4gd2hpY2ggY2FzZSBuZXh0X2luc3RyIHNob3VsZCBiZSBmaXJzdF9pbnN0ci4KIAotICAgICAgIGYtPmZfbGFzdGkgbm93IHJlZmVycyB0byB0aGUgaW5kZXggb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24KLSAgICAgICBleGVjdXRlZC4gIFlvdSBtaWdodCB0aGluayB0aGlzIHdhcyBvYnZpb3VzIGZyb20gdGhlIG5hbWUsIGJ1dAotICAgICAgIHRoaXMgd2Fzbid0IGFsd2F5cyB0cnVlIGJlZm9yZSAyLjMhICBQeUZyYW1lX05ldyBub3cgc2V0cwotICAgICAgIGYtPmZfbGFzdGkgdG8gLTEgKGkuZS4gdGhlIGluZGV4ICpiZWZvcmUqIHRoZSBmaXJzdCBpbnN0cnVjdGlvbikKLSAgICAgICBhbmQgWUlFTERfVkFMVUUgZG9lc24ndCBmaWRkbGUgd2l0aCBmX2xhc3RpIGFueSBtb3JlLiAgU28gdGhpcwotICAgICAgIGRvZXMgd29yay4gIFByb21pc2UuCi0gICAgICAgWUlFTERfRlJPTSBzZXRzIGZfbGFzdGkgdG8gaXRzZWxmLCBpbiBvcmRlciB0byByZXBlYXRlZCB5aWVsZAorICAgICAgIFlJRUxEX0ZST00gc2V0cyBmX2xhc3RpIHRvIGl0c2VsZiwgaW4gb3JkZXIgdG8gcmVwZWF0ZWRseSB5aWVsZAogICAgICAgIG11bHRpcGxlIHZhbHVlcy4KIAogICAgICAgIFdoZW4gdGhlIFBSRURJQ1QoKSBtYWNyb3MgYXJlIGVuYWJsZWQsIHNvbWUgb3Bjb2RlIHBhaXJzIGZvbGxvdyBpbgpAQCAtMTE4Myw5ICsxMTg0LDEzIEBACiAgICAgICAgd2VyZSBhIHNpbmdsZSBuZXcgb3Bjb2RlOyBhY2NvcmRpbmdseSxmLT5mX2xhc3RpIHdpbGwgcG9pbnQgdG8KICAgICAgICB0aGUgZmlyc3QgY29kZSBpbiB0aGUgcGFpciAoZm9yIGluc3RhbmNlLCBHRVRfSVRFUiBmb2xsb3dlZCBieQogICAgICAgIEZPUl9JVEVSIGlzIGVmZmVjdGl2ZWx5IGEgc2luZ2xlIG9wY29kZSBhbmQgZi0+Zl9sYXN0aSB3aWxsIHBvaW50Ci0gICAgICAgYXQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tYmluZWQgcGFpci4pCisgICAgICAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29tYmluZWQgcGFpci4pCiAgICAgKi8KLSAgICBuZXh0X2luc3RyID0gZmlyc3RfaW5zdHIgKyBmLT5mX2xhc3RpICsgMTsKKyAgICBuZXh0X2luc3RyID0gZmlyc3RfaW5zdHI7CisgICAgaWYgKGYtPmZfbGFzdGkgPj0gMCkgeworICAgICAgICBhc3NlcnQoZi0+Zl9sYXN0aSAlIDIgPT0gMCk7CisgICAgICAgIG5leHRfaW5zdHIgKz0gZi0+Zl9sYXN0aS8yICsgMTsKKyAgICB9CiAgICAgc3RhY2tfcG9pbnRlciA9IGYtPmZfc3RhY2t0b3A7CiAgICAgYXNzZXJ0KHN0YWNrX3BvaW50ZXIgIT0gTlVMTCk7CiAgICAgZi0+Zl9zdGFja3RvcCA9IE5VTEw7ICAgICAgIC8qIHJlbWFpbnMgTlVMTCB1bmxlc3MgeWllbGQgc3VzcGVuZHMgZnJhbWUgKi8KQEAgLTEyNDksNyArMTI1NCw3IEBACiAgICAgICAgICAgIFB5X01ha2VQZW5kaW5nQ2FsbHMoKSBhYm92ZS4gKi8KIAogICAgICAgICBpZiAoX1B5X2F0b21pY19sb2FkX3JlbGF4ZWQoJmV2YWxfYnJlYWtlcikpIHsKLSAgICAgICAgICAgIGlmICgqbmV4dF9pbnN0ciA9PSBTRVRVUF9GSU5BTExZKSB7CisgICAgICAgICAgICBpZiAoT1BDT0RFKCpuZXh0X2luc3RyKSA9PSBTRVRVUF9GSU5BTExZKSB7CiAgICAgICAgICAgICAgICAgLyogTWFrZSB0aGUgbGFzdCBvcGNvZGUgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgYSB0cnk6IGZpbmFsbHk6IGJsb2NrIHVuaW50ZXJydXB0aWJsZS4gKi8KICAgICAgICAgICAgICAgICBnb3RvIGZhc3RfbmV4dF9vcGNvZGU7CkBAIC0xMzIyLDExICsxMzI3LDcgQEAKIAogICAgICAgICAvKiBFeHRyYWN0IG9wY29kZSBhbmQgYXJndW1lbnQgKi8KIAotICAgICAgICBvcGNvZGUgPSBORVhUT1AoKTsKLSAgICAgICAgb3BhcmcgPSAwOyAgIC8qIGFsbG93cyBvcGFyZyB0byBiZSBzdG9yZWQgaW4gYSByZWdpc3RlciBiZWNhdXNlCi0gICAgICAgICAgICBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgcmVtZW1iZXJlZCBhY3Jvc3MgYSBmdWxsIGxvb3AgKi8KLSAgICAgICAgaWYgKEhBU19BUkcob3Bjb2RlKSkKLSAgICAgICAgICAgIG9wYXJnID0gTkVYVEFSRygpOworICAgICAgICBORVhUT1BBUkcoKTsKICAgICBkaXNwYXRjaF9vcGNvZGU6CiAjaWZkZWYgRFlOQU1JQ19FWEVDVVRJT05fUFJPRklMRQogI2lmZGVmIERYUEFJUlMKQEAgLTEzNzcsNiArMTM3OCw3IEBACiAgICAgICAgICAgICBGQVNUX0RJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoTE9BRF9DT05TVCk7CiAgICAgICAgIFRBUkdFVChMT0FEX0NPTlNUKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBHRVRJVEVNKGNvbnN0cywgb3BhcmcpOwogICAgICAgICAgICAgUHlfSU5DUkVGKHZhbHVlKTsKQEAgLTEzODQsNyArMTM4Niw3IEBACiAgICAgICAgICAgICBGQVNUX0RJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBQUkVESUNURURfV0lUSF9BUkcoU1RPUkVfRkFTVCk7CisgICAgICAgIFBSRURJQ1RFRChTVE9SRV9GQVNUKTsKICAgICAgICAgVEFSR0VUKFNUT1JFX0ZBU1QpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSA9IFBPUCgpOwogICAgICAgICAgICAgU0VUTE9DQUwob3BhcmcsIHZhbHVlKTsKQEAgLTIwMDYsNiArMjAwOCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFNFVF9UT1AoYXdhaXRhYmxlKTsKKyAgICAgICAgICAgIFBSRURJQ1QoTE9BRF9DT05TVCk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKQEAgLTIwNDgsOSArMjA1MSwxMSBAQAogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuZXh0X2l0ZXIpOwogCiAgICAgICAgICAgICBQVVNIKGF3YWl0YWJsZSk7CisgICAgICAgICAgICBQUkVESUNUKExPQURfQ09OU1QpOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFBSRURJQ1RFRChHRVRfQVdBSVRBQkxFKTsKICAgICAgICAgVEFSR0VUKEdFVF9BV0FJVEFCTEUpIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICppdGVyYWJsZSA9IFRPUCgpOwogICAgICAgICAgICAgUHlPYmplY3QgKml0ZXIgPSBfUHlDb3JvX0dldEF3YWl0YWJsZUl0ZXIoaXRlcmFibGUpOwpAQCAtMjA3OCw2ICsyMDgzLDcgQEAKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBQUkVESUNUKExPQURfQ09OU1QpOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCkBAIC0yMTExLDcgKzIxMTcsNyBAQAogICAgICAgICAgICAgZi0+Zl9zdGFja3RvcCA9IHN0YWNrX3BvaW50ZXI7CiAgICAgICAgICAgICB3aHkgPSBXSFlfWUlFTEQ7CiAgICAgICAgICAgICAvKiBhbmQgcmVwZWF0Li4uICovCi0gICAgICAgICAgICBmLT5mX2xhc3RpLS07CisgICAgICAgICAgICBmLT5mX2xhc3RpIC09IDI7CiAgICAgICAgICAgICBnb3RvIGZhc3RfeWllbGQ7CiAgICAgICAgIH0KIApAQCAtMjEzMyw2ICsyMTM5LDcgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoUE9QX0JMT0NLKTsKICAgICAgICAgVEFSR0VUKFBPUF9CTE9DSykgewogICAgICAgICAgICAgUHlUcnlCbG9jayAqYiA9IFB5RnJhbWVfQmxvY2tQb3AoZik7CiAgICAgICAgICAgICBVTldJTkRfQkxPQ0soYik7CkBAIC0yMjQ5LDcgKzIyNTYsNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhVTlBBQ0tfU0VRVUVOQ0UpOworICAgICAgICBQUkVESUNURUQoVU5QQUNLX1NFUVVFTkNFKTsKICAgICAgICAgVEFSR0VUKFVOUEFDS19TRVFVRU5DRSkgewogICAgICAgICAgICAgUHlPYmplY3QgKnNlcSA9IFBPUCgpLCAqaXRlbSwgKippdGVtczsKICAgICAgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrRXhhY3Qoc2VxKSAmJgpAQCAtMjM1OCw3ICsyMzY1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHYgPSBQeU9iamVjdF9HZXRJdGVtKGxvY2FscywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCAmJiBfUHlFcnJfT0NDVVJSRUQoKSkgeworICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CkBAIC0yMzk4LDI2ICsyNDA1LDMzIEBACiAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICp2OwogICAgICAgICAgICAgaWYgKFB5RGljdF9DaGVja0V4YWN0KGYtPmZfZ2xvYmFscykKLSAgICAgICAgICAgICAgICAmJiBQeURpY3RfQ2hlY2tFeGFjdChmLT5mX2J1aWx0aW5zKSkgeworICAgICAgICAgICAgICAgICYmIFB5RGljdF9DaGVja0V4YWN0KGYtPmZfYnVpbHRpbnMpKQorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHYgPSBfUHlEaWN0X0xvYWRHbG9iYWwoKFB5RGljdE9iamVjdCAqKWYtPmZfZ2xvYmFscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeURpY3RPYmplY3QgKilmLT5mX2J1aWx0aW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgICAgICAgICAgaWYgKHYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIV9QeUVycl9PQ0NVUlJFRCgpKQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9QeUVycl9PQ0NVUlJFRCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBfUHlEaWN0X0xvYWRHbG9iYWwoKSByZXR1cm5zIE5VTEwgd2l0aG91dCByYWlzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbiBleGNlcHRpb24gaWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfZXhjX2NoZWNrX2FyZyhQeUV4Y19OYW1lRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FX0VSUk9SX01TRywgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUHlfSU5DUkVGKHYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgLyogU2xvdy1wYXRoIGlmIGdsb2JhbHMgb3IgYnVpbHRpbnMgaXMgbm90IGEgZGljdCAqLworCisgICAgICAgICAgICAgICAgLyogbmFtZXNwYWNlIDE6IGdsb2JhbHMgKi8KICAgICAgICAgICAgICAgICB2ID0gUHlPYmplY3RfR2V0SXRlbShmLT5mX2dsb2JhbHMsIG5hbWUpOwogICAgICAgICAgICAgICAgIGlmICh2ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX0tleUVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CiAKKyAgICAgICAgICAgICAgICAgICAgLyogbmFtZXNwYWNlIDI6IGJ1aWx0aW5zICovCiAgICAgICAgICAgICAgICAgICAgIHYgPSBQeU9iamVjdF9HZXRJdGVtKGYtPmZfYnVpbHRpbnMsIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCkBAIC0yNDc3LDcgKzI0OTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgdmFsdWUgPSBQeU9iamVjdF9HZXRJdGVtKGxvY2FscywgbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IE5VTEwgJiYgUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMjU0MCw5ICsyNTU0LDggQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKEJVSUxEX1RVUExFX1VOUEFDSywgX2J1aWxkX2xpc3RfdW5wYWNrKQotICAgICAgICBUQVJHRVQoQlVJTERfTElTVF9VTlBBQ0spCi0gICAgICAgIF9idWlsZF9saXN0X3VucGFjazogeworICAgICAgICBUQVJHRVQoQlVJTERfVFVQTEVfVU5QQUNLKQorICAgICAgICBUQVJHRVQoQlVJTERfTElTVF9VTlBBQ0spIHsKICAgICAgICAgICAgIGludCBjb252ZXJ0X3RvX3R1cGxlID0gb3Bjb2RlID09IEJVSUxEX1RVUExFX1VOUEFDSzsKICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgUHlPYmplY3QgKnN1bSA9IFB5TGlzdF9OZXcoMCk7CkBAIC0yNjM5LDkgKzI2NTIsNDEgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKEJVSUxEX01BUF9VTlBBQ0tfV0lUSF9DQUxMLCBfYnVpbGRfbWFwX3VucGFjaykKLSAgICAgICAgVEFSR0VUKEJVSUxEX01BUF9VTlBBQ0spCi0gICAgICAgIF9idWlsZF9tYXBfdW5wYWNrOiB7CisgICAgICAgIFRBUkdFVChCVUlMRF9DT05TVF9LRVlfTUFQKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICptYXA7CisgICAgICAgICAgICBQeU9iamVjdCAqa2V5cyA9IFRPUCgpOworICAgICAgICAgICAgaWYgKCFQeVR1cGxlX0NoZWNrRXhhY3Qoa2V5cykgfHwKKyAgICAgICAgICAgICAgICBQeVR1cGxlX0dFVF9TSVpFKGtleXMpICE9IChQeV9zc2l6ZV90KW9wYXJnKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIEJVSUxEX0NPTlNUX0tFWV9NQVAga2V5cyBhcmd1bWVudCIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXAgPSBfUHlEaWN0X05ld1ByZXNpemVkKChQeV9zc2l6ZV90KW9wYXJnKTsKKyAgICAgICAgICAgIGlmIChtYXAgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSBvcGFyZzsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleSA9IFB5VHVwbGVfR0VUX0lURU0oa2V5cywgb3BhcmcgLSBpKTsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUgPSBQRUVLKGkgKyAxKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBQeURpY3RfU2V0SXRlbShtYXAsIGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWFwKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFB5X0RFQ1JFRihQT1AoKSk7CisgICAgICAgICAgICB3aGlsZSAob3BhcmctLSkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihQT1AoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBQVVNIKG1hcCk7CisgICAgICAgICAgICBESVNQQVRDSCgpOworICAgICAgICB9CisKKyAgICAgICAgVEFSR0VUKEJVSUxEX01BUF9VTlBBQ0tfV0lUSF9DQUxMKQorICAgICAgICBUQVJHRVQoQlVJTERfTUFQX1VOUEFDSykgewogICAgICAgICAgICAgaW50IHdpdGhfY2FsbCA9IG9wY29kZSA9PSBCVUlMRF9NQVBfVU5QQUNLX1dJVEhfQ0FMTDsKICAgICAgICAgICAgIGludCBudW1fbWFwczsKICAgICAgICAgICAgIGludCBmdW5jdGlvbl9sb2NhdGlvbjsKQEAgLTI3NzUsMjEgKzI4MjAsMTMgQEAKICAgICAgICAgICAgIFB5X0lOQ1JFRihmdW5jKTsKICAgICAgICAgICAgIGZyb20gPSBQT1AoKTsKICAgICAgICAgICAgIGxldmVsID0gVE9QKCk7Ci0gICAgICAgICAgICBpZiAoUHlMb25nX0FzTG9uZyhsZXZlbCkgIT0gLTEgfHwgUHlFcnJfT2NjdXJyZWQoKSkKLSAgICAgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDUsCisgICAgICAgICAgICBhcmdzID0gUHlUdXBsZV9QYWNrKDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2dsb2JhbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9sb2NhbHMgPT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfTm9uZSA6IGYtPmZfbG9jYWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFyZ3MgPSBQeVR1cGxlX1BhY2soNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmZfZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mX2xvY2FscyA9PSBOVUxMID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lIDogZi0+Zl9sb2NhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSk7CiAgICAgICAgICAgICBQeV9ERUNSRUYobGV2ZWwpOwogICAgICAgICAgICAgUHlfREVDUkVGKGZyb20pOwogICAgICAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgewpAQCAtMjg0OCw3ICsyODg1LDcgQEAKICAgICAgICAgICAgIEZBU1RfRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhQT1BfSlVNUF9JRl9GQUxTRSk7CisgICAgICAgIFBSRURJQ1RFRChQT1BfSlVNUF9JRl9GQUxTRSk7CiAgICAgICAgIFRBUkdFVChQT1BfSlVNUF9JRl9GQUxTRSkgewogICAgICAgICAgICAgUHlPYmplY3QgKmNvbmQgPSBQT1AoKTsKICAgICAgICAgICAgIGludCBlcnI7CkBAIC0yODcyLDcgKzI5MDksNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhQT1BfSlVNUF9JRl9UUlVFKTsKKyAgICAgICAgUFJFRElDVEVEKFBPUF9KVU1QX0lGX1RSVUUpOwogICAgICAgICBUQVJHRVQoUE9QX0pVTVBfSUZfVFJVRSkgewogICAgICAgICAgICAgUHlPYmplY3QgKmNvbmQgPSBQT1AoKTsKICAgICAgICAgICAgIGludCBlcnI7CkBAIC0yOTQ5LDcgKzI5ODYsNyBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFBSRURJQ1RFRF9XSVRIX0FSRyhKVU1QX0FCU09MVVRFKTsKKyAgICAgICAgUFJFRElDVEVEKEpVTVBfQUJTT0xVVEUpOwogICAgICAgICBUQVJHRVQoSlVNUF9BQlNPTFVURSkgewogICAgICAgICAgICAgSlVNUFRPKG9wYXJnKTsKICNpZiBGQVNUX0xPT1BTCkBAIC0yOTc1LDYgKzMwMTIsNyBAQAogICAgICAgICAgICAgaWYgKGl0ZXIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgUFJFRElDVChGT1JfSVRFUik7CisgICAgICAgICAgICBQUkVESUNUKENBTExfRlVOQ1RJT04pOwogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCkBAIC0zMDAzLDEwICszMDQxLDExIEBACiAgICAgICAgICAgICAgICAgaWYgKGl0ZXIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBSRURJQ1QoTE9BRF9DT05TVCk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKLSAgICAgICAgUFJFRElDVEVEX1dJVEhfQVJHKEZPUl9JVEVSKTsKKyAgICAgICAgUFJFRElDVEVEKEZPUl9JVEVSKTsKICAgICAgICAgVEFSR0VUKEZPUl9JVEVSKSB7CiAgICAgICAgICAgICAvKiBiZWZvcmU6IFtpdGVyXTsgYWZ0ZXI6IFtpdGVyLCBpdGVyKCldICpvciogW10gKi8KICAgICAgICAgICAgIFB5T2JqZWN0ICppdGVyID0gVE9QKCk7CkBAIC0zMDI4LDYgKzMwNjcsNyBAQAogICAgICAgICAgICAgU1RBQ0tBREooLTEpOwogICAgICAgICAgICAgUHlfREVDUkVGKGl0ZXIpOwogICAgICAgICAgICAgSlVNUEJZKG9wYXJnKTsKKyAgICAgICAgICAgIFBSRURJQ1QoUE9QX0JMT0NLKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIApAQCAtMzA0NCwxMCArMzA4NCw5IEBACiAgICAgICAgICAgICBnb3RvIGZhc3RfYmxvY2tfZW5kOwogICAgICAgICB9CiAKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChTRVRVUF9MT09QLCBfc2V0dXBfZmluYWxseSkKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChTRVRVUF9FWENFUFQsIF9zZXR1cF9maW5hbGx5KQotICAgICAgICBUQVJHRVQoU0VUVVBfRklOQUxMWSkKLSAgICAgICAgX3NldHVwX2ZpbmFsbHk6IHsKKyAgICAgICAgVEFSR0VUKFNFVFVQX0xPT1ApCisgICAgICAgIFRBUkdFVChTRVRVUF9FWENFUFQpCisgICAgICAgIFRBUkdFVChTRVRVUF9GSU5BTExZKSB7CiAgICAgICAgICAgICAvKiBOT1RFOiBJZiB5b3UgYWRkIGFueSBuZXcgYmxvY2stc2V0dXAgb3Bjb2RlcyB0aGF0CiAgICAgICAgICAgICAgICBhcmUgbm90IHRyeS9leGNlcHQvZmluYWxseSBoYW5kbGVycywgeW91IG1heSBuZWVkCiAgICAgICAgICAgICAgICB0byB1cGRhdGUgdGhlIFB5R2VuX05lZWRzRmluYWxpemluZygpIGZ1bmN0aW9uLgpAQCAtMzA3OCw2ICszMTE3LDcgQEAKICAgICAgICAgICAgIGlmIChyZXMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgUFVTSChyZXMpOworICAgICAgICAgICAgUFJFRElDVChHRVRfQVdBSVRBQkxFKTsKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIApAQCAtMzIyNiw2ICszMjY2LDcgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAorICAgICAgICBQUkVESUNURUQoQ0FMTF9GVU5DVElPTik7CiAgICAgICAgIFRBUkdFVChDQUxMX0ZVTkNUSU9OKSB7CiAgICAgICAgICAgICBQeU9iamVjdCAqKnNwLCAqcmVzOwogICAgICAgICAgICAgUENBTEwoUENBTExfQUxMKTsKQEAgLTMyNDIsMTAgKzMyODMsOSBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCi0gICAgICAgIFRBUkdFVF9XSVRIX0lNUEwoQ0FMTF9GVU5DVElPTl9WQVIsIF9jYWxsX2Z1bmN0aW9uX3Zhcl9rdykKLSAgICAgICAgVEFSR0VUX1dJVEhfSU1QTChDQUxMX0ZVTkNUSU9OX0tXLCBfY2FsbF9mdW5jdGlvbl92YXJfa3cpCi0gICAgICAgIFRBUkdFVChDQUxMX0ZVTkNUSU9OX1ZBUl9LVykKLSAgICAgICAgX2NhbGxfZnVuY3Rpb25fdmFyX2t3OiB7CisgICAgICAgIFRBUkdFVChDQUxMX0ZVTkNUSU9OX1ZBUikKKyAgICAgICAgVEFSR0VUKENBTExfRlVOQ1RJT05fS1cpCisgICAgICAgIFRBUkdFVChDQUxMX0ZVTkNUSU9OX1ZBUl9LVykgewogICAgICAgICAgICAgaW50IG5hID0gb3BhcmcgJiAweGZmOwogICAgICAgICAgICAgaW50IG5rID0gKG9wYXJnPj44KSAmIDB4ZmY7CiAgICAgICAgICAgICBpbnQgZmxhZ3MgPSAob3Bjb2RlIC0gQ0FMTF9GVU5DVElPTikgJiAzOwpAQCAtMzI4NywxMTcgKzMzMjcsMzYgQEAKICAgICAgICAgICAgIERJU1BBVENIKCk7CiAgICAgICAgIH0KIAotICAgICAgICBUQVJHRVRfV0lUSF9JTVBMKE1BS0VfQ0xPU1VSRSwgX21ha2VfZnVuY3Rpb24pCi0gICAgICAgIFRBUkdFVChNQUtFX0ZVTkNUSU9OKQotICAgICAgICBfbWFrZV9mdW5jdGlvbjogewotICAgICAgICAgICAgaW50IHBvc2RlZmF1bHRzID0gb3BhcmcgJiAweGZmOwotICAgICAgICAgICAgaW50IGt3ZGVmYXVsdHMgPSAob3Bhcmc+PjgpICYgMHhmZjsKLSAgICAgICAgICAgIGludCBudW1fYW5ub3RhdGlvbnMgPSAob3BhcmcgPj4gMTYpICYgMHg3ZmZmOworICAgICAgICBUQVJHRVQoTUFLRV9GVU5DVElPTikgeworICAgICAgICAgICAgUHlPYmplY3QgKnF1YWxuYW1lID0gUE9QKCk7CisgICAgICAgICAgICBQeU9iamVjdCAqY29kZW9iaiA9IFBPUCgpOworICAgICAgICAgICAgUHlGdW5jdGlvbk9iamVjdCAqZnVuYyA9IChQeUZ1bmN0aW9uT2JqZWN0ICopCisgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9OZXdXaXRoUXVhbE5hbWUoY29kZW9iaiwgZi0+Zl9nbG9iYWxzLCBxdWFsbmFtZSk7CiAKLSAgICAgICAgICAgIFB5T2JqZWN0ICpxdWFsbmFtZSA9IFBPUCgpOyAvKiBxdWFsbmFtZSAqLwotICAgICAgICAgICAgUHlPYmplY3QgKmNvZGUgPSBQT1AoKTsgLyogY29kZSBvYmplY3QgKi8KLSAgICAgICAgICAgIFB5T2JqZWN0ICpmdW5jID0gUHlGdW5jdGlvbl9OZXdXaXRoUXVhbE5hbWUoY29kZSwgZi0+Zl9nbG9iYWxzLCBxdWFsbmFtZSk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYoY29kZSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoY29kZW9iaik7CiAgICAgICAgICAgICBQeV9ERUNSRUYocXVhbG5hbWUpOwotCi0gICAgICAgICAgICBpZiAoZnVuYyA9PSBOVUxMKQorICAgICAgICAgICAgaWYgKGZ1bmMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0KLSAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gTUFLRV9DTE9TVVJFKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmNsb3N1cmUgPSBQT1AoKTsKLSAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXRDbG9zdXJlKGZ1bmMsIGNsb3N1cmUpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgaGFwcGVuIHVubGVzcyBieXRlY29kZSBpcyBjb3JydXB0LiAqLwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjbG9zdXJlKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGNsb3N1cmUpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobnVtX2Fubm90YXRpb25zID4gMCkgewotICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbmFtZV9peDsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZXMgPSBQT1AoKTsgLyogbmFtZXMgb2YgYXJncyB3aXRoIGFubm90YXRpb25zICovCi0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmFubnMgPSBQeURpY3RfTmV3KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGFubnMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVfaXggPSBQeVR1cGxlX1NpemUobmFtZXMpOwotICAgICAgICAgICAgICAgIGFzc2VydChudW1fYW5ub3RhdGlvbnMgPT0gbmFtZV9peCsxKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAobmFtZV9peCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm5hbWUsICp2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGVycjsKLSAgICAgICAgICAgICAgICAgICAgLS1uYW1lX2l4OwotICAgICAgICAgICAgICAgICAgICBuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShuYW1lcywgbmFtZV9peCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUE9QKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IFB5RGljdF9TZXRJdGVtKGFubnMsIG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYW5ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmFtZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmFtZXMpOwotCi0gICAgICAgICAgICAgICAgaWYgKFB5RnVuY3Rpb25fU2V0QW5ub3RhdGlvbnMoZnVuYywgYW5ucykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBDYW4ndCBoYXBwZW4gdW5sZXNzCi0gICAgICAgICAgICAgICAgICAgICAgIFB5RnVuY3Rpb25fU2V0QW5ub3RhdGlvbnMgY2hhbmdlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFubnMpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhbm5zKTsKKyAgICAgICAgICAgIGlmIChvcGFyZyAmIDB4MDgpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlUdXBsZV9DaGVja0V4YWN0KFRPUCgpKSk7CisgICAgICAgICAgICAgICAgZnVuYyAtPmZ1bmNfY2xvc3VyZSA9IFBPUCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wYXJnICYgMHgwNCkgeworICAgICAgICAgICAgICAgIGFzc2VydChQeURpY3RfQ2hlY2tFeGFjdChUT1AoKSkpOworICAgICAgICAgICAgICAgIGZ1bmMtPmZ1bmNfYW5ub3RhdGlvbnMgPSBQT1AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcGFyZyAmIDB4MDIpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlEaWN0X0NoZWNrRXhhY3QoVE9QKCkpKTsKKyAgICAgICAgICAgICAgICBmdW5jLT5mdW5jX2t3ZGVmYXVsdHMgPSBQT1AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvcGFyZyAmIDB4MDEpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoUHlUdXBsZV9DaGVja0V4YWN0KFRPUCgpKSk7CisgICAgICAgICAgICAgICAgZnVuYy0+ZnVuY19kZWZhdWx0cyA9IFBPUCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvKiBYWFggTWF5YmUgdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBvcGNvZGU/ICovCi0gICAgICAgICAgICBpZiAoa3dkZWZhdWx0cyA+IDApIHsKLSAgICAgICAgICAgICAgICBQeU9iamVjdCAqZGVmcyA9IFB5RGljdF9OZXcoKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVmcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKC0ta3dkZWZhdWx0cyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2ID0gUE9QKCk7IC8qIGRlZmF1bHQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmtleSA9IFBPUCgpOyAvKiBrdyBvbmx5IGFyZyBuYW1lICovCi0gICAgICAgICAgICAgICAgICAgIGludCBlcnIgPSBQeURpY3RfU2V0SXRlbShkZWZzLCBrZXksIHYpOwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYodik7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihrZXkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihkZWZzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFB5RnVuY3Rpb25fU2V0S3dEZWZhdWx0cyhmdW5jLCBkZWZzKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXRLd0RlZmF1bHRzIGNoYW5nZXMuICovCi0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGRlZnMpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVmcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9zZGVmYXVsdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmRlZnMgPSBQeVR1cGxlX05ldyhwb3NkZWZhdWx0cyk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZnMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZnVuYyk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICgtLXBvc2RlZmF1bHRzID49IDApCi0gICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oZGVmcywgcG9zZGVmYXVsdHMsIFBPUCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoUHlGdW5jdGlvbl9TZXREZWZhdWx0cyhmdW5jLCBkZWZzKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGhhcHBlbiB1bmxlc3MKLSAgICAgICAgICAgICAgICAgICAgICAgUHlGdW5jdGlvbl9TZXREZWZhdWx0cyBjaGFuZ2VzLiAqLwotICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoZGVmcyk7Ci0gICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmdW5jKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGRlZnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUFVTSChmdW5jKTsKKyAgICAgICAgICAgIFBVU0goKFB5T2JqZWN0ICopZnVuYyk7CiAgICAgICAgICAgICBESVNQQVRDSCgpOwogICAgICAgICB9CiAKQEAgLTM0MTksOSArMzM3OCw2OCBAQAogICAgICAgICAgICAgRElTUEFUQ0goKTsKICAgICAgICAgfQogCisgICAgICAgIFRBUkdFVChGT1JNQVRfVkFMVUUpIHsKKyAgICAgICAgICAgIC8qIEhhbmRsZXMgZi1zdHJpbmcgdmFsdWUgZm9ybWF0dGluZy4gKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXN1bHQ7CisgICAgICAgICAgICBQeU9iamVjdCAqZm10X3NwZWM7CisgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWU7CisgICAgICAgICAgICBQeU9iamVjdCAqKCpjb252X2ZuKShQeU9iamVjdCAqKTsKKyAgICAgICAgICAgIGludCB3aGljaF9jb252ZXJzaW9uID0gb3BhcmcgJiBGVkNfTUFTSzsKKyAgICAgICAgICAgIGludCBoYXZlX2ZtdF9zcGVjID0gKG9wYXJnICYgRlZTX01BU0spID09IEZWU19IQVZFX1NQRUM7CisKKyAgICAgICAgICAgIGZtdF9zcGVjID0gaGF2ZV9mbXRfc3BlYyA/IFBPUCgpIDogTlVMTDsKKyAgICAgICAgICAgIHZhbHVlID0gUE9QKCk7CisKKyAgICAgICAgICAgIC8qIFNlZSBpZiBhbnkgY29udmVyc2lvbiBpcyBzcGVjaWZpZWQuICovCisgICAgICAgICAgICBzd2l0Y2ggKHdoaWNoX2NvbnZlcnNpb24pIHsKKyAgICAgICAgICAgIGNhc2UgRlZDX1NUUjogICBjb252X2ZuID0gUHlPYmplY3RfU3RyOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGVkNfUkVQUjogIGNvbnZfZm4gPSBQeU9iamVjdF9SZXByOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZWQ19BU0NJSTogY29udl9mbiA9IFB5T2JqZWN0X0FTQ0lJOyBicmVhazsKKworICAgICAgICAgICAgLyogTXVzdCBiZSAwIChtZWFuaW5nIG5vIGNvbnZlcnNpb24pLCBzaW5jZSBvbmx5IGZvdXIKKyAgICAgICAgICAgICAgIHZhbHVlcyBhcmUgYWxsb3dlZCBieSAob3BhcmcgJiBGVkNfTUFTSykuICovCisgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgY29udl9mbiA9IE5VTEw7ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogSWYgdGhlcmUncyBhIGNvbnZlcnNpb24gZnVuY3Rpb24sIGNhbGwgaXQgYW5kIHJlcGxhY2UKKyAgICAgICAgICAgICAgIHZhbHVlIHdpdGggdGhhdCByZXN1bHQuIE90aGVyd2lzZSwganVzdCB1c2UgdmFsdWUsCisgICAgICAgICAgICAgICB3aXRob3V0IGNvbnZlcnNpb24uICovCisgICAgICAgICAgICBpZiAoY29udl9mbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29udl9mbih2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmbXRfc3BlYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB2YWx1ZSBpcyBhIHVuaWNvZGUgb2JqZWN0LCBhbmQgdGhlcmUncyBubyBmbXRfc3BlYywKKyAgICAgICAgICAgICAgIHRoZW4gd2Uga25vdyB0aGUgcmVzdWx0IG9mIGZvcm1hdCh2YWx1ZSkgaXMgdmFsdWUKKyAgICAgICAgICAgICAgIGl0c2VsZi4gSW4gdGhhdCBjYXNlLCBza2lwIGNhbGxpbmcgZm9ybWF0KCkuIEkgcGxhbiB0bworICAgICAgICAgICAgICAgbW92ZSB0aGlzIG9wdGltaXphdGlvbiBpbiB0byBQeU9iamVjdF9Gb3JtYXQoKQorICAgICAgICAgICAgICAgaXRzZWxmLiAqLworICAgICAgICAgICAgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHZhbHVlKSAmJiBmbXRfc3BlYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLyogRG8gbm90aGluZywganVzdCB0cmFuc2ZlciBvd25lcnNoaXAgdG8gcmVzdWx0LiAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBBY3R1YWxseSBjYWxsIGZvcm1hdCgpLiAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFB5T2JqZWN0X0Zvcm1hdCh2YWx1ZSwgZm10X3NwZWMpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRih2YWx1ZSk7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRihmbXRfc3BlYyk7CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQVVNIKHJlc3VsdCk7CisgICAgICAgICAgICBESVNQQVRDSCgpOworICAgICAgICB9CisKICAgICAgICAgVEFSR0VUKEVYVEVOREVEX0FSRykgewotICAgICAgICAgICAgb3Bjb2RlID0gTkVYVE9QKCk7Ci0gICAgICAgICAgICBvcGFyZyA9IG9wYXJnPDwxNiB8IE5FWFRBUkcoKTsKKyAgICAgICAgICAgIGludCBvbGRvcGFyZyA9IG9wYXJnOworICAgICAgICAgICAgTkVYVE9QQVJHKCk7CisgICAgICAgICAgICBvcGFyZyB8PSBvbGRvcGFyZyA8PCA4OwogICAgICAgICAgICAgZ290byBkaXNwYXRjaF9vcGNvZGU7CiAgICAgICAgIH0KIApAQCAtNDI5Nyw3ICs0MzE1LDcgQEAKIAogI2lmZGVmIExMVFJBQ0UKIHN0YXRpYyBpbnQKLXBydHJhY2UoUHlPYmplY3QgKnYsIGNoYXIgKnN0cikKK3BydHJhY2UoUHlPYmplY3QgKnYsIGNvbnN0IGNoYXIgKnN0cikKIHsKICAgICBwcmludGYoIiVzICIsIHN0cik7CiAgICAgaWYgKFB5T2JqZWN0X1ByaW50KHYsIHN0ZG91dCwgMCkgIT0gMCkKQEAgLTQ4NjMsNiArNDg4MSwyMSBAQAogewogICAgIFB5T2JqZWN0ICpjYWxsYXJncywgKnc7CiAKKyAgICBpZiAoIW5zdGFjaykgeworICAgICAgICBpZiAoIXN0YXJhcmcpIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGFyZSBubyBwb3NpdGlvbmFsIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2sgYW5kIHRoZXJlIGlzIG5vCisgICAgICAgICAgICAgICBzZXF1ZW5jZSB0byBiZSB1bnBhY2tlZC4gKi8KKyAgICAgICAgICAgIHJldHVybiBQeVR1cGxlX05ldygwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHN0YXJhcmcpKSB7CisgICAgICAgICAgICAvKiBObyBhcmd1bWVudHMgYXJlIHBhc3NlZCBvbiB0aGUgc3RhY2sgYW5kIHRoZSBzZXF1ZW5jZSBpcyBub3QgYQorICAgICAgICAgICAgICAgdHVwbGUgc3ViY2xhc3Mgc28gd2UgY2FuIGp1c3QgcGFzcyB0aGUgc3RhcmFyZyB0dXBsZSBkaXJlY3RseQorICAgICAgICAgICAgICAgdG8gdGhlIGZ1bmN0aW9uLiAqLworICAgICAgICAgICAgUHlfSU5DUkVGKHN0YXJhcmcpOworICAgICAgICAgICAgcmV0dXJuIHN0YXJhcmc7CisgICAgICAgIH0KKyAgICB9CisKICAgICBjYWxsYXJncyA9IFB5VHVwbGVfTmV3KG5zdGFjayArIG5zdGFyKTsKICAgICBpZiAoY2FsbGFyZ3MgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTQ5NTEsNyArNDk4NCw3IEBACiAKICAgICBpZiAoZmxhZ3MgJiBDQUxMX0ZMQUdfS1cpIHsKICAgICAgICAga3dkaWN0ID0gRVhUX1BPUCgqcHBfc3RhY2spOwotICAgICAgICBpZiAoIVB5RGljdF9DaGVjayhrd2RpY3QpKSB7CisgICAgICAgIGlmICghUHlEaWN0X0NoZWNrRXhhY3Qoa3dkaWN0KSkgewogICAgICAgICAgICAgUHlPYmplY3QgKmQ7CiAgICAgICAgICAgICBkID0gUHlEaWN0X05ldygpOwogICAgICAgICAgICAgaWYgKGQgPT0gTlVMTCkKQEAgLTUyNjEsNyArNTI5NCw3IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2NvbmNhdGVuYXRlKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqdywKLSAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZiwgdW5zaWduZWQgY2hhciAqbmV4dF9pbnN0cikKKyAgICAgICAgICAgICAgICAgICAgUHlGcmFtZU9iamVjdCAqZiwgY29uc3QgdW5zaWduZWQgc2hvcnQgKm5leHRfaW5zdHIpCiB7CiAgICAgUHlPYmplY3QgKnJlczsKICAgICBpZiAoUHlfUkVGQ05UKHYpID09IDIpIHsKQEAgLTUyNzEsMTAgKzUzMDQsMTEgQEAKICAgICAgICAgICogJ3ZhcmlhYmxlJy4gIFdlIHRyeSB0byBkZWxldGUgdGhlIHZhcmlhYmxlIG5vdyB0byByZWR1Y2UKICAgICAgICAgICogdGhlIHJlZmNudCB0byAxLgogICAgICAgICAgKi8KLSAgICAgICAgc3dpdGNoICgqbmV4dF9pbnN0cikgeworICAgICAgICBpbnQgb3Bjb2RlLCBvcGFyZzsKKyAgICAgICAgTkVYVE9QQVJHKCk7CisgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CiAgICAgICAgIGNhc2UgU1RPUkVfRkFTVDoKICAgICAgICAgewotICAgICAgICAgICAgaW50IG9wYXJnID0gUEVFS0FSRygpOwogICAgICAgICAgICAgUHlPYmplY3QgKipmYXN0bG9jYWxzID0gZi0+Zl9sb2NhbHNwbHVzOwogICAgICAgICAgICAgaWYgKEdFVExPQ0FMKG9wYXJnKSA9PSB2KQogICAgICAgICAgICAgICAgIFNFVExPQ0FMKG9wYXJnLCBOVUxMKTsKQEAgLTUyODQsNyArNTMxOCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICoqZnJlZXZhcnMgPSAoZi0+Zl9sb2NhbHNwbHVzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+Zl9jb2RlLT5jb19ubG9jYWxzKTsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpjID0gZnJlZXZhcnNbUEVFS0FSRygpXTsKKyAgICAgICAgICAgIFB5T2JqZWN0ICpjID0gZnJlZXZhcnNbb3BhcmddOwogICAgICAgICAgICAgaWYgKFB5Q2VsbF9HRVQoYykgPT0gdikKICAgICAgICAgICAgICAgICBQeUNlbGxfU2V0KGMsIE5VTEwpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01MjkyLDcgKzUzMjYsNyBAQAogICAgICAgICBjYXNlIFNUT1JFX05BTUU6CiAgICAgICAgIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcyA9IGYtPmZfY29kZS0+Y29fbmFtZXM7Ci0gICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIFBFRUtBUkcoKSk7CisgICAgICAgICAgICBQeU9iamVjdCAqbmFtZSA9IEdFVElURU0obmFtZXMsIG9wYXJnKTsKICAgICAgICAgICAgIFB5T2JqZWN0ICpsb2NhbHMgPSBmLT5mX2xvY2FsczsKICAgICAgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChsb2NhbHMpICYmCiAgICAgICAgICAgICAgICAgUHlEaWN0X0dldEl0ZW0obG9jYWxzLCBuYW1lKSA9PSB2KSB7CmRpZmYgLS1naXQgYS9QeXRob24vY2xpbmljL2JsdGlubW9kdWxlLmMuaCBiL1B5dGhvbi9jbGluaWMvYmx0aW5tb2R1bGUuYy5oCmluZGV4IDRlMmIxZjEuLjUyOTI3NGYgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jbGluaWMvYmx0aW5tb2R1bGUuYy5oCisrKyBiL1B5dGhvbi9jbGluaWMvYmx0aW5tb2R1bGUuYy5oCkBAIC05Myw4ICs5Myw5IEBACiAgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjID0gTlVMTDsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xVOmZvcm1hdCIsCi0gICAgICAgICZ2YWx1ZSwgJmZvcm1hdF9zcGVjKSkKKyAgICAgICAgJnZhbHVlLCAmZm9ybWF0X3NwZWMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9mb3JtYXRfaW1wbChtb2R1bGUsIHZhbHVlLCBmb3JtYXRfc3BlYyk7CiAKIGV4aXQ6CkBAIC0xMTksOCArMTIwLDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBpbnQgaTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiaTpjaHIiLCAmaSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJpOmNociIsICZpKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fY2hyX2ltcGwobW9kdWxlLCBpKTsKIAogZXhpdDoKQEAgLTE2Niw4ICsxNjgsOSBAQAogICAgIGludCBvcHRpbWl6ZSA9IC0xOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiT08mc3xpaWk6Y29tcGlsZSIsIF9rZXl3b3JkcywKLSAgICAgICAgJnNvdXJjZSwgUHlVbmljb2RlX0ZTRGVjb2RlciwgJmZpbGVuYW1lLCAmbW9kZSwgJmZsYWdzLCAmZG9udF9pbmhlcml0LCAmb3B0aW1pemUpKQorICAgICAgICAmc291cmNlLCBQeVVuaWNvZGVfRlNEZWNvZGVyLCAmZmlsZW5hbWUsICZtb2RlLCAmZmxhZ3MsICZkb250X2luaGVyaXQsICZvcHRpbWl6ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2NvbXBpbGVfaW1wbChtb2R1bGUsIHNvdXJjZSwgZmlsZW5hbWUsIG1vZGUsIGZsYWdzLCBkb250X2luaGVyaXQsIG9wdGltaXplKTsKIAogZXhpdDoKQEAgLTE5NSw4ICsxOTgsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZGl2bW9kIiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJngsICZ5KSkKKyAgICAgICAgJngsICZ5KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fZGl2bW9kX2ltcGwobW9kdWxlLCB4LCB5KTsKIAogZXhpdDoKQEAgLTIzMiw4ICsyMzYsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiZXZhbCIsCiAgICAgICAgIDEsIDMsCi0gICAgICAgICZzb3VyY2UsICZnbG9iYWxzLCAmbG9jYWxzKSkKKyAgICAgICAgJnNvdXJjZSwgJmdsb2JhbHMsICZsb2NhbHMpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gYnVpbHRpbl9ldmFsX2ltcGwobW9kdWxlLCBzb3VyY2UsIGdsb2JhbHMsIGxvY2Fscyk7CiAKIGV4aXQ6CkBAIC0yNjksOCArMjc0LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImV4ZWMiLAogICAgICAgICAxLCAzLAotICAgICAgICAmc291cmNlLCAmZ2xvYmFscywgJmxvY2FscykpCisgICAgICAgICZzb3VyY2UsICZnbG9iYWxzLCAmbG9jYWxzKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fZXhlY19pbXBsKG1vZHVsZSwgc291cmNlLCBnbG9iYWxzLCBsb2NhbHMpOwogCiBleGl0OgpAQCAtMzIxLDggKzMyNyw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJoYXNhdHRyIiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJm9iaiwgJm5hbWUpKQorICAgICAgICAmb2JqLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2hhc2F0dHJfaW1wbChtb2R1bGUsIG9iaiwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0zNjYsOCArMzczLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInNldGF0dHIiLAogICAgICAgICAzLCAzLAotICAgICAgICAmb2JqLCAmbmFtZSwgJnZhbHVlKSkKKyAgICAgICAgJm9iaiwgJm5hbWUsICZ2YWx1ZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX3NldGF0dHJfaW1wbChtb2R1bGUsIG9iaiwgbmFtZSwgdmFsdWUpOwogCiBleGl0OgpAQCAtMzk3LDggKzQwNSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJkZWxhdHRyIiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJm9iaiwgJm5hbWUpKQorICAgICAgICAmb2JqLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2RlbGF0dHJfaW1wbChtb2R1bGUsIG9iaiwgbmFtZSk7CiAKIGV4aXQ6CkBAIC01MDYsOCArNTE1LDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgInBvdyIsCiAgICAgICAgIDIsIDMsCi0gICAgICAgICZ4LCAmeSwgJnopKQorICAgICAgICAmeCwgJnksICZ6KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fcG93X2ltcGwobW9kdWxlLCB4LCB5LCB6KTsKIAogZXhpdDoKQEAgLTU0MCw4ICs1NTAsOSBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaW5wdXQiLAogICAgICAgICAwLCAxLAotICAgICAgICAmcHJvbXB0KSkKKyAgICAgICAgJnByb21wdCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2lucHV0X2ltcGwobW9kdWxlLCBwcm9tcHQpOwogCiBleGl0OgpAQCAtNTg0LDggKzU5NSw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdW0iLAogICAgICAgICAxLCAyLAotICAgICAgICAmaXRlcmFibGUsICZzdGFydCkpCisgICAgICAgICZpdGVyYWJsZSwgJnN0YXJ0KSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5fc3VtX2ltcGwobW9kdWxlLCBpdGVyYWJsZSwgc3RhcnQpOwogCiBleGl0OgpAQCAtNjE4LDggKzYzMCw5IEBACiAKICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJpc2luc3RhbmNlIiwKICAgICAgICAgMiwgMiwKLSAgICAgICAgJm9iaiwgJmNsYXNzX29yX3R1cGxlKSkKKyAgICAgICAgJm9iaiwgJmNsYXNzX29yX3R1cGxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IGJ1aWx0aW5faXNpbnN0YW5jZV9pbXBsKG1vZHVsZSwgb2JqLCBjbGFzc19vcl90dXBsZSk7CiAKIGV4aXQ6CkBAIC02NTIsMTEgKzY2NSwxMiBAQAogCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAiaXNzdWJjbGFzcyIsCiAgICAgICAgIDIsIDIsCi0gICAgICAgICZjbHMsICZjbGFzc19vcl90dXBsZSkpCisgICAgICAgICZjbHMsICZjbGFzc19vcl90dXBsZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBidWlsdGluX2lzc3ViY2xhc3NfaW1wbChtb2R1bGUsIGNscywgY2xhc3Nfb3JfdHVwbGUpOwogCiBleGl0OgogICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiB9Ci0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTAzMTI3MGI2NGM3OTRiOCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9NmFiMzdlNmM2ZDJlN2IxOSBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9QeXRob24vY2xpbmljL2ltcG9ydC5jLmggYi9QeXRob24vY2xpbmljL2ltcG9ydC5jLmgKaW5kZXggMDVkNzlhYy4uYjM0NjBiMCAxMDA2NDQKLS0tIGEvUHl0aG9uL2NsaW5pYy9pbXBvcnQuYy5oCisrKyBiL1B5dGhvbi9jbGluaWMvaW1wb3J0LmMuaApAQCAtODksOCArODksOSBAQAogICAgIFB5T2JqZWN0ICpwYXRoOwogCiAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIVU6X2ZpeF9jb19maWxlbmFtZSIsCi0gICAgICAgICZQeUNvZGVfVHlwZSwgJmNvZGUsICZwYXRoKSkKKyAgICAgICAgJlB5Q29kZV9UeXBlLCAmY29kZSwgJnBhdGgpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9fZml4X2NvX2ZpbGVuYW1lX2ltcGwobW9kdWxlLCBjb2RlLCBwYXRoKTsKIAogZXhpdDoKQEAgLTE0Miw4ICsxNDMsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmluaXRfZnJvemVuIiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppbml0X2Zyb3plbiIsICZuYW1lKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfaW5pdF9mcm96ZW5faW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtMTY4LDggKzE3MCw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6Z2V0X2Zyb3plbl9vYmplY3QiLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmdldF9mcm96ZW5fb2JqZWN0IiwgJm5hbWUpKSB7CiAgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CiAgICAgcmV0dXJuX3ZhbHVlID0gX2ltcF9nZXRfZnJvemVuX29iamVjdF9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0xOTQsOCArMTk3LDkgQEAKICAgICBQeU9iamVjdCAqcmV0dXJuX3ZhbHVlID0gTlVMTDsKICAgICBQeU9iamVjdCAqbmFtZTsKIAotICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppc19mcm96ZW5fcGFja2FnZSIsICZuYW1lKSkKKyAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aXNfZnJvemVuX3BhY2thZ2UiLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX2lzX2Zyb3plbl9wYWNrYWdlX2ltcGwobW9kdWxlLCBuYW1lKTsKIAogZXhpdDoKQEAgLTIyMCw4ICsyMjQsOSBAQAogICAgIFB5T2JqZWN0ICpyZXR1cm5fdmFsdWUgPSBOVUxMOwogICAgIFB5T2JqZWN0ICpuYW1lOwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmlzX2J1aWx0aW4iLCAmbmFtZSkpCisgICAgaWYgKCFQeUFyZ19QYXJzZShhcmcsICJVOmlzX2J1aWx0aW4iLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX2lzX2J1aWx0aW5faW1wbChtb2R1bGUsIG5hbWUpOwogCiBleGl0OgpAQCAtMjQ2LDggKzI1MSw5IEBACiAgICAgUHlPYmplY3QgKnJldHVybl92YWx1ZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm5hbWU7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlKGFyZywgIlU6aXNfZnJvemVuIiwgJm5hbWUpKQorICAgIGlmICghUHlBcmdfUGFyc2UoYXJnLCAiVTppc19mcm96ZW4iLCAmbmFtZSkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBfaW1wX2lzX2Zyb3plbl9pbXBsKG1vZHVsZSwgbmFtZSk7CiAKIGV4aXQ6CkBAIC0yNzcsOCArMjgzLDkgQEAKIAogICAgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImNyZWF0ZV9keW5hbWljIiwKICAgICAgICAgMSwgMiwKLSAgICAgICAgJnNwZWMsICZmaWxlKSkKKyAgICAgICAgJnNwZWMsICZmaWxlKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IF9pbXBfY3JlYXRlX2R5bmFtaWNfaW1wbChtb2R1bGUsIHNwZWMsIGZpbGUpOwogCiBleGl0OgpAQCAtMzA4LDggKzMxNSw5IEBACiAgICAgaW50IF9yZXR1cm5fdmFsdWU7CiAKICAgICBfcmV0dXJuX3ZhbHVlID0gX2ltcF9leGVjX2R5bmFtaWNfaW1wbChtb2R1bGUsIG1vZCk7Ci0gICAgaWYgKChfcmV0dXJuX3ZhbHVlID09IC0xKSAmJiBQeUVycl9PY2N1cnJlZCgpKQorICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICBnb3RvIGV4aXQ7CisgICAgfQogICAgIHJldHVybl92YWx1ZSA9IFB5TG9uZ19Gcm9tTG9uZygobG9uZylfcmV0dXJuX3ZhbHVlKTsKIAogZXhpdDoKQEAgLTMzNyw4ICszNDUsOSBAQAogICAgIGludCBfcmV0dXJuX3ZhbHVlOwogCiAgICAgX3JldHVybl92YWx1ZSA9IF9pbXBfZXhlY19idWlsdGluX2ltcGwobW9kdWxlLCBtb2QpOwotICAgIGlmICgoX3JldHVybl92YWx1ZSA9PSAtMSkgJiYgUHlFcnJfT2NjdXJyZWQoKSkKKyAgICBpZiAoKF9yZXR1cm5fdmFsdWUgPT0gLTEpICYmIFB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgZ290byBleGl0OworICAgIH0KICAgICByZXR1cm5fdmFsdWUgPSBQeUxvbmdfRnJvbUxvbmcoKGxvbmcpX3JldHVybl92YWx1ZSk7CiAKIGV4aXQ6CkBAIC0zNTIsNCArMzYxLDQgQEAKICNpZm5kZWYgX0lNUF9FWEVDX0RZTkFNSUNfTUVUSE9EREVGCiAgICAgI2RlZmluZSBfSU1QX0VYRUNfRFlOQU1JQ19NRVRIT0RERUYKICNlbmRpZiAvKiAhZGVmaW5lZChfSU1QX0VYRUNfRFlOQU1JQ19NRVRIT0RERUYpICovCi0vKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9OTBhZDZlNTgzM2U2MTcwZCBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCisvKltjbGluaWMgZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZDI0ZDdmNzM3MDJhOTA3ZiBpbnB1dD1hOTA0OTA1NDAxM2ExYjc3XSovCmRpZmYgLS1naXQgYS9QeXRob24vY29tcGlsZS5jIGIvUHl0aG9uL2NvbXBpbGUuYwppbmRleCA5M2Y0N2UwLi5lNDY2NzZjIDEwMDY0NAotLS0gYS9QeXRob24vY29tcGlsZS5jCisrKyBiL1B5dGhvbi9jb21waWxlLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJjb2RlLmgiCiAjaW5jbHVkZSAic3ltdGFibGUuaCIKICNpbmNsdWRlICJvcGNvZGUuaCIKKyNpbmNsdWRlICJ3b3JkY29kZV9oZWxwZXJzLmgiCiAKICNkZWZpbmUgREVGQVVMVF9CTE9DS19TSVpFIDE2CiAjZGVmaW5lIERFRkFVTFRfQkxPQ0tTIDgKQEAgLTQzLDcgKzQ0LDYgQEAKIHN0cnVjdCBpbnN0ciB7CiAgICAgdW5zaWduZWQgaV9qYWJzIDogMTsKICAgICB1bnNpZ25lZCBpX2pyZWwgOiAxOwotICAgIHVuc2lnbmVkIGlfaGFzYXJnIDogMTsKICAgICB1bnNpZ25lZCBjaGFyIGlfb3Bjb2RlOwogICAgIGludCBpX29wYXJnOwogICAgIHN0cnVjdCBiYXNpY2Jsb2NrXyAqaV90YXJnZXQ7IC8qIHRhcmdldCBibG9jayAoaWYganVtcCBpbnN0cnVjdGlvbikgKi8KQEAgLTE3MSw3ICsxNzEsNiBAQAogc3RhdGljIGludCBjb21waWxlcl9hZGRvcF9vKHN0cnVjdCBjb21waWxlciAqLCBpbnQsIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwogc3RhdGljIGludCBjb21waWxlcl9hZGRvcF9pKHN0cnVjdCBjb21waWxlciAqLCBpbnQsIFB5X3NzaXplX3QpOwogc3RhdGljIGludCBjb21waWxlcl9hZGRvcF9qKHN0cnVjdCBjb21waWxlciAqLCBpbnQsIGJhc2ljYmxvY2sgKiwgaW50KTsKLXN0YXRpYyBiYXNpY2Jsb2NrICpjb21waWxlcl91c2VfbmV3X2Jsb2NrKHN0cnVjdCBjb21waWxlciAqKTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfZXJyb3Ioc3RydWN0IGNvbXBpbGVyICosIGNvbnN0IGNoYXIgKik7CiBzdGF0aWMgaW50IGNvbXBpbGVyX25hbWVvcChzdHJ1Y3QgY29tcGlsZXIgKiwgaWRlbnRpZmllciwgZXhwcl9jb250ZXh0X3R5KTsKIApAQCAtMTk2LDcgKzE5NSw3IEBACiBzdGF0aWMgaW50IGNvbXBpbGVyX3dpdGgoc3RydWN0IGNvbXBpbGVyICosIHN0bXRfdHksIGludCk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2FzeW5jX3dpdGgoc3RydWN0IGNvbXBpbGVyICosIHN0bXRfdHksIGludCk7CiBzdGF0aWMgaW50IGNvbXBpbGVyX2FzeW5jX2ZvcihzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSk7Ci1zdGF0aWMgaW50IGNvbXBpbGVyX2NhbGxfaGVscGVyKHN0cnVjdCBjb21waWxlciAqYywgUHlfc3NpemVfdCBuLAorc3RhdGljIGludCBjb21waWxlcl9jYWxsX2hlbHBlcihzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmtleXdvcmRzKTsKIHN0YXRpYyBpbnQgY29tcGlsZXJfdHJ5X2V4Y2VwdChzdHJ1Y3QgY29tcGlsZXIgKiwgc3RtdF90eSk7CkBAIC00NzcsOSArNDc2LDkgQEAKIHsKICAgICBiYXNpY2Jsb2NrICpibG9jazsKICAgICBmb3IgKGJsb2NrID0gdS0+dV9ibG9ja3M7IGJsb2NrICE9IE5VTEw7IGJsb2NrID0gYmxvY2stPmJfbGlzdCkgewotICAgICAgICBhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4Y2JjYmNiY2IpOwotICAgICAgICBhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4ZmJmYmZiZmIpOwotICAgICAgICBhc3NlcnQoKHZvaWQgKilibG9jayAhPSAodm9pZCAqKTB4ZGJkYmRiZGIpOworICAgICAgICBhc3NlcnQoKFB5X3VpbnRwdHJfdClibG9jayAhPSAweGNiY2JjYmNiVSk7CisgICAgICAgIGFzc2VydCgoUHlfdWludHB0cl90KWJsb2NrICE9IDB4ZmJmYmZiZmJVKTsKKyAgICAgICAgYXNzZXJ0KChQeV91aW50cHRyX3QpYmxvY2sgIT0gMHhkYmRiZGJkYlUpOwogICAgICAgICBpZiAoYmxvY2stPmJfaW5zdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgYXNzZXJ0KGJsb2NrLT5iX2lhbGxvYyA+IDApOwogICAgICAgICAgICAgYXNzZXJ0KGJsb2NrLT5iX2l1c2VkID4gMCk7CkBAIC01MjMsNiArNTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIGludCBzY29wZV90eXBlLCB2b2lkICprZXksIGludCBsaW5lbm8pCiB7CiAgICAgc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7CisgICAgYmFzaWNibG9jayAqYmxvY2s7CiAKICAgICB1ID0gKHN0cnVjdCBjb21waWxlcl91bml0ICopUHlPYmplY3RfTWFsbG9jKHNpemVvZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbXBpbGVyX3VuaXQpKTsKQEAgLTYyMCw4ICs2MjAsMTEgQEAKICAgICBjLT51ID0gdTsKIAogICAgIGMtPmNfbmVzdGxldmVsKys7Ci0gICAgaWYgKGNvbXBpbGVyX3VzZV9uZXdfYmxvY2soYykgPT0gTlVMTCkKKworICAgIGJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOworICAgIGlmIChibG9jayA9PSBOVUxMKQogICAgICAgICByZXR1cm4gMDsKKyAgICBjLT51LT51X2N1cmJsb2NrID0gYmxvY2s7CiAKICAgICBpZiAodS0+dV9zY29wZV90eXBlICE9IENPTVBJTEVSX1NDT1BFX01PRFVMRSkgewogICAgICAgICBpZiAoIWNvbXBpbGVyX3NldF9xdWFsbmFtZShjKSkKQEAgLTczMSw2ICs3MzQsNyBAQAogICAgIHJldHVybiAxOwogfQogCisKIC8qIEFsbG9jYXRlIGEgbmV3IGJsb2NrIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0LgogICAgUmV0dXJucyBOVUxMIG9uIGVycm9yLgogKi8KQEAgLTc1NSwxNiArNzU5LDYgQEAKIH0KIAogc3RhdGljIGJhc2ljYmxvY2sgKgotY29tcGlsZXJfdXNlX25ld19ibG9jayhzdHJ1Y3QgY29tcGlsZXIgKmMpCi17Ci0gICAgYmFzaWNibG9jayAqYmxvY2sgPSBjb21waWxlcl9uZXdfYmxvY2soYyk7Ci0gICAgaWYgKGJsb2NrID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGMtPnUtPnVfY3VyYmxvY2sgPSBibG9jazsKLSAgICByZXR1cm4gYmxvY2s7Ci19Ci0KLXN0YXRpYyBiYXNpY2Jsb2NrICoKIGNvbXBpbGVyX25leHRfYmxvY2soc3RydWN0IGNvbXBpbGVyICpjKQogewogICAgIGJhc2ljYmxvY2sgKmJsb2NrID0gY29tcGlsZXJfbmV3X2Jsb2NrKGMpOwpAQCAtOTg2LDYgKzk4MCw4IEBACiAgICAgICAgICAgICByZXR1cm4gMSAtIChvcGFyZyAmIDB4RkYpOwogICAgICAgICBjYXNlIEJVSUxEX01BUDoKICAgICAgICAgICAgIHJldHVybiAxIC0gMipvcGFyZzsKKyAgICAgICAgY2FzZSBCVUlMRF9DT05TVF9LRVlfTUFQOgorICAgICAgICAgICAgcmV0dXJuIC1vcGFyZzsKICAgICAgICAgY2FzZSBMT0FEX0FUVFI6CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgY2FzZSBDT01QQVJFX09QOgpAQCAtMTAzNCwxMSArMTAzMCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIC1OQVJHUyhvcGFyZyktMTsKICAgICAgICAgY2FzZSBDQUxMX0ZVTkNUSU9OX1ZBUl9LVzoKICAgICAgICAgICAgIHJldHVybiAtTkFSR1Mob3BhcmcpLTI7Ci0gICAgICAgIGNhc2UgTUFLRV9GVU5DVElPTjoKLSAgICAgICAgICAgIHJldHVybiAtMSAtTkFSR1Mob3BhcmcpIC0gKChvcGFyZyA+PiAxNikgJiAweGZmZmYpOwotICAgICAgICBjYXNlIE1BS0VfQ0xPU1VSRToKLSAgICAgICAgICAgIHJldHVybiAtMiAtIE5BUkdTKG9wYXJnKSAtICgob3BhcmcgPj4gMTYpICYgMHhmZmZmKTsKICN1bmRlZiBOQVJHUworICAgICAgICBjYXNlIE1BS0VfRlVOQ1RJT046CisgICAgICAgICAgICByZXR1cm4gLTEgLSAoKG9wYXJnICYgMHgwMSkgIT0gMCkgLSAoKG9wYXJnICYgMHgwMikgIT0gMCkgLQorICAgICAgICAgICAgICAgICgob3BhcmcgJiAweDA0KSAhPSAwKSAtICgob3BhcmcgJiAweDA4KSAhPSAwKTsKICAgICAgICAgY2FzZSBCVUlMRF9TTElDRToKICAgICAgICAgICAgIGlmIChvcGFyZyA9PSAzKQogICAgICAgICAgICAgICAgIHJldHVybiAtMjsKQEAgLTEwNjYsNiArMTA2MSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIGNhc2UgR0VUX1lJRUxEX0ZST01fSVRFUjoKICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjYXNlIEZPUk1BVF9WQUxVRToKKyAgICAgICAgICAgIC8qIElmIHRoZXJlJ3MgYSBmbXRfc3BlYyBvbiB0aGUgc3RhY2ssIHdlIGdvIGZyb20gMi0+MSwKKyAgICAgICAgICAgICAgIGVsc2UgMS0+MS4gKi8KKyAgICAgICAgICAgIHJldHVybiAob3BhcmcgJiBGVlNfTUFTSykgPT0gRlZTX0hBVkVfU1BFQyA/IC0xIDogMDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBQWV9JTlZBTElEX1NUQUNLX0VGRkVDVDsKICAgICB9CkBAIC0xMDgyLDEzICsxMDgxLDE0IEBACiAgICAgYmFzaWNibG9jayAqYjsKICAgICBzdHJ1Y3QgaW5zdHIgKmk7CiAgICAgaW50IG9mZjsKKyAgICBhc3NlcnQoIUhBU19BUkcob3Bjb2RlKSk7CiAgICAgb2ZmID0gY29tcGlsZXJfbmV4dF9pbnN0cihjLCBjLT51LT51X2N1cmJsb2NrKTsKICAgICBpZiAob2ZmIDwgMCkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgYiA9IGMtPnUtPnVfY3VyYmxvY2s7CiAgICAgaSA9ICZiLT5iX2luc3RyW29mZl07CiAgICAgaS0+aV9vcGNvZGUgPSBvcGNvZGU7Ci0gICAgaS0+aV9oYXNhcmcgPSAwOworICAgIGktPmlfb3BhcmcgPSAwOwogICAgIGlmIChvcGNvZGUgPT0gUkVUVVJOX1ZBTFVFKQogICAgICAgICBiLT5iX3JldHVybiA9IDE7CiAgICAgY29tcGlsZXJfc2V0X2xpbmVubyhjLCBvZmYpOwpAQCAtMTE2NSwxMCArMTE2NSwxNSBAQAogICAgIHN0cnVjdCBpbnN0ciAqaTsKICAgICBpbnQgb2ZmOwogCi0gICAgLyogSW50ZWdlciBhcmd1bWVudHMgYXJlIGxpbWl0IHRvIDE2LWJpdC4gVGhlcmUgaXMgYW4gZXh0ZW5zaW9uIGZvciAzMi1iaXQKLSAgICAgICBpbnRlZ2VyIGFyZ3VtZW50cy4gKi8KLSAgICBhc3NlcnQoKC0yMTQ3NDgzNjQ3LTEpIDw9IG9wYXJnKTsKLSAgICBhc3NlcnQob3BhcmcgPD0gMjE0NzQ4MzY0Nyk7CisgICAgLyogb3BhcmcgdmFsdWUgaXMgdW5zaWduZWQsIGJ1dCBhIHNpZ25lZCBDIGludCBpcyB1c3VhbGx5IHVzZWQgdG8gc3RvcmUKKyAgICAgICBpdCBpbiB0aGUgQyBjb2RlIChsaWtlIFB5dGhvbi9jZXZhbC5jKS4KKworICAgICAgIExpbWl0IHRvIDMyLWJpdCBzaWduZWQgQyBpbnQgKHJhdGhlciB0aGFuIElOVF9NQVgpIGZvciBwb3J0YWJpbGl0eS4KKworICAgICAgIFRoZSBhcmd1bWVudCBvZiBhIGNvbmNyZXRlIGJ5dGVjb2RlIGluc3RydWN0aW9uIGlzIGxpbWl0ZWQgdG8gOC1iaXQuCisgICAgICAgRVhURU5ERURfQVJHIGlzIHVzZWQgZm9yIDE2LCAyNCwgYW5kIDMyLWJpdCBhcmd1bWVudHMuICovCisgICAgYXNzZXJ0KEhBU19BUkcob3Bjb2RlKSk7CisgICAgYXNzZXJ0KDAgPD0gb3BhcmcgJiYgb3BhcmcgPD0gMjE0NzQ4MzY0Nyk7CiAKICAgICBvZmYgPSBjb21waWxlcl9uZXh0X2luc3RyKGMsIGMtPnUtPnVfY3VyYmxvY2spOwogICAgIGlmIChvZmYgPCAwKQpAQCAtMTE3Niw3ICsxMTgxLDYgQEAKICAgICBpID0gJmMtPnUtPnVfY3VyYmxvY2stPmJfaW5zdHJbb2ZmXTsKICAgICBpLT5pX29wY29kZSA9IG9wY29kZTsKICAgICBpLT5pX29wYXJnID0gUHlfU0FGRV9ET1dOQ0FTVChvcGFyZywgUHlfc3NpemVfdCwgaW50KTsKLSAgICBpLT5pX2hhc2FyZyA9IDE7CiAgICAgY29tcGlsZXJfc2V0X2xpbmVubyhjLCBvZmYpOwogICAgIHJldHVybiAxOwogfQpAQCAtMTE4Nyw2ICsxMTkxLDcgQEAKICAgICBzdHJ1Y3QgaW5zdHIgKmk7CiAgICAgaW50IG9mZjsKIAorICAgIGFzc2VydChIQVNfQVJHKG9wY29kZSkpOwogICAgIGFzc2VydChiICE9IE5VTEwpOwogICAgIG9mZiA9IGNvbXBpbGVyX25leHRfaW5zdHIoYywgYy0+dS0+dV9jdXJibG9jayk7CiAgICAgaWYgKG9mZiA8IDApCkBAIC0xMTk0LDcgKzExOTksNiBAQAogICAgIGkgPSAmYy0+dS0+dV9jdXJibG9jay0+Yl9pbnN0cltvZmZdOwogICAgIGktPmlfb3Bjb2RlID0gb3Bjb2RlOwogICAgIGktPmlfdGFyZ2V0ID0gYjsKLSAgICBpLT5pX2hhc2FyZyA9IDE7CiAgICAgaWYgKGFic29sdXRlKQogICAgICAgICBpLT5pX2phYnMgPSAxOwogICAgIGVsc2UKQEAgLTEyMDMsMjIgKzEyMDcsMTIgQEAKICAgICByZXR1cm4gMTsKIH0KIAotLyogVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gTkVXX0JMT0NLIGFuZCBORVhUX0JMT0NLIGlzIHN1YnRsZS4gIChJJ2QKLSAgIGxpa2UgdG8gZmluZCBiZXR0ZXIgbmFtZXMuKSAgTkVXX0JMT0NLKCkgY3JlYXRlcyBhIG5ldyBibG9jayBhbmQgc2V0cwotICAgaXQgYXMgdGhlIGN1cnJlbnQgYmxvY2suICBORVhUX0JMT0NLKCkgYWxzbyBjcmVhdGVzIGFuIGltcGxpY2l0IGp1bXAKLSAgIGZyb20gdGhlIGN1cnJlbnQgYmxvY2sgdG8gdGhlIG5ldyBibG9jay4KKy8qIE5FWFRfQkxPQ0soKSBjcmVhdGVzIGFuIGltcGxpY2l0IGp1bXAgZnJvbSB0aGUgY3VycmVudCBibG9jaworICAgdG8gdGhlIG5ldyBibG9jay4KKworICAgVGhlIHJldHVybnMgaW5zaWRlIHRoaXMgbWFjcm8gbWFrZSBpdCBpbXBvc3NpYmxlIHRvIGRlY3JlZiBvYmplY3RzCisgICBjcmVhdGVkIGluIHRoZSBsb2NhbCBmdW5jdGlvbi4gTG9jYWwgb2JqZWN0cyBzaG91bGQgdXNlIHRoZSBhcmVuYS4KICovCi0KLS8qIFRoZSByZXR1cm5zIGluc2lkZSB0aGVzZSBtYWNyb3MgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIGRlY3JlZiBvYmplY3RzCi0gICBjcmVhdGVkIGluIHRoZSBsb2NhbCBmdW5jdGlvbi4gIExvY2FsIG9iamVjdHMgc2hvdWxkIHVzZSB0aGUgYXJlbmEuCi0qLwotCi0KLSNkZWZpbmUgTkVXX0JMT0NLKEMpIHsgXAotICAgIGlmIChjb21waWxlcl91c2VfbmV3X2Jsb2NrKChDKSkgPT0gTlVMTCkgXAotICAgICAgICByZXR1cm4gMDsgXAotfQotCiAjZGVmaW5lIE5FWFRfQkxPQ0soQykgeyBcCiAgICAgaWYgKGNvbXBpbGVyX25leHRfYmxvY2soKEMpKSA9PSBOVUxMKSBcCiAgICAgICAgIHJldHVybiAwOyBcCkBAIC0xMjQxLDYgKzEyMzUsMTUgQEAKICAgICAgICAgcmV0dXJuIDA7IFwKIH0KIAorLyogU2FtZSBhcyBBRERPUF9PLCBidXQgc3RlYWxzIGEgcmVmZXJlbmNlLiAqLworI2RlZmluZSBBRERPUF9OKEMsIE9QLCBPLCBUWVBFKSB7IFwKKyAgICBpZiAoIWNvbXBpbGVyX2FkZG9wX28oKEMpLCAoT1ApLCAoQyktPnUtPnVfICMjIFRZUEUsIChPKSkpIHsgXAorICAgICAgICBQeV9ERUNSRUYoKE8pKTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAorICAgIFB5X0RFQ1JFRigoTykpOyBcCit9CisKICNkZWZpbmUgQURET1BfTkFNRShDLCBPUCwgTywgVFlQRSkgeyBcCiAgICAgaWYgKCFjb21waWxlcl9hZGRvcF9uYW1lKChDKSwgKE9QKSwgKEMpLT51LT51XyAjIyBUWVBFLCAoTykpKSBcCiAgICAgICAgIHJldHVybiAwOyBcCkBAIC0xMzA5LDcgKzEzMTIsNDkgQEAKIHsKICAgICBpZiAocy0+a2luZCAhPSBFeHByX2tpbmQpCiAgICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBzLT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQ7CisgICAgaWYgKHMtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHMtPnYuRXhwci52YWx1ZS0+a2luZCA9PSBDb25zdGFudF9raW5kKQorICAgICAgICByZXR1cm4gUHlVbmljb2RlX0NoZWNrRXhhY3Qocy0+di5FeHByLnZhbHVlLT52LkNvbnN0YW50LnZhbHVlKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraXNfY29uc3QoZXhwcl90eSBlKQoreworICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKKyAgICBjYXNlIE51bV9raW5kOgorICAgIGNhc2UgU3RyX2tpbmQ6CisgICAgY2FzZSBCeXRlc19raW5kOgorICAgIGNhc2UgRWxsaXBzaXNfa2luZDoKKyAgICBjYXNlIE5hbWVDb25zdGFudF9raW5kOgorICAgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCitnZXRfY29uc3RfdmFsdWUoZXhwcl90eSBlKQoreworICAgIHN3aXRjaCAoZS0+a2luZCkgeworICAgIGNhc2UgQ29uc3RhbnRfa2luZDoKKyAgICAgICAgcmV0dXJuIGUtPnYuQ29uc3RhbnQudmFsdWU7CisgICAgY2FzZSBOdW1fa2luZDoKKyAgICAgICAgcmV0dXJuIGUtPnYuTnVtLm47CisgICAgY2FzZSBTdHJfa2luZDoKKyAgICAgICAgcmV0dXJuIGUtPnYuU3RyLnM7CisgICAgY2FzZSBCeXRlc19raW5kOgorICAgICAgICByZXR1cm4gZS0+di5CeXRlcy5zOworICAgIGNhc2UgRWxsaXBzaXNfa2luZDoKKyAgICAgICAgcmV0dXJuIFB5X0VsbGlwc2lzOworICAgIGNhc2UgTmFtZUNvbnN0YW50X2tpbmQ6CisgICAgICAgIHJldHVybiBlLT52Lk5hbWVDb25zdGFudC52YWx1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoIWlzX2NvbnN0KGUpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogfQogCiAvKiBDb21waWxlIGEgc2VxdWVuY2Ugb2Ygc3RhdGVtZW50cywgY2hlY2tpbmcgZm9yIGEgZG9jc3RyaW5nLiAqLwpAQCAtMTQyNiw1MyArMTQ3MSw1MCBAQAogfQogCiBzdGF0aWMgaW50Ci1jb21waWxlcl9tYWtlX2Nsb3N1cmUoc3RydWN0IGNvbXBpbGVyICpjLCBQeUNvZGVPYmplY3QgKmNvLCBQeV9zc2l6ZV90IGFyZ3MsIFB5T2JqZWN0ICpxdWFsbmFtZSkKK2NvbXBpbGVyX21ha2VfY2xvc3VyZShzdHJ1Y3QgY29tcGlsZXIgKmMsIFB5Q29kZU9iamVjdCAqY28sIFB5X3NzaXplX3QgZmxhZ3MsIFB5T2JqZWN0ICpxdWFsbmFtZSkKIHsKICAgICBQeV9zc2l6ZV90IGksIGZyZWUgPSBQeUNvZGVfR2V0TnVtRnJlZShjbyk7CiAgICAgaWYgKHF1YWxuYW1lID09IE5VTEwpCiAgICAgICAgIHF1YWxuYW1lID0gY28tPmNvX25hbWU7CiAKLSAgICBpZiAoZnJlZSA9PSAwKSB7Ci0gICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgKFB5T2JqZWN0KiljbywgY29uc3RzKTsKLSAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBxdWFsbmFtZSwgY29uc3RzKTsKLSAgICAgICAgQURET1BfSShjLCBNQUtFX0ZVTkNUSU9OLCBhcmdzKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBmcmVlOyArK2kpIHsKLSAgICAgICAgLyogQnlwYXNzIGNvbV9hZGRvcF92YXJuYW1lIGJlY2F1c2UgaXQgd2lsbCBnZW5lcmF0ZQotICAgICAgICAgICBMT0FEX0RFUkVGIGJ1dCBMT0FEX0NMT1NVUkUgaXMgbmVlZGVkLgotICAgICAgICAqLwotICAgICAgICBQeU9iamVjdCAqbmFtZSA9IFB5VHVwbGVfR0VUX0lURU0oY28tPmNvX2ZyZWV2YXJzLCBpKTsKLSAgICAgICAgaW50IGFyZywgcmVmdHlwZTsKKyAgICBpZiAoZnJlZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJlZTsgKytpKSB7CisgICAgICAgICAgICAvKiBCeXBhc3MgY29tX2FkZG9wX3Zhcm5hbWUgYmVjYXVzZSBpdCB3aWxsIGdlbmVyYXRlCisgICAgICAgICAgICAgICBMT0FEX0RFUkVGIGJ1dCBMT0FEX0NMT1NVUkUgaXMgbmVlZGVkLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lID0gUHlUdXBsZV9HRVRfSVRFTShjby0+Y29fZnJlZXZhcnMsIGkpOworICAgICAgICAgICAgaW50IGFyZywgcmVmdHlwZTsKIAotICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IElmIGEgY2xhc3MgY29udGFpbnMgYSBtZXRob2Qgd2l0aCBhCi0gICAgICAgICAgIGZyZWUgdmFyaWFibGUgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhIG1ldGhvZCwKLSAgICAgICAgICAgdGhlIG5hbWUgd2lsbCBiZSBjb25zaWRlcmVkIGZyZWUgKmFuZCogbG9jYWwgaW4gdGhlCi0gICAgICAgICAgIGNsYXNzLiAgSXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNsb3N1cmUsIGFzCi0gICAgICAgICAgIHdlbGwgYXMgYnkgdGhlIG5vcm1hbCBuYW1lIGxvb29rdXAgbG9naWMuCi0gICAgICAgICovCi0gICAgICAgIHJlZnR5cGUgPSBnZXRfcmVmX3R5cGUoYywgbmFtZSk7Ci0gICAgICAgIGlmIChyZWZ0eXBlID09IENFTEwpCi0gICAgICAgICAgICBhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfY2VsbHZhcnMsIG5hbWUpOwotICAgICAgICBlbHNlIC8qIChyZWZ0eXBlID09IEZSRUUpICovCi0gICAgICAgICAgICBhcmcgPSBjb21waWxlcl9sb29rdXBfYXJnKGMtPnUtPnVfZnJlZXZhcnMsIG5hbWUpOwotICAgICAgICBpZiAoYXJnID09IC0xKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAibG9va3VwICVzIGluICVzICVkICVkXG4iCi0gICAgICAgICAgICAgICAgImZyZWV2YXJzIG9mICVzOiAlc1xuIiwKLSAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KFB5T2JqZWN0X1JlcHIobmFtZSkpLAotICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoYy0+dS0+dV9uYW1lKSwKLSAgICAgICAgICAgICAgICByZWZ0eXBlLCBhcmcsCi0gICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChjby0+Y29fbmFtZSksCi0gICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChQeU9iamVjdF9SZXByKGNvLT5jb19mcmVldmFycykpKTsKLSAgICAgICAgICAgIFB5X0ZhdGFsRXJyb3IoImNvbXBpbGVyX21ha2VfY2xvc3VyZSgpIik7CisgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2U6IElmIGEgY2xhc3MgY29udGFpbnMgYSBtZXRob2Qgd2l0aCBhCisgICAgICAgICAgICAgICBmcmVlIHZhcmlhYmxlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBtZXRob2QsCisgICAgICAgICAgICAgICB0aGUgbmFtZSB3aWxsIGJlIGNvbnNpZGVyZWQgZnJlZSAqYW5kKiBsb2NhbCBpbiB0aGUKKyAgICAgICAgICAgICAgIGNsYXNzLiAgSXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIGNsb3N1cmUsIGFzCisgICAgICAgICAgICAgICB3ZWxsIGFzIGJ5IHRoZSBub3JtYWwgbmFtZSBsb29va3VwIGxvZ2ljLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHJlZnR5cGUgPSBnZXRfcmVmX3R5cGUoYywgbmFtZSk7CisgICAgICAgICAgICBpZiAocmVmdHlwZSA9PSBDRUxMKQorICAgICAgICAgICAgICAgIGFyZyA9IGNvbXBpbGVyX2xvb2t1cF9hcmcoYy0+dS0+dV9jZWxsdmFycywgbmFtZSk7CisgICAgICAgICAgICBlbHNlIC8qIChyZWZ0eXBlID09IEZSRUUpICovCisgICAgICAgICAgICAgICAgYXJnID0gY29tcGlsZXJfbG9va3VwX2FyZyhjLT51LT51X2ZyZWV2YXJzLCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChhcmcgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgImxvb2t1cCAlcyBpbiAlcyAlZCAlZFxuIgorICAgICAgICAgICAgICAgICAgICAiZnJlZXZhcnMgb2YgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KFB5T2JqZWN0X1JlcHIobmFtZSkpLAorICAgICAgICAgICAgICAgICAgICBQeVVuaWNvZGVfQXNVVEY4KGMtPnUtPnVfbmFtZSksCisgICAgICAgICAgICAgICAgICAgIHJlZnR5cGUsIGFyZywKKyAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0FzVVRGOChjby0+Y29fbmFtZSksCisgICAgICAgICAgICAgICAgICAgIFB5VW5pY29kZV9Bc1VURjgoUHlPYmplY3RfUmVwcihjby0+Y29fZnJlZXZhcnMpKSk7CisgICAgICAgICAgICAgICAgUHlfRmF0YWxFcnJvcigiY29tcGlsZXJfbWFrZV9jbG9zdXJlKCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFERE9QX0koYywgTE9BRF9DTE9TVVJFLCBhcmcpOwogICAgICAgICB9Ci0gICAgICAgIEFERE9QX0koYywgTE9BRF9DTE9TVVJFLCBhcmcpOworICAgICAgICBmbGFncyB8PSAweDA4OworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX1RVUExFLCBmcmVlKTsKICAgICB9Ci0gICAgQURET1BfSShjLCBCVUlMRF9UVVBMRSwgZnJlZSk7CiAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCAoUHlPYmplY3QqKWNvLCBjb25zdHMpOwogICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgcXVhbG5hbWUsIGNvbnN0cyk7Ci0gICAgQURET1BfSShjLCBNQUtFX0NMT1NVUkUsIGFyZ3MpOworICAgIEFERE9QX0koYywgTUFLRV9GVU5DVElPTiwgZmxhZ3MpOwogICAgIHJldHVybiAxOwogfQogCkBAIC0xNDk0LDI2ICsxNTM2LDYwIEBACiBjb21waWxlcl92aXNpdF9rd29ubHlkZWZhdWx0cyhzdHJ1Y3QgY29tcGlsZXIgKmMsIGFzZGxfc2VxICprd29ubHlhcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmt3X2RlZmF1bHRzKQogewotICAgIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlZmF1bHRzICsgMS4KLSAgICAgICBSZXR1cm5zIDAgb24gZXJyb3IuCi0gICAgICovCi0gICAgaW50IGksIGRlZmF1bHRfY291bnQgPSAwOworICAgIC8qIFB1c2ggYSBkaWN0IG9mIGtleXdvcmQtb25seSBkZWZhdWx0IHZhbHVlcy4KKworICAgICAgIFJldHVybiAwIG9uIGVycm9yLCAtMSBpZiBubyBkaWN0IHB1c2hlZCwgMSBpZiBhIGRpY3QgaXMgcHVzaGVkLgorICAgICAgICovCisgICAgaW50IGk7CisgICAgUHlPYmplY3QgKmtleXMgPSBOVUxMOworCiAgICAgZm9yIChpID0gMDsgaSA8IGFzZGxfc2VxX0xFTihrd29ubHlhcmdzKTsgaSsrKSB7CiAgICAgICAgIGFyZ190eSBhcmcgPSBhc2RsX3NlcV9HRVQoa3dvbmx5YXJncywgaSk7CiAgICAgICAgIGV4cHJfdHkgZGVmYXVsdF8gPSBhc2RsX3NlcV9HRVQoa3dfZGVmYXVsdHMsIGkpOwogICAgICAgICBpZiAoZGVmYXVsdF8pIHsKICAgICAgICAgICAgIFB5T2JqZWN0ICptYW5nbGVkID0gX1B5X01hbmdsZShjLT51LT51X3ByaXZhdGUsIGFyZy0+YXJnKTsKLSAgICAgICAgICAgIGlmICghbWFuZ2xlZCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgbWFuZ2xlZCwgY29uc3RzKTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRihtYW5nbGVkKTsKLSAgICAgICAgICAgIGlmICghY29tcGlsZXJfdmlzaXRfZXhwcihjLCBkZWZhdWx0XykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghbWFuZ2xlZCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0X2NvdW50Kys7CisgICAgICAgICAgICBpZiAoa2V5cyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAga2V5cyA9IFB5TGlzdF9OZXcoMSk7CisgICAgICAgICAgICAgICAgaWYgKGtleXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBQeUxpc3RfU0VUX0lURU0oa2V5cywgMCwgbWFuZ2xlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzID0gUHlMaXN0X0FwcGVuZChrZXlzLCBtYW5nbGVkKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYobWFuZ2xlZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY29tcGlsZXJfdmlzaXRfZXhwcihjLCBkZWZhdWx0XykpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBkZWZhdWx0X2NvdW50ICsgMTsKKyAgICBpZiAoa2V5cyAhPSBOVUxMKSB7CisgICAgICAgIFB5X3NzaXplX3QgZGVmYXVsdF9jb3VudCA9IFB5TGlzdF9HRVRfU0laRShrZXlzKTsKKyAgICAgICAgUHlPYmplY3QgKmtleXNfdHVwbGUgPSBQeUxpc3RfQXNUdXBsZShrZXlzKTsKKyAgICAgICAgUHlfREVDUkVGKGtleXMpOworICAgICAgICBpZiAoa2V5c190dXBsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9OKGMsIExPQURfQ09OU1QsIGtleXNfdHVwbGUsIGNvbnN0cyk7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfQ09OU1RfS0VZX01BUCwgZGVmYXVsdF9jb3VudCk7CisgICAgICAgIGFzc2VydChkZWZhdWx0X2NvdW50ID4gMCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworZXJyb3I6CisgICAgUHlfWERFQ1JFRihrZXlzKTsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApAQCAtMTU1NiwxMSArMTYzMiwxMCBAQAogY29tcGlsZXJfdmlzaXRfYW5ub3RhdGlvbnMoc3RydWN0IGNvbXBpbGVyICpjLCBhcmd1bWVudHNfdHkgYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgcmV0dXJucykKIHsKLSAgICAvKiBQdXNoIGFyZyBhbm5vdGF0aW9ucyBhbmQgYSBsaXN0IG9mIHRoZSBhcmd1bWVudCBuYW1lcy4gUmV0dXJuIHRoZSAjCi0gICAgICAgb2YgaXRlbXMgcHVzaGVkICsgMS4gVGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgb3V0LW9mLW9yZGVyIHdydCB0aGUKLSAgICAgICBzb3VyY2UgY29kZS4KKyAgICAvKiBQdXNoIGFyZyBhbm5vdGF0aW9uIGRpY3QuCisgICAgICAgVGhlIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgb3V0LW9mLW9yZGVyIHdydCB0aGUgc291cmNlIGNvZGUuCiAKLSAgICAgICBNb3JlIHRoYW4gMl4xNi0xIGFubm90YXRpb25zIGlzIGEgU3ludGF4RXJyb3IuIFJldHVybnMgMCBvbiBlcnJvci4KKyAgICAgICBSZXR1cm4gMCBvbiBlcnJvciwgLTEgaWYgbm8gZGljdCBwdXNoZWQsIDEgaWYgYSBkaWN0IGlzIHB1c2hlZC4KICAgICAgICAqLwogICAgIHN0YXRpYyBpZGVudGlmaWVyIHJldHVybl9zdHI7CiAgICAgUHlPYmplY3QgKm5hbWVzOwpAQCAtMTU5MiwzMiArMTY2NywyMCBAQAogICAgIH0KIAogICAgIGxlbiA9IFB5TGlzdF9HRVRfU0laRShuYW1lcyk7Ci0gICAgaWYgKGxlbiA+IDY1NTM0KSB7Ci0gICAgICAgIC8qIGxlbiBtdXN0IGZpdCBpbiAxNiBiaXRzLCBhbmQgbGVuIGlzIGluY3JlbWVudGVkIGJlbG93ICovCi0gICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeW50YXhFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBhbm5vdGF0aW9ucyIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KICAgICBpZiAobGVuKSB7Ci0gICAgICAgIC8qIGNvbnZlcnQgbmFtZXMgdG8gYSB0dXBsZSBhbmQgcGxhY2Ugb24gc3RhY2sgKi8KLSAgICAgICAgUHlPYmplY3QgKmVsdDsKLSAgICAgICAgUHlfc3NpemVfdCBpOwotICAgICAgICBQeU9iamVjdCAqcyA9IFB5VHVwbGVfTmV3KGxlbik7Ci0gICAgICAgIGlmICghcykKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgZWx0ID0gUHlMaXN0X0dFVF9JVEVNKG5hbWVzLCBpKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihlbHQpOwotICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShzLCBpLCBlbHQpOworICAgICAgICBQeU9iamVjdCAqa2V5dHVwbGUgPSBQeUxpc3RfQXNUdXBsZShuYW1lcyk7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7CisgICAgICAgIGlmIChrZXl0dXBsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQotICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIHMsIGNvbnN0cyk7Ci0gICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgbGVuKys7IC8qIGluY2x1ZGUgdGhlIGp1c3QtcHVzaGVkIHR1cGxlICovCisgICAgICAgIEFERE9QX04oYywgTE9BRF9DT05TVCwga2V5dHVwbGUsIGNvbnN0cyk7CisgICAgICAgIEFERE9QX0koYywgQlVJTERfQ09OU1RfS0VZX01BUCwgbGVuKTsKKyAgICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIFB5X0RFQ1JFRihuYW1lcyk7Ci0KLSAgICAvKiBXZSBqdXN0IGNoZWNrZWQgdGhhdCBsZW4gPD0gNjU1MzUsIHNlZSBhYm92ZSAqLwotICAgIHJldHVybiBQeV9TQUZFX0RPV05DQVNUKGxlbiArIDEsIFB5X3NzaXplX3QsIGludCk7CisgICAgZWxzZSB7CisgICAgICAgIFB5X0RFQ1JFRihuYW1lcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKIGVycm9yOgogICAgIFB5X0RFQ1JFRihuYW1lcyk7CkBAIC0xNjI1LDYgKzE2ODgsMzYgQEAKIH0KIAogc3RhdGljIGludAorY29tcGlsZXJfdmlzaXRfZGVmYXVsdHMoc3RydWN0IGNvbXBpbGVyICpjLCBhcmd1bWVudHNfdHkgYXJncykKK3sKKyAgICBWSVNJVF9TRVEoYywgZXhwciwgYXJncy0+ZGVmYXVsdHMpOworICAgIEFERE9QX0koYywgQlVJTERfVFVQTEUsIGFzZGxfc2VxX0xFTihhcmdzLT5kZWZhdWx0cykpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgUHlfc3NpemVfdAorY29tcGlsZXJfZGVmYXVsdF9hcmd1bWVudHMoc3RydWN0IGNvbXBpbGVyICpjLCBhcmd1bWVudHNfdHkgYXJncykKK3sKKyAgICBQeV9zc2l6ZV90IGZ1bmNmbGFncyA9IDA7CisgICAgaWYgKGFyZ3MtPmRlZmF1bHRzICYmIGFzZGxfc2VxX0xFTihhcmdzLT5kZWZhdWx0cykgPiAwKSB7CisgICAgICAgIGlmICghY29tcGlsZXJfdmlzaXRfZGVmYXVsdHMoYywgYXJncykpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGZ1bmNmbGFncyB8PSAweDAxOworICAgIH0KKyAgICBpZiAoYXJncy0+a3dvbmx5YXJncykgeworICAgICAgICBpbnQgcmVzID0gY29tcGlsZXJfdmlzaXRfa3dvbmx5ZGVmYXVsdHMoYywgYXJncy0+a3dvbmx5YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPmt3X2RlZmF1bHRzKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmVzID4gMCkgeworICAgICAgICAgICAgZnVuY2ZsYWdzIHw9IDB4MDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZ1bmNmbGFnczsKK30KKworc3RhdGljIGludAogY29tcGlsZXJfZnVuY3Rpb24oc3RydWN0IGNvbXBpbGVyICpjLCBzdG10X3R5IHMsIGludCBpc19hc3luYykKIHsKICAgICBQeUNvZGVPYmplY3QgKmNvOwpAQCAtMTYzNSwxMiArMTcyOCwxMSBAQAogICAgIGFzZGxfc2VxKiBkZWNvczsKICAgICBhc2RsX3NlcSAqYm9keTsKICAgICBzdG10X3R5IHN0OwotICAgIFB5X3NzaXplX3QgaSwgbiwgYXJnbGVuZ3RoOwotICAgIGludCBkb2NzdHJpbmcsIGt3X2RlZmF1bHRfY291bnQgPSAwOwotICAgIGludCBudW1fYW5ub3RhdGlvbnM7CisgICAgUHlfc3NpemVfdCBpLCBuLCBmdW5jZmxhZ3M7CisgICAgaW50IGRvY3N0cmluZzsKKyAgICBpbnQgYW5ub3RhdGlvbnM7CiAgICAgaW50IHNjb3BlX3R5cGU7CiAKLQogICAgIGlmIChpc19hc3luYykgewogICAgICAgICBhc3NlcnQocy0+a2luZCA9PSBBc3luY0Z1bmN0aW9uRGVmX2tpbmQpOwogCkBAIC0xNjY1LDMwICsxNzU3LDMyIEBACiAKICAgICBpZiAoIWNvbXBpbGVyX2RlY29yYXRvcnMoYywgZGVjb3MpKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoYXJncy0+ZGVmYXVsdHMpCi0gICAgICAgIFZJU0lUX1NFUShjLCBleHByLCBhcmdzLT5kZWZhdWx0cyk7Ci0gICAgaWYgKGFyZ3MtPmt3b25seWFyZ3MpIHsKLSAgICAgICAgaW50IHJlcyA9IGNvbXBpbGVyX3Zpc2l0X2t3b25seWRlZmF1bHRzKGMsIGFyZ3MtPmt3b25seWFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLT5rd19kZWZhdWx0cyk7Ci0gICAgICAgIGlmIChyZXMgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBrd19kZWZhdWx0X2NvdW50ID0gcmVzIC0gMTsKLSAgICB9Ci0gICAgbnVtX2Fubm90YXRpb25zID0gY29tcGlsZXJfdmlzaXRfYW5ub3RhdGlvbnMoYywgYXJncywgcmV0dXJucyk7Ci0gICAgaWYgKG51bV9hbm5vdGF0aW9ucyA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBudW1fYW5ub3RhdGlvbnMtLTsKLSAgICBhc3NlcnQoKG51bV9hbm5vdGF0aW9ucyAmIDB4RkZGRikgPT0gbnVtX2Fubm90YXRpb25zKTsKIAotICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlX3R5cGUsICh2b2lkICopcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVubykpCisgICAgZnVuY2ZsYWdzID0gY29tcGlsZXJfZGVmYXVsdF9hcmd1bWVudHMoYywgYXJncyk7CisgICAgaWYgKGZ1bmNmbGFncyA9PSAtMSkgewogICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhbm5vdGF0aW9ucyA9IGNvbXBpbGVyX3Zpc2l0X2Fubm90YXRpb25zKGMsIGFyZ3MsIHJldHVybnMpOworICAgIGlmIChhbm5vdGF0aW9ucyA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBlbHNlIGlmIChhbm5vdGF0aW9ucyA+IDApIHsKKyAgICAgICAgZnVuY2ZsYWdzIHw9IDB4MDQ7CisgICAgfQorCisgICAgaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBuYW1lLCBzY29wZV90eXBlLCAodm9pZCAqKXMsIHMtPmxpbmVubykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgc3QgPSAoc3RtdF90eSlhc2RsX3NlcV9HRVQoYm9keSwgMCk7CiAgICAgZG9jc3RyaW5nID0gY29tcGlsZXJfaXNkb2NzdHJpbmcoc3QpOwotICAgIGlmIChkb2NzdHJpbmcgJiYgYy0+Y19vcHRpbWl6ZSA8IDIpCi0gICAgICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5TdHIuczsKKyAgICBpZiAoZG9jc3RyaW5nICYmIGMtPmNfb3B0aW1pemUgPCAyKSB7CisgICAgICAgIGlmIChzdC0+di5FeHByLnZhbHVlLT5raW5kID09IENvbnN0YW50X2tpbmQpCisgICAgICAgICAgICBmaXJzdF9jb25zdCA9IHN0LT52LkV4cHIudmFsdWUtPnYuQ29uc3RhbnQudmFsdWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZpcnN0X2NvbnN0ID0gc3QtPnYuRXhwci52YWx1ZS0+di5TdHIuczsKKyAgICB9CiAgICAgaWYgKGNvbXBpbGVyX2FkZF9vKGMsIGMtPnUtPnVfY29uc3RzLCBmaXJzdF9jb25zdCkgPCAwKSAgICAgIHsKICAgICAgICAgY29tcGlsZXJfZXhpdF9zY29wZShjKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNzEyLDEyICsxODA2LDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgYXJnbGVuZ3RoID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKTsKLSAgICBhcmdsZW5ndGggfD0ga3dfZGVmYXVsdF9jb3VudCA8PCA4OwotICAgIGFyZ2xlbmd0aCB8PSBudW1fYW5ub3RhdGlvbnMgPDwgMTY7CiAgICAgaWYgKGlzX2FzeW5jKQogICAgICAgICBjby0+Y29fZmxhZ3MgfD0gQ09fQ09ST1VUSU5FOwotICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXJnbGVuZ3RoLCBxdWFsbmFtZSk7CisgICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBmdW5jZmxhZ3MsIHF1YWxuYW1lKTsKICAgICBQeV9ERUNSRUYocXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihjbyk7CiAKQEAgLTE4NzcsOCArMTk2OCw3IEBACiAgICAgUHlDb2RlT2JqZWN0ICpjbzsKICAgICBQeU9iamVjdCAqcXVhbG5hbWU7CiAgICAgc3RhdGljIGlkZW50aWZpZXIgbmFtZTsKLSAgICBpbnQga3dfZGVmYXVsdF9jb3VudCA9IDA7Ci0gICAgUHlfc3NpemVfdCBhcmdsZW5ndGg7CisgICAgUHlfc3NpemVfdCBmdW5jZmxhZ3M7CiAgICAgYXJndW1lbnRzX3R5IGFyZ3MgPSBlLT52LkxhbWJkYS5hcmdzOwogICAgIGFzc2VydChlLT5raW5kID09IExhbWJkYV9raW5kKTsKIApAQCAtMTg4OCwxNCArMTk3OCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKGFyZ3MtPmRlZmF1bHRzKQotICAgICAgICBWSVNJVF9TRVEoYywgZXhwciwgYXJncy0+ZGVmYXVsdHMpOwotICAgIGlmIChhcmdzLT5rd29ubHlhcmdzKSB7Ci0gICAgICAgIGludCByZXMgPSBjb21waWxlcl92aXNpdF9rd29ubHlkZWZhdWx0cyhjLCBhcmdzLT5rd29ubHlhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+a3dfZGVmYXVsdHMpOwotICAgICAgICBpZiAocmVzID09IDApIHJldHVybiAwOwotICAgICAgICBrd19kZWZhdWx0X2NvdW50ID0gcmVzIC0gMTsKKyAgICBmdW5jZmxhZ3MgPSBjb21waWxlcl9kZWZhdWx0X2FyZ3VtZW50cyhjLCBhcmdzKTsKKyAgICBpZiAoZnVuY2ZsYWdzID09IC0xKSB7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KKwogICAgIGlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbmFtZSwgQ09NUElMRVJfU0NPUEVfTEFNQkRBLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKillLCBlLT5saW5lbm8pKQogICAgICAgICByZXR1cm4gMDsKQEAgLTE5MjEsOSArMjAwOCw3IEBACiAgICAgaWYgKGNvID09IE5VTEwpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgYXJnbGVuZ3RoID0gYXNkbF9zZXFfTEVOKGFyZ3MtPmRlZmF1bHRzKTsKLSAgICBhcmdsZW5ndGggfD0ga3dfZGVmYXVsdF9jb3VudCA8PCA4OwotICAgIGNvbXBpbGVyX21ha2VfY2xvc3VyZShjLCBjbywgYXJnbGVuZ3RoLCBxdWFsbmFtZSk7CisgICAgY29tcGlsZXJfbWFrZV9jbG9zdXJlKGMsIGNvLCBmdW5jZmxhZ3MsIHF1YWxuYW1lKTsKICAgICBQeV9ERUNSRUYocXVhbG5hbWUpOwogICAgIFB5X0RFQ1JFRihjbyk7CiAKQEAgLTI1OTksNiArMjY4NCwyNSBAQAogfQogCiBzdGF0aWMgaW50Citjb21waWxlcl92aXNpdF9zdG10X2V4cHIoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IHZhbHVlKQoreworICAgIGlmIChjLT5jX2ludGVyYWN0aXZlICYmIGMtPmNfbmVzdGxldmVsIDw9IDEpIHsKKyAgICAgICAgVklTSVQoYywgZXhwciwgdmFsdWUpOworICAgICAgICBBRERPUChjLCBQUklOVF9FWFBSKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKGlzX2NvbnN0KHZhbHVlKSkgeworICAgICAgICAvKiBpZ25vcmUgY29uc3RhbnQgc3RhdGVtZW50ICovCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIFZJU0lUKGMsIGV4cHIsIHZhbHVlKTsKKyAgICBBRERPUChjLCBQT1BfVE9QKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAogY29tcGlsZXJfdmlzaXRfc3RtdChzdHJ1Y3QgY29tcGlsZXIgKmMsIHN0bXRfdHkgcykKIHsKICAgICBQeV9zc2l6ZV90IGksIG47CkBAIC0yNjY4LDE2ICsyNzcyLDcgQEAKICAgICBjYXNlIE5vbmxvY2FsX2tpbmQ6CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRXhwcl9raW5kOgotICAgICAgICBpZiAoYy0+Y19pbnRlcmFjdGl2ZSAmJiBjLT5jX25lc3RsZXZlbCA8PSAxKSB7Ci0gICAgICAgICAgICBWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOwotICAgICAgICAgICAgQURET1AoYywgUFJJTlRfRVhQUik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocy0+di5FeHByLnZhbHVlLT5raW5kICE9IFN0cl9raW5kICYmCi0gICAgICAgICAgICAgICAgIHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBOdW1fa2luZCkgewotICAgICAgICAgICAgVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKLSAgICAgICAgICAgIEFERE9QKGMsIFBPUF9UT1ApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gY29tcGlsZXJfdmlzaXRfc3RtdF9leHByKGMsIHMtPnYuRXhwci52YWx1ZSk7CiAgICAgY2FzZSBQYXNzX2tpbmQ6CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQnJlYWtfa2luZDoKQEAgLTMwNzksOSArMzE3NCw1MyBAQAogfQogCiBzdGF0aWMgaW50CithcmVfYWxsX2l0ZW1zX2NvbnN0KGFzZGxfc2VxICpzZXEsIFB5X3NzaXplX3QgYmVnaW4sIFB5X3NzaXplX3QgZW5kKQoreworICAgIFB5X3NzaXplX3QgaTsKKyAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgIGV4cHJfdHkga2V5ID0gKGV4cHJfdHkpYXNkbF9zZXFfR0VUKHNlcSwgaSk7CisgICAgICAgIGlmIChrZXkgPT0gTlVMTCB8fCAhaXNfY29uc3Qoa2V5KSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY29tcGlsZXJfc3ViZGljdChzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSwgUHlfc3NpemVfdCBiZWdpbiwgUHlfc3NpemVfdCBlbmQpCit7CisgICAgUHlfc3NpemVfdCBpLCBuID0gZW5kIC0gYmVnaW47CisgICAgUHlPYmplY3QgKmtleXMsICprZXk7CisgICAgaWYgKG4gPiAxICYmIGFyZV9hbGxfaXRlbXNfY29uc3QoZS0+di5EaWN0LmtleXMsIGJlZ2luLCBlbmQpKSB7CisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7CisgICAgICAgIH0KKyAgICAgICAga2V5cyA9IFB5VHVwbGVfTmV3KG4pOworICAgICAgICBpZiAoa2V5cyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSBiZWdpbjsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBrZXkgPSBnZXRfY29uc3RfdmFsdWUoKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC5rZXlzLCBpKSk7CisgICAgICAgICAgICBQeV9JTkNSRUYoa2V5KTsKKyAgICAgICAgICAgIFB5VHVwbGVfU0VUX0lURU0oa2V5cywgaSAtIGJlZ2luLCBrZXkpOworICAgICAgICB9CisgICAgICAgIEFERE9QX04oYywgTE9BRF9DT05TVCwga2V5cywgY29uc3RzKTsKKyAgICAgICAgQURET1BfSShjLCBCVUlMRF9DT05TVF9LRVlfTUFQLCBuKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkpOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwgKGV4cHJfdHkpYXNkbF9zZXFfR0VUKGUtPnYuRGljdC52YWx1ZXMsIGkpKTsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgbik7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50CiBjb21waWxlcl9kaWN0KHN0cnVjdCBjb21waWxlciAqYywgZXhwcl90eSBlKQogewotICAgIFB5X3NzaXplX3QgaSwgbiwgY29udGFpbmVycywgZWxlbWVudHM7CisgICAgUHlfc3NpemVfdCBpLCBuLCBlbGVtZW50czsKKyAgICBpbnQgY29udGFpbmVyczsKICAgICBpbnQgaXNfdW5wYWNraW5nID0gMDsKICAgICBuID0gYXNkbF9zZXFfTEVOKGUtPnYuRGljdC52YWx1ZXMpOwogICAgIGNvbnRhaW5lcnMgPSAwOwpAQCAtMzA4OSw3ICszMjI4LDggQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgIGlzX3VucGFja2luZyA9IChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3Qua2V5cywgaSkgPT0gTlVMTDsKICAgICAgICAgaWYgKGVsZW1lbnRzID09IDB4RkZGRiB8fCAoZWxlbWVudHMgJiYgaXNfdW5wYWNraW5nKSkgewotICAgICAgICAgICAgQURET1BfSShjLCBCVUlMRF9NQVAsIGVsZW1lbnRzKTsKKyAgICAgICAgICAgIGlmICghY29tcGlsZXJfc3ViZGljdChjLCBlLCBpIC0gZWxlbWVudHMsIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgY29udGFpbmVycysrOwogICAgICAgICAgICAgZWxlbWVudHMgPSAwOwogICAgICAgICB9CkBAIC0zMDk4LDEzICszMjM4LDEyIEBACiAgICAgICAgICAgICBjb250YWluZXJzKys7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBWSVNJVChjLCBleHByLCAoZXhwcl90eSlhc2RsX3NlcV9HRVQoZS0+di5EaWN0LmtleXMsIGkpKTsKLSAgICAgICAgICAgIFZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChlLT52LkRpY3QudmFsdWVzLCBpKSk7CiAgICAgICAgICAgICBlbGVtZW50cysrOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChlbGVtZW50cyB8fCBjb250YWluZXJzID09IDApIHsKLSAgICAgICAgQURET1BfSShjLCBCVUlMRF9NQVAsIGVsZW1lbnRzKTsKKyAgICAgICAgaWYgKCFjb21waWxlcl9zdWJkaWN0KGMsIGUsIG4gLSBlbGVtZW50cywgbikpCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgY29udGFpbmVycysrOwogICAgIH0KICAgICAvKiBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGRpY3QsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQgaW50byBhIG5ldwpAQCAtMzE3MywxNSArMzMxMiwxMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+di5DYWxsLmtleXdvcmRzKTsKIH0KIAorc3RhdGljIGludAorY29tcGlsZXJfam9pbmVkX3N0cihzdHJ1Y3QgY29tcGlsZXIgKmMsIGV4cHJfdHkgZSkKK3sKKyAgICAvKiBDb25jYXRlbmF0ZSBwYXJ0cyBvZiBhIHN0cmluZyB1c2luZyAnJy5qb2luKHBhcnRzKS4gVGhlcmUgYXJlCisgICAgICAgcHJvYmFibHkgYmV0dGVyIHdheXMgb2YgZG9pbmcgdGhpcy4KKworICAgICAgIFRoaXMgaXMgdXNlZCBmb3IgY29uc3RydWN0cyBsaWtlICIneD0nIGYnezQyfSciLCB3aGljaCBoYXZlIHRvCisgICAgICAgYmUgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZS4gKi8KKworICAgIHN0YXRpYyBQeU9iamVjdCAqZW1wdHlfc3RyaW5nOworICAgIHN0YXRpYyBQeU9iamVjdCAqam9pbl9zdHJpbmc7CisKKyAgICBpZiAoIWVtcHR5X3N0cmluZykgeworICAgICAgICBlbXB0eV9zdHJpbmcgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiIik7CisgICAgICAgIGlmICghZW1wdHlfc3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgham9pbl9zdHJpbmcpIHsKKyAgICAgICAgam9pbl9zdHJpbmcgPSBQeVVuaWNvZGVfRnJvbVN0cmluZygiam9pbiIpOworICAgICAgICBpZiAoIWpvaW5fc3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlbXB0eV9zdHJpbmcsIGNvbnN0cyk7CisgICAgQURET1BfTkFNRShjLCBMT0FEX0FUVFIsIGpvaW5fc3RyaW5nLCBuYW1lcyk7CisgICAgVklTSVRfU0VRKGMsIGV4cHIsIGUtPnYuSm9pbmVkU3RyLnZhbHVlcyk7CisgICAgQURET1BfSShjLCBCVUlMRF9MSVNULCBhc2RsX3NlcV9MRU4oZS0+di5Kb2luZWRTdHIudmFsdWVzKSk7CisgICAgQURET1BfSShjLCBDQUxMX0ZVTkNUSU9OLCAxKTsKKyAgICByZXR1cm4gMTsKK30KKworLyogVXNlZCB0byBpbXBsZW1lbnQgZi1zdHJpbmdzLiBGb3JtYXQgYSBzaW5nbGUgdmFsdWUuICovCitzdGF0aWMgaW50Citjb21waWxlcl9mb3JtYXR0ZWRfdmFsdWUoc3RydWN0IGNvbXBpbGVyICpjLCBleHByX3R5IGUpCit7CisgICAgLyogT3VyIG9wYXJnIGVuY29kZXMgMiBwaWVjZXMgb2YgaW5mb3JtYXRpb246IHRoZSBjb252ZXJzaW9uCisgICAgICAgY2hhcmFjdGVyLCBhbmQgd2hldGhlciBvciBub3QgYSBmb3JtYXRfc3BlYyB3YXMgcHJvdmlkZWQuCisKKyAgICAgICBDb252ZXJ0IHRoZSBjb252ZXJzaW9uIGNoYXIgdG8gMiBiaXRzOgorICAgICAgIE5vbmU6IDAwMCAgMHgwICBGVkNfTk9ORQorICAgICAgICFzICA6IDAwMSAgMHgxICBGVkNfU1RSCisgICAgICAgIXIgIDogMDEwICAweDIgIEZWQ19SRVBSCisgICAgICAgIWEgIDogMDExICAweDMgIEZWQ19BU0NJSQorCisgICAgICAgbmV4dCBiaXQgaXMgd2hldGhlciBvciBub3Qgd2UgaGF2ZSBhIGZvcm1hdCBzcGVjOgorICAgICAgIHllcyA6IDEwMCAgMHg0CisgICAgICAgbm8gIDogMDAwICAweDAKKyAgICAqLworCisgICAgaW50IG9wYXJnOworCisgICAgLyogRXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gdG8gYmUgZm9ybWF0dGVkLiAqLworICAgIFZJU0lUKGMsIGV4cHIsIGUtPnYuRm9ybWF0dGVkVmFsdWUudmFsdWUpOworCisgICAgc3dpdGNoIChlLT52LkZvcm1hdHRlZFZhbHVlLmNvbnZlcnNpb24pIHsKKyAgICBjYXNlICdzJzogb3BhcmcgPSBGVkNfU1RSOyAgIGJyZWFrOworICAgIGNhc2UgJ3InOiBvcGFyZyA9IEZWQ19SRVBSOyAgYnJlYWs7CisgICAgY2FzZSAnYSc6IG9wYXJnID0gRlZDX0FTQ0lJOyBicmVhazsKKyAgICBjYXNlIC0xOiAgb3BhcmcgPSBGVkNfTk9ORTsgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgY29udmVyc2lvbiBjaGFyYWN0ZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChlLT52LkZvcm1hdHRlZFZhbHVlLmZvcm1hdF9zcGVjKSB7CisgICAgICAgIC8qIEV2YWx1YXRlIHRoZSBmb3JtYXQgc3BlYywgYW5kIHVwZGF0ZSBvdXIgb3Bjb2RlIGFyZy4gKi8KKyAgICAgICAgVklTSVQoYywgZXhwciwgZS0+di5Gb3JtYXR0ZWRWYWx1ZS5mb3JtYXRfc3BlYyk7CisgICAgICAgIG9wYXJnIHw9IEZWU19IQVZFX1NQRUM7CisgICAgfQorCisgICAgLyogQW5kIHB1c2ggb3VyIG9wY29kZSBhbmQgb3BhcmcgKi8KKyAgICBBRERPUF9JKGMsIEZPUk1BVF9WQUxVRSwgb3BhcmcpOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50Citjb21waWxlcl9zdWJrd2FyZ3Moc3RydWN0IGNvbXBpbGVyICpjLCBhc2RsX3NlcSAqa2V5d29yZHMsIFB5X3NzaXplX3QgYmVnaW4sIFB5X3NzaXplX3QgZW5kKQoreworICAgIFB5X3NzaXplX3QgaSwgbiA9IGVuZCAtIGJlZ2luOworICAgIGtleXdvcmRfdHkga3c7CisgICAgUHlPYmplY3QgKmtleXMsICprZXk7CisgICAgYXNzZXJ0KG4gPiAwKTsKKyAgICBpZiAobiA+IDEpIHsKKyAgICAgICAgZm9yIChpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAga3cgPSBhc2RsX3NlcV9HRVQoa2V5d29yZHMsIGkpOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwga3ctPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBrZXlzID0gUHlUdXBsZV9OZXcobik7CisgICAgICAgIGlmIChrZXlzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgIGtleSA9ICgoa2V5d29yZF90eSkgYXNkbF9zZXFfR0VUKGtleXdvcmRzLCBpKSktPmFyZzsKKyAgICAgICAgICAgIFB5X0lOQ1JFRihrZXkpOworICAgICAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShrZXlzLCBpIC0gYmVnaW4sIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgQURET1BfTihjLCBMT0FEX0NPTlNULCBrZXlzLCBjb25zdHMpOworICAgICAgICBBRERPUF9JKGMsIEJVSUxEX0NPTlNUX0tFWV9NQVAsIG4pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogYSBmb3IgbG9vcCBvbmx5IGV4ZWN1dGVzIG9uY2UgKi8KKyAgICAgICAgZm9yIChpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAga3cgPSBhc2RsX3NlcV9HRVQoa2V5d29yZHMsIGkpOworICAgICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBrdy0+YXJnLCBjb25zdHMpOworICAgICAgICAgICAgVklTSVQoYywgZXhwciwga3ctPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgbik7CisgICAgfQorICAgIHJldHVybiAxOworfQorCiAvKiBzaGFyZWQgY29kZSBiZXR3ZWVuIGNvbXBpbGVyX2NhbGwgYW5kIGNvbXBpbGVyX2NsYXNzICovCiBzdGF0aWMgaW50CiBjb21waWxlcl9jYWxsX2hlbHBlcihzdHJ1Y3QgY29tcGlsZXIgKmMsCi0gICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG4sIC8qIEFyZ3MgYWxyZWFkeSBwdXNoZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgIGludCBuLCAvKiBBcmdzIGFscmVhZHkgcHVzaGVkICovCiAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYXJncywKICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICprZXl3b3JkcykKIHsKICAgICBpbnQgY29kZSA9IDA7Ci0gICAgUHlfc3NpemVfdCBuZWx0cywgaSwgbnNlZW4sIG5rdzsKKyAgICBQeV9zc2l6ZV90IG5lbHRzLCBpLCBuc2VlbjsKKyAgICBpbnQgbmt3OwogCiAgICAgLyogdGhlIG51bWJlciBvZiB0dXBsZXMgYW5kIGRpY3Rpb25hcmllcyBvbiB0aGUgc3RhY2sgKi8KICAgICBQeV9zc2l6ZV90IG5zdWJhcmdzID0gMCwgbnN1Ymt3YXJncyA9IDA7CkBAIC0zMjM4LDI5ICszNDg5LDM4IEBACiAgICAgICAgIGlmIChrdy0+YXJnID09IE5VTEwpIHsKICAgICAgICAgICAgIC8qIEEga2V5d29yZCBhcmd1bWVudCB1bnBhY2tpbmcuICovCiAgICAgICAgICAgICBpZiAobnNlZW4pIHsKLSAgICAgICAgICAgICAgICBBRERPUF9JKGMsIEJVSUxEX01BUCwgbnNlZW4pOworICAgICAgICAgICAgICAgIGlmIChuc3Via3dhcmdzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghY29tcGlsZXJfc3Via3dhcmdzKGMsIGtleXdvcmRzLCBpIC0gbnNlZW4sIGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIG5zdWJrd2FyZ3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5zZWVuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZJU0lUKGMsIGtleXdvcmQsIGFzZGxfc2VxX0dFVChrZXl3b3JkcywgaikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5rdyA9IG5zZWVuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuc2VlbiA9IDA7Ci0gICAgICAgICAgICAgICAgbnN1Ymt3YXJncysrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgVklTSVQoYywgZXhwciwga3ctPnZhbHVlKTsKICAgICAgICAgICAgIG5zdWJrd2FyZ3MrKzsKICAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChuc3Via3dhcmdzKSB7Ci0gICAgICAgICAgICAvKiBBIGtleXdvcmQgYXJndW1lbnQgYW5kIHdlIGFscmVhZHkgaGF2ZSBhIGRpY3QuICovCi0gICAgICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGt3LT5hcmcsIGNvbnN0cyk7Ci0gICAgICAgICAgICBWSVNJVChjLCBleHByLCBrdy0+dmFsdWUpOwotICAgICAgICAgICAgbnNlZW4rKzsKLSAgICAgICAgfQogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIGtleXdvcmQgYXJndW1lbnQgKi8KLSAgICAgICAgICAgIFZJU0lUKGMsIGtleXdvcmQsIGt3KQotICAgICAgICAgICAgbmt3Kys7CisgICAgICAgICAgICBuc2VlbisrOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChuc2VlbikgewotICAgICAgICAvKiBQYWNrIHVwIGFueSB0cmFpbGluZyBrZXl3b3JkIGFyZ3VtZW50cy4gKi8KLSAgICAgICAgQURET1BfSShjLCBCVUlMRF9NQVAsIG5zZWVuKTsKLSAgICAgICAgbnN1Ymt3YXJncysrOworICAgICAgICBpZiAobnN1Ymt3YXJncykgeworICAgICAgICAgICAgLyogUGFjayB1cCBhbnkgdHJhaWxpbmcga2V5d29yZCBhcmd1bWVudHMuICovCisgICAgICAgICAgICBpZiAoIWNvbXBpbGVyX3N1Ymt3YXJncyhjLCBrZXl3b3JkcywgbmVsdHMgLSBuc2VlbiwgbmVsdHMpKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgbnN1Ymt3YXJncysrOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgVklTSVRfU0VRKGMsIGtleXdvcmQsIGtleXdvcmRzKTsKKyAgICAgICAgICAgIG5rdyA9IG5zZWVuOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChuc3Via3dhcmdzKSB7CiAgICAgICAgIGNvZGUgfD0gMjsKQEAgLTM1NDksNiArMzgwOSw4IEBACiAgICAgc3dpdGNoIChlLT5raW5kKSB7CiAgICAgY2FzZSBFbGxpcHNpc19raW5kOgogICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIENvbnN0YW50X2tpbmQ6CisgICAgICAgIHJldHVybiBQeU9iamVjdF9Jc1RydWUoZS0+di5Db25zdGFudC52YWx1ZSk7CiAgICAgY2FzZSBOdW1fa2luZDoKICAgICAgICAgcmV0dXJuIFB5T2JqZWN0X0lzVHJ1ZShlLT52Lk51bS5uKTsKICAgICBjYXNlIFN0cl9raW5kOgpAQCAtMzU5Miw5ICszODU0LDkgQEAKICAgICAgICBCTE9DSwogICAgZmluYWxseToKICAgICAgICBpZiBhbiBleGNlcHRpb24gd2FzIHJhaXNlZDoKLSAgICAgICBleGMgPSBjb3B5IG9mIChleGNlcHRpb24sIGluc3RhbmNlLCB0cmFjZWJhY2spCisgICAgICAgICAgIGV4YyA9IGNvcHkgb2YgKGV4Y2VwdGlvbiwgaW5zdGFuY2UsIHRyYWNlYmFjaykKICAgICAgICBlbHNlOgotICAgICAgIGV4YyA9IChOb25lLCBOb25lLCBOb25lKQorICAgICAgICAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKICAgICAgICBpZiBub3QgKGF3YWl0IGV4aXQoKmV4YykpOgogICAgICAgICAgICByYWlzZQogICovCkBAIC0zODM2LDEyICs0MDk4LDE5IEBACiAgICAgICAgIHJldHVybiBjb21waWxlcl9jb21wYXJlKGMsIGUpOwogICAgIGNhc2UgQ2FsbF9raW5kOgogICAgICAgICByZXR1cm4gY29tcGlsZXJfY2FsbChjLCBlKTsKKyAgICBjYXNlIENvbnN0YW50X2tpbmQ6CisgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5Db25zdGFudC52YWx1ZSwgY29uc3RzKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBOdW1fa2luZDoKICAgICAgICAgQURET1BfTyhjLCBMT0FEX0NPTlNULCBlLT52Lk51bS5uLCBjb25zdHMpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFN0cl9raW5kOgogICAgICAgICBBRERPUF9PKGMsIExPQURfQ09OU1QsIGUtPnYuU3RyLnMsIGNvbnN0cyk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgSm9pbmVkU3RyX2tpbmQ6CisgICAgICAgIHJldHVybiBjb21waWxlcl9qb2luZWRfc3RyKGMsIGUpOworICAgIGNhc2UgRm9ybWF0dGVkVmFsdWVfa2luZDoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVyX2Zvcm1hdHRlZF92YWx1ZShjLCBlKTsKICAgICBjYXNlIEJ5dGVzX2tpbmQ6CiAgICAgICAgIEFERE9QX08oYywgTE9BRF9DT05TVCwgZS0+di5CeXRlcy5zLCBjb25zdHMpOwogICAgICAgICBicmVhazsKQEAgLTQyOTUsMTggKzQ1NjQsNiBAQAogICAgICAgICBQeU9iamVjdF9GcmVlKGEtPmFfcG9zdG9yZGVyKTsKIH0KIAotLyogUmV0dXJuIHRoZSBzaXplIG9mIGEgYmFzaWMgYmxvY2sgaW4gYnl0ZXMuICovCi0KLXN0YXRpYyBpbnQKLWluc3Ryc2l6ZShzdHJ1Y3QgaW5zdHIgKmluc3RyKQotewotICAgIGlmICghaW5zdHItPmlfaGFzYXJnKQotICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAvKiAxIGJ5dGUgZm9yIHRoZSBvcGNvZGUqLwotICAgIGlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKLSAgICAgICAgcmV0dXJuIDY7ICAgICAgICAgICAgICAgLyogMSAob3Bjb2RlKSArIDEgKEVYVEVOREVEX0FSRyBvcGNvZGUpICsgMiAob3BhcmcpICsgMihvcGFyZyBleHRlbmRlZCkgKi8KLSAgICByZXR1cm4gMzsgICAgICAgICAgICAgICAgICAgLyogMSAob3Bjb2RlKSArIDIgKG9wYXJnKSAqLwotfQotCiBzdGF0aWMgaW50CiBibG9ja3NpemUoYmFzaWNibG9jayAqYikKIHsKQEAgLTQzMTQsNyArNDU3MSw3IEBACiAgICAgaW50IHNpemUgPSAwOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGItPmJfaXVzZWQ7IGkrKykKLSAgICAgICAgc2l6ZSArPSBpbnN0cnNpemUoJmItPmJfaW5zdHJbaV0pOworICAgICAgICBzaXplICs9IGluc3Ryc2l6ZShiLT5iX2luc3RyW2ldLmlfb3BhcmcpOwogICAgIHJldHVybiBzaXplOwogfQogCkBAIC00MzMzLDcgKzQ1OTAsNiBAQAogICAgIGRfbGluZW5vID0gaS0+aV9saW5lbm8gLSBhLT5hX2xpbmVubzsKIAogICAgIGFzc2VydChkX2J5dGVjb2RlID49IDApOwotICAgIGFzc2VydChkX2xpbmVubyA+PSAwKTsKIAogICAgIGlmKGRfYnl0ZWNvZGUgPT0gMCAmJiBkX2xpbmVubyA9PSAwKQogICAgICAgICByZXR1cm4gMTsKQEAgLTQzNjMsOSArNDYxOSwyMSBAQAogICAgICAgICBkX2J5dGVjb2RlIC09IG5jb2RlcyAqIDI1NTsKICAgICAgICAgYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7CiAgICAgfQotICAgIGFzc2VydChkX2J5dGVjb2RlIDw9IDI1NSk7Ci0gICAgaWYgKGRfbGluZW5vID4gMjU1KSB7Ci0gICAgICAgIGludCBqLCBuYnl0ZXMsIG5jb2RlcyA9IGRfbGluZW5vIC8gMjU1OworICAgIGFzc2VydCgwIDw9IGRfYnl0ZWNvZGUgJiYgZF9ieXRlY29kZSA8PSAyNTUpOworCisgICAgaWYgKGRfbGluZW5vIDwgLTEyOCB8fCAxMjcgPCBkX2xpbmVubykgeworICAgICAgICBpbnQgaiwgbmJ5dGVzLCBuY29kZXMsIGs7CisgICAgICAgIGlmIChkX2xpbmVubyA8IDApIHsKKyAgICAgICAgICAgIGsgPSAtMTI4OworICAgICAgICAgICAgLyogdXNlIGRpdmlzaW9uIG9uIHBvc2l0aXZlIG51bWJlcnMgKi8KKyAgICAgICAgICAgIG5jb2RlcyA9ICgtZF9saW5lbm8pIC8gMTI4OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgayA9IDEyNzsKKyAgICAgICAgICAgIG5jb2RlcyA9IGRfbGluZW5vIC8gMTI3OworICAgICAgICB9CisgICAgICAgIGRfbGluZW5vIC09IG5jb2RlcyAqIGs7CisgICAgICAgIGFzc2VydChuY29kZXMgPj0gMSk7CiAgICAgICAgIG5ieXRlcyA9IGEtPmFfbG5vdGFiX29mZiArIDIgKiBuY29kZXM7CiAgICAgICAgIGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoYS0+YV9sbm90YWIpOwogICAgICAgICBpZiAobmJ5dGVzID49IGxlbikgewpAQCAtNDM4MywxNSArNDY1MSwxNSBAQAogICAgICAgICBsbm90YWIgPSAodW5zaWduZWQgY2hhciAqKQogICAgICAgICAgICAgICAgICAgIFB5Qnl0ZXNfQVNfU1RSSU5HKGEtPmFfbG5vdGFiKSArIGEtPmFfbG5vdGFiX29mZjsKICAgICAgICAgKmxub3RhYisrID0gZF9ieXRlY29kZTsKLSAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICAqbG5vdGFiKysgPSBrOwogICAgICAgICBkX2J5dGVjb2RlID0gMDsKICAgICAgICAgZm9yIChqID0gMTsgaiA8IG5jb2RlczsgaisrKSB7CiAgICAgICAgICAgICAqbG5vdGFiKysgPSAwOwotICAgICAgICAgICAgKmxub3RhYisrID0gMjU1OworICAgICAgICAgICAgKmxub3RhYisrID0gazsKICAgICAgICAgfQotICAgICAgICBkX2xpbmVubyAtPSBuY29kZXMgKiAyNTU7CiAgICAgICAgIGEtPmFfbG5vdGFiX29mZiArPSBuY29kZXMgKiAyOwogICAgIH0KKyAgICBhc3NlcnQoLTEyOCA8PSBkX2xpbmVubyAmJiBkX2xpbmVubyA8PSAxMjcpOwogCiAgICAgbGVuID0gUHlCeXRlc19HRVRfU0laRShhLT5hX2xub3RhYik7CiAgICAgaWYgKGEtPmFfbG5vdGFiX29mZiArIDIgPj0gbGVuKSB7CkBAIC00NDIzLDE1ICs0NjkxLDEyIEBACiBzdGF0aWMgaW50CiBhc3NlbWJsZV9lbWl0KHN0cnVjdCBhc3NlbWJsZXIgKmEsIHN0cnVjdCBpbnN0ciAqaSkKIHsKLSAgICBpbnQgc2l6ZSwgYXJnID0gMCwgZXh0ID0gMDsKKyAgICBpbnQgc2l6ZSwgYXJnID0gMDsKICAgICBQeV9zc2l6ZV90IGxlbiA9IFB5Qnl0ZXNfR0VUX1NJWkUoYS0+YV9ieXRlY29kZSk7CiAgICAgY2hhciAqY29kZTsKIAotICAgIHNpemUgPSBpbnN0cnNpemUoaSk7Ci0gICAgaWYgKGktPmlfaGFzYXJnKSB7Ci0gICAgICAgIGFyZyA9IGktPmlfb3Bhcmc7Ci0gICAgICAgIGV4dCA9IGFyZyA+PiAxNjsKLSAgICB9CisgICAgYXJnID0gaS0+aV9vcGFyZzsKKyAgICBzaXplID0gaW5zdHJzaXplKGFyZyk7CiAgICAgaWYgKGktPmlfbGluZW5vICYmICFhc3NlbWJsZV9sbm90YWIoYSwgaSkpCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmIChhLT5hX29mZnNldCArIHNpemUgPj0gbGVuKSB7CkBAIC00NDQyLDE5ICs0NzA3LDcgQEAKICAgICB9CiAgICAgY29kZSA9IFB5Qnl0ZXNfQVNfU1RSSU5HKGEtPmFfYnl0ZWNvZGUpICsgYS0+YV9vZmZzZXQ7CiAgICAgYS0+YV9vZmZzZXQgKz0gc2l6ZTsKLSAgICBpZiAoc2l6ZSA9PSA2KSB7Ci0gICAgICAgIGFzc2VydChpLT5pX2hhc2FyZyk7Ci0gICAgICAgICpjb2RlKysgPSAoY2hhcilFWFRFTkRFRF9BUkc7Ci0gICAgICAgICpjb2RlKysgPSBleHQgJiAweGZmOwotICAgICAgICAqY29kZSsrID0gZXh0ID4+IDg7Ci0gICAgICAgIGFyZyAmPSAweGZmZmY7Ci0gICAgfQotICAgICpjb2RlKysgPSBpLT5pX29wY29kZTsKLSAgICBpZiAoaS0+aV9oYXNhcmcpIHsKLSAgICAgICAgYXNzZXJ0KHNpemUgPT0gMyB8fCBzaXplID09IDYpOwotICAgICAgICAqY29kZSsrID0gYXJnICYgMHhmZjsKLSAgICAgICAgKmNvZGUrKyA9IGFyZyA+PiA4OwotICAgIH0KKyAgICB3cml0ZV9vcF9hcmcoKHVuc2lnbmVkIGNoYXIqKWNvZGUsIGktPmlfb3Bjb2RlLCBhcmcsIHNpemUpOwogICAgIHJldHVybiAxOwogfQogCkBAIC00NDYyLDcgKzQ3MTUsNyBAQAogYXNzZW1ibGVfanVtcF9vZmZzZXRzKHN0cnVjdCBhc3NlbWJsZXIgKmEsIHN0cnVjdCBjb21waWxlciAqYykKIHsKICAgICBiYXNpY2Jsb2NrICpiOwotICAgIGludCBic2l6ZSwgdG90c2l6ZSwgZXh0ZW5kZWRfYXJnX2NvdW50ID0gMCwgbGFzdF9leHRlbmRlZF9hcmdfY291bnQ7CisgICAgaW50IGJzaXplLCB0b3RzaXplLCBleHRlbmRlZF9hcmdfcmVjb21waWxlOwogICAgIGludCBpOwogCiAgICAgLyogQ29tcHV0ZSB0aGUgc2l6ZSBvZiBlYWNoIGJsb2NrIGFuZCBmaXh1cCBqdW1wIGFyZ3MuCkBAIC00NDc1LDI3ICs0NzI4LDI2IEBACiAgICAgICAgICAgICBiLT5iX29mZnNldCA9IHRvdHNpemU7CiAgICAgICAgICAgICB0b3RzaXplICs9IGJzaXplOwogICAgICAgICB9Ci0gICAgICAgIGxhc3RfZXh0ZW5kZWRfYXJnX2NvdW50ID0gZXh0ZW5kZWRfYXJnX2NvdW50OwotICAgICAgICBleHRlbmRlZF9hcmdfY291bnQgPSAwOworICAgICAgICBleHRlbmRlZF9hcmdfcmVjb21waWxlID0gMDsKICAgICAgICAgZm9yIChiID0gYy0+dS0+dV9ibG9ja3M7IGIgIT0gTlVMTDsgYiA9IGItPmJfbGlzdCkgewogICAgICAgICAgICAgYnNpemUgPSBiLT5iX29mZnNldDsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiLT5iX2l1c2VkOyBpKyspIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5zdHIgKmluc3RyID0gJmItPmJfaW5zdHJbaV07CisgICAgICAgICAgICAgICAgaW50IGlzaXplID0gaW5zdHJzaXplKGluc3RyLT5pX29wYXJnKTsKICAgICAgICAgICAgICAgICAvKiBSZWxhdGl2ZSBqdW1wcyBhcmUgY29tcHV0ZWQgcmVsYXRpdmUgdG8KICAgICAgICAgICAgICAgICAgICB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciBhZnRlciBmZXRjaGluZwogICAgICAgICAgICAgICAgICAgIHRoZSBqdW1wIGluc3RydWN0aW9uLgogICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYnNpemUgKz0gaW5zdHJzaXplKGluc3RyKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5zdHItPmlfamFicykKKyAgICAgICAgICAgICAgICBic2l6ZSArPSBpc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdHItPmlfamFicyB8fCBpbnN0ci0+aV9qcmVsKSB7CiAgICAgICAgICAgICAgICAgICAgIGluc3RyLT5pX29wYXJnID0gaW5zdHItPmlfdGFyZ2V0LT5iX29mZnNldDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnN0ci0+aV9qcmVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGluc3RyLT5pX3RhcmdldC0+Yl9vZmZzZXQgLSBic2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaW5zdHItPmlfb3BhcmcgPSBkZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RyLT5pX2pyZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RyLT5pX29wYXJnIC09IGJzaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnNpemUoaW5zdHItPmlfb3BhcmcpICE9IGlzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRlZF9hcmdfcmVjb21waWxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChpbnN0ci0+aV9vcGFyZyA+IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnX2NvdW50Kys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDUwNSw3ICs0NzU3LDcgQEAKIAogICAgICAgICBUaGUgaXNzdWUgaXMgdGhhdCBpbiB0aGUgZmlyc3QgbG9vcCBibG9ja3NpemUoKSBpcyBjYWxsZWQKICAgICAgICAgd2hpY2ggY2FsbHMgaW5zdHJzaXplKCkgd2hpY2ggcmVxdWlyZXMgaV9vcGFyZyBiZSBzZXQKLSAgICAgICAgYXBwcm9wcmlhdGVseS4gICAgICAgICAgVGhlcmUgaXMgYSBib290c3RyYXAgcHJvYmxlbSBiZWNhdXNlCisgICAgICAgIGFwcHJvcHJpYXRlbHkuIFRoZXJlIGlzIGEgYm9vdHN0cmFwIHByb2JsZW0gYmVjYXVzZQogICAgICAgICBpX29wYXJnIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIHNlY29uZCBsb29wIGFib3ZlLgogCiAgICAgICAgIFNvIHdlIGxvb3AgdW50aWwgd2Ugc3RvcCBzZWVpbmcgbmV3IEVYVEVOREVEX0FSR3MuCkBAIC00NTEzLDcgKzQ3NjUsNyBAQAogICAgICAgICBvbmVzIGluIGp1bXAgaW5zdHJ1Y3Rpb25zLiAgU28gdGhpcyBzaG91bGQgY29udmVyZ2UKICAgICAgICAgZmFpcmx5IHF1aWNrbHkuCiAgICAgKi8KLSAgICB9IHdoaWxlIChsYXN0X2V4dGVuZGVkX2FyZ19jb3VudCAhPSBleHRlbmRlZF9hcmdfY291bnQpOworICAgIH0gd2hpbGUgKGV4dGVuZGVkX2FyZ19yZWNvbXBpbGUpOwogfQogCiBzdGF0aWMgUHlPYmplY3QgKgpAQCAtNDY1OSw5ICs0OTExLDkgQEAKICAgICBjaGFyIGFyZ1sxMjhdOwogCiAgICAgKmFyZyA9ICdcMCc7Ci0gICAgaWYgKGktPmlfaGFzYXJnKQorICAgIGlmIChIQVNfQVJHKGktPmlfb3Bjb2RlKSkgewogICAgICAgICBzcHJpbnRmKGFyZywgImFyZzogJWQgIiwgaS0+aV9vcGFyZyk7Ci0KKyAgICB9CiAgICAgZnByaW50ZihzdGRlcnIsICJsaW5lOiAlZCwgb3Bjb2RlOiAlZCAlcyVzJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIGktPmlfbGluZW5vLCBpLT5pX29wY29kZSwgYXJnLCBqYWJzLCBqcmVsKTsKIH0KQEAgLTQ3NDksNCArNTAwMSwzIEBACiB7CiAgICAgcmV0dXJuIFB5QVNUX0NvbXBpbGVFeChtb2QsIGZpbGVuYW1lLCBmbGFncywgLTEsIGFyZW5hKTsKIH0KLQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R0b2EuYyBiL1B5dGhvbi9kdG9hLmMKaW5kZXggM2RhNTQ2ZS4uZTA2NjViNiAxMDA2NDQKLS0tIGEvUHl0aG9uL2R0b2EuYworKysgYi9QeXRob24vZHRvYS5jCkBAIC03NDcsNyArNzQ3LDcgQEAKIHsKICAgICBCaWdpbnQgKmIxLCAqcDUsICpwNTE7CiAgICAgaW50IGk7Ci0gICAgc3RhdGljIGludCBwMDVbM10gPSB7IDUsIDI1LCAxMjUgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHAwNVszXSA9IHsgNSwgMjUsIDEyNSB9OwogCiAgICAgaWYgKChpID0gayAmIDMpKSB7CiAgICAgICAgIGIgPSBtdWx0YWRkKGIsIHAwNVtpLTFdLCAwKTsKQEAgLTgwMyw3ICs4MDMsNyBAQAogewogICAgIEJpZ2ludCAqYjEsICpwNSwgKnA1MTsKICAgICBpbnQgaTsKLSAgICBzdGF0aWMgaW50IHAwNVszXSA9IHsgNSwgMjUsIDEyNSB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgcDA1WzNdID0geyA1LCAyNSwgMTI1IH07CiAKICAgICBpZiAoKGkgPSBrICYgMykpIHsKICAgICAgICAgYiA9IG11bHRhZGQoYiwgcDA1W2ktMV0sIDApOwpAQCAtMjMxNSw3ICsyMzE1LDcgQEAKIH0KIAogc3RhdGljIGNoYXIgKgotbnJ2X2FsbG9jKGNoYXIgKnMsIGNoYXIgKipydmUsIGludCBuKQorbnJ2X2FsbG9jKGNvbnN0IGNoYXIgKnMsIGNoYXIgKipydmUsIGludCBuKQogewogICAgIGNoYXIgKnJ2LCAqdDsKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfd2luLmMgYi9QeXRob24vZHlubG9hZF93aW4uYwppbmRleCBmMmM3OTZlLi4wNTA1MGNmIDEwMDY0NAotLS0gYS9QeXRob24vZHlubG9hZF93aW4uYworKysgYi9QeXRob24vZHlubG9hZF93aW4uYwpAQCAtMjQsMTIgKzI0LDEwIEBACiAjZGVmaW5lIFBZRF9ERUJVR19TVUZGSVggIiIKICNlbmRpZgogCi0jZGVmaW5lIFNUUklOR0laRTIoeCkgI3gKLSNkZWZpbmUgU1RSSU5HSVpFKHgpIFNUUklOR0laRTIoeCkKICNpZmRlZiBQWURfUExBVEZPUk1fVEFHCi0jZGVmaW5lIFBZRF9UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5jcCIgU1RSSU5HSVpFKFBZX01BSk9SX1ZFUlNJT04pIFNUUklOR0laRShQWV9NSU5PUl9WRVJTSU9OKSAiLSIgUFlEX1BMQVRGT1JNX1RBRyAiLnB5ZCIKKyNkZWZpbmUgUFlEX1RBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLmNwIiBQeV9TVFJJTkdJRlkoUFlfTUFKT1JfVkVSU0lPTikgUHlfU1RSSU5HSUZZKFBZX01JTk9SX1ZFUlNJT04pICItIiBQWURfUExBVEZPUk1fVEFHICIucHlkIgogI2Vsc2UKLSNkZWZpbmUgUFlEX1RBR0dFRF9TVUZGSVggUFlEX0RFQlVHX1NVRkZJWCAiLmNwIiBTVFJJTkdJWkUoUFlfTUFKT1JfVkVSU0lPTikgU1RSSU5HSVpFKFBZX01JTk9SX1ZFUlNJT04pICIucHlkIgorI2RlZmluZSBQWURfVEFHR0VEX1NVRkZJWCBQWURfREVCVUdfU1VGRklYICIuY3AiIFB5X1NUUklOR0lGWShQWV9NQUpPUl9WRVJTSU9OKSBQeV9TVFJJTkdJRlkoUFlfTUlOT1JfVkVSU0lPTikgIi5weWQiCiAjZW5kaWYKIAogI2RlZmluZSBQWURfVU5UQUdHRURfU1VGRklYIFBZRF9ERUJVR19TVUZGSVggIi5weWQiCkBAIC00Myw3ICs0MSw3IEBACiAvKiBDYXNlIGluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJlLCB0byBhdm9pZCBhbnkgZGVwZW5kZW5jaWVzIG9uIHBhcnRpY3VsYXIKICAgIEMgUlRMIGltcGxlbWVudGF0aW9ucyAqLwogCi1zdGF0aWMgaW50IHN0cmNhc2VjbXAgKGNoYXIgKnN0cmluZzEsIGNoYXIgKnN0cmluZzIpCitzdGF0aWMgaW50IHN0cmNhc2VjbXAgKGNvbnN0IGNoYXIgKnN0cmluZzEsIGNvbnN0IGNoYXIgKnN0cmluZzIpCiB7CiAgICAgaW50IGZpcnN0LCBzZWNvbmQ7CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9maWxldXRpbHMuYyBiL1B5dGhvbi9maWxldXRpbHMuYwppbmRleCAyM2VlZDcxLi4wNjUzMWQ5IDEwMDY0NAotLS0gYS9QeXRob24vZmlsZXV0aWxzLmMKKysrIGIvUHl0aG9uL2ZpbGV1dGlscy5jCkBAIC02ODMsNiArNjgzLDEwIEBACiB7CiAgICAgaW50IHJlczsKIAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgYXNzZXJ0KFB5R0lMU3RhdGVfQ2hlY2soKSk7CisjZW5kaWYKKwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICByZXMgPSBfUHlfZnN0YXRfbm9yYWlzZShmZCwgc3RhdHVzKTsKICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwpAQCAtNzk0LDcgKzc5OCw3IEBACiAgICAgaW50IHJlcXVlc3Q7CiAgICAgaW50IGVycjsKICNlbmRpZgotICAgIGludCBmbGFnczsKKyAgICBpbnQgZmxhZ3MsIG5ld19mbGFnczsKICAgICBpbnQgcmVzOwogI2VuZGlmCiAKQEAgLTg4NSwxMCArODg5LDE4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoaW5oZXJpdGFibGUpCi0gICAgICAgIGZsYWdzICY9IH5GRF9DTE9FWEVDOwotICAgIGVsc2UKLSAgICAgICAgZmxhZ3MgfD0gRkRfQ0xPRVhFQzsKKyAgICBpZiAoaW5oZXJpdGFibGUpIHsKKyAgICAgICAgbmV3X2ZsYWdzID0gZmxhZ3MgJiB+RkRfQ0xPRVhFQzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG5ld19mbGFncyA9IGZsYWdzIHwgRkRfQ0xPRVhFQzsKKyAgICB9CisKKyAgICBpZiAobmV3X2ZsYWdzID09IGZsYWdzKSB7CisgICAgICAgIC8qIEZEX0NMT0VYRUMgZmxhZyBhbHJlYWR5IHNldC9jbGVhcmVkOiBub3RoaW5nIHRvIGRvICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIHJlcyA9IGZjbnRsKGZkLCBGX1NFVEZELCBmbGFncyk7CiAgICAgaWYgKHJlcyA8IDApIHsKICAgICAgICAgaWYgKHJhaXNlKQpAQCAtMTE2OSw2ICsxMTgxLDEwIEBACiAgICAgaW50IGVycjsKICAgICBpbnQgYXN5bmNfZXJyID0gMDsKIAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgYXNzZXJ0KFB5R0lMU3RhdGVfQ2hlY2soKSk7CisjZW5kaWYKKwogICAgIC8qIF9QeV9yZWFkKCkgbXVzdCBub3QgYmUgY2FsbGVkIHdpdGggYW4gZXhjZXB0aW9uIHNldCwgb3RoZXJ3aXNlIHRoZQogICAgICAqIGNhbGxlciBtYXkgdGhpbmsgdGhhdCByZWFkKCkgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIGFuZCB0aGUgc2lnbmFsCiAgICAgICogaGFuZGxlciByYWlzZWQgYW4gZXhjZXB0aW9uLiAqLwpAQCAtMTMyNCw2ICsxMzQwLDEwIEBACiBQeV9zc2l6ZV90CiBfUHlfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKIHsKKyNpZmRlZiBXSVRIX1RIUkVBRAorICAgIGFzc2VydChQeUdJTFN0YXRlX0NoZWNrKCkpOworI2VuZGlmCisKICAgICAvKiBfUHlfd3JpdGUoKSBtdXN0IG5vdCBiZSBjYWxsZWQgd2l0aCBhbiBleGNlcHRpb24gc2V0LCBvdGhlcndpc2UgdGhlCiAgICAgICogY2FsbGVyIG1heSB0aGluayB0aGF0IHdyaXRlKCkgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIGFuZCB0aGUgc2lnbmFsCiAgICAgICogaGFuZGxlciByYWlzZWQgYW4gZXhjZXB0aW9uLiAqLwpAQCAtMTQ3Myw2ICsxNDkzLDEwIEBACiAgICAgRFdPUkQgZnR5cGU7CiAjZW5kaWYKIAorI2lmZGVmIFdJVEhfVEhSRUFECisgICAgYXNzZXJ0KFB5R0lMU3RhdGVfQ2hlY2soKSk7CisjZW5kaWYKKwogICAgIGlmICghX1B5VmVyaWZ5X2ZkKGZkKSkgewogICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfT1NFcnJvcik7CiAgICAgICAgIHJldHVybiAtMTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5jIGIvUHl0aG9uL2Zvcm1hdHRlcl91bmljb2RlLmMKaW5kZXggOGU5YzUwMi4uZDU3MzI4OCAxMDA2NDQKLS0tIGEvUHl0aG9uL2Zvcm1hdHRlcl91bmljb2RlLmMKKysrIGIvUHl0aG9uL2Zvcm1hdHRlcl91bmljb2RlLmMKQEAgLTY1Niw3ICs2NTYsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgY2hhciBub19ncm91cGluZ1sxXSA9IHtDSEFSX01BWH07CitzdGF0aWMgY29uc3QgY2hhciBub19ncm91cGluZ1sxXSA9IHtDSEFSX01BWH07CiAKIC8qIEZpbmQgdGhlIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyKHM/KSwgdGhvdXNhbmRzX3NlcGFyYXRvcihzPyksIGFuZAogICAgZ3JvdXBpbmcgZGVzY3JpcHRpb24sIGVpdGhlciBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlIGlmIHR5cGUgaXMKZGlmZiAtLWdpdCBhL1B5dGhvbi9mcm96ZW4uYyBiL1B5dGhvbi9mcm96ZW4uYwppbmRleCA2NzZmMzk1Li43ZTA0ZjNjIDEwMDY0NAotLS0gYS9QeXRob24vZnJvemVuLmMKKysrIGIvUHl0aG9uL2Zyb3plbi5jCkBAIC0xNCwxNyArMTQsMTUgQEAKICAgIHRoZSBhcHByb3ByaWF0ZSBieXRlcyBmcm9tIE1fX19tYWluX18uYy4gKi8KIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgTV9fX2hlbGxvX19bXSA9IHsKLSAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDY0LDAsMCwwLDExNSwyMCwwLDAsMCwxMDAsMiwwLDkwLDEsMCwKLSAgICAxMDEsMiwwLDEwMCwwLDAsMTMxLDEsMCwxLDEwMCwxLDAsODMsNDAsMywKLSAgICAwLDAsMCwxMTcsMTIsMCwwLDAsNzIsMTAxLDEwOCwxMDgsMTExLDMyLDExOSwxMTEsCi0gICAgMTE0LDEwOCwxMDAsMzMsNzgsODQsNDAsMywwLDAsMCwxMTcsNCwwLDAsMCwKLSAgICA4NCwxMTQsMTE3LDEwMSwxMTcsMTEsMCwwLDAsMTA1LDExMCwxMDUsMTE2LDEwNSw5NywxMDgsCi0gICAgMTA1LDEyMiwxMDEsMTAwLDExNyw1LDAsMCwwLDExMiwxMTQsMTA1LDExMCwxMTYsNDAsMCwKLSAgICAwLDAsMCw0MCwwLDAsMCwwLDQwLDAsMCwwLDAsMTE3LDcsMCwKLSAgICAwLDAsMTAyLDEwOCw5NywxMDMsNDYsMTEyLDEyMSwxMTcsOCwwLDAsMCw2MCwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw2MiwxLDAsMCwwLDExNSwyLDAsMCwwLDYsCi0gICAgMSwKKyAgICAyMjcsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsCisgICAgMCw2NCwwLDAsMCwxMTUsMTYsMCwwLDAsMTAwLDAsOTAsMCwxMDEsMSwKKyAgICAxMDAsMSwxMzEsMSwxLDAsMTAwLDIsODMsMCw0MSwzLDg0LDEyMiwxMiw3MiwKKyAgICAxMDEsMTA4LDEwOCwxMTEsMzIsMTE5LDExMSwxMTQsMTA4LDEwMCwzMyw3OCw0MSwyLDIxOCwxMSwKKyAgICAxMDUsMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwxMDUsMTIyLDEwMSwxMDAsMjE4LDUsMTEyLDExNCwxMDUsCisgICAgMTEwLDExNiwxNjksMCwxMTQsMywwLDAsMCwxMTQsMywwLDAsMCwyNTAsMjIsCisgICAgNDYsNDcsODQsMTExLDExMSwxMDgsMTE1LDQ3LDEwMiwxMTQsMTAxLDEwMSwxMjIsMTAxLDQ3LDEwMiwKKyAgICAxMDgsOTcsMTAzLDQ2LDExMiwxMjEsMjE4LDgsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNjIsCisgICAgMSwwLDAsMCwxMTUsMiwwLDAsMCw0LDEsCiB9OwogCiAjZGVmaW5lIFNJWkUgKGludClzaXplb2YoTV9fX2hlbGxvX18pCmRpZmYgLS1naXQgYS9QeXRob24vZnJvemVubWFpbi5jIGIvUHl0aG9uL2Zyb3plbm1haW4uYwppbmRleCBkZThiZDM1Li43NjliMzNkIDEwMDY0NAotLS0gYS9QeXRob24vZnJvemVubWFpbi5jCisrKyBiL1B5dGhvbi9mcm96ZW5tYWluLmMKQEAgLTk5LDcgKzk5LDkgQEAKICNpZmRlZiBNU19XSU5ET1dTCiAgICAgUHlXaW5GcmVlemVfRXhlVGVybSgpOwogI2VuZGlmCi0gICAgUHlfRmluYWxpemUoKTsKKyAgICBpZiAoUHlfRmluYWxpemVFeCgpIDwgMCkgeworICAgICAgICBzdHMgPSAxMjA7CisgICAgfQogCiBlcnJvcjoKICAgICBQeU1lbV9SYXdGcmVlKGFyZ3ZfY29weSk7CmRpZmYgLS1naXQgYS9QeXRob24vZnV0dXJlLmMgYi9QeXRob24vZnV0dXJlLmMKaW5kZXggMTYzZjg3Zi4uNzVmMjEwNyAxMDA2NDQKLS0tIGEvUHl0aG9uL2Z1dHVyZS5jCisrKyBiL1B5dGhvbi9mdXR1cmUuYwpAQCAtNzksNyArNzksMTAgQEAKIAogICAgIGkgPSAwOwogICAgIGZpcnN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKG1vZC0+di5Nb2R1bGUuYm9keSwgaSk7Ci0gICAgaWYgKGZpcnN0LT5raW5kID09IEV4cHJfa2luZCAmJiBmaXJzdC0+di5FeHByLnZhbHVlLT5raW5kID09IFN0cl9raW5kKQorICAgIGlmIChmaXJzdC0+a2luZCA9PSBFeHByX2tpbmQKKyAgICAgICAgJiYgKGZpcnN0LT52LkV4cHIudmFsdWUtPmtpbmQgPT0gU3RyX2tpbmQKKyAgICAgICAgICAgIHx8IChmaXJzdC0+di5FeHByLnZhbHVlLT5raW5kID09IENvbnN0YW50X2tpbmQKKyAgICAgICAgICAgICAgICAmJiBQeVVuaWNvZGVfQ2hlY2tFeGFjdChmaXJzdC0+di5FeHByLnZhbHVlLT52LkNvbnN0YW50LnZhbHVlKSkpKQogICAgICAgICBpKys7CiAKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldGFyZ3MuYyBiL1B5dGhvbi9nZXRhcmdzLmMKaW5kZXggOGFhYjA2Ny4uNDQxOGViYiAxMDA2NDQKLS0tIGEvUHl0aG9uL2dldGFyZ3MuYworKysgYi9QeXRob24vZ2V0YXJncy5jCkBAIC0yMCwxMiArMjAsMTIgQEAKIAogI2lmZGVmIEhBVkVfREVDTFNQRUNfRExMCiAvKiBFeHBvcnQgZnVuY3Rpb25zICovCi1QeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNoYXIgKiwgLi4uKTsKLVB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVChQeU9iamVjdCAqLCBjaGFyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlBcmdfUGFyc2VUdXBsZV9TaXplVChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLik7CiBQeUFQSV9GVU5DKGludCkgX1B5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIC4uLik7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeV9CdWlsZFZhbHVlX1NpemVUKGNvbnN0IGNoYXIgKiwgLi4uKTsKLVB5QVBJX0ZVTkMoaW50KSBfUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqLCBjaGFyICosIHZhX2xpc3QpOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19WYVBhcnNlX1NpemVUKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CiBQeUFQSV9GVU5DKGludCkgX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0KTsKICNlbmRpZgpAQCAtNTYsMTggKzU2LDE4IEBACiAvKiBGb3J3YXJkICovCiBzdGF0aWMgaW50IHZnZXRhcmdzMShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QgKiwgaW50KTsKIHN0YXRpYyB2b2lkIHNldGVycm9yKFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKiwgaW50ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0aXRlbShQeU9iamVjdCAqLCBjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCwgaW50ICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBzaXplX3QsIGZyZWVsaXN0X3QgKik7Ci1zdGF0aWMgY2hhciAqY29udmVydHR1cGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKiwgY2hhciAqLCBzaXplX3QsIGludCwgZnJlZWxpc3RfdCAqKTsKLXN0YXRpYyBjaGFyICpjb252ZXJ0c2ltcGxlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBjaGFyICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsIGZyZWVsaXN0X3QgKik7Ci1zdGF0aWMgUHlfc3NpemVfdCBjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICosIHZvaWQgKipwLCBjaGFyICoqKTsKLXN0YXRpYyBpbnQgZ2V0YnVmZmVyKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqLCBjaGFyKiopOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZlcnRpdGVtKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50LCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb252ZXJ0dHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqLCBjaGFyICosIHNpemVfdCwgaW50LCBmcmVlbGlzdF90ICopOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnZlcnRzaW1wbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIHNpemVfdCwgZnJlZWxpc3RfdCAqKTsKK3N0YXRpYyBQeV9zc2l6ZV90IGNvbnZlcnRidWZmZXIoUHlPYmplY3QgKiwgdm9pZCAqKnAsIGNvbnN0IGNoYXIgKiopOworc3RhdGljIGludCBnZXRidWZmZXIoUHlPYmplY3QgKiwgUHlfYnVmZmVyICosIGNvbnN0IGNoYXIqKik7CiAKIHN0YXRpYyBpbnQgdmdldGFyZ3NrZXl3b3JkcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCAqLCBpbnQpOwotc3RhdGljIGNoYXIgKnNraXBpdGVtKGNvbnN0IGNoYXIgKiosIHZhX2xpc3QgKiwgaW50KTsKK3N0YXRpYyBjb25zdCBjaGFyICpza2lwaXRlbShjb25zdCBjaGFyICoqLCB2YV9saXN0ICosIGludCk7CiAKIGludAogUHlBcmdfUGFyc2UoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQpAQCAtODIsNyArODIsNyBAQAogfQogCiBpbnQKLV9QeUFyZ19QYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCAuLi4pCitfUHlBcmdfUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQogewogICAgIGludCByZXR2YWw7CiAgICAgdmFfbGlzdCB2YTsKQEAgLTEwNyw3ICsxMDcsNyBAQAogfQogCiBpbnQKLV9QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjaGFyICpmb3JtYXQsIC4uLikKK19QeUFyZ19QYXJzZVR1cGxlX1NpemVUKFB5T2JqZWN0ICphcmdzLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKIHsKICAgICBpbnQgcmV0dmFsOwogICAgIHZhX2xpc3QgdmE7CkBAIC0xMzAsNyArMTMwLDcgQEAKIH0KIAogaW50Ci1fUHlBcmdfVmFQYXJzZV9TaXplVChQeU9iamVjdCAqYXJncywgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQorX1B5QXJnX1ZhUGFyc2VfU2l6ZVQoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCB2YSkKIHsKICAgICB2YV9saXN0IGx2YTsKIApAQCAtMjA4LDcgKzIwOCw3IEBACiAgICAgaW50IGVuZGZtdCA9IDA7CiAgICAgY29uc3QgY2hhciAqZm9ybWF0c2F2ZSA9IGZvcm1hdDsKICAgICBQeV9zc2l6ZV90IGksIGxlbjsKLSAgICBjaGFyICptc2c7CisgICAgY29uc3QgY2hhciAqbXNnOwogICAgIGludCBjb21wYXQgPSBmbGFncyAmIEZMQUdfQ09NUEFUOwogICAgIGZyZWVsaXN0ZW50cnlfdCBzdGF0aWNfZW50cmllc1tTVEFUSUNfRlJFRUxJU1RfRU5UUklFU107CiAgICAgZnJlZWxpc3RfdCBmcmVlbGlzdDsKQEAgLTM5NCw3ICszOTQsMTIgQEAKICAgICAgICAgUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChwIC0gYnVmKSwgIiAlLjI1NnMiLCBtc2cpOwogICAgICAgICBtZXNzYWdlID0gYnVmOwogICAgIH0KLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlKTsKKyAgICBpZiAobXNnWzBdID09ICcoJykgeworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsIG1lc3NhZ2UpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbWVzc2FnZSk7CisgICAgfQogfQogCiAKQEAgLTQxNiw3ICs0MjEsNyBAQAogICAgICAgYW5kIG1zZ2J1ZiBpcyByZXR1cm5lZC4KICovCiAKLXN0YXRpYyBjaGFyICoKK3N0YXRpYyBjb25zdCBjaGFyICoKIGNvbnZlcnR0dXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICBpbnQgKmxldmVscywgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgaW50IHRvcGxldmVsLAogICAgICAgICAgICAgIGZyZWVsaXN0X3QgKmZyZWVsaXN0KQpAQCAtNDc0LDcgKzQ3OSw3IEBACiAKICAgICBmb3JtYXQgPSAqcF9mb3JtYXQ7CiAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBjaGFyICptc2c7CisgICAgICAgIGNvbnN0IGNoYXIgKm1zZzsKICAgICAgICAgUHlPYmplY3QgKml0ZW07CiAgICAgICAgIGl0ZW0gPSBQeVNlcXVlbmNlX0dldEl0ZW0oYXJnLCBpKTsKICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgewpAQCAtNTAxLDExICs1MDYsMTEgQEAKIAogLyogQ29udmVydCBhIHNpbmdsZSBpdGVtLiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0aXRlbShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgIGludCAqbGV2ZWxzLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplLCBmcmVlbGlzdF90ICpmcmVlbGlzdCkKIHsKLSAgICBjaGFyICptc2c7CisgICAgY29uc3QgY2hhciAqbXNnOwogICAgIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICpwX2Zvcm1hdDsKIAogICAgIGlmICgqZm9ybWF0ID09ICcoJyAvKiAnKScgKi8pIHsKQEAgLTUzMCw3ICs1MzUsNyBAQAogCiAvKiBGb3JtYXQgYW4gZXJyb3IgbWVzc2FnZSBnZW5lcmF0ZWQgYnkgY29udmVydHNpbXBsZSgpLiAqLwogCi1zdGF0aWMgY2hhciAqCitzdGF0aWMgY29uc3QgY2hhciAqCiBjb252ZXJ0ZXJyKGNvbnN0IGNoYXIgKmV4cGVjdGVkLCBQeU9iamVjdCAqYXJnLCBjaGFyICptc2didWYsIHNpemVfdCBidWZzaXplKQogewogICAgIGFzc2VydChleHBlY3RlZCAhPSBOVUxMKTsKQEAgLTU3Miw3ICs1NzcsNyBAQAogICAgV2hlbiB5b3UgYWRkIG5ldyBmb3JtYXQgY29kZXMsIHBsZWFzZSBkb24ndCBmb3JnZXQgcG9vciBza2lwaXRlbSgpIGJlbG93LgogKi8KIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogY29udmVydHNpbXBsZShQeU9iamVjdCAqYXJnLCBjb25zdCBjaGFyICoqcF9mb3JtYXQsIHZhX2xpc3QgKnBfdmEsIGludCBmbGFncywKICAgICAgICAgICAgICAgY2hhciAqbXNnYnVmLCBzaXplX3QgYnVmc2l6ZSwgZnJlZWxpc3RfdCAqZnJlZWxpc3QpCiB7CkBAIC04NTcsNyArODYyLDcgQEAKIAogICAgIGNhc2UgJ3knOiB7LyogYW55IGJ5dGVzLWxpa2Ugb2JqZWN0ICovCiAgICAgICAgIHZvaWQgKipwID0gKHZvaWQgKiopdmFfYXJnKCpwX3ZhLCBjaGFyICoqKTsKLSAgICAgICAgY2hhciAqYnVmOworICAgICAgICBjb25zdCBjaGFyICpidWY7CiAgICAgICAgIFB5X3NzaXplX3QgY291bnQ7CiAgICAgICAgIGlmICgqZm9ybWF0ID09ICcqJykgewogICAgICAgICAgICAgaWYgKGdldGJ1ZmZlcihhcmcsIChQeV9idWZmZXIqKXAsICZidWYpIDwgMCkKQEAgLTkwNCw3ICs5MDksNyBAQAogICAgICAgICAgICAgICAgIFB5QnVmZmVyX0ZpbGxJbmZvKHAsIGFyZywgc2FyZywgbGVuLCAxLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgeyAvKiBhbnkgYnl0ZXMtbGlrZSBvYmplY3QgKi8KLSAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmOwogICAgICAgICAgICAgICAgIGlmIChnZXRidWZmZXIoYXJnLCBwLCAmYnVmKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKGJ1ZiwgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogICAgICAgICAgICAgfQpAQCAtOTM0LDcgKzkzOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsgLyogcmVhZC1vbmx5IGJ5dGVzLWxpa2Ugb2JqZWN0ICovCiAgICAgICAgICAgICAgICAgLyogWFhYIFJlYWxseT8gKi8KLSAgICAgICAgICAgICAgICBjaGFyICpidWY7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmOwogICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQgPSBjb252ZXJ0YnVmZmVyKGFyZywgcCwgJmJ1Zik7CiAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoYnVmLCBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7CkBAIC0xMDUxLDM1ICsxMDU2LDI1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoIihBc0NoYXJCdWZmZXIgZmFpbGVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgUHlPYmplY3QgKnU7Ci0KLSAgICAgICAgICAgIC8qIENvbnZlcnQgb2JqZWN0IHRvIFVuaWNvZGUgKi8KLSAgICAgICAgICAgIHUgPSBQeVVuaWNvZGVfRnJvbU9iamVjdChhcmcpOwotICAgICAgICAgICAgaWYgKHUgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVycigKLSAgICAgICAgICAgICAgICAgICAgInN0cmluZyBvciB1bmljb2RlIG9yIHRleHQgYnVmZmVyIiwKLSAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotCisgICAgICAgIGVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhhcmcpKSB7CiAgICAgICAgICAgICAvKiBFbmNvZGUgb2JqZWN0OyB1c2UgZGVmYXVsdCBlcnJvciBoYW5kbGluZyAqLwotICAgICAgICAgICAgcyA9IFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcodSwKKyAgICAgICAgICAgIHMgPSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKGFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYodSk7CiAgICAgICAgICAgICBpZiAocyA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKCIoZW5jb2RpbmcgZmFpbGVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOwotICAgICAgICAgICAgaWYgKCFQeUJ5dGVzX0NoZWNrKHMpKSB7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBjb252ZXJ0ZXJyKAotICAgICAgICAgICAgICAgICAgICAiKGVuY29kZXIgZmFpbGVkIHRvIHJldHVybiBieXRlcykiLAotICAgICAgICAgICAgICAgICAgICBhcmcsIG1zZ2J1ZiwgYnVmc2l6ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoUHlCeXRlc19DaGVjayhzKSk7CiAgICAgICAgICAgICBzaXplID0gUHlCeXRlc19HRVRfU0laRShzKTsKICAgICAgICAgICAgIHB0ciA9IFB5Qnl0ZXNfQVNfU1RSSU5HKHMpOwogICAgICAgICAgICAgaWYgKHB0ciA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHB0ciA9ICIiOwogICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlcnIoCisgICAgICAgICAgICAgICAgcmVjb2RlX3N0cmluZ3MgPyAic3RyIiA6ICJzdHIsIGJ5dGVzIG9yIGJ5dGVhcnJheSIsCisgICAgICAgICAgICAgICAgYXJnLCBtc2didWYsIGJ1ZnNpemUpOworICAgICAgICB9CiAKICAgICAgICAgLyogV3JpdGUgb3V0cHV0OyBvdXRwdXQgaXMgZ3VhcmFudGVlZCB0byBiZSAwLXRlcm1pbmF0ZWQgKi8KICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyMnKSB7CkBAIC0xMTI5LDcgKzExMjQsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoc2l6ZSArIDEgPiBCVUZGRVJfTEVOKSB7CiAgICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5jb2RlZCBzdHJpbmcgdG9vIGxvbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglemQsIG1heGltdW0gbGVuZ3RoICV6ZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X3NzaXplX3Qpc2l6ZSwgKFB5X3NzaXplX3QpKEJVRkZFUl9MRU4tMSkpOwpAQCAtMTI4Myw3ICsxMjc4LDcgQEAKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKLWNvbnZlcnRidWZmZXIoUHlPYmplY3QgKmFyZywgdm9pZCAqKnAsIGNoYXIgKiplcnJtc2cpCitjb252ZXJ0YnVmZmVyKFB5T2JqZWN0ICphcmcsIHZvaWQgKipwLCBjb25zdCBjaGFyICoqZXJybXNnKQogewogICAgIFB5QnVmZmVyUHJvY3MgKnBiID0gUHlfVFlQRShhcmcpLT50cF9hc19idWZmZXI7CiAgICAgUHlfc3NpemVfdCBjb3VudDsKQEAgLTEzMDUsNyArMTMwMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWdldGJ1ZmZlcihQeU9iamVjdCAqYXJnLCBQeV9idWZmZXIgKnZpZXcsIGNoYXIgKiplcnJtc2cpCitnZXRidWZmZXIoUHlPYmplY3QgKmFyZywgUHlfYnVmZmVyICp2aWV3LCBjb25zdCBjaGFyICoqZXJybXNnKQogewogICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIoYXJnLCB2aWV3LCBQeUJVRl9TSU1QTEUpICE9IDApIHsKICAgICAgICAgKmVycm1zZyA9ICJieXRlcy1saWtlIG9iamVjdCI7CkBAIC0xNDQ4LDcgKzE0NDMsOCBAQAogICAgIGNvbnN0IGNoYXIgKmZuYW1lLCAqbXNnLCAqY3VzdG9tX21zZywgKmtleXdvcmQ7CiAgICAgaW50IG1pbiA9IElOVF9NQVg7CiAgICAgaW50IG1heCA9IElOVF9NQVg7Ci0gICAgaW50IGksIGxlbjsKKyAgICBpbnQgaSwgcG9zLCBsZW47CisgICAgaW50IHNraXAgPSAwOwogICAgIFB5X3NzaXplX3QgbmFyZ3MsIG5rZXl3b3JkczsKICAgICBQeU9iamVjdCAqY3VycmVudF9hcmc7CiAgICAgZnJlZWxpc3RlbnRyeV90IHN0YXRpY19lbnRyaWVzW1NUQVRJQ19GUkVFTElTVF9FTlRSSUVTXTsKQEAgLTE0NzYsOSArMTQ3MiwxNyBAQAogICAgICAgICAgICAgY3VzdG9tX21zZysrOwogICAgIH0KIAorICAgIC8qIHNjYW4ga3dsaXN0IGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzICovCisgICAgZm9yIChwb3MgPSAwOyBrd2xpc3RbcG9zXSAmJiAhKmt3bGlzdFtwb3NdOyBwb3MrKykgeworICAgIH0KICAgICAvKiBzY2FuIGt3bGlzdCBhbmQgZ2V0IGdyZWF0ZXN0IHBvc3NpYmxlIG5iciBvZiBhcmdzICovCi0gICAgZm9yIChsZW49MDsga3dsaXN0W2xlbl07IGxlbisrKQotICAgICAgICBjb250aW51ZTsKKyAgICBmb3IgKGxlbiA9IHBvczsga3dsaXN0W2xlbl07IGxlbisrKSB7CisgICAgICAgIGlmICghKmt3bGlzdFtsZW5dKSB7CisgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IGtleXdvcmQgcGFyYW1ldGVyIG5hbWUiKTsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKGxlbiA+IFNUQVRJQ19GUkVFTElTVF9FTlRSSUVTKSB7CiAgICAgICAgIGZyZWVsaXN0LmVudHJpZXMgPSBQeU1lbV9ORVcoZnJlZWxpc3RlbnRyeV90LCBsZW4pOwpAQCAtMTUwNyw3ICsxNTExLDcgQEAKICAgICAgICAga2V5d29yZCA9IGt3bGlzdFtpXTsKICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJ3wnKSB7CiAgICAgICAgICAgICBpZiAobWluICE9IElOVF9NQVgpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZm9ybWF0IHN0cmluZyAofCBzcGVjaWZpZWQgdHdpY2UpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgICAgICB9CkBAIC0xNTE2LDE0ICsxNTIwLDE0IEBACiAgICAgICAgICAgICBmb3JtYXQrKzsKIAogICAgICAgICAgICAgaWYgKG1heCAhPSBJTlRfTUFYKSB7Ci0gICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZvcm1hdCBzdHJpbmcgKCQgYmVmb3JlIHwpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCpmb3JtYXQgPT0gJyQnKSB7CiAgICAgICAgICAgICBpZiAobWF4ICE9IElOVF9NQVgpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZm9ybWF0IHN0cmluZyAoJCBzcGVjaWZpZWQgdHdpY2UpIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CiAgICAgICAgICAgICB9CkBAIC0xNTMxLDYgKzE1MzUsMTQgQEAKICAgICAgICAgICAgIG1heCA9IGk7CiAgICAgICAgICAgICBmb3JtYXQrKzsKIAorICAgICAgICAgICAgaWYgKG1heCA8IHBvcykgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtcHR5IHBhcmFtZXRlciBuYW1lIGFmdGVyICQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChza2lwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobWF4IDwgbmFyZ3MpIHsKICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVuY3Rpb24gdGFrZXMgJXMgJWQgcG9zaXRpb25hbCBhcmd1bWVudHMiCkBAIC0xNTQxLDY2ICsxNTUzLDg2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKElTX0VORF9PRl9GT1JNQVQoKmZvcm1hdCkpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCisgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vcmUga2V5d29yZCBsaXN0IGVudHJpZXMgKCVkKSB0aGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IHNwZWNpZmllcnMgKCVkKSIsIGxlbiwgaSk7CiAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgfQotICAgICAgICBjdXJyZW50X2FyZyA9IE5VTEw7Ci0gICAgICAgIGlmIChua2V5d29yZHMpIHsKLSAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoa2V5d29yZHMsIGtleXdvcmQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50X2FyZykgewotICAgICAgICAgICAgLS1ua2V5d29yZHM7Ci0gICAgICAgICAgICBpZiAoaSA8IG5hcmdzKSB7Ci0gICAgICAgICAgICAgICAgLyogYXJnIHByZXNlbnQgaW4gdHVwbGUgYW5kIGluIGRpY3QgKi8KLSAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgZ2l2ZW4gYnkgbmFtZSAoJyVzJykgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHBvc2l0aW9uICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBpKzEpOwotICAgICAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgICAgICBpZiAoIXNraXApIHsKKyAgICAgICAgICAgIGN1cnJlbnRfYXJnID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChua2V5d29yZHMgJiYgaSA+PSBwb3MpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X2FyZyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGtleXdvcmRzLCBrZXl3b3JkKTsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRfYXJnICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1cnJlbnRfYXJnKSB7CisgICAgICAgICAgICAgICAgLS1ua2V5d29yZHM7CisgICAgICAgICAgICAgICAgaWYgKGkgPCBuYXJncykgeworICAgICAgICAgICAgICAgICAgICAvKiBhcmcgcHJlc2VudCBpbiB0dXBsZSBhbmQgaW4gZGljdCAqLworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50IGdpdmVuIGJ5IG5hbWUgKCclcycpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcG9zaXRpb24gKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBpKzEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChpIDwgbmFyZ3MpCisgICAgICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOworCisgICAgICAgICAgICBpZiAoY3VycmVudF9hcmcpIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBjb252ZXJ0aXRlbShjdXJyZW50X2FyZywgJmZvcm1hdCwgcF92YSwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGxldmVscywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgICAgICBpZiAobXNnKSB7CisgICAgICAgICAgICAgICAgICAgIHNldGVycm9yKGkrMSwgbXNnLCBsZXZlbHMsIGZuYW1lLCBjdXN0b21fbXNnKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaSA8IG1pbikgeworICAgICAgICAgICAgICAgIGlmIChpIDwgcG9zKSB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCAobWluID09IElOVF9NQVgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKG1heCA9PSBJTlRfTUFYKTsKKyAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiUmVxdWlyZWQgYXJndW1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyAocG9zICVkKSBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXl3b3JkLCBpKzEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjdXJyZW50IGNvZGUgcmVwb3J0cyBzdWNjZXNzIHdoZW4gYWxsIHJlcXVpcmVkIGFyZ3MKKyAgICAgICAgICAgICAqIGZ1bGZpbGxlZCBhbmQgbm8ga2V5d29yZCBhcmdzIGxlZnQsIHdpdGggbm8gZnVydGhlcgorICAgICAgICAgICAgICogdmFsaWRhdGlvbi4gWFhYIE1heWJlIHNraXAgdGhpcyBpbiBkZWJ1ZyBidWlsZCA/CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghbmtleXdvcmRzICYmICFza2lwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDEsICZmcmVlbGlzdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobmtleXdvcmRzICYmIFB5RXJyX09jY3VycmVkKCkpCi0gICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKLSAgICAgICAgZWxzZSBpZiAoaSA8IG5hcmdzKQotICAgICAgICAgICAgY3VycmVudF9hcmcgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwotCi0gICAgICAgIGlmIChjdXJyZW50X2FyZykgewotICAgICAgICAgICAgbXNnID0gY29udmVydGl0ZW0oY3VycmVudF9hcmcsICZmb3JtYXQsIHBfdmEsIGZsYWdzLAotICAgICAgICAgICAgICAgIGxldmVscywgbXNnYnVmLCBzaXplb2YobXNnYnVmKSwgJmZyZWVsaXN0KTsKLSAgICAgICAgICAgIGlmIChtc2cpIHsKLSAgICAgICAgICAgICAgICBzZXRlcnJvcihpKzEsIG1zZywgbGV2ZWxzLCBmbmFtZSwgY3VzdG9tX21zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFucmV0dXJuKDAsICZmcmVlbGlzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpIDwgbWluKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiUmVxdWlyZWQgYXJndW1lbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIChwb3MgJWQpIG5vdCBmb3VuZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCwgaSsxKTsKLSAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwotICAgICAgICB9Ci0gICAgICAgIC8qIGN1cnJlbnQgY29kZSByZXBvcnRzIHN1Y2Nlc3Mgd2hlbiBhbGwgcmVxdWlyZWQgYXJncwotICAgICAgICAgKiBmdWxmaWxsZWQgYW5kIG5vIGtleXdvcmQgYXJncyBsZWZ0LCB3aXRoIG5vIGZ1cnRoZXIKLSAgICAgICAgICogdmFsaWRhdGlvbi4gWFhYIE1heWJlIHNraXAgdGhpcyBpbiBkZWJ1ZyBidWlsZCA/Ci0gICAgICAgICAqLwotICAgICAgICBpZiAoIW5rZXl3b3JkcykKLSAgICAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigxLCAmZnJlZWxpc3QpOwogCiAgICAgICAgIC8qIFdlIGFyZSBpbnRvIG9wdGlvbmFsIGFyZ3MsIHNraXAgdGhydSB0byBhbnkgcmVtYWluaW5nCiAgICAgICAgICAqIGtleXdvcmQgYXJncyAqLwogICAgICAgICBtc2cgPSBza2lwaXRlbSgmZm9ybWF0LCBwX3ZhLCBmbGFncyk7CiAgICAgICAgIGlmIChtc2cpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsICIlczogJyVzJyIsIG1zZywKKyAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgIiVzOiAnJXMnIiwgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7CiAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChza2lwKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAiRnVuY3Rpb24gdGFrZXMgJXMgJWQgcG9zaXRpb25hbCBhcmd1bWVudHMiCisgICAgICAgICAgICAgICAgICAgICAiICglZCBnaXZlbikiLAorICAgICAgICAgICAgICAgICAgICAgKFB5X01JTihwb3MsIG1pbikgPCBpKSA/ICJhdCBsZWFzdCIgOiAiZXhhY3RseSIsCisgICAgICAgICAgICAgICAgICAgICBQeV9NSU4ocG9zLCBtaW4pLCBuYXJncyk7CisgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOworICAgIH0KKwogICAgIGlmICghSVNfRU5EX09GX0ZPUk1BVCgqZm9ybWF0KSAmJiAoKmZvcm1hdCAhPSAnfCcpICYmICgqZm9ybWF0ICE9ICckJykpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKKyAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgIm1vcmUgYXJndW1lbnQgc3BlY2lmaWVycyB0aGFuIGtleXdvcmQgbGlzdCBlbnRyaWVzICIKICAgICAgICAgICAgICIocmVtYWluaW5nIGZvcm1hdDonJXMnKSIsIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBjbGVhbnJldHVybigwLCAmZnJlZWxpc3QpOwpAQCAtMTYxOCw3ICsxNjUwLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gY2xlYW5yZXR1cm4oMCwgJmZyZWVsaXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcoa2V5LCBrd2xpc3RbaV0pKSB7CisgICAgICAgICAgICAgICAgaWYgKCprd2xpc3RbaV0gJiYgIVB5VW5pY29kZV9Db21wYXJlV2l0aEFTQ0lJU3RyaW5nKGtleSwga3dsaXN0W2ldKSkgewogICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTE2MzcsNyArMTY2OSw3IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKgorc3RhdGljIGNvbnN0IGNoYXIgKgogc2tpcGl0ZW0oY29uc3QgY2hhciAqKnBfZm9ybWF0LCB2YV9saXN0ICpwX3ZhLCBpbnQgZmxhZ3MpCiB7CiAgICAgY29uc3QgY2hhciAqZm9ybWF0ID0gKnBfZm9ybWF0OwpAQCAtMTczMCw3ICsxNzYyLDcgQEAKIAogICAgIGNhc2UgJygnOiAgICAgICAgICAgLyogYnlwYXNzIHR1cGxlLCBub3QgaGFuZGxlZCBhdCBhbGwgcHJldmlvdXNseSAqLwogICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyICptc2c7CisgICAgICAgICAgICBjb25zdCBjaGFyICptc2c7CiAgICAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgICAgICAgaWYgKCpmb3JtYXQ9PScpJykKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzY2LDE2ICsxNzk4LDkgQEAKICAgICBQeU9iamVjdCAqKm87CiAgICAgdmFfbGlzdCB2YXJnczsKIAotI2lmZGVmIEhBVkVfU1REQVJHX1BST1RPVFlQRVMKLSAgICB2YV9zdGFydCh2YXJncywgbWF4KTsKLSNlbHNlCi0gICAgdmFfc3RhcnQodmFyZ3MpOwotI2VuZGlmCi0KICAgICBhc3NlcnQobWluID49IDApOwogICAgIGFzc2VydChtaW4gPD0gbWF4KTsKICAgICBpZiAoIVB5VHVwbGVfQ2hlY2soYXJncykpIHsKLSAgICAgICAgdmFfZW5kKHZhcmdzKTsKICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgIlB5QXJnX1VucGFja1R1cGxlKCkgYXJndW1lbnQgbGlzdCBpcyBub3QgYSB0dXBsZSIpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTE3OTMsOSArMTgxOCwxMCBAQAogICAgICAgICAgICAgICAgICJ1bnBhY2tlZCB0dXBsZSBzaG91bGQgaGF2ZSAlcyV6ZCBlbGVtZW50cywiCiAgICAgICAgICAgICAgICAgIiBidXQgaGFzICV6ZCIsCiAgICAgICAgICAgICAgICAgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBsZWFzdCAiKSwgbWluLCBsKTsKLSAgICAgICAgdmFfZW5kKHZhcmdzKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorICAgIGlmIChsID09IDApCisgICAgICAgIHJldHVybiAxOwogICAgIGlmIChsID4gbWF4KSB7CiAgICAgICAgIGlmIChuYW1lICE9IE5VTEwpCiAgICAgICAgICAgICBQeUVycl9Gb3JtYXQoCkBAIC0xODA4LDkgKzE4MzQsMTQgQEAKICAgICAgICAgICAgICAgICAidW5wYWNrZWQgdHVwbGUgc2hvdWxkIGhhdmUgJXMlemQgZWxlbWVudHMsIgogICAgICAgICAgICAgICAgICIgYnV0IGhhcyAlemQiLAogICAgICAgICAgICAgICAgIChtaW4gPT0gbWF4ID8gIiIgOiAiYXQgbW9zdCAiKSwgbWF4LCBsKTsKLSAgICAgICAgdmFfZW5kKHZhcmdzKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorCisjaWZkZWYgSEFWRV9TVERBUkdfUFJPVE9UWVBFUworICAgIHZhX3N0YXJ0KHZhcmdzLCBtYXgpOworI2Vsc2UKKyAgICB2YV9zdGFydCh2YXJncyk7CisjZW5kaWYKICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgIG8gPSB2YV9hcmcodmFyZ3MsIFB5T2JqZWN0ICoqKTsKICAgICAgICAgKm8gPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dyYW1pbml0LmMgYi9QeXRob24vZ3JhbWluaXQuYwppbmRleCA4MjEyYjJhLi4zNTRkYzEyIDEwMDY0NAotLS0gYS9QeXRob24vZ3JhbWluaXQuYworKysgYi9QeXRob24vZ3JhbWluaXQuYwpAQCAtMjA0LDExICsyMDQsMTMgQEAKICAgICB7MzIsIDd9LAogICAgIHswLCA2fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV83WzJdID0geworc3RhdGljIGFyYyBhcmNzXzlfN1szXSA9IHsKICAgICB7MzAsIDEyfSwKICAgICB7MzQsIDN9LAorICAgIHswLCA3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV84WzFdID0geworc3RhdGljIGFyYyBhcmNzXzlfOFsyXSA9IHsKKyAgICB7MzIsIDEzfSwKICAgICB7MCwgOH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfOVsyXSA9IHsKQEAgLTIyMSwzNSArMjIzLDM5IEBACiAgICAgezAsIDEwfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfOV8xMVszXSA9IHsKLSAgICB7MzAsIDEzfSwKLSAgICB7MzIsIDE0fSwKKyAgICB7MzAsIDE0fSwKKyAgICB7MzIsIDE1fSwKICAgICB7MCwgMTF9LAogfTsKIHN0YXRpYyBhcmMgYXJjc185XzEyWzNdID0gewogICAgIHszMiwgN30sCi0gICAgezMxLCAxNX0sCisgICAgezMxLCAxNn0sCiAgICAgezAsIDEyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfOV8xM1syXSA9IHsKLSAgICB7MzIsIDE0fSwKK3N0YXRpYyBhcmMgYXJjc185XzEzWzFdID0gewogICAgIHswLCAxM30sCiB9Owogc3RhdGljIGFyYyBhcmNzXzlfMTRbMl0gPSB7Ci0gICAgezMwLCAxNn0sCi0gICAgezM0LCAzfSwKKyAgICB7MzIsIDE1fSwKKyAgICB7MCwgMTR9LAogfTsKLXN0YXRpYyBhcmMgYXJjc185XzE1WzFdID0geworc3RhdGljIGFyYyBhcmNzXzlfMTVbM10gPSB7CisgICAgezMwLCAxN30sCisgICAgezM0LCAzfSwKKyAgICB7MCwgMTV9LAorfTsKK3N0YXRpYyBhcmMgYXJjc185XzE2WzFdID0gewogICAgIHsyNiwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTZbM10gPSB7Ci0gICAgezMyLCAxNH0sCi0gICAgezMxLCAxN30sCi0gICAgezAsIDE2fSwKK3N0YXRpYyBhcmMgYXJjc185XzE3WzNdID0geworICAgIHszMiwgMTV9LAorICAgIHszMSwgMTh9LAorICAgIHswLCAxN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzlfMTdbMV0gPSB7Ci0gICAgezI2LCAxM30sCitzdGF0aWMgYXJjIGFyY3NfOV8xOFsxXSA9IHsKKyAgICB7MjYsIDE0fSwKIH07Ci1zdGF0aWMgc3RhdGUgc3RhdGVzXzlbMThdID0geworc3RhdGljIHN0YXRlIHN0YXRlc185WzE5XSA9IHsKICAgICB7MywgYXJjc185XzB9LAogICAgIHszLCBhcmNzXzlfMX0sCiAgICAgezMsIGFyY3NfOV8yfSwKQEAgLTI1NywxNyArMjYzLDE4IEBACiAgICAgezEsIGFyY3NfOV80fSwKICAgICB7NCwgYXJjc185XzV9LAogICAgIHsyLCBhcmNzXzlfNn0sCi0gICAgezIsIGFyY3NfOV83fSwKLSAgICB7MSwgYXJjc185Xzh9LAorICAgIHszLCBhcmNzXzlfN30sCisgICAgezIsIGFyY3NfOV84fSwKICAgICB7MiwgYXJjc185Xzl9LAogICAgIHszLCBhcmNzXzlfMTB9LAogICAgIHszLCBhcmNzXzlfMTF9LAogICAgIHszLCBhcmNzXzlfMTJ9LAotICAgIHsyLCBhcmNzXzlfMTN9LAorICAgIHsxLCBhcmNzXzlfMTN9LAogICAgIHsyLCBhcmNzXzlfMTR9LAotICAgIHsxLCBhcmNzXzlfMTV9LAotICAgIHszLCBhcmNzXzlfMTZ9LAotICAgIHsxLCBhcmNzXzlfMTd9LAorICAgIHszLCBhcmNzXzlfMTV9LAorICAgIHsxLCBhcmNzXzlfMTZ9LAorICAgIHszLCBhcmNzXzlfMTd9LAorICAgIHsxLCBhcmNzXzlfMTh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMF8wWzFdID0gewogICAgIHsyMywgMX0sCkBAIC0zMTksMTEgKzMyNiwxMyBAQAogICAgIHszMiwgN30sCiAgICAgezAsIDZ9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV83WzJdID0geworc3RhdGljIGFyYyBhcmNzXzExXzdbM10gPSB7CiAgICAgezM2LCAxMn0sCiAgICAgezM0LCAzfSwKKyAgICB7MCwgN30sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzhbMV0gPSB7CitzdGF0aWMgYXJjIGFyY3NfMTFfOFsyXSA9IHsKKyAgICB7MzIsIDEzfSwKICAgICB7MCwgOH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzlbMl0gPSB7CkBAIC0zMzYsMzUgKzM0NSwzOSBAQAogICAgIHswLCAxMH0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzExWzNdID0gewotICAgIHszNiwgMTN9LAotICAgIHszMiwgMTR9LAorICAgIHszNiwgMTR9LAorICAgIHszMiwgMTV9LAogICAgIHswLCAxMX0sCiB9Owogc3RhdGljIGFyYyBhcmNzXzExXzEyWzNdID0gewogICAgIHszMiwgN30sCi0gICAgezMxLCAxNX0sCisgICAgezMxLCAxNn0sCiAgICAgezAsIDEyfSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTNbMl0gPSB7Ci0gICAgezMyLCAxNH0sCitzdGF0aWMgYXJjIGFyY3NfMTFfMTNbMV0gPSB7CiAgICAgezAsIDEzfSwKIH07CiBzdGF0aWMgYXJjIGFyY3NfMTFfMTRbMl0gPSB7Ci0gICAgezM2LCAxNn0sCi0gICAgezM0LCAzfSwKKyAgICB7MzIsIDE1fSwKKyAgICB7MCwgMTR9LAogfTsKLXN0YXRpYyBhcmMgYXJjc18xMV8xNVsxXSA9IHsKK3N0YXRpYyBhcmMgYXJjc18xMV8xNVszXSA9IHsKKyAgICB7MzYsIDE3fSwKKyAgICB7MzQsIDN9LAorICAgIHswLCAxNX0sCit9Oworc3RhdGljIGFyYyBhcmNzXzExXzE2WzFdID0gewogICAgIHsyNiwgNn0sCiB9Owotc3RhdGljIGFyYyBhcmNzXzExXzE2WzNdID0gewotICAgIHszMiwgMTR9LAotICAgIHszMSwgMTd9LAotICAgIHswLCAxNn0sCitzdGF0aWMgYXJjIGFyY3NfMTFfMTdbM10gPSB7CisgICAgezMyLCAxNX0sCisgICAgezMxLCAxOH0sCisgICAgezAsIDE3fSwKIH07Ci1zdGF0aWMgYXJjIGFyY3NfMTFfMTdbMV0gPSB7Ci0gICAgezI2LCAxM30sCitzdGF0aWMgYXJjIGFyY3NfMTFfMThbMV0gPSB7CisgICAgezI2LCAxNH0sCiB9Owotc3RhdGljIHN0YXRlIHN0YXRlc18xMVsxOF0gPSB7CitzdGF0aWMgc3RhdGUgc3RhdGVzXzExWzE5XSA9IHsKICAgICB7MywgYXJjc18xMV8wfSwKICAgICB7MywgYXJjc18xMV8xfSwKICAgICB7MywgYXJjc18xMV8yfSwKQEAgLTM3MiwxNyArMzg1LDE4IEBACiAgICAgezEsIGFyY3NfMTFfNH0sCiAgICAgezQsIGFyY3NfMTFfNX0sCiAgICAgezIsIGFyY3NfMTFfNn0sCi0gICAgezIsIGFyY3NfMTFfN30sCi0gICAgezEsIGFyY3NfMTFfOH0sCisgICAgezMsIGFyY3NfMTFfN30sCisgICAgezIsIGFyY3NfMTFfOH0sCiAgICAgezIsIGFyY3NfMTFfOX0sCiAgICAgezMsIGFyY3NfMTFfMTB9LAogICAgIHszLCBhcmNzXzExXzExfSwKICAgICB7MywgYXJjc18xMV8xMn0sCi0gICAgezIsIGFyY3NfMTFfMTN9LAorICAgIHsxLCBhcmNzXzExXzEzfSwKICAgICB7MiwgYXJjc18xMV8xNH0sCi0gICAgezEsIGFyY3NfMTFfMTV9LAotICAgIHszLCBhcmNzXzExXzE2fSwKLSAgICB7MSwgYXJjc18xMV8xN30sCisgICAgezMsIGFyY3NfMTFfMTV9LAorICAgIHsxLCBhcmNzXzExXzE2fSwKKyAgICB7MywgYXJjc18xMV8xN30sCisgICAgezEsIGFyY3NfMTFfMTh9LAogfTsKIHN0YXRpYyBhcmMgYXJjc18xMl8wWzFdID0gewogICAgIHsyMywgMX0sCkBAIC0xODc5LDExICsxODkzLDExIEBACiAgICAgICJcMDAwXDAwMFwxMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwIn0sCiAgICAgezI2NCwgInBhcmFtZXRlcnMiLCAwLCA0LCBzdGF0ZXNfOCwKICAgICAgIlwwMDBcMDQwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKLSAgICB7MjY1LCAidHlwZWRhcmdzbGlzdCIsIDAsIDE4LCBzdGF0ZXNfOSwKKyAgICB7MjY1LCAidHlwZWRhcmdzbGlzdCIsIDAsIDE5LCBzdGF0ZXNfOSwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDA2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKICAgICB7MjY2LCAidGZwZGVmIiwgMCwgNCwgc3RhdGVzXzEwLAogICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LAotICAgIHsyNjcsICJ2YXJhcmdzbGlzdCIsIDAsIDE4LCBzdGF0ZXNfMTEsCisgICAgezI2NywgInZhcmFyZ3NsaXN0IiwgMCwgMTksIHN0YXRlc18xMSwKICAgICAgIlwwMDBcMDAwXDIwMFwwMDBcMDA2XDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAifSwKICAgICB7MjY4LCAidmZwZGVmIiwgMCwgMiwgc3RhdGVzXzEyLAogICAgICAiXDAwMFwwMDBcMjAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCJ9LApkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydC5jIGIvUHl0aG9uL2ltcG9ydC5jCmluZGV4IDEzMTJmZDAuLmJkYzdlNGMgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnQuYworKysgYi9QeXRob24vaW1wb3J0LmMKQEAgLTM4LDE0ICszOCw2IEBACiAKICNpbmNsdWRlICJjbGluaWMvaW1wb3J0LmMuaCIKIAotLypbcHl0aG9uIGlucHV0XQotY2xhc3MgZnNfdW5pY29kZV9jb252ZXJ0ZXIoQ0NvbnZlcnRlcik6Ci0gICAgdHlwZSA9ICdQeU9iamVjdCAqJwotICAgIGNvbnZlcnRlciA9ICdQeVVuaWNvZGVfRlNEZWNvZGVyJwotCi1bcHl0aG9uIHN0YXJ0IGdlbmVyYXRlZCBjb2RlXSovCi0vKltweXRob24gZW5kIGdlbmVyYXRlZCBjb2RlOiBvdXRwdXQ9ZGEzOWEzZWU1ZTZiNGIwZCBpbnB1dD05ZDY3ODYyMzAxNjYwMDZlXSovCi0KIC8qIEluaXRpYWxpemUgdGhpbmdzICovCiAKIHZvaWQKQEAgLTMyMCw3ICszMTIsNyBAQAogCiAKIC8qIExpc3Qgb2YgbmFtZXMgdG8gY2xlYXIgaW4gc3lzICovCi1zdGF0aWMgY2hhciogc3lzX2RlbGV0ZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3lzX2RlbGV0ZXNbXSA9IHsKICAgICAicGF0aCIsICJhcmd2IiwgInBzMSIsICJwczIiLAogICAgICJsYXN0X3R5cGUiLCAibGFzdF92YWx1ZSIsICJsYXN0X3RyYWNlYmFjayIsCiAgICAgInBhdGhfaG9va3MiLCAicGF0aF9pbXBvcnRlcl9jYWNoZSIsICJtZXRhX3BhdGgiLApAQCAtMzMwLDcgKzMyMiw3IEBACiAgICAgTlVMTAogfTsKIAotc3RhdGljIGNoYXIqIHN5c19maWxlc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzeXNfZmlsZXNbXSA9IHsKICAgICAic3RkaW4iLCAiX19zdGRpbl9fIiwKICAgICAic3Rkb3V0IiwgIl9fc3Rkb3V0X18iLAogICAgICJzdGRlcnIiLCAiX19zdGRlcnJfXyIsCkBAIC0zNDcsNyArMzM5LDcgQEAKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKICAgICBQeU9iamVjdCAqbW9kdWxlcyA9IGludGVycC0+bW9kdWxlczsKICAgICBQeU9iamVjdCAqd2Vha2xpc3QgPSBOVUxMOwotICAgIGNoYXIgKipwOworICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqcDsKIAogICAgIGlmIChtb2R1bGVzID09IE5VTEwpCiAgICAgICAgIHJldHVybjsgLyogQWxyZWFkeSBkb25lICovCkBAIC04ODMsMTAgKzg3NSw4IEBACiAgICAgaWYgKFB5VW5pY29kZV9Db21wYXJlKGNvLT5jb19maWxlbmFtZSwgb2xkbmFtZSkpCiAgICAgICAgIHJldHVybjsKIAotICAgIHRtcCA9IGNvLT5jb19maWxlbmFtZTsKLSAgICBjby0+Y29fZmlsZW5hbWUgPSBuZXduYW1lOwotICAgIFB5X0lOQ1JFRihjby0+Y29fZmlsZW5hbWUpOwotICAgIFB5X0RFQ1JFRih0bXApOworICAgIFB5X0lOQ1JFRihuZXduYW1lKTsKKyAgICBQeV9YU0VUUkVGKGNvLT5jb19maWxlbmFtZSwgbmV3bmFtZSk7CiAKICAgICBjb25zdGFudHMgPSBjby0+Y29fY29uc3RzOwogICAgIG4gPSBQeVR1cGxlX0dFVF9TSVpFKGNvbnN0YW50cyk7CkBAIC05NjAsMTIgKzk1MCwxMyBAQAogfQogCiAKLS8qIFJldHVybiBhbiBpbXBvcnRlciBvYmplY3QgZm9yIGEgc3lzLnBhdGgvcGtnLl9fcGF0aF9fIGl0ZW0gJ3AnLAorLyogUmV0dXJuIGEgZmluZGVyIG9iamVjdCBmb3IgYSBzeXMucGF0aC9wa2cuX19wYXRoX18gaXRlbSAncCcsCiAgICBwb3NzaWJseSBieSBmZXRjaGluZyBpdCBmcm9tIHRoZSBwYXRoX2ltcG9ydGVyX2NhY2hlIGRpY3QuIElmIGl0CiAgICB3YXNuJ3QgeWV0IGNhY2hlZCwgdHJhdmVyc2UgcGF0aF9ob29rcyB1bnRpbCBhIGhvb2sgaXMgZm91bmQKICAgIHRoYXQgY2FuIGhhbmRsZSB0aGUgcGF0aCBpdGVtLiBSZXR1cm4gTm9uZSBpZiBubyBob29rIGNvdWxkOwotICAgdGhpcyB0ZWxscyBvdXIgY2FsbGVyIGl0IHNob3VsZCBmYWxsIGJhY2sgdG8gdGhlIGJ1aWx0aW4KLSAgIGltcG9ydCBtZWNoYW5pc20uIENhY2hlIHRoZSByZXN1bHQgaW4gcGF0aF9pbXBvcnRlcl9jYWNoZS4KKyAgIHRoaXMgdGVsbHMgb3VyIGNhbGxlciB0aGF0IHRoZSBwYXRoIGJhc2VkIGZpbmRlciBjb3VsZCBub3QgZmluZAorICAgYSBmaW5kZXIgZm9yIHRoaXMgcGF0aCBpdGVtLiBDYWNoZSB0aGUgcmVzdWx0IGluCisgICBwYXRoX2ltcG9ydGVyX2NhY2hlLgogICAgUmV0dXJucyBhIGJvcnJvd2VkIHJlZmVyZW5jZS4gKi8KIAogc3RhdGljIFB5T2JqZWN0ICoKQEAgLTEzMzEsMTAgKzEzMjIsOCBAQAogICAgICAgICAgICAgKGFsd2F5c190cmltIHx8CiAgICAgICAgICAgICAgUHlVbmljb2RlX0NvbXBhcmVXaXRoQVNDSUlTdHJpbmcoY29kZS0+Y29fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfZnJhbWVzKSA9PSAwKSkgewotICAgICAgICAgICAgUHlPYmplY3QgKnRtcCA9ICpvdXRlcl9saW5rOwotICAgICAgICAgICAgKm91dGVyX2xpbmsgPSBuZXh0OwogICAgICAgICAgICAgUHlfWElOQ1JFRihuZXh0KTsKLSAgICAgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgICAgICAgUHlfWFNFVFJFRigqb3V0ZXJfbGluaywgbmV4dCk7CiAgICAgICAgICAgICBwcmV2X2xpbmsgPSBvdXRlcl9saW5rOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgewpAQCAtMTM2MSwxMiArMTM1MCwxMiBAQAogICAgIF9QeV9JREVOVElGSUVSKF9maW5kX2FuZF9sb2FkKTsKICAgICBfUHlfSURFTlRJRklFUihfaGFuZGxlX2Zyb21saXN0KTsKICAgICBfUHlfSURFTlRJRklFUihfbG9ja191bmxvY2tfbW9kdWxlKTsKLSAgICBfUHlfc3RhdGljX3N0cmluZyhzaW5nbGVfZG90LCAiLiIpOwogICAgIFB5T2JqZWN0ICphYnNfbmFtZSA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmJ1aWx0aW5zX2ltcG9ydCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmZpbmFsX21vZCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKm1vZCA9IE5VTEw7CiAgICAgUHlPYmplY3QgKnBhY2thZ2UgPSBOVUxMOworICAgIFB5T2JqZWN0ICpzcGVjID0gTlVMTDsKICAgICBQeU9iamVjdCAqZ2xvYmFscyA9IE5VTEw7CiAgICAgUHlPYmplY3QgKmZyb21saXN0ID0gTlVMTDsKICAgICBQeUludGVycHJldGVyU3RhdGUgKmludGVycCA9IFB5VGhyZWFkU3RhdGVfR0VUKCktPmludGVycDsKQEAgLTE0MjMsNDIgKzE0MTIsOTMgQEAKICAgICB9CiAgICAgZWxzZSBpZiAobGV2ZWwgPiAwKSB7CiAgICAgICAgIHBhY2thZ2UgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3BhY2thZ2VfXyk7CisgICAgICAgIHNwZWMgPSBfUHlEaWN0X0dldEl0ZW1JZChnbG9iYWxzLCAmUHlJZF9fX3NwZWNfXyk7CisKICAgICAgICAgaWYgKHBhY2thZ2UgIT0gTlVMTCAmJiBwYWNrYWdlICE9IFB5X05vbmUpIHsKICAgICAgICAgICAgIFB5X0lOQ1JFRihwYWNrYWdlKTsKICAgICAgICAgICAgIGlmICghUHlVbmljb2RlX0NoZWNrKHBhY2thZ2UpKSB7CiAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInBhY2thZ2UgbXVzdCBiZSBhIHN0cmluZyIpOwogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzcGVjICE9IE5VTEwgJiYgc3BlYyAhPSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgaW50IGVxdWFsOworICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpwYXJlbnQgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHNwZWMsICJwYXJlbnQiKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlcXVhbCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChwYWNrYWdlLCBwYXJlbnQsIFB5X0VRKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocGFyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZXF1YWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVxdWFsID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19JbXBvcnRXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX3BhY2thZ2VfXyAhPSBfX3NwZWNfXy5wYXJlbnQiLCAxKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3BlYyAhPSBOVUxMICYmIHNwZWMgIT0gUHlfTm9uZSkgeworICAgICAgICAgICAgcGFja2FnZSA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoc3BlYywgInBhcmVudCIpOworICAgICAgICAgICAgaWYgKHBhY2thZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghUHlVbmljb2RlX0NoZWNrKHBhY2thZ2UpKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3NwZWNfXy5wYXJlbnQgbXVzdCBiZSBhIHN0cmluZyIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0ltcG9ydFdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgcmVzb2x2ZSBwYWNrYWdlIGZyb20gX19zcGVjX18gb3IgX19wYWNrYWdlX18sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWxsaW5nIGJhY2sgb24gX19uYW1lX18gYW5kIF9fcGF0aF9fIiwgMSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcGFja2FnZSA9IF9QeURpY3RfR2V0SXRlbUlkKGdsb2JhbHMsICZQeUlkX19fbmFtZV9fKTsKICAgICAgICAgICAgIGlmIChwYWNrYWdlID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICInX19uYW1lX18nIG5vdCBpbiBnbG9iYWxzIik7CiAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFQeVVuaWNvZGVfQ2hlY2socGFja2FnZSkpIHsKLSAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiX19uYW1lX18gbXVzdCBiZSBhIHN0cmluZyIpOwotICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBQeV9JTkNSRUYocGFja2FnZSk7CisgICAgICAgICAgICBpZiAoIVB5VW5pY29kZV9DaGVjayhwYWNrYWdlKSkgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJfX25hbWVfXyBtdXN0IGJlIGEgc3RyaW5nIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKF9QeURpY3RfR2V0SXRlbUlkKGdsb2JhbHMsICZQeUlkX19fcGF0aF9fKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKnBhcnRpdGlvbiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgUHlPYmplY3QgKmJvcnJvd2VkX2RvdCA9IF9QeVVuaWNvZGVfRnJvbUlkKCZzaW5nbGVfZG90KTsKLSAgICAgICAgICAgICAgICBpZiAoYm9ycm93ZWRfZG90ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGRvdDsKKworICAgICAgICAgICAgICAgIGlmIChQeVVuaWNvZGVfUkVBRFkocGFja2FnZSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcnRpdGlvbiA9IFB5VW5pY29kZV9SUGFydGl0aW9uKHBhY2thZ2UsIGJvcnJvd2VkX2RvdCk7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKHBhY2thZ2UpOwotICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb24gPT0gTlVMTCkgeworCisgICAgICAgICAgICAgICAgZG90ID0gUHlVbmljb2RlX0ZpbmRDaGFyKHBhY2thZ2UsICcuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUHlVbmljb2RlX0dFVF9MRU5HVEgocGFja2FnZSksIC0xKTsKKyAgICAgICAgICAgICAgICBpZiAoZG90ID09IC0yKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhY2thZ2UgPSBQeVR1cGxlX0dFVF9JVEVNKHBhcnRpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgUHlfSU5DUkVGKHBhY2thZ2UpOwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwYXJ0aXRpb24pOworCisgICAgICAgICAgICAgICAgaWYgKGRvdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzdWJzdHIgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKHBhY2thZ2UsIDAsIGRvdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBQeV9TRVRSRUYocGFja2FnZSwgc3Vic3RyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoUHlEaWN0X0dldEl0ZW0oaW50ZXJwLT5tb2R1bGVzLCBwYWNrYWdlKSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChQeVVuaWNvZGVfQ29tcGFyZVdpdGhBU0NJSVN0cmluZyhwYWNrYWdlLCAiIikgPT0gMCkgeworICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAiYXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCB3aXRoIG5vIGtub3duIHBhcmVudCBwYWNrYWdlIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFB5RGljdF9HZXRJdGVtKGludGVycC0+bW9kdWxlcywgcGFja2FnZSkgPT0gTlVMTCkgewogICAgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLAogICAgICAgICAgICAgICAgICAgICAiUGFyZW50IG1vZHVsZSAlUiBub3QgbG9hZGVkLCBjYW5ub3QgcGVyZm9ybSByZWxhdGl2ZSAiCiAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQiLCBwYWNrYWdlKTsKQEAgLTE0OTcsMTcgKzE1MzcsOCBAQAogICAgICAgICAgICAgZ290byBlcnJvcjsKIAogICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgobmFtZSkgPiAwKSB7Ci0gICAgICAgICAgICBQeU9iamVjdCAqYm9ycm93ZWRfZG90LCAqc2VxID0gTlVMTDsKLQotICAgICAgICAgICAgYm9ycm93ZWRfZG90ID0gX1B5VW5pY29kZV9Gcm9tSWQoJnNpbmdsZV9kb3QpOwotICAgICAgICAgICAgc2VxID0gUHlUdXBsZV9QYWNrKDIsIGJhc2UsIG5hbWUpOworICAgICAgICAgICAgYWJzX25hbWUgPSBQeVVuaWNvZGVfRnJvbUZvcm1hdCgiJVUuJVUiLCBiYXNlLCBuYW1lKTsKICAgICAgICAgICAgIFB5X0RFQ1JFRihiYXNlKTsKLSAgICAgICAgICAgIGlmIChib3Jyb3dlZF9kb3QgPT0gTlVMTCB8fCBzZXEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFic19uYW1lID0gUHlVbmljb2RlX0pvaW4oYm9ycm93ZWRfZG90LCBzZXEpOwotICAgICAgICAgICAgUHlfREVDUkVGKHNlcSk7CiAgICAgICAgICAgICBpZiAoYWJzX25hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CkBAIC0xNjA1LDQzICsxNjM2LDM2IEBACiAgICAgaWYgKGhhc19mcm9tIDwgMCkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBpZiAoIWhhc19mcm9tKSB7Ci0gICAgICAgIGlmIChsZXZlbCA9PSAwIHx8IFB5VW5pY29kZV9HRVRfTEVOR1RIKG5hbWUpID4gMCkgewotICAgICAgICAgICAgUHlPYmplY3QgKmZyb250ID0gTlVMTDsKLSAgICAgICAgICAgIFB5T2JqZWN0ICpwYXJ0aXRpb24gPSBOVUxMOwotICAgICAgICAgICAgUHlPYmplY3QgKmJvcnJvd2VkX2RvdCA9IF9QeVVuaWNvZGVfRnJvbUlkKCZzaW5nbGVfZG90KTsKKyAgICAgICAgUHlfc3NpemVfdCBsZW4gPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKTsKKyAgICAgICAgaWYgKGxldmVsID09IDAgfHwgbGVuID4gMCkgeworICAgICAgICAgICAgUHlfc3NpemVfdCBkb3Q7CiAKLSAgICAgICAgICAgIGlmIChib3Jyb3dlZF9kb3QgPT0gTlVMTCkgeworICAgICAgICAgICAgZG90ID0gUHlVbmljb2RlX0ZpbmRDaGFyKG5hbWUsICcuJywgMCwgbGVuLCAxKTsKKyAgICAgICAgICAgIGlmIChkb3QgPT0gLTIpIHsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwYXJ0aXRpb24gPSBQeVVuaWNvZGVfUGFydGl0aW9uKG5hbWUsIGJvcnJvd2VkX2RvdCk7Ci0gICAgICAgICAgICBpZiAocGFydGl0aW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoUHlVbmljb2RlX0dFVF9MRU5HVEgoUHlUdXBsZV9HRVRfSVRFTShwYXJ0aXRpb24sIDEpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoZG90ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgLyogTm8gZG90IGluIG1vZHVsZSBuYW1lLCBzaW1wbGUgZXhpdCAqLwotICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihwYXJ0aXRpb24pOwogICAgICAgICAgICAgICAgIGZpbmFsX21vZCA9IG1vZDsKICAgICAgICAgICAgICAgICBQeV9JTkNSRUYobW9kKTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmcm9udCA9IFB5VHVwbGVfR0VUX0lURU0ocGFydGl0aW9uLCAwKTsKLSAgICAgICAgICAgIFB5X0lOQ1JFRihmcm9udCk7Ci0gICAgICAgICAgICBQeV9ERUNSRUYocGFydGl0aW9uKTsKLQogICAgICAgICAgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgICAgICBQeU9iamVjdCAqZnJvbnQgPSBQeVVuaWNvZGVfU3Vic3RyaW5nKG5hbWUsIDAsIGRvdCk7CisgICAgICAgICAgICAgICAgaWYgKGZyb250ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBmaW5hbF9tb2QgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGJ1aWx0aW5zX2ltcG9ydCwgZnJvbnQsIE5VTEwpOwogICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihmcm9udCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGN1dF9vZmYgPSBQeVVuaWNvZGVfR0VUX0xFTkdUSChuYW1lKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlVbmljb2RlX0dFVF9MRU5HVEgoZnJvbnQpOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgY3V0X29mZiA9IGxlbiAtIGRvdDsKICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGFic19uYW1lX2xlbiA9IFB5VW5pY29kZV9HRVRfTEVOR1RIKGFic19uYW1lKTsKICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdG9fcmV0dXJuID0gUHlVbmljb2RlX1N1YnN0cmluZyhhYnNfbmFtZSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX25hbWVfbGVuIC0gY3V0X29mZik7Ci0gICAgICAgICAgICAgICAgUHlfREVDUkVGKGZyb250KTsKICAgICAgICAgICAgICAgICBpZiAodG9fcmV0dXJuID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0ZGwuYyBiL1B5dGhvbi9pbXBvcnRkbC5jCmluZGV4IDFhYTU4NWQuLmFjMDMyODkgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnRkbC5jCisrKyBiL1B5dGhvbi9pbXBvcnRkbC5jCkBAIC0yMyw4ICsyMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aG5hbWUsIEZJTEUgKmZwKTsKICNlbmRpZgogCi1zdGF0aWMgY29uc3QgY2hhciAqYXNjaWlfb25seV9wcmVmaXggPSAiUHlJbml0IjsKLXN0YXRpYyBjb25zdCBjaGFyICpub25hc2NpaV9wcmVmaXggPSAiUHlJbml0VSI7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFzY2lpX29ubHlfcHJlZml4ID0gIlB5SW5pdCI7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5vbmFzY2lpX3ByZWZpeCA9ICJQeUluaXRVIjsKIAogLyogR2V0IHRoZSB2YXJpYWJsZSBwYXJ0IG9mIGEgbW9kdWxlJ3MgZXhwb3J0IHN5bWJvbCBuYW1lLgogICogUmV0dXJucyBhIGJ5dGVzIGluc3RhbmNlLiBGb3Igbm9uLUFTQ0lJLW5hbWVkIG1vZHVsZXMsIHRoZSBuYW1lIGlzCmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0bGliLmggYi9QeXRob24vaW1wb3J0bGliLmgKaW5kZXggN2Y2Yjc1My4uMGU5MGU1NyAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydGxpYi5oCisrKyBiL1B5dGhvbi9pbXBvcnRsaWIuaApAQCAtMSwxNzEgKzEsMTU0IEBACiAvKiBBdXRvLWdlbmVyYXRlZCBieSBQcm9ncmFtcy9fZnJlZXplX2ltcG9ydGxpYi5jICovCiBjb25zdCB1bnNpZ25lZCBjaGFyIF9QeV9NX19pbXBvcnRsaWJbXSA9IHsKLSAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw2LDAsMCwKLSAgICAwLDY0LDAsMCwwLDExNSwxNjksMiwwLDAsMTAwLDAsMCw5MCwwLDAsCi0gICAgMTAwLDEsMCw5NywxLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsOTAsCi0gICAgMiwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDMsMCw3MSwxMDAsCi0gICAgNiwwLDEwMCw3LDAsMTMyLDAsMCwxMDAsNywwLDEzMSwyLDAsOTAsNCwKLSAgICAwLDEwNSwwLDAsOTAsNSwwLDEwNSwwLDAsOTAsNiwwLDcxLDEwMCw4LAotICAgIDAsMTAwLDksMCwxMzIsMCwwLDEwMCw5LDAsMTAxLDcsMCwxMzEsMywwLAotICAgIDkwLDgsMCw3MSwxMDAsMTAsMCwxMDAsMTEsMCwxMzIsMCwwLDEwMCwxMSwwLAotICAgIDEzMSwyLDAsOTAsOSwwLDcxLDEwMCwxMiwwLDEwMCwxMywwLDEzMiwwLDAsCi0gICAgMTAwLDEzLDAsMTMxLDIsMCw5MCwxMCwwLDcxLDEwMCwxNCwwLDEwMCwxNSwwLAotICAgIDEzMiwwLDAsMTAwLDE1LDAsMTMxLDIsMCw5MCwxMSwwLDEwMCwxNiwwLDEwMCwKLSAgICAxNywwLDEzMiwwLDAsOTAsMTIsMCwxMDAsMTgsMCwxMDAsMTksMCwxMzIsMCwKLSAgICAwLDkwLDEzLDAsMTAwLDIwLDAsMTAwLDIxLDAsMTMyLDAsMCw5MCwxNCwwLAotICAgIDEwMCwyMiwwLDEwMCwyMywwLDEwMCwyNCwwLDEwMCwyNSwwLDEzMiwwLDEsOTAsCi0gICAgMTUsMCwxMDAsMjYsMCwxMDAsMjcsMCwxMzIsMCwwLDkwLDE2LDAsMTAwLDI4LAotICAgIDAsMTAwLDI5LDAsMTMyLDAsMCw5MCwxNywwLDEwMCwzMCwwLDEwMCwzMSwwLAotICAgIDEzMiwwLDAsOTAsMTgsMCwxMDAsMzIsMCwxMDAsMzMsMCwxMzIsMCwwLDkwLAotICAgIDE5LDAsNzEsMTAwLDM0LDAsMTAwLDM1LDAsMTMyLDAsMCwxMDAsMzUsMCwxMzEsCi0gICAgMiwwLDkwLDIwLDAsNzEsMTAwLDM2LDAsMTAwLDM3LDAsMTMyLDAsMCwxMDAsCi0gICAgMzcsMCwxMzEsMiwwLDkwLDIxLDAsMTAwLDM4LDAsMTAwLDEsMCwxMDAsMzksCi0gICAgMCwxMDAsMSwwLDEwMCw0MCwwLDEwMCw0MSwwLDEzMiwwLDIsOTAsMjIsMCwKLSAgICAxMDEsMjMsMCwxMzEsMCwwLDkwLDI0LDAsMTAwLDEsMCwxMDAsMSwwLDEwMCwKLSAgICA0MiwwLDEwMCw0MywwLDEzMiwyLDAsOTAsMjUsMCwxMDAsNDQsMCwxMDAsNDUsCi0gICAgMCwxMDAsNDYsMCwxMDAsNDcsMCwxMzIsMCwxLDkwLDI2LDAsMTAwLDQ4LDAsCi0gICAgMTAwLDQ5LDAsMTMyLDAsMCw5MCwyNywwLDEwMCw1MCwwLDEwMCw1MSwwLDEzMiwKLSAgICAwLDAsOTAsMjgsMCwxMDAsNTIsMCwxMDAsNTMsMCwxMzIsMCwwLDkwLDI5LAotICAgIDAsMTAwLDU0LDAsMTAwLDU1LDAsMTMyLDAsMCw5MCwzMCwwLDEwMCw1NiwwLAotICAgIDEwMCw1NywwLDEzMiwwLDAsOTAsMzEsMCwxMDAsNTgsMCwxMDAsNTksMCwxMzIsCi0gICAgMCwwLDkwLDMyLDAsNzEsMTAwLDYwLDAsMTAwLDYxLDAsMTMyLDAsMCwxMDAsCi0gICAgNjEsMCwxMzEsMiwwLDkwLDMzLDAsNzEsMTAwLDYyLDAsMTAwLDYzLDAsMTMyLAotICAgIDAsMCwxMDAsNjMsMCwxMzEsMiwwLDkwLDM0LDAsNzEsMTAwLDY0LDAsMTAwLAotICAgIDY1LDAsMTMyLDAsMCwxMDAsNjUsMCwxMzEsMiwwLDkwLDM1LDAsMTAwLDY2LAotICAgIDAsMTAwLDY3LDAsMTMyLDAsMCw5MCwzNiwwLDEwMCw2OCwwLDEwMCw2OSwwLAotICAgIDEzMiwwLDAsOTAsMzcsMCwxMDAsMSwwLDEwMCw3MCwwLDEwMCw3MSwwLDEzMiwKLSAgICAxLDAsOTAsMzgsMCwxMDAsNzIsMCwxMDAsNzMsMCwxMzIsMCwwLDkwLDM5LAotICAgIDAsMTAwLDc0LDAsOTAsNDAsMCwxMDEsNDAsMCwxMDAsNzUsMCwyMyw5MCw0MSwKLSAgICAwLDEwMCw3NiwwLDEwMCw3NywwLDEzMiwwLDAsOTAsNDIsMCwxMDAsNzgsMCwKLSAgICAxMDAsNzksMCwxMzIsMCwwLDkwLDQzLDAsMTAwLDEsMCwxMDAsODAsMCwxMDAsCi0gICAgODEsMCwxMDAsODIsMCwxMzIsMiwwLDkwLDQ0LDAsMTAwLDgzLDAsMTAwLDg0LAotICAgIDAsMTMyLDAsMCw5MCw0NSwwLDEwMCw4NSwwLDEwMCw4NiwwLDEzMiwwLDAsCi0gICAgOTAsNDYsMCwxMDAsMSwwLDEwMCwxLDAsMTAyLDAsMCwxMDAsODAsMCwxMDAsCi0gICAgODcsMCwxMDAsODgsMCwxMzIsNCwwLDkwLDQ3LDAsMTAwLDg5LDAsMTAwLDkwLAotICAgIDAsMTMyLDAsMCw5MCw0OCwwLDEwMCw5MSwwLDEwMCw5MiwwLDEzMiwwLDAsCi0gICAgOTAsNDksMCwxMDAsOTMsMCwxMDAsOTQsMCwxMzIsMCwwLDkwLDUwLDAsMTAwLAotICAgIDEsMCw4Myw0MSw5NSw5Nyw4MywxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsCi0gICAgMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwKLSAgICAzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCw4NCwxMDQsMTA1LDExNSwzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LDc5LDg0LDMyLDEwOSwxMDEsOTcsCi0gICAgMTEwLDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDEwOCwKLSAgICAxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMywzMiw3MywxMTYsMzIsMTA0LAotICAgIDk3LDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLAotICAgIDMyLDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMzIsOTksOTcsCi0gICAgMTEwLDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTEyLDEwMSwKLSAgICAxMDAsMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTcsMTE1LAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwKLSAgICAxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDMyLDY1LAotICAgIDExNSwxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LAotICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTExLDExMCwKLSAgICAzMiwxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsCi0gICAgMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMTAsCi0gICAgMTE5LDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsCi0gICAgMzIsMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywKLSAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsMTA1LDk5LDQ1LDEwMiw5Nyw5OSwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTYsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsNzgsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsOTIsMCwwLDAsMTIwLDY2LDAsMTAwLDEsMCwxMDAsMiwKLSAgICAwLDEwMCwzLDAsMTAwLDQsMCwxMDMsNCwwLDY4LDkzLDQ2LDAsMTI1LDIsCi0gICAgMCwxMTYsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDExNCwxOSwwLAotICAgIDExNiwxLDAsMTI0LDAsMCwxMjQsMiwwLDExNiwyLDAsMTI0LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwyLDAsMTMxLDMsMCwxLDExMywxOSwwLDg3LDEyNCwwLDAsCi0gICAgMTA2LDMsMCwxMDYsNCwwLDEyNCwxLDAsMTA2LDMsMCwxMzEsMSwwLDEsCi0gICAgMTAwLDUsMCw4Myw0MSw2LDEyMiw0Nyw4MywxMDUsMTA5LDExMiwxMDgsMTAxLDMyLDExNSwKLSAgICAxMTcsOTgsMTE1LDExNiwxMDUsMTE2LDExNywxMTYsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEwMiwxMTcsCi0gICAgMTEwLDk5LDExNiwxMTEsMTExLDEwOCwxMTUsNDYsMTE3LDExMiwxMDAsOTcsMTE2LDEwMSw5NSwxMTksCi0gICAgMTE0LDk3LDExMiwxMTIsMTAxLDExNCw0NiwyMTgsMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsOTUsOTUsMjE4LDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMjE4LDEyLDk1LAotICAgIDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCw3LDk1LDk1LDEwMCwKLSAgICAxMTEsOTksOTUsOTUsNzgsNDEsNSwyMTgsNywxMDQsOTcsMTE1LDk3LDExNiwxMTYsMTE0LAotICAgIDIxOCw3LDExNSwxMDEsMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw3LDEwMywxMDEsMTE2LDk3LDExNiwKLSAgICAxMTYsMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksMTE2LDk1LDk1LDIxOCw2LDExNywxMTIsCi0gICAgMTAwLDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwxMDEsMTE5LDkwLDMsMTExLDEwOCwxMDAsCi0gICAgMjE4LDcsMTE0LDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxNjksMCwxMTQsMTAsMCwwLDAsCi0gICAgMjUwLDI5LDYwLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAotICAgIDEwOCwxMDUsOTgsNDYsOTUsOTgsMTExLDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDYyLDIxOCwKLSAgICA1LDk1LDExOSwxMTQsOTcsMTEyLDI3LDAsMCwwLDExNSw4LDAsMCwwLDAsCi0gICAgMiwyNSwxLDE1LDEsMjksMSwxMTQsMTIsMCwwLDAsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMTYsMCwwLDAsMTE2LDAsMCwxMTYsMSwwLDEzMSwxLDAsMTI0LAotICAgIDAsMCwxMzEsMSwwLDgzLDQxLDEsNzgsNDEsMiwyMTgsNCwxMTYsMTIxLDExMiwKLSAgICAxMDEsMjE4LDMsMTE1LDEyMSwxMTUsNDEsMSwyMTgsNCwxMTAsOTcsMTA5LDEwMSwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTEsOTUsCi0gICAgMTEwLDEwMSwxMTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzUsMCwwLDAsMTE1LDIsCi0gICAgMCwwLDAsMCwxLDExNCwxNiwwLDAsMCw5OSwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSwKLSAgICA1OCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwKLSAgICAxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCwKLSAgICA0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LAotICAgIDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwwLDgzLDQxLDksCi0gICAgMjE4LDEzLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCwxMjIsCi0gICAgNjMsNzcsOTcsMTEwLDk3LDEwMywxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTEsMTE1LAotICAgIDExNSwxMDUsOTgsMTA4LDEwMSwzMiw5OSwxMDgsMTAxLDk3LDExMCw0NSwxMTcsMTEyLDMyLDExMSwKLSAgICAxMDIsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMiwxMTEsCi0gICAgMTE0LDMyLDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDQ2LAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDEzLDAsMCwwLDEyNCwxLDAsMTI0LDAsMCwKLSAgICA5NSwwLDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDEsMjE4LDUsOTUsMTEwLAotICAgIDk3LDEwOSwxMDEsNDEsMiwyMTgsNCwxMTUsMTAxLDEwOCwxMDIsMTE0LDE1LDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwKLSAgICA4LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MywwLDAsMCwxMTUsMiwwLAotICAgIDAsMCwwLDEsMTIyLDIyLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsCi0gICAgMTExLDk3LDEwMCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsMjUsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDExNiwxLDAsMTA2LAotICAgIDIsMCwxMDcsNiwwLDEyNCwwLDAsOTUsMywwLDEwMCwwLDAsODMsNDEsCi0gICAgMSw3OCw0MSw0LDExNCwxOCwwLDAsMCwxMTQsMTQsMCwwLDAsMjE4LDcsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDIxOCwxMCw5NSwxMDUsMTE1LDk1LDExNCwxMDEsMTA4LAotICAgIDExMSw5NywxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDksOTUsOTUsMTAxLDExMCwxMTYsCi0gICAgMTAxLDExNCw5NSw5NSw0NiwwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLAotICAgIDIzLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSwKLSAgICA5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwyLDAsMCwwLDExLDAsMCwwLDcxLDAsMCwwLDExNSw3NywwLAotICAgIDAsMCwxMTYsMCwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDEyNCwxLAotICAgIDAsNjgsMTMxLDEsMCwxMzEsMSwwLDExNCw3MywwLDEyNCwwLDAsMTA2LDEsCi0gICAgMCwxMiwxMTQsNzMsMCwxMjEsMTcsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDAsCi0gICAgMCwxMDYsNCwwLDYxLDg3LDExMCwxOCwwLDQsMTE2LDUsMCwxMDcsMTAsMCwKLSAgICAxMTQsNzIsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEwMCwwLDAsODMsNDEsCi0gICAgMyw3OCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLAotICAgIDAsMCwwLDExNSwwLDAsMCwxMTUsMjcsMCwwLDAsMTI0LDAsMCw5MywKLSAgICAxNywwLDEyNSwxLDAsMTI0LDEsMCwxMDAsMCwwLDEwNyw5LDAsODYsMSwKLSAgICAxMTMsMywwLDEwMCwwLDAsODMsNDEsMSw3OCwxMTQsMTAsMCwwLDAsNDEsCi0gICAgMiwyMTgsMiw0Niw0OCwyMTgsMyw5NywxMTQsMTAzLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDI1MCw5LDYwLDEwMywxMDEsMTEwLDEwMSwKLSAgICAxMjAsMTEyLDExNCw2Miw1MCwwLDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLAotICAgIDQxLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSwKLSAgICA5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLAotICAgIDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2Miw0MSw2LDIxOCwzLDk3LDExMCwKLSAgICAxMjEsMTE0LDIyLDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsCi0gICAgMTE0LDE4LDAsMCwwLDIxOCw4LDc1LDEwMSwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDQxLAotICAgIDIsMTE0LDE5LDAsMCwwLDIxOCw0LDk3LDExNCwxMDMsMTE1LDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw4LDk1LDk1LDEwMSwKLSAgICAxMjAsMTA1LDExNiw5NSw5NSw0OSwwLDAsMCwxMTUsMTAsMCwwLDAsMCwxLAotICAgIDM1LDEsMywxLDE3LDEsMTMsMSwxMjIsMjIsOTUsNzcsOTcsMTEwLDk3LDEwMywKLSAgICAxMDEsODIsMTAxLDEwOCwxMTEsOTcsMTAwLDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiw5NSw5NSwKLSAgICA3OCw0MSw3LDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsCi0gICAgMCwwLDExNCwzLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsMjMsMCwwLAotICAgIDAsMTE0LDMwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTcsMCwwLDAsMzksCi0gICAgMCwwLDAsMTE1LDgsMCwwLDAsMTIsMiw2LDIsMTIsMywxMiwzLAotICAgIDExNCwxNywwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDY0LDAsMCwwLDExNSwxNiwwLDAsMCwxMDEsCi0gICAgMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDgzLDQxLAotICAgIDIsMjE4LDE0LDk1LDY4LDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsNjksMTE0LDExNCwxMTEsCi0gICAgMTE0LDc4LDQxLDMsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwzMSwwLDAsMCw2NCwwLDAsMCwKLSAgICAxMTUsMiwwLDAsMCwxMiwxLDExNCwzMSwwLDAsMCw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwKLSAgICAwLDExNSw4MiwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLAotICAgIDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsCi0gICAgMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLAotICAgIDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwwLDEwMCwKLSAgICA5LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsMTAwLDExLDAsMTMyLDAsCi0gICAgMCw5MCw4LDAsMTAwLDEyLDAsODMsNDEsMTMsMjE4LDExLDk1LDc3LDExMSwxMDAsCisgICAgOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLDAsCisgICAgMCw2NCwwLDAsMCwxMTUsMjE2LDEsMCwwLDEwMCwwLDkwLDAsMTAwLDEsCisgICAgOTcsMSwxMDAsMiwxMDAsMywxMzIsMCw5MCwyLDEwMCw0LDEwMCw1LDEzMiwwLAorICAgIDkwLDMsNzEsMCwxMDAsNiwxMDAsNywxMzIsMCwxMDAsNywxMzEsMiw5MCw0LAorICAgIDEwNSwwLDkwLDUsMTA1LDAsOTAsNiw3MSwwLDEwMCw4LDEwMCw5LDEzMiwwLAorICAgIDEwMCw5LDEwMSw3LDEzMSwzLDkwLDgsNzEsMCwxMDAsMTAsMTAwLDExLDEzMiwwLAorICAgIDEwMCwxMSwxMzEsMiw5MCw5LDcxLDAsMTAwLDEyLDEwMCwxMywxMzIsMCwxMDAsMTMsCisgICAgMTMxLDIsOTAsMTAsNzEsMCwxMDAsMTQsMTAwLDE1LDEzMiwwLDEwMCwxNSwxMzEsMiwKKyAgICA5MCwxMSwxMDAsMTYsMTAwLDE3LDEzMiwwLDkwLDEyLDEwMCwxOCwxMDAsMTksMTMyLDAsCisgICAgOTAsMTMsMTAwLDIwLDEwMCwyMSwxMzIsMCw5MCwxNCwxMDAsMjIsMTAwLDIzLDE1NiwxLAorICAgIDEwMCwyNCwxMDAsMjUsMTMyLDIsOTAsMTUsMTAwLDI2LDEwMCwyNywxMzIsMCw5MCwxNiwKKyAgICAxMDAsMjgsMTAwLDI5LDEzMiwwLDkwLDE3LDEwMCwzMCwxMDAsMzEsMTMyLDAsOTAsMTgsCisgICAgMTAwLDMyLDEwMCwzMywxMzIsMCw5MCwxOSw3MSwwLDEwMCwzNCwxMDAsMzUsMTMyLDAsCisgICAgMTAwLDM1LDEzMSwyLDkwLDIwLDcxLDAsMTAwLDM2LDEwMCwzNywxMzIsMCwxMDAsMzcsCisgICAgMTMxLDIsOTAsMjEsMTAwLDEsMTAwLDEsMTAwLDM4LDE1NiwyLDEwMCwzOSwxMDAsNDAsCisgICAgMTMyLDIsOTAsMjIsMTAxLDIzLDEzMSwwLDkwLDI0LDEwMCw5NCwxMDAsNDEsMTAwLDQyLAorICAgIDEzMiwxLDkwLDI1LDEwMCw0MywxMDAsNDQsMTU2LDEsMTAwLDQ1LDEwMCw0NiwxMzIsMiwKKyAgICA5MCwyNiwxMDAsNDcsMTAwLDQ4LDEzMiwwLDkwLDI3LDEwMCw0OSwxMDAsNTAsMTMyLDAsCisgICAgOTAsMjgsMTAwLDUxLDEwMCw1MiwxMzIsMCw5MCwyOSwxMDAsNTMsMTAwLDU0LDEzMiwwLAorICAgIDkwLDMwLDEwMCw1NSwxMDAsNTYsMTMyLDAsOTAsMzEsMTAwLDU3LDEwMCw1OCwxMzIsMCwKKyAgICA5MCwzMiw3MSwwLDEwMCw1OSwxMDAsNjAsMTMyLDAsMTAwLDYwLDEzMSwyLDkwLDMzLAorICAgIDcxLDAsMTAwLDYxLDEwMCw2MiwxMzIsMCwxMDAsNjIsMTMxLDIsOTAsMzQsNzEsMCwKKyAgICAxMDAsNjMsMTAwLDY0LDEzMiwwLDEwMCw2NCwxMzEsMiw5MCwzNSwxMDAsNjUsMTAwLDY2LAorICAgIDEzMiwwLDkwLDM2LDEwMCw2NywxMDAsNjgsMTMyLDAsOTAsMzcsMTAwLDk1LDEwMCw2OSwKKyAgICAxMDAsNzAsMTMyLDEsOTAsMzgsMTAwLDcxLDEwMCw3MiwxMzIsMCw5MCwzOSwxMDAsNzMsCisgICAgOTAsNDAsMTAxLDQwLDEwMCw3NCwyMywwLDkwLDQxLDEwMCw3NSwxMDAsNzYsMTMyLDAsCisgICAgOTAsNDIsMTAwLDc3LDEwMCw3OCwxMzIsMCw5MCw0MywxMDAsOTYsMTAwLDgwLDEwMCw4MSwKKyAgICAxMzIsMSw5MCw0NCwxMDAsODIsMTAwLDgzLDEzMiwwLDkwLDQ1LDEwMCw4NCwxMDAsODUsCisgICAgMTMyLDAsOTAsNDYsMTAwLDEsMTAwLDEsMTAyLDAsMTAwLDc5LDEwMiw0LDEwMCw4NiwKKyAgICAxMDAsODcsMTMyLDEsOTAsNDcsMTAwLDg4LDEwMCw4OSwxMzIsMCw5MCw0OCwxMDAsOTAsCisgICAgMTAwLDkxLDEzMiwwLDkwLDQ5LDEwMCw5MiwxMDAsOTMsMTMyLDAsOTAsNTAsMTAwLDEsCisgICAgODMsMCw0MSw5Nyw5Nyw4MywxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsMTA5LAorICAgIDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LDc5LDg0LDMyLDEwOSwxMDEsOTcsMTEwLAorICAgIDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDEwOCwxMjEsCisgICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwzMywzMiw3MywxMTYsMzIsMTA0LDk3LAorICAgIDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLAorICAgIDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTYsMzIsOTksOTcsMTEwLAorICAgIDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTEyLDEwMSwxMDAsCisgICAgMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTcsMTE1LDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsCisgICAgMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDMyLDY1LDExNSwKKyAgICAxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwKKyAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTExLDExMCwzMiwKKyAgICAxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LAorICAgIDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwxMDEsMTE0LDMyLDExNiwxMTEsMTAsMTE5LAorICAgIDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsCisgICAgMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5NywxMTUsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsMTA1LDk5LDQ1LDEwMiw5Nyw5OSwxMDUsCisgICAgMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTYsMTA0LAorICAgIDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsNzgsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsNywwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsNjAsMCwwLDAsMTIwLDQwLDEwMCw2LDY4LDAsOTMsMzIsMTI1LAorICAgIDIsMTE2LDAsMTI0LDEsMTI0LDIsMTMxLDIsMTE0LDYsMTE2LDEsMTI0LDAsMTI0LAorICAgIDIsMTE2LDIsMTI0LDEsMTI0LDIsMTMxLDIsMTMxLDMsMSwwLDExMyw2LDg3LAorICAgIDAsMTI0LDAsMTA2LDMsMTA2LDQsMTI0LDEsMTA2LDMsMTMxLDEsMSwwLDEwMCwKKyAgICA1LDgzLDAsNDEsNywxMjIsNDcsODMsMTA1LDEwOSwxMTIsMTA4LDEwMSwzMiwxMTUsMTE3LAorICAgIDk4LDExNSwxMTYsMTA1LDExNiwxMTcsMTE2LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMDIsMTE3LDExMCwKKyAgICA5OSwxMTYsMTExLDExMSwxMDgsMTE1LDQ2LDExNywxMTIsMTAwLDk3LDExNiwxMDEsOTUsMTE5LDExNCwKKyAgICA5NywxMTIsMTEyLDEwMSwxMTQsNDYsMjE4LDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDk1LDk1LDIxOCw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCwxMiw5NSw5NSwKKyAgICAxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwyMTgsNyw5NSw5NSwxMDAsMTExLAorICAgIDk5LDk1LDk1LDc4LDQxLDQsMTIyLDEwLDk1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDk1LDk1LDEyMiw4LDk1LDk1LDExMCw5NywxMDksMTAxLDk1LDk1LDEyMiwxMiw5NSw5NSwKKyAgICAxMTMsMTE3LDk3LDEwOCwxMTAsOTcsMTA5LDEwMSw5NSw5NSwxMjIsNyw5NSw5NSwxMDAsMTExLAorICAgIDk5LDk1LDk1LDQxLDUsMjE4LDcsMTA0LDk3LDExNSw5NywxMTYsMTE2LDExNCwyMTgsNywKKyAgICAxMTUsMTAxLDExNiw5NywxMTYsMTE2LDExNCwyMTgsNywxMDMsMTAxLDExNiw5NywxMTYsMTE2LDExNCwKKyAgICAyMTgsOCw5NSw5NSwxMDAsMTA1LDk5LDExNiw5NSw5NSwyMTgsNiwxMTcsMTEyLDEwMCw5NywKKyAgICAxMTYsMTAxLDQxLDMsOTAsMywxMTAsMTAxLDExOSw5MCwzLDExMSwxMDgsMTAwLDIxOCw3LAorICAgIDExNCwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTY5LDAsMTE0LDEwLDAsMCwwLDI1MCwyOSwKKyAgICA2MCwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAorICAgIDk4LDQ2LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw2MiwyMTgsNSw5NSwKKyAgICAxMTksMTE0LDk3LDExMiwyNywwLDAsMCwxMTUsOCwwLDAsMCwwLDIsMTAsCisgICAgMSwxMCwxLDIyLDEsMTE0LDEyLDAsMCwwLDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDEyLDAsMCwwLDExNiwwLDExNiwxLDEzMSwxLDEyNCwwLDEzMSwxLDgzLDAsCisgICAgNDEsMSw3OCw0MSwyLDIxOCw0LDExNiwxMjEsMTEyLDEwMSwyMTgsMywxMTUsMTIxLDExNSwKKyAgICA0MSwxLDIxOCw0LDExMCw5NywxMDksMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxMSw5NSwxMTAsMTAxLDExOSw5NSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzNSwwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTE0LAorICAgIDE2LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LDQwLDAsMCwwLDEwMSwwLAorICAgIDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwyLDEwMCwzLDEzMiwwLAorICAgIDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsNiwxMDAsNywxMzIsMCwKKyAgICA5MCw2LDEwMCw4LDgzLDAsNDEsOSwyMTgsMTMsOTUsNzcsOTcsMTEwLDk3LDEwMywKKyAgICAxMDEsODIsMTAxLDEwOCwxMTEsOTcsMTAwLDEyMiw2Myw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTUsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExMSwxMTUsMTE1LDEwNSw5OCwxMDgsMTAxLDMyLDk5LDEwOCwKKyAgICAxMDEsOTcsMTEwLDQ1LDExNywxMTIsMzIsMTExLDEwMiwzMiwxMTUsMTIxLDExNSw0NiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTA4LDExMSw5NywxMDAsOTUsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsNDYsOTksMiwwLDAsMCwwLDAsMCwKKyAgICAwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwKKyAgICAwLDAsMTI0LDEsMTI0LDAsOTUsMCwxMDAsMCw4MywwLDQxLDEsNzgsNDEsCisgICAgMSwyMTgsNSw5NSwxMTAsOTcsMTA5LDEwMSw0MSwyLDIxOCw0LDExNSwxMDEsMTA4LDEwMiwKKyAgICAxMTQsMTUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMjE4LDgsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQzLDAsCisgICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjIsOTUsNzcsOTcsMTEwLDk3LAorICAgIDEwMywxMDEsODIsMTAxLDEwOCwxMTEsOTcsMTAwLDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSwKKyAgICA5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwxOCwwLDAsMCwxMjQsMCwxMDYsMCwxMTYsCisgICAgMSwxMDYsMiwxMDcsNiwxMjQsMCw5NSwzLDEwMCwwLDgzLDAsNDEsMSw3OCwKKyAgICA0MSw0LDExNCwxOCwwLDAsMCwxMTQsMTQsMCwwLDAsMjE4LDcsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDIxOCwxMCw5NSwxMDUsMTE1LDk1LDExNCwxMDEsMTA4LDExMSw5NywKKyAgICAxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDksOTUsOTUsMTAxLDExMCwxMTYsMTAxLDExNCwKKyAgICA5NSw5NSw0NiwwLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDIzLDk1LAorICAgIDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSw5NSwxMDEsCisgICAgMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwyLAorICAgIDAsMCwwLDExLDAsMCwwLDcxLDAsMCwwLDExNSw2NiwwLDAsMCwKKyAgICAxMTYsMCwxMDAsMSwxMDAsMiwxMzIsMCwxMjQsMSw2OCwwLDEzMSwxLDEzMSwxLAorICAgIDExNCw2MiwxMjQsMCwxMDYsMSwxMiwwLDExNCw2MiwxMjEsMTQsMTE2LDIsMTA2LDMsCisgICAgMTI0LDAsMTA2LDQsNjEsMCw4NywwLDExMCwyMCw0LDAsMTE2LDUsMTA3LDEwLAorICAgIDExNCw2MCwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTAwLDAsCisgICAgODMsMCw0MSwzLDc4LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDMsMCwwLDAsMTE1LDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsCisgICAgMCw5MywxNCwxMjUsMSwxMjQsMSwxMDAsMCwxMDcsOSw4NiwwLDEsMCwxMTMsCisgICAgMiwxMDAsMCw4MywwLDQxLDEsNzgsMTE0LDEwLDAsMCwwLDQxLDIsMjE4LAorICAgIDIsNDYsNDgsMjE4LDMsOTcsMTE0LDEwMywxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyNTAsOSw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwKKyAgICAxMTQsNjIsNTAsMCwwLDAsMTE1LDIsMCwwLDAsNCwwLDEyMiw0MSw5NSwKKyAgICA3Nyw5NywxMTAsOTcsMTAzLDEwMSw4MiwxMDEsMTA4LDExMSw5NywxMDAsNDYsOTUsOTUsMTAxLAorICAgIDEyMCwxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwKKyAgICAxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsNDEsNiwyMTgsMyw5NywxMTAsMTIxLDExNCwKKyAgICAyMiwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDExNCwxOCwKKyAgICAwLDAsMCwyMTgsOCw3NSwxMDEsMTIxLDY5LDExNCwxMTQsMTExLDExNCw0MSwyLDExNCwKKyAgICAxOSwwLDAsMCwyMTgsNCw5NywxMTQsMTAzLDExNSwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOCw5NSw5NSwxMDEsMTIwLDEwNSwKKyAgICAxMTYsOTUsOTUsNDksMCwwLDAsMTE1LDEwLDAsMCwwLDAsMSwyNiwxLAorICAgIDIsMSwxNCwxLDE0LDEsMTIyLDIyLDk1LDc3LDk3LDExMCw5NywxMDMsMTAxLDgyLAorICAgIDEwMSwxMDgsMTExLDk3LDEwMCw0Niw5NSw5NSwxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsCisgICAgNywxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwKKyAgICAxMTQsMywwLDAsMCwxMTQsMjAsMCwwLDAsMTE0LDIzLDAsMCwwLDExNCwKKyAgICAzMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE3LDAsMCwwLDM5LDAsMCwKKyAgICAwLDExNSw4LDAsMCwwLDgsMiw0LDIsOCwzLDgsMywxMTQsMTcsCisgICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMSwwLDAsMCw2NCwwLDAsMCwxMTUsMTIsMCwwLDAsMTAxLDAsOTAsCisgICAgMSwxMDAsMCw5MCwyLDEwMCwxLDgzLDAsNDEsMiwyMTgsMTQsOTUsNjgsMTAxLAorICAgIDk3LDEwMCwxMDgsMTExLDk5LDEwNyw2OSwxMTQsMTE0LDExMSwxMTQsNzgsNDEsMywxMTQsMSwKKyAgICAwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAorICAgIDAsMTE0LDMxLDAsMCwwLDY0LDAsMCwwLDExNSwyLDAsMCwwLDgsCisgICAgMSwxMTQsMzEsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsNTYsMCwwLDAsCisgICAgMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsCisgICAgMTMyLDAsOTAsNCwxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDEwMCw3LAorICAgIDEzMiwwLDkwLDYsMTAwLDgsMTAwLDksMTMyLDAsOTAsNywxMDAsMTAsMTAwLDExLAorICAgIDEzMiwwLDkwLDgsMTAwLDEyLDgzLDAsNDEsMTMsMjE4LDExLDk1LDc3LDExMSwxMDAsCiAgICAgMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywxMjIsMTY5LDY1LDMyLDExNCwxMDEsOTksMTE3LDExNCwKICAgICAxMTUsMTA1LDExOCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCiAgICAgMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDUsCkBAIC0xNzgsMTYyICsxNjEsMTUxIEBACiAgICAgMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTYsOTcsMTA3LDEwMSwzMiwxMDgsMTExLDk5LAogICAgIDEwNywxMTUsMzIsNjYsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDY1LDQxLDQ2LDEwLDMyLDMyLAogICAgIDMyLDMyLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDcwLDAsMCwwLDExNiwwLDAsMTA2LAotICAgIDEsMCwxMzEsMCwwLDEyNCwwLDAsOTUsMiwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMzEsMCwwLDEyNCwwLDAsOTUsMywwLDEyNCwxLDAsMTI0LDAsMCwKLSAgICA5NSw0LDAsMTAwLDAsMCwxMjQsMCwwLDk1LDUsMCwxMDAsMSwwLDEyNCwKLSAgICAwLDAsOTUsNiwwLDEwMCwxLDAsMTI0LDAsMCw5NSw3LDAsMTAwLDAsCi0gICAgMCw4Myw0MSwyLDc4LDIzMywwLDAsMCwwLDQxLDgsMjE4LDcsOTUsMTE2LAotICAgIDEwNCwxMTQsMTAxLDk3LDEwMCw5MCwxMyw5NywxMDgsMTA4LDExMSw5OSw5NywxMTYsMTAxLDk1LAotICAgIDEwOCwxMTEsOTksMTA3LDIxOCw0LDEwOCwxMTEsOTksMTA3LDIxOCw2LDExOSw5NywxMDcsMTAxLAotICAgIDExNywxMTIsMTE0LDE1LDAsMCwwLDIxOCw1LDExMSwxMTksMTEwLDEwMSwxMTQsMjE4LDUsCi0gICAgOTksMTExLDExNywxMTAsMTE2LDIxOCw3LDExOSw5NywxMDUsMTE2LDEwMSwxMTQsMTE1LDQxLDIsCi0gICAgMTE0LDE5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsNzQsMCwKLSAgICAwLDAsMTE1LDEyLDAsMCwwLDAsMSwxNSwxLDE1LDEsOSwxLDksCi0gICAgMSw5LDEsMTIyLDIwLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKLSAgICA0Niw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDQsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsODgsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTI1LDEsMCwxMjQsCi0gICAgMCwwLDEwNiwyLDAsMTI1LDIsMCwxMjAsNjAsMCwxMTYsMywwLDEwNiw0LAotICAgIDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsMTI0LDMsMCwxMDAsMCwwLAotICAgIDEwNyw4LDAsMTE0LDU1LDAsMTAwLDEsMCw4MywxMjQsMywwLDEwNiwyLDAsCi0gICAgMTI1LDIsMCwxMjQsMiwwLDEyNCwxLDAsMTA3LDIsMCwxMTQsMjQsMCwxMDAsCi0gICAgMiwwLDgzLDExMywyNCwwLDg3LDEwMCwwLDAsODMsNDEsMyw3OCw3MCw4NCwKLSAgICA0MSw1LDExNCwzNCwwLDAsMCwyMTgsOSwxMDMsMTAxLDExNiw5NSwxMDUsMTAwLDEwMSwKLSAgICAxMTAsMTE2LDExNCwzNywwLDAsMCwyMTgsMTIsOTUsOTgsMTA4LDExMSw5OSwxMDcsMTA1LAotICAgIDExMCwxMDMsOTUsMTExLDExMCwyMTgsMywxMDMsMTAxLDExNiw0MSw0LDExNCwxOSwwLDAsCi0gICAgMCw5MCwyLDEwOSwxMDEsMjE4LDMsMTE2LDEwNSwxMDAsMTE0LDM1LDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMiwKLSAgICAxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDgyLDAsMCwwLAotICAgIDExNSwxOCwwLDAsMCwwLDIsMTIsMSw5LDEsMywxLDE1LDEsMTIsCi0gICAgMSw0LDEsOSwxLDEyLDEsMTIyLDI0LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNzYsMTExLDk5LDEwNyw0NiwxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksCi0gICAgMTA3LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDE2LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwyMTAsMCwwLDAsMTE2LDAsMCwxMDYsMSwKLSAgICAwLDEzMSwwLDAsMTI1LDEsMCwxMjQsMCwwLDExNiwyLDAsMTI0LDEsMCwKLSAgICA2MCwxMjIsMTczLDAsMTIwLDE2NiwwLDEyNCwwLDAsMTA2LDMsMCwxNDMsMTI0LDAsCi0gICAgMSwxMjQsMCwwLDEwNiw0LDAsMTAwLDEsMCwxMDcsMiwwLDExNSw2OCwwLAotICAgIDEyNCwwLDAsMTA2LDUsMCwxMjQsMSwwLDEwNywyLDAsMTE0LDk2LDAsMTI0LAotICAgIDEsMCwxMjQsMCwwLDk1LDUsMCwxMjQsMCwwLDQsMTA2LDQsMCwxMDAsCi0gICAgMiwwLDU1LDIsOTUsNCwwLDEwMCwzLDAsODMsMTI0LDAsMCwxMDYsNiwKLSAgICAwLDEzMSwwLDAsMTE0LDEyNCwwLDExNiw3LDAsMTAwLDQsMCwxMjQsMCwwLAotICAgIDIyLDEzMSwxLDAsMTMwLDEsMCwxMjQsMCwwLDEwNiw4LDAsMTA2LDksMCwKLSAgICAxMDAsNSwwLDEzMSwxLDAsMTE0LDE1NywwLDEyNCwwLDAsNCwxMDYsMTAsMCwKLSAgICAxMDAsMiwwLDU1LDIsOTUsMTAsMCw4NywxMDAsNiwwLDgxLDgyLDg4LDEyNCwKLSAgICAwLDAsMTA2LDgsMCwxMDYsOSwwLDEzMSwwLDAsMSwxMjQsMCwwLDEwNiwKLSAgICA4LDAsMTA2LDExLDAsMTMxLDAsMCwxLDExMywyOCwwLDg3LDg3LDEwMCw2LAotICAgIDAsMTE2LDIsMCwxMjQsMSwwLDYxLDg4LDEwMCw2LDAsODMsNDEsNywxMjIsCi0gICAgMTg1LDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDY1LDk5LDExMywxMTcsMTA1LDExNCwKLSAgICAxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LDExMSw5OSwKLSAgICAxMDcsNDYsMzIsMzIsNzMsMTAyLDMyLDk3LDMyLDExMiwxMTEsMTE2LDEwMSwxMTAsMTE2LDEwNSwKLSAgICA5NywxMDgsMzIsMTAwLDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDExNSwzMiwxMDAsCi0gICAgMTAxLDExNiwxMDEsOTksMTE2LDEwMSwxMDAsNDQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsOTcsMzIsOTUsNjgsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNyw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsMzIsMTA1LDExNSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDc5LDExNiwxMDQsMTAxLDExNCwxMTksMTA1LDExNSwxMDEsNDQsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTA1LDExNSwzMiw5NywxMDgsMTE5LDk3LAotICAgIDEyMSwxMTUsMzIsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSwxMDAsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICA4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsCi0gICAgNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDMzLDAsMCwwLDIzMywKLSAgICAxLDAsMCwwLDg0LDEyMiwyMywxMDAsMTAxLDk3LDEwMCwxMDgsMTExLDk5LDEwNywzMiwKLSAgICAxMDAsMTAxLDExNiwxMDEsOTksMTE2LDEwMSwxMDAsMzIsOTgsMTIxLDMyLDM3LDExNCw3MCw3OCwKLSAgICA0MSwxMiwxMTQsMzQsMCwwLDAsMTE0LDQwLDAsMCwwLDExNCw0MSwwLDAsCi0gICAgMCwxMTQsMzUsMCwwLDAsMTE0LDM4LDAsMCwwLDExNCwzNywwLDAsMCwKLSAgICAxMTQsNDQsMCwwLDAsMTE0LDMxLDAsMCwwLDExNCwzNiwwLDAsMCwyMTgsCi0gICAgNyw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNCwzOSwwLDAsMCwyMTgsNywxMTQsCi0gICAgMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSw0MSwyLDExNCwxOSwwLDAsMCwxMTQsNDMsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMTE0LDQ2LDAsMCwwLDk0LDAsMCwwLDExNSwzMiwwLDAsMCwwLAotICAgIDYsMTIsMSwxMCwxLDMsMSwzLDEsMTAsMSwzMCwxLDksMSwxNSwKLSAgICAxLDQsMSwxMiwxLDE2LDEsMTgsMSwyMiwyLDEzLDEsMjEsMiwxMjIsCi0gICAgMTksOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk3LDk5LDExMywKLSAgICAxMTcsMTA1LDExNCwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsMTAsMCwwLDAsNjcsMCwwLDAsMTE1LDE1NywwLDAsMCwxMTYsMCwKLSAgICAwLDEwNiwxLDAsMTMxLDAsMCwxMjUsMSwwLDEyNCwwLDAsMTA2LDIsMCwKLSAgICAxNDMsMTI5LDAsMSwxMjQsMCwwLDEwNiwzLDAsMTI0LDEsMCwxMDcsMywwLAotICAgIDExNCw0OSwwLDExNiw0LDAsMTAwLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LAotICAgIDAsMCwxMDYsNSwwLDEwMCwyLDAsMTA3LDQsMCwxMTUsNzAsMCwxMTYsNiwKLSAgICAwLDEzMCwxLDAsMTI0LDAsMCw0LDEwNiw1LDAsMTAwLDMsMCw1NiwyLAotICAgIDk1LDUsMCwxMjQsMCwwLDEwNiw1LDAsMTAwLDIsMCwxMDcsMiwwLDExNCwKLSAgICAxNDYsMCwxMDAsMCwwLDEyNCwwLDAsOTUsMywwLDEyNCwwLDAsMTA2LDcsCi0gICAgMCwxMTQsMTQ2LDAsMTI0LDAsMCw0LDEwNiw3LDAsMTAwLDMsMCw1NiwyLAotICAgIDk1LDcsMCwxMjQsMCwwLDEwNiw4LDAsMTA2LDksMCwxMzEsMCwwLDEsCi0gICAgODcsMTAwLDAsMCw4MSw4Miw4OCwxMDAsMCwwLDgzLDQxLDQsNzgsMTIyLDMxLAotICAgIDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTcsCi0gICAgMTEwLDQ1LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDEwOCwxMTEsOTksMTA3LDExNCwKLSAgICAzMywwLDAsMCwxMTQsNDUsMCwwLDAsNDEsMTAsMTE0LDM0LDAsMCwwLAotICAgIDExNCw0MCwwLDAsMCwxMTQsMzUsMCwwLDAsMTE0LDM3LDAsMCwwLDIxOCwKLSAgICAxMiw4MiwxMTcsMTEwLDExNiwxMDUsMTA5LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDM4LDAsCi0gICAgMCwwLDIxOCwxNCw2NSwxMTUsMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsCi0gICAgMTExLDExNCwxMTQsMzksMCwwLDAsMTE0LDM2LDAsMCwwLDExNCw0NywwLDAsCi0gICAgMCw0MSwyLDExNCwxOSwwLDAsMCwxMTQsNDMsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ3LDAsMCwKLSAgICAwLDExOSwwLDAsMCwxMTUsMjIsMCwwLDAsMCwxLDEyLDEsMTAsMSwKLSAgICAxNSwxLDEyLDEsMjEsMSwxNSwxLDE1LDEsOSwxLDksMSwxNSwxLAotICAgIDEyMiwxOSw5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsMTE0LDEwMSwKLSAgICAxMDgsMTAxLDk3LDExNSwxMDEsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwKLSAgICAwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMjUsMCwwLDAsMTAwLAotICAgIDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMTYsMiwwLDEyNCwwLAotICAgIDAsMTMxLDEsMCwxMzEsMiwwLDgzLDQxLDIsNzgsMTIyLDIzLDk1LDc3LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0MCwxMjMsMzMsMTE0LDEyNSw0MSwzMiw5NywKLSAgICAxMTYsMzIsMTIzLDEyNSw0MSwzLDIxOCw2LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTE0LDE1LAotICAgIDAsMCwwLDIxOCwyLDEwNSwxMDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDgsOTUsCi0gICAgOTUsMTE0LDEwMSwxMTIsMTE0LDk1LDk1LDEzMiwwLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDEsMTIyLDIwLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0NiwKLSAgICA5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsNzgsNDEsOSwxMTQsMSwwLDAsMCwKLSAgICAxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMywwLDAsMCwxMTQsCi0gICAgMjAsMCwwLDAsMTE0LDQ0LDAsMCwwLDExNCw0NiwwLDAsMCwxMTQsNDcsCi0gICAgMCwwLDAsMTE0LDUyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzIsMCwwLAotICAgIDAsNjgsMCwwLDAsMTE1LDEyLDAsMCwwLDEyLDQsNiwyLDEyLDgsCi0gICAgMTIsMTIsMTIsMjUsMTIsMTMsMTE0LDMyLDAsMCwwLDk5LDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsCi0gICAgMTE1LDcwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsMiwKLSAgICAwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwxMzIsMCwwLAotICAgIDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCw1LDAsMTAwLAotICAgIDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LDAsMTAwLDksCi0gICAgMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCw4Myw0MSwxMSwyMTgsMTYsOTUsCi0gICAgNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywxMjIsCi0gICAgODYsNjUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMDEsMzIsOTUsNzcsMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw3NiwxMTEsOTksMTA3LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsOTcsMTA4LDEwMSwxMTAsMTE2LAotICAgIDMyLDEwMiwxMTEsMTE0LDMyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsMzIsOTgsMTE3LDEwNSwxMDgsCi0gICAgMTAwLDExNSwzMiwxMTksMTA1LDExNiwxMDQsMTExLDExNywxMTYsMTAsMzIsMzIsMzIsMzIsMTA5LAotICAgIDExNywxMDgsMTE2LDEwNSw0NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNSwKLSAgICAxMTcsMTEyLDExMiwxMTEsMTE0LDExNiw0Niw5OSwyLDAsMCwwLDAsMCwwLDAsCi0gICAgMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwyMiwwLDAsCi0gICAgMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwwLDEwMCwxLDAsMTI0LDAsMCwKLSAgICA5NSwxLDAsMTAwLDAsMCw4Myw0MSwyLDc4LDExNCwzMywwLDAsMCw0MSwKLSAgICAyLDExNCwxNSwwLDAsMCwxMTQsMzgsMCwwLDAsNDEsMiwxMTQsMTksMCwKLSAgICAwLDAsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCwxNDAsMCwwLDAsMTE1LAotICAgIDQsMCwwLDAsMCwxLDksMSwxMjIsMjUsOTUsNjgsMTE3LDEwOSwxMDksMTIxLAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSw0OCwwLDAsMCwxMTYsMCwxMDYsMSwKKyAgICAxMzEsMCwxMjQsMCw5NSwyLDExNiwwLDEwNiwxLDEzMSwwLDEyNCwwLDk1LDMsCisgICAgMTI0LDEsMTI0LDAsOTUsNCwxMDAsMCwxMjQsMCw5NSw1LDEwMCwxLDEyNCwwLAorICAgIDk1LDYsMTAwLDEsMTI0LDAsOTUsNywxMDAsMCw4MywwLDQxLDIsNzgsMjMzLAorICAgIDAsMCwwLDAsNDEsOCwyMTgsNyw5NSwxMTYsMTA0LDExNCwxMDEsOTcsMTAwLDkwLAorICAgIDEzLDk3LDEwOCwxMDgsMTExLDk5LDk3LDExNiwxMDEsOTUsMTA4LDExMSw5OSwxMDcsMjE4LDQsCisgICAgMTA4LDExMSw5OSwxMDcsMjE4LDYsMTE5LDk3LDEwNywxMDEsMTE3LDExMiwxMTQsMTUsMCwwLAorICAgIDAsMjE4LDUsMTExLDExOSwxMTAsMTAxLDExNCwyMTgsNSw5OSwxMTEsMTE3LDExMCwxMTYsMjE4LAorICAgIDcsMTE5LDk3LDEwNSwxMTYsMTAxLDExNCwxMTUsNDEsMiwxMTQsMTksMCwwLDAsMTE0LAorICAgIDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDExNCwyMCwwLDAsMCw3NCwwLDAsMCwxMTUsMTIsMCwwLAorICAgIDAsMCwxLDEwLDEsMTAsMSw2LDEsNiwxLDYsMSwxMjIsMjAsOTUsCiAgICAgNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LAotICAgIDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKLSAgICAzLDAsMCwwLDY3LDAsMCwwLDExNSwxOSwwLDAsMCwxMjQsMCwwLAotICAgIDQsMTA2LDAsMCwxMDAsMSwwLDU1LDIsOTUsMCwwLDEwMCwyLDAsODMsCi0gICAgNDEsMyw3OCwxMTQsNDUsMCwwLDAsODQsNDEsMSwxMTQsMzgsMCwwLDAsCi0gICAgNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMTE0LDQ2LDAsMCwwLDE0NCwwLDAsMCwxMTUsCi0gICAgNCwwLDAsMCwwLDEsMTUsMSwxMjIsMjQsOTUsNjgsMTE3LDEwOSwxMDksMTIxLAotICAgIDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5Nyw5OSwxMTMsMTE3LDEwNSwKLSAgICAxMTQsMTAxLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDQ2LDAsMCwwLDEyNCwwLDAsMTA2LAotICAgIDAsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDI3LDAsMTE2LDEsMCwxMDAsMiwKLSAgICAwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMCwwLDQsMTA2LDAsMCwxMDAsMywKLSAgICAwLDU2LDIsOTUsMCwwLDEwMCwwLDAsODMsNDEsNCw3OCwxMTQsMzMsMCwKLSAgICAwLDAsMTIyLDMxLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiwxMTQsMTAxLDEwOCwxMDEsOTcsCi0gICAgMTE1LDEwMSwzMiwxMTcsMTEwLDQ1LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsMTAwLDMyLDEwOCwKLSAgICAxMTEsOTksMTA3LDExNCw0NSwwLDAsMCw0MSwyLDExNCwzOCwwLDAsMCwxMTQsCi0gICAgNDgsMCwwLDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ3LDAsMCwwLDE0OCwKLSAgICAwLDAsMCwxMTUsNiwwLDAsMCwwLDEsMTUsMSwxMiwxLDEyMiwyNCwKLSAgICA5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LAotICAgIDQ2LDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDI1LDAsCi0gICAgMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTE2LDIsCi0gICAgMCwxMjQsMCwwLDEzMSwxLDAsMTMxLDIsMCw4Myw0MSwyLDc4LDEyMiwyOCwKKyAgICAxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsCisgICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsNjQsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTMxLDAsMTI1LDEsMTI0LDAsMTA2LDIsMTI1LDIsMTIwLDQ0LDExNiwzLDEwNiwKKyAgICA0LDEyNCwyLDEzMSwxLDEyNSwzLDEyNCwzLDEwMCwwLDEwNyw4LDExNCwzOCwxMDAsCisgICAgMSw4MywwLDEyNCwzLDEwNiwyLDEyNSwyLDEyNCwyLDEyNCwxLDEwNywyLDExNCwKKyAgICAxNiwxMDAsMiw4MywwLDExMywxNiw4NywwLDEwMCwwLDgzLDAsNDEsMyw3OCwKKyAgICA3MCw4NCw0MSw1LDExNCwzNCwwLDAsMCwyMTgsOSwxMDMsMTAxLDExNiw5NSwxMDUsCisgICAgMTAwLDEwMSwxMTAsMTE2LDExNCwzNywwLDAsMCwyMTgsMTIsOTUsOTgsMTA4LDExMSw5OSwKKyAgICAxMDcsMTA1LDExMCwxMDMsOTUsMTExLDExMCwyMTgsMywxMDMsMTAxLDExNiw0MSw0LDExNCwxOSwKKyAgICAwLDAsMCw5MCwyLDEwOSwxMDEsMjE4LDMsMTE2LDEwNSwxMDAsMTE0LDM1LDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDIxOCwxMiwxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwxMTEsOTksMTA3LDgyLDAsCisgICAgMCwwLDExNSwxOCwwLDAsMCwwLDIsOCwxLDYsMSwyLDEsMTAsCisgICAgMSw4LDEsNCwxLDYsMSw4LDEsMTIyLDI0LDk1LDc3LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0NiwxMDQsOTcsMTE1LDk1LDEwMCwxMDEsOTcsMTAwLDEwOCwKKyAgICAxMTEsOTksMTA3LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDE2LDAsMCwwLDY3LDAsMCwwLDExNSwxNjgsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTMxLDAsMTI1LDEsMTI0LDAsMTE2LDIsMTI0LDEsNjAsMCwxMjIsMTM4LDEyMCwKKyAgICAxMzIsMTI0LDAsMTA2LDMsMTQzLDk2LDEsMCwxMjQsMCwxMDYsNCwxMDAsMSwxMDcsCisgICAgMiwxMTUsNDgsMTI0LDAsMTA2LDUsMTI0LDEsMTA3LDIsMTE0LDcyLDEyNCwxLDEyNCwKKyAgICAwLDk1LDUsMTI0LDAsNCwwLDEwNiw0LDEwMCwyLDU1LDAsMiwwLDk1LAorICAgIDQsMTAwLDMsODMsMCwxMjQsMCwxMDYsNiwxMzEsMCwxMTQsOTIsMTE2LDcsMTAwLAorICAgIDQsMTI0LDAsMjIsMCwxMzEsMSwxMzAsMSwxMjQsMCwxMDYsOCwxMDYsOSwxMDAsCisgICAgNSwxMzEsMSwxMTQsMTE4LDEyNCwwLDQsMCwxMDYsMTAsMTAwLDIsNTUsMCwyLAorICAgIDAsOTUsMTAsODcsMCwxMDAsNiw4MSwwLDgyLDAsODgsMCwxMjQsMCwxMDYsCisgICAgOCwxMDYsOSwxMzEsMCwxLDAsMTI0LDAsMTA2LDgsMTA2LDExLDEzMSwwLDEsCisgICAgMCwxMTMsMjAsODcsMCw4NywwLDEwMCw2LDExNiwyLDEyNCwxLDYxLDAsODgsCisgICAgMCwxMDAsNiw4MywwLDQxLDcsMTIyLDE4NSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiw2NSw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTksMTA3LDQ2LDMyLDMyLDczLDEwMiwzMiw5NywKKyAgICAzMiwxMTIsMTExLDExNiwxMDEsMTEwLDExNiwxMDUsOTcsMTA4LDMyLDEwMCwxMDEsOTcsMTAwLDEwOCwKKyAgICAxMTEsOTksMTA3LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTYsMTAxLDk5LDExNiwxMDEsMTAwLDQ0LAorICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDk3LDMyLDk1LDY4LDEwMSw5NywxMDAsCisgICAgMTA4LDExMSw5OSwxMDcsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwKKyAgICAxMTUsMTAxLDEwMCw0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OSwxMTYsMTA0LAorICAgIDEwMSwxMTQsMTE5LDEwNSwxMTUsMTAxLDQ0LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTksMTA3LAorICAgIDMyLDEwNSwxMTUsMzIsOTcsMTA4LDExOSw5NywxMjEsMTE1LDMyLDk3LDk5LDExMywxMTcsMTA1LAorICAgIDExNCwxMDEsMTAwLDMyLDk3LDExMCwxMDAsMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LDExNSwzMiwKKyAgICAxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDExNCwzMywwLDAsMCwyMzMsMSwwLDAsMCw4NCwxMjIsMjMsMTAwLAorICAgIDEwMSw5NywxMDAsMTA4LDExMSw5OSwxMDcsMzIsMTAwLDEwMSwxMTYsMTAxLDk5LDExNiwxMDEsMTAwLAorICAgIDMyLDk4LDEyMSwzMiwzNywxMTQsNzAsNzgsNDEsMTIsMTE0LDM0LDAsMCwwLDExNCwKKyAgICA0MCwwLDAsMCwxMTQsNDEsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwzOCwKKyAgICAwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDQ0LDAsMCwwLDExNCwzMSwwLAorICAgIDAsMCwxMTQsMzYsMCwwLDAsMjE4LDcsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSwKKyAgICAxMTQsMzksMCwwLDAsMjE4LDcsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsNDEsMiwKKyAgICAxMTQsMTksMCwwLDAsMTE0LDQzLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw0NiwwLDAsMCw5NCwwLAorICAgIDAsMCwxMTUsMzIsMCwwLDAsMCw2LDgsMSw4LDEsMiwxLDIsCisgICAgMSw4LDEsMjAsMSw2LDEsMTQsMSw0LDEsOCwxLDEyLDEsMTIsCisgICAgMSwyNCwyLDEwLDEsMTgsMiwxMjIsMTksOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA3NiwxMTEsOTksMTA3LDQ2LDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMTAsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDEyMiwwLDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwxMjUsMSwxMjQsMCwKKyAgICAxMDYsMiwxNDMsOTgsMSwwLDEyNCwwLDEwNiwzLDEyNCwxLDEwNywzLDExNCwzNCwKKyAgICAxMTYsNCwxMDAsMSwxMzEsMSwxMzAsMSwxMjQsMCwxMDYsNSwxMDAsMiwxMDcsNCwKKyAgICAxMTUsNDgsMTE2LDYsMTMwLDEsMTI0LDAsNCwwLDEwNiw1LDEwMCwzLDU2LDAsCisgICAgMiwwLDk1LDUsMTI0LDAsMTA2LDUsMTAwLDIsMTA3LDIsMTE0LDEwOCwxMDAsMCwKKyAgICAxMjQsMCw5NSwzLDEyNCwwLDEwNiw3LDExNCwxMDgsMTI0LDAsNCwwLDEwNiw3LAorICAgIDEwMCwzLDU2LDAsMiwwLDk1LDcsMTI0LDAsMTA2LDgsMTA2LDksMTMxLDAsCisgICAgMSwwLDg3LDAsMTAwLDAsODEsMCw4MiwwLDg4LDAsMTAwLDAsODMsMCwKKyAgICA0MSw0LDc4LDEyMiwzMSw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsMTE0LDEwMSwxMDgsMTAxLAorICAgIDk3LDExNSwxMDEsMzIsMTE3LDExMCw0NSw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDEwMCwzMiwKKyAgICAxMDgsMTExLDk5LDEwNywxMTQsMzMsMCwwLDAsMTE0LDQ1LDAsMCwwLDQxLDEwLAorICAgIDExNCwzNCwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwKKyAgICAzNywwLDAsMCwyMTgsMTIsODIsMTE3LDExMCwxMTYsMTA1LDEwOSwxMDEsNjksMTE0LDExNCwKKyAgICAxMTEsMTE0LDExNCwzOCwwLDAsMCwyMTgsMTQsNjUsMTE1LDExNSwxMDEsMTE0LDExNiwxMDUsCisgICAgMTExLDExMCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDM5LDAsMCwwLDExNCwzNiwwLDAsCisgICAgMCwxMTQsNDcsMCwwLDAsNDEsMiwxMTQsMTksMCwwLDAsMTE0LDQzLDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKKyAgICAwLDExNCw0NywwLDAsMCwxMTksMCwwLDAsMTE1LDIyLDAsMCwwLDAsCisgICAgMSw4LDEsOCwxLDEwLDEsOCwxLDE0LDEsMTQsMSwxMCwxLDYsCisgICAgMSw2LDEsMTQsMSwxMjIsMTksOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsCisgICAgOTksMTA3LDQ2LDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk5LDEsMCwwLDAsMCwKKyAgICAwLDAsMCwxLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDE4LDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDExNiwyLDEyNCwwLAorICAgIDEzMSwxLDEzMSwyLDgzLDAsNDEsMiw3OCwxMjIsMjMsOTUsNzcsMTExLDEwMCwxMTcsCisgICAgMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQwLDEyMywzMywxMTQsMTI1LDQxLDMyLDk3LDExNiwzMiwKKyAgICAxMjMsMTI1LDQxLDMsMjE4LDYsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMTQsMTUsMCwwLAorICAgIDAsMjE4LDIsMTA1LDEwMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsOCw5NSw5NSwxMTQsCisgICAgMTAxLDExMiwxMTQsOTUsOTUsMTMyLDAsMCwwLDExNSwyLDAsMCwwLDAsMSwKKyAgICAxMjIsMjAsOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDk1LDk1LAorICAgIDExNCwxMDEsMTEyLDExNCw5NSw5NSw3OCw0MSw5LDExNCwxLDAsMCwwLDExNCwwLAorICAgIDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsMCwwLDExNCwyMCwwLAorICAgIDAsMCwxMTQsNDQsMCwwLDAsMTE0LDQ2LDAsMCwwLDExNCw0NywwLDAsCisgICAgMCwxMTQsNTIsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwzMiwwLDAsMCw2OCwKKyAgICAwLDAsMCwxMTUsMTIsMCwwLDAsOCw0LDQsMiw4LDgsOCwxMiwKKyAgICA4LDI1LDgsMTMsMTE0LDMyLDAsMCwwLDk5LDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLDAsMTE1LDQ4LAorICAgIDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwKKyAgICAyLDEwMCwzLDEzMiwwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsCisgICAgNiwxMDAsNywxMzIsMCw5MCw2LDEwMCw4LDEwMCw5LDEzMiwwLDkwLDcsMTAwLAorICAgIDEwLDgzLDAsNDEsMTEsMjE4LDE2LDk1LDY4LDExNywxMDksMTA5LDEyMSw3NywxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsMTIyLDg2LDY1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsCisgICAgMTAxLDMyLDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywzMiwxMDEsMTEzLAorICAgIDExNywxMDUsMTE4LDk3LDEwOCwxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiw4MCwxMjEsMTE2LAorICAgIDEwNCwxMTEsMTEwLDMyLDk4LDExNywxMDUsMTA4LDEwMCwxMTUsMzIsMTE5LDEwNSwxMTYsMTA0LDExMSwKKyAgICAxMTcsMTE2LDEwLDMyLDMyLDMyLDMyLDEwOSwxMTcsMTA4LDExNiwxMDUsNDUsMTE2LDEwNCwxMTQsCisgICAgMTAxLDk3LDEwMCwxMDUsMTEwLDEwMywzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsNDYsOTksCisgICAgMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTI0LDEsMTI0LDAsOTUsMCwxMDAsCisgICAgMSwxMjQsMCw5NSwxLDEwMCwwLDgzLDAsNDEsMiw3OCwxMTQsMzMsMCwwLAorICAgIDAsNDEsMiwxMTQsMTUsMCwwLDAsMTE0LDM4LDAsMCwwLDQxLDIsMTE0LAorICAgIDE5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsMTQwLDAsMCwKKyAgICAwLDExNSw0LDAsMCwwLDAsMSw2LDEsMTIyLDI1LDk1LDY4LDExNywxMDksCisgICAgMTA5LDEyMSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNDYsOTUsOTUsMTA1LAorICAgIDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDEyNCwKKyAgICAwLDQsMCwxMDYsMCwxMDAsMSw1NSwwLDIsMCw5NSwwLDEwMCwyLDgzLAorICAgIDAsNDEsMyw3OCwxMTQsNDUsMCwwLDAsODQsNDEsMSwxMTQsMzgsMCwwLAorICAgIDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDQ2LDAsMCwwLDE0NCwwLDAsMCwKKyAgICAxMTUsNCwwLDAsMCwwLDEsMTQsMSwxMjIsMjQsOTUsNjgsMTE3LDEwOSwxMDksCisgICAgMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw0Niw5Nyw5OSwxMTMsMTE3LAorICAgIDEwNSwxMTQsMTAxLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM2LDAsMCwwLDEyNCwwLDEwNiwKKyAgICAwLDEwMCwxLDEwNywyLDExNCwxOCwxMTYsMSwxMDAsMiwxMzEsMSwxMzAsMSwxMjQsCisgICAgMCw0LDAsMTA2LDAsMTAwLDMsNTYsMCwyLDAsOTUsMCwxMDAsMCw4MywKKyAgICAwLDQxLDQsNzgsMTE0LDMzLDAsMCwwLDEyMiwzMSw5OSw5NywxMTAsMTEwLDExMSwKKyAgICAxMTYsMzIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE3LDExMCw0NSw5Nyw5OSwxMTMsCisgICAgMTE3LDEwNSwxMTQsMTAxLDEwMCwzMiwxMDgsMTExLDk5LDEwNywxMTQsNDUsMCwwLDAsNDEsCisgICAgMiwxMTQsMzgsMCwwLDAsMTE0LDQ4LDAsMCwwLDQxLDEsMTE0LDE5LDAsCisgICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKKyAgICAwLDExNCw0NywwLDAsMCwxNDgsMCwwLDAsMTE1LDYsMCwwLDAsMCwKKyAgICAxLDEwLDEsOCwxLDEyMiwyNCw5NSw2OCwxMTcsMTA5LDEwOSwxMjEsNzcsMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDQ2LDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk5LAorICAgIDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDQsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwKKyAgICAxLDExNiwyLDEyNCwwLDEzMSwxLDEzMSwyLDgzLDAsNDEsMiw3OCwxMjIsMjgsCiAgICAgOTUsNjgsMTE3LDEwOSwxMDksMTIxLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNywKICAgICA0MCwxMjMsMzMsMTE0LDEyNSw0MSwzMiw5NywxMTYsMzIsMTIzLDEyNSw0MSwzLDExNCw1MCwKICAgICAwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDUxLDAsMCwwLDQxLDEsMTE0LApAQCAtMzQ1LDI2MiArMzE3LDI0OSBAQAogICAgIDExNCwzLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LAogICAgIDQ3LDAsMCwwLDExNCw1MiwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAogICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDUzLDAsCi0gICAgMCwwLDEzNiwwLDAsMCwxMTUsMTAsMCwwLDAsMTIsMiw2LDIsMTIsCi0gICAgNCwxMiw0LDEyLDUsMTE0LDUzLDAsMCwwLDk5LDAsMCwwLDAsMCwKKyAgICAwLDAsMTM2LDAsMCwwLDExNSwxMCwwLDAsMCw4LDIsNCwyLDgsCisgICAgNCw4LDQsOCw1LDExNCw1MywwLDAsMCw5OSwwLDAsMCwwLDAsCiAgICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSwKLSAgICA1MiwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwKLSAgICAxMDAsMSwwLDEwMCwyLDAsMTMyLDAsMCw5MCwzLDAsMTAwLDMsMCwxMDAsCi0gICAgNCwwLDEzMiwwLDAsOTAsNCwwLDEwMCw1LDAsMTAwLDYsMCwxMzIsMCwKLSAgICAwLDkwLDUsMCwxMDAsNywwLDgzLDQxLDgsMjE4LDE4LDk1LDc3LDExMSwxMDAsCisgICAgMzYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDEwMCwyLAorICAgIDEzMiwwLDkwLDMsMTAwLDMsMTAwLDQsMTMyLDAsOTAsNCwxMDAsNSwxMDAsNiwKKyAgICAxMzIsMCw5MCw1LDEwMCw3LDgzLDAsNDEsOCwyMTgsMTgsOTUsNzcsMTExLDEwMCwKICAgICAxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCw5OSwyLAogICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwyMiwwLDAsMCwxMjQsMSwwLDEyNCwwLDAsOTUsMCwKLSAgICAwLDEwMCwwLDAsMTI0LDAsMCw5NSwxLDAsMTAwLDAsMCw4Myw0MSwxLAotICAgIDc4LDQxLDIsMTE0LDE4LDAsMCwwLDIxOCw1LDk1LDEwOCwxMTEsOTksMTA3LDQxLAotICAgIDIsMTE0LDE5LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjAsMCwwLDAsMTU5LAotICAgIDAsMCwwLDExNSw0LDAsMCwwLDAsMSw5LDEsMTIyLDI3LDk1LDc3LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLDk5LDEwNyw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTQsCi0gICAgNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDEwLDAsMCwwLDY3LDAsMCwwLDExNSw1MywKLSAgICAwLDAsMCwxMjIsMjIsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsCi0gICAgMSwwLDEyNCwwLDAsOTUsMiwwLDg3LDEwMCwwLDAsMTE2LDMsMCwxMDYsCi0gICAgNCwwLDEzMSwwLDAsMSw4OCwxMjQsMCwwLDEwNiwyLDAsMTA2LDUsMCwKLSAgICAxMzEsMCwwLDEsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDYsMjE4LDE2LDk1LAotICAgIDEwMywxMDEsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCwKLSAgICAxOCwwLDAsMCwxMTQsNTUsMCwwLDAsMjE4LDQsOTUsMTA1LDEwOSwxMTIsMjE4LAotICAgIDEyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNCw0NiwwLAotICAgIDAsMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjMsMCwwLDAsMTYzLDAsMCwKLSAgICAwLDExNSw4LDAsMCwwLDAsMSwzLDEsMjIsMiwxMSwxLDEyMiwyOCwKLSAgICA5NSw3NywxMTEsMTAwLDExNywxMDgsMTAxLDc2LDExMSw5OSwxMDcsNzcsOTcsMTEwLDk3LDEwMywKLSAgICAxMDEsMTE0LDQ2LDk1LDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsOTUsOTUsOTksMSwwLDAsCi0gICAgMCwwLDAsMCwwLDMsMCwwLDAsMSwwLDAsMCw3OSwwLDAsCi0gICAgMCwxMTUsMTcsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEwNiwxLDAsMTMxLAotICAgIDAsMCwxLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCw1NSwwLDAsCi0gICAgMCwxMTQsNDcsMCwwLDAsNDEsMywxMTQsMTksMCwwLDAsMTE0LDI5LDAsCi0gICAgMCwwLDkwLDYsMTA3LDExOSw5NywxMTQsMTAzLDExNSwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzAsMCwwLDAsMTcwLDAsCi0gICAgMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjcsOTUsNzcsMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCw0Niw5NSw5NSwKLSAgICAxMDEsMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsNiwxMTQsMSwwLDAsMCwxMTQsMCwKLSAgICAwLDAsMCwxMTQsMiwwLDAsMCwxMTQsMjAsMCwwLDAsMTE0LDIzLDAsCi0gICAgMCwwLDExNCwzMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDU0LDAsMCwwLAotICAgIDE1NywwLDAsMCwxMTUsNiwwLDAsMCwxMiwyLDEyLDQsMTIsNywxMTQsCi0gICAgNTQsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLAotICAgIDAsMTEsMCwwLDAsMywwLDAsMCwxMTUsMTM5LDAsMCwwLDEwMCwxLAotICAgIDAsMTI1LDEsMCwxMjEsMTcsMCwxMTYsMCwwLDEzNiwwLDAsMjUsMTMxLDAsCi0gICAgMCwxMjUsMSwwLDg3LDExMCwxOCwwLDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsCi0gICAgNDMsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOCwwLDExNCwxMzUsMCwxMTYsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsCi0gICAgODMsMCwxMTYsMywwLDEzNiwwLDAsMTMxLDEsMCwxMjUsMSwwLDExMCwxMiwKLSAgICAwLDExNiw0LDAsMTM2LDAsMCwxMzEsMSwwLDEyNSwxLDAsMTM1LDAsMCwKLSAgICAxMDIsMSwwLDEwMCwyLDAsMTAwLDMsMCwxMzQsMCwwLDEyNSwyLDAsMTE2LAotICAgIDUsMCwxMDYsNiwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDExNiwwLAotICAgIDAsMTM2LDAsMCw2MCwxMjQsMSwwLDgzLDQxLDQsMTIyLDEwOSw3MSwxMDEsMTE2LAotICAgIDMyLDExMSwxMTQsMzIsOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDk3LAotICAgIDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LAotICAgIDEwOSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwKLSAgICAxMTEsMTEwLDEwOCwxMjEsMzIsOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTksCi0gICAgMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LAotICAgIDExMSw5OSwxMDcsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDQ2LDc4LDk5LDEsMCwwLDAsCi0gICAgMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsMTksMCwwLDAsCi0gICAgMTE1LDExLDAsMCwwLDExNiwwLDAsMTM2LDAsMCw2MSwxMDAsMCwwLDgzLAotICAgIDQxLDEsNzgsNDEsMSwyMTgsMTMsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTA4LAotICAgIDExMSw5OSwxMDcsMTE1LDQxLDEsMjE4LDEsOTUsNDEsMSwxMTQsMTUsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMiw5OSw5OCwxOTAsMCwKLSAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw5NSwxMDMsMTAxLDExNiw5NSwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMDgsMTExLDk5LDEwNyw0Niw2MCwxMDgsMTExLDk5LAotICAgIDk3LDEwOCwxMTUsNjIsNDYsOTksOTgsNDEsNywxMTQsNTksMCwwLDAsMTE0LDI4LAotICAgIDAsMCwwLDExNCwzNCwwLDAsMCwxMTQsNTMsMCwwLDAsMTE0LDMyLDAsCi0gICAgMCwwLDIxOCw4LDk1LDExOSwxMDEsOTcsMTA3LDExNCwxMDEsMTAyLDkwLDMsMTE0LDEwMSwKLSAgICAxMDIsNDEsMywxMTQsMTUsMCwwLDAsMTE0LDM1LDAsMCwwLDExNCw2MSwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsMTUsMCwwLDAsMTE0LDExLAotICAgIDAsMCwwLDExNCw1NiwwLDAsMCwxNzYsMCwwLDAsMTE1LDI0LDAsMCwKLSAgICAwLDAsNCw2LDEsMywxLDE3LDEsMTMsMSw1LDEsMTIsMSwxMiwKLSAgICAxLDE1LDIsMTIsMSwxOCwyLDIyLDEsMTE0LDU2LDAsMCwwLDk5LDEsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDExLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSw3MSwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTMxLDEsCi0gICAgMCwxMjUsMSwwLDExNiwxLDAsMTA2LDIsMCwxMzEsMCwwLDEsMTIxLDE0LAotICAgIDAsMTI0LDEsMCwxMDYsMywwLDEzMSwwLDAsMSw4NywxMTAsMTgsMCw0LAotICAgIDExNiw0LDAsMTA3LDEwLDAsMTE0LDU2LDAsMSwxLDEsODksMTEwLDExLDAsCi0gICAgODgsMTI0LDEsMCwxMDYsNSwwLDEzMSwwLDAsMSwxMDAsMSwwLDgzLDQxLAotICAgIDIsOTcsMjEsMSwwLDAsODIsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMDMsMTA4LDExMSw5OCw5NywxMDgsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTA4LDExMSw5OSwxMDcsNDQsMzIsOTcsMTEwLDEwMCwzMiw5Nyw5OSwxMTMsMTE3LDEwNSwxMTQsCi0gICAgMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsMTE0LDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsCi0gICAgMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA4LAotICAgIDExMSw5OSwxMDcsMzIsMTAyLDExMSwxMTQsMzIsOTcsMzIsMTAzLDEwNSwxMTgsMTAxLDExMCwzMiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw0NiwxMCwzMiwzMiwzMiwKLSAgICAzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLAotICAgIDMyLDEwMSwxMTAsMTE1LDExNywxMTQsMTAxLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDMyLDEwNSwxMTUsMzIsOTksMTExLDEwOSwxMTIsMTA4LDEwMSwxMTYsMTAxLDEwOCwxMjEsMzIsMTA1LAotICAgIDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsMTAwLDQ0LDMyLDEwNSwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTAxLDExOCwxMDEsMTEwLDExNiwzMiwxMDUsMTE2LDMyLAotICAgIDEwNSwxMTUsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwKLSAgICAxMDAsMzIsOTgsMTIxLDMyLDk3LDExMCwxMTEsMTE2LDEwNCwxMDEsMTE0LDMyLDExNiwxMDQsMTE0LAotICAgIDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwKLSAgICAzMiwxMTEsMTEwLDEwOCwxMjEsMzIsOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwKLSAgICAxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTA4LDExMSw5OSwxMDcsMzIsMTE2LDk3LDEwNywxMDEsMTEwLDQ2LDc4LDQxLDYsMTE0LDU2LAotICAgIDAsMCwwLDExNCw1NywwLDAsMCwxMTQsNTgsMCwwLDAsMTE0LDQ2LDAsCi0gICAgMCwwLDExNCwzMSwwLDAsMCwxMTQsNDcsMCwwLDAsNDEsMiwxMTQsMTUsCi0gICAgMCwwLDAsMTE0LDM1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxOSw5NSwxMDgsMTExLDk5LDEwNyw5NSwxMTcsCi0gICAgMTEwLDEwOCwxMTEsOTksMTA3LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE5NSwwLDAsMCwKLSAgICAxMTUsMTQsMCwwLDAsMCw3LDEyLDEsMTAsMSwzLDEsMTQsMSwxMywKLSAgICAzLDUsMiwxMTQsNjMsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKLSAgICAwLDMsMCwwLDAsMywwLDAsMCw3OSwwLDAsMCwxMTUsMTMsMCwKLSAgICAwLDAsMTI0LDAsMCwxMjQsMSwwLDEyNCwyLDAsMTQyLDAsMCw4Myw0MSwKLSAgICAxLDk3LDQ2LDEsMCwwLDExNCwxMDEsMTA5LDExMSwxMTgsMTAxLDk1LDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsOTUsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMDUsMTEwLAotICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDk5LDMyLDExOSwxMDUsMTA4LDEwOCwzMiw5NywKLSAgICAxMDgsMTE5LDk3LDEyMSwxMTUsMzIsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMzIsMTE1LDEwMSwxMTMsCi0gICAgMTE3LDEwMSwxMTAsOTksMTAxLDExNSwxMCwzMiwzMiwzMiwzMiwxMTEsMTAyLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMTYsCi0gICAgMTA0LDk3LDExNiwzMiwxMDEsMTEwLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsOTcsMzIsOTksCi0gICAgOTcsMTA4LDEwOCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDIsMTE3LDExMCw5OSwKLSAgICAxMTYsMTA1LDExMSwxMTAsMTAsMTAsMzIsMzIsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDUsMTE2LAotICAgIDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDMyLDExMSwxMDIsMzIsOTcsMzIsMTEwLDExMSwKLSAgICAxMTQsMTA5LDk3LDEwOCwzMiw5OSw5NywxMDgsMTA4LDMyLDEwNSwxMTAsMzIsMTEyLDEwOCw5NywKLSAgICA5OSwxMDEsMTE1LDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDExMCw5OSwxMDgsMTE3LDEwMCwKLSAgICAxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAotICAgIDk4LDEwLDMyLDMyLDMyLDMyLDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsMzIsMTA1LDExMCwxMTYsCi0gICAgMTE0LDExMSwxMDAsMTE3LDk5LDEwMSwxMTUsMzIsMTE3LDExMCwxMTksOTcsMTEwLDExNiwxMDEsMTAwLAotICAgIDMyLDExMCwxMTEsMTA1LDExNSwxMDEsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExNiwxMTQsOTcsOTksMTAxLDk4LDk3LDk5LDEwNywzMiw0MCwxMDEsNDYsMTAzLDQ2LDMyLAotICAgIDExOSwxMDQsMTAxLDExMCwzMiwxMDEsMTIwLDEwMSw5OSwxMTcsMTE2LDEwNSwxMTAsMTAzLDEwLDMyLAotICAgIDMyLDMyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQxLDEwLAotICAgIDMyLDMyLDMyLDMyLDExNCwxMCwwLDAsMCw0MSwzLDIxOCwxLDEwMiwxMTQsMjksCi0gICAgMCwwLDAsOTAsNCwxMDcsMTE5LDEwMCwxMTUsMTE0LDEwLDAsMCwwLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDI1LDk1LDk5LDk3LDEwOCwxMDgsOTUsCi0gICAgMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LDEwMSwxMTUsOTUsMTE0LDEwMSwxMDksMTExLAotICAgIDExOCwxMDEsMTAwLDIxNCwwLDAsMCwxMTUsMiwwLDAsMCwwLDgsMTE0LDY1LAotICAgIDAsMCwwLDIxOCw5LDExOCwxMDEsMTE0LDk4LDExMSwxMTUsMTA1LDExNiwxMjEsMTE0LDQ1LAotICAgIDAsMCwwLDk5LDEsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLAotICAgIDQsMCwwLDAsNzEsMCwwLDAsMTE1LDc1LDAsMCwwLDExNiwwLDAsCi0gICAgMTA2LDEsMCwxMDYsMiwwLDEyNCwxLDAsMTA3LDUsMCwxMTQsNzEsMCwxMjQsCi0gICAgMCwwLDEwNiwzLDAsMTAwLDYsMCwxMzEsMSwwLDExNSw0MywwLDEwMCwzLAotICAgIDAsMTI0LDAsMCwyMywxMjUsMCwwLDExNiw0LDAsMTI0LDAsMCwxMDYsNSwKLSAgICAwLDEyNCwyLDAsMTQwLDAsMCwxMDAsNCwwLDExNiwwLDAsMTA2LDYsMCwKLSAgICAxMzEsMSwxLDEsMTAwLDUsMCw4Myw0MSw3LDEyMiw2MSw4MCwxMTQsMTA1LDExMCwKLSAgICAxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMzIsMTE2LDExMSwKLSAgICAzMiwxMTUsMTE2LDEwMCwxMDEsMTE0LDExNCwzMiwxMDUsMTAyLDMyLDQ1LDExOCw0Nyw4MCw4OSwKLSAgICA4NCw3Miw3OSw3OCw4Niw2OSw4Miw2Niw3OSw4Myw2OSwzMiwxMDUsMTE1LDMyLDExNiwKLSAgICAxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDExMSwxMTAsNDYsMjUwLDEsMzUsMjUwLDcsMTA1LDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMzIsMTIyLDIsMzUsMzIsOTAsNCwxMDIsMTA1LDEwOCwxMDEsNzgsCi0gICAgNDEsMiwxMTQsNjcsMCwwLDAsMTE0LDY4LDAsMCwwLDQxLDcsMTE0LDE0LAotICAgIDAsMCwwLDIxOCw1LDEwMiwxMDgsOTcsMTAzLDExNSwyMTgsNywxMTgsMTAxLDExNCw5OCwKLSAgICAxMTEsMTE1LDEwMSwyMTgsMTAsMTE1LDExNiw5NywxMTQsMTE2LDExNSwxMTksMTA1LDExNiwxMDQsMjE4LAotICAgIDUsMTEyLDExNCwxMDUsMTEwLDExNiwxMTQsNTAsMCwwLDAsMjE4LDYsMTE1LDExNiwxMDAsCi0gICAgMTAxLDExNCwxMTQsNDEsMywyMTgsNywxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwxMTQsNjYsCi0gICAgMCwwLDAsMTE0LDI5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMTgsMTAxLDExNCw5OCwxMTEsMTE1LAotICAgIDEwMSw5NSwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwyMjUsMCwwLDAsMTE1LDgsMCwKLSAgICAwLDAsMCwyLDE4LDEsMTUsMSwxMCwxLDExNCw3NSwwLDAsMCw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLAotICAgIDMsMCwwLDAsMTE1LDM1LDAsMCwwLDEzNSwwLDAsMTAyLDEsMCwxMDAsCi0gICAgMSwwLDEwMCwyLDAsMTM0LDAsMCwxMjUsMSwwLDExNiwwLDAsMTI0LDEsCi0gICAgMCwxMzYsMCwwLDEzMSwyLDAsMSwxMjQsMSwwLDgzLDQxLDMsMTIyLDQ5LAotICAgIDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsMzIsMTE4LDEwMSwxMTQsCi0gICAgMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsCi0gICAgNDYsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLAotICAgIDAsMCwxOSwwLDAsMCwxMTUsNTUsMCwwLDAsMTI0LDEsMCwxMTYsMCwKLSAgICAwLDEwNiwxLDAsMTA3LDcsMCwxMTQsNDIsMCwxMTYsMiwwLDEwMCwxLDAsCi0gICAgMTA2LDMsMCwxMjQsMSwwLDEzMSwxLDAsMTAwLDIsMCwxMjQsMSwwLDEzMSwKLSAgICAxLDEsMTMwLDEsMCwxMzYsMCwwLDEyNCwwLDAsMTI0LDEsMCwxMzEsMiwKLSAgICAwLDgzLDQxLDMsNzgsMTIyLDI5LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLAotICAgIDExMSwxMTYsMzIsOTcsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE0LDE1LDAsMCwwLDQxLDQsMTE0LDE0LDAsMCwwLAotICAgIDIxOCwyMCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMjE4LDExLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LAotICAgIDExNCwxMTEsMTE0LDExNCw1MCwwLDAsMCw0MSwyLDExNCwxOSwwLDAsMCwyMTgsCi0gICAgOCwxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsNDEsMSwyMTgsMywxMDIsMTIwLDExMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwyNSw5NSwxMTQsMTAxLDExMywKLSAgICAxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExOSwxMTQsCi0gICAgOTcsMTEyLDExMiwxMDEsMTE0LDIzNSwwLDAsMCwxMTUsOCwwLDAsMCwwLDEsCi0gICAgMTUsMSwxOCwxLDksMSwxMjIsNTIsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLAotICAgIDExNSw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwKLSAgICAxMTUsNjIsNDYsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsMTA1LAotICAgIDEwOCwxMTYsMTA1LDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCw0MSwxLDExNCwxMiwKLSAgICAwLDAsMCw0MSwyLDExNCw3OSwwLDAsMCwxMTQsODAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDQxLDEsMTE0LDc5LDAsMCwwLDExNCwxMSwwLDAsMCwKLSAgICAyMTgsMTcsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSw5OCwxMTcsMTA1LDEwOCwKLSAgICAxMTYsMTA1LDExMCwyMzMsMCwwLDAsMTE1LDYsMCwwLDAsMCwyLDE4LDUsCi0gICAgMTMsMSwxMTQsODEsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLAotICAgIDIsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDExNSwzNSwwLDAsCi0gICAgMCwxMzUsMCwwLDEwMiwxLDAsMTAwLDEsMCwxMDAsMiwwLDEzNCwwLDAsCi0gICAgMTI1LDEsMCwxMTYsMCwwLDEyNCwxLDAsMTM2LDAsMCwxMzEsMiwwLDEsCi0gICAgMTI0LDEsMCw4Myw0MSwzLDEyMiw0Nyw2OCwxMDEsOTksMTExLDExNCw5NywxMTYsMTExLAotICAgIDExNCwzMiwxMTYsMTExLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExMCw5NywxMDksMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLAotICAgIDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDQ2LDk5LDIsMCwwLDAsMCwwLDAsMCwKLSAgICAyLDAsMCwwLDQsMCwwLDAsMTksMCwwLDAsMTE1LDU1LDAsMCwKLSAgICAwLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwxLDAsMTE1LDQyLDAsCi0gICAgMTE2LDIsMCwxMDAsMSwwLDEwNiwzLDAsMTI0LDEsMCwxMzEsMSwwLDEwMCwKLSAgICAyLDAsMTI0LDEsMCwxMzEsMSwxLDEzMCwxLDAsMTM2LDAsMCwxMjQsMCwKLSAgICAwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwzLDc4LDEyMiwyNywxMjMsMzMsMTE0LAotICAgIDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsCi0gICAgMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxNSwwLDAsMCw0MSw0LDExNCwKLSAgICA1NywwLDAsMCwyMTgsOSwxMDUsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDExNCwKLSAgICA3NywwLDAsMCwxMTQsNTAsMCwwLDAsNDEsMiwxMTQsMTksMCwwLDAsCi0gICAgMTE0LDc4LDAsMCwwLDQxLDEsMTE0LDc5LDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMjE4LDI0LDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwKLSAgICAxMTUsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsCi0gICAgMjQ2LDAsMCwwLDExNSw4LDAsMCwwLDAsMSwxNSwxLDE4LDEsOSwKLSAgICAxLDEyMiw1MCw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLAotICAgIDEyMiwxMDEsMTEwLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTQsMTAxLAotICAgIDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDExOSwxMTQsCi0gICAgOTcsMTEyLDExMiwxMDEsMTE0LDQxLDEsMTE0LDEyLDAsMCwwLDQxLDIsMTE0LDc5LAotICAgIDAsMCwwLDExNCw4MywwLDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsCi0gICAgNzksMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNiw5NSwxMTQsMTAxLDExMywxMTcsCi0gICAgMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDI0NCwwLDAsMCwxMTUsCi0gICAgNiwwLDAsMCwwLDIsMTgsNSwxMywxLDExNCw4NCwwLDAsMCw5OSwKLSAgICAyLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw4MSwwLDAsMCwxMTYsMCwwLDEyNCwxLDAsMTI0LAotICAgIDAsMCwxMzEsMiwwLDEyNSwyLDAsMTI0LDEsMCwxMTYsMSwwLDEwNiwyLAotICAgIDAsMTA3LDYsMCwxMTQsNjcsMCwxMTYsMSwwLDEwNiwyLDAsMTI0LDEsMCwKLSAgICAyNSwxMjUsMywwLDExNiwzLDAsMTI0LDIsMCwxMjQsMywwLDEzMSwyLDAsCi0gICAgMSwxMTYsMSwwLDEwNiwyLDAsMTI0LDEsMCwyNSw4MywxMTYsNCwwLDEyNCwKLSAgICAyLDAsMTMxLDEsMCw4MywxMDAsMSwwLDgzLDQxLDIsMTIyLDEyOCw3NiwxMTEsCi0gICAgOTcsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNSwxMjEsMTE1LAotICAgIDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDMyLDEwNSwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwKLSAgICAxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCi0gICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwKLSAgICAxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCw0MSwKLSAgICA1LDIxOCwxNiwxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTA4LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDIxOCw1LDk1LAotICAgIDEwMSwxMjAsMTAxLDk5LDIxOCw1LDk1LDEwOCwxMTEsOTcsMTAwLDQxLDQsMTE0LDE5LDAsCi0gICAgMCwwLDExNCw3OCwwLDAsMCwyMTgsNCwxMTUsMTEyLDEwMSw5OSwyMTgsNiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMSwwLDAsMCwyMTgsMTcsOTUsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LAotICAgIDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDAsMSwwLDAsMTE1LDEyLDAsMCwwLAotICAgIDAsNiwxNSwxLDE1LDEsMTMsMSwxMywxLDExLDIsMTE0LDkwLDAsMCwKLSAgICAwLDk5LDEsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDM1LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw2LDEsMCwwLDExNiwwLDAsMTI0LDAsCi0gICAgMCwxMDAsMSwwLDEwMCwwLDAsMTMxLDMsMCwxMjUsMSwwLDExNiwxLDAsCi0gICAgMTI0LDEsMCwxMDAsMiwwLDEzMSwyLDAsMTE0LDcxLDAsMTIxLDE3LDAsMTI0LAotICAgIDEsMCwxMDYsMiwwLDEyNCwwLDAsMTMxLDEsMCw4Myw4NywxMTAsMTgsMCwKLSAgICA0LDExNiwzLDAsMTA3LDEwLDAsMTE0LDcwLDAsMSwxLDEsODksMTEwLDEsCi0gICAgMCw4OCwxMjEsMTMsMCwxMjQsMCwwLDEwNiw0LDAsMTI1LDIsMCw4NywxMTAsCi0gICAgMTgsMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDEwNCwwLDEsMSwxLDg5LAotICAgIDExMCwyMywwLDg4LDEyNCwyLDAsMTAwLDAsMCwxMDcsOSwwLDExNCwxMjcsMCwKLSAgICAxMTYsNiwwLDEyNCwyLDAsMTMxLDEsMCw4MywxMjEsMTMsMCwxMjQsMCwwLAotICAgIDEwNiw3LDAsMTI1LDMsMCw4NywxMTAsMjQsMCw0LDExNiw1LDAsMTA3LDEwLAotICAgIDAsMTE0LDE2NiwwLDEsMSwxLDEwMCwzLDAsMTI1LDMsMCw4OSwxMTAsMSwKLSAgICAwLDg4LDEyMSwxMywwLDEyNCwwLDAsMTA2LDgsMCwxMjUsNCwwLDg3LDExMCwKLSAgICA1OSwwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsMjQxLDAsMSwxLDEsMTI0LAotICAgIDEsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDIyMSwwLDEwMCw0LDAsMTA2LDksCi0gICAgMCwxMjQsMywwLDEzMSwxLDAsODMsMTAwLDUsMCwxMDYsOSwwLDEyNCwzLAotICAgIDAsMTI0LDEsMCwxMzEsMiwwLDgzLDg5LDExMCwxNywwLDg4LDEwMCw2LDAsCi0gICAgMTA2LDksMCwxMjQsMywwLDEyNCw0LDAsMTMxLDIsMCw4MywxMDAsMCwwLAotICAgIDgzLDQxLDcsNzgsMjE4LDEwLDk1LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsOTUsCisgICAgMCwwLDAsMTE1LDE2LDAsMCwwLDEyNCwxLDEyNCwwLDk1LDAsMTAwLDAsCisgICAgMTI0LDAsOTUsMSwxMDAsMCw4MywwLDQxLDEsNzgsNDEsMiwxMTQsMTgsMCwKKyAgICAwLDAsMjE4LDUsOTUsMTA4LDExMSw5OSwxMDcsNDEsMiwxMTQsMTksMCwwLDAsCisgICAgMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDExLDAsMCwwLDExNCwyMCwwLDAsMCwxNTksMCwwLDAsMTE1LDQsMCwKKyAgICAwLDAsMCwxLDYsMSwxMjIsMjcsOTUsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwKKyAgICAxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLDExNCw0Niw5NSw5NSwxMDUsMTEwLDEwNSwKKyAgICAxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCisgICAgMTAsMCwwLDAsNjcsMCwwLDAsMTE1LDQyLDAsMCwwLDEyMiwxNiwxMTYsCisgICAgMCwxMjQsMCwxMDYsMSwxMzEsMSwxMjQsMCw5NSwyLDg3LDAsMTAwLDAsMTE2LAorICAgIDMsMTA2LDQsMTMxLDAsMSwwLDg4LDAsMTI0LDAsMTA2LDIsMTA2LDUsMTMxLAorICAgIDAsMSwwLDEwMCwwLDgzLDAsNDEsMSw3OCw0MSw2LDIxOCwxNiw5NSwxMDMsCisgICAgMTAxLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMDgsMTExLDk5LDEwNywxMTQsMTgsCisgICAgMCwwLDAsMTE0LDU1LDAsMCwwLDIxOCw0LDk1LDEwNSwxMDksMTEyLDIxOCwxMiwKKyAgICAxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSw5NSwxMDgsMTExLDk5LDEwNywxMTQsNDYsMCwwLAorICAgIDAsNDEsMSwxMTQsMTksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDIzLDAsMCwwLDE2MywwLDAsMCwKKyAgICAxMTUsOCwwLDAsMCwwLDEsMiwxLDE2LDIsMTAsMSwxMjIsMjgsOTUsCisgICAgNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw3NiwxMTEsOTksMTA3LDc3LDk3LDExMCw5NywxMDMsMTAxLAorICAgIDExNCw0Niw5NSw5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsCisgICAgMCwwLDAsMCwzLDAsMCwwLDEsMCwwLDAsNzksMCwwLDAsCisgICAgMTE1LDE0LDAsMCwwLDEyNCwwLDEwNiwwLDEwNiwxLDEzMSwwLDEsMCwxMDAsCisgICAgMCw4MywwLDQxLDEsNzgsNDEsMiwxMTQsNTUsMCwwLDAsMTE0LDQ3LDAsCisgICAgMCwwLDQxLDMsMTE0LDE5LDAsMCwwLDExNCwyOSwwLDAsMCw5MCw2LAorICAgIDEwNywxMTksOTcsMTE0LDEwMywxMTUsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTEsMCwwLDAsMTE0LDMwLDAsMCwwLDE3MCwwLDAsMCwxMTUsMiwKKyAgICAwLDAsMCwwLDEsMTIyLDI3LDk1LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsNzYsMTExLAorICAgIDk5LDEwNyw3Nyw5NywxMTAsOTcsMTAzLDEwMSwxMTQsNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LAorICAgIDk1LDk1LDc4LDQxLDYsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LAorICAgIDIsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCwyMywwLDAsMCwxMTQsMzAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDExNCw1NCwwLDAsMCwxNTcsMCwwLDAsCisgICAgMTE1LDYsMCwwLDAsOCwyLDgsNCw4LDcsMTE0LDU0LDAsMCwwLAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsMCwKKyAgICAwLDMsMCwwLDAsMTE1LDEwNiwwLDAsMCwxMDAsMSwxMjUsMSwxMjEsMTQsCisgICAgMTE2LDAsMTM2LDAsMjUsMCwxMzEsMCwxMjUsMSw4NywwLDExMCwyMCw0LDAsCisgICAgMTE2LDEsMTA3LDEwLDExNCwzOCwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLAorICAgIDg4LDAsMTI0LDEsMTAwLDEsMTA3LDgsMTE0LDEwMiwxMTYsMiwxMDAsMSwxMDcsOCwKKyAgICAxMTQsNjYsMTE2LDMsMTM2LDAsMTMxLDEsMTI1LDEsMTEwLDgsMTE2LDQsMTM2LDAsCisgICAgMTMxLDEsMTI1LDEsMTM1LDAsMTAyLDEsMTAwLDIsMTAwLDMsMTMyLDgsMTI1LDIsCisgICAgMTE2LDUsMTA2LDYsMTI0LDEsMTI0LDIsMTMxLDIsMTE2LDAsMTM2LDAsNjAsMCwKKyAgICAxMjQsMSw4MywwLDQxLDQsMTIyLDEwOSw3MSwxMDEsMTE2LDMyLDExMSwxMTQsMzIsOTksCisgICAgMTE0LDEwMSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDMyLDEwOCwxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDEwMywxMDUsMTE4LDEwMSwKKyAgICAxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsMTAsMTAsCisgICAgMzIsMzIsMzIsMzIsODMsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMTEsMTEwLDEwOCwxMjEsMzIsCisgICAgOTgsMTAxLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTE2LAorICAgIDk3LDEwNywxMDEsMTEwLDQ2LDc4LDk5LDEsMCwwLDAsMCwwLDAsMCwxLAorICAgIDAsMCwwLDIsMCwwLDAsMTksMCwwLDAsMTE1LDEwLDAsMCwwLAorICAgIDExNiwwLDEzNiwwLDYxLDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDEsMjE4LAorICAgIDEzLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDEwOCwxMTEsOTksMTA3LDExNSw0MSwxLAorICAgIDIxOCwxLDk1LDQxLDEsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMjE4LDIsOTksOTgsMTkwLDAsMCwwLDExNSwyLDAsMCwKKyAgICAwLDAsMSwxMjIsMjgsOTUsMTAzLDEwMSwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTUsMTA4LDExMSw5OSwxMDcsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk5LAorICAgIDk4LDQxLDcsMTE0LDU5LDAsMCwwLDExNCwyOCwwLDAsMCwxMTQsMzQsMCwKKyAgICAwLDAsMTE0LDUzLDAsMCwwLDExNCwzMiwwLDAsMCwyMTgsOCw5NSwxMTksCisgICAgMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5MCwzLDExNCwxMDEsMTAyLDQxLDMsMTE0LDE1LDAsCisgICAgMCwwLDExNCwzNSwwLDAsMCwxMTQsNjEsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDQxLDEsMTE0LDE1LDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsNTYsMCwKKyAgICAwLDAsMTc2LDAsMCwwLDExNSwyNCwwLDAsMCwwLDQsNCwxLDIsCisgICAgMSwxNCwxLDE0LDEsNiwxLDgsMSw4LDEsMTAsMiw4LDEsMTIsCisgICAgMiwxNiwxLDExNCw1NiwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLDAsMCwxMTUsNjIsMCwKKyAgICAwLDAsMTE2LDAsMTI0LDAsMTMxLDEsMTI1LDEsMTE2LDEsMTA2LDIsMTMxLDAsCisgICAgMSwwLDEyMSwxMiwxMjQsMSwxMDYsMywxMzEsMCwxLDAsODcsMCwxMTAsMjAsCisgICAgNCwwLDExNiw0LDEwNywxMCwxMTQsNDgsMSwwLDEsMCwxLDAsODksMCwKKyAgICAxMTAsMTAsODgsMCwxMjQsMSwxMDYsNSwxMzEsMCwxLDAsMTAwLDEsODMsMCwKKyAgICA0MSwyLDk3LDIxLDEsMCwwLDgyLDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDMyLDEwOCwxMTEsOTksMTA3LDQ0LDMyLDk3LDExMCwxMDAsMzIsOTcsOTksMTEzLDExNywxMDUsCisgICAgMTE0LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLAorICAgIDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDEwOCwxMTEsOTksMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDEwMywxMDUsMTE4LDEwMSwxMTAsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsMTAsMzIsMzIsCisgICAgMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA1LDExNSwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTE2LAorICAgIDExMSwzMiwxMDEsMTEwLDExNSwxMTcsMTE0LDEwMSwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzMiwxMDUsMTE1LDMyLDk5LDExMSwxMDksMTEyLDEwOCwxMDEsMTE2LDEwMSwxMDgsMTIxLDMyLAorICAgIDEwNSwxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTAxLDEwMCw0NCwzMiwxMDUsMTEwLDMyLAorICAgIDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDEwMSwxMTgsMTAxLDExMCwxMTYsMzIsMTA1LDExNiwKKyAgICAzMiwxMDUsMTE1LDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAxMDEsMTAwLDMyLDk4LDEyMSwzMiw5NywxMTAsMTExLDExNiwxMDQsMTAxLDExNCwzMiwxMTYsMTA0LAorICAgIDExNCwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDgzLDEwNCwxMTEsMTE3LDEwOCwKKyAgICAxMDAsMzIsMTExLDExMCwxMDgsMTIxLDMyLDk4LDEwMSwzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsCisgICAgMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDMyLDEwOCwxMTEsOTksMTA3LDMyLDExNiw5NywxMDcsMTAxLDExMCw0Niw3OCw0MSw2LDExNCwKKyAgICA1NiwwLDAsMCwxMTQsNTcsMCwwLDAsMTE0LDU4LDAsMCwwLDExNCw0NiwKKyAgICAwLDAsMCwxMTQsMzEsMCwwLDAsMTE0LDQ3LDAsMCwwLDQxLDIsMTE0LAorICAgIDE1LDAsMCwwLDExNCwzNSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTksOTUsMTA4LDExMSw5OSwxMDcsOTUsCisgICAgMTE3LDExMCwxMDgsMTExLDk5LDEwNyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxOTUsMCwwLAorICAgIDAsMTE1LDE0LDAsMCwwLDAsNyw4LDEsOCwxLDIsMSwxMiwxLAorICAgIDE0LDMsNiwyLDExNCw2MywwLDAsMCw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMywwLDAsMCwzLDAsMCwwLDc5LDAsMCwwLDExNSwxMCwKKyAgICAwLDAsMCwxMjQsMCwxMjQsMSwxMjQsMiwxNDIsMCw4MywwLDQxLDEsOTcsCisgICAgNDYsMSwwLDAsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMTA4LDEwNSw5OCw5NSwxMDIsMTE0LDk3LDEwOSwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsNDYsOTksMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDk3LDEwOCwxMTksCisgICAgOTcsMTIxLDExNSwzMiwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwzMiwxMTUsMTAxLDExMywxMTcsMTAxLAorICAgIDExMCw5OSwxMDEsMTE1LDEwLDMyLDMyLDMyLDMyLDExMSwxMDIsMzIsMTA1LDEwOSwxMTIsMTExLAorICAgIDExNCwxMTYsMTA4LDEwNSw5OCwzMiwxMDIsMTE0LDk3LDEwOSwxMDEsMTE1LDMyLDExNiwxMDQsOTcsCisgICAgMTE2LDMyLDEwMSwxMTAsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwzMiw5NywzMiw5OSw5NywxMDgsCisgICAgMTA4LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsCisgICAgMTExLDExMCwxMCwxMCwzMiwzMiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwNSwxMTYsMzIsMTA1LAorICAgIDExMCwxMTUsMTE2LDEwMSw5NywxMDAsMzIsMTExLDEwMiwzMiw5NywzMiwxMTAsMTExLDExNCwxMDksCisgICAgOTcsMTA4LDMyLDk5LDk3LDEwOCwxMDgsMzIsMTA1LDExMCwzMiwxMTIsMTA4LDk3LDk5LDEwMSwKKyAgICAxMTUsMzIsMTE5LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTEwLDk5LDEwOCwxMTcsMTAwLDEwNSwxMTAsCisgICAgMTAzLDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMTAsCisgICAgMzIsMzIsMzIsMzIsMTAyLDExNCw5NywxMDksMTAxLDExNSwzMiwxMDUsMTEwLDExNiwxMTQsMTExLAorICAgIDEwMCwxMTcsOTksMTAxLDExNSwzMiwxMTcsMTEwLDExOSw5NywxMTAsMTE2LDEwMSwxMDAsMzIsMTEwLAorICAgIDExMSwxMDUsMTE1LDEwMSwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE2LDExNCwKKyAgICA5Nyw5OSwxMDEsOTgsOTcsOTksMTA3LDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsMTE5LDEwNCwKKyAgICAxMDEsMTEwLDMyLDEwMSwxMjAsMTAxLDk5LDExNywxMTYsMTA1LDExMCwxMDMsMTAsMzIsMzIsMzIsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDEsMTAsMzIsMzIsCisgICAgMzIsMzIsMTE0LDEwLDAsMCwwLDQxLDMsMjE4LDEsMTAyLDExNCwyOSwwLDAsCisgICAgMCw5MCw0LDEwNywxMTksMTAwLDExNSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwyMTgsMjUsOTUsOTksOTcsMTA4LDEwOCw5NSwxMTksMTA1LAorICAgIDExNiwxMDQsOTUsMTAyLDExNCw5NywxMDksMTAxLDExNSw5NSwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwKKyAgICAxMDAsMjE0LDAsMCwwLDExNSwyLDAsMCwwLDAsOCwxMTQsNjUsMCwwLAorICAgIDAsMTE0LDQ1LDAsMCwwLDQxLDEsMjE4LDksMTE4LDEwMSwxMTQsOTgsMTExLDExNSwKKyAgICAxMDUsMTE2LDEyMSw5OSwxLDAsMCwwLDEsMCwwLDAsMywwLDAsMCwKKyAgICA0LDAsMCwwLDcxLDAsMCwwLDExNSw1NiwwLDAsMCwxMTYsMCwxMDYsCisgICAgMSwxMDYsMiwxMjQsMSwxMDcsNSwxMTQsNTIsMTI0LDAsMTA2LDMsMTAwLDYsMTMxLAorICAgIDEsMTE1LDMwLDEwMCwzLDEyNCwwLDIzLDAsMTI1LDAsMTE2LDQsMTI0LDAsMTA2LAorICAgIDUsMTI0LDIsMTQwLDAsMTAwLDQsMTE2LDAsMTA2LDYsMTQ0LDEsMTMxLDEsMSwKKyAgICAwLDEwMCw1LDgzLDAsNDEsNywxMjIsNjEsODAsMTE0LDEwNSwxMTAsMTE2LDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDMyLDExNiwxMTEsMzIsMTE1LDExNiwKKyAgICAxMDAsMTAxLDExNCwxMTQsMzIsMTA1LDEwMiwzMiw0NSwxMTgsNDcsODAsODksODQsNzIsNzksCisgICAgNzgsODYsNjksODIsNjYsNzksODMsNjksMzIsMTA1LDExNSwzMiwxMTYsMTE3LDExNCwxMTAsCisgICAgMTAxLDEwMCwzMiwxMTEsMTEwLDQ2LDI1MCwxLDM1LDI1MCw3LDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDMyLDEyMiwyLDM1LDMyLDkwLDQsMTAyLDEwNSwxMDgsMTAxLDc4LDQxLDIsMTE0LAorICAgIDY3LDAsMCwwLDExNCw2OCwwLDAsMCw0MSw3LDExNCwxNCwwLDAsMCwKKyAgICAyMTgsNSwxMDIsMTA4LDk3LDEwMywxMTUsMjE4LDcsMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDEsCisgICAgMjE4LDEwLDExNSwxMTYsOTcsMTE0LDExNiwxMTUsMTE5LDEwNSwxMTYsMTA0LDIxOCw1LDExMiwxMTQsCisgICAgMTA1LDExMCwxMTYsMTE0LDUwLDAsMCwwLDIxOCw2LDExNSwxMTYsMTAwLDEwMSwxMTQsMTE0LAorICAgIDQxLDMsMjE4LDcsMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTE0LDY2LDAsMCwwLAorICAgIDExNCwyOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwyMTgsMTYsOTUsMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDEsOTUsMTA5LAorICAgIDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMjI1LDAsMCwwLDExNSw4LDAsMCwwLDAsCisgICAgMiwxMiwxLDEwLDEsOCwxLDExNCw3NSwwLDAsMCw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDMsMCwwLAorICAgIDAsMTE1LDI2LDAsMCwwLDEzNSwwLDEwMiwxLDEwMCwxLDEwMCwyLDEzMiw4LAorICAgIDEyNSwxLDExNiwwLDEyNCwxLDEzNiwwLDEzMSwyLDEsMCwxMjQsMSw4MywwLAorICAgIDQxLDMsMTIyLDQ5LDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsCisgICAgMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsCisgICAgMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTgsMTE3LDEwNSwxMDgsCisgICAgMTE2LDQ1LDEwNSwxMTAsNDYsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKKyAgICAwLDAsNCwwLDAsMCwxOSwwLDAsMCwxMTUsNDAsMCwwLDAsMTI0LAorICAgIDEsMTE2LDAsMTA2LDEsMTA3LDcsMTE0LDMwLDExNiwyLDEwMCwxLDEwNiwzLDEyNCwKKyAgICAxLDEzMSwxLDEwMCwyLDEyNCwxLDE0NCwxLDEzMSwxLDEzMCwxLDEzNiwwLDEyNCwKKyAgICAwLDEyNCwxLDEzMSwyLDgzLDAsNDEsMyw3OCwxMjIsMjksMTIzLDMzLDExNCwxMjUsCisgICAgMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTUsMCwwLDAsNDEsNCwKKyAgICAxMTQsMTQsMCwwLDAsMjE4LDIwLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExMCw5NywxMDksMTAxLDExNSwyMTgsMTEsNzMsMTA5LDExMiwKKyAgICAxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDUwLDAsMCwwLDQxLDIsMTE0LAorICAgIDE5LDAsMCwwLDIxOCw4LDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSw0MSwxLAorICAgIDIxOCwzLDEwMiwxMjAsMTEwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAorICAgIDI1LDk1LDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LAorICAgIDEwNSwxMTAsOTUsMTE5LDExNCw5NywxMTIsMTEyLDEwMSwxMTQsMjM1LDAsMCwwLDExNSw4LAorICAgIDAsMCwwLDAsMSwxMCwxLDEyLDEsOCwxLDEyMiw1Miw5NSwxMTQsMTAxLAorICAgIDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDQ2LDYwLAorICAgIDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsCisgICAgMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsCisgICAgMTE0LDQxLDEsMTE0LDEyLDAsMCwwLDQxLDIsMTE0LDc5LDAsMCwwLDExNCwKKyAgICA4MCwwLDAsMCwxMTQsMTAsMCwwLDAsNDEsMSwxMTQsNzksMCwwLDAsCisgICAgMTE0LDExLDAsMCwwLDIxOCwxNyw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LAorICAgIDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDIzMywwLDAsMCwxMTUsNiwwLDAsCisgICAgMCwwLDIsMTIsNSwxMCwxLDExNCw4MSwwLDAsMCw5OSwxLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDMsMCwwLAorICAgIDAsMTE1LDI2LDAsMCwwLDEzNSwwLDEwMiwxLDEwMCwxLDEwMCwyLDEzMiw4LAorICAgIDEyNSwxLDExNiwwLDEyNCwxLDEzNiwwLDEzMSwyLDEsMCwxMjQsMSw4MywwLAorICAgIDQxLDMsMTIyLDQ3LDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsCisgICAgMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsCisgICAgMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsMTAyLDExNCwxMTEsMTIyLAorICAgIDEwMSwxMTAsNDYsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgNCwwLDAsMCwxOSwwLDAsMCwxMTUsNDAsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTI0LDEsMTMxLDEsMTE1LDMwLDExNiwyLDEwMCwxLDEwNiwzLDEyNCwxLDEzMSwKKyAgICAxLDEwMCwyLDEyNCwxLDE0NCwxLDEzMSwxLDEzMCwxLDEzNiwwLDEyNCwwLDEyNCwKKyAgICAxLDEzMSwyLDgzLDAsNDEsMyw3OCwxMjIsMjcsMTIzLDMzLDExNCwxMjUsMzIsMTA1LAorICAgIDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTUsMCwwLDAsNDEsNCwxMTQsNTcsMCwwLAorICAgIDAsMjE4LDksMTA1LDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwxMTQsNzcsMCwwLAorICAgIDAsMTE0LDUwLDAsMCwwLDQxLDIsMTE0LDE5LDAsMCwwLDExNCw3OCwwLAorICAgIDAsMCw0MSwxLDExNCw3OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDIxOCwyNCw5NSwxMTQsMTAxLDExMywxMTcsMTA1LDExNCwxMDEsMTE1LDk1LDEwMiwKKyAgICAxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDExOSwxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDI0NiwwLDAsCisgICAgMCwxMTUsOCwwLDAsMCwwLDEsMTAsMSwxMiwxLDgsMSwxMjIsNTAsCisgICAgOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwKKyAgICA0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwKKyAgICAxMTQsMTAxLDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMTksMTE0LDk3LDExMiwxMTIsCisgICAgMTAxLDExNCw0MSwxLDExNCwxMiwwLDAsMCw0MSwyLDExNCw3OSwwLDAsMCwKKyAgICAxMTQsODMsMCwwLDAsMTE0LDEwLDAsMCwwLDQxLDEsMTE0LDc5LDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwyMTgsMTYsOTUsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLAorICAgIDExNSw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwyNDQsMCwwLDAsMTE1LDYsMCwwLAorICAgIDAsMCwyLDEyLDUsMTAsMSwxMTQsODQsMCwwLDAsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsNjQsMCwwLDAsMTE2LDAsMTI0LDEsMTI0LDAsMTMxLDIsMTI1LDIsCisgICAgMTI0LDEsMTE2LDEsMTA2LDIsMTA3LDYsMTE0LDUyLDExNiwxLDEwNiwyLDEyNCwxLAorICAgIDI1LDAsMTI1LDMsMTE2LDMsMTI0LDIsMTI0LDMsMTMxLDIsMSwwLDExNiwxLAorICAgIDEwNiwyLDEyNCwxLDI1LDAsODMsMCwxMTAsOCwxMTYsNCwxMjQsMiwxMzEsMSwKKyAgICA4MywwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMTI4LDc2LDExMSw5NywxMDAsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwzMiwxMDUsMTEwLDExNiwxMTEsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsCisgICAgMTA1LDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLAorICAgIDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LAorICAgIDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LAorICAgIDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTAsMTE1LDExNiwKKyAgICAxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDQxLDUsMjE4LDE2LDExNSwKKyAgICAxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwKKyAgICAxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMjE4LDUsOTUsMTAxLDEyMCwxMDEsOTksCisgICAgMjE4LDUsOTUsMTA4LDExMSw5NywxMDAsNDEsNCwxMTQsMTksMCwwLDAsMTE0LDc4LAorICAgIDAsMCwwLDIxOCw0LDExNSwxMTIsMTAxLDk5LDIxOCw2LDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAorICAgIDIxOCwxNyw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsCisgICAgMTA0LDEwNSwxMDksMCwxLDAsMCwxMTUsMTIsMCwwLDAsMCw2LDEwLDEsCisgICAgMTAsMSwxMCwxLDEwLDEsMTIsMiwxMTQsOTAsMCwwLDAsOTksMSwwLAorICAgIDAsMCwwLDAsMCwwLDUsMCwwLDAsMzUsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDIxOCwwLDAsMCwxMTYsMCwxMjQsMCwxMDAsMSwxMDAsMCwxMzEsCisgICAgMywxMjUsMSwxMTYsMSwxMjQsMSwxMDAsMiwxMzEsMiwxMTQsNTQsMTIxLDEwLDEyNCwKKyAgICAxLDEwNiwyLDEyNCwwLDEzMSwxLDgzLDAsNCwwLDExNiwzLDEwNywxMCwxMTQsCisgICAgNTIsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDEyMSwxMCwxMjQsCisgICAgMCwxMDYsNCwxMjUsMiw4NywwLDExMCwyMCw0LDAsMTE2LDUsMTA3LDEwLDExNCwKKyAgICA4NCwxLDAsMSwwLDEsMCw4OSwwLDExMCwxOCw4OCwwLDEyNCwyLDEwMCwKKyAgICAwLDEwNyw5LDExNCwxMDIsMTE2LDYsMTI0LDIsMTMxLDEsODMsMCwxMjEsMTAsMTI0LAorICAgIDAsMTA2LDcsMTI1LDMsODcsMCwxMTAsMjQsNCwwLDExNiw1LDEwNywxMCwxMTQsCisgICAgMTM2LDEsMCwxLDAsMSwwLDEwMCwzLDEyNSwzLDg5LDAsMTEwLDIsODgsCisgICAgMCwxMjEsMTAsMTI0LDAsMTA2LDgsMTI1LDQsODcsMCwxMTAsNTIsNCwwLDExNiwKKyAgICA1LDEwNywxMCwxMTQsMjAwLDEsMCwxLDAsMSwwLDEyNCwxLDEwMCwwLDEwNywKKyAgICA4LDExNCwxODQsMTAwLDQsMTA2LDksMTI0LDMsMTMxLDEsODMsMCwxMTAsMTIsMTAwLAorICAgIDUsMTA2LDksMTI0LDMsMTI0LDEsMTMxLDIsODMsMCw4OSwwLDExMCwxNCw4OCwKKyAgICAwLDEwMCw2LDEwNiw5LDEyNCwzLDEyNCw0LDEzMSwyLDgzLDAsMTAwLDAsODMsCisgICAgMCw0MSw3LDc4LDIxOCwxMCw5NSw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDk1LAogICAgIDIxOCwxMSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsMjUwLDEsNjMsCiAgICAgMTIyLDEzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDYyLDEyMiwKICAgICAyMCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCwxMjMsCkBAIC02MTYsNjExICs1NzUsNzA1IEBACiAgICAgODgsMCwwLDAsMTE0LDE1LDAsMCwwLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTAsCiAgICAgOTcsMTA5LDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAogICAgIDAsMCwyMTgsMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LAotICAgIDE2LDEsMCwwLDExNSw0NiwwLDAsMCwwLDIsMTgsMSwxNSw0LDMsCi0gICAgMSwxNywxLDEzLDEsNSwxLDMsMSwxMywxLDEzLDEsNSwyLDEyLAotICAgIDEsMTAsNCwzLDEsMTMsMSwxMywxLDExLDEsMywxLDEzLDEsMTMsCi0gICAgMSwxMiwxLDEzLDIsMjEsMiwxMTQsMTAxLDAsMCwwLDk5LDAsMCwwLAorICAgIDE2LDEsMCwwLDExNSw0NiwwLDAsMCwwLDIsMTIsMSwxMCw0LDIsCisgICAgMSwxMCwxLDE0LDEsNiwxLDIsMSwxMCwxLDE0LDEsNiwyLDgsCisgICAgMSw4LDQsMiwxLDEwLDEsMTQsMSwxMCwxLDIsMSwxMCwxLDE0LAorICAgIDEsOCwxLDEyLDIsMTgsMiwxMTQsMTAxLDAsMCwwLDk5LDAsMCwwLAogICAgIDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsMCwwLAotICAgIDAsMTE1LDUyLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsCi0gICAgMiwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDkwLDMsMCwxMDAsMywKLSAgICAwLDEwMCw0LDAsMTMyLDAsMCw5MCw0LDAsMTAwLDUsMCwxMDAsNiwwLAotICAgIDEzMiwwLDAsOTAsNSwwLDEwMCw3LDAsODMsNDEsOCwyMTgsMTcsOTUsMTA1LAorICAgIDAsMTE1LDM2LDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSwKKyAgICAxMDAsMiwxMzIsMCw5MCwzLDEwMCwzLDEwMCw0LDEzMiwwLDkwLDQsMTAwLDUsCisgICAgMTAwLDYsMTMyLDAsOTAsNSwxMDAsNyw4MywwLDQxLDgsMjE4LDE3LDk1LDEwNSwKICAgICAxMTAsMTE1LDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw5OSwKICAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSwyNSwwLDAsMCwxMjQsMSwwLDEyNCwwLDAsOTUsCi0gICAgMCwwLDEyNCwxLDAsMTA2LDEsMCwxMjQsMCwwLDk1LDIsMCwxMDAsMCwKLSAgICAwLDgzLDQxLDEsNzgsNDEsMywyMTgsNyw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTQsOTUsMCwwLDAsMjE4LDUsOTUsMTE1LDExMiwxMDEsOTksNDEsMiwxMTQsMTksCi0gICAgMCwwLDAsMTE0LDg5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCw1NCwxLDAsMCwKLSAgICAxMTUsNCwwLDAsMCwwLDEsOSwxLDEyMiwyNiw5NSwxMDUsMTEwLDExNSwxMTYsCi0gICAgOTcsMTA4LDEwOCwxMDEsMTAwLDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsMTA1LAotICAgIDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsCi0gICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM4LDAsMCwwLDEwMCwKLSAgICAxLDAsMTI0LDAsMCwxMDYsMCwwLDk1LDEsMCwxMjQsMCwwLDEwNiwyLAotICAgIDAsMTE2LDMsMCwxMDYsNCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsNSwwLAotICAgIDYwLDEwMCwwLDAsODMsNDEsMiw3OCw4NCw0MSw2LDExNCwxMDQsMCwwLDAsCi0gICAgMjE4LDEzLDk1LDEwNSwxMTAsMTA1LDExNiwxMDUsOTcsMTA4LDEwNSwxMjIsMTA1LDExMCwxMDMsMTE0LAotICAgIDEwMywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDExNCwxNSwKLSAgICAwLDAsMCw0MSwxLDExNCwxOSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMjMsMCwwLDAsNTgsMSwKLSAgICAwLDAsMTE1LDQsMCwwLDAsMCw0LDEyLDEsMTIyLDI3LDk1LDEwNSwxMTAsCi0gICAgMTE1LDExNiw5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSwKLSAgICA5NSwxMDEsMTEwLDExNiwxMDEsMTE0LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsCi0gICAgMCwzLDAsMCwwLDE3LDAsMCwwLDcxLDAsMCwwLDExNSwxMjEsMCwKLSAgICAwLDAsMTIyLDEwMSwwLDEyNCwwLDAsMTA2LDAsMCwxMjUsMiwwLDExNiwxLAotICAgIDAsMTAwLDEsMCwxMDAsMiwwLDEzMiwwLDAsMTI0LDEsMCw2OCwxMzEsMSwKLSAgICAwLDEzMSwxLDAsMTE0LDc4LDAsMTIxLDE3LDAsMTE2LDIsMCwxMDYsMywwLAotICAgIDEyNCwyLDAsMTA2LDQsMCw2MSw4NywxMTMsMTAwLDAsNCwxMTYsNSwwLDEwNywKLSAgICAxMCwwLDExNCw3NCwwLDEsMSwxLDg5LDExMywxMDAsMCw4OCwxMTAsMjIsMCwKLSAgICAxMTYsNiwwLDEwMCwzLDAsMTI0LDIsMCwxMDYsNCwwLDEyNCwyLDAsMTA2LAotICAgIDcsMCwxMzEsMywwLDEsODcsMTAwLDAsMCwxMDAsNCwwLDEyNCwwLDAsCi0gICAgMTA2LDAsMCw5NSw4LDAsODgsMTAwLDAsMCw4Myw0MSw1LDc4LDk5LDEsCi0gICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsMTE1LAotICAgIDAsMCwwLDExNSwyNywwLDAsMCwxMjQsMCwwLDkzLDE3LDAsMTI1LDEsCi0gICAgMCwxMjQsMSwwLDEwMCwwLDAsMTA3LDksMCw4NiwxLDExMywzLDAsMTAwLAotICAgIDAsMCw4Myw0MSwxLDc4LDExNCwxMCwwLDAsMCw0MSwyLDExNCwyNCwwLAotICAgIDAsMCwxMTQsMjUsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMTE0LDI2LDAsMCwwLDY4LDEsMCwwLDExNSwKLSAgICAyLDAsMCwwLDYsMCwxMjIsNDUsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsCi0gICAgMTAxLDEwMCw5NSwxMTUsOTcsMTAyLDEwMSwxMDgsMTIxLDQ2LDk1LDk1LDEwMSwxMjAsMTA1LDExNiwKLSAgICA5NSw5NSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsNjAsMTAzLDEwMSwxMTAsCi0gICAgMTAxLDEyMCwxMTIsMTE0LDYyLDEyMiwxOCwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMjMsMzMsCi0gICAgMTE0LDEyNSwzMiwzNSwzMiwxMjMsMzMsMTE0LDEyNSw3MCw0MSw5LDExNCwxMDQsMCwwLAotICAgIDAsMTE0LDI3LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsCi0gICAgMTE0LDE1LDAsMCwwLDExNCwyOCwwLDAsMCwxMTQsNzUsMCwwLDAsMTE0LAotICAgIDk5LDAsMCwwLDExNCwxMDUsMCwwLDAsNDEsMywxMTQsMTksMCwwLDAsCi0gICAgMTE0LDI5LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzAsMCwwLDAsNjUsMSwKLSAgICAwLDAsMTE1LDE4LDAsMCwwLDAsMSwzLDEsOSwxLDI1LDEsMywKLSAgICAxLDE3LDEsMTMsMSw4LDIsMjYsMiwxMjIsMjYsOTUsMTA1LDExMCwxMTUsMTE2LAorICAgIDY3LDAsMCwwLDExNSwxOCwwLDAsMCwxMjQsMSwxMjQsMCw5NSwwLDEyNCwKKyAgICAxLDEwNiwxLDEyNCwwLDk1LDIsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDMsCisgICAgMjE4LDcsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDk1LDAsMCwwLDIxOCw1LAorICAgIDk1LDExNSwxMTIsMTAxLDk5LDQxLDIsMTE0LDE5LDAsMCwwLDExNCw4OSwwLDAsCisgICAgMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwKKyAgICAxMTQsMjAsMCwwLDAsNTQsMSwwLDAsMTE1LDQsMCwwLDAsMCwxLAorICAgIDYsMSwxMjIsMjYsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwxMDgsMTAxLDEwMCw5NSwxMTUsCisgICAgOTcsMTAyLDEwMSwxMDgsMTIxLDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLAorICAgIDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwyOCwwLDAsMCwxMDAsMSwxMjQsMCwxMDYsMCw5NSwxLAorICAgIDEyNCwwLDEwNiwyLDExNiwzLDEwNiw0LDEyNCwwLDEwNiwwLDEwNiw1LDYwLDAsCisgICAgMTAwLDAsODMsMCw0MSwyLDc4LDg0LDQxLDYsMTE0LDEwNCwwLDAsMCwyMTgsCisgICAgMTMsOTUsMTA1LDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDUsMTEwLDEwMywxMTQsMTAzLAorICAgIDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMTE0LDE1LDAsCisgICAgMCwwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyMywwLDAsMCw1OCwxLDAsCisgICAgMCwxMTUsNCwwLDAsMCwwLDQsOCwxLDEyMiwyNyw5NSwxMDUsMTEwLDExNSwKKyAgICAxMTYsOTcsMTA4LDEwOCwxMDEsMTAwLDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsOTUsOTUsCisgICAgMTAxLDExMCwxMTYsMTAxLDExNCw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsCisgICAgMywwLDAsMCwxNywwLDAsMCw3MSwwLDAsMCwxMTUsOTgsMCwwLAorICAgIDAsMTIyLDgyLDEyNCwwLDEwNiwwLDEyNSwyLDExNiwxLDEwMCwxLDEwMCwyLDEzMiwKKyAgICAwLDEyNCwxLDY4LDAsMTMxLDEsMTMxLDEsMTE0LDY0LDEyMSwxNCwxMTYsMiwxMDYsCisgICAgMywxMjQsMiwxMDYsNCw2MSwwLDg3LDAsMTEzLDgwLDQsMCwxMTYsNSwxMDcsCisgICAgMTAsMTE0LDYwLDEsMCwxLDAsMSwwLDg5LDAsMTEzLDgwLDg4LDAsMTEwLAorICAgIDE2LDExNiw2LDEwMCwzLDEyNCwyLDEwNiw0LDEyNCwyLDEwNiw3LDEzMSwzLDEsCisgICAgMCw4NywwLDEwMCwwLDEwMCw0LDEyNCwwLDEwNiwwLDk1LDgsODgsMCwxMDAsCisgICAgMCw4MywwLDQxLDUsNzgsOTksMSwwLDAsMCwwLDAsMCwwLDIsCisgICAgMCwwLDAsMywwLDAsMCwxMTUsMCwwLDAsMTE1LDIyLDAsMCwwLAorICAgIDEyNCwwLDkzLDE0LDEyNSwxLDEyNCwxLDEwMCwwLDEwNyw5LDg2LDAsMSwwLAorICAgIDExMywyLDEwMCwwLDgzLDAsNDEsMSw3OCwxMTQsMTAsMCwwLDAsNDEsMiwKKyAgICAxMTQsMjQsMCwwLDAsMTE0LDI1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwyNiwwLDAsMCw2OCwxLAorICAgIDAsMCwxMTUsMiwwLDAsMCw0LDAsMTIyLDQ1LDk1LDEwNSwxMTAsMTE1LDExNiwKICAgICA5NywxMDgsMTA4LDEwMSwxMDAsOTUsMTE1LDk3LDEwMiwxMDEsMTA4LDEyMSw0Niw5NSw5NSwxMDEsCi0gICAgMTIwLDEwNSwxMTYsOTUsOTUsNzgsNDEsNiwxMTQsMSwwLDAsMCwxMTQsMCwwLAotICAgIDAsMCwxMTQsMiwwLDAsMCwxMTQsMjAsMCwwLDAsMTE0LDIzLDAsMCwKLSAgICAwLDExNCwzMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLAotICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDEwMiwwLDAsMCw1MiwKLSAgICAxLDAsMCwxMTUsNiwwLDAsMCwxMiwyLDEyLDQsMTIsNywxMTQsMTAyLAotICAgIDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAotICAgIDgsMCwwLDAsNjQsMCwwLDAsMTE1LDE3MiwwLDAsMCwxMDEsMCwwLAotICAgIDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsCi0gICAgMiwwLDEwMCwzLDAsMTAwLDQsMCwxMDAsMywwLDEwMCw1LDAsMTAwLDMsCi0gICAgMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMyw5MCw0LDAsMTAwLDgsMCwKLSAgICAxMDAsOSwwLDEzMiwwLDAsOTAsNSwwLDEwMCwxMCwwLDEwMCwxMSwwLDEzMiwKLSAgICAwLDAsOTAsNiwwLDEwMSw3LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDAsCi0gICAgMCwxMzEsMSwwLDkwLDgsMCwxMDEsOCwwLDEwNiw5LDAsMTAwLDE0LDAsCi0gICAgMTAwLDEzLDAsMTMyLDAsMCwxMzEsMSwwLDkwLDgsMCwxMDEsNywwLDEwMCwKLSAgICAxNSwwLDEwMCwxNiwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSw3LAotICAgIDAsMTAwLDE3LDAsMTAwLDE4LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDExLDAsCi0gICAgMTAxLDExLDAsMTA2LDksMCwxMDAsMTksMCwxMDAsMTgsMCwxMzIsMCwwLDEzMSwKLSAgICAxLDAsOTAsMTEsMCwxMDAsMywwLDgzLDQxLDIwLDIxOCwxMCw3NywxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksOTcsMjA4LDUsMCwwLDg0LDEwNCwxMDEsMzIsCi0gICAgMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTEsCi0gICAgMTE0LDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDExNywxMTUsMTAxLDEwMCwKLSAgICAzMiwxMDIsMTExLDExNCwzMiwxMDgsMTExLDk3LDEwMCwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiw2NSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTE1LDExMiwKLSAgICAxMDEsOTksMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAotICAgIDMyLDEwMiwxMTEsMTE0LDMyLDEwNSwxMTAsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMDUsMTExLDExMCwKLSAgICAzMiw5Nyw5OCwxMTEsMTE3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw0NiwzMiwzMiw3MCwxMTEsMTE0LDEwLDMyLDMyLDMyLDMyLDEwMCw5NywxMTYsOTcsCi0gICAgMzIsOTcsMTE1LDExNSwxMTEsOTksMTA1LDk3LDExNiwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMDUsMTEwLDk5LAotICAgIDEwOCwxMTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNDQsMzIsMTE3LAotICAgIDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMzksMTE1LDEwLDMyLDMyLAotICAgIDMyLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsCi0gICAgMTEwLDk3LDEwOSwxMDEsOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiw5Nyw5OCwxMTUsCi0gICAgMTExLDEwOCwxMTcsMTE2LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDMyLDMyLDk2LDEwOCwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDEwLDMyLDMyLDMyLDMyLDExNiwxMTEsMzIsMTE3LDExNSwxMDEsMzIsMTE5LDEwNCwxMDEsCi0gICAgMTEwLDMyLDEwOCwxMTEsOTcsMTAwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDQ2LDMyLDMyLDk2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTYsMzIsCi0gICAgMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTEsMTAyLDMyLDExNiwKLSAgICAxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTYsCi0gICAgMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDEwNSwxMTAsNDYsCi0gICAgMzIsMzIsODQsMTA0LDEwMSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMzIsCi0gICAgMTAwLDEwMSwxMTQsMTA1LDExOCwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMTAsOTcsMTA5LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwxMDUsMTE1LDk1LAotICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NiwzMiwxMDAsMTAxLDExNiwxMDEsMTE0LDEwOSwxMDUsCi0gICAgMTEwLDEwMSwxMTUsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwzMiwxMDUsMTE1LDMyLDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwxMDEsMTAwLDMyLAotICAgIDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTEsMTE0LDEwLDMyLDMyLDMyLAotICAgIDMyLDExMCwxMTEsMTE2LDQ2LDMyLDMyLDc5LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTUsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsMTE0LDEwMSwxMDIsMTA4LDEwMSw5OSwKLSAgICAxMTYsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsOTYsOTUsOTUsMTEyLDk3LAotICAgIDExNiwxMDQsOTUsOTUsOTYsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDk2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDk2LDMyLDEwNSwKLSAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsOTksMzIsMTA4LAotICAgIDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE3LDExNSwxMDEsMTAwLDMyLDk4LDEyMSwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKLSAgICAxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMDgsMTExLDk3LAotICAgIDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwxMDUsMTAyLAotICAgIDMyLDExNiwxMDQsOTcsMTE2LDMyLDEwNSwxMTAsMTAyLDExMSwxMTQsMTA5LDk3LDExNiwxMDUsMTExLAotICAgIDExMCwzMiwxMDUsMTE1LDMyLDk3LDExOCw5NywxMDUsMTA4LDk3LDk4LDEwOCwxMDEsNDYsMzIsCi0gICAgMzIsODcsMTA0LDEwMSwxMTAsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDMyLDEwNSwKLSAgICAxMTUsMTAsMzIsMzIsMzIsMzIsMTE1LDEwMSwxMTYsNDQsMzIsMTExLDExNCwxMDUsMTAzLDEwNSwKLSAgICAxMTAsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDEwOSw5NywxMTYsOTksMTA0LDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDk2LDEwNCw5NywxMTUsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsCi0gICAgOTYsMzIsMTA1LDExMCwxMDAsMTA1LDk5LDk3LDExNiwxMDEsMTE1LDMyLDExNiwxMDQsOTcsMTE2LAotICAgIDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LDM5LDExNSwzMiwzNCwxMTEsMTE0LDEwNSwxMDMsMTA1LAotICAgIDExMCwzNCwzMiwxMTQsMTAxLDEwMiwxMDgsMTAxLDk5LDExNiwxMTUsMzIsOTcsMzIsMTA4LDExMSwKLSAgICA5OSw5NywxMTYsMTA1LDExMSwxMTAsNDYsMTAsMzIsMzIsMzIsMzIsODcsMTA0LDEwMSwxMTAsCi0gICAgMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTUsMzIsODQsMTE0LDExNywxMDEsNDQsMzIsOTYsCi0gICAgOTUsOTUsMTAyLDEwNSwxMDgsMTAxLDk1LDk1LDk2LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwKLSAgICAxMTcsMTE2LDEwMSwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDEwNSwxMTUsMzIsMTE1LDEwMSwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsCi0gICAgOTksOTcsOTksMTA0LDEwMSwxMDAsOTYsMzIsMTA1LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsCi0gICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDk5LAotICAgIDk3LDk5LDEwNCwxMDEsMTAwLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwKLSAgICAxMDUsMTA4LDEwMSw0NCwzMiwxMDUsMTAyLDMyLDk3LDExMCwxMjEsNDYsMzIsMzIsNzMsMTE2LAotICAgIDEwLDMyLDMyLDMyLDMyLDk5LDExMSwxMTQsMTE0LDEwMSwxMTUsMTEyLDExMSwxMTAsMTAwLDExNSwKLSAgICAzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLDk2LDk1LDk1LDk5LDk3LDk5LDEwNCwxMDEsCi0gICAgMTAwLDk1LDk1LDk2LDMyLDk3LDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiw5NiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LAorICAgIDEyMCwxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwKKyAgICAxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTIyLDE4LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDMyLDEyMywzMywxMTQsMTI1LDMyLDM1LDMyLDEyMywzMywxMTQsMTI1LDcwLDQxLDksMTE0LAorICAgIDEwNCwwLDAsMCwxMTQsMjcsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwKKyAgICAwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDI4LDAsMCwwLDExNCw3NSwwLAorICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNSwwLDAsMCw0MSwzLDExNCwxOSwKKyAgICAwLDAsMCwxMTQsMjksMCwwLDAsMTE0LDg4LDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwzMCwwLDAsCisgICAgMCw2NSwxLDAsMCwxMTUsMTgsMCwwLDAsMCwxLDIsMSw2LDEsCisgICAgMTgsMSwyLDEsMTQsMSwxNCwxLDgsMiwyMCwyLDEyMiwyNiw5NSwxMDUsCisgICAgMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwxMDEsMTAwLDk1LDExNSw5NywxMDIsMTAxLDEwOCwxMjEsNDYsCisgICAgOTUsOTUsMTAxLDEyMCwxMDUsMTE2LDk1LDk1LDc4LDQxLDYsMTE0LDEsMCwwLDAsCisgICAgMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsMTE0LDIwLDAsMCwwLDExNCwKKyAgICAyMywwLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMDIsMCwKKyAgICAwLDAsNTIsMSwwLDAsMTE1LDYsMCwwLDAsOCwyLDgsNCw4LAorICAgIDcsMTE0LDEwMiwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAwLDAsMCw0LDAsMCwwLDY0LDAsMCwwLDExNSwxMTQsMCwwLDAsCisgICAgMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDIsCisgICAgMTAwLDIsMTAwLDMsMTU2LDMsMTAwLDQsMTAwLDUsMTMyLDIsOTAsNCwxMDAsNiwKKyAgICAxMDAsNywxMzIsMCw5MCw1LDEwMCw4LDEwMCw5LDEzMiwwLDkwLDYsMTAxLDcsCisgICAgMTAwLDEwLDEwMCwxMSwxMzIsMCwxMzEsMSw5MCw4LDEwMSw4LDEwNiw5LDEwMCwxMiwKKyAgICAxMDAsMTEsMTMyLDAsMTMxLDEsOTAsOCwxMDEsNywxMDAsMTMsMTAwLDE0LDEzMiwwLAorICAgIDEzMSwxLDkwLDEwLDEwMSw3LDEwMCwxNSwxMDAsMTYsMTMyLDAsMTMxLDEsOTAsMTEsCisgICAgMTAxLDExLDEwNiw5LDEwMCwxNywxMDAsMTYsMTMyLDAsMTMxLDEsOTAsMTEsMTAwLDIsCisgICAgODMsMCw0MSwxOCwyMTgsMTAsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LAorICAgIDk3LDIwOCw1LDAsMCw4NCwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LAorICAgIDk5LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDIsMTExLDExNCwzMiw5NywzMiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw0NCwzMiwxMTcsMTE1LDEwMSwxMDAsMzIsMTAyLDExMSwxMTQsMzIsMTA4LDExMSwKKyAgICA5NywxMDAsMTA1LDExMCwxMDMsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExNSwxMTIsMTAxLDk5LDMyLDEwNSwxMTUsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTExLDExNCwzMiwxMDUsMTEwLAorICAgIDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTA1LDExMSwxMTAsMzIsOTcsOTgsMTExLDExNywxMTYsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMzIsMzIsNzAsMTExLDExNCwKKyAgICAxMCwzMiwzMiwzMiwzMiwxMDAsOTcsMTE2LDk3LDMyLDk3LDExNSwxMTUsMTExLDk5LDEwNSwKKyAgICA5NywxMTYsMTAxLDEwMCwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTA1LDExMCw5OSwxMDgsMTE3LDEwMCwxMDUsMTEwLDEwMywzMiwKKyAgICAxMTUsMTExLDExNywxMTQsOTksMTAxLDQ0LDMyLDExNywxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExNSwxMTIsMTAxLDk5LDM5LDExNSwxMCwzMiwzMiwzMiwzMiwxMDgsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk2LDExMCw5NywxMDksMTAxLDk2LDMyLDEwNSwKKyAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMzIsOTcsOTgsMTE1LDExMSwxMDgsMTE3LDExNiwxMDEsMzIsMTEwLAorICAgIDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSw0NiwzMiwzMiw5NiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk2LDMyLDEwNSwxMTUsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMCwzMiwzMiwzMiwzMiwxMTYsCisgICAgMTExLDMyLDExNywxMTUsMTAxLDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMDgsMTExLDk3LDEwMCwxMDUsCisgICAgMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwzMiwzMiwKKyAgICA5NiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwKKyAgICAxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMzIsMTA1LDExNSwzMiwxMDUsMTEwLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMTEyLAorICAgIDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTE0LDEwNSwxMTgsMTAxLDEwMCwKKyAgICAzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsOTYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsCisgICAgOTYsMzIsMTAwLDEwMSwxMTYsMTAxLDExNCwxMDksMTA1LDExMCwxMDEsMTE1LDMyLDEwNSwxMDIsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5OSwxMTEsCisgICAgMTEwLDExNSwxMDUsMTAwLDEwMSwxMTQsMTAxLDEwMCwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LAorICAgIDEwMywxMDEsMzIsMTExLDExNCwxMCwzMiwzMiwzMiwzMiwxMTAsMTExLDExNiw0NiwzMiwzMiwKKyAgICA3OSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDExNiwxMDQsMTA1LDExNSwzMiwKKyAgICAxMDUsMTE1LDMyLDExNCwxMDEsMTAyLDEwOCwxMDEsOTksMTE2LDEwMSwxMDAsMzIsOTgsMTIxLDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDk2LDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDk2LDMyLDk3LAorICAgIDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwKKyAgICAxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCw5NiwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDk5LDMyLDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLAorICAgIDMyLDExNywxMTUsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNiwKKyAgICAxMTEsMTAsMzIsMzIsMzIsMzIsMTA4LDExMSw5NywxMDAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMDUsCisgICAgMTEwLDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA1LDExNSwzMiw5NywxMTgsCisgICAgOTcsMTA1LDEwOCw5Nyw5OCwxMDgsMTAxLDQ2LDMyLDMyLDg3LDEwNCwxMDEsMTEwLDMyLDEwMiwKKyAgICAxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDExNSwKKyAgICAxMDEsMTE2LDQ0LDMyLDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDMyLDExOSwxMDUsMTA4LDEwOCwzMiwKKyAgICAxMDksOTcsMTE2LDk5LDEwNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5NiwxMDQsOTcsMTE1LAorICAgIDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDk2LDMyLDEwNSwxMTAsMTAwLDEwNSw5OSwKKyAgICA5NywxMTYsMTAxLDExNSwzMiwxMTYsMTA0LDk3LDExNiwzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwKKyAgICAzOSwxMTUsMzIsMzQsMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsMzQsMzIsMTE0LDEwMSwxMDIsMTA4LAorICAgIDEwMSw5OSwxMTYsMTE1LDMyLDk3LDMyLDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LAorICAgIDEwLDMyLDMyLDMyLDMyLDg3LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDUsCisgICAgMTE1LDMyLDg0LDExNCwxMTcsMTAxLDQ0LDMyLDk2LDk1LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwKKyAgICA5NSw5NiwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMzIsMTExLDEwMiwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDExNSwxMDEsCisgICAgMTE2LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk2LDk5LDk3LDk5LDEwNCwxMDEsMTAwLDk2LAorICAgIDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsCisgICAgMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiw5OCwKKyAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDQsMzIsMTA1LDEwMiwKKyAgICAzMiw5NywxMTAsMTIxLDQ2LDMyLDMyLDczLDExNiwxMCwzMiwzMiwzMiwzMiw5OSwxMTEsCisgICAgMTE0LDExNCwxMDEsMTE1LDExMiwxMTEsMTEwLDEwMCwxMTUsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiw5Niw5NSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDEwMCw5NSw5NSw5NiwzMiw5NywxMTYsCisgICAgMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTYsMTE1LAorICAgIDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsCisgICAgMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTE1LDEwMSwxMTMsMTE3LDEwMSwxMTAsOTksMTAxLDMyLDExMSwxMDIsMzIsMTEyLDk3LAorICAgIDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEwNSwxMDEsMTE1LDMyLDExNiwxMTEsMTAsMzIsMzIsCisgICAgMzIsMzIsMTE1LDEwMSw5NywxMTQsOTksMTA0LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMDUsMTA5LAorICAgIDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDExNSw0NiwzMiwzMiw3MywxMDIsMzIsMTE1LDEwMSwxMTYsNDQsMzIsMTA1LDExNSw5NSwKKyAgICAxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsOTgsCisgICAgMTAxLDEwLDMyLDMyLDMyLDMyLDg0LDExNCwxMTcsMTAxLDQ1LDQ1LDk3LDExMCwxMDAsMzIsCisgICAgNzAsOTcsMTA4LDExNSwxMDEsMzIsMTExLDExNiwxMDQsMTAxLDExNCwxMTksMTA1LDExNSwxMDEsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsODAsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE1LDMyLDk3LAorICAgIDExNCwxMDEsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgMTE1LDMyLDExNiwxMDQsOTcsMTE2LDMyLDQwLDEwOSw5NywxMjEsNDEsMzIsMTA0LDk3LDExOCwKKyAgICAxMDEsMzIsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMzIsMzIsNzMsCisgICAgMTAyLDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LDEwLDMyLDMyLDMyLDMyLDEwNCw5NywxMTUsCisgICAgMzIsOTcsMzIsMTEwLDExMSwxMTAsNDUsNzgsMTExLDExMCwxMDEsMzIsMTE4LDk3LDEwOCwxMTcsCisgICAgMTAxLDMyLDEwNSwxMTAsMzIsOTYsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwKICAgICAxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LAotICAgIDk2LDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDEwMSwxMTMsMTE3LDEwMSwxMTAsOTksCi0gICAgMTAxLDMyLDExMSwxMDIsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEwNSwxMDEsCi0gICAgMTE1LDMyLDExNiwxMTEsMTAsMzIsMzIsMzIsMzIsMTE1LDEwMSw5NywxMTQsOTksMTA0LDMyLAotICAgIDExOSwxMDQsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywzMiwxMTUsCi0gICAgMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NiwzMiwzMiw3MywxMDIsMzIsMTE1LAotICAgIDEwMSwxMTYsNDQsMzIsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzIsMTE1LAotICAgIDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsOTgsMTAxLDEwLDMyLDMyLDMyLDMyLDg0LDExNCwxMTcsCi0gICAgMTAxLDQ1LDQ1LDk3LDExMCwxMDAsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsMTExLDExNiwxMDQsCi0gICAgMTAxLDExNCwxMTksMTA1LDExNSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODAsOTcsOTksCi0gICAgMTA3LDk3LDEwMywxMDEsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDExNiwxMDQsOTcsMTE2LDMyLDQwLDEwOSwKLSAgICA5NywxMjEsNDEsMzIsMTA0LDk3LDExOCwxMDEsMzIsMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSwxMTUsNDYsMzIsMzIsNzMsMTAyLDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LDEwLAotICAgIDMyLDMyLDMyLDMyLDEwNCw5NywxMTUsMzIsOTcsMzIsMTEwLDExMSwxMTAsNDUsNzgsMTExLAotICAgIDExMCwxMDEsMzIsMTE4LDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwxMTAsMzIsOTYsMTE1LDExNyw5OCwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSwKLSAgICA5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDk2LDQ0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDEwLDMyLDMyLDMyLDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDMyLAotICAgIDExOSwxMDUsMTA4LDEwOCwzMiw5OSwxMTEsMTEwLDExNSwxMDUsMTAwLDEwMSwxMTQsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsCi0gICAgMTA5LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDMyLDk3LDExNSwzMiwxMTIsOTcsCi0gICAgOTksMTA3LDk3LDEwMywxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc5LDExMCwxMDgsCi0gICAgMTIxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNSwzMiw0MCwxMTUsMTAxLDEwMSwzMiwxMDUsCi0gICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDQ2LDk3LDk4LDk5LDQ2LDc3LDEwMSwxMTYsCi0gICAgOTcsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsCi0gICAgMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCw0Niw5Nyw5OCwKLSAgICA5OSw0Niw4MCw5NywxMTYsMTA0LDY5LDExMCwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsCi0gICAgMTE0LDQxLDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTIxLAotICAgIDMyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSwzMiwxMDUsMTEwLDExNSwxMTYsCi0gICAgOTcsMTEwLDk5LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMjE4LDYsMTExLDExNCwKLSAgICAxMDUsMTAzLDEwNSwxMTAsNzgsMjE4LDEyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsMTE1LDExNiwKLSAgICA5NywxMTYsMTAxLDIxOCwxMCwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwKLSAgICAzLDAsMCwwLDMsMCwwLDAsNiwwLDAsMCwyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw3OSwwLDAsMCwxMjQsMSwwLDEyNCwwLDAsOTUsCi0gICAgMCwwLDEyNCwyLDAsMTI0LDAsMCw5NSwxLDAsMTI0LDMsMCwxMjQsMCwKLSAgICAwLDk1LDIsMCwxMjQsNCwwLDEyNCwwLDAsOTUsMywwLDEyNCw1LDAsCi0gICAgMTE0LDQ4LDAsMTAzLDAsMCwxMTAsMywwLDEwMCwwLDAsMTI0LDAsMCw5NSwKLSAgICA0LDAsMTAwLDEsMCwxMjQsMCwwLDk1LDUsMCwxMDAsMCwwLDEyNCwwLAotICAgIDAsOTUsNiwwLDEwMCwwLDAsODMsNDEsMiw3OCw3MCw0MSw3LDExNCwxNSwKLSAgICAwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA4LDAsCi0gICAgMCwwLDIxOCwyNiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsCi0gICAgOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsMjE4LDEzLAotICAgIDk1LDExNSwxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSw5NywxMTYsMTE2LDExNCwyMTgsNyw5NSwKLSAgICA5OSw5Nyw5OSwxMDQsMTAxLDEwMCw0MSw2LDExNCwxOSwwLDAsMCwxMTQsMTUsMCwKLSAgICAwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsMTA5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCwxMTYsMSwwLDAsMTE1LDE0LAotICAgIDAsMCwwLDAsMiw5LDEsOSwxLDksMSw5LDEsMjEsMyw5LAotICAgIDEsMTIyLDE5LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0Niw5NSw5NSwKLSAgICAxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDIsCi0gICAgMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMTQ3LDAsMCwwLAotICAgIDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDEsMCwxMDAsCi0gICAgMiwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsMTAzLDIsCi0gICAgMCwxMjUsMSwwLDEyNCwwLDAsMTA2LDMsMCwxMDAsMCwwLDEwNyw5LDAsCi0gICAgMTE0LDc2LDAsMTI0LDEsMCwxMDYsNCwwLDEwMCwzLDAsMTA2LDAsMCwxMjQsCi0gICAgMCwwLDEwNiwzLDAsMTMxLDEsMCwxMzEsMSwwLDEsMTI0LDAsMCwxMDYsCi0gICAgNSwwLDEwMCwwLDAsMTA3LDksMCwxMTQsMTE2LDAsMTI0LDEsMCwxMDYsNCwKLSAgICAwLDEwMCw0LDAsMTA2LDAsMCwxMjQsMCwwLDEwNiw1LDAsMTMxLDEsMCwKLSAgICAxMzEsMSwwLDEsMTAwLDUsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDYsMCwKLSAgICAxMDYsNywwLDEwMCw2LDAsMTA2LDgsMCwxMjQsMSwwLDEzMSwxLDAsMTMxLAotICAgIDIsMCw4Myw0MSw3LDc4LDEyMiw5LDExMCw5NywxMDksMTAxLDYxLDEyMywzMywxMTQsCi0gICAgMTI1LDEyMiwxMSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDYxLDEyMywzMywxMTQsMTI1LDEyMiwxMSwKLSAgICAxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCw2MSwxMjMsMzMsMTE0LDEyNSwxMjIsMjksMTE1LDExNyw5OCwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTA4LDExMSwKLSAgICA5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDYxLDEyMywxMjUsMTIyLDYsMTIzLDEyNSw0MCwxMjMsCi0gICAgMTI1LDQxLDEyMiwyLDQ0LDMyLDQxLDksMTE0LDUwLDAsMCwwLDExNCwxNSwwLAotICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwyMTgsNiw5NywxMTIsCi0gICAgMTEyLDEwMSwxMTAsMTAwLDExNCwxMTAsMCwwLDAsMjE4LDksOTUsOTUsOTksMTA4LDk3LAotICAgIDExNSwxMTUsOTUsOTUsMTE0LDEsMCwwLDAsMjE4LDQsMTA2LDExMSwxMDUsMTEwLDQxLAotICAgIDIsMTE0LDE5LDAsMCwwLDExNCwyOSwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsNTIsMCwwLDAsMTI4LAotICAgIDEsMCwwLDExNSwxNiwwLDAsMCwwLDEsMTUsMSwyMSwxLDE1LDEsCi0gICAgMjUsMSwxNSwxLDEyLDEsMTMsMSwxMjIsMTksNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA4MywxMTIsMTAxLDk5LDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSw5OSwyLDAsCi0gICAgMCwwLDAsMCwwLDAsMywwLDAsMCwxMSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMTQ1LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjUsMiwwLAotICAgIDEyMSwxMDcsMCwxMjQsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMDYsMSwwLDEwNywKLSAgICAyLDAsMTExLDExNCwwLDEyNCwwLDAsMTA2LDIsMCwxMjQsMSwwLDEwNiwyLAotICAgIDAsMTA3LDIsMCwxMTEsMTE0LDAsMTI0LDAsMCwxMDYsMywwLDEyNCwxLDAsCi0gICAgMTA2LDMsMCwxMDcsMiwwLDExMSwxMTQsMCwxMjQsMiwwLDEyNCwxLDAsMTA2LAotICAgIDAsMCwxMDcsMiwwLDExMSwxMTQsMCwxMjQsMCwwLDEwNiw0LDAsMTI0LDEsCi0gICAgMCwxMDYsNCwwLDEwNywyLDAsMTExLDExNCwwLDEyNCwwLDAsMTA2LDUsMCwKLSAgICAxMjQsMSwwLDEwNiw1LDAsMTA3LDIsMCw4Myw4NywxMTAsMjIsMCw0LDExNiwKLSAgICA2LDAsMTA3LDEwLDAsMTE0LDE0MCwwLDEsMSwxLDEwMCwxLDAsODMsODksCi0gICAgMTEwLDEsMCw4OCwxMDAsMCwwLDgzLDQxLDIsNzgsNzAsNDEsNywxMTQsMTEwLAotICAgIDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLAotICAgIDAsMCwyMTgsNiw5OSw5Nyw5OSwxMDQsMTAxLDEwMCwyMTgsMTIsMTA0LDk3LDExNSw5NSwKLSAgICAxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsOTYsMCwwLDAsNDEsMywxMTQsCi0gICAgMTksMCwwLDAsOTAsNSwxMTEsMTE2LDEwNCwxMDEsMTE0LDkwLDQsMTE1LDEwOSwxMTUsCi0gICAgMTA4LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLAotICAgIDIxOCw2LDk1LDk1LDEwMSwxMTMsOTUsOTUsMTM4LDEsMCwwLDExNSwyMCwwLDAsCi0gICAgMCwwLDEsOSwxLDMsMSwxOCwxLDE4LDEsMTgsMSwxNSwxLDE4LAotICAgIDEsMjAsMSwxMywxLDEyMiwxNyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsCi0gICAgOTksNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLAotICAgIDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw4NSwwLAotICAgIDAsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLDAsMCwxMDcsOCwwLDExNCw3OCwKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDc4LDAsCi0gICAgMTI0LDAsMCwxMDYsMiwwLDExNCw3OCwwLDExNiwzLDAsMTAwLDAsMCwxMDcsCi0gICAgOCwwLDExNCw1NywwLDExNiw0LDAsMTMwLDEsMCwxMTYsMywwLDEwNiw1LAotICAgIDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwxLDAsMTI0LDAsMCw5NSwwLDAsCi0gICAgMTI0LDAsMCwxMDYsMCwwLDgzLDQxLDEsNzgsNDEsNiwxMTQsMTEyLDAsMCwKLSAgICAwLDExNCwxMDcsMCwwLDAsMTE0LDExMSwwLDAsMCwyMTgsMTksOTUsOTgsMTExLAotICAgIDExMSwxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LDEwOCwKLSAgICAyMTgsMTksNzgsMTExLDExNiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsCi0gICAgNjksMTE0LDExNCwxMTEsMTE0LDkwLDExLDk1LDEwMywxMDEsMTE2LDk1LDk5LDk3LDk5LDEwNCwKLSAgICAxMDEsMTAwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMTYsMCwwLDAsMTUwLDEsMCwKLSAgICAwLDExNSwxMiwwLDAsMCwwLDIsMTUsMSwyNCwxLDEyLDEsNiwxLAotICAgIDIxLDEsMTIyLDE3LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0Niw5OSwKLSAgICA5Nyw5OSwxMDQsMTAxLDEwMCw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAotICAgIDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMjQsCi0gICAgMSwwLDEyNCwwLDAsOTUsMCwwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwKLSAgICAxLDExNCwxMTIsMCwwLDAsNDEsMiwxMTQsMTksMCwwLDAsMTE0LDExNiwwLAotICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCi0gICAgMCwxMTQsMTE2LDAsMCwwLDE1OSwxLDAsMCwxMTUsMiwwLDAsMCwwLAotICAgIDIsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsNDYsMCwwLDAsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMzUsMCwxMjQsMCwwLDEwNiwxLDAsCi0gICAgMTA2LDIsMCwxMDAsMiwwLDEzMSwxLDAsMTAwLDMsMCwyNSw4MywxMjQsMCwKLSAgICAwLDEwNiwxLDAsODMsMTAwLDEsMCw4Myw0MSw0LDEyMiwzMiw4NCwxMDQsMTAxLAotICAgIDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDYsNzgsMjE4LDEsCi0gICAgNDYsMTE0LDMzLDAsMCwwLDQxLDMsMTE0LDExMCwwLDAsMCwxMTQsMTUsMCwKLSAgICAwLDAsMjE4LDEwLDExNCwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsMTEwLDQxLDEsCi0gICAgMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDExLDAsMCwwLDIxOCw2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsMTYzLDEsMCwwLAotICAgIDExNSw2LDAsMCwwLDAsMywxNSwxLDIwLDIsMTIyLDE3LDc3LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0NiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk5LDEsCi0gICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDcsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDgzLDQxLAotICAgIDEsNzgsNDEsMSwxMTQsMTExLDAsMCwwLDQxLDEsMTE0LDE5LDAsMCwwLAorICAgIDk2LDQ0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwLDMyLDMyLAorICAgIDMyLDMyLDExNSwxMjEsMTE1LDExNiwxMDEsMTA5LDMyLDExOSwxMDUsMTA4LDEwOCwzMiw5OSwxMTEsCisgICAgMTEwLDExNSwxMDUsMTAwLDEwMSwxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwOCwKKyAgICAxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDMyLDk3LDExNSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE1LDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDc5LDExMCwxMDgsMTIxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDExNSwzMiw0MCwxMTUsMTAxLDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LAorICAgIDk4LDQ2LDk3LDk4LDk5LDQ2LDc3LDEwMSwxMTYsOTcsODAsOTcsMTE2LDEwNCw3MCwxMDUsCisgICAgMTEwLDEwMCwxMDEsMTE0LDMyLDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsCisgICAgMTExLDExNCwxMTYsMTA4LDEwNSw5OCw0Niw5Nyw5OCw5OSw0Niw4MCw5NywxMTYsMTA0LDY5LAorICAgIDExMCwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQxLDMyLDExNSwxMDQsMTExLDExNywKKyAgICAxMDgsMTAwLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTIxLDMyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgODMsMTEyLDEwMSw5OSwzMiwxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwxMTUsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsNzgsNDEsMywyMTgsNiwxMTEsMTE0LDEwNSwxMDMsMTA1LDExMCwKKyAgICAyMTgsMTIsMTA4LDExMSw5NywxMDAsMTAxLDExNCw5NSwxMTUsMTE2LDk3LDExNiwxMDEsMjE4LDEwLAorICAgIDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LDMsMCwwLDAsMywKKyAgICAwLDAsMCw2LDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDU0LDAsMCwwLDEyNCwxLDEyNCwwLDk1LDAsMTI0LDIsMTI0LDAsOTUsMSwKKyAgICAxMjQsMywxMjQsMCw5NSwyLDEyNCw0LDEyNCwwLDk1LDMsMTI0LDUsMTE0LDMyLAorICAgIDEwMywwLDExMCwyLDEwMCwwLDEyNCwwLDk1LDQsMTAwLDEsMTI0LDAsOTUsNSwKKyAgICAxMDAsMCwxMjQsMCw5NSw2LDEwMCwwLDgzLDAsNDEsMiw3OCw3MCw0MSw3LAorICAgIDExNCwxNSwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsCisgICAgMTA4LDAsMCwwLDIxOCwyNiwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LAorICAgIDExNSwxMDEsOTcsMTE0LDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsCisgICAgMjE4LDEzLDk1LDExNSwxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSw5NywxMTYsMTE2LDExNCwyMTgsCisgICAgNyw5NSw5OSw5Nyw5OSwxMDQsMTAxLDEwMCw0MSw2LDExNCwxOSwwLDAsMCwxMTQsCisgICAgMTUsMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOCwKKyAgICAwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwyMCwwLDAsMCwxMTYsMSwwLDAsCisgICAgMTE1LDE0LDAsMCwwLDAsMiw2LDEsNiwxLDYsMSw2LDEsMTQsCisgICAgMyw2LDEsMTIyLDE5LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0NiwKKyAgICA5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwKKyAgICAwLDIsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMTAyLDAsCisgICAgMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwxLDEwMCwyLDEwNiwwLAorICAgIDEyNCwwLDEwNiwyLDEzMSwxLDEwMywyLDEyNSwxLDEyNCwwLDEwNiwzLDEwMCwwLAorICAgIDEwNyw5LDExNCw1MiwxMjQsMSwxMDYsNCwxMDAsMywxMDYsMCwxMjQsMCwxMDYsMywKKyAgICAxMzEsMSwxMzEsMSwxLDAsMTI0LDAsMTA2LDUsMTAwLDAsMTA3LDksMTE0LDgwLAorICAgIDEyNCwxLDEwNiw0LDEwMCw0LDEwNiwwLDEyNCwwLDEwNiw1LDEzMSwxLDEzMSwxLAorICAgIDEsMCwxMDAsNSwxMDYsMCwxMjQsMCwxMDYsNiwxMDYsNywxMDAsNiwxMDYsOCwKKyAgICAxMjQsMSwxMzEsMSwxMzEsMiw4MywwLDQxLDcsNzgsMTIyLDksMTEwLDk3LDEwOSwKKyAgICAxMDEsNjEsMTIzLDMzLDExNCwxMjUsMTIyLDExLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNjEsMTIzLAorICAgIDMzLDExNCwxMjUsMTIyLDExLDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDYxLDEyMywzMywxMTQsMTI1LAorICAgIDEyMiwyOSwxMTUsMTE3LDk4LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNSwxMDEsOTcsMTE0LAorICAgIDk5LDEwNCw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTUsNjEsMTIzLDEyNSwxMjIsCisgICAgNiwxMjMsMTI1LDQwLDEyMywxMjUsNDEsMTIyLDIsNDQsMzIsNDEsOSwxMTQsNTAsMCwKKyAgICAwLDAsMTE0LDE1LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwKKyAgICAwLDIxOCw2LDk3LDExMiwxMTIsMTAxLDExMCwxMDAsMTE0LDExMCwwLDAsMCwyMTgsOSwKKyAgICA5NSw5NSw5OSwxMDgsOTcsMTE1LDExNSw5NSw5NSwxMTQsMSwwLDAsMCwyMTgsNCwKKyAgICAxMDYsMTExLDEwNSwxMTAsNDEsMiwxMTQsMTksMCwwLDAsMTE0LDI5LDAsMCwwLAogICAgIDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwKLSAgICAxMTcsMCwwLDAsMTcxLDEsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsCi0gICAgMjMsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDEwNCw5NywxMTUsOTUsCi0gICAgMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTksMCwKLSAgICAwLDAsMTE2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTI0LDAsMCw5NSwxLAotICAgIDAsMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDIsMjE4LDQsOTgsMTExLDExMSwxMDgsCi0gICAgMTE0LDExMSwwLDAsMCw0MSwyLDExNCwxOSwwLDAsMCwyMTgsNSwxMTgsOTcsCi0gICAgMTA4LDExNywxMDEsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKLSAgICAwLDAsMTE0LDExNywwLDAsMCwxNzUsMSwwLDAsMTE1LDIsMCwwLDAsCi0gICAgMCwyLDQxLDEyLDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLAotICAgIDAsMCwwLDExNCwzLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsNTIsMCwKLSAgICAwLDAsMTE0LDExOCwwLDAsMCwyMTgsOCwxMTIsMTE0LDExMSwxMTIsMTAxLDExNCwxMTYsCi0gICAgMTIxLDExNCwxMTYsMCwwLDAsMjE4LDYsMTE1LDEwMSwxMTYsMTE2LDEwMSwxMTQsMTE0LDEyMywKLSAgICAwLDAsMCwxMTQsMTE3LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTA2LDAsMCwKLSAgICAwLDc5LDEsMCwwLDExNSwyMCwwLDAsMCwxMiwzNSw2LDIsMTUsMSwKLSAgICAxNSwxMSwxMiwxMCwxMiwxMiwxOCw5LDIxLDQsMTgsOCwxOCw0LDExNCwxMDYsCi0gICAgMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA5LDAsMCwwLDk5LDIsMCwKKyAgICA1MiwwLDAsMCwxMjgsMSwwLDAsMTE1LDE2LDAsMCwwLDAsMSwxMCwKKyAgICAxLDE0LDEsMTAsMSwxOCwxLDEwLDEsOCwxLDEwLDEsMTIyLDE5LDc3LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0Niw5NSw5NSwxMTQsMTAxLDExMiwxMTQsCisgICAgOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMTEsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDEwMiwwLDAsMCwxMjQsMCwxMDYsMCwKKyAgICAxMjUsMiwxMjEsNzAsMTI0LDAsMTA2LDEsMTI0LDEsMTA2LDEsMTA3LDIsMTExLDc2LAorICAgIDEyNCwwLDEwNiwyLDEyNCwxLDEwNiwyLDEwNywyLDExMSw3NiwxMjQsMCwxMDYsMywKKyAgICAxMjQsMSwxMDYsMywxMDcsMiwxMTEsNzYsMTI0LDIsMTI0LDEsMTA2LDAsMTA3LDIsCisgICAgMTExLDc2LDEyNCwwLDEwNiw0LDEyNCwxLDEwNiw0LDEwNywyLDExMSw3NiwxMjQsMCwKKyAgICAxMDYsNSwxMjQsMSwxMDYsNSwxMDcsMiw4MywwLDQsMCwxMTYsNiwxMDcsMTAsCisgICAgMTE0LDk2LDEsMCwxLDAsMSwwLDEwMCwxLDgzLDAsODgsMCwxMDAsMCwKKyAgICA4MywwLDQxLDIsNzgsNzAsNDEsNywxMTQsMTEwLDAsMCwwLDExNCwxNSwwLAorICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwyMTgsNiw5OSw5NywKKyAgICA5OSwxMDQsMTAxLDEwMCwyMTgsMTIsMTA0LDk3LDExNSw5NSwxMDgsMTExLDk5LDk3LDExNiwxMDUsCisgICAgMTExLDExMCwxMTQsOTYsMCwwLDAsNDEsMywxMTQsMTksMCwwLDAsOTAsNSwKKyAgICAxMTEsMTE2LDEwNCwxMDEsMTE0LDkwLDQsMTE1LDEwOSwxMTUsMTA4LDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw2LDk1LDk1LDEwMSwxMTMsCisgICAgOTUsOTUsMTM4LDEsMCwwLDExNSwyMCwwLDAsMCwwLDEsNiwxLDIsCisgICAgMSwxMiwxLDEyLDEsMTIsMSwxMCwxLDEyLDEsMTIsMSwxNCwxLDEyMiwKKyAgICAxNyw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksNDYsOTUsOTUsMTAxLDExMywKKyAgICA5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSw1OCwwLDAsMCwxMjQsMCwxMDYsMCwKKyAgICAxMDAsMCwxMDcsOCwxMTQsNTIsMTI0LDAsMTA2LDEsMTAwLDAsMTA3LDksMTE0LDUyLAorICAgIDEyNCwwLDEwNiwyLDExNCw1MiwxMTYsMywxMDAsMCwxMDcsOCwxMTQsMzgsMTE2LDQsCisgICAgMTMwLDEsMTE2LDMsMTA2LDUsMTI0LDAsMTA2LDEsMTMxLDEsMTI0LDAsOTUsMCwKKyAgICAxMjQsMCwxMDYsMCw4MywwLDQxLDEsNzgsNDEsNiwxMTQsMTEyLDAsMCwwLAorICAgIDExNCwxMDcsMCwwLDAsMTE0LDExMSwwLDAsMCwyMTgsMTksOTUsOTgsMTExLDExMSwKKyAgICAxMTYsMTE1LDExNiwxMTQsOTcsMTEyLDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LDEwOCwyMTgsCisgICAgMTksNzgsMTExLDExNiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDkwLDExLDk1LDEwMywxMDEsMTE2LDk1LDk5LDk3LDk5LDEwNCwxMDEsCisgICAgMTAwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwxMTYsMCwwLDAsMTUwLDEsMCwwLAorICAgIDExNSwxMiwwLDAsMCwwLDIsMTAsMSwxNiwxLDgsMSw0LDEsMTQsCisgICAgMSwxMjIsMTcsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsMTAxLDk5LDQ2LDk5LDk3LAorICAgIDk5LDEwNCwxMDEsMTAwLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDEyNCwxLAorICAgIDEyNCwwLDk1LDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDEsMTE0LDExMiwwLAorICAgIDAsMCw0MSwyLDExNCwxOSwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMTYsMCwKKyAgICAwLDAsMTU5LDEsMCwwLDExNSwyLDAsMCwwLDAsMiw5OSwxLDAsCisgICAgMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwzOCwwLDAsMCwxMjQsMCwxMDYsMCwxMDAsMSwxMDcsOCwxMTQsCisgICAgMjgsMTI0LDAsMTA2LDEsMTA2LDIsMTAwLDIsMTMxLDEsMTAwLDMsMjUsMCw4MywKKyAgICAwLDExMCw2LDEyNCwwLDEwNiwxLDgzLDAsMTAwLDEsODMsMCw0MSw0LDEyMiwKKyAgICAzMiw4NCwxMDQsMTAxLDMyLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsCisgICAgNDYsNzgsMjE4LDEsNDYsMTE0LDMzLDAsMCwwLDQxLDMsMTE0LDExMCwwLDAsCisgICAgMCwxMTQsMTUsMCwwLDAsMjE4LDEwLDExNCwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwKKyAgICAxMTEsMTEwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDIxOCw2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsCisgICAgMTYzLDEsMCwwLDExNSw2LDAsMCwwLDAsMywxMCwxLDE4LDIsMTIyLAorICAgIDE3LDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0NiwxMTIsOTcsMTE0LDEwMSwKKyAgICAxMTAsMTE2LDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDYsMCwwLDAsMTI0LDAsMTA2LDAsCisgICAgODMsMCw0MSwxLDc4LDQxLDEsMTE0LDExMSwwLDAsMCw0MSwxLDExNCwxOSwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwxMTQsMTE3LDAsMCwwLDE3MSwxLDAsMCwxMTUsMiwwLDAsMCwKKyAgICAwLDIsMTIyLDIzLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsODMsMTEyLDEwMSw5OSw0NiwxMDQsCisgICAgOTcsMTE1LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDk5LDIsMCwwLDAsCisgICAgMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDE0LDAsMCwwLDExNiwwLDEyNCwxLDEzMSwxLDEyNCwwLDk1LDEsMTAwLAorICAgIDAsODMsMCw0MSwxLDc4LDQxLDIsMjE4LDQsOTgsMTExLDExMSwxMDgsMTE0LDExMSwKKyAgICAwLDAsMCw0MSwyLDExNCwxOSwwLDAsMCwyMTgsNSwxMTgsOTcsMTA4LDExNywKKyAgICAxMDEsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMTE0LDExNywwLDAsMCwxNzUsMSwwLDAsMTE1LDIsMCwwLDAsMCwyLAorICAgIDQxLDEyLDExNCwxLDAsMCwwLDExNCwwLDAsMCwwLDExNCwyLDAsMCwKKyAgICAwLDExNCwzLDAsMCwwLDExNCwyMCwwLDAsMCwxMTQsNTIsMCwwLDAsCisgICAgMTE0LDExOCwwLDAsMCwyMTgsOCwxMTIsMTE0LDExMSwxMTIsMTAxLDExNCwxMTYsMTIxLDExNCwKKyAgICAxMTYsMCwwLDAsMjE4LDYsMTE1LDEwMSwxMTYsMTE2LDEwMSwxMTQsMTE0LDEyMywwLDAsCisgICAgMCwxMTQsMTE3LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTA2LDAsMCwwLDc5LAorICAgIDEsMCwwLDExNSwyMCwwLDAsMCw4LDM1LDQsMiw0LDEsMTQsMTEsCisgICAgOCwxMCw4LDEyLDEyLDksMTQsNCwxMiw4LDEyLDQsMTE0LDEwNiwwLDAsCisgICAgMCw0MSwyLDExNCwxMDcsMCwwLDAsMTE0LDEwOSwwLDAsMCw5OSwyLDAsCiAgICAgMCwwLDIsMCwwLDAsNiwwLDAsMCwxNSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMjE3LDAsMCwwLDExNiwwLDAsMTI0LDEsMCwxMDAsMSwwLAotICAgIDEzMSwyLDAsMTE0LDExMCwwLDExNiwxLDAsMTAwLDIsMCwxMDcsOCwwLDExNCwKLSAgICAzMywwLDExNiwyLDAsMTMwLDEsMCwxMTYsMSwwLDEwNiwzLDAsMTI1LDQsCi0gICAgMCwxMjQsMywwLDEwMCwyLDAsMTA3LDgsMCwxMTQsNzAsMCwxMjQsNCwwLAotICAgIDEyNCwwLDAsMTAwLDMsMCwxMjQsMSwwLDEzMSwxLDEsODMsMTI0LDMsMCwKLSAgICAxMTQsODIsMCwxMDMsMCwwLDExMCwzLDAsMTAwLDIsMCwxMjUsNSwwLDEyNCwKLSAgICA0LDAsMTI0LDAsMCwxMDAsMywwLDEyNCwxLDAsMTAwLDQsMCwxMjQsNSwKLSAgICAwLDEzMSwxLDIsODMsMTI0LDMsMCwxMDAsMiwwLDEwNyw4LDAsMTE0LDE5MiwKLSAgICAwLDExNiwwLDAsMTI0LDEsMCwxMDAsNSwwLDEzMSwyLDAsMTE0LDE4NiwwLAotICAgIDEyMSwxOSwwLDEyNCwxLDAsMTA2LDQsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LAotICAgIDMsMCw4NywxMTMsMTkyLDAsNCwxMTYsNSwwLDEwNywxMCwwLDExNCwxODIsMCwKLSAgICAxLDEsMSwxMDAsMiwwLDEyNSwzLDAsODksMTEzLDE5MiwwLDg4LDExMCw2LAotICAgIDAsMTAwLDYsMCwxMjUsMywwLDExNiw2LDAsMTI0LDAsMCwxMjQsMSwwLAotICAgIDEwMCw3LDAsMTI0LDIsMCwxMDAsNSwwLDEyNCwzLDAsMTMxLDIsMiw4MywKLSAgICA0MSw4LDEyMiw1Myw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDk3LDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDMyLDk4LDk3LDExNSwxMDEsMTAwLDMyLDExMSwKLSAgICAxMTAsMzIsMTE4LDk3LDExNCwxMDUsMTExLDExNywxMTUsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTUsNDYsOTAsMTIsMTAzLDEwMSwxMTYsOTUsMTAyLAotICAgIDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDExNCw5OSwwLDAsMCwxMTQsMTEwLDAsCi0gICAgMCwwLDExNCwxMDksMCwwLDAsNzAsMTE0LDEwNywwLDAsMCw0MSw3LDExNCwKLSAgICA0LDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDEyMCwwLDAsMCwyMTgsMjMsCi0gICAgMTE1LDExMiwxMDEsOTksOTUsMTAyLDExNCwxMTEsMTA5LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSwxMDgsCi0gICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsMTA5LDAsMCwwLDExNCw3NywwLDAsCi0gICAgMCwxMTQsMTA2LDAsMCwwLDQxLDYsMTE0LDE1LDAsMCwwLDExNCw5OSwwLAotICAgIDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDEyOCwwLDAsCi0gICAgMCw5MCw2LDExNSwxMDEsOTcsMTE0LDk5LDEwNCwxMTQsMTAsMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsODUsMCwwLDAsMTgwLDEsMCwKLSAgICAwLDExNSwzNCwwLDAsMCwwLDIsMTUsMSwxMiwxLDYsMSw5LDIsCi0gICAgMTIsMSwxNiwxLDE4LDEsMTUsMSw3LDIsMTIsMSwxNSwxLDMsMSwKLSAgICAxOSwxLDEzLDEsMTQsMyw2LDIsMTE0LDg1LDAsMCwwLDk5LDMsMCwKLSAgICAwLDAsMCwwLDAsMCw4LDAsMCwwLDUzLDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwxMTgsMSwwLDAsMTIxLDEzLDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEyNSwzLDAsODcsMTEwLDE4LDAsNCwxMTYsMSwwLDEwNywxMCwwLDExNCwzMywKLSAgICAwLDEsMSwxLDg5LDExMCwxNywwLDg4LDEyNCwzLDAsMTAwLDAsMCwxMDcsCi0gICAgOSwwLDExNCw1MCwwLDEyNCwzLDAsODMsMTI0LDAsMCwxMDYsMiwwLDEyNSwKLSAgICA0LDAsMTI0LDEsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDEwNSwwLDEyMSwxMywKLSAgICAwLDEyNCwwLDAsMTA2LDMsMCwxMjUsMSwwLDg3LDExMCwxOCwwLDQsMTE2LAotICAgIDEsMCwxMDcsMTAsMCwxMTQsMTA0LDAsMSwxLDEsODksMTEwLDEsMCw4OCwKLSAgICAxMjEsMTMsMCwxMjQsMCwwLDEwNiw0LDAsMTI1LDUsMCw4NywxMTAsMjQsMCwKLSAgICA0LDExNiwxLDAsMTA3LDEwLDAsMTE0LDE0NCwwLDEsMSwxLDEwMCwwLDAsCi0gICAgMTI1LDUsMCw4OSwxMTAsMSwwLDg4LDEyNCwyLDAsMTAwLDAsMCwxMDcsOCwKLSAgICAwLDExNCwyMTgsMCwxMjQsNSwwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMjEyLDAsCi0gICAgMTIxLDEzLDAsMTI0LDEsMCwxMDYsNSwwLDEyNSwyLDAsODcsMTEzLDIxOCwwLAotICAgIDQsMTE2LDEsMCwxMDcsMTAsMCwxMTQsMjA4LDAsMSwxLDEsMTAwLDAsMCwKLSAgICAxMjUsMiwwLDg5LDExMywyMTgsMCw4OCwxMTAsNiwwLDEyNCw1LDAsMTI1LDIsCi0gICAgMCwxMjEsMTMsMCwxMjQsMCwwLDEwNiw2LDAsMTI1LDYsMCw4NywxMTAsMjQsCi0gICAgMCw0LDExNiwxLDAsMTA3LDEwLDAsMTE0LDEsMSwxLDEsMSwxMDAsMCwKLSAgICAwLDEyNSw2LDAsODksMTEwLDEsMCw4OCwxMjEsMTksMCwxMTYsNywwLDEyNCwKLSAgICAwLDAsMTA2LDgsMCwxMzEsMSwwLDEyNSw3LDAsODcsMTEwLDI0LDAsNCwKLSAgICAxMTYsMSwwLDEwNywxMCwwLDExNCw0NywxLDEsMSwxLDEwMCwwLDAsMTI1LAotICAgIDcsMCw4OSwxMTAsMSwwLDg4LDExNiw5LDAsMTI0LDQsMCwxMjQsMSwwLAotICAgIDEwMCwxLDAsMTI0LDIsMCwxMzEsMiwxLDEyNSwzLDAsMTI0LDUsMCwxMDAsCi0gICAgMCwwLDEwNyw4LDAsMTE0LDg3LDEsMTAwLDIsMCwxMTAsMywwLDEwMCwzLAotICAgIDAsMTI0LDMsMCw5NSwxMCwwLDEyNCw2LDAsMTI0LDMsMCw5NSwxMSwwLAotICAgIDEyNCw3LDAsMTI0LDMsMCw5NSwxMiwwLDEyNCwzLDAsODMsNDEsNCw3OCwKLSAgICAxMTQsMTA3LDAsMCwwLDcwLDg0LDQxLDEzLDExNCw5NSwwLDAsMCwxMTQsOTYsCi0gICAgMCwwLDAsMTE0LDEsMCwwLDAsMTE0LDkxLDAsMCwwLDExNCw5OCwwLAotICAgIDAsMCw5MCw3LDk1LDc5LDgyLDczLDcxLDczLDc4LDIxOCwxMCw5NSw5NSw5OSwKLSAgICA5Nyw5OSwxMDQsMTAxLDEwMCw5NSw5NSwyMTgsNCwxMDgsMTA1LDExNSwxMTYsMjE4LDgsOTUsCi0gICAgOTUsMTEyLDk3LDExNiwxMDQsOTUsOTUsMTE0LDEwNiwwLDAsMCwxMTQsMTExLDAsMCwKLSAgICAwLDExNCwxMTYsMCwwLDAsMTE0LDExMCwwLDAsMCw0MSw4LDExNCw4OSwwLAotICAgIDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsODgsMCwwLAotICAgIDAsMTE0LDE1LDAsMCwwLDkwLDgsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsCi0gICAgMTE0LDExNiwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNyw5NSwxMTUsMTEyLDEwMSw5OSwKLSAgICA5NSwxMDIsMTE0LDExMSwxMDksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMjA5LDEsMCwwLAotICAgIDExNSw3MiwwLDAsMCwwLDIsMywxLDEzLDEsMTMsMSw1LDIsMTIsCi0gICAgMSw0LDIsOSwxLDEyLDEsMywxLDEzLDEsMTMsMiw1LDEsMywKLSAgICAxLDEzLDEsMTMsMSwxMSwxLDEyLDEsMTIsMSwzLDEsMTMsMSwxMywKLSAgICAxLDE0LDIsNiwxLDMsMSwxMywxLDEzLDEsMTEsMSwzLDEsMTksCi0gICAgMSwxMywxLDExLDIsMjEsMSwyNywxLDksMSw5LDEsMTE0LDEzMiwwLAotICAgIDAsMCwyMTgsOCwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDcwLDk5LDIsMCwKLSAgICAwLDAsMSwwLDAsMCw1LDAsMCwwLDU5LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSw1NCwyLDAsMCwxMjQsMiwwLDExNSwzMCwwLDExNiwwLDAsCi0gICAgMTI0LDEsMCwxMDAsMSwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwwLDEwNywKLSAgICA4LDAsMTE0LDY3LDAsMTIxLDE2LDAsMTI0LDAsMCwxMDYsMSwwLDEyNCwxLAotICAgIDAsOTUsMiwwLDg3LDExMCwxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsCi0gICAgNjYsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwyLDAsMTE1LDk3LDAsCi0gICAgMTE2LDAsMCwxMjQsMSwwLDEwMCwyLDAsMTAwLDAsMCwxMzEsMywwLDEwMCwKLSAgICAwLDAsMTA3LDgsMCwxMTQsMjIxLDAsMTI0LDAsMCwxMDYsNCwwLDEyNSwzLAotICAgIDAsMTI0LDMsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDE4NywwLDEyNCwwLDAsCi0gICAgMTA2LDUsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDE4NywwLDExNiw2LDAsMTAwLAotICAgIDAsMCwxMDcsOCwwLDExNCwxNTEsMCwxMTYsNywwLDEzMCwxLDAsMTE2LDYsCi0gICAgMCwxMDYsOCwwLDEyNSw0LDAsMTI0LDQsMCwxMDYsOSwwLDEyNCw0LDAsCi0gICAgMTMxLDEsMCwxMjUsMywwLDEyNCwwLDAsMTA2LDUsMCwxMjQsMywwLDk1LAotICAgIDEwLDAsMTIxLDEzLDAsMTI0LDMsMCwxMjQsMSwwLDk1LDExLDAsODcsMTEwLAotICAgIDE4LDAsNCwxMTYsMywwLDEwNywxMCwwLDExNCwyMjAsMCwxLDEsMSw4OSwKLSAgICAxMTAsMSwwLDg4LDEyNCwyLDAsMTE1LDI1MSwwLDExNiwwLDAsMTI0LDEsMCwKLSAgICAxMDAsMywwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LAotICAgIDMyLDEsMTIxLDE2LDAsMTI0LDAsMCwxMDYsMTIsMCwxMjQsMSwwLDk1LDEzLAotICAgIDAsODcsMTEwLDE4LDAsNCwxMTYsMywwLDEwNywxMCwwLDExNCwzMSwxLDEsCi0gICAgMSwxLDg5LDExMCwxLDAsODgsMTIxLDEzLDAsMTI0LDAsMCwxMjQsMSwwLAotICAgIDk1LDE0LDAsODcsMTEwLDE4LDAsNCwxMTYsMywwLDEwNywxMCwwLDExNCw2NSwKLSAgICAxLDEsMSwxLDg5LDExMCwxLDAsODgsMTI0LDIsMCwxMTUsOTYsMSwxMTYsCi0gICAgMCwwLDEyNCwxLDAsMTAwLDQsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsCi0gICAgMCwxMDcsOCwwLDExNCwxNDgsMSwxMjQsMCwwLDEwNiw1LDAsMTAwLDAsMCwKLSAgICAxMDcsOSwwLDExNCwxNDgsMSwxMjEsMTYsMCwxMjQsMCwwLDEwNiw1LDAsMTI0LAotICAgIDEsMCw5NSwxNSwwLDg3LDExMCwxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwKLSAgICAxMTQsMTQ3LDEsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMCwwLDEwNiwxNiwKLSAgICAwLDExNCw1MCwyLDEyNCwyLDAsMTE1LDE4NywxLDExNiwwLDAsMTI0LDEsMCwKLSAgICAxMDAsNSwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LAotICAgIDIyNCwxLDEyMSwxNiwwLDEyNCwwLDAsMTA2LDE3LDAsMTI0LDEsMCw5NSwxOCwKLSAgICAwLDg3LDExMCwxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsMjIzLDEsMSwKLSAgICAxLDEsODksMTEwLDEsMCw4OCwxMjQsMiwwLDExNSwyNTQsMSwxMTYsMCwwLAotICAgIDEyNCwxLDAsMTAwLDYsMCwxMDAsMCwwLDEzMSwzLDAsMTAwLDAsMCwxMDcsCi0gICAgOCwwLDExNCw1MCwyLDEyNCwwLDAsMTA2LDE5LDAsMTAwLDAsMCwxMDcsOSwKLSAgICAwLDExNCw1MCwyLDEyMSwxNiwwLDEyNCwwLDAsMTA2LDE5LDAsMTI0LDEsMCwKLSAgICA5NSwyMCwwLDg3LDExMCwxOCwwLDQsMTE2LDMsMCwxMDcsMTAsMCwxMTQsNDksCi0gICAgMiwxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCwxLDAsODMsNDEsNyw3OCwKLSAgICAxMTQsMSwwLDAsMCwxMTQsOTEsMCwwLDAsMjE4LDExLDk1LDk1LDExMiw5NywKLSAgICA5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSwxMTQsMTMxLDAsMCwwLDExNCw5OCwwLDAsCi0gICAgMCwxMTQsMTI5LDAsMCwwLDQxLDIxLDExNCw2LDAsMCwwLDExNCwxNSwwLAotICAgIDAsMCwxMTQsMSwwLDAsMCwxMTQsOTYsMCwwLDAsMTE0LDk5LDAsMCwKLSAgICAwLDExNCwxMTAsMCwwLDAsMTE0LDExOSwwLDAsMCwxMTQsMTIwLDAsMCwwLAotICAgIDIxOCwxNiw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCwyMTgsNyw5NSw5NSwxMTAsMTAxLDExOSw5NSw5NSw5MCw1LDk1LDExMiw5NywKLSAgICAxMTYsMTA0LDExNCw5MSwwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwxMzQsMCwwLAotICAgIDAsMTE0LDk1LDAsMCwwLDExNCwxMzEsMCwwLDAsMTE0LDExNywwLDAsMCwKLSAgICAxMTQsMTA3LDAsMCwwLDExNCw5OCwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwKLSAgICAxMjksMCwwLDAsNDEsNSwxMTQsODgsMCwwLDAsMTE0LDg5LDAsMCwwLAotICAgIDExNCwxMzMsMCwwLDAsMTE0LDk5LDAsMCwwLDExNCwxMzUsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE4LAotICAgIDk1LDEwNSwxMTAsMTA1LDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSw5NywxMTYsMTE2LAotICAgIDExNCwxMTUsMjU0LDEsMCwwLDExNSw5MiwwLDAsMCwwLDQsMzAsMSwzLAotICAgIDEsMTYsMSwxMywxLDUsMiwzMCwxLDksMSwxMiwyLDE1LDEsMTIsCi0gICAgMSw2LDEsOSwyLDE1LDEsMTIsMSwzLDEsMTMsMSwxMywxLDUsCi0gICAgMiwzMCwxLDMsMSwxNiwxLDEzLDEsNSwyLDMsMSwxMywxLDEzLAotICAgIDEsNSwyLDMwLDEsMTUsMSwzLDEsMTYsMSwxMywxLDUsMiw5LAotICAgIDEsMzAsMSwzLDEsMTYsMSwxMywxLDUsMiwzMCwxLDE1LDEsMywKLSAgICAxLDE2LDEsMTMsMSw1LDEsMTE0LDEzNywwLDAsMCw5OSwxLDAsMCwKLSAgICAwLDAsMCwwLDAsMiwwLDAsMCw1LDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwxMjksMCwwLDAsMTAwLDEsMCwxMjUsMSwwLDExNiwwLDAsMTI0LAotICAgIDAsMCwxMDYsMSwwLDEwMCwyLDAsMTMxLDIsMCwxMTQsNDUsMCwxMjQsMCwKLSAgICAwLDEwNiwxLDAsMTA2LDIsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDEsMCwKLSAgICAxMTAsNDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMDAsMywwLDEzMSwKLSAgICAyLDAsMTE0LDg1LDAsMTE2LDMsMCwxMDYsNCwwLDEwMCw0LDAsMTE2LDUsCi0gICAgMCwxMDAsNSwwLDEwMCw2LDAsMTMxLDIsMSwxLDEyNCwxLDAsMTAwLDEsCi0gICAgMCwxMDcsOCwwLDExNCwxMTIsMCwxMTYsNiwwLDEyNCwwLDAsMTA2LDcsMCwKLSAgICAxMzEsMSwwLDEyNSwxLDAsMTE2LDgsMCwxMjQsMCwwLDEyNCwxLDAsMTMxLAotICAgIDIsMCwxLDEyNCwxLDAsODMsNDEsNywxMjIsNDMsNjcsMTE0LDEwMSw5NywxMTYsCi0gICAgMTAxLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk4LDk3LDExNSwxMDEsMTAwLAotICAgIDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNCwxMTEsMTE4LDEwNSwxMDAsMTAxLDEwMCwKLSAgICAzMiwxMTUsMTEyLDEwMSw5OSw0Niw3OCwyMTgsMTMsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDIxOCwxMSwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwxMjIsODcsMTE1LDExNiw5NywxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDEwNSwxMTAsCi0gICAgMzIsODAsMTIxLDExNiwxMDQsMTExLDExMCwzMiw1MSw0Niw1NCw0NCwzMiwxMDgsMTExLDk3LAotICAgIDEwMCwxMDEsMTE0LDExNSwzMiwxMDAsMTAxLDEwMiwxMDUsMTEwLDEwNSwxMTAsMTAzLDMyLDEwMSwxMjAsCi0gICAgMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwOSwxMTcsMTE1LDExNiwKLSAgICAzMiw5NywxMDgsMTE1LDExMSwzMiwxMDAsMTAxLDEwMiwxMDUsMTEwLDEwMSwzMiw5OSwxMTQsMTAxLAotICAgIDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsOTAsMTAsMTE1LDExNiwKLSAgICA5Nyw5OSwxMDcsMTA4LDEwMSwxMTgsMTAxLDEwOCwyMzMsMiwwLDAsMCw0MSw5LDExNCwKLSAgICA0LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTM4LDAsMCwwLDIxOCw5LAotICAgIDk1LDExOSw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDExNSwyMTgsNCwxMTksOTcsMTE0LDExMCwyMTgsCi0gICAgMTgsNjgsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDUsMTExLDExMCw4Nyw5NywxMTQsMTEwLAotICAgIDEwNSwxMTAsMTAzLDExNCwxNiwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDEzNywwLAotICAgIDAsMCw0MSwyLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE2LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTUsMTEyLDEwMSw5OSw1OCwKLSAgICAyLDAsMCwxMTUsMjAsMCwwLDAsMCwzLDYsMSwxOCwzLDIxLDEsCi0gICAgMTgsMSw5LDIsMTMsMSwxMiwxLDE1LDEsMTMsMSwxMTQsMTQ0LDAsMCwKLSAgICAwLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDE0OSwwLDAsMCwxMjQsMCwwLDEwNiwwLAotICAgIDAsMTAwLDEsMCwxMDcsOCwwLDExNCwyMSwwLDEwMCwyLDAsMTEwLDYsMCwKLSAgICAxMjQsMCwwLDEwNiwwLDAsMTI1LDEsMCwxMjQsMCwwLDEwNiwxLDAsMTAwLAotICAgIDEsMCwxMDcsOCwwLDExNCw5NSwwLDEyNCwwLDAsMTA2LDIsMCwxMDAsMSwKLSAgICAwLDEwNyw4LDAsMTE0LDczLDAsMTAwLDMsMCwxMDYsMywwLDEyNCwxLDAsCi0gICAgMTMxLDEsMCw4MywxMDAsNCwwLDEwNiwzLDAsMTI0LDEsMCwxMjQsMCwwLAotICAgIDEwNiwyLDAsMTMxLDIsMCw4MywxMTAsNTAsMCwxMjQsMCwwLDEwNiw0LDAsCi0gICAgMTE0LDEyMywwLDEwMCw1LDAsMTA2LDMsMCwxMjQsMSwwLDEyNCwwLDAsMTA2LAotICAgIDEsMCwxMzEsMiwwLDgzLDEwMCw2LDAsMTA2LDMsMCwxMjQsMCwwLDEwNiwKLSAgICAwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwyLDAsODMsMTAwLDEsMCw4MywKLSAgICA0MSw3LDEyMiwzOCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNCwKLSAgICAxMDEsMTEyLDExNCwzMiwxMTYsMTExLDMyLDExNywxMTUsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDc4LDExNCw5MywwLDAsMCwKLSAgICAxMjIsMTMsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsNjIsMTIyLAotICAgIDIwLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDEyMywKLSAgICAzMywxMTQsMTI1LDQxLDYyLDEyMiwyMyw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsCi0gICAgMzMsMTE0LDEyNSwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLDMzLDExNCwxMjUsNjIsMTIyLDE4LAotICAgIDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDEyMywxMjUsCi0gICAgNDEsNjIsNDEsNSwxMTQsMTUsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsOTksCi0gICAgMCwwLDAsMTE0LDUwLDAsMCwwLDExNCwxMTcsMCwwLDAsNDEsMiwxMTQsCi0gICAgODgsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCw5NywwLDAsMCw3NiwyLDAsCi0gICAgMCwxMTUsMTYsMCwwLDAsMCwzLDMwLDEsMTUsMSwxNSwxLDEzLDIsCi0gICAgMjIsMiw5LDEsMTksMiwxMTQsOTcsMCwwLDAsOTksMiwwLDAsMCwKLSAgICAwLDAsMCwwLDQsMCwwLDAsMTIsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDI1MywwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTI1LDIsMCwxMTYsMSwKLSAgICAwLDEwNiwyLDAsMTMxLDAsMCwxLDExNiwzLDAsMTI0LDIsMCwxMzEsMSwKLSAgICAwLDE0MywyMDgsMCwxLDExNiw0LDAsMTA2LDUsMCwxMDYsNiwwLDEyNCwyLAotICAgIDAsMTMxLDEsMCwxMjQsMSwwLDEwNyw5LDAsMTE0LDg5LDAsMTAwLDEsMCwKLSAgICAxMDYsNywwLDEyNCwyLDAsMTMxLDEsMCwxMjUsMywwLDExNiw4LDAsMTI0LAotICAgIDMsMCwxMDAsMiwwLDEyNCwyLDAsMTMxLDEsMSwxMzAsMSwwLDEyNCwwLAotICAgIDAsMTA2LDksMCwxMDAsMywwLDEwNyw4LDAsMTE0LDE2MywwLDEyNCwwLDAsCi0gICAgMTA2LDEwLDAsMTAwLDMsMCwxMDcsOCwwLDExNCwxNDAsMCwxMTYsOCwwLDEwMCwKLSAgICA0LDAsMTAwLDIsMCwxMjQsMCwwLDEwNiwwLDAsMTMxLDEsMSwxMzAsMSwKLSAgICAwLDExNiwxMSwwLDEyNCwwLDAsMTI0LDEsMCwxMDAsNSwwLDEwMCw2LDAsCi0gICAgMTMxLDIsMSwxLDEyNCwxLDAsODMsMTE2LDExLDAsMTI0LDAsMCwxMjQsMSwKLSAgICAwLDEwMCw1LDAsMTAwLDYsMCwxMzEsMiwxLDEsMTE2LDEyLDAsMTI0LDAsCi0gICAgMCwxMDYsOSwwLDEwMCw3LDAsMTMxLDIsMCwxMTUsMjE5LDAsMTI0LDAsMCwKLSAgICAxMDYsOSwwLDEwNiwxMywwLDEyNCwyLDAsMTMxLDEsMCwxLDExMCwxNiwwLAotICAgIDEyNCwwLDAsMTA2LDksMCwxMDYsMTQsMCwxMjQsMSwwLDEzMSwxLDAsMSwKLSAgICA4NywxMDAsMywwLDgxLDgyLDg4LDExNiw0LDAsMTA2LDUsMCwxMjQsMiwwLAotICAgIDI1LDgzLDQxLDgsMTIyLDUxLDY5LDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTE1LDExMiwxMDEsOTksMzIsMTA1LDExMCwzMiw5NywxMTAsMzIsMTAxLDEyMCwxMDUsCi0gICAgMTE1LDExNiwxMDUsMTEwLDEwMywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzOSwxMTUsMzIsMTEwLAotICAgIDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDYsMTIyLDMwLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExMCwxMTEsMTE2LDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwKLSAgICAxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDExNCwxNSwwLDAsMCw3OCwxMjIsCi0gICAgMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE0LAotICAgIDEzMywwLDAsMCw4NCwxMTQsMTM5LDAsMCwwLDQxLDE1LDExNCwxNSwwLDAsCi0gICAgMCwxMTQsNTcsMCwwLDAsMjE4LDEyLDk3LDk5LDExMywxMTcsMTA1LDExNCwxMDEsOTUsCi0gICAgMTA4LDExMSw5OSwxMDcsMTE0LDU0LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsCi0gICAgMCwwLDAsMTE0LDQyLDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsNzcsMCwKLSAgICAwLDAsMTE0LDk5LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDEzNywwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwyMTgsMTEsMTA4LDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE0LDEzOSwwLDAsMCw0MSw0LDExNCw4OCwwLDAsMCwxMTQsCi0gICAgODksMCwwLDAsMTE0LDE1LDAsMCwwLDIxOCwzLDEwOSwxMTUsMTAzLDExNCwxMCwKLSAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCw4NiwwLAotICAgIDAsMCw5MywyLDAsMCwxMTUsMzIsMCwwLDAsMCwyLDksMSwxMCwKLSAgICAxLDEzLDEsMjQsMSwxNSwxLDE4LDEsMTUsMSwxNSwxLDIxLDIsMTksCi0gICAgMSw0LDEsMTksMSwxOCw0LDE5LDIsMjMsMSwxMTQsODYsMCwwLDAsCi0gICAgOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMjcsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDMsMSwwLDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEwNiwxLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsMSwxMTYsMywwLAotICAgIDEwNiw0LDAsMTI0LDAsMCwxMDYsMiwwLDI1LDEyNSwxLDAsMTE2LDUsMCwKLSAgICAxMjQsMSwwLDEwMCwxLDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLDAsMTA3LAotICAgIDgsMCwxMTQsOTYsMCwxMjEsMTYsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsCi0gICAgMCw5NSw2LDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLDExNCwKLSAgICA5NSwwLDEsMSwxLDg5LDExMCwxLDAsODgsMTE2LDUsMCwxMjQsMSwwLAotICAgIDEwMCwyLDAsMTAwLDAsMCwxMzEsMywwLDEwMCwwLDAsMTA3LDgsMCwxMTQsCi0gICAgMTk3LDAsMTIxLDU2LDAsMTI0LDEsMCwxMDYsOCwwLDEyNCwxLDAsOTUsOSwKLSAgICAwLDExNiwxMCwwLDEyNCwxLDAsMTAwLDMsMCwxMzEsMiwwLDExNSwxNzUsMCwKLSAgICAxMjQsMCwwLDEwNiwyLDAsMTA2LDExLDAsMTAwLDQsMCwxMzEsMSwwLDEwMCwKLSAgICA1LDAsMjUsMTI0LDEsMCw5NSw5LDAsODcsMTEwLDE4LDAsNCwxMTYsNywKLSAgICAwLDEwNywxMCwwLDExNCwxOTYsMCwxLDEsMSw4OSwxMTAsMSwwLDg4LDExNiwKLSAgICA1LDAsMTI0LDEsMCwxMDAsNiwwLDEwMCwwLDAsMTMxLDMsMCwxMDAsMCwKLSAgICAwLDEwNyw4LDAsMTE0LDI1NSwwLDEyMSwxMywwLDEyNCwwLDAsMTI0LDEsMCwKLSAgICA5NSwxMiwwLDg3LDExMCwxOCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsMjU0LAotICAgIDAsMSwxLDEsODksMTEwLDEsMCw4OCwxMjQsMSwwLDgzLDQxLDcsNzgsCi0gICAgMTE0LDkxLDAsMCwwLDExNCwxMzQsMCwwLDAsMTE0LDEzMSwwLDAsMCwxMTQsCi0gICAgMTIxLDAsMCwwLDExNCwzMywwLDAsMCwxMTQsOTUsMCwwLDAsNDEsMTMsCi0gICAgMTE0LDk5LDAsMCwwLDExNCwxNDYsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwKLSAgICAxNCwwLDAsMCwxMTQsMjEsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDkxLAotICAgIDAsMCwwLDExNCw5NiwwLDAsMCwxMTQsMSwwLDAsMCwxMTQsMTM0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCwxMjIsMCwwLDAsMTE0LDk1LDAsMCwKLSAgICAwLDQxLDIsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMjUsOTUsMTA4LAotICAgIDExMSw5NywxMDAsOTUsOTgsOTcsOTksMTA3LDExOSw5NywxMTQsMTAwLDk1LDk5LDExMSwxMDksCi0gICAgMTEyLDk3LDExNiwxMDUsOTgsMTA4LDEwMSwxMTgsMiwwLDAsMTE1LDQwLDAsMCwwLAotICAgIDAsNCwxOSwyLDE2LDEsMjQsMSwzLDEsMTYsMSwxMywxLDUsMSwKLSAgICAyNCwxLDMsNCwxMiwxLDE1LDEsMjksMSwxMywxLDUsMSwyNCwxLAotICAgIDMsMSwxMywxLDEzLDEsNSwxLDExNCwxNDgsMCwwLDAsOTksMSwwLAotICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMTEsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDE1OSwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLDAsMCwKLSAgICAxMDcsOSwwLDExNCw0MywwLDExNiwxLDAsMTI0LDAsMCwxMDYsMCwwLDEwMCwKLSAgICAxLDAsMTMxLDIsMCwxMTUsNDMsMCwxMTYsMiwwLDEyNCwwLDAsMTMxLDEsCi0gICAgMCw4MywxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCwxMjUsMSwwLDExNiw0LAotICAgIDAsMTI0LDEsMCwxMzEsMSwwLDE0Myw3NSwwLDEsMTI0LDAsMCwxMDYsMCwKLSAgICAwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMTIyLDAsMTI0LDAsMCwxMDYsNSwwLAotICAgIDEwMCwwLDAsMTA3LDgsMCwxMTQsMTM4LDAsMTE2LDYsMCwxMDAsMiwwLDEwMCwKLSAgICAzLDAsMTI0LDAsMCwxMDYsNywwLDEzMSwxLDEsMTMwLDEsMCwxMTAsMTYsCi0gICAgMCwxMjQsMCwwLDEwNiwwLDAsMTA2LDgsMCwxMjQsMSwwLDEzMSwxLDAsCi0gICAgMSw4NywxMDAsMCwwLDgxLDgyLDg4LDExNiw5LDAsMTA2LDEwLDAsMTI0LDAsCi0gICAgMCwxMDYsNywwLDI1LDgzLDQxLDQsNzgsMTE0LDEzOSwwLDAsMCwxMjIsMTQsCi0gICAgMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE0LDE1LAotICAgIDAsMCwwLDQxLDExLDExNCw5OSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgMTQ4LDAsMCwwLDExNCwxNDQsMCwwLDAsMTE0LDEwMiwwLDAsMCwxMTQsMTEwLAotICAgIDAsMCwwLDExNCw3NywwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDEzOSwwLAotICAgIDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLDQxLDIsMTE0LDg4LAorICAgIDAsMCwxMTUsMTY0LDAsMCwwLDExNiwwLDEyNCwxLDEwMCwxLDEzMSwyLDExNCwKKyAgICA4MCwxMTYsMSwxMDAsMiwxMDcsOCwxMTQsMjIsMTE2LDIsMTMwLDEsMTE2LDEsMTA2LAorICAgIDMsMTI1LDQsMTI0LDMsMTAwLDIsMTA3LDgsMTE0LDUwLDEyNCw0LDEyNCwwLDEwMCwKKyAgICAzLDEyNCwxLDE0NCwxLDEzMSwxLDgzLDAsMTI0LDMsMTE0LDU4LDEwMywwLDExMCwKKyAgICAyLDEwMCwyLDEyNSw1LDEyNCw0LDEyNCwwLDEwMCwzLDEyNCwxLDEwMCw0LDEyNCwKKyAgICA1LDE0NCwyLDEzMSwxLDgzLDAsMTI0LDMsMTAwLDIsMTA3LDgsMTE0LDE0NCwxMTYsCisgICAgMCwxMjQsMSwxMDAsNSwxMzEsMiwxMTQsMTQwLDEyMSwxNCwxMjQsMSwxMDYsNCwxMjQsCisgICAgMCwxMzEsMSwxMjUsMyw4NywwLDExMywxNDQsNCwwLDExNiw1LDEwNywxMCwxMTQsCisgICAgMTM2LDEsMCwxLDAsMSwwLDEwMCwyLDEyNSwzLDg5LDAsMTEzLDE0NCw4OCwKKyAgICAwLDExMCw0LDEwMCw2LDEyNSwzLDExNiw2LDEyNCwwLDEyNCwxLDEwMCw3LDEyNCwKKyAgICAyLDEwMCw1LDEyNCwzLDE0NCwyLDEzMSwyLDgzLDAsNDEsOCwxMjIsNTMsODIsCisgICAgMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTUsCisgICAgMTEyLDEwMSw5OSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExOCw5NywxMTQsCisgICAgMTA1LDExMSwxMTcsMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTA5LDEwMSwxMTYsMTA0LAorICAgIDExMSwxMDAsMTE1LDQ2LDkwLDEyLDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCisgICAgMTA5LDEwMSw3OCwxMTQsOTksMCwwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTA5LDAsCisgICAgMCwwLDcwLDExNCwxMDcsMCwwLDAsNDEsNywxMTQsNCwwLDAsMCwxMTQsCisgICAgMTE5LDAsMCwwLDExNCwxMjAsMCwwLDAsMjE4LDIzLDExNSwxMTIsMTAxLDk5LDk1LAorICAgIDEwMiwxMTQsMTExLDEwOSw5NSwxMDIsMTA1LDEwOCwxMDEsOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LAorICAgIDExMSwxMTAsMTE0LDEwOSwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDEwNiwwLDAsCisgICAgMCw0MSw2LDExNCwxNSwwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDEwNywwLAorICAgIDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxMjgsMCwwLDAsOTAsNiwxMTUsMTAxLAorICAgIDk3LDExNCw5OSwxMDQsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsCisgICAgMCwwLDAsMTE0LDg1LDAsMCwwLDE4MCwxLDAsMCwxMTUsMzQsMCwwLAorICAgIDAsMCwyLDEwLDEsOCwxLDQsMSw2LDIsOCwxLDE0LDEsMTIsCisgICAgMSwxMCwxLDgsMiw4LDEsMTAsMSwyLDEsMTQsMSwxNCwxLDEyLAorICAgIDMsNCwyLDExNCw4NSwwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLAorICAgIDAsOCwwLDAsMCw1MywwLDAsMCw2NywwLDAsMCwxMTUsNTgsMSwKKyAgICAwLDAsMTIxLDEwLDEyNCwwLDEwNiwwLDEyNSwzLDg3LDAsMTEwLDIwLDQsMCwKKyAgICAxMTYsMSwxMDcsMTAsMTE0LDMwLDEsMCwxLDAsMSwwLDg5LDAsMTEwLDE0LAorICAgIDg4LDAsMTI0LDMsMTAwLDAsMTA3LDksMTE0LDQ0LDEyNCwzLDgzLDAsMTI0LDAsCisgICAgMTA2LDIsMTI1LDQsMTI0LDEsMTAwLDAsMTA3LDgsMTE0LDkwLDEyMSwxMCwxMjQsMCwKKyAgICAxMDYsMywxMjUsMSw4NywwLDExMCwyMCw0LDAsMTE2LDEsMTA3LDEwLDExNCw4OCwKKyAgICAxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTIxLDEwLDEyNCwwLAorICAgIDEwNiw0LDEyNSw1LDg3LDAsMTEwLDI0LDQsMCwxMTYsMSwxMDcsMTAsMTE0LDEyNCwKKyAgICAxLDAsMSwwLDEsMCwxMDAsMCwxMjUsNSw4OSwwLDExMCwyLDg4LDAsCisgICAgMTI0LDIsMTAwLDAsMTA3LDgsMTE0LDE4NCwxMjQsNSwxMDAsMCwxMDcsOCwxMTQsMTgwLAorICAgIDEyMSwxMCwxMjQsMSwxMDYsNSwxMjUsMiw4NywwLDExMywxODQsNCwwLDExNiwxLAorICAgIDEwNywxMCwxMTQsMTc2LDEsMCwxLDAsMSwwLDEwMCwwLDEyNSwyLDg5LDAsCisgICAgMTEzLDE4NCw4OCwwLDExMCw0LDEyNCw1LDEyNSwyLDEyMSwxMCwxMjQsMCwxMDYsNiwKKyAgICAxMjUsNiw4NywwLDExMCwyNCw0LDAsMTE2LDEsMTA3LDEwLDExNCwyMTgsMSwwLAorICAgIDEsMCwxLDAsMTAwLDAsMTI1LDYsODksMCwxMTAsMiw4OCwwLDEyMSwxNCwKKyAgICAxMTYsNywxMjQsMCwxMDYsOCwxMzEsMSwxMjUsNyw4NywwLDExMCwyNiw0LDAsCisgICAgMTE2LDEsMTA3LDEwLDE0NCwxLDExNCw0LDEsMCwxLDAsMSwwLDEwMCwwLAorICAgIDEyNSw3LDg5LDAsMTEwLDIsODgsMCwxMTYsOSwxMjQsNCwxMjQsMSwxMDAsMSwKKyAgICAxMjQsMiwxNDQsMSwxMzEsMiwxMjUsMywxMjQsNSwxMDAsMCwxMDcsOCwxNDQsMSwKKyAgICAxMTQsMzYsMTAwLDIsMTEwLDIsMTAwLDMsMTI0LDMsOTUsMTAsMTI0LDYsMTI0LDMsCisgICAgOTUsMTEsMTI0LDcsMTI0LDMsOTUsMTIsMTI0LDMsODMsMCw0MSw0LDc4LDExNCwKKyAgICAxMDcsMCwwLDAsNzAsODQsNDEsMTMsMTE0LDk1LDAsMCwwLDExNCw5NiwwLAorICAgIDAsMCwxMTQsMSwwLDAsMCwxMTQsOTEsMCwwLDAsMTE0LDk4LDAsMCwKKyAgICAwLDkwLDcsOTUsNzksODIsNzMsNzEsNzMsNzgsMjE4LDEwLDk1LDk1LDk5LDk3LAorICAgIDk5LDEwNCwxMDEsMTAwLDk1LDk1LDIxOCw0LDEwOCwxMDUsMTE1LDExNiwyMTgsOCw5NSw5NSwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSw5NSwxMTQsMTA2LDAsMCwwLDExNCwxMTEsMCwwLDAsCisgICAgMTE0LDExNiwwLDAsMCwxMTQsMTEwLDAsMCwwLDQxLDgsMTE0LDg5LDAsMCwKKyAgICAwLDExNCw5OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCw4OCwwLDAsMCwKKyAgICAxMTQsMTUsMCwwLDAsOTAsOCwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsCisgICAgMTE2LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE3LDk1LDExNSwxMTIsMTAxLDk5LDk1LAorICAgIDEwMiwxMTQsMTExLDEwOSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMDksMSwwLDAsMTE1LAorICAgIDcyLDAsMCwwLDAsMiwyLDEsMTAsMSwxNCwxLDYsMiw4LDEsCisgICAgNCwyLDYsMSw4LDEsMiwxLDEwLDEsMTQsMiw2LDEsMiwxLAorICAgIDEwLDEsMTQsMSwxMCwxLDgsMSw4LDEsMiwxLDEwLDEsMTQsMSwKKyAgICAxMiwyLDQsMSwyLDEsMTAsMSwxNCwxLDEwLDEsMiwxLDE0LDEsCisgICAgMTYsMSwxMCwyLDE2LDEsMjAsMSw2LDEsNiwxLDExNCwxMzIsMCwwLAorICAgIDAsNzAsNDEsMSwyMTgsOCwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDk5LDIsCisgICAgMCwwLDAsMSwwLDAsMCw1LDAsMCwwLDU5LDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwyMTIsMSwwLDAsMTI0LDIsMTE1LDIwLDExNiwwLDEyNCwxLAorICAgIDEwMCwxLDEwMCwwLDEzMSwzLDEwMCwwLDEwNyw4LDExNCw1NCwxMjEsMTIsMTI0LDAsCisgICAgMTA2LDEsMTI0LDEsOTUsMiw4NywwLDExMCwyMCw0LDAsMTE2LDMsMTA3LDEwLAorICAgIDExNCw1MiwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTI0LDIsCisgICAgMTE1LDc0LDExNiwwLDEyNCwxLDEwMCwyLDEwMCwwLDEzMSwzLDEwMCwwLDEwNyw4LAorICAgIDExNCwxNjYsMTI0LDAsMTA2LDQsMTI1LDMsMTI0LDMsMTAwLDAsMTA3LDgsMTE0LDEzNCwKKyAgICAxMjQsMCwxMDYsNSwxMDAsMCwxMDcsOSwxMTQsMTM0LDExNiw2LDEwMCwwLDEwNyw4LAorICAgIDExNCwxMTAsMTE2LDcsMTMwLDEsMTE2LDYsMTA2LDgsMTI1LDQsMTI0LDQsMTA2LDksCisgICAgMTI0LDQsMTMxLDEsMTI1LDMsMTI0LDAsMTA2LDUsMTI0LDMsOTUsMTAsMTIxLDEwLAorICAgIDEyNCwzLDEyNCwxLDk1LDExLDg3LDAsMTEwLDIwLDQsMCwxMTYsMywxMDcsMTAsCisgICAgMTE0LDE2NCwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTI0LDIsCisgICAgMTE1LDE4NiwxMTYsMCwxMjQsMSwxMDAsMywxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwKKyAgICAxMTQsMjIwLDEyMSwxMiwxMjQsMCwxMDYsMTIsMTI0LDEsOTUsMTMsODcsMCwxMTAsMjAsCisgICAgNCwwLDExNiwzLDEwNywxMCwxMTQsMjE4LDEsMCwxLDAsMSwwLDg5LDAsCisgICAgMTEwLDIsODgsMCwxMjEsMTAsMTI0LDAsMTI0LDEsOTUsMTQsODcsMCwxMTAsMjAsCisgICAgNCwwLDExNiwzLDEwNywxMCwxMTQsMjUwLDEsMCwxLDAsMSwwLDg5LDAsCisgICAgMTEwLDIsODgsMCwxMjQsMiwxNDQsMSwxMTUsMjAsMTE2LDAsMTI0LDEsMTAwLDQsCisgICAgMTAwLDAsMTMxLDMsMTAwLDAsMTA3LDgsMTQ0LDEsMTE0LDY4LDEyNCwwLDEwNiw1LAorICAgIDEwMCwwLDEwNyw5LDE0NCwxLDExNCw2OCwxMjEsMTIsMTI0LDAsMTA2LDUsMTI0LDEsCisgICAgOTUsMTUsODcsMCwxMTAsMjIsNCwwLDExNiwzLDEwNywxMCwxNDQsMSwxMTQsNjYsCisgICAgMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDEyNCwwLDEwNiwxNiwKKyAgICAxNDQsMSwxMTQsMjA4LDEyNCwyLDE0NCwxLDExNSwxMDAsMTE2LDAsMTI0LDEsMTAwLDUsCisgICAgMTAwLDAsMTMxLDMsMTAwLDAsMTA3LDgsMTQ0LDEsMTE0LDEzNiwxMjEsMTIsMTI0LDAsCisgICAgMTA2LDE3LDEyNCwxLDk1LDE4LDg3LDAsMTEwLDIyLDQsMCwxMTYsMywxMDcsMTAsCisgICAgMTQ0LDEsMTE0LDEzNCwxLDAsMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsCisgICAgMTI0LDIsMTQ0LDEsMTE1LDE2MCwxMTYsMCwxMjQsMSwxMDAsNiwxMDAsMCwxMzEsMywKKyAgICAxMDAsMCwxMDcsOCwxNDQsMSwxMTQsMjA4LDEyNCwwLDEwNiwxOSwxMDAsMCwxMDcsOSwKKyAgICAxNDQsMSwxMTQsMjA4LDEyMSwxMiwxMjQsMCwxMDYsMTksMTI0LDEsOTUsMjAsODcsMCwKKyAgICAxMTAsMjIsNCwwLDExNiwzLDEwNywxMCwxNDQsMSwxMTQsMjA2LDEsMCwxLDAsCisgICAgMSwwLDg5LDAsMTEwLDIsODgsMCwxMjQsMSw4MywwLDQxLDcsNzgsMTE0LAorICAgIDEsMCwwLDAsMTE0LDkxLDAsMCwwLDIxOCwxMSw5NSw5NSwxMTIsOTcsOTksCisgICAgMTA3LDk3LDEwMywxMDEsOTUsOTUsMTE0LDEzMSwwLDAsMCwxMTQsOTgsMCwwLDAsCisgICAgMTE0LDEyOSwwLDAsMCw0MSwyMSwxMTQsNiwwLDAsMCwxMTQsMTUsMCwwLAorICAgIDAsMTE0LDEsMCwwLDAsMTE0LDk2LDAsMCwwLDExNCw5OSwwLDAsMCwKKyAgICAxMTQsMTEwLDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDEyMCwwLDAsMCwyMTgsCisgICAgMTYsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsMjE4LDcsOTUsOTUsMTEwLDEwMSwxMTksOTUsOTUsOTAsNSw5NSwxMTIsOTcsMTE2LAorICAgIDEwNCwxMTQsOTEsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTM0LDAsMCwwLAorICAgIDExNCw5NSwwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LAorICAgIDEwNywwLDAsMCwxMTQsOTgsMCwwLDAsMTE0LDExNiwwLDAsMCwxMTQsMTI5LAorICAgIDAsMCwwLDQxLDUsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsCisgICAgMTMzLDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsMTM1LDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxOCw5NSwKKyAgICAxMDUsMTEwLDEwNSwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsOTcsMTE2LDExNiwxMTQsCisgICAgMTE1LDI1NCwxLDAsMCwxMTUsOTIsMCwwLDAsMCw0LDIwLDEsMiwxLAorICAgIDEyLDEsMTQsMSw2LDIsMjAsMSw2LDEsOCwyLDEwLDEsOCwxLAorICAgIDQsMSw2LDIsMTAsMSw4LDEsMiwxLDEwLDEsMTQsMSw2LDIsCisgICAgMjAsMSwyLDEsMTIsMSwxNCwxLDYsMiwyLDEsMTAsMSwxNCwxLAorICAgIDYsMiwyNCwxLDEyLDEsMiwxLDEyLDEsMTYsMSw2LDIsOCwxLAorICAgIDI0LDEsMiwxLDEyLDEsMTYsMSw2LDIsMjQsMSwxMiwxLDIsMSwKKyAgICAxMiwxLDE2LDEsNiwxLDExNCwxMzcsMCwwLDAsOTksMSwwLDAsMCwKKyAgICAwLDAsMCwwLDIsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwKKyAgICAxMTUsOTIsMCwwLDAsMTAwLDEsMTI1LDEsMTE2LDAsMTI0LDAsMTA2LDEsMTAwLAorICAgIDIsMTMxLDIsMTE0LDMwLDEyNCwwLDEwNiwxLDEwNiwyLDEyNCwwLDEzMSwxLDEyNSwKKyAgICAxLDExMCwzMCwxMTYsMCwxMjQsMCwxMDYsMSwxMDAsMywxMzEsMiwxMTQsNjAsMTE2LAorICAgIDMsMTA2LDQsMTAwLDQsMTE2LDUsMTAwLDUsMTAwLDYsMTQ0LDEsMTMxLDIsMSwKKyAgICAwLDEyNCwxLDEwMCwxLDEwNyw4LDExNCw3OCwxMTYsNiwxMjQsMCwxMDYsNywxMzEsCisgICAgMSwxMjUsMSwxMTYsOCwxMjQsMCwxMjQsMSwxMzEsMiwxLDAsMTI0LDEsODMsCisgICAgMCw0MSw3LDEyMiw0Myw2NywxMTQsMTAxLDk3LDExNiwxMDEsMzIsOTcsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMTIsMTE0LDExMSwxMTgsMTA1LDEwMCwxMDEsMTAwLDMyLDExNSwxMTIsMTAxLDk5LDQ2LAorICAgIDc4LDIxOCwxMyw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgMjE4LDExLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEyMiw4NywxMTUsCisgICAgMTE2LDk3LDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTA1LDExMCwzMiw4MCwxMjEsMTE2LDEwNCwxMTEsCisgICAgMTEwLDMyLDUxLDQ2LDU0LDQ0LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDMyLDEwMCwKKyAgICAxMDEsMTAyLDEwNSwxMTAsMTA1LDExMCwxMDMsMzIsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk3LDEwOCwxMTUsMTExLDMyLAorICAgIDEwMCwxMDEsMTAyLDEwNSwxMTAsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwyMTgsMTAsMTE1LDExNiw5Nyw5OSwxMDcsMTA4LDEwMSwxMTgsCisgICAgMTAxLDEwOCwyMzMsMiwwLDAsMCw0MSw5LDExNCw0LDAsMCwwLDExNCw5OSwKKyAgICAwLDAsMCwxMTQsMTM4LDAsMCwwLDIxOCw5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwKKyAgICAxMTAsMTAzLDExNSwyMTgsNCwxMTksOTcsMTE0LDExMCwyMTgsMTgsNjgsMTAxLDExMiwxMTQsMTAxLAorICAgIDk5LDk3LDExNiwxMDUsMTExLDExMCw4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDExNCwxNiwwLAorICAgIDAsMCwxMTQsMTUsMCwwLDAsMTE0LDEzNywwLDAsMCw0MSwyLDExNCw4OCwKICAgICAwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAotICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE0LDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywKLSAgICAxMTAsMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwxNDcsMiwwLDAsMTE1LDIwLDAsMCwwLAotICAgIDAsMiwxNSwyLDE4LDEsMTAsMiwxMiwxLDEzLDEsMTUsMSwxNSwxLAotICAgIDI0LDMsMjMsNSwxMTQsMTQ5LDAsMCwwLDk5LDEsMCwwLDAsMCwwLAotICAgIDAsMCwxLDAsMCwwLDksMCwwLDAsNjcsMCwwLDAsMTE1LDQ3LAotICAgIDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEsMTE2LDIsMCwKLSAgICAxMjQsMCwwLDEwNiwzLDAsMTMxLDEsMCwxNDMsMTUsMCwxLDExNiw0LDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDgzLDg3LDEwMCwxLDAsODEsODIsODgsMTAwLDEsCi0gICAgMCw4Myw0MSwyLDEyMiwxOTEsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw5NywzMiwxMTAsCi0gICAgMTAxLDExOSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsCi0gICAgNDQsMzIsMTA4LDExMSw5NywxMDAsMTAxLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTE1LDExMiwxMDEsOTksMzksMTE1LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAsMTAsCi0gICAgMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsCi0gICAgMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDEwMCwxMDAsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwNSwKLSAgICAxMTYsMTE1LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCi0gICAgNzMsMTAyLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwxMTUsMzIsOTcsCi0gICAgMTA4LDExNCwxMDEsOTcsMTAwLDEyMSwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDk3LDExNiwzMiwxMDEsMTIwLDEwNSwxMTUsCi0gICAgMTE2LDEwNSwxMTAsMTAzLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwMywxMDEsMTE2LDExNSwKLSAgICAxMCwzMiwzMiwzMiwzMiw5OSwxMDgsMTExLDk4LDk4LDEwMSwxMTQsMTAxLDEwMCw0NiwxMCwKLSAgICAxMCwzMiwzMiwzMiwzMiw3OCw0MSw1LDExNCw1NywwLDAsMCwxMTQsMTQ1LDAsCi0gICAgMCwwLDExNCw1NCwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDE0OSwwLDAsCi0gICAgMCw0MSwxLDExNCw4OCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMSwwLDAsMCwxMTQsODcsMCwwLDAsMTcwLDIsMCwwLAotICAgIDExNSw2LDAsMCwwLDAsOSwxMCwxLDE2LDEsMTE0LDg3LDAsMCwwLAotICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDUsMCwwLAotICAgIDAsNjQsMCwwLDAsMTE1LDIwNSwwLDAsMCwxMDEsMCwwLDkwLDEsMCwKLSAgICAxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDEsNCwwLDEwMCwKLSAgICAyLDAsMTAwLDMsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNSwwLDEwMSw2LAotICAgIDAsMTAwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTAwLDYsMCwxMzIsMiwwLAotICAgIDEzMSwxLDAsOTAsNywwLDEwMSw2LDAsMTAwLDQsMCwxMDAsNywwLDEwMCwKLSAgICA4LDAsMTMyLDEsMCwxMzEsMSwwLDkwLDgsMCwxMDEsNiwwLDEwMCw5LAotICAgIDAsMTAwLDEwLDAsMTMyLDAsMCwxMzEsMSwwLDkwLDksMCwxMDEsNiwwLAotICAgIDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwwLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSwKLSAgICA2LDAsMTAxLDExLDAsMTAwLDEzLDAsMTAwLDE0LDAsMTMyLDAsMCwxMzEsMSwKLSAgICAwLDEzMSwxLDAsOTAsMTIsMCwxMDEsNiwwLDEwMSwxMSwwLDEwMCwxNSwwLAotICAgIDEwMCwxNiwwLDEzMiwwLDAsMTMxLDEsMCwxMzEsMSwwLDkwLDEzLDAsMTAxLAotICAgIDYsMCwxMDEsMTEsMCwxMDAsMTcsMCwxMDAsMTgsMCwxMzIsMCwwLDEzMSwxLAotICAgIDAsMTMxLDEsMCw5MCwxNCwwLDEwMSw2LDAsMTAxLDE1LDAsMTMxLDEsMCwKLSAgICA5MCwxNiwwLDEwMCw0LDAsODMsNDEsMTksMjE4LDE1LDY2LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMjIsMTQ0LDc3LDEwMSwxMTYsOTcsCi0gICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTAyLDExMSwxMTQsCi0gICAgMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsMTYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsCisgICAgMTAyLDExNCwxMTEsMTA5LDk1LDExNSwxMTIsMTAxLDk5LDU4LDIsMCwwLDExNSwyMCwwLAorICAgIDAsMCwwLDMsNCwxLDEyLDMsMTQsMSwxMiwxLDYsMiwxMiwxLAorICAgIDgsMSwxMCwxLDEwLDEsMTE0LDE0NSwwLDAsMCw5OSwxLDAsMCwwLAorICAgIDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwxMTAsMCwwLDAsMTI0LDAsMTA2LDAsMTAwLDEsMTA3LDgsMTE0LDE0LDEwMCwKKyAgICAyLDExMCw0LDEyNCwwLDEwNiwwLDEyNSwxLDEyNCwwLDEwNiwxLDEwMCwxLDEwNywKKyAgICA4LDExNCw2OCwxMjQsMCwxMDYsMiwxMDAsMSwxMDcsOCwxMTQsNTIsMTAwLDMsMTA2LAorICAgIDMsMTI0LDEsMTMxLDEsODMsMCwxMTMsMTA2LDEwMCw0LDEwNiwzLDEyNCwxLDEyNCwKKyAgICAwLDEwNiwyLDEzMSwyLDgzLDAsMTEwLDM4LDEyNCwwLDEwNiw0LDExNCw5MCwxMDAsCisgICAgNSwxMDYsMywxMjQsMSwxMjQsMCwxMDYsMSwxMzEsMiw4MywwLDExMCwxNiwxMDAsCisgICAgNiwxMDYsMywxMjQsMCwxMDYsMCwxMjQsMCwxMDYsMSwxMzEsMiw4MywwLDEwMCwKKyAgICAxLDgzLDAsNDEsNywxMjIsMzgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMDIsMTExLAorICAgIDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0Niw3OCwxMTQsOTMsCisgICAgMCwwLDAsMTIyLDEzLDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsCisgICAgMTI1LDYyLDEyMiwyMCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwKKyAgICAzMiw0MCwxMjMsMzMsMTE0LDEyNSw0MSw2MiwxMjIsMjMsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LAorICAgIDYyLDEyMiwxOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwKKyAgICA0MCwxMjMsMTI1LDQxLDYyLDQxLDUsMTE0LDE1LDAsMCwwLDExNCwxMDcsMCwwLAorICAgIDAsMTE0LDk5LDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsMTE3LDAsMCwwLAorICAgIDQxLDIsMTE0LDg4LDAsMCwwLDExNCwxNSwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsOTcsMCwwLDAsCisgICAgNzYsMiwwLDAsMTE1LDE2LDAsMCwwLDAsMywyMCwxLDEwLDEsMTAsCisgICAgMSwxMiwyLDE2LDIsNiwxLDE2LDIsMTE0LDk3LDAsMCwwLDk5LDIsCisgICAgMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDEyLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwxOTQsMCwwLDAsMTI0LDAsMTA2LDAsMTI1LDIsMTE2LDEsCisgICAgMTA2LDIsMTMxLDAsMSwwLDExNiwzLDEyNCwyLDEzMSwxLDE0MywxNTYsMSwwLAorICAgIDExNiw0LDEwNiw1LDEwNiw2LDEyNCwyLDEzMSwxLDEyNCwxLDEwNyw5LDExNCw2NCwKKyAgICAxMDAsMSwxMDYsNywxMjQsMiwxMzEsMSwxMjUsMywxMTYsOCwxMjQsMywxMDAsMiwKKyAgICAxMjQsMiwxNDQsMSwxMzEsMSwxMzAsMSwxMjQsMCwxMDYsOSwxMDAsMywxMDcsOCwKKyAgICAxMTQsMTIwLDEyNCwwLDEwNiwxMCwxMDAsMywxMDcsOCwxMTQsMTAwLDExNiw4LDEwMCw0LAorICAgIDEwMCwyLDEyNCwwLDEwNiwwLDE0NCwxLDEzMSwxLDEzMCwxLDExNiwxMSwxMjQsMCwKKyAgICAxMjQsMSwxMDAsNSwxMDAsNiwxNDQsMSwxMzEsMiwxLDAsMTI0LDEsODMsMCwKKyAgICAxMTYsMTEsMTI0LDAsMTI0LDEsMTAwLDUsMTAwLDYsMTQ0LDEsMTMxLDIsMSwwLAorICAgIDExNiwxMiwxMjQsMCwxMDYsOSwxMDAsNywxMzEsMiwxMTUsMTYyLDEyNCwwLDEwNiw5LAorICAgIDEwNiwxMywxMjQsMiwxMzEsMSwxLDAsMTEwLDEyLDEyNCwwLDEwNiw5LDEwNiwxNCwKKyAgICAxMjQsMSwxMzEsMSwxLDAsODcsMCwxMDAsMyw4MSwwLDgyLDAsODgsMCwKKyAgICAxMTYsNCwxMDYsNSwxMjQsMiwyNSwwLDgzLDAsNDEsOCwxMjIsNzAsNjksMTIwLAorICAgIDEwMSw5OSwxMTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzOSwxMTUsCisgICAgMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzMiwxMDUsMTEwLDMyLDk3LDExMCwzMiwxMDEsMTIwLDEwNSwxMTUsMTE2LDEwNSwxMTAsMTAzLAorICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLAorICAgIDk3LDk5LDEwMSw0NiwxMjIsMzAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwKKyAgICAxMjUsMzIsMTEwLDExMSwxMTYsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwxMTUsMTE0LDE1LDAsMCwwLDc4LDEyMiwxNCwxMDksMTA1LDExNSwxMTUsCisgICAgMTA1LDExMCwxMDMsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTQsMTMzLDAsMCwwLDg0LAorICAgIDExNCwxMzksMCwwLDAsNDEsMTUsMTE0LDE1LDAsMCwwLDExNCw1NywwLDAsCisgICAgMCwyMTgsMTIsOTcsOTksMTEzLDExNywxMDUsMTE0LDEwMSw5NSwxMDgsMTExLDk5LDEwNywxMTQsCisgICAgNTQsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsNDIsCisgICAgMCwwLDAsMTE0LDUwLDAsMCwwLDExNCw3NywwLDAsMCwxMTQsOTksMCwKKyAgICAwLDAsMTE0LDExMCwwLDAsMCwxMTQsMTM3LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDIxOCwxMSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTM5LAorICAgIDAsMCwwLDQxLDQsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsCisgICAgMTUsMCwwLDAsMjE4LDMsMTA5LDExNSwxMDMsMTE0LDEwLDAsMCwwLDExNCwxMCwKKyAgICAwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDg2LDAsMCwwLDkzLDIsMCwKKyAgICAwLDExNSwzMiwwLDAsMCwwLDIsNiwxLDgsMSwxMCwxLDE2LDEsCisgICAgMTAsMSwxNCwxLDEwLDEsMTAsMSwxNiwyLDE2LDEsNCwxLDE2LDEsCisgICAgMTIsNCwxNCwyLDIyLDEsMTE0LDg2LDAsMCwwLDk5LDEsMCwwLDAsCisgICAgMCwwLDAsMCwyLDAsMCwwLDI3LDAsMCwwLDY3LDAsMCwwLAorICAgIDExNSwyMDYsMCwwLDAsMTI0LDAsMTA2LDAsMTA2LDEsMTI0LDAsMTA2LDIsMTMxLAorICAgIDEsMSwwLDExNiwzLDEwNiw0LDEyNCwwLDEwNiwyLDI1LDAsMTI1LDEsMTE2LAorICAgIDUsMTI0LDEsMTAwLDEsMTAwLDAsMTMxLDMsMTAwLDAsMTA3LDgsMTE0LDc2LDEyMSwKKyAgICAxMiwxMjQsMCwxMDYsMCwxMjQsMSw5NSw2LDg3LDAsMTEwLDIwLDQsMCwxMTYsCisgICAgNywxMDcsMTAsMTE0LDc0LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsCisgICAgMCwxMTYsNSwxMjQsMSwxMDAsMiwxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxMTQsCisgICAgMTU0LDEyMSw0MCwxMjQsMSwxMDYsOCwxMjQsMSw5NSw5LDExNiwxMCwxMjQsMSwxMDAsCisgICAgMywxMzEsMiwxMTUsMTMwLDEyNCwwLDEwNiwyLDEwNiwxMSwxMDAsNCwxMzEsMSwxMDAsCisgICAgNSwyNSwwLDEyNCwxLDk1LDksODcsMCwxMTAsMjAsNCwwLDExNiw3LDEwNywKKyAgICAxMCwxMTQsMTUyLDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMTYsCisgICAgNSwxMjQsMSwxMDAsNiwxMDAsMCwxMzEsMywxMDAsMCwxMDcsOCwxMTQsMjAyLDEyMSwKKyAgICAxMCwxMjQsMCwxMjQsMSw5NSwxMiw4NywwLDExMCwyMCw0LDAsMTE2LDcsMTA3LAorICAgIDEwLDExNCwyMDAsMSwwLDEsMCwxLDAsODksMCwxMTAsMiw4OCwwLDEyNCwKKyAgICAxLDgzLDAsNDEsNyw3OCwxMTQsOTEsMCwwLDAsMTE0LDEzNCwwLDAsMCwKKyAgICAxMTQsMTMxLDAsMCwwLDExNCwxMjEsMCwwLDAsMTE0LDMzLDAsMCwwLDExNCwKKyAgICA5NSwwLDAsMCw0MSwxMywxMTQsOTksMCwwLDAsMTE0LDE0NywwLDAsMCwKKyAgICAxMTQsMTUsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwxMTQsOTEsMCwwLDAsMTE0LDk2LDAsMCwwLDExNCwxLAorICAgIDAsMCwwLDExNCwxMzQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDEyMiwwLAorICAgIDAsMCwxMTQsOTUsMCwwLDAsNDEsMiwxMTQsODgsMCwwLDAsMTE0LDg5LAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsCisgICAgMCwwLDIxOCwyNSw5NSwxMDgsMTExLDk3LDEwMCw5NSw5OCw5Nyw5OSwxMDcsMTE5LDk3LAorICAgIDExNCwxMDAsOTUsOTksMTExLDEwOSwxMTIsOTcsMTE2LDEwNSw5OCwxMDgsMTAxLDExOCwyLDAsCisgICAgMCwxMTUsNDAsMCwwLDAsMCw0LDE0LDIsMTIsMSwxNiwxLDIsMSwKKyAgICAxMiwxLDE0LDEsNiwxLDE2LDEsMiw0LDgsMSwxMCwxLDIyLDEsCisgICAgMTQsMSw2LDEsMTYsMSwyLDEsMTAsMSwxNCwxLDYsMSwxMTQsMTQ5LAorICAgIDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAorICAgIDExLDAsMCwwLDY3LDAsMCwwLDExNSwxMjAsMCwwLDAsMTI0LDAsMTA2LAorICAgIDAsMTAwLDAsMTA3LDksMTE0LDMwLDExNiwxLDEyNCwwLDEwNiwwLDEwMCwxLDEzMSwKKyAgICAyLDExNSwzMCwxMTYsMiwxMjQsMCwxMzEsMSw4MywwLDExNiwzLDEyNCwwLDEzMSwKKyAgICAxLDEyNSwxLDExNiw0LDEyNCwxLDEzMSwxLDE0Myw1NiwxLDAsMTI0LDAsMTA2LAorICAgIDAsMTAwLDAsMTA3LDgsMTE0LDg2LDEyNCwwLDEwNiw1LDEwMCwwLDEwNyw4LDExNCwKKyAgICA5OCwxMTYsNiwxMDAsMiwxMDAsMywxMjQsMCwxMDYsNywxNDQsMSwxMzEsMSwxMzAsCisgICAgMSwxMTAsMTIsMTI0LDAsMTA2LDAsMTA2LDgsMTI0LDEsMTMxLDEsMSwwLDg3LAorICAgIDAsMTAwLDAsODEsMCw4MiwwLDg4LDAsMTE2LDksMTA2LDEwLDEyNCwwLDEwNiwKKyAgICA3LDI1LDAsODMsMCw0MSw0LDc4LDExNCwxMzksMCwwLDAsMTIyLDE0LDEwOSwKKyAgICAxMDUsMTE1LDExNSwxMDUsMTEwLDEwMywzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwxNSwwLAorICAgIDAsMCw0MSwxMSwxMTQsOTksMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDE0OSwKKyAgICAwLDAsMCwxMTQsMTQ1LDAsMCwwLDExNCwxMDIsMCwwLDAsMTE0LDExMCwwLAorICAgIDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE1LDAsMCwwLDExNCwxMzksMCwwLAorICAgIDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCw0MSwyLDExNCw4OCwwLAorICAgIDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCisgICAgMCwxMTQsMTEsMCwwLDAsMjE4LDE0LDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywxMTAsCisgICAgMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwxNDcsMiwwLDAsMTE1LDIwLDAsMCwwLDAsCisgICAgMiwxMCwyLDEyLDEsOCwyLDgsMSwxMCwxLDEwLDEsMTAsMSwxOCwKKyAgICAzLDIyLDUsMTE0LDE1MCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAorICAgIDAsMSwwLDAsMCw5LDAsMCwwLDY3LDAsMCwwLDExNSwzOCwwLAorICAgIDAsMCwxMTYsMCwxMDYsMSwxMzEsMCwxLDAsMTE2LDIsMTI0LDAsMTA2LDMsCisgICAgMTMxLDEsMTQzLDEwLDEsMCwxMTYsNCwxMjQsMCwxMzEsMSw4MywwLDgxLDAsCisgICAgODIsMCw4OCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMTkxLDgyLDEwMSwxMTYsMTE3LAorICAgIDExNCwxMTAsMzIsOTcsMzIsMTEwLDEwMSwxMTksMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsCisgICAgMTExLDk4LDEwNiwxMDEsOTksMTE2LDQ0LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsOTgsCisgICAgMTIxLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDM5LDExNSwzMiwxMDgsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMDAsMTAwLDEwMSwKKyAgICAxMDAsMzIsMTE2LDExMSwzMiwxMDUsMTE2LDExNSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDczLDEwMiwzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzMiwxMDUsMTE1LDMyLDk3LDEwOCwxMTQsMTAxLDk3LDEwMCwxMjEsMzIsMTA1LDExMCwzMiwKKyAgICAxMTUsMTIxLDExNSw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDQsMzIsMTE2LDEwNCw5NywKKyAgICAxMTYsMzIsMTAxLDEyMCwxMDUsMTE1LDExNiwxMDUsMTEwLDEwMywzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzMiwxMDMsMTAxLDExNiwxMTUsMTAsMzIsMzIsMzIsMzIsOTksMTA4LDExMSw5OCw5OCwKKyAgICAxMDEsMTE0LDEwMSwxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsNDEsNSwxMTQsNTcsCisgICAgMCwwLDAsMTE0LDE0NiwwLDAsMCwxMTQsNTQsMCwwLDAsMTE0LDE1LDAsCisgICAgMCwwLDExNCwxNTAsMCwwLDAsNDEsMSwxMTQsODgsMCwwLDAsMTE0LDEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDg3LDAsCisgICAgMCwwLDE3MCwyLDAsMCwxMTUsNiwwLDAsMCwwLDksOCwxLDEyLAorICAgIDEsMTE0LDg3LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDQsMCwwLDAsNjQsMCwwLDAsMTE1LDEzNiwwLDAsMCwKKyAgICAxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDEsNCwxMDAsMiwKKyAgICAxMDAsMywxMzIsMCwxMzEsMSw5MCw1LDEwMSw2LDEwMCwxOSwxMDAsNSwxMDAsNiwKKyAgICAxMzIsMSwxMzEsMSw5MCw3LDEwMSw2LDEwMCwyMCwxMDAsNywxMDAsOCwxMzIsMSwKKyAgICAxMzEsMSw5MCw4LDEwMSw2LDEwMCw5LDEwMCwxMCwxMzIsMCwxMzEsMSw5MCw5LAorICAgIDEwMSw2LDEwMCwxMSwxMDAsMTIsMTMyLDAsMTMxLDEsOTAsMTAsMTAxLDYsMTAxLDExLAorICAgIDEwMCwxMywxMDAsMTQsMTMyLDAsMTMxLDEsMTMxLDEsOTAsMTIsMTAxLDYsMTAxLDExLAorICAgIDEwMCwxNSwxMDAsMTYsMTMyLDAsMTMxLDEsMTMxLDEsOTAsMTMsMTAxLDYsMTAxLDExLAorICAgIDEwMCwxNywxMDAsMTgsMTMyLDAsMTMxLDEsMTMxLDEsOTAsMTQsMTAxLDYsMTAxLDE1LAorICAgIDEzMSwxLDkwLDE2LDEwMCw0LDgzLDAsNDEsMjEsMjE4LDE1LDY2LDExNywxMDUsMTA4LAorICAgIDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMjIsMTQ0LDc3LDEwMSwxMTYsCisgICAgOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTAyLDExMSwKKyAgICAxMTQsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTA5LDEwMSwxMTYsCisgICAgMTA0LDExMSwxMDAsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTAxLDEwNSwxMTYsMTA0LDEwMSwxMTQsMzIsCisgICAgOTksMTA4LDk3LDExNSwxMTUsMzIsMTExLDExNCwzMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksMzIsCisgICAgMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMTE4LDExMSwxMDUsMTAwLAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLAorICAgIDMyLDEwNSwxMTAsMTE1LDExNiw5NywxMTAsMTE2LDEwNSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDk5LDEwOCw5NywxMTUsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDEsMCwKKyAgICAwLDAsMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDEyLDAsMCwwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwKKyAgICAxLDgzLDAsNDEsMiwxMjIsMTE1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE0LDEwMSwKKyAgICAxMTIsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsCisgICAgMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LAorICAgIDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMzIsMTA5LDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDMyLDEwMCwxMTEsMTAxLDExNSwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDYsMTExLDk4LDMyLDEwNSwxMTYsMTE1LDEwMSwxMDgsMTAyLDQ2LAorICAgIDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwyNCw2MCwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsCisgICAgMTA1LDExMCw0MSw2Miw0MSwyLDExNCw1MCwwLDAsMCwxMTQsMSwwLDAsMCwKKyAgICA0MSwxLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMSwwLDAsMCwxMTQsOTIsMCwwLDAsMTk1LDIsMCwwLDExNSwKKyAgICAyLDAsMCwwLDAsNywxMjIsMjcsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwKKyAgICAxMDEsMTEyLDExNCw3OCw5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLDAsCisgICAgMCw1LDAsMCwwLDY3LDAsMCwwLDExNSw0OCwwLDAsMCwxMjQsMiwKKyAgICAxMDAsMCwxMDcsOSwxMTQsMTIsMTAwLDAsODMsMCwxMTYsMCwxMDYsMSwxMjQsMSwKKyAgICAxMzEsMSwxMTQsNDAsMTE2LDIsMTI0LDEsMTI0LDAsMTAwLDEsMTAwLDIsMTQ0LDEsCisgICAgMTMxLDIsODMsMCwxMTAsNCwxMDAsMCw4MywwLDEwMCwwLDgzLDAsNDEsMywKKyAgICA3OCwxMTQsMTA3LDAsMCwwLDEyMiw4LDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLAorICAgIDQxLDMsMTE0LDU3LDAsMCwwLDkwLDEwLDEwNSwxMTUsOTUsOTgsMTE3LDEwNSwxMDgsCisgICAgMTE2LDEwNSwxMTAsMTE0LDg1LDAsMCwwLDQxLDQsMjE4LDMsOTksMTA4LDExNSwxMTQsCisgICAgNzgsMCwwLDAsMjE4LDQsMTEyLDk3LDExNiwxMDQsMjE4LDYsMTE2LDk3LDExNCwxMDMsCisgICAgMTAxLDExNiwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCisgICAgMCwyMTgsOSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksMjA0LDIsMCwwLAorICAgIDExNSwxMCwwLDAsMCwwLDIsOCwxLDQsMSwxMCwxLDE4LDIsMTIyLAorICAgIDI1LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwKKyAgICA0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMywwLDAsMCwwLAorICAgIDAsMCwwLDQsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgMzAsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LDEsMTI0LDIsMTMxLDIsMTI1LDMsCisgICAgMTI0LDMsMTAwLDEsMTA3LDksMTE0LDI2LDEyNCwzLDEwNiwxLDgzLDAsMTAwLDEsCisgICAgODMsMCw0MSwyLDEyMiwxNzUsNzAsMTA1LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsOTgsCisgICAgMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDM5LDExMiw5NywxMTYsCisgICAgMTA0LDM5LDMyLDEwNSwxMTUsMzIsMTAxLDExOCwxMDEsMTE0LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwKKyAgICAxMDIsMTA1LDEwMSwxMDAsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsCisgICAgOTcsMTE0LDk5LDEwNCwzMiwxMDUsMTE1LDMyLDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwKKyAgICAxMDEsMTAwLDMyLDk3LDMyLDEwMiw5NywxMDUsMTA4LDExNywxMTQsMTAxLDQ2LDEwLDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwKKyAgICAxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCwKKyAgICA0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwKKyAgICA0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwxNTUsMCwwLDAsMTE0LDk5LDAsCisgICAgMCwwLDQxLDQsMTE0LDE1MiwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDE1MywKKyAgICAwLDAsMCwxMTQsODgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMjE4LDExLDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwyMTMsMiwwLDAsMTE1LDQsMCwwLDAsMCw5LDEyLAorICAgIDEsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwKKyAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsNDgsMCwwLDAsMTI0LDEsMTA2LDAsMTE2LDEsMTA2LDIsCisgICAgMTA3LDcsMTE0LDM2LDExNiwzLDEwMCwxLDEwNiw0LDEyNCwxLDEwNiwwLDEzMSwxLAorICAgIDEwMCwyLDEyNCwxLDEwNiwwLDE0NCwxLDEzMSwxLDEzMCwxLDExNiw1LDExNiw2LAorICAgIDEwNiw3LDEyNCwxLDEzMSwyLDgzLDAsNDEsMywxMjIsMjQsNjcsMTE0LDEwMSw5NywKKyAgICAxMTYsMTAxLDMyLDk3LDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDEyMiwyOSwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsCisgICAgMTE2LDMyLDk3LDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLAorICAgIDExNywxMDgsMTAxLDExNCwxNSwwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwxMTQsCisgICAgMTQsMCwwLDAsMTE0LDc2LDAsMCwwLDExNCw3NywwLDAsMCwxMTQsNTAsCisgICAgMCwwLDAsMTE0LDY1LDAsMCwwLDExNCw1NywwLDAsMCw5MCwxNCw5OSwKKyAgICAxMTQsMTAxLDk3LDExNiwxMDEsOTUsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNDEsMiwxMTQsCisgICAgMTksMCwwLDAsMTE0LDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxMzgsMCwwLDAsMjI1LDIsMCwKKyAgICAwLDExNSw4LDAsMCwwLDAsMywxMiwxLDE0LDEsMTAsMSwxMjIsMjksCisgICAgNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LAorICAgIDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsCisgICAgMCwwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwxNiwwLDAsMCwxMTYsMCwxMTYsMSwxMDYsMiwxMjQsMSwxMzEsCisgICAgMiwxLDAsMTAwLDEsODMsMCw0MSwyLDEyMiwyMiw2OSwxMjAsMTAxLDk5LDMyLAorICAgIDk3LDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCisgICAgMTAxLDc4LDQxLDMsMTE0LDY1LDAsMCwwLDExNCw1NywwLDAsMCw5MCwxMiwKKyAgICAxMDEsMTIwLDEwMSw5OSw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw0MSwyLDExNCwxOSwKKyAgICAwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLAorICAgIDAsMCwxMTQsMTEsMCwwLDAsMTE0LDEzOSwwLDAsMCwyMzMsMiwwLDAsCisgICAgMTE1LDIsMCwwLDAsMCwzLDEyMiwyNyw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCwKKyAgICA3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLAorICAgIDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwKKyAgICA4MywwLDQxLDIsMTIyLDU3LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwKKyAgICAxMDEsMzIsOTcsMTE1LDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsCisgICAgMTAxLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwxMTUsNDYsNzgsCisgICAgMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDE1MiwwLDAsMCwxMTQsNzgsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMjE4LDgsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsMjM4LDIsMCwwLDExNSwyLAorICAgIDAsMCwwLDAsNCwxMjIsMjQsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LAorICAgIDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiwKKyAgICA1Niw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwKKyAgICA5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsCisgICAgMzIsMTAwLDExMSwzMiwxMTAsMTExLDExNiwzMiwxMDQsOTcsMTE4LDEwMSwzMiwxMTUsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCwxMCwwLDAsMCw0MSwKKyAgICAyLDExNCwxNTIsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMCwxMDMsMTAxLDExNiw5NSwKKyAgICAxMTUsMTExLDExNywxMTQsOTksMTAxLDI0NCwyLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDQsMTIyLDI2LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk5LDIsMCwKKyAgICAwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLDEyMiw1Miw4MiwKKyAgICAxMDEsMTE2LDExNywxMTQsMTEwLDMyLDcwLDk3LDEwOCwxMTUsMTAxLDMyLDk3LDExNSwzMiw5OCwKKyAgICAxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsCisgICAgOTcsMTE0LDEwMSwzMiwxMTAsMTAxLDExOCwxMDEsMTE0LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLAorICAgIDEwMSwxMTUsNDYsNzAsMTE0LDEwLDAsMCwwLDQxLDIsMTE0LDE1MiwwLDAsMCwKKyAgICAxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMTE0LDEwOSwwLDAsMCwyNTAsMiwwLDAsMTE1LDIsMCwKKyAgICAwLDAsMCw0LDEyMiwyNiw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLAorICAgIDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsCisgICAgNDEsMiw3OCw3OCw0MSwxLDc4LDQxLDE3LDExNCwxLDAsMCwwLDExNCwwLAorICAgIDAsMCwwLDExNCwyLDAsMCwwLDExNCwzLDAsMCwwLDIxOCwxMiwxMTUsCisgICAgMTE2LDk3LDExNiwxMDUsOTksMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE0LDkyLDAsMCwwLAorICAgIDIxOCwxMSw5OSwxMDgsOTcsMTE1LDExNSwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTQsMTU1LDAsCisgICAgMCwwLDExNCwxNTYsMCwwLDAsMTE0LDEzOCwwLDAsMCwxMTQsMTM5LDAsMCwKKyAgICAwLDExNCw4MSwwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxNTgsMCwwLDAsCisgICAgMTE0LDEwOSwwLDAsMCwxMTQsOTAsMCwwLDAsMTE0LDE0NywwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsCisgICAgMCwwLDAsMTE0LDE1MSwwLDAsMCwxODYsMiwwLDAsMTE1LDMwLDAsMCwKKyAgICAwLDgsNyw0LDIsMTIsOSwyLDEsMTIsOCwyLDEsMTIsMTEsMTIsCisgICAgOCwxMiw1LDIsMSwxNCw1LDIsMSwxNCw1LDIsMSwxNCw1LDExNCwKKyAgICAxNTEsMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsNCwwLDAsMCw2NCwwLDAsMCwxMTUsMTQwLDAsMCwwLDEwMSwwLAorICAgIDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMSw0LDEwMCwyLDEwMCwzLAorICAgIDEzMiwwLDEzMSwxLDkwLDUsMTAxLDYsMTAwLDIxLDEwMCw1LDEwMCw2LDEzMiwxLAorICAgIDEzMSwxLDkwLDcsMTAxLDYsMTAwLDIyLDEwMCw3LDEwMCw4LDEzMiwxLDEzMSwxLAorICAgIDkwLDgsMTAxLDYsMTAwLDksMTAwLDEwLDEzMiwwLDEzMSwxLDkwLDksMTAxLDQsCisgICAgMTAwLDExLDEwMCwxMiwxMzIsMCwxMzEsMSw5MCwxMCwxMDEsNiwxMDAsMTMsMTAwLDE0LAorICAgIDEzMiwwLDEzMSwxLDkwLDExLDEwMSw2LDEwMSwxMiwxMDAsMTUsMTAwLDE2LDEzMiwwLAorICAgIDEzMSwxLDEzMSwxLDkwLDEzLDEwMSw2LDEwMSwxMiwxMDAsMTcsMTAwLDE4LDEzMiwwLAorICAgIDEzMSwxLDEzMSwxLDkwLDE0LDEwMSw2LDEwMSwxMiwxMDAsMTksMTAwLDIwLDEzMiwwLAorICAgIDEzMSwxLDEzMSwxLDkwLDE1LDEwMCw0LDgzLDAsNDEsMjMsMjE4LDE0LDcwLDExNCwKKyAgICAxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDEyMiwxNDIsNzcsMTAxLAorICAgIDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDIsCisgICAgMTExLDExNCwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKICAgICAxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNjUsMTA4LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsCiAgICAgMTExLDEwMCwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTA1LDExNiwxMDQsMTAxLDExNCwzMiw5OSwKICAgICAxMDgsOTcsMTE1LDExNSwzMiwxMTEsMTE0LDMyLDExNSwxMTYsOTcsMTE2LDEwNSw5OSwzMiwxMDksCkBAIC0xMjI5LDYwNSArMTI4Miw0NTUgQEAKICAgICAxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDExNiwxMDUsOTcsMTE2LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwKICAgICA5OSwxMDgsOTcsMTE1LDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw5OSwxLDAsMCwKICAgICAwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwxNiwwLDAsMCwxMDAsMSwwLDEwNiwwLDAsMTI0LDAsMCwxMDYsCi0gICAgMSwwLDEzMSwxLDAsODMsNDEsMiwxMjIsMTE1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsCi0gICAgMzIsMTE0LDEwMSwxMTIsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsCisgICAgMCwxMTUsMTIsMCwwLDAsMTAwLDEsMTA2LDAsMTI0LDAsMTA2LDEsMTMxLDEsCisgICAgODMsMCw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTQsMTAxLDExMiwKKyAgICAxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksCisgICAgMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsCisgICAgMTE2LDEwMSwxMDAsNDYsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKKyAgICAzMiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDEwNiwxMTEsOTgsMzIsMTA1LDExNiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAsCisgICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDIyLDYwLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDQxLAorICAgIDYyLDQxLDIsMTE0LDUwLDAsMCwwLDExNCwxLDAsMCwwLDQxLDEsMjE4LAorICAgIDEsMTA5LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKKyAgICAwLDExNCw5MiwwLDAsMCwxMiwzLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCisgICAgMTE0LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCw3OCw5OSw0LAorICAgIDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw1LDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwzNiwwLDAsMCwxMTYsMCwxMDYsMSwxMjQsMSwxMzEsMSwKKyAgICAxMTQsMjgsMTE2LDIsMTI0LDEsMTI0LDAsMTAwLDEsMTAwLDIsMTQ0LDEsMTMxLDIsCisgICAgODMsMCwxMTAsNCwxMDAsMCw4MywwLDEwMCwwLDgzLDAsNDEsMyw3OCwxMTQsCisgICAgMTA3LDAsMCwwLDkwLDYsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsNDEsMywxMTQsNTcsCisgICAgMCwwLDAsMTE0LDgyLDAsMCwwLDExNCw4NSwwLDAsMCw0MSw0LDExNCwKKyAgICAxNTIsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDE1NCwKKyAgICAwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwxMTQsMTU1LDAsMCwwLDIxLDMsMCwwLDExNSw2LDAsMCwwLAorICAgIDAsMiwxMCwxLDE4LDIsMTIyLDI0LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LAorICAgIDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwKKyAgICA5OSwzLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwyLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxOCwwLDAsMCwxMTYsMCwxMDYsMSwxMjQsMSwKKyAgICAxMzEsMSwxMTQsMTQsMTI0LDAsODMsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDkzLAorICAgIDcwLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsCiAgICAgMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAotICAgIDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwKLSAgICAxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMzIsMTA5LDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDMyLDEwMCwKLSAgICAxMTEsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDYsMTExLDk4LDMyLDEwNSwxMTYsMTE1LDEwMSwKLSAgICAxMDgsMTAyLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDEyMiwyNCw2MCwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiw0MCw5OCwxMTcsMTA1LAotICAgIDEwOCwxMTYsNDUsMTA1LDExMCw0MSw2Miw0MSwyLDExNCw1MCwwLDAsMCwxMTQsMSwKLSAgICAwLDAsMCw0MSwxLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsOTIsMCwwLDAsMTk1LDIsCi0gICAgMCwwLDExNSwyLDAsMCwwLDAsNywxMjIsMjcsNjYsMTE3LDEwNSwxMDgsMTE2LAotICAgIDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDk1LDExNCwxMDEsMTEyLDExNCw3OCw5OSw0LDAsMCwwLDAsMCwwLDAsCi0gICAgNCwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSw1OCwwLDAsCi0gICAgMCwxMjQsMiwwLDEwMCwwLDAsMTA3LDksMCwxMTQsMTYsMCwxMDAsMCwwLAotICAgIDgzLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwxLDAsMTE0LDUwLDAsCi0gICAgMTE2LDIsMCwxMjQsMSwwLDEyNCwwLDAsMTAwLDEsMCwxMDAsMiwwLDEzMSwKLSAgICAyLDEsODMsMTAwLDAsMCw4MywxMDAsMCwwLDgzLDQxLDMsNzgsMTE0LDEwNywKLSAgICAwLDAsMCwxMjIsOCw5OCwxMTcsMTA1LDEwOCwxMTYsNDUsMTA1LDExMCw0MSwzLDExNCwKLSAgICA1NywwLDAsMCw5MCwxMCwxMDUsMTE1LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLAotICAgIDExNCw4NSwwLDAsMCw0MSw0LDIxOCwzLDk5LDEwOCwxMTUsMTE0LDc4LDAsMCwKLSAgICAwLDIxOCw0LDExMiw5NywxMTYsMTA0LDIxOCw2LDExNiw5NywxMTQsMTAzLDEwMSwxMTYsMTE0LAotICAgIDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDksCi0gICAgMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDIwNCwyLDAsMCwxMTUsMTAsMCwKLSAgICAwLDAsMCwyLDEyLDEsNCwxLDE1LDEsMTksMiwxMjIsMjUsNjYsMTE3LAotICAgIDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsCi0gICAgMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLDAsCi0gICAgNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw0MSwwLDAsCi0gICAgMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsCi0gICAgMTI1LDMsMCwxMjQsMywwLDEwMCwxLDAsMTA3LDksMCwxMTQsMzcsMCwxMjQsCi0gICAgMywwLDEwNiwxLDAsODMsMTAwLDEsMCw4Myw0MSwyLDEyMiwxNzUsNzAsMTA1LAotICAgIDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzMsMTAyLDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDMyLDEwNSwxMTUsMzIsMTAxLDExOCwKLSAgICAxMDEsMTE0LDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTE2LDEwNCwxMDEsCi0gICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMDUsMTE1LDMyLAotICAgIDk5LDExMSwxMTAsMTE1LDEwNSwxMDAsMTAxLDExNCwxMDEsMTAwLDMyLDk3LDMyLDEwMiw5NywxMDUsCi0gICAgMTA4LDExNywxMTQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAogICAgIDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKICAgICAxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwKICAgICAxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLAogICAgIDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLAotICAgIDExNCwxNTQsMCwwLDAsMTE0LDk5LDAsMCwwLDQxLDQsMTE0LDE1MSwwLDAsCi0gICAgMCwxMTQsNzgsMCwwLDAsMTE0LDE1MiwwLDAsMCwxMTQsODgsMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAotICAgIDExLDEwMiwxMDUsMTEwLDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwyMTMsMiwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMCw5LDE4LDEsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwKLSAgICAxMDUsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsCisgICAgMTE0LDU3LDAsMCwwLDExNCw4MiwwLDAsMCw0MSwzLDExNCwxNTIsMCwwLAorICAgIDAsMTE0LDc4LDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NiwwLDAsMCwyOCwKKyAgICAzLDAsMCwxMTUsMiwwLDAsMCwwLDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLAorICAgIDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwKICAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKLSAgICAwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw2NywwLDAsMCwKLSAgICAxMjQsMSwwLDEwNiwwLDAsMTE2LDEsMCwxMDYsMiwwLDEwNyw3LDAsMTE0LAotICAgIDUxLDAsMTE2LDMsMCwxMDAsMSwwLDEwNiw0LDAsMTI0LDEsMCwxMDYsMCwKLSAgICAwLDEzMSwxLDAsMTAwLDIsMCwxMjQsMSwwLDEwNiwwLDAsMTMxLDEsMSwKLSAgICAxMzAsMSwwLDExNiw1LDAsMTE2LDYsMCwxMDYsNywwLDEyNCwxLDAsMTMxLAotICAgIDIsMCw4Myw0MSwzLDEyMiwyNCw2NywxMTQsMTAxLDk3LDExNiwxMDEsMzIsOTcsMzIsCi0gICAgOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTIyLAotICAgIDI5LDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMzIsOTgsCi0gICAgMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDE1LAotICAgIDAsMCwwLDQxLDgsMTE0LDE1LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsCi0gICAgNzYsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsNjUsCi0gICAgMCwwLDAsMTE0LDU3LDAsMCwwLDkwLDE0LDk5LDExNCwxMDEsOTcsMTE2LDEwMSwKLSAgICA5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw0MSwyLDExNCwxOSwwLDAsMCwxMTQsCisgICAgMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwKKyAgICAxMDAsMSw4MywwLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLDEwMSwxMDIsOTcsCisgICAgMTE3LDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwNSwxMTEsCisgICAgMTEwLDQ2LDc4LDExNCwxMCwwLDAsMCw0MSwyLDExNCwxNTIsMCwwLDAsMTE0LAogICAgIDg4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAotICAgIDAsMCwwLDExNCwxMzgsMCwwLDAsMjI1LDIsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsMywxOCwxLDIxLDEsMTIsMSwxMjIsMjksNjYsMTE3LDEwNSwxMDgsMTE2LAotICAgIDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDk5LDExNCwxMDEsOTcsMTE2LAotICAgIDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMCwwLAotICAgIDAsMCwxMTYsMCwwLDExNiwxLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwyLAotICAgIDAsMSwxMDAsMSwwLDgzLDQxLDIsMTIyLDIyLDY5LDEyMCwxMDEsOTksMzIsOTcsCi0gICAgMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNzgsNDEsMywxMTQsNjUsMCwwLDAsMTE0LDU3LDAsMCwwLDkwLDEyLDEwMSwKLSAgICAxMjAsMTAxLDk5LDk1LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDQxLDIsMTE0LDE5LDAsCi0gICAgMCwwLDExNCw4OSwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMSwwLDAsMCwxMTQsMTM5LDAsMCwwLDIzMywyLDAsMCwxMTUsCi0gICAgMiwwLDAsMCwwLDMsMTIyLDI3LDY2LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDczLAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwKLSAgICAxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsCi0gICAgODMsNDEsMiwxMjIsNTcsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwKLSAgICAzMiw5NywxMTUsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsCi0gICAgMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDExNSw0Niw3OCwxMTQsCi0gICAgMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsCi0gICAgOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwyMzgsMiwwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCw0LDEyMiwyNCw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDU2LAotICAgIDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDk4LAotICAgIDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwKLSAgICAxMDAsMTExLDMyLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTgsMTAxLDMyLDExNSwxMTEsMTE3LDExNCwKLSAgICA5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsNDYsNzgsMTE0LDEwLDAsMCwwLDQxLDIsCi0gICAgMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEwLDEwMywxMDEsMTE2LDk1LDExNSwKLSAgICAxMTEsMTE3LDExNCw5OSwxMDEsMjQ0LDIsMCwwLDExNSwyLDAsMCwwLDAsNCwKLSAgICAxMjIsMjYsNjYsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsCi0gICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDUyLDgyLDEwMSwKLSAgICAxMTYsMTE3LDExNCwxMTAsMzIsNzAsOTcsMTA4LDExNSwxMDEsMzIsOTcsMTE1LDMyLDk4LDExNywKLSAgICAxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywKLSAgICAxMTQsMTAxLDMyLDExMCwxMDEsMTE4LDEwMSwxMTQsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAotICAgIDExNSw0Niw3MCwxMTQsMTAsMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCwKKyAgICAwLDAsMCwxMTQsMTM4LDAsMCwwLDM3LDMsMCwwLDExNSwwLDAsMCwKKyAgICAwLDEyMiwyOCw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLAorICAgIDExNCw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksCisgICAgMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNCwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsNjYsMCwwLDAsMTI0LDAsMTA2LDAsMTA2LDEsMTI1LAorICAgIDEsMTE2LDIsMTA2LDMsMTI0LDEsMTMxLDEsMTE1LDM4LDExNiw0LDEwMCwxLDEwNiwKKyAgICA1LDEyNCwxLDEzMSwxLDEwMCwyLDEyNCwxLDE0NCwxLDEzMSwxLDEzMCwxLDExNiwKKyAgICA2LDExNiwyLDEwNiw3LDEyNCwxLDEzMSwyLDEyNSwyLDExNiw4LDEyNCwyLDEyNCwKKyAgICAwLDEwNiw5LDEzMSwyLDEsMCwxMDAsMCw4MywwLDQxLDMsNzgsMTIyLDI3LAorICAgIDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsMzIsMTAyLDExNCwKKyAgICAxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDE1LDAsMCwwLAorICAgIDQxLDEwLDExNCw5NSwwLDAsMCwxMTQsMTUsMCwwLDAsMTE0LDU3LDAsMCwKKyAgICAwLDExNCw4MiwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDUwLDAsMCwwLAorICAgIDExNCw2NSwwLDAsMCwyMTgsMTcsMTAzLDEwMSwxMTYsOTUsMTAyLDExNCwxMTEsMTIyLDEwMSwKKyAgICAxMTAsOTUsMTExLDk4LDEwNiwxMDEsOTksMTE2LDIxOCw0LDEwMSwxMjAsMTAxLDk5LDExNCw3LAorICAgIDAsMCwwLDQxLDMsMTE0LDg5LDAsMCwwLDExNCwxNSwwLDAsMCwyMTgsCisgICAgNCw5OSwxMTEsMTAwLDEwMSwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwxMTQsMTM5LDAsMCwwLDQxLDMsMCwwLDExNSwxMiwwLAorICAgIDAsMCwwLDIsOCwxLDEwLDEsMTIsMSw4LDEsMTIsMSwxMjIsMjYsCisgICAgNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAxLAorICAgIDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLAorICAgIDAsMCwwLDIsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgMTAsMCwwLDAsMTE2LDAsMTI0LDAsMTI0LDEsMTMxLDIsODMsMCw0MSwxLAorICAgIDEyMiw5NSw3NiwxMTEsOTcsMTAwLDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLAorICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsCisgICAgMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLAorICAgIDMyLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwKKyAgICAxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDQxLDEsMTE0LDkwLDAsMCwwLDQxLDIsMTE0LDE1MiwwLDAsMCwxMTQsCiAgICAgNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsCi0gICAgMCwwLDAsMTE0LDEwOSwwLDAsMCwyNTAsMiwwLDAsMTE1LDIsMCwwLAotICAgIDAsMCw0LDEyMiwyNiw2NiwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw3MywxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsNDEsCi0gICAgMTcsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsCi0gICAgMTE0LDMsMCwwLDAsMjE4LDEyLDExNSwxMTYsOTcsMTE2LDEwNSw5OSwxMDksMTAxLDExNiwKLSAgICAxMDQsMTExLDEwMCwxMTQsOTIsMCwwLDAsMjE4LDExLDk5LDEwOCw5NywxMTUsMTE1LDEwOSwKLSAgICAxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwxNTQsMCwwLDAsMTE0LDE1NSwwLDAsMCwxMTQsCi0gICAgMTM4LDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDgxLDAsMCwwLDExNCwxNTYsCi0gICAgMCwwLDAsMTE0LDE1NywwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCw5MCwwLAotICAgIDAsMCwxMTQsMTQ2LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTUwLDAsMCwwLAotICAgIDE4NiwyLDAsMCwxMTUsMzAsMCwwLDAsMTIsNyw2LDIsMTgsOSwzLAotICAgIDEsMjEsOCwzLDEsMTgsMTEsMTgsOCwxOCw1LDMsMSwyMSw1LDMsCi0gICAgMSwyMSw1LDMsMSwyMSw1LDExNCwxNTAsMCwwLDAsOTksMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw2NCwwLDAsCi0gICAgMCwxMTUsMjExLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsOTAsCi0gICAgMiwwLDEwMCwxLDAsOTAsMywwLDEwMSw0LDAsMTAwLDIsMCwxMDAsMywKLSAgICAwLDEzMiwwLDAsMTMxLDEsMCw5MCw1LDAsMTAxLDYsMCwxMDAsNCwwLAotICAgIDEwMCw0LDAsMTAwLDUsMCwxMDAsNiwwLDEzMiwyLDAsMTMxLDEsMCw5MCwKLSAgICA3LDAsMTAxLDYsMCwxMDAsNCwwLDEwMCw3LDAsMTAwLDgsMCwxMzIsMSwKLSAgICAwLDEzMSwxLDAsOTAsOCwwLDEwMSw2LDAsMTAwLDksMCwxMDAsMTAsMCwKLSAgICAxMzIsMCwwLDEzMSwxLDAsOTAsOSwwLDEwMSw0LDAsMTAwLDExLDAsMTAwLAotICAgIDEyLDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEwLDAsMTAxLDYsMCwxMDAsMTMsCi0gICAgMCwxMDAsMTQsMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTEsMCwxMDEsNiwwLAotICAgIDEwMSwxMiwwLDEwMCwxNSwwLDEwMCwxNiwwLDEzMiwwLDAsMTMxLDEsMCwxMzEsCi0gICAgMSwwLDkwLDEzLDAsMTAxLDYsMCwxMDEsMTIsMCwxMDAsMTcsMCwxMDAsMTgsCi0gICAgMCwxMzIsMCwwLDEzMSwxLDAsMTMxLDEsMCw5MCwxNCwwLDEwMSw2LDAsCi0gICAgMTAxLDEyLDAsMTAwLDE5LDAsMTAwLDIwLDAsMTMyLDAsMCwxMzEsMSwwLDEzMSwKLSAgICAxLDAsOTAsMTUsMCwxMDAsNCwwLDgzLDQxLDIxLDIxOCwxNCw3MCwxMTQsMTExLAotICAgIDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMjIsMTQyLDc3LDEwMSwxMTYsCi0gICAgOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTAyLDExMSwKLSAgICAxMTQsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY1LDEwOCwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwKLSAgICAxMDAsMTE1LDMyLDk3LDExNCwxMDEsMzIsMTAxLDEwNSwxMTYsMTA0LDEwMSwxMTQsMzIsOTksMTA4LAotICAgIDk3LDExNSwxMTUsMzIsMTExLDExNCwzMiwxMTUsMTE2LDk3LDExNiwxMDUsOTksMzIsMTA5LDEwMSwKLSAgICAxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMTE4LDExMSwxMDUsMTAwLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwNSwKLSAgICAxMTAsMTE1LDExNiw5NywxMTAsMTE2LDEwNSw5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDk5LAotICAgIDEwOCw5NywxMTUsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk5LDEsMCwwLDAsCi0gICAgMCwwLDAsMCwxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsCi0gICAgMTE1LDE2LDAsMCwwLDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDEwNiwxLAotICAgIDAsMTMxLDEsMCw4Myw0MSwyLDEyMiwxMTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwKLSAgICAxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LAotICAgIDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwKLSAgICAxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksMTA0LDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsMTAwLDExMSwKLSAgICAxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNiwxMTEsOTgsMzIsMTA1LDExNiwxMTUsMTAxLDEwOCwKLSAgICAxMDIsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDIyLDYwLDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDQwLDEwMiwxMTQsMTExLDEyMiwKLSAgICAxMDEsMTEwLDQxLDYyLDQxLDIsMTE0LDUwLDAsMCwwLDExNCwxLDAsMCwwLAotICAgIDQxLDEsMjE4LDEsMTA5LDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDExLDAsMCwwLDExNCw5MiwwLDAsMCwxMiwzLDAsMCwxMTUsMiwwLAotICAgIDAsMCwwLDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsCi0gICAgMTE0LDExNiwxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLDExNCwKLSAgICA3OCw5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw1LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw0MiwwLDAsMCwxMTYsMCwwLDEwNiwxLAotICAgIDAsMTI0LDEsMCwxMzEsMSwwLDExNCwzNCwwLDExNiwyLDAsMTI0LDEsMCwKLSAgICAxMjQsMCwwLDEwMCwxLDAsMTAwLDIsMCwxMzEsMiwxLDgzLDEwMCwwLDAsCi0gICAgODMsMTAwLDAsMCw4Myw0MSwzLDc4LDExNCwxMDcsMCwwLDAsOTAsNiwxMDIsCi0gICAgMTE0LDExMSwxMjIsMTAxLDExMCw0MSwzLDExNCw1NywwLDAsMCwxMTQsODIsMCwwLAotICAgIDAsMTE0LDg1LDAsMCwwLDQxLDQsMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwKLSAgICAwLDAsMTE0LDE1MiwwLDAsMCwxMTQsMTUzLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTQsMCwwLDAsCi0gICAgMjEsMywwLDAsMTE1LDYsMCwwLDAsMCwyLDE1LDEsMTksMiwxMjIsCi0gICAgMjQsNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLDAsMCwwLAotICAgIDAsMCwzLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDIzLAotICAgIDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsMSwwLDEzMSwxLDAsMTE0LAotICAgIDE5LDAsMTI0LDAsMCw4MywxMDAsMSwwLDgzLDQxLDIsMTIyLDkzLDcwLDEwNSwKLSAgICAxMTAsMTAwLDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsCi0gICAgMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LAotICAgIDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwxMDUsMTEwLAotICAgIDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCw1NywKLSAgICAwLDAsMCwxMTQsODIsMCwwLDAsNDEsMywxMTQsMTUxLDAsMCwwLDExNCwKLSAgICA3OCwwLDAsMCwxMTQsMTUyLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTUsMCwwLDAsMjgsMywwLAotICAgIDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyNiw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLAotICAgIDczLDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLAotICAgIDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSwKLSAgICAwLDgzLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwKLSAgICAxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LAotICAgIDc4LDExNCwxMCwwLDAsMCw0MSwyLDExNCwxNTEsMCwwLDAsMTE0LDg4LDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwKLSAgICAwLDExNCwxMzgsMCwwLDAsMzcsMywwLDAsMTE1LDAsMCwwLDAsMTIyLAotICAgIDI4LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LAotICAgIDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwxLDAsCi0gICAgMCwwLDAsMCwwLDAsMywwLDAsMCw0LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSw5MiwwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTA2LDEsMCwKLSAgICAxMjUsMSwwLDExNiwyLDAsMTA2LDMsMCwxMjQsMSwwLDEzMSwxLDAsMTE1LAotICAgIDU0LDAsMTE2LDQsMCwxMDAsMSwwLDEwNiw1LDAsMTI0LDEsMCwxMzEsMSwKLSAgICAwLDEwMCwyLDAsMTI0LDEsMCwxMzEsMSwxLDEzMCwxLDAsMTE2LDYsMCwKLSAgICAxMTYsMiwwLDEwNiw3LDAsMTI0LDEsMCwxMzEsMiwwLDEyNSwyLDAsMTE2LAotICAgIDgsMCwxMjQsMiwwLDEyNCwwLDAsMTA2LDksMCwxMzEsMiwwLDEsMTAwLAotICAgIDAsMCw4Myw0MSwzLDc4LDEyMiwyNywxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLAotICAgIDExMCwxMTEsMTE2LDMyLDk3LDMyLDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLAotICAgIDExNywxMDgsMTAxLDExNCwxNSwwLDAsMCw0MSwxMCwxMTQsOTUsMCwwLDAsMTE0LAotICAgIDE1LDAsMCwwLDExNCw1NywwLDAsMCwxMTQsODIsMCwwLDAsMTE0LDc3LAotICAgIDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsNjUsMCwwLDAsMjE4LDE3LDEwMywKLSAgICAxMDEsMTE2LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LDExMSw5OCwxMDYsMTAxLDk5LDExNiwKLSAgICAyMTgsNCwxMDEsMTIwLDEwMSw5OSwxMTQsNywwLDAsMCw0MSwzLDExNCw4OSwwLAotICAgIDAsMCwxMTQsMTUsMCwwLDAsMjE4LDQsOTksMTExLDEwMCwxMDEsMTE0LDEwLDAsCi0gICAgMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDEzOSwwLDAsCi0gICAgMCw0MSwzLDAsMCwxMTUsMTIsMCwwLDAsMCwyLDEyLDEsMTUsMSwKLSAgICAxOCwxLDksMSwxOCwxLDEyMiwyNiw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMTAxLDExNCw0NiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsCi0gICAgMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwzLAotICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMTYsMCwwLDEyNCwKLSAgICAwLDAsMTI0LDEsMCwxMzEsMiwwLDgzLDQxLDEsMTIyLDk1LDc2LDExMSw5NywKLSAgICAxMDAsMzIsOTcsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsCi0gICAgMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLAotICAgIDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsOTksCi0gICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSw5NywKLSAgICAxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNDEsMSwxMTQsOTAsCi0gICAgMCwwLDAsNDEsMiwxMTQsMTUxLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTQ2LAotICAgIDAsMCwwLDUwLDMsMCwwLDExNSwyLDAsMCwwLDAsNywxMjIsMjYsCi0gICAgNzAsMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTA4LAotICAgIDExMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLAotICAgIDAsMCwwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgMTMsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwKLSAgICA4Myw0MSwxLDEyMiw0NSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSw0Niw0MSwyLDExNCw1NywwLDAsMCwxMTQsMTYyLDAsMCwwLDQxLDIsCi0gICAgMTE0LDE1MSwwLDAsMCwxMTQsNzgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDE1NiwwLDAsMCw1OSwzLAotICAgIDAsMCwxMTUsMiwwLDAsMCwwLDQsMTIyLDIzLDcwLDExNCwxMTEsMTIyLDEwMSwKLSAgICAxMTAsNzMsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwKLSAgICAxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4MywKLSAgICA0MSwyLDEyMiw1NCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLAotICAgIDk3LDExNSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTUsMzIsMTAwLDExMSwzMiwxMTAsMTExLDExNiwzMiwxMDQsOTcsMTE4LDEwMSwzMiwxMTUsMTExLAotICAgIDExNywxMTQsOTksMTAxLDMyLDk5LDExMSwxMDAsMTAxLDQ2LDc4LDExNCwxMCwwLDAsMCwKLSAgICA0MSwyLDExNCwxNTEsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsCisgICAgMCwwLDAsMTE0LDE0NywwLDAsMCw1MCwzLDAsMCwxMTUsMiwwLDAsCisgICAgMCwwLDcsMTIyLDI2LDcwLDExNCwxMTEsMTIyLDEwMSwxMTAsNzMsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiwxMDEsMTE0LDQ2LDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDEwLDAsMCwwLDExNiwwLDEwNiwxLDEyNCwxLDEzMSwKKyAgICAxLDgzLDAsNDEsMSwxMjIsNDUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLDExMSwKKyAgICAxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsNDYsNDEsMiwxMTQsNTcsMCwwLDAsMTE0LDE2MywwLDAsMCwKKyAgICA0MSwyLDExNCwxNTIsMCwwLDAsMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsCiAgICAgMCwxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDExNCwxNTcsMCwwLDAsCi0gICAgNjUsMywwLDAsMTE1LDIsMCwwLDAsMCw0LDEyMiwyNSw3MCwxMTQsMTExLAorICAgIDU5LDMsMCwwLDExNSwyLDAsMCwwLDAsNCwxMjIsMjMsNzAsMTE0LDExMSwKICAgICAxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsCi0gICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKLSAgICAwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwKLSAgICAxMTYsMCwwLDEwNiwxLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDQxLDEsMTIyLAotICAgIDQ2LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwzMiwxMDUsMTE1LDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0Niw0MSwKLSAgICAyLDExNCw1NywwLDAsMCw5MCwxNywxMDUsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsCi0gICAgMTEwLDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwyLDExNCwxNTEsMCwwLDAsCi0gICAgMTE0LDc4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDExLDAsMCwwLDExNCwxMDksMCwwLDAsNzEsMywwLDAsMTE1LDIsMCwKLSAgICAwLDAsMCw0LDEyMiwyNSw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwKLSAgICAxNiwxMTQsMSwwLDAsMCwxMTQsMCwwLDAsMCwxMTQsMiwwLDAsMCwKLSAgICAxMTQsMywwLDAsMCwxMTQsMTU4LDAsMCwwLDExNCw5MiwwLDAsMCwxMTQsCi0gICAgMTU5LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LDE1NSwwLDAsMCwxMTQsMTM4LAotICAgIDAsMCwwLDExNCwxMzksMCwwLDAsMTE0LDE0NiwwLDAsMCwxMTQsODQsMCwKLSAgICAwLDAsMTE0LDE1NiwwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxMDksMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDExLDAsMCwwLDExNCwxNjAsMCwwLDAsMywzLDAsMCwxMTUsMzAsCi0gICAgMCwwLDAsMTIsNyw2LDIsMTgsOSwzLDEsMjEsNiwzLDEsMTgsCi0gICAgOCwxOCw0LDE4LDksMTgsOSwzLDEsMjEsNSwzLDEsMjEsNSwzLAotICAgIDEsMTE0LDE2MCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICAwLDAsMCwyLDAsMCwwLDY0LDAsMCwwLDExNSw0NiwwLDAsMCwKLSAgICAxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLAotICAgIDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsCi0gICAgMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LDAsODMsNDEsNywKLSAgICAyMTgsMTgsOTUsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksMTA3LDY3LDExMSwxMTAsCi0gICAgMTE2LDEwMSwxMjAsMTE2LDEyMiwzNiw2NywxMTEsMTEwLDExNiwxMDEsMTIwLDExNiwzMiwxMDksOTcsCi0gICAgMTEwLDk3LDEwMywxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksCi0gICAgMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDk5LDEsMCwwLDAsMCwKLSAgICAwLDAsMCwxLDAsMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LAotICAgIDE0LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMzEsMCwwLDEsMTAwLDEsCi0gICAgMCw4Myw0MSwyLDEyMiwyNCw2NSw5OSwxMTMsMTE3LDEwNSwxMTQsMTAxLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDc4LDQxLAotICAgIDIsMTE0LDU3LDAsMCwwLDExNCwxNDUsMCwwLDAsNDEsMSwxMTQsMTksMCwKLSAgICAwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLAotICAgIDAsMTE0LDIzLDAsMCwwLDg0LDMsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMiwxMjIsMjgsOTUsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw3NiwxMTEsOTksMTA3LDY3LDExMSwKLSAgICAxMTAsMTE2LDEwMSwxMjAsMTE2LDQ2LDk1LDk1LDEwMSwxMTAsMTE2LDEwMSwxMTQsOTUsOTUsOTksCi0gICAgNCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMSwwLDAsMCwKLSAgICA2NywwLDAsMCwxMTUsMTQsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwKLSAgICAwLDAsMSwxMDAsMSwwLDgzLDQxLDIsMTIyLDYwLDgyLDEwMSwxMDgsMTAxLDk3LAotICAgIDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LDExMSwKLSAgICA5OSwxMDcsMzIsMTE0LDEwMSwxMDMsOTcsMTE0LDEwMCwxMDgsMTAxLDExNSwxMTUsMzIsMTExLDEwMiwKLSAgICAzMiw5NywxMTAsMTIxLDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTAxLDEyMCw5OSwxMDEsCi0gICAgMTEyLDExNiwxMDUsMTExLDExMCwxMTUsNDYsNzgsNDEsMiwxMTQsNTcsMCwwLDAsMTE0LAotICAgIDU4LDAsMCwwLDQxLDQsMTE0LDE5LDAsMCwwLDkwLDgsMTAxLDEyMCw5OSwKLSAgICA5NSwxMTYsMTIxLDExMiwxMDEsOTAsOSwxMDEsMTIwLDk5LDk1LDExOCw5NywxMDgsMTE3LDEwMSwKLSAgICA5MCwxMywxMDEsMTIwLDk5LDk1LDExNiwxMTQsOTcsOTksMTAxLDk4LDk3LDk5LDEwNywxMTQsCi0gICAgMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMzAsCi0gICAgMCwwLDAsODgsMywwLDAsMTE1LDIsMCwwLDAsMCwyLDEyMiwyNywKLSAgICA5NSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDc2LDExMSw5OSwxMDcsNjcsMTExLDExMCwxMTYsMTAxLAotICAgIDEyMCwxMTYsNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LDk1LDk1LDc4LDQxLDYsMTE0LDEsCi0gICAgMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLDAsMTE0LDMsMCwKLSAgICAwLDAsMTE0LDIzLDAsMCwwLDExNCwzMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCi0gICAgMTE0LDE2NSwwLDAsMCw4MCwzLDAsMCwxMTUsNiwwLDAsMCwxMiwyLAotICAgIDYsMiwxMiw0LDExNCwxNjUsMCwwLDAsOTksMywwLDAsMCwwLDAsCi0gICAgMCwwLDUsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsODgsCi0gICAgMCwwLDAsMTI0LDEsMCwxMDYsMCwwLDEwMCwxLDAsMTI0LDIsMCwxMDAsCi0gICAgMiwwLDI0LDEzMSwyLDAsMTI1LDMsMCwxMTYsMSwwLDEyNCwzLDAsMTMxLAotICAgIDEsMCwxMjQsMiwwLDEwNywwLDAsMTE0LDUyLDAsMTE2LDIsMCwxMDAsMywKLSAgICAwLDEzMSwxLDAsMTMwLDEsMCwxMjQsMywwLDEwMCw0LDAsMjUsMTI1LDQsCi0gICAgMCwxMjQsMCwwLDExNCw4NCwwLDEwMCw1LDAsMTA2LDMsMCwxMjQsNCwwLAotICAgIDEyNCwwLDAsMTMxLDIsMCw4MywxMjQsNCwwLDgzLDQxLDYsMTIyLDUwLDgyLAotICAgIDEwMSwxMTUsMTExLDEwOCwxMTgsMTAxLDMyLDk3LDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LAotICAgIDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwzMiwxMTYsMTExLAotICAgIDMyLDk3LDExMCwzMiw5Nyw5OCwxMTUsMTExLDEwOCwxMTcsMTE2LDEwMSwzMiwxMTEsMTEwLDEwMSwKLSAgICA0NiwxMTQsMTIxLDAsMCwwLDExNCw0NSwwLDAsMCwxMjIsNTAsOTcsMTE2LDExNiwKKyAgICA5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCisgICAgMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLAorICAgIDgzLDAsNDEsMiwxMjIsNTQsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLAorICAgIDEwMSwzMiw5NywxMTUsMzIsMTAyLDExNCwxMTEsMTIyLDEwMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMTE1LDMyLDEwMCwxMTEsMzIsMTEwLDExMSwxMTYsMzIsMTA0LDk3LDExOCwxMDEsMzIsCisgICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsMTAsMCwKKyAgICAwLDAsNDEsMiwxMTQsMTUyLDAsMCwwLDExNCw3OCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTU4LDAsCisgICAgMCwwLDY1LDMsMCwwLDExNSwyLDAsMCwwLDAsNCwxMjIsMjUsNzAsCisgICAgMTE0LDExMSwxMjIsMTAxLDExMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsNDYsMTAzLDEwMSwKKyAgICAxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxMCwwLAorICAgIDAsMCwxMTYsMCwxMDYsMSwxMjQsMSwxMzEsMSw4MywwLDQxLDEsMTIyLDQ2LAorICAgIDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICAzMiwxMDUsMTE1LDMyLDk3LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0Niw0MSwyLAorICAgIDExNCw1NywwLDAsMCw5MCwxNywxMDUsMTE1LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLAorICAgIDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwyLDExNCwxNTIsMCwwLDAsMTE0LAorICAgIDc4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDExNCwxMDksMCwwLDAsNzEsMywwLDAsMTE1LDIsMCwwLAorICAgIDAsMCw0LDEyMiwyNSw3MCwxMTQsMTExLDEyMiwxMDEsMTEwLDczLDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw0MSwyLAorICAgIDc4LDc4LDQxLDEsNzgsNDEsMTYsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLAorICAgIDAsMTE0LDIsMCwwLDAsMTE0LDMsMCwwLDAsMTE0LDE1OSwwLDAsMCwKKyAgICAxMTQsOTIsMCwwLDAsMTE0LDE2MCwwLDAsMCwxMTQsMTU1LDAsMCwwLDExNCwKKyAgICAxNTYsMCwwLDAsMTE0LDEzOCwwLDAsMCwxMTQsMTM5LDAsMCwwLDExNCwxNDcsCisgICAgMCwwLDAsMTE0LDg0LDAsMCwwLDExNCwxNTcsMCwwLDAsMTE0LDE1OCwwLAorICAgIDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTYxLDAsMCwwLAorICAgIDMsMywwLDAsMTE1LDMwLDAsMCwwLDgsNyw0LDIsMTIsOSwyLAorICAgIDEsMTIsNiwyLDEsMTIsOCwxMiw0LDEyLDksMTIsOSwyLDEsMTQsCisgICAgNSwyLDEsMTQsNSwyLDEsMTE0LDE2MSwwLDAsMCw5OSwwLDAsMCwKKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDY0LDAsMCwKKyAgICAwLDExNSwzMiwwLDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsCisgICAgOTAsMywxMDAsMiwxMDAsMywxMzIsMCw5MCw0LDEwMCw0LDEwMCw1LDEzMiwwLAorICAgIDkwLDUsMTAwLDYsODMsMCw0MSw3LDIxOCwxOCw5NSw3MywxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDc2LDExMSw5OSwxMDcsNjcsMTExLDExMCwxMTYsMTAxLDEyMCwxMTYsMTIyLDM2LDY3LDExMSwKKyAgICAxMTAsMTE2LDEwMSwxMjAsMTE2LDMyLDEwOSw5NywxMTAsOTcsMTAzLDEwMSwxMTQsMzIsMTAyLDExMSwKKyAgICAxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA4LDExMSw5OSwKKyAgICAxMDcsNDYsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTE2LDAsMTA2LDEsCisgICAgMTMxLDAsMSwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMjQsNjUsOTksMTEzLDExNywKKyAgICAxMDUsMTE0LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDgsCisgICAgMTExLDk5LDEwNyw0Niw3OCw0MSwyLDExNCw1NywwLDAsMCwxMTQsMTQ2LDAsMCwKKyAgICAwLDQxLDEsMTE0LDE5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDExLDAsMCwwLDExNCwyMywwLDAsMCw4NCwzLDAsMCwKKyAgICAxMTUsMiwwLDAsMCwwLDIsMTIyLDI4LDk1LDczLDEwOSwxMTIsMTExLDExNCwxMTYsCisgICAgNzYsMTExLDk5LDEwNyw2NywxMTEsMTEwLDExNiwxMDEsMTIwLDExNiw0Niw5NSw5NSwxMDEsMTEwLAorICAgIDExNiwxMDEsMTE0LDk1LDk1LDk5LDQsMCwwLDAsMCwwLDAsMCw0LDAsCisgICAgMCwwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsMCwwLDExNiwKKyAgICAwLDEwNiwxLDEzMSwwLDEsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDYwLDgyLAorICAgIDEwMSwxMDgsMTAxLDk3LDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMzIsMTA4LDExMSw5OSwxMDcsMzIsMTE0LDEwMSwxMDMsOTcsMTE0LDEwMCwxMDgsMTAxLDExNSwKKyAgICAxMTUsMzIsMTExLDEwMiwzMiw5NywxMTAsMTIxLDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsCisgICAgMTAxLDEyMCw5OSwxMDEsMTEyLDExNiwxMDUsMTExLDExMCwxMTUsNDYsNzgsNDEsMiwxMTQsNTcsCisgICAgMCwwLDAsMTE0LDU4LDAsMCwwLDQxLDQsMTE0LDE5LDAsMCwwLDkwLAorICAgIDgsMTAxLDEyMCw5OSw5NSwxMTYsMTIxLDExMiwxMDEsOTAsOSwxMDEsMTIwLDk5LDk1LDExOCwKKyAgICA5NywxMDgsMTE3LDEwMSw5MCwxMywxMDEsMTIwLDk5LDk1LDExNiwxMTQsOTcsOTksMTAxLDk4LAorICAgIDk3LDk5LDEwNywxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLAorICAgIDAsMCwxMTQsMzAsMCwwLDAsODgsMywwLDAsMTE1LDIsMCwwLDAsCisgICAgMCwyLDEyMiwyNyw5NSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDc2LDExMSw5OSwxMDcsNjcsCisgICAgMTExLDExMCwxMTYsMTAxLDEyMCwxMTYsNDYsOTUsOTUsMTAxLDEyMCwxMDUsMTE2LDk1LDk1LDc4LAorICAgIDQxLDYsMTE0LDEsMCwwLDAsMTE0LDAsMCwwLDAsMTE0LDIsMCwwLAorICAgIDAsMTE0LDMsMCwwLDAsMTE0LDIzLDAsMCwwLDExNCwzMCwwLDAsMCwKKyAgICAxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTEsMCwwLDAsMTE0LDE2NiwwLDAsMCw4MCwzLDAsMCwxMTUsNiwwLAorICAgIDAsMCw4LDIsNCwyLDgsNCwxMTQsMTY2LDAsMCwwLDk5LDMsMCwKKyAgICAwLDAsMCwwLDAsMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDY0LDAsMCwwLDEyNCwxLDEwNiwwLDEwMCwxLDEyNCwyLDEwMCwKKyAgICAyLDI0LDAsMTMxLDIsMTI1LDMsMTE2LDEsMTI0LDMsMTMxLDEsMTI0LDIsMTA3LAorICAgIDAsMTE0LDM2LDExNiwyLDEwMCwzLDEzMSwxLDEzMCwxLDEyNCwzLDEwMCw0LDI1LAorICAgIDAsMTI1LDQsMTI0LDAsMTE0LDYwLDEwMCw1LDEwNiwzLDEyNCw0LDEyNCwwLDEzMSwKKyAgICAyLDgzLDAsMTI0LDQsODMsMCw0MSw2LDEyMiw1MCw4MiwxMDEsMTE1LDExMSwxMDgsCisgICAgMTE4LDEwMSwzMiw5NywzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwxMDEsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTE2LDExMSwzMiw5NywxMTAsMzIsCisgICAgOTcsOTgsMTE1LDExMSwxMDgsMTE3LDExNiwxMDEsMzIsMTExLDExMCwxMDEsNDYsMTE0LDEyMSwwLAorICAgIDAsMCwxMTQsNDUsMCwwLDAsMTIyLDUwLDk3LDExNiwxMTYsMTAxLDEwOSwxMTIsMTE2LAorICAgIDEwMSwxMDAsMzIsMTE0LDEwMSwxMDgsOTcsMTE2LDEwNSwxMTgsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwKKyAgICAxMTQsMTE2LDMyLDk4LDEwMSwxMjEsMTExLDExMCwxMDAsMzIsMTE2LDExMSwxMTIsNDUsMTA4LDEwMSwKKyAgICAxMTgsMTAxLDEwOCwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LDMzLDAsMCwwLAorICAgIDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSw0MSw0LDIxOCw2LDExNCwxMTUsMTEyLDEwOCwxMDUsCisgICAgMTE2LDIxOCwzLDEwOCwxMDEsMTEwLDIxOCwxMCw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LAorICAgIDExMSwxMTQsMTE0LDUwLDAsMCwwLDQxLDUsMTE0LDE1LDAsMCwwLDIxOCw3LAorICAgIDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwyMTgsNSwxMDgsMTAxLDExOCwxMDEsMTA4LDkwLDQsCisgICAgOTgsMTA1LDExNiwxMTUsOTAsNCw5OCw5NywxMTUsMTAxLDExNCwxMCwwLDAsMCwxMTQsCisgICAgMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxMyw5NSwxMTQsMTAxLDExNSwxMTEsCisgICAgMTA4LDExOCwxMDEsOTUsMTEwLDk3LDEwOSwxMDEsOTMsMywwLDAsMTE1LDEwLDAsMCwKKyAgICAwLDAsMiwxNiwxLDEyLDEsOCwxLDgsMSwxMTQsMTcyLDAsMCwwLAorICAgIDk5LDMsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwxLAorICAgIDEyNCwyLDEzMSwyLDEyNSwzLDEyNCwzLDEwMCwwLDEwNyw4LDExNCwyNCwxMDAsMCwKKyAgICA4MywwLDExNiwxLDEyNCwxLDEyNCwzLDEzMSwyLDgzLDAsNDEsMSw3OCw0MSwKKyAgICAyLDExNCwxNTYsMCwwLDAsMTE0LDg1LDAsMCwwLDQxLDQsMjE4LDYsMTAyLAorICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDE1LDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LAorICAgIDk5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDExLAorICAgIDAsMCwwLDIxOCwxNyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTUsCisgICAgMTA4LDEwMSwxMDMsOTcsOTksMTIxLDEwMiwzLDAsMCwxMTUsOCwwLDAsMCwwLAorICAgIDMsMTIsMSw4LDEsNCwxLDExNCwxNzQsMCwwLDAsOTksMywwLDAsCisgICAgMCwwLDAsMCwwLDEwLDAsMCwwLDI3LDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwyNDQsMCwwLDAsMTE2LDAsMTA2LDEsMTI1LDMsMTI0LDMsMTAwLDEsCisgICAgMTA3LDgsMTE0LDIyLDExNiwyLDEwMCwyLDEzMSwxLDEzMCwxLDEyNCwzLDExNSwzOCwKKyAgICAxMTYsMywxMDYsNCwxMDAsMywxMTYsNSwxMzEsMiwxLDAsMTI0LDAsMTE2LDAsCisgICAgMTA2LDYsMTA3LDYsMTI1LDQsMTIwLDE5MCwxMjQsMyw2OCwwLDkzLDE3OCwxMjUsNSwKKyAgICAxMTYsNywxMzEsMCwxNDMsNzIsMSwwLDEyMSwxMCwxMjQsNSwxMDYsOCwxMjUsNiwKKyAgICA4NywwLDExMCw0Miw0LDAsMTE2LDksMTA3LDEwLDExNCwxMTgsMSwwLDEsMCwKKyAgICAxLDAsMTE2LDEwLDEyNCw1LDEyNCwwLDEyNCwxLDEzMSwzLDEyNSw3LDEyNCw3LAorICAgIDEwMCwxLDEwNyw4LDExNCwxMTQsMTE5LDU0LDg5LDAsMTEwLDE0LDg4LDAsMTI0LDYsCisgICAgMTI0LDAsMTI0LDEsMTI0LDIsMTMxLDMsMTI1LDcsODcsMCwxMDAsMSw4MSwwLAorICAgIDgyLDAsODgsMCwxMjQsNywxMDAsMSwxMDcsOSwxMTQsNTQsMTI0LDQsMTIsMCwKKyAgICAxMTQsMjI4LDEyNCwwLDExNiwwLDEwNiw2LDEwNyw2LDExNCwyMjgsMTE2LDAsMTA2LDYsCisgICAgMTI0LDAsMjUsMCwxMjUsOCwxMjEsMTAsMTI0LDgsMTA2LDExLDEyNSw5LDg3LDAsCisgICAgMTEwLDIwLDQsMCwxMTYsOSwxMDcsMTAsMTE0LDIwNiwxLDAsMSwwLDEsMCwKKyAgICAxMjQsNyw4MywwLDg4LDAsMTI0LDksMTAwLDEsMTA3LDgsMTE0LDIyMiwxMjQsNywKKyAgICA4MywwLDExMywyMzIsMTI0LDksODMsMCwxMTMsNTQsMTI0LDcsODMsMCwxMTMsNTQsCisgICAgODcsMCwxMDAsMSw4MywwLDEwMCwxLDgzLDAsNDEsNCwxMjIsMjEsNzAsMTA1LAorICAgIDExMCwxMDAsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzksMTE1LDMyLDExNSwxMTIsCisgICAgMTAxLDk5LDQ2LDc4LDEyMiw1MywxMTUsMTIxLDExNSw0NiwxMDksMTAxLDExNiw5Nyw5NSwxMTIsCisgICAgOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDQ0LDMyLDgwLDEyMSwxMTYsCisgICAgMTA0LDExMSwxMTAsMzIsMTA1LDExNSwzMiwxMDgsMTA1LDEwNywxMDEsMTA4LDEyMSwzMiwxMTUsMTA0LAorICAgIDExNywxMTYsMTE2LDEwNSwxMTAsMTAzLDMyLDEwMCwxMTEsMTE5LDExMCwxMjIsMjIsMTE1LDEyMSwxMTUsCisgICAgNDYsMTA5LDEwMSwxMTYsOTcsOTUsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMDEsMTA5LAorICAgIDExMiwxMTYsMTIxLDQxLDEyLDExNCwxNCwwLDAsMCwyMTgsOSwxMDksMTAxLDExNiw5NywKKyAgICA5NSwxMTIsOTcsMTE2LDEwNCwxMTQsNzcsMCwwLDAsMTE0LDE0MiwwLDAsMCwxMTQsCisgICAgMTQzLDAsMCwwLDIxOCwxMyw3MywxMDksMTEyLDExMSwxMTQsMTE2LDg3LDk3LDExNCwxMTAsCisgICAgMTA1LDExMCwxMDMsMTE0LDIxLDAsMCwwLDExNCwxNjYsMCwwLDAsMTE0LDE1NSwwLAorICAgIDAsMCwxMTQsOTYsMCwwLDAsMTE0LDE3NCwwLDAsMCwxMTQsOTUsMCwwLAorICAgIDAsNDEsMTAsMTE0LDE1LDAsMCwwLDExNCwxNTMsMCwwLDAsMTE0LDE1NCwwLAorICAgIDAsMCwxMTQsMTc1LDAsMCwwLDkwLDksMTA1LDExNSw5NSwxMTQsMTAxLDEwOCwxMTEsCisgICAgOTcsMTAwLDExNCwxNzMsMCwwLDAsMTE0LDE1NSwwLDAsMCwxMTQsODgsMCwwLAorICAgIDAsMTE0LDg5LDAsMCwwLDExNCw5NSwwLDAsMCwxMTQsMTAsMCwwLDAsCisgICAgMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwyMTgsMTAsOTUsMTAyLDEwNSwxMTAsCisgICAgMTAwLDk1LDExNSwxMTIsMTAxLDk5LDExMSwzLDAsMCwxMTUsNTQsMCwwLDAsMCwKKyAgICAyLDYsMSw4LDIsOCwzLDQsMSwxMiw1LDEwLDEsMTAsMSw4LAorICAgIDEsMiwxLDEwLDEsMTQsMSwxMiwxLDgsMSw4LDIsMjIsMSw4LAorICAgIDIsMTYsMSwxMCwxLDIsMSwxMCwxLDE0LDQsNiwyLDgsMSw2LAorICAgIDIsNiwyLDgsMiwxMTQsMTc3LDAsMCwwLDk5LDMsMCwwLDAsMCwKKyAgICAwLDAsMCw0LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDE0MCwwLDAsMCwxMTYsMCwxMjQsMCwxMTYsMSwxMzEsMiwxMTUsMjgsMTE2LDIsCisgICAgMTAwLDEsMTA2LDMsMTE2LDQsMTI0LDAsMTMxLDEsMTMxLDEsMTMxLDEsMTMwLDEsCisgICAgMTI0LDIsMTAwLDIsMTA3LDAsMTE0LDQ0LDExNiw1LDEwMCwzLDEzMSwxLDEzMCwxLAorICAgIDEyNCwyLDEwMCwyLDEwNyw0LDExNCwxMTQsMTE2LDAsMTI0LDEsMTE2LDEsMTMxLDIsCisgICAgMTE1LDcyLDExNiwyLDEwMCw0LDEzMSwxLDEzMCwxLDExMCw0MiwxMjQsMSwxMTUsODYsCisgICAgMTE2LDYsMTAwLDUsMTMxLDEsMTMwLDEsMTEwLDI4LDEyNCwxLDExNiw3LDEwNiw4LAorICAgIDEwNyw3LDExNCwxMTQsMTAwLDYsMTI1LDMsMTE2LDksMTI0LDMsMTA2LDMsMTI0LDEsCisgICAgMTMxLDEsMTMxLDEsMTMwLDEsMTI0LDAsMTIsMCwxMTQsMTM2LDEyNCwyLDEwMCwyLAorICAgIDEwNywyLDExNCwxMzYsMTE2LDUsMTAwLDcsMTMxLDEsMTMwLDEsMTAwLDgsODMsMCwKKyAgICA0MSw5LDEyMiwyOCw4NiwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDk3LDExNCwxMDMsMTE3LDEwOSwKKyAgICAxMDEsMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwzNCwxMTUsOTcsMTEwLDEwMSwzNCw0NiwKKyAgICAxMjIsMzEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTA5LDExNywKKyAgICAxMTUsMTE2LDMyLDk4LDEwMSwzMiwxMTUsMTE2LDExNCw0NCwzMiwxMTAsMTExLDExNiwzMiwxMjMsCisgICAgMTI1LDExNCwzMywwLDAsMCwxMjIsMTgsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMDksMTE3LAorICAgIDExNSwxMTYsMzIsOTgsMTAxLDMyLDYyLDYxLDMyLDQ4LDEyMiwzMSw5NSw5NSwxMTIsOTcsCisgICAgOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDEwMSwxMTYsMzIsCisgICAgMTE2LDExMSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMjIsNTQsOTcsMTE2LDExNiwKICAgICAxMDEsMTA5LDExMiwxMTYsMTAxLDEwMCwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LDExOCwxMDEsMzIsCi0gICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsOTgsMTAxLDEyMSwxMTEsMTEwLDEwMCwzMiwxMTYsMTExLAotICAgIDExMiw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsCi0gICAgMzMsMCwwLDAsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDQxLDQsMjE4LDYsMTE0LAotICAgIDExNSwxMTIsMTA4LDEwNSwxMTYsMjE4LDMsMTA4LDEwMSwxMTAsMjE4LDEwLDg2LDk3LDEwOCwxMTcsCi0gICAgMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsNTAsMCwwLDAsNDEsNSwxMTQsMTUsMCwKLSAgICAwLDAsMjE4LDcsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDIxOCw1LDEwOCwxMDEsMTE4LAotICAgIDEwMSwxMDgsOTAsNCw5OCwxMDUsMTE2LDExNSw5MCw0LDk4LDk3LDExNSwxMDEsMTE0LDEwLAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LAotICAgIDExNCwxMDEsMTE1LDExMSwxMDgsMTE4LDEwMSw5NSwxMTAsOTcsMTA5LDEwMSw5MywzLDAsMCwKLSAgICAxMTUsMTAsMCwwLDAsMCwyLDIyLDEsMTgsMSwxMiwxLDEwLDEsMTE0LAotICAgIDE3MSwwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNCwwLDAsCi0gICAgMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw0NywwLDAsMCwxMjQsMCwKLSAgICAwLDEwNiwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDMsMCwKLSAgICAxMjQsMywwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMzQsMCwxMDAsMCwwLDgzLAotICAgIDExNiwxLDAsMTI0LDEsMCwxMjQsMywwLDEzMSwyLDAsODMsNDEsMSw3OCwKLSAgICA0MSwyLDExNCwxNTUsMCwwLDAsMTE0LDg1LDAsMCwwLDQxLDQsMjE4LDYsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDE1LDAsMCwwLDExNCwxNTIsMCwwLDAsCi0gICAgMTE0LDk5LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAotICAgIDExLDAsMCwwLDIxOCwxNyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksCi0gICAgOTUsMTA4LDEwMSwxMDMsOTcsOTksMTIxLDEwMiwzLDAsMCwxMTUsOCwwLDAsMCwKLSAgICAwLDMsMTgsMSwxMiwxLDQsMSwxMTQsMTczLDAsMCwwLDk5LDMsMCwKLSAgICAwLDAsMCwwLDAsMCw5LDAsMCwwLDI3LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSw0MiwxLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOSwwLDExNCw0MSwwLDExNiwwLDAsMTA2LDEsMCwxMiwxMTQsNDEsMCwKLSAgICAxMTYsMiwwLDEwNiwzLDAsMTAwLDIsMCwxMTYsNCwwLDEzMSwyLDAsMSwKLSAgICAxMjQsMCwwLDExNiwwLDAsMTA2LDUsMCwxMDcsNiwwLDEyNSwzLDAsMTIwLAotICAgIDIzNSwwLDExNiwwLDAsMTA2LDEsMCw2OCw5MywyMjAsMCwxMjUsNCwwLDExNiwKLSAgICA2LDAsMTMxLDAsMCwxNDMsOTAsMCwxLDEyMSwxMywwLDEyNCw0LDAsMTA2LAotICAgIDcsMCwxMjUsNSwwLDg3LDExMCw1MSwwLDQsMTE2LDgsMCwxMDcsMTAsMCwKLSAgICAxMTQsMTQ4LDAsMSwxLDEsMTE2LDksMCwxMjQsNCwwLDEyNCwwLDAsMTI0LAotICAgIDEsMCwxMzEsMywwLDEyNSw2LDAsMTI0LDYsMCwxMDAsMSwwLDEwNyw4LAotICAgIDAsMTE0LDE0NCwwLDExOSw2NiwwLDg5LDExMCwxOSwwLDg4LDEyNCw1LDAsMTI0LAotICAgIDAsMCwxMjQsMSwwLDEyNCwyLDAsMTMxLDMsMCwxMjUsNiwwLDg3LDEwMCwKLSAgICAxLDAsODEsODIsODgsMTI0LDYsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LDY2LAotICAgIDAsMTI0LDMsMCwxMiwxMTQsMjYsMSwxMjQsMCwwLDExNiwwLDAsMTA2LDUsCi0gICAgMCwxMDcsNiwwLDExNCwyNiwxLDExNiwwLDAsMTA2LDUsMCwxMjQsMCwwLAotICAgIDI1LDEyNSw3LDAsMTIxLDEzLDAsMTI0LDcsMCwxMDYsMTAsMCwxMjUsOCwwLAotICAgIDg3LDExMCwyMiwwLDQsMTE2LDgsMCwxMDcsMTAsMCwxMTQsMiwxLDEsMSwKLSAgICAxLDEyNCw2LDAsODMsODksMTEzLDMwLDEsODgsMTI0LDgsMCwxMDAsMSwwLAotICAgIDEwNyw4LDAsMTE0LDE5LDEsMTI0LDYsMCw4MywxMjQsOCwwLDgzLDExMyw2NiwKLSAgICAwLDEyNCw2LDAsODMsMTEzLDY2LDAsODcsMTAwLDEsMCw4MywxMDAsMSwwLAotICAgIDgzLDQxLDMsMTIyLDIzLDcwLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDM5LDExNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDc4LDEyMiwyMiwxMTUsCi0gICAgMTIxLDExNSw0NiwxMDksMTAxLDExNiw5Nyw5NSwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLAotICAgIDEwMSwxMDksMTEyLDExNiwxMjEsNDEsMTEsMTE0LDE0LDAsMCwwLDIxOCw5LDEwOSwxMDEsCi0gICAgMTE2LDk3LDk1LDExMiw5NywxMTYsMTA0LDExNCwxNDEsMCwwLDAsMTE0LDE0MiwwLDAsCi0gICAgMCwyMTgsMTMsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLAotICAgIDExNCwyMSwwLDAsMCwxMTQsMTY1LDAsMCwwLDExNCwxNTQsMCwwLDAsMTE0LAotICAgIDk2LDAsMCwwLDExNCwxNzMsMCwwLDAsMTE0LDk1LDAsMCwwLDQxLDksCi0gICAgMTE0LDE1LDAsMCwwLDExNCwxNTIsMCwwLDAsMTE0LDE1MywwLDAsMCw5MCwKLSAgICA5LDEwNSwxMTUsOTUsMTE0LDEwMSwxMDgsMTExLDk3LDEwMCwxMTQsMTcyLDAsMCwwLDExNCwKLSAgICAxNTQsMCwwLDAsMTE0LDg4LDAsMCwwLDExNCw4OSwwLDAsMCwxMTQsOTUsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKLSAgICAwLDAsMjE4LDEwLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwxMTEsMywKLSAgICAwLDAsMTE1LDQ4LDAsMCwwLDAsMiwyNSwxLDE2LDQsMTUsMSwxNiwKLSAgICAxLDEwLDEsMywxLDEzLDEsMTMsMSwxOCwxLDEyLDEsOCwyLDI1LAotICAgIDEsMTIsMiwyMiwxLDEzLDEsMywxLDEzLDEsMTMsNCw5LDIsMTIsCi0gICAgMSw0LDIsNywyLDgsMiwxMTQsMTc2LDAsMCwwLDk5LDMsMCwwLAotICAgIDAsMCwwLDAsMCw0LDAsMCwwLDQsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDE4NSwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTE2LDEsMCwxMzEsCi0gICAgMiwwLDExNSw0MiwwLDExNiwyLDAsMTAwLDEsMCwxMDYsMywwLDExNiw0LAotICAgIDAsMTI0LDAsMCwxMzEsMSwwLDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLAotICAgIDEyNCwyLDAsMTAwLDIsMCwxMDcsMCwwLDExNCw2NiwwLDExNiw1LDAsMTAwLAotICAgIDMsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDIsMCwxMDAsMiwwLDEwNyw0LAotICAgIDAsMTE0LDE1MCwwLDExNiwwLDAsMTI0LDEsMCwxMTYsMSwwLDEzMSwyLDAsCi0gICAgMTE1LDEwOCwwLDExNiwyLDAsMTAwLDQsMCwxMzEsMSwwLDEzMCwxLDAsMTEwLAotICAgIDQyLDAsMTI0LDEsMCwxMTYsNiwwLDEwNiw3LDAsMTA3LDcsMCwxMTQsMTUwLAotICAgIDAsMTAwLDUsMCwxMjUsMywwLDExNiw4LDAsMTI0LDMsMCwxMDYsMywwLAotICAgIDEyNCwxLDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LDAsMCwxMiwKLSAgICAxMTQsMTgxLDAsMTI0LDIsMCwxMDAsMiwwLDEwNywyLDAsMTE0LDE4MSwwLDExNiwKLSAgICA1LDAsMTAwLDYsMCwxMzEsMSwwLDEzMCwxLDAsMTAwLDcsMCw4Myw0MSwKLSAgICA4LDEyMiwyOCw4NiwxMDEsMTE0LDEwNSwxMDIsMTIxLDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsCi0gICAgMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwzNCwxMTUsOTcsMTEwLDEwMSwzNCw0NiwxMjIsCi0gICAgMzEsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTA5LDExNywxMTUsCi0gICAgMTE2LDMyLDk4LDEwMSwzMiwxMTUsMTE2LDExNCw0NCwzMiwxMTAsMTExLDExNiwzMiwxMjMsMTI1LAotICAgIDExNCwzMywwLDAsMCwxMjIsMTgsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwxMDksMTE3LDExNSwKLSAgICAxMTYsMzIsOTgsMTAxLDMyLDYyLDYxLDMyLDQ4LDEyMiwzMSw5NSw5NSwxMTIsOTcsOTksCi0gICAgMTA3LDk3LDEwMywxMDEsOTUsOTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LDEwMSwxMTYsMzIsMTE2LAotICAgIDExMSwzMiw5NywzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMjIsNjEsODAsOTcsMTE0LDEwMSwKLSAgICAxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywxMTQsMTI1LDMyLDExMCwKLSAgICAxMTEsMTE2LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsNDQsMzIsOTksOTcsMTEwLDExMCwxMTEsCi0gICAgMTE2LDMyLDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LDEwOSwzMiwxMTQsMTAxLDEwOCw5NywxMTYsMTA1LAotICAgIDExOCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTIyLDE3LDY5LDEwOSwxMTIsMTE2LDEyMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSw3OCw0MSw5LDIxOCwKLSAgICAxMCwxMDUsMTE1LDEwNSwxMTAsMTE1LDExNiw5NywxMTAsOTksMTAxLDIxOCwzLDExNSwxMTYsMTE0LAotICAgIDIxOCw5LDg0LDEyMSwxMTIsMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsNTAsMCwwLDAsCi0gICAgMTE0LDEzLDAsMCwwLDExNCwxNjgsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwKLSAgICAyMSwwLDAsMCwyMTgsMTEsODMsMTIxLDExNSwxMTYsMTAxLDEwOSw2OSwxMTQsMTE0LDExMSwKLSAgICAxMTQsNDEsNCwxMTQsMTUsMCwwLDAsMTE0LDE2OSwwLDAsMCwxMTQsMTcwLDAsCi0gICAgMCwwLDExNCwxNDcsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMjE4LDEzLDk1LDExNSw5NywxMTAsMTA1LDExNiwxMjEsOTUsCi0gICAgOTksMTA0LDEwMSw5OSwxMDcsMTUxLDMsMCwwLDExNSwyNCwwLDAsMCwwLDIsCi0gICAgMTUsMSwyNywxLDEyLDEsMTIsMSwxMiwxLDE1LDEsMTUsMSwxNSwxLAotICAgIDYsMiwyMSwxLDE5LDEsMTE0LDE4MSwwLDAsMCwxMjIsMTYsNzgsMTExLDMyLAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiwxMjIsNCwxMjMsCi0gICAgMzMsMTE0LDEyNSw5OSwyLDAsMCwwLDAsMCwwLDAsOCwwLDAsMCwKLSAgICAxMiwwLDAsMCw2NywwLDAsMCwxMTUsNDAsMSwwLDAsMTAwLDAsMCwKLSAgICAxMjUsMiwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMSwwLDEzMSwxLDAsMTAwLAotICAgIDIsMCwyNSwxMjUsMywwLDEyNCwzLDAsMTE0LDE3NSwwLDEyNCwzLDAsMTE2LAotICAgIDEsMCwxMDYsMiwwLDEwNyw3LDAsMTE0LDU5LDAsMTE2LDMsMCwxMjQsMSwKLSAgICAwLDEyNCwzLDAsMTMxLDIsMCwxLDEyNCwwLDAsMTE2LDEsMCwxMDYsMiwKLSAgICAwLDEwNyw2LDAsMTE0LDg1LDAsMTE2LDEsMCwxMDYsMiwwLDEyNCwwLDAsCi0gICAgMjUsODMsMTE2LDEsMCwxMDYsMiwwLDEyNCwzLDAsMjUsMTI1LDQsMCwxMjEsCi0gICAgMTMsMCwxMjQsNCwwLDEwNiw0LDAsMTI1LDIsMCw4NywxMTAsNjEsMCw0LAotICAgIDExNiw1LDAsMTA3LDEwLDAsMTE0LDE3NCwwLDEsMSwxLDExNiw2LDAsMTAwLAotICAgIDMsMCwyMywxMDYsNywwLDEyNCwwLDAsMTI0LDMsMCwxMzEsMiwwLDEyNSwKLSAgICA1LDAsMTE2LDgsMCwxMjQsNSwwLDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwKLSAgICAxLDEwMCwwLDAsMTMwLDIsMCw4OSwxMTAsMSwwLDg4LDExNiw5LDAsMTI0LAotICAgIDAsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDYsMCwxMjQsNiwwLDEwMCwwLAotICAgIDAsMTA3LDgsMCwxMTQsMjMyLDAsMTE2LDgsMCwxMTYsNiwwLDEwNiw3LDAsCi0gICAgMTI0LDAsMCwxMzEsMSwwLDEwMCw0LDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwKLSAgICAxLDAsMTEwLDEyLDAsMTE2LDEwLDAsMTI0LDYsMCwxMzEsMSwwLDEyNSw3LAotICAgIDAsMTI0LDMsMCwxMTQsMzYsMSwxMTYsMSwwLDEwNiwyLDAsMTI0LDMsMCwKLSAgICAyNSwxMjUsNCwwLDExNiwxMSwwLDEyNCw0LDAsMTI0LDAsMCwxMDYsMCwwLAotICAgIDEwMCwxLDAsMTMxLDEsMCwxMDAsNSwwLDI1LDEyNCw3LDAsMTMxLDMsMCwKLSAgICAxLDEyNCw3LDAsODMsNDEsNiw3OCwxMTQsMTIxLDAsMCwwLDExNCwzMywwLAotICAgIDAsMCwxMjIsMjMsNTksMzIsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLAotICAgIDExNiwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMTE0LDE1LDAsMCwwLAotICAgIDExNCwxNDAsMCwwLDAsNDEsMTIsMTE0LDEyMiwwLDAsMCwxMTQsMTQsMCwwLAotICAgIDAsMTE0LDIxLDAsMCwwLDExNCw2NSwwLDAsMCwxMTQsMTMxLDAsMCwwLAotICAgIDExNCw5NiwwLDAsMCwyMTgsOCw5NSw2OSw4Miw4Miw5NSw3Nyw4Myw3MSwxMTQsCi0gICAgNTAsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNzYsMCwwLDAsMTE0LDE0OSwKLSAgICAwLDAsMCwxMTQsNSwwLDAsMCw0MSw4LDExNCwxNSwwLDAsMCwyMTgsCi0gICAgNywxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwxMTQsMTUyLDAsMCwwLDExNCwxMjMsMCwKLSAgICAwLDAsOTAsMTMsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwxMTQsMTQ3LDAsMCwwLDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsCi0gICAgMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LAotICAgIDIzLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSw5NywxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDk1LAotICAgIDExNywxMTAsMTA4LDExMSw5OSwxMDcsMTAxLDEwMCwxNzEsMywwLDAsMTE1LDQyLDAsMCwKLSAgICAwLDAsMSw2LDEsMTksMSw2LDEsMTUsMSwxMywyLDE1LDEsMTEsCi0gICAgMSwxMywxLDMsMSwxMywxLDEzLDEsMjIsMSwyNiwxLDE1LDEsMTIsCi0gICAgMSwzMCwyLDEyLDEsNiwyLDEzLDEsMjksMSwxMTQsMTg0LDAsMCwwLAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEwLDAsMCwKLSAgICAwLDY3LDAsMCwwLDExNSwzNywwLDAsMCwxMTYsMCwwLDEyNCwwLDAsCi0gICAgMTMxLDEsMCwxNDMsMTgsMCwxLDExNiwxLDAsMTI0LDAsMCwxMjQsMSwwLAotICAgIDEzMSwyLDAsODMsODcsMTAwLDEsMCw4MSw4Miw4OCwxMDAsMSwwLDgzLDQxLAotICAgIDIsMTIyLDU0LDcwLDEwNSwxMTAsMTAwLDMyLDk3LDExMCwxMDAsMzIsMTA4LDExMSw5NywxMDAsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDQsMzIsOTcsMTEwLDEwMCwKLSAgICAzMiwxMTQsMTAxLDEwOCwxMDEsOTcsMTE1LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwzMiwxMDgsMTExLDk5LDEwNyw0Niw3OCw0MSwyLDExNCw1NCwwLDAsCi0gICAgMCwxMTQsMTg0LDAsMCwwLDQxLDIsMTE0LDE1LDAsMCwwLDExNCwxODMsMCwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTEwLDExMSwzMiwxMDcsCisgICAgMTEwLDExMSwxMTksMTEwLDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzIsMTEyLDk3LDk5LDEwNywKKyAgICA5NywxMDMsMTAxLDEyMiw2MSw4MCw5NywxMTQsMTAxLDExMCwxMTYsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTEwLDExMSwxMTYsMzIsMTA4LDExMSw5NywxMDAsCisgICAgMTAxLDEwMCw0NCwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsMTEyLDEwMSwxMTQsMTAyLDExMSwKKyAgICAxMTQsMTA5LDMyLDExNCwxMDEsMTA4LDk3LDExNiwxMDUsMTE4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsCisgICAgMTE0LDExNiwxMjIsMTcsNjksMTA5LDExMiwxMTYsMTIxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDMyLDExMCw5NywxMDksMTAxLDc4LDQxLDEwLDIxOCwxMCwxMDUsMTE1LDEwNSwxMTAsMTE1LDExNiwKKyAgICA5NywxMTAsOTksMTAxLDIxOCwzLDExNSwxMTYsMTE0LDIxOCw5LDg0LDEyMSwxMTIsMTAxLDY5LAorICAgIDExNCwxMTQsMTExLDExNCwxMTQsNTAsMCwwLDAsMTE0LDEzLDAsMCwwLDExNCwxNjksCisgICAgMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMjEsMCwKKyAgICAwLDAsMjE4LDExLDgzLDEyMSwxMTUsMTE2LDEwMSwxMDksNjksMTE0LDExNCwxMTEsMTE0LDQxLAorICAgIDQsMTE0LDE1LDAsMCwwLDExNCwxNzAsMCwwLDAsMTE0LDE3MSwwLDAsMCwKKyAgICAxMTQsMTQ4LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LAorICAgIDExLDAsMCwwLDIxOCwxMyw5NSwxMTUsOTcsMTEwLDEwNSwxMTYsMTIxLDk1LDk5LDEwNCwKKyAgICAxMDEsOTksMTA3LDE1OCwzLDAsMCwxMTUsMjgsMCwwLDAsMCwyLDEwLDEsCisgICAgMTgsMSw4LDEsOCwxLDgsMSwxMCwxLDEwLDEsNCwxLDEwLDIsCisgICAgMTAsMSw0LDIsMTQsMSwxNCwxLDExNCwxODIsMCwwLDAsMTIyLDE2LDc4LAorICAgIDExMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMDAsMzIsMTIyLAorICAgIDQsMTIzLDMzLDExNCwxMjUsOTksMiwwLDAsMCwwLDAsMCwwLDgsMCwKKyAgICAwLDAsMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDIyNCwwLDAsMCwxMDAsCisgICAgMCwxMjUsMiwxMjQsMCwxMDYsMCwxMDAsMSwxMzEsMSwxMDAsMiwyNSwwLDEyNSwKKyAgICAzLDEyNCwzLDExNCwxMzYsMTI0LDMsMTE2LDEsMTA2LDIsMTA3LDcsMTE0LDQyLDExNiwKKyAgICAzLDEyNCwxLDEyNCwzLDEzMSwyLDEsMCwxMjQsMCwxMTYsMSwxMDYsMiwxMDcsCisgICAgNiwxMTQsNjIsMTE2LDEsMTA2LDIsMTI0LDAsMjUsMCw4MywwLDExNiwxLDEwNiwKKyAgICAyLDEyNCwzLDI1LDAsMTI1LDQsMTIxLDEwLDEyNCw0LDEwNiw0LDEyNSwyLDg3LAorICAgIDAsMTEwLDUyLDQsMCwxMTYsNSwxMDcsMTAsMTE0LDEzNCwxLDAsMSwwLDEsCisgICAgMCwxMTYsNiwxMDAsMywyMywwLDEwNiw3LDEyNCwwLDEyNCwzLDEzMSwyLDEyNSwKKyAgICA1LDExNiw4LDEyNCw1LDEwMCw0LDEyNCwwLDE0NCwxLDEzMSwxLDEwMCwwLDEzMCwKKyAgICAyLDg5LDAsMTEwLDIsODgsMCwxMTYsOSwxMjQsMCwxMjQsMiwxMzEsMiwxMjUsCisgICAgNiwxMjQsNiwxMDAsMCwxMDcsOCwxMTQsMTc2LDExNiw4LDExNiw2LDEwNiw3LDEyNCwKKyAgICAwLDEzMSwxLDEwMCw0LDEyNCwwLDE0NCwxLDEzMSwxLDEzMCwxLDExMCw4LDExNiwKKyAgICAxMCwxMjQsNiwxMzEsMSwxMjUsNywxMjQsMywxMTQsMjIwLDExNiwxLDEwNiwyLDEyNCwKKyAgICAzLDI1LDAsMTI1LDQsMTE2LDExLDEyNCw0LDEyNCwwLDEwNiwwLDEwMCwxLDEzMSwKKyAgICAxLDEwMCw1LDI1LDAsMTI0LDcsMTMxLDMsMSwwLDEyNCw3LDgzLDAsNDEsCisgICAgNiw3OCwxMTQsMTIxLDAsMCwwLDExNCwzMywwLDAsMCwxMjIsMjMsNTksMzIsCisgICAgMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwxMTIsOTcsCisgICAgOTksMTA3LDk3LDEwMywxMDEsMTE0LDE1LDAsMCwwLDExNCwxNDEsMCwwLDAsNDEsCisgICAgMTIsMTE0LDEyMiwwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLDAsMCwwLAorICAgIDExNCw2NSwwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCw5NiwwLDAsMCwyMTgsCisgICAgOCw5NSw2OSw4Miw4Miw5NSw3Nyw4Myw3MSwxMTQsNTAsMCwwLDAsMTE0LDc3LAorICAgIDAsMCwwLDExNCwxNzcsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsNSwwLAorICAgIDAsMCw0MSw4LDExNCwxNSwwLDAsMCwyMTgsNywxMDUsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiw5NSwxMTQsMTUzLDAsMCwwLDExNCwxMjMsMCwwLDAsOTAsMTMsMTEyLDk3LAorICAgIDExNCwxMDEsMTEwLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTQ4LDAsMCwwLAorICAgIDExNCw4OCwwLDAsMCwxMTQsODksMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDIzLDk1LDEwMiwxMDUsMTEwLDEwMCwKKyAgICA5NSw5NywxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDk1LDExNywxMTAsMTA4LDExMSw5OSwxMDcsCisgICAgMTAxLDEwMCwxODEsMywwLDAsMTE1LDQyLDAsMCwwLDAsMSw0LDEsMTQsCisgICAgMSw0LDEsMTAsMSwxMCwyLDEwLDEsMTAsMSwxMCwxLDIsMSwxMCwKKyAgICAxLDE0LDEsMTYsMSwyMiwxLDEwLDEsOCwxLDIyLDIsOCwxLDQsCisgICAgMiwxMCwxLDIyLDEsMTE0LDE4NSwwLDAsMCw5OSwyLDAsMCwwLDAsCisgICAgMCwwLDAsMiwwLDAsMCwxMCwwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgMzAsMCwwLDAsMTE2LDAsMTI0LDAsMTMxLDEsMTQzLDEyLDEsMCwxMTYsMSwKKyAgICAxMjQsMCwxMjQsMSwxMzEsMiw4MywwLDgxLDAsODIsMCw4OCwwLDEwMCwxLAorICAgIDgzLDAsNDEsMiwxMjIsNTQsNzAsMTA1LDExMCwxMDAsMzIsOTcsMTEwLDEwMCwzMiwxMDgsCisgICAgMTExLDk3LDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwKKyAgICA5NywxMTAsMTAwLDMyLDExNCwxMDEsMTA4LDEwMSw5NywxMTUsMTAxLDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDEwOCwxMTEsOTksMTA3LDQ2LDc4LDQxLDIsMTE0LAorICAgIDU0LDAsMCwwLDExNCwxODUsMCwwLDAsNDEsMiwxMTQsMTUsMCwwLDAsCisgICAgMTE0LDE4NCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKKyAgICAxMSwwLDAsMCwyMTgsMTQsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDk3LDExMCwxMDAsOTUsCisgICAgMTA4LDExMSw5NywxMDAsMjA4LDMsMCwwLDExNSw0LDAsMCwwLDAsMiwxMCwKKyAgICAxLDExNCwxODYsMCwwLDAsMTE0LDMzLDAsMCwwLDk5LDMsMCwwLDAsCisgICAgMCwwLDAsMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDEyMiwwLDAsMCwxMTYsMCwxMjQsMCwxMjQsMSwxMjQsMiwxMzEsMywxLAorICAgIDAsMTI0LDIsMTAwLDEsMTA3LDQsMTE0LDMyLDExNiwxLDEyNCwwLDEyNCwxLDEyNCwKKyAgICAyLDEzMSwzLDEyNSwwLDExNiwyLDEwNiwzLDEzMSwwLDEsMCwxMjQsMCwxMTYsCisgICAgNCwxMDYsNSwxMDcsNywxMTQsNjAsMTE2LDYsMTI0LDAsMTE2LDcsMTMxLDIsODMsCisgICAgMCwxMTYsNCwxMDYsNSwxMjQsMCwyNSwwLDEyNSwzLDEyNCwzLDEwMCwyLDEwNywKKyAgICA4LDExNCwxMTAsMTE2LDIsMTA2LDgsMTMxLDAsMSwwLDEwMCwzLDEwNiw5LDEyNCwKKyAgICAwLDEzMSwxLDEyNSw0LDExNiwxMCwxMjQsNCwxMDAsNCwxMjQsMCwxNDQsMSwxMzEsCisgICAgMSwxMzAsMSwxMTYsMTEsMTI0LDAsMTMxLDEsMSwwLDEyNCwzLDgzLDAsNDEsCisgICAgNSw5Nyw1MCwxLDAsMCw3MywxMDksMTEyLDExMSwxMTQsMTE2LDMyLDk3LDExMCwxMDAsCisgICAgMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMDUsMTE2LDExNSwzMiwKKyAgICAxMTAsOTcsMTA5LDEwMSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywKKyAgICAxMDEsMzIsMTE2LDEwNCwxMDEsMzIsOTksOTcsMTA4LDEwOCwzMiwxMDUsMTE1LDEwLDMyLDMyLAorICAgIDMyLDMyLDk4LDEwMSwxMDUsMTEwLDEwMywzMiwxMDksOTcsMTAwLDEwMSwzMiwxMDIsMTE0LDExMSwKKyAgICAxMDksNDQsMzIsOTcsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTAxLDExOCwxMDEsMTA4LAorICAgIDMyLDk3LDEwMCwxMDYsMTE3LDExNSwxMTYsMTA5LDEwMSwxMTAsMTE2LDQ2LDEwLDEwLDMyLDMyLAorICAgIDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwKKyAgICAxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTAzLAorICAgIDExNCwxMDEsOTcsMTE2LDEwMSwxMTUsMTE2LDMyLDk5LDExMSwxMDksMTA5LDExMSwxMTAsMzIsMTAwLAorICAgIDEwMSwxMTAsMTExLDEwOSwxMDUsMTEwLDk3LDExNiwxMTEsMTE0LDMyLDExMSwxMDIsMzIsMTAyLDExNywKKyAgICAxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwxMDUsMTE2LDEyMSwxMCwzMiwzMiwzMiwzMiwKKyAgICA5OCwxMDEsMTE2LDExOSwxMDEsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw5NSwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5NywxMTAsMTAwLDMyLDk1LDk1LDEwNSwxMDksMTEyLDExMSwKKyAgICAxMTQsMTE2LDk1LDk1LDQ2LDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwNSwxMTAsOTksMTA4LDExNywKKyAgICAxMDAsMTAxLDExNSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsOTUsOTUsMTEyLDk3LAorICAgIDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDEwNSwxMDIsMTAsMzIsMzIsMzIsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDAsMTA1LDEwMCwzMiwxMTAsMTExLAorICAgIDExNiw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsMzMsMCwwLDAsNzgsMTIyLDQwLAorICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDMyLDExMSwxMDIsMzIsMTIzLDEyNSwzMiwxMDQsOTcsMTA4LAorICAgIDExNiwxMDEsMTAwLDU5LDMyLDc4LDExMSwxMTAsMTAxLDMyLDEwNSwxMTAsMzIsMTE1LDEyMSwxMTUsCisgICAgNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDExNCwxNSwwLDAsMCw0MSwxMiwxMTQsCisgICAgMTgyLDAsMCwwLDExNCwxNzIsMCwwLDAsMTE0LDU3LDAsMCwwLDExNCwxNDYsCisgICAgMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwwLDAsMCwxMTQsMTg2LDAsCisgICAgMCwwLDIxOCwxMSw5NSwxMDMsOTksMTAwLDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDExNCwKKyAgICA1OCwwLDAsMCwxMTQsNTAsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCw2MywKKyAgICAwLDAsMCw0MSw1LDExNCwxNSwwLDAsMCwxMTQsMTcwLDAsMCwwLDExNCwKKyAgICAxNzEsMCwwLDAsMTE0LDg5LDAsMCwwLDExNCw3NCwwLDAsMCwxMTQsMTAsCisgICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsMCwxMTQsMTg3LDAsCisgICAgMCwwLDIxNCwzLDAsMCwxMTUsMjgsMCwwLDAsMCw5LDEyLDEsOCwKKyAgICAxLDEyLDEsOCwxLDEwLDEsMTAsMSwxMCwxLDgsMSw4LDEsNCwKKyAgICAxLDYsMSwxNCwxLDgsMSwxMTQsMTg3LDAsMCwwLDk5LDMsMCwwLAorICAgIDAsMCwwLDAsMCw2LDAsMCwwLDE3LDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwxNzgsMCwwLDAsMTE2LDAsMTI0LDAsMTAwLDEsMTMxLDIsMTE0LDE3NCwKKyAgICAxMDAsMiwxMjQsMSwxMDcsNiwxMTQsNTgsMTE2LDEsMTI0LDEsMTMxLDEsMTI1LDEsCisgICAgMTI0LDEsMTA2LDIsMTAwLDIsMTMxLDEsMSwwLDExNiwwLDEyNCwwLDEwMCwzLAorICAgIDEzMSwyLDExNCw1OCwxMjQsMSwxMDYsMywxMjQsMCwxMDYsNCwxMzEsMSwxLDAsCisgICAgMTIwLDExNCwxMjQsMSw2OCwwLDkzLDEwNiwxMjUsMywxMTYsMCwxMjQsMCwxMjQsMywKKyAgICAxMzEsMiwxMTUsNjQsMTAwLDQsMTA2LDUsMTI0LDAsMTA2LDYsMTI0LDMsMTMxLDIsCisgICAgMTI1LDQsMTIxLDE0LDExNiw3LDEyNCwyLDEyNCw0LDEzMSwyLDEsMCw4NywwLAorICAgIDExMyw2NCw0LDAsMTE2LDgsMTA3LDEwLDExNCwxNjgsMSwwLDEyNSw1LDEsMCwKKyAgICAxMjIsMzQsMTE2LDksMTI0LDUsMTMxLDEsMTA2LDEwLDExNiwxMSwxMzEsMSwxMTQsMTUwLAorICAgIDEyNCw1LDEwNiwxMiwxMjQsNCwxMDcsMiwxMTQsMTUwLDExOSw2NCwxMzAsMCw4NywwLAorICAgIDg5LDAsMTAwLDUsMTAwLDUsMTI1LDUsMTI2LDUsODgsMCwxMTMsNjQsODgsMCwKKyAgICAxMTMsNjQsODcsMCwxMjQsMCw4MywwLDQxLDYsMTIyLDIzOCw3MCwxMDUsMTAzLDExNywKKyAgICAxMTQsMTAxLDMyLDExMSwxMTcsMTE2LDMyLDExOSwxMDQsOTcsMTE2LDMyLDk1LDk1LDEwNSwxMDksCisgICAgMTEyLDExMSwxMTQsMTE2LDk1LDk1LDMyLDExNSwxMDQsMTExLDExNywxMDgsMTAwLDMyLDExNCwxMDEsCisgICAgMTE2LDExNywxMTQsMTEwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMTA1LAorICAgIDEwOSwxMTIsMTExLDExNCwxMTYsOTUsMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLDExNiwxMDEsMTE0LAorICAgIDMyLDEwNSwxMTUsMzIsOTcsMzIsOTksOTcsMTA4LDEwOCw5Nyw5OCwxMDgsMTAxLDMyLDExOSwKKyAgICAxMDQsMTA1LDk5LDEwNCwzMiwxMTYsOTcsMTA3LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEwLAorICAgIDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTYsMTExLAorICAgIDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDMyLDczLDExNiwzMiwKKyAgICAxMDUsMTE1LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMDAsCisgICAgMTAxLDk5LDExMSwxMTcsMTEyLDEwOCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDExNywxMTAsOTksCisgICAgMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiw5NywxMTUsMTE1LDExNywxMDksMTA1LAorICAgIDExMCwxMDMsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzOSwxMTUsMTAsMzIsCisgICAgMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCisgICAgMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTUsMTA1LAorICAgIDExNCwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDExNCwxMzEsMCwwLDAsMjUwLAorICAgIDEsNDIsMjE4LDcsOTUsOTUsOTcsMTA4LDEwOCw5NSw5NSwxMjIsNSwxMjMsMTI1LDQ2LAorICAgIDEyMywxMjUsNzgsNDEsMTMsMTE0LDQsMCwwLDAsMTE0LDEzMCwwLDAsMCwyMTgsCisgICAgNiwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwyMTgsNiwxMDEsMTIwLDExNiwxMDEsMTEwLDEwMCwxMTQsCisgICAgMTg5LDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsMSwwLDAsMCwxMTQsNjUsCisgICAgMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNzksMCwwLDAsMTE0LDcxLDAsCisgICAgMCwwLDIxOCwxNSw5NSw2OSw4Miw4Miw5NSw3Nyw4Myw3MSw5NSw4MCw4Miw2OSwKKyAgICA3MCw3Myw4OCwxMTQsMTUsMCwwLDAsNDEsNiwxMTQsODksMCwwLDAsMjE4LAorICAgIDgsMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwxMTQsMTg0LDAsMCwwLDIxOCwxLAorICAgIDEyMCw5MCw5LDEwMiwxMTQsMTExLDEwOSw5NSwxMTAsOTcsMTA5LDEwMSw5MCwzLDEwMSwxMjAsCisgICAgOTksMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsCisgICAgMjE4LDE2LDk1LDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsCisgICAgMTE1LDExNiwyMzgsMywwLDAsMTE1LDM0LDAsMCwwLDAsMTAsMTAsMSw4LAorICAgIDEsOCwxLDEwLDEsMTAsMSwxMiwxLDEwLDEsMTAsMSwxNCwxLDIsCisgICAgMSwxNCwxLDE2LDQsMTQsMSwxMCwxLDIsMSwyNCwxLDExNCwxOTUsMCwKKyAgICAwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywKKyAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTYwLDAsMCwwLDEyNCwwLDEwNiwwLAorICAgIDEwMCwxLDEzMSwxLDEyNSwxLDEyNCwwLDEwNiwwLDEwMCwyLDEzMSwxLDEyNSwyLAorICAgIDEyNCwxLDEwMCwzLDEwNyw5LDExNCw5MiwxMjQsMiwxMDAsMywxMDcsOSwxMTQsODYsCisgICAgMTI0LDEsMTI0LDIsMTA2LDEsMTA3LDMsMTE0LDg2LDExNiwyLDEwNiwzLDEwMCw0LAorICAgIDEwNiw0LDEwMCw1LDEyNCwxLDE1NSwyLDEwMCw2LDEyNCwyLDEwNiwxLDE1NSwyLAorICAgIDEwMCw3LDEwMyw1LDEzMSwxLDExNiw1LDEwMCw4LDEwMCw5LDE0NCwxLDEzMSwyLAorICAgIDEsMCwxMjQsMSw4MywwLDExMCw2NCwxMjQsMiwxMDAsMywxMDcsOSwxMTQsMTA4LAorICAgIDEyNCwyLDEwNiwxLDgzLDAsMTEwLDQ4LDExNiwyLDEwNiwzLDEwMCwxMCwxMTYsNSwKKyAgICAxMDAsOCwxMDAsOSwxNDQsMSwxMzEsMiwxLDAsMTI0LDAsMTAwLDExLDI1LDAsCisgICAgMTI1LDEsMTAwLDEyLDEyNCwwLDEwNyw3LDExNCwxNTYsMTI0LDEsMTA2LDYsMTAwLDEzLAorICAgIDEzMSwxLDEwMCwxNCwyNSwwLDEyNSwxLDEyNCwxLDgzLDAsNDEsMTUsMTIyLDE2NywKKyAgICA2Nyw5NywxMDgsOTksMTE3LDEwOCw5NywxMTYsMTAxLDMyLDExOSwxMDQsOTcsMTE2LDMyLDk1LAorICAgIDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSw5NSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LAorICAgIDEwMCwzMiw5OCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTUsOTUsMTEyLDk3LDk5LAorICAgIDEwNyw5NywxMDMsMTAxLDk1LDk1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTAzLDExNywKKyAgICA5NywxMTQsOTcsMTEwLDExNiwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsCisgICAgMTAxLDEwMiwxMDUsMTEwLDEwMSwxMDAsMzIsMTExLDExNCwzMiw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsCisgICAgOTgsMTAxLDMyLDExNSwxMDEsMTE2LDMyLDExNiwxMTEsMzIsNzgsMTExLDExMCwxMDEsMTAsMzIsCisgICAgMzIsMzIsMzIsMTE2LDExMSwzMiwxMTQsMTAxLDExMiwxMTQsMTAxLDExNSwxMDEsMTEwLDExNiwzMiwKKyAgICAxMTYsMTA0LDk3LDExNiwzMiwxMDUsMTE2LDExNSwzMiwxMTIsMTE0LDExMSwxMTIsMTAxLDExNCwzMiwKKyAgICAxMTgsOTcsMTA4LDExNywxMDEsMzIsMTA1LDExNSwzMiwxMTcsMTEwLDEwNywxMTAsMTExLDExOSwxMTAsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsMTE0LDEzNCwwLDAsMCwxMTQsOTUsMCwwLAorICAgIDAsNzgsMjE4LDAsMTIyLDMyLDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5NSwKKyAgICA5NSwzMiwzMyw2MSwzMiw5NSw5NSwxMTUsMTEyLDEwMSw5OSw5NSw5NSw0NiwxMTIsOTcsCisgICAgMTE0LDEwMSwxMTAsMTE2LDMyLDQwLDEyMiw0LDMyLDMzLDYxLDMyLDI1MCwxLDQxLDExNCwKKyAgICAxNDAsMCwwLDAsMjMzLDMsMCwwLDAsMTIyLDg5LDk5LDk3LDExMCwzOSwxMTYsCisgICAgMzIsMTE0LDEwMSwxMTUsMTExLDEwOCwxMTgsMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwKKyAgICAzMiwxMDIsMTE0LDExMSwxMDksMzIsOTUsOTUsMTE1LDExMiwxMDEsOTksOTUsOTUsMzIsMTExLAorICAgIDExNCwzMiw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsNDQsMzIsMTAyLAorICAgIDk3LDEwOCwxMDgsMTA1LDExMCwxMDMsMzIsOTgsOTcsOTksMTA3LDMyLDExMSwxMTAsMzIsOTUsCisgICAgOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsMzIsOTcsMTEwLDEwMCwzMiw5NSw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSw5NSwxMTQsMSwwLDAsMCwxMTQsMTMxLDAsMCwwLDExNCwxMjEsCisgICAgMCwwLDAsMTE0LDMzLDAsMCwwLDQxLDcsMTE0LDQyLDAsMCwwLDExNCwKKyAgICAxMjMsMCwwLDAsMTE0LDE0MiwwLDAsMCwxMTQsMTQzLDAsMCwwLDExNCwxMTUsCisgICAgMCwwLDAsMTE0LDE3NiwwLDAsMCwxMTQsMTIyLDAsMCwwLDQxLDMsMjE4LAorICAgIDcsMTAzLDEwOCwxMTEsOTgsOTcsMTA4LDExNSwxMTQsMTcwLDAsMCwwLDExNCw4OCwwLAogICAgIDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMSwwLDAsCi0gICAgMCwyMTgsMTQsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDk3LDExMCwxMDAsOTUsMTA4LDExMSw5NywKLSAgICAxMDAsMTk4LDMsMCwwLDExNSw0LDAsMCwwLDAsMiwxMywxLDExNCwxODUsCi0gICAgMCwwLDAsMTE0LDMzLDAsMCwwLDk5LDMsMCwwLDAsMCwwLDAsCi0gICAgMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDE2NiwwLAotICAgIDAsMCwxMTYsMCwwLDEyNCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwzLAotICAgIDAsMSwxMjQsMiwwLDEwMCwxLDAsMTA3LDQsMCwxMTQsNDYsMCwxMTYsMSwKLSAgICAwLDEyNCwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwzLDAsMTI1LDAsMCwKLSAgICAxMTYsMiwwLDEwNiwzLDAsMTMxLDAsMCwxLDEyNCwwLDAsMTE2LDQsMCwKLSAgICAxMDYsNSwwLDEwNyw3LDAsMTE0LDg0LDAsMTE2LDYsMCwxMjQsMCwwLDExNiwKLSAgICA3LDAsMTMxLDIsMCw4MywxMTYsNCwwLDEwNiw1LDAsMTI0LDAsMCwyNSwKLSAgICAxMjUsMywwLDEyNCwzLDAsMTAwLDIsMCwxMDcsOCwwLDExNCwxNTIsMCwxMTYsCi0gICAgMiwwLDEwNiw4LDAsMTMxLDAsMCwxLDEwMCwzLDAsMTA2LDksMCwxMjQsCi0gICAgMCwwLDEzMSwxLDAsMTI1LDQsMCwxMTYsMTAsMCwxMjQsNCwwLDEwMCw0LAotICAgIDAsMTI0LDAsMCwxMzEsMSwxLDEzMCwxLDAsMTE2LDExLDAsMTI0LDAsMCwKLSAgICAxMzEsMSwwLDEsMTI0LDMsMCw4Myw0MSw1LDk3LDUwLDEsMCwwLDczLAotICAgIDEwOSwxMTIsMTExLDExNCwxMTYsMzIsOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCw5NywxMTUsMTAxLAotICAgIDEwMCwzMiwxMTEsMTEwLDMyLDEwNSwxMTYsMTE1LDMyLDExMCw5NywxMDksMTAxLDQ0LDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiwxMTYsMTA0LDEwMSwzMiw5OSwKLSAgICA5NywxMDgsMTA4LDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLAotICAgIDMyLDEwOSw5NywxMDAsMTAxLDMyLDEwMiwxMTQsMTExLDEwOSw0NCwzMiw5NywxMTAsMTAwLDMyLAotICAgIDExNiwxMDQsMTAxLDMyLDEwOCwxMDEsMTE4LDEwMSwxMDgsMzIsOTcsMTAwLDEwNiwxMTcsMTE1LDExNiwKLSAgICAxMDksMTAxLDExMCwxMTYsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsCi0gICAgMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwKLSAgICAxMTAsMTE2LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDMsMTE0LDEwMSw5NywxMTYsMTAxLDExNSwxMTYsCi0gICAgMzIsOTksMTExLDEwOSwxMDksMTExLDExMCwzMiwxMDAsMTAxLDExMCwxMTEsMTA5LDEwNSwxMTAsOTcsCi0gICAgMTE2LDExMSwxMTQsMzIsMTExLDEwMiwzMiwxMDIsMTE3LDExMCw5OSwxMTYsMTA1LDExMSwxMTAsOTcsCi0gICAgMTA4LDEwNSwxMTYsMTIxLDEwLDMyLDMyLDMyLDMyLDk4LDEwMSwxMTYsMTE5LDEwMSwxMDEsMTEwLAotICAgIDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk3LAotICAgIDExMCwxMDAsMzIsOTUsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsOTUsNDYsMzIsODQsCi0gICAgMTA0LDEwNSwxMTUsMzIsMTA1LDExMCw5OSwxMDgsMTE3LDEwMCwxMDEsMTE1LDMyLDExNSwxMDEsMTE2LAotICAgIDExNiwxMDUsMTEwLDEwMywzMiw5NSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsCi0gICAgMzIsMTA1LDEwMiwxMCwzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwKLSAgICAxMDEsMTE0LDMyLDEwMCwxMDUsMTAwLDMyLDExMCwxMTEsMTE2LDQ2LDEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDExNCwzMywwLDAsMCw3OCwxMjIsNDAsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTExLDEwMiwzMiwxMjMsMTI1LDMyLDEwNCw5NywxMDgsMTE2LDEwMSwxMDAsNTksMzIsNzgsMTExLAotICAgIDExMCwxMDEsMzIsMTA1LDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTUsMTE0LDE1LDAsMCwwLDQxLDEyLDExNCwxODEsMCwwLDAsMTE0LDE3MSwwLAotICAgIDAsMCwxMTQsNTcsMCwwLDAsMTE0LDE0NSwwLDAsMCwxMTQsMTQsMCwwLAotICAgIDAsMTE0LDIxLDAsMCwwLDExNCwxODUsMCwwLDAsMjE4LDExLDk1LDEwMyw5OSwKLSAgICAxMDAsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTE0LDU4LDAsMCwwLDExNCw1MCwwLAotICAgIDAsMCwxMTQsNzcsMCwwLDAsMTE0LDYzLDAsMCwwLDQxLDUsMTE0LDE1LAotICAgIDAsMCwwLDExNCwxNjksMCwwLDAsMTE0LDE3MCwwLDAsMCwxMTQsODksMCwKLSAgICAwLDAsMTE0LDc0LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAotICAgIDAsMTE0LDExLDAsMCwwLDExNCwxODYsMCwwLDAsMjA0LDMsMCwwLDExNSwKLSAgICAyOCwwLDAsMCwwLDksMTYsMSwxMiwxLDE4LDEsMTAsMSwxNSwxLAotICAgIDEzLDEsMTMsMSwxMiwxLDEwLDEsNiwxLDksMSwxOCwxLDEwLDEsCi0gICAgMTE0LDE4NiwwLDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNiwwLAotICAgIDAsMCwxNywwLDAsMCw2NywwLDAsMCwxMTUsMjM5LDAsMCwwLDExNiwKLSAgICAwLDAsMTI0LDAsMCwxMDAsMSwwLDEzMSwyLDAsMTE0LDIzNSwwLDEwMCwyLAotICAgIDAsMTI0LDEsMCwxMDcsNiwwLDExNCw4MywwLDExNiwxLDAsMTI0LDEsMCwKLSAgICAxMzEsMSwwLDEyNSwxLDAsMTI0LDEsMCwxMDYsMiwwLDEwMCwyLDAsMTMxLAotICAgIDEsMCwxLDExNiwwLDAsMTI0LDAsMCwxMDAsMywwLDEzMSwyLDAsMTE0LAotICAgIDgzLDAsMTI0LDEsMCwxMDYsMywwLDEyNCwwLDAsMTA2LDQsMCwxMzEsMSwKLSAgICAwLDEsMTIwLDE0OSwwLDEyNCwxLDAsNjgsOTMsMTQxLDAsMTI1LDMsMCwxMTYsCi0gICAgMCwwLDEyNCwwLDAsMTI0LDMsMCwxMzEsMiwwLDExNSw5MCwwLDEwMCw0LAotICAgIDAsMTA2LDUsMCwxMjQsMCwwLDEwNiw2LDAsMTI0LDMsMCwxMzEsMiwwLAotICAgIDEyNSw0LDAsMTIxLDE3LDAsMTE2LDcsMCwxMjQsMiwwLDEyNCw0LDAsMTMxLAotICAgIDIsMCwxLDg3LDExMyw5MCwwLDQsMTE2LDgsMCwxMDcsMTAsMCwxMTQsMjMwLAotICAgIDAsMSwxMjUsNSwwLDEsMTIyLDQ3LDAsMTE2LDksMCwxMjQsNSwwLDEzMSwKLSAgICAxLDAsMTA2LDEwLDAsMTE2LDExLDAsMTMxLDEsMCwxMTQsMjA5LDAsMTI0LDUsCi0gICAgMCwxMDYsMTIsMCwxMjQsNCwwLDEwNywyLDAsMTE0LDIwOSwwLDExOSw5MCwwLAotICAgIDEzMCwwLDAsODcsODksMTAwLDUsMCwxMDAsNSwwLDEyNSw1LDAsMTI2LDUsCi0gICAgMCw4OCwxMTMsOTAsMCw4OCwxMTMsOTAsMCw4NywxMjQsMCwwLDgzLDQxLDYsCi0gICAgMTIyLDIzOCw3MCwxMDUsMTAzLDExNywxMTQsMTAxLDMyLDExMSwxMTcsMTE2LDMyLDExOSwxMDQsOTcsCi0gICAgMTE2LDMyLDk1LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDk1LDk1LDMyLDExNSwxMDQsMTExLAotICAgIDExNywxMDgsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDQ2LDEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDg0LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsOTUsMzIsMTEyLDk3LDExNCwKLSAgICA5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsOTcsMzIsOTksOTcsMTA4LDEwOCwKLSAgICA5Nyw5OCwxMDgsMTAxLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTYsOTcsMTA3LDEwMSwxMTUsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwxMDksMTExLDEwMCwKLSAgICAxMTcsMTA4LDEwMSwzMiwxMTYsMTExLDEwLDMyLDMyLDMyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDQ2LDMyLDczLDExNiwzMiwxMDUsMTE1LDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwKLSAgICAxMDAsMzIsMTE2LDExMSwzMiwxMDAsMTAxLDk5LDExMSwxMTcsMTEyLDEwOCwxMDEsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTAyLDExNywxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKLSAgICA5NywxMTUsMTE1LDExNywxMDksMTA1LDExMCwxMDMsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LAotICAgIDEwNSw5OCwzOSwxMTUsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsCi0gICAgMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDEwNSwKLSAgICAxMTUsMzIsMTAwLDEwMSwxMTUsMTA1LDExNCwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAotICAgIDExNCwxMzEsMCwwLDAsMjUwLDEsNDIsMjE4LDcsOTUsOTUsOTcsMTA4LDEwOCw5NSwKLSAgICA5NSwxMjIsNSwxMjMsMTI1LDQ2LDEyMywxMjUsNzgsNDEsMTMsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDEzMCwwLDAsMCwyMTgsNiwxMTQsMTAxLDEwOSwxMTEsMTE4LDEwMSwyMTgsNiwxMDEsCi0gICAgMTIwLDExNiwxMDEsMTEwLDEwMCwxMTQsMTg4LDAsMCwwLDExNCw1MCwwLDAsMCwxMTQsCi0gICAgMSwwLDAsMCwxMTQsNjUsMCwwLDAsMTE0LDc3LDAsMCwwLDExNCwxNzgsCi0gICAgMCwwLDAsMTE0LDcxLDAsMCwwLDIxOCwxNSw5NSw2OSw4Miw4Miw5NSw3NywKLSAgICA4Myw3MSw5NSw4MCw4Miw2OSw3MCw3Myw4OCwxMTQsMTUsMCwwLDAsNDEsNiwKLSAgICAxMTQsODksMCwwLDAsMjE4LDgsMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwxMTQsCi0gICAgMTgzLDAsMCwwLDIxOCwxLDEyMCw5MCw5LDEwMiwxMTQsMTExLDEwOSw5NSwxMTAsOTcsCi0gICAgMTA5LDEwMSw5MCwzLDEwMSwxMjAsOTksMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsCi0gICAgMCwxMTQsMTEsMCwwLDAsMjE4LDE2LDk1LDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsOTUsCi0gICAgMTAyLDExNCwxMTEsMTA5LDEwOCwxMDUsMTE1LDExNiwyMjgsMywwLDAsMTE1LDM0LDAsMCwKLSAgICAwLDAsMTAsMTUsMSwxMiwxLDEyLDEsMTMsMSwxNSwxLDE2LDEsMTMsCi0gICAgMSwxNSwxLDIxLDEsMywxLDE3LDEsMTgsNCwyMSwxLDE1LDEsMywKLSAgICAxLDI2LDEsMTE0LDE5NCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSw3MiwwLAotICAgIDAsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLDEsMCwxMzEsMSwwLDEyNSwxLAotICAgIDAsMTI0LDEsMCwxMDAsMiwwLDEwNyw4LDAsMTE0LDY4LDAsMTI0LDAsMCwKLSAgICAxMDAsMywwLDI1LDEyNSwxLDAsMTAwLDQsMCwxMjQsMCwwLDEwNyw3LDAsCi0gICAgMTE0LDY4LDAsMTI0LDEsMCwxMDYsMSwwLDEwMCw1LDAsMTMxLDEsMCwxMDAsCi0gICAgNiwwLDI1LDEyNSwxLDAsMTI0LDEsMCw4Myw0MSw3LDEyMiwxNjcsNjcsOTcsCi0gICAgMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwzMiwxMTksMTA0LDk3LDExNiwzMiw5NSw5NSwxMTIsCi0gICAgOTcsOTksMTA3LDk3LDEwMywxMDEsOTUsOTUsMzIsMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsCi0gICAgOTgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDk1LDk1LDExMiw5Nyw5OSwxMDcsOTcsCi0gICAgMTAzLDEwMSw5NSw5NSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDEwMywxMTcsOTcsMTE0LAotICAgIDk3LDExMCwxMTYsMTAxLDEwMSwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTAwLDEwMSwxMDIsCi0gICAgMTA1LDExMCwxMDEsMTAwLDMyLDExMSwxMTQsMzIsOTksMTExLDExNywxMDgsMTAwLDMyLDk4LDEwMSwKLSAgICAzMiwxMTUsMTAxLDExNiwzMiwxMTYsMTExLDMyLDc4LDExMSwxMTAsMTAxLDEwLDMyLDMyLDMyLAotICAgIDMyLDExNiwxMTEsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwxMTYsMzIsMTE2LDEwNCwKLSAgICA5NywxMTYsMzIsMTA1LDExNiwxMTUsMzIsMTEyLDExNCwxMTEsMTEyLDEwMSwxMTQsMzIsMTE4LDk3LAotICAgIDEwOCwxMTcsMTAxLDMyLDEwNSwxMTUsMzIsMTE3LDExMCwxMDcsMTEwLDExMSwxMTksMTEwLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDExNCwxMzQsMCwwLDAsNzgsMTE0LDEsMCwwLDAsCi0gICAgMTE0LDEzMSwwLDAsMCwxMTQsMTIxLDAsMCwwLDExNCwzMywwLDAsMCw0MSwKLSAgICAyLDExNCw0MiwwLDAsMCwxMTQsMTIyLDAsMCwwLDQxLDIsMjE4LDcsMTAzLAotICAgIDEwOCwxMTEsOTgsOTcsMTA4LDExNSwxMTQsMTY5LDAsMCwwLDExNCwxMCwwLDAsMCwKLSAgICAxMTQsMTAsMCwwLDAsMTE0LDExLDAsMCwwLDIxOCwxNyw5NSw5OSw5NywxMDgsCi0gICAgOTksOTUsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk1LDk1LDQsNCwwLAotICAgIDAsMTE1LDEyLDAsMCwwLDAsNywxNSwxLDEyLDEsMTAsMSwxMiwxLAotICAgIDE5LDEsMTE0LDE5NiwwLDAsMCw5OSw1LDAsMCwwLDAsMCwwLDAsCi0gICAgOSwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwyMjcsMCwwLAotICAgIDAsMTI0LDQsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDI3LDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEzMSwxLDAsMTI1LDUsMCwxMTAsNTQsMCwxMjQsMSwwLDEwMCwKLSAgICAyLDAsMTA3LDksMCwxMTQsNDUsMCwxMjQsMSwwLDExMCwzLDAsMTA1LDAsCi0gICAgMCwxMjUsNiwwLDExNiwxLDAsMTI0LDYsMCwxMzEsMSwwLDEyNSw3LDAsCi0gICAgMTE2LDAsMCwxMjQsMCwwLDEyNCw3LDAsMTI0LDQsMCwxMzEsMywwLDEyNSwKLSAgICA1LDAsMTI0LDMsMCwxMTUsMjA3LDAsMTI0LDQsMCwxMDAsMSwwLDEwNywyLAotICAgIDAsMTE0LDEyMiwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMiwwLDEwMCwzLDAsCi0gICAgMTMxLDEsMCwxMDAsMSwwLDI1LDEzMSwxLDAsODMsMTI0LDAsMCwxMTUsMTMyLAotICAgIDAsMTI0LDUsMCw4MywxMTYsMywwLDEyNCwwLDAsMTMxLDEsMCwxMTYsMywKLSAgICAwLDEyNCwwLDAsMTA2LDIsMCwxMDAsMywwLDEzMSwxLDAsMTAwLDEsMCwKLSAgICAyNSwxMzEsMSwwLDI0LDEyNSw4LDAsMTE2LDQsMCwxMDYsNSwwLDEyNCw1LAotICAgIDAsMTA2LDYsMCwxMDAsMiwwLDExNiwzLDAsMTI0LDUsMCwxMDYsNiwwLAotICAgIDEzMSwxLDAsMTI0LDgsMCwyNCwxMzMsMiwwLDI1LDI1LDgzLDExMCwxNiwwLAotICAgIDExNiw3LDAsMTI0LDUsMCwxMjQsMywwLDExNiwwLDAsMTMxLDMsMCw4MywKLSAgICAxMDAsMiwwLDgzLDQxLDQsOTcsMjE1LDEsMCwwLDczLDEwOSwxMTIsMTExLDExNCwKKyAgICAwLDIxOCwxNyw5NSw5OSw5NywxMDgsOTksOTUsOTUsOTUsMTEyLDk3LDk5LDEwNyw5NywKKyAgICAxMDMsMTAxLDk1LDk1LDE0LDQsMCwwLDExNSwzMCwwLDAsMCwwLDcsMTAsCisgICAgMSwxMCwxLDgsMSwxOCwxLDI4LDIsMTIsMSw2LDEsOCwxLDgsCisgICAgMiw2LDIsMTIsMSw4LDEsOCwxLDE0LDEsMTE0LDIwMCwwLDAsMCwKKyAgICA5OSw1LDAsMCwwLDAsMCwwLDAsOSwwLDAsMCw1LDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxNzAsMCwwLDAsMTI0LDQsMTAwLDEsMTA3LDIsCisgICAgMTE0LDE4LDExNiwwLDEyNCwwLDEzMSwxLDEyNSw1LDExMCwzNiwxMjQsMSwxMDAsMiwKKyAgICAxMDcsOSwxMTQsMzAsMTI0LDEsMTEwLDIsMTA1LDAsMTI1LDYsMTE2LDEsMTI0LDYsCisgICAgMTMxLDEsMTI1LDcsMTE2LDAsMTI0LDAsMTI0LDcsMTI0LDQsMTMxLDMsMTI1LDUsCisgICAgMTI0LDMsMTE1LDE1NCwxMjQsNCwxMDAsMSwxMDcsMiwxMTQsODYsMTE2LDAsMTI0LDAsCisgICAgMTA2LDIsMTAwLDMsMTMxLDEsMTAwLDEsMjUsMCwxMzEsMSw4MywwLDExMywxNjYsCisgICAgMTI0LDAsMTE1LDk2LDEyNCw1LDgzLDAsMTEzLDE2NiwxMTYsMywxMjQsMCwxMzEsMSwKKyAgICAxMTYsMywxMjQsMCwxMDYsMiwxMDAsMywxMzEsMSwxMDAsMSwyNSwwLDEzMSwxLAorICAgIDI0LDAsMTI1LDgsMTE2LDQsMTA2LDUsMTI0LDUsMTA2LDYsMTAwLDIsMTE2LDMsCisgICAgMTI0LDUsMTA2LDYsMTMxLDEsMTI0LDgsMjQsMCwxMzMsMiwyNSwwLDI1LDAsCisgICAgODMsMCwxMTAsMTIsMTE2LDcsMTI0LDUsMTI0LDMsMTE2LDAsMTMxLDMsODMsMCwKKyAgICAxMDAsMiw4MywwLDQxLDQsOTcsMjE1LDEsMCwwLDczLDEwOSwxMTIsMTExLDExNCwKICAgICAxMTYsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsCiAgICAgMzIsODQsMTA0LDEwMSwzMiwzOSwxMDMsMTA4LDExMSw5OCw5NywxMDgsMTE1LDM5LDMyLDk3LAogICAgIDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwKQEAgLTE4NTgsMTMyICsxNzYxLDEyNSBAQAogICAgIDMyLDExOSwxMTEsMTE3LDEwOCwxMDAsMzIsMTA0LDk3LDExOCwxMDEsMzIsOTcsMzIsMzksMTA4LAogICAgIDEwMSwxMTgsMTAxLDEwOCwzOSwzMiwxMTEsMTAyLDMyLDUwLDQxLDQ2LDEwLDEwLDMyLDMyLAogICAgIDMyLDMyLDExNCwzMywwLDAsMCw3OCwxMTQsMTIxLDAsMCwwLDQxLDgsMTE0LAotICAgIDE4NiwwLDAsMCwxMTQsMTk2LDAsMCwwLDIxOCw5LDExMiw5NywxMTQsMTE2LDEwNSwKLSAgICAxMTYsMTA1LDExMSwxMTAsMTE0LDE2NywwLDAsMCwxMTQsMTQsMCwwLDAsMTE0LDIxLAotICAgIDAsMCwwLDExNCwxLDAsMCwwLDExNCwxOTQsMCwwLDAsNDEsOSwxMTQsCi0gICAgMTUsMCwwLDAsMTE0LDE5NSwwLDAsMCwyMTgsNiwxMDgsMTExLDk5LDk3LDEwOCwKLSAgICAxMTUsMTE0LDE5MiwwLDAsMCwxMTQsMTcwLDAsMCwwLDExNCw4OSwwLDAsMCwKLSAgICA5MCw4LDEwMywxMDgsMTExLDk4LDk3LDEwOCwxMTUsOTUsMTE0LDE2OSwwLDAsMCw5MCwKKyAgICAxODcsMCwwLDAsMTE0LDIwMCwwLDAsMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsCisgICAgMTE2LDEwNSwxMTEsMTEwLDExNCwxNjgsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwyMSwKKyAgICAwLDAsMCwxMTQsMSwwLDAsMCwxMTQsMTk1LDAsMCwwLDQxLDksMTE0LAorICAgIDE1LDAsMCwwLDExNCwxOTksMCwwLDAsMjE4LDYsMTA4LDExMSw5OSw5NywxMDgsCisgICAgMTE1LDExNCwxOTMsMCwwLDAsMTE0LDE3MSwwLDAsMCwxMTQsODksMCwwLDAsCisgICAgOTAsOCwxMDMsMTA4LDExMSw5OCw5NywxMDgsMTE1LDk1LDExNCwxNzAsMCwwLDAsOTAsCiAgICAgNyw5OSwxMTcsMTE2LDk1LDExMSwxMDIsMTAyLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwKICAgICAwLDAsMTE0LDExLDAsMCwwLDIxOCwxMCw5NSw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LAotICAgIDExNiw5NSw5NSwxOSw0LDAsMCwxMTUsMjYsMCwwLDAsMCwxMSwxMiwxLAotICAgIDE1LDIsMjQsMSwxMiwxLDE4LDEsNiwzLDEyLDEsMjMsMSw2LDEsCi0gICAgNCw0LDM1LDMsNDAsMiwxMTQsMTk5LDAsMCwwLDk5LDEsMCwwLDAsCisgICAgMTE2LDk1LDk1LDQxLDQsMCwwLDExNSwyNiwwLDAsMCwwLDExLDgsMSwKKyAgICAxMCwyLDE2LDEsOCwxLDEyLDEsNCwzLDgsMSwyMCwxLDQsMSwKKyAgICA2LDQsMjYsMywzMiwyLDExNCwyMDMsMCwwLDAsOTksMSwwLDAsMCwKICAgICAwLDAsMCwwLDIsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsNTMsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwwLDAsMTMxLDEsCi0gICAgMCwxMjUsMSwwLDEyNCwxLDAsMTAwLDAsMCwxMDcsOCwwLDExNCw0MywwLAotICAgIDExNiwyLDAsMTAwLDEsMCwxMjQsMCwwLDIzLDEzMSwxLDAsMTMwLDEsMCwKLSAgICAxMTYsMywwLDEyNCwxLDAsMTMxLDEsMCw4Myw0MSwyLDc4LDEyMiwyNSwxMTAsCi0gICAgMTExLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiw0MSw0LDExNCwxNTAsMCwwLDAsMTE0LAotICAgIDE1NCwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE0OSwwLDAsMCw0MSwyLAotICAgIDExNCwxNSwwLDAsMCwxMTQsODgsMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwKLSAgICAxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE4LDk1LDk4LDExNywxMDUsMTA4LAotICAgIDExNiwxMDUsMTEwLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTAsOTcsMTA5LDEwMSw1NCw0LDAsCi0gICAgMCwxMTUsOCwwLDAsMCwwLDEsMTUsMSwxMiwxLDE2LDEsMTE0LDIwMCwKLSAgICAwLDAsMCw5OSwyLDAsMCwwLDAsMCwwLDAsMTIsMCwwLDAsCi0gICAgMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDc0LDEsMCwwLDEyNCwxLDAsCi0gICAgOTcsMCwwLDEyNCwwLDAsOTcsMSwwLDExNiwyLDAsMTE2LDEsMCwxMzEsCi0gICAgMSwwLDEyNSwyLDAsMTIwLDEyMywwLDExNiwxLDAsMTA2LDMsMCwxMDYsNCwKLSAgICAwLDEzMSwwLDAsNjgsOTMsMTA2LDAsOTIsMiwwLDEyNSwzLDAsMTI1LDQsCi0gICAgMCwxMTYsNSwwLDEyNCw0LDAsMTI0LDIsMCwxMzEsMiwwLDExNCw0MCwwLAotICAgIDEyNCwzLDAsMTE2LDEsMCwxMDYsNiwwLDEwNyw2LDAsMTE0LDkxLDAsMTE2LAotICAgIDcsMCwxMjUsNSwwLDExMCwyNywwLDExNiwwLDAsMTA2LDgsMCwxMjQsMywKLSAgICAwLDEzMSwxLDAsMTE0LDQwLDAsMTE2LDksMCwxMjUsNSwwLDExMCwzLDAsCi0gICAgMTEzLDQwLDAsMTE2LDEwLDAsMTI0LDQsMCwxMjQsNSwwLDEzMSwyLDAsMTI1LAotICAgIDYsMCwxMTYsMTEsMCwxMjQsNiwwLDEyNCw0LDAsMTMxLDIsMCwxLDExMywKLSAgICA0MCwwLDg3LDExNiwxLDAsMTA2LDMsMCwxMTYsMTIsMCwyNSwxMjUsNywwLAotICAgIDEyMCw3MywwLDEwMCw1LDAsNjgsOTMsNjUsMCwxMjUsOCwwLDEyNCw4LDAsCi0gICAgMTE2LDEsMCwxMDYsMywwLDEwNyw3LDAsMTE0LDIwNiwwLDExNiwxMywwLDEyNCwKLSAgICA4LDAsMTMxLDEsMCwxMjUsOSwwLDExMCwxMywwLDExNiwxLDAsMTA2LDMsCi0gICAgMCwxMjQsOCwwLDI1LDEyNSw5LDAsMTE2LDE0LDAsMTI0LDcsMCwxMjQsOCwKLSAgICAwLDEyNCw5LDAsMTMxLDMsMCwxLDExMywxNzAsMCw4NywxMjEsMTYsMCwxMTYsCi0gICAgMTMsMCwxMDAsMiwwLDEzMSwxLDAsMTI1LDEwLDAsODcsMTEwLDI0LDAsNCwKLSAgICAxMTYsMTUsMCwxMDcsMTAsMCwxMTQsMjUsMSwxLDEsMSwxMDAsMywwLDEyNSwKLSAgICAxMCwwLDg5LDExMCwxLDAsODgsMTE2LDE0LDAsMTI0LDcsMCwxMDAsMiwwLAotICAgIDEyNCwxMCwwLDEzMSwzLDAsMSwxMTYsMTMsMCwxMDAsNCwwLDEzMSwxLDAsCi0gICAgMTI1LDExLDAsMTE2LDE0LDAsMTI0LDcsMCwxMDAsNCwwLDEyNCwxMSwwLDEzMSwKLSAgICAzLDAsMSwxMDAsMywwLDgzLDQxLDYsMTIyLDI1MCw4MywxMDEsMTE2LDExNywxMTIsCi0gICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5OCwxMjEsMzIsMTA1LDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsMzIsOTgsCi0gICAgMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLAotICAgIDk3LDExMCwxMDAsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LAotICAgIDEwMSwxMDksMTAsMzIsMzIsMzIsMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwMywxMDgsMTExLDk4LDk3LDEwOCwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKLSAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw2NSwxMTUsMzIsMTE1LDEyMSwxMTUsMzIsMTA1LDExNSwKLSAgICAzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwxMDIsMTExLDExNCwzMiwxMTUsMTIxLDExNSw0NiwKLSAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsOTcsOTksOTksMTAxLDExNSwxMTUsMzIsOTcsCi0gICAgMTEwLDEwMCwzMiw5NSwxMDUsMTA5LDExMiwzMiwxMDUsMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsCi0gICAgMTAwLDMyLDExNiwxMTEsMzIsMTA4LDExMSw5NywxMDAsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LAotICAgIDEwNSwxMTAsMTAsMzIsMzIsMzIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDQ0LDMyLAotICAgIDExNiwxMDQsMTExLDExNSwxMDEsMzIsMTE2LDExOSwxMTEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsMTAxLDEyMCwxMTIsMTA4LDEwNSw5OSwKLSAgICAxMDUsMTE2LDEwOCwxMjEsMzIsMTEyLDk3LDExNSwxMTUsMTAxLDEwMCwzMiwxMDUsMTEwLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDExNCwxNDEsMCwwLDAsMTE0LDM0LDAsMCwwLDc4LAotICAgIDExNCw2MiwwLDAsMCw0MSwxLDEyMiw5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwxMTAsCi0gICAgMTAzLDExNSw0MSwxNiwxMTQsNTcsMCwwLDAsMTE0LDE0LDAsMCwwLDExNCwxMywKLSAgICAwLDAsMCwxMTQsMjEsMCwwLDAsMjE4LDUsMTA1LDExNiwxMDEsMTA5LDExNSwxMTQsCi0gICAgMTc3LDAsMCwwLDExNCw3NiwwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCw4MiwKLSAgICAwLDAsMCwxMTQsMTYwLDAsMCwwLDExNCwxMzIsMCwwLDAsMTE0LDEzNywwLAotICAgIDAsMCwxMTQsMSwwLDAsMCwxMTQsMjAwLDAsMCwwLDExNCw1LDAsMCwKLSAgICAwLDExNCw3NywwLDAsMCw0MSwxMiwyMTgsMTAsMTE1LDEyMSwxMTUsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMjE4LDExLDk1LDEwNSwxMDksMTEyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDkwLDExLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNiwxMjEsMTEyLDEwMSwxMTQsMTUsCi0gICAgMCwwLDAsMTE0LDg5LDAsMCwwLDExNCw5OSwwLDAsMCwxMTQsODgsMCwKLSAgICAwLDAsOTAsMTEsMTE1LDEwMSwxMDgsMTAyLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLAotICAgIDEyLDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDExMCw5NywxMDksMTAxLDkwLDE0LDk4LAotICAgIDExNywxMDUsMTA4LDExNiwxMDUsMTEwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExNiwKLSAgICAxMDQsMTE0LDEwMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTQsMTE5LDEwMSwKLSAgICA5NywxMDcsMTE0LDEwMSwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDEwLDAsMCwKLSAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDYsOTUsMTE1LDEwMSwKLSAgICAxMTYsMTE3LDExMiw2MSw0LDAsMCwxMTUsNTAsMCwwLDAsMCw5LDYsMSwKLSAgICA2LDMsMTIsMSwyOCwxLDE1LDEsMTUsMSw5LDEsMTUsMSw5LDIsCi0gICAgMywxLDE1LDEsMTcsMywxMywxLDEzLDEsMTUsMSwxNSwyLDEzLDEsCi0gICAgMjAsMywzLDEsMTYsMSwxMywyLDExLDEsMTYsMywxMiwxLDExNCwyMDQsCi0gICAgMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsCi0gICAgMywwLDAsMCw2NywwLDAsMCwxMTUsODcsMCwwLDAsMTE2LDAsMCwKLSAgICAxMjQsMCwwLDEyNCwxLDAsMTMxLDIsMCwxLDExNiwxLDAsMTA2LDIsMCwKLSAgICAxMDYsMywwLDExNiw0LDAsMTMxLDEsMCwxLDExNiwxLDAsMTA2LDIsMCwKLSAgICAxMDYsMywwLDExNiw1LDAsMTMxLDEsMCwxLDEwMCwxLDAsMTAwLDIsMCwKLSAgICAxMDgsNiwwLDEyNSwyLDAsMTI0LDIsMCw5Nyw3LDAsMTI0LDIsMCwxMDYsCi0gICAgOCwwLDExNiwxLDAsMTA2LDksMCwxMTYsMTAsMCwyNSwxMzEsMSwwLDEsCi0gICAgMTAwLDIsMCw4Myw0MSwzLDEyMiw1MCw3MywxMTAsMTE1LDExNiw5NywxMDgsMTA4LDMyLAotICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwKLSAgICAxMTEsMTAyLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDQ2LDExNCwzMywwLDAsMCw3OCwKLSAgICA0MSwxMSwxMTQsMjA0LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMTc0LDAsMCwKLSAgICAwLDExNCwxMTMsMCwwLDAsMTE0LDE1MCwwLDAsMCwxMTQsMTYwLDAsMCwwLAotICAgIDIxOCwyNiw5NSwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwKLSAgICAxMDgsMTA1LDk4LDk1LDEwMSwxMjAsMTE2LDEwMSwxMTQsMTEwLDk3LDEwOCwxMTQsMTE5LDAsMCwKLSAgICAwLDIxOCw4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDExNCwyMSwwLDAsMCwKLSAgICAxMTQsMSwwLDAsMCw0MSwzLDExNCwyMDIsMCwwLDAsMTE0LDIwMywwLDAsCi0gICAgMCwxMTQsMjA1LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsCi0gICAgMTE0LDExLDAsMCwwLDExNCwyMDYsMCwwLDAsMTA4LDQsMCwwLDExNSwxMiwKLSAgICAwLDAsMCwwLDIsMTMsMiwxNiwxLDE2LDMsMTIsMSw2LDEsMTE0LAotICAgIDIwNiwwLDAsMCw0MSw1MSwxMTQsMywwLDAsMCwxMTQsMTE5LDAsMCwwLAotICAgIDExNCwxMiwwLDAsMCwxMTQsMTYsMCwwLDAsMTE0LDE3LDAsMCwwLDExNCwKLSAgICA1OSwwLDAsMCwxMTQsNDEsMCwwLDAsMTE0LDQ4LDAsMCwwLDExNCwzMSwKLSAgICAwLDAsMCwxMTQsMzIsMCwwLDAsMTE0LDUzLDAsMCwwLDExNCw1NCwwLAotICAgIDAsMCwxMTQsNTYsMCwwLDAsMTE0LDYzLDAsMCwwLDExNCw2NSwwLDAsCi0gICAgMCwxMTQsNzUsMCwwLDAsMTE0LDgxLDAsMCwwLDExNCw4NCwwLDAsMCwKLSAgICAxMTQsOTAsMCwwLDAsMTE0LDEwMSwwLDAsMCwxMTQsMTAyLDAsMCwwLDExNCwKLSAgICAxMDYsMCwwLDAsMTE0LDg1LDAsMCwwLDIxOCw2LDExMSw5OCwxMDYsMTAxLDk5LAotICAgIDExNiw5MCw5LDk1LDgwLDc5LDgwLDg1LDc2LDY1LDg0LDY5LDExNCwxMzIsMCwwLAotICAgIDAsMTE0LDEzNywwLDAsMCwxMTQsMTQ0LDAsMCwwLDExNCw5NywwLDAsMCwKLSAgICAxMTQsODYsMCwwLDAsMTE0LDE0OCwwLDAsMCwxMTQsMTQ5LDAsMCwwLDExNCwKLSAgICA4NywwLDAsMCwxMTQsMTUwLDAsMCwwLDExNCwxNjAsMCwwLDAsMTE0LDE2NSwKLSAgICAwLDAsMCwxMTQsMTcxLDAsMCwwLDExNCwxNzMsMCwwLDAsMTE0LDE3NiwwLAotICAgIDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxOTEsMCwwLDAsMTE0LDE4MiwwLDAsCi0gICAgMCwxMTQsMTg0LDAsMCwwLDExNCwxODUsMCwwLDAsMTE0LDE4NiwwLDAsMCwKLSAgICAxMTQsMTk0LDAsMCwwLDExNCwxOTYsMCwwLDAsMTE0LDE5OSwwLDAsMCwxMTQsCi0gICAgMjAwLDAsMCwwLDExNCwyMDQsMCwwLDAsMTE0LDIwNiwwLDAsMCwxMTQsMTAsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwKLSAgICAwLDAsMjE4LDgsNjAsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNjIsOCwwLDAsMCwKLSAgICAxMTUsOTYsMCwwLDAsNiwxNyw2LDIsMTIsOCwxMiw0LDE5LDIwLDYsCi0gICAgMiw2LDMsMjIsNCwxOSw2OCwxOSwyMSwxOSwxOSwxMiwxOSwxMiwxOSwxMiwKLSAgICAxMSwxOCw4LDEyLDExLDEyLDEyLDEyLDE2LDEyLDM2LDE5LDI3LDE5LDEwMSwyNCwKLSAgICAyNiw5LDMsMTgsNDUsMTgsNjAsMTIsMTgsMTIsMTcsMTIsMjUsMTIsMjksMTIsCi0gICAgMjMsMTIsMTYsMTksNzMsMTksNzcsMTksMTMsMTIsOSwxMiw5LDE1LDQwLDEyLAotICAgIDE3LDYsMSwxMCwyLDEyLDI3LDEyLDYsMTgsMjQsMTIsMzIsMTIsMTUsMjQsCi0gICAgMzUsMTIsNywxMiw0NywKKyAgICAxMTUsMzgsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDAsMTMxLDEsMTI1LDEsMTI0LAorICAgIDEsMTAwLDAsMTA3LDgsMTE0LDMwLDExNiwyLDEwMCwxLDEyNCwwLDIzLDAsMTMxLAorICAgIDEsMTMwLDEsMTE2LDMsMTI0LDEsMTMxLDEsODMsMCw0MSwyLDc4LDEyMiwyNSwKKyAgICAxMTAsMTExLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDEwMCwzMiw0MSw0LDExNCwxNTEsMCwwLDAsCisgICAgMTE0LDE1NSwwLDAsMCwxMTQsNzcsMCwwLDAsMTE0LDE1MCwwLDAsMCw0MSwKKyAgICAyLDExNCwxNSwwLDAsMCwxMTQsODgsMCwwLDAsMTE0LDEwLDAsMCwwLAorICAgIDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMjE4LDE4LDk1LDk4LDExNywxMDUsCisgICAgMTA4LDExNiwxMDUsMTEwLDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMTAsOTcsMTA5LDEwMSw3Niw0LAorICAgIDAsMCwxMTUsOCwwLDAsMCwwLDEsMTAsMSw4LDEsMTIsMSwxMTQsCisgICAgMjA0LDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsMCwxMiwwLDAsCisgICAgMCwxMiwwLDAsMCw2NywwLDAsMCwxMTUsMjQ0LDAsMCwwLDEyNCwxLAorICAgIDk3LDAsMTI0LDAsOTcsMSwxMTYsMiwxMTYsMSwxMzEsMSwxMjUsMiwxMjAsODYsCisgICAgMTE2LDEsMTA2LDMsMTA2LDQsMTMxLDAsNjgsMCw5Myw3Miw5MiwyLDEyNSwzLAorICAgIDEyNSw0LDExNiw1LDEyNCw0LDEyNCwyLDEzMSwyLDExNCwyOCwxMjQsMywxMTYsMSwKKyAgICAxMDYsNiwxMDcsNiwxMTQsNjIsMTE2LDcsMTI1LDUsMTEwLDE4LDExNiwwLDEwNiw4LAorICAgIDEyNCwzLDEzMSwxLDExNCwyOCwxMTYsOSwxMjUsNSwxMTAsMiwxMTMsMjgsMTE2LDEwLAorICAgIDEyNCw0LDEyNCw1LDEzMSwyLDEyNSw2LDExNiwxMSwxMjQsNiwxMjQsNCwxMzEsMiwKKyAgICAxLDAsMTEzLDI4LDg3LDAsMTE2LDEsMTA2LDMsMTE2LDEyLDI1LDAsMTI1LDcsCisgICAgMTIwLDU0LDEwMCw1LDY4LDAsOTMsNDYsMTI1LDgsMTI0LDgsMTE2LDEsMTA2LDMsCisgICAgMTA3LDcsMTE0LDE0NCwxMTYsMTMsMTI0LDgsMTMxLDEsMTI1LDksMTEwLDEwLDExNiwxLAorICAgIDEwNiwzLDEyNCw4LDI1LDAsMTI1LDksMTE2LDE0LDEyNCw3LDEyNCw4LDEyNCw5LAorICAgIDEzMSwzLDEsMCwxMTMsMTIwLDg3LDAsMTIxLDEyLDExNiwxMywxMDAsMiwxMzEsMSwKKyAgICAxMjUsMTAsODcsMCwxMTAsMjQsNCwwLDExNiwxNSwxMDcsMTAsMTE0LDIwNiwxLDAsCisgICAgMSwwLDEsMCwxMDAsMywxMjUsMTAsODksMCwxMTAsMiw4OCwwLDExNiwxNCwKKyAgICAxMjQsNywxMDAsMiwxMjQsMTAsMTMxLDMsMSwwLDExNiwxMywxMDAsNCwxMzEsMSwKKyAgICAxMjUsMTEsMTE2LDE0LDEyNCw3LDEwMCw0LDEyNCwxMSwxMzEsMywxLDAsMTAwLDMsCisgICAgODMsMCw0MSw2LDEyMiwyNTAsODMsMTAxLDExNiwxMTcsMTEyLDMyLDEwNSwxMDksMTEyLDExMSwKKyAgICAxMTQsMTE2LDEwOCwxMDUsOTgsMzIsOTgsMTIxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwKKyAgICAxMTAsMTAzLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwKKyAgICAxMDUsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDEwNSwKKyAgICAxMTAsMTA2LDEwMSw5OSwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMTA5LDEwLDMyLDMyLAorICAgIDMyLDMyLDEwNSwxMTAsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDMsMTA4LDExMSw5OCw5NywKKyAgICAxMDgsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNDYsMTAsMTAsMzIsMzIsCisgICAgMzIsMzIsNjUsMTE1LDMyLDExNSwxMjEsMTE1LDMyLDEwNSwxMTUsMzIsMTEwLDEwMSwxMDEsMTAwLAorICAgIDEwMSwxMDAsMzIsMTAyLDExMSwxMTQsMzIsMTE1LDEyMSwxMTUsNDYsMTA5LDExMSwxMDAsMTE3LDEwOCwKKyAgICAxMDEsMTE1LDMyLDk3LDk5LDk5LDEwMSwxMTUsMTE1LDMyLDk3LDExMCwxMDAsMzIsOTUsMTA1LAorICAgIDEwOSwxMTIsMzIsMTA1LDExNSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwxMTYsMTExLDMyLAorICAgIDEwOCwxMTEsOTcsMTAwLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLDEwLDMyLDMyLAorICAgIDMyLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDExMSwxMTUsMTAxLAorICAgIDMyLDExNiwxMTksMTExLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDksMTE3LDExNSwKKyAgICAxMTYsMzIsOTgsMTAxLDMyLDEwMSwxMjAsMTEyLDEwOCwxMDUsOTksMTA1LDExNiwxMDgsMTIxLDMyLAorICAgIDExMiw5NywxMTUsMTE1LDEwMSwxMDAsMzIsMTA1LDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICAxMTQsMTQyLDAsMCwwLDExNCwzNCwwLDAsMCw3OCwxMTQsNjIsMCwwLDAsCisgICAgNDEsMSwxMjIsOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsNDEsMTYsMTE0LAorICAgIDU3LDAsMCwwLDExNCwxNCwwLDAsMCwxMTQsMTMsMCwwLDAsMTE0LDIxLAorICAgIDAsMCwwLDIxOCw1LDEwNSwxMTYsMTAxLDEwOSwxMTUsMTE0LDE3OCwwLDAsMCwxMTQsCisgICAgNzYsMCwwLDAsMTE0LDE1MSwwLDAsMCwxMTQsODIsMCwwLDAsMTE0LDE2MSwKKyAgICAwLDAsMCwxMTQsMTMyLDAsMCwwLDExNCwxMzcsMCwwLDAsMTE0LDEsMCwKKyAgICAwLDAsMTE0LDIwNCwwLDAsMCwxMTQsNSwwLDAsMCwxMTQsNzcsMCwwLAorICAgIDAsNDEsMTIsMjE4LDEwLDExNSwxMjEsMTE1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDIxOCwKKyAgICAxMSw5NSwxMDUsMTA5LDExMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw5NSwxMTYsMTIxLDExMiwxMDEsMTE0LDE1LDAsMCwwLDExNCw4OSwKKyAgICAwLDAsMCwxMTQsOTksMCwwLDAsMTE0LDg4LDAsMCwwLDkwLDExLDExNSwKKyAgICAxMDEsMTA4LDEwMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMiw5OCwxMTcsMTA1LDEwOCwKKyAgICAxMTYsMTA1LDExMCw5NSwxMTAsOTcsMTA5LDEwMSw5MCwxNCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LAorICAgIDExMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMywxMTYsMTA0LDExNCwxMDEsOTcsMTAwLAorICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDE0LDExOSwxMDEsOTcsMTA3LDExNCwxMDEsMTAyLAorICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLAorICAgIDAsMTE0LDExLDAsMCwwLDIxOCw2LDk1LDExNSwxMDEsMTE2LDExNywxMTIsODMsNCwKKyAgICAwLDAsMTE1LDUwLDAsMCwwLDAsOSw0LDEsNCwzLDgsMSwyMCwKKyAgICAxLDEwLDEsMTAsMSw2LDEsMTAsMSw2LDIsMiwxLDEwLDEsMTQsCisgICAgMywxMCwxLDEwLDEsMTAsMSwxMCwyLDEwLDEsMTYsMywyLDEsMTIsCisgICAgMSwxNCwyLDEwLDEsMTIsMyw4LDEsMTE0LDIwOCwwLDAsMCw5OSwyLAorICAgIDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSw2NiwwLDAsMCwxMTYsMCwxMjQsMCwxMjQsMSwxMzEsMiwKKyAgICAxLDAsMTE2LDEsMTA2LDIsMTA2LDMsMTE2LDQsMTMxLDEsMSwwLDExNiwxLAorICAgIDEwNiwyLDEwNiwzLDExNiw1LDEzMSwxLDEsMCwxMDAsMSwxMDAsMiwxMDgsNiwKKyAgICAxMjUsMiwxMjQsMiw5Nyw3LDEyNCwyLDEwNiw4LDExNiwxLDEwNiw5LDExNiwxMCwKKyAgICAyNSwwLDEzMSwxLDEsMCwxMDAsMiw4MywwLDQxLDMsMTIyLDUwLDczLDExMCwKKyAgICAxMTUsMTE2LDk3LDEwOCwxMDgsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiwKKyAgICA5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsCisgICAgOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsCisgICAgMTE0LDMzLDAsMCwwLDc4LDQxLDExLDExNCwyMDgsMCwwLDAsMTE0LDE0LDAsCisgICAgMCwwLDExNCwxNzUsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTUxLDAsMCwKKyAgICAwLDExNCwxNjEsMCwwLDAsMjE4LDI2LDk1LDEwMiwxMTQsMTExLDEyMiwxMDEsMTEwLDk1LAorICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsOTUsMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsCisgICAgOTcsMTA4LDExNCwxMTksMCwwLDAsMjE4LDgsOTUsMTA1LDExMCwxMTUsMTE2LDk3LDEwOCwKKyAgICAxMDgsMTE0LDIxLDAsMCwwLDExNCwxLDAsMCwwLDQxLDMsMTE0LDIwNiwwLAorICAgIDAsMCwxMTQsMjA3LDAsMCwwLDExNCwyMDksMCwwLDAsMTE0LDEwLDAsMCwKKyAgICAwLDExNCwxMCwwLDAsMCwxMTQsMTEsMCwwLDAsMTE0LDIxMCwwLDAsMCwKKyAgICAxMzAsNCwwLDAsMTE1LDEyLDAsMCwwLDAsMiwxMCwyLDEyLDEsMTIsCisgICAgMyw4LDEsNCwxLDExNCwyMTAsMCwwLDAsNDEsMiw3OCw3OCw0MSwxLAorICAgIDc4LDQxLDIsNzgsMTE0LDMzLDAsMCwwLDQxLDUxLDExNCwzLDAsMCwwLAorICAgIDExNCwxMTksMCwwLDAsMTE0LDEyLDAsMCwwLDExNCwxNiwwLDAsMCwxMTQsCisgICAgMTcsMCwwLDAsMTE0LDU5LDAsMCwwLDExNCw0MSwwLDAsMCwxMTQsNDgsCisgICAgMCwwLDAsMTE0LDMxLDAsMCwwLDExNCwzMiwwLDAsMCwxMTQsNTMsMCwKKyAgICAwLDAsMTE0LDU0LDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsNjMsMCwwLAorICAgIDAsMTE0LDY1LDAsMCwwLDExNCw3NSwwLDAsMCwxMTQsODEsMCwwLDAsCisgICAgMTE0LDg0LDAsMCwwLDExNCw5MCwwLDAsMCwxMTQsMTAxLDAsMCwwLDExNCwKKyAgICAxMDIsMCwwLDAsMTE0LDEwNiwwLDAsMCwxMTQsODUsMCwwLDAsMjE4LDYsCisgICAgMTExLDk4LDEwNiwxMDEsOTksMTE2LDkwLDksOTUsODAsNzksODAsODUsNzYsNjUsODQsCisgICAgNjksMTE0LDEzMiwwLDAsMCwxMTQsMTM3LDAsMCwwLDExNCwxNDUsMCwwLDAsCisgICAgMTE0LDk3LDAsMCwwLDExNCw4NiwwLDAsMCwxMTQsMTQ5LDAsMCwwLDExNCwKKyAgICAxNTAsMCwwLDAsMTE0LDg3LDAsMCwwLDExNCwxNTEsMCwwLDAsMTE0LDE2MSwKKyAgICAwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCwxNzIsMCwwLDAsMTE0LDE3NCwwLAorICAgIDAsMCwxMTQsMTc3LDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LDE5MiwwLDAsCisgICAgMCwxMTQsMTgzLDAsMCwwLDExNCwxODUsMCwwLDAsMTE0LDE4NiwwLDAsMCwKKyAgICAxMTQsMTg3LDAsMCwwLDExNCwxOTUsMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsCisgICAgMjAzLDAsMCwwLDExNCwyMDQsMCwwLDAsMTE0LDIwOCwwLDAsMCwxMTQsMjEwLAorICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMCwwLDAsMTE0LDEwLDAsCisgICAgMCwwLDExNCwxMSwwLDAsMCwyMTgsOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA2Miw4LDAsMCwwLDExNSw5NiwwLDAsMCw0LDE3LDQsMiw4LDgsCisgICAgOCw0LDE0LDIwLDQsMiw0LDMsMTYsNCwxNCw2OCwxNCwyMSwxNCwxOSwKKyAgICA4LDE5LDgsMTksOCwxMSwxNCw4LDgsMTEsOCwxMiw4LDE2LDgsMzYsCisgICAgMTQsMjcsMTQsMTAxLDE2LDI2LDYsMywxMCw0NSwxNCw2MCw4LDE4LDgsMTcsCisgICAgOCwyNSw4LDI5LDgsMjMsOCwxNiwxNCw3MywxNCw3NywxNCwxMyw4LDksCisgICAgOCw5LDEwLDQ3LDgsMjAsNCwxLDgsMiw4LDI3LDgsNiwxMCwyNCwKKyAgICA4LDMyLDgsMjcsMTgsMzUsOCw3LDgsNDcsCiB9OwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oIGIvUHl0aG9uL2ltcG9ydGxpYl9leHRlcm5hbC5oCmluZGV4IDI3ZDdjOGEuLjRmZTJhOTggMTAwNjQ0Ci0tLSBhL1B5dGhvbi9pbXBvcnRsaWJfZXh0ZXJuYWwuaAorKysgYi9QeXRob24vaW1wb3J0bGliX2V4dGVybmFsLmgKQEAgLTEsMTAwNCArMSw5MTUgQEAKIC8qIEF1dG8tZ2VuZXJhdGVkIGJ5IFByb2dyYW1zL19mcmVlemVfaW1wb3J0bGliLmMgKi8KIGNvbnN0IHVuc2lnbmVkIGNoYXIgX1B5X01fX2ltcG9ydGxpYl9leHRlcm5hbFtdID0gewotICAgIDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDcsMCwwLAotICAgIDAsNjQsMCwwLDAsMTE1LDI0NCwyLDAsMCwxMDAsMCwwLDkwLDAsMCwKLSAgICAxMDAsOTYsMCw5MCwxLDAsMTAwLDk3LDAsOTAsMiwwLDEwMSwyLDAsMTAxLAotICAgIDEsMCwyMyw5MCwzLDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsCi0gICAgNCwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDUsMCwxMDAsOCwKLSAgICAwLDEwMCw5LDAsMTMyLDAsMCw5MCw2LDAsMTAwLDEwLDAsMTAwLDExLDAsCi0gICAgMTMyLDAsMCw5MCw3LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDAsMCw5MCwKLSAgICA4LDAsMTAwLDE0LDAsMTAwLDE1LDAsMTMyLDAsMCw5MCw5LDAsMTAwLDE2LAotICAgIDAsMTAwLDE3LDAsMTMyLDAsMCw5MCwxMCwwLDEwMCwxOCwwLDEwMCwxOSwwLAotICAgIDEzMiwwLDAsOTAsMTEsMCwxMDAsMjAsMCwxMDAsMjEsMCwxMzIsMCwwLDkwLAotICAgIDEyLDAsMTAwLDIyLDAsMTAwLDIzLDAsMTAwLDI0LDAsMTMyLDEsMCw5MCwxMywKLSAgICAwLDEwMSwxNCwwLDEwMSwxMywwLDEwNiwxNSwwLDEzMSwxLDAsOTAsMTYsMCwKLSAgICAxMDAsMjUsMCwxMDYsMTcsMCwxMDAsMjYsMCwxMDAsMjcsMCwxMzEsMiwwLDEwMCwKLSAgICAyOCwwLDIzLDkwLDE4LDAsMTAxLDE5LDAsMTA2LDIwLDAsMTAxLDE4LDAsMTAwLAotICAgIDI3LDAsMTMxLDIsMCw5MCwyMSwwLDEwMCwyOSwwLDkwLDIyLDAsMTAwLDMwLAotICAgIDAsOTAsMjMsMCwxMDAsMzEsMCwxMDMsMSwwLDkwLDI0LDAsMTAwLDMyLDAsCi0gICAgMTAzLDEsMCw5MCwyNSwwLDEwMSwyNSwwLDQsOTAsMjYsMCw5MCwyNywwLAotICAgIDEwMCwzMywwLDEwMCwzNCwwLDEwMCwzMywwLDEwMCwzNSwwLDEwMCwzNiwwLDEzMiwKLSAgICAxLDEsOTAsMjgsMCwxMDAsMzcsMCwxMDAsMzgsMCwxMzIsMCwwLDkwLDI5LAotICAgIDAsMTAwLDM5LDAsMTAwLDQwLDAsMTMyLDAsMCw5MCwzMCwwLDEwMCw0MSwwLAotICAgIDEwMCw0MiwwLDEzMiwwLDAsOTAsMzEsMCwxMDAsNDMsMCwxMDAsNDQsMCwxMzIsCi0gICAgMCwwLDkwLDMyLDAsMTAwLDQ1LDAsMTAwLDQ2LDAsMTAwLDQ3LDAsMTAwLDQ4LAotICAgIDAsMTMyLDAsMSw5MCwzMywwLDEwMCw0OSwwLDEwMCw1MCwwLDEzMiwwLDAsCi0gICAgOTAsMzQsMCwxMDAsNTEsMCwxMDAsNTIsMCwxMzIsMCwwLDkwLDM1LDAsMTAwLAotICAgIDMzLDAsMTAwLDMzLDAsMTAwLDMzLDAsMTAwLDUzLDAsMTAwLDU0LDAsMTMyLDMsCi0gICAgMCw5MCwzNiwwLDEwMCwzMywwLDEwMCwzMywwLDEwMCwzMywwLDEwMCw1NSwwLAotICAgIDEwMCw1NiwwLDEzMiwzLDAsOTAsMzcsMCwxMDAsNTcsMCwxMDAsNTcsMCwxMDAsCi0gICAgNTgsMCwxMDAsNTksMCwxMzIsMiwwLDkwLDM4LDAsMTAwLDYwLDAsMTAwLDYxLAotICAgIDAsMTMyLDAsMCw5MCwzOSwwLDEwMSw0MCwwLDEzMSwwLDAsOTAsNDEsMCwKLSAgICAxMDAsMzMsMCwxMDAsNjIsMCwxMDAsMzMsMCwxMDAsNjMsMCwxMDEsNDEsMCwxMDAsCi0gICAgNjQsMCwxMDAsNjUsMCwxMzIsMSwyLDkwLDQyLDAsNzEsMTAwLDY2LDAsMTAwLAotICAgIDY3LDAsMTMyLDAsMCwxMDAsNjcsMCwxMzEsMiwwLDkwLDQzLDAsNzEsMTAwLAotICAgIDY4LDAsMTAwLDY5LDAsMTMyLDAsMCwxMDAsNjksMCwxMzEsMiwwLDkwLDQ0LAotICAgIDAsNzEsMTAwLDcwLDAsMTAwLDcxLDAsMTMyLDAsMCwxMDAsNzEsMCwxMDEsNDQsCi0gICAgMCwxMzEsMywwLDkwLDQ1LDAsNzEsMTAwLDcyLDAsMTAwLDczLDAsMTMyLDAsCi0gICAgMCwxMDAsNzMsMCwxMzEsMiwwLDkwLDQ2LDAsNzEsMTAwLDc0LDAsMTAwLDc1LAotICAgIDAsMTMyLDAsMCwxMDAsNzUsMCwxMDEsNDYsMCwxMDEsNDUsMCwxMzEsNCwwLAotICAgIDkwLDQ3LDAsNzEsMTAwLDc2LDAsMTAwLDc3LDAsMTMyLDAsMCwxMDAsNzcsMCwKLSAgICAxMDEsNDYsMCwxMDEsNDQsMCwxMzEsNCwwLDkwLDQ4LDAsMTAzLDAsMCw5MCwKLSAgICA0OSwwLDcxLDEwMCw3OCwwLDEwMCw3OSwwLDEzMiwwLDAsMTAwLDc5LDAsMTAxLAotICAgIDQ2LDAsMTAxLDQ0LDAsMTMxLDQsMCw5MCw1MCwwLDcxLDEwMCw4MCwwLDEwMCwKLSAgICA4MSwwLDEzMiwwLDAsMTAwLDgxLDAsMTMxLDIsMCw5MCw1MSwwLDcxLDEwMCwKLSAgICA4MiwwLDEwMCw4MywwLDEzMiwwLDAsMTAwLDgzLDAsMTMxLDIsMCw5MCw1MiwKLSAgICAwLDcxLDEwMCw4NCwwLDEwMCw4NSwwLDEzMiwwLDAsMTAwLDg1LDAsMTMxLDIsCi0gICAgMCw5MCw1MywwLDcxLDEwMCw4NiwwLDEwMCw4NywwLDEzMiwwLDAsMTAwLDg3LAotICAgIDAsMTMxLDIsMCw5MCw1NCwwLDEwMCwzMywwLDEwMCw4OCwwLDEwMCw4OSwwLAotICAgIDEzMiwxLDAsOTAsNTUsMCwxMDAsOTAsMCwxMDAsOTEsMCwxMzIsMCwwLDkwLAotICAgIDU2LDAsMTAwLDkyLDAsMTAwLDkzLDAsMTMyLDAsMCw5MCw1NywwLDEwMCw5NCwKLSAgICAwLDEwMCw5NSwwLDEzMiwwLDAsOTAsNTgsMCwxMDAsMzMsMCw4Myw0MSw5OCwKLSAgICA5Nyw5NCwxLDAsMCw2NywxMTEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwKLSAgICAxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMTIsOTcsMTE2LDEwNCwKLSAgICA0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiw0NiwxMCwxMCwKLSAgICA4NCwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDc4LAotICAgIDc5LDg0LDMyLDEwOSwxMDEsOTcsMTEwLDExNiwzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDAsCi0gICAgMTA1LDExNCwxMDEsOTksMTE2LDEwOCwxMjEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwKLSAgICAzMywzMiw3MywxMTYsMzIsMTA0LDk3LDExNSwzMiw5OCwxMDEsMTAxLDExMCwzMiwxMDAsMTAxLAotICAgIDExNSwxMDUsMTAzLDExMCwxMDEsMTAwLDMyLDExNSwxMTcsOTksMTA0LDEwLDExNiwxMDQsOTcsMTE2LAotICAgIDMyLDEwNSwxMTYsMzIsOTksOTcsMTEwLDMyLDk4LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsCi0gICAgMTE2LDExNCw5NywxMTIsMTEyLDEwMSwxMDAsMzIsMTA1LDExMCwxMTYsMTExLDMyLDgwLDEyMSwxMTYsCi0gICAgMTA0LDExMSwxMTAsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsCi0gICAgMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwNSwxMDksMTEyLAotICAgIDExMSwxMTQsMTE2LDQ2LDMyLDY1LDExNSwxMCwxMTUsMTE3LDk5LDEwNCwzMiwxMDUsMTE2LDMyLAotICAgIDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMDYsCi0gICAgMTAxLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsCi0gICAgMTA1LDk5LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDk3LAotICAgIDExNiwxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwxMTEsMTE0LDEwMCwKLSAgICAxMDEsMTE0LDMyLDExNiwxMTEsMTAsMTE5LDExMSwxMTQsMTA3LDQ2LDMyLDc5LDExMCwxMDEsMzIsCi0gICAgMTE1LDEwNCwxMTEsMTE3LDEwOCwxMDAsMzIsMTE3LDExNSwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKLSAgICAxMTYsMTA4LDEwNSw5OCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDExNyw5OCwxMDgsCi0gICAgMTA1LDk5LDQ1LDEwMiw5Nyw5OSwxMDUsMTEwLDEwMywzMiwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwKLSAgICAxMTAsMzIsMTExLDEwMiwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNDYsMTAsMTAsMjE4LDMsMTE5LDEwNSwxMTAsMjE4LDYsOTksMTIxLDEwMywxMTksMTA1LDExMCwKLSAgICAyMTgsNiwxMDAsOTcsMTE0LDExOSwxMDUsMTEwLDk5LDAsMCwwLDAsMCwwLDAsCi0gICAgMCwxLDAsMCwwLDMsMCwwLDAsMywwLDAsMCwxMTUsODgsMCwKLSAgICAwLDAsMTE2LDAsMCwxMDYsMSwwLDEwNiwyLDAsMTE2LDMsMCwxMzEsMSwKLSAgICAwLDExNCw3MiwwLDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDExNiw0LDAsCi0gICAgMTMxLDEsMCwxMTQsNDUsMCwxMDAsMSwwLDEzNywwLDAsMTEwLDYsMCwxMDAsCi0gICAgMiwwLDEzNywwLDAsMTM1LDAsMCwxMDIsMSwwLDEwMCwzLDAsMTAwLDQsCi0gICAgMCwxMzQsMCwwLDEyNSwwLDAsMTEwLDEyLDAsMTAwLDUsMCwxMDAsNCwwLAotICAgIDEzMiwwLDAsMTI1LDAsMCwxMjQsMCwwLDgzLDQxLDYsNzgsOTAsMTIsODAsCi0gICAgODksODQsNzIsNzksNzgsNjcsNjUsODMsNjksNzksNzUsMTE1LDEyLDAsMCwwLAotICAgIDgwLDg5LDg0LDcyLDc5LDc4LDY3LDY1LDgzLDY5LDc5LDc1LDk5LDAsMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMTksMCwwLAotICAgIDAsMTE1LDEzLDAsMCwwLDEzNiwwLDAsMTE2LDAsMCwxMDYsMSwwLDEwNywKLSAgICA2LDAsODMsNDEsMSwxMjIsNTMsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMDIsCi0gICAgMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsCi0gICAgMzIsOTksMTA0LDEwMSw5OSwxMDcsMTAxLDEwMCwzMiw5OSw5NywxMTUsMTAxLDQ1LDEwNSwxMTAsCi0gICAgMTE1LDEwMSwxMTAsMTE1LDEwNSwxMTYsMTA1LDExOCwxMDEsMTA4LDEyMSw0Niw0MSwyLDIxOCwzLAotICAgIDk1LDExMSwxMTUsOTAsNywxMDEsMTEwLDExOCwxMDUsMTE0LDExMSwxMTAsMTY5LDAsNDEsMSwKLSAgICAyMTgsMywxMDcsMTAxLDEyMSwxMTQsNCwwLDAsMCwyNTAsMzgsNjAsMTAyLDExNCwxMTEsCi0gICAgMTIyLDEwMSwxMTAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCw0Niw5NSw5OCwKLSAgICAxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsOTUsMTAxLDEyMCwxMTYsMTAxLDExNCwxMTAsOTcsCi0gICAgMTA4LDYyLDIxOCwxMSw5NSwxMTQsMTAxLDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LDEwMSwzNywKLSAgICAwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTIyLDM3LDk1LDEwOSw5NywxMDcsCi0gICAgMTAxLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSw5OSw5NywxMTUsMTAxLDQ2LDYwLDEwOCwxMTEsCi0gICAgOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTQsMTAxLDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LAotICAgIDEwMSw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCi0gICAgMCwwLDgzLDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsCi0gICAgMiwxMjIsNTMsODQsMTE0LDExNywxMDEsMzIsMTA1LDEwMiwzMiwxMDIsMTA1LDEwOCwxMDEsMTEwLAotICAgIDk3LDEwOSwxMDEsMTE1LDMyLDEwOSwxMTcsMTE1LDExNiwzMiw5OCwxMDEsMzIsOTksMTA0LDEwMSwKLSAgICA5OSwxMDcsMTAxLDEwMCwzMiw5OSw5NywxMTUsMTAxLDQ1LDEwNSwxMTAsMTE1LDEwMSwxMTAsMTE1LAotICAgIDEwNSwxMTYsMTA1LDExOCwxMDEsMTA4LDEyMSw0Niw3MCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwxMTQsNywwLDAsMCw0MSwwLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDIsNDEsNSwyMTgsMywxMTUsMTIxLDExNSwyMTgsOCwxMTIsMTA4LDk3LDExNiwxMDIsCi0gICAgMTExLDExNCwxMDksMjE4LDEwLDExNSwxMTYsOTcsMTE0LDExNiwxMTUsMTE5LDEwNSwxMTYsMTA0LDIxOCwKLSAgICAyNyw5NSw2Nyw2NSw4Myw2OSw5NSw3Myw3OCw4Myw2OSw3OCw4Myw3Myw4NCw3MywKLSAgICA4Niw2OSw5NSw4MCw3Niw2NSw4NCw3MCw3OSw4Miw3Nyw4MywyMTgsMzUsOTUsNjcsCi0gICAgNjUsODMsNjksOTUsNzMsNzgsODMsNjksNzgsODMsNzMsODQsNzMsODYsNjksOTUsCi0gICAgODAsNzYsNjUsODQsNzAsNzksODIsNzcsODMsOTUsODMsODQsODIsOTUsNzUsNjksCi0gICAgODksNDEsMSwxMTQsNywwLDAsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCwKLSAgICA1LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNiw5NSwxMDksOTcsMTA3LDEwMSwKLSAgICA5NSwxMTQsMTAxLDEwOCw5NywxMjAsOTUsOTksOTcsMTE1LDEwMSwzMCwwLDAsMCwxMTUsCi0gICAgMTQsMCwwLDAsMCwxLDE4LDEsMTgsMSw5LDIsNiwyLDIxLDQsCi0gICAgMTIsMywxMTQsMTMsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLAotICAgIDEsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMjYsMCwwLAotICAgIDAsMTE2LDAsMCwxMjQsMCwwLDEzMSwxLDAsMTAwLDEsMCw2NCwxMDYsMSwKLSAgICAwLDEwMCwyLDAsMTAwLDMsMCwxMzEsMiwwLDgzLDQxLDQsMTIyLDQyLDY3LAotICAgIDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LDMyLDUxLDUwLDQ1LDk4LDEwNSwxMTYsMzIsCi0gICAgMTA1LDExMCwxMTYsMTAxLDEwMywxMDEsMTE0LDMyLDExNiwxMTEsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwKLSAgICAxMDEsNDUsMTAxLDExMCwxMDAsMTA1LDk3LDExMCw0NiwxMDgsMywwLDAsMCwyNTUsMTI3LAotICAgIDI1NSwxMjcsMywwLDIzMyw0LDAsMCwwLDIxOCw2LDEwOCwxMDUsMTE2LDExNiwxMDgsCi0gICAgMTAxLDQxLDIsMjE4LDMsMTA1LDExMCwxMTYsMjE4LDgsMTE2LDExMSw5NSw5OCwxMjEsMTE2LAotICAgIDEwMSwxMTUsNDEsMSwyMTgsMSwxMjAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDYsMCwwLDAsMjE4LDcsOTUsMTE5LDk1LDEwOCwxMTEsMTEwLDEwMyw0NywKLSAgICAwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LDE5LDAsMCwwLDk5LAotICAgIDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDExNiwwLDAsMTA2LDEsMCwxMjQsCi0gICAgMCwwLDEwMCwxLDAsMTMxLDIsMCw4Myw0MSwyLDEyMiw0Nyw2NywxMTEsMTEwLAotICAgIDExOCwxMDEsMTE0LDExNiwzMiw1MiwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTA1LDExMCwzMiwKLSAgICAxMDgsMTA1LDExNiwxMTYsMTA4LDEwMSw0NSwxMDEsMTEwLDEwMCwxMDUsOTcsMTEwLDMyLDExNiwxMTEsCi0gICAgMzIsOTcsMTEwLDMyLDEwNSwxMTAsMTE2LDEwMSwxMDMsMTAxLDExNCw0NiwxMTQsMTUsMCwwLAotICAgIDAsNDEsMiwxMTQsMTYsMCwwLDAsMjE4LDEwLDEwMiwxMTQsMTExLDEwOSw5NSw5OCwKLSAgICAxMjEsMTE2LDEwMSwxMTUsNDEsMSw5MCw5LDEwNSwxMTAsMTE2LDk1LDk4LDEyMSwxMTYsMTAxLAotICAgIDExNSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAyMTgsNyw5NSwxMTQsOTUsMTA4LDExMSwxMTAsMTAzLDUyLDAsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsMiwxMTQsMjEsMCwwLDAsOTksMCwwLDAsMCwwLDAsCi0gICAgMCwwLDEsMCwwLDAsMywwLDAsMCw3MSwwLDAsMCwxMTUsMjYsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsCi0gICAgMCwwLDEyNCwwLDAsNjgsMTMxLDEsMCwxMzEsMSwwLDgzLDQxLDMsMTIyLAotICAgIDMxLDgyLDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsCi0gICAgMzIsMTExLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwxMDYsMTExLDEwNSwxMTAsNDAsNDEsNDYsCi0gICAgOTksMSwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsCi0gICAgMCw4MywwLDAsMCwxMTUsMzcsMCwwLDAsMTAzLDAsMCwxMjQsMCwwLAotICAgIDkzLDI3LDAsMTI1LDEsMCwxMjQsMSwwLDExNCw2LDAsMTI0LDEsMCwxMDYsCi0gICAgMCwwLDExNiwxLDAsMTMxLDEsMCwxNDUsMiwwLDExMyw2LDAsODMsMTE0LAotICAgIDQsMCwwLDAsNDEsMiwyMTgsNiwxMTQsMTE1LDExNiwxMTQsMTA1LDExMiwyMTgsMTUsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTE1LDEwMSwxMTIsOTcsMTE0LDk3LDExNiwxMTEsMTE0LDExNSw0MSwKLSAgICAyLDIxOCwyLDQ2LDQ4LDIxOCw0LDExMiw5NywxMTQsMTE2LDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDI1MCwxMCw2MCwxMDgsMTA1LDExNSwKLSAgICAxMTYsOTksMTExLDEwOSwxMTIsNjIsNTksMCwwLDAsMTE1LDIsMCwwLDAsOSwKLSAgICAxLDEyMiwzMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNDYsNjAsMTA4LAotICAgIDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDEwOCwxMDUsMTE1LDExNiw5OSwxMTEsMTA5LDExMiwKLSAgICA2Miw0MSwyLDIxOCw4LDExMiw5NywxMTYsMTA0LDk1LDExNSwxMDEsMTEyLDIxOCw0LDEwNiwKLSAgICAxMTEsMTA1LDExMCw0MSwxLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMTIsOTcsMTE0LDExNiwKLSAgICAxMTUsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMjE4LDEwLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNiwxMTEsMTA1LDExMCw1NywwLDAsMCwKLSAgICAxMTUsNCwwLDAsMCwwLDIsMTUsMSwxMTQsMzAsMCwwLDAsOTksMSwKLSAgICAwLDAsMCwwLDAsMCwwLDUsMCwwLDAsNSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsMTM0LDAsMCwwLDExNiwwLDAsMTE2LDEsMCwxMzEsMSwKLSAgICAwLDEwMCwxLDAsMTA3LDIsMCwxMTQsNTIsMCwxMjQsMCwwLDEwNiwyLDAsCi0gICAgMTE2LDMsMCwxMzEsMSwwLDkyLDMsMCwxMjUsMSwwLDEyNSwyLDAsMTI1LAotICAgIDMsMCwxMjQsMSwwLDEyNCwzLDAsMTAyLDIsMCw4MywxMjAsNjksMCwxMTYsCi0gICAgNCwwLDEyNCwwLDAsMTMxLDEsMCw2OCw5Myw1NSwwLDEyNSw0LDAsMTI0LAotICAgIDQsMCwxMTYsMSwwLDEwNyw2LDAsMTE0LDY1LDAsMTI0LDAsMCwxMDYsNSwKLSAgICAwLDEyNCw0LDAsMTAwLDIsMCwxMDAsMSwwLDEzMSwxLDEsOTIsMiwwLAotICAgIDEyNSwxLDAsMTI1LDMsMCwxMjQsMSwwLDEyNCwzLDAsMTAyLDIsMCw4MywKLSAgICAxMTMsNjUsMCw4NywxMDAsMywwLDEyNCwwLDAsMTAyLDIsMCw4Myw0MSw0LAotICAgIDEyMiwzMiw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsMTE2LDMyLDEwMiwxMTEsCi0gICAgMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTE1LDExMiwxMDgsMTA1LDExNiw0MCwKLSAgICA0MSw0NiwyMzMsMSwwLDAsMCw5MCw4LDEwOSw5NywxMjAsMTE1LDExMiwxMDgsMTA1LAotICAgIDExNiwyMTgsMCw0MSw2LDIxOCwzLDEwOCwxMDEsMTEwLDExNCwyMywwLDAsMCwyMTgsCi0gICAgMTAsMTE0LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsMTA1LDExMSwxMTAsMTE0LDI3LDAsMCwwLAotICAgIDIxOCw4LDExNCwxMDEsMTE4LDEwMSwxMTQsMTE1LDEwMSwxMDAsMjE4LDYsMTE0LDExNSwxMTIsMTA4LAotICAgIDEwNSwxMTYsNDEsNSwyMTgsNCwxMTIsOTcsMTE2LDEwNCw5MCw1LDEwMiwxMTQsMTExLDExMCwKLSAgICAxMTYsMjE4LDEsOTUsMjE4LDQsMTE2LDk3LDEwNSwxMDgsMTE0LDE4LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMSwKLSAgICA5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTEyLDEwOCwxMDUsMTE2LDYzLDAsMCwwLDExNSwKLSAgICAxNiwwLDAsMCwwLDIsMTgsMSwyNCwxLDEwLDEsMTksMSwxMiwxLAotICAgIDI3LDEsMTQsMSwxMTQsNDAsMCwwLDAsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTMsCi0gICAgMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwwLDAsMTMxLDEsMCw4MywKLSAgICA0MSwxLDEyMiwxMjYsODMsMTE2LDk3LDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LAotICAgIDEwNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3Nyw5NywxMDAsMTAxLDMyLDk3LDMyLDExNSwKLSAgICAxMDEsMTEyLDk3LDExNCw5NywxMTYsMTAxLDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwKLSAgICAzMiwxMTYsMTExLDMyLDEwOSw5NywxMDcsMTAxLDMyLDEwNSwxMTYsMzIsMTAxLDk3LDExNSwxMDUsCi0gICAgMTAxLDExNCwzMiwxMTYsMTExLDMyLDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsMzIsMTA1LAotICAgIDExMCwzMiwxMDEsMTIwLDExMiwxMDEsMTE0LDEwNSwxMDksMTAxLDExMCwxMTYsMTE1LDEwLDMyLDMyLAotICAgIDMyLDMyLDQwLDEwMSw0NiwxMDMsNDYsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMTUsMTE2LAotICAgIDk3LDExNiwzMiwxMTQsMTAxLDExNSwxMTcsMTA4LDExNiwxMTUsNDEsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsNDEsMiwxMTQsMywwLDAsMCw5MCw0LDExNSwxMTYsOTcsMTE2LDQxLAotICAgIDEsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw2LDAsMCwwLDIxOCwxMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LAotICAgIDExNiw3NSwwLDAsMCwxMTUsMiwwLDAsMCwwLDcsMTE0LDQxLDAsMCwKLSAgICAwLDk5LDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDExLDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSw1OCwwLDAsMCwxMjEsMTYsMCwxMTYsMCwKLSAgICAwLDEyNCwwLDAsMTMxLDEsMCwxMjUsMiwwLDg3LDExMCwyMiwwLDQsMTE2LAotICAgIDEsMCwxMDcsMTAsMCwxMTQsNDAsMCwxLDEsMSwxMDAsMSwwLDgzLDg5LAotICAgIDExMCwxLDAsODgsMTI0LDIsMCwxMDYsMiwwLDEwMCwyLDAsNjQsMTI0LDEsCi0gICAgMCwxMDcsMiwwLDgzLDQxLDMsMTIyLDQ5LDg0LDEwMSwxMTUsMTE2LDMyLDExOSwxMDQsCi0gICAgMTAxLDExNiwxMDQsMTAxLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsCi0gICAgMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsCi0gICAgMTA5LDExMSwxMDAsMTAxLDMyLDExNiwxMjEsMTEyLDEwMSw0Niw3MCwxMDUsMCwyNDAsMCwwLAotICAgIDQxLDMsMTE0LDQxLDAsMCwwLDIxOCw3LDc5LDgzLDY5LDExNCwxMTQsMTExLDExNCwKLSAgICAyMTgsNywxMTUsMTE2LDk1LDEwOSwxMTEsMTAwLDEwMSw0MSwzLDExNCwzNywwLDAsMCwKLSAgICAyMTgsNCwxMDksMTExLDEwMCwxMDEsOTAsOSwxMTUsMTE2LDk3LDExNiw5NSwxMDUsMTEwLDEwMiwKLSAgICAxMTEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMjE4LDE4LDk1LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMTUsOTUsMTA5LDExMSwxMDAsMTAxLDk1LAotICAgIDExNiwxMjEsMTEyLDEwMSw4NSwwLDAsMCwxMTUsMTAsMCwwLDAsMCwyLDMsCi0gICAgMSwxNiwxLDEzLDEsOSwxLDExNCw0NSwwLDAsMCw5OSwxLDAsMCwKLSAgICAwLDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSwxMywwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTAwLDEsMCwxMzEsCi0gICAgMiwwLDgzLDQxLDIsMTIyLDMxLDgyLDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksMTAxLAotICAgIDExMCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTExLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwxMDUsCi0gICAgMTE1LDEwMiwxMDUsMTA4LDEwMSw0NiwxMDUsMCwxMjgsMCwwLDQxLDEsMTE0LDQ1LDAsCi0gICAgMCwwLDQxLDEsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKLSAgICAxMDUsMTE1LDEwMiwxMDUsMTA4LDEwMSw5NCwwLDAsMCwxMTUsMiwwLDAsMCwwLAotICAgIDIsMTE0LDQ2LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwxLAotICAgIDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDMxLDAsMCwwLAotICAgIDEyNCwwLDAsMTE1LDE4LDAsMTE2LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTI1LAotICAgIDAsMCwxMTYsMiwwLDEyNCwwLDAsMTAwLDEsMCwxMzEsMiwwLDgzLDQxLAotICAgIDIsMTIyLDMwLDgyLDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsMTExLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwxMDUsMTE1LDEwMCwxMDUsMTE0LAotICAgIDQ2LDEwNSwwLDY0LDAsMCw0MSwzLDExNCwzLDAsMCwwLDIxOCw2LDEwMywKLSAgICAxMDEsMTE2LDk5LDExOSwxMDAsMTE0LDQ1LDAsMCwwLDQxLDEsMTE0LDM3LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDIxOCwxMSw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTE1LDEwMCwxMDUsMTE0LDk5LDAsMCwKLSAgICAwLDExNSw2LDAsMCwwLDAsMiw2LDEsMTIsMSwxMTQsNDgsMCwwLAotICAgIDAsMTA1LDE4MiwxLDAsMCw5OSwzLDAsMCwwLDAsMCwwLDAsNiwKLSAgICAwLDAsMCwxNywwLDAsMCw2NywwLDAsMCwxMTUsMTkzLDAsMCwwLAotICAgIDEwMCwxLDAsMTA2LDAsMCwxMjQsMCwwLDExNiwxLDAsMTI0LDAsMCwxMzEsCi0gICAgMSwwLDEzMSwyLDAsMTI1LDMsMCwxMTYsMiwwLDEwNiwzLDAsMTI0LDMsCi0gICAgMCwxMTYsMiwwLDEwNiw0LDAsMTE2LDIsMCwxMDYsNSwwLDY2LDExNiwyLAotICAgIDAsMTA2LDYsMCw2NiwxMjQsMiwwLDEwMCwyLDAsNjQsMTMxLDMsMCwxMjUsCi0gICAgNCwwLDEyMSw2MSwwLDExNiw3LDAsMTA2LDgsMCwxMjQsNCwwLDEwMCwzLAotICAgIDAsMTMxLDIsMCwxNDMsMjAsMCwxMjUsNSwwLDEyNCw1LDAsMTA2LDksMCwKLSAgICAxMjQsMSwwLDEzMSwxLDAsMSw4NywxMDAsNCwwLDgxLDgyLDg4LDExNiwyLAotICAgIDAsMTA2LDEwLDAsMTI0LDMsMCwxMjQsMCwwLDEzMSwyLDAsMSw4NywxMTAsCi0gICAgNTksMCw0LDExNiwxMSwwLDEwNywxMCwwLDExNCwxODgsMCwxLDEsMSwxMjEsCi0gICAgMTcsMCwxMTYsMiwwLDEwNiwxMiwwLDEyNCwzLDAsMTMxLDEsMCwxLDg3LAotICAgIDExMCwxOCwwLDQsMTE2LDExLDAsMTA3LDEwLDAsMTE0LDE4MCwwLDEsMSwxLAotICAgIDg5LDExMCwxLDAsODgsMTMwLDAsMCw4OSwxMTAsMSwwLDg4LDEwMCw0LDAsCi0gICAgODMsNDEsNSwxMjIsMTYyLDY2LDEwMSwxMTUsMTE2LDQ1LDEwMSwxMDIsMTAyLDExMSwxMTQsMTE2LAotICAgIDMyLDEwMiwxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLDExOSwxMTQsMTA1LAotICAgIDExNiwxMDEsMzIsMTAwLDk3LDExNiw5NywzMiwxMTYsMTExLDMyLDk3LDMyLDExMiw5NywxMTYsCi0gICAgMTA0LDMyLDk3LDExNiwxMTEsMTA5LDEwNSw5OSw5NywxMDgsMTA4LDEyMSw0NiwxMCwzMiwzMiwKLSAgICAzMiwzMiw2NiwxMDEsMzIsMTEyLDExNCwxMDEsMTEyLDk3LDExNCwxMDEsMTAwLDMyLDExNiwxMTEsCi0gICAgMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwzMiw5NywzMiw3MCwxMDUsMTA4LDEwMSw2OSwxMjAsCi0gICAgMTA1LDExNSwxMTYsMTE1LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTAyLDMyLDk5LDExMSwxMTAsCi0gICAgOTksMTE3LDExNCwxMTQsMTAxLDExMCwxMTYsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLAotICAgIDExMSwxMDIsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTE2LDEwMSwxMDksMTEyLDExMSwKLSAgICAxMTQsOTcsMTE0LDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywxMTYsMTE2LAotICAgIDEwMSwxMDksMTEyLDExNiwxMDEsMTAwLDQ2LDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSwxMDUsMTgyLAotICAgIDEsMCwwLDkwLDIsMTE5LDk4LDc4LDQxLDEzLDIxOCw2LDEwMiwxMTEsMTE0LDEwOSwKLSAgICA5NywxMTYsMjE4LDIsMTA1LDEwMCwxMTQsMywwLDAsMCw5MCw0LDExMSwxMTIsMTAxLAotICAgIDExMCw5MCw2LDc5LDk1LDY5LDg4LDY3LDc2LDkwLDcsNzksOTUsNjcsODIsNjksCi0gICAgNjUsODQsOTAsOCw3OSw5NSw4Nyw4Miw3OSw3OCw3Niw4OSwyMTgsMyw5NSwxMDUsCi0gICAgMTExLDIxOCw2LDcwLDEwNSwxMDgsMTAxLDczLDc5LDIxOCw1LDExOSwxMTQsMTA1LDExNiwxMDEsCi0gICAgMjE4LDcsMTE0LDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMTQsNDIsMCwwLDAsOTAsNiwKLSAgICAxMTcsMTEwLDEwOCwxMDUsMTEwLDEwNyw0MSw2LDExNCwzNywwLDAsMCwyMTgsNCwxMDAsCi0gICAgOTcsMTE2LDk3LDExNCw0NCwwLDAsMCw5MCw4LDExMiw5NywxMTYsMTA0LDk1LDExNiwKLSAgICAxMDksMTEyLDkwLDIsMTAyLDEwMCwyMTgsNCwxMDIsMTA1LDEwOCwxMDEsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEzLDk1LDExOSwxMTQsCi0gICAgMTA1LDExNiwxMDEsOTUsOTcsMTE2LDExMSwxMDksMTA1LDk5LDEwNiwwLDAsMCwxMTUsMjYsCi0gICAgMCwwLDAsMCw1LDI0LDEsOSwxLDMzLDEsMywzLDIxLDEsMjAsCi0gICAgMSwyMCwxLDEzLDEsMywxLDE3LDEsMTMsMSw1LDEsMTE0LDU3LDAsCi0gICAgMCwwLDEwNSwyMywxMywwLDAsMjMzLDIsMCwwLDAsMTE0LDE1LDAsMCwKLSAgICAwLDExNSwyLDAsMCwwLDEzLDEwLDkwLDExLDk1LDk1LDExMiwxMjEsOTksOTcsCi0gICAgOTksMTA0LDEwMSw5NSw5NSwxMjIsNCwxMTEsMTEyLDExNiw0NSwxMjIsMyw0NiwxMTIsMTIxLAotICAgIDEyMiw0LDQ2LDExMiwxMjEsOTksNzgsMjE4LDEyLDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwKLSAgICA5NywxMTYsMTA1LDExMSwxMTAsOTksMiwwLDAsMCwxLDAsMCwwLDExLDAsCi0gICAgMCwwLDYsMCwwLDAsNjcsMCwwLDAsMTE1LDg3LDEsMCwwLDEyNCwKLSAgICAxLDAsMTAwLDEsMCwxMDcsOSwwLDExNCw3NiwwLDExNiwwLDAsMTA2LDEsCi0gICAgMCwxMDAsMiwwLDExNiwyLDAsMTMxLDIsMCwxLDEyNCwyLDAsMTAwLDEsCi0gICAgMCwxMDcsOSwwLDExNCw1OCwwLDEwMCwzLDAsMTI1LDMsMCwxMTYsMywwLAotICAgIDEyNCwzLDAsMTMxLDEsMCwxMzAsMSwwLDEyNCwxLDAsMTE0LDcwLDAsMTAwLAotICAgIDQsMCwxMTAsMywwLDEwMCw1LDAsMTI1LDIsMCwxMTYsNCwwLDEyNCwwLAotICAgIDAsMTMxLDEsMCw5MiwyLDAsMTI1LDQsMCwxMjUsNSwwLDEyNCw1LDAsCi0gICAgMTA2LDUsMCwxMDAsNiwwLDEzMSwxLDAsOTIsMywwLDEyNSw2LDAsMTI1LAotICAgIDcsMCwxMjUsOCwwLDExNiw2LDAsMTA2LDcsMCwxMDYsOCwwLDEyNSw5LAotICAgIDAsMTI0LDksMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDE1NCwwLDExNiw5LDAsCi0gICAgMTAwLDcsMCwxMzEsMSwwLDEzMCwxLDAsMTAwLDQsMCwxMDYsMTAsMCwxMjQsCi0gICAgNiwwLDExNCwxNzIsMCwxMjQsNiwwLDExMCwzLDAsMTI0LDgsMCwxMjQsNywKLSAgICAwLDEyNCw5LDAsMTAzLDMsMCwxMzEsMSwwLDEyNSwxMCwwLDEyNCwyLDAsCi0gICAgMTAwLDEsMCwxMDcsOCwwLDExNCwyNDEsMCwxMTYsNiwwLDEwNiwxMSwwLDEwNiwKLSAgICAxMiwwLDEwMCw4LDAsMTA3LDIsMCwxMTQsMjI5LDAsMTAwLDQsMCwxMjUsMiwKLSAgICAwLDExMCwxMiwwLDExNiw2LDAsMTA2LDExLDAsMTA2LDEyLDAsMTI1LDIsMCwKLSAgICAxMTYsMTMsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDIsMCwxMjQsMiwwLDEwMCwKLSAgICA0LDAsMTA3LDMsMCwxMTQsNjMsMSwxMjQsMiwwLDEwNiwxNCwwLDEzMSwwLAotICAgIDAsMTE1LDQyLDEsMTE2LDE1LDAsMTAwLDksMCwxMDYsMTYsMCwxMjQsMiwwLAotICAgIDEzMSwxLDAsMTMxLDEsMCwxMzAsMSwwLDEwMCwxMCwwLDEwNiwxNiwwLDEyNCwKLSAgICAxMCwwLDExNiwxNywwLDEyNCwyLDAsMTMxLDMsMCwxMjUsMTAsMCwxMTYsMTgsCi0gICAgMCwxMjQsNCwwLDExNiwxOSwwLDEyNCwxMCwwLDExNiwyMCwwLDEwMCw4LDAsCi0gICAgMjUsMjMsMTMxLDMsMCw4Myw0MSwxMSw5NywyNTQsMiwwLDAsNzEsMTA1LDExOCwKLSAgICAxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsOTcsCi0gICAgMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsNDQsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwKLSAgICAxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMDUsMTE2LAotICAgIDExNSwzMiw0NiwxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwKLSAgICAzMiwzMiw4NCwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwMCwKLSAgICAxMTEsMTAxLDExNSwzMiwxMTAsMTExLDExNiwzMiwxMTAsMTAxLDEwMSwxMDAsMzIsMTE2LDExMSwzMiwKLSAgICAxMDEsMTIwLDEwNSwxMTUsMTE2LDU5LDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMTUsMTA1LDEwOSwxMTIsCi0gICAgMTA4LDEyMSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLAotICAgIDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiw0NiwKLSAgICAxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiw5OSw5NywxMDgsOTksMTE3LDEwOCw5NywKLSAgICAxMTYsMTAxLDEwMCwzMiw5NywxMTUsMzIsMTA1LDEwMiwzMiwxMTYsMTA0LDEwMSwzMiw0NiwxMTIsCi0gICAgMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTksMTAxLDExNCwxMDEsMzIsMTA1LDEwOSwxMTIsMTExLAotICAgIDExNCwxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDM5LAotICAgIDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsMTEyLDk3LAotICAgIDExNCw5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLDk5LDExMSwxMTAsMTE2LDExNCwxMTEsMTA4LDExNSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTIsMTE0LDEwMSwxMTUsMTE3LDEwOSwxMDEsMTAwLDMyLDExMSwxMTIsCi0gICAgMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA4LDEwMSwxMTgsMTAxLDEwOCwKLSAgICAzMiwxMTEsMTAyLDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLAotICAgIDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwzMiw3MywxMDIsMzIsMzksMTExLAotICAgIDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMDUsMTE1LDMyLAotICAgIDExMCwxMTEsMTE2LDMyLDc4LDExMSwxMTAsMTAxLDQ0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTYsCi0gICAgMTE0LDEwNSwxMTAsMTAzLDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDk3LDExNiwKLSAgICAxMDUsMTExLDExMCwxMCwzMiwzMiwzMiwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDk3LAotICAgIDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiwxMDUsMTE1LDMyLDExNiw5NywxMDcsMTAxLDExMCwKLSAgICAzMiw5NywxMTAsMTAwLDMyLDExOCwxMDEsMTE0LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTE2LDExMSwKLSAgICAzMiw5OCwxMDEsMzIsOTcsMTA4LDExMiwxMDQsOTcsMTEwLDExNywxMDksMTAxLDExNCwxMDUsOTksCi0gICAgMzIsNDAsMTAxLDEwOCwxMTUsMTAxLDMyLDg2LDk3LDEwOCwxMTcsMTAxLDY5LDExNCwxMTQsMTExLAotICAgIDExNCwxMCwzMiwzMiwzMiwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDEsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDAsMTAxLDk4LDExNywxMDMsCi0gICAgOTUsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwzMiwxMTIsOTcsMTE0LDk3LDEwOSwxMDEsCi0gICAgMTE2LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsCi0gICAgMTAwLDQ2LDMyLDczLDEwMiwzMiwxMDAsMTAxLDk4LDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LAotICAgIDExNCwxMDUsMTAwLDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDc4LDExMSwxMTAsMTAxLAotICAgIDQ0LDEwLDMyLDMyLDMyLDMyLDk3LDMyLDg0LDExNCwxMTcsMTAxLDMyLDExOCw5NywxMDgsCi0gICAgMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSw5NywxMDksMTAxLDMyLDk3LAotICAgIDExNSwzMiwxMTUsMTAxLDExNiwxMTYsMTA1LDExMCwxMDMsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwKLSAgICAxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwMSwxMDksMTEyLDExNiwxMjEsMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMTAsMzIsMzIsMzIsCi0gICAgMzIsMTE5LDEwNCwxMDUsMTA4LDEwMSwzMiw5NywzMiw3MCw5NywxMDgsMTE1LDEwMSwzMiwxMTgsCi0gICAgOTcsMTA4LDExNywxMDEsMzIsMTA1LDExNSwzMiwxMDEsMTEzLDExNywxMDUsMTE4LDk3LDEwOCwxMDEsCi0gICAgMTEwLDExNiwzMiwxMTYsMTExLDMyLDExNSwxMDEsMTE2LDExNiwxMDUsMTEwLDEwMywzMiwzOSwxMTEsCi0gICAgMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExNiwxMTEsMzIsCi0gICAgMzksNDksMzksNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDExNSwxMjEsMTE1LAotICAgIDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCw0NiwKLSAgICA5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywxMDMsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLAotICAgIDEwMSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsNzgsMTExLDExNiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LAotICAgIDEwMSwxMTAsMTE2LDEwMSwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LAotICAgIDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwxMjIsNzAsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTAwLDEwMSw5OCwxMTcsMTAzLDk1LDExMSwxMTgsMTAxLDExNCwxMTQsMTA1LDEwMCwxMDEsCi0gICAgMzIsMTEyLDk3LDExNCw5NywxMDksMTAxLDExNiwxMDEsMTE0LDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwKLSAgICAxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw1OSwzMiwxMTcsMTE1LDEwMSwzMiwzOSwxMTEsCi0gICAgMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDEwNSwxMTAsMTE1LAotICAgIDExNiwxMDEsOTcsMTAwLDEyMiw1MCwxMDAsMTAxLDk4LDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LAotICAgIDExNCwxMDUsMTAwLDEwMSwzMiwxMTEsMTE0LDMyLDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywKLSAgICAxMTYsMTA1LDExMSwxMTAsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LDEwMSwzMiwxMTUsMTAxLDExNiwKLSAgICAzMiwxMTYsMTExLDMyLDc4LDExMSwxMTAsMTAxLDExNCwzMiwwLDAsMCwxMTQsMzEsMCwKLSAgICAwLDAsMjE4LDEsNDYsMTIyLDM2LDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsCi0gICAgMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LAotICAgIDExNiw5NywxMDMsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSwyMzMsMCwwLDAsMCwKLSAgICAxMjIsMjQsMTIzLDMzLDExNCwxMjUsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywxMDgsCi0gICAgMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwxMjIsNywxMjMsMTI1LDQ2LDEyMywKLSAgICAxMjUsMTIzLDEyNSw0MSwyMSwyMTgsOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsCi0gICAgMjE4LDQsMTE5LDk3LDExNCwxMTAsMjE4LDE4LDY4LDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsODcsOTcsMTE0LDExMCwxMDUsMTEwLDEwMywyMTgsOSw4NCwxMjEsMTEyLDEwMSwKLSAgICA2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDQwLDAsMCwwLDExNCwzNCwwLDAsMCwxMTQsCi0gICAgOCwwLDAsMCwyMTgsMTQsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsCi0gICAgMTE2LDEwNSwxMTEsMTEwLDIxOCw5LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywyMTgsCi0gICAgMTksNzgsMTExLDExNiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNjksCi0gICAgMTE0LDExNCwxMTEsMTE0LDExNCwyOCwwLDAsMCwyMTgsNSwxMDIsMTA4LDk3LDEwMywxMTUsCi0gICAgMjE4LDgsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDEwMSwyMTgsMywxMTUsMTE2LDExNCwyMTgsCi0gICAgNywxMDUsMTE1LDk3LDEwOCwxMTAsMTE3LDEwOSwyMTgsMTAsODYsOTcsMTA4LDExNywxMDEsNjksCi0gICAgMTE0LDExNCwxMTEsMTE0LDExNCw0OSwwLDAsMCwyMTgsNCw5NSw3OSw4MCw4NCwxMTQsCi0gICAgMzAsMCwwLDAsMjE4LDgsOTUsODAsODksNjcsNjUsNjcsNzIsNjksMjE4LDE3LAotICAgIDY2LDg5LDg0LDY5LDY3LDc5LDY4LDY5LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LAotICAgIDgzLDQxLDExLDExNCwzNywwLDAsMCw5MCwxNCwxMDAsMTAxLDk4LDExNywxMDMsOTUsCi0gICAgMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLDEwMSwxMTQsNTksMCwwLDAsMjE4LDcsMTA5LAotICAgIDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMjE4LDQsMTA0LDEwMSw5NywxMDAsMTE0LDM5LDAsMCwKLSAgICAwLDkwLDQsOTgsOTcsMTE1LDEwMSwyMTgsMywxMTUsMTAxLDExMiwyMTgsNCwxMTQsMTAxLAotICAgIDExNSwxMTYsOTAsMywxMTYsOTcsMTAzLDkwLDE1LDk3LDEwOCwxMDksMTExLDExNSwxMTYsOTUsCi0gICAgMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw2LDAsMCwwLDIxOCwxNyw5OSw5Nyw5OSwxMDQsMTAxLDk1LDEwMiwKLSAgICAxMTQsMTExLDEwOSw5NSwxMTUsMTExLDExNywxMTQsOTksMTAxLDI1NCwwLDAsMCwxMTUsNDYsCi0gICAgMCwwLDAsMCwxOCwxMiwxLDksMSw3LDEsMTIsMSw2LDEsMTIsCi0gICAgMSwxOCwxLDE4LDEsMjQsMSwxMiwxLDEyLDEsMTIsMSwzNiwxLDEyLAotICAgIDEsMTgsMSw5LDIsMTIsMSwxMiwxLDEyLDEsMTIsMSwyMSwxLDIxLAotICAgIDEsMTE0LDgxLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCw4LAotICAgIDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LDYyLDEsMCwwLAotICAgIDExNiwwLDAsMTA2LDEsMCwxMDYsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsCi0gICAgMzAsMCwxMTYsMywwLDEwMCwyLDAsMTMxLDEsMCwxMzAsMSwwLDExNiw0LAotICAgIDAsMTI0LDAsMCwxMzEsMSwwLDkyLDIsMCwxMjUsMSwwLDEyNSwyLDAsCi0gICAgMTE2LDQsMCwxMjQsMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSwxLDAsMTI1LAotICAgIDMsMCwxMjQsMywwLDExNiw1LDAsMTA3LDMsMCwxMTQsMTAyLDAsMTE2LDYsCi0gICAgMCwxMDAsMywwLDEwNiw3LDAsMTE2LDUsMCwxMjQsMCwwLDEzMSwyLDAsCi0gICAgMTMxLDEsMCwxMzAsMSwwLDEyNCwyLDAsMTA2LDgsMCwxMDAsNCwwLDEzMSwKLSAgICAxLDAsMTI1LDQsMCwxMjQsNCwwLDEwMCwxMSwwLDEwNyw3LDAsMTE0LDE1MywKLSAgICAwLDExNiw2LDAsMTAwLDcsMCwxMDYsNywwLDEyNCwyLDAsMTMxLDEsMCwKLSAgICAxMzEsMSwwLDEzMCwxLDAsMTEwLDEyNSwwLDEyNCw0LDAsMTAwLDYsMCwxMDcsCi0gICAgMiwwLDExNCwyMiwxLDEyNCwyLDAsMTA2LDksMCwxMDAsNCwwLDEwMCw1LAotICAgIDAsMTMxLDIsMCwxMDAsMTIsMCwyNSwxMjUsNSwwLDEyNCw1LDAsMTA2LDEwLAotICAgIDAsMTE2LDExLDAsMTMxLDEsMCwxMTUsMjIzLDAsMTE2LDYsMCwxMDAsOCwwLAotICAgIDEwNiw3LDAsMTE2LDExLDAsMTMxLDEsMCwxMzEsMSwwLDEzMCwxLDAsMTI0LAotICAgIDUsMCwxMTYsMTIsMCwxMTYsMTEsMCwxMzEsMSwwLDEwMCwxLDAsMTMzLDIsCi0gICAgMCwyNSwxMjUsNiwwLDEyNCw2LDAsMTA2LDEzLDAsMTMxLDAsMCwxMTUsMjIsCi0gICAgMSwxMTYsNiwwLDEwMCw5LDAsMTA2LDcsMCwxMjQsNSwwLDEzMSwxLDAsCi0gICAgMTMxLDEsMCwxMzAsMSwwLDEyNCwyLDAsMTA2LDE0LDAsMTAwLDQsMCwxMzEsCi0gICAgMSwwLDEwMCwxMCwwLDI1LDEyNSw3LDAsMTE2LDE1LDAsMTI0LDEsMCwxMjQsCi0gICAgNywwLDExNiwxNiwwLDEwMCwxMCwwLDI1LDIzLDEzMSwyLDAsODMsNDEsMTMsCi0gICAgOTcsMTEwLDEsMCwwLDcxLDEwNSwxMTgsMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsCi0gICAgOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDk3LDMyLDQ2LDExMiwxMjEsOTksNDYsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDQ0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTA1LDExNiwxMTUsMzIsNDYsMTEyLDEyMSwzMiwKLSAgICAxMDIsMTA1LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiw0NiwKLSAgICAxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsMTEwLDExMSwKLSAgICAxMTYsMzIsMTEwLDEwMSwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTAxLDEyMCwxMDUsMTE1LDExNiw1OSwKLSAgICAzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTE1LDEwNSwxMDksMTEyLDEwOCwxMjEsMzIsMTE0LDEwMSwxMTYsCi0gICAgMTE3LDExNCwxMTAsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsCi0gICAgMTAsMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwKLSAgICAxMDEsMzIsOTksOTcsMTA4LDk5LDExNywxMDgsOTcsMTE2LDEwMSwxMDAsMzIsMTE2LDExMSwzMiwKLSAgICA5OSwxMTEsMTE0LDExNCwxMDEsMTE1LDExMiwxMTEsMTEwLDEwMCwzMiwxMTYsMTExLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDQ2LDExMiwxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDMyLDMyLDczLDEwMiwKLSAgICAzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDAsMTExLDEwMSwxMTUsMTAsMzIsMzIsMzIsMzIsMTEwLAotICAgIDExMSwxMTYsMzIsOTksMTExLDExMCwxMDIsMTExLDExNCwxMDksMzIsMTE2LDExMSwzMiw4MCw2OSwKLSAgICA4MCwzMiw1MSw0OSw1Miw1NSw0Nyw1Miw1Niw1NiwzMiwxMDIsMTExLDExNCwxMDksOTcsCi0gICAgMTE2LDQ0LDMyLDg2LDk3LDEwOCwxMTcsMTAxLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMTksMTA1LAotICAgIDEwOCwxMDgsMzIsOTgsMTAxLDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMzIsNzMsMTAyLAotICAgIDEwLDMyLDMyLDMyLDMyLDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwKLSAgICAxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExNiw5NywKLSAgICAxMDMsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSwzMiwxMTYsMTA0LDEwMSwxMTAsMzIsNzgsCi0gICAgMTExLDExNiw3MywxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDEwMSwxMDAsNjksMTE0LDExNCwKLSAgICAxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiw3OCwxMjIsMzYsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCi0gICAgMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LAotICAgIDk3LDEwMywzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDEyMiwzNywxMjMsMTI1LDMyLDExMCwKLSAgICAxMTEsMTE2LDMyLDk4LDExMSwxMTYsMTE2LDExMSwxMDksNDUsMTA4LDEwMSwxMTgsMTAxLDEwOCwzMiwKLSAgICAxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwKLSAgICAxMjUsMTE0LDYwLDAsMCwwLDExNCw1OCwwLDAsMCwyMzMsMywwLDAsMCwKLSAgICAxMjIsMzMsMTAxLDEyMCwxMTIsMTAxLDk5LDExNiwxMDEsMTAwLDMyLDExMSwxMTAsMTA4LDEyMSwzMiwKLSAgICA1MCwzMiwxMTEsMTE0LDMyLDUxLDMyLDEwMCwxMTEsMTE2LDExNSwzMiwxMDUsMTEwLDMyLDEyMywKLSAgICAzMywxMTQsMTI1LDEyMiw1NywxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsCi0gICAgMTEwLDMyLDExMiwxMTEsMTE0LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDEwMiwxMDUsMTA4LAotICAgIDEwMSwxMTAsOTcsMTA5LDEwMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTE1LAotICAgIDExNiw5NywxMTQsMTE2LDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsNTIsCi0gICAgMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDgsMTAxLDExOCwKLSAgICAxMDEsMTA4LDMyLDEyMywzMywxMTQsMTI1LDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsOTcsCi0gICAgMTEwLDMyLDk3LDEwOCwxMTIsMTA0LDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDMyLDExOCwKLSAgICA5NywxMDgsMTE3LDEwMSwxMTQsNjEsMCwwLDAsNjIsMiwwLDAsMCwxMTQsNTgsCi0gICAgMCwwLDAsMTE0LDgyLDAsMCwwLDIzMywyNTQsMjU1LDI1NSwyNTUsNDEsMTcsMTE0LAotICAgIDgsMCwwLDAsMTE0LDY2LDAsMCwwLDExNCw2NywwLDAsMCwxMTQsNjgsCi0gICAgMCwwLDAsMTE0LDQwLDAsMCwwLDExNCw3NSwwLDAsMCwxMTQsNzMsMCwKLSAgICAwLDAsMTE0LDQ5LDAsMCwwLDIxOCw1LDk5LDExMSwxMTcsMTEwLDExNiwxMTQsMzYsCi0gICAgMCwwLDAsMTE0LDEwLDAsMCwwLDExNCw3NCwwLDAsMCwxMTQsMzMsMCwKLSAgICAwLDAsMTE0LDcyLDAsMCwwLDIxOCw5LDExMiw5NywxMTQsMTE2LDEwNSwxMTYsMTA1LAotICAgIDExMSwxMTAsMTE0LDMwLDAsMCwwLDIxOCwxNSw4Myw3OSw4NSw4Miw2Nyw2OSw5NSwKLSAgICA4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw0MSw4LDExNCwzNywwLDAsMCwxMTQsCi0gICAgNzgsMCwwLDAsOTAsMTYsMTEyLDEyMSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDEwMiwxMDUsCi0gICAgMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5MCw3LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5MCwKLSAgICA5LDEwMCwxMTEsMTE2LDk1LDk5LDExMSwxMTcsMTEwLDExNiwxMTQsNTksMCwwLDAsOTAsCi0gICAgOSwxMTEsMTEyLDExNiw5NSwxMDgsMTAxLDExOCwxMDEsMTA4LDkwLDEzLDk4LDk3LDExNSwxMDEsCi0gICAgOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNywxMTUsMTExLDExNywxMTQsOTksMTAxLAotICAgIDk1LDEwMiwxMTQsMTExLDEwOSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDQyLDEsMCwwLDExNSwKLSAgICA0NCwwLDAsMCwwLDksMTgsMSwxMiwxLDE4LDEsMTgsMSwxMiwxLAotICAgIDksMSwxNSwxLDE1LDEsMTIsMSw5LDEsMTUsMSwxMiwxLDIyLDEsCi0gICAgMTUsMSw5LDEsMTIsMSwyMiwxLDEyLDEsOSwxLDEyLDEsMTksMSwKLSAgICAxMTQsODcsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwKLSAgICAwLDAsMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2NCwwLDAsMCwxMTYsCi0gICAgMCwwLDEyNCwwLDAsMTMxLDEsMCwxMDAsMSwwLDEwNywyLDAsMTE0LDIyLAotICAgIDAsMTAwLDIsMCw4MywxMjQsMCwwLDEwNiwxLDAsMTAwLDMsMCwxMzEsMSwKLSAgICAwLDkyLDMsMCwxMjUsMSwwLDEyNSwyLDAsMTI1LDMsMCwxMjQsMSwwLAotICAgIDEyLDExNSw4MSwwLDEyNCwzLDAsMTA2LDIsMCwxMzEsMCwwLDEwMCw3LDAsCi0gICAgMTAwLDgsMCwxMzMsMiwwLDI1LDEwMCw2LDAsMTA3LDMsMCwxMTQsODUsMCwKLSAgICAxMjQsMCwwLDgzLDEyMSwxNiwwLDExNiwzLDAsMTI0LDAsMCwxMzEsMSwwLAotICAgIDEyNSw0LDAsODcsMTEwLDQwLDAsNCwxMTYsNCwwLDExNiw1LDAsMTAyLDIsCi0gICAgMCwxMDcsMTAsMCwxMTQsMTQzLDAsMSwxLDEsMTI0LDAsMCwxMDAsMiwwLAotICAgIDEwMCw5LDAsMTMzLDIsMCwyNSwxMjUsNCwwLDg5LDExMCwxLDAsODgsMTE2LAotICAgIDYsMCwxMjQsNCwwLDEzMSwxLDAsMTE0LDE2MCwwLDEyNCw0LDAsODMsMTI0LAotICAgIDAsMCw4Myw0MSwxMCwxMjIsMTg4LDY3LDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LAotICAgIDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsCi0gICAgOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDk3LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsCi0gICAgMTEyLDk3LDExNiwxMDQsMzIsNDAsMTA1LDEwMiwzMiwxMTIsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwKLSAgICAxMDEsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTAyLDExNywKLSAgICAxMTAsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsMTE1LDMyLDExMiwxMTcsCi0gICAgMTE0LDEwMSwxMDgsMTIxLDMyLDEwMiwxMTEsMTE0LDMyLDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LAotICAgIDEwMCwxMTUsNDUsOTksMTExLDEwOSwxMTIsOTcsMTE2LDEwNSw5OCwxMDUsMTA4LDEwNSwxMTYsMTIxLAotICAgIDMyLDEwMiwxMTEsMTE0LDEwLDMyLDMyLDMyLDMyLDgwLDEyMSw3MywxMDksMTEyLDExMSwxMTQsCi0gICAgMTE2LDk1LDY5LDEyMCwxMDEsOTksNjcsMTExLDEwMCwxMDEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICA4NywxMDUsMTE2LDEwNCw3MCwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsNDAsNDEsMzIsCi0gICAgMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwzMiw2NywzMiw2NSw4MCw3Myw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiwxMTQsNjEsMCwwLDAsNzgsMTE0LDYwLDAsMCwwLDExNCw4MiwKLSAgICAwLDAsMCwxMTQsMzEsMCwwLDAsOTAsMiwxMTIsMTIxLDIzMywyNTMsMjU1LDI1NSwKLSAgICAyNTUsMjMzLDI1NSwyNTUsMjU1LDI1NSwxMTQsODksMCwwLDAsNDEsNywxMTQsMzMsMCwKLSAgICAwLDAsMTE0LDM0LDAsMCwwLDIxOCw1LDEwOCwxMTEsMTE5LDEwMSwxMTQsMTE0LDg3LAotICAgIDAsMCwwLDExNCw2OCwwLDAsMCwxMTQsNzMsMCwwLDAsMTE0LDQ2LDAsCi0gICAgMCwwLDQxLDUsMjE4LDEzLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDExMiwKLSAgICA5NywxMTYsMTA0LDExNCw4MCwwLDAsMCwxMTQsMzgsMCwwLDAsOTAsOSwxMDEsCi0gICAgMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKLSAgICA5NSwxMTIsOTcsMTE2LDEwNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNiwwLDAsMCwyMTgsMTUsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LAotICAgIDEwMSwxMDIsMTA1LDEwOCwxMDEsNzUsMSwwLDAsMTE1LDIwLDAsMCwwLDAsNywKLSAgICAxOCwxLDQsMSwyNCwxLDM1LDEsNCwxLDMsMSwxNiwxLDE5LDEsCi0gICAgMjEsMSwxMTQsOTMsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLAotICAgIDEsMCwwLDAsMTEsMCwwLDAsNjcsMCwwLDAsMTE1LDkyLDAsMCwKLSAgICAwLDEyNCwwLDAsMTA2LDAsMCwxMTYsMSwwLDExNiwyLDAsMTMxLDEsMCwKLSAgICAxMzEsMSwwLDExNCw1OSwwLDEyMSwxNCwwLDExNiwzLDAsMTI0LDAsMCwxMzEsCi0gICAgMSwwLDgzLDg3LDExMyw4OCwwLDQsMTE2LDQsMCwxMDcsMTAsMCwxMTQsNTUsCi0gICAgMCwxLDEsMSw4OSwxMTMsODgsMCw4OCwxMTAsMjksMCwxMjQsMCwwLDEwNiwKLSAgICAwLDAsMTE2LDEsMCwxMTYsNSwwLDEzMSwxLDAsMTMxLDEsMCwxMTQsODQsCi0gICAgMCwxMjQsMCwwLDgzLDEwMCwwLDAsODMsMTAwLDAsMCw4Myw0MSwxLDc4LAotICAgIDQxLDYsMjE4LDgsMTAxLDExMCwxMDAsMTE1LDExOSwxMDUsMTE2LDEwNCwyMTgsNSwxMTYsMTE3LAotICAgIDExMiwxMDgsMTAxLDExNCw4NiwwLDAsMCwxMTQsODEsMCwwLDAsMTE0LDY4LDAsCi0gICAgMCwwLDExNCw3NiwwLDAsMCw0MSwxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTAsCi0gICAgOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwyMTgsMTEsOTUsMTAzLDEwMSwxMTYsOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsOTQsCi0gICAgMSwwLDAsMTE1LDE2LDAsMCwwLDAsMSwyMSwxLDMsMSwxNCwxLAotICAgIDEzLDEsOCwxLDIxLDEsNCwyLDExNCw5NywwLDAsMCw5OSwxLDAsCi0gICAgMCwwLDAsMCwwLDAsMiwwLDAsMCwxMSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsNjAsMCwwLDAsMTIxLDE5LDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEzMSwxLDAsMTA2LDEsMCwxMjUsMSwwLDg3LDExMCwyNCwwLDQsMTE2LDIsCi0gICAgMCwxMDcsMTAsMCwxMTQsNDUsMCwxLDEsMSwxMDAsMSwwLDEyNSwxLDAsCi0gICAgODksMTEwLDEsMCw4OCwxMjQsMSwwLDEwMCwyLDAsNzksMTI1LDEsMCwxMjQsCi0gICAgMSwwLDgzLDQxLDMsMTIyLDUxLDY3LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTAxLDMyLDExMiwxMDEsMTE0LDEwOSwxMDUsMTE1LAotICAgIDExNSwxMDUsMTExLDExMCwxMTUsMzIsMTAyLDExMSwxMTQsMzIsOTcsMzIsOTgsMTIxLDExNiwxMDEsCi0gICAgOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwNSwxODIsMSwwLDAsMjMzLAotICAgIDEyOCwwLDAsMCw0MSwzLDExNCw0MSwwLDAsMCwxMTQsNDMsMCwwLDAsCi0gICAgMTE0LDQyLDAsMCwwLDQxLDIsMTE0LDM3LDAsMCwwLDExNCw0NCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAyMTgsMTAsOTUsOTksOTcsMTA4LDk5LDk1LDEwOSwxMTEsMTAwLDEwMSwxMDYsMSwwLDAsCi0gICAgMTE1LDEyLDAsMCwwLDAsMiwzLDEsMTksMSwxMywxLDExLDMsMTAsCi0gICAgMSwxMTQsOTksMCwwLDAsMjE4LDksMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDUsMTE2LAotICAgIDEyMSwxMTQsMzEsMCwwLDAsOTksMSwwLDAsMCwxLDAsMCwwLDMsCi0gICAgMCwwLDAsNCwwLDAsMCw3MSwwLDAsMCwxMTUsNzUsMCwwLDAsCi0gICAgMTE2LDAsMCwxMDYsMSwwLDEwNiwyLDAsMTI0LDEsMCwxMDcsNSwwLDExNCwKLSAgICA3MSwwLDEyNCwwLDAsMTA2LDMsMCwxMDAsNiwwLDEzMSwxLDAsMTE1LDQzLAotICAgIDAsMTAwLDMsMCwxMjQsMCwwLDIzLDEyNSwwLDAsMTE2LDQsMCwxMjQsMCwKLSAgICAwLDEwNiw1LDAsMTI0LDIsMCwxNDAsMCwwLDEwMCw0LDAsMTE2LDAsMCwKLSAgICAxMDYsNiwwLDEzMSwxLDEsMSwxMDAsNSwwLDgzLDQxLDcsMTIyLDYxLDgwLAotICAgIDExNCwxMDUsMTEwLDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwKLSAgICAzMiwxMTYsMTExLDMyLDExNSwxMTYsMTAwLDEwMSwxMTQsMTE0LDMyLDEwNSwxMDIsMzIsNDUsMTE4LAotICAgIDQ3LDgwLDg5LDg0LDcyLDc5LDc4LDg2LDY5LDgyLDY2LDc5LDgzLDY5LDMyLDEwNSwKLSAgICAxMTUsMzIsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsMzIsMTExLDExMCw0NiwyNTAsMSwzNSwyNTAsCi0gICAgNywxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMjIsMiwzNSwzMiwxMTQsNTYsMCwwLAotICAgIDAsNzgsNDEsMiwxMTQsMTAxLDAsMCwwLDExNCwxMDIsMCwwLDAsNDEsNywKLSAgICAxMTQsOCwwLDAsMCwxMTQsNjksMCwwLDAsMjE4LDcsMTE4LDEwMSwxMTQsOTgsCi0gICAgMTExLDExNSwxMDEsMTE0LDEwLDAsMCwwLDIxOCw1LDExMiwxMTQsMTA1LDExMCwxMTYsMTE0LAotICAgIDQ5LDAsMCwwLDIxOCw2LDExNSwxMTYsMTAwLDEwMSwxMTQsMTE0LDQxLDMsMTE0LDc3LAotICAgIDAsMCwwLDExNCwxMDAsMCwwLDAsMjE4LDQsOTcsMTE0LDEwMywxMTUsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE2LDk1LAotICAgIDExOCwxMDEsMTE0LDk4LDExMSwxMTUsMTAxLDk1LDEwOSwxMDEsMTE1LDExNSw5NywxMDMsMTAxLDExOCwKLSAgICAxLDAsMCwxMTUsOCwwLDAsMCwwLDIsMTgsMSwxNSwxLDEwLDEsCi0gICAgMTE0LDEwNywwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMywwLAotICAgIDAsMCwxMSwwLDAsMCwzLDAsMCwwLDExNSw4NCwwLDAsMCwxMDAsCi0gICAgMSwwLDEzNSwwLDAsMTAyLDEsMCwxMDAsMiwwLDEwMCwzLDAsMTM0LDEsCi0gICAgMCwxMjUsMSwwLDEyMSwxMywwLDExNiwwLDAsMTA2LDEsMCwxMjUsMiwwLAotICAgIDg3LDExMCwzMCwwLDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNjYsMCwxLDEsCi0gICAgMSwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCwxMjUsMiwwLDg5LDExMCwxLAotICAgIDAsODgsMTI0LDIsMCwxMjQsMSwwLDEzNiwwLDAsMTMxLDIsMCwxLDEyNCwKLSAgICAxLDAsODMsNDEsNiwxMjIsMjUyLDY4LDEwMSw5OSwxMTEsMTE0LDk3LDExNiwxMTEsMTE0LAotICAgIDMyLDExNiwxMTEsMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LDEwNCw5NywxMTYsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsMTAxLDEwNSwxMTAsMTAzLAotICAgIDMyLDExNCwxMDEsMTEzLDExNywxMDEsMTE1LDExNiwxMDEsMTAwLDMyLDEwOSw5NywxMTYsOTksMTA0LAotICAgIDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsCi0gICAgMzIsMzIsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiw5OSw5NywxMTAsMzIsMTA0LDk3LAotICAgIDExMCwxMDAsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwMiwKLSAgICAxMDUsMTE0LDExNSwxMTYsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDQwLDExNSwKLSAgICAxMDEsMTA4LDEwMiw0MSwzMiwxMDksMTE3LDExNSwxMTYsMzIsMTAwLDEwMSwxMDIsMTA1LDExMCwxMDEsCi0gICAgMzIsOTUsMTEwLDk3LDEwOSwxMDEsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDExNSwxMDEsOTksMTExLDExMCwxMDAsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LAotICAgIDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsOTksMTExLDEwOSwxMTIsOTcsMTE0LDEwMSwxMDAsCi0gICAgMzIsOTcsMTAzLDk3LDEwNSwxMTAsMTE1LDExNiw0NiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsOTksMTExLDEwOSwxMTIsOTcsMTE0LDEwNSwxMTUsMTExLDExMCwzMiwxMDIsOTcsMTA1LDEwOCwKLSAgICAxMTUsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LDExNCwKLSAgICAxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiw3OCw5OSwyLDAsMCwwLDAsMCwwLDAsNCwwLDAsCi0gICAgMCw1LDAsMCwwLDMxLDAsMCwwLDExNSw4OSwwLDAsMCwxMjQsMSwKLSAgICAwLDEwMCwwLDAsMTA3LDgsMCwxMTQsMjQsMCwxMjQsMCwwLDEwNiwwLDAsCi0gICAgMTI1LDEsMCwxMTAsNDYsMCwxMjQsMCwwLDEwNiwwLDAsMTI0LDEsMCwxMDcsCi0gICAgMywwLDExNCw3MCwwLDExNiwxLDAsMTAwLDEsMCwxMjQsMCwwLDEwNiwwLAotICAgIDAsMTI0LDEsMCwxMDIsMiwwLDIyLDEwMCwyLDAsMTI0LDEsMCwxMzEsMSwKLSAgICAxLDEzMCwxLDAsMTM2LDAsMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwKLSAgICAxMjQsMywwLDE0MiwyLDAsODMsNDEsMyw3OCwxMjIsMzAsMTA4LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwzNywxMTUsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LAotICAgIDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMzIsMzcsMTE1LDIxOCw0LDExMCw5NywxMDksMTAxLAotICAgIDQxLDIsMTE0LDEwOCwwLDAsMCwyMTgsMTEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwKLSAgICAxMTQsMTE0LDExMSwxMTQsNDEsNCwyMTgsNCwxMTUsMTAxLDEwOCwxMDIsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsMTA2LDAsMCwwLDkwLDYsMTA3LDExOSw5NywxMTQsMTAzLDExNSw0MSwxLAotICAgIDIxOCw2LDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCw0LDAsMCwwLDExNCw2LDAsCi0gICAgMCwwLDIxOCwxOSw5NSw5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSw5NSwKLSAgICAxMTksMTE0LDk3LDExMiwxMTIsMTAxLDExNCwxMzQsMSwwLDAsMTE1LDEyLDAsMCwwLAotICAgIDAsMSwxMiwxLDEyLDEsMTUsMSw2LDEsMjUsMSwxMjIsNDAsOTUsOTksCi0gICAgMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsCi0gICAgMTE1LDYyLDQ2LDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDk1LDExOSwKLSAgICAxMTQsOTcsMTEyLDExMiwxMDEsMTE0LDk5LDIsMCwwLDAsMCwwLDAsMCwzLAotICAgIDAsMCwwLDcsMCwwLDAsODMsMCwwLDAsMTE1LDkyLDAsMCwwLAotICAgIDEyMCw2NiwwLDEwMCwxLDAsMTAwLDIsMCwxMDAsMywwLDEwMCw0LDAsMTAzLAotICAgIDQsMCw2OCw5Myw0NiwwLDEyNSwyLDAsMTE2LDAsMCwxMjQsMSwwLDEyNCwKLSAgICAyLDAsMTMxLDIsMCwxMTQsMTksMCwxMTYsMSwwLDEyNCwwLDAsMTI0LDIsCi0gICAgMCwxMTYsMiwwLDEyNCwxLDAsMTI0LDIsMCwxMzEsMiwwLDEzMSwzLDAsCi0gICAgMSwxMTMsMTksMCw4NywxMjQsMCwwLDEwNiwzLDAsMTA2LDQsMCwxMjQsMSwKLSAgICAwLDEwNiwzLDAsMTMxLDEsMCwxLDEwMCwwLDAsODMsNDEsNSw3OCwyMTgsCi0gICAgMTAsOTUsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsOTUsMjE4LDgsOTUsOTUsMTEwLAotICAgIDk3LDEwOSwxMDEsOTUsOTUsMjE4LDEyLDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksCi0gICAgMTAxLDk1LDk1LDIxOCw3LDk1LDk1LDEwMCwxMTEsOTksOTUsOTUsNDEsNSwyMTgsNywKLSAgICAxMDQsOTcsMTE1LDk3LDExNiwxMTYsMTE0LDIxOCw3LDExNSwxMDEsMTE2LDk3LDExNiwxMTYsMTE0LAotICAgIDIxOCw3LDEwMywxMDEsMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksCi0gICAgMTE2LDk1LDk1LDIxOCw2LDExNywxMTIsMTAwLDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwKLSAgICAxMDEsMTE5LDkwLDMsMTExLDEwOCwxMDAsMTE0LDU0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCw1LDk1LDExOSwxMTQsCi0gICAgOTcsMTEyLDE0NSwxLDAsMCwxMTUsOCwwLDAsMCwwLDEsMjUsMSwxNSwKLSAgICAxLDI5LDEsMTIyLDI2LDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLAotICAgIDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw5NSwxMTksMTE0LDk3LDExMiw0MSwKLSAgICAzLDIxOCwxMCw5NSw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCw5NywxMTIsMTE0LDEyMiwwLAotICAgIDAsMCwyMTgsOSw3OCw5NywxMDksMTAxLDY5LDExNCwxMTQsMTExLDExNCw0MSwzLDExNCwKLSAgICAxMTEsMCwwLDAsMTE0LDExMiwwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDQxLDEsMTE0LDExMSwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsCi0gICAgMTEsOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsMTI2LDEsMCwwLAotICAgIDExNSwxNCwwLDAsMCwwLDgsMjEsNywzLDEsMTMsMSwxMywyLDE3LAotICAgIDUsMTMsMSwxMTQsMTI1LDAsMCwwLDk5LDIsMCwwLDAsMCwwLDAsCi0gICAgMCw1LDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDg0LDAsCi0gICAgMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMSwwLDEzMSwxLDAsOTIsMiwKLSAgICAwLDEyNSwyLDAsMTI1LDMsMCwxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwKLSAgICAxMTQsODAsMCwxMTYsMSwwLDEyNCwzLDAsMTMxLDEsMCwxMTQsODAsMCwxMDAsCi0gICAgMiwwLDEyNSw0LDAsMTE2LDIsMCwxMDYsMywwLDEyNCw0LDAsMTA2LDQsCi0gICAgMCwxMjQsMywwLDEwMCwzLDAsMjUsMTMxLDEsMCwxMTYsNSwwLDEzMSwyLAotICAgIDAsMSwxMjQsMiwwLDgzLDQxLDQsMTIyLDE1NSw4NCwxMTQsMTIxLDMyLDExNiwxMTEsCi0gICAgMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiw5OCwxMjEsMzIsMTAwLDEwMSwxMDgsMTAxLDEwMywKLSAgICA5NywxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDExMSwxMCwzMiwzMiwzMiwzMiwxMTUsMTAxLDEwOCwKLSAgICAxMDIsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDAsNDEsNDYsCi0gICAgMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwKLSAgICAxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDMyLAotICAgIDEwNSwxMTAsMzIsMTAyLDk3LDExOCwxMTEsMTE0LDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMTAsMTAwLAotICAgIDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDQwLDQxLDQ2LDEwLAotICAgIDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw0NCw3OCwxMTEsMTE2LDMyLDEwNSwxMDksMTEyLDExMSwKLSAgICAxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsCi0gICAgMTIzLDEyNSw1OCwzMiwxMDksMTA1LDExNSwxMTUsMTA1LDExMCwxMDMsMzIsOTUsOTUsMTA1LDExMCwKLSAgICAxMDUsMTE2LDk1LDk1LDExNCw2MSwwLDAsMCw0MSw2LDIxOCwxMSwxMDIsMTA1LDExMCwKLSAgICAxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTQsMzMsMCwwLDAsMTE0LDYyLDAsCi0gICAgMCwwLDExNCw2MywwLDAsMCwxMTQsNDksMCwwLDAsMjE4LDEzLDczLDEwOSwKLSAgICAxMTIsMTExLDExNCwxMTYsODcsOTcsMTE0LDExMCwxMDUsMTEwLDEwMyw0MSw1LDExNCwxMTAsMCwKLSAgICAwLDAsMjE4LDgsMTAyLDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDIxOCw2LDEwOCwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMjE4LDgsMTEyLDExMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDExNSwyMTgsMywKLSAgICAxMDksMTE1LDEwMywxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwyMTgsMTcsOTUsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDk1LDExNSwxMDQsMTA1LDEwOSwxNTQsMSwwLDAsMTE1LDEwLDAsMCwwLDAsMTAsCi0gICAgMjEsMSwyNCwxLDYsMSwyOSwxLDExNCwxMzIsMCwwLDAsOTksNCwwLAotICAgIDAsMCwwLDAsMCwwLDExLDAsMCwwLDE5LDAsMCwwLDY3LDAsCi0gICAgMCwwLDExNSwyNDAsMSwwLDAsMTA1LDAsMCwxMjUsNCwwLDEyNCwyLDAsCi0gICAgMTAwLDEsMCwxMDcsOSwwLDExNCwzMSwwLDEyNCwyLDAsMTI0LDQsMCwxMDAsCi0gICAgMiwwLDYwLDExMCw2LDAsMTAwLDMsMCwxMjUsMiwwLDEyNCwzLDAsMTAwLAotICAgIDEsMCwxMDcsOSwwLDExNCw1OSwwLDEyNCwzLDAsMTI0LDQsMCwxMDAsNCwKLSAgICAwLDYwLDEyNCwwLDAsMTAwLDEsMCwxMDAsNSwwLDEzMywyLDAsMjUsMTI1LAotICAgIDUsMCwxMjQsMCwwLDEwMCw1LDAsMTAwLDYsMCwxMzMsMiwwLDI1LDEyNSwKLSAgICA2LDAsMTI0LDAsMCwxMDAsNiwwLDEwMCw3LDAsMTMzLDIsMCwyNSwxMjUsCi0gICAgNywwLDEyNCw1LDAsMTE2LDAsMCwxMDcsMywwLDExNCwxNjgsMCwxMDAsOCwKLSAgICAwLDEwNiwxLDAsMTI0LDIsMCwxMjQsNSwwLDEzMSwyLDAsMTI1LDgsMCwKLSAgICAxMTYsMiwwLDEwMCw5LDAsMTI0LDgsMCwxMzEsMiwwLDEsMTE2LDMsMCwKLSAgICAxMjQsOCwwLDEyNCw0LDAsMTQxLDEsMCwxMzAsMSwwLDExMCwxMTksMCwxMTYsCi0gICAgNCwwLDEyNCw2LDAsMTMxLDEsMCwxMDAsNSwwLDEwNywzLDAsMTE0LDIyOSwKLSAgICAwLDEwMCwxMCwwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsCi0gICAgMTE2LDIsMCwxMDAsOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiw1LDAsCi0gICAgMTI0LDgsMCwxMzEsMSwwLDEzMCwxLDAsMTEwLDU4LDAsMTE2LDQsMCwxMjQsCi0gICAgNywwLDEzMSwxLDAsMTAwLDUsMCwxMDcsMywwLDExNCwzMSwxLDEwMCwxMSwKLSAgICAwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSw4LDAsMTE2LDIsMCwKLSAgICAxMDAsOSwwLDEyNCw4LDAsMTMxLDIsMCwxLDExNiw1LDAsMTI0LDgsMCwKLSAgICAxMzEsMSwwLDEzMCwxLDAsMTI0LDEsMCwxMDAsMSwwLDEwNyw5LDAsMTE0LAotICAgIDIyNiwxLDEyMSwyMCwwLDExNiw2LDAsMTI0LDEsMCwxMDAsMTIsMCwyNSwxMzEsCi0gICAgMSwwLDEyNSw5LDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLDEwNywxMCwwLAotICAgIDExNCw4MywxLDEsMSwxLDg5LDExMCw2MiwwLDg4LDExNiw4LDAsMTI0LDYsCi0gICAgMCwxMzEsMSwwLDEyNCw5LDAsMTA3LDMsMCwxMTQsMTQ1LDEsMTAwLDEzLDAsCi0gICAgMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDgsMCwxMTYsMiwwLDEwMCwKLSAgICA5LDAsMTI0LDgsMCwxMzEsMiwwLDEsMTE2LDMsMCwxMjQsOCwwLDEyNCwKLSAgICA0LDAsMTQxLDEsMCwxMzAsMSwwLDEyMSwxOCwwLDEyNCwxLDAsMTAwLDE0LAotICAgIDAsMjUsMTAwLDE1LDAsNjQsMTI1LDEwLDAsODcsMTEwLDE4LDAsNCwxMTYsNywKLSAgICAwLDEwNywxMCwwLDExNCwxODMsMSwxLDEsMSw4OSwxMTAsNDMsMCw4OCwxMTYsCi0gICAgOCwwLDEyNCw3LDAsMTMxLDEsMCwxMjQsMTAsMCwxMDcsMywwLDExNCwyMjYsCi0gICAgMSwxMTYsMywwLDEwMCwxMywwLDEwNiwxLDAsMTI0LDIsMCwxMzEsMSwwLAotICAgIDEyNCw0LDAsMTQxLDEsMCwxMzAsMSwwLDEyNCwwLDAsMTAwLDcsMCwxMDAsCi0gICAgMSwwLDEzMywyLDAsMjUsODMsNDEsMTYsOTcsMTIyLDEsMCwwLDg2LDk3LAotICAgIDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTA0LDEwMSw5NywxMDAsMTAxLAotICAgIDExNCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTUsMTE1LDEwMSwxMDAsNDUsCi0gICAgMTA1LDExMCwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiw5NywxMDMsOTcsMTA1LAotICAgIDExMCwxMTUsMTE2LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDExNiw5NywxMTYsMTE1LAotICAgIDMyLDQwLDEwNSwxMDIsMTAsMzIsMzIsMzIsMzIsMTAzLDEwNSwxMTgsMTAxLDExMCw0MSwzMiwKLSAgICA5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsCi0gICAgMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDExNiwxMDQsOTcsMTE2LDMyLAotICAgIDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsOTksMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMTAwLDMyLAotICAgIDk4LDEyMSwzMiw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSw0MCw0MSw0NiwxMCwxMCwzMiwKLSAgICAzMiwzMiwzMiw2NSwxMDgsMTA4LDMyLDExMSwxMTYsMTA0LDEwMSwxMTQsMzIsOTcsMTE0LDEwMywKLSAgICAxMTcsMTA5LDEwMSwxMTAsMTE2LDExNSwzMiw5NywxMTQsMTAxLDMyLDExNywxMTUsMTAxLDEwMCwzMiwKLSAgICAxMTYsMTExLDMyLDEwMSwxMTAsMTA0LDk3LDExMCw5OSwxMDEsMzIsMTAxLDExNCwxMTQsMTExLDExNCwKLSAgICAzMiwxMTQsMTAxLDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwKLSAgICAzMiw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLAotICAgIDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwOSw5NywxMDMsMTA1LDk5LDMyLDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsMzIsMTA1LDExNSwzMiwKLSAgICAxMDUsMTEwLDk5LDExMSwxMTQsMTE0LDEwMSw5OSwxMTYsMzIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDUsMTE1LDEwLDMyLDMyLDMyLAotICAgIDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTE1LDExNiw5NywKLSAgICAxMDgsMTAxLDQ2LDMyLDY5LDc5LDcwLDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLAotICAgIDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwMCw5NywxMTYsOTcsMzIsMTA1LDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDExNiwxMTEsCi0gICAgMzIsOTgsMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwxMTQsMTE3LDExMCw5OSw5NywxMTYsMTAxLAotICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwxMTQsMTA4LDAsMCwwLDEyMiwxMCwKLSAgICA2MCw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw2MiwxMTQsMzcsMCwwLDAsMTE0LAotICAgIDE0LDAsMCwwLDIzMyw4LDAsMCwwLDIzMywxMiwwLDAsMCwxMjIsMzAsCi0gICAgOTgsOTcsMTAwLDMyLDEwOSw5NywxMDMsMTA1LDk5LDMyLDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsCi0gICAgMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSw1OCwzMiwxMjMsMzMsMTE0LDEyNSwxMjIsMiwKLSAgICAxMjMsMTI1LDEyMiw0MywxMTQsMTAxLDk3LDk5LDEwNCwxMDEsMTAwLDMyLDY5LDc5LDcwLDMyLAotICAgIDExOSwxMDQsMTA1LDEwOCwxMDEsMzIsMTE0LDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNSwKLSAgICAxMDksMTAxLDExNSwxMTYsOTcsMTA5LDExMiwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDEyMiwKLSAgICA0OCwxMTQsMTAxLDk3LDk5LDEwNCwxMDEsMTAwLDMyLDY5LDc5LDcwLDMyLDExOSwxMDQsMTA1LAotICAgIDEwOCwxMDEsMzIsMTE0LDEwMSw5NywxMDAsMTA1LDExMCwxMDMsMzIsMTE1LDEwNSwxMjIsMTAxLDMyLAotICAgIDExMSwxMDIsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDUsMTEwLDMyLDEyMywzMywxMTQsCi0gICAgMTI1LDIxOCw1LDEwOSwxMTYsMTA1LDEwOSwxMDEsMTIyLDI2LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKLSAgICAxMDAsMTAxLDMyLDEwNSwxMTUsMzIsMTE1LDExNiw5NywxMDgsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDEyMywzMywxMTQsMTI1LDIxOCw0LDExNSwxMDUsMTIyLDEwMSwxMDgsMywwLDAsMCwyNTUsCi0gICAgMTI3LDI1NSwxMjcsMywwLDQxLDksMjE4LDEyLDc3LDY1LDcxLDczLDY3LDk1LDc4LAotICAgIDg1LDc3LDY2LDY5LDgyLDExNCw0OSwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwKLSAgICAxMDksMCwwLDAsMTE0LDMzLDAsMCwwLDIxOCw4LDY5LDc5LDcwLDY5LDExNCwKLSAgICAxMTQsMTExLDExNCwxMTQsMTYsMCwwLDAsMjE4LDgsNzUsMTAxLDEyMSw2OSwxMTQsMTE0LAotICAgIDExMSwxMTQsMTE0LDIxLDAsMCwwLDQxLDExLDExNCw1NSwwLDAsMCwyMTgsMTIsCi0gICAgMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMTE0LDEwOCwwLDAsCi0gICAgMCwxMTQsMzcsMCwwLDAsOTAsMTEsMTAxLDEyMCw5OSw5NSwxMDAsMTAxLDExNiw5NywKLSAgICAxMDUsMTA4LDExNSw5MCw1LDEwOSw5NywxMDMsMTA1LDk5LDkwLDEzLDExNCw5NywxMTksOTUsCi0gICAgMTE2LDEwNSwxMDksMTAxLDExNSwxMTYsOTcsMTA5LDExMiw5MCw4LDExNCw5NywxMTksOTUsMTE1LAotICAgIDEwNSwxMjIsMTAxLDExNCw3NywwLDAsMCwyMTgsMTIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKLSAgICA5NSwxMDksMTE2LDEwNSwxMDksMTAxLDIxOCwxMSwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNSwKLSAgICAxMDUsMTIyLDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAotICAgIDAsMCwyMTgsMjUsOTUsMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTgsMTIxLAotICAgIDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTUsMTA0LDEwMSw5NywxMDAsMTAxLDExNCwxNzEsMSwwLAotICAgIDAsMTE1LDc2LDAsMCwwLDAsMTEsNiwxLDEyLDEsMTMsMyw2LDEsCi0gICAgMTIsMSwxMCwxLDE2LDEsMTYsMSwxNiwxLDEyLDEsMTgsMSwxMywxLAotICAgIDE4LDEsMTgsMSwxNSwxLDEzLDEsMTUsMSwxOCwxLDE1LDEsMTMsMSwKLSAgICAxMiwxLDEyLDEsMywxLDIwLDEsMTMsMSw1LDIsMTgsMSwxNSwxLAotICAgIDEzLDEsMTUsMSwzLDEsMTgsMSwxMywxLDUsMiwxOCwxLDE1LDEsCi0gICAgOSwxLDExNCwxNDMsMCwwLDAsOTksNCwwLDAsMCwwLDAsMCwwLAotICAgIDUsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsMTEyLDAsMCwKLSAgICAwLDExNiwwLDAsMTA2LDEsMCwxMjQsMCwwLDEzMSwxLDAsMTI1LDQsMCwKLSAgICAxMTYsMiwwLDEyNCw0LDAsMTE2LDMsMCwxMzEsMiwwLDExNCw3NSwwLDExNiwKLSAgICA0LDAsMTAwLDEsMCwxMjQsMiwwLDEzMSwyLDAsMSwxMjQsMywwLDEwMCwKLSAgICAyLDAsMTA3LDksMCwxMTQsNzEsMCwxMTYsNSwwLDEwNiw2LDAsMTI0LDQsCi0gICAgMCwxMjQsMywwLDEzMSwyLDAsMSwxMjQsNCwwLDgzLDExNiw3LDAsMTAwLAotICAgIDMsMCwxMDYsOCwwLDEyNCwyLDAsMTMxLDEsMCwxMDAsNCwwLDEyNCwxLAotICAgIDAsMTAwLDUsMCwxMjQsMiwwLDEzMSwxLDIsMTMwLDEsMCwxMDAsMiwwLAotICAgIDgzLDQxLDYsMTIyLDYwLDY3LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDMyLDk4LDEyMSwxMTYsCi0gICAgMTAxLDk5LDExMSwxMDAsMTAxLDMyLDk3LDExNSwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMDEsCi0gICAgMTAwLDMyLDk4LDEyMSwzMiw5NSwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OCwKLSAgICAxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMDQsMTAxLDk3LDEwMCwxMDEsMTE0LDQwLDQxLAotICAgIDQ2LDEyMiwyMSw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTAyLAotICAgIDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDc4LDEyMiwyMyw3OCwxMTEsMTEwLDQ1LDk5LAotICAgIDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDUsMTEwLDMyLDEyMywzMywKLSAgICAxMTQsMTI1LDExNCwxMDgsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDksMjE4LDcsCi0gICAgMTA5LDk3LDExNCwxMTUsMTA0LDk3LDEwOCw5MCw1LDEwOCwxMTEsOTcsMTAwLDExNSwyMTgsMTAsCi0gICAgMTA1LDExNSwxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwyMTgsMTAsOTUsOTksMTExLDEwMCwKLSAgICAxMDEsOTUsMTE2LDEyMSwxMTIsMTAxLDExNCwxMDcsMCwwLDAsMjE4LDQsOTUsMTA1LDEwOSwKLSAgICAxMTIsOTAsMTYsOTUsMTAyLDEwNSwxMjAsOTUsOTksMTExLDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsCi0gICAgOTcsMTA5LDEwMSwxMTQsMTA5LDAsMCwwLDExNCw0OSwwLDAsMCw0MSw1LDExNCwKLSAgICA1NSwwLDAsMCwxMTQsMTA4LDAsMCwwLDExNCw5MSwwLDAsMCwxMTQsOTIsCi0gICAgMCwwLDAsMjE4LDQsOTksMTExLDEwMCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE3LDk1LDk5LDExMSwxMDksMTEyLDEwNSwKLSAgICAxMDgsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDIyNiwxLDAsMCwxMTUsCi0gICAgMTYsMCwwLDAsMCwyLDE1LDEsMTUsMSwxMywxLDEyLDEsMTYsMSwKLSAgICA0LDIsMTgsMSwxMTQsMTQ5LDAsMCwwLDExNCw2MSwwLDAsMCw5OSwzLAotICAgIDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSw3NiwwLDAsMCwxMTYsMCwwLDExNiwxLDAsMTMxLDEsCi0gICAgMCwxMjUsMywwLDEyNCwzLDAsMTA2LDIsMCwxMTYsMywwLDEyNCwxLDAsCi0gICAgMTMxLDEsMCwxMzEsMSwwLDEsMTI0LDMsMCwxMDYsMiwwLDExNiwzLDAsCi0gICAgMTI0LDIsMCwxMzEsMSwwLDEzMSwxLDAsMSwxMjQsMywwLDEwNiwyLDAsCi0gICAgMTE2LDQsMCwxMDYsNSwwLDEyNCwwLDAsMTMxLDEsMCwxMzEsMSwwLDEsCi0gICAgMTI0LDMsMCw4Myw0MSwxLDEyMiw4MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiwKLSAgICA5NywzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwKLSAgICAxMTYsMTExLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExOSwxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsMTE3LDExNiwzMiwxMTYsMTExLDMyLDk3LAotICAgIDMyLDk4LDEyMSwxMTYsMTAxLDQ1LDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDEwMCwxMCwzMiwKLSAgICAzMiwzMiwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsNDEsNiwyMTgsOSw5OCwxMjEsMTE2LDEwMSwKLSAgICA5NywxMTQsMTE0LDk3LDEyMSwxMTQsMTM3LDAsMCwwLDIxOCw2LDEwMSwxMjAsMTE2LDEwMSwKLSAgICAxMTAsMTAwLDExNCwxOSwwLDAsMCwxMTQsMTQ0LDAsMCwwLDkwLDUsMTAwLDExNywKLSAgICAxMDksMTEyLDExNSw0MSw0LDExNCwxNDgsMCwwLDAsMTE0LDEzNSwwLDAsMCwxMTQsCi0gICAgMTQyLDAsMCwwLDExNCw1NSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsOTUsOTksMTExLDEwMCwxMDEsOTUsCi0gICAgMTE2LDExMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMzgsMSwwLDAsMTE1LAotICAgIDEwLDAsMCwwLDAsMywxMiwxLDE5LDEsMTksMSwyMiwxLDExNCwxNTIsCi0gICAgMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsCi0gICAgNCwwLDAsMCw2NywwLDAsMCwxMTUsODksMCwwLDAsMTAwLDEsMCwKLSAgICAxMDAsMiwwLDEwOCwwLDAsMTI1LDEsMCwxMTYsMSwwLDEwNiwyLDAsMTI0LAotICAgIDAsMCwxMzEsMSwwLDEwNiwzLDAsMTI1LDIsMCwxMjQsMSwwLDEwNiw0LAotICAgIDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwzLDAsMTE2LDEsMCwxMDYsNSwwLAotICAgIDEwMCwyLDAsMTAwLDMsMCwxMzEsMiwwLDEyNSw0LDAsMTI0LDQsMCwxMDYsCi0gICAgNiwwLDEyNCwwLDAsMTA2LDYsMCwxMjQsMywwLDEwMCwxLDAsMjUsMTMxLAotICAgIDEsMCwxMzEsMSwwLDgzLDQxLDQsMTIyLDEyMSw2OCwxMDEsOTksMTExLDEwMCwxMDEsCi0gICAgMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDExNCwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LAotICAgIDEwNSwxMTAsMTAzLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsMzIsCi0gICAgOTcsMTEwLDEwMCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsCi0gICAgMTE2LDExNCwxMDUsMTEwLDEwMyw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NSwxMTAsMTA1LDExOCwKLSAgICAxMDEsMTE0LDExNSw5NywxMDgsMzIsMTEwLDEwMSwxMTksMTA4LDEwNSwxMTAsMTAxLDMyLDExNSwxMTcsCi0gICAgMTEyLDExMiwxMTEsMTE0LDExNiwzMiwxMDUsMTE1LDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMDUsMTEwLAotICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDEsOTksMTExLDEwMCwxMDUsMTEwLDEwMyw0NiwxMCwzMiwKLSAgICAzMiwzMiwzMiwxMTQsNjEsMCwwLDAsNzgsODQsNDEsNywyMTgsOCwxMTYsMTExLAotICAgIDEwNywxMDEsMTEwLDEwNSwxMjIsMTAxLDExNCw1MSwwLDAsMCw5MCw3LDY2LDEyMSwxMTYsCi0gICAgMTAxLDExNSw3Myw3OSw5MCw4LDExNCwxMDEsOTcsMTAwLDEwOCwxMDUsMTEwLDEwMSw5MCwxNSwKLSAgICAxMDAsMTAxLDExNiwxMDEsOTksMTE2LDk1LDEwMSwxMTAsOTksMTExLDEwMCwxMDUsMTEwLDEwMyw5MCwKLSAgICAyNSw3MywxMTAsOTksMTE0LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTA4LDc4LDEwMSwxMTksMTA4LAotICAgIDEwNSwxMTAsMTAxLDY4LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMjE4LDYsMTAwLDEwMSw5OSwxMTEsCi0gICAgMTAwLDEwMSw0MSw1LDIxOCwxMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDk4LDEyMSwxMTYsCi0gICAgMTAxLDExNSwxMTQsMTUzLDAsMCwwLDkwLDIxLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsCi0gICAgOTgsMTIxLDExNiwxMDEsMTE1LDk1LDExNCwxMDEsOTcsMTAwLDEwOCwxMDUsMTEwLDEwMSwyMTgsOCwKLSAgICAxMDEsMTEwLDk5LDExMSwxMDAsMTA1LDExMCwxMDMsOTAsMTUsMTEwLDEwMSwxMTksMTA4LDEwNSwxMTAsCi0gICAgMTAxLDk1LDEwMCwxMDEsOTksMTExLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMywxMDAsMTAxLDk5LDExMSwxMDAsMTAxLAotICAgIDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMjQ4LDEsMCwwLDExNSwxMCwwLDAsMCwKLSAgICAwLDUsMTIsMSwxOCwxLDE1LDEsMTgsMSwxMTQsMTU3LDAsMCwwLDExNCwKLSAgICAxMjksMCwwLDAsMjE4LDI2LDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsCi0gICAgMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwKLSAgICA5OSwyLDAsMCwwLDIsMCwwLDAsOSwwLDAsMCwxOSwwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsODksMSwwLDAsMTI0LDEsMCwxMDAsMSwwLAotICAgIDEwNyw4LDAsMTE0LDczLDAsMTAwLDIsMCwxMjUsMSwwLDExNiwwLDAsMTI0LAotICAgIDIsMCwxMDAsMywwLDEzMSwyLDAsMTE0LDczLDAsMTIxLDE5LDAsMTI0LDIsCi0gICAgMCwxMDYsMSwwLDEyNCwwLDAsMTMxLDEsMCwxMjUsMSwwLDg3LDExMCwxOCwKLSAgICAwLDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNzIsMCwxLDEsMSw4OSwxMTAsCi0gICAgMSwwLDg4LDExNiwzLDAsMTA2LDQsMCwxMjQsMCwwLDEyNCwyLDAsMTAwLAotICAgIDQsMCwxMjQsMSwwLDEzMSwyLDEsMTI1LDQsMCwxMDAsNSwwLDEyNCw0LAotICAgIDAsOTUsNSwwLDEyNCwyLDAsMTAwLDEsMCwxMDcsOCwwLDExNCwxOTQsMCwKLSAgICAxMjAsNzMsMCwxMTYsNiwwLDEzMSwwLDAsNjgsOTMsNTgsMCw5MiwyLDAsCi0gICAgMTI1LDUsMCwxMjUsNiwwLDEyNCwxLDAsMTA2LDcsMCwxMTYsOCwwLDEyNCwKLSAgICA2LDAsMTMxLDEsMCwxMzEsMSwwLDExNCwxMjgsMCwxMjQsNSwwLDEyNCwwLAotICAgIDAsMTI0LDEsMCwxMzEsMiwwLDEyNSwyLDAsMTI0LDIsMCwxMjQsNCwwLAotICAgIDk1LDksMCw4MCwxMTMsMTI4LDAsODcsMTAwLDEsMCw4MywxMjQsMywwLDExNiwKLSAgICAxMCwwLDEwNyw4LDAsMTE0LDIzLDEsMTE2LDAsMCwxMjQsMiwwLDEwMCw2LAotICAgIDAsMTMxLDIsMCwxMTQsMzIsMSwxMjEsMTksMCwxMjQsMiwwLDEwNiwxMSwwLAotICAgIDEyNCwwLDAsMTMxLDEsMCwxMjUsNywwLDg3LDExMCwxOCwwLDQsMTE2LDIsCi0gICAgMCwxMDcsMTAsMCwxMTQsNCwxLDEsMSwxLDg5LDExMywzMiwxLDg4LDEyNCwKLSAgICA3LDAsMTE0LDMyLDEsMTAzLDAsMCwxMjQsNCwwLDk1LDEyLDAsMTEwLDksCi0gICAgMCwxMjQsMywwLDEyNCw0LDAsOTUsMTIsMCwxMjQsNCwwLDEwNiwxMiwwLAotICAgIDEwMywwLDAsMTA3LDIsMCwxMTQsODUsMSwxMjQsMSwwLDExNCw4NSwxLDExNiwKLSAgICAxMywwLDEyNCwxLDAsMTMxLDEsMCwxMDAsNywwLDI1LDEyNSw4LDAsMTI0LAotICAgIDQsMCwxMDYsMTIsMCwxMDYsMTQsMCwxMjQsOCwwLDEzMSwxLDAsMSwxMjQsCi0gICAgNCwwLDgzLDQxLDgsOTcsNjEsMSwwLDAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwKLSAgICAzMiw5NywzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwzMiw5OCwKLSAgICA5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDk3LDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMDgsCi0gICAgMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMTEsCi0gICAgMzIsMTA1LDExMCwxMDAsMTA1LDk5LDk3LDExNiwxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywzMiwxMTIsCi0gICAgOTcsOTksMTA3LDk3LDEwMywxMDEsNDQsMzIsMTE1LDEwMSwxMTYsMTAsMzIsMzIsMzIsMzIsCi0gICAgMTE1LDExNyw5OCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsCi0gICAgOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMTE1LDMyLDExNiwxMTEsMzIsOTcsMzIsCi0gICAgMTA4LDEwNSwxMTUsMTE2LDMyLDExMSwxMDIsMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LAotICAgIDEyMSwzMiwxMTIsOTcsMTE2LDEwNCwxMTUsNDYsMzIsMzIsNjUsMTEwLDEwLDMyLDMyLDMyLAotICAgIDMyLDEwMSwxMDksMTEyLDExNiwxMjEsMzIsMTA4LDEwNSwxMTUsMTE2LDMyLDEwNSwxMTUsMzIsMTE1LAotICAgIDExNywxMDIsMTAyLDEwNSw5OSwxMDUsMTAxLDExMCwxMTYsNDQsMzIsMTE2LDEwNCwxMTEsMTE3LDEwMywKLSAgICAxMDQsMzIsMTA1LDExNiwxMTUsMzIsMTEwLDExMSwxMTYsMzIsMTExLDExNiwxMDQsMTAxLDExNCwxMTksCi0gICAgMTA1LDExNSwxMDEsMzIsMTE3LDExNSwxMDEsMTAyLDExNywxMDgsMzIsMTE2LDExMSwzMiwxMTYsMTA0LAotICAgIDEwMSwxMCwzMiwzMiwzMiwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMTUsMTIxLDExNSwKLSAgICAxMTYsMTAxLDEwOSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwOCwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMzIsMTA5LDExNywxMTUsMTE2LDMyLDExNiw5NywxMDcsMTAxLDMyLDk3LAotICAgIDMyLDExNSwxMTIsMTAxLDk5LDMyLDk3LDExNSwzMiwxMDUsMTE2LDExNSwzMiwxMTEsMTEwLDEwOCwKLSAgICAxMjEsMzIsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQwLDQxLDMyLDk3LDExNCwxMDMsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDksNjAsMTE3LDExMCwxMDcsMTEwLDExMSwKLSAgICAxMTksMTEwLDYyLDIxOCwxMiwxMDMsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwKLSAgICAxMDEsMjE4LDYsMTExLDExNCwxMDUsMTAzLDEwNSwxMTAsODQsMjE4LDEwLDEwNSwxMTUsOTUsMTEyLAotICAgIDk3LDk5LDEwNyw5NywxMDMsMTAxLDExNCw2MSwwLDAsMCw0MSwxNSwxMTQsMTE3LDAsCi0gICAgMCwwLDExNCwxNTksMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTIzLDAsMCwKLSAgICAwLDIxOCwxMCw3NywxMTEsMTAwLDExNywxMDgsMTAxLDgzLDExMiwxMDEsOTksOTAsMTMsOTUsCi0gICAgMTE1LDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDk3LDExNiwxMTYsMTE0LDIxOCwyNyw5NSwxMDMsCi0gICAgMTAxLDExNiw5NSwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCw5NSwxMDIsMTA1LDEwOCwKLSAgICAxMDEsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDk0LDAsMCwwLDExNCw5NSwKLSAgICAwLDAsMCwxMTQsMTI5LDAsMCwwLDIxOCw5LDk1LDgwLDc5LDgwLDg1LDc2LAotICAgIDY1LDg0LDY5LDExNCwxNjEsMCwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsNDAsMCwKLSAgICAwLDAsMjE4LDYsOTcsMTEyLDExMiwxMDEsMTEwLDEwMCw0MSw5LDExNCwxMDgsMCwwLAotICAgIDAsOTAsOCwxMDgsMTExLDk5LDk3LDExNiwxMDUsMTExLDExMCwxMTQsMTI5LDAsMCwwLAotICAgIDExNCwxNTgsMCwwLDAsMjE4LDQsMTE1LDExMiwxMDEsOTksMjE4LDEyLDEwOCwxMTEsOTcsCi0gICAgMTAwLDEwMSwxMTQsOTUsOTksMTA4LDk3LDExNSwxMTUsMjE4LDgsMTE1LDExNywxMDIsMTAyLDEwNSwKLSAgICAxMjAsMTAxLDExNSwxMTQsMTYxLDAsMCwwLDkwLDcsMTAwLDEwNSwxMTQsMTEwLDk3LDEwOSwKLSAgICAxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMjE4LDIzLDExNSwxMTIsMTAxLDk5LDk1LDEwMiwxMTQsMTExLDEwOSw5NSwxMDIsMTA1LDEwOCwxMDEsCi0gICAgOTUsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsOSwyLDAsMCwxMTUsNjAsMCwKLSAgICAwLDAsMCwxMiwxMiw0LDYsMSwxNSwyLDMsMSwxOSwxLDEzLDEsCi0gICAgNSw4LDI0LDEsOSwzLDEyLDEsMjIsMSwyMSwxLDE1LDEsOSwxLAotICAgIDUsMiw0LDMsMTIsMiwxNSwxLDMsMSwxOSwxLDEzLDEsNSwyLAotICAgIDYsMSwxMiwyLDksMSwxNSwxLDYsMSwxNiwxLDE2LDIsMTE0LDE2OSwKLSAgICAwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKLSAgICA1LDAsMCwwLDY0LDAsMCwwLDExNSwxMjEsMCwwLDAsMTAxLDAsMCwKLSAgICA5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLAotICAgIDIsMCw5MCw0LDAsMTAwLDMsMCw5MCw1LDAsMTAwLDQsMCw5MCw2LAotICAgIDAsMTAxLDcsMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDAsMCwxMzEsMSwwLAotICAgIDkwLDgsMCwxMDEsNywwLDEwMCw3LDAsMTAwLDgsMCwxMzIsMCwwLDEzMSwKLSAgICAxLDAsOTAsOSwwLDEwMSw3LDAsMTAwLDksMCwxMDAsOSwwLDEwMCwxMCwKLSAgICAwLDEwMCwxMSwwLDEzMiwyLDAsMTMxLDEsMCw5MCwxMCwwLDEwMSw3LDAsCi0gICAgMTAwLDksMCwxMDAsMTIsMCwxMDAsMTMsMCwxMzIsMSwwLDEzMSwxLDAsOTAsCi0gICAgMTEsMCwxMDAsOSwwLDgzLDQxLDE0LDIxOCwyMSw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LAotICAgIDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwxMjIsCi0gICAgNjIsNzcsMTAxLDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLAotICAgIDExNCwzMiwxMDIsMTExLDExNCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsMzIsMTAwLDEwMSwKLSAgICA5OSwxMDgsOTcsMTE0LDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwzMiw4NywxMDUsCi0gICAgMTEwLDEwMCwxMTEsMTE5LDExNSwzMiwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDQ2LDEyMiwKLSAgICA1OSw4MywxMTEsMTAyLDExNiwxMTksOTcsMTE0LDEwMSw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLAotICAgIDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsNjcsMTExLDExNCwxMDEsOTIsMTIzLDExNSwxMjEsMTE1LAotICAgIDk1LDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwxMjUsOTIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwKLSAgICAxMTUsOTIsMTIzLDEwMiwxMTcsMTA4LDEwOCwxMTAsOTcsMTA5LDEwMSwxMjUsMTIyLDY1LDgzLDExMSwKLSAgICAxMDIsMTE2LDExOSw5NywxMTQsMTAxLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsOTIsODAsMTIxLAotICAgIDExNiwxMDQsMTExLDExMCw2NywxMTEsMTE0LDEwMSw5MiwxMjMsMTE1LDEyMSwxMTUsOTUsMTE4LDEwMSwKLSAgICAxMTQsMTE1LDEwNSwxMTEsMTEwLDEyNSw5Miw3NywxMTEsMTAwLDExNywxMDgsMTAxLDExNSw5MiwxMjMsCi0gICAgMTAyLDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDEyNSw5Miw2OCwxMDEsOTgsMTE3LDEwMyw3MCwKLSAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxMSwwLDAsCi0gICAgMCw2NywwLDAsMCwxMTUsNjcsMCwwLDAsMTIxLDIzLDAsMTE2LDAsMCwKLSAgICAxMDYsMSwwLDExNiwwLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwyLDAsODMsCi0gICAgODcsMTEwLDM3LDAsNCwxMTYsMywwLDEwNywxMCwwLDExNCw2MiwwLDEsMSwKLSAgICAxLDExNiwwLDAsMTA2LDEsMCwxMTYsMCwwLDEwNiw0LDAsMTI0LDEsMCwKLSAgICAxMzEsMiwwLDgzLDg5LDExMCwxLDAsODgsMTAwLDAsMCw4Myw0MSwxLDc4LAotICAgIDQxLDUsMjE4LDcsOTUsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTAsNyw3OSwxMTIsMTAxLAotICAgIDExMCw3NSwxMDEsMTIxLDkwLDE3LDcyLDc1LDY5LDg5LDk1LDY3LDg1LDgyLDgyLDY5LAotICAgIDc4LDg0LDk1LDg1LDgzLDY5LDgyLDExNCw0MiwwLDAsMCw5MCwxOCw3Miw3NSwKLSAgICA2OSw4OSw5NSw3Niw3OSw2Nyw2NSw3Niw5NSw3Nyw2NSw2Nyw3Miw3Myw3OCw2OSwKLSAgICA0MSwyLDIxOCwzLDk5LDEwOCwxMTUsMTE0LDUsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE0LDk1LDExMSwxMTIsCi0gICAgMTAxLDExMCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDg3LDIsMCwwLDExNSwKLSAgICA4LDAsMCwwLDAsMiwzLDEsMjMsMSwxMywxLDEyMiwzNiw4NywxMDUsCi0gICAgMTEwLDEwMCwxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwKLSAgICAxMDAsMTAxLDExNCw0Niw5NSwxMTEsMTEyLDEwMSwxMTAsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsCi0gICAgMTE0LDEyMSw5OSwyLDAsMCwwLDAsMCwwLDAsNiwwLDAsMCwxNiwKLSAgICAwLDAsMCw2NywwLDAsMCwxMTUsMTQzLDAsMCwwLDEyNCwwLDAsMTA2LAotICAgIDAsMCwxMTQsMjEsMCwxMjQsMCwwLDEwNiwxLDAsMTI1LDIsMCwxMTAsOSwKLSAgICAwLDEyNCwwLDAsMTA2LDIsMCwxMjUsMiwwLDEyNCwyLDAsMTA2LDMsMCwKLSAgICAxMDAsMSwwLDEyNCwxLDAsMTAwLDIsMCwxMTYsNCwwLDEwNiw1LDAsMTAwLAotICAgIDAsMCwxMDAsMywwLDEzMywyLDAsMjUsMTMxLDAsMiwxMjUsMywwLDEyMSwKLSAgICA0NywwLDEyNCwwLDAsMTA2LDYsMCwxMjQsMywwLDEzMSwxLDAsMTQzLDI1LAotICAgIDAsMTI1LDQsMCwxMTYsNywwLDEwNiw4LDAsMTI0LDQsMCwxMDAsNCwwLAotICAgIDEzMSwyLDAsMTI1LDUsMCw4NywxMDAsMCwwLDgxLDgyLDg4LDg3LDExMCwyMiwKLSAgICAwLDQsMTE2LDksMCwxMDcsMTAsMCwxMTQsMTM4LDAsMSwxLDEsMTAwLDAsCi0gICAgMCw4Myw4OSwxMTAsMSwwLDg4LDEyNCw1LDAsODMsNDEsNSw3OCwxMTQsMTI4LAotICAgIDAsMCwwLDkwLDExLDExNSwxMjEsMTE1LDk1LDExOCwxMDEsMTE0LDExNSwxMDUsMTExLDExMCwKLSAgICAxMTQsODIsMCwwLDAsMTE0LDMyLDAsMCwwLDQxLDEwLDIxOCwxMSw2OCw2OSwKLSAgICA2Niw4NSw3MSw5NSw2Niw4NSw3Myw3Niw2OCwyMTgsMTgsODIsNjksNzEsNzMsODMsCi0gICAgODQsODIsODksOTUsNzUsNjksODksOTUsNjgsNjksNjYsODUsNzEsMjE4LDEyLDgyLAotICAgIDY5LDcxLDczLDgzLDg0LDgyLDg5LDk1LDc1LDY5LDg5LDExNCw0OSwwLDAsMCwKLSAgICAxMTQsOCwwLDAsMCwyMTgsNywxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsMTE0LDE3MywKLSAgICAwLDAsMCwxMTQsMTcxLDAsMCwwLDkwLDEwLDgxLDExNywxMDEsMTE0LDEyMSw4NiwKLSAgICA5NywxMDgsMTE3LDEwMSwxMTQsNDIsMCwwLDAsNDEsNiwxMTQsMTcyLDAsMCwwLAotICAgIDExNCwxMjgsMCwwLDAsOTAsMTIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw5NSwKLSAgICAxMDcsMTAxLDEyMSwxMTQsNSwwLDAsMCw5MCw0LDEwNCwxMDcsMTAxLDEyMSwyMTgsOCwKLSAgICAxMDIsMTA1LDEwOCwxMDEsMTEyLDk3LDExNiwxMDQsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDYsMCwwLDAsMjE4LDE2LDk1LDExNSwxMDEsOTcsMTE0LDk5LDEwNCwKLSAgICA5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDk0LDIsMCwwLDExNSwyMiwwLAotICAgIDAsMCwwLDIsOSwxLDEyLDIsOSwxLDE1LDEsMjIsMSwzLDEsCi0gICAgMTgsMSwyOSwxLDEzLDEsOSwxLDEyMiwzOCw4NywxMDUsMTEwLDEwMCwxMTEsMTE5LAotICAgIDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKLSAgICA5NSwxMTUsMTAxLDk3LDExNCw5OSwxMDQsOTUsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSwKLSAgICA3OCw5OSw0LDAsMCwwLDAsMCwwLDAsOCwwLDAsMCwxNCwwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsMTU4LDAsMCwwLDEyNCwwLDAsMTA2LDAsCi0gICAgMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDQsMCwxMjQsNCwwLDEwMCwwLDAsCi0gICAgMTA3LDgsMCwxMTQsMzEsMCwxMDAsMCwwLDgzLDEyMSwxNCwwLDExNiwxLDAsCi0gICAgMTI0LDQsMCwxMzEsMSwwLDEsODcsMTEwLDIyLDAsNCwxMTYsMiwwLDEwNywKLSAgICAxMCwwLDExNCw2OSwwLDEsMSwxLDEwMCwwLDAsODMsODksMTEwLDEsMCwKLSAgICA4OCwxMjAsODEsMCwxMTYsMywwLDEzMSwwLDAsNjgsOTMsNzAsMCw5MiwyLAotICAgIDAsMTI1LDUsMCwxMjUsNiwwLDEyNCw0LDAsMTA2LDQsMCwxMTYsNSwwLAotICAgIDEyNCw2LDAsMTMxLDEsMCwxMzEsMSwwLDExNCw4MCwwLDExNiw2LDAsMTA2LAotICAgIDcsMCwxMjQsMSwwLDEyNCw1LDAsMTI0LDEsMCwxMjQsNCwwLDEzMSwyLAotICAgIDAsMTAwLDEsMCwxMjQsNCwwLDEzMSwyLDEsMTI1LDcsMCwxMjQsNywwLAotICAgIDgzLDExMyw4MCwwLDg3LDEwMCwwLDAsODMsNDEsMiw3OCwxMTQsMTYwLDAsMCwKLSAgICAwLDQxLDgsMTE0LDE3OSwwLDAsMCwxMTQsNDEsMCwwLDAsMTE0LDQyLDAsCi0gICAgMCwwLDExNCwxNjMsMCwwLDAsMTE0LDk0LDAsMCwwLDExNCw5NSwwLDAsCi0gICAgMCwxMTQsMTIzLDAsMCwwLDIxOCwxNiwxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwKLSAgICAxMDksOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCw0MSw4LDExNCwxNzIsMCwwLDAsMTE0LAotICAgIDEyOCwwLDAsMCwxMTQsMzcsMCwwLDAsMjE4LDYsMTE2LDk3LDExNCwxMDMsMTAxLAotICAgIDExNiwxMTQsMTc4LDAsMCwwLDExNCwxMjksMCwwLDAsMTE0LDE2OCwwLDAsMCwKLSAgICAxMTQsMTY2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA2LDAsMCwwLDIxOCw5LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwxMDksCi0gICAgMiwwLDAsMTE1LDI2LDAsMCwwLDAsMiwxNSwxLDEyLDEsNCwxLAotICAgIDMsMSwxNCwxLDEzLDEsOSwxLDIyLDEsMjEsMSw5LDEsMTUsMSwKLSAgICA5LDEsMTIyLDMxLDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LDgyLDEwMSwxMDMsMTA1LDExNSwKLSAgICAxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsCi0gICAgMTEyLDEwMSw5OSw5OSwzLDAsMCwwLDAsMCwwLDAsNCwwLDAsMCwKLSAgICAzLDAsMCwwLDY3LDAsMCwwLDExNSw0NSwwLDAsMCwxMjQsMCwwLAotICAgIDEwNiwwLDAsMTI0LDEsMCwxMjQsMiwwLDEzMSwyLDAsMTI1LDMsMCwxMjQsCi0gICAgMywwLDEwMCwxLDAsMTA3LDksMCwxMTQsMzcsMCwxMjQsMywwLDEwNiwxLAotICAgIDAsODMsMTAwLDEsMCw4MywxMDAsMSwwLDgzLDQxLDIsMTIyLDEwOCw3MCwxMDUsCi0gICAgMTEwLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsOTcsMTA5LDEwMSwxMDAsMzIsCi0gICAgMTA1LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwKLSAgICAxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywKLSAgICAxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LAotICAgIDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDIsMTE0LDE4MiwwLAotICAgIDAsMCwxMTQsMTI5LDAsMCwwLDQxLDQsMTE0LDE3MiwwLDAsMCwxMTQsMTI4LAotICAgIDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMTY2LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMSwxMDIsMTA1LAotICAgIDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTI1LDIsMCwwLDExNSw4LDAsCi0gICAgMCwwLDAsNywxOCwxLDEyLDEsNywyLDEyMiwzMyw4NywxMDUsMTEwLDEwMCwKLSAgICAxMTEsMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLAotICAgIDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDEsMTIsMTE0LAotICAgIDExNCwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTUsMCwwLDAsMTE0LDExNiwKLSAgICAwLDAsMCwxMTQsMTc2LDAsMCwwLDExNCwxNzUsMCwwLDAsMTE0LDE3NCwwLAotICAgIDAsMCwyMTgsMTEsOTksMTA4LDk3LDExNSwxMTUsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE0LAotICAgIDE3MywwLDAsMCwxMTQsMTc5LDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LDE4MywKKyAgICA5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCw1LDAsMCwKKyAgICAwLDY0LDAsMCwwLDExNSwyNDgsMSwwLDAsMTAwLDAsOTAsMCwxMDAsOTEsCisgICAgOTAsMSwxMDAsOTIsOTAsMiwxMDEsMiwxMDEsMSwyMywwLDkwLDMsMTAwLDQsCisgICAgMTAwLDUsMTMyLDAsOTAsNCwxMDAsNiwxMDAsNywxMzIsMCw5MCw1LDEwMCw4LAorICAgIDEwMCw5LDEzMiwwLDkwLDYsMTAwLDEwLDEwMCwxMSwxMzIsMCw5MCw3LDEwMCwxMiwKKyAgICAxMDAsMTMsMTMyLDAsOTAsOCwxMDAsMTQsMTAwLDE1LDEzMiwwLDkwLDksMTAwLDE2LAorICAgIDEwMCwxNywxMzIsMCw5MCwxMCwxMDAsMTgsMTAwLDE5LDEzMiwwLDkwLDExLDEwMCwyMCwKKyAgICAxMDAsMjEsMTMyLDAsOTAsMTIsMTAwLDkzLDEwMCwyMywxMDAsMjQsMTMyLDEsOTAsMTMsCisgICAgMTAxLDE0LDEwMSwxMywxMDYsMTUsMTMxLDEsOTAsMTYsMTAwLDI1LDEwNiwxNywxMDAsMjYsCisgICAgMTAwLDI3LDEzMSwyLDEwMCwyOCwyMywwLDkwLDE4LDEwMSwxOSwxMDYsMjAsMTAxLDE4LAorICAgIDEwMCwyNywxMzEsMiw5MCwyMSwxMDAsMjksOTAsMjIsMTAwLDMwLDkwLDIzLDEwMCwzMSwKKyAgICAxMDMsMSw5MCwyNCwxMDAsMzIsMTAzLDEsOTAsMjUsMTAxLDI1LDQsMCw5MCwyNiwKKyAgICA5MCwyNywxMDAsOTQsMTAwLDMzLDEwMCwzNCwxNTYsMSwxMDAsMzUsMTAwLDM2LDEzMiwzLAorICAgIDkwLDI4LDEwMCwzNywxMDAsMzgsMTMyLDAsOTAsMjksMTAwLDM5LDEwMCw0MCwxMzIsMCwKKyAgICA5MCwzMCwxMDAsNDEsMTAwLDQyLDEzMiwwLDkwLDMxLDEwMCw0MywxMDAsNDQsMTMyLDAsCisgICAgOTAsMzIsMTAwLDQ1LDEwMCw0NiwxMzIsMCw5MCwzMywxMDAsNDcsMTAwLDQ4LDEzMiwwLAorICAgIDkwLDM0LDEwMCw5NSwxMDAsNDksMTAwLDUwLDEzMiwxLDkwLDM1LDEwMCw5NiwxMDAsNTEsCisgICAgMTAwLDUyLDEzMiwxLDkwLDM2LDEwMCw5NywxMDAsNTQsMTAwLDU1LDEzMiwxLDkwLDM3LAorICAgIDEwMCw1NiwxMDAsNTcsMTMyLDAsOTAsMzgsMTAxLDM5LDEzMSwwLDkwLDQwLDEwMCw5OCwKKyAgICAxMDAsMzMsMTAxLDQwLDEwMCw1OCwxNTYsMiwxMDAsNTksMTAwLDYwLDEzMiwzLDkwLDQxLAorICAgIDcxLDAsMTAwLDYxLDEwMCw2MiwxMzIsMCwxMDAsNjIsMTMxLDIsOTAsNDIsNzEsMCwKKyAgICAxMDAsNjMsMTAwLDY0LDEzMiwwLDEwMCw2NCwxMzEsMiw5MCw0Myw3MSwwLDEwMCw2NSwKKyAgICAxMDAsNjYsMTMyLDAsMTAwLDY2LDEwMSw0MywxMzEsMyw5MCw0NCw3MSwwLDEwMCw2NywKKyAgICAxMDAsNjgsMTMyLDAsMTAwLDY4LDEzMSwyLDkwLDQ1LDcxLDAsMTAwLDY5LDEwMCw3MCwKKyAgICAxMzIsMCwxMDAsNzAsMTAxLDQ1LDEwMSw0NCwxMzEsNCw5MCw0Niw3MSwwLDEwMCw3MSwKKyAgICAxMDAsNzIsMTMyLDAsMTAwLDcyLDEwMSw0NSwxMDEsNDMsMTMxLDQsOTAsNDcsMTAzLDAsCisgICAgOTAsNDgsNzEsMCwxMDAsNzMsMTAwLDc0LDEzMiwwLDEwMCw3NCwxMDEsNDUsMTAxLDQzLAorICAgIDEzMSw0LDkwLDQ5LDcxLDAsMTAwLDc1LDEwMCw3NiwxMzIsMCwxMDAsNzYsMTMxLDIsCisgICAgOTAsNTAsNzEsMCwxMDAsNzcsMTAwLDc4LDEzMiwwLDEwMCw3OCwxMzEsMiw5MCw1MSwKKyAgICA3MSwwLDEwMCw3OSwxMDAsODAsMTMyLDAsMTAwLDgwLDEzMSwyLDkwLDUyLDcxLDAsCisgICAgMTAwLDgxLDEwMCw4MiwxMzIsMCwxMDAsODIsMTMxLDIsOTAsNTMsMTAwLDk5LDEwMCw4MywKKyAgICAxMDAsODQsMTMyLDEsOTAsNTQsMTAwLDg1LDEwMCw4NiwxMzIsMCw5MCw1NSwxMDAsODcsCisgICAgMTAwLDg4LDEzMiwwLDkwLDU2LDEwMCw4OSwxMDAsOTAsMTMyLDAsOTAsNTcsMTAwLDMzLAorICAgIDgzLDAsNDEsMTAwLDk3LDk0LDEsMCwwLDY3LDExMSwxMTQsMTAxLDMyLDEwNSwxMDksCisgICAgMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLAorICAgIDExMiw5NywxMTYsMTA0LDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDQ2LDEwLDEwLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDEwNSwxMTUsMzIsNzgsNzksODQsMzIsMTA5LDEwMSw5NywxMTAsMTE2LDMyLDExNiwxMTEsMzIsCisgICAgOTgsMTAxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTA4LDEyMSwzMiwxMDUsMTA5LDExMiwxMTEsCisgICAgMTE0LDExNiwxMDEsMTAwLDMzLDMyLDczLDExNiwzMiwxMDQsOTcsMTE1LDMyLDk4LDEwMSwxMDEsCisgICAgMTEwLDMyLDEwMCwxMDEsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE1LDExNyw5OSwxMDQsMTAsCisgICAgMTE2LDEwNCw5NywxMTYsMzIsMTA1LDExNiwzMiw5OSw5NywxMTAsMzIsOTgsMTAxLDMyLDk4LAorICAgIDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwxMTIsMTAxLDEwMCwzMiwxMDUsMTEwLDExNiwxMTEsCisgICAgMzIsODAsMTIxLDExNiwxMDQsMTExLDExMCwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LAorICAgIDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsCisgICAgMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsNDYsMzIsNjUsMTE1LDEwLDExNSwxMTcsOTksMTA0LAorICAgIDMyLDEwNSwxMTYsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMDUsMTEwLDEwNiwxMDEsOTksMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsMTE1LDExMiwKKyAgICAxMDEsOTksMTA1LDEwMiwxMDUsOTksMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LAorICAgIDExMCwxMDAsMzIsOTcsMTE2LDExNiwxMTQsMTA1LDk4LDExNywxMTYsMTAxLDExNSwzMiwxMDUsMTEwLAorICAgIDMyLDExMSwxMTQsMTAwLDEwMSwxMTQsMzIsMTE2LDExMSwxMCwxMTksMTExLDExNCwxMDcsNDYsMzIsCisgICAgNzksMTEwLDEwMSwzMiwxMTUsMTA0LDExMSwxMTcsMTA4LDEwMCwzMiwxMTcsMTE1LDEwMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsMTA1LDk4LDMyLDk3LDExNSwzMiwxMTYsMTA0LDEwMSwzMiwKKyAgICAxMTIsMTE3LDk4LDEwOCwxMDUsOTksNDUsMTAyLDk3LDk5LDEwNSwxMTAsMTAzLDMyLDExOCwxMDEsCisgICAgMTE0LDExNSwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwyMTgsMywxMTksMTA1LDExMCwyMTgsNiw5OSwxMjEsCisgICAgMTAzLDExOSwxMDUsMTEwLDIxOCw2LDEwMCw5NywxMTQsMTE5LDEwNSwxMTAsOTksMCwwLDAsCisgICAgMCwwLDAsMCwwLDEsMCwwLDAsMywwLDAsMCwzLDAsMCwKKyAgICAwLDExNSw2MCwwLDAsMCwxMTYsMCwxMDYsMSwxMDYsMiwxMTYsMywxMzEsMSwKKyAgICAxMTQsNDgsMTE2LDAsMTA2LDEsMTA2LDIsMTE2LDQsMTMxLDEsMTE0LDMwLDEwMCwxLAorICAgIDEzNywwLDExMCw0LDEwMCwyLDEzNywwLDEzNSwwLDEwMiwxLDEwMCwzLDEwMCw0LAorICAgIDEzMiw4LDEyNSwwLDExMCw4LDEwMCw1LDEwMCw0LDEzMiwwLDEyNSwwLDEyNCwwLAorICAgIDgzLDAsNDEsNiw3OCw5MCwxMiw4MCw4OSw4NCw3Miw3OSw3OCw2Nyw2NSw4MywKKyAgICA2OSw3OSw3NSwxMTUsMTIsMCwwLDAsODAsODksODQsNzIsNzksNzgsNjcsNjUsCisgICAgODMsNjksNzksNzUsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMiwwLDAsMCwxOSwwLDAsMCwxMTUsMTAsMCwwLDAsMTM2LDAsCisgICAgMTE2LDAsMTA2LDEsMTA3LDYsODMsMCw0MSwxLDEyMiw1Myw4NCwxMTQsMTE3LDEwMSwKKyAgICAzMiwxMDUsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsMzIsMTA5LDExNywKKyAgICAxMTUsMTE2LDMyLDk4LDEwMSwzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDEsMTAwLDMyLDk5LDk3LAorICAgIDExNSwxMDEsNDUsMTA1LDExMCwxMTUsMTAxLDExMCwxMTUsMTA1LDExNiwxMDUsMTE4LDEwMSwxMDgsMTIxLAorICAgIDQ2LDQxLDIsMjE4LDMsOTUsMTExLDExNSw5MCw3LDEwMSwxMTAsMTE4LDEwNSwxMTQsMTExLAorICAgIDExMCwxNjksMCw0MSwxLDIxOCwzLDEwNywxMDEsMTIxLDExNCw0LDAsMCwwLDI1MCwKKyAgICAzOCw2MCwxMDIsMTE0LDExMSwxMjIsMTAxLDExMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDgsCisgICAgMTA1LDk4LDQ2LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwxMDEsMTIwLAorICAgIDExNiwxMDEsMTE0LDExMCw5NywxMDgsNjIsMjE4LDExLDk1LDExNCwxMDEsMTA4LDk3LDEyMCw5NSwKKyAgICA5OSw5NywxMTUsMTAxLDM3LDAsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsCisgICAgMzcsOTUsMTA5LDk3LDEwNywxMDEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwKKyAgICAxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDk1LDExNCwxMDEsMTA4LDk3LAorICAgIDEyMCw5NSw5OSw5NywxMTUsMTAxLDk5LDAsMCwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDEsMCwwLDAsODMsMCwwLDAsMTE1LDQsMCwwLDAsCisgICAgMTAwLDEsODMsMCw0MSwyLDEyMiw1Myw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLAorICAgIDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk4LAorICAgIDEwMSwzMiw5OSwxMDQsMTAxLDk5LDEwNywxMDEsMTAwLDMyLDk5LDk3LDExNSwxMDEsNDUsMTA1LAorICAgIDExMCwxMTUsMTAxLDExMCwxMTUsMTA1LDExNiwxMDUsMTE4LDEwMSwxMDgsMTIxLDQ2LDcwLDExNCw0LAogICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw2LDAsMCwwLDExNCwxNzAsMCwwLDAsNzUsMiwwLDAsCi0gICAgMTE1LDIwLDAsMCwwLDEyLDIsNiwzLDYsMyw2LDIsNiwyLDE4LAotICAgIDcsMTgsMTUsMywxLDIxLDE1LDMsMSwxMTQsMTcwLDAsMCwwLDk5LDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsCi0gICAgMCwwLDAsMTE1LDcwLDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLAotICAgIDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMCwyLDAsMTAwLDMsMCwKLSAgICAxMzIsMCwwLDkwLDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCw5MCwKLSAgICA1LDAsMTAwLDYsMCwxMDAsNywwLDEzMiwwLDAsOTAsNiwwLDEwMCw4LAotICAgIDAsMTAwLDksMCwxMzIsMCwwLDkwLDcsMCwxMDAsMTAsMCw4Myw0MSwxMSwKKyAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDcsMCwwLDAsNDEsMCwwLDAsCisgICAgMTE1LDIsMCwwLDAsMCwyLDQxLDUsMjE4LDMsMTE1LDEyMSwxMTUsMjE4LDgsCisgICAgMTEyLDEwOCw5NywxMTYsMTAyLDExMSwxMTQsMTA5LDIxOCwxMCwxMTUsMTE2LDk3LDExNCwxMTYsMTE1LAorICAgIDExOSwxMDUsMTE2LDEwNCwyMTgsMjcsOTUsNjcsNjUsODMsNjksOTUsNzMsNzgsODMsNjksCisgICAgNzgsODMsNzMsODQsNzMsODYsNjksOTUsODAsNzYsNjUsODQsNzAsNzksODIsNzcsCisgICAgODMsMjE4LDM1LDk1LDY3LDY1LDgzLDY5LDk1LDczLDc4LDgzLDY5LDc4LDgzLDczLAorICAgIDg0LDczLDg2LDY5LDk1LDgwLDc2LDY1LDg0LDcwLDc5LDgyLDc3LDgzLDk1LDgzLAorICAgIDg0LDgyLDk1LDc1LDY5LDg5LDQxLDEsMTE0LDcsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsNDEsMSwxMTQsNSwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTYsCisgICAgOTUsMTA5LDk3LDEwNywxMDEsOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDk1LDk5LDk3LDExNSwxMDEsCisgICAgMzAsMCwwLDAsMTE1LDE0LDAsMCwwLDAsMSwxMiwxLDEyLDEsNiwKKyAgICAyLDQsMiwxNCw0LDgsMywxMTQsMTMsMCwwLDAsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDEsMCwwLDAsMywwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsMjAsMCwwLDAsMTE2LDAsMTI0LDAsMTMxLDEsMTAwLDEsNjQsMCwKKyAgICAxMDYsMSwxMDAsMiwxMDAsMywxMzEsMiw4MywwLDQxLDQsMTIyLDQyLDY3LDExMSwKKyAgICAxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LDMyLDUxLDUwLDQ1LDk4LDEwNSwxMTYsMzIsMTA1LAorICAgIDExMCwxMTYsMTAxLDEwMywxMDEsMTE0LDMyLDExNiwxMTEsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwxMDEsCisgICAgNDUsMTAxLDExMCwxMDAsMTA1LDk3LDExMCw0NiwxMDgsMywwLDAsMCwyNTUsMTI3LDI1NSwKKyAgICAxMjcsMywwLDIzMyw0LDAsMCwwLDIxOCw2LDEwOCwxMDUsMTE2LDExNiwxMDgsMTAxLAorICAgIDQxLDIsMjE4LDMsMTA1LDExMCwxMTYsMjE4LDgsMTE2LDExMSw5NSw5OCwxMjEsMTE2LDEwMSwKKyAgICAxMTUsNDEsMSwyMTgsMSwxMjAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDYsMCwwLDAsMjE4LDcsOTUsMTE5LDk1LDEwOCwxMTEsMTEwLDEwMyw0NywwLAorICAgIDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LDE5LDAsMCwwLDk5LDEsCisgICAgMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDEyLDAsMCwwLDExNiwwLDEwNiwxLDEyNCwwLDEwMCwxLAorICAgIDEzMSwyLDgzLDAsNDEsMiwxMjIsNDcsNjcsMTExLDExMCwxMTgsMTAxLDExNCwxMTYsMzIsCisgICAgNTIsMzIsOTgsMTIxLDExNiwxMDEsMTE1LDMyLDEwNSwxMTAsMzIsMTA4LDEwNSwxMTYsMTE2LDEwOCwKKyAgICAxMDEsNDUsMTAxLDExMCwxMDAsMTA1LDk3LDExMCwzMiwxMTYsMTExLDMyLDk3LDExMCwzMiwxMDUsCisgICAgMTEwLDExNiwxMDEsMTAzLDEwMSwxMTQsNDYsMTE0LDE1LDAsMCwwLDQxLDIsMTE0LDE2LAorICAgIDAsMCwwLDIxOCwxMCwxMDIsMTE0LDExMSwxMDksOTUsOTgsMTIxLDExNiwxMDEsMTE1LDQxLAorICAgIDEsOTAsOSwxMDUsMTEwLDExNiw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDcsOTUsMTE0LDk1LAorICAgIDEwOCwxMTEsMTEwLDEwMyw1MiwwLDAsMCwxMTUsMiwwLDAsMCwwLDIsMTE0LAorICAgIDIxLDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwKKyAgICAwLDMsMCwwLDAsNzEsMCwwLDAsMTE1LDIwLDAsMCwwLDExNiwwLAorICAgIDEwNiwxLDEwMCwxLDEwMCwyLDEzMiwwLDEyNCwwLDY4LDAsMTMxLDEsMTMxLDEsCisgICAgODMsMCw0MSwzLDEyMiwzMSw4MiwxMDEsMTEyLDEwOCw5Nyw5OSwxMDEsMTA5LDEwMSwxMTAsCisgICAgMTE2LDMyLDEwMiwxMTEsMTE0LDMyLDExMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsNDYsMTA2LDExMSwKKyAgICAxMDUsMTEwLDQwLDQxLDQ2LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsCisgICAgMCwwLDQsMCwwLDAsODMsMCwwLDAsMTE1LDI2LDAsMCwwLDEwMywKKyAgICAwLDEyNCwwLDkzLDE4LDEyNSwxLDEyNCwxLDExNCw0LDEyNCwxLDEwNiwwLDExNiwKKyAgICAxLDEzMSwxLDE0NSwyLDExMyw0LDgzLDAsMTE0LDQsMCwwLDAsNDEsMiwKKyAgICAyMTgsNiwxMTQsMTE1LDExNiwxMTQsMTA1LDExMiwyMTgsMTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LAorICAgIDEwMSwxMTIsOTcsMTE0LDk3LDExNiwxMTEsMTE0LDExNSw0MSwyLDIxOCwyLDQ2LDQ4LDIxOCwKKyAgICA0LDExMiw5NywxMTQsMTE2LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDI1MCwxMCw2MCwxMDgsMTA1LDExNSwxMTYsOTksMTExLDEwOSwxMTIsNjIsCisgICAgNTksMCwwLDAsMTE1LDIsMCwwLDAsNiwxLDEyMiwzMCw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMDYsMTExLDEwNSwxMTAsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLAorICAgIDQ2LDYwLDEwOCwxMDUsMTE1LDExNiw5OSwxMTEsMTA5LDExMiw2Miw0MSwyLDIxOCw4LDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDExNSwxMDEsMTEyLDIxOCw0LDEwNiwxMTEsMTA1LDExMCw0MSwxLDIxOCwKKyAgICAxMCwxMTIsOTcsMTE2LDEwNCw5NSwxMTIsOTcsMTE0LDExNiwxMTUsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEwLDk1LDExMiw5NywxMTYsCisgICAgMTA0LDk1LDEwNiwxMTEsMTA1LDExMCw1NywwLDAsMCwxMTUsNCwwLDAsMCwwLAorICAgIDIsMTAsMSwxMTQsMzAsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwKKyAgICAwLDUsMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsOTgsMCwKKyAgICAwLDAsMTE2LDAsMTE2LDEsMTMxLDEsMTAwLDEsMTA3LDIsMTE0LDM2LDEyNCwwLAorICAgIDEwNiwyLDExNiwzLDEzMSwxLDkyLDMsMTI1LDEsMTI1LDIsMTI1LDMsMTI0LDEsCisgICAgMTI0LDMsMTAyLDIsODMsMCwxMjAsNTIsMTE2LDQsMTI0LDAsMTMxLDEsNjgsMCwKKyAgICA5Myw0MCwxMjUsNCwxMjQsNCwxMTYsMSwxMDcsNiwxMTQsNDYsMTI0LDAsMTA2LDUsCisgICAgMTI0LDQsMTAwLDIsMTAwLDEsMTQ0LDEsMTMxLDEsOTIsMiwxMjUsMSwxMjUsMywKKyAgICAxMjQsMSwxMjQsMywxMDIsMiw4MywwLDExMyw0Niw4NywwLDEwMCwzLDEyNCwwLAorICAgIDEwMiwyLDgzLDAsNDEsNCwxMjIsMzIsODIsMTAxLDExMiwxMDgsOTcsOTksMTAxLDEwOSwKKyAgICAxMDEsMTEwLDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LAorICAgIDExNSwxMTIsMTA4LDEwNSwxMTYsNDAsNDEsNDYsMjMzLDEsMCwwLDAsOTAsOCwxMDksCisgICAgOTcsMTIwLDExNSwxMTIsMTA4LDEwNSwxMTYsMjE4LDAsNDEsNiwyMTgsMywxMDgsMTAxLDExMCwKKyAgICAxMTQsMjMsMCwwLDAsMjE4LDEwLDExNCwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LDEwNSwxMTEsCisgICAgMTEwLDExNCwyNywwLDAsMCwyMTgsOCwxMTQsMTAxLDExOCwxMDEsMTE0LDExNSwxMDEsMTAwLAorICAgIDIxOCw2LDExNCwxMTUsMTEyLDEwOCwxMDUsMTE2LDQxLDUsMjE4LDQsMTEyLDk3LDExNiwxMDQsCisgICAgOTAsNSwxMDIsMTE0LDExMSwxMTAsMTE2LDIxOCwxLDk1LDIxOCw0LDExNiw5NywxMDUsMTA4LAorICAgIDExNCwxOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExMiwxMDgsMTA1LAorICAgIDExNiw2MywwLDAsMCwxMTUsMTYsMCwwLDAsMCwyLDEyLDEsMTYsMSwKKyAgICA4LDEsMTQsMSw4LDEsMjAsMSwxMiwxLDExNCw0MCwwLDAsMCw5OSwKKyAgICAxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSwxMCwwLDAsMCwxMTYsMCwxMDYsMSwxMjQsMCwxMzEsCisgICAgMSw4MywwLDQxLDEsMTIyLDEyNiw4MywxMTYsOTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLAorICAgIDExMiw5NywxMTYsMTA0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc3LDk3LDEwMCwxMDEsMzIsCisgICAgOTcsMzIsMTE1LDEwMSwxMTIsOTcsMTE0LDk3LDExNiwxMDEsMzIsMTAyLDExNywxMTAsOTksMTE2LAorICAgIDEwNSwxMTEsMTEwLDMyLDExNiwxMTEsMzIsMTA5LDk3LDEwNywxMDEsMzIsMTA1LDExNiwzMiwxMDEsCisgICAgOTcsMTE1LDEwNSwxMDEsMTE0LDMyLDExNiwxMTEsMzIsMTExLDExOCwxMDEsMTE0LDExNCwxMDUsMTAwLAorICAgIDEwMSwzMiwxMDUsMTEwLDMyLDEwMSwxMjAsMTEyLDEwMSwxMTQsMTA1LDEwOSwxMDEsMTEwLDExNiwxMTUsCisgICAgMTAsMzIsMzIsMzIsMzIsNDAsMTAxLDQ2LDEwMyw0NiwzMiw5OSw5Nyw5OSwxMDQsMTAxLAorICAgIDMyLDExNSwxMTYsOTcsMTE2LDMyLDExNCwxMDEsMTE1LDExNywxMDgsMTE2LDExNSw0MSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiw0MSwyLDExNCwzLDAsMCwwLDkwLDQsMTE1LDExNiwKKyAgICA5NywxMTYsNDEsMSwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEwLDk1LDExMiw5NywxMTYsMTA0LDk1LAorICAgIDExNSwxMTYsOTcsMTE2LDc1LDAsMCwwLDExNSwyLDAsMCwwLDAsNywxMTQsCisgICAgNDEsMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLAorICAgIDAsMTEsMCwwLDAsNjcsMCwwLDAsMTE1LDQ4LDAsMCwwLDEyMSwxMiwKKyAgICAxMTYsMCwxMjQsMCwxMzEsMSwxMjUsMiw4NywwLDExMCwyMCw0LDAsMTE2LDEsCisgICAgMTA3LDEwLDExNCwzMiwxLDAsMSwwLDEsMCwxMDAsMSw4MywwLDg4LDAsCisgICAgMTI0LDIsMTA2LDIsMTAwLDIsNjQsMCwxMjQsMSwxMDcsMiw4MywwLDQxLDMsCisgICAgMTIyLDQ5LDg0LDEwMSwxMTUsMTE2LDMyLDExOSwxMDQsMTAxLDExNiwxMDQsMTAxLDExNCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExNSwKKyAgICAxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTAxLDMyLDExNiwxMjEsCisgICAgMTEyLDEwMSw0Niw3MCwxMDUsMCwyNDAsMCwwLDQxLDMsMTE0LDQxLDAsMCwwLAorICAgIDIxOCw3LDc5LDgzLDY5LDExNCwxMTQsMTExLDExNCwyMTgsNywxMTUsMTE2LDk1LDEwOSwxMTEsCisgICAgMTAwLDEwMSw0MSwzLDExNCwzNywwLDAsMCwyMTgsNCwxMDksMTExLDEwMCwxMDEsOTAsCisgICAgOSwxMTUsMTE2LDk3LDExNiw5NSwxMDUsMTEwLDEwMiwxMTEsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE4LDk1LDExMiw5NywxMTYsMTA0LAorICAgIDk1LDEwNSwxMTUsOTUsMTA5LDExMSwxMDAsMTAxLDk1LDExNiwxMjEsMTEyLDEwMSw4NSwwLDAsCisgICAgMCwxMTUsMTAsMCwwLDAsMCwyLDIsMSwxMiwxLDE0LDEsNiwxLAorICAgIDExNCw0NSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLAorICAgIDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwxMCwwLDAsMCwxMTYsCisgICAgMCwxMjQsMCwxMDAsMSwxMzEsMiw4MywwLDQxLDIsMTIyLDMxLDgyLDEwMSwxMTIsCisgICAgMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsMTExLDExNSw0NiwKKyAgICAxMTIsOTcsMTE2LDEwNCw0NiwxMDUsMTE1LDEwMiwxMDUsMTA4LDEwMSw0NiwxMDUsMCwxMjgsMCwKKyAgICAwLDQxLDEsMTE0LDQ1LDAsMCwwLDQxLDEsMTE0LDM3LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMiwKKyAgICA5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTE1LDEwMiwxMDUsMTA4LDEwMSw5NCwwLDAsMCwKKyAgICAxMTUsMiwwLDAsMCwwLDIsMTE0LDQ2LDAsMCwwLDk5LDEsMCwwLAorICAgIDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDIyLDAsMCwwLDEyNCwwLDExNSwxMiwxMTYsMCwxMDYsMSwxMzEsMCwKKyAgICAxMjUsMCwxMTYsMiwxMjQsMCwxMDAsMSwxMzEsMiw4MywwLDQxLDIsMTIyLDMwLAorICAgIDgyLDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMDksMTAxLDExMCwxMTYsMzIsMTAyLDExMSwxMTQsMzIsCisgICAgMTExLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw0NiwxMDUsMTE1LDEwMCwxMDUsMTE0LDQ2LDEwNSwwLAorICAgIDY0LDAsMCw0MSwzLDExNCwzLDAsMCwwLDIxOCw2LDEwMywxMDEsMTE2LDk5LAorICAgIDExOSwxMDAsMTE0LDQ1LDAsMCwwLDQxLDEsMTE0LDM3LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMSw5NSwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTE1LDEwMCwxMDUsMTE0LDk5LDAsMCwwLDExNSw2LAorICAgIDAsMCwwLDAsMiw0LDEsOCwxLDExNCw0OCwwLDAsMCwyMzMsMTgyLAorICAgIDEsMCwwLDk5LDMsMCwwLDAsMCwwLDAsMCw2LDAsMCwwLAorICAgIDE3LDAsMCwwLDY3LDAsMCwwLDExNSwxNjIsMCwwLDAsMTAwLDEsMTA2LAorICAgIDAsMTI0LDAsMTE2LDEsMTI0LDAsMTMxLDEsMTMxLDIsMTI1LDMsMTE2LDIsMTA2LAorICAgIDMsMTI0LDMsMTE2LDIsMTA2LDQsMTE2LDIsMTA2LDUsNjYsMCwxMTYsMiwxMDYsCisgICAgNiw2NiwwLDEyNCwyLDEwMCwyLDY0LDAsMTMxLDMsMTI1LDQsMTIxLDUwLDExNiwKKyAgICA3LDEwNiw4LDEyNCw0LDEwMCwzLDEzMSwyLDE0MywxNiwxMjUsNSwxMjQsNSwxMDYsCisgICAgOSwxMjQsMSwxMzEsMSwxLDAsODcsMCwxMDAsNCw4MSwwLDgyLDAsODgsCisgICAgMCwxMTYsMiwxMDYsMTAsMTI0LDMsMTI0LDAsMTMxLDIsMSwwLDg3LDAsMTEwLAorICAgIDU4LDQsMCwxMTYsMTEsMTA3LDEwLDExNCwxNTYsMSwwLDEsMCwxLDAsMTIxLAorICAgIDE0LDExNiwyLDEwNiwxMiwxMjQsMywxMzEsMSwxLDAsODcsMCwxMTAsMjAsNCwKKyAgICAwLDExNiwxMSwxMDcsMTAsMTE0LDE0OCwxLDAsMSwwLDEsMCw4OSwwLDExMCwKKyAgICAyLDg4LDAsMTMwLDAsODksMCwxMTAsMiw4OCwwLDEwMCw0LDgzLDAsNDEsCisgICAgNSwxMjIsMTYyLDY2LDEwMSwxMTUsMTE2LDQ1LDEwMSwxMDIsMTAyLDExMSwxMTQsMTE2LDMyLDEwMiwKKyAgICAxMTcsMTEwLDk5LDExNiwxMDUsMTExLDExMCwzMiwxMTYsMTExLDMyLDExOSwxMTQsMTA1LDExNiwxMDEsCisgICAgMzIsMTAwLDk3LDExNiw5NywzMiwxMTYsMTExLDMyLDk3LDMyLDExMiw5NywxMTYsMTA0LDMyLAorICAgIDk3LDExNiwxMTEsMTA5LDEwNSw5OSw5NywxMDgsMTA4LDEyMSw0NiwxMCwzMiwzMiwzMiwzMiwKKyAgICA2NiwxMDEsMzIsMTEyLDExNCwxMDEsMTEyLDk3LDExNCwxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTA0LAorICAgIDk3LDExMCwxMDAsMTA4LDEwMSwzMiw5NywzMiw3MCwxMDUsMTA4LDEwMSw2OSwxMjAsMTA1LDExNSwKKyAgICAxMTYsMTE1LDY5LDExNCwxMTQsMTExLDExNCwzMiwxMDUsMTAyLDMyLDk5LDExMSwxMTAsOTksMTE3LAorICAgIDExNCwxMTQsMTAxLDExMCwxMTYsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsCisgICAgMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTE2LDEwMSwxMDksMTEyLDExMSwxMTQsOTcsCisgICAgMTE0LDEyMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywxMTYsMTE2LDEwMSwxMDksCisgICAgMTEyLDExNiwxMDEsMTAwLDQ2LDEyMiw1LDEyMywxMjUsNDYsMTIzLDEyNSwxMDUsMTgyLDEsMCwKKyAgICAwLDkwLDIsMTE5LDk4LDc4LDQxLDEzLDIxOCw2LDEwMiwxMTEsMTE0LDEwOSw5NywxMTYsCisgICAgMjE4LDIsMTA1LDEwMCwxMTQsMywwLDAsMCw5MCw0LDExMSwxMTIsMTAxLDExMCw5MCwKKyAgICA2LDc5LDk1LDY5LDg4LDY3LDc2LDkwLDcsNzksOTUsNjcsODIsNjksNjUsODQsCisgICAgOTAsOCw3OSw5NSw4Nyw4Miw3OSw3OCw3Niw4OSwyMTgsMyw5NSwxMDUsMTExLDIxOCwKKyAgICA2LDcwLDEwNSwxMDgsMTAxLDczLDc5LDIxOCw1LDExOSwxMTQsMTA1LDExNiwxMDEsMjE4LDcsCisgICAgMTE0LDEwMSwxMTIsMTA4LDk3LDk5LDEwMSwxMTQsNDIsMCwwLDAsOTAsNiwxMTcsMTEwLAorICAgIDEwOCwxMDUsMTEwLDEwNyw0MSw2LDExNCwzNywwLDAsMCwyMTgsNCwxMDAsOTcsMTE2LAorICAgIDk3LDExNCw0NCwwLDAsMCw5MCw4LDExMiw5NywxMTYsMTA0LDk1LDExNiwxMDksMTEyLAorICAgIDkwLDIsMTAyLDEwMCwyMTgsNCwxMDIsMTA1LDEwOCwxMDEsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEzLDk1LDExOSwxMTQsMTA1LDExNiwKKyAgICAxMDEsOTUsOTcsMTE2LDExMSwxMDksMTA1LDk5LDEwNiwwLDAsMCwxMTUsMjYsMCwwLAorICAgIDAsMCw1LDE2LDEsNiwxLDI2LDEsMiwzLDE0LDEsMjAsMSwxNiwKKyAgICAxLDE0LDEsMiwxLDE0LDEsMTQsMSw2LDEsMTE0LDU4LDAsMCwwLAorICAgIDEwNSw0NCwxMywwLDAsMjMzLDIsMCwwLDAsMTE0LDE1LDAsMCwwLDExNSwKKyAgICAyLDAsMCwwLDEzLDEwLDkwLDExLDk1LDk1LDExMiwxMjEsOTksOTcsOTksMTA0LAorICAgIDEwMSw5NSw5NSwxMjIsNCwxMTEsMTEyLDExNiw0NSwxMjIsMyw0NiwxMTIsMTIxLDEyMiw0LAorICAgIDQ2LDExMiwxMjEsOTksNzgsNDEsMSwyMTgsMTIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLAorICAgIDk3LDExNiwxMDUsMTExLDExMCw5OSwyLDAsMCwwLDEsMCwwLDAsMTEsMCwKKyAgICAwLDAsNiwwLDAsMCw2NywwLDAsMCwxMTUsMjM0LDAsMCwwLDEyNCwKKyAgICAxLDEwMCwxLDEwNyw5LDExNCw1MiwxMTYsMCwxMDYsMSwxMDAsMiwxMTYsMiwxMzEsCisgICAgMiwxLDAsMTI0LDIsMTAwLDEsMTA3LDksMTE0LDQwLDEwMCwzLDEyNSwzLDExNiwKKyAgICAzLDEyNCwzLDEzMSwxLDEzMCwxLDEyNCwxLDExNCw0OCwxMDAsNCwxMTAsMiwxMDAsCisgICAgNSwxMjUsMiwxMTYsNCwxMjQsMCwxMzEsMSw5MiwyLDEyNSw0LDEyNSw1LDEyNCwKKyAgICA1LDEwNiw1LDEwMCw2LDEzMSwxLDkyLDMsMTI1LDYsMTI1LDcsMTI1LDgsMTE2LAorICAgIDYsMTA2LDcsMTA2LDgsMTI1LDksMTI0LDksMTAwLDEsMTA3LDgsMTE0LDEwNCwxMTYsCisgICAgOSwxMDAsNywxMzEsMSwxMzAsMSwxMDAsNCwxMDYsMTAsMTI0LDYsMTE0LDExNiwxMjQsCisgICAgNiwxMTAsMiwxMjQsOCwxMjQsNywxMjQsOSwxMDMsMywxMzEsMSwxMjUsMTAsMTI0LAorICAgIDIsMTAwLDEsMTA3LDgsMTE0LDE2MiwxMTYsNiwxMDYsMTEsMTA2LDEyLDEwMCw4LDEwNywKKyAgICAyLDExNCwxNTQsMTAwLDQsMTI1LDIsMTEwLDgsMTE2LDYsMTA2LDExLDEwNiwxMiwxMjUsCisgICAgMiwxMTYsMTMsMTI0LDIsMTMxLDEsMTI1LDIsMTI0LDIsMTAwLDQsMTA3LDMsMTE0LAorICAgIDIxNCwxMjQsMiwxMDYsMTQsMTMxLDAsMTE1LDIwMCwxMTYsMTUsMTAwLDksMTA2LDE2LDEyNCwKKyAgICAyLDEzMSwxLDEzMSwxLDEzMCwxLDEwMCwxMCwxMDYsMTYsMTI0LDEwLDExNiwxNywxMjQsCisgICAgMiwxMzEsMywxMjUsMTAsMTE2LDE4LDEyNCw0LDExNiwxOSwxMjQsMTAsMTE2LDIwLDEwMCwKKyAgICA4LDI1LDAsMjMsMCwxMzEsMyw4MywwLDQxLDExLDk3LDI1NCwyLDAsMCwKKyAgICA3MSwxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LAorICAgIDExMSwzMiw5NywzMiw0NiwxMTIsMTIxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLAorICAgIDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLAorICAgIDMyLDEwNSwxMTYsMTE1LDMyLDQ2LDExMiwxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsNDYsMTEyLDEyMSwzMiwxMDIsMTA1LDEwOCwKKyAgICAxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwKKyAgICAxMTYsMTExLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsNTksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwKKyAgICAxMDUsMTA5LDExMiwxMDgsMTIxLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LAorICAgIDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLAorICAgIDMyLDMyLDQ2LDExMiwxMjEsOTksMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk5LDk3LDEwOCw5OSwKKyAgICAxMTcsMTA4LDk3LDExNiwxMDEsMTAwLDMyLDk3LDExNSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExOSwxMDEsMTE0LDEwMSwzMiwxMDUsCisgICAgMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwKKyAgICAxMDEsMzIsMzksMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzOSwKKyAgICAzMiwxMTIsOTcsMTE0LDk3LDEwOSwxMDEsMTE2LDEwMSwxMTQsMzIsOTksMTExLDExMCwxMTYsMTE0LAorICAgIDExMSwxMDgsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDExMiwxMTQsMTAxLDExNSwxMTcsMTA5LDEwMSwxMDAsCisgICAgMzIsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDgsMTAxLAorICAgIDExOCwxMDEsMTA4LDMyLDExMSwxMDIsMTAsMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsMzIsOTgsCisgICAgMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDMyLDczLDEwMiwKKyAgICAzMiwzOSwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLAorICAgIDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsNzgsMTExLDExMCwxMDEsNDQsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTE1LDExNiwxMTQsMTA1LDExMCwxMDMsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwxMTUsMTAxLDExMCwKKyAgICAxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDEwLDMyLDMyLDMyLDMyLDExMSwxMDIsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMzIsMTE2LDk3LAorICAgIDEwNywxMDEsMTEwLDMyLDk3LDExMCwxMDAsMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMDUsMTAxLDEwMCwKKyAgICAzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsCisgICAgMTE0LDEwNSw5OSwzMiw0MCwxMDEsMTA4LDExNSwxMDEsMzIsODYsOTcsMTA4LDExNywxMDEsNjksCisgICAgMTE0LDExNCwxMTEsMTE0LDEwLDMyLDMyLDMyLDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsCisgICAgMTAxLDEwMCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwMCwxMDEsCisgICAgOTgsMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMiw5NywxMTQsCisgICAgOTcsMTA5LDEwMSwxMTYsMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksCisgICAgOTcsMTE2LDEwMSwxMDAsNDYsMzIsNzMsMTAyLDMyLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsCisgICAgMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDEwNSwxMTUsMzIsMTEwLDExMSwxMTYsMzIsNzgsCisgICAgMTExLDExMCwxMDEsNDQsMTAsMzIsMzIsMzIsMzIsOTcsMzIsODQsMTE0LDExNywxMDEsMzIsCisgICAgMTE4LDk3LDEwOCwxMTcsMTAxLDMyLDEwNSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDk3LDEwOSwKKyAgICAxMDEsMzIsOTcsMTE1LDMyLDExNSwxMDEsMTE2LDExNiwxMDUsMTEwLDEwMywzMiwzOSwxMTEsMTEyLAorICAgIDExNiwxMDUsMTA5LDEwNSwxMjIsOTcsMTE2LDEwNSwxMTEsMTEwLDM5LDMyLDExNiwxMTEsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTAxLDEwOSwxMTIsMTE2LDEyMSwzMiwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywxMCwKKyAgICAzMiwzMiwzMiwzMiwxMTksMTA0LDEwNSwxMDgsMTAxLDMyLDk3LDMyLDcwLDk3LDEwOCwxMTUsCisgICAgMTAxLDMyLDExOCw5NywxMDgsMTE3LDEwMSwzMiwxMDUsMTE1LDMyLDEwMSwxMTMsMTE3LDEwNSwxMTgsCisgICAgOTcsMTA4LDEwMSwxMTAsMTE2LDMyLDExNiwxMTEsMzIsMTE1LDEwMSwxMTYsMTE2LDEwNSwxMTAsMTAzLAorICAgIDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsCisgICAgMTE2LDExMSwzMiwzOSw0OSwzOSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMDIsMzIsCisgICAgMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwKKyAgICAxMTEsMTEwLDQ2LDk5LDk3LDk5LDEwNCwxMDEsOTUsMTE2LDk3LDEwMywzMiwxMDUsMTE1LDMyLAorICAgIDc4LDExMSwxMTAsMTAxLDMyLDExNiwxMDQsMTAxLDExMCwzMiw3OCwxMTEsMTE2LDczLDEwOSwxMTIsCisgICAgMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwKKyAgICAzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiwKKyAgICA3MCwxMTYsMTA0LDEwMSwzMiwxMDAsMTAxLDk4LDExNywxMDMsOTUsMTExLDExOCwxMDEsMTE0LDExNCwKKyAgICAxMDUsMTAwLDEwMSwzMiwxMTIsOTcsMTE0LDk3LDEwOSwxMDEsMTE2LDEwMSwxMTQsMzIsMTA1LDExNSwKKyAgICAzMiwxMDAsMTAxLDExMiwxMTQsMTAxLDk5LDk3LDExNiwxMDEsMTAwLDU5LDMyLDExNywxMTUsMTAxLAorICAgIDMyLDM5LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzksMzIsCisgICAgMTA1LDExMCwxMTUsMTE2LDEwMSw5NywxMDAsMTIyLDUwLDEwMCwxMDEsOTgsMTE3LDEwMyw5NSwxMTEsCisgICAgMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDMyLDExMSwxMTQsMzIsMTExLDExMiwxMTYsMTA1LDEwOSwKKyAgICAxMDUsMTIyLDk3LDExNiwxMDUsMTExLDExMCwzMiwxMDksMTE3LDExNSwxMTYsMzIsOTgsMTAxLDMyLAorICAgIDExNSwxMDEsMTE2LDMyLDExNiwxMTEsMzIsNzgsMTExLDExMCwxMDEsMTE0LDMyLDAsMCwwLAorICAgIDExNCwzMSwwLDAsMCwyMTgsMSw0NiwxMjIsMzYsMTE1LDEyMSwxMTUsNDYsMTA1LDEwOSwKKyAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDk5LDk3LDk5LAorICAgIDEwNCwxMDEsOTUsMTE2LDk3LDEwMywzMiwxMDUsMTE1LDMyLDc4LDExMSwxMTAsMTAxLDIzMywwLAorICAgIDAsMCwwLDEyMiwyNCwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LAorICAgIDMyLDk3LDEwOCwxMTIsMTA0LDk3LDExMCwxMTcsMTA5LDEwMSwxMTQsMTA1LDk5LDEyMiw3LDEyMywKKyAgICAxMjUsNDYsMTIzLDEyNSwxMjMsMTI1LDQxLDIxLDIxOCw5LDk1LDExOSw5NywxMTQsMTEwLDEwNSwKKyAgICAxMTAsMTAzLDExNSwyMTgsNCwxMTksOTcsMTE0LDExMCwyMTgsMTgsNjgsMTAxLDExMiwxMTQsMTAxLAorICAgIDk5LDk3LDExNiwxMDUsMTExLDExMCw4Nyw5NywxMTQsMTEwLDEwNSwxMTAsMTAzLDIxOCw5LDg0LAorICAgIDEyMSwxMTIsMTAxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsNDAsMCwwLDAsMTE0LDM0LDAsCisgICAgMCwwLDExNCw4LDAsMCwwLDIxOCwxNCwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsCisgICAgMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMjE4LDksOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsCisgICAgOTcsMTAzLDIxOCwxOSw3OCwxMTEsMTE2LDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsCisgICAgMTAxLDEwMCw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDI4LDAsMCwwLDIxOCw1LDEwMiwxMDgsCisgICAgOTcsMTAzLDExNSwyMTgsOCwxMTEsMTEyLDExNiwxMDUsMTA5LDEwNSwxMjIsMTAxLDIxOCwzLDExNSwKKyAgICAxMTYsMTE0LDIxOCw3LDEwNSwxMTUsOTcsMTA4LDExMCwxMTcsMTA5LDIxOCwxMCw4Niw5NywxMDgsCisgICAgMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDUwLDAsMCwwLDIxOCw0LDk1LDc5LAorICAgIDgwLDg0LDExNCwzMCwwLDAsMCwyMTgsOCw5NSw4MCw4OSw2Nyw2NSw2Nyw3MiwKKyAgICA2OSwyMTgsMTcsNjYsODksODQsNjksNjcsNzksNjgsNjksOTUsODMsODUsNzAsNzAsCisgICAgNzMsODgsNjksODMsNDEsMTEsMTE0LDM3LDAsMCwwLDkwLDE0LDEwMCwxMDEsOTgsCisgICAgMTE3LDEwMyw5NSwxMTEsMTE4LDEwMSwxMTQsMTE0LDEwNSwxMDAsMTAxLDExNCw2MCwwLDAsMCwKKyAgICAyMTgsNywxMDksMTAxLDExNSwxMTUsOTcsMTAzLDEwMSwyMTgsNCwxMDQsMTAxLDk3LDEwMCwxMTQsCisgICAgMzksMCwwLDAsOTAsNCw5OCw5NywxMTUsMTAxLDIxOCwzLDExNSwxMDEsMTEyLDIxOCwKKyAgICA0LDExNCwxMDEsMTE1LDExNiw5MCwzLDExNiw5NywxMDMsOTAsMTUsOTcsMTA4LDEwOSwxMTEsCisgICAgMTE1LDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE3LDk5LDk3LDk5LDEwNCwKKyAgICAxMDEsOTUsMTAyLDExNCwxMTEsMTA5LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMCwxLDAsCisgICAgMCwxMTUsNDYsMCwwLDAsMCwxOCw4LDEsNiwxLDYsMSw4LDEsCisgICAgNCwxLDgsMSwxMiwxLDEyLDEsMTYsMSw4LDEsOCwxLDgsMSwKKyAgICAyNCwxLDgsMSwxMiwxLDYsMiw4LDEsOCwxLDgsMSw4LDEsCisgICAgMTQsMSwxNCwxLDExNCw4MiwwLDAsMCw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsOCwwLDAsMCw1LDAsMCwwLDY3LDAsMCwwLDExNSwyMjAsCisgICAgMCwwLDAsMTE2LDAsMTA2LDEsMTA2LDIsMTAwLDEsMTA3LDgsMTE0LDIwLDExNiwKKyAgICAzLDEwMCwyLDEzMSwxLDEzMCwxLDExNiw0LDEyNCwwLDEzMSwxLDkyLDIsMTI1LAorICAgIDEsMTI1LDIsMTE2LDQsMTI0LDEsMTMxLDEsOTIsMiwxMjUsMSwxMjUsMywxMjQsCisgICAgMywxMTYsNSwxMDcsMywxMTQsNjgsMTE2LDYsMTAwLDMsMTA2LDcsMTE2LDUsMTI0LAorICAgIDAsMTMxLDIsMTMxLDEsMTMwLDEsMTI0LDIsMTA2LDgsMTAwLDQsMTMxLDEsMTI1LAorICAgIDQsMTI0LDQsMTAwLDExLDEwNyw3LDExNCwxMDIsMTE2LDYsMTAwLDcsMTA2LDcsMTI0LAorICAgIDIsMTMxLDEsMTMxLDEsMTMwLDEsMTEwLDg2LDEyNCw0LDEwMCw2LDEwNywyLDExNCwKKyAgICAxODgsMTI0LDIsMTA2LDksMTAwLDQsMTAwLDUsMTMxLDIsMTAwLDEyLDI1LDAsMTI1LAorICAgIDUsMTI0LDUsMTA2LDEwLDExNiwxMSwxMzEsMSwxMTUsMTUwLDExNiw2LDEwMCw4LDEwNiwKKyAgICA3LDExNiwxMSwxMzEsMSwxMzEsMSwxMzAsMSwxMjQsNSwxMTYsMTIsMTE2LDExLDEzMSwKKyAgICAxLDEwMCwxLDEzMywyLDI1LDAsMTI1LDYsMTI0LDYsMTA2LDEzLDEzMSwwLDExNSwKKyAgICAxODgsMTE2LDYsMTAwLDksMTA2LDcsMTI0LDUsMTMxLDEsMTMxLDEsMTMwLDEsMTI0LAorICAgIDIsMTA2LDE0LDEwMCw0LDEzMSwxLDEwMCwxMCwyNSwwLDEyNSw3LDExNiwxNSwxMjQsCisgICAgMSwxMjQsNywxMTYsMTYsMTAwLDEwLDI1LDAsMjMsMCwxMzEsMiw4MywwLDQxLAorICAgIDEzLDk3LDExMCwxLDAsMCw3MSwxMDUsMTE4LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiw5NywzMiw0NiwxMTIsMTIxLDk5LDQ2LDMyLAorICAgIDEwMiwxMDUsMTA4LDEwMSw0NCwzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDEwNSwxMTYsMTE1LDMyLDQ2LDExMiwxMjEsCisgICAgMzIsMTAyLDEwNSwxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsCisgICAgNDYsMTEyLDEyMSw5OSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwKKyAgICAxMTEsMTE2LDMyLDExMCwxMDEsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsCisgICAgNTksMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDExNSwxMDUsMTA5LDExMiwxMDgsMTIxLDMyLDExNCwxMDEsCisgICAgMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsCisgICAgMTExLDEwLDMyLDMyLDMyLDMyLDExNiwxMDQsMTAxLDMyLDQ2LDExMiwxMjEsMzIsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDMyLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMTAwLDMyLDExNiwxMTEsCisgICAgMzIsOTksMTExLDExNCwxMTQsMTAxLDExNSwxMTIsMTExLDExMCwxMDAsMzIsMTE2LDExMSwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiw0NiwxMTIsMTIxLDk5LDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwzMiwzMiw3MywKKyAgICAxMDIsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAwLDExMSwxMDEsMTE1LDEwLDMyLDMyLDMyLDMyLAorICAgIDExMCwxMTEsMTE2LDMyLDk5LDExMSwxMTAsMTAyLDExMSwxMTQsMTA5LDMyLDExNiwxMTEsMzIsODAsCisgICAgNjksODAsMzIsNTEsNDksNTIsNTUsNDcsNTIsNTYsNTYsMzIsMTAyLDExMSwxMTQsMTA5LAorICAgIDk3LDExNiw0NCwzMiw4Niw5NywxMDgsMTE3LDEwMSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LAorICAgIDEwNSwxMDgsMTA4LDMyLDk4LDEwMSwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDMyLDczLAorICAgIDEwMiwxMCwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSw0NiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwKKyAgICAxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsNDYsOTksOTcsOTksMTA0LDEwMSw5NSwxMTYsCisgICAgOTcsMTAzLDMyLDEwNSwxMTUsMzIsNzgsMTExLDExMCwxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLAorICAgIDc4LDExMSwxMTYsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLDY5LDExNCwKKyAgICAxMTQsMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsNDYsMTAsMTAsCisgICAgMzIsMzIsMzIsMzIsNzgsMTIyLDM2LDExNSwxMjEsMTE1LDQ2LDEwNSwxMDksMTEyLDEwOCwxMDEsCisgICAgMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLDExMCw0Niw5OSw5Nyw5OSwxMDQsMTAxLDk1LAorICAgIDExNiw5NywxMDMsMzIsMTA1LDExNSwzMiw3OCwxMTEsMTEwLDEwMSwxMjIsMzcsMTIzLDEyNSwzMiwKKyAgICAxMTAsMTExLDExNiwzMiw5OCwxMTEsMTE2LDExNiwxMTEsMTA5LDQ1LDEwOCwxMDEsMTE4LDEwMSwxMDgsCisgICAgMzIsMTAwLDEwNSwxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMDUsMTEwLDMyLDEyMywzMywKKyAgICAxMTQsMTI1LDExNCw2MSwwLDAsMCwxMTQsNTksMCwwLDAsMjMzLDMsMCwwLAorICAgIDAsMTIyLDMzLDEwMSwxMjAsMTEyLDEwMSw5OSwxMTYsMTAxLDEwMCwzMiwxMTEsMTEwLDEwOCwxMjEsCisgICAgMzIsNTAsMzIsMTExLDExNCwzMiw1MSwzMiwxMDAsMTExLDExNiwxMTUsMzIsMTA1LDExMCwzMiwKKyAgICAxMjMsMzMsMTE0LDEyNSwxMjIsNTcsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDk3LDExNiwxMDUsCisgICAgMTExLDExMCwzMiwxMTIsMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiwxMDIsMTA1LAorICAgIDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExMCwxMTEsMTE2LDMyLAorICAgIDExNSwxMTYsOTcsMTE0LDExNiwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTIzLDMzLDExNCwxMjUsMTIyLAorICAgIDUyLDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTA4LDEwMSwKKyAgICAxMTgsMTAxLDEwOCwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLAorICAgIDk3LDExMCwzMiw5NywxMDgsMTEyLDEwNCw5NywxMTAsMTE3LDEwOSwxMDEsMTE0LDEwNSw5OSwzMiwKKyAgICAxMTgsOTcsMTA4LDExNywxMDEsMTE0LDYyLDAsMCwwLDYyLDIsMCwwLDAsMTE0LAorICAgIDU5LDAsMCwwLDExNCw4MywwLDAsMCwyMzMsMjU0LDI1NSwyNTUsMjU1LDQxLDE3LAorICAgIDExNCw4LDAsMCwwLDExNCw2NywwLDAsMCwxMTQsNjgsMCwwLDAsMTE0LAorICAgIDY5LDAsMCwwLDExNCw0MCwwLDAsMCwxMTQsNzYsMCwwLDAsMTE0LDc0LAorICAgIDAsMCwwLDExNCw1MCwwLDAsMCwyMTgsNSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LAorICAgIDM2LDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsNzUsMCwwLDAsMTE0LDMzLAorICAgIDAsMCwwLDExNCw3MywwLDAsMCwyMTgsOSwxMTIsOTcsMTE0LDExNiwxMDUsMTE2LAorICAgIDEwNSwxMTEsMTEwLDExNCwzMCwwLDAsMCwyMTgsMTUsODMsNzksODUsODIsNjcsNjksCisgICAgOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsNDEsOCwxMTQsMzcsMCwwLDAsCisgICAgMTE0LDc5LDAsMCwwLDkwLDE2LDExMiwxMjEsOTksOTcsOTksMTA0LDEwMSw5NSwxMDIsCisgICAgMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTAsNywxMTIsMTIxLDk5LDk3LDk5LDEwNCwxMDEsCisgICAgOTAsOSwxMDAsMTExLDExNiw5NSw5OSwxMTEsMTE3LDExMCwxMTYsMTE0LDYwLDAsMCwwLAorICAgIDkwLDksMTExLDExMiwxMTYsOTUsMTA4LDEwMSwxMTgsMTAxLDEwOCw5MCwxMyw5OCw5NywxMTUsCisgICAgMTAxLDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsMTE1LDExMSwxMTcsMTE0LDk5LAorICAgIDEwMSw5NSwxMDIsMTE0LDExMSwxMDksOTUsOTksOTcsOTksMTA0LDEwMSw0NCwxLDAsMCwKKyAgICAxMTUsNDQsMCwwLDAsMCw5LDEyLDEsOCwxLDEyLDEsMTIsMSw4LAorICAgIDEsNiwxLDEwLDEsMTAsMSw4LDEsNiwxLDEwLDEsOCwxLDE2LAorICAgIDEsMTAsMSw2LDEsOCwxLDE2LDEsOCwxLDYsMSw4LDEsMTQsCisgICAgMSwxMTQsODgsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDUsCisgICAgMCwwLDAsMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyOCwwLDAsMCwKKyAgICAxMTYsMCwxMjQsMCwxMzEsMSwxMDAsMSwxMDcsMiwxMTQsMTYsMTAwLDIsODMsMCwKKyAgICAxMjQsMCwxMDYsMSwxMDAsMywxMzEsMSw5MiwzLDEyNSwxLDEyNSwyLDEyNSwzLAorICAgIDEyNCwxLDEyLDAsMTE1LDU4LDEyNCwzLDEwNiwyLDEzMSwwLDEwMCw3LDEwMCw4LAorICAgIDEzMywyLDI1LDAsMTAwLDYsMTA3LDMsMTE0LDYyLDEyNCwwLDgzLDAsMTIxLDEyLAorICAgIDExNiwzLDEyNCwwLDEzMSwxLDEyNSw0LDg3LDAsMTEwLDM2LDQsMCwxMTYsNCwKKyAgICAxMTYsNSwxMDIsMiwxMDcsMTAsMTE0LDExMCwxLDAsMSwwLDEsMCwxMjQsMCwKKyAgICAxMDAsMiwxMDAsOSwxMzMsMiwyNSwwLDEyNSw0LDg5LDAsMTEwLDIsODgsMCwKKyAgICAxMTYsNiwxMjQsNCwxMzEsMSwxMTQsMTI0LDEyNCw0LDgzLDAsMTI0LDAsODMsMCwKKyAgICA0MSwxMCwxMjIsMTg4LDY3LDExMSwxMTAsMTE4LDEwMSwxMTQsMTE2LDMyLDk3LDMyLDk4LDEyMSwKKyAgICAxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwKKyAgICAzMiwxMTYsMTExLDMyLDk3LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LDExNiwKKyAgICAxMDQsMzIsNDAsMTA1LDEwMiwzMiwxMTIsMTExLDExNSwxMTUsMTA1LDk4LDEwOCwxMDEsNDEsNDYsCisgICAgMTAsMTAsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwxMTUsMzIsMTAyLDExNywxMTAsOTksMTE2LAorICAgIDEwNSwxMTEsMTEwLDMyLDEwMSwxMjAsMTA1LDExNSwxMTYsMTE1LDMyLDExMiwxMTcsMTE0LDEwMSwxMDgsCisgICAgMTIxLDMyLDEwMiwxMTEsMTE0LDMyLDk4LDk3LDk5LDEwNywxMTksOTcsMTE0LDEwMCwxMTUsNDUsCisgICAgOTksMTExLDEwOSwxMTIsOTcsMTE2LDEwNSw5OCwxMDUsMTA4LDEwNSwxMTYsMTIxLDMyLDEwMiwxMTEsCisgICAgMTE0LDEwLDMyLDMyLDMyLDMyLDgwLDEyMSw3MywxMDksMTEyLDExMSwxMTQsMTE2LDk1LDY5LAorICAgIDEyMCwxMDEsOTksNjcsMTExLDEwMCwxMDEsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4NywxMDUsMTE2LAorICAgIDEwNCw3MCwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTUsNDAsNDEsMzIsMTA1LDExMCwzMiwKKyAgICAxMTYsMTA0LDEwMSwzMiw2NywzMiw2NSw4MCw3Myw0NiwxMCwxMCwzMiwzMiwzMiwzMiwKKyAgICAxMTQsNjIsMCwwLDAsNzgsMTE0LDYxLDAsMCwwLDExNCw4MywwLDAsMCwKKyAgICAxMTQsMzEsMCwwLDAsOTAsMiwxMTIsMTIxLDIzMywyNTMsMjU1LDI1NSwyNTUsMjMzLDI1NSwKKyAgICAyNTUsMjU1LDI1NSwxMTQsOTAsMCwwLDAsNDEsNywxMTQsMzMsMCwwLDAsMTE0LAorICAgIDM0LDAsMCwwLDIxOCw1LDEwOCwxMTEsMTE5LDEwMSwxMTQsMTE0LDg4LDAsMCwwLAorICAgIDExNCw2OSwwLDAsMCwxMTQsNzQsMCwwLDAsMTE0LDQ2LDAsMCwwLDQxLAorICAgIDUsMjE4LDEzLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDk1LDExMiw5NywxMTYsMTA0LAorICAgIDExNCw4MSwwLDAsMCwxMTQsMzgsMCwwLDAsOTAsOSwxMDEsMTIwLDExNiwxMDEsCisgICAgMTEwLDExNSwxMDUsMTExLDExMCwyMTgsMTEsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCisgICAgMCwyMTgsMTUsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwxMDIsMTA1LAorICAgIDEwOCwxMDEsNzcsMSwwLDAsMTE1LDIwLDAsMCwwLDAsNywxMiwxLDQsCisgICAgMSwxNiwxLDI2LDEsNCwxLDIsMSwxMiwxLDE4LDEsMTgsMSwxMTQsCisgICAgOTQsMCwwLDAsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLAorICAgIDAsMTEsMCwwLDAsNjcsMCwwLDAsMTE1LDc0LDAsMCwwLDEyNCwwLAorICAgIDEwNiwwLDExNiwxLDExNiwyLDEzMSwxLDEzMSwxLDExNCw0NiwxMjEsOCwxMTYsMywKKyAgICAxMjQsMCwxMzEsMSw4MywwLDQsMCwxMTYsNCwxMDcsMTAsMTE0LDQyLDEsMCwKKyAgICAxLDAsMSwwLDg5LDAsMTEzLDcwLDg4LDAsMTEwLDI0LDEyNCwwLDEwNiwwLAorICAgIDExNiwxLDExNiw1LDEzMSwxLDEzMSwxLDExNCw2NiwxMjQsMCw4MywwLDExMCw0LAorICAgIDEwMCwwLDgzLDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDYsMjE4LDgsMTAxLAorICAgIDExMCwxMDAsMTE1LDExOSwxMDUsMTE2LDEwNCwyMTgsNSwxMTYsMTE3LDExMiwxMDgsMTAxLDExNCw4NywKKyAgICAwLDAsMCwxMTQsODIsMCwwLDAsMTE0LDY5LDAsMCwwLDExNCw3NywwLAorICAgIDAsMCw0MSwxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsOTUsCisgICAgMTAzLDEwMSwxMTYsOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsOTYsMSwwLDAsMTE1LDE2LAorICAgIDAsMCwwLDAsMSwxNCwxLDIsMSw4LDEsMTQsMSw4LDEsMTQsCisgICAgMSw2LDIsMTE0LDk4LDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDExLDAsMCwwLDY3LDAsMCwwLDExNSw1MiwwLAorICAgIDAsMCwxMjEsMTQsMTE2LDAsMTI0LDAsMTMxLDEsMTA2LDEsMTI1LDEsODcsMCwKKyAgICAxMTAsMjQsNCwwLDExNiwyLDEwNywxMCwxMTQsMzgsMSwwLDEsMCwxLDAsCisgICAgMTAwLDEsMTI1LDEsODksMCwxMTAsMiw4OCwwLDEyNCwxLDEwMCwyLDc5LDAsCisgICAgMTI1LDEsMTI0LDEsODMsMCw0MSwzLDEyMiw1MSw2Nyw5NywxMDgsOTksMTE3LDEwOCwKKyAgICA5NywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDEwMSwzMiwxMTIsMTAxLDExNCwKKyAgICAxMDksMTA1LDExNSwxMTUsMTA1LDExMSwxMTAsMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDk4LAorICAgIDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSw0NiwxMDUsMTgyLDEsCisgICAgMCwwLDIzMywxMjgsMCwwLDAsNDEsMywxMTQsNDEsMCwwLDAsMTE0LDQzLAorICAgIDAsMCwwLDExNCw0MiwwLDAsMCw0MSwyLDExNCwzNywwLDAsMCwxMTQsCisgICAgNDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCisgICAgMCwwLDAsMjE4LDEwLDk1LDk5LDk3LDEwOCw5OSw5NSwxMDksMTExLDEwMCwxMDEsMTA4LAorICAgIDEsMCwwLDExNSwxMiwwLDAsMCwwLDIsMiwxLDE0LDEsMTQsMSwKKyAgICAxMCwzLDgsMSwxMTQsMTAwLDAsMCwwLDk5LDEsMCwwLDAsMCwwLAorICAgIDAsMCwzLDAsMCwwLDExLDAsMCwwLDMsMCwwLDAsMTE1LDY4LAorICAgIDAsMCwwLDEwMCw2LDEzNSwwLDEwMiwxLDEwMCwyLDEwMCwzLDEzMiw5LDEyNSwKKyAgICAxLDEyMSwxMCwxMTYsMCwxMDYsMSwxMjUsMiw4NywwLDExMCwyOCw0LDAsMTE2LAorICAgIDIsMTA3LDEwLDExNCw1MiwxLDAsMSwwLDEsMCwxMDAsNCwxMDAsNSwxMzIsCisgICAgMCwxMjUsMiw4OSwwLDExMCwyLDg4LDAsMTI0LDIsMTI0LDEsMTM2LDAsMTMxLAorICAgIDIsMSwwLDEyNCwxLDgzLDAsNDEsNywxMjIsMjUyLDY4LDEwMSw5OSwxMTEsMTE0LAorICAgIDk3LDExNiwxMTEsMTE0LDMyLDExNiwxMTEsMzIsMTE4LDEwMSwxMTQsMTA1LDEwMiwxMjEsMzIsMTE2LAorICAgIDEwNCw5NywxMTYsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTgsCisgICAgMTAxLDEwNSwxMTAsMTAzLDMyLDExNCwxMDEsMTEzLDExNywxMDEsMTE1LDExNiwxMDEsMTAwLDMyLDEwOSwKKyAgICA5NywxMTYsOTksMTA0LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTExLDExMCwxMDEsMzIsMTE2LAorICAgIDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiw5OSw5NywKKyAgICAxMTAsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwKKyAgICAxMDQsMTAxLDMyLDEwMiwxMDUsMTE0LDExNSwxMTYsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsCisgICAgMTE2LDMyLDQwLDExNSwxMDEsMTA4LDEwMiw0MSwzMiwxMDksMTE3LDExNSwxMTYsMzIsMTAwLDEwMSwKKyAgICAxMDIsMTA1LDExMCwxMDEsMzIsOTUsMTEwLDk3LDEwOSwxMDEsMzIsMTE5LDEwNCwxMDUsOTksMTA0LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMDEsOTksMTExLDExMCwxMDAsMzIsOTcsMTE0LDEwMywxMTcsCisgICAgMTA5LDEwMSwxMTAsMTE2LDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsOTksMTExLDEwOSwxMTIsCisgICAgOTcsMTE0LDEwMSwxMDAsMzIsOTcsMTAzLDk3LDEwNSwxMTAsMTE1LDExNiw0NiwzMiw3MywxMDIsCisgICAgMzIsMTE2LDEwNCwxMDEsMzIsOTksMTExLDEwOSwxMTIsOTcsMTE0LDEwNSwxMTUsMTExLDExMCwzMiwKKyAgICAxMDIsOTcsMTA1LDEwOCwxMTUsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDczLDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsNjksMTE0LDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMzIsMTE0LDk3LDEwNSwxMTUsMTAxLDEwMCwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCw5OSwyLDAsMCwwLDAsMCwwLAorICAgIDAsNCwwLDAsMCw1LDAsMCwwLDMxLDAsMCwwLDExNSw2NCwwLAorICAgIDAsMCwxMjQsMSwxMDAsMCwxMDcsOCwxMTQsMTYsMTI0LDAsMTA2LDAsMTI1LDEsCisgICAgMTEwLDM0LDEyNCwwLDEwNiwwLDEyNCwxLDEwNywzLDExNCw1MCwxMTYsMSwxMDAsMSwKKyAgICAxMjQsMCwxMDYsMCwxMjQsMSwxMDIsMiwyMiwwLDEwMCwyLDEyNCwxLDE0NCwxLAorICAgIDEzMSwxLDEzMCwxLDEzNiwwLDEyNCwwLDEyNCwxLDEyNCwyLDEyNCwzLDE0MiwyLAorICAgIDgzLDAsNDEsMyw3OCwxMjIsMzAsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMDIsMTExLAorICAgIDExNCwzMiwzNywxMTUsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDEwNCw5NywxMTAsMTAwLAorICAgIDEwOCwxMDEsMzIsMzcsMTE1LDIxOCw0LDExMCw5NywxMDksMTAxLDQxLDIsMTE0LDEwMSwwLAorICAgIDAsMCwyMTgsMTEsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw2OSwxMTQsMTE0LDExMSwxMTQsNDEsCisgICAgNCwyMTgsNCwxMTUsMTAxLDEwOCwxMDIsMTE0LDEwMSwwLDAsMCwyMTgsNCw5NywxMTQsCisgICAgMTAzLDExNSw5MCw2LDEwNywxMTksOTcsMTE0LDEwMywxMTUsNDEsMSwyMTgsNiwxMDksMTAxLAorICAgIDExNiwxMDQsMTExLDEwMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTksCisgICAgOTUsOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsOTUsMTE5LDExNCw5NywxMTIsCisgICAgMTEyLDEwMSwxMTQsMTI4LDEsMCwwLDExNSwxMiwwLDAsMCwwLDEsOCwxLAorICAgIDgsMSwxMCwxLDQsMSwyMCwxLDEyMiw0MCw5NSw5OSwxMDQsMTAxLDk5LDEwNywKKyAgICA5NSwxMTAsOTcsMTA5LDEwMSw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsOTUsCisgICAgOTksMTA0LDEwMSw5OSwxMDcsOTUsMTEwLDk3LDEwOSwxMDEsOTUsMTE5LDExNCw5NywxMTIsMTEyLAorICAgIDEwMSwxMTQsOTksMiwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNywKKyAgICAwLDAsMCw4MywwLDAsMCwxMTUsNjAsMCwwLDAsMTIwLDQwLDEwMCw1LAorICAgIDY4LDAsOTMsMzIsMTI1LDIsMTE2LDAsMTI0LDEsMTI0LDIsMTMxLDIsMTE0LDYsCisgICAgMTE2LDEsMTI0LDAsMTI0LDIsMTE2LDIsMTI0LDEsMTI0LDIsMTMxLDIsMTMxLDMsCisgICAgMSwwLDExMyw2LDg3LDAsMTI0LDAsMTA2LDMsMTA2LDQsMTI0LDEsMTA2LDMsCisgICAgMTMxLDEsMSwwLDEwMCwwLDgzLDAsNDEsNiw3OCwyMTgsMTAsOTUsOTUsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsOTUsMjE4LDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsCisgICAgOTUsMjE4LDEyLDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDIxOCwKKyAgICA3LDk1LDk1LDEwMCwxMTEsOTksOTUsOTUsNDEsNCwxMjIsMTAsOTUsOTUsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsOTUsOTUsMTIyLDgsOTUsOTUsMTEwLDk3LDEwOSwxMDEsOTUsOTUsCisgICAgMTIyLDEyLDk1LDk1LDExMywxMTcsOTcsMTA4LDExMCw5NywxMDksMTAxLDk1LDk1LDEyMiw3LAorICAgIDk1LDk1LDEwMCwxMTEsOTksOTUsOTUsNDEsNSwyMTgsNywxMDQsOTcsMTE1LDk3LDExNiwKKyAgICAxMTYsMTE0LDIxOCw3LDExNSwxMDEsMTE2LDk3LDExNiwxMTYsMTE0LDIxOCw3LDEwMywxMDEsMTE2LAorICAgIDk3LDExNiwxMTYsMTE0LDIxOCw4LDk1LDk1LDEwMCwxMDUsOTksMTE2LDk1LDk1LDIxOCw2LAorICAgIDExNywxMTIsMTAwLDk3LDExNiwxMDEsNDEsMyw5MCwzLDExMCwxMDEsMTE5LDkwLDMsMTExLAorICAgIDEwOCwxMDAsMTE0LDU1LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDIxOCw1LDk1LDExOSwxMTQsOTcsMTEyLDEzOSwxLDAsCisgICAgMCwxMTUsOCwwLDAsMCwwLDEsMTAsMSwxMCwxLDIyLDEsMTIyLDI2LAorICAgIDk1LDk5LDEwNCwxMDEsOTksMTA3LDk1LDExMCw5NywxMDksMTAxLDQ2LDYwLDEwOCwxMTEsOTksCisgICAgOTcsMTA4LDExNSw2Miw0Niw5NSwxMTksMTE0LDk3LDExMiw0MSwxLDc4LDQxLDMsMjE4LAorICAgIDEwLDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwxMTQsMTE2LDAsMCwwLAorICAgIDIxOCw5LDc4LDk3LDEwOSwxMDEsNjksMTE0LDExNCwxMTEsMTE0LDQxLDMsMTE0LDEwNSwwLAorICAgIDAsMCwxMTQsMTA2LDAsMCwwLDExNCwxMTYsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsNDEsMSwxMTQsMTA1LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMSw5NSwKKyAgICA5OSwxMDQsMTAxLDk5LDEwNyw5NSwxMTAsOTcsMTA5LDEwMSwxMjAsMSwwLDAsMTE1LDE0LAorICAgIDAsMCwwLDAsOCwxNCw3LDIsMSwxMCwxLDE0LDIsMTQsNSwxMCwKKyAgICAxLDExNCwxMTksMCwwLDAsOTksMiwwLDAsMCwwLDAsMCwwLDUsCisgICAgMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNjAsMCwwLDAsCisgICAgMTI0LDAsMTA2LDAsMTI0LDEsMTMxLDEsOTIsMiwxMjUsMiwxMjUsMywxMjQsMiwKKyAgICAxMDAsMSwxMDcsOCwxMTQsNTYsMTE2LDEsMTI0LDMsMTMxLDEsMTE0LDU2LDEwMCwyLAorICAgIDEyNSw0LDExNiwyLDEwNiwzLDEyNCw0LDEwNiw0LDEyNCwzLDEwMCwzLDI1LDAsCisgICAgMTMxLDEsMTE2LDUsMTMxLDIsMSwwLDEyNCwyLDgzLDAsNDEsNCwxMjIsMTU1LAorICAgIDg0LDExNCwxMjEsMzIsMTE2LDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTA4LDExMSwKKyAgICA5NywxMDAsMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSwKKyAgICA5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk4LDEyMSwKKyAgICAzMiwxMDAsMTAxLDEwOCwxMDEsMTAzLDk3LDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTExLDEwLDMyLAorICAgIDMyLDMyLDMyLDExNSwxMDEsMTA4LDEwMiw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA4LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0MCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwKKyAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsCisgICAgOTksOTcsMTE2LDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMDIsOTcsMTE4LDExMSwxMTQsMzIsMTExLAorICAgIDEwMiwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwKKyAgICAxMDEsOTksNDAsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzgsMTIyLDQ0LDc4LDExMSwKKyAgICAxMTYsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTAwLDEwNSwxMTQsMTAxLAorICAgIDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMjMsMTI1LDU4LDMyLDEwOSwxMDUsMTE1LDExNSwxMDUsMTEwLAorICAgIDEwMywzMiw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsMTE0LDYyLDAsMCwwLDQxLAorICAgIDYsMjE4LDExLDEwMiwxMDUsMTEwLDEwMCw5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNCwzMywKKyAgICAwLDAsMCwxMTQsNjMsMCwwLDAsMTE0LDY0LDAsMCwwLDExNCw1MCwwLAorICAgIDAsMCwyMTgsMTMsNzMsMTA5LDExMiwxMTEsMTE0LDExNiw4Nyw5NywxMTQsMTEwLDEwNSwxMTAsCisgICAgMTAzLDQxLDUsMTE0LDEwMywwLDAsMCwyMTgsOCwxMDIsMTE3LDEwOCwxMDgsMTEwLDk3LAorICAgIDEwOSwxMDEsMjE4LDYsMTA4LDExMSw5NywxMDAsMTAxLDExNCwyMTgsOCwxMTIsMTExLDExNCwxMTYsCisgICAgMTA1LDExMSwxMTAsMTE1LDIxOCwzLDEwOSwxMTUsMTAzLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwNCwxMDUsMTA5LDE0OCwxLDAsMCwxMTUsCisgICAgMTAsMCwwLDAsMCwxMCwxNCwxLDE2LDEsNCwxLDIyLDEsMTE0LDEyNiwKKyAgICAwLDAsMCw5OSw0LDAsMCwwLDAsMCwwLDAsMTEsMCwwLDAsCisgICAgMTksMCwwLDAsNjcsMCwwLDAsMTE1LDEyOCwxLDAsMCwxMDUsMCwxMjUsCisgICAgNCwxMjQsMiwxMDAsMSwxMDcsOSwxMTQsMjIsMTI0LDIsMTI0LDQsMTAwLDIsNjAsCisgICAgMCwxMTAsNCwxMDAsMywxMjUsMiwxMjQsMywxMDAsMSwxMDcsOSwxMTQsNDIsMTI0LAorICAgIDMsMTI0LDQsMTAwLDQsNjAsMCwxMjQsMCwxMDAsMSwxMDAsNSwxMzMsMiwyNSwKKyAgICAwLDEyNSw1LDEyNCwwLDEwMCw1LDEwMCw2LDEzMywyLDI1LDAsMTI1LDYsMTI0LAorICAgIDAsMTAwLDYsMTAwLDcsMTMzLDIsMjUsMCwxMjUsNywxMjQsNSwxMTYsMCwxMDcsCisgICAgMywxMTQsMTIyLDEwMCw4LDEwNiwxLDEyNCwyLDEyNCw1LDEzMSwyLDEyNSw4LDExNiwKKyAgICAyLDEwNiwzLDEwMCw5LDEyNCw4LDEzMSwyLDEsMCwxMTYsNCwxMjQsOCwxMjQsCisgICAgNCwxNDEsMSwxMzAsMSwxMTAsODYsMTE2LDUsMTI0LDYsMTMxLDEsMTAwLDUsMTA3LAorICAgIDMsMTE0LDE2NiwxMDAsMTAsMTA2LDEsMTI0LDIsMTMxLDEsMTI1LDgsMTE2LDIsMTA2LAorICAgIDMsMTAwLDksMTI0LDgsMTMxLDIsMSwwLDExNiw2LDEyNCw4LDEzMSwxLDEzMCwKKyAgICAxLDExMCw0MiwxMTYsNSwxMjQsNywxMzEsMSwxMDAsNSwxMDcsMywxMTQsMjA4LDEwMCwKKyAgICAxMSwxMDYsMSwxMjQsMiwxMzEsMSwxMjUsOCwxMTYsMiwxMDYsMywxMDAsOSwxMjQsCisgICAgOCwxMzEsMiwxLDAsMTE2LDYsMTI0LDgsMTMxLDEsMTMwLDEsMTI0LDEsMTAwLAorICAgIDEsMTA3LDksMTQ0LDEsMTE0LDExNiwxMjEsMTYsMTE2LDcsMTI0LDEsMTAwLDEyLDI1LAorICAgIDAsMTMxLDEsMTI1LDksODcsMCwxMTAsMjAsNCwwLDExNiw4LDEwNywxMCwxMTQsCisgICAgMjU0LDEsMCwxLDAsMSwwLDg5LDAsMTEwLDQ4LDg4LDAsMTE2LDksMTI0LAorICAgIDYsMTMxLDEsMTI0LDksMTA3LDMsMTQ0LDEsMTE0LDQ2LDEwMCwxMywxMDYsMSwxMjQsCisgICAgMiwxMzEsMSwxMjUsOCwxMTYsMiwxMDYsMywxMDAsOSwxMjQsOCwxMzEsMiwxLAorICAgIDAsMTE2LDQsMTI0LDgsMTI0LDQsMTQxLDEsMTMwLDEsMTIxLDE2LDEyNCwxLDEwMCwKKyAgICAxNCwyNSwwLDEwMCwxNSw2NCwwLDEyNSwxMCw4NywwLDExMCwyMiw0LDAsMTE2LAorICAgIDgsMTA3LDEwLDE0NCwxLDExNCw4NCwxLDAsMSwwLDEsMCw4OSwwLDExMCwKKyAgICAzMiw4OCwwLDExNiw5LDEyNCw3LDEzMSwxLDEyNCwxMCwxMDcsMywxNDQsMSwxMTQsCisgICAgMTE2LDExNiw0LDEwMCwxMywxMDYsMSwxMjQsMiwxMzEsMSwxMjQsNCwxNDEsMSwxMzAsCisgICAgMSwxMjQsMCwxMDAsNywxMDAsMSwxMzMsMiwyNSwwLDgzLDAsNDEsMTYsOTcsCisgICAgMTIyLDEsMCwwLDg2LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTA0LDEwMSw5NywxMDAsMTAxLDExNCwzMiwxMTEsMTAyLDMyLDExNiwxMDQsMTAxLDMyLDExMiwKKyAgICA5NywxMTUsMTE1LDEwMSwxMDAsNDUsMTA1LDExMCwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLAorICAgIDEwMSwzMiw5NywxMDMsOTcsMTA1LDExMCwxMTUsMTE2LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCisgICAgOTUsMTE1LDExNiw5NywxMTYsMTE1LDMyLDQwLDEwNSwxMDIsMTAsMzIsMzIsMzIsMzIsMTAzLAorICAgIDEwNSwxMTgsMTAxLDExMCw0MSwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAorICAgIDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLAorICAgIDMyLDExNiwxMDQsOTcsMTE2LDMyLDk5LDk3LDExMCwzMiw5OCwxMDEsMzIsOTksMTExLDEwOSwKKyAgICAxMTIsMTA1LDEwOCwxMDEsMTAwLDMyLDk4LDEyMSwzMiw5OSwxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwKKyAgICA0MCw0MSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw2NSwxMDgsMTA4LDMyLDExMSwxMTYsMTA0LAorICAgIDEwMSwxMTQsMzIsOTcsMTE0LDEwMywxMTcsMTA5LDEwMSwxMTAsMTE2LDExNSwzMiw5NywxMTQsMTAxLAorICAgIDMyLDExNywxMTUsMTAxLDEwMCwzMiwxMTYsMTExLDMyLDEwMSwxMTAsMTA0LDk3LDExMCw5OSwxMDEsCisgICAgMzIsMTAxLDExNCwxMTQsMTExLDExNCwzMiwxMTQsMTAxLDExMiwxMTEsMTE0LDExNiwxMDUsMTEwLDEwMywKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiw3MywxMDksMTEyLDExMSwxMTQsMTE2LDY5LDExNCwxMTQsCisgICAgMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsCisgICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSw5NywxMDMsMTA1LDk5LDMyLDExMCwxMTcsMTA5LDk4LAorICAgIDEwMSwxMTQsMzIsMTA1LDExNSwzMiwxMDUsMTEwLDk5LDExMSwxMTQsMTE0LDEwMSw5OSwxMTYsMzIsCisgICAgMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwKKyAgICAxMDUsMTE1LDEwLDMyLDMyLDMyLDMyLDEwMiwxMTEsMTE3LDExMCwxMDAsMzIsMTE2LDExMSwzMiwKKyAgICA5OCwxMDEsMzIsMTE1LDExNiw5NywxMDgsMTAxLDQ2LDMyLDY5LDc5LDcwLDY5LDExNCwxMTQsCisgICAgMTExLDExNCwzMiwxMDUsMTE1LDMyLDExNCw5NywxMDUsMTE1LDEwMSwxMDAsMzIsMTE5LDEwNCwxMDEsCisgICAgMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCw5NywxMTYsOTcsMzIsMTA1LDExNSwzMiwxMDIsMTExLAorICAgIDExNywxMTAsMTAwLDMyLDExNiwxMTEsMzIsOTgsMTAxLDEwLDMyLDMyLDMyLDMyLDExNiwxMTQsCisgICAgMTE3LDExMCw5OSw5NywxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OCwxMTQsCisgICAgMTAxLDAsMCwwLDEyMiwxMCw2MCw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw2MiwKKyAgICAxMTQsMzcsMCwwLDAsMTE0LDE0LDAsMCwwLDIzMyw4LDAsMCwwLDIzMywKKyAgICAxMiwwLDAsMCwxMjIsMzAsOTgsOTcsMTAwLDMyLDEwOSw5NywxMDMsMTA1LDk5LDMyLAorICAgIDExMCwxMTcsMTA5LDk4LDEwMSwxMTQsMzIsMTA1LDExMCwzMiwxMjMsMzMsMTE0LDEyNSw1OCwzMiwKKyAgICAxMjMsMzMsMTE0LDEyNSwxMjIsMiwxMjMsMTI1LDEyMiw0MywxMTQsMTAxLDk3LDk5LDEwNCwxMDEsCisgICAgMTAwLDMyLDY5LDc5LDcwLDMyLDExOSwxMDQsMTA1LDEwOCwxMDEsMzIsMTE0LDEwMSw5NywxMDAsCisgICAgMTA1LDExMCwxMDMsMzIsMTE2LDEwNSwxMDksMTAxLDExNSwxMTYsOTcsMTA5LDExMiwzMiwxMDUsMTEwLAorICAgIDMyLDEyMywzMywxMTQsMTI1LDEyMiw0OCwxMTQsMTAxLDk3LDk5LDEwNCwxMDEsMTAwLDMyLDY5LAorICAgIDc5LDcwLDMyLDExOSwxMDQsMTA1LDEwOCwxMDEsMzIsMTE0LDEwMSw5NywxMDAsMTA1LDExMCwxMDMsCisgICAgMzIsMTE1LDEwNSwxMjIsMTAxLDMyLDExMSwxMDIsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwKKyAgICAxMDUsMTEwLDMyLDEyMywzMywxMTQsMTI1LDIxOCw1LDEwOSwxMTYsMTA1LDEwOSwxMDEsMTIyLDI2LAorICAgIDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwNSwxMTUsMzIsMTE1LDExNiw5NywxMDgsCisgICAgMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDEyMywzMywxMTQsMTI1LDIxOCw0LDExNSwxMDUsMTIyLDEwMSwKKyAgICAxMDgsMywwLDAsMCwyNTUsMTI3LDI1NSwxMjcsMywwLDQxLDEwLDIxOCwxMiw3NywKKyAgICA2NSw3MSw3Myw2Nyw5NSw3OCw4NSw3Nyw2Niw2OSw4MiwxMTQsNTAsMCwwLDAsCisgICAgMTE0LDExNywwLDAsMCwyMTgsMTYsOTUsMTE4LDEwMSwxMTQsOTgsMTExLDExNSwxMDEsOTUsCisgICAgMTA5LDEwMSwxMTUsMTE1LDk3LDEwMywxMDEsMTE0LDEwMiwwLDAsMCwxMTQsMzMsMCwwLAorICAgIDAsMjE4LDgsNjksNzksNzAsNjksMTE0LDExNCwxMTEsMTE0LDExNCwxNiwwLDAsMCwKKyAgICAyMTgsOCw3NSwxMDEsMTIxLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMjEsMCwwLDAsNDEsCisgICAgMTEsMTE0LDU2LDAsMCwwLDIxOCwxMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDExNSwKKyAgICAxMTYsOTcsMTE2LDExNSwxMTQsMTAxLDAsMCwwLDExNCwzNywwLDAsMCw5MCwxMSwKKyAgICAxMDEsMTIwLDk5LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsMTE1LDkwLDUsMTA5LDk3LDEwMywKKyAgICAxMDUsOTksOTAsMTMsMTE0LDk3LDExOSw5NSwxMTYsMTA1LDEwOSwxMDEsMTE1LDExNiw5NywxMDksCisgICAgMTEyLDkwLDgsMTE0LDk3LDExOSw5NSwxMTUsMTA1LDEyMiwxMDEsMTE0LDc4LDAsMCwwLAorICAgIDIxOCwxMiwxMTUsMTExLDExNywxMTQsOTksMTAxLDk1LDEwOSwxMTYsMTA1LDEwOSwxMDEsMjE4LDExLAorICAgIDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE1LDEwNSwxMjIsMTAxLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwyNSw5NSwxMTgsOTcsMTA4LAorICAgIDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSw5NSwxMDQsCisgICAgMTAxLDk3LDEwMCwxMDEsMTE0LDE2NSwxLDAsMCwxMTUsNzYsMCwwLDAsMCwxMSwKKyAgICA0LDEsOCwxLDEwLDMsNCwxLDgsMSw4LDEsMTIsMSwxMiwxLAorICAgIDEyLDEsOCwxLDEyLDEsMTIsMSwxMiwxLDEyLDEsMTAsMSwxMiwxLAorICAgIDEwLDEsMTIsMSwxMCwxLDEyLDEsOCwxLDEwLDEsMiwxLDE2LDEsCisgICAgMTQsMSw2LDIsMTQsMSwxMCwxLDEyLDEsMTAsMSwyLDEsMTYsMSwKKyAgICAxNiwxLDYsMiwxNCwxLDEwLDEsNiwxLDExNCwxMzgsMCwwLDAsOTksCisgICAgNCwwLDAsMCwwLDAsMCwwLDUsMCwwLDAsNiwwLDAsMCwKKyAgICA2NywwLDAsMCwxMTUsODYsMCwwLDAsMTE2LDAsMTA2LDEsMTI0LDAsMTMxLAorICAgIDEsMTI1LDQsMTE2LDIsMTI0LDQsMTE2LDMsMTMxLDIsMTE0LDU4LDExNiw0LDEwNiwKKyAgICA1LDEwMCwxLDEyNCwyLDEzMSwyLDEsMCwxMjQsMywxMDAsMiwxMDcsOSwxMTQsCisgICAgNTIsMTE2LDYsMTA2LDcsMTI0LDQsMTI0LDMsMTMxLDIsMSwwLDEyNCw0LDgzLAorICAgIDAsMTEwLDI0LDExNiw4LDEwMCwzLDEwNiw5LDEyNCwyLDEzMSwxLDEwMCw0LDEyNCwKKyAgICAxLDEwMCw1LDEyNCwyLDE0NCwyLDEzMSwxLDEzMCwxLDEwMCwyLDgzLDAsNDEsCisgICAgNiwxMjIsNjAsNjcsMTExLDEwOSwxMTIsMTA1LDEwOCwxMDEsMzIsOTgsMTIxLDExNiwxMDEsOTksCisgICAgMTExLDEwMCwxMDEsMzIsOTcsMTE1LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDEwMSwxMDAsMzIsCisgICAgOTgsMTIxLDMyLDk1LDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk4LDEyMSwxMTYsCisgICAgMTAxLDk5LDExMSwxMDAsMTAxLDk1LDEwNCwxMDEsOTcsMTAwLDEwMSwxMTQsNDAsNDEsNDYsMTIyLAorICAgIDIxLDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwKKyAgICAxMDksMzIsMTIzLDMzLDExNCwxMjUsNzgsMTIyLDIzLDc4LDExMSwxMTAsNDUsOTksMTExLDEwMCwKKyAgICAxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwNSwxMTAsMzIsMTIzLDMzLDExNCwxMjUsCisgICAgMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwwLDAsNDEsMTAsMjE4LDcsMTA5LDk3LAorICAgIDExNCwxMTUsMTA0LDk3LDEwOCw5MCw1LDEwOCwxMTEsOTcsMTAwLDExNSwyMTgsMTAsMTA1LDExNSwKKyAgICAxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwyMTgsMTAsOTUsOTksMTExLDEwMCwxMDEsOTUsCisgICAgMTE2LDEyMSwxMTIsMTAxLDExNCwxMTcsMCwwLDAsMTE0LDEzMiwwLDAsMCwyMTgsNCwKKyAgICA5NSwxMDUsMTA5LDExMiw5MCwxNiw5NSwxMDIsMTA1LDEyMCw5NSw5OSwxMTEsOTUsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDExNCwxMDIsMCwwLDAsMTE0LDUwLDAsMCwwLAorICAgIDQxLDUsMTE0LDU2LDAsMCwwLDExNCwxMDEsMCwwLDAsMTE0LDkyLDAsMCwKKyAgICAwLDExNCw5MywwLDAsMCwyMTgsNCw5OSwxMTEsMTAwLDEwMSwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsOTUsOTksMTExLAorICAgIDEwOSwxMTIsMTA1LDEwOCwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMjIwLDEsCisgICAgMCwwLDExNSwxNiwwLDAsMCwwLDIsMTAsMSwxMCwxLDEyLDEsOCwKKyAgICAxLDEyLDEsNiwyLDEyLDEsMTE0LDE0NCwwLDAsMCwxMTQsNjIsMCwwLAorICAgIDAsOTksMywwLDAsMCwwLDAsMCwwLDQsMCwwLDAsMywwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsNTYsMCwwLDAsMTE2LDAsMTE2LDEsMTMxLAorICAgIDEsMTI1LDMsMTI0LDMsMTA2LDIsMTE2LDMsMTI0LDEsMTMxLDEsMTMxLDEsMSwKKyAgICAwLDEyNCwzLDEwNiwyLDExNiwzLDEyNCwyLDEzMSwxLDEzMSwxLDEsMCwxMjQsCisgICAgMywxMDYsMiwxMTYsNCwxMDYsNSwxMjQsMCwxMzEsMSwxMzEsMSwxLDAsMTI0LAorICAgIDMsODMsMCw0MSwxLDEyMiw4MCw2NywxMTEsMTA5LDExMiwxMDUsMTA4LDEwMSwzMiw5NywKKyAgICAzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsMTA1LDExMCwxMTYsCisgICAgMTExLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDMyLDEwMiwxMTEsMTE0LDMyLDExOSwKKyAgICAxMTQsMTA1LDExNiwxMDUsMTEwLDEwMywzMiwxMTEsMTE3LDExNiwzMiwxMTYsMTExLDMyLDk3LDMyLAorICAgIDk4LDEyMSwxMTYsMTAxLDQ1LDk5LDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDEwMCwxMCwzMiwzMiwKKyAgICAzMiwzMiwxMDIsMTA1LDEwOCwxMDEsNDYsNDEsNiwyMTgsOSw5OCwxMjEsMTE2LDEwMSw5NywKKyAgICAxMTQsMTE0LDk3LDEyMSwxMTQsMTMxLDAsMCwwLDIxOCw2LDEwMSwxMjAsMTE2LDEwMSwxMTAsCisgICAgMTAwLDExNCwxOSwwLDAsMCwxMTQsMTM5LDAsMCwwLDkwLDUsMTAwLDExNywxMDksCisgICAgMTEyLDExNSw0MSw0LDExNCwxNDMsMCwwLDAsMTE0LDEyOSwwLDAsMCwxMTQsMTM3LAorICAgIDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNiwwLDAsMCwyMTgsMTcsOTUsOTksMTExLDEwMCwxMDEsOTUsMTE2LAorICAgIDExMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwyMzIsMSwwLDAsMTE1LDEwLAorICAgIDAsMCwwLDAsMyw4LDEsMTQsMSwxNCwxLDE2LDEsMTE0LDE0NywwLAorICAgIDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCw0LAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSw2MiwwLDAsMCwxMDAsMSwxMDAsMiwKKyAgICAxMDgsMCwxMjUsMSwxMTYsMSwxMDYsMiwxMjQsMCwxMzEsMSwxMDYsMywxMjUsMiwKKyAgICAxMjQsMSwxMDYsNCwxMjQsMiwxMzEsMSwxMjUsMywxMTYsMSwxMDYsNSwxMDAsMiwKKyAgICAxMDAsMywxMzEsMiwxMjUsNCwxMjQsNCwxMDYsNiwxMjQsMCwxMDYsNiwxMjQsMywKKyAgICAxMDAsMSwyNSwwLDEzMSwxLDEzMSwxLDgzLDAsNDEsNCwxMjIsMTIxLDY4LDEwMSwKKyAgICA5OSwxMTEsMTAwLDEwMSwzMiw5OCwxMjEsMTE2LDEwMSwxMTUsMzIsMTE0LDEwMSwxMTIsMTE0LDEwMSwKKyAgICAxMTUsMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiw5OSwKKyAgICAxMTEsMTAwLDEwMSwzMiw5NywxMTAsMTAwLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLAorICAgIDg1LDExMCwxMDUsMTE4LDEwMSwxMTQsMTE1LDk3LDEwOCwzMiwxMTAsMTAxLDExOSwxMDgsMTA1LDExMCwKKyAgICAxMDEsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDMyLDEwNSwxMTUsMzIsMTE3LDExNSwxMDEsCisgICAgMTAwLDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwMSw5OSwxMTEsMTAwLDEwNSwxMTAsCisgICAgMTAzLDQ2LDEwLDMyLDMyLDMyLDMyLDExNCw2MiwwLDAsMCw3OCw4NCw0MSw3LAorICAgIDIxOCw4LDExNiwxMTEsMTA3LDEwMSwxMTAsMTA1LDEyMiwxMDEsMTE0LDUyLDAsMCwwLDkwLAorICAgIDcsNjYsMTIxLDExNiwxMDEsMTE1LDczLDc5LDkwLDgsMTE0LDEwMSw5NywxMDAsMTA4LDEwNSwKKyAgICAxMTAsMTAxLDkwLDE1LDEwMCwxMDEsMTE2LDEwMSw5OSwxMTYsOTUsMTAxLDExMCw5OSwxMTEsMTAwLAorICAgIDEwNSwxMTAsMTAzLDkwLDI1LDczLDExMCw5OSwxMTQsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMDgsCisgICAgNzgsMTAxLDExOSwxMDgsMTA1LDExMCwxMDEsNjgsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMTgsNiwKKyAgICAxMDAsMTAxLDk5LDExMSwxMDAsMTAxLDQxLDUsMjE4LDEyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsCisgICAgOTUsOTgsMTIxLDExNiwxMDEsMTE1LDExNCwxNDgsMCwwLDAsOTAsMjEsMTE1LDExMSwxMTcsCisgICAgMTE0LDk5LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSwxMTUsOTUsMTE0LDEwMSw5NywxMDAsMTA4LDEwNSwKKyAgICAxMTAsMTAxLDIxOCw4LDEwMSwxMTAsOTksMTExLDEwMCwxMDUsMTEwLDEwMyw5MCwxNSwxMTAsMTAxLAorICAgIDExOSwxMDgsMTA1LDExMCwxMDEsOTUsMTAwLDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEzLDEwMCwxMDEsCisgICAgOTksMTExLDEwMCwxMDEsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwyNDIsMSwwLDAsMTE1LAorICAgIDEwLDAsMCwwLDAsNSw4LDEsMTIsMSwxMCwxLDEyLDEsMTE0LDE1MiwKKyAgICAwLDAsMCw0MSwyLDExNCwxMjMsMCwwLDAsMjE4LDI2LDExNSwxMTcsOTgsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksCisgICAgOTcsMTE2LDEwNSwxMTEsMTEwLDExNSw5OSwyLDAsMCwwLDIsMCwwLDAsOSwKKyAgICAwLDAsMCwxOSwwLDAsMCw2NywwLDAsMCwxMTUsOCwxLDAsMCwKKyAgICAxMjQsMSwxMDAsMSwxMDcsOCwxMTQsNTgsMTAwLDIsMTI1LDEsMTE2LDAsMTI0LDIsCisgICAgMTAwLDMsMTMxLDIsMTE0LDU4LDEyMSwxNCwxMjQsMiwxMDYsMSwxMjQsMCwxMzEsMSwKKyAgICAxMjUsMSw4NywwLDExMCwyMCw0LDAsMTE2LDIsMTA3LDEwLDExNCw1NiwxLDAsCisgICAgMSwwLDEsMCw4OSwwLDExMCwyLDg4LDAsMTE2LDMsMTA2LDQsMTI0LDAsCisgICAgMTI0LDIsMTAwLDQsMTI0LDEsMTQ0LDEsMTMxLDIsMTI1LDQsMTAwLDUsMTI0LDQsCisgICAgOTUsNSwxMjQsMiwxMDAsMSwxMDcsOCwxMTQsMTQ2LDEyMCw1NCwxMTYsNiwxMzEsMCwKKyAgICA2OCwwLDkzLDQwLDkyLDIsMTI1LDUsMTI1LDYsMTI0LDEsMTA2LDcsMTE2LDgsCisgICAgMTI0LDYsMTMxLDEsMTMxLDEsMTE0LDk4LDEyNCw1LDEyNCwwLDEyNCwxLDEzMSwyLAorICAgIDEyNSwyLDEyNCwyLDEyNCw0LDk1LDksODAsMCwxMTMsOTgsODcsMCwxMDAsMSwKKyAgICA4MywwLDEyNCwzLDExNiwxMCwxMDcsOCwxMTQsMjEyLDExNiwwLDEyNCwyLDEwMCw2LAorICAgIDEzMSwyLDExNCwyMTgsMTIxLDE0LDEyNCwyLDEwNiwxMSwxMjQsMCwxMzEsMSwxMjUsNywKKyAgICA4NywwLDExMCwyMCw0LDAsMTE2LDIsMTA3LDEwLDExNCwxOTgsMSwwLDEsMCwKKyAgICAxLDAsODksMCwxMTMsMjE4LDg4LDAsMTI0LDcsMTE0LDIxOCwxMDMsMCwxMjQsNCwKKyAgICA5NSwxMiwxMTAsNiwxMjQsMywxMjQsNCw5NSwxMiwxMjQsNCwxMDYsMTIsMTAzLDAsCisgICAgMTA3LDIsMTQ0LDEsMTE0LDQsMTI0LDEsMTQ0LDEsMTE0LDQsMTE2LDEzLDEyNCwxLAorICAgIDEzMSwxLDEwMCw3LDI1LDAsMTI1LDgsMTI0LDQsMTA2LDEyLDEwNiwxNCwxMjQsOCwKKyAgICAxMzEsMSwxLDAsMTI0LDQsODMsMCw0MSw4LDk3LDYxLDEsMCwwLDgyLAorICAgIDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsOTcsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTE1LAorICAgIDExMiwxMDEsOTksMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwzMiw5NywzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsMzIsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsNDYsMTAsMTAsMzIsCisgICAgMzIsMzIsMzIsODQsMTExLDMyLDEwNSwxMTAsMTAwLDEwNSw5OSw5NywxMTYsMTAxLDMyLDExNiwKKyAgICAxMDQsOTcsMTE2LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwNSwKKyAgICAxMTUsMzIsOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQ0LDMyLDExNSwxMDEsMTE2LAorICAgIDEwLDMyLDMyLDMyLDMyLDExNSwxMTcsOTgsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTE1LAorICAgIDEwMSw5NywxMTQsOTksMTA0LDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDExNSwzMiwKKyAgICAxMTYsMTExLDMyLDk3LDMyLDEwOCwxMDUsMTE1LDExNiwzMiwxMTEsMTAyLDMyLDEwMCwxMDUsMTE0LAorICAgIDEwMSw5OSwxMTYsMTExLDExNCwxMjEsMzIsMTEyLDk3LDExNiwxMDQsMTE1LDQ2LDMyLDMyLDY1LAorICAgIDExMCwxMCwzMiwzMiwzMiwzMiwxMDEsMTA5LDExMiwxMTYsMTIxLDMyLDEwOCwxMDUsMTE1LDExNiwKKyAgICAzMiwxMDUsMTE1LDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsOTksMTA1LDEwMSwxMTAsMTE2LDQ0LDMyLAorICAgIDExNiwxMDQsMTExLDExNywxMDMsMTA0LDMyLDEwNSwxMTYsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDExMSwKKyAgICAxMTYsMTA0LDEwMSwxMTQsMTE5LDEwNSwxMTUsMTAxLDMyLDExNywxMTUsMTAxLDEwMiwxMTcsMTA4LDMyLAorICAgIDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMTAsMzIsMzIsMzIsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwKKyAgICAxMTYsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsCisgICAgMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDEwOSwxMTcsMTE1LDExNiwzMiwxMTYsCisgICAgOTcsMTA3LDEwMSwzMiw5NywzMiwxMTUsMTEyLDEwMSw5OSwzMiw5NywxMTUsMzIsMTA1LDExNiwKKyAgICAxMTUsMzIsMTExLDExMCwxMDgsMTIxLDMyLDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MCwKKyAgICA0MSwzMiw5NywxMTQsMTAzLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDc4LDEyMiw5LDYwLAorICAgIDExNywxMTAsMTA3LDExMCwxMTEsMTE5LDExMCw2MiwyMTgsMTIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDIxOCw2LDExMSwxMTQsMTA1LDEwMywxMDUsMTEwLDg0LDIxOCwKKyAgICAxMCwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwxMTQsNjIsMCwwLDAsCisgICAgNDEsMTUsMTE0LDExMSwwLDAsMCwxMTQsMTU0LDAsMCwwLDExNCwxMDIsMCwwLAorICAgIDAsMTE0LDExNywwLDAsMCwyMTgsMTAsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSw4MywxMTIsCisgICAgMTAxLDk5LDkwLDEzLDk1LDExNSwxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSw5NywxMTYsMTE2LAorICAgIDExNCwyMTgsMjcsOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwKKyAgICAxMDAsOTUsMTAyLDEwNSwxMDgsMTAxLDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCw5NSwKKyAgICAwLDAsMCwxMTQsOTYsMCwwLDAsMTE0LDEyMywwLDAsMCwyMTgsOSw5NSwKKyAgICA4MCw3OSw4MCw4NSw3Niw2NSw4NCw2OSwxMTQsMTU2LDAsMCwwLDExNCwxNTMsMCwKKyAgICAwLDAsMTE0LDQwLDAsMCwwLDIxOCw2LDk3LDExMiwxMTIsMTAxLDExMCwxMDAsNDEsCisgICAgOSwxMTQsMTAxLDAsMCwwLDkwLDgsMTA4LDExMSw5OSw5NywxMTYsMTA1LDExMSwxMTAsCisgICAgMTE0LDEyMywwLDAsMCwxMTQsMTUzLDAsMCwwLDIxOCw0LDExNSwxMTIsMTAxLDk5LAorICAgIDIxOCwxMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDk5LDEwOCw5NywxMTUsMTE1LDIxOCw4LAorICAgIDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsMTE0LDE1NiwwLDAsMCw5MCw3LDEwMCwKKyAgICAxMDUsMTE0LDExMCw5NywxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw2LDAsMCwwLDIxOCwyMywxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksCisgICAgOTUsMTAyLDEwNSwxMDgsMTAxLDk1LDEwOCwxMTEsOTksOTcsMTE2LDEwNSwxMTEsMTEwLDMsMiwKKyAgICAwLDAsMTE1LDYwLDAsMCwwLDAsMTIsOCw0LDQsMSwxMCwyLDIsCisgICAgMSwxNCwxLDE0LDEsNiw4LDE4LDEsNiwzLDgsMSwxNiwxLDE0LAorICAgIDEsMTAsMSw2LDEsNiwyLDQsMyw4LDIsMTAsMSwyLDEsMTQsCisgICAgMSwxNCwxLDYsMiw0LDEsOCwyLDYsMSwxMiwxLDYsMSwxMiwKKyAgICAxLDEyLDIsMTE0LDE2NCwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCw0LDAsMCwwLDY0LDAsMCwwLDExNSw4MCwwLAorICAgIDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwKKyAgICA5MCw0LDEwMCwzLDkwLDUsMTAwLDQsOTAsNiwxMDEsNywxMDAsNSwxMDAsNiwKKyAgICAxMzIsMCwxMzEsMSw5MCw4LDEwMSw3LDEwMCw3LDEwMCw4LDEzMiwwLDEzMSwxLAorICAgIDkwLDksMTAxLDcsMTAwLDE0LDEwMCwxMCwxMDAsMTEsMTMyLDEsMTMxLDEsOTAsMTAsCisgICAgMTAxLDcsMTAwLDE1LDEwMCwxMiwxMDAsMTMsMTMyLDEsMTMxLDEsOTAsMTEsMTAwLDksCisgICAgODMsMCw0MSwxNiwyMTgsMjEsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywKKyAgICAxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTIyLDYyLDc3LDEwMSwxMTYsCisgICAgOTcsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwKKyAgICAxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDEwMCwxMDEsOTksMTA4LDk3LDExNCwKKyAgICAxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsODcsMTA1LDExMCwxMDAsMTExLDExOSwKKyAgICAxMTUsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwxMjIsNTksODMsMTExLDEwMiwKKyAgICAxMTYsMTE5LDk3LDExNCwxMDEsOTIsODAsMTIxLDExNiwxMDQsMTExLDExMCw5Miw4MCwxMjEsMTE2LAorICAgIDEwNCwxMTEsMTEwLDY3LDExMSwxMTQsMTAxLDkyLDEyMywxMTUsMTIxLDExNSw5NSwxMTgsMTAxLDExNCwKKyAgICAxMTUsMTA1LDExMSwxMTAsMTI1LDkyLDc3LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDkyLDEyMywxMDIsCisgICAgMTE3LDEwOCwxMDgsMTEwLDk3LDEwOSwxMDEsMTI1LDEyMiw2NSw4MywxMTEsMTAyLDExNiwxMTksOTcsCisgICAgMTE0LDEwMSw5Miw4MCwxMjEsMTE2LDEwNCwxMTEsMTEwLDkyLDgwLDEyMSwxMTYsMTA0LDExMSwxMTAsCisgICAgNjcsMTExLDExNCwxMDEsOTIsMTIzLDExNSwxMjEsMTE1LDk1LDExOCwxMDEsMTE0LDExNSwxMDUsMTExLAorICAgIDExMCwxMjUsOTIsNzcsMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsOTIsMTIzLDEwMiwxMTcsMTA4LDEwOCwKKyAgICAxMTAsOTcsMTA5LDEwMSwxMjUsOTIsNjgsMTAxLDk4LDExNywxMDMsNzAsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMTEsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDUwLDAsMCwwLDEyMSwxNCwxMTYsMCwxMDYsMSwxMTYsMCwxMDYsMiwKKyAgICAxMjQsMSwxMzEsMiw4MywwLDQsMCwxMTYsMywxMDcsMTAsMTE0LDQ0LDEsMCwKKyAgICAxLDAsMSwwLDExNiwwLDEwNiwxLDExNiwwLDEwNiw0LDEyNCwxLDEzMSwyLAorICAgIDgzLDAsODgsMCwxMDAsMCw4MywwLDQxLDEsNzgsNDEsNSwyMTgsNyw5NSwKKyAgICAxMTksMTA1LDExMCwxMTQsMTAxLDEwMyw5MCw3LDc5LDExMiwxMDEsMTEwLDc1LDEwMSwxMjEsOTAsCisgICAgMTcsNzIsNzUsNjksODksOTUsNjcsODUsODIsODIsNjksNzgsODQsOTUsODUsODMsCisgICAgNjksODIsMTE0LDQyLDAsMCwwLDkwLDE4LDcyLDc1LDY5LDg5LDk1LDc2LDc5LAorICAgIDY3LDY1LDc2LDk1LDc3LDY1LDY3LDcyLDczLDc4LDY5LDQxLDIsMjE4LDMsOTksCisgICAgMTA4LDExNSwxMTQsNSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwyMTgsMTQsOTUsMTExLDExMiwxMDEsMTEwLDk1LDExNCwxMDEsCisgICAgMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsODEsMiwwLDAsMTE1LDgsMCwwLDAsMCwKKyAgICAyLDIsMSwxNCwxLDE0LDEsMTIyLDM2LDg3LDEwNSwxMTAsMTAwLDExMSwxMTksMTE1LAorICAgIDgyLDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LAorICAgIDExMSwxMTIsMTAxLDExMCw5NSwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDk5LDIsMCwKKyAgICAwLDAsMCwwLDAsMCw2LDAsMCwwLDE2LDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwxMTYsMCwwLDAsMTI0LDAsMTA2LDAsMTE0LDE0LDEyNCwwLDEwNiwKKyAgICAxLDEyNSwyLDExMCw2LDEyNCwwLDEwNiwyLDEyNSwyLDEyNCwyLDEwNiwzLDEwMCwKKyAgICAxLDEyNCwxLDEwMCwyLDEwMCwzLDExNiw0LDEwNiw1LDEwMCwwLDEwMCw0LDEzMywKKyAgICAyLDI1LDAsMjIsMCwxNDQsMiwxMzEsMCwxMjUsMywxMjEsMzgsMTI0LDAsMTA2LAorICAgIDYsMTI0LDMsMTMxLDEsMTQzLDE4LDEyNSw0LDExNiw3LDEwNiw4LDEyNCw0LDEwMCwKKyAgICA1LDEzMSwyLDEyNSw1LDg3LDAsMTAwLDAsODEsMCw4MiwwLDg4LDAsODcsCisgICAgMCwxMTAsMjAsNCwwLDExNiw5LDEwNywxMCwxMTQsMTEwLDEsMCwxLDAsMSwKKyAgICAwLDEwMCwwLDgzLDAsODgsMCwxMjQsNSw4MywwLDQxLDYsNzgsMTE0LDEyMiwKKyAgICAwLDAsMCw5MCwxMSwxMTUsMTIxLDExNSw5NSwxMTgsMTAxLDExNCwxMTUsMTA1LDExMSwxMTAsCisgICAgMTIyLDUsMzcsMTAwLDQ2LDM3LDEwMCwxMTQsNTksMCwwLDAsMTE0LDMyLDAsMCwKKyAgICAwLDQxLDEwLDIxOCwxMSw2OCw2OSw2Niw4NSw3MSw5NSw2Niw4NSw3Myw3Niw2OCwKKyAgICAyMTgsMTgsODIsNjksNzEsNzMsODMsODQsODIsODksOTUsNzUsNjksODksOTUsNjgsCisgICAgNjksNjYsODUsNzEsMjE4LDEyLDgyLDY5LDcxLDczLDgzLDg0LDgyLDg5LDk1LDc1LAorICAgIDY5LDg5LDExNCw1MCwwLDAsMCwxMTQsOCwwLDAsMCwyMTgsMTIsMTE4LDEwMSwKKyAgICAxMTQsMTE1LDEwNSwxMTEsMTEwLDk1LDEwNSwxMTAsMTAyLDExMSwxMTQsMTY4LDAsMCwwLDExNCwKKyAgICAxNjYsMCwwLDAsOTAsMTAsODEsMTE3LDEwMSwxMTQsMTIxLDg2LDk3LDEwOCwxMTcsMTAxLAorICAgIDExNCw0MiwwLDAsMCw0MSw2LDExNCwxNjcsMCwwLDAsMTE0LDEyMiwwLDAsCisgICAgMCw5MCwxMiwxMTQsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDk1LDEwNywxMDEsMTIxLDExNCwKKyAgICA1LDAsMCwwLDkwLDQsMTA0LDEwNywxMDEsMTIxLDIxOCw4LDEwMiwxMDUsMTA4LDEwMSwKKyAgICAxMTIsOTcsMTE2LDEwNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKKyAgICAwLDAsMCwyMTgsMTYsOTUsMTE1LDEwMSw5NywxMTQsOTksMTA0LDk1LDExNCwxMDEsMTAzLAorICAgIDEwNSwxMTUsMTE2LDExNCwxMjEsODgsMiwwLDAsMTE1LDIyLDAsMCwwLDAsMiwKKyAgICA2LDEsOCwyLDYsMSwxMCwxLDIyLDEsMiwxLDEyLDEsMjYsMSwKKyAgICAxNCwxLDYsMSwxMjIsMzgsODcsMTA1LDExMCwxMDAsMTExLDExOSwxMTUsODIsMTAxLDEwMywKKyAgICAxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTE1LDEwMSw5NywKKyAgICAxMTQsOTksMTA0LDk1LDExNCwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzgsOTksNCwwLAorICAgIDAsMCwwLDAsMCwwLDgsMCwwLDAsMTQsMCwwLDAsNjcsMCwKKyAgICAwLDAsMTE1LDEyMiwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMzEsMSwxMjUsCisgICAgNCwxMjQsNCwxMDAsMCwxMDcsOCwxMTQsMjIsMTAwLDAsODMsMCwxMjEsMTIsMTE2LAorICAgIDEsMTI0LDQsMTMxLDEsMSwwLDg3LDAsMTEwLDIwLDQsMCwxMTYsMiwxMDcsCisgICAgMTAsMTE0LDU0LDEsMCwxLDAsMSwwLDEwMCwwLDgzLDAsODgsMCwxMjAsCisgICAgNjAsMTE2LDMsMTMxLDAsNjgsMCw5Myw1MCw5MiwyLDEyNSw1LDEyNSw2LDEyNCwKKyAgICA0LDEwNiw0LDExNiw1LDEyNCw2LDEzMSwxLDEzMSwxLDExNCw2NCwxMTYsNiwxMDYsCisgICAgNywxMjQsMSwxMjQsNSwxMjQsMSwxMjQsNCwxMzEsMiwxMDAsMSwxMjQsNCwxNDQsCisgICAgMSwxMzEsMiwxMjUsNywxMjQsNyw4MywwLDExMyw2NCw4NywwLDEwMCwwLDgzLAorICAgIDAsNDEsMiw3OCwxMTQsMTU1LDAsMCwwLDQxLDgsMTE0LDE3NCwwLDAsMCwKKyAgICAxMTQsNDEsMCwwLDAsMTE0LDQyLDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LAorICAgIDk1LDAsMCwwLDExNCw5NiwwLDAsMCwxMTQsMTE3LDAsMCwwLDIxOCwxNiwKKyAgICAxMTUsMTEyLDEwMSw5OSw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKKyAgICA0MSw4LDExNCwxNjcsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsMzcsMCwwLAorICAgIDAsMjE4LDYsMTE2LDk3LDExNCwxMDMsMTAxLDExNiwxMTQsMTczLDAsMCwwLDExNCwxMjMsCisgICAgMCwwLDAsMTE0LDE2MywwLDAsMCwxMTQsMTYxLDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCw5LDEwMiwxMDUsCisgICAgMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSwxMDMsMiwwLDAsMTE1LDI2LDAsMCwwLAorICAgIDAsMiwxMCwxLDgsMSw0LDEsMiwxLDEyLDEsMTQsMSw2LDEsCisgICAgMTYsMSwxNCwxLDYsMSwxMCwxLDgsMSwxMjIsMzEsODcsMTA1LDExMCwxMDAsCisgICAgMTExLDExOSwxMTUsODIsMTAxLDEwMywxMDUsMTE1LDExNiwxMTQsMTIxLDcwLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLDAsCisgICAgMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsCisgICAgMTE1LDM2LDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEyNCwyLDEzMSwyLDEyNSwKKyAgICAzLDEyNCwzLDEwMCwxLDEwNyw5LDExNCwyOCwxMjQsMywxMDYsMSw4MywwLDExMCwKKyAgICA0LDEwMCwxLDgzLDAsMTAwLDEsODMsMCw0MSwyLDEyMiwxMDgsNzAsMTA1LDExMCwKKyAgICAxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAwLDMyLDEwNSwKKyAgICAxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTE0LDEwMSwxMDMsMTA1LDExNSwxMTYsMTE0LDEyMSw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLAorICAgIDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LAorICAgIDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSw5NSwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwxNzcsMCwwLAorICAgIDAsMTE0LDEyMywwLDAsMCw0MSw0LDExNCwxNjcsMCwwLDAsMTE0LDEyMiwwLAorICAgIDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsMTAyLDEwNSwxMTAsCisgICAgMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExOSwyLDAsMCwxMTUsOCwwLDAsCisgICAgMCwwLDcsMTIsMSw4LDEsOCwyLDEyMiwzMyw4NywxMDUsMTEwLDEwMCwxMTEsCisgICAgMTE5LDExNSw4MiwxMDEsMTAzLDEwNSwxMTUsMTE2LDExNCwxMjEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwKKyAgICA0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDEsMiw3OCw3OCwKKyAgICA0MSwxLDc4LDQxLDEyLDExNCwxMDgsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsCisgICAgMTA5LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDE3MSwwLDAsMCwxMTQsMTcwLAorICAgIDAsMCwwLDExNCwxNjksMCwwLDAsMjE4LDExLDk5LDEwOCw5NywxMTUsMTE1LDEwOSwKKyAgICAxMDEsMTE2LDEwNCwxMTEsMTAwLDExNCwxNjgsMCwwLDAsMTE0LDE3NCwwLDAsMCwxMTQsCisgICAgMTc3LDAsMCwwLDExNCwxNzgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE2NSwwLAorICAgIDAsMCw2OSwyLDAsMCwxMTUsMjAsMCwwLDAsOCwyLDQsMyw0LAorICAgIDMsNCwyLDQsMiwxMiw3LDEyLDE1LDIsMSwxMiwxNSwyLDEsMTE0LAorICAgIDE2NSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwyLDAsMCwwLDY0LDAsMCwwLDExNSw0OCwwLDAsMCwxMDEsMCwKKyAgICA5MCwxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsMCwKKyAgICA5MCw0LDEwMCw0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLDYsMTAwLDcsMTMyLDAsCisgICAgOTAsNiwxMDAsOCwxMDAsOSwxMzIsMCw5MCw3LDEwMCwxMCw4MywwLDQxLDExLAogICAgIDIxOCwxMyw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsMTIyLAogICAgIDgzLDY2LDk3LDExNSwxMDEsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTExLDEwMiwzMiw5OSwKICAgICAxMTEsMTA5LDEwOSwxMTEsMTEwLDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsCkBAIC0xMDA2LDExMCArOTE3LDEwNiBAQAogICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCwzMiw5NywxMTAsMTAwLDEwLDMyLDMyLDMyLDMyLDgzLAogICAgIDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LAogICAgIDEwMCwxMDEsMTE0LDQ2LDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsMCwKLSAgICAwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDg4LDAsMCwwLDExNiwwLAotICAgIDAsMTI0LDAsMCwxMDYsMSwwLDEyNCwxLDAsMTMxLDEsMCwxMzEsMSwwLAotICAgIDEwMCwxLDAsMjUsMTI1LDIsMCwxMjQsMiwwLDEwNiwyLDAsMTAwLDIsMCwKLSAgICAxMDAsMSwwLDEzMSwyLDAsMTAwLDMsMCwyNSwxMjUsMywwLDEyNCwxLDAsCi0gICAgMTA2LDMsMCwxMDAsMiwwLDEzMSwxLDAsMTAwLDQsMCwyNSwxMjUsNCwwLAotICAgIDEyNCwzLDAsMTAwLDUsMCwxMDcsMiwwLDExMSw4NywwLDEyNCw0LDAsMTAwLAotICAgIDUsMCwxMDcsMywwLDgzLDQxLDYsMTIyLDE0MSw2NywxMTEsMTEwLDk5LDExNCwxMDEsCi0gICAgMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwKLSAgICAxMTAsMzIsMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsOTksMTE2LDc2LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiw5OCwxMjEsCi0gICAgMzIsOTksMTA0LDEwMSw5OSwxMDcsMTA1LDExMCwxMDMsMzIsMTA1LDEwMiwxMCwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTQsMTAxLAotICAgIDExNiwxMTcsMTE0LDExMCwxMDEsMTAwLDMyLDk4LDEyMSwzMiwxMDMsMTAxLDExNiw5NSwxMDIsMTA1LAotICAgIDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTA0LDk3LDExNSwzMiw5NywzMiwxMDIsMTA1LDEwOCwKLSAgICAxMDEsMTEwLDk3LDEwOSwxMDEsMzIsMTExLDEwMiwzMiwzOSw5NSw5NSwxMDUsMTEwLDEwNSwxMTYsCi0gICAgOTUsOTUsNDYsMTEyLDEyMSwzOSw0NiwxMTQsMzEsMCwwLDAsMTE0LDYwLDAsMCwKLSAgICAwLDExNCw2MSwwLDAsMCwxMTQsNTgsMCwwLDAsMjE4LDgsOTUsOTUsMTA1LAotICAgIDExMCwxMDUsMTE2LDk1LDk1LDQxLDQsMTE0LDQwLDAsMCwwLDExNCwxNTksMCwwLAotICAgIDAsMTE0LDM2LDAsMCwwLDExNCwzNCwwLDAsMCw0MSw1LDExNCwxMTAsMCwKLSAgICAwLDAsMTE0LDEyOCwwLDAsMCwxMTQsOTYsMCwwLDAsOTAsMTMsMTAyLDEwNSwKLSAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDk1LDk4LDk3LDExNSwxMDEsOTAsOSwxMTYsOTcsMTA1LAotICAgIDEwOCw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNiwwLDAsMCwxMTQsMTYxLDAsMCwwLDE0NCwyLDAsMCwxMTUsOCwKLSAgICAwLDAsMCwwLDMsMjUsMSwyMiwxLDE5LDEsMTIyLDI0LDk1LDc2LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCw2Niw5NywxMTUsMTA1LDk5LDExNSw0NiwxMDUsMTE1LDk1LDExMiw5NywKLSAgICA5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLAotICAgIDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwKLSAgICAxLDAsODMsNDEsMiwxMjIsNDIsODUsMTE1LDEwMSwzMiwxMDAsMTAxLDEwMiw5NywxMTcsCi0gICAgMTA4LDExNiwzMiwxMTUsMTAxLDEwOSw5NywxMTAsMTE2LDEwNSw5OSwxMTUsMzIsMTAyLDExMSwxMTQsCi0gICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsMTA1LDExMSwxMTAsCi0gICAgNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxNjYsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDEzLDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LAotICAgIDEwMSwxNTIsMiwwLDAsMTE1LDAsMCwwLDAsMTIyLDI3LDk1LDc2LDExMSw5NywKLSAgICAxMDAsMTAxLDExNCw2Niw5NywxMTUsMTA1LDk5LDExNSw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsCi0gICAgOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDMsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsODAsMCwwLAotICAgIDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTA2LDEsMCwxMzEsMSwwLAotICAgIDEyNSwyLDAsMTI0LDIsMCwxMDAsMSwwLDEwNyw4LDAsMTE0LDU0LDAsMTE2LAotICAgIDIsMCwxMDAsMiwwLDEwNiwzLDAsMTI0LDEsMCwxMDYsMSwwLDEzMSwxLAotICAgIDAsMTMxLDEsMCwxMzAsMSwwLDExNiw0LDAsMTA2LDUsMCwxMTYsNiwwLAotICAgIDEyNCwyLDAsMTI0LDEsMCwxMDYsNywwLDEzMSwzLDAsMSwxMDAsMSwwLAotICAgIDgzLDQxLDMsMTIyLDE5LDY5LDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsCisgICAgMCwzLDAsMCwwLDY3LDAsMCwwLDExNSw2NCwwLDAsMCwxMTYsMCwKKyAgICAxMjQsMCwxMDYsMSwxMjQsMSwxMzEsMSwxMzEsMSwxMDAsMSwyNSwwLDEyNSwyLAorICAgIDEyNCwyLDEwNiwyLDEwMCwyLDEwMCwxLDEzMSwyLDEwMCwzLDI1LDAsMTI1LDMsCisgICAgMTI0LDEsMTA2LDMsMTAwLDIsMTMxLDEsMTAwLDQsMjUsMCwxMjUsNCwxMjQsMywKKyAgICAxMDAsNSwxMDcsMiwxMTEsNjIsMTI0LDQsMTAwLDUsMTA3LDMsODMsMCw0MSw2LAorICAgIDEyMiwxNDEsNjcsMTExLDExMCw5OSwxMTQsMTAxLDExNiwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwKKyAgICAxMDksMTAxLDExMCwxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsNzMsMTEwLDExNSwKKyAgICAxMTIsMTAxLDk5LDExNiw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsOTcsCisgICAgOTksMTA3LDk3LDEwMywxMDEsMzIsOTgsMTIxLDMyLDk5LDEwNCwxMDEsOTksMTA3LDEwNSwxMTAsCisgICAgMTAzLDMyLDEwNSwxMDIsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMTAxLDEwMCwzMiw5OCwKKyAgICAxMjEsMzIsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDMyLDEwNCwKKyAgICA5NywxMTUsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDExMCw5NywxMDksMTAxLDMyLDExMSwxMDIsCisgICAgMzIsMzksOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQ2LDExMiwxMjEsMzksNDYsMTE0LAorICAgIDMxLDAsMCwwLDExNCw2MSwwLDAsMCwxMTQsNjIsMCwwLDAsMTE0LDU5LAorICAgIDAsMCwwLDIxOCw4LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw0MSw0LDExNCwKKyAgICA0MCwwLDAsMCwxMTQsMTU0LDAsMCwwLDExNCwzNiwwLDAsMCwxMTQsMzQsCisgICAgMCwwLDAsNDEsNSwxMTQsMTAzLDAsMCwwLDExNCwxMjIsMCwwLDAsMTE0LAorICAgIDk3LDAsMCwwLDkwLDEzLDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5NSw5OCwKKyAgICA5NywxMTUsMTAxLDkwLDksMTE2LDk3LDEwNSwxMDgsOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE1NiwwLAorICAgIDAsMCwxMzgsMiwwLDAsMTE1LDgsMCwwLDAsMCwzLDE4LDEsMTYsCisgICAgMSwxNCwxLDEyMiwyNCw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSwKKyAgICA5OSwxMTUsNDYsMTA1LDExNSw5NSwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsOTksMiwwLAorICAgIDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLAorICAgIDAsMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDQyLDg1LAorICAgIDExNSwxMDEsMzIsMTAwLDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLAorICAgIDExNiwxMDUsOTksMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDk5LDExNCwxMDEsOTcsMTE2LDEwNSwxMTEsMTEwLDQ2LDc4LDExNCw0LDAsMCwwLDQxLAorICAgIDIsMTE0LDEwMywwLDAsMCwxMTQsMTYxLDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMyw5OSwxMTQsMTAxLDk3LAorICAgIDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTQ2LDIsMCwwLDExNSwwLDAsCisgICAgMCwwLDEyMiwyNyw5NSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNjYsOTcsMTE1LDEwNSw5OSwKKyAgICAxMTUsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk5LAorICAgIDIsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDQsMCwwLDAsCisgICAgNjcsMCwwLDAsMTE1LDU2LDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEwNiwKKyAgICAxLDEzMSwxLDEyNSwyLDEyNCwyLDEwMCwxLDEwNyw4LDExNCwzNiwxMTYsMiwxMDAsCisgICAgMiwxMDYsMywxMjQsMSwxMDYsMSwxMzEsMSwxMzEsMSwxMzAsMSwxMTYsNCwxMDYsCisgICAgNSwxMTYsNiwxMjQsMiwxMjQsMSwxMDYsNywxMzEsMywxLDAsMTAwLDEsODMsCisgICAgMCw0MSwzLDEyMiwxOSw2OSwxMjAsMTAxLDk5LDExNywxMTYsMTAxLDMyLDExNiwxMDQsMTAxLAogICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDc4LDEyMiw1Miw5OSw5NywxMTAsMTEwLDExMSwKICAgICAxMTYsMzIsMTA4LDExMSw5NywxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLAogICAgIDExNCwxMjUsMzIsMTE5LDEwNCwxMDEsMTEwLDMyLDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLAogICAgIDQwLDQxLDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw3OCwxMTEsMTEwLDEwMSw0MSwKLSAgICA4LDIxOCw4LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDExNCwxMTQsMCwwLDAsCi0gICAgMTE0LDEwOSwwLDAsMCwxMTQsNDksMCwwLDAsMTE0LDEyMywwLDAsMCwyMTgsCisgICAgOCwyMTgsOCwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSwxMTQsMTA4LDAsMCwwLAorICAgIDExNCwxMDIsMCwwLDAsMTE0LDUwLDAsMCwwLDExNCwxMTcsMCwwLDAsMjE4LAogICAgIDI1LDk1LDk5LDk3LDEwOCwxMDgsOTUsMTE5LDEwNSwxMTYsMTA0LDk1LDEwMiwxMTQsOTcsMTA5LAogICAgIDEwMSwxMTUsOTUsMTE0LDEwMSwxMDksMTExLDExOCwxMDEsMTAwLDIxOCw0LDEwMSwxMjAsMTAxLDk5LAotICAgIDExNCwxMjAsMCwwLDAsNDEsMywxMTQsMTEwLDAsMCwwLDIxOCw2LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDExNCwxNDgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMTE0LDExNCwwLDAsMCw0MSwzLDExNCwxMDMsMCwwLDAsMjE4LDYsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMTE0LDE0MywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKICAgICAwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsMTAxLDEyMCwxMDEsOTksOTUsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMTU1LDIsMCwwLDExNSwxMCwwLDAsMCwwLDIsCi0gICAgMTgsMSwxMiwxLDksMSwxNSwxLDEyMiwyNSw5NSw3NiwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDE0OSwyLDAsMCwxMTUsMTAsMCwwLDAsMCwyLAorICAgIDEyLDEsOCwxLDYsMSwxMCwxLDEyMiwyNSw5NSw3NiwxMTEsOTcsMTAwLDEwMSwKICAgICAxMTQsNjYsOTcsMTE1LDEwNSw5OSwxMTUsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsCiAgICAgMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCi0gICAgMywwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTE2LDAsMCwKLSAgICAxMDYsMSwwLDEyNCwwLDAsMTI0LDEsMCwxMzEsMiwwLDgzLDQxLDEsNzgsCi0gICAgNDEsMiwxMTQsMTIzLDAsMCwwLDIxOCwxNyw5NSwxMDgsMTExLDk3LDEwMCw5NSwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTA0LDEwNSwxMDksNDEsMiwxMTQsMTEwLDAsMCwKLSAgICAwLDExNCwxMjgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDYsMCwwLDAsMjE4LDExLDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDE2MywyLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI1LDk1LAotICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw2Niw5NywxMTUsMTA1LDk5LDExNSw0NiwxMDgsMTExLDk3LAotICAgIDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSw4LDExNCwxMTQsMCwwLDAsCi0gICAgMTE0LDExMywwLDAsMCwxMTQsMTE1LDAsMCwwLDExNCwxMTYsMCwwLDAsMTE0LAotICAgIDE2MSwwLDAsMCwxMTQsMTg3LDAsMCwwLDExNCwxOTIsMCwwLDAsMTE0LDE5NCwKLSAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg1LDAsMCwwLDEzOSwyLDAsMCwKLSAgICAxMTUsMTAsMCwwLDAsMTIsMyw2LDIsMTIsOCwxMiwzLDEyLDgsMTE0LAotICAgIDE4NSwwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCi0gICAgMCw0LDAsMCwwLDY0LDAsMCwwLDExNSwxMDYsMCwwLDAsMTAxLDAsCi0gICAgMCw5MCwxLDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCwxMDAsMiwwLAotICAgIDEzMiwwLDAsOTAsMywwLDEwMCwzLDAsMTAwLDQsMCwxMzIsMCwwLDkwLAotICAgIDQsMCwxMDAsNSwwLDEwMCw2LDAsMTMyLDAsMCw5MCw1LDAsMTAwLDcsCi0gICAgMCwxMDAsOCwwLDEzMiwwLDAsOTAsNiwwLDEwMCw5LDAsMTAwLDEwLDAsCi0gICAgMTMyLDAsMCw5MCw3LDAsMTAwLDExLDAsMTAwLDE4LDAsMTAwLDEzLDAsMTAwLAotICAgIDE0LDAsMTMyLDAsMSw5MCw4LDAsMTAwLDE1LDAsMTAwLDE2LDAsMTMyLDAsCi0gICAgMCw5MCw5LDAsMTAwLDE3LDAsODMsNDEsMTksMjE4LDEyLDgzLDExMSwxMTcsMTE0LAotICAgIDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsMTAsMCwKLSAgICAwLDAsMTE2LDAsMCwxMzAsMSwwLDEwMCwxLDAsODMsNDEsMiwxMjIsMTc4LAotICAgIDc5LDExMiwxMTYsMTA1LDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLAotICAgIDExNiwxMDQsOTcsMTE2LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwKLSAgICAzMiwxMDksMTExLDEwMCwxMDUsMTAyLDEwNSw5OSw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTE2LDEwNSwKLSAgICAxMDksMTAxLDMyLDQwLDk3LDExMCwzMiwxMDUsMTEwLDExNiw0MSwzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTEyLDEwMSw5OSwKLSAgICAxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExMiw5NywxMTYsMTA0LDQ0LDMyLDExOSwxMDQsMTAxLDExNCwKLSAgICAxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiw5NywzMiwxMTUsMTE2LDExNCw0NiwKLSAgICAxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4Miw5NywxMDUsMTE1LDEwMSwxMTUsCi0gICAgMzIsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDQsMTAxLDExMCwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywxMTAsMTEwLDExMSwxMTYsMzIsOTgsMTAxLAotICAgIDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTAwLDQ2LDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDc4LDQxLDEsMjE4LDcsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDQxLDIsCi0gICAgMTE0LDExMCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsMTA0LDk1LAotICAgIDEwOSwxMTYsMTA1LDEwOSwxMDEsMTY5LDIsMCwwLDExNSwyLDAsMCwwLDAsNiwKLSAgICAxMjIsMjMsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTIsCi0gICAgOTcsMTE2LDEwNCw5NSwxMDksMTE2LDEwNSwxMDksMTAxLDk5LDIsMCwwLDAsMCwwLAotICAgIDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE5LAotICAgIDAsMCwwLDEwMCwxLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLAotICAgIDEsMCwxMDUsMSwwLDgzLDQxLDIsOTcsMTcwLDEsMCwwLDc5LDExMiwxMTYsCisgICAgMywwLDAsMCw2NywwLDAsMCwxMTUsMTIsMCwwLDAsMTE2LDAsMTA2LAorICAgIDEsMTI0LDAsMTI0LDEsMTMxLDIsODMsMCw0MSwxLDEyMiwyNiw4NCwxMDQsMTA1LAorICAgIDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwKKyAgICAxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsNDEsMiwxMTQsMTE3LDAsMCwwLDIxOCwxNywKKyAgICA5NSwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTUsMTA0LDEwNSwKKyAgICAxMDksNDEsMiwxMTQsMTAzLDAsMCwwLDExNCwxMjIsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDEwOCwxMTEsCisgICAgOTcsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDE1NywyLDAsMCwxMTUsMiwwLAorICAgIDAsMCwwLDIsMTIyLDI1LDk1LDc2LDExMSw5NywxMDAsMTAxLDExNCw2Niw5NywxMTUsCisgICAgMTA1LDk5LDExNSw0NiwxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCwKKyAgICA0MSw4LDExNCwxMDgsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA5LDAsMCwKKyAgICAwLDExNCwxMTAsMCwwLDAsMTE0LDE1NiwwLDAsMCwxMTQsMTgyLDAsMCwwLAorICAgIDExNCwxODcsMCwwLDAsMTE0LDE4OSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTgwLAorICAgIDAsMCwwLDEzMywyLDAsMCwxMTUsMTAsMCwwLDAsOCwzLDQsMiwKKyAgICA4LDgsOCwzLDgsOCwxMTQsMTgwLDAsMCwwLDk5LDAsMCwwLDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsNjQsMCwwLDAsCisgICAgMTE1LDc0LDAsMCwwLDEwMSwwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSwxMDAsCisgICAgMiwxMzIsMCw5MCwzLDEwMCwzLDEwMCw0LDEzMiwwLDkwLDQsMTAwLDUsMTAwLAorICAgIDYsMTMyLDAsOTAsNSwxMDAsNywxMDAsOCwxMzIsMCw5MCw2LDEwMCw5LDEwMCwKKyAgICAxMCwxMzIsMCw5MCw3LDEwMCwxOCwxMDAsMTIsMTU2LDEsMTAwLDEzLDEwMCwxNCwxMzIsCisgICAgMiw5MCw4LDEwMCwxNSwxMDAsMTYsMTMyLDAsOTAsOSwxMDAsMTcsODMsMCw0MSwKKyAgICAxOSwyMTgsMTIsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSw4LDAsMCwwLDExNiwwLDEzMCwxLDEwMCwxLDgzLAorICAgIDAsNDEsMiwxMjIsMTc4LDc5LDExMiwxMTYsMTA1LDExMSwxMTAsOTcsMTA4LDMyLDEwOSwxMDEsCisgICAgMTE2LDEwNCwxMTEsMTAwLDMyLDExNiwxMDQsOTcsMTE2LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLAorICAgIDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMDUsMTAyLDEwNSw5OSw5NywxMTYsMTA1LAorICAgIDExMSwxMTAsMzIsMTE2LDEwNSwxMDksMTAxLDMyLDQwLDk3LDExMCwzMiwxMDUsMTEwLDExNiw0MSwKKyAgICAzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsMTAwLDMyLDExMiw5NywxMTYsMTA0LDQ0LAorICAgIDMyLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTA1LDExNSwzMiw5NywKKyAgICAzMiwxMTUsMTE2LDExNCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4MiwKKyAgICA5NywxMDUsMTE1LDEwMSwxMTUsMzIsNzMsNzksNjksMTE0LDExNCwxMTEsMTE0LDMyLDExOSwxMDQsCisgICAgMTAxLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiw5OSw5NywxMTAsMTEwLAorICAgIDExMSwxMTYsMzIsOTgsMTAxLDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDEsMTAwLDQ2LDEwLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDQxLDEsMjE4LDcsNzMsNzksNjksMTE0LAorICAgIDExNCwxMTEsMTE0LDQxLDIsMTE0LDEwMywwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEwLAorICAgIDExMiw5NywxMTYsMTA0LDk1LDEwOSwxMTYsMTA1LDEwOSwxMDEsMTY0LDIsMCwwLDExNSwyLAorICAgIDAsMCwwLDAsNiwxMjIsMjMsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDksMTE2LDEwNSwxMDksMTAxLDk5LDIsCisgICAgMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLDAsNjcsCisgICAgMCwwLDAsMTE1LDE0LDAsMCwwLDEwMCwxLDEyNCwwLDEwNiwwLDEyNCwxLAorICAgIDEzMSwxLDEwNSwxLDgzLDAsNDEsMiw5NywxNzAsMSwwLDAsNzksMTEyLDExNiwKICAgICAxMDUsMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE0LDEwMSwxMTYsCiAgICAgMTE3LDExNCwxMTAsMTA1LDExMCwxMDMsMzIsOTcsMzIsMTA5LDEwMSwxMTYsOTcsMTAwLDk3LDExNiwKICAgICA5NywzMiwxMDAsMTA1LDk5LDExNiwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsCkBAIC0xMTM2LDE0NzEgKzEwNDMsMTM5MyBAQAogICAgIDk3LDEwNSwxMTUsMTAxLDExNSwzMiw3Myw3OSw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTE5LDEwNCwKICAgICAxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDk5LDk3LDExMCwxMTAsCiAgICAgMTExLDExNiwzMiw5OCwxMDEsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwxMDAsNDYsMTAsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDEzNSwwLDAsMCw0MSwxLDExNCwxOTcsCi0gICAgMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsCisgICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDEyOSwwLDAsMCw0MSwxLDExNCwxOTIsCisgICAgMCwwLDAsNDEsMiwxMTQsMTAzLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsCiAgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTAsCi0gICAgMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDE3NywyLDAsMCwxMTUsMiwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LDk3LDExNiwxMTUsMTcyLDIsMCwwLDExNSwyLAogICAgIDAsMCwwLDAsMTEsMTIyLDIzLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsCiAgICAgMTAwLDEwMSwxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsCiAgICAgMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLDAsNjcsCi0gICAgMCwwLDAsMTE1LDE2LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjQsMiwKLSAgICAwLDEyNCwzLDAsMTMxLDIsMCw4Myw0MSwxLDEyMiwyMjgsNzksMTEyLDExNiwxMDUsCi0gICAgMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksCi0gICAgMTA0LDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTE1LDMyLDEwMCw5NywxMTYsOTcsMzIsNDAsOTgsCi0gICAgMTIxLDExNiwxMDEsMTE1LDQxLDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDQwLDk3LDMyLDExNSwxMTYsMTE0LDQxLDQ2LDEwLDEwLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsCi0gICAgMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLAotICAgIDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE5LAotICAgIDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLAotICAgIDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDExNSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTEyLDk3LAotICAgIDExNiwxMDQsMzIsMTA1LDExNSwzMiwxMTAsMTAxLDEwMSwxMDAsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLAotICAgIDExMSwxMTQsMTAwLDEwMSwxMTQsMzIsMTE2LDExMSwzMiw5OSwxMTEsMTE0LDExNCwxMDEsOTksMTE2LAotICAgIDEwOCwxMjEsMzIsMTE2LDExNCw5NywxMTAsMTE1LDEwMiwxMDEsMTE0LDMyLDExMiwxMDEsMTE0LDEwOSwKLSAgICAxMDUsMTE1LDExNSwxMDUsMTExLDExMCwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgNDEsMSwyMTgsOCwxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDQxLDQsMTE0LDExMCwKLSAgICAwLDAsMCwxMTQsOTIsMCwwLDAsOTAsMTAsOTksOTcsOTksMTA0LDEwMSw5NSwKLSAgICAxMTIsOTcsMTE2LDEwNCwxMTQsNTUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE1LDk1LDk5LDk3LDk5LDEwNCwxMDEsCi0gICAgOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTkwLDIsMCwwLDExNSwyLDAsCi0gICAgMCwwLDAsOCwxMjIsMjgsODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCw0Niw5NSw5OSw5Nyw5OSwxMDQsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwKLSAgICAxMDAsMTAxLDk5LDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDEsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4MywKLSAgICA0MSwyLDEyMiwxNTAsNzksMTEyLDExNiwxMDUsMTExLDExMCw5NywxMDgsMzIsMTA5LDEwMSwxMTYsCi0gICAgMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDExOSwxMTQsMTA1LDExNiwxMDEsMTE1LAotICAgIDMyLDEwMCw5NywxMTYsOTcsMzIsNDAsOTgsMTIxLDExNiwxMDEsMTE1LDQxLDMyLDExNiwxMTEsCi0gICAgMzIsOTcsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDQwLDk3LDMyLAotICAgIDExNSwxMTYsMTE0LDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDczLAotICAgIDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDUsMTE1LAotICAgIDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDk3LDEwOCwxMDgsMTExLDExOSwxMTUsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE5LDExNCwxMDUsMTE2LDEwNSwxMTAsMTAzLDMyLDExMSwKLSAgICAxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDExNSwKLSAgICA0NiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsNCwwLDAsMCwKLSAgICA0MSwzLDExNCwxMTAsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw1NSwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAxMTQsMTk5LDAsMCwwLDIwMCwyLDAsMCwxMTUsMCwwLDAsMCwxMjIsMjEsCi0gICAgODMsMTExLDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMTUsMTAxLDExNiwKLSAgICA5NSwxMDAsOTcsMTE2LDk3LDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsCi0gICAgMCwwLDE2LDAsMCwwLDY3LDAsMCwwLDExNSwxMDUsMCwwLDAsMTI0LAotICAgIDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsMCwxMjUsMiwwLDEyMSwxOSwKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwKLSAgICA4NywxMTAsNTgsMCw0LDExNiwyLDAsMTA3LDEwLDAsMTE0LDk0LDAsMSwxMjUsCi0gICAgNCwwLDEsMTIyLDI2LDAsMTE2LDMsMCwxMDAsMSwwLDEwMCwyLDAsMTI0LAotICAgIDEsMCwxMzEsMSwxLDEyNCw0LDAsMTMwLDIsMCw4Nyw4OSwxMDAsMywwLAotICAgIDEwMCwzLDAsMTI1LDQsMCwxMjYsNCwwLDg4LDExMCwxLDAsODgsMTE2LDQsCi0gICAgMCwxMjQsMywwLDEzMSwxLDAsODMsNDEsNCwxMjIsNTIsNjcsMTExLDExMCw5OSwKLSAgICAxMTQsMTAxLDExNiwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsOTcsMTE2LAotICAgIDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsNzMsMTEwLDExNSwxMTIsMTAxLDk5LDExNiw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw0NiwKLSAgICAxMjIsMzksMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMTAsMTExLDExNiwzMiw5NywxMTgsOTcsCi0gICAgMTA1LDEwOCw5Nyw5OCwxMDgsMTAxLDMyLDExNiwxMDQsMTE0LDExMSwxMTcsMTAzLDEwNCwzMiwxMDMsCi0gICAgMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDQwLDQxLDExNCwxMDgsMCwwLDAsNzgsNDEsCi0gICAgNSwxMTQsMTU5LDAsMCwwLDIxOCw4LDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsCi0gICAgMTE0LDQyLDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LDE1NywwLDAsMCw0MSwKLSAgICA1LDExNCwxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsMzcsMCwwLDAsCi0gICAgMTE0LDE1NSwwLDAsMCwyMTgsMywxMDEsMTIwLDk5LDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMCwxMDMsMTAxLDExNiw5NSwxMTUsCi0gICAgMTExLDExNywxMTQsOTksMTAxLDIwNywyLDAsMCwxMTUsMTQsMCwwLDAsMCwyLAotICAgIDE1LDEsMywxLDE5LDEsMTgsMSw5LDEsMzEsMSwxMjIsMjMsODMsMTExLAotICAgIDExNywxMTQsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsCi0gICAgMTExLDExNywxMTQsOTksMTAxLDIxOCw5LDk1LDExMSwxMTIsMTE2LDEwNSwxMDksMTA1LDEyMiwxMDEsCi0gICAgMTE0LDMxLDAsMCwwLDk5LDMsMCwwLDAsMSwwLDAsMCw0LDAsCi0gICAgMCwwLDksMCwwLDAsNjcsMCwwLDAsMTE1LDM0LDAsMCwwLDExNiwKLSAgICAwLDAsMTA2LDEsMCwxMTYsMiwwLDEyNCwxLDAsMTI0LDIsMCwxMDAsMSwKLSAgICAwLDEwMCwyLDAsMTAwLDMsMCwxMDAsNCwwLDEyNCwzLDAsMTMxLDQsMiwKLSAgICA4Myw0MSw1LDEyMiwxMzAsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICA5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMzIsOTksMTExLDEwOSwxMTIsCi0gICAgMTA1LDEwOCwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTUsMTExLDExNywxMTQsOTksMTAxLAotICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsMzksCi0gICAgMTAwLDk3LDExNiw5NywzOSwzMiw5NywxMTQsMTAzLDExNywxMDksMTAxLDExMCwxMTYsMzIsOTksCi0gICAgOTcsMTEwLDMyLDk4LDEwMSwzMiw5NywxMTAsMTIxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwKLSAgICAzMiwxMTYsMTIxLDExMiwxMDEsMzIsMTE2LDEwNCw5NywxMTYsMzIsOTksMTExLDEwOSwxMTIsMTA1LAotICAgIDEwOCwxMDEsNDAsNDEsMzIsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDExNSw0NiwxMCwzMiwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTQsMTkwLDAsMCwwLDIxOCwxMiwxMDAsMTExLAotICAgIDExMCwxMTYsOTUsMTA1LDExMCwxMDQsMTAxLDExNCwxMDUsMTE2LDg0LDExNCw3MCwwLDAsMCwKLSAgICA0MSwzLDExNCwxMjMsMCwwLDAsMTE0LDE4OSwwLDAsMCwyMTgsNyw5OSwxMTEsCi0gICAgMTA5LDExMiwxMDUsMTA4LDEwMSw0MSw0LDExNCwxMTAsMCwwLDAsMTE0LDU1LDAsMCwKLSAgICAwLDExNCwzNywwLDAsMCwxMTQsMjA0LDAsMCwwLDExNCw0LDAsMCwwLAotICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxNCwxMTUsMTExLDExNywxMTQsCi0gICAgOTksMTAxLDk1LDExNiwxMTEsOTUsOTksMTExLDEwMCwxMDEsMjE3LDIsMCwwLDExNSw0LAotICAgIDAsMCwwLDAsNSwyMSwxLDEyMiwyNyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsCi0gICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTUsMTE2LDExMSw5NSwKLSAgICA5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMTAsMCwwLAotICAgIDAsNDMsMCwwLDAsNjcsMCwwLDAsMTE1LDE3NCwxLDAsMCwxMjQsMCwKLSAgICAwLDEwNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTAwLDEsMCwKLSAgICAxMjUsMywwLDEyMSwxNiwwLDExNiwxLDAsMTI0LDIsMCwxMzEsMSwwLDEyNSwKLSAgICA0LDAsODcsMTEwLDI0LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCw2MywwLAotICAgIDEsMSwxLDEwMCwxLDAsMTI1LDQsMCw4OSwxMTAsMjAyLDAsODgsMTIxLDE5LAotICAgIDAsMTI0LDAsMCwxMDYsMywwLDEyNCwyLDAsMTMxLDEsMCwxMjUsNSwwLAotICAgIDg3LDExMCwxOCwwLDQsMTE2LDQsMCwxMDcsMTAsMCwxMTQsMTAzLDAsMSwxLAotICAgIDEsODksMTEwLDE2MiwwLDg4LDExNiw1LDAsMTI0LDUsMCwxMDAsMiwwLDI1LAotICAgIDEzMSwxLDAsMTI1LDMsMCwxMjEsMTksMCwxMjQsMCwwLDEwNiw2LDAsMTI0LAotICAgIDQsMCwxMzEsMSwwLDEyNSw2LDAsODcsMTEwLDE4LDAsNCwxMTYsNywwLAotICAgIDEwNywxMCwwLDExNCwxNTksMCwxLDEsMSw4OSwxMTAsMTA2LDAsODgsMTIxLDM0LAotICAgIDAsMTE2LDgsMCwxMjQsNiwwLDEwMCwzLDAsMTI0LDUsMCwxMDAsNCwwLAotICAgIDEyNCwxLDAsMTAwLDUsMCwxMjQsNCwwLDEzMSwxLDMsMTI1LDcsMCw4NywKLSAgICAxMTAsMjQsMCw0LDExNiw5LDAsMTE2LDEwLDAsMTAyLDIsMCwxMDcsMTAsMCwKLSAgICAxMTQsMjIwLDAsMSwxLDEsODksMTEwLDQ1LDAsODgsMTE2LDExLDAsMTAwLDYsCi0gICAgMCwxMjQsNCwwLDEyNCwyLDAsMTMxLDMsMCwxLDExNiwxMiwwLDEyNCw3LAotICAgIDAsMTAwLDQsMCwxMjQsMSwwLDEwMCw3LDAsMTI0LDQsMCwxMDAsOCwwLAotICAgIDEyNCwyLDAsMTMxLDEsMyw4MywxMjQsMCwwLDEwNiw2LDAsMTI0LDIsMCwKLSAgICAxMzEsMSwwLDEyNSw4LDAsMTI0LDAsMCwxMDYsMTMsMCwxMjQsOCwwLDEyNCwKLSAgICAyLDAsMTMxLDIsMCwxMjUsOSwwLDExNiwxMSwwLDEwMCw5LDAsMTI0LDIsCi0gICAgMCwxMzEsMiwwLDEsMTE2LDE0LDAsMTA2LDE1LDAsMTIsMTE0LDE3MCwxLDEyNCwKLSAgICA0LDAsMTAwLDEsMCwxMDcsOSwwLDExNCwxNzAsMSwxMjQsMywwLDEwMCwxLAotICAgIDAsMTA3LDksMCwxMTQsMTcwLDEsMTE2LDE2LDAsMTI0LDksMCwxMjQsMywwLAotICAgIDExNiwxNywwLDEyNCw4LDAsMTMxLDEsMCwxMzEsMywwLDEyNSw2LDAsMTIxLAotICAgIDM2LDAsMTI0LDAsMCwxMDYsMTgsMCwxMjQsMiwwLDEyNCw0LDAsMTI0LDYsCi0gICAgMCwxMzEsMywwLDEsMTE2LDExLDAsMTAwLDEwLDAsMTI0LDQsMCwxMzEsMiwKLSAgICAwLDEsODcsMTEwLDE4LDAsNCwxMTYsMiwwLDEwNywxMCwwLDExNCwxNjksMSwKLSAgICAxLDEsMSw4OSwxMTAsMSwwLDg4LDEyNCw5LDAsODMsNDEsMTEsMTIyLDE5MCwKLSAgICA2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsCi0gICAgMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiw3MywxMTAsMTE1LDExMiwxMDEsCi0gICAgOTksMTE2LDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLAotICAgIDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4MiwxMDEsOTcsMTAwLAotICAgIDEwNSwxMTAsMTAzLDMyLDExMSwxMDIsMzIsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMzIsCi0gICAgMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsOTcsMTE2LDEwNCw5NSwxMTUsMTE2LAotICAgIDk3LDExNiwxMTUsMzIsMTE2LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksCi0gICAgMTAxLDExMCwxMTYsMTAxLDEwMCw0NiwzMiw4NCwxMTEsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMCwKLSAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwKLSAgICA0NCwzMiwxMTUsMTAxLDExNiw5NSwxMDAsOTcsMTE2LDk3LDMyLDEwOSwxMTcsMTE1LDExNiwzMiwKLSAgICA5NywxMDgsMTE1LDExMSwzMiw5OCwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwKLSAgICAxMTYsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCwxMTQsCi0gICAgMTM1LDAsMCwwLDExNCwxNDAsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsMzcsCi0gICAgMCwwLDAsMTIyLDEzLDEyMywxMjUsMzIsMTA5LDk3LDExNiw5OSwxMDQsMTAxLDExNSwzMiwKLSAgICAxMjMsMTI1LDExNCw5MSwwLDAsMCwxMTQsOTIsMCwwLDAsMTIyLDE5LDk5LDExMSwKLSAgICAxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiwxMDIsMTE0LDExMSwxMDksMzIsMTIzLAotICAgIDEyNSwxMjIsMTAsMTE5LDExNCwxMTEsMTE2LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSw0MSwxOSwxMTQsCi0gICAgMTU5LDAsMCwwLDExNCw4MSwwLDAsMCwxMTQsNjgsMCwwLDAsMTE0LDE5OCwKLSAgICAwLDAsMCwxMTQsMTk2LDAsMCwwLDExNCwxNiwwLDAsMCwxMTQsMjAxLDAsCi0gICAgMCwwLDExNCw0MiwwLDAsMCwxMTQsMTQzLDAsMCwwLDExNCwxMDksMCwwLAotICAgIDAsMTE0LDEzOCwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxNDksMCwwLDAsCi0gICAgMTE0LDIwNywwLDAsMCwxMTQsOCwwLDAsMCwyMTgsMTksMTAwLDExMSwxMTAsMTE2LAotICAgIDk1LDExOSwxMTQsMTA1LDExNiwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsMTE0LAotICAgIDE1MiwwLDAsMCwxMTQsMzMsMCwwLDAsMTE0LDIwMCwwLDAsMCw0MSwxMCwKLSAgICAxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDkyLDAsMCwwLDExNCwKLSAgICAxNDEsMCwwLDAsMTE0LDkxLDAsMCwwLDIxOCwyLDExNSwxMTYsMTE0LDU1LDAsCi0gICAgMCwwLDIxOCwxMCw5OCwxMjEsMTE2LDEwMSwxMTUsOTUsMTAwLDk3LDExNiw5NywxMTQsMTU1LAotICAgIDAsMCwwLDkwLDExLDk5LDExMSwxMDAsMTAxLDk1LDExMSw5OCwxMDYsMTAxLDk5LDExNiwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsCi0gICAgMTg4LDAsMCwwLDIyNSwyLDAsMCwxMTUsNzgsMCwwLDAsMCw3LDE1LAotICAgIDEsNiwxLDMsMSwxNiwxLDEzLDEsMTEsMiwzLDEsMTksMSwxMywKLSAgICAxLDUsMiwxNiwxLDMsMSwxOSwxLDEzLDEsNSwyLDMsMSw5LAotICAgIDEsMTIsMSwxMywxLDE5LDEsNSwyLDksMSw3LDEsMTUsMSw2LAotICAgIDEsNywxLDE1LDEsMTgsMSwxMywxLDIyLDEsMTIsMSw5LDEsMTUsCi0gICAgMSwzLDEsMTksMSwxNywxLDEzLDEsNSwxLDEyMiwyMSw4MywxMTEsMTE3LAotICAgIDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwKLSAgICAxMDAsMTAxLDc4LDExNCw4OSwwLDAsMCw0MSwxMCwxMTQsMTE0LDAsMCwwLDExNCwKLSAgICAxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTk3LDAsMCwwLDExNCwxOTgsCi0gICAgMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCwyMDMsMCwKLSAgICAwLDAsMTE0LDIwNywwLDAsMCwxMTQsMTg4LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDExNCwxOTUsMCwwLDAsMTY3LDIsMCwwLDExNSwxNCwwLDAsMCwxMiwyLAotICAgIDEyLDgsMTIsMTMsMTIsMTAsMTIsNywxMiwxMCwxOCw4LDExNCwxOTUsMCwwLAotICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNCwwLAotICAgIDAsMCwwLDAsMCwwLDExNSwxMTIsMCwwLDAsMTAxLDAsMCw5MCwxLAotICAgIDAsMTAwLDAsMCw5MCwyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwKLSAgICAxMDAsMywwLDEzMiwwLDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsCi0gICAgMCwwLDkwLDUsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCw2LAotICAgIDAsMTAxLDcsMCwxMzUsMCwwLDEwMiwxLDAsMTAwLDgsMCwxMDAsOSwwLAotICAgIDEzNCwwLDAsMTMxLDEsMCw5MCw4LDAsMTAxLDcsMCwxMDAsMTAsMCwxMDAsCi0gICAgMTEsMCwxMzIsMCwwLDEzMSwxLDAsOTAsOSwwLDEwMCwxMiwwLDEwMCwxMywKLSAgICAwLDEzMiwwLDAsOTAsMTAsMCwxMzUsMCwwLDgzLDQxLDE0LDIxOCwxMCw3MCwKLSAgICAxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDEwMyw2Niw5NywxMTUsMTAxLDMyLAotICAgIDEwMiwxMDUsMTA4LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDk5LDEwOCw5NywxMTUsCi0gICAgMTE1LDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLAotICAgIDExNiwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTIsMTE0LAotICAgIDExMSwxMTYsMTExLDk5LDExMSwxMDgsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMTE1LDMyLDExNiwKLSAgICAxMDQsOTcsMTE2LDEwLDMyLDMyLDMyLDMyLDExNCwxMDEsMTEzLDExNywxMDUsMTE0LDEwMSwzMiwKLSAgICAxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsMTE3LDExNSw5NywxMDMsCi0gICAgMTAxLDQ2LDk5LDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDIyLDAsMCwwLDEyNCwxLDAsMTI0LAotICAgIDAsMCw5NSwwLDAsMTI0LDIsMCwxMjQsMCwwLDk1LDEsMCwxMDAsMSwKLSAgICAwLDgzLDQxLDIsMTIyLDc1LDY3LDk3LDk5LDEwNCwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMzIsOTcsMTEwLDEwMCwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDEwMiwxMDUsMTA4LDEwMSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LAotICAgIDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwKLSAgICA0Niw3OCw0MSwyLDExNCwxMDgsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDMsCi0gICAgMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwzNywwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg2LAotICAgIDAsMCwwLDI2LDMsMCwwLDExNSw0LDAsMCwwLDAsMyw5LDEsCi0gICAgMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDUsCi0gICAgMTEwLDEwNSwxMTYsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKLSAgICAwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMzQsMCwwLDAsMTI0LAotICAgIDAsMCwxMDYsMCwwLDEyNCwxLDAsMTA2LDAsMCwxMDcsMiwwLDExMSwzMywKLSAgICAwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMSwwLDEwNiwxLDAsMTA3LDIsMCwKLSAgICA4Myw0MSwxLDc4LDQxLDIsMjE4LDksOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsCi0gICAgOTUsMTE0LDEyMCwwLDAsMCw0MSwyLDExNCwxMTAsMCwwLDAsMjE4LDUsMTExLAotICAgIDExNiwxMDQsMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKLSAgICAwLDAsMCwyMTgsNiw5NSw5NSwxMDEsMTEzLDk1LDk1LDMyLDMsMCwwLDExNSwKLSAgICA0LDAsMCwwLDAsMSwxOCwxLDEyMiwxNyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLAotICAgIDAsMCwwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSwyNiwwLDAsMCwxMTYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwKLSAgICAwLDExNiwwLDAsMTI0LDAsMCwxMDYsMiwwLDEzMSwxLDAsNjUsODMsNDEsCi0gICAgMSw3OCw0MSwzLDIxOCw0LDEwNCw5NywxMTUsMTA0LDExNCwxMDgsMCwwLDAsMTE0LAotICAgIDM3LDAsMCwwLDQxLDEsMTE0LDExMCwwLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsOCw5NSw5NSwxMDQsOTcsCi0gICAgMTE1LDEwNCw5NSw5NSwzNiwzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLAotICAgIDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDQsOTcsCi0gICAgMTE1LDEwNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCwzLDAsMCwwLDMsMCwwLDAsMTE1LDIyLDAsMCwwLDExNiwwLAotICAgIDAsMTE2LDEsMCwxMjQsMCwwLDEzMSwyLDAsMTA2LDIsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsODMsNDEsMSwxMjIsMTAwLDc2LDExMSw5NywxMDAsMzIsOTcsMzIsMTA5LAotICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDk3LDMyLDEwMiwxMDUsMTA4LAotICAgIDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwKLSAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsCi0gICAgOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLDEwMSw5OSwKLSAgICA5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LAotICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwzLDIxOCw1LAotICAgIDExNSwxMTcsMTEyLDEwMSwxMTQsMTE0LDIxMSwwLDAsMCwxMTQsMTk0LDAsMCwwLDQxLAotICAgIDIsMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDQxLDEsMTE0LDIxMiwwLAorICAgIDAsMCwwLDExNSwxMiwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMiwxMjQsMywKKyAgICAxMzEsMiw4MywwLDQxLDEsMTIyLDIyOCw3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwKKyAgICAzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDExNCwKKyAgICAxMDUsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiw5NywzMiw0MCw5OCwxMjEsMTE2LDEwMSwxMTUsCisgICAgNDEsMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsCisgICAgMzIsNDAsOTcsMzIsMTE1LDExNiwxMTQsNDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsNzMsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwKKyAgICAxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsCisgICAgMTE5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LAorICAgIDExMCwxMDMsMzIsMTExLDEwMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LAorICAgIDEwNCwxMDEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsCisgICAgMTE1LDMyLDExMCwxMDEsMTAxLDEwMCwxMDEsMTAwLDMyLDEwNSwxMTAsMzIsMTExLDExNCwxMDAsMTAxLAorICAgIDExNCwzMiwxMTYsMTExLDMyLDk5LDExMSwxMTQsMTE0LDEwMSw5OSwxMTYsMTA4LDEyMSwzMiwxMTYsCisgICAgMTE0LDk3LDExMCwxMTUsMTAyLDEwMSwxMTQsMzIsMTEyLDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwKKyAgICAxMTEsMTEwLDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwxLDIxOCw4LAorICAgIDExNSwxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNDEsNCwxMTQsMTAzLDAsMCwwLDExNCwKKyAgICA5MywwLDAsMCw5MCwxMCw5OSw5Nyw5OSwxMDQsMTAxLDk1LDExMiw5NywxMTYsMTA0LAorICAgIDExNCw1NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwyMTgsMTUsOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwxMjEsMTE2LAorICAgIDEwMSw5OSwxMTEsMTAwLDEwMSwxODUsMiwwLDAsMTE1LDIsMCwwLDAsMCw4LAorICAgIDEyMiwyOCw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LAorICAgIDk5LDk3LDk5LDEwNCwxMDEsOTUsOTgsMTIxLDExNiwxMDEsOTksMTExLDEwMCwxMDEsOTksMywKKyAgICAwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMSwwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDE1MCwKKyAgICA3OSwxMTIsMTE2LDEwNSwxMTEsMTEwLDk3LDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwKKyAgICAxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDExNCwxMDUsMTE2LDEwMSwxMTUsMzIsMTAwLDk3LDExNiwKKyAgICA5NywzMiw0MCw5OCwxMjEsMTE2LDEwMSwxMTUsNDEsMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsCisgICAgMTA1LDEwOCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsNDAsOTcsMzIsMTE1LDExNiwxMTQsNDEsCisgICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTA5LDExMiwxMDgsMTAxLAorICAgIDEwOSwxMDEsMTEwLDExNiwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTA5LDEwMSwxMTYsCisgICAgMTA0LDExMSwxMDAsMzIsOTcsMTA4LDEwOCwxMTEsMTE5LDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMTksMTE0LDEwNSwxMTYsMTA1LDExMCwxMDMsMzIsMTExLDEwMiwzMiw5OCwxMjEsCisgICAgMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMTE1LDQ2LDEwLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDc4LDExNCw0LDAsMCwwLDQxLDMsMTE0LDEwMywKKyAgICAwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDU2LDAsMCwwLDExNCw0LDAsCiAgICAgMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxOTQsMCwwLAotICAgIDAsMzksMywwLDAsMTE1LDIsMCwwLDAsMCwxMCwxMjIsMjIsNzAsMTA1LAotICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwOCwxMTEsOTcsMTAwLDk1LDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKLSAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDcsMCwwLDAsMTI0LDAsCi0gICAgMCwxMDYsMCwwLDgzLDQxLDEsMTIyLDU4LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsCi0gICAgMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICAxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiw5NywxMTUsMzIsMTAyLAotICAgIDExMSwxMTcsMTEwLDEwMCwzMiw5OCwxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLAotICAgIDEwMSwxMTQsNDYsNDEsMSwxMTQsMzcsMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwKLSAgICAwLDExNCwxMjgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDYsMCwwLDAsMTE0LDE1OSwwLDAsMCw1MSwzLDAsMCwxMTUsMiwKLSAgICAwLDAsMCwwLDMsMTIyLDIzLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLAotICAgIDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMDIsMTA1LDEwOCwxMDEsMTEwLDk3LDEwOSwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDMsMCwwLDAsOSwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNDIsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDEyNCwxLAotICAgIDAsMTAwLDEsMCwxMzEsMiwwLDE0MywxNywwLDEyNSwyLDAsMTI0LDIsMCwKLSAgICAxMDYsMiwwLDEzMSwwLDAsODMsODcsMTAwLDIsMCw4MSw4Miw4OCwxMDAsMiwKLSAgICAwLDgzLDQxLDMsMTIyLDM5LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsCi0gICAgMzIsMTAwLDk3LDExNiw5NywzMiwxMDIsMTE0LDExMSwxMDksMzIsMTEyLDk3LDExNiwxMDQsMzIsCi0gICAgOTcsMTE1LDMyLDExNCw5NywxMTksMzIsOTgsMTIxLDExNiwxMDEsMTE1LDQ2LDIxOCwxLDExNCwKLSAgICA3OCw0MSwzLDExNCw1MSwwLDAsMCwxMTQsNTIsMCwwLDAsOTAsNCwxMTQsCi0gICAgMTAxLDk3LDEwMCw0MSwzLDExNCwxMTAsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwKLSAgICA1NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKLSAgICAwLDAsMCwxMTQsMjAxLDAsMCwwLDU2LDMsMCwwLDExNSw0LDAsMCwKLSAgICAwLDAsMiwyMSwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5Nyw0MSwxMSwxMTQsMTE0LDAsMCwKLSAgICAwLDExNCwxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTE2LDAsMCwwLAotICAgIDExNCwxODYsMCwwLDAsMTE0LDIxNCwwLDAsMCwxMTQsMjE2LDAsMCwwLDExNCwKLSAgICAxMjUsMCwwLDAsMTE0LDE5NCwwLDAsMCwxMTQsMTU5LDAsMCwwLDExNCwyMDEsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsCi0gICAgMjEyLDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMTEsMCwwLDAsMjEsMywKLSAgICAwLDAsMTE1LDE0LDAsMCwwLDEyLDMsNiwyLDEyLDYsMTIsNCwxMiwKLSAgICAzLDI0LDEyLDE4LDUsMTE0LDIxMSwwLDAsMCw5OSwwLDAsMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDY0LDAsMCwwLDExNSwKLSAgICA2NCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwwLDkwLDIsMCwKLSAgICAxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsMTMyLDAsMCw5MCwKLSAgICA0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsNSwwLDEwMCw2LAotICAgIDAsMTAwLDcsMCwxMDAsOCwwLDEwMCw5LDAsMTMyLDAsMSw5MCw2LDAsCi0gICAgMTAwLDEwLDAsODMsNDEsMTEsMjE4LDE2LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDYyLDY3LDExMSwxMTAsOTksMTE0LDEwMSwKLSAgICAxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LDExNiwxMDUsMTExLAotICAgIDExMCwzMiwxMTEsMTAyLDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsMzIsMTE3LDExNSwxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsCi0gICAgMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksNDYsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDMsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMzQsMCwKLSAgICAwLDAsMTE2LDAsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDIsMCwxMDAsMSwKLSAgICAwLDEyNCwyLDAsMTA2LDEsMCwxMDAsMiwwLDEyNCwyLDAsMTA2LDIsMCwKLSAgICAxMDUsMiwwLDgzLDQxLDMsMTIyLDMzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsOTcsMTAwLDk3LDExNiw5NywzMiwxMDIsMTExLDExNCwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCw0NiwxMTQsMTM1LDAsMCwwLDExNCwxMzYsCi0gICAgMCwwLDAsNDEsMywxMTQsNDEsMCwwLDAsMjE4LDgsMTE1LDExNiw5NSwxMDksCi0gICAgMTE2LDEwNSwxMDksMTAxLDkwLDcsMTE1LDExNiw5NSwxMTUsMTA1LDEyMiwxMDEsNDEsMywxMTQsCi0gICAgMTEwLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMjA5LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxOTgsMCwKLSAgICAwLDAsNjYsMywwLDAsMTE1LDQsMCwwLDAsMCwyLDEyLDEsMTIyLAotICAgIDI3LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKLSAgICAxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsMCwwLAotICAgIDAsMCwwLDAsMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDM0LDAsMCwwLDExNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwKLSAgICA0LDAsMTI0LDAsMCwxMDYsMSwwLDEyNCwyLDAsMTI0LDMsMCwxMDAsMSwKLSAgICAwLDEyNCw0LDAsMTMxLDIsMSw4Myw0MSwyLDc4LDIxOCw1LDk1LDEwOSwxMTEsCi0gICAgMTAwLDEwMSw0MSwyLDExNCw5OSwwLDAsMCwxMTQsMTk5LDAsMCwwLDQxLDUsCi0gICAgMTE0LDExMCwwLDAsMCwxMTQsOTIsMCwwLDAsMTE0LDkxLDAsMCwwLDExNCwKLSAgICA1NSwwLDAsMCwxMTQsNDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDIwMCwwLDAsMCw3MSwzLDAsCi0gICAgMCwxMTUsNCwwLDAsMCwwLDIsMTIsMSwxMjIsMzIsODMsMTExLDExNywxMTQsCi0gICAgOTksMTAxLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5OSw5NywKLSAgICA5OSwxMDQsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDExNCwyMjEsMCwwLAotICAgIDAsMTA1LDE4MiwxLDAsMCw5OSwzLDAsMCwwLDEsMCwwLDAsOSwKLSAgICAwLDAsMCwxNywwLDAsMCw2NywwLDAsMCwxMTUsNTMsMSwwLDAsCi0gICAgMTE2LDAsMCwxMjQsMSwwLDEzMSwxLDAsOTIsMiwwLDEyNSw0LDAsMTI1LAotICAgIDUsMCwxMDMsMCwwLDEyNSw2LDAsMTIwLDU0LDAsMTI0LDQsMCwxMTQsODAsCi0gICAgMCwxMTYsMSwwLDEyNCw0LDAsMTMxLDEsMCwxMiwxMTQsODAsMCwxMTYsMCwKLSAgICAwLDEyNCw0LDAsMTMxLDEsMCw5MiwyLDAsMTI1LDQsMCwxMjUsNywwLAotICAgIDEyNCw2LDAsMTA2LDIsMCwxMjQsNywwLDEzMSwxLDAsMSwxMTMsMjcsMCwKLSAgICA4NywxMjAsMTMyLDAsMTE2LDMsMCwxMjQsNiwwLDEzMSwxLDAsNjgsOTMsMTE4LAotICAgIDAsMTI1LDcsMCwxMTYsNCwwLDEyNCw0LDAsMTI0LDcsMCwxMzEsMiwwLAotICAgIDEyNSw0LDAsMTIxLDE3LDAsMTE2LDUsMCwxMDYsNiwwLDEyNCw0LDAsMTMxLAotICAgIDEsMCwxLDg3LDExMyw5NCwwLDQsMTE2LDcsMCwxMDcsMTAsMCwxMTQsMTU1LAotICAgIDAsMSwxLDEsMTE5LDk0LDAsODksMTEzLDk0LDAsNCwxMTYsOCwwLDEwNywKLSAgICAxMCwwLDExNCwyMTEsMCwxLDEyNSw4LDAsMSwxMjIsMjUsMCwxMTYsOSwwLAotICAgIDEwMCwxLDAsMTI0LDQsMCwxMjQsOCwwLDEzMSwzLDAsMSwxMDAsMiwwLAotICAgIDgzLDg3LDg5LDEwMCwyLDAsMTAwLDIsMCwxMjUsOCwwLDEyNiw4LDAsODgsCi0gICAgMTEzLDk0LDAsODgsMTEzLDk0LDAsODcsMTIxLDMzLDAsMTE2LDEwLDAsMTI0LDEsCi0gICAgMCwxMjQsMiwwLDEyNCwzLDAsMTMxLDMsMCwxLDExNiw5LDAsMTAwLDMsCi0gICAgMCwxMjQsMSwwLDEzMSwyLDAsMSw4NywxMTAsNTMsMCw0LDExNiw4LDAsCi0gICAgMTA3LDEwLDAsMTE0LDQ4LDEsMSwxMjUsOCwwLDEsMTIyLDIxLDAsMTE2LDksCi0gICAgMCwxMDAsMSwwLDEyNCwxLDAsMTI0LDgsMCwxMzEsMywwLDEsODcsODksCi0gICAgMTAwLDIsMCwxMDAsMiwwLDEyNSw4LDAsMTI2LDgsMCw4OCwxMTAsMSwwLAotICAgIDg4LDEwMCwyLDAsODMsNDEsNCwxMjIsMjcsODcsMTE0LDEwNSwxMTYsMTAxLDMyLDk4LAotICAgIDEyMSwxMTYsMTAxLDExNSwzMiwxMDAsOTcsMTE2LDk3LDMyLDExNiwxMTEsMzIsOTcsMzIsMTAyLAotICAgIDEwNSwxMDgsMTAxLDQ2LDEyMiwyNyw5OSwxMTEsMTE3LDEwOCwxMDAsMzIsMTEwLDExMSwxMTYsMzIsCi0gICAgOTksMTE0LDEwMSw5NywxMTYsMTAxLDMyLDEyMywzMywxMTQsMTI1LDU4LDMyLDEyMywzMywxMTQsCi0gICAgMTI1LDc4LDEyMiwxMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsMTAwLDMyLDEyMywzMywxMTQsMTI1LAotICAgIDQxLDExLDExNCw0MCwwLDAsMCwxMTQsNDgsMCwwLDAsMTE0LDE2NSwwLDAsCi0gICAgMCwxMTQsMzUsMCwwLDAsMTE0LDMwLDAsMCwwLDExNCwzLDAsMCwwLAotICAgIDkwLDUsMTA5LDEwNywxMDAsMTA1LDExNCwyMTgsMTUsNzAsMTA1LDEwOCwxMDEsNjksMTIwLDEwNSwKLSAgICAxMTUsMTE2LDExNSw2OSwxMTQsMTE0LDExMSwxMTQsMTE0LDQyLDAsMCwwLDExNCwxMDcsMCwKLSAgICAwLDAsMTE0LDU3LDAsMCwwLDQxLDksMTE0LDExMCwwLDAsMCwxMTQsMzcsCi0gICAgMCwwLDAsMTE0LDU1LDAsMCwwLDExNCwyMjEsMCwwLDAsMjE4LDYsMTEyLAotICAgIDk3LDExNCwxMDEsMTEwLDExNiwxMTQsOTYsMCwwLDAsMTE0LDI5LDAsMCwwLDExNCwKLSAgICAyNSwwLDAsMCwxMTQsMjAyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwxOTksMCwwLDAsNzYsMywwLAotICAgIDAsMTE1LDM4LDAsMCwwLDAsMiwxOCwxLDYsMiwyMiwxLDE4LDEsCi0gICAgMTcsMiwxOSwxLDE1LDEsMywxLDE3LDEsMTMsMiw3LDEsMTgsMywKLSAgICAxNiwxLDI3LDEsMywxLDE2LDEsMTcsMSwxOCwyLDEyMiwyNSw4MywxMTEsCi0gICAgMTE3LDExNCw5OSwxMDEsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDExNSwKLSAgICAxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNzgsNDEsNywxMTQsMTE0LDAsMCwwLDExNCwKLSAgICAxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwxOTgsCi0gICAgMCwwLDAsMTE0LDIwMCwwLDAsMCwxMTQsMTk5LDAsMCwwLDExNCw0LDAsCi0gICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwKLSAgICAwLDExNCwyMTksMCwwLDAsNjIsMywwLDAsMTE1LDgsMCwwLDAsMTIsCi0gICAgMiw2LDIsMTIsNSwxMiw1LDExNCwyMTksMCwwLDAsOTksMCwwLDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsCi0gICAgMCwxMTUsNDYsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLAotICAgIDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwKLSAgICAxMDAsNiwwLDgzLDQxLDcsMjE4LDIwLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLAotICAgIDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDEyMiw0NSw3NiwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsMzIsMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwKLSAgICAxMDEsMTE1LDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDMyLDEwMiwxMDUsCi0gICAgMTA4LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMTUsNDYsOTksMiwwLDAsMCwKLSAgICAwLDAsMCwwLDUsMCwwLDAsNiwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsNzYsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTMxLDEsCi0gICAgMCwxMjUsMiwwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMiwwLDEzMSwxLDAsCi0gICAgMTI1LDMsMCwxMTYsMiwwLDEyNCwzLDAsMTAwLDEsMCwxMjQsMSwwLDEwMCwKLSAgICAyLDAsMTI0LDIsMCwxMzEsMSwyLDEyNSw0LDAsMTE2LDMsMCwxMjQsNCwKLSAgICAwLDEwMCwxLDAsMTI0LDEsMCwxMDAsMywwLDEyNCwyLDAsMTMxLDEsMiwKLSAgICA4Myw0MSw0LDc4LDExNCwxMDgsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw5MSwKLSAgICAwLDAsMCw0MSw0LDExNCwxNTksMCwwLDAsMTE0LDIwMSwwLDAsMCwxMTQsCi0gICAgMTQzLDAsMCwwLDExNCwxNDksMCwwLDAsNDEsNSwxMTQsMTEwLDAsMCwwLAotICAgIDExNCwxMjgsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCw1NSwwLDAsMCwxMTQsCi0gICAgMjEwLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDExNCwxODgsMCwwLDAsMTA5LDMsMCwwLDExNSw4LDAsMCwKLSAgICAwLDAsMSwxNSwxLDE1LDEsMjQsMSwxMjIsMjksODMsMTExLDExNywxMTQsOTksCi0gICAgMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCi0gICAgMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwwLAotICAgIDAsMCwxMDAsMSwwLDgzLDQxLDIsMTIyLDM5LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsCi0gICAgMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDExNiwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LAotICAgIDExNSwzMiwxMTAsMTExLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLDEwMCwxMDEsCi0gICAgNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxMjgsCisgICAgMCwxOTUsMiwwLDAsMTE1LDAsMCwwLDAsMTIyLDIxLDgzLDExMSwxMTcsMTE0LAorICAgIDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTE1LDEwMSwxMTYsOTUsMTAwLDk3LDExNiwKKyAgICA5Nyw5OSwyLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCwxNiwwLAorICAgIDAsMCw2NywwLDAsMCwxMTUsODQsMCwwLDAsMTI0LDAsMTA2LDAsMTI0LAorICAgIDEsMTMxLDEsMTI1LDIsMTIxLDE0LDEyNCwwLDEwNiwxLDEyNCwyLDEzMSwxLDEyNSwKKyAgICAzLDg3LDAsMTEwLDUwLDQsMCwxMTYsMiwxMDcsMTAsMTE0LDc0LDEsMCwxMjUsCisgICAgNCwxLDAsMTIyLDIyLDExNiwzLDEwMCwxLDEwMCwyLDEyNCwxLDE0NCwxLDEzMSwKKyAgICAxLDEyNCw0LDEzMCwyLDg3LDAsODksMCwxMDAsMywxMDAsMywxMjUsNCwxMjYsCisgICAgNCw4OCwwLDExMCwyLDg4LDAsMTE2LDQsMTI0LDMsMTMxLDEsODMsMCw0MSwKKyAgICA0LDEyMiw1Miw2NywxMTEsMTEwLDk5LDExNCwxMDEsMTE2LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsCisgICAgMTAxLDEwOSwxMDEsMTEwLDExNiw5NywxMTYsMTA1LDExMSwxMTAsMzIsMTExLDEwMiwzMiw3MywxMTAsCisgICAgMTE1LDExMiwxMDEsOTksMTE2LDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwKKyAgICAxMTUsMTExLDExNywxMTQsOTksMTAxLDQ2LDEyMiwzOSwxMTUsMTExLDExNywxMTQsOTksMTAxLDMyLAorICAgIDExMCwxMTEsMTE2LDMyLDk3LDExOCw5NywxMDUsMTA4LDk3LDk4LDEwOCwxMDEsMzIsMTE2LDEwNCwKKyAgICAxMTQsMTExLDExNywxMDMsMTA0LDMyLDEwMywxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsNDAsNDEsCisgICAgMTE0LDEwMSwwLDAsMCw3OCw0MSw1LDExNCwxNTQsMCwwLDAsMjE4LDgsMTAzLAorICAgIDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5NywxMTQsNDIsMCwwLDAsMTE0LDEwMiwwLDAsCisgICAgMCwxMTQsMTUyLDAsMCwwLDQxLDUsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsCisgICAgMCwwLDExNCwzNywwLDAsMCwxMTQsMTUwLDAsMCwwLDIxOCwzLDEwMSwxMjAsCisgICAgOTksMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsCisgICAgMjE4LDEwLDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMjAyLDIsMCwwLAorICAgIDExNSwxNCwwLDAsMCwwLDIsMTAsMSwyLDEsMTQsMSwxNiwxLDYsCisgICAgMSwyOCwxLDEyMiwyMyw4MywxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMTE0LDMxLDAsMCwKKyAgICAwLDQxLDEsMjE4LDksOTUsMTExLDExMiwxMTYsMTA1LDEwOSwxMDUsMTIyLDEwMSw5OSwzLAorICAgIDAsMCwwLDEsMCwwLDAsNCwwLDAsMCw5LDAsMCwwLDY3LAorICAgIDAsMCwwLDExNSwyNiwwLDAsMCwxMTYsMCwxMDYsMSwxMTYsMiwxMjQsMSwKKyAgICAxMjQsMiwxMDAsMSwxMDAsMiwxMDAsMywxMDAsNCwxMjQsMywxNDQsMiwxMzEsNCwKKyAgICA4MywwLDQxLDUsMTIyLDEzMCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDk5LDExMSwxMDAsMTAxLDMyLDExMSw5OCwxMDYsMTAxLDk5LDExNiwzMiw5OSwxMTEsMTA5LAorICAgIDExMiwxMDUsMTA4LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNSwxMTEsMTE3LDExNCw5OSwKKyAgICAxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwKKyAgICAzOSwxMDAsOTcsMTE2LDk3LDM5LDMyLDk3LDExNCwxMDMsMTE3LDEwOSwxMDEsMTEwLDExNiwzMiwKKyAgICA5OSw5NywxMTAsMzIsOTgsMTAxLDMyLDk3LDExMCwxMjEsMzIsMTExLDk4LDEwNiwxMDEsOTksCisgICAgMTE2LDMyLDExNiwxMjEsMTEyLDEwMSwzMiwxMTYsMTA0LDk3LDExNiwzMiw5OSwxMTEsMTA5LDExMiwKKyAgICAxMDUsMTA4LDEwMSw0MCw0MSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTE1LDQ2LDEwLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDExNCwxODUsMCwwLDAsMjE4LDEyLDEwMCwKKyAgICAxMTEsMTEwLDExNiw5NSwxMDUsMTEwLDEwNCwxMDEsMTE0LDEwNSwxMTYsODQsMTE0LDcxLDAsMCwKKyAgICAwLDQxLDMsMTE0LDExNywwLDAsMCwxMTQsMTg0LDAsMCwwLDIxOCw3LDk5LAorICAgIDExMSwxMDksMTEyLDEwNSwxMDgsMTAxLDQxLDQsMTE0LDEwMywwLDAsMCwxMTQsNTYsMCwKKyAgICAwLDAsMTE0LDM3LDAsMCwwLDExNCwxOTksMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE0LDExNSwxMTEsMTE3LAorICAgIDExNCw5OSwxMDEsOTUsMTE2LDExMSw5NSw5OSwxMTEsMTAwLDEwMSwyMTIsMiwwLDAsMTE1LAorICAgIDQsMCwwLDAsMCw1LDE0LDEsMTIyLDI3LDgzLDExMSwxMTcsMTE0LDk5LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5NSwxMTYsMTExLAorICAgIDk1LDk5LDExMSwxMDAsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwxMCwwLAorICAgIDAsMCw0MywwLDAsMCw2NywwLDAsMCwxMTUsMTA2LDEsMCwwLDEyNCwKKyAgICAwLDEwNiwwLDEyNCwxLDEzMSwxLDEyNSwyLDEwMCwxLDEyNSwzLDEyMSwxMiwxMTYsCisgICAgMSwxMjQsMiwxMzEsMSwxMjUsNCw4NywwLDExMCwyNCw0LDAsMTE2LDIsMTA3LAorICAgIDEwLDExNCw1MCwxLDAsMSwwLDEsMCwxMDAsMSwxMjUsNCw4OSwwLDExMCwKKyAgICAxNzQsODgsMCwxMjEsMTQsMTI0LDAsMTA2LDMsMTI0LDIsMTMxLDEsMTI1LDUsODcsCisgICAgMCwxMTAsMjAsNCwwLDExNiw0LDEwNywxMCwxMTQsODYsMSwwLDEsMCwxLAorICAgIDAsODksMCwxMTAsMTM4LDg4LDAsMTE2LDUsMTI0LDUsMTAwLDIsMjUsMCwxMzEsCisgICAgMSwxMjUsMywxMjEsMTQsMTI0LDAsMTA2LDYsMTI0LDQsMTMxLDEsMTI1LDYsODcsCisgICAgMCwxMTAsMjAsNCwwLDExNiw3LDEwNywxMCwxMTQsMTM0LDEsMCwxLDAsMSwKKyAgICAwLDg5LDAsMTEwLDkwLDg4LDAsMTIxLDI2LDExNiw4LDEyNCw2LDEwMCwzLDEyNCwKKyAgICA1LDEwMCw0LDEyNCwxLDEwMCw1LDEyNCw0LDE0NCwzLDEzMSwxLDEyNSw3LDg3LAorICAgIDAsMTEwLDI0LDQsMCwxMTYsOSwxMTYsMTAsMTAyLDIsMTA3LDEwLDExNCwxODYsMSwKKyAgICAwLDEsMCwxLDAsODksMCwxMTAsMzgsODgsMCwxMTYsMTEsMTA2LDEyLDEwMCwKKyAgICA2LDEyNCw0LDEyNCwyLDEzMSwzLDEsMCwxMTYsMTMsMTI0LDcsMTAwLDQsMTI0LAorICAgIDEsMTAwLDcsMTI0LDQsMTAwLDgsMTI0LDIsMTQ0LDMsMTMxLDEsODMsMCwxMjQsCisgICAgMCwxMDYsNiwxMjQsMiwxMzEsMSwxMjUsOCwxMjQsMCwxMDYsMTQsMTI0LDgsMTI0LAorICAgIDIsMTMxLDIsMTI1LDksMTE2LDExLDEwNiwxMiwxMDAsOSwxMjQsMiwxMzEsMiwxLAorICAgIDAsMTE2LDE1LDEwNiwxNiwxMiwwLDE0NCwxLDExNCwxMDIsMTI0LDQsMTAwLDEsMTA3LAorICAgIDksMTQ0LDEsMTE0LDEwMiwxMjQsMywxMDAsMSwxMDcsOSwxNDQsMSwxMTQsMTAyLDExNiwKKyAgICAxNywxMjQsOSwxMjQsMywxMTYsMTgsMTI0LDgsMTMxLDEsMTMxLDMsMTI1LDYsMTIxLAorICAgIDMwLDEyNCwwLDEwNiwxOSwxMjQsMiwxMjQsNCwxMjQsNiwxMzEsMywxLDAsMTE2LAorICAgIDExLDEwNiwxMiwxMDAsMTAsMTI0LDQsMTMxLDIsMSwwLDg3LDAsMTEwLDIyLDQsCisgICAgMCwxMTYsMiwxMDcsMTAsMTQ0LDEsMTE0LDEwMCwxLDAsMSwwLDEsMCw4OSwKKyAgICAwLDExMCwyLDg4LDAsMTI0LDksODMsMCw0MSwxMSwxMjIsMTkwLDY3LDExMSwxMTAsCisgICAgOTksMTE0LDEwMSwxMTYsMTAxLDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDk3LAorICAgIDExNiwxMDUsMTExLDExMCwzMiwxMTEsMTAyLDMyLDczLDExMCwxMTUsMTEyLDEwMSw5OSwxMTYsNzYsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDk5LDExMSwxMDAsMTAxLDQ2LDEwLAorICAgIDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDgyLDEwMSw5NywxMDAsMTA1LDExMCwxMDMsCisgICAgMzIsMTExLDEwMiwzMiw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwzMiwxMTQsMTAxLDExMywKKyAgICAxMTcsMTA1LDExNCwxMDEsMTE1LDMyLDExMiw5NywxMTYsMTA0LDk1LDExNSwxMTYsOTcsMTE2LDExNSwKKyAgICAzMiwxMTYsMTExLDMyLDk4LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwKKyAgICAxMDEsMTAwLDQ2LDMyLDg0LDExMSwzMiwxMTksMTE0LDEwNSwxMTYsMTAxLDEwLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsMTAxLDQ0LDMyLDExNSwKKyAgICAxMDEsMTE2LDk1LDEwMCw5NywxMTYsOTcsMzIsMTA5LDExNywxMTUsMTE2LDMyLDk3LDEwOCwxMTUsCisgICAgMTExLDMyLDk4LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLDExNiwxMDEsMTAwLAorICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDc4LDExNCwxMjksMCwwLAorICAgIDAsMTE0LDEzNSwwLDAsMCwxMTQsMTAxLDAsMCwwLDExNCwzNywwLDAsMCwKKyAgICAxMjIsMTMsMTIzLDEyNSwzMiwxMDksOTcsMTE2LDk5LDEwNCwxMDEsMTE1LDMyLDEyMywxMjUsMTE0LAorICAgIDkyLDAsMCwwLDExNCw5MywwLDAsMCwxMjIsMTksOTksMTExLDEwMCwxMDEsMzIsCisgICAgMTExLDk4LDEwNiwxMDEsOTksMTE2LDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsMTI1LDEyMiwxMCwKKyAgICAxMTksMTE0LDExMSwxMTYsMTAxLDMyLDEyMywzMywxMTQsMTI1LDQxLDIwLDExNCwxNTQsMCwwLAorICAgIDAsMTE0LDgyLDAsMCwwLDExNCw2OSwwLDAsMCwxMTQsMTkzLDAsMCwwLAorICAgIDExNCwxOTEsMCwwLDAsMTE0LDE2LDAsMCwwLDExNCwxOTYsMCwwLDAsMTE0LAorICAgIDQyLDAsMCwwLDExNCwxMzgsMCwwLDAsMTE0LDEwMiwwLDAsMCwxMTQsMTMzLAorICAgIDAsMCwwLDExNCwxMTcsMCwwLDAsMTE0LDEzMiwwLDAsMCwxMTQsMTQ0LDAsCisgICAgMCwwLDExNCwyMDIsMCwwLDAsMTE0LDgsMCwwLDAsMjE4LDE5LDEwMCwxMTEsCisgICAgMTEwLDExNiw5NSwxMTksMTE0LDEwNSwxMTYsMTAxLDk1LDk4LDEyMSwxMTYsMTAxLDk5LDExMSwxMDAsCisgICAgMTAxLDExNCwxNDcsMCwwLDAsMTE0LDMzLDAsMCwwLDExNCwxOTUsMCwwLDAsCisgICAgNDEsMTAsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCw5MywwLDAsCisgICAgMCwxMTQsMTM2LDAsMCwwLDExNCw5MiwwLDAsMCwyMTgsMiwxMTUsMTE2LDExNCwKKyAgICA1NiwwLDAsMCwyMTgsMTAsOTgsMTIxLDExNiwxMDEsMTE1LDk1LDEwMCw5NywxMTYsOTcsCisgICAgMTE0LDE1MCwwLDAsMCw5MCwxMSw5OSwxMTEsMTAwLDEwMSw5NSwxMTEsOTgsMTA2LDEwMSwKKyAgICA5OSwxMTYsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLAorICAgIDAsMTE0LDE4MywwLDAsMCwyMjAsMiwwLDAsMTE1LDc4LDAsMCwwLDAsCisgICAgNywxMCwxLDQsMSwyLDEsMTIsMSwxNCwxLDEwLDIsMiwxLDE0LAorICAgIDEsMTQsMSw2LDIsMTIsMSwyLDEsMTQsMSwxNCwxLDYsMiwyLAorICAgIDEsNiwxLDgsMSwxMiwxLDE4LDEsNiwyLDgsMSw2LDEsMTAsCisgICAgMSw0LDEsOCwxLDEwLDEsMTIsMSwxMiwxLDIwLDEsMTAsMSw2LAorICAgIDEsMTAsMSwyLDEsMTQsMSwxNiwxLDE2LDEsNiwxLDEyMiwyMSw4MywKKyAgICAxMTEsMTE3LDExNCw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LAorICAgIDk5LDExMSwxMDAsMTAxLDc4LDExNCw5MCwwLDAsMCw0MSwxMCwxMTQsMTA4LDAsMCwKKyAgICAwLDExNCwxMDcsMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTkyLDAsMCwwLAorICAgIDExNCwxOTMsMCwwLDAsMTE0LDE5NSwwLDAsMCwxMTQsMTk0LDAsMCwwLDExNCwKKyAgICAxOTgsMCwwLDAsMTE0LDIwMiwwLDAsMCwxMTQsMTgzLDAsMCwwLDExNCw0LAogICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCi0gICAgMCwwLDExNCwyMDMsMCwwLDAsMTE1LDMsMCwwLDExNSwyLDAsMCwwLAotICAgIDAsMiwxMjIsMzEsODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsCi0gICAgMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsCi0gICAgMTE0LDk5LDEwMSw3OCw0MSw2LDExNCwxMTQsMCwwLDAsMTE0LDExMywwLDAsMCwKLSAgICAxMTQsMTE1LDAsMCwwLDExNCwxMTYsMCwwLDAsMTE0LDE4OCwwLDAsMCwxMTQsCi0gICAgMjAzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMjQsMCwwLDAsMTA1LDMsMCwKLSAgICAwLDExNSw2LDAsMCwwLDEyLDIsNiwyLDEyLDYsMTE0LDIyNCwwLDAsCisgICAgMCwwLDExNCwxOTAsMCwwLDAsMTYyLDIsMCwwLDExNSwxNCwwLDAsMCwKKyAgICA4LDIsOCw4LDgsMTMsOCwxMCw4LDcsOCwxMCwxNCw4LDExNCwxOTAsCisgICAgMCwwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgNCwwLDAsMCwwLDAsMCwwLDExNSw3NiwwLDAsMCwxMDEsMCw5MCwKKyAgICAxLDEwMCwwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsMCw5MCwKKyAgICA0LDEwMCw0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLDYsMTAwLDcsMTMyLDAsOTAsCisgICAgNiwxMDEsNywxMzUsMCwxMDIsMSwxMDAsOCwxMDAsOSwxMzIsOCwxMzEsMSw5MCwKKyAgICA4LDEwMSw3LDEwMCwxMCwxMDAsMTEsMTMyLDAsMTMxLDEsOTAsOSwxMDAsMTIsMTAwLAorICAgIDEzLDEzMiwwLDkwLDEwLDEzNSwwLDgzLDAsNDEsMTQsMjE4LDEwLDcwLDEwNSwxMDgsCisgICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwxMjIsMTAzLDY2LDk3LDExNSwxMDEsMzIsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsCisgICAgMTE5LDEwNCwxMDUsOTksMTA0LDMyLDEwNSwxMDksMTEyLDEwOCwxMDEsMTA5LDEwMSwxMTAsMTE2LDExNSwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDMyLDExMiwxMTQsMTExLDExNiwKKyAgICAxMTEsOTksMTExLDEwOCwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwxMTUsMzIsMTE2LDEwNCw5NywKKyAgICAxMTYsMTAsMzIsMzIsMzIsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDMyLDEwMiwxMDUsCisgICAgMTA4LDEwMSwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSwzMiwxMTcsMTE1LDk3LDEwMywxMDEsNDYsCisgICAgOTksMywwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMiwwLDAsCisgICAgMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsMTI0LDEsMTI0LDAsOTUsMCwKKyAgICAxMjQsMiwxMjQsMCw5NSwxLDEwMCwxLDgzLDAsNDEsMiwxMjIsNzUsNjcsOTcsCisgICAgOTksMTA0LDEwMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMTAsCisgICAgOTcsMTA5LDEwMSwzMiw5NywxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LAorICAgIDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwMiwxMTEsMTE3LAorICAgIDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDc4LDQxLDIsMTE0LDEwMSwwLDAsCisgICAgMCwxMTQsMzcsMCwwLDAsNDEsMywxMTQsMTAzLDAsMCwwLDExNCwxMjIsMCwKKyAgICAwLDAsMTE0LDM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDExNCwxODEsMCwwLDAsMjEsMywwLDAsMTE1LAorICAgIDQsMCwwLDAsMCwzLDYsMSwxMjIsMTksNzAsMTA1LDEwOCwxMDEsNzYsMTExLAorICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwyLDAsCisgICAgMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwyNCwwLDAsMCwxMjQsMCwxMDYsMCwxMjQsMSwxMDYsMCwxMDcsCisgICAgMiwxMTEsMjIsMTI0LDAsMTA2LDEsMTI0LDEsMTA2LDEsMTA3LDIsODMsMCw0MSwKKyAgICAxLDc4LDQxLDIsMjE4LDksOTUsOTUsOTksMTA4LDk3LDExNSwxMTUsOTUsOTUsMTE0LAorICAgIDExNCwwLDAsMCw0MSwyLDExNCwxMDMsMCwwLDAsMjE4LDUsMTExLDExNiwxMDQsCisgICAgMTAxLDExNCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCisgICAgMCwyMTgsNiw5NSw5NSwxMDEsMTEzLDk1LDk1LDI3LDMsMCwwLDExNSw0LDAsCisgICAgMCwwLDAsMSwxMiwxLDEyMiwxNyw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsOTUsMTAxLDExMyw5NSw5NSw5OSwxLDAsMCwwLDAsMCwKKyAgICAwLDAsMSwwLDAsMCwzLDAsMCwwLDY3LDAsMCwwLDExNSwyMCwKKyAgICAwLDAsMCwxMTYsMCwxMjQsMCwxMDYsMSwxMzEsMSwxMTYsMCwxMjQsMCwxMDYsCisgICAgMiwxMzEsMSw2NSwwLDgzLDAsNDEsMSw3OCw0MSwzLDIxOCw0LDEwNCw5NywKKyAgICAxMTUsMTA0LDExNCwxMDEsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDEsMTE0LDEwMywKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAorICAgIDAsMCwyMTgsOCw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSwzMSwzLDAsMCwKKyAgICAxMTUsMiwwLDAsMCwwLDEsMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDMsMCwwLAorICAgIDAsMTE1LDE2LDAsMCwwLDExNiwwLDExNiwxLDEyNCwwLDEzMSwyLDEwNiwyLAorICAgIDEyNCwxLDEzMSwxLDgzLDAsNDEsMSwxMjIsMTAwLDc2LDExMSw5NywxMDAsMzIsOTcsCisgICAgMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDk3LDMyLDEwMiwKKyAgICAxMDUsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsCisgICAgMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLAorICAgIDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsMTE1LDEwMSwzMiwxMDEsMTIwLAorICAgIDEwMSw5OSw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsCisgICAgMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw0MSwzLAorICAgIDIxOCw1LDExNSwxMTcsMTEyLDEwMSwxMTQsMTE0LDIwNiwwLDAsMCwxMTQsMTg5LDAsMCwKKyAgICAwLDQxLDIsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsMCwwLDQxLDEsMTE0LAorICAgIDIwNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg5LAorICAgIDAsMCwwLDM0LDMsMCwwLDExNSwyLDAsMCwwLDAsMTAsMTIyLDIyLAorICAgIDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDgsMTExLDk3LDEwMCw5NSwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw2LDAsMCwwLAorICAgIDEyNCwwLDEwNiwwLDgzLDAsNDEsMSwxMjIsNTgsODIsMTAxLDExNiwxMTcsMTE0LDExMCwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk3LDExNSwzMiwKKyAgICAxMDIsMTExLDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwKKyAgICAxMDAsMTAxLDExNCw0Niw0MSwxLDExNCwzNywwLDAsMCw0MSwyLDExNCwxMDMsMCwKKyAgICAwLDAsMTE0LDEyMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMTU0LDAsMCwwLDQ2LDMsMCwwLDExNSwKKyAgICAyLDAsMCwwLDAsMywxMjIsMjMsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5OSwKKyAgICAyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw5LDAsMCwwLAorICAgIDY3LDAsMCwwLDExNSwzMiwwLDAsMCwxMTYsMCwxMDYsMSwxMjQsMSwxMDAsCisgICAgMSwxMzEsMiwxNDMsMTAsMTI1LDIsMTI0LDIsMTA2LDIsMTMxLDAsODMsMCw4MSwKKyAgICAwLDgyLDAsODgsMCwxMDAsMiw4MywwLDQxLDMsMTIyLDM5LDgyLDEwMSwxMTYsCisgICAgMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDk3LDExNiw5NywzMiwxMDIsMTE0LDExMSwKKyAgICAxMDksMzIsMTEyLDk3LDExNiwxMDQsMzIsOTcsMTE1LDMyLDExNCw5NywxMTksMzIsOTgsMTIxLAorICAgIDExNiwxMDEsMTE1LDQ2LDIxOCwxLDExNCw3OCw0MSwzLDExNCw1MiwwLDAsMCwxMTQsCisgICAgNTMsMCwwLDAsOTAsNCwxMTQsMTAxLDk3LDEwMCw0MSwzLDExNCwxMDMsMCwwLAorICAgIDAsMTE0LDM3LDAsMCwwLDExNCw1NywwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk2LDAsMCwwLDUxLAorICAgIDMsMCwwLDExNSw0LDAsMCwwLDAsMiwxNCwxLDEyMiwxOSw3MCwxMDUsCisgICAgMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAwLDk3LDExNiwKKyAgICA5Nyw0MSwxMSwxMTQsMTA4LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEwOSwwLAorICAgIDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxODEsMCwwLDAsMTE0LDIwOSwwLDAsCisgICAgMCwxMTQsMjExLDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDE4OSwwLDAsMCwKKyAgICAxMTQsMTU0LDAsMCwwLDExNCwxOTYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDQsMCwwLDAsNDEsMSwxMTQsMjA3LDAsMCwwLDExNCw2LDAsMCwwLAorICAgIDExNCwyMDYsMCwwLDAsMTYsMywwLDAsMTE1LDE0LDAsMCwwLDgsMywKKyAgICA0LDIsOCw2LDgsNCw4LDMsMTYsMTIsMTIsNSwxMTQsMjA2LDAsMCwKICAgICAwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwKLSAgICAwLDAsNjQsMCwwLDAsMTE1LDEzNiwwLDAsMCwxMDEsMCwwLDkwLDEsCi0gICAgMCwxMDAsMCwwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLAotICAgIDEwMCwzLDAsMTMyLDAsMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwKLSAgICAwLDAsOTAsNSwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsCi0gICAgMCwxMDAsOCwwLDEwMCw5LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsCi0gICAgMTAwLDExLDAsMTMyLDAsMCw5MCw4LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLAotICAgIDAsMCw5MCw5LDAsMTAwLDE0LDAsMTAwLDE1LDAsMTMyLDAsMCw5MCwxMCwKLSAgICAwLDEwMCwxNiwwLDEwMCwxNywwLDEzMiwwLDAsOTAsMTEsMCwxMDEsMTIsMCwKLSAgICAxMDAsMTgsMCwxMDAsMTksMCwxMzIsMCwwLDEzMSwxLDAsOTAsMTMsMCwxMDAsCi0gICAgMjAsMCw4Myw0MSwyMSwyMTgsMTksNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwKLSAgICA3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMTIyLDkzLDc2LDExMSw5NywxMDAsCi0gICAgMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDYsMTAsMTAsMzIsMzIsMzIsMzIsODQsCi0gICAgMTA0LDEwMSwzMiw5OSwxMTEsMTEwLDExNSwxMTYsMTE0LDExNyw5OSwxMTYsMTExLDExNCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwMCwxMDEsMTE1LDEwNSwxMDMsMTEwLDEwMSwxMDAsMzIsMTE2LDExMSwzMiwxMTksMTExLAotICAgIDExNCwxMDcsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAotICAgIDEwMSwxMTQsNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMywwLDAsMCwwLDAsCi0gICAgMCwwLDMsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMjIsCi0gICAgMCwwLDAsMTI0LDEsMCwxMjQsMCwwLDk1LDAsMCwxMjQsMiwwLDEyNCwKLSAgICAwLDAsOTUsMSwwLDEwMCwwLDAsODMsNDEsMSw3OCw0MSwyLDExNCwxMDgsCi0gICAgMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDMsMTE0LDExMCwwLDAsMCwxMTQsCi0gICAgMTA4LDAsMCwwLDExNCwzNywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTg2LDAsMCwwLDEzMiwzLDAsCi0gICAgMCwxMTUsNCwwLDAsMCwwLDEsOSwxLDEyMiwyOCw2OSwxMjAsMTE2LDEwMSwKLSAgICAxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKLSAgICA5NSw5NSwxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMiwwLDAsMCwwLDAsMCwKLSAgICAwLDIsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMzQsMCwKLSAgICAwLDAsMTI0LDAsMCwxMDYsMCwwLDEyNCwxLDAsMTA2LDAsMCwxMDcsMiwKLSAgICAwLDExMSwzMywwLDEyNCwwLDAsMTA2LDEsMCwxMjQsMSwwLDEwNiwxLDAsCi0gICAgMTA3LDIsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDIxMiwwLDAsMCwxMTQsMTIwLAotICAgIDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwxMTQsMjEzLDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMTQsCi0gICAgMCwwLDAsMTM2LDMsMCwwLDExNSw0LDAsMCwwLDAsMSwxOCwxLAotICAgIDEyMiwyNiw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LAotICAgIDExMSw5NywxMDAsMTAxLDExNCw0Niw5NSw5NSwxMDEsMTEzLDk1LDk1LDk5LDEsMCwwLAotICAgIDAsMCwwLDAsMCwxLDAsMCwwLDMsMCwwLDAsNjcsMCwwLAotICAgIDAsMTE1LDI2LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwKLSAgICAxLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwyLDAsMTMxLDEsMCw2NSw4MywKLSAgICA0MSwxLDc4LDQxLDMsMTE0LDIxNSwwLDAsMCwxMTQsMTA4LDAsMCwwLDExNCwKLSAgICAzNywwLDAsMCw0MSwxLDExNCwxMTAsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDIxNiwwLDAsMCwxNDAsCi0gICAgMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyOCw2OSwxMjAsMTE2LDEwMSwKLSAgICAxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKLSAgICA5NSw5NSwxMDQsOTcsMTE1LDEwNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMywwLDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSw0NywwLAotICAgIDAsMCwxMTYsMCwwLDEwNiwxLDAsMTE2LDIsMCwxMDYsMywwLDEyNCwxLAotICAgIDAsMTMxLDIsMCwxMjUsMiwwLDExNiw0LDAsMTAwLDEsMCwxMjQsMSwwLAotICAgIDEwNiw1LDAsMTI0LDAsMCwxMDYsNiwwLDEzMSwzLDAsMSwxMjQsMiwwLAotICAgIDgzLDQxLDIsMTIyLDM4LDY3LDExNCwxMDEsOTcsMTE2LDEwMSwzMiw5NywxMTAsMzIsMTE3LAotICAgIDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsMTAwLDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsCi0gICAgMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDEyMiwzOCwxMDEsMTIwLDExNiwKLSAgICAxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsCi0gICAgMTE0LDEyNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsCi0gICAgMzMsMTE0LDEyNSw0MSw3LDExNCwxMjMsMCwwLDAsMTE0LDE4OSwwLDAsMCwxMTQsCi0gICAgMTQ3LDAsMCwwLDkwLDE0LDk5LDExNCwxMDEsOTcsMTE2LDEwMSw5NSwxMDAsMTIxLDExMCwKLSAgICA5NywxMDksMTA1LDk5LDExNCwxMDcsMCwwLDAsMTE0LDEwOCwwLDAsMCwxMTQsMzcsCi0gICAgMCwwLDAsNDEsMywxMTQsMTEwLDAsMCwwLDExNCwxNjYsMCwwLDAsMTE0LAotICAgIDE5MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKLSAgICAwLDAsMCwxMTQsMTg3LDAsMCwwLDE0MywzLDAsMCwxMTUsMTAsMCwwLAotICAgIDAsMCwyLDYsMSwxNSwxLDYsMSwxNiwxLDEyMiwzMyw2OSwxMjAsMTE2LAotICAgIDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwKLSAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCw2NywKLSAgICAwLDAsMCwxMTUsNDUsMCwwLDAsMTE2LDAsMCwxMDYsMSwwLDExNiwyLAotICAgIDAsMTA2LDMsMCwxMjQsMSwwLDEzMSwyLDAsMSwxMTYsNCwwLDEwMCwxLAotICAgIDAsMTI0LDAsMCwxMDYsNSwwLDEyNCwwLDAsMTA2LDYsMCwxMzEsMywwLAotICAgIDEsMTAwLDIsMCw4Myw0MSwzLDEyMiwzMCw3MywxMTAsMTA1LDExNiwxMDUsOTcsMTA4LAotICAgIDEwNSwxMjIsMTAxLDMyLDk3LDExMCwzMiwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwKLSAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMjIsNDAsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LAotICAgIDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsMTAxLAotICAgIDEyMCwxMDEsOTksMTE3LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsMzMsMTE0LAotICAgIDEyNSw3OCw0MSw3LDExNCwxMjMsMCwwLDAsMTE0LDE4OSwwLDAsMCwxMTQsMTQ3LAotICAgIDAsMCwwLDkwLDEyLDEwMSwxMjAsMTAxLDk5LDk1LDEwMCwxMjEsMTEwLDk3LDEwOSwxMDUsCi0gICAgOTksMTE0LDEwNywwLDAsMCwxMTQsMTA4LDAsMCwwLDExNCwzNywwLDAsMCwKLSAgICA0MSwyLDExNCwxMTAsMCwwLDAsMTE0LDE5MSwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTkyLDAsMCwwLAotICAgIDE1MSwzLDAsMCwxMTUsNiwwLDAsMCwwLDIsMTksMSw2LDEsMTIyLAotICAgIDMxLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAotICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLAotICAgIDAsMywwLDAsMCwxMTUsNDgsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLAotICAgIDEwNiwxLDAsMTMxLDEsMCwxMDAsMSwwLDI1LDEzNywwLDAsMTE2LDIsMCwKLSAgICAxMzUsMCwwLDEwMiwxLDAsMTAwLDIsMCwxMDAsMywwLDEzNCwwLDAsMTE2LAotICAgIDMsMCw2OCwxMzEsMSwwLDEzMSwxLDAsODMsNDEsNCwxMjIsNDksODIsMTAxLAotICAgIDExNiwxMTcsMTE0LDExMCwzMiw4NCwxMTQsMTE3LDEwMSwzMiwxMDUsMTAyLDMyLDExNiwxMDQsMTAxLAotICAgIDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsCi0gICAgMTAxLDMyLDEwNSwxMTUsMzIsOTcsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDQ2LDExNCwKLSAgICAzMSwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsCi0gICAgMCw0LDAsMCwwLDUxLDAsMCwwLDExNSwzMSwwLDAsMCwxMjQsMCwKLSAgICAwLDkzLDIxLDAsMTI1LDEsMCwxMzYsMCwwLDEwMCwwLDAsMTI0LDEsMCwKLSAgICAyMywxMDcsMiwwLDg2LDEsMTEzLDMsMCwxMDAsMSwwLDgzLDQxLDIsMTE0LAotICAgIDE4NiwwLDAsMCw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwyNCwwLDAsCi0gICAgMCwyMTgsNiwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCw0MSwxLDIxOCw5LDEwMiwxMDUsMTA4LAotICAgIDEwMSw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwKLSAgICAyNTAsOSw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTYwLDMsMCwwLDExNSwKLSAgICAyLDAsMCwwLDYsMSwxMjIsNDksNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLAotICAgIDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTA1LDExNSw5NSwxMTIsCi0gICAgOTcsOTksMTA3LDk3LDEwMywxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LAotICAgIDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2Miw0MSw0LDExNCw0MCwwLDAsMCwKLSAgICAxMTQsMzcsMCwwLDAsMjE4LDMsOTcsMTEwLDEyMSwyMTgsMTgsNjksODgsODQsNjksCi0gICAgNzgsODMsNzMsNzksNzgsOTUsODMsODUsNzAsNzAsNzMsODgsNjksODMsNDEsMiwKLSAgICAxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDQsMCwwLDAsNDEsCi0gICAgMSwxMTQsMjI3LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxNjEsMCwwLDAsCi0gICAgMTU3LDMsMCwwLDExNSw2LDAsMCwwLDAsMiwxOSwxLDE4LDEsMTIyLAotICAgIDMwLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLAotICAgIDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsMCw4Myw0MSwyLDEyMiwKLSAgICA2Myw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDc4LDExMSwxMTAsMTAxLDMyLDk3LDExNSwzMiwKLSAgICA5NywxMTAsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMzIsOTksOTcsMTEwLDExMCwxMTEsMTE2LDMyLDk5LDExNCwxMDEsOTcsMTE2LAotICAgIDEwMSwzMiw5NywzMiw5OSwxMTEsMTAwLDEwMSwzMiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsNDYsCi0gICAgNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLAotICAgIDAsMTE0LDE4OCwwLDAsMCwxNjMsMywwLDAsMTE1LDIsMCwwLDAsMCwKLSAgICAyLDEyMiwyOCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLAotICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw5OSwKLSAgICAyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsCi0gICAgNTMsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsCi0gICAgMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgMTE1LDMyLDEwNCw5NywxMTgsMTAxLDMyLDExMCwxMTEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwKLSAgICAzMiw5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMTAsCi0gICAgMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNiwwLDAsMCwxMTQsMjAzLDAsMCwwLDE2NywzLDAsMCwKLSAgICAxMTUsMiwwLDAsMCwwLDIsMTIyLDMwLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LAotICAgIDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LAotICAgIDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNywwLDAsCi0gICAgMCwxMjQsMCwwLDEwNiwwLDAsODMsNDEsMSwxMjIsNTgsODIsMTAxLDExNiwxMTcsCi0gICAgMTE0LDExMCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMTYsMTExLDMyLDExNiwKLSAgICAxMDQsMTAxLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDk3LAotICAgIDExNSwzMiwxMDIsMTExLDExNywxMTAsMTAwLDMyLDk4LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCw0Niw0MSwxLDExNCwzNywwLDAsMCw0MSwyLDExNCwKLSAgICAxMTAsMCwwLDAsMTE0LDEyOCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKLSAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTU5LDAsMCwwLDE3MSwzLDAsCi0gICAgMCwxMTUsMiwwLDAsMCwwLDMsMTIyLDMyLDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsCi0gICAgMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsCi0gICAgMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw3OCw0MSwxNCwxMTQsMTE0LDAsCi0gICAgMCwwLDExNCwxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTE2LDAsMCwKLSAgICAwLDExNCwxODYsMCwwLDAsMTE0LDIxNCwwLDAsMCwxMTQsMjE2LDAsMCwwLAotICAgIDExNCwxODcsMCwwLDAsMTE0LDE5MiwwLDAsMCwxMTQsMTYxLDAsMCwwLDExNCwKLSAgICAxODgsMCwwLDAsMTE0LDIwMywwLDAsMCwxMTQsMTI1LDAsMCwwLDExNCwxNTksCisgICAgMCwwLDY0LDAsMCwwLDExNSw0NiwwLDAsMCwxMDEsMCw5MCwxLDEwMCwKKyAgICAwLDkwLDIsMTAwLDEsOTAsMywxMDAsMiwxMDAsMywxMzIsMCw5MCw0LDEwMCwKKyAgICA0LDEwMCw1LDEzMiwwLDkwLDUsMTAwLDYsMTAwLDcsMTU2LDEsMTAwLDgsMTAwLAorICAgIDksMTMyLDIsOTAsNiwxMDAsMTAsODMsMCw0MSwxMSwyMTgsMTYsODMsMTExLDExNywKKyAgICAxMTQsOTksMTAxLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwxMjIsNjIsNjcsCisgICAgMTExLDExMCw5OSwxMTQsMTAxLDExNiwxMDEsMzIsMTA1LDEwOSwxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwKKyAgICAxMTYsOTcsMTE2LDEwNSwxMTEsMTEwLDMyLDExMSwxMDIsMzIsODMsMTExLDExNywxMTQsOTksMTAxLAorICAgIDc2LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTcsMTE1LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTIxLDExNSwxMTYsMTAxLDEwOSw0Niw5OSwyLDAsCisgICAgMCwwLDAsMCwwLDAsMywwLDAsMCwzLDAsMCwwLDY3LDAsCisgICAgMCwwLDExNSwyMiwwLDAsMCwxMTYsMCwxMjQsMSwxMzEsMSwxMjUsMiwxMjQsCisgICAgMiwxMDYsMSwxMjQsMiwxMDYsMiwxMDAsMSwxNTYsMiw4MywwLDQxLDIsMTIyLAorICAgIDMzLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDEwMSwxMTYsOTcsCisgICAgMTAwLDk3LDExNiw5NywzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LAorICAgIDEwNCw0Niw0MSwyLDEyMiw1LDEwOSwxMTYsMTA1LDEwOSwxMDEsMTIyLDQsMTE1LDEwNSwxMjIsCisgICAgMTAxLDQxLDMsMTE0LDQxLDAsMCwwLDIxOCw4LDExNSwxMTYsOTUsMTA5LDExNiwxMDUsCisgICAgMTA5LDEwMSw5MCw3LDExNSwxMTYsOTUsMTE1LDEwNSwxMjIsMTAxLDQxLDMsMTE0LDEwMywwLAorICAgIDAsMCwxMTQsMzcsMCwwLDAsMTE0LDIwNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTkzLDAsMCwwLAorICAgIDYxLDMsMCwwLDExNSw0LDAsMCwwLDAsMiw4LDEsMTIyLDI3LDgzLAorICAgIDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTE1LDExNiw5NywxMTYsMTE1LDk5LDQsMCwwLDAsMCwKKyAgICAwLDAsMCw1LDAsMCwwLDUsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDI2LDAsMCwwLDExNiwwLDEyNCwxLDEzMSwxLDEyNSw0LDEyNCwwLDEwNiwxLAorICAgIDEyNCwyLDEyNCwzLDEwMCwxLDEyNCw0LDE0NCwxLDEzMSwyLDgzLDAsNDEsMiwKKyAgICA3OCwyMTgsNSw5NSwxMDksMTExLDEwMCwxMDEsNDEsMiwxMTQsMTAwLDAsMCwwLDExNCwKKyAgICAxOTQsMCwwLDAsNDEsNSwxMTQsMTAzLDAsMCwwLDExNCw5MywwLDAsMCwKKyAgICAxMTQsOTIsMCwwLDAsMTE0LDU2LDAsMCwwLDExNCw0NCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk1LAorICAgIDAsMCwwLDY2LDMsMCwwLDExNSw0LDAsMCwwLDAsMiw4LDEsCisgICAgMTIyLDMyLDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsOTksOTcsOTksMTA0LDEwMSw5NSw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsCisgICAgMTAwLDEwMSwxMDUsMTgyLDEsMCwwLDQxLDEsMTE0LDIxNiwwLDAsMCw5OSwzLAorICAgIDAsMCwwLDEsMCwwLDAsOSwwLDAsMCwxNywwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsMjUwLDAsMCwwLDExNiwwLDEyNCwxLDEzMSwxLDkyLDIsCisgICAgMTI1LDQsMTI1LDUsMTAzLDAsMTI1LDYsMTIwLDQwLDEyNCw0LDExNCw1NiwxMTYsMSwKKyAgICAxMjQsNCwxMzEsMSwxMiwwLDExNCw1NiwxMTYsMCwxMjQsNCwxMzEsMSw5MiwyLAorICAgIDEyNSw0LDEyNSw3LDEyNCw2LDEwNiwyLDEyNCw3LDEzMSwxLDEsMCwxMTMsMTgsCisgICAgODcsMCwxMjAsMTA4LDExNiwzLDEyNCw2LDEzMSwxLDY4LDAsOTMsOTYsMTI1LDcsCisgICAgMTE2LDQsMTI0LDQsMTI0LDcsMTMxLDIsMTI1LDQsMTIxLDE0LDExNiw1LDEwNiw2LAorICAgIDEyNCw0LDEzMSwxLDEsMCw4NywwLDExMyw2OCw0LDAsMTE2LDcsMTA3LDEwLAorICAgIDExNCwxMTgsMSwwLDEsMCwxLDAsMTE5LDY4LDg5LDAsMTEzLDY4LDQsMCwKKyAgICAxMTYsOCwxMDcsMTAsMTE0LDE2MiwxLDAsMTI1LDgsMSwwLDEyMiwxOCwxMTYsOSwKKyAgICAxMDYsMTAsMTAwLDEsMTI0LDQsMTI0LDgsMTMxLDMsMSwwLDEwMCwyLDgzLDAsCisgICAgMTAwLDIsMTI1LDgsMTI2LDgsODgsMCwxMTMsNjgsODgsMCwxMTMsNjgsODcsMCwKKyAgICAxMjEsMjgsMTE2LDExLDEyNCwxLDEyNCwyLDEyNCwzLDEzMSwzLDEsMCwxMTYsOSwKKyAgICAxMDYsMTAsMTAwLDMsMTI0LDEsMTMxLDIsMSwwLDg3LDAsMTEwLDQ4LDQsMCwKKyAgICAxMTYsOCwxMDcsMTAsMTE0LDI0NCwxLDAsMTI1LDgsMSwwLDEyMiwyMCwxMTYsOSwKKyAgICAxMDYsMTAsMTAwLDEsMTI0LDEsMTI0LDgsMTMxLDMsMSwwLDg3LDAsODksMCwKKyAgICAxMDAsMiwxMDAsMiwxMjUsOCwxMjYsOCw4OCwwLDExMCwyLDg4LDAsMTAwLDIsCisgICAgODMsMCw0MSw0LDEyMiwyNyw4NywxMTQsMTA1LDExNiwxMDEsMzIsOTgsMTIxLDExNiwxMDEsCisgICAgMTE1LDMyLDEwMCw5NywxMTYsOTcsMzIsMTE2LDExMSwzMiw5NywzMiwxMDIsMTA1LDEwOCwxMDEsCisgICAgNDYsMTIyLDI3LDk5LDExMSwxMTcsMTA4LDEwMCwzMiwxMTAsMTExLDExNiwzMiw5OSwxMTQsMTAxLAorICAgIDk3LDExNiwxMDEsMzIsMTIzLDMzLDExNCwxMjUsNTgsMzIsMTIzLDMzLDExNCwxMjUsNzgsMTIyLAorICAgIDEyLDk5LDExNCwxMDEsOTcsMTE2LDEwMSwxMDAsMzIsMTIzLDMzLDExNCwxMjUsNDEsMTIsMTE0LAorICAgIDQwLDAsMCwwLDExNCw0OCwwLDAsMCwxMTQsMTYwLDAsMCwwLDExNCwzNSwKKyAgICAwLDAsMCwxMTQsMzAsMCwwLDAsMTE0LDMsMCwwLDAsOTAsNSwxMDksCisgICAgMTA3LDEwMCwxMDUsMTE0LDIxOCwxNSw3MCwxMDUsMTA4LDEwMSw2OSwxMjAsMTA1LDExNSwxMTYsMTE1LAorICAgIDY5LDExNCwxMTQsMTExLDExNCwxMTQsNDIsMCwwLDAsMTE0LDExNywwLDAsMCwxMTQsCisgICAgMTMyLDAsMCwwLDExNCw1OCwwLDAsMCw0MSw5LDExNCwxMDMsMCwwLDAsCisgICAgMTE0LDM3LDAsMCwwLDExNCw1NiwwLDAsMCwxMTQsMjE2LDAsMCwwLDIxOCwKKyAgICA2LDExMiw5NywxMTQsMTAxLDExMCwxMTYsMTE0LDk3LDAsMCwwLDExNCwyOSwwLDAsCisgICAgMCwxMTQsMjUsMCwwLDAsMTE0LDE5NywwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTk0LDAsMCwwLDcxLAorICAgIDMsMCwwLDExNSw0MiwwLDAsMCwwLDIsMTIsMSw0LDIsMTYsMSwKKyAgICAxMiwxLDE0LDIsMTQsMSwxMCwxLDIsMSwxNCwxLDE0LDIsNiwxLAorICAgIDE2LDMsNiwxLDgsMSwyMCwxLDIsMSwxMiwxLDE2LDEsMTYsMiwKKyAgICA4LDEsMTIyLDI1LDgzLDExMSwxMTcsMTE0LDk5LDEwMSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsNDYsMTE1LDEwMSwxMTYsOTUsMTAwLDk3LDExNiw5Nyw3OCw0MSw3LAorICAgIDExNCwxMDgsMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwKKyAgICAxMTAsMCwwLDAsMTE0LDE5MywwLDAsMCwxMTQsMTk1LDAsMCwwLDExNCwxOTQsCiAgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKLSAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDIyNSwwLDAsMCwxMjQsMywwLDAsCi0gICAgMTE1LDIwLDAsMCwwLDEyLDYsNiwyLDEyLDQsMTIsNCwxMiwzLDEyLAotICAgIDgsMTIsNiwxMiw2LDEyLDQsMTIsNCwxMTQsMjI1LDAsMCwwLDk5LDAsCi0gICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNjQsCi0gICAgMCwwLDAsMTE1LDEzMCwwLDAsMCwxMDEsMCwwLDkwLDEsMCwxMDAsMCwKLSAgICAwLDkwLDIsMCwxMDAsMSwwLDkwLDMsMCwxMDAsMiwwLDEwMCwzLDAsCi0gICAgMTMyLDAsMCw5MCw0LDAsMTAwLDQsMCwxMDAsNSwwLDEzMiwwLDAsOTAsCi0gICAgNSwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDkwLDYsMCwxMDAsOCwKLSAgICAwLDEwMCw5LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDEwLDAsMTAwLDExLDAsCi0gICAgMTMyLDAsMCw5MCw4LDAsMTAwLDEyLDAsMTAwLDEzLDAsMTMyLDAsMCw5MCwKLSAgICA5LDAsMTAwLDE0LDAsMTAwLDE1LDAsMTMyLDAsMCw5MCwxMCwwLDEwMCwxNiwKLSAgICAwLDEwMCwxNywwLDEzMiwwLDAsOTAsMTEsMCwxMDAsMTgsMCwxMDAsMTksMCwKLSAgICAxMzIsMCwwLDkwLDEyLDAsMTAwLDIwLDAsODMsNDEsMjEsMjE4LDE0LDk1LDc4LAotICAgIDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw5NywzOCwxLDAsCi0gICAgMCw4MiwxMDEsMTEyLDExNCwxMDEsMTE1LDEwMSwxMTAsMTE2LDExNSwzMiw5NywzMiwxMTAsOTcsCi0gICAgMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzksCi0gICAgMTE1LDMyLDExMiw5NywxMTYsMTA0LDQ2LDMyLDMyLDczLDExNiwzMiwxMTcsMTE1LDEwMSwxMTUsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsCi0gICAgMTAsMzIsMzIsMzIsMzIsMTE2LDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsMTA1LDExNiwxMTUsCi0gICAgMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiwKLSAgICA5NywxMTAsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwKLSAgICAxMTYsMzIsMTA4LDExMSwxMTEsMTA3LDExNSwzMiwxMTcsMTEyLDMyLDExNiwxMDQsMTAxLDMyLDExMiwKLSAgICA5NywxMTQsMTAxLDExMCwxMTYsMzksMTE1LDEwLDMyLDMyLDMyLDMyLDk1LDk1LDExMiw5NywKLSAgICAxMTYsMTA0LDk1LDk1LDQ2LDMyLDMyLDg3LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTA1LDExNSwKLSAgICAzMiw5OSwxMDQsOTcsMTEwLDEwMywxMDEsMTE1LDQ0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsCi0gICAgMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTEsMTE5LDExMCwzMiwxMTIsOTcsMTE2LDEwNCwzMiwKLSAgICAxMDUsMTE1LDMyLDExNCwxMDEsOTksMTExLDEwOSwxMTIsMTE3LDExNiwxMDEsMTAwLDQ0LDEwLDMyLAotICAgIDMyLDMyLDMyLDExNywxMTUsMTA1LDExMCwxMDMsMzIsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwKLSAgICAxMTAsMTAwLDEwMSwxMTQsNDYsMzIsMzIsNzAsMTExLDExNCwzMiwxMTYsMTExLDExMiw0NSwxMDgsCi0gICAgMTAxLDExOCwxMDEsMTA4LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NCwzMiwxMTYsMTA0LAotICAgIDEwMSwzMiwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LAotICAgIDExNSwzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwzMiwzMiwxMDUsMTE1LDMyLDExNSwxMjEsCi0gICAgMTE1LDQ2LDExMiw5NywxMTYsMTA0LDQ2LDk5LDQsMCwwLDAsMCwwLDAsMCwKLSAgICA0LDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDUyLDAsMCwKLSAgICAwLDEyNCwxLDAsMTI0LDAsMCw5NSwwLDAsMTI0LDIsMCwxMjQsMCwwLAotICAgIDk1LDEsMCwxMTYsMiwwLDEyNCwwLDAsMTA2LDMsMCwxMzEsMCwwLDEzMSwKLSAgICAxLDAsMTI0LDAsMCw5NSw0LDAsMTI0LDMsMCwxMjQsMCwwLDk1LDUsCi0gICAgMCwxMDAsMCwwLDgzLDQxLDEsNzgsNDEsNiwyMTgsNSw5NSwxMTAsOTcsMTA5LAotICAgIDEwMSwyMTgsNSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsOTUsMCwwLDAsMjE4LDE2LDk1LAotICAgIDEwMywxMDEsMTE2LDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsMjE4LAotICAgIDE3LDk1LDEwOCw5NywxMTUsMTE2LDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LAotICAgIDExNiwxMDQsMjE4LDEyLDk1LDExMiw5NywxMTYsMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LAotICAgIDQxLDQsMTE0LDExMCwwLDAsMCwxMTQsMTA4LDAsMCwwLDExNCwzNywwLDAsCi0gICAgMCwyMTgsMTEsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4NiwwLAotICAgIDAsMCwxODQsMywwLDAsMTE1LDgsMCwwLDAsMCwxLDksMSw5LAotICAgIDEsMjEsMSwxMjIsMjMsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCwKLSAgICA5NywxMTYsMTA0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwxLDAsMCwKLSAgICAwLDAsMCwwLDAsNCwwLDAsMCwzLDAsMCwwLDY3LDAsMCwKLSAgICAwLDExNSw1MywwLDAsMCwxMjQsMCwwLDEwNiwwLDAsMTA2LDEsMCwxMDAsCi0gICAgMSwwLDEzMSwxLDAsOTIsMywwLDEyNSwxLDAsMTI1LDIsMCwxMjUsMywKLSAgICAwLDEyNCwyLDAsMTAwLDIsMCwxMDcsMiwwLDExNCw0MywwLDEwMCw2LDAsCi0gICAgODMsMTI0LDEsMCwxMDAsNSwwLDEwMiwyLDAsODMsNDEsNywxMjIsNjIsODIsCi0gICAgMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsOTcsMzIsMTE2LDExNywxMTIsMTA4LDEwMSwzMiwxMTEsCi0gICAgMTAyLDMyLDQwLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCi0gICAgNDUsMTEwLDk3LDEwOSwxMDEsNDQsMzIsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw0NSwxMTIsOTcsCi0gICAgMTE2LDEwNCw0NSw5NywxMTYsMTE2LDExNCw0NSwxMTAsOTcsMTA5LDEwMSw0MSwxMTQsNjAsMCwKLSAgICAwLDAsMTE0LDMyLDAsMCwwLDExNCw4LDAsMCwwLDExNCwzNywwLDAsCi0gICAgMCw5MCw4LDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDQxLDIsMTIyLDMsMTE1LAotICAgIDEyMSwxMTUsMTIyLDQsMTEyLDk3LDExNiwxMDQsNDEsMiwxMTQsMjMyLDAsMCwwLDExNCwKLSAgICAzNCwwLDAsMCw0MSw0LDExNCwxMTAsMCwwLDAsMTE0LDIyMywwLDAsMCwKLSAgICAyMTgsMywxMDAsMTExLDExNiw5MCwyLDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDIzLDk1LDEwMiwxMDUsMTEwLDEwMCw5NSwKLSAgICAxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LDk1LDExMCw5NywxMDksMTAxLAotICAgIDExNSwxOTAsMywwLDAsMTE1LDgsMCwwLDAsMCwyLDI3LDEsMTIsMiwKLSAgICA0LDMsMTIyLDM4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsCi0gICAgMTE2LDEwNCw0Niw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwKLSAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMTAsOTcsMTA5LDEwMSwxMTUsOTksMSwwLDAsMCwwLAotICAgIDAsMCwwLDMsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgMzgsMCwwLDAsMTI0LDAsMCwxMDYsMCwwLDEzMSwwLDAsOTIsMiwwLAotICAgIDEyNSwxLDAsMTI1LDIsMCwxMTYsMSwwLDExNiwyLDAsMTA2LDMsMCwxMjQsCi0gICAgMSwwLDI1LDEyNCwyLDAsMTMxLDIsMCw4Myw0MSwxLDc4LDQxLDQsMTE0LAotICAgIDIzOSwwLDAsMCwxMTQsMTE5LDAsMCwwLDExNCw4LDAsMCwwLDIxOCw3LAotICAgIDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0MSwzLDExNCwxMTAsMCwwLDAsOTAsMTgsCi0gICAgMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTAsOTcsCi0gICAgMTA5LDEwMSw5MCwxNCwxMTIsOTcsMTE2LDEwNCw5NSw5NywxMTYsMTE2LDExNCw5NSwxMTAsOTcsCi0gICAgMTA5LDEwMSwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsCi0gICAgMCwxMTQsMjM0LDAsMCwwLDIwMCwzLDAsMCwxMTUsNCwwLDAsMCwwLAotICAgIDEsMTgsMSwxMjIsMzEsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCwKLSAgICA5NywxMTYsMTA0LDQ2LDk1LDEwMywxMDEsMTE2LDk1LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsCi0gICAgMTEyLDk3LDExNiwxMDQsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwwLAotICAgIDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMTE4LDAsMCwwLDExNiwwLAotICAgIDAsMTI0LDAsMCwxMDYsMSwwLDEzMSwwLDAsMTMxLDEsMCwxMjUsMSwwLAotICAgIDEyNCwxLDAsMTI0LDAsMCwxMDYsMiwwLDEwNywzLDAsMTE0LDExMSwwLDEyNCwKLSAgICAwLDAsMTA2LDMsMCwxMjQsMCwwLDEwNiw0LDAsMTI0LDEsMCwxMzEsMiwKLSAgICAwLDEyNSwyLDAsMTI0LDIsMCwxMDAsMCwwLDEwNyw5LDAsMTE0LDEwMiwwLAotICAgIDEyNCwyLDAsMTA2LDUsMCwxMDAsMCwwLDEwNyw4LDAsMTE0LDEwMiwwLDEyNCwKLSAgICAyLDAsMTA2LDYsMCwxMTQsMTAyLDAsMTI0LDIsMCwxMDYsNiwwLDEyNCwwLAotICAgIDAsOTUsNywwLDEyNCwxLDAsMTI0LDAsMCw5NSwyLDAsMTI0LDAsMCwKLSAgICAxMDYsNywwLDgzLDQxLDEsNzgsNDEsOCwxMTQsOTUsMCwwLDAsMTE0LDIzNCwKLSAgICAwLDAsMCwxMTQsMjM1LDAsMCwwLDExNCwyMzYsMCwwLDAsMTE0LDIzMiwwLAotICAgIDAsMCwxMTQsMTI5LDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDIzMywwLDAsCi0gICAgMCw0MSwzLDExNCwxMTAsMCwwLDAsOTAsMTEsMTEyLDk3LDExNCwxMDEsMTEwLDExNiwKLSAgICA5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTY2LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwxMiw5NSwxMTQsMTAxLDk5LDk3LAotICAgIDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsMjA0LDMsMCwwLDExNSwxNiwwLDAsMCwKLSAgICAwLDIsMTgsMSwxNSwxLDIxLDMsMjcsMSw5LDEsMTIsMSw5LDEsCi0gICAgMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCwKLSAgICA0Niw5NSwxMTQsMTAxLDk5LDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsOTksMSwwLAotICAgIDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMTYsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwxLDAsCi0gICAgMTMxLDAsMCwxMzEsMSwwLDgzLDQxLDEsNzgsNDEsMiwyMTgsNCwxMDUsMTE2LAotICAgIDEwMSwxMTQsMTE0LDI0MSwwLDAsMCw0MSwxLDExNCwxMTAsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDgsOTUsCi0gICAgOTUsMTA1LDExNiwxMDEsMTE0LDk1LDk1LDIxNywzLDAsMCwxMTUsMiwwLDAsMCwKLSAgICAwLDEsMTIyLDIzLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsCi0gICAgMTE2LDEwNCw0Niw5NSw5NSwxMDUsMTE2LDEwMSwxMTQsOTUsOTUsOTksMSwwLDAsMCwKLSAgICAwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwKLSAgICAxMTUsMTYsMCwwLDAsMTE2LDAsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDAsCi0gICAgMCwxMzEsMSwwLDgzLDQxLDEsNzgsNDEsMiwxMTQsMzMsMCwwLDAsMTE0LAotICAgIDI0MSwwLDAsMCw0MSwxLDExNCwxMTAsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDcsOTUsOTUsMTA4LDEwMSwKLSAgICAxMTAsOTUsOTUsMjIwLDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjIsCisgICAgMCwwLDExNCw2LDAsMCwwLDExNCwyMTQsMCwwLDAsNTcsMywwLDAsCisgICAgMTE1LDgsMCwwLDAsOCwyLDQsMiw4LDUsOCw1LDExNCwyMTQsMCwKKyAgICAwLDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwKKyAgICAwLDAsMCw2NCwwLDAsMCwxMTUsMzIsMCwwLDAsMTAxLDAsOTAsMSwKKyAgICAxMDAsMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwKKyAgICAxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LDEwMCw2LDgzLDAsNDEsNywyMTgsMjAsCisgICAgODMsMTExLDExNywxMTQsOTksMTAxLDEwOCwxMDEsMTE1LDExNSw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsCisgICAgOTcsMTAwLDEwMSwxMTQsMTIyLDQ1LDc2LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTksMTA0LDEwNSwKKyAgICA5OSwxMDQsMzIsMTA0LDk3LDExMCwxMDAsMTA4LDEwMSwxMTUsMzIsMTE1LDExMSwxMTcsMTE0LDk5LAorICAgIDEwMSwxMDgsMTAxLDExNSwxMTUsMzIsMTAyLDEwNSwxMDgsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsCisgICAgMTE2LDExNSw0Niw5OSwyLDAsMCwwLDAsMCwwLDAsNSwwLDAsMCwKKyAgICA2LDAsMCwwLDY3LDAsMCwwLDExNSw1NiwwLDAsMCwxMjQsMCwxMDYsCisgICAgMCwxMjQsMSwxMzEsMSwxMjUsMiwxMjQsMCwxMDYsMSwxMjQsMiwxMzEsMSwxMjUsCisgICAgMywxMTYsMiwxMjQsMywxMDAsMSwxMjQsMSwxMDAsMiwxMjQsMiwxNDQsMiwxMzEsCisgICAgMSwxMjUsNCwxMTYsMywxMjQsNCwxMDAsMSwxMjQsMSwxMDAsMywxMjQsMiwxNDQsCisgICAgMiwxMzEsMSw4MywwLDQxLDQsNzgsMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwKKyAgICAwLDAsMTE0LDkyLDAsMCwwLDQxLDQsMTE0LDE1NCwwLDAsMCwxMTQsMTk2LAorICAgIDAsMCwwLDExNCwxMzgsMCwwLDAsMTE0LDE0NCwwLDAsMCw0MSw1LDExNCwKKyAgICAxMDMsMCwwLDAsMTE0LDEyMiwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDU2LAorICAgIDAsMCwwLDExNCwyMDUsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwKKyAgICAwLDAsMTE0LDYsMCwwLDAsMTE0LDE4MywwLDAsMCwxMDYsMywwLDAsCisgICAgMTE1LDgsMCwwLDAsMCwxLDEwLDEsMTAsMSwxOCwxLDEyMiwyOSw4MywKKyAgICAxMTEsMTE3LDExNCw5OSwxMDEsMTA4LDEwMSwxMTUsMTE1LDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywKKyAgICAxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsMzksODIsMTAxLAorICAgIDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsMTE2LDEwNCwxMDEsCisgICAgMTE0LDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMzIsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSwzMiwKKyAgICA5OSwxMTEsMTAwLDEwMSw0Niw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDMsMCwKKyAgICAwLDAsMTE0LDEyMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMTk4LDAsMCwwLDExMiwzLDAsMCwxMTUsCisgICAgMiwwLDAsMCwwLDIsMTIyLDMxLDgzLDExMSwxMTcsMTE0LDk5LDEwMSwxMDgsMTAxLAorICAgIDExNSwxMTUsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LAorICAgIDk1LDExNSwxMTEsMTE3LDExNCw5OSwxMDEsNzgsNDEsNiwxMTQsMTA4LDAsMCwwLDExNCwKKyAgICAxMDcsMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTEwLDAsMCwwLDExNCwxODMsCisgICAgMCwwLDAsMTE0LDE5OCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjE5LDAsMCwKKyAgICAwLDEwMiwzLDAsMCwxMTUsNiwwLDAsMCw4LDIsNCwyLDgsNiwKKyAgICAxMTQsMjE5LDAsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwwLDAsCisgICAgMCwwLDMsMCwwLDAsNjQsMCwwLDAsMTE1LDkyLDAsMCwwLDEwMSwKKyAgICAwLDkwLDEsMTAwLDAsOTAsMiwxMDAsMSw5MCwzLDEwMCwyLDEwMCwzLDEzMiwKKyAgICAwLDkwLDQsMTAwLDQsMTAwLDUsMTMyLDAsOTAsNSwxMDAsNiwxMDAsNywxMzIsCisgICAgMCw5MCw2LDEwMCw4LDEwMCw5LDEzMiwwLDkwLDcsMTAwLDEwLDEwMCwxMSwxMzIsCisgICAgMCw5MCw4LDEwMCwxMiwxMDAsMTMsMTMyLDAsOTAsOSwxMDAsMTQsMTAwLDE1LDEzMiwKKyAgICAwLDkwLDEwLDEwMCwxNiwxMDAsMTcsMTMyLDAsOTAsMTEsMTAxLDEyLDEwMCwxOCwxMDAsCisgICAgMTksMTMyLDAsMTMxLDEsOTAsMTMsMTAwLDIwLDgzLDAsNDEsMjEsMjE4LDE5LDY5LAorICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwKKyAgICAxMDEsMTE0LDEyMiw5Myw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsMTAxLAorICAgIDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LAorICAgIDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDg0LDEwNCwxMDEsMzIsOTksMTExLDExMCwxMTUsMTE2LAorICAgIDExNCwxMTcsOTksMTE2LDExMSwxMTQsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExNSwxMDUsMTAzLDExMCwKKyAgICAxMDEsMTAwLDMyLDExNiwxMTEsMzIsMTE5LDExMSwxMTQsMTA3LDMyLDExOSwxMDUsMTE2LDEwNCwzMiwKKyAgICA3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDk5LDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDIsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEyNCwxLDEyNCwwLDk1LAorICAgIDAsMTI0LDIsMTI0LDAsOTUsMSwxMDAsMCw4MywwLDQxLDEsNzgsNDEsMiwKKyAgICAxMTQsMTAxLDAsMCwwLDExNCwzNywwLDAsMCw0MSwzLDExNCwxMDMsMCwwLAorICAgIDAsMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4MSwwLDAsMCwxMjksCisgICAgMywwLDAsMTE1LDQsMCwwLDAsMCwxLDYsMSwxMjIsMjgsNjksMTIwLAorICAgIDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwKKyAgICAxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwKKyAgICAwLDAsMCwyLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDI0LDAsMCwwLDEyNCwwLDEwNiwwLDEyNCwxLDEwNiwwLDEwNywyLDExMSwyMiwKKyAgICAxMjQsMCwxMDYsMSwxMjQsMSwxMDYsMSwxMDcsMiw4MywwLDQxLDEsNzgsNDEsCisgICAgMiwxMTQsMjA3LDAsMCwwLDExNCwxMTQsMCwwLDAsNDEsMiwxMTQsMTAzLDAsCisgICAgMCwwLDExNCwyMDgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMTE0LDIwOSwwLDAsMCwxMzMsMywwLDAsMTE1LAorICAgIDQsMCwwLDAsMCwxLDEyLDEsMTIyLDI2LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsCisgICAgMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDk1LDk1LAorICAgIDEwMSwxMTMsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsMCwwLAorICAgIDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMjAsMCwwLDAsMTE2LDAsCisgICAgMTI0LDAsMTA2LDEsMTMxLDEsMTE2LDAsMTI0LDAsMTA2LDIsMTMxLDEsNjUsMCwKKyAgICA4MywwLDQxLDEsNzgsNDEsMywxMTQsMjEwLDAsMCwwLDExNCwxMDEsMCwwLAorICAgIDAsMTE0LDM3LDAsMCwwLDQxLDEsMTE0LDEwMywwLDAsMCwxMTQsNCwwLAorICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjExLDAsMCwKKyAgICAwLDEzNywzLDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDI4LDY5LDEyMCwKKyAgICAxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsCisgICAgMTE0LDQ2LDk1LDk1LDEwNCw5NywxMTUsMTA0LDk1LDk1LDk5LDIsMCwwLDAsMCwKKyAgICAwLDAsMCwzLDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LAorICAgIDM2LDAsMCwwLDExNiwwLDEwNiwxLDExNiwyLDEwNiwzLDEyNCwxLDEzMSwyLAorICAgIDEyNSwyLDExNiwwLDEwNiw0LDEwMCwxLDEyNCwxLDEwNiw1LDEyNCwwLDEwNiw2LAorICAgIDEzMSwzLDEsMCwxMjQsMiw4MywwLDQxLDIsMTIyLDM4LDY3LDExNCwxMDEsOTcsCisgICAgMTE2LDEwMSwzMiw5NywxMTAsMzIsMTE3LDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwxMDEsCisgICAgMTAwLDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywKKyAgICAxMDgsMTAxLDEyMiwzOCwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwzMiwxMDksMTExLAorICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLAorICAgIDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMjMsMzMsMTE0LDEyNSw0MSw3LDExNCwxMTcsMCwwLAorICAgIDAsMTE0LDE4NCwwLDAsMCwxMTQsMTQyLDAsMCwwLDkwLDE0LDk5LDExNCwxMDEsCisgICAgOTcsMTE2LDEwMSw5NSwxMDAsMTIxLDExMCw5NywxMDksMTA1LDk5LDExNCwxMzIsMCwwLDAsCisgICAgMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwwLDAsNDEsMywxMTQsMTAzLDAsMCwKKyAgICAwLDExNCwxNjEsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTgyLDAsMCwwLDE0MCwKKyAgICAzLDAsMCwxMTUsMTAsMCwwLDAsMCwyLDQsMSwxMCwxLDYsMSwKKyAgICAxMiwxLDEyMiwzMyw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsCisgICAgMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwKKyAgICAwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsMzYsMCwwLDAsMTE2LAorICAgIDAsMTA2LDEsMTE2LDIsMTA2LDMsMTI0LDEsMTMxLDIsMSwwLDExNiwwLDEwNiwKKyAgICA0LDEwMCwxLDEyNCwwLDEwNiw1LDEyNCwwLDEwNiw2LDEzMSwzLDEsMCwxMDAsCisgICAgMiw4MywwLDQxLDMsMTIyLDMwLDczLDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwKKyAgICAxMDEsMzIsOTcsMTEwLDMyLDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDEyMiw0MCwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCwKKyAgICAzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMjMsMzMsMTE0LDEyNSwzMiwxMDEsMTIwLDEwMSwKKyAgICA5OSwxMTcsMTE2LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDEyMywzMywxMTQsMTI1LDc4LAorICAgIDQxLDcsMTE0LDExNywwLDAsMCwxMTQsMTg0LDAsMCwwLDExNCwxNDIsMCwwLAorICAgIDAsOTAsMTIsMTAxLDEyMCwxMDEsOTksOTUsMTAwLDEyMSwxMTAsOTcsMTA5LDEwNSw5OSwxMTQsCisgICAgMTMyLDAsMCwwLDExNCwxMDEsMCwwLDAsMTE0LDM3LDAsMCwwLDQxLDIsCisgICAgMTE0LDEwMywwLDAsMCwxMTQsMTg2LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODcsMCwwLDAsMTQ4LDMsCisgICAgMCwwLDExNSw2LDAsMCwwLDAsMiwxNCwxLDYsMSwxMjIsMzEsNjksCisgICAgMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLAorICAgIDEwMSwxMTQsNDYsMTAxLDEyMCwxMDEsOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTksMiwKKyAgICAwLDAsMCwwLDAsMCwwLDIsMCwwLDAsNCwwLDAsMCwzLAorICAgIDAsMCwwLDExNSwzNiwwLDAsMCwxMTYsMCwxMjQsMCwxMDYsMSwxMzEsMSwKKyAgICAxMDAsMSwyNSwwLDEzNywwLDExNiwyLDEzNSwwLDEwMiwxLDEwMCwyLDEwMCwzLAorICAgIDEzMiw4LDExNiwzLDY4LDAsMTMxLDEsMTMxLDEsODMsMCw0MSw0LDEyMiw0OSwKKyAgICA4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDg0LDExNCwxMTcsMTAxLDMyLDEwNSwxMDIsMzIsMTE2LAorICAgIDEwNCwxMDEsMzIsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsMzIsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsMzIsMTA1LDExNSwzMiw5NywzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsCisgICAgNDYsMTE0LDMxLDAsMCwwLDk5LDEsMCwwLDAsMCwwLDAsMCwyLAorICAgIDAsMCwwLDQsMCwwLDAsNTEsMCwwLDAsMTE1LDI2LDAsMCwwLAorICAgIDEyNCwwLDkzLDE4LDEyNSwxLDEzNiwwLDEwMCwwLDEyNCwxLDIzLDAsMTA3LDIsCisgICAgODYsMCwxLDAsMTEzLDIsMTAwLDEsODMsMCw0MSwyLDExNCwxODEsMCwwLAorICAgIDAsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMjQsMCwwLDAsMjE4LDYsCisgICAgMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsNDEsMSwyMTgsOSwxMDIsMTA1LDEwOCwxMDEsOTUsMTEwLAorICAgIDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjUwLDksNjAsCisgICAgMTAzLDEwMSwxMTAsMTAxLDEyMCwxMTIsMTE0LDYyLDE1NywzLDAsMCwxMTUsMiwwLDAsCisgICAgMCw0LDEsMTIyLDQ5LDY5LDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsNzAsMTA1LAorICAgIDEwOCwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNywKKyAgICA5NywxMDMsMTAxLDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLAorICAgIDExMCwxMDEsMTIwLDExMiwxMTQsNjIsNDEsNCwxMTQsNDAsMCwwLDAsMTE0LDM3LDAsCisgICAgMCwwLDIxOCwzLDk3LDExMCwxMjEsMjE4LDE4LDY5LDg4LDg0LDY5LDc4LDgzLDczLAorICAgIDc5LDc4LDk1LDgzLDg1LDcwLDcwLDczLDg4LDY5LDgzLDQxLDIsMTE0LDEwMywwLAorICAgIDAsMCwxMTQsMTIyLDAsMCwwLDExNCw0LDAsMCwwLDQxLDEsMTE0LDIyMiwKKyAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTU2LDAsMCwwLDE1NCwzLDAsCisgICAgMCwxMTUsNiwwLDAsMCwwLDIsMTQsMSwxMiwxLDEyMiwzMCw2OSwxMjAsCisgICAgMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLAorICAgIDExNCw0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsMiwxMjIsNjMsODIsMTAxLAorICAgIDExNiwxMTcsMTE0LDExMCwzMiw3OCwxMTEsMTEwLDEwMSwzMiw5NywxMTUsMzIsOTcsMTEwLDMyLAorICAgIDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLAorICAgIDMyLDk5LDk3LDExMCwxMTAsMTExLDExNiwzMiw5OSwxMTQsMTAxLDk3LDExNiwxMDEsMzIsOTcsCisgICAgMzIsOTksMTExLDEwMCwxMDEsMzIsMTExLDk4LDEwNiwxMDEsOTksMTE2LDQ2LDc4LDExNCw0LAorICAgIDAsMCwwLDQxLDIsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODMsCisgICAgMCwwLDAsMTYwLDMsMCwwLDExNSwyLDAsMCwwLDAsMiwxMjIsMjgsCisgICAgNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwxMDUsMTA4LDEwMSw3NiwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsCisgICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCisgICAgMCwxMTUsNCwwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDUzLDgyLDEwMSwKKyAgICAxMTYsMTE3LDExNCwxMTAsMzIsNzgsMTExLDExMCwxMDEsMzIsOTcsMTE1LDMyLDEwMSwxMjAsMTE2LAorICAgIDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiwxMDQsCisgICAgOTcsMTE4LDEwMSwzMiwxMTAsMTExLDMyLDExNSwxMTEsMTE3LDExNCw5OSwxMDEsMzIsOTksMTExLAorICAgIDEwMCwxMDEsNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTAzLDAsMCwwLAorICAgIDExNCwxMjIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDYsMCwwLDAsMTE0LDE5OCwwLDAsMCwxNjQsMywwLDAsMTE1LDIsMCwKKyAgICAwLDAsMCwyLDEyMiwzMCw2OSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDcwLAorICAgIDEwNSwxMDgsMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwxMDMsMTAxLDExNiw5NSwxMTUsMTExLAorICAgIDExNywxMTQsOTksMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDYsMCwwLDAsMTI0LDAsCisgICAgMTA2LDAsODMsMCw0MSwxLDEyMiw1OCw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDExNiwxMTEsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LAorICAgIDExMSwxMTcsMTE0LDk5LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsOTcsMTE1LDMyLDEwMiwxMTEsCisgICAgMTE3LDExMCwxMDAsMzIsOTgsMTIxLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsCisgICAgMTE0LDQ2LDQxLDEsMTE0LDM3LDAsMCwwLDQxLDIsMTE0LDEwMywwLDAsMCwKKyAgICAxMTQsMTIyLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDExNCwxNTQsMCwwLDAsMTY4LDMsMCwwLDExNSwyLDAsCisgICAgMCwwLDAsMywxMjIsMzIsNjksMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsMTExLDExMCw3MCwKKyAgICAxMDUsMTA4LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTAyLDEwNSwKKyAgICAxMDgsMTAxLDExMCw5NywxMDksMTAxLDc4LDQxLDE0LDExNCwxMDgsMCwwLDAsMTE0LDEwNywKKyAgICAwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDE4MSwwLAorICAgIDAsMCwxMTQsMjA5LDAsMCwwLDExNCwyMTEsMCwwLDAsMTE0LDE4MiwwLDAsCisgICAgMCwxMTQsMTg3LDAsMCwwLDExNCwxNTYsMCwwLDAsMTE0LDE4MywwLDAsMCwKKyAgICAxMTQsMTk4LDAsMCwwLDExNCwxMTksMCwwLDAsMTE0LDE1NCwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKKyAgICAwLDAsMCwxMTQsMjIwLDAsMCwwLDEyMSwzLDAsMCwxMTUsMjAsMCwwLAorICAgIDAsOCw2LDQsMiw4LDQsOCw0LDgsMyw4LDgsOCw2LDgsCisgICAgNiw4LDQsOCw0LDExNCwyMjAsMCwwLDAsOTksMCwwLDAsMCwwLAorICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2NCwwLDAsMCwxMTUsCisgICAgOTYsMCwwLDAsMTAxLDAsOTAsMSwxMDAsMCw5MCwyLDEwMCwxLDkwLDMsCisgICAgMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwxMDAsNCwxMDAsNSwxMzIsMCw5MCw1LAorICAgIDEwMCw2LDEwMCw3LDEzMiwwLDkwLDYsMTAwLDgsMTAwLDksMTMyLDAsOTAsNywKKyAgICAxMDAsMTAsMTAwLDExLDEzMiwwLDkwLDgsMTAwLDEyLDEwMCwxMywxMzIsMCw5MCw5LAorICAgIDEwMCwxNCwxMDAsMTUsMTMyLDAsOTAsMTAsMTAwLDE2LDEwMCwxNywxMzIsMCw5MCwxMSwKKyAgICAxMDAsMTgsMTAwLDE5LDEzMiwwLDkwLDEyLDEwMCwyMCwxMDAsMjEsMTMyLDAsOTAsMTMsCisgICAgMTAwLDIyLDgzLDAsNDEsMjMsMjE4LDE0LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsODAsOTcsMTE2LDEwNCw5NywzOCwxLDAsMCw4MiwxMDEsMTEyLDExNCwxMDEsCisgICAgMTE1LDEwMSwxMTAsMTE2LDExNSwzMiw5NywzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LAorICAgIDEwMSwzMiwxMTIsOTcsOTksMTA3LDk3LDEwMywxMDEsMzksMTE1LDMyLDExMiw5NywxMTYsMTA0LAorICAgIDQ2LDMyLDMyLDczLDExNiwzMiwxMTcsMTE1LDEwMSwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsMTA5LAorICAgIDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTAsMzIsMzIsMzIsMzIsMTE2LAorICAgIDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsMTA1LDExNiwxMTUsMzIsMTEyLDk3LDExNCwxMDEsMTEwLAorICAgIDExNiwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NCwzMiw5NywxMTAsMTAwLDMyLDEwMiwxMTQsCisgICAgMTExLDEwOSwzMiwxMTYsMTA0LDEwMSwxMTQsMTAxLDMyLDEwNSwxMTYsMzIsMTA4LDExMSwxMTEsMTA3LAorICAgIDExNSwzMiwxMTcsMTEyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsMzksCisgICAgMTE1LDEwLDMyLDMyLDMyLDMyLDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDQ2LDMyLAorICAgIDMyLDg3LDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTA1LDExNSwzMiw5OSwxMDQsOTcsMTEwLDEwMywKKyAgICAxMDEsMTE1LDQ0LDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwKKyAgICAzMiwxMTEsMTE5LDExMCwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDUsMTE1LDMyLDExNCwxMDEsOTksCisgICAgMTExLDEwOSwxMTIsMTE3LDExNiwxMDEsMTAwLDQ0LDEwLDMyLDMyLDMyLDMyLDExNywxMTUsMTA1LAorICAgIDExMCwxMDMsMzIsMTEyLDk3LDExNiwxMDQsOTUsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMzIsCisgICAgMzIsNzAsMTExLDExNCwzMiwxMTYsMTExLDExMiw0NSwxMDgsMTAxLDExOCwxMDEsMTA4LDMyLDEwOSwKKyAgICAxMTEsMTAwLDExNywxMDgsMTAxLDExNSw0NCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE0LDEwMSwKKyAgICAxMTAsMTE2LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDM5LDExNSwzMiwxMTIsOTcsMTE2LDEwNCwKKyAgICAxMCwzMiwzMiwzMiwzMiwxMDUsMTE1LDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LAorICAgIDQ2LDk5LDQsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDIsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDM2LDAsMCwwLDEyNCwxLDEyNCwwLDk1LAorICAgIDAsMTI0LDIsMTI0LDAsOTUsMSwxMTYsMiwxMjQsMCwxMDYsMywxMzEsMCwxMzEsCisgICAgMSwxMjQsMCw5NSw0LDEyNCwzLDEyNCwwLDk1LDUsMTAwLDAsODMsMCw0MSwKKyAgICAxLDc4LDQxLDYsMjE4LDUsOTUsMTEwLDk3LDEwOSwxMDEsMjE4LDUsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsMTE0LDk2LDAsMCwwLDIxOCwxNiw5NSwxMDMsMTAxLDExNiw5NSwxMTIsOTcsCisgICAgMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LDIxOCwxNyw5NSwxMDgsOTcsMTE1LDExNiwKKyAgICA5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LDk1LDExMiw5NywxMTYsMTA0LDIxOCwxMiw5NSwxMTIsCisgICAgOTcsMTE2LDEwNCw5NSwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCw0MSw0LDExNCwxMDMsMCwwLAorICAgIDAsMTE0LDEwMSwwLDAsMCwxMTQsMzcsMCwwLDAsMjE4LDExLDExMiw5NywxMTYsCisgICAgMTA0LDk1LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwwLDExNCw0LDAsCisgICAgMCwwLDExNCw2LDAsMCwwLDExNCwxODEsMCwwLDAsMTgxLDMsMCwwLAorICAgIDExNSw4LDAsMCwwLDAsMSw2LDEsNiwxLDE0LDEsMTIyLDIzLDk1LAorICAgIDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSw5NSwKKyAgICAxMDUsMTEwLDEwNSwxMTYsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDQsCisgICAgMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMzgsMCwwLDAsCisgICAgMTI0LDAsMTA2LDAsMTA2LDEsMTAwLDEsMTMxLDEsOTIsMywxMjUsMSwxMjUsMiwKKyAgICAxMjUsMywxMjQsMiwxMDAsMiwxMDcsMiwxMTQsMzAsMTAwLDYsODMsMCwxMjQsMSwKKyAgICAxMDAsNSwxMDIsMiw4MywwLDQxLDcsMTIyLDYyLDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsCisgICAgMTE1LDMyLDk3LDMyLDExNiwxMTcsMTEyLDEwOCwxMDEsMzIsMTExLDEwMiwzMiw0MCwxMTIsOTcsCisgICAgMTE0LDEwMSwxMTAsMTE2LDQ1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ1LDExMCw5NywxMDksMTAxLAorICAgIDQ0LDMyLDExMiw5NywxMTQsMTAxLDExMCwxMTYsNDUsMTEyLDk3LDExNiwxMDQsNDUsOTcsMTE2LAorICAgIDExNiwxMTQsNDUsMTEwLDk3LDEwOSwxMDEsNDEsMTE0LDYxLDAsMCwwLDExNCwzMiwwLAorICAgIDAsMCwxMTQsOCwwLDAsMCwxMTQsMzcsMCwwLDAsOTAsOCw5NSw5NSwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSw5NSw0MSwyLDEyMiwzLDExNSwxMjEsMTE1LDEyMiw0LDExMiwKKyAgICA5NywxMTYsMTA0LDQxLDIsMTE0LDIyNywwLDAsMCwxMTQsMzQsMCwwLDAsNDEsCisgICAgNCwxMTQsMTAzLDAsMCwwLDExNCwyMTgsMCwwLDAsMjE4LDMsMTAwLDExMSwxMTYsCisgICAgOTAsMiwxMDksMTAxLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAorICAgIDAsMCwwLDIxOCwyMyw5NSwxMDIsMTA1LDExMCwxMDAsOTUsMTEyLDk3LDExNCwxMDEsMTEwLAorICAgIDExNiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMTg3LDMsMCwwLAorICAgIDExNSw4LDAsMCwwLDAsMiwxOCwxLDgsMiw0LDMsMTIyLDM4LDk1LAorICAgIDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSwxMDIsCisgICAgMTA1LDExMCwxMDAsOTUsMTEyLDk3LDExNCwxMDEsMTEwLDExNiw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMTAsOTcsMTA5LDEwMSwxMTUsOTksMSwwLDAsMCwwLDAsMCwwLDMsMCwKKyAgICAwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsMjgsMCwwLDAsMTI0LAorICAgIDAsMTA2LDAsMTMxLDAsOTIsMiwxMjUsMSwxMjUsMiwxMTYsMSwxMTYsMiwxMDYsCisgICAgMywxMjQsMSwyNSwwLDEyNCwyLDEzMSwyLDgzLDAsNDEsMSw3OCw0MSw0LAorICAgIDExNCwyMzQsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsOCwwLDAsMCwyMTgsCisgICAgNywxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTUsNDEsMywxMTQsMTAzLDAsMCwwLDkwLAorICAgIDE4LDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTUsMTEwLAorICAgIDk3LDEwOSwxMDEsOTAsMTQsMTEyLDk3LDExNiwxMDQsOTUsOTcsMTE2LDExNiwxMTQsOTUsMTEwLAorICAgIDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKKyAgICAwLDAsMTE0LDIyOSwwLDAsMCwxOTcsMywwLDAsMTE1LDQsMCwwLDAsCisgICAgMCwxLDEyLDEsMTIyLDMxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsCisgICAgODAsOTcsMTE2LDEwNCw0Niw5NSwxMDMsMTAxLDExNiw5NSwxMTIsOTcsMTE0LDEwMSwxMTAsMTE2LAorICAgIDk1LDExMiw5NywxMTYsMTA0LDk5LDEsMCwwLDAsMCwwLDAsMCwzLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDgwLDAsMCwwLDExNiwKKyAgICAwLDEyNCwwLDEwNiwxLDEzMSwwLDEzMSwxLDEyNSwxLDEyNCwxLDEyNCwwLDEwNiwKKyAgICAyLDEwNywzLDExNCw3NCwxMjQsMCwxMDYsMywxMjQsMCwxMDYsNCwxMjQsMSwxMzEsCisgICAgMiwxMjUsMiwxMjQsMiwxMDAsMCwxMDcsOSwxMTQsNjgsMTI0LDIsMTA2LDUsMTAwLAorICAgIDAsMTA3LDgsMTE0LDY4LDEyNCwyLDEwNiw2LDExNCw2OCwxMjQsMiwxMDYsNiwxMjQsCisgICAgMCw5NSw3LDEyNCwxLDEyNCwwLDk1LDIsMTI0LDAsMTA2LDcsODMsMCw0MSwKKyAgICAxLDc4LDQxLDgsMTE0LDk2LDAsMCwwLDExNCwyMjksMCwwLDAsMTE0LDIzMCwKKyAgICAwLDAsMCwxMTQsMjMxLDAsMCwwLDExNCwyMjcsMCwwLDAsMTE0LDEyMywwLAorICAgIDAsMCwxMTQsMTUzLDAsMCwwLDExNCwyMjgsMCwwLDAsNDEsMywxMTQsMTAzLAorICAgIDAsMCwwLDkwLDExLDExMiw5NywxMTQsMTAxLDExMCwxMTYsOTUsMTEyLDk3LDExNiwxMDQsCisgICAgMTE0LDE2MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCisgICAgNiwwLDAsMCwyMTgsMTIsOTUsMTE0LDEwMSw5OSw5NywxMDgsOTksMTE3LDEwOCw5NywKKyAgICAxMTYsMTAxLDIwMSwzLDAsMCwxMTUsMTYsMCwwLDAsMCwyLDEyLDEsMTAsCisgICAgMSwxNCwzLDE4LDEsNiwxLDgsMSw2LDEsMTIyLDI3LDk1LDc4LDk3LAorICAgIDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSwxMTQsMTAxLDk5LAorICAgIDk3LDEwOCw5OSwxMTcsMTA4LDk3LDExNiwxMDEsOTksMSwwLDAsMCwwLDAsMCwKKyAgICAwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTIsMCwKKyAgICAwLDAsMTE2LDAsMTI0LDAsMTA2LDEsMTMxLDAsMTMxLDEsODMsMCw0MSwxLAorICAgIDc4LDQxLDIsMjE4LDQsMTA1LDExNiwxMDEsMTE0LDExNCwyMzYsMCwwLDAsNDEsMSwKKyAgICAxMTQsMTAzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDIxOCw4LDk1LDk1LDEwNSwxMTYsMTAxLDExNCw5NSw5NSwyMTQsMywKKyAgICAwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyMyw5NSw3OCw5NywxMDksMTAxLAorICAgIDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsOTUsMTA1LDExNiwxMDEsMTE0LAorICAgIDk1LDk1LDk5LDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDMsCisgICAgMCwwLDAsNjcsMCwwLDAsMTE1LDE0LDAsMCwwLDEyNCwyLDEyNCwwLAorICAgIDEwNiwwLDEyNCwxLDYwLDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLDEsMTE0LAorICAgIDIyOCwwLDAsMCw0MSwzLDExNCwxMDMsMCwwLDAsMjE4LDUsMTA1LDExMCwxMDAsCisgICAgMTAxLDEyMCwxMTQsMzcsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMjE4LDExLDk1LDk1LDExNSwxMDEsMTE2LDEwNSwxMTYsMTAxLAorICAgIDEwOSw5NSw5NSwyMTcsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNiwKICAgICA5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDgwLDk3LDExNiwxMDQsNDYsOTUsCi0gICAgOTUsMTA4LDEwMSwxMTAsOTUsOTUsOTksMSwwLDAsMCwwLDAsMCwwLDEsCi0gICAgMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsMTYsMCwwLDAsCi0gICAgMTAwLDEsMCwxMDYsMCwwLDEyNCwwLDAsMTA2LDEsMCwxMzEsMSwwLDgzLAotICAgIDQxLDIsNzgsMTIyLDIwLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsCi0gICAgOTcsMTE2LDEwNCw0MCwxMjMsMzMsMTE0LDEyNSw0MSw0MSwyLDExNCw0OSwwLDAsMCwKLSAgICAxMTQsMjMzLDAsMCwwLDQxLDEsMTE0LDExMCwwLDAsMCwxMTQsNCwwLDAsCi0gICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsOCw5NSw5NSwxMTQsCi0gICAgMTAxLDExMiwxMTQsOTUsOTUsMjIzLDMsMCwwLDExNSwyLDAsMCwwLDAsMSwKLSAgICAxMjIsMjMsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LAotICAgIDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSw5OSwyLDAsMCwwLDAsMCwKLSAgICAwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwwLDExNSwxNiwKLSAgICAwLDAsMCwxMjQsMSwwLDEyNCwwLDAsMTA2LDAsMCwxMzEsMCwwLDEwNywKLSAgICA2LDAsODMsNDEsMSw3OCw0MSwxLDExNCwyNDEsMCwwLDAsNDEsMiwxMTQsCi0gICAgMTEwLDAsMCwwLDIxOCw0LDEwNSwxMTYsMTAxLDEwOSwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTIsOTUsOTUsOTksMTExLDExMCwKLSAgICAxMTYsOTcsMTA1LDExMCwxMTUsOTUsOTUsMjI2LDMsMCwwLDExNSwyLDAsMCwwLAotICAgIDAsMSwxMjIsMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw4MCw5NywKLSAgICAxMTYsMTA0LDQ2LDk1LDk1LDk5LDExMSwxMTAsMTE2LDk3LDEwNSwxMTAsMTE1LDk1LDk1LDk5LAotICAgIDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDIwLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDYsCi0gICAgMSwwLDEyNCwxLDAsMTMxLDEsMCwxLDEwMCwwLDAsODMsNDEsMSw3OCwKLSAgICA0MSwyLDExNCwyMzMsMCwwLDAsMTE0LDE2NSwwLDAsMCw0MSwyLDExNCwxMTAsCi0gICAgMCwwLDAsMTE0LDI0NiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNiwwLDAsMCwxMTQsMTY1LDAsMCwwLDIyOSwzLDAsMCwKLSAgICAxMTUsMiwwLDAsMCwwLDEsMTIyLDIxLDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiwKLSAgICA5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NywxMTIsMTEyLDEwMSwxMTAsMTAwLDc4LDQxLAotICAgIDEzLDExNCwxMTQsMCwwLDAsMTE0LDExMywwLDAsMCwxMTQsMTE1LDAsMCwwLAotICAgIDExNCwxMTYsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMTQsMjM5LDAsMCwwLDExNCwKLSAgICAyMzQsMCwwLDAsMTE0LDI0MSwwLDAsMCwxMTQsMjQzLDAsMCwwLDExNCwyNDQsCi0gICAgMCwwLDAsMTE0LDI0NSwwLDAsMCwxMTQsMjQ3LDAsMCwwLDExNCwxNjUsMCwKLSAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDYsMCwwLDAsMTE0LDIzMSwwLDAsMCwxNzcsMywwLDAsMTE1LAotICAgIDIwLDAsMCwwLDEyLDUsNiwyLDEyLDYsMTIsMTAsMTIsNCwxMiwxMywKLSAgICAxMiwzLDEyLDMsMTIsMywxMiwzLDExNCwyMzEsMCwwLDAsOTksMCwwLAotICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCw2NCwwLAotICAgIDAsMCwxMTUsMTE4LDAsMCwwLDEwMSwwLDAsOTAsMSwwLDEwMCwwLDAsCi0gICAgOTAsMiwwLDEwMCwxLDAsMTAwLDIsMCwxMzIsMCwwLDkwLDMsMCwxMDEsCi0gICAgNCwwLDEwMCwzLDAsMTAwLDQsMCwxMzIsMCwwLDEzMSwxLDAsOTAsNSwKLSAgICAwLDEwMCw1LDAsMTAwLDYsMCwxMzIsMCwwLDkwLDYsMCwxMDAsNywwLAotICAgIDEwMCw4LDAsMTMyLDAsMCw5MCw3LDAsMTAwLDksMCwxMDAsMTAsMCwxMzIsCi0gICAgMCwwLDkwLDgsMCwxMDAsMTEsMCwxMDAsMTIsMCwxMzIsMCwwLDkwLDksCi0gICAgMCwxMDAsMTMsMCwxMDAsMTQsMCwxMzIsMCwwLDkwLDEwLDAsMTAwLDE1LDAsCi0gICAgMTAwLDE2LDAsMTMyLDAsMCw5MCwxMSwwLDEwMCwxNywwLDgzLDQxLDE4LDIxOCwKKyAgICA5NSwxMTUsMTAxLDExNiwxMDUsMTE2LDEwMSwxMDksOTUsOTUsOTksMSwwLDAsMCwwLAorICAgIDAsMCwwLDEsMCwwLDAsMiwwLDAsMCw2NywwLDAsMCwxMTUsCisgICAgMTIsMCwwLDAsMTE2LDAsMTI0LDAsMTA2LDEsMTMxLDAsMTMxLDEsODMsMCwKKyAgICA0MSwxLDc4LDQxLDIsMTE0LDMzLDAsMCwwLDExNCwyMzYsMCwwLDAsNDEsCisgICAgMSwxMTQsMTAzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw2LDAsMCwwLDIxOCw3LDk1LDk1LDEwOCwxMDEsMTEwLDk1LDk1LDIyMCwzLAorICAgIDAsMCwxMTUsMiwwLDAsMCwwLDEsMTIyLDIyLDk1LDc4LDk3LDEwOSwxMDEsCisgICAgMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSw5NSwxMDgsMTAxLDExMCw5NSwKKyAgICA5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSwxMiwwLDAsMCwxMDAsMSwxMDYsMCwxMjQsCisgICAgMCwxMDYsMSwxMzEsMSw4MywwLDQxLDIsNzgsMTIyLDIwLDk1LDc4LDk3LDEwOSwKKyAgICAxMDEsMTE1LDExMiw5Nyw5OSwxMDEsODAsOTcsMTE2LDEwNCw0MCwxMjMsMzMsMTE0LDEyNSw0MSwKKyAgICA0MSwyLDExNCw1MCwwLDAsMCwxMTQsMjI4LDAsMCwwLDQxLDEsMTE0LDEwMywKKyAgICAwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLAorICAgIDAsMCwyMTgsOCw5NSw5NSwxMTQsMTAxLDExMiwxMTQsOTUsOTUsMjIzLDMsMCwwLAorICAgIDExNSwyLDAsMCwwLDAsMSwxMjIsMjMsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLAorICAgIDk3LDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSwKKyAgICA5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwxMiwwLDAsMCwxMjQsMSwxMjQsMCwxMDYsMCwKKyAgICAxMzEsMCwxMDcsNiw4MywwLDQxLDEsNzgsNDEsMSwxMTQsMjM2LDAsMCwwLAorICAgIDQxLDIsMTE0LDEwMywwLDAsMCwyMTgsNCwxMDUsMTE2LDEwMSwxMDksMTE0LDQsMCwKKyAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDEyLDk1LDk1LAorICAgIDk5LDExMSwxMTAsMTE2LDk3LDEwNSwxMTAsMTE1LDk1LDk1LDIyNiwzLDAsMCwxMTUsMiwKKyAgICAwLDAsMCwwLDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwKKyAgICAxMDEsODAsOTcsMTE2LDEwNCw0Niw5NSw5NSw5OSwxMTEsMTEwLDExNiw5NywxMDUsMTEwLDExNSwKKyAgICA5NSw5NSw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwyLAorICAgIDAsMCwwLDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMjQsMCwxMDYsMCwKKyAgICAxMDYsMSwxMjQsMSwxMzEsMSwxLDAsMTAwLDAsODMsMCw0MSwxLDc4LDQxLAorICAgIDIsMTE0LDIyOCwwLDAsMCwxMTQsMTYwLDAsMCwwLDQxLDIsMTE0LDEwMywwLAorICAgIDAsMCwxMTQsMjQzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDExNCwxNjAsMCwwLDAsMjI5LDMsMCwwLDExNSwKKyAgICAyLDAsMCwwLDAsMSwxMjIsMjEsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LAorICAgIDk5LDEwMSw4MCw5NywxMTYsMTA0LDQ2LDk3LDExMiwxMTIsMTAxLDExMCwxMDAsNzgsNDEsMTQsCisgICAgMTE0LDEwOCwwLDAsMCwxMTQsMTA3LDAsMCwwLDExNCwxMDksMCwwLDAsMTE0LAorICAgIDExMCwwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwyMzQsMCwwLDAsMTE0LDIyOSwKKyAgICAwLDAsMCwxMTQsMjM2LDAsMCwwLDExNCwyMzgsMCwwLDAsMTE0LDI0MCwwLAorICAgIDAsMCwxMTQsMjQxLDAsMCwwLDExNCwyNDIsMCwwLDAsMTE0LDI0NCwwLDAsCisgICAgMCwxMTQsMTYwLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyMjYsMCwwLDAsMTc0LAorICAgIDMsMCwwLDExNSwyMiwwLDAsMCw4LDUsNCwyLDgsNiw4LDEwLAorICAgIDgsNCw4LDEzLDgsMyw4LDMsOCwzLDgsMyw4LDMsMTE0LDIyNiwKKyAgICAwLDAsMCw5OSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKyAgICAzLDAsMCwwLDY0LDAsMCwwLDExNSw4MCwwLDAsMCwxMDEsMCw5MCwKKyAgICAxLDEwMCwwLDkwLDIsMTAwLDEsMTAwLDIsMTMyLDAsOTAsMywxMDEsNCwxMDAsCisgICAgMywxMDAsNCwxMzIsMCwxMzEsMSw5MCw1LDEwMCw1LDEwMCw2LDEzMiwwLDkwLAorICAgIDYsMTAwLDcsMTAwLDgsMTMyLDAsOTAsNywxMDAsOSwxMDAsMTAsMTMyLDAsOTAsCisgICAgOCwxMDAsMTEsMTAwLDEyLDEzMiwwLDkwLDksMTAwLDEzLDEwMCwxNCwxMzIsMCw5MCwKKyAgICAxMCwxMDAsMTUsMTAwLDE2LDEzMiwwLDkwLDExLDEwMCwxNyw4MywwLDQxLDE4LDIxOCwKICAgICAxNiw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLAogICAgIDExNCw5OSw0LDAsMCwwLDAsMCwwLDAsNCwwLDAsMCw0LDAsCi0gICAgMCwwLDY3LDAsMCwwLDExNSwyNSwwLDAsMCwxMTYsMCwwLDEyNCwxLAotICAgIDAsMTI0LDIsMCwxMjQsMywwLDEzMSwzLDAsMTI0LDAsMCw5NSwxLDAsCi0gICAgMTAwLDAsMCw4Myw0MSwxLDc4LDQxLDIsMTE0LDIzMSwwLDAsMCwxMTQsMjMzLAotICAgIDAsMCwwLDQxLDQsMTE0LDExMCwwLDAsMCwxMTQsMTA4LDAsMCwwLDExNCwKLSAgICAzNywwLDAsMCwxMTQsMjM3LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAotICAgIDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODYsMCwwLDAsMjM1LDMsMCwKLSAgICAwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjUsOTUsNzgsOTcsMTA5LDEwMSwxMTUsCi0gICAgMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsCi0gICAgMTE2LDk1LDk1LDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAotICAgIDIsMCwwLDAsNjcsMCwwLDAsMTE1LDE2LDAsMCwwLDEwMCwxLDAsCi0gICAgMTA2LDAsMCwxMjQsMSwwLDEwNiwxLDAsMTMxLDEsMCw4Myw0MSwyLDEyMiwKLSAgICAxMTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwzMiwxMTQsMTAxLDExMiwxMTQsMzIsMTAyLDExMSwxMTQsCi0gICAgMzIsMTE2LDEwNCwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwMSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwKLSAgICAzMiwxMDUsMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsCi0gICAgMzIsODQsMTA0LDEwMSwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwxMDksOTcsOTksMTA0LAotICAgIDEwNSwxMTAsMTAxLDExNCwxMjEsMzIsMTAwLDExMSwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwNiwKLSAgICAxMTEsOTgsMzIsMTA1LDExNiwxMTUsMTAxLDEwOCwxMDIsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMTIyLDI1LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEyMywzMywKLSAgICAxMTQsMTI1LDMyLDQwLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDQxLDYyLDQxLAotICAgIDIsMTE0LDQ5LDAsMCwwLDExNCwxMTQsMCwwLDAsNDEsMiwxMTQsMTcyLDAsCi0gICAgMCwwLDExNCwxOTEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDYsMCwwLDAsMjE4LDExLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwKLSAgICAxMDEsMTEyLDExNCwyMzgsMywwLDAsMTE1LDIsMCwwLDAsMCw3LDEyMiwyOCwKLSAgICA5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0NiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5NSwxMTQsMTAxLDExMiwxMTQsOTksMiwwLDAsCi0gICAgMCwwLDAsMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsCi0gICAgMCwxMTUsNCwwLDAsMCwxMDAsMSwwLDgzLDQxLDIsNzgsODQsMTE0LDQsCi0gICAgMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE2MSwKLSAgICAwLDAsMCwyNDcsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNywKLSAgICA5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICA0NiwxMDUsMTE1LDk1LDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSw5OSwyLDAsMCwwLAotICAgIDAsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLAotICAgIDExNSw0LDAsMCwwLDEwMCwxLDAsODMsNDEsMiw3OCwxMTQsMzIsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDE4LDAsMCwwLDExNiwwLDEyNCwxLDEyNCwKKyAgICAyLDEyNCwzLDEzMSwzLDEyNCwwLDk1LDEsMTAwLDAsODMsMCw0MSwxLDc4LAorICAgIDQxLDIsMTE0LDIyNiwwLDAsMCwxMTQsMjI4LDAsMCwwLDQxLDQsMTE0LDEwMywKKyAgICAwLDAsMCwxMTQsMTAxLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMjMyLDAsCiAgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwKLSAgICAwLDExNCwyMDMsMCwwLDAsMjUwLDMsMCwwLDExNSwyLDAsMCwwLDAsCi0gICAgMSwxMjIsMjcsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsCi0gICAgMTAwLDEwMSwxMTQsNDYsMTAzLDEwMSwxMTYsOTUsMTE1LDExMSwxMTcsMTE0LDk5LDEwMSw5OSwyLAotICAgIDAsMCwwLDAsMCwwLDAsMiwwLDAsMCw2LDAsMCwwLDY3LAotICAgIDAsMCwwLDExNSwyMiwwLDAsMCwxMTYsMCwwLDEwMCwxLDAsMTAwLDIsCi0gICAgMCwxMDAsMywwLDEwMCw0LDAsMTAwLDUsMCwxMzEsMywxLDgzLDQxLDYsCi0gICAgNzgsMTE0LDMyLDAsMCwwLDEyMiw4LDYwLDExNSwxMTYsMTE0LDEwNSwxMTAsMTAzLDYyLAotICAgIDExNCwxOTAsMCwwLDAsMTE0LDIwNSwwLDAsMCw4NCw0MSwxLDExNCwyMDYsMCwKLSAgICAwLDAsNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE4OCwwLAotICAgIDAsMCwyNTMsMywwLDAsMTE1LDIsMCwwLDAsMCwxLDEyMiwyNSw5NSwKLSAgICA3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKLSAgICAxMDMsMTAxLDExNiw5NSw5OSwxMTEsMTAwLDEwMSw5OSwyLDAsMCwwLDAsMCwwLAotICAgIDAsMiwwLDAsMCwxLDAsMCwwLDY3LDAsMCwwLDExNSw0LDAsCi0gICAgMCwwLDEwMCwxLDAsODMsNDEsMiwxMjIsNDIsODUsMTE1LDEwMSwzMiwxMDAsMTAxLAotICAgIDEwMiw5NywxMTcsMTA4LDExNiwzMiwxMTUsMTAxLDEwOSw5NywxMTAsMTE2LDEwNSw5OSwxMTUsMzIsCi0gICAgMTAyLDExMSwxMTQsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsOTksMTE0LDEwMSw5NywxMTYsCi0gICAgMTA1LDExMSwxMTAsNDYsNzgsMTE0LDQsMCwwLDAsNDEsMiwxMTQsMTEwLDAsMCwKLSAgICAwLDExNCwxNjYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDYsMCwwLDAsMTE0LDE4NywwLDAsMCwwLDQsMCwwLDExNSwwLAotICAgIDAsMCwwLDEyMiwzMCw5NSw3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LAotICAgIDExMSw5NywxMDAsMTAxLDExNCw0Niw5OSwxMTQsMTAxLDk3LDExNiwxMDEsOTUsMTA5LDExMSwxMDAsCisgICAgMCwxMTQsMTgxLDAsMCwwLDIzNSwzLDAsMCwxMTUsMiwwLDAsMCwwLAorICAgIDEsMTIyLDI1LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LAorICAgIDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LDExNiw5NSw5NSw5OSwyLDAsMCwKKyAgICAwLDAsMCwwLDAsMiwwLDAsMCwyLDAsMCwwLDY3LDAsMCwKKyAgICAwLDExNSwxMiwwLDAsMCwxMDAsMSwxMDYsMCwxMjQsMSwxMDYsMSwxMzEsMSwKKyAgICA4MywwLDQxLDIsMTIyLDExNSw4MiwxMDEsMTE2LDExNywxMTQsMTEwLDMyLDExNCwxMDEsMTEyLAorICAgIDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwKKyAgICA0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwOSwKKyAgICAxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywKKyAgICAxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NCwxMDQsMTAxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAorICAgIDMyLDEwOSw5Nyw5OSwxMDQsMTA1LDExMCwxMDEsMTE0LDEyMSwzMiwxMDAsMTExLDEwMSwxMTUsMzIsCisgICAgMTE2LDEwNCwxMDEsMzIsMTA2LDExMSw5OCwzMiwxMDUsMTE2LDExNSwxMDEsMTA4LDEwMiw0NiwxMCwKKyAgICAxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMjIsMjUsNjAsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsMzIsMTIzLDMzLDExNCwxMjUsMzIsNDAsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsNDEsNjIsNDEsMiwxMTQsNTAsMCwwLDAsMTE0LDEwOCwwLDAsMCwKKyAgICA0MSwyLDExNCwxNjcsMCwwLDAsMTE0LDE4NiwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsMTA5LDExMSwxMDAsCisgICAgMTE3LDEwOCwxMDEsOTUsMTE0LDEwMSwxMTIsMTE0LDIzOCwzLDAsMCwxMTUsMiwwLDAsCisgICAgMCwwLDcsMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDk1LDExNCwxMDEsMTEyLAorICAgIDExNCw5OSwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwxLDAsCisgICAgMCwwLDY3LDAsMCwwLDExNSw0LDAsMCwwLDEwMCwxLDgzLDAsNDEsCisgICAgMiw3OCw4NCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDMsMCwwLDAsMTE0LAorICAgIDEyMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKKyAgICAwLDAsMCwxMTQsMTU2LDAsMCwwLDI0NywzLDAsMCwxMTUsMiwwLDAsCisgICAgMCwwLDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsCisgICAgMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTUsOTUsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLAorICAgIDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDEsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDEsODMsMCw0MSwyLAorICAgIDc4LDExNCwzMiwwLDAsMCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxMDMsMCwKKyAgICAwLDAsMTE0LDEyMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMTk4LDAsMCwwLDI1MCwzLDAsMCwxMTUsCisgICAgMiwwLDAsMCwwLDEsMTIyLDI3LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5NywKKyAgICA5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMywxMDEsMTE2LDk1LDExNSwxMTEsMTE3LAorICAgIDExNCw5OSwxMDEsOTksMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsCisgICAgNiwwLDAsMCw2NywwLDAsMCwxMTUsMTgsMCwwLDAsMTE2LDAsMTAwLAorICAgIDEsMTAwLDIsMTAwLDMsMTAwLDQsMTAwLDUsMTQ0LDEsMTMxLDMsODMsMCw0MSwKKyAgICA2LDc4LDExNCwzMiwwLDAsMCwxMjIsOCw2MCwxMTUsMTE2LDExNCwxMDUsMTEwLDEwMywKKyAgICA2MiwxMTQsMTg1LDAsMCwwLDExNCwyMDAsMCwwLDAsODQsNDEsMSwxMTQsMjAxLAorICAgIDAsMCwwLDQxLDIsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCwKKyAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxODMsCisgICAgMCwwLDAsMjUzLDMsMCwwLDExNSwyLDAsMCwwLDAsMSwxMjIsMjUsCisgICAgOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw3NiwxMTEsOTcsMTAwLDEwMSwxMTQsCisgICAgNDYsMTAzLDEwMSwxMTYsOTUsOTksMTExLDEwMCwxMDEsOTksMiwwLDAsMCwwLDAsCisgICAgMCwwLDIsMCwwLDAsMSwwLDAsMCw2NywwLDAsMCwxMTUsNCwKKyAgICAwLDAsMCwxMDAsMSw4MywwLDQxLDIsMTIyLDQyLDg1LDExNSwxMDEsMzIsMTAwLAorICAgIDEwMSwxMDIsOTcsMTE3LDEwOCwxMTYsMzIsMTE1LDEwMSwxMDksOTcsMTEwLDExNiwxMDUsOTksMTE1LAorICAgIDMyLDEwMiwxMTEsMTE0LDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDk5LDExNCwxMDEsOTcsCisgICAgMTE2LDEwNSwxMTEsMTEwLDQ2LDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwMywwLAorICAgIDAsMCwxMTQsMTYxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw2LDAsMCwwLDExNCwxODIsMCwwLDAsMCw0LDAsMCwxMTUsCisgICAgMCwwLDAsMCwxMjIsMzAsOTUsNzgsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICA3NiwxMTEsOTcsMTAwLDEwMSwxMTQsNDYsOTksMTE0LDEwMSw5NywxMTYsMTAxLDk1LDEwOSwxMTEsCisgICAgMTAwLDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwKKyAgICAwLDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDAsCisgICAgODMsMCw0MSwxLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDEwMywwLDAsCisgICAgMCwxMTQsMTg2LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw2LDAsMCwwLDExNCwxODcsMCwwLDAsMyw0LDAsMCwxMTUsMiwKKyAgICAwLDAsMCwwLDEsMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwKKyAgICAxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLAogICAgIDExNywxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLAotICAgIDEsMCwwLDAsNjcsMCwwLDAsMTE1LDQsMCwwLDAsMTAwLDAsMCwKLSAgICA4Myw0MSwxLDc4LDExNCw0LDAsMCwwLDQxLDIsMTE0LDExMCwwLDAsMCwKLSAgICAxMTQsMTkxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA2LDAsMCwwLDExNCwxOTIsMCwwLDAsMyw0LDAsMCwxMTUsMiwwLAotICAgIDAsMCwwLDEsMTIyLDI4LDk1LDc4LDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsCi0gICAgNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywKLSAgICAxMDgsMTAxLDk5LDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsCi0gICAgMCwwLDAsNjcsMCwwLDAsMTE1LDMyLDAsMCwwLDExNiwwLDAsMTAwLAotICAgIDEsMCwxMjQsMCwwLDEwNiwxLDAsMTMxLDIsMCwxLDExNiwyLDAsMTA2LAotICAgIDMsMCwxMjQsMCwwLDEyNCwxLDAsMTMxLDIsMCw4Myw0MSwyLDEyMiw5OCwKLSAgICA3NiwxMTEsOTcsMTAwLDMyLDk3LDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsCi0gICAgMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsCi0gICAgMTAxLDMyLDEwMSwxMjAsMTAxLDk5LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQwLDQxLDMyLAotICAgIDEwNSwxMTAsMTE1LDExNiwxMDEsOTcsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDEyMiwzOCwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwzMiwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTAwLDMyLDExOSwxMDUsMTE2LDEwNCwKLSAgICAzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMjMsMzMsMTE0LDEyNSw0MSw0LDExNCwxMDcsMCwwLAotICAgIDAsMTE0LDIzMywwLDAsMCwxMTQsMTIzLDAsMCwwLDExNCwxOTMsMCwwLDAsCi0gICAgNDEsMiwxMTQsMTEwLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDE5NCwwLDAsMCwKLSAgICA2LDQsMCwwLDExNSw0LDAsMCwwLDAsNywxNiwxLDEyMiwyOCw5NSwKLSAgICA3OCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDc2LDExMSw5NywxMDAsMTAxLDExNCw0NiwKLSAgICAxMDgsMTExLDk3LDEwMCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw3OCw0MSwxMiwxMTQsMTE0LAotICAgIDAsMCwwLDExNCwxMTMsMCwwLDAsMTE0LDExNSwwLDAsMCwxMTQsMTg2LDAsCi0gICAgMCwwLDExNCwxODQsMCwwLDAsMTE0LDI0OSwwLDAsMCwxMTQsMTYxLDAsMCwKLSAgICAwLDExNCwyMDMsMCwwLDAsMTE0LDE4OCwwLDAsMCwxMTQsMTg3LDAsMCwwLAotICAgIDExNCwxOTIsMCwwLDAsMTE0LDE5NCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMjQ4LAotICAgIDAsMCwwLDIzNCwzLDAsMCwxMTUsMTYsMCwwLDAsMTIsMSwxMiwzLAotICAgIDE4LDksMTIsMywxMiwzLDEyLDMsMTIsMywxMiwzLDExNCwyNDgsMCwwLAotICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsNSwwLAotICAgIDAsMCw2NCwwLDAsMCwxMTUsMTYwLDAsMCwwLDEwMSwwLDAsOTAsMSwKLSAgICAwLDEwMCwwLDAsOTAsMiwwLDEwMCwxLDAsOTAsMywwLDEwMSw0LDAsCi0gICAgMTAwLDIsMCwxMDAsMywwLDEzMiwwLDAsMTMxLDEsMCw5MCw1LDAsMTAxLAotICAgIDQsMCwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDYsCi0gICAgMCwxMDEsNCwwLDEwMCw2LDAsMTAwLDcsMCwxMzIsMCwwLDEzMSwxLDAsCi0gICAgOTAsNywwLDEwMSw0LDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDAsMTMxLAotICAgIDEsMCw5MCw4LDAsMTAxLDQsMCwxMDAsMTAsMCwxMDAsMTEsMCwxMDAsMTIsCi0gICAgMCwxMzIsMSwwLDEzMSwxLDAsOTAsOSwwLDEwMSw0LDAsMTAwLDEwLDAsCi0gICAgMTAwLDEwLDAsMTAwLDEzLDAsMTAwLDE0LDAsMTMyLDIsMCwxMzEsMSwwLDkwLAotICAgIDEwLDAsMTAxLDQsMCwxMDAsMTAsMCwxMDAsMTUsMCwxMDAsMTYsMCwxMzIsMSwKLSAgICAwLDEzMSwxLDAsOTAsMTEsMCwxMDAsMTAsMCw4Myw0MSwxNywyMTgsMTAsODAsCi0gICAgOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiw2Miw3NywxMDEsMTE2LDk3LDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDMyLDk3LDExMCwxMDAsMzIsMTEyLDk3LDk5LAotICAgIDEwNyw5NywxMDMsMTAxLDMyLDk1LDk1LDExMiw5NywxMTYsMTA0LDk1LDk1LDMyLDk3LDExNiwKLSAgICAxMTYsMTE0LDEwNSw5OCwxMTcsMTE2LDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDIsMCwwLDAsNCwwLDAsMCw2NywwLDAsMCwxMTUsNTUsCi0gICAgMCwwLDAsMTIwLDQ4LDAsMTE2LDAsMCwxMDYsMSwwLDEwNiwyLDAsMTMxLAotICAgIDAsMCw2OCw5MywzMSwwLDEyNSwxLDAsMTE2LDMsMCwxMjQsMSwwLDEwMCwKLSAgICAxLDAsMTMxLDIsMCwxMTQsMTYsMCwxMjQsMSwwLDEwNiw0LDAsMTMxLDAsCi0gICAgMCwxLDExMywxNiwwLDg3LDEwMCwyLDAsODMsNDEsMywxMjIsMTI1LDY3LDk3LAotICAgIDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LAotICAgIDEwMSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSw0MCw0MSwzMiwxMDksMTAxLDExNiwxMDQsMTExLAotICAgIDEwMCwzMiwxMTEsMTEwLDMyLDk3LDEwOCwxMDgsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTAxLDExMCwKLSAgICAxMTYsMTE0LDEyMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwxMTUsMTAsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMTE1LDExNiwxMTEsMTE0LDEwMSwxMDAsMzIsMTA1LDExMCwzMiwxMTUsMTIxLAotICAgIDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LAotICAgIDk5LDk3LDk5LDEwNCwxMDEsMTE1LDMyLDQwLDExOSwxMDQsMTAxLDExNCwxMDEsMzIsMTA1LDEwOSwKLSAgICAxMTIsMTA4LDEwMSwxMDksMTAxLDExMCwxMTYsMTAxLDEwMCw0MSw0NiwyMTgsMTcsMTA1LDExMCwxMTgsCi0gICAgOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSw3OCw0MSwKLSAgICA1LDExNCw4LDAsMCwwLDIxOCwxOSwxMTIsOTcsMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwKLSAgICAxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsMjE4LDYsMTE4LDk3LDEwOCwKLSAgICAxMTcsMTAxLDExNSwxMTQsMTE3LDAsMCwwLDExNCwyNTEsMCwwLDAsNDEsMiwxMTQsCi0gICAgMTcyLDAsMCwwLDIxOCw2LDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDExNCw0LDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyNTEsMCwwLDAsCi0gICAgMjMsNCwwLDAsMTE1LDYsMCwwLDAsMCw0LDIyLDEsMTUsMSwxMjIsCi0gICAgMjgsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwNSwxMTAsMTE4LDk3LAotICAgIDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsOTksMiwwLAotICAgIDAsMCwwLDAsMCwwLDMsMCwwLDAsMTIsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDEwNywwLDAsMCwxMTYsMCwwLDEwNiwxLDAsMTAwLDEsMCwKLSAgICAxMDcsOSwwLDExNCw0MSwwLDExNiwwLDAsMTA2LDEsMCwxMiwxMTQsNDEsMCwKLSAgICAxMTYsMiwwLDEwNiwzLDAsMTAwLDIsMCwxMTYsNCwwLDEzMSwyLDAsMSwKLSAgICAxMjAsNTksMCwxMTYsMCwwLDEwNiwxLDAsNjgsOTMsNDQsMCwxMjUsMiwwLAotICAgIDEyMSwxNCwwLDEyNCwyLDAsMTI0LDEsMCwxMzEsMSwwLDgzLDg3LDExMyw1MSwKLSAgICAwLDQsMTE2LDUsMCwxMDcsMTAsMCwxMTQsOTQsMCwxLDEsMSwxMTksNTEsCi0gICAgMCw4OSwxMTMsNTEsMCw4OCwxMTMsNTEsMCw4NywxMDAsMSwwLDgzLDEwMCwxLAotICAgIDAsODMsNDEsMywxMjIsMTEzLDgzLDEwMSw5NywxMTQsOTksMTA0LDMyLDExNSwxMDEsMTEzLAotICAgIDExNywxMDEsMTEwLDk5LDEwMSwzMiwxMTEsMTAyLDMyLDEwNCwxMTEsMTExLDEwNywxMTUsMzIsMTAyLAotICAgIDExMSwxMTQsMzIsOTcsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTAyLDExMSwxMTQsMzIsCi0gICAgMzksMTEyLDk3LDExNiwxMDQsMzksNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzMsMTAyLDMyLDM5LDEwNCwxMTEsMTExLDEwNywxMTUsMzksMzIsMTA1LDExNSwzMiwxMDIsCi0gICAgOTcsMTA4LDExNSwxMDEsMzIsMTE2LDEwNCwxMDEsMTEwLDMyLDExNywxMTUsMTAxLDMyLDExNSwxMjEsCi0gICAgMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzgsMTIyLDIzLDExNSwxMjEsMTE1LDQ2LDExMiw5NywKLSAgICAxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzIsMTA1LDExNSwzMiwxMDEsMTA5LDExMiwxMTYsCi0gICAgMTIxLDQxLDYsMTE0LDgsMCwwLDAsMjE4LDEwLDExMiw5NywxMTYsMTA0LDk1LDEwNCwKLSAgICAxMTEsMTExLDEwNywxMTUsMTE0LDYyLDAsMCwwLDExNCw2MywwLDAsMCwxMTQsMTI3LAotICAgIDAsMCwwLDExNCwxMDksMCwwLDAsNDEsMywxMTQsMTcyLDAsMCwwLDExNCwKLSAgICAzNywwLDAsMCw5MCw0LDEwNCwxMTEsMTExLDEwNywxMTQsNCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsCi0gICAgOTUsMTA0LDExMSwxMTEsMTA3LDExNSwzMSw0LDAsMCwxMTUsMTYsMCwwLDAsMCwKLSAgICA3LDI1LDEsMTYsMSwxNiwxLDMsMSwxNCwxLDEzLDEsMTIsMiwxMjIsCi0gICAgMjIsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExMiw5NywxMTYsCi0gICAgMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDMsMCwwLDAsMTksMCwwLDAsNjcsMCwwLDAsMTE1LDEyMywwLDAsCi0gICAgMCwxMjQsMSwwLDEwMCwxLDAsMTA3LDIsMCwxMTQsNTMsMCwxMjEsMTYsMCwKLSAgICAxMTYsMCwwLDEwNiwxLDAsMTMxLDAsMCwxMjUsMSwwLDg3LDExMCwyMiwwLAotICAgIDQsMTE2LDIsMCwxMDcsMTAsMCwxMTQsNTIsMCwxLDEsMSwxMDAsMiwwLAotICAgIDgzLDg5LDExMCwxLDAsODgsMTIxLDE3LDAsMTE2LDMsMCwxMDYsNCwwLDEyNCwKLSAgICAxLDAsMjUsMTI1LDIsMCw4NywxMTAsNDYsMCw0LDExNiw1LDAsMTA3LDEwLAotICAgIDAsMTE0LDExOCwwLDEsMSwxLDEyNCwwLDAsMTA2LDYsMCwxMjQsMSwwLAotICAgIDEzMSwxLDAsMTI1LDIsMCwxMjQsMiwwLDExNiwzLDAsMTA2LDQsMCwxMjQsCi0gICAgMSwwLDYwLDg5LDExMCwxLDAsODgsMTI0LDIsMCw4Myw0MSwzLDEyMiwyMTAsCi0gICAgNzEsMTAxLDExNiwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsMTAxLDExNCwzMiwxMDIsCi0gICAgMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsCi0gICAgMTIxLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwKLSAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDYsMTAsCi0gICAgMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzMsMTAyLDMyLDExNiwxMDQsMTAxLDMyLAotICAgIDExMiw5NywxMTYsMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsMzIsMTA1LDExNSwzMiwxMTAsMTExLAotICAgIDExNiwzMiwxMDUsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsNDQsMzIsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDk3LDExMiwxMTIsMTE0LDExMSwxMTIsMTE0LAotICAgIDEwNSw5NywxMTYsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDEwLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDk3LDExMCwxMDAsMzIsOTksOTcsOTksMTA0LDEwMSwzMiwxMDUsMTE2LAotICAgIDQ2LDMyLDczLDEwMiwzMiwxMTAsMTExLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwNSwKLSAgICAxMTUsMzIsOTcsMTE4LDk3LDEwNSwxMDgsOTcsOTgsMTA4LDEwMSw0NCwzMiwxMTUsMTE2LDExMSwKLSAgICAxMTQsMTAxLDMyLDc4LDExMSwxMTAsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDExNCwzMiwwLDAsMCw3OCw0MSw3LDExNCwzLDAsMCwwLDExNCwKLSAgICA0NywwLDAsMCwyMTgsMTcsNzAsMTA1LDEwOCwxMDEsNzgsMTExLDExNiw3MCwxMTEsMTE3LAotICAgIDExMCwxMDAsNjksMTE0LDExNCwxMTEsMTE0LDExNCw4LDAsMCwwLDExNCwyNTIsMCwwLAotICAgIDAsMTE0LDEzOSwwLDAsMCwxMTQsMCwxLDAsMCw0MSwzLDExNCwxNzIsMCwKLSAgICAwLDAsMTE0LDM3LDAsMCwwLDExNCwyNTQsMCwwLDAsMTE0LDQsMCwwLAotICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDIwLDk1LDExMiw5NywKLSAgICAxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LAotICAgIDEwMSw0OCw0LDAsMCwxMTUsMjIsMCwwLDAsMCw4LDEyLDEsMywxLAotICAgIDE2LDEsMTMsMyw5LDEsMywxLDE3LDEsMTMsMSwxNSwxLDE4LDEsCi0gICAgMTIyLDMxLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwKLSAgICAxMDEsOTksMywwLDAsMCwwLDAsMCwwLDYsMCwwLDAsMywwLAotICAgIDAsMCw2NywwLDAsMCwxMTUsMTE5LDAsMCwwLDExNiwwLDAsMTI0LDIsCi0gICAgMCwxMDAsMSwwLDEzMSwyLDAsMTE0LDM5LDAsMTI0LDIsMCwxMDYsMSwwLAotICAgIDEyNCwxLDAsMTMxLDEsMCw5MiwyLDAsMTI1LDMsMCwxMjUsNCwwLDExMCwKLSAgICAyMSwwLDEyNCwyLDAsMTA2LDIsMCwxMjQsMSwwLDEzMSwxLDAsMTI1LDMsCi0gICAgMCwxMDMsMCwwLDEyNSw0LDAsMTI0LDMsMCwxMDAsMCwwLDEwNyw5LDAsCi0gICAgMTE0LDg4LDAsMTE2LDMsMCwxMDYsNCwwLDEyNCwxLDAsMTI0LDMsMCwxMzEsCi0gICAgMiwwLDgzLDExNiwzLDAsMTA2LDUsMCwxMjQsMSwwLDEwMCwwLDAsMTMxLAotICAgIDIsMCwxMjUsNSwwLDEyNCw0LDAsMTI0LDUsMCw5NSw2LDAsMTI0LDUsCi0gICAgMCw4Myw0MSwyLDc4LDExNCwxMjYsMCwwLDAsNDEsNywxMTQsMTE3LDAsMCwKLSAgICAwLDExNCwxMjYsMCwwLDAsMTE0LDE4MywwLDAsMCwxMTQsMTIzLDAsMCwwLAotICAgIDExNCwxODAsMCwwLDAsMTE0LDE2MiwwLDAsMCwxMTQsMTU4LDAsMCwwLDQxLAotICAgIDYsMTE0LDE3MiwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwyNTQsMCwwLDAsCi0gICAgMTE0LDEyOSwwLDAsMCwxMTQsMTMwLDAsMCwwLDExNCwxNjYsMCwwLDAsMTE0LAotICAgIDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE2LAorICAgIDMsMCwwLDAsNjcsMCwwLDAsMTE1LDI2LDAsMCwwLDExNiwwLDEwNiwKKyAgICAxLDEwMCwxLDEyNCwwLDEwNiwyLDEzMSwyLDEsMCwxMTYsMCwxMDYsMywxMjQsCisgICAgMCwxMjQsMSwxMzEsMiw4MywwLDQxLDIsMTIyLDk4LDc2LDExMSw5NywxMDAsMzIsCisgICAgOTcsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMzIsMTA5LDExMSwxMDAsMTE3LAorICAgIDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsODQsMTA0LDEwNSwKKyAgICAxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTA1LDExNSwzMiwxMDAsMTAxLDExMiwxMTQsCisgICAgMTAxLDk5LDk3LDExNiwxMDEsMTAwLDQ2LDMyLDMyLDg1LDExNSwxMDEsMzIsMTAxLDEyMCwxMDEsCisgICAgOTksOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDAsNDEsMzIsMTA1LDExMCwxMTUsMTE2LDEwMSwKKyAgICA5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTIyLDM4LDExMCwKKyAgICA5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAorICAgIDEwOCwxMTEsOTcsMTAwLDEwMSwxMDAsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExMiw5NywxMTYsMTA0LAorICAgIDMyLDEyMywzMywxMTQsMTI1LDQxLDQsMTE0LDExNywwLDAsMCwxMTQsMTMyLDAsMCwKKyAgICAwLDExNCwyMjgsMCwwLDAsMTE0LDE4OCwwLDAsMCw0MSwyLDExNCwxMDMsMCwKKyAgICAwLDAsMTE0LDEyMiwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMTg5LDAsMCwwLDYsNCwwLDAsMTE1LAorICAgIDYsMCwwLDAsMCw3LDYsMSw4LDEsMTIyLDI4LDk1LDc4LDk3LDEwOSwKKyAgICAxMDEsMTE1LDExMiw5Nyw5OSwxMDEsNzYsMTExLDk3LDEwMCwxMDEsMTE0LDQ2LDEwOCwxMTEsOTcsCisgICAgMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDc4LDQxLDEyLDExNCwxMDgsMCwwLDAsCisgICAgMTE0LDEwNywwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxODEsMCwwLDAsMTE0LAorICAgIDE3OSwwLDAsMCwxMTQsMjQ2LDAsMCwwLDExNCwxNTYsMCwwLDAsMTE0LDE5OCwKKyAgICAwLDAsMCwxMTQsMTgzLDAsMCwwLDExNCwxODIsMCwwLDAsMTE0LDE4NywwLAorICAgIDAsMCwxMTQsMTg5LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKKyAgICAwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwyNDUsMCwwLDAsCisgICAgMjM0LDMsMCwwLDExNSwxNiwwLDAsMCw4LDEsOCwzLDEyLDksOCwKKyAgICAzLDgsMyw4LDMsOCwzLDgsMywxMTQsMjQ1LDAsMCwwLDk5LDAsCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDQsMCwwLDAsNjQsCisgICAgMCwwLDAsMTE1LDEwNiwwLDAsMCwxMDEsMCw5MCwxLDEwMCwwLDkwLDIsCisgICAgMTAwLDEsOTAsMywxMDEsNCwxMDAsMiwxMDAsMywxMzIsMCwxMzEsMSw5MCw1LAorICAgIDEwMSw0LDEwMCw0LDEwMCw1LDEzMiwwLDEzMSwxLDkwLDYsMTAxLDQsMTAwLDYsCisgICAgMTAwLDcsMTMyLDAsMTMxLDEsOTAsNywxMDEsNCwxMDAsOCwxMDAsOSwxMzIsMCwKKyAgICAxMzEsMSw5MCw4LDEwMSw0LDEwMCwxNywxMDAsMTEsMTAwLDEyLDEzMiwxLDEzMSwxLAorICAgIDkwLDksMTAxLDQsMTAwLDE4LDEwMCwxMywxMDAsMTQsMTMyLDEsMTMxLDEsOTAsMTAsCisgICAgMTAxLDQsMTAwLDE5LDEwMCwxNSwxMDAsMTYsMTMyLDEsMTMxLDEsOTAsMTEsMTAwLDEwLAorICAgIDgzLDAsNDEsMjAsMjE4LDEwLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwKKyAgICAxMjIsNjIsNzcsMTAxLDExNiw5NywzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDIsMTA1LDExMCwxMDAsCisgICAgMTAxLDExNCwzMiwxMDIsMTExLDExNCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCwzMiwKKyAgICA5NywxMTAsMTAwLDMyLDExMiw5Nyw5OSwxMDcsOTcsMTAzLDEwMSwzMiw5NSw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSw5NSwzMiw5NywxMTYsMTE2LDExNCwxMDUsOTgsMTE3LDExNiwxMDEsMTE1LDQ2LAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDQsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDQyLDAsMCwwLDEyMCwzNiwxMTYsMCwxMDYsMSwKKyAgICAxMDYsMiwxMzEsMCw2OCwwLDkzLDIyLDEyNSwxLDExNiwzLDEyNCwxLDEwMCwxLAorICAgIDEzMSwyLDExNCwxMiwxMjQsMSwxMDYsNCwxMzEsMCwxLDAsMTEzLDEyLDg3LDAsCisgICAgMTAwLDIsODMsMCw0MSwzLDEyMiwxMjUsNjcsOTcsMTA4LDEwOCwzMiwxMTYsMTA0LDEwMSwKKyAgICAzMiwxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsMTAxLDk1LDk5LDk3LDk5LDEwNCwKKyAgICAxMDEsMTE1LDQwLDQxLDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExMSwxMTAsMzIsOTcsCisgICAgMTA4LDEwOCwzMiwxMTIsOTcsMTE2LDEwNCwzMiwxMDEsMTEwLDExNiwxMTQsMTIxLDMyLDEwMiwxMDUsCisgICAgMTEwLDEwMCwxMDEsMTE0LDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTE2LAorICAgIDExMSwxMTQsMTAxLDEwMCwzMiwxMDUsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LAorICAgIDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSwxMTUsCisgICAgMzIsNDAsMTE5LDEwNCwxMDEsMTE0LDEwMSwzMiwxMDUsMTA5LDExMiwxMDgsMTAxLDEwOSwxMDEsMTEwLAorICAgIDExNiwxMDEsMTAwLDQxLDQ2LDIxOCwxNywxMDUsMTEwLDExOCw5NywxMDgsMTA1LDEwMCw5NywxMTYsCisgICAgMTAxLDk1LDk5LDk3LDk5LDEwNCwxMDEsMTE1LDc4LDQxLDUsMTE0LDgsMCwwLDAsCisgICAgMjE4LDE5LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsCisgICAgOTksOTcsOTksMTA0LDEwMSwyMTgsNiwxMTgsOTcsMTA4LDExNywxMDEsMTE1LDExNCwxMTEsMCwKKyAgICAwLDAsMTE0LDI0OCwwLDAsMCw0MSwyLDExNCwxNjcsMCwwLDAsMjE4LDYsCisgICAgMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCisgICAgMTE0LDYsMCwwLDAsMTE0LDI0OCwwLDAsMCwyNCw0LDAsMCwxMTUsNiwKKyAgICAwLDAsMCwwLDQsMTYsMSwxMCwxLDEyMiwyOCw4MCw5NywxMTYsMTA0LDcwLAorICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSwKKyAgICA5NSw5OSw5Nyw5OSwxMDQsMTAxLDExNSw5OSwyLDAsMCwwLDAsMCwwLDAsCisgICAgMywwLDAsMCwxMiwwLDAsMCw2NywwLDAsMCwxMTUsODYsMCwwLAorICAgIDAsMTE2LDAsMTA2LDEsMTAwLDEsMTA3LDksMTE0LDMwLDExNiwwLDEwNiwxLDEyLAorICAgIDAsMTE0LDMwLDExNiwyLDEwNiwzLDEwMCwyLDExNiw0LDEzMSwyLDEsMCwxMjAsCisgICAgNTAsMTE2LDAsMTA2LDEsNjgsMCw5MywzNiwxMjUsMiwxMjEsOCwxMjQsMiwxMjQsCisgICAgMSwxMzEsMSw4MywwLDQsMCwxMTYsNSwxMDcsMTAsMTE0LDcyLDEsMCwxLAorICAgIDAsMSwwLDExOSwzOCw4OSwwLDExMywzOCw4OCwwLDExMywzOCw4NywwLDEwMCwKKyAgICAxLDgzLDAsMTAwLDEsODMsMCw0MSwzLDEyMiw0Niw4MywxMDEsOTcsMTE0LDk5LAorICAgIDEwNCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LAorICAgIDMyLDEwMiwxMTEsMTE0LDMyLDk3LDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDQ2LDc4LDEyMiwyMywxMTUsMTIxLDExNSw0NiwKKyAgICAxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDMyLDEwNSwxMTUsMzIsMTAxLDEwOSwKKyAgICAxMTIsMTE2LDEyMSw0MSw2LDExNCw4LDAsMCwwLDIxOCwxMCwxMTIsOTcsMTE2LDEwNCwKKyAgICA5NSwxMDQsMTExLDExMSwxMDcsMTE1LDExNCw2MywwLDAsMCwxMTQsNjQsMCwwLDAsCisgICAgMTE0LDEyMSwwLDAsMCwxMTQsMTAyLDAsMCwwLDQxLDMsMTE0LDE2NywwLDAsCisgICAgMCwxMTQsMzcsMCwwLDAsOTAsNCwxMDQsMTExLDExMSwxMDcsMTE0LDQsMCwwLAorICAgIDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDExLDk1LDExMiw5NywKKyAgICAxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzIsNCwwLDAsMTE1LDE2LDAsMCwKKyAgICAwLDAsMywxOCwxLDEyLDEsMTIsMSwyLDEsOCwxLDE0LDEsMTIsCisgICAgMiwxMjIsMjIsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDExMiwKKyAgICA5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsOTksMiwwLDAsMCwwLDAsCisgICAgMCwwLDMsMCwwLDAsMTksMCwwLDAsNjcsMCwwLDAsMTE1LDEwMiwKKyAgICAwLDAsMCwxMjQsMSwxMDAsMSwxMDcsMiwxMTQsNDIsMTIxLDEyLDExNiwwLDEwNiwKKyAgICAxLDEzMSwwLDEyNSwxLDg3LDAsMTEwLDIwLDQsMCwxMTYsMiwxMDcsMTAsMTE0LAorICAgIDQwLDEsMCwxLDAsMSwwLDEwMCwyLDgzLDAsODgsMCwxMjEsMTQsMTE2LAorICAgIDMsMTA2LDQsMTI0LDEsMjUsMCwxMjUsMiw4NywwLDExMCw0MCw0LDAsMTE2LAorICAgIDUsMTA3LDEwLDExNCw5NiwxLDAsMSwwLDEsMCwxMjQsMCwxMDYsNiwxMjQsCisgICAgMSwxMzEsMSwxMjUsMiwxMjQsMiwxMTYsMywxMDYsNCwxMjQsMSw2MCwwLDg5LAorICAgIDAsMTEwLDIsODgsMCwxMjQsMiw4MywwLDQxLDMsMTIyLDIxMCw3MSwxMDEsMTE2LAorICAgIDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDMyLDEwMiwxMTEsMTE0LDMyLAorICAgIDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLDEwMSwxMTAsMTE2LDExNCwxMjEsMzIsMTAyLAorICAgIDExNCwxMTEsMTA5LDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMDksMTEyLAorICAgIDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSw0NiwxMCwxMCwzMiwzMiwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwKKyAgICAxMDQsMzIsMTAxLDExMCwxMTYsMTE0LDEyMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDEwNSwKKyAgICAxMTAsMzIsMTE2LDEwNCwxMDEsMzIsOTksOTcsOTksMTA0LDEwMSw0NCwzMiwxMDIsMTA1LDExMCwKKyAgICAxMDAsMzIsMTE2LDEwNCwxMDEsMzIsOTcsMTEyLDExMiwxMTQsMTExLDExMiwxMTQsMTA1LDk3LDExNiwKKyAgICAxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsOTcsMTEwLDEwMCwzMiw5OSw5Nyw5OSwxMDQsMTAxLDMyLDEwNSwxMTYsNDYsMzIsNzMsCisgICAgMTAyLDMyLDExMCwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTA1LDExNSwzMiw5NywKKyAgICAxMTgsOTcsMTA1LDEwOCw5Nyw5OCwxMDgsMTAxLDQ0LDMyLDExNSwxMTYsMTExLDExNCwxMDEsMzIsCisgICAgNzgsMTExLDExMCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LAorICAgIDMyLDAsMCwwLDc4LDQxLDcsMTE0LDMsMCwwLDAsMTE0LDQ3LDAsMCwKKyAgICAwLDIxOCwxNyw3MCwxMDUsMTA4LDEwMSw3OCwxMTEsMTE2LDcwLDExMSwxMTcsMTEwLDEwMCw2OSwKKyAgICAxMTQsMTE0LDExMSwxMTQsMTE0LDgsMCwwLDAsMTE0LDI0OSwwLDAsMCwxMTQsMTM0LAorICAgIDAsMCwwLDExNCwyNTMsMCwwLDAsNDEsMywxMTQsMTY3LDAsMCwwLDExNCwKKyAgICAzNywwLDAsMCwxMTQsMjUxLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LAorICAgIDAsMCwwLDExNCw2LDAsMCwwLDIxOCwyMCw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsNDUsNCwKKyAgICAwLDAsMTE1LDIyLDAsMCwwLDAsOCw4LDEsMiwxLDEyLDEsMTQsCisgICAgMyw2LDEsMiwxLDE0LDEsMTQsMSwxMCwxLDE2LDEsMTIyLDMxLDgwLAorICAgIDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMTIsOTcsMTE2LDEwNCw5NSwKKyAgICAxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTksMywKKyAgICAwLDAsMCwwLDAsMCwwLDYsMCwwLDAsMywwLDAsMCw2NywKKyAgICAwLDAsMCwxMTUsODIsMCwwLDAsMTE2LDAsMTI0LDIsMTAwLDEsMTMxLDIsCisgICAgMTE0LDI2LDEyNCwyLDEwNiwxLDEyNCwxLDEzMSwxLDkyLDIsMTI1LDMsMTI1LDQsCisgICAgMTEwLDE0LDEyNCwyLDEwNiwyLDEyNCwxLDEzMSwxLDEyNSwzLDEwMywwLDEyNSw0LAorICAgIDEyNCwzLDEwMCwwLDEwNyw5LDExNCw2MCwxMTYsMywxMDYsNCwxMjQsMSwxMjQsMywKKyAgICAxMzEsMiw4MywwLDExNiwzLDEwNiw1LDEyNCwxLDEwMCwwLDEzMSwyLDEyNSw1LAorICAgIDEyNCw0LDEyNCw1LDk1LDYsMTI0LDUsODMsMCw0MSwyLDc4LDExNCwxMjAsMCwKKyAgICAwLDAsNDEsNywxMTQsMTExLDAsMCwwLDExNCwxMjAsMCwwLDAsMTE0LDE3OCwKKyAgICAwLDAsMCwxMTQsMTE3LDAsMCwwLDExNCwxNzUsMCwwLDAsMTE0LDE1NywwLAorICAgIDAsMCwxMTQsMTUzLDAsMCwwLDQxLDYsMTE0LDE2NywwLDAsMCwxMTQsMTIyLAorICAgIDAsMCwwLDExNCwyNTEsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTI0LDAsCisgICAgMCwwLDExNCwxNjEsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLAorICAgIDAsMTE0LDYsMCwwLDAsMjE4LDE2LDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSw5NSwKKyAgICAxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw2Nyw0LDAsMCwxMTUsMTgsMCwwLAorICAgIDAsMCw0LDEwLDEsMTYsMiwxMCwxLDQsMSw4LDEsMTIsMSwxMiwKKyAgICAxLDYsMSwxMjIsMjcsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LAogICAgIDk1LDEwOCwxMDEsMTAzLDk3LDk5LDEyMSw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSwKLSAgICA3MCw0LDAsMCwxMTUsMTgsMCwwLDAsMCw0LDE1LDEsMjQsMiwxNSwKLSAgICAxLDYsMSwxMiwxLDE2LDEsMTgsMSw5LDEsMTIyLDI3LDgwLDk3LDExNiwKLSAgICAxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDgsMTAxLDEwMyw5Nyw5OSwxMjEsOTUsCi0gICAgMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksNzgsOTksNCwwLDAsMCwwLDAsCi0gICAgMCwwLDksMCwwLDAsNSwwLDAsMCw2NywwLDAsMCwxMTUsMjQzLAotICAgIDAsMCwwLDEwMywwLDAsMTI1LDQsMCwxMjAsMjMwLDAsMTI0LDIsMCw2OCwKLSAgICA5MywxOTEsMCwxMjUsNSwwLDExNiwwLDAsMTI0LDUsMCwxMTYsMSwwLDExNiwKLSAgICAyLDAsMTAyLDIsMCwxMzEsMiwwLDExNSw0MywwLDExMywxMywwLDEyNCwwLAotICAgIDAsMTA2LDMsMCwxMjQsNSwwLDEzMSwxLDAsMTI1LDYsMCwxMjQsNiwwLAotICAgIDEwMCwxLDAsMTA3LDksMCwxMTQsMTMsMCwxMTYsNCwwLDEyNCw2LDAsMTAwLAotICAgIDIsMCwxMzEsMiwwLDExNCwxMDYsMCwxMjQsNiwwLDEwNiw1LDAsMTI0LDEsCi0gICAgMCwxMjQsMywwLDEzMSwyLDAsMTI1LDcsMCwxMTAsMTgsMCwxMjQsMCwwLAotICAgIDEwNiw2LDAsMTI0LDEsMCwxMjQsNiwwLDEzMSwyLDAsMTI1LDcsMCwxMjQsCi0gICAgNywwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMTM5LDAsMTEzLDEzLDAsMTI0LDcsCi0gICAgMCwxMDYsNywwLDEwMCwxLDAsMTA3LDksMCwxMTQsMTU4LDAsMTI0LDcsMCwKLSAgICA4MywxMjQsNywwLDEwNiw4LDAsMTI1LDgsMCwxMjQsOCwwLDEwMCwxLDAsCi0gICAgMTA3LDgsMCwxMTQsMTkxLDAsMTE2LDksMCwxMDAsMywwLDEzMSwxLDAsMTMwLAotICAgIDEsMCwxMjQsNCwwLDEwNiwxMCwwLDEyNCw4LDAsMTMxLDEsMCwxLDExMywKLSAgICAxMywwLDg3LDExNiwxMSwwLDEwNiwxMiwwLDEyNCwxLDAsMTAwLDEsMCwxMzEsCi0gICAgMiwwLDEyNSw3LDAsMTI0LDQsMCwxMjQsNywwLDk1LDgsMCwxMjQsNywKLSAgICAwLDgzLDEwMCwxLDAsODMsNDEsNCwxMjIsNjMsNzAsMTA1LDExMCwxMDAsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTEsMTE0LDMyLDExMCw5NywxMDksCi0gICAgMTAxLDExNSwxMTIsOTcsOTksMTAxLDk1LDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMTEsMTE0LDMyLAotICAgIDExNiwxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NywxMTIsOTcsOTksMTA3LAotICAgIDk3LDEwMywxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsNzgsMTE0LDE4MiwwLDAsMCwxMjIsCi0gICAgMTksMTE1LDExMiwxMDEsOTksMzIsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDEwOCwxMTEsCi0gICAgOTcsMTAwLDEwMSwxMTQsNDEsMTMsMTE0LDE0NSwwLDAsMCwxMTQsNzEsMCwwLDAsCi0gICAgMjE4LDUsOTgsMTIxLDExNiwxMDEsMTE1LDExNCwyLDEsMCwwLDExNCwxMTcsMCwwLAotICAgIDAsMTE0LDE4MiwwLDAsMCwxMTQsMywxLDAsMCwxMTQsMTI5LDAsMCwwLAotICAgIDExNCwxNTgsMCwwLDAsMTE0LDEwOSwwLDAsMCwxMTQsMTUxLDAsMCwwLDExNCwKLSAgICAxMjMsMCwwLDAsMTE0LDE2MiwwLDAsMCw0MSw5LDExNCwxNzIsMCwwLDAsCi0gICAgMTE0LDEyOCwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE4MSwwLDAsMCwyMTgsCi0gICAgMTQsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsOTUsMTEyLDk3LDExNiwxMDQsOTAsCi0gICAgNSwxMDEsMTEwLDExNiwxMTQsMTIxLDExNCwyNTQsMCwwLDAsMTE0LDE2NiwwLDAsMCwKLSAgICAxMTQsMTMwLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA2LDAsMCwwLDIxOCw5LDk1LDEwMywxMDEsMTE2LDk1LDExNSwxMTIsMTAxLDk5LDg1LAotICAgIDQsMCwwLDExNSw0MCwwLDAsMCwwLDUsNiwxLDEzLDEsMjEsMSwKLSAgICAzLDEsMTUsMSwxMiwxLDE1LDEsMjEsMiwxOCwxLDEyLDEsMywxLAotICAgIDE1LDEsNCwxLDksMSwxMiwxLDEyLDUsMTcsMiwxOCwxLDksMSwKLSAgICAxMjIsMjAsODAsOTcsMTE2LDEwNCw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDEwMywxMDEsCi0gICAgMTE2LDk1LDExNSwxMTIsMTAxLDk5LDk5LDQsMCwwLDAsMCwwLDAsMCw2LAotICAgIDAsMCwwLDQsMCwwLDAsNjcsMCwwLDAsMTE1LDE0MCwwLDAsMCwKLSAgICAxMjQsMiwwLDEwMCwxLDAsMTA3LDgsMCwxMTQsMjEsMCwxMTYsMCwwLDEwNiwKLSAgICAxLDAsMTI1LDIsMCwxMjQsMCwwLDEwNiwyLDAsMTI0LDEsMCwxMjQsMiwKLSAgICAwLDEyNCwzLDAsMTMxLDMsMCwxMjUsNCwwLDEyNCw0LDAsMTAwLDEsMCwKLSAgICAxMDcsOCwwLDExNCw1OCwwLDEwMCwxLDAsODMsMTI0LDQsMCwxMDYsMywwLAotICAgIDEwMCwxLDAsMTA3LDgsMCwxMTQsMTMyLDAsMTI0LDQsMCwxMDYsNCwwLDEyNSwKLSAgICA1LDAsMTI0LDUsMCwxMTQsMTI1LDAsMTAwLDIsMCwxMjQsNCwwLDk1LDUsCi0gICAgMCwxMTYsNiwwLDEyNCwxLDAsMTI0LDUsMCwxMjQsMCwwLDEwNiwyLDAsCi0gICAgMTMxLDMsMCwxMjQsNCwwLDk1LDQsMCwxMjQsNCwwLDgzLDEwMCwxLDAsCi0gICAgODMsMTEwLDQsMCwxMjQsNCwwLDgzLDEwMCwxLDAsODMsNDEsMywxMjIsOTgsCi0gICAgMTAyLDEwNSwxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLAotICAgIDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsMzIsMTExLDExNCwzMiwzOSwKLSAgICAxMTIsOTcsMTE2LDEwNCwzOSwzMiw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNSwKLSAgICAxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMTUsMzIsOTcsMTEwLAotICAgIDEwMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsCi0gICAgMTE2LDEwNCw5NSwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwxMDEsMTE0LDk1LDk5LDk3LDk5LDEwNCwKLSAgICAxMDEsNDYsNzgsOTAsOSwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw0MSw3LAotICAgIDExNCw4LDAsMCwwLDExNCwzNywwLDAsMCwxMTQsNiwxLDAsMCwxMTQsCi0gICAgMTI5LDAsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDE2MCwwLDAsMCwxMTQsMjMxLAotICAgIDAsMCwwLDQxLDYsMTE0LDE3MiwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwKLSAgICAzNywwLDAsMCwxMTQsMTgxLDAsMCwwLDExNCwxNjYsMCwwLDAsMTE0LDUsCi0gICAgMSwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMTE0LDE4MiwwLDAsMCwxMTcsNCwwLDAsMTE1LDI2LDAsMCwwLAotICAgIDAsNCwxMiwxLDksMSwyMSwxLDEyLDEsNCwxLDE1LDEsOSwxLAotICAgIDYsMyw5LDEsMjQsMSw0LDIsNywyLDEyMiwyMCw4MCw5NywxMTYsMTA0LAotICAgIDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDExNSwxMTIsMTAxLDk5LAotICAgIDk5LDMsMCwwLDAsMCwwLDAsMCw0LDAsMCwwLDMsMCwwLAotICAgIDAsNjcsMCwwLDAsMTE1LDQxLDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwKLSAgICAxMjQsMSwwLDEyNCwyLDAsMTMxLDIsMCwxMjUsMywwLDEyNCwzLDAsMTAwLAotICAgIDEsMCwxMDcsOCwwLDExNCwzNCwwLDEwMCwxLDAsODMsMTI0LDMsMCwxMDYsCi0gICAgMSwwLDgzLDQxLDIsMTIyLDE3MCwxMDIsMTA1LDExMCwxMDAsMzIsMTE2LDEwNCwxMDEsMzIsCi0gICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMzIsMTExLDExMCwzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsCi0gICAgMTE2LDEwNCwzMiwxMTEsMTE0LDMyLDM5LDExMiw5NywxMTYsMTA0LDM5LDMyLDk4LDk3LDExNSwKLSAgICAxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LAotICAgIDExMSwxMTEsMTA3LDExNSwzMiw5NywxMTAsMTAwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LAotICAgIDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiw4NCwxMDQsMTA1LDExNSwzMiwxMDksMTAxLDExNiwxMDQsMTExLDEwMCwzMiwxMDUsCi0gICAgMTE1LDMyLDEwMCwxMDEsMTEyLDExNCwxMDEsOTksOTcsMTE2LDEwMSwxMDAsNDYsMzIsMzIsODUsCi0gICAgMTE1LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksNDAsNDEsMzIsMTA1LAotICAgIDExMCwxMTUsMTE2LDEwMSw5NywxMDAsNDYsMTAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsCi0gICAgMzIsNzgsNDEsMiwxMTQsMTgyLDAsMCwwLDExNCwxMjksMCwwLDAsNDEsNCwKLSAgICAxMTQsMTcyLDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwKLSAgICAxNjYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMTE0LDE4MywwLDAsMCwxMzksNCwwLDAsMTE1LDgsMCwwLAotICAgIDAsMCw4LDE4LDEsMTIsMSw0LDEsMTIyLDIyLDgwLDk3LDExNiwxMDQsNzAsCi0gICAgMTA1LDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwKLSAgICAxMDEsNDEsMTIsMTE0LDExNCwwLDAsMCwxMTQsMTEzLDAsMCwwLDExNCwxMTUsMCwKLSAgICAwLDAsMTE0LDExNiwwLDAsMCwxMTQsMTg0LDAsMCwwLDExNCwyNTEsMCwwLAotICAgIDAsMTE0LDAsMSwwLDAsMTE0LDIsMSwwLDAsMTE0LDMsMSwwLDAsCi0gICAgMTE0LDYsMSwwLDAsMTE0LDE4MiwwLDAsMCwxMTQsMTgzLDAsMCwwLDExNCwKLSAgICA0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LAotICAgIDAsMCwwLDExNCwyNTAsMCwwLDAsMTksNCwwLDAsMTE1LDIyLDAsMCwKLSAgICAwLDEyLDIsNiwyLDE4LDgsMTgsMTcsMTgsMjIsMTgsMTUsMywxLDE4LAotICAgIDMxLDMsMSwyMSwyMSwzLDEsMTE0LDI1MCwwLDAsMCw5OSwwLDAsMCwKLSAgICAwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDY0LDAsMCwKLSAgICAwLDExNSwxMzMsMCwwLDAsMTAxLDAsMCw5MCwxLDAsMTAwLDAsMCw5MCwKLSAgICAyLDAsMTAwLDEsMCw5MCwzLDAsMTAwLDIsMCwxMDAsMywwLDEzMiwwLAotICAgIDAsOTAsNCwwLDEwMCw0LDAsMTAwLDUsMCwxMzIsMCwwLDkwLDUsMCwKLSAgICAxMDEsNiwwLDkwLDcsMCwxMDAsNiwwLDEwMCw3LDAsMTMyLDAsMCw5MCwKLSAgICA4LDAsMTAwLDgsMCwxMDAsOSwwLDEzMiwwLDAsOTAsOSwwLDEwMCwxMCwKLSAgICAwLDEwMCwxMSwwLDEwMCwxMiwwLDEzMiwxLDAsOTAsMTAsMCwxMDAsMTMsMCwKLSAgICAxMDAsMTQsMCwxMzIsMCwwLDkwLDExLDAsMTAxLDEyLDAsMTAwLDE1LDAsMTAwLAotICAgIDE2LDAsMTMyLDAsMCwxMzEsMSwwLDkwLDEzLDAsMTAwLDE3LDAsMTAwLDE4LAotICAgIDAsMTMyLDAsMCw5MCwxNCwwLDEwMCwxMCwwLDgzLDQxLDE5LDIxOCwxMCw3MCwKLSAgICAxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDEyMiwxNzIsNzAsMTA1LDEwOCwxMDEsNDUsCi0gICAgOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAsMTAsMzIsCi0gICAgMzIsMzIsMzIsNzMsMTEwLDExNiwxMDEsMTE0LDk3LDk5LDExNiwxMDUsMTExLDExMCwxMTUsMzIsCi0gICAgMTE5LDEwNSwxMTYsMTA0LDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LDEwMSwzMiwxMTUsMTIxLAotICAgIDExNSwxMTYsMTAxLDEwOSwzMiw5NywxMTQsMTAxLDMyLDk5LDk3LDk5LDEwNCwxMDEsMTAwLDMyLAotICAgIDEwMiwxMTEsMTE0LDMyLDExMiwxMDEsMTE0LDEwMiwxMTEsMTE0LDEwOSw5NywxMTAsOTksMTAxLDQ0LAotICAgIDMyLDk4LDEwMSwxMDUsMTEwLDEwMywxMCwzMiwzMiwzMiwzMiwxMTQsMTAxLDEwMiwxMTQsMTAxLAotICAgIDExNSwxMDQsMTAxLDEwMCwzMiwxMTksMTA0LDEwMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwKLSAgICAxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDExMCwxMDAsCi0gICAgMTAxLDExNCwzMiwxMDUsMTE1LDMyLDEwNCw5NywxMTAsMTAwLDEwOCwxMDUsMTEwLDEwMywzMiwxMDQsCi0gICAgOTcsMTE1LDMyLDk4LDEwMSwxMDEsMTEwLDMyLDEwOSwxMTEsMTAwLDEwNSwxMDIsMTA1LDEwMSwxMDAsCi0gICAgNDYsMTAsMTAsMzIsMzIsMzIsMzIsOTksMiwwLDAsMCwwLDAsMCwwLAotICAgIDUsMCwwLDAsNSwwLDAsMCw3LDAsMCwwLDExNSwxMjIsMCwwLAotICAgIDAsMTAzLDAsMCwxMjUsMywwLDEyMCw1MiwwLDEyNCwyLDAsNjgsOTMsNDQsCi0gICAgMCw5MiwyLDAsMTM3LDAsMCwxMjUsNCwwLDEyNCwzLDAsMTA2LDAsMCwKLSAgICAxMzUsMCwwLDEwMiwxLDAsMTAwLDEsMCwxMDAsMiwwLDEzNCwwLDAsMTI0LAotICAgIDQsMCw2OCwxMzEsMSwwLDEzMSwxLDAsMSwxMTMsMTMsMCw4NywxMjQsMywKLSAgICAwLDEyNCwwLDAsOTUsMSwwLDEyNCwxLDAsMTEyLDc5LDAsMTAwLDMsMCwKLSAgICAxMjQsMCwwLDk1LDIsMCwxMDAsNiwwLDEyNCwwLDAsOTUsMywwLDExNiwKLSAgICA0LDAsMTMxLDAsMCwxMjQsMCwwLDk1LDUsMCwxMTYsNCwwLDEzMSwwLAotICAgIDAsMTI0LDAsMCw5NSw2LDAsMTAwLDUsMCw4Myw0MSw3LDEyMiwxNTQsNzMsCi0gICAgMTEwLDEwNSwxMTYsMTA1LDk3LDEwOCwxMDUsMTIyLDEwMSwzMiwxMTksMTA1LDExNiwxMDQsMzIsMTE2LAotICAgIDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsMTE2LDExMSwzMiwxMTUsMTAxLDk3LDExNCw5OSwKLSAgICAxMDQsMzIsMTExLDExMCwzMiw5NywxMTAsMTAwLDMyLDk3LDMyLDExOCw5NywxMTQsMTA1LDk3LAotICAgIDk4LDEwOCwxMDEsMzIsMTEwLDExNywxMDksOTgsMTAxLDExNCwzMiwxMTEsMTAyLDEwLDMyLDMyLAotICAgIDMyLDMyLDMyLDMyLDMyLDMyLDUwLDQ1LDExNiwxMTcsMTEyLDEwOCwxMDEsMTE1LDMyLDk5LAotICAgIDExMSwxMTAsMTE2LDk3LDEwNSwxMTAsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTA4LDExMSwKLSAgICA5NywxMDAsMTAxLDExNCwzMiw5NywxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDEwMiwxMDUsMTA4LAotICAgIDEwMSwzMiwxMTUsMTE3LDEwMiwxMDIsMTA1LDEyMCwxMDEsMTE1LDMyLDExNiwxMDQsMTAxLDMyLDEwOCwKLSAgICAxMTEsOTcsMTAwLDEwMSwxMTQsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LDEwMSwKLSAgICA5OSwxMTEsMTAzLDExMCwxMDUsMTIyLDEwMSwxMTUsNDYsOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDIsMCwwLDAsMywwLDAsMCw1MSwwLDAsMCwxMTUsMjcsCi0gICAgMCwwLDAsMTI0LDAsMCw5MywxNywwLDEyNSwxLDAsMTI0LDEsMCwxMzYsCi0gICAgMCwwLDEwMiwyLDAsODYsMSwxMTMsMywwLDEwMCwwLDAsODMsNDEsMSwKLSAgICA3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwyNCwwLDAsMCwxMTQsMjI2LDAsCi0gICAgMCwwLDQxLDEsMTE0LDEyOSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKLSAgICAwLDAsMCwxMTQsMjI4LDAsMCwwLDE2OCw0LDAsMCwxMTUsMiwwLDAsCi0gICAgMCw2LDAsMTIyLDM4LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsCi0gICAgOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksOTcsMTA4LDExNSwKLSAgICA2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTE0LDYwLDAsMCwwLAotICAgIDExNCwzMSwwLDAsMCw3OCwxMTQsODksMCwwLDAsNDEsNywxMTQsMTUxLDAsCi0gICAgMCwwLDIxOCw4LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCwzNywwLDAsCi0gICAgMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsMTA5LDEwMSwyMTgsMywKLSAgICAxMTUsMTAxLDExNiwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsOTksMTA0LDEwMSwKLSAgICAyMTgsMTksOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDEwMSwxMDAsOTUsMTEyLDk3LDExNiwxMDQsOTUsCi0gICAgOTksOTcsOTksMTA0LDEwMSw0MSw1LDExNCwxMTAsMCwwLDAsMTE0LDM3LDAsMCwKLSAgICAwLDIxOCwxNCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDEwMCwxMDEsMTE2LDk3LDEwNSwxMDgsCi0gICAgMTE1LDkwLDcsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDE2OCwwLDAsMCwxMTQsCi0gICAgNCwwLDAsMCw0MSwxLDExNCwxMjksMCwwLDAsMTE0LDYsMCwwLDAsCi0gICAgMTE0LDE4NiwwLDAsMCwxNjIsNCwwLDAsMTE1LDE2LDAsMCwwLDAsNCwKLSAgICA2LDEsMTksMSwzNiwxLDksMiwxNSwxLDksMSwxMiwxLDEyMiwxOSwKLSAgICA3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDEwNSwxMTAsMTA1LAotICAgIDExNiw5NSw5NSw5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKLSAgICAyLDAsMCwwLDY3LDAsMCwwLDExNSwxMywwLDAsMCwxMDAsMywwLAotICAgIDEyNCwwLDAsOTUsMCwwLDEwMCwyLDAsODMsNDEsNCwxMjIsMzEsNzMsMTEwLAorICAgIDc4LDk5LDQsMCwwLDAsMCwwLDAsMCw5LDAsMCwwLDUsMCwKKyAgICAwLDAsNjcsMCwwLDAsMTE1LDE3MCwwLDAsMCwxMDMsMCwxMjUsNCwxMjAsCisgICAgMTYwLDEyNCwyLDY4LDAsOTMsMTMwLDEyNSw1LDExNiwwLDEyNCw1LDExNiwxLDExNiwKKyAgICAyLDEwMiwyLDEzMSwyLDExNSwzMCwxMTMsMTAsMTI0LDAsMTA2LDMsMTI0LDUsMTMxLAorICAgIDEsMTI1LDYsMTI0LDYsMTAwLDEsMTA3LDksMTE0LDEwLDExNiw0LDEyNCw2LDEwMCwKKyAgICAyLDEzMSwyLDExNCw3MiwxMjQsNiwxMDYsNSwxMjQsMSwxMjQsMywxMzEsMiwxMjUsCisgICAgNywxMTAsMTIsMTI0LDAsMTA2LDYsMTI0LDEsMTI0LDYsMTMxLDIsMTI1LDcsMTI0LAorICAgIDcsMTAwLDEsMTA3LDgsMTE0LDk0LDExMywxMCwxMjQsNywxMDYsNywxMDAsMSwxMDcsCisgICAgOSwxMTQsMTA4LDEyNCw3LDgzLDAsMTI0LDcsMTA2LDgsMTI1LDgsMTI0LDgsMTAwLAorICAgIDEsMTA3LDgsMTE0LDEzMCwxMTYsOSwxMDAsMywxMzEsMSwxMzAsMSwxMjQsNCwxMDYsCisgICAgMTAsMTI0LDgsMTMxLDEsMSwwLDExMywxMCw4NywwLDExNiwxMSwxMDYsMTIsMTI0LAorICAgIDEsMTAwLDEsMTMxLDIsMTI1LDcsMTI0LDQsMTI0LDcsOTUsOCwxMjQsNyw4MywKKyAgICAwLDEwMCwxLDgzLDAsNDEsNCwxMjIsNjMsNzAsMTA1LDExMCwxMDAsMzIsMTE2LDEwNCwKKyAgICAxMDEsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwxMTEsMTE0LDMyLDExMCw5NywxMDksMTAxLAorICAgIDExNSwxMTIsOTcsOTksMTAxLDk1LDExMiw5NywxMTYsMTA0LDMyLDEwMiwxMTEsMTE0LDMyLDExNiwKKyAgICAxMDQsMTA1LDExNSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NywxMTIsOTcsOTksMTA3LDk3LAorICAgIDEwMywxMDEsMzIsMTEwLDk3LDEwOSwxMDEsNDYsNzgsMTE0LDE3NywwLDAsMCwxMjIsMTksCisgICAgMTE1LDExMiwxMDEsOTksMzIsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTAsMTAzLDMyLDEwOCwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsNDEsMTMsMTE0LDE0MCwwLDAsMCwxMTQsNzIsMCwwLDAsMjE4LAorICAgIDUsOTgsMTIxLDExNiwxMDEsMTE1LDExNCwyNTUsMCwwLDAsMTE0LDExMSwwLDAsMCwKKyAgICAxMTQsMTc3LDAsMCwwLDExNCwwLDEsMCwwLDExNCwxMjMsMCwwLDAsMTE0LAorICAgIDE1MywwLDAsMCwxMTQsMTAyLDAsMCwwLDExNCwxNDYsMCwwLDAsMTE0LDExNywKKyAgICAwLDAsMCwxMTQsMTU3LDAsMCwwLDQxLDksMTE0LDE2NywwLDAsMCwxMTQsCisgICAgMTIyLDAsMCwwLDExNCwzNywwLDAsMCwxMTQsMTc2LDAsMCwwLDIxOCwxNCwKKyAgICAxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCw5MCw1LAorICAgIDEwMSwxMTAsMTE2LDExNCwxMjEsMTE0LDI1MSwwLDAsMCwxMTQsMTYxLDAsMCwwLDExNCwKKyAgICAxMjQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCisgICAgMCwwLDAsMjE4LDksOTUsMTAzLDEwMSwxMTYsOTUsMTE1LDExMiwxMDEsOTksODIsNCwKKyAgICAwLDAsMTE1LDQwLDAsMCwwLDAsNSw0LDEsMTAsMSwxNCwxLDIsCisgICAgMSwxMCwxLDgsMSwxMCwxLDE0LDIsMTIsMSw4LDEsMiwxLDEwLAorICAgIDEsNCwxLDYsMSw4LDEsOCw1LDE0LDIsMTIsMSw2LDEsMTIyLAorICAgIDIwLDgwLDk3LDExNiwxMDQsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDMsMTAxLDExNiwKKyAgICA5NSwxMTUsMTEyLDEwMSw5OSw5OSw0LDAsMCwwLDAsMCwwLDAsNiwwLAorICAgIDAsMCw0LDAsMCwwLDY3LDAsMCwwLDExNSwxMDQsMCwwLDAsMTI0LAorICAgIDIsMTAwLDEsMTA3LDgsMTE0LDE0LDExNiwwLDEwNiwxLDEyNSwyLDEyNCwwLDEwNiwKKyAgICAyLDEyNCwxLDEyNCwyLDEyNCwzLDEzMSwzLDEyNSw0LDEyNCw0LDEwMCwxLDEwNywKKyAgICA4LDExNCw0MiwxMDAsMSw4MywwLDExMCw1OCwxMjQsNCwxMDYsMywxMDAsMSwxMDcsCisgICAgOCwxMTQsOTYsMTI0LDQsMTA2LDQsMTI1LDUsMTI0LDUsMTE0LDkwLDEwMCwyLDEyNCwKKyAgICA0LDk1LDUsMTE2LDYsMTI0LDEsMTI0LDUsMTI0LDAsMTA2LDIsMTMxLDMsMTI0LAorICAgIDQsOTUsNCwxMjQsNCw4MywwLDExMywxMDAsMTAwLDEsODMsMCwxMTAsNCwxMjQsCisgICAgNCw4MywwLDEwMCwxLDgzLDAsNDEsMywxMjIsMTQxLDg0LDExNCwxMjEsMzIsMTE2LAorICAgIDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTE1LDExMiwxMDEsOTksMzIsMTAyLDExMSwKKyAgICAxMTQsMzIsMzksMTAyLDExNywxMDgsMTA4LDExMCw5NywxMDksMTAxLDM5LDMyLDExMSwxMTAsMzIsCisgICAgMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsMzIsMTExLDExNCwzMiwzOSwxMTIsOTcsMTE2LAorICAgIDEwNCwzOSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw4NCwxMDQsMTAxLAorICAgIDMyLDExNSwxMDEsOTcsMTE0LDk5LDEwNCwzMiwxMDUsMTE1LDMyLDk4LDk3LDExNSwxMDEsMTAwLAorICAgIDMyLDExMSwxMTAsMzIsMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsCisgICAgMTA3LDExNSwzMiw5NywxMTAsMTAwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDk1LAorICAgIDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsOTUsOTksOTcsOTksMTA0LDEwMSw0NiwxMCwKKyAgICAzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw5MCw5LDExMCw5NywxMDksMTAxLDExNSwKKyAgICAxMTIsOTcsOTksMTAxLDQxLDcsMTE0LDgsMCwwLDAsMTE0LDM3LDAsMCwwLAorICAgIDExNCwzLDEsMCwwLDExNCwxMjMsMCwwLDAsMTE0LDE1MywwLDAsMCwxMTQsCisgICAgMTU1LDAsMCwwLDExNCwyMjYsMCwwLDAsNDEsNiwxMTQsMTY3LDAsMCwwLAorICAgIDExNCwxMjIsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwxNzYsMCwwLDAsMTE0LAorICAgIDE2MSwwLDAsMCwxMTQsMiwxLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwKKyAgICAwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTc3LDAsMCwwLDExNCw0LDAsCisgICAgMCwxMTUsMjYsMCwwLDAsMCw2LDgsMSw2LDEsMTQsMSw4LDEsCisgICAgNiwxLDEwLDEsNiwxLDQsMyw2LDEsMTYsMSw2LDIsNiwyLAorICAgIDEyMiwyMCw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTAyLDEwNSwxMTAsCisgICAgMTAwLDk1LDExNSwxMTIsMTAxLDk5LDk5LDMsMCwwLDAsMCwwLDAsMCw0LAorICAgIDAsMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDMwLDAsMCwwLAorICAgIDEyNCwwLDEwNiwwLDEyNCwxLDEyNCwyLDEzMSwyLDEyNSwzLDEyNCwzLDEwMCwxLAorICAgIDEwNyw4LDExNCwyNCwxMDAsMSw4MywwLDEyNCwzLDEwNiwxLDgzLDAsNDEsMiwKKyAgICAxMjIsMTcwLDEwMiwxMDUsMTEwLDEwMCwzMiwxMTYsMTA0LDEwMSwzMiwxMDksMTExLDEwMCwxMTcsMTA4LAorICAgIDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LDQ2LDExMiw5NywxMTYsMTA0LDMyLDExMSwxMTQsCisgICAgMzIsMzksMTEyLDk3LDExNiwxMDQsMzksMzIsOTgsOTcsMTE1LDEwMSwxMDAsMzIsMTExLDExMCwKKyAgICAzMiwxMTUsMTIxLDExNSw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTE1LDMyLAorICAgIDk3LDExMCwxMDAsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE1LDEyMSwxMTUsNDYsCisgICAgMTEyLDk3LDExNiwxMDQsOTUsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCw5NSw5OSw5NywKKyAgICA5OSwxMDQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDMyLDg0LDEwNCwKKyAgICAxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsMzIsMTAwLDEwMSwxMTIsCisgICAgMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsMTAxLDMyLDEwMiwxMDUsCisgICAgMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLDExNSwxMTYsMTAxLDk3LAorICAgIDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw3OCw0MSwyLDExNCwKKyAgICAxNzcsMCwwLDAsMTE0LDEyMywwLDAsMCw0MSw0LDExNCwxNjcsMCwwLDAsCisgICAgMTE0LDEyMiwwLDAsMCwxMTQsMzcsMCwwLDAsMTE0LDE2MSwwLDAsMCwxMTQsCisgICAgNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTc4LAorICAgIDAsMCwwLDEzOCw0LDAsMCwxMTUsOCwwLDAsMCwwLDgsMTIsMSwKKyAgICA4LDEsNCwxLDEyMiwyMiw4MCw5NywxMTYsMTA0LDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsCisgICAgNDYsMTAyLDEwNSwxMTAsMTAwLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQxLDEsNzgsNDEsCisgICAgMiw3OCw3OCw0MSwxLDc4LDQxLDEyLDExNCwxMDgsMCwwLDAsMTE0LDEwNywwLAorICAgIDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxMTAsMCwwLDAsMTE0LDE3OSwwLDAsCisgICAgMCwxMTQsMjQ4LDAsMCwwLDExNCwyNTMsMCwwLDAsMTE0LDI1NSwwLDAsMCwKKyAgICAxMTQsMCwxLDAsMCwxMTQsMywxLDAsMCwxMTQsMTc3LDAsMCwwLDExNCwKKyAgICAxNzgsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDI0NywwLDAsMCwyMCw0LDAsCisgICAgMCwxMTUsMjIsMCwwLDAsOCwyLDQsMiwxMiw4LDEyLDEzLDEyLDIyLAorICAgIDEyLDE1LDIsMSwxMiwzMSwyLDEsMTIsMjMsMiwxLDExNCwyNDcsMCwwLAorICAgIDAsOTksMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLAorICAgIDAsMCw2NCwwLDAsMCwxMTUsOTAsMCwwLDAsMTAxLDAsOTAsMSwxMDAsCisgICAgMCw5MCwyLDEwMCwxLDkwLDMsMTAwLDIsMTAwLDMsMTMyLDAsOTAsNCwxMDAsCisgICAgNCwxMDAsNSwxMzIsMCw5MCw1LDEwMSw2LDkwLDcsMTAwLDYsMTAwLDcsMTMyLAorICAgIDAsOTAsOCwxMDAsOCwxMDAsOSwxMzIsMCw5MCw5LDEwMCwxOSwxMDAsMTEsMTAwLAorICAgIDEyLDEzMiwxLDkwLDEwLDEwMCwxMywxMDAsMTQsMTMyLDAsOTAsMTEsMTAxLDEyLDEwMCwKKyAgICAxNSwxMDAsMTYsMTMyLDAsMTMxLDEsOTAsMTMsMTAwLDE3LDEwMCwxOCwxMzIsMCw5MCwKKyAgICAxNCwxMDAsMTAsODMsMCw0MSwyMCwyMTgsMTAsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwKKyAgICAxMDAsMTAxLDExNCwxMjIsMTcyLDcwLDEwNSwxMDgsMTAxLDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLAorICAgIDEwMiwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDczLDExMCwxMTYsCisgICAgMTAxLDExNCw5Nyw5OSwxMTYsMTA1LDExMSwxMTAsMTE1LDMyLDExOSwxMDUsMTE2LDEwNCwzMiwxMTYsCisgICAgMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDEyMSwxMTUsMTE2LDEwMSwxMDksMzIsOTcsCisgICAgMTE0LDEwMSwzMiw5OSw5Nyw5OSwxMDQsMTAxLDEwMCwzMiwxMDIsMTExLDExNCwzMiwxMTIsMTAxLAorICAgIDExNCwxMDIsMTExLDExNCwxMDksOTcsMTEwLDk5LDEwMSw0NCwzMiw5OCwxMDEsMTA1LDExMCwxMDMsCisgICAgMTAsMzIsMzIsMzIsMzIsMTE0LDEwMSwxMDIsMTE0LDEwMSwxMTUsMTA0LDEwMSwxMDAsMzIsMTE5LAorICAgIDEwNCwxMDEsMTEwLDMyLDExNiwxMDQsMTAxLDMyLDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwKKyAgICAxMjEsMzIsMTE2LDEwNCwxMDEsMzIsMTAyLDEwNSwxMTAsMTAwLDEwMSwxMTQsMzIsMTA1LDExNSwzMiwKKyAgICAxMDQsOTcsMTEwLDEwMCwxMDgsMTA1LDExMCwxMDMsMzIsMTA0LDk3LDExNSwzMiw5OCwxMDEsMTAxLAorICAgIDExMCwzMiwxMDksMTExLDEwMCwxMDUsMTAyLDEwNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDk5LDIsMCwwLDAsMCwwLDAsMCw1LDAsMCwwLDUsMCwKKyAgICAwLDAsNywwLDAsMCwxMTUsODgsMCwwLDAsMTAzLDAsMTI1LDMsMTIwLAorICAgIDQwLDEyNCwyLDY4LDAsOTMsMzIsOTIsMiwxMzcsMCwxMjUsNCwxMjQsMywxMDYsCisgICAgMCwxMzUsMCwxMDIsMSwxMDAsMSwxMDAsMiwxMzIsOCwxMjQsNCw2OCwwLDEzMSwKKyAgICAxLDEzMSwxLDEsMCwxMTMsMTAsODcsMCwxMjQsMywxMjQsMCw5NSwxLDEyNCwKKyAgICAxLDExMiw1OCwxMDAsMywxMjQsMCw5NSwyLDEwMCw2LDEyNCwwLDk1LDMsMTE2LAorICAgIDQsMTMxLDAsMTI0LDAsOTUsNSwxMTYsNCwxMzEsMCwxMjQsMCw5NSw2LDEwMCwKKyAgICA1LDgzLDAsNDEsNywxMjIsMTU0LDczLDExMCwxMDUsMTE2LDEwNSw5NywxMDgsMTA1LDEyMiwKKyAgICAxMDEsMzIsMTE5LDEwNSwxMTYsMTA0LDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDMyLAorICAgIDExNiwxMTEsMzIsMTE1LDEwMSw5NywxMTQsOTksMTA0LDMyLDExMSwxMTAsMzIsOTcsMTEwLDEwMCwKKyAgICAzMiw5NywzMiwxMTgsOTcsMTE0LDEwNSw5Nyw5OCwxMDgsMTAxLDMyLDExMCwxMTcsMTA5LDk4LAorICAgIDEwMSwxMTQsMzIsMTExLDEwMiwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiw1MCw0NSwKKyAgICAxMTYsMTE3LDExMiwxMDgsMTAxLDExNSwzMiw5OSwxMTEsMTEwLDExNiw5NywxMDUsMTEwLDEwNSwxMTAsCisgICAgMTAzLDMyLDExNiwxMDQsMTAxLDMyLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMzIsOTcsMTEwLDEwMCwKKyAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDIsMTA1LDEwOCwxMDEsMzIsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsCisgICAgMTAxLDExNSwzMiwxMTYsMTA0LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDEwLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDExNCwxMDEsOTksMTExLDEwMywxMTAsMTA1LDEyMiwxMDEsMTE1LAorICAgIDQ2LDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwKKyAgICAwLDAsNTEsMCwwLDAsMTE1LDIyLDAsMCwwLDEyNCwwLDkzLDE0LDEyNSwKKyAgICAxLDEyNCwxLDEzNiwwLDEwMiwyLDg2LDAsMSwwLDExMywyLDEwMCwwLDgzLAorICAgIDAsNDEsMSw3OCwxMTQsNCwwLDAsMCw0MSwyLDExNCwyNCwwLDAsMCwKKyAgICAxMTQsMjIxLDAsMCwwLDQxLDEsMTE0LDEyMywwLDAsMCwxMTQsNCwwLDAsCisgICAgMCwxMTQsNiwwLDAsMCwxMTQsMjIzLDAsMCwwLDE2Nyw0LDAsMCwxMTUsCisgICAgMiwwLDAsMCw0LDAsMTIyLDM4LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLAorICAgIDEwMSwxMTQsNDYsOTUsOTUsMTA1LDExMCwxMDUsMTE2LDk1LDk1LDQ2LDYwLDEwOCwxMTEsOTksCisgICAgOTcsMTA4LDExNSw2Miw0Niw2MCwxMDMsMTAxLDExMCwxMDEsMTIwLDExMiwxMTQsNjIsMTE0LDYxLAorICAgIDAsMCwwLDExNCwzMSwwLDAsMCw3OCwxMTQsOTAsMCwwLDAsNDEsNywKKyAgICAxMTQsMTQ2LDAsMCwwLDIxOCw4LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsMTE1LDExNCwKKyAgICAzNywwLDAsMCwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsMTA5LDExNiwxMDUsMTA5LAorICAgIDEwMSwyMTgsMywxMTUsMTAxLDExNiwyMTgsMTEsOTUsMTEyLDk3LDExNiwxMDQsOTUsOTksOTcsCisgICAgOTksMTA0LDEwMSwyMTgsMTksOTUsMTE0LDEwMSwxMDgsOTcsMTIwLDEwMSwxMDAsOTUsMTEyLDk3LAorICAgIDExNiwxMDQsOTUsOTksOTcsOTksMTA0LDEwMSw0MSw1LDExNCwxMDMsMCwwLDAsMTE0LAorICAgIDM3LDAsMCwwLDIxOCwxNCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDEwMCwxMDEsMTE2LAorICAgIDk3LDEwNSwxMDgsMTE1LDkwLDcsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDE2MywwLAorICAgIDAsMCwxMTQsNCwwLDAsMCw0MSwxLDExNCwxMjMsMCwwLDAsMTE0LDYsCisgICAgMCwwLDAsMTE0LDE4MSwwLDAsMCwxNjEsNCwwLDAsMTE1LDE2LDAsMCwKKyAgICAwLDAsNCw0LDEsMTQsMSwyOCwxLDYsMiwxMCwxLDYsMSw4LAorICAgIDEsMTIyLDE5LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsOTUsCisgICAgMTA1LDExMCwxMDUsMTE2LDk1LDk1LDk5LDEsMCwwLDAsMCwwLDAsMCwxLAorICAgIDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEwLDAsMCwwLAorICAgIDEwMCwzLDEyNCwwLDk1LDAsMTAwLDIsODMsMCw0MSw0LDEyMiwzMSw3MywxMTAsCiAgICAgMTE4LDk3LDEwOCwxMDUsMTAwLDk3LDExNiwxMDEsMzIsMTE2LDEwNCwxMDEsMzIsMTAwLDEwNSwxMTQsCiAgICAgMTAxLDk5LDExNiwxMTEsMTE0LDEyMSwzMiwxMDksMTE2LDEwNSwxMDksMTAxLDQ2LDExNCwzMSwwLAotICAgIDAsMCw3OCwxMTQsODksMCwwLDAsNDEsMSwxMTQsOSwxLDAsMCw0MSwKLSAgICAxLDExNCwxMTAsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsCi0gICAgMTE0LDYsMCwwLDAsMTE0LDI1MSwwLDAsMCwxNzYsNCwwLDAsMTE1LDIsCisgICAgMCwwLDc4LDExNCw5MCwwLDAsMCw0MSwxLDExNCw2LDEsMCwwLDQxLAorICAgIDEsMTE0LDEwMywwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwxMTQsMjQ4LDAsMCwwLDE3NSw0LDAsMCwxMTUsMiwKICAgICAwLDAsMCwwLDIsMTIyLDI4LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKICAgICAxMTQsNDYsMTA1LDExMCwxMTgsOTcsMTA4LDEwNSwxMDAsOTcsMTE2LDEwMSw5NSw5OSw5Nyw5OSwKICAgICAxMDQsMTAxLDExNSw5OSwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwKLSAgICAyLDAsMCwwLDY3LDAsMCwwLDExNSw1OSwwLDAsMCwxMjQsMCwwLAotICAgIDEwNiwwLDAsMTI0LDEsMCwxMzEsMSwwLDEyNSwyLDAsMTI0LDIsMCwxMDAsCi0gICAgMSwwLDEwNyw4LDAsMTE0LDM3LDAsMTAwLDEsMCwxMDMsMCwwLDEwMiwyLAotICAgIDAsODMsMTI0LDIsMCwxMDYsMSwwLDEyNCwyLDAsMTA2LDIsMCwxMTIsNTUsCi0gICAgMCwxMDMsMCwwLDEwMiwyLDAsODMsNDEsMiwxMjIsMTk3LDg0LDExNCwxMjEsMzIsCi0gICAgMTE2LDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKLSAgICAzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwKLSAgICAxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDExMSwxMTQsMzIsMTE2LDEwNCwKLSAgICAxMDEsMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMTAsMzIsMzIsMzIsMzIsCi0gICAgMzIsMzIsMzIsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExMiwxMTEsMTE0LDExNiwKLSAgICAxMDUsMTExLDExMCwxMTUsNDYsMzIsODIsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNDAsMTA4LAotICAgIDExMSw5NywxMDAsMTAxLDExNCw0NCwzMiwxMDgsMTA1LDExNSwxMTYsNDUsMTExLDEwMiw0NSwxMTIsCi0gICAgMTExLDExNCwxMTYsMTA1LDExMSwxMTAsMTE1LDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLAotICAgIDMyLDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwKLSAgICAxMTUsMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwKLSAgICAxMTUsMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsCi0gICAgMTEwLDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiw3OCw0MSwzLDExNCwxODIsMCwwLDAsMTE0LDEyOSwwLDAsMCwxMTQsMTU4LAotICAgIDAsMCwwLDQxLDMsMTE0LDExMCwwLDAsMCwxMTQsMTI4LDAsMCwwLDExNCwKLSAgICAxNjYsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsCi0gICAgMCwwLDAsMTE0LDEyNiwwLDAsMCwxODIsNCwwLDAsMTE1LDgsMCwwLAotICAgIDAsMCw3LDE1LDEsMTIsMSwxMCwxLDEyMiwyMiw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwxMDgsMTExLDk3LDEwMCwxMDEsCi0gICAgMTE0LDk5LDYsMCwwLDAsMCwwLDAsMCw3LDAsMCwwLDcsMCwKLSAgICAwLDAsNjcsMCwwLDAsMTE1LDQwLDAsMCwwLDEyNCwxLDAsMTI0LDIsCi0gICAgMCwxMjQsMywwLDEzMSwyLDAsMTI1LDYsMCwxMTYsMCwwLDEyNCwyLDAsCi0gICAgMTI0LDMsMCwxMDAsMSwwLDEyNCw2LDAsMTAwLDIsMCwxMjQsNCwwLDEzMSwKLSAgICAyLDIsODMsNDEsMyw3OCwxMTQsMTI5LDAsMCwwLDExNCwxNTgsMCwwLDAsCi0gICAgNDEsMSwxMTQsMTY5LDAsMCwwLDQxLDcsMTE0LDExMCwwLDAsMCwxMTQsMTY3LAotICAgIDAsMCwwLDExNCwxMjgsMCwwLDAsMTE0LDM3LDAsMCwwLDkwLDQsMTE1LAotICAgIDEwOSwxMTUsMTA4LDExNCwxODEsMCwwLDAsMTE0LDEyOSwwLDAsMCwxMTQsNCwwLAotICAgIDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsNiwxLDAsCi0gICAgMCwxOTQsNCwwLDAsMTE1LDYsMCwwLDAsMCwxLDE1LDEsMTgsMSwKLSAgICAxMjIsMjAsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDMsMTAxLAotICAgIDExNiw5NSwxMTUsMTEyLDEwMSw5OSw3OCw5OSwzLDAsMCwwLDAsMCwwLDAsCi0gICAgMTQsMCwwLDAsMTUsMCwwLDAsNjcsMCwwLDAsMTE1LDIzNCwxLDAsCi0gICAgMCwxMDAsMSwwLDEyNSwzLDAsMTI0LDEsMCwxMDYsMCwwLDEwMCwyLDAsCi0gICAgMTMxLDEsMCwxMDAsMywwLDI1LDEyNSw0LDAsMTIxLDM0LDAsMTE2LDEsMCwKLSAgICAxMjQsMCwwLDEwNiwyLDAsMTEyLDQ5LDAsMTE2LDMsMCwxMDYsNCwwLDEzMSwKLSAgICAwLDAsMTMxLDEsMCwxMDYsNSwwLDEyNSw1LDAsODcsMTEwLDI0LDAsNCwKLSAgICAxMTYsNiwwLDEwNywxMCwwLDExNCw4NSwwLDEsMSwxLDEwMCwxMCwwLDEyNSwKLSAgICA1LDAsODksMTEwLDEsMCw4OCwxMjQsNSwwLDEyNCwwLDAsMTA2LDcsMCwKLSAgICAxMDcsMywwLDExNCwxMjAsMCwxMjQsMCwwLDEwNiw4LDAsMTMxLDAsMCwxLAotICAgIDEyNCw1LDAsMTI0LDAsMCw5NSw3LDAsMTE2LDksMCwxMzEsMCwwLDExNCwKLSAgICAxNTMsMCwxMjQsMCwwLDEwNiwxMCwwLDEyNSw2LDAsMTI0LDQsMCwxMDYsMTEsCi0gICAgMCwxMzEsMCwwLDEyNSw3LDAsMTEwLDE1LDAsMTI0LDAsMCwxMDYsMTIsMCwKLSAgICAxMjUsNiwwLDEyNCw0LDAsMTI1LDcsMCwxMjQsNywwLDEyNCw2LDAsMTA3LAotICAgIDYsMCwxMTQsNDUsMSwxMTYsMTMsMCwxMjQsMCwwLDEwNiwyLDAsMTI0LDQsCi0gICAgMCwxMzEsMiwwLDEyNSw4LDAsMTIwLDEwMCwwLDEyNCwwLDAsMTA2LDE0LDAsCi0gICAgNjgsOTMsNzcsMCw5MiwyLDAsMTI1LDksMCwxMjUsMTAsMCwxMDAsNSwwLAotICAgIDEyNCw5LDAsMjMsMTI1LDExLDAsMTE2LDEzLDAsMTI0LDgsMCwxMjQsMTEsMCwKLSAgICAxMzEsMiwwLDEyNSwxMiwwLDExNiwxNSwwLDEyNCwxMiwwLDEzMSwxLDAsMTE0LAotICAgIDIwOCwwLDEyNCwwLDAsMTA2LDE2LDAsMTI0LDEwLDAsMTI0LDEsMCwxMjQsMTIsCi0gICAgMCwxMjQsOCwwLDEwMywxLDAsMTI0LDIsMCwxMzEsNSwwLDgzLDExMywyMDgsCi0gICAgMCw4NywxMTYsMTcsMCwxMjQsOCwwLDEzMSwxLDAsMTI1LDMsMCwxMjAsMTIzLAotICAgIDAsMTI0LDAsMCwxMDYsMTQsMCw2OCw5MywxMTIsMCw5MiwyLDAsMTI1LDksCi0gICAgMCwxMjUsMTAsMCwxMTYsMTMsMCwxMjQsMCwwLDEwNiwyLDAsMTI0LDQsMCwKLSAgICAxMjQsOSwwLDIzLDEzMSwyLDAsMTI1LDEyLDAsMTE2LDE4LDAsMTAwLDYsMCwKLSAgICAxMDYsMTksMCwxMjQsMTIsMCwxMzEsMSwwLDEwMCw3LDAsMTAwLDMsMCwxMzEsCi0gICAgMSwxLDEsMTI0LDcsMCwxMjQsOSwwLDIzLDEyNCw2LDAsMTA3LDYsMCwKLSAgICAxMTQsNTUsMSwxMTYsMTUsMCwxMjQsMTIsMCwxMzEsMSwwLDExNCw1NSwxLDEyNCwKLSAgICAwLDAsMTA2LDE2LDAsMTI0LDEwLDAsMTI0LDEsMCwxMjQsMTIsMCwxMDAsOCwKLSAgICAwLDEyNCwyLDAsMTMxLDUsMCw4MywxMTMsNTUsMSw4NywxMjQsMywwLDExNCwKLSAgICAyMzAsMSwxMTYsMTgsMCwxMDAsOSwwLDEwNiwxOSwwLDEyNCw4LDAsMTMxLDEsCi0gICAgMCwxMzEsMSwwLDEsMTE2LDIwLDAsMTA2LDIxLDAsMTI0LDEsMCwxMDAsOCwKLSAgICAwLDEzMSwyLDAsMTI1LDEzLDAsMTI0LDgsMCwxMDMsMSwwLDEyNCwxMywwLAotICAgIDk1LDIyLDAsMTI0LDEzLDAsODMsMTAwLDgsMCw4Myw0MSwxMSwxMjIsMTAyLDg0LAotICAgIDExNCwxMjEsMzIsMTE2LDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTE1LDExMiwxMDEsCi0gICAgOTksMzIsMTAyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwxMDEsOTksMTA1LDEwMiwKLSAgICAxMDUsMTAxLDEwMCwzMiwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwzMiwzMiw4MiwxMDEsMTE2LAotICAgIDExNywxMTQsMTEwLDExNSwzMiwxMTYsMTA0LDEwMSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwxMDksOTcsMTE2LDk5LDEwNCwxMDUsMTEwLDEwMywzMiwxMTUsMTEyLDEwMSw5OSw0NCwzMiwKLSAgICAxMTEsMTE0LDMyLDc4LDExMSwxMTAsMTAxLDMyLDEwNSwxMDIsMzIsMTEwLDExMSwxMTYsMzIsMTAyLAotICAgIDExMSwxMTcsMTEwLDEwMCw0Niw3MCwxMTQsNjAsMCwwLDAsMTE0LDU4LDAsMCwwLAotICAgIDExNCwzMSwwLDAsMCwxMTQsMTg2LDAsMCwwLDEyMiw5LDExNiwxMTQsMTIxLDEwNSwKLSAgICAxMTAsMTAzLDMyLDEyMywxMjUsMTE0LDEwMCwwLDAsMCw3OCwxMjIsMjUsMTEyLDExMSwxMTUsCi0gICAgMTE1LDEwNSw5OCwxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLAotICAgIDEwMiwxMTEsMTE0LDMyLDEyMywxMjUsMTE0LDg5LDAsMCwwLDQxLDIzLDExNCwzNCwwLAotICAgIDAsMCwxMTQsNDEsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwzLDAsMCwKLSAgICAwLDExNCw0NywwLDAsMCwxMTQsMjIwLDAsMCwwLDExNCw0MiwwLDAsMCwKLSAgICAxMTQsOSwxLDAsMCwyMTgsMTEsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LDk3LDk5LAotICAgIDEwNCwxMDEsMTE0LDcsMCwwLDAsMTE0LDEyLDEsMCwwLDExNCw5MCwwLDAsCi0gICAgMCwxMTQsMTEsMSwwLDAsMTE0LDMwLDAsMCwwLDExNCw4LDEsMCwwLAotICAgIDExNCw0NiwwLDAsMCwxMTQsNiwxLDAsMCwxMTQsNDgsMCwwLDAsMTE0LAotICAgIDEwNywwLDAsMCwxMTQsNDksMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTYyLAotICAgIDAsMCwwLDExNCwxNTgsMCwwLDAsNDEsMTQsMTE0LDExMCwwLDAsMCwxMTQsCi0gICAgMTI4LDAsMCwwLDExNCwxODEsMCwwLDAsOTAsMTIsMTA1LDExNSw5NSwxMTAsOTcsCi0gICAgMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSw5MCwxMSwxMTYsOTcsMTA1LDEwOCw5NSwxMDksMTExLAotICAgIDEwMCwxMTcsMTA4LDEwMSwxMTQsMTM1LDAsMCwwLDkwLDUsOTksOTcsOTksMTA0LDEwMSwKLSAgICA5MCwxMiw5OSw5Nyw5OSwxMDQsMTAxLDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDksCi0gICAgOTgsOTcsMTE1LDEwMSw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMjI2LDAsMCwwLDExNCwxNjcsCi0gICAgMCwwLDAsOTAsMTMsMTA1LDExMCwxMDUsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsCi0gICAgMTA5LDEwMSw5MCw5LDEwMiwxMTcsMTA4LDEwOCw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTY2LDAsCisgICAgMiwwLDAsMCw2NywwLDAsMCwxMTUsNDIsMCwwLDAsMTI0LDAsMTA2LAorICAgIDAsMTI0LDEsMTMxLDEsMTI1LDIsMTI0LDIsMTAwLDEsMTA3LDgsMTE0LDI2LDEwMCwKKyAgICAxLDEwMywwLDEwMiwyLDgzLDAsMTI0LDIsMTA2LDEsMTI0LDIsMTA2LDIsMTEyLAorICAgIDM4LDEwMywwLDEwMiwyLDgzLDAsNDEsMiwxMjIsMTk3LDg0LDExNCwxMjEsMzIsMTE2LAorICAgIDExMSwzMiwxMDIsMTA1LDExMCwxMDAsMzIsOTcsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwzMiwKKyAgICAxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwMSwzMiwxMTUsMTEyLDEwMSw5OSwxMDUsMTAyLDEwNSwxMDEsCisgICAgMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDQ0LDMyLDExMSwxMTQsMzIsMTE2LDEwNCwxMDEsCisgICAgMzIsMTEwLDk3LDEwOSwxMDEsMTE1LDExMiw5Nyw5OSwxMDEsMTAsMzIsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsMTAxLDMyLDExMiwxMTEsMTE0LDExNiwxMDUsCisgICAgMTExLDExMCwxMTUsNDYsMzIsODIsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsNDAsMTA4LDExMSwKKyAgICA5NywxMDAsMTAxLDExNCw0NCwzMiwxMDgsMTA1LDExNSwxMTYsNDUsMTExLDEwMiw0NSwxMTIsMTExLAorICAgIDExNCwxMTYsMTA1LDExMSwxMTAsMTE1LDQxLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDg0LDEwNCwxMDUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDEwNSwxMTUsCisgICAgMzIsMTAwLDEwMSwxMTIsMTE0LDEwMSw5OSw5NywxMTYsMTAxLDEwMCw0NiwzMiwzMiw4NSwxMTUsCisgICAgMTAxLDMyLDEwMiwxMDUsMTEwLDEwMCw5NSwxMTUsMTEyLDEwMSw5OSw0MCw0MSwzMiwxMDUsMTEwLAorICAgIDExNSwxMTYsMTAxLDk3LDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICA3OCw0MSwzLDExNCwxNzcsMCwwLDAsMTE0LDEyMywwLDAsMCwxMTQsMTUzLDAsCisgICAgMCwwLDQxLDMsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCwxNjEsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKKyAgICAwLDAsMTE0LDEyMCwwLDAsMCwxODEsNCwwLDAsMTE1LDgsMCwwLDAsCisgICAgMCw3LDEwLDEsOCwxLDgsMSwxMjIsMjIsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LAorICAgIDExMCwxMDAsMTAxLDExNCw0NiwxMDIsMTA1LDExMCwxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwKKyAgICA5OSw2LDAsMCwwLDAsMCwwLDAsNywwLDAsMCw3LDAsMCwKKyAgICAwLDY3LDAsMCwwLDExNSwzMCwwLDAsMCwxMjQsMSwxMjQsMiwxMjQsMywKKyAgICAxMzEsMiwxMjUsNiwxMTYsMCwxMjQsMiwxMjQsMywxMDAsMSwxMjQsNiwxMDAsMiwKKyAgICAxMjQsNCwxNDQsMiwxMzEsMiw4MywwLDQxLDMsNzgsMTE0LDEyMywwLDAsMCwKKyAgICAxMTQsMTUzLDAsMCwwLDQxLDEsMTE0LDE2NCwwLDAsMCw0MSw3LDExNCwxMDMsCisgICAgMCwwLDAsMTE0LDE2MiwwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCwzNywwLAorICAgIDAsMCw5MCw0LDExNSwxMDksMTE1LDEwOCwxMTQsMTc2LDAsMCwwLDExNCwxMjMsMCwKICAgICAwLDAsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLAotICAgIDAsMTE0LDE4MiwwLDAsMCwxOTksNCwwLDAsMTE1LDY4LDAsMCwwLDAsCi0gICAgMyw2LDEsMTksMSwzLDEsMzQsMSwxMywxLDExLDEsMTUsMSwxMCwKLSAgICAxLDksMiw5LDEsOSwxLDE1LDIsOSwxLDYsMiwxMiwxLDE4LAotICAgIDEsMjIsMSwxMCwxLDE1LDEsMTIsMSwzMiw0LDEyLDIsMjIsMSwyMiwKLSAgICAxLDI1LDEsMTYsMSwxMiwxLDI5LDEsNiwxLDE5LDEsMTgsMSwxMiwKLSAgICAxLDQsMSwxMjIsMjAsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKLSAgICAxMDIsMTA1LDExMCwxMDAsOTUsMTE1LDExMiwxMDEsOTksOTksMSwwLDAsMCwwLDAsCi0gICAgMCwwLDksMCwwLDAsMTMsMCwwLDAsNjcsMCwwLDAsMTE1LDExLAotICAgIDEsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMjUsMSwwLDEyMSwzMSwwLDExNiwKLSAgICAxLDAsMTA2LDIsMCwxMjQsMSwwLDExMiwzMywwLDExNiwxLDAsMTA2LDMsCi0gICAgMCwxMzEsMCwwLDEzMSwxLDAsMTI1LDIsMCw4NywxMTAsMzMsMCw0LDExNiwKLSAgICA0LDAsMTE2LDUsMCwxMTYsNiwwLDEwMiwzLDAsMTA3LDEwLDAsMTE0LDc1LAotICAgIDAsMSwxLDEsMTAzLDAsMCwxMjUsMiwwLDg5LDExMCwxLDAsODgsMTE2LAotICAgIDcsMCwxMDYsOCwwLDEwNiw5LDAsMTAwLDEsMCwxMzEsMSwwLDExNSwxMTIsCi0gICAgMCwxMTYsMTAsMCwxMjQsMiwwLDEzMSwxLDAsMTI0LDAsMCw5NSwxMSwwLAotICAgIDExMCwxMTEsMCwxMTYsMTAsMCwxMzEsMCwwLDEyNSwzLDAsMTIwLDkwLDAsMTI0LAotICAgIDIsMCw2OCw5Myw4MiwwLDEyNSw0LDAsMTI0LDQsMCwxMDYsMTIsMCwxMDAsCi0gICAgMiwwLDEzMSwxLDAsOTIsMywwLDEyNSw1LDAsMTI1LDYsMCwxMjUsNywKLSAgICAwLDEyNCw2LDAsMTE0LDE5MSwwLDEwMCwzLDAsMTA2LDEzLDAsMTI0LDUsMCwKLSAgICAxMjQsNywwLDEwNiwxNCwwLDEzMSwwLDAsMTMxLDIsMCwxMjUsOCwwLDExMCwKLSAgICA2LDAsMTI0LDUsMCwxMjUsOCwwLDEyNCwzLDAsMTA2LDE1LDAsMTI0LDgsCi0gICAgMCwxMzEsMSwwLDEsMTEzLDEyOCwwLDg3LDEyNCwzLDAsMTI0LDAsMCw5NSwKLSAgICAxMSwwLDExNiw3LDAsMTA2LDgsMCwxMDYsOSwwLDExNiwxNiwwLDEzMSwxLAotICAgIDAsMTE0LDcsMSwxMDAsNCwwLDEwMCw1LDAsMTMyLDAsMCwxMjQsMiwwLAotICAgIDY4LDEzMSwxLDAsMTI0LDAsMCw5NSwxNywwLDEwMCw2LDAsODMsNDEsNywKLSAgICAxMjIsNjgsNzAsMTA1LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsOTksOTcsOTksMTA0LDEwMSwKLSAgICAzMiwxMTEsMTAyLDMyLDExMiwxMTEsMTE2LDEwMSwxMTAsMTE2LDEwNSw5NywxMDgsMzIsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTEyLDk3LDk5LDEwNyw5NywxMDMsCi0gICAgMTAxLDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTAwLDEwNSwxMTQsMTAxLAotICAgIDk5LDExNiwxMTEsMTE0LDEyMSw0NiwxMTQsMCwwLDAsMCwxMTQsNjAsMCwwLDAsCi0gICAgMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDk5LDEsMCwwLDAsMCwwLDAsMCwKLSAgICAyLDAsMCwwLDMsMCwwLDAsODMsMCwwLDAsMTE1LDI4LDAsMCwKLSAgICAwLDEwNCwwLDAsMTI0LDAsMCw5MywxOCwwLDEyNSwxLDAsMTI0LDEsMCwKLSAgICAxMDYsMCwwLDEzMSwwLDAsMTQ2LDIsMCwxMTMsNiwwLDgzLDExNCw0LDAsCi0gICAgMCwwLDQxLDEsMTE0LDkwLDAsMCwwLDQxLDIsMTE0LDI0LDAsMCwwLAotICAgIDkwLDIsMTAyLDExMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwKLSAgICAwLDAsMCwyNTAsOSw2MCwxMTUsMTAxLDExNiw5OSwxMTEsMTA5LDExMiw2MiwxNyw1LAotICAgIDAsMCwxMTUsMiwwLDAsMCw5LDAsMTIyLDQxLDcwLDEwNSwxMDgsMTAxLDcwLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LDk3LDk5LDEwNCwKLSAgICAxMDEsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDExNSwxMDEsMTE2LDk5LAotICAgIDExMSwxMDksMTEyLDYyLDc4LDQxLDE4LDExNCwzNywwLDAsMCwxMTQsMywwLDAsCi0gICAgMCw5MCw3LDEwOCwxMDUsMTE1LDExNiwxMDAsMTA1LDExNCwxMTQsNDcsMCwwLDAsMTE0LAotICAgIDEsMSwwLDAsMjE4LDE1LDgwLDEwMSwxMTQsMTA5LDEwNSwxMTUsMTE1LDEwNSwxMTEsMTEwLAotICAgIDY5LDExNCwxMTQsMTExLDExNCwyMTgsMTgsNzgsMTExLDExNiw2NSw2OCwxMDUsMTE0LDEwMSw5OSwKLSAgICAxMTYsMTExLDExNCwxMjEsNjksMTE0LDExNCwxMTEsMTE0LDExNCw4LDAsMCwwLDExNCw5LAotICAgIDAsMCwwLDExNCwxMCwwLDAsMCwxMTQsMTAsMSwwLDAsMTE0LDExLDEsCi0gICAgMCwwLDExNCw4NSwwLDAsMCwxMTQsNDksMCwwLDAsMTE0LDkwLDAsMCwKLSAgICAwLDIxOCwzLDk3LDEwMCwxMDAsMTE0LDExLDAsMCwwLDExNCwxMiwxLDAsMCwKLSAgICA0MSw5LDExNCwxMTAsMCwwLDAsMTE0LDM3LDAsMCwwLDkwLDgsOTksMTExLAotICAgIDExMCwxMTYsMTAxLDExMCwxMTYsMTE1LDkwLDIxLDEwOCwxMTEsMTE5LDEwMSwxMTQsOTUsMTE1LDExNywKLSAgICAxMDIsMTAyLDEwNSwxMjAsOTUsOTksMTExLDExMCwxMTYsMTAxLDExMCwxMTYsMTE1LDExNCwyNDYsMCwKLSAgICAwLDAsMTE0LDEwOCwwLDAsMCwxMTQsMjM4LDAsMCwwLDExNCwyMjYsMCwwLAotICAgIDAsOTAsOCwxMTAsMTAxLDExOSw5NSwxMTAsOTcsMTA5LDEwMSwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTQsMSwwLDAsMjQ0LAotICAgIDQsMCwwLDExNSwzNCwwLDAsMCwwLDIsOSwxLDMsMSwzMSwxLAotICAgIDIyLDMsMTEsMywxOCwxLDE4LDcsOSwxLDEzLDEsMjQsMSw2LDEsCi0gICAgMjcsMiw2LDEsMTcsMSw5LDEsMTgsMSwxMjIsMjIsNzAsMTA1LDEwOCwxMDEsCi0gICAgNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0Niw5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksCi0gICAgMTA0LDEwMSw5OSwxLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwzLAotICAgIDAsMCwwLDcsMCwwLDAsMTE1LDI1LDAsMCwwLDEzNSwwLDAsMTM1LAotICAgIDEsMCwxMDIsMiwwLDEwMCwxLDAsMTAwLDIsMCwxMzQsMCwwLDEyNSwyLAotICAgIDAsMTI0LDIsMCw4Myw0MSwzLDk3LDIwLDEsMCwwLDY1LDMyLDk5LDEwOCwKLSAgICA5NywxMTUsMTE1LDMyLDEwOSwxMDEsMTE2LDEwNCwxMTEsMTAwLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwKLSAgICAzMiwxMTQsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsOTcsMzIsOTksMTA4LDExMSwxMTUsMTE3LAotICAgIDExNCwxMDEsMzIsMTE2LDExMSwzMiwxMTcsMTE1LDEwMSwzMiwxMTEsMTEwLDMyLDExNSwxMjEsMTE1LAotICAgIDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNywxMCwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiwzMiwxMTksMTA0LDEwNSw5OSwxMDQsMzIsMTE5LDEwNSwxMDgsMTA4LDMyLDExNCwxMDEsCi0gICAgMTE2LDExNywxMTQsMTEwLDMyLDk3LDExMCwzMiwxMDUsMTEwLDExNSwxMTYsOTcsMTEwLDk5LDEwMSwKLSAgICAzMiwxMTcsMTE1LDEwNSwxMTAsMTAzLDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwKLSAgICAxMDIsMTA1LDEwMSwxMDAsMzIsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMzIsOTcsMTEwLDEwMCwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiwKLSAgICA5OSwxMDgsMTExLDExNSwxMTcsMTE0LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICAzMiwzMiw3MywxMDIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsMzIsOTksOTcsCi0gICAgMTA4LDEwOCwxMDEsMTAwLDMyLDExMSwxMTAsMzIsMTE2LDEwNCwxMDEsMzIsOTksMTA4LDExMSwxMTUsCi0gICAgMTE3LDExNCwxMDEsMzIsMTA1LDExNSwzMiwxMTAsMTExLDExNiwzMiw5NywzMiwxMDAsMTA1LDExNCwKLSAgICAxMDEsOTksMTE2LDExMSwxMTQsMTIxLDQ0LDMyLDczLDEwOSwxMTIsMTExLDExNCwxMTYsNjksMTE0LAotICAgIDExNCwxMTEsMTE0LDMyLDEwNSwxMTUsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMTE0LAotICAgIDk3LDEwNSwxMTUsMTAxLDEwMCw0NiwxMCwxMCwzMiwzMiwzMiwzMiwzMiwzMiwzMiwzMiwKLSAgICA5OSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCw0LDAsMCwKLSAgICAwLDE5LDAsMCwwLDExNSw0MywwLDAsMCwxMTYsMCwwLDEyNCwwLDAsCi0gICAgMTMxLDEsMCwxMTUsMzAsMCwxMTYsMSwwLDEwMCwxLDAsMTAwLDIsMCwxMjQsCi0gICAgMCwwLDEzMSwxLDEsMTMwLDEsMCwxMzYsMCwwLDEyNCwwLDAsMTM2LDEsCi0gICAgMCwxNDAsMSwwLDgzLDQxLDMsMTIyLDQ1LDgwLDk3LDExNiwxMDQsMzIsMTA0LDExMSwKLSAgICAxMTEsMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsCi0gICAgNDYsMTA5LDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwxMTQsMTIxLDQ2LDcwLDEwNSwxMDgsMTAxLDcwLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTIyLDMwLDExMSwxMTAsMTA4LDEyMSwzMiwxMDAsMTA1LDExNCwKLSAgICAxMDEsOTksMTE2LDExMSwxMTQsMTA1LDEwMSwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMTUsMTE3LDExMiwKLSAgICAxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwxMTQsMzcsMCwwLDAsNDEsMiwxMTQsNDgsMCwKLSAgICAwLDAsMTE0LDEwOSwwLDAsMCw0MSwxLDExNCwzNywwLDAsMCw0MSwyLAotICAgIDExNCwxNzIsMCwwLDAsMTE0LDEzLDEsMCwwLDExNCw0LDAsMCwwLDExNCwKLSAgICA2LDAsMCwwLDIxOCwyNCwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTUsCi0gICAgMTAyLDExMSwxMTQsOTUsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwyOSw1LAotICAgIDAsMCwxMTUsNiwwLDAsMCwwLDIsMTIsMSwxOCwxLDEyMiw1NCw3MCwKLSAgICAxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwKLSAgICAxMTEsMTExLDEwNyw0Niw2MCwxMDgsMTExLDk5LDk3LDEwOCwxMTUsNjIsNDYsMTEyLDk3LDExNiwKLSAgICAxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDk1LDEwMiwxMTEsMTE0LDk1LDcwLDEwNSwxMDgsMTAxLDcwLAotICAgIDEwNSwxMTAsMTAwLDEwMSwxMTQsMTE0LDQsMCwwLDAsNDEsMywxMTQsMTcyLDAsMCwKLSAgICAwLDExNCwxMywxLDAsMCwxMTQsMTksMSwwLDAsMTE0LDQsMCwwLDAsCi0gICAgNDEsMiwxMTQsMTcyLDAsMCwwLDExNCwxMywxLDAsMCwxMTQsNiwwLDAsCi0gICAgMCwyMTgsOSwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsMTksNSwwLDAsCi0gICAgMTE1LDQsMCwwLDAsMCwxMCwyMSw2LDEyMiwyMCw3MCwxMDUsMTA4LDEwMSw3MCwKLSAgICAxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDExMiw5NywxMTYsMTA0LDk1LDEwNCwxMTEsMTExLDEwNyw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLAotICAgIDY3LDAsMCwwLDExNSwxNiwwLDAsMCwxMDAsMSwwLDEwNiwwLDAsMTI0LAotICAgIDAsMCwxMDYsMSwwLDEzMSwxLDAsODMsNDEsMiw3OCwxMjIsMTYsNzAsMTA1LAotICAgIDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0MCwxMjMsMzMsMTE0LDEyNSw0MSw0MSwyLAotICAgIDExNCw0OSwwLDAsMCwxMTQsMzcsMCwwLDAsNDEsMSwxMTQsMTEwLDAsMCwKLSAgICAwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLAotICAgIDExNCwyNDUsMCwwLDAsMzcsNSwwLDAsMTE1LDIsMCwwLDAsMCwxLAotICAgIDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDk1LDk1LDExNCwKLSAgICAxMDEsMTEyLDExNCw5NSw5NSw0MSwxNSwxMTQsMTE0LDAsMCwwLDExNCwxMTMsMCwwLAotICAgIDAsMTE0LDExNSwwLDAsMCwxMTQsMTE2LDAsMCwwLDExNCwxODYsMCwwLDAsCi0gICAgMTE0LDI1MSwwLDAsMCwxMTQsMTMyLDAsMCwwLDExNCwxODMsMCwwLDAsMTE0LAotICAgIDEyNiwwLDAsMCwxMTQsNiwxLDAsMCwxMTQsMTgyLDAsMCwwLDExNCwxNCwKLSAgICAxLDAsMCwxMTQsMTg0LDAsMCwwLDExNCwyMCwxLDAsMCwxMTQsMjQ1LDAsCisgICAgMCwxMTQsMywxLDAsMCwxOTMsNCwwLDAsMTE1LDYsMCwwLDAsMCwKKyAgICAxLDEwLDEsMTIsMSwxMjIsMjAsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLAorICAgIDExNCw0Niw5NSwxMDMsMTAxLDExNiw5NSwxMTUsMTEyLDEwMSw5OSw3OCw5OSwzLDAsMCwKKyAgICAwLDAsMCwwLDAsMTQsMCwwLDAsMTUsMCwwLDAsNjcsMCwwLAorICAgIDAsMTE1LDEwMCwxLDAsMCwxMDAsMSwxMjUsMywxMjQsMSwxMDYsMCwxMDAsMiwKKyAgICAxMzEsMSwxMDAsMywyNSwwLDEyNSw0LDEyMSwyNCwxMTYsMSwxMjQsMCwxMDYsMiwKKyAgICAxMTIsMzQsMTE2LDMsMTA2LDQsMTMxLDAsMTMxLDEsMTA2LDUsMTI1LDUsODcsMCwKKyAgICAxMTAsMjQsNCwwLDExNiw2LDEwNywxMCwxMTQsNjYsMSwwLDEsMCwxLDAsCisgICAgMTAwLDEwLDEyNSw1LDg5LDAsMTEwLDIsODgsMCwxMjQsNSwxMjQsMCwxMDYsNywKKyAgICAxMDcsMywxMTQsOTIsMTI0LDAsMTA2LDgsMTMxLDAsMSwwLDEyNCw1LDEyNCwwLAorICAgIDk1LDcsMTE2LDksMTMxLDAsMTE0LDExNCwxMjQsMCwxMDYsMTAsMTI1LDYsMTI0LDQsCisgICAgMTA2LDExLDEzMSwwLDEyNSw3LDExMCwxMCwxMjQsMCwxMDYsMTIsMTI1LDYsMTI0LDQsCisgICAgMTI1LDcsMTI0LDcsMTI0LDYsMTA3LDYsMTE0LDIxOCwxMTYsMTMsMTI0LDAsMTA2LDIsCisgICAgMTI0LDQsMTMxLDIsMTI1LDgsMTIwLDcyLDEyNCwwLDEwNiwxNCw2OCwwLDkzLDU0LAorICAgIDkyLDIsMTI1LDksMTI1LDEwLDEwMCw1LDEyNCw5LDIzLDAsMTI1LDExLDExNiwxMywKKyAgICAxMjQsOCwxMjQsMTEsMTMxLDIsMTI1LDEyLDExNiwxNSwxMjQsMTIsMTMxLDEsMTE0LDE1MiwKKyAgICAxMjQsMCwxMDYsMTYsMTI0LDEwLDEyNCwxLDEyNCwxMiwxMjQsOCwxMDMsMSwxMjQsMiwKKyAgICAxMzEsNSw4MywwLDExMywxNTIsODcsMCwxMTYsMTcsMTI0LDgsMTMxLDEsMTI1LDMsCisgICAgMTIwLDkwLDEyNCwwLDEwNiwxNCw2OCwwLDkzLDgwLDkyLDIsMTI1LDksMTI1LDEwLAorICAgIDExNiwxMywxMjQsMCwxMDYsMiwxMjQsNCwxMjQsOSwyMywwLDEzMSwyLDEyNSwxMiwKKyAgICAxMTYsMTgsMTA2LDE5LDEwMCw2LDEyNCwxMiwxMDAsNywxMDAsMywxNDQsMSwxMzEsMiwKKyAgICAxLDAsMTI0LDcsMTI0LDksMjMsMCwxMjQsNiwxMDcsNiwxMTQsMjI2LDExNiwxNSwKKyAgICAxMjQsMTIsMTMxLDEsMTE0LDIyNiwxMjQsMCwxMDYsMTYsMTI0LDEwLDEyNCwxLDEyNCwxMiwKKyAgICAxMDAsOCwxMjQsMiwxMzEsNSw4MywwLDExMywyMjYsODcsMCwxMjQsMywxNDQsMSwKKyAgICAxMTQsOTYsMTE2LDE4LDEwNiwxOSwxMDAsOSwxMjQsOCwxMzEsMiwxLDAsMTE2LDE4LAorICAgIDEwNiwyMCwxMjQsMSwxMDAsOCwxMzEsMiwxMjUsMTMsMTI0LDgsMTAzLDEsMTI0LDEzLAorICAgIDk1LDIxLDEyNCwxMyw4MywwLDEwMCw4LDgzLDAsNDEsMTEsMTIyLDExMSw4NCwxMTQsCisgICAgMTIxLDMyLDExNiwxMTEsMzIsMTAyLDEwNSwxMTAsMTAwLDMyLDk3LDMyLDExNSwxMTIsMTAxLDk5LAorICAgIDMyLDEwMiwxMTEsMTE0LDMyLDExNiwxMDQsMTAxLDMyLDExNSwxMTIsMTAxLDk5LDEwNSwxMDIsMTA1LAorICAgIDEwMSwxMDAsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCisgICAgMzIsMzIsMzIsMzIsODIsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsMzIsMTE2LDEwNCwxMDEsMzIsCisgICAgMTA5LDk3LDExNiw5OSwxMDQsMTA1LDExMCwxMDMsMzIsMTE1LDExMiwxMDEsOTksNDQsMzIsMTExLAorICAgIDExNCwzMiw3OCwxMTEsMTEwLDEwMSwzMiwxMDUsMTAyLDMyLDExMCwxMTEsMTE2LDMyLDEwMiwxMTEsCisgICAgMTE3LDExMCwxMDAsNDYsMTAsMzIsMzIsMzIsMzIsMzIsMzIsMzIsMzIsNzAsMTE0LDYxLAorICAgIDAsMCwwLDExNCw1OSwwLDAsMCwxMTQsMzEsMCwwLDAsMTE0LDE4MSwwLAorICAgIDAsMCwxMjIsOSwxMTYsMTE0LDEyMSwxMDUsMTEwLDEwMywzMiwxMjMsMTI1LDkwLDksMTE4LAorICAgIDEwMSwxMTQsOTgsMTExLDExNSwxMDUsMTE2LDEyMSw3OCwxMjIsMjUsMTEyLDExMSwxMTUsMTE1LDEwNSwKKyAgICA5OCwxMDgsMTAxLDMyLDExMCw5NywxMDksMTAxLDExNSwxMTIsOTcsOTksMTAxLDMyLDEwMiwxMTEsCisgICAgMTE0LDMyLDEyMywxMjUsMTE0LDkwLDAsMCwwLDQxLDIyLDExNCwzNCwwLDAsMCwKKyAgICAxMTQsNDEsMCwwLDAsMTE0LDM3LDAsMCwwLDExNCwzLDAsMCwwLDExNCwKKyAgICA0NywwLDAsMCwxMTQsMjE1LDAsMCwwLDExNCw0MiwwLDAsMCwxMTQsNiwKKyAgICAxLDAsMCwyMTgsMTEsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LDk3LDk5LDEwNCwxMDEsCisgICAgMTE0LDcsMCwwLDAsMTE0LDksMSwwLDAsMTE0LDkxLDAsMCwwLDExNCwKKyAgICA4LDEsMCwwLDExNCwzMCwwLDAsMCwxMTQsNSwxLDAsMCwxMTQsNDYsCisgICAgMCwwLDAsMTE0LDMsMSwwLDAsMTE0LDQ4LDAsMCwwLDExNCwxMTcsMCwKKyAgICAwLDAsMTE0LDEzMiwwLDAsMCwxMTQsMTU3LDAsMCwwLDExNCwxNTMsMCwwLAorICAgIDAsNDEsMTQsMTE0LDEwMywwLDAsMCwxMTQsMTIyLDAsMCwwLDExNCwxNzYsMCwKKyAgICAwLDAsOTAsMTIsMTA1LDExNSw5NSwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LDk5LDEwMSwKKyAgICA5MCwxMSwxMTYsOTcsMTA1LDEwOCw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSwxMTQsMTI5LDAsCisgICAgMCwwLDkwLDUsOTksOTcsOTksMTA0LDEwMSw5MCwxMiw5OSw5Nyw5OSwxMDQsMTAxLAorICAgIDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDksOTgsOTcsMTE1LDEwMSw5NSwxMTIsOTcsCisgICAgMTE2LDEwNCwxMTQsMjIxLDAsMCwwLDExNCwxNjIsMCwwLDAsOTAsMTMsMTA1LDExMCwKKyAgICAxMDUsMTE2LDk1LDEwMiwxMDUsMTA4LDEwMSwxMTAsOTcsMTA5LDEwMSw5MCw5LDEwMiwxMTcsMTA4LAorICAgIDEwOCw5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTYxLDAsMCwwLDExNCw0LDAsMCwwLAorICAgIDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDExNCwxNzcsMCwwLDAsMTk4LAorICAgIDQsMCwwLDExNSw3MCwwLDAsMCwwLDUsNCwxLDE0LDEsMiwxLAorICAgIDI0LDEsMTQsMSwxMCwxLDEwLDEsOCwxLDYsMiw2LDEsNiwxLAorICAgIDEwLDIsNiwxLDQsMiw4LDEsMTIsMSwxNiwxLDgsMSwxMCwxLAorICAgIDgsMSwyNCw0LDgsMiwxNiwxLDE2LDEsMTgsMSwxMiwxLDgsMSwKKyAgICAxMCwxLDEyLDEsNiwxLDEyLDEsMTIsMSw4LDEsNCwxLDEyMiwyMCwKKyAgICA3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LDQ2LDEwMiwxMDUsMTEwLDEwMCw5NSwKKyAgICAxMTUsMTEyLDEwMSw5OSw5OSwxLDAsMCwwLDAsMCwwLDAsOSwwLDAsCisgICAgMCwxMywwLDAsMCw2NywwLDAsMCwxMTUsMTk0LDAsMCwwLDEyNCwwLAorICAgIDEwNiwwLDEyNSwxLDEyMSwyMiwxMTYsMSwxMDYsMiwxMjQsMSwxMTIsMjIsMTE2LDEsCisgICAgMTA2LDMsMTMxLDAsMTMxLDEsMTI1LDIsODcsMCwxMTAsMzAsNCwwLDExNiw0LAorICAgIDExNiw1LDExNiw2LDEwMiwzLDEwNywxMCwxMTQsNTgsMSwwLDEsMCwxLDAsCisgICAgMTAzLDAsMTI1LDIsODksMCwxMTAsMiw4OCwwLDExNiw3LDEwNiw4LDEwNiw5LAorICAgIDEwMCwxLDEzMSwxLDExNSw4NCwxMTYsMTAsMTI0LDIsMTMxLDEsMTI0LDAsOTUsMTEsCisgICAgMTEwLDc4LDExNiwxMCwxMzEsMCwxMjUsMywxMjAsNjQsMTI0LDIsNjgsMCw5Myw1NiwKKyAgICAxMjUsNCwxMjQsNCwxMDYsMTIsMTAwLDIsMTMxLDEsOTIsMywxMjUsNSwxMjUsNiwKKyAgICAxMjUsNywxMjQsNiwxMTQsMTM4LDEwMCwzLDEwNiwxMywxMjQsNSwxMjQsNywxMDYsMTQsCisgICAgMTMxLDAsMTMxLDIsMTI1LDgsMTEwLDQsMTI0LDUsMTI1LDgsMTI0LDMsMTA2LDE1LAorICAgIDEyNCw4LDEzMSwxLDEsMCwxMTMsOTYsODcsMCwxMjQsMywxMjQsMCw5NSwxMSwKKyAgICAxMTYsNywxMDYsOCwxMDYsOSwxMTYsMTYsMTMxLDEsMTE0LDE5MCwxMDAsNCwxMDAsNSwKKyAgICAxMzIsMCwxMjQsMiw2OCwwLDEzMSwxLDEyNCwwLDk1LDE3LDEwMCw2LDgzLDAsCisgICAgNDEsNywxMjIsNjgsNzAsMTA1LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsOTksOTcsOTksCisgICAgMTA0LDEwMSwzMiwxMTEsMTAyLDMyLDExMiwxMTEsMTE2LDEwMSwxMTAsMTE2LDEwNSw5NywxMDgsMzIsCisgICAgMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTEyLDk3LDk5LDEwNywKKyAgICA5NywxMDMsMTAxLDExNSwzMiwxMDIsMTExLDExNCwzMiwxMTYsMTA0LDEwNSwxMTUsMzIsMTAwLDEwNSwKKyAgICAxMTQsMTAxLDk5LDExNiwxMTEsMTE0LDEyMSw0NiwxMTQsMCwwLDAsMCwxMTQsNjEsMCwKKyAgICAwLDAsMTIyLDUsMTIzLDEyNSw0NiwxMjMsMTI1LDk5LDEsMCwwLDAsMCwwLAorICAgIDAsMCwyLDAsMCwwLDMsMCwwLDAsODMsMCwwLDAsMTE1LDIwLAorICAgIDAsMCwwLDEwNCwwLDEyNCwwLDkzLDEyLDEyNSwxLDEyNCwxLDEwNiwwLDEzMSwKKyAgICAwLDE0NiwyLDExMyw0LDgzLDAsMTE0LDQsMCwwLDAsNDEsMSwxMTQsOTEsCisgICAgMCwwLDAsNDEsMiwxMTQsMjQsMCwwLDAsOTAsMiwxMDIsMTEwLDExNCw0LAorICAgIDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDI1MCw5LDYwLAorICAgIDExNSwxMDEsMTE2LDk5LDExMSwxMDksMTEyLDYyLDE5LDUsMCwwLDExNSwyLDAsMCwKKyAgICAwLDYsMCwxMjIsNDEsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0NiwKKyAgICA5NSwxMDIsMTA1LDEwOCwxMDgsOTUsOTksOTcsOTksMTA0LDEwMSw0Niw2MCwxMDgsMTExLDk5LAorICAgIDk3LDEwOCwxMTUsNjIsNDYsNjAsMTE1LDEwMSwxMTYsOTksMTExLDEwOSwxMTIsNjIsNzgsNDEsCisgICAgMTgsMTE0LDM3LDAsMCwwLDExNCwzLDAsMCwwLDkwLDcsMTA4LDEwNSwxMTUsCisgICAgMTE2LDEwMCwxMDUsMTE0LDExNCw0NywwLDAsMCwxMTQsMjU0LDAsMCwwLDIxOCwxNSwKKyAgICA4MCwxMDEsMTE0LDEwOSwxMDUsMTE1LDExNSwxMDUsMTExLDExMCw2OSwxMTQsMTE0LDExMSwxMTQsMjE4LAorICAgIDE4LDc4LDExMSwxMTYsNjUsNjgsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTIxLDY5LDExNCwKKyAgICAxMTQsMTExLDExNCwxMTQsOCwwLDAsMCwxMTQsOSwwLDAsMCwxMTQsMTAsMCwKKyAgICAwLDAsMTE0LDcsMSwwLDAsMTE0LDgsMSwwLDAsMTE0LDg2LDAsMCwKKyAgICAwLDExNCw1MCwwLDAsMCwxMTQsOTEsMCwwLDAsMjE4LDMsOTcsMTAwLDEwMCwKKyAgICAxMTQsMTEsMCwwLDAsMTE0LDksMSwwLDAsNDEsOSwxMTQsMTAzLDAsMCwKKyAgICAwLDExNCwzNywwLDAsMCw5MCw4LDk5LDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSwKKyAgICA5MCwyMSwxMDgsMTExLDExOSwxMDEsMTE0LDk1LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDk1LDk5LAorICAgIDExMSwxMTAsMTE2LDEwMSwxMTAsMTE2LDExNSwxMTQsMjQzLDAsMCwwLDExNCwxMDEsMCwwLAorICAgIDAsMTE0LDIzMywwLDAsMCwxMTQsMjIxLDAsMCwwLDkwLDgsMTEwLDEwMSwxMTksCisgICAgOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAorICAgIDYsMCwwLDAsMTE0LDExLDEsMCwwLDI0Niw0LDAsMCwxMTUsMzQsMCwKKyAgICAwLDAsMCwyLDYsMSwyLDEsMjIsMSwyMCwzLDEwLDMsMTIsMSwKKyAgICAxMiw3LDYsMSwxMCwxLDE2LDEsNCwxLDE4LDIsNCwxLDE0LDEsCisgICAgNiwxLDEyLDEsMTIyLDIyLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsCisgICAgNDYsOTUsMTAyLDEwNSwxMDgsMTA4LDk1LDk5LDk3LDk5LDEwNCwxMDEsOTksMSwwLDAsCisgICAgMCwwLDAsMCwwLDMsMCwwLDAsMywwLDAsMCw3LDAsMCwKKyAgICAwLDExNSwxOCwwLDAsMCwxMzUsMCwxMzUsMSwxMDIsMiwxMDAsMSwxMDAsMiwKKyAgICAxMzIsOCwxMjUsMiwxMjQsMiw4MywwLDQxLDMsOTcsMjAsMSwwLDAsNjUsCisgICAgMzIsOTksMTA4LDk3LDExNSwxMTUsMzIsMTA5LDEwMSwxMTYsMTA0LDExMSwxMDAsMzIsMTE5LDEwNCwKKyAgICAxMDUsOTksMTA0LDMyLDExNCwxMDEsMTE2LDExNywxMTQsMTEwLDExNSwzMiw5NywzMiw5OSwxMDgsCisgICAgMTExLDExNSwxMTcsMTE0LDEwMSwzMiwxMTYsMTExLDMyLDExNywxMTUsMTAxLDMyLDExMSwxMTAsMzIsCisgICAgMTE1LDEyMSwxMTUsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDEwLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDMyLDExOSwxMDQsMTA1LDk5LDEwNCwzMiwxMTksMTA1LDEwOCwxMDgsCisgICAgMzIsMTE0LDEwMSwxMTYsMTE3LDExNCwxMTAsMzIsOTcsMTEwLDMyLDEwNSwxMTAsMTE1LDExNiw5NywKKyAgICAxMTAsOTksMTAxLDMyLDExNywxMTUsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMzIsMTE1LDExMiwKKyAgICAxMDEsOTksMTA1LDEwMiwxMDUsMTAxLDEwMCwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSwzMiwKKyAgICA5NywxMTAsMTAwLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsMTA0LDEwLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDk5LDk3LDEwOCwxMDgsMTAxLDEwMCwzMiwxMTEsMTEwLDMyLDExNiwKKyAgICAxMDQsMTAxLDMyLDk5LDEwOCwxMTEsMTE1LDExNywxMTQsMTAxLDQ2LDEwLDEwLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDMyLDMyLDczLDEwMiwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsMTE2LDEwNCwKKyAgICAzMiw5OSw5NywxMDgsMTA4LDEwMSwxMDAsMzIsMTExLDExMCwzMiwxMTYsMTA0LDEwMSwzMiw5OSwKKyAgICAxMDgsMTExLDExNSwxMTcsMTE0LDEwMSwzMiwxMDUsMTE1LDMyLDExMCwxMTEsMTE2LDMyLDk3LDMyLAorICAgIDEwMCwxMDUsMTE0LDEwMSw5OSwxMTYsMTExLDExNCwxMjEsNDQsMzIsNzMsMTA5LDExMiwxMTEsMTE0LAorICAgIDExNiw2OSwxMTQsMTE0LDExMSwxMTQsMzIsMTA1LDExNSwxMCwzMiwzMiwzMiwzMiwzMiwzMiwKKyAgICAzMiwzMiwxMTQsOTcsMTA1LDExNSwxMDEsMTAwLDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDMyLAorICAgIDMyLDMyLDMyLDk5LDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAorICAgIDQsMCwwLDAsMTksMCwwLDAsMTE1LDMyLDAsMCwwLDExNiwwLDEyNCwKKyAgICAwLDEzMSwxLDExNSwyMiwxMTYsMSwxMDAsMSwxMDAsMiwxMjQsMCwxNDQsMSwxMzEsCisgICAgMSwxMzAsMSwxMzYsMCwxMjQsMCwxMzYsMSwxNDAsMSw4MywwLDQxLDMsMTIyLAorICAgIDQ1LDgwLDk3LDExNiwxMDQsMzIsMTA0LDExMSwxMTEsMTA3LDMyLDEwMiwxMTEsMTE0LDMyLDEwNSwKKyAgICAxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsNDYsMTA5LDk3LDk5LDEwNCwxMDUsMTEwLDEwMSwKKyAgICAxMTQsMTIxLDQ2LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTIyLDMwLAorICAgIDExMSwxMTAsMTA4LDEyMSwzMiwxMDAsMTA1LDExNCwxMDEsOTksMTE2LDExMSwxMTQsMTA1LDEwMSwxMTUsCisgICAgMzIsOTcsMTE0LDEwMSwzMiwxMTUsMTE3LDExMiwxMTIsMTExLDExNCwxMTYsMTAxLDEwMCwxMTQsMzcsCisgICAgMCwwLDAsNDEsMiwxMTQsNDgsMCwwLDAsMTE0LDEwMiwwLDAsMCw0MSwKKyAgICAxLDExNCwzNywwLDAsMCw0MSwyLDExNCwxNjcsMCwwLDAsMTE0LDEwLDEsCisgICAgMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsMCwwLDIxOCwyNCwxMTIsOTcsCisgICAgMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTUsMTAyLDExMSwxMTQsOTUsNzAsMTA1LDEwOCwxMDEsCisgICAgNzAsMTA1LDExMCwxMDAsMTAxLDExNCwzMSw1LDAsMCwxMTUsNiwwLDAsMCwwLAorICAgIDIsOCwxLDE0LDEsMTIyLDU0LDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwKKyAgICAxMTQsNDYsMTEyLDk3LDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDQ2LDYwLDEwOCwxMTEsOTksCisgICAgOTcsMTA4LDExNSw2Miw0NiwxMTIsOTcsMTE2LDEwNCw5NSwxMDQsMTExLDExMSwxMDcsOTUsMTAyLAorICAgIDExMSwxMTQsOTUsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCwxMTQsNCwwLAorICAgIDAsMCw0MSwzLDExNCwxNjcsMCwwLDAsMTE0LDEwLDEsMCwwLDExNCwxNiwKKyAgICAxLDAsMCwxMTQsNCwwLDAsMCw0MSwyLDExNCwxNjcsMCwwLDAsMTE0LAorICAgIDEwLDEsMCwwLDExNCw2LDAsMCwwLDIxOCw5LDExMiw5NywxMTYsMTA0LDk1LAorICAgIDEwNCwxMTEsMTExLDEwNywyMSw1LDAsMCwxMTUsNCwwLDAsMCwwLDEwLDE0LAorICAgIDYsMTIyLDIwLDcwLDEwNSwxMDgsMTAxLDcwLDEwNSwxMTAsMTAwLDEwMSwxMTQsNDYsMTEyLDk3LAorICAgIDExNiwxMDQsOTUsMTA0LDExMSwxMTEsMTA3LDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAxLDAsMCwwLDIsMCwwLDAsNjcsMCwwLDAsMTE1LDEyLDAsMCwKKyAgICAwLDEwMCwxLDEwNiwwLDEyNCwwLDEwNiwxLDEzMSwxLDgzLDAsNDEsMiw3OCwKKyAgICAxMjIsMTYsNzAsMTA1LDEwOCwxMDEsNzAsMTA1LDExMCwxMDAsMTAxLDExNCw0MCwxMjMsMzMsMTE0LAorICAgIDEyNSw0MSw0MSwyLDExNCw1MCwwLDAsMCwxMTQsMzcsMCwwLDAsNDEsMSwKKyAgICAxMTQsMTAzLDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCwKKyAgICA2LDAsMCwwLDExNCwyNDIsMCwwLDAsMzksNSwwLDAsMTE1LDIsMCwKKyAgICAwLDAsMCwxLDEyMiwxOSw3MCwxMDUsMTA4LDEwMSw3MCwxMDUsMTEwLDEwMCwxMDEsMTE0LAorICAgIDQ2LDk1LDk1LDExNCwxMDEsMTEyLDExNCw5NSw5NSw0MSwxLDc4LDQxLDE1LDExNCwxMDgsCisgICAgMCwwLDAsMTE0LDEwNywwLDAsMCwxMTQsMTA5LDAsMCwwLDExNCwxMTAsMCwKKyAgICAwLDAsMTE0LDE4MSwwLDAsMCwxMTQsMjQ4LDAsMCwwLDExNCwxMjYsMCwwLAorICAgIDAsMTE0LDE3OCwwLDAsMCwxMTQsMTIwLDAsMCwwLDExNCwzLDEsMCwwLAorICAgIDExNCwxNzcsMCwwLDAsMTE0LDExLDEsMCwwLDExNCwxNzksMCwwLDAsMTE0LAorICAgIDE3LDEsMCwwLDExNCwyNDIsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMTE0LDQsMSwKKyAgICAwLDAsMTUyLDQsMCwwLDExNSwyMCwwLDAsMCw4LDcsNCwyLDgsCisgICAgMTQsOCw0LDQsMiw4LDEyLDgsNSwxMCw0OCw4LDMxLDEyLDE4LDExNCwKKyAgICA0LDEsMCwwLDk5LDQsMCwwLDAsMCwwLDAsMCw2LDAsMCwKKyAgICAwLDExLDAsMCwwLDY3LDAsMCwwLDExNSwxNDgsMCwwLDAsMTI0LDAsCisgICAgMTA2LDAsMTAwLDEsMTMxLDEsMTI1LDQsMTI0LDAsMTA2LDAsMTAwLDIsMTMxLDEsCisgICAgMTI1LDUsMTI0LDQsMTE1LDY2LDEyNCw1LDExNCwzNiwxMjQsNSwxMDYsMSwxMjUsNCwKKyAgICAxMTAsMzAsMTI0LDIsMTI0LDMsMTA3LDIsMTE0LDU2LDExNiwyLDEyNCwxLDEyNCwyLAorICAgIDEzMSwyLDEyNSw0LDExMCwxMCwxMTYsMywxMjQsMSwxMjQsMiwxMzEsMiwxMjUsNCwKKyAgICAxMjQsNSwxMTUsODYsMTE2LDQsMTI0LDEsMTI0LDIsMTAwLDMsMTI0LDQsMTQ0LDEsCisgICAgMTMxLDIsMTI1LDUsMTIxLDM2LDEyNCw1LDEyNCwwLDEwMCwyLDYwLDAsMTI0LDQsCisgICAgMTI0LDAsMTAwLDEsNjAsMCwxMjQsMiwxMjQsMCwxMDAsNCw2MCwwLDEyNCwzLAorICAgIDEyNCwwLDEwMCw1LDYwLDAsODcsMCwxMTAsMjAsNCwwLDExNiw1LDEwNywxMCwKKyAgICAxMTQsMTQyLDEsMCwxLDAsMSwwLDg5LDAsMTEwLDIsODgsMCwxMDAsMCwKKyAgICA4MywwLDQxLDYsNzgsMjE4LDEwLDk1LDk1LDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsOTUsCisgICAgOTUsMjE4LDgsOTUsOTUsMTE1LDExMiwxMDEsOTksOTUsOTUsMTE0LDEyMywwLDAsMCwKKyAgICA5MCw4LDk1LDk1LDEwMiwxMDUsMTA4LDEwMSw5NSw5NSw5MCwxMCw5NSw5NSw5OSw5NywKKyAgICA5OSwxMDQsMTAxLDEwMCw5NSw5NSw0MSw2LDIxOCwzLDEwMywxMDEsMTE2LDExNCwxMjMsMCwKKyAgICAwLDAsMTE0LDIxOSwwLDAsMCwxMTQsMjE0LDAsMCwwLDExNCwxNjQsMCwwLAorICAgIDAsMjE4LDksNjksMTIwLDk5LDEwMSwxMTIsMTE2LDEwNSwxMTEsMTEwLDQxLDYsOTAsMiwKKyAgICAxMTAsMTE1LDExNCwxMDEsMCwwLDAsOTAsOCwxMTIsOTcsMTE2LDEwNCwxMTAsOTcsMTA5LAorICAgIDEwMSw5MCw5LDk5LDExMiw5NywxMTYsMTA0LDExMCw5NywxMDksMTAxLDExNCwxMjMsMCwwLAorICAgIDAsMTE0LDE2MSwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwyMTgsMTQsOTUsMTAyLDEwNSwxMjAsOTUsMTE3LDExMiw5NSwxMDksCisgICAgMTExLDEwMCwxMTcsMTA4LDEwMSw0NSw1LDAsMCwxMTUsMzQsMCwwLDAsMCwyLAorICAgIDEwLDEsMTAsMSw0LDEsNCwxLDgsMSw4LDEsMTIsMiwxMCwxLAorICAgIDQsMSwxNiwxLDIsMSw4LDEsOCwxLDgsMSwxMiwxLDE0LDIsCisgICAgMTE0LDIyLDEsMCwwLDk5LDAsMCwwLDAsMCwwLDAsMCwzLDAsCisgICAgMCwwLDMsMCwwLDAsNjcsMCwwLDAsMTE1LDM4LDAsMCwwLDExNiwKKyAgICAwLDExNiwxLDEwNiwyLDEzMSwwLDEwMiwyLDEyNSwwLDExNiwzLDExNiw0LDEwMiwKKyAgICAyLDEyNSwxLDExNiw1LDExNiw2LDEwMiwyLDEyNSwyLDEyNCwwLDEyNCwxLDEyNCwKKyAgICAyLDEwMywzLDgzLDAsNDEsMSwxMjIsOTUsODIsMTAxLDExNiwxMTcsMTE0LDExMCwxMTUsCisgICAgMzIsOTcsMzIsMTA4LDEwNSwxMTUsMTE2LDMyLDExMSwxMDIsMzIsMTAyLDEwNSwxMDgsMTAxLDQ1LAorICAgIDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDMyLDEwOCwxMTEsOTcsCisgICAgMTAwLDEwMSwxMTQsMTE1LDQ2LDEwLDEwLDMyLDMyLDMyLDMyLDY5LDk3LDk5LDEwNCwzMiwKKyAgICAxMDUsMTE2LDEwMSwxMDksMzIsMTA1LDExNSwzMiw5NywzMiwxMTYsMTE3LDExMiwxMDgsMTAxLDMyLAorICAgIDQwLDEwOCwxMTEsOTcsMTAwLDEwMSwxMTQsNDQsMzIsMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsMTAxLAorICAgIDExNSw0MSw0NiwxMCwzMiwzMiwzMiwzMiw0MSw3LDExNCwyMjAsMCwwLDAsMTE0LAorICAgIDE0MiwwLDAsMCwyMTgsMTgsMTAxLDEyMCwxMTYsMTAxLDExMCwxMTUsMTA1LDExMSwxMTAsOTUsCisgICAgMTE1LDExNywxMDIsMTAyLDEwNSwxMjAsMTAxLDExNSwxMTQsMjE0LDAsMCwwLDExNCw4NywwLAorICAgIDAsMCwxMTQsMjE5LDAsMCwwLDExNCw3NywwLDAsMCw0MSwzLDkwLDEwLAorICAgIDEwMSwxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDExNSw5MCw2LDExNSwxMTEsMTE3LDExNCwKKyAgICA5OSwxMDEsOTAsOCw5OCwxMjEsMTE2LDEwMSw5OSwxMTEsMTAwLDEwMSwxMTQsNCwwLDAsCisgICAgMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsMTU4LDAsMCwwLAorICAgIDY4LDUsMCwwLDExNSw4LDAsMCwwLDAsNSwxMiwxLDgsMSw4LAorICAgIDEsMTE0LDE1OCwwLDAsMCw5OSwxLDAsMCwwLDAsMCwwLDAsMTIsCisgICAgMCwwLDAsMTIsMCwwLDAsNjcsMCwwLDAsMTE1LDE4OCwxLDAsMCwKKyAgICAxMjQsMCw5NywwLDExNiwwLDEwNiwxLDk3LDEsMTE2LDAsMTA2LDIsOTcsMiwKKyAgICAxMTYsMSwxMDYsMywxMTYsNCwyNSwwLDEyNSwxLDEyMCw1NiwxMDAsMjYsNjgsMCwKKyAgICA5Myw0OCwxMjUsMiwxMjQsMiwxMTYsMSwxMDYsMywxMDcsNywxMTQsNTgsMTE2LDAsCisgICAgMTA2LDUsMTI0LDIsMTMxLDEsMTI1LDMsMTEwLDEwLDExNiwxLDEwNiwzLDEyNCwyLAorICAgIDI1LDAsMTI1LDMsMTE2LDYsMTI0LDEsMTI0LDIsMTI0LDMsMTMxLDMsMSwwLAorICAgIDExMywzMiw4NywwLDEwMCw1LDEwMCw2LDEwMywxLDEwMiwyLDEwMCw3LDEwMCw4LAorICAgIDEwMCw2LDEwMywyLDEwMiwyLDEwMiwyLDEyNSw0LDEyMCwxMTgsMTI0LDQsNjgsMCwKKyAgICA5MywxMDIsOTIsMiwxMjUsNSwxMjUsNiwxMTYsNywxMDAsOSwxMDAsMTAsMTMyLDAsCisgICAgMTI0LDYsNjgsMCwxMzEsMSwxMzEsMSwxMTUsMTQyLDExNiw4LDEzMCwxLDEyNCw2LAorICAgIDEwMCwxMSwyNSwwLDEyNSw3LDEyNCw1LDExNiwxLDEwNiwzLDEwNyw2LDExNCwxNzQsCisgICAgMTE2LDEsMTA2LDMsMTI0LDUsMjUsMCwxMjUsOCw4MCwwLDExMywxMTIsMTIxLDE2LAorICAgIDExNiwwLDEwNiw1LDEyNCw1LDEzMSwxLDEyNSw4LDgwLDAsODcsMCwxMTMsMTEyLAorICAgIDQsMCwxMTYsOSwxMDcsMTAsMTE0LDIxMiwxLDAsMSwwLDEsMCwxMTksMTEyLAorICAgIDg5LDAsMTEzLDExMiw4OCwwLDExMywxMTIsODcsMCwxMTYsOSwxMDAsMTIsMTMxLDEsCisgICAgMTMwLDEsMTE2LDYsMTI0LDEsMTAwLDEzLDEyNCw4LDEzMSwzLDEsMCwxMTYsNiwKKyAgICAxMjQsMSwxMDAsMTQsMTI0LDcsMTMxLDMsMSwwLDExNiw2LDEyNCwxLDEwMCwxNSwKKyAgICAxMDAsMTYsMTA2LDEwLDEyNCw2LDEzMSwxLDEzMSwzLDEsMCwxMjEsMTQsMTE2LDAsCisgICAgMTA2LDUsMTAwLDE3LDEzMSwxLDEyNSw5LDg3LDAsMTEwLDI2LDQsMCwxMTYsOSwKKyAgICAxMDcsMTAsMTQ0LDEsMTE0LDUyLDEsMCwxLDAsMSwwLDEwMCwxOCwxMjUsOSwKKyAgICA4OSwwLDExMCwyLDg4LDAsMTE2LDYsMTI0LDEsMTAwLDE3LDEyNCw5LDEzMSwzLAorICAgIDEsMCwxMTYsMCwxMDYsNSwxMDAsMTksMTMxLDEsMTI1LDEwLDExNiw2LDEyNCwxLAorICAgIDEwMCwxOSwxMjQsMTAsMTMxLDMsMSwwLDEyNCw1LDEwMCw3LDEwNywyLDE0NCwxLAorICAgIDExNCwxMjAsMTE2LDAsMTA2LDUsMTAwLDIwLDEzMSwxLDEyNSwxMSwxMTYsNiwxMjQsMSwKKyAgICAxMDAsMjEsMTI0LDExLDEzMSwzLDEsMCwxMTYsNiwxMjQsMSwxMDAsMjIsMTE2LDExLAorICAgIDEzMSwwLDEzMSwzLDEsMCwxMTYsMTIsMTA2LDEzLDExNiwyLDEwNiwxNCwxMzEsMCwKKyAgICAxMzEsMSwxLDAsMTI0LDUsMTAwLDcsMTA3LDIsMTQ0LDEsMTE0LDE4NCwxMTYsMTUsCisgICAgMTA2LDE2LDEwMCwyMywxMzEsMSwxLDAsMTAwLDI0LDExNiwxMiwxMDcsNiwxNDQsMSwKKyAgICAxMTQsMTg0LDEwMCwyNSwxMTYsMTcsOTUsMTgsMTAwLDE4LDgzLDAsNDEsMjcsMTIyLDIwNSwKKyAgICA4MywxMDEsMTE2LDExNywxMTIsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDUsOTgsCisgICAgOTcsMTE1LDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTAxLDExNCwxMTUsMzIsMTAyLAorICAgIDExMSwxMTQsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA4LDEwNSw5OCwzMiw5OCwxMjEsMzIsCisgICAgMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMTA1LDExMCwxMDMsMzIsMTEwLDEwMSwxMDEsMTAwLDEwMSwxMDAsCisgICAgMTAsMzIsMzIsMzIsMzIsOTgsMTE3LDEwNSwxMDgsMTE2LDQ1LDEwNSwxMTAsMzIsMTA5LDExMSwKKyAgICAxMDAsMTE3LDEwOCwxMDEsMTE1LDMyLDk3LDExMCwxMDAsMzIsMTA1LDExMCwxMDYsMTAxLDk5LDExNiwKKyAgICAxMDUsMTEwLDEwMywzMiwxMTYsMTA0LDEwMSwxMDksMzIsMTA1LDExMCwxMTYsMTExLDMyLDExNiwxMDQsCisgICAgMTAxLDMyLDEwMywxMDgsMTExLDk4LDk3LDEwOCwzMiwxMTAsOTcsMTA5LDEwMSwxMTUsMTEyLDk3LAorICAgIDk5LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiw3OSwxMTYsMTA0LDEwMSwxMTQsMzIsOTksCisgICAgMTExLDEwOSwxMTIsMTExLDExMCwxMDEsMTEwLDExNiwxMTUsMzIsOTcsMTE0LDEwMSwzMiwxMDEsMTIwLAorICAgIDExNiwxMTQsOTcsOTksMTE2LDEwMSwxMDAsMzIsMTAyLDExNCwxMTEsMTA5LDMyLDExNiwxMDQsMTAxLAorICAgIDMyLDk5LDExMSwxMTQsMTAxLDMyLDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiwzMiwKKyAgICAxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw0NiwxMCwxMCwzMiwzMiwzMiwzMiwxMTQsNTIsMCwKKyAgICAwLDAsMTE0LDYzLDAsMCwwLDIxOCw4LDk4LDExNywxMDUsMTA4LDExNiwxMDUsMTEwLAorICAgIDExNSwxMTQsMTM5LDAsMCwwLDkwLDUsMTEyLDExMSwxMTUsMTA1LDEyMCwyNTAsMSw0NywKKyAgICAyMTgsMiwxMTAsMTE2LDI1MCwxLDkyLDk5LDEsMCwwLDAsMCwwLDAsMCwKKyAgICAyLDAsMCwwLDMsMCwwLDAsMTE1LDAsMCwwLDExNSwyNiwwLDAsCisgICAgMCwxMjQsMCw5MywxOCwxMjUsMSwxMTYsMCwxMjQsMSwxMzEsMSwxMDAsMCwxMDcsCisgICAgMiw4NiwwLDEsMCwxMTMsMiwxMDAsMSw4MywwLDQxLDIsMTE0LDMxLDAsCisgICAgMCwwLDc4LDQxLDEsMTE0LDMzLDAsMCwwLDQxLDIsMTE0LDI0LDAsMCwKKyAgICAwLDExNCw4MCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwKKyAgICAxMTQsNiwwLDAsMCwxMTQsMjIzLDAsMCwwLDEwNCw1LDAsMCwxMTUsMiwKKyAgICAwLDAsMCw0LDAsMTIyLDI1LDk1LDExNSwxMDEsMTE2LDExNywxMTIsNDYsNjAsMTA4LAorICAgIDExMSw5OSw5NywxMDgsMTE1LDYyLDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwKKyAgICAxMTQsNjIsMCwwLDAsMTIyLDMwLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsCisgICAgMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwxMTQsMTAxLDExNSwzMiwxMTIsMTExLDExNSwxMDUsMTIwLDMyLAorICAgIDExMSwxMTQsMzIsMTEwLDExNiwxMTQsMywwLDAsMCwxMTQsMjcsMCwwLDAsMTE0LAorICAgIDIzLDAsMCwwLDExNCwzMiwwLDAsMCw5MCw3LDk1LDExNiwxMDQsMTE0LDEwMSwKKyAgICA5NywxMDAsNzgsOTAsOCw5NSwxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5MCw2LDExOSwKKyAgICAxMDUsMTEwLDExNCwxMDEsMTAzLDExNCwxNjYsMCwwLDAsMTE0LDcsMCwwLDAsMTIyLAorICAgIDQsNDYsMTEyLDEyMSwxMTksMTIyLDYsOTUsMTAwLDQ2LDExMiwxMjEsMTAwLDg0LDQxLDQsCisgICAgMTIyLDMsOTUsMTA1LDExMSwxMjIsOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsCisgICAgMTIyLDgsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsMTE1LDEyMiw3LDEwOSw5NywxMTQsMTE1LAorICAgIDEwNCw5NywxMDgsNDEsMTksMTE0LDExNywwLDAsMCwxMTQsOCwwLDAsMCwxMTQsCisgICAgMTQyLDAsMCwwLDExNCwyMzUsMCwwLDAsMTE0LDEwOCwwLDAsMCw5MCwxOCwKKyAgICA5NSw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLDk3LAorICAgIDEwOSwxMDEsMTE0LDExMiwwLDAsMCwyMTgsMyw5NywxMDgsMTA4LDIxOCwxNCw2NSwxMTUsCisgICAgMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsMTEwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMTAyLDAsMCwKKyAgICAwLDExNCwyOCwwLDAsMCwxMTQsMTMsMCwwLDAsMTE0LDIyNSwwLDAsMCwKKyAgICAxMTQsMTQ2LDAsMCwwLDExNCwyMywxLDAsMCwxMTQsODcsMCwwLDAsMTE0LAorICAgIDE2MCwwLDAsMCwxMTQsMTY1LDAsMCwwLDExNCwxNjksMCwwLDAsNDEsMTIsCisgICAgMjE4LDE3LDk1LDk4LDExMSwxMTEsMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwxMDksMTExLDEwMCwKKyAgICAxMTcsMTA4LDEwMSw5MCwxMSwxMTUsMTAxLDEwOCwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsCisgICAgOTAsMTIsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsCisgICAgOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwxMTAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTAsCisgICAgMTExLDExNSw5NSwxMDAsMTAxLDExNiw5NywxMDUsMTA4LDExNSw5MCwxMCw5OCwxMTcsMTA1LDEwOCwKKyAgICAxMTYsMTA1LDExMCw5NSwxMTEsMTE1LDExNCwyMywwLDAsMCwxMTQsMjcsMCwwLDAsCisgICAgOTAsOSwxMTEsMTE1LDk1LDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExNiwxMDQsMTE0LAorICAgIDEwMSw5NywxMDAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTQsMTE5LDEwMSw5NywxMDcsCisgICAgMTE0LDEwMSwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTMsMTE5LDEwNSwxMTAsMTE0LAorICAgIDEwMSwxMDMsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDYsOTUsMTE1LDEwMSwxMTYsMTE3LDExMiwKKyAgICA3OSw1LDAsMCwxMTUsODIsMCwwLDAsMCw4LDQsMSw2LDEsNiwKKyAgICAzLDEwLDEsMTAsMSwxMCwxLDEyLDIsMTAsMSwxNiwzLDIyLDEsMTQsCisgICAgMiwyMiwxLDgsMSwxMCwxLDEwLDEsNCwyLDIsMSwxMCwxLDYsCisgICAgMSwxNCwxLDEyLDIsOCwxLDEyLDEsMTIsMSwxOCwzLDIsMSwxNCwKKyAgICAxLDE2LDIsMTAsMSwxMiwzLDEwLDEsMTIsMywxMCwxLDEwLDEsMTIsCisgICAgMywxNCwxLDE0LDEsMTAsMSwxMCwxLDEwLDEsMTE0LDMxLDEsMCwwLAorICAgIDk5LDEsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDMsMCwwLAorICAgIDAsNjcsMCwwLDAsMTE1LDg0LDAsMCwwLDExNiwwLDEyNCwwLDEzMSwxLAorICAgIDEsMCwxMTYsMSwxMzEsMCwxMjUsMSwxMTYsMiwxMDYsMywxMDYsNCwxMTYsNSwKKyAgICAxMDYsNiwxMjQsMSwxNDAsMCwxMDMsMSwxMzEsMSwxLDAsMTE2LDcsMTA2LDgsCisgICAgMTAwLDEsMTA3LDIsMTE0LDU2LDExNiwyLDEwNiw5LDEwNiwxMCwxMTYsMTEsMTMxLDEsCisgICAgMSwwLDExNiwyLDEwNiw5LDEwNiwxMCwxMTYsMTIsMTMxLDEsMSwwLDExNiw1LAorICAgIDEyNCwwLDk1LDUsMTE2LDEzLDEyNCwwLDk1LDEzLDEwMCwyLDgzLDAsNDEsMywKKyAgICAxMjIsNDEsNzMsMTEwLDExNSwxMTYsOTcsMTA4LDEwOCwzMiwxMTYsMTA0LDEwMSwzMiwxMTIsOTcsCisgICAgMTE2LDEwNCw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDUsMTA5LDExMiwxMTEsMTE0LDExNiwzMiwKKyAgICA5OSwxMTEsMTA5LDExMiwxMTEsMTEwLDEwMSwxMTAsMTE2LDExNSw0NiwxMTQsMjYsMSwwLDAsCisgICAgNzgsNDEsMTQsMTE0LDMxLDEsMCwwLDExNCwxNTgsMCwwLDAsMTE0LDgsMCwKKyAgICAwLDAsMTE0LDI1MiwwLDAsMCwxMTQsMTQ2LDAsMCwwLDExNCw0LDEsMCwKKyAgICAwLDExNCwxNywxLDAsMCwxMTQsMywwLDAsMCwxMTQsMTA4LDAsMCwwLAorICAgIDIxOCw5LDEwOSwxMDEsMTE2LDk3LDk1LDExMiw5NywxMTYsMTA0LDExNCwxNjAsMCwwLDAsCisgICAgMTE0LDE2NSwwLDAsMCwxMTQsMjQ3LDAsMCwwLDExNCwyMTQsMCwwLDAsNDEsCisgICAgMiwxMTQsMzAsMSwwLDAsOTAsMTcsMTE1LDExNywxMTIsMTEyLDExMSwxMTQsMTE2LDEwMSwKKyAgICAxMDAsOTUsMTA4LDExMSw5NywxMDAsMTAxLDExNCwxMTUsMTE0LDQsMCwwLDAsMTE0LDQsCisgICAgMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDgsOTUsMTA1LDExMCwxMTUsMTE2LDk3LAorICAgIDEwOCwxMDgsMTQ3LDUsMCwwLDExNSwxNiwwLDAsMCwwLDIsOCwxLDYsCisgICAgMSwyMCwxLDEwLDEsMTIsMSwxMiw0LDYsMSwxMTQsMzMsMSwwLDAsCisgICAgNDEsMSwxMjIsMywxMTksMTA1LDExMCw0MSwyLDExNCwxLDAsMCwwLDExNCwyLAorICAgIDAsMCwwLDQxLDEsMTE0LDQ5LDAsMCwwLDQxLDEsNzgsNDEsMyw3OCwKKyAgICA3OCw3OCw0MSwzLDc4LDc4LDc4LDQxLDIsMTE0LDYyLDAsMCwwLDExNCw2MiwKKyAgICAwLDAsMCw0MSwxLDc4LDQxLDEsNzgsNDEsNTgsMTE0LDExMCwwLDAsMCwKKyAgICAxMTQsMTIsMCwwLDAsOTAsMzcsOTUsNjcsNjUsODMsNjksOTUsNzMsNzgsODMsCisgICAgNjksNzgsODMsNzMsODQsNzMsODYsNjksOTUsODAsNzYsNjUsODQsNzAsNzksODIsCisgICAgNzcsODMsOTUsNjYsODksODQsNjksODMsOTUsNzUsNjksODksMTE0LDExLDAsMCwKKyAgICAwLDExNCwxMywwLDAsMCwxMTQsMTksMCwwLDAsMTE0LDIxLDAsMCwwLAorICAgIDExNCwzMCwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDQxLDAsMCwwLDExNCwKKyAgICA0NSwwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LDQ4LDAsMCwwLDExNCw1OCwKKyAgICAwLDAsMCwyMTgsNCwxMTYsMTIxLDExMiwxMDEsMjE4LDgsOTUsOTUsOTksMTExLDEwMCwKKyAgICAxMDEsOTUsOTUsMTE0LDE0MSwwLDAsMCwxMTQsMTcsMCwwLDAsMTE0LDEzMSwwLAorICAgIDAsMCwxMTQsMTYsMCwwLDAsMTE0LDIwLDAsMCwwLDkwLDE3LDk1LDgyLAorICAgIDY1LDg3LDk1LDc3LDY1LDcxLDczLDY3LDk1LDc4LDg1LDc3LDY2LDY5LDgyLDExNCwKKyAgICA3NiwwLDAsMCwxMTQsNzUsMCwwLDAsMTE0LDg3LDAsMCwwLDExNCw3NywKKyAgICAwLDAsMCw5MCwyMyw2OCw2OSw2Niw4NSw3MSw5NSw2Niw4OSw4NCw2OSw2NywKKyAgICA3OSw2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4Myw5MCwyNyw3OSw4MCwKKyAgICA4NCw3Myw3Nyw3Myw5MCw2OSw2OCw5NSw2Niw4OSw4NCw2OSw2Nyw3OSw2OCw2OSwKKyAgICA5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4MywxMTQsODIsMCwwLDAsMTE0LDg4LAorICAgIDAsMCwwLDExNCw5NCwwLDAsMCwxMTQsOTgsMCwwLDAsMTE0LDEwMCwwLAorICAgIDAsMCwxMTQsMTE5LDAsMCwwLDExNCwxMjYsMCwwLDAsMTE0LDEzOCwwLDAsCisgICAgMCwxMTQsMTQ0LDAsMCwwLDExNCwxNDcsMCwwLDAsMTE0LDE1MiwwLDAsMCwKKyAgICAyMTgsNiwxMTEsOTgsMTA2LDEwMSw5OSwxMTYsMTE0LDE1OSwwLDAsMCwxMTQsMTY0LDAsCisgICAgMCwwLDExNCwxNjUsMCwwLDAsMTE0LDE4MCwwLDAsMCwxMTQsMTkwLDAsMCwKKyAgICAwLDExNCwyMDYsMCwwLDAsMTE0LDIxNCwwLDAsMCwxMTQsMjE5LDAsMCwwLAorICAgIDExNCwyMjUsMCwwLDAsMTE0LDIyMCwwLDAsMCwxMTQsMjI2LDAsMCwwLDExNCwKKyAgICAyNDUsMCwwLDAsMTE0LDI0NywwLDAsMCwxMTQsNCwxLDAsMCwxMTQsMjIsCisgICAgMSwwLDAsMTE0LDE1OCwwLDAsMCwxMTQsMzEsMSwwLDAsMTE0LDMzLDEsCiAgICAgMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw0LDAsMCwKLSAgICAwLDExNCw2LDAsMCwwLDExNCw3LDEsMCwwLDE1Myw0LDAsMCwxMTUsCi0gICAgMjAsMCwwLDAsMTIsNyw2LDIsMTIsMTQsMTIsNCw2LDIsMTIsMTIsCi0gICAgMTIsNSwxNSw0NSwxMiwzMSwxOCwxOCwxMTQsNywxLDAsMCw5OSw0LDAsCi0gICAgMCwwLDAsMCwwLDAsNiwwLDAsMCwxMSwwLDAsMCw2NywwLAotICAgIDAsMCwxMTUsMTk1LDAsMCwwLDEyNCwwLDAsMTA2LDAsMCwxMDAsMSwwLAotICAgIDEzMSwxLDAsMTI1LDQsMCwxMjQsMCwwLDEwNiwwLDAsMTAwLDIsMCwxMzEsCi0gICAgMSwwLDEyNSw1LDAsMTI0LDQsMCwxMTUsOTksMCwxMjQsNSwwLDExNCw1NCwKLSAgICAwLDEyNCw1LDAsMTA2LDEsMCwxMjUsNCwwLDExMCw0NSwwLDEyNCwyLDAsCi0gICAgMTI0LDMsMCwxMDcsMiwwLDExNCw4NCwwLDExNiwyLDAsMTI0LDEsMCwxMjQsCi0gICAgMiwwLDEzMSwyLDAsMTI1LDQsMCwxMTAsMTUsMCwxMTYsMywwLDEyNCwxLAotICAgIDAsMTI0LDIsMCwxMzEsMiwwLDEyNSw0LDAsMTI0LDUsMCwxMTUsMTI2LDAsCi0gICAgMTE2LDQsMCwxMjQsMSwwLDEyNCwyLDAsMTAwLDMsMCwxMjQsNCwwLDEzMSwKLSAgICAyLDEsMTI1LDUsMCwxMjEsNDQsMCwxMjQsNSwwLDEyNCwwLDAsMTAwLDIsCi0gICAgMCw2MCwxMjQsNCwwLDEyNCwwLDAsMTAwLDEsMCw2MCwxMjQsMiwwLDEyNCwKLSAgICAwLDAsMTAwLDQsMCw2MCwxMjQsMywwLDEyNCwwLDAsMTAwLDUsMCw2MCwKLSAgICA4NywxMTAsMTgsMCw0LDExNiw1LDAsMTA3LDEwLDAsMTE0LDE5MCwwLDEsMSwKLSAgICAxLDg5LDExMCwxLDAsODgsMTAwLDAsMCw4Myw0MSw2LDc4LDIxOCwxMCw5NSwKLSAgICA5NSwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDk1LDk1LDIxOCw4LDk1LDk1LDExNSwxMTIsMTAxLAotICAgIDk5LDk1LDk1LDExNCwxMjksMCwwLDAsOTAsOCw5NSw5NSwxMDIsMTA1LDEwOCwxMDEsCi0gICAgOTUsOTUsOTAsMTAsOTUsOTUsOTksOTcsOTksMTA0LDEwMSwxMDAsOTUsOTUsNDEsNiwKLSAgICAyMTgsMywxMDMsMTAxLDExNiwxMTQsMTI5LDAsMCwwLDExNCwyMjQsMCwwLDAsMTE0LAotICAgIDIxOSwwLDAsMCwxMTQsMTY5LDAsMCwwLDIxOCw5LDY5LDEyMCw5OSwxMDEsMTEyLAotICAgIDExNiwxMDUsMTExLDExMCw0MSw2LDkwLDIsMTEwLDExNSwxMTQsMTA4LDAsMCwwLDkwLAotICAgIDgsMTEyLDk3LDExNiwxMDQsMTEwLDk3LDEwOSwxMDEsOTAsOSw5OSwxMTIsOTcsMTE2LDEwNCwKLSAgICAxMTAsOTcsMTA5LDEwMSwxMTQsMTI5LDAsMCwwLDExNCwxNjYsMCwwLDAsMTE0LDQsCi0gICAgMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwwLDAsMjE4LDE0LDk1LAotICAgIDEwMiwxMDUsMTIwLDk1LDExNywxMTIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDMsNSwwLAotICAgIDAsMTE1LDM0LDAsMCwwLDAsMiwxNSwxLDE1LDEsNiwxLDYsMSwKLSAgICAxMiwxLDEyLDEsMTgsMiwxNSwxLDYsMSwyMSwxLDMsMSwxMCwxLAotICAgIDEwLDEsMTAsMSwxNCwxLDEzLDIsMTE0LDI1LDEsMCwwLDk5LDAsMCwKLSAgICAwLDAsMCwwLDAsMCwzLDAsMCwwLDMsMCwwLDAsNjcsMCwKLSAgICAwLDAsMTE1LDU1LDAsMCwwLDExNiwwLDAsMTE2LDEsMCwxMDYsMiwwLAotICAgIDEzMSwwLDAsMTAyLDIsMCwxMjUsMCwwLDExNiwzLDAsMTE2LDQsMCwxMDIsCi0gICAgMiwwLDEyNSwxLDAsMTE2LDUsMCwxMTYsNiwwLDEwMiwyLDAsMTI1LDIsCi0gICAgMCwxMjQsMCwwLDEyNCwxLDAsMTI0LDIsMCwxMDMsMywwLDgzLDQxLDEsCi0gICAgMTIyLDk1LDgyLDEwMSwxMTYsMTE3LDExNCwxMTAsMTE1LDMyLDk3LDMyLDEwOCwxMDUsMTE1LDExNiwKLSAgICAzMiwxMTEsMTAyLDMyLDEwMiwxMDUsMTA4LDEwMSw0NSw5OCw5NywxMTUsMTAxLDEwMCwzMiwxMDksCi0gICAgMTExLDEwMCwxMTcsMTA4LDEwMSwzMiwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LDExNSw0NiwxMCwxMCwKLSAgICAzMiwzMiwzMiwzMiw2OSw5Nyw5OSwxMDQsMzIsMTA1LDExNiwxMDEsMTA5LDMyLDEwNSwxMTUsCi0gICAgMzIsOTcsMzIsMTE2LDExNywxMTIsMTA4LDEwMSwzMiw0MCwxMDgsMTExLDk3LDEwMCwxMDEsMTE0LAotICAgIDQ0LDMyLDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwxMTUsNDEsNDYsMTAsMzIsMzIsMzIsCi0gICAgMzIsNDEsNywxMTQsMjI1LDAsMCwwLDExNCwxNDcsMCwwLDAsMjE4LDE4LDEwMSwKLSAgICAxMjAsMTE2LDEwMSwxMTAsMTE1LDEwNSwxMTEsMTEwLDk1LDExNSwxMTcsMTAyLDEwMiwxMDUsMTIwLDEwMSwKLSAgICAxMTUsMTE0LDIxOSwwLDAsMCwxMTQsODYsMCwwLDAsMTE0LDIyNCwwLDAsMCwKLSAgICAxMTQsNzYsMCwwLDAsNDEsMyw5MCwxMCwxMDEsMTIwLDExNiwxMDEsMTEwLDExNSwxMDUsCi0gICAgMTExLDExMCwxMTUsOTAsNiwxMTUsMTExLDExNywxMTQsOTksMTAxLDkwLDgsOTgsMTIxLDExNiwKLSAgICAxMDEsOTksMTExLDEwMCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LAotICAgIDYsMCwwLDAsMTE0LDE2MywwLDAsMCw2Niw1LDAsMCwxMTUsOCwwLAotICAgIDAsMCwwLDUsMTgsMSwxMiwxLDEyLDEsMTE0LDE2MywwLDAsMCw5OSwKLSAgICAxLDAsMCwwLDAsMCwwLDAsMTIsMCwwLDAsMTIsMCwwLDAsCi0gICAgNjcsMCwwLDAsMTE1LDcwLDIsMCwwLDEyNCwwLDAsOTcsMCwwLDExNiwKLSAgICAwLDAsMTA2LDEsMCw5NywxLDAsMTE2LDAsMCwxMDYsMiwwLDk3LDIsCi0gICAgMCwxMTYsMSwwLDEwNiwzLDAsMTE2LDQsMCwyNSwxMjUsMSwwLDEyMCw3NiwKLSAgICAwLDEwMCwyNiwwLDY4LDkzLDY4LDAsMTI1LDIsMCwxMjQsMiwwLDExNiwxLAotICAgIDAsMTA2LDMsMCwxMDcsNywwLDExNCw4MywwLDExNiwwLDAsMTA2LDUsMCwKLSAgICAxMjQsMiwwLDEzMSwxLDAsMTI1LDMsMCwxMTAsMTMsMCwxMTYsMSwwLDEwNiwKLSAgICAzLDAsMTI0LDIsMCwyNSwxMjUsMywwLDExNiw2LDAsMTI0LDEsMCwxMjQsCi0gICAgMiwwLDEyNCwzLDAsMTMxLDMsMCwxLDExMyw0NCwwLDg3LDEwMCw1LDAsCi0gICAgMTAwLDYsMCwxMDMsMSwwLDEwMiwyLDAsMTAwLDcsMCwxMDAsOCwwLDEwMCwKLSAgICA2LDAsMTAzLDIsMCwxMDIsMiwwLDEwMiwyLDAsMTI1LDQsMCwxMjAsMTQ5LAotICAgIDAsMTI0LDQsMCw2OCw5MywxMjksMCw5MiwyLDAsMTI1LDUsMCwxMjUsNiwKLSAgICAwLDExNiw3LDAsMTAwLDksMCwxMDAsMTAsMCwxMzIsMCwwLDEyNCw2LDAsCi0gICAgNjgsMTMxLDEsMCwxMzEsMSwwLDExNSwxOTksMCwxMTYsOCwwLDEzMCwxLDAsCi0gICAgMTI0LDYsMCwxMDAsMTEsMCwyNSwxMjUsNywwLDEyNCw1LDAsMTE2LDEsMCwKLSAgICAxMDYsMywwLDEwNyw2LDAsMTE0LDI0MSwwLDExNiwxLDAsMTA2LDMsMCwxMjQsCi0gICAgNSwwLDI1LDEyNSw4LDAsODAsMTEzLDE1NiwwLDEyMSwyMCwwLDExNiwwLDAsCi0gICAgMTA2LDUsMCwxMjQsNSwwLDEzMSwxLDAsMTI1LDgsMCw4MCw4NywxMTMsMTU2LAotICAgIDAsNCwxMTYsOSwwLDEwNywxMCwwLDExNCwyOCwxLDEsMSwxLDExOSwxNTYsCi0gICAgMCw4OSwxMTMsMTU2LDAsODgsMTEzLDE1NiwwLDg3LDExNiw5LDAsMTAwLDEyLDAsCi0gICAgMTMxLDEsMCwxMzAsMSwwLDExNiw2LDAsMTI0LDEsMCwxMDAsMTMsMCwxMjQsCi0gICAgOCwwLDEzMSwzLDAsMSwxMTYsNiwwLDEyNCwxLDAsMTAwLDE0LDAsMTI0LAotICAgIDcsMCwxMzEsMywwLDEsMTE2LDYsMCwxMjQsMSwwLDEwMCwxNSwwLDEwMCwKLSAgICAxNiwwLDEwNiwxMCwwLDEyNCw2LDAsMTMxLDEsMCwxMzEsMywwLDEsMTIxLAotICAgIDE5LDAsMTE2LDAsMCwxMDYsNSwwLDEwMCwxNywwLDEzMSwxLDAsMTI1LDksCi0gICAgMCw4NywxMTAsMjQsMCw0LDExNiw5LDAsMTA3LDEwLDAsMTE0LDE0NywxLDEsCi0gICAgMSwxLDEwMCwxOCwwLDEyNSw5LDAsODksMTEwLDEsMCw4OCwxMTYsNiwwLAotICAgIDEyNCwxLDAsMTAwLDE3LDAsMTI0LDksMCwxMzEsMywwLDEsMTE2LDAsMCwKLSAgICAxMDYsNSwwLDEwMCwxOSwwLDEzMSwxLDAsMTI1LDEwLDAsMTE2LDYsMCwxMjQsCi0gICAgMSwwLDEwMCwxOSwwLDEyNCwxMCwwLDEzMSwzLDAsMSwxMjQsNSwwLDEwMCwKLSAgICA3LDAsMTA3LDIsMCwxMTQsMjM4LDEsMTE2LDAsMCwxMDYsNSwwLDEwMCwyMCwKLSAgICAwLDEzMSwxLDAsMTI1LDExLDAsMTE2LDYsMCwxMjQsMSwwLDEwMCwyMSwwLAotICAgIDEyNCwxMSwwLDEzMSwzLDAsMSwxMTYsNiwwLDEyNCwxLDAsMTAwLDIyLDAsCi0gICAgMTE2LDExLDAsMTMxLDAsMCwxMzEsMywwLDEsMTE2LDEyLDAsMTA2LDEzLDAsCi0gICAgMTE2LDIsMCwxMDYsMTQsMCwxMzEsMCwwLDEzMSwxLDAsMSwxMjQsNSwwLAotICAgIDEwMCw3LDAsMTA3LDIsMCwxMTQsNjYsMiwxMTYsMTUsMCwxMDYsMTYsMCwxMDAsCi0gICAgMjMsMCwxMzEsMSwwLDEsMTAwLDI0LDAsMTE2LDEyLDAsMTA3LDYsMCwxMTQsCi0gICAgNjYsMiwxMDAsMjUsMCwxMTYsMTcsMCw5NSwxOCwwLDEwMCwxOCwwLDgzLDQxLAotICAgIDI3LDEyMiwyMDUsODMsMTAxLDExNiwxMTcsMTEyLDMyLDExNiwxMDQsMTAxLDMyLDExMiw5NywxMTYsCi0gICAgMTA0LDQ1LDk4LDk3LDExNSwxMDEsMTAwLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwMSwxMTQsCi0gICAgMTE1LDMyLDEwMiwxMTEsMTE0LDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsCi0gICAgOTgsMTIxLDMyLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwNSwxMTAsMTAzLDMyLDExMCwxMDEsMTAxLAotICAgIDEwMCwxMDEsMTAwLDEwLDMyLDMyLDMyLDMyLDk4LDExNywxMDUsMTA4LDExNiw0NSwxMDUsMTEwLAotICAgIDMyLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDExNSwzMiw5NywxMTAsMTAwLDMyLDEwNSwxMTAsMTA2LAotICAgIDEwMSw5OSwxMTYsMTA1LDExMCwxMDMsMzIsMTE2LDEwNCwxMDEsMTA5LDMyLDEwNSwxMTAsMTE2LDExMSwKLSAgICAzMiwxMTYsMTA0LDEwMSwzMiwxMDMsMTA4LDExMSw5OCw5NywxMDgsMzIsMTEwLDk3LDEwOSwxMDEsCi0gICAgMTE1LDExMiw5Nyw5OSwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsNzksMTE2LDEwNCwxMDEsCi0gICAgMTE0LDMyLDk5LDExMSwxMDksMTEyLDExMSwxMTAsMTAxLDExMCwxMTYsMTE1LDMyLDk3LDExNCwxMDEsCi0gICAgMzIsMTAxLDEyMCwxMTYsMTE0LDk3LDk5LDExNiwxMDEsMTAwLDMyLDEwMiwxMTQsMTExLDEwOSwzMiwKLSAgICAxMTYsMTA0LDEwMSwzMiw5OSwxMTEsMTE0LDEwMSwzMiw5OCwxMTEsMTExLDExNiwxMTUsMTE2LDExNCwKLSAgICA5NywxMTIsMzIsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsNDYsMTAsMTAsMzIsMzIsMzIsMzIsCi0gICAgMTE0LDUxLDAsMCwwLDExNCw2MiwwLDAsMCwyMTgsOCw5OCwxMTcsMTA1LDEwOCwKLSAgICAxMTYsMTA1LDExMCwxMTUsMTE0LDE0NCwwLDAsMCw5MCw1LDExMiwxMTEsMTE1LDEwNSwxMjAsCi0gICAgMjUwLDEsNDcsMjE4LDIsMTEwLDExNiwyNTAsMSw5Miw5OSwxLDAsMCwwLDAsCi0gICAgMCwwLDAsMiwwLDAsMCwzLDAsMCwwLDExNSwwLDAsMCwxMTUsCi0gICAgMzMsMCwwLDAsMTI0LDAsMCw5MywyMywwLDEyNSwxLDAsMTE2LDAsMCwKLSAgICAxMjQsMSwwLDEzMSwxLDAsMTAwLDAsMCwxMDcsMiwwLDg2LDEsMTEzLDMsCi0gICAgMCwxMDAsMSwwLDgzLDQxLDIsMTE0LDMxLDAsMCwwLDc4LDQxLDEsMTE0LAotICAgIDMzLDAsMCwwLDQxLDIsMTE0LDI0LDAsMCwwLDExNCw3OSwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwxMTQsCi0gICAgMjI4LDAsMCwwLDEwMiw1LDAsMCwxMTUsMiwwLDAsMCw2LDAsMTIyLAotICAgIDI1LDk1LDExNSwxMDEsMTE2LDExNywxMTIsNDYsNjAsMTA4LDExMSw5OSw5NywxMDgsMTE1LDYyLAotICAgIDQ2LDYwLDEwMywxMDEsMTEwLDEwMSwxMjAsMTEyLDExNCw2MiwxMTQsNjEsMCwwLDAsMTIyLAotICAgIDMwLDEwNSwxMDksMTEyLDExMSwxMTQsMTE2LDEwOCwxMDUsOTgsMzIsMTE0LDEwMSwxMTMsMTE3LDEwNSwKLSAgICAxMTQsMTAxLDExNSwzMiwxMTIsMTExLDExNSwxMDUsMTIwLDMyLDExMSwxMTQsMzIsMTEwLDExNiwxMTQsCi0gICAgMywwLDAsMCwxMTQsMjcsMCwwLDAsMTE0LDIzLDAsMCwwLDExNCwzMiwKLSAgICAwLDAsMCw5MCw3LDk1LDExNiwxMDQsMTE0LDEwMSw5NywxMDAsNzgsOTAsOCw5NSwKLSAgICAxMTksMTAxLDk3LDEwNywxMTQsMTAxLDEwMiw5MCw2LDExOSwxMDUsMTEwLDExNCwxMDEsMTAzLDExNCwKLSAgICAxNzEsMCwwLDAsMTE0LDcsMCwwLDAsMTIyLDQsNDYsMTEyLDEyMSwxMTksMTIyLAotICAgIDYsOTUsMTAwLDQ2LDExMiwxMjEsMTAwLDg0LDQxLDQsMTIyLDMsOTUsMTA1LDExMSwxMjIsCi0gICAgOSw5NSwxMTksOTcsMTE0LDExMCwxMDUsMTEwLDEwMywxMTUsMTIyLDgsOTgsMTE3LDEwNSwxMDgsCi0gICAgMTE2LDEwNSwxMTAsMTE1LDEyMiw3LDEwOSw5NywxMTQsMTE1LDEwNCw5NywxMDgsNDEsMTksMTE0LAotICAgIDEyMywwLDAsMCwxMTQsOCwwLDAsMCwxMTQsMTQ3LDAsMCwwLDExNCwyNDAsCi0gICAgMCwwLDAsMTE0LDExNCwwLDAsMCw5MCwxOCw5NSw5OCwxMTcsMTA1LDEwOCwxMTYsCi0gICAgMTA1LDExMCw5NSwxMDIsMTE0LDExMSwxMDksOTUsMTEwLDk3LDEwOSwxMDEsMTE0LDExOCwwLDAsCi0gICAgMCwyMTgsMyw5NywxMDgsMTA4LDIxOCwxNCw2NSwxMTUsMTE1LDEwMSwxMTQsMTE2LDEwNSwxMTEsCi0gICAgMTEwLDY5LDExNCwxMTQsMTExLDExNCwxMTQsMTA5LDAsMCwwLDExNCwyOCwwLDAsMCwKLSAgICAxMTQsMTMsMCwwLDAsMTE0LDIzMCwwLDAsMCwxMTQsMTUxLDAsMCwwLDExNCwKLSAgICAyNiwxLDAsMCwxMTQsODYsMCwwLDAsMTE0LDE2NSwwLDAsMCwxMTQsMTcwLAotICAgIDAsMCwwLDExNCwxNzQsMCwwLDAsNDEsMTIsMjE4LDE3LDk1LDk4LDExMSwxMTEsCi0gICAgMTE2LDExNSwxMTYsMTE0LDk3LDExMiw5NSwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw5MCwxMSwxMTUsCi0gICAgMTAxLDEwOCwxMDIsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTIsOTgsMTE3LDEwNSwxMDgsCi0gICAgMTE2LDEwNSwxMTAsOTUsMTEwLDk3LDEwOSwxMDEsOTAsMTQsOTgsMTE3LDEwNSwxMDgsMTE2LDEwNSwKLSAgICAxMTAsOTUsMTA5LDExMSwxMDAsMTE3LDEwOCwxMDEsOTAsMTAsMTExLDExNSw5NSwxMDAsMTAxLDExNiwKLSAgICA5NywxMDUsMTA4LDExNSw5MCwxMCw5OCwxMTcsMTA1LDEwOCwxMTYsMTA1LDExMCw5NSwxMTEsMTE1LAotICAgIDExNCwyMywwLDAsMCwxMTQsMjcsMCwwLDAsOTAsOSwxMTEsMTE1LDk1LDEwOSwKLSAgICAxMTEsMTAwLDExNywxMDgsMTAxLDkwLDEzLDExNiwxMDQsMTE0LDEwMSw5NywxMDAsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsOTAsMTQsMTE5LDEwMSw5NywxMDcsMTE0LDEwMSwxMDIsOTUsMTA5LDExMSwKLSAgICAxMDAsMTE3LDEwOCwxMDEsOTAsMTMsMTE5LDEwNSwxMTAsMTE0LDEwMSwxMDMsOTUsMTA5LDExMSwxMDAsCi0gICAgMTE3LDEwOCwxMDEsMTE0LDQsMCwwLDAsMTE0LDQsMCwwLDAsMTE0LDYsMCwKLSAgICAwLDAsMjE4LDYsOTUsMTE1LDEwMSwxMTYsMTE3LDExMiw3Nyw1LDAsMCwxMTUsODIsCi0gICAgMCwwLDAsMCw4LDYsMSw5LDEsOSwzLDEzLDEsMTMsMSwxNSwKLSAgICAxLDE4LDIsMTMsMSwyMCwzLDMzLDEsMTksMiwzMSwxLDEwLDEsMTUsCi0gICAgMSwxMywxLDQsMiwzLDEsMTUsMSw1LDEsMTMsMSwxMiwyLDEyLAotICAgIDEsMTYsMSwxNiwxLDI1LDMsMywxLDE5LDEsMTMsMiwxMSwxLDE2LAotICAgIDMsMTUsMSwxNiwzLDEyLDEsMTUsMSwxNiwzLDE5LDEsMTksMSwxMiwKLSAgICAxLDEzLDEsMTIsMSwxMTQsMzQsMSwwLDAsOTksMSwwLDAsMCwwLAotICAgIDAsMCwwLDIsMCwwLDAsMywwLDAsMCw2NywwLDAsMCwxMTUsCi0gICAgMTE2LDAsMCwwLDExNiwwLDAsMTI0LDAsMCwxMzEsMSwwLDEsMTE2LDEsCi0gICAgMCwxMzEsMCwwLDEyNSwxLDAsMTE2LDIsMCwxMDYsMywwLDEwNiw0LDAsCi0gICAgMTE2LDUsMCwxMDYsNiwwLDEyNCwxLDAsMTQwLDAsMCwxMDMsMSwwLDEzMSwKLSAgICAxLDAsMSwxMTYsNywwLDEwNiw4LDAsMTAwLDEsMCwxMDcsMiwwLDExNCwKLSAgICA3OCwwLDExNiwyLDAsMTA2LDksMCwxMDYsMTAsMCwxMTYsMTEsMCwxMzEsMSwKLSAgICAwLDEsMTE2LDIsMCwxMDYsOSwwLDEwNiwxMCwwLDExNiwxMiwwLDEzMSwxLAotICAgIDAsMSwxMTYsNSwwLDEyNCwwLDAsOTUsNSwwLDExNiwxMywwLDEyNCwwLAotICAgIDAsOTUsMTMsMCwxMDAsMiwwLDgzLDQxLDMsMTIyLDQxLDczLDExMCwxMTUsMTE2LAotICAgIDk3LDEwOCwxMDgsMzIsMTE2LDEwNCwxMDEsMzIsMTEyLDk3LDExNiwxMDQsNDUsOTgsOTcsMTE1LAotICAgIDEwMSwxMDAsMzIsMTA1LDEwOSwxMTIsMTExLDExNCwxMTYsMzIsOTksMTExLDEwOSwxMTIsMTExLDExMCwKLSAgICAxMDEsMTEwLDExNiwxMTUsNDYsMTE0LDI5LDEsMCwwLDc4LDQxLDE0LDExNCwzNCwxLAotICAgIDAsMCwxMTQsMTYzLDAsMCwwLDExNCw4LDAsMCwwLDExNCwyNTUsMCwwLAotICAgIDAsMTE0LDE1MSwwLDAsMCwxMTQsNywxLDAsMCwxMTQsMjAsMSwwLDAsCi0gICAgMTE0LDMsMCwwLDAsMTE0LDExNCwwLDAsMCwyMTgsOSwxMDksMTAxLDExNiw5NywKLSAgICA5NSwxMTIsOTcsMTE2LDEwNCwxMTQsMTY1LDAsMCwwLDExNCwxNzAsMCwwLDAsMTE0LAotICAgIDI1MCwwLDAsMCwxMTQsMjE5LDAsMCwwLDQxLDIsMTE0LDMzLDEsMCwwLAotICAgIDkwLDE3LDExNSwxMTcsMTEyLDExMiwxMTEsMTE0LDExNiwxMDEsMTAwLDk1LDEwOCwxMTEsOTcsMTAwLAotICAgIDEwMSwxMTQsMTE1LDExNCw0LDAsMCwwLDExNCw0LDAsMCwwLDExNCw2LDAsCi0gICAgMCwwLDIxOCw4LDk1LDEwNSwxMTAsMTE1LDExNiw5NywxMDgsMTA4LDE0NSw1LDAsMCwKLSAgICAxMTUsMTYsMCwwLDAsMCwyLDEwLDEsOSwxLDI4LDEsMTUsMSwxNiwKLSAgICAxLDE2LDQsOSwxLDExNCwzNiwxLDAsMCw0MSwxLDEyMiwzLDExOSwxMDUsCi0gICAgMTEwLDQxLDIsMTE0LDEsMCwwLDAsMTE0LDIsMCwwLDAsNDEsNTksMTE0LAotICAgIDExNiwwLDAsMCwxMTQsMTIsMCwwLDAsOTAsMzcsOTUsNjcsNjUsODMsNjksCi0gICAgOTUsNzMsNzgsODMsNjksNzgsODMsNzMsODQsNzMsODYsNjksOTUsODAsNzYsNjUsCi0gICAgODQsNzAsNzksODIsNzcsODMsOTUsNjYsODksODQsNjksODMsOTUsNzUsNjksODksCi0gICAgMTE0LDExLDAsMCwwLDExNCwxMywwLDAsMCwxMTQsMTksMCwwLDAsMTE0LAotICAgIDIxLDAsMCwwLDExNCwzMCwwLDAsMCwxMTQsNDAsMCwwLDAsMTE0LDQxLAotICAgIDAsMCwwLDExNCw0NSwwLDAsMCwxMTQsNDYsMCwwLDAsMTE0LDQ4LDAsCi0gICAgMCwwLDExNCw1NywwLDAsMCwyMTgsNCwxMTYsMTIxLDExMiwxMDEsMjE4LDgsOTUsCi0gICAgOTUsOTksMTExLDEwMCwxMDEsOTUsOTUsMTE0LDE0NiwwLDAsMCwxMTQsMTcsMCwwLAotICAgIDAsMTE0LDEzNywwLDAsMCwxMTQsMTYsMCwwLDAsMTE0LDIwLDAsMCwwLAotICAgIDkwLDE3LDk1LDgyLDY1LDg3LDk1LDc3LDY1LDcxLDczLDY3LDk1LDc4LDg1LDc3LAotICAgIDY2LDY5LDgyLDExNCw3NSwwLDAsMCwxMTQsNzQsMCwwLDAsMTE0LDg2LDAsCi0gICAgMCwwLDExNCw3NiwwLDAsMCw5MCwyMyw2OCw2OSw2Niw4NSw3MSw5NSw2NiwKLSAgICA4OSw4NCw2OSw2Nyw3OSw2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4MywKLSAgICA5MCwyNyw3OSw4MCw4NCw3Myw3Nyw3Myw5MCw2OSw2OCw5NSw2Niw4OSw4NCw2OSwKLSAgICA2Nyw3OSw2OCw2OSw5NSw4Myw4NSw3MCw3MCw3Myw4OCw2OSw4MywxMTQsODEsMCwKLSAgICAwLDAsMTE0LDg3LDAsMCwwLDExNCw5MywwLDAsMCwxMTQsOTcsMCwwLAotICAgIDAsMTE0LDk5LDAsMCwwLDExNCwxMDcsMCwwLDAsMTE0LDEyNSwwLDAsMCwKLSAgICAxMTQsMTMyLDAsMCwwLDExNCwxNDMsMCwwLDAsMTE0LDE0OSwwLDAsMCwxMTQsCi0gICAgMTUyLDAsMCwwLDExNCwxNTcsMCwwLDAsMjE4LDYsMTExLDk4LDEwNiwxMDEsOTksCi0gICAgMTE2LDExNCwxNjQsMCwwLDAsMTE0LDE2OSwwLDAsMCwxMTQsMTcwLDAsMCwwLAotICAgIDExNCwxODUsMCwwLDAsMTE0LDE5NSwwLDAsMCwxMTQsMjExLDAsMCwwLDExNCwKLSAgICAyMTksMCwwLDAsMTE0LDIyNCwwLDAsMCwxMTQsMjMwLDAsMCwwLDExNCwyMjUsCi0gICAgMCwwLDAsMTE0LDIzMSwwLDAsMCwxMTQsMjQ4LDAsMCwwLDExNCwyNTAsMCwKLSAgICAwLDAsMTE0LDcsMSwwLDAsMTE0LDI1LDEsMCwwLDExNCwxNjMsMCwwLAotICAgIDAsMTE0LDM0LDEsMCwwLDExNCwzNiwxLDAsMCwxMTQsNCwwLDAsMCwKLSAgICAxMTQsNCwwLDAsMCwxMTQsNCwwLDAsMCwxMTQsNiwwLDAsMCwyMTgsCi0gICAgOCw2MCwxMDksMTExLDEwMCwxMTcsMTA4LDEwMSw2Miw4LDAsMCwwLDExNSwxMDYsMCwKLSAgICAwLDAsNiwxNiw2LDEsNiwxLDMsMSw3LDMsMTIsMTcsMTIsNSwKLSAgICAxMiw1LDEyLDYsMTIsMTIsMTIsMTAsMTIsOSwxMiw1LDEyLDcsMTUsMjIsCi0gICAgMTUsMTE0LDIyLDEsMTgsMiw2LDEsNiwyLDksMiw5LDIsMTAsMiwKLSAgICAyMSw0NCwxMiwzMywxMiwxOSwxMiwxMiwxMiwxMiwxOCw4LDEyLDI4LDEyLDE3LAotICAgIDIxLDU1LDIxLDEyLDE4LDEwLDEyLDE0LDksMywxMiwxLDE1LDY1LDE5LDY0LAotICAgIDE5LDI4LDIyLDExMCwxOSw0MSwyNSw0MywyNSwxNiw2LDMsMjUsNTMsMTksNTcsCi0gICAgMTksNDEsMTksMTM0LDE5LDE0NiwxNSwyMywxMiwxMSwxMiw2OCwKKyAgICAwLDExNCw2LDAsMCwwLDIxOCw4LDYwLDEwOSwxMTEsMTAwLDExNywxMDgsMTAxLDYyLAorICAgIDgsMCwwLDAsMTE1LDEwOCwwLDAsMCw0LDE2LDQsMSw0LDEsMiwKKyAgICAxLDYsMyw4LDE3LDgsNSw4LDUsOCw2LDgsMTIsOCwxMCw4LAorICAgIDksOCw1LDgsNywxMCwyMiwxMCwxMTYsMTYsMSwxMiwyLDQsMSw0LAorICAgIDIsNiwyLDYsMiw4LDIsMTYsNDQsOCwzMyw4LDE5LDgsMTIsOCwKKyAgICAxMiw4LDI4LDgsMTcsMTAsNTUsMTAsMTIsMTAsMTAsOCwxNCw2LDMsNCwKKyAgICAxLDE0LDY1LDE0LDY0LDE0LDI5LDE2LDExMCwxNCw0MSwxOCw0NSwxOCwxNiw0LAorICAgIDMsMTgsNTMsMTQsNjAsMTQsNDIsMTQsMTI3LDAsNSwxNCwxMjcsMCwyMiwxMCwKKyAgICAyMyw4LDExLDgsNjgsCiB9OwpkaWZmIC0tZ2l0IGEvUHl0aG9uL21ha2VvcGNvZGV0YXJnZXRzLnB5IGIvUHl0aG9uL21ha2VvcGNvZGV0YXJnZXRzLnB5CmluZGV4IGQ5YTA4NTUuLjAyM2M5ZTYgMTAwNzU1Ci0tLSBhL1B5dGhvbi9tYWtlb3Bjb2RldGFyZ2V0cy5weQorKysgYi9QeXRob24vbWFrZW9wY29kZXRhcmdldHMucHkKQEAgLTMsMjQgKzMsMzQgQEAKIChmb3IgY29tcGlsZXJzIHN1cHBvcnRpbmcgY29tcHV0ZWQgZ290b3Mgb3IgImxhYmVscy1hcy12YWx1ZXMiLCBzdWNoIGFzIGdjYykuCiAiIiIKIAotIyBUaGlzIGNvZGUgc2hvdWxkIHN0YXkgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGF0IGxlYXN0IHdoaWxlCi0jIHNvbWUgb2YgdGhlIGJ1aWxkYm90cyBoYXZlIFB5dGhvbiAyLjMgYXMgdGhlaXIgc3lzdGVtIFB5dGhvbi4KLQotaW1wb3J0IGltcAogaW1wb3J0IG9zCitpbXBvcnQgc3lzCiAKIAotZGVmIGZpbmRfbW9kdWxlKG1vZG5hbWUpOgotICAgICIiIkZpbmRzIGFuZCByZXR1cm5zIGEgbW9kdWxlIGluIHRoZSBsb2NhbCBkaXN0L2NoZWNrb3V0LgotICAgICIiIgotICAgIG1vZHBhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwgIkxpYiIpCi0gICAgcmV0dXJuIGltcC5sb2FkX21vZHVsZShtb2RuYW1lLCAqaW1wLmZpbmRfbW9kdWxlKG1vZG5hbWUsIFttb2RwYXRoXSkpCit0cnk6CisgICAgZnJvbSBpbXBvcnRsaWIubWFjaGluZXJ5IGltcG9ydCBTb3VyY2VGaWxlTG9hZGVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGltcAorCisgICAgZGVmIGZpbmRfbW9kdWxlKG1vZG5hbWUpOgorICAgICAgICAiIiJGaW5kcyBhbmQgcmV0dXJucyBhIG1vZHVsZSBpbiB0aGUgbG9jYWwgZGlzdC9jaGVja291dC4KKyAgICAgICAgIiIiCisgICAgICAgIG1vZHBhdGggPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksICJMaWIiKQorICAgICAgICByZXR1cm4gaW1wLmxvYWRfbW9kdWxlKG1vZG5hbWUsICppbXAuZmluZF9tb2R1bGUobW9kbmFtZSwgW21vZHBhdGhdKSkKK2Vsc2U6CisgICAgZGVmIGZpbmRfbW9kdWxlKG1vZG5hbWUpOgorICAgICAgICAiIiJGaW5kcyBhbmQgcmV0dXJucyBhIG1vZHVsZSBpbiB0aGUgbG9jYWwgZGlzdC9jaGVja291dC4KKyAgICAgICAgIiIiCisgICAgICAgIG1vZHBhdGggPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksICJMaWIiLCBtb2RuYW1lICsgIi5weSIpCisgICAgICAgIHJldHVybiBTb3VyY2VGaWxlTG9hZGVyKG1vZG5hbWUsIG1vZHBhdGgpLmxvYWRfbW9kdWxlKCkKKwogCiBkZWYgd3JpdGVfY29udGVudHMoZik6CiAgICAgIiIiV3JpdGUgQyBjb2RlIGNvbnRlbnRzIHRvIHRoZSB0YXJnZXQgZmlsZSBvYmplY3QuCiAgICAgIiIiCi0gICAgb3Bjb2RlID0gZmluZF9tb2R1bGUoIm9wY29kZSIpCisgICAgb3Bjb2RlID0gZmluZF9tb2R1bGUoJ29wY29kZScpCiAgICAgdGFyZ2V0cyA9IFsnX3Vua25vd25fb3Bjb2RlJ10gKiAyNTYKICAgICBmb3Igb3BuYW1lLCBvcCBpbiBvcGNvZGUub3BtYXAuaXRlbXMoKToKICAgICAgICAgdGFyZ2V0c1tvcF0gPSAiVEFSR0VUXyVzIiAlIG9wbmFtZQpAQCAtMjksMTUgKzM5LDE3IEBACiAgICAgZi53cml0ZSgiXG59O1xuIikKIAogCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIGltcG9ydCBzeXMKLSAgICBhc3NlcnQgbGVuKHN5cy5hcmd2KSA8IDMsICJUb28gbWFueSBhcmd1bWVudHMiCitkZWYgbWFpbigpOgorICAgIGlmIGxlbihzeXMuYXJndikgPj0gMzoKKyAgICAgICAgc3lzLmV4aXQoIlRvbyBtYW55IGFyZ3VtZW50cyIpCiAgICAgaWYgbGVuKHN5cy5hcmd2KSA9PSAyOgogICAgICAgICB0YXJnZXQgPSBzeXMuYXJndlsxXQogICAgIGVsc2U6CiAgICAgICAgIHRhcmdldCA9ICJQeXRob24vb3Bjb2RlX3RhcmdldHMuaCIKLSAgICBmID0gb3Blbih0YXJnZXQsICJ3IikKLSAgICB0cnk6CisgICAgd2l0aCBvcGVuKHRhcmdldCwgInciKSBhcyBmOgogICAgICAgICB3cml0ZV9jb250ZW50cyhmKQotICAgIGZpbmFsbHk6Ci0gICAgICAgIGYuY2xvc2UoKQorICAgIHByaW50KCJKdW1wIHRhYmxlIHdyaXR0ZW4gaW50byAlcyIgJSB0YXJnZXQpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL1B5dGhvbi9tYXJzaGFsLmMgYi9QeXRob24vbWFyc2hhbC5jCmluZGV4IDViOGRlOTkuLjYyN2E4NDIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9tYXJzaGFsLmMKKysrIGIvUHl0aG9uL21hcnNoYWwuYwpAQCAtMjYzLDEwICsyNjMsMTAgQEAKICAgICBpZiAoUHlfUkVGQ05UKHYpID09IDEpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgZW50cnkgPSBfUHlfaGFzaHRhYmxlX2dldF9lbnRyeShwLT5oYXNodGFibGUsIHYpOworICAgIGVudHJ5ID0gX1B5X0hBU0hUQUJMRV9HRVRfRU5UUlkocC0+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+IDgpICYgMHhmZjsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgKmNvZGVzdHIrKyA9IG9wY29kZTsKKyAgICAgICAgICAgICpjb2Rlc3RyKysgPSBvcGFyZyAmIDB4ZmY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggNDgzMTM0ZC4uMzE4YzVlNyAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw1ICsxLDUgQEAKLVRoaXMgaXMgUHl0aG9uIHZlcnNpb24gMy41LjMgcmVsZWFzZSBjYW5kaWRhdGUgMQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIGlzIFB5dGhvbiB2ZXJzaW9uIDMuNi4wIGFscGhhIDMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsCiAyMDEyLCAyMDEzLCAyMDE0LCAyMDE1LCAyMDE2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KQEAgLTI4LDkgKzI4LDkgQEAKIGVsc2V3aGVyZSBpdCdzIGp1c3QgcHl0aG9uLgogCiBPbiBNYWMgT1MgWCwgaWYgeW91IGhhdmUgY29uZmlndXJlZCBQeXRob24gd2l0aCAtLWVuYWJsZS1mcmFtZXdvcmssIHlvdSBzaG91bGQKLXVzZSAibWFrZSBmcmFtZXdvcmtpbnN0YWxsIiB0byBkbyB0aGUgaW5zdGFsbGF0aW9uLiAgTm90ZSB0aGF0IHRoaXMgaW5zdGFsbHMKLXRoZSBQeXRob24gZXhlY3V0YWJsZSBpbiBhIHBsYWNlIHRoYXQgaXMgbm90IG5vcm1hbGx5IG9uIHlvdXIgUEFUSCwgeW91IG1heQotd2FudCB0byBzZXQgdXAgYSBzeW1saW5rIGluIC91c3IvbG9jYWwvYmluLgordXNlICJtYWtlIGZyYW1ld29ya2luc3RhbGwiIHRvIGRvIHRoZSBpbnN0YWxsYXRpb24uICBOb3RlIHRoYXQgdGhpcyBpbnN0YWxscyB0aGUKK1B5dGhvbiBleGVjdXRhYmxlIGluIGEgcGxhY2UgdGhhdCBpcyBub3Qgbm9ybWFsbHkgb24geW91ciBQQVRILCB5b3UgbWF5IHdhbnQgdG8KK3NldCB1cCBhIHN5bWxpbmsgaW4gL3Vzci9sb2NhbC9iaW4uCiAKIE9uIFdpbmRvd3MsIHNlZSBQQ2J1aWxkL3JlYWRtZS50eHQuCiAKQEAgLTc5LDkgKzc5LDkgQEAKIC0tLS0tLS0tLS0KIAogV2UgaGF2ZSBhIGNvbXByZWhlbnNpdmUgb3ZlcnZpZXcgb2YgdGhlIGNoYW5nZXMgaW4gdGhlICJXaGF0J3MgTmV3IGluCi1QeXRob24gMy41IiBkb2N1bWVudCwgZm91bmQgYXQKK1B5dGhvbiAzLjYiIGRvY3VtZW50LCBmb3VuZCBhdAogCi0gICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvd2hhdHNuZXcvMy41Lmh0bWwKKyAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjYvd2hhdHNuZXcvMy42Lmh0bWwKIAogRm9yIGEgbW9yZSBkZXRhaWxlZCBjaGFuZ2UgbG9nLCByZWFkIE1pc2MvTkVXUyAodGhvdWdoIHRoaXMgZmlsZSwgdG9vLAogaXMgaW5jb21wbGV0ZSwgYW5kIGFsc28gZG9lc24ndCBsaXN0IGFueXRoaW5nIG1lcmdlZCBpbiBmcm9tIHRoZSAyLjcKQEAgLTk0LDkgKzk0LDkgQEAKIERvY3VtZW50YXRpb24KIC0tLS0tLS0tLS0tLS0KIAotRG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIDMuNSBpcyBvbmxpbmUsIHVwZGF0ZWQgZGFpbHk6CitEb2N1bWVudGF0aW9uIGZvciBQeXRob24gMy42IGlzIG9ubGluZSwgdXBkYXRlZCBkYWlseToKIAotICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy41LworICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMuNi8KIAogSXQgY2FuIGFsc28gYmUgZG93bmxvYWRlZCBpbiBtYW55IGZvcm1hdHMgZm9yIGZhc3RlciBhY2Nlc3MuICBUaGUgZG9jdW1lbnRhdGlvbgogaXMgZG93bmxvYWRhYmxlIGluIEhUTUwsIFBERiwgYW5kIHJlU3RydWN0dXJlZFRleHQgZm9ybWF0czsgdGhlIGxhdHRlciB2ZXJzaW9uCkBAIC0xMDYsNyArMTA2LDcgQEAKIElmIHlvdSB3b3VsZCBsaWtlIHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGRldmVsb3BtZW50IG9mIFB5dGhvbiwgcmVsZXZhbnQKIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0OgogCi0gICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8KKyAgICBodHRwczovL2RvY3MucHl0aG9uLm9yZy9kZXZndWlkZS8KIAogRm9yIGluZm9ybWF0aW9uIGFib3V0IGJ1aWxkaW5nIFB5dGhvbidzIGRvY3VtZW50YXRpb24sIHJlZmVyIHRvIERvYy9SRUFETUUudHh0LgogCkBAIC0xMjEsNyArMTIxLDcgQEAKIEEgc291cmNlLXRvLXNvdXJjZSB0cmFuc2xhdGlvbiB0b29sLCAiMnRvMyIsIGNhbiB0YWtlIGNhcmUgb2YgdGhlIG11bmRhbmUgdGFzawogb2YgY29udmVydGluZyBsYXJnZSBhbW91bnRzIG9mIHNvdXJjZSBjb2RlLiAgSXQgaXMgbm90IGEgY29tcGxldGUgc29sdXRpb24gYnV0CiBpcyBjb21wbGVtZW50ZWQgYnkgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmdzIGluIDIuNi4gIFNlZQotaHR0cDovL2RvY3MucHl0aG9uLm9yZy8zLjUvbGlicmFyeS8ydG8zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitodHRwczovL2RvY3MucHl0aG9uLm9yZy8zLjYvbGlicmFyeS8ydG8zLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAKIAogVGVzdGluZwpAQCAtMTUxLDE2ICsxNTEsMTYgQEAKIAogT24gVW5peCBhbmQgTWFjIHN5c3RlbXMgaWYgeW91IGludGVuZCB0byBpbnN0YWxsIG11bHRpcGxlIHZlcnNpb25zIG9mIFB5dGhvbgogdXNpbmcgdGhlIHNhbWUgaW5zdGFsbGF0aW9uIHByZWZpeCAoLS1wcmVmaXggYXJndW1lbnQgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQpCi15b3UgbXVzdCB0YWtlIGNhcmUgdGhhdCB5b3VyIHByaW1hcnkgcHl0aG9uIGV4ZWN1dGFibGUgaXMgbm90IG92ZXJ3cml0dGVuIGJ5Ci10aGUgaW5zdGFsbGF0aW9uIG9mIGEgZGlmZmVyZW50IHZlcnNpb24uICBBbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZAotdXNpbmcgIm1ha2UgYWx0aW5zdGFsbCIgY29udGFpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gYW5kIGNhbiB0aHVzIGxpdmUKLXNpZGUtYnktc2lkZS4gICJtYWtlIGluc3RhbGwiIGFsc28gY3JlYXRlcyAke3ByZWZpeH0vYmluL3B5dGhvbjMgd2hpY2ggcmVmZXJzCi10byAke3ByZWZpeH0vYmluL3B5dGhvblguWS4gIElmIHlvdSBpbnRlbmQgdG8gaW5zdGFsbCBtdWx0aXBsZSB2ZXJzaW9ucyB1c2luZwotdGhlIHNhbWUgcHJlZml4IHlvdSBtdXN0IGRlY2lkZSB3aGljaCB2ZXJzaW9uIChpZiBhbnkpIGlzIHlvdXIgInByaW1hcnkiCi12ZXJzaW9uLiAgSW5zdGFsbCB0aGF0IHZlcnNpb24gdXNpbmcgIm1ha2UgaW5zdGFsbCIuICBJbnN0YWxsIGFsbCBvdGhlcgotdmVyc2lvbnMgdXNpbmcgIm1ha2UgYWx0aW5zdGFsbCIuCit5b3UgbXVzdCB0YWtlIGNhcmUgdGhhdCB5b3VyIHByaW1hcnkgcHl0aG9uIGV4ZWN1dGFibGUgaXMgbm90IG92ZXJ3cml0dGVuIGJ5IHRoZQoraW5zdGFsbGF0aW9uIG9mIGEgZGlmZmVyZW50IHZlcnNpb24uICBBbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGluc3RhbGxlZCB1c2luZworIm1ha2UgYWx0aW5zdGFsbCIgY29udGFpbiB0aGUgbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gYW5kIGNhbiB0aHVzIGxpdmUKK3NpZGUtYnktc2lkZS4gICJtYWtlIGluc3RhbGwiIGFsc28gY3JlYXRlcyAke3ByZWZpeH0vYmluL3B5dGhvbjMgd2hpY2ggcmVmZXJzIHRvCiske3ByZWZpeH0vYmluL3B5dGhvblguWS4gIElmIHlvdSBpbnRlbmQgdG8gaW5zdGFsbCBtdWx0aXBsZSB2ZXJzaW9ucyB1c2luZyB0aGUKK3NhbWUgcHJlZml4IHlvdSBtdXN0IGRlY2lkZSB3aGljaCB2ZXJzaW9uIChpZiBhbnkpIGlzIHlvdXIgInByaW1hcnkiIHZlcnNpb24uCitJbnN0YWxsIHRoYXQgdmVyc2lvbiB1c2luZyAibWFrZSBpbnN0YWxsIi4gIEluc3RhbGwgYWxsIG90aGVyIHZlcnNpb25zIHVzaW5nCisibWFrZSBhbHRpbnN0YWxsIi4KIAotRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGluc3RhbGwgUHl0aG9uIDIuNiwgMi43IGFuZCAzLjUgd2l0aCAyLjcgYmVpbmcgdGhlCitGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gaW5zdGFsbCBQeXRob24gMi42LCAyLjcgYW5kIDMuNiB3aXRoIDIuNyBiZWluZyB0aGUKIHByaW1hcnkgdmVyc2lvbiwgeW91IHdvdWxkIGV4ZWN1dGUgIm1ha2UgaW5zdGFsbCIgaW4geW91ciAyLjcgYnVpbGQgZGlyZWN0b3J5CiBhbmQgIm1ha2UgYWx0aW5zdGFsbCIgaW4gdGhlIG90aGVycy4KIApAQCAtMTcxLDcgKzE3MSw3IEBACiBXZSdyZSBzb2xpY2l0aW5nIGJ1ZyByZXBvcnRzIGFib3V0IGFsbCBhc3BlY3RzIG9mIHRoZSBsYW5ndWFnZS4gIEZpeGVzIGFyZSBhbHNvCiB3ZWxjb21lLCBwcmVmZXJhYmx5IGluIHVuaWZpZWQgZGlmZiBmb3JtYXQuICBQbGVhc2UgdXNlIHRoZSBpc3N1ZSB0cmFja2VyOgogCi0gICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy8KKyAgICBodHRwczovL2J1Z3MucHl0aG9uLm9yZy8KIAogSWYgeW91J3JlIG5vdCBzdXJlIHdoZXRoZXIgeW91J3JlIGRlYWxpbmcgd2l0aCBhIGJ1ZyBvciBhIGZlYXR1cmUsIHVzZSB0aGUKIG1haWxpbmcgbGlzdDoKQEAgLTE4MCwyMyArMTgwLDIzIEBACiAKIFRvIHN1YnNjcmliZSB0byB0aGUgbGlzdCwgdXNlIHRoZSBtYWlsbWFuIGZvcm06CiAKLSAgICBodHRwOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vcHl0aG9uLWRldi8KKyAgICBodHRwczovL21haWwucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3B5dGhvbi1kZXYvCiAKIAogUHJvcG9zYWxzIGZvciBlbmhhbmNlbWVudAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJZiB5b3UgaGF2ZSBhIHByb3Bvc2FsIHRvIGNoYW5nZSBQeXRob24sIHlvdSBtYXkgd2FudCB0byBzZW5kIGFuIGVtYWlsIHRvIHRoZQotY29tcC5sYW5nLnB5dGhvbiBvciBweXRob24taWRlYXMgbWFpbGluZyBsaXN0cyBmb3IgaW5pdGFsIGZlZWRiYWNrLiAgQSBQeXRob24KK2NvbXAubGFuZy5weXRob24gb3IgcHl0aG9uLWlkZWFzIG1haWxpbmcgbGlzdHMgZm9yIGluaXRpYWwgZmVlZGJhY2suICBBIFB5dGhvbgogRW5oYW5jZW1lbnQgUHJvcG9zYWwgKFBFUCkgbWF5IGJlIHN1Ym1pdHRlZCBpZiB5b3VyIGlkZWEgZ2FpbnMgZ3JvdW5kLiAgQWxsCiBjdXJyZW50IFBFUHMsIGFzIHdlbGwgYXMgZ3VpZGVsaW5lcyBmb3Igc3VibWl0dGluZyBhIG5ldyBQRVAsIGFyZSBsaXN0ZWQgYXQKLWh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy8uCitodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzLy4KIAogCiBSZWxlYXNlIFNjaGVkdWxlCiAtLS0tLS0tLS0tLS0tLS0tCiAKLVNlZSBQRVAgNDc4IGZvciByZWxlYXNlIGRldGFpbHM6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ3OC8KK1NlZSBQRVAgNDk0IGZvciByZWxlYXNlIGRldGFpbHM6IGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0OTQvCiAKIAogQ29weXJpZ2h0IGFuZCBMaWNlbnNlIEluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9Ub29scy9idWlsZGJvdC90ZXN0LmJhdCBiL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CmluZGV4IGZmN2QxNjcuLjU5NzJkNWUgMTAwNjQ0Ci0tLSBhL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CisrKyBiL1Rvb2xzL2J1aWxkYm90L3Rlc3QuYmF0CkBAIC00LDcgKzQsNyBAQAogDQogc2V0IGhlcmU9JX5kcDANCiBzZXQgcnRfb3B0cz0tcSAtZA0KLXNldCByZWdydGVzdF9hcmdzPQ0KK3NldCByZWdydGVzdF9hcmdzPS1qMQ0KIA0KIDpDaGVja09wdHMNCiBpZiAiJTEiPT0iLXg2NCIgKHNldCBydF9vcHRzPSVydF9vcHRzJSAlMSkgJiBzaGlmdCAmIGdvdG8gQ2hlY2tPcHRzDQpAQCAtMTYsNCArMTYsNCBAQAogaWYgTk9UICIlMSI9PSIiIChzZXQgcmVncnRlc3RfYXJncz0lcmVncnRlc3RfYXJncyUgJTEpICYgc2hpZnQgJiBnb3RvIENoZWNrT3B0cw0KIA0KIGVjaG8gb24NCi1jYWxsICIlaGVyZSUuLlwuLlxQQ2J1aWxkXHJ0LmJhdCIgJXJ0X29wdHMlIC11YWxsIC1yd1cgLS10aW1lb3V0PTM2MDAgJXJlZ3J0ZXN0X2FyZ3MlDQorY2FsbCAiJWhlcmUlLi5cLi5cUENidWlsZFxydC5iYXQiICVydF9vcHRzJSAtdWFsbCAtcndXIC0tdGltZW91dD05MDAgJXJlZ3J0ZXN0X2FyZ3MlDQpkaWZmIC0tZ2l0IGEvVG9vbHMvY2xpbmljL2NsaW5pYy5weSBiL1Rvb2xzL2NsaW5pYy9jbGluaWMucHkKaW5kZXggZjYxNWVkOS4uZjliYTE2YyAxMDA3NTUKLS0tIGEvVG9vbHMvY2xpbmljL2NsaW5pYy5weQorKysgYi9Ub29scy9jbGluaWMvY2xpbmljLnB5CkBAIC02NDQsNyArNjQ0LDcgQEAKICAgICAgICAgZGVmYXVsdF9yZXR1cm5fY29udmVydGVyID0gKG5vdCBmLnJldHVybl9jb252ZXJ0ZXIgb3IKICAgICAgICAgICAgIGYucmV0dXJuX2NvbnZlcnRlci50eXBlID09ICdQeU9iamVjdCAqJykKIAotICAgICAgICBwb3NpdGlvbmFsID0gcGFyYW1ldGVycyBhbmQgKHBhcmFtZXRlcnNbLTFdLmtpbmQgPT0gaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZKQorICAgICAgICBwb3NpdGlvbmFsID0gcGFyYW1ldGVycyBhbmQgcGFyYW1ldGVyc1stMV0uaXNfcG9zaXRpb25hbF9vbmx5KCkKICAgICAgICAgYWxsX2JvcmluZ19vYmplY3RzID0gRmFsc2UgIyB5ZXMsIHRoaXMgd2lsbCBiZSBmYWxzZSBpZiB0aGVyZSBhcmUgMCBwYXJhbWV0ZXJzLCBpdCdzIGZpbmUKICAgICAgICAgZmlyc3Rfb3B0aW9uYWwgPSBsZW4ocGFyYW1ldGVycykKICAgICAgICAgZm9yIGksIHAgaW4gZW51bWVyYXRlKHBhcmFtZXRlcnMpOgpAQCAtNjYxLDcgKzY2MSw3IEBACiAgICAgICAgIG5ld19vcl9pbml0ID0gZi5raW5kIGluIChNRVRIT0RfTkVXLCBNRVRIT0RfSU5JVCkKIAogICAgICAgICBtZXRoX28gPSAobGVuKHBhcmFtZXRlcnMpID09IDEgYW5kCi0gICAgICAgICAgICAgIHBhcmFtZXRlcnNbMF0ua2luZCA9PSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFkgYW5kCisgICAgICAgICAgICAgIHBhcmFtZXRlcnNbMF0uaXNfcG9zaXRpb25hbF9vbmx5KCkgYW5kCiAgICAgICAgICAgICAgIG5vdCBjb252ZXJ0ZXJzWzBdLmlzX29wdGlvbmFsKCkgYW5kCiAgICAgICAgICAgICAgIG5vdCBuZXdfb3JfaW5pdCkKIApAQCAtNzk3LDggKzc5Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgICIiIiAlIGFyZ25hbWUpCiAKICAgICAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgotICAgICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKCVzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKCVzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKSB7ewogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAiIiIgJSBhcmduYW1lLCBpbmRlbnQ9NCkpCiAKICAgICAgICAgZWxpZiBoYXNfb3B0aW9uX2dyb3VwczoKQEAgLTgyMiw4ICs4MjMsOSBAQAogICAgICAgICAgICAgcGFyc2VyX2RlZmluaXRpb24gPSBwYXJzZXJfYm9keShwYXJzZXJfcHJvdG90eXBlLCBub3JtYWxpemVfc25pcHBldCgiIiIKICAgICAgICAgICAgICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJ7bmFtZX0iLAogICAgICAgICAgICAgICAgICAgICB7dW5wYWNrX21pbn0sIHt1bnBhY2tfbWF4fSwKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogCiAgICAgICAgIGVsaWYgcG9zaXRpb25hbDoKQEAgLTgzNSw4ICs4MzcsOSBAQAogCiAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgogICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9IiwKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogCiAgICAgICAgIGVsc2U6CkBAIC04NDcsMTMgKzg1MCwxNSBAQAogCiAgICAgICAgICAgICBib2R5ID0gbm9ybWFsaXplX3NuaXBwZXQoIiIiCiAgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9IiwgX2tleXdvcmRzLAotICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpCisgICAgICAgICAgICAgICAgICAgIHtwYXJzZV9hcmd1bWVudHN9KSkge3sKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkKKyAgICAgICAgICAgICAgICB9fQorICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpCiAgICAgICAgICAgICBwYXJzZXJfZGVmaW5pdGlvbiA9IHBhcnNlcl9ib2R5KHBhcnNlcl9wcm90b3R5cGUsIG5vcm1hbGl6ZV9zbmlwcGV0KCIiIgogICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIntmb3JtYXRfdW5pdHN9OntuYW1lfSIsIF9rZXl3b3JkcywKLSAgICAgICAgICAgICAgICAgICAge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICAgICAgICAgICAgICB7cGFyc2VfYXJndW1lbnRzfSkpIHt7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogICAgICAgICAgICAgcGFyc2VyX2RlZmluaXRpb24gPSBpbnNlcnRfa2V5d29yZHMocGFyc2VyX2RlZmluaXRpb24pCiAKQEAgLTg3OCwxMyArODgzLDE1IEBACiAKICAgICAgICAgICAgIGlmIG5vdCBwYXJzZXNfa2V5d29yZHM6CiAgICAgICAgICAgICAgICAgZmllbGRzLmluc2VydCgwLCBub3JtYWxpemVfc25pcHBldCgiIiIKLSAgICAgICAgICAgICAgICAgICAgaWYgKHtzZWxmX3R5cGVfY2hlY2t9IV9QeUFyZ19Ob0tleXdvcmRzKCJ7bmFtZX0iLCBrd2FyZ3MpKQorICAgICAgICAgICAgICAgICAgICBpZiAoe3NlbGZfdHlwZV9jaGVja30hX1B5QXJnX05vS2V5d29yZHMoIntuYW1lfSIsIGt3YXJncykpIHt7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgIH19CiAgICAgICAgICAgICAgICAgICAgICIiIiwgaW5kZW50PTQpKQogICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJzZXNfcG9zaXRpb25hbDoKICAgICAgICAgICAgICAgICAgICAgZmllbGRzLmluc2VydCgwLCBub3JtYWxpemVfc25pcHBldCgiIiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh7c2VsZl90eXBlX2NoZWNrfSFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJ7bmFtZX0iLCBhcmdzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh7c2VsZl90eXBlX2NoZWNrfSFfUHlBcmdfTm9Qb3NpdGlvbmFsKCJ7bmFtZX0iLCBhcmdzKSkge3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9fQogICAgICAgICAgICAgICAgICAgICAgICAgIiIiLCBpbmRlbnQ9NCkpCiAKICAgICAgICAgICAgIHBhcnNlcl9kZWZpbml0aW9uID0gcGFyc2VyX2JvZHkocGFyc2VyX3Byb3RvdHlwZSwgKmZpZWxkcykKQEAgLTEwMzIsOCArMTAzOSw5IEBACiAKICAgICAgICAgICAgIHMgPSAiIiIKICAgICBjYXNlIHtjb3VudH06Ci0gICAgICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAie2Zvcm1hdF91bml0c306e25hbWV9Iiwge3BhcnNlX2FyZ3VtZW50c30pKQorICAgICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIntmb3JtYXRfdW5pdHN9OntuYW1lfSIsIHtwYXJzZV9hcmd1bWVudHN9KSkge3sKICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfX0KICAgICAgICAge2dyb3VwX2Jvb2xlYW5zfQogICAgICAgICBicmVhazsKICIiIlsxOl0KQEAgLTEwNjcsNyArMTA3NSw3IEBACiAKICAgICAgICAgbGFzdF9ncm91cCA9IDAKICAgICAgICAgZmlyc3Rfb3B0aW9uYWwgPSBsZW4oc2VsZmxlc3MpCi0gICAgICAgIHBvc2l0aW9uYWwgPSBzZWxmbGVzcyBhbmQgc2VsZmxlc3NbLTFdLmtpbmQgPT0gaW5zcGVjdC5QYXJhbWV0ZXIuUE9TSVRJT05BTF9PTkxZCisgICAgICAgIHBvc2l0aW9uYWwgPSBzZWxmbGVzcyBhbmQgc2VsZmxlc3NbLTFdLmlzX3Bvc2l0aW9uYWxfb25seSgpCiAgICAgICAgIG5ld19vcl9pbml0ID0gZi5raW5kIGluIChNRVRIT0RfTkVXLCBNRVRIT0RfSU5JVCkKICAgICAgICAgZGVmYXVsdF9yZXR1cm5fY29udmVydGVyID0gKG5vdCBmLnJldHVybl9jb252ZXJ0ZXIgb3IKICAgICAgICAgICAgIGYucmV0dXJuX2NvbnZlcnRlci50eXBlID09ICdQeU9iamVjdCAqJykKQEAgLTIzNTksNyArMjM2NywxMCBAQAogICAgICAgICAgICAgZGF0YS5tb2RpZmljYXRpb25zLmFwcGVuZCgnLyogbW9kaWZpY2F0aW9ucyBmb3IgJyArIG5hbWUgKyAnICovXG4nICsgbW9kaWZpY2F0aW9ucy5yc3RyaXAoKSkKIAogICAgICAgICAjIGtleXdvcmRzCi0gICAgICAgIGRhdGEua2V5d29yZHMuYXBwZW5kKHBhcmFtZXRlci5uYW1lKQorICAgICAgICBpZiBwYXJhbWV0ZXIuaXNfcG9zaXRpb25hbF9vbmx5KCk6CisgICAgICAgICAgICBkYXRhLmtleXdvcmRzLmFwcGVuZCgnJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEua2V5d29yZHMuYXBwZW5kKHBhcmFtZXRlci5uYW1lKQogCiAgICAgICAgICMgZm9ybWF0X3VuaXRzCiAgICAgICAgIGlmIHNlbGYuaXNfb3B0aW9uYWwoKSBhbmQgJ3wnIG5vdCBpbiBkYXRhLmZvcm1hdF91bml0czoKQEAgLTI2NzYsNyArMjY4Nyw3IEBACiAgICAgZGVmIGNsZWFudXAoc2VsZik6CiAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CiAgICAgICAgICAgICBuYW1lID0gZW5zdXJlX2xlZ2FsX2NfaWRlbnRpZmllcihzZWxmLm5hbWUpCi0gICAgICAgICAgICByZXR1cm4gIiIuam9pbihbImlmICgiLCBuYW1lLCAiKVxuICAgUHlNZW1fRlJFRSgiLCBuYW1lLCAiKTtcbiJdKQorICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4oWyJpZiAoIiwgbmFtZSwgIikge1xuICAgUHlNZW1fRlJFRSgiLCBuYW1lLCAiKTtcbn1cbiJdKQogCiAjCiAjIFRoaXMgaXMgdGhlIGZvdXJ0aCBvciBmaWZ0aCByZXdyaXRlIG9mIHJlZ2lzdGVyaW5nIGFsbCB0aGUKQEAgLTI3ODYsNyArMjc5Nyw3IEBACiAKICAgICBkZWYgY2xlYW51cChzZWxmKToKICAgICAgICAgbmFtZSA9IGVuc3VyZV9sZWdhbF9jX2lkZW50aWZpZXIoc2VsZi5uYW1lKQotICAgICAgICByZXR1cm4gIiIuam9pbihbImlmICgiLCBuYW1lLCAiLm9iailcbiAgIFB5QnVmZmVyX1JlbGVhc2UoJiIsIG5hbWUsICIpO1xuIl0pCisgICAgICAgIHJldHVybiAiIi5qb2luKFsiaWYgKCIsIG5hbWUsICIub2JqKSB7XG4gICBQeUJ1ZmZlcl9SZWxlYXNlKCYiLCBuYW1lLCAiKTtcbn1cbiJdKQogCiAKIGRlZiBjb3JyZWN0X25hbWVfZm9yX3NlbGYoZik6CkBAIC0yOTU5LDEwICsyOTcwLDEwIEBACiAgICAgICAgIGRhdGEucmV0dXJuX3ZhbHVlID0gbmFtZQogCiAgICAgZGVmIGVycl9vY2N1cnJlZF9pZihzZWxmLCBleHByLCBkYXRhKToKLSAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICgoe30pICYmIFB5RXJyX09jY3VycmVkKCkpXG4gICAgZ290byBleGl0O1xuJy5mb3JtYXQoZXhwcikpCisgICAgICAgIGRhdGEucmV0dXJuX2NvbnZlcnNpb24uYXBwZW5kKCdpZiAoKHt9KSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7e1xuICAgIGdvdG8gZXhpdDtcbn19XG4nLmZvcm1hdChleHByKSkKIAogICAgIGRlZiBlcnJfb2NjdXJyZWRfaWZfbnVsbF9wb2ludGVyKHNlbGYsIHZhcmlhYmxlLCBkYXRhKToKLSAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICh7fSA9PSBOVUxMKVxuICAgIGdvdG8gZXhpdDtcbicuZm9ybWF0KHZhcmlhYmxlKSkKKyAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJ2lmICh7fSA9PSBOVUxMKSB7e1xuICAgIGdvdG8gZXhpdDtcbn19XG4nLmZvcm1hdCh2YXJpYWJsZSkpCiAKICAgICBkZWYgcmVuZGVyKHNlbGYsIGZ1bmN0aW9uLCBkYXRhKToKICAgICAgICAgIiIiCkBAIC0yOTc3LDggKzI5ODgsOSBAQAogICAgIGRlZiByZW5kZXIoc2VsZiwgZnVuY3Rpb24sIGRhdGEpOgogICAgICAgICBzZWxmLmRlY2xhcmUoZGF0YSkKICAgICAgICAgZGF0YS5yZXR1cm5fY29udmVyc2lvbi5hcHBlbmQoJycnCi1pZiAoX3JldHVybl92YWx1ZSAhPSBQeV9Ob25lKQoraWYgKF9yZXR1cm5fdmFsdWUgIT0gUHlfTm9uZSkgewogICAgIGdvdG8gZXhpdDsKK30KIHJldHVybl92YWx1ZSA9IFB5X05vbmU7CiBQeV9JTkNSRUYoUHlfTm9uZSk7CiAnJycuc3RyaXAoKSkKQEAgLTMxODMsNiArMzE5NSw3IEBACiAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlX2RzbF9zdGFydAogICAgICAgICBzZWxmLnBhcmFtZXRlcl9pbmRlbnQgPSBOb25lCiAgICAgICAgIHNlbGYua2V5d29yZF9vbmx5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5wb3NpdGlvbmFsX29ubHkgPSBGYWxzZQogICAgICAgICBzZWxmLmdyb3VwID0gMAogICAgICAgICBzZWxmLnBhcmFtZXRlcl9zdGF0ZSA9IHNlbGYucHNfc3RhcnQKICAgICAgICAgc2VsZi5zZWVuX3Bvc2l0aW9uYWxfd2l0aF9kZWZhdWx0ID0gRmFsc2UKQEAgLTM1NjEsOCArMzU3NCw4IEBACiAgICAgIyAicGFyYW1ldGVyX3N0YXRlIi4gIChQcmV2aW91c2x5IHRoZSBjb2RlIHdhcyBhIG1pYXNtYSBvZiBpZnMgYW5kCiAgICAgIyBzZXBhcmF0ZSBib29sZWFuIHN0YXRlIHZhcmlhYmxlcy4pICBUaGUgc3RhdGVzIGFyZToKICAgICAjCi0gICAgIyAgWyBbIGEsIGIsIF0gYywgXSBkLCBlLCBmPTMsIFsgZywgaCwgWyBpIF0gXSAvICAgPC0gbGluZQotICAgICMgMDEgICAyICAgICAgICAgIDMgICAgICAgNCAgICA1ICAgICAgICAgICA2ICAgNyAgIDwtIHN0YXRlIHRyYW5zaXRpb25zCisgICAgIyAgWyBbIGEsIGIsIF0gYywgXSBkLCBlLCBmPTMsIFsgZywgaCwgWyBpIF0gXSAgIDwtIGxpbmUKKyAgICAjIDAxICAgMiAgICAgICAgICAzICAgICAgIDQgICAgNSAgICAgICAgICAgNiAgICAgPC0gc3RhdGUgdHJhbnNpdGlvbnMKICAgICAjCiAgICAgIyAwOiBwc19zdGFydC4gIGJlZm9yZSB3ZSd2ZSBzZWVuIGFueXRoaW5nLiAgbGVnYWwgdHJhbnNpdGlvbnMgYXJlIHRvIDEgb3IgMy4KICAgICAjIDE6IHBzX2xlZnRfc3F1YXJlX2JlZm9yZS4gIGxlZnQgc3F1YXJlIGJyYWNrZXRzIGJlZm9yZSByZXF1aXJlZCBwYXJhbWV0ZXJzLgpAQCAtMzU3Myw5ICszNTg2LDggQEAKICAgICAjICAgIG5vdyBtdXN0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgIyA1OiBwc19ncm91cF9hZnRlci4gIGluIGEgZ3JvdXAsIGFmdGVyIHJlcXVpcmVkIHBhcmFtZXRlcnMuCiAgICAgIyA2OiBwc19yaWdodF9zcXVhcmVfYWZ0ZXIuICByaWdodCBzcXVhcmUgYnJhY2tldHMgYWZ0ZXIgcmVxdWlyZWQgcGFyYW1ldGVycy4KLSAgICAjIDc6IHBzX3NlZW5fc2xhc2guICBzZWVuIHNsYXNoLgogICAgIHBzX3N0YXJ0LCBwc19sZWZ0X3NxdWFyZV9iZWZvcmUsIHBzX2dyb3VwX2JlZm9yZSwgcHNfcmVxdWlyZWQsIFwKLSAgICBwc19vcHRpb25hbCwgcHNfZ3JvdXBfYWZ0ZXIsIHBzX3JpZ2h0X3NxdWFyZV9hZnRlciwgcHNfc2Vlbl9zbGFzaCA9IHJhbmdlKDgpCisgICAgcHNfb3B0aW9uYWwsIHBzX2dyb3VwX2FmdGVyLCBwc19yaWdodF9zcXVhcmVfYWZ0ZXIgPSByYW5nZSg3KQogCiAgICAgZGVmIHN0YXRlX3BhcmFtZXRlcnNfc3RhcnQoc2VsZiwgbGluZSk6CiAgICAgICAgIGlmIHNlbGYuaWdub3JlX2xpbmUobGluZSk6CkBAIC0zODU0LDkgKzM4NjYsNiBAQAogICAgICAgICByZXR1cm4gbmFtZSwgRmFsc2UsIGt3YXJncwogCiAgICAgZGVmIHBhcnNlX3NwZWNpYWxfc3ltYm9sKHNlbGYsIHN5bWJvbCk6Ci0gICAgICAgIGlmIHNlbGYucGFyYW1ldGVyX3N0YXRlID09IHNlbGYucHNfc2Vlbl9zbGFzaDoKLSAgICAgICAgICAgIGZhaWwoIkZ1bmN0aW9uICIgKyBzZWxmLmZ1bmN0aW9uLm5hbWUgKyAiIHNwZWNpZmllcyAiICsgc3ltYm9sICsgIiBhZnRlciAvLCB3aGljaCBpcyB1bnN1cHBvcnRlZC4iKQotCiAgICAgICAgIGlmIHN5bWJvbCA9PSAnKic6CiAgICAgICAgICAgICBpZiBzZWxmLmtleXdvcmRfb25seToKICAgICAgICAgICAgICAgICBmYWlsKCJGdW5jdGlvbiAiICsgc2VsZi5mdW5jdGlvbi5uYW1lICsgIiB1c2VzICcqJyBtb3JlIHRoYW4gb25jZS4iKQpAQCAtMzg4MywxMyArMzg5MiwxNSBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBmYWlsKCJGdW5jdGlvbiAiICsgc2VsZi5mdW5jdGlvbi5uYW1lICsgIiBoYXMgYW4gdW5zdXBwb3J0ZWQgZ3JvdXAgY29uZmlndXJhdGlvbi4gKFVuZXhwZWN0ZWQgc3RhdGUgIiArIHN0cihzZWxmLnBhcmFtZXRlcl9zdGF0ZSkgKyAiLmMpIikKICAgICAgICAgZWxpZiBzeW1ib2wgPT0gJy8nOgorICAgICAgICAgICAgaWYgc2VsZi5wb3NpdGlvbmFsX29ubHk6CisgICAgICAgICAgICAgICAgZmFpbCgiRnVuY3Rpb24gIiArIHNlbGYuZnVuY3Rpb24ubmFtZSArICIgdXNlcyAnLycgbW9yZSB0aGFuIG9uY2UuIikKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb25hbF9vbmx5ID0gVHJ1ZQogICAgICAgICAgICAgIyBwc19yZXF1aXJlZCBhbmQgcHNfb3B0aW9uYWwgYXJlIGFsbG93ZWQgaGVyZSwgdGhhdCBhbGxvd3MgcG9zaXRpb25hbC1vbmx5IHdpdGhvdXQgb3B0aW9uIGdyb3VwcwogICAgICAgICAgICAgIyB0byB3b3JrIChhbmQgaGF2ZSBkZWZhdWx0IHZhbHVlcyEpCiAgICAgICAgICAgICBpZiAoc2VsZi5wYXJhbWV0ZXJfc3RhdGUgbm90IGluIChzZWxmLnBzX3JlcXVpcmVkLCBzZWxmLnBzX29wdGlvbmFsLCBzZWxmLnBzX3JpZ2h0X3NxdWFyZV9hZnRlciwgc2VsZi5wc19ncm91cF9iZWZvcmUpKSBvciBzZWxmLmdyb3VwOgogICAgICAgICAgICAgICAgIGZhaWwoIkZ1bmN0aW9uICIgKyBzZWxmLmZ1bmN0aW9uLm5hbWUgKyAiIGhhcyBhbiB1bnN1cHBvcnRlZCBncm91cCBjb25maWd1cmF0aW9uLiAoVW5leHBlY3RlZCBzdGF0ZSAiICsgc3RyKHNlbGYucGFyYW1ldGVyX3N0YXRlKSArICIuZCkiKQogICAgICAgICAgICAgaWYgc2VsZi5rZXl3b3JkX29ubHk6CiAgICAgICAgICAgICAgICAgZmFpbCgiRnVuY3Rpb24gIiArIHNlbGYuZnVuY3Rpb24ubmFtZSArICIgbWl4ZXMga2V5d29yZC1vbmx5IGFuZCBwb3NpdGlvbmFsLW9ubHkgcGFyYW1ldGVycywgd2hpY2ggaXMgdW5zdXBwb3J0ZWQuIikKLSAgICAgICAgICAgIHNlbGYucGFyYW1ldGVyX3N0YXRlID0gc2VsZi5wc19zZWVuX3NsYXNoCiAgICAgICAgICAgICAjIGZpeHVwIHByZWNlZGluZyBwYXJhbWV0ZXJzCiAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLmZ1bmN0aW9uLnBhcmFtZXRlcnMudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgaWYgKHAua2luZCAhPSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09SX0tFWVdPUkQgYW5kIG5vdCBpc2luc3RhbmNlKHAuY29udmVydGVyLCBzZWxmX2NvbnZlcnRlcikpOgpAQCAtMzk3NywyMyArMzk4OCwyMCBAQAogICAgICAgICAjIHBvcHVsYXRlICJyaWdodF9icmFja2V0X2NvdW50IiBmaWVsZCBmb3IgZXZlcnkgcGFyYW1ldGVyCiAgICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzLCAiV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIGEgc2VsZiBwYXJhbWV0ZXIuICIgKyByZXByKGYpCiAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHBhcmFtZXRlcnNbMF0uY29udmVydGVyLCBzZWxmX2NvbnZlcnRlcikKKyAgICAgICAgIyBzZWxmIGlzIGFsd2F5cyBwb3NpdGlvbmFsLW9ubHkuCisgICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzWzBdLmlzX3Bvc2l0aW9uYWxfb25seSgpCiAgICAgICAgIHBhcmFtZXRlcnNbMF0ucmlnaHRfYnJhY2tldF9jb3VudCA9IDAKLSAgICAgICAgcGFyYW1ldGVyc19hZnRlcl9zZWxmID0gcGFyYW1ldGVyc1sxOl0KLSAgICAgICAgaWYgcGFyYW1ldGVyc19hZnRlcl9zZWxmOgotICAgICAgICAgICAgIyBmb3Igbm93LCB0aGUgb25seSB3YXkgQ2xpbmljIHN1cHBvcnRzIHBvc2l0aW9uYWwtb25seSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAjIGlzIGlmIGFsbCBvZiB0aGVtIGFyZSBwb3NpdGlvbmFsLW9ubHkuLi4KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgLi4uIGV4Y2VwdCBmb3Igc2VsZiEgIHNlbGYgaXMgYWx3YXlzIHBvc2l0aW9uYWwtb25seS4KLQotICAgICAgICAgICAgcG9zaXRpb25hbF9vbmx5X3BhcmFtZXRlcnMgPSBbcC5raW5kID09IGluc3BlY3QuUGFyYW1ldGVyLlBPU0lUSU9OQUxfT05MWSBmb3IgcCBpbiBwYXJhbWV0ZXJzX2FmdGVyX3NlbGZdCi0gICAgICAgICAgICBpZiBwYXJhbWV0ZXJzX2FmdGVyX3NlbGZbMF0ua2luZCA9PSBpbnNwZWN0LlBhcmFtZXRlci5QT1NJVElPTkFMX09OTFk6Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGFsbChwb3NpdGlvbmFsX29ubHlfcGFyYW1ldGVycykKLSAgICAgICAgICAgICAgICBmb3IgcCBpbiBwYXJhbWV0ZXJzOgotICAgICAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSBhYnMocC5ncm91cCkKKyAgICAgICAgcG9zaXRpb25hbF9vbmx5ID0gVHJ1ZQorICAgICAgICBmb3IgcCBpbiBwYXJhbWV0ZXJzWzE6XToKKyAgICAgICAgICAgIGlmIG5vdCBwLmlzX3Bvc2l0aW9uYWxfb25seSgpOgorICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxfb25seSA9IEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCBwb3NpdGlvbmFsX29ubHkKKyAgICAgICAgICAgIGlmIHBvc2l0aW9uYWxfb25seToKKyAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSBhYnMocC5ncm91cCkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgIyBkb24ndCBwdXQgYW55IHJpZ2h0IGJyYWNrZXRzIGFyb3VuZCBub24tcG9zaXRpb25hbC1vbmx5IHBhcmFtZXRlcnMsIGV2ZXIuCi0gICAgICAgICAgICAgICAgZm9yIHAgaW4gcGFyYW1ldGVyc19hZnRlcl9zZWxmOgotICAgICAgICAgICAgICAgICAgICBwLnJpZ2h0X2JyYWNrZXRfY291bnQgPSAwCisgICAgICAgICAgICAgICAgcC5yaWdodF9icmFja2V0X2NvdW50ID0gMAogCiAgICAgICAgIHJpZ2h0X2JyYWNrZXRfY291bnQgPSAwCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL2ZyZWV6ZS9mcmVlemUucHkgYi9Ub29scy9mcmVlemUvZnJlZXplLnB5CmluZGV4IGMwNzU4MDcuLjM4OWZmZmQgMTAwNzU1Ci0tLSBhL1Rvb2xzL2ZyZWV6ZS9mcmVlemUucHkKKysrIGIvVG9vbHMvZnJlZXplL2ZyZWV6ZS5weQpAQCAtMjE4LDcgKzIxOCw3IEBACiAgICAgaXNob21lID0gb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHByZWZpeCwgJ1B5dGhvbicsICdjZXZhbC5jJykpCiAKICAgICAjIGxvY2F0aW9ucyBkZXJpdmVkIGZyb20gb3B0aW9ucwotICAgIHZlcnNpb24gPSBzeXMudmVyc2lvbls6M10KKyAgICB2ZXJzaW9uID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCiAgICAgZmxhZ2dlZF92ZXJzaW9uID0gdmVyc2lvbiArIHN5cy5hYmlmbGFncwogICAgIGlmIHdpbjoKICAgICAgICAgZXh0ZW5zaW9uc19jID0gJ2Zyb3plbl9leHRlbnNpb25zLmMnCmRpZmYgLS1naXQgYS9Ub29scy9pMThuL3B5Z2V0dGV4dC5weSBiL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CmluZGV4IDNjNmMxNGMuLmJlOTQxYzcgMTAwNzU1Ci0tLSBhL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CisrKyBiL1Rvb2xzL2kxOG4vcHlnZXR0ZXh0LnB5CkBAIC0xNTYsNyArMTU2LDggQEAKICIiIikKIAogaW1wb3J0IG9zCi1pbXBvcnQgaW1wCitpbXBvcnQgaW1wb3J0bGliLm1hY2hpbmVyeQoraW1wb3J0IGltcG9ydGxpYi51dGlsCiBpbXBvcnQgc3lzCiBpbXBvcnQgZ2xvYgogaW1wb3J0IHRpbWUKQEAgLTI2Myw4ICsyNjQsNyBAQAogICAgICMgZ2V0IGV4dGVuc2lvbiBmb3IgcHl0aG9uIHNvdXJjZSBmaWxlcwogICAgIGlmICdfcHlfZXh0JyBub3QgaW4gZ2xvYmFscygpOgogICAgICAgICBnbG9iYWwgX3B5X2V4dAotICAgICAgICBfcHlfZXh0ID0gW3RyaXBsZVswXSBmb3IgdHJpcGxlIGluIGltcC5nZXRfc3VmZml4ZXMoKQotICAgICAgICAgICAgICAgICAgIGlmIHRyaXBsZVsyXSA9PSBpbXAuUFlfU09VUkNFXVswXQorICAgICAgICBfcHlfZXh0ID0gaW1wb3J0bGliLm1hY2hpbmVyeS5TT1VSQ0VfU1VGRklYRVNbMF0KIAogICAgICMgZG9uJ3QgcmVjdXJzZSBpbnRvIENWUyBkaXJlY3RvcmllcwogICAgIGlmICdDVlMnIGluIG5hbWVzOgpAQCAtMjc3LDQ1ICsyNzcsNiBAQAogICAgICAgICApCiAKIAotZGVmIF9nZXRfbW9kcGtnX3BhdGgoZG90dGVkX25hbWUsIHBhdGhsaXN0PU5vbmUpOgotICAgICIiIkdldCB0aGUgZmlsZXN5c3RlbSBwYXRoIGZvciBhIG1vZHVsZSBvciBhIHBhY2thZ2UuCi0KLSAgICBSZXR1cm4gdGhlIGZpbGUgc3lzdGVtIHBhdGggdG8gYSBmaWxlIGZvciBhIG1vZHVsZSwgYW5kIHRvIGEgZGlyZWN0b3J5IGZvcgotICAgIGEgcGFja2FnZS4gUmV0dXJuIE5vbmUgaWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kLCBvciBpcyBhIGJ1aWx0aW4gb3IKLSAgICBleHRlbnNpb24gbW9kdWxlLgotICAgICIiIgotICAgICMgc3BsaXQgb2ZmIHRvcC1tb3N0IG5hbWUKLSAgICBwYXJ0cyA9IGRvdHRlZF9uYW1lLnNwbGl0KCcuJywgMSkKLQotICAgIGlmIGxlbihwYXJ0cykgPiAxOgotICAgICAgICAjIHdlIGhhdmUgYSBkb3R0ZWQgcGF0aCwgaW1wb3J0IHRvcC1sZXZlbCBwYWNrYWdlCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZShwYXJ0c1swXSwgcGF0aGxpc3QpCi0gICAgICAgICAgICBpZiBmaWxlOiBmaWxlLmNsb3NlKCkKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICAjIGNoZWNrIGlmIGl0J3MgaW5kZWVkIGEgcGFja2FnZQotICAgICAgICBpZiBkZXNjcmlwdGlvblsyXSA9PSBpbXAuUEtHX0RJUkVDVE9SWToKLSAgICAgICAgICAgICMgcmVjdXJzaXZlbHkgaGFuZGxlIHRoZSByZW1haW5pbmcgbmFtZSBwYXJ0cwotICAgICAgICAgICAgcGF0aG5hbWUgPSBfZ2V0X21vZHBrZ19wYXRoKHBhcnRzWzFdLCBbcGF0aG5hbWVdKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCi0gICAgZWxzZToKLSAgICAgICAgIyBwbGFpbiBuYW1lCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZpbGUsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZSgKLSAgICAgICAgICAgICAgICBkb3R0ZWRfbmFtZSwgcGF0aGxpc3QpCi0gICAgICAgICAgICBpZiBmaWxlOgotICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQotICAgICAgICAgICAgaWYgZGVzY3JpcHRpb25bMl0gbm90IGluIFtpbXAuUFlfU09VUkNFLCBpbXAuUEtHX0RJUkVDVE9SWV06Ci0gICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBOb25lCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgIHBhdGhuYW1lID0gTm9uZQotCi0gICAgcmV0dXJuIHBhdGhuYW1lCi0KLQogZGVmIGdldEZpbGVzRm9yTmFtZShuYW1lKToKICAgICAiIiJHZXQgYSBsaXN0IG9mIG1vZHVsZSBmaWxlcyBmb3IgYSBmaWxlbmFtZSwgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lLAogICAgIG9yIGEgZGlyZWN0b3J5LgpAQCAtMzMwLDcgKzI5MSwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIGxpc3QKIAogICAgICAgICAjIHRyeSB0byBmaW5kIG1vZHVsZSBvciBwYWNrYWdlCi0gICAgICAgIG5hbWUgPSBfZ2V0X21vZHBrZ19wYXRoKG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5maW5kX3NwZWMobmFtZSkKKyAgICAgICAgICAgIG5hbWUgPSBzcGVjLm9yaWdpbgorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBuYW1lID0gTm9uZQogICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgIHJldHVybiBbXQogCmRpZmYgLS1naXQgYS9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMgYi9Ub29scy9tc2kvbGliL2xpYl9maWxlcy53eHMKaW5kZXggZmE3OWE4ZC4uODA0YWIwMSAxMDA2NDQKLS0tIGEvVG9vbHMvbXNpL2xpYi9saWJfZmlsZXMud3hzCisrKyBiL1Rvb2xzL21zaS9saWIvbGliX2ZpbGVzLnd4cwpAQCAtNjQsMTYgKzY0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIDxSZWdpc3RyeVZhbHVlIEtleT0iUHl0aG9uUGF0aCIgVHlwZT0ic3RyaW5nIiBWYWx1ZT0iW0xpYl07W0RMTHNdIiAvPgogICAgICAgICAgICAgICAgIDwvUmVnaXN0cnlLZXk+CiAgICAgICAgICAgICA8L0NvbXBvbmVudD4KLSAgICAgICAgICAgIDxDb21wb25lbnQgSWQ9IkxpYl9zaXRlX3BhY2thZ2VzX1JFQURNRSIgRGlyZWN0b3J5PSJMaWJfc2l0ZV9wYWNrYWdlcyIgR3VpZD0iKiI+Ci0gICAgICAgICAgICAgICAgPEZpbGUgSWQ9IkxpYl9zaXRlX3BhY2thZ2VzX1JFQURNRSIgTmFtZT0iUkVBRE1FLnR4dCIgU291cmNlPSIhKGJpbmRwYXRoLnNyYylMaWJcc2l0ZS1wYWNrYWdlc1xSRUFETUUiIEtleVBhdGg9InllcyIgLz4KLSAgICAgICAgICAgIDwvQ29tcG9uZW50PgogICAgICAgICAgICAgPENvbXBvbmVudCBJZD0iTGliMnRvM19waWNrbGVfcmVtb3ZlIiBEaXJlY3Rvcnk9IkxpYl9saWIydG8zIiBHdWlkPSIkKHZhci5SZW1vdmVMaWIydG8zUGlja2xlQ29tcG9uZW50R3VpZCkiPgogICAgICAgICAgICAgICAgIDxSZW1vdmVGaWxlIElkPSJMaWIydG8zX3BpY2tsZV9yZW1vdmVfZmlsZXMiIE5hbWU9IioucGlja2xlIiBPbj0idW5pbnN0YWxsIiAvPgogICAgICAgICAgICAgICAgIDxSZW1vdmVGb2xkZXIgSWQ9IkxpYjJ0bzNfcGlja2xlX3JlbW92ZV9mb2xkZXIiIE9uPSJ1bmluc3RhbGwiIC8+CiAgICAgICAgICAgICA8L0NvbXBvbmVudD4KICAgICAgICAgPC9Db21wb25lbnRHcm91cD4KLSAgICAgICAgPERpcmVjdG9yeVJlZiBJZD0iTGliIj4KLSAgICAgICAgICAgIDxEaXJlY3RvcnkgSWQ9IkxpYl9zaXRlX3BhY2thZ2VzIiBOYW1lPSJzaXRlLXBhY2thZ2VzIiAvPgotICAgICAgICA8L0RpcmVjdG9yeVJlZj4KICAgICA8L0ZyYWdtZW50PgogPC9XaXg+CmRpZmYgLS1naXQgYS9Ub29scy9wYXJzZXIvdW5wYXJzZS5weSBiL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CmluZGV4IDI4NTAzMGUuLjcyMDMwNTcgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CisrKyBiL1Rvb2xzL3BhcnNlci91bnBhcnNlLnB5CkBAIC0zMjIsOSArMzIyLDcyIEBACiAgICAgZGVmIF9TdHIoc2VsZiwgdHJlZSk6CiAgICAgICAgIHNlbGYud3JpdGUocmVwcih0cmVlLnMpKQogCisgICAgZGVmIF9Kb2luZWRTdHIoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoImYiKQorICAgICAgICBzdHJpbmcgPSBpby5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuX2ZzdHJpbmdfSm9pbmVkU3RyKHQsIHN0cmluZy53cml0ZSkKKyAgICAgICAgc2VsZi53cml0ZShyZXByKHN0cmluZy5nZXR2YWx1ZSgpKSkKKworICAgIGRlZiBfRm9ybWF0dGVkVmFsdWUoc2VsZiwgdCk6CisgICAgICAgIHNlbGYud3JpdGUoImYiKQorICAgICAgICBzdHJpbmcgPSBpby5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuX2ZzdHJpbmdfRm9ybWF0dGVkVmFsdWUodCwgc3RyaW5nLndyaXRlKQorICAgICAgICBzZWxmLndyaXRlKHJlcHIoc3RyaW5nLmdldHZhbHVlKCkpKQorCisgICAgZGVmIF9mc3RyaW5nX0pvaW5lZFN0cihzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIGZvciB2YWx1ZSBpbiB0LnZhbHVlczoKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICJfZnN0cmluZ18iICsgdHlwZSh2YWx1ZSkuX19uYW1lX18pCisgICAgICAgICAgICBtZXRoKHZhbHVlLCB3cml0ZSkKKworICAgIGRlZiBfZnN0cmluZ19TdHIoc2VsZiwgdCwgd3JpdGUpOgorICAgICAgICB2YWx1ZSA9IHQucy5yZXBsYWNlKCJ7IiwgInt7IikucmVwbGFjZSgifSIsICJ9fSIpCisgICAgICAgIHdyaXRlKHZhbHVlKQorCisgICAgZGVmIF9mc3RyaW5nX0NvbnN0YW50KHNlbGYsIHQsIHdyaXRlKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodC52YWx1ZSwgc3RyKQorICAgICAgICB2YWx1ZSA9IHQudmFsdWUucmVwbGFjZSgieyIsICJ7eyIpLnJlcGxhY2UoIn0iLCAifX0iKQorICAgICAgICB3cml0ZSh2YWx1ZSkKKworICAgIGRlZiBfZnN0cmluZ19Gb3JtYXR0ZWRWYWx1ZShzZWxmLCB0LCB3cml0ZSk6CisgICAgICAgIHdyaXRlKCJ7IikKKyAgICAgICAgZXhwciA9IGlvLlN0cmluZ0lPKCkKKyAgICAgICAgVW5wYXJzZXIodC52YWx1ZSwgZXhwcikKKyAgICAgICAgZXhwciA9IGV4cHIuZ2V0dmFsdWUoKS5yc3RyaXAoIlxuIikKKyAgICAgICAgaWYgZXhwci5zdGFydHN3aXRoKCJ7Iik6CisgICAgICAgICAgICB3cml0ZSgiICIpICAjIFNlcGFyYXRlIHBhaXIgb2Ygb3BlbmluZyBicmFja2V0cyBhcyAieyB7IgorICAgICAgICB3cml0ZShleHByKQorICAgICAgICBpZiB0LmNvbnZlcnNpb24gIT0gLTE6CisgICAgICAgICAgICBjb252ZXJzaW9uID0gY2hyKHQuY29udmVyc2lvbikKKyAgICAgICAgICAgIGFzc2VydCBjb252ZXJzaW9uIGluICJzcmEiCisgICAgICAgICAgICB3cml0ZShmIiF7Y29udmVyc2lvbn0iKQorICAgICAgICBpZiB0LmZvcm1hdF9zcGVjOgorICAgICAgICAgICAgd3JpdGUoIjoiKQorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZiwgIl9mc3RyaW5nXyIgKyB0eXBlKHQuZm9ybWF0X3NwZWMpLl9fbmFtZV9fKQorICAgICAgICAgICAgbWV0aCh0LmZvcm1hdF9zcGVjLCB3cml0ZSkKKyAgICAgICAgd3JpdGUoIn0iKQorCiAgICAgZGVmIF9OYW1lKHNlbGYsIHQpOgogICAgICAgICBzZWxmLndyaXRlKHQuaWQpCiAKKyAgICBkZWYgX3dyaXRlX2NvbnN0YW50KHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGZsb2F0LCBjb21wbGV4KSk6CisgICAgICAgICAgICBzZWxmLndyaXRlKHJlcHIodmFsdWUpLnJlcGxhY2UoImluZiIsIElORlNUUikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlKHJlcHIodmFsdWUpKQorCisgICAgZGVmIF9Db25zdGFudChzZWxmLCB0KToKKyAgICAgICAgdmFsdWUgPSB0LnZhbHVlCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIigiKQorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2NvbnN0YW50KHZhbHVlWzBdKQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIiwiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbnRlcmxlYXZlKGxhbWJkYTogc2VsZi53cml0ZSgiLCAiKSwgc2VsZi5fd3JpdGVfY29uc3RhbnQsIHZhbHVlKQorICAgICAgICAgICAgc2VsZi53cml0ZSgiKSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl93cml0ZV9jb25zdGFudCh0LnZhbHVlKQorCiAgICAgZGVmIF9OYW1lQ29uc3RhbnQoc2VsZiwgdCk6CiAgICAgICAgIHNlbGYud3JpdGUocmVwcih0LnZhbHVlKSkKIApAQCAtNDEzLDcgKzQ3Niw3IEBACiAgICAgZGVmIF9UdXBsZShzZWxmLCB0KToKICAgICAgICAgc2VsZi53cml0ZSgiKCIpCiAgICAgICAgIGlmIGxlbih0LmVsdHMpID09IDE6Ci0gICAgICAgICAgICAoZWx0LCkgPSB0LmVsdHMKKyAgICAgICAgICAgIGVsdCA9IHQuZWx0c1swXQogICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChlbHQpCiAgICAgICAgICAgICBzZWxmLndyaXRlKCIsIikKICAgICAgICAgZWxzZToKQEAgLTQ2MCw3ICs1MjMsOCBAQAogICAgICAgICAjIFNwZWNpYWwgY2FzZTogMy5fX2Fic19fKCkgaXMgYSBzeW50YXggZXJyb3IsIHNvIGlmIHQudmFsdWUKICAgICAgICAgIyBpcyBhbiBpbnRlZ2VyIGxpdGVyYWwgdGhlbiB3ZSBuZWVkIHRvIGVpdGhlciBwYXJlbnRoZXNpemUKICAgICAgICAgIyBpdCBvciBhZGQgYW4gZXh0cmEgc3BhY2UgdG8gZ2V0IDMgLl9fYWJzX18oKS4KLSAgICAgICAgaWYgaXNpbnN0YW5jZSh0LnZhbHVlLCBhc3QuTnVtKSBhbmQgaXNpbnN0YW5jZSh0LnZhbHVlLm4sIGludCk6CisgICAgICAgIGlmICgoaXNpbnN0YW5jZSh0LnZhbHVlLCBhc3QuTnVtKSBhbmQgaXNpbnN0YW5jZSh0LnZhbHVlLm4sIGludCkpCisgICAgICAgICAgIG9yIChpc2luc3RhbmNlKHQudmFsdWUsIGFzdC5Db25zdGFudCkgYW5kIGlzaW5zdGFuY2UodC52YWx1ZS52YWx1ZSwgaW50KSkpOgogICAgICAgICAgICAgc2VsZi53cml0ZSgiICIpCiAgICAgICAgIHNlbGYud3JpdGUoIi4iKQogICAgICAgICBzZWxmLndyaXRlKHQuYXR0cikKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvY29tYmluZXJlZnMucHkgYi9Ub29scy9zY3JpcHRzL2NvbWJpbmVyZWZzLnB5CmluZGV4IGUxMGU0OWEuLjdjYTk1MjYgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvY29tYmluZXJlZnMucHkKKysrIGIvVG9vbHMvc2NyaXB0cy9jb21iaW5lcmVmcy5weQpAQCAtNiw3ICs2LDcgQEAKIEEgaGVscGVyIGZvciBhbmFseXppbmcgUFlUSE9ORFVNUFJFRlMgb3V0cHV0LgogCiBXaGVuIHRoZSBQWVRIT05EVU1QUkVGUyBlbnZhciBpcyBzZXQgaW4gYSBkZWJ1ZyBidWlsZCwgYXQgUHl0aG9uIHNodXRkb3duCi10aW1lIFB5X0ZpbmFsaXplKCkgcHJpbnRzIHRoZSBsaXN0IG9mIGFsbCBsaXZlIG9iamVjdHMgdHdpY2U6ICBmaXJzdCBpdAordGltZSBQeV9GaW5hbGl6ZUV4KCkgcHJpbnRzIHRoZSBsaXN0IG9mIGFsbCBsaXZlIG9iamVjdHMgdHdpY2U6ICBmaXJzdCBpdAogcHJpbnRzIHRoZSByZXByKCkgb2YgZWFjaCBvYmplY3Qgd2hpbGUgdGhlIGludGVycHJldGVyIGlzIHN0aWxsIGZ1bGx5IGludGFjdC4KIEFmdGVyIGNsZWFuaW5nIHVwIGV2ZXJ5dGhpbmcgaXQgY2FuLCBpdCBwcmludHMgYWxsIHJlbWFpbmluZyBsaXZlIG9iamVjdHMKIGFnYWluLCBidXQgdGhlIHNlY29uZCB0aW1lIGp1c3QgcHJpbnRzIHRoZWlyIGFkZHJlc3NlcywgcmVmY291bnRzLCBhbmQgdHlwZQpAQCAtNDEsNyArNDEsNyBAQAogb2JqZWN0cyBzaG93biBpbiB0aGUgcmVwcjogIHRoZSByZXByIHdhcyBjYXB0dXJlZCBmcm9tIHRoZSBmaXJzdCBvdXRwdXQgYmxvY2ssCiBhbmQgc29tZSBvZiB0aGUgY29udGFpbmVlcyBtYXkgaGF2ZSBiZWVuIHJlbGVhc2VkIHNpbmNlIHRoZW4uICBGb3IgZXhhbXBsZSwKIGl0J3MgY29tbW9uIGZvciB0aGUgbGluZSBzaG93aW5nIHRoZSBkaWN0IG9mIGludGVybmVkIHN0cmluZ3MgdG8gZGlzcGxheQotc3RyaW5ncyB0aGF0IG5vIGxvbmdlciBleGlzdCBhdCB0aGUgZW5kIG9mIFB5X0ZpbmFsaXplOyB0aGlzIGNhbiBiZSByZWNvZ25pemVkCitzdHJpbmdzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0IGF0IHRoZSBlbmQgb2YgUHlfRmluYWxpemVFeDsgdGhpcyBjYW4gYmUgcmVjb2duaXplZAogKGFsYmVpdCBwYWluZnVsbHkpIGJlY2F1c2Ugc3VjaCBjb250YWluZWVzIGRvbid0IGhhdmUgYSBsaW5lIG9mIHRoZWlyIG93bi4KIAogVGhlIG9iamVjdHMgYXJlIGxpc3RlZCBpbiBhbGxvY2F0aW9uIG9yZGVyLCB3aXRoIG1vc3QtcmVjZW50bHkgYWxsb2NhdGVkCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2RpZmYucHkgYi9Ub29scy9zY3JpcHRzL2RpZmYucHkKaW5kZXggOTcyMGE0My4uOTYxOTliOCAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9kaWZmLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvZGlmZi5weQpAQCAtOCw3ICs4LDcgQEAKIAogIiIiCiAKLWltcG9ydCBzeXMsIG9zLCB0aW1lLCBkaWZmbGliLCBhcmdwYXJzZQoraW1wb3J0IHN5cywgb3MsIGRpZmZsaWIsIGFyZ3BhcnNlCiBmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZXpvbmUKIAogZGVmIGZpbGVfbXRpbWUocGF0aCk6CmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL2lkbGUzIGIvVG9vbHMvc2NyaXB0cy9pZGxlMwppbmRleCA4ZWU5MmMyLi5kNzMzMmJjIDEwMDc1NQotLS0gYS9Ub29scy9zY3JpcHRzL2lkbGUzCisrKyBiL1Rvb2xzL3NjcmlwdHMvaWRsZTMKQEAgLTEsNSArMSw1IEBACiAjISAvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCi1mcm9tIGlkbGVsaWIuUHlTaGVsbCBpbXBvcnQgbWFpbgorZnJvbSBpZGxlbGliLnB5c2hlbGwgaW1wb3J0IG1haW4KIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9Ub29scy9zY3JpcHRzL25tMmRlZi5weSBiL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5CmluZGV4IDhmMDc1NTkuLjgzYmJjZDcgMTAwNzU1Ci0tLSBhL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5CisrKyBiL1Rvb2xzL3NjcmlwdHMvbm0yZGVmLnB5CkBAIC0zNiw4ICszNiw4IEBACiAiIiIKIGltcG9ydCBvcywgc3lzCiAKLVBZVEhPTkxJQiA9ICdsaWJweXRob24nK3N5cy52ZXJzaW9uWzozXSsnLmEnCi1QQ19QWVRIT05MSUIgPSAnUHl0aG9uJytzeXMudmVyc2lvblswXStzeXMudmVyc2lvblsyXSsnLmRsbCcKK1BZVEhPTkxJQiA9ICdsaWJweXRob24lZC4lZC5hJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCitQQ19QWVRIT05MSUIgPSAnUHl0aG9uJWQlZC5kbGwnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KIE5NID0gJ25tIC1wIC1nICVzJyAgICAgICAgICAgICAgICAgICAgICAjIEZvciBMaW51eCwgdXNlICJubSAtZyAlcyIKIAogZGVmIHN5bWJvbHMobGliPVBZVEhPTkxJQix0eXBlcz0oJ1QnLCdDJywnRCcpKToKZGlmZiAtLWdpdCBhL1Rvb2xzL3NjcmlwdHMvcHl2ZW52IGIvVG9vbHMvc2NyaXB0cy9weXZlbnYKaW5kZXggOTc4ZDY5MS4uMWZiNDJjNiAxMDA3NTUKLS0tIGEvVG9vbHMvc2NyaXB0cy9weXZlbnYKKysrIGIvVG9vbHMvc2NyaXB0cy9weXZlbnYKQEAgLTEsNiArMSwxMiBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IHBhdGhsaWIKKworICAgIGV4ZWN1dGFibGUgPSBwYXRobGliLlBhdGgoc3lzLmV4ZWN1dGFibGUgb3IgJ3B5dGhvbjMnKS5uYW1lCisgICAgcHJpbnQoJ1dBUk5JTkc6IHRoZSBweWVudiBzY3JpcHQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgJworICAgICAgICAgIGYnYHtleGVjdXRhYmxlfSAtbSB2ZW52YCcsIGZpbGU9c3lzLnN0ZGVycikKKwogICAgIHJjID0gMQogICAgIHRyeToKICAgICAgICAgaW1wb3J0IHZlbnYKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCAxMGZlMTVkLi5jZWIwNDJmIDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC0xLDYgKzEsNiBAQAogIyEgL2Jpbi9zaAogIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgotIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkgZm9yIHB5dGhvbiAzLjUuCisjIEdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSBmb3IgcHl0aG9uIDMuNi4KICMKICMgUmVwb3J0IGJ1Z3MgdG8gPGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvPi4KICMKQEAgLTU4MCw4ICs1ODAsOCBAQAogIyBJZGVudGl0eSBvZiB0aGlzIHBhY2thZ2UuCiBQQUNLQUdFX05BTUU9J3B5dGhvbicKIFBBQ0tBR0VfVEFSTkFNRT0ncHl0aG9uJwotUEFDS0FHRV9WRVJTSU9OPSczLjUnCi1QQUNLQUdFX1NUUklORz0ncHl0aG9uIDMuNScKK1BBQ0tBR0VfVkVSU0lPTj0nMy42JworUEFDS0FHRV9TVFJJTkc9J3B5dGhvbiAzLjYnCiBQQUNLQUdFX0JVR1JFUE9SVD0naHR0cDovL2J1Z3MucHl0aG9uLm9yZy8nCiBQQUNLQUdFX1VSTD0nJwogCkBAIC03MDQsNiArNzA0LDcgQEAKIEJVSUxERVhFRVhUCiBFR1JFUAogTk9fQVNfTkVFREVECitNVUxUSUFSQ0hfQ1BQRkxBR1MKIFBMQVRGT1JNX1RSSVBMRVQKIFBMQVRESVIKIE1VTFRJQVJDSApAQCAtMTM5OSw3ICsxNDAwLDcgQEAKICAgIyBPbWl0IHNvbWUgaW50ZXJuYWwgb3Igb2Jzb2xldGUgb3B0aW9ucyB0byBtYWtlIHRoZSBsaXN0IGxlc3MgaW1wb3NpbmcuCiAgICMgVGhpcyBtZXNzYWdlIGlzIHRvbyBsb25nIHRvIGJlIGEgc3RyaW5nIGluIHRoZSBBL1VYIDMuMSBzaC4KICAgY2F0IDw8X0FDRU9GCi1cYGNvbmZpZ3VyZScgY29uZmlndXJlcyBweXRob24gMy41IHRvIGFkYXB0IHRvIG1hbnkga2luZHMgb2Ygc3lzdGVtcy4KK1xgY29uZmlndXJlJyBjb25maWd1cmVzIHB5dGhvbiAzLjYgdG8gYWRhcHQgdG8gbWFueSBraW5kcyBvZiBzeXN0ZW1zLgogCiBVc2FnZTogJDAgW09QVElPTl0uLi4gW1ZBUj1WQUxVRV0uLi4KIApAQCAtMTQ2NSw3ICsxNDY2LDcgQEAKIAogaWYgdGVzdCAtbiAiJGFjX2luaXRfaGVscCI7IHRoZW4KICAgY2FzZSAkYWNfaW5pdF9oZWxwIGluCi0gICAgIHNob3J0IHwgcmVjdXJzaXZlICkgZWNobyAiQ29uZmlndXJhdGlvbiBvZiBweXRob24gMy41OiI7OworICAgICBzaG9ydCB8IHJlY3Vyc2l2ZSApIGVjaG8gIkNvbmZpZ3VyYXRpb24gb2YgcHl0aG9uIDMuNjoiOzsKICAgIGVzYWMKICAgY2F0IDw8XF9BQ0VPRgogCkBAIC0xNjIyLDcgKzE2MjMsNyBAQAogdGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCiBpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCiAgIGNhdCA8PFxfQUNFT0YKLXB5dGhvbiBjb25maWd1cmUgMy41CitweXRob24gY29uZmlndXJlIDMuNgogZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5CiAKIENvcHlyaWdodCAoQykgMjAxMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KQEAgLTI0NjEsNyArMjQ2Miw3IEBACiBUaGlzIGZpbGUgY29udGFpbnMgYW55IG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbXBpbGVycyB3aGlsZQogcnVubmluZyBjb25maWd1cmUsIHRvIGFpZCBkZWJ1Z2dpbmcgaWYgY29uZmlndXJlIG1ha2VzIGEgbWlzdGFrZS4KIAotSXQgd2FzIGNyZWF0ZWQgYnkgcHl0aG9uICRhc19tZSAzLjUsIHdoaWNoIHdhcworSXQgd2FzIGNyZWF0ZWQgYnkgcHl0aG9uICRhc19tZSAzLjYsIHdoaWNoIHdhcwogZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY5LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgJCAkMCAkQApAQCAtMzAwMSw3ICszMDAyLDcgQEAKICAgICBpZiB0ZXN0IC16ICIkUFlUSE9OX0ZPUl9CVUlMRCI7IHRoZW4KICAgICAgICAgZm9yIGludGVycCBpbiBweXRob24kUEFDS0FHRV9WRVJTSU9OIHB5dGhvbjMgcHl0aG9uOyBkbwogCSAgICB3aGljaCAkaW50ZXJwID4vZGV2L251bGwgMj4mMSB8fCBjb250aW51ZQotCSAgICBpZiAkaW50ZXJwIC1jICdpbXBvcnQgc3lzO3N5cy5leGl0KG5vdCBzeXMudmVyc2lvbl9pbmZvWzoyXSA+PSAoMywzKSknOyB0aGVuCisJICAgIGlmICRpbnRlcnAgLWMgImltcG9ydCBzeXM7c3lzLmV4aXQobm90ICcuJy5qb2luKHN0cihuKSBmb3IgbiBpbiBzeXMudmVyc2lvbl9pbmZvWzoyXSkgPT0gJyRQQUNLQUdFX1ZFUlNJT04nKSI7IHRoZW4KIAkgICAgICAgIGJyZWFrCiAJICAgIGZpCiAgICAgICAgICAgICBpbnRlcnA9CkBAIC0zMDM1LDcgKzMwMzYsNyBAQAogbXYgY29uZmRlZnMuaC5uZXcgY29uZmRlZnMuaAogCiAKLVZFUlNJT049My41CitWRVJTSU9OPTMuNgogCiAjIFZlcnNpb24gbnVtYmVyIG9mIFB5dGhvbidzIG93biBzaGFyZWQgbGlicmFyeSBmaWxlLgogCkBAIC01MzQ0LDkgKzUzNDUsMTYgQEAKICAgICBhc19mbl9lcnJvciAkPyAiaW50ZXJuYWwgY29uZmlndXJlIGVycm9yIGZvciB0aGUgcGxhdGZvcm0gdHJpcGxldCwgcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IiAiJExJTkVOTyIgNQogICBmaQogZmkKLVBMQVRESVI9cGxhdC0kTUFDSERFUAoraWYgdGVzdCB4JFBMQVRGT1JNX1RSSVBMRVQgPSB4OyB0aGVuCisgIFBMQVRESVI9cGxhdC0kTUFDSERFUAorZWxzZQorICBQTEFURElSPXBsYXQtJFBMQVRGT1JNX1RSSVBMRVQKK2ZpCiAKIAoraWYgdGVzdCB4JE1VTFRJQVJDSCAhPSB4OyB0aGVuCisgIE1VTFRJQVJDSF9DUFBGTEFHUz0iLURNVUxUSUFSQ0g9XFxcIiRNVUxUSUFSQ0hcXFwiIgorZmkKIAogCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAtV2wsLS1uby1hcy1uZWVkZWQiID4mNQpAQCAtNTY0MCw2ICs1NjQ4LDMyIEBACiAKIAogCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB0aGUgQW5kcm9pZCBBUEkgbGV2ZWwiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHRoZSBBbmRyb2lkIEFQSSBsZXZlbC4uLiAiID4mNjsgfQorY2F0ID4+IGNvbmZ0ZXN0LmMgPDxFT0YKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQvYXBpLWxldmVsLmg+CitfX0FORFJPSURfQVBJX18KKyNlbHNlCisjZXJyb3Igbm90IEFuZHJvaWQKKyNlbmRpZgorRU9GCisKK2lmICRDUFAgJENQUEZMQUdTIGNvbmZ0ZXN0LmMgPmNvbmZ0ZXN0Lm91dCAyPi9kZXYvbnVsbDsgdGhlbgorICBBTkRST0lEX0FQSV9MRVZFTD1gZ3JlcCAtdiAnXiMnIGNvbmZ0ZXN0Lm91dCB8IGdyZXAgLXYgJ14gKiQnYAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJEFORFJPSURfQVBJX0xFVkVMIiA+JjUKKyRhc19lY2hvICIkQU5EUk9JRF9BUElfTEVWRUwiID4mNjsgfQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEFORFJPSURfQVBJX0xFVkVMICRBTkRST0lEX0FQSV9MRVZFTAorX0FDRU9GCisKK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vdCBBbmRyb2lkIiA+JjUKKyRhc19lY2hvICJub3QgQW5kcm9pZCIgPiY2OyB9CitmaQorcm0gLWYgY29uZnRlc3QuYyBjb25mdGVzdC5vdXQKKwogIyBDaGVjayBmb3IgdW5zdXBwb3J0ZWQgc3lzdGVtcwogY2FzZSAkYWNfc3lzX3N5c3RlbS8kYWNfc3lzX3JlbGVhc2UgaW4KIGF0aGVvcyp8TGludXgqLzEqKQpAQCAtODAwOSw2ICs4MDQzLDExIEBACiAgIHVzZV9sZnM9bm8KIGZpCiAKKyMgRG9uJ3QgdXNlIGxhcmdlZmlsZSBzdXBwb3J0IGZvciBHTlUvSHVyZAorY2FzZSAkYWNfc3lzX3N5c3RlbSBpbiBHTlUqKQorICB1c2VfbGZzPW5vCitlc2FjCisKIGlmIHRlc3QgIiR1c2VfbGZzIiA9ICJ5ZXMiOyB0aGVuCiAjIFR3byBkZWZpbmVzIG5lZWRlZCB0byBlbmFibGUgbGFyZ2VmaWxlIHN1cHBvcnQgb24gdmFyaW91cyBwbGF0Zm9ybXMKICMgVGhlc2UgbWF5IGFmZmVjdCBzb21lIHR5cGVkZWZzCkBAIC0xMjg4OSw2ICsxMjkyOCwzMyBAQAogCiBmaQogCithY19mbl9jX2NoZWNrX21lbWJlciAiJExJTkVOTyIgInN0cnVjdCBwYXNzd2QiICJwd19nZWNvcyIgImFjX2N2X21lbWJlcl9zdHJ1Y3RfcGFzc3dkX3B3X2dlY29zIiAiCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHB3ZC5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3RfcGFzc3dkX3B3X2dlY29zIiA9IHh5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX1BBU1NXRF9QV19HRUNPUyAxCitfQUNFT0YKKworCitmaQorYWNfZm5fY19jaGVja19tZW1iZXIgIiRMSU5FTk8iICJzdHJ1Y3QgcGFzc3dkIiAicHdfcGFzc3dkIiAiYWNfY3ZfbWVtYmVyX3N0cnVjdF9wYXNzd2RfcHdfcGFzc3dkIiAiCisgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgI2luY2x1ZGUgPHB3ZC5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X21lbWJlcl9zdHJ1Y3RfcGFzc3dkX3B3X3Bhc3N3ZCIgPSB4eWVzOyB0aGVuIDoKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX1NUUlVDVF9QQVNTV0RfUFdfUEFTU1dEIDEKK19BQ0VPRgorCisKK2ZpCisKIAogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgdGltZS5oIHRoYXQgZGVmaW5lcyBhbHR6b25lIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGZvciB0aW1lLmggdGhhdCBkZWZpbmVzIGFsdHpvbmUuLi4gIiA+JjY7IH0KQEAgLTE0MTk5LDYgKzE0MjY1LDg1IEBACiAKIGZpCiAKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTEFaWSIgImFjX2N2X2hhdmVfZGVjbF9SVExEX0xBWlkiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTEFaWSIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTEFaWSAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTk9XIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9XIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PVyIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTk9XICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9HTE9CQUwiICJhY19jdl9oYXZlX2RlY2xfUlRMRF9HTE9CQUwiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfR0xPQkFMIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9HTE9CQUwgJGFjX2hhdmVfZGVjbAorX0FDRU9GCithY19mbl9jX2NoZWNrX2RlY2wgIiRMSU5FTk8iICJSVExEX0xPQ0FMIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTE9DQUwiICIjaW5jbHVkZSA8ZGxmY24uaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTE9DQUwiID0geHllczsgdGhlbiA6CisgIGFjX2hhdmVfZGVjbD0xCitlbHNlCisgIGFjX2hhdmVfZGVjbD0wCitmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfREVDTF9SVExEX0xPQ0FMICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9OT0RFTEVURSIgImFjX2N2X2hhdmVfZGVjbF9SVExEX05PREVMRVRFIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PREVMRVRFIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9OT0RFTEVURSAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKK2FjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgIlJUTERfTk9MT0FEIiAiYWNfY3ZfaGF2ZV9kZWNsX1JUTERfTk9MT0FEIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX05PTE9BRCIgPSB4eWVzOyB0aGVuIDoKKyAgYWNfaGF2ZV9kZWNsPTEKK2Vsc2UKKyAgYWNfaGF2ZV9kZWNsPTAKK2ZpCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ERUNMX1JUTERfTk9MT0FEICRhY19oYXZlX2RlY2wKK19BQ0VPRgorYWNfZm5fY19jaGVja19kZWNsICIkTElORU5PIiAiUlRMRF9ERUVQQklORCIgImFjX2N2X2hhdmVfZGVjbF9SVExEX0RFRVBCSU5EIiAiI2luY2x1ZGUgPGRsZmNuLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hhdmVfZGVjbF9SVExEX0RFRVBCSU5EIiA9IHh5ZXM7IHRoZW4gOgorICBhY19oYXZlX2RlY2w9MQorZWxzZQorICBhY19oYXZlX2RlY2w9MAorZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0RFQ0xfUlRMRF9ERUVQQklORCAkYWNfaGF2ZV9kZWNsCitfQUNFT0YKKworCiAjIGRldGVybWluZSB3aGF0IHNpemUgZGlnaXQgdG8gdXNlIGZvciBQeXRob24ncyBsb25ncwogeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBkaWdpdCBzaXplIGZvciBQeXRob24ncyBsb25ncyIgPiY1CiAkYXNfZWNob19uICJjaGVja2luZyBkaWdpdCBzaXplIGZvciBQeXRob24ncyBsb25ncy4uLiAiID4mNjsgfQpAQCAtMTQ2MzIsNyArMTQ3NzcsMTEgQEAKICRhc19lY2hvICIkTERWRVJTSU9OIiA+JjY7IH0KIAogCi1MSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfSIKK2lmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUID0geDsgdGhlbgorICBMSUJQTD0nJChwcmVmaXgpJyIvbGliL3B5dGhvbiR7VkVSU0lPTn0vY29uZmlnLSR7TERWRVJTSU9OfSIKK2Vsc2UKKyAgTElCUEw9JyQocHJlZml4KSciL2xpYi9weXRob24ke1ZFUlNJT059L2NvbmZpZy0ke0xEVkVSU0lPTn0tJHtQTEFURk9STV9UUklQTEVUfSIKK2ZpCiAKIAogIyBDaGVjayB3aGV0aGVyIHJpZ2h0IHNoaWZ0aW5nIGEgbmVnYXRpdmUgaW50ZWdlciBleHRlbmRzIHRoZSBzaWduIGJpdApAQCAtMTY4NzQsNyArMTcwMjMsNyBAQAogIyByZXBvcnQgYWN0dWFsIGlucHV0IHZhbHVlcyBvZiBDT05GSUdfRklMRVMgZXRjLiBpbnN0ZWFkIG9mIHRoZWlyCiAjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgogYWNfbG9nPSIKLVRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgcHl0aG9uICRhc19tZSAzLjUsIHdoaWNoIHdhcworVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSBweXRob24gJGFzX21lIDMuNiwgd2hpY2ggd2FzCiBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjkuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKIAogICBDT05GSUdfRklMRVMgICAgPSAkQ09ORklHX0ZJTEVTCkBAIC0xNjkzNiw3ICsxNzA4NSw3IEBACiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKIGFjX2NzX2NvbmZpZz0iYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2AiCiBhY19jc192ZXJzaW9uPSJcXAotcHl0aG9uIGNvbmZpZy5zdGF0dXMgMy41CitweXRob24gY29uZmlnLnN0YXR1cyAzLjYKIGNvbmZpZ3VyZWQgYnkgJDAsIGdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42OSwKICAgd2l0aCBvcHRpb25zIFxcIlwkYWNfY3NfY29uZmlnXFwiCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCAwYWVjNDgxLi43YzgzY2E2IDEwMDY0NAotLS0gYS9jb25maWd1cmUuYWMKKysrIGIvY29uZmlndXJlLmFjCkBAIC0zLDcgKzMsNyBAQAogZG5sICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICMgU2V0IFZFUlNJT04gc28gd2Ugb25seSBuZWVkIHRvIGVkaXQgaW4gb25lIHBsYWNlIChpLmUuLCBoZXJlKQotbTRfZGVmaW5lKFBZVEhPTl9WRVJTSU9OLCAzLjUpCittNF9kZWZpbmUoUFlUSE9OX1ZFUlNJT04sIDMuNikKIAogQUNfUFJFUkVRKDIuNjUpCiAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICBpZiB0ZXN0IC16ICIkUFlUSE9OX0ZPUl9CVUlMRCI7IHRoZW4KICAgICAgICAgZm9yIGludGVycCBpbiBweXRob24kUEFDS0FHRV9WRVJTSU9OIHB5dGhvbjMgcHl0aG9uOyBkbwogCSAgICB3aGljaCAkaW50ZXJwID4vZGV2L251bGwgMj4mMSB8fCBjb250aW51ZQotCSAgICBpZiAkaW50ZXJwIC1jICdpbXBvcnQgc3lzO3N5cy5leGl0KG5vdCBzeXMudmVyc2lvbl9pbmZvQDw6QDoyQDo+QCA+PSAoMywzKSknOyB0aGVuCisJICAgIGlmICRpbnRlcnAgLWMgImltcG9ydCBzeXM7c3lzLmV4aXQobm90ICcuJy5qb2luKHN0cihuKSBmb3IgbiBpbiBzeXMudmVyc2lvbl9pbmZvQDw6QDoyQDo+QCkgPT0gJyRQQUNLQUdFX1ZFUlNJT04nKSI7IHRoZW4KIAkgICAgICAgIGJyZWFrCiAJICAgIGZpCiAgICAgICAgICAgICBpbnRlcnA9CkBAIC04NzIsMTAgKzg3MiwxNyBAQAogICAgIEFDX01TR19FUlJPUihbaW50ZXJuYWwgY29uZmlndXJlIGVycm9yIGZvciB0aGUgcGxhdGZvcm0gdHJpcGxldCwgcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0XSkKICAgZmkKIGZpCi1QTEFURElSPXBsYXQtJE1BQ0hERVAKK2lmIHRlc3QgeCRQTEFURk9STV9UUklQTEVUID0geDsgdGhlbgorICBQTEFURElSPXBsYXQtJE1BQ0hERVAKK2Vsc2UKKyAgUExBVERJUj1wbGF0LSRQTEFURk9STV9UUklQTEVUCitmaQogQUNfU1VCU1QoUExBVERJUikKIEFDX1NVQlNUKFBMQVRGT1JNX1RSSVBMRVQpCi0KK2lmIHRlc3QgeCRNVUxUSUFSQ0ggIT0geDsgdGhlbgorICBNVUxUSUFSQ0hfQ1BQRkxBR1M9Ii1ETVVMVElBUkNIPVxcXCIkTVVMVElBUkNIXFxcIiIKK2ZpCitBQ19TVUJTVChNVUxUSUFSQ0hfQ1BQRkxBR1MpCiAKIEFDX01TR19DSEVDS0lORyhbZm9yIC1XbCwtLW5vLWFzLW5lZWRlZF0pCiBzYXZlX0xERkxBR1M9IiRMREZMQUdTIgpAQCAtODkyLDYgKzg5OSwyNSBAQAogIyBjaGVja3MgZm9yIFVOSVggdmFyaWFudHMgdGhhdCBzZXQgQyBwcmVwcm9jZXNzb3IgdmFyaWFibGVzCiBBQ19VU0VfU1lTVEVNX0VYVEVOU0lPTlMKIAorQUNfTVNHX0NIRUNLSU5HKFtmb3IgdGhlIEFuZHJvaWQgQVBJIGxldmVsXSkKK2NhdCA+PiBjb25mdGVzdC5jIDw8RU9GCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkL2FwaS1sZXZlbC5oPgorX19BTkRST0lEX0FQSV9fCisjZWxzZQorI2Vycm9yIG5vdCBBbmRyb2lkCisjZW5kaWYKK0VPRgorCitpZiAkQ1BQICRDUFBGTEFHUyBjb25mdGVzdC5jID5jb25mdGVzdC5vdXQgMj4vZGV2L251bGw7IHRoZW4KKyAgQU5EUk9JRF9BUElfTEVWRUw9YGdyZXAgLXYgJ14jJyBjb25mdGVzdC5vdXQgfCBncmVwIC12ICdeICokJ2AKKyAgQUNfTVNHX1JFU1VMVChbJEFORFJPSURfQVBJX0xFVkVMXSkKKyAgQUNfREVGSU5FX1VOUVVPVEVEKEFORFJPSURfQVBJX0xFVkVMLCAkQU5EUk9JRF9BUElfTEVWRUwsIFtUaGUgQW5kcm9pZCBBUEkgbGV2ZWwuXSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChbbm90IEFuZHJvaWRdKQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmMgY29uZnRlc3Qub3V0CisKICMgQ2hlY2sgZm9yIHVuc3VwcG9ydGVkIHN5c3RlbXMKIGNhc2UgJGFjX3N5c19zeXN0ZW0vJGFjX3N5c19yZWxlYXNlIGluCiBhdGhlb3MqfExpbnV4Ki8xKikKQEAgLTE5NzksNiArMjAwNSwxMSBAQAogICB1c2VfbGZzPW5vCiBmaQogCisjIERvbid0IHVzZSBsYXJnZWZpbGUgc3VwcG9ydCBmb3IgR05VL0h1cmQKK2Nhc2UgJGFjX3N5c19zeXN0ZW0gaW4gR05VKikKKyAgdXNlX2xmcz1ubworZXNhYworCiBpZiB0ZXN0ICIkdXNlX2xmcyIgPSAieWVzIjsgdGhlbgogIyBUd28gZGVmaW5lcyBuZWVkZWQgdG8gZW5hYmxlIGxhcmdlZmlsZSBzdXBwb3J0IG9uIHZhcmlvdXMgcGxhdGZvcm1zCiAjIFRoZXNlIG1heSBhZmZlY3Qgc29tZSB0eXBlZGVmcwpAQCAtMzc1OSw2ICszNzkwLDEwIEBACiBBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3Qgc3RhdC5zdF9nZW5dKQogQUNfQ0hFQ0tfTUVNQkVSUyhbc3RydWN0IHN0YXQuc3RfYmlydGh0aW1lXSkKIEFDX0NIRUNLX01FTUJFUlMoW3N0cnVjdCBzdGF0LnN0X2Jsb2Nrc10pCitBQ19DSEVDS19NRU1CRVJTKFtzdHJ1Y3QgcGFzc3dkLnB3X2dlY29zLCBzdHJ1Y3QgcGFzc3dkLnB3X3Bhc3N3ZF0sIFtdLCBbXSwgW1sKKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAjaW5jbHVkZSA8cHdkLmg+CitdXSkKIAogQUNfTVNHX0NIRUNLSU5HKGZvciB0aW1lLmggdGhhdCBkZWZpbmVzIGFsdHpvbmUpCiBBQ19DQUNIRV9WQUwoYWNfY3ZfaGVhZGVyX3RpbWVfYWx0em9uZSxbCkBAIC00MzM1LDYgKzQzNzAsOCBAQAogICBbZGVmaW5lIHRvIDEgaWYgeW91ciBzZW1fZ2V0dmFsdWUgaXMgYnJva2VuLl0pCiBmaQogCitBQ19DSEVDS19ERUNMUyhbUlRMRF9MQVpZLCBSVExEX05PVywgUlRMRF9HTE9CQUwsIFJUTERfTE9DQUwsIFJUTERfTk9ERUxFVEUsIFJUTERfTk9MT0FELCBSVExEX0RFRVBCSU5EXSwgW10sIFtdLCBbWyNpbmNsdWRlIDxkbGZjbi5oPl1dKQorCiAjIGRldGVybWluZSB3aGF0IHNpemUgZGlnaXQgdG8gdXNlIGZvciBQeXRob24ncyBsb25ncwogQUNfTVNHX0NIRUNLSU5HKFtkaWdpdCBzaXplIGZvciBQeXRob24ncyBsb25nc10pCiBBQ19BUkdfRU5BQkxFKGJpZy1kaWdpdHMsCkBAIC00NDUzLDcgKzQ0OTAsMTEgQEAKIAogZG5sIGRlZmluZSBMSUJQTCBhZnRlciBBQklGTEFHUyBhbmQgTERWRVJTSU9OIGlzIGRlZmluZWQuCiBBQ19TVUJTVChQWV9FTkFCTEVfU0hBUkVEKQotTElCUEw9JyQocHJlZml4KSciL2xpYi9weXRob24ke1ZFUlNJT059L2NvbmZpZy0ke0xEVkVSU0lPTn0iCitpZiB0ZXN0IHgkUExBVEZPUk1fVFJJUExFVCA9IHg7IHRoZW4KKyAgTElCUEw9JyQocHJlZml4KSciL2xpYi9weXRob24ke1ZFUlNJT059L2NvbmZpZy0ke0xEVkVSU0lPTn0iCitlbHNlCisgIExJQlBMPSckKHByZWZpeCknIi9saWIvcHl0aG9uJHtWRVJTSU9OfS9jb25maWctJHtMRFZFUlNJT059LSR7UExBVEZPUk1fVFJJUExFVH0iCitmaQogQUNfU1VCU1QoTElCUEwpCiAKICMgQ2hlY2sgd2hldGhlciByaWdodCBzaGlmdGluZyBhIG5lZ2F0aXZlIGludGVnZXIgZXh0ZW5kcyB0aGUgc2lnbiBiaXQKZGlmZiAtLWdpdCBhL3B5Y29uZmlnLmguaW4gYi9weWNvbmZpZy5oLmluCmluZGV4IGJmNGJhNWIuLmRjZTVjZmQgMTAwNjQ0Ci0tLSBhL3B5Y29uZmlnLmguaW4KKysrIGIvcHljb25maWcuaC5pbgpAQCAtMTIsNiArMTIsOSBAQAogICAgc3VwcG9ydCBmb3IgQUlYIEMrKyBzaGFyZWQgZXh0ZW5zaW9uIG1vZHVsZXMuICovCiAjdW5kZWYgQUlYX0dFTlVJTkVfQ1BMVVNQTFVTCiAKKy8qIFRoZSBBbmRyb2lkIEFQSSBsZXZlbC4gKi8KKyN1bmRlZiBBTkRST0lEX0FQSV9MRVZFTAorCiAvKiBEZWZpbmUgaWYgQyBkb3VibGVzIGFyZSA2NC1iaXQgSUVFRSA3NTQgYmluYXJ5IGZvcm1hdCwgc3RvcmVkIGluIEFSTQogICAgbWl4ZWQtZW5kaWFuIG9yZGVyIChieXRlIG9yZGVyIDQ1NjcwMTIzKSAqLwogI3VuZGVmIERPVUJMRV9JU19BUk1fTUlYRURfRU5ESUFOX0lFRUU3NTQKQEAgLTE2Nyw2ICsxNzAsMzQgQEAKICAgICovCiAjdW5kZWYgSEFWRV9ERUNMX0lTTkFOCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9ERUVQQklORCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfREVFUEJJTkQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX0dMT0JBTCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfR0xPQkFMCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9MQVpZJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9MQVpZCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgUlRMRF9MT0NBTCcsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTE9DQUwKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX05PREVMRVRFJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9OT0RFTEVURQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYFJUTERfTk9MT0FEJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyN1bmRlZiBIQVZFX0RFQ0xfUlRMRF9OT0xPQUQKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBSVExEX05PVycsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX1JUTERfTk9XCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgdHpuYW1lJywgYW5kIHRvIDAgaWYgeW91IGRvbid0LgogICAgKi8KICN1bmRlZiBIQVZFX0RFQ0xfVFpOQU1FCkBAIC05MTYsNiArOTQ3LDEyIEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cm9wdHMuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9TVFJPUFRTX0gKIAorLyogRGVmaW5lIHRvIDEgaWYgYHB3X2dlY29zJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHBhc3N3ZCcuICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfUEFTU1dEX1BXX0dFQ09TCisKKy8qIERlZmluZSB0byAxIGlmIGBwd19wYXNzd2QnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3QgcGFzc3dkJy4gKi8KKyN1bmRlZiBIQVZFX1NUUlVDVF9QQVNTV0RfUFdfUEFTU1dECisKIC8qIERlZmluZSB0byAxIGlmIGBzdF9iaXJ0aHRpbWUnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3Qgc3RhdCcuICovCiAjdW5kZWYgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CSVJUSFRJTUUKIApkaWZmIC0tZ2l0IGEvc2V0dXAucHkgYi9zZXR1cC5weQppbmRleCAxNzRjZTcyLi4wMDZlY2RkIDEwMDY0NAotLS0gYS9zZXR1cC5weQorKysgYi9zZXR1cC5weQpAQCAtMjAwNyw3ICsyMDA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGZmaV9saWIgPSBOb25lCiAgICAgICAgIGlmIGZmaV9pbmMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBmb3IgbGliX25hbWUgaW4gKCdmZmlfY29udmVuaWVuY2UnLCAnZmZpX3BpYycsICdmZmknKToKKyAgICAgICAgICAgIGZvciBsaWJfbmFtZSBpbiAoJ2ZmaScsICdmZmlfcGljJyk6CiAgICAgICAgICAgICAgICAgaWYgKHNlbGYuY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUobGliX2RpcnMsIGxpYl9uYW1lKSk6CiAgICAgICAgICAgICAgICAgICAgIGZmaV9saWIgPSBsaWJfbmFtZQogICAgICAgICAgICAgICAgICAgICBicmVhawpAQCAtMjA2MCw3ICsyMDYwLDcgQEAKICAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL2ZudC5oJywKICAgICAgICAgICAgICAgJ19kZWNpbWFsL2xpYm1wZGVjL2ZvdXJzdGVwLmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvaW8uaCcsCi0gICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9tZW1vcnkuaCcsCisgICAgICAgICAgICAgICdfZGVjaW1hbC9saWJtcGRlYy9tcGFsbG9jLmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvbXBkZWNpbWFsLmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvbnVtYmVydGhlb3J5LmgnLAogICAgICAgICAgICAgICAnX2RlY2ltYWwvbGlibXBkZWMvc2l4c3RlcC5oJywKQEAgLTIyNTUsNyArMjI1NSw3IEBACiAgICAgc2V0dXAoIyBQeVBJIE1ldGFkYXRhIChQRVAgMzAxKQogICAgICAgICAgIG5hbWUgPSAiUHl0aG9uIiwKICAgICAgICAgICB2ZXJzaW9uID0gc3lzLnZlcnNpb24uc3BsaXQoKVswXSwKLSAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnLyVzIiAlIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnLyVkLiVkIiAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAogICAgICAgICAgIG1haW50YWluZXIgPSAiR3VpZG8gdmFuIFJvc3N1bSBhbmQgdGhlIFB5dGhvbiBjb21tdW5pdHkiLAogICAgICAgICAgIG1haW50YWluZXJfZW1haWwgPSAicHl0aG9uLWRldkBweXRob24ub3JnIiwKICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJBIGhpZ2gtbGV2ZWwgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nIGxhbmd1YWdlIiwK