ZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlpbnRzLmggYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOTUyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaW50cy5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorKiogYXRhcmlpbnRzLmggLS0gQXRhcmkgTGludXggaW50ZXJydXB0IGhhbmRsaW5nIHN0cnVjdHMgYW5kIHByb3RvdHlwZXMKKyoqCisqKiBDb3B5cmlnaHQgMTk5NCBieSBCapRybiBCcmF1ZWwKKyoqCisqKiA1LzIvOTQgUm9tYW4gSG9kZWs6CisqKiAgIFRUIGludGVycnVwdCBkZWZpbml0aW9ucyBhZGRlZC4KKyoqCisqKiAxMi8wMi85NjogKFJvbWFuKQorKiogICBBZGFwdGVkIHRvIG5ldyBpbnQgaGFuZGxpbmcgc2NoZW1lIChzZWUgYXRhaW50cy5jKTsgcmV2aXNlZCBudW1iZXJpbmcKKyoqCisqKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworKiogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyoqIGZvciBtb3JlIGRldGFpbHMuCisqKgorKi8KKworI2lmbmRlZiBfTElOVVhfQVRBUklJTlRTX0hfCisjZGVmaW5lIF9MSU5VWF9BVEFSSUlOVFNfSF8KKworI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vYXRhcmlody5oPgorCisvKgorKiogQXRhcmkgSW50ZXJydXB0IHNvdXJjZXMuCisqKgorKi8KKworI2RlZmluZSBTVE1GUF9TT1VSQ0VfQkFTRSAgOAorI2RlZmluZSBUVE1GUF9TT1VSQ0VfQkFTRSAgMjQKKyNkZWZpbmUgU0NDX1NPVVJDRV9CQVNFICAgIDQwCisjZGVmaW5lIFZNRV9TT1VSQ0VfQkFTRSAgICA1NgorI2RlZmluZSBWTUVfTUFYX1NPVVJDRVMgICAgMTYKKworI2RlZmluZSBOVU1fQVRBUklfU09VUkNFUyAgIChWTUVfU09VUkNFX0JBU0UrVk1FX01BWF9TT1VSQ0VTLVNUTUZQX1NPVVJDRV9CQVNFKQorCisvKiBjb252ZXJ0IHZlY3RvciBudW1iZXIgdG8gaW50IHNvdXJjZSBudW1iZXIgKi8KKyNkZWZpbmUgSVJRX1ZFQ1RPUl9UT19TT1VSQ0UodikJKCh2KSAtICgodikgPCAweDIwID8gMHgxOCA6ICgweDQwLTgpKSkKKworLyogY29udmVydCBpcnFfaGFuZGxlciBpbmRleCB0byB2ZWN0b3IgbnVtYmVyICovCisjZGVmaW5lIElSUV9TT1VSQ0VfVE9fVkVDVE9SKGkpCSgoaSkgKyAoKGkpIDwgOCA/IDB4MTggOiAoMHg0MC04KSkpCisKKy8qIGludGVycnVwdCBzZXJ2aWNlIHR5cGVzICovCisjZGVmaW5lIElSUV9UWVBFX1NMT1cgICAgIDAKKyNkZWZpbmUgSVJRX1RZUEVfRkFTVCAgICAgMQorI2RlZmluZSBJUlFfVFlQRV9QUklPICAgICAyCisKKyNkZWZpbmUJSVJRX1NQVVJJT1VTICAgICAgKDApCisKKy8qIGF1dG8tdmVjdG9yIGludGVycnVwdHMgKi8KKyNkZWZpbmUgSVJRX0FVVE9fMSAgICAgICAgKDEpCisjZGVmaW5lIElSUV9BVVRPXzIgICAgICAgICgyKQorI2RlZmluZSBJUlFfQVVUT18zICAgICAgICAoMykKKyNkZWZpbmUgSVJRX0FVVE9fNCAgICAgICAgKDQpCisjZGVmaW5lIElSUV9BVVRPXzUgICAgICAgICg1KQorI2RlZmluZSBJUlFfQVVUT182ICAgICAgICAoNikKKyNkZWZpbmUgSVJRX0FVVE9fNyAgICAgICAgKDcpCisKKy8qIFNULU1GUCBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElSUV9NRlBfQlVTWSAgICAgICg4KQorI2RlZmluZSBJUlFfTUZQX0RDRCAgICAgICAoOSkKKyNkZWZpbmUgSVJRX01GUF9DVFMJICAoMTApCisjZGVmaW5lIElSUV9NRlBfR1BVCSAgKDExKQorI2RlZmluZSBJUlFfTUZQX1RJTUQgICAgICAoMTIpCisjZGVmaW5lIElSUV9NRlBfVElNQwkgICgxMykKKyNkZWZpbmUgSVJRX01GUF9BQ0lBCSAgKDE0KQorI2RlZmluZSBJUlFfTUZQX0ZEQyAgICAgICAoMTUpCisjZGVmaW5lIElSUV9NRlBfQUNTSSAgICAgIElSUV9NRlBfRkRDCisjZGVmaW5lIElSUV9NRlBfRlNDU0kgICAgIElSUV9NRlBfRkRDCisjZGVmaW5lIElSUV9NRlBfSURFICAgICAgIElSUV9NRlBfRkRDCisjZGVmaW5lIElSUV9NRlBfVElNQiAgICAgICgxNikKKyNkZWZpbmUgSVJRX01GUF9TRVJFUlIgICAgKDE3KQorI2RlZmluZSBJUlFfTUZQX1NFUkVNUFQgICAoMTgpCisjZGVmaW5lIElSUV9NRlBfUkVDRVJSICAgICgxOSkKKyNkZWZpbmUgSVJRX01GUF9SRUNGVUxMICAgKDIwKQorI2RlZmluZSBJUlFfTUZQX1RJTUEgICAgICAoMjEpCisjZGVmaW5lIElSUV9NRlBfUkkgICAgICAgICgyMikKKyNkZWZpbmUgSVJRX01GUF9NTUQgICAgICAgKDIzKQorCisvKiBUVC1NRlAgaW50ZXJydXB0cyAqLworI2RlZmluZSBJUlFfVFRfTUZQX0lPMCAgICAgICAoMjQpCisjZGVmaW5lIElSUV9UVF9NRlBfSU8xICAgICAgICgyNSkKKyNkZWZpbmUgSVJRX1RUX01GUF9TQ0MJICAgICAoMjYpCisjZGVmaW5lIElSUV9UVF9NRlBfUkkJICAgICAoMjcpCisjZGVmaW5lIElSUV9UVF9NRlBfVElNRCAgICAgICgyOCkKKyNkZWZpbmUgSVJRX1RUX01GUF9USU1DCSAgICAgKDI5KQorI2RlZmluZSBJUlFfVFRfTUZQX0RSVlJEWSAgICAoMzApCisjZGVmaW5lIElSUV9UVF9NRlBfU0NTSURNQSAgICgzMSkKKyNkZWZpbmUgSVJRX1RUX01GUF9USU1CICAgICAgKDMyKQorI2RlZmluZSBJUlFfVFRfTUZQX1NFUkVSUiAgICAoMzMpCisjZGVmaW5lIElSUV9UVF9NRlBfU0VSRU1QVCAgICgzNCkKKyNkZWZpbmUgSVJRX1RUX01GUF9SRUNFUlIgICAgKDM1KQorI2RlZmluZSBJUlFfVFRfTUZQX1JFQ0ZVTEwgICAoMzYpCisjZGVmaW5lIElSUV9UVF9NRlBfVElNQSAgICAgICgzNykKKyNkZWZpbmUgSVJRX1RUX01GUF9SVEMgICAgICAgKDM4KQorI2RlZmluZSBJUlFfVFRfTUZQX1NDU0kgICAgICAoMzkpCisKKy8qIFNDQyBpbnRlcnJ1cHRzICovCisjZGVmaW5lIElSUV9TQ0NCX1RYCSAgICAgKDQwKQorI2RlZmluZSBJUlFfU0NDQl9TVEFUCSAgICAgKDQyKQorI2RlZmluZSBJUlFfU0NDQl9SWAkgICAgICg0NCkKKyNkZWZpbmUgSVJRX1NDQ0JfU1BDT05ECSAgICAgKDQ2KQorI2RlZmluZSBJUlFfU0NDQV9UWAkgICAgICg0OCkKKyNkZWZpbmUgSVJRX1NDQ0FfU1RBVAkgICAgICg1MCkKKyNkZWZpbmUgSVJRX1NDQ0FfUlgJICAgICAoNTIpCisjZGVmaW5lIElSUV9TQ0NBX1NQQ09ORAkgICAgICg1NCkKKworCisjZGVmaW5lIElOVF9DTEsgICAyNDU3NgkgICAgLyogQ0xLIHdoaWxlIGludF9jbGsgPTIuNDU2TUh6IGFuZCBkaXZpZGUgPSAxMDAgKi8KKyNkZWZpbmUgSU5UX1RJQ0tTIDI0NgkgICAgLyogdG8gbWFrZSBzY2hlZF90aW1lID0gOTkuOTAyLi4uIEhaICovCisKKworI2RlZmluZSBNRlBfRU5BQkxFCTAKKyNkZWZpbmUgTUZQX1BFTkRJTkcJMQorI2RlZmluZSBNRlBfU0VSVklDRQkyCisjZGVmaW5lIE1GUF9NQVNLCTMKKworLyogVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNldHRpbmcvY2xlYXJpbmcgYml0cyBpbiB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBvZgorICogdGhlIE1GUC4gJ3R5cGUnIHNob3VsZCBiZSBjb25zdGFudCwgaWYgJ2lycScgaXMgY29uc3RhbnQsIHRvbywgY29kZSBzaXplIGlzCisgKiByZWR1Y2VkLiBzZXRfbWZwX2JpdCgpIGlzIG5vbnNlbnNlIGZvciBQRU5ESU5HIGFuZCBTRVJWSUNFIHJlZ2lzdGVycy4gKi8KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X21mcF9iaXQoIHVuc2lnbmVkIGlycSwgaW50IHR5cGUgKQorCit7CXVuc2lnbmVkIGNoYXIJbWFzaywgKnJlZzsKKworCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKwlyZWcgPSAodW5zaWduZWQgY2hhciAqKSZtZnAuaW50X2VuX2EgKyB0eXBlKjQgKworCQkgICgoaXJxICYgOCkgPj4gMikgKyAoKChpcnEtOCkgJiAxNikgPDwgMyk7CisJcmV0dXJuKCAqcmVnICYgbWFzayApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X21mcF9iaXQoIHVuc2lnbmVkIGlycSwgaW50IHR5cGUgKQorCit7CXVuc2lnbmVkIGNoYXIJbWFzaywgKnJlZzsKKworCW1hc2sgPSAxIDw8IChpcnEgJiA3KTsKKwlyZWcgPSAodW5zaWduZWQgY2hhciAqKSZtZnAuaW50X2VuX2EgKyB0eXBlKjQgKworCQkgICgoaXJxICYgOCkgPj4gMikgKyAoKChpcnEtOCkgJiAxNikgPDwgMyk7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAib3JiICUwLCUxIgorCQkJICAgICAgOiA6ICJkaSIgKG1hc2spLCAibSIgKCpyZWcpIDogIm1lbW9yeSIgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX21mcF9iaXQoIHVuc2lnbmVkIGlycSwgaW50IHR5cGUgKQorCit7CXVuc2lnbmVkIGNoYXIJbWFzaywgKnJlZzsKKworCW1hc2sgPSB+KDEgPDwgKGlycSAmIDcpKTsKKwlyZWcgPSAodW5zaWduZWQgY2hhciAqKSZtZnAuaW50X2VuX2EgKyB0eXBlKjQgKworCQkgICgoaXJxICYgOCkgPj4gMikgKyAoKChpcnEtOCkgJiAxNikgPDwgMyk7CisJaWYgKHR5cGUgPT0gTUZQX1BFTkRJTkcgfHwgdHlwZSA9PSBNRlBfU0VSVklDRSkKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAibW92ZWIgJTAsJTEiCisJCQkJICAgICAgOiA6ICJkaSIgKG1hc2spLCAibSIgKCpyZWcpIDogIm1lbW9yeSIgKTsKKwllbHNlCisJCV9fYXNtX18gX192b2xhdGlsZV9fICggImFuZGIgJTAsJTEiCisJCQkJICAgICAgOiA6ICJkaSIgKG1hc2spLCAibSIgKCpyZWcpIDogIm1lbW9yeSIgKTsKK30KKworLyoKKyAqIHtlbixkaXN9YWJsZV9pcnEgaGF2ZSB0aGUgdXN1YWwgc2VtYW50aWNzIG9mIHRlbXBvcmFyeSBibG9ja2luZyB0aGUKKyAqIGludGVycnVwdCwgYnV0IG5vdCBsb29zaW5nIHJlcXVlc3RzIHRoYXQgaGFwcGVuIGJldHdlZW4gZGlzYWJsaW5nIGFuZAorICogZW5hYmxpbmcuIFRoaXMgaXMgZG9uZSB3aXRoIHRoZSBNRlAgbWFzayByZWdpc3RlcnMuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF0YXJpX2VuYWJsZV9pcnEoIHVuc2lnbmVkIGlycSApCisKK3sKKwlpZiAoaXJxIDwgU1RNRlBfU09VUkNFX0JBU0UgfHwgaXJxID49IFNDQ19TT1VSQ0VfQkFTRSkgcmV0dXJuOworCXNldF9tZnBfYml0KCBpcnEsIE1GUF9NQVNLICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFyaV9kaXNhYmxlX2lycSggdW5zaWduZWQgaXJxICkKKworeworCWlmIChpcnEgPCBTVE1GUF9TT1VSQ0VfQkFTRSB8fCBpcnEgPj0gU0NDX1NPVVJDRV9CQVNFKSByZXR1cm47CisJY2xlYXJfbWZwX2JpdCggaXJxLCBNRlBfTUFTSyApOworfQorCisvKgorICogSW4gb3Bwb3NpdGUgdG8ge2VuLGRpc31hYmxlX2lycSwgcmVxdWVzdHMgYmV0d2VlbiB0dXJue29mZixvbn1faXJxIGFyZSBub3QKKyAqICJzdG9yZWQiCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGF0YXJpX3R1cm5vbl9pcnEoIHVuc2lnbmVkIGlycSApCisKK3sKKwlpZiAoaXJxIDwgU1RNRlBfU09VUkNFX0JBU0UgfHwgaXJxID49IFNDQ19TT1VSQ0VfQkFTRSkgcmV0dXJuOworCXNldF9tZnBfYml0KCBpcnEsIE1GUF9FTkFCTEUgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF0YXJpX3R1cm5vZmZfaXJxKCB1bnNpZ25lZCBpcnEgKQorCit7CisJaWYgKGlycSA8IFNUTUZQX1NPVVJDRV9CQVNFIHx8IGlycSA+PSBTQ0NfU09VUkNFX0JBU0UpIHJldHVybjsKKwljbGVhcl9tZnBfYml0KCBpcnEsIE1GUF9FTkFCTEUgKTsKKwljbGVhcl9tZnBfYml0KCBpcnEsIE1GUF9QRU5ESU5HICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFyaV9jbGVhcl9wZW5kaW5nX2lycSggdW5zaWduZWQgaXJxICkKKworeworCWlmIChpcnEgPCBTVE1GUF9TT1VSQ0VfQkFTRSB8fCBpcnEgPj0gU0NDX1NPVVJDRV9CQVNFKSByZXR1cm47CisJY2xlYXJfbWZwX2JpdCggaXJxLCBNRlBfUEVORElORyApOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdGFyaV9pcnFfcGVuZGluZyggdW5zaWduZWQgaXJxICkKKworeworCWlmIChpcnEgPCBTVE1GUF9TT1VSQ0VfQkFTRSB8fCBpcnEgPj0gU0NDX1NPVVJDRV9CQVNFKSByZXR1cm4oIDAgKTsKKwlyZXR1cm4oIGdldF9tZnBfYml0KCBpcnEsIE1GUF9QRU5ESU5HICkgKTsKK30KKwordW5zaWduZWQgbG9uZyBhdGFyaV9yZWdpc3Rlcl92bWVfaW50KCB2b2lkICk7Cit2b2lkIGF0YXJpX3VucmVnaXN0ZXJfdm1lX2ludCggdW5zaWduZWQgbG9uZyApOworCisjZW5kaWYgLyogbGludXgvYXRhcmlpbnRzLmggKi8K