LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBBVE1FTCBNaWNyb2NvbnRyb2xsZXIgU29mdHdhcmUgU3VwcG9ydCANCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqIENvcHlyaWdodCAoYykgMjAxMCwgQXRtZWwgQ29ycG9yYXRpb24NCiAqDQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6DQogKg0KICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGRpc2NsYWltZXIgYmVsb3cuDQogKg0KICogQXRtZWwncyBuYW1lIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICoNCiAqIERJU0NMQUlNRVI6IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVRNRUwgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1INCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQogKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBVE1FTCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQogKiBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GDQogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KICogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KDQovKiogXGZpbGUNCiAqICBEZWZpbml0aW9ucyBhbmQgbWV0aG9kcyBmb3IgVVNCIENEQyBOb3RpZmljYXRpb25zLg0KICovDQoNCiNpZm5kZWYgX0NEQ05PVElGSUNBVElPTlNfSF8NCiNkZWZpbmUgX0NEQ05PVElGSUNBVElPTlNfSF8NCi8qKiBcYWRkdG9ncm91cCB1c2JfY2RjDQogKkB7DQogKi8NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKiAgICAgICAgIEluY2x1ZGVzDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQojaW5jbHVkZSA8c3RkaW50Lmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBEZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIFxhZGR0b2dyb3VwIGNkY19zZXJpYWxfc3RhdGVzIENEQyBTZXJpYWxTdGF0ZSBiaXRzDQogKiAgICAgIEB7DQogKiBUaGlzIHBhZ2UgbGlzdHMgdGhlIGJpdCBtYXAgZm9yIENEQyBTZXJpYWwgU3RhdGVzLg0KICoNCiAqIC0gXHJlZiBDRENTZXJpYWxTdGF0ZV9SWERSSVZFUg0KICogLSBccmVmIENEQ1NlcmlhbFN0YXRlX1RYQ0FSUklFUg0KICogLSBccmVmIENEQ1NlcmlhbFN0YXRlX0JSRUFLDQogKiAtIFxyZWYgQ0RDU2VyaWFsU3RhdGVfUklOR1NJR05BTA0KICogLSBccmVmIENEQ1NlcmlhbFN0YXRlX0ZSQU1JTkcNCiAqIC0gXHJlZiBDRENTZXJpYWxTdGF0ZV9QQVJJVFkNCiAqIC0gXHJlZiBDRENTZXJpYWxTdGF0ZV9PVkVSUlVODQogKi8NCg0KLyoqIEluZGljYXRlcyB0aGUgcmVjZWl2ZXIgY2FycmllciBzaWduYWwgaXMgcHJlc2VudCAqLw0KI2RlZmluZSBDRENTZXJpYWxTdGF0ZV9SWERSSVZFUiAgICAgICAgICgxIDw8IDApDQovKiogSW5kaWNhdGVzIHRoZSB0cmFuc21pc3Npb24gY2FycmllciBzaWduYWwgaXMgcHJlc2VudCAqLw0KI2RlZmluZSBDRENTZXJpYWxTdGF0ZV9UWENBUlJJRVIgICAgICAgICgxIDw8IDEpDQovKiogSW5kaWNhdGVzIGEgYnJlYWsgaGFzIGJlZW4gZGV0ZWN0ZWQgKi8NCiNkZWZpbmUgQ0RDU2VyaWFsU3RhdGVfQlJFQUsgICAgICAgICAgICAoMSA8PCAyKQ0KLyoqIEluZGljYXRlcyBhIHJpbmcgc2lnbmFsIGhhcyBiZWVuIGRldGVjdGVkICovDQojZGVmaW5lIENEQ1NlcmlhbFN0YXRlX1JJTkdTSUdOQUwgICAgICAgKDEgPDwgMykNCi8qKiBJbmRpY2F0ZXMgYSBmcmFtaW5nIGVycm9yIGhhcyBvY2N1cmVkICovDQojZGVmaW5lIENEQ1NlcmlhbFN0YXRlX0ZSQU1JTkcgICAgICAgICAgKDEgPDwgNCkNCi8qKiBJbmRpY2F0ZXMgYSBwYXJpdHkgZXJyb3IgaGFzIG9jY3VyZWQgKi8NCiNkZWZpbmUgQ0RDU2VyaWFsU3RhdGVfUEFSSVRZICAgICAgICAgICAoMSA8PCA1KQ0KLyoqIEluZGljYXRlcyBhIGRhdGEgb3ZlcnJ1biBlcnJvciBoYXMgb2NjdXJlZCAqLw0KI2RlZmluZSBDRENTZXJpYWxTdGF0ZV9PVkVSUlVOICAgICAgICAgICgxIDw8IDYpDQovKiogICAgICBAfSovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBUeXBlcw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNwcmFnbWEgcGFjaygxKQ0KI2lmIGRlZmluZWQgICAoIF9fQ0NfQVJNICAgKSAvKiBLZWlsIKbMVmlzaW9uIDQgKi8NCiNlbGlmIGRlZmluZWQgKCBfX0lDQ0FSTV9fICkgLyogSUFSIEV3YXJtICovDQojZGVmaW5lIF9fYXR0cmlidXRlX18oLi4uKQ0KI2RlZmluZSBfX3BhY2tlZF9fICBwYWNrZWQNCiNlbGlmIGRlZmluZWQgKCAgX19HTlVDX18gICkgLyogR0NDIENTMyAqLw0KI2RlZmluZSBfX3BhY2tlZF9fICBhbGlnbmVkKDEpDQojZW5kaWYNCi8qKiBVU0IgQ0RDIFNlcmlhbFN0YXRlIHN0cnVjdCAoYml0bWFwKSAqLw0KdHlwZWRlZiBzdHJ1Y3QgX0NEQ1NlcmlhbFN0YXRlIHsNCiAgICB1aW50MTZfdCBiUnhDYXJyaWVyOjEsICAvKio8IFN0YXRlIG9mIHJlY2VpdmUgY2FycmllciBkZXRlY3Rpb24gKFYyLjQgc2lnbmFsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDkgYW5kIFJTLTIzMiBzaWduYWwgRENEKSAqLw0KICAgICAgICAgICAgIGJUeENhcnJpZXI6MSwgIC8qKjwgU3RhdGUgb2YgdHJhbnNtaXNzaW9uIGNhcnJpZXIgKi8NCiAgICAgICAgICAgICBiQnJlYWs6MSwgICAgICAvKio8IFN0YXRlIG9mIGJyZWFrIGRldGVjdGlvbiAqLw0KICAgICAgICAgICAgIGJSaW5nU2lnbmFsOjEsIC8qKjwgU3RhdGUgb2YgcmluZyBzaWduYWwgKi8NCiAgICAgICAgICAgICBiRnJhbWluZzoxLCAgICAvKio8IEZyYW1pbmcgZXJyb3IgKi8NCiAgICAgICAgICAgICBiUGFyaXR5OjEsICAgICAvKio8IFBhcml0eSBlcnJvciAqLw0KICAgICAgICAgICAgIGJPdmVyUnVuOjEsICAgIC8qKjwgUmVjZWl2ZWQgZGF0YSBkaXNjYXJkZWQgZHVlIHRvIG92ZXJydW4gZXJyb3IgKi8NCiAgICAgICAgICAgICByZXNlcnZlZDo5OyAgICAvKio8IFJlc2VydmVkICovDQp9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQ0RDU2VyaWFsU3RhdGU7DQoNCiNwcmFnbWEgcGFjaygpDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICogICAgICAgICBGdW5jdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKkB9Ki8NCiNlbmRpZiAvKiAjaWZuZGVmIF9DRENOT1RJRklDQVRJT05TX0hfICovDQoNCg==