LyogT3JpZ2luYWwgYXV0aG9yIHVua25vd24sIG1heSBiZSAia3Jpc2huYSBiYWxhc3ViQGNpcy5vaGlvLXN0YXRlLmVkdSIgKi8KLyoKCiAgTW9kaWZpZWQgU2F0IE9jdCAgOSAxMDo1NToyOCAxOTkzIGZvciAwLjk5LjEzCgogIFBhdGNoZXMgZnJvbSBNaWtlIEphZ2RpcyAoamFnZ3lAcHVycGxldC5kZW1vbi5jby51aykgYXBwbGllZCBXZWQgRmViCiAgOCAxMjoxMjoyMSAxOTk1IGJ5IGZhaXRoQGNzLnVuYy5lZHUgdG8gcHJpbnQgbnVtZXJpYyB1aWRzIGlmIG5vCiAgcGFzc3dkIGZpbGUgZW50cnkuCgogIFBhdGNoIGZyb20gYXJub2xkc0BpZm5zLmRlIChIZWluei1BZG8gQXJub2xkcykgYXBwbGllZCBNb24gSnVsIDEKICAxOTozMDo0MSAxOTk2IGJ5IGphbmxAbWF0aC51aW8ubm8gdG8gYWRkIGNvZGUgbWlzc2luZyBpbiBjYXNlIFBJRDoKICBjbGF1c2VzLgoKICBQYXRjaGVkIHRvIGRpc3BsYXkgdGhlIGtleSBmaWVsZCAtLSBoeUBwaWNrc3lzLmNvbSAxMi8xOC85NgoKICAxOTk5LTAyLTIyIEFya2FkaXVzeiBNabZraWV3aWN6IDxtaXNpZWtAcGxkLk9SRy5QTD4KICAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CgoqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGdldG9wdC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHB3ZC5oPgojaW5jbHVkZSA8Z3JwLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGVyci5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvaXBjLmg+CiNpbmNsdWRlIDxzeXMvc2VtLmg+CiNpbmNsdWRlIDxzeXMvbXNnLmg+CiNpbmNsdWRlIDxzeXMvc2htLmg+CgojaW5jbHVkZSAibmxzLmgiCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBTSE1fREVTVCBhbmQgU0hNX0xPQ0tFRCBhcmUgZGVmaW5lZCBpbiBrZXJuZWwgaGVhZGVycywKICAgYnV0IGluc2lkZSAjaWZkZWYgX19LRVJORUxfXyAuLi4gI2VuZGlmICovCiNpZm5kZWYgU0hNX0RFU1QKLyogc2htX21vZGUgdXBwZXIgYnl0ZSBmbGFncyAqLwojZGVmaW5lIFNITV9ERVNUICAgICAgICAwMTAwMCAgIC8qIHNlZ21lbnQgd2lsbCBiZSBkZXN0cm95ZWQgb24gbGFzdCBkZXRhY2ggKi8KI2RlZmluZSBTSE1fTE9DS0VEICAgICAgMDIwMDAgICAvKiBzZWdtZW50IHdpbGwgbm90IGJlIHN3YXBwZWQgKi8KI2VuZGlmCgovKiBGb3Igb2xkZXIga2VybmVscyB0aGUgc2FtZSBob2xkcyBmb3IgdGhlIGRlZmluZXMgYmVsb3cgKi8KI2lmbmRlZiBNU0dfU1RBVAojZGVmaW5lIE1TR19TVEFUCTExCiNkZWZpbmUgTVNHX0lORk8JMTIKI2VuZGlmCgojaWZuZGVmIFNITV9TVEFUCiNkZWZpbmUgU0hNX1NUQVQgICAgICAgIDEzCiNkZWZpbmUgU0hNX0lORk8gICAgICAgIDE0CnN0cnVjdCBzaG1faW5mbyB7CiAgICAgaW50ICAgdXNlZF9pZHM7CiAgICAgdWxvbmcgc2htX3RvdDsgLyogdG90YWwgYWxsb2NhdGVkIHNobSAqLwogICAgIHVsb25nIHNobV9yc3M7IC8qIHRvdGFsIHJlc2lkZW50IHNobSAqLwogICAgIHVsb25nIHNobV9zd3A7IC8qIHRvdGFsIHN3YXBwZWQgc2htICovCiAgICAgdWxvbmcgc3dhcF9hdHRlbXB0czsKICAgICB1bG9uZyBzd2FwX3N1Y2Nlc3NlczsKfTsKI2VuZGlmCgojaWZuZGVmIFNFTV9TVEFUCiNkZWZpbmUgU0VNX1NUQVQJMTgKI2RlZmluZSBTRU1fSU5GTwkxOQojZW5kaWYKCi8qIFNvbWUgdmVyc2lvbnMgb2YgbGliYyBvbmx5IGRlZmluZSBJUENfSU5GTyB3aGVuIF9fVVNFX0dOVSBpcyBkZWZpbmVkLiAqLwojaWZuZGVmIElQQ19JTkZPCiNkZWZpbmUgSVBDX0lORk8gICAgICAgIDMKI2VuZGlmCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBUaGUgbGFzdCBhcmcgb2Ygc2VtY3RsIGlzIGEgdW5pb24gc2VtdW4sIGJ1dCB3aGVyZSBpcyBpdCBkZWZpbmVkPwogICBYL09QRU4gdGVsbHMgdXMgdG8gZGVmaW5lIGl0IG91cnNlbHZlcywgYnV0IHVudGlsIHJlY2VudGx5CiAgIExpbnV4IGluY2x1ZGUgZmlsZXMgd291bGQgYWxzbyBkZWZpbmUgaXQuICovCiNpZm5kZWYgSEFWRV9VTklPTl9TRU1VTgovKiBhY2NvcmRpbmcgdG8gWC9PUEVOIHdlIGhhdmUgdG8gZGVmaW5lIGl0IG91cnNlbHZlcyAqLwp1bmlvbiBzZW11biB7CglpbnQgdmFsOwoJc3RydWN0IHNlbWlkX2RzICpidWY7Cgl1bnNpZ25lZCBzaG9ydCBpbnQgKmFycmF5OwoJc3RydWN0IHNlbWluZm8gKl9fYnVmOwp9OwojZW5kaWYKCi8qIFgvT1BFTiAoSmFuIDE5ODcpIGRvZXMgbm90IGRlZmluZSBmaWVsZHMga2V5LCBzZXEgaW4gc3RydWN0IGlwY19wZXJtOwogICBnbGliYy0xLjA5IGhhcyBubyBzdXBwb3J0IGZvciBzeXN2IGlwYy4KICAgZ2xpYmMgMiB1c2VzIF9fa2V5LCBfX3NlcSAqLwojaWYgZGVmaW5lZCAoX19HTElCQ19fKSAmJiBfX0dMSUJDX18gPj0gMgojZGVmaW5lIEtFWSBfX2tleQojZWxzZQojZGVmaW5lIEtFWSBrZXkKI2VuZGlmCgojZGVmaW5lIExJTUlUUyAxCiNkZWZpbmUgU1RBVFVTIDIKI2RlZmluZSBDUkVBVE9SIDMKI2RlZmluZSBUSU1FIDQKI2RlZmluZSBQSUQgNQoKdm9pZCBkb19zaG0gKGNoYXIgZm9ybWF0KTsKdm9pZCBkb19zZW0gKGNoYXIgZm9ybWF0KTsKdm9pZCBkb19tc2cgKGNoYXIgZm9ybWF0KTsKdm9pZCBwcmludF9zaG0gKGludCBpZCk7CnZvaWQgcHJpbnRfbXNnIChpbnQgaWQpOwp2b2lkIHByaW50X3NlbSAoaW50IGlkKTsKCnN0YXRpYyBjaGFyICpwcm9nbmFtZTsKCnN0YXRpYyB2b2lkCnVzYWdlKGludCByYykgewoJcHJpbnRmIChfKCJ1c2FnZSA6ICVzIC1hc21xIC10Y2x1cCBcbiIpLCBwcm9nbmFtZSk7CglwcmludGYgKF8oIlx0JXMgWy1zIC1tIC1xXSAtaSBpZFxuIiksIHByb2duYW1lKTsKCXByaW50ZiAoXygiXHQlcyAtaCBmb3IgaGVscC5cbiIpLCBwcm9nbmFtZSk7CglleGl0KHJjKTsKfQoKc3RhdGljIHZvaWQKaGVscCAoaW50IHJjKSB7CglwcmludGYgKF8oIiVzIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGlwYyBmYWNpbGl0aWVzIGZvciIKCQkgICIgd2hpY2ggeW91IGhhdmUgcmVhZCBhY2Nlc3MuXG4iKSwgcHJvZ25hbWUpOwoJcHJpbnRmIChfKCJSZXNvdXJjZSBTcGVjaWZpY2F0aW9uOlxuXHQtbSA6IHNoYXJlZF9tZW1cblx0LXEgOiBtZXNzYWdlc1xuIikpOwoJcHJpbnRmIChfKCJcdC1zIDogc2VtYXBob3Jlc1xuXHQtYSA6IGFsbCAoZGVmYXVsdClcbiIpKTsKCXByaW50ZiAoXygiT3V0cHV0IEZvcm1hdDpcblx0LXQgOiB0aW1lXG5cdC1wIDogcGlkXG5cdC1jIDogY3JlYXRvclxuIikpOwoJcHJpbnRmIChfKCJcdC1sIDogbGltaXRzXG5cdC11IDogc3VtbWFyeVxuIikpOwoJcHJpbnRmIChfKCItaSBpZCBbLXMgLXEgLW1dIDogZGV0YWlscyBvbiByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IGlkXG4iKSk7Cgl1c2FnZShyYyk7Cn0KCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCWludCBvcHQsIG1zZyA9IDAsIHNlbSA9IDAsIHNobSA9IDAsIGlkPTAsIHByaW50PTA7CgljaGFyIGZvcm1hdCA9IDA7CgljaGFyIG9wdGlvbnNbXSA9ICJhdGNsdXBoc21xaToiOwoKCXNldGxvY2FsZShMQ19BTEwsICIiKTsKCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7Cgl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoKCXByb2duYW1lID0gYXJndlswXTsKCXdoaWxlICgob3B0ID0gZ2V0b3B0IChhcmdjLCBhcmd2LCBvcHRpb25zKSkgIT0gLTEpIHsKCQlzd2l0Y2ggKG9wdCkgewoJCWNhc2UgJ2knOgoJCQlpZCA9IGF0b2kgKG9wdGFyZyk7CgkJCXByaW50ID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAnYSc6CgkJCW1zZyA9IHNobSA9IHNlbSA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ3EnOgoJCQltc2cgPSAxOwoJCQlicmVhazsKCQljYXNlICdzJzoKCQkJc2VtID0gMTsKCQkJYnJlYWs7CgkJY2FzZSAnbSc6CgkJCXNobSA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgJ3QnOgoJCQlmb3JtYXQgPSBUSU1FOwoJCQlicmVhazsKCQljYXNlICdjJzoKCQkJZm9ybWF0ID0gQ1JFQVRPUjsKCQkJYnJlYWs7CgkJY2FzZSAncCc6CgkJCWZvcm1hdCA9IFBJRDsKCQkJYnJlYWs7CgkJY2FzZSAnbCc6CgkJCWZvcm1hdCA9IExJTUlUUzsKCQkJYnJlYWs7CgkJY2FzZSAndSc6CgkJCWZvcm1hdCA9IFNUQVRVUzsKCQkJYnJlYWs7CgkJY2FzZSAnaCc6CgkJCWhlbHAoRVhJVF9TVUNDRVNTKTsKCQljYXNlICc/JzoKCQkJdXNhZ2UoRVhJVF9TVUNDRVNTKTsKCQl9Cgl9CgoJaWYgIChwcmludCkgewoJCWlmIChzaG0pCgkJCXByaW50X3NobSAoaWQpOwoJCWVsc2UgaWYgKHNlbSkKCQkJcHJpbnRfc2VtIChpZCk7CgkJZWxzZSBpZiAobXNnKQoJCQlwcmludF9tc2cgKGlkKTsKCQllbHNlCgkJCXVzYWdlIChFWElUX0ZBSUxVUkUpOwoJfSBlbHNlIHsKCQlpZiAoICFzaG0gJiYgIW1zZyAmJiAhc2VtKQoJCQltc2cgPSBzZW0gPSBzaG0gPSAxOwoJCXByaW50ZiAoIlxuIik7CgoJCWlmIChzaG0pIHsKCQkJZG9fc2htIChmb3JtYXQpOwoJCQlwcmludGYgKCJcbiIpOwoJCX0KCQlpZiAoc2VtKSB7CgkJCWRvX3NlbSAoZm9ybWF0KTsKCQkJcHJpbnRmICgiXG4iKTsKCQl9CgkJaWYgKG1zZykgewoJCQlkb19tc2cgKGZvcm1hdCk7CgkJCXByaW50ZiAoIlxuIik7CgkJfQoJfQoJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKfQoKCnN0YXRpYyB2b2lkCnByaW50X3Blcm1zIChpbnQgaWQsIHN0cnVjdCBpcGNfcGVybSAqaXBjcCkgewoJc3RydWN0IHBhc3N3ZCAqcHc7CglzdHJ1Y3QgZ3JvdXAgKmdyOwoKCXByaW50ZiAoIiUtMTBkICUtMTBvIiwgaWQsIGlwY3AtPm1vZGUgJiAwNzc3KTsKCglpZiAoKHB3ID0gZ2V0cHd1aWQoaXBjcC0+Y3VpZCkpKQoJCXByaW50ZigiICUtMTBzIiwgcHctPnB3X25hbWUpOwoJZWxzZQoJCXByaW50ZigiICUtMTBkIiwgaXBjcC0+Y3VpZCk7CglpZiAoKGdyID0gZ2V0Z3JnaWQoaXBjcC0+Y2dpZCkpKQoJCXByaW50ZigiICUtMTBzIiwgZ3ItPmdyX25hbWUpOwoJZWxzZQoJCXByaW50ZigiICUtMTBkIiwgaXBjcC0+Y2dpZCk7CgoJaWYgKChwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCkpKQoJCXByaW50ZigiICUtMTBzIiwgcHctPnB3X25hbWUpOwoJZWxzZQoJCXByaW50ZigiICUtMTBkIiwgaXBjcC0+dWlkKTsKCWlmICgoZ3IgPSBnZXRncmdpZChpcGNwLT5naWQpKSkKCQlwcmludGYoIiAlLTEwc1xuIiwgZ3ItPmdyX25hbWUpOwoJZWxzZQoJCXByaW50ZigiICUtMTBkXG4iLCBpcGNwLT5naWQpOwp9CgoKdm9pZCBkb19zaG0gKGNoYXIgZm9ybWF0KQp7CglpbnQgbWF4aWQsIHNobWlkLCBpZDsKCXN0cnVjdCBzaG1pZF9kcyBzaG1zZWc7CglzdHJ1Y3Qgc2htX2luZm8gc2htX2luZm87CglzdHJ1Y3Qgc2htaW5mbyBzaG1pbmZvOwoJc3RydWN0IGlwY19wZXJtICppcGNwID0gJnNobXNlZy5zaG1fcGVybTsKCXN0cnVjdCBwYXNzd2QgKnB3OwoKCW1heGlkID0gc2htY3RsICgwLCBTSE1fSU5GTywgKHN0cnVjdCBzaG1pZF9kcyAqKSAodm9pZCAqKSAmc2htX2luZm8pOwoJaWYgKG1heGlkIDwgMCkgewoJCXByaW50ZiAoXygia2VybmVsIG5vdCBjb25maWd1cmVkIGZvciBzaGFyZWQgbWVtb3J5XG4iKSk7CgkJcmV0dXJuOwoJfQoKCXN3aXRjaCAoZm9ybWF0KSB7CgljYXNlIExJTUlUUzoKCQlwcmludGYgKF8oIi0tLS0tLSBTaGFyZWQgTWVtb3J5IExpbWl0cyAtLS0tLS0tLVxuIikpOwoJCWlmICgoc2htY3RsICgwLCBJUENfSU5GTywgKHN0cnVjdCBzaG1pZF9kcyAqKSAodm9pZCAqKSAmc2htaW5mbykpIDwgMCApCgkJCXJldHVybjsKCQkvKiBnbGliYyAyLjEuMyBhbmQgYWxsIGVhcmxpZXIgbGliYydzIGhhdmUgaW50cyBhcyBmaWVsZHMKCQkgICBvZiBzdHJ1Y3Qgc2htaW5mbzsgZ2xpYmMgMi4xLjkxIGhhcyB1bnNpZ25lZCBsb25nOyBhY2ggKi8KCQlwcmludGYgKF8oIm1heCBudW1iZXIgb2Ygc2VnbWVudHMgPSAlbHVcbiIpLAoJCQkodW5zaWduZWQgbG9uZykgc2htaW5mby5zaG1tbmkpOwoJCXByaW50ZiAoXygibWF4IHNlZyBzaXplIChrYnl0ZXMpID0gJWx1XG4iKSwKCQkJKHVuc2lnbmVkIGxvbmcpIChzaG1pbmZvLnNobW1heCA+PiAxMCkpOwoJCXByaW50ZiAoXygibWF4IHRvdGFsIHNoYXJlZCBtZW1vcnkgKGtieXRlcykgPSAlbGx1XG4iKSwKCQkJZ2V0cGFnZXNpemUoKSAvIDEwMjQgKiAodW5zaWduZWQgbG9uZyBsb25nKSBzaG1pbmZvLnNobWFsbCk7CgkJcHJpbnRmIChfKCJtaW4gc2VnIHNpemUgKGJ5dGVzKSA9ICVsdVxuIiksCgkJCSh1bnNpZ25lZCBsb25nKSBzaG1pbmZvLnNobW1pbik7CgkJcmV0dXJuOwoKCWNhc2UgU1RBVFVTOgoJCXByaW50ZiAoXygiLS0tLS0tIFNoYXJlZCBNZW1vcnkgU3RhdHVzIC0tLS0tLS0tXG4iKSk7CgkJcHJpbnRmIChfKCJzZWdtZW50cyBhbGxvY2F0ZWQgJWRcbiIpLCBzaG1faW5mby51c2VkX2lkcyk7CgkJcHJpbnRmIChfKCJwYWdlcyBhbGxvY2F0ZWQgJWxkXG4iKSwgc2htX2luZm8uc2htX3RvdCk7CgkJcHJpbnRmIChfKCJwYWdlcyByZXNpZGVudCAgJWxkXG4iKSwgc2htX2luZm8uc2htX3Jzcyk7CgkJcHJpbnRmIChfKCJwYWdlcyBzd2FwcGVkICAgJWxkXG4iKSwgc2htX2luZm8uc2htX3N3cCk7CgkJcHJpbnRmIChfKCJTd2FwIHBlcmZvcm1hbmNlOiAlbGQgYXR0ZW1wdHNcdCAlbGQgc3VjY2Vzc2VzXG4iKSwKCQkJc2htX2luZm8uc3dhcF9hdHRlbXB0cywgc2htX2luZm8uc3dhcF9zdWNjZXNzZXMpOwoJCXJldHVybjsKCgljYXNlIENSRUFUT1I6CgkJcHJpbnRmIChfKCItLS0tLS0gU2hhcmVkIE1lbW9yeSBTZWdtZW50IENyZWF0b3JzL093bmVycyAtLS0tLS0tLVxuIikpOwoJCXByaW50ZiAoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAoJCQlfKCJzaG1pZCIpLF8oInBlcm1zIiksXygiY3VpZCIpLF8oImNnaWQiKSxfKCJ1aWQiKSxfKCJnaWQiKSk7CgkJYnJlYWs7CgoJY2FzZSBUSU1FOgoJCXByaW50ZiAoXygiLS0tLS0tIFNoYXJlZCBNZW1vcnkgQXR0YWNoL0RldGFjaC9DaGFuZ2UgVGltZXMgLS0tLS0tLS1cbiIpKTsKCQlwcmludGYgKCIlLTEwcyAlLTEwcyAlLTIwcyAlLTIwcyAlLTIwc1xuIiwKCQkJXygic2htaWQiKSxfKCJvd25lciIpLF8oImF0dGFjaGVkIiksXygiZGV0YWNoZWQiKSwKCQkJXygiY2hhbmdlZCIpKTsKCQlicmVhazsKCgljYXNlIFBJRDoKCQlwcmludGYgKF8oIi0tLS0tLSBTaGFyZWQgTWVtb3J5IENyZWF0b3IvTGFzdC1vcCAtLS0tLS0tLVxuIikpOwoJCXByaW50ZiAoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAoJCQlfKCJzaG1pZCIpLF8oIm93bmVyIiksXygiY3BpZCIpLF8oImxwaWQiKSk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlwcmludGYgKF8oIi0tLS0tLSBTaGFyZWQgTWVtb3J5IFNlZ21lbnRzIC0tLS0tLS0tXG4iKSk7CgkJcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMnNcbiIsCgkJCV8oImtleSIpLF8oInNobWlkIiksXygib3duZXIiKSxfKCJwZXJtcyIpLF8oImJ5dGVzIiksCgkJCV8oIm5hdHRjaCIpLF8oInN0YXR1cyIpKTsKCQlicmVhazsKCX0KCglmb3IgKGlkID0gMDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKCQlzaG1pZCA9IHNobWN0bCAoaWQsIFNITV9TVEFULCAmc2htc2VnKTsKCQlpZiAoc2htaWQgPCAwKQoJCQljb250aW51ZTsKCQlpZiAoZm9ybWF0ID09IENSRUFUT1IpICB7CgkJCXByaW50X3Blcm1zIChzaG1pZCwgaXBjcCk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CgkJc3dpdGNoIChmb3JtYXQpIHsKCQljYXNlIFRJTUU6CgkJCWlmIChwdykKCQkJCXByaW50ZiAoIiUtMTBkICUtMTAuMTBzIiwgc2htaWQsIHB3LT5wd19uYW1lKTsKCQkJZWxzZQoJCQkJcHJpbnRmICgiJS0xMGQgJS0xMGQiLCBzaG1pZCwgaXBjcC0+dWlkKTsKCQkJLyogY3RpbWUgdXNlcyBzdGF0aWMgYnVmZmVyOiB1c2Ugc2VwYXJhdGUgY2FsbHMgKi8KCQkJcHJpbnRmKCIgJS0yMC4xNnMiLCBzaG1zZWcuc2htX2F0aW1lCgkJCSAgICAgICA/IGN0aW1lKCZzaG1zZWcuc2htX2F0aW1lKSArIDQgOiBfKCJOb3Qgc2V0IikpOwoJCQlwcmludGYoIiAlLTIwLjE2cyIsIHNobXNlZy5zaG1fZHRpbWUKCQkJICAgICAgID8gY3RpbWUoJnNobXNlZy5zaG1fZHRpbWUpICsgNCA6IF8oIk5vdCBzZXQiKSk7CgkJCXByaW50ZigiICUtMjAuMTZzXG4iLCBzaG1zZWcuc2htX2N0aW1lCgkJCSAgICAgICA/IGN0aW1lKCZzaG1zZWcuc2htX2N0aW1lKSArIDQgOiBfKCJOb3Qgc2V0IikpOwoJCQlicmVhazsKCQljYXNlIFBJRDoKCQkJaWYgKHB3KQoJCQkJcHJpbnRmICgiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQlwcmludGYgKCIlLTEwZCAlLTEwZCIsIHNobWlkLCBpcGNwLT51aWQpOwoJCQlwcmludGYgKCIgJS0xMGQgJS0xMGRcbiIsCgkJCQlzaG1zZWcuc2htX2NwaWQsIHNobXNlZy5zaG1fbHBpZCk7CgkJCWJyZWFrOwoKCQlkZWZhdWx0OgoJCSAgICAgICAgcHJpbnRmKCIweCUwOHggIixpcGNwLT5LRVkgKTsKCQkJaWYgKHB3KQoJCQkJcHJpbnRmICgiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQlwcmludGYgKCIlLTEwZCAlLTEwZCIsIHNobWlkLCBpcGNwLT51aWQpOwoJCQlwcmludGYgKCIgJS0xMG8gJS0xMGx1ICUtMTBsZCAlLTZzICUtNnNcbiIsCgkJCQlpcGNwLT5tb2RlICYgMDc3NywKCQkJCS8qCgkJCQkgKiBlYXJsaWVyOiBpbnQsIEF1c3RpbiBoYXMgc2l6ZV90CgkJCQkgKi8KCQkJCSh1bnNpZ25lZCBsb25nKSBzaG1zZWcuc2htX3NlZ3N6LAoJCQkJLyoKCQkJCSAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKCQkJCSAqIEF1c3RpbiBoYXMgc2htYXR0X3QKCQkJCSAqLwoJCQkJKGxvbmcpIHNobXNlZy5zaG1fbmF0dGNoLAoJCQkJaXBjcC0+bW9kZSAmIFNITV9ERVNUID8gXygiZGVzdCIpIDogIiAiLAoJCQkJaXBjcC0+bW9kZSAmIFNITV9MT0NLRUQgPyBfKCJsb2NrZWQiKSA6ICIgIik7CgkJCWJyZWFrOwoJCX0KCX0KCXJldHVybjsKfQoKCnZvaWQgZG9fc2VtIChjaGFyIGZvcm1hdCkKewoJaW50IG1heGlkLCBzZW1pZCwgaWQ7CglzdHJ1Y3Qgc2VtaWRfZHMgc2VtYXJ5OwoJc3RydWN0IHNlbWluZm8gc2VtaW5mbzsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzZW1hcnkuc2VtX3Blcm07CglzdHJ1Y3QgcGFzc3dkICpwdzsKCXVuaW9uIHNlbXVuIGFyZzsKCglhcmcuYXJyYXkgPSAodXNob3J0ICopICAodm9pZCAqKSAmc2VtaW5mbzsKCW1heGlkID0gc2VtY3RsICgwLCAwLCBTRU1fSU5GTywgYXJnKTsKCWlmIChtYXhpZCA8IDApIHsKCQlwcmludGYgKF8oImtlcm5lbCBub3QgY29uZmlndXJlZCBmb3Igc2VtYXBob3Jlc1xuIikpOwoJCXJldHVybjsKCX0KCglzd2l0Y2ggKGZvcm1hdCkgewoJY2FzZSBMSU1JVFM6CgkJcHJpbnRmIChfKCItLS0tLS0gU2VtYXBob3JlIExpbWl0cyAtLS0tLS0tLVxuIikpOwoJCWFyZy5hcnJheSA9ICh1c2hvcnQgKikgKHZvaWQgKikgJnNlbWluZm87IC8qIGRhbW4gdW5pb24gKi8KCQlpZiAoKHNlbWN0bCAoMCwgMCwgSVBDX0lORk8sIGFyZykpIDwgMCApCgkJCXJldHVybjsKCQlwcmludGYgKF8oIm1heCBudW1iZXIgb2YgYXJyYXlzID0gJWRcbiIpLCBzZW1pbmZvLnNlbW1uaSk7CgkJcHJpbnRmIChfKCJtYXggc2VtYXBob3JlcyBwZXIgYXJyYXkgPSAlZFxuIiksIHNlbWluZm8uc2VtbXNsKTsKCQlwcmludGYgKF8oIm1heCBzZW1hcGhvcmVzIHN5c3RlbSB3aWRlID0gJWRcbiIpLCBzZW1pbmZvLnNlbW1ucyk7CgkJcHJpbnRmIChfKCJtYXggb3BzIHBlciBzZW1vcCBjYWxsID0gJWRcbiIpLCBzZW1pbmZvLnNlbW9wbSk7CgkJcHJpbnRmIChfKCJzZW1hcGhvcmUgbWF4IHZhbHVlID0gJWRcbiIpLCBzZW1pbmZvLnNlbXZteCk7CgkJcmV0dXJuOwoKCWNhc2UgU1RBVFVTOgoJCXByaW50ZiAoXygiLS0tLS0tIFNlbWFwaG9yZSBTdGF0dXMgLS0tLS0tLS1cbiIpKTsKCQlwcmludGYgKF8oInVzZWQgYXJyYXlzID0gJWRcbiIpLCBzZW1pbmZvLnNlbXVzeik7CgkJcHJpbnRmIChfKCJhbGxvY2F0ZWQgc2VtYXBob3JlcyA9ICVkXG4iKSwgc2VtaW5mby5zZW1hZW0pOwoJCXJldHVybjsKCgljYXNlIENSRUFUT1I6CgkJcHJpbnRmIChfKCItLS0tLS0gU2VtYXBob3JlIEFycmF5cyBDcmVhdG9ycy9Pd25lcnMgLS0tLS0tLS1cbiIpKTsKCQlwcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkJXygic2VtaWQiKSxfKCJwZXJtcyIpLF8oImN1aWQiKSxfKCJjZ2lkIiksXygidWlkIiksXygiZ2lkIikpOwoJCWJyZWFrOwoKCWNhc2UgVElNRToKCQlwcmludGYgKF8oIi0tLS0tLSBTZW1hcGhvcmUgT3BlcmF0aW9uL0NoYW5nZSBUaW1lcyAtLS0tLS0tLVxuIikpOwoJCXByaW50ZiAoIiUtOHMgJS0xMHMgJS0yNi4yNHMgJS0yNi4yNHNcbiIsCgkJCV8oInNlbWlkIiksXygib3duZXIiKSxfKCJsYXN0LW9wIiksXygibGFzdC1jaGFuZ2VkIikpOwoJCWJyZWFrOwoKCWNhc2UgUElEOgoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJcHJpbnRmIChfKCItLS0tLS0gU2VtYXBob3JlIEFycmF5cyAtLS0tLS0tLVxuIikpOwoJCXByaW50ZiAoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAoJCQlfKCJrZXkiKSxfKCJzZW1pZCIpLF8oIm93bmVyIiksXygicGVybXMiKSxfKCJuc2VtcyIpKTsKCQlicmVhazsKCX0KCglmb3IgKGlkID0gMDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKCQlhcmcuYnVmID0gKHN0cnVjdCBzZW1pZF9kcyAqKSAmc2VtYXJ5OwoJCXNlbWlkID0gc2VtY3RsIChpZCwgMCwgU0VNX1NUQVQsIGFyZyk7CgkJaWYgKHNlbWlkIDwgMCkKCQkJY29udGludWU7CgkJaWYgKGZvcm1hdCA9PSBDUkVBVE9SKSAgewoJCQlwcmludF9wZXJtcyAoc2VtaWQsIGlwY3ApOwoJCQljb250aW51ZTsKCQl9CgkJcHcgPSBnZXRwd3VpZChpcGNwLT51aWQpOwoJCXN3aXRjaCAoZm9ybWF0KSB7CgkJY2FzZSBUSU1FOgoJCQlpZiAocHcpCgkJCQlwcmludGYgKCIlLThkICUtMTAuMTBzIiwgc2VtaWQsIHB3LT5wd19uYW1lKTsKCQkJZWxzZQoJCQkJcHJpbnRmICgiJS04ZCAlLTEwZCIsIHNlbWlkLCBpcGNwLT51aWQpOwoJCQlwcmludGYgKCIgICUtMjYuMjRzIiwgc2VtYXJ5LnNlbV9vdGltZQoJCQkJPyBjdGltZSgmc2VtYXJ5LnNlbV9vdGltZSkgOiBfKCJOb3Qgc2V0IikpOwoJCQlwcmludGYgKCIgJS0yNi4yNHNcbiIsIHNlbWFyeS5zZW1fY3RpbWUKCQkJCT8gY3RpbWUoJnNlbWFyeS5zZW1fY3RpbWUpIDogXygiTm90IHNldCIpKTsKCQkJYnJlYWs7CgkJY2FzZSBQSUQ6CgkJCWJyZWFrOwoKCQlkZWZhdWx0OgoJCSAgICAgICAgcHJpbnRmKCIweCUwOHggIiwgaXBjcC0+S0VZKTsKCQkJaWYgKHB3KQoJCQkJcHJpbnRmICgiJS0xMGQgJS0xMC4xMHMiLCBzZW1pZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQlwcmludGYgKCIlLTEwZCAlLTEwZCIsIHNlbWlkLCBpcGNwLT51aWQpOwoJCQlwcmludGYgKCIgJS0xMG8gJS0xMGxkXG4iLAoJCQkJaXBjcC0+bW9kZSAmIDA3NzcsCgkJCQkvKgoJCQkJICogZ2xpYmMtMi4xLjMgYW5kIGVhcmxpZXIgaGFzIHVuc2lnbmVkIHNob3J0OwoJCQkJICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgoJCQkJICogdW5zaWduZWQgc2hvcnQgYW5kIHVuc2lnbmVkIGxvbmcKCQkJCSAqIEF1c3RpbiBwcmVzY3JpYmVzIHVuc2lnbmVkIHNob3J0LgoJCQkJICovCgkJCQkobG9uZykgc2VtYXJ5LnNlbV9uc2Vtcyk7CgkJCWJyZWFrOwoJCX0KCX0KfQoKCnZvaWQgZG9fbXNnIChjaGFyIGZvcm1hdCkKewoJaW50IG1heGlkLCBtc3FpZCwgaWQ7CglzdHJ1Y3QgbXNxaWRfZHMgbXNncXVlOwoJc3RydWN0IG1zZ2luZm8gbXNnaW5mbzsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZtc2dxdWUubXNnX3Blcm07CglzdHJ1Y3QgcGFzc3dkICpwdzsKCgltYXhpZCA9IG1zZ2N0bCAoMCwgTVNHX0lORk8sIChzdHJ1Y3QgbXNxaWRfZHMgKikgKHZvaWQgKikgJm1zZ2luZm8pOwoJaWYgKG1heGlkIDwgMCkgewoJCXByaW50ZiAoXygia2VybmVsIG5vdCBjb25maWd1cmVkIGZvciBtZXNzYWdlIHF1ZXVlc1xuIikpOwoJCXJldHVybjsKCX0KCglzd2l0Y2ggKGZvcm1hdCkgewoJY2FzZSBMSU1JVFM6CgkJaWYgKChtc2djdGwgKDAsIElQQ19JTkZPLCAoc3RydWN0IG1zcWlkX2RzICopICh2b2lkICopICZtc2dpbmZvKSkgPCAwICkKCQkJcmV0dXJuOwoJCXByaW50ZiAoXygiLS0tLS0tIE1lc3NhZ2VzOiBMaW1pdHMgLS0tLS0tLS1cbiIpKTsKCQlwcmludGYgKF8oIm1heCBxdWV1ZXMgc3lzdGVtIHdpZGUgPSAlZFxuIiksIG1zZ2luZm8ubXNnbW5pKTsKCQlwcmludGYgKF8oIm1heCBzaXplIG9mIG1lc3NhZ2UgKGJ5dGVzKSA9ICVkXG4iKSwgbXNnaW5mby5tc2dtYXgpOwoJCXByaW50ZiAoXygiZGVmYXVsdCBtYXggc2l6ZSBvZiBxdWV1ZSAoYnl0ZXMpID0gJWRcbiIpLCBtc2dpbmZvLm1zZ21uYik7CgkJcmV0dXJuOwoKCWNhc2UgU1RBVFVTOgoJCXByaW50ZiAoXygiLS0tLS0tIE1lc3NhZ2VzOiBTdGF0dXMgLS0tLS0tLS1cbiIpKTsKCQlwcmludGYgKF8oImFsbG9jYXRlZCBxdWV1ZXMgPSAlZFxuIiksIG1zZ2luZm8ubXNncG9vbCk7CgkJcHJpbnRmIChfKCJ1c2VkIGhlYWRlcnMgPSAlZFxuIiksIG1zZ2luZm8ubXNnbWFwKTsKCQlwcmludGYgKF8oInVzZWQgc3BhY2UgPSAlZCBieXRlc1xuIiksIG1zZ2luZm8ubXNndHFsKTsKCQlyZXR1cm47CgoJY2FzZSBDUkVBVE9SOgoJCXByaW50ZiAoXygiLS0tLS0tIE1lc3NhZ2UgUXVldWVzOiBDcmVhdG9ycy9Pd25lcnMgLS0tLS0tLS1cbiIpKTsKCQlwcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkJXygibXNxaWQiKSxfKCJwZXJtcyIpLF8oImN1aWQiKSxfKCJjZ2lkIiksXygidWlkIiksXygiZ2lkIikpOwoJCWJyZWFrOwoKCWNhc2UgVElNRToKCQlwcmludGYgKF8oIi0tLS0tLSBNZXNzYWdlIFF1ZXVlcyBTZW5kL1JlY3YvQ2hhbmdlIFRpbWVzIC0tLS0tLS0tXG4iKSk7CgkJcHJpbnRmICgiJS04cyAlLTEwcyAlLTIwcyAlLTIwcyAlLTIwc1xuIiwKCQkJXygibXNxaWQiKSxfKCJvd25lciIpLF8oInNlbmQiKSxfKCJyZWN2IiksXygiY2hhbmdlIikpOwoJCWJyZWFrOwoKCWNhc2UgUElEOgoJCXByaW50ZiAoXygiLS0tLS0tIE1lc3NhZ2UgUXVldWVzIFBJRHMgLS0tLS0tLS1cbiIpKTsKCQlwcmludGYgKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKCQkJXygibXNxaWQiKSxfKCJvd25lciIpLF8oImxzcGlkIiksXygibHJwaWQiKSk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlwcmludGYgKF8oIi0tLS0tLSBNZXNzYWdlIFF1ZXVlcyAtLS0tLS0tLVxuIikpOwoJCXByaW50ZiAoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTJzICUtMTJzXG4iLAoJCQlfKCJrZXkiKSwgXygibXNxaWQiKSwgXygib3duZXIiKSwgXygicGVybXMiKSwKCQkJXygidXNlZC1ieXRlcyIpLCBfKCJtZXNzYWdlcyIpKTsKCQlicmVhazsKCX0KCglmb3IgKGlkID0gMDsgaWQgPD0gbWF4aWQ7IGlkKyspIHsKCQltc3FpZCA9IG1zZ2N0bCAoaWQsIE1TR19TVEFULCAmbXNncXVlKTsKCQlpZiAobXNxaWQgPCAwKQoJCQljb250aW51ZTsKCQlpZiAoZm9ybWF0ID09IENSRUFUT1IpICB7CgkJCXByaW50X3Blcm1zIChtc3FpZCwgaXBjcCk7CgkJCWNvbnRpbnVlOwoJCX0KCQlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CgkJc3dpdGNoIChmb3JtYXQpIHsKCQljYXNlIFRJTUU6CgkJCWlmIChwdykKCQkJCXByaW50ZiAoIiUtOGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQlwcmludGYgKCIlLThkICUtMTBkIiwgbXNxaWQsIGlwY3AtPnVpZCk7CgkJCXByaW50ZiAoIiAlLTIwLjE2cyIsIG1zZ3F1ZS5tc2dfc3RpbWUKCQkJCT8gY3RpbWUoJm1zZ3F1ZS5tc2dfc3RpbWUpICsgNCA6IF8oIk5vdCBzZXQiKSk7CgkJCXByaW50ZiAoIiAlLTIwLjE2cyIsIG1zZ3F1ZS5tc2dfcnRpbWUKCQkJCT8gY3RpbWUoJm1zZ3F1ZS5tc2dfcnRpbWUpICsgNCA6IF8oIk5vdCBzZXQiKSk7CgkJCXByaW50ZiAoIiAlLTIwLjE2c1xuIiwgbXNncXVlLm1zZ19jdGltZQoJCQkJPyBjdGltZSgmbXNncXVlLm1zZ19jdGltZSkgKyA0IDogXygiTm90IHNldCIpKTsKCQkJYnJlYWs7CgkJY2FzZSBQSUQ6CgkJCWlmIChwdykKCQkJCXByaW50ZiAoIiUtOGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQlwcmludGYgKCIlLThkICUtMTBkIiwgbXNxaWQsIGlwY3AtPnVpZCk7CgkJCXByaW50ZiAoIiAgJTVkICAgICAlNWRcbiIsCgkJCQltc2dxdWUubXNnX2xzcGlkLCBtc2dxdWUubXNnX2xycGlkKTsKCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJICAgICAgICBwcmludGYoICIweCUwOHggIixpcGNwLT5LRVkgKTsKCQkJaWYgKHB3KQoJCQkJcHJpbnRmICgiJS0xMGQgJS0xMC4xMHMiLCBtc3FpZCwgcHctPnB3X25hbWUpOwoJCQllbHNlCgkJCQlwcmludGYgKCIlLTEwZCAlLTEwZCIsIG1zcWlkLCBpcGNwLT51aWQpOwoJCQlwcmludGYgKCIgJS0xMG8gJS0xMmxkICUtMTJsZFxuIiwKCQkJCWlwY3AtPm1vZGUgJiAwNzc3LAoJCQkJLyoKCQkJCSAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKCQkJCSAqIGdsaWJjLTIuMS45MSBoYXMgdmFyaWF0aW9uIGJldHdlZW4KCQkJCSAqIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nCgkJCQkgKiBBdXN0aW4gaGFzIG1zZ3FudW1fdAoJCQkJICovCgkJCQkobG9uZykgbXNncXVlLm1zZ19jYnl0ZXMsCgkJCQkobG9uZykgbXNncXVlLm1zZ19xbnVtKTsKCQkJYnJlYWs7CgkJfQoJfQoJcmV0dXJuOwp9CgoKdm9pZCBwcmludF9zaG0gKGludCBzaG1pZCkKewoJc3RydWN0IHNobWlkX2RzIHNobWRzOwoJc3RydWN0IGlwY19wZXJtICppcGNwID0gJnNobWRzLnNobV9wZXJtOwoKCWlmIChzaG1jdGwgKHNobWlkLCBJUENfU1RBVCwgJnNobWRzKSA9PSAtMSkKCQllcnIoRVhJVF9GQUlMVVJFLCBfKCJzaG1jdGwgZmFpbGVkIikpOwoKCXByaW50ZiAoXygiXG5TaGFyZWQgbWVtb3J5IFNlZ21lbnQgc2htaWQ9JWRcbiIpLCBzaG1pZCk7CglwcmludGYgKF8oInVpZD0lZFx0Z2lkPSVkXHRjdWlkPSVkXHRjZ2lkPSVkXG4iKSwKCQlpcGNwLT51aWQsIGlwY3AtPmdpZCwgaXBjcC0+Y3VpZCwgaXBjcC0+Y2dpZCk7CglwcmludGYgKF8oIm1vZGU9JSNvXHRhY2Nlc3NfcGVybXM9JSNvXG4iKSwKCQlpcGNwLT5tb2RlLCBpcGNwLT5tb2RlICYgMDc3Nyk7CglwcmludGYgKF8oImJ5dGVzPSVsZFx0bHBpZD0lZFx0Y3BpZD0lZFx0bmF0dGNoPSVsZFxuIiksCgkJKGxvbmcpIHNobWRzLnNobV9zZWdzeiwgc2htZHMuc2htX2xwaWQsIHNobWRzLnNobV9jcGlkLAoJCShsb25nKSBzaG1kcy5zaG1fbmF0dGNoKTsKCXByaW50ZiAoXygiYXR0X3RpbWU9JS0yNi4yNHNcbiIpLAoJCXNobWRzLnNobV9hdGltZSA/IGN0aW1lICgmc2htZHMuc2htX2F0aW1lKSA6IF8oIk5vdCBzZXQiKSk7CglwcmludGYgKF8oImRldF90aW1lPSUtMjYuMjRzXG4iKSwKCQlzaG1kcy5zaG1fZHRpbWUgPyBjdGltZSAoJnNobWRzLnNobV9kdGltZSkgOiBfKCJOb3Qgc2V0IikpOwoJcHJpbnRmIChfKCJjaGFuZ2VfdGltZT0lLTI2LjI0c1xuIiksIGN0aW1lICgmc2htZHMuc2htX2N0aW1lKSk7CglwcmludGYgKCJcbiIpOwoJcmV0dXJuOwp9CgoKdm9pZCBwcmludF9tc2cgKGludCBtc3FpZCkKewoJc3RydWN0IG1zcWlkX2RzIGJ1ZjsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZidWYubXNnX3Blcm07CgoJaWYgKG1zZ2N0bCAobXNxaWQsIElQQ19TVEFULCAmYnVmKSA9PSAtMSkKCQllcnIoRVhJVF9GQUlMVVJFLCBfKCJtc2djdGwgZmFpbGVkIikpOwoKCXByaW50ZiAoXygiXG5NZXNzYWdlIFF1ZXVlIG1zcWlkPSVkXG4iKSwgbXNxaWQpOwoJcHJpbnRmIChfKCJ1aWQ9JWRcdGdpZD0lZFx0Y3VpZD0lZFx0Y2dpZD0lZFx0bW9kZT0lI29cbiIpLAoJCWlwY3AtPnVpZCwgaXBjcC0+Z2lkLCBpcGNwLT5jdWlkLCBpcGNwLT5jZ2lkLCBpcGNwLT5tb2RlKTsKCXByaW50ZiAoXygiY2J5dGVzPSVsZFx0cWJ5dGVzPSVsZFx0cW51bT0lbGRcdGxzcGlkPSVkXHRscnBpZD0lZFxuIiksCgkJLyoKCQkgKiBnbGliYy0yLjEuMyBhbmQgZWFybGllciBoYXMgdW5zaWduZWQgc2hvcnQ7CgkJICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgoJCSAqIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nCgkJICogQXVzdGluIGhhcyBtc2dxbnVtX3QgKGZvciBtc2dfcWJ5dGVzKQoJCSAqLwoJCShsb25nKSBidWYubXNnX2NieXRlcywgKGxvbmcpIGJ1Zi5tc2dfcWJ5dGVzLAoJCShsb25nKSBidWYubXNnX3FudW0sIGJ1Zi5tc2dfbHNwaWQsIGJ1Zi5tc2dfbHJwaWQpOwoJcHJpbnRmIChfKCJzZW5kX3RpbWU9JS0yNi4yNHNcbiIpLAoJCWJ1Zi5tc2dfc3RpbWUgPyBjdGltZSAoJmJ1Zi5tc2dfc3RpbWUpIDogXygiTm90IHNldCIpKTsKCXByaW50ZiAoXygicmN2X3RpbWU9JS0yNi4yNHNcbiIpLAoJCWJ1Zi5tc2dfcnRpbWUgPyBjdGltZSAoJmJ1Zi5tc2dfcnRpbWUpIDogXygiTm90IHNldCIpKTsKCXByaW50ZiAoXygiY2hhbmdlX3RpbWU9JS0yNi4yNHNcbiIpLAoJCWJ1Zi5tc2dfY3RpbWUgPyBjdGltZSAoJmJ1Zi5tc2dfY3RpbWUpIDogXygiTm90IHNldCIpKTsKCXByaW50ZiAoIlxuIik7CglyZXR1cm47Cn0KCnZvaWQgcHJpbnRfc2VtIChpbnQgc2VtaWQpCnsKCXN0cnVjdCBzZW1pZF9kcyBzZW1kczsKCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzZW1kcy5zZW1fcGVybTsKCXVuaW9uIHNlbXVuIGFyZzsKCWludCBpOwoKCWFyZy5idWYgPSAmc2VtZHM7CglpZiAoc2VtY3RsIChzZW1pZCwgMCwgSVBDX1NUQVQsIGFyZykgPCAwKQoJCWVycihFWElUX0ZBSUxVUkUsIF8oInNlbWN0bCBmYWlsZWQiKSk7CgoJcHJpbnRmIChfKCJcblNlbWFwaG9yZSBBcnJheSBzZW1pZD0lZFxuIiksIHNlbWlkKTsKCXByaW50ZiAoXygidWlkPSVkXHQgZ2lkPSVkXHQgY3VpZD0lZFx0IGNnaWQ9JWRcbiIpLAoJCWlwY3AtPnVpZCwgaXBjcC0+Z2lkLCBpcGNwLT5jdWlkLCBpcGNwLT5jZ2lkKTsKCXByaW50ZiAoXygibW9kZT0lI28sIGFjY2Vzc19wZXJtcz0lI29cbiIpLAoJCWlwY3AtPm1vZGUsIGlwY3AtPm1vZGUgJiAwNzc3KTsKCXByaW50ZiAoXygibnNlbXMgPSAlbGRcbiIpLCAobG9uZykgc2VtZHMuc2VtX25zZW1zKTsKCXByaW50ZiAoXygib3RpbWUgPSAlLTI2LjI0c1xuIiksCgkJc2VtZHMuc2VtX290aW1lID8gY3RpbWUgKCZzZW1kcy5zZW1fb3RpbWUpIDogXygiTm90IHNldCIpKTsKCXByaW50ZiAoXygiY3RpbWUgPSAlLTI2LjI0c1xuIiksIGN0aW1lICgmc2VtZHMuc2VtX2N0aW1lKSk7CgoJcHJpbnRmICgiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCgkJXygic2VtbnVtIiksXygidmFsdWUiKSxfKCJuY291bnQiKSxfKCJ6Y291bnQiKSxfKCJwaWQiKSk7CglhcmcudmFsID0gMDsKCWZvciAoaT0wOyBpPCBzZW1kcy5zZW1fbnNlbXM7IGkrKykgewoJCWludCB2YWwsIG5jbnQsIHpjbnQsIHBpZDsKCQl2YWwgPSBzZW1jdGwgKHNlbWlkLCBpLCBHRVRWQUwsIGFyZyk7CgkJbmNudCA9IHNlbWN0bCAoc2VtaWQsIGksIEdFVE5DTlQsIGFyZyk7CgkJemNudCA9IHNlbWN0bCAoc2VtaWQsIGksIEdFVFpDTlQsIGFyZyk7CgkJcGlkID0gc2VtY3RsIChzZW1pZCwgaSwgR0VUUElELCBhcmcpOwoJCWlmICh2YWwgPCAwIHx8IG5jbnQgPCAwIHx8IHpjbnQgPCAwIHx8IHBpZCA8IDApCgkJCWVycihFWElUX0ZBSUxVUkUsIF8oInNlbWN0bCBmYWlsZWQiKSk7CgoJCXByaW50ZiAoIiUtMTBkICUtMTBkICUtMTBkICUtMTBkICUtMTBkXG4iLAoJCQlpLCB2YWwsIG5jbnQsIHpjbnQsIHBpZCk7Cgl9CglwcmludGYgKCJcbiIpOwoJcmV0dXJuOwp9Cg==