Lyogdmlzb3JjaGFubmVsLmgKICoKICogQ29weXJpZ2h0IKkgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAogKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKICogZGV0YWlscy4KICovCgojaWZuZGVmIF9fVklTT1JDSEFOTkVMX0hfXwojZGVmaW5lIF9fVklTT1JDSEFOTkVMX0hfXwoKI2luY2x1ZGUgImNvbW1vbnR5cGVzLmgiCiNpbmNsdWRlICJtZW1yZWdpb24uaCIKI2luY2x1ZGUgImNoYW5uZWwuaCIKI2lmbmRlZiBIT1NUQUREUkVTUwojZGVmaW5lIEhPU1RBRERSRVNTIFU2NAojZW5kaWYKI2lmbmRlZiBCT09MCiNkZWZpbmUgQk9PTCBpbnQKI2VuZGlmCgovKiBWSVNPUkNIQU5ORUwgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0byB1c2Vycy4KICogRmllbGRzIGFyZSBkZWNsYXJlZCBvbmx5IGluIHRoZSBpbXBsZW1lbnRhdGlvbiAuYyBmaWxlcy4KICovCnR5cGVkZWYgc3RydWN0IFZJU09SQ0hBTk5FTF9UYWcgVklTT1JDSEFOTkVMOwoKLyogTm90ZSB0aGF0IGZvciB2aXNvcmNoYW5uZWxfY3JlYXRlKCkgYW5kIHZpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZCgpLAogKiA8Y2hhbm5lbEJ5dGVzPiBhbmQgPGd1aWQ+IGFyZ3VtZW50cyBtYXkgYmUgMCBpZiB3ZSBhcmUgYSBjaGFubmVsIENMSUVOVC4KICogSW4gdGhpcyBjYXNlLCB0aGUgdmFsdWVzIGNhbiBzaW1wbHkgYmUgcmVhZCBmcm9tIHRoZSBjaGFubmVsIGhlYWRlci4KICovClZJU09SQ0hBTk5FTCAqdmlzb3JjaGFubmVsX2NyZWF0ZShIT1NUQUREUkVTUyBwaHlzYWRkciwKCQkJCSAgdWxvbmcgY2hhbm5lbEJ5dGVzLCBHVUlEIGd1aWQpOwpWSVNPUkNIQU5ORUwgKnZpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZCh1bG9uZyBjaGFubmVsQnl0ZXMsCgkJCQkJICAgICBWSVNPUkNIQU5ORUwgKnBhcmVudCwgdWxvbmcgb2ZmLAoJCQkJCSAgICAgR1VJRCBndWlkKTsKVklTT1JDSEFOTkVMICp2aXNvcmNoYW5uZWxfY3JlYXRlX3dpdGhfbG9jayhIT1NUQUREUkVTUyBwaHlzYWRkciwKCQkJCQkgICAgdWxvbmcgY2hhbm5lbEJ5dGVzLCBHVUlEIGd1aWQpOwpWSVNPUkNIQU5ORUwgKnZpc29yY2hhbm5lbF9jcmVhdGVfb3ZlcmxhcHBlZF93aXRoX2xvY2sodWxvbmcgY2hhbm5lbEJ5dGVzLAoJCQkJCQkgICAgICAgVklTT1JDSEFOTkVMICpwYXJlbnQsCgkJCQkJCSAgICAgICB1bG9uZyBvZmYsIEdVSUQgZ3VpZCk7CnZvaWQgdmlzb3JjaGFubmVsX2Rlc3Ryb3koVklTT1JDSEFOTkVMICpjaGFubmVsKTsKaW50IHZpc29yY2hhbm5lbF9yZWFkKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAoJCSAgICAgIHZvaWQgKmxvY2FsLCB1bG9uZyBuYnl0ZXMpOwppbnQgdmlzb3JjaGFubmVsX3dyaXRlKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgdWxvbmcgb2Zmc2V0LAoJCSAgICAgICB2b2lkICpsb2NhbCwgdWxvbmcgbmJ5dGVzKTsKaW50IHZpc29yY2hhbm5lbF9jbGVhcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIHVsb25nIG9mZnNldCwKCQkgICAgICAgVTggY2gsIHVsb25nIG5ieXRlcyk7CkJPT0wgdmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIFUzMiBxdWV1ZSwgdm9pZCAqbXNnKTsKQk9PTCB2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlLCB2b2lkICptc2cpOwppbnQgdmlzb3JjaGFubmVsX3NpZ25hbHF1ZXVlX3Nsb3RzX2F2YWlsKFZJU09SQ0hBTk5FTCAqY2hhbm5lbCwgVTMyIHF1ZXVlKTsKaW50IHZpc29yY2hhbm5lbF9zaWduYWxxdWV1ZV9tYXhfc2xvdHMoVklTT1JDSEFOTkVMICpjaGFubmVsLCBVMzIgcXVldWUpOwoKSE9TVEFERFJFU1Mgdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOwp1bG9uZyB2aXNvcmNoYW5uZWxfZ2V0X25ieXRlcyhWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOwpjaGFyICp2aXNvcmNoYW5uZWxfaWQoVklTT1JDSEFOTkVMICpjaGFubmVsLCBjaGFyICpzKTsKY2hhciAqdmlzb3JjaGFubmVsX3pvbmVpZChWSVNPUkNIQU5ORUwgKmNoYW5uZWwsIGNoYXIgKnMpOwpVNjQgdmlzb3JjaGFubmVsX2dldF9jbGllbnRwYXJ0aXRpb24oVklTT1JDSEFOTkVMICpjaGFubmVsKTsKR1VJRCB2aXNvcmNoYW5uZWxfZ2V0X0dVSUQoVklTT1JDSEFOTkVMICpjaGFubmVsKTsKTUVNUkVHSU9OICp2aXNvcmNoYW5uZWxfZ2V0X21lbXJlZ2lvbihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOwpjaGFyICp2aXNvcmNoYW5uZWxfR1VJRF9pZChHVUlEICpndWlkLCBjaGFyICpzKTsKdm9pZCB2aXNvcmNoYW5uZWxfZGVidWcoVklTT1JDSEFOTkVMICpjaGFubmVsLCBpbnQgblF1ZXVlcywKCQkJc3RydWN0IHNlcV9maWxlICpzZXEsIFUzMiBvZmYpOwp2b2lkIHZpc29yY2hhbm5lbF9kdW1wX3NlY3Rpb24oVklTT1JDSEFOTkVMICpjaGFuLCBjaGFyICpzLAoJCQkgICAgICAgaW50IG9mZiwgaW50IGxlbiwgc3RydWN0IHNlcV9maWxlICpzZXEpOwp2b2lkICp2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihWSVNPUkNIQU5ORUwgKmNoYW5uZWwpOwoKI2RlZmluZQlWSVNPUkNIQU5ORUxfQ0hBTkdFX1NFUlZFUl9TVEFURShjaGFuLCBjaGFuSWQsIG5ld3N0YXRlKQlcCglkbyB7CQkJCQkJCQlcCgkJVTggKnAgPSAoVTggKil2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihjaGFuKTsJCVwKCQlpZiAocCkgewkJCQkJCVwKCQkJVUxUUkFfQ0hBTk5FTF9TRVJWRVJfVFJBTlNJVElPTihwLCBjaGFuSWQsIFNydlN0YXRlLCBcCgkJCQkJCQluZXdzdGF0ZSwgbG9nQ3R4KTsgXAoJCQl2aXNvcmNoYW5uZWxfd3JpdGUJCQkJXAoJCQkJKGNoYW4sCQkJCQlcCgkJCQkgb2Zmc2V0b2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCwgU3J2U3RhdGUpLCBcCgkJCQkgcCArCQkJCQlcCgkJCQkgb2Zmc2V0b2YoVUxUUkFfQ0hBTk5FTF9QUk9UT0NPTCwgU3J2U3RhdGUpLCBcCgkJCQkgc2l6ZW9mKFUzMikpOwkJCQlcCgkJfQkJCQkJCQlcCgl9IHdoaWxlICgwKQoKI2RlZmluZQlWSVNPUkNIQU5ORUxfQ0hBTkdFX0NMSUVOVF9TVEFURShjaGFuLCBjaGFuSWQsIG5ld3N0YXRlKQlcCglkbyB7CQkJCQkJCQlcCgkJVTggKnAgPSAoVTggKil2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihjaGFuKTsJCVwKCQlpZiAocCkgewkJCQkJCVwKCQkJVUxUUkFfQ0hBTk5FTF9DTElFTlRfVFJBTlNJVElPTihwLCBjaGFuSWQsCVwKCQkJCQkJCW5ld3N0YXRlLCBsb2dDdHgpOyBcCgkJCXZpc29yY2hhbm5lbF93cml0ZQkJCQlcCgkJCQkoY2hhbiwJCQkJCVwKCQkJCSBvZmZzZXRvZihVTFRSQV9DSEFOTkVMX1BST1RPQ09MLCBDbGlTdGF0ZU9TKSwgXAoJCQkJIHAgKwkJCQkJXAoJCQkJIG9mZnNldG9mKFVMVFJBX0NIQU5ORUxfUFJPVE9DT0wsIENsaVN0YXRlT1MpLCBcCgkJCQkgc2l6ZW9mKFUzMikpOwkJCQlcCgkJfQkJCQkJCQlcCgl9IHdoaWxlICgwKQoKI2VuZGlmCg==