LyoKICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ncGlvLmgKICoKICogT01BUCBHUElPIGhhbmRsaW5nIGRlZmluZXMgYW5kIGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMgTm9raWEgQ29ycG9yYXRpb24KICoKICogV3JpdHRlbiBieSBKdWhhIFlyavZs5CA8anVoYS55cmpvbGFAbm9raWEuY29tPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAqCiAqLwoKI2lmbmRlZiBfX0FTTV9BUkNIX09NQVBfR1BJT19ICiNkZWZpbmUgX19BU01fQVJDSF9PTUFQX0dQSU9fSAoKI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCiNkZWZpbmUgT01BUF9NUFVJT19CQVNFCQkJMHhmZmZiNTAwMAojZGVmaW5lIE9NQVBfTVBVSU9fSU5QVVRfTEFUQ0gJCTB4MDAKI2RlZmluZSBPTUFQX01QVUlPX09VVFBVVAkJMHgwNAojZGVmaW5lIE9NQVBfTVBVSU9fSU9fQ05UTAkJMHgwOAojZGVmaW5lIE9NQVBfTVBVSU9fS0JSX0xBVENICQkweDEwCiNkZWZpbmUgT01BUF9NUFVJT19LQkMJCQkweDE0CiNkZWZpbmUgT01BUF9NUFVJT19HUElPX0VWRU5UX01PREUJMHgxOAojZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19JTlRfRURHRQkweDFjCiNkZWZpbmUgT01BUF9NUFVJT19LQkRfSU5UCQkweDIwCiNkZWZpbmUgT01BUF9NUFVJT19HUElPX0lOVAkJMHgyNAojZGVmaW5lIE9NQVBfTVBVSU9fS0JEX01BU0tJVAkJMHgyOAojZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19NQVNLSVQJCTB4MmMKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fREVCT1VOQ0lORwkweDMwCiNkZWZpbmUgT01BUF9NUFVJT19MQVRDSAkJMHgzNAoKI2RlZmluZSBPTUFQX01QVUlPKG5yKQkJKE9NQVBfTUFYX0dQSU9fTElORVMgKyAobnIpKQojZGVmaW5lIE9NQVBfR1BJT19JU19NUFVJTyhucikJKChucikgPj0gT01BUF9NQVhfR1BJT19MSU5FUykKCiNkZWZpbmUgT01BUF9HUElPX0lSUShucikJKE9NQVBfR1BJT19JU19NUFVJTyhucikgPyBcCgkJCQkgSUhfTVBVSU9fQkFTRSArICgobnIpICYgMHgwZikgOiBcCgkJCQkgSUhfR1BJT19CQVNFICsgKChucikgJiAweDNmKSkKCi8qIEZvciBFREdFQ1RSTCAqLwojZGVmaW5lIE9NQVBfR1BJT19OT19FREdFCSAgMHgwMAojZGVmaW5lIE9NQVBfR1BJT19GQUxMSU5HX0VER0UJICAweDAxCiNkZWZpbmUgT01BUF9HUElPX1JJU0lOR19FREdFCSAgMHgwMgojZGVmaW5lIE9NQVBfR1BJT19CT1RIX0VER0VTCSAgMHgwMwoKZXh0ZXJuIGludCBvbWFwX2dwaW9faW5pdCh2b2lkKTsJLyogQ2FsbCBmcm9tIGJvYXJkIGluaXQgb25seSAqLwpleHRlcm4gaW50IG9tYXBfcmVxdWVzdF9ncGlvKGludCBncGlvKTsKZXh0ZXJuIHZvaWQgb21hcF9mcmVlX2dwaW8oaW50IGdwaW8pOwpleHRlcm4gdm9pZCBvbWFwX3NldF9ncGlvX2RpcmVjdGlvbihpbnQgZ3BpbywgaW50IGlzX2lucHV0KTsKZXh0ZXJuIHZvaWQgb21hcF9zZXRfZ3Bpb19kYXRhb3V0KGludCBncGlvLCBpbnQgZW5hYmxlKTsKZXh0ZXJuIGludCBvbWFwX2dldF9ncGlvX2RhdGFpbihpbnQgZ3Bpbyk7CmV4dGVybiB2b2lkIG9tYXBfc2V0X2dwaW9fZWRnZV9jdHJsKGludCBncGlvLCBpbnQgZWRnZSk7CgojZW5kaWYK