LyoqCiAqIFxmaWxlIGRybV9zYXJlYS5oIAogKiBcYnJpZWYgU0FSRUEgZGVmaW5pdGlvbnMKICoKICogXGF1dGhvciBNaWNoZWwgRORuemVyIDxtaWNoZWxAZGFlbnplci5uZXQ+CiAqLwoKLyoKICogQ29weXJpZ2h0IDIwMDIgVHVuZ3N0ZW4gR3JhcGhpY3MsIEluYy4sIENlZGFyIFBhcmssIFRleGFzLgogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRVTkdTVEVOIEdSQVBISUNTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCiAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAogKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKi8KCiNpZm5kZWYgX0RSTV9TQVJFQV9IXwojZGVmaW5lIF9EUk1fU0FSRUFfSF8KCiNpbmNsdWRlICJkcm0uaCIKCi8qIFNBUkVBIGFyZWEgbmVlZHMgdG8gYmUgYXQgbGVhc3QgYSBwYWdlICovCiNpZiBkZWZpbmVkKF9fYWxwaGFfXykKI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAojZWxpZiBkZWZpbmVkKF9faWE2NF9fKQojZGVmaW5lIFNBUkVBX01BWCAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCAgICAgICAgIC8qIDY0a0IgKi8KI2Vsc2UKLyogSW50ZWwgODMwTSBkcml2ZXIgbmVlZHMgYXQgbGVhc3QgOGsgU0FSRUEgKi8KI2RlZmluZSBTQVJFQV9NQVggICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAojZW5kaWYKCi8qKiBNYXhpbXVtIG51bWJlciBvZiBkcmF3YWJsZXMgaW4gdGhlIFNBUkVBICovCiNkZWZpbmUgU0FSRUFfTUFYX0RSQVdBQkxFUyAJCTI1NgoKI2RlZmluZSBTQVJFQV9EUkFXQUJMRV9DTEFJTUVEX0VOVFJZICAgIDB4ODAwMDAwMDAKCi8qKiBTQVJFQSBkcmF3YWJsZSAqLwp0eXBlZGVmIHN0cnVjdCBkcm1fc2FyZWFfZHJhd2FibGUgewogICAgdW5zaWduZWQgaW50CXN0YW1wOwogICAgdW5zaWduZWQgaW50CWZsYWdzOwp9IGRybV9zYXJlYV9kcmF3YWJsZV90OwoKLyoqIFNBUkVBIGZyYW1lICovCnR5cGVkZWYgc3RydWN0IGRybV9zYXJlYV9mcmFtZSB7CiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHg7CiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHk7CiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHdpZHRoOwogICAgdW5zaWduZWQgaW50ICAgICAgICBoZWlnaHQ7CiAgICB1bnNpZ25lZCBpbnQgICAgICAgIGZ1bGxzY3JlZW47Cn0gZHJtX3NhcmVhX2ZyYW1lX3Q7CgovKiogU0FSRUEgKi8KdHlwZWRlZiBzdHJ1Y3QgZHJtX3NhcmVhIHsKICAgIC8qKiBmaXJzdCB0aGluZyBpcyBhbHdheXMgdGhlIERSTSBsb2NraW5nIHN0cnVjdHVyZSAqLwogICAgZHJtX2h3X2xvY2tfdAkJbG9jazsKICAgIC8qKiBcdG9kbyBVc2UgcmVhZGVycy93cml0ZXIgbG9jayBmb3IgZHJtX3NhcmVhOjpkcmF3YWJsZV9sb2NrICovCiAgICBkcm1faHdfbG9ja190CQlkcmF3YWJsZV9sb2NrOwogICAgZHJtX3NhcmVhX2RyYXdhYmxlX3QJZHJhd2FibGVUYWJsZVtTQVJFQV9NQVhfRFJBV0FCTEVTXTsJLyoqPCBkcmF3YWJsZXMgKi8KICAgIGRybV9zYXJlYV9mcmFtZV90CQlmcmFtZTsJLyoqPCBmcmFtZSAqLwogICAgZHJtX2NvbnRleHRfdAkJZHVtbXlfY29udGV4dDsKfSBkcm1fc2FyZWFfdDsKCiNlbmRpZgkvKiBfRFJNX1NBUkVBX0hfICovCg==