LyoKICogbGludXgvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9ncGlvLmgKICoKICogT01BUCBHUElPIGhhbmRsaW5nIGRlZmluZXMgYW5kIGZ1bmN0aW9ucwogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogKgogKiBXcml0dGVuIGJ5IEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKICoKICovCgojaWZuZGVmIF9fQVNNX0FSQ0hfT01BUF9HUElPX0gKI2RlZmluZSBfX0FTTV9BUkNIX09NQVBfR1BJT19ICgojaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KCiNkZWZpbmUgT01BUF9NUFVJT19CQVNFCQkJKHZvaWQgX19pb21lbSAqKTB4ZmZmYjUwMDAKCiNpZmRlZiBDT05GSUdfQVJDSF9PTUFQNzMwCiNkZWZpbmUgT01BUF9NUFVJT19JTlBVVF9MQVRDSAkJMHgwMAojZGVmaW5lIE9NQVBfTVBVSU9fT1VUUFVUCQkweDAyCiNkZWZpbmUgT01BUF9NUFVJT19JT19DTlRMCQkweDA0CiNkZWZpbmUgT01BUF9NUFVJT19LQlJfTEFUQ0gJCTB4MDgKI2RlZmluZSBPTUFQX01QVUlPX0tCQwkJCTB4MGEKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fRVZFTlRfTU9ERQkweDBjCiNkZWZpbmUgT01BUF9NUFVJT19HUElPX0lOVF9FREdFCTB4MGUKI2RlZmluZSBPTUFQX01QVUlPX0tCRF9JTlQJCTB4MTAKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fSU5UCQkweDEyCiNkZWZpbmUgT01BUF9NUFVJT19LQkRfTUFTS0lUCQkweDE0CiNkZWZpbmUgT01BUF9NUFVJT19HUElPX01BU0tJVAkJMHgxNgojZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19ERUJPVU5DSU5HCTB4MTgKI2RlZmluZSBPTUFQX01QVUlPX0xBVENICQkweDFhCiNlbHNlCiNkZWZpbmUgT01BUF9NUFVJT19JTlBVVF9MQVRDSAkJMHgwMAojZGVmaW5lIE9NQVBfTVBVSU9fT1VUUFVUCQkweDA0CiNkZWZpbmUgT01BUF9NUFVJT19JT19DTlRMCQkweDA4CiNkZWZpbmUgT01BUF9NUFVJT19LQlJfTEFUQ0gJCTB4MTAKI2RlZmluZSBPTUFQX01QVUlPX0tCQwkJCTB4MTQKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fRVZFTlRfTU9ERQkweDE4CiNkZWZpbmUgT01BUF9NUFVJT19HUElPX0lOVF9FREdFCTB4MWMKI2RlZmluZSBPTUFQX01QVUlPX0tCRF9JTlQJCTB4MjAKI2RlZmluZSBPTUFQX01QVUlPX0dQSU9fSU5UCQkweDI0CiNkZWZpbmUgT01BUF9NUFVJT19LQkRfTUFTS0lUCQkweDI4CiNkZWZpbmUgT01BUF9NUFVJT19HUElPX01BU0tJVAkJMHgyYwojZGVmaW5lIE9NQVBfTVBVSU9fR1BJT19ERUJPVU5DSU5HCTB4MzAKI2RlZmluZSBPTUFQX01QVUlPX0xBVENICQkweDM0CiNlbmRpZgoKI2RlZmluZSBPTUFQX01QVUlPKG5yKQkJKE9NQVBfTUFYX0dQSU9fTElORVMgKyAobnIpKQojZGVmaW5lIE9NQVBfR1BJT19JU19NUFVJTyhucikJKChucikgPj0gT01BUF9NQVhfR1BJT19MSU5FUykKCiNkZWZpbmUgT01BUF9HUElPX0lSUShucikJKE9NQVBfR1BJT19JU19NUFVJTyhucikgPyBcCgkJCQkgSUhfTVBVSU9fQkFTRSArICgobnIpICYgMHgwZikgOiBcCgkJCQkgSUhfR1BJT19CQVNFICsgKG5yKSkKCmV4dGVybiBpbnQgb21hcF9ncGlvX2luaXQodm9pZCk7CS8qIENhbGwgZnJvbSBib2FyZCBpbml0IG9ubHkgKi8KZXh0ZXJuIGludCBvbWFwX3JlcXVlc3RfZ3BpbyhpbnQgZ3Bpbyk7CmV4dGVybiB2b2lkIG9tYXBfZnJlZV9ncGlvKGludCBncGlvKTsKZXh0ZXJuIHZvaWQgb21hcF9zZXRfZ3Bpb19kaXJlY3Rpb24oaW50IGdwaW8sIGludCBpc19pbnB1dCk7CmV4dGVybiB2b2lkIG9tYXBfc2V0X2dwaW9fZGF0YW91dChpbnQgZ3BpbywgaW50IGVuYWJsZSk7CmV4dGVybiBpbnQgb21hcF9nZXRfZ3Bpb19kYXRhaW4oaW50IGdwaW8pOwoKI2VuZGlmCg==