LyoNCiAqIEdTdHJlYW1lcg0KICogQ29weXJpZ2h0IDIwMDUgVGhvbWFzIFZhbmRlciBTdGljaGVsZSA8dGhvbWFzQGFwZXN0YWFydC5vcmc+DQogKiBDb3B5cmlnaHQgMjAwNSBSb25hbGQgUy4gQnVsdGplIDxyYnVsdGplQHJvbmFsZC5iaXRmcmVhay5uZXQ+DQogKiBDb3B5cmlnaHQgMjAwNSBT6WJhc3RpZW4gTW91dHRlIDxzZWJhc3RpZW5AbW91dHRlLm5ldD4NCiAqIENvcHlyaWdodCAyMDA2IEpvbmkgVmFsdGFuZW4gPGpvbmkudmFsdGFuZW5AbW92aWFsLmZpPg0KICogDQogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQ0KICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwNCiAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24NCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLA0KICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlDQogKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KICoNCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQogKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCiAqDQogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HDQogKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSDQogKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQogKg0KICogQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUNCiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMSAodGhlICJMR1BMIiksIGluDQogKiB3aGljaCBjYXNlIHRoZSBmb2xsb3dpbmcgcHJvdmlzaW9ucyBhcHBseSBpbnN0ZWFkIG9mIHRoZSBvbmVzDQogKiBtZW50aW9uZWQgYWJvdmU6DQogKg0KICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMNCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcg0KICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KICoNCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQogKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4NCiAqDQogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYw0KICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUNCiAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLA0KICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuDQogKi8NCg0KI2lmbmRlZiBfX0dTVF9ESVJFQ1RTT1VORFNSQ19IX18NCiNkZWZpbmUgX19HU1RfRElSRUNUU09VTkRTUkNfSF9fDQoNCiNpbmNsdWRlIDxnc3QvZ3N0Lmg+DQojaW5jbHVkZSA8Z3N0L2F1ZGlvL2F1ZGlvLmg+DQojaW5jbHVkZSA8Z3N0L2F1ZGlvL2dzdGF1ZGlvc3JjLmg+DQojaW5jbHVkZSA8d2luZG93cy5oPg0KI2luY2x1ZGUgPGRzb3VuZC5oPg0KDQovKiBhZGQgaGVyZSBzb21lIGhlYWRlcnMgaWYgbmVlZGVkICovDQoNCg0KR19CRUdJTl9ERUNMUw0KDQovKiAjZGVmaW5lcyBkb24ndCBsaWtlIHdoaXRlc3BhY2V5IGJpdHMgKi8NCiNkZWZpbmUgR1NUX1RZUEVfRElSRUNUU09VTkRfU1JDIChnc3RfZGlyZWN0c291bmRfc3JjX2dldF90eXBlKCkpDQojZGVmaW5lIEdTVF9ESVJFQ1RTT1VORF9TUkMob2JqKSAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksR1NUX1RZUEVfRElSRUNUU09VTkRfU1JDLEdzdERpcmVjdFNvdW5kU3JjKSkNCiNkZWZpbmUgR1NUX0RJUkVDVFNPVU5EX1NSQ19DTEFTUyhrbGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChrbGFzcyksR1NUX1RZUEVfRElSRUNUU09VTkRfU1JDLEdzdERpcmVjdFNvdW5kU3JjQ2xhc3MpKQ0KI2RlZmluZSBHU1RfSVNfRElSRUNUU09VTkRfU1JDKG9iaikgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NSQykpDQojZGVmaW5lIEdTVF9JU19ESVJFQ1RTT1VORF9TUkNfQ0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLEdTVF9UWVBFX0RJUkVDVFNPVU5EX1NSQykpDQoNCnR5cGVkZWYgc3RydWN0IF9Hc3REaXJlY3RTb3VuZFNyYyAgICAgIEdzdERpcmVjdFNvdW5kU3JjOw0KdHlwZWRlZiBzdHJ1Y3QgX0dzdERpcmVjdFNvdW5kU3JjQ2xhc3MgR3N0RGlyZWN0U291bmRTcmNDbGFzczsNCg0KI2RlZmluZSBHU1RfRFNPVU5EX0xPQ0sob2JqKQkoZ19tdXRleF9sb2NrICgmb2JqLT5kc291bmRfbG9jaykpDQojZGVmaW5lIEdTVF9EU09VTkRfVU5MT0NLKG9iaikJKGdfbXV0ZXhfdW5sb2NrICgmb2JqLT5kc291bmRfbG9jaykpDQoNCnN0cnVjdCBfR3N0RGlyZWN0U291bmRTcmMNCnsNCg0KICBHc3RBdWRpb1NyYyBzcmM7DQoNCiAgSElOU1RBTkNFIERTb3VuZERMTDsgLyogRExMIGluc3RhbmNlICovDQogIExQRElSRUNUU09VTkRDQVBUVVJFIHBEU0M7IC8qIERpcmVjdFNvdW5kQ2FwdHVyZSovDQogIExQRElSRUNUU09VTkRDQVBUVVJFQlVGRkVSIHBEU0JTZWNvbmRhcnk7ICAvKlNlY29uZGF0eSBjYXB0dXJlYnVmZmVyKi8NCiAgRFdPUkQgY3VycmVudF9jaXJjdWxhcl9vZmZzZXQ7DQoNCiAgSEFORExFIHJnaEV2ZW50Ow0KICBEV09SRCBub3RpZnlzaXplOw0KDQogIGd1aW50IGJ1ZmZlcl9zaXplOw0KICBndWludCBsYXRlbmN5X3NpemU7DQogIGd1aW50IGJ5dGVzX3Blcl9zYW1wbGU7DQoNCiAgZ3VpbnQgYnVmZmVyX3RpbWU7DQogIGd1aW50IGxhdGVuY3lfdGltZTsNCg0KDQogIEdVSUQgKmRldmljZV9ndWlkOw0KICBjaGFyICpkZXZpY2VfbmFtZTsNCg0KICBHTXV0ZXggZHNvdW5kX2xvY2s7DQoNCn07DQoNCnN0cnVjdCBfR3N0RGlyZWN0U291bmRTcmNDbGFzcyANCnsNCiAgR3N0QXVkaW9TcmNDbGFzcyBwYXJlbnRfY2xhc3M7DQp9Ow0KDQpHVHlwZSBnc3RfZGlyZWN0c291bmRfc3JjX2dldF90eXBlICh2b2lkKTsNCg0KR19FTkRfREVDTFMNCg0KI2VuZGlmIC8qIF9fR1NUX0RJUkVDVFNPVU5EU1JDX0hfXyAqLw0K