LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogIENvcHlyaWdodCBTdGF0ZW1lbnQ6CiogIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiogIFRoaXMgc29mdHdhcmUgaXMgcHJvdGVjdGVkIGJ5IENvcHlyaWdodCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZAoqICBoZXJlaW4gaXMgY29uZmlkZW50aWFsLiBUaGUgc29mdHdhcmUgbWF5IG5vdCBiZSBjb3BpZWQgYW5kIHRoZSBpbmZvcm1hdGlvbgoqICBjb250YWluZWQgaGVyZWluIG1heSBub3QgYmUgdXNlZCBvciBkaXNjbG9zZWQgZXhjZXB0IHdpdGggdGhlIHdyaXR0ZW4KKiAgcGVybWlzc2lvbiBvZiBNZWRpYVRlayBJbmMuIChDKSAyMDA1CioKKiAgQlkgT1BFTklORyBUSElTIEZJTEUsIEJVWUVSIEhFUkVCWSBVTkVRVUlWT0NBTExZIEFDS05PV0xFREdFUyBBTkQgQUdSRUVTCiogIFRIQVQgVEhFIFNPRlRXQVJFL0ZJUk1XQVJFIEFORCBJVFMgRE9DVU1FTlRBVElPTlMgKCJNRURJQVRFSyBTT0ZUV0FSRSIpCiogIFJFQ0VJVkVEIEZST00gTUVESUFURUsgQU5EL09SIElUUyBSRVBSRVNFTlRBVElWRVMgQVJFIFBST1ZJREVEIFRPIEJVWUVSIE9OCiogIEFOICJBUy1JUyIgQkFTSVMgT05MWS4gTUVESUFURUsgRVhQUkVTU0xZIERJU0NMQUlNUyBBTlkgQU5EIEFMTCBXQVJSQU5USUVTLAoqICBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgoqICBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTklORlJJTkdFTUVOVC4KKiAgTkVJVEhFUiBET0VTIE1FRElBVEVLIFBST1ZJREUgQU5ZIFdBUlJBTlRZIFdIQVRTT0VWRVIgV0lUSCBSRVNQRUNUIFRPIFRIRQoqICBTT0ZUV0FSRSBPRiBBTlkgVEhJUkQgUEFSVFkgV0hJQ0ggTUFZIEJFIFVTRUQgQlksIElOQ09SUE9SQVRFRCBJTiwgT1IKKiAgU1VQUExJRUQgV0lUSCBUSEUgTUVESUFURUsgU09GVFdBUkUsIEFORCBCVVlFUiBBR1JFRVMgVE8gTE9PSyBPTkxZIFRPIFNVQ0gKKiAgVEhJUkQgUEFSVFkgRk9SIEFOWSBXQVJSQU5UWSBDTEFJTSBSRUxBVElORyBUSEVSRVRPLiBNRURJQVRFSyBTSEFMTCBBTFNPCiogIE5PVCBCRSBSRVNQT05TSUJMRSBGT1IgQU5ZIE1FRElBVEVLIFNPRlRXQVJFIFJFTEVBU0VTIE1BREUgVE8gQlVZRVInUwoqICBTUEVDSUZJQ0FUSU9OIE9SIFRPIENPTkZPUk0gVE8gQSBQQVJUSUNVTEFSIFNUQU5EQVJEIE9SIE9QRU4gRk9SVU0uCioKKiAgQlVZRVInUyBTT0xFIEFORCBFWENMVVNJVkUgUkVNRURZIEFORCBNRURJQVRFSydTIEVOVElSRSBBTkQgQ1VNVUxBVElWRQoqICBMSUFCSUxJVFkgV0lUSCBSRVNQRUNUIFRPIFRIRSBNRURJQVRFSyBTT0ZUV0FSRSBSRUxFQVNFRCBIRVJFVU5ERVIgV0lMTCBCRSwKKiAgQVQgTUVESUFURUsnUyBPUFRJT04sIFRPIFJFVklTRSBPUiBSRVBMQUNFIFRIRSBNRURJQVRFSyBTT0ZUV0FSRSBBVCBJU1NVRSwKKiAgT1IgUkVGVU5EIEFOWSBTT0ZUV0FSRSBMSUNFTlNFIEZFRVMgT1IgU0VSVklDRSBDSEFSR0UgUEFJRCBCWSBCVVlFUiBUTwoqICBNRURJQVRFSyBGT1IgU1VDSCBNRURJQVRFSyBTT0ZUV0FSRSBBVCBJU1NVRS4gCioKKiAgVEhFIFRSQU5TQUNUSU9OIENPTlRFTVBMQVRFRCBIRVJFVU5ERVIgU0hBTEwgQkUgQ09OU1RSVUVEIElOIEFDQ09SREFOQ0UKKiAgV0lUSCBUSEUgTEFXUyBPRiBUSEUgU1RBVEUgT0YgQ0FMSUZPUk5JQSwgVVNBLCBFWENMVURJTkcgSVRTIENPTkZMSUNUIE9GCiogIExBV1MgUFJJTkNJUExFUy4gIEFOWSBESVNQVVRFUywgQ09OVFJPVkVSU0lFUyBPUiBDTEFJTVMgQVJJU0lORyBUSEVSRU9GIEFORAoqICBSRUxBVEVEIFRIRVJFVE8gU0hBTEwgQkUgU0VUVExFRCBCWSBBUkJJVFJBVElPTiBJTiBTQU4gRlJBTkNJU0NPLCBDQSwgVU5ERVIKKiAgVEhFIFJVTEVTIE9GIFRIRSBJTlRFUk5BVElPTkFMIENIQU1CRVIgT0YgQ09NTUVSQ0UgKElDQykuCioKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogRmlsZW5hbWU6CiAqIC0tLS0tLS0tLQogKiAgICBkcnZzaWduYWxzLmgKICoKICogUHJvamVjdDoKICogLS0tLS0tLS0KICogICBNYXVpX1NvZnR3YXJlCiAqCiAqIERlc2NyaXB0aW9uOgogKiAtLS0tLS0tLS0tLS0KICogICBUaGlzIGZpbGUgaXMgaW50ZW5kcyBmb3IgZHJpdmVyIHByaW1pdGl2ZXMuCiAqCiAqIEF1dGhvcjoKICogLS0tLS0tLQogKiAtLS0tLS0tCiAqCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiAgICAgICAgICAgICBISVNUT1JZCiAqIEJlbG93IHRoaXMgbGluZSwgdGhpcyBwYXJ0IGlzIGNvbnRyb2xsZWQgYnkgUFZDUyBWTS4gRE8gTk9UIE1PRElGWSEhCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqIHJlbW92ZWQhCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIFVwcGVyIHRoaXMgbGluZSwgdGhpcyBwYXJ0IGlzIGNvbnRyb2xsZWQgYnkgUFZDUyBWTS4gRE8gTk9UIE1PRElGWSEhCiAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmbmRlZiBfRFJWU0lHTkFMU19ICiNkZWZpbmUgX0RSVlNJR05BTFNfSAoKI2luY2x1ZGUgImJtdC5oIgojaW5jbHVkZSAidXNiX2NvbW0uaCIKI2luY2x1ZGUgImthbF9wdWJsaWNfYXBpLmgiIC8vI2luY2x1ZGUgInN0YWNrX2x0bGNvbS5oIiAvL01TQkIgY2hhbmdlICNpbmNsdWRlICJhcHBfbHRsY29tLmgiCiNpbmNsdWRlICJrYWxfZ2VuZXJhbF90eXBlcy5oIgojaW5jbHVkZSAiZGNsLmgiCgoKLypSVEMgZHJpdmVyKi8KI2RlZmluZSBSVENfVENfSU5ECQkJMAojZGVmaW5lIFJUQ19BTF9JTkQJCQkxCnR5cGVkZWYgc3RydWN0IHsKCUxPQ0FMX1BBUkFfSERSCglrYWxfdWludDggCQlydGNfaW5kOwp9IFJUQ19QcmltaXRpdmU7Cgp0eXBlZGVmIHN0cnVjdCB7CglMT0NBTF9QQVJBX0hEUgogICAgRENMX1JUQ19EQVRBX1QgICAgICBwcmV2aW91c19ydGM7CiAgICBEQ0xfUlRDX0RBVEFfVCAgICAgIG5ld19ydGM7ICAgICAgICAKfSBSVENfVGltZV9DaGFuZ2VfSU5EX1N0cnVjdDsKCi8qS2JkIGRyaXZlciovCiNkZWZpbmUgS2JkX0tleVByZXNzCQkJMAojZGVmaW5lIEtiZF9LZXlSZWxlYXNlCQkxCnR5cGVkZWYgc3RydWN0IHsKCUxPQ0FMX1BBUkFfSERSCglrYWxfdWludDggCQlrcF9zdGF0dXM7CglrYWxfdWludDggCQlrZXk7Cn0gS2JkX1ByaW1pdGl2ZTsKCi8qQ29tbXVuaWNhdGVkIHdpdGggTU1JLCBjaGFyZ2luZyBzdGF0dXMqLwp0eXBlZGVmIGVudW0gCnsKICAgQk1UX0NIQVJHRVJfSU4gPSAwLAogICBCTVRfQ0hBUkdFUl9PVVQsCiAgIEJNVF9PVkVSVk9MUFJPVEVDVCwKICAgQk1UX09WRVJCQVRURU1QLAogICBCTVRfTE9XQkFUVEVNUCwKICAgQk1UX09WRVJDSEFSR0VDVVJSRU5ULAogICBCTVRfQ0hBUkdFX0NPTVBMRVRFLAogICBCTVRfSU5WQUxJRF9CQVQsCiAgIEJNVF9JTlZBTElEX0NIQVJHRVIsCiAgIEJNVF9DSEFSR0VfVElNRU9VVCwKICAgQk1UX0xPV0NIQVJHRUNVUlJFTlQsCiAgIEJNVF9DSEFSR0VfQkFEX0NPTlRBQ1QsCiAgIEJNVF9CQVRURVJZX0JBRF9DT05UQUNULAogICBCTVRfVVNCX0NIQVJHRVJfSU4sCiAgIEJNVF9VU0JfQ0hBUkdFUl9PVVQsCiAgIEJNVF9VU0JfTk9fQ0hBUkdJTkdfSU4sCiAgIEJNVF9VU0JfTk9fQ0hBUkdJTkdfT1VULAogICBCTVRfQkFUVF9JTiwKICAgQk1UX0JBVFRfT1VUCn1CTVRfQ0hSX1NUQVQ7Cgp0eXBlZGVmIHN0cnVjdCB7CglMT0NBTF9QQVJBX0hEUgoJQk1UX0NIUl9TVEFUIAkJc3RhdHVzOwp9IGRydnVlbV9wbWljX2luZF9zdHJ1Y3Q7CgovKkFEQyBzY2hlZHVsZXIqLwp0eXBlZGVmIHN0cnVjdCB7CglMT0NBTF9QQVJBX0hEUgoJZG91YmxlICAgICAgICAgYWRjX3ZhbHVlOwoJa2FsX2ludDMyIAkJYWRjX2hhbmRsZTsKCWthbF9pbnQzMiAJCXZvbHQ7CglrYWxfdWludDggCQlhZGNfc2NoZV9pZDsKfSBibXRfYWRjX21lYXN1cmVfZG9uZV9jb25mX3N0cnVjdDsKCnR5cGVkZWYgc3RydWN0IHsKCUxPQ0FMX1BBUkFfSERSCglrYWxfaW50MzIgYWRjX2hhbmRsZTsKCWthbF91aW50OCBhZGNfc2NoZV9pZDsKfSBibXRfYWRjX2FkZF9pdGVtX3JlcV9zdHJ1Y3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CglMT0NBTF9QQVJBX0hEUgoJa2FsX2ludDMyIGFkY19oYW5kbGU7CglrYWxfdWludDggYWRjX3NjaGVfaWQ7Cn0gYm10X2FkY19yZW1vdmVfaXRlbV9yZXFfc3RydWN0OwoKdHlwZWRlZiBzdHJ1Y3QgewoJTE9DQUxfUEFSQV9IRFIKCWthbF9pbnQzMiAgIGFkY19oYW5kbGU7CglrYWxfdWludDMyICBwZXJpb2Q7CglrYWxfdWludDggICBldmFsdWF0ZV9jb3VudDsKCWthbF91aW50OCAgIGFkY19zY2hlX2lkOwp9IGJtdF9hZGNfbW9kaWZ5X3BhcmFtZXRlcnNfcmVxX3N0cnVjdDsKCi8qQVVYIHRhc2sqLwp0eXBlZGVmIGVudW0gCnsKICAgQVVYX0lEX1BMVUdPVVQ9MCwKICAgQVVYX0lEX1RWT1VULAogICBBVVhfSURfRUFSUEhPTkUsCiAgIEFVWF9JRF9LRVlfUFJFU1MsCiAgIEFVWF9JRF9LRVlfUkVMRUFTRSwKICAgQVVYX0lEX1VBUlQsCiAgIEFVWF9JRF9DTEFNX09QRU4sCiAgIEFVWF9JRF9DTEFNX0NMT1NFLAogICBBVVhfSURfVFZPVVRfT1VULAogICBBVVhfSURfVFZPVVRfSU5JVDEsCiAgIEFVWF9JRF9ERVRFQ1RJT05fRE9ORSwKICAgQVVYX0lEX1BMVUdJTiwKICAgQVVYX0lEX1RSQU5TTUlUVEVSX0hPTERfT04sCiAgIEFVWF9JRF9UUkFOU01JVFRFUl9QVVRfRE9XTiwKICAgQVVYX01BWF9JRAp9QVVYX0lEOwp0eXBlZGVmIHN0cnVjdCB7CglMT0NBTF9QQVJBX0hEUgoJQVVYX0lEICAgYXV4X2lkOwp9IGF1eF9pZF9zdHJ1Y3Q7CgovKkVuZ2luZWVyaW5nIG1vZGUqLwp0eXBlZGVmIHN0cnVjdCB7CiAgIExPQ0FMX1BBUkFfSERSCiAgIGthbF9pbnQzMiAJCXZiYXQ7CS8qQmF0dGVyeSBWb2x0YWdlKG1pY3JvLXZvbHRhZ2UpKi8KICAga2FsX2ludDMyICAgICBiYXRfdGVtcDsJLypCYXR0ZXJ5IFRlbXBlcmF0dXJlKKJKKSovCiAgIGthbF9pbnQzMiAJCXZhdXg7CQkvKkFVWCBWb2x0YWdlKG1pY3JvLXZvbHRhZ2UpKi8KICAga2FsX2ludDMyIAkJY2hhcmdlX2N1cnJlbnQ7CS8qQ2hhcmdlIGN1cnJlbnQobWljcm8tQSkqLwogICBrYWxfaW50MzIgCQl2Y2hhcmdlcjsJLypDaGFyZ2VyIFZvbHRhZ2UobWljcm8tdm9sdGFnZSkqLwp9IGFkY19hbGxfY2hhbm5lbF9zdHJ1Y3Q7CgovKlVTQiBkcml2ZXIqLwp0eXBlZGVmIHN0cnVjdCB7CglMT0NBTF9QQVJBX0hEUgogICB2b2lkICAgICAgICAgICAgICAgICAqcERhdGE7IC8qIFBvaW50ZXIgdG8gZGF0YSBidWZmZXIgKi8KICAga2FsX2ludDMyICAgICAgICAgICAgIG5CdWZmTGVuOyAvKiBMZW5ndGggb2YgZGF0YSBidWZmZXIgKi8KCWthbF9pbnQzMiAgICAgICAgICAgICBuQnl0ZXNSZWN2OyAvKiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgKi8KfSB1c2JfbXNfcmVjX2RvbmVfY29uZl9zdHJ1Y3Q7CgovKkw0LT5VU0IqLwp0eXBlZGVmIHN0cnVjdCB7CiAgIExPQ0FMX1BBUkFfSERSCiAgIFVTQl9ERVZJQ0VfVFlQRSAgICAgICAgIG1vZGU7CiAgIGthbF91aW50MzIgICAgICAgICpwYXJhbWV0ZXI7Cn0gZHJ2dWVtX3VzYmNmZ19yZXFfc3RydWN0OwoKLypVU0ItPlVTQiovCnR5cGVkZWYgc3RydWN0IHsKICAgTE9DQUxfUEFSQV9IRFIKICAgVVNCX0RFVklDRV9UWVBFICAgICAgICAgbW9kZTsKICAga2FsX3VpbnQzMiAgICAgICAgKnBhcmFtZXRlcjsKICAga2FsX3VpbnQzMiBkZXZpY2VfY29kZTsKICAga2FsX3VpbnQzMiBzdWJjbGFzc19jb2RlOwogICBrYWxfdWludDMyIHByb3RvY29sX2NvZGU7CiAgIGthbF91aW50MzIgcHJvZHVjdF9jb2RlOwp9IGRydnVzYl91c2JjZmdfcmVxX3N0cnVjdDsKCi8qVVNCLT5MNCovCnR5cGVkZWYgc3RydWN0IHsKICAgTE9DQUxfUEFSQV9IRFIKICAgVVNCX0RFVklDRV9UWVBFICAgICAgICAgbW9kZTsKICAga2FsX3VpbnQzMiAgICAgICAgcmVzZXJ2ZWQ7CiAgIGthbF9ib29sICAgICAgICAgIHJlc3VsdDsKfSBkcnZ1ZW1fdXNiY2ZnX2NuZl9zdHJ1Y3Q7CgovKlVTQi0+TDQqLwp0eXBlZGVmIGVudW0gCnsKICAgREVURUNUX0FDVElPTl9VTktOT1dOPTAsCiAgIERFVEVDVF9BQ1RJT05fUExVR0lOLAogICBERVRFQ1RfQUNUSU9OX1BMVUdPVVQsCiAgIERFVEVDVF9BQ1RJT05fVVNCX1NVU1BFTkQsCiAgIERFVEVDVF9BQ1RJT05fTUFYX0lECn1VU0JfREVURUNUX0FDVElPTl9JRDsKCnR5cGVkZWYgc3RydWN0IHsKICAgTE9DQUxfUEFSQV9IRFIKICAgVVNCX0RFVEVDVF9BQ1RJT05fSUQgICAgICAgICBhY3Rpb247ICAvKjE6IFBsdWdpbiwgMDpQbHVnT3V0Ki8KfWRydnVlbV91c2JkZXRlY3RfaW5kX3N0cnVjdDsKCi8vIGFkZCBmb3IgdXNiIGNoYXJnaW5nCnR5cGVkZWYgZW51bXsKCUJNVF9VU0JfMTAwLAoJQk1UX1VTQl81MDAKfWJtdF91c2JfaW5kX2VudW07Cgp0eXBlZGVmIHN0cnVjdHsKCUxPQ0FMX1BBUkFfSERSCglQTVVfQ0hSX0NVUlJFTlRfRU5VTSAgdXNiX2luZDsKfWJtdF91c2JfaW5kX3N0cnVjdDsKCnR5cGVkZWYgc3RydWN0ewoJTE9DQUxfUEFSQV9IRFIKCVBXX0NUUkxfUE9XRVJfT05fUkVBU09OIHBvd2VyX29uOwoJa2FsX3VpbnQzMiAJcG93ZXJvbl90aW1lX2xlZnQ7Cn1kcnZ1ZW1fcG93ZXJfb25faW5kX3N0cnVjdDsKCgoKdHlwZWRlZiBzdHJ1Y3QgewogICBMT0NBTF9QQVJBX0hEUgogICBrYWxfdWludDggdXNiX2lwX3BvcnQ7CiAgIGthbF91aW50OCBmZWF0dXJlX2luZGV4OwovLyAgVVNCX0hDRF9TVEFUVVMgcmVzdWx0OwogICBrYWxfdWludDggcmVzdWx0OwogICBrYWxfdWludDMyIHBhcmFtOwp9dXNiX2hvc3RfdXNiYXR0YWNoX2luZF9zdHJ1Y3Q7CgoKCnR5cGVkZWYgc3RydWN0IHsKICAgTE9DQUxfUEFSQV9IRFIKICAga2FsX2Jvb2wgY29uZmlybTsKfXJuZGlzX3VzYl9jb25maWdfY25mX3N0cnVjdDsKCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLU1UUC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKgogKiBNYWNybwogKi8KI2RlZmluZSBNVFBfUEFSQU1fTUFYICAgNQojZGVmaW5lIE1UUF9FVkVOVF9NQVggICAzCgovKgogKiBFbnVtCiAqLwoKdHlwZWRlZiBlbnVtIHsKICAgVVNCX01UUF9SRVNVTFRfT0sgPSAwLAogICBVU0JfTVRQX1JFU1VMVF9DT05USU5VRSwKICAgVVNCX01UUF9SRVNVTFRfQUJPUlRFRCwKICAgVVNCX01UUF9SRVNVTFRfREVWSUNFX0JVU1ksCiAgIFVTQl9NVFBfUkVTVUxUX05PVF9FTkFCTEUsCiAgIFVTQl9NVFBfUkVTVUxUX0FMUkVBRFlfRU5BQkxFLAogICBVU0JfTVRQX1JFU1VMVF9VTktOT1dOX0VSUk9SCn11c2JfbXRwX3Jlc3VsdF9lbnVtOwoKCnR5cGVkZWYgZW51bSB7CiAgIFVTQl9NVFBfRVZFTlRfTk9STUFMID0gMCwKICAgVVNCX01UUF9FVkVOVF9BQk9SVAp9dXNiX210cF9ldmVudF9lbnVtOwoKCi8qCiAqIFN0cnVjdAogKi8KCnR5cGVkZWYgc3RydWN0IHsKICAgTE9DQUxfUEFSQV9IRFIKICAga2FsX2ludDMyICByZXN1bHRfY29kZTsgLyogPCAgMDogRlMgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PSAwOiB1c2JfbXRwX3Jlc3VsdF9lbnVtICovCn11c2JfbXRwX2VuYWJsZV9yc3Bfc3RydWN0LCB1c2JfbXRwX2Rpc2FibGVfcnNwX3N0cnVjdDsKCgp0eXBlZGVmIHN0cnVjdCB7CiAgIExPQ0FMX1BBUkFfSERSCiAgIGthbF91aW50MTYgb3BfY29kZTsgICAgICAgICAgICAgICAgICAgICAvKiBvcGVyYXRpb24gKi8KICAga2FsX3VpbnQzMiBvcF9wYXJhbXNbTVRQX1BBUkFNX01BWF07ICAgIC8qIG9wZXJhdGlvbiAqLwogICAgICAgICAgICAgICAKLy8gICBrYWxfdWludDE2IG9wX3NlcmlhbF9ubzsgICAgICAgICAgICAgICAgLyogc3RhcnQgZnJvbSAwICovCgogICAvKiBEYXRhIHBoYXNlICovCiAgIGthbF91aW50MzIgZGF0YV90b3RhbF9zaXplOyAgICAgICAgICAgICAvKiBzaXplIG9mIHRvdGFsIGRhdGEsIDAgbWVhbnMgbm8gRGF0YSBwaGFzZSAqLwogICBrYWxfdWludDggICpkYXRhX3Bvb2xfcHRyOyAgICAgICAgICAgICAgLyogZGF0YSBwb29sICovCiAgIGthbF91aW50MzIgZGF0YV9wb29sX3NpemU7ICAgICAgICAgICAgICAvKiBzaXplIG9mIGRhdGEgcG9vbCAqLwogICBrYWxfdWludDMyIGRhdGFfc2l6ZTsgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiByZWFsIGRhdGEsIHNpZ25sZSBkaXJlY3Rpb24gKi8KfXVzYl9tdHBfb3BlcmF0aW9uX3JlcV9zdHJ1Y3Q7CgoKdHlwZWRlZiBzdHJ1Y3QgewogICBMT0NBTF9QQVJBX0hEUgogICAgCiAgIGthbF9pbnQzMiAgcmVzdWx0X2NvZGU7IC8qIDwgIDA6IEZTIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PSAwOiB1c2JfbXRwX3Jlc3VsdF9lbnVtICovICAgICAgICAgICAgICAgIAogICBrYWxfdWludDE2IHJzcF9jb2RlOwogICBrYWxfdWludDMyIHJzcF9wYXJhbXNbTVRQX1BBUkFNX01BWF07CgogICBrYWxfdWludDE2IG9wX2NvZGU7Ci8vICAga2FsX3VpbnQxNiBvcF9zZXJpYWxfbm87ICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGZyb20gMCAqLwoKICAgLyogRGF0YSBwaGFzZSAqLwogICBrYWxfdWludDMyIGRhdGFfdG90YWxfc2l6ZTsgICAgICAgICAgICAgLyogc2l6ZSBvZiB0b3RhbCBkYXRhLCAwIG1lYW5zIG5vIERhdGEgcGhhc2UgKi8KICAga2FsX3VpbnQ4ICAqZGF0YV9wb29sX3B0cjsgICAgICAgICAgICAgIC8qIGRhdGEgcG9vbCAqLwogICBrYWxfdWludDMyIGRhdGFfcG9vbF9zaXplOyAgICAgICAgICAgICAgLyogc2l6ZSBvZiBkYXRhIHBvb2wgKi8KICAga2FsX3VpbnQzMiBkYXRhX3NpemU7ICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgcmVhbCBkYXRhICovCn11c2JfbXRwX29wZXJhdGlvbl9yc3Bfc3RydWN0OwoKCnR5cGVkZWYgc3RydWN0IHsKICAgTE9DQUxfUEFSQV9IRFIKICAga2FsX3VpbnQxNiBldmVudDsgICAgICAgLy8gc2VlIHVzYl9tdHBfZXZlbnRfZW51bQogICBrYWxfdWludDE2IGV2ZW50X2NvZGU7CiAgIGthbF91aW50MzIgcGFyYW1zW01UUF9FVkVOVF9NQVhdOwp9dXNiX210cF9ldmVudF9pbmRfc3RydWN0OwoKCiNlbmRpZgoK