Ci8qCiAqIElCTSBBU00gU2VydmljZSBQcm9jZXNzb3IgRGV2aWNlIERyaXZlcgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKgogKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNAogKgogKiBBdXRob3I6IE1heCBBc2L2Y2sgPGFtYXhAdXMuaWJtLmNvbT4gCiAqCiAqIE9yaWduYWxseSB3cml0dGVuIGJ5IFBldGUgUmV5bm9sZHMKICovCgojaWZuZGVmIF9JQk1BU01fUkVNT1RFX0hfCiNkZWZpbmUgX0lCTUFTTV9SRU1PVEVfSF8KCiNpbmNsdWRlIDxhc20vaW8uaD4KCi8qIHBjaSBvZmZzZXRzICovCiNkZWZpbmUgQ09ORE9SX01PVVNFX0RBVEEJCTB4MDAwQUMwMDAKI2RlZmluZSBDT05ET1JfTU9VU0VfSVNSX0NPTlRST0wJMHgwMAojZGVmaW5lIENPTkRPUl9NT1VTRV9JU1JfU1RBVFVTCQkweDA0CiNkZWZpbmUgQ09ORE9SX01PVVNFX1FfUkVBREVSCQkweDA4CiNkZWZpbmUgQ09ORE9SX01PVVNFX1FfV1JJVEVSCQkweDBDCiNkZWZpbmUgQ09ORE9SX01PVVNFX1FfQkVHSU4JCTB4MTAKI2RlZmluZSBDT05ET1JfTU9VU0VfTUFYX1gJCTB4MTQKI2RlZmluZSBDT05ET1JfTU9VU0VfTUFYX1kJCTB4MTgKCiNkZWZpbmUgQ09ORE9SX0lOUFVUX0RFU0tUT1BfSU5GTwkweDFGMAojZGVmaW5lIENPTkRPUl9JTlBVVF9ESVNQTEFZX1JFU1gJMHgxRjQKI2RlZmluZSBDT05ET1JfSU5QVVRfRElTUExBWV9SRVNZCTB4MUY4CiNkZWZpbmUgQ09ORE9SX0lOUFVUX0RJU1BMQVlfQklUUwkweDFGQwojZGVmaW5lIENPTkRPUl9PVVRQVVRfVk5DX1NUQVRVUwkweDIwMAoKI2RlZmluZSBDT05ET1JfTU9VU0VfSU5UUl9TVEFUVVNfTUFTSwkweDAwMDAwMDAxCgojZGVmaW5lIElOUFVUX1RZUEVfTU9VU0UJMHgxCiNkZWZpbmUgSU5QVVRfVFlQRV9LRVlCT0FSRAkweDIKCgovKiBtb3VzZSBidXR0b24gc3RhdGVzIHJlY2VpdmVkIGZyb20gU1AgKi8KI2RlZmluZSBSRU1PVEVfTU9VU0VfRE9VQkxFX0NMSUNLCTB4RjAKI2RlZmluZSBSRU1PVEVfTU9VU0VfQlVUVE9OX0xFRlQJMHgwMQojZGVmaW5lIFJFTU9URV9NT1VTRV9CVVRUT05fTUlERExFCTB4MDIKI2RlZmluZSBSRU1PVEVfTU9VU0VfQlVUVE9OX1JJR0hUCTB4MDQKCgpzdHJ1Y3QgbW91c2VfaW5wdXQgewoJdW5zaWduZWQgc2hvcnQJeTsKCXVuc2lnbmVkIHNob3J0CXg7Cn07CgoKc3RydWN0IGtleWJvYXJkX2lucHV0IHsKCXVuc2lnbmVkIHNob3J0CWtleV9jb2RlOwoJdW5zaWduZWQgY2hhcglrZXlfZmxhZzsKCXVuc2lnbmVkIGNoYXIJa2V5X2Rvd247Cn07CgoKCnN0cnVjdCByZW1vdGVfaW5wdXQgeyAKCXVuaW9uIHsKCQlzdHJ1Y3QgbW91c2VfaW5wdXQJbW91c2U7CgkJc3RydWN0IGtleWJvYXJkX2lucHV0CWtleWJvYXJkOwoJfSBkYXRhOwoKCXVuc2lnbmVkIGNoYXIJdHlwZTsKCXVuc2lnbmVkIGNoYXIJcGFkMTsKCXVuc2lnbmVkIGNoYXIJbW91c2VfYnV0dG9uczsKCXVuc2lnbmVkIGNoYXIJcGFkMzsKfTsKCiNkZWZpbmUgbW91c2VfYWRkcihzcCkgCQlzcC0+YmFzZV9hZGRyZXNzICsgQ09ORE9SX01PVVNFX0RBVEEKI2RlZmluZSBkaXNwbGF5X3dpZHRoKHNwKQltb3VzZV9hZGRyKHNwKSArIENPTkRPUl9JTlBVVF9ESVNQTEFZX1JFU1gKI2RlZmluZSBkaXNwbGF5X2hlaWdodChzcCkJbW91c2VfYWRkcihzcCkgKyBDT05ET1JfSU5QVVRfRElTUExBWV9SRVNZCiNkZWZpbmUgZGlzcGxheV9kZXB0aChzcCkJbW91c2VfYWRkcihzcCkgKyBDT05ET1JfSU5QVVRfRElTUExBWV9CSVRTCiNkZWZpbmUgdm5jX3N0YXR1cyhzcCkJCW1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX09VVFBVVF9WTkNfU1RBVFVTCgojZGVmaW5lIG1vdXNlX2ludGVycnVwdF9wZW5kaW5nKHNwKSAJcmVhZGwobW91c2VfYWRkcihzcCkgKyBDT05ET1JfTU9VU0VfSVNSX1NUQVRVUykKI2RlZmluZSBjbGVhcl9tb3VzZV9pbnRlcnJ1cHQoc3ApCXdyaXRlbCgwLCBtb3VzZV9hZGRyKHNwKSArIENPTkRPUl9NT1VTRV9JU1JfU1RBVFVTKQojZGVmaW5lIGVuYWJsZV9tb3VzZV9pbnRlcnJ1cHRzKHNwKQl3cml0ZWwoMSwgbW91c2VfYWRkcihzcCkgKyBDT05ET1JfTU9VU0VfSVNSX0NPTlRST0wpCiNkZWZpbmUgZGlzYWJsZV9tb3VzZV9pbnRlcnJ1cHRzKHNwKQl3cml0ZWwoMCwgbW91c2VfYWRkcihzcCkgKyBDT05ET1JfTU9VU0VfSVNSX0NPTlRST0wpCgovKiByZW1vdGUgaW5wdXQgcXVldWUgb3BlcmF0aW9ucyAqLwojZGVmaW5lIFJFTU9URV9RVUVVRV9TSVpFCTYwCgojZGVmaW5lIGdldF9xdWV1ZV93cml0ZXIoc3ApCXJlYWRsKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX1FfV1JJVEVSKQojZGVmaW5lIGdldF9xdWV1ZV9yZWFkZXIoc3ApCXJlYWRsKG1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX1FfUkVBREVSKQojZGVmaW5lIHNldF9xdWV1ZV9yZWFkZXIoc3AsIHJlYWRlcikJd3JpdGVsKHJlYWRlciwgbW91c2VfYWRkcihzcCkgKyBDT05ET1JfTU9VU0VfUV9SRUFERVIpCgojZGVmaW5lIHF1ZXVlX2JlZ2luCW1vdXNlX2FkZHIoc3ApICsgQ09ORE9SX01PVVNFX1FfQkVHSU4KCiNkZWZpbmUgZ2V0X3F1ZXVlX2VudHJ5KHNwLCByZWFkX2luZGV4KSBcCglxdWV1ZV9iZWdpbiArIHJlYWRfaW5kZXggKiBzaXplb2Yoc3RydWN0IHJlbW90ZV9pbnB1dCkKCnN0YXRpYyBpbmxpbmUgaW50IGFkdmFuY2VfcXVldWVfcmVhZGVyKHN0cnVjdCBzZXJ2aWNlX3Byb2Nlc3NvciAqc3AsIHVuc2lnbmVkIGxvbmcgcmVhZGVyKQp7CglyZWFkZXIrKzsKCWlmIChyZWFkZXIgPT0gUkVNT1RFX1FVRVVFX1NJWkUpCgkJcmVhZGVyID0gMDsKCglzZXRfcXVldWVfcmVhZGVyKHNwLCByZWFkZXIpOwoJcmV0dXJuIHJlYWRlcjsKfQoKI2VuZGlmIC8qIF9JQk1BU01fUkVNT1RFX0hfICovCg==