ZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxNWU1YwotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTA0IEBACisjCisjICAgIENvcHlyaWdodCAoYykgMjAxMC0yMDExIE5lc3QsIEluYy4KKyMgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgICAgVGhpcyBkb2N1bWVudCBpcyB0aGUgcHJvcGVydHkgb2YgTmVzdC4gSXQgaXMgY29uc2lkZXJlZAorIyAgICBjb25maWRlbnRpYWwgYW5kIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9uLgorIworIyAgICBUaGlzIGRvY3VtZW50IG1heSBub3QgYmUgcmVwcm9kdWNlZCBvciB0cmFuc21pdHRlZCBpbiBhbnkgZm9ybSwKKyMgICAgaW4gd2hvbGUgb3IgaW4gcGFydCwgd2l0aG91dCB0aGUgZXhwcmVzcyB3cml0dGVuIHBlcm1pc3Npb24gb2YKKyMgICAgTmVzdC4KKyMKKyMgICAgRGVzY3JpcHRpb246CisjICAgICAgVGhpcyBmaWxlIGlzIHRoZSBtYWtlZmlsZSBmb3IgdGhlIHVzZXItbGV2ZWwgcGFja2V0IGNhcHR1cmUKKyMgICAgICBsaWJyYXJ5IChsaWJwY2FwKS4KKyMKKworQnVpbGRDb25maWdTcGVjaWFsaXplZAk6PSBObworQnVpbGRQcm9kdWN0U3BlY2lhbGl6ZWQJOj0gTm8KKworaW5jbHVkZSBwcmUubWFrCisKK1BhY2thZ2VOYW1lCQk6PSBsaWJwY2FwCisKK1BhY2thZ2VFeHRlbnNpb24JOj0gdGFyLmd6CitQYWNrYWdlU2VwYXJhdG9yCTo9IC0KKworUGFja2FnZVBhdGNoQXJncwk6PSAtcDEKKworUGFja2FnZUFyY2hpdmUJCTo9ICQoUGFja2FnZU5hbWUpLiQoUGFja2FnZUV4dGVuc2lvbikKK1BhY2thZ2VTb3VyY2VEaXIJOj0gJChQYWNrYWdlTmFtZSkkKFBhY2thZ2VTZXBhcmF0b3IpJChQYWNrYWdlVmVyc2lvbikKKworUGFja2FnZUJ1aWxkTWFrZWZpbGUJPSAkKGNhbGwgR2VuZXJhdGVCdWlsZFBhdGhzLE1ha2VmaWxlKQorCitDbGVhblBhdGhzCQkrPSAkKFBhY2thZ2VMaWNlbnNlRmlsZSkKKworYWxsOiAkKFBhY2thZ2VEZWZhdWx0R29hbCkKKworIyBHZW5lcmF0ZSB0aGUgcGFja2FnZSBsaWNlbnNlIGNvbnRlbnRzLgorCiskKFBhY2thZ2VTb3VyY2VEaXIpL0xJQ0VOU0U6IHNvdXJjZQorCiskKFBhY2thZ2VMaWNlbnNlRmlsZSk6ICQoUGFja2FnZVNvdXJjZURpcikvTElDRU5TRQorCSQoY29weS1yZXN1bHQpCisKKyMgRXh0cmFjdCB0aGUgc291cmNlIGZyb20gdGhlIGFyY2hpdmUgYW5kIGFwcGx5IHBhdGNoZXMsIGlmIGFueS4KKworJChQYWNrYWdlU291cmNlRGlyKTogJChQYWNrYWdlQXJjaGl2ZSkgJChQYWNrYWdlUGF0Y2hQYXRocykKKwkkKGV4cGFuZC1hbmQtcGF0Y2gtcGFja2FnZSkKKworIyBQcmVwYXJlIHRoZSBzb3VyY2VzLgorCisuUEhPTlk6IHNvdXJjZQorc291cmNlOiB8ICQoUGFja2FnZVNvdXJjZURpcikKKworIyBQYXRjaCB0aGUgc291cmNlcywgaWYgbmVjZXNzYXJ5LgorCisuUEhPTlk6IHBhdGNoCitwYXRjaDogc291cmNlCisKKyMgR2VuZXJhdGUgdGhlIHBhY2thZ2UgYnVpbGQgbWFrZWZpbGUuCisKKyQoUGFja2FnZUJ1aWxkTWFrZWZpbGUpOiB8ICQoUGFja2FnZVNvdXJjZURpcikgJChCdWlsZERpcmVjdG9yeSkgJChSZXN1bHREaXJlY3RvcnkpCisJJChWZXJib3NlKWNkICQoQnVpbGREaXJlY3RvcnkpICYmIFwKKwkkKENVUkRJUikvJChQYWNrYWdlU291cmNlRGlyKS9jb25maWd1cmUgXAorCUNDPSIkKENDKSIgQVI9JChBUikgUkFOTElCPSQoUkFOTElCKSBTVFJJUD0kKFNUUklQKSBcCisJSU5TVEFMTD0iJChJTlNUQUxMKSAkKElOU1RBTExGTEFHUykiIFwKKwkkKExpYlBjYXBQYWNrYWdlT3B0aW9ucykgXAorCS0td2l0aG91dC1saWJubCBcCisJLS1idWlsZD0kKEhvc3RUdXBsZSkgXAorCS0taG9zdD0kKFRhcmdldFR1cGxlKSBcCisJLS1wcmVmaXg9L3VzciBcCisJLS1zeXNjb25mZGlyPS9ldGMgXAorCS0tbG9jYWxzdGF0ZWRpcj0vdmFyIFwKKwktLWVuYWJsZS1pcHY2CisKKyMgQ29uZmlndXJlIHRoZSBzb3VyY2UgZm9yIGJ1aWxkaW5nLgorCisuUEhPTlk6IGNvbmZpZ3VyZQorY29uZmlndXJlOiBzb3VyY2UgJChQYWNrYWdlQnVpbGRNYWtlZmlsZSkKKworIyBCdWlsZCB0aGUgc291cmNlLgorIworIyBXZSBoYXZlIHRvIHVuc2V0IE1BS0VGTEFHUyBzaW5jZSB0aGV5IGNvbmZ1c2UgdGhlIHBhY2thZ2UgYnVpbGQgb3RoZXJ3aXNlLgorCisuUEhPTlk6IGJ1aWxkCitidWlsZDogY29uZmlndXJlCisJJChWZXJib3NlKXVuc2V0IE1BS0VGTEFHUyAmJiBcCisJJChNQUtFKSAkKEpPQlNGTEFHKSAtQyAkKEJ1aWxkRGlyZWN0b3J5KSBhbGwKKworIyBTdGFnZSB0aGUgYnVpbGQgdG8gYSB0ZW1wb3JhcnkgaW5zdGFsbGF0aW9uIGFyZWEuCisjCisjIFdlIGhhdmUgdG8gdW5zZXQgTUFLRUZMQUdTIHNpbmNlIHRoZXkgY29uZnVzZSB0aGUgcGFja2FnZSBidWlsZCBvdGhlcndpc2UuCisKKy5QSE9OWTogc3RhZ2UKK3N0YWdlOiBidWlsZCB8ICQoUmVzdWx0RGlyZWN0b3J5KQorCSQoVmVyYm9zZSl1bnNldCBNQUtFRkxBR1MgJiYgXAorCSQoTUFLRSkgJChKT0JTRkxBRykgLUMgJChCdWlsZERpcmVjdG9yeSkgREVTVERJUj0kKFJlc3VsdERpcmVjdG9yeSkgaW5zdGFsbAorCitjbGVhbjoKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFBhY2thZ2VTb3VyY2VEaXIpCisJJChWZXJib3NlKSQoUk0pICQoUk1GTEFHUykgLXIgJChCdWlsZERpcmVjdG9yeSkKKwkkKFZlcmJvc2UpJChSTSkgJChSTUZMQUdTKSAtciAkKFJlc3VsdERpcmVjdG9yeSkKKworaW5jbHVkZSBwb3N0Lm1hawpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9DSEFOR0VTIGIvbGlicGNhcC0xLjMuMC9DSEFOR0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmN2ZhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL0NIQU5HRVMKQEAgLTAsMCArMSw2NzIgQEAKK0ZyaWRheSAgTWFyY2ggMzAsIDIwMTIuICBtY3JAc2FuZGVsbWFuLmNhCitTdW1tYXJ5IGZvciAxLjMuMCBsaWJwY2FwIHJlbGVhc2UKKyAgICAgICAgSGFuZGxlIERMVF9QRlNZTkMgaW4ge0ZyZWVCU0QsIG90aGVyICpCU0QrTWFjIE9TIFgsIG90aGVyfS4KKyAgICAgICAgTGludXg6IERvbid0IGZhaWwgaWYgbmV0ZmlsdGVyIGlzbid0IGVuYWJsZWQgaW4gdGhlIGtlcm5lbC4KKyAgICAgICAgQWRkIG5ldyBsaW5rLWxheWVyIHR5cGUgZm9yIE5GQyBGb3J1bSBMTENQLgorICAgICAgICBQdXQgdGhlIENBTlVTQiBzdHVmZiBpbnRvIEVYVFJBX0RJU1QsIHNvIGl0IHNob3dzIHVwIGluIHRoZSByZWxlYXNlIHRhcmJhbGwuCisgICAgICAgIEFkZCBMSU5LVFlQRV9ORzQwL0RMVF9ORzQwLgorICAgICAgICBBZGQgRExUX01QRUdfMl9UUy9MSU5LVFlQRV9NUEVHXzJfVFMgZm9yIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtcy4KKyAgICAgICAgW1BBVENIXSBGaXggQUlYLTMuNSBjcmFzaCB3aXRoIHJlYWQgZmFpbHVyZSBkdXJpbmcgc3RyZXNzCisgICAgICAgIEFJWCBmaXhlcy4KKyAgICAgICAgSW50cm9kdWNlIC0tZGlzYWJsZS1zaGFyZWQgY29uZmlndXJlIG9wdGlvbi4KKyAgICAgICAgQWRkZWQgaW5pdGlhbCBzdXBwb3J0IGZvciBjYW51c2IgZGV2aWNlcy4KKyAgICAgICAgSW5jbHVkZSB0aGUgcGNhcCgzUENBUCkgYWRkaXRpb25zIGFzIDEuMi4xIGNoYW5nZXMuCisgICAgICAgIG1hbnkgdXBkYXRlcyB0byBkb2N1bWVudGF0aW9uOiBwY2FwLjNwY2FwLmluCisgICAgICAgIEltcHJvdmUgJ2luYm91bmQnLydvdXRib3VuZCcgY2FwdHVyZSBmaWx0ZXJzIHVuZGVyIExpbnV4LgorICAgICAgICBOb3RlIHRoZSBjbGVhbnVwIG9mIGhhbmRsaW5nIG9mIG5ldyBETFRfL0xJTktUWVBFXyB2YWx1ZXMuCisgICAgICAgIE9uIExpb24sIGRvbid0IGJ1aWxkIGZvciBQUEMuCisgICAgICAgIEZvciBtYWM4MDIxMSBkZXZpY2VzIHdlIG5lZWQgdG8gY2xlYW4gdXAgbW9uaXRvciBtb2RlIG9uIGV4aXQuCisKK0ZyaWRheSAgRGVjZW1iZXIgOSwgMjAxMS4gIGd1eUBhbHVtLm1pdC5lZHUuCitTdW1tYXJ5IGZvciAxLjIuMSBsaWJwY2FwIHJlbGVhc2UKKwlVcGRhdGUgUkVBRE1FIGZpbGUuCisJRml4IHR5cG9lcyBpbiBSRUFETUUubGludXggZmlsZS4KKwlDbGVhbiB1cCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLgorCUZpeCBMaW51eCBjb21waWxlIHByb2JsZW1zIGFuZCB0ZXN0cyBmb3IgZXRodG9vbC5oLgorCVRyZWF0IERlYmlhbi9rRnJlZUJTRCBhbmQgR05VL0h1cmQgYXMgc3lzdGVtcyB3aXRoIEdOVQorCSB0b29sY2hhaW5zLgorCVN1cHBvcnQgODAyLjEgUWluUSBhcyBhIGZvcm0gb2YgVkxBTiBpbiBmaWx0ZXJzLgorCVRyZWF0ICJjYXJwIiBhcyBlcXVpdmFsZW50IHRvICJ2cnJwIiBpbiBmaWx0ZXJzLgorCUZpeCBjb2RlIGdlbmVyYXRlZCBmb3IgImlwNiBwcm90b2NoYWluIi4KKwlBZGQgc29tZSBuZXcgbGluay1sYXllciBoZWFkZXIgdHlwZXMuCisJU3VwcG9ydCBjYXB0dXJpbmcgTmV0RmlsdGVyIGxvZyBtZXNzYWdlcyBvbiBMaW51eC4KKwlDbGVhbiB1cCBzb21lIGVycm9yIG1lc3NhZ2VzLgorCVR1cm4gb2ZmIG1vbml0b3IgbW9kZSBvbiBleGl0IGZvciBtYWM4MDIxMSBpbnRlcmZhY2VzIG9uIExpbnV4LgorCUZpeCBwcm9ibGVtcyB0dXJuaW5nIG1vbml0b3IgbW9kZSBvbiBmb3Igbm9uLW1hYzgwMjExIGludGVyZmFjZXMKKwkgb24gTGludXguCisJUHJvcGVybHkgZmFpbCBpZiAvc3lzL2NsYXNzL25ldCBvciAvcHJvYy9uZXQvZGV2IGV4aXN0IGJ1dCBjYW4ndAorCSBiZSBvcGVuZWQuCisJRmFpbCBpZiBwY2FwX2FjdGl2YXRlKCkgaXMgY2FsbGVkIG9uIGFuIGFscmVhZHktYWN0aXZhdGVkCisJIHBjYXBfdCwgYW5kIGFkZCBhIHRlc3QgcHJvZ3JhbSBmb3IgdGhhdC4KKwlGaXggZmlsdGVyaW5nIGluIHBjYXAtbmcgZmlsZXMuCisJRG9uJ3QgYnVpbGQgZm9yIFBvd2VyUEMgb24gTWFjIE9TIFggTGlvbi4KKwlTaW1wbGlmeSBoYW5kbGluZyBvZiBuZXcgRExUXy9MSU5LVFlQRV8gdmFsdWVzLgorCUV4cGFuZCBwY2FwKDNQQ0FQKSBtYW4gcGFnZS4KKworU3VuZGF5ICBKdWx5IDI0LCAyMDExLiAgbWNyQHNhbmRlbG1hbi5jYS4KK1N1bW1hcnkgZm9yIDEuMiBsaWJwY2FwIHJlbGVhc2UKKyAgICAgICAgQWxsIG9mIHRoZSBjaGFuZ2VzIGxpc3RlZCBiZWxvdyBmb3IgMS4xLjEgYW5kIDEuMS4yLgorICAgICAgICBDaGFuZ2VzIHRvIGVycm9yIGhhbmRsaW5nIGZvciBwY2FwX2ZpbmRhbGxkZXZzKCkuCisgICAgICAgIEZpeCB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGZyYW1lIHNpemUgaW4gbWVtb3J5LW1hcHBlZCBjYXB0dXJlcy4KKyAgICAgICAgQWRkIGEgbGluay1sYXllciBoZWFkZXIgdHlwZSBmb3IgU1RBTkFHIDUwNjYgRF9QRFVzLgorICAgICAgICBBZGQgYSBsaW5rLWxheWVyIHR5cGUgZm9yIGEgdmFyaWFudCBvZiAzR1BQIFRTIDI3LjAxMC4KKyAgICAgICAgTm90ZWQgcmVhbCBuYXR1cmUgb2YgTElOS1RZUEVfQVJDTkVULgorICAgICAgICBBZGQgYSBsaW5rLWxheWVyIHR5cGUgZm9yIERWQi1DSS4KKyAgICAgICAgRml4IGNvbmZpZ3VyZS1zY3JpcHQgZGlzY292ZXJ5IG9mIFZMQU4gYWNjZWxlcmF0aW9uIHN1cHBvcnQuCisgICAgICAgICBzZWUgaHR0cDovL25ldG9wdGltaXplci5ibG9nc3BvdC5jb20vMjAxMC8wOS90Y3BkdW1wLXZzLXZsYW4tdGFncy5odG1sCisgICAgICAgIExpbnV4LCBIUC1VWCwgQUlYLCBOZXRCU0QgYW5kIE9wZW5CU0QgY29tcGlsYXRpb24vY29uZmxpY3QgZml4ZXMuCisgICAgICAgIFByb3RlY3QgYWdhaW5zdCBpbmNsdWRpbmcgQUlYIDUueCdzIDxuZXQvYnBmLmg+IGhhdmluZyBiZWVuIGluY2x1ZGVkLgorICAgICAgICBBZGQgRExUX0RCVVMsIGZvciByYXcgRC1CdXMgbWVzc2FnZXMuCisgICAgICAgIFRyZWF0IGVpdGhlciBFUEVSTSBvciBFQUNDRVMgYXMgIm5vIHNvdXAgZm9yIHlvdSIuCisgICAgICAgIENoYW5nZXMgdG8gcGVybWlzc2lvbnMgb24gRExQSSBzeXN0ZW1zLgorICAgICAgICBBZGQgRExUX0lFRUU4MDJfMTVfNF9OT0ZDUyBmb3IgODAyLjE1LjQgaW50ZXJmYWNlcy4KKworRnJpLiAgICBBdWd1c3QgNiwgMjAxMC4gIGd1eUBhbHVtLm1pdC5lZHUuCitTdW1tYXJ5IGZvciAxLjEuMiBsaWJwY2FwIHJlbGVhc2UKKwlSZXR1cm4gRExUXyB2YWx1ZXMsIG5vdCByYXcgTElOS1RZUEVfIHZhbHVlcyBmcm9tCisJICBwY2FwX2RhdGFsaW5rKCkgd2hlbiByZWFkaW5nIHBjYXAtbmcgZmlsZXMKKwlBZGQgc3VwcG9ydCBmb3IgIndsYW4gcmEiIGFuZCAid2xhbiB0YSIsIHRvIGNoZWNrIHRoZSBSQSBhbmQgVEEKKwkgIG9mIFdMQU4gZnJhbWVzIHRoYXQgaGF2ZSB0aGVtCisJRG9uJ3QgY3Jhc2ggaWYgIndsYW4gYWRkcnsxLDIsMyw0fSIgYXJlIHVzZWQgd2l0aG91dCA4MDIuMTEKKwkgIGhlYWRlcnMKKwlEbyBmaWx0ZXJpbmcgb24gVVNCIGFuZCBCbHVldG9vdGggY2FwdHVyaW5nCisJT24gRnJlZUJTRC9TUEFSQzY0LCB1c2UgLWZQSUMgLSBpdCdzIGFwcGFyZW50bHkgbmVjZXNzYXJ5CisJQ2hlY2sgZm9yIHZhbGlkIHBvcnQgbnVtYmVycyAoZml0IGluIGEgMTYtYml0IHVuc2lnbmVkIGZpZWxkKSBpbgorCSAgInBvcnQiIGZpbHRlcnMKKwlSZWplY3QgYXR0ZW1wdHMgdG8gcHV0IHNhdmVmaWxlcyBpbnRvIG5vbi1ibG9ja2luZyBtb2RlCisJQ2hlY2sgZm9yICJubyBzdWNoIGRldmljZSIgZm9yIHRoZSAiZ2V0IHRoZSBtZWRpYSB0eXBlcyIgaW9jdGwKKwkgIGluICpCU0QKKwlJbXByb3ZlIGVycm9yIG1lc3NhZ2VzIGZyb20gYnBmX29wZW4oKSwgYW5kIGxldCBpdCBkbyB0aGUgZXJyb3IKKwkgIGhhbmRsaW5nCisJUmV0dXJuIG1vcmUgc3BlY2lmaWMgZXJyb3JzIGZyb20gcGNhcF9jYW5fc2V0X3JmbW9uKCk7IGZpeAorCSAgZG9jdW1lbnRhdGlvbgorCVVwZGF0ZSBkZXNjcmlwdGlvbiBmZXRjaGluZyBjb2RlIGZvciBGcmVlQlNELCBmaXggY29kZSBmb3IKKwkgIE9wZW5CU0QKKwlJZ25vcmUgL3N5cy9uZXQvZGV2IGZpbGVzIGlmIHdlIGdldCBFTk9ERVYgZm9yIHRoZW0sIG5vdCBqdXN0CisJICBFTlhJTzsgZml4ZXMgaGFuZGxpbmcgb2YgYm9uZGluZyBkZXZpY2VzIG9uIExpbnV4CisJRml4IGNoZWNrIGZvciBhIGNvbnN0YW50IDAgYXJndW1lbnQgdG8gQlBGX0RJVgorCVVzZSB0aGUgcmlnaHQgdmVyc2lvbiBvZiBhciB3aGVuIGNyb3NzLWJ1aWxkaW5nCisJRnJlZSBhbnkgZmlsdGVyIHNldCBvbiBhIHNhdmVmaWxlIHdoZW4gdGhlIHNhdmVmaWxlIGlzIGNsb3NlZAorCUluY2x1ZGUgdGhlIENGTEFHUyBzZXR0aW5nIHdoZW4gY29uZmlndXJlIHdhcyBydW4gaW4gdGhlCisJICBjb21waWxlciBmbGFncworCUFkZCBzdXBwb3J0IGZvciA4MDIuMTUuNCBpbnRlcmZhY2VzIG9uIExpbnV4CisKK1RodS4gICAgQXByaWwgMSwgMjAxMC4gIGd1eUBhbHVtLm1pdC5lZHUuCitTdW1tYXJ5IGZvciAxLjEuMSBsaWJwY2FwIHJlbGVhc2UKKwlVcGRhdGUgQ0hBTkdFUyB0byByZWZsZWN0IG1vcmUgb2YgdGhlIGNoYW5nZXMgaW4gMS4xLjAuCisJRml4IGJ1aWxkIG9uIFJIRUw1LgorCUZpeCBzaGFyZWQgbGlicmFyeSBidWlsZCBvbiBBSVguCisKK1RodS4JTWFyY2ggMTEsIDIwMTAuICBrZW5AbmV0ZnVuY3Rpb25hbC5jYS9ndXlAYWx1bS5taXQuZWR1LgorU3VtbWFyeSBmb3IgMS4xLjAgbGlicGNhcCByZWxlYXNlCisJQWRkIFNvY2tldENBTiBjYXB0dXJlIHN1cHBvcnQKKwlBZGQgTXlyaWNvbSBTTkYgQVBJIHN1cHBvcnQKKwlVcGRhdGUgRW5kYWNlIERBRyBhbmQgRVJGIHN1cHBvcnQKKwlBZGQgc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBvbiBTb2xhcmlzLCBIUC1VWCwgYW5kIEFJWAorCUJ1aWxkLCBpbnN0YWxsLCBhbmQgdW4taW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzIGJ5IGRlZmF1bHQ7CisJICBkb24ndCBidWlsZC9pbnN0YWxsIHNoYXJlZCBsaWJyYXJpZXMgb24gcGxhdGZvcm1zIHdlIGRvbid0IHN1cHBvcnQKKwlGaXggYnVpbGRpbmcgZnJvbSBhIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSBzb3VyY2UgZGlyZWN0b3J5CisJRml4IGNvbXBpbGVyIHdhcm5pbmdzIGFuZCBidWlsZHMgb24gc29tZSBwbGF0Zm9ybXMKKwlVcGRhdGUgY29uZmlnLmd1ZXNzIGFuZCBjb25maWcuc3ViCisJU3VwcG9ydCBtb25pdG9yIG1vZGUgb24gbWFjODAyMTEgZGV2aWNlcyBvbiBMaW51eAorCUZpeCBVU0IgbWVtb3J5LW1hcHBlZCBjYXB0dXJpbmcgb24gTGludXg7IGl0IHJlcXVpcmVzIGEgbmV3IERMVF8KKwkgIHZhbHVlCisJT24gTGludXgsIHNjYW4gL3N5cy9jbGFzcy9uZXQgZm9yIGRldmljZXMgaWYgd2UgaGF2ZSBpdDsgc2NhbgorCSAgaXQsIG9yIC9wcm9jL25ldC9kZXYgaWYgd2UgZG9uJ3QgaGF2ZSAvc3lzL2NsYXNzL25ldCwgZXZlbiBpZgorCSAgd2UgaGF2ZSBnZXRpZmFkZHJzKCksIGFzIGl0J2xsIGZpbmQgaW50ZXJmYWNlcyB3aXRoIG5vCisJICBhZGRyZXNzZXMKKwlBZGQgbGltaXRlZCBzdXBwb3J0IGZvciByZWFkaW5nIHBjYXAtbmcgZmlsZXMKKwlGaXggQlBGIGRyaXZlci1sb2FkaW5nIGVycm9yIGhhbmRsaW5nIG9uIEFJWAorCVN1cHBvcnQgZ2V0dGluZyB0aGUgZnVsbC1sZW5ndGggaW50ZXJmYWNlIGRlc2NyaXB0aW9uIG9uIEZyZWVCU0QKKwlJbiB0aGUgbGV4aWNhbCBhbmFseXplciwgZnJlZSB1cCBhbnkgYWRkcmluZm8gc3RydWN0dXJlIHdlIGdvdCBiYWNrCisJICBmcm9tIGdldGFkZHJpbmZvKCkuCisJQWRkIHN1cHBvcnQgZm9yIEJQRiBhbmQgbGliZGxwaSBpbiBPcGVuU29sYXJpcyAoYW5kIFNYQ0UpCisJSHlwaGVuYXRlICJsaW5rLWxheWVyIiBldmVyeXdoZXJlCisJQWRkIC9zeXMva2VybmVsL2RlYnVnL3VzYi91c2Jtb24gdG8gdGhlIGxpc3Qgb2YgdXNibW9uIGxvY2F0aW9ucworCUluIHBjYXBfcmVhZF9saW51eF9tbWFwKCksIGlmIHRoZXJlIGFyZSBubyBmcmFtZXMgYXZhaWxhYmxlLCBjYWxsCisJICBwb2xsKCkgZXZlbiBpZiB3ZSdyZSBpbiBub24tYmxvY2tpbmcgbW9kZSwgc28gd2UgcGljayB1cAorCSAgZXJyb3JzLCBhbmQgY2hlY2sgZm9yIHRoZSBlcnJvcnMgaW4gcXVlc3Rpb24uCisJTm90ZSB0aGF0IHBvbGwoKSB3b3JrcyBvbiBCUEYgZGV2aWNlcyBpcyBTbm93IExlb3BhcmQKKwlJZiBhbiBFTlhJTyBvciBFTkVURE9XTiBpcyByZWNlaXZlZCwgaXQgbWF5IG1lYW4gdGhlIGRldmljZSBoYXMKKwkgIGdvbmUgYXdheS4gIERlYWwgd2l0aCBpdC4KKwlGb3IgQlBGLCByYWlzZSB0aGUgZGVmYXVsdCBjYXB0dXJlIGJ1ZmZlciBzaXplIHRvIGZyb20gMzJrIHRvIDUxMmsKKwlTdXBwb3J0IHBzX2lmZHJvcCBvbiBMaW51eAorCUFkZGVkIGEgYnVuY2ggb2YgI2lmZGVmIGRpcmVjdGl2ZXMgdG8gbWFrZSB3cGNhcC5kbGwgKFdpblBjYXApIGNvbXBpbGUKKwkgdW5kZXIgY3lnd2luLgorCUNoYW5nZXMgdG8gTGludXggbW1hcHBlZCBjYXB0dXJlcy4KKwlGaXggYnVnIHdoZXJlIGNyZWF0ZV9yaW5nIHdvdWxkIGZhaWwgZm9yIHBhcnRpY3VsYXIgc25hcGxlbiBhbmQKKwkgIGJ1ZmZlciBzaXplIGNvbWJpbmF0aW9ucworCVVwZGF0ZSBwY2FwLWNvbmZpZyBzbyB0aGF0IGl0IGhhbmRsZXMgbGlicGNhcCByZXF1aXJpbmcKKwkgIGFkZGl0aW9uYWwgbGlicmFyaWVzCisJQWRkIHdvcmthcm91bmQgZm9yIHRocmVhZHNhZmVuZXNzIG9uIFdpbmRvd3MKKwlBZGQgbWlzc2luZyBtYXBwaW5nIGZvciBETFRfRU5DIDwtPiBMSU5LVFlQRV9FTkMKKwlETFQ6IEFkZCBETFRfQ0FOX1NPQ0tFVENBTgorCURMVDogQWRkIFNvbGFyaXMgaXBuZXQKKwlEb24ndCBjaGVjayBmb3IgRExUX0lQTkVUIGlmIGl0J3Mgbm90IGRlZmluZWQKKwlBZGQgbGluay1sYXllciB0eXBlcyBmb3IgRmlicmUgQ2hhbm5lbCBGQy0yCisJQWRkIGxpbmstbGF5ZXIgdHlwZXMgZm9yIFdpcmVsZXNzIEhBUlQKKwlBZGQgbGluay1sYXllciB0eXBlcyBmb3IgQU9TCisJQWRkIGxpbmstbGF5ZXIgdHlwZXMgZm9yIERFQ1QKKwlBdXRvY29uZiBmaXhlcyAoQUlYLCBIUC1VWCwgT1NGLzEsIFRydTY0IGNsZWFudXBzKQorCUluc3RhbGwgaGVhZGVycyB1bmNvbmRpdGlvbmFsbHksIGFuZCBpbmNsdWRlIHZsYW4uaC9ibHVldG9vdGguaCBpZgorCSAgZW5hYmxlZAorCUF1dG9jb25mIGZpeGVzK2NsZWFudXAKKwlTdXBwb3J0IGVuYWJsaW5nL2Rpc2FibGluZyBibHVldG9vdGggKC0te2VuLGRpc31hYmxlLWJsdWV0b290aCkKKwlTdXBwb3J0IGRpc2FibGluZyBTSVRBIHN1cHBvcnQgKC0td2l0aG91dC1zaXRhKQorCVJldHVybiAtMSBvbiBmYWlsdXJlIHRvIGNyZWF0ZSBwYWNrZXQgcmluZyAoaWYgc3VwcG9ydGVkIGJ1dAorCSAgY3JlYXRpb24gZmFpbGVkKQorCUZpeCBoYW5kbGluZyBvZiAnYW55JyBkZXZpY2UsIHNvIHRoYXQgaXQgY2FuIGJlIG9wZW5lZCwgYW5kIG5vIGxvbmdlcgorCSAgYXR0ZW1wdCB0byBvcGVuIGl0IGluIE1vbml0b3IgbW9kZQorCUFkZCBzdXBwb3J0IGZvciBzbmFwc2hvdCBsZW5ndGggZm9yIFVTQiBNZW1vcnktTWFwcGVkIEludGVyZmFjZQorCUZpeCBjb25maWd1cmUgYW5kIGJ1aWxkIG9uIHJlY2VudCBMaW51eCBrZXJuZWxzCisJRml4IG1lbW9yeS1tYXBwZWQgTGludXggY2FwdHVyZSB0byBzdXBwb3J0IHBjYXBfbmV4dCgpIGFuZAorCSAgcGNhcF9uZXh0X2V4KCkKKwlGaXhlcyBmb3IgTGludXggVVNCIGNhcHR1cmUKKwlETFQ6IEFkZCBETFRfTElOVVhfRVZERVYKKwlETFQ6IEFkZCBETFRfR1NNVEFQX1VNCisJRExUOiBBZGQgRExUX0dTTVRBUF9BQklTCisKK01vbi4gICAgT2N0b2JlciAyNywgMjAwOC4gIGtlbkBuZXRmdW5jdGlvbmFsLmNhLiAgU3VtbWFyeSBmb3IgMS4wLjAgbGlicGNhcCByZWxlYXNlCisJQ29tcGlsZSB3aXRoIElQdjYgc3VwcG9ydCBieSBkZWZhdWx0CisJQ29tcGlsZSB3aXRoIGxhcmdlIGZpbGUgc3VwcG9ydCBvbiBieSBkZWZhdWx0CisJQWRkIHBjYXAtY29uZmlnIHNjcmlwdCwgd2hpY2ggZGVhbHMgd2l0aCAtSS8tTCBmbGFncyBmb3IgY29tcGlsaW5nCisJRExUOiBBZGQgSVBNQgorCURMVDogQWRkIExBUEQKKwlETFQ6IEFkZCBBWDI1IChBWC4yNSB3L0tJU1MgaGVhZGVyKQorCURMVDogQWRkIEpVTklQRVJfU1QKKwk4MDIuMTUuNCBzdXBwb3J0CisJVmFyaWFibGUgbGVuZ3RoIDgwMi4xMSBoZWFkZXIgc3VwcG9ydAorCVgyRSBkYXRhIHR5cGUgc3VwcG9ydCAKKwlTSVRBIEFDTiBJbnRlcmZhY2Ugc3VwcG9ydCAtIHNlZSBSRUFETUUuc2l0YQorCVN1cHBvcnQgZm9yIG1lbW9yeS1tYXBwZWQgY2FwdHVyZSBvbiBMaW51eAorCVN1cHBvcnQgZm9yIHplcm9jb3B5IEJQRiBvbiBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IGl0CisJU3VwcG9ydCBmb3Igc2V0dGluZyBidWZmZXIgc2l6ZSB3aGVuIG9wZW5pbmcgZGV2aWNlcworCVN1cHBvcnQgZm9yIHNldHRpbmcgbW9uaXRvciBtb2RlIHdoZW4gb3BlbmluZyA4MDIuMTEgZGV2aWNlcworCUJldHRlciBzdXBwb3J0IGZvciBkZWFsaW5nIHdpdGggVkxBTiB0YWdnaW5nL3N0cmlwcGluZyBvbiBMaW51eAorCUZpeCBkeW5hbWljIGxpYnJhcnkgc3VwcG9ydCBvbiBPU1gKKwlSZXR1cm4gUENBUF9FUlJPUl9JRkFDRV9OT1RfVVAgaWYgdGhlIGludGVyZmFjZSBpc24ndCAnVVAnLCBzbyBhcHBsaWNhdGlvbnMKKwkgY2FuIHByaW50IGJldHRlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uCisJUmV0dXJuIFBDQVBfRVJST1JfUEVSTV9ERU5JRUQgaWYgd2UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIG9wZW4gYSBkZXZpY2UsIHNvCisJIGFwcGxpY2F0aW9ucyBjYW4gdGVsbCB0aGUgdXNlciB0aGV5IG5lZWQgdG8gZ28gcGxheSB3aXRoIHBlcm1pc3Npb25zCisJT24gTGludXgsIGlnbm9yZSBFTkVURE9XTiBzbyB3ZSBjYW4gY29udGludWUgdG8gY2FwdHVyZSBwYWNrZXRzIGlmIHRoZSAKKwkgaW50ZXJmYWNlIGdvZXMgZG93biBhbmQgY29tZXMgYmFjayB1cCBhZ2Fpbi4KKwlPbiBMaW51eCwgc3VwcG9ydCBuZXcgdHBhY2tldCBmcmFtZSBoZWFkZXJzICgyLjYuMjcrKQorCU9uIE1hYyBPUyBYLCBhZGQgc2NyaXB0cyBmb3IgY2hhbmdpbmcgcGVybWlzc2lvbnMgb24gL2Rldi9icGYqIGFuZCBsYXVuY2hkIHBsaXN0CisJT24gU29sYXJpcywgc3VwcG9ydCAncGFzc2l2ZSBtb2RlJyBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBpdAorCUZpeGVzIHRvIGF1dG9jb25mIGFuZCBnZW5lcmFsIGJ1aWxkIGVudmlyb25tZW50CisJTWFuIHBhZ2UgcmVvcmdhbml6YXRpb24gKyBjbGVhbnVwCisJQXV0b2dlbmVyYXRlIFZFUlNJT04gbnVtYmVycyBiZXR0ZXIKKworTW9uLiAgICBTZXB0ZW1iZXIgMTAsIDIwMDcuICBrZW5AeGVsZXJhbmNlLmNvbS4gIFN1bW1hcnkgZm9yIDAuOS44IGxpYnBjYXAgcmVsZWFzZQorICAgICAgICBDaGFuZ2UgYnVpbGQgcHJvY2VzcyB0byBwdXQgcHVibGljIGxpYnBjYXAgaGVhZGVycyBpbnRvIHBjYXAgc3ViaXIKKyAgICAgICAgRExUOiBBZGQgdmFsdWUgZm9yIElQTUkgSVBNQiBwYWNrZXRzCisgICAgICAgIERMVDogQWRkIHZhbHVlIGZvciB1MTAgTmV0d29ya3MgYm9hcmRzCisgICAgICAgIFJlcXVpcmUgPG5ldC9wZnZhci5oPiBmb3IgcGYgZGVmaW5pdGlvbnMgLSBhbGxvd3MgcmVhZGluZyBvZiBwZmxvZyBmb3JtYXR0ZWQgCisgICAgICAgICBsaWJwY2FwIGZpbGVzIG9uIGFuIE9TIG90aGVyIHRoYW4gd2hlcmUgdGhlIGZpbGUgd2FzIGdlbmVyYXRlZAorCitXZWQuCUFwcmlsIDI1LCAyMDA3LiAga2VuQHhlbGVyYW5jZS5jb20uICBTdW1tYXJ5IGZvciAwLjkuNiBsaWJwY2FwIHJlbGVhc2UKKworCVB1dCB0aGUgcHVibGljIGxpYnBjYXAgaGVhZGVycyBpbnRvIGEgcGNhcCBzdWJkaXJlY3RvcnkgaW4gYm90aCB0aGUKKwkgc291cmNlIGRpcmVjdG9yeSBhbmQgdGhlIHRhcmdldCBpbmNsdWRlIGRpcmVjdG9yeSwgYW5kIGhhdmUgaW5jbHVkZQorCSBmaWxlcyBhdCB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSB0byBpbmNsdWRlIHRob3NlIGhlYWRlcnMsIGZvciAKKwkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJQWRkIEJsdWV0b290aCBzdXBwb3J0CisJQWRkIFVTQiBjYXB0dXJpbmcgc3VwcG9ydCBvbiBMaW51eAorCUFkZCBzdXBwb3J0IGZvciB0aGUgYmluYXJ5IFVTQiBzbmlmZmluZyBpbnRlcmZhY2UgaW4gTGludXgKKwlBZGQgc3VwcG9ydCBmb3IgbmV3IEZyZWVCU0QgQklPQ1NESVJFQ1RJT04gaW9jdGwKKwlBZGQgYWRkaXRpb25hbCBmaWx0ZXIgb3BlcmF0aW9ucyBmb3IgODAyLjExIGZyYW1lIHR5cGVzCisJQWRkIHN1cHBvcnQgZm9yIGZpbHRlcmluZyBvbiBNVFAyIGZyYW1lIHR5cGVzCisJUHJvcGFnYXRlIHNvbWUgY2hhbmdlcyBmcm9tIHRoZSBtYWluIGJyYW5jaCwgc28gdGhlIHguOSBicmFuY2ggaGFzIAorCSBhbGwgdGhlIERMVF8gYW5kIExJTktUWVBFXyB2YWx1ZXMgdGhhdCB0aGUgbWFpbiBicmFuY2ggZG9lcworCVJlc2VydmVkIGEgRExUXyBhbmQgU0FWRUZJTEVfIHZhbHVlIGZvciBQUEkgKFBlciBQYWNrZXQgSW5mbykgCisJIGVuY2Fwc3VsYXRlZCBwYWNrZXRzCisJQWRkIExJTktUWVBFXyBmb3IgSUVFRSA4MDIuMTUuNCwgd2l0aCBhZGRyZXNzIGZpZWxkcyBwYWRkZWQgYXMgZG9uZSAKKwkgYnkgTGludXggZHJpdmVycworCUFkZCBMSU5LVFlQRV8gdmFsdWUgY29ycmVzcG9uZGluZyB0byBETFRfSUVFRTgwMl8xNl9NQUNfQ1BTLgorCUFkZCBETFQgZm9yIElFRUUgODAyLjE2IChXaU1BWCkgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyCisJQWRkIERMVCBmb3IgQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllcgorCVdoZW4gYnVpbGRpbmcgYSBzaGFyZWQgbGlicmFyeSwgYnVpbGQgd2l0aCAiLWZQSUMiIG9uIExpbnV4IHRvIHN1cHBvcnQgeDg2XzY0CisJTGluayB3aXRoICIkKENDKSAtc2hhcmVkIiByYXRoZXIgdGhhbiAibGQgLXNoYXJlZCIgd2hlbiBidWlsZGluZyBhIAorCSAiLnNvIiBzaGFyZWQgbGlicmFyeQorCUFkZCBzdXBwb3J0IGZvciBhdXRvY29uZiAyLjYwCisJRml4ZXMgdG8gZGlzY2FyZCB1bnJlYWQgcGFja2V0cyB3aGVuIGNoYW5naW5nIGZpbHRlcnMKKwlDaGFuZ2VzIHRvIGhhbmRsZSBuYW1lIGNoYW5nZXMgaW4gdGhlIERBRyBsaWJyYXJ5IHJlc3VsdGluZyBmcm9tIAorCSBzd2l0Y2hpbmcgdG8gbGlidG9vbC4KKwlBZGQgc3VwcG9ydCBmb3IgbmV3IERBRyBFUkYgdHlwZXMuCisgICAgICAgIEFkZCBhbiBleHBsaWNpdCAiLWxkYWciIHdoZW4gYnVpbGRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5LCBzbyB0aGUgREFHIAorCSBsaWJyYXJ5IGRlcGVuZGVuY3kgaXMgZXhwbGljaXQuCisJTWFjIE9TWCBmaXhlcyBmb3IgZGVhbGluZyB3aXRoICJ3bHQiIGRldmljZXMKKwlGaXhlcyBpbiBhZGRfb3JfZmluZF9pZigpICYgcGNhcF9maW5kYWxsZGV2cygpIHRvIG9wdGltaXplIGdlbmVyYXRpbmcKKwkgZGV2aWNlIGxpc3RzCisJRml4ZWQgYSBidWcgaW4gcGNhcF9vcGVuX2xpdmUoKS4gVGhlIHJldHVybiB2YWx1ZSBvZiBQYWNrZXRTZXRId0ZpbHRlcgorCSB3YXMgbm90IGNoZWNrZWQuIAorCitUdWUuCVNlcHRlbWJlciAxOSwgMjAwNi4ga2VuQHhlbGVyYW5jZS5jb20uIFN1bW1hcnkgZm9yIDAuOS41IGxpYnBjYXAgcmVsZWFzZQorCisJU3VwcG9ydCBmb3IgTEFQRCBmcmFtZXMgd2l0aCB2SVNETgorCVN1cHBvcnQgZm9yIEVSRiBvbiBjaGFubmVsaXplZCBUMS9FMSBjYXJkcyB2aWEgREFHIEFQSQorCUZpeCBjYXBpdGFsaXphdGlvbiB0aGF0IGNhdXNlZCBpc3N1ZXMgY3Jvc3NjIGNvbXBpbGluZyBvbiBMaW51eAorCUJldHRlciBmYWlsdXJlIGRldGVjdGlvbiBvbiBQYWNrZXRHZXRBZGFwdGVyTmFtZXMoKQorCUZpeGVzIGZvciBNUExTIHBhY2tldCBnZW5lcmF0aW9uIChsaW5rIGxheWVyKQorCU9QX1BBQ0tFVCBub3cgbWF0Y2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQsIGluc3RlYWQgb2YKKwkgYmVnaW5uaW5nK2xpbmstbGF5ZXIKKwlBZGQgRExUL0xJTktUWVBFIGZvciBjYXJyeWluZyBGUkYuMTYgTXVsdGktbGluayBGcmFtZSBSZWxheQorCUZpeCBhbGxvY2F0aW9uIG9mIGJ1ZmZlciBmb3IgbGlzdCBvZiBsaW5rLWxheWVyIHR5cGVzICAKKwlBZGRlZCBhIG5ldyBETFQgYW5kIExJTktUWVBFIHZhbHVlIGZvciBBUklOQyA2NTMgSW50ZXJwYXJ0aXRpb24gQ29tbXVuY2F0aW9uIE1lc3NhZ2VzCisJRml4ZWQgYSB0eXBvIGluIGEgRExUIHZhbHVlOiBpdCBzaG91bGQgc3RhcnQgd2l0aCBETFRfIGFuZCBub3QgTElOS1RZUEVfCisJUmVkZWZpbmVkIERMVF9DQU4yMEIgYW5kIExJTktUWVBFX0NBTjIwQiBhcyAjMTkwIChhcyB0aGlzIGlzIHRoZSByaWdodCB2YWx1ZSBmb3IgQ0FOKS4KKwlBZGRlZCBkZWZpbml0aW9uIGZvciBETFRfQTQyOSBhbmQgTElOS1RZUEVfQTQyOSBhcyAjMTg0LgorCUFkZGVkIGEgbmV3IERMVCBhbmQgTElOS1RZUEUgdmFsdWUgZm9yIENBTiB2Mi4wQiBmcmFtZXMuCisJQWRkIHN1cHBvcnQgZm9yIERMVF9KVU5JUEVSX1ZQLgorCURvbid0IGRvdWJsZS1jb3VudCByZWNlaXZlZCBwYWNrZXRzIG9uIExpbnV4IHN5c3RlbXMgdGhhdCAKKwkgc3VwcG9ydCB0aGUgUEFDS0VUX1NUQVRJU1RJQ1MgZ2V0c29ja29wdCgpIGFyZ3VtZW50IG9uIAorCSBQRl9QQUNLRVQgc29ja2V0cy4KKwlBZGQgc3VwcG9ydCBmb3IgRExUX0lFRUU4MDJfMTEgYW5kIERMVF9JRUVFODAyXzExX1JBRElPIGxpbmsgCisJIGxheWVycyBpbiBXaW5kb3dzCisJQWRkIHN1cHBvcnQgdG8gYnVpbGQgbGlicGNhcC5saWIgYW5kIHdwY2FwLmRsbCB1bmRlciBDeWdudXMgYW5kIAorCSBNaW5nVzMyLgorCitNb24uIAlTZXB0ZW1iZXIgNSwgMjAwNS4gIGtlbkB4ZWxlcmFuY2UuY29tLiBTdW1tYXJ5IGZvciAwLjkuNCBsaWJwY2FwIHJlbGVhc2UKKworCVN1cHBvcnQgZm9yIHJhZGlvdGFwIG9uIExpbnV4IChNaWtlIEtlcnNoYXcpCisJRml4ZXMgZm9yIEhQLVVYCisJU3VwcG9ydCBmb3IgYWRkaXRpb25hbCBKdW5pcGVyIGxpbmstbGF5ZXIgdHlwZXMKKwlGaXhlcyBmb3IgZmlsdGVycyBvbiBNUExTLWVuY2Fwc3VsYXRlZCBwYWNrZXRzCisJInZsYW4iIGZpbHRlciBmaXhlZAorCSJwcHBvZWQiIGFuZCAicHBwb2VzIiBmaWx0ZXJzIGFkZGVkOyB0aGUgbGF0dGVyIG1vZGlmaWVzIGxhdGVyCisJcGFydHMgb2YgdGhlIGZpbHRlciBleHByZXNzaW9uIHRvIGxvb2sgYXQgdGhlIFBQUCBoZWFkZXJzIGFuZAorCWhlYWRlcnMgaW4gdGhlIFBQUCBwYXlsb2FkCisKK1R1ZS4gCUp1bHkgNSwgMjAwNS4gIGtlbkB4ZWxlcmFuY2UuY29tLiBTdW1tYXJ5IGZvciAwLjkuMyBsaWJwY2FwIHJlbGVhc2UKKworCUZpeGVzIGZvciBjb21waWxpbmcgb24gbmVhcmx5IGV2ZXJ5IHBsYXRmb3JtLAorCQlpbmNsdWRpbmcgaW1wcm92ZWQgNjRiaXQgc3VwcG9ydAorCU1TRE9TIFN1cHBvcnQKKwlBZGQgc3VwcG9ydCBmb3Igc2VuZGluZyBwYWNrZXRzCisJT3BlbkJTRCBwZiBmb3JtYXQgc3VwcG9ydAorCUlyREEgY2FwdHVyZSAoTGludXggb25seSkKKworVHVlLiAgIE1hcmNoIDMwLCAyMDA0LiBtY3JAc2FuZGVsbWFuLm90dGF3YS5vbi5jYS4gU3VtbWFyeSBmb3IgMy44LjMgcmVsZWFzZQorCisJRml4ZWQgbWlub3IgcHJvYmxlbSBpbiBnZW5jb2RlLmMgdGhhdCB3b3VsZCBhcHBlYXIgb24gNjQtYml0CisJcGxhdGZvcm1zLgorCVZlcnNpb24gbnVtYmVyIGlzIG5vdyBzYW5lLgorCitNb24uICAgTWFyY2ggMjksIDIwMDQuIG1jckBzYW5kZWxtYW4ub3R0YXdhLm9uLmNhLiBTdW1tYXJ5IGZvciAzLjguMiByZWxlYXNlCisKKwl1cGRhdGVzIGZvciBhdXRvY29uZiAyLjUKKwlmaXhlcyBmb3IgcHBwIGludGVyZmFjZXMgZm9yIGZyZWVic2QgNC4xCisJcGNhcCBnZW5jb2RlIGNhbiBnZW5lcmF0ZSBjb2RlIGZvciA4MDIuMTEsIElFRUUxMzk0LCBhbmQgcGZsb2cuCisKK1dlZC4gICBOb3ZlbWJlciAxMiwgMjAwMy4gbWNyQHNhbmRlbG1hbi5vdHRhd2Eub24uY2EuIFN1bW1hcnkgZm9yIDAuOCByZWxlYXNlCisKKwlhZGRlZCBwY2FwX2ZpbmRhbGxkZXZzKCkKKwlXaW4zMiBwYXRjaGVzIGZyb20gTmV0R3JvdXAsIFBvbGl0ZWNuaWNvIGRpIFRvcmlubyAoSXRhbHkpCisJT3BlbkJTRCBwZiwgRExUX1BGTE9HIGFkZGVkCisJTWFueSBjaGFuZ2VzIHRvIEFUTSBzdXBwb3J0LgorCWxvb2t1cCBwY2FwX2xvb2t1cG5ldCgpCisJQWRkZWQgRExUX0FSQ05FVF9MSU5VWCwgRExUX0VOQywgRExUX0lFRUU4MDJfMTFfUkFESU8sIERMVF9TVU5BVE0sCisJCURMVF9JUF9PVkVSX0ZDLCBETFRfRlJFTEFZLCBvdGhlcnMuCisJU2lnaC4gIE1vcmUgQUlYIHdvbmRlcmZ1bG5lc3MuCisJRG9jdW1lbnQgdXBkYXRlcy4KKwlDaGFuZ2VzIHRvIEFQSTogcGNhcF9uZXh0X2V4KCksIHBjYXBfYnJlYWtsb29wKCksIHBjYXBfZHVtcF9mbHVzaCgpLAorCQkJcGNhcF9saXN0X2RhdGFsaW5rcygpLCBwY2FwX3NldF9kYXRhbGluaygpLAorCQkJcGNhcF9saWJfdmVyc2lvbigpLCBwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKCksCisJCQlwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKCksIG5ldyBlcnJvciByZXR1cm5zLgorCitUdWVzZGF5LCBGZWJydWFyeSAyNSwgMjAwMy4gZmVubmVyQHJlc2VhcmNoLmF0dC5jb20uICAwLjcuMiByZWxlYXNlCisKKyAJU3VwcG9ydCBsaW5rIHR5cGVzIHRoYXQgdXNlIDgwMi4yIGFsd2F5cywgbmV2ZXIsIGFuZCBzb21ldGltZXMuCisgCURvbid0IGRlY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBCUEYgYnVmZmVyIGZyb20gdGhlIGRlZmF1bHQuCisgCVN1cHBvcnQgZnJhbWUgcmVsYXkuCisgCUhhbmRsZSAzMi1iaXQgdGltZXN0YW1wcyBpbiBETFBJLCBhbmQgcGFzcyB0aGUgcmlnaHQgYnVmZmVyIHNpemUuCisgCUhhbmRsZSBMaW51eCBzeXN0ZW1zIHdpdGggbW9kZXJuIGtlcm5lbCBidXQgd2l0aG91dAorIAkgU09MX1BBQ0tFVCBpbiB0aGUgdXNlcmxhbmQgaGVhZGVycy4KKyAJTGludXggc3VwcG9ydCBmb3IgQVJQSFJEX1JBV0hETEMuCisgCUhhbmRsZSAzMi1iaXQgdGltZXN0YW1wcyBpbiBzbm9vcC4KKyAJU3VwcG9ydCBlZyAoT2N0YW5lL08yeHh4L08zeHh4IEdpZ2FiaXQpIGRldmljZXMuCisgCUFkZCBuZXcgcmVzZXJ2ZWQgRExUIHR5cGVzLgorCitNb25kYXkgT2N0b2JlciAyMywgMjAwMS4gbWNyQHNhbmRlbG1hbi5vdHRhd2Eub24uY2EuIFN1bW1hcnkgZm9yIDAuNyByZWxlYXNlCisKKwlBZGRlZCBwY2FwX2ZpbmRhbGxkZXZzKCkgY2FsbCB0byBnZXQgbGlzdCBvZiBpbnRlcmZhY2VzIGluIGEgTUkgd2F5LgorCisJcGNhcF9zdGF0cygpIGhhcyBiZWVuIGRvY3VtZW50ZWQgYXMgdG8gd2hhdCBpdHMgY291bnRlcnMgbWVhbiBvbgorCWVhY2ggcGxhdGZvcm0uCisKK1R1ZXNkYXkgSmFudWFyeSA5LCAyMDAxLiBndXlAYWx1bS5taXQuZWR1LiBTdW1tYXJ5IGZvciAwLjYgcmVsZWFzZQorCisJTmV3IExpbnV4IGxpYnBjYXAgaW1wbGVtZW50YXRpb24sIHdoaWNoLCBpbiAyLjIgYW5kIGxhdGVyCisJa2VybmVscywgdXNlcyBQRl9QQUNLRVQgc29ja2V0cyBhbmQgc3VwcG9ydHMga2VybmVsIHBhY2tldAorCWZpbHRlcmluZyAoaWYgY29tcGlsZWQgaW50byB0aGUga2VybmVsKSwgYW5kIHN1cHBvcnRzIHRoZSAiYW55IgorCWRldmljZSBmb3IgY2FwdHVyaW5nIG9uIGFsbCBpbnRlcmZhY2VzLiAgQ2xlYW5zIHVwIHByb21pc2N1b3VzCisJbW9kZSBiZXR0ZXIgb24gcHJlLTIuMiBrZXJuZWxzLCBhbmQgaGFzIHZhcmlvdXMgb3RoZXIgZml4ZXMKKwkoaGFuZGxlcyAyLjQgQVJQSFJEX0lFRUU4MDJfVFIsIGhhbmRsZXMgSVNETiBkZXZpY2VzIGJldHRlciwKKwlkb2Vzbid0IHNob3cgZHVwbGljYXRlIHBhY2tldHMgb24gbG9vcGJhY2sgaW50ZXJmYWNlLCBldGMuKS4KKworCUZpeGVkIEhQLVVYIGxpYnBjYXAgaW1wbGVtZW50YXRpb24gdG8gY29ycmVjdGx5IGdldCB0aGUgUFBBIGZvcgorCWFuIGludGVyZmFjZSwgdG8gYWxsb3cgaW50ZXJmYWNlcyB0byBiZSBvcGVuZWQgYnkgaW50ZXJmYWNlIG5hbWUuCisKKwlsaWJwY2FwIHNhdmVmaWxlcyBoYXZlIHN5c3RlbS1pbmRlcGVuZGVudCBsaW5rLWxheWVyIHR5cGUgdmFsdWVzCisJaW4gdGhlIGhlYWRlciwgcmF0aGVyIHRoYW4gc29tZXRpbWVzIHBsYXRmb3JtLWRlcGVuZGVudCBETFRfCisJdmFsdWVzLCB0byBtYWtlIGl0IGVhc2llciB0byBleGNoYW5nZSBjYXB0dXJlIGZpbGVzIGJldHdlZW4KKwlkaWZmZXJlbnQgT1Nlcy4KKworCU5vbi1zdGFuZGFyZCBjYXB0dXJlIGZpbGVzIHByb2R1Y2VkIGJ5IHNvbWUgTGludXggdGNwZHVtcHMsIGUuZy4KKwl0aGUgb25lIGZyb20gUmVkIEhhdCBMaW51eCA2LjIgYW5kIGxhdGVyLCBjYW4gbm93IGJlIHJlYWQuCisKKwlVcGRhdGVkIGF1dG9jb25mIHN0b2NrIGZpbGVzLgorCisJRmlsdGVyIGV4cHJlc3Npb25zIGNhbiBmaWx0ZXIgb24gVkxBTiBJRHMgYW5kIHZhcmlvdXMgT1NJCisJcHJvdG9jb2xzLCBhbmQgd29yayBvbiBUb2tlbiBSaW5nICh3aXRoIG5vbi1zb3VyY2Utcm91dGVkCisJcGFja2V0cykuCisKKwkicGNhcF9vcGVuX2RlYWQoKSIgYWRkZWQgdG8gYWxsb3cgY29tcGlsaW5nIGZpbHRlciBleHByZXNzaW9ucworCXRvIHBjYXAgY29kZSB3aXRob3V0IG9wZW5pbmcgYSBjYXB0dXJlIGRldmljZSBvciBjYXB0dXJlIGZpbGUuCisKKwlIZWFkZXIgZmlsZXMgZml4ZWQgdG8gYWxsb3cgdXNlIGluIEMrKyBwcm9ncmFtcy4KKworCVJlbW92ZWQgZGVwZW5kYW5jeSBvbiBuYXRpdmUgaGVhZGVycyBmb3IgcGFja2V0IGxheW91dC4KKwlSZW1vdmVkIExpbnV4IHNwZWNpZmljIGhlYWRlcnMgdGhhdCB3ZXJlIHNoaXBwZWQuCisKKwlTZWN1cml0eSBmaXhlczogU3RyY3B5IHJlcGxhY2VkIHdpdGggc3RybGNweSwgc3ByaW50ZiByZXBsYWNlZAorCXdpdGggc25wcmludGYuCisKKwlGaXhlZCBidWcgdGhhdCBjb3VsZCBjYXVzZSBzdWJzZXF1ZW50ICJwY2FwX2NvbXBpbGUoKSJzIHRvIGZhaWwKKwllcnJvbmVvdXNseSBhZnRlciBvbmUgY29tcGlsZSBmYWlsZWQuCisKKwlBc3NvcnRlZCBvdGhlciBidWcgZml4ZXMuCisKKwlSRUFETUUuYWl4IGFuZCBSRUFETUUubGludXggZmlsZXMgYWRkZWQgdG8gZGVzY3JpYmUKKwlwbGF0Zm9ybS1zcGVjaWZpYyBpc3N1ZXMuCisKKwkiZ2V0aWZhZGRycygpIiByYXRoZXIgdGhhbiBTSU9DR0lGQ09ORiB1c2VkLCBpZiBhdmFpbGFibGUuCisKK3YwLjUgU2F0IEp1biAxMCAxMTowOToxNSBQRFQgMjAwMAorCitpdG9qdW5AaWlqbGFiLm5ldAorLSBCcm91Z2h0IGluIEtBTUUgSVB2Ni9JUHNlYyBicGYgY29tcGlsZXIuCistIEZpeGVzIGZvciBOZXRCU0QuCistIFN1cHBvcnQgYWRkZWQgZm9yIE9wZW5CU0QgRExUX0xPT1AgYW5kIEJTRC9PUyBETFRfQ19IRExDIChDaXNjbyBIRExDKSwKKyAgYW5kIGNoYW5nZXMgdG8gd29yayBhcm91bmQgZGlmZmVyZW50IEJTRHMgaGF2aW5nIGRpZmZlcmVudCBETFRfIHR5cGVzCisgIHdpdGggdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZS4KKworQXNzYXIgV2VzdGVybHVuZCAgPGFzc2FyQHNpY3Muc2U+CistIEJ1aWxkaW5nIG91dHNpZGUgdGhlIHNvdXJjZSBjb2RlIHRyZWUgZml4ZWQuCistIENoYW5nZWQgdG8gd3JpdGUgb3V0IHRpbWUgc3RhbXBzIHdpdGggMzItYml0IHNlY29uZHMgYW5kIG1pY3Jvc2Vjb25kcworICBmaWVsZHMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aG9zZSBmaWVsZHMgYXJlIDMyIGJpdHMgb3IgNjQgYml0cyBpbgorICB0aGUgT1MncyBuYXRpdmUgInN0cnVjdCB0aW1ldmFsIi4KKy0gQ2hhbmdlZCAicGNhcF9sb29rdXBkZXYoKSIgdG8gZHluYW1pY2FsbHkgZ3JvdyB0aGUgYnVmZmVyIGludG8gd2hpY2gKKyAgdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcyBpcyByZWFkIGFzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBob2xkIHRoZQorICBlbnRpcmUgbGlzdC4KKworR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPgorLSBBZGRlZCBhIG5ldyAicGNhcF9jb21waWxlX25vcGNhcCgpIiwgd2hpY2ggbGV0cyB5b3UgY29tcGlsZSBhIGZpbHRlcgorICBleHByZXNzaW9uIGludG8gYSBCUEYgcHJvZ3JhbSB3aXRob3V0IGhhdmluZyBhbiBvcGVuIGxpdmUgY2FwdHVyZSBvcgorICBjYXB0dXJlIGZpbGUuCisKK3YwLjQgU2F0IEp1bCAyNSAxMjo0MDowOSBQRFQgMTk5OAorCistIEZpeCBlbmRpYW4gcHJvYmxlbSB3aXRoIERMVF9OVUxMIGRldmljZXMuIEZyb20gRnJlZUJTRCB2aWEgQmlsbAorICBGZW5uZXIgKGZlbm5lckBwYXJjLnhlcm94LmNvbSkKKworLSBGaXggYWxpZ25tZW50IHByb2JsZW0gd2l0aCBGRERJIHVuZGVyIERMUEkuIFRoaXMgd2FzIGNhdXNpbmcgY29yZQorICBkdW1wcyB1bmRlciBTb2xhcmlzLgorCistIEFkZGVkIGNvbmZpZ3VyZSBvcHRpb25zIHRvIGRpc2FibGUgZmxleCBhbmQgYmlzb24uIFJlc3VsdGVkIGZyb20gYQorICBidWcgcmVwb3J0IGJ5IGJhcm5ldHRAZ3J5bW9pcmUuY3JkLmdlLmNvbSAoQnJ1Y2UgQmFybmV0dCkuIEFsc28gYWRkZWQKKyAgb3B0aW9ucyB0byBkaXNhYmxlIGdjYyBhbmQgdG8gZm9yY2UgYSBwYXJ0aWN1bGFyIHBhY2tldCBjYXB0dXJlIHR5cGUuCisKKy0gQWRkZWQgc3VwcG9ydCBmb3IgRm9yZSBBVE0gaW50ZXJmYWNlcyAocWFhIGFuZCBmYSkgdW5kZXIgSVJJWC4gVGhhbmtzCisgIHRvIEpvaG4gSGF3a2luc29uIChqaGF3a0BtaXQuZWR1KQorCistIENoYW5nZSBMaW51eCBQUFAgYW5kIFNMSVAgdG8gdXNlIERMVF9SQVcgc2luY2UgdGhlIGtlcm5lbCBkb2VzIG5vdAorICBzdXBwbHkgYW55ICJsaW5rIGxheWVyIiBkYXRhLgorCistIENoYW5nZSBMaW51eCB0byB1c2UgU0lPQ0dJRkhXQUREUiBpb2N0bCB0byBkZXRlcm1pbmUgbGluayBsYXllciB0eXBlLgorICBUaGFua3MgdG8gVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorCistIENoYW5nZSBJUklYIFBQUCB0byB1c2UgRExUX1JBVyBzaW5jZSB0aGUga2VybmVsIGRvZXMgbm90IHN1cHBseSBhbnkKKyAgImxpbmsgbGF5ZXIiIGRhdGEuCisKKy0gTW9kaWZpZWQgdG8gc3VwcG9ydCB0aGUgbmV3IEJTRC9PUyAyLjEgUFBQIGFuZCBTTElQIGxpbmsgbGF5ZXIgaGVhZGVyCisgIGZvcm1hdHMuCisKKy0gQWRkZWQgc29tZSBuZXcgU0dJIHNub29wIGludGVyZmFjZSB0eXBlcy4gVGhhbmtzIHRvIFN0ZXZlIEFsZXhhbmRlcgorICAoc2NhQHJlZnVnZWUuZW5nci5zZ2kuY29tKQorCistIEZpeGVzIGZvciBIUC1VWCAxMC4yMCAod2hpY2ggaXMgc2ltaWxhciB0byBIUC1VWCA5KS4gVGhhbmtzIHRvCisgIFJpY2hhcmQgQWxsZW4gKHJhQGhwLmlzKSBhbmQgU3RlaW5hciBIYXVnIChzdGhhdWdAbmV0aGVscC5ubykKKworLSBGZGRpIHN1cHBvcnRzIGJyb2FkY2FzdCBhcyByZXBvcnRlZCBieSBKZWZmIE1hY2RvbmFsZAorICAoamVmZkBpYWNuZXQuY29tKS4gQWxzbyBjb3JyZWN0IGllZWU4MDIgYW5kIGFyY25ldC4KKworLSBEZXRlcm1pbmUgTGludXggcGNhcCBidWZmZXIgc2l6ZSBhdCBydW4gdGltZSBvciBlbHNlIGl0IG1pZ2h0IG5vdCBiZQorICBiaWcgZW5vdWdoIGZvciBzb21lIGludGVyZmFjZSB0eXBlcyAoZS5nLiBGRERJKS4gVGhhbmtzIHRvIEplcworICBTb3JlbnNlbiAoSmVzLlNvcmVuc2VuQGNlcm4uY2gpCisKKy0gRml4IHNvbWUgbGludXggYWxpZ25tZW50IHByb2JsZW1zLgorCistIERvY3VtZW50IHByb21pc2MgYXJndW1lbnQgdG8gcGNhcF9vcGVuX2xpdmUoKS4gUmVwb3J0ZWQgYnkgSWFuIE1hcnNoCisgIChpYW5tQHNpY3Muc2UpCisKKy0gU3VwcG9ydCBNZXRyaWNvbSByYWRpbyBwYWNrZXRzIHVuZGVyIExpbnV4LiBUaGFua3MgdG8gS2V2aW4gTGFpCisgIChsYWlrQGd1bnBvd2Rlci5zdGFuZm9yZC5lZHUpCisKKy0gQmluZCB0byBpbnRlcmZhY2UgbmFtZSB1bmRlciBMaW51eCB0byBhdm9pZCBwYWNrZXRzIGZyb20gbXVsdGlwbGUKKyAgaW50ZXJmYWNlcyBvbiBtdWx0aS1ob21lZCBob3N0cy4gVGhhbmtzIHRvIEtldmluIExhaQorICAobGFpa0BndW5wb3dkZXIuc3RhbmZvcmQuZWR1KQorCistIENoYW5nZSBMX1NFVCB0byBTRUVLX1NFVCBmb3IgSFAtVVguIFRoYW5rcyB0byBSb2xhbmQgUm9iZXJ0cworICAocnJvYmVydHNAbXVsbGVyLmNvbSkKKworLSBGaXhlZCBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSByZWZlcmVuY2UgZm91bmQgYnkgS2VudCBWYW5kZXIgVmVsZGVuCisgIChncmFwaGl4QGlhc3RhdGUuZWR1KQorCistIEZpeGVkIGxleCBwYXR0ZXJuIGZvciBJRHMgdG8gYWxsb3cgbGVhZGluZyBkaWdpdHMuIEFzIHJlcG9ydGVkIGJ5CisgIFRoZW8gZGUgUmFhZHQgKGRlcmFhZHRAY3ZzLm9wZW5ic2Qub3JnKQorCistIEZpeGVkIExpbnV4IGluY2x1ZGUgZmlsZSBwcm9ibGVtcyB3aGVuIHVzaW5nIEdOVSBsaWJjLgorCistIElmZGVmIEFSUEhSRF9GRERJIHNpbmNlIG5vdCBhbGwgdmVyc2lvbnMgb2YgdGhlIExpbnV4IGtlcm5lbCBoYXZlIGl0LgorICBSZXBvcnRlZCByZXBvcnRlZCBieSBFcmljIEphY2tzY2ggKGphY2tzY2hAdGVuZWJyaXMuY2EpCisKKy0gRml4ZWQgYnVnIGluIHBjYXBfZGlzcGF0Y2goKSB0aGF0IGtlcHQgaXQgZnJvbSByZXR1cm5pbmcgb24gcGFja2V0CisgIHRpbWVvdXRzLgorCistIENoYW5nZWQgSVNMT09QQkFDSygpIG1hY3JvIHdoZW4gSUZGX0xPT1BCQUNLIGlzbid0IGF2YWlsYWJsZSB0byBjaGVjaworICBmb3IgImxvIiBmb2xsb3dlZCBieSBhbiBlb3Mgb3IgZGlnaXQgKG5ld2VyIHZlcnNpb25zIG9mIExpbnV4CisgIGFwcGFyZW50bHkgY2FsbCB0aGUgbG9vcGJhY2sgImxvIiBpbnN0ZWFkIG9mICJsbzAiKS4KKworLSBGaXhlZCBMaW51eCBuZXR3b3JraW5nIGluY2x1ZGUgZmlsZXMgdG8gdXNlIGludHMgaW5zdGVhZCBvZiBsb25ncyB0bworICBhdm9pZCBwcm9ibGVtcyB3aXRoIDY0IGJpdCBsb25ncyBvbiB0aGUgYWxwaGEuIFRoYW5rcyB0byBDcmlzdGlhbgorICBHYWZ0b24gKGdhZnRvbkByZWRoYXQuY29tKQorCit2MC4zIFNhdCBOb3YgMzAgMjA6NTY6MjcgUFNUIDE5OTYKKworLSBBZGRlZCBMaW51eCBzdXBwb3J0LgorCistIEZpeGVkIHNhdmVmaWxlIGJ1Z3MuCisKKy0gU29sYXJpcyB4ODYgZml4IGZyb20gVGltIFJ5bGFuY2UgKHQucnlsYW5jZUBlbHNldmllci5ubCkKKworLSBBZGQgc3VwcG9ydCBmb3IgYnBmIGtlcm5lbCBwb3J0IGZpbHRlcnMuCisKKy0gUmVtb3ZlIGR1cGxpY2F0ZSBhdGFsayBwcm90b2NvbCB0YWJsZSBlbnRyeS4gVGhhbmtzIHRvIENocmlzdGlhbgorICBIb3BwcyAoY2hvcHBzQHdhdGVyLmVtaWNoLmVkdSkKKworLSBGaXhlZCBwY2FwX2xvb2t1cGRldigpIHRvIGlnbm9yZSBub25leGlzdGVudCBkZXZpY2VzLiBUaGlzIHdhcworICByZXBvcnRlZCB0byBoYXBwZW4gdW5kZXIgQlNEL09TIGJ5IERhdmlkIFZpbmNlbnpldHRpCisgICh2aW5jZUBjcnlwdG9uZXQuaXQpCisKKy0gQXZvaWQgc29sYXJpcyBjb21waWxlciB3YXJuaW5ncy4gVGhhbmtzIHRvIEJydWNlIEJhcm5ldHQKKyAgKGJhcm5ldHRAZ3J5bW9pcmUuY3JkLmdlLmNvbSkKKwordjAuMi4xIFN1biBKdWwgMTQgMDM6MDI6MjYgUERUIDE5OTYKKworLSBGaXhlcyBmb3IgSFAtVVggMTAuIFRoYW5rcyBpbiBwYXJ0IHRvIHRvIFRob21hcyBXb2xmcmFtCisgICh3b2xmQHByei50dS1iZXJsaW4uZGUpIGFuZCBSaWNrIEpvbmVzIChyYWpAaHBpc3JkcS5jdXAuaHAuY29tKQorCistIEFkZGVkIHN1cHBvcnQgZm9yIFNJTklYLiBUaGFua3MgdG8gQW5kcmVqIEJvcnNlbmtvdworICAoYm9yc2Vua293Lm1za0BzbmkuZGUpCisKKy0gRml4ZXMgZm9yIEFJWCAoYWx0aG91Z2ggdGhpcyBzeXN0ZW0gaXMgbm90IHlldCBzdXBwb3J0ZWQpLiBUaGFua3MgdG8KKyAgSm9obiBIYXdraW5zb24gKGpoYXdrQG1pdC5lZHUpCisKKy0gVXNlIGF1dG9jb25mJ3MgaWRlYSBvZiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpbiBpbnN0YWxsIHRhcmdldHMuCisgIFRoYW5rcyB0byBKb2huIEhhd2tpbnNvbi4KKworLSBBZGQgbWlzc2luZyBhdXRvY29uZiBwYWNrZXQgY2FwdHVyZSByZXN1bHQgbWVzc2FnZS4gVGhhbmtzIHRvIEJpbGwKKyAgRmVubmVyIChmZW5uZXJAcGFyYy54ZXJveC5jb20pCisKKy0gRml4ZWQgcGFkZGluZyBwcm9ibGVtcyBpbiB0aGUgcGYgbW9kdWxlLgorCistIEZpeGVkIHNvbWUgbW9yZSBhbGlnbm1lbnQgcHJvYmxlbXMgb24gdGhlIGFscGhhLgorCistIEFkZGVkIGV4cGxpY2l0IG5ldG1hc2sgc3VwcG9ydC4gVGhhbmtzIHRvIFN0ZXZlIE51Y2hpYQorICAoc3RldmVAcmVzZWFyY2gub2tuZXQuY29tKQorCistIEZpeGVkIHRvIGhhbmRsZSByYXcgaXAgYWRkcmVzc2VzIHN1Y2ggYXMgMC4wLjAuMSB3aXRob3V0ICJsZWZ0CisgIGp1c3RpZmluZyIKKworLSBBZGQgInNjYSIga2V5d29yZCAoZm9yIERFQyBjbHVzdGVyIHNlcnZpY2VzKSBhcyBzdWdnZXN0ZWQgYnkgVGVycnkKKyAgS2VubmVkeSAodGVycnlAc3BjdnhhLnNwYy5lZHUpCisKKy0gQWRkICJhdGFsayIga2V5d29yZCBhcyBzdWdnZXN0ZWQgYnkgSm9obiBIYXdraW5zb24uCisKKy0gQWRkICJpZ3JwIiBrZXl3b3JkLgorCistIEZpeGVkIEhJRCBkZWZpbml0aW9uIGluIGdyYW1tYXIueSB0byBiZSBhIHN0cmluZywgbm90IGEgdmFsdWUuCisKKy0gVXNlICRDQyB3aGVuIGNoZWNraW5nIGdjYyB2ZXJzaW9uLiBUaGFua3MgdG8gQ2FybCBMaW5kYmVyZworICAoY2FybF9saW5kYmVyZ0BibGFja3NtaXRoLmNvbSkKKworLSBSZW1vdmVkIG9ic29sZXRlIHJlZmVyZW5jZSB0byBwY2FwX2ltbWVkaWF0ZSgpIGZyb20gdGhlIG1hbiBwYWdlLgorICBNaWNoYWVsIFN0b2xhcmNodWsgKG10c0B0ZXJtaW5hdG9yLnJzLml0ZC51bWljaC5lZHUpCisKKy0gRExUX05VTEwgaGFzIGEgNCBieXRlIGZhbWlseSBoZWFkZXIuIFRoYW5rcyB0byBKZWZmcmV5IEhvbmlnCisgIChqY2hAYnNkaS5jb20pCisKK3YwLjIgU3VuIEp1biAyMyAwMjoyODo0MiBQRFQgMTk5NgorCistIEFkZCBzdXBwb3J0IGZvciBIUC1VWC4gUmVzdWx0ZWQgZnJvbSBjb2RlIGNvbnRyaWJ1dGVkIGJ5IFRvbSBNdXJyYXkKKyAgKHRtdXJyYXlAaHBpbmRjay5jdXAuaHAuY29tKSBhbmQgUGhpbGlwcGUtQW5kcmkgUHJpbmRldmlsbGUKKyAgKHBoaWxpcHBAcmVzLmVuc3QuZnIpCisKKy0gVXBkYXRlIElOU1RBTEwgd2l0aCBhIHJlbWluZGVyIHRvIGluc3RhbGwgaW5jbHVkZSBmaWxlcy4gVGhhbmtzIHRvCisgIE1hcmsgQW5kcmV3cyAobWFuZHJld3NAYXcuc2dpLmNvbSkKKworLSBGaXggYnBmIGNvbXBpbGVyIGFsaWdubWVudCBidWcgb24gdGhlIGFscGhhLgorCistIFVzZSBhdXRvY29uZiB0byBkZXRlY3QgYXJjaGl0ZWN0dXJlcyB0aGF0IGNhbid0IGhhbmRsZSBtaXNhbGlnbmVkCisgIGFjY2Vzc2VzLgorCistIEFkZGVkIGxvb3BiYWNrIHN1cHBvcnQgZm9yIHNub29wLiBSZXN1bHRlZCBmcm9tIHJlcG9ydCBTdGV2ZQorICBBbGV4YW5kZXIgKHNjYUBlbmdyLnNnaS5jb20pCisKK3YwLjEgRnJpIEFwciAyOCAxODoxMTowMyBQRFQgMTk5NQorCistIEZpeGVkIGNvbXBpbGVyIGFuZCBvcHRpbWl6ZXIgYnVncy4gIFRoZSBCUEYgZmlsdGVyIGVuZ2luZSB1c2VzIHVuc2lnbmVkCisgIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB3aGlsZSB0aGUgY29kZSBnZW5lcmF0b3IgYW5kIG9wdGltaXplciBhc3N1bWVkCisgIHNpZ25lZCBzZW1hbnRpY3MgaW4gc2V2ZXJhbCBwbGFjZXMuICBUaGFua3MgdG8gQ2hhcmxpZSBTbGF0ZXIKKyAgKGNzbGF0ZXJAaW1hdGVrLmNvbSkgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgorCistIFJlbW92ZWQgRkRESSBpZmRlZidzLCB0aGV5IGFyZW4ndCByZWFsbHkgbmVlZGVkLiBSZXN1bHRlZCBmcm9tIHJlcG9ydAorICBieSBHYXJ5IFZldW0gKHZldW1AYm9hLmdzZmMubmFzYS5nb3YpLgorCistIEFkZCBwY2FwLW51bGwuYyB3aGljaCBhbGxvd3Mgb2ZmbGluZSB1c2Ugb2YgbGlicGNhcCBvbiBzeXN0ZW1zIHRoYXQKKyAgZG9uJ3Qgc3VwcG9ydCBsaXZlIHBhY2thZ2UgY2FwdHVyZS4gVGhpcyBmZWF0dXJlIHJlc3VsdGluZyBmcm9tIGEKKyAgcmVxdWVzdCBmcm9tIEphbiB2YW4gT29yc2Nob3QgKGoucC5tLnZvb3JzY2hvdEBldC50dWRlbGZ0Lm5sKS4KKworLSBNYWtlIGJwZl9jb21waWxlKCkgcmVlbnRyYW50LiBGaXggdGhhbmtzIHRvIFBhc2NhbCBIZW5uZXF1aW4KKyAgKFBhc2NhbC5IZW5uZXF1aW5AaHVnby5pbnQtZXZyeS5mcikuCisKKy0gUG9ydCB0byBHTlUgYXV0b2NvbmYuCisKKy0gRml4IHBjYXAtZGxwaS5jIHRvIHdvcmsgd2l0aCBpc2RuLiBSZXN1bHRlZCBmcm9tIHJlcG9ydCBieSBGbGVtbWluZworICBKb2hhbnNlbiAoZnNqQGNzZC5jcmkuZGspLgorCistIEhhbmRsZSBtdWx0aS1kaWdpdCBpbnRlcmZhY2UgdW5pdCBudW1iZXJzIChha2EgcHBhJ3MpIHVuZGVyIGRscGkuCisgIFJlc3VsdGVkIGZyb20gcmVwb3J0IGJ5IERhbmllbCBFaHJsaWNoIChlaHJsaWNoQGNzZS5wc3UuZWR1KS4KKworLSBGaXggcGNhcC1kbHBpLmMgdG8gd29yayBpbiBub24tcHJvbWlzY3VvdXMgbW9kZS4gUmVzdWx0ZWQgZnJvbSByZXBvcnQKKyAgYnkgSmVmZiBNdXJwaHkgKGpjbXVycGh5QGFjc3UuYnVmZmFsby5lZHUpLgorCistIEFkZCBzdXBwb3J0IGZvciAibG9uZyBqdW1wcyIuIFRoYW5rcyB0byBKZWZmcmV5IE1vZ3VsCisgIChtb2d1bEBwYS5kZWMuY29tKS4KKworLSBGaXggbWlub3IgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgd2l0aCBCREVCVUcgYXMgbm90aWNlZCBieSBTY290dAorICBCZXJ0aWxzb24gKHNjb3R0QHVuZXQudW1uLmVkdSkuCisKKy0gRGVjbGFyZSBzeXNfZXJybGlzdCAiY29uc3QgY2hhciAqY29uc3QiIHRvIGF2b2lkIHByb2JsZW1zIHVuZGVyCisgIEZyZWVCU0QuIFJlc3VsdGVkIGZyb20gcmVwb3J0IGJ5IGpoZXJAZWRlbi5jb20uCisKK3YwLjAuNiBGcmkgQXByIDI4IDA0OjA3OjEzIFBEVCAxOTk1CisKKy0gQWRkIG1pc3NpbmcgdmFyaWFibGUgZGVjbGFyYXRpb24gbWlzc2luZyBmcm9tIDAuMC42CisKK3YwLjAuNSBGcmkgQXByIDI4IDAwOjIyOjIxIFBEVCAxOTk1CisKKy0gV29ya2Fyb3VuZCBmb3IgcHJvYmxlbXMgd2hlbiBwY2FwX3JlYWQoKSByZXR1cm5zIDAgZHVlIHRvIHRoZSB0aW1lb3V0CisgIGV4cGlyaW5nLgorCit2MC4wLjQgVGh1IEFwciAyMCAyMDo0MTo0OCBQRFQgMTk5NQorCistIENoYW5nZSBjb25maWd1cmF0aW9uIHRvIG5vdCB1c2UgZ2NjIHYyIGZsYWdzIHdpdGggZ2NjIHYxLgorCistIEZpeGVkIGEgYnVnIGluIHBjYXBfbmV4dCgpOyBpZiBwY2FwX2Rpc3BhdGNoKCkgcmV0dXJucyAwLCBwY2FwX25leHQoKQorICBzaG91bGQgYWxzbyByZXR1cm4gMC4gVGhhbmtzIHRvIFJpY2hhcmQgU3RldmVucyAocnN0ZXZlbnNAbm9hby5lZHUpLgorCistIEZpeGVkIGNvbmZpZ3VyZSB0byB0ZXN0IGZvciBzbm9vcCBiZWZvcmUgZGxwaSB0byBhdm9pZCBwcm9ibGVtcyB1bmRlcgorICBJUklYIDUuIFRoYW5rcyB0byBKLiBFcmljIFRvd25zZW5kIChqZXRAYWJ1bGFmaWEuZ2VubWFnaWMuY29tKS4KKworLSBIYWNrIGFyb3VuZCBkZWZpY2llbmN5IGluIFVsdHJpeCdzIG1ha2UuCisKKy0gRml4IHR3byBidWdzIHJlbGF0ZWQgdG8gdGhlIFNvbGFyaXMgcHJlLTUuMy4yIGJ1Zm1vZCBidWc7IGhhbmRsZQorICBzYXZlZmlsZXMgdGhhdCBoYXZlIG1vcmUgdGhhbiBzbmFwc2hvdCBieXRlcyBvZiBkYXRhIGluIHRoZW0gKHNvIHdlCisgIGNhbiByZWFkIG9sZCBzYXZlZmlsZXMpIGFuZCBhdm9pZCB3cml0aW5nIHN1Y2ggZmlsZXMuCisKKy0gQWRkZWQgY2hlY2tpb2N0bCB3aGljaCBpcyB1c2VkIHdpdGggZ2NjIHRvIGNoZWNrIHRoYXQgdGhlCisgICJmaXhpbmNsdWRlcyIgc2NyaXB0IGhhcyBiZWVuIHJ1bi4KKwordjAuMC4zIFR1ZSBPY3QgMTggMTg6MTM6NDYgUERUIDE5OTQKKworLSBGaXhlZCBjb25maWd1cmUgdG8gdGVzdCBmb3Igc25vb3AgYmVmb3JlIGRscGkgdG8gYXZvaWQgcHJvYmxlbXMgdW5kZXIKKyAgSVJJWCA1LiBUaGFua3MgdG8gSi4gRXJpYyBUb3duc2VuZCAoamV0QGFidWxhZmlhLmdlbm1hZ2ljLmNvbSkuCisKK3YwLjAuMiBXZWQgT2N0IDEyIDIwOjU2OjM3IFBEVCAxOTk0CisKKy0gSW1wbGVtZW50IHRpbWVvdXQgaW4gdGhlIGRscGkgcGNhcF9vcGVuX2xpdmUoKS4gVGhhbmtzIHRvIFJpY2hhcmQKKyAgU3RldmVucy4KKworLSBEZXRlcm1pbmUgcGNhcCBsaW5rIHR5cGUgZnJvbSBkbHBpIG1lZGlhIHR5cGUuIFJlc3VsdGVkIGZyb20gcmVwb3J0CisgIGJ5IE1haGVzaCBKZXRoYW5hbmRhbmkgKG1haGVzaEBucGl4LmNvbSkuCisKK3YwLjAuMSBGcmkgSnVuIDI0IDE0OjUwOjU3IFBEVCAxOTk0CisKKy0gRml4ZWQgYnVnIGluIG5pdF9zZXRmbGFncygpIGluIHBjYXAtc25pdC5jLiBUaGUgc3RyZWFtcyBpb2N0bCB0aW1lb3V0CisgIHdhc24ndCBiZWluZyBpbml0aWFsaXplZCBzb21ldGltZXMgcmVzdWx0aW5nIGluIGFuICJOSU9DU0ZMQUdTOgorICBJbnZhbGlkIGFyZ3VtZW50IiBlcnJvciB1bmRlciBPU0YvMS4gUmVwb3J0ZWQgYnkgTWF0dCBEYXkKKyAgKG1kYXlAYXJ0aXNvZnQuY29tKSBhbmQgRGFubnkgTWl0emVsIChkbWl0emVsQHdoaXRuZXkuaGl0Yy5jb20pLgorCistIFR1cm4gb24gRkRESSBzdXBwb3J0IGJ5IGRlZmF1bHQuCisKK3YwLjAgTW9uIEp1biAyMCAxOToyMDoxNiBQRFQgMTk5NAorCistIEluaXRpYWwgcmVsZWFzZS4KKworLSBGaXhlZCBidWcgd2l0aCBncmVhdGVyL2xlc3Mga2V5d29yZHMsIHJlcG9ydGVkIGJ5IE1hcmsgQW5kcmV3cworICAobWFuZHJld3NAYWxpYXMuY29tKS4KKworLSBGaXggYnVnIHdoZXJlICd8JyB3YXMgZGVmaW5lZCBhcyBCUEZfQU5EIGluc3RlYWQgb2YgQlBGX09SLCByZXBvcnRlZAorICBieSBFbGFuIEFtaXIgKGVsYW5AbGVlYi5jcy5iZXJrZWxleS5lZHUpLgorCistIE1hY2hpbmVzIHdpdGggbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyaW5nIGFyZSBzdXBwb3J0ZWQgdGhhbmtzIHRvCisgIEplZmYgTW9ndWwuCisKKy0gQWRkIGhhY2sgZm9yIHZlcnNpb24gMi4zIHNhdmVmaWxlcyB3aGljaCBkb24ndCBoYXZlIGNhcGxlbiBhbmQgbGVuCisgIHN3YXBwZWQgdGhhbmtzIHRvIFZlcm4gUGF4c29uLgorCistIEFkZGVkICImJiIgYW5kICJ8fCIgYWxpYXNlcyBmb3IgImFuZCIgYW5kICJvciIgdGhhbmtzIHRvIFZlcm4gUGF4c29uLgorCistIEFkZGVkIGxlbmd0aCwgaW5ib3VuZCBhbmQgb3V0Ym91bmQga2V5d29yZHMuCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL0NSRURJVFMgYi9saWJwY2FwLTEuMy4wL0NSRURJVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlODRiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvQ1JFRElUUwpAQCAtMCwwICsxLDE1NSBAQAorVGhpcyBmaWxlIGxpc3RzIHBlb3BsZSB3aG8gaGF2ZSBjb250cmlidXRlZCB0byBsaWJwY2FwOgorCitUaGUgY3VycmVudCBtYWludGFpbmVyczoKKyAgICBCaWxsIEZlbm5lciAgICAgICAgICAgICAgICAgICA8ZmVubmVyIGF0IHJlc2VhcmNoIGRvdCBhdHQgZG90IGNvbT4KKyAgICBGdWx2aW8gUmlzc28gICAgICAgICAgICAgICAgICA8cmlzc28gYXQgcG9saXRvIGRvdCBpdD4KKyAgICBHdXkgSGFycmlzICAgICAgICAgICAgICAgICAgICA8Z3V5IGF0IGFsdW0gZG90IG1pdCBkb3QgZWR1PgorICAgIEhhbm5lcyBHcmVkbGVyICAgICAgICAgICAgICAgIDxoYW5uZXMgYXQganVuaXBlciBkb3QgbmV0PgorICAgIE1pY2hhZWwgUmljaGFyZHNvbiAgICAgICAgICAgIDxtY3IgYXQgc2FuZGVsbWFuIGRvdCBvdHRhd2EgZG90IG9uIGRvdCBjYT4KKworQWRkaXRpb25hbCBwZW9wbGUgd2hvIGhhdmUgY29udHJpYnV0ZWQgcGF0Y2hlczoKKworICAgIEFsYW4gQmF3ZGVuICAgICAgICAgICAgICAgICAgIDxBbGFuIGF0IExDUyBkb3QgTUlUIGRvdCBFRFU+CisgICAgQWxiZXJ0IENoaW4gICAgICAgICAgICAgICAgICAgPGNoaW5hIGF0IHRoZXdyaXR0ZW53b3JkIGRvdCBjb20+CisgICAgQWxleGFuZGVyICdMZW8nIEJlcmdvbHRoICAgICAgPExlbyBkb3QgQmVyZ29sdGggYXQgd3Utd2llbiBkb3QgYWMgZG90IGF0PgorICAgIEFsZXhleSBLdXpuZXRzb3YgICAgICAgICAgICAgIDxrdXpuZXQgYXQgbXMyIGRvdCBpbnIgZG90IGFjIGRvdCBydT4KKyAgICBBbG9uIEJhci1MZXYgICAgICAgICAgICAgICAgICA8YWxvbmJsIGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgQW5kcmV3IEJyb3duICAgICAgICAgICAgICAgICAgPGF0YXRhdCBhdCBhdGF0ZG90IGRvdCBuZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFuZHktMSBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIEFudHRpIEthbnRlZSAgICAgICAgICAgICAgICAgIDxwb29rYSBhdCBuZXRic2QgZG90IG9yZz4KKyAgICBBcmllbiBWaWpuICAgICAgICAgICAgICAgICAgICA8YXJpZW52aWpuIGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgQXJrYWRpdXN6IE1pc2tpZXdpY3ogICAgICAgICAgPG1pc2llayBhdCBwbGQgZG90IG9yZyBkb3QgcGw+CisgICAgQXJtYW5kbyBMLiBDYXJvIEpyLiAgICAgICAgICAgPGFjYXJvIGF0IG1haWwgZG90IGVlY2lzIGRvdCB1ZGVsIGRvdCBlZHU+CisgICAgQXNzYXIgV2VzdGVybHVuZCAgICAgICAgICAgICAgPGFzc2FyIGF0IHNpY3MgZG90IHNlPgorICAgIEJyaWFuIEdpbnNiYWNoICAgICAgICAgICAgICAgIDxnaW5zYmFjaCBhdCBjcmF5IGRvdCBjb20+CisgICAgQ2hhcmxlcyBNLiBIYW5udW0gICAgICAgICAgICAgPG15Y3JvZnQgYXQgbmV0YnNkIGRvdCBvcmc+CisgICAgQ2hyaXMgRy4gRGVtZXRyaW91ICAgICAgICAgICAgPGNnZCBhdCBuZXRic2QgZG90IG9yZz4KKyAgICBDaHJpcyBMaWdodGZvb3QgICAgICAgICAgICAgICA8Y3dybCBhdCB1c2VycyBkb3Qgc291cmNlZm9yZ2UgZG90IG5ldD4KKyAgICBDaHJpcyBNYXluYXJkICAgICAgICAgICAgICAgICA8Q2hyaXMgZG90IE1heW5hcmQgYXQgZ3RlY2ggZG90IGNvbT4KKyAgICBDaHJpcyBQZXBwZXIgICAgICAgICAgICAgICAgICA8cGVwcGVyIGF0IG1haWwgZG90IHJlcHBlcCBkb3QgY29tPgorICAgIENocmlzdGlhbiBCZWxsICAgICAgICAgICAgICAgIDxjc2JlbGwgYXQgbXlyaSBkb3QgY29tPgorICAgIENocmlzdGlhbiBQZXJvbiAgICAgICAgICAgICAgIDxjc2pwIGF0IGZyZWVic2QgZG90IG9yZz4KKyAgICBEYW5pZWxlIE9ybGFuZGkgICAgICAgICAgICAgICA8ZGFuaWVsZSBhdCBvcmxhbmRpIGRvdCBjb20+CisgICAgRGFycmVuIFJlZWQgICAgICAgICAgICAgICAgICAgPGRhcnJlbnIgYXQgc3VuIGRvdCBjb20+CisgICAgRGF2aWQgS2FlbGJsaW5nICAgICAgICAgICAgICAgPGRyayBhdCBzZ2kgZG90IGNvbT4KKyAgICBEYXZpZCBZb3VuZyAgICAgICAgICAgICAgICAgICA8ZHlvdW5nIGF0IG9qY3RlY2ggZG90IGNvbT4KKyAgICBEZWFuIEdhdWRldCAgICAgICAgICAgICAgICAgICA8ZGVhbiBhdCBhcmN0aWMgZG90IG9yZz4KKyAgICBkaHJ1diAgICAgICAgICAgICAgICAgICAgICAgICA8cnNyaXZhdCBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIERvbiBFYnJpZ2h0ICAgICAgICAgICAgICAgICAgIDxEb24gZG90IEVicmlnaHQgYXQgY29tcHV3YXJlIGRvdCBjb20+IAorICAgIER1ZyBTb25nICAgICAgICAgICAgICAgICAgICAgIDxkdWdzb25nIGF0IG1vbmtleSBkb3Qgb3JnPgorICAgIER1c3RpbiBTcGljdXp6YSAgICAgICAgICAgICAgIDxkdXN0aW4gYXQgdmlydHVhbHJvYWRzaWRlIGRvdCBjb20+CisgICAgRXJpYyBBbmRlcnNvbiAgICAgICAgICAgICAgICAgPGFuZGVyc2UgYXQgaHBsIGRvdCBocCBkb3QgY29tPgorICAgIEVyaWsgZGUgQ2FzdHJvIExvcG8gICAgICAgICAgIDxlcmlrIGRvdCBkZSBkb3QgY2FzdHJvIGRvdCBsb3BvIGF0IHNlbnNvcnluZXR3b3JrcyBkb3QgY29tPgorICAgIEZlbGl4IE9iZW5odWJlciAgICAgICAgICAgICAgIDxmZWxpeCBhdCBvYmVuaHViZXIgZG90IGRlPgorICAgIEZsb3JlbnQgRHJvdWluICAgICAgICAgICAgICAgIDxGbG9yZW50IGRvdCBEcm91aW4gYXQgYWxjYXRlbC1sdWNlbnQgZG90IGZyPgorICAgIEZyYW56IFNjaGFlZmVyICAgICAgICAgICAgICAgIDxzY2hhZWZlciBhdCBtb25kIGRvdCBhdD4KKyAgICBmcmVkZXJpY2ggICAgICAgICAgICAgICAgICAgICA8ZnJlZGVyaWNoIGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgRnVsa28gSGV3ICAgICAgICAgICAgICAgICAgICAgPGZ1bGtvIGRvdCBoZXcgYXQgZ21haWwgZG90IGNvbT4KKyAgICBGdW1peXVraSBTaGltaXp1ICAgICAgICAgICAgICA8ZnVtaWZ1bWkgYXQgYWJhY3VzdGVjaCBkb3QganA+CisgICAgR2FycmV0dCBDb29wZXIgICAgICAgICAgICAgICAgPHlhYmVyYXVuZXlhIGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgR2lhbmx1Y2EgVmFyZW5uaSAgICAgICAgICAgICAgPGdpYW5sdWNhIGRvdCB2YXJlbm5pIGF0IGdtYWlsIGRvdCBjb20+CisgICAgR2lsYmVydCBIb3llayAgICAgICAgICAgICAgICAgPGdpbF9ob3llayBhdCBob3RtYWlsIGRvdCBjb20+CisgICAgR2lzbGUgVmFuZW0gICAgICAgICAgICAgICAgICAgPGd2YW5lbSBhdCBicm9hZHBhcmsgZG90IG5vPgorICAgIEdyYWVtZSBIZXdzb24gICAgICAgICAgICAgICAgIDxnaGV3c29uIGF0IGNpeCBkb3QgY29tcHVsaW5rIGRvdCBjbyBkb3QgdWs+CisgICAgR3JlZyBTdGFyayAgICAgICAgICAgICAgICAgICAgPGdzc3RhcmsgYXQgbWl0IGRvdCBlZHU+CisgICAgR3JlZyBUcm94ZWwgICAgICAgICAgICAgICAgICAgPGdkdCBhdCBpciBkb3QgYmJuIGRvdCBjb20+CisgICAgR3JlZ29yIE1haWVyICAgICAgICAgICAgICAgICAgPGdyZWdvciBhdCBuZXQgZG90IGluIGRvdCB0dW0gZG90IGRlPgorICAgIEd1aWxsYXVtZSBQZWxhdCAgICAgICAgICAgICAgIDxlbmR5bWlvbl8gYXQgdXNlcnMgZG90IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgSGFnZW4gUGF1bCBQZmVpZmVyICAgICAgICAgICAgPGhhZ2VuIGF0IGphdXUgZG90IG5ldD4KKyAgICBIZW5yaSBEb3JlYXUgICAgICAgICAgICAgICAgICA8aGRvcmVhdSBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIEh5dW5nIFNpayBZb29uICAgICAgICAgICAgICAgIDxoc3luIGF0IGtyIGRvdCBpYm0gZG90IGNvbT4KKyAgICBJZ29yIEtocmlzdG9waG9yb3YgICAgICAgICAgICA8aWdvciBhdCBhdGRvdCBkb3Qgb3JnPgorICAgIEphbi1QaGlsaXAgVmVsZGVycyAgICAgICAgICAgIDxqcHYgYXQgdmVsZGVyc2plcyBkb3QgbmV0PgorICAgIEphc29uIFIuIFRob3JwZSAgICAgICAgICAgICAgIDx0aG9ycGVqIGF0IG5ldGJzZCBkb3Qgb3JnPgorICAgIEphdmllciBBY2hpcmljYSAgICAgICAgICAgICAgIDxhY2hpcmljYSBhdCB0dGQgZG90IG5ldD4KKyAgICBKZWFuIFRvdXJyaWxoZXMgICAgICAgICAgICAgICA8anQgYXQgaHBsIGRvdCBocCBkb3QgY29tPgorICAgIEplYW4tTG91aXMgQ2hhcnRvbiAgICAgICAgICAgIDxKZWFuLUxvdWlzLkNIQVJUT04gYXQgb2lraWFsb2cgZG90IGNvbT4KKyAgICBKZWZmZXJzb24gT2dhdGEgICAgICAgICAgICAgICA8am9nYXRhIGF0IG5vZGMgZG90IG5vYWEgZG90IGdvdj4KKyAgICBKZXNwZXIgRGFuZ2FhcmQgQnJvdWVyICAgICAgICA8aGF3ayBhdCBjb214IGRvdCBkaz4KKyAgICBKZXNwZXIgUGV0ZXJzb24gICAgICAgICAgICAgICA8amVzcGVyIGF0IGVuZGFjZSBkb3QgY29tPgorICAgIEpvZXJnIE1heWVyICAgICAgICAgICAgICAgICAgIDxqbWF5ZXIgYXQgbG9wbG9mIGRvdCBkZT4KKyAgICBKb2huIEJhbmtpZXIgICAgICAgICAgICAgICAgICA8amJhbmtpZXIgYXQgcmFpbmZpbml0eSBkb3QgY29tPgorICAgIEpvbiBMaW5kZ3JlbiAgICAgICAgICAgICAgICAgIDxqb25sIGF0IHl1Ynl1YiBkb3QgbmV0PgorICAgIEpvbiBTbWlybCAgICAgICAgICAgICAgICAgICAgIDxqb25zbWlybCBhdCBnbWFpbCBkb3QgY29tPgorICAgIEp1ZXJnZW4gU2Nob2Vud2FlbGRlciAgICAgICAgIDxzY2hvZW53IGF0IGliciBkb3QgY3MgZG90IHR1LWJzIGRvdCBkZT4KKyAgICBKdWxpZW4gTW91dGluaG8gICAgICAgICAgICAgICA8anVsbSBhdCBzYXZpbmVzIGRvdCBhbHBlcyBkb3QgZnIgZG90IGV1IGRvdCBvcmc+CisgICAgSnVuZy11ayBLaW0gICAgICAgICAgICAgICAgICAgPGpraW0gYXQgRnJlZUJTRCBkb3Qgb3JnPgorICAgIEthenVzaGkgU3VneW8gICAgICAgICAgICAgICAgIDxzdWd5byBhdCBwYiBkb3QganAgZG90IG5lYyBkb3QgY29tPgorICAgIEtsYXVzIEtsZWluICAgICAgICAgICAgICAgICAgIDxrbGVpbmsgYXQgbmV0YnNkIGRvdCBvcmc+CisgICAgS29yeW4gR3JhbnQgICAgICAgICAgICAgICAgICAgPGtvcnluIGF0IGVuZGFjZSBkb3QgY29tPgorICAgIEtyaXMgS2F0dGVyam9obiAgICAgICAgICAgICAgIDxrYXR0ZXJqb2huIGF0IGdtYWlsIGRvdCBjb20+CisgICAgS3J6eXN6dG9mIEhhbGFzYSAgICAgICAgICAgICAgPGtoYyBhdCBwbSBkb3Qgd2F3IGRvdCBwbD4KKyAgICBMb3JlbnpvIENhdmFsbGFybyAgICAgICAgICAgICA8c3VsbGl2YW4gYXQgc2lrdXJlenphIGRvdCBvcmc+CisgICAgTG9yaXMgRGVnaW9hbm5pICAgICAgICAgICAgICAgPGxvcmlzIGF0IG5ldGdyb3VwLXNlcnYgZG90IHBvbGl0byBkb3QgaXQ+CisgICAgTG92ZSBIw7ZybnF1aXN0LcOFc3RyYW5kICAgICAgICA8bGhhIGF0IHN0YWNrZW4gZG90IGt0aCBkb3Qgc2U+CisgICAgTHVpcyBNYXJ0aW5HYXJjaWEgICAgICAgICAgICAgPGx1aXMgZG90IG1nYXJjIGF0IGdtYWlsIGRvdCBjb20+CisgICAgTWFjaWVqIFcuIFJvenlja2kgICAgICAgICAgICAgPG1hY3JvIGF0IGRzMiBkb3QgcGcgZG90IGdkYSBkb3QgcGw+CisgICAgTWFyY3VzIEZlbGlwZSBQZXJlaXJhICAgICAgICAgPG1hcmN1cyBhdCB0YXNrIGRvdCBjb20gZG90IGJyPgorICAgIE1hcmsgQy4gQnJvd24gICAgICAgICAgICAgICAgIDxtYnJvd24gYXQgaHAgZG90IGNvbT4KKyAgICBNYXJrIFBpenpvbGF0byAgICAgICAgICAgICAgICA8TGlzdC10Y3BkdW1wLXdvcmtlcnMgYXQgc3Vic2NyaXB0aW9ucyBkb3QgcGl6em9sYXRvIGRvdCBuZXQ+CisgICAgTWFya3VzIE1heWVyICAgICAgICAgICAgICAgICAgPG1hcmt1c19tYXllciBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIE1hcnRpbiBIdXNlbWFubiAgICAgICAgICAgICAgIDxtYXJ0aW4gYXQgbmV0YnNkIGRvdCBvcmc+CisgICAgTcOhcnRvbiBOw6ltZXRoICAgICAgICAgICAgICAgICA8bm0xMjcgYXQgZnJlZW1haWwgZG90IGh1PgorICAgIE1hdHRoZXcgTHVja2llICAgICAgICAgICAgICAgIDxtamwgYXQgbHVja2llIGRvdCBvcmcgZG90IG56PgorICAgIE1heCBMYWllciAgICAgICAgICAgICAgICAgICAgIDxtYXggYXQgbG92ZTJwYXJ0eSBkb3QgbmV0PgorICAgIE1pa2UgRnJ5c2luZ2VyICAgICAgICAgICAgICAgIDx2YXBpZXIgYXQgZ21haWwgZG90IGNvbT4KKyAgICBNaWtlIEtlcnNoYXcgICAgICAgICAgICAgICAgICA8ZHJhZ29ybiBhdCBraXNtZXR3aXJlbGVzcyBkb3QgbmV0PgorICAgIE1pa2UgV2lhY2VrICAgICAgICAgICAgICAgICAgIDxtaWtlIGF0IGlyb290IGRvdCBuZXQ+CisgICAgTWlyb3NsYXYgTGljaHZhciAgICAgICAgICAgICAgPG1saWNodmFyIGF0IHJlZGhhdCBkb3QgY29tPgorICAgIE1vbnJvZSBXaWxsaWFtcyAgICAgICAgICAgICAgIDxtb25yb2UgYXQgcG9ib3ggZG90IGNvbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bnZlcmNhbW0gYXQgc291cmNlZm9yZ2UgZG90IG5ldD4KKyAgICBOLiBMZWl0ZW4gICAgICAgICAgICAgICAgICAgICA8bmxlaXRlbiBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIE5pY29sYXMgRGFkZSAgICAgICAgICAgICAgICAgIDxuZGFkZSBhdCBuc2QgZG90IGR5bmRucyBkb3Qgb3JnPgorICAgIE9jdGF2aWFuIENlcm5hICAgICAgICAgICAgICAgIDx0YXZ5IGF0IHlsYWJzIGRvdCBjb20+CisgICAgT2xhZiBLaXJjaCAgICAgICAgICAgICAgICAgICAgPG9raXIgYXQgY2FsZGVyYSBkb3QgZGU+CisgICAgT2xsaWUgV2lsZCAgICAgICAgICAgICAgICAgICAgPGFhdyBhdCB1c2VycyBkb3Qgc291cmNlZm9yZ2UgZG90IG5ldD4KKyAgICBPbm5vIHZhbiBkZXIgTGluZGVuICAgICAgICAgICA8b25ubyBhdCBzaW1wbGV4IGRvdCBubD4KKyAgICBQYW9sbyBBYmVuaSAgICAgICAgICAgICAgICAgICA8cGFvbG8gZG90IGFiZW5pIGF0IGVtYWlsIGRvdCBpdD4KKyAgICBQYXRyaWNrIE1hcmllICAgICAgICAgICAgICAgICA8bXljcm9mdCBhdCB2aXJnYXJpYSBkb3Qgb3JnPgorICAgIFBhdHJpY2sgTWNIYXJkeSAgICAgICAgICAgICAgIDxrYWJlciBhdCB0cmFzaCBub3QgbmV0PgorICAgIFBhdWwgTXVuZHQgICAgICAgICAgICAgICAgICAgIDxsZXRoYWwgYXQgbGludXgtc2ggZG90IG9yZz4KKyAgICBQYXZlbCBLYW5rb3Zza3kgICAgICAgICAgICAgICA8a2FuIGF0IGRjaXQgZG90IGN6PgorICAgIFBhd2VsIFBva3J5d2thICAgICAgICAgICAgICAgIDxwdWJsaWNwcCBhdCBnbWFpbCBkb3QgY29tPgorICAgIFBldGVyIEZhbGVzICAgICAgICAgICAgICAgICAgIDxwZXRlciBhdCBmYWxlcy1sb3JlbnogZG90IG5ldD4KKyAgICBQZXRlciBKZXJlbXkgICAgICAgICAgICAgICAgICA8cGV0ZXIgZG90IGplcmVteSBhdCBhbGNhdGVsIGRvdCBjb20gZG90IGF1PgorICAgIFBldGVyIFZvbGtvdiAgICAgICAgICAgICAgICAgIDxwdmEgYXQgZ2VudG9vIGRvdCBvcmc+CisgICAgUGhpbCBXb29kICAgICAgICAgICAgICAgICAgICAgPGNwdyBhdCBsYW5sIGRvdCBnb3Y+CisgICAgUmFmYWwgTWFzemtvd3NraSAgICAgICAgICAgICAgPHJ6bSBhdCBpY20gZG90IGVkdSBkb3QgcGw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJjYi1pc2lzIGF0IHVzZXJzIGRvdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIFJpY2hhcmQgU3RlYXJuICAgICAgICAgICAgICAgIDxyaWNoYXJkIGF0IHJucy1zdGVhcm4gZG90IGRlbW9uIGRvdCBjbyBkb3QgdWs+CisgICAgUmljayBKb25lcyAgICAgICAgICAgICAgICAgICAgPHJhaiBhdCBjdXAgZG90IGhwIGRvdCBjb20+CisgICAgUm9iZXJ0IEVkbW9uZHMgICAgICAgICAgICAgICAgPHN0dS00MiBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIFJvYmVydG8gTWFyaWFuaSAgICAgICAgICAgICAgIDxqZWxvdC10Y3BkdW1wIGF0IGplbG90IGRvdCBpdD4KKyAgICBSb21haW4gRnJhbmNvaXNlICAgICAgICAgICAgICA8cmZyYW5jb2lzZSBhdCBkZWJpYW4gZG90IG9yZz4KKyAgICBTYWd1biBTaGFreWEgICAgICAgICAgICAgICAgICA8c2FndW4gZG90IHNoYWt5YSBhdCBzdW4gZG90IGNvbT4KKyAgICBTY290dCBCYXJyb24gICAgICAgICAgICAgICAgICA8c2IxMjU0OTkgYXQgb2hpb3UgZG90IGVkdT4KKyAgICBTY290dCBHaWZmb3JkICAgICAgICAgICAgICAgICA8c2dpZmZvcmQgYXQgdGlyIGRvdCBjb20+CisgICAgU2NvdHQgTWNtaWxsYW4gICAgICAgICAgICAgICAgPHNjb3R0IGRvdCBhIGRvdCBtY21pbGxhbiBhdCBpbnRlbCBkb3QgY29tPgorICAgIFNlYmFzdGlhbiBLcmFobWVyICAgICAgICAgICAgIDxrcmFobWVyIGF0IGNzIGRvdCB1bmktcG90c2RhbSBkb3QgZGU+CisgICAgU2ViYXN0aWVuIFJveSAgICAgICAgICAgICAgICAgPFNlYmFzdGllbiBkb3QgUm95IGF0IFN1biBkb3QgQ09NPgorICAgIFNlcGhlcm9zYSBaaWVoYXUgICAgICAgICAgICAgIDxzZXBoZXJvc2EgYXQgZ21haWwgZG90IGNvbT4KKyAgICBTaGF1biBDbG93ZXMgICAgICAgICAgICAgICAgICA8ZGVsaXVzIGF0IHByb2dzb2MgZG90IHV0cyBkb3QgZWR1IGRvdCBhdT4KKyAgICBTb2xvbW9uIFBlYWNoeSAgICAgICAgICAgICAgICA8cGl6emEgYXQgc2hhZnRuZXQgZG90IG9yZz4KKyAgICBTdGVmYW4gSHVkc29uICAgICAgICAgICAgICAgICA8aHVkc29uIGF0IG1iYXkgZG90IG5ldD4KKyAgICBTdGVwaGVuIERvbm5lbGx5ICAgICAgICAgICAgICA8c3RlcGhlbiBhdCBlbmRhY2UgZG90IGNvbT4KKyAgICBUYWthc2hpIFlhbWFtb3RvICAgICAgICAgICAgICA8eWFtdCBhdCBtd2QgZG90IGJpZ2xvYmUgZG90IG5lIGRvdCBqcD4KKyAgICBUYW5ha2EgU2hpbi15YSAgICAgICAgICAgICAgICA8enN0YW5ha2EgYXQgYXJjaGVyIGRvdCBsaXZlZG9vciBkb3QgY29tPgorICAgIFRvYmlhcyBQb3NjaHdhdHRhICAgICAgICAgICAgIDxwb3NjaCBhdCBzb3VyY2Vmb3JnZSBkb3QgbmV0PgorICAgIFRvbnkgTGkgICAgICAgICAgICAgICAgICAgICAgIDx0bGkgYXQgcHJvY2tldCBkb3QgY29tPgorICAgIFRvcnN0ZW4gTGFuZHNjaG9mZiAgICAgICAgICAgIDx0b3JzdGVuIGF0IGRlYmlhbiBkb3Qgb3JnPgorICAgIFVucyBMaWRlciAgICAgICAgICAgICAgICAgICAgIDx1bnNsaWRlciBhdCBtaXJhbmRhIGRvdCBvcmc+CisgICAgVXdlIEdpcmxpY2ggICAgICAgICAgICAgICAgICAgPFV3ZSBkb3QgR2lybGljaCBhdCBwaGlsb3N5cyBkb3QgZGU+CisgICAgV2VzbGV5IFNoaWVsZHMgICAgICAgICAgICAgICAgPHd4cyBhdCBGcmVlQlNEIGRvdCBvcmc+CisgICAgWGlhbmppZSBaaGFuZyAgICAgICAgICAgICAgICAgPHh6aGFuZyBhdCBjdXAgZG90IGhwIGRvdCBjb20+CisgICAgWGluIExpICAgICAgICAgICAgICAgICAgICAgICAgPGRlbHBoaWogYXQgRnJlZUJTRCBkb3Qgb3JnPgorICAgIFllbiBZZW4gTGltCisgICAgWXZhbiBWYW5odWxsZWJ1cyAgICAgICAgICAgICAgPHZhbmh1IGF0IHNvdXJjZWZvcmdlIGRvdCBuZXQ+CisgICAgWW9hbm4gVmFuZG9vcnNlbGFlcmUgICAgICAgICAgPHlvYW5uIGF0IHByZWx1ZGUtaWRzIGRvdCBvcmc+CisKK1RoZSBvcmlnaW5hbCBMQkwgY3JldzoKKyAgICBTdGV2ZSBNY0Nhbm5lCisgICAgQ3JhaWcgTGVyZXMKKyAgICBWYW4gSmFjb2Jzb24KKworUGFzdCBtYWludGFpbmVyczoKKyAgICBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gICAgICAgICA8aXRvanVuIGF0IGlpamxhYiBkb3QgbmV0PgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9DaG1vZEJQRi9DaG1vZEJQRiBiL2xpYnBjYXAtMS4zLjAvQ2htb2RCUEYvQ2htb2RCUEYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWUzNzEyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvQ2htb2RCUEYvQ2htb2RCUEYKQEAgLTAsMCArMSwzMyBAQAorIyEgL2Jpbi9zaAorCisuIC9ldGMvcmMuY29tbW9uCisKK1N0YXJ0U2VydmljZSAoKQoreworCSMKKwkjIFVuZm9ydHVuYXRlbHksIE1hYyBPUyBYJ3MgZGV2ZnMgaXMgYmFzZWQgb24gdGhlIG9sZCBGcmVlQlNECisJIyBvbmUsIG5vdCB0aGUgY3VycmVudCBvbmUsIHNvIHRoZXJlJ3Mgbm8gd2F5IHRvIGNvbmZpZ3VyZSBpdAorCSMgdG8gY3JlYXRlIEJQRiBkZXZpY2VzIHdpdGggcGFydGljdWxhciBvd25lcnMgb3IgZ3JvdXBzLgorCSMgVGhpcyBzdGFydHVwIGl0ZW0gd2lsbCBtYWtlIGl0IG93bmVkIGJ5IHRoZSBhZG1pbiBncm91cCwKKwkjIHdpdGggcGVybWlzc2lvbnMgcnctcnctLS0tLCBzbyB0aGF0IGFueWJvZHkgaW4gdGhlIGFkbWluCisJIyBncm91cCBjYW4gdXNlIHByb2dyYW1zIHRoYXQgY2FwdHVyZSBvciBzZW5kIHJhdyBwYWNrZXRzLgorCSMKKwkjIENoYW5nZSB0aGlzIGFzIGFwcHJvcHJpYXRlIGZvciB5b3VyIHNpdGUsIGUuZy4gdG8gbWFrZQorCSMgaXQgb3duZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIgd2l0aG91dCBjaGFuZ2luZyB0aGUgcGVybWlzc2lvbnMsCisJIyBzbyBvbmx5IHRoYXQgdXNlciBhbmQgdGhlIHN1cGVyLXVzZXIgY2FuIGNhcHR1cmUgb3Igc2VuZCByYXcKKwkjIHBhY2tldHMsIG9yIGdpdmUgaXQgdGhlIHBlcm1pc3Npb25zIHJ3LXItLS0tLSwgc28gdGhhdAorCSMgb25seSB0aGUgc3VwZXItdXNlciBjYW4gc2VuZCByYXcgcGFja2V0cyBidXQgYW55Ym9keSBpbiB0aGUKKwkjIGFkbWluIGdyb3VwIGNhbiBjYXB0dXJlIHBhY2tldHMuCisJIworCWNoZ3JwIGFkbWluIC9kZXYvYnBmKgorCWNobW9kIGcrcncgL2Rldi9icGYqCit9CisKK1N0b3BTZXJ2aWNlICgpCit7CisJcmV0dXJuIDA7Cit9CisKK1Jlc3RhcnRTZXJ2aWNlICgpIHsgU3RhcnRTZXJ2aWNlOyB9CisKK1J1blNlcnZpY2UgIiQxIgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9DaG1vZEJQRi9TdGFydHVwUGFyYW1ldGVycy5wbGlzdCBiL2xpYnBjYXAtMS4zLjAvQ2htb2RCUEYvU3RhcnR1cFBhcmFtZXRlcnMucGxpc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhMjE2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvQ2htb2RCUEYvU3RhcnR1cFBhcmFtZXRlcnMucGxpc3QKQEAgLTAsMCArMSw0IEBACit7CisgIERlc2NyaXB0aW9uICAgICA9ICJDaGFuZ2UgQlBGIHBlcm1pc3Npb25zIjsKKyAgUHJvdmlkZXMgICAgICAgID0gKCJDaG1vZEJQRiIpOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9JTlNUQUxMLnR4dCBiL2xpYnBjYXAtMS4zLjAvSU5TVEFMTC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkOGUzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvSU5TVEFMTC50eHQKQEAgLTAsMCArMSw0MDMgQEAKK0AoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvSU5TVEFMTC50eHQsdiAxLjI5IDIwMDgtMDYtMTIgMjA6MjE6NTEgZ3V5IEV4cCAkIChMQkwpCisKK1RvIGJ1aWxkIGxpYnBjYXAsIHJ1biAiLi9jb25maWd1cmUiIChhIHNoZWxsIHNjcmlwdCkuIFRoZSBjb25maWd1cmUKK3NjcmlwdCB3aWxsIGRldGVybWluZSB5b3VyIHN5c3RlbSBhdHRyaWJ1dGVzIGFuZCBnZW5lcmF0ZSBhbgorYXBwcm9wcmlhdGUgTWFrZWZpbGUgZnJvbSBNYWtlZmlsZS5pbi4gTmV4dCBydW4gIm1ha2UiLiBJZiBldmVyeXRoaW5nCitnb2VzIHdlbGwgeW91IGNhbiBzdSB0byByb290IGFuZCBydW4gIm1ha2UgaW5zdGFsbCIuIEhvd2V2ZXIsIHlvdSBuZWVkCitub3QgaW5zdGFsbCBsaWJwY2FwIGlmIHlvdSBqdXN0IHdhbnQgdG8gYnVpbGQgdGNwZHVtcDsganVzdCBtYWtlIHN1cmUKK3RoZSB0Y3BkdW1wIGFuZCBsaWJwY2FwIGRpcmVjdG9yeSB0cmVlcyBoYXZlIHRoZSBzYW1lIHBhcmVudAorZGlyZWN0b3J5LgorCitJZiBjb25maWd1cmUgc2F5czoKKworICAgIGNvbmZpZ3VyZTogd2FybmluZzogY2Fubm90IGRldGVybWluZSBwYWNrZXQgY2FwdHVyZSBpbnRlcmZhY2UKKyAgICBjb25maWd1cmU6IHdhcm5pbmc6IChzZWUgSU5TVEFMTCBmb3IgbW9yZSBpbmZvKQorCit0aGVuIHlvdXIgc3lzdGVtIGVpdGhlciBkb2VzIG5vdCBzdXBwb3J0IHBhY2tldCBjYXB0dXJlIG9yIHlvdXIgc3lzdGVtCitkb2VzIHN1cHBvcnQgcGFja2V0IGNhcHR1cmUgYnV0IGxpYnBjYXAgZG9lcyBub3Qgc3VwcG9ydCB0aGF0CitwYXJ0aWN1bGFyIHR5cGUuIChJZiB5b3UgaGF2ZSBIUC1VWCwgc2VlIGJlbG93LikgSWYgeW91ciBzeXN0ZW0gdXNlcyBhCitwYWNrZXQgY2FwdHVyZSBub3Qgc3VwcG9ydGVkIGJ5IGxpYnBjYXAsIHBsZWFzZSBzZW5kIHVzIHBhdGNoZXM7IGRvbid0Citmb3JnZXQgdG8gaW5jbHVkZSBhbiBhdXRvY29uZiBmcmFnbWVudCBzdWl0YWJsZSBmb3IgdXNlIGluCitjb25maWd1cmUuaW4uCisKK0l0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHBhY2tldCBjYXB0dXJlIHR5cGUsIGFsdGhvdWdoCit0aGUgY2lyY3Vtc3RhbmNlIHdoZXJlIHRoaXMgd29ya3MgYXJlIGxpbWl0ZWQuIEZvciBleGFtcGxlIGlmIHlvdSBoYXZlCitpbnN0YWxsZWQgYnBmIHVuZGVyIFN1bk9TIDQgYW5kIHdpc2ggdG8gYnVpbGQgYSBzbml0IGxpYnBjYXA6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcGNhcD1zbml0CisKK0Fub3RoZXIgZXhhbXBsZSBpcyB0byBmb3JjZSBhIHN1cHBvcnRlZCBwYWNrZXQgY2FwdHVyZSB0eXBlIGluIHRoZSBjYXNlCit3aGVyZSB0aGUgY29uZmlndXJlIHNjcmlwdHMgZmFpbHMgdG8gZGV0ZWN0IGl0LgorCitZb3Ugd2lsbCBuZWVkIGFuIEFOU0kgQyBjb21waWxlciB0byBidWlsZCBsaWJwY2FwLiBUaGUgY29uZmlndXJlIHNjcmlwdAord2lsbCBhYm9ydCBpZiB5b3VyIGNvbXBpbGVyIGlzIG5vdCBBTlNJIGNvbXBsaWFudC4gSWYgdGhpcyBoYXBwZW5zLCB1c2UKK3RoZSBHTlUgQyBjb21waWxlciwgYXZhaWxhYmxlIHZpYSBhbm9ueW1vdXMgZnRwOgorCisJZnRwOi8vZnRwLmdudS5vcmcvcHViL2dudS9nY2MvCisKK0lmIHlvdSB1c2UgZmxleCwgeW91IG11c3QgdXNlIHZlcnNpb24gMi40LjYgb3IgaGlnaGVyLiBUaGUgY29uZmlndXJlCitzY3JpcHQgYXV0b21hdGljYWxseSBkZXRlY3RzIHRoZSB2ZXJzaW9uIG9mIGZsZXggYW5kIHdpbGwgbm90IHVzZSBpdAordW5sZXNzIGl0IGlzIG5ldyBlbm91Z2guIFlvdSBjYW4gdXNlICJmbGV4IC1WIiB0byBzZWUgd2hhdCB2ZXJzaW9uIHlvdQoraGF2ZSAodW5sZXNzIGl0J3MgcmVhbGx5IG9sZCkuIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgZmxleCBpcyBhdmFpbGFibGUKK3ZpYSBhbm9ueW1vdXMgZnRwOgorCisJZnRwOi8vZnRwLmVlLmxibC5nb3YvZmxleC0qLnRhci5aCisKK0FzIG9mIHRoaXMgd3JpdGluZywgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcyAyLjUuNC4KKworSWYgeW91IHVzZSBiaXNvbiwgeW91IG11c3QgdXNlIGZsZXggKGFuZCB2aXNhIHZlcnNhKS4gVGhlIGNvbmZpZ3VyZQorc2NyaXB0IGF1dG9tYXRpY2FsbHkgZmFsbHMgYmFjayB0byBsZXggYW5kIHlhY2MgaWYgYm90aCBmbGV4IGFuZCBiaXNvbgorYXJlIG5vdCBmb3VuZC4KKworU29tZXRpbWVzIHRoZSBzdG9jayBDIGNvbXBpbGVyIGRvZXMgbm90IGludGVyYWN0IHdlbGwgd2l0aCBmbGV4IGFuZAorYmlzb24uIFRoZSBsaXN0IG9mIHByb2JsZW1zIGluY2x1ZGVzIHVuZGVmaW5lZCByZWZlcmVuY2VzIGZvciBhbGxvY2EuCitZb3UgY2FuIGdldCBhcm91bmQgdGhpcyBieSBpbnN0YWxsaW5nIGdjYyBvciBtYW51YWxseSBkaXNhYmxpbmcgZmxleAorYW5kIGJpc29uIHdpdGg6CisKKyAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtZmxleCAtLXdpdGhvdXQtYmlzb24KKworSWYgeW91ciBzeXN0ZW0gb25seSBoYXMgQVQmVCBsZXgsIHRoaXMgaXMgb2theSB1bmxlc3MgeW91ciBsaWJwY2FwCitwcm9ncmFtIHVzZXMgb3RoZXIgbGV4L3lhY2MgZ2VuZXJhdGVkIGNvZGUuIChBbHRob3VnaCBpdCdzIHBvc3NpYmxlIHRvCittYXAgdGhlIHl5KiBpZGVudGlmaWVycyB3aXRoIGEgc2NyaXB0LCB3ZSB1c2UgZmxleCBhbmQgYmlzb24gc28gd2UKK2Rvbid0IGZlZWwgdGhpcyBpcyBuZWNlc3NhcnkuKQorCitTb21lIHN5c3RlbXMgc3VwcG9ydCB0aGUgQmVya2VsZXkgUGFja2V0IEZpbHRlciBuYXRpdmVseTsgZm9yIGV4YW1wbGUKK291dCBvZiB0aGUgYm94IE9TRiBhbmQgQlNEL09TIGhhdmUgYnBmLiBJZiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0CiticGYsIHlvdSB3aWxsIG5lZWQgdG8gcGljayB1cDoKKworCWZ0cDovL2Z0cC5lZS5sYmwuZ292L2JwZi0qLnRhci5aCisKK05vdGUgd2VsbDogeW91IE1VU1QgaGF2ZSBrZXJuZWwgc291cmNlIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gaW4KK29yZGVyIHRvIGluc3RhbGwgYnBmLiBBbiBleGNlcHRpb24gaXMgU3VuT1MgNDsgdGhlIGJwZiBkaXN0cmlidXRpb24KK2luY2x1ZGVzIHJlcGxhY2VtZW50IGtlcm5lbCBvYmplY3RzIGZvciBzb21lIG9mIHRoZSBzdGFuZGFyZCBTdW5PUyA0CituZXR3b3JrIGRldmljZSBkcml2ZXJzLiBTZWUgdGhlIGJwZiBJTlNUQUxMIGRvY3VtZW50IGZvciBtb3JlCitpbmZvcm1hdGlvbi4KKworSWYgeW91IHVzZSBTb2xhcmlzLCB0aGVyZSBpcyBhIGJ1ZyB3aXRoIGJ1Zm1vZCg3KSB0aGF0IGlzIGZpeGVkIGluCitTb2xhcmlzIDIuMy4yIChha2EgU3VuT1MgNS4zLjIpLiBTZXR0aW5nIGEgc25hcHNob3QgbGVuZ3RoIHdpdGggdGhlCiticm9rZW4gYnVmbW9kKDcpIHJlc3VsdHMgaW4gZGF0YSBiZSB0cnVuY2F0ZWQgZnJvbSB0aGUgRlJPTlQgb2YgdGhlCitwYWNrZXQgaW5zdGVhZCBvZiB0aGUgZW5kLiAgVGhlIHdvcmsgYXJvdW5kIGlzIHRvIG5vdCBzZXQgYSBzbmFwc2hvdAorbGVuZ3RoIGJ1dCB0aGlzIHJlc3VsdHMgaW4gcGVyZm9ybWFuY2UgcHJvYmxlbXMgc2luY2UgdGhlIGVudGlyZSBwYWNrZXQKK2lzIGNvcGllZCB0byB1c2VyIHNwYWNlLiBJZiB5b3UgbXVzdCBydW4gYW4gb2xkZXIgdmVyc2lvbiBvZiBTb2xhcmlzLAordGhlcmUgaXMgYSBwYXRjaCBhdmFpbGFibGUgZnJvbSBTdW47IGFzayBmb3IgYnVnaWQgMTE0OTA2NS4gQWZ0ZXIKK2luc3RhbGxpbmcgdGhlIHBhdGNoLCB1c2UgInNldGVudiBCVUZNT0RfRklYRUQiIHRvIGVuYWJsZSB1c2Ugb2YKK2J1Zm1vZCg3KS4gSG93ZXZlciwgd2UgcmVjb21tZW5kIHlvdSBydW4gYSBtb3JlIGN1cnJlbnQgcmVsZWFzZSBvZgorU29sYXJpcy4KKworSWYgeW91IHVzZSB0aGUgU1BBUkNvbXBpbGVyLCB5b3UgbXVzdCBiZSBjYXJlZnVsIHRvIG5vdCB1c2UgdGhlCisvdXNyL3VjYi9jYyBpbnRlcmZhY2UuIElmIHlvdSBkbywgeW91IHdpbGwgZ2V0IGJvZ3VzIHdhcm5pbmdzIGFuZAorcGVyaGFwcyBlcnJvcnMuIEVpdGhlciBtYWtlIHN1cmUgeW91ciBwYXRoIGhhcyAvb3B0L1NVTldzcHJvL2JpbgorYmVmb3JlIC91c3IvdWNiIG9yIGVsc2U6CisKKyAgICBzZXRlbnYgQ0MgL29wdC9TVU5Xc3Byby9iaW4vY2MKKworYmVmb3JlIHJ1bm5pbmcgY29uZmlndXJlLiAoWW91IG1pZ2h0IGhhdmUgdG8gZG8gYSAibWFrZSBkaXN0Y2xlYW4iCitpZiB5b3UgYWxyZWFkeSByYW4gY29uZmlndXJlIG9uY2UpLgorCitBbHNvIG5vdGUgdGhhdCAibWFrZSBkZXBlbmQiIHdvbid0IHdvcms7IHdoaWxlIGFsbCBvZiB0aGUga25vd24KK3VuaXZlcnNlIHVzZXMgLU0sIHRoZSBTUEFSQ29tcGlsZXIgdXNlcyAteE0gdG8gZ2VuZXJhdGUgbWFrZWZpbGUKK2RlcGVuZGVuY2llcy4KKworSWYgeW91IGFyZSB0cnlpbmcgdG8gZG8gcGFja2V0IGNhcHR1cmUgd2l0aCBhIEZPUkUgQVRNIGNhcmQsIHlvdSBtYXkgb3IKK21heSBub3QgYmUgYWJsZSB0by4gVGhleSB1c3VhbGx5IG9ubHkgcmVsZWFzZSB0aGVpciBkcml2ZXIgaW4gb2JqZWN0Citjb2RlIHNvIHVubGVzcyB0aGVpciBkcml2ZXIgc3VwcG9ydHMgcGFja2V0IGNhcHR1cmUsIHRoZXJlJ3Mgbm90IG11Y2gKK2xpYnBjYXAgY2FuIGRvLgorCitJZiB5b3UgZ2V0IGFuIGVycm9yIGxpa2U6CisKKyAgICB0Y3BkdW1wOiByZWN2X2FjazogYmluZCBlcnJvciAweD8/PworCit3aGVuIHVzaW5nIERMUEksIGxvb2sgZm9yIHRoZSBETF9FUlJPUl9BQ0sgZXJyb3IgcmV0dXJuIHZhbHVlcywgdXN1YWxseQoraW4gL3Vzci9pbmNsdWRlL3N5cy9kbHBpLmgsIGFuZCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgorCitVbmRlciB7REVDIE9TRi8xLCBEaWdpdGFsIFVOSVgsIFRydTY0IFVOSVh9LCBwYWNrZXQgY2FwdHVyZSBtdXN0IGJlCitlbmFibGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4gIEZvciBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGVuYWJsZSBwYWNrZXQKK2ZpbHRlciBzdXBwb3J0LCBzZWU6CisKKwlmdHA6Ly9mdHAuZGlnaXRhbC5jb20vcHViL0RpZ2l0YWwvZGVjLWZhcS9EaWdpdGFsLVVOSVgKKworTG9vayBmb3IgdGhlICJIb3cgZG8gSSBjb25maWd1cmUgdGhlIEJlcmtlbGV5IFBhY2tldCBGaWx0ZXIgYW5kIGNhcHR1cmUKK3RjcGR1bXAgdHJhY2VzPyIgaXRlbS4KKworT25jZSB5b3UgZW5hYmxlIHBhY2tldCBmaWx0ZXIgc3VwcG9ydCwgeW91ciBPU0Ygc3lzdGVtIHdpbGwgc3VwcG9ydCBicGYKK25hdGl2ZWx5LgorCitVbmRlciBVbHRyaXgsIHBhY2tldCBjYXB0dXJlIG11c3QgYmUgZW5hYmxlZCBiZWZvcmUgaXQgY2FuIGJlIHVzZWQuIEZvcgoraW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBlbmFibGUgcGFja2V0IGZpbHRlciBzdXBwb3J0LCBzZWU6CisKKwlmdHA6Ly9mdHAuZGlnaXRhbC5jb20vcHViL0RpZ2l0YWwvZGVjLWZhcS91bHRyaXgKKworSWYgeW91IHVzZSBIUC1VWCwgeW91IG11c3QgaGF2ZSBhdCBsZWFzdCB2ZXJzaW9uIDkgYW5kIGVpdGhlciB0aGUKK3ZlcnNpb24gb2YgY2MgdGhhdCBzdXBwb3J0cyBBTlNJIEMgKGNjIC1BYSkgb3IgZWxzZSB1c2UgdGhlIEdOVSBDCitjb21waWxlci4gWW91IG11c3QgYWxzbyBidXkgdGhlIG9wdGlvbmFsIHN0cmVhbXMgcGFja2FnZS4gSWYgeW91IGRvbid0CitoYXZlOgorCisgICAgL3Vzci9pbmNsdWRlL3N5cy9kbHBpLmgKKyAgICAvdXNyL2luY2x1ZGUvc3lzL2RscGlfZXh0LmgKKwordGhlbiB5b3UgZG9uJ3QgaGF2ZSB0aGUgc3RyZWFtcyBwYWNrYWdlLiBJbiBhZGRpdGlvbiwgd2UgYmVsaWV2ZSB5b3UKK25lZWQgdG8gaW5zdGFsbCB0aGUgIjkuWCBMQU4gYW5kIERMUEkgZHJpdmVycyBjdW11bGF0aXZlIiBwYXRjaAorKFBITkVfNjg1NSkgdG8gbWFrZSB0aGUgdmVyc2lvbiA5IERMUEkgd29yayB3aXRoIGxpYnBjYXAuCisKK1RoZSBETFBJIHN0cmVhbXMgcGFja2FnZSBpcyBzdGFuZGFyZCBzdGFydGluZyB3aXRoIEhQLVVYIDEwLgorCitUaGUgSFAgaW1wbGVtZW50YXRpb24gb2YgRExQSSBpcyBhIGxpdHRsZSBiaXQgZWNjZW50cmljLiBVbmxpa2UKK1NvbGFyaXMsIHlvdSBtdXN0IGF0dGFjaCAvZGV2L2RscGkgaW5zdGVhZCBvZiB0aGUgc3BlY2lmaWMgL2Rldi8qCituZXR3b3JrIHBzZXVkbyBkZXZpY2UgZW50cnkgaW4gb3JkZXIgdG8gY2FwdHVyZSBwYWNrZXRzLiBUaGUgUFBBIGlzCitiYXNlZCBvbiB0aGUgaWZuZXQgImluZGV4IiBudW1iZXIuIFVuZGVyIEhQLVVYIDksIGl0IGlzIG5lY2Vzc2FyeSB0bworcmVhZCAvZGV2L2ttZW0gYW5kIHRoZSBrZXJuZWwgc3ltYm9sIGZpbGUgKC9ocC11eCkuIFVuZGVyIEhQLVVYIDEwLAorRExQSSBjYW4gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgZGV0ZXJtaW5pbmcgdGhlIFBQQS4gSXQgZG9lcyBub3Qgc2VlbQordG8gYmUgcG9zc2libGUgdG8gdHJhY2UgdGhlIGxvb3BiYWNrIGludGVyZmFjZS4gVW5saWtlIG90aGVyIERMUEkKK2ltcGxlbWVudGF0aW9ucywgUEhZUyBpbXBsaWVzIE1VTFRJIGFuZCBTQVAgYW5kIHlvdSBnZXQgYW4gZXJyb3IgaWYgeW91Cit0cnkgdG8gZW5hYmxlIG1vcmUgdGhhbiBvbmUgcHJvbWlzY3VvdXMgbW9kZSBhdCBhIHRpbWUuCisKK0l0IGlzIGltcG9zc2libGUgdG8gY2FwdHVyZSBvdXRib3VuZCBwYWNrZXRzIG9uIEhQLVVYIDkuICBUbyBkbyBzbyBvbgorSFAtVVggMTAsIHlvdSB3aWxsLCBhcHBhcmVudGx5LCBuZWVkIGEgbGF0ZSAiTEFOIHByb2R1Y3RzIGN1bXVsYXRpdmUKK3BhdGNoIiAoYXQgb25lIHBvaW50LCBpdCB3YXMgY2xhaW1lZCB0aGF0IHRoaXMgd291bGQgYmUgUEhORV8xODE3MyBmb3IKK3M3MDAvMTAuMjA7IGF0IGFub3RoZXIgcG9pbnQsIGl0IHdhcyBjbGFpbWVkIHRoYXQgdGhlIHJlcXVpcmVkIHBhdGNoZXMKK3dlcmUgUEhORV8yMDg5MiwgUEhORV8yMDcyNSBhbmQgUEhDT18xMDk0Nywgb3IgbmV3ZXIgcGF0Y2hlcyksIGFuZCB0byBkbworc28gb24gSFAtVVggMTEgeW91IHdpbGwsIGFwcGFyZW50bHksIG5lZWQgdGhlIGxhdGVzdCBsYW5jb21tb24vRExQSQorcGF0Y2hlcyBhbmQgdGhlIGxhdGVzdCBkcml2ZXIgcGF0Y2ggZm9yIHRoZSBpbnRlcmZhY2UocykgaW4gdXNlIG9uIEhQLVVYCisxMSAoYXQgb25lIHBvaW50LCBpdCB3YXMgY2xhaW1lZCB0aGF0IHBhdGNoZXMgUEhORV8xOTc2NiwgUEhORV8xOTgyNiwKK1BITkVfMjAwMDgsIGFuZCBQSE5FXzIwNzM1IGRpZCB0aGUgdHJpY2spLgorCitGdXJ0aGVybW9yZSwgb24gSFAtVVggMTAsIHlvdSB3aWxsIG5lZWQgdG8gdHVybiBvbiBhIGtlcm5lbCBzd2l0Y2ggYnkKK2RvaW5nCisKKwllY2hvICdsYW5jX291dGJvdW5kX3Byb21pc2NfZmxhZy9XIDEnIHwgYWRiIC13IC9zdGFuZC92bXVuaXggL2Rldi9tZW0KKworWW91IHdvdWxkIGhhdmUgdG8gYXJyYW5nZSB0aGF0IHRoaXMgaGFwcGVuIG9uIHJlYm9vdHM7IHRoZSByaWdodCB3YXkgdG8KK2RvIHRoYXQgd291bGQgcHJvYmFibHkgYmUgdG8gcHV0IGl0IGludG8gYW4gZXhlY3V0YWJsZSBzY3JpcHQgZmlsZQorIi9zYmluL2luaXQuZC9vdXRib3VuZF9wcm9taXNjIiBhbmQgbWFraW5nCisiL3NiaW4vcmMyLmQvUzM1MG91dGJvdW5kX3Byb21pc2MiIGEgc3ltYm9saWMgbGluayB0byB0aGF0IHNjcmlwdC4KKworRmluYWxseSwgdGVzdGluZyBzaG93cyB0aGF0IHRoZXJlIGNhbid0IGJlIG1vcmUgdGhhbiBvbmUgc2ltdWx0YW5lb3VzCitETFBJIHVzZXIgcGVyIG5ldHdvcmsgaW50ZXJmYWNlLgorCitJZiB5b3UgdXNlIExpbnV4LCB0aGlzIHZlcnNpb24gb2YgbGlicGNhcCBpcyBrbm93biB0byBjb21waWxlIGFuZCBydW4KK3VuZGVyIFJlZCBIYXQgNC4wIHdpdGggdGhlIDIuMC4yNSBrZXJuZWwuICBJdCBtYXkgd29yayB3aXRoIGVhcmxpZXIgMi5YCit2ZXJzaW9ucyBidXQgaXMgZ3VhcmFudGVlZCBub3QgdG8gd29yayB3aXRoIDEuWCBrZXJuZWxzLiAgUnVubmluZyBtb3JlCit0aGFuIG9uZSBsaWJwY2FwIHByb2dyYW0gYXQgYSB0aW1lLCBvbiBhIHN5c3RlbSB3aXRoIGEgMi4wLlgga2VybmVsLCBjYW4KK2NhdXNlIHByb2JsZW1zIHNpbmNlIHByb21pc2N1b3VzIG1vZGUgaXMgaW1wbGVtZW50ZWQgYnkgdHdpZGRsaW5nIHRoZQoraW50ZXJmYWNlIGZsYWdzIGZyb20gdGhlIGxpYnBjYXAgYXBwbGljYXRpb247IHRoZSBwYWNrZXQgY2FwdHVyZQorbWVjaGFuaXNtIGluIHRoZSAyLjIgYW5kIGxhdGVyIGtlcm5lbHMgZG9lc24ndCBoYXZlIHRoaXMgcHJvYmxlbS4gIEFsc28sCitwYWNrZXQgdGltZXN0YW1wcyBhcmVuJ3QgdmVyeSBnb29kLiAgVGhpcyBhcHBlYXJzIHRvIGJlIGR1ZSB0byBoYXBoYXphcmQKK2hhbmRsaW5nIG9mIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGtlcm5lbC4KKworTm90ZSB3ZWxsOiB0aGVyZSBpcyBydW1vdXJlZCB0byBiZSBhIHZlcnNpb24gb2YgdGNwZHVtcCBmbG9hdGluZyBhcm91bmQKK2NhbGxlZCAzLjAuMyB0aGF0IGluY2x1ZGVzIGxpYnBjYXAgYW5kIGlzIHN1cHBvc2VkIHRvIHN1cHBvcnQgTGludXguIAorWW91IHNob3VsZCBiZSBhZHZpc2VkIHRoYXQgbmVpdGhlciB0aGUgTmV0d29yayBSZXNlYXJjaCBHcm91cCBhdCBMQk5MCitub3IgdGhlIFRjcGR1bXAgR3JvdXAgZXZlciBnZW5lcmF0ZWQgYSByZWxlYXNlIHdpdGggdGhpcyB2ZXJzaW9uIG51bWJlci4gCitUaGUgTEJOTCBOZXR3b3JrIFJlc2VhcmNoIEdyb3VwIG5vdGVzIHdpdGggaW50ZXJlc3QgdGhhdCBhIHN0YW5kYXJkCitjcmFja2VyIHRyaWNrIHRvIGdldCBwZW9wbGUgdG8gaW5zdGFsbCB0cm9qYW5zIGlzIHRvIGRpc3RyaWJ1dGUgYm9ndXMKK3BhY2thZ2VzIHRoYXQgaGF2ZSBhIHZlcnNpb24gbnVtYmVyIGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IHJlbGVhc2UuIAorVGhleSBhbHNvIG5vdGVkIHdpdGggYW5ub3lhbmNlIHRoYXQgOTAlIG9mIHRoZSBMaW51eCByZWxhdGVkIGJ1ZyByZXBvcnRzCit0aGV5IGdvdCBhcmUgZHVlIHRvIGNoYW5nZXMgbWFkZSB0byB1bm9mZmljaWFsIHZlcnNpb25zIG9mIHRoZWlyIHBhZ2UuIAorSWYgeW91IGFyZSBoYXZpbmcgdHJvdWJsZSBidXQgYXJlbid0IHVzaW5nIGEgdmVyc2lvbiB0aGF0IGNhbWUgZnJvbQordGNwZHVtcC5vcmcsIHBsZWFzZSB0cnkgdGhhdCBiZWZvcmUgc3VibWl0dGluZyBhIGJ1ZyByZXBvcnQhCisKK09uIExpbnV4LCBsaWJwY2FwIHdpbGwgbm90IHdvcmsgaWYgdGhlIGtlcm5lbCBkb2VzIG5vdCBoYXZlIHRoZSBwYWNrZXQKK3NvY2tldCBvcHRpb24gZW5hYmxlZDsgc2VlIHRoZSBSRUFETUUubGludXggZmlsZSBmb3IgaW5mb3JtYXRpb24gYWJvdXQKK3RoaXMuCisKK0lmIHlvdSB1c2UgQUlYLCB5b3UgbWF5IG5vdCBiZSBhYmxlIHRvIGJ1aWxkIGxpYnBjYXAgZnJvbSB0aGlzIHJlbGVhc2UuCitXZSBkbyBub3QgaGF2ZSBhbiBBSVggc3lzdGVtIGluIGhvdXNlIHNvIGl0J3MgaW1wb3NzaWJsZSBmb3IgdXMgdG8gdGVzdAorQUlYIHBhdGNoZXMgc3VibWl0dGVkIHRvIHVzLiAgV2UgYXJlIHRvbGQgdGhhdCB5b3UgbXVzdCBsaW5rIGFnYWluc3QKKy9saWIvcHNlLmV4cCwgdGhhdCB5b3UgbXVzdCB1c2UgQUlYIGNjIG9yIGEgR05VIEMgY29tcGlsZXIgbmV3ZXIgdGhhbgorMi43LjIsIGFuZCB0aGF0IHlvdSBtYXkgbmVlZCB0byBydW4gc3RybG9hZCBiZWZvcmUgcnVubmluZyBhIGxpYnBjYXAKK2FwcGxpY2F0aW9uLgorCitSZWFkIHRoZSBSRUFETUUuYWl4IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGluc3RhbGxpbmcgbGlicGNhcCBhbmQKK2NvbmZpZ3VyaW5nIHlvdXIgc3lzdGVtIHRvIGJlIGFibGUgdG8gc3VwcG9ydCBsaWJwY2FwLgorCitJZiB5b3UgdXNlIE5lWFRTVEVQLCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBidWlsZCBsaWJwY2FwIGZyb20gdGhpcworcmVsZWFzZS4KKworSWYgeW91IHVzZSBTSU5JWCwgeW91IHNob3VsZCBiZSBhYmxlIHRvIGJ1aWxkIGxpYnBjYXAgZnJvbSB0aGlzCityZWxlYXNlLiBJdCBpcyBrbm93biB0byBjb21waWxlIGFuZCBydW4gb24gU0lOSVgtWS9OIDUuNDIgd2l0aCB0aGUgQy1EUworVjEuMCBvciBWMS4xIGNvbXBpbGVyLiBCdXQgbm90ZSB0aGF0IGluIHNvbWUgcmVsZWFzZXMgb2YgU0lOSVgsIHlhY2MKK2VtaXRzIGluY29ycmVjdCBjb2RlOyBpZiBncmFtbWFyLnkgZmFpbHMgdG8gY29tcGlsZSwgY2hhbmdlIGV2ZXJ5CitvY2N1cmVuY2Ugb2Y6CisKKwkjaWZkZWYgWVlERUJVRworCit0bzoKKwkjaWYgWVlERUJVRworCitBbm90aGVyIHdvcmthcm91bmQgaXMgdG8gdXNlIGZsZXggYW5kIGJpc29uLgorCitJZiB5b3UgdXNlIFNDTywgeW91IG1pZ2h0IGhhdmUgdHJvdWJsZSBidWlsZGluZyBsaWJwY2FwIGZyb20gdGhpcworcmVsZWFzZS4gV2UgZG8gbm90IGhhdmUgYSBtYWNoaW5lIHJ1bm5pbmcgU0NPIGFuZCBoYXZlIG5vdCBoYWQgcmVwb3J0cworb2YgYW55b25lIHN1Y2Nlc3NmdWxseSBidWlsZGluZyBvbiBpdDsgdGhlIGN1cnJlbnQgcmVsZWFzZSBvZiBsaWJwY2FwCitkb2VzIG5vdCBjb21waWxlIG9uIFNDTyBPcGVuU2VydmVyIDUuICBBbHRob3VnaCBTQ08gYXBwYXJlbnRseSBzdXBwb3J0cworRExQSSB0byBzb21lIGV4dGVudCwgdGhlIERMUEkgaW4gT3BlblNlcnZlciA1IGlzIHZlcnkgbm9uLXN0YW5kYXJkLCBhbmQKK2l0IGFwcGVhcnMgdGhhdCBjb21wbGV0ZWx5IG5ldyBjb2RlIHdvdWxkIG5lZWQgdG8gYmUgd3JpdHRlbiB0byBjYXB0dXJlCituZXR3b3JrIHRyYWZmaWMuICBTQ08gZG8gbm90IGFwcGVhciB0byBwcm92aWRlIHRjcGR1bXAgYmluYXJpZXMgZm9yCitPcGVuU2VydmVyIDUgb3IgT3BlblNlcnZlciA2IGFzIHBhcnQgb2YgU0NPIFNrdW5rd2FyZToKKworCWh0dHA6Ly93d3cuc2NvLmNvbS9za3Vua3dhcmUvCisKK0lmIHlvdSB1c2UgVW5peFdhcmUsIHlvdSBtaWdodCBiZSBhYmxlIHRvIGJ1aWxkIGxpYnBjYXAgZnJvbSB0aGlzCityZWxlYXNlLCBvciB5b3UgbWlnaHQgbm90LiAgV2UgZG8gbm90IGhhdmUgYSBtYWNoaW5lIHJ1bm5pbmcgVW5peFdhcmUsCitzbyB3ZSBoYXZlIG5vdCB0ZXN0ZWQgaXQ7IGhvd2V2ZXIsIFNDTyBwcm92aWRlIHBhY2thZ2VzIGZvciBsaWJwY2FwCiswLjYuMiBhbmQgdGNwZHVtcCAzLjcuMSBpbiB0aGUgVW5peFdhcmUgNy9PcGVuIFVOSVggOCBwYXJ0IG9mIFNDTworU2t1bmt3YXJlLCBhbmQgdGhlIHNvdXJjZSBwYWNrYWdlIGZvciBsaWJwY2FwIDAuNi4yIGlzIG5vdCBjaGFuZ2VkIGZyb20KK3RoZSBsaWJwY2FwIDAuNi4yIHNvdXJjZSByZWxlYXNlLCBzbyB0aGlzIHJlbGVhc2Ugb2YgbGlicGNhcCBtaWdodCBhbHNvCitidWlsZCB3aXRob3V0IGNoYW5nZXMgb24gVW5peFdhcmUgNy4KKworSWYgbGlua2luZyB0Y3BkdW1wIGZhaWxzIHdpdGggIlVuZGVmaW5lZDogX2FsbG9jYSIgd2hlbiB1c2luZyBiaXNvbiBvbgorYSBTdW40LCB5b3VyIHZlcnNpb24gb2YgYmlzb24gaXMgYnJva2VuLiBJbiBhbnkgY2FzZSB2ZXJzaW9uIDEuMTYgb3IKK2hpZ2hlciBpcyByZWNvbW1lbmRlZCAoMS4xNCBpcyBrbm93biB0byBjYXVzZSBwcm9ibGVtcyAxLjE2IGlzIGtub3duIHRvCit3b3JrKS4gRWl0aGVyIHBpY2sgdXAgYSBjdXJyZW50IHZlcnNpb24gZnJvbToKKworCWZ0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvYmlzb24KKworb3IgaGFjayBhcm91bmQgaXQgYnkgaW5zZXJ0aW5nIHRoZSBsaW5lczoKKworCSNpZmRlZiBfX0dOVUNfXworCSNkZWZpbmUgYWxsb2NhIF9fYnVpbHRpbl9hbGxvY2EKKwkjZWxzZQorCSNpZmRlZiBzcGFyYworCSNpbmNsdWRlIDxhbGxvY2EuaD4KKwkjZWxzZQorCWNoYXIgKmFsbG9jYSAoKTsKKwkjZW5kaWYKKwkjZW5kaWYKKworcmlnaHQgYWZ0ZXIgdGhlICgxMDAgbGluZSEpIEdOVSBsaWNlbnNlIGNvbW1lbnQgaW4gYmlzb24uc2ltcGxlLCByZW1vdmUKK2dyYW1tYXIuW2NvXSBhbmQgZmlyZSB1cCBtYWtlIGFnYWluLgorCitJZiB5b3UgdXNlIFN1bk9TIDQsIHlvdXIga2VybmVsIG11c3Qgc3VwcG9ydCBzdHJlYW1zIE5JVC4gSWYgeW91IHJ1biBhCitsaWJwY2FwIHByb2dyYW0gYW5kIGl0IGRpZXMgd2l0aDoKKworICAgIC9kZXYvbml0OiBObyBzdWNoIGRldmljZQorCitZb3UgbXVzdCBhZGQgc3RyZWFtcyBOSVQgc3VwcG9ydCB0byB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uLCBydW4KK2NvbmZpZyBhbmQgYm9vdCB0aGUgbmV3IGtlcm5lbC4KKworSWYgeW91IGFyZSBydW5uaW5nIGEgdmVyc2lvbiBvZiBTdW5PUyBlYXJsaWVyIHRoYW4gNC4xLCB5b3Ugd2lsbCBuZWVkCit0byByZXBsYWNlIHRoZSBTdW4gc3VwcGxpZWQgL3N5cy9zdW57Myw0LDRjfS9PQkovbml0X2lmLm8gd2l0aCB0aGUKK2FwcHJvcHJpYXRlIHZlcnNpb24gZnJvbSB0aGlzIGRpc3RyaWJ1dGlvbidzIFNVTk9TNCBzdWJkaXJlY3RvcnkgYW5kCitidWlsZCBhIG5ldyBrZXJuZWw6CisKKwluaXRfaWYuby5zdW4zLXN1bm9zNAkJKGFueSBmbGF2b3Igb2Ygc3VuMykKKwluaXRfaWYuby5zdW40Yy1zdW5vczQuMC4zYwkoU1MxLCBTUzErLCBJUEMsIFNMQywgZXRjLikKKwluaXRfaWYuby5zdW40LXN1bm9zNAkJKFN1bjQncyBub3QgY292ZXJlZCBieQorCQkJCQkgICAgbml0X2lmLm8uc3VuNGMtc3Vub3M0LjAuM2MpCisKK1RoZXNlIG5pdCByZXBsYWNlbWVudHMgZml4IGEgYnVnIHRoYXQgbWFrZXMgbml0IGVzc2VudGlhbGx5IHVudXNhYmxlIGluCitwcmUtU3VuT1MgNC4xLiAgSW4gYWRkaXRpb24sIG91ciBzdW40Yy1zdW5vczQuMC4zYyBuaXQgZ2l2ZXMgeW91Cit0aW1lc3RhbXBzIHRvIHRoZSByZXNvbHV0aW9uIG9mIHRoZSBTUy0xIGNsb2NrICgxIHVzKSByYXRoZXIgdGhhbiB0aGUKK2xvdXN5IDIwbXMgdGltZXN0YW1wcyBTdW4gZ2l2ZXMgeW91ICAodGNwZHVtcCB3aWxsIHByaW50IG91dCB0aGUgZnVsbAordGltZXN0YW1wIHJlc29sdXRpb24gaWYgaXQgZmluZHMgaXQncyBydW5uaW5nIG9uIGEgU1MtMSkuCisKK0ZJTEVTCistLS0tLQorQ0hBTkdFUwkJLSBkZXNjcmlwdGlvbiBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHJlbGVhc2VzCitDaG1vZEJQRi8qCS0gTWFjIE9TIFggc3RhcnR1cCBpdGVtIHRvIHNldCBvd25lcnNoaXAgYW5kIHBlcm1pc3Npb25zCisJCSAgb24gL2Rldi9icGYqCitDUkVESVRTCQktIHBlb3BsZSB0aGF0IGhhdmUgaGVscGVkIGxpYnBjYXAgYWxvbmcKK0lOU1RBTEwudHh0CS0gdGhpcyBmaWxlCitMSUNFTlNFCQktIHRoZSBsaWNlbnNlIHVuZGVyIHdoaWNoIHRjcGR1bXAgaXMgZGlzdHJpYnV0ZWQKK01ha2VmaWxlLmluCS0gY29tcGlsYXRpb24gcnVsZXMgKGlucHV0IHRvIHRoZSBjb25maWd1cmUgc2NyaXB0KQorUkVBRE1FCQktIGRlc2NyaXB0aW9uIG9mIGRpc3RyaWJ1dGlvbgorUkVBRE1FLmFpeAktIG5vdGVzIG9uIHVzaW5nIGxpYnBjYXAgb24gQUlYCitSRUFETUUuZGFnCS0gbm90ZXMgb24gdXNpbmcgbGlicGNhcCB0byBjYXB0dXJlIG9uIEVuZGFjZSBEQUcgZGV2aWNlcworUkVBRE1FLmhwdXgJLSBub3RlcyBvbiB1c2luZyBsaWJwY2FwIG9uIEhQLVVYCitSRUFETUUubGludXgJLSBub3RlcyBvbiB1c2luZyBsaWJwY2FwIG9uIExpbnV4CitSRUFETUUubWFjb3N4CS0gbm90ZXMgb24gdXNpbmcgbGlicGNhcCBvbiBNYWMgT1MgWAorUkVBRE1FLnNlcHRlbCAgIC0gbm90ZXMgb24gdXNpbmcgbGlicGNhcCB0byBjYXB0dXJlIG9uIEludGVsL1NlcHRlbCBkZXZpY2VzCitSRUFETUUuc2l0YQktIG5vdGVzIG9uIHVzaW5nIGxpYnBjYXAgdG8gY2FwdHVyZSBvbiBTSVRBIGRldmljZXMKK1JFQURNRS50cnU2NAktIG5vdGVzIG9uIHVzaW5nIGxpYnBjYXAgb24gRGlnaXRhbC9UcnU2NCBVTklYCitSRUFETUUuV2luMzIJLSBub3RlcyBvbiB1c2luZyBsaWJwY2FwIG9uIFdpbjMyIHN5c3RlbXMgKHdpdGggV2luUGNhcCkKK1NVTk9TNAkJLSBwcmUtU3VuT1MgNC4xIHJlcGxhY2VtZW50IGtlcm5lbCBuaXQgbW9kdWxlcworVkVSU0lPTgkJLSB2ZXJzaW9uIG9mIHRoaXMgcmVsZWFzZQorYWNjb25maWcuaAktIHN1cHBvcnQgZm9yIHBvc3QtMi4xMyBhdXRvY29uZgorYWNsb2NhbC5tNAktIGF1dG9jb25mIG1hY3JvcworYXJjbmV0LmgJLSBBUkNORVQgZGVmaW5pdGlvbnMKK2F0bXVuaTMxLmgJLSBBVE0gUS4yOTMxIGRlZmluaXRpb25zCiticGYvbmV0CQktIGNvcHkgb2YgYnBmX2ZpbHRlci5jCiticGZfZHVtcC5jCS0gQlBGIHByb2dyYW0gcHJpbnRpbmcgcm91dGluZXMKK2JwZl9maWx0ZXIuYwktIHN5bWxpbmsgdG8gYnBmL25ldC9icGZfZmlsdGVyLmMKK2JwZl9pbWFnZS5jCS0gQlBGIGRpc2Fzc2VtYmx5IHJvdXRpbmUKK2NvbmZpZy5ndWVzcwktIGF1dG9jb25mIHN1cHBvcnQKK2NvbmZpZy5oLmluCS0gYXV0b2NvbmYgaW5wdXQKK2NvbmZpZy5zdWIJLSBhdXRvY29uZiBzdXBwb3J0Citjb25maWd1cmUJLSBjb25maWd1cmUgc2NyaXB0IChydW4gdGhpcyBmaXJzdCkKK2NvbmZpZ3VyZS5pbgktIGNvbmZpZ3VyZSBzY3JpcHQgc291cmNlCitkbHBpc3Vicy5jCS0gRExQSS1yZWxhdGVkIGZ1bmN0aW9ucyBmb3IgcGNhcC1kbHBpLmMgYW5kIHBjYXAtbGliZGxwaS5jCitkbHBpc3Vicy5oCS0gRExQSS1yZWxhdGVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucworZXRoZXJlbnQuYwktIC9ldGMvZXRoZXJzIHN1cHBvcnQgcm91dGluZXMKK2V0aGVydHlwZS5oCS0gRXRoZXJuZXQgcHJvdG9jb2wgdHlwZXMgYW5kIG5hbWVzIGRlZmluaXRpb25zCitmYWQtZ2V0YWQuYwktIHBjYXBfZmluZGFsbGRldnMoKSBmb3Igc3lzdGVtcyB3aXRoIGdldGlmYWRkcnMoKQorZmFkLWdpZmMuYwktIHBjYXBfZmluZGFsbGRldnMoKSBmb3Igc3lzdGVtcyB3aXRoIG9ubHkgU0lPQ0dJRkxJU1QKK2ZhZC1nbGlmYy5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBzeXN0ZW1zIHdpdGggU0lPQ0dMSUZDT05GCitmYWQtbnVsbC5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBzeXN0ZW1zIHdpdGhvdXQgY2FwdHVyZSBzdXBwb3J0CitmYWQtc2l0YS5jCS0gcGNhcF9maW5kYWxsZGV2cygpIGZvciBzeXN0ZW1zIHdpdGggU0lUQSBzdXBwb3J0CitmYWQtd2luMzIuYwktIHBjYXBfZmluZGFsbGRldnMoKSBmb3IgV2luUGNhcAorZmlsdGVydGVzdC5jCS0gdGVzdCBwcm9ncmFtIGZvciBCUEYgY29tcGlsZXIKK2ZpbmRhbGxkZXZzdGVzdC5jIC0gdGVzdCBwcm9ncmFtIGZvciBwY2FwX2ZpbmRhbGxkZXZzKCkKK2dlbmNvZGUuYwktIEJQRiBjb2RlIGdlbmVyYXRpb24gcm91dGluZXMKK2dlbmNvZGUuaAktIEJQRiBjb2RlIGdlbmVyYXRpb24gZGVmaW5pdGlvbnMKK2dyYW1tYXIueQktIGZpbHRlciBzdHJpbmcgZ3JhbW1hcgoraWVlZTgwMjExLmgJLSA4MDIuMTEgZGVmaW5pdGlvbnMKK2luZXQuYwkJLSBuZXR3b3JrIHJvdXRpbmVzCitpbnN0YWxsLXNoCS0gQlNEIHN0eWxlIGluc3RhbGwgc2NyaXB0CitsYmwvb3MtKi5oCS0gT1MtZGVwZW5kZW50IGRlZmluZXMgYW5kIHByb3RvdHlwZXMKK2xsYy5oCQktIDgwMi4yIExMQyBTQVAgZGVmaW5pdGlvbnMKK21pc3NpbmcvKgktIHJlcGxhY2VtZW50cyBmb3IgbWlzc2luZyBsaWJyYXJ5IGZ1bmN0aW9ucworbWtkZXAJCS0gY29uc3RydWN0IE1ha2VmaWxlIGRlcGVuZGVuY3kgbGlzdAorbXNkb3MvKgkJLSBkcml2ZXJzIGZvciBNUy1ET1MgY2FwdHVyZSBzdXBwb3J0CituYW1ldG9hZGRyLmMJLSBob3N0bmFtZSB0byBhZGRyZXNzIHJvdXRpbmVzCitubHBpZC5oCQktIE9TSSBuZXR3b3JrIGxheWVyIHByb3RvY29sIGlkZW50aWZpZXIgZGVmaW5pdGlvbnMKK25ldAkJLSBzeW1saW5rIHRvIGJwZi9uZXQKK29wdGltaXplLmMJLSBCUEYgb3B0aW1pemF0aW9uIHJvdXRpbmVzCitwYWNrYWdpbmcJLSBwYWNrYWdpbmcgaW5mb3JtYXRpb24gZm9yIGJ1aWxkaW5nIGxpYnBjYXAgUlBNcworcGNhcC9ibHVldG9vdGguaCAtIHB1YmxpYyBkZWZpbml0aW9uIG9mIERMVF9CTFVFVE9PVEhfSENJX0g0X1dJVEhfUEhEUiBoZWFkZXIKK3BjYXAvYnBmLmgJLSBCUEYgZGVmaW5pdGlvbnMKK3BjYXAvbmFtZWRiLmgJLSBwdWJsaWMgbGlicGNhcCBuYW1lIGRhdGFiYXNlIGRlZmluaXRpb25zCitwY2FwL3BjYXAuaAktIHB1YmxpYyBsaWJwY2FwIGRlZmluaXRpb25zCitwY2FwL3NsbC5oCS0gcHVibGljIGRlZmluaXRpb24gb2YgRExUX0xJTlVYX1NMTCBoZWFkZXIKK3BjYXAvdXNiLmgJLSBwdWJsaWMgZGVmaW5pdGlvbiBvZiBETFRfVVNCIGhlYWRlcgorcGNhcC1icGYuYwktIEJTRCBQYWNrZXQgRmlsdGVyIHN1cHBvcnQKK3BjYXAtYnBmLmgJLSBoZWFkZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CitwY2FwLWJ0LWxpbnV4LmMJLSBCbHVldG9vdGggY2FwdHVyZSBzdXBwb3J0IGZvciBMaW51eAorcGNhcC1idC1saW51eC5oCS0gQmx1ZXRvb3RoIGNhcHR1cmUgc3VwcG9ydCBmb3IgTGludXgKK3BjYXAtZGFnLmMJLSBFbmRhY2UgREFHIGRldmljZSBjYXB0dXJlIHN1cHBvcnQKK3BjYXAtZGFnLmgJLSBFbmRhY2UgREFHIGRldmljZSBjYXB0dXJlIHN1cHBvcnQKK3BjYXAtZGxwaS5jCS0gRGF0YSBMaW5rIFByb3ZpZGVyIEludGVyZmFjZSBzdXBwb3J0CitwY2FwLWRvcy5jCS0gTVMtRE9TIGNhcHR1cmUgc3VwcG9ydAorcGNhcC1kb3MuaAktIGhlYWRlcnMgZm9yIE1TLURPUyBjYXB0dXJlIHN1cHBvcnQKK3BjYXAtZW5ldC5jCS0gZW5ldCBzdXBwb3J0CitwY2FwLWludC5oCS0gaW50ZXJuYWwgbGlicGNhcCBkZWZpbml0aW9ucworcGNhcC1saWJkbHBpLmMJLSBEYXRhIExpbmsgUHJvdmlkZXIgSW50ZXJmYWNlIHN1cHBvcnQgZm9yIHN5c3RlbXMgd2l0aCBsaWJkbHBpCitwY2FwLWxpbnV4LmMJLSBMaW51eCBwYWNrZXQgc29ja2V0IHN1cHBvcnQKK3BjYXAtbmFtZWRiLmgJLSBoZWFkZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CitwY2FwLW5pdC5jCS0gU3VuT1MgTmV0d29yayBJbnRlcmZhY2UgVGFwIHN1cHBvcnQKK3BjYXAtbml0LmgJLSBTdW5PUyBOZXR3b3JrIEludGVyZmFjZSBUYXAgZGVmaW5pdGlvbnMKK3BjYXAtbnVsbC5jCS0gZHVtbXkgbW9uaXRvciBzdXBwb3J0IChhbGxvd3Mgb2ZmbGluZSB1c2Ugb2YgbGlicGNhcCkKK3BjYXAtcGYuYwktIFVsdHJpeCBhbmQgRGlnaXRhbC9UcnU2NCBVTklYIFBhY2tldCBGaWx0ZXIgc3VwcG9ydAorcGNhcC1wZi5oCS0gVWx0cml4IGFuZCBEaWdpdGFsL1RydTY0IFVOSVggUGFja2V0IEZpbHRlciBkZWZpbml0aW9ucworcGNhcC1zZXB0ZWwuYyAgIC0gSW50ZWwvU2VwdGVsIGRldmljZSBjYXB0dXJlIHN1cHBvcnQKK3BjYXAtc2VwdGVsLmggICAtIEludGVsL1NlcHRlbCBkZXZpY2UgY2FwdHVyZSBzdXBwb3J0CitwY2FwLXNpdGEuYwktIFNJVEEgZGV2aWNlIGNhcHR1cmUgc3VwcG9ydAorcGNhcC1zaXRhLmgJLSBTSVRBIGRldmljZSBjYXB0dXJlIHN1cHBvcnQKK3BjYXAtc2l0YS5odG1sCS0gU0lUQSBkZXZpY2UgY2FwdHVyZSBkb2N1bWVudGF0aW9uCitwY2FwLXN0ZGluYy5oCS0gaW5jbHVkZXMgYW5kICNkZWZpbmVzIGZvciBjb21waWxpbmcgb24gV2luMzIgc3lzdGVtcworcGNhcC1zbml0LmMJLSBTdW5PUyA0LnggU1RSRUFNUy1iYXNlZCBOZXR3b3JrIEludGVyZmFjZSBUYXAgc3VwcG9ydAorcGNhcC1zbm9vcC5jCS0gSVJJWCBTbm9vcCBuZXR3b3JrIG1vbml0b3Jpbmcgc3VwcG9ydAorcGNhcC11c2ItbGludXguYyAtIFVTQiBjYXB0dXJlIHN1cHBvcnQgZm9yIExpbnV4CitwY2FwLXVzYi1saW51eC5oIC0gVVNCIGNhcHR1cmUgc3VwcG9ydCBmb3IgTGludXgKK3BjYXAtd2luMzIuYwktIFdpblBjYXAgY2FwdHVyZSBzdXBwb3J0CitwY2FwLjNwY2FwCS0gbWFudWFsIGVudHJ5IGZvciB0aGUgbGlicmFyeQorcGNhcC5jCQktIHBjYXAgdXRpbGl0eSByb3V0aW5lcworcGNhcC5oCQktIGhlYWRlciBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK3BjYXBfKi4zcGNhcAktIG1hbnVhbCBlbnRyaWVzIGZvciBsaWJyYXJ5IGZ1bmN0aW9ucworcGNhcC1maWx0ZXIuNAktIG1hbnVhbCBlbnRyeSBmb3IgZmlsdGVyIHN5bnRheAorcGNhcC1saW5rdHlwZS40CS0gbWFudWFsIGVudHJ5IGZvciBsaW5rLWxheWVyIGhlYWRlciB0eXBlcworcHBwLmgJCS0gUG9pbnQgdG8gUG9pbnQgUHJvdG9jb2wgZGVmaW5pdGlvbnMKK3J1bmxleC5zaAktIHdyYXBwZXIgZm9yIExleC9GbGV4CitzYXZlZmlsZS5jCS0gb2ZmbGluZSBzdXBwb3J0CitzY2FubmVyLmwJLSBmaWx0ZXIgc3RyaW5nIHNjYW5uZXIKK3N1bmF0bXBvcy5oCS0gZGVmaW5pdGlvbnMgZm9yIFN1bkFUTSBjYXB0dXJpbmcKK1dpbjMyCQktIGhlYWRlcnMgYW5kIHJvdXRpbmVzIGZvciBidWlsZGluZyBvbiBXaW4zMiBzeXN0ZW1zCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL0xJQ0VOU0UgYi9saWJwY2FwLTEuMy4wL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhNWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvTElDRU5TRQpAQCAtMCwwICsxLDE5IEBACitMaWNlbnNlOiBCU0QKKyAKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCithcmUgbWV0OgorICAKKyAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAgICBkaXN0cmlidXRpb24uCisgIDMuIFRoZSBuYW1lcyBvZiB0aGUgYXV0aG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICAKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCitJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9NYWtlZmlsZS5pbiBiL2xpYnBjYXAtMS4zLjAvTWFrZWZpbGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyY2M3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvTWFrZWZpbGUuaW4KQEAgLTAsMCArMSw3MzUgQEAKKyMgIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgorIyAJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworIyAgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorIyAgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyMgIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyMgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyMgIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisjICBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyMgIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorIyAgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyMgIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorIyAgd3JpdHRlbiBwZXJtaXNzaW9uLgorIyAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorIyAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyMgIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjCisjIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvTWFrZWZpbGUuaW4sdiAxLjE0MiAyMDA4LTExLTIyIDE3OjMwOjI0IGd1eSBFeHAgJCAoTEJMKQorCisjCisjIFZhcmlvdXMgY29uZmlndXJhYmxlIHBhdGhzIChyZW1lbWJlciB0byBlZGl0IE1ha2VmaWxlLmluLCBub3QgTWFrZWZpbGUpCisjCisKKyMgVG9wIGxldmVsIGhpZXJhcmNoeQorcHJlZml4ID0gQHByZWZpeEAKK2V4ZWNfcHJlZml4ID0gQGV4ZWNfcHJlZml4QAorZGF0YXJvb3RkaXIgPSBAZGF0YXJvb3RkaXJACisjIFBhdGhuYW1lIG9mIGRpcmVjdG9yeSB0byBpbnN0YWxsIHRoZSBjb25maWd1cmUgcHJvZ3JhbQorYmluZGlyID0gQGJpbmRpckAKKyMgUGF0aG5hbWUgb2YgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIGluY2x1ZGUgZmlsZXMKK2luY2x1ZGVkaXIgPSBAaW5jbHVkZWRpckAKKyMgUGF0aG5hbWUgb2YgZGlyZWN0b3J5IHRvIGluc3RhbGwgdGhlIGxpYnJhcnkKK2xpYmRpciA9ICBAbGliZGlyQAorIyBQYXRobmFtZSBvZiBkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgbWFuIHBhZ2VzCittYW5kaXIgPSBAbWFuZGlyQAorCisjIFZQQVRICitzcmNkaXIgPSBAc3JjZGlyQAorVlBBVEggPSBAc3JjZGlyQAorCisjCisjIFlvdSBzaG91bGRuJ3QgbmVlZCB0byBlZGl0IGFueXRoaW5nIGJlbG93LgorIworCitMRCA9IC91c3IvYmluL2xkCitDQyA9IEBDQ0AKK0FSID0gQEFSQAorQ0NPUFQgPSBAVl9DQ09QVEAKK0lOQ0xTID0gLUkuIEBWX0lOQ0xTQAorREVGUyA9IEBERUZTQCBAVl9ERUZTQAorQURETE9CSlMgPSBAQURETE9CSlNACitBRERMQVJDSElWRU9CSlMgPSBAQURETEFSQ0hJVkVPQkpTQAorTElCUyA9IEBMSUJTQAorQ0ZMQUdTID0gQENGTEFHU0AKK0xERkxBR1MgPSBATERGTEFHU0AKK0RZRVhUID0gQERZRVhUQAorVl9SUEFUSF9PUFQgPSBAVl9SUEFUSF9PUFRACitQUk9HPWxpYnBjYXAKKworIyBTdGFuZGFyZCBDRkxBR1MKK0ZVTExfQ0ZMQUdTID0gJChDQ09QVCkgJChJTkNMUykgJChERUZTKSAkKENGTEFHUykKKworSU5TVEFMTCA9IEBJTlNUQUxMQAorSU5TVEFMTF9QUk9HUkFNID0gQElOU1RBTExfUFJPR1JBTUAKK0lOU1RBTExfREFUQSA9IEBJTlNUQUxMX0RBVEFACitSQU5MSUIgPSBAUkFOTElCQAorCisjCisjIEZsZXggYW5kIGJpc29uIGFsbG93IHlvdSB0byBzcGVjaWZ5IHRoZSBwcmVmaXhlcyBvZiB0aGUgZ2xvYmFsIHN5bWJvbHMKKyMgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIHBhcnNlci4gIFRoaXMgYWxsb3dzIHByb2dyYW1zIHRvIHVzZSBsZXgveWFjYworIyBhbmQgbGluayBhZ2FpbnN0IGxpYnBjYXAuICBJZiB5b3UgZG9uJ3QgaGF2ZSBmbGV4IG9yIGJpc29uLCBnZXQgdGhlbS4KKyMKK0xFWCA9IEBWX0xFWEAKK1lBQ0MgPSBAVl9ZQUNDQAorCisjIEV4cGxpY2l0bHkgZGVmaW5lIGNvbXBpbGF0aW9uIHJ1bGUgc2luY2UgU3VuT1MgNCdzIG1ha2UgZG9lc24ndCBsaWtlIGdjYy4KKyMgQWxzbywgZ2NjIGRvZXMgbm90IHJlbW92ZSB0aGUgLm8gYmVmb3JlIGZvcmtpbmcgJ2FzJywgd2hpY2ggY2FuIGJlIGEKKyMgcHJvYmxlbSBpZiB5b3UgZG9uJ3Qgb3duIHRoZSBmaWxlIGJ1dCBjYW4gd3JpdGUgdG8gdGhlIGRpcmVjdG9yeS4KKy5jLm86CisJQHJtIC1mICRACisJJChDQykgJChGVUxMX0NGTEFHUykgLWMgJChzcmNkaXIpLyQqLmMKKworUFNSQyA9CXBjYXAtQFZfUENBUEAuYyBAVVNCX1NSQ0AgQEJUX1NSQ0AgQENBTl9TUkNAIEBORVRGSUxURVJfU1JDQCBAQ0FOVVNCX1NSQ0AKK0ZTUkMgPSAgZmFkLUBWX0ZJTkRBTExERVZTQC5jCitTU1JDID0gIEBTU1JDQAorQ1NSQyA9CXBjYXAuYyBpbmV0LmMgZ2VuY29kZS5jIG9wdGltaXplLmMgbmFtZXRvYWRkci5jIGV0aGVyZW50LmMgXAorCXNhdmVmaWxlLmMgc2YtcGNhcC5jIHNmLXBjYXAtbmcuYyBwY2FwLWNvbW1vbi5jIFwKKwlicGZfaW1hZ2UuYyBicGZfZHVtcC5jCitHRU5TUkMgPSBzY2FubmVyLmMgZ3JhbW1hci5jIGJwZl9maWx0ZXIuYyB2ZXJzaW9uLmMKK0xJQk9CSlMgPSBATElCT0JKU0AKKworU1JDID0JJChQU1JDKSAkKEZTUkMpICQoQ1NSQykgJChTU1JDKSAkKEdFTlNSQykKKworIyBXZSB3b3VsZCBsaWtlIHRvIHNheSAiT0JKID0gJChTUkM6LmM9Lm8pIiBidXQgVWx0cml4J3MgbWFrZSBjYW5ub3QKKyMgaGFjayB0aGUgZXh0cmEgaW5kaXJlY3Rpb24KK09CSiA9CSQoUFNSQzouYz0ubykgJChGU1JDOi5jPS5vKSAkKENTUkM6LmM9Lm8pICQoU1NSQzouYz0ubykgJChHRU5TUkM6LmM9Lm8pICQoTElCT0JKUykKK1BVQkhEUiA9IFwKKwlwY2FwLmggXAorCXBjYXAtYnBmLmggXAorCXBjYXAtbmFtZWRiLmggXAorCXBjYXAvYnBmLmggXAorCXBjYXAvYmx1ZXRvb3RoLmggXAorCXBjYXAvaXBuZXQuaCBcCisJcGNhcC9uYW1lZGIuaCBcCisJcGNhcC9wY2FwLmggXAorCXBjYXAvc2xsLmggXAorCXBjYXAvdmxhbi5oIFwKKwlwY2FwL3VzYi5oCisKK0hEUiA9ICQoUFVCSERSKSBcCisJYXJjbmV0LmggXAorCWF0bXVuaTMxLmggXAorCWV0aGVydHlwZS5oIFwKKwlnZW5jb2RlLmggXAorCWllZWU4MDIxMS5oIFwKKwlsbGMuaCBcCisJbmxwaWQuaCBcCisJcGNhcC1jb21tb24uaCBcCisJcGNhcC1pbnQuaCBcCisJcGNhcC1zdGRpbmMuaCBcCisJcHBwLmggXAorCXNmLXBjYXAuaCBcCisJc2YtcGNhcC1uZy5oIFwKKwlzdW5hdG1wb3MuaAorCitURVNUUyA9IFwKKwlmaWx0ZXJ0ZXN0IFwKKwlmaW5kYWxsZGV2c3Rlc3QgXAorCW5vbmJsb2NrdGVzdCBcCisJb3BlbnRlc3QgXAorCXNlbHBvbGx0ZXN0CisKK1RFU1RTX1NSQyA9IFwKKwl0ZXN0cy9maWx0ZXJ0ZXN0LmMgXAorCXRlc3RzL2ZpbmRhbGxkZXZzdGVzdC5jIFwKKwl0ZXN0cy9ub25ibG9ja3Rlc3QuYyBcCisJdGVzdHMvb3BlbnRlc3QuYyBcCisJdGVzdHMvcmVhY3RpdmF0ZXRlc3QuYyBcCisJdGVzdHMvc2VscG9sbHRlc3QuYworCitHRU5IRFIgPSBcCisJc2Nhbm5lci5oIHRva2RlZnMuaCB2ZXJzaW9uLmgKKworVEFHRklMRVMgPSBcCisJJChTUkMpICQoSERSKQorCitDTEVBTkZJTEVTID0gJChPQkopIGxpYnBjYXAuKiAkKFRFU1RTKSBcCisJJChQUk9HKS1gY2F0ICQoc3JjZGlyKS9WRVJTSU9OYC50YXIuZ3ogJChHRU5TUkMpICQoR0VOSERSKSBcCisJbGV4Lnl5LmMgcGNhcC1jb25maWcKKworTUFOMSA9IHBjYXAtY29uZmlnLjEKKworTUFOM1BDQVBfRVhQQU5EID0gXAorCXBjYXAuM3BjYXAuaW4gXAorCXBjYXBfY29tcGlsZS4zcGNhcC5pbiBcCisJcGNhcF9kYXRhbGluay4zcGNhcC5pbiBcCisJcGNhcF9kdW1wX29wZW4uM3BjYXAuaW4gXAorCXBjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAuaW4gXAorCXBjYXBfbGlzdF90c3RhbXBfdHlwZXMuM3BjYXAuaW4gXAorCXBjYXBfb3Blbl9kZWFkLjNwY2FwLmluIFwKKwlwY2FwX29wZW5fb2ZmbGluZS4zcGNhcC5pbiBcCisJcGNhcF9zZXRfdHN0YW1wX3R5cGUuM3BjYXAuaW4KKworTUFOM1BDQVBfTk9FWFBBTkQgPSBcCisJcGNhcF9hY3RpdmF0ZS4zcGNhcCBcCisJcGNhcF9icmVha2xvb3AuM3BjYXAgXAorCXBjYXBfY2FuX3NldF9yZm1vbi4zcGNhcCBcCisJcGNhcF9jbG9zZS4zcGNhcCBcCisJcGNhcF9jcmVhdGUuM3BjYXAgXAorCXBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwuM3BjYXAgXAorCXBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUuM3BjYXAgXAorCXBjYXBfZHVtcC4zcGNhcCBcCisJcGNhcF9kdW1wX2Nsb3NlLjNwY2FwIFwKKwlwY2FwX2R1bXBfZmlsZS4zcGNhcCBcCisJcGNhcF9kdW1wX2ZsdXNoLjNwY2FwIFwKKwlwY2FwX2R1bXBfZnRlbGwuM3BjYXAgXAorCXBjYXBfZmlsZS4zcGNhcCBcCisJcGNhcF9maWxlbm8uM3BjYXAgXAorCXBjYXBfZmluZGFsbGRldnMuM3BjYXAgXAorCXBjYXBfZnJlZWNvZGUuM3BjYXAgXAorCXBjYXBfZ2V0X3NlbGVjdGFibGVfZmQuM3BjYXAgXAorCXBjYXBfZ2V0ZXJyLjNwY2FwIFwKKwlwY2FwX2luamVjdC4zcGNhcCBcCisJcGNhcF9pc19zd2FwcGVkLjNwY2FwIFwKKwlwY2FwX2xpYl92ZXJzaW9uLjNwY2FwIFwKKwlwY2FwX2xvb2t1cGRldi4zcGNhcCBcCisJcGNhcF9sb29rdXBuZXQuM3BjYXAgXAorCXBjYXBfbG9vcC4zcGNhcCBcCisJcGNhcF9tYWpvcl92ZXJzaW9uLjNwY2FwIFwKKwlwY2FwX25leHRfZXguM3BjYXAgXAorCXBjYXBfb2ZmbGluZV9maWx0ZXIuM3BjYXAgXAorCXBjYXBfb3Blbl9saXZlLjNwY2FwIFwKKwlwY2FwX3NldF9idWZmZXJfc2l6ZS4zcGNhcCBcCisJcGNhcF9zZXRfZGF0YWxpbmsuM3BjYXAgXAorCXBjYXBfc2V0X3Byb21pc2MuM3BjYXAgXAorCXBjYXBfc2V0X3JmbW9uLjNwY2FwIFwKKwlwY2FwX3NldF9zbmFwbGVuLjNwY2FwIFwKKwlwY2FwX3NldF90aW1lb3V0LjNwY2FwIFwKKwlwY2FwX3NldGRpcmVjdGlvbi4zcGNhcCBcCisJcGNhcF9zZXRmaWx0ZXIuM3BjYXAgXAorCXBjYXBfc2V0bm9uYmxvY2suM3BjYXAgXAorCXBjYXBfc25hcHNob3QuM3BjYXAgXAorCXBjYXBfc3RhdHMuM3BjYXAgXAorCXBjYXBfc3RhdHVzdG9zdHIuM3BjYXAgXAorCXBjYXBfc3RyZXJyb3IuM3BjYXAgXAorCXBjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwuM3BjYXAgXAorCXBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUuM3BjYXAKKworTUFOM1BDQVAgPSAkKE1BTjNQQ0FQX05PRVhQQU5EKSAkKE1BTjNQQ0FQX0VYUEFORDouaW49KQorCitNQU5GSUxFID0gXAorCXBjYXAtc2F2ZWZpbGUubWFuZmlsZS5pbgorCitNQU5NSVNDID0gXAorCXBjYXAtZmlsdGVyLm1hbm1pc2MuaW4gXAorCXBjYXAtbGlua3R5cGUubWFubWlzYy5pbiBcCisJcGNhcC10c3RhbXAubWFubWlzYy5pbgorCitFWFRSQV9ESVNUID0gXAorCSQoVEVTVFNfU1JDKSBcCisJQ0hBTkdFUyBcCisJQ2htb2RCUEYvQ2htb2RCUEYgXAorCUNobW9kQlBGL1N0YXJ0dXBQYXJhbWV0ZXJzLnBsaXN0IFwKKwlDUkVESVRTIFwKKwlJTlNUQUxMLnR4dCBcCisJTElDRU5TRSBcCisJTWFrZWZpbGUuaW4gXAorCVJFQURNRSBcCisJUkVBRE1FLmFpeCBcCisJUkVBRE1FLmRhZyBcCisJUkVBRE1FLmhwdXggXAorCVJFQURNRS5saW51eCBcCisJUkVBRE1FLm1hY29zeCBcCisJUkVBRE1FLnNlcHRlbCBcCisJUkVBRE1FLnNpdGEgXAorCVJFQURNRS50cnU2NCBcCisJUkVBRE1FLldpbjMyIFwKKwlTVU5PUzQvbml0X2lmLm8uc3BhcmMgXAorCVNVTk9TNC9uaXRfaWYuby5zdW4zIFwKKwlTVU5PUzQvbml0X2lmLm8uc3VuNGMuNC4wLjNjIFwKKwlUT0RPIFwKKwlWRVJTSU9OIFwKKwlhY2xvY2FsLm00IFwKKwlicGYvbmV0L2JwZl9maWx0ZXIuYyBcCisJY2htb2RfYnBmIFwKKwljb25maWcuZ3Vlc3MgXAorCWNvbmZpZy5oLmluIFwKKwljb25maWcuc3ViIFwKKwljb25maWd1cmUgXAorCWNvbmZpZ3VyZS5pbiBcCisJZGxwaXN1YnMuYyBcCisJZGxwaXN1YnMuaCBcCisJZmFkLWdldGFkLmMgXAorCWZhZC1naWZjLmMgXAorCWZhZC1nbGlmYy5jIFwKKwlmYWQtbnVsbC5jIFwKKwlmYWQtc2l0YS5jIFwKKwlmYWQtd2luMzIuYyBcCisJZ3JhbW1hci55IFwKKwlpbnN0YWxsLXNoIFwKKwlsYmwvb3MtYWl4NC5oIFwKKwlsYmwvb3MtaHB1eDExLmggXAorCWxibC9vcy1vc2Y0LmggXAorCWxibC9vcy1vc2Y1LmggXAorCWxibC9vcy1zb2xhcmlzMi5oIFwKKwlsYmwvb3Mtc3Vub3M0LmggXAorCWxibC9vcy11bHRyaXg0LmggXAorCW1pc3Npbmcvc25wcmludGYuYyBcCisJbWtkZXAgXAorCW1zZG9zL2JpbjJjLmMgXAorCW1zZG9zL2NvbW1vbi5kaiBcCisJbXNkb3MvbWFrZWZpbGUgXAorCW1zZG9zL21ha2VmaWxlLmRqIFwKKwltc2Rvcy9tYWtlZmlsZS53YyBcCisJbXNkb3MvbmRpczIuYyBcCisJbXNkb3MvbmRpczIuaCBcCisJbXNkb3MvbmRpc18wLmFzbSBcCisJbXNkb3MvcGt0X3J4MC5hc20gXAorCW1zZG9zL3BrdF9yeDEucyBcCisJbXNkb3MvcGt0ZHJ2ci5jIFwKKwltc2Rvcy9wa3RkcnZyLmggXAorCW1zZG9zL3JlYWRtZS5kb3MgXAorCW9yZy50Y3BkdW1wLmNobW9kX2JwZi5wbGlzdCBcCisJcGFja2FnaW5nL3BjYXAuc3BlYy5pbiBcCisJcGNhcC1icGYuYyBcCisJcGNhcC1idC1saW51eC5jIFwKKwlwY2FwLWJ0LWxpbnV4LmggXAorCXBjYXAtY2FuLWxpbnV4LmMgXAorCXBjYXAtY2FuLWxpbnV4LmggXAorCXBjYXAtY2FudXNiLWxpbnV4LmMgXAorCXBjYXAtY2FudXNiLWxpbnV4LmggXAorCXBjYXAtY29uZmlnLmluIFwKKwlwY2FwLWRhZy5jIFwKKwlwY2FwLWRhZy5oIFwKKwlwY2FwLWRscGkuYyBcCisJcGNhcC1kb3MuYyBcCisJcGNhcC1kb3MuaCBcCisJcGNhcC1lbmV0LmMgXAorCXBjYXAtaW50LmggXAorCXBjYXAtbGliZGxwaS5jIFwKKwlwY2FwLWxpbnV4LmMgXAorCXBjYXAtbmFtZWRiLmggXAorCXBjYXAtbmV0ZmlsdGVyLWxpbnV4LmMgXAorCXBjYXAtbmV0ZmlsdGVyLWxpbnV4LmggXAorCXBjYXAtbml0LmMgXAorCXBjYXAtbnVsbC5jIFwKKwlwY2FwLXBmLmMgXAorCXBjYXAtc2VwdGVsLmMgXAorCXBjYXAtc2VwdGVsLmggXAorCXBjYXAtc2l0YS5oIFwKKwlwY2FwLXNpdGEuYyBcCisJcGNhcC1zaXRhLmh0bWwgXAorCXBjYXAtc25mLmMgXAorCXBjYXAtc25mLmggXAorCXBjYXAtc25pdC5jIFwKKwlwY2FwLXNub29wLmMgXAorCXBjYXAtdXNiLWxpbnV4LmMgXAorCXBjYXAtdXNiLWxpbnV4LmggXAorCXBjYXAtd2luMzIuYyBcCisJcnVubGV4LnNoIFwKKwlzY2FubmVyLmwgXAorCVdpbjMyL0luY2x1ZGUvR251Yy5oIFwKKwlXaW4zMi9JbmNsdWRlL2FkZHJpbmZvLmggXAorCVdpbjMyL0luY2x1ZGUvYml0dHlwZXMuaCBcCisJV2luMzIvSW5jbHVkZS9jZGVjbF9leHQuaCBcCisJV2luMzIvSW5jbHVkZS9pbmV0cHJpdmF0ZS5oIFwKKwlXaW4zMi9JbmNsdWRlL2lwNl9taXNjLmggXAorCVdpbjMyL0luY2x1ZGUvc29ja3N0b3JhZ2UuaCBcCisJV2luMzIvSW5jbHVkZS9hcnBhL25hbWVzZXIuaCBcCisJV2luMzIvSW5jbHVkZS9uZXQvaWYuaCBcCisJV2luMzIvSW5jbHVkZS9uZXQvbmV0ZGIuaCBcCisJV2luMzIvSW5jbHVkZS9uZXQvcGF0aHMuaCBcCisJV2luMzIvUHJqL2xpYnBjYXAuZHNwIFwKKwlXaW4zMi9QcmovbGlicGNhcC5kc3cgXAorCVdpbjMyL1NyYy9mZnMuYyBcCisJV2luMzIvU3JjL2dhaV9zdHJlcnJvci5jIFwKKwlXaW4zMi9TcmMvZ2V0YWRkcmluZm8uYyBcCisJV2luMzIvU3JjL2dldG5ldGJ5bm0uYyBcCisJV2luMzIvU3JjL2dldG5ldGVudC5jIFwKKwlXaW4zMi9TcmMvZ2V0b3B0LmMgXAorCVdpbjMyL1NyYy9nZXRzZXJ2ZW50LmMgXAorCVdpbjMyL1NyYy9pbmV0X2F0b24uYyBcCisJV2luMzIvU3JjL2luZXRfbmV0LmMgXAorCVdpbjMyL1NyYy9pbmV0X3B0b24uYworCithbGw6IGxpYnBjYXAuYSBzaGFyZWQgcGNhcC1jb25maWcKKworbGlicGNhcC5hOiAkKE9CSikKKwlAcm0gLWYgJEAKKwkkKEFSKSByYyAkQCAkKE9CSikgJChBRERMQVJDSElWRU9CSlMpCisJJChSQU5MSUIpICRACisKK3NoYXJlZDogbGlicGNhcC4kKERZRVhUKQorCitsaWJwY2FwLnNvOiAkKE9CSikKKwlAcm0gLWYgJEAKKwlWRVI9YGNhdCAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwlNQUpPUl9WRVI9YHNlZCAncy9cKFswLTldWzAtOV0qXClcLi4qL1wxLycgJChzcmNkaXIpL1ZFUlNJT05gOyBcCisJQFZfU0hMSUJfQ01EQCBAVl9TSExJQl9PUFRAIEBWX1NPTkFNRV9PUFRAJEAuJCRNQUpPUl9WRVIgJChMREZMQUdTKSBcCisJICAgIC1vICRALiQkVkVSICQoT0JKKSAkKEFERExPQkpTKSAkKExJQlMpCisKKyMKKyMgVGhlIGZvbGxvd2luZyBydWxlIHN1Y2NlZWRzLCBidXQgdGhlIHJlc3VsdCBpcyB1bnRlc3RlZC4KKyMKKyMgSW4gTWFjIE9TIFgsIHRoZSBsaWJwY2FwIGR5bGliIGhhcyB0aGUgbmFtZSAibGlicGNhcC5BLmR5bGliIiwgd2l0aAorIyBpdHMgZnVsbCBwYXRoIGFzIHRoZSBpbnN0YWxsX25hbWUsIGFuZCB3aXRoIHRoZSBjb21wYXRpYmlsaXR5IGFuZAorIyBjdXJyZW50IHZlcnNpb24gYm90aCBzZXQgdG8gMS4gIFRoZSBjb21wYXRpYmlsaXR5IHZlcnNpb24gaXMgc2V0IHRvCisjIDEgc28gdGhhdCBwcm9ncmFtcyBidWlsdCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB3aWxsIHJ1bgorIyBhZ2FpbnN0IG9sZGVyIHZlcnNpb25zOyBtdWx0aS1wbGF0Zm9ybSBzb2Z0d2FyZSBwcm9iYWJseSB3aWxsIGZhaWwgaWYKKyMgaXQgdXNlcyBBUElzIGFkZGVkIGluIHRoZSBuZXdlciB2ZXJzaW9uLCBidXQgTWFjIE9TIFgtc3BlY2lmaWMgc29mdHdhcmUKKyMgd2lsbCB1c2Ugd2VhayBsaW5raW5nIGFuZCBjaGVjayBhdCBydW4gdGltZSB3aGV0aGVyIHRob3NlIEFQSXMgYXJlCisjIGF2YWlsYWJsZS4KKyMKKyMgV2UgYWxzbyB1c2UgIkEiIGFzIHRoZSBtYWpvciB2ZXJzaW9uLCBhbmQgMSBhcyB0aGUgY29tcGF0aWJpbGl0eSB2ZXJzaW9uLAorIyBidXQgc2V0IHRoZSBjdXJyZW50IHZlcnNpb24gdG8gdGhlIHZhbHVlIGluIFZFUlNJT04sIHdpdGggYW55IG5vbi1udW1lcmljCisjIHN0dWZmIHN0cmlwcGVkIG9mZiAodGhlIGNvbXBhdGliaWxpdHkgYW5kIGN1cnJlbnQgdmVyc2lvbiBtdXN0IGJlIG9mIHRoZQorIyBmb3JtIFhbLllbLlpdXSwgd2l0aCBZIGFuZCBaIHBvc3NpYmx5IGFic2VudCwgYW5kIHdpdGggYWxsIGNvbXBvbmVudHMKKyMgbnVtZXJpYykuCisjCitsaWJwY2FwLmR5bGliOiAkKE9CSikKKwlybSAtZiBsaWJwY2FwKi5keWxpYgorCVZFUj1gY2F0ICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCU1BSk9SX1ZFUj1BOyBcCisJQ09NUEFUX1ZFUj0xOyBcCisJQ1VSUkVOVF9WRVI9YHNlZCAncy9bXjAtOS5dLiokJC8vJyAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwkkKENDKSAtZHluYW1pY2xpYiAtdW5kZWZpbmVkIGVycm9yICQoTERGTEFHUykgXAorCSAgICAtbyBsaWJwY2FwLiQkVkVSLmR5bGliICQoT0JKKSAkKEFERExPQkpTKSAkKExJQlMpIFwKKwkgICAgLWluc3RhbGxfbmFtZSAkKGxpYmRpcikvbGlicGNhcC4kJE1BSk9SX1ZFUi5keWxpYiBcCisJICAgIC1jb21wYXRpYmlsaXR5X3ZlcnNpb24gJCRDT01QQVRfVkVSIFwKKwkgICAgLWN1cnJlbnRfdmVyc2lvbiAkJENVUlJFTlRfVkVSCisKKyMKKyMgVGhlIEhQLVVYIGxpbmtlciBtYW51YWwgc2F5cyB0aGF0IHRoZSBjb252ZW50aW9uIGZvciBhIHZlcnNpb25lZCBsaWJyYXJ5CisjIGlzIGxpYlhYWC57bnVtYmVyfSwgbm90IGxpYlhYWC5zbC57bnVtYmVyfS4gIFRoYXQgYXBwZWFycyB0byBiZSB0aGUgY2FzZQorIyBvbiBhdCBsZWFzdCBvbmUgSFAtVVggMTEuMDAgc3lzdGVtOyBsaWJYWFguc2wgaXMgYSBzeW1saW5rIHRvCisjIGxpYlhYWC57bnVtYmVyfS4KKyMKKyMgVGhlIG1hbnVhbCBhbHNvIHNheXMgImxpYnJhcnktbGV2ZWwgdmVyc2lvbmluZyIgKHRoaW5rICJzb25hbWVzIikgd2FzCisjIGFkZGVkIGluIEhQLVVYIDEwLjAuCisjCisjIFhYWCAtIHRoaXMgYXNzdW1lcyB3ZSdyZSB1c2luZyB0aGUgSFAgbGlua2VyLCByYXRoZXIgdGhhbiB0aGUgR05VCisjIGxpbmtlciwgZXZlbiB3aXRoIEdDQy4KKyMKK2xpYnBjYXAuc2w6ICQoT0JKKQorCUBNQUpPUl9WRVI9YHNlZCAncy9cKFswLTldWzAtOV0qXClcLi4qL1wxLycgJChzcmNkaXIpL1ZFUlNJT05gOyBcCisJcm0gLWYgbGlicGNhcC4kJE1BSk9SX1ZFUgorCU1BSk9SX1ZFUj1gc2VkICdzL1woWzAtOV1bMC05XSpcKVwuLiovXDEvJyAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwlsZCAtYiAkKExERkxBR1MpIC1vIGxpYnBjYXAuJCRNQUpPUl9WRVIgK2ggbGlicGNhcC4kJE1BSk9SX1ZFUiBcCisJICAgICQoT0JKKSAkKEFERExPQkpTKSAkKExJQlMpCisKKyMKKyMgQUlYIGlzIGRpZmZlcmVudCBmcm9tIGV2ZXJ5Ym9keSBlbHNlLiAgQSBzaGFyZWQgbGlicmFyeSBpcyBhbiBhcmNoaXZlCisjIGxpYnJhcnkgd2l0aCBvbmUgb3IgbW9yZSBzaGFyZWQtb2JqZWN0IGNvbXBvbmVudHMuICBXZSBzdGlsbCBidWlsZCBhCisjIG5vcm1hbCBzdGF0aWMgYXJjaGl2ZSBsaWJyYXJ5IG9uIEFJWCwgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSB0cmFkaXRpb25hbAorIyBzY2hlbWUgb2YgYnVpbGRpbmcgbGlicGNhcCBhbmQgdGNwZHVtcCBpbiBzdWJkaXJlY3RvcmllcyBvZiB0aGUKKyMgc2FtZSBkaXJlY3RvcnksIHdpdGggdGNwZHVtcCBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIHRoZSBsaWJwY2FwCisjIGluIHF1ZXN0aW9uLCBidXQgd2UgYWxzbyBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5IGFzICJsaWJwY2FwLnNoYXJlZGEiCisjIGFuZCBpbnN0YWxsICppdCosIHJhdGhlciB0aGFuIHRoZSBzdGF0aWMgbGlicmFyeSwgYXMgImxpYnBjYXAuYSIuCisjCitsaWJwY2FwLnNoYXJlZGE6ICQoT0JKKQorCUBybSAtZiAkQCBzaHIubworCSQoQ0MpIEBWX1NITElCX09QVEAgLW8gc2hyLm8gJChPQkopICQoQURETE9CSlMpICQoTERGTEFHUykgJChMSUJTKQorCSQoQVIpIHJjICRAIHNoci5vCisKKyMKKyMgRm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyAob3Igb24gd2hpY2ggd2UKKyMgZG9uJ3Qgc3VwcG9ydCBzaGFyZWQgbGlicmFyaWVzKS4KKyMKK2xpYnBjYXAubm9uZToKKworc2Nhbm5lci5jOiAkKHNyY2Rpcikvc2Nhbm5lci5sCisJQHJtIC1mICRACisJJChzcmNkaXIpL3J1bmxleC5zaCAkKExFWCkgLW8kQCAkPAorCitzY2FubmVyLm86IHNjYW5uZXIuYyB0b2tkZWZzLmgKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtYyBzY2FubmVyLmMKKworcGNhcC5vOiB2ZXJzaW9uLmgKKwordG9rZGVmcy5oOiBncmFtbWFyLmMKK2dyYW1tYXIuYzogJChzcmNkaXIpL2dyYW1tYXIueQorCUBybSAtZiBncmFtbWFyLmMgdG9rZGVmcy5oCisJJChZQUNDKSAtZCAkPAorCW12IHkudGFiLmMgZ3JhbW1hci5jCisJbXYgeS50YWIuaCB0b2tkZWZzLmgKKworZ3JhbW1hci5vOiBncmFtbWFyLmMKKwlAcm0gLWYgJEAKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtRHl5bHZhbD1wY2FwX2x2YWwgLWMgZ3JhbW1hci5jCisKK3ZlcnNpb24ubzogdmVyc2lvbi5jCisJJChDQykgJChGVUxMX0NGTEFHUykgLWMgdmVyc2lvbi5jCisKK3NucHJpbnRmLm86ICQoc3JjZGlyKS9taXNzaW5nL3NucHJpbnRmLmMKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtbyAkQCAtYyAkKHNyY2RpcikvbWlzc2luZy9zbnByaW50Zi5jCisKK3ZlcnNpb24uYzogJChzcmNkaXIpL1ZFUlNJT04KKwlAcm0gLWYgJEAKKwlpZiBncmVwIEdJVCAke3NyY2Rpcn0vVkVSU0lPTiA+L2Rldi9udWxsOyB0aGVuIFwKKwkJcmVhZCB2ZXIgPCR7c3JjZGlyfS9WRVJTSU9OOyBcCisJCWVjaG8gJCR2ZXIgfCB0ciAtZCAnXDAxMic7IFwKKwkJZGF0ZSArXyVZXyVtXyVkOyBcCisJZWxzZSBcCisJCWNhdCAke3NyY2Rpcn0vVkVSU0lPTjsgXAorCWZpIHwgc2VkIC1lICdzLy4qL2NoYXIgcGNhcF92ZXJzaW9uW10gPSAiJiI7LycgPiAkQAorCisjCisjIE5PVEU6IHRoaXMgcmVhbGx5IGlzIHN1cHBvc2VkIHRvIGJlIHN0YXRpYzsgaW1wb3J0aW5nIGEgc3RyaW5nCisjIGZyb20gYSBzaGFyZWQgbGlicmFyeSBkb2VzIG5vdCB3b3JrIHZlcnkgd2VsbCBvbiBtYW55CisjIHZlcnNpb25zIG9mIFVOSVggKFNvbGFyaXMsIExpbnV4LCBhbmQgdGhlIEJTRHMsIGZvciBleGFtcGxlKSwKKyMgc28gd2UgbWFrZSB0aGUgdmVyc2lvbiBzdHJpbmcgc3RhdGljIGFuZCByZXR1cm4gaXQgZnJvbQorIyBhIGZ1bmN0aW9uLCB3aGljaCBkb2VzIHdvcmsuCisjCit2ZXJzaW9uLmg6ICQoc3JjZGlyKS9WRVJTSU9OCisJQHJtIC1mICRACisJaWYgZ3JlcCBHSVQgJHtzcmNkaXJ9L1ZFUlNJT04gPi9kZXYvbnVsbDsgdGhlbiBcCisJCXJlYWQgdmVyIDwke3NyY2Rpcn0vVkVSU0lPTjsgXAorCQllY2hvICQkdmVyIHwgdHIgLWQgJ1wwMTInOyBcCisJCWRhdGUgK18lWV8lbV8lZDsgXAorCWVsc2UgXAorCQljYXQgJHtzcmNkaXJ9L1ZFUlNJT047IFwKKwlmaSB8IHNlZCAtZSAncy8uKi9zdGF0aWMgY29uc3QgY2hhciBwY2FwX3ZlcnNpb25fc3RyaW5nW10gPSAibGlicGNhcCB2ZXJzaW9uICYiOy8nID4gJEAKKworYnBmX2ZpbHRlci5jOiAkKHNyY2RpcikvYnBmL25ldC9icGZfZmlsdGVyLmMKKwlybSAtZiBicGZfZmlsdGVyLmMKKwlsbiAtcyAkKHNyY2RpcikvYnBmL25ldC9icGZfZmlsdGVyLmMgYnBmX2ZpbHRlci5jCisKK2JwZl9maWx0ZXIubzogYnBmX2ZpbHRlci5jCisJJChDQykgJChGVUxMX0NGTEFHUykgLWMgYnBmX2ZpbHRlci5jCisKKyMKKyMgR2VuZXJhdGUgdGhlIHBjYXAtY29uZmlnIHNjcmlwdC4KKyMKKyMgU29tZSBNYWtlcywgZS5nLiBBSVggTWFrZSBhbmQgU29sYXJpcyBNYWtlLCBjYW4ndCBoYW5kbGUgIi0tZmlsZT0kQC50bXA6JDwiOworIyBmb3IgZXhhbXBsZSwgdGhlIFNvbGFyaXMgOSBtYWtlIG1hbiBwYWdlIHNheXMKKyMKKyMJQmVjYXVzZSBtYWtlIGFzc2lnbnMgJDwgYW5kICQqIGFzIGl0IHdvdWxkIGZvciBpbXBsaWNpdCBydWxlcworIwkoYWNjb3JkaW5nIHRvIHRoZSBzdWZmaXhlcyBsaXN0IGFuZCB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzKSwKKyMJdGhleSBtYXkgYmUgdW5yZWxpYWJsZSB3aGVuIHVzZWQgd2l0aGluIGV4cGxpY2l0IHRhcmdldCBlbnRyaWVzLgorIworIyBhbmQgdGhpcyBpcyBhbiBleHBsaWNpdCB0YXJnZXQgZW50cnkuCisjCisjIFRoZXJlZm9yZSwgaW5zdGVhZCBvZiB1c2luZyAkPCwgd2UgZXhwbGljaXRseSBwdXQgaW4gJChzcmNkaXIpL3BjYXAtY29uZmlnLmluLgorIworcGNhcC1jb25maWc6ICQoc3JjZGlyKS9wY2FwLWNvbmZpZy5pbiAuL2NvbmZpZy5zdGF0dXMKKwlAcm0gLWYgJEAgJEAudG1wCisJLi9jb25maWcuc3RhdHVzIC0tZmlsZT0kQC50bXA6JChzcmNkaXIpL3BjYXAtY29uZmlnLmluCisJbXYgJEAudG1wICRACisJY2htb2QgYSt4ICRACisKKyMKKyMgVGVzdCBwcm9ncmFtcyAtIG5vdCBidWlsdCBieSBkZWZhdWx0LCBhbmQgbm90IGluc3RhbGxlZC4KKyMKK3Rlc3RzOiAkKFRFU1RTKQorCitmaWx0ZXJ0ZXN0OiB0ZXN0cy9maWx0ZXJ0ZXN0LmMgbGlicGNhcC5hCisJJChDQykgJChGVUxMX0NGTEFHUykgLUkuIC1MLiAtbyBmaWx0ZXJ0ZXN0ICQoc3JjZGlyKS90ZXN0cy9maWx0ZXJ0ZXN0LmMgbGlicGNhcC5hICQoTElCUykKKworZmluZGFsbGRldnN0ZXN0OiB0ZXN0cy9maW5kYWxsZGV2c3Rlc3QuYyBsaWJwY2FwLmEKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtSS4gLUwuIC1vIGZpbmRhbGxkZXZzdGVzdCAkKHNyY2RpcikvdGVzdHMvZmluZGFsbGRldnN0ZXN0LmMgbGlicGNhcC5hICQoTElCUykKKworbm9uYmxvY2t0ZXN0OiB0ZXN0cy9ub25ibG9ja3Rlc3QuYyBsaWJwY2FwLmEKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtSS4gLUwuIC1vIG5vbmJsb2NrdGVzdCAkKHNyY2RpcikvdGVzdHMvbm9uYmxvY2t0ZXN0LmMgbGlicGNhcC5hICQoTElCUykKKworb3BlbnRlc3Q6IHRlc3RzL29wZW50ZXN0LmMgbGlicGNhcC5hCisJJChDQykgJChGVUxMX0NGTEFHUykgLUkuIC1MLiAtbyBvcGVudGVzdCAkKHNyY2RpcikvdGVzdHMvb3BlbnRlc3QuYyBsaWJwY2FwLmEgJChMSUJTKQorCitzZWxwb2xsdGVzdDogdGVzdHMvc2VscG9sbHRlc3QuYyBsaWJwY2FwLmEKKwkkKENDKSAkKEZVTExfQ0ZMQUdTKSAtSS4gLUwuIC1vIHNlbHBvbGx0ZXN0ICQoc3JjZGlyKS90ZXN0cy9zZWxwb2xsdGVzdC5jIGxpYnBjYXAuYSAkKExJQlMpCisKK2luc3RhbGw6IGluc3RhbGwtc2hhcmVkIGluc3RhbGwtYXJjaGl2ZSBwY2FwLWNvbmZpZworCVsgLWQgJChERVNURElSKSQobGliZGlyKSBdIHx8IFwKKwkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKGxpYmRpcik7IGNobW9kIDc1NSAkKERFU1RESVIpJChsaWJkaXIpKQorCVsgLWQgJChERVNURElSKSQoaW5jbHVkZWRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChpbmNsdWRlZGlyKTsgY2htb2QgNzU1ICQoREVTVERJUikkKGluY2x1ZGVkaXIpKQorCVsgLWQgJChERVNURElSKSQoaW5jbHVkZWRpcikvcGNhcCBdIHx8IFwKKwkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3BjYXA7IGNobW9kIDc1NSAkKERFU1RESVIpJChpbmNsdWRlZGlyKS9wY2FwKQorCVsgLWQgJChERVNURElSKSQobWFuZGlyKS9tYW4xIF0gfHwgXAorCSAgICAobWtkaXIgLXAgJChERVNURElSKSQobWFuZGlyKS9tYW4xOyBjaG1vZCA3NTUgJChERVNURElSKSQobWFuZGlyKS9tYW4xKQorCVsgLWQgJChERVNURElSKSQobWFuZGlyKS9tYW4zIF0gfHwgXAorCSAgICAobWtkaXIgLXAgJChERVNURElSKSQobWFuZGlyKS9tYW4zOyBjaG1vZCA3NTUgJChERVNURElSKSQobWFuZGlyKS9tYW4zKQorCVsgLWQgJChERVNURElSKSQobWFuZGlyKS9tYW5ATUFOX0ZJTEVfRk9STUFUU0AgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChtYW5kaXIpL21hbkBNQU5fRklMRV9GT1JNQVRTQDsgY2htb2QgNzU1ICQoREVTVERJUikkKG1hbmRpcikvbWFuQE1BTl9GSUxFX0ZPUk1BVFNAKQorCVsgLWQgJChERVNURElSKSQobWFuZGlyKS9tYW5ATUFOX01JU0NfSU5GT0AgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChtYW5kaXIpL21hbkBNQU5fTUlTQ19JTkZPQDsgY2htb2QgNzU1ICQoREVTVERJUikkKG1hbmRpcikvbWFuQE1BTl9NSVNDX0lORk9AKQorCWZvciBpIGluICQoUFVCSERSKTsgZG8gXAorCQkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpLyQkaSBcCisJCSAgICAkKERFU1RESVIpJChpbmNsdWRlZGlyKS8kJGk7IGRvbmUKKwlbIC1kICQoREVTVERJUikkKGJpbmRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChiaW5kaXIpOyBjaG1vZCA3NTUgJChERVNURElSKSQoYmluZGlyKSkKKwkkKElOU1RBTExfUFJPR1JBTSkgcGNhcC1jb25maWcgJChERVNURElSKSQoYmluZGlyKS9wY2FwLWNvbmZpZworCWZvciBpIGluICQoTUFOMSk7IGRvIFwKKwkJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS8kJGkgXAorCQkgICAgJChERVNURElSKSQobWFuZGlyKS9tYW4xLyQkaTsgZG9uZQorCWZvciBpIGluICQoTUFOM1BDQVBfTk9FWFBBTkQpOyBkbyBcCisJCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvJCRpIFwKKwkJICAgICQoREVTVERJUikkKG1hbmRpcikvbWFuMy8kJGk7IGRvbmUKKwlmb3IgaSBpbiAkKE1BTjNQQ0FQX0VYUEFORDouaW49KTsgZG8gXAorCQkkKElOU1RBTExfREFUQSkgJCRpIFwKKwkJICAgICQoREVTVERJUikkKG1hbmRpcikvbWFuMy8kJGk7IGRvbmUKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24uM3BjYXAKKwlsbiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZS4zcGNhcCBcCisJCSAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24uM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9kdW1wX2ZvcGVuLjNwY2FwCisJbG4gJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZHVtcF9vcGVuLjNwY2FwIFwKKwkJICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2R1bXBfZm9wZW4uM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9mcmVlYWxsZGV2cy4zcGNhcAorCWxuICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2ZpbmRhbGxkZXZzLjNwY2FwIFwKKwkJICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2ZyZWVhbGxkZXZzLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfcGVycm9yLjNwY2FwCisJbG4gJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZ2V0ZXJyLjNwY2FwIFwKKwkJICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX3BlcnJvci4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX3NlbmRwYWNrZXQuM3BjYXAKKwlsbiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9pbmplY3QuM3BjYXAgXAorCQkgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfc2VuZHBhY2tldC4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2ZyZWVfZGF0YWxpbmtzLjNwY2FwCisJbG4gJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAgXAorCQkgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZnJlZV9kYXRhbGlua3MuM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9mcmVlX3RzdGFtcF90eXBlcy4zcGNhcAorCWxuICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwIFwKKwkJICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2ZyZWVfdHN0YW1wX3R5cGVzLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZGlzcGF0Y2guM3BjYXAKKwlsbiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9sb29wLjNwY2FwIFwKKwkJICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2Rpc3BhdGNoLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfbWlub3JfdmVyc2lvbi4zcGNhcAorCWxuICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX21ham9yX3ZlcnNpb24uM3BjYXAgXAorCQkgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfbWlub3JfdmVyc2lvbi4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX25leHQuM3BjYXAKKwlsbiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9uZXh0X2V4LjNwY2FwIFwKKwkJICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX25leHQuM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9mb3Blbl9vZmZsaW5lLjNwY2FwCisJbG4gJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfb3Blbl9vZmZsaW5lLjNwY2FwIFwKKwkJICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2ZvcGVuX29mZmxpbmUuM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9nZXRub25ibG9jay4zcGNhcAorCWxuICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX3NldG5vbmJsb2NrLjNwY2FwIFwKKwkJICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2dldG5vbmJsb2NrLjNwY2FwCisJZm9yIGkgaW4gJChNQU5GSUxFKTsgZG8gXAorCQkkKElOU1RBTExfREFUQSkgYGVjaG8gJCRpIHwgc2VkICdzLy5tYW5maWxlLmluLy5tYW5maWxlLydgIFwKKwkJICAgICQoREVTVERJUikkKG1hbmRpcikvbWFuQE1BTl9GSUxFX0ZPUk1BVFNAL2BlY2hvICQkaSB8IHNlZCAncy8ubWFuZmlsZS5pbi8uQE1BTl9GSUxFX0ZPUk1BVFNALydgOyBkb25lCisJZm9yIGkgaW4gJChNQU5NSVNDKTsgZG8gXAorCQkkKElOU1RBTExfREFUQSkgYGVjaG8gJCRpIHwgc2VkICdzLy5tYW5taXNjLmluLy5tYW5taXNjLydgIFwKKwkJICAgICQoREVTVERJUikkKG1hbmRpcikvbWFuQE1BTl9NSVNDX0lORk9AL2BlY2hvICQkaSB8IHNlZCAncy8ubWFubWlzYy5pbi8uQE1BTl9NSVNDX0lORk9ALydgOyBkb25lCisKK2luc3RhbGwtc2hhcmVkOiBpbnN0YWxsLXNoYXJlZC0kKERZRVhUKQoraW5zdGFsbC1zaGFyZWQtc286IGxpYnBjYXAuc28KKwlbIC1kICQoREVTVERJUikkKGxpYmRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChsaWJkaXIpOyBjaG1vZCA3NTUgJChERVNURElSKSQobGliZGlyKSkKKwlWRVI9YGNhdCAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwlNQUpPUl9WRVI9YHNlZCAncy9cKFswLTldWzAtOV0qXClcLi4qL1wxLycgJChzcmNkaXIpL1ZFUlNJT05gOyBcCisJJChJTlNUQUxMX1BST0dSQU0pIGxpYnBjYXAuc28uJCRWRVIgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLnNvLiQkVkVSOyBcCisJbG4gLXNmIGxpYnBjYXAuc28uJCRWRVIgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLnNvLiQkTUFKT1JfVkVSOyBcCisJbG4gLXNmIGxpYnBjYXAuc28uJCRNQUpPUl9WRVIgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLnNvCitpbnN0YWxsLXNoYXJlZC1keWxpYjogbGlicGNhcC5keWxpYgorCVsgLWQgJChERVNURElSKSQobGliZGlyKSBdIHx8IFwKKwkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKGxpYmRpcik7IGNobW9kIDc1NSAkKERFU1RESVIpJChsaWJkaXIpKQorCVZFUj1gY2F0ICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCU1BSk9SX1ZFUj1BOyBcCisJJChJTlNUQUxMX1BST0dSQU0pIGxpYnBjYXAuJCRWRVIuZHlsaWIgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLiQkVkVSLmR5bGliOyBcCisJbG4gLXNmIGxpYnBjYXAuJCRWRVIuZHlsaWIgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLiQkTUFKT1JfVkVSLmR5bGliOyBcCisJbG4gLXNmIGxpYnBjYXAuJCRNQUpPUl9WRVIuZHlsaWIgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLmR5bGliCitpbnN0YWxsLXNoYXJlZC1zbDogbGlicGNhcC5zbAorCVsgLWQgJChERVNURElSKSQobGliZGlyKSBdIHx8IFwKKwkgICAgKG1rZGlyIC1wICQoREVTVERJUikkKGxpYmRpcik7IGNobW9kIDc1NSAkKERFU1RESVIpJChsaWJkaXIpKQorCU1BSk9SX1ZFUj1gc2VkICdzL1woWzAtOV1bMC05XSpcKVwuLiovXDEvJyAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwkkKElOU1RBTExfUFJPR1JBTSkgbGlicGNhcC4kJE1BSk9SX1ZFUiAkKERFU1RESVIpJChsaWJkaXIpCisJbG4gLXNmIGxpYnBjYXAuJCRNQUpPUl9WRVIgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLnNsCitpbnN0YWxsLXNoYXJlZC1zaGFyZWRhOiBsaWJwY2FwLnNoYXJlZGEKKwkjCisJIyBBSVggc2hhcmVkIGxpYnJhcmllcyBhcmUgd2VpcmQuICBUaGV5J3JlIGFyY2hpdmUgbGlicmFyaWVzCisJIyB3aXRoIG9uZSBvciBtb3JlIHNoYXJlZCBvYmplY3QgY29tcG9uZW50cy4KKwkjCisJWyAtZCAkKERFU1RESVIpJChsaWJkaXIpIF0gfHwgXAorCSAgICAobWtkaXIgLXAgJChERVNURElSKSQobGliZGlyKTsgY2htb2QgNzU1ICQoREVTVERJUikkKGxpYmRpcikpCisJJChJTlNUQUxMX1BST0dSQU0pIGxpYnBjYXAuc2hhcmVkYSAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuYQoraW5zdGFsbC1zaGFyZWQtbm9uZToKKworaW5zdGFsbC1hcmNoaXZlOiBpbnN0YWxsLWFyY2hpdmUtJChEWUVYVCkKK2luc3RhbGwtYXJjaGl2ZS1zbyBpbnN0YWxsLWFyY2hpdmUtZHlsaWIgaW5zdGFsbC1hcmNoaXZlLXNsIGluc3RhbGwtYXJjaGl2ZS1ub25lOiBsaWJwY2FwLmEKKwkjCisJIyBNb3N0IHBsYXRmb3JtcyBoYXZlIHNlcGFyYXRlIHN1ZmZpeGVzIGZvciBzaGFyZWQgYW5kCisJIyBhcmNoaXZlIGxpYnJhcmllcywgc28gd2UgaW5zdGFsbCBib3RoLgorCSMKKwlbIC1kICQoREVTVERJUikkKGxpYmRpcikgXSB8fCBcCisJICAgIChta2RpciAtcCAkKERFU1RESVIpJChsaWJkaXIpOyBjaG1vZCA3NTUgJChERVNURElSKSQobGliZGlyKSkKKwkkKElOU1RBTExfREFUQSkgbGlicGNhcC5hICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5hCisJJChSQU5MSUIpICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5hCitpbnN0YWxsLWFyY2hpdmUtc2hhcmVkYToKKwkjCisJIyBBSVgsIGhvd2V2ZXIsIGRvZXNuJ3QsIHNvIHdlIGRvbid0IGluc3RhbGwgdGhlIGFyY2hpdmUKKwkjIGxpYnJhcnkgb24gQUlYLgorCSMKKwordW5pbnN0YWxsOiB1bmluc3RhbGwtc2hhcmVkCisJcm0gLWYgJChERVNURElSKSQobGliZGlyKS9saWJwY2FwLmEKKwlmb3IgaSBpbiAkKFBVQkhEUik7IGRvIFwKKwkJcm0gLWYgJChERVNURElSKSQoaW5jbHVkZWRpcikvJCRpOyBkb25lCisJLXJtZGlyICQoREVTVERJUikkKGluY2x1ZGVkaXIpL3BjYXAKKwlybSAtZiAkKERFU1RESVIpLyQoYmluZGlyKS9wY2FwLWNvbmZpZworCWZvciBpIGluICQoTUFOMSk7IGRvIFwKKwkJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4xLyQkaTsgZG9uZQorCWZvciBpIGluICQoTUFOM1BDQVApOyBkbyBcCisJCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy8kJGk7IGRvbmUKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24uM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9kdW1wX2ZvcGVuLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZnJlZWFsbGRldnMuM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9wZXJyb3IuM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9zZW5kcGFja2V0LjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZnJlZV9kYXRhbGlua3MuM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9mcmVlX3RzdGFtcF90eXBlcy4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX2Rpc3BhdGNoLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfbWlub3JfdmVyc2lvbi4zcGNhcAorCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuMy9wY2FwX25leHQuM3BjYXAKKwlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbjMvcGNhcF9mb3Blbl9vZmZsaW5lLjNwY2FwCisJcm0gLWYgJChERVNURElSKSQobWFuZGlyKS9tYW4zL3BjYXBfZ2V0bm9uYmxvY2suM3BjYXAKKwlmb3IgaSBpbiAkKE1BTkZJTEUpOyBkbyBcCisJCXJtIC1mICQoREVTVERJUikkKG1hbmRpcikvbWFuQE1BTl9GSUxFX0ZPUk1BVFNAL2BlY2hvICQkaSB8IHNlZCAncy8ubWFuZmlsZS5pbi8uQE1BTl9GSUxFX0ZPUk1BVFNALydgOyBkb25lCisJZm9yIGkgaW4gJChNQU5NSVNDKTsgZG8gXAorCQlybSAtZiAkKERFU1RESVIpJChtYW5kaXIpL21hbkBNQU5fTUlTQ19JTkZPQC9gZWNobyAkJGkgfCBzZWQgJ3MvLm1hbm1pc2MuaW4vLkBNQU5fTUlTQ19JTkZPQC8nYDsgZG9uZQorCit1bmluc3RhbGwtc2hhcmVkOiB1bmluc3RhbGwtc2hhcmVkLSQoRFlFWFQpCit1bmluc3RhbGwtc2hhcmVkLXNvOgorCVZFUj1gY2F0ICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCU1BSk9SX1ZFUj1gc2VkICdzL1woWzAtOV1bMC05XSpcKVwuLiovXDEvJyAkKHNyY2RpcikvVkVSU0lPTmA7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuc28uJCRWRVI7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuc28uJCRNQUpPUl9WRVI7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuc28KK3VuaW5zdGFsbC1zaGFyZWQtZHlsaWI6CisJVkVSPWBjYXQgJChzcmNkaXIpL1ZFUlNJT05gOyBcCisJTUFKT1JfVkVSPUE7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuJCRWRVIuZHlsaWI7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuJCRNQUpPUl9WRVIuZHlsaWI7IFwKKwlybSAtZiAkKERFU1RESVIpJChsaWJkaXIpL2xpYnBjYXAuZHlsaWIKK3VuaW5zdGFsbC1zaGFyZWQtc2w6CisJTUFKT1JfVkVSPWBzZWQgJ3MvXChbMC05XVswLTldKlwpXC4uKi9cMS8nICQoc3JjZGlyKS9WRVJTSU9OYDsgXAorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC4kJE1BSk9SX1ZFUjsgXAorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5zbAordW5pbnN0YWxsLXNoYXJlZC1zaGFyZWRhOgorCXJtIC1mICQoREVTVERJUikkKGxpYmRpcikvbGlicGNhcC5hCit1bmluc3RhbGwtc2hhcmVkLW5vbmU6CisKK2NsZWFuOgorCXJtIC1mICQoQ0xFQU5GSUxFUykKKworZGlzdGNsZWFuOiBjbGVhbgorCXJtIC1mIE1ha2VmaWxlIGNvbmZpZy5jYWNoZSBjb25maWcubG9nIGNvbmZpZy5zdGF0dXMgXAorCSAgICBjb25maWcuaCBnbnVjLmggbmV0IG9zLXByb3RvLmggYnBmX2ZpbHRlci5jIHBjYXAtY29uZmlnIFwKKwkgICAgc3RhbXAtaCBzdGFtcC1oLmluCisJcm0gLWYgJChNQU4zUENBUF9FWFBBTkQ6LmluPSkgJChNQU5GSUxFOi5pbj0pICQoTUFOTUlTQzouaW49KQorCXJtIC1yZiBhdXRvbTR0ZS5jYWNoZQorCit0YWdzOiAkKFRBR0ZJTEVTKQorCWN0YWdzIC13dGQgJChUQUdGSUxFUykKKworcGFja2FnaW5nL3BjYXAuc3BlYzogcGFja2FnaW5nL3BjYXAuc3BlYy5pbiBWRVJTSU9OCisJUlBNVkVSU0lPTj1gY2F0IFZFUlNJT04gfCBzZWQgcy8tLiovL2dgOyBcCisJCXNlZCAtZSBzL0BWRVJTSU9OQC8kJFJQTVZFUlNJT04vIC1lIHMvQE5BTUVAL2xpYnBjYXAtYGNhdCBWRVJTSU9OYC8gJDwgICA+ICRACisKK3JlbGVhc2V0YXI6IAorCUBjd2Q9YHB3ZGAgOyBkaXI9YGJhc2VuYW1lICQkY3dkYCA7IG5hbWU9JChQUk9HKS1gY2F0IFZFUlNJT05gIDsgXAorCSAgIG1rZGlyICQkbmFtZTsgXAorCSAgIHRhciBjZiAtICQoQ1NSQykgJChIRFIpICQoTUFOMSkgJChNQU4zUENBUF9FWFBBTkQpIFwKKwkgICAgICAkKE1BTjNQQ0FQX05PRVhQQU5EKSAkKE1BTkZJTEUpICQoTUFOTUlTQykgJChFWFRSQV9ESVNUKSB8IFwKKwkgICAgICAoY2QgJCRuYW1lOyB0YXIgeGYgLSk7IFwKKwkgICB0YXIgLWMgLXogLWYgJCRuYW1lLnRhci5neiAkJG5hbWU7IFwKKwkgICBybSAtcmYgJCRuYW1lCisKK2RlcGVuZDoJJChHRU5TUkMpICQoR0VOSERSKSBicGZfZmlsdGVyLmMKKwkuL21rZGVwIC1jICQoQ0MpICQoREVGUykgJChJTkNMUykgJChTUkMpCisKK01ha2VmaWxlOiBNYWtlZmlsZS5pbiBjb25maWcuc3RhdHVzCisJLi9jb25maWcuc3RhdHVzCisJQGVjaG8geW91ciBNYWtlZmlsZSB3YXMgb3V0IG9mIGRhdGUsIG5vdyBydW4gJChNQUtFKSBhZ2FpbgorCWV4aXQgMQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9SRUFETUUgYi9saWJwY2FwLTEuMy4wL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjA2NDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9SRUFETUUKQEAgLTAsMCArMSwxMDUgQEAKK0AoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvUkVBRE1FLHYgMS4zNCAyMDA4LTEyLTE0IDE5OjQ0OjE0IGd1eSBFeHAgJCAoTEJMKQorCitMSUJQQ0FQIDEueC55CisKK3d3dy50Y3BkdW1wLm9yZworCitQbGVhc2Ugc2VuZCBpbnF1aXJpZXMvY29tbWVudHMvcmVwb3J0cyB0bzoKKwl0Y3BkdW1wLXdvcmtlcnNAbGlzdHMudGNwZHVtcC5vcmcKKworQW5vbnltb3VzIEdpdCBpcyBhdmFpbGFibGUgdmlhOgorCWdpdCBjbG9uZSBnaXQ6Ly9icGYudGNwZHVtcC5vcmcvbGlicGNhcAorCitWZXJzaW9uIDEueC55IG9mIExJQlBDQVAgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHRoZSBDVlMgdGFnICJsaWJwY2FwXzFfe3h9cmVse3l9IjoKKwljdnMgLWQgOnBzZXJ2ZXI6dGNwZHVtcEBjdnMudGNwZHVtcC5vcmc6L3RjcGR1bXAvbWFzdGVyIGNoZWNrb3V0IC1yIGxpYnBjYXBfMV97eH1yZWx7eX0gbGlicGNhcAorCitQbGVhc2Ugc3VibWl0IHBhdGNoZXMgYWdhaW5zdCB0aGUgbWFzdGVyIGNvcHkgdG8gdGhlIGxpYnBjYXAgcHJvamVjdCBvbgorc291cmNlZm9yZ2UubmV0LgorCitmb3JtZXJseSBmcm9tIAlMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWJvcmF0b3J5CisJCU5ldHdvcmsgUmVzZWFyY2ggR3JvdXAgPGxpYnBjYXBAZWUubGJsLmdvdj4KKwkJZnRwOi8vZnRwLmVlLmxibC5nb3YvbGlicGNhcC50YXIuWiAoMC40KQorCitUaGlzIGRpcmVjdG9yeSBjb250YWlucyBzb3VyY2UgY29kZSBmb3IgbGlicGNhcCwgYSBzeXN0ZW0taW5kZXBlbmRlbnQKK2ludGVyZmFjZSBmb3IgdXNlci1sZXZlbCBwYWNrZXQgY2FwdHVyZS4gIGxpYnBjYXAgcHJvdmlkZXMgYSBwb3J0YWJsZQorZnJhbWV3b3JrIGZvciBsb3ctbGV2ZWwgbmV0d29yayBtb25pdG9yaW5nLiAgQXBwbGljYXRpb25zIGluY2x1ZGUKK25ldHdvcmsgc3RhdGlzdGljcyBjb2xsZWN0aW9uLCBzZWN1cml0eSBtb25pdG9yaW5nLCBuZXR3b3JrIGRlYnVnZ2luZywKK2V0Yy4gIFNpbmNlIGFsbW9zdCBldmVyeSBzeXN0ZW0gdmVuZG9yIHByb3ZpZGVzIGEgZGlmZmVyZW50IGludGVyZmFjZQorZm9yIHBhY2tldCBjYXB0dXJlLCBhbmQgc2luY2Ugd2UndmUgZGV2ZWxvcGVkIHNldmVyYWwgdG9vbHMgdGhhdAorcmVxdWlyZSB0aGlzIGZ1bmN0aW9uYWxpdHksIHdlJ3ZlIGNyZWF0ZWQgdGhpcyBzeXN0ZW0taW5kZXBlbmRlbnQgQVBJCit0byBlYXNlIGluIHBvcnRpbmcgYW5kIHRvIGFsbGV2aWF0ZSB0aGUgbmVlZCBmb3Igc2V2ZXJhbAorc3lzdGVtLWRlcGVuZGVudCBwYWNrZXQgY2FwdHVyZSBtb2R1bGVzIGluIGVhY2ggYXBwbGljYXRpb24uCisKK0ZvciBzb21lIHBsYXRmb3JtcyB0aGVyZSBhcmUgUkVBRE1FLntzeXN0ZW19IGZpbGVzIHRoYXQgZGlzY3VzcyBpc3N1ZXMKK3dpdGggdGhlIE9TJ3MgaW50ZXJmYWNlIGZvciBwYWNrZXQgY2FwdHVyZSBvbiB0aG9zZSBwbGF0Zm9ybXMsIHN1Y2ggYXMKK2hvdyB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhhdCBpbnRlcmZhY2UgaW4gdGhlIE9TLCBpZiBpdCdzIG5vdCBidWlsdCBpbgorYnkgZGVmYXVsdC4KKworVGhlIGxpYnBjYXAgaW50ZXJmYWNlIHN1cHBvcnRzIGEgZmlsdGVyaW5nIG1lY2hhbmlzbSBiYXNlZCBvbiB0aGUKK2FyY2hpdGVjdHVyZSBpbiB0aGUgQlNEIHBhY2tldCBmaWx0ZXIuICBCUEYgaXMgZGVzY3JpYmVkIGluIHRoZSAxOTkzCitXaW50ZXIgVXNlbml4IHBhcGVyIGBgVGhlIEJTRCBQYWNrZXQgRmlsdGVyOiBBIE5ldyBBcmNoaXRlY3R1cmUgZm9yCitVc2VyLWxldmVsIFBhY2tldCBDYXB0dXJlJycuICBBIGNvbXByZXNzZWQgUG9zdFNjcmlwdCB2ZXJzaW9uIGNhbiBiZQorZm91bmQgYXQKKworCWZ0cDovL2Z0cC5lZS5sYmwuZ292L3BhcGVycy9icGYtdXNlbml4OTMucHMuWgorCitvcgorCisJaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9wYXBlcnMvYnBmLXVzZW5peDkzLnBzLloKKworYW5kIGEgZ3ppcHBlZCB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBhdAorCisJaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9wYXBlcnMvYnBmLXVzZW5peDkzLnBzLmd6CisKK0EgUERGIHZlcnNpb24gY2FuIGJlIGZvdW5kIGF0CisKKwlodHRwOi8vd3d3LnRjcGR1bXAub3JnL3BhcGVycy9icGYtdXNlbml4OTMucGRmCisKK0FsdGhvdWdoIG1vc3QgcGFja2V0IGNhcHR1cmUgaW50ZXJmYWNlcyBzdXBwb3J0IGluLWtlcm5lbCBmaWx0ZXJpbmcsCitsaWJwY2FwIHV0aWxpemVzIGluLWtlcm5lbCBmaWx0ZXJpbmcgb25seSBmb3IgdGhlIEJQRiBpbnRlcmZhY2UuCitPbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBCUEYsIGFsbCBwYWNrZXRzIGFyZSByZWFkIGludG8gdXNlci1zcGFjZQorYW5kIHRoZSBCUEYgZmlsdGVycyBhcmUgZXZhbHVhdGVkIGluIHRoZSBsaWJwY2FwIGxpYnJhcnksIGluY3VycmluZworYWRkZWQgb3ZlcmhlYWQgKGVzcGVjaWFsbHksIGZvciBzZWxlY3RpdmUgZmlsdGVycykuICBJZGVhbGx5LCBsaWJwY2FwCit3b3VsZCB0cmFuc2xhdGUgQlBGIGZpbHRlcnMgaW50byBhIGZpbHRlciBwcm9ncmFtIHRoYXQgaXMgY29tcGF0aWJsZQord2l0aCB0aGUgdW5kZXJseWluZyBrZXJuZWwgc3Vic3lzdGVtLCBidXQgdGhpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkLgorCitCUEYgaXMgc3RhbmRhcmQgaW4gNC40QlNELCBCU0QvT1MsIE5ldEJTRCwgRnJlZUJTRCwgT3BlbkJTRCwgRHJhZ29uRmx5CitCU0QsIGFuZCBNYWMgT1MgWDsgYW4gb2xkZXIsIG1vZGlmaWVkIGFuZCB1bmRvY3VtZW50ZWQgdmVyc2lvbiBpcworc3RhbmRhcmQgaW4gQUlYLiAge0RFQyBPU0YvMSwgRGlnaXRhbCBVTklYLCBUcnU2NCBVTklYfSB1c2VzIHRoZQorcGFja2V0ZmlsdGVyIGludGVyZmFjZSBidXQgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gYWNjZXB0IEJQRiBmaWx0ZXJzCisod2hpY2ggbGlicGNhcCB1dGlsaXplcykuICBBbHNvLCB5b3UgY2FuIGFkZCBCUEYgZmlsdGVyIHN1cHBvcnQgdG8KK1VsdHJpeCB1c2luZyB0aGUga2VybmVsIHNvdXJjZSBhbmQvb3Igb2JqZWN0IHBhdGNoZXMgYXZhaWxhYmxlIGluOgorCisJaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9vdGhlci9icGZleHQ0Mi50YXIuWgorCitMaW51eCwgaW4gdGhlIDIuMiBrZXJuZWwgYW5kIGxhdGVyIGtlcm5lbHMsIGhhcyBhICJTb2NrZXQgRmlsdGVyIgorbWVjaGFuaXNtIHRoYXQgYWNjZXB0cyBCUEYgZmlsdGVyczsgc2VlIHRoZSBSRUFETUUubGludXggZmlsZSBmb3IKK2luZm9ybWF0aW9uIG9uIGNvbmZpZ3VyaW5nIHRoYXQgb3B0aW9uLgorCitOb3RlIHRvIExpbnV4IGRpc3RyaWJ1dGlvbnMgYW5kICpCU0Qgc3lzdGVtcyB0aGF0IGluY2x1ZGUgbGlicGNhcDoKKworVGhlcmUncyBub3cgYSBydWxlIHRvIG1ha2UgYSBzaGFyZWQgbGlicmFyeSwgd2hpY2ggc2hvdWxkIHdvcmsgb24gTGludXggCithbmQgKkJTRCwgYW1vbmcgb3RoZXIgcGxhdGZvcm1zLgorCitJdCBzZXRzIHRoZSBzb25hbWUgb2YgdGhlIGxpYnJhcnkgdG8gImxpYnBjYXAuc28uMSI7IHRoaXMgaXMgd2hhdCBpdCAKK3Nob3VsZCBiZSwgKk5PVCogbGlicGNhcC5zby4xLnggb3IgbGlicGNhcC5zby4xLngueSBvciBzb21ldGhpbmcgc3VjaCBhcyAKK3RoYXQuCisKK1dlJ3ZlIGJlZW4gbWFpbnRhaW5pbmcgYmluYXJ5IGNvbXBhdGliaWxpdHkgYmV0d2VlbiBsaWJwY2FwIHJlbGVhc2VzIGZvciAKK3F1aXRlIGEgd2hpbGU7IHRoZXJlJ3Mgbm8gcmVhc29uIHRvIHRpZSBhIGJpbmFyeSBsaW5rZWQgd2l0aCBsaWJwY2FwIHRvIAorYSBwYXJ0aWN1bGFyIHJlbGVhc2Ugb2YgbGlicGNhcC4KKworUHJvYmxlbXMsIGJ1Z3MsIHF1ZXN0aW9ucywgZGVzaXJhYmxlIGVuaGFuY2VtZW50cywgZXRjLiBzaG91bGQgYmUgc2VudAordG8gdGhlIGFkZHJlc3MgInRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyIuICBCdWdzLCBzdXBwb3J0CityZXF1ZXN0cywgYW5kIGZlYXR1cmUgcmVxdWVzdHMgbWF5IGFsc28gYmUgc3VibWl0dGVkIG9uIHRoZSBTb3VyY2VGb3JnZQorc2l0ZSBmb3IgbGlicGNhcCBhdAorCisJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJwY2FwLworCitTb3VyY2UgY29kZSBjb250cmlidXRpb25zLCBldGMuIHNob3VsZCBiZSBzZW50IHRvIHRoZSBlbWFpbCBhZGRyZXNzCitzdWJtaXR0ZWQgYXMgcGF0Y2hlcyBvbiB0aGUgU291cmNlRm9yZ2Ugc2l0ZSBmb3IgbGlicGNhcC4KKworQ3VycmVudCB2ZXJzaW9ucyBjYW4gYmUgZm91bmQgYXQgd3d3LnRjcGR1bXAub3JnLCBvciB0aGUgU291cmNlRm9yZ2UKK3NpdGUgZm9yIGxpYnBjYXAuCisKKyAtIFRoZSBUQ1BkdW1wIHRlYW0KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvUkVBRE1FLldpbjMyIGIvbGlicGNhcC0xLjMuMC9SRUFETUUuV2luMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzODM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvUkVBRE1FLldpbjMyCkBAIC0wLDAgKzEsNDYgQEAKK1VuZGVyIFdpbjMyLCBsaWJwY2FwIGlzIGludGVncmF0ZWQgaW4gdGhlIFdpblBjYXAgcGFja2V0IGNhcHR1cmUgc3lzdGVtLiAKK1dpblBjYXAgcHJvdmlkZXMgYSBmcmFtZXdvcmsgdGhhdCBhbGxvd3MgbGlicGNhcCB0byBjYXB0dXJlIHRoZSBwYWNrZXRzIAordW5kZXIgV2luZG93cyA5NSwgV2luZG93cyA5OCwgV2luZG93cyBNRSwgV2luZG93cyBOVCA0LCBXaW5kb3dzIDIwMDAgCithbmQgV2luZG93cyBYUC4KK1dpblBjYXAgYmluYXJpZXMgYW5kIHNvdXJjZSBjb2RlIGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vd2lucGNhcC5wb2xpdG8uaXQ6IAordGhleSBpbmNsdWRlIGFsc28gYSBkZXZlbG9wZXIncyBwYWNrIHdpdGggYWxsIHRoZSBuZWNlc3NhcnkgdG8gY29tcGlsZSAKK2xpYnBjYXAtYmFzZWQgYXBwbGljYXRpb25zIHVuZGVyIFdpbmRvd3MuCisKK0hvdyB0byBjb21waWxlIGxpYnBjYXAgd2l0aCBWaXN1YWwgU3R1ZGlvCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBjb21waWxlIGxpYnBjYXAgeW91IHdpbGwgbmVlZDoKKworLSB2ZXJzaW9uIDYgKG9yIGhpZ2hlcikgb2YgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8KKy0gVGhlIE5vdmVtYmVyIDIwMDEgKG9yIGxhdGVyKSBlZGl0aW9uIG9mIE1pY3Jvc29mdCBQbGF0Zm9ybSAKK1NvZnR3YXJlIERldmVsb3BtZW50IEtpdCAoU0RLKSwgdGhhdCBjb250YWlucyBzb21lIG5lY2Vzc2FyeSBpbmNsdWRlcyAKK2ZvciBJUHY2IHN1cHBvcnQuIFlvdSBjYW4gZG93bmxvYWQgaXQgZnJvbSBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vc2RrCistIHRoZSBsYXRlc3QgV2luUGNhcCBzb3VyY2VzIGZyb20gaHR0cDovL3dpbnBjYXAucG9saXRvLml0L2luc3RhbGwgCisKK1RoZSBXaW5QY2FwIHNvdXJjZSBjb2RlIGFscmVhZHkgY29udGFpbnMgYSByZWNlbnQgKHVzdWFsbHkgdGhlIGxhdGVzdCAKK3N0YWJsZSkgdmVyc2lvbiBvZiBsaWJwY2FwLiBJZiB5b3UgbmVlZCB0byBjb21waWxlIGEgZGlmZmVyZW50IG9uZSwgCitzaW1wbHkgZG93bmxvYWQgaXQgZnJvbSB3d3cudGNwZHVtcC5vcmcgYW5kIGNvcHkgdGhlIHNvdXJjZXMgaW4gdGhlIAord2lucGNhcFx3cGNhcFxsaWJwY2FwIGZvbGRlciBvZiB0aGUgV2luUGNhcCBkaXN0cmlidXRpb24uIElmIHlvdSB3YW50IHRvCitjb21waWxlIGEgbGlicGNhcCBzb3VyY2UgcmV0cmlldmVkIGZyb20gdGhlIHRjcGR1bXAub3JnIEdpdCwgeW91IHdpbGwgCitoYXZlIHRvIGNyZWF0ZSB0aGUgc2Nhbm5lciBhbmQgdGhlIGdyYW1tYXIgYnkgaGFuZCAod2l0aCBsZXggYW5kIHlhY2MpIAorb3Igd2l0aCB0aGUgY3lnbnVzIG1ha2VmaWxlLCBzaW5jZSBUaGUgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGlzIG5vdCBhYmxlCit0byBidWlsZCB0aGVtLgorCitPcGVuIHRoZSBwcm9qZWN0IGZpbGUgd2lucGNhcFx3cGNhcFxwcmpcd3BjYXAuZHN3IHdpdGggVmlzdWFsIFN0dWRpbyBhbmQgCitidWlsZCB3cGNhcC5kbGwuIHdwY2FwLmxpYiwgdGhlIGxpYnJhcnkgZmlsZSB0byBsaW5rIHdpdGggdGhlIGFwcGxpY2F0aW9ucywgCit3aWxsIGJlIGdlbmVyYXRlZCBpbiB3aW5wY2FwXHdwY2FwXGxpYlwuIHdwY2FwLmRsbCB3aWxsIGJlIGdlbmVyYXRlZCBpbiAKK3dpbnBjYXBcd3BjYXBccHJqXHJlbGVhc2Ugb3Igd2lucGNhcFx3cGNhcFxwcmpcZGVidWcgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIAorb2YgYmluYXJ5IHRoYXQgaXMgYmVpbmcgY3JlYXRlZC4KKworSG93IHRvIGNvbXBpbGUgbGlicGNhcCB3aXRoIEN5Z251cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUbyBidWlsZCB3cGNhcC5kbGwsIGNkIHRvIHRoZSBkaXJlY3RvcnkgV1BDQVAvUFJKIG9mIHRoZSBXaW5QY2FwIHNvdXJjZSBjb2RlIAorZGlzdHJpYnV0aW9uIGFuZCB0eXBlICJtYWtlIi4gbGlid3BjYXAuYSwgdGhlIGxpYnJhcnkgZmlsZSB0byBsaW5rIHdpdGggdGhlIAorYXBwbGljYXRpb25zLCB3aWxsIGJlIGdlbmVyYXRlZCBpbiB3aW5wY2FwXHdwY2FwXGxpYlwuIHdwY2FwLmRsbCB3aWxsIGJlIAorZ2VuZXJhdGVkIGluIHdpbnBjYXBcd3BjYXBccHJqLgorCitSZW1lbWJlciwgeW91IENBTk5PVCB1c2UgdGhlIE1TVkMtZ2VuZXJhdGVkIC5saWIgZmlsZXMgd2l0aCBnY2MsIHVzZSAKK2xpYndwY2FwLmEgaW5zdGVhZC4KKworIm1ha2UgaW5zdGFsbCIgaW5zdGFsbHMgd3BjYXAuZGxsIGluIHRoZSBXaW5kb3dzIHN5c3RlbSBmb2xkZXIuCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1JFQURNRS5haXggYi9saWJwY2FwLTEuMy4wL1JFQURNRS5haXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyZmE1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvUkVBRE1FLmFpeApAQCAtMCwwICsxLDgxIEBACitVc2luZyBCUEY6CisKKygxKSBBSVggNC54J3MgdmVyc2lvbiBvZiBCUEYgaXMgdW5kb2N1bWVudGVkIGFuZCBzb21ld2hhdCB1bnN0YW5kYXJkOyB0aGUKKyAgICBjdXJyZW50IEJQRiBzdXBwb3J0IGNvZGUgaW5jbHVkZXMgY2hhbmdlcyB0aGF0IHNob3VsZCB3b3JrIGFyb3VuZAorICAgIHRoYXQ7IGl0IGFwcGVhcnMgdG8gY29tcGlsZSBhbmQgd29yayBvbiBhdCBsZWFzdCBvbmUgQUlYIDQuMy4zCisgICAgbWFjaGluZS4KKworICAgIE5vdGUgdGhhdCB0aGUgQlBGIGRyaXZlciBhbmQgdGhlICIvZGV2L2JwZiIgZGV2aWNlcyBtaWdodCBub3QgZXhpc3QKKyAgICBvbiB5b3VyIG1hY2hpbmU7IEFJWCdzIHRjcGR1bXAgbG9hZHMgdGhlIGRyaXZlciBhbmQgY3JlYXRlcyB0aGUKKyAgICBkZXZpY2VzIGlmIHRoZXkgZG9uJ3QgYWxyZWFkeSBleGlzdC4gIE91ciBsaWJwY2FwIHNob3VsZCBkbyB0aGUKKyAgICBzYW1lLCBhbmQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgc2hvdWxkIGRldGVjdCB0aGF0IGl0J3Mgb24gYW4gQUlYCisgICAgc3lzdGVtIGFuZCBjaG9vc2UgQlBGIGV2ZW4gaWYgdGhlIGRldmljZXMgYXJlbid0IHRoZXJlLgorCisoMikgSWYgbGlicGNhcCBkb2Vzbid0IGNvbXBpbGUgb24geW91ciBtYWNoaW5lIHdoZW4gY29uZmlndXJlZCB0byB1c2UKKyAgICBCUEYsIG9yIGlmIHRoZSB3b3JrYXJvdW5kcyBmYWlsIHRvIG1ha2UgaXQgd29yayBjb3JyZWN0bHksIHlvdQorICAgIHNob3VsZCBzZW5kIHRvIHRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyBhIGRldGFpbGVkIGJ1ZworICAgIHJlcG9ydCAoaWYgdGhlIGNvbXBpbGUgZmFpbHMsIHNlbmQgdXMgdGhlIGNvbXBpbGUgZXJyb3IgbWVzc2FnZXM7CisgICAgaWYgaXQgY29tcGlsZXMgYnV0IGZhaWxzIHRvIHdvcmsgY29ycmVjdGx5LCBzZW5kIHVzIGFzIGRldGFpbGVkIGFzCisgICAgcG9zc2libGUgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ltcHRvbXMsIGluY2x1ZGluZyBpbmRpY2F0aW9ucyBvZiB0aGUKKyAgICBuZXR3b3JrIGxpbmstbGF5ZXIgdHlwZSBiZWluZyB3cm9uZyBvciB0aW1lIHN0YW1wcyBiZWluZyB3cm9uZykuCisKKyAgICBJZiB5b3UgZml4IHRoZSBwcm9ibGVtcyB5b3Vyc2VsZiwgcGxlYXNlIHN1Ym1pdCBhIHBhdGNoIHRvCisKKwlodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnBjYXAvCisKKyAgICBzbyB3ZSBjYW4gaW5jb3Jwb3JhdGUgdGhlbSBpbnRvIHRoZSBuZXh0IHJlbGVhc2UuCisKKyAgICBJZiB5b3UgZG9uJ3QgZml4IHRoZSBwcm9ibGVtcyB5b3Vyc2VsZiwgeW91IGNhbiwgYXMgYSB3b3JrYXJvdW5kLAorICAgIG1ha2UgbGlicGNhcCB1c2UgRExQSSBpbnN0ZWFkIG9mIEJQRi4KKworICAgIFRoaXMgY2FuIGJlIGRvbmUgYnkgc3BlY2lmeWluZyB0aGUgZmxhZzoKKworICAgICAgIC0td2l0aC1wY2FwPWRscGkKKworICAgIHRvIHRoZSAiY29uZmlndXJlIiBzY3JpcHQgZm9yIGxpYnBjYXAuCisKK0lmIHlvdSB1c2UgRExQSToKKworKDEpIEl0IGlzIGEgZ29vZCBpZGVhIHRvIGhhdmUgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBETFBJIGRyaXZlciBvbgorICAgIHlvdXIgc3lzdGVtLCBzaW5jZSBjZXJ0YWluIHZlcnNpb25zIG1heSBiZSBidWdneSBhbmQgY2F1c2UgeW91ciBBSVgKKyAgICBzeXN0ZW0gdG8gY3Jhc2guICBETFBJIGlzIGluY2x1ZGVkIGluIHRoZSBmaWxlc2V0IGJvcy5ydGUudHR5LiAgSQorICAgIGZvdW5kIHRoYXQgdGhlIERMUEkgZHJpdmVyIHRoYXQgY2FtZSB3aXRoIEFJWCA0LjMuMiB3YXMgYnVnZ3ksIGFuZAorICAgIGhhZCB0byB1cGdyYWRlIHRvIGJvcy5ydGUudHR5IDQuMy4yLjQ6CisKKwkgICAgbHNscHAgLWwgYm9zLnJ0ZS50dHkKKworCSAgICBib3MucnRlLnR0eSAgICAgNC4zLjIuNCAgQ09NTUlUVEVEICBCYXNlIFRUWSBTdXBwb3J0IGFuZCBDb21tYW5kcworCisgICAgVXBkYXRlcyBmb3IgQUlYIGZpbGVzZXRzIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICAgIGZ0cDovL3NlcnZpY2Uuc29mdHdhcmUuaWJtLmNvbS9haXgvZml4ZXMvCisKKyAgICBUaGVzZSB1cGRhdGVzIGNhbiBiZSBpbnN0YWxsZWQgd2l0aCB0aGUgc21pdCBwcm9ncmFtLgorCisoMikgQWZ0ZXIgY29tcGlsaW5nIGxpYnBjYXAsIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBETFBJIGRyaXZlcgorICAgIGlzIGxvYWRlZC4gIFR5cGU6CisKKwkgICAgc3RybG9hZCAtcSAtZCBkbHBpCisKKyAgICBJZiB0aGUgcmVzdWx0IGlzOgorCisJICAgIGRscGk6IHllcworCisgICAgdGhlbiB0aGUgRExQSSBkcml2ZXIgaXMgbG9hZGVkIGNvcnJlY3RseS4KKworICAgIElmIGl0IGlzOgorCisJICAgIGRscGk6IG5vCisKKyAgICBUaGVuIHlvdSBuZWVkIHRvIHR5cGU6CisKKwkgICAgc3RybG9hZCAtZiAvZXRjL2RscGkuY29uZgorIAorICAgIENoZWNrIGFnYWluIHdpdGggc3RybG9hZCAtcSAtZCBkbHBpIHRoYXQgdGhlIGRscGkgZHJpdmVyIGlzIGxvYWRlZC4gIAorCisgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1bmNvbW1lbnQgdGhlIGxpbmVzIGZvciBETFBJIGluCisgICAgL2V0Yy9wc2UuY29uZiBhbmQgcmVib290IHRoZSBtYWNoaW5lOyB0aGlzIHdheSBETFBJIHdpbGwgYWx3YXlzCisgICAgYmUgbG9hZGVkIHdoZW4geW91IGJvb3QgeW91ciBzeXN0ZW0uCisKKygzKSBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgcHJvYmxlbSBpbiB0aGUgRExQSSBjb2RlIGluIHNvbWUgdmVyc2lvbnMgb2YKKyAgICBBSVgsIGNhdXNpbmcgYSB3YXJuaW5nIGFib3V0IERMX1BST01JU0NfTVVMVEkgZmFpbGluZzsgdGhpcyBtaWdodAorICAgIGJlIHJlc3BvbnNpYmxlIGZvciBETFBJIG5vdCBiZWluZyBhYmxlIHRvIGNhcHR1cmUgb3V0Z29pbmcgcGFja2V0cy4KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvUkVBRE1FLmRhZyBiL2xpYnBjYXAtMS4zLjAvUkVBRE1FLmRhZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2Y5N2VkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9SRUFETUUuZGFnCkBAIC0wLDAgKzEsMTE0IEBACisKK1RoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIGFwcGx5IGlmIHlvdSBoYXZlIGEgTGludXggb3IgRnJlZUJTRCBwbGF0Zm9ybSBhbmQKK3dhbnQgbGlicGNhcCB0byBzdXBwb3J0IHRoZSBEQUcgcmFuZ2Ugb2YgcGFzc2l2ZSBuZXR3b3JrIG1vbml0b3JpbmcgY2FyZHMgZnJvbQorRW5kYWNlIChodHRwOi8vd3d3LmVuZGFjZS5jb20sIHNlZSBiZWxvdyBmb3IgZnVydGhlciBjb250YWN0IGRldGFpbHMpLgorCisxKSBJbnN0YWxsIGFuZCBidWlsZCB0aGUgREFHIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBieSBmb2xsb3dpbmcgdGhlCitpbnN0cnVjdGlvbnMgc3VwcGxpZWQgd2l0aCB0aGF0IHBhY2thZ2UuIEN1cnJlbnQgRW5kYWNlIGN1c3RvbWVycyBjYW4gZG93bmxvYWQKK3RoZSBEQUcgc29mdHdhcmUgZGlzdGlidXRpb24gZnJvbSBodHRwczovL3d3dy5lbmRhY2UuY29tCisKKzIpIENvbmZpZ3VyZSBsaWJjYXAuIFRvIGFsbG93IHRoZSAnY29uZmlndXJlJyBzY3JpcHQgdG8gbG9jYXRlIHRoZSBEQUcKK3NvZnR3YXJlIGRpc3RyaWJ1dGlvbiB1c2UgdGhlICctLXdpdGgtZGFnJyBvcHRpb246CisKKyAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLWRhZz1ESVIKKworV2hlcmUgRElSIGlzIHRoZSByb290IG9mIHRoZSBEQUcgc29mdHdhcmUgZGlzdHJpYnV0aW9uLCBmb3IgZXhhbXBsZQorL3Zhci9zcmMvZGFnLiBJZiB0aGUgREFHIHNvZnR3YXJlIGlzIGNvcnJlY3RseSBkZXRlY3RlZCAnY29uZmlndXJlJyB3aWxsCityZXBvcnQ6CisKKyAgICAgICAgY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIERBRyBBUEkuLi4geWVzCisKK0lmICdjb25maWd1cmUnIHJlcG9ydHMgdGhhdCB0aGVyZSBpcyBubyBEQUcgQVBJLCB0aGUgZGlyZWN0b3J5IG1heSBoYXZlIGJlZW4KK2luY29ycmVjdGx5IHNwZWNpZmllZCBvciB0aGUgREFHIHNvZnR3YXJlIHdhcyBub3QgYnVpbHQgYmVmb3JlIGNvbmZpZ3VyaW5nCitsaWJwY2FwLgorCitTZWUgYWxzbyB0aGUgbGlicGNhcCBJTlNUQUxMLnR4dCBmaWxlIGZvciBmdXJ0aGVyIGxpYnBjYXAgY29uZmlndXJhdGlvbgorb3B0aW9ucy4KKworQnVpbGRpbmcgbGlicGNhcCBhdCB0aGlzIHN0YWdlIHdpbGwgaW5jbHVkZSBzdXBwb3J0IGZvciBib3RoIHRoZSBuYXRpdmUgcGFja2V0CitjYXB0dXJlIHN0cmVhbSAobGludXggb3IgYnBmKSBhbmQgZm9yIGNhcHR1cmluZyBmcm9tIERBRyBjYXJkcy4gVG8gYnVpbGQKK2xpYnBjYXAgd2l0aCBvbmx5IERBRyBzdXBwb3J0IHNwZWNpZnkgdGhlIGNhcHR1cmUgdHlwZSBhcyAnZGFnJyB3aGVuCitjb25maWd1cmluZyBsaWJwY2FwOgorCisgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1kYWc9RElSIC0td2l0aC1wY2FwPWRhZworCitBcHBsaWNhdGlvbnMgYnVpbHQgd2l0aCBsaWJwY2FwIGNvbmZpZ3VyZWQgaW4gdGhpcyB3YXkgd2lsbCBvbmx5IGRldGVjdCBEQUcKK2NhcmRzIGFuZCB3aWxsIG5vdCBjYXB0dXJlIGZyb20gdGhlIG5hdGl2ZSBPUyBwYWNrZXQgc3RyZWFtLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xpYnBjYXAgd2hlbiBidWlsdCBmb3IgREFHIGNhcmRzIGFnYWluc3QgZGFnLTIuNS4xIG9yIGxhdGVyIHJlbGVhc2VzOgorCitUaW1lb3V0cyBhcmUgc3VwcG9ydGVkLiBwY2FwX2Rpc3BhdGNoKCkgd2lsbCByZXR1cm4gYWZ0ZXIgdG9fbXMgbWlsbGlzZWNvbmRzCityZWdhcmRsZXNzIG9mIGhvdyBtYW55IHBhY2tldHMgYXJlIHJlY2VpdmVkLiBJZiB0b19tcyBpcyB6ZXJvIHBjYXBfZGlzcGF0Y2goKQord2lsbCBibG9jayB3YWl0aW5nIGZvciBkYXRhIGluZGVmaW5pdGVseS4KKworcGNhcF9kaXNwYXRjaCgpIHdpbGwgYmxvY2sgb24gYW5kIHByb2Nlc3MgYSBtaW5pbXVtIG9mIDY0a0Igb2YgZGF0YSAoYmVmb3JlCitmaWx0ZXJpbmcpIGZvciBlZmZpY2llbmN5LiBUaGlzIGNhbiBpbnRyb2R1Y2UgaGlnaCBsYXRlbmNpZXMgb24gcXVpZXQKK2ludGVyZmFjZXMgdW5sZXNzIGEgdGltZW91dCB2YWx1ZSBpcyBzZXQuIFRoZSB0aW1lb3V0IGV4cGlyaW5nIHdpbGwgb3ZlcnJpZGUKK3RoZSA2NGtCIG1pbmltdW0gY2F1c2luZyBwY2FwX2Rpc3BhdGNoKCkgdG8gcHJvY2VzcyBhbnkgYXZhaWxhYmxlIGRhdGEgYW5kCityZXR1cm4uCisKK3BjYXBfc2V0bm9uYmxvY2sgaXMgc3VwcG9ydGVkLiBXaGVuIG5vbmJsb2NrIGlzIHNldCwgcGNhcF9kaXNwYXRjaCgpIHdpbGwKK2NoZWNrIG9uY2UgZm9yIGF2YWlsYWJsZSBkYXRhLCBwcm9jZXNzIGFueSBkYXRhIGF2YWlsYWJsZSB1cCB0byBjb3VudCwgdGhlbgorcmV0dXJuIGltbWVkaWF0ZWx5LgorCitwY2FwX2ZpbmRhbGxkZXZzKCkgaXMgc3VwcG9ydGVkLCBlLmcuIGRhZzAsIGRhZzEuLi4KKworU29tZSBEQUcgY2FyZHMgY2FuIHByb3ZpZGUgbW9yZSB0aGFuIG9uZSAnc3RyZWFtJyBvZiByZWNlaXZlZCBkYXRhLgorVGhpcyBjYW4gYmUgZGF0YSBmcm9tIGRpZmZlcmVudCBwaHlzaWNhbCBwb3J0cywgb3Igc2VwYXJhdGVkIGJ5IGZpbHRlcmluZworb3IgbG9hZCBiYWxhbmNpbmcgbWVjaGFuaXNtcy4gUmVjZWl2ZSBzdHJlYW1zIGhhdmUgZXZlbiBudW1iZXJzLCBlLmcuCitkYWcwOjAsIGRhZzA6MiBldGMuIFNwZWNpZnlpbmcgdHJhbnNtaXQgc3RyZWFtcyBmb3IgY2FwdHVyZSBpcyBub3Qgc3VwcG9ydGVkLgorCitwY2FwX3NldGZpbHRlcigpIGlzIHN1cHBvcnRlZCwgQlBGIHByb2dyYW1zIHJ1biBpbiB1c2Vyc3BhY2UuCisKK3BjYXBfc2V0ZGlyZWN0aW9uKCkgaXMgbm90IHN1cHBvcnRlZC4gT25seSByZWNlaXZlZCB0cmFmZmljIGlzIGNhcHR1cmVkLgorREFHIGNhcmRzIG5vcm1hbGx5IGRvIG5vdCBoYXZlIElQIG9yIGxpbmsgbGF5ZXIgYWRkcmVzc2VzIGFzc2lnbmVkIGFzCit0aGV5IGFyZSB1c2VkIHRvIHBhc3NpdmVseSBtb25pdG9yIGxpbmtzLgorCitwY2FwX2JyZWFrbG9vcCgpIGlzIHN1cHBvcnRlZC4KKworcGNhcF9kYXRhbGluaygpIGFuZCBwY2FwX2xpc3RfZGF0YWxpbmtzKCkgYXJlIHN1cHBvcnRlZC4gVGhlIERBRyBjYXJkIGRvZXMKK25vdCBhdHRlbXB0IHRvIHNldCB0aGUgY29ycmVjdCBkYXRhbGluayB0eXBlIGF1dG9tYXRpY2FsbHkgd2hlcmUgbW9yZSB0aGFuCitvbmUgdHlwZSBpcyBwb3NzaWJsZS4KKworcGNhcF9zdGF0cygpIGlzIHN1cHBvcnRlZC4gcHNfZHJvcCBpcyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCBkdWUgdG8KK1JYIHN0cmVhbSBidWZmZXIgb3ZlcmZsb3csIHRoaXMgY291bnQgaXMgYmVmb3JlIGZpbHRlcnMgYXJlIGFwcGxpZWQgKGl0IHdpbGwKK2luY2x1ZGUgcGFja2V0cyB0aGF0IHdvdWxkIGhhdmUgYmVlbiBkcm9wcGVkIGJ5IHRoZSBmaWx0ZXIpLiBUaGUgUlggc3RyZWFtCitidWZmZXIgc2l6ZSBpcyB1c2VyIGNvbmZpZ3VyYWJsZSBvdXRzaWRlIGxpYnBjYXAsIHR5cGljYWxseSAxNi01MTJNQi4KKworcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCgpIGlzIG5vdCBzdXBwb3J0ZWQsIGFzIERBRyBjYXJkcyBkbyBub3Qgc3VwcG9ydAorcG9sbC9zZWxlY3QgbWV0aG9kcy4KKworcGNhcF9pbmplY3QoKSBhbmQgcGNhcF9zZW5kcGFja2V0KCkgYXJlIG5vdCBzdXBwb3J0ZWQuCisKK1NvbWUgREFHIGNhcmRzIG5vdyBzdXBwb3J0IGNhcHR1cmluZyB0byBtdWx0aXBsZSB2aXJ0dWFsIGludGVyZmFjZXMsIGNhbGxlZAorc3RyZWFtcy4gQ2FwdHVyZSBzdHJlYW1zIGhhdmUgZXZlbiBudW1iZXJzLiBUaGVzZSBhcmUgYXZhaWxhYmxlIHZpYSBsaWJwY2FwCithcyBzZXBhcmF0ZSBpbnRlcmZhY2VzLCBlLmcuIGRhZzA6MCwgZGFnMDoyLCBkYWcwOjQgZXRjLiBkYWcwOjAgaXMgdGhlIHNhbWUKK2FzIGRhZzAuIFRoZXNlIGFyZSB2aXNpYmxlIHZpYSBwY2FwX2ZpbmRhbGxkZXZzKCkuCisKK2xpYnBjYXAgbm93IGRvZXMgTk9UIHNldCB0aGUgY2FyZCdzIGhhcmR3YXJlIHNuYXBsZW4gKHNsZW4pLiBUaGlzIG11c3Qgbm93IGJlCitzZXQgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIERBRyBjb25pZ3VyYXRpb24gcHJvZ3JhbSwgZS5nLiBkYWd0aHJlZSwgZGFnZm91ciwKK2RhZ3NpeCwgZGFnY29uZmlnLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHNuYXBsZW4gaXMgY3VycmVudGx5IHNoYXJlZCBiZXR3ZWVuCithbGwgb2YgdGhlIHN0cmVhbXMuIEluIGZ1dHVyZSB0aGlzIG1heSBjaGFuZ2UgaWYgcGVyLXN0cmVhbSBzbGVuIGlzCitpbXBsZW1lbnRlZC4KKworREFHIGNhcmRzIGJ5IGRlZmF1bHQgY2FwdHVyZSBlbnRpcmUgcGFja2V0cyBpbmNsdWRpbmcgdGhlIEwyCitDUkMvRkNTLiBJZiB0aGUgY2FyZCBpcyBub3QgY29uZmlndXJlZCB0byBkaXNjYXJkIHRoZSBDUkMvRkNTLCB0aGlzCitjYW4gY29uZnVzZSBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgbGlicGNhcCBpZiB0aGV5J3JlIG5vdCBwcmVwYXJlZCBmb3IKK3BhY2tldHMgdG8gaGF2ZSBhbiBGQ1MuIExpYnBjYXAgbm93IHJlYWRzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorRVJGX0ZDU19CSVRTIHRvIGRldGVybWluZSBob3cgbWFueSBiaXRzIG9mIENSQy9GQ1MgdG8gc3RyaXAgZnJvbSB0aGUKK2VuZCBvZiB0aGUgY2FwdHVyZWQgZnJhbWUuIFRoaXMgZGVmYXVsdHMgdG8gMzIgZm9yIHVzZSB3aXRoCitFdGhlcm5ldC4gSWYgdGhlIGNhcmQgaXMgY29uZmlndXJlZCB0byBzdHJpcCB0aGUgQ1JDL0ZDUywgdGhlbiBzZXQKK0VSRl9GQ1NfQklUUz0wLiBJZiB1c2VkIHdpdGggYSBIRExDL1BvUy9QUFAvRnJhbWUgUmVsYXkgbGluayB3aXRoIDE2CitiaXQgQ1JDL0ZDUywgdGhlbiBzZXQgRVJGX0ZDU19CSVRTPTE2LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BsZWFzZSBzdWJtaXQgYnVnIHJlcG9ydHMgdmlhIDxzdXBwb3J0QGVuZGFjZS5jb20+LgorCitQbGVhc2UgYWxzbyB2aXNpdCBvdXIgV2ViIHNpdGUgYXQ6CisKKyAgICAgICAgaHR0cDovL3d3dy5lbmRhY2UuY29tLworCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBFbmRhY2UgREFHIGNhcmRzIGNvbnRhY3QgPHNhbGVzQGVuZGFjZS5jb20+LgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9SRUFETUUuaHB1eCBiL2xpYnBjYXAtMS4zLjAvUkVBRE1FLmhwdXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjMjdmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvUkVBRE1FLmhwdXgKQEAgLTAsMCArMSwyNTQgQEAKK0ZvciBIUC1VWCAxMWkgKDExLjExKSBhbmQgbGF0ZXIsIHRoZXJlIGFyZSBubyBrbm93biBpc3N1ZXMgd2l0aAorcHJvbWlzY3VvdXMgbW9kZSB1bmRlciBIUC1VWC4gIElmIHlvdSBhcmUgdXNpbmcgYSBlYXJsaWVyIHZlcnNpb24gb2YKK0hQLVVYIGFuZCBjYW5ub3QgdXBncmFkZSwgcGxlYXNlIGNvbnRpbnVlIHJlYWRpbmcuCisKK0hQLVVYIHBhdGNoZXMgdG8gZml4IHBhY2tldCBjYXB0dXJlIHByb2JsZW1zCisKK05vdGUgdGhhdCBwYWNrZXQtY2FwdHVyZSBwcm9ncmFtcyBzdWNoIGFzIHRjcGR1bXAgbWF5LCBvbiBIUC1VWCwgbm90IGJlCithYmxlIHRvIHNlZSBwYWNrZXRzIHNlbnQgZnJvbSB0aGUgbWFjaGluZSBvbiB3aGljaCB0aGV5J3JlIHJ1bm5pbmcuIAorU29tZSBhcnRpY2xlcyBvbiBncm91cHMuZ29vZ2xlLmNvbSBkaXNjdXNzaW5nIHRoaXMgYXJlOgorCisJaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3Vwcz9zZWxtPTgybGQzdiUyNDgwaSUyNDElNDBtYW1lbmNoaS56cnouVFUtQmVybGluLkRFCisKK3doaWNoIHNheXM6CisKKyAgTmV3c2dyb3VwczogY29tcC5zeXMuaHAuaHB1eCAKKyAgU3ViamVjdDogIFJlOiBEaWQgc29tZW9uZSBtYWRlIHRjcGR1bXAgd29ya2luZyBvbiAxMC4yMCA/CisgIERhdGU6IDEyLzA4LzE5OTkKKyAgRnJvbTogTHV0eiBKYWVuaWNrZSA8amFlbmlja2VAZW1zZXJ2MS5lZS5UVS1CZXJsaW4uREU+CisKKyAgSW4gYXJ0aWNsZSA8ODJrczVpJDV2YyQxQG5ld3MxLmR0aS5uZS5qcD4sIG10c2F0IDxtdHNhdEBpcmlzLmR0aS5uZS5qcD4KKyAgd3JvdGU6CisgICA+SGVsbG8sCisgICA+CisgICA+SSBkb3dubG9hZGVkIGFuZCBjb21waWxlZCB0Y3BkdW1wMy40IGEgY291cGxlIG9mIHdlZWsgYWdvLiBJIHRyaWVkIHRvIHVzZQorICAgPml0LCBidXQgSSBjYW4gb25seSBzZWUgaW5jb21pbmcgZGF0YSwgbmV2ZXIgb3V0Z29pbmcuCisgICA+U29tZW9uZSAocmFqKSBleHBsYWluZWQgbWUgdGhhdCBhIHBhdGNoIHdhcyBtaXNzaW5nLCBhbmQgdGhhdCB0aGlzIHBhdGNoCisgICA+bXVzdCBtZSAicGF0Y2hlZCIgKHBva2VkKSBpbiBvcmRlciB0byBzZWUgb3V0Ym91bmQgZGF0YSBpbiBwcm9taXNjdW91cyBtb2RlLgorICAgPk1hbnkgdGhpbmdzIHRvIGRvIC4uLi4gU28gdGhlIHF1ZXN0aW9uIGlzIDogZGlkIHNvbWVvbmUgaGFzIGFscmVhZHkgdGhpcworICAgPiJyZWFkeSB0byB1c2UiIFBITkVfKioqKiBwYXRjaCA/CisgIAorICAgVHdvIHRoaW5nczoKKyAgIDEuIFlvdSBkbyBuZWVkIGEgbGF0ZSAiTEFOIHByb2R1Y3RzIGN1bXVsYXRpdmUgcGF0Y2giIChlLmcuICBQSE5FXzE4MTczCisgIGZvciAgIHM3MDAvMTAuMjApLgorICAgMi4gWW91IG11c3QgdXNlCitlY2hvICdsYW5jX291dGJvdW5kX3Byb21pc2NfZmxhZy9XMScgfCAvdXNyL2Jpbi9hZGIgLXcgL3N0YW5kL3ZtdW5peCAvZGV2L2ttZW0KKyAgICAgWW91IGNhbiBpbnNlcnQgdGhpcyBlLmcuIGludG8gL3NiaW4vaW5pdC5kL2xhbgorICAKKyAgIEJlc3QgcmVnYXJkcywKKyAgIEx1dHoKKworYW5kCisKKwlodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXBzP3NlbG09ODhjZjR0JTI0cDAzJTI0MSU0MHdlYjEuY3VwLmhwLmNvbQorCit3aGljaCBzYXlzOgorCisgIE5ld3Nncm91cHM6IGNvbXAuc3lzLmhwLmhwdXggCisgIFN1YmplY3Q6IFJlOiB0Y3BkdW1wIG9ubHkgc2hvd3MgaW5jb21pbmcgcGFja2V0cworICBEYXRlOiAwMi8xNS8yMDAwCisgIEZyb206IFJpY2sgSm9uZXMgPGZvb0BiYXIuYmF6LmludmFsaWQ+CisKKyAgSGFyYWxkIFNrb3RuZXMgPGhhcmFsZEBjYy51aXQubm8+IHdyb3RlOgorICA+IEkgYW0gcnVubmluZyBIUFVYIDExLjAgb24gYSBDMjAwIGhhbmdpbmcgb24gYSAxMDBNYiBzd2l0Y2guIEkgaGF2ZQorICA+IGNvbXBpbGVkIGxpYnBjYXAtMC40IGFuIHRjcGR1bXAtMy40IGFuZCBpdCBzZWVtcyB0byB3b3JrLiBCdXQgYXQgYQorICA+IGNsb3NlciBsb29rIEkgb25seSBnZXQgdG8gc2VlIHRoZSBpbmNvbWluZyBwYWNrZXRzIG5vdCB0aGUKKyAgPiBvdXRnb2luZy4gSSBoYXZlIHRyaWVkIHRjcGZsb3ctMC4xMiB3aGljaCBhbHNvIHVzZXMgbGlicGNhcCBhbmQgdGhlCisgID4gc2FtZSB0aGluZyBoYXBwZW5zLiAgQ291bGQgc29tZW9uZSBwbGVhc2UgZ2l2ZSBtZSBhIGhpbnQgb24gaG93IHRvCisgID4gZ2V0IHRoaXMgcmlnaHQ/CisgIAorICBTZWFyY2gvUmVhZCB0aGUgYXJjaGl2ZXMgPy0pCisgIAorICBXaGF0IHlvdSBhcmUgc2VlaW5nIGlzIGV4cGVjdGVkLCB1bi1wYXRjaGVkLCBiZWhhdmlvdXIgZm9yIGFuIEhQLVVYCisgIHN5c3RlbS4gIE9uIDExLjAwLCB5b3UgbmVlZCB0byBpbnN0YWxsIHRoZSBsYXRlc3QgbGFuY29tbW9uL0RMUEkKKyAgcGF0Y2hlcywgYW5kIHRoZW4gdGhlIGxhdGVzdCBkcml2ZXIgcGF0Y2ggZm9yIHRoZSBpbnRlcmZhY2UocykgaW4gdXNlLiAKKyAgQXQgdGhhdCBwb2ludCwgYSBtaXJhY2xlIGhhcHBlbnMgYW5kIHlvdSBzaG91bGQgc3RhcnQgc2VlaW5nIG91dGJvdW5kCisgIHRyYWZmaWMuCisKK1tUaGF0IGFydGljbGUgYWxzbyBtZW50aW9ucyB0aGUgcGF0Y2ggdGhhdCBhcHBlYXJzIGJlbG93Ll0KKworYW5kCisKKwlodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXBzP3NlbG09MzhBQTk3M0UuOTZCRTdERjclNDBjYy51aXQubm8KKword2hpY2ggc2F5czoKKworICBOZXdzZ3JvdXBzOiBjb21wLnN5cy5ocC5ocHV4CisgIFN1YmplY3Q6IFJlOiB0Y3BkdW1wIG9ubHkgc2hvd3MgaW5jb21pbmcgcGFja2V0cworICBEYXRlOiAwMi8xNi8yMDAwCisgIEZyb206IEhhcmFsZCBTa290bmVzIDxoYXJhbGRAY2MudWl0Lm5vPgorCisgIFJpY2sgSm9uZXMgd3JvdGU6CisgIAorCS4uLgorCisgID4gV2hhdCB5b3UgYXJlIHNlZWluZyBpcyBleHBlY3RlZCwgdW4tcGF0Y2hlZCwgYmVoYXZpb3VyIGZvciBhbiBIUC1VWAorICA+IHN5c3RlbS4gT24gMTEuMDAsIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIGxhdGVzdCBsYW5jb21tb24vRExQSQorICA+IHBhdGNoZXMsIGFuZCB0aGVuIHRoZSBsYXRlc3QgZHJpdmVyIHBhdGNoIGZvciB0aGUgaW50ZXJmYWNlKHMpIGluCisgID4gdXNlLiBBdCB0aGF0IHBvaW50LCBhIG1pcmFjbGUgaGFwcGVucyBhbmQgeW91IHNob3VsZCBzdGFydCBzZWVpbmcKKyAgPiBvdXRib3VuZCB0cmFmZmljLgorICAKKyAgVGhhbmtzIGEgbG90LiAgSSBoYXZlIHRoaXMgcHJvYmxlbSBvbiBzZXZlcmFsIG1hY2hpbmVzIHJ1bm5pbmcgSFBVWAorICAxMC4yMCBhbmQgMTEuMDAuICBUaGUgbWFjaGluZXMgd2hlcmUgcGF0Y2hlZCB1cCBiZWZvcmUgeTJrIHNvIGRpZCBub3QKKyAga25vdyB3aGF0IHRvIHRoaW5rLiAgQW55d2F5IEkgaGF2ZSBub3cgaW5zdGFsbGVkIFBITkVfMTk3NjYsCisgIFBITkVfMTk4MjYsIFBITkVfMjAwMDgsIFBITkVfMjA3MzUgb24gdGhlIEMyMDAgYW5kIG5vdyBJIGNhbiBzZWUgdGhlCisgIG91dGJvdW5kIHRyYWZmaWMgdG9vLiAgVGhhbmtzIGFnYWluLgorCisoYWx0aG91Z2ggdGhvc2UgcGF0Y2hlcyBtYXkgbm90IGJlIHRoZSBvbmVzIHRvIGluc3RhbGwgLSB0aGVyZSBtYXkgYmUKK2xhdGVyIHBhdGNoZXMpLgorCitBbmQgYW5vdGhlciBtZXNzYWdlIHRvIHRjcGR1bXAtd29ya2Vyc0B0Y3BkdW1wLm9yZywgZnJvbSBSaWNrIEpvbmVzOgorCisgIERhdGU6IE1vbiwgMjkgQXByIDIwMDIgMTU6NTk6NTUgLTA3MDAKKyAgRnJvbTogUmljayBKb25lcworICBUbzogdGNwZHVtcC13b3JrZXJzQHRjcGR1bXAub3JnIAorICBTdWJqZWN0OiBSZTogW3RjcGR1bXAtd29ya2Vyc10gSSBDYW4ndCBDYXB0dXJlIHRoZSBPdXRib3VuZCBUcmFmZmljCisKKwkuLi4KKworICBodHRwOi8vaXRyYy5ocC5jb20vIHdvdWxkIGJlIG9uZSBwbGFjZSB0byBzdGFydCBpbiBhIHNlYXJjaCBmb3IgdGhlIG1vc3QKKyAgdXAtdG8tZGF0ZSBwYXRjaGVzIGZvciBETFBJIGFuZCB0aGUgbGFuIGRyaXZlcihzKSB1c2VkIG9uIHlvdXIgc3lzdGVtIChJCisgIGNhbm5vdCBndWVzcyBiZWNhdXNlIDkwMDAvODAwIGlzIHRvbyBnZW5lcmljIC0gb25lIGhzIHRvIHVzZSB0aGUgIm1vZGVsIgorICBjb21tYW5kIHRoZXNlIGRheXMgYW5kL29yIGFuIGlvc2NhbiBjb21tYW5kIChzZWUgbWFucGFnZSkgdG8gZ3Vlc3Mgd2hhdAorICB0aGUgZHJpdmVycyAoYnRsYW5bMzQ1Nl0sIGdlbGFuLCBldGMpIG1pZ2h0IGJlIGludm9sdmVkIGluIGFkZGl0aW9uIHRvCisgIERMUEkuCisKKyAgQW5vdGhlciBvcHRpb24gaXMgdG8gdXBncmFkZSB0byAxMWkgYXMgb3V0Ym91bmQgcHJvbWlzY3VvdXMgbW9kZSBzdXBwb3J0CisgIGlzIHRoZXJlIGluIHRoZSBiYXNlIE9TLCBubyBwYXRjaGVzIHJlcXVpcmVkLgorCitBbm90aGVyIHBvc3Rpbmc6CisKKwlodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXBzP3NlbG09N2Q2Z3ZuJTI0YjMlMjQxJTQwb2NlYW4uY3VwLmhwLmNvbQorCitpbmRpY2F0ZXMgdGhhdCB5b3UgbmVlZCB0byBpbnN0YWxsIHRoZSBvcHRpb25hbCBTVFJFQU1TIHByb2R1Y3QgdG8gZG8KK2NhcHR1cmVzIG9uIEhQLVVYIDkueDoKKworICBOZXdzZ3JvdXBzOiBjb21wLnN5cy5ocC5ocHV4CisgIFN1YmplY3Q6ICBSZTogdGNwZHVtcCBIUC9VWCA5LngKKyAgRGF0ZTogMDMvMjIvMTk5OQorICBGcm9tOiBSaWNrIEpvbmVzIDxmb29AYmFyLmJhej4KKworICBEYXZlIEJhcnIgKGJhcnJAY2lzLm9oaW8tc3RhdGUuZWR1KSB3cm90ZToKKyAgOiBIYXMgYW55b25lIHBvcnRlZCB0Y3BkdW1wIChvciBzb21ldGhpbmcgc2ltaWxhcikgdG8gSFAvVVggOS54PworICAKKyAgSSdtIHJlYXNvbmFibHkgY29uZmlkZW50IHRoYXQgYW55IHBvcnQgb2YgdGNwZHVtcCB0byA5Llggd291bGQgcmVxdWlyZQorICB0aGUgKHRoZW4gb3B0aW9uYWwpIFNUUkVBTVMgcHJvZHVjdC4gIFRoaXMgd291bGQgYnJpbmcgRExQSSwgd2hpY2ggaXMKKyAgd2hhdCBvbmUgdXNlcyB0byBhY2Nlc3MgaW50ZXJmYWNlcyBpbiBwcm9taXNjdW91cyBtb2RlLgorICAKKyAgSSdtIG5vdCBzdXJlIHRoYXQgSFAgZXZlbiBzZWxscyB0aGUgOS5YIFNUUkVBTVMgcHJvZHVjdCBhbnkgbG9uZ2VyLAorICBzaW5jZSBIUC1VWCA5LlggaXMgb2ZmIHRoZSBwcmljZWxpc3QgKHdlbGwsIG1heWJlIDkuMTAgZm9yIHRoZSBvbGQgNjhLCisgIGRldmljZXMpLiAKKyAgCisgIFlvdXIgYmVzdCBiZXQgaXMgdG8gYmUgdXAgb24gMTAuMjAgb3IgYmV0dGVyIGlmIHRoYXQgaXMgYXQgYWxsCisgIHBvc3NpYmxlLiAgSWYgeW91ciBoYXJkd2FyZSBpcyBzdXBwb3J0ZWQgYnkgaXQsIEknZCBnbyB3aXRoIEhQLVVYIDExLiAKKyAgSWYgeW91IHdhbnQgdG8gc2VlIHRoZSBzeXN0ZW0ncyBvd24gb3V0Ym91bmQgdHJhZmZpYywgeW91J2xsIG5ldmVyIGdldAorICB0aGF0IGZ1bmN0aW9uYWxpdHkgb24gOS5YLCBidXQgaXQgbWlnaHQgaGFwcGVuIGF0IHNvbWUgcG9pbnQgZm9yIDEwLjIwCisgIGFuZCAxMS5YLiAKKyAgCisgIHJpY2sgam9uZXMKKworKGFzIHBlciBvdGhlciBtZXNzYWdlcyBjaXRlZCBoZXJlLCB0aGUgYWJpbGl0eSB0byBzZWUgdGhlIHN5c3RlbSdzIG93bgorb3V0Ym91bmQgdHJhZmZpYyBkaWQgaGFwcGVuKS4KKworUmljayBKb25lcyByZXBvcnRzIHRoYXQgSFAtVVggMTFpIG5lZWRzIG5vIHBhdGNoZXMgZm9yIG91dGJvdW5kCitwcm9taXNjdW91cyBtb2RlIHN1cHBvcnQuCisKK0FuIGFkZGl0aW9uYWwgbm90ZSwgZnJvbSBKb3N0IE1hcnRpbiwgZm9yIEhQLVVYIDEwLjIwOgorCisJUTogSG93IGRvIEkgZ2V0IGV0aGVyZXJhbCBvbiBIUFVYIHRvIGNhcHR1cmUgdGhlIF9vdXRnb2luZ18gcGFja2V0cworCSAgIG9mIGFuIGludGVyZmFjZQorCUE6IFlvdSBuZWVkIHRvIGdldCBQSE5FXzIwODkyLFBITkVfMjA3MjUgYW5kIFBIQ09fMTA5NDcgKG9yCisJICAgbmV3ZXIsIHRoaXMgaXMgYXMgb2YgNC40LjAwKSBhbmQgaXRzIGRlcGVuZGVuY2llcy4gIFRoZW4geW91IGNhbgorCSAgIGVuYWJsZSB0aGUgZmVhdHVyZSBhcyBkZXNjaWJlZCBiZWxvdzoKKworCVBhdGNoIE5hbWU6IFBITkVfMjA4OTIKKwlQYXRjaCBEZXNjcmlwdGlvbjogczcwMCAxMC4yMCBQQ0kgMTAwQmFzZS1UIGN1bXVsYXRpdmUgcGF0Y2gKKwkJVG8gdHJhY2UgdGhlIG91dGJvdW5kIHBhY2tldHMsIHBsZWFzZSBkbyB0aGUgZm9sbG93aW5nCisJCXRvIHR1cm4gb24gYSBnbG9iYWwgcHJvbWlzY3VvdXMgc3dpdGNoIGJlZm9yZSBydW5uaW5nCisJCXRoZSBwcm9taXNjdW91cyBhcHBsaWNhdGlvbnMgbGlrZSBzbm9vcCBvciB0Y3BkdW1wOgorCisJCWFkYiAtdyAvc3RhbmQvdm11bml4IC9kZXYvbWVtCisJCWxhbmNfb3V0Ym91bmRfcHJvbWlzY19mbGFnL1cgMQorCQkoYWRiIHdpbGwgZWNobyB0aGUgcmVzdWx0IHNob3dpbmcgdGhhdCB0aGUgZmxhZyBoYXMKKwkJYmVlbiBjaGFuZ2VkKQorCQkkcXVpdAorCShUaGFua3MgZm9yIHRoaXMgcGFydCB0byBIUC1zdXBwb3J0LCBSYXRpbmdlbikKKworCQlUaGUgYXR0YWNoZWQgaGFjayBkb2VzIHRoaXMgYW5kIHNvbWUgc2VjdXJpdHktcmVsYXRlZCBzdHVmZgorCSh0aGFua3MgdG8gaGlsZGViQHd3dy5zdGFobC5iYXUudHUtYnMuZGUgKFJhbGYgSGlsZGVicmFuZHQpIHdobworCXBvc3RlZCB0aGUgc2VjdXJpdHktcGFydCBzb21lIHRpbWUgYWdvKQorCisJCSA8PGhhY2tfaXBfc3RhY2s+PiAKKworCQkoRG9uJ3Qgc3dpdGNoIElQLWZvcndhcmRpbmcgb2ZmLCBpZiB5b3UgbmVlZCBpdCAhKQorCQlJbnN0YWxsIHRoZSBoYWNrIGFzIC9zYmluL2luaXQuZC9oYWNsX2lwX3N0YWNrIChhZGp1c3QKKwlwZXJtaXNzaW9ucyAhKSBhbmQgbWFrZSBhIHNlcXVlbmNpbmctc3ltbGluaworCS9zYmluL3JjMi5kL1MzNTBoYWNrX2lwX3N0YWNrIHBvaW50aW5nIHRvIHRoaXMgc2NyaXB0LiAKKwkJTm93IGFsbCB0aGlzIGlzIGRvbmUgb24gZXZlcnkgcmVib290LgorCitBY2NvcmRpbmcgdG8gUmljayBKb25lcywgdGhlIGdsb2JhbCBwcm9taXNjdW91cyBzd2l0Y2ggYWxzbyBoYXMgdG8gYmUKK3R1cm5lZCBvbiBmb3IgSFAtVVggMTEuMDAsIGJ1dCBub3QgZm9yIDExaSAtIGFuZCwgaW4gZmFjdCwgdGhlIHN3aXRjaAorZG9lc24ndCBldmVuIGV4aXN0IG9uIDExaS4KKworSGVyZSdzIHRoZSAiaGFja19pcF9zdGFjayIgc2NyaXB0OgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUN1dCBIZXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyEvc2Jpbi9zaAorIworIyBuZXR0dW5lOiAgaGFjayBrZXJuZWwgcGFybXMgZm9yIHNhZmV0eQorCitPS0FZPTAKK0VSUk9SPS0xCisKKyMgL3Vzci9jb250cmliL2JpbiBmdWVyIG5ldHR1bmUgYXVmIFBmYWQKK1BBVEg9L3NiaW46L3Vzci9zYmluOi91c3IvYmluOi91c3IvY29udHJpYi9iaW4KK2V4cG9ydCBQQVRICisKKworIyMjIyMjIyMjIworIyAgbWFpbiAgIworIyMjIyMjIyMjIworCitjYXNlICQxIGluCisgICBzdGFydF9tc2cpCisgICAgICBwcmludCAiVHVuZSBJUC1TdGFjayBmb3Igc2VjdXJpdHkiCisgICAgICBleGl0ICRPS0FZCisgICAgICA7OworCisgICBzdG9wX21zZykKKyAgICAgIHByaW50ICJUaGlzIGFjdGlvbiBpcyBub3QgYXBwbGljYWJsZSIKKyAgICAgIGV4aXQgJE9LQVkKKyAgICAgIDs7CisKKyAgIHN0b3ApCisgICAgICBleGl0ICRPS0FZCisgICAgICA7OworCisgICBzdGFydCkKKyAgICAgIDs7ICAjIGZhbGwgdGhyb3VnaAorCisgICAqKQorICAgICAgcHJpbnQgIlVTQUdFOiAkMCB7c3RhcnRfbXNnIHwgc3RvcF9tc2cgfCBzdGFydCB8IHN0b3B9IiA+JjIKKyAgICAgIGV4aXQgJEVSUk9SCisgICAgICA7OworICAgZXNhYworCisjIyMjIyMjIyMjIworIyAgc3RhcnQgICMKKyMjIyMjIyMjIyMjCisKKyMKKyMgdGNwLVNlcXVlbmNlLU51bWJlcnMgbmljaHQgbWVociBpbmtyZW1lbnRpZXJlbiBzb25kZXJuIHJhbmRvbQorIyBTeW4tRmxvb2QtUHJvdGVjdGlvbiBhbgorIyBpcF9mb3J3YXJkaW5nIGF1cworIyBTb3VyY2UtUm91dGluZyBhdXMKKyMgQXVzZ2VoZW5kZSBQYWNrZXRzIGFuIGV0aGVyZWFsL3RjcGR1bXAgZXRjLgorCisvdXNyL2NvbnRyaWIvYmluL25ldHR1bmUgLXMgdGNwX3JhbmRvbV9zZXEgMiB8fCBleGl0ICRFUlJPUgorL3Vzci9jb250cmliL2Jpbi9uZXR0dW5lIC1zIGhwX3N5bl9wcm90ZWN0IDEgfHwgZXhpdCAkRVJST1IKKy91c3IvY29udHJpYi9iaW4vbmV0dHVuZSAtcyBpcF9mb3J3YXJkaW5nIDAgfHwgZXhpdCAkRVJST1IKK2VjaG8gJ2lwX2Jsb2NrX3NvdXJjZV9yb3V0ZWQvVzEnIHwgL3Vzci9iaW4vYWRiIC13IC9zdGFuZC92bXVuaXggL2Rldi9rbWVtIHx8IGV4aXQgJEVSUk9SCitlY2hvICdsYW5jX291dGJvdW5kX3Byb21pc2NfZmxhZy9XIDEnIHwgYWRiIC13IC9zdGFuZC92bXVuaXggL2Rldi9tZW0gIHx8IGV4aXQgJEVSUk9SCisKK2V4aXQgJE9LQVkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tQ3V0IEhlcmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1JFQURNRS5saW51eCBiL2xpYnBjYXAtMS4zLjAvUkVBRE1FLmxpbnV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MmNkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1JFQURNRS5saW51eApAQCAtMCwwICsxLDEwOCBAQAorSW4gb3JkZXIgZm9yIGxpYnBjYXAgdG8gYmUgYWJsZSB0byBjYXB0dXJlIHBhY2tldHMgb24gYSBMaW51eCBzeXN0ZW0sCit0aGUgInBhY2tldCIgcHJvdG9jb2wgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgeW91ciBrZXJuZWwuICBJZiBpdCBpcyBub3QsCit5b3UgbWF5IGdldCBlcnJvciBtZXNzYWdlcyBzdWNoIGFzCisKKwltb2Rwcm9iZTogY2FuJ3QgbG9jYXRlIG1vZHVsZSBuZXQtcGYtMTcKKworaW4gIi92YXIvYWRtL21lc3NhZ2VzIiwgb3IgbWF5IGdldCBtZXNzYWdlcyBzdWNoIGFzCisKKwlzb2NrZXQ6IEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wKKworZnJvbSBhcHBsaWNhdGlvbnMgdXNpbmcgbGlicGNhcC4KKworWW91IG11c3QgY29uZmlndXJlIHRoZSBrZXJuZWwgd2l0aCB0aGUgQ09ORklHX1BBQ0tFVCBvcHRpb24gZm9yIHRoaXMKK3Byb3RvY29sOyB0aGUgZm9sbG93aW5nIG5vdGUgaXMgZnJvbSB0aGUgTGludXggIkNvbmZpZ3VyZS5oZWxwIiBmaWxlIGZvcgordGhlIDIuMFsueF0ga2VybmVsOgorCisJUGFja2V0IHNvY2tldAorCUNPTkZJR19QQUNLRVQKKwkgIFRoZSBQYWNrZXQgcHJvdG9jb2wgaXMgdXNlZCBieSBhcHBsaWNhdGlvbnMgd2hpY2ggY29tbXVuaWNhdGUKKwkgIGRpcmVjdGx5IHdpdGggbmV0d29yayBkZXZpY2VzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXRlIG5ldHdvcmsKKwkgIHByb3RvY29sIGltcGxlbWVudGVkIGluIHRoZSBrZXJuZWwsIGUuZy4gdGNwZHVtcC4gSWYgeW91IHdhbnQgdGhlbQorCSAgdG8gd29yaywgY2hvb3NlIFkuIAorCisJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSBjYWxsZWQgYWZfcGFja2V0Lm8gKCA9CisJICBjb2RlIHdoaWNoIGNhbiBiZSBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbAorCSAgd2hlbmV2ZXIgeW91IHdhbnQpLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTQorCSAgaGVyZSBhbmQgcmVhZCBEb2N1bWVudGF0aW9uL21vZHVsZXMudHh0OyBpZiB5b3UgdXNlIG1vZHByb2JlIG9yCisJICBrbW9kLCB5b3UgbWF5IGFsc28gd2FudCB0byBhZGQgImFsaWFzIG5ldC1wZi0xNyBhZl9wYWNrZXQiIHRvIAorCSAgL2V0Yy9tb2R1bGVzLmNvbmYuCisKK2FuZCB0aGUgbm90ZSBmb3IgdGhlIDIuMlsueF0ga2VybmVsIHNheXM6CisKKwlQYWNrZXQgc29ja2V0CisJQ09ORklHX1BBQ0tFVAorCSAgVGhlIFBhY2tldCBwcm90b2NvbCBpcyB1c2VkIGJ5IGFwcGxpY2F0aW9ucyB3aGljaCBjb21tdW5pY2F0ZQorCSAgZGlyZWN0bHkgd2l0aCBuZXR3b3JrIGRldmljZXMgd2l0aG91dCBhbiBpbnRlcm1lZGlhdGUgbmV0d29yaworCSAgcHJvdG9jb2wgaW1wbGVtZW50ZWQgaW4gdGhlIGtlcm5lbCwgZS5nLiB0Y3BkdW1wLiBJZiB5b3Ugd2FudCB0aGVtCisJICB0byB3b3JrLCBjaG9vc2UgWS4gVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgY2FsbGVkCisJICBhZl9wYWNrZXQubyAoID0gY29kZSB3aGljaCBjYW4gYmUgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUKKwkgIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdSB3YW50KS4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhCisJICBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQgRG9jdW1lbnRhdGlvbi9tb2R1bGVzLnR4dC4gIFlvdSB3aWxsCisJICBuZWVkIHRvIGFkZCAnYWxpYXMgbmV0LXBmLTE3IGFmX3BhY2tldCcgdG8geW91ciAvZXRjL2NvbmYubW9kdWxlcworCSAgZmlsZSBmb3IgdGhlIG1vZHVsZSB2ZXJzaW9uIHRvIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkuICBJZiB1bnN1cmUsCisJICBzYXkgWS4KKworSW4gYWRkaXRpb24sIHRoZXJlIGlzIGFuIG9wdGlvbiB0aGF0LCBpbiAyLjIgYW5kIGxhdGVyIGtlcm5lbHMsIHdpbGwKK2FsbG93IHBhY2tldCBjYXB0dXJlIGZpbHRlcnMgc3BlY2lmaWVkIHRvIHByb2dyYW1zIHN1Y2ggYXMgdGNwZHVtcCB0byBiZQorZXhlY3V0ZWQgaW4gdGhlIGtlcm5lbCwgc28gdGhhdCBwYWNrZXRzIHRoYXQgZG9uJ3QgcGFzcyB0aGUgZmlsdGVyIHdvbid0CitiZSBjb3BpZWQgZnJvbSB0aGUga2VybmVsIHRvIHRoZSBwcm9ncmFtLCByYXRoZXIgdGhhbiBoYXZpbmcgYWxsIHBhY2tldHMKK2NvcGllZCB0byB0aGUgcHJvZ3JhbSBhbmQgbGlicGNhcCBkb2luZyB0aGUgZmlsdGVyaW5nIGluIHVzZXIgbW9kZS4gCisKK0NvcHlpbmcgcGFja2V0cyBmcm9tIHRoZSBrZXJuZWwgdG8gdGhlIHByb2dyYW0gY29uc3VtZXMgYSBzaWduaWZpY2FudAorYW1vdW50IG9mIENQVSwgc28gZmlsdGVyaW5nIGluIHRoZSBrZXJuZWwgY2FuIHJlZHVjZSB0aGUgb3ZlcmhlYWQgb2YKK2NhcHR1cmluZyBwYWNrZXRzIGlmIGEgZmlsdGVyIGhhcyBiZWVuIHNwZWNpZmllZCB0aGF0IGRpc2NhcmRzIGEKK3NpZ25pZmljYW50IG51bWJlciBvZiBwYWNrZXRzLiAgKElmIG5vIGZpbHRlciBpcyBzcGVjaWZpZWQsIGl0IG1ha2VzIG5vCitkaWZmZXJlbmNlIHdoZXRoZXIgdGhlIGZpbHRlcmluZyBpc24ndCBwZXJmb3JtZWQgaW4gdGhlIGtlcm5lbCBvciBpc24ndAorcGVyZm9ybWVkIGluIHVzZXIgbW9kZS4gOi0pKQorCitUaGUgb3B0aW9uIGZvciB0aGlzIGlzIHRoZSBDT05GSUdfRklMVEVSIG9wdGlvbjsgdGhlICJDb25maWd1cmUuaGVscCIKK2ZpbGUgc2F5czoKKworCVNvY2tldCBmaWx0ZXJpbmcKKwlDT05GSUdfRklMVEVSCisJICBUaGUgTGludXggU29ja2V0IEZpbHRlciBpcyBkZXJpdmVkIGZyb20gdGhlIEJlcmtlbGV5IFBhY2tldCBGaWx0ZXIuCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgdXNlci1zcGFjZSBwcm9ncmFtcyBjYW4gYXR0YWNoIGEgZmlsdGVyIHRvIGFueQorCSAgc29ja2V0IGFuZCB0aGVyZWJ5IHRlbGwgdGhlIGtlcm5lbCB0aGF0IGl0IHNob3VsZCBhbGxvdyBvciBkaXNhbGxvdworCSAgY2VydGFpbiB0eXBlcyBvZiBkYXRhIHRvIGdldCB0aHJvdWdoIHRoZSBzb2NrZXQuIExpbnV4IFNvY2tldAorCSAgRmlsdGVyaW5nIHdvcmtzIG9uIGFsbCBzb2NrZXQgdHlwZXMgZXhjZXB0IFRDUCBmb3Igbm93LiBTZWUgdGhlIHRleHQKKwkgIGZpbGUgbGludXgvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2ZpbHRlci50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitOb3RlIHRoYXQsIGJ5IGRlZmF1bHQsIGxpYnBjYXAgd2lsbCwgaWYgbGlibmwgaXMgcHJlc2VudCwgYnVpbGQgd2l0aCBpdDsKK2l0IHVzZXMgbGlibmwgdG8gc3VwcG9ydCBtb25pdG9yIG1vZGUgb24gbWFjODAyMTEgZGV2aWNlcy4gIFRoZXJlIGlzIGEKK2NvbmZpZ3VyYXRpb24gb3B0aW9uIHRvIGRpc2FibGUgYnVpbGRpbmcgd2l0aCBsaWJubCwgYnV0LCBpZiB0aGF0IG9wdGlvbgoraXMgY2hvc2VuLCB0aGUgbW9uaXRvci1tb2RlIEFQSXMgKGFzIHVzZWQgYnkgdGNwZHVtcCdzICItSSIgZmxhZywgYW5kIGFzCit3aWxsIHByb2JhYmx5IGJlIHVzZWQgYnkgb3RoZXIgYXBwbGljYXRpb25zIGluIHRoZSBmdXR1cmUpIHdvbid0IHdvcmsKK3Byb3Blcmx5IG9uIG1hYzgwMjExIGRldmljZXMuCisKK0xpbnV4J3MgcnVuLXRpbWUgbGlua2VyIGFsbG93cyBzaGFyZWQgbGlicmFyaWVzIHRvIGJlIGxpbmtlZCB3aXRoIG90aGVyCitzaGFyZWQgbGlicmFyaWVzLCB3aGljaCBtZWFucyB0aGF0IGlmIGFuIG9sZGVyIHZlcnNpb24gb2YgYSBzaGFyZWQKK2xpYnJhcnkgZG9lc24ndCByZXF1aXJlIHJvdXRpbmVzIGZyb20gc29tZSBvdGhlciBzaGFyZWQgbGlicmFyeSwgYW5kIGEKK2xhdGVyIHZlcnNpb24gb2YgdGhlIHNoYXJlZCBsaWJyYXJ5IGRvZXMgcmVxdWlyZSB0aG9zZSByb3V0aW5lcywgdGhlCitsYXRlciB2ZXJzaW9uIG9mIHRoZSBzaGFyZWQgbGlicmFyeSBjYW4gYmUgbGlua2VkIHdpdGggdGhhdCBvdGhlciBzaGFyZWQKK2xpYnJhcnkgYW5kLCBpZiBpdCdzIG90aGVyd2lzZSBiaW5hcnktY29tcGF0aWJsZSB3aXRoIHRoZSBvbGRlciB2ZXJzaW9uLAorY2FuIHJlcGxhY2UgdGhhdCBvbGRlciB2ZXJzaW9uIHdpdGhvdXQgYnJlYWtpbmcgYXBwbGljYXRpb25zIGJ1aWx0IHdpdGgKK3RoZSBvbGRlciB2ZXJzaW9uLCBhbmQgd2l0aG91dCBicmVha2luZyBjb25maWd1cmUgc2NyaXB0cyBvciB0aGUgYnVpbGQKK3Byb2NlZHVyZSBmb3IgYXBwbGljYXRpb25zIHdob3NlIGNvbmZpZ3VyZSBzY3JpcHQgZG9lc24ndCB1c2UgdGhlCitwY2FwLWNvbmZpZyBzY3JpcHQgaWYgdGhleSBidWlsZCB3aXRoIHRoZSBzaGFyZWQgbGlicmFyeS4gIChUaGUgYnVpbGQKK3Byb2NlZHVyZSBmb3IgYXBwbGljYXRpb25zIHdob3NlIGNvbmZpZ3VyZSBzY3JpcHRzIHVzZSB0aGUgcGNhcC1jb25maWcKK3NjcmlwdCBpZiBwcmVzZW50IHdpbGwgbm90IGJyZWFrIGV2ZW4gaWYgdGhleSBidWlsZCB3aXRoIHRoZSBzdGF0aWMKK2xpYnJhcnkuKQorCitTdGF0aXN0aWNzOgorU3RhdGlzdGljcyByZXBvcnRlZCBieSBwY2FwIGFyZSBwbGF0Zm9ybSBzcGVjaWZpYy4gIFRoZSBzdGF0aXN0aWNzCityZXBvcnRlZCBieSBwY2FwX3N0YXRzIG9uIExpbnV4IGFyZSBhcyBmb2xsb3dzOgorCisyLjIueAorPT09PT0KK3BzX3JlY3YgICBOdW1iZXIgb2YgcGFja2V0cyB0aGF0IHdlcmUgYWNjZXB0ZWQgYnkgdGhlIHBjYXAgZmlsdGVyCitwc19kcm9wICAgQWx3YXlzIDAsIHRoaXMgc3RhdGlzdGljIGlzIG5vdCBnYXRoZXJkIG9uIHRoaXMgcGxhdGZvcm0KKworMi40LngKKz09PT09Citwc19yZWN2ICAgTnVtYmVyIG9mIHBhY2tldHMgdGhhdCB3ZXJlIGFjY2VwdGVkIGJ5IHRoZSBwY2FwIGZpbHRlcgorcHNfZHJvcCAgIE51bWJlciBvZiBwYWNrZXRzIHRoYXQgaGFkIHBhc3NlZCBmaWx0ZXJpbmcgYnV0IHdlcmUgbm90CisgICAgICAgICAgcGFzc2VkIG9uIHRvIHBjYXAgZHVlIHRvIHRoaW5ncyBsaWtlIGJ1ZmZlciBzaG9ydGFnZSwgZXRjLgorICAgICAgICAgIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgdGhlc2UgYXJlIHBhY2tldHMgeW91IGFyZSBpbnRlcmVzdGVkIGluCisgICAgICAgICAgYnV0IHdvbid0IGJlIHJlcG9ydGVkIGJ5LCBmb3IgZXhhbXBsZSwgdGNwZHVtcCBvdXRwdXQuCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1JFQURNRS5tYWNvc3ggYi9saWJwY2FwLTEuMy4wL1JFQURNRS5tYWNvc3gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjOTIxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvUkVBRE1FLm1hY29zeApAQCAtMCwwICsxLDc0IEBACitBcyB3aXRoIG90aGVyIHN5c3RlbXMgdXNpbmcgQlBGLCBNYWMgT1MgWCBhbGxvd3MgdXNlcnMgd2l0aCByZWFkIGFjY2VzcwordG8gdGhlIEJQRiBkZXZpY2VzIHRvIGNhcHR1cmUgcGFja2V0cyB3aXRoIGxpYnBjYXAgYW5kIGFsbG93cyB1c2VycyB3aXRoCit3cml0ZSBhY2Nlc3MgdG8gdGhlIEJQRiBkZXZpY2VzIHRvIHNlbmQgcGFja2V0cyB3aXRoIGxpYnBjYXAuCisKK09uIHNvbWUgc3lzdGVtcyB0aGF0IHVzZSBCUEYsIHRoZSBCUEYgZGV2aWNlcyBsaXZlIG9uIHRoZSByb290IGZpbGUKK3N5c3RlbSwgYW5kIHRoZSBwZXJtaXNzaW9ucyBhbmQvb3Igb3duZXJzaGlwIG9uIHRob3NlIGRldmljZXMgY2FuIGJlCitjaGFuZ2VkIHRvIGdpdmUgdXNlcnMgb3RoZXIgdGhhbiByb290IHBlcm1pc3Npb24gdG8gcmVhZCBvciB3cml0ZSB0aG9zZQorZGV2aWNlcy4KKworT24gbmV3ZXIgdmVyc2lvbnMgb2YgRnJlZUJTRCwgdGhlIEJQRiBkZXZpY2VzIGxpdmUgb24gZGV2ZnMsIGFuZCBkZXZmcworY2FuIGJlIGNvbmZpZ3VyZWQgdG8gc2V0IHRoZSBwZXJtaXNzaW9ucyBhbmQvb3Igb3duZXJzaGlwIG9mIHRob3NlCitkZXZpY2VzIHRvIGdpdmUgdXNlcnMgb3RoZXIgdGhhbiByb290IHBlcm1pc3Npb24gdG8gcmVhZCBvciB3cml0ZSB0aG9zZQorZGV2aWNlcy4KKworT24gTWFjIE9TIFgsIHRoZSBCUEYgZGV2aWNlcyBsaXZlIG9uIGRldmZzLCBidXQgdGhlIE9TIFggdmVyc2lvbiBvZgorZGV2ZnMgaXMgYmFzZWQgb24gYW4gb2xkZXIgKG5vbi1kZWZhdWx0KSBGcmVlQlNEIGRldmZzLCBhbmQgdGhhdCB2ZXJzaW9uCitvZiBkZXZmcyBjYW5ub3QgYmUgY29uZmlndXJlZCB0byBzZXQgdGhlIHBlcm1pc3Npb25zIGFuZC9vciBvd25lcnNoaXAgb2YKK3Rob3NlIGRldmljZXMuCisKK1RoZXJlZm9yZSwgd2Ugc3VwcGx5OgorCisJYSAic3RhcnR1cCBpdGVtIiBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgTWFjIE9TIFg7CisKKwlhIGxhdW5jaGQgZGFlbW9uIGZvciBUaWdlciBhbmQgbGF0ZXIgdmVyc2lvbnMgb2YgTWFjIE9TIFg7CisKK0JvdGggb2YgdGhlbSB3aWxsIGNoYW5nZSB0aGUgb3duZXJzaGlwIG9mIHRoZSBCUEYgZGV2aWNlcyBzbyB0aGF0IHRoZQorImFkbWluIiBncm91cCBvd25zIHRoZW0sIGFuZCB3aWxsIGNoYW5nZSB0aGUgcGVybWlzc2lvbiBvZiB0aGUgQlBGCitkZXZpY2VzIHRvIHJ3LXJ3LS0tLSwgc28gdGhhdCBhbGwgdXNlcnMgaW4gdGhlICJhZG1pbiIgZ3JvdXAgLSBpLmUuLCBhbGwKK3VzZXJzIHdpdGggIkFsbG93IHVzZXIgdG8gYWRtaW5pc3RlciB0aGlzIGNvbXB1dGVyIiB0dXJuZWQgb24gLSBoYXZlCitib3RoIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyB0byB0aGVtLgorCitUaGUgc3RhcnR1cCBpdGVtIGlzIGluIHRoZSBDaG1vZEJQRiBkaXJlY3RvcnkgaW4gdGhlIHNvdXJjZSB0cmVlLiAgQQorL0xpYnJhcnkvU3RhcnR1cEl0ZW1zIGRpcmVjdG9yeSBzaG91bGQgYmUgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGFscmVhZHkKK2V4aXN0LCBhbmQgdGhlIENobW9kQlBGIGRpcmVjdG9yeSBzaG91bGQgYmUgY29waWVkIHRvIHRoZQorL0xpYnJhcnkvU3RhcnR1cEl0ZW1zIGRpcmVjdG9yeSAoY29weSB0aGUgZW50aXJlIGRpcmVjdG9yeSwgc28gdGhhdAordGhlcmUncyBhIC9MaWJyYXJ5L1N0YXJ0dXBJdGVtcy9DaG1vZEJQRiBkaXJlY3RvcnksIGNvbnRhaW5pbmcgYWxsIHRoZQorZmlsZXMgaW4gdGhlIHNvdXJjZSB0cmVlJ3MgQ2htb2RCUEYgZGlyZWN0b3J5OyBkb24ndCBjb3B5IHRoZSBpbmRpdmlkdWFsCitpdGVtcyBpbiB0aGF0IGRpcmVjdG9yeSB0byAvTGlicmFyeS9TdGFydHVwSXRlbXMpLiAgVGhlIENobW9kQlBGCitkaXJlY3RvcnksIGFuZCBhbGwgZmlsZXMgdW5kZXIgaXQsIG11c3QgYmUgb3duZWQgYnkgcm9vdC4gIEluc3RhbGxpbmcKK3RoZSBmaWxlcyB3b24ndCBpbW1lZGlhdGVseSBjYXVzZSB0aGUgc3RhcnR1cCBpdGVtIHRvIGJlIGV4ZWN1dGVkOyBpdAord2lsbCBiZSBleGVjdXRlZCBvbiB0aGUgbmV4dCByZWJvb3QuICBUbyBjaGFuZ2UgdGhlIHBlcm1pc3Npb25zIGJlZm9yZQordGhlIHJlYm9vdCwgcnVuCisKKwlzdWRvIFN5c3RlbVN0YXJ0ZXIgc3RhcnQgQ2htb2RCUEYKKworVGhlIGxhdW5jaGQgZGFlbW9uIGlzIHRoZSBjaG1vZF9icGYgc2NyaXB0LCBwbHVzIHRoZQorb3JnLnRjcGR1bXAuY2htb2RfYnBmLnBsaXN0IGxhdW5jaGQgcGxpc3QgZmlsZS4gIGNobW9kX2JwZiBzaG91bGQgYmUKK2luc3RhbGxlZCBpbiAvdXNyL2xvY2FsL2Jpbi9jaG1vZF9icGYsIGFuZCBvcmcudGNwZHVtcC5jaG1vZF9icGYucGxpc3QKK3Nob3VsZCBiZSBpbnN0YWxsZWQgaW4gL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy4gIGNobW9kX2JwZiwgYW5kCitvcmcudGNwZHVtcC5jaG1vZF9icGYucGxpc3QsIG11c3QgYmUgb3duZWQgYnkgcm9vdC4gIEluc3RhbGxpbmcgdGhlCitzY3JpcHQgYW5kIHBsaXN0IGZpbGUgd29uJ3QgaW1tZWRpYXRlbHkgY2F1c2UgdGhlIHNjcmlwdCB0byBiZSBleGVjdXRlZDsKK2l0IHdpbGwgYmUgZXhlY3V0ZWQgb24gdGhlIG5leHQgcmVib290LiAgVG8gY2hhbmdlIHRoZSBwZXJtaXNzaW9ucworYmVmb3JlIHRoZSByZWJvb3QsIHJ1bgorCisJc3VkbyAvdXNyL2xvY2FsL2Jpbi9jaG1vZF9icGYKKworb3IKKworCXN1ZG8gbGF1bmNoY3RsIGxvYWQgL0xpYnJhcnkvTGF1bmNoRGFlbW9ucy9vcmcudGNwZHVtcC5jaG1vZF9icGYucGxpc3QKKworSWYgeW91IHdhbnQgdG8gZ2l2ZSBhIHBhcnRpY3VsYXIgdXNlciBwZXJtaXNzaW9uIHRvIGFjY2VzcyB0aGUgQlBGCitkZXZpY2VzLCByYXRoZXIgdGhhbiBnaXZpbmcgYWxsIGFkbWluaXN0cmF0aXZlIHVzZXJzIHBlcm1pc3Npb24gdG8KK2FjY2VzcyB0aGVtLCB5b3UgY2FuIGhhdmUgdGhlIENobW9kQlBGL0NobW9kQlBGIHNjcmlwdCBjaGFuZ2UgdGhlCitvd25lcnNoaXAgb2YgL2Rldi9icGYqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHBlcm1pc3Npb25zLiAgSWYgeW91IHdhbnQgdG8KK2dpdmUgYSBwYXJ0aWN1bGFyIHVzZXIgcGVybWlzc2lvbiB0byByZWFkIGFuZCB3cml0ZSB0aGUgQlBGIGRldmljZXMgYW5kCitnaXZlIHRoZSBhZG1pbmlzdHJhdGl2ZSB1c2VycyBwZXJtaXNzaW9uIHRvIHJlYWQgYnV0IG5vdCB3cml0ZSB0aGUgQlBGCitkZXZpY2VzLCB5b3UgY2FuIGhhdmUgdGhlIHNjcmlwdCBjaGFuZ2UgdGhlIG93bmVyIHRvIHRoYXQgdXNlciwgdGhlCitncm91cCB0byAiYWRtaW4iLCBhbmQgdGhlIHBlcm1pc3Npb25zIHRvIHJ3LXItLS0tLS4gIE90aGVyIHBvc3NpYmlsaXRpZXMKK2FyZSBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLgorCisoTk9URTogZHVlIHRvIGEgYnVnIGluIFNub3cgTGVvcGFyZCwgaWYgeW91IGNoYW5nZSB0aGUgcGVybWlzc2lvbnMgbm90Cit0byBncmFudCB3cml0ZSBwZXJtaXNzaW9uIHRvIGV2ZXJ5Ym9keSB3aG8gc2hvdWxkIGJlIGFsbG93ZWQgdG8gY2FwdHVyZQordHJhZmZpYywgbm9uLXJvb3QgdXNlcnMgd2hvIGNhbm5vdCBvcGVuIHRoZSBCUEYgZGV2aWNlcyBmb3Igd3JpdGluZyB3aWxsCitub3QgYmUgYWJsZSB0byBjYXB0dXJlIG91dGdvaW5nIHBhY2tldHMuKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9SRUFETUUuc2VwdGVsIGIvbGlicGNhcC0xLjMuMC9SRUFETUUuc2VwdGVsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzg4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1JFQURNRS5zZXB0ZWwKQEAgLTAsMCArMSw1MCBAQAorVGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgYXBwbHkgaWYgeW91IGhhdmUgYSBMaW51eCBwbGF0Zm9ybSBhbmQgd2FudAorbGlicGNhcCB0byBzdXBwb3J0IHRoZSBTZXB0ZWwgcmFuZ2Ugb2YgcGFzc2l2ZSBuZXR3b3JrIG1vbml0b3JpbmcgY2FyZHMKK2Zyb20gSW50ZWwgKGh0dHA6Ly93d3cuaW50ZWwuY29tKQorCisxKSBJbnN0YWxsIGFuZCBidWlsZCB0aGUgU2VwdGVsIHNvZnR3YXJlIGRpc3RyaWJ1dGlvbiBieSBmb2xsb3dpbmcgdGhlCitpbnN0cnVjdGlvbnMgc3VwcGxpZWQgd2l0aCB0aGF0IHBhY2thZ2UuCisKKzIpIENvbmZpZ3VyZSBsaWJjYXAuIFRvIGFsbG93IHRoZSAnY29uZmlndXJlJyBzY3JpcHQgdG8gbG9jYXRlIHRoZSBTZXB0ZWwKK3NvZnR3YXJlIGRpc3RyaWJ1dGlvbiB1c2UgdGhlICctLXdpdGgtc2VwdGVsJyBvcHRpb246CisKKyAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXNlcHRlbD1ESVIKKword2hlcmUgRElSIGlzIHRoZSByb290IG9mIHRoZSBTZXB0ZWwgc29mdHdhcmUgZGlzdHJpYnV0aW9uLCBmb3IgZXhhbXBsZQorL3Zhci9zcmMvc2VwdGVsLgorCitCeSBkZWZhdWx0IChpZiB5b3Ugd3JpdGUgb25seSAuL2NvbmZpZ3VyZSAtLXdpdGgtc2VwdGVsKSBpdCB0YWtlcworLi8uLi9zZXB0ZWwgYXMgYXJndW1lbnQgZm9yIERJUi4gCisKK0lmIHRoZSBTZXB0ZWwgc29mdHdhcmUgaXMgY29ycmVjdGx5IGRldGVjdGVkICdjb25maWd1cmUnIHdpbGwKK3JlcG9ydDoKKworICAgICAgICBjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgU2VwdGVsIEFQSS4uLiB5ZXMKKworSWYgJ2NvbmZpZ3VyZScgcmVwb3J0cyB0aGF0IHRoZXJlIGlzIG5vIFNlcHRlbCBBUEksIHRoZSBkaXJlY3RvcnkgbWF5IGhhdmUgYmVlbgoraW5jb3JyZWN0bHkgc3BlY2lmaWVkIG9yIHRoZSBTZXB0ZWwgc29mdHdhcmUgd2FzIG5vdCBidWlsdCBiZWZvcmUgY29uZmlndXJpbmcKK2xpYnBjYXAuCisKK1NlZSBhbHNvIHRoZSBsaWJwY2FwIElOU1RBTEwudHh0IGZpbGUgZm9yIGZ1cnRoZXIgbGlicGNhcCBjb25maWd1cmF0aW9uCitvcHRpb25zLgorCitCdWlsZGluZyBsaWJwY2FwIGF0IHRoaXMgc3RhZ2Ugd2lsbCBpbmNsdWRlIHN1cHBvcnQgZm9yIGJvdGggdGhlIG5hdGl2ZQorcGFja2V0IGNhcHR1cmUgc3RyZWFtIGFuZCBmb3IgY2FwdHVyaW5nIGZyb20gU2VwdGVsIGNhcmRzLiAgVG8gYnVpbGQKK2xpYnBjYXAgd2l0aCBvbmx5IFNlcHRlbCBzdXBwb3J0IHNwZWNpZnkgdGhlIGNhcHR1cmUgdHlwZSBhcyAnc2VwdGVsJword2hlbiBjb25maWd1cmluZyBsaWJwY2FwOgorCisgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1zZXB0ZWw9RElSIC0td2l0aC1wY2FwPXNlcHRlbAorCitBcHBsaWNhdGlvbnMgYnVpbHQgd2l0aCBsaWJwY2FwIGNvbmZpZ3VyZWQgaW4gdGhpcyB3YXkgd2lsbCBvbmx5IGRldGVjdCBTZXB0ZWwKK2NhcmRzIGFuZCB3aWxsIG5vdCBjYXB0dXJlIGZyb20gdGhlIG5hdGl2ZSBPUyBwYWNrZXQgc3RyZWFtLgorCitOb3RlOiBBcyBtZW50aW9uZWQgaW4gcGNhcC1zZXB0ZWwuYyB3ZSBzaG91bGQgZmlyc3QgZWRpdCB0aGUgc3lzdGVtLnR4dAorZmlsZSB0byBjaGFuZ2UgdGhlIHVzZXIgcGFydCBleGFtcGxlIChVUEUpIG1vZHVsZSBpZCB0byAweGRkIGluc3RlYWQgb2YKKzB4MmQgZm9yIHRlY2huaWNhbCByZWFzb24uICBTbyB0aGlzIGNoYW5nZSBpbiBzeXN0ZW0udHh0IGlzIGNydXRpYWwgYW5kCit0aGluZ3Mgd2lsbCBnbyB3cm9uZyBpZiBpdCdzIG5vdCBkb25lLiAgU3lzdGVtLnR4dCBhbG9uZyB3aXRoIGNvbmZpZy50eHQKK2FyZSBjb25maWd1cmF0aW9uIGZpbGVzIHRoYXQgYXJlIGVkaXRlZCBieSB0aGUgdXNlciBiZWZvcmUgcnVubmluZyB0aGUKK2djdGxvYWQgcHJvZ3JhbSB0aGF0IHVzZXMgdGhlc2UgZmlsZXMgZm9yIGluaXRpYWxpc2luZyBtb2R1bGVzIGFuZAorY29uZmlndXJpbmcgcGFyYW1ldGVycy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIGNvbnRhY3QgbWUgOiBnaWxfaG95ZWtAaG90bWFpbC5jb20KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvUkVBRE1FLnNpdGEgYi9saWJwY2FwLTEuMy4wL1JFQURNRS5zaXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlN2E0MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1JFQURNRS5zaXRhCkBAIC0wLDAgKzEsNjQgQEAKK1RoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIGFwcGx5IGlmIHlvdSBoYXZlIGEgTGludXggcGxhdGZvcm0gYW5kIHdhbnQKK2xpYnBjYXAgdG8gc3VwcG9ydCB0aGUgJ0FDTicgV0FOL0xBTiByb3V0ZXIgcHJvZHVjdCBmcm9tIGZyb20gU0lUQQorKGh0dHA6Ly93d3cuc2l0YS5hZXJvKQorCitUaGlzIG1pZ2h0IGFsc28gd29yayBvbiBub24tTGludXggVW5peC1jb21wYXRpYmxlIHBsYXRmb3JtcywgYnV0IHRoYXQKK2hhcyBub3QgYmVlbiB0ZXN0ZWQuCisKK1NlZSBhbHNvIHRoZSBsaWJwY2FwIElOU1RBTEwudHh0IGZpbGUgZm9yIGZ1cnRoZXIgbGlicGNhcCBjb25maWd1cmF0aW9uCitvcHRpb25zLgorCitUaGVzZSBhZGRpdGlvbnMvZXh0ZW5zaW9ucyBoYXZlIGJlZW4gbWFkZSB0byBQQ0FQIHRvIGFsbG93IGl0IHRvCitjYXB0dXJlIHBhY2tldHMgZnJvbSBhIFNJVEEgQUNOIGRldmljZSAoYW5kIHBvdGVudGlhbGx5IG90aGVycykuCisKK1RvIGVuYWJsZSBpdHMgc3VwcG9ydCB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGhhcworYSBjb3JyZWN0IGNvbmZpZ3VyZS5pbiBmaWxlOyB0aGF0IGNhbiBiZSBjcmVhdGVkIGlmIG5lY2Nlc3NheSBieQordXNpbmcgdGhlIG5vcm1hbCBhdXRvY29uZiBwcm9jZWR1cmUgb2Y6CisKK2FjbG9jYWwKK2F1dG9jb25mCithdXRvaGVhZGVyCithdXRvbWFrZQorCitUaGVuIHJ1biBjb25maWd1cmUgd2l0aCB0aGUgJ3NpdGEnIG9wdGlvbjoKKworLi9jb25maWd1cmUgLS13aXRoLXNpdGEKKworQXBwbGljYXRpb25zIGJ1aWx0IHdpdGggbGlicGNhcCBjb25maWd1cmVkIGluIHRoaXMgd2F5IHdpbGwgb25seSBkZXRlY3QgU0lUQQorQUNOIGludGVyZmFjZXMgYW5kIHdpbGwgbm90IGNhcHR1cmUgZnJvbSB0aGUgbmF0aXZlIE9TIHBhY2tldCBzdHJlYW0uCisKK1RoZSBTSVRBIGV4dGVuc2lvbiBwcm92aWRlcyBhIHJlbW90ZSBkYXRhc2NvcGUgb3BlcmF0aW9uIGZvciBjYXB0dXJpbmcKK2JvdGggV0FOIGFuZCBMQU4gcHJvdG9jb2xzLiAgSXQgZWZmZWN0aXZlbHkgc3BsaXRzIHRoZSBvcGVyYXRpb24gb2YKK1BDQVAgaW50byB0d28gaGFsdmVzLiAgVGhlIHRvcCBsYXllciBwZXJmb3JtcyB0aGUgbWFqb3JpdHkgb2YgdGhlCit3b3JrLCBidXQgaW50ZXJmYWNlcyB2aWEgYSBUQ1Agc2Vzc2lvbiB0byByZW1vdGUgYWdlbnRzIHRoYXQKK3Byb3ZpZGUgdGhlIGxvd2VyIGxheWVyIGZ1bmN0aW9uYWxpdHkgb2YgYWN0dWFsIHNuaWZmaW5nIGFuZAorZmlsdGVyaW5nLiBNb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZnVuY3Rpb25zIGFuZAoraW50ZXItZGV2aWNlIHByb3RvY29sIGFuZCBuYW1pbmcgY29udmVudGlvbnMgYXJlIGRlc2NyaWJlZCBpbiBkZXRhaWwKK2luICdwY2FwLXNpdGEuaHRtbCcuCisKK3BjYXBfZmluZGFsbGRldnMoKSByZWFkcyB0aGUgbG9jYWwgc3lzdGVtJ3MgL2V0Yy9ob3N0cyBmaWxlIGxvb2tpbmcKK2ZvciBob3N0IG5hbWVzIHRoYXQgbWF0Y2ggdGhlIGZvcm1hdCBvZiBJT1AgdHlwZSBkZXZpY2VzLiAgaWUuICBhYWFfSV94X3kKK2FuZCB0aGVuIHF1ZXJpZXMgZWFjaCBhc3NvY2lhdGVkIElQIGFkZHJlc3MgZm9yIGEgbGlzdCBvZiBpdHMgV0FOIGFuZAorTEFOIGRldmljZXMuICBUaGUgbG9jYWwgc3lzdGVtIHRoZSBhZ2dyZWdhdGVzIHRoZSBsaXN0cyBvYnRhaW5lZCBmcm9tCitlYWNoIElPUCwgc29ydHMgaXQsIGFuZCBwcm92aWRlcyBpdCAodG8gV2lyZXNoYXJrIGV0LmFsKSBhcyB0aGUKK2xpc3Qgb2YgbW9uaXRvcmFibGUgaW50ZXJmYWNlcy4KKworT25jZSBhIHZhbGlkIGludGVyZmFjZSBoYXMgYmVlbiBzZWxlY3RlZCwgcGNhcF9vcGVuKCkgaXMgY2FsbGVkCit3aGljaCBvcGVucyBhIFRDUCBzZXNzaW9uICh0byBhIHdlbGwga25vd24gcG9ydCkgb24gdGhlIHRhcmdldCBJT1AKK2FuZCB0ZWxscyBpdCB0byBzdGFydCBtb25pdG9yaW5nLgorCitBbGwgY2FwdHVyZWQgcGFja2V0cyBhcmUgdGhlbiBmb3J3YXJkZWQgYWNyb3NzIHRoYXQgVENQIHNlc3Npb24KK2JhY2sgdG8gdGhlIGxvY2FsICd0b3AgbGF5ZXInIGZvciBmb3J3YXJkaW5nIHRvIHRoZSBhY3R1YWwKK3NuaWZmaW5nIHByb2dyYW0gKHdpcmVzaGFyay4uLikKKworTm90ZSB0aGF0IHRoZSBETFRfU0lUQSBsaW5rLWxheWVyIHR5cGUgaW5jbHVkZXMgYSBwcm9wcmlldGFyeSBoZWFkZXIKK3RoYXQgaXMgZG9jdW1lbnRlZCBhcyBwYXJ0IG9mIHRoZSBTSVRBIGRpc3NlY3RvciBvZiBXaXJlc2hhcmsgYW5kIGlzCithbHNvIGRlc2NyaWJlZCBpbiAncGNhcC1zaXRhLmh0bWwnIGZvciBwb3N0ZXJpdHkgc2FrZS4KKworVGhhdCBoZWFkZXIgcHJvdmlkZXM6CistIFBhY2tldCBkaXJlY3Rpb24gKGluL291dCkgKDEgb2N0ZXQpCistIExpbmsgbGF5ZXIgaGFyZHdhcmUgc2lnbmFsIHN0YXR1cyAoMSBvY3RldCkKKy0gVHJhbnNtaXQvUmVjZWl2ZSBlcnJvciBzdGF0dXMgKDIgb2N0ZXRzKQorLSBFbmNhcHN1bGF0ZWQgV0FOIHByb3RvY29sIElEICgxIG9jdGV0KQorCisKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvUkVBRE1FLnRydTY0IGIvbGlicGNhcC0xLjMuMC9SRUFETUUudHJ1NjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlMWVmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvUkVBRE1FLnRydTY0CkBAIC0wLDAgKzEsNDkgQEAKK1RoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBhcHBsaWNhYmxlIHRvIFRydTY0IFVOSVggCisoZm9ybWVybHkgRGlnaXRhbCBVTklYIChmb3JtZXJseSBERUMgT1NGLzEpKSB2ZXJzaW9uIDQuMCwgYW5kCitwcm9iYWJseSB0byBsYXRlciB2ZXJzaW9ucyBhcyB3ZWxsOyBhdCBsZWFzdCBzb21lIG9wdGlvbnMgYXBwbHkgdG8KK0RpZ2l0YWwgVU5JWCAzLjIgLSBwZXJoYXBzIGFsbCBkby4KKworSW4gb3JkZXIgdG8gdXNlIGtlcm5lbCBwYWNrZXQgZmlsdGVyaW5nIG9uIHRoaXMgc3lzdGVtLCB5b3UgaGF2ZQordG8gY29uZmlndXJlIGl0IGluIHN1Y2ggYSB3YXk6CisKK0tlcm5lbCBjb25maWd1cmF0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgcGFja2V0IGZpbHRlcmluZyBrZXJuZWwgb3B0aW9uIG11c3QgYmUgZW5hYmxlZCBhdCBrZXJuZWwKK2luc3RhbGxhdGlvbi4gIElmIGl0IHdhcyBub3QgdGhlIGNhc2UsIHlvdSBjYW4gcmVidWlsZCB0aGUga2VybmVsIHdpdGgKKyJkb2NvbmZpZyAtYyIgYWZ0ZXIgYWRkaW5nIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB0aGUga2VybmVsCitjb25maWd1cmF0aW9uIGZpbGUgKC9zeXMvY29uZi88SE9TVE5BTUU+KToKKworCW9wdGlvbiBQQUNLRVRGSUxURVIKKworb3IgdXNlICJkb2NvbmZpZyIgd2l0aG91dCBhbnkgYXJndW1lbnRzIHRvIGFkZCB0aGUgcGFja2V0IGZpbHRlciBkcml2ZXIKK29wdGlvbiB2aWEgdGhlIGtlcm5lbCBvcHRpb24gbWVudSAoc2VlIHRoZSBzeXN0ZW0gYWRtaW5pc3RyYXRpb24KK2RvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBkbyB0aGlzKS4KKworRGV2aWNlIGNvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RldmljZXMgdXNlZCBmb3IgcGFja2V0IGZpbHRlcmluZyBtdXN0IGJlIGNyZWF0ZWQgdGhhbmtzIHRvCit0aGUgZm9sbG93aW5nIGNvbW1hbmQgKGV4ZWN1dGVkIGluIHRoZSAvZGV2IGRpcmVjdG9yeSk6CisKKwkuL01BS0VERVYgcGZpbHQKKworSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0luIG9yZGVyIHRvIGNhcHR1cmUgYWxsIHBhY2tldHMgb24gYSBuZXR3b3JrLCB5b3UgbWF5IHdhbnQgdG8gYWxsb3cKK2FwcGxpY2F0aW9ucyB0byBwdXQgdGhlIGludGVyZmFjZSBvbiB0aGF0IG5ldHdvcmsgaW50byAibG9jYWwgY29weSIKK21vZGUsIHNvIHRoYXQgdGNwZHVtcCBjYW4gc2VlIHBhY2tldHMgc2VudCBieSB0aGUgaG9zdCBvbiB3aGljaCBpdCdzCitydW5uaW5nIGFzIHdlbGwgYXMgcGFja2V0cyByZWNlaXZlZCBieSB0aGF0IGhvc3QsIGFuZCB0byBwdXQgdGhlCitpbnRlcmZhY2UgaW50byAicHJvbWlzY3VvdXMiIG1vZGUsIHNvIHRoYXQgdGNwZHVtcCBjYW4gc2VlIHBhY2tldHMgb24KK3RoZSBuZXR3b3JrIHNlZ21lbnQgbm90IHNlbnQgdG8gdGhlIGhvc3Qgb24gd2hpY2ggaXQncyBydW5uaW5nLCBieSB1c2luZwordGhlIHBmY29uZmlnKDEpIGNvbW1hbmQ6CisKKwlwZmNvbmZpZyArYyArcCA8bmV0d29ya19kZXZpY2U+CisKK29yIGFsbG93IGFwcGxpY2F0aW9uIHRvIHB1dCBhbnkgaW50ZXJmYWNlIGludG8gImxvY2FsIGNvcHkiIG9yCisicHJvbWlzY3VvdXMiIG1vZGUgYnkgdXNpbmcgdGhlIGNvbW1hbmQ6CisKKwlwZmNvbmZpZyArYyArcCAtYQorCitOb3RlOiBhbGwgaW5zdHJ1Y3Rpb25zIGdpdmVuIHJlcXVpcmUgcm9vdCBwcml2aWxlZ2VzLgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9TVU5PUzQvbml0X2lmLm8uc3BhcmMgYi9saWJwY2FwLTEuMy4wL1NVTk9TNC9uaXRfaWYuby5zcGFyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDUwNzNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9TVU5PUzQvbml0X2lmLm8uc3BhcmMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9TVU5PUzQvbml0X2lmLm8uc3VuMyBiL2xpYnBjYXAtMS4zLjAvU1VOT1M0L25pdF9pZi5vLnN1bjMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5M2ZjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvU1VOT1M0L25pdF9pZi5vLnN1bjMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9TVU5PUzQvbml0X2lmLm8uc3VuNGMuNC4wLjNjIGIvbGlicGNhcC0xLjMuMC9TVU5PUzQvbml0X2lmLm8uc3VuNGMuNC4wLjNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDEwMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1NVTk9TNC9uaXRfaWYuby5zdW40Yy40LjAuM2MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9UT0RPIGIvbGlicGNhcC0xLjMuMC9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMzI1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1RPRE8KQEAgLTAsMCArMSwzNSBAQAorIFRPRE8gbGlzdCBmb3IgbGlicGNhcAorPT09PT09PT09PT09PT09PT09PT09PT0KKworSW1wb3J0YW50IHN0dWZmICh0byBiZSBkb25lIGJlZm9yZSB0aGUgbmV4dCByZWxlYXNlKQorLS0tLS0tLS0tLS0tLS0tCisKK0dlbmVyYWwKKworLSBjb25maWd1cmUgc2hvdWxkIG5vdCBiZSBpbiBHaXQuIE1vc3Qgb3BlbiBzb3VyY2UgcHJvamVjdHMgaGF2ZSBhbiAKKyAgYXV0b2dlbi5zaCBzY3JpcHQgdG8gcnVuIGF1dG9jb25mIGV0Yy4gYWZ0ZXIgY2hlY2tvdXQuIEkgdGhpbmsgd2UgCisgIHNob3VsZCBzdGljayB0byB0aGUgc3RhbmRhcmQuIAorCistIFRoZSBzb3VyY2UgZmlsZXMgc2hvdWxkIGJlIGJldHRlciBkb2N1bWVudGVkLiBUaGVyZSBpcyBubyBvZmZpY2lhbCAKKyAgZGVzaWduIGd1aWRlbGluZSBmb3Igd2hhdCBpcyBkb25lIHdoZXJlLiBUaGVyZSBzaG91bGQgYmUgYSBjb21tb24gY29kaW5nCisgIHN0eWxlIChva2F5LCB5b3UgY2FuIGd1ZXNzIHRoYXQgYnkgbG9va2luZyBhdCB0aGUgY29kZSkgYW5kIGEgZ3VpZGUgZm9yCisgIHdoYXQgbmVlZHMgdG8gYmUgZG9jdW1lbnRlZC4KKworTGVzcyB1cmdlbnQgaXRlbXMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQmV0dGVyIGRvY3VtZW50YXRpb24gYW5kIGNsZWFudXAgb2YgdGhlIGludGVyZmFjZS4gSSBhbSBzZWVpbmcgYSBmZXcgIAorICBwcm9ibGVtcyBhdCB0aGUgZmlyc3QgZ2xhbmNlIHdoaWNoIG5lZWRzIGZpeGluZzoKKyAgKyBwY2FwX2xvb2t1cG5ldCBtYWtlcyBsaXR0bGUgdG8gbm8gc2Vuc2Ugd2l0aCBwcm90b2NvbHMgIT0gSVB2NAorICArIG5vdCB2ZXJ5IHdlbGwgc3VpdGVkIGZvciBpbnRlcmFjdGl2ZSBwcm9ncmFtcyAodGhpbmsgZXRoZXJlYWwpLiBUaGVyZQorICAgIHNob3VsZCBiZSBhIHdheSBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGdldCBhIGZpbGUgZGVzY3JpcHRvciB3aGljaCBpdAorICAgIGhhcyB0byBtb25pdG9yIGFuZCBhIGNhbGxiYWNrIGluIHBjYXAgd2hpY2ggaGFzIHRvIGJlIGNhbGxlZCBvbgorICAgIGFjdGl2aXR5IChYWFggLSAicGNhcF9maWxlbm8oKSIgaGFuZGxlcyB0aGUgZmlyc3QgcGFydCwgYWx0aG91Z2gKKyAgICAic2VsZWN0KCkiIGFuZCAicG9sbCgpIiBkb24ndCB3b3JrIG9uIEJQRiBkZXZpY2VzIG9uIG1vc3QgQlNEcywgYW5kCisgICAgeW91IGNhbiBjYWxsICJwY2FwX2Rpc3BhdGNoKCkiIGFzIHRoZSBkaXNwYXRjaCByb3V0aW5lIGFmdGVyIHB1dHRpbmcKKyAgICB0aGUgZGVzY3JpcHRvciBpbnRvIG5vbi1ibG9ja2luZyBtb2RlKQorICArIHRvbyBtYW55IGZ1bmN0aW9ucy4gVGhlcmUgYXJlIGEgbG90IG9mIGZ1bmN0aW9ucyBmb3IgZXZlcnl0aGluZyB3aGljaAorICAgIHZpb2xhdGVzIHRoZSBLSVNTIHByaW5jaXBsZS4gV2h5IGRvIHdlIG5lZWQgcGNhcF9zdHJlcnJvciwgcGNhcF9wZXJyb3IKKyAgICBhbmQgcGNhcF9nZXRlcnI/CisgICsgdGhlIG1hbnBhZ2UgaGFzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgZWFjaCBmdW5jdGlvbiBidXQgd2hlcmUgaXMgdGhlCisgICAgYmlnIHBpY3R1cmU/IFNlZW1zIGxpa2UgeW91IG5lZWQgdG8gYnV5IFVOUCBmb3IgdGhhdC4uLgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9WRVJTSU9OIGIvbGlicGNhcC0xLjMuMC9WRVJTSU9OCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYmIyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1ZFUlNJT04KQEAgLTAsMCArMSBAQAorMS4zLjAKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9HbnVjLmggYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvR251Yy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZjRiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvR251Yy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvV2luMzIvSW5jbHVkZS9HbnVjLmgsdiAxLjEgMjAwMi0wOC0wMSAwODozMzowNSByaXNzbyBFeHAgJCAoTEJMKSAqLworCisvKiBEZWZpbmUgX19QKCkgbWFjcm8sIGlmIG5lY2Vzc2FyeSAqLworCisjaWZuZGVmIF9fUAorI2lmIF9fU1REQ19fCisjZGVmaW5lIF9fUChwcm90b3MpIHByb3RvcworI2Vsc2UKKyNkZWZpbmUgX19QKHByb3RvcykgKCkKKyNlbmRpZgorI2VuZGlmCisKKy8qIGlubGluZSBmb28gKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBpbmxpbmUgX19pbmxpbmUKKyNlbHNlCisjZGVmaW5lIGlubGluZQorI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIEhhbmRsZSBuZXcgYW5kIG9sZCAiZGVhZCIgcm91dGluZSBwcm90b3R5cGVzCisgKgorICogRm9yIGV4YW1wbGU6CisgKgorICoJX19kZWFkIHZvaWQgZm9vKHZvaWQpIF9fYXR0cmlidXRlX18oKHZvbGF0aWxlKSk7CisgKgorICovCisjaWZkZWYgX19HTlVDX18KKyNpZm5kZWYgX19kZWFkCisjZGVmaW5lIF9fZGVhZCB2b2xhdGlsZQorI2VuZGlmCisjaWYgX19HTlVDX18gPCAyICB8fCAoX19HTlVDX18gPT0gMiAmJiBfX0dOVUNfTUlOT1JfXyA8IDUpCisjaWZuZGVmIF9fYXR0cmlidXRlX18KKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyhhcmdzKQorI2VuZGlmCisjZW5kaWYKKyNlbHNlCisjaWZuZGVmIF9fZGVhZAorI2RlZmluZSBfX2RlYWQKKyNlbmRpZgorI2lmbmRlZiBfX2F0dHJpYnV0ZV9fCisjZGVmaW5lIF9fYXR0cmlidXRlX18oYXJncykKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvYWRkcmluZm8uaCBiL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9hZGRyaW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYjJlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvYWRkcmluZm8uaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgYW5kIDE5OTkgV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAkSWQ6IGFkZHJpbmZvLmgsdiAxLjEgMjAwMi0wOC0wMSAwODozMzowNSByaXNzbyBFeHAgJCAqLworCisjaWZuZGVmIEhBVkVfQUREUklORk8KKworLyoKKyAqIEVycm9yIHJldHVybiBjb2RlcyBmcm9tIGdldGFkZHJpbmZvKCkKKyAqLworI2RlZmluZQlFQUlfQUREUkZBTUlMWQkgMQkvKiBhZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFQUlfQUdBSU4JIDIJLyogdGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uICovCisjZGVmaW5lCUVBSV9CQURGTEFHUwkgMwkvKiBpbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyAqLworI2RlZmluZQlFQUlfRkFJTAkgNAkvKiBub24tcmVjb3ZlcmFibGUgZmFpbHVyZSBpbiBuYW1lIHJlc29sdXRpb24gKi8KKyNkZWZpbmUJRUFJX0ZBTUlMWQkgNQkvKiBhaV9mYW1pbHkgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZQlFQUlfTUVNT1JZCSA2CS8qIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgKi8KKyNkZWZpbmUJRUFJX05PREFUQQkgNwkvKiBubyBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBob3N0bmFtZSAqLworI2RlZmluZQlFQUlfTk9OQU1FCSA4CS8qIGhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duICovCisjZGVmaW5lCUVBSV9TRVJWSUNFCSA5CS8qIHNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlICovCisjZGVmaW5lCUVBSV9TT0NLVFlQRQkxMAkvKiBhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCUVBSV9TWVNURU0JMTEJLyogc3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vICovCisjZGVmaW5lIEVBSV9CQURISU5UUwkxMgorI2RlZmluZSBFQUlfUFJPVE9DT0wJMTMKKyNkZWZpbmUgRUFJX01BWAkJMTQKKworLyogaW50ZXJuYWwgZXJyb3IgKi8KKyNkZWZpbmUJTkVUREJfSU5URVJOQUwJLTEJLyogc2VlIGVycm5vICovCisKKy8qCisgKiBGbGFnIHZhbHVlcyBmb3IgZ2V0YWRkcmluZm8oKQorICovCisjZGVmaW5lCUFJX1BBU1NJVkUJMHgwMDAwMDAwMSAvKiBnZXQgYWRkcmVzcyB0byB1c2UgYmluZCgpICovCisjZGVmaW5lCUFJX0NBTk9OTkFNRQkweDAwMDAwMDAyIC8qIGZpbGwgYWlfY2Fub25uYW1lICovCisjZGVmaW5lCUFJX05VTUVSSUNIT1NUCTB4MDAwMDAwMDQgLyogcHJldmVudCBuYW1lIHJlc29sdXRpb24gKi8KKy8qIHZhbGlkIGZsYWdzIGZvciBhZGRyaW5mbyAqLworI2RlZmluZQlBSV9NQVNLCQkoQUlfUEFTU0lWRSB8IEFJX0NBTk9OTkFNRSB8IEFJX05VTUVSSUNIT1NUKQorCisjZGVmaW5lCUFJX0FMTAkJMHgwMDAwMDEwMCAvKiBJUHY2IGFuZCBJUHY0LW1hcHBlZCAod2l0aCBBSV9WNE1BUFBFRCkgKi8KKyNkZWZpbmUJQUlfVjRNQVBQRURfQ0ZHCTB4MDAwMDAyMDAgLyogYWNjZXB0IElQdjQtbWFwcGVkIGlmIGtlcm5lbCBzdXBwb3J0cyAqLworI2RlZmluZQlBSV9BRERSQ09ORklHCTB4MDAwMDA0MDAgLyogb25seSBpZiBhbnkgYWRkcmVzcyBpcyBhc3NpZ25lZCAqLworI2RlZmluZQlBSV9WNE1BUFBFRAkweDAwMDAwODAwIC8qIGFjY2VwdCBJUHY0LW1hcHBlZCBJUHY2IGFkZHJlc3MgKi8KKy8qIHNwZWNpYWwgcmVjb21tZW5kZWQgZmxhZ3MgZm9yIGdldGlwbm9kZWJ5bmFtZSAqLworI2RlZmluZQlBSV9ERUZBVUxUCShBSV9WNE1BUFBFRF9DRkcgfCBBSV9BRERSQ09ORklHKQorCitzdHJ1Y3QgYWRkcmluZm8geworCWludAlhaV9mbGFnczsJLyogQUlfUEFTU0lWRSwgQUlfQ0FOT05OQU1FICovCisJaW50CWFpX2ZhbWlseTsJLyogUEZfeHh4ICovCisJaW50CWFpX3NvY2t0eXBlOwkvKiBTT0NLX3h4eCAqLworCWludAlhaV9wcm90b2NvbDsJLyogMCBvciBJUFBST1RPX3h4eCBmb3IgSVB2NCBhbmQgSVB2NiAqLworCXNpemVfdAlhaV9hZGRybGVuOwkvKiBsZW5ndGggb2YgYWlfYWRkciAqLworCWNoYXIJKmFpX2Nhbm9ubmFtZTsJLyogY2Fub25pY2FsIG5hbWUgZm9yIGhvc3RuYW1lICovCisJc3RydWN0IHNvY2thZGRyICphaV9hZGRyOwkvKiBiaW5hcnkgYWRkcmVzcyAqLworCXN0cnVjdCBhZGRyaW5mbyAqYWlfbmV4dDsJLyogbmV4dCBzdHJ1Y3R1cmUgaW4gbGlua2VkIGxpc3QgKi8KK307CisKK2V4dGVybiB2b2lkIGZyZWVhZGRyaW5mbyAoc3RydWN0IGFkZHJpbmZvICopOworZXh0ZXJuIHZvaWQgZnJlZWhvc3RlbnQgKHN0cnVjdCBob3N0ZW50ICopOworZXh0ZXJuIGNoYXIgKmdhaV9zdHJlcnJvciAoaW50KTsKK2V4dGVybiBpbnQgZ2V0YWRkcmluZm8gKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJICAgIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopOworZXh0ZXJuIGludCBnZXRuYW1laW5mbyAoY29uc3Qgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgY2hhciAqLAorCQkJICAgIHNpemVfdCwgY2hhciAqLCBzaXplX3QsIGludCk7CitleHRlcm4gc3RydWN0IGhvc3RlbnQgKmdldGlwbm9kZWJ5YWRkciAoY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCwgaW50ICopOworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpnZXRpcG5vZGVieW5hbWUgKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQsIGludCAqKTsKK2V4dGVybiBpbnQgaW5ldF9wdG9uIChpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK2V4dGVybiBjb25zdCBjaGFyICppbmV0X250b3AgKGludCwgY29uc3Qgdm9pZCAqLCBjaGFyICosIHNpemVfdCk7CisjZWxzZQorCisjaWZuZGVmIEVBSV9CQURISU5UUworI2RlZmluZSBFQUlfQkFESElOVFMJMTIKKyNlbmRpZiAKKworI2lmbmRlZiBFQUlfUFJPVE9DT0wJCisjZGVmaW5lIEVBSV9QUk9UT0NPTAkxMworI2VuZGlmCisKKyNpZm5kZWYgRUFJX01BWAkKKyNkZWZpbmUgRUFJX01BWAkJMTQKKyNlbmRpZgorCisjaWZuZGVmIE5FVERCX0lOVEVSTkFMCisjZGVmaW5lCU5FVERCX0lOVEVSTkFMCS0xCS8qIHNlZSBlcnJubyAqLworI2VuZGlmCisKKyNpZm5kZWYgQUlfTUFTSworLyogdmFsaWQgZmxhZ3MgZm9yIGFkZHJpbmZvICovCisjZGVmaW5lCUFJX01BU0sJCShBSV9QQVNTSVZFIHwgQUlfQ0FOT05OQU1FIHwgQUlfTlVNRVJJQ0hPU1QpCisjZW5kaWYKKworI2VuZGlmIC8qIEhBVkVfQUREUklORk8gKi8KKworLyoKKyAqIENvbnN0YW50cyBmb3IgZ2V0bmFtZWluZm8oKQorICovCisjaWZuZGVmIE5JX01BWEhPU1QKKyNkZWZpbmUJTklfTUFYSE9TVAkxMDI1CisjZW5kaWYKKyNpZm5kZWYgTklfTUFYU0VSVgorI2RlZmluZQlOSV9NQVhTRVJWCTMyCisjZW5kaWYKKworLyoKKyAqIEZsYWcgdmFsdWVzIGZvciBnZXRuYW1laW5mbygpCisgKi8KKyNpZm5kZWYgTklfTk9GUUROCisjZGVmaW5lCU5JX05PRlFETgkweDAwMDAwMDAxCisjZW5kaWYKKyNpZm5kZWYgTklfTlVNRVJJQ0hPU1QKKyNkZWZpbmUJTklfTlVNRVJJQ0hPU1QJMHgwMDAwMDAwMgorI2VuZGlmCisjaWZuZGVmIE5JX05BTUVSRVFECisjZGVmaW5lCU5JX05BTUVSRVFECTB4MDAwMDAwMDQKKyNlbmRpZgorI2lmbmRlZiBOSV9OVU1FUklDU0VSVgorI2RlZmluZQlOSV9OVU1FUklDU0VSVgkweDAwMDAwMDA4CisjZW5kaWYKKyNpZm5kZWYgTklfREdSQU0KKyNkZWZpbmUJTklfREdSQU0JMHgwMDAwMDAxMAorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9hcnBhL25hbWVzZXIuaCBiL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9hcnBhL25hbWVzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGYxODVjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL2FycGEvbmFtZXNlci5oCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogKytDb3B5cmlnaHQrKyAxOTgzLCAxOTg5LCAxOTkzCisgKiAtCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5ODksIDE5OTMKKyAqICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqIAlDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogLQorICogUG9ydGlvbnMgQ29weXJpZ2h0IChjKSAxOTkzIGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLgorICogCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMsIGFuZCB0aGF0CisgKiB0aGUgbmFtZSBvZiBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBkb2N1bWVudCBvciBzb2Z0d2FyZSB3aXRob3V0CisgKiBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgRElHSVRBTCBFUVVJUE1FTlQgQ09SUC4gRElTQ0xBSU1TIEFMTAorICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgIElOIE5PIEVWRU5UIFNIQUxMIERJR0lUQUwgRVFVSVBNRU5UCisgKiBDT1JQT1JBVElPTiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IKKyAqIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisgKiBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLgorICogLQorICogLS1Db3B5cmlnaHQtLQorICovCisKKy8qCisgKiAgICAgIEAoIyluYW1lc2VyLmgJOC4xIChCZXJrZWxleSkgNi8yLzkzCisgKgluYW1lc2VyLmgsdiAxLjIgMTk5NS8wNS8wNiAxNDoyMzo1NCBoamwgRXhwCisgKi8KKworI2lmbmRlZiBfTkFNRVNFUl9IXworI2RlZmluZQlfTkFNRVNFUl9IXworCisjaWZuZGVmIFdJTjMyCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaWYgKCFkZWZpbmVkKEJTRCkpIHx8IChCU0QgPCAxOTkzMDYpCisjIGluY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorI2Vsc2UgCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNkZWZpbmUgX19MSVRUTEVfRU5ESUFOIDEKKyNkZWZpbmUgX19CWVRFX09SREVSIF9fTElUVExFX0VORElBTgorI2VuZGlmCisKKy8qCisgKiByZXZpc2lvbiBpbmZvcm1hdGlvbi4gIHRoaXMgaXMgdGhlIHJlbGVhc2UgZGF0ZSBpbiBZWVlZTU1ERCBmb3JtYXQuCisgKiBpdCBjYW4gY2hhbmdlIGV2ZXJ5IGRheSBzbyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gd2l0aCBpdCBpcyB1c2UgaXQKKyAqIGluIHByZXByb2Nlc3NvciBjb21tYW5kcyBzdWNoIGFzICIjaWYgKF9fQklORCA+IDE5OTMxMTA0KSIuICBkbyBub3QKKyAqIGNvbXBhcmUgZm9yIGVxdWFsaXR5OyByYXRoZXIsIHVzZSBpdCB0byBkZXRlcm1pbmUgd2hldGhlciB5b3VyIHJlc29sdmVyCisgKiBpcyBuZXcgZW5vdWdoIHRvIGNvbnRhaW4gYSBjZXJ0YWluIGZlYXR1cmUuCisgKi8KKworI2RlZmluZQlfX0JJTkQJCTE5OTQwNDE3CS8qIGludGVyZmFjZSB2ZXJzaW9uIHN0YW1wICovCisKKy8qCisgKiBEZWZpbmUgY29uc3RhbnRzIGJhc2VkIG9uIHJmYzg4MworICovCisjZGVmaW5lIFBBQ0tFVFNaCTUxMgkJLyogbWF4aW11bSBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBNQVhETkFNRQkyNTYJCS8qIG1heGltdW0gZG9tYWluIG5hbWUgKi8KKyNkZWZpbmUgTUFYQ0ROQU1FCTI1NQkJLyogbWF4aW11bSBjb21wcmVzc2VkIGRvbWFpbiBuYW1lICovCisjZGVmaW5lIE1BWExBQkVMCTYzCQkvKiBtYXhpbXVtIGxlbmd0aCBvZiBkb21haW4gbGFiZWwgKi8KKyNkZWZpbmUJSEZJWEVEU1oJMTIJCS8qICMvYnl0ZXMgb2YgZml4ZWQgZGF0YSBpbiBoZWFkZXIgKi8KKyNkZWZpbmUgUUZJWEVEU1oJNAkJLyogIy9ieXRlcyBvZiBmaXhlZCBkYXRhIGluIHF1ZXJ5ICovCisjZGVmaW5lIFJSRklYRURTWgkxMAkJLyogIy9ieXRlcyBvZiBmaXhlZCBkYXRhIGluIHIgcmVjb3JkICovCisjZGVmaW5lCUlOVDMyU1oJCTQJCS8qIGZvciBzeXN0ZW1zIHdpdGhvdXQgMzItYml0IGludHMgKi8KKyNkZWZpbmUJSU5UMTZTWgkJMgkJLyogZm9yIHN5c3RlbXMgd2l0aG91dCAxNi1iaXQgaW50cyAqLworI2RlZmluZQlJTkFERFJTWgk0CQkvKiBmb3Igc2l6ZW9mKHN0cnVjdCBpbmFkZHIpICE9IDQgKi8KKworLyoKKyAqIEludGVybmV0IG5hbWVzZXJ2ZXIgcG9ydCBudW1iZXIKKyAqLworI2RlZmluZSBOQU1FU0VSVkVSX1BPUlQJNTMKKworLyoKKyAqIEN1cnJlbnRseSBkZWZpbmVkIG9wY29kZXMKKyAqLworI2RlZmluZSBRVUVSWQkJMHgwCQkvKiBzdGFuZGFyZCBxdWVyeSAqLworI2RlZmluZSBJUVVFUlkJCTB4MQkJLyogaW52ZXJzZSBxdWVyeSAqLworI2RlZmluZSBTVEFUVVMJCTB4MgkJLyogbmFtZXNlcnZlciBzdGF0dXMgcXVlcnkgKi8KKy8qI2RlZmluZSB4eHgJCTB4MwkJKi8vKiAweDMgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUJTlNfTk9USUZZX09QCTB4NAkJLyogbm90aWZ5IHNlY29uZGFyeSBvZiBTT0EgY2hhbmdlICovCisjaWZkZWYgQUxMT1dfVVBEQVRFUworCS8qIG5vbiBzdGFuZGFyZCAtIHN1cHBvcnRzIEFMTE9XX1VQREFURVMgc3R1ZmYgZnJvbSBNaWtlIFNjaHdhcnR6ICovCisjIGRlZmluZSBVUERBVEVBCTB4OQkJLyogYWRkIHJlc291cmNlIHJlY29yZCAqLworIyBkZWZpbmUgVVBEQVRFRAkweGEJCS8qIGRlbGV0ZSBhIHNwZWNpZmljIHJlc291cmNlIHJlY29yZCAqLworIyBkZWZpbmUgVVBEQVRFREEJMHhiCQkvKiBkZWxldGUgYWxsIG5hbWVkIHJlc291cmNlIHJlY29yZCAqLworIyBkZWZpbmUgVVBEQVRFTQkweGMJCS8qIG1vZGlmeSBhIHNwZWNpZmljIHJlc291cmNlIHJlY29yZCAqLworIyBkZWZpbmUgVVBEQVRFTUEJMHhkCQkvKiBtb2RpZnkgYWxsIG5hbWVkIHJlc291cmNlIHJlY29yZCAqLworIyBkZWZpbmUgWk9ORUlOSVQJMHhlCQkvKiBpbml0aWFsIHpvbmUgdHJhbnNmZXIgKi8KKyMgZGVmaW5lIFpPTkVSRUYJMHhmCQkvKiBpbmNyZW1lbnRhbCB6b25lIHJlZmVyZXNoICovCisjZW5kaWYKKworLyoKKyAqIEN1cnJlbnRseSBkZWZpbmVkIHJlc3BvbnNlIGNvZGVzCisgKi8KKyNpZmRlZiBIQVZFX0FERFJJTkZPCisjZGVmaW5lIE5PRVJST1IJCTAJCS8qIG5vIGVycm9yICovCisjZW5kaWYgLyogSEFWRV9BRERSSU5GTyAqLworI2RlZmluZSBGT1JNRVJSCQkxCQkvKiBmb3JtYXQgZXJyb3IgKi8KKyNkZWZpbmUgU0VSVkZBSUwJMgkJLyogc2VydmVyIGZhaWx1cmUgKi8KKyNkZWZpbmUgTlhET01BSU4JMwkJLyogbm9uIGV4aXN0ZW50IGRvbWFpbiAqLworI2RlZmluZSBOT1RJTVAJCTQJCS8qIG5vdCBpbXBsZW1lbnRlZCAqLworI2RlZmluZSBSRUZVU0VECQk1CQkvKiBxdWVyeSByZWZ1c2VkICovCisjaWZkZWYgQUxMT1dfVVBEQVRFUworCS8qIG5vbiBzdGFuZGFyZCAqLworIyBkZWZpbmUgTk9DSEFOR0UJMHhmCQkvKiB1cGRhdGUgZmFpbGVkIHRvIGNoYW5nZSBkYiAqLworI2VuZGlmCisKKy8qCisgKiBUeXBlIHZhbHVlcyBmb3IgcmVzb3VyY2VzIGFuZCBxdWVyaWVzCisgKi8KKyNkZWZpbmUgVF9BCQkxCQkvKiBob3N0IGFkZHJlc3MgKi8KKyNkZWZpbmUgVF9OUwkJMgkJLyogYXV0aG9yaXRhdGl2ZSBzZXJ2ZXIgKi8KKyNkZWZpbmUgVF9NRAkJMwkJLyogbWFpbCBkZXN0aW5hdGlvbiAqLworI2RlZmluZSBUX01GCQk0CQkvKiBtYWlsIGZvcndhcmRlciAqLworI2RlZmluZSBUX0NOQU1FCQk1CQkvKiBjYW5vbmljYWwgbmFtZSAqLworI2RlZmluZSBUX1NPQQkJNgkJLyogc3RhcnQgb2YgYXV0aG9yaXR5IHpvbmUgKi8KKyNkZWZpbmUgVF9NQgkJNwkJLyogbWFpbGJveCBkb21haW4gbmFtZSAqLworI2RlZmluZSBUX01HCQk4CQkvKiBtYWlsIGdyb3VwIG1lbWJlciAqLworI2RlZmluZSBUX01SCQk5CQkvKiBtYWlsIHJlbmFtZSBuYW1lICovCisjZGVmaW5lIFRfTlVMTAkJMTAJCS8qIG51bGwgcmVzb3VyY2UgcmVjb3JkICovCisjZGVmaW5lIFRfV0tTCQkxMQkJLyogd2VsbCBrbm93biBzZXJ2aWNlICovCisjZGVmaW5lIFRfUFRSCQkxMgkJLyogZG9tYWluIG5hbWUgcG9pbnRlciAqLworI2RlZmluZSBUX0hJTkZPCQkxMwkJLyogaG9zdCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUX01JTkZPCQkxNAkJLyogbWFpbGJveCBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBUX01YCQkxNQkJLyogbWFpbCByb3V0aW5nIGluZm9ybWF0aW9uICovCisjZGVmaW5lIFRfVFhUCQkxNgkJLyogdGV4dCBzdHJpbmdzICovCisjZGVmaW5lCVRfUlAJCTE3CQkvKiByZXNwb25zaWJsZSBwZXJzb24gKi8KKyNkZWZpbmUgVF9BRlNEQgkJMTgJCS8qIEFGUyBjZWxsIGRhdGFiYXNlICovCisjZGVmaW5lIFRfWDI1CQkxOQkJLyogWF8yNSBjYWxsaW5nIGFkZHJlc3MgKi8KKyNkZWZpbmUgVF9JU0ROCQkyMAkJLyogSVNETiBjYWxsaW5nIGFkZHJlc3MgKi8KKyNkZWZpbmUgVF9SVAkJMjEJCS8qIHJvdXRlciAqLworI2RlZmluZSBUX05TQVAJCTIyCQkvKiBOU0FQIGFkZHJlc3MgKi8KKyNkZWZpbmUgVF9OU0FQX1BUUgkyMwkJLyogcmV2ZXJzZSBOU0FQIGxvb2t1cCAoZGVwcmVjYXRlZCkgKi8KKyNkZWZpbmUJVF9TSUcJCTI0CQkvKiBzZWN1cml0eSBzaWduYXR1cmUgKi8KKyNkZWZpbmUJVF9LRVkJCTI1CQkvKiBzZWN1cml0eSBrZXkgKi8KKyNkZWZpbmUJVF9QWAkJMjYJCS8qIFguNDAwIG1haWwgbWFwcGluZyAqLworI2RlZmluZQlUX0dQT1MJCTI3CQkvKiBnZW9ncmFwaGljYWwgcG9zaXRpb24gKHdpdGhkcmF3bikgKi8KKyNkZWZpbmUJVF9BQUFBCQkyOAkJLyogSVA2IEFkZHJlc3MgKi8KKyNkZWZpbmUJVF9MT0MJCTI5CQkvKiBMb2NhdGlvbiBJbmZvcm1hdGlvbiAqLworCS8qIG5vbiBzdGFuZGFyZCAqLworI2RlZmluZSBUX1VJTkZPCQkxMDAJCS8qIHVzZXIgKGZpbmdlcikgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgVF9VSUQJCTEwMQkJLyogdXNlciBJRCAqLworI2RlZmluZSBUX0dJRAkJMTAyCQkvKiBncm91cCBJRCAqLworI2RlZmluZSBUX1VOU1BFQwkxMDMJCS8qIFVuc3BlY2lmaWVkIGZvcm1hdCAoYmluYXJ5IGRhdGEpICovCisJLyogUXVlcnkgdHlwZSB2YWx1ZXMgd2hpY2ggZG8gbm90IGFwcGVhciBpbiByZXNvdXJjZSByZWNvcmRzICovCisjZGVmaW5lIFRfQVhGUgkJMjUyCQkvKiB0cmFuc2ZlciB6b25lIG9mIGF1dGhvcml0eSAqLworI2RlZmluZSBUX01BSUxCCQkyNTMJCS8qIHRyYW5zZmVyIG1haWxib3ggcmVjb3JkcyAqLworI2RlZmluZSBUX01BSUxBCQkyNTQJCS8qIHRyYW5zZmVyIG1haWwgYWdlbnQgcmVjb3JkcyAqLworI2RlZmluZSBUX0FOWQkJMjU1CQkvKiB3aWxkY2FyZCBtYXRjaCAqLworCisvKgorICogVmFsdWVzIGZvciBjbGFzcyBmaWVsZAorICovCisKKyNkZWZpbmUgQ19JTgkJMQkJLyogdGhlIGFycGEgaW50ZXJuZXQgKi8KKyNkZWZpbmUgQ19DSEFPUwkJMwkJLyogZm9yIGNoYW9zIG5ldCAoTUlUKSAqLworI2RlZmluZSBDX0hTCQk0CQkvKiBmb3IgSGVzaW9kIG5hbWUgc2VydmVyIChNSVQpIChYWFgpICovCisJLyogUXVlcnkgY2xhc3MgdmFsdWVzIHdoaWNoIGRvIG5vdCBhcHBlYXIgaW4gcmVzb3VyY2UgcmVjb3JkcyAqLworI2RlZmluZSBDX0FOWQkJMjU1CQkvKiB3aWxkY2FyZCBtYXRjaCAqLworCisvKgorICogU3RhdHVzIHJldHVybiBjb2RlcyBmb3IgVF9VTlNQRUMgY29udmVyc2lvbiByb3V0aW5lcworICovCisjZGVmaW5lIENPTlZfU1VDQ0VTUwkwCisjZGVmaW5lIENPTlZfT1ZFUkZMT1cJKC0xKQorI2RlZmluZSBDT05WX0JBREZNVAkoLTIpCisjZGVmaW5lIENPTlZfQkFEQ0tTVU0JKC0zKQorI2RlZmluZSBDT05WX0JBREJVRkxFTgkoLTQpCisKKyNpZm5kZWYgX19CWVRFX09SREVSCisjaWYgKEJTRCA+PSAxOTkxMDMpCisjIGluY2x1ZGUgPG1hY2hpbmUvZW5kaWFuLmg+CisjZWxzZQorI2lmZGVmIGxpbnV4CisjIGluY2x1ZGUgPGVuZGlhbi5oPgorI2Vsc2UKKyNkZWZpbmUJX19MSVRUTEVfRU5ESUFOCTEyMzQJLyogbGVhc3Qtc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAodmF4LCBwYykgKi8KKyNkZWZpbmUJX19CSUdfRU5ESUFOCTQzMjEJLyogbW9zdC1zaWduaWZpY2FudCBieXRlIGZpcnN0IChJQk0sIG5ldCkgKi8KKyNkZWZpbmUJX19QRFBfRU5ESUFOCTM0MTIJLyogTFNCIGZpcnN0IGluIHdvcmQsIE1TVyBmaXJzdCBpbiBsb25nIChwZHApKi8KKworI2lmIGRlZmluZWQodmF4KSB8fCBkZWZpbmVkKG5zMzIwMDApIHx8IGRlZmluZWQoc3VuMzg2KSB8fCBkZWZpbmVkKGkzODYpIHx8IFwKKyAgICBkZWZpbmVkKE1JUFNFTCkgfHwgZGVmaW5lZChfTUlQU0VMKSB8fCBkZWZpbmVkKEJJVF9aRVJPX09OX1JJR0hUKSB8fCBcCisgICAgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19hbHBoYSkKKyNkZWZpbmUgX19CWVRFX09SREVSCV9fTElUVExFX0VORElBTgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKHNlbCkgfHwgZGVmaW5lZChweXIpIHx8IGRlZmluZWQobWM2ODAwMCkgfHwgZGVmaW5lZChzcGFyYykgfHwgXAorICAgIGRlZmluZWQoaXM2OGspIHx8IGRlZmluZWQodGFob2UpIHx8IGRlZmluZWQoaWJtMDMyKSB8fCBkZWZpbmVkKGlibTM3MCkgfHwgXAorICAgIGRlZmluZWQoTUlQU0VCKSB8fCBkZWZpbmVkKF9NSVBTRUIpIHx8IGRlZmluZWQoX0lCTVIyKSB8fCBkZWZpbmVkKERHVVgpIHx8XAorICAgIGRlZmluZWQoYXBvbGxvKSB8fCBkZWZpbmVkKF9fY29udmV4X18pIHx8IGRlZmluZWQoX0NSQVkpIHx8IFwKKyAgICBkZWZpbmVkKF9faHBwYSkgfHwgZGVmaW5lZChfX2hwOTAwMCkgfHwgXAorICAgIGRlZmluZWQoX19ocDkwMDBzMzAwKSB8fCBkZWZpbmVkKF9faHA5MDAwczcwMCkgfHwgXAorICAgIGRlZmluZWQgKEJJVF9aRVJPX09OX0xFRlQpIHx8IGRlZmluZWQobTY4aykKKyNkZWZpbmUgX19CWVRFX09SREVSCV9fQklHX0VORElBTgorI2VuZGlmCisjZW5kaWYgLyogbGludXggKi8KKyNlbmRpZiAvKiBCU0QgKi8KKyNlbmRpZiAvKiBfX0JZVEVfT1JERVIgKi8KKworI2lmICFkZWZpbmVkKF9fQllURV9PUkRFUikgfHwgXAorICAgIChfX0JZVEVfT1JERVIgIT0gX19CSUdfRU5ESUFOICYmIF9fQllURV9PUkRFUiAhPSBfX0xJVFRMRV9FTkRJQU4gJiYgXAorICAgIF9fQllURV9PUkRFUiAhPSBfX1BEUF9FTkRJQU4pCisJLyogeW91IG11c3QgZGV0ZXJtaW5lIHdoYXQgdGhlIGNvcnJlY3QgYml0IG9yZGVyIGlzIGZvcgorCSAqIHlvdXIgY29tcGlsZXIgLSB0aGUgbmV4dCBsaW5lIGlzIGFuIGludGVudGlvbmFsIGVycm9yCisJICogd2hpY2ggd2lsbCBmb3JjZSB5b3VyIGNvbXBpbGVzIHRvIGJvbWIgdW50aWwgeW91IGZpeAorCSAqIHRoZSBhYm92ZSBtYWNyb3MuCisJICovCisgIGVycm9yICJVbmRlZmluZWQgb3IgaW52YWxpZCBfX0JZVEVfT1JERVIiOworI2VuZGlmCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIHF1ZXJ5IGhlYWRlci4gIFRoZSBvcmRlciBvZiB0aGUgZmllbGRzIGlzIG1hY2hpbmUtIGFuZAorICogY29tcGlsZXItZGVwZW5kZW50LCBkZXBlbmRpbmcgb24gdGhlIGJ5dGUvYml0IG9yZGVyIGFuZCB0aGUgbGF5b3V0CisgKiBvZiBiaXQgZmllbGRzLiAgV2UgdXNlIGJpdCBmaWVsZHMgb25seSBpbiBpbnQgdmFyaWFibGVzLCBhcyB0aGlzCisgKiBpcyBhbGwgQU5TSSByZXF1aXJlcy4gIFRoaXMgcmVxdWlyZXMgYSBzb21ld2hhdCBjb25mdXNpbmcgcmVhcnJhbmdlbWVudC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQJaWQgOjE2OwkJLyogcXVlcnkgaWRlbnRpZmljYXRpb24gbnVtYmVyICovCisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCQkJLyogZmllbGRzIGluIHRoaXJkIGJ5dGUgKi8KKwl1bnNpZ25lZAlxcjogMTsJCS8qIHJlc3BvbnNlIGZsYWcgKi8KKwl1bnNpZ25lZAlvcGNvZGU6IDQ7CS8qIHB1cnBvc2Ugb2YgbWVzc2FnZSAqLworCXVuc2lnbmVkCWFhOiAxOwkJLyogYXV0aG9yaXRpdmUgYW5zd2VyICovCisJdW5zaWduZWQJdGM6IDE7CQkvKiB0cnVuY2F0ZWQgbWVzc2FnZSAqLworCXVuc2lnbmVkCXJkOiAxOwkJLyogcmVjdXJzaW9uIGRlc2lyZWQgKi8KKwkJCS8qIGZpZWxkcyBpbiBmb3VydGggYnl0ZSAqLworCXVuc2lnbmVkCXJhOiAxOwkJLyogcmVjdXJzaW9uIGF2YWlsYWJsZSAqLworCXVuc2lnbmVkCXByOiAxOwkJLyogcHJpbWFyeSBzZXJ2ZXIgcmVxJ2QgKCFzdGFuZGFyZCkgKi8KKwl1bnNpZ25lZAl1bnVzZWQgOjI7CS8qIHVudXNlZCBiaXRzIChNQlogYXMgb2YgNC45LjNhMykgKi8KKwl1bnNpZ25lZAlyY29kZSA6NDsJLyogcmVzcG9uc2UgY29kZSAqLworI2VuZGlmCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTiB8fCBfX0JZVEVfT1JERVIgPT0gX19QRFBfRU5ESUFOCisJCQkvKiBmaWVsZHMgaW4gdGhpcmQgYnl0ZSAqLworCXVuc2lnbmVkCXJkIDoxOwkJLyogcmVjdXJzaW9uIGRlc2lyZWQgKi8KKwl1bnNpZ25lZAl0YyA6MTsJCS8qIHRydW5jYXRlZCBtZXNzYWdlICovCisJdW5zaWduZWQJYWEgOjE7CQkvKiBhdXRob3JpdGl2ZSBhbnN3ZXIgKi8KKwl1bnNpZ25lZAlvcGNvZGUgOjQ7CS8qIHB1cnBvc2Ugb2YgbWVzc2FnZSAqLworCXVuc2lnbmVkCXFyIDoxOwkJLyogcmVzcG9uc2UgZmxhZyAqLworCQkJLyogZmllbGRzIGluIGZvdXJ0aCBieXRlICovCisJdW5zaWduZWQJcmNvZGUgOjQ7CS8qIHJlc3BvbnNlIGNvZGUgKi8KKwl1bnNpZ25lZAl1bnVzZWQgOjI7CS8qIHVudXNlZCBiaXRzIChNQlogYXMgb2YgNC45LjNhMykgKi8KKwl1bnNpZ25lZAlwciA6MTsJCS8qIHByaW1hcnkgc2VydmVyIHJlcSdkICghc3RhbmRhcmQpICovCisJdW5zaWduZWQJcmEgOjE7CQkvKiByZWN1cnNpb24gYXZhaWxhYmxlICovCisjZW5kaWYKKwkJCS8qIHJlbWFpbmluZyBieXRlcyAqLworCXVuc2lnbmVkCXFkY291bnQgOjE2OwkvKiBudW1iZXIgb2YgcXVlc3Rpb24gZW50cmllcyAqLworCXVuc2lnbmVkCWFuY291bnQgOjE2OwkvKiBudW1iZXIgb2YgYW5zd2VyIGVudHJpZXMgKi8KKwl1bnNpZ25lZAluc2NvdW50IDoxNjsJLyogbnVtYmVyIG9mIGF1dGhvcml0eSBlbnRyaWVzICovCisJdW5zaWduZWQJYXJjb3VudCA6MTY7CS8qIG51bWJlciBvZiByZXNvdXJjZSBlbnRyaWVzICovCit9IEhFQURFUjsKKworLyoKKyAqIERlZmluZXMgZm9yIGhhbmRsaW5nIGNvbXByZXNzZWQgZG9tYWluIG5hbWVzCisgKi8KKyNkZWZpbmUgSU5ESVJfTUFTSwkweGMwCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIHBhc3NpbmcgcmVzb3VyY2UgcmVjb3JkcyBhcm91bmQuCisgKi8KK3N0cnVjdCBycmVjIHsKKwlpbnQxNl90CQlyX3pvbmU7CQkJLyogem9uZSBudW1iZXIgKi8KKwlpbnQxNl90CQlyX2NsYXNzOwkJLyogY2xhc3MgbnVtYmVyICovCisJaW50MTZfdAkJcl90eXBlOwkJCS8qIHR5cGUgbnVtYmVyICovCisJdV9pbnQzMl90CXJfdHRsOwkJCS8qIHRpbWUgdG8gbGl2ZSAqLworCWludAkJcl9zaXplOwkJCS8qIHNpemUgb2YgZGF0YSBhcmVhICovCisJY2hhcgkJKnJfZGF0YTsJCS8qIHBvaW50ZXIgdG8gZGF0YSAqLworfTsKKworLy9leHRlcm4JdV9pbnQxNl90CV9nZXRzaG9ydCBfX1AoKGNvbnN0IHVfY2hhciAqKSk7CisvL2V4dGVybgl1X2ludDMyX3QJX2dldGxvbmcgX19QKChjb25zdCB1X2NoYXIgKikpOworCisvKgorICogSW5saW5lIHZlcnNpb25zIG9mIGdldC9wdXQgc2hvcnQvbG9uZy4gIFBvaW50ZXIgaXMgYWR2YW5jZWQuCisgKgorICogVGhlc2UgbWFjcm9zIGRlbW9uc3RyYXRlIHRoZSBwcm9wZXJ0eSBvZiBDIHdoZXJlYnkgaXQgY2FuIGJlCisgKiBwb3J0YWJsZSBvciBpdCBjYW4gYmUgZWxlZ2FudCBidXQgcmFyZWx5IGJvdGguCisgKi8KKyNkZWZpbmUgR0VUU0hPUlQocywgY3ApIHsgXAorCXJlZ2lzdGVyIHVfY2hhciAqdF9jcCA9ICh1X2NoYXIgKikoY3ApOyBcCisJKHMpID0gKCh1X2ludDE2X3QpdF9jcFswXSA8PCA4KSBcCisJICAgIHwgKCh1X2ludDE2X3QpdF9jcFsxXSkgXAorCSAgICA7IFwKKwkoY3ApICs9IElOVDE2U1o7IFwKK30KKworI2RlZmluZSBHRVRMT05HKGwsIGNwKSB7IFwKKwlyZWdpc3RlciB1X2NoYXIgKnRfY3AgPSAodV9jaGFyICopKGNwKTsgXAorCShsKSA9ICgodV9pbnQzMl90KXRfY3BbMF0gPDwgMjQpIFwKKwkgICAgfCAoKHVfaW50MzJfdCl0X2NwWzFdIDw8IDE2KSBcCisJICAgIHwgKCh1X2ludDMyX3QpdF9jcFsyXSA8PCA4KSBcCisJICAgIHwgKCh1X2ludDMyX3QpdF9jcFszXSkgXAorCSAgICA7IFwKKwkoY3ApICs9IElOVDMyU1o7IFwKK30KKworI2RlZmluZSBQVVRTSE9SVChzLCBjcCkgeyBcCisJcmVnaXN0ZXIgdV9pbnQxNl90IHRfcyA9ICh1X2ludDE2X3QpKHMpOyBcCisJcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKKwkqdF9jcCsrID0gdF9zID4+IDg7IFwKKwkqdF9jcCAgID0gdF9zOyBcCisJKGNwKSArPSBJTlQxNlNaOyBcCit9CisKKyNkZWZpbmUgUFVUTE9ORyhsLCBjcCkgeyBcCisJcmVnaXN0ZXIgdV9pbnQzMl90IHRfbCA9ICh1X2ludDMyX3QpKGwpOyBcCisJcmVnaXN0ZXIgdV9jaGFyICp0X2NwID0gKHVfY2hhciAqKShjcCk7IFwKKwkqdF9jcCsrID0gdF9sID4+IDI0OyBcCisJKnRfY3ArKyA9IHRfbCA+PiAxNjsgXAorCSp0X2NwKysgPSB0X2wgPj4gODsgXAorCSp0X2NwICAgPSB0X2w7IFwKKwkoY3ApICs9IElOVDMyU1o7IFwKK30KKworI2VuZGlmIC8qICFfTkFNRVNFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL2JpdHR5cGVzLmggYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvYml0dHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBjYmRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL2JpdHR5cGVzLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBXSURFIFByb2plY3QuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIHByb2plY3Qgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9CSVRUWVBFU19ICisjZGVmaW5lIF9CSVRUWVBFU19ICisKKyNpZm5kZWYgSEFWRV9VX0lOVDhfVAordHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVfaW50OF90OwordHlwZWRlZiBzaWduZWQgY2hhciBpbnQ4X3Q7CisjZW5kaWYgLyogSEFWRV9VX0lOVDhfVCAqLworCisjaWZuZGVmIEhBVkVfVV9JTlQxNl9UIAordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1X2ludDE2X3Q7Cit0eXBlZGVmIHNpZ25lZCBzaG9ydCBpbnQxNl90OworI2VuZGlmIC8qIEhBVkVfVV9JTlQxNl9UICovCisKKyNpZm5kZWYgSEFWRV9VX0lOVDMyX1QKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVfaW50MzJfdDsKK3R5cGVkZWYgc2lnbmVkIGludCBpbnQzMl90OworI2VuZGlmIC8qIEhBVkVfVV9JTlQzMl9UICovCisKKyNpZm5kZWYgSEFWRV9VX0lOVDY0X1QKKyNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKK3R5cGVkZWYgdW5zaWduZWQgX2ludDY0IHVfaW50NjRfdDsKK3R5cGVkZWYgX2ludDY0IGludDY0X3Q7CisjZWxzZSAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVfaW50NjRfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CisjZW5kaWYgLyogX01TQ19FWFRFTlNJT05TICovCisjZW5kaWYgLyogSEFWRV9VX0lOVDY0X1QgKi8KKworI2lmbmRlZiBQUklkNjQKKyNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyNkZWZpbmUgUFJJZDY0CSJJNjRkIgorI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCisjZGVmaW5lIFBSSWQ2NAkibGxkIgorI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2VuZGlmIC8qIFBSSWQ2NCAqLworCisjaWZuZGVmIFBSSW82NAorI2lmZGVmIF9NU0NfRVhURU5TSU9OUworI2RlZmluZSBQUklvNjQJIkk2NG8iCisjZWxzZSAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KKyNkZWZpbmUgUFJJbzY0CSJsbG8iCisjZW5kaWYgLyogX01TQ19FWFRFTlNJT05TICovCisjZW5kaWYgLyogUFJJbzY0ICovCisKKyNpZm5kZWYgUFJJeDY0CisjaWZkZWYgX01TQ19FWFRFTlNJT05TCisjZGVmaW5lIFBSSXg2NAkiSTY0eCIKKyNlbHNlIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2RlZmluZSBQUkl4NjQJImxseCIKKyNlbmRpZiAvKiBfTVNDX0VYVEVOU0lPTlMgKi8KKyNlbmRpZiAvKiBQUkl4NjQgKi8KKworI2lmbmRlZiBQUkl1NjQKKyNpZmRlZiBfTVNDX0VYVEVOU0lPTlMKKyNkZWZpbmUgUFJJdTY0CSJJNjR1IgorI2Vsc2UgLyogX01TQ19FWFRFTlNJT05TICovCisjZGVmaW5lIFBSSXU2NAkibGx1IgorI2VuZGlmIC8qIF9NU0NfRVhURU5TSU9OUyAqLworI2VuZGlmIC8qIFBSSXU2NCAqLworCisjZW5kaWYgLyogX0JJVFRZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9jZGVjbF9leHQuaCBiL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9jZGVjbF9leHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTkxZGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL2NkZWNsX2V4dC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgV0lERSBQcm9qZWN0LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUFJPSkVDVCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFBST0pFQ1QgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBIQVZFX1BPUlRBQkxFX1BST1RPVFlQRQorCisjaWYgZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNkZWZpbmUJX19QKHByb3RvcykJcHJvdG9zCQkvKiBmdWxsLWJsb3duIEFOU0kgQyAqLworI2Vsc2UKKyNkZWZpbmUJX19QKHByb3RvcykJKCkJCS8qIHRyYWRpdGlvbmFsIEMgcHJlcHJvY2Vzc29yICovCisjZW5kaWYKKworI2VuZGlmIC8qICFIQVZFX1BPUlRBQkxFX1BST1RPVFlQRSAqLwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL2luZXRwcml2YXRlLmggYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvaW5ldHByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVlZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL2luZXRwcml2YXRlLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5OSAtIDIwMDMKKyAqIE5ldEdyb3VwLCBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gKEl0YWx5KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KKworZXh0ZXJuIHZvaWQgX3NldGh0ZW50KGludCBmKTsKK2V4dGVybiB2b2lkIF9lbmRodGVudCh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgaG9zdGVudCAqX2dldGh0ZW50KHZvaWQpOworZXh0ZXJuIHN0cnVjdCBob3N0ZW50ICpfZ2V0aHRieW5hbWUoY29uc3QgY2hhciAqbmFtZSk7CitleHRlcm4gc3RydWN0IGhvc3RlbnQgKl9nZXRodGJ5YWRkcihjb25zdCBjaGFyICphZGRyLCBpbnQgbGVuLAorCQkgaW50IHR5cGUpOworZXh0ZXJuIGludCBfdmFsaWR1c2VyKEZJTEUgKmhvc3RmLCBjb25zdCBjaGFyICpyaG9zdCwKKwkJIGNvbnN0IGNoYXIgKmx1c2VyLCBjb25zdCBjaGFyICpydXNlciwgaW50IGJhc2VsZW4pOworZXh0ZXJuIGludCBfY2hlY2tob3N0KGNvbnN0IGNoYXIgKnJob3N0LCBjb25zdCBjaGFyICpsaG9zdCwgaW50IGxlbik7CisjaWYgMAorZXh0ZXJuIHZvaWQgcHV0bG9uZyh1X2xvbmcgbCwgdV9jaGFyICptc2dwKTsKK2V4dGVybiB2b2lkIHB1dHNob3J0KHVfc2hvcnQgbCwgdV9jaGFyICptc2dwKTsKK2V4dGVybiB1X2ludDMyX3QgX2dldGxvbmcocmVnaXN0ZXIgY29uc3QgdV9jaGFyICptc2dwKTsKK2V4dGVybiB1X2ludDE2X3QgX2dldHNob3J0KHJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqbXNncCk7CitleHRlcm4gdm9pZCBwX3F1ZXJ5KGNoYXIgKm1zZyk7CitleHRlcm4gdm9pZCBmcF9xdWVyeShjaGFyICptc2csIEZJTEUgKmZpbGUpOworZXh0ZXJuIGNoYXIgKnBfY2RuYW1lKGNoYXIgKmNwLCBjaGFyICptc2csIEZJTEUgKmZpbGUpOworZXh0ZXJuIGNoYXIgKnBfcnIoY2hhciAqY3AsIGNoYXIgKm1zZywgRklMRSAqZmlsZSk7CitleHRlcm4gY2hhciAqcF90eXBlKGludCB0eXBlKTsKK2V4dGVybiBjaGFyICogcF9jbGFzcyhpbnQgY2xhc3MpOworZXh0ZXJuIGNoYXIgKnBfdGltZSh1X2xvbmcgdmFsdWUpOworI2VuZGlmCitleHRlcm4gY2hhciAqIGhvc3RhbGlhcyhjb25zdCBjaGFyICpuYW1lKTsKK2V4dGVybiB2b2lkIHNldGhvc3RmaWxlKGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgX3Jlc19jbG9zZSAodm9pZCk7CitleHRlcm4gdm9pZCBydXNlcnBhc3MoY29uc3QgY2hhciAqaG9zdCwgY2hhciAqKmFuYW1lLCBjaGFyICoqYXBhc3MpOwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL2lwNl9taXNjLmggYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvaXA2X21pc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJmYTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL2lwNl9taXNjLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL1dpbjMyL0luY2x1ZGUvaXA2X21pc2MuaCx2IDEuNSAyMDA2LTAxLTIyIDE4OjAyOjE4IGdpYW5sdWNhIEV4cCAkIChMQkwpCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBhIGNvbGxhZ2Ugb2YgZGVjbGFyYXRpb25zIGZvciBJUHY2IGZyb20gRnJlZUJTRCBub3QgcHJlc2VudCBpbiBXaW5kb3dzCisgKi8KKworI2luY2x1ZGUgPHdpbnNvY2syLmg+CisKKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgorCisjaWZuZGVmIF9fTUlOR1czMl9fCisjZGVmaW5lCUlOX01VTFRJQ0FTVChhKQkJSU5fQ0xBU1NEKGEpCisjZW5kaWYKKworI2RlZmluZQlJTl9FWFBFUklNRU5UQUwoYSkJKCgoKHVfaW50MzJfdCkgKGEpKSAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCisKKyNkZWZpbmUJSU5fTE9PUEJBQ0tORVQJCTEyNworCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKQorLyogSVB2NiBhZGRyZXNzICovCitzdHJ1Y3QgaW42X2FkZHIKKyAgeworICAgIHVuaW9uCisgICAgICB7CisJdV9pbnQ4X3QJCXU2X2FkZHI4WzE2XTsKKwl1X2ludDE2X3QJdTZfYWRkcjE2WzhdOworCXVfaW50MzJfdAl1Nl9hZGRyMzJbNF07CisgICAgICB9IGluNl91OworI2RlZmluZSBzNl9hZGRyCQkJaW42X3UudTZfYWRkcjgKKyNkZWZpbmUgczZfYWRkcjE2CQlpbjZfdS51Nl9hZGRyMTYKKyNkZWZpbmUgczZfYWRkcjMyCQlpbjZfdS51Nl9hZGRyMzIKKyNkZWZpbmUgczZfYWRkcjY0CQlpbjZfdS51Nl9hZGRyNjQKKyAgfTsKKworI2RlZmluZSBJTjZBRERSX0FOWV9JTklUIHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCB9CisjZGVmaW5lIElONkFERFJfTE9PUEJBQ0tfSU5JVCB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEgfQorI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCisKKworI2lmIChkZWZpbmVkIF9NU0NfVkVSKSB8fCAoZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKSkKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQJc2FfZmFtaWx5X3Q7CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKQorCisjZGVmaW5lCV9fU09DS0FERFJfQ09NTU9OKHNhX3ByZWZpeCkgXAorICBzYV9mYW1pbHlfdCBzYV9wcmVmaXgjI2ZhbWlseQorCisvKiBEaXR0bywgZm9yIElQdjYuICAqLworc3RydWN0IHNvY2thZGRyX2luNgorICB7CisgICAgX19TT0NLQUREUl9DT01NT04gKHNpbjZfKTsKKyAgICB1X2ludDE2X3Qgc2luNl9wb3J0OwkJLyogVHJhbnNwb3J0IGxheWVyIHBvcnQgIyAqLworICAgIHVfaW50MzJfdCBzaW42X2Zsb3dpbmZvOwkvKiBJUHY2IGZsb3cgaW5mb3JtYXRpb24gKi8KKyAgICBzdHJ1Y3QgaW42X2FkZHIgc2luNl9hZGRyOwkvKiBJUHY2IGFkZHJlc3MgKi8KKyAgfTsKKworI2RlZmluZSBJTjZfSVNfQUREUl9WNE1BUFBFRChhKSBcCisJKCgoKHVfaW50MzJfdCAqKSAoYSkpWzBdID09IDApICYmICgoKHVfaW50MzJfdCAqKSAoYSkpWzFdID09IDApICYmIFwKKwkgKCgodV9pbnQzMl90ICopIChhKSlbMl0gPT0gaHRvbmwgKDB4ZmZmZikpKQorCisjZGVmaW5lIElONl9JU19BRERSX01VTFRJQ0FTVChhKSAoKCh1X2ludDhfdCAqKSAoYSkpWzBdID09IDB4ZmYpCisKKyNkZWZpbmUgSU42X0lTX0FERFJfTElOS0xPQ0FMKGEpIFwKKwkoKCgodV9pbnQzMl90ICopIChhKSlbMF0gJiBodG9ubCAoMHhmZmMwMDAwMCkpID09IGh0b25sICgweGZlODAwMDAwKSkKKworI2RlZmluZSBJTjZfSVNfQUREUl9MT09QQkFDSyhhKSBcCisJKCgodV9pbnQzMl90ICopIChhKSlbMF0gPT0gMCAmJiAoKHVfaW50MzJfdCAqKSAoYSkpWzFdID09IDAgJiYgXAorCSAoKHVfaW50MzJfdCAqKSAoYSkpWzJdID09IDAgJiYgKCh1X2ludDMyX3QgKikgKGEpKVszXSA9PSBodG9ubCAoMSkpCisjZW5kaWYgLyogX19NSU5HVzMyX18gKi8KKworI2RlZmluZSBpcDZfdmZjICAgaXA2X2N0bHVuLmlwNl91bjJfdmZjCisjZGVmaW5lIGlwNl9mbG93ICBpcDZfY3RsdW4uaXA2X3VuMS5pcDZfdW4xX2Zsb3cKKyNkZWZpbmUgaXA2X3BsZW4gIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfcGxlbgorI2RlZmluZSBpcDZfbnh0ICAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9ueHQKKyNkZWZpbmUgaXA2X2hsaW0gIGlwNl9jdGx1bi5pcDZfdW4xLmlwNl91bjFfaGxpbQorI2RlZmluZSBpcDZfaG9wcyAgaXA2X2N0bHVuLmlwNl91bjEuaXA2X3VuMV9obGltCisKKyNkZWZpbmUgbmRfcmRfdHlwZSAgICAgICAgICAgICAgIG5kX3JkX2hkci5pY21wNl90eXBlCisjZGVmaW5lIG5kX3JkX2NvZGUgICAgICAgICAgICAgICBuZF9yZF9oZHIuaWNtcDZfY29kZQorI2RlZmluZSBuZF9yZF9ja3N1bSAgICAgICAgICAgICAgbmRfcmRfaGRyLmljbXA2X2Nrc3VtCisjZGVmaW5lIG5kX3JkX3Jlc2VydmVkICAgICAgICAgICBuZF9yZF9oZHIuaWNtcDZfZGF0YTMyWzBdCisKKy8qCisgKglJUFY2IGV4dGVuc2lvbiBoZWFkZXJzCisgKi8KKyNkZWZpbmUgSVBQUk9UT19IT1BPUFRTCQkwCS8qIElQdjYgaG9wLWJ5LWhvcCBvcHRpb25zCSovCisjZGVmaW5lIElQUFJPVE9fSVBWNgkJNDEgIC8qIElQdjYgaGVhZGVyLiAgKi8KKyNkZWZpbmUgSVBQUk9UT19ST1VUSU5HCQk0MwkvKiBJUHY2IHJvdXRpbmcgaGVhZGVyCQkqLworI2RlZmluZSBJUFBST1RPX0ZSQUdNRU5UCTQ0CS8qIElQdjYgZnJhZ21lbnRhdGlvbiBoZWFkZXIJKi8KKyNkZWZpbmUgSVBQUk9UT19FU1AJCTUwCS8qIGVuY2Fwc3VsYXRpbmcgc2VjdXJpdHkgcGF5bG9hZCAqLworI2RlZmluZSBJUFBST1RPX0FICQk1MQkvKiBhdXRoZW50aWNhdGlvbiBoZWFkZXIJKi8KKyNkZWZpbmUgSVBQUk9UT19JQ01QVjYJCTU4CS8qIElDTVB2NgkJCSovCisjZGVmaW5lIElQUFJPVE9fTk9ORQkJNTkJLyogSVB2NiBubyBuZXh0IGhlYWRlcgkJKi8KKyNkZWZpbmUgSVBQUk9UT19EU1RPUFRTCQk2MAkvKiBJUHY2IGRlc3RpbmF0aW9uIG9wdGlvbnMJKi8KKyNkZWZpbmUgSVBQUk9UT19QSU0JCQkxMDMgLyogUHJvdG9jb2wgSW5kZXBlbmRlbnQgTXVsdGljYXN0LiAgKi8KKworI2RlZmluZQkgSVBWNl9SVEhEUl9UWVBFXzAgMAorCisvKiBPcHRpb24gdHlwZXMgYW5kIHJlbGF0ZWQgbWFjcm9zICovCisjZGVmaW5lIElQNk9QVF9QQUQxCQkweDAwCS8qIDAwIDAgMDAwMDAgKi8KKyNkZWZpbmUgSVA2T1BUX1BBRE4JCTB4MDEJLyogMDAgMCAwMDAwMSAqLworI2RlZmluZSBJUDZPUFRfSlVNQk8JCTB4QzIJLyogMTEgMCAwMDAxMCA9IDE5NCAqLworI2RlZmluZSBJUDZPUFRfSlVNQk9fTEVOCTYKKyNkZWZpbmUgSVA2T1BUX1JPVVRFUl9BTEVSVAkweDA1CS8qIDAwIDAgMDAxMDEgKi8KKworI2RlZmluZSBJUDZPUFRfUlRBTEVSVF9MRU4JNAorI2RlZmluZSBJUDZPUFRfUlRBTEVSVF9NTEQJMAkvKiBEYXRhZ3JhbSBjb250YWlucyBhbiBNTEQgbWVzc2FnZSAqLworI2RlZmluZSBJUDZPUFRfUlRBTEVSVF9SU1ZQCTEJLyogRGF0YWdyYW0gY29udGFpbnMgYW4gUlNWUCBtZXNzYWdlICovCisjZGVmaW5lIElQNk9QVF9SVEFMRVJUX0FDVE5FVAkyIAkvKiBjb250YWlucyBhbiBBY3RpdmUgTmV0d29ya3MgbXNnICovCisjZGVmaW5lIElQNk9QVF9NSU5MRU4JCTIKKworI2RlZmluZSBJUDZPUFRfQklORElOR19VUERBVEUJMHhjNgkvKiAxMSAwIDAwMTEwICovCisjZGVmaW5lIElQNk9QVF9CSU5ESU5HX0FDSwkweDA3CS8qIDAwIDAgMDAxMTEgKi8KKyNkZWZpbmUgSVA2T1BUX0JJTkRJTkdfUkVRCTB4MDgJLyogMDAgMCAwMTAwMCAqLworI2RlZmluZSBJUDZPUFRfSE9NRV9BRERSRVNTCTB4YzkJLyogMTEgMCAwMTAwMSAqLworI2RlZmluZSBJUDZPUFRfRUlECQkweDhhCS8qIDEwIDAgMDEwMTAgKi8KKworI2RlZmluZSBJUDZPUFRfVFlQRShvKQkJKChvKSAmIDB4QzApCisjZGVmaW5lIElQNk9QVF9UWVBFX1NLSVAJMHgwMAorI2RlZmluZSBJUDZPUFRfVFlQRV9ESVNDQVJECTB4NDAKKyNkZWZpbmUgSVA2T1BUX1RZUEVfRk9SQ0VJQ01QCTB4ODAKKyNkZWZpbmUgSVA2T1BUX1RZUEVfSUNNUAkweEMwCisKKyNkZWZpbmUgSVA2T1BUX01VVEFCTEUJCTB4MjAKKworCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKQorI2lmbmRlZiBFQUlfQUREUkZBTUlMWQorc3RydWN0IGFkZHJpbmZvIHsKKwlpbnQJYWlfZmxhZ3M7CS8qIEFJX1BBU1NJVkUsIEFJX0NBTk9OTkFNRSAqLworCWludAlhaV9mYW1pbHk7CS8qIFBGX3h4eCAqLworCWludAlhaV9zb2NrdHlwZTsJLyogU09DS194eHggKi8KKwlpbnQJYWlfcHJvdG9jb2w7CS8qIDAgb3IgSVBQUk9UT194eHggZm9yIElQdjQgYW5kIElQdjYgKi8KKwlzaXplX3QJYWlfYWRkcmxlbjsJLyogbGVuZ3RoIG9mIGFpX2FkZHIgKi8KKwljaGFyCSphaV9jYW5vbm5hbWU7CS8qIGNhbm9uaWNhbCBuYW1lIGZvciBob3N0bmFtZSAqLworCXN0cnVjdCBzb2NrYWRkciAqYWlfYWRkcjsJLyogYmluYXJ5IGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWRkcmluZm8gKmFpX25leHQ7CS8qIG5leHQgc3RydWN0dXJlIGluIGxpbmtlZCBsaXN0ICovCit9OworI2VuZGlmCisjZW5kaWYgLyogX19NSU5HVzMyX18gKi8KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9uZXQvaWYuaCBiL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9uZXQvaWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjkyNmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL25ldC9pZi5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgyLCAxOTg2LCAxOTg5LCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylpZi5oCTguMSAoQmVya2VsZXkpIDYvMTAvOTMKKyAqICRGcmVlQlNEOiBzcmMvc3lzL25ldC9pZi5oLHYgMS40OS4yLjEgMTk5OS8wOC8yOSAxNjoyODoxNSBwZXRlciBFeHAgJAorICovCisKKyNpZm5kZWYgX05FVF9JRl9IXworI2RlZmluZQlfTkVUX0lGX0hfCisgCisvKgorICogPG5ldC9pZi5oPiBkb2VzIG5vdCBkZXBlbmQgb24gPHN5cy90aW1lLmg+IG9uIG1vc3Qgb3RoZXIgc3lzdGVtcy4gIFRoaXMKKyAqIGhlbHBzIHVzZXJsYW5kIGNvbXBhdGFiaWxpdHkuICAoc3RydWN0IHRpbWV2YWwgaWZpX2xhc3RjaGFuZ2UpCisgKi8KKyNpZm5kZWYgS0VSTkVMCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNlbmRpZgorCisvKgorICogU3RydWN0dXJlIGRlc2NyaWJpbmcgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW50ZXJmYWNlCisgKiB3aGljaCBtYXkgYmUgb2YgaW50ZXJlc3QgdG8gbWFuYWdlbWVudCBlbnRpdGllcy4KKyAqLworc3RydWN0IGlmX2RhdGEgeworCS8qIGdlbmVyaWMgaW50ZXJmYWNlIGluZm9ybWF0aW9uICovCisJdV9jaGFyCWlmaV90eXBlOwkJLyogZXRoZXJuZXQsIHRva2VucmluZywgZXRjICovCisJdV9jaGFyCWlmaV9waHlzaWNhbDsJCS8qIGUuZy4sIEFVSSwgVGhpbm5ldCwgMTBiYXNlLVQsIGV0YyAqLworCXVfY2hhcglpZmlfYWRkcmxlbjsJCS8qIG1lZGlhIGFkZHJlc3MgbGVuZ3RoICovCisJdV9jaGFyCWlmaV9oZHJsZW47CQkvKiBtZWRpYSBoZWFkZXIgbGVuZ3RoICovCisJdV9jaGFyCWlmaV9yZWN2cXVvdGE7CQkvKiBwb2xsaW5nIHF1b3RhIGZvciByZWNlaXZlIGludHJzICovCisJdV9jaGFyCWlmaV94bWl0cXVvdGE7CQkvKiBwb2xsaW5nIHF1b3RhIGZvciB4bWl0IGludHJzICovCisJdV9sb25nCWlmaV9tdHU7CQkvKiBtYXhpbXVtIHRyYW5zbWlzc2lvbiB1bml0ICovCisJdV9sb25nCWlmaV9tZXRyaWM7CQkvKiByb3V0aW5nIG1ldHJpYyAoZXh0ZXJuYWwgb25seSkgKi8KKwl1X2xvbmcJaWZpX2JhdWRyYXRlOwkJLyogbGluZXNwZWVkICovCisJLyogdm9sYXRpbGUgc3RhdGlzdGljcyAqLworCXVfbG9uZwlpZmlfaXBhY2tldHM7CQkvKiBwYWNrZXRzIHJlY2VpdmVkIG9uIGludGVyZmFjZSAqLworCXVfbG9uZwlpZmlfaWVycm9yczsJCS8qIGlucHV0IGVycm9ycyBvbiBpbnRlcmZhY2UgKi8KKwl1X2xvbmcJaWZpX29wYWNrZXRzOwkJLyogcGFja2V0cyBzZW50IG9uIGludGVyZmFjZSAqLworCXVfbG9uZwlpZmlfb2Vycm9yczsJCS8qIG91dHB1dCBlcnJvcnMgb24gaW50ZXJmYWNlICovCisJdV9sb25nCWlmaV9jb2xsaXNpb25zOwkJLyogY29sbGlzaW9ucyBvbiBjc21hIGludGVyZmFjZXMgKi8KKwl1X2xvbmcJaWZpX2lieXRlczsJCS8qIHRvdGFsIG51bWJlciBvZiBvY3RldHMgcmVjZWl2ZWQgKi8KKwl1X2xvbmcJaWZpX29ieXRlczsJCS8qIHRvdGFsIG51bWJlciBvZiBvY3RldHMgc2VudCAqLworCXVfbG9uZwlpZmlfaW1jYXN0czsJCS8qIHBhY2tldHMgcmVjZWl2ZWQgdmlhIG11bHRpY2FzdCAqLworCXVfbG9uZwlpZmlfb21jYXN0czsJCS8qIHBhY2tldHMgc2VudCB2aWEgbXVsdGljYXN0ICovCisJdV9sb25nCWlmaV9pcWRyb3BzOwkJLyogZHJvcHBlZCBvbiBpbnB1dCwgdGhpcyBpbnRlcmZhY2UgKi8KKwl1X2xvbmcJaWZpX25vcHJvdG87CQkvKiBkZXN0aW5lZCBmb3IgdW5zdXBwb3J0ZWQgcHJvdG9jb2wgKi8KKwl1X2xvbmcJaWZpX3JlY3Z0aW1pbmc7CQkvKiB1c2VjIHNwZW50IHJlY2VpdmluZyB3aGVuIHRpbWluZyAqLworCXVfbG9uZwlpZmlfeG1pdHRpbWluZzsJCS8qIHVzZWMgc3BlbnQgeG1pdHRpbmcgd2hlbiB0aW1pbmcgKi8KKwlzdHJ1Y3QJdGltZXZhbCBpZmlfbGFzdGNoYW5nZTsJLyogdGltZSBvZiBsYXN0IGFkbWluaXN0cmF0aXZlIGNoYW5nZSAqLworfTsKKworLyogd3MydGNwaXAuaCBoYXMgaW50ZXJmYWNlIGZsYWdzOiBJRkZfKiAqLworI2lmIDAKKyNkZWZpbmUJSUZGX1VQCQkweDEJCS8qIGludGVyZmFjZSBpcyB1cCAqLworI2RlZmluZQlJRkZfQlJPQURDQVNUCTB4MgkJLyogYnJvYWRjYXN0IGFkZHJlc3MgdmFsaWQgKi8KKyNkZWZpbmUJSUZGX0RFQlVHCTB4NAkJLyogdHVybiBvbiBkZWJ1Z2dpbmcgKi8KKyNkZWZpbmUJSUZGX0xPT1BCQUNLCTB4OAkJLyogaXMgYSBsb29wYmFjayBuZXQgKi8KKyNkZWZpbmUJSUZGX1BPSU5UT1BPSU5UCTB4MTAJCS8qIGludGVyZmFjZSBpcyBwb2ludC10by1wb2ludCBsaW5rICovCisvKiNkZWZpbmUgSUZGX05PVFJBSUxFUlMgMHgyMAkJICogb2Jzb2xldGU6IGF2b2lkIHVzZSBvZiB0cmFpbGVycyAqLworI2RlZmluZQlJRkZfUlVOTklORwkweDQwCQkvKiByZXNvdXJjZXMgYWxsb2NhdGVkICovCisjZGVmaW5lCUlGRl9OT0FSUAkweDgwCQkvKiBubyBhZGRyZXNzIHJlc29sdXRpb24gcHJvdG9jb2wgKi8KKyNkZWZpbmUJSUZGX1BST01JU0MJMHgxMDAJCS8qIHJlY2VpdmUgYWxsIHBhY2tldHMgKi8KKyNkZWZpbmUJSUZGX0FMTE1VTFRJCTB4MjAwCQkvKiByZWNlaXZlIGFsbCBtdWx0aWNhc3QgcGFja2V0cyAqLworI2RlZmluZQlJRkZfT0FDVElWRQkweDQwMAkJLyogdHJhbnNtaXNzaW9uIGluIHByb2dyZXNzICovCisjZGVmaW5lCUlGRl9TSU1QTEVYCTB4ODAwCQkvKiBjYW4ndCBoZWFyIG93biB0cmFuc21pc3Npb25zICovCisjZGVmaW5lCUlGRl9MSU5LMAkweDEwMDAJCS8qIHBlciBsaW5rIGxheWVyIGRlZmluZWQgYml0ICovCisjZGVmaW5lCUlGRl9MSU5LMQkweDIwMDAJCS8qIHBlciBsaW5rIGxheWVyIGRlZmluZWQgYml0ICovCisjZGVmaW5lCUlGRl9MSU5LMgkweDQwMDAJCS8qIHBlciBsaW5rIGxheWVyIGRlZmluZWQgYml0ICovCisjZGVmaW5lCUlGRl9BTFRQSFlTCUlGRl9MSU5LMgkvKiB1c2UgYWx0ZXJuYXRlIHBoeXNpY2FsIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUJSUZGX01VTFRJQ0FTVAkweDgwMDAJCS8qIHN1cHBvcnRzIG11bHRpY2FzdCAqLworI2VuZGlmIC8qIDAgKi8KKworLyogZmxhZ3Mgc2V0IGludGVybmFsbHkgb25seTogKi8KKyNkZWZpbmUJSUZGX0NBTlRDSEFOR0UgXAorCShJRkZfQlJPQURDQVNUfElGRl9QT0lOVE9QT0lOVHxJRkZfUlVOTklOR3xJRkZfT0FDVElWRXxcCisJICAgIElGRl9TSU1QTEVYfElGRl9NVUxUSUNBU1R8SUZGX0FMTE1VTFRJKQorCisjZGVmaW5lCUlGUV9NQVhMRU4JNTAKKyNkZWZpbmUJSUZORVRfU0xPV0haCTEJCS8qIGdyYW51bGFyaXR5IGlzIDEgc2Vjb25kICovCisKKy8qCisgKiBNZXNzYWdlIGZvcm1hdCBmb3IgdXNlIGluIG9idGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBpbnRlcmZhY2VzCisgKiBmcm9tIGdldGtlcm5pbmZvIGFuZCB0aGUgcm91dGluZyBzb2NrZXQKKyAqLworc3RydWN0IGlmX21zZ2hkciB7CisJdV9zaG9ydAlpZm1fbXNnbGVuOwkvKiB0byBza2lwIG92ZXIgbm9uLXVuZGVyc3Rvb2QgbWVzc2FnZXMgKi8KKwl1X2NoYXIJaWZtX3ZlcnNpb247CS8qIGZ1dHVyZSBiaW5hcnkgY29tcGF0YWJpbGl0eSAqLworCXVfY2hhcglpZm1fdHlwZTsJLyogbWVzc2FnZSB0eXBlICovCisJaW50CWlmbV9hZGRyczsJLyogbGlrZSBydG1fYWRkcnMgKi8KKwlpbnQJaWZtX2ZsYWdzOwkvKiB2YWx1ZSBvZiBpZl9mbGFncyAqLworCXVfc2hvcnQJaWZtX2luZGV4OwkvKiBpbmRleCBmb3IgYXNzb2NpYXRlZCBpZnAgKi8KKwlzdHJ1Y3QJaWZfZGF0YSBpZm1fZGF0YTsvKiBzdGF0aXN0aWNzIGFuZCBvdGhlciBkYXRhIGFib3V0IGlmICovCit9OworCisvKgorICogTWVzc2FnZSBmb3JtYXQgZm9yIHVzZSBpbiBvYnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgaW50ZXJmYWNlIGFkZHJlc3NlcworICogZnJvbSBnZXRrZXJuaW5mbyBhbmQgdGhlIHJvdXRpbmcgc29ja2V0CisgKi8KK3N0cnVjdCBpZmFfbXNnaGRyIHsKKwl1X3Nob3J0CWlmYW1fbXNnbGVuOwkvKiB0byBza2lwIG92ZXIgbm9uLXVuZGVyc3Rvb2QgbWVzc2FnZXMgKi8KKwl1X2NoYXIJaWZhbV92ZXJzaW9uOwkvKiBmdXR1cmUgYmluYXJ5IGNvbXBhdGFiaWxpdHkgKi8KKwl1X2NoYXIJaWZhbV90eXBlOwkvKiBtZXNzYWdlIHR5cGUgKi8KKwlpbnQJaWZhbV9hZGRyczsJLyogbGlrZSBydG1fYWRkcnMgKi8KKwlpbnQJaWZhbV9mbGFnczsJLyogdmFsdWUgb2YgaWZhX2ZsYWdzICovCisJdV9zaG9ydAlpZmFtX2luZGV4OwkvKiBpbmRleCBmb3IgYXNzb2NpYXRlZCBpZnAgKi8KKwlpbnQJaWZhbV9tZXRyaWM7CS8qIHZhbHVlIG9mIGlmYV9tZXRyaWMgKi8KK307CisKKy8qCisgKiBNZXNzYWdlIGZvcm1hdCBmb3IgdXNlIGluIG9idGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBtdWx0aWNhc3QgYWRkcmVzc2VzCisgKiBmcm9tIHRoZSByb3V0aW5nIHNvY2tldAorICovCitzdHJ1Y3QgaWZtYV9tc2doZHIgeworCXVfc2hvcnQJaWZtYW1fbXNnbGVuOwkvKiB0byBza2lwIG92ZXIgbm9uLXVuZGVyc3Rvb2QgbWVzc2FnZXMgKi8KKwl1X2NoYXIJaWZtYW1fdmVyc2lvbjsJLyogZnV0dXJlIGJpbmFyeSBjb21wYXRhYmlsaXR5ICovCisJdV9jaGFyCWlmbWFtX3R5cGU7CS8qIG1lc3NhZ2UgdHlwZSAqLworCWludAlpZm1hbV9hZGRyczsJLyogbGlrZSBydG1fYWRkcnMgKi8KKwlpbnQJaWZtYW1fZmxhZ3M7CS8qIHZhbHVlIG9mIGlmYV9mbGFncyAqLworCXVfc2hvcnQJaWZtYW1faW5kZXg7CS8qIGluZGV4IGZvciBhc3NvY2lhdGVkIGlmcCAqLworfTsKKworLyoKKyAqIEludGVyZmFjZSByZXF1ZXN0IHN0cnVjdHVyZSB1c2VkIGZvciBzb2NrZXQKKyAqIGlvY3RsJ3MuICBBbGwgaW50ZXJmYWNlIGlvY3RsJ3MgbXVzdCBoYXZlIHBhcmFtZXRlcgorICogZGVmaW5pdGlvbnMgd2hpY2ggYmVnaW4gd2l0aCBpZnJfbmFtZS4gIFRoZQorICogcmVtYWluZGVyIG1heSBiZSBpbnRlcmZhY2Ugc3BlY2lmaWMuCisgKi8KK3N0cnVjdAlpZnJlcSB7CisjZGVmaW5lCUlGTkFNU0laCTE2CisJY2hhcglpZnJfbmFtZVtJRk5BTVNJWl07CQkvKiBpZiBuYW1lLCBlLmcuICJlbjAiICovCisJdW5pb24geworCQlzdHJ1Y3QJc29ja2FkZHIgaWZydV9hZGRyOworCQlzdHJ1Y3QJc29ja2FkZHIgaWZydV9kc3RhZGRyOworCQlzdHJ1Y3QJc29ja2FkZHIgaWZydV9icm9hZGFkZHI7CisJCXNob3J0CWlmcnVfZmxhZ3M7CisJCWludAlpZnJ1X21ldHJpYzsKKwkJaW50CWlmcnVfbXR1OworCQlpbnQJaWZydV9waHlzOworCQlpbnQJaWZydV9tZWRpYTsKKwkJY2FkZHJfdAlpZnJ1X2RhdGE7CisJfSBpZnJfaWZydTsKKyNkZWZpbmUJaWZyX2FkZHIJaWZyX2lmcnUuaWZydV9hZGRyCS8qIGFkZHJlc3MgKi8KKyNkZWZpbmUJaWZyX2RzdGFkZHIJaWZyX2lmcnUuaWZydV9kc3RhZGRyCS8qIG90aGVyIGVuZCBvZiBwLXRvLXAgbGluayAqLworI2RlZmluZQlpZnJfYnJvYWRhZGRyCWlmcl9pZnJ1LmlmcnVfYnJvYWRhZGRyCS8qIGJyb2FkY2FzdCBhZGRyZXNzICovCisjZGVmaW5lCWlmcl9mbGFncwlpZnJfaWZydS5pZnJ1X2ZsYWdzCS8qIGZsYWdzICovCisjZGVmaW5lCWlmcl9tZXRyaWMJaWZyX2lmcnUuaWZydV9tZXRyaWMJLyogbWV0cmljICovCisjZGVmaW5lCWlmcl9tdHUJCWlmcl9pZnJ1LmlmcnVfbXR1CS8qIG10dSAqLworI2RlZmluZSBpZnJfcGh5cwlpZnJfaWZydS5pZnJ1X3BoeXMJLyogcGh5c2ljYWwgd2lyZSAqLworI2RlZmluZSBpZnJfbWVkaWEJaWZyX2lmcnUuaWZydV9tZWRpYQkvKiBwaHlzaWNhbCBtZWRpYSAqLworI2RlZmluZQlpZnJfZGF0YQlpZnJfaWZydS5pZnJ1X2RhdGEJLyogZm9yIHVzZSBieSBpbnRlcmZhY2UgKi8KK307CisKKyNkZWZpbmUJX1NJWkVPRl9BRERSX0lGUkVRKGlmcikgXAorCSgoaWZyKS5pZnJfYWRkci5zYV9sZW4gPiBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSA/IFwKKwkgKHNpemVvZihzdHJ1Y3QgaWZyZXEpIC0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKyBcCisJICAoaWZyKS5pZnJfYWRkci5zYV9sZW4pIDogc2l6ZW9mKHN0cnVjdCBpZnJlcSkpCisKK3N0cnVjdCBpZmFsaWFzcmVxIHsKKwljaGFyCWlmcmFfbmFtZVtJRk5BTVNJWl07CQkvKiBpZiBuYW1lLCBlLmcuICJlbjAiICovCisJc3RydWN0CXNvY2thZGRyIGlmcmFfYWRkcjsKKwlzdHJ1Y3QJc29ja2FkZHIgaWZyYV9icm9hZGFkZHI7CisJc3RydWN0CXNvY2thZGRyIGlmcmFfbWFzazsKK307CisKK3N0cnVjdCBpZm1lZGlhcmVxIHsKKwljaGFyCWlmbV9uYW1lW0lGTkFNU0laXTsJLyogaWYgbmFtZSwgZS5nLiAiZW4wIiAqLworCWludAlpZm1fY3VycmVudDsJCS8qIGN1cnJlbnQgbWVkaWEgb3B0aW9ucyAqLworCWludAlpZm1fbWFzazsJCS8qIGRvbid0IGNhcmUgbWFzayAqLworCWludAlpZm1fc3RhdHVzOwkJLyogbWVkaWEgc3RhdHVzICovCisJaW50CWlmbV9hY3RpdmU7CQkvKiBhY3RpdmUgb3B0aW9ucyAqLworCWludAlpZm1fY291bnQ7CQkvKiAjIGVudHJpZXMgaW4gaWZtX3VsaXN0IGFycmF5ICovCisJaW50CSppZm1fdWxpc3Q7CQkvKiBtZWRpYSB3b3JkcyAqLworfTsKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCBpbiBTSU9DR0lGQ09ORiByZXF1ZXN0LgorICogVXNlZCB0byByZXRyaWV2ZSBpbnRlcmZhY2UgY29uZmlndXJhdGlvbgorICogZm9yIG1hY2hpbmUgKHVzZWZ1bCBmb3IgcHJvZ3JhbXMgd2hpY2gKKyAqIG11c3Qga25vdyBhbGwgbmV0d29ya3MgYWNjZXNzaWJsZSkuCisgKi8KK3N0cnVjdAlpZmNvbmYgeworCWludAlpZmNfbGVuOwkJLyogc2l6ZSBvZiBhc3NvY2lhdGVkIGJ1ZmZlciAqLworCXVuaW9uIHsKKwkJY2FkZHJfdAlpZmN1X2J1ZjsKKwkJc3RydWN0CWlmcmVxICppZmN1X3JlcTsKKwl9IGlmY19pZmN1OworI2RlZmluZQlpZmNfYnVmCWlmY19pZmN1LmlmY3VfYnVmCS8qIGJ1ZmZlciBhZGRyZXNzICovCisjZGVmaW5lCWlmY19yZXEJaWZjX2lmY3UuaWZjdV9yZXEJLyogYXJyYXkgb2Ygc3RydWN0dXJlcyByZXR1cm5lZCAqLworfTsKKworI2lmZGVmIEtFUk5FTAorI2lmZGVmIE1BTExPQ19ERUNMQVJFCitNQUxMT0NfREVDTEFSRShNX0lGQUREUik7CitNQUxMT0NfREVDTEFSRShNX0lGTUFERFIpOworI2VuZGlmCisjZW5kaWYKKworLyogWFhYIC0gdGhpcyBzaG91bGQgZ28gYXdheSBzb29uICovCisjaWZkZWYgS0VSTkVMCisjaW5jbHVkZSA8bmV0L2lmX3Zhci5oPgorI2VuZGlmCisKKyNlbmRpZiAvKiAhX05FVF9JRl9IXyAqLwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL25ldC9uZXRkYi5oIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9JbmNsdWRlL25ldC9uZXRkYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZDQ1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvbmV0L25ldGRiLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTgwLCAxOTgzLCAxOTg4LCAxOTkzCisgKiAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglAKCMpbmV0ZGIuaAk4LjEgKEJlcmtlbGV5KSA2LzIvOTMKKyAqICAgICAgbmV0ZGIuaCx2IDEuNCAxOTk1LzA4LzE0IDA0OjA1OjA0IGhqbCBFeHAKKyAqIC0KKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5MyBieSBEaWdpdGFsIEVxdWlwbWVudCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcywgYW5kIHRoYXQKKyAqIHRoZSBuYW1lIG9mIERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIGRvY3VtZW50IG9yIHNvZnR3YXJlIHdpdGhvdXQKKyAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIERJR0lUQUwgRVFVSVBNRU5UIENPUlAuIERJU0NMQUlNUyBBTEwKKyAqIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gICBJTiBOTyBFVkVOVCBTSEFMTCBESUdJVEFMIEVRVUlQTUVOVAorICogQ09SUE9SQVRJT04gQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SCisgKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworICogQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTCisgKiBTT0ZUV0FSRS4KKyAqIC0KKyAqIC0tQ29weXJpZ2h0LS0KKyAqLworCisjaWZuZGVmIF9ORVREQl9IXworI2RlZmluZSBfTkVUREJfSF8KKworI2lmIGRlZmluZWQoX1BPU0lYX1RIUkVBRF9TQUZFX0ZVTkNUSU9OUykgfHwgZGVmaW5lZChfUkVFTlRSQU5UKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx3aW5zb2NrMi5oPgorI2luY2x1ZGUgPG5ldC9wYXRocy5oPgorCisjZGVmaW5lIF9QQVRIX0hFUVVJVglfX1BBVEhfRVRDX0lORVQiL2hvc3RzLmVxdWl2IgorI2RlZmluZSBfUEFUSF9IT1NUUwlfX1BBVEhfRVRDX0lORVQiL2hvc3RzIgorI2RlZmluZSBfUEFUSF9ORVRXT1JLUwlfX1BBVEhfRVRDX0lORVQiL25ldHdvcmtzIgorI2RlZmluZSBfUEFUSF9QUk9UT0NPTFMJX19QQVRIX0VUQ19JTkVUIi9wcm90b2NvbHMiCisjZGVmaW5lIF9QQVRIX1NFUlZJQ0VTCV9fUEFUSF9FVENfSU5FVCIvc2VydmljZXMiCisjZGVmaW5lIF9QQVRIX1JFU0NPTkYJX19QQVRIX0VUQ19JTkVUIi9yZXNvbHYuY29uZiIKKyNkZWZpbmUgX1BBVEhfUlBDCV9fUEFUSF9FVENfSU5FVCIvcnBjIgorCitzdHJ1Y3QgcnBjZW50IHsKKwljaGFyCSpyX25hbWU7CS8qIG5hbWUgb2Ygc2VydmVyIGZvciB0aGlzIHJwYyBwcm9ncmFtICovCisJY2hhcgkqKnJfYWxpYXNlczsJLyogYWxpYXMgbGlzdCAqLworCWludAlyX251bWJlcjsJLyogcnBjIHByb2dyYW0gbnVtYmVyICovCit9OworCisjaWZuZGVmIFdJTjMyCisjaWYgZGVmaW5lZChfUE9TSVhfVEhSRUFEX1NBRkVfRlVOQ1RJT05TKSB8fCBkZWZpbmVkKF9SRUVOVFJBTlQpCisKKyNkZWZpbmUgX19ORVREQl9NQVhBTElBU0VTCTM1CisjZGVmaW5lIF9fTkVUREJfTUFYQUREUlMJMzUKKworLyoKKyAqIEVycm9yIHJldHVybiBjb2RlcyBmcm9tIGdldGhvc3RieW5hbWUoKSBhbmQgZ2V0aG9zdGJ5YWRkcigpCisgKiAobGVmdCBpbiBleHRlcm4gaW50IGhfZXJybm8pLgorICovCisjZGVmaW5lIGhfZXJybm8JCSgqX19oX2Vycm5vX2xvY2F0aW9uICgpKQorI2Vsc2UKK2V4dGVybiBpbnQgaF9lcnJubzsKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUJTkVUREJfSU5URVJOQUwgLTEgLyogc2VlIGVycm5vICovCisjZGVmaW5lCU5FVERCX1NVQ0NFU1MgICAwIC8qIG5vIHByb2JsZW0gKi8KKworLy8jaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKwordm9pZAkJZW5kaG9zdGVudCAodm9pZCk7Cit2b2lkCQllbmRuZXRlbnQgKHZvaWQpOwordm9pZAkJZW5kcHJvdG9lbnQgKHZvaWQpOwordm9pZAkJZW5kc2VydmVudCAodm9pZCk7Cit2b2lkCQllbmRycGNlbnQgKHZvaWQpOworc3RydWN0IGhvc3RlbnQJKmdldGhvc3RlbnQgKHZvaWQpOworc3RydWN0IG5ldGVudAkqZ2V0bmV0YnlhZGRyIChsb25nLCBpbnQpOyAvKiB1X2xvbmc/ICovCitzdHJ1Y3QgbmV0ZW50CSpnZXRuZXRieW5hbWUgKGNvbnN0IGNoYXIgKik7CitzdHJ1Y3QgbmV0ZW50CSpnZXRuZXRlbnQgKHZvaWQpOworc3RydWN0IHByb3RvZW50CSpnZXRwcm90b2VudCAodm9pZCk7CitzdHJ1Y3Qgc2VydmVudAkqZ2V0c2VydmVudCAodm9pZCk7CitzdHJ1Y3QgcnBjZW50CSpnZXRycGNlbnQgKHZvaWQpOworc3RydWN0IHJwY2VudAkqZ2V0cnBjYnluYW1lIChjb25zdCBjaGFyICopOworc3RydWN0IHJwY2VudAkqZ2V0cnBjYnludW1iZXIgKGludCk7Cit2b2lkCQloZXJyb3IgKGNvbnN0IGNoYXIgKik7Cit2b2lkCQlzZXRob3N0ZW50IChpbnQpOworLyogdm9pZAkJc2V0aG9zdGZpbGUgKGNvbnN0IGNoYXIgKik7ICovCit2b2lkCQlzZXRuZXRlbnQgKGludCk7Cit2b2lkCQlzZXRwcm90b2VudCAoaW50KTsKK3ZvaWQJCXNldHNlcnZlbnQgKGludCk7Cit2b2lkCQlzZXRycGNlbnQgKGludCk7CisKKyNpZiBkZWZpbmVkKF9QT1NJWF9USFJFQURfU0FGRV9GVU5DVElPTlMpIHx8IGRlZmluZWQoX1JFRU5UUkFOVCkKK3N0cnVjdCBob3N0ZW50CSpnZXRob3N0YnlhZGRyX3IgKGNvbnN0IGNoYXIgKl9fYWRkciwKKwkJCWludCBfX2xlbmd0aCwgaW50IF9fdHlwZSwKKwkJCXN0cnVjdCBob3N0ZW50ICpfX3Jlc3VsdCwKKwkJCWNoYXIgKl9fYnVmZmVyLCBpbnQgX19idWZsZW4sIGludCAqX19oX2Vycm5vcCk7CitzdHJ1Y3QgaG9zdGVudAkqZ2V0aG9zdGJ5bmFtZV9yIChjb25zdCBjaGFyICogX19uYW1lLAorCQkJc3RydWN0IGhvc3RlbnQgKl9fcmVzdWx0LCBjaGFyICpfX2J1ZmZlciwKKwkJCWludCBfX2J1ZmxlbiwgaW50ICpfX2hfZXJybm9wKTsKK3N0cnVjdCBob3N0ZW50CSpnZXRob3N0ZW50X3IgKHN0cnVjdCBob3N0ZW50ICpfX3Jlc3VsdCwKKwkJCWNoYXIgKl9fYnVmZmVyLCBpbnQgX19idWZsZW4sIGludCAqX19oX2Vycm5vcCk7CitzdHJ1Y3QgbmV0ZW50CSpnZXRuZXRieWFkZHJfciAobG9uZyBfX25ldCwgaW50IF9fdHlwZSwKKwkJCXN0cnVjdCBuZXRlbnQgKl9fcmVzdWx0LCBjaGFyICpfX2J1ZmZlciwKKwkJCWludCBfX2J1Zmxlbik7CitzdHJ1Y3QgbmV0ZW50CSpnZXRuZXRieW5hbWVfciAoY29uc3QgY2hhciAqIF9fbmFtZSwKKwkJCXN0cnVjdCBuZXRlbnQgKl9fcmVzdWx0LCBjaGFyICpfX2J1ZmZlciwKKwkJCWludCBfX2J1Zmxlbik7CitzdHJ1Y3QgbmV0ZW50CSpnZXRuZXRlbnRfciAoc3RydWN0IG5ldGVudCAqX19yZXN1bHQsCisJCQljaGFyICpfX2J1ZmZlciwgaW50IF9fYnVmbGVuKTsKK3N0cnVjdCBwcm90b2VudAkqZ2V0cHJvdG9ieW5hbWVfciAoY29uc3QgY2hhciAqIF9fbmFtZSwKKwkJCXN0cnVjdCBwcm90b2VudCAqX19yZXN1bHQsIGNoYXIgKl9fYnVmZmVyLAorCQkJaW50IF9fYnVmbGVuKTsKK3N0cnVjdCBwcm90b2VudAkqZ2V0cHJvdG9ieW51bWJlcl9yIChpbnQgX19wcm90bywKKwkJCXN0cnVjdCBwcm90b2VudCAqX19yZXN1bHQsIGNoYXIgKl9fYnVmZmVyLAorCQkJaW50IF9fYnVmbGVuKTsKK3N0cnVjdCBwcm90b2VudAkqZ2V0cHJvdG9lbnRfciAoc3RydWN0IHByb3RvZW50ICpfX3Jlc3VsdCwKKwkJCWNoYXIgKl9fYnVmZmVyLCBpbnQgX19idWZsZW4pOworc3RydWN0IHNlcnZlbnQJKmdldHNlcnZieW5hbWVfciAoY29uc3QgY2hhciAqIF9fbmFtZSwKKwkJCWNvbnN0IGNoYXIgKl9fcHJvdG8sIHN0cnVjdCBzZXJ2ZW50ICpfX3Jlc3VsdCwKKwkJCWNoYXIgKl9fYnVmZmVyLCBpbnQgX19idWZsZW4pOworc3RydWN0IHNlcnZlbnQJKmdldHNlcnZieXBvcnRfciAoaW50IF9fcG9ydCwKKwkJCWNvbnN0IGNoYXIgKl9fcHJvdG8sIHN0cnVjdCBzZXJ2ZW50ICpfX3Jlc3VsdCwKKwkJCWNoYXIgKl9fYnVmZmVyLCBpbnQgX19idWZsZW4pOworc3RydWN0IHNlcnZlbnQJKmdldHNlcnZlbnRfciAoc3RydWN0IHNlcnZlbnQgKl9fcmVzdWx0LAorCQkJY2hhciAqX19idWZmZXIsIGludCBfX2J1Zmxlbik7CisKK2ludCAqX19oX2Vycm5vX2xvY2F0aW9uICh2b2lkKTsKKworI2VuZGlmCisKKyNlbmRpZiAvKiAhX05FVERCX0hfICovCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvbmV0L3BhdGhzLmggYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvbmV0L3BhdGhzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ZGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9uZXQvcGF0aHMuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylwYXRocy5oCTUuMTUgKEJlcmtlbGV5KSA1LzI5LzkxCisgKi8KKworI2lmbmRlZiBfUEFUSFNfSF8KKyNkZWZpbmUJX1BBVEhTX0hfCisKKyNpZiAwCisjZGVmaW5lCV9fUEFUSF9FVENfSU5FVAkiL3Vzci9ldGMvaW5ldCIKKyNlbHNlCisjZGVmaW5lCV9fUEFUSF9FVENfSU5FVAkiL2V0YyIKKyNlbmRpZgorCisvKiBEZWZhdWx0IHNlYXJjaCBwYXRoLiAqLworI2RlZmluZQlfUEFUSF9ERUZQQVRICQkiL3Vzci9sb2NhbC9iaW46L3Vzci9iaW46L2JpbjouIgorI2RlZmluZSBfUEFUSF9ERUZQQVRIX1JPT1QJIi9zYmluOi9iaW46L3Vzci9zYmluOi91c3IvYmluIgorCisjZGVmaW5lCV9QQVRIX0JTSEVMTAkiL2Jpbi9zaCIKKyNkZWZpbmUJX1BBVEhfQ09OU09MRQkiL2Rldi9jb25zb2xlIgorI2RlZmluZQlfUEFUSF9DU0hFTEwJIi9iaW4vY3NoIgorI2RlZmluZQlfUEFUSF9ERVZEQgkiL3Zhci9ydW4vZGV2LmRiIgorI2RlZmluZQlfUEFUSF9ERVZOVUxMCSIvZGV2L251bGwiCisjZGVmaW5lCV9QQVRIX0RSVU0JIi9kZXYvZHJ1bSIKKyNkZWZpbmUJX1BBVEhfSEVRVUlWCV9fUEFUSF9FVENfSU5FVCIvaG9zdHMuZXF1aXYiCisjZGVmaW5lCV9QQVRIX0tNRU0JIi9kZXYva21lbSIKKyNkZWZpbmUJX1BBVEhfTUFJTERJUgkiL3Zhci9zcG9vbC9tYWlsIgorI2RlZmluZQlfUEFUSF9NQU4JIi91c3IvbWFuIgorI2RlZmluZQlfUEFUSF9NRU0JIi9kZXYvbWVtIgorI2RlZmluZQlfUEFUSF9MT0dJTgkiL2Jpbi9sb2dpbiIKKyNkZWZpbmUJX1BBVEhfTk9MT0dJTgkiL2V0Yy9ub2xvZ2luIgorI2RlZmluZQlfUEFUSF9TRU5ETUFJTAkiL3Vzci9zYmluL3NlbmRtYWlsIgorI2RlZmluZQlfUEFUSF9TSEVMTFMJIi9ldGMvc2hlbGxzIgorI2RlZmluZQlfUEFUSF9UVFkJIi9kZXYvdHR5IgorI2RlZmluZQlfUEFUSF9VTklYCSIvdm1saW51eCIKKyNkZWZpbmUJX1BBVEhfVkkJIi91c3IvYmluL3ZpIgorCisvKiBQcm92aWRlIHRyYWlsaW5nIHNsYXNoLCBzaW5jZSBtb3N0bHkgdXNlZCBmb3IgYnVpbGRpbmcgcGF0aG5hbWVzLiAqLworI2RlZmluZQlfUEFUSF9ERVYJIi9kZXYvIgorI2RlZmluZQlfUEFUSF9UTVAJIi90bXAvIgorI2RlZmluZQlfUEFUSF9WQVJSVU4JIi92YXIvcnVuLyIKKyNkZWZpbmUJX1BBVEhfVkFSVE1QCSIvdmFyL3RtcC8iCisKKyNkZWZpbmUgX1BBVEhfS0xPRwkiL3Byb2Mva21zZyIKKyNkZWZpbmUgX1BBVEhfTE9HQ09ORglfX1BBVEhfRVRDX0lORVQiL3N5c2xvZy5jb25mIgorI2lmIDAKKyNkZWZpbmUgX1BBVEhfTE9HUElECV9fUEFUSF9FVENfSU5FVCIvc3lzbG9nLnBpZCIKKyNlbHNlCisjZGVmaW5lIF9QQVRIX0xPR1BJRAkiL3Zhci9ydW4vc3lzbG9nLnBpZCIKKyNlbmRpZgorI2RlZmluZSBfUEFUSF9MT0cJIi9kZXYvbG9nIgorI2RlZmluZSBfUEFUSF9DT05TT0xFCSIvZGV2L2NvbnNvbGUiCisKKyNpZiAwCisjZGVmaW5lIF9QQVRIX1VUTVAJIi92YXIvYWRtL3V0bXAiCisjZGVmaW5lIF9QQVRIX1dUTVAJIi92YXIvYWRtL3d0bXAiCisjZGVmaW5lIF9QQVRIX0xBU1RMT0cJIi92YXIvYWRtL2xhc3Rsb2ciCisjZWxzZQorI2RlZmluZSBfUEFUSF9VVE1QCSIvdmFyL3J1bi91dG1wIgorI2RlZmluZSBfUEFUSF9XVE1QCSIvdmFyL2xvZy93dG1wIgorI2RlZmluZSBfUEFUSF9MQVNUTE9HCSIvdmFyL2xvZy9sYXN0bG9nIgorI2VuZGlmCisKKyNkZWZpbmUgX1BBVEhfTE9DQUxFCSIvdXNyL2xpYi9sb2NhbGUiCisKKyNkZWZpbmUgX1BBVEhfUldIT0RJUgkiL3Zhci9zcG9vbC9yd2hvIgorCisjaWYgX01JVF9QT1NJWF9USFJFQURTCisvKiBGb3IgdGhlIE1JVCBwdGhyZWFkcyAqLworI2RlZmluZSBfUEFUSF9QVFkJIi9kZXYvIgorI2RlZmluZSBfUEFUSF9UWkRJUgkiL3Vzci9saWIvem9uZWluZm8iCisjZGVmaW5lIF9QQVRIX1RaRklMRQkiL3Vzci9saWIvem9uZWluZm8vbG9jYWx0aW1lIgorI2VuZGlmCisKKyNlbmRpZiAvKiAhX1BBVEhTX0hfICovCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvc29ja3N0b3JhZ2UuaCBiL2xpYnBjYXAtMS4zLjAvV2luMzIvSW5jbHVkZS9zb2Nrc3RvcmFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2ViNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1dpbjMyL0luY2x1ZGUvc29ja3N0b3JhZ2UuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KK3N0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIHsKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgorCXVfaW50OF90IF9fc3NfbGVuOworCXVfaW50OF90IF9fc3NfZmFtaWx5OworCXVfaW50OF90IGZpbGxbMTI2XTsKKyNlbHNlCisJdV9pbnQ4X3QgX19zc19mYW1pbHk7CisJdV9pbnQ4X3QgZmlsbFsxMjddOworI2VuZGlmIC8qIEhBVkVfU09DS0FERFJfU0FfTEVOICovCit9OwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9QcmovbGlicGNhcC5kc3AgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1Byai9saWJwY2FwLmRzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U1YTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9QcmovbGlicGNhcC5kc3AKQEAgLTAsMCArMSwxNjggQEAKKyMgTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gUHJvamVjdCBGaWxlIC0gTmFtZT0ibGlicGNhcCIgLSBQYWNrYWdlIE93bmVyPTw0PgorIyBNaWNyb3NvZnQgRGV2ZWxvcGVyIFN0dWRpbyBHZW5lcmF0ZWQgQnVpbGQgRmlsZSwgRm9ybWF0IFZlcnNpb24gNi4wMAorIyAqKiBETyBOT1QgRURJVCAqKgorCisjIFRBUkdUWVBFICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIgMHgwMTA0CisKK0NGRz1saWJwY2FwIC0gV2luMzIgRGVidWcKKyFNRVNTQUdFIFRoaXMgaXMgbm90IGEgdmFsaWQgbWFrZWZpbGUuIFRvIGJ1aWxkIHRoaXMgcHJvamVjdCB1c2luZyBOTUFLRSwKKyFNRVNTQUdFIHVzZSB0aGUgRXhwb3J0IE1ha2VmaWxlIGNvbW1hbmQgYW5kIHJ1bgorIU1FU1NBR0UgCishTUVTU0FHRSBOTUFLRSAvZiAibGlicGNhcC5tYWsiLgorIU1FU1NBR0UgCishTUVTU0FHRSBZb3UgY2FuIHNwZWNpZnkgYSBjb25maWd1cmF0aW9uIHdoZW4gcnVubmluZyBOTUFLRQorIU1FU1NBR0UgYnkgZGVmaW5pbmcgdGhlIG1hY3JvIENGRyBvbiB0aGUgY29tbWFuZCBsaW5lLiBGb3IgZXhhbXBsZToKKyFNRVNTQUdFIAorIU1FU1NBR0UgTk1BS0UgL2YgImxpYnBjYXAubWFrIiBDRkc9ImxpYnBjYXAgLSBXaW4zMiBEZWJ1ZyIKKyFNRVNTQUdFIAorIU1FU1NBR0UgUG9zc2libGUgY2hvaWNlcyBmb3IgY29uZmlndXJhdGlvbiBhcmU6CishTUVTU0FHRSAKKyFNRVNTQUdFICJsaWJwY2FwIC0gV2luMzIgUmVsZWFzZSIgKGJhc2VkIG9uICJXaW4zMiAoeDg2KSBTdGF0aWMgTGlicmFyeSIpCishTUVTU0FHRSAibGlicGNhcCAtIFdpbjMyIERlYnVnIiAoYmFzZWQgb24gIldpbjMyICh4ODYpIFN0YXRpYyBMaWJyYXJ5IikKKyFNRVNTQUdFIAorCisjIEJlZ2luIFByb2plY3QKKyMgUFJPUCBBbGxvd1BlckNvbmZpZ0RlcGVuZGVuY2llcyAwCisjIFBST1AgU2NjX1Byb2pOYW1lICIiCisjIFBST1AgU2NjX0xvY2FsUGF0aCAiIgorQ1BQPWNsLmV4ZQorUlNDPXJjLmV4ZQorCishSUYgICIkKENGRykiID09ICJsaWJwY2FwIC0gV2luMzIgUmVsZWFzZSIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDAKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgQkFTRSBJbnRlcm1lZGlhdGVfRGlyICJSZWxlYXNlIgorIyBQUk9QIEJBU0UgVGFyZ2V0X0RpciAiIgorIyBQUk9QIFVzZV9NRkMgMAorIyBQUk9QIFVzZV9EZWJ1Z19MaWJyYXJpZXMgMAorIyBQUk9QIE91dHB1dF9EaXIgIlJlbGVhc2UiCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiUmVsZWFzZSIKKyMgUFJPUCBUYXJnZXRfRGlyICIiCisjIEFERCBCQVNFIENQUCAvbm9sb2dvIC9XMyAvR1ggL08yIC9EICJXSU4zMiIgL0QgIk5ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvYworIyBBREQgQ1BQIC9ub2xvZ28gL01UIC9XMyAvR1ggL08yIC9JICIuLi8uLi8iIC9JICIuLi8uLi9sYmwvIiAvSSAiLi4vLi4vYnBmLyIgL0kgIi4uL2luY2x1ZGUvIiAvSSAiLi4vLi4vLi4vLi4vY29tbW9uIiAvSSAiLi4vLi4vLi4vLi4vZGFnL2luY2x1ZGUiIC9JICIuLi8uLi8uLi8uLi9kYWcvZHJ2L3dpbmRvd3MiIC9EICJOREVCVUciIC9EICJZWV9ORVZFUl9JTlRFUkFDVElWRSIgL0QgeXlsdmFsPXBjYXBfbHZhbCAvRCAiX1VTUkRMTCIgL0QgIkxJQlBDQVBfRVhQT1JUUyIgL0QgIkhBVkVfU1RSRVJST1IiIC9EICJfX1NURENfXyIgL0QgIklORVQ2IiAvRCAiX1dJTkRPV1MiIC9EICJfTUJDUyIgL0QgIkhBVkVfQUREUklORk8iIC9EICJXSU4zMiIgL0QgX1VfPSAvRCAiSEFWRV9TTlBSSU5URiIgL0QgIkhBVkVfVlNOUFJJTlRGIiAvWVggL0ZEIC9jCisjIEFERCBCQVNFIFJTQyAvbCAweDQwOSAvZCAiTkRFQlVHIgorIyBBREQgUlNDIC9sIDB4NDA5IC9kICJOREVCVUciCitCU0MzMj1ic2NtYWtlLmV4ZQorIyBBREQgQkFTRSBCU0MzMiAvbm9sb2dvCisjIEFERCBCU0MzMiAvbm9sb2dvCitMSUIzMj1saW5rLmV4ZSAtbGliCisjIEFERCBCQVNFIExJQjMyIC9ub2xvZ28KKyMgQUREIExJQjMyIC9ub2xvZ28KKworIUVMU0VJRiAgIiQoQ0ZHKSIgPT0gImxpYnBjYXAgLSBXaW4zMiBEZWJ1ZyIKKworIyBQUk9QIEJBU0UgVXNlX01GQyAwCisjIFBST1AgQkFTRSBVc2VfRGVidWdfTGlicmFyaWVzIDEKKyMgUFJPUCBCQVNFIE91dHB1dF9EaXIgIkRlYnVnIgorIyBQUk9QIEJBU0UgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgQkFTRSBUYXJnZXRfRGlyICIiCisjIFBST1AgVXNlX01GQyAwCisjIFBST1AgVXNlX0RlYnVnX0xpYnJhcmllcyAxCisjIFBST1AgT3V0cHV0X0RpciAiRGVidWciCisjIFBST1AgSW50ZXJtZWRpYXRlX0RpciAiRGVidWciCisjIFBST1AgVGFyZ2V0X0RpciAiIgorIyBBREQgQkFTRSBDUFAgL25vbG9nbyAvVzMgL0dtIC9HWCAvWkkgL09kIC9EICJXSU4zMiIgL0QgIl9ERUJVRyIgL0QgIl9NQkNTIiAvRCAiX0xJQiIgL1lYIC9GRCAvR1ogL2MKKyMgQUREIENQUCAvbm9sb2dvIC9NVGQgL1czIC9HbSAvR1ggL1pJIC9PZCAvSSAiLi4vLi4vIiAvSSAiLi4vLi4vbGJsLyIgL0kgIi4uLy4uL2JwZi8iIC9JICIuLi9pbmNsdWRlLyIgL0kgIi4uLy4uLy4uLy4uL2NvbW1vbiIgL0kgIi4uLy4uLy4uLy4uL2RhZy9pbmNsdWRlIiAvSSAiLi4vLi4vLi4vLi4vZGFnL2Rydi93aW5kb3dzIiAvRCAiX0RFQlVHIiAvRCAiWVlfTkVWRVJfSU5URVJBQ1RJVkUiIC9EIHl5bHZhbD1wY2FwX2x2YWwgL0QgIl9VU1JETEwiIC9EICJMSUJQQ0FQX0VYUE9SVFMiIC9EICJIQVZFX1NUUkVSUk9SIiAvRCAiX19TVERDX18iIC9EICJJTkVUNiIgL0QgIl9XSU5ET1dTIiAvRCAiX01CQ1MiIC9EICJIQVZFX0FERFJJTkZPIiAvRCAiV0lOMzIiIC9EIF9VXz0gL0QgIkhBVkVfU05QUklOVEYiIC9EICJIQVZFX1ZTTlBSSU5URiIgL1lYIC9GRCAvR1ogL2MKKyMgQUREIEJBU0UgUlNDIC9sIDB4NDA5IC9kICJfREVCVUciCisjIEFERCBSU0MgL2wgMHg0MDkgL2QgIl9ERUJVRyIKK0JTQzMyPWJzY21ha2UuZXhlCisjIEFERCBCQVNFIEJTQzMyIC9ub2xvZ28KKyMgQUREIEJTQzMyIC9ub2xvZ28KK0xJQjMyPWxpbmsuZXhlIC1saWIKKyMgQUREIEJBU0UgTElCMzIgL25vbG9nbworIyBBREQgTElCMzIgL25vbG9nbworCishRU5ESUYgCisKKyMgQmVnaW4gVGFyZ2V0CisKKyMgTmFtZSAibGlicGNhcCAtIFdpbjMyIFJlbGVhc2UiCisjIE5hbWUgImxpYnBjYXAgLSBXaW4zMiBEZWJ1ZyIKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGJwZl9kdW1wLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxicGZcbmV0XGJwZl9maWx0ZXIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGJwZl9pbWFnZS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cZXRoZXJlbnQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSIuLlwuLlxmYWQtd2luMzIuYyIKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlxTcmNcZmZzLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlwuLlxnZW5jb2RlLmMKKyMgRW5kIFNvdXJjZSBGaWxlCisjIEJlZ2luIFNvdXJjZSBGaWxlCisKK1NPVVJDRT0uLlxTcmNcZ2V0bmV0YnlubS5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cU3JjXGdldG5ldGVudC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cU3JjXGdldHNlcnZlbnQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGdyYW1tYXIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXGluZXQuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXFNyY1xpbmV0X2F0b24uYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXFNyY1xpbmV0X25ldC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cU3JjXGluZXRfcHRvbi5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cbmFtZXRvYWRkci5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cb3B0aW1pemUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPSIuLlwuLlxQY2FwLXdpbjMyLmMiCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5ccGNhcC5jCisjIEVuZCBTb3VyY2UgRmlsZQorIyBCZWdpbiBTb3VyY2UgRmlsZQorCitTT1VSQ0U9Li5cLi5cc2F2ZWZpbGUuYworIyBFbmQgU291cmNlIEZpbGUKKyMgQmVnaW4gU291cmNlIEZpbGUKKworU09VUkNFPS4uXC4uXHNjYW5uZXIuYworIyBFbmQgU291cmNlIEZpbGUKKyMgRW5kIFRhcmdldAorIyBFbmQgUHJvamVjdApkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9QcmovbGlicGNhcC5kc3cgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1Byai9saWJwY2FwLmRzdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RmZjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9QcmovbGlicGNhcC5kc3cKQEAgLTAsMCArMSwyOSBAQAorTWljcm9zb2Z0IERldmVsb3BlciBTdHVkaW8gV29ya3NwYWNlIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDYuMDAKKyMgV0FSTklORzogRE8gTk9UIEVESVQgT1IgREVMRVRFIFRISVMgV09SS1NQQUNFIEZJTEUhCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworUHJvamVjdDogImxpYnBjYXAiPSIuXGxpYnBjYXAuZHNwIiAtIFBhY2thZ2UgT3duZXI9PDQ+CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTw0Pgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitHbG9iYWw6CisKK1BhY2thZ2U9PDU+Cit7e3sKK319fQorCitQYWNrYWdlPTwzPgore3t7Cit9fX0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9mZnMuYyBiL2xpYnBjYXAtMS4zLjAvV2luMzIvU3JjL2Zmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OWZmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9mZnMuYwpAQCAtMCwwICsxLDU0IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpZmZzLmMJOC4xIChCZXJrZWxleSkgNi80LzkzIjsKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoKKyAqIGZmcyAtLSB2YXggZmZzIGluc3RydWN0aW9uCisgKi8KK2ludAorZmZzKG1hc2spCisJcmVnaXN0ZXIgaW50IG1hc2s7Cit7CisJcmVnaXN0ZXIgaW50IGJpdDsKKworCWlmIChtYXNrID09IDApCisJCXJldHVybigwKTsKKwlmb3IgKGJpdCA9IDE7ICEobWFzayAmIDEpOyBiaXQrKykKKwkJbWFzayA+Pj0gMTsKKwlyZXR1cm4oYml0KTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvV2luMzIvU3JjL2dhaV9zdHJlcnJvci5jIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2FpX3N0cmVycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRkOTcwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvV2luMzIvU3JjL2dhaV9zdHJlcnJvci5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBwcm9qZWN0IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBQUk9KRUNUIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUFJPSkVDVCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKK19fRkJTRElEKCIkRnJlZUJTRDogL3JlcG9tYW4vci9uY3ZzL3NyYy9saWIvbGliYy9uZXQvZ2FpX3N0cmVycm9yLmMsdiAxLjEgMjAwNS8wNC8wNiAxMjo0NTo1MSB1bWUgRXhwICQiKTsKKworKi8KKworI2lmZGVmIFdJTjMyCisKKyNpbmNsdWRlIDx3czJ0Y3BpcC5oPgorCisjZWxzZQorCisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2VuZGlmCisKKy8qIEVudHJpZXMgRUFJX0FERFJGQU1JTFkgKDEpIGFuZCBFQUlfTk9EQVRBICg3KSBhcmUgb2Jzb2xldGVkLCBidXQgbGVmdCAqLworLyogZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB1c2VybGFuZCBjb2RlIHByaW9yIHRvIDI1NTNiaXMtMDIgKi8KK3N0YXRpYyBjaGFyICphaV9lcnJsaXN0W10gPSB7CisJIlN1Y2Nlc3MiLAkJCQkJLyogMCAqLworCSJBZGRyZXNzIGZhbWlseSBmb3IgaG9zdG5hbWUgbm90IHN1cHBvcnRlZCIsCS8qIDEgKi8KKwkiVGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uIiwJCS8qIEVBSV9BR0FJTiAqLworCSJJbnZhbGlkIHZhbHVlIGZvciBhaV9mbGFncyIsCQkJLyogRUFJX0JBREZMQUdTICovCisJIk5vbi1yZWNvdmVyYWJsZSBmYWlsdXJlIGluIG5hbWUgcmVzb2x1dGlvbiIsCS8qIEVBSV9GQUlMICovCisJImFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkIiwJCQkvKiBFQUlfRkFNSUxZICovCisJIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiLCAJCQkvKiBFQUlfTUVNT1JZICovCisJIk5vIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGhvc3RuYW1lIiwJCS8qIDcgKi8KKwkiaG9zdG5hbWUgbm9yIHNlcnZuYW1lIHByb3ZpZGVkLCBvciBub3Qga25vd24iLAkvKiBFQUlfTk9OQU1FICovCisJInNlcnZuYW1lIG5vdCBzdXBwb3J0ZWQgZm9yIGFpX3NvY2t0eXBlIiwJLyogRUFJX1NFUlZJQ0UgKi8KKwkiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCIsIAkJCS8qIEVBSV9TT0NLVFlQRSAqLworCSJTeXN0ZW0gZXJyb3IgcmV0dXJuZWQgaW4gZXJybm8iLCAJCS8qIEVBSV9TWVNURU0gKi8KKwkiSW52YWxpZCB2YWx1ZSBmb3IgaGludHMiLAkJCS8qIEVBSV9CQURISU5UUyAqLworCSJSZXNvbHZlZCBwcm90b2NvbCBpcyB1bmtub3duIgkJCS8qIEVBSV9QUk9UT0NPTCAqLworfTsKKworI2lmbmRlZiBFQUlfTUFYCisjZGVmaW5lIEVBSV9NQVggKHNpemVvZihhaV9lcnJsaXN0KS9zaXplb2YoYWlfZXJybGlzdFswXSkpCisjZW5kaWYKKworLyogb24gTWluZ1csIGdhaV9zdHJlcnJvciBpcyBhdmFpbGFibGUuIAorICAgV2UgbmVlZCB0byBjb21waWxlIGdhaV9zdHJlcnJvckEgb25seSBmb3IgQ3lnd2luCisgKi8KKyNpZm5kZWYgZ2FpX3N0cmVycm9yCisKK2NoYXIgKgorV1NBQVBJIGdhaV9zdHJlcnJvckEoaW50IGVjb2RlKQoreworCWlmIChlY29kZSA+PSAwICYmIGVjb2RlIDwgRUFJX01BWCkKKwkJcmV0dXJuIGFpX2Vycmxpc3RbZWNvZGVdOworCXJldHVybiAiVW5rbm93biBlcnJvciI7Cit9CisKKyNlbmRpZiAvKiBnYWlfc3RyZXJyb3IgKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9nZXRhZGRyaW5mby5jIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2V0YWRkcmluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmZlOGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2V0YWRkcmluZm8uYwpAQCAtMCwwICsxLDExMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcsIGFuZCAxOTk4IFdJREUgUHJvamVjdC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFBST0pFQ1QgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBQUk9KRUNUIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqICIjaWZkZWYgRkFJVEgiIHBhcnQgaXMgbG9jYWwgaGFjayBmb3Igc3VwcG9ydGluZyBJUHY0LXY2IHRyYW5zbGF0b3IuCisgKgorICogSXNzdWVzIHRvIGJlIGRpc2N1c3NlZDoKKyAqIC0gVGhyZWFkIHNhZmUtbmVzcyBtdXN0IGJlIGNoZWNrZWQuCisgKiAtIFJldHVybiB2YWx1ZXMuICBUaGVyZSBhcmUgbm9uc3RhbmRhcmQgcmV0dXJuIHZhbHVlcyBkZWZpbmVkIGFuZCB1c2VkCisgKiAgIGluIHRoZSBzb3VyY2UgY29kZS4gIFRoaXMgaXMgYmVjYXVzZSBSRkMyNTUzIGlzIHNpbGVudCBhYm91dCB3aGljaCBlcnJvcgorICogICBjb2RlIG11c3QgYmUgcmV0dXJuZWQgZm9yIHdoaWNoIHNpdHVhdGlvbi4KKyAqIE5vdGU6CisgKiAtIFdlIHVzZSBnZXRpcG5vZGVieW5hbWUoKSBqdXN0IGZvciB0aHJlYWQtc2FmZW5lc3MuICBUaGVyZSdzIG5vIGludGVudAorICogICB0byBsZXQgaXQgZG8gUEZfVU5TUEVDIChhY3R1YWxseSB3ZSBuZXZlciBwYXNzIFBGX1VOU1BFQyB0bworICogICBnZXRpcG5vZGVieW5hbWUoKS4KKyAqIC0gVGhlIGNvZGUgZmlsdGVycyBvdXQgQUZzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbCwKKyAqICAgd2hlbiBnbG9iYmluZyBOVUxMIGhvc3RuYW1lICh0byBsb29wYmFjaywgb3Igd2lsZGNhcmQpLiAgSXMgaXQgdGhlIHJpZ2h0CisgKiAgIHRoaW5nIHRvIGRvPyAgV2hhdCBpcyB0aGUgcmVsYXRpb25zaGlwIHdpdGggcG9zdC1SRkMyNTUzIEFJX0FERFJDT05GSUcKKyAqICAgaW4gYWlfZmxhZ3M/CisgKi8KKworLyoKKyAqIE1pbmd3NjQgaGFzIGl0cyBvd24gaW1wbGVtZW50YXRpb24gb2YgZ2V0YWRkcmluZm8sIG1pbmd3MzIgbm8KKyAqLworI2lmbmRlZiBfX01JTkdXNjRfXworIAorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmIAorCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvV2luMzIvU3JjL2dldGFkZHJpbmZvLmMsdiAxLjMgMjAwOC0wOS0xNSAyMzozNzo1MSBndXkgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2lmIDAKKyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjZW5kaWYKKyNpZm5kZWYgX19NSU5HVzMyX18KKyNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaWZuZGVmIEhBVkVfUE9SVEFCTEVfUFJPVE9UWVBFCisjaW5jbHVkZSAiY2RlY2xfZXh0LmgiCisjZW5kaWYgCisKKyNpZm5kZWYgSEFWRV9VX0lOVDMyX1QKKyNpbmNsdWRlICJiaXR0eXBlcy5oIgorI2VuZGlmIAorCisjaWZuZGVmIEhBVkVfU09DS0FERFJfU1RPUkFHRQorI2lmbmRlZiBfX01JTkdXMzJfXworI2luY2x1ZGUgInNvY2tzdG9yYWdlLmgiCisjZW5kaWYKKyNlbmRpZiAKKworI2lmZGVmIE5FRURfQUREUklORk9fSAorI2luY2x1ZGUgImFkZHJpbmZvLmgiCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlICJpcDZfbWlzYy5oIgorI2VuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfX0tBTUVfXykgJiYgZGVmaW5lZChJTkVUNikKKyMgZGVmaW5lIEZBSVRICisjZW5kaWYKKworI2RlZmluZSBTVUNDRVNTIDAKKyNkZWZpbmUgQU5ZIDAKKyNkZWZpbmUgWUVTIDEKKyNkZWZpbmUgTk8gIDAKKworI2lmZGVmIEZBSVRICitzdGF0aWMgaW50IHRyYW5zbGF0ZSA9IE5POworc3RhdGljIHN0cnVjdCBpbjZfYWRkciBmYWl0aF9wcmVmaXggPSBJTjZBRERSX0FOWV9JTklUOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyIGluX2FkZHJhbnlbXSA9IHsgMCwgMCwgMCwgMCB9Oworc3RhdGljIGNvbnN0IGNoYXIgaW42X2FkZHJhbnlbXSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9Oworc3RhdGljIGNvbnN0IGNoYXIgaW5fbG9vcGJhY2tbXSA9IHsgMTI3LCAwLCAwLCAxIH07IAorc3RhdGljIGNvbnN0IGNoYXIgaW42X2xvb3BiYWNrW10gPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMQorfTsKKworc3RydWN0IHNvY2tpbmV0IHsKKwl1X2NoYXIJc2lfbGVuOworCXVfY2hhcglzaV9mYW1pbHk7CisJdV9zaG9ydAlzaV9wb3J0OworCXVfaW50MzJfdCBzaV9zY29wZV9pZDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZkIHsKKwlpbnQgYV9hZjsKKwlpbnQgYV9hZGRybGVuOworCWludCBhX3NvY2tsZW47CisJaW50IGFfb2ZmOworCWNvbnN0IGNoYXIgKmFfYWRkcmFueTsKKwljb25zdCBjaGFyICphX2xvb3BiYWNrOwkKKwlpbnQgYV9zY29wZWQ7Cit9IGFmZGwgW10gPSB7CisjaWZkZWYgSU5FVDYKKwl7UEZfSU5FVDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAorCSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNiksCisJIG9mZnNldG9mKHN0cnVjdCBzb2NrYWRkcl9pbjYsIHNpbjZfYWRkciksCisJIGluNl9hZGRyYW55LCBpbjZfbG9vcGJhY2ssIDF9LAorI2VuZGlmCisJe1BGX0lORVQsIHNpemVvZihzdHJ1Y3QgaW5fYWRkciksCisJIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pLAorCSBvZmZzZXRvZihzdHJ1Y3Qgc29ja2FkZHJfaW4sIHNpbl9hZGRyKSwKKwkgaW5fYWRkcmFueSwgaW5fbG9vcGJhY2ssIDB9LAorCXswLCAwLCAwLCAwLCBOVUxMLCBOVUxMLCAwfSwKK307CisKK3N0cnVjdCBleHBsb3JlIHsKKwlpbnQgZV9hZjsKKwlpbnQgZV9zb2NrdHlwZTsKKwlpbnQgZV9wcm90b2NvbDsKKwljb25zdCBjaGFyICplX3Byb3Rvc3RyOworCWludCBlX3dpbGQ7CisjZGVmaW5lIFdJTERfQUYoZXgpCQkoKGV4KS0+ZV93aWxkICYgMHgwMSkKKyNkZWZpbmUgV0lMRF9TT0NLVFlQRShleCkJKChleCktPmVfd2lsZCAmIDB4MDIpCisjZGVmaW5lIFdJTERfUFJPVE9DT0woZXgpCSgoZXgpLT5lX3dpbGQgJiAweDA0KQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBleHBsb3JlIGV4cGxvcmVbXSA9IHsKKyNpZiAwCisJeyBQRl9MT0NBTCwgMCwgQU5ZLCBBTlksIE5VTEwsIDB4MDEgfSwKKyNlbmRpZgorI2lmZGVmIElORVQ2CisJeyBQRl9JTkVUNiwgU09DS19ER1JBTSwgSVBQUk9UT19VRFAsICJ1ZHAiLCAweDA3IH0sCisJeyBQRl9JTkVUNiwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCAidGNwIiwgMHgwNyB9LAorCXsgUEZfSU5FVDYsIFNPQ0tfUkFXLCBBTlksIE5VTEwsIDB4MDUgfSwKKyNlbmRpZgorCXsgUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFAsICJ1ZHAiLCAweDA3IH0sCisJeyBQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1AsICJ0Y3AiLCAweDA3IH0sCisJeyBQRl9JTkVULCBTT0NLX1JBVywgQU5ZLCBOVUxMLCAweDA1IH0sCisJeyAtMSwgMCwgMCwgTlVMTCwgMCB9LAorfTsKKworI2lmZGVmIElORVQ2CisjZGVmaW5lIFBUT05fTUFYCTE2CisjZWxzZQorI2RlZmluZSBQVE9OX01BWAk0CisjZW5kaWYKKworCitzdGF0aWMgaW50IHN0cl9pc251bWJlciBfX1AoKGNvbnN0IGNoYXIgKikpOworc3RhdGljIGludCBleHBsb3JlX2ZxZG4gX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqLAorCWNvbnN0IGNoYXIgKiwgc3RydWN0IGFkZHJpbmZvICoqKSk7CitzdGF0aWMgaW50IGV4cGxvcmVfbnVsbCBfX1AoKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICosCisJY29uc3QgY2hhciAqLCBzdHJ1Y3QgYWRkcmluZm8gKiopKTsKK3N0YXRpYyBpbnQgZXhwbG9yZV9udW1lcmljIF9fUCgoY29uc3Qgc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwKKwljb25zdCBjaGFyICosIHN0cnVjdCBhZGRyaW5mbyAqKikpOworc3RhdGljIGludCBleHBsb3JlX251bWVyaWNfc2NvcGUgX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqLAorCWNvbnN0IGNoYXIgKiwgc3RydWN0IGFkZHJpbmZvICoqKSk7CitzdGF0aWMgaW50IGdldF9uYW1lIF9fUCgoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3QgYWZkICosIHN0cnVjdCBhZGRyaW5mbyAqKiwKKwljaGFyICosIGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBpbnQgZ2V0X2Nhbm9ubmFtZSBfX1AoKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLAorCXN0cnVjdCBhZGRyaW5mbyAqLCBjb25zdCBjaGFyICopKTsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmluZm8gKmdldF9haSBfX1AoKGNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqLAorCWNvbnN0IHN0cnVjdCBhZmQgKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgaW50IGdldF9wb3J0bWF0Y2ggX19QKChjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKiwgY29uc3QgY2hhciAqKSk7CitzdGF0aWMgaW50IGdldF9wb3J0IF9fUCgoc3RydWN0IGFkZHJpbmZvICosIGNvbnN0IGNoYXIgKiwgaW50KSk7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFmZCAqZmluZF9hZmQgX19QKChpbnQpKTsKKworc3RhdGljIGNoYXIgKmFpX2Vycmxpc3RbXSA9IHsKKwkiU3VjY2VzcyIsCisJIkFkZHJlc3MgZmFtaWx5IGZvciBob3N0bmFtZSBub3Qgc3VwcG9ydGVkIiwJLyogRUFJX0FERFJGQU1JTFkgKi8KKwkiVGVtcG9yYXJ5IGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uIiwJCS8qIEVBSV9BR0FJTiAgICAgICovCisJIkludmFsaWQgdmFsdWUgZm9yIGFpX2ZsYWdzIiwJCSAgICAgICAJLyogRUFJX0JBREZMQUdTICAgKi8KKwkiTm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXNvbHV0aW9uIiwgCS8qIEVBSV9GQUlMICAgICAgICovCisJImFpX2ZhbWlseSBub3Qgc3VwcG9ydGVkIiwJCQkvKiBFQUlfRkFNSUxZICAgICAqLworCSJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIiwgCQkJLyogRUFJX01FTU9SWSAgICAgKi8KKwkiTm8gYWRkcmVzcyBhc3NvY2lhdGVkIHdpdGggaG9zdG5hbWUiLCAJCS8qIEVBSV9OT0RBVEEgICAgICovCisJImhvc3RuYW1lIG5vciBzZXJ2bmFtZSBwcm92aWRlZCwgb3Igbm90IGtub3duIiwJLyogRUFJX05PTkFNRSAgICAgKi8KKwkic2Vydm5hbWUgbm90IHN1cHBvcnRlZCBmb3IgYWlfc29ja3R5cGUiLAkvKiBFQUlfU0VSVklDRSAgICAqLworCSJhaV9zb2NrdHlwZSBub3Qgc3VwcG9ydGVkIiwgCQkJLyogRUFJX1NPQ0tUWVBFICAgKi8KKwkiU3lzdGVtIGVycm9yIHJldHVybmVkIGluIGVycm5vIiwgCQkvKiBFQUlfU1lTVEVNICAgICAqLworCSJJbnZhbGlkIHZhbHVlIGZvciBoaW50cyIsCQkJLyogRUFJX0JBREhJTlRTCSAgKi8KKwkiUmVzb2x2ZWQgcHJvdG9jb2wgaXMgdW5rbm93biIsCQkJLyogRUFJX1BST1RPQ09MICAgKi8KKwkiVW5rbm93biBlcnJvciIsIAkJCQkvKiBFQUlfTUFYICAgICAgICAqLworfTsKKworLyogWFhYIG1hY3JvcyB0aGF0IG1ha2UgZXh0ZXJuYWwgcmVmZXJlbmNlIGlzIEJBRC4gKi8KKworI2RlZmluZSBHRVRfQUkoYWksIGFmZCwgYWRkcikgXAorZG8geyBcCisJLyogZXh0ZXJuYWwgcmVmZXJlbmNlOiBwYWksIGVycm9yLCBhbmQgbGFiZWwgZnJlZSAqLyBcCisJKGFpKSA9IGdldF9haShwYWksIChhZmQpLCAoYWRkcikpOyBcCisJaWYgKChhaSkgPT0gTlVMTCkgeyBcCisJCWVycm9yID0gRUFJX01FTU9SWTsgXAorCQlnb3RvIGZyZWU7IFwKKwl9IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUX1BPUlQoYWksIHNlcnYpIFwKK2RvIHsgXAorCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogZXJyb3IgYW5kIGxhYmVsIGZyZWUgKi8gXAorCWVycm9yID0gZ2V0X3BvcnQoKGFpKSwgKHNlcnYpLCAwKTsgXAorCWlmIChlcnJvciAhPSAwKSBcCisJCWdvdG8gZnJlZTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRVRfQ0FOT05OQU1FKGFpLCBzdHIpIFwKK2RvIHsgXAorCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogcGFpLCBlcnJvciBhbmQgbGFiZWwgZnJlZSAqLyBcCisJZXJyb3IgPSBnZXRfY2Fub25uYW1lKHBhaSwgKGFpKSwgKHN0cikpOyBcCisJaWYgKGVycm9yICE9IDApIFwKKwkJZ290byBmcmVlOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEVSUihlcnIpIFwKK2RvIHsgXAorCS8qIGV4dGVybmFsIHJlZmVyZW5jZTogZXJyb3IsIGFuZCBsYWJlbCBiYWQgKi8gXAorCWVycm9yID0gKGVycik7IFwKKwlnb3RvIGJhZDsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQVRDSF9GQU1JTFkoeCwgeSwgdykgXAorCSgoeCkgPT0gKHkpIHx8ICgodykgJiYgKCh4KSA9PSBQRl9VTlNQRUMgfHwgKHkpID09IFBGX1VOU1BFQykpKQorI2RlZmluZSBNQVRDSCh4LCB5LCB3KSBcCisJKCh4KSA9PSAoeSkgfHwgKCh3KSAmJiAoKHgpID09IEFOWSB8fCAoeSkgPT0gQU5ZKSkpCisKKyNpZiAgZGVmaW5lZChERUZJTkVfQURESVRJT05BTF9JUFY2X1NUVUZGKQorY2hhciAqCitnYWlfc3RyZXJyb3IoZWNvZGUpCisJaW50IGVjb2RlOworeworCWlmIChlY29kZSA8IDAgfHwgZWNvZGUgPiBFQUlfTUFYKQorCQllY29kZSA9IEVBSV9NQVg7CisJcmV0dXJuIGFpX2Vycmxpc3RbZWNvZGVdOworfQorI2VuZGlmCisKK3ZvaWQKK2ZyZWVhZGRyaW5mbyhhaSkKKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOworeworCXN0cnVjdCBhZGRyaW5mbyAqbmV4dDsKKworCWRvIHsKKwkJbmV4dCA9IGFpLT5haV9uZXh0OworCQlpZiAoYWktPmFpX2Nhbm9ubmFtZSkKKwkJCWZyZWUoYWktPmFpX2Nhbm9ubmFtZSk7CisJCS8qIG5vIG5lZWQgdG8gZnJlZShhaS0+YWlfYWRkcikgKi8KKwkJZnJlZShhaSk7CisJfSB3aGlsZSAoKGFpID0gbmV4dCkgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQKK3N0cl9pc251bWJlcihwKQorCWNvbnN0IGNoYXIgKnA7Cit7CisJY2hhciAqcSA9IChjaGFyICopcDsKKwl3aGlsZSAoKnEpIHsKKwkJaWYgKCEgaXNkaWdpdCgqcSkpCisJCQlyZXR1cm4gTk87CisJCXErKzsKKwl9CisJcmV0dXJuIFlFUzsKK30KKworaW50CitnZXRhZGRyaW5mbyhob3N0bmFtZSwgc2Vydm5hbWUsIGhpbnRzLCByZXMpCisJY29uc3QgY2hhciAqaG9zdG5hbWUsICpzZXJ2bmFtZTsKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzOworCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7CisJc3RydWN0IGFkZHJpbmZvICpjdXI7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgYWRkcmluZm8gYWk7CisJc3RydWN0IGFkZHJpbmZvIGFpMDsKKwlzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJY29uc3Qgc3RydWN0IGV4cGxvcmUgKmV4OworCisjaWZkZWYgRkFJVEgKKwlzdGF0aWMgaW50IGZpcnN0dGltZSA9IDE7CisKKwlpZiAoZmlyc3R0aW1lKSB7CisJCS8qIHRyYW5zbGF0b3IgaGFjayAqLworCQljaGFyICpxID0gZ2V0ZW52KCJHQUkiKTsKKwkJaWYgKHEgJiYgaW5ldF9wdG9uKEFGX0lORVQ2LCBxLCAmZmFpdGhfcHJlZml4KSA9PSAxKQorCQkJdHJhbnNsYXRlID0gWUVTOworCQlmaXJzdHRpbWUgPSAwOworCX0KKyNlbmRpZgorCisJc2VudGluZWwuYWlfbmV4dCA9IE5VTEw7CisJY3VyID0gJnNlbnRpbmVsOworCXBhaSA9ICZhaTsKKwlwYWktPmFpX2ZsYWdzID0gMDsKKwlwYWktPmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKwlwYWktPmFpX3NvY2t0eXBlID0gQU5ZOworCXBhaS0+YWlfcHJvdG9jb2wgPSBBTlk7CisJcGFpLT5haV9hZGRybGVuID0gMDsKKwlwYWktPmFpX2Nhbm9ubmFtZSA9IE5VTEw7CisJcGFpLT5haV9hZGRyID0gTlVMTDsKKwlwYWktPmFpX25leHQgPSBOVUxMOworCQorCWlmIChob3N0bmFtZSA9PSBOVUxMICYmIHNlcnZuYW1lID09IE5VTEwpCisJCXJldHVybiBFQUlfTk9OQU1FOworCWlmIChoaW50cykgeworCQkvKiBlcnJvciBjaGVjayBmb3IgaGludHMgKi8KKwkJaWYgKGhpbnRzLT5haV9hZGRybGVuIHx8IGhpbnRzLT5haV9jYW5vbm5hbWUgfHwKKwkJICAgIGhpbnRzLT5haV9hZGRyIHx8IGhpbnRzLT5haV9uZXh0KQorCQkJRVJSKEVBSV9CQURISU5UUyk7IC8qIHh4eCAqLworCQlpZiAoaGludHMtPmFpX2ZsYWdzICYgfkFJX01BU0spCisJCQlFUlIoRUFJX0JBREZMQUdTKTsKKwkJc3dpdGNoIChoaW50cy0+YWlfZmFtaWx5KSB7CisJCWNhc2UgUEZfVU5TUEVDOgorCQljYXNlIFBGX0lORVQ6CisjaWZkZWYgSU5FVDYKKwkJY2FzZSBQRl9JTkVUNjoKKyNlbmRpZgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlFUlIoRUFJX0ZBTUlMWSk7CisJCX0KKwkJbWVtY3B5KHBhaSwgaGludHMsIHNpemVvZigqcGFpKSk7CisKKwkJLyoKKwkJICogaWYgYm90aCBzb2NrdHlwZS9wcm90b2NvbCBhcmUgc3BlY2lmaWVkLCBjaGVjayBpZiB0aGV5CisJCSAqIGFyZSBtZWFuaW5nZnVsIGNvbWJpbmF0aW9uLgorCQkgKi8KKwkJaWYgKHBhaS0+YWlfc29ja3R5cGUgIT0gQU5ZICYmIHBhaS0+YWlfcHJvdG9jb2wgIT0gQU5ZKSB7CisJCQlmb3IgKGV4ID0gZXhwbG9yZTsgZXgtPmVfYWYgPj0gMDsgZXgrKykgeworCQkJCWlmIChwYWktPmFpX2ZhbWlseSAhPSBleC0+ZV9hZikKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGV4LT5lX3NvY2t0eXBlID09IEFOWSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGV4LT5lX3Byb3RvY29sID09IEFOWSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gZXgtPmVfc29ja3R5cGUKKwkJCQkgJiYgcGFpLT5haV9wcm90b2NvbCAhPSBleC0+ZV9wcm90b2NvbCkgeworCQkJCQlFUlIoRUFJX0JBREhJTlRTKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIGNoZWNrIGZvciBzcGVjaWFsIGNhc2VzLiAgKDEpIG51bWVyaWMgc2Vydm5hbWUgaXMgZGlzYWxsb3dlZCBpZgorCSAqIHNvY2t0eXBlL3Byb3RvY29sIGFyZSBsZWZ0IHVuc3BlY2lmaWVkLiAoMikgc2Vydm5hbWUgaXMgZGlzYWxsb3dlZAorCSAqIGZvciByYXcgYW5kIG90aGVyIGluZXR7LDZ9IHNvY2tldHMuCisJICovCisJaWYgKE1BVENIX0ZBTUlMWShwYWktPmFpX2ZhbWlseSwgUEZfSU5FVCwgMSkKKyNpZmRlZiBQRl9JTkVUNgorCSB8fCBNQVRDSF9GQU1JTFkocGFpLT5haV9mYW1pbHksIFBGX0lORVQ2LCAxKQorI2VuZGlmCisJICAgICkgeworCQlhaTAgPSAqcGFpOworCisJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMpIHsKKyNpZmRlZiBQRl9JTkVUNgorCQkJcGFpLT5haV9mYW1pbHkgPSBQRl9JTkVUNjsKKyNlbHNlCisJCQlwYWktPmFpX2ZhbWlseSA9IFBGX0lORVQ7CisjZW5kaWYKKwkJfQorCQllcnJvciA9IGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSk7CisJCWlmIChlcnJvcikKKwkJCUVSUihlcnJvcik7CisKKwkJKnBhaSA9IGFpMDsKKwl9CisKKwlhaTAgPSAqcGFpOworCisJLyogTlVMTCBob3N0bmFtZSwgb3IgbnVtZXJpYyBob3N0bmFtZSAqLworCWZvciAoZXggPSBleHBsb3JlOyBleC0+ZV9hZiA+PSAwOyBleCsrKSB7CisJCSpwYWkgPSBhaTA7CisKKwkJaWYgKCFNQVRDSF9GQU1JTFkocGFpLT5haV9mYW1pbHksIGV4LT5lX2FmLCBXSUxEX0FGKGV4KSkpCisJCQljb250aW51ZTsKKwkJaWYgKCFNQVRDSChwYWktPmFpX3NvY2t0eXBlLCBleC0+ZV9zb2NrdHlwZSwgV0lMRF9TT0NLVFlQRShleCkpKQorCQkJY29udGludWU7CisJCWlmICghTUFUQ0gocGFpLT5haV9wcm90b2NvbCwgZXgtPmVfcHJvdG9jb2wsIFdJTERfUFJPVE9DT0woZXgpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMpCisJCQlwYWktPmFpX2ZhbWlseSA9IGV4LT5lX2FmOworCQlpZiAocGFpLT5haV9zb2NrdHlwZSA9PSBBTlkgJiYgZXgtPmVfc29ja3R5cGUgIT0gQU5ZKQorCQkJcGFpLT5haV9zb2NrdHlwZSA9IGV4LT5lX3NvY2t0eXBlOworCQlpZiAocGFpLT5haV9wcm90b2NvbCA9PSBBTlkgJiYgZXgtPmVfcHJvdG9jb2wgIT0gQU5ZKQorCQkJcGFpLT5haV9wcm90b2NvbCA9IGV4LT5lX3Byb3RvY29sOworCisJCWlmIChob3N0bmFtZSA9PSBOVUxMKQorCQkJZXJyb3IgPSBleHBsb3JlX251bGwocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsICZjdXItPmFpX25leHQpOworCQllbHNlCisJCQllcnJvciA9IGV4cGxvcmVfbnVtZXJpY19zY29wZShwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgJmN1ci0+YWlfbmV4dCk7CisKKwkJaWYgKGVycm9yKQorCQkJZ290byBmcmVlOworCisJCXdoaWxlIChjdXIgJiYgY3VyLT5haV9uZXh0KQorCQkJY3VyID0gY3VyLT5haV9uZXh0OworCX0KKworCS8qCisJICogWFhYCisJICogSWYgbnVtcmVpYyByZXByZXNlbnRhdGlvbiBvZiBBRjEgY2FuIGJlIGludGVycHJldGVkIGFzIEZRRE4KKwkgKiByZXByZXNlbnRhdGlvbiBvZiBBRjIsIHdlIG5lZWQgdG8gdGhpbmsgYWdhaW4gYWJvdXQgdGhlIGNvZGUgYmVsb3cuCisJICovCisJaWYgKHNlbnRpbmVsLmFpX25leHQpCisJCWdvdG8gZ29vZDsKKworCWlmIChwYWktPmFpX2ZsYWdzICYgQUlfTlVNRVJJQ0hPU1QpCisJCUVSUihFQUlfTk9OQU1FKTsKKwlpZiAoaG9zdG5hbWUgPT0gTlVMTCkKKwkJRVJSKEVBSV9OT05BTUUpOworCisJLyoKKwkgKiBob3N0bmFtZSBhcyBhbHBoYWJldGljYWwgbmFtZS4KKwkgKiB3ZSB3b3VsZCBsaWtlIHRvIHByZWZlciBBRl9JTkVUNiB0aGFuIEFGX0lORVQsIHNvIHdlJ2xsIG1ha2UgYQorCSAqIG91dGVyIGxvb3AgYnkgQUZzLgorCSAqLworCWZvciAoYWZkID0gYWZkbDsgYWZkLT5hX2FmOyBhZmQrKykgeworCQkqcGFpID0gYWkwOworCisJCWlmICghTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBhZmQtPmFfYWYsIDEpKQorCQkJY29udGludWU7CisKKwkJZm9yIChleCA9IGV4cGxvcmU7IGV4LT5lX2FmID49IDA7IGV4KyspIHsKKwkJCSpwYWkgPSBhaTA7CisKKwkJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBQRl9VTlNQRUMpCisJCQkJcGFpLT5haV9mYW1pbHkgPSBhZmQtPmFfYWY7CisKKwkJCWlmICghTUFUQ0hfRkFNSUxZKHBhaS0+YWlfZmFtaWx5LCBleC0+ZV9hZiwgV0lMRF9BRihleCkpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCFNQVRDSChwYWktPmFpX3NvY2t0eXBlLCBleC0+ZV9zb2NrdHlwZSwKKwkJCQkJV0lMRF9TT0NLVFlQRShleCkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIU1BVENIKHBhaS0+YWlfcHJvdG9jb2wsIGV4LT5lX3Byb3RvY29sLAorCQkJCQlXSUxEX1BST1RPQ09MKGV4KSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQykKKwkJCQlwYWktPmFpX2ZhbWlseSA9IGV4LT5lX2FmOworCQkJaWYgKHBhaS0+YWlfc29ja3R5cGUgPT0gQU5ZICYmIGV4LT5lX3NvY2t0eXBlICE9IEFOWSkKKwkJCQlwYWktPmFpX3NvY2t0eXBlID0gZXgtPmVfc29ja3R5cGU7CisJCQlpZiAocGFpLT5haV9wcm90b2NvbCA9PSBBTlkgJiYgZXgtPmVfcHJvdG9jb2wgIT0gQU5ZKQorCQkJCXBhaS0+YWlfcHJvdG9jb2wgPSBleC0+ZV9wcm90b2NvbDsKKworCQkJZXJyb3IgPSBleHBsb3JlX2ZxZG4ocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsCisJCQkJJmN1ci0+YWlfbmV4dCk7CisKKwkJCXdoaWxlIChjdXIgJiYgY3VyLT5haV9uZXh0KQorCQkJCWN1ciA9IGN1ci0+YWlfbmV4dDsKKwkJfQorCX0KKworCS8qIFhYWCAqLworCWlmIChzZW50aW5lbC5haV9uZXh0KQorCQllcnJvciA9IDA7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gZnJlZTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQlpZiAoc2VudGluZWwuYWlfbmV4dCkgeworIGdvb2Q6CisJCQkqcmVzID0gc2VudGluZWwuYWlfbmV4dDsKKwkJCXJldHVybiBTVUNDRVNTOworCQl9IGVsc2UKKwkJCWVycm9yID0gRUFJX0ZBSUw7CisJfQorIGZyZWU6CisgYmFkOgorCWlmIChzZW50aW5lbC5haV9uZXh0KQorCQlmcmVlYWRkcmluZm8oc2VudGluZWwuYWlfbmV4dCk7CisJKnJlcyA9IE5VTEw7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRlFETiBob3N0bmFtZSwgRE5TIGxvb2t1cAorICovCitzdGF0aWMgaW50CitleHBsb3JlX2ZxZG4ocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcykKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKwljb25zdCBjaGFyICpob3N0bmFtZTsKKwljb25zdCBjaGFyICpzZXJ2bmFtZTsKKwlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7Cit7CisJc3RydWN0IGhvc3RlbnQgKmhwOworCWludCBoX2Vycm9yOworCWludCBhZjsKKwljaGFyICoqYXBsaXN0ID0gTlVMTCwgKmFwYnVmID0gTlVMTDsKKwljaGFyICphcDsKKwlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWwsICpjdXI7CisJaW50IGk7CisjaWZuZGVmIFVTRV9HRVRJUE5PREVCWQorCWludCBuYWRkcnM7CisjZW5kaWYKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJaW50IGVycm9yOworCisJKnJlcyA9IE5VTEw7CisJc2VudGluZWwuYWlfbmV4dCA9IE5VTEw7CisJY3VyID0gJnNlbnRpbmVsOworCisJLyoKKwkgKiBEbyBub3QgZmlsdGVyIHVuc3VwcG9ydGVkIEFGcyBoZXJlLiAgV2UgbmVlZCB0byBob25vciBjb250ZW50IG9mCisJICogZGF0YWJhc2VzICgvZXRjL2hvc3RzLCBETlMgYW5kIG90aGVycykuICBPdGhlcndpc2Ugd2UgY2Fubm90CisJICogcmVwbGFjZSBnZXRob3N0YnluYW1lKCkgYnkgZ2V0YWRkcmluZm8oKS4KKwkgKi8KKworCS8qCisJICogaWYgdGhlIHNlcnZuYW1lIGRvZXMgbm90IG1hdGNoIHNvY2t0eXBlL3Byb3RvY29sLCBpZ25vcmUgaXQuCisJICovCisJaWYgKGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlhZmQgPSBmaW5kX2FmZChwYWktPmFpX2ZhbWlseSk7CisKKwkvKgorCSAqIHBvc3QtUkZDMjU1Mzogc2hvdWxkIGxvb2sgYXQgKHBhaS0+YWlfZmxhZ3MgJiBBSV9BRERSQ09ORklHKQorCSAqIHJhdGhlciB0aGFuIGhhcmRjb2RpbmcgaXQuICB3ZSBtYXkgbmVlZCB0byBhZGQgQUlfQUREUkNPTkZJRworCSAqIGhhbmRsaW5nIGNvZGUgYnkgb3Vyc2VsdmVzIGluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBnZXRpcG5vZGVieW5hbWUoKS4KKwkgKi8KKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwlocCA9IGdldGlwbm9kZWJ5bmFtZShob3N0bmFtZSwgcGFpLT5haV9mYW1pbHksIEFJX0FERFJDT05GSUcsICZoX2Vycm9yKTsKKyNlbHNlCisjaWZkZWYgSEFWRV9HRVRIT1NUQllOQU1FMgorCWhwID0gZ2V0aG9zdGJ5bmFtZTIoaG9zdG5hbWUsIHBhaS0+YWlfZmFtaWx5KTsKKyNlbHNlCisJaWYgKHBhaS0+YWlfZmFtaWx5ICE9IEFGX0lORVQpCisJCXJldHVybiAwOworCWhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSk7CisjaWZkZWYgSEFWRV9IX0VSUk5PCisJaF9lcnJvciA9IGhfZXJybm87CisjZWxzZQorCWhfZXJyb3IgPSBFSU5WQUw7CisjZW5kaWYKKyNlbmRpZiAvKkhBVkVfR0VUSE9TVEJZTkFNRTIqLworI2VuZGlmIC8qVVNFX0dFVElQTk9ERUJZKi8KKworCWlmIChocCA9PSBOVUxMKSB7CisJCXN3aXRjaCAoaF9lcnJvcikgeworCQljYXNlIEhPU1RfTk9UX0ZPVU5EOgorCQljYXNlIE5PX0RBVEE6CisJCQllcnJvciA9IEVBSV9OT0RBVEE7CisJCQlicmVhazsKKwkJY2FzZSBUUllfQUdBSU46CisJCQllcnJvciA9IEVBSV9BR0FJTjsKKwkJCWJyZWFrOworCQljYXNlIE5PX1JFQ09WRVJZOgorCQljYXNlIE5FVERCX0lOVEVSTkFMOgorCQlkZWZhdWx0OgorCQkJZXJyb3IgPSBFQUlfRkFJTDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICgoaHAtPmhfbmFtZSA9PSBOVUxMKSB8fCAoaHAtPmhfbmFtZVswXSA9PSAwKQorCQkJfHwgKGhwLT5oX2FkZHJfbGlzdFswXSA9PSBOVUxMKSkgeworI2lmZGVmIFVTRV9HRVRJUE5PREVCWQorCQlmcmVlaG9zdGVudChocCk7CisjZW5kaWYKKwkJaHAgPSBOVUxMOworCQllcnJvciA9IEVBSV9GQUlMOworCX0KKworCWlmIChocCA9PSBOVUxMKQorCQlnb3RvIGZyZWU7CisKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwlhcGxpc3QgPSBocC0+aF9hZGRyX2xpc3Q7CisjZWxzZQorCS8qCisJICogaHAgd2lsbCBiZSBvdmVyd3JpdHRlbiBpZiB3ZSB1c2UgZ2V0aG9zdGJ5bmFtZTIoKS4KKwkgKiBhbHdheXMgZGVlcCBjb3B5IGZvciBzaW1wbGlmaWNhdGlvbi4KKwkgKi8KKwlmb3IgKG5hZGRycyA9IDA7IGhwLT5oX2FkZHJfbGlzdFtuYWRkcnNdICE9IE5VTEw7IG5hZGRycysrKQorCQk7CisJbmFkZHJzKys7CisJYXBsaXN0ID0gKGNoYXIgKiopbWFsbG9jKHNpemVvZihhcGxpc3RbMF0pICogbmFkZHJzKTsKKwlhcGJ1ZiA9IChjaGFyICopbWFsbG9jKGhwLT5oX2xlbmd0aCAqIG5hZGRycyk7CisJaWYgKGFwbGlzdCA9PSBOVUxMIHx8IGFwYnVmID09IE5VTEwpIHsKKwkJZXJyb3IgPSBFQUlfTUVNT1JZOworCQlnb3RvIGZyZWU7CisJfQorCW1lbXNldChhcGxpc3QsIDAsIHNpemVvZihhcGxpc3RbMF0pICogbmFkZHJzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmFkZHJzOyBpKyspIHsKKwkJaWYgKGhwLT5oX2FkZHJfbGlzdFtpXSA9PSBOVUxMKSB7CisJCQlhcGxpc3RbaV0gPSBOVUxMOworCQkJY29udGludWU7CisJCX0KKwkJbWVtY3B5KCZhcGJ1ZltpICogaHAtPmhfbGVuZ3RoXSwgaHAtPmhfYWRkcl9saXN0W2ldLAorCQkJaHAtPmhfbGVuZ3RoKTsKKwkJYXBsaXN0W2ldID0gJmFwYnVmW2kgKiBocC0+aF9sZW5ndGhdOworCX0KKyNlbmRpZgorCisJZm9yIChpID0gMDsgYXBsaXN0W2ldICE9IE5VTEw7IGkrKykgeworCQlhZiA9IGhwLT5oX2FkZHJ0eXBlOworCQlhcCA9IGFwbGlzdFtpXTsKKyNpZmRlZiBBRl9JTkVUNgorCQlpZiAoYWYgPT0gQUZfSU5FVDYKKwkJICYmIElONl9JU19BRERSX1Y0TUFQUEVEKChzdHJ1Y3QgaW42X2FkZHIgKilhcCkpIHsKKwkJCWFmID0gQUZfSU5FVDsKKwkJCWFwID0gYXAgKyBzaXplb2Yoc3RydWN0IGluNl9hZGRyKQorCQkJCS0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJfQorI2VuZGlmCisKKwkJaWYgKGFmICE9IHBhaS0+YWlfZmFtaWx5KQorCQkJY29udGludWU7CisKKwkJaWYgKChwYWktPmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSA9PSAwKSB7CisJCQlHRVRfQUkoY3VyLT5haV9uZXh0LCBhZmQsIGFwKTsKKwkJCUdFVF9QT1JUKGN1ci0+YWlfbmV4dCwgc2Vydm5hbWUpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGlmIEFJX0NBTk9OTkFNRSBhbmQgaWYgcmV2ZXJzZSBsb29rdXAKKwkJCSAqIGZhaWwsIHJldHVybiBhaSBhbnl3YXkgdG8gcGFjaWZ5CisJCQkgKiBjYWxsaW5nIGFwcGxpY2F0aW9uLgorCQkJICoKKwkJCSAqIFhYWCBnZXRhZGRyaW5mbygpIGlzIGEgbmFtZS0+YWRkcmVzcworCQkJICogdHJhbnNsYXRpb24gZnVuY3Rpb24sIGFuZCBpdCBsb29rcworCQkJICogc3RyYW5nZSB0aGF0IHdlIGRvIGFkZHItPm5hbWUKKwkJCSAqIHRyYW5zbGF0aW9uIGhlcmUuCisJCQkgKi8KKwkJCWdldF9uYW1lKGFwLCBhZmQsICZjdXItPmFpX25leHQsCisJCQkJYXAsIHBhaSwgc2Vydm5hbWUpOworCQl9CisKKwkJd2hpbGUgKGN1ciAmJiBjdXItPmFpX25leHQpCisJCQljdXIgPSBjdXItPmFpX25leHQ7CisJfQorCisJKnJlcyA9IHNlbnRpbmVsLmFpX25leHQ7CisJcmV0dXJuIDA7CisKK2ZyZWU6CisjaWZkZWYgVVNFX0dFVElQTk9ERUJZCisJaWYgKGhwKQorCQlmcmVlaG9zdGVudChocCk7CisjZW5kaWYKKwlpZiAoYXBsaXN0KQorCQlmcmVlKGFwbGlzdCk7CisJaWYgKGFwYnVmKQorCQlmcmVlKGFwYnVmKTsKKwlpZiAoc2VudGluZWwuYWlfbmV4dCkKKwkJZnJlZWFkZHJpbmZvKHNlbnRpbmVsLmFpX25leHQpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGhvc3RuYW1lID09IE5VTEwuCisgKiBwYXNzaXZlIHNvY2tldCAtPiBhbnlhZGRyICgwLjAuMC4wIG9yIDo6KQorICogbm9uLXBhc3NpdmUgc29ja2V0IC0+IGxvY2FsaG9zdCAoMTI3LjAuMC4xIG9yIDo6MSkKKyAqLworc3RhdGljIGludAorZXhwbG9yZV9udWxsKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpCisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisJY29uc3QgY2hhciAqc2Vydm5hbWU7CisJc3RydWN0IGFkZHJpbmZvICoqcmVzOworeworCWludCBzOworCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKKwlzdHJ1Y3QgYWRkcmluZm8gKmN1cjsKKwlzdHJ1Y3QgYWRkcmluZm8gc2VudGluZWw7CisJaW50IGVycm9yOworCisJKnJlcyA9IE5VTEw7CisJc2VudGluZWwuYWlfbmV4dCA9IE5VTEw7CisJY3VyID0gJnNlbnRpbmVsOworCisJLyoKKwkgKiBmaWx0ZXIgb3V0IEFGcyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwKKwkgKiBYWFggZXJybm8/CisJICovCisJcyA9IHNvY2tldChwYWktPmFpX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJaWYgKHMgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTUZJTEUpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJY2xvc2Uocyk7CisKKwkvKgorCSAqIGlmIHRoZSBzZXJ2bmFtZSBkb2VzIG5vdCBtYXRjaCBzb2NrdHlwZS9wcm90b2NvbCwgaWdub3JlIGl0LgorCSAqLworCWlmIChnZXRfcG9ydG1hdGNoKHBhaSwgc2Vydm5hbWUpICE9IDApCisJCXJldHVybiAwOworCisJYWZkID0gZmluZF9hZmQocGFpLT5haV9mYW1pbHkpOworCisJaWYgKHBhaS0+YWlfZmxhZ3MgJiBBSV9QQVNTSVZFKSB7CisJCUdFVF9BSShjdXItPmFpX25leHQsIGFmZCwgYWZkLT5hX2FkZHJhbnkpOworCQkvKiB4eHggbWVhbmluZ2xlc3M/CisJCSAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAiYW55YWRkciIpOworCQkgKi8KKwkJR0VUX1BPUlQoY3VyLT5haV9uZXh0LCBzZXJ2bmFtZSk7CisJfSBlbHNlIHsKKwkJR0VUX0FJKGN1ci0+YWlfbmV4dCwgYWZkLCBhZmQtPmFfbG9vcGJhY2spOworCQkvKiB4eHggbWVhbmluZ2xlc3M/CisJCSAqIEdFVF9DQU5PTk5BTUUoY3VyLT5haV9uZXh0LCAibG9jYWxob3N0Iik7CisJCSAqLworCQlHRVRfUE9SVChjdXItPmFpX25leHQsIHNlcnZuYW1lKTsKKwl9CisJY3VyID0gY3VyLT5haV9uZXh0OworCisJKnJlcyA9IHNlbnRpbmVsLmFpX25leHQ7CisJcmV0dXJuIDA7CisKK2ZyZWU6CisJaWYgKHNlbnRpbmVsLmFpX25leHQpCisJCWZyZWVhZGRyaW5mbyhzZW50aW5lbC5haV9uZXh0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBudW1lcmljIGhvc3RuYW1lCisgKi8KK3N0YXRpYyBpbnQKK2V4cGxvcmVfbnVtZXJpYyhwYWksIGhvc3RuYW1lLCBzZXJ2bmFtZSwgcmVzKQorCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqcGFpOworCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCWNvbnN0IGNoYXIgKnNlcnZuYW1lOworCXN0cnVjdCBhZGRyaW5mbyAqKnJlczsKK3sKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJc3RydWN0IGFkZHJpbmZvICpjdXI7CisJc3RydWN0IGFkZHJpbmZvIHNlbnRpbmVsOworCWludCBlcnJvcjsKKwljaGFyIHB0b25bUFRPTl9NQVhdOworCWludCBmbGFnczsKKworCSpyZXMgPSBOVUxMOworCXNlbnRpbmVsLmFpX25leHQgPSBOVUxMOworCWN1ciA9ICZzZW50aW5lbDsKKworCS8qCisJICogaWYgdGhlIHNlcnZuYW1lIGRvZXMgbm90IG1hdGNoIHNvY2t0eXBlL3Byb3RvY29sLCBpZ25vcmUgaXQuCisJICovCisJaWYgKGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlhZmQgPSBmaW5kX2FmZChwYWktPmFpX2ZhbWlseSk7CisJZmxhZ3MgPSBwYWktPmFpX2ZsYWdzOworCisJaWYgKGluZXRfcHRvbihhZmQtPmFfYWYsIGhvc3RuYW1lLCBwdG9uKSA9PSAxKSB7CisJCXVfaW50MzJfdCB2NGE7CisjaWZkZWYgSU5FVDYKKwkJdV9jaGFyIHBmeDsKKyNlbmRpZgorCisJCXN3aXRjaCAoYWZkLT5hX2FmKSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCXY0YSA9ICh1X2ludDMyX3QpbnRvaGwoKChzdHJ1Y3QgaW5fYWRkciAqKXB0b24pLT5zX2FkZHIpOworCQkJaWYgKElOX01VTFRJQ0FTVCh2NGEpIHx8IElOX0VYUEVSSU1FTlRBTCh2NGEpKQorCQkJCWZsYWdzICY9IH5BSV9DQU5PTk5BTUU7CisJCQl2NGEgPj49IElOX0NMQVNTQV9OU0hJRlQ7CisJCQlpZiAodjRhID09IDAgfHwgdjRhID09IElOX0xPT1BCQUNLTkVUKQorCQkJCWZsYWdzICY9IH5BSV9DQU5PTk5BTUU7CisJCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCQljYXNlIEFGX0lORVQ2OgorCQkJcGZ4ID0gKChzdHJ1Y3QgaW42X2FkZHIgKilwdG9uKS0+czZfYWRkclswXTsKKwkJCWlmIChwZnggPT0gMCB8fCBwZnggPT0gMHhmZSB8fCBwZnggPT0gMHhmZikKKwkJCQlmbGFncyAmPSB+QUlfQ0FOT05OQU1FOworCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCisJCWlmIChwYWktPmFpX2ZhbWlseSA9PSBhZmQtPmFfYWYgfHwKKwkJICAgIHBhaS0+YWlfZmFtaWx5ID09IFBGX1VOU1BFQyAvKj8qLykgeworCQkJaWYgKChmbGFncyAmIEFJX0NBTk9OTkFNRSkgPT0gMCkgeworCQkJCUdFVF9BSShjdXItPmFpX25leHQsIGFmZCwgcHRvbik7CisJCQkJR0VUX1BPUlQoY3VyLT5haV9uZXh0LCBzZXJ2bmFtZSk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogaWYgQUlfQ0FOT05OQU1FIGFuZCBpZiByZXZlcnNlIGxvb2t1cAorCQkJCSAqIGZhaWwsIHJldHVybiBhaSBhbnl3YXkgdG8gcGFjaWZ5CisJCQkJICogY2FsbGluZyBhcHBsaWNhdGlvbi4KKwkJCQkgKgorCQkJCSAqIFhYWCBnZXRhZGRyaW5mbygpIGlzIGEgbmFtZS0+YWRkcmVzcworCQkJCSAqIHRyYW5zbGF0aW9uIGZ1bmN0aW9uLCBhbmQgaXQgbG9va3MKKwkJCQkgKiBzdHJhbmdlIHRoYXQgd2UgZG8gYWRkci0+bmFtZQorCQkJCSAqIHRyYW5zbGF0aW9uIGhlcmUuCisJCQkJICovCisJCQkJZ2V0X25hbWUocHRvbiwgYWZkLCAmY3VyLT5haV9uZXh0LAorCQkJCQlwdG9uLCBwYWksIHNlcnZuYW1lKTsKKwkJCX0KKwkJCXdoaWxlIChjdXIgJiYgY3VyLT5haV9uZXh0KQorCQkJCWN1ciA9IGN1ci0+YWlfbmV4dDsKKwkJfSBlbHNlIAorCQkJRVJSKEVBSV9GQU1JTFkpOwkvKnh4eCovCisJfQorCisJKnJlcyA9IHNlbnRpbmVsLmFpX25leHQ7CisJcmV0dXJuIDA7CisKK2ZyZWU6CitiYWQ6CisJaWYgKHNlbnRpbmVsLmFpX25leHQpCisJCWZyZWVhZGRyaW5mbyhzZW50aW5lbC5haV9uZXh0KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBudW1lcmljIGhvc3RuYW1lIHdpdGggc2NvcGUKKyAqLworc3RhdGljIGludAorZXhwbG9yZV9udW1lcmljX3Njb3BlKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpCisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisJY29uc3QgY2hhciAqc2Vydm5hbWU7CisJc3RydWN0IGFkZHJpbmZvICoqcmVzOworeworI2lmbmRlZiBTQ09QRV9ERUxJTUlURVIKKwlyZXR1cm4gZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpOworI2Vsc2UKKwljb25zdCBzdHJ1Y3QgYWZkICphZmQ7CisJc3RydWN0IGFkZHJpbmZvICpjdXI7CisJaW50IGVycm9yOworCWNoYXIgKmNwLCAqaG9zdG5hbWUyID0gTlVMTDsKKwlpbnQgc2NvcGU7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKworCS8qCisJICogaWYgdGhlIHNlcnZuYW1lIGRvZXMgbm90IG1hdGNoIHNvY2t0eXBlL3Byb3RvY29sLCBpZ25vcmUgaXQuCisJICovCisJaWYgKGdldF9wb3J0bWF0Y2gocGFpLCBzZXJ2bmFtZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlhZmQgPSBmaW5kX2FmZChwYWktPmFpX2ZhbWlseSk7CisJaWYgKCFhZmQtPmFfc2NvcGVkKQorCQlyZXR1cm4gZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUsIHNlcnZuYW1lLCByZXMpOworCisJY3AgPSBzdHJjaHIoaG9zdG5hbWUsIFNDT1BFX0RFTElNSVRFUik7CisJaWYgKGNwID09IE5VTEwpCisJCXJldHVybiBleHBsb3JlX251bWVyaWMocGFpLCBob3N0bmFtZSwgc2Vydm5hbWUsIHJlcyk7CisKKwkvKgorCSAqIEhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgPHNjb3BlZF9hZGRyZXNzPjxkZWxpbWl0ZXI+PHNjb3BlIGlkPgorCSAqLworCWhvc3RuYW1lMiA9IHN0cmR1cChob3N0bmFtZSk7CisJaWYgKGhvc3RuYW1lMiA9PSBOVUxMKQorCQlyZXR1cm4gRUFJX01FTU9SWTsKKwkvKiB0ZXJtaW5hdGUgYXQgdGhlIGRlbGltaXRlciAqLworCWhvc3RuYW1lMltjcCAtIGhvc3RuYW1lXSA9ICdcMCc7CisKKwljcCsrOworCXN3aXRjaCAocGFpLT5haV9mYW1pbHkpIHsKKyNpZmRlZiBJTkVUNgorCWNhc2UgQUZfSU5FVDY6CisJCXNjb3BlID0gaWZfbmFtZXRvaW5kZXgoY3ApOworCQlpZiAoc2NvcGUgPT0gMCkgeworCQkJZnJlZShob3N0bmFtZTIpOworCQkJcmV0dXJuIChFQUlfTk9OQU1FKTsKKwkJfQorCQlicmVhazsKKyNlbmRpZgorCX0KKworCWVycm9yID0gZXhwbG9yZV9udW1lcmljKHBhaSwgaG9zdG5hbWUyLCBzZXJ2bmFtZSwgcmVzKTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQlmb3IgKGN1ciA9ICpyZXM7IGN1cjsgY3VyID0gY3VyLT5haV9uZXh0KSB7CisJCQlpZiAoY3VyLT5haV9mYW1pbHkgIT0gQUZfSU5FVDYpCisJCQkJY29udGludWU7CisJCQlzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKiljdXItPmFpX2FkZHI7CisJCQlpZiAoSU42X0lTX0FERFJfTElOS0xPQ0FMKCZzaW42LT5zaW42X2FkZHIpIHx8CisJCQkgICAgSU42X0lTX0FERFJfTUNfTElOS0xPQ0FMKCZzaW42LT5zaW42X2FkZHIpKQorCQkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBzY29wZTsKKwkJfQorCX0KKworCWZyZWUoaG9zdG5hbWUyKTsKKworCXJldHVybiBlcnJvcjsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50CitnZXRfbmFtZShhZGRyLCBhZmQsIHJlcywgbnVtYWRkciwgcGFpLCBzZXJ2bmFtZSkKKwljb25zdCBjaGFyICphZGRyOworCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKKwlzdHJ1Y3QgYWRkcmluZm8gKipyZXM7CisJY2hhciAqbnVtYWRkcjsKKwljb25zdCBzdHJ1Y3QgYWRkcmluZm8gKnBhaTsKKwljb25zdCBjaGFyICpzZXJ2bmFtZTsKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOworCXN0cnVjdCBhZGRyaW5mbyAqY3VyID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCWNoYXIgKmFwID0gTlVMTCwgKmNuID0gTlVMTDsKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwlpbnQgaF9lcnJvcjsKKworCWhwID0gZ2V0aXBub2RlYnlhZGRyKGFkZHIsIGFmZC0+YV9hZGRybGVuLCBhZmQtPmFfYWYsICZoX2Vycm9yKTsKKyNlbHNlCisJaHAgPSBnZXRob3N0YnlhZGRyKGFkZHIsIGFmZC0+YV9hZGRybGVuLCBhZmQtPmFfYWYpOworI2VuZGlmCisJaWYgKGhwICYmIGhwLT5oX25hbWUgJiYgaHAtPmhfbmFtZVswXSAmJiBocC0+aF9hZGRyX2xpc3RbMF0pIHsKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwkJR0VUX0FJKGN1ciwgYWZkLCBocC0+aF9hZGRyX2xpc3RbMF0pOworCQlHRVRfUE9SVChjdXIsIHNlcnZuYW1lKTsKKwkJR0VUX0NBTk9OTkFNRShjdXIsIGhwLT5oX25hbWUpOworI2Vsc2UKKwkJLyogaHAgd2lsbCBiZSBkYW1hZ2VkIGlmIHdlIHVzZSBnZXRob3N0YnlhZGRyKCkgKi8KKwkJaWYgKChhcCA9IChjaGFyICopbWFsbG9jKGhwLT5oX2xlbmd0aCkpID09IE5VTEwpIHsKKwkJCWVycm9yID0gRUFJX01FTU9SWTsKKwkJCWdvdG8gZnJlZTsKKwkJfQorCQltZW1jcHkoYXAsIGhwLT5oX2FkZHJfbGlzdFswXSwgaHAtPmhfbGVuZ3RoKTsKKwkJaWYgKChjbiA9IHN0cmR1cChocC0+aF9uYW1lKSkgPT0gTlVMTCkgeworCQkJZXJyb3IgPSBFQUlfTUVNT1JZOworCQkJZ290byBmcmVlOworCQl9CisKKwkJR0VUX0FJKGN1ciwgYWZkLCBhcCk7CisJCUdFVF9QT1JUKGN1ciwgc2Vydm5hbWUpOworCQlHRVRfQ0FOT05OQU1FKGN1ciwgY24pOworCQlmcmVlKGFwKTsgYXAgPSBOVUxMOworCQlmcmVlKGNuKTsgY24gPSBOVUxMOworI2VuZGlmCisJfSBlbHNlIHsKKwkJR0VUX0FJKGN1ciwgYWZkLCBudW1hZGRyKTsKKwkJR0VUX1BPUlQoY3VyLCBzZXJ2bmFtZSk7CisJfQorCQorI2lmZGVmIFVTRV9HRVRJUE5PREVCWQorCWlmIChocCkKKwkJZnJlZWhvc3RlbnQoaHApOworI2VuZGlmCisJKnJlcyA9IGN1cjsKKwlyZXR1cm4gU1VDQ0VTUzsKKyBmcmVlOgorCWlmIChjdXIpCisJCWZyZWVhZGRyaW5mbyhjdXIpOworCWlmIChhcCkKKwkJZnJlZShhcCk7CisJaWYgKGNuKQorCQlmcmVlKGNuKTsKKyNpZmRlZiBVU0VfR0VUSVBOT0RFQlkKKwlpZiAoaHApCisJCWZyZWVob3N0ZW50KGhwKTsKKyNlbmRpZgorCSpyZXMgPSBOVUxMOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZ2V0X2Nhbm9ubmFtZShwYWksIGFpLCBzdHIpCisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7CisJc3RydWN0IGFkZHJpbmZvICphaTsKKwljb25zdCBjaGFyICpzdHI7Cit7CisJaWYgKChwYWktPmFpX2ZsYWdzICYgQUlfQ0FOT05OQU1FKSAhPSAwKSB7CisJCWFpLT5haV9jYW5vbm5hbWUgPSBzdHJkdXAoc3RyKTsKKwkJaWYgKGFpLT5haV9jYW5vbm5hbWUgPT0gTlVMTCkKKwkJCXJldHVybiBFQUlfTUVNT1JZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyaW5mbyAqCitnZXRfYWkocGFpLCBhZmQsIGFkZHIpCisJY29uc3Qgc3RydWN0IGFkZHJpbmZvICpwYWk7CisJY29uc3Qgc3RydWN0IGFmZCAqYWZkOworCWNvbnN0IGNoYXIgKmFkZHI7Cit7CisJY2hhciAqcDsKKwlzdHJ1Y3QgYWRkcmluZm8gKmFpOworCisJYWkgPSAoc3RydWN0IGFkZHJpbmZvICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pCisJCSsgKGFmZC0+YV9zb2NrbGVuKSk7CisJaWYgKGFpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbWVtY3B5KGFpLCBwYWksIHNpemVvZihzdHJ1Y3QgYWRkcmluZm8pKTsKKwlhaS0+YWlfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikoYWkgKyAxKTsKKwltZW1zZXQoYWktPmFpX2FkZHIsIDAsIGFmZC0+YV9zb2NrbGVuKTsKKyNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgorCWFpLT5haV9hZGRyLT5zYV9sZW4gPSBhZmQtPmFfc29ja2xlbjsKKyNlbmRpZgorCWFpLT5haV9hZGRybGVuID0gYWZkLT5hX3NvY2tsZW47CisJYWktPmFpX2FkZHItPnNhX2ZhbWlseSA9IGFpLT5haV9mYW1pbHkgPSBhZmQtPmFfYWY7CisJcCA9IChjaGFyICopKGFpLT5haV9hZGRyKTsKKwltZW1jcHkocCArIGFmZC0+YV9vZmYsIGFkZHIsIGFmZC0+YV9hZGRybGVuKTsKKwlyZXR1cm4gYWk7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9wb3J0bWF0Y2goYWksIHNlcnZuYW1lKQorCWNvbnN0IHN0cnVjdCBhZGRyaW5mbyAqYWk7CisJY29uc3QgY2hhciAqc2Vydm5hbWU7Cit7CisKKwkvKiBnZXRfcG9ydCBkb2VzIG5vdCB0b3VjaCBmaXJzdCBhcmd1bWVudC4gd2hlbiBtYXRjaG9ubHkgPT0gMS4gKi8KKwlyZXR1cm4gZ2V0X3BvcnQoKHN0cnVjdCBhZGRyaW5mbyAqKWFpLCBzZXJ2bmFtZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9wb3J0KGFpLCBzZXJ2bmFtZSwgbWF0Y2hvbmx5KQorCXN0cnVjdCBhZGRyaW5mbyAqYWk7CisJY29uc3QgY2hhciAqc2Vydm5hbWU7CisJaW50IG1hdGNob25seTsKK3sKKwljb25zdCBjaGFyICpwcm90bzsKKwlzdHJ1Y3Qgc2VydmVudCAqc3A7CisJaW50IHBvcnQ7CisJaW50IGFsbG93bnVtZXJpYzsKKworCWlmIChzZXJ2bmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGFpLT5haV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisjaWZkZWYgQUZfSU5FVDYKKwljYXNlIEFGX0lORVQ2OgorI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXN3aXRjaCAoYWktPmFpX3NvY2t0eXBlKSB7CisJY2FzZSBTT0NLX1JBVzoKKwkJcmV0dXJuIEVBSV9TRVJWSUNFOworCWNhc2UgU09DS19ER1JBTToKKwljYXNlIFNPQ0tfU1RSRUFNOgorCQlhbGxvd251bWVyaWMgPSAxOworCQlicmVhazsKKwljYXNlIEFOWToKKwkJYWxsb3dudW1lcmljID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEVBSV9TT0NLVFlQRTsKKwl9CisKKwlpZiAoc3RyX2lzbnVtYmVyKHNlcnZuYW1lKSkgeworCQlpZiAoIWFsbG93bnVtZXJpYykKKwkJCXJldHVybiBFQUlfU0VSVklDRTsKKwkJcG9ydCA9IGh0b25zKGF0b2koc2Vydm5hbWUpKTsKKwkJaWYgKHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkKKwkJCXJldHVybiBFQUlfU0VSVklDRTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKGFpLT5haV9zb2NrdHlwZSkgeworCQljYXNlIFNPQ0tfREdSQU06CisJCQlwcm90byA9ICJ1ZHAiOworCQkJYnJlYWs7CisJCWNhc2UgU09DS19TVFJFQU06CisJCQlwcm90byA9ICJ0Y3AiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcm90byA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgoc3AgPSBnZXRzZXJ2YnluYW1lKHNlcnZuYW1lLCBwcm90bykpID09IE5VTEwpCisJCQlyZXR1cm4gRUFJX1NFUlZJQ0U7CisJCXBvcnQgPSBzcC0+c19wb3J0OworCX0KKworCWlmICghbWF0Y2hvbmx5KSB7CisJCXN3aXRjaCAoYWktPmFpX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFpLT5haV9hZGRyKS0+c2luX3BvcnQgPSBwb3J0OworCQkJYnJlYWs7CisjaWZkZWYgSU5FVDYKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKWFpLT5haV9hZGRyKS0+c2luNl9wb3J0ID0gcG9ydDsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZmQgKgorZmluZF9hZmQoYWYpCisJaW50IGFmOworeworCWNvbnN0IHN0cnVjdCBhZmQgKmFmZDsKKworCWlmIChhZiA9PSBQRl9VTlNQRUMpCisJCXJldHVybiBOVUxMOworCWZvciAoYWZkID0gYWZkbDsgYWZkLT5hX2FmOyBhZmQrKykgeworCQlpZiAoYWZkLT5hX2FmID09IGFmKQorCQkJcmV0dXJuIGFmZDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworI2VuZGlmIC8qX19NSU5HNjRfXyovCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9nZXRuZXRieW5tLmMgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9nZXRuZXRieW5tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0ZDM5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvV2luMzIvU3JjL2dldG5ldGJ5bm0uYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcyBhcmUgcGVybWl0dGVkCisgKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKKyAqIGR1cGxpY2F0ZWQgaW4gYWxsIHN1Y2ggZm9ybXMgYW5kIHRoYXQgYW55IGRvY3VtZW50YXRpb24sCisgKiBhZHZlcnRpc2luZyBtYXRlcmlhbHMsIGFuZCBvdGhlciBtYXRlcmlhbHMgcmVsYXRlZCB0byBzdWNoCisgKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCisgKiBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBCZXJrZWxleS4gIFRoZSBuYW1lIG9mIHRoZQorICogVW5pdmVyc2l0eSBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZiBkZWZpbmVkKExJQkNfU0NDUykgJiYgIWRlZmluZWQobGludCkKK3N0YXRpYyBjaGFyIHNjY3NpZFtdID0gIkAoIylnZXRuZXRieW5hbWUuYwk1LjUgKEJlcmtlbGV5KSA2LzI3Lzg4IjsKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpbmNsdWRlICJpbmV0cHJpdmF0ZS5oIgorCitleHRlcm4gaW50IF9uZXRfc3RheW9wZW47CisKK3N0cnVjdCBuZXRlbnQgKgorZ2V0bmV0YnluYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmVnaXN0ZXIgc3RydWN0IG5ldGVudCAqcDsKKwlyZWdpc3RlciBjaGFyICoqY3A7CisKKwlzZXRuZXRlbnQoX25ldF9zdGF5b3Blbik7CisJd2hpbGUgKHAgPSBnZXRuZXRlbnQoKSkgeworCQlpZiAoc3RyY21wKHAtPm5fbmFtZSwgbmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCQlmb3IgKGNwID0gcC0+bl9hbGlhc2VzOyAqY3AgIT0gMDsgY3ArKykKKwkJCWlmIChzdHJjbXAoKmNwLCBuYW1lKSA9PSAwKQorCQkJCWdvdG8gZm91bmQ7CisJfQorZm91bmQ6CisJaWYgKCFfbmV0X3N0YXlvcGVuKQorCQllbmRuZXRlbnQoKTsKKwlyZXR1cm4gKHApOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2V0bmV0ZW50LmMgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9nZXRuZXRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGNjZWIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2V0bmV0ZW50LmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGFyZQorICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKKyAqIGFkdmVydGlzaW5nIG1hdGVyaWFscywgYW5kIG90aGVyIG1hdGVyaWFscyByZWxhdGVkIHRvIHN1Y2gKKyAqIGRpc3RyaWJ1dGlvbiBhbmQgdXNlIGFja25vd2xlZGdlIHRoYXQgdGhlIHNvZnR3YXJlIHdhcyBkZXZlbG9wZWQKKyAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCisgKiBVbml2ZXJzaXR5IG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWdldG5ldGVudC5jCTUuNSAoQmVya2VsZXkpIDYvMjcvODgiOworI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworI2luY2x1ZGUgImluZXRwcml2YXRlLmgiCisKKyNkZWZpbmUJTUFYQUxJQVNFUwkzNQorCitzdGF0aWMgY2hhciBORVREQltdID0gX1BBVEhfTkVUV09SS1M7CitzdGF0aWMgRklMRSAqbmV0ZiA9IE5VTEw7CitzdGF0aWMgY2hhciBsaW5lW0JVRlNJWisxXTsKK3N0YXRpYyBzdHJ1Y3QgbmV0ZW50IG5ldDsKK3N0YXRpYyBjaGFyICpuZXRfYWxpYXNlc1tNQVhBTElBU0VTXTsKK3N0YXRpYyBjaGFyICphbnkoY2hhciAqLCBjaGFyICopOworCitpbnQgX25ldF9zdGF5b3BlbjsKK2V4dGVybiB1X2ludDMyX3QgaW5ldF9uZXR3b3JrKGNvbnN0IGNoYXIgKmNwKTsKKwordm9pZAorc2V0bmV0ZW50KGYpCisJaW50IGY7Cit7CisJaWYgKG5ldGYgPT0gTlVMTCkKKwkJbmV0ZiA9IGZvcGVuKE5FVERCLCAiciIgKTsKKwllbHNlCisJCXJld2luZChuZXRmKTsKKwlfbmV0X3N0YXlvcGVuIHw9IGY7Cit9CisKK3ZvaWQKK2VuZG5ldGVudCgpCit7CisJaWYgKG5ldGYpIHsKKwkJZmNsb3NlKG5ldGYpOworCQluZXRmID0gTlVMTDsKKwl9CisJX25ldF9zdGF5b3BlbiA9IDA7Cit9CisKK3N0cnVjdCBuZXRlbnQgKgorZ2V0bmV0ZW50KCkKK3sKKwljaGFyICpwOworCXJlZ2lzdGVyIGNoYXIgKmNwLCAqKnE7CisKKwlpZiAobmV0ZiA9PSBOVUxMICYmIChuZXRmID0gZm9wZW4oTkVUREIsICJyIiApKSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworYWdhaW46CisJcCA9IGZnZXRzKGxpbmUsIEJVRlNJWiwgbmV0Zik7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwlpZiAoKnAgPT0gJyMnKQorCQlnb3RvIGFnYWluOworCWNwID0gYW55KHAsICIjXG4iKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZ290byBhZ2FpbjsKKwkqY3AgPSAnXDAnOworCW5ldC5uX25hbWUgPSBwOworCWNwID0gYW55KHAsICIgXHQiKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZ290byBhZ2FpbjsKKwkqY3ArKyA9ICdcMCc7CisJd2hpbGUgKCpjcCA9PSAnICcgfHwgKmNwID09ICdcdCcpCisJCWNwKys7CisJcCA9IGFueShjcCwgIiBcdCIpOworCWlmIChwICE9IE5VTEwpCisJCSpwKysgPSAnXDAnOworCW5ldC5uX25ldCA9IGluZXRfbmV0d29yayhjcCk7CisJbmV0Lm5fYWRkcnR5cGUgPSBBRl9JTkVUOworCXEgPSBuZXQubl9hbGlhc2VzID0gbmV0X2FsaWFzZXM7CisJaWYgKHAgIT0gTlVMTCkgCisJCWNwID0gcDsKKwl3aGlsZSAoY3AgJiYgKmNwKSB7CisJCWlmICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKSB7CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHEgPCAmbmV0X2FsaWFzZXNbTUFYQUxJQVNFUyAtIDFdKQorCQkJKnErKyA9IGNwOworCQljcCA9IGFueShjcCwgIiBcdCIpOworCQlpZiAoY3AgIT0gTlVMTCkKKwkJCSpjcCsrID0gJ1wwJzsKKwl9CisJKnEgPSBOVUxMOworCXJldHVybiAoJm5ldCk7Cit9CisKK3N0YXRpYyBjaGFyICoKK2FueShjcCwgbWF0Y2gpCisJcmVnaXN0ZXIgY2hhciAqY3A7CisJY2hhciAqbWF0Y2g7Cit7CisJcmVnaXN0ZXIgY2hhciAqbXAsIGM7CisKKwl3aGlsZSAoYyA9ICpjcCkgeworCQlmb3IgKG1wID0gbWF0Y2g7ICptcDsgbXArKykKKwkJCWlmICgqbXAgPT0gYykKKwkJCQlyZXR1cm4gKGNwKTsKKwkJY3ArKzsKKwl9CisJcmV0dXJuICgoY2hhciAqKTApOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2V0b3B0LmMgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9nZXRvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2MyMDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2V0b3B0LmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWdldG9wdC5jCTguMyAoQmVya2VsZXkpIDQvMjcvOTUiOworI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK2ludAlvcHRlcnIgPSAxLAkJLyogaWYgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgcHJpbnRlZCAqLworCW9wdGluZCA9IDEsCQkvKiBpbmRleCBpbnRvIHBhcmVudCBhcmd2IHZlY3RvciAqLworCW9wdG9wdCwJCQkvKiBjaGFyYWN0ZXIgY2hlY2tlZCBmb3IgdmFsaWRpdHkgKi8KKwlvcHRyZXNldDsJCS8qIHJlc2V0IGdldG9wdCAqLworY2hhcgkqb3B0YXJnOwkJLyogYXJndW1lbnQgYXNzb2NpYXRlZCB3aXRoIG9wdGlvbiAqLworCisjZGVmaW5lCUJBRENICShpbnQpJz8nCisjZGVmaW5lCUJBREFSRwkoaW50KSc6JworI2RlZmluZQlFTVNHCSIiCisKKy8qCisgKiBnZXRvcHQgLS0KKyAqCVBhcnNlIGFyZ2MvYXJndiBhcmd1bWVudCB2ZWN0b3IuCisgKi8KK2ludAorZ2V0b3B0KG5hcmdjLCBuYXJndiwgb3N0cikKKwlpbnQgbmFyZ2M7CisJY2hhciAqIGNvbnN0ICpuYXJndjsKKwljb25zdCBjaGFyICpvc3RyOworeworI2lmZGVmIFdJTjMyCisJY2hhciAqX19wcm9nbmFtZT0id2luZHVtcCI7CisjZWxzZQorCWV4dGVybiBjaGFyICpfX3Byb2duYW1lOworI2VuZGlmCisJc3RhdGljIGNoYXIgKnBsYWNlID0gRU1TRzsJCS8qIG9wdGlvbiBsZXR0ZXIgcHJvY2Vzc2luZyAqLworCWNoYXIgKm9saTsJCQkJLyogb3B0aW9uIGxldHRlciBsaXN0IGluZGV4ICovCisKKwlpZiAob3B0cmVzZXQgfHwgISpwbGFjZSkgewkJLyogdXBkYXRlIHNjYW5uaW5nIHBvaW50ZXIgKi8KKwkJb3B0cmVzZXQgPSAwOworCQlpZiAob3B0aW5kID49IG5hcmdjIHx8ICoocGxhY2UgPSBuYXJndltvcHRpbmRdKSAhPSAnLScpIHsKKwkJCXBsYWNlID0gRU1TRzsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmIChwbGFjZVsxXSAmJiAqKytwbGFjZSA9PSAnLScpIHsJLyogZm91bmQgIi0tIiAqLworCQkJKytvcHRpbmQ7CisJCQlwbGFjZSA9IEVNU0c7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0JCQkJCS8qIG9wdGlvbiBsZXR0ZXIgb2theT8gKi8KKwlpZiAoKG9wdG9wdCA9IChpbnQpKnBsYWNlKyspID09IChpbnQpJzonIHx8CisJICAgICEob2xpID0gc3RyY2hyKG9zdHIsIG9wdG9wdCkpKSB7CisJCS8qCisJCSAqIGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5ICctJyBhcyBhbiBvcHRpb24sCisJCSAqIGFzc3VtZSBpdCBtZWFucyAtMS4KKwkJICovCisJCWlmIChvcHRvcHQgPT0gKGludCknLScpCisJCQlyZXR1cm4gKC0xKTsKKwkJaWYgKCEqcGxhY2UpCisJCQkrK29wdGluZDsKKwkJaWYgKG9wdGVyciAmJiAqb3N0ciAhPSAnOicpCisJCQkodm9pZClmcHJpbnRmKHN0ZGVyciwKKwkJCSAgICAiJXM6IGlsbGVnYWwgb3B0aW9uIC0tICVjXG4iLCBfX3Byb2duYW1lLCBvcHRvcHQpOworCQlyZXR1cm4gKEJBRENIKTsKKwl9CisJaWYgKCorK29saSAhPSAnOicpIHsJCQkvKiBkb24ndCBuZWVkIGFyZ3VtZW50ICovCisJCW9wdGFyZyA9IE5VTEw7CisJCWlmICghKnBsYWNlKQorCQkJKytvcHRpbmQ7CisJfQorCWVsc2UgewkJCQkJLyogbmVlZCBhbiBhcmd1bWVudCAqLworCQlpZiAoKnBsYWNlKQkJCS8qIG5vIHdoaXRlIHNwYWNlICovCisJCQlvcHRhcmcgPSBwbGFjZTsKKwkJZWxzZSBpZiAobmFyZ2MgPD0gKytvcHRpbmQpIHsJLyogbm8gYXJnICovCisJCQlwbGFjZSA9IEVNU0c7CisJCQlpZiAoKm9zdHIgPT0gJzonKQorCQkJCXJldHVybiAoQkFEQVJHKTsKKwkJCWlmIChvcHRlcnIpCisJCQkJKHZvaWQpZnByaW50ZihzdGRlcnIsCisJCQkJICAgICIlczogb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IC0tICVjXG4iLAorCQkJCSAgICBfX3Byb2duYW1lLCBvcHRvcHQpOworCQkJcmV0dXJuIChCQURDSCk7CisJCX0KKwkgCWVsc2UJCQkJLyogd2hpdGUgc3BhY2UgKi8KKwkJCW9wdGFyZyA9IG5hcmd2W29wdGluZF07CisJCXBsYWNlID0gRU1TRzsKKwkJKytvcHRpbmQ7CisJfQorCXJldHVybiAob3B0b3B0KTsJCQkvKiBkdW1wIGJhY2sgb3B0aW9uIGxldHRlciAqLworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2V0c2VydmVudC5jIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvZ2V0c2VydmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjhjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9nZXRzZXJ2ZW50LmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmIGRlZmluZWQoTElCQ19TQ0NTKSAmJiAhZGVmaW5lZChsaW50KQorc3RhdGljIGNoYXIgc2Njc2lkW10gPSAiQCgjKWdldHNlcnZlbnQuYwk4LjEgKEJlcmtlbGV5KSA2LzQvOTMiOworI2VuZGlmIC8qIExJQkNfU0NDUyBhbmQgbm90IGxpbnQgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZGIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXJwYS9uYW1lc2VyLmg+CisKKyNkZWZpbmUJTUFYQUxJQVNFUwkzNQorCitzdGF0aWMgY2hhciBTRVJWREJbXSA9IF9QQVRIX1NFUlZJQ0VTOworc3RhdGljIEZJTEUgKnNlcnZmID0gTlVMTDsKK3N0YXRpYyBjaGFyIGxpbmVbQlVGU0laKzFdOworc3RhdGljIHN0cnVjdCBzZXJ2ZW50IHNlcnY7CitzdGF0aWMgY2hhciAqc2Vydl9hbGlhc2VzW01BWEFMSUFTRVNdOworaW50IF9zZXJ2X3N0YXlvcGVuOworCit2b2lkCitzZXRzZXJ2ZW50KGYpCisJaW50IGY7Cit7CisJaWYgKHNlcnZmID09IE5VTEwpCisJCXNlcnZmID0gZm9wZW4oU0VSVkRCLCAiciIgKTsKKwllbHNlCisJCXJld2luZChzZXJ2Zik7CisJX3NlcnZfc3RheW9wZW4gfD0gZjsKK30KKwordm9pZAorZW5kc2VydmVudCgpCit7CisJaWYgKHNlcnZmKSB7CisJCWZjbG9zZShzZXJ2Zik7CisJCXNlcnZmID0gTlVMTDsKKwl9CisJX3NlcnZfc3RheW9wZW4gPSAwOworfQorCitzdHJ1Y3Qgc2VydmVudCAqCitnZXRzZXJ2ZW50KCkKK3sKKwljaGFyICpwOworCXJlZ2lzdGVyIGNoYXIgKmNwLCAqKnE7CisKKwlpZiAoc2VydmYgPT0gTlVMTCAmJiAoc2VydmYgPSBmb3BlbihTRVJWREIsICJyIiApKSA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworYWdhaW46CisJaWYgKChwID0gZmdldHMobGluZSwgQlVGU0laLCBzZXJ2ZikpID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisJaWYgKCpwID09ICcjJykKKwkJZ290byBhZ2FpbjsKKwljcCA9IHN0cnBicmsocCwgIiNcbiIpOworCWlmIChjcCA9PSBOVUxMKQorCQlnb3RvIGFnYWluOworCSpjcCA9ICdcMCc7CisJc2Vydi5zX25hbWUgPSBwOworCXAgPSBzdHJwYnJrKHAsICIgXHQiKTsKKwlpZiAocCA9PSBOVUxMKQorCQlnb3RvIGFnYWluOworCSpwKysgPSAnXDAnOworCXdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkJcCsrOworCWNwID0gc3RycGJyayhwLCAiLC8iKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJZ290byBhZ2FpbjsKKwkqY3ArKyA9ICdcMCc7CisJc2Vydi5zX3BvcnQgPSBodG9ucygodV9zaG9ydClhdG9pKHApKTsKKwlzZXJ2LnNfcHJvdG8gPSBjcDsKKwlxID0gc2Vydi5zX2FsaWFzZXMgPSBzZXJ2X2FsaWFzZXM7CisJY3AgPSBzdHJwYnJrKGNwLCAiIFx0Iik7CisJaWYgKGNwICE9IE5VTEwpCisJCSpjcCsrID0gJ1wwJzsKKwl3aGlsZSAoY3AgJiYgKmNwKSB7CisJCWlmICgqY3AgPT0gJyAnIHx8ICpjcCA9PSAnXHQnKSB7CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHEgPCAmc2Vydl9hbGlhc2VzW01BWEFMSUFTRVMgLSAxXSkKKwkJCSpxKysgPSBjcDsKKwkJY3AgPSBzdHJwYnJrKGNwLCAiIFx0Iik7CisJCWlmIChjcCAhPSBOVUxMKQorCQkJKmNwKysgPSAnXDAnOworCX0KKwkqcSA9IE5VTEw7CisJcmV0dXJuICgmc2Vydik7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9pbmV0X2F0b24uYyBiL2xpYnBjYXAtMS4zLjAvV2luMzIvU3JjL2luZXRfYXRvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTY2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9pbmV0X2F0b24uYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1LCAxOTk2LCAxOTk3IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgorICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIAorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIAorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAKKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBLdW5nbGlnYSBUZWtuaXNrYQorICogICAgICBI9mdza29sYW4gYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiAKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qICRJZDogaW5ldF9hdG9uLmMsdiAxLjIgMjAwMy0xMS0xNSAyMzoyNDowNiBndXkgRXhwICQgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL1dpbjMyL1NyYy9pbmV0X2F0b24uYyx2IDEuMiAyMDAzLTExLTE1IDIzOjI0OjA2IGd1eSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisKKy8qIE1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YgaW5ldF9hdG9uLgorICogQ2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gZmFpbHVyZSBhbmQgYSBsb2NhbCBicm9hZGNhc3QgYWRkcmVzcy4gKi8KKworI2lmbmRlZiBJTkFERFJfTk9ORQorI2RlZmluZSBJTkFERFJfTk9ORSAweGZmZmZmZmZmCisjZW5kaWYKKworaW50CitpbmV0X2F0b24oY29uc3QgY2hhciAqY3AsIHN0cnVjdCBpbl9hZGRyICphZGRyKQoreworICBhZGRyLT5zX2FkZHIgPSBpbmV0X2FkZHIoY3ApOworICByZXR1cm4gKGFkZHItPnNfYWRkciA9PSBJTkFERFJfTk9ORSkgPyAwIDogMTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvV2luMzIvU3JjL2luZXRfbmV0LmMgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9pbmV0X25ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYmUzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL1dpbjMyL1NyYy9pbmV0X25ldC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqCUNhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWYgZGVmaW5lZChMSUJDX1NDQ1MpICYmICFkZWZpbmVkKGxpbnQpCitzdGF0aWMgY2hhciBzY2NzaWRbXSA9ICJAKCMpaW5ldF9uZXR3b3JrLmMJOC4xIChCZXJrZWxleSkgNi80LzkzIjsKKyNlbmRpZiAvKiBMSUJDX1NDQ1MgYW5kIG5vdCBsaW50ICovCisKKyNpbmNsdWRlICJpbmV0cHJpdmF0ZS5oIgorCisvKgorICogSW50ZXJuZXQgbmV0d29yayBhZGRyZXNzIGludGVycHJldGF0aW9uIHJvdXRpbmUuCisgKiBUaGUgbGlicmFyeSByb3V0aW5lcyBjYWxsIHRoaXMgcm91dGluZSB0byBpbnRlcnByZXQKKyAqIG5ldHdvcmsgbnVtYmVycy4KKyAqLwordV9pbnQzMl90CitpbmV0X25ldHdvcmsoY29uc3QgY2hhciAqY3ApCit7CisJcmVnaXN0ZXIgdV9sb25nIHZhbCwgYmFzZSwgbjsKKwlyZWdpc3RlciBjaGFyIGM7CisJdV9sb25nIHBhcnRzWzRdLCAqcHAgPSBwYXJ0czsKKwlyZWdpc3RlciBpbnQgaTsKKworYWdhaW46CisJLyoKKwkgKiBDb2xsZWN0IG51bWJlciB1cCB0byBgYC4nJy4KKwkgKiBWYWx1ZXMgYXJlIHNwZWNpZmllZCBhcyBmb3IgQzoKKwkgKiAweD1oZXgsIDA9b2N0YWwsIG90aGVyPWRlY2ltYWwuCisJICovCisJdmFsID0gMDsgYmFzZSA9IDEwOworCS8qCisJICogVGhlIDQuNEJTRCB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBhbHNvIGFjY2VwdHMgJ3hfXycgYXMgYSBoZXhhCisJICogbnVtYmVyLiAgSSBkb24ndCB0aGluayB0aGlzIGlzIGNvcnJlY3QuICAtLSBVbGkKKwkgKi8KKwlpZiAoKmNwID09ICcwJykgeworCQlpZiAoKisrY3AgPT0gJ3gnIHx8ICpjcCA9PSAnWCcpCisJCQliYXNlID0gMTYsIGNwKys7CisJCWVsc2UKKwkJCWJhc2UgPSA4OworCX0KKwl3aGlsZSAoKGMgPSAqY3ApKSB7CisJCWlmIChpc2RpZ2l0KGMpKSB7CisJCQl2YWwgPSAodmFsICogYmFzZSkgKyAoYyAtICcwJyk7CisJCQljcCsrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGJhc2UgPT0gMTYgJiYgaXN4ZGlnaXQoYykpIHsKKwkJCXZhbCA9ICh2YWwgPDwgNCkgKyAoYyArIDEwIC0gKGlzbG93ZXIoYykgPyAnYScgOiAnQScpKTsKKwkJCWNwKys7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisJaWYgKCpjcCA9PSAnLicpIHsKKwkJaWYgKHBwID49IHBhcnRzICsgNCkKKwkJCXJldHVybiAoSU5BRERSX05PTkUpOworCQkqcHArKyA9IHZhbCwgY3ArKzsKKwkJZ290byBhZ2FpbjsKKwl9CisJaWYgKCpjcCAmJiAhaXNzcGFjZSgqY3ApKQorCQlyZXR1cm4gKElOQUREUl9OT05FKTsKKwkqcHArKyA9IHZhbDsKKwluID0gcHAgLSBwYXJ0czsKKwlpZiAobiA+IDQpCisJCXJldHVybiAoSU5BRERSX05PTkUpOworCWZvciAodmFsID0gMCwgaSA9IDA7IGkgPCAoaW50KW47IGkrKykgeworCQl2YWwgPDw9IDg7CisJCXZhbCB8PSBwYXJ0c1tpXSAmIDB4ZmY7CisJfQorCXJldHVybiAodmFsKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvV2luMzIvU3JjL2luZXRfcHRvbi5jIGIvbGlicGNhcC0xLjMuMC9XaW4zMi9TcmMvaW5ldF9wdG9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzM2E0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvV2luMzIvU3JjL2luZXRfcHRvbi5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCisgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIAorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIEt1bmdsaWdhIFRla25pc2thCisgKiAgICAgIEj2Z3Nrb2xhbiBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIAorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgSU5TVElUVVRFIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgSU5TVElUVVRFIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogJElkOiBpbmV0X3B0b24uYyx2IDEuMyAyMDA3LTA5LTI3IDE4OjAyOjIwIGdpYW5sdWNhIEV4cCAkICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9XaW4zMi9TcmMvaW5ldF9wdG9uLmMsdiAxLjMgMjAwNy0wOS0yNyAxODowMjoyMCBnaWFubHVjYSBFeHAgJCI7CisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZmRlZiBXSU4zMgorI2lmbmRlZiBFQUZOT1NVUFBPUlQKKyNkZWZpbmUJRUFGTk9TVVBQT1JUCTk3CS8qIG5vdCBwcmVzZW50IGluIGVycm5vLmggcHJvdmlkZWQgd2l0aCBWQyAqLworI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fTUlOR1czMl9fCitpbnQqIF9lcnJubygpOworI2RlZmluZSBlcnJubyAoKl9lcnJubygpKQorI2VuZGlmIC8qIF9fTUlOR1czMl9fICovCisKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorCitpbnQgaW5ldF9hdG9uKGNvbnN0IGNoYXIgKmNwLCBzdHJ1Y3QgaW5fYWRkciAqYWRkcik7CisKK2ludAoraW5ldF9wdG9uKGludCBhZiwgY29uc3QgY2hhciAqc3JjLCB2b2lkICpkc3QpCit7CisgICAgaWYgKGFmICE9IEFGX0lORVQpIHsKKwllcnJubyA9IEVBRk5PU1VQUE9SVDsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBpbmV0X2F0b24gKHNyYywgZHN0KTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvYWNsb2NhbC5tNCBiL2xpYnBjYXAtMS4zLjAvYWNsb2NhbC5tNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGRiNDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9hY2xvY2FsLm00CkBAIC0wLDAgKzEsMTAzNyBAQAorZG5sIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvYWNsb2NhbC5tNCx2IDEuOTMgMjAwOC0xMS0xOCAwNzoyOTo0OCBndXkgRXhwICQgKExCTCkKK2RubAorZG5sIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OAorZG5sCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorZG5sCitkbmwgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CitkbmwgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCitkbmwgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorZG5sIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCitkbmwgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworZG5sIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKK2RubCBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorZG5sIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorZG5sIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorZG5sIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCitkbmwgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCitkbmwgd3JpdHRlbiBwZXJtaXNzaW9uLgorZG5sIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK2RubCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorZG5sIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCitkbmwKK2RubCBMQkwgYXV0b2NvbmYgbWFjcm9zCitkbmwKKworZG5sCitkbmwgRG8gd2hhdGV2ZXIgQUNfTEJMX0NfSU5JVCB3b3JrIGlzIG5lY2Vzc2FyeSBiZWZvcmUgdXNpbmcgQUNfUFJPR19DQy4KK2RubAorZG5sIEl0IGFwcGVhcnMgdGhhdCBuZXdlciB2ZXJzaW9ucyBvZiBhdXRvY29uZiAoMi42NCBhbmQgbGF0ZXIpIHdpbGwsCitkbmwgaWYgeW91IHVzZSBBQ19UUllfQ09NUElMRSBpbiBhIG1hY3JvLCBzdGljayBBQ19QUk9HX0NDIGF0IHRoZQorZG5sIGJlZ2lubmluZyBvZiB0aGUgbWFjcm8sIGV2ZW4gaWYgdGhlIG1hY3JvIGl0c2VsZiBjYWxscyBBQ19QUk9HX0NDLgorZG5sIFNlZSB0aGUgIlByZXJlcXVpc2l0ZSBNYWNyb3MiIGFuZCAiRXhwYW5kZWQgQmVmb3JlIFJlcXVpcmVkIiBzZWN0aW9ucworZG5sIGluIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uLgorZG5sCitkbmwgVGhpcyBjYXVzZXMgYSBzdGVhbWluZyBoZWFwIG9mIGZhaWwgaW4gb3VyIGNhc2UsIGFzIHdlIHdlcmUsIGluCitkbmwgQUNfTEJMX0NfSU5JVCwgZG9pbmcgdGhlIHRlc3RzIHdlIG5vdyBkbyBpbiBBQ19MQkxfQ19JTklUX0JFRk9SRV9DQywKK2RubCBjYWxsaW5nIEFDX1BST0dfQ0MsIGFuZCB0aGVuIGRvaW5nIHRoZSB0ZXN0cyB3ZSBub3cgZG8gaW4KK2RubCBBQ19MQkxfQ19JTklULiAgTm93LCB3ZSBydW4gQUNfTEJMX0NfSU5JVF9CRUZPUkVfQ0MsIEFDX1BST0dfQ0MsCitkbmwgYW5kIEFDX0xCTF9DX0lOSVQgYXQgdGhlIHRvcCBsZXZlbC4KK2RubAorQUNfREVGVU4oQUNfTEJMX0NfSU5JVF9CRUZPUkVfQ0MsCisgICAgW0FDX1BSRVJFUSgyLjUwKQorICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfTEJMX0NfSU5JVF0pCisgICAgQUNfQkVGT1JFKFskMF0sIFtBQ19QUk9HX0NDXSkKKyAgICBBQ19CRUZPUkUoWyQwXSwgW0FDX0xCTF9GSVhJTkNMVURFU10pCisgICAgQUNfQkVGT1JFKFskMF0sIFtBQ19MQkxfREVWRUxdKQorICAgIEFDX0FSR19XSVRIKGdjYywgWyAgLS13aXRob3V0LWdjYyAgICAgICAgICAgZG9uJ3QgdXNlIGdjY10pCisgICAgJDE9Ii1PIgorICAgICQyPSIiCisgICAgaWYgdGVzdCAiJHtzcmNkaXJ9IiAhPSAiLiIgOyB0aGVuCisJICAgICQyPSItSVwkKHNyY2RpcikiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldDsgdGhlbgorCSAgICBMQkxfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIGZpCisgICAgaWYgdGVzdCAteiAiJENDIiA7IHRoZW4KKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYnNkaSopCisJCSAgICBBQ19DSEVDS19QUk9HKFNITElDQzIsIHNobGljYzIsIHllcywgbm8pCisJCSAgICBpZiB0ZXN0ICRTSExJQ0MyID0geWVzIDsgdGhlbgorCQkJICAgIENDPXNobGljYzIKKwkJCSAgICBleHBvcnQgQ0MKKwkJICAgIGZpCisJCSAgICA7OworCSAgICBlc2FjCisgICAgZmkKKyAgICBpZiB0ZXN0IC16ICIkQ0MiIC1hICIkd2l0aF9nY2MiID0gbm8gOyB0aGVuCisJICAgIENDPWNjCisJICAgIGV4cG9ydCBDQworICAgIGZpCitdKQorCitkbmwKK2RubCBEZXRlcm1pbmUgd2hpY2ggY29tcGlsZXIgd2UncmUgdXNpbmcgKGNjIG9yIGdjYykKK2RubCBJZiB1c2luZyBnY2MsIGRldGVybWluZSB0aGUgdmVyc2lvbiBudW1iZXIKK2RubCBJZiB1c2luZyBjYywgcmVxdWlyZSB0aGF0IGl0IHN1cHBvcnQgYW5zaSBwcm90b3R5cGVzCitkbmwgSWYgdXNpbmcgZ2NjLCB1c2UgLU8yIChvdGhlcndpc2UgdXNlIC1PKQorZG5sIElmIHVzaW5nIGNjLCBleHBsaWNpdGx5IHNwZWNpZnkgL3Vzci9sb2NhbC9pbmNsdWRlCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9DX0lOSVQoY29wdCwgaW5jbHMpCitkbmwKK2RubCByZXN1bHRzOgorZG5sCitkbmwJJDEgKGNvcHQgc2V0KQorZG5sCSQyIChpbmNscyBzZXQpCitkbmwJQ0MKK2RubAlMREZMQUdTCitkbmwJYWNfY3ZfbGJsX2djY192ZXJzCitkbmwJTEJMX0NGTEFHUworZG5sCitBQ19ERUZVTihBQ19MQkxfQ19JTklULAorICAgIFtBQ19QUkVSRVEoMi41MCkKKyAgICBBQ19CRUZPUkUoWyQwXSwgW0FDX0xCTF9GSVhJTkNMVURFU10pCisgICAgQUNfQkVGT1JFKFskMF0sIFtBQ19MQkxfREVWRUxdKQorICAgIEFDX0JFRk9SRShbJDBdLCBbQUNfTEJMX1NITElCU19JTklUXSkKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KKwkgICAgaWYgdGVzdCAiJFNITElDQzIiID0geWVzIDsgdGhlbgorCQkgICAgYWNfY3ZfbGJsX2djY192ZXJzPTIKKwkJICAgICQxPSItTzIiCisJICAgIGVsc2UKKwkJICAgIEFDX01TR19DSEVDS0lORyhnY2MgdmVyc2lvbikKKwkJICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfZ2NjX3ZlcnMsCisJCQlhY19jdl9sYmxfZ2NjX3ZlcnM9YCRDQyAtdiAyPiYxIHwgXAorCQkJICAgIHNlZCAtZSAnL15nY2MgdmVyc2lvbiAvIWQnIFwKKwkJCQktZSAncy9eZ2NjIHZlcnNpb24gLy8nIFwKKwkJCQktZSAncy8gLiovLycgLWUgJ3MvXltbW14wLTldXV0qLy8nIFwKKwkJCQktZSAncy9cLi4qLy8nYCkKKwkJICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9nY2NfdmVycykKKwkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9nY2NfdmVycyAtZ3QgMSA7IHRoZW4KKwkJCSAgICAkMT0iLU8yIgorCQkgICAgZmkKKwkgICAgZmkKKyAgICBlbHNlCisJICAgIEFDX01TR19DSEVDS0lORyh0aGF0ICRDQyBoYW5kbGVzIGFuc2kgcHJvdG90eXBlcykKKwkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXMsCisJCUFDX1RSWV9DT01QSUxFKAorCQkgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLAorCQkgICAgW2ludCBmcm9iKGludCwgY2hhciAqKV0sCisJCSAgICBhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzPXllcywKKwkJICAgIGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXM9bm8pKQorCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzKQorCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzID0gbm8gOyB0aGVuCisJCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KKworCQkgICAgaHB1eCopCisJCQkgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBIUC1VWCBhbnNpIGNvbXBpbGVyICgkQ0MgLUFhIC1EX0hQVVhfU09VUkNFKSkKKwkJCSAgICBzYXZlZGNmbGFncz0iJENGTEFHUyIKKwkJCSAgICBDRkxBR1M9Ii1BYSAtRF9IUFVYX1NPVVJDRSAkQ0ZMQUdTIgorCQkJICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfY2NfaHB1eF9jY19hYSwKKwkJCQlBQ19UUllfQ09NUElMRSgKKwkJCQkgICAgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD5dLAorCQkJCSAgICBbaW50IGZyb2IoaW50LCBjaGFyICopXSwKKwkJCQkgICAgYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWE9eWVzLAorCQkJCSAgICBhY19jdl9sYmxfY2NfaHB1eF9jY19hYT1ubykpCisJCQkgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWEpCisJCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWEgPSBubyA7IHRoZW4KKwkJCQkgICAgQUNfTVNHX0VSUk9SKHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbykKKwkJCSAgICBmaQorCQkJICAgIENGTEFHUz0iJHNhdmVkY2ZsYWdzIgorCQkJICAgICQxPSItQWEgJCQxIgorCQkJICAgIEFDX0RFRklORShfSFBVWF9TT1VSQ0UsMSxbbmVlZGVkIG9uIEhQLVVYXSkKKwkJCSAgICA7OworCisJCSAgICBvc2YqKQorCQkJICAgIEFDX01TR19DSEVDS0lORyhmb3IgYW5zaSBtb2RlIGluIERFQyBjb21waWxlciAoJENDIC1zdGQxKSkKKwkJCSAgICBzYXZlZGNmbGFncz0iJENGTEFHUyIKKwkJCSAgICBDRkxBR1M9Ii1zdGQxIgorCQkJICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfY2Nfb3NmMV9jY19zdGQxLAorCQkJCUFDX1RSWV9DT01QSUxFKAorCQkJCSAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPl0sCisJCQkJICAgIFtpbnQgZnJvYihpbnQsIGNoYXIgKildLAorCQkJCSAgICBhY19jdl9sYmxfY2Nfb3NmMV9jY19zdGQxPXllcywKKwkJCQkgICAgYWNfY3ZfbGJsX2NjX29zZjFfY2Nfc3RkMT1ubykpCisJCQkgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2NjX29zZjFfY2Nfc3RkMSkKKwkJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2Nfb3NmMV9jY19zdGQxID0gbm8gOyB0aGVuCisJCQkJICAgIEFDX01TR19FUlJPUihzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pCisJCQkgICAgZmkKKwkJCSAgICBDRkxBR1M9IiRzYXZlZGNmbGFncyIKKwkJCSAgICAkMT0iLXN0ZDEgJCQxIgorCQkJICAgIDs7CisKKwkJICAgICopCisJCQkgICAgQUNfTVNHX0VSUk9SKHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbykKKwkJCSAgICA7OworCQkgICAgZXNhYworCSAgICBmaQorCSAgICAkMj0iJCQyIC1JL3Vzci9sb2NhbC9pbmNsdWRlIgorCSAgICBMREZMQUdTPSIkTERGTEFHUyAtTC91c3IvbG9jYWwvbGliIgorCisJICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisJICAgIGlyaXgqKQorCQkgICAgJDE9IiQkMSAteGFuc2kgLXNpZ25lZCAtZzMiCisJCSAgICA7OworCisJICAgIG9zZiopCisJICAgIAkgICAgIworCQkgICAgIyBQcmVzdW1lZCB0byBiZSBERUMgT1NGLzEsIERpZ2l0YWwgVU5JWCwgb3IKKwkJICAgICMgVHJ1NjQgVU5JWC4KKwkJICAgICMKKwkJICAgICQxPSIkJDEgLWczIgorCQkgICAgOzsKKworCSAgICB1bHRyaXgqKQorCQkgICAgQUNfTVNHX0NIRUNLSU5HKHRoYXQgVWx0cml4ICRDQyBoYWNrcyBjb25zdCBpbiBwcm90b3R5cGVzKQorCQkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9jY19jb25zdF9wcm90bywKKwkJCUFDX1RSWV9DT01QSUxFKAorCQkJICAgIFsjaW5jbHVkZSA8c3lzL3R5cGVzLmg+XSwKKwkJCSAgICBbc3RydWN0IGEgeyBpbnQgYjsgfTsKKwkJCSAgICB2b2lkIGMoY29uc3Qgc3RydWN0IGEgKildLAorCQkJICAgIGFjX2N2X2xibF9jY19jb25zdF9wcm90bz15ZXMsCisJCQkgICAgYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvPW5vKSkKKwkJICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9jY19jb25zdF9wcm90bykKKwkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9jY19jb25zdF9wcm90byA9IG5vIDsgdGhlbgorCQkJICAgIEFDX0RFRklORShjb25zdCxbXSwKKwkJCSAgICAgICAgW3RvIGhhbmRsZSBVbHRyaXggY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBjb25zdCBpbiBwcm90b3R5cGVzXSkKKwkJICAgIGZpCisJCSAgICA7OworCSAgICBlc2FjCisgICAgZmkKK10pCisKK2RubAorZG5sIERldGVybWluZSB3aGF0IG9wdGlvbnMgYXJlIG5lZWRlZCB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5CitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9TSExJQlNfSU5JVAorZG5sCitkbmwgcmVzdWx0czoKK2RubAorZG5sCVZfQ0NPUFQgKG1vZGlmaWVkIHRvIGJ1aWxkIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUpCitkbmwJVl9TSExJQl9DTUQKK2RubAlWX1NITElCX09QVAorZG5sCVZfU09OQU1FX09QVAorZG5sCVZfUlBBVEhfT1BUCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9TSExJQlNfSU5JVCwKKyAgICBbQUNfUFJFUkVRKDIuNTApCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJICAgICMKKwkgICAgIyBPbiBwbGF0Zm9ybXMgd2hlcmUgd2UgYnVpbGQgYSBzaGFyZWQgbGlicmFyeToKKwkgICAgIworCSAgICAjCWFkZCBvcHRpb25zIHRvIGdlbmVyYXRlIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUsCisJICAgICMJaWYgbmVjZXNzYXJ5IChpdCdzIHRoZSBkZWZhdWx0IGluIEFJWCBhbmQgRGFyd2luL09TIFgpOworCSAgICAjCisJICAgICMJZGVmaW5lIG9wdGlvbiB0byBzZXQgdGhlIHNvbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnksCisJICAgICMJaWYgdGhlIE9TIHN1cHBvcnRzIHRoYXQ7CisJICAgICMKKwkgICAgIwlhZGQgb3B0aW9ucyB0byBzcGVjaWZ5LCBhdCBsaW5rIHRpbWUsIGEgZGlyZWN0b3J5IHRvCisJICAgICMJYWRkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgaWYgdGhhdCdzIG5lY2Vzc2FyeS4KKwkgICAgIworCSAgICBWX1NITElCX0NNRD0iXCQoQ0MpIgorCSAgICBWX1NITElCX09QVD0iLXNoYXJlZCIKKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYWl4KikKKwkJICAgIDs7CisKKwkgICAgZnJlZWJzZCp8bmV0YnNkKnxvcGVuYnNkKnxkcmFnb25mbHkqfGxpbnV4Knxvc2YqKQorCSAgICAJICAgICMKKwkJICAgICMgUGxhdGZvcm1zIHdoZXJlIHRoZSBsaW5rZXIgaXMgdGhlIEdOVSBsaW5rZXIKKwkJICAgICMgb3IgYWNjZXB0cyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGxpa2UKKwkJICAgICMgdGhvc2UgdGhlIEdOVSBsaW5rZXIgYWNjZXB0cy4KKwkJICAgICMKKwkJICAgICMgU29tZSBpbnN0cnVjdGlvbiBzZXRzIHJlcXVpcmUgLWZQSUMgb24gc29tZQorCQkgICAgIyBvcGVyYXRpbmcgc3lzdGVtcy4gIENoZWNrIGZvciB0aGVtLiAgSWYgeW91CisJCSAgICAjIGhhdmUgYSBjb21iaW5hdGlvbiB0aGF0IHJlcXVpcmVzIGl0LCBhZGQgaXQKKwkJICAgICMgaGVyZS4KKwkJICAgICMKKwkJICAgIFBJQ19PUFQ9LWZwaWMKKwkJICAgIGNhc2UgIiRob3N0X2NwdSIgaW4KKworCQkgICAgc3BhcmM2NCopCisJCQljYXNlICIkaG9zdF9vcyIgaW4KKworCQkJZnJlZWJzZCopCisJCQkgICAgUElDX09QVD0tZlBJQworCQkJICAgIDs7CisJCQllc2FjCisJCQk7OworCQkgICAgZXNhYworCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgJFBJQ19PUFQiCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1XbCwtc29uYW1lLCIKKwkJICAgIFZfUlBBVEhfT1BUPSItV2wsLXJwYXRoLCIKKwkJICAgIDs7CisKKwkgICAgaHB1eCopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtZnBpYyIKKwkgICAgCSAgICAjCisJCSAgICAjIFhYWCAtIHRoaXMgYXNzdW1lcyBHQ0MgaXMgdXNpbmcgdGhlIEhQIGxpbmtlciwKKwkJICAgICMgcmF0aGVyIHRoYW4gdGhlIEdOVSBsaW5rZXIsIGFuZCB0aGF0IHRoZSAiK2giCisJCSAgICAjIG9wdGlvbiBpcyB1c2VkIG9uIGFsbCBIUC1VWCBwbGF0Zm9ybXMsIGJvdGggLnNsCisJCSAgICAjIGFuZCAuc28uCisJCSAgICAjCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1XbCwraCwiCisJCSAgICAjCisJCSAgICAjIEJ5IGRlZmF1bHQsIGRpcmVjdG9yaWVzIHNwZWNpZmVkIHdpdGggLUwKKwkJICAgICMgYXJlIGFkZGVkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgc28KKwkJICAgICMgd2UgZG9uJ3QgYWRkIHRoZW0gaW4gcGNhcC1jb25maWcuCisJCSAgICAjCisJCSAgICA7OworCisJICAgIHNvbGFyaXMqKQorCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLWZwaWMiCisJCSAgICAjCisJCSAgICAjIFhYWCAtIHRoaXMgYXNzdW1lcyBHQ0MgaXMgdXNpbmcgdGhlIFN1biBsaW5rZXIsCisJCSAgICAjIHJhdGhlciB0aGFuIHRoZSBHTlUgbGlua2VyLgorCQkgICAgIworCQkgICAgVl9TT05BTUVfT1BUPSItV2wsLWgsIgorCQkgICAgVl9SUEFUSF9PUFQ9Ii1XbCwtUiwiCisJCSAgICA7OworCSAgICBlc2FjCisgICAgZWxzZQorCSAgICAjCisJICAgICMgU2V0IHRoZSBhcHByb3ByaWF0ZSBjb21waWxlciBmbGFncyBhbmQsIG9uIHBsYXRmb3JtcworCSAgICAjIHdoZXJlIHdlIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnk6CisJICAgICMKKwkgICAgIwlhZGQgb3B0aW9ucyB0byBnZW5lcmF0ZSBwb3NpdGlvbi1pbmRlcGVuZGVudCBjb2RlLAorCSAgICAjCWlmIG5lY2Vzc2FyeSAoaXQncyB0aGUgZGVmYXVsdCBpbiBEYXJ3aW4vT1MgWCk7CisJICAgICMKKwkgICAgIwlpZiB3ZSBnZW5lcmF0ZSAiLnNvIiBzaGFyZWQgbGlicmFyaWVzLCBkZWZpbmUgdGhlCisJICAgICMJYXBwcm9wcmlhdGUgb3B0aW9ucyBmb3IgYnVpbGRpbmcgdGhlIHNoYXJlZCBsaWJyYXJ5OworCSAgICAjCisJICAgICMJYWRkIG9wdGlvbnMgdG8gc3BlY2lmeSwgYXQgbGluayB0aW1lLCBhIGRpcmVjdG9yeSB0bworCSAgICAjCWFkZCB0byB0aGUgcnVuLXRpbWUgc2VhcmNoIHBhdGgsIGlmIHRoYXQncyBuZWNlc3NhcnkuCisJICAgICMKKwkgICAgIyBOb3RlOiBzcGFjZXMgYWZ0ZXIgVl9TT05BTUVfT1BUIGFyZSBzaWduaWZpY2FudDsgb24KKwkgICAgIyBzb21lIHBsYXRmb3JtcyB0aGUgc29uYW1lIGlzIHBhc3NlZCB3aXRoIGEgR0NDLWxpa2UKKwkgICAgIyAiLVdsLC1zb25hbWUse3NvbmFtZX0iIG9wdGlvbiwgd2l0aCB0aGUgc29uYW1lIHBhcnQKKwkgICAgIyBvZiB0aGUgb3B0aW9uLCB3aGlsZSBvbiBvdGhlciBwbGF0Zm9ybXMgdGhlIEMgY29tcGlsZXIKKwkgICAgIyBkcml2ZXIgdGFrZXMgaXQgYXMgYSByZWd1bGFyIG9wdGlvbiB3aXRoIHRoZSBzb25hbWUKKwkgICAgIyBmb2xsb3dpbmcgdGhlIG9wdGlvbi4gIFRoZSBzYW1lIGFwcGxpZXMgdG8gVl9SUEFUSF9PUFQuCisJICAgICMKKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYWl4KikKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLUcgLWJub2VudHJ5IC1iZXhwYWxsIgorCQkgICAgOzsKKworCSAgICBmcmVlYnNkKnxuZXRic2QqfG9wZW5ic2QqfGRyYWdvbmZseSp8bGludXgqKQorCQkgICAgIworCQkgICAgIyAiY2MiIGlzIEdDQy4KKwkJICAgICMKKwkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1mcGljIgorCQkgICAgVl9TSExJQl9DTUQ9IlwkKENDKSIKKwkJICAgIFZfU0hMSUJfT1BUPSItc2hhcmVkIgorCQkgICAgVl9TT05BTUVfT1BUPSItV2wsLXNvbmFtZSwiCisJCSAgICBWX1JQQVRIX09QVD0iLVdsLC1ycGF0aCwiCisJCSAgICA7OworCisJICAgIGhwdXgqKQorCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgK3oiCisJCSAgICBWX1NITElCX0NNRD0iXCQoTEQpIgorCQkgICAgVl9TSExJQl9PUFQ9Ii1iIgorCQkgICAgVl9TT05BTUVfT1BUPSIraCAiCisJCSAgICAjCisJCSAgICAjIEJ5IGRlZmF1bHQsIGRpcmVjdG9yaWVzIHNwZWNpZmVkIHdpdGggLUwKKwkJICAgICMgYXJlIGFkZGVkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgc28KKwkJICAgICMgd2UgZG9uJ3QgYWRkIHRoZW0gaW4gcGNhcC1jb25maWcuCisJCSAgICAjCisJCSAgICA7OworCisJICAgIG9zZiopCisJICAgIAkgICAgIworCQkgICAgIyBQcmVzdW1lZCB0byBiZSBERUMgT1NGLzEsIERpZ2l0YWwgVU5JWCwgb3IKKwkJICAgICMgVHJ1NjQgVU5JWC4KKwkJICAgICMKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLXNoYXJlZCIKKwkJICAgIFZfU09OQU1FX09QVD0iLXNvbmFtZSAiCisJCSAgICBWX1JQQVRIX09QVD0iLXJwYXRoICIKKwkJICAgIDs7CisKKwkgICAgc29sYXJpcyopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtS3BpYyIKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJCSAgICBWX1NITElCX09QVD0iLUciCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1oICIKKwkJICAgIFZfUlBBVEhfT1BUPSItUiIKKwkJICAgIDs7CisJICAgIGVzYWMKKyAgICBmaQorXSkKKworIworIyBUcnkgY29tcGlsaW5nIGEgc2FtcGxlIG9mIHRoZSB0eXBlIG9mIGNvZGUgdGhhdCBhcHBlYXJzIGluCisjIGdlbmNvZGUuYyB3aXRoICJpbmxpbmUiLCAiX19pbmxpbmVfXyIsIGFuZCAiX19pbmxpbmUiLgorIworIyBBdXRvY29uZidzIEFDX0NfSU5MSU5FLCBhdCBsZWFzdCBpbiBhdXRvY29uZiAyLjEzLCBpc24ndCBnb29kIGVub3VnaCwKKyMgYXMgaXQganVzdCB0ZXN0cyB3aGV0aGVyIGEgZnVuY3Rpb24gcmV0dXJuaW5nICJpbnQiIGNhbiBiZSBpbmxpbmVkOworIyBhdCBsZWFzdCBzb21lIHZlcnNpb25zIG9mIEhQJ3MgQyBjb21waWxlciBjYW4gaW5saW5lIHRoYXQsIGJ1dCBjYW4ndAorIyBpbmxpbmUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBzdHJ1Y3QgcG9pbnRlci4KKyMKKyMgTWFrZSBzdXJlIHdlIHVzZSB0aGUgVl9DQ09QVCBmbGFncywgYmVjYXVzZSBzb21lIG9mIHRob3NlIG1pZ2h0CisjIGRpc2FibGUgaW5saW5pbmcuCisjCitBQ19ERUZVTihBQ19MQkxfQ19JTkxJTkUsCisgICAgW0FDX01TR19DSEVDS0lORyhmb3IgaW5saW5lKQorICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIENGTEFHUz0iJFZfQ0NPUFQiCisgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9pbmxpbmUsIFsKKwlhY19jdl9sYmxfaW5saW5lPSIiCisJYWNfbGJsX2NjX2lubGluZT1ubworCWZvciBhY19sYmxfaW5saW5lIGluIGlubGluZSBfX2lubGluZV9fIF9faW5saW5lCisJZG8KKwkgICAgQUNfVFJZX0NPTVBJTEUoCisJCVsjZGVmaW5lIGlubGluZSAkYWNfbGJsX2lubGluZQorCQlzdGF0aWMgaW5saW5lIHN0cnVjdCBpbHRlc3QgKmZvbyh2b2lkKTsKKwkJc3RydWN0IGlsdGVzdCB7CisJCSAgICBpbnQgaWx0ZXN0MTsKKwkJICAgIGludCBpbHRlc3QyOworCQl9OworCisJCXN0YXRpYyBpbmxpbmUgc3RydWN0IGlsdGVzdCAqCisJCWZvbygpCisJCXsKKwkJICAgIHN0YXRpYyBzdHJ1Y3QgaWx0ZXN0IHh4eDsKKworCQkgICAgcmV0dXJuICZ4eHg7CisJCX1dLCxhY19sYmxfY2NfaW5saW5lPXllcywpCisJICAgIGlmIHRlc3QgIiRhY19sYmxfY2NfaW5saW5lIiA9IHllcyA7IHRoZW4KKwkJYnJlYWs7CisJICAgIGZpCisJZG9uZQorCWlmIHRlc3QgIiRhY19sYmxfY2NfaW5saW5lIiA9IHllcyA7IHRoZW4KKwkgICAgYWNfY3ZfbGJsX2lubGluZT0kYWNfbGJsX2lubGluZQorCWZpXSkKKyAgICBDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKyAgICBpZiB0ZXN0ICEgLXogIiRhY19jdl9sYmxfaW5saW5lIiA7IHRoZW4KKwlBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfaW5saW5lKQorICAgIGVsc2UKKwlBQ19NU0dfUkVTVUxUKG5vKQorICAgIGZpCisgICAgQUNfREVGSU5FX1VOUVVPVEVEKGlubGluZSwgJGFjX2N2X2xibF9pbmxpbmUsIFtEZWZpbmUgYXMgdG9rZW4gZm9yIGlubGluZSBpZiBpbmxpbmluZyBzdXBwb3J0ZWRdKV0pCisKK2RubAorZG5sIElmIHVzaW5nIGdjYywgbWFrZSBzdXJlIHdlIGhhdmUgQU5TSSBpb2N0bCBkZWZpbml0aW9ucworZG5sCitkbmwgdXNhZ2U6CitkbmwKK2RubAlBQ19MQkxfRklYSU5DTFVERVMKK2RubAorQUNfREVGVU4oQUNfTEJMX0ZJWElOQ0xVREVTLAorICAgIFtpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KKwkgICAgQUNfTVNHX0NIRUNLSU5HKGZvciBBTlNJIGlvY3RsIGRlZmluaXRpb25zKQorCSAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcywKKwkJQUNfVFJZX0NPTVBJTEUoCisJCSAgICBbLyoKKwkJICAgICAqIFRoaXMgZ2VuZXJhdGVzIGEgImR1cGxpY2F0ZSBjYXNlIHZhbHVlIiB3aGVuIGZpeGluY2x1ZGVzCisJCSAgICAgKiBoYXMgbm90IGJlIHJ1bi4KKwkJICAgICAqLworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxzeXMvdGltZS5oPgorIwkJaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjCQlpZmRlZiBIQVZFX1NZU19JT0NDT01fSAorIwkJaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorIwkJZW5kaWZdLAorCQkgICAgW3N3aXRjaCAoMCkgeworCQkgICAgY2FzZSBfSU8oJ0EnLCAxKTo7CisJCSAgICBjYXNlIF9JTygnQicsIDEpOjsKKwkJICAgIH1dLAorCQkgICAgYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcz15ZXMsCisJCSAgICBhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzPW5vKSkKKwkgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcykKKwkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcyA9IG5vIDsgdGhlbgorCQkgICAgIyBEb24ndCBjYWNoZSBmYWlsdXJlCisJCSAgICB1bnNldCBhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzCisJCSAgICBBQ19NU0dfRVJST1Ioc2VlIHRoZSBJTlNUQUxMIGZvciBtb3JlIGluZm8pCisJICAgIGZpCisgICAgZmldKQorCitkbmwKK2RubCBDaGVjayBmb3IgZmxleCwgZGVmYXVsdCB0byBsZXgKK2RubCBSZXF1aXJlIGZsZXggMi40IG9yIGhpZ2hlcgorZG5sIENoZWNrIGZvciBiaXNvbiwgZGVmYXVsdCB0byB5YWNjCitkbmwgRGVmYXVsdCB0byBsZXgveWFjYyBpZiBib3RoIGZsZXggYW5kIGJpc29uIGFyZSBub3QgYXZhaWxhYmxlCitkbmwgRGVmaW5lIHRoZSB5eSBwcmVmaXggc3RyaW5nIGlmIHVzaW5nIGZsZXggYW5kIGJpc29uCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9MRVhfQU5EX1lBQ0MobGV4LCB5YWNjLCB5eXByZWZpeCkKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAkkMSAobGV4IHNldCkKK2RubAkkMiAoeWFjYyBhcHBlbmRlZCkKK2RubAkkMyAob3B0aW9uYWwgZmxleCBhbmQgYmlzb24gLVAgcHJlZml4KQorZG5sCitBQ19ERUZVTihBQ19MQkxfTEVYX0FORF9ZQUNDLAorICAgIFtBQ19BUkdfV0lUSChmbGV4LCBbICAtLXdpdGhvdXQtZmxleCAgICAgICAgICBkb24ndCB1c2UgZmxleF0pCisgICAgQUNfQVJHX1dJVEgoYmlzb24sIFsgIC0td2l0aG91dC1iaXNvbiAgICAgICAgIGRvbid0IHVzZSBiaXNvbl0pCisgICAgaWYgdGVzdCAiJHdpdGhfZmxleCIgPSBubyA7IHRoZW4KKwkgICAgJDE9bGV4CisgICAgZWxzZQorCSAgICBBQ19DSEVDS19QUk9HUygkMSwgZmxleCwgbGV4KQorICAgIGZpCisgICAgaWYgdGVzdCAiJCQxIiA9IGZsZXggOyB0aGVuCisJICAgICMgVGhlIC1WIGZsYWcgd2FzIGFkZGVkIGluIDIuNAorCSAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGZsZXggMi40IG9yIGhpZ2hlcikKKwkgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9mbGV4X3YyNCwKKwkJaWYgZmxleCAtViA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkJCWFjX2N2X2xibF9mbGV4X3YyND15ZXMKKwkJZWxzZQorCQkJYWNfY3ZfbGJsX2ZsZXhfdjI0PW5vCisJCWZpKQorCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfZmxleF92MjQpCisJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9mbGV4X3YyNCA9IG5vIDsgdGhlbgorCQkgICAgcz0iMi40IG9yIGhpZ2hlciByZXF1aXJlZCIKKwkJICAgIEFDX01TR19XQVJOKGlnbm9yaW5nIG9ic29sZXRlIGZsZXggZXhlY3V0YWJsZSAoJHMpKQorCQkgICAgJDE9bGV4CisJICAgIGZpCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkd2l0aF9iaXNvbiIgPSBubyA7IHRoZW4KKwkgICAgJDI9eWFjYworICAgIGVsc2UKKwkgICAgQUNfQ0hFQ0tfUFJPR1MoJDIsIGJpc29uLCB5YWNjKQorICAgIGZpCisgICAgaWYgdGVzdCAiJCQyIiA9IGJpc29uIDsgdGhlbgorCSAgICAkMj0iJCQyIC15IgorICAgIGZpCisgICAgaWYgdGVzdCAiJCQxIiAhPSBsZXggLWEgIiQkMiIgPSB5YWNjIC1vICIkJDEiID0gbGV4IC1hICIkJDIiICE9IHlhY2MgOyB0aGVuCisJICAgIEFDX01TR19XQVJOKGRvbid0IGhhdmUgYm90aCBmbGV4IGFuZCBiaXNvbjsgcmV2ZXJ0aW5nIHRvIGxleC95YWNjKQorCSAgICAkMT1sZXgKKwkgICAgJDI9eWFjYworICAgIGZpCisgICAgaWYgdGVzdCAiJCQxIiA9IGZsZXggLWEgLW4gIiQzIiA7IHRoZW4KKwkgICAgJDE9IiQkMSAtUCQzIgorCSAgICAkMj0iJCQyIC1wICQzIgorICAgIGZpXSkKKworZG5sCitkbmwgQ2hlY2tzIHRvIHNlZSBpZiB1bmlvbiB3YWl0IGlzIHVzZWQgd2l0aCBXRVhJVFNUQVRVUygpCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9VTklPTl9XQUlUCitkbmwKK2RubCByZXN1bHRzOgorZG5sCitkbmwJREVDTFdBSVRTVEFUVVMgKGRlZmluZWQpCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9VTklPTl9XQUlULAorICAgIFtBQ19NU0dfQ0hFQ0tJTkcoaWYgdW5pb24gd2FpdCBpcyB1c2VkKQorICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfdW5pb25fd2FpdCwKKwlBQ19UUllfQ09NUElMRShbCisjCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwlpbmNsdWRlIDxzeXMvd2FpdC5oPl0sCisJICAgIFtpbnQgc3RhdHVzOworCSAgICB1X2ludCBpID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwkgICAgdV9pbnQgaiA9IHdhaXRwaWQoMCwgJnN0YXR1cywgMCk7XSwKKwkgICAgYWNfY3ZfbGJsX3VuaW9uX3dhaXQ9bm8sCisJICAgIGFjX2N2X2xibF91bmlvbl93YWl0PXllcykpCisgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX3VuaW9uX3dhaXQpCisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX3VuaW9uX3dhaXQgPSB5ZXMgOyB0aGVuCisJICAgIEFDX0RFRklORShERUNMV0FJVFNUQVRVUyx1bmlvbiB3YWl0LFt0eXBlIGZvciB3YWl0XSkKKyAgICBlbHNlCisJICAgIEFDX0RFRklORShERUNMV0FJVFNUQVRVUyxpbnQsW3R5cGUgZm9yIHdhaXRdKQorICAgIGZpXSkKKworZG5sCitkbmwgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgc29ja2FkZHIgc3RydWN0IGhhcyB0aGUgNC40IEJTRCBzYV9sZW4gbWVtYmVyCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9TT0NLQUREUl9TQV9MRU4KK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAlIQVZFX1NPQ0tBRERSX1NBX0xFTiAoZGVmaW5lZCkKK2RubAorQUNfREVGVU4oQUNfTEJMX1NPQ0tBRERSX1NBX0xFTiwKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIHNvY2thZGRyIHN0cnVjdCBoYXMgdGhlIHNhX2xlbiBtZW1iZXIpCisgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuLAorCUFDX1RSWV9DT01QSUxFKFsKKyMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD5dLAorCVt1X2ludCBpID0gc2l6ZW9mKCgoc3RydWN0IHNvY2thZGRyICopMCktPnNhX2xlbildLAorCWFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuPXllcywKKwlhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbj1ubykpCisgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4pCisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4gPSB5ZXMgOyB0aGVuCisJICAgIEFDX0RFRklORShIQVZFX1NPQ0tBRERSX1NBX0xFTiwxLFtpZiBzdHJ1Y3Qgc29ja2FkZHIgaGFzIHRoZSBzYV9sZW4gbWVtYmVyXSkKKyAgICBmaV0pCisKK2RubAorZG5sIENoZWNrcyB0byBzZWUgaWYgdGhlcmUncyBhIHNvY2thZGRyX3N0b3JhZ2Ugc3RydWN0dXJlCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9TT0NLQUREUl9TVE9SQUdFCitkbmwKK2RubCByZXN1bHRzOgorZG5sCitkbmwJSEFWRV9TT0NLQUREUl9TVE9SQUdFIChkZWZpbmVkKQorZG5sCitBQ19ERUZVTihBQ19MQkxfU09DS0FERFJfU1RPUkFHRSwKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIHNvY2thZGRyX3N0b3JhZ2Ugc3RydWN0IGV4aXN0cykKKyAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2hhc19zb2NrYWRkcl9zdG9yYWdlLAorCUFDX1RSWV9DT01QSUxFKFsKKyMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD5dLAorCVt1X2ludCBpID0gc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSldLAorCWFjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZT15ZXMsCisJYWNfY3ZfbGJsX2hhc19zb2NrYWRkcl9zdG9yYWdlPW5vKSkKKyAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfaGFzX3NvY2thZGRyX3N0b3JhZ2UpCisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2hhc19zb2NrYWRkcl9zdG9yYWdlID0geWVzIDsgdGhlbgorCSAgICBBQ19ERUZJTkUoSEFWRV9TT0NLQUREUl9TVE9SQUdFLDEsW2lmIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGV4aXN0c10pCisgICAgZmldKQorCitkbmwKK2RubCBDaGVja3MgdG8gc2VlIGlmIHRoZSBkbF9ocF9wcGFfaW5mb190IHN0cnVjdCBoYXMgdGhlIEhQLVVYIDExLjAwCitkbmwgZGxfbW9kdWxlX2lkXzEgbWVtYmVyCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9IUF9QUEFfSU5GT19UX0RMX01PRFVMRV9JRF8xCitkbmwKK2RubCByZXN1bHRzOgorZG5sCitkbmwJSEFWRV9IUF9QUEFfSU5GT19UX0RMX01PRFVMRV9JRF8xIChkZWZpbmVkKQorZG5sCitkbmwgTk9URTogYW55IGNvbXBpbGUgZmFpbHVyZSBtZWFucyB3ZSBjb25jbHVkZSB0aGF0IGl0IGRvZXNuJ3QgaGF2ZQorZG5sIHRoYXQgbWVtYmVyLCBzbyBpZiB3ZSBkb24ndCBoYXZlIERMUEksIGRvbid0IGhhdmUgYSA8c3lzL2RscGlfZXh0Lmg+CitkbmwgaGVhZGVyLCBvciBoYXZlIG9uZSB0aGF0IGRvZXNuJ3QgZGVjbGFyZSBhIGRsX2hwX3BwYV9pbmZvX3QgdHlwZSwKK2RubCB3ZSBjb25jbHVkZSBpdCBkb2Vzbid0IGhhdmUgdGhhdCBtZW1iZXIgKHdoaWNoIGlzIE9LLCBhcyBlaXRoZXIgd2UKK2RubCB3b24ndCBiZSB1c2luZyBjb2RlIHRoYXQgd291bGQgdXNlIHRoYXQgbWVtYmVyLCBvciB3ZSB3b3VsZG4ndAorZG5sIGNvbXBpbGUgaW4gYW55IGNhc2UpLgorZG5sCitBQ19ERUZVTihBQ19MQkxfSFBfUFBBX0lORk9fVF9ETF9NT0RVTEVfSURfMSwKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGlmIGRsX2hwX3BwYV9pbmZvX3Qgc3RydWN0IGhhcyBkbF9tb2R1bGVfaWRfMSBtZW1iZXIpCisgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMSwKKwlBQ19UUllfQ09NUElMRShbCisjCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwlpbmNsdWRlIDxzeXMvZGxwaS5oPgorIwlpbmNsdWRlIDxzeXMvZGxwaV9leHQuaD5dLAorCVt1X2ludCBpID0gc2l6ZW9mKCgoZGxfaHBfcHBhX2luZm9fdCAqKTApLT5kbF9tb2R1bGVfaWRfMSldLAorCWFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMT15ZXMsCisJYWNfY3ZfbGJsX2RsX2hwX3BwYV9pbmZvX3RfaGFzX2RsX21vZHVsZV9pZF8xPW5vKSkKKyAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfZGxfaHBfcHBhX2luZm9fdF9oYXNfZGxfbW9kdWxlX2lkXzEpCisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2RsX2hwX3BwYV9pbmZvX3RfaGFzX2RsX21vZHVsZV9pZF8xID0geWVzIDsgdGhlbgorCSAgICBBQ19ERUZJTkUoSEFWRV9IUF9QUEFfSU5GT19UX0RMX01PRFVMRV9JRF8xLDEsW2lmIHBwYV9pbmZvX3RfZGxfbW9kdWxlX2lkIGV4aXN0c10pCisgICAgZmldKQorCitkbmwKK2RubCBDaGVja3MgdG8gc2VlIGlmIC1SIGlzIHVzZWQKK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX0hBVkVfUlVOX1BBVEgKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAlhY19jdl9sYmxfaGF2ZV9ydW5fcGF0aCAoeWVzIG9yIG5vKQorZG5sCitBQ19ERUZVTihBQ19MQkxfSEFWRV9SVU5fUEFUSCwKKyAgICBbQUNfTVNHX0NIRUNLSU5HKGZvciAke0NDLWNjfSAtUikKKyAgICBBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2hhdmVfcnVuX3BhdGgsCisJW2VjaG8gJ21haW4oKXt9JyA+IGNvbmZ0ZXN0LmMKKwkke0NDLWNjfSAtbyBjb25mdGVzdCBjb25mdGVzdC5jIC1SL2ExL2IyL2MzID5jb25mdGVzdC5vdXQgMj4mMQorCWlmIHRlc3QgISAtcyBjb25mdGVzdC5vdXQgOyB0aGVuCisJCWFjX2N2X2xibF9oYXZlX3J1bl9wYXRoPXllcworCWVsc2UKKwkJYWNfY3ZfbGJsX2hhdmVfcnVuX3BhdGg9bm8KKwlmaQorCXJtIC1mIC1yIGNvbmZ0ZXN0Kl0pCisgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2hhdmVfcnVuX3BhdGgpCisgICAgXSkKKworZG5sCitkbmwgQ2hlY2tzIHRvIHNlZSBpZiB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzIGZhaWwKK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX1VOQUxJR05FRF9BQ0NFU1MKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAlMQkxfQUxJR04gKERFRklORUQpCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9VTkFMSUdORURfQUNDRVNTLAorICAgIFtBQ19NU0dfQ0hFQ0tJTkcoaWYgdW5hbGlnbmVkIGFjY2Vzc2VzIGZhaWwpCisgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF91bmFsaWduZWRfZmFpbCwKKwlbY2FzZSAiJGhvc3RfY3B1IiBpbgorCisJIworCSMgVGhlc2UgYXJlIENQVSB0eXBlcyB3aGVyZToKKwkjCisJIwl0aGUgQ1BVIGZhdWx0cyBvbiBhbiB1bmFsaWduZWQgYWNjZXNzLCBidXQgYXQgbGVhc3Qgc29tZQorCSMJT1NlcyB0aGF0IHN1cHBvcnQgdGhhdCBDUFUgY2F0Y2ggdGhlIGZhdWx0IGFuZCBzaW11bGF0ZQorCSMJdGhlIHVuYWxpZ25lZCBhY2Nlc3MgKGUuZy4sIEFscGhhL3tEaWdpdGFsLFRydTY0fSBVTklYKSAtCisJIwl0aGUgc2ltdWxhdGlvbiBpcyBzbG93LCBzbyB3ZSBkb24ndCB3YW50IHRvIHVzZSBpdDsKKwkjCisJIwl0aGUgQ1BVLCBJIGluZmVyIChmcm9tIHRoZSBvbGQKKwkjCisJIyBYWFg6IHNob3VsZCBhbHNvIGNoZWNrIHRoYXQgdGhleSBkb24ndCBkbyB3ZWlyZCB0aGluZ3MgKGxpa2Ugb24gYXJtKQorCSMKKwkjCWNvbW1lbnQpIGRvZXNuJ3QgZmF1bHQgb24gdW5hbGlnbmVkIGFjY2Vzc2VzLCBidXQgZG9lc24ndAorCSMJZG8gYSBub3JtYWwgdW5hbGlnbmVkIGZldGNoLCBlaXRoZXIgKGUuZy4sIHByZXN1bWFibHksIEFSTSk7CisJIworCSMJZm9yIHdoYXRldmVyIHJlYXNvbiwgdGhlIHRlc3QgcHJvZ3JhbSBkb2Vzbid0IHdvcmsKKwkjCSh0aGlzIGhhcyBiZWVuIGNsYWltZWQgdG8gYmUgdGhlIGNhc2UgZm9yIHNldmVyYWwgb2YgdGhvc2UKKwkjCUNQVXMgLSBJIGRvbid0IGtub3cgd2hhdCB0aGUgcHJvYmxlbSBpczsgdGhlIHByb2JsZW0KKwkjCXdhcyByZXBvcnRlZCBhcyAidGhlIHRlc3QgcHJvZ3JhbSBkdW1wcyBjb3JlIiBmb3IgU3VwZXJILAorCSMJYnV0IHRoYXQncyB3aGF0IHRoZSB0ZXN0IHByb2dyYW0gaXMgKnN1cHBvc2VkKiB0byBkbyAtCisJIwlpdCBkdW1wcyBjb3JlIGJlZm9yZSBpdCB3cml0ZXMgYW55dGhpbmcsIHNvIHRoZSB0ZXN0CisJIwlmb3IgYW4gZW1wdHkgb3V0cHV0IGZpbGUgc2hvdWxkIGZpbmQgYW4gZW1wdHkgb3V0cHV0CisJIwlmaWxlIGFuZCBjb25jbHVkZSB0aGF0IHVuYWxpZ25lZCBhY2Nlc3NlcyBkb24ndCB3b3JrKS4KKwkjCisJIyBUaGlzIHJ1bi10aW1lIHRlc3Qgd29uJ3Qgd29yayBpZiB5b3UncmUgY3Jvc3MtY29tcGlsaW5nLCBzbworCSMgaW4gb3JkZXIgdG8gc3VwcG9ydCBjcm9zcy1jb21waWxpbmcgZm9yIGEgcGFydGljdWxhciBDUFUsCisJIyB3ZSBoYXZlIHRvIHdpcmUgaW4gdGhlIGxpc3Qgb2YgQ1BVIHR5cGVzIGFueXdheSwgYXMgZmFyIGFzCisJIyBJIGtub3csIHNvIHBlcmhhcHMgd2Ugc2hvdWxkIGp1c3QgaGF2ZSBhIHNldCBvZiBDUFVzIG9uCisJIyB3aGljaCB3ZSBrbm93IGl0IGRvZXNuJ3Qgd29yaywgYSBzZXQgb2YgQ1BVcyBvbiB3aGljaCB3ZQorCSMga25vdyBpdCBkb2VzIHdvcmssIGFuZCBoYXZlIHRoZSBzY3JpcHQganVzdCBmYWlsIG9uIG90aGVyCisJIyBjcHUgdHlwZXMgYW5kIHVwZGF0ZSBpdCB3aGVuIHN1Y2ggYSBmYWlsdXJlIG9jY3Vycy4KKwkjCisJYWxwaGEqfGFybSp8YmZpbip8aHAqfG1pcHMqfHNoKnxzcGFyYyp8aWE2NHxudjEpCisJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD15ZXMKKwkJOzsKKworCSopCisJCWNhdCA+Y29uZnRlc3QuYyA8PEVPRgorIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxzeXMvd2FpdC5oPgorIwkJaW5jbHVkZSA8c3RkaW8uaD4KKwkJdW5zaWduZWQgY2hhciBhW1s1XV0gPSB7IDEsIDIsIDMsIDQsIDUgfTsKKwkJbWFpbigpIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCXBpZF90IHBpZDsKKwkJaW50IHN0YXR1czsKKwkJLyogYXZvaWQgImNvcmUgZHVtcGVkIiBtZXNzYWdlICovCisJCXBpZCA9IGZvcmsoKTsKKwkJaWYgKHBpZCA8ICAwKQorCQkJZXhpdCgyKTsKKwkJaWYgKHBpZCA+IDApIHsKKwkJCS8qIHBhcmVudCAqLworCQkJcGlkID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCQkJaWYgKHBpZCA8IDApCisJCQkJZXhpdCgzKTsKKwkJCWV4aXQoIVdJRkVYSVRFRChzdGF0dXMpKTsKKwkJfQorCQkvKiBjaGlsZCAqLworCQlpID0gKih1bnNpZ25lZCBpbnQgKikmYVtbMV1dOworCQlwcmludGYoIiVkXG4iLCBpKTsKKwkJZXhpdCgwKTsKKwkJfQorRU9GCisJCSR7Q0MtY2N9IC1vIGNvbmZ0ZXN0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIFwKKwkJICAgIGNvbmZ0ZXN0LmMgJExJQlMgPi9kZXYvbnVsbCAyPiYxCisJCWlmIHRlc3QgISAteCBjb25mdGVzdCA7IHRoZW4KKwkJCWRubCBmYWlsZWQgdG8gY29tcGlsZSBmb3Igc29tZSByZWFzb24KKwkJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD15ZXMKKwkJZWxzZQorCQkJLi9jb25mdGVzdCA+Y29uZnRlc3Qub3V0CisJCQlpZiB0ZXN0ICEgLXMgY29uZnRlc3Qub3V0IDsgdGhlbgorCQkJCWFjX2N2X2xibF91bmFsaWduZWRfZmFpbD15ZXMKKwkJCWVsc2UKKwkJCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9bm8KKwkJCWZpCisJCWZpCisJCXJtIC1mIC1yIGNvbmZ0ZXN0KiBjb3JlIGNvcmUuY29uZnRlc3QKKwkJOzsKKwllc2FjXSkKKyAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwpCisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsID0geWVzIDsgdGhlbgorCSAgICBBQ19ERUZJTkUoTEJMX0FMSUdOLDEsW2lmIHVuYWxpZ25lZCBhY2Nlc3MgZmFpbHNdKQorICAgIGZpXSkKKworZG5sCitkbmwgSWYgdXNpbmcgZ2NjIGFuZCB0aGUgZmlsZSAuZGV2ZWwgZXhpc3RzOgorZG5sCUNvbXBpbGUgd2l0aCAtZyAoaWYgc3VwcG9ydGVkKSBhbmQgLVdhbGwKK2RubAlJZiB1c2luZyBnY2MgMiBvciBsYXRlciwgZG8gZXh0cmEgcHJvdG90eXBlIGNoZWNraW5nCitkbmwJSWYgYW4gb3MgcHJvdG90eXBlIGluY2x1ZGUgZXhpc3RzLCBzeW1saW5rIG9zLXByb3RvLmggdG8gaXQKK2RubAorZG5sIHVzYWdlOgorZG5sCitkbmwJQUNfTEJMX0RFVkVMKGNvcHQpCitkbmwKK2RubCByZXN1bHRzOgorZG5sCitkbmwJJDEgKGNvcHQgYXBwZW5kZWQpCitkbmwJSEFWRV9PU19QUk9UT19IIChkZWZpbmVkKQorZG5sCW9zLXByb3RvLmggKHN5bWxpbmtlZCkKK2RubAorQUNfREVGVU4oQUNfTEJMX0RFVkVMLAorICAgIFtybSAtZiBvcy1wcm90by5oCisgICAgaWYgdGVzdCAiJHtMQkxfQ0ZMQUdTK3NldH0iID0gc2V0OyB0aGVuCisJICAgICQxPSIkJDEgJHtMQkxfQ0ZMQUdTfSIKKyAgICBmaQorICAgIGlmIHRlc3QgLWYgLmRldmVsIDsgdGhlbgorCSAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KKwkJICAgIGlmIHRlc3QgIiR7TEJMX0NGTEFHUytzZXR9IiAhPSBzZXQ7IHRoZW4KKwkJCSAgICBpZiB0ZXN0ICIkYWNfY3ZfcHJvZ19jY19nIiA9IHllcyA7IHRoZW4KKwkJCQkgICAgJDE9Ii1nICQkMSIKKwkJCSAgICBmaQorCQkJICAgICQxPSIkJDEgLVdhbGwiCisJCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY192ZXJzIC1ndCAxIDsgdGhlbgorCQkJCSAgICAkMT0iJCQxIC1XbWlzc2luZy1wcm90b3R5cGVzIC1Xc3RyaWN0LXByb3RvdHlwZXMiCisJCQkgICAgZmkKKwkJICAgIGZpCisJICAgIGVsc2UKKwkJICAgIGNhc2UgIiRob3N0X29zIiBpbgorCisJCSAgICBpcml4NiopCisJCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLW4zMiIKKwkJCSAgICA7OworCisJCSAgICAqKQorCQkJICAgIDs7CisJCSAgICBlc2FjCisJICAgIGZpCisJICAgIG9zPWBlY2hvICRob3N0X29zIHwgc2VkIC1lICdzL1woW1swLTldXVtbMC05XV0qXClbW14wLTldXS4qJC9cMS8nYAorCSAgICBuYW1lPSJsYmwvb3MtJG9zLmgiCisJICAgIGlmIHRlc3QgLWYgJG5hbWUgOyB0aGVuCisJCSAgICBsbiAtcyAkbmFtZSBvcy1wcm90by5oCisJCSAgICBBQ19ERUZJTkUoSEFWRV9PU19QUk9UT19ILCAxLAorCQkJW2lmIHRoZXJlJ3MgYW4gb3NfcHJvdG8uaCBmb3IgdGhpcyBwbGF0Zm9ybSwgdG8gdXNlIGFkZGl0aW9uYWwgcHJvdG90eXBlc10pCisJICAgIGVsc2UKKwkJICAgIEFDX01TR19XQVJOKGNhbid0IGZpbmQgJG5hbWUpCisJICAgIGZpCisgICAgZmldKQorCitkbmwKK2RubCBJbXByb3ZlZCB2ZXJzaW9uIG9mIEFDX0NIRUNLX0xJQgorZG5sCitkbmwgVGhhbmtzIHRvIEpvaG4gSGF3a2luc29uIChqaGF3a0BtaXQuZWR1KQorZG5sCitkbmwgdXNhZ2U6CitkbmwKK2RubAlBQ19MQkxfQ0hFQ0tfTElCKExJQlJBUlksIEZVTkNUSU9OIFssIEFDVElPTi1JRi1GT1VORCBbLAorZG5sCSAgICBBQ1RJT04tSUYtTk9ULUZPVU5EIFssIE9USEVSLUxJQlJBUklFU11dXSkKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAlMSUJTCitkbmwKK2RubCBYWFggLSAiQUNfTEJMX0xJQlJBUllfTkVUIiB3YXMgcmVkb25lIHRvIHVzZSAiQUNfU0VBUkNIX0xJQlMiCitkbmwgcmF0aGVyIHRoYW4gIkFDX0xCTF9DSEVDS19MSUIiLCBzbyB0aGlzIGlzbid0IHVzZWQgYW55IG1vcmUuCitkbmwgV2Uga2VlcCBpdCBhcm91bmQgZm9yIHJlZmVyZW5jZSBwdXJwb3NlcyBpbiBjYXNlIGl0J3MgZXZlcgorZG5sIHVzZWZ1bCBpbiB0aGUgZnV0dXJlLgorZG5sCisKK2RlZmluZShBQ19MQkxfQ0hFQ0tfTElCLAorW0FDX01TR19DSEVDS0lORyhbZm9yICQyIGluIC1sJDFdKQorZG5sIFVzZSBhIGNhY2hlIHZhcmlhYmxlIG5hbWUgY29udGFpbmluZyB0aGUgbGlicmFyeSwgZnVuY3Rpb24KK2RubCBuYW1lLCBhbmQgZXh0cmEgbGlicmFyaWVzIHRvIGxpbmsgd2l0aCwgYmVjYXVzZSB0aGUgdGVzdCByZWFsbHkgaXMKK2RubCBmb3IgbGlicmFyeSAkMSBkZWZpbmluZyBmdW5jdGlvbiAkMiwgd2hlbiBsaW5rZWQgd2l0aCBwb3RpbmFsCitkbmwgbGlicmFyeSAkNSwgbm90IGp1c3QgZm9yIGxpYnJhcnkgJDEuICBTZXBhcmF0ZSB0ZXN0cyB3aXRoIHRoZSBzYW1lCitkbmwgJDEgYW5kIGRpZmZlcmVudCAkMidzIG9yICQ1J3MgbWF5IGhhdmUgZGlmZmVyZW50IHJlc3VsdHMuCithY19saWJfdmFyPWBlY2hvICQxWydfJ10kMlsnXyddJDUgfCBzZWQgJ3klLi8rLSAlX19wX18lJ2AKK0FDX0NBQ0hFX1ZBTChhY19jdl9sYmxfbGliXyRhY19saWJfdmFyLAorW2FjX3NhdmVfTElCUz0iJExJQlMiCitMSUJTPSItbCQxICQ1ICRMSUJTIgorQUNfVFJZX0xJTksoZG5sCitpZmVsc2UoWyQyXSwgW21haW5dLCAsIGRubCBBdm9pZCBjb25mbGljdGluZyBkZWNsIG9mIG1haW4uCitbLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KK11pZmVsc2UoQUNfTEFORywgQ1BMVVNQTFVTLCBbI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK10pZG5sCitbLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgorICAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCitjaGFyICQyKCk7CitdKSwKKwkgICAgWyQyKCldLAorCSAgICBldmFsICJhY19jdl9sYmxfbGliXyRhY19saWJfdmFyPXllcyIsCisJICAgIGV2YWwgImFjX2N2X2xibF9saWJfJGFjX2xpYl92YXI9bm8iKQorTElCUz0iJGFjX3NhdmVfTElCUyIKK10pZG5sCitpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyRhY19jdl9sYmxfbGliXyckYWNfbGliX3ZhcmBcIiA9IHllcyI7IHRoZW4KKyAgQUNfTVNHX1JFU1VMVCh5ZXMpCisgIGlmZWxzZShbJDNdLCAsCitbY2hhbmdlcXVvdGUoLCApZG5sCisgIGFjX3RyX2xpYj1IQVZFX0xJQmBlY2hvICQxIHwgc2VkIC1lICdzL1teYS16QS1aMC05X10vXy9nJyBcCisgICAgLWUgJ3kvYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovJ2AKK2NoYW5nZXF1b3RlKFssIF0pZG5sCisgIEFDX0RFRklORV9VTlFVT1RFRCgkYWNfdHJfbGliKQorICBMSUJTPSItbCQxICRMSUJTIgorXSwgWyQzXSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChubykKK2lmZWxzZShbJDRdLCAsICwgWyQ0CitdKWRubAorZmkKK10pCisKK2RubAorZG5sIEFDX0xCTF9MSUJSQVJZX05FVAorZG5sCitkbmwgVGhpcyB0ZXN0IGlzIGZvciBuZXR3b3JrIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgc29ja2V0KCkgYW5kCitkbmwgZ2V0aG9zdGJ5bmFtZSgpIC1pc2ggZnVuY3Rpb25zLiAgVW5kZXIgU29sYXJpcywgdGhvc2UgYXBwbGljYXRpb25zCitkbmwgbmVlZCB0byBsaW5rIHdpdGggIi1sc29ja2V0IC1sbnNsIi4gIFVuZGVyIElSSVgsIHRoZXkgbmVlZCB0byBsaW5rCitkbmwgd2l0aCAiLWxuc2wiIGJ1dCBzaG91bGQgKm5vdCogbGluayB3aXRoICItbHNvY2tldCIgYmVjYXVzZQorZG5sIGxpYnNvY2tldC5hIGJyZWFrcyBhIG51bWJlciBvZiB0aGluZ3MgKGZvciBpbnN0YW5jZToKK2RubCBnZXRob3N0YnluYW1lKCkgdW5kZXIgSVJJWCA1LjIsIGFuZCBzbm9vcCBzb2NrZXRzIHVuZGVyIG1vc3QKK2RubCB2ZXJzaW9ucyBvZiBJUklYKS4KK2RubAorZG5sIFVuZm9ydHVuYXRlbHksIG1hbnkgYXBwbGljYXRpb24gZGV2ZWxvcGVycyBhcmUgbm90IGF3YXJlIG9mIHRoaXMsCitkbmwgYW5kIG1pc3Rha2VubHkgd3JpdGUgdGVzdHMgdGhhdCBjYXVzZSAtbHNvY2tldCB0byBiZSB1c2VkIHVuZGVyCitkbmwgSVJJWC4gIEl0IGlzIGFsc28gZWFzeSB0byB3cml0ZSB0ZXN0cyB0aGF0IGNhdXNlIC1sbnNsIHRvIGJlIHVzZWQKK2RubCB1bmRlciBvcGVyYXRpbmcgc3lzdGVtcyB3aGVyZSBuZWl0aGVyIGFyZSBuZWNlc3NhcnkgKG9yIHVzZWZ1bCksCitkbmwgc3VjaCBhcyBTdW5PUyA0LjEuNCwgd2hpY2ggdXNlcyAtbG5zbCBmb3IgVExJLgorZG5sCitkbmwgVGhpcyB0ZXN0IGV4aXN0cyBzbyB0aGF0IGV2ZXJ5IGFwcGxpY2F0aW9uIGRldmVsb3BlciBkb2VzIG5vdCB0ZXN0CitkbmwgdGhpcyBpbiBhIGRpZmZlcmVudCwgYW5kIHN1YnRseSBicm9rZW4gZmFzaGlvbi4KKworZG5sIEl0IGhhcyBiZWVuIGFyZ3VlZCB0aGF0IHRoaXMgdGVzdCBzaG91bGQgYmUgYnJva2VuIHVwIGludG8gdHdvCitkbmwgc2VwZXJhdGUgdGVzdHMsIG9uZSBmb3IgdGhlIHJlc29sdmVyIGxpYnJhcmllcywgYW5kIG9uZSBmb3IgdGhlCitkbmwgbGlicmFyaWVzIG5lY2Vzc2FyeSBmb3IgdXNpbmcgU29ja2V0cyBBUEkuIFVuZm9ydHVuYXRlbHksIHRoZSB0d28KK2RubCBhcmUgY2FyZWZ1bGx5IGludGVydHdpbmVkIGFuZCBhbGxvd2luZyB0aGUgYXV0b2NvbmYgdXNlciB0byB1c2UKK2RubCB0aGVtIGluZGVwZW5kYW50bHkgcG90ZW50aWFsbHkgcmVzdWx0cyBpbiB1bmZvcnR1bmF0ZSBvcmRlcmluZworZG5sIGRlcGVuZGFuY2llcyAtLSBhcyBzdWNoLCBzdWNoIGNvbXBvbmVudCBtYWNyb3Mgd291bGQgaGF2ZSB0bworZG5sIGNhcmVmdWxseSB1c2UgaW5kaXJlY3Rpb24gYW5kIGJlIGF3YXJlIGlmIHRoZSBvdGhlciBjb21wb25lbnRzIHdlcmUKK2RubCBleGVjdXRlZC4gU2luY2Ugb3RoZXIgYXV0b2NvbmYgbWFjcm9zIGRvIG5vdCBnbyB0byB0aGlzIHRyb3VibGUsCitkbmwgYW5kIGFsbW9zdCBubyBhcHBsaWNhdGlvbnMgdXNlIHNvY2tldHMgd2l0aG91dCB0aGUgcmVzb2x2ZXIsIHRoaXMKK2RubCBjb21wbGV4aXR5IGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZC4KK2RubAorZG5sIFRoZSBjaGVjayBmb3IgbGlicmVzb2x2IGlzIGluIGNhc2UgeW91IGFyZSBhdHRlbXB0aW5nIHRvIGxpbmsKK2RubCBzdGF0aWNhbGx5IGFuZCBoYXBwZW4gdG8gaGF2ZSBhIGxpYnJlc29sdi5hIGx5aW5nIGFyb3VuZCAoYW5kIG5vCitkbmwgbGlibnNsLmEpLgorZG5sCitBQ19ERUZVTihBQ19MQkxfTElCUkFSWV9ORVQsIFsKKyAgICAjIE1vc3Qgb3BlcmF0aW5nIHN5c3RlbXMgaGF2ZSBnZXRob3N0YnluYW1lKCkgaW4gdGhlIGRlZmF1bHQgc2VhcmNoZWQKKyAgICAjIGxpYnJhcmllcyAoaS5lLiBsaWJjKToKKyAgICAjIFNvbWUgT1NlcyAoZWcuIFNvbGFyaXMpIHBsYWNlIGl0IGluIGxpYm5zbAorICAgICMgU29tZSBzdHJhbmdlIE9TZXMgKFNJTklYKSBoYXZlIGl0IGluIGxpYnNvY2tldDoKKyAgICBBQ19TRUFSQ0hfTElCUyhnZXRob3N0YnluYW1lLCBuc2wgc29ja2V0IHJlc29sdikKKyAgICAjIFVuZm9ydHVuYXRlbHkgbGlic29ja2V0IHNvbWV0aW1lcyBkZXBlbmRzIG9uIGxpYm5zbCBhbmQKKyAgICAjIEFDX1NFQVJDSF9MSUJTIGlzbid0IHVwIHRvIHRoZSB0YXNrIG9mIGhhbmRsaW5nIGRlcGVuZGVuY2llcyBsaWtlIHRoaXMuCisgICAgaWYgdGVzdCAiJGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lIiA9ICJubyIKKyAgICB0aGVuCisJQUNfQ0hFQ0tfTElCKHNvY2tldCwgZ2V0aG9zdGJ5bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIExJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIiwgLCAtbG5zbCkKKyAgICBmaQorICAgIEFDX1NFQVJDSF9MSUJTKHNvY2tldCwgc29ja2V0LCAsCisJQUNfQ0hFQ0tfTElCKHNvY2tldCwgc29ja2V0LCBMSUJTPSItbHNvY2tldCAtbG5zbCAkTElCUyIsICwgLWxuc2wpKQorICAgICMgRExQSSBuZWVkcyBwdXRtc2cgdW5kZXIgSFBVWCBzbyB0ZXN0IGZvciAtbHN0ciB3aGlsZSB3ZSdyZSBhdCBpdAorICAgIEFDX1NFQVJDSF9MSUJTKHB1dG1zZywgc3RyKQorICAgIF0pCisKK2RubAorZG5sIFRlc3QgZm9yIF9fYXR0cmlidXRlX18KK2RubAorCitBQ19ERUZVTihBQ19DX19fQVRUUklCVVRFX18sIFsKK0FDX01TR19DSEVDS0lORyhmb3IgX19hdHRyaWJ1dGVfXykKK0FDX0NBQ0hFX1ZBTChhY19jdl9fX2F0dHJpYnV0ZV9fLCBbCitBQ19DT01QSUxFX0lGRUxTRSgKKyAgQUNfTEFOR19TT1VSQ0UoW1sKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQgZm9vKHZvaWQpIF9fYXR0cmlidXRlX18gKChub3JldHVybikpOworCitzdGF0aWMgdm9pZAorZm9vKHZvaWQpCit7CisgIGV4aXQoMSk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgIGZvbygpOworfQorICBdXSksCithY19jdl9fX2F0dHJpYnV0ZV9fPXllcywKK2FjX2N2X19fYXR0cmlidXRlX189bm8pXSkKK2lmIHRlc3QgIiRhY19jdl9fX2F0dHJpYnV0ZV9fIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX0RFRklORShIQVZFX19fQVRUUklCVVRFX18sIDEsIFtkZWZpbmUgaWYgeW91ciBjb21waWxlciBoYXMgX19hdHRyaWJ1dGVfX10pCisgIFZfREVGUz0iJFZfREVGUyAtRF9VXz1cIl9fYXR0cmlidXRlX18oKHVudXNlZCkpXCIiCitlbHNlCisgIFZfREVGUz0iJFZfREVGUyAtRF9VXz1cIlwiIgorZmkKK0FDX01TR19SRVNVTFQoJGFjX2N2X19fYXR0cmlidXRlX18pCitdKQorCitkbmwKK2RubCBDaGVja3MgdG8gc2VlIGlmIHRwYWNrZXRfc3RhdHMgaXMgZGVmaW5lZCBpbiBsaW51eC9pZl9wYWNrZXQuaAorZG5sIElmIHNvIHRoZW4gcGNhcC1saW51eC5jIGNhbiB1c2UgdGhpcyB0byByZXBvcnQgcHJvcGVyIHN0YXRpc3RpY3MuCitkbmwKK2RubCAtU2NvdHQgQmFycm9uCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9UUEFDS0VUX1NUQVRTLAorICAgW0FDX01TR19DSEVDS0lORyhpZiBpZl9wYWNrZXQuaCBoYXMgdHBhY2tldF9zdGF0cyBkZWZpbmVkKQorICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF90cGFja2V0X3N0YXRzLAorICAgQUNfVFJZX0NPTVBJTEUoWworIyAgaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+XSwKKyAgIFtzdHJ1Y3QgdHBhY2tldF9zdGF0cyBzdGF0c10sCisgICBhY19jdl9sYmxfdHBhY2tldF9zdGF0cz15ZXMsCisgICBhY19jdl9sYmxfdHBhY2tldF9zdGF0cz1ubykpCisgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfdHBhY2tldF9zdGF0cykKKyAgIGlmIHRlc3QgJGFjX2N2X2xibF90cGFja2V0X3N0YXRzID0geWVzOyB0aGVuCisgICAgICAgQUNfREVGSU5FKEhBVkVfVFBBQ0tFVF9TVEFUUywxLFtpZiBpZl9wYWNrZXQuaCBoYXMgdHBhY2tldF9zdGF0cyBkZWZpbmVkXSkKKyAgIGZpXSkKKworZG5sCitkbmwgQ2hlY2tzIHRvIHNlZSBpZiB0aGUgdHBhY2tldF9hdXhkYXRhIHN0cnVjdCBoYXMgYSB0cF92bGFuX3RjaSBtZW1iZXIuCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kKK2RubAorZG5sIHJlc3VsdHM6CitkbmwKK2RubAlIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSAoZGVmaW5lZCkKK2RubAorZG5sIE5PVEU6IGFueSBjb21waWxlIGZhaWx1cmUgbWVhbnMgd2UgY29uY2x1ZGUgdGhhdCBpdCBkb2Vzbid0IGhhdmUKK2RubCB0aGF0IG1lbWJlciwgc28gaWYgd2UgZG9uJ3QgaGF2ZSB0cGFja2V0X2F1eGRhdGEsIHdlIGNvbmNsdWRlIGl0CitkbmwgZG9lc24ndCBoYXZlIHRoYXQgbWVtYmVyICh3aGljaCBpcyBPSywgYXMgZWl0aGVyIHdlIHdvbid0IGJlIHVzaW5nCitkbmwgY29kZSB0aGF0IHdvdWxkIHVzZSB0aGF0IG1lbWJlciwgb3Igd2Ugd291bGRuJ3QgY29tcGlsZSBpbiBhbnkgY2FzZSkuCitkbmwKK0FDX0RFRlVOKEFDX0xCTF9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0ksCisgICAgW0FDX01TR19DSEVDS0lORyhpZiB0cGFja2V0X2F1eGRhdGEgc3RydWN0IGhhcyB0cF92bGFuX3RjaSBtZW1iZXIpCisgICAgQUNfQ0FDSEVfVkFMKGFjX2N2X2xibF9saW51eF90cGFja2V0X2F1eGRhdGFfdHBfdmxhbl90Y2ksCisJQUNfVFJZX0NPTVBJTEUoWworIwlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+XSwKKwlbdV9pbnQgaSA9IHNpemVvZigoKHN0cnVjdCB0cGFja2V0X2F1eGRhdGEgKikwKS0+dHBfdmxhbl90Y2kpXSwKKwlhY19jdl9sYmxfbGludXhfdHBhY2tldF9hdXhkYXRhX3RwX3ZsYW5fdGNpPXllcywKKwlhY19jdl9sYmxfbGludXhfdHBhY2tldF9hdXhkYXRhX3RwX3ZsYW5fdGNpPW5vKSkKKyAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfbGludXhfdHBhY2tldF9hdXhkYXRhX3RwX3ZsYW5fdGNpKQorICAgIGlmIHRlc3QgJGFjX2N2X2xibF9saW51eF90cGFja2V0X2F1eGRhdGFfdHBfdmxhbl90Y2kgPSB5ZXMgOyB0aGVuCisJICAgIEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBPXRwX3ZsYW5fdGNpCisJICAgIEFDX1NVQlNUKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBKQorCSAgICBBQ19ERUZJTkUoSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0ksMSxbaWYgdHBfdmxhbl90Y2kgZXhpc3RzXSkKKyAgICBmaV0pCisKK2RubAorZG5sIENoZWNrcyB0byBzZWUgaWYgU29sYXJpcyBoYXMgdGhlIGRsX3Bhc3NpdmVfcmVxX3Qgc3RydWN0IGRlZmluZWQKK2RubCBpbiA8c3lzL2RscGkuaD4uCitkbmwKK2RubCB1c2FnZToKK2RubAorZG5sCUFDX0xCTF9ETF9QQVNTSVZFX1JFUV9UCitkbmwKK2RubCByZXN1bHRzOgorZG5sIAorZG5sIAlIQVZFX0RMUElfUEFTU0lWRSAoZGVmaW5lZCkKK2RubAorQUNfREVGVU4oQUNfTEJMX0RMX1BBU1NJVkVfUkVRX1QsCisgICAgICAgIFtBQ19NU0dfQ0hFQ0tJTkcoaWYgZGxfcGFzc2l2ZV9yZXFfdCBzdHJ1Y3QgZXhpc3RzKQorICAgICAgIEFDX0NBQ0hFX1ZBTChhY19jdl9sYmxfaGFzX2RsX3Bhc3NpdmVfcmVxX3QsCisgICAgICAgICAgICAgICAgQUNfVFJZX0NPTVBJTEUoWworIyAgICAgICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgICAgICAgaW5jbHVkZSA8c3lzL2RscGkuaD5dLAorICAgICAgICBbdV9pbnQgaSA9IHNpemVvZihkbF9wYXNzaXZlX3JlcV90KV0sCisgICAgICAgIGFjX2N2X2xibF9oYXNfZGxfcGFzc2l2ZV9yZXFfdD15ZXMsCisgICAgICAgIGFjX2N2X2xibF9oYXNfZGxfcGFzc2l2ZV9yZXFfdD1ubykpCisgICAgQUNfTVNHX1JFU1VMVCgkYWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90KQorICAgIGlmIHRlc3QgJGFjX2N2X2xibF9oYXNfZGxfcGFzc2l2ZV9yZXFfdCA9IHllcyA7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORShIQVZFX0RMUElfUEFTU0lWRSwxLFtpZiBwYXNzaXZlX3JlcV90IHByaW1pdGl2ZQorCQlleGlzdHNdKQorICAgIGZpXSkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvYXJjbmV0LmggYi9saWJwY2FwLTEuMy4wL2FyY25ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODYwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2FyY25ldC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQCgjKSAkSWQ6IGFyY25ldC5oLHYgMS4yIDIwMDEtMDQtMjQgMDI6MTc6NTIgZ3V5IEV4cCAkIChMQkwpCisgKgorICogZnJvbTogTmV0QlNEOiBpZl9hcmMuaCx2IDEuMTMgMTk5OS8xMS8xOSAyMDo0MToxOSB0aG9ycGVqIEV4cAorICovCisKKy8qIFJGQyAxMDUxICovCisjZGVmaW5lCUFSQ1RZUEVfSVBfT0xECQkyNDAJLyogSVAgcHJvdG9jb2wgKi8KKyNkZWZpbmUJQVJDVFlQRV9BUlBfT0xECQkyNDEJLyogYWRkcmVzcyByZXNvbHV0aW9uIHByb3RvY29sICovCisKKy8qIFJGQyAxMjAxICovCisjZGVmaW5lCUFSQ1RZUEVfSVAJCTIxMgkvKiBJUCBwcm90b2NvbCAqLworI2RlZmluZQlBUkNUWVBFX0FSUAkJMjEzCS8qIGFkZHJlc3MgcmVzb2x1dGlvbiBwcm90b2NvbCAqLworI2RlZmluZQlBUkNUWVBFX1JFVkFSUAkJMjE0CS8qIHJldmVyc2UgYWRkciByZXNvbHV0aW9uIHByb3RvY29sICovCisKKyNkZWZpbmUJQVJDVFlQRV9BVEFMSwkJMjIxCS8qIEFwcGxldGFsayAqLworI2RlZmluZQlBUkNUWVBFX0JBTklBTgkJMjQ3CS8qIEJhbnlhbiBWaW5lcyAqLworI2RlZmluZQlBUkNUWVBFX0lQWAkJMjUwCS8qIE5vdmVsbCBJUFggKi8KKworI2RlZmluZSBBUkNUWVBFX0lORVQ2CQkweGM0CS8qIElQbmcgKi8KKyNkZWZpbmUgQVJDVFlQRV9ESUFHTk9TRQkweDgwCS8qIGFzIHBlciBBTlNJL0FUQSA4NzguMSAqLwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9hdG11bmkzMS5oIGIvbGlicGNhcC0xLjMuMC9hdG11bmkzMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MGNjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2F0bXVuaTMxLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBZZW4gWWVuIExpbSBhbmQgTm9ydGggRGFrb3RhIFN0YXRlIFVuaXZlcnNpdHkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBZZW4gWWVuIExpbSBhbmQKKyAgICAgICAgTm9ydGggRGFrb3RhIFN0YXRlIFVuaXZlcnNpdHkKKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAqIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9hdG11bmkzMS5oLHYgMS4zIDIwMDctMTAtMjIgMTk6Mjg6NTggZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyogQmFzZWQgb24gVU5JMy4xIHN0YW5kYXJkIGJ5IEFUTSBGb3J1bSAqLworCisvKiBBVE0gdHJhZmZpYyB0eXBlcyBiYXNlZCBvbiBWUEk9MCBhbmQgKHRoZSBmb2xsb3dpbmcgVkNJICovCisjZGVmaW5lIFZDSV9QUEMJCQkweDA1CS8qIFBvaW50LXRvLXBvaW50IHNpZ25hbCBtc2cgKi8KKyNkZWZpbmUgVkNJX0JDQwkJCTB4MDIJLyogQnJvYWRjYXN0IHNpZ25hbCBtc2cgKi8KKyNkZWZpbmUgVkNJX09BTUY0U0MJCTB4MDMJLyogU2VnbWVudCBPQU0gRjQgZmxvdyBjZWxsICovCisjZGVmaW5lIFZDSV9PQU1GNEVDCQkweDA0CS8qIEVuZC10by1lbmQgT0FNIEY0IGZsb3cgY2VsbCAqLworI2RlZmluZSBWQ0lfTUVUQUMJCTB4MDEJLyogTWV0YSBzaWduYWwgbXNnICovCisjZGVmaW5lIFZDSV9JTE1JQwkJMHgxMAkvKiBJTE1JIG1zZyAqLworCisvKiBRLjI5MzEgc2lnbmFsbGluZyBtZXNzYWdlcyAqLworI2RlZmluZSBDQUxMX1BST0NFRUQJCTB4MDIJLyogY2FsbCBwcm9jZWVkaW5nICovCisjZGVmaW5lIENPTk5FQ1QJCQkweDA3CS8qIGNvbm5lY3QgKi8KKyNkZWZpbmUgQ09OTkVDVF9BQ0sJCTB4MGYJLyogY29ubmVjdF9hY2sgKi8KKyNkZWZpbmUgU0VUVVAJCQkweDA1CS8qIHNldHVwICovCisjZGVmaW5lIFJFTEVBU0UJCQkweDRkCS8qIHJlbGVhc2UgKi8KKyNkZWZpbmUgUkVMRUFTRV9ET05FCQkweDVhCS8qIHJlbGVhc2VfZG9uZSAqLworI2RlZmluZSBSRVNUQVJUCQkJMHg0NgkvKiByZXN0YXJ0ICovCisjZGVmaW5lIFJFU1RBUlRfQUNLCQkweDRlCS8qIHJlc3RhcnQgYWNrICovCisjZGVmaW5lIFNUQVRVUwkJCTB4N2QJLyogc3RhdHVzICovCisjZGVmaW5lIFNUQVRVU19FTlEJCTB4NzUJLyogc3RhdHVzIGFjayAqLworI2RlZmluZSBBRERfUEFSVFkJCTB4ODAJLyogYWRkIHBhcnR5ICovCisjZGVmaW5lIEFERF9QQVJUWV9BQ0sJCTB4ODEJLyogYWRkIHBhcnR5IGFjayAqLworI2RlZmluZSBBRERfUEFSVFlfUkVKCQkweDgyCS8qIGFkZCBwYXJ0eSByZWogKi8KKyNkZWZpbmUgRFJPUF9QQVJUWQkJMHg4MwkvKiBkcm9wIHBhcnR5ICovCisjZGVmaW5lIERST1BfUEFSVFlfQUNLCQkweDg0CS8qIGRyb3AgcGFydHkgYWNrICovCisKKy8qIEluZm9ybWF0aW9uIEVsZW1lbnQgUGFyYW1ldGVycyBpbiB0aGUgc2lnbmFsbGluZyBtZXNzYWdlcyAqLworI2RlZmluZSBDQVVTRQkJCTB4MDgJLyogY2F1c2UgKi8KKyNkZWZpbmUgRU5EUFRfUkVGCQkweDU0CS8qIGVuZHBvaW50IHJlZmVyZW5jZSAqLworI2RlZmluZSBBQUxfUEFSQQkJMHg1OAkvKiBBVE0gYWRhcHRhdGlvbiBsYXllciBwYXJhbWV0ZXJzICovCisjZGVmaW5lIFRSQUZGX0RFU0NSSVAJCTB4NTkJLyogYXRtIHRyYWZmaWMgZGVzY3JpcHRvcnMgKi8KKyNkZWZpbmUgQ09OTkVDVF9JRAkJMHg1YQkvKiBjb25uZWN0aW9uIGlkZW50aWZpZXIgKi8KKyNkZWZpbmUgUU9TX1BBUkEJCTB4NWMJLyogcXVhbGl0eSBvZiBzZXJ2aWNlIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgQl9ISUdIRVIJCTB4NWQJLyogYnJvYWRiYW5kIGhpZ2hlciBsYXllciBpbmZvcm1hdGlvbiAqLworI2RlZmluZSBCX0JFQVJFUgkJMHg1ZQkvKiBicm9hZGJhbmQgYmVhcmVyIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUgQl9MT1dFUgkJCTB4NWYJLyogYnJvYWRiYW5kIGxvd2VyIGluZm9ybWF0aW9uICovCisjZGVmaW5lIENBTExJTkdfUEFSVFkJCTB4NmMJLyogY2FsbGluZyBwYXJ0eSBudW1iZXIgKi8KKyNkZWZpbmUgQ0FMTEVEX1BBUlRZCQkweDcwCS8qIGNhbGxlZCBwYXJ0eSBubWJlciAqLworCisjZGVmaW5lIFEyOTMxCQkJMHgwOQorCisvKiBRLjI5MzEgc2lnbmFsbGluZyBnZW5lcmFsIG1lc3NhZ2VzIGZvcm1hdCAqLworI2RlZmluZSBQUk9UT19QT1MgICAgICAgMAkvKiBvZmZzZXQgb2YgcHJvdG9jb2wgZGlzY3JpbWluYXRvciAqLworI2RlZmluZSBDQUxMX1JFRl9QT1MgICAgMgkvKiBvZmZzZXQgb2YgY2FsbCByZWZlcmVuY2UgdmFsdWUgKi8KKyNkZWZpbmUgTVNHX1RZUEVfUE9TICAgIDUJLyogb2Zmc2V0IG9mIG1lc3NhZ2UgdHlwZSAqLworI2RlZmluZSBNU0dfTEVOX1BPUyAgICAgNwkvKiBvZmZzZXQgb2YgbWVzYWdlIGxlbmd0aCAqLworI2RlZmluZSBJRV9CRUdJTl9QT1MgICAgOQkvKiBvZmZzZXQgb2YgZmlyc3QgaW5mb3JtYXRpb24gZWxlbWVudCAqLworCisvKiBmb3JtYXQgb2Ygc2lnbmFsbGluZyBtZXNzYWdlcyAqLworI2RlZmluZSBUWVBFX1BPUwkwCisjZGVmaW5lIExFTl9QT1MJCTIKKyNkZWZpbmUgRklFTERfQkVHSU5fUE9TIDQKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvYnBmL25ldC9icGZfZmlsdGVyLmMgYi9saWJwY2FwLTEuMy4wL2JwZi9uZXQvYnBmX2ZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNGZiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2JwZi9uZXQvYnBmX2ZpbHRlci5jCkBAIC0wLDAgKzEsNjg2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgU3RhbmZvcmQvQ01VIGVuZXQgcGFja2V0IGZpbHRlciwKKyAqIChuZXQvZW5ldC5jKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIDQuM0JTRCwgYW5kIGNvZGUgY29udHJpYnV0ZWQKKyAqIHRvIEJlcmtlbGV5IGJ5IFN0ZXZlbiBNY0Nhbm5lIGFuZCBWYW4gSmFjb2Jzb24gYm90aCBvZiBMYXdyZW5jZQorICogQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIylicGYuYwk3LjUgKEJlcmtlbGV5KSA3LzE1LzkxCisgKi8KKworI2lmICEoZGVmaW5lZChsaW50KSB8fCBkZWZpbmVkKEtFUk5FTCkgfHwgZGVmaW5lZChfS0VSTkVMKSkKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9icGYvbmV0L2JwZl9maWx0ZXIuYyx2IDEuNDYgMjAwOC0wMS0wMiAwNDoxNjo0NiBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorCisjZWxzZSAvKiBXSU4zMiAqLworCisjaWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNkZWZpbmUJU09MQVJJUwkoZGVmaW5lZChzdW4pICYmIChkZWZpbmVkKF9fU1ZSNCkgfHwgZGVmaW5lZChfX3N2cjRfXykpKQorI2lmIGRlZmluZWQoX19ocHV4KSB8fCBTT0xBUklTCisjIGluY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyMgaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgorIyBkZWZpbmUJbWJ1Zgltc2diCisjIGRlZmluZQltX25leHQJYl9jb250CisjIGRlZmluZQlNTEVOKG0pCSgobSktPmJfd3B0ciAtIChtKS0+Yl9ycHRyKQorIyBkZWZpbmUJbXRvZChtLHQpCSgodCkobSktPmJfcnB0cikKKyNlbHNlIC8qIGRlZmluZWQoX19ocHV4KSB8fCBTT0xBUklTICovCisjIGRlZmluZQlNTEVOKG0pCSgobSktPm1fbGVuKQorI2VuZGlmIC8qIGRlZmluZWQoX19ocHV4KSB8fCBTT0xBUklTICovCisKKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaW5jbHVkZSA8cGNhcC9icGYuaD4KKworI2lmICFkZWZpbmVkKEtFUk5FTCkgJiYgIWRlZmluZWQoX0tFUk5FTCkKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjZGVmaW5lIGludDMyIGJwZl9pbnQzMgorI2RlZmluZSB1X2ludDMyIGJwZl91X2ludDMyCisKKyNpZm5kZWYgTEJMX0FMSUdOCisvKgorICogWFhYIC0gSUEtNjQ/ICBJZiBub3QsIHRoaXMgcHJvYmFibHkgd29uJ3Qgd29yayBvbiBXaW42NCBJQS02NAorICogc3lzdGVtcywgdW5sZXNzIExCTF9BTElHTiBpcyBkZWZpbmVkIGVsc2V3aGVyZSBmb3IgdGhlbS4KKyAqIFhYWCAtIFN1cGVySD8gIElmIG5vdCwgdGhpcyBwcm9iYWJseSB3b24ndCB3b3JrIG9uIFdpbkNFIFN1cGVySAorICogc3lzdGVtcywgdW5sZXNzIExCTF9BTElHTiBpcyBkZWZpbmVkIGVsc2V3aGVyZSBmb3IgdGhlbS4KKyAqLworI2lmIGRlZmluZWQoc3BhcmMpIHx8IGRlZmluZWQoX19zcGFyY19fKSB8fCBkZWZpbmVkKG1pcHMpIHx8IFwKKyAgICBkZWZpbmVkKGlibTAzMikgfHwgZGVmaW5lZChfX2FscGhhKSB8fCBkZWZpbmVkKF9faHB1eCkgfHwgXAorICAgIGRlZmluZWQoX19hcm1fXykKKyNkZWZpbmUgTEJMX0FMSUdOCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIExCTF9BTElHTgorI2lmbmRlZiBXSU4zMgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZgorCisjZGVmaW5lIEVYVFJBQ1RfU0hPUlQocCkJKCh1X3Nob3J0KW50b2hzKCoodV9zaG9ydCAqKXApKQorI2RlZmluZSBFWFRSQUNUX0xPTkcocCkJCShudG9obCgqKHVfaW50MzIgKilwKSkKKyNlbHNlCisjZGVmaW5lIEVYVFJBQ1RfU0hPUlQocClcCisJKCh1X3Nob3J0KVwKKwkJKCh1X3Nob3J0KSooKHVfY2hhciAqKXArMCk8PDh8XAorCQkgKHVfc2hvcnQpKigodV9jaGFyICopcCsxKTw8MCkpCisjZGVmaW5lIEVYVFJBQ1RfTE9ORyhwKVwKKwkJKCh1X2ludDMyKSooKHVfY2hhciAqKXArMCk8PDI0fFwKKwkJICh1X2ludDMyKSooKHVfY2hhciAqKXArMSk8PDE2fFwKKwkJICh1X2ludDMyKSooKHVfY2hhciAqKXArMik8PDh8XAorCQkgKHVfaW50MzIpKigodV9jaGFyICopcCszKTw8MCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKyMgaWYgIWRlZmluZWQoX19ocHV4KSAmJiAhU09MQVJJUworI2luY2x1ZGUgPHN5cy9tYnVmLmg+CisjIGVuZGlmCisjZGVmaW5lIE1JTkRFWChsZW4sIF9tLCBfaykgXAoreyBcCisJbGVuID0gTUxFTihtKTsgXAorCXdoaWxlICgoX2spID49IGxlbikgeyBcCisJCShfaykgLT0gbGVuOyBcCisJCShfbSkgPSAoX20pLT5tX25leHQ7IFwKKwkJaWYgKChfbSkgPT0gMCkgXAorCQkJcmV0dXJuIDA7IFwKKwkJbGVuID0gTUxFTihtKTsgXAorCX0gXAorfQorCitzdGF0aWMgaW50CittX3h3b3JkKG0sIGssIGVycikKKwlyZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbTsKKwlyZWdpc3RlciBpbnQgaywgKmVycjsKK3sKKwlyZWdpc3RlciBpbnQgbGVuOworCXJlZ2lzdGVyIHVfY2hhciAqY3AsICpucDsKKwlyZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbTA7CisKKwlNSU5ERVgobGVuLCBtLCBrKTsKKwljcCA9IG10b2QobSwgdV9jaGFyICopICsgazsKKwlpZiAobGVuIC0gayA+PSA0KSB7CisJCSplcnIgPSAwOworCQlyZXR1cm4gRVhUUkFDVF9MT05HKGNwKTsKKwl9CisJbTAgPSBtLT5tX25leHQ7CisJaWYgKG0wID09IDAgfHwgTUxFTihtMCkgKyBsZW4gLSBrIDwgNCkKKwkJZ290byBiYWQ7CisJKmVyciA9IDA7CisJbnAgPSBtdG9kKG0wLCB1X2NoYXIgKik7CisJc3dpdGNoIChsZW4gLSBrKSB7CisKKwljYXNlIDE6CisJCXJldHVybiAoY3BbMF0gPDwgMjQpIHwgKG5wWzBdIDw8IDE2KSB8IChucFsxXSA8PCA4KSB8IG5wWzJdOworCisJY2FzZSAyOgorCQlyZXR1cm4gKGNwWzBdIDw8IDI0KSB8IChjcFsxXSA8PCAxNikgfCAobnBbMF0gPDwgOCkgfCBucFsxXTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAoY3BbMF0gPDwgMjQpIHwgKGNwWzFdIDw8IDE2KSB8IChjcFsyXSA8PCA4KSB8IG5wWzBdOworCX0KKyAgICBiYWQ6CisJKmVyciA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21feGhhbGYobSwgaywgZXJyKQorCXJlZ2lzdGVyIHN0cnVjdCBtYnVmICptOworCXJlZ2lzdGVyIGludCBrLCAqZXJyOworeworCXJlZ2lzdGVyIGludCBsZW47CisJcmVnaXN0ZXIgdV9jaGFyICpjcDsKKwlyZWdpc3RlciBzdHJ1Y3QgbWJ1ZiAqbTA7CisKKwlNSU5ERVgobGVuLCBtLCBrKTsKKwljcCA9IG10b2QobSwgdV9jaGFyICopICsgazsKKwlpZiAobGVuIC0gayA+PSAyKSB7CisJCSplcnIgPSAwOworCQlyZXR1cm4gRVhUUkFDVF9TSE9SVChjcCk7CisJfQorCW0wID0gbS0+bV9uZXh0OworCWlmIChtMCA9PSAwKQorCQlnb3RvIGJhZDsKKwkqZXJyID0gMDsKKwlyZXR1cm4gKGNwWzBdIDw8IDgpIHwgbXRvZChtMCwgdV9jaGFyICopWzBdOworIGJhZDoKKwkqZXJyID0gMTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogRXhlY3V0ZSB0aGUgZmlsdGVyIHByb2dyYW0gc3RhcnRpbmcgYXQgcGMgb24gdGhlIHBhY2tldCBwCisgKiB3aXJlbGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsIHBhY2tldAorICogYnVmbGVuIGlzIHRoZSBhbW91bnQgb2YgZGF0YSBwcmVzZW50CisgKiBGb3IgdGhlIGtlcm5lbCwgcCBpcyBhc3N1bWVkIHRvIGJlIGEgcG9pbnRlciB0byBhbiBtYnVmIGlmIGJ1ZmxlbiBpcyAwLAorICogaW4gYWxsIG90aGVyIGNhc2VzLCBwIGlzIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBhbmQgYnVmbGVuIGlzIGl0cyBzaXplLgorICovCit1X2ludAorYnBmX2ZpbHRlcihwYywgcCwgd2lyZWxlbiwgYnVmbGVuKQorCXJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqcGM7CisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwOworCXVfaW50IHdpcmVsZW47CisJcmVnaXN0ZXIgdV9pbnQgYnVmbGVuOworeworCXJlZ2lzdGVyIHVfaW50MzIgQSwgWDsKKwlyZWdpc3RlciBpbnQgazsKKwlpbnQzMiBtZW1bQlBGX01FTVdPUkRTXTsKKyNpZiBkZWZpbmVkKEtFUk5FTCkgfHwgZGVmaW5lZChfS0VSTkVMKQorCXN0cnVjdCBtYnVmICptLCAqbjsKKwlpbnQgbWVyciwgbGVuOworCisJaWYgKGJ1ZmxlbiA9PSAwKSB7CisJCW0gPSAoc3RydWN0IG1idWYgKilwOworCQlwID0gbXRvZChtLCB1X2NoYXIgKik7CisJCWJ1ZmxlbiA9IE1MRU4obSk7CisJfSBlbHNlCisJCW0gPSBOVUxMOworI2VuZGlmCisKKwlpZiAocGMgPT0gMCkKKwkJLyoKKwkJICogTm8gZmlsdGVyIG1lYW5zIGFjY2VwdCBhbGwuCisJCSAqLworCQlyZXR1cm4gKHVfaW50KS0xOworCUEgPSAwOworCVggPSAwOworCS0tcGM7CisJd2hpbGUgKDEpIHsKKwkJKytwYzsKKwkJc3dpdGNoIChwYy0+Y29kZSkgeworCisJCWRlZmF1bHQ6CisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwkJCXJldHVybiAwOworI2Vsc2UKKwkJCWFib3J0KCk7CisjZW5kaWYKKwkJY2FzZSBCUEZfUkVUfEJQRl9LOgorCQkJcmV0dXJuICh1X2ludClwYy0+azsKKworCQljYXNlIEJQRl9SRVR8QlBGX0E6CisJCQlyZXR1cm4gKHVfaW50KUE7CisKKwkJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0FCUzoKKwkJCWsgPSBwYy0+azsKKwkJCWlmIChrICsgc2l6ZW9mKGludDMyKSA+IGJ1ZmxlbikgeworI2lmIGRlZmluZWQoS0VSTkVMKSB8fCBkZWZpbmVkKF9LRVJORUwpCisJCQkJaWYgKG0gPT0gTlVMTCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJQSA9IG1feHdvcmQobSwgaywgJm1lcnIpOworCQkJCWlmIChtZXJyICE9IDApCisJCQkJCXJldHVybiAwOworCQkJCWNvbnRpbnVlOworI2Vsc2UKKwkJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQkJfQorCQkJQSA9IEVYVFJBQ1RfTE9ORygmcFtrXSk7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9MRHxCUEZfSHxCUEZfQUJTOgorCQkJayA9IHBjLT5rOworCQkJaWYgKGsgKyBzaXplb2Yoc2hvcnQpID4gYnVmbGVuKSB7CisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwkJCQlpZiAobSA9PSBOVUxMKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlBID0gbV94aGFsZihtLCBrLCAmbWVycik7CisJCQkJaWYgKG1lcnIgIT0gMCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJY29udGludWU7CisjZWxzZQorCQkJCXJldHVybiAwOworI2VuZGlmCisJCQl9CisJCQlBID0gRVhUUkFDVF9TSE9SVCgmcFtrXSk7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9MRHxCUEZfQnxCUEZfQUJTOgorCQkJayA9IHBjLT5rOworCQkJaWYgKGsgPj0gYnVmbGVuKSB7CisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwkJCQlpZiAobSA9PSBOVUxMKQorCQkJCQlyZXR1cm4gMDsKKwkJCQluID0gbTsKKwkJCQlNSU5ERVgobGVuLCBuLCBrKTsKKwkJCQlBID0gbXRvZChuLCB1X2NoYXIgKilba107CisJCQkJY29udGludWU7CisjZWxzZQorCQkJCXJldHVybiAwOworI2VuZGlmCisJCQl9CisJCQlBID0gcFtrXTsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0xEfEJQRl9XfEJQRl9MRU46CisJCQlBID0gd2lyZWxlbjsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0xEWHxCUEZfV3xCUEZfTEVOOgorCQkJWCA9IHdpcmVsZW47CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9MRHxCUEZfV3xCUEZfSU5EOgorCQkJayA9IFggKyBwYy0+azsKKwkJCWlmIChrICsgc2l6ZW9mKGludDMyKSA+IGJ1ZmxlbikgeworI2lmIGRlZmluZWQoS0VSTkVMKSB8fCBkZWZpbmVkKF9LRVJORUwpCisJCQkJaWYgKG0gPT0gTlVMTCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJQSA9IG1feHdvcmQobSwgaywgJm1lcnIpOworCQkJCWlmIChtZXJyICE9IDApCisJCQkJCXJldHVybiAwOworCQkJCWNvbnRpbnVlOworI2Vsc2UKKwkJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQkJfQorCQkJQSA9IEVYVFJBQ1RfTE9ORygmcFtrXSk7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9MRHxCUEZfSHxCUEZfSU5EOgorCQkJayA9IFggKyBwYy0+azsKKwkJCWlmIChrICsgc2l6ZW9mKHNob3J0KSA+IGJ1ZmxlbikgeworI2lmIGRlZmluZWQoS0VSTkVMKSB8fCBkZWZpbmVkKF9LRVJORUwpCisJCQkJaWYgKG0gPT0gTlVMTCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJQSA9IG1feGhhbGYobSwgaywgJm1lcnIpOworCQkJCWlmIChtZXJyICE9IDApCisJCQkJCXJldHVybiAwOworCQkJCWNvbnRpbnVlOworI2Vsc2UKKwkJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQkJfQorCQkJQSA9IEVYVFJBQ1RfU0hPUlQoJnBba10pOworCQkJY29udGludWU7CisKKwkJY2FzZSBCUEZfTER8QlBGX0J8QlBGX0lORDoKKwkJCWsgPSBYICsgcGMtPms7CisJCQlpZiAoayA+PSBidWZsZW4pIHsKKyNpZiBkZWZpbmVkKEtFUk5FTCkgfHwgZGVmaW5lZChfS0VSTkVMKQorCQkJCWlmIChtID09IE5VTEwpCisJCQkJCXJldHVybiAwOworCQkJCW4gPSBtOworCQkJCU1JTkRFWChsZW4sIG4sIGspOworCQkJCUEgPSBtdG9kKG4sIHVfY2hhciAqKVtrXTsKKwkJCQljb250aW51ZTsKKyNlbHNlCisJCQkJcmV0dXJuIDA7CisjZW5kaWYKKwkJCX0KKwkJCUEgPSBwW2tdOworCQkJY29udGludWU7CisKKwkJY2FzZSBCUEZfTERYfEJQRl9NU0h8QlBGX0I6CisJCQlrID0gcGMtPms7CisJCQlpZiAoayA+PSBidWZsZW4pIHsKKyNpZiBkZWZpbmVkKEtFUk5FTCkgfHwgZGVmaW5lZChfS0VSTkVMKQorCQkJCWlmIChtID09IE5VTEwpCisJCQkJCXJldHVybiAwOworCQkJCW4gPSBtOworCQkJCU1JTkRFWChsZW4sIG4sIGspOworCQkJCVggPSAobXRvZChuLCBjaGFyICopW2tdICYgMHhmKSA8PCAyOworCQkJCWNvbnRpbnVlOworI2Vsc2UKKwkJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQkJfQorCQkJWCA9IChwW3BjLT5rXSAmIDB4ZikgPDwgMjsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0xEfEJQRl9JTU06CisJCQlBID0gcGMtPms7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9MRFh8QlBGX0lNTToKKwkJCVggPSBwYy0+azsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0xEfEJQRl9NRU06CisJCQlBID0gbWVtW3BjLT5rXTsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0xEWHxCUEZfTUVNOgorCQkJWCA9IG1lbVtwYy0+a107CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9TVDoKKwkJCW1lbVtwYy0+a10gPSBBOworCQkJY29udGludWU7CisKKwkJY2FzZSBCUEZfU1RYOgorCQkJbWVtW3BjLT5rXSA9IFg7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9KTVB8QlBGX0pBOgorI2lmIGRlZmluZWQoS0VSTkVMKSB8fCBkZWZpbmVkKF9LRVJORUwpCisJCQkvKgorCQkJICogTm8gYmFja3dhcmQganVtcHMgYWxsb3dlZC4KKwkJCSAqLworCQkJcGMgKz0gcGMtPms7CisjZWxzZQorCQkJLyoKKwkJCSAqIFhYWCAtIHdlIGN1cnJlbnRseSBpbXBsZW1lbnQgImlwNiBwcm90b2NoYWluIgorCQkJICogd2l0aCBiYWNrd2FyZCBqdW1wcywgc28gc2lnbi1leHRlbmQgcGMtPmsuCisJCQkgKi8KKwkJCXBjICs9IChicGZfaW50MzIpcGMtPms7CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0pNUHxCUEZfSkdUfEJQRl9LOgorCQkJcGMgKz0gKEEgPiBwYy0+aykgPyBwYy0+anQgOiBwYy0+amY7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9KTVB8QlBGX0pHRXxCUEZfSzoKKwkJCXBjICs9IChBID49IHBjLT5rKSA/IHBjLT5qdCA6IHBjLT5qZjsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0pNUHxCUEZfSkVRfEJQRl9LOgorCQkJcGMgKz0gKEEgPT0gcGMtPmspID8gcGMtPmp0IDogcGMtPmpmOworCQkJY29udGludWU7CisKKwkJY2FzZSBCUEZfSk1QfEJQRl9KU0VUfEJQRl9LOgorCQkJcGMgKz0gKEEgJiBwYy0+aykgPyBwYy0+anQgOiBwYy0+amY7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9KTVB8QlBGX0pHVHxCUEZfWDoKKwkJCXBjICs9IChBID4gWCkgPyBwYy0+anQgOiBwYy0+amY7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9KTVB8QlBGX0pHRXxCUEZfWDoKKwkJCXBjICs9IChBID49IFgpID8gcGMtPmp0IDogcGMtPmpmOworCQkJY29udGludWU7CisKKwkJY2FzZSBCUEZfSk1QfEJQRl9KRVF8QlBGX1g6CisJCQlwYyArPSAoQSA9PSBYKSA/IHBjLT5qdCA6IHBjLT5qZjsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0pNUHxCUEZfSlNFVHxCUEZfWDoKKwkJCXBjICs9IChBICYgWCkgPyBwYy0+anQgOiBwYy0+amY7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX0FERHxCUEZfWDoKKwkJCUEgKz0gWDsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0FMVXxCUEZfU1VCfEJQRl9YOgorCQkJQSAtPSBYOworCQkJY29udGludWU7CisKKwkJY2FzZSBCUEZfQUxVfEJQRl9NVUx8QlBGX1g6CisJCQlBICo9IFg7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX0RJVnxCUEZfWDoKKwkJCWlmIChYID09IDApCisJCQkJcmV0dXJuIDA7CisJCQlBIC89IFg7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX0FORHxCUEZfWDoKKwkJCUEgJj0gWDsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0FMVXxCUEZfT1J8QlBGX1g6CisJCQlBIHw9IFg7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX0xTSHxCUEZfWDoKKwkJCUEgPDw9IFg7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX1JTSHxCUEZfWDoKKwkJCUEgPj49IFg7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX0FERHxCUEZfSzoKKwkJCUEgKz0gcGMtPms7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX1NVQnxCUEZfSzoKKwkJCUEgLT0gcGMtPms7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX01VTHxCUEZfSzoKKwkJCUEgKj0gcGMtPms7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX0RJVnxCUEZfSzoKKwkJCUEgLz0gcGMtPms7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX0FORHxCUEZfSzoKKwkJCUEgJj0gcGMtPms7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX09SfEJQRl9LOgorCQkJQSB8PSBwYy0+azsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX0FMVXxCUEZfTFNIfEJQRl9LOgorCQkJQSA8PD0gcGMtPms7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9BTFV8QlBGX1JTSHxCUEZfSzoKKwkJCUEgPj49IHBjLT5rOworCQkJY29udGludWU7CisKKwkJY2FzZSBCUEZfQUxVfEJQRl9ORUc6CisJCQlBID0gLUE7CisJCQljb250aW51ZTsKKworCQljYXNlIEJQRl9NSVNDfEJQRl9UQVg6CisJCQlYID0gQTsKKwkJCWNvbnRpbnVlOworCisJCWNhc2UgQlBGX01JU0N8QlBGX1RYQToKKwkJCUEgPSBYOworCQkJY29udGludWU7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgJ2Zjb2RlJyBpcyBhIHZhbGlkIGZpbHRlciBwcm9ncmFtLgorICogVGhlIGNvbnN0cmFpbnRzIGFyZSB0aGF0IGVhY2gganVtcCBiZSBmb3J3YXJkIGFuZCB0byBhIHZhbGlkCisgKiBjb2RlLCB0aGF0IG1lbW9yeSBhY2Nlc3NlcyBhcmUgd2l0aGluIHZhbGlkIHJhbmdlcyAodG8gdGhlCisgKiBleHRlbnQgdGhhdCB0aGlzIGNhbiBiZSBjaGVja2VkIHN0YXRpY2FsbHk7IGxvYWRzIG9mIHBhY2tldAorICogZGF0YSBoYXZlIHRvIGJlLCBhbmQgYXJlLCBhbHNvIGNoZWNrZWQgYXQgcnVuIHRpbWUpLCBhbmQgdGhhdAorICogdGhlIGNvZGUgdGVybWluYXRlcyB3aXRoIGVpdGhlciBhbiBhY2NlcHQgb3IgcmVqZWN0LgorICoKKyAqIFRoZSBrZXJuZWwgbmVlZHMgdG8gYmUgYWJsZSB0byB2ZXJpZnkgYW4gYXBwbGljYXRpb24ncyBmaWx0ZXIgY29kZS4KKyAqIE90aGVyd2lzZSwgYSBib2d1cyBwcm9ncmFtIGNvdWxkIGVhc2lseSBjcmFzaCB0aGUgc3lzdGVtLgorICovCitpbnQKK2JwZl92YWxpZGF0ZShmLCBsZW4pCisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICpmOworCWludCBsZW47Cit7CisJdV9pbnQgaSwgZnJvbTsKKwljb25zdCBzdHJ1Y3QgYnBmX2luc24gKnA7CisKKwlpZiAobGVuIDwgMSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBUaGVyZSdzIG5vIG1heGltdW0gcHJvZ3JhbSBsZW5ndGggaW4gdXNlcmxhbmQuCisJICovCisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwlpZiAobGVuID4gQlBGX01BWElOU05TKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCXAgPSAmZltpXTsKKwkJc3dpdGNoIChCUEZfQ0xBU1MocC0+Y29kZSkpIHsKKwkJLyoKKwkJICogQ2hlY2sgdGhhdCBtZW1vcnkgb3BlcmF0aW9ucyB1c2UgdmFsaWQgYWRkcmVzc2VzLgorCQkgKi8KKwkJY2FzZSBCUEZfTEQ6CisJCWNhc2UgQlBGX0xEWDoKKwkJCXN3aXRjaCAoQlBGX01PREUocC0+Y29kZSkpIHsKKwkJCWNhc2UgQlBGX0lNTToKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX0FCUzoKKwkJCWNhc2UgQlBGX0lORDoKKwkJCWNhc2UgQlBGX01TSDoKKwkJCQkvKgorCQkJCSAqIFRoZXJlJ3Mgbm8gbWF4aW11bSBwYWNrZXQgZGF0YSBzaXplCisJCQkJICogaW4gdXNlcmxhbmQuICBUaGUgcnVudGltZSBwYWNrZXQgbGVuZ3RoCisJCQkJICogY2hlY2sgc3VmZmljZXMuCisJCQkJICovCisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwkJCQkvKgorCQkJCSAqIE1vcmUgc3RyaWN0IGNoZWNrIHdpdGggYWN0dWFsIHBhY2tldCBsZW5ndGgKKwkJCQkgKiBpcyBkb25lIHJ1bnRpbWUuCisJCQkJICovCisJCQkJaWYgKHAtPmsgPj0gYnBmX21heGJ1ZnNpemUpCisJCQkJCXJldHVybiAwOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIEJQRl9NRU06CisJCQkJaWYgKHAtPmsgPj0gQlBGX01FTVdPUkRTKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX0xFTjoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCUEZfU1Q6CisJCWNhc2UgQlBGX1NUWDoKKwkJCWlmIChwLT5rID49IEJQRl9NRU1XT1JEUykKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQljYXNlIEJQRl9BTFU6CisJCQlzd2l0Y2ggKEJQRl9PUChwLT5jb2RlKSkgeworCQkJY2FzZSBCUEZfQUREOgorCQkJY2FzZSBCUEZfU1VCOgorCQkJY2FzZSBCUEZfTVVMOgorCQkJY2FzZSBCUEZfT1I6CisJCQljYXNlIEJQRl9BTkQ6CisJCQljYXNlIEJQRl9MU0g6CisJCQljYXNlIEJQRl9SU0g6CisJCQljYXNlIEJQRl9ORUc6CisJCQkJYnJlYWs7CisJCQljYXNlIEJQRl9ESVY6CisJCQkJLyoKKwkJCQkgKiBDaGVjayBmb3IgY29uc3RhbnQgZGl2aXNpb24gYnkgMC4KKwkJCQkgKi8KKwkJCQlpZiAoQlBGX1NSQyhwLT5jb2RlKSA9PSBCUEZfSyAmJiBwLT5rID09IDApCisJCQkJCXJldHVybiAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEJQRl9KTVA6CisJCQkvKgorCQkJICogQ2hlY2sgdGhhdCBqdW1wcyBhcmUgd2l0aGluIHRoZSBjb2RlIGJsb2NrLAorCQkJICogYW5kIHRoYXQgdW5jb25kaXRpb25hbCBicmFuY2hlcyBkb24ndCBnbworCQkJICogYmFja3dhcmRzIGFzIGEgcmVzdWx0IG9mIGFuIG92ZXJmbG93LgorCQkJICogVW5jb25kaXRpb25hbCBicmFuY2hlcyBoYXZlIGEgMzItYml0IG9mZnNldCwKKwkJCSAqIHNvIHRoZXkgY291bGQgb3ZlcmZsb3c7IHdlIGNoZWNrIHRvIG1ha2UKKwkJCSAqIHN1cmUgdGhleSBkb24ndC4gIENvbmRpdGlvbmFsIGJyYW5jaGVzIGhhdmUKKwkJCSAqIGFuIDgtYml0IG9mZnNldCwgYW5kIHRoZSBmcm9tIGFkZHJlc3MgaXMgPD0KKwkJCSAqIEJQRl9NQVhJTlNOUywgYW5kIHdlIGFzc3VtZSB0aGF0IEJQRl9NQVhJTlNOUworCQkJICogaXMgc3VmZmljaWVudGx5IHNtYWxsIHRoYXQgYWRkaW5nIDI1NSB0byBpdAorCQkJICogd29uJ3Qgb3ZlcmZsb3cuCisJCQkgKgorCQkJICogV2Uga25vdyB0aGF0IGxlbiBpcyA8PSBCUEZfTUFYSU5TTlMsIGFuZCB3ZQorCQkJICogYXNzdW1lIHRoYXQgQlBGX01BWElOU05TIGlzIDwgdGhlIG1heGltdW0gc2l6ZQorCQkJICogb2YgYSB1X2ludCwgc28gdGhhdCBpICsgMSBkb2Vzbid0IG92ZXJmbG93LgorCQkJICoKKwkJCSAqIEZvciB1c2VybGFuZCwgd2UgZG9uJ3Qga25vdyB0aGF0IHRoZSBmcm9tCisJCQkgKiBvciBsZW4gYXJlIDw9IEJQRl9NQVhJTlNOUywgYnV0IHdlIGtub3cgdGhhdAorCQkJICogZnJvbSA8PSBsZW4sIGFuZCwgZXhjZXB0IG9uIGEgNjQtYml0IHN5c3RlbSwKKwkJCSAqIGl0J3MgdW5saWtlbHkgdGhhdCBsZW4sIGlmIGl0IHRydWx5IHJlZmxlY3RzCisJCQkgKiB0aGUgc2l6ZSBvZiB0aGUgcHJvZ3JhbSB3ZSd2ZSBiZWVuIGhhbmRlZCwKKwkJCSAqIHdpbGwgYmUgYW55d2hlcmUgbmVhciB0aGUgbWF4aW11bSBzaXplIG9mCisJCQkgKiBhIHVfaW50LiAgV2UgYWxzbyBkb24ndCBjaGVjayBmb3IgYmFja3dhcmQKKwkJCSAqIGJyYW5jaGVzLCBhcyB3ZSBjdXJyZW50bHkgc3VwcG9ydCB0aGVtIGluCisJCQkgKiB1c2VybGFuZCBmb3IgdGhlIHByb3RvY2hhaW4gb3BlcmF0aW9uLgorCQkJICovCisJCQlmcm9tID0gaSArIDE7CisJCQlzd2l0Y2ggKEJQRl9PUChwLT5jb2RlKSkgeworCQkJY2FzZSBCUEZfSkE6CisjaWYgZGVmaW5lZChLRVJORUwpIHx8IGRlZmluZWQoX0tFUk5FTCkKKwkJCQlpZiAoZnJvbSArIHAtPmsgPCBmcm9tIHx8IGZyb20gKyBwLT5rID49IGxlbikKKyNlbHNlCisJCQkJaWYgKGZyb20gKyBwLT5rID49IGxlbikKKyNlbmRpZgorCQkJCQlyZXR1cm4gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQlBGX0pFUToKKwkJCWNhc2UgQlBGX0pHVDoKKwkJCWNhc2UgQlBGX0pHRToKKwkJCWNhc2UgQlBGX0pTRVQ6CisJCQkJaWYgKGZyb20gKyBwLT5qdCA+PSBsZW4gfHwgZnJvbSArIHAtPmpmID49IGxlbikKKwkJCQkJcmV0dXJuIDA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQlBGX1JFVDoKKwkJCWJyZWFrOworCQljYXNlIEJQRl9NSVNDOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gQlBGX0NMQVNTKGZbbGVuIC0gMV0uY29kZSkgPT0gQlBGX1JFVDsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvYnBmX2R1bXAuYyBiL2xpYnBjYXAtMS4zLjAvYnBmX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZmNGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9icGZfZHVtcC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvYnBmX2R1bXAuYyx2IDEuMTUgMjAwOC0wMS0wMiAwNDoxNjo0NiBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit2b2lkCiticGZfZHVtcChjb25zdCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnAsIGludCBvcHRpb24pCit7CisJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuOworCWludCBpOworCWludCBuID0gcC0+YmZfbGVuOworCisJaW5zbiA9IHAtPmJmX2luc25zOworCWlmIChvcHRpb24gPiAyKSB7CisJCXByaW50ZigiJWRcbiIsIG4pOworCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpbnNuLCArK2kpIHsKKwkJCXByaW50ZigiJXUgJXUgJXUgJXVcbiIsIGluc24tPmNvZGUsCisJCQkgICAgICAgaW5zbi0+anQsIGluc24tPmpmLCBpbnNuLT5rKTsKKwkJfQorCQlyZXR1cm4gOworCX0KKwlpZiAob3B0aW9uID4gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpbnNuLCArK2kpCisJCQlwcmludGYoInsgMHgleCwgJWQsICVkLCAweCUwOHggfSxcbiIsCisJCQkgICAgICAgaW5zbi0+Y29kZSwgaW5zbi0+anQsIGluc24tPmpmLCBpbnNuLT5rKTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpbnNuLCArK2kpIHsKKyNpZmRlZiBCREVCVUcKKwkJZXh0ZXJuIGludCBiaWRzW107CisJCXByaW50ZihiaWRzW2ldID4gMCA/ICJbJTAyZF0iIDogIiAtLSAiLCBiaWRzW2ldIC0gMSk7CisjZW5kaWYKKwkJcHV0cyhicGZfaW1hZ2UoaW5zbiwgaSkpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvYnBmX2ltYWdlLmMgYi9saWJwY2FwLTEuMy4wL2JwZl9pbWFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjFhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2JwZl9pbWFnZS5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvYnBmX2ltYWdlLmMsdiAxLjI4IDIwMDgtMDEtMDIgMDQ6MTY6NDYgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZSAvKiBXSU4zMiAqLworI2lmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogV0lOMzIgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaWZkZWYgSEFWRV9PU19QUk9UT19ICisjaW5jbHVkZSAib3MtcHJvdG8uaCIKKyNlbmRpZgorCitjaGFyICoKK2JwZl9pbWFnZShwLCBuKQorCWNvbnN0IHN0cnVjdCBicGZfaW5zbiAqcDsKKwlpbnQgbjsKK3sKKwlpbnQgdjsKKwljb25zdCBjaGFyICpmbXQsICpvcDsKKwlzdGF0aWMgY2hhciBpbWFnZVsyNTZdOworCWNoYXIgb3BlcmFuZFs2NF07CisKKwl2ID0gcC0+azsKKwlzd2l0Y2ggKHAtPmNvZGUpIHsKKworCWRlZmF1bHQ6CisJCW9wID0gInVuaW1wIjsKKwkJZm10ID0gIjB4JXgiOworCQl2ID0gcC0+Y29kZTsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9SRVR8QlBGX0s6CisJCW9wID0gInJldCI7CisJCWZtdCA9ICIjJWQiOworCQlicmVhazsKKworCWNhc2UgQlBGX1JFVHxCUEZfQToKKwkJb3AgPSAicmV0IjsKKwkJZm10ID0gIiI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfTER8QlBGX1d8QlBGX0FCUzoKKwkJb3AgPSAibGQiOworCQlmbXQgPSAiWyVkXSI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfTER8QlBGX0h8QlBGX0FCUzoKKwkJb3AgPSAibGRoIjsKKwkJZm10ID0gIlslZF0iOworCQlicmVhazsKKworCWNhc2UgQlBGX0xEfEJQRl9CfEJQRl9BQlM6CisJCW9wID0gImxkYiI7CisJCWZtdCA9ICJbJWRdIjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRHxCUEZfV3xCUEZfTEVOOgorCQlvcCA9ICJsZCI7CisJCWZtdCA9ICIjcGt0bGVuIjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRHxCUEZfV3xCUEZfSU5EOgorCQlvcCA9ICJsZCI7CisJCWZtdCA9ICJbeCArICVkXSI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfTER8QlBGX0h8QlBGX0lORDoKKwkJb3AgPSAibGRoIjsKKwkJZm10ID0gIlt4ICsgJWRdIjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRHxCUEZfQnxCUEZfSU5EOgorCQlvcCA9ICJsZGIiOworCQlmbXQgPSAiW3ggKyAlZF0iOworCQlicmVhazsKKworCWNhc2UgQlBGX0xEfEJQRl9JTU06CisJCW9wID0gImxkIjsKKwkJZm10ID0gIiMweCV4IjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRFh8QlBGX0lNTToKKwkJb3AgPSAibGR4IjsKKwkJZm10ID0gIiMweCV4IjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRFh8QlBGX01TSHxCUEZfQjoKKwkJb3AgPSAibGR4YiI7CisJCWZtdCA9ICI0KihbJWRdJjB4ZikiOworCQlicmVhazsKKworCWNhc2UgQlBGX0xEfEJQRl9NRU06CisJCW9wID0gImxkIjsKKwkJZm10ID0gIk1bJWRdIjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRFh8QlBGX01FTToKKwkJb3AgPSAibGR4IjsKKwkJZm10ID0gIk1bJWRdIjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9TVDoKKwkJb3AgPSAic3QiOworCQlmbXQgPSAiTVslZF0iOworCQlicmVhazsKKworCWNhc2UgQlBGX1NUWDoKKwkJb3AgPSAic3R4IjsKKwkJZm10ID0gIk1bJWRdIjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9KTVB8QlBGX0pBOgorCQlvcCA9ICJqYSI7CisJCWZtdCA9ICIlZCI7CisJCXYgPSBuICsgMSArIHAtPms7CisJCWJyZWFrOworCisJY2FzZSBCUEZfSk1QfEJQRl9KR1R8QlBGX0s6CisJCW9wID0gImpndCI7CisJCWZtdCA9ICIjMHgleCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfSk1QfEJQRl9KR0V8QlBGX0s6CisJCW9wID0gImpnZSI7CisJCWZtdCA9ICIjMHgleCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfSk1QfEJQRl9KRVF8QlBGX0s6CisJCW9wID0gImplcSI7CisJCWZtdCA9ICIjMHgleCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfSk1QfEJQRl9KU0VUfEJQRl9LOgorCQlvcCA9ICJqc2V0IjsKKwkJZm10ID0gIiMweCV4IjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9KTVB8QlBGX0pHVHxCUEZfWDoKKwkJb3AgPSAiamd0IjsKKwkJZm10ID0gIngiOworCQlicmVhazsKKworCWNhc2UgQlBGX0pNUHxCUEZfSkdFfEJQRl9YOgorCQlvcCA9ICJqZ2UiOworCQlmbXQgPSAieCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfSk1QfEJQRl9KRVF8QlBGX1g6CisJCW9wID0gImplcSI7CisJCWZtdCA9ICJ4IjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9KTVB8QlBGX0pTRVR8QlBGX1g6CisJCW9wID0gImpzZXQiOworCQlmbXQgPSAieCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQUxVfEJQRl9BRER8QlBGX1g6CisJCW9wID0gImFkZCI7CisJCWZtdCA9ICJ4IjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9BTFV8QlBGX1NVQnxCUEZfWDoKKwkJb3AgPSAic3ViIjsKKwkJZm10ID0gIngiOworCQlicmVhazsKKworCWNhc2UgQlBGX0FMVXxCUEZfTVVMfEJQRl9YOgorCQlvcCA9ICJtdWwiOworCQlmbXQgPSAieCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQUxVfEJQRl9ESVZ8QlBGX1g6CisJCW9wID0gImRpdiI7CisJCWZtdCA9ICJ4IjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9BTFV8QlBGX0FORHxCUEZfWDoKKwkJb3AgPSAiYW5kIjsKKwkJZm10ID0gIngiOworCQlicmVhazsKKworCWNhc2UgQlBGX0FMVXxCUEZfT1J8QlBGX1g6CisJCW9wID0gIm9yIjsKKwkJZm10ID0gIngiOworCQlicmVhazsKKworCWNhc2UgQlBGX0FMVXxCUEZfTFNIfEJQRl9YOgorCQlvcCA9ICJsc2giOworCQlmbXQgPSAieCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQUxVfEJQRl9SU0h8QlBGX1g6CisJCW9wID0gInJzaCI7CisJCWZtdCA9ICJ4IjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9BTFV8QlBGX0FERHxCUEZfSzoKKwkJb3AgPSAiYWRkIjsKKwkJZm10ID0gIiMlZCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQUxVfEJQRl9TVUJ8QlBGX0s6CisJCW9wID0gInN1YiI7CisJCWZtdCA9ICIjJWQiOworCQlicmVhazsKKworCWNhc2UgQlBGX0FMVXxCUEZfTVVMfEJQRl9LOgorCQlvcCA9ICJtdWwiOworCQlmbXQgPSAiIyVkIjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9BTFV8QlBGX0RJVnxCUEZfSzoKKwkJb3AgPSAiZGl2IjsKKwkJZm10ID0gIiMlZCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQUxVfEJQRl9BTkR8QlBGX0s6CisJCW9wID0gImFuZCI7CisJCWZtdCA9ICIjMHgleCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQUxVfEJQRl9PUnxCUEZfSzoKKwkJb3AgPSAib3IiOworCQlmbXQgPSAiIzB4JXgiOworCQlicmVhazsKKworCWNhc2UgQlBGX0FMVXxCUEZfTFNIfEJQRl9LOgorCQlvcCA9ICJsc2giOworCQlmbXQgPSAiIyVkIjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9BTFV8QlBGX1JTSHxCUEZfSzoKKwkJb3AgPSAicnNoIjsKKwkJZm10ID0gIiMlZCI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQUxVfEJQRl9ORUc6CisJCW9wID0gIm5lZyI7CisJCWZtdCA9ICIiOworCQlicmVhazsKKworCWNhc2UgQlBGX01JU0N8QlBGX1RBWDoKKwkJb3AgPSAidGF4IjsKKwkJZm10ID0gIiI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfTUlTQ3xCUEZfVFhBOgorCQlvcCA9ICJ0eGEiOworCQlmbXQgPSAiIjsKKwkJYnJlYWs7CisJfQorCSh2b2lkKXNucHJpbnRmKG9wZXJhbmQsIHNpemVvZiBvcGVyYW5kLCBmbXQsIHYpOworCSh2b2lkKXNucHJpbnRmKGltYWdlLCBzaXplb2YgaW1hZ2UsCisJCSAgICAgIChCUEZfQ0xBU1MocC0+Y29kZSkgPT0gQlBGX0pNUCAmJgorCQkgICAgICAgQlBGX09QKHAtPmNvZGUpICE9IEJQRl9KQSkgPworCQkgICAgICAiKCUwM2QpICUtOHMgJS0xNnMganQgJWRcdGpmICVkIgorCQkgICAgICA6ICIoJTAzZCkgJS04cyAlcyIsCisJCSAgICAgIG4sIG9wLCBvcGVyYW5kLCBuICsgMSArIHAtPmp0LCBuICsgMSArIHAtPmpmKTsKKwlyZXR1cm4gaW1hZ2U7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2NobW9kX2JwZiBiL2xpYnBjYXAtMS4zLjAvY2htb2RfYnBmCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBhMzBkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2NobW9kX2JwZgpAQCAtMCwwICsxLDE5IEBACisjISAvYmluL3NoCisKKyMKKyMgVW5mb3J0dW5hdGVseSwgTWFjIE9TIFgncyBkZXZmcyBpcyBiYXNlZCBvbiB0aGUgb2xkIEZyZWVCU0QKKyMgb25lLCBub3QgdGhlIGN1cnJlbnQgb25lLCBzbyB0aGVyZSdzIG5vIHdheSB0byBjb25maWd1cmUgaXQKKyMgdG8gY3JlYXRlIEJQRiBkZXZpY2VzIHdpdGggcGFydGljdWxhciBvd25lcnMgb3IgZ3JvdXBzLgorIyBUaGlzIHN0YXJ0dXAgaXRlbSB3aWxsIG1ha2UgaXQgb3duZWQgYnkgdGhlIGFkbWluIGdyb3VwLAorIyB3aXRoIHBlcm1pc3Npb25zIHJ3LXJ3LS0tLSwgc28gdGhhdCBhbnlib2R5IGluIHRoZSBhZG1pbgorIyBncm91cCBjYW4gdXNlIHByb2dyYW1zIHRoYXQgY2FwdHVyZSBvciBzZW5kIHJhdyBwYWNrZXRzLgorIworIyBDaGFuZ2UgdGhpcyBhcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBzaXRlLCBlLmcuIHRvIG1ha2UKKyMgaXQgb3duZWQgYnkgYSBwYXJ0aWN1bGFyIHVzZXIgd2l0aG91dCBjaGFuZ2luZyB0aGUgcGVybWlzc2lvbnMsCisjIHNvIG9ubHkgdGhhdCB1c2VyIGFuZCB0aGUgc3VwZXItdXNlciBjYW4gY2FwdHVyZSBvciBzZW5kIHJhdworIyBwYWNrZXRzLCBvciBnaXZlIGl0IHRoZSBwZXJtaXNzaW9ucyBydy1yLS0tLS0sIHNvIHRoYXQKKyMgb25seSB0aGUgc3VwZXItdXNlciBjYW4gc2VuZCByYXcgcGFja2V0cyBidXQgYW55Ym9keSBpbiB0aGUKKyMgYWRtaW4gZ3JvdXAgY2FuIGNhcHR1cmUgcGFja2V0cy4KKyMKK2NoZ3JwIGFkbWluIC9kZXYvYnBmKgorY2htb2QgZytydyAvZGV2L2JwZioKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvY29uZmlnLmd1ZXNzIGIvbGlicGNhcC0xLjMuMC9jb25maWcuZ3Vlc3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzIyNDZhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvY29uZmlnLmd1ZXNzCkBAIC0wLDAgKzEsMTUwMiBAQAorIyEgL2Jpbi9zaAorIyBBdHRlbXB0IHRvIGd1ZXNzIGEgY2Fub25pY2FsIHN5c3RlbSBuYW1lLgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAwOS0xMi0zMCcKKworIyBUaGlzIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisjCisjIEFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpZiB5b3UKKyMgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgYXMgcGFydCBvZiBhIHByb2dyYW0gdGhhdCBjb250YWlucyBhCisjIGNvbmZpZ3VyYXRpb24gc2NyaXB0IGdlbmVyYXRlZCBieSBBdXRvY29uZiwgeW91IG1heSBpbmNsdWRlIGl0IHVuZGVyCisjIHRoZSBzYW1lIGRpc3RyaWJ1dGlvbiB0ZXJtcyB0aGF0IHlvdSB1c2UgZm9yIHRoZSByZXN0IG9mIHRoYXQgcHJvZ3JhbS4KKworCisjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4gIFBsZWFzZSBzZW5kIHBhdGNoZXMgKGNvbnRleHQKKyMgZGlmZiBmb3JtYXQpIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPiBhbmQgaW5jbHVkZSBhIENoYW5nZUxvZworIyBlbnRyeS4KKyMKKyMgVGhpcyBzY3JpcHQgYXR0ZW1wdHMgdG8gZ3Vlc3MgYSBjYW5vbmljYWwgc3lzdGVtIG5hbWUgc2ltaWxhciB0bworIyBjb25maWcuc3ViLiAgSWYgaXQgc3VjY2VlZHMsIGl0IHByaW50cyB0aGUgc3lzdGVtIG5hbWUgb24gc3Rkb3V0LCBhbmQKKyMgZXhpdHMgd2l0aCAwLiAgT3RoZXJ3aXNlLCBpdCBleGl0cyB3aXRoIDEuCisjCisjIFlvdSBjYW4gZ2V0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIHNjcmlwdCBmcm9tOgorIyBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0KKworT3V0cHV0IHRoZSBjb25maWd1cmF0aW9uIG5hbWUgb2YgdGhlIHN5c3RlbSBcYCRtZScgaXMgcnVuIG9uLgorCitPcGVyYXRpb24gbW9kZXM6CisgIC1oLCAtLWhlbHAgICAgICAgICBwcmludCB0aGlzIGhlbHAsIHRoZW4gZXhpdAorICAtdCwgLS10aW1lLXN0YW1wICAgcHJpbnQgZGF0ZSBvZiBsYXN0IG1vZGlmaWNhdGlvbiwgdGhlbiBleGl0CisgIC12LCAtLXZlcnNpb24gICAgICBwcmludCB2ZXJzaW9uIG51bWJlciwgdGhlbiBleGl0CisKK1JlcG9ydCBidWdzIGFuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4iCisKK3ZlcnNpb249IlwKK0dOVSBjb25maWcuZ3Vlc3MgKCR0aW1lc3RhbXApCisKK09yaWdpbmFsbHkgd3JpdHRlbiBieSBQZXIgQm90aG5lci4KK0NvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMCwKKzIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIgorCitoZWxwPSIKK1RyeSBcYCRtZSAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIKKworIyBQYXJzZSBjb21tYW5kIGxpbmUKK3doaWxlIHRlc3QgJCMgLWd0IDAgOyBkbworICBjYXNlICQxIGluCisgICAgLS10aW1lLXN0YW1wIHwgLS10aW1lKiB8IC10ICkKKyAgICAgICBlY2hvICIkdGltZXN0YW1wIiA7IGV4aXQgOzsKKyAgICAtLXZlcnNpb24gfCAtdiApCisgICAgICAgZWNobyAiJHZlcnNpb24iIDsgZXhpdCA7OworICAgIC0taGVscCB8IC0taCogfCAtaCApCisgICAgICAgZWNobyAiJHVzYWdlIjsgZXhpdCA7OworICAgIC0tICkgICAgICMgU3RvcCBvcHRpb24gcHJvY2Vzc2luZworICAgICAgIHNoaWZ0OyBicmVhayA7OworICAgIC0gKQkjIFVzZSBzdGRpbiBhcyBpbnB1dC4KKyAgICAgICBicmVhayA7OworICAgIC0qICkKKyAgICAgICBlY2hvICIkbWU6IGludmFsaWQgb3B0aW9uICQxJGhlbHAiID4mMgorICAgICAgIGV4aXQgMSA7OworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworaWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgIGVjaG8gIiRtZTogdG9vIG1hbnkgYXJndW1lbnRzJGhlbHAiID4mMgorICBleGl0IDEKK2ZpCisKK3RyYXAgJ2V4aXQgMScgMSAyIDE1CisKKyMgQ0NfRk9SX0JVSUxEIC0tIGNvbXBpbGVyIHVzZWQgYnkgdGhpcyBzY3JpcHQuIE5vdGUgdGhhdCB0aGUgdXNlIG9mIGEKKyMgY29tcGlsZXIgdG8gYWlkIGluIHN5c3RlbSBkZXRlY3Rpb24gaXMgZGlzY291cmFnZWQgYXMgaXQgcmVxdWlyZXMKKyMgdGVtcG9yYXJ5IGZpbGVzIHRvIGJlIGNyZWF0ZWQgYW5kLCBhcyB5b3UgY2FuIHNlZSBiZWxvdywgaXQgaXMgYQorIyBoZWFkYWNoZSB0byBkZWFsIHdpdGggaW4gYSBwb3J0YWJsZSBmYXNoaW9uLgorCisjIEhpc3RvcmljYWxseSwgYENDX0ZPUl9CVUlMRCcgdXNlZCB0byBiZSBuYW1lZCBgSE9TVF9DQycuIFdlIHN0aWxsCisjIHVzZSBgSE9TVF9DQycgaWYgZGVmaW5lZCwgYnV0IGl0IGlzIGRlcHJlY2F0ZWQuCisKKyMgUG9ydGFibGUgdG1wIGRpcmVjdG9yeSBjcmVhdGlvbiBpbnNwaXJlZCBieSB0aGUgQXV0b2NvbmYgdGVhbS4KKworc2V0X2NjX2Zvcl9idWlsZD0nCit0cmFwICJleGl0Y29kZT1cJD87IChybSAtZiBcJHRtcGZpbGVzIDI+L2Rldi9udWxsOyBybWRpciBcJHRtcCAyPi9kZXYvbnVsbCkgJiYgZXhpdCBcJGV4aXRjb2RlIiAwIDsKK3RyYXAgInJtIC1mIFwkdG1wZmlsZXMgMj4vZGV2L251bGw7IHJtZGlyIFwkdG1wIDI+L2Rldi9udWxsOyBleGl0IDEiIDEgMiAxMyAxNSA7Cis6ICR7VE1QRElSPS90bXB9IDsKKyB7IHRtcD1gKHVtYXNrIDA3NyAmJiBta3RlbXAgLWQgIiRUTVBESVIvY2dYWFhYWFgiKSAyPi9kZXYvbnVsbGAgJiYgdGVzdCAtbiAiJHRtcCIgJiYgdGVzdCAtZCAiJHRtcCIgOyB9IHx8CisgeyB0ZXN0IC1uICIkUkFORE9NIiAmJiB0bXA9JFRNUERJUi9jZyQkLSRSQU5ET00gJiYgKHVtYXNrIDA3NyAmJiBta2RpciAkdG1wKSA7IH0gfHwKKyB7IHRtcD0kVE1QRElSL2NnLSQkICYmICh1bWFzayAwNzcgJiYgbWtkaXIgJHRtcCkgJiYgZWNobyAiV2FybmluZzogY3JlYXRpbmcgaW5zZWN1cmUgdGVtcCBkaXJlY3RvcnkiID4mMiA7IH0gfHwKKyB7IGVjaG8gIiRtZTogY2Fubm90IGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgaW4gJFRNUERJUiIgPiYyIDsgZXhpdCAxIDsgfSA7CitkdW1teT0kdG1wL2R1bW15IDsKK3RtcGZpbGVzPSIkZHVtbXkuYyAkZHVtbXkubyAkZHVtbXkucmVsICRkdW1teSIgOworY2FzZSAkQ0NfRk9SX0JVSUxELCRIT1NUX0NDLCRDQyBpbgorICwsKSAgICBlY2hvICJpbnQgeDsiID4gJGR1bW15LmMgOworCWZvciBjIGluIGNjIGdjYyBjODkgYzk5IDsgZG8KKwkgIGlmICgkYyAtYyAtbyAkZHVtbXkubyAkZHVtbXkuYykgPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgICAgQ0NfRk9SX0JVSUxEPSIkYyI7IGJyZWFrIDsKKwkgIGZpIDsKKwlkb25lIDsKKwlpZiB0ZXN0IHgiJENDX0ZPUl9CVUlMRCIgPSB4IDsgdGhlbgorCSAgQ0NfRk9SX0JVSUxEPW5vX2NvbXBpbGVyX2ZvdW5kIDsKKwlmaQorCTs7CisgLCwqKSAgIENDX0ZPUl9CVUlMRD0kQ0MgOzsKKyAsKiwqKSAgQ0NfRk9SX0JVSUxEPSRIT1NUX0NDIDs7Citlc2FjIDsgc2V0X2NjX2Zvcl9idWlsZD0gOycKKworIyBUaGlzIGlzIG5lZWRlZCB0byBmaW5kIHVuYW1lIG9uIGEgUHlyYW1pZCBPU3ggd2hlbiBydW4gaW4gdGhlIEJTRCB1bml2ZXJzZS4KKyMgKGdoYXppQG5vYy5ydXRnZXJzLmVkdSAxOTk0LTA4LTI0KQoraWYgKHRlc3QgLWYgLy5hdHRiaW4vdW5hbWUpID4vZGV2L251bGwgMj4mMSA7IHRoZW4KKwlQQVRIPSRQQVRIOi8uYXR0YmluIDsgZXhwb3J0IFBBVEgKK2ZpCisKK1VOQU1FX01BQ0hJTkU9YCh1bmFtZSAtbSkgMj4vZGV2L251bGxgIHx8IFVOQU1FX01BQ0hJTkU9dW5rbm93bgorVU5BTUVfUkVMRUFTRT1gKHVuYW1lIC1yKSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfUkVMRUFTRT11bmtub3duCitVTkFNRV9TWVNURU09YCh1bmFtZSAtcykgMj4vZGV2L251bGxgICB8fCBVTkFNRV9TWVNURU09dW5rbm93bgorVU5BTUVfVkVSU0lPTj1gKHVuYW1lIC12KSAyPi9kZXYvbnVsbGAgfHwgVU5BTUVfVkVSU0lPTj11bmtub3duCisKKyMgTm90ZTogb3JkZXIgaXMgc2lnbmlmaWNhbnQgLSB0aGUgY2FzZSBicmFuY2hlcyBhcmUgbm90IGV4Y2x1c2l2ZS4KKworY2FzZSAiJHtVTkFNRV9NQUNISU5FfToke1VOQU1FX1NZU1RFTX06JHtVTkFNRV9SRUxFQVNFfToke1VOQU1FX1ZFUlNJT059IiBpbgorICAgICo6TmV0QlNEOio6KikKKwkjIE5ldEJTRCAobmJzZCkgdGFyZ2V0cyBzaG91bGQgKHdoZXJlIGFwcGxpY2FibGUpIG1hdGNoIG9uZSBvcgorCSMgbW9yZSBvZiB0aGUgdHVwcGxlczogKi0qLW5ldGJzZGVsZiosICotKi1uZXRic2Rhb3V0KiwKKwkjICotKi1uZXRic2RlY29mZiogYW5kICotKi1uZXRic2QqLiAgRm9yIHRhcmdldHMgdGhhdCByZWNlbnRseQorCSMgc3dpdGNoZWQgdG8gRUxGLCAqLSotbmV0YnNkKiB3b3VsZCBzZWxlY3QgdGhlIG9sZAorCSMgb2JqZWN0IGZpbGUgZm9ybWF0LiAgVGhpcyBwcm92aWRlcyBib3RoIGZvcndhcmQKKwkjIGNvbXBhdGliaWxpdHkgYW5kIGEgY29uc2lzdGVudCBtZWNoYW5pc20gZm9yIHNlbGVjdGluZyB0aGUKKwkjIG9iamVjdCBmaWxlIGZvcm1hdC4KKwkjCisJIyBOb3RlOiBOZXRCU0QgZG9lc24ndCBwYXJ0aWN1bGFybHkgY2FyZSBhYm91dCB0aGUgdmVuZG9yCisJIyBwb3J0aW9uIG9mIHRoZSBuYW1lLiAgV2UgYWx3YXlzIHNldCBpdCB0byAidW5rbm93biIuCisJc3lzY3RsPSJzeXNjdGwgLW4gaHcubWFjaGluZV9hcmNoIgorCVVOQU1FX01BQ0hJTkVfQVJDSD1gKC9zYmluLyRzeXNjdGwgMj4vZGV2L251bGwgfHwgXAorCSAgICAvdXNyL3NiaW4vJHN5c2N0bCAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd24pYAorCWNhc2UgIiR7VU5BTUVfTUFDSElORV9BUkNIfSIgaW4KKwkgICAgYXJtZWIpIG1hY2hpbmU9YXJtZWItdW5rbm93biA7OworCSAgICBhcm0qKSBtYWNoaW5lPWFybS11bmtub3duIDs7CisJICAgIHNoM2VsKSBtYWNoaW5lPXNobC11bmtub3duIDs7CisJICAgIHNoM2ViKSBtYWNoaW5lPXNoLXVua25vd24gOzsKKwkgICAgc2g1ZWwpIG1hY2hpbmU9c2g1bGUtdW5rbm93biA7OworCSAgICAqKSBtYWNoaW5lPSR7VU5BTUVfTUFDSElORV9BUkNIfS11bmtub3duIDs7CisJZXNhYworCSMgVGhlIE9wZXJhdGluZyBTeXN0ZW0gaW5jbHVkaW5nIG9iamVjdCBmb3JtYXQsIGlmIGl0IGhhcyBzd2l0Y2hlZAorCSMgdG8gRUxGIHJlY2VudGx5LCBvciB3aWxsIGluIHRoZSBmdXR1cmUuCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FX0FSQ0h9IiBpbgorCSAgICBhcm0qfGkzODZ8bTY4a3xuczMya3xzaDMqfHNwYXJjfHZheCkKKwkJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCQlpZiBlY2hvIF9fRUxGX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCQkJfCBncmVwIC1xIF9fRUxGX18KKwkJdGhlbgorCQkgICAgIyBPbmNlIGFsbCB1dGlsaXRpZXMgY2FuIGJlIEVDT0ZGIChuZXRic2RlY29mZikgb3IgYS5vdXQgKG5ldGJzZGFvdXQpLgorCQkgICAgIyBSZXR1cm4gbmV0YnNkIGZvciBlaXRoZXIuICBGSVg/CisJCSAgICBvcz1uZXRic2QKKwkJZWxzZQorCQkgICAgb3M9bmV0YnNkZWxmCisJCWZpCisJCTs7CisJICAgICopCisJICAgICAgICBvcz1uZXRic2QKKwkJOzsKKwllc2FjCisJIyBUaGUgT1MgcmVsZWFzZQorCSMgRGViaWFuIEdOVS9OZXRCU0QgbWFjaGluZXMgaGF2ZSBhIGRpZmZlcmVudCB1c2VybGFuZCwgYW5kCisJIyB0aHVzLCBuZWVkIGEgZGlzdGluY3QgdHJpcGxldC4gSG93ZXZlciwgdGhleSBkbyBub3QgbmVlZAorCSMga2VybmVsIHZlcnNpb24gaW5mb3JtYXRpb24sIHNvIGl0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEKKwkjIHN1aXRhYmxlIHRhZywgaW4gdGhlIHN0eWxlIG9mIGxpbnV4LWdudS4KKwljYXNlICIke1VOQU1FX1ZFUlNJT059IiBpbgorCSAgICBEZWJpYW4qKQorCQlyZWxlYXNlPSctZ251JworCQk7OworCSAgICAqKQorCQlyZWxlYXNlPWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stX10uKi9cLi8nYAorCQk7OworCWVzYWMKKwkjIFNpbmNlIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1LRVJORUwtT1BFUkFUSU5HX1NZU1RFTToKKwkjIGNvbnRhaW5zIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwgdGhlIHNob3J0ZXIgZm9ybToKKwkjIENQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNIGlzIHVzZWQuCisJZWNobyAiJHttYWNoaW5lfS0ke29zfSR7cmVsZWFzZX0iCisJZXhpdCA7OworICAgICo6T3BlbkJTRDoqOiopCisJVU5BTUVfTUFDSElORV9BUkNIPWBhcmNoIHwgc2VkICdzL09wZW5CU0QuLy8nYAorCWVjaG8gJHtVTkFNRV9NQUNISU5FX0FSQ0h9LXVua25vd24tb3BlbmJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpla2tvQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1la2tvYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOlNvbGlkQlNEOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1zb2xpZGJzZCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWFjcHBjOk1pckJTRDoqOiopCisJZWNobyBwb3dlcnBjLXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICAqOk1pckJTRDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbWlyYnNkJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBhbHBoYTpPU0YxOio6KikKKwljYXNlICRVTkFNRV9SRUxFQVNFIGluCisJKjQuMCkKKwkJVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDN9J2AKKwkJOzsKKwkqNS4qKQorCSAgICAgICAgVU5BTUVfUkVMRUFTRT1gL3Vzci9zYmluL3NpemVyIC12IHwgYXdrICd7cHJpbnQgJDR9J2AKKwkJOzsKKwllc2FjCisJIyBBY2NvcmRpbmcgdG8gQ29tcGFxLCAvdXNyL3NiaW4vcHNyaW5mbyBoYXMgYmVlbiBhdmFpbGFibGUgb24KKwkjIE9TRi8xIGFuZCBUcnU2NCBzeXN0ZW1zIHByb2R1Y2VkIHNpbmNlIDE5OTUuICBJIGhvcGUgdGhhdAorCSMgY292ZXJzIG1vc3Qgc3lzdGVtcyBydW5uaW5nIHRvZGF5LiAgVGhpcyBjb2RlIHBpcGVzIHRoZSBDUFUKKwkjIHR5cGVzIHRocm91Z2ggaGVhZCAtbiAxLCBzbyB3ZSBvbmx5IGRldGVjdCB0aGUgdHlwZSBvZiBDUFUgMC4KKwlBTFBIQV9DUFVfVFlQRT1gL3Vzci9zYmluL3BzcmluZm8gLXYgfCBzZWQgLW4gLWUgJ3MvXiAgVGhlIGFscGhhIFwoLipcKSBwcm9jZXNzb3IuKiQvXDEvcCcgfCBoZWFkIC1uIDFgCisJY2FzZSAiJEFMUEhBX0NQVV9UWVBFIiBpbgorCSAgICAiRVY0ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkVWNC41ICgyMTA2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYSIgOzsKKwkgICAgIkxDQTQgKDIxMDY2LzIxMDY4KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhIiA7OworCSAgICAiRVY1ICgyMTE2NCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NSIgOzsKKwkgICAgIkVWNS42ICgyMTE2NEEpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjU2IiA7OworCSAgICAiRVY1LjYgKDIxMTY0UEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFwY2E1NiIgOzsKKwkgICAgIkVWNS43ICgyMTE2NFBDKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhcGNhNTciIDs7CisJICAgICJFVjYgKDIxMjY0KSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2IiA7OworCSAgICAiRVY2LjcgKDIxMjY0QSkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjciIDs7CisJICAgICJFVjYuOENCICgyMTI2NEMpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjY4IiA7OworCSAgICAiRVY2LjhBTCAoMjEyNjRCKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OCIgOzsKKwkgICAgIkVWNi44Q1ggKDIxMjY0RCkiKQorCQlVTkFNRV9NQUNISU5FPSJhbHBoYWV2NjgiIDs7CisJICAgICJFVjYuOUEgKDIxMjY0L0VWNjlBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY2OSIgOzsKKwkgICAgIkVWNyAoMjEzNjQpIikKKwkJVU5BTUVfTUFDSElORT0iYWxwaGFldjciIDs7CisJICAgICJFVjcuOSAoMjEzNjRBKSIpCisJCVVOQU1FX01BQ0hJTkU9ImFscGhhZXY3OSIgOzsKKwllc2FjCisJIyBBIFBuLm4gdmVyc2lvbiBpcyBhIHBhdGNoZWQgdmVyc2lvbi4KKwkjIEEgVm4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgdmVyc2lvbi4KKwkjIEEgVG4ubiB2ZXJzaW9uIGlzIGEgcmVsZWFzZWQgZmllbGQgdGVzdCB2ZXJzaW9uLgorCSMgQSBYbi5uIHZlcnNpb24gaXMgYW4gdW5yZWxlYXNlZCBleHBlcmltZW50YWwgYmFzZWxldmVsLgorCSMgMS4yIHVzZXMgIjEuMiIgZm9yIHVuYW1lIC1yLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtb3NmYGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9eW1BWVFhdLy8nIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonYAorCWV4aXQgOzsKKyAgICBBbHBoYVwgKjpXaW5kb3dzX05UKjoqKQorCSMgSG93IGRvIHdlIGtub3cgaXQncyBJbnRlcml4IHJhdGhlciB0aGFuIHRoZSBnZW5lcmljIFBPU0lYIHN1YnN5c3RlbT8KKwkjIFNob3VsZCB3ZSBjaGFuZ2UgVU5BTUVfTUFDSElORSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIHVuYW1lIGluc3RlYWQKKwkjIG9mIHRoZSBzcGVjaWZpYyBBbHBoYSBtb2RlbD8KKwllY2hvIGFscGhhLXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgMjEwNjQ6V2luZG93c19OVDo1MDozKQorCWVjaG8gYWxwaGEtZGVjLXdpbm50My41CisJZXhpdCA7OworICAgIEFtaWdhKjpVTklYX1N5c3RlbV9WOjQuMDoqKQorCWVjaG8gbTY4ay11bmtub3duLXN5c3Y0CisJZXhpdCA7OworICAgICo6W0FhXW1pZ2FbT29dW1NzXToqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tYW1pZ2FvcworCWV4aXQgOzsKKyAgICAqOltNbV1vcnBoW09vXVtTc106KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLW1vcnBob3MKKwlleGl0IDs7CisgICAgKjpPUy8zOTA6KjoqKQorCWVjaG8gaTM3MC1pYm0tb3BlbmVkaXRpb24KKwlleGl0IDs7CisgICAgKjp6L1ZNOio6KikKKwllY2hvIHMzOTAtaWJtLXp2bW9lCisJZXhpdCA7OworICAgICo6T1M0MDA6KjoqKQorICAgICAgICBlY2hvIHBvd2VycGMtaWJtLW9zNDAwCisJZXhpdCA7OworICAgIGFybTpSSVNDKjoxLlswMTJdKjoqfGFybTpyaXNjaXg6MS5bMDEyXSo6KikKKwllY2hvIGFybS1hY29ybi1yaXNjaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGFybTpyaXNjb3M6KjoqfGFybTpSSVNDT1M6KjoqKQorCWVjaG8gYXJtLXVua25vd24tcmlzY29zCisJZXhpdCA7OworICAgIFNSMj8wMTpISS1VWC9NUFA6KjoqIHwgU1I4MDAwOkhJLVVYL01QUDoqOiopCisJZWNobyBocHBhMS4xLWhpdGFjaGktaGl1eG1wcAorCWV4aXQgOzsKKyAgICBQeXJhbWlkKjpPU3gqOio6KiB8IE1JUyo6T1N4KjoqOiogfCBNSVMqOlNNUF9EQy1PU3gqOio6KikKKwkjIGFrZWVAd3BkaXMwMy53cGFmYi5hZi5taWwgKEVhcmxlIEYuIEFrZSkgY29udHJpYnV0ZWQgTUlTIGFuZCBOSUxFLgorCWlmIHRlc3QgImAoL2Jpbi91bml2ZXJzZSkgMj4vZGV2L251bGxgIiA9IGF0dCA7IHRoZW4KKwkJZWNobyBweXJhbWlkLXB5cmFtaWQtc3lzdjMKKwllbHNlCisJCWVjaG8gcHlyYW1pZC1weXJhbWlkLWJzZAorCWZpCisJZXhpdCA7OworICAgIE5JTEUqOio6KjpkY29zeCkKKwllY2hvIHB5cmFtaWQtcHlyYW1pZC1zdnI0CisJZXhpdCA7OworICAgIERSUz82MDAwOnVuaXg6NC4wOjYqKQorCWVjaG8gc3BhcmMtaWNsLW54NgorCWV4aXQgOzsKKyAgICBEUlM/NjAwMDpVTklYX1NWOjQuMio6NyogfCBEUlM/NjAwMDppc2lzOjQuMio6NyopCisJY2FzZSBgL3Vzci9iaW4vdW5hbWUgLXBgIGluCisJICAgIHNwYXJjKSBlY2hvIHNwYXJjLWljbC1ueDc7IGV4aXQgOzsKKwllc2FjIDs7CisgICAgczM5MHg6U3VuT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNEg6U3VuT1M6NS4qOiopCisJZWNobyBzcGFyYy1oYWwtc29sYXJpczJgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6NS4qOiogfCB0YWRwb2xlKjpTdW5PUzo1Lio6KikKKwllY2hvIHNwYXJjLXN1bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICBpODZwYzpBdXJvcmFVWDo1Lio6KiB8IGk4NnhlbjpBdXJvcmFVWDo1Lio6KikKKwllY2hvIGkzODYtcGMtYXVyb3JhdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIGk4NnBjOlN1bk9TOjUuKjoqIHwgaTg2eGVuOlN1bk9TOjUuKjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlTVU5fQVJDSD0iaTM4NiIKKwkjIElmIHRoZXJlIGlzIGEgY29tcGlsZXIsIHNlZSBpZiBpdCBpcyBjb25maWd1cmVkIGZvciA2NC1iaXQgb2JqZWN0cy4KKwkjIE5vdGUgdGhhdCB0aGUgU3VuIGNjIGRvZXMgbm90IHR1cm4gX19MUDY0X18gaW50byAxIGxpa2UgZ2NjIGRvZXMuCisJIyBUaGlzIHRlc3Qgd29ya3MgZm9yIGJvdGggY29tcGlsZXJzLgorCWlmIFsgIiRDQ19GT1JfQlVJTEQiICE9ICdub19jb21waWxlcl9mb3VuZCcgXTsgdGhlbgorCSAgICBpZiAoZWNobyAnI2lmZGVmIF9fYW1kNjQnOyBlY2hvIElTXzY0QklUX0FSQ0g7IGVjaG8gJyNlbmRpZicpIHwgXAorCQkoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwgXAorCQlncmVwIElTXzY0QklUX0FSQ0ggPi9kZXYvbnVsbAorCSAgICB0aGVuCisJCVNVTl9BUkNIPSJ4ODZfNjQiCisJICAgIGZpCisJZmkKKwllY2hvICR7U1VOX0FSQ0h9LXBjLXNvbGFyaXMyYGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSovLydgCisJZXhpdCA7OworICAgIHN1bjQqOlN1bk9TOjYqOiopCisJIyBBY2NvcmRpbmcgdG8gY29uZmlnLnN1YiwgdGhpcyBpcyB0aGUgcHJvcGVyIHdheSB0byBjYW5vbmljYWxpemUKKwkjIFN1bk9TNi4gIEhhcmQgdG8gZ3Vlc3MgZXhhY3RseSB3aGF0IFN1bk9TNiB3aWxsIGJlIGxpa2UsIGJ1dAorCSMgaXQncyBsaWtlbHkgdG8gYmUgbW9yZSBsaWtlIFNvbGFyaXMgdGhhbiBTdW5PUzQuCisJZWNobyBzcGFyYy1zdW4tc29sYXJpczNgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bXi5dKi8vJ2AKKwlleGl0IDs7CisgICAgc3VuNCo6U3VuT1M6KjoqKQorCWNhc2UgImAvdXNyL2Jpbi9hcmNoIC1rYCIgaW4KKwkgICAgU2VyaWVzKnxTNCopCisJCVVOQU1FX1JFTEVBU0U9YHVuYW1lIC12YAorCQk7OworCWVzYWMKKwkjIEphcGFuZXNlIExhbmd1YWdlIHZlcnNpb25zIGhhdmUgYSB2ZXJzaW9uIG51bWJlciBsaWtlIGA0LjEuMy1KTCcuCisJZWNobyBzcGFyYy1zdW4tc3Vub3NgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vJ2AKKwlleGl0IDs7CisgICAgc3VuMyo6U3VuT1M6KjoqKQorCWVjaG8gbTY4ay1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIHN1bio6Kjo0LjJCU0Q6KikKKwlVTkFNRV9SRUxFQVNFPWAoc2VkIDFxIC9ldGMvbW90ZCB8IGF3ayAne3ByaW50IHN1YnN0cigkNSwxLDMpfScpIDI+L2Rldi9udWxsYAorCXRlc3QgIngke1VOQU1FX1JFTEVBU0V9IiA9ICJ4IiAmJiBVTkFNRV9SRUxFQVNFPTMKKwljYXNlICJgL2Jpbi9hcmNoYCIgaW4KKwkgICAgc3VuMykKKwkJZWNobyBtNjhrLXN1bi1zdW5vcyR7VU5BTUVfUkVMRUFTRX0KKwkJOzsKKwkgICAgc3VuNCkKKwkJZWNobyBzcGFyYy1zdW4tc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJCTs7CisJZXNhYworCWV4aXQgOzsKKyAgICBhdXNocDpTdW5PUzoqOiopCisJZWNobyBzcGFyYy1hdXNwZXgtc3Vub3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICMgVGhlIHNpdHVhdGlvbiBmb3IgTWlOVCBpcyBhIGxpdHRsZSBjb25mdXNpbmcuICBUaGUgbWFjaGluZSBuYW1lCisgICAgIyBjYW4gYmUgdmlydHVhbGx5IGV2ZXJ5dGhpbmcgKGV2ZXJ5dGhpbmcgd2hpY2ggaXMgbm90CisgICAgIyAiYXRhcmlzdCIgb3IgImF0YXJpc3RlIiBhdCBsZWFzdCBzaG91bGQgaGF2ZSBhIHByb2Nlc3NvcgorICAgICMgPiBtNjgwMDApLiAgVGhlIHN5c3RlbSBuYW1lIHJhbmdlcyBmcm9tICJNaU5UIiBvdmVyICJGcmVlTWlOVCIKKyAgICAjIHRvIHRoZSBsb3dlcmNhc2UgdmVyc2lvbiAibWludCIgKG9yICJmcmVlbWludCIpLiAgRmluYWxseQorICAgICMgdGhlIHN5c3RlbSBuYW1lICJUT1MiIGRlbm90ZXMgYSBzeXN0ZW0gd2hpY2ggaXMgYWN0dWFsbHkgbm90CisgICAgIyBNaU5ULiAgQnV0IE1pTlQgaXMgZG93bndhcmQgY29tcGF0aWJsZSB0byBUT1MsIHNvIHRoaXMgc2hvdWxkCisgICAgIyBiZSBubyBwcm9ibGVtLgorICAgIGF0YXJpc3RbZV06Kk1pTlQ6KjoqIHwgYXRhcmlzdFtlXToqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstYXRhcmktbWludCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgYXRhcmkqOipNaU5UOio6KiB8IGF0YXJpKjoqbWludDoqOiogfCBhdGFyaXN0W2VdOipUT1M6KjoqKQorCWVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgKmZhbGNvbio6Kk1pTlQ6KjoqIHwgKmZhbGNvbio6Km1pbnQ6KjoqIHwgKmZhbGNvbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1hdGFyaS1taW50JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBtaWxhbio6Kk1pTlQ6KjoqIHwgbWlsYW4qOiptaW50Oio6KiB8ICptaWxhbio6KlRPUzoqOiopCisgICAgICAgIGVjaG8gbTY4ay1taWxhbi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgaGFkZXMqOipNaU5UOio6KiB8IGhhZGVzKjoqbWludDoqOiogfCAqaGFkZXMqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstaGFkZXMtbWludCR7VU5BTUVfUkVMRUFTRX0KKyAgICAgICAgZXhpdCA7OworICAgICo6Kk1pTlQ6KjoqIHwgKjoqbWludDoqOiogfCAqOipUT1M6KjoqKQorICAgICAgICBlY2hvIG02OGstdW5rbm93bi1taW50JHtVTkFNRV9SRUxFQVNFfQorICAgICAgICBleGl0IDs7CisgICAgbTY4azptYWNodGVuOio6KikKKwllY2hvIG02OGstYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgcG93ZXJwYzptYWNodGVuOio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtbWFjaHRlbiR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUklTQyo6TWFjaDoqOiopCisJZWNobyBtaXBzLWRlYy1tYWNoX2JzZDQuMworCWV4aXQgOzsKKyAgICBSSVNDKjpVTFRSSVg6KjoqKQorCWVjaG8gbWlwcy1kZWMtdWx0cml4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBWQVgqOlVMVFJJWCo6KjoqKQorCWVjaG8gdmF4LWRlYy11bHRyaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIDIwMjA6Q0xJWDoqOiogfCAyNDMwOkNMSVg6KjoqKQorCWVjaG8gY2xpcHBlci1pbnRlcmdyYXBoLWNsaXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG1pcHM6KjoqOlVNSVBTIHwgbWlwczoqOio6UklTQ29zKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkaW8uaD4gIC8qIGZvciBwcmludGYoKSBwcm90b3R5cGUgKi8KKwlpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeworI2Vsc2UKKwlpbnQgbWFpbiAoYXJnYywgYXJndikgaW50IGFyZ2M7IGNoYXIgKmFyZ3ZbXTsgeworI2VuZGlmCisJI2lmIGRlZmluZWQgKGhvc3RfbWlwcykgJiYgZGVmaW5lZCAoTUlQU0VCKQorCSNpZiBkZWZpbmVkIChTWVNUWVBFX1NZU1YpCisJICBwcmludGYgKCJtaXBzLW1pcHMtcmlzY29zJXNzeXN2XG4iLCBhcmd2WzFdKTsgZXhpdCAoMCk7CisJI2VuZGlmCisJI2lmIGRlZmluZWQgKFNZU1RZUEVfU1ZSNCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc3N2cjRcbiIsIGFyZ3ZbMV0pOyBleGl0ICgwKTsKKwkjZW5kaWYKKwkjaWYgZGVmaW5lZCAoU1lTVFlQRV9CU0Q0MykgfHwgZGVmaW5lZChTWVNUWVBFX0JTRCkKKwkgIHByaW50ZiAoIm1pcHMtbWlwcy1yaXNjb3Mlc2JzZFxuIiwgYXJndlsxXSk7IGV4aXQgKDApOworCSNlbmRpZgorCSNlbmRpZgorCSAgZXhpdCAoLTEpOworCX0KK0VPRgorCSRDQ19GT1JfQlVJTEQgLW8gJGR1bW15ICRkdW1teS5jICYmCisJICBkdW1teWFyZz1gZWNobyAiJHtVTkFNRV9SRUxFQVNFfSIgfCBzZWQgLW4gJ3MvXChbMC05XSpcKS4qL1wxL3AnYCAmJgorCSAgU1lTVEVNX05BTUU9YCRkdW1teSAkZHVtbXlhcmdgICYmCisJICAgIHsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCWVjaG8gbWlwcy1taXBzLXJpc2NvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTW90b3JvbGE6UG93ZXJNQVhfT1M6KjoqKQorCWVjaG8gcG93ZXJwYy1tb3Rvcm9sYS1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBNb3Rvcm9sYToqOjQuMzpQTDgtKikKKwllY2hvIHBvd2VycGMtaGFycmlzLXBvd2VybWF4CisJZXhpdCA7OworICAgIE5pZ2h0X0hhd2s6KjoqOlBvd2VyTUFYX09TIHwgU3luZXJneTpQb3dlck1BWF9PUzoqOiopCisJZWNobyBwb3dlcnBjLWhhcnJpcy1wb3dlcm1heAorCWV4aXQgOzsKKyAgICBOaWdodF9IYXdrOlBvd2VyX1VOSVg6KjoqKQorCWVjaG8gcG93ZXJwYy1oYXJyaXMtcG93ZXJ1bml4CisJZXhpdCA7OworICAgIG04OGs6Q1gvVVg6Nyo6KikKKwllY2hvIG04OGstaGFycmlzLWN4dXg3CisJZXhpdCA7OworICAgIG04OGs6Kjo0KjpSNCopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3Y0CisJZXhpdCA7OworICAgIG04OGs6KjozKjpSMyopCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCA7OworICAgIEFWaWlPTjpkZ3V4Oio6KikKKyAgICAgICAgIyBERy9VWCByZXR1cm5zIEFWaWlPTiBmb3IgYWxsIGFyY2hpdGVjdHVyZXMKKyAgICAgICAgVU5BTUVfUFJPQ0VTU09SPWAvdXNyL2Jpbi91bmFtZSAtcGAKKwlpZiBbICRVTkFNRV9QUk9DRVNTT1IgPSBtYzg4MTAwIF0gfHwgWyAkVU5BTUVfUFJPQ0VTU09SID0gbWM4ODExMCBdCisJdGhlbgorCSAgICBpZiBbICR7VEFSR0VUX0JJTkFSWV9JTlRFUkZBQ0V9eCA9IG04OGtkZ3V4ZWxmeCBdIHx8IFwKKwkgICAgICAgWyAke1RBUkdFVF9CSU5BUllfSU5URVJGQUNFfXggPSB4IF0KKwkgICAgdGhlbgorCQllY2hvIG04OGstZGctZGd1eCR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZWxzZQorCQllY2hvIG04OGstZGctZGd1eGJjcyR7VU5BTUVfUkVMRUFTRX0KKwkgICAgZmkKKwllbHNlCisJICAgIGVjaG8gaTU4Ni1kZy1kZ3V4JHtVTkFNRV9SRUxFQVNFfQorCWZpCisgCWV4aXQgOzsKKyAgICBNODgqOkRvbHBoaW5PUzoqOiopCSMgRG9scGhpbk9TIChTVlIzKQorCWVjaG8gbTg4ay1kb2xwaGluLXN5c3YzCisJZXhpdCA7OworICAgIE04OCo6KjpSMyo6KikKKwkjIERlbHRhIDg4ayBzeXN0ZW0gcnVubmluZyBTVlIzCisJZWNobyBtODhrLW1vdG9yb2xhLXN5c3YzCisJZXhpdCA7OworICAgIFhEODgqOio6KjoqKSAjIFRla3Ryb25peCBYRDg4IHN5c3RlbSBydW5uaW5nIFVUZWtWIChTVlIzKQorCWVjaG8gbTg4ay10ZWt0cm9uaXgtc3lzdjMKKwlleGl0IDs7CisgICAgVGVrNDNbMC05XVswLTldOlVUZWs6KjoqKSAjIFRla3Ryb25peCA0MzAwIHN5c3RlbSBydW5uaW5nIFVUZWsgKEJTRCkKKwllY2hvIG02OGstdGVrdHJvbml4LWJzZAorCWV4aXQgOzsKKyAgICAqOklSSVgqOio6KikKKwllY2hvIG1pcHMtc2dpLWlyaXhgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy8tL18vZydgCisJZXhpdCA7OworICAgID8/Pz8/Pz8/OkFJWD86WzEyXS4xOjIpICAgIyBBSVggMi4yLjEgb3IgQUlYIDIuMS4xIGlzIFJUL1BDIEFJWC4KKwllY2hvIHJvbXAtaWJtLWFpeCAgICAgIyB1bmFtZSAtbSBnaXZlcyBhbiA4IGhleC1jb2RlIENQVSBpZAorCWV4aXQgOzsgICAgICAgICAgICAgICAjIE5vdGUgdGhhdDogZWNobyAiJ2B1bmFtZSAtc2AnIiBnaXZlcyAnQUlYICcKKyAgICBpKjg2OkFJWDoqOiopCisJZWNobyBpMzg2LWlibS1haXgKKwlleGl0IDs7CisgICAgaWE2NDpBSVg6KjoqKQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1pYm0tYWl4JHtJQk1fUkVWfQorCWV4aXQgOzsKKyAgICAqOkFJWDoyOjMpCisJaWYgZ3JlcCBib3MzMjUgL3Vzci9pbmNsdWRlL3N0ZGlvLmggPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJc2VkICdzL14JCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJCSNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CisKKwkJbWFpbigpCisJCQl7CisJCQlpZiAoIV9fcG93ZXJfcGMoKSkKKwkJCQlleGl0KDEpOworCQkJcHV0cygicG93ZXJwYy1pYm0tYWl4My4yLjUiKTsKKwkJCWV4aXQoMCk7CisJCQl9CitFT0YKKwkJaWYgJENDX0ZPUl9CVUlMRCAtbyAkZHVtbXkgJGR1bW15LmMgJiYgU1lTVEVNX05BTUU9YCRkdW1teWAKKwkJdGhlbgorCQkJZWNobyAiJFNZU1RFTV9OQU1FIgorCQllbHNlCisJCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjUKKwkJZmkKKwllbGlmIGdyZXAgYm9zMzI0IC91c3IvaW5jbHVkZS9zdGRpby5oID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQllY2hvIHJzNjAwMC1pYm0tYWl4My4yLjQKKwllbHNlCisJCWVjaG8gcnM2MDAwLWlibS1haXgzLjIKKwlmaQorCWV4aXQgOzsKKyAgICAqOkFJWDoqOls0NTZdKQorCUlCTV9DUFVfSUQ9YC91c3Ivc2Jpbi9sc2RldiAtQyAtYyBwcm9jZXNzb3IgLVMgYXZhaWxhYmxlIHwgc2VkIDFxIHwgYXdrICd7IHByaW50ICQxIH0nYAorCWlmIC91c3Ivc2Jpbi9sc2F0dHIgLUVsICR7SUJNX0NQVV9JRH0gfCBncmVwICcgUE9XRVInID4vZGV2L251bGwgMj4mMTsgdGhlbgorCQlJQk1fQVJDSD1yczYwMDAKKwllbHNlCisJCUlCTV9BUkNIPXBvd2VycGMKKwlmaQorCWlmIFsgLXggL3Vzci9iaW4vb3NsZXZlbCBdIDsgdGhlbgorCQlJQk1fUkVWPWAvdXNyL2Jpbi9vc2xldmVsYAorCWVsc2UKKwkJSUJNX1JFVj0ke1VOQU1FX1ZFUlNJT059LiR7VU5BTUVfUkVMRUFTRX0KKwlmaQorCWVjaG8gJHtJQk1fQVJDSH0taWJtLWFpeCR7SUJNX1JFVn0KKwlleGl0IDs7CisgICAgKjpBSVg6KjoqKQorCWVjaG8gcnM2MDAwLWlibS1haXgKKwlleGl0IDs7CisgICAgaWJtcnQ6NC40QlNEOip8cm9tcC1pYm06QlNEOiopCisJZWNobyByb21wLWlibS1ic2Q0LjQKKwlleGl0IDs7CisgICAgaWJtcnQ6KkJTRDoqfHJvbXAtaWJtOkJTRDoqKSAgICAgICAgICAgICMgY292ZXJzIFJUL1BDIEJTRCBhbmQKKwllY2hvIHJvbXAtaWJtLWJzZCR7VU5BTUVfUkVMRUFTRX0gICAjIDQuMyB3aXRoIHVuYW1lIGFkZGVkIHRvCisJZXhpdCA7OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBvcnQ6IHJvbXAtaWJtIEJTRCA0LjMKKyAgICAqOkJPU1g6KjoqKQorCWVjaG8gcnM2MDAwLWJ1bGwtYm9zeAorCWV4aXQgOzsKKyAgICBEUFgvMj8wMDpCLk8uUy46KjoqKQorCWVjaG8gbTY4ay1idWxsLXN5c3YzCisJZXhpdCA7OworICAgIDkwMDAvWzM0XT8/OjQuM2JzZDoxLio6KikKKwllY2hvIG02OGstaHAtYnNkCisJZXhpdCA7OworICAgIGhwMzAwOjQuNEJTRDoqOiogfCA5MDAwL1szNF0/Pzo0LjNic2Q6Mi4qOiopCisJZWNobyBtNjhrLWhwLWJzZDQuNAorCWV4aXQgOzsKKyAgICA5MDAwL1szNDY3OF0/PzpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJY2FzZSAiJHtVTkFNRV9NQUNISU5FfSIgaW4KKwkgICAgOTAwMC8zMT8gKSAgICAgICAgICAgIEhQX0FSQ0g9bTY4MDAwIDs7CisJICAgIDkwMDAvWzM0XT8/ICkgICAgICAgICBIUF9BUkNIPW02OGsgOzsKKwkgICAgOTAwMC9bNjc4XVswLTldWzAtOV0pCisJCWlmIFsgLXggL3Vzci9iaW4vZ2V0Y29uZiBdOyB0aGVuCisJCSAgICBzY19jcHVfdmVyc2lvbj1gL3Vzci9iaW4vZ2V0Y29uZiBTQ19DUFVfVkVSU0lPTiAyPi9kZXYvbnVsbGAKKyAgICAgICAgICAgICAgICAgICAgc2Nfa2VybmVsX2JpdHM9YC91c3IvYmluL2dldGNvbmYgU0NfS0VSTkVMX0JJVFMgMj4vZGV2L251bGxgCisgICAgICAgICAgICAgICAgICAgIGNhc2UgIiR7c2NfY3B1X3ZlcnNpb259IiBpbgorICAgICAgICAgICAgICAgICAgICAgIDUyMykgSFBfQVJDSD0iaHBwYTEuMCIgOzsgIyBDUFVfUEFfUklTQzFfMAorICAgICAgICAgICAgICAgICAgICAgIDUyOCkgSFBfQVJDSD0iaHBwYTEuMSIgOzsgIyBDUFVfUEFfUklTQzFfMQorICAgICAgICAgICAgICAgICAgICAgIDUzMikgICAgICAgICAgICAgICAgICAgICAgIyBDUFVfUEFfUklTQzJfMAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiJHtzY19rZXJuZWxfYml0c30iIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMyKSBIUF9BUkNIPSJocHBhMi4wbiIgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpIEhQX0FSQ0g9ImhwcGEyLjB3IiA7OworCQkJICAnJykgSFBfQVJDSD0iaHBwYTIuMCIgOzsgICAjIEhQLVVYIDEwLjIwCisgICAgICAgICAgICAgICAgICAgICAgICBlc2FjIDs7CisgICAgICAgICAgICAgICAgICAgIGVzYWMKKwkJZmkKKwkJaWYgWyAiJHtIUF9BUkNIfSIgPSAiIiBdOyB0aGVuCisJCSAgICBldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJCSAgICBzZWQgJ3MvXiAgICAgICAgICAgICAgLy8nIDw8IEVPRiA+JGR1bW15LmMKKworICAgICAgICAgICAgICAjZGVmaW5lIF9IUFVYX1NPVVJDRQorICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkbGliLmg+CisgICAgICAgICAgICAgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworICAgICAgICAgICAgICBpbnQgbWFpbiAoKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICNpZiBkZWZpbmVkKF9TQ19LRVJORUxfQklUUykKKyAgICAgICAgICAgICAgICAgIGxvbmcgYml0cyA9IHN5c2NvbmYoX1NDX0tFUk5FTF9CSVRTKTsKKyAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICBsb25nIGNwdSAgPSBzeXNjb25mIChfU0NfQ1BVX1ZFUlNJT04pOworCisgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNwdSkKKyAgICAgICAgICAgICAgCXsKKyAgICAgICAgICAgICAgCWNhc2UgQ1BVX1BBX1JJU0MxXzA6IHB1dHMgKCJocHBhMS4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAljYXNlIENQVV9QQV9SSVNDMl8wOgorICAgICAgICAgICAgICAjaWYgZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpCisgICAgICAgICAgICAgIAkgICAgc3dpdGNoIChiaXRzKQorICAgICAgICAgICAgICAJCXsKKyAgICAgICAgICAgICAgCQljYXNlIDY0OiBwdXRzICgiaHBwYTIuMHciKTsgYnJlYWs7CisgICAgICAgICAgICAgIAkJY2FzZSAzMjogcHV0cyAoImhwcGEyLjBuIik7IGJyZWFrOworICAgICAgICAgICAgICAJCWRlZmF1bHQ6IHB1dHMgKCJocHBhMi4wIik7IGJyZWFrOworICAgICAgICAgICAgICAJCX0gYnJlYWs7CisgICAgICAgICAgICAgICNlbHNlICAvKiAhZGVmaW5lZChfU0NfS0VSTkVMX0JJVFMpICovCisgICAgICAgICAgICAgIAkgICAgcHV0cyAoImhwcGEyLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAJZGVmYXVsdDogcHV0cyAoImhwcGExLjAiKTsgYnJlYWs7CisgICAgICAgICAgICAgIAl9CisgICAgICAgICAgICAgICAgICBleGl0ICgwKTsKKyAgICAgICAgICAgICAgfQorRU9GCisJCSAgICAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCkgJiYgSFBfQVJDSD1gJGR1bW15YAorCQkgICAgdGVzdCAteiAiJEhQX0FSQ0giICYmIEhQX0FSQ0g9aHBwYQorCQlmaSA7OworCWVzYWMKKwlpZiBbICR7SFBfQVJDSH0gPSAiaHBwYTIuMHciIF0KKwl0aGVuCisJICAgIGV2YWwgJHNldF9jY19mb3JfYnVpbGQKKworCSAgICAjIGhwcGEyLjB3LWhwLWhwdXgqIGhhcyBhIDY0LWJpdCBrZXJuZWwgYW5kIGEgY29tcGlsZXIgZ2VuZXJhdGluZworCSAgICAjIDMyLWJpdCBjb2RlLiAgaHBwYTY0LWhwLWhwdXgqIGhhcyB0aGUgc2FtZSBrZXJuZWwgYW5kIGEgY29tcGlsZXIKKwkgICAgIyBnZW5lcmF0aW5nIDY0LWJpdCBjb2RlLiAgR05VIGFuZCBIUCB1c2UgZGlmZmVyZW50IG5vbWVuY2xhdHVyZToKKwkgICAgIworCSAgICAjICQgQ0NfRk9SX0JVSUxEPWNjIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTIuMHctaHAtaHB1eDExLjIzCisJICAgICMgJCBDQ19GT1JfQlVJTEQ9ImNjICtEQTIuMHciIC4vY29uZmlnLmd1ZXNzCisJICAgICMgPT4gaHBwYTY0LWhwLWhwdXgxMS4yMworCisJICAgIGlmIGVjaG8gX19MUDY0X18gfCAoQ0NPUFRTPSAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwpIHwKKwkJZ3JlcCAtcSBfX0xQNjRfXworCSAgICB0aGVuCisJCUhQX0FSQ0g9ImhwcGEyLjB3IgorCSAgICBlbHNlCisJCUhQX0FSQ0g9ImhwcGE2NCIKKwkgICAgZmkKKwlmaQorCWVjaG8gJHtIUF9BUkNIfS1ocC1ocHV4JHtIUFVYX1JFVn0KKwlleGl0IDs7CisgICAgaWE2NDpIUC1VWDoqOiopCisJSFBVWF9SRVY9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfXxzZWQgLWUgJ3MvW14uXSouWzBCXSovLydgCisJZWNobyBpYTY0LWhwLWhwdXgke0hQVVhfUkVWfQorCWV4aXQgOzsKKyAgICAzMDUwKjpISS1VWDoqOiopCisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2luY2x1ZGUgPHVuaXN0ZC5oPgorCWludAorCW1haW4gKCkKKwl7CisJICBsb25nIGNwdSA9IHN5c2NvbmYgKF9TQ19DUFVfVkVSU0lPTik7CisJICAvKiBUaGUgb3JkZXIgbWF0dGVycywgYmVjYXVzZSBDUFVfSVNfSFBfTUM2OEsgZXJyb25lb3VzbHkgcmV0dXJucworCSAgICAgdHJ1ZSBmb3IgQ1BVX1BBX1JJU0MxXzAuICBDUFVfSVNfUEFfUklTQyByZXR1cm5zIGNvcnJlY3QKKwkgICAgIHJlc3VsdHMsIGhvd2V2ZXIuICAqLworCSAgaWYgKENQVV9JU19QQV9SSVNDIChjcHUpKQorCSAgICB7CisJICAgICAgc3dpdGNoIChjcHUpCisJCXsKKwkJICBjYXNlIENQVV9QQV9SSVNDMV8wOiBwdXRzICgiaHBwYTEuMC1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCSAgY2FzZSBDUFVfUEFfUklTQzFfMTogcHV0cyAoImhwcGExLjEtaGl0YWNoaS1oaXV4d2UyIik7IGJyZWFrOworCQkgIGNhc2UgQ1BVX1BBX1JJU0MyXzA6IHB1dHMgKCJocHBhMi4wLWhpdGFjaGktaGl1eHdlMiIpOyBicmVhazsKKwkJICBkZWZhdWx0OiBwdXRzICgiaHBwYS1oaXRhY2hpLWhpdXh3ZTIiKTsgYnJlYWs7CisJCX0KKwkgICAgfQorCSAgZWxzZSBpZiAoQ1BVX0lTX0hQX01DNjhLIChjcHUpKQorCSAgICBwdXRzICgibTY4ay1oaXRhY2hpLWhpdXh3ZTIiKTsKKwkgIGVsc2UgcHV0cyAoInVua25vd24taGl0YWNoaS1oaXV4d2UyIik7CisJICBleGl0ICgwKTsKKwl9CitFT0YKKwkkQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCQl7IGVjaG8gIiRTWVNURU1fTkFNRSI7IGV4aXQ7IH0KKwllY2hvIHVua25vd24taGl0YWNoaS1oaXV4d2UyCisJZXhpdCA7OworICAgIDkwMDAvNz8/OjQuM2JzZDoqOiogfCA5MDAwLzg/Wzc5XTo0LjNic2Q6KjoqICkKKwllY2hvIGhwcGExLjEtaHAtYnNkCisJZXhpdCA7OworICAgIDkwMDAvOD8/OjQuM2JzZDoqOiopCisJZWNobyBocHBhMS4wLWhwLWJzZAorCWV4aXQgOzsKKyAgICAqOT8/KjpNUEUvaVg6KjoqIHwgKjMwMDAqOk1QRS9pWDoqOiopCisJZWNobyBocHBhMS4wLWhwLW1wZWl4CisJZXhpdCA7OworICAgIGhwNz8/Ok9TRjE6KjoqIHwgaHA4P1s3OV06T1NGMToqOiogKQorCWVjaG8gaHBwYTEuMS1ocC1vc2YKKwlleGl0IDs7CisgICAgaHA4Pz86T1NGMToqOiopCisJZWNobyBocHBhMS4wLWhwLW9zZgorCWV4aXQgOzsKKyAgICBpKjg2Ok9TRjE6KjoqKQorCWlmIFsgLXggL3Vzci9zYmluL3N5c3ZlcnNpb24gXSA7IHRoZW4KKwkgICAgZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tb3NmMW1rCisJZWxzZQorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1vc2YxCisJZmkKKwlleGl0IDs7CisgICAgcGFyaXNjKjpMaXRlcyo6KjoqKQorCWVjaG8gaHBwYTEuMS1ocC1saXRlcworCWV4aXQgOzsKKyAgICBDMSo6Q29udmV4T1M6KjoqIHwgY29udmV4OkNvbnZleE9TOkMxKjoqKQorCWVjaG8gYzEtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzIqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMio6KikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisgICAgICAgIGV4aXQgOzsKKyAgICBDMzQqOkNvbnZleE9TOio6KiB8IGNvbnZleDpDb252ZXhPUzpDMzQqOiopCisJZWNobyBjMzQtY29udmV4LWJzZAorICAgICAgICBleGl0IDs7CisgICAgQzM4KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzM4KjoqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKyAgICAgICAgZXhpdCA7OworICAgIEM0KjpDb252ZXhPUzoqOiogfCBjb252ZXg6Q29udmV4T1M6QzQqOiopCisJZWNobyBjNC1jb252ZXgtYnNkCisgICAgICAgIGV4aXQgOzsKKyAgICBDUkFZKlktTVA6KjoqOiopCisJZWNobyB5bXAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpbQS1aXTkwOio6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1jcmF5LXVuaWNvcyR7VU5BTUVfUkVMRUFTRX0gXAorCXwgc2VkIC1lICdzL0NSQVkuKlwoW0EtWl05MFwpL1wxLycgXAorCSAgICAgIC1lIHkvQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVovYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXovIFwKKwkgICAgICAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqVFM6KjoqOiopCisJZWNobyB0OTAtY3JheS11bmljb3Mke1VOQU1FX1JFTEVBU0V9IHwgc2VkIC1lICdzL1wuW14uXSokLy5YLycKKwlleGl0IDs7CisgICAgQ1JBWSpUM0U6KjoqOiopCisJZWNobyBhbHBoYWV2NS1jcmF5LXVuaWNvc21rJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIENSQVkqU1YxOio6KjoqKQorCWVjaG8gc3YxLWNyYXktdW5pY29zJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgICo6VU5JQ09TL21wOio6KikKKwllY2hvIGNyYXludi1jcmF5LXVuaWNvc21wJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy9cLlteLl0qJC8uWC8nCisJZXhpdCA7OworICAgIEYzMFswMV06VU5JWF9TeXN0ZW1fVjoqOiogfCBGNzAwOlVOSVhfU3lzdGVtX1Y6KjoqKQorCUZVSklUU1VfUFJPQz1gdW5hbWUgLW0gfCB0ciAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eidgCisgICAgICAgIEZVSklUU1VfU1lTPWB1bmFtZSAtcCB8IHRyICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JyB8IHNlZCAtZSAncy9cLy8vJ2AKKyAgICAgICAgRlVKSVRTVV9SRUw9YGVjaG8gJHtVTkFNRV9SRUxFQVNFfSB8IHNlZCAtZSAncy8gL18vJ2AKKyAgICAgICAgZWNobyAiJHtGVUpJVFNVX1BST0N9LWZ1aml0c3UtJHtGVUpJVFNVX1NZU30ke0ZVSklUU1VfUkVMfSIKKyAgICAgICAgZXhpdCA7OworICAgIDUwMDA6VU5JWF9TeXN0ZW1fVjo0Lio6KikKKyAgICAgICAgRlVKSVRTVV9TWVM9YHVuYW1lIC1wIHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzL1wvLy8nYAorICAgICAgICBGVUpJVFNVX1JFTD1gZWNobyAke1VOQU1FX1JFTEVBU0V9IHwgdHIgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonIHwgc2VkIC1lICdzLyAvXy8nYAorICAgICAgICBlY2hvICJzcGFyYy1mdWppdHN1LSR7RlVKSVRTVV9TWVN9JHtGVUpJVFNVX1JFTH0iCisJZXhpdCA7OworICAgIGkqODY6QlNELzM4NjoqOiogfCBpKjg2OkJTRC9PUzoqOiogfCAqOkFzY2VuZFwgRW1iZWRkZWQvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1ic2RpJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBzcGFyYyo6QlNEL09TOio6KikKKwllY2hvIHNwYXJjLXVua25vd24tYnNkaSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpCU0QvT1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWJzZGkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6RnJlZUJTRDoqOiopCisJY2FzZSAke1VOQU1FX01BQ0hJTkV9IGluCisJICAgIHBjOTgpCisJCWVjaG8gaTM4Ni11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJICAgIGFtZDY0KQorCQllY2hvIHg4Nl82NC11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJICAgICopCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWZyZWVic2RgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgIDs7CisJZXNhYworCWV4aXQgOzsKKyAgICBpKjpDWUdXSU4qOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWN5Z3dpbgorCWV4aXQgOzsKKyAgICAqOk1JTkdXKjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1taW5ndzMyCisJZXhpdCA7OworICAgIGkqOndpbmRvd3MzMio6KikKKyAgICAJIyB1bmFtZSAtbSBpbmNsdWRlcyAiLXBjIiBvbiB0aGlzIHN5c3RlbS4KKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LW1pbmd3MzIKKwlleGl0IDs7CisgICAgaSo6UFcqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXB3MzIKKwlleGl0IDs7CisgICAgKjpJbnRlcml4KjoqKQorICAgIAljYXNlICR7VU5BTUVfTUFDSElORX0gaW4KKwkgICAgeDg2KQorCQllY2hvIGk1ODYtcGMtaW50ZXJpeCR7VU5BTUVfUkVMRUFTRX0KKwkJZXhpdCA7OworCSAgICBhdXRoZW50aWNhbWQgfCBnZW51aW5laW50ZWwgfCBFTTY0VCkKKwkJZWNobyB4ODZfNjQtdW5rbm93bi1pbnRlcml4JHtVTkFNRV9SRUxFQVNFfQorCQlleGl0IDs7CisJICAgIElBNjQpCisJCWVjaG8gaWE2NC11bmtub3duLWludGVyaXgke1VOQU1FX1JFTEVBU0V9CisJCWV4aXQgOzsKKwllc2FjIDs7CisgICAgWzM0NV04NjpXaW5kb3dzXzk1OiogfCBbMzQ1XTg2OldpbmRvd3NfOTg6KiB8IFszNDVdODY6V2luZG93c19OVDoqKQorCWVjaG8gaSR7VU5BTUVfTUFDSElORX0tcGMtbWtzCisJZXhpdCA7OworICAgIDg2NjQ6V2luZG93c19OVDoqKQorCWVjaG8geDg2XzY0LXBjLW1rcworCWV4aXQgOzsKKyAgICBpKjpXaW5kb3dzX05UKjoqIHwgUGVudGl1bSo6V2luZG93c19OVCo6KikKKwkjIEhvdyBkbyB3ZSBrbm93IGl0J3MgSW50ZXJpeCByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYyBQT1NJWCBzdWJzeXN0ZW0/CisJIyBJdCBhbHNvIGNvbmZsaWN0cyB3aXRoIHByZS0yLjAgdmVyc2lvbnMgb2YgQVQmVCBVV0lOLiBTaG91bGQgd2UKKwkjIFVOQU1FX01BQ0hJTkUgYmFzZWQgb24gdGhlIG91dHB1dCBvZiB1bmFtZSBpbnN0ZWFkIG9mIGkzODY/CisJZWNobyBpNTg2LXBjLWludGVyaXgKKwlleGl0IDs7CisgICAgaSo6VVdJTio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtdXdpbgorCWV4aXQgOzsKKyAgICBhbWQ2NDpDWUdXSU4qOio6KiB8IHg4Nl82NDpDWUdXSU4qOio6KikKKwllY2hvIHg4Nl82NC11bmtub3duLWN5Z3dpbgorCWV4aXQgOzsKKyAgICBwKjpDWUdXSU4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1jeWd3aW4KKwlleGl0IDs7CisgICAgcHJlcCo6U3VuT1M6NS4qOiopCisJZWNobyBwb3dlcnBjbGUtdW5rbm93bi1zb2xhcmlzMmBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1teLl0qLy8nYAorCWV4aXQgOzsKKyAgICAqOkdOVToqOiopCisJIyB0aGUgR05VIHN5c3RlbQorCWVjaG8gYGVjaG8gJHtVTkFNRV9NQUNISU5FfXxzZWQgLWUgJ3MsWy0vXS4qJCwsJ2AtdW5rbm93bi1nbnVgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncywvLiokLCwnYAorCWV4aXQgOzsKKyAgICAqOkdOVS8qOio6KikKKwkjIG90aGVyIHN5c3RlbXMgd2l0aCBHTlUgbGliYyBhbmQgdXNlcmxhbmQKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1gZWNobyAke1VOQU1FX1NZU1RFTX0gfCBzZWQgJ3MsXlteL10qLywsJyB8IHRyICdbQS1aXScgJ1thLXpdJ2BgZWNobyAke1VOQU1FX1JFTEVBU0V9fHNlZCAtZSAncy9bLShdLiovLydgLWdudQorCWV4aXQgOzsKKyAgICBpKjg2Ok1pbml4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtbWluaXgKKwlleGl0IDs7CisgICAgYWxwaGE6TGludXg6KjoqKQorCWNhc2UgYHNlZCAtbiAnL15jcHUgbW9kZWwvcy9eLio6IFwoLipcKS9cMS9wJyA8IC9wcm9jL2NwdWluZm9gIGluCisJICBFVjUpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NSA7OworCSAgRVY1NikgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjU2IDs7CisJICBQQ0E1NikgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBQQ0E1NykgVU5BTUVfTUFDSElORT1hbHBoYXBjYTU2IDs7CisJICBFVjYpICAgVU5BTUVfTUFDSElORT1hbHBoYWV2NiA7OworCSAgRVY2NykgIFVOQU1FX01BQ0hJTkU9YWxwaGFldjY3IDs7CisJICBFVjY4KikgVU5BTUVfTUFDSElORT1hbHBoYWV2NjggOzsKKyAgICAgICAgZXNhYworCW9iamR1bXAgLS1wcml2YXRlLWhlYWRlcnMgL2Jpbi9zaCB8IGdyZXAgLXEgbGQuc28uMQorCWlmIHRlc3QgIiQ/IiA9IDAgOyB0aGVuIExJQkM9ImxpYmMxIiA7IGVsc2UgTElCQz0iIiA7IGZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251JHtMSUJDfQorCWV4aXQgOzsKKyAgICBhcm0qOkxpbnV4Oio6KikKKwlldmFsICRzZXRfY2NfZm9yX2J1aWxkCisJaWYgZWNobyBfX0FSTV9FQUJJX18gfCAkQ0NfRk9SX0JVSUxEIC1FIC0gMj4vZGV2L251bGwgXAorCSAgICB8IGdyZXAgLXEgX19BUk1fRUFCSV9fCisJdGhlbgorCSAgICBlY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwllbHNlCisJICAgIGVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudWVhYmkKKwlmaQorCWV4aXQgOzsKKyAgICBhdnIzMio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBjcmlzOkxpbnV4Oio6KikKKwllY2hvIGNyaXMtYXhpcy1saW51eC1nbnUKKwlleGl0IDs7CisgICAgY3Jpc3YzMjpMaW51eDoqOiopCisJZWNobyBjcmlzdjMyLWF4aXMtbGludXgtZ251CisJZXhpdCA7OworICAgIGZydjpMaW51eDoqOiopCisgICAgCWVjaG8gZnJ2LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIGkqODY6TGludXg6KjoqKQorCUxJQkM9Z251CisJZXZhbCAkc2V0X2NjX2Zvcl9idWlsZAorCXNlZCAncy9eCS8vJyA8PCBFT0YgPiRkdW1teS5jCisJI2lmZGVmIF9fZGlldGxpYmNfXworCUxJQkM9ZGlldGxpYmMKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeTElCQydgCisJZWNobyAiJHtVTkFNRV9NQUNISU5FfS1wYy1saW51eC0ke0xJQkN9IgorCWV4aXQgOzsKKyAgICBpYTY0OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbTMycio6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBtNjgqOkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgbWlwczpMaW51eDoqOiogfCBtaXBzNjQ6TGludXg6KjoqKQorCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwlzZWQgJ3MvXgkvLycgPDwgRU9GID4kZHVtbXkuYworCSN1bmRlZiBDUFUKKwkjdW5kZWYgJHtVTkFNRV9NQUNISU5FfQorCSN1bmRlZiAke1VOQU1FX01BQ0hJTkV9ZWwKKwkjaWYgZGVmaW5lZChfX01JUFNFTF9fKSB8fCBkZWZpbmVkKF9fTUlQU0VMKSB8fCBkZWZpbmVkKF9NSVBTRUwpIHx8IGRlZmluZWQoTUlQU0VMKQorCUNQVT0ke1VOQU1FX01BQ0hJTkV9ZWwKKwkjZWxzZQorCSNpZiBkZWZpbmVkKF9fTUlQU0VCX18pIHx8IGRlZmluZWQoX19NSVBTRUIpIHx8IGRlZmluZWQoX01JUFNFQikgfHwgZGVmaW5lZChNSVBTRUIpCisJQ1BVPSR7VU5BTUVfTUFDSElORX0KKwkjZWxzZQorCUNQVT0KKwkjZW5kaWYKKwkjZW5kaWYKK0VPRgorCWV2YWwgYCRDQ19GT1JfQlVJTEQgLUUgJGR1bW15LmMgMj4vZGV2L251bGwgfCBncmVwICdeQ1BVJ2AKKwl0ZXN0IHgiJHtDUFV9IiAhPSB4ICYmIHsgZWNobyAiJHtDUFV9LXVua25vd24tbGludXgtZ251IjsgZXhpdDsgfQorCTs7CisgICAgb3IzMjpMaW51eDoqOiopCisJZWNobyBvcjMyLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhZHJlOkxpbnV4Oio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHBhcmlzYzY0OkxpbnV4Oio6KiB8IGhwcGE2NDpMaW51eDoqOiopCisJZWNobyBocHBhNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgcGFyaXNjOkxpbnV4Oio6KiB8IGhwcGE6TGludXg6KjoqKQorCSMgTG9vayBmb3IgQ1BVIGxldmVsCisJY2FzZSBgZ3JlcCAnXmNwdVteYS16XSo6JyAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsIHwgY3V0IC1kJyAnIC1mMmAgaW4KKwkgIFBBNyopIGVjaG8gaHBwYTEuMS11bmtub3duLWxpbnV4LWdudSA7OworCSAgUEE4KikgZWNobyBocHBhMi4wLXVua25vd24tbGludXgtZ251IDs7CisJICAqKSAgICBlY2hvIGhwcGEtdW5rbm93bi1saW51eC1nbnUgOzsKKwllc2FjCisJZXhpdCA7OworICAgIHBwYzY0OkxpbnV4Oio6KikKKwllY2hvIHBvd2VycGM2NC11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBwcGM6TGludXg6KjoqKQorCWVjaG8gcG93ZXJwYy11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBzMzkwOkxpbnV4Oio6KiB8IHMzOTB4OkxpbnV4Oio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0taWJtLWxpbnV4CisJZXhpdCA7OworICAgIHNoNjQqOkxpbnV4Oio6KikKKyAgICAJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHNoKjpMaW51eDoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tbGludXgtZ251CisJZXhpdCA7OworICAgIHNwYXJjOkxpbnV4Oio6KiB8IHNwYXJjNjQ6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICB2YXg6TGludXg6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1kZWMtbGludXgtZ251CisJZXhpdCA7OworICAgIHg4Nl82NDpMaW51eDoqOiopCisJZWNobyB4ODZfNjQtdW5rbm93bi1saW51eC1nbnUKKwlleGl0IDs7CisgICAgeHRlbnNhKjpMaW51eDoqOiopCisgICAgCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWxpbnV4LWdudQorCWV4aXQgOzsKKyAgICBpKjg2OkRZTklYL3B0eDo0KjoqKQorCSMgcHR4IDQuMCBkb2VzIHVuYW1lIC1zIGNvcnJlY3RseSwgd2l0aCBEWU5JWC9wdHggaW4gdGhlcmUuCisJIyBlYXJsaWVyIHZlcnNpb25zIGFyZSBtZXNzZWQgdXAgYW5kIHB1dCB0aGUgbm9kZW5hbWUgaW4gYm90aAorCSMgc3lzbmFtZSBhbmQgbm9kZW5hbWUuCisJZWNobyBpMzg2LXNlcXVlbnQtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpVTklYX1NWOjQuMk1QOjIuKikKKyAgICAgICAgIyBVbml4d2FyZSBpcyBhbiBvZmZzaG9vdCBvZiBTVlI0LCBidXQgaXQgaGFzIGl0cyBvd24gdmVyc2lvbgorICAgICAgICAjIG51bWJlciBzZXJpZXMgc3RhcnRpbmcgd2l0aCAyLi4uCisgICAgICAgICMgSSBhbSBub3QgcG9zaXRpdmUgdGhhdCBvdGhlciBTVlI0IHN5c3RlbXMgd29uJ3QgbWF0Y2ggdGhpcywKKwkjIEkganVzdCBoYXZlIHRvIGhvcGUuICAtLSBybXMuCisgICAgICAgICMgVXNlIHN5c3Y0LjJ1dy4uLiBzbyB0aGF0IHN5c3Y0KiBtYXRjaGVzIGl0LgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1zeXN2NC4ydXcke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6T1MvMjoqOiopCisJIyBJZiB3ZSB3ZXJlIGFibGUgdG8gZmluZCBgdW5hbWUnLCB0aGVuIEVNWCBVbml4IGNvbXBhdGliaWxpdHkKKwkjIGlzIHByb2JhYmx5IGluc3RhbGxlZC4KKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtb3MyLWVteAorCWV4aXQgOzsKKyAgICBpKjg2OlhUUy0zMDA6KjpTVE9QKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLXN0b3AKKwlleGl0IDs7CisgICAgaSo4NjphdGhlb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWF0aGVvcworCWV4aXQgOzsKKyAgICBpKjg2OnN5bGxhYmxlOio6KikKKwllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc3lsbGFibGUKKwlleGl0IDs7CisgICAgaSo4NjpMeW54T1M6Mi4qOiogfCBpKjg2Okx5bnhPUzozLlswMV0qOiogfCBpKjg2Okx5bnhPUzo0LlswMl0qOiopCisJZWNobyBpMzg2LXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBpKjg2OipET1M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1tc2Rvc2RqZ3BwCisJZXhpdCA7OworICAgIGkqODY6Kjo0Lio6KiB8IGkqODY6U1lTVEVNX1Y6NC4qOiopCisJVU5BTUVfUkVMPWBlY2hvICR7VU5BTUVfUkVMRUFTRX0gfCBzZWQgJ3MvXC9NUCQvLydgCisJaWYgZ3JlcCBOb3ZlbGwgL3Vzci9pbmNsdWRlL2xpbmsuaCA+L2Rldi9udWxsIDI+L2Rldi9udWxsOyB0aGVuCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bml2ZWwtc3lzdiR7VU5BTUVfUkVMfQorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3Yke1VOQU1FX1JFTH0KKwlmaQorCWV4aXQgOzsKKyAgICBpKjg2Oio6NTpbNjc4XSopCisgICAgCSMgVW5peFdhcmUgNy54LCBPcGVuVU5JWCBhbmQgT3BlblNlcnZlciA2LgorCWNhc2UgYC9iaW4vdW5hbWUgLVggfCBncmVwICJeTWFjaGluZSJgIGluCisJICAgICo0ODYqKQkgICAgIFVOQU1FX01BQ0hJTkU9aTQ4NiA7OworCSAgICAqUGVudGl1bSkJICAgICBVTkFNRV9NQUNISU5FPWk1ODYgOzsKKwkgICAgKlBlbnQqfCpDZWxlcm9uKSBVTkFNRV9NQUNISU5FPWk2ODYgOzsKKwllc2FjCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tc3lzdiR7VU5BTUVfUkVMRUFTRX0ke1VOQU1FX1NZU1RFTX0ke1VOQU1FX1ZFUlNJT059CisJZXhpdCA7OworICAgIGkqODY6KjozLjI6KikKKwlpZiB0ZXN0IC1mIC91c3Ivb3B0aW9ucy9jYi5uYW1lOyB0aGVuCisJCVVOQU1FX1JFTD1gc2VkIC1uICdzLy4qVmVyc2lvbiAvL3AnIDwvdXNyL29wdGlvbnMvY2IubmFtZWAKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWlzYyRVTkFNRV9SRUwKKwllbGlmIC9iaW4vdW5hbWUgLVggMj4vZGV2L251bGwgPi9kZXYvbnVsbCA7IHRoZW4KKwkJVU5BTUVfUkVMPWAoL2Jpbi91bmFtZSAtWHxncmVwIFJlbGVhc2V8c2VkIC1lICdzLy4qPSAvLycpYAorCQkoL2Jpbi91bmFtZSAtWHxncmVwIGk4MDQ4NiA+L2Rldi9udWxsKSAmJiBVTkFNRV9NQUNISU5FPWk0ODYKKwkJKC9iaW4vdW5hbWUgLVh8Z3JlcCAnXk1hY2hpbmUuKlBlbnRpdW0nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTU4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudCAqSUknID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQkoL2Jpbi91bmFtZSAtWHxncmVwICdeTWFjaGluZS4qUGVudGl1bSBQcm8nID4vZGV2L251bGwpIFwKKwkJCSYmIFVOQU1FX01BQ0hJTkU9aTY4NgorCQllY2hvICR7VU5BTUVfTUFDSElORX0tcGMtc2NvJFVOQU1FX1JFTAorCWVsc2UKKwkJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXN5c3YzMgorCWZpCisJZXhpdCA7OworICAgIHBjOio6KjoqKQorCSMgTGVmdCBoZXJlIGZvciBjb21wYXRpYmlsaXR5OgorICAgICAgICAjIHVuYW1lIC1tIHByaW50cyBmb3IgREpHUFAgYWx3YXlzICdwYycsIGJ1dCBpdCBwcmludHMgbm90aGluZyBhYm91dAorICAgICAgICAjIHRoZSBwcm9jZXNzb3IsIHNvIHdlIHBsYXkgc2FmZSBieSBhc3N1bWluZyBpNTg2LgorCSMgTm90ZTogd2hhdGV2ZXIgdGhpcyBpcywgaXQgTVVTVCBiZSB0aGUgc2FtZSBhcyB3aGF0IGNvbmZpZy5zdWIKKwkjIHByaW50cyBmb3IgdGhlICJkamdwcCIgaG9zdCwgb3IgZWxzZSBHREIgY29uZmlndXJ5IHdpbGwgZGVjaWRlIHRoYXQKKwkjIHRoaXMgaXMgYSBjcm9zcy1idWlsZC4KKwllY2hvIGk1ODYtcGMtbXNkb3NkamdwcAorICAgICAgICBleGl0IDs7CisgICAgSW50ZWw6TWFjaDozKjoqKQorCWVjaG8gaTM4Ni1wYy1tYWNoMworCWV4aXQgOzsKKyAgICBwYXJhZ29uOio6KjoqKQorCWVjaG8gaTg2MC1pbnRlbC1vc2YxCisJZXhpdCA7OworICAgIGk4NjA6Kjo0Lio6KikgIyBpODYwLVNWUjQKKwlpZiBncmVwIFN0YXJkZW50IC91c3IvaW5jbHVkZS9zeXMvdWFkbWluLmggPi9kZXYvbnVsbCAyPiYxIDsgdGhlbgorCSAgZWNobyBpODYwLXN0YXJkZW50LXN5c3Yke1VOQU1FX1JFTEVBU0V9ICMgU3RhcmRlbnQgVmlzdHJhIGk4NjAtU1ZSNAorCWVsc2UgIyBBZGQgb3RoZXIgaTg2MC1TVlI0IHZlbmRvcnMgYmVsb3cgYXMgdGhleSBhcmUgZGlzY292ZXJlZC4KKwkgIGVjaG8gaTg2MC11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9ICAjIFVua25vd24gaTg2MC1TVlI0CisJZmkKKwlleGl0IDs7CisgICAgbWluaSo6Q1RJWDpTWVMqNToqKQorCSMgIm1pbmlmcmFtZSIKKwllY2hvIG02ODAxMC1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgbWM2OGs6VU5JWDpTWVNURU01OjMuNTFtKQorCWVjaG8gbTY4ay1jb252ZXJnZW50LXN5c3YKKwlleGl0IDs7CisgICAgTTY4MD8wOkQtTklYOjUuMzoqKQorCWVjaG8gbTY4ay1kaWFiLWRuaXgKKwlleGl0IDs7CisgICAgTTY4KjoqOlIzVls1Njc4XSo6KikKKwl0ZXN0IC1yIC9zeXNWNjggJiYgeyBlY2hvICdtNjhrLW1vdG9yb2xhLXN5c3YnOyBleGl0OyB9IDs7CisgICAgM1szNDVdPz86Kjo0LjA6My4wIHwgM1szNF0/P0E6Kjo0LjA6My4wIHwgM1szNF0/PywqOio6NC4wOjMuMCB8IDNbMzRdPz8vKjoqOjQuMDozLjAgfCA0NDAwOio6NC4wOjMuMCB8IDQ4NTA6Kjo0LjA6My4wIHwgU0tBNDA6Kjo0LjA6My4wIHwgU0RTMjoqOjQuMDozLjAgfCBTSEcyOio6NC4wOjMuMCB8IFM3NTAxKjoqOjQuMDozLjApCisJT1NfUkVMPScnCisJdGVzdCAtciAvZXRjLy5yZWxpZCBcCisJJiYgT1NfUkVMPS5gc2VkIC1uICdzL1teIF0qIFteIF0qIFwoWzAtOV1bMC05XVwpLiovXDEvcCcgPCAvZXRjLy5yZWxpZGAKKwkvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKwkgICYmIHsgZWNobyBpNDg2LW5jci1zeXN2NC4zJHtPU19SRUx9OyBleGl0OyB9CisJL2Jpbi91bmFtZSAtcCAyPi9kZXYvbnVsbCB8IC9iaW4vZ3JlcCBlbnRpdW0gPi9kZXYvbnVsbCBcCisJICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIDNbMzRdPz86Kjo0LjA6KiB8IDNbMzRdPz8sKjoqOjQuMDoqKQorICAgICAgICAvYmluL3VuYW1lIC1wIDI+L2Rldi9udWxsIHwgZ3JlcCA4NiA+L2Rldi9udWxsIFwKKyAgICAgICAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQ7IGV4aXQ7IH0gOzsKKyAgICBOQ1IqOio6NC4yOiogfCBNUFJBUyo6Kjo0LjI6KikKKwlPU19SRUw9Jy4zJworCXRlc3QgLXIgL2V0Yy8ucmVsaWQgXAorCSAgICAmJiBPU19SRUw9LmBzZWQgLW4gJ3MvW14gXSogW14gXSogXChbMC05XVswLTldXCkuKi9cMS9wJyA8IC9ldGMvLnJlbGlkYAorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCBncmVwIDg2ID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTQ4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgZW50aXVtID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfQorCS9iaW4vdW5hbWUgLXAgMj4vZGV2L251bGwgfCAvYmluL2dyZXAgcHRlcm9uID4vZGV2L251bGwgXAorCSAgICAmJiB7IGVjaG8gaTU4Ni1uY3Itc3lzdjQuMyR7T1NfUkVMfTsgZXhpdDsgfSA7OworICAgIG02OCo6THlueE9TOjIuKjoqIHwgbTY4KjpMeW54T1M6My4wKjoqKQorCWVjaG8gbTY4ay11bmtub3duLWx5bnhvcyR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgbWM2ODAzMDpVTklYX1N5c3RlbV9WOjQuKjoqKQorCWVjaG8gbTY4ay1hdGFyaS1zeXN2NAorCWV4aXQgOzsKKyAgICBUU1VOQU1JOkx5bnhPUzoyLio6KikKKwllY2hvIHNwYXJjLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICByczYwMDA6THlueE9TOjIuKjoqKQorCWVjaG8gcnM2MDAwLXVua25vd24tbHlueG9zJHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBQb3dlclBDOkx5bnhPUzoyLio6KiB8IFBvd2VyUEM6THlueE9TOjMuWzAxXSo6KiB8IFBvd2VyUEM6THlueE9TOjQuWzAyXSo6KikKKwllY2hvIHBvd2VycGMtdW5rbm93bi1seW54b3Mke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNNW0JFXVM6VU5JWF9TVjoqOiopCisJZWNobyBtaXBzLWRkZS1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBSTSo6UmVsaWFudFVOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICBSTSo6U0lOSVgtKjoqOiopCisJZWNobyBtaXBzLXNuaS1zeXN2NAorCWV4aXQgOzsKKyAgICAqOlNJTklYLSo6KjoqKQorCWlmIHVuYW1lIC1wIDI+L2Rldi9udWxsID4vZGV2L251bGwgOyB0aGVuCisJCVVOQU1FX01BQ0hJTkU9YCh1bmFtZSAtcCkgMj4vZGV2L251bGxgCisJCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zbmktc3lzdjQKKwllbHNlCisJCWVjaG8gbnMzMmstc25pLXN5c3YKKwlmaQorCWV4aXQgOzsKKyAgICBQRU5USVVNOio6NC4wKjoqKSAjIFVuaXN5cyBgQ2xlYXJQYXRoIEhNUCBJWCA0MDAwJyBTVlI0L01QIGVmZm9ydAorICAgICAgICAgICAgICAgICAgICAgICMgc2F5cyA8UmljaGFyZC5NLkJhcnRlbEBjY01haWwuQ2Vuc3VzLkdPVj4KKyAgICAgICAgZWNobyBpNTg2LXVuaXN5cy1zeXN2NAorICAgICAgICBleGl0IDs7CisgICAgKjpVTklYX1N5c3RlbV9WOjQqOkZUWCopCisJIyBGcm9tIEdlcmFsZCBIZXdlcyA8aGV3ZXNAb3Blbm1hcmtldC5jb20+LgorCSMgSG93IGFib3V0IGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHN0cmF0dXMgYXJjaGl0ZWN0dXJlcz8gLWRqbQorCWVjaG8gaHBwYTEuMS1zdHJhdHVzLXN5c3Y0CisJZXhpdCA7OworICAgICo6KjoqOkZUWCopCisJIyBGcm9tIHNlYW5mQHN3ZGMuc3RyYXR1cy5jb20uCisJZWNobyBpODYwLXN0cmF0dXMtc3lzdjQKKwlleGl0IDs7CisgICAgaSo4NjpWT1M6KjoqKQorCSMgRnJvbSBQYXVsLkdyZWVuQHN0cmF0dXMuY29tLgorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1zdHJhdHVzLXZvcworCWV4aXQgOzsKKyAgICAqOlZPUzoqOiopCisJIyBGcm9tIFBhdWwuR3JlZW5Ac3RyYXR1cy5jb20uCisJZWNobyBocHBhMS4xLXN0cmF0dXMtdm9zCisJZXhpdCA7OworICAgIG1jNjgqOkEvVVg6KjoqKQorCWVjaG8gbTY4ay1hcHBsZS1hdXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIG5ld3MqOk5FV1MtT1M6Nio6KikKKwllY2hvIG1pcHMtc29ueS1uZXdzb3M2CisJZXhpdCA7OworICAgIFJbMzRdMDAwOipTeXN0ZW1fVio6KjoqIHwgUjQwMDA6VU5JWF9TWVNWOio6KiB8IFIqMDAwOlVOSVhfU1Y6KjoqKQorCWlmIFsgLWQgL3Vzci9uZWMgXTsgdGhlbgorCSAgICAgICAgZWNobyBtaXBzLW5lYy1zeXN2JHtVTkFNRV9SRUxFQVNFfQorCWVsc2UKKwkgICAgICAgIGVjaG8gbWlwcy11bmtub3duLXN5c3Yke1VOQU1FX1JFTEVBU0V9CisJZmkKKyAgICAgICAgZXhpdCA7OworICAgIEJlQm94OkJlT1M6KjoqKQkjIEJlT1MgcnVubmluZyBvbiBoYXJkd2FyZSBtYWRlIGJ5IEJlLCBQUEMgb25seS4KKwllY2hvIHBvd2VycGMtYmUtYmVvcworCWV4aXQgOzsKKyAgICBCZU1hYzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gTWFjIG9yIE1hYyBjbG9uZSwgUFBDIG9ubHkuCisJZWNobyBwb3dlcnBjLWFwcGxlLWJlb3MKKwlleGl0IDs7CisgICAgQmVQQzpCZU9TOio6KikJIyBCZU9TIHJ1bm5pbmcgb24gSW50ZWwgUEMgY29tcGF0aWJsZS4KKwllY2hvIGk1ODYtcGMtYmVvcworCWV4aXQgOzsKKyAgICBCZVBDOkhhaWt1Oio6KikJIyBIYWlrdSBydW5uaW5nIG9uIEludGVsIFBDIGNvbXBhdGlibGUuCisJZWNobyBpNTg2LXBjLWhhaWt1CisJZXhpdCA7OworICAgIFNYLTQ6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g0LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC01OlNVUEVSLVVYOio6KikKKwllY2hvIHN4NS1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtNjpTVVBFUi1VWDoqOiopCisJZWNobyBzeDYtbmVjLXN1cGVydXgke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgIFNYLTc6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g3LW5lYy1zdXBlcnV4JHtVTkFNRV9SRUxFQVNFfQorCWV4aXQgOzsKKyAgICBTWC04OlNVUEVSLVVYOio6KikKKwllY2hvIHN4OC1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgU1gtOFI6U1VQRVItVVg6KjoqKQorCWVjaG8gc3g4ci1uZWMtc3VwZXJ1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgUG93ZXIqOlJoYXBzb2R5Oio6KikKKwllY2hvIHBvd2VycGMtYXBwbGUtcmhhcHNvZHkke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UmhhcHNvZHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1hcHBsZS1yaGFwc29keSR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEYXJ3aW46KjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgIHx8IFVOQU1FX1BST0NFU1NPUj11bmtub3duCisJY2FzZSAkVU5BTUVfUFJPQ0VTU09SIGluCisJICAgIGkzODYpCisJCWV2YWwgJHNldF9jY19mb3JfYnVpbGQKKwkJaWYgWyAiJENDX0ZPUl9CVUlMRCIgIT0gJ25vX2NvbXBpbGVyX2ZvdW5kJyBdOyB0aGVuCisJCSAgaWYgKGVjaG8gJyNpZmRlZiBfX0xQNjRfXyc7IGVjaG8gSVNfNjRCSVRfQVJDSDsgZWNobyAnI2VuZGlmJykgfCBcCisJCSAgICAgIChDQ09QVFM9ICRDQ19GT1JfQlVJTEQgLUUgLSAyPi9kZXYvbnVsbCkgfCBcCisJCSAgICAgIGdyZXAgSVNfNjRCSVRfQVJDSCA+L2Rldi9udWxsCisJCSAgdGhlbgorCQkgICAgICBVTkFNRV9QUk9DRVNTT1I9Ing4Nl82NCIKKwkJICBmaQorCQlmaSA7OworCSAgICB1bmtub3duKSBVTkFNRV9QUk9DRVNTT1I9cG93ZXJwYyA7OworCWVzYWMKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS1hcHBsZS1kYXJ3aW4ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6cHJvY250byo6KjoqIHwgKjpRTlg6WzAxMjM0NTY3ODldKjoqKQorCVVOQU1FX1BST0NFU1NPUj1gdW5hbWUgLXBgCisJaWYgdGVzdCAiJFVOQU1FX1BST0NFU1NPUiIgPSAieDg2IjsgdGhlbgorCQlVTkFNRV9QUk9DRVNTT1I9aTM4NgorCQlVTkFNRV9NQUNISU5FPXBjCisJZmkKKwllY2hvICR7VU5BTUVfUFJPQ0VTU09SfS0ke1VOQU1FX01BQ0hJTkV9LW50by1xbngke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UU5YOio6NCopCisJZWNobyBpMzg2LXBjLXFueAorCWV4aXQgOzsKKyAgICBOU0UtPzpOT05TVE9QX0tFUk5FTDoqOiopCisJZWNobyBuc2UtdGFuZGVtLW5zayR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgTlNSLT86Tk9OU1RPUF9LRVJORUw6KjoqKQorCWVjaG8gbnNyLXRhbmRlbS1uc2ske1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6Tm9uU3RvcC1VWDoqOiopCisJZWNobyBtaXBzLWNvbXBhcS1ub25zdG9wdXgKKwlleGl0IDs7CisgICAgQlMyMDAwOlBPU0lYKjoqOiopCisJZWNobyBiczIwMDAtc2llbWVucy1zeXN2CisJZXhpdCA7OworICAgIERTLyo6VU5JWF9TeXN0ZW1fVjoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LSR7VU5BTUVfU1lTVEVNfS0ke1VOQU1FX1JFTEVBU0V9CisJZXhpdCA7OworICAgICo6UGxhbjk6KjoqKQorCSMgInVuYW1lIC1tIiBpcyBub3QgY29uc2lzdGVudCwgc28gdXNlICRjcHV0eXBlIGluc3RlYWQuIDM4NgorCSMgaXMgY29udmVydGVkIHRvIGkzODYgZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgeDg2CisJIyBvcGVyYXRpbmcgc3lzdGVtcy4KKwlpZiB0ZXN0ICIkY3B1dHlwZSIgPSAiMzg2IjsgdGhlbgorCSAgICBVTkFNRV9NQUNISU5FPWkzODYKKwllbHNlCisJICAgIFVOQU1FX01BQ0hJTkU9IiRjcHV0eXBlIgorCWZpCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXVua25vd24tcGxhbjkKKwlleGl0IDs7CisgICAgKjpUT1BTLTEwOio6KikKKwllY2hvIHBkcDEwLXVua25vd24tdG9wczEwCisJZXhpdCA7OworICAgICo6VEVORVg6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10ZW5leAorCWV4aXQgOzsKKyAgICBLUzEwOlRPUFMtMjA6KjoqIHwgS0wxMDpUT1BTLTIwOio6KiB8IFRZUEU0OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtZGVjLXRvcHMyMAorCWV4aXQgOzsKKyAgICBYS0wtMTpUT1BTLTIwOio6KiB8IFRZUEU1OlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAteGtsLXRvcHMyMAorCWV4aXQgOzsKKyAgICAqOlRPUFMtMjA6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi10b3BzMjAKKwlleGl0IDs7CisgICAgKjpJVFM6KjoqKQorCWVjaG8gcGRwMTAtdW5rbm93bi1pdHMKKwlleGl0IDs7CisgICAgU0VJOio6KjpTRUlVWCkKKyAgICAgICAgZWNobyBtaXBzLXNlaS1zZWl1eCR7VU5BTUVfUkVMRUFTRX0KKwlleGl0IDs7CisgICAgKjpEcmFnb25GbHk6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS11bmtub3duLWRyYWdvbmZseWBlY2hvICR7VU5BTUVfUkVMRUFTRX18c2VkIC1lICdzL1stKF0uKi8vJ2AKKwlleGl0IDs7CisgICAgKjoqVk1TOio6KikKKyAgICAJVU5BTUVfTUFDSElORT1gKHVuYW1lIC1wKSAyPi9kZXYvbnVsbGAKKwljYXNlICIke1VOQU1FX01BQ0hJTkV9IiBpbgorCSAgICBBKikgZWNobyBhbHBoYS1kZWMtdm1zIDsgZXhpdCA7OworCSAgICBJKikgZWNobyBpYTY0LWRlYy12bXMgOyBleGl0IDs7CisJICAgIFYqKSBlY2hvIHZheC1kZWMtdm1zIDsgZXhpdCA7OworCWVzYWMgOzsKKyAgICAqOlhFTklYOio6U3lzVikKKwllY2hvIGkzODYtcGMteGVuaXgKKwlleGl0IDs7CisgICAgaSo4Njpza3lvczoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLXNreW9zYGVjaG8gJHtVTkFNRV9SRUxFQVNFfWAgfCBzZWQgLWUgJ3MvIC4qJC8vJworCWV4aXQgOzsKKyAgICBpKjg2OnJkb3M6KjoqKQorCWVjaG8gJHtVTkFNRV9NQUNISU5FfS1wYy1yZG9zCisJZXhpdCA7OworICAgIGkqODY6QVJPUzoqOiopCisJZWNobyAke1VOQU1FX01BQ0hJTkV9LXBjLWFyb3MKKwlleGl0IDs7Citlc2FjCisKKyNlY2hvICcoTm8gdW5hbWUgY29tbWFuZCBvciB1bmFtZSBvdXRwdXQgbm90IHJlY29nbml6ZWQuKScgMT4mMgorI2VjaG8gIiR7VU5BTUVfTUFDSElORX06JHtVTkFNRV9TWVNURU19OiR7VU5BTUVfUkVMRUFTRX06JHtVTkFNRV9WRVJTSU9OfSIgMT4mMgorCitldmFsICRzZXRfY2NfZm9yX2J1aWxkCitjYXQgPiRkdW1teS5jIDw8RU9GCisjaWZkZWYgX1NFUVVFTlRfCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorIyBpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2VuZGlmCittYWluICgpCit7CisjaWYgZGVmaW5lZCAoc29ueSkKKyNpZiBkZWZpbmVkIChNSVBTRUIpCisgIC8qIEJGRCB3YW50cyAiYnNkIiBpbnN0ZWFkIG9mICJuZXdzb3MiLiAgUGVyaGFwcyBCRkQgc2hvdWxkIGJlIGNoYW5nZWQsCisgICAgIEkgZG9uJ3Qga25vdy4uLi4gICovCisgIHByaW50ZiAoIm1pcHMtc29ueS1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisgIHByaW50ZiAoIm02OGstc29ueS1uZXdzb3Mlc1xuIiwKKyNpZmRlZiBORVdTT1M0CisgICAgICAgICAgIjQiCisjZWxzZQorCSAgIiIKKyNlbmRpZgorICAgICAgICAgKTsgZXhpdCAoMCk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX19hcm0pICYmIGRlZmluZWQgKF9fYWNvcm4pICYmIGRlZmluZWQgKF9fdW5peCkKKyAgcHJpbnRmICgiYXJtLWFjb3JuLXJpc2NpeFxuIik7IGV4aXQgKDApOworI2VuZGlmCisKKyNpZiBkZWZpbmVkIChocDMwMCkgJiYgIWRlZmluZWQgKGhwdXgpCisgIHByaW50ZiAoIm02OGstaHAtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQgKE5lWFQpCisjaWYgIWRlZmluZWQgKF9fQVJDSElURUNUVVJFX18pCisjZGVmaW5lIF9fQVJDSElURUNUVVJFX18gIm02OGsiCisjZW5kaWYKKyAgaW50IHZlcnNpb247CisgIHZlcnNpb249YChob3N0aW5mbyB8IHNlZCAtbiAncy8uKk5lWFQgTWFjaCBcKFswLTldKlwpLiovXDEvcCcpIDI+L2Rldi9udWxsYDsKKyAgaWYgKHZlcnNpb24gPCA0KQorICAgIHByaW50ZiAoIiVzLW5leHQtbmV4dHN0ZXAlZFxuIiwgX19BUkNISVRFQ1RVUkVfXywgdmVyc2lvbik7CisgIGVsc2UKKyAgICBwcmludGYgKCIlcy1uZXh0LW9wZW5zdGVwJWRcbiIsIF9fQVJDSElURUNUVVJFX18sIHZlcnNpb24pOworICBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoTVVMVElNQVgpIHx8IGRlZmluZWQgKG4xNikKKyNpZiBkZWZpbmVkIChVTUFYVikKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLXN5c3ZcbiIpOyBleGl0ICgwKTsKKyNlbHNlCisjaWYgZGVmaW5lZCAoQ01VKQorICBwcmludGYgKCJuczMyay1lbmNvcmUtbWFjaFxuIik7IGV4aXQgKDApOworI2Vsc2UKKyAgcHJpbnRmICgibnMzMmstZW5jb3JlLWJzZFxuIik7IGV4aXQgKDApOworI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoX18zODZCU0RfXykKKyAgcHJpbnRmICgiaTM4Ni1wYy1ic2RcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorCisjaWYgZGVmaW5lZCAoc2VxdWVudCkKKyNpZiBkZWZpbmVkIChpMzg2KQorICBwcmludGYgKCJpMzg2LXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2lmIGRlZmluZWQgKG5zMzIwMDApCisgIHByaW50ZiAoIm5zMzJrLXNlcXVlbnQtZHluaXhcbiIpOyBleGl0ICgwKTsKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChfU0VRVUVOVF8pCisgICAgc3RydWN0IHV0c25hbWUgdW47CisKKyAgICB1bmFtZSgmdW4pOworCisgICAgaWYgKHN0cm5jbXAodW4udmVyc2lvbiwgIlYyIiwgMikgPT0gMCkgeworCXByaW50ZiAoImkzODYtc2VxdWVudC1wdHgyXG4iKTsgZXhpdCAoMCk7CisgICAgfQorICAgIGlmIChzdHJuY21wKHVuLnZlcnNpb24sICJWMSIsIDIpID09IDApIHsgLyogWFhYIGlzIFYxIGNvcnJlY3Q/ICovCisJcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eDFcbiIpOyBleGl0ICgwKTsKKyAgICB9CisgICAgcHJpbnRmICgiaTM4Ni1zZXF1ZW50LXB0eFxuIik7IGV4aXQgKDApOworCisjZW5kaWYKKworI2lmIGRlZmluZWQgKHZheCkKKyMgaWYgIWRlZmluZWQgKHVsdHJpeCkKKyMgIGluY2x1ZGUgPHN5cy9wYXJhbS5oPgorIyAgaWYgZGVmaW5lZCAoQlNEKQorIyAgIGlmIEJTRCA9PSA0MworICAgICAgcHJpbnRmICgidmF4LWRlYy1ic2Q0LjNcbiIpOyBleGl0ICgwKTsKKyMgICBlbHNlCisjICAgIGlmIEJTRCA9PSAxOTkwMDYKKyAgICAgIHByaW50ZiAoInZheC1kZWMtYnNkNC4zcmVub1xuIik7IGV4aXQgKDApOworIyAgICBlbHNlCisgICAgICBwcmludGYgKCJ2YXgtZGVjLWJzZFxuIik7IGV4aXQgKDApOworIyAgICBlbmRpZgorIyAgIGVuZGlmCisjICBlbHNlCisgICAgcHJpbnRmICgidmF4LWRlYy1ic2RcbiIpOyBleGl0ICgwKTsKKyMgIGVuZGlmCisjIGVsc2UKKyAgICBwcmludGYgKCJ2YXgtZGVjLXVsdHJpeFxuIik7IGV4aXQgKDApOworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIChhbGxpYW50KSAmJiBkZWZpbmVkIChpODYwKQorICBwcmludGYgKCJpODYwLWFsbGlhbnQtYnNkXG4iKTsgZXhpdCAoMCk7CisjZW5kaWYKKworICBleGl0ICgxKTsKK30KK0VPRgorCiskQ0NfRk9SX0JVSUxEIC1vICRkdW1teSAkZHVtbXkuYyAyPi9kZXYvbnVsbCAmJiBTWVNURU1fTkFNRT1gJGR1bW15YCAmJgorCXsgZWNobyAiJFNZU1RFTV9OQU1FIjsgZXhpdDsgfQorCisjIEFwb2xsb3MgcHV0IHRoZSBzeXN0ZW0gdHlwZSBpbiB0aGUgZW52aXJvbm1lbnQuCisKK3Rlc3QgLWQgL3Vzci9hcG9sbG8gJiYgeyBlY2hvICR7SVNQfS1hcG9sbG8tJHtTWVNUWVBFfTsgZXhpdDsgfQorCisjIENvbnZleCB2ZXJzaW9ucyB0aGF0IHByZWRhdGUgdW5hbWUgY2FuIHVzZSBnZXRzeXNpbmZvKDEpCisKK2lmIFsgLXggL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyBdCit0aGVuCisgICAgY2FzZSBgZ2V0c3lzaW5mbyAtZiBjcHVfdHlwZWAgaW4KKyAgICBjMSopCisJZWNobyBjMS1jb252ZXgtYnNkCisJZXhpdCA7OworICAgIGMyKikKKwlpZiBnZXRzeXNpbmZvIC1mIHNjYWxhcl9hY2MKKwl0aGVuIGVjaG8gYzMyLWNvbnZleC1ic2QKKwllbHNlIGVjaG8gYzItY29udmV4LWJzZAorCWZpCisJZXhpdCA7OworICAgIGMzNCopCisJZWNobyBjMzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBjMzgqKQorCWVjaG8gYzM4LWNvbnZleC1ic2QKKwlleGl0IDs7CisgICAgYzQqKQorCWVjaG8gYzQtY29udmV4LWJzZAorCWV4aXQgOzsKKyAgICBlc2FjCitmaQorCitjYXQgPiYyIDw8RU9GCiskMDogdW5hYmxlIHRvIGd1ZXNzIHN5c3RlbSB0eXBlCisKK1RoaXMgc2NyaXB0LCBsYXN0IG1vZGlmaWVkICR0aW1lc3RhbXAsIGhhcyBmYWlsZWQgdG8gcmVjb2duaXplCit0aGUgb3BlcmF0aW5nIHN5c3RlbSB5b3UgYXJlIHVzaW5nLiBJdCBpcyBhZHZpc2VkIHRoYXQgeW91Citkb3dubG9hZCB0aGUgbW9zdCB1cCB0byBkYXRlIHZlcnNpb24gb2YgdGhlIGNvbmZpZyBzY3JpcHRzIGZyb20KKworICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLmd1ZXNzO2hiPUhFQUQKK2FuZAorICBodHRwOi8vZ2l0LnNhdmFubmFoLmdudS5vcmcvZ2l0d2ViLz9wPWNvbmZpZy5naXQ7YT1ibG9iX3BsYWluO2Y9Y29uZmlnLnN1YjtoYj1IRUFECisKK0lmIHRoZSB2ZXJzaW9uIHlvdSBydW4gKCQwKSBpcyBhbHJlYWR5IHVwIHRvIGRhdGUsIHBsZWFzZQorc2VuZCB0aGUgZm9sbG93aW5nIGRhdGEgYW5kIGFueSBpbmZvcm1hdGlvbiB5b3UgdGhpbmsgbWlnaHQgYmUKK3BlcnRpbmVudCB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aGUgbmVlZGVkCitpbmZvcm1hdGlvbiB0byBoYW5kbGUgeW91ciBzeXN0ZW0uCisKK2NvbmZpZy5ndWVzcyB0aW1lc3RhbXAgPSAkdGltZXN0YW1wCisKK3VuYW1lIC1tID0gYCh1bmFtZSAtbSkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXIgPSBgKHVuYW1lIC1yKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtcyA9IGAodW5hbWUgLXMpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC12ID0gYCh1bmFtZSAtdikgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorCisvdXNyL2Jpbi91bmFtZSAtcCA9IGAoL3Vzci9iaW4vdW5hbWUgLXApIDI+L2Rldi9udWxsYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsYAorCitob3N0aW5mbyAgICAgICAgICAgICAgID0gYChob3N0aW5mbykgMj4vZGV2L251bGxgCisvYmluL3VuaXZlcnNlICAgICAgICAgID0gYCgvYmluL3VuaXZlcnNlKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsYAorL2Jpbi9hcmNoICAgICAgICAgICAgICA9IGAoL2Jpbi9hcmNoKSAyPi9kZXYvbnVsbGAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsYAorL3Vzci9jb252ZXgvZ2V0c3lzaW5mbyA9IGAoL3Vzci9jb252ZXgvZ2V0c3lzaW5mbykgMj4vZGV2L251bGxgCisKK1VOQU1FX01BQ0hJTkUgPSAke1VOQU1FX01BQ0hJTkV9CitVTkFNRV9SRUxFQVNFID0gJHtVTkFNRV9SRUxFQVNFfQorVU5BTUVfU1lTVEVNICA9ICR7VU5BTUVfU1lTVEVNfQorVU5BTUVfVkVSU0lPTiA9ICR7VU5BTUVfVkVSU0lPTn0KK0VPRgorCitleGl0IDEKKworIyBMb2NhbCB2YXJpYWJsZXM6CisjIGV2YWw6IChhZGQtaG9vayAnd3JpdGUtZmlsZS1ob29rcyAndGltZS1zdGFtcCkKKyMgdGltZS1zdGFtcC1zdGFydDogInRpbWVzdGFtcD0nIgorIyB0aW1lLXN0YW1wLWZvcm1hdDogIiU6eS0lMDJtLSUwMmQiCisjIHRpbWUtc3RhbXAtZW5kOiAiJyIKKyMgRW5kOgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9jb25maWcuaC5pbiBiL2xpYnBjYXAtMS4zLjAvY29uZmlnLmguaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1MTc3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvY29uZmlnLmguaW4KQEAgLTAsMCArMSwzMTQgQEAKKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmluIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBFbmFibGUgb3B0aW1pemVyIGRlYnVnZ2luZyAqLworI3VuZGVmIEJERUJVRworCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgYSBjbG9uaW5nIEJQRiBkZXZpY2UgKi8KKyN1bmRlZiBIQVZFX0NMT05JTkdfQlBGCisKKy8qIGRlZmluZSBpZiB5b3UgaGF2ZSB0aGUgREFHIEFQSSAqLworI3VuZGVmIEhBVkVfREFHX0FQSQorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgZGFnX2dldF9lcmZfdHlwZXMoKSAqLworI3VuZGVmIEhBVkVfREFHX0dFVF9FUkZfVFlQRVMKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcygpICovCisjdW5kZWYgSEFWRV9EQUdfR0VUX1NUUkVBTV9FUkZfVFlQRVMKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHN0cmVhbXMgY2FwYWJsZSBEQUcgQVBJICovCisjdW5kZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIHZkYWdfc2V0X2RldmljZV9pbmZvKCkgKi8KKyN1bmRlZiBIQVZFX0RBR19WREFHCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgZXRoZXJfaG9zdHRvbicsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjdW5kZWYgSEFWRV9ERUNMX0VUSEVSX0hPU1RUT04KKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGEgL2Rldi9kbHBpICovCisjdW5kZWYgSEFWRV9ERVZfRExQSQorCisvKiBpZiBwYXNzaXZlX3JlcV90IHByaW1pdGl2ZSBleGlzdHMgKi8KKyN1bmRlZiBIQVZFX0RMUElfUEFTU0lWRQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGV0aGVyX2hvc3R0b24nIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfRVRIRVJfSE9TVFRPTgorCisvKiBEZWZpbmUgdG8gMSBpZiBmc2Vla28gKGFuZCBwcmVzdW1hYmx5IGZ0ZWxsbykgZXhpc3RzIGFuZCBpcyBkZWNsYXJlZC4gKi8KKyN1bmRlZiBIQVZFX0ZTRUVLTworCisvKiBvbiBIUC1VWCAxMC4yMCBvciBsYXRlciAqLworI3VuZGVmIEhBVkVfSFBVWDEwXzIwX09SX0xBVEVSCisKKy8qIG9uIEhQLVVYIDkueCAqLworI3VuZGVmIEhBVkVfSFBVWDkKKworLyogaWYgcHBhX2luZm9fdF9kbF9tb2R1bGVfaWQgZXhpc3RzICovCisjdW5kZWYgSEFWRV9IUF9QUEFfSU5GT19UX0RMX01PRFVMRV9JRF8xCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9JTlRUWVBFU19ICisKKy8qIGlmIGxpYmRscGkgZXhpc3RzICovCisjdW5kZWYgSEFWRV9MSUJETFBJCisKKy8qIGlmIGxpYm5sIGV4aXN0cyAqLworI3VuZGVmIEhBVkVfTElCTkwKKworLyogaWYgbGlibmwgZXhpc3RzIGFuZCBpcyB2ZXJzaW9uIDIueCAqLworI3VuZGVmIEhBVkVfTElCTkxfMl94CisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGltaXRzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElNSVRTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9jb21waWxlci5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX0NPTVBJTEVSX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9ldGh0b29sLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfRVRIVE9PTF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvaWZfcGFja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfSUZfUEFDS0VUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9uZXRfdHN0YW1wLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfTkVUX1RTVEFNUF9ICisKKy8qIGlmIHRwX3ZsYW5fdGNpIGV4aXN0cyAqLworI3VuZGVmIEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9MSU5VWF9UWVBFU19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvdXNiZGV2aWNlX2ZzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTElOVVhfVVNCREVWSUNFX0ZTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC93aXJlbGVzcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0xJTlVYX1dJUkVMRVNTX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldGluZXQvZXRoZXIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRJTkVUX0VUSEVSX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRpbmV0L2lmX2V0aGVyLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmV0cGFja2V0L2lmX3BhY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVFBBQ0tFVF9JRl9QQUNLRVRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldHBhY2tldC9wYWNrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRQQUNLRVRfUEFDS0VUX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXQvaWZfbWVkaWEuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ORVRfSUZfTUVESUFfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldC9wZnZhci5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX05FVF9QRlZBUl9ICisKKy8qIGlmIHRoZXJlJ3MgYW4gb3NfcHJvdG8uaCBmb3IgdGhpcyBwbGF0Zm9ybSwgdG8gdXNlIGFkZGl0aW9uYWwgcHJvdG90eXBlcyAqLworI3VuZGVmIEhBVkVfT1NfUFJPVE9fSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHBhdGhzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfUEFUSFNfSAorCisvKiBkZWZpbmUgaWYgbmV0L3BmdmFyLmggZGVmaW5lcyBQRl9OQVQgdGhyb3VnaCBQRl9OT1JEUiAqLworI3VuZGVmIEhBVkVfUEZfTkFUX1RIUk9VR0hfUEZfTk9SRFIKKworLyogZGVmaW5lIGlmIHlvdSBoYXZlIGEgU2VwdGVsIEFQSSAqLworI3VuZGVmIEhBVkVfU0VQVEVMX0FQSQorCisvKiBkZWZpbmUgaWYgeW91IGhhdmUgTXlyaWNvbSBTTkYgQVBJICovCisjdW5kZWYgSEFWRV9TTkZfQVBJCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc25wcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfU05QUklOVEYKKworLyogaWYgc3RydWN0IHNvY2thZGRyIGhhcyB0aGUgc2FfbGVuIG1lbWJlciAqLworI3VuZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisKKy8qIGlmIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGV4aXN0cyAqLworI3VuZGVmIEhBVkVfU09DS0FERFJfU1RPUkFHRQorCisvKiBkZWZpbmUgaWYgc29ja2xlbl90IGlzIGRlZmluZWQgKi8KKyN1bmRlZiBIQVZFX1NPQ0tMRU5fVAorCisvKiBPbiBzb2xhcmlzICovCisjdW5kZWYgSEFWRV9TT0xBUklTCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1RESU5UX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TVERMSUJfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX1NUUkVSUk9SCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR1NfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1NUUklOR19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybGNweScgZnVuY3Rpb24uICovCisjdW5kZWYgSEFWRV9TVFJMQ1BZCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgQlBGX1RJTUVWQUwnLiAqLworI3VuZGVmIEhBVkVfU1RSVUNUX0JQRl9USU1FVkFMCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBzeXN0ZW0gaGFzIHRoZSB0eXBlIGBzdHJ1Y3QgZXRoZXJfYWRkcicuICovCisjdW5kZWYgSEFWRV9TVFJVQ1RfRVRIRVJfQUREUgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9iaXR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9idWZtb2QuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfQlVGTU9EX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGxwaV9leHQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfRExQSV9FWFRfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9pb2Njb20uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfSU9DQ09NX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2lvLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1NPQ0tJT19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9TWVNfU1RBVF9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU1lTX1RZUEVTX0gKKworLyogaWYgaWZfcGFja2V0LmggaGFzIHRwYWNrZXRfc3RhdHMgZGVmaW5lZCAqLworI3VuZGVmIEhBVkVfVFBBQ0tFVF9TVEFUUworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX1VOSVNURF9ICisKKy8qIGlmIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgaGFzIGJSZXF1ZXN0VHlwZSAqLworI3VuZGVmIEhBVkVfVVNCREVWRlNfQ1RSTFRSQU5TRkVSX0JSRVFVRVNUVFlQRQorCisvKiBkZWZpbmUgaWYgdmVyc2lvbi5oIGlzIGdlbmVyYXRlZCBpbiB0aGUgYnVpbGQgcHJvY2VkdXJlICovCisjdW5kZWYgSEFWRV9WRVJTSU9OX0gKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB2c25wcmludGYnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfVlNOUFJJTlRGCisKKy8qIGRlZmluZSBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHplcm9jb3B5IEJQRiAqLworI3VuZGVmIEhBVkVfWkVST0NPUFlfQlBGCisKKy8qIGRlZmluZSBpZiB5b3VyIGNvbXBpbGVyIGhhcyBfX2F0dHJpYnV0ZV9fICovCisjdW5kZWYgSEFWRV9fX0FUVFJJQlVURV9fCisKKy8qIElQdjYgKi8KKyN1bmRlZiBJTkVUNgorCisvKiBpZiB1bmFsaWduZWQgYWNjZXNzIGZhaWxzICovCisjdW5kZWYgTEJMX0FMSUdOCisKKy8qIHBhdGggZm9yIGRldmljZSBmb3IgVVNCIHNuaWZmaW5nICovCisjdW5kZWYgTElOVVhfVVNCX01PTl9ERVYKKworLyogRGVmaW5lIHRvIDEgaWYgbmV0aW5ldC9ldGhlci5oIGRlY2xhcmVzIGBldGhlcl9ob3N0dG9uJyAqLworI3VuZGVmIE5FVElORVRfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9IT1NUVE9OCisKKy8qIERlZmluZSB0byAxIGlmIG5ldGluZXQvaWZfZXRoZXIuaCBkZWNsYXJlcyBgZXRoZXJfaG9zdHRvbicgKi8KKyN1bmRlZiBORVRJTkVUX0lGX0VUSEVSX0hfREVDTEFSRVNfRVRIRVJfSE9TVFRPTgorCisvKiBkbyBub3QgdXNlIHByb3RvY2hhaW4gKi8KKyN1bmRlZiBOT19QUk9UT0NIQUlOCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX05BTUUKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfU1RSSU5HCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1VSTAorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTgorCisvKiAvZGV2L2RscGkgZGlyZWN0b3J5ICovCisjdW5kZWYgUENBUF9ERVZfUFJFRklYCisKKy8qIHRhcmdldCBob3N0IHN1cHBvcnRzIEJsdWV0b290aCBzbmlmZmluZyAqLworI3VuZGVmIFBDQVBfU1VQUE9SVF9CVAorCisvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBDQU4gc25pZmZpbmcgKi8KKyN1bmRlZiBQQ0FQX1NVUFBPUlRfQ0FOCisKKy8qIHRhcmdldCBob3N0IHN1cHBvcnRzIGNhbnVzYiAqLworI3VuZGVmIFBDQVBfU1VQUE9SVF9DQU5VU0IKKworLyogdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgbmV0ZmlsdGVyIHNuaWZmaW5nICovCisjdW5kZWYgUENBUF9TVVBQT1JUX05FVEZJTFRFUgorCisvKiB0YXJnZXQgaG9zdCBzdXBwb3J0cyBVU0Igc25pZmZpbmcgKi8KKyN1bmRlZiBQQ0FQX1NVUFBPUlRfVVNCCisKKy8qIGluY2x1ZGUgQUNOIHN1cHBvcnQgKi8KKyN1bmRlZiBTSVRBCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI3VuZGVmIFNURENfSEVBREVSUworCisvKiBFbmFibGUgcGFyc2VyIGRlYnVnZ2luZyAqLworI3VuZGVmIFlZREVCVUcKKworLyogTnVtYmVyIG9mIGJpdHMgaW4gYSBmaWxlIG9mZnNldCwgb24gaG9zdHMgd2hlcmUgdGhpcyBpcyBzZXR0YWJsZS4gKi8KKyN1bmRlZiBfRklMRV9PRkZTRVRfQklUUworCisvKiBuZWVkZWQgb24gSFAtVVggKi8KKyN1bmRlZiBfSFBVWF9TT1VSQ0UKKworLyogRGVmaW5lIHRvIDEgdG8gbWFrZSBmc2Vla28gdmlzaWJsZSBvbiBzb21lIGhvc3RzIChlLmcuIGdsaWJjIDIuMikuICovCisjdW5kZWYgX0xBUkdFRklMRV9TT1VSQ0UKKworLyogRGVmaW5lIGZvciBsYXJnZSBmaWxlcywgb24gQUlYLXN0eWxlIGhvc3RzLiAqLworI3VuZGVmIF9MQVJHRV9GSUxFUworCisvKiBkZWZpbmUgb24gQUlYIHRvIGdldCBjZXJ0YWluIGZ1bmN0aW9ucyAqLworI3VuZGVmIF9TVU4KKworLyogdG8gaGFuZGxlIFVsdHJpeCBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IGNvbnN0IGluIHByb3RvdHlwZXMgKi8KKyN1bmRlZiBjb25zdAorCisvKiBEZWZpbmUgYXMgdG9rZW4gZm9yIGlubGluZSBpZiBpbmxpbmluZyBzdXBwb3J0ZWQgKi8KKyN1bmRlZiBpbmxpbmUKKworLyogRGVmaW5lIHRvIGBzaG9ydCcgaWYgaW50MTZfdCBub3QgZGVmaW5lZC4gKi8KKyN1bmRlZiBpbnQxNl90CisKKy8qIERlZmluZSB0byBgaW50JyBpZiBpbnQzMl90IG5vdCBkZWZpbmVkLiAqLworI3VuZGVmIGludDMyX3QKKworLyogRGVmaW5lIHRvIGBsb25nIGxvbmcnIGlmIGludDY0X3Qgbm90IGRlZmluZWQuICovCisjdW5kZWYgaW50NjRfdAorCisvKiBEZWZpbmUgdG8gYHNpZ25lZCBjaGFyJyBpZiBpbnQ4X3Qgbm90IGRlZmluZWQuICovCisjdW5kZWYgaW50OF90CisKKy8qIG9uIHNpbml4ICovCisjdW5kZWYgc2luaXgKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBzaG9ydCcgaWYgdV9pbnQxNl90IG5vdCBkZWZpbmVkLiAqLworI3VuZGVmIHVfaW50MTZfdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGludCcgaWYgdV9pbnQzMl90IG5vdCBkZWZpbmVkLiAqLworI3VuZGVmIHVfaW50MzJfdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGxvbmcgbG9uZycgaWYgdV9pbnQ2NF90IG5vdCBkZWZpbmVkLiAqLworI3VuZGVmIHVfaW50NjRfdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkIGNoYXInIGlmIHVfaW50OF90IG5vdCBkZWZpbmVkLiAqLworI3VuZGVmIHVfaW50OF90CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2NvbmZpZy5zdWIgYi9saWJwY2FwLTEuMy4wL2NvbmZpZy5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODUxODYwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvY29uZmlnLnN1YgpAQCAtMCwwICsxLDE3MDggQEAKKyMhIC9iaW4vc2gKKyMgQ29uZmlndXJhdGlvbiB2YWxpZGF0aW9uIHN1YnJvdXRpbmUgc2NyaXB0LgorIyAgIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwKKyMgICAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK3RpbWVzdGFtcD0nMjAwOS0xMi0zMScKKworIyBUaGlzIGZpbGUgaXMgKGluIHByaW5jaXBsZSkgY29tbW9uIHRvIEFMTCBHTlUgc29mdHdhcmUuCisjIFRoZSBwcmVzZW5jZSBvZiBhIG1hY2hpbmUgaW4gdGhpcyBmaWxlIHN1Z2dlc3RzIHRoYXQgU09NRSBHTlUgc29mdHdhcmUKKyMgY2FuIGhhbmRsZSB0aGF0IG1hY2hpbmUuICBJdCBkb2VzIG5vdCBpbXBseSBBTEwgR05VIHNvZnR3YXJlIGNhbi4KKyMKKyMgVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorIworIyBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaWYgeW91CisjIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIGFzIHBhcnQgb2YgYSBwcm9ncmFtIHRoYXQgY29udGFpbnMgYQorIyBjb25maWd1cmF0aW9uIHNjcmlwdCBnZW5lcmF0ZWQgYnkgQXV0b2NvbmYsIHlvdSBtYXkgaW5jbHVkZSBpdCB1bmRlcgorIyB0aGUgc2FtZSBkaXN0cmlidXRpb24gdGVybXMgdGhhdCB5b3UgdXNlIGZvciB0aGUgcmVzdCBvZiB0aGF0IHByb2dyYW0uCisKKworIyBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIDxjb25maWctcGF0Y2hlc0BnbnUub3JnPi4gIFN1Ym1pdCBhIGNvbnRleHQKKyMgZGlmZiBhbmQgYSBwcm9wZXJseSBmb3JtYXR0ZWQgR05VIENoYW5nZUxvZyBlbnRyeS4KKyMKKyMgQ29uZmlndXJhdGlvbiBzdWJyb3V0aW5lIHRvIHZhbGlkYXRlIGFuZCBjYW5vbmljYWxpemUgYSBjb25maWd1cmF0aW9uIHR5cGUuCisjIFN1cHBseSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gdHlwZSBhcyBhbiBhcmd1bWVudC4KKyMgSWYgaXQgaXMgaW52YWxpZCwgd2UgcHJpbnQgYW4gZXJyb3IgbWVzc2FnZSBvbiBzdGRlcnIgYW5kIGV4aXQgd2l0aCBjb2RlIDEuCisjIE90aGVyd2lzZSwgd2UgcHJpbnQgdGhlIGNhbm9uaWNhbCBjb25maWcgdHlwZSBvbiBzdGRvdXQgYW5kIHN1Y2NlZWQuCisKKyMgWW91IGNhbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc2NyaXB0IGZyb206CisjIGh0dHA6Ly9naXQuc2F2YW5uYWguZ251Lm9yZy9naXR3ZWIvP3A9Y29uZmlnLmdpdDthPWJsb2JfcGxhaW47Zj1jb25maWcuc3ViO2hiPUhFQUQKKworIyBUaGlzIGZpbGUgaXMgc3VwcG9zZWQgdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCBHTlUgcGFja2FnZXMKKyMgYW5kIHJlY29nbml6ZSBhbGwgdGhlIENQVSB0eXBlcywgc3lzdGVtIHR5cGVzIGFuZCBhbGlhc2VzCisjIHRoYXQgYXJlIG1lYW5pbmdmdWwgd2l0aCAqYW55KiBHTlUgc29mdHdhcmUuCisjIEVhY2ggcGFja2FnZSBpcyByZXNwb25zaWJsZSBmb3IgcmVwb3J0aW5nIHdoaWNoIHZhbGlkIGNvbmZpZ3VyYXRpb25zCisjIGl0IGRvZXMgbm90IHN1cHBvcnQuICBUaGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBkaXN0aW5ndWlzaAorIyBhIGZhaWx1cmUgdG8gc3VwcG9ydCBhIHZhbGlkIGNvbmZpZ3VyYXRpb24gZnJvbSBhIG1lYW5pbmdsZXNzCisjIGNvbmZpZ3VyYXRpb24uCisKKyMgVGhlIGdvYWwgb2YgdGhpcyBmaWxlIGlzIHRvIG1hcCBhbGwgdGhlIHZhcmlvdXMgdmFyaWF0aW9ucyBvZiBhIGdpdmVuCisjIG1hY2hpbmUgc3BlY2lmaWNhdGlvbiBpbnRvIGEgc2luZ2xlIHNwZWNpZmljYXRpb24gaW4gdGhlIGZvcm06CisjCUNQVV9UWVBFLU1BTlVGQUNUVVJFUi1PUEVSQVRJTkdfU1lTVEVNCisjIG9yIGluIHNvbWUgY2FzZXMsIHRoZSBuZXdlciBmb3VyLXBhcnQgZm9ybToKKyMJQ1BVX1RZUEUtTUFOVUZBQ1RVUkVSLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisjIEl0IGlzIHdyb25nIHRvIGVjaG8gYW55IG90aGVyIHR5cGUgb2Ygc3BlY2lmaWNhdGlvbi4KKworbWU9YGVjaG8gIiQwIiB8IHNlZCAtZSAncywuKi8sLCdgCisKK3VzYWdlPSJcCitVc2FnZTogJDAgW09QVElPTl0gQ1BVLU1GUi1PUFNZUworICAgICAgICQwIFtPUFRJT05dIEFMSUFTCisKK0Nhbm9uaWNhbGl6ZSBhIGNvbmZpZ3VyYXRpb24gbmFtZS4KKworT3BlcmF0aW9uIG1vZGVzOgorICAtaCwgLS1oZWxwICAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLXQsIC0tdGltZS1zdGFtcCAgIHByaW50IGRhdGUgb2YgbGFzdCBtb2RpZmljYXRpb24sIHRoZW4gZXhpdAorICAtdiwgLS12ZXJzaW9uICAgICAgcHJpbnQgdmVyc2lvbiBudW1iZXIsIHRoZW4gZXhpdAorCitSZXBvcnQgYnVncyBhbmQgcGF0Y2hlcyB0byA8Y29uZmlnLXBhdGNoZXNAZ251Lm9yZz4uIgorCit2ZXJzaW9uPSJcCitHTlUgY29uZmlnLnN1YiAoJHRpbWVzdGFtcCkKKworQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKK1RoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgc2VlIHRoZSBzb3VyY2UgZm9yIGNvcHlpbmcgY29uZGl0aW9ucy4gIFRoZXJlIGlzIE5PCit3YXJyYW50eTsgbm90IGV2ZW4gZm9yIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4iCisKK2hlbHA9IgorVHJ5IFxgJG1lIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIgorCisjIFBhcnNlIGNvbW1hbmQgbGluZQord2hpbGUgdGVzdCAkIyAtZ3QgMCA7IGRvCisgIGNhc2UgJDEgaW4KKyAgICAtLXRpbWUtc3RhbXAgfCAtLXRpbWUqIHwgLXQgKQorICAgICAgIGVjaG8gIiR0aW1lc3RhbXAiIDsgZXhpdCA7OworICAgIC0tdmVyc2lvbiB8IC12ICkKKyAgICAgICBlY2hvICIkdmVyc2lvbiIgOyBleGl0IDs7CisgICAgLS1oZWxwIHwgLS1oKiB8IC1oICkKKyAgICAgICBlY2hvICIkdXNhZ2UiOyBleGl0IDs7CisgICAgLS0gKSAgICAgIyBTdG9wIG9wdGlvbiBwcm9jZXNzaW5nCisgICAgICAgc2hpZnQ7IGJyZWFrIDs7CisgICAgLSApCSMgVXNlIHN0ZGluIGFzIGlucHV0LgorICAgICAgIGJyZWFrIDs7CisgICAgLSogKQorICAgICAgIGVjaG8gIiRtZTogaW52YWxpZCBvcHRpb24gJDEkaGVscCIKKyAgICAgICBleGl0IDEgOzsKKworICAgICpsb2NhbCopCisgICAgICAgIyBGaXJzdCBwYXNzIHRocm91Z2ggYW55IGxvY2FsIG1hY2hpbmUgdHlwZXMuCisgICAgICAgZWNobyAkMQorICAgICAgIGV4aXQgOzsKKworICAgICogKQorICAgICAgIGJyZWFrIDs7CisgIGVzYWMKK2RvbmUKKworY2FzZSAkIyBpbgorIDApIGVjaG8gIiRtZTogbWlzc2luZyBhcmd1bWVudCRoZWxwIiA+JjIKKyAgICBleGl0IDE7OworIDEpIDs7CisgKikgZWNobyAiJG1lOiB0b28gbWFueSBhcmd1bWVudHMkaGVscCIgPiYyCisgICAgZXhpdCAxOzsKK2VzYWMKKworIyBTZXBhcmF0ZSB3aGF0IHRoZSB1c2VyIGdhdmUgaW50byBDUFUtQ09NUEFOWSBhbmQgT1Mgb3IgS0VSTkVMLU9TIChpZiBhbnkpLgorIyBIZXJlIHdlIG11c3QgcmVjb2duaXplIGFsbCB0aGUgdmFsaWQgS0VSTkVMLU9TIGNvbWJpbmF0aW9ucy4KK21heWJlX29zPWBlY2hvICQxIHwgc2VkICdzL15cKC4qXCktXChbXi1dKi1bXi1dKlwpJC9cMi8nYAorY2FzZSAkbWF5YmVfb3MgaW4KKyAgbnRvLXFueCogfCBsaW51eC1nbnUqIHwgbGludXgtZGlldGxpYmMgfCBsaW51eC1uZXdsaWIqIHwgbGludXgtdWNsaWJjKiB8IFwKKyAgdWNsaW51eC11Y2xpYmMqIHwgdWNsaW51eC1nbnUqIHwga2ZyZWVic2QqLWdudSogfCBrbmV0YnNkKi1nbnUqIHwgbmV0YnNkKi1nbnUqIHwgXAorICBrb3BlbnNvbGFyaXMqLWdudSogfCBcCisgIHN0b3JtLWNoYW9zKiB8IG9zMi1lbXgqIHwgcnRtay1ub3ZhKikKKyAgICBvcz0tJG1heWJlX29zCisgICAgYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAncy9eXCguKlwpLVwoW14tXSotW14tXSpcKSQvXDEvJ2AKKyAgICA7OworICAqKQorICAgIGJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgJ3MvLVteLV0qJC8vJ2AKKyAgICBpZiBbICRiYXNpY19tYWNoaW5lICE9ICQxIF0KKyAgICB0aGVuIG9zPWBlY2hvICQxIHwgc2VkICdzLy4qLS8tLydgCisgICAgZWxzZSBvcz07IGZpCisgICAgOzsKK2VzYWMKKworIyMjIExldCdzIHJlY29nbml6ZSBjb21tb24gbWFjaGluZXMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zIHNvCisjIyMgdGhhdCB0aGluZ3MgbGlrZSBjb25maWcuc3ViIGRlY3N0YXRpb24tMzEwMCB3b3JrLiAgV2UgYWxzbworIyMjIHJlY29nbml6ZSBzb21lIG1hbnVmYWN0dXJlcnMgYXMgbm90IGJlaW5nIG9wZXJhdGluZyBzeXN0ZW1zLCBzbyB3ZQorIyMjIGNhbiBwcm92aWRlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgYmVsb3cuCitjYXNlICRvcyBpbgorCS1zdW4qb3MqKQorCQkjIFByZXZlbnQgZm9sbG93aW5nIGNsYXVzZSBmcm9tIGhhbmRsaW5nIHRoaXMgaW52YWxpZCBpbnB1dC4KKwkJOzsKKwktZGVjKiB8IC1taXBzKiB8IC1zZXF1ZW50KiB8IC1lbmNvcmUqIHwgLXBjNTMyKiB8IC1zZ2kqIHwgLXNvbnkqIHwgXAorCS1hdHQqIHwgLTczMDAqIHwgLTMzMDAqIHwgLWRlbHRhKiB8IC1tb3Rvcm9sYSogfCAtc3VuWzIzNF0qIHwgXAorCS11bmljb20qIHwgLWlibSogfCAtbmV4dCB8IC1ocCB8IC1pc2kqIHwgLWFwb2xsbyB8IC1hbHRvcyogfCBcCisJLWNvbnZlcmdlbnQqIHwgLW5jciogfCAtbmV3cyB8IC0zMiogfCAtMzYwMCogfCAtMzEwMCogfCAtaGl0YWNoaSogfFwKKwktY1sxMjNdKiB8IC1jb252ZXgqIHwgLXN1biB8IC1jcmRzIHwgLW9tcm9uKiB8IC1kZyB8IC11bHRyYSB8IC10dGkqIHwgXAorCS1oYXJyaXMgfCAtZG9scGhpbiB8IC1oaWdobGV2ZWwgfCAtZ291bGQgfCAtY2JtIHwgLW5zIHwgLW1hc3Njb21wIHwgXAorCS1hcHBsZSB8IC1heGlzIHwgLWtudXRoIHwgLWNyYXkgfCAtbWljcm9ibGF6ZSkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKyAgICAgICAgLWJsdWVnZW5lKikKKwkgICAgICAgIG9zPS1jbmsKKwkJOzsKKwktc2ltIHwgLWNpc2NvIHwgLW9raSB8IC13ZWMgfCAtd2luYm9uZCkKKwkJb3M9CisJCWJhc2ljX21hY2hpbmU9JDEKKwkJOzsKKwktc2NvdXQpCisJCTs7CisJLXdycykKKwkJb3M9LXZ4d29ya3MKKwkJYmFzaWNfbWFjaGluZT0kMQorCQk7OworCS1jaG9ydXNvcyopCisJCW9zPS1jaG9ydXNvcworCQliYXNpY19tYWNoaW5lPSQxCisJCTs7CisgCS1jaG9ydXNyZGIpCisgCQlvcz0tY2hvcnVzcmRiCisJCWJhc2ljX21hY2hpbmU9JDEKKyAJCTs7CisJLWhpdXgqKQorCQlvcz0taGl1eHdlMgorCQk7OworCS1zY282KQorCQlvcz0tc2NvNXY2CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNSkKKwkJb3M9LXNjbzMuMnY1CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNCkKKwkJb3M9LXNjbzMuMnY0CisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvMy4yLls0LTldKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzL3NjbzMuMi4vc2NvMy4ydi8nYAorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLXNjbzMuMnZbNC05XSopCisJCSMgRG9uJ3QgZm9yZ2V0IHZlcnNpb24gaWYgaXQgaXMgMy4ydjQgb3IgbmV3ZXIuCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtcGMvJ2AKKwkJOzsKKwktc2NvNXY2KikKKwkJIyBEb24ndCBmb3JnZXQgdmVyc2lvbiBpZiBpdCBpcyAzLjJ2NCBvciBuZXdlci4KKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS1zY28qKQorCQlvcz0tc2NvMy4ydjIKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni0uKi84Ni1wYy8nYAorCQk7OworCS11ZGsqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWlzYykKKwkJb3M9LWlzYzIuMgorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWNsaXgqKQorCQliYXNpY19tYWNoaW5lPWNsaXBwZXItaW50ZXJncmFwaAorCQk7OworCS1pc2MqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LS4qLzg2LXBjLydgCisJCTs7CisJLWx5bngqKQorCQlvcz0tbHlueG9zCisJCTs7CisJLXB0eCopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYtLiovODYtc2VxdWVudC8nYAorCQk7OworCS13aW5kb3dzbnQqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3Mvd2luZG93c250L3dpbm50LydgCisJCTs7CisJLXBzb3MqKQorCQlvcz0tcHNvcworCQk7OworCS1taW50IHwgLW1pbnRbMC05XSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hdGFyaQorCQlvcz0tbWludAorCQk7OworZXNhYworCisjIERlY29kZSBhbGlhc2VzIGZvciBjZXJ0YWluIENQVS1DT01QQU5ZIGNvbWJpbmF0aW9ucy4KK2Nhc2UgJGJhc2ljX21hY2hpbmUgaW4KKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGhvdXQgY29tcGFueSBuYW1lLgorCSMgU29tZSBhcmUgb21pdHRlZCBoZXJlIGJlY2F1c2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZ3MgYmVsb3cuCisJMTc1MGEgfCA1ODAgXAorCXwgYTI5ayBcCisJfCBhbHBoYSB8IGFscGhhZXZbNC04XSB8IGFscGhhZXY1NiB8IGFscGhhZXY2Wzc4XSB8IGFscGhhcGNhNVs2N10gXAorCXwgYWxwaGE2NCB8IGFscGhhNjRldls0LThdIHwgYWxwaGE2NGV2NTYgfCBhbHBoYTY0ZXY2Wzc4XSB8IGFscGhhNjRwY2E1WzY3XSBcCisJfCBhbTMzXzIuMCBcCisJfCBhcmMgfCBhcm0gfCBhcm1bYmxdZSB8IGFybWVbbGJdIHwgYXJtdlsyMzQ1XSB8IGFybXZbMzQ1XVtsYl0gfCBhdnIgfCBhdnIzMiBcCisJfCBiZmluIFwKKwl8IGM0eCB8IGNsaXBwZXIgXAorCXwgZDEwdiB8IGQzMHYgfCBkbHggfCBkc3AxNnh4IFwKKwl8IGZpZG8gfCBmcjMwIHwgZnJ2IFwKKwl8IGg4MzAwIHwgaDg1MDAgfCBocHBhIHwgaHBwYTEuWzAxXSB8IGhwcGEyLjAgfCBocHBhMi4wW253XSB8IGhwcGE2NCBcCisJfCBpMzcwIHwgaTg2MCB8IGk5NjAgfCBpYTY0IFwKKwl8IGlwMmsgfCBpcTIwMDAgXAorCXwgbG0zMiBcCisJfCBtMzJjIHwgbTMyciB8IG0zMnJsZSB8IG02ODAwMCB8IG02OGsgfCBtODhrIFwKKwl8IG1heHEgfCBtYiB8IG1pY3JvYmxhemUgfCBtY29yZSB8IG1lcCB8IG1ldGFnIFwKKwl8IG1pcHMgfCBtaXBzYmUgfCBtaXBzZWIgfCBtaXBzZWwgfCBtaXBzbGUgXAorCXwgbWlwczE2IFwKKwl8IG1pcHM2NCB8IG1pcHM2NGVsIFwKKwl8IG1pcHM2NG9jdGVvbiB8IG1pcHM2NG9jdGVvbmVsIFwKKwl8IG1pcHM2NG9yaW9uIHwgbWlwczY0b3Jpb25lbCBcCisJfCBtaXBzNjRyNTkwMCB8IG1pcHM2NHI1OTAwZWwgXAorCXwgbWlwczY0dnIgfCBtaXBzNjR2cmVsIFwKKwl8IG1pcHM2NHZyNDEwMCB8IG1pcHM2NHZyNDEwMGVsIFwKKwl8IG1pcHM2NHZyNDMwMCB8IG1pcHM2NHZyNDMwMGVsIFwKKwl8IG1pcHM2NHZyNTAwMCB8IG1pcHM2NHZyNTAwMGVsIFwKKwl8IG1pcHM2NHZyNTkwMCB8IG1pcHM2NHZyNTkwMGVsIFwKKwl8IG1pcHNpc2EzMiB8IG1pcHNpc2EzMmVsIFwKKwl8IG1pcHNpc2EzMnIyIHwgbWlwc2lzYTMycjJlbCBcCisJfCBtaXBzaXNhNjQgfCBtaXBzaXNhNjRlbCBcCisJfCBtaXBzaXNhNjRyMiB8IG1pcHNpc2E2NHIyZWwgXAorCXwgbWlwc2lzYTY0c2IxIHwgbWlwc2lzYTY0c2IxZWwgXAorCXwgbWlwc2lzYTY0c3I3MWsgfCBtaXBzaXNhNjRzcjcxa2VsIFwKKwl8IG1pcHN0eDM5IHwgbWlwc3R4MzllbCBcCisJfCBtbjEwMjAwIHwgbW4xMDMwMCBcCisJfCBtb3hpZSBcCisJfCBtdCBcCisJfCBtc3A0MzAgXAorCXwgbmlvcyB8IG5pb3MyIFwKKwl8IG5zMTZrIHwgbnMzMmsgXAorCXwgb3IzMiBcCisJfCBwZHAxMCB8IHBkcDExIHwgcGogfCBwamwgXAorCXwgcG93ZXJwYyB8IHBvd2VycGM2NCB8IHBvd2VycGM2NGxlIHwgcG93ZXJwY2xlIHwgcHBjYmUgXAorCXwgcHlyYW1pZCBcCisJfCByeCBcCisJfCBzY29yZSBcCisJfCBzaCB8IHNoWzEyMzRdIHwgc2hbMjRdYSB8IHNoWzI0XWFlYiB8IHNoWzIzXWUgfCBzaFszNF1lYiB8IHNoZWIgfCBzaGJlIHwgc2hsZSB8IHNoWzEyMzRdbGUgfCBzaDNlbGUgXAorCXwgc2g2NCB8IHNoNjRsZSBcCisJfCBzcGFyYyB8IHNwYXJjNjQgfCBzcGFyYzY0YiB8IHNwYXJjNjR2IHwgc3BhcmM4NnggfCBzcGFyY2xldCB8IHNwYXJjbGl0ZSBcCisJfCBzcGFyY3Y4IHwgc3BhcmN2OSB8IHNwYXJjdjliIHwgc3BhcmN2OXYgXAorCXwgc3B1IHwgc3Ryb25nYXJtIFwKKwl8IHRhaG9lIHwgdGh1bWIgfCB0aWM0eCB8IHRpYzgwIHwgdHJvbiBcCisJfCB1Ymljb20zMiBcCisJfCB2ODUwIHwgdjg1MGUgXAorCXwgd2UzMmsgXAorCXwgeDg2IHwgeGMxNnggfCB4c2NhbGUgfCB4c2NhbGVlW2JsXSB8IHhzdG9ybXkxNiB8IHh0ZW5zYSBcCisJfCB6OGsgfCB6ODApCisJCWJhc2ljX21hY2hpbmU9JGJhc2ljX21hY2hpbmUtdW5rbm93bgorCQk7OworCW02ODExIHwgbTY4aGMxMSB8IG02ODEyIHwgbTY4aGMxMiB8IHBpY29jaGlwKQorCQkjIE1vdG9yb2xhIDY4SEMxMS8xMi4KKwkJYmFzaWNfbWFjaGluZT0kYmFzaWNfbWFjaGluZS11bmtub3duCisJCW9zPS1ub25lCisJCTs7CisJbTg4MTEwIHwgbTY4MFsxMjM0Nl0wIHwgbTY4Mz8yIHwgbTY4MzYwIHwgbTUyMDAgfCB2NzAgfCB3NjUgfCB6OGspCisJCTs7CisJbXMxKQorCQliYXNpY19tYWNoaW5lPW10LXVua25vd24KKwkJOzsKKworCSMgV2UgdXNlIGBwYycgcmF0aGVyIHRoYW4gYHVua25vd24nCisJIyBiZWNhdXNlICgxKSB0aGF0J3Mgd2hhdCB0aGV5IG5vcm1hbGx5IGFyZSwgYW5kCisJIyAoMikgdGhlIHdvcmQgInVua25vd24iIHRlbmRzIHRvIGNvbmZ1c2UgYmVnaW5uaW5nIHVzZXJzLgorCWkqODYgfCB4ODZfNjQpCisJICBiYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXBjCisJICA7OworCSMgT2JqZWN0IGlmIG1vcmUgdGhhbiBvbmUgY29tcGFueSBuYW1lIHdvcmQuCisJKi0qLSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgYmFzaWMgQ1BVIHR5cGVzIHdpdGggY29tcGFueSBuYW1lLgorCTU4MC0qIFwKKwl8IGEyOWstKiBcCisJfCBhbHBoYS0qIHwgYWxwaGFldls0LThdLSogfCBhbHBoYWV2NTYtKiB8IGFscGhhZXY2Wzc4XS0qIFwKKwl8IGFscGhhNjQtKiB8IGFscGhhNjRldls0LThdLSogfCBhbHBoYTY0ZXY1Ni0qIHwgYWxwaGE2NGV2Nls3OF0tKiBcCisJfCBhbHBoYXBjYTVbNjddLSogfCBhbHBoYTY0cGNhNVs2N10tKiB8IGFyYy0qIFwKKwl8IGFybS0qICB8IGFybWJlLSogfCBhcm1sZS0qIHwgYXJtZWItKiB8IGFybXYqLSogXAorCXwgYXZyLSogfCBhdnIzMi0qIFwKKwl8IGJmaW4tKiB8IGJzMjAwMC0qIFwKKwl8IGNbMTIzXSogfCBjMzAtKiB8IFtjanRdOTAtKiB8IGM0eC0qIHwgYzU0eC0qIHwgYzU1eC0qIHwgYzZ4LSogXAorCXwgY2xpcHBlci0qIHwgY3JheW52LSogfCBjeWRyYS0qIFwKKwl8IGQxMHYtKiB8IGQzMHYtKiB8IGRseC0qIFwKKwl8IGVseHNpLSogXAorCXwgZjMwWzAxXS0qIHwgZjcwMC0qIHwgZmlkby0qIHwgZnIzMC0qIHwgZnJ2LSogfCBmeDgwLSogXAorCXwgaDgzMDAtKiB8IGg4NTAwLSogXAorCXwgaHBwYS0qIHwgaHBwYTEuWzAxXS0qIHwgaHBwYTIuMC0qIHwgaHBwYTIuMFtud10tKiB8IGhwcGE2NC0qIFwKKwl8IGkqODYtKiB8IGk4NjAtKiB8IGk5NjAtKiB8IGlhNjQtKiBcCisJfCBpcDJrLSogfCBpcTIwMDAtKiBcCisJfCBsbTMyLSogXAorCXwgbTMyYy0qIHwgbTMyci0qIHwgbTMycmxlLSogXAorCXwgbTY4MDAwLSogfCBtNjgwWzAxMjM0Nl0wLSogfCBtNjgzNjAtKiB8IG02ODM/Mi0qIHwgbTY4ay0qIFwKKwl8IG04ODExMC0qIHwgbTg4ay0qIHwgbWF4cS0qIHwgbWNvcmUtKiB8IG1ldGFnLSogfCBtaWNyb2JsYXplLSogXAorCXwgbWlwcy0qIHwgbWlwc2JlLSogfCBtaXBzZWItKiB8IG1pcHNlbC0qIHwgbWlwc2xlLSogXAorCXwgbWlwczE2LSogXAorCXwgbWlwczY0LSogfCBtaXBzNjRlbC0qIFwKKwl8IG1pcHM2NG9jdGVvbi0qIHwgbWlwczY0b2N0ZW9uZWwtKiBcCisJfCBtaXBzNjRvcmlvbi0qIHwgbWlwczY0b3Jpb25lbC0qIFwKKwl8IG1pcHM2NHI1OTAwLSogfCBtaXBzNjRyNTkwMGVsLSogXAorCXwgbWlwczY0dnItKiB8IG1pcHM2NHZyZWwtKiBcCisJfCBtaXBzNjR2cjQxMDAtKiB8IG1pcHM2NHZyNDEwMGVsLSogXAorCXwgbWlwczY0dnI0MzAwLSogfCBtaXBzNjR2cjQzMDBlbC0qIFwKKwl8IG1pcHM2NHZyNTAwMC0qIHwgbWlwczY0dnI1MDAwZWwtKiBcCisJfCBtaXBzNjR2cjU5MDAtKiB8IG1pcHM2NHZyNTkwMGVsLSogXAorCXwgbWlwc2lzYTMyLSogfCBtaXBzaXNhMzJlbC0qIFwKKwl8IG1pcHNpc2EzMnIyLSogfCBtaXBzaXNhMzJyMmVsLSogXAorCXwgbWlwc2lzYTY0LSogfCBtaXBzaXNhNjRlbC0qIFwKKwl8IG1pcHNpc2E2NHIyLSogfCBtaXBzaXNhNjRyMmVsLSogXAorCXwgbWlwc2lzYTY0c2IxLSogfCBtaXBzaXNhNjRzYjFlbC0qIFwKKwl8IG1pcHNpc2E2NHNyNzFrLSogfCBtaXBzaXNhNjRzcjcxa2VsLSogXAorCXwgbWlwc3R4MzktKiB8IG1pcHN0eDM5ZWwtKiBcCisJfCBtbWl4LSogXAorCXwgbXQtKiBcCisJfCBtc3A0MzAtKiBcCisJfCBuaW9zLSogfCBuaW9zMi0qIFwKKwl8IG5vbmUtKiB8IG5wMS0qIHwgbnMxNmstKiB8IG5zMzJrLSogXAorCXwgb3Jpb24tKiBcCisJfCBwZHAxMC0qIHwgcGRwMTEtKiB8IHBqLSogfCBwamwtKiB8IHBuLSogfCBwb3dlci0qIFwKKwl8IHBvd2VycGMtKiB8IHBvd2VycGM2NC0qIHwgcG93ZXJwYzY0bGUtKiB8IHBvd2VycGNsZS0qIHwgcHBjYmUtKiBcCisJfCBweXJhbWlkLSogXAorCXwgcm9tcC0qIHwgcnM2MDAwLSogfCByeC0qIFwKKwl8IHNoLSogfCBzaFsxMjM0XS0qIHwgc2hbMjRdYS0qIHwgc2hbMjRdYWViLSogfCBzaFsyM11lLSogfCBzaFszNF1lYi0qIHwgc2hlYi0qIHwgc2hiZS0qIFwKKwl8IHNobGUtKiB8IHNoWzEyMzRdbGUtKiB8IHNoM2VsZS0qIHwgc2g2NC0qIHwgc2g2NGxlLSogXAorCXwgc3BhcmMtKiB8IHNwYXJjNjQtKiB8IHNwYXJjNjRiLSogfCBzcGFyYzY0di0qIHwgc3BhcmM4NngtKiB8IHNwYXJjbGV0LSogXAorCXwgc3BhcmNsaXRlLSogXAorCXwgc3BhcmN2OC0qIHwgc3BhcmN2OS0qIHwgc3BhcmN2OWItKiB8IHNwYXJjdjl2LSogfCBzdHJvbmdhcm0tKiB8IHN2MS0qIHwgc3g/LSogXAorCXwgdGFob2UtKiB8IHRodW1iLSogXAorCXwgdGljMzAtKiB8IHRpYzR4LSogfCB0aWM1NHgtKiB8IHRpYzU1eC0qIHwgdGljNngtKiB8IHRpYzgwLSogfCB0aWxlLSogXAorCXwgdHJvbi0qIFwKKwl8IHViaWNvbTMyLSogXAorCXwgdjg1MC0qIHwgdjg1MGUtKiB8IHZheC0qIFwKKwl8IHdlMzJrLSogXAorCXwgeDg2LSogfCB4ODZfNjQtKiB8IHhjMTZ4LSogfCB4cHMxMDAtKiB8IHhzY2FsZS0qIHwgeHNjYWxlZVtibF0tKiBcCisJfCB4c3Rvcm15MTYtKiB8IHh0ZW5zYSotKiBcCisJfCB5bXAtKiBcCisJfCB6OGstKiB8IHo4MC0qKQorCQk7OworCSMgUmVjb2duaXplIHRoZSBiYXNpYyBDUFUgdHlwZXMgd2l0aG91dCBjb21wYW55IG5hbWUsIHdpdGggZ2xvYiBtYXRjaC4KKwl4dGVuc2EqKQorCQliYXNpY19tYWNoaW5lPSRiYXNpY19tYWNoaW5lLXVua25vd24KKwkJOzsKKwkjIFJlY29nbml6ZSB0aGUgdmFyaW91cyBtYWNoaW5lIG5hbWVzIGFuZCBhbGlhc2VzIHdoaWNoIHN0YW5kCisJIyBmb3IgYSBDUFUgdHlwZSBhbmQgYSBjb21wYW55IGFuZCBzb21ldGltZXMgZXZlbiBhbiBPUy4KKwkzODZic2QpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1ic2QKKwkJOzsKKwkzYjEgfCA3MzAwIHwgNzMwMC1hdHQgfCBhdHQtNzMwMCB8IHBjNzMwMCB8IHNhZmFyaSB8IHVuaXhwYykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtYXR0CisJCTs7CisJM2IqKQorCQliYXNpY19tYWNoaW5lPXdlMzJrLWF0dAorCQk7OworCWEyOWtoaWYpCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworICAgIAlhYmFjdXMpCisJCWJhc2ljX21hY2hpbmU9YWJhY3VzLXVua25vd24KKwkJOzsKKwlhZG9iZTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjgwMTAtYWRvYmUKKwkJb3M9LXNjb3V0CisJCTs7CisJYWxsaWFudCB8IGZ4ODApCisJCWJhc2ljX21hY2hpbmU9Zng4MC1hbGxpYW50CisJCTs7CisJYWx0b3MgfCBhbHRvczMwNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hbHRvcworCQk7OworCWFtMjlrKQorCQliYXNpY19tYWNoaW5lPWEyOWstbm9uZQorCQlvcz0tYnNkCisJCTs7CisJYW1kNjQpCisJCWJhc2ljX21hY2hpbmU9eDg2XzY0LXBjCisJCTs7CisJYW1kNjQtKikKKwkJYmFzaWNfbWFjaGluZT14ODZfNjQtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlhbWRhaGwpCisJCWJhc2ljX21hY2hpbmU9NTgwLWFtZGFobAorCQlvcz0tc3lzdgorCQk7OworCWFtaWdhIHwgYW1pZ2EtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJOzsKKwlhbWlnYW9zIHwgYW1pZ2Fkb3MpCisJCWJhc2ljX21hY2hpbmU9bTY4ay11bmtub3duCisJCW9zPS1hbWlnYW9zCisJCTs7CisJYW1pZ2F1bml4IHwgYW1peCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXVua25vd24KKwkJb3M9LXN5c3Y0CisJCTs7CisJYXBvbGxvNjgpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcG9sbG8KKwkJb3M9LXN5c3YKKwkJOzsKKwlhcG9sbG82OGJzZCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWFwb2xsbworCQlvcz0tYnNkCisJCTs7CisJYXJvcykKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1hcm9zCisJCTs7CisJYXV4KQorCQliYXNpY19tYWNoaW5lPW02OGstYXBwbGUKKwkJb3M9LWF1eAorCQk7OworCWJhbGFuY2UpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwlibGFja2ZpbikKKwkJYmFzaWNfbWFjaGluZT1iZmluLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJYmxhY2tmaW4tKikKKwkJYmFzaWNfbWFjaGluZT1iZmluLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCWJsdWVnZW5lKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWlibQorCQlvcz0tY25rCisJCTs7CisJYzkwKQorCQliYXNpY19tYWNoaW5lPWM5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKyAgICAgICAgY2VnY2MpCisJCWJhc2ljX21hY2hpbmU9YXJtLXVua25vd24KKwkJb3M9LWNlZ2NjCisJCTs7CisJY29udmV4LWMxKQorCQliYXNpY19tYWNoaW5lPWMxLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMyKQorCQliYXNpY19tYWNoaW5lPWMyLWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY29udmV4LWMzMikKKwkJYmFzaWNfbWFjaGluZT1jMzItY29udmV4CisJCW9zPS1ic2QKKwkJOzsKKwljb252ZXgtYzM0KQorCQliYXNpY19tYWNoaW5lPWMzNC1jb252ZXgKKwkJb3M9LWJzZAorCQk7OworCWNvbnZleC1jMzgpCisJCWJhc2ljX21hY2hpbmU9YzM4LWNvbnZleAorCQlvcz0tYnNkCisJCTs7CisJY3JheSB8IGo5MCkKKwkJYmFzaWNfbWFjaGluZT1qOTAtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJY3JheW52KQorCQliYXNpY19tYWNoaW5lPWNyYXludi1jcmF5CisJCW9zPS11bmljb3NtcAorCQk7OworCWNyMTYpCisJCWJhc2ljX21hY2hpbmU9Y3IxNi11bmtub3duCisJCW9zPS1lbGYKKwkJOzsKKwljcmRzIHwgdW5vcykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWNyZHMKKwkJOzsKKwljcmlzdjMyIHwgY3Jpc3YzMi0qIHwgZXRyYXhmcyopCisJCWJhc2ljX21hY2hpbmU9Y3Jpc3YzMi1heGlzCisJCTs7CisJY3JpcyB8IGNyaXMtKiB8IGV0cmF4KikKKwkJYmFzaWNfbWFjaGluZT1jcmlzLWF4aXMKKwkJOzsKKwljcngpCisJCWJhc2ljX21hY2hpbmU9Y3J4LXVua25vd24KKwkJb3M9LWVsZgorCQk7OworCWRhMzAgfCBkYTMwLSopCisJCWJhc2ljX21hY2hpbmU9bTY4ay1kYTMwCisJCTs7CisJZGVjc3RhdGlvbiB8IGRlY3N0YXRpb24tMzEwMCB8IHBtYXggfCBwbWF4LSogfCBwbWluIHwgZGVjMzEwMCB8IGRlY3N0YXRuKQorCQliYXNpY19tYWNoaW5lPW1pcHMtZGVjCisJCTs7CisJZGVjc3lzdGVtMTAqIHwgZGVjMTAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczEwCisJCTs7CisJZGVjc3lzdGVtMjAqIHwgZGVjMjAqKQorCQliYXNpY19tYWNoaW5lPXBkcDEwLWRlYworCQlvcz0tdG9wczIwCisJCTs7CisJZGVsdGEgfCAzMzAwIHwgbW90b3JvbGEtMzMwMCB8IG1vdG9yb2xhLWRlbHRhIFwKKwkgICAgICB8IDMzMDAtbW90b3JvbGEgfCBkZWx0YS1tb3Rvcm9sYSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW1vdG9yb2xhCisJCTs7CisJZGVsdGE4OCkKKwkJYmFzaWNfbWFjaGluZT1tODhrLW1vdG9yb2xhCisJCW9zPS1zeXN2MworCQk7OworCWRpY29zKQorCQliYXNpY19tYWNoaW5lPWk2ODYtcGMKKwkJb3M9LWRpY29zCisJCTs7CisJZGpncHApCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQlvcz0tbXNkb3NkamdwcAorCQk7OworCWRweDIwIHwgZHB4MjAtKikKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtYnVsbAorCQlvcz0tYm9zeAorCQk7OworCWRweDIqIHwgZHB4MiotYnVsbCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YzCisJCTs7CisJZWJtb24yOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LWVibW9uCisJCTs7CisJZWx4c2kpCisJCWJhc2ljX21hY2hpbmU9ZWx4c2ktZWx4c2kKKwkJb3M9LWJzZAorCQk7OworCWVuY29yZSB8IHVtYXggfCBtbWF4KQorCQliYXNpY19tYWNoaW5lPW5zMzJrLWVuY29yZQorCQk7OworCWVzMTgwMCB8IE9TRTY4ayB8IG9zZTY4ayB8IG9zZSB8IE9TRSkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlmeDI4MDApCisJCWJhc2ljX21hY2hpbmU9aTg2MC1hbGxpYW50CisJCTs7CisJZ2VuaXgpCisJCWJhc2ljX21hY2hpbmU9bnMzMmstbnMKKwkJOzsKKwlnbWljcm8pCisJCWJhc2ljX21hY2hpbmU9dHJvbi1nbWljcm8KKwkJb3M9LXN5c3YKKwkJOzsKKwlnbzMyKQorCQliYXNpY19tYWNoaW5lPWkzODYtcGMKKwkJb3M9LWdvMzIKKwkJOzsKKwloMzA1MHIqIHwgaGl1eCopCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1oaXRhY2hpCisJCW9zPS1oaXV4d2UyCisJCTs7CisJaDgzMDBobXMpCisJCWJhc2ljX21hY2hpbmU9aDgzMDAtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJaDgzMDB4cmF5KQorCQliYXNpY19tYWNoaW5lPWg4MzAwLWhpdGFjaGkKKwkJb3M9LXhyYXkKKwkJOzsKKwloODUwMGhtcykKKwkJYmFzaWNfbWFjaGluZT1oODUwMC1oaXRhY2hpCisJCW9zPS1obXMKKwkJOzsKKwloYXJyaXMpCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LXN5c3YzCisJCTs7CisJaHAzMDAtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWhwCisJCTs7CisJaHAzMDBic2QpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQlvcz0tYnNkCisJCTs7CisJaHAzMDBocHV4KQorCQliYXNpY19tYWNoaW5lPW02OGstaHAKKwkJb3M9LWhwdXgKKwkJOzsKKwlocDNrOVswLTldWzAtOV0gfCBocDlbMC05XVswLTldKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjAtaHAKKwkJOzsKKwlocDlrMlswLTldWzAtOV0gfCBocDlrMzFbMC05XSkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMDAtaHAKKwkJOzsKKwlocDlrM1syLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9bTY4ay1ocAorCQk7OworCWhwOWs2WzAtOV1bMC05XSB8IGhwNlswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwOWs3WzAtNzldWzAtOV0gfCBocDdbMC03OV1bMC05XSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azc4WzAtOV0gfCBocDc4WzAtOV0pCisJCSMgRklYTUU6IHJlYWxseSBocHBhMi4wLWhwCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzY3XTEgfCBocDhbNjddMSB8IGhwOWs4MFsyNF0gfCBocDgwWzI0XSB8IGhwOWs4Wzc4XTkgfCBocDhbNzhdOSB8IGhwOWs4OTMgfCBocDg5MykKKwkJIyBGSVhNRTogcmVhbGx5IGhwcGEyLjAtaHAKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhwCisJCTs7CisJaHA5azhbMC05XVsxMzY3OV0gfCBocDhbMC05XVsxMzY3OV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQk7OworCWhwOWs4WzAtOV1bMC05XSB8IGhwOFswLTldWzAtOV0pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMC1ocAorCQk7OworCWhwcGEtbmV4dCkKKwkJb3M9LW5leHRzdGVwMworCQk7OworCWhwcGFvc2YpCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tb3NmCisJCTs7CisJaHBwcm8pCisJCWJhc2ljX21hY2hpbmU9aHBwYTEuMS1ocAorCQlvcz0tcHJvZWxmCisJCTs7CisJaTM3MC1pYm0qIHwgaWJtKikKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQk7OworIyBJJ20gbm90IHN1cmUgd2hhdCAiU3lzdjMyIiBtZWFucy4gIFNob3VsZCB0aGlzIGJlIHN5c3YzLjI/CisJaSo4NnYzMikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkMSB8IHNlZCAtZSAncy84Ni4qLzg2LXBjLydgCisJCW9zPS1zeXN2MzIKKwkJOzsKKwlpKjg2djQqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXN5c3Y0CisJCTs7CisJaSo4NnYpCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJDEgfCBzZWQgLWUgJ3MvODYuKi84Ni1wYy8nYAorCQlvcz0tc3lzdgorCQk7OworCWkqODZzb2wyKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICQxIHwgc2VkIC1lICdzLzg2LiovODYtcGMvJ2AKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJaTM4Nm1hY2gpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1tYWNoCisJCW9zPS1tYWNoCisJCTs7CisJaTM4Ni12c3RhIHwgdnN0YSkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXVua25vd24KKwkJb3M9LXZzdGEKKwkJOzsKKwlpcmlzIHwgaXJpczRkKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2dpCisJCWNhc2UgJG9zIGluCisJCSAgICAtaXJpeCopCisJCQk7OworCQkgICAgKikKKwkJCW9zPS1pcml4NAorCQkJOzsKKwkJZXNhYworCQk7OworCWlzaTY4IHwgaXNpKQorCQliYXNpY19tYWNoaW5lPW02OGstaXNpCisJCW9zPS1zeXN2CisJCTs7CisJbTY4a25vbW11KQorCQliYXNpY19tYWNoaW5lPW02OGstdW5rbm93bgorCQlvcz0tbGludXgKKwkJOzsKKwltNjhrbm9tbXUtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCW9zPS1saW51eAorCQk7OworCW04OGstb21yb24qKQorCQliYXNpY19tYWNoaW5lPW04OGstb21yb24KKwkJOzsKKwltYWdudW0gfCBtMzIzMCkKKwkJYmFzaWNfbWFjaGluZT1taXBzLW1pcHMKKwkJb3M9LXN5c3YKKwkJOzsKKwltZXJsaW4pCisJCWJhc2ljX21hY2hpbmU9bnMzMmstdXRlaworCQlvcz0tc3lzdgorCQk7OworICAgICAgICBtaWNyb2JsYXplKQorCQliYXNpY19tYWNoaW5lPW1pY3JvYmxhemUteGlsaW54CisJCTs7CisJbWluZ3czMikKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCW9zPS1taW5ndzMyCisJCTs7CisJbWluZ3czMmNlKQorCQliYXNpY19tYWNoaW5lPWFybS11bmtub3duCisJCW9zPS1taW5ndzMyY2UKKwkJOzsKKwltaW5pZnJhbWUpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWNvbnZlcmdlbnQKKwkJOzsKKwkqbWludCB8IC1taW50WzAtOV0qIHwgKk1pTlQgfCAqTWlOVFswLTldKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWF0YXJpCisJCW9zPS1taW50CisJCTs7CisJbWlwczMqLSopCisJCWJhc2ljX21hY2hpbmU9YGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgLWUgJ3MvbWlwczMvbWlwczY0LydgCisJCTs7CisJbWlwczMqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkIC1lICdzL21pcHMzL21pcHM2NC8nYC11bmtub3duCisJCTs7CisJbW9uaXRvcikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCW1vcnBob3MpCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCW9zPS1tb3JwaG9zCisJCTs7CisJbXNkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tbXNkb3MKKwkJOzsKKwltczEtKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAtZSAncy9tczEtL210LS8nYAorCQk7OworCW12cykKKwkJYmFzaWNfbWFjaGluZT1pMzcwLWlibQorCQlvcz0tbXZzCisJCTs7CisJbmNyMzAwMCkKKwkJYmFzaWNfbWFjaGluZT1pNDg2LW5jcgorCQlvcz0tc3lzdjQKKwkJOzsKKwluZXRic2QzODYpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni11bmtub3duCisJCW9zPS1uZXRic2QKKwkJOzsKKwluZXR3aW5kZXIpCisJCWJhc2ljX21hY2hpbmU9YXJtdjRsLXJlYmVsCisJCW9zPS1saW51eAorCQk7OworCW5ld3MgfCBuZXdzNzAwIHwgbmV3czgwMCB8IG5ld3M5MDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1zb255CisJCW9zPS1uZXdzb3MKKwkJOzsKKwluZXdzMTAwMCkKKwkJYmFzaWNfbWFjaGluZT1tNjgwMzAtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmV3cy0zNjAwIHwgcmlzYy1uZXdzKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc29ueQorCQlvcz0tbmV3c29zCisJCTs7CisJbmVjdjcwKQorCQliYXNpY19tYWNoaW5lPXY3MC1uZWMKKwkJb3M9LXN5c3YKKwkJOzsKKwluZXh0IHwgbSotbmV4dCApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uZXh0CisJCWNhc2UgJG9zIGluCisJCSAgICAtbmV4dHN0ZXAqICkKKwkJCTs7CisJCSAgICAtbnMyKikKKwkJICAgICAgb3M9LW5leHRzdGVwMgorCQkJOzsKKwkJICAgICopCisJCSAgICAgIG9zPS1uZXh0c3RlcDMKKwkJCTs7CisJCWVzYWMKKwkJOzsKKwluaDMwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaFs0NV0wMDApCisJCWJhc2ljX21hY2hpbmU9bTg4ay1oYXJyaXMKKwkJb3M9LWN4dXgKKwkJOzsKKwluaW5keTk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1uaW5keQorCQk7OworCW1vbjk2MCkKKwkJYmFzaWNfbWFjaGluZT1pOTYwLWludGVsCisJCW9zPS1tb245NjAKKwkJOzsKKwlub25zdG9wdXgpCisJCWJhc2ljX21hY2hpbmU9bWlwcy1jb21wYXEKKwkJb3M9LW5vbnN0b3B1eAorCQk7OworCW5wMSkKKwkJYmFzaWNfbWFjaGluZT1ucDEtZ291bGQKKwkJOzsKKwluc3ItdGFuZGVtKQorCQliYXNpY19tYWNoaW5lPW5zci10YW5kZW0KKwkJOzsKKwlvcDUwbi0qIHwgb3A2MGMtKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQlvcz0tcHJvZWxmCisJCTs7CisJb3BlbnJpc2MgfCBvcGVucmlzYy0qKQorCQliYXNpY19tYWNoaW5lPW9yMzItdW5rbm93bgorCQk7OworCW9zNDAwKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGMtaWJtCisJCW9zPS1vczQwMAorCQk7OworCU9TRTY4MDAwIHwgb3NlNjgwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLWVyaWNzc29uCisJCW9zPS1vc2UKKwkJOzsKKwlvczY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLW5vbmUKKwkJb3M9LW9zNjhrCisJCTs7CisJcGEtaGl0YWNoaSkKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLWhpdGFjaGkKKwkJb3M9LWhpdXh3ZTIKKwkJOzsKKwlwYXJhZ29uKQorCQliYXNpY19tYWNoaW5lPWk4NjAtaW50ZWwKKwkJb3M9LW9zZgorCQk7OworCXBhcmlzYykKKwkJYmFzaWNfbWFjaGluZT1ocHBhLXVua25vd24KKwkJb3M9LWxpbnV4CisJCTs7CisJcGFyaXNjLSopCisJCWJhc2ljX21hY2hpbmU9aHBwYS1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQlvcz0tbGludXgKKwkJOzsKKwlwYmQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtdHRpCisJCTs7CisJcGJiKQorCQliYXNpY19tYWNoaW5lPW02OGstdHRpCisJCTs7CisJcGM1MzIgfCBwYzUzMi0qKQorCQliYXNpY19tYWNoaW5lPW5zMzJrLXBjNTMyCisJCTs7CisJcGM5OCkKKwkJYmFzaWNfbWFjaGluZT1pMzg2LXBjCisJCTs7CisJcGM5OC0qKQorCQliYXNpY19tYWNoaW5lPWkzODYtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwZW50aXVtIHwgcDUgfCBrNSB8IGs2IHwgbmV4Z2VuIHwgdmlhYzMpCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1wYworCQk7OworCXBlbnRpdW1wcm8gfCBwNiB8IDZ4ODYgfCBhdGhsb24gfCBhdGhsb25fKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LXBjCisJCTs7CisJcGVudGl1bWlpIHwgcGVudGl1bTIgfCBwZW50aXVtaWlpIHwgcGVudGl1bTMpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQk7OworCXBlbnRpdW00KQorCQliYXNpY19tYWNoaW5lPWk3ODYtcGMKKwkJOzsKKwlwZW50aXVtLSogfCBwNS0qIHwgazUtKiB8IGs2LSogfCBuZXhnZW4tKiB8IHZpYWMzLSopCisJCWJhc2ljX21hY2hpbmU9aTU4Ni1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBlbnRpdW1wcm8tKiB8IHA2LSogfCA2eDg2LSogfCBhdGhsb24tKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bWlpLSogfCBwZW50aXVtMi0qIHwgcGVudGl1bWlpaS0qIHwgcGVudGl1bTMtKikKKwkJYmFzaWNfbWFjaGluZT1pNjg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcGVudGl1bTQtKikKKwkJYmFzaWNfbWFjaGluZT1pNzg2LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcG4pCisJCWJhc2ljX21hY2hpbmU9cG4tZ291bGQKKwkJOzsKKwlwb3dlcikJYmFzaWNfbWFjaGluZT1wb3dlci1pYm0KKwkJOzsKKwlwcGMpCWJhc2ljX21hY2hpbmU9cG93ZXJwYy11bmtub3duCisJCTs7CisJcHBjLSopCWJhc2ljX21hY2hpbmU9cG93ZXJwYy1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9eW14tXSotLy8nYAorCQk7OworCXBwY2xlIHwgcG93ZXJwY2xpdHRsZSB8IHBwYy1sZSB8IHBvd2VycGMtbGl0dGxlKQorCQliYXNpY19tYWNoaW5lPXBvd2VycGNsZS11bmtub3duCisJCTs7CisJcHBjbGUtKiB8IHBvd2VycGNsaXR0bGUtKikKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjbGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwcGM2NCkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjQtdW5rbm93bgorCQk7OworCXBwYzY0LSopIGJhc2ljX21hY2hpbmU9cG93ZXJwYzY0LWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL15bXi1dKi0vLydgCisJCTs7CisJcHBjNjRsZSB8IHBvd2VycGM2NGxpdHRsZSB8IHBwYzY0LWxlIHwgcG93ZXJwYzY0LWxpdHRsZSkKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjNjRsZS11bmtub3duCisJCTs7CisJcHBjNjRsZS0qIHwgcG93ZXJwYzY0bGl0dGxlLSopCisJCWJhc2ljX21hY2hpbmU9cG93ZXJwYzY0bGUtYGVjaG8gJGJhc2ljX21hY2hpbmUgfCBzZWQgJ3MvXlteLV0qLS8vJ2AKKwkJOzsKKwlwczIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1pYm0KKwkJOzsKKwlwdzMyKQorCQliYXNpY19tYWNoaW5lPWk1ODYtdW5rbm93bgorCQlvcz0tcHczMgorCQk7OworCXJkb3MpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1wYworCQlvcz0tcmRvcworCQk7OworCXJvbTY4aykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXJvbTY4aworCQlvcz0tY29mZgorCQk7OworCXJtWzQ2XTAwKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2llbWVucworCQk7OworCXJ0cGMgfCBydHBjLSopCisJCWJhc2ljX21hY2hpbmU9cm9tcC1pYm0KKwkJOzsKKwlzMzkwIHwgczM5MC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTAtaWJtCisJCTs7CisJczM5MHggfCBzMzkweC0qKQorCQliYXNpY19tYWNoaW5lPXMzOTB4LWlibQorCQk7OworCXNhMjkyMDApCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXNiMSkKKwkJYmFzaWNfbWFjaGluZT1taXBzaXNhNjRzYjEtdW5rbm93bgorCQk7OworCXNiMWVsKQorCQliYXNpY19tYWNoaW5lPW1pcHNpc2E2NHNiMWVsLXVua25vd24KKwkJOzsKKwlzZGUpCisJCWJhc2ljX21hY2hpbmU9bWlwc2lzYTMyLXNkZQorCQlvcz0tZWxmCisJCTs7CisJc2VpKQorCQliYXNpY19tYWNoaW5lPW1pcHMtc2VpCisJCW9zPS1zZWl1eAorCQk7OworCXNlcXVlbnQpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zZXF1ZW50CisJCTs7CisJc2gpCisJCWJhc2ljX21hY2hpbmU9c2gtaGl0YWNoaQorCQlvcz0taG1zCisJCTs7CisJc2g1ZWwpCisJCWJhc2ljX21hY2hpbmU9c2g1bGUtdW5rbm93bgorCQk7OworCXNoNjQpCisJCWJhc2ljX21hY2hpbmU9c2g2NC11bmtub3duCisJCTs7CisJc3BhcmNsaXRlLXdycyB8IHNpbXNvLXdycykKKwkJYmFzaWNfbWFjaGluZT1zcGFyY2xpdGUtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJc3BzNykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLWJ1bGwKKwkJb3M9LXN5c3YyCisJCTs7CisJc3B1cikKKwkJYmFzaWNfbWFjaGluZT1zcHVyLXVua25vd24KKwkJOzsKKwlzdDIwMDApCisJCWJhc2ljX21hY2hpbmU9bTY4ay10YW5kZW0KKwkJOzsKKwlzdHJhdHVzKQorCQliYXNpY19tYWNoaW5lPWk4NjAtc3RyYXR1cworCQlvcz0tc3lzdjQKKwkJOzsKKwlzdW4yKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJOzsKKwlzdW4yb3MzKQorCQliYXNpY19tYWNoaW5lPW02ODAwMC1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjJvczQpCisJCWJhc2ljX21hY2hpbmU9bTY4MDAwLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuM29zMykKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3MzCisJCTs7CisJc3VuM29zNCkKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQlvcz0tc3Vub3M0CisJCTs7CisJc3VuNG9zMykKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXN1bm9zMworCQk7OworCXN1bjRvczQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCW9zPS1zdW5vczQKKwkJOzsKKwlzdW40c29sMikKKwkJYmFzaWNfbWFjaGluZT1zcGFyYy1zdW4KKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJc3VuMyB8IHN1bjMtKikKKwkJYmFzaWNfbWFjaGluZT1tNjhrLXN1bgorCQk7OworCXN1bjQpCisJCWJhc2ljX21hY2hpbmU9c3BhcmMtc3VuCisJCTs7CisJc3VuMzg2IHwgc3VuMzg2aSB8IHJvYWRydW5uZXIpCisJCWJhc2ljX21hY2hpbmU9aTM4Ni1zdW4KKwkJOzsKKwlzdjEpCisJCWJhc2ljX21hY2hpbmU9c3YxLWNyYXkKKwkJb3M9LXVuaWNvcworCQk7OworCXN5bW1ldHJ5KQorCQliYXNpY19tYWNoaW5lPWkzODYtc2VxdWVudAorCQlvcz0tZHluaXgKKwkJOzsKKwl0M2UpCisJCWJhc2ljX21hY2hpbmU9YWxwaGFldjUtY3JheQorCQlvcz0tdW5pY29zCisJCTs7CisJdDkwKQorCQliYXNpY19tYWNoaW5lPXQ5MC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl0aWM1NHggfCBjNTR4KikKKwkJYmFzaWNfbWFjaGluZT10aWM1NHgtdW5rbm93bgorCQlvcz0tY29mZgorCQk7OworCXRpYzU1eCB8IGM1NXgqKQorCQliYXNpY19tYWNoaW5lPXRpYzU1eC11bmtub3duCisJCW9zPS1jb2ZmCisJCTs7CisJdGljNnggfCBjNngqKQorCQliYXNpY19tYWNoaW5lPXRpYzZ4LXVua25vd24KKwkJb3M9LWNvZmYKKwkJOzsKKwl0aWxlKikKKwkJYmFzaWNfbWFjaGluZT10aWxlLXVua25vd24KKwkJb3M9LWxpbnV4LWdudQorCQk7OworCXR4MzkpCisJCWJhc2ljX21hY2hpbmU9bWlwc3R4MzktdW5rbm93bgorCQk7OworCXR4MzllbCkKKwkJYmFzaWNfbWFjaGluZT1taXBzdHgzOWVsLXVua25vd24KKwkJOzsKKwl0b2FkMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMC14a2wKKwkJb3M9LXRvcHMyMAorCQk7OworCXRvd2VyIHwgdG93ZXItMzIpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1uY3IKKwkJOzsKKwl0cGYpCisJCWJhc2ljX21hY2hpbmU9czM5MHgtaWJtCisJCW9zPS10cGYKKwkJOzsKKwl1ZGkyOWspCisJCWJhc2ljX21hY2hpbmU9YTI5ay1hbWQKKwkJb3M9LXVkaQorCQk7OworCXVsdHJhMykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLW55dQorCQlvcz0tc3ltMQorCQk7OworCXY4MTAgfCBuZWN2ODEwKQorCQliYXNpY19tYWNoaW5lPXY4MTAtbmVjCisJCW9zPS1ub25lCisJCTs7CisJdmF4dikKKwkJYmFzaWNfbWFjaGluZT12YXgtZGVjCisJCW9zPS1zeXN2CisJCTs7CisJdm1zKQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJb3M9LXZtcworCQk7OworCXZwcCp8dnh8dngtKikKKwkJYmFzaWNfbWFjaGluZT1mMzAxLWZ1aml0c3UKKwkJOzsKKwl2eHdvcmtzOTYwKQorCQliYXNpY19tYWNoaW5lPWk5NjAtd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczY4KQorCQliYXNpY19tYWNoaW5lPW02OGstd3JzCisJCW9zPS12eHdvcmtzCisJCTs7CisJdnh3b3JrczI5aykKKwkJYmFzaWNfbWFjaGluZT1hMjlrLXdycworCQlvcz0tdnh3b3JrcworCQk7OworCXc2NSopCisJCWJhc2ljX21hY2hpbmU9dzY1LXdkYworCQlvcz0tbm9uZQorCQk7OworCXc4OWstKikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJb3M9LXByb2VsZgorCQk7OworCXhib3gpCisJCWJhc2ljX21hY2hpbmU9aTY4Ni1wYworCQlvcz0tbWluZ3czMgorCQk7OworCXhwcyB8IHhwczEwMCkKKwkJYmFzaWNfbWFjaGluZT14cHMxMDAtaG9uZXl3ZWxsCisJCTs7CisJeW1wKQorCQliYXNpY19tYWNoaW5lPXltcC1jcmF5CisJCW9zPS11bmljb3MKKwkJOzsKKwl6OGstKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4ay11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwl6ODAtKi1jb2ZmKQorCQliYXNpY19tYWNoaW5lPXo4MC11bmtub3duCisJCW9zPS1zaW0KKwkJOzsKKwlub25lKQorCQliYXNpY19tYWNoaW5lPW5vbmUtbm9uZQorCQlvcz0tbm9uZQorCQk7OworCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBkZWZhdWx0IG1hbnVmYWN0dXJlciBvZiBjZXJ0YWluIENQVSB0eXBlcy4gIEl0IGlzIGluCisjIHNvbWUgY2FzZXMgdGhlIG9ubHkgbWFudWZhY3R1cmVyLCBpbiBvdGhlcnMsIGl0IGlzIHRoZSBtb3N0IHBvcHVsYXIuCisJdzg5aykKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLXdpbmJvbmQKKwkJOzsKKwlvcDUwbikKKwkJYmFzaWNfbWFjaGluZT1ocHBhMS4xLW9raQorCQk7OworCW9wNjBjKQorCQliYXNpY19tYWNoaW5lPWhwcGExLjEtb2tpCisJCTs7CisJcm9tcCkKKwkJYmFzaWNfbWFjaGluZT1yb21wLWlibQorCQk7OworCW1taXgpCisJCWJhc2ljX21hY2hpbmU9bW1peC1rbnV0aAorCQk7OworCXJzNjAwMCkKKwkJYmFzaWNfbWFjaGluZT1yczYwMDAtaWJtCisJCTs7CisJdmF4KQorCQliYXNpY19tYWNoaW5lPXZheC1kZWMKKwkJOzsKKwlwZHAxMCkKKwkJIyB0aGVyZSBhcmUgbWFueSBjbG9uZXMsIHNvIERFQyBpcyBub3QgYSBzYWZlIGJldAorCQliYXNpY19tYWNoaW5lPXBkcDEwLXVua25vd24KKwkJOzsKKwlwZHAxMSkKKwkJYmFzaWNfbWFjaGluZT1wZHAxMS1kZWMKKwkJOzsKKwl3ZTMyaykKKwkJYmFzaWNfbWFjaGluZT13ZTMyay1hdHQKKwkJOzsKKwlzaFsxMjM0XSB8IHNoWzI0XWEgfCBzaFsyNF1hZWIgfCBzaFszNF1lYiB8IHNoWzEyMzRdbGUgfCBzaFsyM11lbGUpCisJCWJhc2ljX21hY2hpbmU9c2gtdW5rbm93bgorCQk7OworCXNwYXJjIHwgc3BhcmN2OCB8IHNwYXJjdjkgfCBzcGFyY3Y5YiB8IHNwYXJjdjl2KQorCQliYXNpY19tYWNoaW5lPXNwYXJjLXN1bgorCQk7OworCWN5ZHJhKQorCQliYXNpY19tYWNoaW5lPWN5ZHJhLWN5ZHJvbWUKKwkJOzsKKwlvcmlvbikKKwkJYmFzaWNfbWFjaGluZT1vcmlvbi1oaWdobGV2ZWwKKwkJOzsKKwlvcmlvbjEwNSkKKwkJYmFzaWNfbWFjaGluZT1jbGlwcGVyLWhpZ2hsZXZlbAorCQk7OworCW1hYyB8IG1wdyB8IG1hYy1tcHcpCisJCWJhc2ljX21hY2hpbmU9bTY4ay1hcHBsZQorCQk7OworCXBtYWMgfCBwbWFjLW1wdykKKwkJYmFzaWNfbWFjaGluZT1wb3dlcnBjLWFwcGxlCisJCTs7CisJKi11bmtub3duKQorCQkjIE1ha2Ugc3VyZSB0byBtYXRjaCBhbiBhbHJlYWR5LWNhbm9uaWNhbGl6ZWQgbWFjaGluZSBuYW1lLgorCQk7OworCSopCisJCWVjaG8gSW52YWxpZCBjb25maWd1cmF0aW9uIFxgJDFcJzogbWFjaGluZSBcYCRiYXNpY19tYWNoaW5lXCcgbm90IHJlY29nbml6ZWQgMT4mMgorCQlleGl0IDEKKwkJOzsKK2VzYWMKKworIyBIZXJlIHdlIGNhbm9uaWNhbGl6ZSBjZXJ0YWluIGFsaWFzZXMgZm9yIG1hbnVmYWN0dXJlcnMuCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi1kaWdpdGFsKikKKwkJYmFzaWNfbWFjaGluZT1gZWNobyAkYmFzaWNfbWFjaGluZSB8IHNlZCAncy9kaWdpdGFsLiovZGVjLydgCisJCTs7CisJKi1jb21tb2RvcmUqKQorCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICdzL2NvbW1vZG9yZS4qL2NibS8nYAorCQk7OworCSopCisJCTs7Citlc2FjCisKKyMgRGVjb2RlIG1hbnVmYWN0dXJlci1zcGVjaWZpYyBhbGlhc2VzIGZvciBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorCitpZiBbIHgiJG9zIiAhPSB4IiIgXQordGhlbgorY2FzZSAkb3MgaW4KKyAgICAgICAgIyBGaXJzdCBtYXRjaCBzb21lIHN5c3RlbSB0eXBlIGFsaWFzZXMKKyAgICAgICAgIyB0aGF0IG1pZ2h0IGdldCBjb25mdXNlZCB3aXRoIHZhbGlkIHN5c3RlbSB0eXBlcy4KKwkjIC1zb2xhcmlzKiBpcyBhIGJhc2ljIHN5c3RlbSB0eXBlLCB3aXRoIHRoaXMgb25lIGV4Y2VwdGlvbi4KKyAgICAgICAgLWF1cm9yYXV4KQorCSAgICAgICAgb3M9LWF1cm9yYXV4CisJCTs7CisJLXNvbGFyaXMxIHwgLXNvbGFyaXMxLiopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzb2xhcmlzMXxzdW5vczR8J2AKKwkJOzsKKwktc29sYXJpcykKKwkJb3M9LXNvbGFyaXMyCisJCTs7CisJLXN2cjQqKQorCQlvcz0tc3lzdjQKKwkJOzsKKwktdW5peHdhcmUqKQorCQlvcz0tc3lzdjQuMnV3CisJCTs7CisJLWdudS9saW51eCopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xnbnUvbGludXh8bGludXgtZ251fCdgCisJCTs7CisJIyBGaXJzdCBhY2NlcHQgdGhlIGJhc2ljIHN5c3RlbSB0eXBlcy4KKwkjIFRoZSBwb3J0YWJsZSBzeXN0ZW1zIGNvbWVzIGZpcnN0LgorCSMgRWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiBBICosIHRvIG1hdGNoIGEgdmVyc2lvbiBudW1iZXIuCisJIyAtc3lzdiogaXMgbm90IGhlcmUgYmVjYXVzZSBpdCBjb21lcyBsYXRlciwgYWZ0ZXIgc3lzdnI0LgorCS1nbnUqIHwgLWJzZCogfCAtbWFjaCogfCAtbWluaXgqIHwgLWdlbml4KiB8IC11bHRyaXgqIHwgLWlyaXgqIFwKKwkgICAgICB8IC0qdm1zKiB8IC1zY28qIHwgLWVzaXgqIHwgLWlzYyogfCAtYWl4KiB8IC1jbmsqIHwgLXN1bm9zIHwgLXN1bm9zWzM0XSpcCisJICAgICAgfCAtaHB1eCogfCAtdW5vcyogfCAtb3NmKiB8IC1sdW5hKiB8IC1kZ3V4KiB8IC1hdXJvcmF1eCogfCAtc29sYXJpcyogXAorCSAgICAgIHwgLXN5bSogfCAta29wZW5zb2xhcmlzKiBcCisJICAgICAgfCAtYW1pZ2FvcyogfCAtYW1pZ2Fkb3MqIHwgLW1zZG9zKiB8IC1uZXdzb3MqIHwgLXVuaWNvcyogfCAtYW9mKiBcCisJICAgICAgfCAtYW9zKiB8IC1hcm9zKiBcCisJICAgICAgfCAtbmluZHkqIHwgLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC1lYm1vbiogfCAtaG1zKiB8IC1tdnMqIFwKKwkgICAgICB8IC1jbGl4KiB8IC1yaXNjb3MqIHwgLXVuaXBsdXMqIHwgLWlyaXMqIHwgLXJ0dSogfCAteGVuaXgqIFwKKwkgICAgICB8IC1oaXV4KiB8IC0zODZic2QqIHwgLWtuZXRic2QqIHwgLW1pcmJzZCogfCAtbmV0YnNkKiBcCisJICAgICAgfCAtb3BlbmJzZCogfCAtc29saWRic2QqIFwKKwkgICAgICB8IC1la2tvYnNkKiB8IC1rZnJlZWJzZCogfCAtZnJlZWJzZCogfCAtcmlzY2l4KiB8IC1seW54b3MqIFwKKwkgICAgICB8IC1ib3N4KiB8IC1uZXh0c3RlcCogfCAtY3h1eCogfCAtYW91dCogfCAtZWxmKiB8IC1vYWJpKiBcCisJICAgICAgfCAtcHR4KiB8IC1jb2ZmKiB8IC1lY29mZiogfCAtd2lubnQqIHwgLWRvbWFpbiogfCAtdnN0YSogXAorCSAgICAgIHwgLXVkaSogfCAtZWFiaSogfCAtbGl0ZXMqIHwgLWllZWUqIHwgLWdvMzIqIHwgLWF1eCogXAorCSAgICAgIHwgLWNob3J1c29zKiB8IC1jaG9ydXNyZGIqIHwgLWNlZ2NjKiBcCisJICAgICAgfCAtY3lnd2luKiB8IC1wZSogfCAtcHNvcyogfCAtbW9zcyogfCAtcHJvZWxmKiB8IC1ydGVtcyogXAorCSAgICAgIHwgLW1pbmd3MzIqIHwgLWxpbnV4LWdudSogfCAtbGludXgtbmV3bGliKiB8IC1saW51eC11Y2xpYmMqIFwKKwkgICAgICB8IC11eHB2KiB8IC1iZW9zKiB8IC1tcGVpeCogfCAtdWRrKiBcCisJICAgICAgfCAtaW50ZXJpeCogfCAtdXdpbiogfCAtbWtzKiB8IC1yaGFwc29keSogfCAtZGFyd2luKiB8IC1vcGVuZWQqIFwKKwkgICAgICB8IC1vcGVuc3RlcCogfCAtb3NraXQqIHwgLWNvbml4KiB8IC1wdzMyKiB8IC1ub25zdG9wdXgqIFwKKwkgICAgICB8IC1zdG9ybS1jaGFvcyogfCAtdG9wczEwKiB8IC10ZW5leCogfCAtdG9wczIwKiB8IC1pdHMqIFwKKwkgICAgICB8IC1vczIqIHwgLXZvcyogfCAtcGFsbW9zKiB8IC11Y2xpbnV4KiB8IC1udWNsZXVzKiBcCisJICAgICAgfCAtbW9ycGhvcyogfCAtc3VwZXJ1eCogfCAtcnRtayogfCAtcnRtay1ub3ZhKiB8IC13aW5kaXNzKiBcCisJICAgICAgfCAtcG93ZXJtYXgqIHwgLWRuaXgqIHwgLW54NiB8IC1ueDcgfCAtc2VpKiB8IC1kcmFnb25mbHkqIFwKKwkgICAgICB8IC1za3lvcyogfCAtaGFpa3UqIHwgLXJkb3MqIHwgLXRvcHBlcnMqIHwgLWRyb3BzKiB8IC1lcyopCisJIyBSZW1lbWJlciwgZWFjaCBhbHRlcm5hdGl2ZSBNVVNUIEVORCBJTiAqLCB0byBtYXRjaCBhIHZlcnNpb24gbnVtYmVyLgorCQk7OworCS1xbngqKQorCQljYXNlICRiYXNpY19tYWNoaW5lIGluCisJCSAgICB4ODYtKiB8IGkqODYtKikKKwkJCTs7CisJCSAgICAqKQorCQkJb3M9LW50byRvcworCQkJOzsKKwkJZXNhYworCQk7OworCS1udG8tcW54KikKKwkJOzsKKwktbnRvKikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfG50b3xudG8tcW54fCdgCisJCTs7CisJLXNpbSB8IC1lczE4MDAqIHwgLWhtcyogfCAteHJheSB8IC1vczY4ayogfCAtbm9uZSogfCAtdjg4ciogXAorCSAgICAgIHwgLXdpbmRvd3MqIHwgLW9zeCB8IC1hYnVnIHwgLW5ldHdhcmUqIHwgLW9zOSogfCAtYmVvcyogfCAtaGFpa3UqIFwKKwkgICAgICB8IC1tYWNvcyogfCAtbXB3KiB8IC1tYWdpYyogfCAtbW1peHdhcmUqIHwgLW1vbjk2MCogfCAtbG5ld3MqKQorCQk7OworCS1tYWMqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bWFjfG1hY29zfCdgCisJCTs7CisJLWxpbnV4LWRpZXRsaWJjKQorCQlvcz0tbGludXgtZGlldGxpYmMKKwkJOzsKKwktbGludXgqKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8bGludXh8bGludXgtZ251fCdgCisJCTs7CisJLXN1bm9zNSopCisJCW9zPWBlY2hvICRvcyB8IHNlZCAtZSAnc3xzdW5vczV8c29sYXJpczJ8J2AKKwkJOzsKKwktc3Vub3M2KikKKwkJb3M9YGVjaG8gJG9zIHwgc2VkIC1lICdzfHN1bm9zNnxzb2xhcmlzM3wnYAorCQk7OworCS1vcGVuZWQqKQorCQlvcz0tb3BlbmVkaXRpb24KKwkJOzsKKyAgICAgICAgLW9zNDAwKikKKwkJb3M9LW9zNDAwCisJCTs7CisJLXdpbmNlKikKKwkJb3M9LXdpbmNlCisJCTs7CisJLW9zZnJvc2UqKQorCQlvcz0tb3Nmcm9zZQorCQk7OworCS1vc2YqKQorCQlvcz0tb3NmCisJCTs7CisJLXV0ZWsqKQorCQlvcz0tYnNkCisJCTs7CisJLWR5bml4KikKKwkJb3M9LWJzZAorCQk7OworCS1hY2lzKikKKwkJb3M9LWFvcworCQk7OworCS1hdGhlb3MqKQorCQlvcz0tYXRoZW9zCisJCTs7CisJLXN5bGxhYmxlKikKKwkJb3M9LXN5bGxhYmxlCisJCTs7CisJLTM4NmJzZCkKKwkJb3M9LWJzZAorCQk7OworCS1jdGl4KiB8IC11dHMqKQorCQlvcz0tc3lzdgorCQk7OworCS1ub3ZhKikKKwkJb3M9LXJ0bWstbm92YQorCQk7OworCS1uczIgKQorCQlvcz0tbmV4dHN0ZXAyCisJCTs7CisJLW5zayopCisJCW9zPS1uc2sKKwkJOzsKKwkjIFByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBzaW5peDUuCisJLXNpbml4NS4qKQorCQlvcz1gZWNobyAkb3MgfCBzZWQgLWUgJ3N8c2luaXh8c3lzdnwnYAorCQk7OworCS1zaW5peCopCisJCW9zPS1zeXN2NAorCQk7OworICAgICAgICAtdHBmKikKKwkJb3M9LXRwZgorCQk7OworCS10cml0b24qKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktb3NzKikKKwkJb3M9LXN5c3YzCisJCTs7CisJLXN2cjQpCisJCW9zPS1zeXN2NAorCQk7OworCS1zdnIzKQorCQlvcz0tc3lzdjMKKwkJOzsKKwktc3lzdnI0KQorCQlvcz0tc3lzdjQKKwkJOzsKKwkjIFRoaXMgbXVzdCBjb21lIGFmdGVyIC1zeXN2cjQuCisJLXN5c3YqKQorCQk7OworCS1vc2UqKQorCQlvcz0tb3NlCisJCTs7CisJLWVzMTgwMCopCisJCW9zPS1vc2UKKwkJOzsKKwkteGVuaXgpCisJCW9zPS14ZW5peAorCQk7OworCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCW9zPS1taW50CisJCTs7CisJLWFyb3MqKQorCQlvcz0tYXJvcworCQk7OworCS1rYW9zKikKKwkJb3M9LWthb3MKKwkJOzsKKwktenZtb2UpCisJCW9zPS16dm1vZQorCQk7OworCS1kaWNvcyopCisJCW9zPS1kaWNvcworCQk7OworICAgICAgICAtbmFjbCopCisJICAgICAgICA7OworCS1ub25lKQorCQk7OworCSopCisJCSMgR2V0IHJpZCBvZiB0aGUgYC0nIGF0IHRoZSBiZWdpbm5pbmcgb2YgJG9zLgorCQlvcz1gZWNobyAkb3MgfCBzZWQgJ3MvW14tXSotLy8nYAorCQllY2hvIEludmFsaWQgY29uZmlndXJhdGlvbiBcYCQxXCc6IHN5c3RlbSBcYCRvc1wnIG5vdCByZWNvZ25pemVkIDE+JjIKKwkJZXhpdCAxCisJCTs7Citlc2FjCitlbHNlCisKKyMgSGVyZSB3ZSBoYW5kbGUgdGhlIGRlZmF1bHQgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBtYWNoaW5lcy4KKyMgVGhlIHZhbHVlIHNob3VsZCBiZSB3aGF0IHRoZSB2ZW5kb3IgY3VycmVudGx5IHNoaXBzIG91dCB0aGUgZG9vciB3aXRoIHRoZWlyCisjIG1hY2hpbmUgb3IgcHV0IGFub3RoZXIgd2F5LCB0aGUgbW9zdCBwb3B1bGFyIG9zIHByb3ZpZGVkIHdpdGggdGhlIG1hY2hpbmUuCisKKyMgTm90ZSB0aGF0IGlmIHlvdSdyZSBnb2luZyB0byB0cnkgdG8gbWF0Y2ggIi1NQU5VRkFDVFVSRVIiIGhlcmUgKHNheSwKKyMgIi1zdW4iKSwgdGhlbiB5b3UgaGF2ZSB0byB0ZWxsIHRoZSBjYXNlIHN0YXRlbWVudCB1cCB0b3dhcmRzIHRoZSB0b3AKKyMgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nIHN5c3RlbS4gIE90aGVyd2lzZSwgY29kZSBhYm92ZQorIyB3aWxsIHNpZ25hbCBhbiBlcnJvciBzYXlpbmcgdGhhdCBNQU5VRkFDVFVSRVIgaXNuJ3QgYW4gb3BlcmF0aW5nCisjIHN5c3RlbSwgYW5kIHdlJ2xsIG5ldmVyIGdldCB0byB0aGlzIHBvaW50LgorCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisgICAgICAgIHNjb3JlLSopCisJCW9zPS1lbGYKKwkJOzsKKyAgICAgICAgc3B1LSopCisJCW9zPS1lbGYKKwkJOzsKKwkqLWFjb3JuKQorCQlvcz0tcmlzY2l4MS4yCisJCTs7CisJYXJtKi1yZWJlbCkKKwkJb3M9LWxpbnV4CisJCTs7CisJYXJtKi1zZW1pKQorCQlvcz0tYW91dAorCQk7OworICAgICAgICBjNHgtKiB8IHRpYzR4LSopCisgICAgICAgIAlvcz0tY29mZgorCQk7OworCSMgVGhpcyBtdXN0IGNvbWUgYmVmb3JlIHRoZSAqLWRlYyBlbnRyeS4KKwlwZHAxMC0qKQorCQlvcz0tdG9wczIwCisJCTs7CisJcGRwMTEtKikKKwkJb3M9LW5vbmUKKwkJOzsKKwkqLWRlYyB8IHZheC0qKQorCQlvcz0tdWx0cml4NC4yCisJCTs7CisJbTY4Ki1hcG9sbG8pCisJCW9zPS1kb21haW4KKwkJOzsKKwlpMzg2LXN1bikKKwkJb3M9LXN1bm9zNC4wLjIKKwkJOzsKKwltNjgwMDAtc3VuKQorCQlvcz0tc3Vub3MzCisJCSMgVGhpcyBhbHNvIGV4aXN0cyBpbiB0aGUgY29uZmlndXJlIHByb2dyYW0sIGJ1dCB3YXMgbm90IHRoZQorCQkjIGRlZmF1bHQuCisJCSMgb3M9LXN1bm9zNAorCQk7OworCW02OCotY2lzY28pCisJCW9zPS1hb3V0CisJCTs7CisgICAgICAgIG1lcC0qKQorCQlvcz0tZWxmCisJCTs7CisJbWlwcyotY2lzY28pCisJCW9zPS1lbGYKKwkJOzsKKwltaXBzKi0qKQorCQlvcz0tZWxmCisJCTs7CisJb3IzMi0qKQorCQlvcz0tY29mZgorCQk7OworCSotdHRpKQkjIG11c3QgYmUgYmVmb3JlIHNwYXJjIGVudHJ5IG9yIHdlIGdldCB0aGUgd3Jvbmcgb3MuCisJCW9zPS1zeXN2MworCQk7OworCXNwYXJjLSogfCAqLXN1bikKKwkJb3M9LXN1bm9zNC4xLjEKKwkJOzsKKwkqLWJlKQorCQlvcz0tYmVvcworCQk7OworCSotaGFpa3UpCisJCW9zPS1oYWlrdQorCQk7OworCSotaWJtKQorCQlvcz0tYWl4CisJCTs7CisgICAgCSota251dGgpCisJCW9zPS1tbWl4d2FyZQorCQk7OworCSotd2VjKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi13aW5ib25kKQorCQlvcz0tcHJvZWxmCisJCTs7CisJKi1va2kpCisJCW9zPS1wcm9lbGYKKwkJOzsKKwkqLWhwKQorCQlvcz0taHB1eAorCQk7OworCSotaGl0YWNoaSkKKwkJb3M9LWhpdXgKKwkJOzsKKwlpODYwLSogfCAqLWF0dCB8ICotbmNyIHwgKi1hbHRvcyB8ICotbW90b3JvbGEgfCAqLWNvbnZlcmdlbnQpCisJCW9zPS1zeXN2CisJCTs7CisJKi1jYm0pCisJCW9zPS1hbWlnYW9zCisJCTs7CisJKi1kZykKKwkJb3M9LWRndXgKKwkJOzsKKwkqLWRvbHBoaW4pCisJCW9zPS1zeXN2MworCQk7OworCW02OGstY2N1cikKKwkJb3M9LXJ0dQorCQk7OworCW04OGstb21yb24qKQorCQlvcz0tbHVuYQorCQk7OworCSotbmV4dCApCisJCW9zPS1uZXh0c3RlcAorCQk7OworCSotc2VxdWVudCkKKwkJb3M9LXB0eAorCQk7OworCSotY3JkcykKKwkJb3M9LXVub3MKKwkJOzsKKwkqLW5zKQorCQlvcz0tZ2VuaXgKKwkJOzsKKwlpMzcwLSopCisJCW9zPS1tdnMKKwkJOzsKKwkqLW5leHQpCisJCW9zPS1uZXh0c3RlcDMKKwkJOzsKKwkqLWdvdWxkKQorCQlvcz0tc3lzdgorCQk7OworCSotaGlnaGxldmVsKQorCQlvcz0tYnNkCisJCTs7CisJKi1lbmNvcmUpCisJCW9zPS1ic2QKKwkJOzsKKwkqLXNnaSkKKwkJb3M9LWlyaXgKKwkJOzsKKwkqLXNpZW1lbnMpCisJCW9zPS1zeXN2NAorCQk7OworCSotbWFzc2NvbXApCisJCW9zPS1ydHUKKwkJOzsKKwlmMzBbMDFdLWZ1aml0c3UgfCBmNzAwLWZ1aml0c3UpCisJCW9zPS11eHB2CisJCTs7CisJKi1yb202OGspCisJCW9zPS1jb2ZmCisJCTs7CisJKi0qYnVnKQorCQlvcz0tY29mZgorCQk7OworCSotYXBwbGUpCisJCW9zPS1tYWNvcworCQk7OworCSotYXRhcmkqKQorCQlvcz0tbWludAorCQk7OworCSopCisJCW9zPS1ub25lCisJCTs7Citlc2FjCitmaQorCisjIEhlcmUgd2UgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhlIG9zLCBhbmQgdGhlIENQVSB0eXBlLCBidXQgbm90IHRoZQorIyBtYW51ZmFjdHVyZXIuICBXZSBwaWNrIHRoZSBsb2dpY2FsIG1hbnVmYWN0dXJlci4KK3ZlbmRvcj11bmtub3duCitjYXNlICRiYXNpY19tYWNoaW5lIGluCisJKi11bmtub3duKQorCQljYXNlICRvcyBpbgorCQkJLXJpc2NpeCopCisJCQkJdmVuZG9yPWFjb3JuCisJCQkJOzsKKwkJCS1zdW5vcyopCisJCQkJdmVuZG9yPXN1bgorCQkJCTs7CisJCQktY25rKnwtYWl4KikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1iZW9zKikKKwkJCQl2ZW5kb3I9YmUKKwkJCQk7OworCQkJLWhwdXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktbXBlaXgqKQorCQkJCXZlbmRvcj1ocAorCQkJCTs7CisJCQktaGl1eCopCisJCQkJdmVuZG9yPWhpdGFjaGkKKwkJCQk7OworCQkJLXVub3MqKQorCQkJCXZlbmRvcj1jcmRzCisJCQkJOzsKKwkJCS1kZ3V4KikKKwkJCQl2ZW5kb3I9ZGcKKwkJCQk7OworCQkJLWx1bmEqKQorCQkJCXZlbmRvcj1vbXJvbgorCQkJCTs7CisJCQktZ2VuaXgqKQorCQkJCXZlbmRvcj1ucworCQkJCTs7CisJCQktbXZzKiB8IC1vcGVuZWQqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLW9zNDAwKikKKwkJCQl2ZW5kb3I9aWJtCisJCQkJOzsKKwkJCS1wdHgqKQorCQkJCXZlbmRvcj1zZXF1ZW50CisJCQkJOzsKKwkJCS10cGYqKQorCQkJCXZlbmRvcj1pYm0KKwkJCQk7OworCQkJLXZ4c2ltKiB8IC12eHdvcmtzKiB8IC13aW5kaXNzKikKKwkJCQl2ZW5kb3I9d3JzCisJCQkJOzsKKwkJCS1hdXgqKQorCQkJCXZlbmRvcj1hcHBsZQorCQkJCTs7CisJCQktaG1zKikKKwkJCQl2ZW5kb3I9aGl0YWNoaQorCQkJCTs7CisJCQktbXB3KiB8IC1tYWNvcyopCisJCQkJdmVuZG9yPWFwcGxlCisJCQkJOzsKKwkJCS0qbWludCB8IC1taW50WzAtOV0qIHwgLSpNaU5UIHwgLU1pTlRbMC05XSopCisJCQkJdmVuZG9yPWF0YXJpCisJCQkJOzsKKwkJCS12b3MqKQorCQkJCXZlbmRvcj1zdHJhdHVzCisJCQkJOzsKKwkJZXNhYworCQliYXNpY19tYWNoaW5lPWBlY2hvICRiYXNpY19tYWNoaW5lIHwgc2VkICJzL3Vua25vd24vJHZlbmRvci8iYAorCQk7OworZXNhYworCitlY2hvICRiYXNpY19tYWNoaW5lJG9zCitleGl0CisKKyMgTG9jYWwgdmFyaWFibGVzOgorIyBldmFsOiAoYWRkLWhvb2sgJ3dyaXRlLWZpbGUtaG9va3MgJ3RpbWUtc3RhbXApCisjIHRpbWUtc3RhbXAtc3RhcnQ6ICJ0aW1lc3RhbXA9JyIKKyMgdGltZS1zdGFtcC1mb3JtYXQ6ICIlOnktJTAybS0lMDJkIgorIyB0aW1lLXN0YW1wLWVuZDogIiciCisjIEVuZDoKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvY29uZmlndXJlIGIvbGlicGNhcC0xLjMuMC9jb25maWd1cmUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjllMGYzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvY29uZmlndXJlCkBAIC0wLDAgKzEsOTA4MCBAQAorIyEgL2Jpbi9zaAorIyBGcm9tIGNvbmZpZ3VyZS5pbiBSZXZpc2lvbjogMS4xNjggLgorIyBHdWVzcyB2YWx1ZXMgZm9yIHN5c3RlbS1kZXBlbmRlbnQgdmFyaWFibGVzIGFuZCBjcmVhdGUgTWFrZWZpbGVzLgorIyBHZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjcuCisjCisjCisjIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSwKKyMgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4KKyMKKyMKKyMgVGhpcyBjb25maWd1cmUgc2NyaXB0IGlzIGZyZWUgc29mdHdhcmU7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZ2l2ZXMgdW5saW1pdGVkIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQgbW9kaWZ5IGl0LgorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKK2lmIHRlc3QgIngkQ09ORklHX1NIRUxMIiA9IHg7IHRoZW4KKyAgYXNfYm91cm5lX2NvbXBhdGlibGU9ImlmIHRlc3QgLW4gXCJcJHtaU0hfVkVSU0lPTitzZXR9XCIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gXCR7MStcIlwkQFwifSwgd2hpY2gKKyAgIyBpcyBjb250cmFyeSB0byBvdXIgdXNhZ2UuICBEaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyAgYWxpYXMgLWcgJ1wkezErXCJcJEBcIn0nPSdcIlwkQFwiJworICBzZXRvcHQgTk9fR0xPQl9TVUJTVAorZWxzZQorICBjYXNlIFxgKHNldCAtbykgMj4vZGV2L251bGxcYCBpbiAjKAorICAqcG9zaXgqKSA6CisgICAgc2V0IC1vIHBvc2l4IDs7ICMoCisgICopIDoKKyAgICAgOzsKK2VzYWMKK2ZpCisiCisgIGFzX3JlcXVpcmVkPSJhc19mbl9yZXR1cm4gKCkgeyAoZXhpdCBcJDEpOyB9Cithc19mbl9zdWNjZXNzICgpIHsgYXNfZm5fcmV0dXJuIDA7IH0KK2FzX2ZuX2ZhaWx1cmUgKCkgeyBhc19mbl9yZXR1cm4gMTsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgKCkgeyByZXR1cm4gMDsgfQorYXNfZm5fcmV0X2ZhaWx1cmUgKCkgeyByZXR1cm4gMTsgfQorCitleGl0Y29kZT0wCithc19mbl9zdWNjZXNzIHx8IHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX2ZhaWx1cmUgJiYgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX2ZhaWx1cmUgc3VjY2VlZGVkLjsgfQorYXNfZm5fcmV0X3N1Y2Nlc3MgfHwgeyBleGl0Y29kZT0xOyBlY2hvIGFzX2ZuX3JldF9zdWNjZXNzIGZhaWxlZC47IH0KK2FzX2ZuX3JldF9mYWlsdXJlICYmIHsgZXhpdGNvZGU9MTsgZWNobyBhc19mbl9yZXRfZmFpbHVyZSBzdWNjZWVkZWQuOyB9CitpZiAoIHNldCB4OyBhc19mbl9yZXRfc3VjY2VzcyB5ICYmIHRlc3QgeCA9IFwiXCQxXCIgKTsgdGhlbiA6CisKK2Vsc2UKKyAgZXhpdGNvZGU9MTsgZWNobyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMgd2VyZSBub3Qgc2F2ZWQuCitmaQordGVzdCB4XCRleGl0Y29kZSA9IHgwIHx8IGV4aXQgMSIKKyAgYXNfc3VnZ2VzdGVkPSIgIGFzX2xpbmVub18xPSI7YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQkTElORU5PO2FzX3N1Z2dlc3RlZD0kYXNfc3VnZ2VzdGVkIiBhc19saW5lbm9fMWE9XCRMSU5FTk8KKyAgYXNfbGluZW5vXzI9Ijthc19zdWdnZXN0ZWQ9JGFzX3N1Z2dlc3RlZCRMSU5FTk87YXNfc3VnZ2VzdGVkPSRhc19zdWdnZXN0ZWQiIGFzX2xpbmVub18yYT1cJExJTkVOTworICBldmFsICd0ZXN0IFwieFwkYXNfbGluZW5vXzEnXCRhc19ydW4nXCIgIT0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIiAmJgorICB0ZXN0IFwieFxgZXhwciBcJGFzX2xpbmVub18xJ1wkYXNfcnVuJyArIDFcYFwiID0gXCJ4XCRhc19saW5lbm9fMidcJGFzX3J1bidcIicgfHwgZXhpdCAxCit0ZXN0IFwkKCggMSArIDEgKSkgPSAyIHx8IGV4aXQgMSIKKyAgaWYgKGV2YWwgIiRhc19yZXF1aXJlZCIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgYXNfaGF2ZV9yZXF1aXJlZD15ZXMKK2Vsc2UKKyAgYXNfaGF2ZV9yZXF1aXJlZD1ubworZmkKKyAgaWYgdGVzdCB4JGFzX2hhdmVfcmVxdWlyZWQgPSB4eWVzICYmIChldmFsICIkYXNfc3VnZ2VzdGVkIikgMj4vZGV2L251bGw7IHRoZW4gOgorCitlbHNlCisgIGFzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2FzX2ZvdW5kPWZhbHNlCitmb3IgYXNfZGlyIGluIC9iaW4kUEFUSF9TRVBBUkFUT1IvdXNyL2JpbiRQQVRIX1NFUEFSQVRPUiRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgIGFzX2ZvdW5kPToKKyAgY2FzZSAkYXNfZGlyIGluICMoCisJIC8qKQorCSAgIGZvciBhc19iYXNlIGluIHNoIGJhc2gga3NoIHNoNTsgZG8KKwkgICAgICMgVHJ5IG9ubHkgc2hlbGxzIHRoYXQgZXhpc3QsIHRvIHNhdmUgc2V2ZXJhbCBmb3Jrcy4KKwkgICAgIGFzX3NoZWxsPSRhc19kaXIvJGFzX2Jhc2UKKwkgICAgIGlmIHsgdGVzdCAtZiAiJGFzX3NoZWxsIiB8fCB0ZXN0IC1mICIkYXNfc2hlbGwuZXhlIjsgfSAmJgorCQkgICAgeyAkYXNfZWNobyAiJGFzX2JvdXJuZV9jb21wYXRpYmxlIiIkYXNfcmVxdWlyZWQiIHwgYXNfcnVuPWEgIiRhc19zaGVsbCI7IH0gMj4vZGV2L251bGw7IHRoZW4gOgorICBDT05GSUdfU0hFTEw9JGFzX3NoZWxsIGFzX2hhdmVfcmVxdWlyZWQ9eWVzCisJCSAgIGlmIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3N1Z2dlc3RlZCIgfCBhc19ydW49YSAiJGFzX3NoZWxsIjsgfSAyPi9kZXYvbnVsbDsgdGhlbiA6CisgIGJyZWFrIDIKK2ZpCitmaQorCSAgIGRvbmU7OworICAgICAgIGVzYWMKKyAgYXNfZm91bmQ9ZmFsc2UKK2RvbmUKKyRhc19mb3VuZCB8fCB7IGlmIHsgdGVzdCAtZiAiJFNIRUxMIiB8fCB0ZXN0IC1mICIkU0hFTEwuZXhlIjsgfSAmJgorCSAgICAgIHsgJGFzX2VjaG8gIiRhc19ib3VybmVfY29tcGF0aWJsZSIiJGFzX3JlcXVpcmVkIiB8IGFzX3J1bj1hICIkU0hFTEwiOyB9IDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgQ09ORklHX1NIRUxMPSRTSEVMTCBhc19oYXZlX3JlcXVpcmVkPXllcworZmk7IH0KK0lGUz0kYXNfc2F2ZV9JRlMKKworCisgICAgICBpZiB0ZXN0ICJ4JENPTkZJR19TSEVMTCIgIT0geDsgdGhlbiA6CisgICMgV2UgY2Fubm90IHlldCBhc3N1bWUgYSBkZWNlbnQgc2hlbGwsIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBhCisJIyBuZXV0cmFsaXphdGlvbiB2YWx1ZSBmb3Igc2hlbGxzIHdpdGhvdXQgdW5zZXQ7IGFuZCB0aGlzIGFsc28KKwkjIHdvcmtzIGFyb3VuZCBzaGVsbHMgdGhhdCBjYW5ub3QgdW5zZXQgbm9uZXhpc3RlbnQgdmFyaWFibGVzLgorCUJBU0hfRU5WPS9kZXYvbnVsbAorCUVOVj0vZGV2L251bGwKKwkodW5zZXQgQkFTSF9FTlYpID4vZGV2L251bGwgMj4mMSAmJiB1bnNldCBCQVNIX0VOViBFTlYKKwlleHBvcnQgQ09ORklHX1NIRUxMCisJZXhlYyAiJENPTkZJR19TSEVMTCIgIiRhc19teXNlbGYiICR7MSsiJEAifQorZmkKKworICAgIGlmIHRlc3QgeCRhc19oYXZlX3JlcXVpcmVkID0geG5vOyB0aGVuIDoKKyAgJGFzX2VjaG8gIiQwOiBUaGlzIHNjcmlwdCByZXF1aXJlcyBhIHNoZWxsIG1vcmUgbW9kZXJuIHRoYW4gYWxsIgorICAkYXNfZWNobyAiJDA6IHRoZSBzaGVsbHMgdGhhdCBJIGZvdW5kIG9uIHlvdXIgc3lzdGVtLiIKKyAgaWYgdGVzdCB4JHtaU0hfVkVSU0lPTitzZXR9ID0geHNldCA7IHRoZW4KKyAgICAkYXNfZWNobyAiJDA6IEluIHBhcnRpY3VsYXIsIHpzaCAkWlNIX1ZFUlNJT04gaGFzIGJ1Z3MgYW5kIHNob3VsZCIKKyAgICAkYXNfZWNobyAiJDA6IGJlIHVwZ3JhZGVkIHRvIHpzaCA0LjMuNCBvciBsYXRlci4iCisgIGVsc2UKKyAgICAkYXNfZWNobyAiJDA6IFBsZWFzZSB0ZWxsIGJ1Zy1hdXRvY29uZkBnbnUub3JnIGFib3V0IHlvdXIgc3lzdGVtLAorJDA6IGluY2x1ZGluZyBhbnkgZXJyb3IgcG9zc2libHkgb3V0cHV0IGJlZm9yZSB0aGlzCiskMDogbWVzc2FnZS4gVGhlbiBpbnN0YWxsIGEgbW9kZXJuIHNoZWxsLCBvciBtYW51YWxseSBydW4KKyQwOiB0aGUgc2NyaXB0IHVuZGVyIHN1Y2ggYSBzaGVsbCBpZiB5b3UgZG8gaGF2ZSBvbmUuIgorICBmaQorICBleGl0IDEKK2ZpCitmaQorZmkKK1NIRUxMPSR7Q09ORklHX1NIRUxMLS9iaW4vc2h9CitleHBvcnQgU0hFTEwKKyMgVW5zZXQgbW9yZSB2YXJpYWJsZXMga25vd24gdG8gaW50ZXJmZXJlIHdpdGggYmVoYXZpb3Igb2YgY29tbW9uIHRvb2xzLgorQ0xJQ09MT1JfRk9SQ0U9IEdSRVBfT1BUSU9OUz0KK3Vuc2V0IENMSUNPTE9SX0ZPUkNFIEdSRVBfT1BUSU9OUworCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggU2hlbGwgRnVuY3Rpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIGFzX2ZuX3Vuc2V0IFZBUgorIyAtLS0tLS0tLS0tLS0tLS0KKyMgUG9ydGFibHkgdW5zZXQgVkFSLgorYXNfZm5fdW5zZXQgKCkKK3sKKyAgeyBldmFsICQxPTsgdW5zZXQgJDE7fQorfQorYXNfdW5zZXQ9YXNfZm5fdW5zZXQKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fbWtkaXJfcAorIyAtLS0tLS0tLS0tLS0tCisjIENyZWF0ZSAiJGFzX2RpciIgYXMgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBwYXJlbnRzIGlmIG5lY2Vzc2FyeS4KK2FzX2ZuX21rZGlyX3AgKCkKK3sKKworICBjYXNlICRhc19kaXIgaW4gIygKKyAgLSopIGFzX2Rpcj0uLyRhc19kaXI7OworICBlc2FjCisgIHRlc3QgLWQgIiRhc19kaXIiIHx8IGV2YWwgJGFzX21rZGlyX3AgfHwgeworICAgIGFzX2RpcnM9CisgICAgd2hpbGUgOjsgZG8KKyAgICAgIGNhc2UgJGFzX2RpciBpbiAjKAorICAgICAgKlwnKikgYXNfcWRpcj1gJGFzX2VjaG8gIiRhc19kaXIiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgIycoCisgICAgICAqKSBhc19xZGlyPSRhc19kaXI7OworICAgICAgZXNhYworICAgICAgYXNfZGlycz0iJyRhc19xZGlyJyAkYXNfZGlycyIKKyAgICAgIGFzX2Rpcj1gJGFzX2Rpcm5hbWUgLS0gIiRhc19kaXIiIHx8CiskYXNfZXhwciBYIiRhc19kaXIiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKVteL10nIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYXNfZGlyIiB8CisgICAgc2VkICcvXlhcKC4qW14vXVwpXC9cLypbXi9dW14vXSpcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpW14vXS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXCkuKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICBzLy4qLy4vOyBxJ2AKKyAgICAgIHRlc3QgLWQgIiRhc19kaXIiICYmIGJyZWFrCisgICAgZG9uZQorICAgIHRlc3QgLXogIiRhc19kaXJzIiB8fCBldmFsICJta2RpciAkYXNfZGlycyIKKyAgfSB8fCB0ZXN0IC1kICIkYXNfZGlyIiB8fCBhc19mbl9lcnJvciAkPyAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgJGFzX2RpciIKKworCit9ICMgYXNfZm5fbWtkaXJfcAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKKyMgYXNfZm5fZXJyb3IgU1RBVFVTIEVSUk9SIFtMSU5FTk8gTE9HX0ZEXQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE91dHB1dCAiYGJhc2VuYW1lICQwYDogZXJyb3I6IEVSUk9SIiB0byBzdGRlcnIuIElmIExJTkVOTyBhbmQgTE9HX0ZEIGFyZQorIyBwcm92aWRlZCwgYWxzbyBvdXRwdXQgdGhlIGVycm9yIHRvIExPR19GRCwgcmVmZXJlbmNpbmcgTElORU5PLiBUaGVuIGV4aXQgdGhlCisjIHNjcmlwdCB3aXRoIFNUQVRVUywgdXNpbmcgMSBpZiB0aGF0IHdhcyAwLgorYXNfZm5fZXJyb3IgKCkKK3sKKyAgYXNfc3RhdHVzPSQxOyB0ZXN0ICRhc19zdGF0dXMgLWVxIDAgJiYgYXNfc3RhdHVzPTEKKyAgaWYgdGVzdCAiJDQiOyB0aGVuCisgICAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMyJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiAkMiIgPiYkNAorICBmaQorICAkYXNfZWNobyAiJGFzX21lOiBlcnJvcjogJDIiID4mMgorICBhc19mbl9leGl0ICRhc19zdGF0dXMKK30gIyBhc19mbl9lcnJvcgorCitpZiBleHByIGEgOiAnXChhXCknID4vZGV2L251bGwgMj4mMSAmJgorICAgdGVzdCAiWGBleHByIDAwMDAxIDogJy4qXCguLi5cKSdgIiA9IFgwMDE7IHRoZW4KKyAgYXNfZXhwcj1leHByCitlbHNlCisgIGFzX2V4cHI9ZmFsc2UKK2ZpCisKK2lmIChiYXNlbmFtZSAtLSAvKSA+L2Rldi9udWxsIDI+JjEgJiYgdGVzdCAiWGBiYXNlbmFtZSAtLSAvIDI+JjFgIiA9ICJYLyI7IHRoZW4KKyAgYXNfYmFzZW5hbWU9YmFzZW5hbWUKK2Vsc2UKKyAgYXNfYmFzZW5hbWU9ZmFsc2UKK2ZpCisKK2lmIChhc19kaXI9YGRpcm5hbWUgLS0gL2AgJiYgdGVzdCAiWCRhc19kaXIiID0gWC8pID4vZGV2L251bGwgMj4mMTsgdGhlbgorICBhc19kaXJuYW1lPWRpcm5hbWUKK2Vsc2UKKyAgYXNfZGlybmFtZT1mYWxzZQorZmkKKworYXNfbWU9YCRhc19iYXNlbmFtZSAtLSAiJDAiIHx8CiskYXNfZXhwciBYLyIkMCIgOiAnLiovXChbXi9dW14vXSpcKS8qJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvL1wpJCcgXHwgXAorCSBYIiQwIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgvIiQwIiB8CisgICAgc2VkICcvXi4qXC9cKFteL11bXi9dKlwpXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cL1wpJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcL1woXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorCisjIEF2b2lkIGRlcGVuZGluZyB1cG9uIENoYXJhY3RlciBSYW5nZXMuCithc19jcl9sZXR0ZXJzPSdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK2FzX2NyX0xFVFRFUlM9J0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworYXNfY3JfTGV0dGVycz0kYXNfY3JfbGV0dGVycyRhc19jcl9MRVRURVJTCithc19jcl9kaWdpdHM9JzAxMjM0NTY3ODknCithc19jcl9hbG51bT0kYXNfY3JfTGV0dGVycyRhc19jcl9kaWdpdHMKKworCisgIGFzX2xpbmVub18xPSRMSU5FTk8gYXNfbGluZW5vXzFhPSRMSU5FTk8KKyAgYXNfbGluZW5vXzI9JExJTkVOTyBhc19saW5lbm9fMmE9JExJTkVOTworICBldmFsICd0ZXN0ICJ4JGFzX2xpbmVub18xJyRhc19ydW4nIiAhPSAieCRhc19saW5lbm9fMickYXNfcnVuJyIgJiYKKyAgdGVzdCAieGBleHByICRhc19saW5lbm9fMSckYXNfcnVuJyArIDFgIiA9ICJ4JGFzX2xpbmVub18yJyRhc19ydW4nIicgfHwgeworICAjIEJsYW1lIExlZSBFLiBNY01haG9uICgxOTMxLTE5ODkpIGZvciBzZWQncyBzeW50YXguICA6LSkKKyAgc2VkIC1uICcKKyAgICBwCisgICAgL1skXUxJTkVOTy89CisgICcgPCRhc19teXNlbGYgfAorICAgIHNlZCAnCisgICAgICBzL1skXUxJTkVOTy4qLyYtLworICAgICAgdCBsaW5lbm8KKyAgICAgIGIKKyAgICAgIDpsaW5lbm8KKyAgICAgIE4KKyAgICAgIDpsb29wCisgICAgICBzL1skXUxJTkVOT1woW14nJGFzX2NyX2FsbnVtJ19dLipcblwpXCguKlwpL1wyXDFcMi8KKyAgICAgIHQgbG9vcAorICAgICAgcy8tXG4uKi8vCisgICAgJyA+JGFzX21lLmxpbmVubyAmJgorICBjaG1vZCAreCAiJGFzX21lLmxpbmVubyIgfHwKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY3JlYXRlICRhc19tZS5saW5lbm87IHJlcnVuIHdpdGggYSBQT1NJWCBzaGVsbCIgPiYyOyBhc19mbl9leGl0IDE7IH0KKworICAjIERvbid0IHRyeSB0byBleGVjIGFzIGl0IGNoYW5nZXMgJFswXSwgY2F1c2luZyBhbGwgc29ydCBvZiBwcm9ibGVtcworICAjICh0aGUgZGlybmFtZSBvZiAkWzBdIGlzIG5vdCB0aGUgcGxhY2Ugd2hlcmUgd2UgbWlnaHQgZmluZCB0aGUKKyAgIyBvcmlnaW5hbCBhbmQgc28gb24uICBBdXRvY29uZiBpcyBlc3BlY2lhbGx5IHNlbnNpdGl2ZSB0byB0aGlzKS4KKyAgLiAiLi8kYXNfbWUubGluZW5vIgorICAjIEV4aXQgc3RhdHVzIGlzIHRoYXQgb2YgdGhlIGxhc3QgY29tbWFuZC4KKyAgZXhpdAorfQorCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworaWYgbWtkaXIgLXAgLiAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19ta2Rpcl9wPSdta2RpciAtcCAiJGFzX2RpciInCitlbHNlCisgIHRlc3QgLWQgLi8tcCAmJiBybWRpciAuLy1wCisgIGFzX21rZGlyX3A9ZmFsc2UKK2ZpCisKK2lmIHRlc3QgLXggLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgYXNfdGVzdF94PSd0ZXN0IC14JworZWxzZQorICBpZiBscyAtZEwgLyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKyAgICBhc19sc19MX29wdGlvbj1MCisgIGVsc2UKKyAgICBhc19sc19MX29wdGlvbj0KKyAgZmkKKyAgYXNfdGVzdF94PScKKyAgICBldmFsIHNoIC1jICdcJycKKyAgICAgIGlmIHRlc3QgLWQgIiQxIjsgdGhlbgorCXRlc3QgLWQgIiQxLy4iOworICAgICAgZWxzZQorCWNhc2UgJDEgaW4gIygKKwktKilzZXQgIi4vJDEiOzsKKwllc2FjOworCWNhc2UgYGxzIC1sZCckYXNfbHNfTF9vcHRpb24nICIkMSIgMj4vZGV2L251bGxgIGluICMoKAorCT8/P1tzeF0qKTo7OyopZmFsc2U7O2VzYWM7ZmkKKyAgICAnXCcnIHNoCisgICcKK2ZpCithc19leGVjdXRhYmxlX3A9JGFzX3Rlc3RfeAorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgQ1BQIG5hbWUuCithc190cl9jcHA9ImV2YWwgc2VkICd5JSokYXNfY3JfbGV0dGVycyVQJGFzX2NyX0xFVFRFUlMlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisjIFNlZCBleHByZXNzaW9uIHRvIG1hcCBhIHN0cmluZyBvbnRvIGEgdmFsaWQgdmFyaWFibGUgbmFtZS4KK2FzX3RyX3NoPSJldmFsIHNlZCAneSUqKyVwcCU7cyVbXl8kYXNfY3JfYWxudW1dJV8lZyciCisKKwordGVzdCAtbiAiJERKRElSIiB8fCBleGVjIDc8JjAgPC9kZXYvbnVsbAorZXhlYyA2PiYxCisKKyMgTmFtZSBvZiB0aGUgaG9zdC4KKyMgaG9zdG5hbWUgb24gc29tZSBzeXN0ZW1zIChTVlIzLjIsIG9sZCBHTlUvTGludXgpIHJldHVybnMgYSBib2d1cyBleGl0IHN0YXR1cywKKyMgc28gdW5hbWUgZ2V0cyBydW4gdG9vLgorYWNfaG9zdG5hbWU9YChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisKKyMKKyMgSW5pdGlhbGl6YXRpb25zLgorIworYWNfZGVmYXVsdF9wcmVmaXg9L3Vzci9sb2NhbAorYWNfY2xlYW5fZmlsZXM9CithY19jb25maWdfbGlib2JqX2Rpcj0uCitMSUJPQkpTPQorY3Jvc3NfY29tcGlsaW5nPW5vCitzdWJkaXJzPQorTUZMQUdTPQorTUFLRUZMQUdTPQorCisjIElkZW50aXR5IG9mIHRoaXMgcGFja2FnZS4KK1BBQ0tBR0VfTkFNRT0KK1BBQ0tBR0VfVEFSTkFNRT0KK1BBQ0tBR0VfVkVSU0lPTj0KK1BBQ0tBR0VfU1RSSU5HPQorUEFDS0FHRV9CVUdSRVBPUlQ9CitQQUNLQUdFX1VSTD0KKworYWNfdW5pcXVlX2ZpbGU9InBjYXAuYyIKKyMgRmFjdG9yaW5nIGRlZmF1bHQgaGVhZGVycyBmb3IgbW9zdCB0ZXN0cy4KK2FjX2luY2x1ZGVzX2RlZmF1bHQ9IlwKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKKyMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyMgaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2lmZGVmIFNURENfSEVBREVSUworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkZGVmLmg+CisjZWxzZQorIyBpZmRlZiBIQVZFX1NURExJQl9ICisjICBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmZGVmIEhBVkVfU1RSSU5HX0gKKyMgaWYgIWRlZmluZWQgU1REQ19IRUFERVJTICYmIGRlZmluZWQgSEFWRV9NRU1PUllfSAorIyAgaW5jbHVkZSA8bWVtb3J5Lmg+CisjIGVuZGlmCisjIGluY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TVFJJTkdTX0gKKyMgaW5jbHVkZSA8c3RyaW5ncy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjIGluY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NURElOVF9ICisjIGluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9VTklTVERfSAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiIKKworYWNfc3Vic3RfdmFycz0nTFRMSUJPQkpTCitJTlNUQUxMX0RBVEEKK0lOU1RBTExfU0NSSVBUCitJTlNUQUxMX1BST0dSQU0KK0NBTl9TUkMKK1BDQVBfU1VQUE9SVF9DQU4KK0NBTlVTQl9TUkMKK1BDQVBfU1VQUE9SVF9DQU5VU0IKK0JUX1NSQworUENBUF9TVVBQT1JUX0JUCitORVRGSUxURVJfU1JDCitQQ0FQX1NVUFBPUlRfTkVURklMVEVSCitVU0JfU1JDCitQQ0FQX1NVUFBPUlRfVVNCCitNQU5fTUlTQ19JTkZPCitNQU5fRklMRV9GT1JNQVRTCitEWUVYVAorU1NSQworQURETEFSQ0hJVkVPQkpTCitBRERMT0JKUworVl9SUEFUSF9PUFQKK1ZfU09OQU1FX09QVAorVl9TSExJQl9PUFQKK1ZfU0hMSUJfQ01ECitWX1BDQVAKK1ZfSU5DTFMKK1ZfRklOREFMTERFVlMKK1ZfREVGUworVl9DQ09QVAorQVIKK1JBTkxJQgorVl9ZQUNDCitWX0xFWAorSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEEKK0xJQk9CSlMKK0VHUkVQCitHUkVQCitDUFAKK09CSkVYVAorRVhFRVhUCithY19jdF9DQworQ1BQRkxBR1MKK0xERkxBR1MKK0NGTEFHUworQ0MKK1NITElDQzIKK3RhcmdldF9vcwordGFyZ2V0X3ZlbmRvcgordGFyZ2V0X2NwdQordGFyZ2V0Citob3N0X29zCitob3N0X3ZlbmRvcgoraG9zdF9jcHUKK2hvc3QKK2J1aWxkX29zCitidWlsZF92ZW5kb3IKK2J1aWxkX2NwdQorYnVpbGQKK3RhcmdldF9hbGlhcworaG9zdF9hbGlhcworYnVpbGRfYWxpYXMKK0xJQlMKK0VDSE9fVAorRUNIT19OCitFQ0hPX0MKK0RFRlMKK21hbmRpcgorbG9jYWxlZGlyCitsaWJkaXIKK3BzZGlyCitwZGZkaXIKK2R2aWRpcgoraHRtbGRpcgoraW5mb2RpcgorZG9jZGlyCitvbGRpbmNsdWRlZGlyCitpbmNsdWRlZGlyCitsb2NhbHN0YXRlZGlyCitzaGFyZWRzdGF0ZWRpcgorc3lzY29uZmRpcgorZGF0YWRpcgorZGF0YXJvb3RkaXIKK2xpYmV4ZWNkaXIKK3NiaW5kaXIKK2JpbmRpcgorcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZQorcHJlZml4CitleGVjX3ByZWZpeAorUEFDS0FHRV9VUkwKK1BBQ0tBR0VfQlVHUkVQT1JUCitQQUNLQUdFX1NUUklORworUEFDS0FHRV9WRVJTSU9OCitQQUNLQUdFX1RBUk5BTUUKK1BBQ0tBR0VfTkFNRQorUEFUSF9TRVBBUkFUT1IKK1NIRUxMJworYWNfc3Vic3RfZmlsZXM9JycKK2FjX3VzZXJfb3B0cz0nCitlbmFibGVfb3B0aW9uX2NoZWNraW5nCit3aXRoX2djYworZW5hYmxlX2xhcmdlZmlsZQorZW5hYmxlX3Byb3RvY2hhaW4KK3dpdGhfc2l0YQord2l0aF9wY2FwCit3aXRoX2xpYm5sCitlbmFibGVfaXB2NgorZW5hYmxlX29wdGltaXplcl9kYmcKK2VuYWJsZV95eWRlYnVnCit3aXRoX2RhZword2l0aF9kYWdfaW5jbHVkZXMKK3dpdGhfZGFnX2xpYnJhcmllcword2l0aF9zZXB0ZWwKK3dpdGhfc25mCit3aXRoX3NuZl9pbmNsdWRlcword2l0aF9zbmZfbGlicmFyaWVzCit3aXRoX2ZsZXgKK3dpdGhfYmlzb24KK2VuYWJsZV91bml2ZXJzYWwKK2VuYWJsZV9ibHVldG9vdGgKK2VuYWJsZV9jYW51c2IKK2VuYWJsZV9jYW4KKycKKyAgICAgIGFjX3ByZWNpb3VzX3ZhcnM9J2J1aWxkX2FsaWFzCitob3N0X2FsaWFzCit0YXJnZXRfYWxpYXMKK0NDCitDRkxBR1MKK0xERkxBR1MKK0xJQlMKK0NQUEZMQUdTCitDUFAnCisKKworIyBJbml0aWFsaXplIHNvbWUgdmFyaWFibGVzIHNldCBieSBvcHRpb25zLgorYWNfaW5pdF9oZWxwPQorYWNfaW5pdF92ZXJzaW9uPWZhbHNlCithY191bnJlY29nbml6ZWRfb3B0cz0KK2FjX3VucmVjb2duaXplZF9zZXA9CisjIFRoZSB2YXJpYWJsZXMgaGF2ZSB0aGUgc2FtZSBuYW1lcyBhcyB0aGUgb3B0aW9ucywgd2l0aAorIyBkYXNoZXMgY2hhbmdlZCB0byB1bmRlcmxpbmVzLgorY2FjaGVfZmlsZT0vZGV2L251bGwKK2V4ZWNfcHJlZml4PU5PTkUKK25vX2NyZWF0ZT0KK25vX3JlY3Vyc2lvbj0KK3ByZWZpeD1OT05FCitwcm9ncmFtX3ByZWZpeD1OT05FCitwcm9ncmFtX3N1ZmZpeD1OT05FCitwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPXMseCx4LAorc2lsZW50PQorc2l0ZT0KK3NyY2Rpcj0KK3ZlcmJvc2U9Cit4X2luY2x1ZGVzPU5PTkUKK3hfbGlicmFyaWVzPU5PTkUKKworIyBJbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9wdGlvbnMuCisjIFRoZXNlIGFyZSBsZWZ0IHVuZXhwYW5kZWQgc28gdXNlcnMgY2FuICJtYWtlIGluc3RhbGwgZXhlY19wcmVmaXg9L2ZvbyIKKyMgYW5kIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGJhc2VkIG9uIGV4ZWNfcHJlZml4CisjIGJ5IGRlZmF1bHQgd2lsbCBhY3R1YWxseSBjaGFuZ2UuCisjIFVzZSBicmFjZXMgaW5zdGVhZCBvZiBwYXJlbnMgYmVjYXVzZSBzaCwgcGVybCwgZXRjLiBhbHNvIGFjY2VwdCB0aGVtLgorIyAoVGhlIGxpc3QgZm9sbG93cyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgR05VIENvZGluZyBTdGFuZGFyZHMuKQorYmluZGlyPScke2V4ZWNfcHJlZml4fS9iaW4nCitzYmluZGlyPScke2V4ZWNfcHJlZml4fS9zYmluJworbGliZXhlY2Rpcj0nJHtleGVjX3ByZWZpeH0vbGliZXhlYycKK2RhdGFyb290ZGlyPScke3ByZWZpeH0vc2hhcmUnCitkYXRhZGlyPScke2RhdGFyb290ZGlyfScKK3N5c2NvbmZkaXI9JyR7cHJlZml4fS9ldGMnCitzaGFyZWRzdGF0ZWRpcj0nJHtwcmVmaXh9L2NvbScKK2xvY2Fsc3RhdGVkaXI9JyR7cHJlZml4fS92YXInCitpbmNsdWRlZGlyPScke3ByZWZpeH0vaW5jbHVkZScKK29sZGluY2x1ZGVkaXI9Jy91c3IvaW5jbHVkZScKK2RvY2Rpcj0nJHtkYXRhcm9vdGRpcn0vZG9jLyR7UEFDS0FHRX0nCitpbmZvZGlyPScke2RhdGFyb290ZGlyfS9pbmZvJworaHRtbGRpcj0nJHtkb2NkaXJ9JworZHZpZGlyPScke2RvY2Rpcn0nCitwZGZkaXI9JyR7ZG9jZGlyfScKK3BzZGlyPScke2RvY2Rpcn0nCitsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKK2xvY2FsZWRpcj0nJHtkYXRhcm9vdGRpcn0vbG9jYWxlJworbWFuZGlyPScke2RhdGFyb290ZGlyfS9tYW4nCisKK2FjX3ByZXY9CithY19kYXNoZGFzaD0KK2ZvciBhY19vcHRpb24KK2RvCisgICMgSWYgdGhlIHByZXZpb3VzIG9wdGlvbiBuZWVkcyBhbiBhcmd1bWVudCwgYXNzaWduIGl0LgorICBpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgICBldmFsICRhY19wcmV2PVwkYWNfb3B0aW9uCisgICAgYWNfcHJldj0KKyAgICBjb250aW51ZQorICBmaQorCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAqPT8qKSBhY19vcHRhcmc9YGV4cHIgIlgkYWNfb3B0aW9uIiA6ICdbXj1dKj1cKC4qXCknYCA7OworICAqPSkgICBhY19vcHRhcmc9IDs7CisgICopICAgIGFjX29wdGFyZz15ZXMgOzsKKyAgZXNhYworCisgICMgQWNjZXB0IHRoZSBpbXBvcnRhbnQgQ3lnbnVzIGNvbmZpZ3VyZSBvcHRpb25zLCBzbyB3ZSBjYW4gZGlhZ25vc2UgdHlwb3MuCisKKyAgY2FzZSAkYWNfZGFzaGRhc2gkYWNfb3B0aW9uIGluCisgIC0tKQorICAgIGFjX2Rhc2hkYXNoPXllcyA7OworCisgIC1iaW5kaXIgfCAtLWJpbmRpciB8IC0tYmluZGkgfCAtLWJpbmQgfCAtLWJpbiB8IC0tYmkpCisgICAgYWNfcHJldj1iaW5kaXIgOzsKKyAgLWJpbmRpcj0qIHwgLS1iaW5kaXI9KiB8IC0tYmluZGk9KiB8IC0tYmluZD0qIHwgLS1iaW49KiB8IC0tYmk9KikKKyAgICBiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1idWlsZCB8IC0tYnVpbGQgfCAtLWJ1aWwgfCAtLWJ1aSB8IC0tYnUpCisgICAgYWNfcHJldj1idWlsZF9hbGlhcyA7OworICAtYnVpbGQ9KiB8IC0tYnVpbGQ9KiB8IC0tYnVpbD0qIHwgLS1idWk9KiB8IC0tYnU9KikKKyAgICBidWlsZF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbGUgfCAtLWNhY2hlLWZpbCB8IC0tY2FjaGUtZmkgXAorICB8IC0tY2FjaGUtZiB8IC0tY2FjaGUtIHwgLS1jYWNoZSB8IC0tY2FjaCB8IC0tY2FjIHwgLS1jYSB8IC0tYykKKyAgICBhY19wcmV2PWNhY2hlX2ZpbGUgOzsKKyAgLWNhY2hlLWZpbGU9KiB8IC0tY2FjaGUtZmlsZT0qIHwgLS1jYWNoZS1maWw9KiB8IC0tY2FjaGUtZmk9KiBcCisgIHwgLS1jYWNoZS1mPSogfCAtLWNhY2hlLT0qIHwgLS1jYWNoZT0qIHwgLS1jYWNoPSogfCAtLWNhYz0qIHwgLS1jYT0qIHwgLS1jPSopCisgICAgY2FjaGVfZmlsZT0kYWNfb3B0YXJnIDs7CisKKyAgLS1jb25maWctY2FjaGUgfCAtQykKKyAgICBjYWNoZV9maWxlPWNvbmZpZy5jYWNoZSA7OworCisgIC1kYXRhZGlyIHwgLS1kYXRhZGlyIHwgLS1kYXRhZGkgfCAtLWRhdGFkKQorICAgIGFjX3ByZXY9ZGF0YWRpciA7OworICAtZGF0YWRpcj0qIHwgLS1kYXRhZGlyPSogfCAtLWRhdGFkaT0qIHwgLS1kYXRhZD0qKQorICAgIGRhdGFkaXI9JGFjX29wdGFyZyA7OworCisgIC1kYXRhcm9vdGRpciB8IC0tZGF0YXJvb3RkaXIgfCAtLWRhdGFyb290ZGkgfCAtLWRhdGFyb290ZCB8IC0tZGF0YXJvb3QgXAorICB8IC0tZGF0YXJvbyB8IC0tZGF0YXJvIHwgLS1kYXRhcikKKyAgICBhY19wcmV2PWRhdGFyb290ZGlyIDs7CisgIC1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpcj0qIHwgLS1kYXRhcm9vdGRpPSogfCAtLWRhdGFyb290ZD0qIFwKKyAgfCAtLWRhdGFyb290PSogfCAtLWRhdGFyb289KiB8IC0tZGF0YXJvPSogfCAtLWRhdGFyPSopCisgICAgZGF0YXJvb3RkaXI9JGFjX29wdGFyZyA7OworCisgIC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qZGlzYWJsZS1cKC4qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1kaXNhYmxlLSRhY191c2Vyb3B0X29yaWciCisJIGFjX3VucmVjb2duaXplZF9zZXA9JywgJzs7CisgICAgZXNhYworICAgIGV2YWwgZW5hYmxlXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLWRvY2RpciB8IC0tZG9jZGlyIHwgLS1kb2NkaSB8IC0tZG9jIHwgLS1kbykKKyAgICBhY19wcmV2PWRvY2RpciA7OworICAtZG9jZGlyPSogfCAtLWRvY2Rpcj0qIHwgLS1kb2NkaT0qIHwgLS1kb2M9KiB8IC0tZG89KikKKyAgICBkb2NkaXI9JGFjX29wdGFyZyA7OworCisgIC1kdmlkaXIgfCAtLWR2aWRpciB8IC0tZHZpZGkgfCAtLWR2aWQgfCAtLWR2aSB8IC0tZHYpCisgICAgYWNfcHJldj1kdmlkaXIgOzsKKyAgLWR2aWRpcj0qIHwgLS1kdmlkaXI9KiB8IC0tZHZpZGk9KiB8IC0tZHZpZD0qIHwgLS1kdmk9KiB8IC0tZHY9KikKKyAgICBkdmlkaXI9JGFjX29wdGFyZyA7OworCisgIC1lbmFibGUtKiB8IC0tZW5hYmxlLSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKmVuYWJsZS1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgZmVhdHVyZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorImVuYWJsZV8kYWNfdXNlcm9wdCIKKyIqKSA7OworICAgICAgKikgYWNfdW5yZWNvZ25pemVkX29wdHM9IiRhY191bnJlY29nbml6ZWRfb3B0cyRhY191bnJlY29nbml6ZWRfc2VwLS1lbmFibGUtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCBlbmFibGVfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtZXhlYy1wcmVmaXggfCAtLWV4ZWNfcHJlZml4IHwgLS1leGVjLXByZWZpeCB8IC0tZXhlYy1wcmVmaSBcCisgIHwgLS1leGVjLXByZWYgfCAtLWV4ZWMtcHJlIHwgLS1leGVjLXByIHwgLS1leGVjLXAgfCAtLWV4ZWMtIFwKKyAgfCAtLWV4ZWMgfCAtLWV4ZSB8IC0tZXgpCisgICAgYWNfcHJldj1leGVjX3ByZWZpeCA7OworICAtZXhlYy1wcmVmaXg9KiB8IC0tZXhlY19wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaXg9KiB8IC0tZXhlYy1wcmVmaT0qIFwKKyAgfCAtLWV4ZWMtcHJlZj0qIHwgLS1leGVjLXByZT0qIHwgLS1leGVjLXByPSogfCAtLWV4ZWMtcD0qIHwgLS1leGVjLT0qIFwKKyAgfCAtLWV4ZWM9KiB8IC0tZXhlPSogfCAtLWV4PSopCisgICAgZXhlY19wcmVmaXg9JGFjX29wdGFyZyA7OworCisgIC1nYXMgfCAtLWdhcyB8IC0tZ2EgfCAtLWcpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aC1nYXMuCisgICAgd2l0aF9nYXM9eWVzIDs7CisKKyAgLWhlbHAgfCAtLWhlbHAgfCAtLWhlbCB8IC0taGUgfCAtaCkKKyAgICBhY19pbml0X2hlbHA9bG9uZyA7OworICAtaGVscD1yKiB8IC0taGVscD1yKiB8IC0taGVsPXIqIHwgLS1oZT1yKiB8IC1ociopCisgICAgYWNfaW5pdF9oZWxwPXJlY3Vyc2l2ZSA7OworICAtaGVscD1zKiB8IC0taGVscD1zKiB8IC0taGVsPXMqIHwgLS1oZT1zKiB8IC1ocyopCisgICAgYWNfaW5pdF9oZWxwPXNob3J0IDs7CisKKyAgLWhvc3QgfCAtLWhvc3QgfCAtLWhvcyB8IC0taG8pCisgICAgYWNfcHJldj1ob3N0X2FsaWFzIDs7CisgIC1ob3N0PSogfCAtLWhvc3Q9KiB8IC0taG9zPSogfCAtLWhvPSopCisgICAgaG9zdF9hbGlhcz0kYWNfb3B0YXJnIDs7CisKKyAgLWh0bWxkaXIgfCAtLWh0bWxkaXIgfCAtLWh0bWxkaSB8IC0taHRtbGQgfCAtLWh0bWwgfCAtLWh0bSB8IC0taHQpCisgICAgYWNfcHJldj1odG1sZGlyIDs7CisgIC1odG1sZGlyPSogfCAtLWh0bWxkaXI9KiB8IC0taHRtbGRpPSogfCAtLWh0bWxkPSogfCAtLWh0bWw9KiB8IC0taHRtPSogXAorICB8IC0taHQ9KikKKyAgICBodG1sZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5jbHVkZWRpciB8IC0taW5jbHVkZWRpciB8IC0taW5jbHVkZWRpIHwgLS1pbmNsdWRlZCB8IC0taW5jbHVkZSBcCisgIHwgLS1pbmNsdWQgfCAtLWluY2x1IHwgLS1pbmNsIHwgLS1pbmMpCisgICAgYWNfcHJldj1pbmNsdWRlZGlyIDs7CisgIC1pbmNsdWRlZGlyPSogfCAtLWluY2x1ZGVkaXI9KiB8IC0taW5jbHVkZWRpPSogfCAtLWluY2x1ZGVkPSogfCAtLWluY2x1ZGU9KiBcCisgIHwgLS1pbmNsdWQ9KiB8IC0taW5jbHU9KiB8IC0taW5jbD0qIHwgLS1pbmM9KikKKyAgICBpbmNsdWRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtaW5mb2RpciB8IC0taW5mb2RpciB8IC0taW5mb2RpIHwgLS1pbmZvZCB8IC0taW5mbyB8IC0taW5mKQorICAgIGFjX3ByZXY9aW5mb2RpciA7OworICAtaW5mb2Rpcj0qIHwgLS1pbmZvZGlyPSogfCAtLWluZm9kaT0qIHwgLS1pbmZvZD0qIHwgLS1pbmZvPSogfCAtLWluZj0qKQorICAgIGluZm9kaXI9JGFjX29wdGFyZyA7OworCisgIC1saWJkaXIgfCAtLWxpYmRpciB8IC0tbGliZGkgfCAtLWxpYmQpCisgICAgYWNfcHJldj1saWJkaXIgOzsKKyAgLWxpYmRpcj0qIHwgLS1saWJkaXI9KiB8IC0tbGliZGk9KiB8IC0tbGliZD0qKQorICAgIGxpYmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaXIgfCAtLWxpYmV4ZWNkaSB8IC0tbGliZXhlY2QgfCAtLWxpYmV4ZWMgXAorICB8IC0tbGliZXhlIHwgLS1saWJleCB8IC0tbGliZSkKKyAgICBhY19wcmV2PWxpYmV4ZWNkaXIgOzsKKyAgLWxpYmV4ZWNkaXI9KiB8IC0tbGliZXhlY2Rpcj0qIHwgLS1saWJleGVjZGk9KiB8IC0tbGliZXhlY2Q9KiB8IC0tbGliZXhlYz0qIFwKKyAgfCAtLWxpYmV4ZT0qIHwgLS1saWJleD0qIHwgLS1saWJlPSopCisgICAgbGliZXhlY2Rpcj0kYWNfb3B0YXJnIDs7CisKKyAgLWxvY2FsZWRpciB8IC0tbG9jYWxlZGlyIHwgLS1sb2NhbGVkaSB8IC0tbG9jYWxlZCB8IC0tbG9jYWxlKQorICAgIGFjX3ByZXY9bG9jYWxlZGlyIDs7CisgIC1sb2NhbGVkaXI9KiB8IC0tbG9jYWxlZGlyPSogfCAtLWxvY2FsZWRpPSogfCAtLWxvY2FsZWQ9KiB8IC0tbG9jYWxlPSopCisgICAgbG9jYWxlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpciB8IC0tbG9jYWxzdGF0ZWRpIHwgLS1sb2NhbHN0YXRlZCBcCisgIHwgLS1sb2NhbHN0YXRlIHwgLS1sb2NhbHN0YXQgfCAtLWxvY2Fsc3RhIHwgLS1sb2NhbHN0IHwgLS1sb2NhbHMpCisgICAgYWNfcHJldj1sb2NhbHN0YXRlZGlyIDs7CisgIC1sb2NhbHN0YXRlZGlyPSogfCAtLWxvY2Fsc3RhdGVkaXI9KiB8IC0tbG9jYWxzdGF0ZWRpPSogfCAtLWxvY2Fsc3RhdGVkPSogXAorICB8IC0tbG9jYWxzdGF0ZT0qIHwgLS1sb2NhbHN0YXQ9KiB8IC0tbG9jYWxzdGE9KiB8IC0tbG9jYWxzdD0qIHwgLS1sb2NhbHM9KikKKyAgICBsb2NhbHN0YXRlZGlyPSRhY19vcHRhcmcgOzsKKworICAtbWFuZGlyIHwgLS1tYW5kaXIgfCAtLW1hbmRpIHwgLS1tYW5kIHwgLS1tYW4gfCAtLW1hIHwgLS1tKQorICAgIGFjX3ByZXY9bWFuZGlyIDs7CisgIC1tYW5kaXI9KiB8IC0tbWFuZGlyPSogfCAtLW1hbmRpPSogfCAtLW1hbmQ9KiB8IC0tbWFuPSogfCAtLW1hPSogfCAtLW09KikKKyAgICBtYW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1uZnAgfCAtLW5mcCB8IC0tbmYpCisgICAgIyBPYnNvbGV0ZTsgdXNlIC0td2l0aG91dC1mcC4KKyAgICB3aXRoX2ZwPW5vIDs7CisKKyAgLW5vLWNyZWF0ZSB8IC0tbm8tY3JlYXRlIHwgLS1uby1jcmVhdCB8IC0tbm8tY3JlYSB8IC0tbm8tY3JlIFwKKyAgfCAtLW5vLWNyIHwgLS1uby1jIHwgLW4pCisgICAgbm9fY3JlYXRlPXllcyA7OworCisgIC1uby1yZWN1cnNpb24gfCAtLW5vLXJlY3Vyc2lvbiB8IC0tbm8tcmVjdXJzaW8gfCAtLW5vLXJlY3Vyc2kgXAorICB8IC0tbm8tcmVjdXJzIHwgLS1uby1yZWN1ciB8IC0tbm8tcmVjdSB8IC0tbm8tcmVjIHwgLS1uby1yZSB8IC0tbm8tcikKKyAgICBub19yZWN1cnNpb249eWVzIDs7CisKKyAgLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaXIgfCAtLW9sZGluY2x1ZGVkaSB8IC0tb2xkaW5jbHVkZWQgXAorICB8IC0tb2xkaW5jbHVkZSB8IC0tb2xkaW5jbHVkIHwgLS1vbGRpbmNsdSB8IC0tb2xkaW5jbCB8IC0tb2xkaW5jIFwKKyAgfCAtLW9sZGluIHwgLS1vbGRpIHwgLS1vbGQgfCAtLW9sIHwgLS1vKQorICAgIGFjX3ByZXY9b2xkaW5jbHVkZWRpciA7OworICAtb2xkaW5jbHVkZWRpcj0qIHwgLS1vbGRpbmNsdWRlZGlyPSogfCAtLW9sZGluY2x1ZGVkaT0qIHwgLS1vbGRpbmNsdWRlZD0qIFwKKyAgfCAtLW9sZGluY2x1ZGU9KiB8IC0tb2xkaW5jbHVkPSogfCAtLW9sZGluY2x1PSogfCAtLW9sZGluY2w9KiB8IC0tb2xkaW5jPSogXAorICB8IC0tb2xkaW49KiB8IC0tb2xkaT0qIHwgLS1vbGQ9KiB8IC0tb2w9KiB8IC0tbz0qKQorICAgIG9sZGluY2x1ZGVkaXI9JGFjX29wdGFyZyA7OworCisgIC1wcmVmaXggfCAtLXByZWZpeCB8IC0tcHJlZmkgfCAtLXByZWYgfCAtLXByZSB8IC0tcHIgfCAtLXApCisgICAgYWNfcHJldj1wcmVmaXggOzsKKyAgLXByZWZpeD0qIHwgLS1wcmVmaXg9KiB8IC0tcHJlZmk9KiB8IC0tcHJlZj0qIHwgLS1wcmU9KiB8IC0tcHI9KiB8IC0tcD0qKQorICAgIHByZWZpeD0kYWNfb3B0YXJnIDs7CisKKyAgLXByb2dyYW0tcHJlZml4IHwgLS1wcm9ncmFtLXByZWZpeCB8IC0tcHJvZ3JhbS1wcmVmaSB8IC0tcHJvZ3JhbS1wcmVmIFwKKyAgfCAtLXByb2dyYW0tcHJlIHwgLS1wcm9ncmFtLXByIHwgLS1wcm9ncmFtLXApCisgICAgYWNfcHJldj1wcm9ncmFtX3ByZWZpeCA7OworICAtcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaXg9KiB8IC0tcHJvZ3JhbS1wcmVmaT0qIFwKKyAgfCAtLXByb2dyYW0tcHJlZj0qIHwgLS1wcm9ncmFtLXByZT0qIHwgLS1wcm9ncmFtLXByPSogfCAtLXByb2dyYW0tcD0qKQorICAgIHByb2dyYW1fcHJlZml4PSRhY19vcHRhcmcgOzsKKworICAtcHJvZ3JhbS1zdWZmaXggfCAtLXByb2dyYW0tc3VmZml4IHwgLS1wcm9ncmFtLXN1ZmZpIHwgLS1wcm9ncmFtLXN1ZmYgXAorICB8IC0tcHJvZ3JhbS1zdWYgfCAtLXByb2dyYW0tc3UgfCAtLXByb2dyYW0tcykKKyAgICBhY19wcmV2PXByb2dyYW1fc3VmZml4IDs7CisgIC1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpeD0qIHwgLS1wcm9ncmFtLXN1ZmZpPSogXAorICB8IC0tcHJvZ3JhbS1zdWZmPSogfCAtLXByb2dyYW0tc3VmPSogfCAtLXByb2dyYW0tc3U9KiB8IC0tcHJvZ3JhbS1zPSopCisgICAgcHJvZ3JhbV9zdWZmaXg9JGFjX29wdGFyZyA7OworCisgIC1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hbSB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmEgXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbiB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmb3JtIHwgLS1wcm9ncmFtLXRyYW5zZm9yIFwKKyAgfCAtLXByb2dyYW0tdHJhbnNmbyB8IC0tcHJvZ3JhbS10cmFuc2YgXAorICB8IC0tcHJvZ3JhbS10cmFucyB8IC0tcHJvZ3JhbS10cmFuIFwKKyAgfCAtLXByb2dyLXRyYSB8IC0tcHJvZ3JhbS10ciB8IC0tcHJvZ3JhbS10KQorICAgIGFjX3ByZXY9cHJvZ3JhbV90cmFuc2Zvcm1fbmFtZSA7OworICAtcHJvZ3JhbS10cmFuc2Zvcm0tbmFtZT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS1uYW1lPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbmFtPSogfCAtLXByb2dyYW0tdHJhbnNmb3JtLW5hPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2Zvcm0tbj0qIHwgLS1wcm9ncmFtLXRyYW5zZm9ybS09KiBcCisgIHwgLS1wcm9ncmFtLXRyYW5zZm9ybT0qIHwgLS1wcm9ncmFtLXRyYW5zZm9yPSogXAorICB8IC0tcHJvZ3JhbS10cmFuc2ZvPSogfCAtLXByb2dyYW0tdHJhbnNmPSogXAorICB8IC0tcHJvZ3JhbS10cmFucz0qIHwgLS1wcm9ncmFtLXRyYW49KiBcCisgIHwgLS1wcm9nci10cmE9KiB8IC0tcHJvZ3JhbS10cj0qIHwgLS1wcm9ncmFtLXQ9KikKKyAgICBwcm9ncmFtX3RyYW5zZm9ybV9uYW1lPSRhY19vcHRhcmcgOzsKKworICAtcGRmZGlyIHwgLS1wZGZkaXIgfCAtLXBkZmRpIHwgLS1wZGZkIHwgLS1wZGYgfCAtLXBkKQorICAgIGFjX3ByZXY9cGRmZGlyIDs7CisgIC1wZGZkaXI9KiB8IC0tcGRmZGlyPSogfCAtLXBkZmRpPSogfCAtLXBkZmQ9KiB8IC0tcGRmPSogfCAtLXBkPSopCisgICAgcGRmZGlyPSRhY19vcHRhcmcgOzsKKworICAtcHNkaXIgfCAtLXBzZGlyIHwgLS1wc2RpIHwgLS1wc2QgfCAtLXBzKQorICAgIGFjX3ByZXY9cHNkaXIgOzsKKyAgLXBzZGlyPSogfCAtLXBzZGlyPSogfCAtLXBzZGk9KiB8IC0tcHNkPSogfCAtLXBzPSopCisgICAgcHNkaXI9JGFjX29wdGFyZyA7OworCisgIC1xIHwgLXF1aWV0IHwgLS1xdWlldCB8IC0tcXVpZSB8IC0tcXVpIHwgLS1xdSB8IC0tcSBcCisgIHwgLXNpbGVudCB8IC0tc2lsZW50IHwgLS1zaWxlbiB8IC0tc2lsZSB8IC0tc2lsKQorICAgIHNpbGVudD15ZXMgOzsKKworICAtc2JpbmRpciB8IC0tc2JpbmRpciB8IC0tc2JpbmRpIHwgLS1zYmluZCB8IC0tc2JpbiB8IC0tc2JpIHwgLS1zYikKKyAgICBhY19wcmV2PXNiaW5kaXIgOzsKKyAgLXNiaW5kaXI9KiB8IC0tc2JpbmRpcj0qIHwgLS1zYmluZGk9KiB8IC0tc2JpbmQ9KiB8IC0tc2Jpbj0qIFwKKyAgfCAtLXNiaT0qIHwgLS1zYj0qKQorICAgIHNiaW5kaXI9JGFjX29wdGFyZyA7OworCisgIC1zaGFyZWRzdGF0ZWRpciB8IC0tc2hhcmVkc3RhdGVkaXIgfCAtLXNoYXJlZHN0YXRlZGkgXAorICB8IC0tc2hhcmVkc3RhdGVkIHwgLS1zaGFyZWRzdGF0ZSB8IC0tc2hhcmVkc3RhdCB8IC0tc2hhcmVkc3RhIFwKKyAgfCAtLXNoYXJlZHN0IHwgLS1zaGFyZWRzIHwgLS1zaGFyZWQgfCAtLXNoYXJlIHwgLS1zaGFyIFwKKyAgfCAtLXNoYSB8IC0tc2gpCisgICAgYWNfcHJldj1zaGFyZWRzdGF0ZWRpciA7OworICAtc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaXI9KiB8IC0tc2hhcmVkc3RhdGVkaT0qIFwKKyAgfCAtLXNoYXJlZHN0YXRlZD0qIHwgLS1zaGFyZWRzdGF0ZT0qIHwgLS1zaGFyZWRzdGF0PSogfCAtLXNoYXJlZHN0YT0qIFwKKyAgfCAtLXNoYXJlZHN0PSogfCAtLXNoYXJlZHM9KiB8IC0tc2hhcmVkPSogfCAtLXNoYXJlPSogfCAtLXNoYXI9KiBcCisgIHwgLS1zaGE9KiB8IC0tc2g9KikKKyAgICBzaGFyZWRzdGF0ZWRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXNpdGUgfCAtLXNpdGUgfCAtLXNpdCkKKyAgICBhY19wcmV2PXNpdGUgOzsKKyAgLXNpdGU9KiB8IC0tc2l0ZT0qIHwgLS1zaXQ9KikKKyAgICBzaXRlPSRhY19vcHRhcmcgOzsKKworICAtc3JjZGlyIHwgLS1zcmNkaXIgfCAtLXNyY2RpIHwgLS1zcmNkIHwgLS1zcmMgfCAtLXNyKQorICAgIGFjX3ByZXY9c3JjZGlyIDs7CisgIC1zcmNkaXI9KiB8IC0tc3JjZGlyPSogfCAtLXNyY2RpPSogfCAtLXNyY2Q9KiB8IC0tc3JjPSogfCAtLXNyPSopCisgICAgc3JjZGlyPSRhY19vcHRhcmcgOzsKKworICAtc3lzY29uZmRpciB8IC0tc3lzY29uZmRpciB8IC0tc3lzY29uZmRpIHwgLS1zeXNjb25mZCB8IC0tc3lzY29uZiBcCisgIHwgLS1zeXNjb24gfCAtLXN5c2NvIHwgLS1zeXNjIHwgLS1zeXMgfCAtLXN5KQorICAgIGFjX3ByZXY9c3lzY29uZmRpciA7OworICAtc3lzY29uZmRpcj0qIHwgLS1zeXNjb25mZGlyPSogfCAtLXN5c2NvbmZkaT0qIHwgLS1zeXNjb25mZD0qIHwgLS1zeXNjb25mPSogXAorICB8IC0tc3lzY29uPSogfCAtLXN5c2NvPSogfCAtLXN5c2M9KiB8IC0tc3lzPSogfCAtLXN5PSopCisgICAgc3lzY29uZmRpcj0kYWNfb3B0YXJnIDs7CisKKyAgLXRhcmdldCB8IC0tdGFyZ2V0IHwgLS10YXJnZSB8IC0tdGFyZyB8IC0tdGFyIHwgLS10YSB8IC0tdCkKKyAgICBhY19wcmV2PXRhcmdldF9hbGlhcyA7OworICAtdGFyZ2V0PSogfCAtLXRhcmdldD0qIHwgLS10YXJnZT0qIHwgLS10YXJnPSogfCAtLXRhcj0qIHwgLS10YT0qIHwgLS10PSopCisgICAgdGFyZ2V0X2FsaWFzPSRhY19vcHRhcmcgOzsKKworICAtdiB8IC12ZXJib3NlIHwgLS12ZXJib3NlIHwgLS12ZXJib3MgfCAtLXZlcmJvIHwgLS12ZXJiKQorICAgIHZlcmJvc2U9eWVzIDs7CisKKyAgLXZlcnNpb24gfCAtLXZlcnNpb24gfCAtLXZlcnNpbyB8IC0tdmVyc2kgfCAtLXZlcnMgfCAtVikKKyAgICBhY19pbml0X3ZlcnNpb249OiA7OworCisgIC13aXRoLSogfCAtLXdpdGgtKikKKyAgICBhY191c2Vyb3B0PWBleHByICJ4JGFjX29wdGlvbiIgOiAneC0qd2l0aC1cKFtePV0qXCknYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBleHByICJ4JGFjX3VzZXJvcHQiIDogIi4qW14tKy5fJGFzX2NyX2FsbnVtXSIgPi9kZXYvbnVsbCAmJgorICAgICAgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgcGFja2FnZSBuYW1lOiAkYWNfdXNlcm9wdCIKKyAgICBhY191c2Vyb3B0X29yaWc9JGFjX3VzZXJvcHQKKyAgICBhY191c2Vyb3B0PWAkYXNfZWNobyAiJGFjX3VzZXJvcHQiIHwgc2VkICdzL1stKy5dL18vZydgCisgICAgY2FzZSAkYWNfdXNlcl9vcHRzIGluCisgICAgICAqIgorIndpdGhfJGFjX3VzZXJvcHQiCisiKikgOzsKKyAgICAgICopIGFjX3VucmVjb2duaXplZF9vcHRzPSIkYWNfdW5yZWNvZ25pemVkX29wdHMkYWNfdW5yZWNvZ25pemVkX3NlcC0td2l0aC0kYWNfdXNlcm9wdF9vcmlnIgorCSBhY191bnJlY29nbml6ZWRfc2VwPScsICc7OworICAgIGVzYWMKKyAgICBldmFsIHdpdGhfJGFjX3VzZXJvcHQ9XCRhY19vcHRhcmcgOzsKKworICAtd2l0aG91dC0qIHwgLS13aXRob3V0LSopCisgICAgYWNfdXNlcm9wdD1gZXhwciAieCRhY19vcHRpb24iIDogJ3gtKndpdGhvdXQtXCguKlwpJ2AKKyAgICAjIFJlamVjdCBuYW1lcyB0aGF0IGFyZSBub3QgdmFsaWQgc2hlbGwgdmFyaWFibGUgbmFtZXMuCisgICAgZXhwciAieCRhY191c2Vyb3B0IiA6ICIuKlteLSsuXyRhc19jcl9hbG51bV0iID4vZGV2L251bGwgJiYKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHBhY2thZ2UgbmFtZTogJGFjX3VzZXJvcHQiCisgICAgYWNfdXNlcm9wdF9vcmlnPSRhY191c2Vyb3B0CisgICAgYWNfdXNlcm9wdD1gJGFzX2VjaG8gIiRhY191c2Vyb3B0IiB8IHNlZCAncy9bLSsuXS9fL2cnYAorICAgIGNhc2UgJGFjX3VzZXJfb3B0cyBpbgorICAgICAgKiIKKyJ3aXRoXyRhY191c2Vyb3B0IgorIiopIDs7CisgICAgICAqKSBhY191bnJlY29nbml6ZWRfb3B0cz0iJGFjX3VucmVjb2duaXplZF9vcHRzJGFjX3VucmVjb2duaXplZF9zZXAtLXdpdGhvdXQtJGFjX3VzZXJvcHRfb3JpZyIKKwkgYWNfdW5yZWNvZ25pemVkX3NlcD0nLCAnOzsKKyAgICBlc2FjCisgICAgZXZhbCB3aXRoXyRhY191c2Vyb3B0PW5vIDs7CisKKyAgLS14KQorICAgICMgT2Jzb2xldGU7IHVzZSAtLXdpdGgteC4KKyAgICB3aXRoX3g9eWVzIDs7CisKKyAgLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZXMgfCAtLXgtaW5jbHVkZSB8IC0teC1pbmNsdWQgfCAtLXgtaW5jbHUgXAorICB8IC0teC1pbmNsIHwgLS14LWluYyB8IC0teC1pbiB8IC0teC1pKQorICAgIGFjX3ByZXY9eF9pbmNsdWRlcyA7OworICAteC1pbmNsdWRlcz0qIHwgLS14LWluY2x1ZGVzPSogfCAtLXgtaW5jbHVkZT0qIHwgLS14LWluY2x1ZD0qIHwgLS14LWluY2x1PSogXAorICB8IC0teC1pbmNsPSogfCAtLXgtaW5jPSogfCAtLXgtaW49KiB8IC0teC1pPSopCisgICAgeF9pbmNsdWRlcz0kYWNfb3B0YXJnIDs7CisKKyAgLXgtbGlicmFyaWVzIHwgLS14LWxpYnJhcmllcyB8IC0teC1saWJyYXJpZSB8IC0teC1saWJyYXJpIFwKKyAgfCAtLXgtbGlicmFyIHwgLS14LWxpYnJhIHwgLS14LWxpYnIgfCAtLXgtbGliIHwgLS14LWxpIHwgLS14LWwpCisgICAgYWNfcHJldj14X2xpYnJhcmllcyA7OworICAteC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZXM9KiB8IC0teC1saWJyYXJpZT0qIHwgLS14LWxpYnJhcmk9KiBcCisgIHwgLS14LWxpYnJhcj0qIHwgLS14LWxpYnJhPSogfCAtLXgtbGlicj0qIHwgLS14LWxpYj0qIHwgLS14LWxpPSogfCAtLXgtbD0qKQorICAgIHhfbGlicmFyaWVzPSRhY19vcHRhcmcgOzsKKworICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJGFjX29wdGlvbicKK1RyeSBcYCQwIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb24iCisgICAgOzsKKworICAqPSopCisgICAgYWNfZW52dmFyPWBleHByICJ4JGFjX29wdGlvbiIgOiAneFwoW149XSpcKT0nYAorICAgICMgUmVqZWN0IG5hbWVzIHRoYXQgYXJlIG5vdCB2YWxpZCBzaGVsbCB2YXJpYWJsZSBuYW1lcy4KKyAgICBjYXNlICRhY19lbnZ2YXIgaW4gIygKKyAgICAgICcnIHwgWzAtOV0qIHwgKlshXyRhc19jcl9hbG51bV0qICkKKyAgICAgIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhcmlhYmxlIG5hbWU6IFxgJGFjX2VudnZhciciIDs7CisgICAgZXNhYworICAgIGV2YWwgJGFjX2VudnZhcj1cJGFjX29wdGFyZworICAgIGV4cG9ydCAkYWNfZW52dmFyIDs7CisKKyAgKikKKyAgICAjIEZJWE1FOiBzaG91bGQgYmUgcmVtb3ZlZCBpbiBhdXRvY29uZiAzLjAuCisgICAgJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogeW91IHNob3VsZCB1c2UgLS1idWlsZCwgLS1ob3N0LCAtLXRhcmdldCIgPiYyCisgICAgZXhwciAieCRhY19vcHRpb24iIDogIi4qW14tLl8kYXNfY3JfYWxudW1dIiA+L2Rldi9udWxsICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpbnZhbGlkIGhvc3QgdHlwZTogJGFjX29wdGlvbiIgPiYyCisgICAgOiAke2J1aWxkX2FsaWFzPSRhY19vcHRpb259ICR7aG9zdF9hbGlhcz0kYWNfb3B0aW9ufSAke3RhcmdldF9hbGlhcz0kYWNfb3B0aW9ufQorICAgIDs7CisKKyAgZXNhYworZG9uZQorCitpZiB0ZXN0IC1uICIkYWNfcHJldiI7IHRoZW4KKyAgYWNfb3B0aW9uPS0tYGVjaG8gJGFjX3ByZXYgfCBzZWQgJ3MvXy8tL2cnYAorICBhc19mbl9lcnJvciAkPyAibWlzc2luZyBhcmd1bWVudCB0byAkYWNfb3B0aW9uIgorZmkKKworaWYgdGVzdCAtbiAiJGFjX3VucmVjb2duaXplZF9vcHRzIjsgdGhlbgorICBjYXNlICRlbmFibGVfb3B0aW9uX2NoZWNraW5nIGluCisgICAgbm8pIDs7CisgICAgZmF0YWwpIGFzX2ZuX2Vycm9yICQ/ICJ1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA7OworICAgICopICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1bnJlY29nbml6ZWQgb3B0aW9uczogJGFjX3VucmVjb2duaXplZF9vcHRzIiA+JjIgOzsKKyAgZXNhYworZmkKKworIyBDaGVjayBhbGwgZGlyZWN0b3J5IGFyZ3VtZW50cyBmb3IgY29uc2lzdGVuY3kuCitmb3IgYWNfdmFyIGluCWV4ZWNfcHJlZml4IHByZWZpeCBiaW5kaXIgc2JpbmRpciBsaWJleGVjZGlyIGRhdGFyb290ZGlyIFwKKwkJZGF0YWRpciBzeXNjb25mZGlyIHNoYXJlZHN0YXRlZGlyIGxvY2Fsc3RhdGVkaXIgaW5jbHVkZWRpciBcCisJCW9sZGluY2x1ZGVkaXIgZG9jZGlyIGluZm9kaXIgaHRtbGRpciBkdmlkaXIgcGRmZGlyIHBzZGlyIFwKKwkJbGliZGlyIGxvY2FsZWRpciBtYW5kaXIKK2RvCisgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAjIFJlbW92ZSB0cmFpbGluZyBzbGFzaGVzLgorICBjYXNlICRhY192YWwgaW4KKyAgICAqLyApCisgICAgICBhY192YWw9YGV4cHIgIlgkYWNfdmFsIiA6ICdYXCguKlteL11cKScgXHwgIlgkYWNfdmFsIiA6ICdYXCguKlwpJ2AKKyAgICAgIGV2YWwgJGFjX3Zhcj1cJGFjX3ZhbDs7CisgIGVzYWMKKyAgIyBCZSBzdXJlIHRvIGhhdmUgYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWVzLgorICBjYXNlICRhY192YWwgaW4KKyAgICBbXFwvJF0qIHwgPzpbXFwvXSogKSAgY29udGludWU7OworICAgIE5PTkUgfCAnJyApIGNhc2UgJGFjX3ZhciBpbiAqcHJlZml4ICkgY29udGludWU7OyBlc2FjOzsKKyAgZXNhYworICBhc19mbl9lcnJvciAkPyAiZXhwZWN0ZWQgYW4gYWJzb2x1dGUgZGlyZWN0b3J5IG5hbWUgZm9yIC0tJGFjX3ZhcjogJGFjX3ZhbCIKK2RvbmUKKworIyBUaGVyZSBtaWdodCBiZSBwZW9wbGUgd2hvIGRlcGVuZCBvbiB0aGUgb2xkIGJyb2tlbiBiZWhhdmlvcjogYCRob3N0JworIyB1c2VkIHRvIGhvbGQgdGhlIGFyZ3VtZW50IG9mIC0taG9zdCBldGMuCisjIEZJWE1FOiBUbyByZW1vdmUgc29tZSBkYXkuCitidWlsZD0kYnVpbGRfYWxpYXMKK2hvc3Q9JGhvc3RfYWxpYXMKK3RhcmdldD0kdGFyZ2V0X2FsaWFzCisKKyMgRklYTUU6IFRvIHJlbW92ZSBzb21lIGRheS4KK2lmIHRlc3QgIngkaG9zdF9hbGlhcyIgIT0geDsgdGhlbgorICBpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiA9IHg7IHRoZW4KKyAgICBjcm9zc19jb21waWxpbmc9bWF5YmUKKyAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBpZiB5b3Ugd2FudGVkIHRvIHNldCB0aGUgLS1idWlsZCB0eXBlLCBkb24ndCB1c2UgLS1ob3N0LgorICAgIElmIGEgY3Jvc3MgY29tcGlsZXIgaXMgZGV0ZWN0ZWQgdGhlbiBjcm9zcyBjb21waWxlIG1vZGUgd2lsbCBiZSB1c2VkIiA+JjIKKyAgZWxpZiB0ZXN0ICJ4JGJ1aWxkX2FsaWFzIiAhPSAieCRob3N0X2FsaWFzIjsgdGhlbgorICAgIGNyb3NzX2NvbXBpbGluZz15ZXMKKyAgZmkKK2ZpCisKK2FjX3Rvb2xfcHJlZml4PQordGVzdCAtbiAiJGhvc3RfYWxpYXMiICYmIGFjX3Rvb2xfcHJlZml4PSRob3N0X2FsaWFzLQorCit0ZXN0ICIkc2lsZW50IiA9IHllcyAmJiBleGVjIDY+L2Rldi9udWxsCisKKworYWNfcHdkPWBwd2RgICYmIHRlc3QgLW4gIiRhY19wd2QiICYmCithY19sc19kaT1gbHMgLWRpIC5gICYmCithY19wd2RfbHNfZGk9YGNkICIkYWNfcHdkIiAmJiBscyAtZGkgLmAgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIndvcmtpbmcgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZXRlcm1pbmVkIgordGVzdCAiWCRhY19sc19kaSIgPSAiWCRhY19wd2RfbHNfZGkiIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJwd2QgZG9lcyBub3QgcmVwb3J0IG5hbWUgb2Ygd29ya2luZyBkaXJlY3RvcnkiCisKKworIyBGaW5kIHRoZSBzb3VyY2UgZmlsZXMsIGlmIGxvY2F0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLgoraWYgdGVzdCAteiAiJHNyY2RpciI7IHRoZW4KKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD15ZXMKKyAgIyBUcnkgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoaXMgc2NyaXB0LCB0aGVuIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorICBhY19jb25mZGlyPWAkYXNfZGlybmFtZSAtLSAiJGFzX215c2VsZiIgfHwKKyRhc19leHByIFgiJGFzX215c2VsZiIgOiAnWFwoLipbXi9dXCkvLypbXi9dW14vXSovKiQnIFx8IFwKKwkgWCIkYXNfbXlzZWxmIiA6ICdYXCgvL1wpW14vXScgXHwgXAorCSBYIiRhc19teXNlbGYiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFzX215c2VsZiIgOiAnWFwoL1wpJyBcfCAuIDI+L2Rldi9udWxsIHx8CiskYXNfZWNobyBYIiRhc19teXNlbGYiIHwKKyAgICBzZWQgJy9eWFwoLipbXi9dXClcL1wvKlteL11bXi9dKlwvKiQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXClbXi9dLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwoXC9cKS4qL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIHMvLiovLi87IHEnYAorICBzcmNkaXI9JGFjX2NvbmZkaXIKKyAgaWYgdGVzdCAhIC1yICIkc3JjZGlyLyRhY191bmlxdWVfZmlsZSI7IHRoZW4KKyAgICBzcmNkaXI9Li4KKyAgZmkKK2Vsc2UKKyAgYWNfc3JjZGlyX2RlZmF1bHRlZD1ubworZmkKK2lmIHRlc3QgISAtciAiJHNyY2Rpci8kYWNfdW5pcXVlX2ZpbGUiOyB0aGVuCisgIHRlc3QgIiRhY19zcmNkaXJfZGVmYXVsdGVkIiA9IHllcyAmJiBzcmNkaXI9IiRhY19jb25mZGlyIG9yIC4uIgorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IGZpbmQgc291cmNlcyAoJGFjX3VuaXF1ZV9maWxlKSBpbiAkc3JjZGlyIgorZmkKK2FjX21zZz0ic291cmNlcyBhcmUgaW4gJHNyY2RpciwgYnV0IFxgY2QgJHNyY2RpcicgZG9lcyBub3Qgd29yayIKK2FjX2Fic19jb25mZGlyPWAoCisJY2QgIiRzcmNkaXIiICYmIHRlc3QgLXIgIi4vJGFjX3VuaXF1ZV9maWxlIiB8fCBhc19mbl9lcnJvciAkPyAiJGFjX21zZyIKKwlwd2QpYAorIyBXaGVuIGJ1aWxkaW5nIGluIHBsYWNlLCBzZXQgc3JjZGlyPS4KK2lmIHRlc3QgIiRhY19hYnNfY29uZmRpciIgPSAiJGFjX3B3ZCI7IHRoZW4KKyAgc3JjZGlyPS4KK2ZpCisjIFJlbW92ZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBzbGFzaGVzIGZyb20gc3JjZGlyLgorIyBEb3VibGUgc2xhc2hlcyBpbiBmaWxlIG5hbWVzIGluIG9iamVjdCBmaWxlIGRlYnVnZ2luZyBpbmZvCisjIG1lc3MgdXAgTS14IGdkYiBpbiBFbWFjcy4KK2Nhc2UgJHNyY2RpciBpbgorKi8pIHNyY2Rpcj1gZXhwciAiWCRzcmNkaXIiIDogJ1hcKC4qW14vXVwpJyBcfCAiWCRzcmNkaXIiIDogJ1hcKC4qXCknYDs7Citlc2FjCitmb3IgYWNfdmFyIGluICRhY19wcmVjaW91c192YXJzOyBkbworICBldmFsIGFjX2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorICBldmFsIGFjX2N2X2Vudl8ke2FjX3Zhcn1fc2V0PVwkeyR7YWNfdmFyfStzZXR9CisgIGV2YWwgYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZT1cJCR7YWNfdmFyfQorZG9uZQorCisjCisjIFJlcG9ydCB0aGUgLS1oZWxwIG1lc3NhZ2UuCisjCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJsb25nIjsgdGhlbgorICAjIE9taXQgc29tZSBpbnRlcm5hbCBvciBvYnNvbGV0ZSBvcHRpb25zIHRvIG1ha2UgdGhlIGxpc3QgbGVzcyBpbXBvc2luZy4KKyAgIyBUaGlzIG1lc3NhZ2UgaXMgdG9vIGxvbmcgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIEEvVVggMy4xIHNoLgorICBjYXQgPDxfQUNFT0YKK1xgY29uZmlndXJlJyBjb25maWd1cmVzIHRoaXMgcGFja2FnZSB0byBhZGFwdCB0byBtYW55IGtpbmRzIG9mIHN5c3RlbXMuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVkFSPVZBTFVFXS4uLgorCitUbyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIChlLmcuLCBDQywgQ0ZMQUdTLi4uKSwgc3BlY2lmeSB0aGVtIGFzCitWQVI9VkFMVUUuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBvZiBzb21lIG9mIHRoZSB1c2VmdWwgdmFyaWFibGVzLgorCitEZWZhdWx0cyBmb3IgdGhlIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBpbiBicmFja2V0cy4KKworQ29uZmlndXJhdGlvbjoKKyAgLWgsIC0taGVscCAgICAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXQKKyAgICAgIC0taGVscD1zaG9ydCAgICAgICAgZGlzcGxheSBvcHRpb25zIHNwZWNpZmljIHRvIHRoaXMgcGFja2FnZQorICAgICAgLS1oZWxwPXJlY3Vyc2l2ZSAgICBkaXNwbGF5IHRoZSBzaG9ydCBoZWxwIG9mIGFsbCB0aGUgaW5jbHVkZWQgcGFja2FnZXMKKyAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudCAgIGRvIG5vdCBwcmludCBcYGNoZWNraW5nIC4uLicgbWVzc2FnZXMKKyAgICAgIC0tY2FjaGUtZmlsZT1GSUxFICAgY2FjaGUgdGVzdCByZXN1bHRzIGluIEZJTEUgW2Rpc2FibGVkXQorICAtQywgLS1jb25maWctY2FjaGUgICAgICBhbGlhcyBmb3IgXGAtLWNhY2hlLWZpbGU9Y29uZmlnLmNhY2hlJworICAtbiwgLS1uby1jcmVhdGUgICAgICAgICBkbyBub3QgY3JlYXRlIG91dHB1dCBmaWxlcworICAgICAgLS1zcmNkaXI9RElSICAgICAgICBmaW5kIHRoZSBzb3VyY2VzIGluIERJUiBbY29uZmlndXJlIGRpciBvciBcYC4uJ10KKworSW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLXByZWZpeD1QUkVGSVggICAgICAgICBpbnN0YWxsIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcyBpbiBQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyRhY19kZWZhdWx0X3ByZWZpeF0KKyAgLS1leGVjLXByZWZpeD1FUFJFRklYICAgaW5zdGFsbCBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzIGluIEVQUkVGSVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW1BSRUZJWF0KKworQnkgZGVmYXVsdCwgXGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCBhbGwgdGhlIGZpbGVzIGluCitcYCRhY19kZWZhdWx0X3ByZWZpeC9iaW4nLCBcYCRhY19kZWZhdWx0X3ByZWZpeC9saWInIGV0Yy4gIFlvdSBjYW4gc3BlY2lmeQorYW4gaW5zdGFsbGF0aW9uIHByZWZpeCBvdGhlciB0aGFuIFxgJGFjX2RlZmF1bHRfcHJlZml4JyB1c2luZyBcYC0tcHJlZml4JywKK2ZvciBpbnN0YW5jZSBcYC0tcHJlZml4PVwkSE9NRScuCisKK0ZvciBiZXR0ZXIgY29udHJvbCwgdXNlIHRoZSBvcHRpb25zIGJlbG93LgorCitGaW5lIHR1bmluZyBvZiB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOgorICAtLWJpbmRpcj1ESVIgICAgICAgICAgICB1c2VyIGV4ZWN1dGFibGVzIFtFUFJFRklYL2Jpbl0KKyAgLS1zYmluZGlyPURJUiAgICAgICAgICAgc3lzdGVtIGFkbWluIGV4ZWN1dGFibGVzIFtFUFJFRklYL3NiaW5dCisgIC0tbGliZXhlY2Rpcj1ESVIgICAgICAgIHByb2dyYW0gZXhlY3V0YWJsZXMgW0VQUkVGSVgvbGliZXhlY10KKyAgLS1zeXNjb25mZGlyPURJUiAgICAgICAgcmVhZC1vbmx5IHNpbmdsZS1tYWNoaW5lIGRhdGEgW1BSRUZJWC9ldGNdCisgIC0tc2hhcmVkc3RhdGVkaXI9RElSICAgIG1vZGlmaWFibGUgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGRhdGEgW1BSRUZJWC9jb21dCisgIC0tbG9jYWxzdGF0ZWRpcj1ESVIgICAgIG1vZGlmaWFibGUgc2luZ2xlLW1hY2hpbmUgZGF0YSBbUFJFRklYL3Zhcl0KKyAgLS1saWJkaXI9RElSICAgICAgICAgICAgb2JqZWN0IGNvZGUgbGlicmFyaWVzIFtFUFJFRklYL2xpYl0KKyAgLS1pbmNsdWRlZGlyPURJUiAgICAgICAgQyBoZWFkZXIgZmlsZXMgW1BSRUZJWC9pbmNsdWRlXQorICAtLW9sZGluY2x1ZGVkaXI9RElSICAgICBDIGhlYWRlciBmaWxlcyBmb3Igbm9uLWdjYyBbL3Vzci9pbmNsdWRlXQorICAtLWRhdGFyb290ZGlyPURJUiAgICAgICByZWFkLW9ubHkgYXJjaC4taW5kZXBlbmRlbnQgZGF0YSByb290IFtQUkVGSVgvc2hhcmVdCisgIC0tZGF0YWRpcj1ESVIgICAgICAgICAgIHJlYWQtb25seSBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZGF0YSBbREFUQVJPT1RESVJdCisgIC0taW5mb2Rpcj1ESVIgICAgICAgICAgIGluZm8gZG9jdW1lbnRhdGlvbiBbREFUQVJPT1RESVIvaW5mb10KKyAgLS1sb2NhbGVkaXI9RElSICAgICAgICAgbG9jYWxlLWRlcGVuZGVudCBkYXRhIFtEQVRBUk9PVERJUi9sb2NhbGVdCisgIC0tbWFuZGlyPURJUiAgICAgICAgICAgIG1hbiBkb2N1bWVudGF0aW9uIFtEQVRBUk9PVERJUi9tYW5dCisgIC0tZG9jZGlyPURJUiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gcm9vdCBbREFUQVJPT1RESVIvZG9jL1BBQ0tBR0VdCisgIC0taHRtbGRpcj1ESVIgICAgICAgICAgIGh0bWwgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLWR2aWRpcj1ESVIgICAgICAgICAgICBkdmkgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBkZmRpcj1ESVIgICAgICAgICAgICBwZGYgZG9jdW1lbnRhdGlvbiBbRE9DRElSXQorICAtLXBzZGlyPURJUiAgICAgICAgICAgICBwcyBkb2N1bWVudGF0aW9uIFtET0NESVJdCitfQUNFT0YKKworICBjYXQgPDxcX0FDRU9GCisKK1N5c3RlbSB0eXBlczoKKyAgLS1idWlsZD1CVUlMRCAgICAgY29uZmlndXJlIGZvciBidWlsZGluZyBvbiBCVUlMRCBbZ3Vlc3NlZF0KKyAgLS1ob3N0PUhPU1QgICAgICAgY3Jvc3MtY29tcGlsZSB0byBidWlsZCBwcm9ncmFtcyB0byBydW4gb24gSE9TVCBbQlVJTERdCisgIC0tdGFyZ2V0PVRBUkdFVCAgIGNvbmZpZ3VyZSBmb3IgYnVpbGRpbmcgY29tcGlsZXJzIGZvciBUQVJHRVQgW0hPU1RdCitfQUNFT0YKK2ZpCisKK2lmIHRlc3QgLW4gIiRhY19pbml0X2hlbHAiOyB0aGVuCisKKyAgY2F0IDw8XF9BQ0VPRgorCitPcHRpb25hbCBGZWF0dXJlczoKKyAgLS1kaXNhYmxlLW9wdGlvbi1jaGVja2luZyAgaWdub3JlIHVucmVjb2duaXplZCAtLWVuYWJsZS8tLXdpdGggb3B0aW9ucworICAtLWRpc2FibGUtRkVBVFVSRSAgICAgICBkbyBub3QgaW5jbHVkZSBGRUFUVVJFIChzYW1lIGFzIC0tZW5hYmxlLUZFQVRVUkU9bm8pCisgIC0tZW5hYmxlLUZFQVRVUkVbPUFSR10gIGluY2x1ZGUgRkVBVFVSRSBbQVJHPXllc10KKyAgLS1kaXNhYmxlLWxhcmdlZmlsZSAgICAgb21pdCBzdXBwb3J0IGZvciBsYXJnZSBmaWxlcworICAtLWRpc2FibGUtcHJvdG9jaGFpbiAgICBkaXNhYmxlIFwicHJvdG9jaGFpblwiIGluc24KKyAgLS1lbmFibGUtaXB2NiAgICAgICAgICAgYnVpbGQgSVB2Ni1jYXBhYmxlIHZlcnNpb24gW2RlZmF1bHQ9eWVzLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhZGRyaW5mbyBhdmFpbGFibGVdCisgIC0tZW5hYmxlLW9wdGltaXplci1kYmcgIGJ1aWxkIG9wdGltaXplciBkZWJ1Z2dpbmcgY29kZQorICAtLWVuYWJsZS15eWRlYnVnICAgICAgICBidWlsZCBwYXJzZXIgZGVidWdnaW5nIGNvZGUKKyAgLS1kaXNhYmxlLXVuaXZlcnNhbCAgICAgZG9uJ3QgYnVpbGQgdW5pdmVyc2FsIG9uIE9TIFgKKyAgLS1lbmFibGUtYmx1ZXRvb3RoICAgICAgZW5hYmxlIEJsdWV0b290aCBzdXBwb3J0IFtkZWZhdWx0PXllcywgaWYgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVdCisgIC0tZW5hYmxlLWNhbnVzYiAgICAgICAgIGVuYWJsZSBjYW51c2Igc3VwcG9ydCBbZGVmYXVsdD15ZXMsIGlmIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlXQorCisgIC0tZW5hYmxlLWNhbiAgICAgICAgICAgIGVuYWJsZSBDQU4gc3VwcG9ydCBbZGVmYXVsdD15ZXMsIGlmIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlXQorCitPcHRpb25hbCBQYWNrYWdlczoKKyAgLS13aXRoLVBBQ0tBR0VbPUFSR10gICAgdXNlIFBBQ0tBR0UgW0FSRz15ZXNdCisgIC0td2l0aG91dC1QQUNLQUdFICAgICAgIGRvIG5vdCB1c2UgUEFDS0FHRSAoc2FtZSBhcyAtLXdpdGgtUEFDS0FHRT1ubykKKyAgLS13aXRob3V0LWdjYyAgICAgICAgICAgZG9uJ3QgdXNlIGdjYworICAtLXdpdGgtc2l0YSAgICAgICAgICAgICBpbmNsdWRlIFNJVEEgc3VwcG9ydAorICAtLXdpdGgtcGNhcD1UWVBFICAgICAgICB1c2UgcGFja2V0IGNhcHR1cmUgVFlQRQorICAtLXdpdGhvdXQtbGlibmwgICAgICAgICBkaXNhYmxlIGxpYm5sIHN1cHBvcnQgW2RlZmF1bHQ9eWVzLCBvbiBMaW51eCwgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudF0KKyAgLS13aXRoLWRhZ1s9RElSXSAgICAgICAgaW5jbHVkZSBFbmRhY2UgREFHIHN1cHBvcnQgWyJ5ZXMiLCAibm8iIG9yIERJUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0ieWVzIiBvbiBCU0QgYW5kIExpbnV4IGlmIHByZXNlbnRdCisgIC0td2l0aC1kYWctaW5jbHVkZXM9RElSIEVuZGFjZSBEQUcgaW5jbHVkZSBkaXJlY3RvcnkKKyAgLS13aXRoLWRhZy1saWJyYXJpZXM9RElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZGFjZSBEQUcgbGlicmFyeSBkaXJlY3RvcnkKKyAgLS13aXRoLXNlcHRlbFs9RElSXSAgICAgaW5jbHVkZSBTZXB0ZWwgc3VwcG9ydCAobG9jYXRlZCBpbiBkaXJlY3RvcnkgRElSLCBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCkuIFtkZWZhdWx0PXllcywgb24gTGludXgsIGlmIHByZXNlbnRdCisgIC0td2l0aC1zbmZbPURJUl0gICAgICAgIGluY2x1ZGUgTXlyaWNvbSBTTkYgc3VwcG9ydCBbInllcyIsICJubyIgb3IgRElSOworICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ5ZXMiIG9uIEJTRCBhbmQgTGludXggaWYgcHJlc2VudF0KKyAgLS13aXRoLXNuZi1pbmNsdWRlcz1ESVIgTXlyaWNvbSBTTkYgaW5jbHVkZSBkaXJlY3RvcnkKKyAgLS13aXRoLXNuZi1saWJyYXJpZXM9RElSCisgICAgICAgICAgICAgICAgICAgICAgICAgIE15cmljb20gU05GIGxpYnJhcnkgZGlyZWN0b3J5CisgIC0td2l0aG91dC1mbGV4ICAgICAgICAgIGRvbid0IHVzZSBmbGV4CisgIC0td2l0aG91dC1iaXNvbiAgICAgICAgIGRvbid0IHVzZSBiaXNvbgorCitTb21lIGluZmx1ZW50aWFsIGVudmlyb25tZW50IHZhcmlhYmxlczoKKyAgQ0MgICAgICAgICAgQyBjb21waWxlciBjb21tYW5kCisgIENGTEFHUyAgICAgIEMgY29tcGlsZXIgZmxhZ3MKKyAgTERGTEFHUyAgICAgbGlua2VyIGZsYWdzLCBlLmcuIC1MPGxpYiBkaXI+IGlmIHlvdSBoYXZlIGxpYnJhcmllcyBpbiBhCisgICAgICAgICAgICAgIG5vbnN0YW5kYXJkIGRpcmVjdG9yeSA8bGliIGRpcj4KKyAgTElCUyAgICAgICAgbGlicmFyaWVzIHRvIHBhc3MgdG8gdGhlIGxpbmtlciwgZS5nLiAtbDxsaWJyYXJ5PgorICBDUFBGTEFHUyAgICAoT2JqZWN0aXZlKSBDL0MrKyBwcmVwcm9jZXNzb3IgZmxhZ3MsIGUuZy4gLUk8aW5jbHVkZSBkaXI+IGlmCisgICAgICAgICAgICAgIHlvdSBoYXZlIGhlYWRlcnMgaW4gYSBub25zdGFuZGFyZCBkaXJlY3RvcnkgPGluY2x1ZGUgZGlyPgorICBDUFAgICAgICAgICBDIHByZXByb2Nlc3NvcgorCitVc2UgdGhlc2UgdmFyaWFibGVzIHRvIG92ZXJyaWRlIHRoZSBjaG9pY2VzIG1hZGUgYnkgYGNvbmZpZ3VyZScgb3IgdG8gaGVscAoraXQgdG8gZmluZCBsaWJyYXJpZXMgYW5kIHByb2dyYW1zIHdpdGggbm9uc3RhbmRhcmQgbmFtZXMvbG9jYXRpb25zLgorCitSZXBvcnQgYnVncyB0byB0aGUgcGFja2FnZSBwcm92aWRlci4KK19BQ0VPRgorYWNfc3RhdHVzPSQ/CitmaQorCitpZiB0ZXN0ICIkYWNfaW5pdF9oZWxwIiA9ICJyZWN1cnNpdmUiOyB0aGVuCisgICMgSWYgdGhlcmUgYXJlIHN1YmRpcnMsIHJlcG9ydCB0aGVpciBzcGVjaWZpYyAtLWhlbHAuCisgIGZvciBhY19kaXIgaW4gOiAkYWNfc3ViZGlyc19hbGw7IGRvIHRlc3QgIngkYWNfZGlyIiA9IHg6ICYmIGNvbnRpbnVlCisgICAgdGVzdCAtZCAiJGFjX2RpciIgfHwKKyAgICAgIHsgY2QgIiRzcmNkaXIiICYmIGFjX3B3ZD1gcHdkYCAmJiBzcmNkaXI9LiAmJiB0ZXN0IC1kICIkYWNfZGlyIjsgfSB8fAorICAgICAgY29udGludWUKKyAgICBhY19idWlsZGRpcj0uCisKK2Nhc2UgIiRhY19kaXIiIGluCisuKSBhY19kaXJfc3VmZml4PSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyopCisgIGFjX2Rpcl9zdWZmaXg9L2AkYXNfZWNobyAiJGFjX2RpciIgfCBzZWQgJ3N8XlwuW1xcL118fCdgCisgICMgQSAiLi4iIGZvciBlYWNoIGRpcmVjdG9yeSBpbiAkYWNfZGlyX3N1ZmZpeC4KKyAgYWNfdG9wX2J1aWxkZGlyX3N1Yj1gJGFzX2VjaG8gIiRhY19kaXJfc3VmZml4IiB8IHNlZCAnc3wvW15cXC9dKnwvLi58ZztzfC98fCdgCisgIGNhc2UgJGFjX3RvcF9idWlsZGRpcl9zdWIgaW4KKyAgIiIpIGFjX3RvcF9idWlsZGRpcl9zdWI9LiBhY190b3BfYnVpbGRfcHJlZml4PSA7OworICAqKSAgYWNfdG9wX2J1aWxkX3ByZWZpeD0kYWNfdG9wX2J1aWxkZGlyX3N1Yi8gOzsKKyAgZXNhYyA7OworZXNhYworYWNfYWJzX3RvcF9idWlsZGRpcj0kYWNfcHdkCithY19hYnNfYnVpbGRkaXI9JGFjX3B3ZCRhY19kaXJfc3VmZml4CisjIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OgorYWNfdG9wX2J1aWxkZGlyPSRhY190b3BfYnVpbGRfcHJlZml4CisKK2Nhc2UgJHNyY2RpciBpbgorICAuKSAgIyBXZSBhcmUgYnVpbGRpbmcgaW4gcGxhY2UuCisgICAgYWNfc3JjZGlyPS4KKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRkaXJfc3ViCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JGFjX3B3ZCA7OworICBbXFwvXSogfCA/OltcXC9dKiApICAjIEFic29sdXRlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRzcmNkaXIkYWNfZGlyX3N1ZmZpeDsKKyAgICBhY190b3Bfc3JjZGlyPSRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kc3JjZGlyIDs7CisgICopICMgUmVsYXRpdmUgbmFtZS4KKyAgICBhY19zcmNkaXI9JGFjX3RvcF9idWlsZF9wcmVmaXgkc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKyAgICBhY190b3Bfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpcgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QvJHNyY2RpciA7OworZXNhYworYWNfYWJzX3NyY2Rpcj0kYWNfYWJzX3RvcF9zcmNkaXIkYWNfZGlyX3N1ZmZpeAorCisgICAgY2QgIiRhY19kaXIiIHx8IHsgYWNfc3RhdHVzPSQ/OyBjb250aW51ZTsgfQorICAgICMgQ2hlY2sgZm9yIGd1ZXN0ZWQgY29uZmlndXJlLgorICAgIGlmIHRlc3QgLWYgIiRhY19zcmNkaXIvY29uZmlndXJlLmdudSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUuZ251IiAtLWhlbHA9cmVjdXJzaXZlCisgICAgZWxpZiB0ZXN0IC1mICIkYWNfc3JjZGlyL2NvbmZpZ3VyZSI7IHRoZW4KKyAgICAgIGVjaG8gJiYKKyAgICAgICRTSEVMTCAiJGFjX3NyY2Rpci9jb25maWd1cmUiIC0taGVscD1yZWN1cnNpdmUKKyAgICBlbHNlCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgorICAgIGZpIHx8IGFjX3N0YXR1cz0kPworICAgIGNkICIkYWNfcHdkIiB8fCB7IGFjX3N0YXR1cz0kPzsgYnJlYWs7IH0KKyAgZG9uZQorZmkKKwordGVzdCAtbiAiJGFjX2luaXRfaGVscCIgJiYgZXhpdCAkYWNfc3RhdHVzCitpZiAkYWNfaW5pdF92ZXJzaW9uOyB0aGVuCisgIGNhdCA8PFxfQUNFT0YKK2NvbmZpZ3VyZQorZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3CisKK0NvcHlyaWdodCAoQykgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KK1RoaXMgY29uZmlndXJlIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuCitfQUNFT0YKKyAgZXhpdAorZmkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBBdXRvY29uZiBpbml0aWFsaXphdGlvbi4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgTElORU5PCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBjb21waWxlIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4KK2FjX2ZuX2NfdHJ5X2NvbXBpbGUgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CisgIGlmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsKKwkgdGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9ICYmIHRlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dDsgdGhlbiA6CisgIGFjX3JldHZhbD0wCitlbHNlCisgICRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfcmV0dmFsPTEKK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfY29tcGlsZQorCisjIGFjX2ZuX2NfdHJ5X2NwcCBMSU5FTk8KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gcHJlcHJvY2VzcyBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9jcHAgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBpZiB7IHsgYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyciA+Y29uZnRlc3QuZXIxCisgICAgY2F0IGNvbmZ0ZXN0LmVyMSA+JjUKKyAgICBtdiAtZiBjb25mdGVzdC5lcjEgY29uZnRlc3QuZXJyCisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ID4gY29uZnRlc3QuaSAmJiB7CisJIHRlc3QgLXogIiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnJGFjX2Nfd2Vycm9yX2ZsYWciIHx8CisJIHRlc3QgISAtcyBjb25mdGVzdC5lcnIKKyAgICAgICB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICBhY19yZXR2YWw9MQorZmkKKyAgZXZhbCAkYXNfbGluZW5vX3N0YWNrOyB0ZXN0ICJ4JGFzX2xpbmVub19zdGFjayIgPSB4ICYmIHsgYXNfbGluZW5vPTsgdW5zZXQgYXNfbGluZW5vO30KKyAgYXNfZm5fc2V0X3N0YXR1cyAkYWNfcmV0dmFsCisKK30gIyBhY19mbl9jX3RyeV9jcHAKKworIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsIExJTkVOTyBIRUFERVIgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGVzdHMgd2hldGhlciBIRUFERVIgZXhpc3RzLCBnaXZpbmcgYSB3YXJuaW5nIGlmIGl0IGNhbm5vdCBiZSBjb21waWxlZCB1c2luZworIyB0aGUgaW5jbHVkZSBmaWxlcyBpbiBJTkNMVURFUyBhbmQgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSCisjIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIGV2YWwgInRlc3QgXCJcJHskMytzZXR9XCIiID0gc2V0OyB0aGVuIDoKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJDIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICQyLi4uICIgPiY2OyB9CitpZiBldmFsICJ0ZXN0IFwiXCR7JDMrc2V0fVwiIiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CitlbHNlCisgICMgSXMgdGhlIGhlYWRlciBjb21waWxhYmxlPworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiB1c2FiaWxpdHkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgJDIgdXNhYmlsaXR5Li4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorI2luY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2hlYWRlcl9jb21waWxlcj15ZXMKK2Vsc2UKKyAgYWNfaGVhZGVyX2NvbXBpbGVyPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiskYXNfZWNobyAiJGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CisKKyMgSXMgdGhlIGhlYWRlciBwcmVzZW50PworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyAkMiBwcmVzZW5jZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyAkMiBwcmVzZW5jZS4uLiAiID4mNjsgfQorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfaGVhZGVyX3ByZXByb2M9eWVzCitlbHNlCisgIGFjX2hlYWRlcl9wcmVwcm9jPW5vCitmaQorcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LmkgY29uZnRlc3QuJGFjX2V4dAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19oZWFkZXJfcHJlcHJvYyIgPiY1CiskYXNfZWNobyAiJGFjX2hlYWRlcl9wcmVwcm9jIiA+JjY7IH0KKworIyBTbz8gIFdoYXQgYWJvdXQgdGhpcyBoZWFkZXI/CitjYXNlICRhY19oZWFkZXJfY29tcGlsZXI6JGFjX2hlYWRlcl9wcmVwcm9jOiRhY19jX3ByZXByb2Nfd2Fybl9mbGFnIGluICMoKAorICB5ZXM6bm86ICkKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBhY2NlcHRlZCBieSB0aGUgY29tcGlsZXIsIHJlamVjdGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IhIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6IHByb2NlZWRpbmcgd2l0aCB0aGUgY29tcGlsZXIncyByZXN1bHQiID4mMjt9CisgICAgOzsKKyAgbm86eWVzOiogKQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6IHByZXNlbnQgYnV0IGNhbm5vdCBiZSBjb21waWxlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogcHJlc2VudCBidXQgY2Fubm90IGJlIGNvbXBpbGVkIiA+JjI7fQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogJDI6ICAgICBjaGVjayBmb3IgbWlzc2luZyBwcmVyZXF1aXNpdGUgaGVhZGVycz8iID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogc2VlIHRoZSBBdXRvY29uZiBkb2N1bWVudGF0aW9uIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBzZWUgdGhlIEF1dG9jb25mIGRvY3VtZW50YXRpb24iID4mMjt9CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkMjogICAgIHNlY3Rpb24gXCJQcmVzZW50IEJ1dCBDYW5ub3QgQmUgQ29tcGlsZWRcIiIgPiYyO30KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6ICQyOiBwcm9jZWVkaW5nIHdpdGggdGhlIGNvbXBpbGVyJ3MgcmVzdWx0IiA+JjI7fQorICAgIDs7Citlc2FjCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1cJGFjX2hlYWRlcl9jb21waWxlciIKK2ZpCitldmFsIGFjX3Jlcz1cJCQzCisJICAgICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfcmVzIiA+JjUKKyRhc19lY2hvICIkYWNfcmVzIiA+JjY7IH0KK2ZpCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsCisKKyMgYWNfZm5fY190cnlfcnVuIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRyeSB0byBsaW5rIGNvbmZ0ZXN0LiRhY19leHQsIGFuZCByZXR1cm4gd2hldGhlciB0aGlzIHN1Y2NlZWRlZC4gQXNzdW1lcworIyB0aGF0IGV4ZWN1dGFibGVzICpjYW4qIGJlIHJ1bi4KK2FjX2ZuX2NfdHJ5X3J1biAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIGlmIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9ICYmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuIDoKKyAgYWNfcmV0dmFsPTAKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogcHJvZ3JhbSBleGl0ZWQgd2l0aCBzdGF0dXMgJGFjX3N0YXR1cyIgPiY1CisgICAgICAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKyAgICAgICBhY19yZXR2YWw9JGFjX3N0YXR1cworZmkKKyAgcm0gLXJmIGNvbmZ0ZXN0LmRTWU0gY29uZnRlc3RfaXBhOF9jb25mdGVzdC5vbworICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorICBhc19mbl9zZXRfc3RhdHVzICRhY19yZXR2YWwKKworfSAjIGFjX2ZuX2NfdHJ5X3J1bgorCisjIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgTElORU5PIEhFQURFUiBWQVIgSU5DTFVERVMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEhFQURFUiBleGlzdHMgYW5kIGNhbiBiZSBjb21waWxlZCB1c2luZyB0aGUgaW5jbHVkZSBmaWxlcyBpbgorIyBJTkNMVURFUywgc2V0dGluZyB0aGUgY2FjaGUgdmFyaWFibGUgVkFSIGFjY29yZGluZ2x5LgorYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAorI2luY2x1ZGUgPCQyPgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisKK30gIyBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlCisKKyMgYWNfZm5fY19jaGVja190eXBlIExJTkVOTyBUWVBFIFZBUiBJTkNMVURFUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRlc3RzIHdoZXRoZXIgVFlQRSBleGlzdHMgYWZ0ZXIgaGF2aW5nIGluY2x1ZGVkIElOQ0xVREVTLCBzZXR0aW5nIGNhY2hlCisjIHZhcmlhYmxlIFZBUiBhY2NvcmRpbmdseS4KK2FjX2ZuX2NfY2hlY2tfdHlwZSAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBldmFsICIkMz1ubyIKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworaWYgKHNpemVvZiAoJDIpKQorCSByZXR1cm4gMDsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCiskNAoraW50CittYWluICgpCit7CitpZiAoc2l6ZW9mICgoJDIpKSkKKwkgICAgcmV0dXJuIDA7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBldmFsICIkMz15ZXMiCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisKK30gIyBhY19mbl9jX2NoZWNrX3R5cGUKKworIyBhY19mbl9jX3RyeV9saW5rIExJTkVOTworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUcnkgdG8gbGluayBjb25mdGVzdC4kYWNfZXh0LCBhbmQgcmV0dXJuIHdoZXRoZXIgdGhpcyBzdWNjZWVkZWQuCithY19mbl9jX3RyeV9saW5rICgpCit7CisgIGFzX2xpbmVubz0ke2FzX2xpbmVuby0iJDEifSBhc19saW5lbm9fc3RhY2s9YXNfbGluZW5vX3N0YWNrPSRhc19saW5lbm9fc3RhY2sKKyAgcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmsiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19saW5rIikgMj5jb25mdGVzdC5lcnIKKyAgYWNfc3RhdHVzPSQ/CisgIGlmIHRlc3QgLXMgY29uZnRlc3QuZXJyOyB0aGVuCisgICAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXJyID5jb25mdGVzdC5lcjEKKyAgICBjYXQgY29uZnRlc3QuZXIxID4mNQorICAgIG12IC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgZmkKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0gJiYgeworCSB0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwKKwkgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycgorICAgICAgIH0gJiYgdGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQgJiYgeworCSB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyB8fAorCSAkYXNfdGVzdF94IGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICAgICAgIH07IHRoZW4gOgorICBhY19yZXR2YWw9MAorZWxzZQorICAkYXNfZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKK3NlZCAncy9eL3wgLycgY29uZnRlc3QuJGFjX2V4dCA+JjUKKworCWFjX3JldHZhbD0xCitmaQorICAjIERlbGV0ZSB0aGUgSVBBL0lQTyAoSW50ZXIgUHJvY2VkdXJhbCBBbmFseXNpcy9PcHRpbWl6YXRpb24pIGluZm9ybWF0aW9uCisgICMgY3JlYXRlZCBieSB0aGUgUEdJIGNvbXBpbGVyIChjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vKSwgYXMgaXQgd291bGQKKyAgIyBpbnRlcmZlcmUgd2l0aCB0aGUgbmV4dCBsaW5rIGNvbW1hbmQ7IGFsc28gZGVsZXRlIGEgZGlyZWN0b3J5IHRoYXQgaXMKKyAgIyBsZWZ0IGJlaGluZCBieSBBcHBsZSdzIGNvbXBpbGVyLiAgV2UgZG8gdGhpcyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBhY3Rpb25zLgorICBybSAtcmYgY29uZnRlc3QuZFNZTSBjb25mdGVzdF9pcGE4X2NvbmZ0ZXN0Lm9vCisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisgIGFzX2ZuX3NldF9zdGF0dXMgJGFjX3JldHZhbAorCit9ICMgYWNfZm5fY190cnlfbGluaworCisjIGFjX2ZuX2NfY2hlY2tfZnVuYyBMSU5FTk8gRlVOQyBWQVIKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIEZVTkMgZXhpc3RzLCBzZXR0aW5nIHRoZSBjYWNoZSB2YXJpYWJsZSBWQVIgYWNjb3JkaW5nbHkKK2FjX2ZuX2NfY2hlY2tfZnVuYyAoKQoreworICBhc19saW5lbm89JHthc19saW5lbm8tIiQxIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICQyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkMi4uLiAiID4mNjsgfQoraWYgZXZhbCAidGVzdCBcIlwkeyQzK3NldH1cIiIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisvKiBEZWZpbmUgJDIgdG8gYW4gaW5ub2N1b3VzIHZhcmlhbnQsIGluIGNhc2UgPGxpbWl0cy5oPiBkZWNsYXJlcyAkMi4KKyAgIEZvciBleGFtcGxlLCBIUC1VWCAxMWkgPGxpbWl0cy5oPiBkZWNsYXJlcyBnZXR0aW1lb2ZkYXkuICAqLworI2RlZmluZSAkMiBpbm5vY3VvdXNfJDIKKworLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAorICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJDIgKCk7IGJlbG93LgorICAgIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgICA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuICAqLworCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCisjdW5kZWYgJDIKKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciAkMiAoKTsKKy8qIFRoZSBHTlUgQyBsaWJyYXJ5IGRlZmluZXMgdGhpcyBmb3IgZnVuY3Rpb25zIHdoaWNoIGl0IGltcGxlbWVudHMKKyAgICB0byBhbHdheXMgZmFpbCB3aXRoIEVOT1NZUy4gIFNvbWUgZnVuY3Rpb25zIGFyZSBhY3R1YWxseSBuYW1lZAorICAgIHNvbWV0aGluZyBzdGFydGluZyB3aXRoIF9fIGFuZCB0aGUgbm9ybWFsIG5hbWUgaXMgYW4gYWxpYXMuICAqLworI2lmIGRlZmluZWQgX19zdHViXyQyIHx8IGRlZmluZWQgX19zdHViX19fJDIKK2Nob2tlIG1lCisjZW5kaWYKKworaW50CittYWluICgpCit7CityZXR1cm4gJDIgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgZXZhbCAiJDM9eWVzIgorZWxzZQorICBldmFsICIkMz1ubyIKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2V2YWwgYWNfcmVzPVwkJDMKKwkgICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19yZXMiID4mNQorJGFzX2VjaG8gIiRhY19yZXMiID4mNjsgfQorICBldmFsICRhc19saW5lbm9fc3RhY2s7IHRlc3QgIngkYXNfbGluZW5vX3N0YWNrIiA9IHggJiYgeyBhc19saW5lbm89OyB1bnNldCBhc19saW5lbm87fQorCit9ICMgYWNfZm5fY19jaGVja19mdW5jCisKKyMgYWNfZm5fY19jaGVja19kZWNsIExJTkVOTyBTWU1CT0wgVkFSIElOQ0xVREVTCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXN0cyB3aGV0aGVyIFNZTUJPTCBpcyBkZWNsYXJlZCBpbiBJTkNMVURFUywgc2V0dGluZyBjYWNoZSB2YXJpYWJsZSBWQVIKKyMgYWNjb3JkaW5nbHkuCithY19mbl9jX2NoZWNrX2RlY2wgKCkKK3sKKyAgYXNfbGluZW5vPSR7YXNfbGluZW5vLSIkMSJ9IGFzX2xpbmVub19zdGFjaz1hc19saW5lbm9fc3RhY2s9JGFzX2xpbmVub19zdGFjaworICBhc19kZWNsX25hbWU9YGVjaG8gJDJ8c2VkICdzLyAqKC4qLy8nYAorICBhc19kZWNsX3VzZT1gZWNobyAkMnxzZWQgLWUgJ3MvKC8oKC8nIC1lICdzLykvKSAwJi8nIC1lICdzLywvKSAwJiAoL2cnYAorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgJGFzX2RlY2xfbmFtZSBpcyBkZWNsYXJlZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyICRhc19kZWNsX25hbWUgaXMgZGVjbGFyZWQuLi4gIiA+JjY7IH0KK2lmIGV2YWwgInRlc3QgXCJcJHskMytzZXR9XCIiID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworJDQKK2ludAorbWFpbiAoKQoreworI2lmbmRlZiAkYXNfZGVjbF9uYW1lCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgKHZvaWQpICRhc19kZWNsX3VzZTsKKyNlbHNlCisgICh2b2lkKSAkYXNfZGVjbF9uYW1lOworI2VuZGlmCisjZW5kaWYKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGV2YWwgIiQzPXllcyIKK2Vsc2UKKyAgZXZhbCAiJDM9bm8iCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorZXZhbCBhY19yZXM9XCQkMworCSAgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX3JlcyIgPiY1CiskYXNfZWNobyAiJGFjX3JlcyIgPiY2OyB9CisgIGV2YWwgJGFzX2xpbmVub19zdGFjazsgdGVzdCAieCRhc19saW5lbm9fc3RhY2siID0geCAmJiB7IGFzX2xpbmVubz07IHVuc2V0IGFzX2xpbmVubzt9CisKK30gIyBhY19mbl9jX2NoZWNrX2RlY2wKK2NhdCA+Y29uZmlnLmxvZyA8PF9BQ0VPRgorVGhpcyBmaWxlIGNvbnRhaW5zIGFueSBtZXNzYWdlcyBwcm9kdWNlZCBieSBjb21waWxlcnMgd2hpbGUKK3J1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCisKK0l0IHdhcyBjcmVhdGVkIGJ5ICRhc19tZSwgd2hpY2ggd2FzCitnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNjcuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKKworICAkICQwICRACisKK19BQ0VPRgorZXhlYyA1Pj5jb25maWcubG9nCit7CitjYXQgPDxfQVNVTkFNRQorIyMgLS0tLS0tLS0tICMjCisjIyBQbGF0Zm9ybS4gIyMKKyMjIC0tLS0tLS0tLSAjIworCitob3N0bmFtZSA9IGAoaG9zdG5hbWUgfHwgdW5hbWUgLW4pIDI+L2Rldi9udWxsIHwgc2VkIDFxYAordW5hbWUgLW0gPSBgKHVuYW1lIC1tKSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCit1bmFtZSAtciA9IGAodW5hbWUgLXIpIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKK3VuYW1lIC1zID0gYCh1bmFtZSAtcykgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAordW5hbWUgLXYgPSBgKHVuYW1lIC12KSAyPi9kZXYvbnVsbCB8fCBlY2hvIHVua25vd25gCisKKy91c3IvYmluL3VuYW1lIC1wID0gYCgvdXNyL2Jpbi91bmFtZSAtcCkgMj4vZGV2L251bGwgfHwgZWNobyB1bmtub3duYAorL2Jpbi91bmFtZSAtWCAgICAgPSBgKC9iaW4vdW5hbWUgLVgpIDI+L2Rldi9udWxsICAgICB8fCBlY2hvIHVua25vd25gCisKKy9iaW4vYXJjaCAgICAgICAgICAgICAgPSBgKC9iaW4vYXJjaCkgMj4vZGV2L251bGwgICAgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2FyY2ggLWsgICAgICAgPSBgKC91c3IvYmluL2FyY2ggLWspIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvY29udmV4L2dldHN5c2luZm8gPSBgKC91c3IvY29udmV4L2dldHN5c2luZm8pIDI+L2Rldi9udWxsIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL2hvc3RpbmZvICAgICAgPSBgKC91c3IvYmluL2hvc3RpbmZvKSAyPi9kZXYvbnVsbCAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vbWFjaGluZSAgICAgICAgICAgPSBgKC9iaW4vbWFjaGluZSkgMj4vZGV2L251bGwgICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy91c3IvYmluL29zbGV2ZWwgICAgICAgPSBgKC91c3IvYmluL29zbGV2ZWwpIDI+L2Rldi9udWxsICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKy9iaW4vdW5pdmVyc2UgICAgICAgICAgPSBgKC9iaW4vdW5pdmVyc2UpIDI+L2Rldi9udWxsICAgICAgICAgIHx8IGVjaG8gdW5rbm93bmAKKworX0FTVU5BTUUKKworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICRhc19lY2hvICJQQVRIOiAkYXNfZGlyIgorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK30gPiY1CisKK2NhdCA+JjUgPDxfQUNFT0YKKworCisjIyAtLS0tLS0tLS0tLSAjIworIyMgQ29yZSB0ZXN0cy4gIyMKKyMjIC0tLS0tLS0tLS0tICMjCisKK19BQ0VPRgorCisKKyMgS2VlcCBhIHRyYWNlIG9mIHRoZSBjb21tYW5kIGxpbmUuCisjIFN0cmlwIG91dCAtLW5vLWNyZWF0ZSBhbmQgLS1uby1yZWN1cnNpb24gc28gdGhleSBkbyBub3QgcGlsZSB1cC4KKyMgU3RyaXAgb3V0IC0tc2lsZW50IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgaXQgZm9yIGZ1dHVyZSBydW5zLgorIyBBbHNvIHF1b3RlIGFueSBhcmdzIGNvbnRhaW5pbmcgc2hlbGwgbWV0YS1jaGFyYWN0ZXJzLgorIyBNYWtlIHR3byBwYXNzZXMgdG8gYWxsb3cgZm9yIHByb3BlciBkdXBsaWNhdGUtYXJndW1lbnQgc3VwcHJlc3Npb24uCithY19jb25maWd1cmVfYXJncz0KK2FjX2NvbmZpZ3VyZV9hcmdzMD0KK2FjX2NvbmZpZ3VyZV9hcmdzMT0KK2FjX211c3Rfa2VlcF9uZXh0PWZhbHNlCitmb3IgYWNfcGFzcyBpbiAxIDIKK2RvCisgIGZvciBhY19hcmcKKyAgZG8KKyAgICBjYXNlICRhY19hcmcgaW4KKyAgICAtbm8tY3JlYXRlIHwgLS1uby1jKiB8IC1uIHwgLW5vLXJlY3Vyc2lvbiB8IC0tbm8tciopIGNvbnRpbnVlIDs7CisgICAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgICB8IC1zaWxlbnQgfCAtLXNpbGVudCB8IC0tc2lsZW4gfCAtLXNpbGUgfCAtLXNpbCkKKyAgICAgIGNvbnRpbnVlIDs7CisgICAgKlwnKikKKyAgICAgIGFjX2FyZz1gJGFzX2VjaG8gIiRhY19hcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGNhc2UgJGFjX3Bhc3MgaW4KKyAgICAxKSBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MwICIgJyRhY19hcmcnIiA7OworICAgIDIpCisgICAgICBhc19mbl9hcHBlbmQgYWNfY29uZmlndXJlX2FyZ3MxICIgJyRhY19hcmcnIgorICAgICAgaWYgdGVzdCAkYWNfbXVzdF9rZWVwX25leHQgPSB0cnVlOyB0aGVuCisJYWNfbXVzdF9rZWVwX25leHQ9ZmFsc2UgIyBHb3QgdmFsdWUsIGJhY2sgdG8gbm9ybWFsLgorICAgICAgZWxzZQorCWNhc2UgJGFjX2FyZyBpbgorCSAgKj0qIHwgLS1jb25maWctY2FjaGUgfCAtQyB8IC1kaXNhYmxlLSogfCAtLWRpc2FibGUtKiBcCisJICB8IC1lbmFibGUtKiB8IC0tZW5hYmxlLSogfCAtZ2FzIHwgLS1nKiB8IC1uZnAgfCAtLW5mKiBcCisJICB8IC1xIHwgLXF1aWV0IHwgLS1xKiB8IC1zaWxlbnQgfCAtLXNpbCogfCAtdiB8IC12ZXJiKiBcCisJICB8IC13aXRoLSogfCAtLXdpdGgtKiB8IC13aXRob3V0LSogfCAtLXdpdGhvdXQtKiB8IC0teCkKKwkgICAgY2FzZSAiJGFjX2NvbmZpZ3VyZV9hcmdzMCAiIGluCisJICAgICAgIiRhY19jb25maWd1cmVfYXJnczEiKiIgJyRhY19hcmcnICIqICkgY29udGludWUgOzsKKwkgICAgZXNhYworCSAgICA7OworCSAgLSogKSBhY19tdXN0X2tlZXBfbmV4dD10cnVlIDs7CisJZXNhYworICAgICAgZmkKKyAgICAgIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIKKyAgICAgIDs7CisgICAgZXNhYworICBkb25lCitkb25lCit7IGFjX2NvbmZpZ3VyZV9hcmdzMD07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMDt9Cit7IGFjX2NvbmZpZ3VyZV9hcmdzMT07IHVuc2V0IGFjX2NvbmZpZ3VyZV9hcmdzMTt9CisKKyMgV2hlbiBpbnRlcnJ1cHRlZCBvciBleGl0J2QsIGNsZWFudXAgdGVtcG9yYXJ5IGZpbGVzLCBhbmQgY29tcGxldGUKKyMgY29uZmlnLmxvZy4gIFdlIHJlbW92ZSBjb21tZW50cyBiZWNhdXNlIGFueXdheSB0aGUgcXVvdGVzIGluIHRoZXJlCisjIHdvdWxkIGNhdXNlIHByb2JsZW1zIG9yIGxvb2sgdWdseS4KKyMgV0FSTklORzogVXNlICdcJycgdG8gcmVwcmVzZW50IGFuIGFwb3N0cm9waGUgd2l0aGluIHRoZSB0cmFwLgorIyBXQVJOSU5HOiBEbyBub3Qgc3RhcnQgdGhlIHRyYXAgY29kZSB3aXRoIGEgbmV3bGluZSwgZHVlIHRvIGEgRnJlZUJTRCA0LjAgYnVnLgordHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgIyBTYXZlIGludG8gY29uZmlnLmxvZyBzb21lIGluZm9ybWF0aW9uIHRoYXQgbWlnaHQgaGVscCBpbiBkZWJ1Z2dpbmcuCisgIHsKKyAgICBlY2hvCisKKyAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgQ2FjaGUgdmFyaWFibGVzLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICBlY2hvCisgICAgIyBUaGUgZm9sbG93aW5nIHdheSBvZiB3cml0aW5nIHRoZSBjYWNoZSBtaXNoYW5kbGVzIG5ld2xpbmVzIGluIHZhbHVlcywKKygKKyAgZm9yIGFjX3ZhciBpbiBgKHNldCkgMj4mMSB8IHNlZCAtbiAnXCcncy9eXChbYS16QS1aX11bYS16QS1aMC05X10qXCk9LiovXDEvcCdcJydgOyBkbworICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgIGNhc2UgJGFjX3ZhbCBpbiAjKAorICAgICoke2FzX25sfSopCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgICpfY3ZfKikgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYWNoZSB2YXJpYWJsZSAkYWNfdmFyIGNvbnRhaW5zIGEgbmV3bGluZSIgPiYyO30gOzsKKyAgICAgIGVzYWMKKyAgICAgIGNhc2UgJGFjX3ZhciBpbiAjKAorICAgICAgXyB8IElGUyB8IGFzX25sKSA7OyAjKAorICAgICAgQkFTSF9BUkdWIHwgQkFTSF9TT1VSQ0UpIGV2YWwgJGFjX3Zhcj0gOzsgIygKKyAgICAgICopIHsgZXZhbCAkYWNfdmFyPTsgdW5zZXQgJGFjX3Zhcjt9IDs7CisgICAgICBlc2FjIDs7CisgICAgZXNhYworICBkb25lCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nXCcnICdcJyc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICBzZWQgLW4gXAorCSJzLydcJycvJ1wnJ1xcXFwnXCcnJ1wnJy9nOworCSAgcy9eXFwoW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qXFwpPVxcKC4qXFwpL1xcMT0nXCcnXFwyJ1wnJy9wIgorICAgICAgOzsgIygKKyAgICAqKQorICAgICAgc2VkIC1uICIvXltfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKj0vcCIKKyAgICAgIDs7CisgICAgZXNhYyB8CisgICAgc29ydAorKQorICAgIGVjaG8KKworICAgICRhc19lY2hvICIjIyAtLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgT3V0cHV0IHZhcmlhYmxlcy4gIyMKKyMjIC0tLS0tLS0tLS0tLS0tLS0tICMjIgorICAgIGVjaG8KKyAgICBmb3IgYWNfdmFyIGluICRhY19zdWJzdF92YXJzCisgICAgZG8KKyAgICAgIGV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorICAgICAgY2FzZSAkYWNfdmFsIGluCisgICAgICAqXCdcJycqKSBhY192YWw9YCRhc19lY2hvICIkYWNfdmFsIiB8IHNlZCAicy8nXCcnLydcJydcXFxcXFxcXCdcJycnXCcnL2ciYDs7CisgICAgICBlc2FjCisgICAgICAkYXNfZWNobyAiJGFjX3Zhcj0nXCcnJGFjX3ZhbCdcJyciCisgICAgZG9uZSB8IHNvcnQKKyAgICBlY2hvCisKKyAgICBpZiB0ZXN0IC1uICIkYWNfc3Vic3RfZmlsZXMiOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworIyMgRmlsZSBzdWJzdGl0dXRpb25zLiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGZvciBhY192YXIgaW4gJGFjX3N1YnN0X2ZpbGVzCisgICAgICBkbworCWV2YWwgYWNfdmFsPVwkJGFjX3ZhcgorCWNhc2UgJGFjX3ZhbCBpbgorCSpcJ1wnJyopIGFjX3ZhbD1gJGFzX2VjaG8gIiRhY192YWwiIHwgc2VkICJzLydcJycvJ1wnJ1xcXFxcXFxcJ1wnJydcJycvZyJgOzsKKwllc2FjCisJJGFzX2VjaG8gIiRhY192YXI9J1wnJyRhY192YWwnXCcnIgorICAgICAgZG9uZSB8IHNvcnQKKyAgICAgIGVjaG8KKyAgICBmaQorCisgICAgaWYgdGVzdCAtcyBjb25mZGVmcy5oOyB0aGVuCisgICAgICAkYXNfZWNobyAiIyMgLS0tLS0tLS0tLS0gIyMKKyMjIGNvbmZkZWZzLmguICMjCisjIyAtLS0tLS0tLS0tLSAjIyIKKyAgICAgIGVjaG8KKyAgICAgIGNhdCBjb25mZGVmcy5oCisgICAgICBlY2hvCisgICAgZmkKKyAgICB0ZXN0ICIkYWNfc2lnbmFsIiAhPSAwICYmCisgICAgICAkYXNfZWNobyAiJGFzX21lOiBjYXVnaHQgc2lnbmFsICRhY19zaWduYWwiCisgICAgJGFzX2VjaG8gIiRhc19tZTogZXhpdCAkZXhpdF9zdGF0dXMiCisgIH0gPiY1CisgIHJtIC1mIGNvcmUgKi5jb3JlIGNvcmUuY29uZnRlc3QuKiAmJgorICAgIHJtIC1mIC1yIGNvbmZ0ZXN0KiBjb25mZGVmcyogY29uZiQkKiAkYWNfY2xlYW5fZmlsZXMgJiYKKyAgICBleGl0ICRleGl0X3N0YXR1cworJyAwCitmb3IgYWNfc2lnbmFsIGluIDEgMiAxMyAxNTsgZG8KKyAgdHJhcCAnYWNfc2lnbmFsPSckYWNfc2lnbmFsJzsgYXNfZm5fZXhpdCAxJyAkYWNfc2lnbmFsCitkb25lCithY19zaWduYWw9MAorCisjIGNvbmZkZWZzLmggYXZvaWRzIE9TIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIHRoYXQgREVGUyBjYW4gZXhjZWVkLgorcm0gLWYgLXIgY29uZnRlc3QqIGNvbmZkZWZzLmgKKworJGFzX2VjaG8gIi8qIGNvbmZkZWZzLmggKi8iID4gY29uZmRlZnMuaAorCisjIFByZWRlZmluZWQgcHJlcHJvY2Vzc29yIHZhcmlhYmxlcy4KKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX05BTUUgIiRQQUNLQUdFX05BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgIiRQQUNLQUdFX1RBUk5BTUUiCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIiRQQUNLQUdFX1ZFUlNJT04iCitfQUNFT0YKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBQQUNLQUdFX1NUUklORyAiJFBBQ0tBR0VfU1RSSU5HIgorX0FDRU9GCisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgIiRQQUNLQUdFX0JVR1JFUE9SVCIKK19BQ0VPRgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIkUEFDS0FHRV9VUkwiCitfQUNFT0YKKworCisjIExldCB0aGUgc2l0ZSBmaWxlIHNlbGVjdCBhbiBhbHRlcm5hdGUgY2FjaGUgZmlsZSBpZiBpdCB3YW50cyB0by4KKyMgUHJlZmVyIGFuIGV4cGxpY2l0bHkgc2VsZWN0ZWQgZmlsZSB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIG9uZXMuCithY19zaXRlX2ZpbGUxPU5PTkUKK2FjX3NpdGVfZmlsZTI9Tk9ORQoraWYgdGVzdCAtbiAiJENPTkZJR19TSVRFIjsgdGhlbgorICAjIFdlIGRvIG5vdCB3YW50IGEgUEFUSCBzZWFyY2ggZm9yIGNvbmZpZy5zaXRlLgorICBjYXNlICRDT05GSUdfU0lURSBpbiAjKCgKKyAgICAtKikgIGFjX3NpdGVfZmlsZTE9Li8kQ09ORklHX1NJVEU7OworICAgICovKikgYWNfc2l0ZV9maWxlMT0kQ09ORklHX1NJVEU7OworICAgICopICAgYWNfc2l0ZV9maWxlMT0uLyRDT05GSUdfU0lURTs7CisgIGVzYWMKK2VsaWYgdGVzdCAieCRwcmVmaXgiICE9IHhOT05FOyB0aGVuCisgIGFjX3NpdGVfZmlsZTE9JHByZWZpeC9zaGFyZS9jb25maWcuc2l0ZQorICBhY19zaXRlX2ZpbGUyPSRwcmVmaXgvZXRjL2NvbmZpZy5zaXRlCitlbHNlCisgIGFjX3NpdGVfZmlsZTE9JGFjX2RlZmF1bHRfcHJlZml4L3NoYXJlL2NvbmZpZy5zaXRlCisgIGFjX3NpdGVfZmlsZTI9JGFjX2RlZmF1bHRfcHJlZml4L2V0Yy9jb25maWcuc2l0ZQorZmkKK2ZvciBhY19zaXRlX2ZpbGUgaW4gIiRhY19zaXRlX2ZpbGUxIiAiJGFjX3NpdGVfZmlsZTIiCitkbworICB0ZXN0ICJ4JGFjX3NpdGVfZmlsZSIgPSB4Tk9ORSAmJiBjb250aW51ZQorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGFjX3NpdGVfZmlsZSIgJiYgdGVzdCAtciAiJGFjX3NpdGVfZmlsZSI7IHRoZW4KKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGxvYWRpbmcgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIHNpdGUgc2NyaXB0ICRhY19zaXRlX2ZpbGUiID4mNjt9CisgICAgc2VkICdzL14vfCAvJyAiJGFjX3NpdGVfZmlsZSIgPiY1CisgICAgLiAiJGFjX3NpdGVfZmlsZSIgXAorICAgICAgfHwgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiZmFpbGVkIHRvIGxvYWQgc2l0ZSBzY3JpcHQgJGFjX3NpdGVfZmlsZQorU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CisgIGZpCitkb25lCisKK2lmIHRlc3QgLXIgIiRjYWNoZV9maWxlIjsgdGhlbgorICAjIFNvbWUgdmVyc2lvbnMgb2YgYmFzaCB3aWxsIGZhaWwgdG8gc291cmNlIC9kZXYvbnVsbCAoc3BlY2lhbCBmaWxlcworICAjIGFjdHVhbGx5KSwgc28gd2UgYXZvaWQgZG9pbmcgdGhhdC4gIERKR1BQIGVtdWxhdGVzIGl0IGFzIGEgcmVndWxhciBmaWxlLgorICBpZiB0ZXN0IC9kZXYvbnVsbCAhPSAiJGNhY2hlX2ZpbGUiICYmIHRlc3QgLWYgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogbG9hZGluZyBjYWNoZSAkY2FjaGVfZmlsZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBsb2FkaW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhc2UgJGNhY2hlX2ZpbGUgaW4KKyAgICAgIFtcXC9dKiB8ID86W1xcL10qICkgLiAiJGNhY2hlX2ZpbGUiOzsKKyAgICAgICopICAgICAgICAgICAgICAgICAgICAgIC4gIi4vJGNhY2hlX2ZpbGUiOzsKKyAgICBlc2FjCisgIGZpCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgY2FjaGUgJGNhY2hlX2ZpbGUiID4mNjt9CisgID4kY2FjaGVfZmlsZQorZmkKKworIyBDaGVjayB0aGF0IHRoZSBwcmVjaW91cyB2YXJpYWJsZXMgc2F2ZWQgaW4gdGhlIGNhY2hlIGhhdmUga2VwdCB0aGUgc2FtZQorIyB2YWx1ZS4KK2FjX2NhY2hlX2NvcnJ1cHRlZD1mYWxzZQorZm9yIGFjX3ZhciBpbiAkYWNfcHJlY2lvdXNfdmFyczsgZG8KKyAgZXZhbCBhY19vbGRfc2V0PVwkYWNfY3ZfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19uZXdfc2V0PVwkYWNfZW52XyR7YWNfdmFyfV9zZXQKKyAgZXZhbCBhY19vbGRfdmFsPVwkYWNfY3ZfZW52XyR7YWNfdmFyfV92YWx1ZQorICBldmFsIGFjX25ld192YWw9XCRhY19lbnZfJHthY192YXJ9X3ZhbHVlCisgIGNhc2UgJGFjX29sZF9zZXQsJGFjX25ld19zZXQgaW4KKyAgICBzZXQsKQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgc2V0IHRvIFxgJGFjX29sZF92YWwnIGluIHRoZSBwcmV2aW91cyBydW4iID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IFxgJGFjX3Zhcicgd2FzIHNldCB0byBcYCRhY19vbGRfdmFsJyBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjI7fQorICAgICAgYWNfY2FjaGVfY29ycnVwdGVkPTogOzsKKyAgICAsc2V0KQorICAgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogXGAkYWNfdmFyJyB3YXMgbm90IHNldCBpbiB0aGUgcHJldmlvdXMgcnVuIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBcYCRhY192YXInIHdhcyBub3Qgc2V0IGluIHRoZSBwcmV2aW91cyBydW4iID4mMjt9CisgICAgICBhY19jYWNoZV9jb3JydXB0ZWQ9OiA7OworICAgICwpOzsKKyAgICAqKQorICAgICAgaWYgdGVzdCAieCRhY19vbGRfdmFsIiAhPSAieCRhY19uZXdfdmFsIjsgdGhlbgorCSMgZGlmZmVyZW5jZXMgaW4gd2hpdGVzcGFjZSBkbyBub3QgbGVhZCB0byBmYWlsdXJlLgorCWFjX29sZF92YWxfdz1gZWNobyB4ICRhY19vbGRfdmFsYAorCWFjX25ld192YWxfdz1gZWNobyB4ICRhY19uZXdfdmFsYAorCWlmIHRlc3QgIiRhY19vbGRfdmFsX3ciICE9ICIkYWNfbmV3X3ZhbF93IjsgdGhlbgorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogXGAkYWNfdmFyJyBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKwkgIGFjX2NhY2hlX2NvcnJ1cHRlZD06CisJZWxzZQorCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiB3YXJuaW5nOiBpZ25vcmluZyB3aGl0ZXNwYWNlIGNoYW5nZXMgaW4gXGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiB3YXJuaW5nOiBpZ25vcmluZyB3aGl0ZXNwYWNlIGNoYW5nZXMgaW4gXGAkYWNfdmFyJyBzaW5jZSB0aGUgcHJldmlvdXMgcnVuOiIgPiYyO30KKwkgIGV2YWwgJGFjX3Zhcj1cJGFjX29sZF92YWwKKwlmaQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogICBmb3JtZXIgdmFsdWU6ICBcYCRhY19vbGRfdmFsJyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAgIGZvcm1lciB2YWx1ZTogIFxgJGFjX29sZF92YWwnIiA+JjI7fQorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogICBjdXJyZW50IHZhbHVlOiBcYCRhY19uZXdfdmFsJyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAgIGN1cnJlbnQgdmFsdWU6IFxgJGFjX25ld192YWwnIiA+JjI7fQorICAgICAgZmk7OworICBlc2FjCisgICMgUGFzcyBwcmVjaW91cyB2YXJpYWJsZXMgdG8gY29uZmlnLnN0YXR1cy4KKyAgaWYgdGVzdCAiJGFjX25ld19zZXQiID0gc2V0OyB0aGVuCisgICAgY2FzZSAkYWNfbmV3X3ZhbCBpbgorICAgICpcJyopIGFjX2FyZz0kYWNfdmFyPWAkYXNfZWNobyAiJGFjX25ld192YWwiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgKikgYWNfYXJnPSRhY192YXI9JGFjX25ld192YWwgOzsKKyAgICBlc2FjCisgICAgY2FzZSAiICRhY19jb25maWd1cmVfYXJncyAiIGluCisgICAgICAqIiAnJGFjX2FyZycgIiopIDs7ICMgQXZvaWQgZHVwcy4gIFVzZSBvZiBxdW90ZXMgZW5zdXJlcyBhY2N1cmFjeS4KKyAgICAgICopIGFzX2ZuX2FwcGVuZCBhY19jb25maWd1cmVfYXJncyAiICckYWNfYXJnJyIgOzsKKyAgICBlc2FjCisgIGZpCitkb25lCitpZiAkYWNfY2FjaGVfY29ycnVwdGVkOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogY2hhbmdlcyBpbiB0aGUgZW52aXJvbm1lbnQgY2FuIGNvbXByb21pc2UgdGhlIGJ1aWxkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBjaGFuZ2VzIGluIHRoZSBlbnZpcm9ubWVudCBjYW4gY29tcHJvbWlzZSB0aGUgYnVpbGQiID4mMjt9CisgIGFzX2ZuX2Vycm9yICQ/ICJydW4gXGBtYWtlIGRpc3RjbGVhbicgYW5kL29yIFxgcm0gJGNhY2hlX2ZpbGUnIGFuZCBzdGFydCBvdmVyIiAiJExJTkVOTyIgNQorZmkKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tICMjCisjIyBNYWluIGJvZHkgb2Ygc2NyaXB0LiAjIworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQorCisKKworYWNfYXV4X2Rpcj0KK2ZvciBhY19kaXIgaW4gIiRzcmNkaXIiICIkc3JjZGlyLy4uIiAiJHNyY2Rpci8uLi8uLiI7IGRvCisgIGlmIHRlc3QgLWYgIiRhY19kaXIvaW5zdGFsbC1zaCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9pbnN0YWxsLXNoIC1jIgorICAgIGJyZWFrCisgIGVsaWYgdGVzdCAtZiAiJGFjX2Rpci9pbnN0YWxsLnNoIjsgdGhlbgorICAgIGFjX2F1eF9kaXI9JGFjX2RpcgorICAgIGFjX2luc3RhbGxfc2g9IiRhY19hdXhfZGlyL2luc3RhbGwuc2ggLWMiCisgICAgYnJlYWsKKyAgZWxpZiB0ZXN0IC1mICIkYWNfZGlyL3NodG9vbCI7IHRoZW4KKyAgICBhY19hdXhfZGlyPSRhY19kaXIKKyAgICBhY19pbnN0YWxsX3NoPSIkYWNfYXV4X2Rpci9zaHRvb2wgaW5zdGFsbCAtYyIKKyAgICBicmVhaworICBmaQorZG9uZQoraWYgdGVzdCAteiAiJGFjX2F1eF9kaXIiOyB0aGVuCisgIGFzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgZmluZCBpbnN0YWxsLXNoLCBpbnN0YWxsLnNoLCBvciBzaHRvb2wgaW4gXCIkc3JjZGlyXCIgXCIkc3JjZGlyLy4uXCIgXCIkc3JjZGlyLy4uLy4uXCIiICIkTElORU5PIiA1CitmaQorCisjIFRoZXNlIHRocmVlIHZhcmlhYmxlcyBhcmUgdW5kb2N1bWVudGVkIGFuZCB1bnN1cHBvcnRlZCwKKyMgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSB3aXRoZHJhd24gaW4gYSBmdXR1cmUgQXV0b2NvbmYgcmVsZWFzZS4KKyMgVGhleSBjYW4gY2F1c2Ugc2VyaW91cyBwcm9ibGVtcyBpZiBhIGJ1aWxkZXIncyBzb3VyY2UgdHJlZSBpcyBpbiBhIGRpcmVjdG9yeQorIyB3aG9zZSBmdWxsIG5hbWUgY29udGFpbnMgdW51c3VhbCBjaGFyYWN0ZXJzLgorYWNfY29uZmlnX2d1ZXNzPSIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLmd1ZXNzIiAgIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgdmFyLgorYWNfY29uZmlnX3N1Yj0iJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCithY19jb25maWd1cmU9IiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWd1cmUiICAjIFBsZWFzZSBkb24ndCB1c2UgdGhpcyB2YXIuCisKKworIyBNYWtlIHN1cmUgd2UgY2FuIHJ1biBjb25maWcuc3ViLgorJFNIRUxMICIkYWNfYXV4X2Rpci9jb25maWcuc3ViIiBzdW40ID4vZGV2L251bGwgMj4mMSB8fAorICBhc19mbl9lcnJvciAkPyAiY2Fubm90IHJ1biAkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgIiRMSU5FTk8iIDUKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBidWlsZCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9idWlsZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2J1aWxkX2FsaWFzPSRidWlsZF9hbGlhcwordGVzdCAieCRhY19idWlsZF9hbGlhcyIgPSB4ICYmCisgIGFjX2J1aWxkX2FsaWFzPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5ndWVzcyJgCit0ZXN0ICJ4JGFjX2J1aWxkX2FsaWFzIiA9IHggJiYKKyAgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBndWVzcyBidWlsZCB0eXBlOyB5b3UgbXVzdCBzcGVjaWZ5IG9uZSIgIiRMSU5FTk8iIDUKK2FjX2N2X2J1aWxkPWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRhY19idWlsZF9hbGlhc2AgfHwKKyAgYXNfZm5fZXJyb3IgJD8gIiRTSEVMTCAkYWNfYXV4X2Rpci9jb25maWcuc3ViICRhY19idWlsZF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2J1aWxkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfYnVpbGQiID4mNjsgfQorY2FzZSAkYWNfY3ZfYnVpbGQgaW4KKyotKi0qKSA7OworKikgYXNfZm5fZXJyb3IgJD8gImludmFsaWQgdmFsdWUgb2YgY2Fub25pY2FsIGJ1aWxkIiAiJExJTkVOTyIgNSA7OworZXNhYworYnVpbGQ9JGFjX2N2X2J1aWxkCithY19zYXZlX0lGUz0kSUZTOyBJRlM9Jy0nCitzZXQgeCAkYWNfY3ZfYnVpbGQKK3NoaWZ0CitidWlsZF9jcHU9JDEKK2J1aWxkX3ZlbmRvcj0kMgorc2hpZnQ7IHNoaWZ0CisjIFJlbWVtYmVyLCB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIElGUyBpcyB1c2VkIHRvIGNyZWF0ZSAkKiwKKyMgZXhjZXB0IHdpdGggb2xkIHNoZWxsczoKK2J1aWxkX29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRidWlsZF9vcyBpbiAqXCAqKSBidWlsZF9vcz1gZWNobyAiJGJ1aWxkX29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgaG9zdCBzeXN0ZW0gdHlwZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBob3N0IHN5c3RlbSB0eXBlLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2hvc3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JGhvc3RfYWxpYXMiID0geDsgdGhlbgorICBhY19jdl9ob3N0PSRhY19jdl9idWlsZAorZWxzZQorICBhY19jdl9ob3N0PWAkU0hFTEwgIiRhY19hdXhfZGlyL2NvbmZpZy5zdWIiICRob3N0X2FsaWFzYCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICIkU0hFTEwgJGFjX2F1eF9kaXIvY29uZmlnLnN1YiAkaG9zdF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9ob3N0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfaG9zdCIgPiY2OyB9CitjYXNlICRhY19jdl9ob3N0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCBob3N0IiAiJExJTkVOTyIgNSA7OworZXNhYworaG9zdD0kYWNfY3ZfaG9zdAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X2hvc3QKK3NoaWZ0Citob3N0X2NwdT0kMQoraG9zdF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Citob3N0X29zPSQqCitJRlM9JGFjX3NhdmVfSUZTCitjYXNlICRob3N0X29zIGluICpcICopIGhvc3Rfb3M9YGVjaG8gIiRob3N0X29zIiB8IHNlZCAncy8gLy0vZydgOzsgZXNhYworCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgdGFyZ2V0IHN5c3RlbSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRhcmdldCBzeXN0ZW0gdHlwZS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl90YXJnZXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0ICJ4JHRhcmdldF9hbGlhcyIgPSB4OyB0aGVuCisgIGFjX2N2X3RhcmdldD0kYWNfY3ZfaG9zdAorZWxzZQorICBhY19jdl90YXJnZXQ9YCRTSEVMTCAiJGFjX2F1eF9kaXIvY29uZmlnLnN1YiIgJHRhcmdldF9hbGlhc2AgfHwKKyAgICBhc19mbl9lcnJvciAkPyAiJFNIRUxMICRhY19hdXhfZGlyL2NvbmZpZy5zdWIgJHRhcmdldF9hbGlhcyBmYWlsZWQiICIkTElORU5PIiA1CitmaQorCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl90YXJnZXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl90YXJnZXQiID4mNjsgfQorY2FzZSAkYWNfY3ZfdGFyZ2V0IGluCisqLSotKikgOzsKKyopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHZhbHVlIG9mIGNhbm9uaWNhbCB0YXJnZXQiICIkTElORU5PIiA1IDs7Citlc2FjCit0YXJnZXQ9JGFjX2N2X3RhcmdldAorYWNfc2F2ZV9JRlM9JElGUzsgSUZTPSctJworc2V0IHggJGFjX2N2X3RhcmdldAorc2hpZnQKK3RhcmdldF9jcHU9JDEKK3RhcmdldF92ZW5kb3I9JDIKK3NoaWZ0OyBzaGlmdAorIyBSZW1lbWJlciwgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBJRlMgaXMgdXNlZCB0byBjcmVhdGUgJCosCisjIGV4Y2VwdCB3aXRoIG9sZCBzaGVsbHM6Cit0YXJnZXRfb3M9JCoKK0lGUz0kYWNfc2F2ZV9JRlMKK2Nhc2UgJHRhcmdldF9vcyBpbiAqXCAqKSB0YXJnZXRfb3M9YGVjaG8gIiR0YXJnZXRfb3MiIHwgc2VkICdzLyAvLS9nJ2A7OyBlc2FjCisKKworIyBUaGUgYWxpYXNlcyBzYXZlIHRoZSBuYW1lcyB0aGUgdXNlciBzdXBwbGllZCwgd2hpbGUgJGhvc3QgZXRjLgorIyB3aWxsIGdldCBjYW5vbmljYWxpemVkLgordGVzdCAtbiAiJHRhcmdldF9hbGlhcyIgJiYKKyAgdGVzdCAiJHByb2dyYW1fcHJlZml4JHByb2dyYW1fc3VmZml4JHByb2dyYW1fdHJhbnNmb3JtX25hbWUiID0gXAorICAgIE5PTkVOT05Fcyx4LHgsICYmCisgIHByb2dyYW1fcHJlZml4PSR7dGFyZ2V0X2FsaWFzfS0KKworCisKKworCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWdjYyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZ2NjK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9nY2M7CitmaQorCisgICAgVl9DQ09QVD0iLU8iCisgICAgVl9JTkNMUz0iIgorICAgIGlmIHRlc3QgIiR7c3JjZGlyfSIgIT0gIi4iIDsgdGhlbgorCSAgICBWX0lOQ0xTPSItSVwkKHNyY2RpcikiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIke0NGTEFHUytzZXR9IiA9IHNldDsgdGhlbgorCSAgICBMQkxfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgIGZpCisgICAgaWYgdGVzdCAteiAiJENDIiA7IHRoZW4KKwkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkgICAgYnNkaSopCisJCSAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInNobGljYzIiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IHNobGljYzI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX1NITElDQzIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkU0hMSUNDMiI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19TSExJQ0MyPSIkU0hMSUNDMiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1NITElDQzI9InllcyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICB0ZXN0IC16ICIkYWNfY3ZfcHJvZ19TSExJQ0MyIiAmJiBhY19jdl9wcm9nX1NITElDQzI9Im5vIgorZmkKK2ZpCitTSExJQ0MyPSRhY19jdl9wcm9nX1NITElDQzIKK2lmIHRlc3QgLW4gIiRTSExJQ0MyIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFNITElDQzIiID4mNQorJGFzX2VjaG8gIiRTSExJQ0MyIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKwkJICAgIGlmIHRlc3QgJFNITElDQzIgPSB5ZXMgOyB0aGVuCisJCQkgICAgQ0M9c2hsaWNjMgorCQkJICAgIGV4cG9ydCBDQworCQkgICAgZmkKKwkJICAgIDs7CisJICAgIGVzYWMKKyAgICBmaQorICAgIGlmIHRlc3QgLXogIiRDQyIgLWEgIiR3aXRoX2djYyIgPSBubyA7IHRoZW4KKwkgICAgQ0M9Y2MKKwkgICAgZXhwb3J0IENDCisgICAgZmkKKworYWNfZXh0PWMKK2FjX2NwcD0nJENQUCAkQ1BQRkxBR1MnCithY19jb21waWxlPSckQ0MgLWMgJENGTEFHUyAkQ1BQRkxBR1MgY29uZnRlc3QuJGFjX2V4dCA+JjUnCithY19saW5rPSckQ0MgLW8gY29uZnRlc3QkYWNfZXhlZXh0ICRDRkxBR1MgJENQUEZMQUdTICRMREZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgJExJQlMgPiY1JworYWNfY29tcGlsZXJfZ251PSRhY19jdl9jX2NvbXBpbGVyX2dudQoraWYgdGVzdCAtbiAiJGFjX3Rvb2xfcHJlZml4IjsgdGhlbgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgIiR7YWNfdG9vbF9wcmVmaXh9Z2NjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfQ0M9IiRDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0NDPSIke2FjX3Rvb2xfcHJlZml4fWdjYyIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitDQz0kYWNfY3ZfcHJvZ19DQworaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJENDIiA+JjUKKyRhc19lY2hvICIkQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworZmkKK2lmIHRlc3QgLXogIiRhY19jdl9wcm9nX0NDIjsgdGhlbgorICBhY19jdF9DQz0kQ0MKKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19jdF9DQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0NDPSJnY2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorYWNfY3RfQ0M9JGFjX2N2X3Byb2dfYWNfY3RfQ0MKK2lmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdF9DQyIgPiY1CiskYXNfZWNobyAiJGFjX2N0X0NDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfQ0MiID0geDsgdGhlbgorICAgIENDPSIiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgQ0M9JGFjX2N0X0NDCisgIGZpCitlbHNlCisgIENDPSIkYWNfY3ZfcHJvZ19DQyIKK2ZpCisKK2lmIHRlc3QgLXogIiRDQyI7IHRoZW4KKyAgICAgICAgICBpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fWNjIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSAke2FjX3Rvb2xfcHJlZml4fWNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfQ0M9IiR7YWNfdG9vbF9wcmVmaXh9Y2MiCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgZmkKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19DQz0iJENDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKKyAgYWNfcHJvZ19yZWplY3RlZD1ubworYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgaWYgdGVzdCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPSAiL3Vzci91Y2IvY2MiOyB0aGVuCisgICAgICAgYWNfcHJvZ19yZWplY3RlZD15ZXMKKyAgICAgICBjb250aW51ZQorICAgICBmaQorICAgIGFjX2N2X3Byb2dfQ0M9ImNjIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitpZiB0ZXN0ICRhY19wcm9nX3JlamVjdGVkID0geWVzOyB0aGVuCisgICMgV2UgZm91bmQgYSBib2dvbiBpbiB0aGUgcGF0aCwgc28gbWFrZSBzdXJlIHdlIG5ldmVyIHVzZSBpdC4KKyAgc2V0IGR1bW15ICRhY19jdl9wcm9nX0NDCisgIHNoaWZ0CisgIGlmIHRlc3QgJCMgIT0gMDsgdGhlbgorICAgICMgV2UgY2hvc2UgYSBkaWZmZXJlbnQgY29tcGlsZXIgZnJvbSB0aGUgYm9ndXMgb25lLgorICAgICMgSG93ZXZlciwgaXQgaGFzIHRoZSBzYW1lIGJhc2VuYW1lLCBzbyB0aGUgYm9nb24gd2lsbCBiZSBjaG9zZW4KKyAgICAjIGZpcnN0IGlmIHdlIHNldCBDQyB0byBqdXN0IHRoZSBiYXNlbmFtZTsgdXNlIHRoZSBmdWxsIGZpbGUgbmFtZS4KKyAgICBzaGlmdAorICAgIGFjX2N2X3Byb2dfQ0M9IiRhc19kaXIvJGFjX3dvcmQkezErJyAnfSRAIgorICBmaQorZmkKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGlmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgZm9yIGFjX3Byb2cgaW4gY2wuZXhlCisgIGRvCisgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfdG9vbF9wcmVmaXgkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2c7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX0NDK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAtbiAiJENDIjsgdGhlbgorICBhY19jdl9wcm9nX0NDPSIkQ0MiICMgTGV0IHRoZSB1c2VyIG92ZXJyaWRlIHRoZSB0ZXN0LgorZWxzZQorYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICBpZiB7IHRlc3QgLWYgIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiICYmICRhc190ZXN0X3ggIiRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiOyB9OyB0aGVuCisgICAgYWNfY3ZfcHJvZ19DQz0iJGFjX3Rvb2xfcHJlZml4JGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorQ0M9JGFjX2N2X3Byb2dfQ0MKK2lmIHRlc3QgLW4gIiRDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDQyIgPiY1CiskYXNfZWNobyAiJENDIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisKKyAgICB0ZXN0IC1uICIkQ0MiICYmIGJyZWFrCisgIGRvbmUKK2ZpCitpZiB0ZXN0IC16ICIkQ0MiOyB0aGVuCisgIGFjX2N0X0NDPSRDQworICBmb3IgYWNfcHJvZyBpbiBjbC5leGUKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9DQytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRhY19jdF9DQyI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19hY19jdF9DQz0iJGFjX2N0X0NDIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfYWNfY3RfQ0M9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X0NDPSRhY19jdl9wcm9nX2FjX2N0X0NDCitpZiB0ZXN0IC1uICIkYWNfY3RfQ0MiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdF9DQyIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRhY19jdF9DQyIgJiYgYnJlYWsKK2RvbmUKKworICBpZiB0ZXN0ICJ4JGFjX2N0X0NDIiA9IHg7IHRoZW4KKyAgICBDQz0iIgorICBlbHNlCisgICAgY2FzZSAkY3Jvc3NfY29tcGlsaW5nOiRhY190b29sX3dhcm5lZCBpbgoreWVzOikKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiYyO30KK2FjX3Rvb2xfd2FybmVkPXllcyA7OworZXNhYworICAgIENDPSRhY19jdF9DQworICBmaQorZmkKKworZmkKKworCit0ZXN0IC16ICIkQ0MiICYmIHsgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgQyBjb21waWxlciBmb3VuZCBpbiBcJFBBVEgKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorCisjIFByb3ZpZGUgc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGlsZXIuCiskYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQyBjb21waWxlciB2ZXJzaW9uIiA+JjUKK3NldCBYICRhY19jb21waWxlCithY19jb21waWxlcj0kMgorZm9yIGFjX29wdGlvbiBpbiAtLXZlcnNpb24gLXYgLVYgLXF2ZXJzaW9uOyBkbworICB7IHsgYWNfdHJ5PSIkYWNfY29tcGlsZXIgJGFjX29wdGlvbiA+JjUiCitjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgYWNfdHJ5X2VjaG89IlwiXCRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogJGFjX3RyeV9lY2hvXCIiCiskYXNfZWNobyAiJGFjX3RyeV9lY2hvIjsgfSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlciAkYWNfb3B0aW9uID4mNSIpIDI+Y29uZnRlc3QuZXJyCisgIGFjX3N0YXR1cz0kPworICBpZiB0ZXN0IC1zIGNvbmZ0ZXN0LmVycjsgdGhlbgorICAgIHNlZCAnMTBhXAorLi4uIHJlc3Qgb2Ygc3RkZXJyIG91dHB1dCBkZWxldGVkIC4uLgorICAgICAgICAgMTBxJyBjb25mdGVzdC5lcnIgPmNvbmZ0ZXN0LmVyMQorICAgIGNhdCBjb25mdGVzdC5lcjEgPiY1CisgIGZpCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMSBjb25mdGVzdC5lcnIKKyAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIHRlc3QgJGFjX3N0YXR1cyA9IDA7IH0KK2RvbmUKKworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGIub3V0IgorIyBUcnkgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgd2l0aG91dCAtbyBmaXJzdCwgZGlzcmVnYXJkIGEub3V0LgorIyBJdCB3aWxsIGhlbHAgdXMgZGlhZ25vc2UgYnJva2VuIGNvbXBpbGVycywgYW5kIGZpbmRpbmcgb3V0IGFuIGludHVpdGlvbgorIyBvZiBleGVleHQuCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgd29ya3MiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciB3b3Jrcy4uLiAiID4mNjsgfQorYWNfbGlua19kZWZhdWx0PWAkYXNfZWNobyAiJGFjX2xpbmsiIHwgc2VkICdzLyAtbyAqY29uZnRlc3RbXiBdKi8vJ2AKKworIyBUaGUgcG9zc2libGUgb3V0cHV0IGZpbGVzOgorYWNfZmlsZXM9ImEub3V0IGNvbmZ0ZXN0LmV4ZSBjb25mdGVzdCBhLmV4ZSBhX291dC5leGUgYi5vdXQgY29uZnRlc3QuKiIKKworYWNfcm1maWxlcz0KK2ZvciBhY19maWxlIGluICRhY19maWxlcworZG8KKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkgOzsKKyAgICAqICkgYWNfcm1maWxlcz0iJGFjX3JtZmlsZXMgJGFjX2ZpbGUiOzsKKyAgZXNhYworZG9uZQorcm0gLWYgJGFjX3JtZmlsZXMKKworaWYgeyB7IGFjX3RyeT0iJGFjX2xpbmtfZGVmYXVsdCIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmtfZGVmYXVsdCIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgIyBBdXRvY29uZi0yLjEzIGNvdWxkIHNldCB0aGUgYWNfY3ZfZXhlZXh0IHZhcmlhYmxlIHRvIGBubycuCisjIFNvIGlnbm9yZSBhIHZhbHVlIG9mIGBubycsIG90aGVyd2lzZSB0aGlzIHdvdWxkIGxlYWQgdG8gYEVYRUVYVCA9IG5vJworIyBpbiBhIE1ha2VmaWxlLiAgV2Ugc2hvdWxkIG5vdCBvdmVycmlkZSBhY19jdl9leGVleHQgaWYgaXQgd2FzIGNhY2hlZCwKKyMgc28gdGhhdCB0aGUgdXNlciBjYW4gc2hvcnQtY2lyY3VpdCB0aGlzIHRlc3QgZm9yIGNvbXBpbGVycyB1bmtub3duIHRvCisjIEF1dG9jb25mLgorZm9yIGFjX2ZpbGUgaW4gJGFjX2ZpbGVzICcnCitkbworICB0ZXN0IC1mICIkYWNfZmlsZSIgfHwgY29udGludWUKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAgICouJGFjX2V4dCB8ICoueGNvZmYgfCAqLnRkcyB8ICouZCB8ICoucGRiIHwgKi54U1lNIHwgKi5iYiB8ICouYmJnIHwgKi5tYXAgfCAqLmluZiB8ICouZFNZTSB8ICoubyB8ICoub2JqICkKKwk7OworICAgIFthYl0ub3V0ICkKKwkjIFdlIGZvdW5kIHRoZSBkZWZhdWx0IGV4ZWN1dGFibGUsIGJ1dCBleGVleHQ9JycgaXMgbW9zdAorCSMgY2VydGFpbmx5IHJpZ2h0LgorCWJyZWFrOzsKKyAgICAqLiogKQorCWlmIHRlc3QgIiR7YWNfY3ZfZXhlZXh0K3NldH0iID0gc2V0ICYmIHRlc3QgIiRhY19jdl9leGVleHQiICE9IG5vOworCXRoZW4gOjsgZWxzZQorCSAgIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCWZpCisJIyBXZSBzZXQgYWNfY3ZfZXhlZXh0IGhlcmUgYmVjYXVzZSB0aGUgbGF0ZXIgdGVzdCBmb3IgaXQgaXMgbm90CisJIyBzYWZlOiBjcm9zcyBjb21waWxlcnMgbWF5IG5vdCBhZGQgdGhlIHN1ZmZpeCBpZiBnaXZlbiBhbiBgLW8nCisJIyBhcmd1bWVudCwgc28gd2UgbWF5IG5lZWQgdG8ga25vdyBpdCBhdCB0aGF0IHBvaW50IGFscmVhZHkuCisJIyBFdmVuIGlmIHRoaXMgc2VjdGlvbiBsb29rcyBjcnVmdHk6IGl0IGhhcyB0aGUgYWR2YW50YWdlIG9mCisJIyBhY3R1YWxseSB3b3JraW5nLgorCWJyZWFrOzsKKyAgICAqICkKKwlicmVhazs7CisgIGVzYWMKK2RvbmUKK3Rlc3QgIiRhY19jdl9leGVleHQiID0gbm8gJiYgYWNfY3ZfZXhlZXh0PQorCitlbHNlCisgIGFjX2ZpbGU9JycKK2ZpCitpZiB0ZXN0IC16ICIkYWNfZmlsZSI7IHRoZW4gOgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyRhc19lY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCit7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yIDc3ICJDIGNvbXBpbGVyIGNhbm5vdCBjcmVhdGUgZXhlY3V0YWJsZXMKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBDIGNvbXBpbGVyIGRlZmF1bHQgb3V0cHV0IGZpbGUgbmFtZS4uLiAiID4mNjsgfQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYWNfZmlsZSIgPiY2OyB9CithY19leGVleHQ9JGFjX2N2X2V4ZWV4dAorCitybSAtZiAtciBhLm91dCBhLm91dC5kU1lNIGEuZXhlIGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBiLm91dAorYWNfY2xlYW5fZmlsZXM9JGFjX2NsZWFuX2ZpbGVzX3NhdmUKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHN1ZmZpeCBvZiBleGVjdXRhYmxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc3VmZml4IG9mIGV4ZWN1dGFibGVzLi4uICIgPiY2OyB9CitpZiB7IHsgYWNfdHJ5PSIkYWNfbGluayIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgdGVzdCAkYWNfc3RhdHVzID0gMDsgfTsgdGhlbiA6CisgICMgSWYgYm90aCBgY29uZnRlc3QuZXhlJyBhbmQgYGNvbmZ0ZXN0JyBhcmUgYHByZXNlbnQnICh3ZWxsLCBvYnNlcnZhYmxlKQorIyBjYXRjaCBgY29uZnRlc3QuZXhlJy4gIEZvciBpbnN0YW5jZSB3aXRoIEN5Z3dpbiwgYGxzIGNvbmZ0ZXN0JyB3aWxsCisjIHdvcmsgcHJvcGVybHkgKGkuZS4sIHJlZmVyIHRvIGBjb25mdGVzdC5leGUnKSwgd2hpbGUgaXQgd29uJ3Qgd2l0aAorIyBgcm0nLgorZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QuZXhlIGNvbmZ0ZXN0IGNvbmZ0ZXN0Lio7IGRvCisgIHRlc3QgLWYgIiRhY19maWxlIiB8fCBjb250aW51ZQorICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNIHwgKi5vIHwgKi5vYmogKSA7OworICAgICouKiApIGFjX2N2X2V4ZWV4dD1gZXhwciAiJGFjX2ZpbGUiIDogJ1teLl0qXChcLi4qXCknYAorCSAgYnJlYWs7OworICAgICogKSBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiY2Fubm90IGNvbXB1dGUgc3VmZml4IG9mIGV4ZWN1dGFibGVzOiBjYW5ub3QgY29tcGlsZSBhbmQgbGluaworU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscyIgIiRMSU5FTk8iIDUgOyB9CitmaQorcm0gLWYgY29uZnRlc3QgY29uZnRlc3QkYWNfY3ZfZXhlZXh0Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2V4ZWV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2V4ZWV4dCIgPiY2OyB9CisKK3JtIC1mIGNvbmZ0ZXN0LiRhY19leHQKK0VYRUVYVD0kYWNfY3ZfZXhlZXh0CithY19leGVleHQ9JEVYRUVYVAorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKK0ZJTEUgKmYgPSBmb3BlbiAoImNvbmZ0ZXN0Lm91dCIsICJ3Iik7CisgcmV0dXJuIGZlcnJvciAoZikgfHwgZmNsb3NlIChmKSAhPSAwOworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSIkYWNfY2xlYW5fZmlsZXMgY29uZnRlc3Qub3V0IgorIyBDaGVjayB0aGF0IHRoZSBjb21waWxlciBwcm9kdWNlcyBleGVjdXRhYmxlcyB3ZSBjYW4gcnVuLiAgSWYgbm90LCBlaXRoZXIKKyMgdGhlIGNvbXBpbGVyIGlzIGJyb2tlbiwgb3Igd2UgY3Jvc3MgY29tcGlsZS4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgY3Jvc3MgY29tcGlsaW5nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIGNyb3NzIGNvbXBpbGluZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgIT0geWVzOyB0aGVuCisgIHsgeyBhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfbGluayIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9CisgIGlmIHsgYWNfdHJ5PScuL2NvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCcKKyAgeyB7IGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCBhY190cnlfZWNobz0iXCJcJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiAkYWNfdHJ5X2VjaG9cIiIKKyRhc19lY2hvICIkYWNfdHJ5X2VjaG8iOyB9ID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB9OyB0aGVuCisgICAgY3Jvc3NfY29tcGlsaW5nPW5vCisgIGVsc2UKKyAgICBpZiB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IG1heWJlOyB0aGVuCisJY3Jvc3NfY29tcGlsaW5nPXllcworICAgIGVsc2UKKwl7IHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiYyO30KK2FzX2ZuX2Vycm9yICQ/ICJjYW5ub3QgcnVuIEMgY29tcGlsZWQgcHJvZ3JhbXMuCitJZiB5b3UgbWVhbnQgdG8gY3Jvc3MgY29tcGlsZSwgdXNlIFxgLS1ob3N0Jy4KK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorICAgIGZpCisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRjcm9zc19jb21waWxpbmciID4mNQorJGFzX2VjaG8gIiRjcm9zc19jb21waWxpbmciID4mNjsgfQorCitybSAtZiBjb25mdGVzdC4kYWNfZXh0IGNvbmZ0ZXN0JGFjX2N2X2V4ZWV4dCBjb25mdGVzdC5vdXQKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzdWZmaXggb2Ygb2JqZWN0IGZpbGVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X29iamV4dCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QubyBjb25mdGVzdC5vYmoKK2lmIHsgeyBhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsIGFjX3RyeV9lY2hvPSJcIlwkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY190cnlfZWNob1wiIgorJGFzX2VjaG8gIiRhY190cnlfZWNobyI7IH0gPiY1CisgIChldmFsICIkYWNfY29tcGlsZSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICB0ZXN0ICRhY19zdGF0dXMgPSAwOyB9OyB0aGVuIDoKKyAgZm9yIGFjX2ZpbGUgaW4gY29uZnRlc3QubyBjb25mdGVzdC5vYmogY29uZnRlc3QuKjsgZG8KKyAgdGVzdCAtZiAiJGFjX2ZpbGUiIHx8IGNvbnRpbnVlOworICBjYXNlICRhY19maWxlIGluCisgICAgKi4kYWNfZXh0IHwgKi54Y29mZiB8ICoudGRzIHwgKi5kIHwgKi5wZGIgfCAqLnhTWU0gfCAqLmJiIHwgKi5iYmcgfCAqLm1hcCB8ICouaW5mIHwgKi5kU1lNICkgOzsKKyAgICAqKSBhY19jdl9vYmpleHQ9YGV4cHIgIiRhY19maWxlIiA6ICcuKlwuXCguKlwpJ2AKKyAgICAgICBicmVhazs7CisgIGVzYWMKK2RvbmUKK2Vsc2UKKyAgJGFzX2VjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKK3sgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mNQorJGFzX2VjaG8gIiRhc19tZTogZXJyb3I6IGluIFxgJGFjX3B3ZCc6IiA+JjI7fQorYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjb21wdXRlIHN1ZmZpeCBvZiBvYmplY3QgZmlsZXM6IGNhbm5vdCBjb21waWxlCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK2ZpCitybSAtZiBjb25mdGVzdC4kYWNfY3Zfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X29iamV4dCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X29iamV4dCIgPiY2OyB9CitPQkpFWFQ9JGFjX2N2X29iamV4dAorYWNfb2JqZXh0PSRPQkpFWFQKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgdGhlIEdOVSBDIGNvbXBpbGVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgYXJlIHVzaW5nIHRoZSBHTlUgQyBjb21waWxlci4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9jX2NvbXBpbGVyX2dudStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CisjaWZuZGVmIF9fR05VQ19fCisgICAgICAgY2hva2UgbWUKKyNlbmRpZgorCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY29tcGlsZXJfZ251PXllcworZWxzZQorICBhY19jb21waWxlcl9nbnU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2FjX2N2X2NfY29tcGlsZXJfZ251PSRhY19jb21waWxlcl9nbnUKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfY19jb21waWxlcl9nbnUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9jX2NvbXBpbGVyX2dudSIgPiY2OyB9CitpZiB0ZXN0ICRhY19jb21waWxlcl9nbnUgPSB5ZXM7IHRoZW4KKyAgR0NDPXllcworZWxzZQorICBHQ0M9CitmaQorYWNfdGVzdF9DRkxBR1M9JHtDRkxBR1Mrc2V0fQorYWNfc2F2ZV9DRkxBR1M9JENGTEFHUworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyICRDQyBhY2NlcHRzIC1nIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgJENDIGFjY2VwdHMgLWcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19jY19nK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfc2F2ZV9jX3dlcnJvcl9mbGFnPSRhY19jX3dlcnJvcl9mbGFnCisgICBhY19jX3dlcnJvcl9mbGFnPXllcworICAgYWNfY3ZfcHJvZ19jY19nPW5vCisgICBDRkxBR1M9Ii1nIgorICAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2Vsc2UKKyAgQ0ZMQUdTPSIiCisgICAgICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKKwkgQ0ZMQUdTPSItZyIKKwkgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3Byb2dfY2NfZz15ZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgIGFjX2Nfd2Vycm9yX2ZsYWc9JGFjX3NhdmVfY193ZXJyb3JfZmxhZworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcHJvZ19jY19nIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcHJvZ19jY19nIiA+JjY7IH0KK2lmIHRlc3QgIiRhY190ZXN0X0NGTEFHUyIgPSBzZXQ7IHRoZW4KKyAgQ0ZMQUdTPSRhY19zYXZlX0NGTEFHUworZWxpZiB0ZXN0ICRhY19jdl9wcm9nX2NjX2cgPSB5ZXM7IHRoZW4KKyAgaWYgdGVzdCAiJEdDQyIgPSB5ZXM7IHRoZW4KKyAgICBDRkxBR1M9Ii1nIC1PMiIKKyAgZWxzZQorICAgIENGTEFHUz0iLWciCisgIGZpCitlbHNlCisgIGlmIHRlc3QgIiRHQ0MiID0geWVzOyB0aGVuCisgICAgQ0ZMQUdTPSItTzIiCisgIGVsc2UKKyAgICBDRkxBR1M9CisgIGZpCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJENDIG9wdGlvbiB0byBhY2NlcHQgSVNPIEM4OS4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX2NjX2M4OStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2N2X3Byb2dfY2NfYzg5PW5vCithY19zYXZlX0NDPSRDQworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKy8qIE1vc3Qgb2YgdGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgc3RvbGVuIGZyb20gUkNTIDUuNydzIHNyYy9jb25mLnNoLiAgKi8KK3N0cnVjdCBidWYgeyBpbnQgeDsgfTsKK0ZJTEUgKiAoKnJjc29wZW4pIChzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCk7CitzdGF0aWMgY2hhciAqZSAocCwgaSkKKyAgICAgY2hhciAqKnA7CisgICAgIGludCBpOworeworICByZXR1cm4gcFtpXTsKK30KK3N0YXRpYyBjaGFyICpmIChjaGFyICogKCpnKSAoY2hhciAqKiwgaW50KSwgY2hhciAqKnAsIC4uLikKK3sKKyAgY2hhciAqczsKKyAgdmFfbGlzdCB2OworICB2YV9zdGFydCAodixwKTsKKyAgcyA9IGcgKHAsIHZhX2FyZyAodixpbnQpKTsKKyAgdmFfZW5kICh2KTsKKyAgcmV0dXJuIHM7Cit9CisKKy8qIE9TRiA0LjAgQ29tcGFxIGNjIGlzIHNvbWUgc29ydCBvZiBhbG1vc3QtQU5TSSBieSBkZWZhdWx0LiAgSXQgaGFzCisgICBmdW5jdGlvbiBwcm90b3R5cGVzIGFuZCBzdHVmZiwgYnV0IG5vdCAnXHhISCcgaGV4IGNoYXJhY3RlciBjb25zdGFudHMuCisgICBUaGVzZSBkb24ndCBwcm92b2tlIGFuIGVycm9yIHVuZm9ydHVuYXRlbHksIGluc3RlYWQgYXJlIHNpbGVudGx5IHRyZWF0ZWQKKyAgIGFzICd4Jy4gIFRoZSBmb2xsb3dpbmcgaW5kdWNlcyBhbiBlcnJvciwgdW50aWwgLXN0ZCBpcyBhZGRlZCB0byBnZXQKKyAgIHByb3BlciBBTlNJIG1vZGUuICBDdXJpb3VzbHkgJ1x4MDAnIT0neCcgYWx3YXlzIGNvbWVzIG91dCB0cnVlLCBmb3IgYW4KKyAgIGFycmF5IHNpemUgYXQgbGVhc3QuICBJdCdzIG5lY2Vzc2FyeSB0byB3cml0ZSAnXHgwMCc9PTAgdG8gZ2V0IHNvbWV0aGluZworICAgdGhhdCdzIHRydWUgb25seSB3aXRoIC1zdGQuICAqLworaW50IG9zZjRfY2NfYXJyYXkgWydceDAwJyA9PSAwID8gMSA6IC0xXTsKKworLyogSUJNIEMgNiBmb3IgQUlYIGlzIGFsbW9zdC1BTlNJIGJ5IGRlZmF1bHQsIGJ1dCBpdCByZXBsYWNlcyBtYWNybyBwYXJhbWV0ZXJzCisgICBpbnNpZGUgc3RyaW5ncyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gICovCisjZGVmaW5lIEZPTyh4KSAneCcKK2ludCB4bGM2X2NjX2FycmF5W0ZPTyhhKSA9PSAneCcgPyAxIDogLTFdOworCitpbnQgdGVzdCAoaW50IGksIGRvdWJsZSB4KTsKK3N0cnVjdCBzMSB7aW50ICgqZikgKGludCBhKTt9Oworc3RydWN0IHMyIHtpbnQgKCpmKSAoZG91YmxlIGEpO307CitpbnQgcGFpcm5hbWVzIChpbnQsIGNoYXIgKiosIEZJTEUgKigqKShzdHJ1Y3QgYnVmICosIHN0cnVjdCBzdGF0ICosIGludCksIGludCwgaW50KTsKK2ludCBhcmdjOworY2hhciAqKmFyZ3Y7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBmIChlLCBhcmd2LCAwKSAhPSBhcmd2WzBdICB8fCAgZiAoZSwgYXJndiwgMSkgIT0gYXJndlsxXTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2FyZyBpbiAnJyAtcWxhbmdsdmw9ZXh0Yzg5IC1xbGFuZ2x2bD1hbnNpIC1zdGQgXAorCS1BZSAiLUFhIC1EX0hQVVhfU09VUkNFIiAiLVhjIC1EX19FWFRFTlNJT05TX18iCitkbworICBDQz0iJGFjX3NhdmVfQ0MgJGFjX2FyZyIKKyAgaWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9wcm9nX2NjX2M4OT0kYWNfYXJnCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorICB0ZXN0ICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiAhPSAieG5vIiAmJiBicmVhaworZG9uZQorcm0gLWYgY29uZnRlc3QuJGFjX2V4dAorQ0M9JGFjX3NhdmVfQ0MKKworZmkKKyMgQUNfQ0FDSEVfVkFMCitjYXNlICJ4JGFjX2N2X3Byb2dfY2NfYzg5IiBpbgorICB4KQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBub25lIG5lZWRlZCIgPiY1CiskYXNfZWNobyAibm9uZSBuZWVkZWQiID4mNjsgfSA7OworICB4bm8pCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHVuc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICJ1bnN1cHBvcnRlZCIgPiY2OyB9IDs7CisgICopCisgICAgQ0M9IiRDQyAkYWNfY3ZfcHJvZ19jY19jODkiCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2M4OSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3Byb2dfY2NfYzg5IiA+JjY7IH0gOzsKK2VzYWMKK2lmIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9IHhubzsgdGhlbiA6CisKK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCisKKworCisgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJICAgIGlmIHRlc3QgIiRTSExJQ0MyIiA9IHllcyA7IHRoZW4KKwkJICAgIGFjX2N2X2xibF9nY2NfdmVycz0yCisJCSAgICBWX0NDT1BUPSItTzIiCisJICAgIGVsc2UKKwkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZ2NjIHZlcnNpb24iID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZ2NjIHZlcnNpb24uLi4gIiA+JjY7IH0KKwkJICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2djY192ZXJzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY3ZfbGJsX2djY192ZXJzPWAkQ0MgLXYgMj4mMSB8IFwKKwkJCSAgICBzZWQgLWUgJy9eZ2NjIHZlcnNpb24gLyFkJyBcCisJCQkJLWUgJ3MvXmdjYyB2ZXJzaW9uIC8vJyBcCisJCQkJLWUgJ3MvIC4qLy8nIC1lICdzL15bXjAtOV0qLy8nIFwKKwkJCQktZSAncy9cLi4qLy8nYAorZmkKKworCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9sYmxfZ2NjX3ZlcnMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfZ2NjX3ZlcnMiID4mNjsgfQorCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY192ZXJzIC1ndCAxIDsgdGhlbgorCQkJICAgIFZfQ0NPUFQ9Ii1PMiIKKwkJICAgIGZpCisJICAgIGZpCisgICAgZWxzZQorCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHRoYXQgJENDIGhhbmRsZXMgYW5zaSBwcm90b3R5cGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHRoYXQgJENDIGhhbmRsZXMgYW5zaSBwcm90b3R5cGVzLi4uICIgPiY2OyB9CisJICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworaW50IGZyb2IoaW50LCBjaGFyICopCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9jY19hbnNpX3Byb3RvdHlwZXMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfY2NfYW5zaV9wcm90b3R5cGVzIiA+JjY7IH0KKwkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2NjX2Fuc2lfcHJvdG90eXBlcyA9IG5vIDsgdGhlbgorCQkgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisKKwkJICAgIGhwdXgqKQorCQkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEhQLVVYIGFuc2kgY29tcGlsZXIgKCRDQyAtQWEgLURfSFBVWF9TT1VSQ0UpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBIUC1VWCBhbnNpIGNvbXBpbGVyICgkQ0MgLUFhIC1EX0hQVVhfU09VUkNFKS4uLiAiID4mNjsgfQorCQkJICAgIHNhdmVkY2ZsYWdzPSIkQ0ZMQUdTIgorCQkJICAgIENGTEFHUz0iLUFhIC1EX0hQVVhfU09VUkNFICRDRkxBR1MiCisJCQkgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfY2NfaHB1eF9jY19hYStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworaW50IGZyb2IoaW50LCBjaGFyICopCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2NjX2hwdXhfY2NfYWE9eWVzCitlbHNlCisgIGFjX2N2X2xibF9jY19ocHV4X2NjX2FhPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisJCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9jY19ocHV4X2NjX2FhIiA+JjY7IH0KKwkJCSAgICBpZiB0ZXN0ICRhY19jdl9sYmxfY2NfaHB1eF9jY19hYSA9IG5vIDsgdGhlbgorCQkJCSAgICBhc19mbl9lcnJvciAkPyAic2VlIHRoZSBJTlNUQUxMIGRvYyBmb3IgbW9yZSBpbmZvIiAiJExJTkVOTyIgNQorCQkJICAgIGZpCisJCQkgICAgQ0ZMQUdTPSIkc2F2ZWRjZmxhZ3MiCisJCQkgICAgVl9DQ09QVD0iLUFhICRWX0NDT1BUIgorCiskYXNfZWNobyAiI2RlZmluZSBfSFBVWF9TT1VSQ0UgMSIgPj5jb25mZGVmcy5oCisKKwkJCSAgICA7OworCisJCSAgICBvc2YqKQorCQkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGFuc2kgbW9kZSBpbiBERUMgY29tcGlsZXIgKCRDQyAtc3RkMSkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGFuc2kgbW9kZSBpbiBERUMgY29tcGlsZXIgKCRDQyAtc3RkMSkuLi4gIiA+JjY7IH0KKwkJCSAgICBzYXZlZGNmbGFncz0iJENGTEFHUyIKKwkJCSAgICBDRkxBR1M9Ii1zdGQxIgorCQkJICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2NjX29zZjFfY2Nfc3RkMStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KK2ludAorbWFpbiAoKQoreworaW50IGZyb2IoaW50LCBjaGFyICopCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2NjX29zZjFfY2Nfc3RkMT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGJsX2NjX29zZjFfY2Nfc3RkMT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCQkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2NjX29zZjFfY2Nfc3RkMSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9jY19vc2YxX2NjX3N0ZDEiID4mNjsgfQorCQkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9jY19vc2YxX2NjX3N0ZDEgPSBubyA7IHRoZW4KKwkJCQkgICAgYXNfZm5fZXJyb3IgJD8gInNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgIiRMSU5FTk8iIDUKKwkJCSAgICBmaQorCQkJICAgIENGTEFHUz0iJHNhdmVkY2ZsYWdzIgorCQkJICAgIFZfQ0NPUFQ9Ii1zdGQxICRWX0NDT1BUIgorCQkJICAgIDs7CisKKwkJICAgICopCisJCQkgICAgYXNfZm5fZXJyb3IgJD8gInNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbyIgIiRMSU5FTk8iIDUKKwkJCSAgICA7OworCQkgICAgZXNhYworCSAgICBmaQorCSAgICBWX0lOQ0xTPSIkVl9JTkNMUyAtSS91c3IvbG9jYWwvaW5jbHVkZSIKKwkgICAgTERGTEFHUz0iJExERkxBR1MgLUwvdXNyL2xvY2FsL2xpYiIKKworCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KKworCSAgICBpcml4KikKKwkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC14YW5zaSAtc2lnbmVkIC1nMyIKKwkJICAgIDs7CisKKwkgICAgb3NmKikKKwkgICAgCSAgICAjCisJCSAgICAjIFByZXN1bWVkIHRvIGJlIERFQyBPU0YvMSwgRGlnaXRhbCBVTklYLCBvcgorCQkgICAgIyBUcnU2NCBVTklYLgorCQkgICAgIworCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLWczIgorCQkgICAgOzsKKworCSAgICB1bHRyaXgqKQorCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB0aGF0IFVsdHJpeCAkQ0MgaGFja3MgY29uc3QgaW4gcHJvdG90eXBlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB0aGF0IFVsdHJpeCAkQ0MgaGFja3MgY29uc3QgaW4gcHJvdG90eXBlcy4uLiAiID4mNjsgfQorCQkgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfY2NfY29uc3RfcHJvdG8rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CitpbnQKK21haW4gKCkKK3sKK3N0cnVjdCBhIHsgaW50IGI7IH07CisJCQkgICAgdm9pZCBjKGNvbnN0IHN0cnVjdCBhICopCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvPXllcworZWxzZQorICBhY19jdl9sYmxfY2NfY29uc3RfcHJvdG89bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX2NjX2NvbnN0X3Byb3RvIiA+JjY7IH0KKwkJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9jY19jb25zdF9wcm90byA9IG5vIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBjb25zdCAvKiovIiA+PmNvbmZkZWZzLmgKKworCQkgICAgZmkKKwkJICAgIDs7CisJICAgIGVzYWMKKyAgICBmaQorCisKKyAgICBpZiB0ZXN0ICIkR0NDIiA9IHllcyA7IHRoZW4KKwkgICAgIworCSAgICAjIE9uIHBsYXRmb3JtcyB3aGVyZSB3ZSBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5OgorCSAgICAjCisJICAgICMJYWRkIG9wdGlvbnMgdG8gZ2VuZXJhdGUgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZSwKKwkgICAgIwlpZiBuZWNlc3NhcnkgKGl0J3MgdGhlIGRlZmF1bHQgaW4gQUlYIGFuZCBEYXJ3aW4vT1MgWCk7CisJICAgICMKKwkgICAgIwlkZWZpbmUgb3B0aW9uIHRvIHNldCB0aGUgc29uYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeSwKKwkgICAgIwlpZiB0aGUgT1Mgc3VwcG9ydHMgdGhhdDsKKwkgICAgIworCSAgICAjCWFkZCBvcHRpb25zIHRvIHNwZWNpZnksIGF0IGxpbmsgdGltZSwgYSBkaXJlY3RvcnkgdG8KKwkgICAgIwlhZGQgdG8gdGhlIHJ1bi10aW1lIHNlYXJjaCBwYXRoLCBpZiB0aGF0J3MgbmVjZXNzYXJ5LgorCSAgICAjCisJICAgIFZfU0hMSUJfQ01EPSJcJChDQykiCisJICAgIFZfU0hMSUJfT1BUPSItc2hhcmVkIgorCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KKworCSAgICBhaXgqKQorCQkgICAgOzsKKworCSAgICBmcmVlYnNkKnxuZXRic2QqfG9wZW5ic2QqfGRyYWdvbmZseSp8bGludXgqfG9zZiopCisJICAgIAkgICAgIworCQkgICAgIyBQbGF0Zm9ybXMgd2hlcmUgdGhlIGxpbmtlciBpcyB0aGUgR05VIGxpbmtlcgorCQkgICAgIyBvciBhY2NlcHRzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgbGlrZQorCQkgICAgIyB0aG9zZSB0aGUgR05VIGxpbmtlciBhY2NlcHRzLgorCQkgICAgIworCQkgICAgIyBTb21lIGluc3RydWN0aW9uIHNldHMgcmVxdWlyZSAtZlBJQyBvbiBzb21lCisJCSAgICAjIG9wZXJhdGluZyBzeXN0ZW1zLiAgQ2hlY2sgZm9yIHRoZW0uICBJZiB5b3UKKwkJICAgICMgaGF2ZSBhIGNvbWJpbmF0aW9uIHRoYXQgcmVxdWlyZXMgaXQsIGFkZCBpdAorCQkgICAgIyBoZXJlLgorCQkgICAgIworCQkgICAgUElDX09QVD0tZnBpYworCQkgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorCisJCSAgICBzcGFyYzY0KikKKwkJCWNhc2UgIiRob3N0X29zIiBpbgorCisJCQlmcmVlYnNkKikKKwkJCSAgICBQSUNfT1BUPS1mUElDCisJCQkgICAgOzsKKwkJCWVzYWMKKwkJCTs7CisJCSAgICBlc2FjCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAkUElDX09QVCIKKwkJICAgIFZfU09OQU1FX09QVD0iLVdsLC1zb25hbWUsIgorCQkgICAgVl9SUEFUSF9PUFQ9Ii1XbCwtcnBhdGgsIgorCQkgICAgOzsKKworCSAgICBocHV4KikKKwkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1mcGljIgorCSAgICAJICAgICMKKwkJICAgICMgWFhYIC0gdGhpcyBhc3N1bWVzIEdDQyBpcyB1c2luZyB0aGUgSFAgbGlua2VyLAorCQkgICAgIyByYXRoZXIgdGhhbiB0aGUgR05VIGxpbmtlciwgYW5kIHRoYXQgdGhlICIraCIKKwkJICAgICMgb3B0aW9uIGlzIHVzZWQgb24gYWxsIEhQLVVYIHBsYXRmb3JtcywgYm90aCAuc2wKKwkJICAgICMgYW5kIC5zby4KKwkJICAgICMKKwkJICAgIFZfU09OQU1FX09QVD0iLVdsLCtoLCIKKwkJICAgICMKKwkJICAgICMgQnkgZGVmYXVsdCwgZGlyZWN0b3JpZXMgc3BlY2lmZWQgd2l0aCAtTAorCQkgICAgIyBhcmUgYWRkZWQgdG8gdGhlIHJ1bi10aW1lIHNlYXJjaCBwYXRoLCBzbworCQkgICAgIyB3ZSBkb24ndCBhZGQgdGhlbSBpbiBwY2FwLWNvbmZpZy4KKwkJICAgICMKKwkJICAgIDs7CisKKwkgICAgc29sYXJpcyopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtZnBpYyIKKwkJICAgICMKKwkJICAgICMgWFhYIC0gdGhpcyBhc3N1bWVzIEdDQyBpcyB1c2luZyB0aGUgU3VuIGxpbmtlciwKKwkJICAgICMgcmF0aGVyIHRoYW4gdGhlIEdOVSBsaW5rZXIuCisJCSAgICAjCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1XbCwtaCwiCisJCSAgICBWX1JQQVRIX09QVD0iLVdsLC1SLCIKKwkJICAgIDs7CisJICAgIGVzYWMKKyAgICBlbHNlCisJICAgICMKKwkgICAgIyBTZXQgdGhlIGFwcHJvcHJpYXRlIGNvbXBpbGVyIGZsYWdzIGFuZCwgb24gcGxhdGZvcm1zCisJICAgICMgd2hlcmUgd2UgYnVpbGQgYSBzaGFyZWQgbGlicmFyeToKKwkgICAgIworCSAgICAjCWFkZCBvcHRpb25zIHRvIGdlbmVyYXRlIHBvc2l0aW9uLWluZGVwZW5kZW50IGNvZGUsCisJICAgICMJaWYgbmVjZXNzYXJ5IChpdCdzIHRoZSBkZWZhdWx0IGluIERhcndpbi9PUyBYKTsKKwkgICAgIworCSAgICAjCWlmIHdlIGdlbmVyYXRlICIuc28iIHNoYXJlZCBsaWJyYXJpZXMsIGRlZmluZSB0aGUKKwkgICAgIwlhcHByb3ByaWF0ZSBvcHRpb25zIGZvciBidWlsZGluZyB0aGUgc2hhcmVkIGxpYnJhcnk7CisJICAgICMKKwkgICAgIwlhZGQgb3B0aW9ucyB0byBzcGVjaWZ5LCBhdCBsaW5rIHRpbWUsIGEgZGlyZWN0b3J5IHRvCisJICAgICMJYWRkIHRvIHRoZSBydW4tdGltZSBzZWFyY2ggcGF0aCwgaWYgdGhhdCdzIG5lY2Vzc2FyeS4KKwkgICAgIworCSAgICAjIE5vdGU6IHNwYWNlcyBhZnRlciBWX1NPTkFNRV9PUFQgYXJlIHNpZ25pZmljYW50OyBvbgorCSAgICAjIHNvbWUgcGxhdGZvcm1zIHRoZSBzb25hbWUgaXMgcGFzc2VkIHdpdGggYSBHQ0MtbGlrZQorCSAgICAjICItV2wsLXNvbmFtZSx7c29uYW1lfSIgb3B0aW9uLCB3aXRoIHRoZSBzb25hbWUgcGFydAorCSAgICAjIG9mIHRoZSBvcHRpb24sIHdoaWxlIG9uIG90aGVyIHBsYXRmb3JtcyB0aGUgQyBjb21waWxlcgorCSAgICAjIGRyaXZlciB0YWtlcyBpdCBhcyBhIHJlZ3VsYXIgb3B0aW9uIHdpdGggdGhlIHNvbmFtZQorCSAgICAjIGZvbGxvd2luZyB0aGUgb3B0aW9uLiAgVGhlIHNhbWUgYXBwbGllcyB0byBWX1JQQVRIX09QVC4KKwkgICAgIworCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KKworCSAgICBhaXgqKQorCQkgICAgVl9TSExJQl9DTUQ9IlwkKENDKSIKKwkJICAgIFZfU0hMSUJfT1BUPSItRyAtYm5vZW50cnkgLWJleHBhbGwiCisJCSAgICA7OworCisJICAgIGZyZWVic2QqfG5ldGJzZCp8b3BlbmJzZCp8ZHJhZ29uZmx5KnxsaW51eCopCisJCSAgICAjCisJCSAgICAjICJjYyIgaXMgR0NDLgorCQkgICAgIworCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLWZwaWMiCisJCSAgICBWX1NITElCX0NNRD0iXCQoQ0MpIgorCQkgICAgVl9TSExJQl9PUFQ9Ii1zaGFyZWQiCisJCSAgICBWX1NPTkFNRV9PUFQ9Ii1XbCwtc29uYW1lLCIKKwkJICAgIFZfUlBBVEhfT1BUPSItV2wsLXJwYXRoLCIKKwkJICAgIDs7CisKKwkgICAgaHB1eCopCisJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAreiIKKwkJICAgIFZfU0hMSUJfQ01EPSJcJChMRCkiCisJCSAgICBWX1NITElCX09QVD0iLWIiCisJCSAgICBWX1NPTkFNRV9PUFQ9IitoICIKKwkJICAgICMKKwkJICAgICMgQnkgZGVmYXVsdCwgZGlyZWN0b3JpZXMgc3BlY2lmZWQgd2l0aCAtTAorCQkgICAgIyBhcmUgYWRkZWQgdG8gdGhlIHJ1bi10aW1lIHNlYXJjaCBwYXRoLCBzbworCQkgICAgIyB3ZSBkb24ndCBhZGQgdGhlbSBpbiBwY2FwLWNvbmZpZy4KKwkJICAgICMKKwkJICAgIDs7CisKKwkgICAgb3NmKikKKwkgICAgCSAgICAjCisJCSAgICAjIFByZXN1bWVkIHRvIGJlIERFQyBPU0YvMSwgRGlnaXRhbCBVTklYLCBvcgorCQkgICAgIyBUcnU2NCBVTklYLgorCQkgICAgIworCQkgICAgVl9TSExJQl9DTUQ9IlwkKENDKSIKKwkJICAgIFZfU0hMSUJfT1BUPSItc2hhcmVkIgorCQkgICAgVl9TT05BTUVfT1BUPSItc29uYW1lICIKKwkJICAgIFZfUlBBVEhfT1BUPSItcnBhdGggIgorCQkgICAgOzsKKworCSAgICBzb2xhcmlzKikKKwkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1LcGljIgorCQkgICAgVl9TSExJQl9DTUQ9IlwkKENDKSIKKwkJICAgIFZfU0hMSUJfT1BUPSItRyIKKwkJICAgIFZfU09OQU1FX09QVD0iLWggIgorCQkgICAgVl9SUEFUSF9PUFQ9Ii1SIgorCQkgICAgOzsKKwkgICAgZXNhYworICAgIGZpCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGlubGluZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgaW5saW5lLi4uICIgPiY2OyB9CisgICAgc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCisgICAgQ0ZMQUdTPSIkVl9DQ09QVCIKKyAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9pbmxpbmUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorCisJYWNfY3ZfbGJsX2lubGluZT0iIgorCWFjX2xibF9jY19pbmxpbmU9bm8KKwlmb3IgYWNfbGJsX2lubGluZSBpbiBpbmxpbmUgX19pbmxpbmVfXyBfX2lubGluZQorCWRvCisJICAgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgaW5saW5lICRhY19sYmxfaW5saW5lCisJCXN0YXRpYyBpbmxpbmUgc3RydWN0IGlsdGVzdCAqZm9vKHZvaWQpOworCQlzdHJ1Y3QgaWx0ZXN0IHsKKwkJICAgIGludCBpbHRlc3QxOworCQkgICAgaW50IGlsdGVzdDI7CisJCX07CisKKwkJc3RhdGljIGlubGluZSBzdHJ1Y3QgaWx0ZXN0ICoKKwkJZm9vKCkKKwkJeworCQkgICAgc3RhdGljIHN0cnVjdCBpbHRlc3QgeHh4OworCisJCSAgICByZXR1cm4gJnh4eDsKKwkJfQoraW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19sYmxfY2NfaW5saW5lPXllcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCSAgICBpZiB0ZXN0ICIkYWNfbGJsX2NjX2lubGluZSIgPSB5ZXMgOyB0aGVuCisJCWJyZWFrOworCSAgICBmaQorCWRvbmUKKwlpZiB0ZXN0ICIkYWNfbGJsX2NjX2lubGluZSIgPSB5ZXMgOyB0aGVuCisJICAgIGFjX2N2X2xibF9pbmxpbmU9JGFjX2xibF9pbmxpbmUKKwlmaQorZmkKKworICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorICAgIGlmIHRlc3QgISAteiAiJGFjX2N2X2xibF9pbmxpbmUiIDsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2lubGluZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9pbmxpbmUiID4mNjsgfQorICAgIGVsc2UKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKyAgICBmaQorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGlubGluZSAkYWNfY3ZfbGJsX2lubGluZQorX0FDRU9GCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgX19hdHRyaWJ1dGVfXyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgX19hdHRyaWJ1dGVfXy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9fX2F0dHJpYnV0ZV9fK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK3N0YXRpYyB2b2lkIGZvbyh2b2lkKSBfX2F0dHJpYnV0ZV9fICgobm9yZXR1cm4pKTsKKworc3RhdGljIHZvaWQKK2Zvbyh2b2lkKQoreworICBleGl0KDEpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBmb28oKTsKK30KKworX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X19fYXR0cmlidXRlX189eWVzCitlbHNlCisgIGFjX2N2X19fYXR0cmlidXRlX189bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKK2lmIHRlc3QgIiRhY19jdl9fX2F0dHJpYnV0ZV9fIiA9ICJ5ZXMiOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfX19BVFRSSUJVVEVfXyAxIiA+PmNvbmZkZWZzLmgKKworICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKVwiIgorZWxzZQorICBWX0RFRlM9IiRWX0RFRlMgLURfVV89XCJcIiIKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X19fYXR0cmlidXRlX18iID4mNQorJGFzX2VjaG8gIiRhY19jdl9fX2F0dHJpYnV0ZV9fIiA+JjY7IH0KKworCithY19leHQ9YworYWNfY3BwPSckQ1BQICRDUFBGTEFHUycKK2FjX2NvbXBpbGU9JyRDQyAtYyAkQ0ZMQUdTICRDUFBGTEFHUyBjb25mdGVzdC4kYWNfZXh0ID4mNScKK2FjX2xpbms9JyRDQyAtbyBjb25mdGVzdCRhY19leGVleHQgJENGTEFHUyAkQ1BQRkxBR1MgJExERkxBR1MgY29uZnRlc3QuJGFjX2V4dCAkTElCUyA+JjUnCithY19jb21waWxlcl9nbnU9JGFjX2N2X2NfY29tcGlsZXJfZ251Cit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yLi4uICIgPiY2OyB9CisjIE9uIFN1bnMsIHNvbWV0aW1lcyAkQ1BQIG5hbWVzIGEgZGlyZWN0b3J5LgoraWYgdGVzdCAtbiAiJENQUCIgJiYgdGVzdCAtZCAiJENQUCI7IHRoZW4KKyAgQ1BQPQorZmkKK2lmIHRlc3QgLXogIiRDUFAiOyB0aGVuCisgIGlmIHRlc3QgIiR7YWNfY3ZfcHJvZ19DUFArc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICAgICAgIyBEb3VibGUgcXVvdGVzIGJlY2F1c2UgQ1BQIG5lZWRzIHRvIGJlIGV4cGFuZGVkCisgICAgZm9yIENQUCBpbiAiJENDIC1FIiAiJENDIC1FIC10cmFkaXRpb25hbC1jcHAiICIvbGliL2NwcCIKKyAgICBkbworICAgICAgYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisgIGJyZWFrCitmaQorCisgICAgZG9uZQorICAgIGFjX2N2X3Byb2dfQ1BQPSRDUFAKKworZmkKKyAgQ1BQPSRhY19jdl9wcm9nX0NQUAorZWxzZQorICBhY19jdl9wcm9nX0NQUD0kQ1BQCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRDUFAiID4mNQorJGFzX2VjaG8gIiRDUFAiID4mNjsgfQorYWNfcHJlcHJvY19vaz1mYWxzZQorZm9yIGFjX2NfcHJlcHJvY193YXJuX2ZsYWcgaW4gJycgeWVzCitkbworICAjIFVzZSBhIGhlYWRlciBmaWxlIHRoYXQgY29tZXMgd2l0aCBnY2MsIHNvIGNvbmZpZ3VyaW5nIGdsaWJjCisgICMgd2l0aCBhIGZyZXNoIGNyb3NzLWNvbXBpbGVyIHdvcmtzLgorICAjIFByZWZlciA8bGltaXRzLmg+IHRvIDxhc3NlcnQuaD4gaWYgX19TVERDX18gaXMgZGVmaW5lZCwgc2luY2UKKyAgIyA8bGltaXRzLmg+IGV4aXN0cyBldmVuIG9uIGZyZWVzdGFuZGluZyBjb21waWxlcnMuCisgICMgT24gdGhlIE5lWFQsIGNjIC1FIHJ1bnMgdGhlIGNvZGUgdGhyb3VnaCB0aGUgY29tcGlsZXIncyBwYXJzZXIsCisgICMgbm90IGp1c3QgdGhyb3VnaCBjcHAuICJTeW50YXggZXJyb3IiIGlzIGhlcmUgdG8gY2F0Y2ggdGhpcyBjYXNlLgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaWZkZWYgX19TVERDX18KKyMgaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorIyBpbmNsdWRlIDxhc3NlcnQuaD4KKyNlbmRpZgorCQkgICAgIFN5bnRheCBlcnJvcgorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jcHAgIiRMSU5FTk8iOyB0aGVuIDoKKworZWxzZQorICAjIEJyb2tlbjogZmFpbHMgb24gdmFsaWQgaW5wdXQuCitjb250aW51ZQorZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworICAjIE9LLCB3b3JrcyBvbiBzYW5lIGNhc2VzLiAgTm93IGNoZWNrIHdoZXRoZXIgbm9uZXhpc3RlbnQgaGVhZGVycworICAjIGNhbiBiZSBkZXRlY3RlZCBhbmQgaG93LgorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8YWNfbm9uZXhpc3RlbnQuaD4KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY3BwICIkTElORU5PIjsgdGhlbiA6CisgICMgQnJva2VuOiBzdWNjZXNzIG9uIGludmFsaWQgaW5wdXQuCitjb250aW51ZQorZWxzZQorICAjIFBhc3NlcyBib3RoIHRlc3RzLgorYWNfcHJlcHJvY19vaz06CiticmVhaworZmkKK3JtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC5pIGNvbmZ0ZXN0LiRhY19leHQKKworZG9uZQorIyBCZWNhdXNlIG9mIGBicmVhaycsIF9BQ19QUkVQUk9DX0lGRUxTRSdzIGNsZWFuaW5nIGNvZGUgd2FzIHNraXBwZWQuCitybSAtZiBjb25mdGVzdC5pIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfZXh0CitpZiAkYWNfcHJlcHJvY19vazsgdGhlbiA6CisKK2Vsc2UKKyAgeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiQyBwcmVwcm9jZXNzb3IgXCIkQ1BQXCIgZmFpbHMgc2FuaXR5IGNoZWNrCitTZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzIiAiJExJTkVOTyIgNSA7IH0KK2ZpCisKK2FjX2V4dD1jCithY19jcHA9JyRDUFAgJENQUEZMQUdTJworYWNfY29tcGlsZT0nJENDIC1jICRDRkxBR1MgJENQUEZMQUdTIGNvbmZ0ZXN0LiRhY19leHQgPiY1JworYWNfbGluaz0nJENDIC1vIGNvbmZ0ZXN0JGFjX2V4ZWV4dCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBjb25mdGVzdC4kYWNfZXh0ICRMSUJTID4mNScKK2FjX2NvbXBpbGVyX2dudT0kYWNfY3ZfY19jb21waWxlcl9nbnUKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBncmVwIHRoYXQgaGFuZGxlcyBsb25nIGxpbmVzIGFuZCAtZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZ3JlcCB0aGF0IGhhbmRsZXMgbG9uZyBsaW5lcyBhbmQgLWUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9HUkVQK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgdGVzdCAteiAiJEdSRVAiOyB0aGVuCisgIGFjX3BhdGhfR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGdyZXAgZ2dyZXA7IGRvCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgICAgICBhY19wYXRoX0dSRVA9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQiCisgICAgICB7IHRlc3QgLWYgIiRhY19wYXRoX0dSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0dSRVAiOyB9IHx8IGNvbnRpbnVlCisjIENoZWNrIGZvciBHTlUgYWNfcGF0aF9HUkVQIGFuZCBzZWxlY3QgaXQgaWYgaXQgaXMgZm91bmQuCisgICMgQ2hlY2sgZm9yIEdOVSAkYWNfcGF0aF9HUkVQCitjYXNlIGAiJGFjX3BhdGhfR1JFUCIgLS12ZXJzaW9uIDI+JjFgIGluCisqR05VKikKKyAgYWNfY3ZfcGF0aF9HUkVQPSIkYWNfcGF0aF9HUkVQIiBhY19wYXRoX0dSRVBfZm91bmQ9Ojs7CisqKQorICBhY19jb3VudD0wCisgICRhc19lY2hvX24gMDEyMzQ1Njc4OSA+ImNvbmZ0ZXN0LmluIgorICB3aGlsZSA6CisgIGRvCisgICAgY2F0ICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0LmluIiA+ImNvbmZ0ZXN0LnRtcCIKKyAgICBtdiAiY29uZnRlc3QudG1wIiAiY29uZnRlc3QuaW4iCisgICAgY3AgImNvbmZ0ZXN0LmluIiAiY29uZnRlc3QubmwiCisgICAgJGFzX2VjaG8gJ0dSRVAnID4+ICJjb25mdGVzdC5ubCIKKyAgICAiJGFjX3BhdGhfR1JFUCIgLWUgJ0dSRVAkJyAtZSAnLShjYW5ub3QgbWF0Y2gpLScgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0dSRVBfbWF4LTB9OyB0aGVuCisgICAgICAjIEJlc3Qgb25lIHNvIGZhciwgc2F2ZSBpdCBidXQga2VlcCBsb29raW5nIGZvciBhIGJldHRlciBvbmUKKyAgICAgIGFjX2N2X3BhdGhfR1JFUD0iJGFjX3BhdGhfR1JFUCIKKyAgICAgIGFjX3BhdGhfR1JFUF9tYXg9JGFjX2NvdW50CisgICAgZmkKKyAgICAjIDEwKigyXjEwKSBjaGFycyBhcyBpbnB1dCBzZWVtcyBtb3JlIHRoYW4gZW5vdWdoCisgICAgdGVzdCAkYWNfY291bnQgLWd0IDEwICYmIGJyZWFrCisgIGRvbmUKKyAgcm0gLWYgY29uZnRlc3QuaW4gY29uZnRlc3QudG1wIGNvbmZ0ZXN0Lm5sIGNvbmZ0ZXN0Lm91dDs7Citlc2FjCisKKyAgICAgICRhY19wYXRoX0dSRVBfZm91bmQgJiYgYnJlYWsgMworICAgIGRvbmUKKyAgZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisgIGlmIHRlc3QgLXogIiRhY19jdl9wYXRoX0dSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZ3JlcCBjb3VsZCBiZSBmb3VuZCBpbiAkUEFUSCRQQVRIX1NFUEFSQVRPUi91c3IveHBnNC9iaW4iICIkTElORU5PIiA1CisgIGZpCitlbHNlCisgIGFjX2N2X3BhdGhfR1JFUD0kR1JFUAorZmkKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfcGF0aF9HUkVQIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfcGF0aF9HUkVQIiA+JjY7IH0KKyBHUkVQPSIkYWNfY3ZfcGF0aF9HUkVQIgorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGVncmVwIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBlZ3JlcC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wYXRoX0VHUkVQK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgaWYgZWNobyBhIHwgJEdSRVAgLUUgJyhhfGIpJyA+L2Rldi9udWxsIDI+JjEKKyAgIHRoZW4gYWNfY3ZfcGF0aF9FR1JFUD0iJEdSRVAgLUUiCisgICBlbHNlCisgICAgIGlmIHRlc3QgLXogIiRFR1JFUCI7IHRoZW4KKyAgYWNfcGF0aF9FR1JFUF9mb3VuZD1mYWxzZQorICAjIExvb3AgdGhyb3VnaCB0aGUgdXNlcidzIHBhdGggYW5kIHRlc3QgZm9yIGVhY2ggb2YgUFJPR05BTUUtTElTVAorICBhc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRIJFBBVEhfU0VQQVJBVE9SL3Vzci94cGc0L2JpbgorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIGZvciBhY19wcm9nIGluIGVncmVwOyBkbworICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworICAgICAgYWNfcGF0aF9FR1JFUD0iJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIKKyAgICAgIHsgdGVzdCAtZiAiJGFjX3BhdGhfRUdSRVAiICYmICRhc190ZXN0X3ggIiRhY19wYXRoX0VHUkVQIjsgfSB8fCBjb250aW51ZQorIyBDaGVjayBmb3IgR05VIGFjX3BhdGhfRUdSRVAgYW5kIHNlbGVjdCBpdCBpZiBpdCBpcyBmb3VuZC4KKyAgIyBDaGVjayBmb3IgR05VICRhY19wYXRoX0VHUkVQCitjYXNlIGAiJGFjX3BhdGhfRUdSRVAiIC0tdmVyc2lvbiAyPiYxYCBpbgorKkdOVSopCisgIGFjX2N2X3BhdGhfRUdSRVA9IiRhY19wYXRoX0VHUkVQIiBhY19wYXRoX0VHUkVQX2ZvdW5kPTo7OworKikKKyAgYWNfY291bnQ9MAorICAkYXNfZWNob19uIDAxMjM0NTY3ODkgPiJjb25mdGVzdC5pbiIKKyAgd2hpbGUgOgorICBkbworICAgIGNhdCAiY29uZnRlc3QuaW4iICJjb25mdGVzdC5pbiIgPiJjb25mdGVzdC50bXAiCisgICAgbXYgImNvbmZ0ZXN0LnRtcCIgImNvbmZ0ZXN0LmluIgorICAgIGNwICJjb25mdGVzdC5pbiIgImNvbmZ0ZXN0Lm5sIgorICAgICRhc19lY2hvICdFR1JFUCcgPj4gImNvbmZ0ZXN0Lm5sIgorICAgICIkYWNfcGF0aF9FR1JFUCIgJ0VHUkVQJCcgPCAiY29uZnRlc3QubmwiID4iY29uZnRlc3Qub3V0IiAyPi9kZXYvbnVsbCB8fCBicmVhaworICAgIGRpZmYgImNvbmZ0ZXN0Lm91dCIgImNvbmZ0ZXN0Lm5sIiA+L2Rldi9udWxsIDI+JjEgfHwgYnJlYWsKKyAgICBhc19mbl9hcml0aCAkYWNfY291bnQgKyAxICYmIGFjX2NvdW50PSRhc192YWwKKyAgICBpZiB0ZXN0ICRhY19jb3VudCAtZ3QgJHthY19wYXRoX0VHUkVQX21heC0wfTsgdGhlbgorICAgICAgIyBCZXN0IG9uZSBzbyBmYXIsIHNhdmUgaXQgYnV0IGtlZXAgbG9va2luZyBmb3IgYSBiZXR0ZXIgb25lCisgICAgICBhY19jdl9wYXRoX0VHUkVQPSIkYWNfcGF0aF9FR1JFUCIKKyAgICAgIGFjX3BhdGhfRUdSRVBfbWF4PSRhY19jb3VudAorICAgIGZpCisgICAgIyAxMCooMl4xMCkgY2hhcnMgYXMgaW5wdXQgc2VlbXMgbW9yZSB0aGFuIGVub3VnaAorICAgIHRlc3QgJGFjX2NvdW50IC1ndCAxMCAmJiBicmVhaworICBkb25lCisgIHJtIC1mIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0LnRtcCBjb25mdGVzdC5ubCBjb25mdGVzdC5vdXQ7OworZXNhYworCisgICAgICAkYWNfcGF0aF9FR1JFUF9mb3VuZCAmJiBicmVhayAzCisgICAgZG9uZQorICBkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKyAgaWYgdGVzdCAteiAiJGFjX2N2X3BhdGhfRUdSRVAiOyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gIm5vIGFjY2VwdGFibGUgZWdyZXAgY291bGQgYmUgZm91bmQgaW4gJFBBVEgkUEFUSF9TRVBBUkFUT1IvdXNyL3hwZzQvYmluIiAiJExJTkVOTyIgNQorICBmaQorZWxzZQorICBhY19jdl9wYXRoX0VHUkVQPSRFR1JFUAorZmkKKworICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3BhdGhfRUdSRVAiID4mNQorJGFzX2VjaG8gIiRhY19jdl9wYXRoX0VHUkVQIiA+JjY7IH0KKyBFR1JFUD0iJGFjX2N2X3BhdGhfRUdSRVAiCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9oZWFkZXJfc3RkYytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorCitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2hlYWRlcl9zdGRjPXllcworZWxzZQorICBhY19jdl9oZWFkZXJfc3RkYz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorICAjIFN1bk9TIDQueCBzdHJpbmcuaCBkb2VzIG5vdCBkZWNsYXJlIG1lbSosIGNvbnRyYXJ5IHRvIEFOU0kuCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworX0FDRU9GCitpZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8CisgICRFR1JFUCAibWVtY2hyIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgSVNDIDIuMC4yIHN0ZGxpYi5oIGRvZXMgbm90IGRlY2xhcmUgZnJlZSwgY29udHJhcnkgdG8gQU5TSS4KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitfQUNFT0YKK2lmIChldmFsICIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQiKSAyPiY1IHwKKyAgJEVHUkVQICJmcmVlIiA+L2Rldi9udWxsIDI+JjE7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCitmaQorcm0gLWYgY29uZnRlc3QqCisKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCisgICMgL2Jpbi9jYyBpbiBJcml4LTQuMC41IGdldHMgbm9uLUFOU0kgY3R5cGUgbWFjcm9zIHVubGVzcyB1c2luZyAtYW5zaS4KKyAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4gOgorICA6CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2lmICgoJyAnICYgMHgwRkYpID09IDB4MDIwKQorIyBkZWZpbmUgSVNMT1dFUihjKSAoJ2EnIDw9IChjKSAmJiAoYykgPD0gJ3onKQorIyBkZWZpbmUgVE9VUFBFUihjKSAoSVNMT1dFUihjKSA/ICdBJyArICgoYykgLSAnYScpIDogKGMpKQorI2Vsc2UKKyMgZGVmaW5lIElTTE9XRVIoYykgXAorCQkgICAoKCdhJyA8PSAoYykgJiYgKGMpIDw9ICdpJykgXAorCQkgICAgIHx8ICgnaicgPD0gKGMpICYmIChjKSA8PSAncicpIFwKKwkJICAgICB8fCAoJ3MnIDw9IChjKSAmJiAoYykgPD0gJ3onKSkKKyMgZGVmaW5lIFRPVVBQRVIoYykgKElTTE9XRVIoYykgPyAoKGMpIHwgMHg0MCkgOiAoYykpCisjZW5kaWYKKworI2RlZmluZSBYT1IoZSwgZikgKCgoZSkgJiYgIShmKSkgfHwgKCEoZSkgJiYgKGYpKSkKK2ludAorbWFpbiAoKQoreworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIGlmIChYT1IgKGlzbG93ZXIgKGkpLCBJU0xPV0VSIChpKSkKKwl8fCB0b3VwcGVyIChpKSAhPSBUT1VQUEVSIChpKSkKKyAgICAgIHJldHVybiAyOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfcnVuICIkTElORU5PIjsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3ZfaGVhZGVyX3N0ZGM9bm8KK2ZpCitybSAtZiBjb3JlICouY29yZSBjb3JlLmNvbmZ0ZXN0LiogZ21vbi5vdXQgYmIub3V0IGNvbmZ0ZXN0JGFjX2V4ZWV4dCBcCisgIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuYmVhbSBjb25mdGVzdC4kYWNfZXh0CitmaQorCitmaQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3N0ZGMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9oZWFkZXJfc3RkYyIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBTVERDX0hFQURFUlMgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKyMgT24gSVJJWCA1LjMsIHN5cy90eXBlcyBhbmQgaW50dHlwZXMuaCBhcmUgY29uZmxpY3RpbmcuCitmb3IgYWNfaGVhZGVyIGluIHN5cy90eXBlcy5oIHN5cy9zdGF0Lmggc3RkbGliLmggc3RyaW5nLmggbWVtb3J5Lmggc3RyaW5ncy5oIFwKKwkJICBpbnR0eXBlcy5oIHN0ZGludC5oIHVuaXN0ZC5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCitmb3IgYWNfaGVhZGVyIGluIHN5cy9iaXR5cGVzLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgInN5cy9iaXR5cGVzLmgiICJhY19jdl9oZWFkZXJfc3lzX2JpdHlwZXNfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfc3lzX2JpdHlwZXNfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1lTX0JJVFlQRVNfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgImludDhfdCIgImFjX2N2X3R5cGVfaW50OF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50OF90IiA9IHgiInllczsgdGhlbiA6CisKK2Vsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgaW50OF90IHNpZ25lZCBjaGFyIiA+PmNvbmZkZWZzLmgKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidV9pbnQ4X3QiICJhY19jdl90eXBlX3VfaW50OF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdV9pbnQ4X3QiID0geCIieWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSB1X2ludDhfdCB1bnNpZ25lZCBjaGFyIiA+PmNvbmZkZWZzLmgKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW50MTZfdCIgImFjX2N2X3R5cGVfaW50MTZfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl90eXBlX2ludDE2X3QiID0geCIieWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSBpbnQxNl90IHNob3J0IiA+PmNvbmZkZWZzLmgKKworCSRhY19pbmNsdWRlc19kZWZhdWx0CisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidV9pbnQxNl90IiAiYWNfY3ZfdHlwZV91X2ludDE2X3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91X2ludDE2X3QiID0geCIieWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSB1X2ludDE2X3QgdW5zaWduZWQgc2hvcnQiID4+Y29uZmRlZnMuaAorCitmaQorCithY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJpbnQzMl90IiAiYWNfY3ZfdHlwZV9pbnQzMl90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfaW50MzJfdCIgPSB4IiJ5ZXM7IHRoZW4gOgorCitlbHNlCisKKyRhc19lY2hvICIjZGVmaW5lIGludDMyX3QgaW50IiA+PmNvbmZkZWZzLmgKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAidV9pbnQzMl90IiAiYWNfY3ZfdHlwZV91X2ludDMyX3QiICIkYWNfaW5jbHVkZXNfZGVmYXVsdAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV91X2ludDMyX3QiID0geCIieWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSB1X2ludDMyX3QgdW5zaWduZWQgaW50IiA+PmNvbmZkZWZzLmgKKworZmkKKworYWNfZm5fY19jaGVja190eXBlICIkTElORU5PIiAiaW50NjRfdCIgImFjX2N2X3R5cGVfaW50NjRfdCIgIiRhY19pbmNsdWRlc19kZWZhdWx0CisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorIgoraWYgdGVzdCAieCRhY19jdl90eXBlX2ludDY0X3QiID0geCIieWVzOyB0aGVuIDoKKworZWxzZQorCiskYXNfZWNobyAiI2RlZmluZSBpbnQ2NF90IGxvbmcgbG9uZyIgPj5jb25mZGVmcy5oCisKK2ZpCisKK2FjX2ZuX2NfY2hlY2tfdHlwZSAiJExJTkVOTyIgInVfaW50NjRfdCIgImFjX2N2X3R5cGVfdV9pbnQ2NF90IiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfdV9pbnQ2NF90IiA9IHgiInllczsgdGhlbiA6CisKK2Vsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgdV9pbnQ2NF90IHVuc2lnbmVkIGxvbmcgbG9uZyIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworIworIyBUcnkgdG8gYXJyYW5nZSBmb3IgbGFyZ2UgZmlsZSBzdXBwb3J0LgorIworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWxhcmdlZmlsZSB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9sYXJnZWZpbGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9sYXJnZWZpbGU7CitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX2xhcmdlZmlsZSIgIT0gbm87IHRoZW4KKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBzcGVjaWFsIEMgY29tcGlsZXIgb3B0aW9ucyBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzcGVjaWFsIEMgY29tcGlsZXIgb3B0aW9ucyBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3N5c19sYXJnZWZpbGVfQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBhY19jdl9zeXNfbGFyZ2VmaWxlX0NDPW5vCisgICAgIGlmIHRlc3QgIiRHQ0MiICE9IHllczsgdGhlbgorICAgICAgIGFjX3NhdmVfQ0M9JENDCisgICAgICAgd2hpbGUgOjsgZG8KKwkgIyBJUklYIDYuMiBhbmQgbGF0ZXIgZG8gbm90IHN1cHBvcnQgbGFyZ2UgZmlsZXMgYnkgZGVmYXVsdCwKKwkgIyBzbyB1c2UgdGhlIEMgY29tcGlsZXIncyAtbjMyIG9wdGlvbiBpZiB0aGF0IGhlbHBzLgorCSBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCisgICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAorICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKKyAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKKyAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCisJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKKwkJICAgICAgPyAxIDogLTFdOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorCSBpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dAorCSBDQz0iJENDIC1uMzIiCisJIGlmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3lzX2xhcmdlZmlsZV9DQz0nIC1uMzInOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQKKwkgYnJlYWsKKyAgICAgICBkb25lCisgICAgICAgQ0M9JGFjX3NhdmVfQ0MKKyAgICAgICBybSAtZiBjb25mdGVzdC4kYWNfZXh0CisgICAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zeXNfbGFyZ2VmaWxlX0NDIiA+JjY7IH0KKyAgaWYgdGVzdCAiJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MiICE9IG5vOyB0aGVuCisgICAgQ0M9JENDJGFjX2N2X3N5c19sYXJnZWZpbGVfQ0MKKyAgZmkKKworICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfRklMRV9PRkZTRVRfQklUUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBfRklMRV9PRkZTRVRfQklUUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3N5c19maWxlX29mZnNldF9iaXRzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgd2hpbGUgOjsgZG8KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorIC8qIENoZWNrIHRoYXQgb2ZmX3QgY2FuIHJlcHJlc2VudCAyKio2MyAtIDEgY29ycmVjdGx5LgorICAgIFdlIGNhbid0IHNpbXBseSBkZWZpbmUgTEFSR0VfT0ZGX1QgdG8gYmUgOTIyMzM3MjAzNjg1NDc3NTgwNywKKyAgICBzaW5jZSBzb21lIEMrKyBjb21waWxlcnMgbWFzcXVlcmFkaW5nIGFzIEMgY29tcGlsZXJzCisgICAgaW5jb3JyZWN0bHkgcmVqZWN0IDkyMjMzNzIwMzY4NTQ3NzU4MDcuICAqLworI2RlZmluZSBMQVJHRV9PRkZfVCAoKChvZmZfdCkgMSA8PCA2MikgLSAxICsgKChvZmZfdCkgMSA8PCA2MikpCisgIGludCBvZmZfdF9pc19sYXJnZVsoTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjI5ID09IDcyMQorCQkgICAgICAgJiYgTEFSR0VfT0ZGX1QgJSAyMTQ3NDgzNjQ3ID09IDEpCisJCSAgICAgID8gMSA6IC0xXTsKK2ludAorbWFpbiAoKQoreworCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3lzX2ZpbGVfb2Zmc2V0X2JpdHM9bm87IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KKyAgICBXZSBjYW4ndCBzaW1wbHkgZGVmaW5lIExBUkdFX09GRl9UIHRvIGJlIDkyMjMzNzIwMzY4NTQ3NzU4MDcsCisgICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycworICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KKyNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpIDEgPDwgNjIpIC0gMSArICgob2ZmX3QpIDEgPDwgNjIpKQorICBpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEKKwkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQorCQkgICAgICA/IDEgOiAtMV07CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzPTY0OyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cz11bmtub3duCisgIGJyZWFrCitkb25lCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zeXNfZmlsZV9vZmZzZXRfYml0cyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzIGluICMoCisgIG5vIHwgdW5rbm93bikgOzsKKyAgKikKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzCitfQUNFT0YKKzs7Citlc2FjCitybSAtcmYgY29uZnRlc3QqCisgIGlmIHRlc3QgJGFjX2N2X3N5c19maWxlX29mZnNldF9iaXRzID0gdW5rbm93bjsgdGhlbgorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIF9MQVJHRV9GSUxFUyB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBfTEFSR0VfRklMRVMgdmFsdWUgbmVlZGVkIGZvciBsYXJnZSBmaWxlcy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zeXNfbGFyZ2VfZmlsZXMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICB3aGlsZSA6OyBkbworICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgLyogQ2hlY2sgdGhhdCBvZmZfdCBjYW4gcmVwcmVzZW50IDIqKjYzIC0gMSBjb3JyZWN0bHkuCisgICAgV2UgY2FuJ3Qgc2ltcGx5IGRlZmluZSBMQVJHRV9PRkZfVCB0byBiZSA5MjIzMzcyMDM2ODU0Nzc1ODA3LAorICAgIHNpbmNlIHNvbWUgQysrIGNvbXBpbGVycyBtYXNxdWVyYWRpbmcgYXMgQyBjb21waWxlcnMKKyAgICBpbmNvcnJlY3RseSByZWplY3QgOTIyMzM3MjAzNjg1NDc3NTgwNy4gICovCisjZGVmaW5lIExBUkdFX09GRl9UICgoKG9mZl90KSAxIDw8IDYyKSAtIDEgKyAoKG9mZl90KSAxIDw8IDYyKSkKKyAgaW50IG9mZl90X2lzX2xhcmdlWyhMQVJHRV9PRkZfVCAlIDIxNDc0ODM2MjkgPT0gNzIxCisJCSAgICAgICAmJiBMQVJHRV9PRkZfVCAlIDIxNDc0ODM2NDcgPT0gMSkKKwkJICAgICAgPyAxIDogLTFdOworaW50CittYWluICgpCit7CisKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zeXNfbGFyZ2VfZmlsZXM9bm87IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNkZWZpbmUgX0xBUkdFX0ZJTEVTIDEKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAvKiBDaGVjayB0aGF0IG9mZl90IGNhbiByZXByZXNlbnQgMioqNjMgLSAxIGNvcnJlY3RseS4KKyAgICBXZSBjYW4ndCBzaW1wbHkgZGVmaW5lIExBUkdFX09GRl9UIHRvIGJlIDkyMjMzNzIwMzY4NTQ3NzU4MDcsCisgICAgc2luY2Ugc29tZSBDKysgY29tcGlsZXJzIG1hc3F1ZXJhZGluZyBhcyBDIGNvbXBpbGVycworICAgIGluY29ycmVjdGx5IHJlamVjdCA5MjIzMzcyMDM2ODU0Nzc1ODA3LiAgKi8KKyNkZWZpbmUgTEFSR0VfT0ZGX1QgKCgob2ZmX3QpIDEgPDwgNjIpIC0gMSArICgob2ZmX3QpIDEgPDwgNjIpKQorICBpbnQgb2ZmX3RfaXNfbGFyZ2VbKExBUkdFX09GRl9UICUgMjE0NzQ4MzYyOSA9PSA3MjEKKwkJICAgICAgICYmIExBUkdFX09GRl9UICUgMjE0NzQ4MzY0NyA9PSAxKQorCQkgICAgICA/IDEgOiAtMV07CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3N5c19sYXJnZV9maWxlcz0xOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorICBhY19jdl9zeXNfbGFyZ2VfZmlsZXM9dW5rbm93bgorICBicmVhaworZG9uZQorZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzIiA+JjY7IH0KK2Nhc2UgJGFjX2N2X3N5c19sYXJnZV9maWxlcyBpbiAjKAorICBubyB8IHVua25vd24pIDs7CisgICopCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIF9MQVJHRV9GSUxFUyAkYWNfY3Zfc3lzX2xhcmdlX2ZpbGVzCitfQUNFT0YKKzs7Citlc2FjCitybSAtcmYgY29uZnRlc3QqCisgIGZpCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBfTEFSR0VGSUxFX1NPVVJDRSB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBfTEFSR0VGSUxFX1NPVVJDRSB2YWx1ZSBuZWVkZWQgZm9yIGxhcmdlIGZpbGVzLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgd2hpbGUgOjsgZG8KKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAvKiBmb3Igb2ZmX3QgKi8KKyAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQKK21haW4gKCkKK3sKK2ludCAoKmZwKSAoRklMRSAqLCBvZmZfdCwgaW50KSA9IGZzZWVrbzsKKyAgICAgcmV0dXJuIGZzZWVrbyAoc3RkaW4sIDAsIDApICYmIGZwIChzdGRpbiwgMCwgMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2U9bm87IGJyZWFrCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAxCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+IC8qIGZvciBvZmZfdCAqLworICAgICAjaW5jbHVkZSA8c3RkaW8uaD4KK2ludAorbWFpbiAoKQoreworaW50ICgqZnApIChGSUxFICosIG9mZl90LCBpbnQpID0gZnNlZWtvOworICAgICByZXR1cm4gZnNlZWtvIChzdGRpbiwgMCwgMCkgJiYgZnAgKHN0ZGluLCAwLCAwKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZT0xOyBicmVhaworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CisgIGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlPXVua25vd24KKyAgYnJlYWsKK2RvbmUKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N5c19sYXJnZWZpbGVfc291cmNlIiA+JjUKKyRhc19lY2hvICIkYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2UiID4mNjsgfQorY2FzZSAkYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2UgaW4gIygKKyAgbm8gfCB1bmtub3duKSA7OworICAqKQorY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBfTEFSR0VGSUxFX1NPVVJDRSAkYWNfY3Zfc3lzX2xhcmdlZmlsZV9zb3VyY2UKK19BQ0VPRgorOzsKK2VzYWMKK3JtIC1yZiBjb25mdGVzdCoKKworIyBXZSB1c2VkIHRvIHRyeSBkZWZpbmluZyBfWE9QRU5fU09VUkNFPTUwMCB0b28sIHRvIHdvcmsgYXJvdW5kIGEgYnVnCisjIGluIGdsaWJjIDIuMS4zLCBidXQgdGhhdCBicmVha3MgdG9vIG1hbnkgb3RoZXIgdGhpbmdzLgorIyBJZiB5b3Ugd2FudCBmc2Vla28gYW5kIGZ0ZWxsbyB3aXRoIGdsaWJjLCB1cGdyYWRlIHRvIGEgZml4ZWQgZ2xpYmMuCitpZiB0ZXN0ICRhY19jdl9zeXNfbGFyZ2VmaWxlX3NvdXJjZSAhPSB1bmtub3duOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfRlNFRUtPIDEiID4+Y29uZmRlZnMuaAorCitmaQorCisKK2ZvciBhY19oZWFkZXIgaW4gc3lzL2lvY2NvbS5oIHN5cy9zb2NraW8uaCBsaW1pdHMuaCBwYXRocy5oCitkbyA6CisgIGFzX2FjX0hlYWRlcj1gJGFzX2VjaG8gImFjX2N2X2hlYWRlcl8kYWNfaGVhZGVyIiB8ICRhc190cl9zaGAKK2FjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICIkYWNfaGVhZGVyIiAiJGFzX2FjX0hlYWRlciIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY19IZWFkZXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfaGVhZGVyIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gbGludXgvdHlwZXMuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGludXgvdHlwZXMuaCIgImFjX2N2X2hlYWRlcl9saW51eF90eXBlc19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF90eXBlc19oIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MSU5VWF9UWVBFU19IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2ZvciBhY19oZWFkZXIgaW4gbGludXgvaWZfcGFja2V0LmggbmV0cGFja2V0L3BhY2tldC5oIG5ldHBhY2tldC9pZl9wYWNrZXQuaAorZG8gOgorICBhc19hY19IZWFkZXI9YCRhc19lY2hvICJhY19jdl9oZWFkZXJfJGFjX2hlYWRlciIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAiJGFjX2hlYWRlciIgIiRhc19hY19IZWFkZXIiICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIGV2YWwgdGVzdCBcInhcJCIkYXNfYWNfSGVhZGVyIlwiID0geCJ5ZXMiOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBgJGFzX2VjaG8gIkhBVkVfJGFjX2hlYWRlciIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCitmb3IgYWNfaGVhZGVyIGluIG5ldC9wZnZhci5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJuZXQvcGZ2YXIuaCIgImFjX2N2X2hlYWRlcl9uZXRfcGZ2YXJfaCIgIiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9uZXRfcGZ2YXJfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTkVUX1BGVkFSX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRfcGZ2YXJfaCIgPSB5ZXM7IHRoZW4KKwkjCisJIyBDaGVjayBmb3IgdmFyaW91cyBQRiBhY3Rpb25zLgorCSMKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgbmV0L3BmdmFyLmggZGVmaW5lcyBQRl9OQVQgdGhyb3VnaCBQRl9OT1JEUiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIG5ldC9wZnZhci5oIGRlZmluZXMgUEZfTkFUIHRocm91Z2ggUEZfTk9SRFIuLi4gIiA+JjY7IH0KKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJICAgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisJICAgICNpbmNsdWRlIDxuZXQvaWYuaD4KKwkgICAgI2luY2x1ZGUgPG5ldC9wZnZhci5oPgoraW50CittYWluICgpCit7CityZXR1cm4gUEZfTkFUK1BGX05PTkFUK1BGX0JJTkFUK1BGX05PQklOQVQrUEZfUkRSK1BGX05PUkRSOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9QRl9OQVRfVEhST1VHSF9QRl9OT1JEUiAxIiA+PmNvbmZkZWZzLmgKKworCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKK2ZvciBhY19oZWFkZXIgaW4gbmV0aW5ldC9pZl9ldGhlci5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJuZXRpbmV0L2lmX2V0aGVyLmgiICJhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiAiI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IIDEKK19BQ0VPRgorCitmaQorCitkb25lCisKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiAhPSB5ZXM7IHRoZW4KKwkjCisJIyBUaGUgc2ltcGxlIHRlc3QgZGlkbid0IHdvcmsuCisJIyBEbyB3ZSBuZWVkIHRvIGluY2x1ZGUgPG5ldC9pZi5oPiBmaXJzdD8KKwkjIFVuc2V0IGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2ggc28gd2UgZG9uJ3QKKwkjIHRyZWF0IHRoZSBwcmV2aW91cyBmYWlsdXJlIGFzIGEgY2FjaGVkIHZhbHVlIGFuZAorCSMgc3VwcHJlc3MgdGhlIG5leHQgdGVzdC4KKwkjCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBSZWNoZWNraW5nIHdpdGggc29tZSBhZGRpdGlvbmFsIGluY2x1ZGVzIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFJlY2hlY2tpbmcgd2l0aCBzb21lIGFkZGl0aW9uYWwgaW5jbHVkZXMiID4mNjt9CisJdW5zZXQgYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaAorCWZvciBhY19oZWFkZXIgaW4gbmV0aW5ldC9pZl9ldGhlci5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJuZXRpbmV0L2lmX2V0aGVyLmgiICJhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiAiI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CitzdHJ1Y3QgbWJ1ZjsKK3N0cnVjdCBydGVudHJ5OworI2luY2x1ZGUgPG5ldC9pZi5oPgorIgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworZmkKKworaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIEFOU0kgaW9jdGwgZGVmaW5pdGlvbnMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIEFOU0kgaW9jdGwgZGVmaW5pdGlvbnMuLi4gIiA+JjY7IH0KKwkgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworLyoKKwkJICAgICAqIFRoaXMgZ2VuZXJhdGVzIGEgImR1cGxpY2F0ZSBjYXNlIHZhbHVlIiB3aGVuIGZpeGluY2x1ZGVzCisJCSAgICAgKiBoYXMgbm90IGJlIHJ1bi4KKwkJICAgICAqLworIwkJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCQlpbmNsdWRlIDxzeXMvdGltZS5oPgorIwkJaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjCQlpZmRlZiBIQVZFX1NZU19JT0NDT01fSAorIwkJaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorIwkJZW5kaWYKK2ludAorbWFpbiAoKQoreworc3dpdGNoICgwKSB7CisJCSAgICBjYXNlIF9JTygnQScsIDEpOjsKKwkJICAgIGNhc2UgX0lPKCdCJywgMSk6OworCQkgICAgfQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXM9eWVzCitlbHNlCisgIGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXM9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9sYmxfZ2NjX2ZpeGluY2x1ZGVzIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcyIgPiY2OyB9CisJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9nY2NfZml4aW5jbHVkZXMgPSBubyA7IHRoZW4KKwkJICAgICMgRG9uJ3QgY2FjaGUgZmFpbHVyZQorCQkgICAgdW5zZXQgYWNfY3ZfbGJsX2djY19maXhpbmNsdWRlcworCQkgICAgYXNfZm5fZXJyb3IgJD8gInNlZSB0aGUgSU5TVEFMTCBmb3IgbW9yZSBpbmZvIiAiJExJTkVOTyIgNQorCSAgICBmaQorICAgIGZpCisKK2ZvciBhY19mdW5jIGluIHN0cmVycm9yIHN0cmxjcHkKK2RvIDoKKyAgYXNfYWNfdmFyPWAkYXNfZWNobyAiYWNfY3ZfZnVuY18kYWNfZnVuYyIgfCAkYXNfdHJfc2hgCithY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICIkYWNfZnVuYyIgIiRhc19hY192YXIiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX3ZhciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19mdW5jIiB8ICRhc190cl9jcHBgIDEKK19BQ0VPRgorCitmaQorZG9uZQorCisKK25lZWRzbnByaW50Zj1ubworZm9yIGFjX2Z1bmMgaW4gdnNucHJpbnRmIHNucHJpbnRmCitkbyA6CisgIGFzX2FjX3Zhcj1gJGFzX2VjaG8gImFjX2N2X2Z1bmNfJGFjX2Z1bmMiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiJGFjX2Z1bmMiICIkYXNfYWNfdmFyIgoraWYgZXZhbCB0ZXN0IFwieFwkIiRhc19hY192YXIiXCIgPSB4InllcyI7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIGAkYXNfZWNobyAiSEFWRV8kYWNfZnVuYyIgfCAkYXNfdHJfY3BwYCAxCitfQUNFT0YKKworZWxzZQorICBuZWVkc25wcmludGY9eWVzCitmaQorZG9uZQorCitpZiB0ZXN0ICRuZWVkc25wcmludGYgPSB5ZXM7IHRoZW4KKwljYXNlICIgJExJQk9CSlMgIiBpbgorICAqIiBzbnByaW50Zi4kYWNfb2JqZXh0ICIqICkgOzsKKyAgKikgTElCT0JKUz0iJExJQk9CSlMgc25wcmludGYuJGFjX29iamV4dCIKKyA7OworZXNhYworCitmaQorCisjCisjIERvIHRoaXMgYmVmb3JlIGNoZWNraW5nIGZvciBldGhlcl9ob3N0dG9uKCksIGFzIGl0J3MgYQorIyAiZ2V0aG9zdGJ5bmFtZSgpIC1pc2ggZnVuY3Rpb24iLgorIworCisgICAgIyBNb3N0IG9wZXJhdGluZyBzeXN0ZW1zIGhhdmUgZ2V0aG9zdGJ5bmFtZSgpIGluIHRoZSBkZWZhdWx0IHNlYXJjaGVkCisgICAgIyBsaWJyYXJpZXMgKGkuZS4gbGliYyk6CisgICAgIyBTb21lIE9TZXMgKGVnLiBTb2xhcmlzKSBwbGFjZSBpdCBpbiBsaWJuc2wKKyAgICAjIFNvbWUgc3RyYW5nZSBPU2VzIChTSU5JWCkgaGF2ZSBpdCBpbiBsaWJzb2NrZXQ6CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIGdldGhvc3RieW5hbWUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBnZXRob3N0YnluYW1lLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZ2V0aG9zdGJ5bmFtZSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGdldGhvc3RieW5hbWUgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2ZvciBhY19saWIgaW4gJycgbnNsIHNvY2tldCByZXNvbHY7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZT0kYWNfcmVzCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0CisgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lPW5vCitmaQorcm0gY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9zZWFyY2hfZ2V0aG9zdGJ5bmFtZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9nZXRob3N0YnluYW1lIiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUKK2lmIHRlc3QgIiRhY19yZXMiICE9IG5vOyB0aGVuIDoKKyAgdGVzdCAiJGFjX3JlcyIgPSAibm9uZSByZXF1aXJlZCIgfHwgTElCUz0iJGFjX3JlcyAkTElCUyIKKworZmkKKworICAgICMgVW5mb3J0dW5hdGVseSBsaWJzb2NrZXQgc29tZXRpbWVzIGRlcGVuZHMgb24gbGlibnNsIGFuZAorICAgICMgQUNfU0VBUkNIX0xJQlMgaXNuJ3QgdXAgdG8gdGhlIHRhc2sgb2YgaGFuZGxpbmcgZGVwZW5kZW5jaWVzIGxpa2UgdGhpcy4KKyAgICBpZiB0ZXN0ICIkYWNfY3Zfc2VhcmNoX2dldGhvc3RieW5hbWUiID0gIm5vIgorICAgIHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sc29ja2V0Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sc29ja2V0IC1sbnNsICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGdldGhvc3RieW5hbWUgKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiBnZXRob3N0YnluYW1lICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3NvY2tldF9nZXRob3N0YnluYW1lPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZSIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zb2NrZXRfZ2V0aG9zdGJ5bmFtZSIgPSB4IiJ5ZXM7IHRoZW4gOgorICBMSUJTPSItbHNvY2tldCAtbG5zbCAkTElCUyIKK2ZpCisKKyAgICBmaQorICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzb2NrZXQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGxpYnJhcnkgY29udGFpbmluZyBzb2NrZXQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NvY2tldCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUz0kTElCUworY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNvY2tldCAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIHNvY2tldCAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorZm9yIGFjX2xpYiBpbiAnJyBzb2NrZXQ7IGRvCisgIGlmIHRlc3QgLXogIiRhY19saWIiOyB0aGVuCisgICAgYWNfcmVzPSJub25lIHJlcXVpcmVkIgorICBlbHNlCisgICAgYWNfcmVzPS1sJGFjX2xpYgorICAgIExJQlM9Ii1sJGFjX2xpYiAgJGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUyIKKyAgZmkKKyAgaWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9zZWFyY2hfc29ja2V0PSRhY19yZXMKK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQKKyAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgYnJlYWsKK2ZpCitkb25lCitpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9zb2NrZXQrc2V0fSIgPSBzZXQ7IHRoZW4gOgorCitlbHNlCisgIGFjX2N2X3NlYXJjaF9zb2NrZXQ9bm8KK2ZpCitybSBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19mdW5jX3NlYXJjaF9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3NlYXJjaF9zb2NrZXQiID4mNQorJGFzX2VjaG8gIiRhY19jdl9zZWFyY2hfc29ja2V0IiA+JjY7IH0KK2FjX3Jlcz0kYWNfY3Zfc2VhcmNoX3NvY2tldAoraWYgdGVzdCAiJGFjX3JlcyIgIT0gbm87IHRoZW4gOgorICB0ZXN0ICIkYWNfcmVzIiA9ICJub25lIHJlcXVpcmVkIiB8fCBMSUJTPSIkYWNfcmVzICRMSUJTIgorCitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNvY2tldCBpbiAtbHNvY2tldCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc29ja2V0IGluIC1sc29ja2V0Li4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9zb2NrZXRfc29ja2V0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzb2NrZXQgLWxuc2wgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgc29ja2V0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc29ja2V0ICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0PXllcworZWxzZQorICBhY19jdl9saWJfc29ja2V0X3NvY2tldD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc29ja2V0X3NvY2tldCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9zb2NrZXRfc29ja2V0IiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQiID0geCIieWVzOyB0aGVuIDoKKyAgTElCUz0iLWxzb2NrZXQgLWxuc2wgJExJQlMiCitmaQorCitmaQorCisgICAgIyBETFBJIG5lZWRzIHB1dG1zZyB1bmRlciBIUFVYIHNvIHRlc3QgZm9yIC1sc3RyIHdoaWxlIHdlJ3JlIGF0IGl0CisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB1dG1zZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgbGlicmFyeSBjb250YWluaW5nIHB1dG1zZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9zZWFyY2hfcHV0bXNnK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTPSRMSUJTCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgcHV0bXNnICgpOworaW50CittYWluICgpCit7CityZXR1cm4gcHV0bXNnICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitmb3IgYWNfbGliIGluICcnIHN0cjsgZG8KKyAgaWYgdGVzdCAteiAiJGFjX2xpYiI7IHRoZW4KKyAgICBhY19yZXM9Im5vbmUgcmVxdWlyZWQiCisgIGVsc2UKKyAgICBhY19yZXM9LWwkYWNfbGliCisgICAgTElCUz0iLWwkYWNfbGliICAkYWNfZnVuY19zZWFyY2hfc2F2ZV9MSUJTIgorICBmaQorICBpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3NlYXJjaF9wdXRtc2c9JGFjX3JlcworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dAorICBpZiB0ZXN0ICIke2FjX2N2X3NlYXJjaF9wdXRtc2crc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBicmVhaworZmkKK2RvbmUKK2lmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3B1dG1zZytzZXR9IiA9IHNldDsgdGhlbiA6CisKK2Vsc2UKKyAgYWNfY3Zfc2VhcmNoX3B1dG1zZz1ubworZmkKK3JtIGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2Z1bmNfc2VhcmNoX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3Zfc2VhcmNoX3B1dG1zZyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3NlYXJjaF9wdXRtc2ciID4mNjsgfQorYWNfcmVzPSRhY19jdl9zZWFyY2hfcHV0bXNnCitpZiB0ZXN0ICIkYWNfcmVzIiAhPSBubzsgdGhlbiA6CisgIHRlc3QgIiRhY19yZXMiID0gIm5vbmUgcmVxdWlyZWQiIHx8IExJQlM9IiRhY19yZXMgJExJQlMiCisKK2ZpCisKKworCisjCisjIFlvdSBhcmUgaW4gYSB0d2lzdHkgbGl0dGxlIG1hemUgb2YgVU4qWGVzLCBhbGwgZGlmZmVyZW50LgorIyBTb21lIG1pZ2h0IG5vdCBoYXZlIGV0aGVyX2hvc3R0b24oKS4KKyMgU29tZSBtaWdodCBoYXZlIGl0LCBidXQgbm90IGRlY2xhcmUgaXQgaW4gYW55IGhlYWRlciBmaWxlLgorIyBTb21lIG1pZ2h0IGhhdmUgaXQsIGJ1dCBkZWNsYXJlIGl0IGluIDxuZXRpbmV0L2lmX2V0aGVyLmg+LgorIyBTb21lIG1pZ2h0IGhhdmUgaXQsIGJ1dCBkZWNsYXJlIGl0IGluIDxuZXRpbmV0L2V0aGVyLmg+CisjIChBbmQgc29tZSBtaWdodCBoYXZlIGl0IGJ1dCBkb2N1bWVudCBpdCBhcyBzb21ldGhpbmcgZGVjbGFyZWQgaW4KKyMgPG5ldGluZXQvZXRoZXJuZXQuaD4sIGFsdGhvdWdoIDxuZXRpbmV0L2lmX2V0aGVyLmg+IGFwcGVhcnMgdG8gd29yay4pCisjCisjIEJlZm9yZSB5b3UgaXMgYSBDIGNvbXBpbGVyLgorIworZm9yIGFjX2Z1bmMgaW4gZXRoZXJfaG9zdHRvbgorZG8gOgorICBhY19mbl9jX2NoZWNrX2Z1bmMgIiRMSU5FTk8iICJldGhlcl9ob3N0dG9uIiAiYWNfY3ZfZnVuY19ldGhlcl9ob3N0dG9uIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2V0aGVyX2hvc3R0b24iID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0VUSEVSX0hPU1RUT04gMQorX0FDRU9GCisKK2ZpCitkb25lCisKK2lmIHRlc3QgIiRhY19jdl9mdW5jX2V0aGVyX2hvc3R0b24iID0geWVzOyB0aGVuCisJIworCSMgT0ssIHdlIGhhdmUgZXRoZXJfaG9zdHRvbigpLiAgRG8gd2UgaGF2ZSA8bmV0aW5ldC9pZl9ldGhlci5oPj8KKwkjCisJaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2giID0geWVzOyB0aGVuCisJCSMKKwkJIyBZZXMuICBEb2VzIGl0IGRlY2xhcmUgZXRoZXJfaG9zdHRvbigpPworCQkjCisJCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImV0aGVyX2hvc3R0b24iICJhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbiIgIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CitzdHJ1Y3QgbWJ1ZjsKK3N0cnVjdCBydGVudHJ5OworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbiIgPSB4IiJ5ZXM7IHRoZW4gOgorCisKKyRhc19lY2hvICIjZGVmaW5lIE5FVElORVRfSUZfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9IT1NUVE9OIC8qKi8iID4+Y29uZmRlZnMuaAorCisKK2ZpCisKKwlmaQorCSMKKwkjIERpZCB0aGF0IHN1Y2NlZWQ/CisJIworCWlmIHRlc3QgIiRhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbiIgIT0geWVzOyB0aGVuCisJCSMKKwkJIyBObywgaG93IGFib3V0IDxuZXRpbmV0L2V0aGVyLmg+LCBhcyBvbiBMaW51eD8KKwkJIworCQlmb3IgYWNfaGVhZGVyIGluIG5ldGluZXQvZXRoZXIuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibmV0aW5ldC9ldGhlci5oIiAiYWNfY3ZfaGVhZGVyX25ldGluZXRfZXRoZXJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbmV0aW5ldF9ldGhlcl9oIiA9IHgiInllczsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9ORVRJTkVUX0VUSEVSX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCQlpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX25ldGluZXRfZXRoZXJfaCIgPSB5ZXM7IHRoZW4KKwkJCSMKKwkJCSMgV2UgaGF2ZSBpdCAtIGRvZXMgaXQgZGVjbGFyZSBldGhlcl9ob3N0dG9uKCk/CisJCQkjIFVuc2V0IGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uIHNvIHdlIGRvbid0CisJCQkjIHRyZWF0IHRoZSBwcmV2aW91cyBmYWlsdXJlIGFzIGEgY2FjaGVkIHZhbHVlIGFuZAorCQkJIyBzdXBwcmVzcyB0aGUgbmV4dCB0ZXN0LgorCQkJIworCQkJdW5zZXQgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b24KKwkJCWFjX2ZuX2NfY2hlY2tfZGVjbCAiJExJTkVOTyIgImV0aGVyX2hvc3R0b24iICJhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbiIgIgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKworIgoraWYgdGVzdCAieCRhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbiIgPSB4IiJ5ZXM7IHRoZW4gOgorCisKKyRhc19lY2hvICIjZGVmaW5lIE5FVElORVRfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9IT1NUVE9OIC8qKi8iID4+Y29uZmRlZnMuaAorCisKK2ZpCisKKwkJZmkKKwlmaQorCSMKKwkjIElzIGV0aGVyX2hvc3R0b24oKSBkZWNsYXJlZD8KKwkjCisJaWYgdGVzdCAiJGFjX2N2X2hhdmVfZGVjbF9ldGhlcl9ob3N0dG9uIiAhPSB5ZXM7IHRoZW4KKwkJIworCQkjIE5vLCB3ZSdsbCBoYXZlIHRvIGRlY2xhcmUgaXQgb3Vyc2VsdmVzLgorCQkjIERvIHdlIGhhdmUgInN0cnVjdCBldGhlcl9hZGRyIj8KKwkJIworCQlhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzdHJ1Y3QgZXRoZXJfYWRkciIgImFjX2N2X3R5cGVfc3RydWN0X2V0aGVyX2FkZHIiICIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorc3RydWN0IG1idWY7CitzdHJ1Y3QgcnRlbnRyeTsKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfdHlwZV9zdHJ1Y3RfZXRoZXJfYWRkciIgPSB4IiJ5ZXM7IHRoZW4gOgorCitjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfU1RSVUNUX0VUSEVSX0FERFIgMQorX0FDRU9GCisKKworZmkKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0RFQ0xfRVRIRVJfSE9TVFRPTiAwIiA+PmNvbmZkZWZzLmgKKworCWVsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9ERUNMX0VUSEVSX0hPU1RUT04gMSIgPj5jb25mZGVmcy5oCisKKwlmaQorZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiAtLWRpc2FibGUtcHJvdG9jaGFpbiBvcHRpb24gaXMgc3BlY2lmaWVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIC0tZGlzYWJsZS1wcm90b2NoYWluIG9wdGlvbiBpcyBzcGVjaWZpZWQuLi4gIiA+JjY7IH0KKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1wcm90b2NoYWluIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3Byb3RvY2hhaW4rc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9wcm90b2NoYWluOworZmkKKworY2FzZSAieCRlbmFibGVfcHJvdG9jaGFpbiIgaW4KK3h5ZXMpCWVuYWJsZV9wcm90b2NoYWluPWVuYWJsZWQJOzsKK3hubykJZW5hYmxlX3Byb3RvY2hhaW49ZGlzYWJsZWQJOzsKK3gpCWVuYWJsZV9wcm90b2NoYWluPWVuYWJsZWQJOzsKK2VzYWMKKworaWYgdGVzdCAiJGVuYWJsZV9wcm90b2NoYWluIiA9ICJkaXNhYmxlZCI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgTk9fUFJPVE9DSEFJTiAxIiA+PmNvbmZkZWZzLmgKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke2VuYWJsZV9wcm90b2NoYWlufSIgPiY1CiskYXNfZWNobyAiJHtlbmFibGVfcHJvdG9jaGFpbn0iID4mNjsgfQorCisjCisjIFNJVEEgc3VwcG9ydCBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBuYXRpdmUgY2FwdHVyZSBzdXBwb3J0OworIyAiLS13aXRoLXNpdGEiIHNlbGVjdHMgU0lUQSBzdXBwb3J0LgorIworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNpdGEgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX3NpdGErc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3NpdGE7CisJaWYgdGVzdCAhICJ4JHdpdGh2YWwiID0gInhubyIgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIFNJVEEgMSIgPj5jb25mZGVmcy5oCisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBFbmFibGluZyBTSVRBIEFDTiBzdXBwb3J0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IEVuYWJsaW5nIFNJVEEgQUNOIHN1cHBvcnQiID4mNjt9CisJCVZfUENBUD1zaXRhCisJCVZfRklOREFMTERFVlM9c2l0YQorCWZpCisKK2Vsc2UKKworaWYgdGVzdCAteiAiJHdpdGhfcGNhcCIgJiYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KKwlhc19mbl9lcnJvciAkPyAicGNhcCB0eXBlIG5vdCBkZXRlcm1pbmVkIHdoZW4gY3Jvc3MtY29tcGlsaW5nOyB1c2UgLS13aXRoLXBjYXA9Li4uIiAiJExJTkVOTyIgNQorZmkKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1wY2FwIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9wY2FwK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9wY2FwOworZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBwYWNrZXQgY2FwdHVyZSB0eXBlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHBhY2tldCBjYXB0dXJlIHR5cGUuLi4gIiA+JjY7IH0KK2lmIHRlc3QgISAteiAiJHdpdGhfcGNhcCIgOyB0aGVuCisJVl9QQ0FQPSIkd2l0aHZhbCIKK2VsaWYgdGVzdCAtciAvZGV2L2JwZiAtbyAtaCAvZGV2L2JwZiA7IHRoZW4KKwkjCisJIyBDbG9uaW5nIEJQRiBkZXZpY2UuCisJIworCVZfUENBUD1icGYKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9DTE9OSU5HX0JQRiAxIiA+PmNvbmZkZWZzLmgKKworZWxpZiB0ZXN0IC1yIC9kZXYvYnBmMCA7IHRoZW4KKwlWX1BDQVA9YnBmCitlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL25ldC9wZmlsdC5oIDsgdGhlbgorCVZfUENBUD1wZgorZWxpZiB0ZXN0IC1yIC9kZXYvZW5ldCA7IHRoZW4KKwlWX1BDQVA9ZW5ldAorZWxpZiB0ZXN0IC1yIC9kZXYvbml0IDsgdGhlbgorCVZfUENBUD1zbml0CitlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL3N5cy9uZXQvbml0LmggOyB0aGVuCisJVl9QQ0FQPW5pdAorZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9saW51eC9zb2NrZXQuaCA7IHRoZW4KKwlWX1BDQVA9bGludXgKK2VsaWYgdGVzdCAtciAvdXNyL2luY2x1ZGUvbmV0L3Jhdy5oIDsgdGhlbgorCVZfUENBUD1zbm9vcAorZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9vZG1pLmggOyB0aGVuCisJIworCSMgT24gQUlYLCB0aGUgQlBGIGRldmljZXMgbWlnaHQgbm90IHlldCBiZSBwcmVzZW50IC0gdGhleSdyZQorCSMgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBsaWJwY2FwIHJ1bnMgYWZ0ZXIgYm9vdGluZy4KKwkjIFdlIGNoZWNrIGZvciBvZG1pLmggaW5zdGVhZC4KKwkjCisJVl9QQ0FQPWJwZgorZWxpZiB0ZXN0IC1jIC9kZXYvYnBmMCA7IHRoZW4JCSMgY2hlY2sgYWdhaW4gaW4gY2FzZSBub3QgcmVhZGFibGUKKwlWX1BDQVA9YnBmCitlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL3N5cy9kbHBpLmggOyB0aGVuCisJVl9QQ0FQPWRscGkKK2VsaWYgdGVzdCAtYyAvZGV2L2VuZXQgOyB0aGVuCQkjIGNoZWNrIGFnYWluIGluIGNhc2Ugbm90IHJlYWRhYmxlCisJVl9QQ0FQPWVuZXQKK2VsaWYgdGVzdCAtYyAvZGV2L25pdCA7IHRoZW4JCSMgY2hlY2sgYWdhaW4gaW4gY2FzZSBub3QgcmVhZGFibGUKKwlWX1BDQVA9c25pdAorZWxzZQorCVZfUENBUD1udWxsCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRWX1BDQVAiID4mNQorJGFzX2VjaG8gIiRWX1BDQVAiID4mNjsgfQorCisjCisjIERvIGNhcHR1cmUtbWVjaGFuaXNtLWRlcGVuZGVudCB0ZXN0cy4KKyMKK2Nhc2UgIiRWX1BDQVAiIGluCitkbHBpKQorCSMKKwkjIENoZWNrcyB0byBzZWUgaWYgU29sYXJpcyBoYXMgdGhlIHB1YmxpYyBsaWJkbHBpKDNMSUIpIGxpYnJhcnkuCisJIyBOb3RlOiBUaGUgZXhpc3RlbmNlIG9mIC91c3IvaW5jbHVkZS9saWJkbHBpLmggZG9lcyBub3QgbWVhbiBpdCBpcyB0aGUKKwkjIHB1YmxpYyBsaWJkbHBpKDNMSUIpIHZlcnNpb24uIEJlZm9yZSBsaWJkbHBpIHdhcyBtYWRlIHB1YmxpYywgYQorCSMgcHJpdmF0ZSB2ZXJzaW9uIGFsc28gZXhpc3RlZCwgd2hpY2ggZGlkIG5vdCBoYXZlIHRoZSBzYW1lIEFQSXMuCisJIyBEdWUgdG8gYSBnY2MgYnVnLCB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgMzItYml0IGxpYnJhcmllcyBkb2VzCisJIyBub3QgaW5jbHVkZSAvbGliLCB3ZSBhZGQgaXQgZXhwbGljaXRseSBoZXJlLgorCSMgW2h0dHA6Ly9idWdzLm9wZW5zb2xhcmlzLm9yZy92aWV3X2J1Zy5kbz9idWdfaWQ9NjYxOTQ4NV0uCisJIyBBbHNvLCBkdWUgdG8gdGhlIGJ1ZyBhYm92ZSBhcHBsaWNhdGlvbnMgdGhhdCBsaW5rIHRvIGxpYnBjYXAgd2l0aAorCSMgbGliZGxwaSB3aWxsIGhhdmUgdG8gYWRkICItTC9saWIiIG9wdGlvbiB0byAiY29uZmlndXJlIi4KKwkjCisJc2F2ZWRfbGRmbGFncz0kTERGTEFHUworCUxERkxBR1M9IiRMSUJTIC1ML2xpYiIKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkbHBpX3dhbGsgaW4gLWxkbHBpIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBkbHBpX3dhbGsgaW4gLWxkbHBpLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9kbHBpX2RscGlfd2FsaytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGxwaSAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgZGxwaV93YWxrICgpOworaW50CittYWluICgpCit7CityZXR1cm4gZGxwaV93YWxrICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kbHBpX2RscGlfd2Fsaz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RscGlfZGxwaV93YWxrPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9kbHBpX2RscGlfd2FsayIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kbHBpX2RscGlfd2FsayIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kbHBpX2RscGlfd2FsayIgPSB4IiJ5ZXM7IHRoZW4gOgorICBMSUJTPSItbGRscGkgJExJQlMiCisJCVZfUENBUD1saWJkbHBpCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCRExQSSAxIiA+PmNvbmZkZWZzLmgKKworZWxzZQorICBWX1BDQVA9ZGxwaQorZmkKKworCUxERkxBR1M9JHNhdmVkX2xkZmxhZ3MKKworCSMKKwkjIENoZWNrcyB3aGV0aGVyIDxzeXMvZGxwaS5oPiBpcyB1c2FibGUsIHRvIGNhdGNoIHdlaXJkIFNDTworCSMgdmVyc2lvbnMgb2YgRExQSS4KKwkjCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIDxzeXMvZGxwaS5oPiBpcyB1c2FibGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciA8c3lzL2RscGkuaD4gaXMgdXNhYmxlLi4uICIgPiY2OyB9CisJaWYgdGVzdCAiJHthY19jdl9zeXNfZGxwaV91c2FibGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKwkJCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkJCSNpbmNsdWRlIDxzeXMvdGltZS5oPgorCQkJI2luY2x1ZGUgPHN5cy9kbHBpLmg+CisKK2ludAorbWFpbiAoKQoreworaW50IGkgPSBETF9QUk9NSVNDX1BIWVM7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3Zfc3lzX2RscGlfdXNhYmxlPXllcworZWxzZQorICBhY19jdl9zeXNfZGxwaV91c2FibGU9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3N5c19kbHBpX3VzYWJsZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X3N5c19kbHBpX3VzYWJsZSIgPiY2OyB9CisJaWYgdGVzdCAkYWNfY3Zfc3lzX2RscGlfdXNhYmxlID0gbm8gOyB0aGVuCisJCWFzX2ZuX2Vycm9yICQ/ICI8c3lzL2RscGkuaD4gaXMgbm90IHVzYWJsZSBvbiB0aGlzIHN5c3RlbTsgaXQgcHJvYmFibHkgaGFzIGEgbm9uLXN0YW5kYXJkIERMUEkiICIkTElORU5PIiA1CisJZmkKKworCSMKKwkjIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIC9kZXYvZGxwaSBkZXZpY2Ugb3IgaGF2ZSBtdWx0aXBsZSBkZXZpY2VzLgorCSMKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAvZGV2L2RscGkgZGV2aWNlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAvZGV2L2RscGkgZGV2aWNlLi4uICIgPiY2OyB9CisJaWYgdGVzdCAtYyAvZGV2L2RscGkgOyB0aGVuCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfREVWX0RMUEkgMSIgPj5jb25mZGVmcy5oCisKKwllbHNlCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCQlkaXI9Ii9kZXYvZGxwaSIKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGRpciBkaXJlY3RvcnkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRkaXIgZGlyZWN0b3J5Li4uICIgPiY2OyB9CisJCWlmIHRlc3QgLWQgJGRpciA7IHRoZW4KKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiB5ZXMiID4mNQorJGFzX2VjaG8gInllcyIgPiY2OyB9CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgUENBUF9ERVZfUFJFRklYICIkZGlyIgorX0FDRU9GCisKKwkJZWxzZQorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CisJCWZpCisJZmkKKworCSMKKwkjIFRoaXMgY2hlY2sgaXMgZm9yIFNvbGFyaXMgd2l0aCBETFBJIHN1cHBvcnQgZm9yIHBhc3NpdmUgbW9kZXMuCisJIyBTZWUgZGxwaSg3UCkgZm9yIG1vcmUgZGV0YWlscy4KKwkjCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBkbF9wYXNzaXZlX3JlcV90IHN0cnVjdCBleGlzdHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgZGxfcGFzc2l2ZV9yZXFfdCBzdHJ1Y3QgZXhpc3RzLi4uICIgPiY2OyB9CisgICAgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfaGFzX2RsX3Bhc3NpdmVfcmVxX3Qrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyMgICAgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjICAgICAgIGluY2x1ZGUgPHN5cy9kbHBpLmg+CitpbnQKK21haW4gKCkKK3sKK3VfaW50IGkgPSBzaXplb2YoZGxfcGFzc2l2ZV9yZXFfdCkKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9sYmxfaGFzX2RsX3Bhc3NpdmVfcmVxX3Q9eWVzCitlbHNlCisgIGFjX2N2X2xibF9oYXNfZGxfcGFzc2l2ZV9yZXFfdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX2hhc19kbF9wYXNzaXZlX3JlcV90IiA+JjY7IH0KKyAgICBpZiB0ZXN0ICRhY19jdl9sYmxfaGFzX2RsX3Bhc3NpdmVfcmVxX3QgPSB5ZXMgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfRExQSV9QQVNTSVZFIDEiID4+Y29uZmRlZnMuaAorCisgICAgZmkKKwk7OworCitsaW51eCkKKwkjCisJIyBEbyB3ZSBoYXZlIHRoZSB3aXJlbGVzcyBleHRlbnNpb25zPworCSMKKwlmb3IgYWNfaGVhZGVyIGluIGxpbnV4L3dpcmVsZXNzLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgImxpbnV4L3dpcmVsZXNzLmgiICJhY19jdl9oZWFkZXJfbGludXhfd2lyZWxlc3NfaCIgIgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X3dpcmVsZXNzX2giID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJTlVYX1dJUkVMRVNTX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisJIworCSMgRG8gd2UgaGF2ZSBsaWJubD8KKwkjCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlibmwgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2xpYm5sK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9saWJubDsgd2l0aF9saWJubD0kd2l0aHZhbAorZmkKKworCisJaWYgdGVzdCB4JHdpdGhfbGlibmwgIT0geG5vIDsgdGhlbgorCQkjCisJCSMgVHJ5IGxpYm5sIDIueCBmaXJzdC4KKwkJIworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBubF9zb2NrZXRfYWxsb2MgaW4gLWxubCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igbmxfc29ja2V0X2FsbG9jIGluIC1sbmwuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX25sX25sX3NvY2tldF9hbGxvYytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sbmwgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIG5sX3NvY2tldF9hbGxvYyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIG5sX3NvY2tldF9hbGxvYyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfbmxfbmxfc29ja2V0X2FsbG9jPXllcworZWxzZQorICBhY19jdl9saWJfbmxfbmxfc29ja2V0X2FsbG9jPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCisgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xpYl9ubF9ubF9zb2NrZXRfYWxsb2MiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfbmxfbmxfc29ja2V0X2FsbG9jIiA+JjY7IH0KK2lmIHRlc3QgIngkYWNfY3ZfbGliX25sX25sX3NvY2tldF9hbGxvYyIgPSB4IiJ5ZXM7IHRoZW4gOgorCisJCQkjCisJCQkjIFllcywgd2UgaGF2ZSBsaWJubCAyLnguCisJCQkjCisJCQlMSUJTPSItbG5sLWdlbmwgLWxubCAkTElCUyIKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9MSUJOTCAxIiA+PmNvbmZkZWZzLmgKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJQk5MXzJfeCAxIiA+PmNvbmZkZWZzLmgKKworCitlbHNlCisKKwkJCSMKKwkJCSMgTm8sIHdlIGRvbid0OyBkbyB3ZSBoYXZlIGxpYm5sIDEueD8KKwkJCSMKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIG5sX2hhbmRsZV9hbGxvYyBpbiAtbG5sIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBubF9oYW5kbGVfYWxsb2MgaW4gLWxubC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfbmxfbmxfaGFuZGxlX2FsbG9jK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxubCAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgbmxfaGFuZGxlX2FsbG9jICgpOworaW50CittYWluICgpCit7CityZXR1cm4gbmxfaGFuZGxlX2FsbG9jICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9ubF9ubF9oYW5kbGVfYWxsb2M9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9ubF9ubF9oYW5kbGVfYWxsb2M9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX25sX25sX2hhbmRsZV9hbGxvYyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9ubF9ubF9oYW5kbGVfYWxsb2MiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfbmxfbmxfaGFuZGxlX2FsbG9jIiA9IHgiInllczsgdGhlbiA6CisKKwkJCQkjCisJCQkJIyBZZXMuCisJCQkJIworCQkJCUxJQlM9Ii1sbmwgJExJQlMiCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfTElCTkwgMSIgPj5jb25mZGVmcy5oCisKKworZWxzZQorCisJCQkJIworCQkJCSMgTm8sIHdlIGRvbid0IGhhdmUgbGlibmwgYXQgYWxsLgorCQkJCSMKKwkJCQlpZiB0ZXN0IHgkd2l0aF9saWJubCA9IHh5ZXMgOyB0aGVuCisJCQkJCWFzX2ZuX2Vycm9yICQ/ICJsaWJubCBzdXBwb3J0IHJlcXVlc3RlZCBidXQgbGlibmwgbm90IGZvdW5kIiAiJExJTkVOTyIgNQorCQkJCWZpCisKK2ZpCisKKworZmkKKworCWZpCisKKwlmb3IgYWNfaGVhZGVyIGluIGxpbnV4L2V0aHRvb2wuaAorZG8gOgorICBhY19mbl9jX2NoZWNrX2hlYWRlcl9jb21waWxlICIkTElORU5PIiAibGludXgvZXRodG9vbC5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X2V0aHRvb2xfaCIgIgorJGFjX2luY2x1ZGVzX2RlZmF1bHQKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9ldGh0b29sX2giID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJTlVYX0VUSFRPT0xfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBpZl9wYWNrZXQuaCBoYXMgdHBhY2tldF9zdGF0cyBkZWZpbmVkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIGlmX3BhY2tldC5oIGhhcyB0cGFja2V0X3N0YXRzIGRlZmluZWQuLi4gIiA+JjY7IH0KKyAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX3RwYWNrZXRfc3RhdHMrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyMgIGluY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgoraW50CittYWluICgpCit7CitzdHJ1Y3QgdHBhY2tldF9zdGF0cyBzdGF0cworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xibF90cGFja2V0X3N0YXRzPXllcworZWxzZQorICBhY19jdl9sYmxfdHBhY2tldF9zdGF0cz1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9sYmxfdHBhY2tldF9zdGF0cyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF90cGFja2V0X3N0YXRzIiA+JjY7IH0KKyAgIGlmIHRlc3QgJGFjX2N2X2xibF90cGFja2V0X3N0YXRzID0geWVzOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfVFBBQ0tFVF9TVEFUUyAxIiA+PmNvbmZkZWZzLmgKKworICAgZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHRwYWNrZXRfYXV4ZGF0YSBzdHJ1Y3QgaGFzIHRwX3ZsYW5fdGNpIG1lbWJlciIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBpZiB0cGFja2V0X2F1eGRhdGEgc3RydWN0IGhhcyB0cF92bGFuX3RjaSBtZW1iZXIuLi4gIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9saW51eF90cGFja2V0X2F1eGRhdGFfdHBfdmxhbl90Y2krc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCWluY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgoraW50CittYWluICgpCit7Cit1X2ludCBpID0gc2l6ZW9mKCgoc3RydWN0IHRwYWNrZXRfYXV4ZGF0YSAqKTApLT50cF92bGFuX3RjaSkKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfY29tcGlsZSAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9sYmxfbGludXhfdHBhY2tldF9hdXhkYXRhX3RwX3ZsYW5fdGNpPXllcworZWxzZQorICBhY19jdl9sYmxfbGludXhfdHBhY2tldF9hdXhkYXRhX3RwX3ZsYW5fdGNpPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9sYmxfbGludXhfdHBhY2tldF9hdXhkYXRhX3RwX3ZsYW5fdGNpIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX2xpbnV4X3RwYWNrZXRfYXV4ZGF0YV90cF92bGFuX3RjaSIgPiY2OyB9CisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2xpbnV4X3RwYWNrZXRfYXV4ZGF0YV90cF92bGFuX3RjaSA9IHllcyA7IHRoZW4KKwkgICAgSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEE9dHBfdmxhbl90Y2kKKworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCisJOzsKKworYnBmKQorCSMKKwkjIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSB0aGUgKkJTRC1zdHlsZSBpb2N0bHMuCisJIworCWZvciBhY19oZWFkZXIgaW4gbmV0L2lmX21lZGlhLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIm5ldC9pZl9tZWRpYS5oIiAiYWNfY3ZfaGVhZGVyX25ldF9pZl9tZWRpYV9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9uZXRfaWZfbWVkaWFfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTkVUX0lGX01FRElBX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBzeXN0ZW0gc3VwcG9ydHMgemVyb2NvcHkgQlBGIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIHN5c3RlbSBzdXBwb3J0cyB6ZXJvY29weSBCUEYuLi4gIiA+JjY7IH0KKwljYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCSAgICAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisJICAgICNpbmNsdWRlIDxuZXQvaWYuaD4KKwkgICAgI2luY2x1ZGUgPG5ldC9icGYuaD4KK2ludAorbWFpbiAoKQoreworcmV0dXJuIChCSU9DUk9UWkJVRiArIEJQRl9CVUZNT0RFX1pCVUYpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9aRVJPQ09QWV9CUEYgMSIgPj5jb25mZGVmcy5oCisKKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKKworCSAgICAjCisJICAgICMgQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHN0cnVjdCBCUEZfVElNRVZBTC4KKwkgICAgIworCSAgICBhY19mbl9jX2NoZWNrX3R5cGUgIiRMSU5FTk8iICJzdHJ1Y3QgQlBGX1RJTUVWQUwiICJhY19jdl90eXBlX3N0cnVjdF9CUEZfVElNRVZBTCIgIgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmZGVmIEhBVkVfU1lTX0lPQ0NPTV9ICisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2JwZi5oPgorCisiCitpZiB0ZXN0ICJ4JGFjX2N2X3R5cGVfc3RydWN0X0JQRl9USU1FVkFMIiA9IHgiInllczsgdGhlbiA6CisKK2NhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9TVFJVQ1RfQlBGX1RJTUVWQUwgMQorX0FDRU9GCisKKworZmkKKworCTs7CisKK2RhZykKKwlWX0RFRlM9IiRWX0RFRlMgLUREQUdfT05MWSIKKwk7OworCitzZXB0ZWwpCisJVl9ERUZTPSIkVl9ERUZTIC1EU0VQVEVMX09OTFkiCisJOzsKKworc25mKQorCVZfREVGUz0iJFZfREVGUyAtRFNORl9PTkxZIgorCTs7CisKK251bGwpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYW5ub3QgZGV0ZXJtaW5lIHBhY2tldCBjYXB0dXJlIGludGVyZmFjZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiBjYW5ub3QgZGV0ZXJtaW5lIHBhY2tldCBjYXB0dXJlIGludGVyZmFjZSIgPiYyO30KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IChzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IChzZWUgdGhlIElOU1RBTEwgZG9jIGZvciBtb3JlIGluZm8pIiA+JjI7fQorCTs7Citlc2FjCisKK2lmIHRlc3QgIiRWX1BDQVAiID0gbnVsbAordGhlbgorCSMKKwkjIFdlIGNhbid0IGNhcHR1cmUsIHNvIHdlIGNhbid0IG9wZW4gYW55IGNhcHR1cmUKKwkjIGRldmljZXMsIHNvIHdlIHdvbid0IHJldHVybiBhbnkgaW50ZXJmYWNlcy4KKwkjCisJVl9GSU5EQUxMREVWUz1udWxsCitlbHNlCisJYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0aWZhZGRycyIgImFjX2N2X2Z1bmNfZ2V0aWZhZGRycyIKK2lmIHRlc3QgIngkYWNfY3ZfZnVuY19nZXRpZmFkZHJzIiA9IHgiInllczsgdGhlbiA6CisKKwkJIworCQkjIFdlIGhhdmUgImdldGlmYWRkcnMoKSI7IG1ha2Ugc3VyZSB3ZSBoYXZlIDxpZmFkZHJzLmg+CisJCSMgYXMgd2VsbCwganVzdCBpbiBjYXNlIHNvbWUgcGxhdGZvcm0gaXMgcmVhbGx5IHdlaXJkLgorCQkjCisJCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJpZmFkZHJzLmgiICJhY19jdl9oZWFkZXJfaWZhZGRyc19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9pZmFkZHJzX2giID0geCIieWVzOyB0aGVuIDoKKworCQkgICAgIworCQkgICAgIyBXZSBoYXZlIHRoZSBoZWFkZXIsIHNvIHdlIHVzZSAiZ2V0aWZhZGRycygpIiB0bworCQkgICAgIyBnZXQgdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcy4KKwkJICAgICMKKwkJICAgIFZfRklOREFMTERFVlM9Z2V0YWQKKworZWxzZQorCisJCSAgICAjCisJCSAgICAjIFdlIGRvbid0IGhhdmUgdGhlIGhlYWRlciAtIGdpdmUgdXAuCisJCSAgICAjIFhYWCAtIHdlIGNvdWxkIGFsc28gZmFsbCBiYWNrIG9uIHNvbWUgb3RoZXIKKwkJICAgICMgbWVjaGFuaXNtLCBidXQsIGZvciBub3csIHRoaXMnbGwgY2F0Y2ggdGhpcworCQkgICAgIyBwcm9ibGVtIHNvIHRoYXQgd2UgY2FuIGF0IGxlYXN0IHRyeSB0byBmaWd1cmUKKwkJICAgICMgb3V0IHNvbWV0aGluZyB0byBkbyBvbiBzeXN0ZW1zIHdpdGggImdldGlmYWRkcnMoKSIKKwkJICAgICMgYnV0IHdpdGhvdXQgImlmYWRkcnMuaCIsIGlmIHRoZXJlIGlzIHNvbWV0aGluZworCQkgICAgIyB3ZSBjYW4gZG8gb24gdGhvc2Ugc3lzdGVtcy4KKwkJICAgICMKKwkJICAgIGFzX2ZuX2Vycm9yICQ/ICJZb3VyIHN5c3RlbSBoYXMgZ2V0aWZhZGRycygpIGJ1dCBkb2Vzbid0IGhhdmUgYSB1c2FibGUgPGlmYWRkcnMuaD4uIiAiJExJTkVOTyIgNQorCitmaQorCisKKworZWxzZQorCisJCSMKKwkJIyBXZWxsLCB3ZSBkb24ndCBoYXZlICJnZXRpZmFkZHJzKCkiLCBzbyB3ZSBoYXZlIHRvIHVzZQorCQkjIHNvbWUgb3RoZXIgbWVjaGFuaXNtOyBkZXRlcm1pbmUgd2hhdCB0aGF0IG1lY2hhbmlzbSBpcy4KKwkJIworCQkjIFRoZSBmaXJzdCB0aGluZyB3ZSB1c2UgaXMgdGhlIHR5cGUgb2YgY2FwdHVyZSBtZWNoYW5pc20sCisJCSMgd2hpY2ggaXMgc29tZXdoYXQgb2YgYSBwcm94eSBmb3IgdGhlIE9TIHdlJ3JlIHVzaW5nLgorCQkjCisJCWNhc2UgIiRWX1BDQVAiIGluCisKKwkJZGxwaXxsaWJkbHBpKQorCQkJZm9yIGFjX2hlYWRlciBpbiBzeXMvYnVmbW9kLmggc3lzL2RscGlfZXh0LmgKK2RvIDoKKyAgYXNfYWNfSGVhZGVyPWAkYXNfZWNobyAiYWNfY3ZfaGVhZGVyXyRhY19oZWFkZXIiIHwgJGFzX3RyX3NoYAorYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgIiRhY19oZWFkZXIiICIkYXNfYWNfSGVhZGVyIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiBldmFsIHRlc3QgXCJ4XCQiJGFzX2FjX0hlYWRlciJcIiA9IHgieWVzIjsgdGhlbiA6CisgIGNhdCA+PmNvbmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgYCRhc19lY2hvICJIQVZFXyRhY19oZWFkZXIiIHwgJGFzX3RyX2NwcGAgMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCQkJIworCQkJIyBUaGlzIG1pZ2h0IGJlIFNvbGFyaXMgOCBvciBsYXRlciwgd2l0aAorCQkJIyBTSU9DR0xJRkNPTkYsIG9yIGl0IG1pZ2h0IGJlIHNvbWUgb3RoZXIgT1MKKwkJCSMgb3Igc29tZSBvbGRlciB2ZXJzaW9uIG9mIFNvbGFyaXMsIHdpdGgKKwkJCSMganVzdCBTSU9DR0lGQ09ORi4KKwkJCSMKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIFNJT0NHTElGQ09ORiIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgU0lPQ0dMSUZDT05GLi4uICIgPiY2OyB9CisJCQlpZiB0ZXN0ICIke2FjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKwkJCQkjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKwkJCQkjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisJCQkJI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwkJCQkjaW5jbHVkZSA8c3lzL3NvY2tpby5oPgoraW50CittYWluICgpCit7Citpb2N0bCgwLCBTSU9DR0xJRkNPTkYsIChjaGFyICopMCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mPXllcworZWxzZQorICBhY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmY9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwkJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mIiA+JjY7IH0KKwkJCWlmIHRlc3QgJGFjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZiA9IHllcyA7IHRoZW4KKwkJCQlWX0ZJTkRBTExERVZTPWdsaWZjCisJCQllbHNlCisJCQkJVl9GSU5EQUxMREVWUz1naWZjCisJCQlmaQorCQkJIworCQkJIyBOZWVkZWQgZm9yIGNvbW1vbiBmdW5jdGlvbnMgdXNlZCBieSBwY2FwLVtkbHBpLGxpYmRscGldLmMKKwkJCSMKKwkJIAlTU1JDPSJkbHBpc3Vicy5jIgorCQkJOzsKKworCQkqKQorCQkJIworCQkJIyBBc3N1bWUgd2UganVzdCBoYXZlIFNJT0NHSUZDT05GLgorCQkJIyAoWFhYIC0gb24gYXQgbGVhc3QgbGF0ZXIgTGludXgga2VybmVscywgdGhlcmUncworCQkJIyBhbm90aGVyIG1lY2hhbmlzbSwgYW5kIHdlIHNob3VsZCBiZSB1c2luZyB0aGF0CisJCQkjIGluc3RlYWQuKQorCQkJIworCQkJVl9GSU5EQUxMREVWUz1naWZjCisJCQk7OworCQllc2FjCitmaQorCitmaQorCitmaQorCisKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNvY2tsZW5fdCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3Igc29ja2xlbl90Li4uICIgPiY2OyB9CitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKwkjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisJI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKworaW50CittYWluICgpCit7Cisgc29ja2xlbl90IHg7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgaGF2ZV9zb2NrbGVuX3Q9eWVzCitlbHNlCisgIGhhdmVfc29ja2xlbl90PW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitpZiB0ZXN0ICJ4JGhhdmVfc29ja2xlbl90IiA9ICJ4eWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NPQ0tMRU5fVCAxIiA+PmNvbmZkZWZzLmgKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkaGF2ZV9zb2NrbGVuX3QiID4mNQorJGFzX2VjaG8gIiRoYXZlX3NvY2tsZW5fdCIgPiY2OyB9CisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1pcHY2IHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2lwdjYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9pcHY2OworZWxzZQorICBlbmFibGVfaXB2Nj1pZmF2YWlsYWJsZQorZmkKKworaWYgdGVzdCAiJGVuYWJsZV9pcHY2IiAhPSAibm8iOyB0aGVuCisJYWNfZm5fY19jaGVja19mdW5jICIkTElORU5PIiAiZ2V0YWRkcmluZm8iICJhY19jdl9mdW5jX2dldGFkZHJpbmZvIgoraWYgdGVzdCAieCRhY19jdl9mdW5jX2dldGFkZHJpbmZvIiA9IHgiInllczsgdGhlbiA6CisKKworJGFzX2VjaG8gIiNkZWZpbmUgSU5FVDYgMSIgPj5jb25mZGVmcy5oCisKKworZWxzZQorCisJCWlmIHRlc3QgIiRlbmFibGVfaXB2NiIgIT0gImlmYXZhaWxhYmxlIjsgdGhlbgorCQkJeyB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGVycm9yOiBpbiBcYCRhY19wd2QnOiIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBlcnJvcjogaW4gXGAkYWNfcHdkJzoiID4mMjt9Cithc19mbl9lcnJvciAkPyAiLS1lbmFibGUtaXB2NiB3YXMgZ2l2ZW4sIGJ1dCBnZXRhZGRyaW5mbyBpc24ndCBhdmFpbGFibGUKK1NlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMiICIkTElORU5PIiA1IDsgfQorCQlmaQorCitmaQorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgb3B0aW1pemVyIGRlYnVnZ2luZyBjb2RlIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgdG8gYnVpbGQgb3B0aW1pemVyIGRlYnVnZ2luZyBjb2RlLi4uICIgPiY2OyB9CisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtb3B0aW1pemVyLWRiZyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9vcHRpbWl6ZXJfZGJnK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfb3B0aW1pemVyX2RiZzsKK2ZpCisKK2lmIHRlc3QgIiRlbmFibGVfb3B0aW1pemVyX2RiZyIgPSAieWVzIjsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBCREVCVUcgMSIgPj5jb25mZGVmcy5oCisKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHtlbmFibGVfb3B0aW1pemVyX2RiZy1ub30iID4mNQorJGFzX2VjaG8gIiR7ZW5hYmxlX29wdGltaXplcl9kYmctbm99IiA+JjY7IH0KKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHBhcnNlciBkZWJ1Z2dpbmcgY29kZSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRvIGJ1aWxkIHBhcnNlciBkZWJ1Z2dpbmcgY29kZS4uLiAiID4mNjsgfQorIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLXl5ZGVidWcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfeXlkZWJ1ZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3l5ZGVidWc7CitmaQorCitpZiB0ZXN0ICIkZW5hYmxlX3l5ZGVidWciID0gInllcyI7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgWVlERUJVRyAxIiA+PmNvbmZkZWZzLmgKKworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAke2VuYWJsZV95eWRlYnVnLW5vfSIgPiY1CiskYXNfZWNobyAiJHtlbmFibGVfeXlkZWJ1Zy1ub30iID4mNjsgfQorCisjIENoZWNrIGZvciBFbmRhY2UgREFHIGNhcmQgc3VwcG9ydC4KKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1kYWcgd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2RhZytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGFnOworCWlmIHRlc3QgIiR3aXRodmFsIiA9IG5vCisJdGhlbgorCQkjIFVzZXIgZG9lc24ndCB3YW50IERBRyBzdXBwb3J0LgorCQl3YW50X2RhZz1ubworCWVsaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzCisJdGhlbgorCQkjIFVzZXIgd2FudHMgREFHIHN1cHBvcnQgYnV0IGhhc24ndCBzcGVjaWZpZWQgYSBkaXJlY3RvcnkuCisJCXdhbnRfZGFnPXllcworCWVsc2UKKwkJIyBVc2VyIHdhbnRzIERBRyBzdXBwb3J0IGFuZCBoYXMgc3BlY2lmaWVkIGEgZGlyZWN0b3J5LCBzbyB1c2UgdGhlIHByb3ZpZGVkIHZhbHVlLgorCQl3YW50X2RhZz15ZXMKKwkJZGFnX3Jvb3Q9JHdpdGh2YWwKKwlmaQorCitlbHNlCisKKwkjCisJIyBVc2UgREFHIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKKwkjCisJd2FudF9kYWc9aWZwcmVzZW50CisKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWRhZy1pbmNsdWRlcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGFnX2luY2x1ZGVzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9kYWdfaW5jbHVkZXM7CisJIyBVc2VyIHdhbnRzIERBRyBzdXBwb3J0IGFuZCBoYXMgc3BlY2lmaWVkIGEgaGVhZGVyIGRpcmVjdG9yeSwgc28gdXNlIHRoZSBwcm92aWRlZCB2YWx1ZS4KKwl3YW50X2RhZz15ZXMKKwlkYWdfaW5jbHVkZV9kaXI9JHdpdGh2YWwKKworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtZGFnLWxpYnJhcmllcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfZGFnX2xpYnJhcmllcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfZGFnX2xpYnJhcmllczsKKwkjIFVzZXIgd2FudHMgREFHIHN1cHBvcnQgYW5kIGhhcyBzcGVjaWZpZWQgYSBsaWJyYXJ5IGRpcmVjdG9yeSwgc28gdXNlIHRoZSBwcm92aWRlZCB2YWx1ZS4KKwl3YW50X2RhZz15ZXMKKwlkYWdfbGliX2Rpcj0kd2l0aHZhbAorCitmaQorCisKK2Nhc2UgIiRWX1BDQVAiIGluCitsaW51eHxicGZ8ZGFnKQorCSMKKwkjIFdlIHN1cHBvcnQgdGhlIERBRyBBUEkgaWYgd2UncmUgb24gTGludXggb3IgQlNELCBvciBpZiB3ZSdyZQorCSMgYnVpbGRpbmcgYSBEQUctb25seSBsaWJwY2FwLgorCSMKKwk7OworKikKKwkjCisJIyBJZiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBEQUcsIHRlbGwgdGhlbSBpdCdzIG5vdAorCSMgc3VwcG9ydGVkLgorCSMKKwkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCisJIworCWlmIHRlc3QgJHdhbnRfZGFnID0geWVzOyB0aGVuCisJCWFzX2ZuX2Vycm9yICQ/ICJEQUcgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoICdsaW51eCcgJ2JwZicgYW5kICdkYWcnIHBhY2tldCBjYXB0dXJlIHR5cGVzIiAiJExJTkVOTyIgNQorCWVsaWYgdGVzdCAkd2FudF9kYWcgPSB5ZXM7IHRoZW4KKwkJd2FudF9kYWc9bm8KKwlmaQorCTs7Citlc2FjCisKK2FjX2N2X2xibF9kYWdfYXBpPW5vCitpZiB0ZXN0ICIkd2FudF9kYWciICE9IG5vOyB0aGVuCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBEQUcgQVBJIGhlYWRlcnMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIERBRyBBUEkgaGVhZGVycy4uLiAiID4mNjsgfQorCisJIyBJZiBuZWNlc3NhcnksIHNldCBkZWZhdWx0IHBhdGhzIGZvciBEQUcgQVBJIGhlYWRlcnMgYW5kIGxpYnJhcmllcy4KKwlpZiB0ZXN0IC16ICIkZGFnX3Jvb3QiOyB0aGVuCisJICAgIGRhZ19yb290PS91c3IvbG9jYWwKKwlmaQorCisJaWYgdGVzdCAteiAiJGRhZ19pbmNsdWRlX2RpciI7IHRoZW4KKwkJZGFnX2luY2x1ZGVfZGlyPSIkZGFnX3Jvb3QvaW5jbHVkZSIKKwlmaQorCisJaWYgdGVzdCAteiAiJGRhZ19saWJfZGlyIjsgdGhlbgorCSAgICBkYWdfbGliX2Rpcj0iJGRhZ19yb290L2xpYiIKKwlmaQorCisJaWYgdGVzdCAteiAiJGRhZ190b29sc19kaXIiOyB0aGVuCisJICAgIGRhZ190b29sc19kaXI9IiRkYWdfcm9vdC90b29scyIKKwlmaQorCisJaWYgdGVzdCAtciAkZGFnX2luY2x1ZGVfZGlyL2RhZ2FwaS5oOyB0aGVuCisJCWFjX2N2X2xibF9kYWdfYXBpPXllcworCWZpCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9sYmxfZGFnX2FwaSAoJGRhZ19pbmNsdWRlX2RpcikiID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfZGFnX2FwaSAoJGRhZ19pbmNsdWRlX2RpcikiID4mNjsgfQorZmkKKworaWYgdGVzdCAkYWNfY3ZfbGJsX2RhZ19hcGkgPSB5ZXM7IHRoZW4KKwlWX0lOQ0xTPSIkVl9JTkNMUyAtSSRkYWdfaW5jbHVkZV9kaXIiCisKKwlpZiB0ZXN0ICRWX1BDQVAgIT0gZGFnIDsgdGhlbgorCQkgU1NSQz0icGNhcC1kYWcuYyIKKwlmaQorCisJIyBTZWUgaWYgd2UgY2FuIGZpbmQgYSBnZW5lcmFsIHZlcnNpb24gc3RyaW5nLgorCSMgRG9uJ3QgbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIExJQlMgdG8gcHJldmVudCAtbGRhZyBiZWluZworCSMgaW5jbHVkZWQgaWYgdGhlcmUncyBhIGZvdW5kLWFjdGlvbiAoYXJnIDMpLgorCXNhdmVkX2xkZmxhZ3M9JExERkxBR1MKKwlMREZMQUdTPSItTCRkYWdfbGliX2RpciIKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkYWdfYXR0YWNoX3N0cmVhbSBpbiAtbGRhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGFnX2F0dGFjaF9zdHJlYW0gaW4gLWxkYWcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RhZ19kYWdfYXR0YWNoX3N0cmVhbStzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGFnICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkYWdfYXR0YWNoX3N0cmVhbSAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRhZ19hdHRhY2hfc3RyZWFtICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW09eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW09bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RhZ19kYWdfYXR0YWNoX3N0cmVhbSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kYWdfZGFnX2F0dGFjaF9zdHJlYW0iID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGFnX2RhZ19hdHRhY2hfc3RyZWFtIiA9IHgiInllczsgdGhlbiA6CisgIGRhZ19zdHJlYW1zPSIxIgorZWxzZQorICBkYWdfc3RyZWFtcz0iMCIKK2ZpCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBkYWdfZ2V0X2VyZl90eXBlcyBpbiAtbGRhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGFnX2dldF9lcmZfdHlwZXMgaW4gLWxkYWcuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX2RhZ19kYWdfZ2V0X2VyZl90eXBlcytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sZGFnICAkTElCUyIKK2NhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworLyogT3ZlcnJpZGUgYW55IEdDQyBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuCisgICBVc2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBHQ0MKKyAgIGJ1aWx0aW4gYW5kIHRoZW4gaXRzIGFyZ3VtZW50IHByb3RvdHlwZSB3b3VsZCBzdGlsbCBhcHBseS4gICovCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorY2hhciBkYWdfZ2V0X2VyZl90eXBlcyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRhZ19nZXRfZXJmX3R5cGVzICgpOworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9saW5rICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xpYl9kYWdfZGFnX2dldF9lcmZfdHlwZXM9eWVzCitlbHNlCisgIGFjX2N2X2xpYl9kYWdfZGFnX2dldF9lcmZfdHlwZXM9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RhZ19kYWdfZ2V0X2VyZl90eXBlcyIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xpYl9kYWdfZGFnX2dldF9lcmZfdHlwZXMiID4mNjsgfQoraWYgdGVzdCAieCRhY19jdl9saWJfZGFnX2RhZ19nZXRfZXJmX3R5cGVzIiA9IHgiInllczsgdGhlbiA6CisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EQUdfR0VUX0VSRl9UWVBFUyAxIiA+PmNvbmZkZWZzLmgKKworZmkKKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcyBpbiAtbGRhZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzIGluIC1sZGFnLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2xpYl9kYWdfZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxkYWcgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcyAoKTsKK2ludAorbWFpbiAoKQoreworcmV0dXJuIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfZGFnX2RhZ19nZXRfc3RyZWFtX2VyZl90eXBlcz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX2RhZ19kYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXM9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX2RhZ19kYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXMiID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfZGFnX2RhZ19nZXRfc3RyZWFtX2VyZl90eXBlcyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9kYWdfZGFnX2dldF9zdHJlYW1fZXJmX3R5cGVzIiA9IHgiInllczsgdGhlbiA6CisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EQUdfR0VUX1NUUkVBTV9FUkZfVFlQRVMgMSIgPj5jb25mZGVmcy5oCisKK2ZpCisKKworCUxERkxBR1M9JHNhdmVkX2xkZmxhZ3MKKworCWlmIHRlc3QgIiRkYWdfc3RyZWFtcyIgPSAxOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfREFHX1NUUkVBTVNfQVBJIDEiID4+Y29uZmRlZnMuaAorCisJCUxJQlM9IiRMSUJTIC1sZGFnIgorCQlMREZMQUdTPSIkTERGTEFHUyAtTCRkYWdfbGliX2RpciIKKworCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciB2ZGFnX3NldF9kZXZpY2VfaW5mbyBpbiAtbHZkYWciID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIHZkYWdfc2V0X2RldmljZV9pbmZvIGluIC1sdmRhZy4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfdmRhZ192ZGFnX3NldF9kZXZpY2VfaW5mbytzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGFjX2NoZWNrX2xpYl9zYXZlX0xJQlM9JExJQlMKK0xJQlM9Ii1sdmRhZyAgJExJQlMiCitjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKy8qIE92ZXJyaWRlIGFueSBHQ0MgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLgorICAgVXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgR0NDCisgICBidWlsdGluIGFuZCB0aGVuIGl0cyBhcmd1bWVudCBwcm90b3R5cGUgd291bGQgc3RpbGwgYXBwbHkuICAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCisjZW5kaWYKK2NoYXIgdmRhZ19zZXRfZGV2aWNlX2luZm8gKCk7CitpbnQKK21haW4gKCkKK3sKK3JldHVybiB2ZGFnX3NldF9kZXZpY2VfaW5mbyAoKTsKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgoraWYgYWNfZm5fY190cnlfbGluayAiJExJTkVOTyI7IHRoZW4gOgorICBhY19jdl9saWJfdmRhZ192ZGFnX3NldF9kZXZpY2VfaW5mbz15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3ZkYWdfdmRhZ19zZXRfZGV2aWNlX2luZm89bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKKyAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAorTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUworZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGliX3ZkYWdfdmRhZ19zZXRfZGV2aWNlX2luZm8iID4mNQorJGFzX2VjaG8gIiRhY19jdl9saWJfdmRhZ192ZGFnX3NldF9kZXZpY2VfaW5mbyIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl92ZGFnX3ZkYWdfc2V0X2RldmljZV9pbmZvIiA9IHgiInllczsgdGhlbiA6CisgIGFjX2RhZ19oYXZlX3ZkYWc9IjEiCitlbHNlCisgIGFjX2RhZ19oYXZlX3ZkYWc9IjAiCitmaQorCisJCWlmIHRlc3QgIiRhY19kYWdfaGF2ZV92ZGFnIiA9IDE7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EQUdfVkRBRyAxIiA+PmNvbmZkZWZzLmgKKworCQkJTElCUz0iJExJQlMgLWxwdGhyZWFkIgorCQlmaQorCWZpCisKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9EQUdfQVBJIDEiID4+Y29uZmRlZnMuaAorCitmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSB0aGUgREFHIEFQSSIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHdlIGhhdmUgdGhlIERBRyBBUEkuLi4gIiA+JjY7IH0KKworaWYgdGVzdCAkYWNfY3ZfbGJsX2RhZ19hcGkgPSBubzsgdGhlbgorCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorCWlmIHRlc3QgIiR3YW50X2RhZyIgPSB5ZXM7IHRoZW4KKyAgICAgICAgCSMgVXNlciB3YW50ZWQgREFHIHN1cHBvcnQgYnV0IHdlIGNvdWxkbid0IGZpbmQgaXQuCisJCWFzX2ZuX2Vycm9yICQ/ICJEQUcgQVBJIHJlcXVlc3RlZCwgYnV0IG5vdCBmb3VuZCBhdCAkZGFnX3Jvb3Q6IHVzZSAtLXdpdGhvdXQtZGFnIiAiJExJTkVOTyIgNQorCWZpCisKKwlpZiB0ZXN0ICIkVl9QQ0FQIiA9IGRhZzsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkICJkYWciIGNhcHR1cmUgdHlwZSBidXQgdGhlIERBRyBBUEkgd2Fzbid0CisJCSMgZm91bmQuCisJCWFzX2ZuX2Vycm9yICQ/ICJTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgXCJkYWdcIiByZXF1aXJlcyB0aGUgREFHIEFQSSB0byBiZSBwcmVzZW50OyB1c2UgdGhlIC0td2l0aC1kYWcgb3B0aW9ucyB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbi4gKFRyeSBcIi4vY29uZmlndXJlIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLikiICIkTElORU5PIiA1CisJZmkKK2Vsc2UKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogeWVzIiA+JjUKKyRhc19lY2hvICJ5ZXMiID4mNjsgfQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNlcHRlbCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc2VwdGVsK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zZXB0ZWw7CisJaWYgdGVzdCAiJHdpdGh2YWwiID0gbm8KKwl0aGVuCisJCXdhbnRfc2VwdGVsPW5vCisJZWxpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXMKKwl0aGVuCisJCXdhbnRfc2VwdGVsPXllcworCQlzZXB0ZWxfcm9vdD0KKwllbHNlCisJCXdhbnRfc2VwdGVsPXllcworCQlzZXB0ZWxfcm9vdD0kd2l0aHZhbAorCWZpCisKK2Vsc2UKKworCSMKKwkjIFVzZSBTZXB0ZWwgQVBJIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkb24ndAorCSMKKwl3YW50X3NlcHRlbD1pZnByZXNlbnQKKwlzZXB0ZWxfcm9vdD0uLy4uL3NlcHRlbAorCitmaQorCithY19jdl9sYmxfc2VwdGVsX2FwaT1ubworY2FzZSAiJFZfUENBUCIgaW4KK2xpbnV4fHNlcHRlbCkKKwkjCisJIyBXZSBzdXBwb3J0IHRoZSBTZXB0ZWwgQVBJIGlmIHdlJ3JlIG9uIExpbnV4LCBvciBpZiB3ZSdyZSBidWlsZGluZworCSMgYSBTZXB0ZWwtb25seSBsaWJwY2FwLgorCSMKKwk7OworKikKKwkjCisJIyBJZiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RlZCBTZXB0ZWwsIHRlbGwgdGhlbSBpdCdzIG5vdAorCSMgc3VwcG9ydGVkLgorCSMKKwkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCisJIworCWlmIHRlc3QgJHdhbnRfc2VwdGVsID0geWVzOyB0aGVuCisJCWFzX2ZuX2Vycm9yICQ/ICJTZXB0ZWwgc3VwcG9ydCBvbmx5IGF2YWlsYWJsZSB3aXRoICdsaW51eCcgYW5kICdzZXB0ZWwnIHBhY2tldCBjYXB0dXJlIHR5cGVzIiAiJExJTkVOTyIgNQorCWVsaWYgdGVzdCAkd2FudF9zZXB0ZWwgPSB5ZXM7IHRoZW4KKwkJd2FudF9zZXB0ZWw9bm8KKwlmaQorCTs7Citlc2FjCisKK2lmIHRlc3QgIiR3aXRoX3NlcHRlbCIgIT0gbm87IHRoZW4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBTZXB0ZWwgQVBJIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBTZXB0ZWwgQVBJLi4uICIgPiY2OyB9CisKKwlpZiB0ZXN0IC16ICIkc2VwdGVsX3Jvb3QiOyB0aGVuCisJCXNlcHRlbF9yb290PSRzcmNkaXIvLi4vc2VwdGVsCisJZmkKKworCXNlcHRlbF90b29sc19kaXI9IiRzZXB0ZWxfcm9vdCIKKwlzZXB0ZWxfaW5jbHVkZV9kaXI9IiRzZXB0ZWxfcm9vdC9JTkMiCisKKwlhY19jdl9sYmxfc2VwdGVsX2FwaT1ubworCWlmIHRlc3QgLXIgIiRzZXB0ZWxfaW5jbHVkZV9kaXIvbXNnLmgiOyB0aGVuCisJCVZfSU5DTFM9IiRWX0lOQ0xTIC1JJHNlcHRlbF9pbmNsdWRlX2RpciIKKwkJQURETE9CSlM9IiRBRERMT0JKUyAkc2VwdGVsX3Rvb2xzX2Rpci9hc2NpaWJpbi5vICRzZXB0ZWxfdG9vbHNfZGlyL2JpdDJieXRlLm8gJHNlcHRlbF90b29sc19kaXIvY29uZmlybS5vICRzZXB0ZWxfdG9vbHNfZGlyL2ZtdG1zZy5vICRzZXB0ZWxfdG9vbHNfZGlyL2djdF91bml4Lm8gJHNlcHRlbF90b29sc19kaXIvaHF1ZXVlLm8gJHNlcHRlbF90b29sc19kaXIvaWRlbnQubyAkc2VwdGVsX3Rvb2xzX2Rpci9tZW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9wYWNrLm8gJHNlcHRlbF90b29sc19kaXIvcGFyc2UubyAkc2VwdGVsX3Rvb2xzX2Rpci9wb29sLm8gJHNlcHRlbF90b29sc19kaXIvc2Rsc2lnLm8gJHNlcHRlbF90b29sc19kaXIvc3RydG9udW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci90aW1lci5vICRzZXB0ZWxfdG9vbHNfZGlyL3RyYWNlLm8iCisJCUFERExBUkNISVZFT0JKUz0iJEFERExBUkNISVZFT0JKUyAkc2VwdGVsX3Rvb2xzX2Rpci9hc2NpaWJpbi5vICRzZXB0ZWxfdG9vbHNfZGlyL2JpdDJieXRlLm8gJHNlcHRlbF90b29sc19kaXIvY29uZmlybS5vICRzZXB0ZWxfdG9vbHNfZGlyL2ZtdG1zZy5vICRzZXB0ZWxfdG9vbHNfZGlyL2djdF91bml4Lm8gJHNlcHRlbF90b29sc19kaXIvaHF1ZXVlLm8gJHNlcHRlbF90b29sc19kaXIvaWRlbnQubyAkc2VwdGVsX3Rvb2xzX2Rpci9tZW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci9wYWNrLm8gJHNlcHRlbF90b29sc19kaXIvcGFyc2UubyAkc2VwdGVsX3Rvb2xzX2Rpci9wb29sLm8gJHNlcHRlbF90b29sc19kaXIvc2Rsc2lnLm8gJHNlcHRlbF90b29sc19kaXIvc3RydG9udW0ubyAkc2VwdGVsX3Rvb2xzX2Rpci90aW1lci5vICRzZXB0ZWxfdG9vbHNfZGlyL3RyYWNlLm8iCisKKwkJaWYgdGVzdCAiJFZfUENBUCIgIT0gc2VwdGVsIDsgdGhlbgorCQkJIFNTUkM9InBjYXAtc2VwdGVsLmMiCisJCWZpCisJCWFjX2N2X2xibF9zZXB0ZWxfYXBpPXllcworCWZpCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9zZXB0ZWxfYXBpIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX3NlcHRlbF9hcGkiID4mNjsgfQorCWlmIHRlc3QgJGFjX2N2X2xibF9zZXB0ZWxfYXBpID0gbm87IHRoZW4KKwkJaWYgdGVzdCAiJHdhbnRfc2VwdGVsIiA9IHllczsgdGhlbgorCQkJYXNfZm5fZXJyb3IgJD8gIlNlcHRlbCBBUEkgbm90IGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAkc2VwdGVsX3Jvb3Q7IHVzZSAtLXdpdGhvdXQtc2VwdGVsIiAiJExJTkVOTyIgNQorCQlmaQorCWVsc2UKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TRVBURUxfQVBJIDEiID4+Y29uZmRlZnMuaAorCisJZmkKK2ZpCisKK2lmIHRlc3QgIiRWX1BDQVAiID0gc2VwdGVsIC1hICIkYWNfY3ZfbGJsX3NlcHRlbF9hcGkiID0gbm87IHRoZW4KKwlhc19mbl9lcnJvciAkPyAiU3BlY2lmeWluZyB0aGUgY2FwdHVyZSB0eXBlIGFzICdzZXB0ZWwnIHJlcXVpcmVzIHRoZSBTZXB0ZWwgQVBJIHRvIGJlIHByZXNlbnQ7IHVzZSAtLXdpdGgtc2VwdGVsPURJUiIgIiRMSU5FTk8iIDUKK2ZpCisKKyMgQ2hlY2sgZm9yIE15cmljb20gU05GIHN1cHBvcnQuCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc25mIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7d2l0aF9zbmYrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX3NuZjsKKwlpZiB0ZXN0ICIkd2l0aHZhbCIgPSBubworCXRoZW4KKwkJIyBVc2VyIGV4cGxpY2l0bHkgZG9lc24ndCB3YW50IFNORgorCQl3YW50X3NuZj1ubworCWVsaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzCisJdGhlbgorCQkjIFVzZXIgd2FudHMgU05GIHN1cHBvcnQgYnV0IGhhc24ndCBzcGVjaWZpYyBhIGRpcmVjdG9yeS4KKwkJd2FudF9zbmY9eWVzCisJZWxzZQorCQkjIFVzZXIgd2FudHMgU05GIHN1cHBvcnQgd2l0aCBhIHNwZWNpZmllZCBkaXJlY3RvcnkuCisJCXdhbnRfc25mPXllcworCQlzbmZfcm9vdD0kd2l0aHZhbAorCWZpCisKK2Vsc2UKKworCSMKKwkjIFVzZSBTbmlmZmVyIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKKwkjCisJd2FudF9zbmY9aWZwcmVzZW50CisKK2ZpCisKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLXNuZi1pbmNsdWRlcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc25mX2luY2x1ZGVzK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9zbmZfaW5jbHVkZXM7CisJIyBVc2VyIHdhbnRzIFNORiB3aXRoIHNwZWNpZmljIGhlYWRlciBkaXJlY3RvcnkKKwl3YW50X3NuZj15ZXMKKwlzbmZfaW5jbHVkZV9kaXI9JHdpdGh2YWwKKworZmkKKworCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtc25mLWxpYnJhcmllcyB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke3dpdGhfc25mX2xpYnJhcmllcytzZXR9IiA9IHNldDsgdGhlbiA6CisgIHdpdGh2YWw9JHdpdGhfc25mX2xpYnJhcmllczsKKwkjIFVzZXIgd2FudHMgU05GIHdpdGggc3BlY2lmaWMgbGliIGRpcmVjdG9yeQorCXdhbnRfc25mPXllcworCXNuZl9saWJfZGlyPSR3aXRodmFsCisKK2ZpCisKKworY2FzZSAiJFZfUENBUCIgaW4KK2JwZnxsaW51eHxzbmYpCisJIworCSMgV2Ugc3VwcG9ydCB0aGUgU25pZmZlciBBUEkgaWYgd2UncmUgb24gQlNELCBMaW51eCwgb3IgaWYgd2UncmUKKwkjIGJ1aWxkaW5nIGEgU25pZmZlci1vbmx5IGxpYnBjYXAuCisJIworCTs7CisqKQorCSMKKwkjIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIFNuaWZmZXIsIHRlbGwgdGhlbSBpdCdzIG5vdAorCSMgc3VwcG9ydGVkLgorCSMKKwkjIElmIHRoZXkgZXhwcmVzc2VkIG5vIHByZWZlcmVuY2UsIGRvbid0IGluY2x1ZGUgaXQuCisJIworCWlmIHRlc3QgJHdhbnRfc25mID0geWVzOyB0aGVuCisJCWFzX2ZuX2Vycm9yICQ/ICJNeXJpY29tIFNORiBzdXBwb3J0IG9ubHkgYXZhaWxhYmxlIHdpdGggJ2JwZicgJ2xpbnV4JyBhbmQgJ3NuZicgcGFja2V0IGNhcHR1cmUgdHlwZXMiICIkTElORU5PIiA1CisJZWxpZiB0ZXN0ICR3YW50X3NuZiA9IHllczsgdGhlbgorCQl3YW50X3NuZj1ubworCWZpCisJOzsKK2VzYWMKKworYWNfY3ZfbGJsX3NuZl9hcGk9bm8KK2lmIHRlc3QgIiR3aXRoX3NuZiIgIT0gbm87IHRoZW4KKworCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIE15cmljb20gU25pZmZlciBBUEkiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBoYXZlIE15cmljb20gU25pZmZlciBBUEkuLi4gIiA+JjY7IH0KKworCWlmIHRlc3QgLXogIiRzbmZfcm9vdCI7IHRoZW4KKwkJc25mX3Jvb3Q9L29wdC9zbmYKKwlmaQorCisJaWYgdGVzdCAteiAiJHNuZl9pbmNsdWRlX2RpciI7IHRoZW4KKwkJc25mX2luY2x1ZGVfZGlyPSIkc25mX3Jvb3QvaW5jbHVkZSIKKwlmaQorCisJaWYgdGVzdCAteiAiJHNuZl9saWJfZGlyIjsgdGhlbgorCQlzbmZfbGliX2Rpcj0iJHNuZl9yb290L2xpYiIKKwlmaQorCisJaWYgdGVzdCAtZiAiJHNuZl9pbmNsdWRlX2Rpci9zbmYuaCI7IHRoZW4KKwkJYWNfY3ZfbGJsX3NuZl9hcGk9eWVzCisJZmkKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9zbmZfYXBpICgkc25mX3Jvb3QpIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX3NuZl9hcGkgKCRzbmZfcm9vdCkiID4mNjsgfQorCisJaWYgdGVzdCAkYWNfY3ZfbGJsX3NuZl9hcGkgPSBubzsgdGhlbgorCQlpZiB0ZXN0ICIkd2FudF9zbmYiID0geWVzOyB0aGVuCisJCQlhc19mbl9lcnJvciAkPyAiU05GIEFQSSBoZWFkZXJzIG5vdCBmb3VuZCB1bmRlciAkc25mX2luY2x1ZGVfZGlyOyB1c2UgLS13aXRob3V0LXNuZiIgIiRMSU5FTk8iIDUKKwkJZmkKKwllbHNlCisJCXNhdmVkX2xkZmxhZ3M9JExERkxBR1MKKwkJTERGTEFHUz0iJExERkxBR1MgLUwkc25mX2xpYl9kaXIiCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIHNuZl9pbml0IGluIC1sc25mIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciBzbmZfaW5pdCBpbiAtbHNuZi4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9saWJfc25mX3NuZl9pbml0K3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWxzbmYgICRMSUJTIgorY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIHNuZl9pbml0ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gc25mX2luaXQgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2xpbmsgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGliX3NuZl9zbmZfaW5pdD15ZXMKK2Vsc2UKKyAgYWNfY3ZfbGliX3NuZl9zbmZfaW5pdD1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CitMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCitmaQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9saWJfc25mX3NuZl9pbml0IiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGliX3NuZl9zbmZfaW5pdCIgPiY2OyB9CitpZiB0ZXN0ICJ4JGFjX2N2X2xpYl9zbmZfc25mX2luaXQiID0geCIieWVzOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX3NuZl9hcGk9InllcyIKK2Vsc2UKKyAgYWNfY3ZfbGJsX3NuZl9hcGk9Im5vIgorZmkKKworCQlMREZMQUdTPSIkc2F2ZWRfbGRmbGFncyIKKworCQlpZiB0ZXN0ICRhY19jdl9sYmxfc25mX2FwaSA9IG5vOyB0aGVuCisJCQlpZiB0ZXN0ICIkd2FudF9zbmYiID0geWVzOyB0aGVuCisJCQkJYXNfZm5fZXJyb3IgJD8gIlNORiBBUEkgY2Fubm90IGNvcnJlY3RseSBiZSBsaW5rZWQgY2hlY2sgY29uZmlnLmxvZzsgdXNlIC0td2l0aG91dC1zbmYiICIkTElORU5PIiA1CisJCQlmaQorCQllbHNlCisJCQlWX0lOQ0xTPSIkVl9JTkNMUyAtSSRzbmZfaW5jbHVkZV9kaXIiCisJCQlMSUJTPSIkTElCUyAtbHNuZiIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1MJHNuZl9saWJfZGlyIgorCQkJaWYgdGVzdCAiJFZfUENBUCIgIT0gc25mIDsgdGhlbgorCQkJCVNTUkM9InBjYXAtc25mLmMiCisJCQlmaQorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NORl9BUEkgMSIgPj5jb25mZGVmcy5oCisKKwkJZmkKKwlmaQorZmkKKworaWYgdGVzdCAiJFZfUENBUCIgPSBzbmYgLWEgIiRhY19jdl9sYmxfc25mX2FwaSIgPSBubzsgdGhlbgorCWFzX2ZuX2Vycm9yICQ/ICJTcGVjaWZ5aW5nIHRoZSBjYXB0dXJlIHR5cGUgYXMgJ3NuZicgcmVxdWlyZXMgdGhlIE15cmljb20gU25pZmZlciBBUEkgdG8gYmUgcHJlc2VudDsgdXNlIC0td2l0aC1zbmY9RElSIiAiJExJTkVOTyIgNQorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWZsZXggd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2ZsZXgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICB3aXRodmFsPSR3aXRoX2ZsZXg7CitmaQorCisKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtYmlzb24gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHt3aXRoX2Jpc29uK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgd2l0aHZhbD0kd2l0aF9iaXNvbjsKK2ZpCisKKyAgICBpZiB0ZXN0ICIkd2l0aF9mbGV4IiA9IG5vIDsgdGhlbgorCSAgICBWX0xFWD1sZXgKKyAgICBlbHNlCisJICAgIGZvciBhY19wcm9nIGluIGZsZXgKK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19WX0xFWCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRWX0xFWCI7IHRoZW4KKyAgYWNfY3ZfcHJvZ19WX0xFWD0iJFZfTEVYIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfVl9MRVg9IiRhY19wcm9nIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK1ZfTEVYPSRhY19jdl9wcm9nX1ZfTEVYCitpZiB0ZXN0IC1uICIkVl9MRVgiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkVl9MRVgiID4mNQorJGFzX2VjaG8gIiRWX0xFWCIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCisgIHRlc3QgLW4gIiRWX0xFWCIgJiYgYnJlYWsKK2RvbmUKK3Rlc3QgLW4gIiRWX0xFWCIgfHwgVl9MRVg9ImxleCIKKworICAgIGZpCisgICAgaWYgdGVzdCAiJFZfTEVYIiA9IGZsZXggOyB0aGVuCisJICAgICMgVGhlIC1WIGZsYWcgd2FzIGFkZGVkIGluIDIuNAorCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBmbGV4IDIuNCBvciBoaWdoZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yIGZsZXggMi40IG9yIGhpZ2hlci4uLiAiID4mNjsgfQorCSAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9mbGV4X3YyNCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGZsZXggLVYgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCQlhY19jdl9sYmxfZmxleF92MjQ9eWVzCisJCWVsc2UKKwkJCWFjX2N2X2xibF9mbGV4X3YyND1ubworCQlmaQorZmkKKworCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9mbGV4X3YyNCIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9mbGV4X3YyNCIgPiY2OyB9CisJICAgIGlmIHRlc3QgJGFjX2N2X2xibF9mbGV4X3YyNCA9IG5vIDsgdGhlbgorCQkgICAgcz0iMi40IG9yIGhpZ2hlciByZXF1aXJlZCIKKwkJICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogaWdub3Jpbmcgb2Jzb2xldGUgZmxleCBleGVjdXRhYmxlICgkcykiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogaWdub3Jpbmcgb2Jzb2xldGUgZmxleCBleGVjdXRhYmxlICgkcykiID4mMjt9CisJCSAgICBWX0xFWD1sZXgKKwkgICAgZmkKKyAgICBmaQorICAgIGlmIHRlc3QgIiR3aXRoX2Jpc29uIiA9IG5vIDsgdGhlbgorCSAgICBWX1lBQ0M9eWFjYworICAgIGVsc2UKKwkgICAgZm9yIGFjX3Byb2cgaW4gYmlzb24KK2RvCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJGFjX3Byb2ciLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgorc2V0IGR1bW15ICRhY19wcm9nOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19WX1lBQ0Mrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkVl9ZQUNDIjsgdGhlbgorICBhY19jdl9wcm9nX1ZfWUFDQz0iJFZfWUFDQyIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX1ZfWUFDQz0iJGFjX3Byb2ciCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZm91bmQgJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgPiY1CisgICAgYnJlYWsgMgorICBmaQorZG9uZQorICBkb25lCitJRlM9JGFzX3NhdmVfSUZTCisKK2ZpCitmaQorVl9ZQUNDPSRhY19jdl9wcm9nX1ZfWUFDQworaWYgdGVzdCAtbiAiJFZfWUFDQyI7IHRoZW4KKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRWX1lBQ0MiID4mNQorJGFzX2VjaG8gIiRWX1lBQ0MiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKworICB0ZXN0IC1uICIkVl9ZQUNDIiAmJiBicmVhaworZG9uZQordGVzdCAtbiAiJFZfWUFDQyIgfHwgVl9ZQUNDPSJ5YWNjIgorCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkVl9ZQUNDIiA9IGJpc29uIDsgdGhlbgorCSAgICBWX1lBQ0M9IiRWX1lBQ0MgLXkiCisgICAgZmkKKyAgICBpZiB0ZXN0ICIkVl9MRVgiICE9IGxleCAtYSAiJFZfWUFDQyIgPSB5YWNjIC1vICIkVl9MRVgiID0gbGV4IC1hICIkVl9ZQUNDIiAhPSB5YWNjIDsgdGhlbgorCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IGRvbid0IGhhdmUgYm90aCBmbGV4IGFuZCBiaXNvbjsgcmV2ZXJ0aW5nIHRvIGxleC95YWNjIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGRvbid0IGhhdmUgYm90aCBmbGV4IGFuZCBiaXNvbjsgcmV2ZXJ0aW5nIHRvIGxleC95YWNjIiA+JjI7fQorCSAgICBWX0xFWD1sZXgKKwkgICAgVl9ZQUNDPXlhY2MKKyAgICBmaQorICAgIGlmIHRlc3QgIiRWX0xFWCIgPSBmbGV4IC1hIC1uICJwY2FwXyIgOyB0aGVuCisJICAgIFZfTEVYPSIkVl9MRVggLVBwY2FwXyIKKwkgICAgVl9ZQUNDPSIkVl9ZQUNDIC1wIHBjYXBfIgorICAgIGZpCitpZiB0ZXN0ICIkVl9MRVgiID0gbGV4IDsgdGhlbgorIyBTb21lIHZlcnNpb25zIG9mIGxleCBjYW4ndCBoYW5kbGUgdGhlIGRlZmluaXRpb25zIHNlY3Rpb24gb2Ygc2Nhbm5lci5sIC4KKyMgVHJ5IGxleGluZyBpdCBhbmQgY29tcGxhaW4gaWYgaXQgY2FuJ3QgZGVhbC4KKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBjYXBhYmxlIGxleCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgY2FwYWJsZSBsZXguLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7dGNwZHVtcF9jdl9jYXBhYmxlX2xleCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIGxleCAtdCBzY2FubmVyLmwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorCQkJdGNwZHVtcF9jdl9jYXBhYmxlX2xleD15ZXMKKwkJZWxzZQorCQkJdGNwZHVtcF9jdl9jYXBhYmxlX2xleD1pbnN1ZmZpY2llbnQKKwkJZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJHRjcGR1bXBfY3ZfY2FwYWJsZV9sZXgiID4mNQorJGFzX2VjaG8gIiR0Y3BkdW1wX2N2X2NhcGFibGVfbGV4IiA+JjY7IH0KKwlpZiB0ZXN0ICR0Y3BkdW1wX2N2X2NhcGFibGVfbGV4ID0gaW5zdWZmaWNpZW50IDsgdGhlbgorCQlhc19mbl9lcnJvciAkPyAiWW91ciBvcGVyYXRpbmcgc3lzdGVtJ3MgbGV4IGlzIGluc3VmZmljaWVudCB0byBjb21waWxlCisgbGlicGNhcC4gIGZsZXggaXMgYSBsZXggcmVwbGFjZW1lbnQgdGhhdCBoYXMgbWFueSBhZHZhbnRhZ2VzLCBpbmNsdWRpbmcKKyBiZWluZyBhYmxlIHRvIGNvbXBpbGUgbGlicGNhcC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKKyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZmxleC9mbGV4Lmh0bWwgLiIgIiRMSU5FTk8iIDUKKwlmaQorZmkKKworIworIyBBc3N1bWUsIGJ5IGRlZmF1bHQsIG5vIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgYW5kIFY3L0JTRCBjb252ZW50aW9uCisjIGZvciBtYW4gcGFnZXMgKGZpbGUgZm9ybWF0cyBpbiBzZWN0aW9uIDUsIG1pc2NlbGxhbmVvdXMgaW5mbyBpbiBzZWN0aW9uIDcpLgorIyBJbmRpdmlkdWFsIGNhc2VzIGNhbiBvdmVycmlkZSB0aGlzLgorIworRFlFWFQ9Im5vbmUiCitNQU5fRklMRV9GT1JNQVRTPTUKK01BTl9NSVNDX0lORk89NworY2FzZSAiJGhvc3Rfb3MiIGluCisKK2FpeCopCisKKyRhc19lY2hvICIjZGVmaW5lIF9TVU4gMSIgPj5jb25mZGVmcy5oCisKKworCSMKKwkjIEFJWCBtYWtlcyBpdCBmdW4gdG8gYnVpbGQgc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLAorCSMgYmVjYXVzZSB0aGV5J3JlICpib3RoKiAiLmEiIGFyY2hpdmUgbGlicmFyaWVzLiAgV2UKKwkjIGJ1aWxkIHRoZSBzdGF0aWMgbGlicmFyeSBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIHRyYWRpdGlvbmFsCisJIyBzY2hlbWUgb2YgYnVpbGRpbmcgbGlicGNhcCBhbmQgdGNwZHVtcCBpbiBzdWJkaXJlY3RvcmllcyBvZgorCSMgdGhlIHNhbWUgZGlyZWN0b3J5LCB3aXRoIHRjcGR1bXAgc3RhdGljYWxseSBsaW5rZWQgd2l0aCB0aGUKKwkjIGxpYnBjYXAgaW4gcXVlc3Rpb24sIGJ1dCB3ZSBhbHNvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgYXMKKwkjICJsaWJwY2FwLnNoYXJlZGEiIGFuZCBpbnN0YWxsICppdCosIHJhdGhlciB0aGFuIHRoZSBzdGF0aWMKKwkjIGxpYnJhcnksIGFzICJsaWJwY2FwLmEiLgorCSMKKwlEWUVYVD0ic2hhcmVkYSIKKworCWNhc2UgIiRWX1BDQVAiIGluCisKKwlkbHBpKQorCQkjCisJCSMgSWYgd2UncmUgdXNpbmcgRExQSSwgYXBwbGljYXRpb25zIHdpbGwgbmVlZCB0bworCQkjIHVzZSAvbGliL3BzZS5leHAgaWYgcHJlc2VudCwgYXMgd2UgdXNlIHRoZQorCQkjIFNUUkVBTVMgcm91dGluZXMuCisJCSMKKwkJcHNlZXhlPSIvbGliL3BzZS5leHAiCisJCXsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRwc2VleGUiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRwc2VleGUuLi4gIiA+JjY7IH0KKwkJaWYgdGVzdCAtZiAkcHNlZXhlIDsgdGhlbgorCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkJCUxJQlM9Ii1JOiRwc2VleGUiCisJCWZpCisJCTs7CisKKwlicGYpCisJCSMKKwkJIyBJZiB3ZSdyZSB1c2luZyBCUEYsIHdlIG5lZWQgIi1sb2RtIiBhbmQgIi1sY2ZnIiwgYXMKKwkJIyB3ZSB1c2UgdGhlbSB0byBsb2FkIHRoZSBCUEYgbW9kdWxlLgorCQkjCisJCUxJQlM9Ii1sb2RtIC1sY2ZnIgorCQk7OworCWVzYWMKKwk7OworCitkYXJ3aW4qKQorCURZRVhUPSJkeWxpYiIKKwlWX0NDT1BUPSIkVl9DQ09QVCAtZm5vLWNvbW1vbiIKKwkjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtdW5pdmVyc2FsIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX3VuaXZlcnNhbCtzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX3VuaXZlcnNhbDsKK2ZpCisKKwlpZiB0ZXN0ICIkZW5hYmxlX3VuaXZlcnNhbCIgIT0gIm5vIjsgdGhlbgorCQljYXNlICIkaG9zdF9vcyIgaW4KKworCQlkYXJ3aW45LiopCisJCQkjCisJCQkjIExlb3BhcmQuICBCdWlsZCBmb3IgMzItYml0IFBvd2VyUEMsIDY0LWJpdAorCQkJIyBQb3dlclBDLCB4ODYsIGFuZCB4ODYtNjQsIHdpdGggMzItYml0IFBvd2VyUEMKKwkJCSMgZmlyc3QuICAoVGhhdCdzIHdoYXQgQXBwbGUgZG9lcy4pCisJCQkjCisJCQlWX0NDT1BUPSIkVl9DQ09QVCAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgLWFyY2ggaTM4NiAtYXJjaCB4ODZfNjQiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtYXJjaCBwcGMgLWFyY2ggcHBjNjQgLWFyY2ggaTM4NiAtYXJjaCB4ODZfNjQiCisJCQk7OworCisJCWRhcndpbjEwLiopCisJCQkjCisJCQkjIFNub3cgTGVvcGFyZC4gIEJ1aWxkIGZvciB4ODYtNjQsIHg4NiwgYW5kCisJCQkjIDMyLWJpdCBQb3dlclBDLCB3aXRoIHg4Ni02NCBmaXJzdC4gIChUaGF0J3MKKwkJCSMgd2hhdCBBcHBsZSBkb2VzLCBldmVuIHRob3VnaCBTbm93IExlb3BhcmQKKwkJCSMgZG9lc24ndCBydW4gb24gUFBDLCBzbyBQUEMgbGlicGNhcCBydW5zIHVuZGVyCisJCQkjIFJvc2V0dGEsIGFuZCBSb3NldHRhIGRvZXNuJ3Qgc3VwcG9ydCBCUEYKKwkJCSMgaW9jdGxzLCBzbyBQUEMgcHJvZ3JhbXMgY2FuJ3QgZG8gbGl2ZQorCQkJIyBjYXB0dXJlcy4pCisJCQkjCisJCQlWX0NDT1BUPSIkVl9DQ09QVCAtYXJjaCB4ODZfNjQgLWFyY2ggaTM4NiAtYXJjaCBwcGMiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtYXJjaCB4ODZfNjQgLWFyY2ggaTM4NiAtYXJjaCBwcGMiCisJCQk7OworCisJCWRhcndpbjExLiopCisJCQkjCisJCQkjIExpb24uICBCdWlsZCBmb3IgeDg2LTY0IGFuZCB4ODYsIHdpdGggeDg2LTY0CisJCQkjIGZpcnN0LiAgKFRoYXQncyBwcm9iYWJseSB3aGF0IEFwcGxlIGRvZXMsCisJCQkjIGdpdmVuIHRoYXQgUm9zZXR0YSBpcyBnb25lLikKKwkJCSMKKwkJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IgorCQkJTERGTEFHUz0iJExERkxBR1MgLWFyY2ggeDg2XzY0IC1hcmNoIGkzODYiCisJCQk7OworCQllc2FjCisJZmkKKwk7OworCitocHV4OSopCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfSFBVWDkgMSIgPj5jb25mZGVmcy5oCisKKworCSMKKwkjIFVzZSBTeXN0ZW0gViBjb252ZW50aW9ucyBmb3IgbWFuIHBhZ2VzLgorCSMKKwlNQU5fRklMRV9GT1JNQVRTPTQKKwlNQU5fTUlTQ19JTkZPPTUKKwk7OworCitocHV4MTAuMCopCisKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CisJOzsKKworaHB1eDEwLjEqKQorCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7CisKK2hwdXgqKQorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0hQVVgxMF8yMF9PUl9MQVRFUiAxIiA+PmNvbmZkZWZzLmgKKworCWlmIHRlc3QgImB1bmFtZSAtbWAiID0gImlhNjQiOyB0aGVuCisJCURZRVhUPSJzbyIKKwllbHNlCisJCURZRVhUPSJzbCIKKwlmaQorCisJIworCSMgIi1iIiBidWlsZHMgYSBzaGFyZWQgbGlicmFyeTsgIitoIiBzZXRzIHRoZSBzb25hbWUuCisJIworCVNITElCX09QVD0iLWIiCisJU09OQU1FX09QVD0iK2giCisKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CisJOzsKKworaXJpeCopCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7CisKK2xpbnV4KnxmcmVlYnNkKnxuZXRic2QqfG9wZW5ic2QqfGRyYWdvbmZseSp8a2ZyZWVic2QqfGdudSopCisJRFlFWFQ9InNvIgorCisJIworCSMgQ29tcGlsZXIgYXNzdW1lZCB0byBiZSBHQ0M7IHJ1bi10aW1lIGxpbmtlciBtYXkgcmVxdWlyZSBhIC1SCisJIyBmbGFnLgorCSMKKwlpZiB0ZXN0ICIkbGliZGlyIiAhPSAiL3Vzci9saWIiOyB0aGVuCisJCVZfUkZMQUdTPS1XbCwtUiRsaWJkaXIKKwlmaQorCTs7CisKK29zZiopCisJRFlFWFQ9InNvIgorCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7CisKK3Npbml4KikKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIFNJTklYIGNvbXBpbGVyIGRlZmluZXMgc2luaXgiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgU0lOSVggY29tcGlsZXIgZGVmaW5lcyBzaW5peC4uLiAiID4mNjsgfQorCWlmIHRlc3QgIiR7YWNfY3ZfY2Nfc2luaXhfZGVmaW5lZCtzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGNhdCBjb25mZGVmcy5oIC0gPDxfQUNFT0YgPmNvbmZ0ZXN0LiRhY19leHQKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKworaW50CittYWluICgpCit7CitpbnQgaSA9IHNpbml4OworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2NjX3Npbml4X2RlZmluZWQ9eWVzCitlbHNlCisgIGFjX2N2X2NjX3Npbml4X2RlZmluZWQ9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKwkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9jY19zaW5peF9kZWZpbmVkIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfY2Nfc2luaXhfZGVmaW5lZCIgPiY2OyB9CisJICAgIGlmIHRlc3QgJGFjX2N2X2NjX3Npbml4X2RlZmluZWQgPSBubyA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgc2luaXggMSIgPj5jb25mZGVmcy5oCisKKwkgICAgZmkKKwk7OworCitzb2xhcmlzKikKKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9TT0xBUklTIDEiID4+Y29uZmRlZnMuaAorCisKKwlEWUVYVD0ic28iCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7Citlc2FjCisKK2lmIHRlc3QgLW4gIiRhY190b29sX3ByZWZpeCI7IHRoZW4KKyAgIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1yYW5saWI7IGFjX3dvcmQ9JDIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGZvciAkYWNfd29yZC4uLiAiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9wcm9nX1JBTkxJQitzZXR9IiA9IHNldDsgdGhlbiA6CisgICRhc19lY2hvX24gIihjYWNoZWQpICIgPiY2CitlbHNlCisgIGlmIHRlc3QgLW4gIiRSQU5MSUIiOyB0aGVuCisgIGFjX2N2X3Byb2dfUkFOTElCPSIkUkFOTElCIiAjIExldCB0aGUgdXNlciBvdmVycmlkZSB0aGUgdGVzdC4KK2Vsc2UKK2FzX3NhdmVfSUZTPSRJRlM7IElGUz0kUEFUSF9TRVBBUkFUT1IKK2ZvciBhc19kaXIgaW4gJFBBVEgKK2RvCisgIElGUz0kYXNfc2F2ZV9JRlMKKyAgdGVzdCAteiAiJGFzX2RpciIgJiYgYXNfZGlyPS4KKyAgICBmb3IgYWNfZXhlY19leHQgaW4gJycgJGFjX2V4ZWN1dGFibGVfZXh0ZW5zaW9uczsgZG8KKyAgaWYgeyB0ZXN0IC1mICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiAmJiAkYXNfdGVzdF94ICIkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IjsgfTsgdGhlbgorICAgIGFjX2N2X3Byb2dfUkFOTElCPSIke2FjX3Rvb2xfcHJlZml4fXJhbmxpYiIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCitSQU5MSUI9JGFjX2N2X3Byb2dfUkFOTElCCitpZiB0ZXN0IC1uICIkUkFOTElCIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJFJBTkxJQiIgPiY1CiskYXNfZWNobyAiJFJBTkxJQiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfUkFOTElCIjsgdGhlbgorICBhY19jdF9SQU5MSUI9JFJBTkxJQgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgInJhbmxpYiIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgcmFubGliOyBhY193b3JkPSQyCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQuLi4gIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfUkFOTElCIjsgdGhlbgorICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0iJGFjX2N0X1JBTkxJQiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X1JBTkxJQj0icmFubGliIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK2FjX2N0X1JBTkxJQj0kYWNfY3ZfcHJvZ19hY19jdF9SQU5MSUIKK2lmIHRlc3QgLW4gIiRhY19jdF9SQU5MSUIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3RfUkFOTElCIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfUkFOTElCIiA+JjY7IH0KK2Vsc2UKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IG5vIiA+JjUKKyRhc19lY2hvICJubyIgPiY2OyB9CitmaQorCisgIGlmIHRlc3QgIngkYWNfY3RfUkFOTElCIiA9IHg7IHRoZW4KKyAgICBSQU5MSUI9IjoiCisgIGVsc2UKKyAgICBjYXNlICRjcm9zc19jb21waWxpbmc6JGFjX3Rvb2xfd2FybmVkIGluCit5ZXM6KQoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdXNpbmcgY3Jvc3MgdG9vbHMgbm90IHByZWZpeGVkIHdpdGggaG9zdCB0cmlwbGV0IiA+JjI7fQorYWNfdG9vbF93YXJuZWQ9eWVzIDs7Citlc2FjCisgICAgUkFOTElCPSRhY19jdF9SQU5MSUIKKyAgZmkKK2Vsc2UKKyAgUkFOTElCPSIkYWNfY3ZfcHJvZ19SQU5MSUIiCitmaQorCitpZiB0ZXN0IC1uICIkYWNfdG9vbF9wcmVmaXgiOyB0aGVuCisgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiJHthY190b29sX3ByZWZpeH1hciIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCitzZXQgZHVtbXkgJHthY190b29sX3ByZWZpeH1hcjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfQVIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfQVI9IiRBUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX0FSPSIke2FjX3Rvb2xfcHJlZml4fWFyIgorICAgICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGZvdW5kICRhc19kaXIvJGFjX3dvcmQkYWNfZXhlY19leHQiID4mNQorICAgIGJyZWFrIDIKKyAgZmkKK2RvbmUKKyAgZG9uZQorSUZTPSRhc19zYXZlX0lGUworCitmaQorZmkKK0FSPSRhY19jdl9wcm9nX0FSCitpZiB0ZXN0IC1uICIkQVIiOyB0aGVuCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkQVIiID4mNQorJGFzX2VjaG8gIiRBUiIgPiY2OyB9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiBubyIgPiY1CiskYXNfZWNobyAibm8iID4mNjsgfQorZmkKKworCitmaQoraWYgdGVzdCAteiAiJGFjX2N2X3Byb2dfQVIiOyB0aGVuCisgIGFjX2N0X0FSPSRBUgorICAjIEV4dHJhY3QgdGhlIGZpcnN0IHdvcmQgb2YgImFyIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KK3NldCBkdW1teSBhcjsgYWNfd29yZD0kMgoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgZm9yICRhY193b3JkLi4uICIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X3Byb2dfYWNfY3RfQVIrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBpZiB0ZXN0IC1uICIkYWNfY3RfQVIiOyB0aGVuCisgIGFjX2N2X3Byb2dfYWNfY3RfQVI9IiRhY19jdF9BUiIgIyBMZXQgdGhlIHVzZXIgb3ZlcnJpZGUgdGhlIHRlc3QuCitlbHNlCithc19zYXZlX0lGUz0kSUZTOyBJRlM9JFBBVEhfU0VQQVJBVE9SCitmb3IgYXNfZGlyIGluICRQQVRICitkbworICBJRlM9JGFzX3NhdmVfSUZTCisgIHRlc3QgLXogIiRhc19kaXIiICYmIGFzX2Rpcj0uCisgICAgZm9yIGFjX2V4ZWNfZXh0IGluICcnICRhY19leGVjdXRhYmxlX2V4dGVuc2lvbnM7IGRvCisgIGlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfd29yZCRhY19leGVjX2V4dCI7IH07IHRoZW4KKyAgICBhY19jdl9wcm9nX2FjX2N0X0FSPSJhciIKKyAgICAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBmb3VuZCAkYXNfZGlyLyRhY193b3JkJGFjX2V4ZWNfZXh0IiA+JjUKKyAgICBicmVhayAyCisgIGZpCitkb25lCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworZmkKK2ZpCithY19jdF9BUj0kYWNfY3ZfcHJvZ19hY19jdF9BUgoraWYgdGVzdCAtbiAiJGFjX2N0X0FSIjsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N0X0FSIiA+JjUKKyRhc19lY2hvICIkYWNfY3RfQVIiID4mNjsgfQorZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KK2ZpCisKKyAgaWYgdGVzdCAieCRhY19jdF9BUiIgPSB4OyB0aGVuCisgICAgQVI9IiIKKyAgZWxzZQorICAgIGNhc2UgJGNyb3NzX2NvbXBpbGluZzokYWNfdG9vbF93YXJuZWQgaW4KK3llczopCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVzaW5nIGNyb3NzIHRvb2xzIG5vdCBwcmVmaXhlZCB3aXRoIGhvc3QgdHJpcGxldCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiB1c2luZyBjcm9zcyB0b29scyBub3QgcHJlZml4ZWQgd2l0aCBob3N0IHRyaXBsZXQiID4mMjt9CithY190b29sX3dhcm5lZD15ZXMgOzsKK2VzYWMKKyAgICBBUj0kYWNfY3RfQVIKKyAgZmkKK2Vsc2UKKyAgQVI9IiRhY19jdl9wcm9nX0FSIgorZmkKKworCitybSAtZiBvcy1wcm90by5oCisgICAgaWYgdGVzdCAiJHtMQkxfQ0ZMQUdTK3NldH0iID0gc2V0OyB0aGVuCisJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUICR7TEJMX0NGTEFHU30iCisgICAgZmkKKyAgICBpZiB0ZXN0IC1mIC5kZXZlbCA7IHRoZW4KKwkgICAgaWYgdGVzdCAiJEdDQyIgPSB5ZXMgOyB0aGVuCisJCSAgICBpZiB0ZXN0ICIke0xCTF9DRkxBR1Mrc2V0fSIgIT0gc2V0OyB0aGVuCisJCQkgICAgaWYgdGVzdCAiJGFjX2N2X3Byb2dfY2NfZyIgPSB5ZXMgOyB0aGVuCisJCQkJICAgIFZfQ0NPUFQ9Ii1nICRWX0NDT1BUIgorCQkJICAgIGZpCisJCQkgICAgVl9DQ09QVD0iJFZfQ0NPUFQgLVdhbGwiCisJCQkgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2djY192ZXJzIC1ndCAxIDsgdGhlbgorCQkJCSAgICBWX0NDT1BUPSIkVl9DQ09QVCAtV21pc3NpbmctcHJvdG90eXBlcyAtV3N0cmljdC1wcm90b3R5cGVzIgorCQkJICAgIGZpCisJCSAgICBmaQorCSAgICBlbHNlCisJCSAgICBjYXNlICIkaG9zdF9vcyIgaW4KKworCQkgICAgaXJpeDYqKQorCQkJICAgIFZfQ0NPUFQ9IiRWX0NDT1BUIC1uMzIiCisJCQkgICAgOzsKKworCQkgICAgKikKKwkJCSAgICA7OworCQkgICAgZXNhYworCSAgICBmaQorCSAgICBvcz1gZWNobyAkaG9zdF9vcyB8IHNlZCAtZSAncy9cKFswLTldWzAtOV0qXClbXjAtOV0uKiQvXDEvJ2AKKwkgICAgbmFtZT0ibGJsL29zLSRvcy5oIgorCSAgICBpZiB0ZXN0IC1mICRuYW1lIDsgdGhlbgorCQkgICAgbG4gLXMgJG5hbWUgb3MtcHJvdG8uaAorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX09TX1BST1RPX0ggMSIgPj5jb25mZGVmcy5oCisKKwkgICAgZWxzZQorCQkgICAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiBjYW4ndCBmaW5kICRuYW1lIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IFdBUk5JTkc6IGNhbid0IGZpbmQgJG5hbWUiID4mMjt9CisJICAgIGZpCisgICAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBzb2NrYWRkciBzdHJ1Y3QgaGFzIHRoZSBzYV9sZW4gbWVtYmVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHNvY2thZGRyIHN0cnVjdCBoYXMgdGhlIHNhX2xlbiBtZW1iZXIuLi4gIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICIke2FjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwlpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CitpbnQKK21haW4gKCkKK3sKK3VfaW50IGkgPSBzaXplb2YoKChzdHJ1Y3Qgc29ja2FkZHIgKikwKS0+c2FfbGVuKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X2xibF9zb2NrYWRkcl9oYXNfc2FfbGVuPXllcworZWxzZQorICBhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbj1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4iID4mNQorJGFzX2VjaG8gIiRhY19jdl9sYmxfc29ja2FkZHJfaGFzX3NhX2xlbiIgPiY2OyB9CisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX3NvY2thZGRyX2hhc19zYV9sZW4gPSB5ZXMgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIEhBVkVfU09DS0FERFJfU0FfTEVOIDEiID4+Y29uZmRlZnMuaAorCisgICAgZmkKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiBzb2NrYWRkcl9zdG9yYWdlIHN0cnVjdCBleGlzdHMiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgc29ja2FkZHJfc3RvcmFnZSBzdHJ1Y3QgZXhpc3RzLi4uICIgPiY2OyB9CisgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfaGFzX3NvY2thZGRyX3N0b3JhZ2Urc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyMJaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjCWluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KK2ludAorbWFpbiAoKQorewordV9pbnQgaSA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2hhc19zb2NrYWRkcl9zdG9yYWdlPXllcworZWxzZQorICBhY19jdl9sYmxfaGFzX3NvY2thZGRyX3N0b3JhZ2U9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9oYXNfc29ja2FkZHJfc3RvcmFnZSIgPiY2OyB9CisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2hhc19zb2NrYWRkcl9zdG9yYWdlID0geWVzIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIGRsX2hwX3BwYV9pbmZvX3Qgc3RydWN0IGhhcyBkbF9tb2R1bGVfaWRfMSBtZW1iZXIiID4mNQorJGFzX2VjaG9fbiAiY2hlY2tpbmcgaWYgZGxfaHBfcHBhX2luZm9fdCBzdHJ1Y3QgaGFzIGRsX21vZHVsZV9pZF8xIG1lbWJlci4uLiAiID4mNjsgfQorICAgIGlmIHRlc3QgIiR7YWNfY3ZfbGJsX2RsX2hwX3BwYV9pbmZvX3RfaGFzX2RsX21vZHVsZV9pZF8xK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgY2F0IGNvbmZkZWZzLmggLSA8PF9BQ0VPRiA+Y29uZnRlc3QuJGFjX2V4dAorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisjCWluY2x1ZGUgPHN5cy90eXBlcy5oPgorIwlpbmNsdWRlIDxzeXMvZGxwaS5oPgorIwlpbmNsdWRlIDxzeXMvZGxwaV9leHQuaD4KK2ludAorbWFpbiAoKQorewordV9pbnQgaSA9IHNpemVvZigoKGRsX2hwX3BwYV9pbmZvX3QgKikwKS0+ZGxfbW9kdWxlX2lkXzEpCisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK2lmIGFjX2ZuX2NfdHJ5X2NvbXBpbGUgIiRMSU5FTk8iOyB0aGVuIDoKKyAgYWNfY3ZfbGJsX2RsX2hwX3BwYV9pbmZvX3RfaGFzX2RsX21vZHVsZV9pZF8xPXllcworZWxzZQorICBhY19jdl9sYmxfZGxfaHBfcHBhX2luZm9fdF9oYXNfZGxfbW9kdWxlX2lkXzE9bm8KK2ZpCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK2ZpCisKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMSIgPiY1CiskYXNfZWNobyAiJGFjX2N2X2xibF9kbF9ocF9wcGFfaW5mb190X2hhc19kbF9tb2R1bGVfaWRfMSIgPiY2OyB9CisgICAgaWYgdGVzdCAkYWNfY3ZfbGJsX2RsX2hwX3BwYV9pbmZvX3RfaGFzX2RsX21vZHVsZV9pZF8xID0geWVzIDsgdGhlbgorCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX0hQX1BQQV9JTkZPX1RfRExfTU9EVUxFX0lEXzEgMSIgPj5jb25mZGVmcy5oCisKKyAgICBmaQorCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGlmIHVuYWxpZ25lZCBhY2Nlc3NlcyBmYWlsIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHVuYWxpZ25lZCBhY2Nlc3NlcyBmYWlsLi4uICIgPiY2OyB9CisgICAgaWYgdGVzdCAiJHthY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXNlICIkaG9zdF9jcHUiIGluCisKKwkjCisJIyBUaGVzZSBhcmUgQ1BVIHR5cGVzIHdoZXJlOgorCSMKKwkjCXRoZSBDUFUgZmF1bHRzIG9uIGFuIHVuYWxpZ25lZCBhY2Nlc3MsIGJ1dCBhdCBsZWFzdCBzb21lCisJIwlPU2VzIHRoYXQgc3VwcG9ydCB0aGF0IENQVSBjYXRjaCB0aGUgZmF1bHQgYW5kIHNpbXVsYXRlCisJIwl0aGUgdW5hbGlnbmVkIGFjY2VzcyAoZS5nLiwgQWxwaGEve0RpZ2l0YWwsVHJ1NjR9IFVOSVgpIC0KKwkjCXRoZSBzaW11bGF0aW9uIGlzIHNsb3csIHNvIHdlIGRvbid0IHdhbnQgdG8gdXNlIGl0OworCSMKKwkjCXRoZSBDUFUsIEkgaW5mZXIgKGZyb20gdGhlIG9sZAorCSMKKwkjIFhYWDogc2hvdWxkIGFsc28gY2hlY2sgdGhhdCB0aGV5IGRvbid0IGRvIHdlaXJkIHRoaW5ncyAobGlrZSBvbiBhcm0pCisJIworCSMJY29tbWVudCkgZG9lc24ndCBmYXVsdCBvbiB1bmFsaWduZWQgYWNjZXNzZXMsIGJ1dCBkb2Vzbid0CisJIwlkbyBhIG5vcm1hbCB1bmFsaWduZWQgZmV0Y2gsIGVpdGhlciAoZS5nLiwgcHJlc3VtYWJseSwgQVJNKTsKKwkjCisJIwlmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGUgdGVzdCBwcm9ncmFtIGRvZXNuJ3Qgd29yaworCSMJKHRoaXMgaGFzIGJlZW4gY2xhaW1lZCB0byBiZSB0aGUgY2FzZSBmb3Igc2V2ZXJhbCBvZiB0aG9zZQorCSMJQ1BVcyAtIEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBwcm9ibGVtIGlzOyB0aGUgcHJvYmxlbQorCSMJd2FzIHJlcG9ydGVkIGFzICJ0aGUgdGVzdCBwcm9ncmFtIGR1bXBzIGNvcmUiIGZvciBTdXBlckgsCisJIwlidXQgdGhhdCdzIHdoYXQgdGhlIHRlc3QgcHJvZ3JhbSBpcyAqc3VwcG9zZWQqIHRvIGRvIC0KKwkjCWl0IGR1bXBzIGNvcmUgYmVmb3JlIGl0IHdyaXRlcyBhbnl0aGluZywgc28gdGhlIHRlc3QKKwkjCWZvciBhbiBlbXB0eSBvdXRwdXQgZmlsZSBzaG91bGQgZmluZCBhbiBlbXB0eSBvdXRwdXQKKwkjCWZpbGUgYW5kIGNvbmNsdWRlIHRoYXQgdW5hbGlnbmVkIGFjY2Vzc2VzIGRvbid0IHdvcmspLgorCSMKKwkjIFRoaXMgcnVuLXRpbWUgdGVzdCB3b24ndCB3b3JrIGlmIHlvdSdyZSBjcm9zcy1jb21waWxpbmcsIHNvCisJIyBpbiBvcmRlciB0byBzdXBwb3J0IGNyb3NzLWNvbXBpbGluZyBmb3IgYSBwYXJ0aWN1bGFyIENQVSwKKwkjIHdlIGhhdmUgdG8gd2lyZSBpbiB0aGUgbGlzdCBvZiBDUFUgdHlwZXMgYW55d2F5LCBhcyBmYXIgYXMKKwkjIEkga25vdywgc28gcGVyaGFwcyB3ZSBzaG91bGQganVzdCBoYXZlIGEgc2V0IG9mIENQVXMgb24KKwkjIHdoaWNoIHdlIGtub3cgaXQgZG9lc24ndCB3b3JrLCBhIHNldCBvZiBDUFVzIG9uIHdoaWNoIHdlCisJIyBrbm93IGl0IGRvZXMgd29yaywgYW5kIGhhdmUgdGhlIHNjcmlwdCBqdXN0IGZhaWwgb24gb3RoZXIKKwkjIGNwdSB0eXBlcyBhbmQgdXBkYXRlIGl0IHdoZW4gc3VjaCBhIGZhaWx1cmUgb2NjdXJzLgorCSMKKwlhbHBoYSp8YXJtKnxiZmluKnxocCp8bWlwcyp8c2gqfHNwYXJjKnxpYTY0fG52MSkKKwkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPXllcworCQk7OworCisJKikKKwkJY2F0ID5jb25mdGVzdC5jIDw8RU9GCisjCQlpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMJCWluY2x1ZGUgPHN5cy93YWl0Lmg+CisjCQlpbmNsdWRlIDxzdGRpby5oPgorCQl1bnNpZ25lZCBjaGFyIGFbNV0gPSB7IDEsIDIsIDMsIDQsIDUgfTsKKwkJbWFpbigpIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCXBpZF90IHBpZDsKKwkJaW50IHN0YXR1czsKKwkJLyogYXZvaWQgImNvcmUgZHVtcGVkIiBtZXNzYWdlICovCisJCXBpZCA9IGZvcmsoKTsKKwkJaWYgKHBpZCA8ICAwKQorCQkJZXhpdCgyKTsKKwkJaWYgKHBpZCA+IDApIHsKKwkJCS8qIHBhcmVudCAqLworCQkJcGlkID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCQkJaWYgKHBpZCA8IDApCisJCQkJZXhpdCgzKTsKKwkJCWV4aXQoIVdJRkVYSVRFRChzdGF0dXMpKTsKKwkJfQorCQkvKiBjaGlsZCAqLworCQlpID0gKih1bnNpZ25lZCBpbnQgKikmYVsxXTsKKwkJcHJpbnRmKCIlZFxuIiwgaSk7CisJCWV4aXQoMCk7CisJCX0KK0VPRgorCQkke0NDLWNjfSAtbyBjb25mdGVzdCAkQ0ZMQUdTICRDUFBGTEFHUyAkTERGTEFHUyBcCisJCSAgICBjb25mdGVzdC5jICRMSUJTID4vZGV2L251bGwgMj4mMQorCQlpZiB0ZXN0ICEgLXggY29uZnRlc3QgOyB0aGVuCisJCQkJCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9eWVzCisJCWVsc2UKKwkJCS4vY29uZnRlc3QgPmNvbmZ0ZXN0Lm91dAorCQkJaWYgdGVzdCAhIC1zIGNvbmZ0ZXN0Lm91dCA7IHRoZW4KKwkJCQlhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWw9eWVzCisJCQllbHNlCisJCQkJYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsPW5vCisJCQlmaQorCQlmaQorCQlybSAtZiAtciBjb25mdGVzdCogY29yZSBjb3JlLmNvbmZ0ZXN0CisJCTs7CisJZXNhYworZmkKKworICAgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogcmVzdWx0OiAkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfbGJsX3VuYWxpZ25lZF9mYWlsIiA+JjY7IH0KKyAgICBpZiB0ZXN0ICRhY19jdl9sYmxfdW5hbGlnbmVkX2ZhaWwgPSB5ZXMgOyB0aGVuCisKKyRhc19lY2hvICIjZGVmaW5lIExCTF9BTElHTiAxIiA+PmNvbmZkZWZzLmgKKworICAgIGZpCisKKyMKKyMgTWFrZWZpbGUuaW4gaW5jbHVkZXMgcnVsZXMgdG8gZ2VuZXJhdGUgdmVyc2lvbi5oLCBzbyB3ZSBhc3N1bWUKKyMgdGhhdCBpdCB3aWxsIGJlIGdlbmVyYXRlZCBpZiBhdXRvY29uZiBpcyB1c2VkLgorIworCiskYXNfZWNobyAiI2RlZmluZSBIQVZFX1ZFUlNJT05fSCAxIiA+PmNvbmZkZWZzLmgKKworCitybSAtZiBuZXQKK2xuIC1zICR7c3JjZGlyfS9icGYvbmV0IG5ldAorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIGZvciBVU0Igc25pZmZpbmcgc3VwcG9ydCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgVVNCIHNuaWZmaW5nIHN1cHBvcnQuLi4gIiA+JjY7IH0KK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgqKQorCiskYXNfZWNobyAiI2RlZmluZSBQQ0FQX1NVUFBPUlRfVVNCIDEiID4+Y29uZmRlZnMuaAorCisJVVNCX1NSQz1wY2FwLXVzYi1saW51eC5jCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwlhY191c2JfZGV2X25hbWU9YHVkZXZpbmZvIC1xIG5hbWUgLXAgL3N5cy9jbGFzcy91c2JfZGV2aWNlL3VzYm1vbiAyPi9kZXYvbnVsbGAKKwlpZiB0ZXN0ICQ/IC1uZSAwIDsgdGhlbgorCSAgYWNfdXNiX2Rldl9uYW1lPSJ1c2Jtb24iCisJZmkKKworY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBMSU5VWF9VU0JfTU9OX0RFViAiL2Rldi8kYWNfdXNiX2Rldl9uYW1lIgorX0FDRU9GCisKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IERldmljZSBmb3IgVVNCIHNuaWZmaW5nIGlzIC9kZXYvJGFjX3VzYl9kZXZfbmFtZSIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBEZXZpY2UgZm9yIFVTQiBzbmlmZmluZyBpcyAvZGV2LyRhY191c2JfZGV2X25hbWUiID4mNjt9CisJIworCSMgRG8gd2UgaGF2ZSBhIHZlcnNpb24gb2YgPGxpbnV4L2NvbXBpbGVyLmg+IGF2YWlsYWJsZT8KKwkjIElmIHNvLCB3ZSBtaWdodCBuZWVkIGl0IGZvciA8bGludXgvdXNiZGV2aWNlX2ZzLmg+LgorCSMKKwlmb3IgYWNfaGVhZGVyIGluIGxpbnV4L2NvbXBpbGVyLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbnV4L2NvbXBpbGVyLmgiICJhY19jdl9oZWFkZXJfbGludXhfY29tcGlsZXJfaCIgIiRhY19pbmNsdWRlc19kZWZhdWx0IgoraWYgdGVzdCAieCRhY19jdl9oZWFkZXJfbGludXhfY29tcGlsZXJfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElOVVhfQ09NUElMRVJfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisJaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9saW51eF9jb21waWxlcl9oIiA9IHllczsgdGhlbgorCSAgIworCSAgIyBZZXMgLSBpbmNsdWRlIGl0IHdoZW4gdGVzdGluZyBmb3IgPGxpbnV4L3VzYmRldmljZV9mcy5oPi4KKwkgICMKKwkgIGZvciBhY19oZWFkZXIgaW4gbGludXgvdXNiZGV2aWNlX2ZzLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfY29tcGlsZSAiJExJTkVOTyIgImxpbnV4L3VzYmRldmljZV9mcy5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X3VzYmRldmljZV9mc19oIiAiI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF91c2JkZXZpY2VfZnNfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElOVVhfVVNCREVWSUNFX0ZTX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCWVsc2UKKwkgIGZvciBhY19oZWFkZXIgaW4gbGludXgvdXNiZGV2aWNlX2ZzLmgKK2RvIDoKKyAgYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImxpbnV4L3VzYmRldmljZV9mcy5oIiAiYWNfY3ZfaGVhZGVyX2xpbnV4X3VzYmRldmljZV9mc19oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF91c2JkZXZpY2VfZnNfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorICBjYXQgPj5jb25mZGVmcy5oIDw8X0FDRU9GCisjZGVmaW5lIEhBVkVfTElOVVhfVVNCREVWSUNFX0ZTX0ggMQorX0FDRU9GCisKK2ZpCisKK2RvbmUKKworCWZpCisJaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9saW51eF91c2JkZXZpY2VfZnNfaCIgPSB5ZXM7IHRoZW4KKwkgICMKKwkgICMgT0ssIGRvZXMgaXQgZGVmaW5lIGJSZXF1ZXN0VHlwZT8gIE9sZGVyIHZlcnNpb25zIG9mIHRoZSBrZXJuZWwKKwkgICMgZGVmaW5lIGZpZWxkcyB3aXRoIG5hbWVzIGxpa2UgInJlcXVlc3R0eXBlLCAicmVxdWVzdCIsIGFuZAorCSAgIyAidmFsdWUiLCByYXRoZXIgdGhhbiAiYlJlcXVlc3RUeXBlIiwgImJSZXF1ZXN0IiwgYW5kCisJICAjICJ3VmFsdWUiLgorCSAgIworCSAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBpZiB1c2JkZXZmc19jdHJsdHJhbnNmZXIgc3RydWN0IGhhcyBiUmVxdWVzdFR5cGUgbWVtYmVyIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGlmIHVzYmRldmZzX2N0cmx0cmFuc2ZlciBzdHJ1Y3QgaGFzIGJSZXF1ZXN0VHlwZSBtZW1iZXIuLi4gIiA+JjY7IH0KKwkgIGlmIHRlc3QgIiR7YWNfY3ZfdXNiZGV2ZnNfY3RybHRyYW5zZmVyX2hhc19iUmVxdWVzdFR5cGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfTElOVVhfQ09NUElMRVJfSAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4KK2ludAorbWFpbiAoKQorewordV9pbnQgaSA9IHNpemVvZigoKHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgKikwKS0+YlJlcXVlc3RUeXBlKQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X3VzYmRldmZzX2N0cmx0cmFuc2Zlcl9oYXNfYlJlcXVlc3RUeXBlPXllcworZWxzZQorICBhY19jdl91c2JkZXZmc19jdHJsdHJhbnNmZXJfaGFzX2JSZXF1ZXN0VHlwZT1ubworZmkKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorZmkKKworCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJGFjX2N2X3VzYmRldmZzX2N0cmx0cmFuc2Zlcl9oYXNfYlJlcXVlc3RUeXBlIiA+JjUKKyRhc19lY2hvICIkYWNfY3ZfdXNiZGV2ZnNfY3RybHRyYW5zZmVyX2hhc19iUmVxdWVzdFR5cGUiID4mNjsgfQorCSAgICBpZiB0ZXN0ICRhY19jdl91c2JkZXZmc19jdHJsdHJhbnNmZXJfaGFzX2JSZXF1ZXN0VHlwZSA9IHllcyA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgSEFWRV9VU0JERVZGU19DVFJMVFJBTlNGRVJfQlJFUVVFU1RUWVBFIDEiID4+Y29uZmRlZnMuaAorCisJICAgIGZpCisJZmkKKwk7OworKikKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwk7OworZXNhYworCisKKworeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBjaGVja2luZyB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBjb3VsZCBzdXBwb3J0IG5ldGZpbHRlciBzbmlmZmluZyIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyB3aGV0aGVyIHRoZSBwbGF0Zm9ybSBjb3VsZCBzdXBwb3J0IG5ldGZpbHRlciBzbmlmZmluZy4uLiAiID4mNjsgfQorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCopCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6IHllcyIgPiY1CiskYXNfZWNobyAieWVzIiA+JjY7IH0KKwkjCisJIyBMaWZlJ3MgdG9vIHNob3J0IHRvIGRlYWwgd2l0aCB0cnlpbmcgdG8gZ2V0IHRoaXMgdG8gY29tcGlsZQorCSMgaWYgeW91IGRvbid0IGdldCB0aGUgcmlnaHQgdHlwZXMgZGVmaW5lZCB3aXRoCisJIyBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgZ2V0dGluZyBkZWZpbmVkIGJ5IHNvbWUgb3RoZXIgaW5jbHVkZS4KKwkjCisJIyBDaGVjayB3aGV0aGVyIHRoZSBpbmNsdWRlcyBKdXN0IFdvcmsuICBJZiBub3QsIGRvbid0IHR1cm4gb24KKwkjIG5ldGZpbHRlciBzdXBwb3J0LgorCSMKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNoZWNraW5nIHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUgdGhlIG5ldGZpbHRlciBzdXBwb3J0IiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIHdoZXRoZXIgd2UgY2FuIGNvbXBpbGUgdGhlIG5ldGZpbHRlciBzdXBwb3J0Li4uICIgPiY2OyB9CisJaWYgdGVzdCAiJHthY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICAkYXNfZWNob19uICIoY2FjaGVkKSAiID4mNgorZWxzZQorICBjYXQgY29uZmRlZnMuaCAtIDw8X0FDRU9GID5jb25mdGVzdC4kYWNfZXh0CisvKiBlbmQgY29uZmRlZnMuaC4gICovCisKKyRhY19pbmNsdWRlc19kZWZhdWx0CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmg+CitpbnQKK21haW4gKCkKK3sKKworICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitpZiBhY19mbl9jX3RyeV9jb21waWxlICIkTElORU5PIjsgdGhlbiA6CisgIGFjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZT15ZXMKK2Vsc2UKKyAgYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlPW5vCitmaQorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitmaQorCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiByZXN1bHQ6ICRhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUiID4mNQorJGFzX2VjaG8gIiRhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUiID4mNjsgfQorCWlmIHRlc3QgJGFjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZSA9IHllcyA7IHRoZW4KKworJGFzX2VjaG8gIiNkZWZpbmUgUENBUF9TVVBQT1JUX05FVEZJTFRFUiAxIiA+PmNvbmZkZWZzLmgKKworCSAgTkVURklMVEVSX1NSQz1wY2FwLW5ldGZpbHRlci1saW51eC5jCisJZmkKKwk7OworKikKKwl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogbm8iID4mNQorJGFzX2VjaG8gIm5vIiA+JjY7IH0KKwk7OworZXNhYworCisKKworIyBDaGVjayB3aGV0aGVyIC0tZW5hYmxlLWJsdWV0b290aCB3YXMgZ2l2ZW4uCitpZiB0ZXN0ICIke2VuYWJsZV9ibHVldG9vdGgrc2V0fSIgPSBzZXQ7IHRoZW4gOgorICBlbmFibGV2YWw9JGVuYWJsZV9ibHVldG9vdGg7CitlbHNlCisgIGVuYWJsZV9ibHVldG9vdGg9eWVzCitmaQorCisKK2lmIHRlc3QgIngkZW5hYmxlX2JsdWV0b290aCIgIT0gInhubyIgOyB0aGVuCisJCWNhc2UgIiRob3N0X29zIiBpbgorCWxpbnV4KikKKwkJYWNfZm5fY19jaGVja19oZWFkZXJfbW9uZ3JlbCAiJExJTkVOTyIgImJsdWV0b290aC9ibHVldG9vdGguaCIgImFjX2N2X2hlYWRlcl9ibHVldG9vdGhfYmx1ZXRvb3RoX2giICIkYWNfaW5jbHVkZXNfZGVmYXVsdCIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2JsdWV0b290aF9ibHVldG9vdGhfaCIgPSB4IiJ5ZXM7IHRoZW4gOgorCisKKyRhc19lY2hvICIjZGVmaW5lIFBDQVBfU1VQUE9SVF9CVCAxIiA+PmNvbmZkZWZzLmgKKworCQkgIEJUX1NSQz1wY2FwLWJ0LWxpbnV4LmMKKwkJICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEJsdWV0b290aCBzbmlmZmluZyBpcyBzdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQmx1ZXRvb3RoIHNuaWZmaW5nIGlzIHN1cHBvcnRlZCIgPiY2O30KKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IEJsdWV0b290aCBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkOyBpbnN0YWxsIGJsdWV6LWxpYiBkZXZlbCB0byBlbmFibGUgaXQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQmx1ZXRvb3RoIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQ7IGluc3RhbGwgYmx1ZXotbGliIGRldmVsIHRvIGVuYWJsZSBpdCIgPiY2O30KKworZmkKKworCisJCTs7CisJKikKKwkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBubyBCbHVldG9vdGggc25pZmZpbmcgc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm8gQmx1ZXRvb3RoIHNuaWZmaW5nIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zIiA+JjY7fQorCQk7OworCWVzYWMKKworCitmaQorCisjIENoZWNrIHdoZXRoZXIgLS1lbmFibGUtY2FudXNiIHdhcyBnaXZlbi4KK2lmIHRlc3QgIiR7ZW5hYmxlX2NhbnVzYitzZXR9IiA9IHNldDsgdGhlbiA6CisgIGVuYWJsZXZhbD0kZW5hYmxlX2NhbnVzYjsgZW5hYmxlX2NhbnVzYj15ZXMKK2ZpCisKKworaWYgdGVzdCAieCRlbmFibGVfY2FudXNiIiAhPSAieG5vIiA7IHRoZW4KKwkJY2FzZSAiJGhvc3Rfb3MiIGluCisJbGludXgqKQorCQlhY19mbl9jX2NoZWNrX2hlYWRlcl9tb25ncmVsICIkTElORU5PIiAibGlidXNiLTEuMC9saWJ1c2IuaCIgImFjX2N2X2hlYWRlcl9saWJ1c2JfMV8wX2xpYnVzYl9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saWJ1c2JfMV8wX2xpYnVzYl9oIiA9IHgiInllczsgdGhlbiA6CisKKworJGFzX2VjaG8gIiNkZWZpbmUgUENBUF9TVVBQT1JUX0NBTlVTQiAxIiA+PmNvbmZkZWZzLmgKKworCQkgICAgQ0FOVVNCX1NSQz1wY2FwLWNhbnVzYi1saW51eC5jCisJCSAgICBMSUJTPSItbHVzYi0xLjAgJExJQlMiCisJCSAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNhbnVzYiBzbmlmZmluZyBpcyBzdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY2FudXNiIHNuaWZmaW5nIGlzIHN1cHBvcnRlZCIgPiY2O30KKworZWxzZQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNhbnVzYiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkOyBpbnN0YWxsIGxpYnVzYjEuMCBsaWIgZGV2ZWwgdG8gZW5hYmxlIGl0IiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNhbnVzYiBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkOyBpbnN0YWxsIGxpYnVzYjEuMCBsaWIgZGV2ZWwgdG8gZW5hYmxlIGl0IiA+JjY7fQorCitmaQorCisKKwkJOzsKKwkqKQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vIGNhbnVzYiBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBubyBjYW51c2Igc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MiID4mNjt9CisJCTs7CisJZXNhYworCisKK2ZpCisKKyMgQ2hlY2sgd2hldGhlciAtLWVuYWJsZS1jYW4gd2FzIGdpdmVuLgoraWYgdGVzdCAiJHtlbmFibGVfY2FuK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgZW5hYmxldmFsPSRlbmFibGVfY2FuOworZWxzZQorICBlbmFibGVfY2FuPXllcworZmkKKworCitpZiB0ZXN0ICJ4JGVuYWJsZV9jYW4iICE9ICJ4bm8iIDsgdGhlbgorCQljYXNlICIkaG9zdF9vcyIgaW4KKwlsaW51eCopCisJCWFjX2ZuX2NfY2hlY2tfaGVhZGVyX2NvbXBpbGUgIiRMSU5FTk8iICJsaW51eC9jYW4uaCIgImFjX2N2X2hlYWRlcl9saW51eF9jYW5faCIgIiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyIKK2lmIHRlc3QgIngkYWNfY3ZfaGVhZGVyX2xpbnV4X2Nhbl9oIiA9IHgiInllczsgdGhlbiA6CisKKyRhc19lY2hvICIjZGVmaW5lIFBDQVBfU1VQUE9SVF9DQU4gMSIgPj5jb25mZGVmcy5oCisKKwkJCUNBTl9TUkM9cGNhcC1jYW4tbGludXguYworCQkJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBDQU4gc25pZmZpbmcgaXMgc3VwcG9ydGVkIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IENBTiBzbmlmZmluZyBpcyBzdXBwb3J0ZWQiID4mNjt9CitlbHNlCisgIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogQ0FOIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQiID4mNQorJGFzX2VjaG8gIiRhc19tZTogQ0FOIHNuaWZmaW5nIGlzIG5vdCBzdXBwb3J0ZWQiID4mNjt9CitmaQorCisKKwkJOzsKKwkqKQorCQl7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vIENBTiBzbmlmZmluZyBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBubyBDQU4gc25pZmZpbmcgc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MiID4mNjt9CisJCTs7CisJZXNhYworCisKK2ZpCisKK2Nhc2UgIiRob3N0X29zIiBpbgorbGludXgqKQorCWZvciBhY19oZWFkZXIgaW4gbGludXgvbmV0X3RzdGFtcC5oCitkbyA6CisgIGFjX2ZuX2NfY2hlY2tfaGVhZGVyX21vbmdyZWwgIiRMSU5FTk8iICJsaW51eC9uZXRfdHN0YW1wLmgiICJhY19jdl9oZWFkZXJfbGludXhfbmV0X3RzdGFtcF9oIiAiJGFjX2luY2x1ZGVzX2RlZmF1bHQiCitpZiB0ZXN0ICJ4JGFjX2N2X2hlYWRlcl9saW51eF9uZXRfdHN0YW1wX2giID0geCIieWVzOyB0aGVuIDoKKyAgY2F0ID4+Y29uZmRlZnMuaCA8PF9BQ0VPRgorI2RlZmluZSBIQVZFX0xJTlVYX05FVF9UU1RBTVBfSCAxCitfQUNFT0YKKworZmkKKworZG9uZQorCisJOzsKKyopCisJeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBubyBoYXJkd2FyZSB0aW1lc3RhbXAgc3VwcG9ydCBpbXBsZW1lbnRlZCBmb3IgJGhvc3Rfb3MiID4mNQorJGFzX2VjaG8gIiRhc19tZTogbm8gaGFyZHdhcmUgdGltZXN0YW1wIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zIiA+JjY7fQorCTs7Citlc2FjCisKKyMgRmluZCBhIGdvb2QgaW5zdGFsbCBwcm9ncmFtLiAgV2UgcHJlZmVyIGEgQyBwcm9ncmFtIChmYXN0ZXIpLAorIyBzbyBvbmUgc2NyaXB0IGlzIGFzIGdvb2QgYXMgYW5vdGhlci4gIEJ1dCBhdm9pZCB0aGUgYnJva2VuIG9yCisjIGluY29tcGF0aWJsZSB2ZXJzaW9uczoKKyMgU3lzViAvZXRjL2luc3RhbGwsIC91c3Ivc2Jpbi9pbnN0YWxsCisjIFN1bk9TIC91c3IvZXRjL2luc3RhbGwKKyMgSVJJWCAvc2Jpbi9pbnN0YWxsCisjIEFJWCAvYmluL2luc3RhbGwKKyMgQW1pZ2FPUyAvQy9pbnN0YWxsLCB3aGljaCBpbnN0YWxscyBib290YmxvY2tzIG9uIGZsb3BweSBkaXNjcworIyBBSVggNCAvdXNyL2Jpbi9pbnN0YWxsYnNkLCB3aGljaCBkb2Vzbid0IHdvcmsgd2l0aG91dCBhIC1nIGZsYWcKKyMgQUZTIC91c3IvYWZzd3MvYmluL2luc3RhbGwsIHdoaWNoIG1pc2hhbmRsZXMgbm9uZXhpc3RlbnQgYXJncworIyBTVlI0IC91c3IvdWNiL2luc3RhbGwsIHdoaWNoIHRyaWVzIHRvIHVzZSB0aGUgbm9uZXhpc3RlbnQgZ3JvdXAgInN0YWZmIgorIyBPUy8yJ3Mgc3lzdGVtIGluc3RhbGwsIHdoaWNoIGhhcyBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHNlbWFudGljCisjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KKyMgUmVqZWN0IGluc3RhbGwgcHJvZ3JhbXMgdGhhdCBjYW5ub3QgaW5zdGFsbCBtdWx0aXBsZSBmaWxlcy4KK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcgZm9yIGEgQlNELWNvbXBhdGlibGUgaW5zdGFsbCIgPiY1CiskYXNfZWNob19uICJjaGVja2luZyBmb3IgYSBCU0QtY29tcGF0aWJsZSBpbnN0YWxsLi4uICIgPiY2OyB9CitpZiB0ZXN0IC16ICIkSU5TVEFMTCI7IHRoZW4KK2lmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuIDoKKyAgJGFzX2VjaG9fbiAiKGNhY2hlZCkgIiA+JjYKK2Vsc2UKKyAgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgICMgQWNjb3VudCBmb3IgcGVvcGxlIHdobyBwdXQgdHJhaWxpbmcgc2xhc2hlcyBpbiBQQVRIIGVsZW1lbnRzLgorY2FzZSAkYXNfZGlyLyBpbiAjKCgKKyAgLi8gfCAuLy8gfCAvW2NDXS8qIHwgXAorICAvZXRjLyogfCAvdXNyL3NiaW4vKiB8IC91c3IvZXRjLyogfCAvc2Jpbi8qIHwgL3Vzci9hZnN3cy9iaW4vKiB8IFwKKyAgPzpbXFwvXW9zMltcXC9daW5zdGFsbFtcXC9dKiB8ID86W1xcL11PUzJbXFwvXUlOU1RBTExbXFwvXSogfCBcCisgIC91c3IvdWNiLyogKSA7OworICAqKQorICAgICMgT1NGMSBhbmQgU0NPIE9EVCAzLjAgaGF2ZSB0aGVpciBvd24gbmFtZXMgZm9yIGluc3RhbGwuCisgICAgIyBEb24ndCB1c2UgaW5zdGFsbGJzZCBmcm9tIE9TRiBzaW5jZSBpdCBpbnN0YWxscyBzdHVmZiBhcyByb290CisgICAgIyBieSBkZWZhdWx0LgorICAgIGZvciBhY19wcm9nIGluIGdpbnN0YWxsIHNjb2luc3QgaW5zdGFsbDsgZG8KKyAgICAgIGZvciBhY19leGVjX2V4dCBpbiAnJyAkYWNfZXhlY3V0YWJsZV9leHRlbnNpb25zOyBkbworCWlmIHsgdGVzdCAtZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgJiYgJGFzX3Rlc3RfeCAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCI7IH07IHRoZW4KKwkgIGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgZHNwbXNnICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBBSVggaW5zdGFsbC4gIEl0IGhhcyBhbiBpbmNvbXBhdGlibGUgY2FsbGluZyBjb252ZW50aW9uLgorCSAgICA6CisJICBlbGlmIHRlc3QgJGFjX3Byb2cgPSBpbnN0YWxsICYmCisJICAgIGdyZXAgcHdwbHVzICIkYXNfZGlyLyRhY19wcm9nJGFjX2V4ZWNfZXh0IiA+L2Rldi9udWxsIDI+JjE7IHRoZW4KKwkgICAgIyBwcm9ncmFtLXNwZWNpZmljIGluc3RhbGwgc2NyaXB0IHVzZWQgYnkgSFAgcHdwbHVzLS1kb24ndCB1c2UuCisJICAgIDoKKwkgIGVsc2UKKwkgICAgcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisJICAgIGVjaG8gb25lID4gY29uZnRlc3Qub25lCisJICAgIGVjaG8gdHdvID4gY29uZnRlc3QudHdvCisJICAgIG1rZGlyIGNvbmZ0ZXN0LmRpcgorCSAgICBpZiAiJGFzX2Rpci8kYWNfcHJvZyRhY19leGVjX2V4dCIgLWMgY29uZnRlc3Qub25lIGNvbmZ0ZXN0LnR3byAiYHB3ZGAvY29uZnRlc3QuZGlyIiAmJgorCSAgICAgIHRlc3QgLXMgY29uZnRlc3Qub25lICYmIHRlc3QgLXMgY29uZnRlc3QudHdvICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3Qub25lICYmCisJICAgICAgdGVzdCAtcyBjb25mdGVzdC5kaXIvY29uZnRlc3QudHdvCisJICAgIHRoZW4KKwkgICAgICBhY19jdl9wYXRoX2luc3RhbGw9IiRhc19kaXIvJGFjX3Byb2ckYWNfZXhlY19leHQgLWMiCisJICAgICAgYnJlYWsgMworCSAgICBmaQorCSAgZmkKKwlmaQorICAgICAgZG9uZQorICAgIGRvbmUKKyAgICA7OworZXNhYworCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworcm0gLXJmIGNvbmZ0ZXN0Lm9uZSBjb25mdGVzdC50d28gY29uZnRlc3QuZGlyCisKK2ZpCisgIGlmIHRlc3QgIiR7YWNfY3ZfcGF0aF9pbnN0YWxsK3NldH0iID0gc2V0OyB0aGVuCisgICAgSU5TVEFMTD0kYWNfY3ZfcGF0aF9pbnN0YWxsCisgIGVsc2UKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHVzZSB0aGUgc2xvdyBzaGVsbCBzY3JpcHQuICBEb24ndCBjYWNoZSBhCisgICAgIyB2YWx1ZSBmb3IgSU5TVEFMTCB3aXRoaW4gYSBzb3VyY2UgZGlyZWN0b3J5LCBiZWNhdXNlIHRoYXQgd2lsbAorICAgICMgYnJlYWsgb3RoZXIgcGFja2FnZXMgdXNpbmcgdGhlIGNhY2hlIGlmIHRoYXQgZGlyZWN0b3J5IGlzCisgICAgIyByZW1vdmVkLCBvciBpZiB0aGUgdmFsdWUgaXMgYSByZWxhdGl2ZSBuYW1lLgorICAgIElOU1RBTEw9JGFjX2luc3RhbGxfc2gKKyAgZmkKK2ZpCit7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHJlc3VsdDogJElOU1RBTEwiID4mNQorJGFzX2VjaG8gIiRJTlNUQUxMIiA+JjY7IH0KKworIyBVc2UgdGVzdCAteiBiZWNhdXNlIFN1bk9TNCBzaCBtaXNoYW5kbGVzIGJyYWNlcyBpbiAke3Zhci12YWx9LgorIyBJdCB0aGlua3MgdGhlIGZpcnN0IGNsb3NlIGJyYWNlIGVuZHMgdGhlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi4KK3Rlc3QgLXogIiRJTlNUQUxMX1BST0dSQU0iICYmIElOU1RBTExfUFJPR1JBTT0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfU0NSSVBUIiAmJiBJTlNUQUxMX1NDUklQVD0nJHtJTlNUQUxMfScKKwordGVzdCAteiAiJElOU1RBTExfREFUQSIgJiYgSU5TVEFMTF9EQVRBPScke0lOU1RBTEx9IC1tIDY0NCcKKworCithY19jb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIGNvbmZpZy5oIgorCisKK2FjX2NvbmZpZ19maWxlcz0iJGFjX2NvbmZpZ19maWxlcyBNYWtlZmlsZSBwY2FwLWZpbHRlci5tYW5taXNjIHBjYXAtbGlua3R5cGUubWFubWlzYyBwY2FwLXRzdGFtcC5tYW5taXNjIHBjYXAtc2F2ZWZpbGUubWFuZmlsZSBwY2FwLjNwY2FwIHBjYXBfY29tcGlsZS4zcGNhcCBwY2FwX2RhdGFsaW5rLjNwY2FwIHBjYXBfZHVtcF9vcGVuLjNwY2FwIHBjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAgcGNhcF9saXN0X3RzdGFtcF90eXBlcy4zcGNhcCBwY2FwX29wZW5fZGVhZC4zcGNhcCBwY2FwX29wZW5fb2ZmbGluZS4zcGNhcCBwY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcCIKKworY2F0ID5jb25mY2FjaGUgPDxcX0FDRU9GCisjIFRoaXMgZmlsZSBpcyBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhY2hlcyB0aGUgcmVzdWx0cyBvZiBjb25maWd1cmUKKyMgdGVzdHMgcnVuIG9uIHRoaXMgc3lzdGVtIHNvIHRoZXkgY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGNvbmZpZ3VyZQorIyBzY3JpcHRzIGFuZCBjb25maWd1cmUgcnVucywgc2VlIGNvbmZpZ3VyZSdzIG9wdGlvbiAtLWNvbmZpZy1jYWNoZS4KKyMgSXQgaXMgbm90IHVzZWZ1bCBvbiBvdGhlciBzeXN0ZW1zLiAgSWYgaXQgY29udGFpbnMgcmVzdWx0cyB5b3UgZG9uJ3QKKyMgd2FudCB0byBrZWVwLCB5b3UgbWF5IHJlbW92ZSBvciBlZGl0IGl0LgorIworIyBjb25maWcuc3RhdHVzIG9ubHkgcGF5cyBhdHRlbnRpb24gdG8gdGhlIGNhY2hlIGZpbGUgaWYgeW91IGdpdmUgaXQKKyMgdGhlIC0tcmVjaGVjayBvcHRpb24gdG8gcmVydW4gY29uZmlndXJlLgorIworIyBgYWNfY3ZfZW52X2ZvbycgdmFyaWFibGVzIChzZXQgb3IgdW5zZXQpIHdpbGwgYmUgb3ZlcnJpZGRlbiB3aGVuCisjIGxvYWRpbmcgdGhpcyBmaWxlLCBvdGhlciAqdW5zZXQqIGBhY19jdl9mb28nIHdpbGwgYmUgYXNzaWduZWQgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMuCisKK19BQ0VPRgorCisjIFRoZSBmb2xsb3dpbmcgd2F5IG9mIHdyaXRpbmcgdGhlIGNhY2hlIG1pc2hhbmRsZXMgbmV3bGluZXMgaW4gdmFsdWVzLAorIyBidXQgd2Uga25vdyBvZiBubyB3b3JrYXJvdW5kIHRoYXQgaXMgc2ltcGxlLCBwb3J0YWJsZSwgYW5kIGVmZmljaWVudC4KKyMgU28sIHdlIGtpbGwgdmFyaWFibGVzIGNvbnRhaW5pbmcgbmV3bGluZXMuCisjIFVsdHJpeCBzaCBzZXQgd3JpdGVzIHRvIHN0ZGVyciBhbmQgY2FuJ3QgYmUgcmVkaXJlY3RlZCBkaXJlY3RseSwKKyMgYW5kIHNldHMgdGhlIGhpZ2ggYml0IGluIHRoZSBjYWNoZSBmaWxlIHVubGVzcyB3ZSBhc3NpZ24gdG8gdGhlIHZhcnMuCisoCisgIGZvciBhY192YXIgaW4gYChzZXQpIDI+JjEgfCBzZWQgLW4gJ3MvXlwoW2EtekEtWl9dW2EtekEtWjAtOV9dKlwpPS4qL1wxL3AnYDsgZG8KKyAgICBldmFsIGFjX3ZhbD1cJCRhY192YXIKKyAgICBjYXNlICRhY192YWwgaW4gIygKKyAgICAqJHthc19ubH0qKQorICAgICAgY2FzZSAkYWNfdmFyIGluICMoCisgICAgICAqX2N2XyopIHsgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogY2FjaGUgdmFyaWFibGUgJGFjX3ZhciBjb250YWlucyBhIG5ld2xpbmUiID4mMjt9IDs7CisgICAgICBlc2FjCisgICAgICBjYXNlICRhY192YXIgaW4gIygKKyAgICAgIF8gfCBJRlMgfCBhc19ubCkgOzsgIygKKyAgICAgIEJBU0hfQVJHViB8IEJBU0hfU09VUkNFKSBldmFsICRhY192YXI9IDs7ICMoCisgICAgICAqKSB7IGV2YWwgJGFjX3Zhcj07IHVuc2V0ICRhY192YXI7fSA7OworICAgICAgZXNhYyA7OworICAgIGVzYWMKKyAgZG9uZQorCisgIChzZXQpIDI+JjEgfAorICAgIGNhc2UgJGFzX25sYChhY19zcGFjZT0nICc7IHNldCkgMj4mMWAgaW4gIygKKyAgICAqJHthc19ubH1hY19zcGFjZT1cICopCisgICAgICAjIGBzZXQnIGRvZXMgbm90IHF1b3RlIGNvcnJlY3RseSwgc28gYWRkIHF1b3RlczogZG91YmxlLXF1b3RlCisgICAgICAjIHN1YnN0aXR1dGlvbiB0dXJucyBcXFxcIGludG8gXFwsIGFuZCBzZWQgdHVybnMgXFwgaW50byBcLgorICAgICAgc2VkIC1uIFwKKwkicy8nLydcXFxcJycvZzsKKwkgIHMvXlxcKFtfJGFzX2NyX2FsbnVtXSpfY3ZfW18kYXNfY3JfYWxudW1dKlxcKT1cXCguKlxcKS9cXDE9J1xcMicvcCIKKyAgICAgIDs7ICMoCisgICAgKikKKyAgICAgICMgYHNldCcgcXVvdGVzIGNvcnJlY3RseSBhcyByZXF1aXJlZCBieSBQT1NJWCwgc28gZG8gbm90IGFkZCBxdW90ZXMuCisgICAgICBzZWQgLW4gIi9eW18kYXNfY3JfYWxudW1dKl9jdl9bXyRhc19jcl9hbG51bV0qPS9wIgorICAgICAgOzsKKyAgICBlc2FjIHwKKyAgICBzb3J0CispIHwKKyAgc2VkICcKKyAgICAgL15hY19jdl9lbnZfL2IgZW5kCisgICAgIHQgY2xlYXIKKyAgICAgOmNsZWFyCisgICAgIHMvXlwoW149XSpcKT1cKC4qW3t9XS4qXCkkL3Rlc3QgIiR7XDErc2V0fSIgPSBzZXQgfHwgJi8KKyAgICAgdCBlbmQKKyAgICAgcy9eXChbXj1dKlwpPVwoLipcKSQvXDE9JHtcMT1cMn0vCisgICAgIDplbmQnID4+Y29uZmNhY2hlCitpZiBkaWZmICIkY2FjaGVfZmlsZSIgY29uZmNhY2hlID4vZGV2L251bGwgMj4mMTsgdGhlbiA6OyBlbHNlCisgIGlmIHRlc3QgLXcgIiRjYWNoZV9maWxlIjsgdGhlbgorICAgIHRlc3QgIngkY2FjaGVfZmlsZSIgIT0gIngvZGV2L251bGwiICYmCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IHVwZGF0aW5nIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICAgIGNhdCBjb25mY2FjaGUgPiRjYWNoZV9maWxlCisgIGVsc2UKKyAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IG5vdCB1cGRhdGluZyB1bndyaXRhYmxlIGNhY2hlICRjYWNoZV9maWxlIiA+JjY7fQorICBmaQorZmkKK3JtIC1mIGNvbmZjYWNoZQorCit0ZXN0ICJ4JHByZWZpeCIgPSB4Tk9ORSAmJiBwcmVmaXg9JGFjX2RlZmF1bHRfcHJlZml4CisjIExldCBtYWtlIGV4cGFuZCBleGVjX3ByZWZpeC4KK3Rlc3QgIngkZXhlY19wcmVmaXgiID0geE5PTkUgJiYgZXhlY19wcmVmaXg9JyR7cHJlZml4fScKKworREVGUz0tREhBVkVfQ09ORklHX0gKKworYWNfbGlib2Jqcz0KK2FjX2x0bGlib2Jqcz0KK1U9Citmb3IgYWNfaSBpbiA6ICRMSUJPQkpTOyBkbyB0ZXN0ICJ4JGFjX2kiID0geDogJiYgY29udGludWUKKyAgIyAxLiBSZW1vdmUgdGhlIGV4dGVuc2lvbiwgYW5kICRVIGlmIGFscmVhZHkgaW5zdGFsbGVkLgorICBhY19zY3JpcHQ9J3MvXCRVXC4vLi87cy9cLm8kLy87cy9cLm9iaiQvLycKKyAgYWNfaT1gJGFzX2VjaG8gIiRhY19pIiB8IHNlZCAiJGFjX3NjcmlwdCJgCisgICMgMi4gUHJlcGVuZCBMSUJPQkpESVIuICBXaGVuIHVzZWQgd2l0aCBhdXRvbWFrZT49MS4xMCBMSUJPQkpESVIKKyAgIyAgICB3aWxsIGJlIHNldCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIExJQk9CSlMgb2JqZWN0cyBhcmUgYnVpbHQuCisgIGFzX2ZuX2FwcGVuZCBhY19saWJvYmpzICIgXCR7TElCT0JKRElSfSRhY19pXCRVLiRhY19vYmpleHQiCisgIGFzX2ZuX2FwcGVuZCBhY19sdGxpYm9ianMgIiBcJHtMSUJPQkpESVJ9JGFjX2kiJyRVLmxvJworZG9uZQorTElCT0JKUz0kYWNfbGlib2JqcworCitMVExJQk9CSlM9JGFjX2x0bGlib2JqcworCisKKworOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQorYWNfd3JpdGVfZmFpbD0wCithY19jbGVhbl9maWxlc19zYXZlPSRhY19jbGVhbl9maWxlcworYWNfY2xlYW5fZmlsZXM9IiRhY19jbGVhbl9maWxlcyAkQ09ORklHX1NUQVRVUyIKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJENPTkZJR19TVEFUVVMiID4mNjt9Cithc193cml0ZV9mYWlsPTAKK2NhdCA+JENPTkZJR19TVEFUVVMgPDxfQVNFT0YgfHwgYXNfd3JpdGVfZmFpbD0xCisjISAkU0hFTEwKKyMgR2VuZXJhdGVkIGJ5ICRhc19tZS4KKyMgUnVuIHRoaXMgZmlsZSB0byByZWNyZWF0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorIyBDb21waWxlciBvdXRwdXQgcHJvZHVjZWQgYnkgY29uZmlndXJlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworIyBjb25maWd1cmUsIGlzIGluIGNvbmZpZy5sb2cgaWYgaXQgZXhpc3RzLgorCitkZWJ1Zz1mYWxzZQorYWNfY3NfcmVjaGVjaz1mYWxzZQorYWNfY3Nfc2lsZW50PWZhbHNlCisKK1NIRUxMPVwke0NPTkZJR19TSEVMTC0kU0hFTEx9CitleHBvcnQgU0hFTEwKK19BU0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FTRU9GIHx8IGFzX3dyaXRlX2ZhaWw9MQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE00c2ggSW5pdGlhbGl6YXRpb24uICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworCisjIEJlIG1vcmUgQm91cm5lIGNvbXBhdGlibGUKK0RVQUxDQVNFPTE7IGV4cG9ydCBEVUFMQ0FTRSAjIGZvciBNS1Mgc2gKK2lmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbiA6CisgIGVtdWxhdGUgc2gKKyAgTlVMTENNRD06CisgICMgUHJlLTQuMiB2ZXJzaW9ucyBvZiBac2ggZG8gd29yZCBzcGxpdHRpbmcgb24gJHsxKyIkQCJ9LCB3aGljaAorICAjIGlzIGNvbnRyYXJ5IHRvIG91ciB1c2FnZS4gIERpc2FibGUgdGhpcyBmZWF0dXJlLgorICBhbGlhcyAtZyAnJHsxKyIkQCJ9Jz0nIiRAIicKKyAgc2V0b3B0IE5PX0dMT0JfU1VCU1QKK2Vsc2UKKyAgY2FzZSBgKHNldCAtbykgMj4vZGV2L251bGxgIGluICMoCisgICpwb3NpeCopIDoKKyAgICBzZXQgLW8gcG9zaXggOzsgIygKKyAgKikgOgorICAgICA7OworZXNhYworZmkKKworCithc19ubD0nCisnCitleHBvcnQgYXNfbmwKKyMgUHJpbnRpbmcgYSBsb25nIHN0cmluZyBjcmFzaGVzIFNvbGFyaXMgNyAvdXNyL2Jpbi9wcmludGYuCithc19lY2hvPSdcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcJworYXNfZWNobz0kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvCithc19lY2hvPSRhc19lY2hvJGFzX2VjaG8kYXNfZWNobyRhc19lY2hvJGFzX2VjaG8kYXNfZWNobworIyBQcmVmZXIgYSBrc2ggc2hlbGwgYnVpbHRpbiBvdmVyIGFuIGV4dGVybmFsIHByaW50ZiBwcm9ncmFtIG9uIFNvbGFyaXMsCisjIGJ1dCB3aXRob3V0IHdhc3RpbmcgZm9ya3MgZm9yIGJhc2ggb3IgenNoLgoraWYgdGVzdCAteiAiJEJBU0hfVkVSU0lPTiRaU0hfVkVSU0lPTiIgXAorICAgICYmICh0ZXN0ICJYYHByaW50IC1yIC0tICRhc19lY2hvYCIgPSAiWCRhc19lY2hvIikgMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfZWNobz0ncHJpbnQgLXIgLS0nCisgIGFzX2VjaG9fbj0ncHJpbnQgLXJuIC0tJworZWxpZiAodGVzdCAiWGBwcmludGYgJXMgJGFzX2VjaG9gIiA9ICJYJGFzX2VjaG8iKSAyPi9kZXYvbnVsbDsgdGhlbgorICBhc19lY2hvPSdwcmludGYgJXNcbicKKyAgYXNfZWNob19uPSdwcmludGYgJXMnCitlbHNlCisgIGlmIHRlc3QgIlhgKC91c3IvdWNiL2VjaG8gLW4gLW4gJGFzX2VjaG8pIDI+L2Rldi9udWxsYCIgPSAiWC1uICRhc19lY2hvIjsgdGhlbgorICAgIGFzX2VjaG9fYm9keT0nZXZhbCAvdXNyL3VjYi9lY2hvIC1uICIkMSRhc19ubCInCisgICAgYXNfZWNob19uPScvdXNyL3VjYi9lY2hvIC1uJworICBlbHNlCisgICAgYXNfZWNob19ib2R5PSdldmFsIGV4cHIgIlgkMSIgOiAiWFxcKC4qXFwpIicKKyAgICBhc19lY2hvX25fYm9keT0nZXZhbAorICAgICAgYXJnPSQxOworICAgICAgY2FzZSAkYXJnIGluICMoCisgICAgICAqIiRhc19ubCIqKQorCWV4cHIgIlgkYXJnIiA6ICJYXFwoLipcXCkkYXNfbmwiOworCWFyZz1gZXhwciAiWCRhcmciIDogIi4qJGFzX25sXFwoLipcXCkiYDs7CisgICAgICBlc2FjOworICAgICAgZXhwciAiWCRhcmciIDogIlhcXCguKlxcKSIgfCB0ciAtZCAiJGFzX25sIgorICAgICcKKyAgICBleHBvcnQgYXNfZWNob19uX2JvZHkKKyAgICBhc19lY2hvX249J3NoIC1jICRhc19lY2hvX25fYm9keSBhc19lY2hvJworICBmaQorICBleHBvcnQgYXNfZWNob19ib2R5CisgIGFzX2VjaG89J3NoIC1jICRhc19lY2hvX2JvZHkgYXNfZWNobycKK2ZpCisKKyMgVGhlIHVzZXIgaXMgYWx3YXlzIHJpZ2h0LgoraWYgdGVzdCAiJHtQQVRIX1NFUEFSQVRPUitzZXR9IiAhPSBzZXQ7IHRoZW4KKyAgUEFUSF9TRVBBUkFUT1I9OgorICAoUEFUSD0nL2JpbjsvYmluJzsgRlBBVEg9JFBBVEg7IHNoIC1jIDopID4vZGV2L251bGwgMj4mMSAmJiB7CisgICAgKFBBVEg9Jy9iaW46L2Jpbic7IEZQQVRIPSRQQVRIOyBzaCAtYyA6KSA+L2Rldi9udWxsIDI+JjEgfHwKKyAgICAgIFBBVEhfU0VQQVJBVE9SPSc7JworICB9CitmaQorCisKKyMgSUZTCisjIFdlIG5lZWQgc3BhY2UsIHRhYiBhbmQgbmV3IGxpbmUsIGluIHByZWNpc2VseSB0aGF0IG9yZGVyLiAgUXVvdGluZyBpcworIyB0aGVyZSB0byBwcmV2ZW50IGVkaXRvcnMgZnJvbSBjb21wbGFpbmluZyBhYm91dCBzcGFjZS10YWIuCisjIChJZiBfQVNfUEFUSF9XQUxLIHdlcmUgY2FsbGVkIHdpdGggSUZTIHVuc2V0LCBpdCB3b3VsZCBkaXNhYmxlIHdvcmQKKyMgc3BsaXR0aW5nIGJ5IHNldHRpbmcgSUZTIHRvIGVtcHR5IHZhbHVlLikKK0lGUz0iICIiCSRhc19ubCIKKworIyBGaW5kIHdobyB3ZSBhcmUuICBMb29rIGluIHRoZSBwYXRoIGlmIHdlIGNvbnRhaW4gbm8gZGlyZWN0b3J5IHNlcGFyYXRvci4KK2Nhc2UgJDAgaW4gIygoCisgICpbXFwvXSogKSBhc19teXNlbGY9JDAgOzsKKyAgKikgYXNfc2F2ZV9JRlM9JElGUzsgSUZTPSRQQVRIX1NFUEFSQVRPUgorZm9yIGFzX2RpciBpbiAkUEFUSAorZG8KKyAgSUZTPSRhc19zYXZlX0lGUworICB0ZXN0IC16ICIkYXNfZGlyIiAmJiBhc19kaXI9LgorICAgIHRlc3QgLXIgIiRhc19kaXIvJDAiICYmIGFzX215c2VsZj0kYXNfZGlyLyQwICYmIGJyZWFrCisgIGRvbmUKK0lGUz0kYXNfc2F2ZV9JRlMKKworICAgICA7OworZXNhYworIyBXZSBkaWQgbm90IGZpbmQgb3Vyc2VsdmVzLCBtb3N0IHByb2JhYmx5IHdlIHdlcmUgcnVuIGFzIGBzaCBDT01NQU5EJworIyBpbiB3aGljaCBjYXNlIHdlIGFyZSBub3QgdG8gYmUgZm91bmQgaW4gdGhlIHBhdGguCitpZiB0ZXN0ICJ4JGFzX215c2VsZiIgPSB4OyB0aGVuCisgIGFzX215c2VsZj0kMAorZmkKK2lmIHRlc3QgISAtZiAiJGFzX215c2VsZiI7IHRoZW4KKyAgJGFzX2VjaG8gIiRhc19teXNlbGY6IGVycm9yOiBjYW5ub3QgZmluZCBteXNlbGY7IHJlcnVuIHdpdGggYW4gYWJzb2x1dGUgZmlsZSBuYW1lIiA+JjIKKyAgZXhpdCAxCitmaQorCisjIFVuc2V0IHZhcmlhYmxlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFuZCB3aGljaCBjYXVzZSBidWdzIChlLmcuIGluCisjIHByZS0zLjAgVVdJTiBrc2gpLiAgQnV0IGRvIG5vdCBjYXVzZSBidWdzIGluIGJhc2ggMi4wMTsgdGhlICJ8fCBleGl0IDEiCisjIHN1cHByZXNzZXMgYW55ICJTZWdtZW50YXRpb24gZmF1bHQiIG1lc3NhZ2UgdGhlcmUuICAnKCgnIGNvdWxkCisjIHRyaWdnZXIgYSBidWcgaW4gcGRrc2ggNS4yLjE0LgorZm9yIGFzX3ZhciBpbiBCQVNIX0VOViBFTlYgTUFJTCBNQUlMUEFUSAorZG8gZXZhbCB0ZXN0IHhcJHskYXNfdmFyK3NldH0gPSB4c2V0IFwKKyAgJiYgKCAodW5zZXQgJGFzX3ZhcikgfHwgZXhpdCAxKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgJGFzX3ZhciB8fCA6Citkb25lCitQUzE9JyQgJworUFMyPSc+ICcKK1BTND0nKyAnCisKKyMgTkxTIG51aXNhbmNlcy4KK0xDX0FMTD1DCitleHBvcnQgTENfQUxMCitMQU5HVUFHRT1DCitleHBvcnQgTEFOR1VBR0UKKworIyBDRFBBVEguCisodW5zZXQgQ0RQQVRIKSA+L2Rldi9udWxsIDI+JjEgJiYgdW5zZXQgQ0RQQVRICisKKworIyBhc19mbl9lcnJvciBTVEFUVVMgRVJST1IgW0xJTkVOTyBMT0dfRkRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT3V0cHV0ICJgYmFzZW5hbWUgJDBgOiBlcnJvcjogRVJST1IiIHRvIHN0ZGVyci4gSWYgTElORU5PIGFuZCBMT0dfRkQgYXJlCisjIHByb3ZpZGVkLCBhbHNvIG91dHB1dCB0aGUgZXJyb3IgdG8gTE9HX0ZELCByZWZlcmVuY2luZyBMSU5FTk8uIFRoZW4gZXhpdCB0aGUKKyMgc2NyaXB0IHdpdGggU1RBVFVTLCB1c2luZyAxIGlmIHRoYXQgd2FzIDAuCithc19mbl9lcnJvciAoKQoreworICBhc19zdGF0dXM9JDE7IHRlc3QgJGFzX3N0YXR1cyAtZXEgMCAmJiBhc19zdGF0dXM9MQorICBpZiB0ZXN0ICIkNCI7IHRoZW4KKyAgICBhc19saW5lbm89JHthc19saW5lbm8tIiQzIn0gYXNfbGluZW5vX3N0YWNrPWFzX2xpbmVub19zdGFjaz0kYXNfbGluZW5vX3N0YWNrCisgICAgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogZXJyb3I6ICQyIiA+JiQ0CisgIGZpCisgICRhc19lY2hvICIkYXNfbWU6IGVycm9yOiAkMiIgPiYyCisgIGFzX2ZuX2V4aXQgJGFzX3N0YXR1cworfSAjIGFzX2ZuX2Vycm9yCisKKworIyBhc19mbl9zZXRfc3RhdHVzIFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTZXQgJD8gdG8gU1RBVFVTLCB3aXRob3V0IGZvcmtpbmcuCithc19mbl9zZXRfc3RhdHVzICgpCit7CisgIHJldHVybiAkMQorfSAjIGFzX2ZuX3NldF9zdGF0dXMKKworIyBhc19mbl9leGl0IFNUQVRVUworIyAtLS0tLS0tLS0tLS0tLS0tLQorIyBFeGl0IHRoZSBzaGVsbCB3aXRoIFNUQVRVUywgZXZlbiBpbiBhICJ0cmFwIDAiIG9yICJzZXQgLWUiIGNvbnRleHQuCithc19mbl9leGl0ICgpCit7CisgIHNldCArZQorICBhc19mbl9zZXRfc3RhdHVzICQxCisgIGV4aXQgJDEKK30gIyBhc19mbl9leGl0CisKKyMgYXNfZm5fdW5zZXQgVkFSCisjIC0tLS0tLS0tLS0tLS0tLQorIyBQb3J0YWJseSB1bnNldCBWQVIuCithc19mbl91bnNldCAoKQoreworICB7IGV2YWwgJDE9OyB1bnNldCAkMTt9Cit9Cithc191bnNldD1hc19mbl91bnNldAorIyBhc19mbl9hcHBlbmQgVkFSIFZBTFVFCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQXBwZW5kIHRoZSB0ZXh0IGluIFZBTFVFIHRvIHRoZSBlbmQgb2YgdGhlIGRlZmluaXRpb24gY29udGFpbmVkIGluIFZBUi4gVGFrZQorIyBhZHZhbnRhZ2Ugb2YgYW55IHNoZWxsIG9wdGltaXphdGlvbnMgdGhhdCBhbGxvdyBhbW9ydGl6ZWQgbGluZWFyIGdyb3d0aCBvdmVyCisjIHJlcGVhdGVkIGFwcGVuZHMsIGluc3RlYWQgb2YgdGhlIHR5cGljYWwgcXVhZHJhdGljIGdyb3d0aCBwcmVzZW50IGluIG5haXZlCisjIGltcGxlbWVudGF0aW9ucy4KK2lmIChldmFsICJhc192YXI9MTsgYXNfdmFyKz0yOyB0ZXN0IHhcJGFzX3ZhciA9IHgxMiIpIDI+L2Rldi9udWxsOyB0aGVuIDoKKyAgZXZhbCAnYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxKz1cJDIKKyAgfScKK2Vsc2UKKyAgYXNfZm5fYXBwZW5kICgpCisgIHsKKyAgICBldmFsICQxPVwkJDFcJDIKKyAgfQorZmkgIyBhc19mbl9hcHBlbmQKKworIyBhc19mbl9hcml0aCBBUkcuLi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBlcmZvcm0gYXJpdGhtZXRpYyBldmFsdWF0aW9uIG9uIHRoZSBBUkdzLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiB0aGUKKyMgZ2xvYmFsICRhc192YWwuIFRha2UgYWR2YW50YWdlIG9mIHNoZWxscyB0aGF0IGNhbiBhdm9pZCBmb3Jrcy4gVGhlIGFyZ3VtZW50cworIyBtdXN0IGJlIHBvcnRhYmxlIGFjcm9zcyAkKCgpKSBhbmQgZXhwci4KK2lmIChldmFsICJ0ZXN0IFwkKCggMSArIDEgKSkgPSAyIikgMj4vZGV2L251bGw7IHRoZW4gOgorICBldmFsICdhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPSQoKCAkKiApKQorICB9JworZWxzZQorICBhc19mbl9hcml0aCAoKQorICB7CisgICAgYXNfdmFsPWBleHByICIkQCIgfHwgdGVzdCAkPyAtZXEgMWAKKyAgfQorZmkgIyBhc19mbl9hcml0aAorCisKK2lmIGV4cHIgYSA6ICdcKGFcKScgPi9kZXYvbnVsbCAyPiYxICYmCisgICB0ZXN0ICJYYGV4cHIgMDAwMDEgOiAnLipcKC4uLlwpJ2AiID0gWDAwMTsgdGhlbgorICBhc19leHByPWV4cHIKK2Vsc2UKKyAgYXNfZXhwcj1mYWxzZQorZmkKKworaWYgKGJhc2VuYW1lIC0tIC8pID4vZGV2L251bGwgMj4mMSAmJiB0ZXN0ICJYYGJhc2VuYW1lIC0tIC8gMj4mMWAiID0gIlgvIjsgdGhlbgorICBhc19iYXNlbmFtZT1iYXNlbmFtZQorZWxzZQorICBhc19iYXNlbmFtZT1mYWxzZQorZmkKKworaWYgKGFzX2Rpcj1gZGlybmFtZSAtLSAvYCAmJiB0ZXN0ICJYJGFzX2RpciIgPSBYLykgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX2Rpcm5hbWU9ZGlybmFtZQorZWxzZQorICBhc19kaXJuYW1lPWZhbHNlCitmaQorCithc19tZT1gJGFzX2Jhc2VuYW1lIC0tICIkMCIgfHwKKyRhc19leHByIFgvIiQwIiA6ICcuKi9cKFteL11bXi9dKlwpLyokJyBcfCBcCisJIFgiJDAiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJDAiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWC8iJDAiIHwKKyAgICBzZWQgJy9eLipcL1woW14vXVteL10qXClcLyokL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wvXCkkL3sKKwkgICAgcy8vXDEvCisJICAgIHEKKwkgIH0KKwkgIC9eWFwvXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisKKyMgQXZvaWQgZGVwZW5kaW5nIHVwb24gQ2hhcmFjdGVyIFJhbmdlcy4KK2FzX2NyX2xldHRlcnM9J2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworYXNfY3JfTEVUVEVSUz0nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCithc19jcl9MZXR0ZXJzPSRhc19jcl9sZXR0ZXJzJGFzX2NyX0xFVFRFUlMKK2FzX2NyX2RpZ2l0cz0nMDEyMzQ1Njc4OScKK2FzX2NyX2FsbnVtPSRhc19jcl9MZXR0ZXJzJGFzX2NyX2RpZ2l0cworCitFQ0hPX0M9IEVDSE9fTj0gRUNIT19UPQorY2FzZSBgZWNobyAtbiB4YCBpbiAjKCgoKCgKKy1uKikKKyAgY2FzZSBgZWNobyAneHlcYydgIGluCisgICpjKikgRUNIT19UPScJJzs7CSMgRUNIT19UIGlzIHNpbmdsZSB0YWIgY2hhcmFjdGVyLgorICB4eSkgIEVDSE9fQz0nXGMnOzsKKyAgKikgICBlY2hvIGBlY2hvIGtzaDg4IGJ1ZyBvbiBBSVggNi4xYCA+IC9kZXYvbnVsbAorICAgICAgIEVDSE9fVD0nCSc7OworICBlc2FjOzsKKyopCisgIEVDSE9fTj0nLW4nOzsKK2VzYWMKKworcm0gLWYgY29uZiQkIGNvbmYkJC5leGUgY29uZiQkLmZpbGUKK2lmIHRlc3QgLWQgY29uZiQkLmRpcjsgdGhlbgorICBybSAtZiBjb25mJCQuZGlyL2NvbmYkJC5maWxlCitlbHNlCisgIHJtIC1mIGNvbmYkJC5kaXIKKyAgbWtkaXIgY29uZiQkLmRpciAyPi9kZXYvbnVsbAorZmkKK2lmIChlY2hvID5jb25mJCQuZmlsZSkgMj4vZGV2L251bGw7IHRoZW4KKyAgaWYgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz0nbG4gLXMnCisgICAgIyAuLi4gYnV0IHRoZXJlIGFyZSB0d28gZ290Y2hhczoKKyAgICAjIDEpIE9uIE1TWVMsIGJvdGggYGxuIC1zIGZpbGUgZGlyJyBhbmQgYGxuIGZpbGUgZGlyJyBmYWlsLgorICAgICMgMikgREpHUFAgPCAyLjA0IGhhcyBubyBzeW1saW5rczsgYGxuIC1zJyBjcmVhdGVzIGEgd3JhcHBlciBleGVjdXRhYmxlLgorICAgICMgSW4gYm90aCBjYXNlcywgd2UgaGF2ZSB0byBkZWZhdWx0IHRvIGBjcCAtcCcuCisgICAgbG4gLXMgY29uZiQkLmZpbGUgY29uZiQkLmRpciAyPi9kZXYvbnVsbCAmJiB0ZXN0ICEgLWYgY29uZiQkLmV4ZSB8fAorICAgICAgYXNfbG5fcz0nY3AgLXAnCisgIGVsaWYgbG4gY29uZiQkLmZpbGUgY29uZiQkIDI+L2Rldi9udWxsOyB0aGVuCisgICAgYXNfbG5fcz1sbgorICBlbHNlCisgICAgYXNfbG5fcz0nY3AgLXAnCisgIGZpCitlbHNlCisgIGFzX2xuX3M9J2NwIC1wJworZmkKK3JtIC1mIGNvbmYkJCBjb25mJCQuZXhlIGNvbmYkJC5kaXIvY29uZiQkLmZpbGUgY29uZiQkLmZpbGUKK3JtZGlyIGNvbmYkJC5kaXIgMj4vZGV2L251bGwKKworCisjIGFzX2ZuX21rZGlyX3AKKyMgLS0tLS0tLS0tLS0tLQorIyBDcmVhdGUgIiRhc19kaXIiIGFzIGEgZGlyZWN0b3J5LCBpbmNsdWRpbmcgcGFyZW50cyBpZiBuZWNlc3NhcnkuCithc19mbl9ta2Rpcl9wICgpCit7CisKKyAgY2FzZSAkYXNfZGlyIGluICMoCisgIC0qKSBhc19kaXI9Li8kYXNfZGlyOzsKKyAgZXNhYworICB0ZXN0IC1kICIkYXNfZGlyIiB8fCBldmFsICRhc19ta2Rpcl9wIHx8IHsKKyAgICBhc19kaXJzPQorICAgIHdoaWxlIDo7IGRvCisgICAgICBjYXNlICRhc19kaXIgaW4gIygKKyAgICAgICpcJyopIGFzX3FkaXI9YCRhc19lY2hvICIkYXNfZGlyIiB8IHNlZCAicy8nLydcXFxcXFxcXCcnL2ciYDs7ICMnKAorICAgICAgKikgYXNfcWRpcj0kYXNfZGlyOzsKKyAgICAgIGVzYWMKKyAgICAgIGFzX2RpcnM9IickYXNfcWRpcicgJGFzX2RpcnMiCisgICAgICBhc19kaXI9YCRhc19kaXJuYW1lIC0tICIkYXNfZGlyIiB8fAorJGFzX2V4cHIgWCIkYXNfZGlyIiA6ICdYXCguKlteL11cKS8vKlteL11bXi9dKi8qJCcgXHwgXAorCSBYIiRhc19kaXIiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFzX2RpciIgOiAnWFwoLy9cKSQnIFx8IFwKKwkgWCIkYXNfZGlyIiA6ICdYXCgvXCknIFx8IC4gMj4vZGV2L251bGwgfHwKKyRhc19lY2hvIFgiJGFzX2RpciIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgICAgICB0ZXN0IC1kICIkYXNfZGlyIiAmJiBicmVhaworICAgIGRvbmUKKyAgICB0ZXN0IC16ICIkYXNfZGlycyIgfHwgZXZhbCAibWtkaXIgJGFzX2RpcnMiCisgIH0gfHwgdGVzdCAtZCAiJGFzX2RpciIgfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5ICRhc19kaXIiCisKKworfSAjIGFzX2ZuX21rZGlyX3AKK2lmIG1rZGlyIC1wIC4gMj4vZGV2L251bGw7IHRoZW4KKyAgYXNfbWtkaXJfcD0nbWtkaXIgLXAgIiRhc19kaXIiJworZWxzZQorICB0ZXN0IC1kIC4vLXAgJiYgcm1kaXIgLi8tcAorICBhc19ta2Rpcl9wPWZhbHNlCitmaQorCitpZiB0ZXN0IC14IC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgIGFzX3Rlc3RfeD0ndGVzdCAteCcKK2Vsc2UKKyAgaWYgbHMgLWRMIC8gPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgYXNfbHNfTF9vcHRpb249TAorICBlbHNlCisgICAgYXNfbHNfTF9vcHRpb249CisgIGZpCisgIGFzX3Rlc3RfeD0nCisgICAgZXZhbCBzaCAtYyAnXCcnCisgICAgICBpZiB0ZXN0IC1kICIkMSI7IHRoZW4KKwl0ZXN0IC1kICIkMS8uIjsKKyAgICAgIGVsc2UKKwljYXNlICQxIGluICMoCisJLSopc2V0ICIuLyQxIjs7CisJZXNhYzsKKwljYXNlIGBscyAtbGQnJGFzX2xzX0xfb3B0aW9uJyAiJDEiIDI+L2Rldi9udWxsYCBpbiAjKCgKKwk/Pz9bc3hdKik6OzsqKWZhbHNlOztlc2FjO2ZpCisgICAgJ1wnJyBzaAorICAnCitmaQorYXNfZXhlY3V0YWJsZV9wPSRhc190ZXN0X3gKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIENQUCBuYW1lLgorYXNfdHJfY3BwPSJldmFsIHNlZCAneSUqJGFzX2NyX2xldHRlcnMlUCRhc19jcl9MRVRURVJTJTtzJVteXyRhc19jcl9hbG51bV0lXyVnJyIKKworIyBTZWQgZXhwcmVzc2lvbiB0byBtYXAgYSBzdHJpbmcgb250byBhIHZhbGlkIHZhcmlhYmxlIG5hbWUuCithc190cl9zaD0iZXZhbCBzZWQgJ3klKislcHAlO3MlW15fJGFzX2NyX2FsbnVtXSVfJWcnIgorCisKK2V4ZWMgNj4mMQorIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIyMKKyMjIE1haW4gYm9keSBvZiAkQ09ORklHX1NUQVRVUyBzY3JpcHQuICMjCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjIworX0FTRU9GCit0ZXN0ICRhc193cml0ZV9mYWlsID0gMCAmJiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBTYXZlIHRoZSBsb2cgbWVzc2FnZSwgdG8ga2VlcCAkMCBhbmQgc28gb24gbWVhbmluZ2Z1bCwgYW5kIHRvCisjIHJlcG9ydCBhY3R1YWwgaW5wdXQgdmFsdWVzIG9mIENPTkZJR19GSUxFUyBldGMuIGluc3RlYWQgb2YgdGhlaXIKKyMgdmFsdWVzIGFmdGVyIG9wdGlvbnMgaGFuZGxpbmcuCithY19sb2c9IgorVGhpcyBmaWxlIHdhcyBleHRlbmRlZCBieSAkYXNfbWUsIHdoaWNoIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3LiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCisKKyAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUworICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKKyAgQ09ORklHX0xJTktTICAgID0gJENPTkZJR19MSU5LUworICBDT05GSUdfQ09NTUFORFMgPSAkQ09ORklHX0NPTU1BTkRTCisgICQgJDAgJEAKKworb24gYChob3N0bmFtZSB8fCB1bmFtZSAtbikgMj4vZGV2L251bGwgfCBzZWQgMXFgCisiCisKK19BQ0VPRgorCitjYXNlICRhY19jb25maWdfZmlsZXMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2ZpbGVzOyBzaGlmdDsgYWNfY29uZmlnX2ZpbGVzPSQqOzsKK2VzYWMKKworY2FzZSAkYWNfY29uZmlnX2hlYWRlcnMgaW4gKiIKKyIqKSBzZXQgeCAkYWNfY29uZmlnX2hlYWRlcnM7IHNoaWZ0OyBhY19jb25maWdfaGVhZGVycz0kKjs7Citlc2FjCisKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisjIEZpbGVzIHRoYXQgY29uZmlnLnN0YXR1cyB3YXMgbWFkZSBmb3IuCitjb25maWdfZmlsZXM9IiRhY19jb25maWdfZmlsZXMiCitjb25maWdfaGVhZGVycz0iJGFjX2NvbmZpZ19oZWFkZXJzIgorCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorYWNfY3NfdXNhZ2U9IlwKK1xgJGFzX21lJyBpbnN0YW50aWF0ZXMgZmlsZXMgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gYWN0aW9ucworZnJvbSB0ZW1wbGF0ZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uICBVbmxlc3MgdGhlIGZpbGVzCithbmQgYWN0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIFRBR3MsIGFsbCBhcmUgaW5zdGFudGlhdGVkIGJ5IGRlZmF1bHQuCisKK1VzYWdlOiAkMCBbT1BUSU9OXS4uLiBbVEFHXS4uLgorCisgIC1oLCAtLWhlbHAgICAgICAgcHJpbnQgdGhpcyBoZWxwLCB0aGVuIGV4aXQKKyAgLVYsIC0tdmVyc2lvbiAgICBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgY29uZmlndXJhdGlvbiBzZXR0aW5ncywgdGhlbiBleGl0CisgICAgICAtLWNvbmZpZyAgICAgcHJpbnQgY29uZmlndXJhdGlvbiwgdGhlbiBleGl0CisgIC1xLCAtLXF1aWV0LCAtLXNpbGVudAorICAgICAgICAgICAgICAgICAgIGRvIG5vdCBwcmludCBwcm9ncmVzcyBtZXNzYWdlcworICAtZCwgLS1kZWJ1ZyAgICAgIGRvbid0IHJlbW92ZSB0ZW1wb3JhcnkgZmlsZXMKKyAgICAgIC0tcmVjaGVjayAgICB1cGRhdGUgJGFzX21lIGJ5IHJlY29uZmlndXJpbmcgaW4gdGhlIHNhbWUgY29uZGl0aW9ucworICAgICAgLS1maWxlPUZJTEVbOlRFTVBMQVRFXQorICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgRklMRQorICAgICAgLS1oZWFkZXI9RklMRVs6VEVNUExBVEVdCisgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUgdGhlIGNvbmZpZ3VyYXRpb24gaGVhZGVyIEZJTEUKKworQ29uZmlndXJhdGlvbiBmaWxlczoKKyRjb25maWdfZmlsZXMKKworQ29uZmlndXJhdGlvbiBoZWFkZXJzOgorJGNvbmZpZ19oZWFkZXJzCisKK1JlcG9ydCBidWdzIHRvIHRoZSBwYWNrYWdlIHByb3ZpZGVyLiIKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX2NzX2NvbmZpZz0iYCRhc19lY2hvICIkYWNfY29uZmlndXJlX2FyZ3MiIHwgc2VkICdzL14gLy87IHMvW1xcIiJcYFwkXS9cXFxcJi9nJ2AiCithY19jc192ZXJzaW9uPSJcXAorY29uZmlnLnN0YXR1cworY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjY3LAorICB3aXRoIG9wdGlvbnMgXFwiXCRhY19jc19jb25maWdcXCIKKworQ29weXJpZ2h0IChDKSAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBjb25maWcuc3RhdHVzIHNjcmlwdCBpcyBmcmVlIHNvZnR3YXJlOyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCitnaXZlcyB1bmxpbWl0ZWQgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlIGFuZCBtb2RpZnkgaXQuIgorCithY19wd2Q9JyRhY19wd2QnCitzcmNkaXI9JyRzcmNkaXInCitJTlNUQUxMPSckSU5TVEFMTCcKK3Rlc3QgLW4gIlwkQVdLIiB8fCBBV0s9YXdrCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBUaGUgZGVmYXVsdCBsaXN0cyBhcHBseSBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBmaWxlLgorYWNfbmVlZF9kZWZhdWx0cz06Cit3aGlsZSB0ZXN0ICQjICE9IDAKK2RvCisgIGNhc2UgJDEgaW4KKyAgLS0qPT8qKQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPWBleHByICJYJDEiIDogJ1hbXj1dKj1cKC4qXCknYAorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAtLSo9KQorICAgIGFjX29wdGlvbj1gZXhwciAiWCQxIiA6ICdYXChbXj1dKlwpPSdgCisgICAgYWNfb3B0YXJnPQorICAgIGFjX3NoaWZ0PToKKyAgICA7OworICAqKQorICAgIGFjX29wdGlvbj0kMQorICAgIGFjX29wdGFyZz0kMgorICAgIGFjX3NoaWZ0PXNoaWZ0CisgICAgOzsKKyAgZXNhYworCisgIGNhc2UgJGFjX29wdGlvbiBpbgorICAjIEhhbmRsaW5nIG9mIHRoZSBvcHRpb25zLgorICAtcmVjaGVjayB8IC0tcmVjaGVjayB8IC0tcmVjaGVjIHwgLS1yZWNoZSB8IC0tcmVjaCB8IC0tcmVjIHwgLS1yZSB8IC0tcikKKyAgICBhY19jc19yZWNoZWNrPTogOzsKKyAgLS12ZXJzaW9uIHwgLS12ZXJzaW8gfCAtLXZlcnNpIHwgLS12ZXJzIHwgLS12ZXIgfCAtLXZlIHwgLS12IHwgLVYgKQorICAgICRhc19lY2hvICIkYWNfY3NfdmVyc2lvbiI7IGV4aXQgOzsKKyAgLS1jb25maWcgfCAtLWNvbmZpIHwgLS1jb25mIHwgLS1jb24gfCAtLWNvIHwgLS1jICkKKyAgICAkYXNfZWNobyAiJGFjX2NzX2NvbmZpZyI7IGV4aXQgOzsKKyAgLS1kZWJ1ZyB8IC0tZGVidSB8IC0tZGViIHwgLS1kZSB8IC0tZCB8IC1kICkKKyAgICBkZWJ1Zz06IDs7CisgIC0tZmlsZSB8IC0tZmlsIHwgLS1maSB8IC0tZiApCisgICAgJGFjX3NoaWZ0CisgICAgY2FzZSAkYWNfb3B0YXJnIGluCisgICAgKlwnKikgYWNfb3B0YXJnPWAkYXNfZWNobyAiJGFjX29wdGFyZyIgfCBzZWQgInMvJy8nXFxcXFxcXFwnJy9nImAgOzsKKyAgICAnJykgYXNfZm5fZXJyb3IgJD8gIm1pc3NpbmcgZmlsZSBhcmd1bWVudCIgOzsKKyAgICBlc2FjCisgICAgYXNfZm5fYXBwZW5kIENPTkZJR19GSUxFUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZWFkZXIgfCAtLWhlYWRlIHwgLS1oZWFkIHwgLS1oZWEgKQorICAgICRhY19zaGlmdAorICAgIGNhc2UgJGFjX29wdGFyZyBpbgorICAgICpcJyopIGFjX29wdGFyZz1gJGFzX2VjaG8gIiRhY19vcHRhcmciIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgIDs7CisgICAgZXNhYworICAgIGFzX2ZuX2FwcGVuZCBDT05GSUdfSEVBREVSUyAiICckYWNfb3B0YXJnJyIKKyAgICBhY19uZWVkX2RlZmF1bHRzPWZhbHNlOzsKKyAgLS1oZSB8IC0taCkKKyAgICAjIENvbmZsaWN0IGJldHdlZW4gLS1oZWxwIGFuZCAtLWhlYWRlcgorICAgIGFzX2ZuX2Vycm9yICQ/ICJhbWJpZ3VvdXMgb3B0aW9uOiBcYCQxJworVHJ5IFxgJDAgLS1oZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iOzsKKyAgLS1oZWxwIHwgLS1oZWwgfCAtaCApCisgICAgJGFzX2VjaG8gIiRhY19jc191c2FnZSI7IGV4aXQgOzsKKyAgLXEgfCAtcXVpZXQgfCAtLXF1aWV0IHwgLS1xdWllIHwgLS1xdWkgfCAtLXF1IHwgLS1xIFwKKyAgfCAtc2lsZW50IHwgLS1zaWxlbnQgfCAtLXNpbGVuIHwgLS1zaWxlIHwgLS1zaWwgfCAtLXNpIHwgLS1zKQorICAgIGFjX2NzX3NpbGVudD06IDs7CisKKyAgIyBUaGlzIGlzIGFuIGVycm9yLgorICAtKikgYXNfZm5fZXJyb3IgJD8gInVucmVjb2duaXplZCBvcHRpb246IFxgJDEnCitUcnkgXGAkMCAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIgOzsKKworICAqKSBhc19mbl9hcHBlbmQgYWNfY29uZmlnX3RhcmdldHMgIiAkMSIKKyAgICAgYWNfbmVlZF9kZWZhdWx0cz1mYWxzZSA7OworCisgIGVzYWMKKyAgc2hpZnQKK2RvbmUKKworYWNfY29uZmlndXJlX2V4dHJhX2FyZ3M9CisKK2lmICRhY19jc19zaWxlbnQ7IHRoZW4KKyAgZXhlYyA2Pi9kZXYvbnVsbAorICBhY19jb25maWd1cmVfZXh0cmFfYXJncz0iJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tc2lsZW50IgorZmkKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIFwkYWNfY3NfcmVjaGVjazsgdGhlbgorICBzZXQgWCAnJFNIRUxMJyAnJDAnICRhY19jb25maWd1cmVfYXJncyBcJGFjX2NvbmZpZ3VyZV9leHRyYV9hcmdzIC0tbm8tY3JlYXRlIC0tbm8tcmVjdXJzaW9uCisgIHNoaWZ0CisgIFwkYXNfZWNobyAicnVubmluZyBDT05GSUdfU0hFTEw9JFNIRUxMIFwkKiIgPiY2CisgIENPTkZJR19TSEVMTD0nJFNIRUxMJworICBleHBvcnQgQ09ORklHX1NIRUxMCisgIGV4ZWMgIlwkQCIKK2ZpCisKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZXhlYyA1Pj5jb25maWcubG9nCit7CisgIGVjaG8KKyAgc2VkICdoO3MvLi8tL2c7cy9eLi4uLyMjIC87cy8uLi4kLyAjIy87cDt4O3A7eCcgPDxfQVNCT1gKKyMjIFJ1bm5pbmcgJGFzX21lLiAjIworX0FTQk9YCisgICRhc19lY2hvICIkYWNfbG9nIgorfSA+JjUKKworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK19BQ0VPRgorCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisKKyMgSGFuZGxpbmcgb2YgYXJndW1lbnRzLgorZm9yIGFjX2NvbmZpZ190YXJnZXQgaW4gJGFjX2NvbmZpZ190YXJnZXRzCitkbworICBjYXNlICRhY19jb25maWdfdGFyZ2V0IGluCisgICAgImNvbmZpZy5oIikgQ09ORklHX0hFQURFUlM9IiRDT05GSUdfSEVBREVSUyBjb25maWcuaCIgOzsKKyAgICAiTWFrZWZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgTWFrZWZpbGUiIDs7CisgICAgInBjYXAtZmlsdGVyLm1hbm1pc2MiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcC1maWx0ZXIubWFubWlzYyIgOzsKKyAgICAicGNhcC1saW5rdHlwZS5tYW5taXNjIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXAtbGlua3R5cGUubWFubWlzYyIgOzsKKyAgICAicGNhcC10c3RhbXAubWFubWlzYyIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwLXRzdGFtcC5tYW5taXNjIiA7OworICAgICJwY2FwLXNhdmVmaWxlLm1hbmZpbGUiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcC1zYXZlZmlsZS5tYW5maWxlIiA7OworICAgICJwY2FwLjNwY2FwIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXAuM3BjYXAiIDs7CisgICAgInBjYXBfY29tcGlsZS4zcGNhcCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwX2NvbXBpbGUuM3BjYXAiIDs7CisgICAgInBjYXBfZGF0YWxpbmsuM3BjYXAiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcF9kYXRhbGluay4zcGNhcCIgOzsKKyAgICAicGNhcF9kdW1wX29wZW4uM3BjYXAiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcF9kdW1wX29wZW4uM3BjYXAiIDs7CisgICAgInBjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcF9saXN0X2RhdGFsaW5rcy4zcGNhcCIgOzsKKyAgICAicGNhcF9saXN0X3RzdGFtcF90eXBlcy4zcGNhcCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwIiA7OworICAgICJwY2FwX29wZW5fZGVhZC4zcGNhcCIpIENPTkZJR19GSUxFUz0iJENPTkZJR19GSUxFUyBwY2FwX29wZW5fZGVhZC4zcGNhcCIgOzsKKyAgICAicGNhcF9vcGVuX29mZmxpbmUuM3BjYXAiKSBDT05GSUdfRklMRVM9IiRDT05GSUdfRklMRVMgcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAiIDs7CisgICAgInBjYXBfc2V0X3RzdGFtcF90eXBlLjNwY2FwIikgQ09ORklHX0ZJTEVTPSIkQ09ORklHX0ZJTEVTIHBjYXBfc2V0X3RzdGFtcF90eXBlLjNwY2FwIiA7OworCisgICopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIGFyZ3VtZW50OiBcYCRhY19jb25maWdfdGFyZ2V0JyIgIiRMSU5FTk8iIDUgOzsKKyAgZXNhYworZG9uZQorCisKKyMgSWYgdGhlIHVzZXIgZGlkIG5vdCB1c2UgdGhlIGFyZ3VtZW50cyB0byBzcGVjaWZ5IHRoZSBpdGVtcyB0byBpbnN0YW50aWF0ZSwKKyMgdGhlbiB0aGUgZW52dmFyIGludGVyZmFjZSBpcyB1c2VkLiAgU2V0IG9ubHkgdGhvc2UgdGhhdCBhcmUgbm90LgorIyBXZSB1c2UgdGhlIGxvbmcgZm9ybSBmb3IgdGhlIGRlZmF1bHQgYXNzaWdubWVudCBiZWNhdXNlIG9mIGFuIGV4dHJlbWVseQorIyBiaXphcnJlIGJ1ZyBvbiBTdW5PUyA0LjEuMy4KK2lmICRhY19uZWVkX2RlZmF1bHRzOyB0aGVuCisgIHRlc3QgIiR7Q09ORklHX0ZJTEVTK3NldH0iID0gc2V0IHx8IENPTkZJR19GSUxFUz0kY29uZmlnX2ZpbGVzCisgIHRlc3QgIiR7Q09ORklHX0hFQURFUlMrc2V0fSIgPSBzZXQgfHwgQ09ORklHX0hFQURFUlM9JGNvbmZpZ19oZWFkZXJzCitmaQorCisjIEhhdmUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjb252ZW5pZW5jZS4gIE1ha2UgaXQgaW4gdGhlIGJ1aWxkIHRyZWUKKyMgc2ltcGx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIGFnYWluc3QgaGF2aW5nIGl0IGhlcmUsIGFuZCBpbiBhZGRpdGlvbiwKKyMgY3JlYXRpbmcgYW5kIG1vdmluZyBmaWxlcyBmcm9tIC90bXAgY2FuIHNvbWV0aW1lcyBjYXVzZSBwcm9ibGVtcy4KKyMgSG9vayBmb3IgaXRzIHJlbW92YWwgdW5sZXNzIGRlYnVnZ2luZy4KKyMgTm90ZSB0aGF0IHRoZXJlIGlzIGEgc21hbGwgd2luZG93IGluIHdoaWNoIHRoZSBkaXJlY3Rvcnkgd2lsbCBub3QgYmUgY2xlYW5lZDoKKyMgYWZ0ZXIgaXRzIGNyZWF0aW9uIGJ1dCBiZWZvcmUgaXRzIG5hbWUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYCR0bXAnLgorJGRlYnVnIHx8Cit7CisgIHRtcD0KKyAgdHJhcCAnZXhpdF9zdGF0dXM9JD8KKyAgeyB0ZXN0IC16ICIkdG1wIiB8fCB0ZXN0ICEgLWQgIiR0bXAiIHx8IHJtIC1mciAiJHRtcCI7IH0gJiYgZXhpdCAkZXhpdF9zdGF0dXMKKycgMAorICB0cmFwICdhc19mbl9leGl0IDEnIDEgMiAxMyAxNQorfQorIyBDcmVhdGUgYSAoc2VjdXJlKSB0bXAgZGlyZWN0b3J5IGZvciB0bXAgZmlsZXMuCisKK3sKKyAgdG1wPWAodW1hc2sgMDc3ICYmIG1rdGVtcCAtZCAiLi9jb25mWFhYWFhYIikgMj4vZGV2L251bGxgICYmCisgIHRlc3QgLW4gIiR0bXAiICYmIHRlc3QgLWQgIiR0bXAiCit9ICB8fAoreworICB0bXA9Li9jb25mJCQtJFJBTkRPTQorICAodW1hc2sgMDc3ICYmIG1rZGlyICIkdG1wIikKK30gfHwgYXNfZm5fZXJyb3IgJD8gImNhbm5vdCBjcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGluIC4iICIkTElORU5PIiA1CisKKyMgU2V0IHVwIHRoZSBzY3JpcHRzIGZvciBDT05GSUdfRklMRVMgc2VjdGlvbi4KKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfRklMRVMuCisjIFRoaXMgaGFwcGVucyBmb3IgaW5zdGFuY2Ugd2l0aCBgLi9jb25maWcuc3RhdHVzIGNvbmZpZy5oJy4KK2lmIHRlc3QgLW4gIiRDT05GSUdfRklMRVMiOyB0aGVuCisKKworYWNfY3I9YGVjaG8gWCB8IHRyIFggJ1wwMTUnYAorIyBPbiBjeWd3aW4sIGJhc2ggY2FuIGVhdCBcciBpbnNpZGUgYGAgaWYgdGhlIHVzZXIgcmVxdWVzdGVkIGlnbmNyLgorIyBCdXQgd2Uga25vdyBvZiBubyBvdGhlciBzaGVsbCB3aGVyZSBhY19jciB3b3VsZCBiZSBlbXB0eSBhdCB0aGlzCisjIHBvaW50LCBzbyB3ZSBjYW4gdXNlIGEgYmFzaGlzbSBhcyBhIGZhbGxiYWNrLgoraWYgdGVzdCAieCRhY19jciIgPSB4OyB0aGVuCisgIGV2YWwgYWNfY3I9XCRcJ1xcclwnCitmaQorYWNfY3NfYXdrX2NyPWAkQVdLICdCRUdJTiB7IHByaW50ICJhXHJiIiB9JyA8L2Rldi9udWxsIDI+L2Rldi9udWxsYAoraWYgdGVzdCAiJGFjX2NzX2F3a19jciIgPSAiYSR7YWNfY3J9YiI7IHRoZW4KKyAgYWNfY3NfYXdrX2NyPSdcXHInCitlbHNlCisgIGFjX2NzX2F3a19jcj0kYWNfY3IKK2ZpCisKK2VjaG8gJ0JFR0lOIHsnID4iJHRtcC9zdWJzMS5hd2siICYmCitfQUNFT0YKKworCit7CisgIGVjaG8gImNhdCA+Y29uZiQkc3Vicy5hd2sgPDxfQUNFT0YiICYmCisgIGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IHNlZCAncy8uKi8mISQmJGFjX2RlbGltLycgJiYKKyAgZWNobyAiX0FDRU9GIgorfSA+Y29uZiQkc3Vicy5zaCB8fAorICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19TVEFUVVMiICIkTElORU5PIiA1CithY19kZWxpbV9udW09YGVjaG8gIiRhY19zdWJzdF92YXJzIiB8IGdyZXAgLWMgJ14nYAorYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSBmYWxzZSA6OyBkbworICAuIC4vY29uZiQkc3Vicy5zaCB8fAorICAgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgbWFrZSAkQ09ORklHX1NUQVRVUyIgIiRMSU5FTk8iIDUKKworICBhY19kZWxpbV9uPWBzZWQgLW4gInMvLiokYWNfZGVsaW1cJC9YL3AiIGNvbmYkJHN1YnMuYXdrIHwgZ3JlcCAtYyBYYAorICBpZiB0ZXN0ICRhY19kZWxpbV9uID0gJGFjX2RlbGltX251bTsgdGhlbgorICAgIGJyZWFrCisgIGVsaWYgJGFjX2xhc3RfdHJ5OyB0aGVuCisgICAgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBtYWtlICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKK3JtIC1mIGNvbmYkJHN1YnMuc2gKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCitjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PFxcX0FDQVdLICYmCitfQUNFT0YKK3NlZCAtbiAnCitoCitzL14vU1siLzsgcy8hLiovIl09LworcAorZworcy9eW14hXSohLy8KKzpyZXBsCit0IHJlcGwKK3MvJyIkYWNfZGVsaW0iJyQvLwordCBkZWxpbQorOm5sCitoCitzL1woLlx7MTQ4XH1cKS4uKi9cMS8KK3QgbW9yZTEKK3MvWyJcXF0vXFwmL2c7IHMvXi8iLzsgcy8kL1xcbiJcXC8KK3AKK24KK2IgcmVwbAorOm1vcmUxCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCitwCitnCitzLy5cezE0OFx9Ly8KK3QgbmwKKzpkZWxpbQoraAorcy9cKC5cezE0OFx9XCkuLiovXDEvCit0IG1vcmUyCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iLworcAorYgorOm1vcmUyCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iXFwvCitwCitnCitzLy5cezE0OFx9Ly8KK3QgZGVsaW0KKycgPGNvbmYkJHN1YnMuYXdrIHwgc2VkICcKKy9eW14iIl0veworICBOCisgIHMvXG4vLworfQorJyA+PiRDT05GSUdfU1RBVFVTIHx8IGFjX3dyaXRlX2ZhaWw9MQorcm0gLWYgY29uZiQkc3Vicy5hd2sKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorX0FDQVdLCitjYXQgPj4iXCR0bXAvc3ViczEuYXdrIiA8PF9BQ0FXSyAmJgorICBmb3IgKGtleSBpbiBTKSBTX2lzX3NldFtrZXldID0gMQorICBGUyA9ICIHIgorCit9Cit7CisgIGxpbmUgPSAkIDAKKyAgbmZpZWxkcyA9IHNwbGl0KGxpbmUsIGZpZWxkLCAiQCIpCisgIHN1YnN0ZWQgPSAwCisgIGxlbiA9IGxlbmd0aChmaWVsZFsxXSkKKyAgZm9yIChpID0gMjsgaSA8IG5maWVsZHM7IGkrKykgeworICAgIGtleSA9IGZpZWxkW2ldCisgICAga2V5bGVuID0gbGVuZ3RoKGtleSkKKyAgICBpZiAoU19pc19zZXRba2V5XSkgeworICAgICAgdmFsdWUgPSBTW2tleV0KKyAgICAgIGxpbmUgPSBzdWJzdHIobGluZSwgMSwgbGVuKSAiIiB2YWx1ZSAiIiBzdWJzdHIobGluZSwgbGVuICsga2V5bGVuICsgMykKKyAgICAgIGxlbiArPSBsZW5ndGgodmFsdWUpICsgbGVuZ3RoKGZpZWxkWysraV0pCisgICAgICBzdWJzdGVkID0gMQorICAgIH0gZWxzZQorICAgICAgbGVuICs9IDEgKyBrZXlsZW4KKyAgfQorCisgIHByaW50IGxpbmUKK30KKworX0FDQVdLCitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8XF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2lmIHNlZCAicy8kYWNfY3IvLyIgPCAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbgorICBzZWQgInMvJGFjX2NyXCQvLzsgcy8kYWNfY3IvJGFjX2NzX2F3a19jci9nIgorZWxzZQorICBjYXQKK2ZpIDwgIiR0bXAvc3ViczEuYXdrIiA+ICIkdG1wL3N1YnMuYXdrIiBcCisgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGZpbGVzIG1hY2hpbmVyeSIgIiRMSU5FTk8iIDUKK19BQ0VPRgorCisjIFZQQVRIIG1heSBjYXVzZSB0cm91YmxlIHdpdGggc29tZSBtYWtlcywgc28gd2UgcmVtb3ZlIHNvbGUgJChzcmNkaXIpLAorIyAke3NyY2Rpcn0gYW5kIEBzcmNkaXJAIGVudHJpZXMgZnJvbSBWUEFUSCBpZiBzcmNkaXIgaXMgIi4iLCBzdHJpcCBsZWFkaW5nIGFuZAorIyB0cmFpbGluZyBjb2xvbnMgYW5kIHRoZW4gcmVtb3ZlIHRoZSB3aG9sZSBsaW5lIGlmIFZQQVRIIGJlY29tZXMgZW1wdHkKKyMgKGFjdHVhbGx5IHdlIGxlYXZlIGFuIGVtcHR5IGxpbmUgdG8gcHJlc2VydmUgbGluZSBudW1iZXJzKS4KK2lmIHRlc3QgIngkc3JjZGlyIiA9IHguOyB0aGVuCisgIGFjX3Zwc3ViPScvXlsJIF0qVlBBVEhbCSBdKj1bCSBdKi97CitoCitzLy8vCitzL14vOi8KK3MvWwkgXSokLzovCitzLzpcJChzcmNkaXIpOi86L2cKK3MvOlwke3NyY2Rpcn06LzovZworcy86QHNyY2RpckA6LzovZworcy9eOiovLworcy86KiQvLworeAorcy9cKD1bCSBdKlwpLiovXDEvCitHCitzL1xuLy8KK3MvXltePV0qPVsJIF0qJC8vCit9JworZmkKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0ZJTEVTIgorCisjIFNldCB1cCB0aGUgc2NyaXB0cyBmb3IgQ09ORklHX0hFQURFUlMgc2VjdGlvbi4KKyMgTm8gbmVlZCB0byBnZW5lcmF0ZSB0aGVtIGlmIHRoZXJlIGFyZSBubyBDT05GSUdfSEVBREVSUy4KKyMgVGhpcyBoYXBwZW5zIGZvciBpbnN0YW5jZSB3aXRoIGAuL2NvbmZpZy5zdGF0dXMgTWFrZWZpbGUnLgoraWYgdGVzdCAtbiAiJENPTkZJR19IRUFERVJTIjsgdGhlbgorY2F0ID4iJHRtcC9kZWZpbmVzLmF3ayIgPDxcX0FDQVdLIHx8CitCRUdJTiB7CitfQUNFT0YKKworIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIGFuIGF3ayBzY3JpcHQgYGRlZmluZXMuYXdrJywgZW1iZWRkZWQgYXMKKyMgaGVyZS1kb2N1bWVudCBpbiBjb25maWcuc3RhdHVzLCB0aGF0IHN1YnN0aXR1dGVzIHRoZSBwcm9wZXIgdmFsdWVzIGludG8KKyMgY29uZmlnLmguaW4gdG8gcHJvZHVjZSBjb25maWcuaC4KKworIyBDcmVhdGUgYSBkZWxpbWl0ZXIgc3RyaW5nIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gY29uZmRlZnMuaCwgdG8gZWFzZQorIyBoYW5kbGluZyBvZiBsb25nIGxpbmVzLgorYWNfZGVsaW09JyUhXyEjICcKK2ZvciBhY19sYXN0X3RyeSBpbiBmYWxzZSBmYWxzZSA6OyBkbworICBhY190PWBzZWQgLW4gIi8kYWNfZGVsaW0vcCIgY29uZmRlZnMuaGAKKyAgaWYgdGVzdCAteiAiJGFjX3QiOyB0aGVuCisgICAgYnJlYWsKKyAgZWxpZiAkYWNfbGFzdF90cnk7IHRoZW4KKyAgICBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IG1ha2UgJENPTkZJR19IRUFERVJTIiAiJExJTkVOTyIgNQorICBlbHNlCisgICAgYWNfZGVsaW09IiRhY19kZWxpbSEkYWNfZGVsaW0gXyRhY19kZWxpbSEhICIKKyAgZmkKK2RvbmUKKworIyBGb3IgdGhlIGF3ayBzY3JpcHQsIEQgaXMgYW4gYXJyYXkgb2YgbWFjcm8gdmFsdWVzIGtleWVkIGJ5IG5hbWUsCisjIGxpa2V3aXNlIFAgY29udGFpbnMgbWFjcm8gcGFyYW1ldGVycyBpZiBhbnkuICBQcmVzZXJ2ZSBiYWNrc2xhc2gKKyMgbmV3bGluZSBzZXF1ZW5jZXMuCisKK2FjX3dvcmRfcmU9W18kYXNfY3JfTGV0dGVyc11bXyRhc19jcl9hbG51bV0qCitzZWQgLW4gJworcy8uXHsxNDhcfS8mJyIkYWNfZGVsaW0iJy9nCit0IHJzZXQKKzpyc2V0CitzL15bCSBdKiNbCSBdKmRlZmluZVsJIF1bCSBdKi8gLwordCBkZWYKK2QKKzpkZWYKK3MvXFwkLy8KK3QgYnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDMiL3AKK3MvXiBcKCciJGFjX3dvcmRfcmUiJ1wpWwkgXSpcKC4qXCkvRFsiXDEiXT0iIFwyIi9wCitkCis6YnNubAorcy9bIlxcXS9cXCYvZworcy9eIFwoJyIkYWNfd29yZF9yZSInXClcKChbXigpXSopXClbCSBdKlwoLipcKS9QWyJcMSJdPSJcMiJcCitEWyJcMSJdPSIgXDNcXFxcXFxuIlxcL3AKK3QgY29udAorcy9eIFwoJyIkYWNfd29yZF9yZSInXClbCSBdKlwoLipcKS9EWyJcMSJdPSIgXDJcXFxcXFxuIlxcL3AKK3QgY29udAorZAorOmNvbnQKK24KK3MvLlx7MTQ4XH0vJiciJGFjX2RlbGltIicvZwordCBjbGVhcgorOmNsZWFyCitzL1xcJC8vCit0IGJzbmxjCitzL1siXFxdL1xcJi9nOyBzL14vIi87IHMvJC8iL3AKK2QKKzpic25sYworcy9bIlxcXS9cXCYvZzsgcy9eLyIvOyBzLyQvXFxcXFxcbiJcXC9wCitiIGNvbnQKKycgPGNvbmZkZWZzLmggfCBzZWQgJworcy8nIiRhY19kZWxpbSInLyJcXFwKKyIvZycgPj4kQ09ORklHX1NUQVRVUyB8fCBhY193cml0ZV9mYWlsPTEKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGZvciAoa2V5IGluIEQpIERfaXNfc2V0W2tleV0gPSAxCisgIEZTID0gIgciCit9CisvXltcdCBdKiNbXHQgXSooZGVmaW5lfHVuZGVmKVtcdCBdKyRhY193b3JkX3JlKFtcdCAoXXxcJCkvIHsKKyAgbGluZSA9IFwkIDAKKyAgc3BsaXQobGluZSwgYXJnLCAiICIpCisgIGlmIChhcmdbMV0gPT0gIiMiKSB7CisgICAgZGVmdW5kZWYgPSBhcmdbMl0KKyAgICBtYWMxID0gYXJnWzNdCisgIH0gZWxzZSB7CisgICAgZGVmdW5kZWYgPSBzdWJzdHIoYXJnWzFdLCAyKQorICAgIG1hYzEgPSBhcmdbMl0KKyAgfQorICBzcGxpdChtYWMxLCBtYWMyLCAiKCIpICMpCisgIG1hY3JvID0gbWFjMlsxXQorICBwcmVmaXggPSBzdWJzdHIobGluZSwgMSwgaW5kZXgobGluZSwgZGVmdW5kZWYpIC0gMSkKKyAgaWYgKERfaXNfc2V0W21hY3JvXSkgeworICAgICMgUHJlc2VydmUgdGhlIHdoaXRlIHNwYWNlIHN1cnJvdW5kaW5nIHRoZSAiIyIuCisgICAgcHJpbnQgcHJlZml4ICJkZWZpbmUiLCBtYWNybyBQW21hY3JvXSBEW21hY3JvXQorICAgIG5leHQKKyAgfSBlbHNlIHsKKyAgICAjIFJlcGxhY2UgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yIGV4YW1wbGUsCisgICAgIyBpbiB0aGUgY2FzZSBvZiBfUE9TSVhfU09VUkNFLCB3aGljaCBpcyBwcmVkZWZpbmVkIGFuZCByZXF1aXJlZAorICAgICMgb24gc29tZSBzeXN0ZW1zIHdoZXJlIGNvbmZpZ3VyZSB3aWxsIG5vdCBkZWNpZGUgdG8gZGVmaW5lIGl0LgorICAgIGlmIChkZWZ1bmRlZiA9PSAidW5kZWYiKSB7CisgICAgICBwcmludCAiLyoiLCBwcmVmaXggZGVmdW5kZWYsIG1hY3JvLCAiKi8iCisgICAgICBuZXh0CisgICAgfQorICB9Cit9Cit7IHByaW50IH0KK19BQ0FXSworX0FDRU9GCitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PFxfQUNFT0YgfHwgYWNfd3JpdGVfZmFpbD0xCisgIGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3Qgc2V0dXAgY29uZmlnIGhlYWRlcnMgbWFjaGluZXJ5IiAiJExJTkVOTyIgNQorZmkgIyB0ZXN0IC1uICIkQ09ORklHX0hFQURFUlMiCisKKworZXZhbCBzZXQgWCAiICA6RiAkQ09ORklHX0ZJTEVTICA6SCAkQ09ORklHX0hFQURFUlMgICAgIgorc2hpZnQKK2ZvciBhY190YWcKK2RvCisgIGNhc2UgJGFjX3RhZyBpbgorICA6W0ZITENdKSBhY19tb2RlPSRhY190YWc7IGNvbnRpbnVlOzsKKyAgZXNhYworICBjYXNlICRhY19tb2RlJGFjX3RhZyBpbgorICA6W0ZITF0qOiopOzsKKyAgOkwqIHwgOkMqOiopIGFzX2ZuX2Vycm9yICQ/ICJpbnZhbGlkIHRhZyBcYCRhY190YWcnIiAiJExJTkVOTyIgNSA7OworICA6W0ZIXS0pIGFjX3RhZz0tOi07OworICA6W0ZIXSopIGFjX3RhZz0kYWNfdGFnOiRhY190YWcuaW47OworICBlc2FjCisgIGFjX3NhdmVfSUZTPSRJRlMKKyAgSUZTPToKKyAgc2V0IHggJGFjX3RhZworICBJRlM9JGFjX3NhdmVfSUZTCisgIHNoaWZ0CisgIGFjX2ZpbGU9JDEKKyAgc2hpZnQKKworICBjYXNlICRhY19tb2RlIGluCisgIDpMKSBhY19zb3VyY2U9JDE7OworICA6W0ZIXSkKKyAgICBhY19maWxlX2lucHV0cz0KKyAgICBmb3IgYWNfZgorICAgIGRvCisgICAgICBjYXNlICRhY19mIGluCisgICAgICAtKSBhY19mPSIkdG1wL3N0ZGluIjs7CisgICAgICAqKSAjIExvb2sgZm9yIHRoZSBmaWxlIGZpcnN0IGluIHRoZSBidWlsZCB0cmVlLCB0aGVuIGluIHRoZSBzb3VyY2UgdHJlZQorCSAjIChpZiB0aGUgcGF0aCBpcyBub3QgYWJzb2x1dGUpLiAgVGhlIGFic29sdXRlIHBhdGggY2Fubm90IGJlIERPUy1zdHlsZSwKKwkgIyBiZWNhdXNlICRhY19mIGNhbm5vdCBjb250YWluIGA6Jy4KKwkgdGVzdCAtZiAiJGFjX2YiIHx8CisJICAgY2FzZSAkYWNfZiBpbgorCSAgIFtcXC8kXSopIGZhbHNlOzsKKwkgICAqKSB0ZXN0IC1mICIkc3JjZGlyLyRhY19mIiAmJiBhY19mPSIkc3JjZGlyLyRhY19mIjs7CisJICAgZXNhYyB8fAorCSAgIGFzX2ZuX2Vycm9yIDEgImNhbm5vdCBmaW5kIGlucHV0IGZpbGU6IFxgJGFjX2YnIiAiJExJTkVOTyIgNSA7OworICAgICAgZXNhYworICAgICAgY2FzZSAkYWNfZiBpbiAqXCcqKSBhY19mPWAkYXNfZWNobyAiJGFjX2YiIHwgc2VkICJzLycvJ1xcXFxcXFxcJycvZyJgOzsgZXNhYworICAgICAgYXNfZm5fYXBwZW5kIGFjX2ZpbGVfaW5wdXRzICIgJyRhY19mJyIKKyAgICBkb25lCisKKyAgICAjIExldCdzIHN0aWxsIHByZXRlbmQgaXQgaXMgYGNvbmZpZ3VyZScgd2hpY2ggaW5zdGFudGlhdGVzIChpLmUuLCBkb24ndAorICAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKKyAgICAjICAgIC8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZy5zdGF0dXMuICAqLworICAgIGNvbmZpZ3VyZV9pbnB1dD0nR2VuZXJhdGVkIGZyb20gJ2AKKwkgICRhc19lY2hvICIkKiIgfCBzZWQgJ3N8XlteOl0qL3x8O3N8OlteOl0qL3wsIHxnJworCWAnIGJ5IGNvbmZpZ3VyZS4nCisgICAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgICAgY29uZmlndXJlX2lucHV0PSIkYWNfZmlsZS4gICRjb25maWd1cmVfaW5wdXQiCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IGNyZWF0aW5nICRhY19maWxlIiA+JjUKKyRhc19lY2hvICIkYXNfbWU6IGNyZWF0aW5nICRhY19maWxlIiA+JjY7fQorICAgIGZpCisgICAgIyBOZXV0cmFsaXplIHNwZWNpYWwgY2hhcmFjdGVycyBpbnRlcnByZXRlZCBieSBzZWQgaW4gcmVwbGFjZW1lbnQgc3RyaW5ncy4KKyAgICBjYXNlICRjb25maWd1cmVfaW5wdXQgaW4gIygKKyAgICAqXCYqIHwgKlx8KiB8ICpcXCogKQorICAgICAgIGFjX3NlZF9jb25mX2lucHV0PWAkYXNfZWNobyAiJGNvbmZpZ3VyZV9pbnB1dCIgfAorICAgICAgIHNlZCAncy9bXFxcXCZ8XS9cXFxcJi9nJ2A7OyAjKAorICAgICopIGFjX3NlZF9jb25mX2lucHV0PSRjb25maWd1cmVfaW5wdXQ7OworICAgIGVzYWMKKworICAgIGNhc2UgJGFjX3RhZyBpbgorICAgICo6LToqIHwgKjotKSBjYXQgPiIkdG1wL3N0ZGluIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAkYWNfZmlsZSIgIiRMSU5FTk8iIDUgIDs7CisgICAgZXNhYworICAgIDs7CisgIGVzYWMKKworICBhY19kaXI9YCRhc19kaXJuYW1lIC0tICIkYWNfZmlsZSIgfHwKKyRhc19leHByIFgiJGFjX2ZpbGUiIDogJ1hcKC4qW14vXVwpLy8qW14vXVteL10qLyokJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXClbXi9dJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC8vXCkkJyBcfCBcCisJIFgiJGFjX2ZpbGUiIDogJ1hcKC9cKScgXHwgLiAyPi9kZXYvbnVsbCB8fAorJGFzX2VjaG8gWCIkYWNfZmlsZSIgfAorICAgIHNlZCAnL15YXCguKlteL11cKVwvXC8qW14vXVteL10qXC8qJC97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKVteL10uKi97CisJICAgIHMvL1wxLworCSAgICBxCisJICB9CisJICAvXlhcKFwvXC9cKSQveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgL15YXChcL1wpLioveworCSAgICBzLy9cMS8KKwkgICAgcQorCSAgfQorCSAgcy8uKi8uLzsgcSdgCisgIGFzX2Rpcj0iJGFjX2RpciI7IGFzX2ZuX21rZGlyX3AKKyAgYWNfYnVpbGRkaXI9LgorCitjYXNlICIkYWNfZGlyIiBpbgorLikgYWNfZGlyX3N1ZmZpeD0gYWNfdG9wX2J1aWxkZGlyX3N1Yj0uIGFjX3RvcF9idWlsZF9wcmVmaXg9IDs7CisqKQorICBhY19kaXJfc3VmZml4PS9gJGFzX2VjaG8gIiRhY19kaXIiIHwgc2VkICdzfF5cLltcXC9dfHwnYAorICAjIEEgIi4uIiBmb3IgZWFjaCBkaXJlY3RvcnkgaW4gJGFjX2Rpcl9zdWZmaXguCisgIGFjX3RvcF9idWlsZGRpcl9zdWI9YCRhc19lY2hvICIkYWNfZGlyX3N1ZmZpeCIgfCBzZWQgJ3N8L1teXFwvXSp8Ly4ufGc7c3wvfHwnYAorICBjYXNlICRhY190b3BfYnVpbGRkaXJfc3ViIGluCisgICIiKSBhY190b3BfYnVpbGRkaXJfc3ViPS4gYWNfdG9wX2J1aWxkX3ByZWZpeD0gOzsKKyAgKikgIGFjX3RvcF9idWlsZF9wcmVmaXg9JGFjX3RvcF9idWlsZGRpcl9zdWIvIDs7CisgIGVzYWMgOzsKK2VzYWMKK2FjX2Fic190b3BfYnVpbGRkaXI9JGFjX3B3ZAorYWNfYWJzX2J1aWxkZGlyPSRhY19wd2QkYWNfZGlyX3N1ZmZpeAorIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKK2FjX3RvcF9idWlsZGRpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeAorCitjYXNlICRzcmNkaXIgaW4KKyAgLikgICMgV2UgYXJlIGJ1aWxkaW5nIGluIHBsYWNlLgorICAgIGFjX3NyY2Rpcj0uCisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkZGlyX3N1YgorICAgIGFjX2Fic190b3Bfc3JjZGlyPSRhY19wd2QgOzsKKyAgW1xcL10qIHwgPzpbXFwvXSogKSAgIyBBYnNvbHV0ZSBuYW1lLgorICAgIGFjX3NyY2Rpcj0kc3JjZGlyJGFjX2Rpcl9zdWZmaXg7CisgICAgYWNfdG9wX3NyY2Rpcj0kc3JjZGlyCisgICAgYWNfYWJzX3RvcF9zcmNkaXI9JHNyY2RpciA7OworICAqKSAjIFJlbGF0aXZlIG5hbWUuCisgICAgYWNfc3JjZGlyPSRhY190b3BfYnVpbGRfcHJlZml4JHNyY2RpciRhY19kaXJfc3VmZml4CisgICAgYWNfdG9wX3NyY2Rpcj0kYWNfdG9wX2J1aWxkX3ByZWZpeCRzcmNkaXIKKyAgICBhY19hYnNfdG9wX3NyY2Rpcj0kYWNfcHdkLyRzcmNkaXIgOzsKK2VzYWMKK2FjX2Fic19zcmNkaXI9JGFjX2Fic190b3Bfc3JjZGlyJGFjX2Rpcl9zdWZmaXgKKworCisgIGNhc2UgJGFjX21vZGUgaW4KKyAgOkYpCisgICMKKyAgIyBDT05GSUdfRklMRQorICAjCisKKyAgY2FzZSAkSU5TVEFMTCBpbgorICBbXFwvJF0qIHwgPzpbXFwvXSogKSBhY19JTlNUQUxMPSRJTlNUQUxMIDs7CisgICopIGFjX0lOU1RBTEw9JGFjX3RvcF9idWlsZF9wcmVmaXgkSU5TVEFMTCA7OworICBlc2FjCitfQUNFT0YKKworY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorIyBJZiB0aGUgdGVtcGxhdGUgZG9lcyBub3Qga25vdyBhYm91dCBkYXRhcm9vdGRpciwgZXhwYW5kIGl0LgorIyBGSVhNRTogVGhpcyBoYWNrIHNob3VsZCBiZSByZW1vdmVkIGEgZmV3IHllYXJzIGFmdGVyIDIuNjAuCithY19kYXRhcm9vdGRpcl9oYWNrPTsgYWNfZGF0YXJvb3RkaXJfc2Vlbj0KK2FjX3NlZF9kYXRhcm9vdD0nCisvZGF0YXJvb3RkaXIvIHsKKyAgcAorICBxCit9CisvQGRhdGFkaXJAL3AKKy9AZG9jZGlyQC9wCisvQGluZm9kaXJAL3AKKy9AbG9jYWxlZGlyQC9wCisvQG1hbmRpckAvcCcKK2Nhc2UgYGV2YWwgInNlZCAtbiBcIlwkYWNfc2VkX2RhdGFyb290XCIgJGFjX2ZpbGVfaW5wdXRzImAgaW4KKypkYXRhcm9vdGRpciopIGFjX2RhdGFyb290ZGlyX3NlZW49eWVzOzsKKypAZGF0YWRpckAqfCpAZG9jZGlyQCp8KkBpbmZvZGlyQCp8KkBsb2NhbGVkaXJAKnwqQG1hbmRpckAqKQorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6ICRhY19maWxlX2lucHV0cyBzZWVtcyB0byBpZ25vcmUgdGhlIC0tZGF0YXJvb3RkaXIgc2V0dGluZyIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZV9pbnB1dHMgc2VlbXMgdG8gaWdub3JlIHRoZSAtLWRhdGFyb290ZGlyIHNldHRpbmciID4mMjt9CitfQUNFT0YKK2NhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorICBhY19kYXRhcm9vdGRpcl9oYWNrPScKKyAgcyZAZGF0YWRpckAmJGRhdGFkaXImZworICBzJkBkb2NkaXJAJiRkb2NkaXImZworICBzJkBpbmZvZGlyQCYkaW5mb2RpciZnCisgIHMmQGxvY2FsZWRpckAmJGxvY2FsZWRpciZnCisgIHMmQG1hbmRpckAmJG1hbmRpciZnCisgIHMmXFxcJHtkYXRhcm9vdGRpcn0mJGRhdGFyb290ZGlyJmcnIDs7Citlc2FjCitfQUNFT0YKKworIyBOZXV0cmFsaXplIFZQQVRIIHdoZW4gYCRzcmNkaXInID0gYC4nLgorIyBTaGVsbCBjb2RlIGluIGNvbmZpZ3VyZS5hYyBtaWdodCBzZXQgZXh0cmFzdWIuCisjIEZJWE1FOiBkbyB3ZSByZWFsbHkgd2FudCB0byBtYWludGFpbiB0aGlzIGZlYXR1cmU/CitjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRiB8fCBhY193cml0ZV9mYWlsPTEKK2FjX3NlZF9leHRyYT0iJGFjX3Zwc3ViCiskZXh0cmFzdWIKK19BQ0VPRgorY2F0ID4+JENPTkZJR19TVEFUVVMgPDxcX0FDRU9GIHx8IGFjX3dyaXRlX2ZhaWw9MQorOnQKKy9AW2EtekEtWl9dW2EtekEtWl8wLTldKkAvIWIKK3N8QGNvbmZpZ3VyZV9pbnB1dEB8JGFjX3NlZF9jb25mX2lucHV0fDt0IHQKK3MmQHRvcF9idWlsZGRpckAmJGFjX3RvcF9idWlsZGRpcl9zdWImO3QgdAorcyZAdG9wX2J1aWxkX3ByZWZpeEAmJGFjX3RvcF9idWlsZF9wcmVmaXgmO3QgdAorcyZAc3JjZGlyQCYkYWNfc3JjZGlyJjt0IHQKK3MmQGFic19zcmNkaXJAJiRhY19hYnNfc3JjZGlyJjt0IHQKK3MmQHRvcF9zcmNkaXJAJiRhY190b3Bfc3JjZGlyJjt0IHQKK3MmQGFic190b3Bfc3JjZGlyQCYkYWNfYWJzX3RvcF9zcmNkaXImO3QgdAorcyZAYnVpbGRkaXJAJiRhY19idWlsZGRpciY7dCB0CitzJkBhYnNfYnVpbGRkaXJAJiRhY19hYnNfYnVpbGRkaXImO3QgdAorcyZAYWJzX3RvcF9idWlsZGRpckAmJGFjX2Fic190b3BfYnVpbGRkaXImO3QgdAorcyZASU5TVEFMTEAmJGFjX0lOU1RBTEwmO3QgdAorJGFjX2RhdGFyb290ZGlyX2hhY2sKKyIKK2V2YWwgc2VkIFwiXCRhY19zZWRfZXh0cmFcIiAiJGFjX2ZpbGVfaW5wdXRzIiB8ICRBV0sgLWYgIiR0bXAvc3Vicy5hd2siID4kdG1wL291dCBcCisgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorCit0ZXN0IC16ICIkYWNfZGF0YXJvb3RkaXJfaGFjayRhY19kYXRhcm9vdGRpcl9zZWVuIiAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXCR7ZGF0YXJvb3RkaXJ9L3AnICIkdG1wL291dCJgOyB0ZXN0IC1uICIkYWNfb3V0IjsgfSAmJgorICB7IGFjX291dD1gc2VkIC1uICcvXlsJIF0qZGF0YXJvb3RkaXJbCSBdKjoqPS9wJyAiJHRtcC9vdXQiYDsgdGVzdCAteiAiJGFjX291dCI7IH0gJiYKKyAgeyAkYXNfZWNobyAiJGFzX21lOiR7YXNfbGluZW5vLSRMSU5FTk99OiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKK3doaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZCIgPiYyO30KKworICBybSAtZiAiJHRtcC9zdGRpbiIKKyAgY2FzZSAkYWNfZmlsZSBpbgorICAtKSBjYXQgIiR0bXAvb3V0IiAmJiBybSAtZiAiJHRtcC9vdXQiOzsKKyAgKikgcm0gLWYgIiRhY19maWxlIiAmJiBtdiAiJHRtcC9vdXQiICIkYWNfZmlsZSI7OworICBlc2FjIFwKKyAgfHwgYXNfZm5fZXJyb3IgJD8gImNvdWxkIG5vdCBjcmVhdGUgJGFjX2ZpbGUiICIkTElORU5PIiA1CisgOzsKKyAgOkgpCisgICMKKyAgIyBDT05GSUdfSEVBREVSCisgICMKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsKKyAgICAgICRhc19lY2hvICIvKiAkY29uZmlndXJlX2lucHV0ICAqLyIgXAorICAgICAgJiYgZXZhbCAnJEFXSyAtZiAiJHRtcC9kZWZpbmVzLmF3ayInICIkYWNfZmlsZV9pbnB1dHMiCisgICAgfSA+IiR0bXAvY29uZmlnLmgiIFwKKyAgICAgIHx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGlmIGRpZmYgIiRhY19maWxlIiAiJHRtcC9jb25maWcuaCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306ICRhY19maWxlIGlzIHVuY2hhbmdlZCIgPiY1CiskYXNfZWNobyAiJGFzX21lOiAkYWNfZmlsZSBpcyB1bmNoYW5nZWQiID4mNjt9CisgICAgZWxzZQorICAgICAgcm0gLWYgIiRhY19maWxlIgorICAgICAgbXYgIiR0bXAvY29uZmlnLmgiICIkYWNfZmlsZSIgXAorCXx8IGFzX2ZuX2Vycm9yICQ/ICJjb3VsZCBub3QgY3JlYXRlICRhY19maWxlIiAiJExJTkVOTyIgNQorICAgIGZpCisgIGVsc2UKKyAgICAkYXNfZWNobyAiLyogJGNvbmZpZ3VyZV9pbnB1dCAgKi8iIFwKKyAgICAgICYmIGV2YWwgJyRBV0sgLWYgIiR0bXAvZGVmaW5lcy5hd2siJyAiJGFjX2ZpbGVfaW5wdXRzIiBcCisgICAgICB8fCBhc19mbl9lcnJvciAkPyAiY291bGQgbm90IGNyZWF0ZSAtIiAiJExJTkVOTyIgNQorICBmaQorIDs7CisKKworICBlc2FjCisKK2RvbmUgIyBmb3IgYWNfdGFnCisKKworYXNfZm5fZXhpdCAwCitfQUNFT0YKK2FjX2NsZWFuX2ZpbGVzPSRhY19jbGVhbl9maWxlc19zYXZlCisKK3Rlc3QgJGFjX3dyaXRlX2ZhaWwgPSAwIHx8CisgIGFzX2ZuX2Vycm9yICQ/ICJ3cml0ZSBmYWlsdXJlIGNyZWF0aW5nICRDT05GSUdfU1RBVFVTIiAiJExJTkVOTyIgNQorCisKKyMgY29uZmlndXJlIGlzIHdyaXRpbmcgdG8gY29uZmlnLmxvZywgYW5kIHRoZW4gY2FsbHMgY29uZmlnLnN0YXR1cy4KKyMgY29uZmlnLnN0YXR1cyBkb2VzIGl0cyBvd24gcmVkaXJlY3Rpb24sIGFwcGVuZGluZyB0byBjb25maWcubG9nLgorIyBVbmZvcnR1bmF0ZWx5LCBvbiBET1MgdGhpcyBmYWlscywgYXMgY29uZmlnLmxvZyBpcyBzdGlsbCBrZXB0IG9wZW4KKyMgYnkgY29uZmlndXJlLCBzbyBjb25maWcuc3RhdHVzIHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdG8gaXQ7IGl0cworIyBvdXRwdXQgaXMgc2ltcGx5IGRpc2NhcmRlZC4gIFNvIHdlIGV4ZWMgdGhlIEZEIHRvIC9kZXYvbnVsbCwKKyMgZWZmZWN0aXZlbHkgY2xvc2luZyBjb25maWcubG9nLCBzbyBpdCBjYW4gYmUgcHJvcGVybHkgKHJlKW9wZW5lZCBhbmQKKyMgYXBwZW5kZWQgdG8gYnkgY29uZmlnLnN0YXR1cy4gIFdoZW4gY29taW5nIGJhY2sgdG8gY29uZmlndXJlLCB3ZQorIyBuZWVkIHRvIG1ha2UgdGhlIEZEIGF2YWlsYWJsZSBhZ2Fpbi4KK2lmIHRlc3QgIiRub19jcmVhdGUiICE9IHllczsgdGhlbgorICBhY19jc19zdWNjZXNzPToKKyAgYWNfY29uZmlnX3N0YXR1c19hcmdzPQorICB0ZXN0ICIkc2lsZW50IiA9IHllcyAmJgorICAgIGFjX2NvbmZpZ19zdGF0dXNfYXJncz0iJGFjX2NvbmZpZ19zdGF0dXNfYXJncyAtLXF1aWV0IgorICBleGVjIDU+L2Rldi9udWxsCisgICRTSEVMTCAkQ09ORklHX1NUQVRVUyAkYWNfY29uZmlnX3N0YXR1c19hcmdzIHx8IGFjX2NzX3N1Y2Nlc3M9ZmFsc2UKKyAgZXhlYyA1Pj5jb25maWcubG9nCisgICMgVXNlIHx8LCBub3QgJiYsIHRvIGF2b2lkIGV4aXRpbmcgZnJvbSB0aGUgaWYgd2l0aCAkPyA9IDEsIHdoaWNoCisgICMgd291bGQgbWFrZSBjb25maWd1cmUgZmFpbCBpZiB0aGlzIGlzIHRoZSBsYXN0IGluc3RydWN0aW9uLgorICAkYWNfY3Nfc3VjY2VzcyB8fCBhc19mbl9leGl0IDEKK2ZpCitpZiB0ZXN0IC1uICIkYWNfdW5yZWNvZ25pemVkX29wdHMiICYmIHRlc3QgIiRlbmFibGVfb3B0aW9uX2NoZWNraW5nIiAhPSBubzsgdGhlbgorICB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306IFdBUk5JTkc6IHVucmVjb2duaXplZCBvcHRpb25zOiAkYWNfdW5yZWNvZ25pemVkX29wdHMiID4mNQorJGFzX2VjaG8gIiRhc19tZTogV0FSTklORzogdW5yZWNvZ25pemVkIG9wdGlvbnM6ICRhY191bnJlY29nbml6ZWRfb3B0cyIgPiYyO30KK2ZpCisKKworaWYgdGVzdCAtZiAuZGV2ZWwgOyB0aGVuCisJbWFrZSBkZXBlbmQKK2ZpCitleGl0IDAKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvY29uZmlndXJlLmluIGIvbGlicGNhcC0xLjMuMC9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzMmQyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsMTQ3MSBAQAorZG5sIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvY29uZmlndXJlLmluLHYgMS4xNjggMjAwOC0xMi0yMyAyMDo0OToyNiBndXkgRXhwICQgKExCTCkKK2RubAorZG5sIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworZG5sCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorZG5sCitkbmwgUHJvY2VzcyB0aGlzIGZpbGUgd2l0aCBhdXRvY29uZiB0byBwcm9kdWNlIGEgY29uZmlndXJlIHNjcmlwdC4KK2RubAorCisjCisjIFNlZQorIworIwlodHRwOi8vZnRwLmdudS5vcmcvZ251L2NvbmZpZy9SRUFETUUKKyMKKyMgZm9yIHRoZSBVUkxzIHRvIHVzZSB0byBmZXRjaCBuZXcgdmVyc2lvbnMgb2YgY29uZmlnLmd1ZXNzIGFuZAorIyBjb25maWcuc3ViLgorIworCitBQ19SRVZJU0lPTigkUmV2aXNpb246IDEuMTY4ICQpCitBQ19QUkVSRVEoMi41MCkKK0FDX0lOSVQocGNhcC5jKQorCitBQ19DQU5PTklDQUxfU1lTVEVNCisKK0FDX0xCTF9DX0lOSVRfQkVGT1JFX0NDKFZfQ0NPUFQsIFZfSU5DTFMpCitBQ19QUk9HX0NDCitBQ19MQkxfQ19JTklUKFZfQ0NPUFQsIFZfSU5DTFMpCitBQ19MQkxfU0hMSUJTX0lOSVQKK0FDX0xCTF9DX0lOTElORQorQUNfQ19fX0FUVFJJQlVURV9fCisKK0FDX0NIRUNLX0hFQURFUlMoc3lzL2JpdHlwZXMuaCkKKworQUNfQ0hFQ0tfVFlQRShbaW50OF90XSwgLAorCVtBQ19ERUZJTkUoW2ludDhfdF0sIFtzaWduZWQgY2hhcl0sCisJW0RlZmluZSB0byBgc2lnbmVkIGNoYXInIGlmIGludDhfdCBub3QgZGVmaW5lZC5dKV0sCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKK0FDX0NIRUNLX1RZUEUoW3VfaW50OF90XSwgLAorCVtBQ19ERUZJTkUoW3VfaW50OF90XSwgW3Vuc2lnbmVkIGNoYXJdLAorCVtEZWZpbmUgdG8gYHVuc2lnbmVkIGNoYXInIGlmIHVfaW50OF90IG5vdCBkZWZpbmVkLl0pXSwKKwlbQUNfSU5DTFVERVNfREVGQVVMVAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWZdKQorQUNfQ0hFQ0tfVFlQRShbaW50MTZfdF0sICwKKwlbQUNfREVGSU5FKFtpbnQxNl90XSwgW3Nob3J0XSwKKwlbRGVmaW5lIHRvIGBzaG9ydCcgaWYgaW50MTZfdCBub3QgZGVmaW5lZC5dKV0KKwlbQUNfSU5DTFVERVNfREVGQVVMVAorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWZdKQorQUNfQ0hFQ0tfVFlQRShbdV9pbnQxNl90XSwgLAorCVtBQ19ERUZJTkUoW3VfaW50MTZfdF0sIFt1bnNpZ25lZCBzaG9ydF0sCisJW0RlZmluZSB0byBgdW5zaWduZWQgc2hvcnQnIGlmIHVfaW50MTZfdCBub3QgZGVmaW5lZC5dKV0sCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKK0FDX0NIRUNLX1RZUEUoW2ludDMyX3RdLCAsCisJW0FDX0RFRklORShbaW50MzJfdF0sIFtpbnRdLAorCVtEZWZpbmUgdG8gYGludCcgaWYgaW50MzJfdCBub3QgZGVmaW5lZC5dKV0sCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKK0FDX0NIRUNLX1RZUEUoW3VfaW50MzJfdF0sICwKKwlbQUNfREVGSU5FKFt1X2ludDMyX3RdLCBbdW5zaWduZWQgaW50XSwKKwlbRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIHVfaW50MzJfdCBub3QgZGVmaW5lZC5dKV0sCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKK0FDX0NIRUNLX1RZUEUoW2ludDY0X3RdLCAsCisJW0FDX0RFRklORShbaW50NjRfdF0sIFtsb25nIGxvbmddLAorCVtEZWZpbmUgdG8gYGxvbmcgbG9uZycgaWYgaW50NjRfdCBub3QgZGVmaW5lZC5dKV0sCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKK0FDX0NIRUNLX1RZUEUoW3VfaW50NjRfdF0sICwKKwlbQUNfREVGSU5FKFt1X2ludDY0X3RdLCBbdW5zaWduZWQgbG9uZyBsb25nXSwKKwlbRGVmaW5lIHRvIGB1bnNpZ25lZCBsb25nIGxvbmcnIGlmIHVfaW50NjRfdCBub3QgZGVmaW5lZC5dKV0sCisJW0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmXSkKKworIworIyBUcnkgdG8gYXJyYW5nZSBmb3IgbGFyZ2UgZmlsZSBzdXBwb3J0LgorIworQUNfU1lTX0xBUkdFRklMRQorQUNfRlVOQ19GU0VFS08KKworZG5sCitkbmwgRXZlbiBpZiA8bmV0L2JwZi5oPiB3ZXJlLCBvbiBhbGwgT1NlcyB0aGF0IHN1cHBvcnQgQlBGLCBmaXhlZCB0bworZG5sIGluY2x1ZGUgPHN5cy9pb2Njb20uaD4sIGFuZCB3ZSB3ZXJlIHRvIGRyb3Agc3VwcG9ydCBmb3Igb2xkZXIKK2RubCByZWxlYXNlcyB3aXRob3V0IHRoYXQgZml4LCBzbyB0aGF0IHBjYXAtYnBmLmMgZG9lc24ndCBuZWVkIHRvCitkbmwgaW5jbHVkZSA8c3lzL2lvY2NvbS5oPiwgdGhlIHRlc3QgcHJvZ3JhbSBpbiAiQUNfTEJMX0ZJWElOQ0xVREVTIgorZG5sIGluICJhY2xvY2FsLm00IiB1c2VzIGl0LCBzbyB3ZSB3b3VsZCBzdGlsbCBoYXZlIHRvIHRlc3QgZm9yIGl0CitkbmwgYW5kIHNldCAiSEFWRV9TWVNfSU9DQ09NX0giIGlmIHdlIGhhdmUgaXQsIG90aGVyd2lzZQorZG5sICJBQ19MQkxfRklYSU5DTFVERVMiIHdvdWxkbid0IHdvcmsgb24gc29tZSBwbGF0Zm9ybXMgc3VjaCBhcyBTb2xhcmlzLgorZG5sCitBQ19DSEVDS19IRUFERVJTKHN5cy9pb2Njb20uaCBzeXMvc29ja2lvLmggbGltaXRzLmggcGF0aHMuaCkKK0FDX0NIRUNLX0hFQURFUlMobGludXgvdHlwZXMuaCkKK0FDX0NIRUNLX0hFQURFUlMobGludXgvaWZfcGFja2V0LmggbmV0cGFja2V0L3BhY2tldC5oIG5ldHBhY2tldC9pZl9wYWNrZXQuaCkKK0FDX0NIRUNLX0hFQURFUlMobmV0L3BmdmFyLmgsICwgLCBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD5dKQoraWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9uZXRfcGZ2YXJfaCIgPSB5ZXM7IHRoZW4KKwkjCisJIyBDaGVjayBmb3IgdmFyaW91cyBQRiBhY3Rpb25zLgorCSMKKwlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBuZXQvcGZ2YXIuaCBkZWZpbmVzIFBGX05BVCB0aHJvdWdoIFBGX05PUkRSKQorCUFDX1RSWV9DT01QSUxFKAorCSAgICBbI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSAgICAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCSAgICAjaW5jbHVkZSA8bmV0L2lmLmg+CisJICAgICNpbmNsdWRlIDxuZXQvcGZ2YXIuaD5dLAorCSAgICBbcmV0dXJuIFBGX05BVCtQRl9OT05BVCtQRl9CSU5BVCtQRl9OT0JJTkFUK1BGX1JEUitQRl9OT1JEUjtdLAorCSAgICBbCisJCUFDX01TR19SRVNVTFQoeWVzKQorCQlBQ19ERUZJTkUoSEFWRV9QRl9OQVRfVEhST1VHSF9QRl9OT1JEUiwgMSwKKwkJICAgIFtkZWZpbmUgaWYgbmV0L3BmdmFyLmggZGVmaW5lcyBQRl9OQVQgdGhyb3VnaCBQRl9OT1JEUl0pCisJICAgIF0sCisJICAgIEFDX01TR19SRVNVTFQobm8pKQorZmkKK0FDX0NIRUNLX0hFQURFUlMobmV0aW5ldC9pZl9ldGhlci5oLCAsICwgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+XSkKK2lmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiAhPSB5ZXM7IHRoZW4KKwkjCisJIyBUaGUgc2ltcGxlIHRlc3QgZGlkbid0IHdvcmsuCisJIyBEbyB3ZSBuZWVkIHRvIGluY2x1ZGUgPG5ldC9pZi5oPiBmaXJzdD8KKwkjIFVuc2V0IGFjX2N2X2hlYWRlcl9uZXRpbmV0X2lmX2V0aGVyX2ggc28gd2UgZG9uJ3QKKwkjIHRyZWF0IHRoZSBwcmV2aW91cyBmYWlsdXJlIGFzIGEgY2FjaGVkIHZhbHVlIGFuZAorCSMgc3VwcHJlc3MgdGhlIG5leHQgdGVzdC4KKwkjCisJQUNfTVNHX05PVElDRShbUmVjaGVja2luZyB3aXRoIHNvbWUgYWRkaXRpb25hbCBpbmNsdWRlc10pCisJdW5zZXQgYWNfY3ZfaGVhZGVyX25ldGluZXRfaWZfZXRoZXJfaAorCUFDX0NIRUNLX0hFQURFUlMobmV0aW5ldC9pZl9ldGhlci5oLCAsICwgWyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorc3RydWN0IG1idWY7CitzdHJ1Y3QgcnRlbnRyeTsKKyNpbmNsdWRlIDxuZXQvaWYuaD5dKQorZmkKKworQUNfTEJMX0ZJWElOQ0xVREVTCisKK0FDX0NIRUNLX0ZVTkNTKHN0cmVycm9yIHN0cmxjcHkpCisKK25lZWRzbnByaW50Zj1ubworQUNfQ0hFQ0tfRlVOQ1ModnNucHJpbnRmIHNucHJpbnRmLCwKKwlbbmVlZHNucHJpbnRmPXllc10pCitpZiB0ZXN0ICRuZWVkc25wcmludGYgPSB5ZXM7IHRoZW4KKwlBQ19MSUJPQkooW3NucHJpbnRmXSkKK2ZpCisKKyMKKyMgRG8gdGhpcyBiZWZvcmUgY2hlY2tpbmcgZm9yIGV0aGVyX2hvc3R0b24oKSwgYXMgaXQncyBhCisjICJnZXRob3N0YnluYW1lKCkgLWlzaCBmdW5jdGlvbiIuCisjCitBQ19MQkxfTElCUkFSWV9ORVQKKworIworIyBZb3UgYXJlIGluIGEgdHdpc3R5IGxpdHRsZSBtYXplIG9mIFVOKlhlcywgYWxsIGRpZmZlcmVudC4KKyMgU29tZSBtaWdodCBub3QgaGF2ZSBldGhlcl9ob3N0dG9uKCkuCisjIFNvbWUgbWlnaHQgaGF2ZSBpdCwgYnV0IG5vdCBkZWNsYXJlIGl0IGluIGFueSBoZWFkZXIgZmlsZS4KKyMgU29tZSBtaWdodCBoYXZlIGl0LCBidXQgZGVjbGFyZSBpdCBpbiA8bmV0aW5ldC9pZl9ldGhlci5oPi4KKyMgU29tZSBtaWdodCBoYXZlIGl0LCBidXQgZGVjbGFyZSBpdCBpbiA8bmV0aW5ldC9ldGhlci5oPgorIyAoQW5kIHNvbWUgbWlnaHQgaGF2ZSBpdCBidXQgZG9jdW1lbnQgaXQgYXMgc29tZXRoaW5nIGRlY2xhcmVkIGluCisjIDxuZXRpbmV0L2V0aGVybmV0Lmg+LCBhbHRob3VnaCA8bmV0aW5ldC9pZl9ldGhlci5oPiBhcHBlYXJzIHRvIHdvcmsuKQorIworIyBCZWZvcmUgeW91IGlzIGEgQyBjb21waWxlci4KKyMKK0FDX0NIRUNLX0ZVTkNTKGV0aGVyX2hvc3R0b24pCitpZiB0ZXN0ICIkYWNfY3ZfZnVuY19ldGhlcl9ob3N0dG9uIiA9IHllczsgdGhlbgorCSMKKwkjIE9LLCB3ZSBoYXZlIGV0aGVyX2hvc3R0b24oKS4gIERvIHdlIGhhdmUgPG5ldGluZXQvaWZfZXRoZXIuaD4/CisJIworCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9pZl9ldGhlcl9oIiA9IHllczsgdGhlbgorCQkjCisJCSMgWWVzLiAgRG9lcyBpdCBkZWNsYXJlIGV0aGVyX2hvc3R0b24oKT8KKwkJIworCQlBQ19DSEVDS19ERUNMKGV0aGVyX2hvc3R0b24sCisJCSAgICBbCisJCQlBQ19ERUZJTkUoTkVUSU5FVF9JRl9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX0hPU1RUT04sLAorCQkJICAgIFtEZWZpbmUgdG8gMSBpZiBuZXRpbmV0L2lmX2V0aGVyLmggZGVjbGFyZXMgYGV0aGVyX2hvc3R0b24nXSkKKwkJICAgIF0sLAorCQkgICAgWworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CitzdHJ1Y3QgbWJ1ZjsKK3N0cnVjdCBydGVudHJ5OworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKwkJICAgIF0pCisJZmkKKwkjCisJIyBEaWQgdGhhdCBzdWNjZWVkPworCSMKKwlpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b24iICE9IHllczsgdGhlbgorCQkjCisJCSMgTm8sIGhvdyBhYm91dCA8bmV0aW5ldC9ldGhlci5oPiwgYXMgb24gTGludXg/CisJCSMKKwkJQUNfQ0hFQ0tfSEVBREVSUyhuZXRpbmV0L2V0aGVyLmgpCisJCWlmIHRlc3QgIiRhY19jdl9oZWFkZXJfbmV0aW5ldF9ldGhlcl9oIiA9IHllczsgdGhlbgorCQkJIworCQkJIyBXZSBoYXZlIGl0IC0gZG9lcyBpdCBkZWNsYXJlIGV0aGVyX2hvc3R0b24oKT8KKwkJCSMgVW5zZXQgYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b24gc28gd2UgZG9uJ3QKKwkJCSMgdHJlYXQgdGhlIHByZXZpb3VzIGZhaWx1cmUgYXMgYSBjYWNoZWQgdmFsdWUgYW5kCisJCQkjIHN1cHByZXNzIHRoZSBuZXh0IHRlc3QuCisJCQkjCisJCQl1bnNldCBhY19jdl9oYXZlX2RlY2xfZXRoZXJfaG9zdHRvbgorCQkJQUNfQ0hFQ0tfREVDTChldGhlcl9ob3N0dG9uLAorCQkJICAgIFsKKwkJCQlBQ19ERUZJTkUoTkVUSU5FVF9FVEhFUl9IX0RFQ0xBUkVTX0VUSEVSX0hPU1RUT04sLAorCQkJCSAgICBbRGVmaW5lIHRvIDEgaWYgbmV0aW5ldC9ldGhlci5oIGRlY2xhcmVzIGBldGhlcl9ob3N0dG9uJ10pCisJCQkgICAgXSwsCisJCQkgICAgWworI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKwkJCSAgICBdKQorCQlmaQorCWZpCisJIworCSMgSXMgZXRoZXJfaG9zdHRvbigpIGRlY2xhcmVkPworCSMKKwlpZiB0ZXN0ICIkYWNfY3ZfaGF2ZV9kZWNsX2V0aGVyX2hvc3R0b24iICE9IHllczsgdGhlbgorCQkjCisJCSMgTm8sIHdlJ2xsIGhhdmUgdG8gZGVjbGFyZSBpdCBvdXJzZWx2ZXMuCisJCSMgRG8gd2UgaGF2ZSAic3RydWN0IGV0aGVyX2FkZHIiPworCQkjCisJCUFDX0NIRUNLX1RZUEVTKHN0cnVjdCBldGhlcl9hZGRyLCwsCisJCSAgICBbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KK3N0cnVjdCBtYnVmOworc3RydWN0IHJ0ZW50cnk7CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorCQkgICAgXSkKKwkJQUNfREVGSU5FKEhBVkVfREVDTF9FVEhFUl9IT1NUVE9OLCAwLAorCQkgICAgW0RlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgZXRoZXJfaG9zdHRvbicsIGFuZCB0byAwIGlmIHlvdQorZG9uJ3QuXSkKKwllbHNlCisJCUFDX0RFRklORShIQVZFX0RFQ0xfRVRIRVJfSE9TVFRPTiwgMSwKKwkJICAgIFtEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGV0aGVyX2hvc3R0b24nLCBhbmQgdG8gMCBpZiB5b3UKK2Rvbid0Ll0pCisJZmkKK2ZpCisKK2RubCB0byBwYWNpZnkgdGhvc2Ugd2hvIGhhdGUgcHJvdG9jaGFpbiBpbnNuCitBQ19NU0dfQ0hFQ0tJTkcoaWYgLS1kaXNhYmxlLXByb3RvY2hhaW4gb3B0aW9uIGlzIHNwZWNpZmllZCkKK0FDX0FSR19FTkFCTEUocHJvdG9jaGFpbiwKK0FDX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtcHJvdG9jaGFpbl0sW2Rpc2FibGUgXCJwcm90b2NoYWluXCIgaW5zbl0pKQorY2FzZSAieCRlbmFibGVfcHJvdG9jaGFpbiIgaW4KK3h5ZXMpCWVuYWJsZV9wcm90b2NoYWluPWVuYWJsZWQJOzsKK3hubykJZW5hYmxlX3Byb3RvY2hhaW49ZGlzYWJsZWQJOzsKK3gpCWVuYWJsZV9wcm90b2NoYWluPWVuYWJsZWQJOzsKK2VzYWMKKworaWYgdGVzdCAiJGVuYWJsZV9wcm90b2NoYWluIiA9ICJkaXNhYmxlZCI7IHRoZW4KKwlBQ19ERUZJTkUoTk9fUFJPVE9DSEFJTiwxLFtkbyBub3QgdXNlIHByb3RvY2hhaW5dKQorZmkKK0FDX01TR19SRVNVTFQoJHtlbmFibGVfcHJvdG9jaGFpbn0pCisKKyMKKyMgU0lUQSBzdXBwb3J0IGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIG5hdGl2ZSBjYXB0dXJlIHN1cHBvcnQ7CisjICItLXdpdGgtc2l0YSIgc2VsZWN0cyBTSVRBIHN1cHBvcnQuCisjCitBQ19BUkdfV0lUSChzaXRhLAorQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1zaXRhXSxbaW5jbHVkZSBTSVRBIHN1cHBvcnRdKSwKK1sKKwlpZiB0ZXN0ICEgIngkd2l0aHZhbCIgPSAieG5vIiA7IHRoZW4KKwkJQUNfREVGSU5FKFNJVEEsMSxbaW5jbHVkZSBBQ04gc3VwcG9ydF0pCisJCUFDX01TR19OT1RJQ0UoRW5hYmxpbmcgU0lUQSBBQ04gc3VwcG9ydCkKKwkJVl9QQ0FQPXNpdGEKKwkJVl9GSU5EQUxMREVWUz1zaXRhCisJZmkKK10sCitbCitkbmwKK2RubCBOb3QgYWxsIHZlcnNpb25zIG9mIHRlc3Qgc3VwcG9ydCAtYyAoY2hhcmFjdGVyIHNwZWNpYWwpIGJ1dCBpdCdzIGEKK2RubCBiZXR0ZXIgd2F5IG9mIHRlc3Rpbmcgc2luY2UgdGhlIGRldmljZSBtaWdodCBiZSBwcm90ZWN0ZWQuIFNvIHdlCitkbmwgY2hlY2sgaW4gb3VyIG5vcm1hbCBvcmRlciB1c2luZyAtciBhbmQgdGhlbiBjaGVjayB0aGUgZm9yIHRoZSAvZGV2CitkbmwgZ3V5cyBhZ2FpbiB1c2luZyAtYy4KK2RubAorZG5sIFhYWCBUaGlzIGNvdWxkIGJlIGRvbmUgZm9yIGNyb3NzLWNvbXBpbGluZywgYnV0IGZvciBub3cgaXQncyBub3QuCitkbmwKK2lmIHRlc3QgLXogIiR3aXRoX3BjYXAiICYmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCisJQUNfTVNHX0VSUk9SKHBjYXAgdHlwZSBub3QgZGV0ZXJtaW5lZCB3aGVuIGNyb3NzLWNvbXBpbGluZzsgdXNlIC0td2l0aC1wY2FwPS4uLikKK2ZpCitBQ19BUkdfV0lUSChwY2FwLAorQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1wY2FwPVRZUEVdLFt1c2UgcGFja2V0IGNhcHR1cmUgVFlQRV0pKQorQUNfTVNHX0NIRUNLSU5HKHBhY2tldCBjYXB0dXJlIHR5cGUpCitpZiB0ZXN0ICEgLXogIiR3aXRoX3BjYXAiIDsgdGhlbgorCVZfUENBUD0iJHdpdGh2YWwiCitlbGlmIHRlc3QgLXIgL2Rldi9icGYgLW8gLWggL2Rldi9icGYgOyB0aGVuCisJIworCSMgQ2xvbmluZyBCUEYgZGV2aWNlLgorCSMKKwlWX1BDQVA9YnBmCisJQUNfREVGSU5FKEhBVkVfQ0xPTklOR19CUEYsMSxbZGVmaW5lIGlmIHlvdSBoYXZlIGEgY2xvbmluZyBCUEYgZGV2aWNlXSkKK2VsaWYgdGVzdCAtciAvZGV2L2JwZjAgOyB0aGVuCisJVl9QQ0FQPWJwZgorZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9uZXQvcGZpbHQuaCA7IHRoZW4KKwlWX1BDQVA9cGYKK2VsaWYgdGVzdCAtciAvZGV2L2VuZXQgOyB0aGVuCisJVl9QQ0FQPWVuZXQKK2VsaWYgdGVzdCAtciAvZGV2L25pdCA7IHRoZW4KKwlWX1BDQVA9c25pdAorZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9zeXMvbmV0L25pdC5oIDsgdGhlbgorCVZfUENBUD1uaXQKK2VsaWYgdGVzdCAtciAvdXNyL2luY2x1ZGUvbGludXgvc29ja2V0LmggOyB0aGVuCisJVl9QQ0FQPWxpbnV4CitlbGlmIHRlc3QgLXIgL3Vzci9pbmNsdWRlL25ldC9yYXcuaCA7IHRoZW4KKwlWX1BDQVA9c25vb3AKK2VsaWYgdGVzdCAtciAvdXNyL2luY2x1ZGUvb2RtaS5oIDsgdGhlbgorCSMKKwkjIE9uIEFJWCwgdGhlIEJQRiBkZXZpY2VzIG1pZ2h0IG5vdCB5ZXQgYmUgcHJlc2VudCAtIHRoZXkncmUKKwkjIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgbGlicGNhcCBydW5zIGFmdGVyIGJvb3RpbmcuCisJIyBXZSBjaGVjayBmb3Igb2RtaS5oIGluc3RlYWQuCisJIworCVZfUENBUD1icGYKK2VsaWYgdGVzdCAtYyAvZGV2L2JwZjAgOyB0aGVuCQkjIGNoZWNrIGFnYWluIGluIGNhc2Ugbm90IHJlYWRhYmxlCisJVl9QQ0FQPWJwZgorZWxpZiB0ZXN0IC1yIC91c3IvaW5jbHVkZS9zeXMvZGxwaS5oIDsgdGhlbgorCVZfUENBUD1kbHBpCitlbGlmIHRlc3QgLWMgL2Rldi9lbmV0IDsgdGhlbgkJIyBjaGVjayBhZ2FpbiBpbiBjYXNlIG5vdCByZWFkYWJsZQorCVZfUENBUD1lbmV0CitlbGlmIHRlc3QgLWMgL2Rldi9uaXQgOyB0aGVuCQkjIGNoZWNrIGFnYWluIGluIGNhc2Ugbm90IHJlYWRhYmxlCisJVl9QQ0FQPXNuaXQKK2Vsc2UKKwlWX1BDQVA9bnVsbAorZmkKK0FDX01TR19SRVNVTFQoJFZfUENBUCkKKworIworIyBEbyBjYXB0dXJlLW1lY2hhbmlzbS1kZXBlbmRlbnQgdGVzdHMuCisjCitjYXNlICIkVl9QQ0FQIiBpbgorZGxwaSkKKwkjCisJIyBDaGVja3MgdG8gc2VlIGlmIFNvbGFyaXMgaGFzIHRoZSBwdWJsaWMgbGliZGxwaSgzTElCKSBsaWJyYXJ5LgorCSMgTm90ZTogVGhlIGV4aXN0ZW5jZSBvZiAvdXNyL2luY2x1ZGUvbGliZGxwaS5oIGRvZXMgbm90IG1lYW4gaXQgaXMgdGhlCisJIyBwdWJsaWMgbGliZGxwaSgzTElCKSB2ZXJzaW9uLiBCZWZvcmUgbGliZGxwaSB3YXMgbWFkZSBwdWJsaWMsIGEgCisJIyBwcml2YXRlIHZlcnNpb24gYWxzbyBleGlzdGVkLCB3aGljaCBkaWQgbm90IGhhdmUgdGhlIHNhbWUgQVBJcy4gCisJIyBEdWUgdG8gYSBnY2MgYnVnLCB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgMzItYml0IGxpYnJhcmllcyBkb2VzCisJIyBub3QgaW5jbHVkZSAvbGliLCB3ZSBhZGQgaXQgZXhwbGljaXRseSBoZXJlLgorCSMgW2h0dHA6Ly9idWdzLm9wZW5zb2xhcmlzLm9yZy92aWV3X2J1Zy5kbz9idWdfaWQ9NjYxOTQ4NV0uIAorCSMgQWxzbywgZHVlIHRvIHRoZSBidWcgYWJvdmUgYXBwbGljYXRpb25zIHRoYXQgbGluayB0byBsaWJwY2FwIHdpdGgKKwkjIGxpYmRscGkgd2lsbCBoYXZlIHRvIGFkZCAiLUwvbGliIiBvcHRpb24gdG8gImNvbmZpZ3VyZSIuCisJIworCXNhdmVkX2xkZmxhZ3M9JExERkxBR1MKKwlMREZMQUdTPSIkTElCUyAtTC9saWIiCisJQUNfQ0hFQ0tfTElCKGRscGksIGRscGlfd2FsaywKKwkJTElCUz0iLWxkbHBpICRMSUJTIgorCQlWX1BDQVA9bGliZGxwaQorCQlBQ19ERUZJTkUoSEFWRV9MSUJETFBJLDEsW2lmIGxpYmRscGkgZXhpc3RzXSksCisJCVZfUENBUD1kbHBpKQorCUxERkxBR1M9JHNhdmVkX2xkZmxhZ3MKKworCSMKKwkjIENoZWNrcyB3aGV0aGVyIDxzeXMvZGxwaS5oPiBpcyB1c2FibGUsIHRvIGNhdGNoIHdlaXJkIFNDTworCSMgdmVyc2lvbnMgb2YgRExQSS4KKwkjCisJQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgPHN5cy9kbHBpLmg+IGlzIHVzYWJsZSkKKwlBQ19DQUNIRV9WQUwoYWNfY3Zfc3lzX2RscGlfdXNhYmxlLAorCQlBQ19UUllfQ09NUElMRSgKKwkJICAgIFsKKwkJCSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKwkJCSNpbmNsdWRlIDxzeXMvdGltZS5oPgorCQkJI2luY2x1ZGUgPHN5cy9kbHBpLmg+CisJCSAgICBdLAorCQkgICAgW2ludCBpID0gRExfUFJPTUlTQ19QSFlTO10sCisJCSAgICBhY19jdl9zeXNfZGxwaV91c2FibGU9eWVzLAorCQkgICAgYWNfY3Zfc3lzX2RscGlfdXNhYmxlPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCRhY19jdl9zeXNfZGxwaV91c2FibGUpCisJaWYgdGVzdCAkYWNfY3Zfc3lzX2RscGlfdXNhYmxlID0gbm8gOyB0aGVuCisJCUFDX01TR19FUlJPUig8c3lzL2RscGkuaD4gaXMgbm90IHVzYWJsZSBvbiB0aGlzIHN5c3RlbTsgaXQgcHJvYmFibHkgaGFzIGEgbm9uLXN0YW5kYXJkIERMUEkpCisJZmkKKworCSMKKwkjIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIC9kZXYvZGxwaSBkZXZpY2Ugb3IgaGF2ZSBtdWx0aXBsZSBkZXZpY2VzLgorCSMKKwlBQ19NU0dfQ0hFQ0tJTkcoZm9yIC9kZXYvZGxwaSBkZXZpY2UpCisJaWYgdGVzdCAtYyAvZGV2L2RscGkgOyB0aGVuCisJCUFDX01TR19SRVNVTFQoeWVzKQorCQlBQ19ERUZJTkUoSEFWRV9ERVZfRExQSSwgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBhIC9kZXYvZGxwaV0pCisJZWxzZQorCQlBQ19NU0dfUkVTVUxUKG5vKQorCQlkaXI9Ii9kZXYvZGxwaSIKKwkJQUNfTVNHX0NIRUNLSU5HKGZvciAkZGlyIGRpcmVjdG9yeSkKKwkJaWYgdGVzdCAtZCAkZGlyIDsgdGhlbgorCQkJQUNfTVNHX1JFU1VMVCh5ZXMpCisJCQlBQ19ERUZJTkVfVU5RVU9URUQoUENBUF9ERVZfUFJFRklYLCAiJGRpciIsIFsvZGV2L2RscGkgZGlyZWN0b3J5XSkKKwkJZWxzZQorCQkJQUNfTVNHX1JFU1VMVChubykKKwkJZmkKKwlmaQorCisJIworCSMgVGhpcyBjaGVjayBpcyBmb3IgU29sYXJpcyB3aXRoIERMUEkgc3VwcG9ydCBmb3IgcGFzc2l2ZSBtb2Rlcy4KKwkjIFNlZSBkbHBpKDdQKSBmb3IgbW9yZSBkZXRhaWxzLgorCSMKKwlBQ19MQkxfRExfUEFTU0lWRV9SRVFfVAorCTs7CisKK2xpbnV4KQorCSMKKwkjIERvIHdlIGhhdmUgdGhlIHdpcmVsZXNzIGV4dGVuc2lvbnM/CisJIworCUFDX0NIRUNLX0hFQURFUlMobGludXgvd2lyZWxlc3MuaCwgW10sIFtdLAorCVsKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCV0pCisKKwkjCisJIyBEbyB3ZSBoYXZlIGxpYm5sPworCSMKKwlBQ19BUkdfV0lUSChsaWJubCwKKwlBQ19IRUxQX1NUUklORyhbLS13aXRob3V0LWxpYm5sXSxbZGlzYWJsZSBsaWJubCBzdXBwb3J0IEA8OkBkZWZhdWx0PXllcywgb24gTGludXgsIGlmIHByZXNlbnRAOj5AXSksCisJCXdpdGhfbGlibmw9JHdpdGh2YWwsLCkKKworCWlmIHRlc3QgeCR3aXRoX2xpYm5sICE9IHhubyA7IHRoZW4KKwkJIworCQkjIFRyeSBsaWJubCAyLnggZmlyc3QuCisJCSMKKwkJQUNfQ0hFQ0tfTElCKG5sLCBubF9zb2NrZXRfYWxsb2MsCisJCVsKKwkJCSMKKwkJCSMgWWVzLCB3ZSBoYXZlIGxpYm5sIDIueC4KKwkJCSMKKwkJCUxJQlM9Ii1sbmwtZ2VubCAtbG5sICRMSUJTIgorCQkJQUNfREVGSU5FKEhBVkVfTElCTkwsMSxbaWYgbGlibmwgZXhpc3RzXSkKKwkJCUFDX0RFRklORShIQVZFX0xJQk5MXzJfeCwxLFtpZiBsaWJubCBleGlzdHMgYW5kIGlzIHZlcnNpb24gMi54XSkKKwkJXSwKKwkJWworCQkJIworCQkJIyBObywgd2UgZG9uJ3Q7IGRvIHdlIGhhdmUgbGlibmwgMS54PworCQkJIworCQkJQUNfQ0hFQ0tfTElCKG5sLCBubF9oYW5kbGVfYWxsb2MsCisJCQlbCisJCQkJIworCQkJCSMgWWVzLgorCQkJCSMKKwkJCQlMSUJTPSItbG5sICRMSUJTIgorCQkJCUFDX0RFRklORShIQVZFX0xJQk5MLDEsW2lmIGxpYm5sIGV4aXN0c10pCisJCQldLAorCQkJWworCQkJCSMKKwkJCQkjIE5vLCB3ZSBkb24ndCBoYXZlIGxpYm5sIGF0IGFsbC4KKwkJCQkjCisJCQkJaWYgdGVzdCB4JHdpdGhfbGlibmwgPSB4eWVzIDsgdGhlbgorCQkJCQlBQ19NU0dfRVJST1IoW2xpYm5sIHN1cHBvcnQgcmVxdWVzdGVkIGJ1dCBsaWJubCBub3QgZm91bmRdKQorCQkJCWZpCisJCQldKQorCQldKQorCWZpCisKKwlBQ19DSEVDS19IRUFERVJTKGxpbnV4L2V0aHRvb2wuaCwsLAorCSAgICBbCitBQ19JTkNMVURFU19ERUZBVUxUCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwkgICAgXSkKKwlBQ19MQkxfVFBBQ0tFVF9TVEFUUworCUFDX0xCTF9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kKKwk7OworCiticGYpCisJIworCSMgQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHRoZSAqQlNELXN0eWxlIGlvY3Rscy4KKwkjCisJQUNfQ0hFQ0tfSEVBREVSUyhuZXQvaWZfbWVkaWEuaCkKKworCUFDX01TR19DSEVDS0lORyh3aGV0aGVyIHRoZSBzeXN0ZW0gc3VwcG9ydHMgemVyb2NvcHkgQlBGKQorCUFDX1RSWV9DT01QSUxFKAorCSAgICBbI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKwkgICAgI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCSAgICAjaW5jbHVkZSA8bmV0L2lmLmg+CisJICAgICNpbmNsdWRlIDxuZXQvYnBmLmg+XSwKKwkgICAgW3JldHVybiAoQklPQ1JPVFpCVUYgKyBCUEZfQlVGTU9ERV9aQlVGKTtdLAorCSAgICBbICAKKwkJQUNfTVNHX1JFU1VMVCh5ZXMpCisJCUFDX0RFRklORShIQVZFX1pFUk9DT1BZX0JQRiwgMSwKKwkJW2RlZmluZSBpZiB0aGUgc3lzdGVtIHN1cHBvcnRzIHplcm9jb3B5IEJQRl0pCisJICAgIF0sCisJICAgIEFDX01TR19SRVNVTFQobm8pKQorCisJICAgICMKKwkgICAgIyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgc3RydWN0IEJQRl9USU1FVkFMLgorCSAgICAjCisJICAgIEFDX0NIRUNLX1RZUEVTKHN0cnVjdCBCUEZfVElNRVZBTCwsLAorCQlbCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaWZkZWYgSEFWRV9TWVNfSU9DQ09NX0gKKyNpbmNsdWRlIDxzeXMvaW9jY29tLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXQvYnBmLmg+CisJCSAgICBdKQorCTs7CisKK2RhZykKKwlWX0RFRlM9IiRWX0RFRlMgLUREQUdfT05MWSIKKwk7OworCitzZXB0ZWwpCisJVl9ERUZTPSIkVl9ERUZTIC1EU0VQVEVMX09OTFkiCisJOzsKKworc25mKQorCVZfREVGUz0iJFZfREVGUyAtRFNORl9PTkxZIgorCTs7CisKK251bGwpCisJQUNfTVNHX1dBUk4oY2Fubm90IGRldGVybWluZSBwYWNrZXQgY2FwdHVyZSBpbnRlcmZhY2UpCisJQUNfTVNHX1dBUk4oKHNlZSB0aGUgSU5TVEFMTCBkb2MgZm9yIG1vcmUgaW5mbykpCisJOzsKK2VzYWMKKworZG5sCitkbmwgTm93IGZpZ3VyZSBvdXQgaG93IHdlIGdldCBhIGxpc3Qgb2YgaW50ZXJmYWNlcyBhbmQgYWRkcmVzc2VzLAorZG5sIGlmIHdlIHN1cHBvcnQgY2FwdHVyaW5nLiAgRG9uJ3QgYm90aGVyIGlmIHdlIGRvbid0IHN1cHBvcnQKK2RubCBjYXB0dXJpbmcuCitkbmwKK2lmIHRlc3QgIiRWX1BDQVAiID0gbnVsbAordGhlbgorCSMKKwkjIFdlIGNhbid0IGNhcHR1cmUsIHNvIHdlIGNhbid0IG9wZW4gYW55IGNhcHR1cmUKKwkjIGRldmljZXMsIHNvIHdlIHdvbid0IHJldHVybiBhbnkgaW50ZXJmYWNlcy4KKwkjCisJVl9GSU5EQUxMREVWUz1udWxsCitlbHNlCisJQUNfQ0hFQ0tfRlVOQyhnZXRpZmFkZHJzLFsKKwkJIworCQkjIFdlIGhhdmUgImdldGlmYWRkcnMoKSI7IG1ha2Ugc3VyZSB3ZSBoYXZlIDxpZmFkZHJzLmg+CisJCSMgYXMgd2VsbCwganVzdCBpbiBjYXNlIHNvbWUgcGxhdGZvcm0gaXMgcmVhbGx5IHdlaXJkLgorCQkjCisJCUFDX0NIRUNLX0hFQURFUihpZmFkZHJzLmgsWworCQkgICAgIworCQkgICAgIyBXZSBoYXZlIHRoZSBoZWFkZXIsIHNvIHdlIHVzZSAiZ2V0aWZhZGRycygpIiB0bworCQkgICAgIyBnZXQgdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcy4KKwkJICAgICMKKwkJICAgIFZfRklOREFMTERFVlM9Z2V0YWQKKwkJXSxbCisJCSAgICAjCisJCSAgICAjIFdlIGRvbid0IGhhdmUgdGhlIGhlYWRlciAtIGdpdmUgdXAuCisJCSAgICAjIFhYWCAtIHdlIGNvdWxkIGFsc28gZmFsbCBiYWNrIG9uIHNvbWUgb3RoZXIKKwkJICAgICMgbWVjaGFuaXNtLCBidXQsIGZvciBub3csIHRoaXMnbGwgY2F0Y2ggdGhpcworCQkgICAgIyBwcm9ibGVtIHNvIHRoYXQgd2UgY2FuIGF0IGxlYXN0IHRyeSB0byBmaWd1cmUKKwkJICAgICMgb3V0IHNvbWV0aGluZyB0byBkbyBvbiBzeXN0ZW1zIHdpdGggImdldGlmYWRkcnMoKSIKKwkJICAgICMgYnV0IHdpdGhvdXQgImlmYWRkcnMuaCIsIGlmIHRoZXJlIGlzIHNvbWV0aGluZworCQkgICAgIyB3ZSBjYW4gZG8gb24gdGhvc2Ugc3lzdGVtcy4KKwkJICAgICMKKwkJICAgIEFDX01TR19FUlJPUihbWW91ciBzeXN0ZW0gaGFzIGdldGlmYWRkcnMoKSBidXQgZG9lc24ndCBoYXZlIGEgdXNhYmxlIDxpZmFkZHJzLmg+Ll0pCisJCV0pCisJXSxbCisJCSMKKwkJIyBXZWxsLCB3ZSBkb24ndCBoYXZlICJnZXRpZmFkZHJzKCkiLCBzbyB3ZSBoYXZlIHRvIHVzZQorCQkjIHNvbWUgb3RoZXIgbWVjaGFuaXNtOyBkZXRlcm1pbmUgd2hhdCB0aGF0IG1lY2hhbmlzbSBpcy4KKwkJIworCQkjIFRoZSBmaXJzdCB0aGluZyB3ZSB1c2UgaXMgdGhlIHR5cGUgb2YgY2FwdHVyZSBtZWNoYW5pc20sCisJCSMgd2hpY2ggaXMgc29tZXdoYXQgb2YgYSBwcm94eSBmb3IgdGhlIE9TIHdlJ3JlIHVzaW5nLgorCQkjCisJCWNhc2UgIiRWX1BDQVAiIGluCisKKwkJZGxwaXxsaWJkbHBpKQorCQkJQUNfQ0hFQ0tfSEVBREVSUyhzeXMvYnVmbW9kLmggc3lzL2RscGlfZXh0LmgpCisJCQkjCisJCQkjIFRoaXMgbWlnaHQgYmUgU29sYXJpcyA4IG9yIGxhdGVyLCB3aXRoCisJCQkjIFNJT0NHTElGQ09ORiwgb3IgaXQgbWlnaHQgYmUgc29tZSBvdGhlciBPUworCQkJIyBvciBzb21lIG9sZGVyIHZlcnNpb24gb2YgU29sYXJpcywgd2l0aAorCQkJIyBqdXN0IFNJT0NHSUZDT05GLgorCQkJIworCQkJQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgd2UgaGF2ZSBTSU9DR0xJRkNPTkYpCisJCQlBQ19DQUNIRV9WQUwoYWNfY3ZfbGJsX2hhdmVfc2lvY2dsaWZjb25mLAorCQkJICAgIEFDX1RSWV9DT01QSUxFKAorCQkJCVsjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisJCQkJI2luY2x1ZGUgPHN5cy9maWxlLmg+CisJCQkJI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorCQkJCSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisJCQkJI2luY2x1ZGUgPHN5cy9zb2NraW8uaD5dLAorCQkJCVtpb2N0bCgwLCBTSU9DR0xJRkNPTkYsIChjaGFyICopMCk7XSwKKwkJCQlhY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmY9eWVzLAorCQkJCWFjX2N2X2xibF9oYXZlX3Npb2NnbGlmY29uZj1ubykpCisJCQlBQ19NU0dfUkVTVUxUKCRhY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmYpCisJCQlpZiB0ZXN0ICRhY19jdl9sYmxfaGF2ZV9zaW9jZ2xpZmNvbmYgPSB5ZXMgOyB0aGVuCisJCQkJVl9GSU5EQUxMREVWUz1nbGlmYworCQkJZWxzZQorCQkJCVZfRklOREFMTERFVlM9Z2lmYworCQkJZmkKKwkJCSMKKwkJCSMgTmVlZGVkIGZvciBjb21tb24gZnVuY3Rpb25zIHVzZWQgYnkgcGNhcC1bZGxwaSxsaWJkbHBpXS5jCisJCQkjCisJCSAJU1NSQz0iZGxwaXN1YnMuYyIKKwkJCTs7CisKKwkJKikKKwkJCSMKKwkJCSMgQXNzdW1lIHdlIGp1c3QgaGF2ZSBTSU9DR0lGQ09ORi4KKwkJCSMgKFhYWCAtIG9uIGF0IGxlYXN0IGxhdGVyIExpbnV4IGtlcm5lbHMsIHRoZXJlJ3MKKwkJCSMgYW5vdGhlciBtZWNoYW5pc20sIGFuZCB3ZSBzaG91bGQgYmUgdXNpbmcgdGhhdAorCQkJIyBpbnN0ZWFkLikKKwkJCSMKKwkJCVZfRklOREFMTERFVlM9Z2lmYworCQkJOzsKKwkJZXNhY10pCitmaQorXSkKKworQUNfTVNHX0NIRUNLSU5HKGZvciBzb2NrbGVuX3QpCitBQ19UUllfQ09NUElMRShbCisJI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisJXSwKKwlbIHNvY2tsZW5fdCB4OyBdLAorCWhhdmVfc29ja2xlbl90PXllcywKKwloYXZlX3NvY2tsZW5fdD1ubykKK2lmIHRlc3QgIngkaGF2ZV9zb2NrbGVuX3QiID0gInh5ZXMiOyB0aGVuCisJQUNfREVGSU5FKEhBVkVfU09DS0xFTl9ULCAxLCBbZGVmaW5lIGlmIHNvY2tsZW5fdCBpcyBkZWZpbmVkXSkKK2ZpCitBQ19NU0dfUkVTVUxUKCRoYXZlX3NvY2tsZW5fdCkKKworQUNfQVJHX0VOQUJMRShpcHY2LAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWlwdjZdLFtidWlsZCBJUHY2LWNhcGFibGUgdmVyc2lvbiBAPDpAZGVmYXVsdD15ZXMsIGlmIGdldGFkZHJpbmZvIGF2YWlsYWJsZUA6PkBdKSwKKyAgICBbXSwKKyAgICBbZW5hYmxlX2lwdjY9aWZhdmFpbGFibGVdKQoraWYgdGVzdCAiJGVuYWJsZV9pcHY2IiAhPSAibm8iOyB0aGVuCisJQUNfQ0hFQ0tfRlVOQyhnZXRhZGRyaW5mbywKKwkgICAgWworCQlBQ19ERUZJTkUoSU5FVDYsMSxbSVB2Nl0pCisJICAgIF0sCisJICAgIFsKKwkJaWYgdGVzdCAiJGVuYWJsZV9pcHY2IiAhPSAiaWZhdmFpbGFibGUiOyB0aGVuCisJCQlBQ19NU0dfRkFJTFVSRShbLS1lbmFibGUtaXB2NiB3YXMgZ2l2ZW4sIGJ1dCBnZXRhZGRyaW5mbyBpc24ndCBhdmFpbGFibGVdKQorCQlmaQorCSAgICBdKQorZmkKKworQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgdG8gYnVpbGQgb3B0aW1pemVyIGRlYnVnZ2luZyBjb2RlKQorQUNfQVJHX0VOQUJMRShvcHRpbWl6ZXItZGJnLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLW9wdGltaXplci1kYmddLFtidWlsZCBvcHRpbWl6ZXIgZGVidWdnaW5nIGNvZGVdKSkKK2lmIHRlc3QgIiRlbmFibGVfb3B0aW1pemVyX2RiZyIgPSAieWVzIjsgdGhlbgorCUFDX0RFRklORShCREVCVUcsMSxbRW5hYmxlIG9wdGltaXplciBkZWJ1Z2dpbmddKQorZmkKK0FDX01TR19SRVNVTFQoJHtlbmFibGVfb3B0aW1pemVyX2RiZy1ub30pCisKK0FDX01TR19DSEVDS0lORyh3aGV0aGVyIHRvIGJ1aWxkIHBhcnNlciBkZWJ1Z2dpbmcgY29kZSkKK0FDX0FSR19FTkFCTEUoeXlkZWJ1ZywKK0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS15eWRlYnVnXSxbYnVpbGQgcGFyc2VyIGRlYnVnZ2luZyBjb2RlXSkpCitpZiB0ZXN0ICIkZW5hYmxlX3l5ZGVidWciID0gInllcyI7IHRoZW4KKwlBQ19ERUZJTkUoWVlERUJVRywxLFtFbmFibGUgcGFyc2VyIGRlYnVnZ2luZ10pCitmaQorQUNfTVNHX1JFU1VMVCgke2VuYWJsZV95eWRlYnVnLW5vfSkKKworIyBDaGVjayBmb3IgRW5kYWNlIERBRyBjYXJkIHN1cHBvcnQuCitBQ19BUkdfV0lUSChbZGFnXSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGFnQDw6QD1ESVJAOj5AXSxbaW5jbHVkZSBFbmRhY2UgREFHIHN1cHBvcnQgQDw6QCJ5ZXMiLCAibm8iIG9yIERJUjsgZGVmYXVsdD0ieWVzIiBvbiBCU0QgYW5kIExpbnV4IGlmIHByZXNlbnRAOj5AXSksCitbCisJaWYgdGVzdCAiJHdpdGh2YWwiID0gbm8KKwl0aGVuCisJCSMgVXNlciBkb2Vzbid0IHdhbnQgREFHIHN1cHBvcnQuCisJCXdhbnRfZGFnPW5vCisJZWxpZiB0ZXN0ICIkd2l0aHZhbCIgPSB5ZXMKKwl0aGVuCisJCSMgVXNlciB3YW50cyBEQUcgc3VwcG9ydCBidXQgaGFzbid0IHNwZWNpZmllZCBhIGRpcmVjdG9yeS4KKwkJd2FudF9kYWc9eWVzCisJZWxzZQorCQkjIFVzZXIgd2FudHMgREFHIHN1cHBvcnQgYW5kIGhhcyBzcGVjaWZpZWQgYSBkaXJlY3RvcnksIHNvIHVzZSB0aGUgcHJvdmlkZWQgdmFsdWUuCisJCXdhbnRfZGFnPXllcworCQlkYWdfcm9vdD0kd2l0aHZhbAorCWZpCitdLFsKKwkjCisJIyBVc2UgREFHIEFQSSBpZiBwcmVzZW50LCBvdGhlcndpc2UgZG9uJ3QKKwkjCisJd2FudF9kYWc9aWZwcmVzZW50CitdKQorCitBQ19BUkdfV0lUSChbZGFnLWluY2x1ZGVzXSwKK0FDX0hFTFBfU1RSSU5HKFstLXdpdGgtZGFnLWluY2x1ZGVzPURJUl0sW0VuZGFjZSBEQUcgaW5jbHVkZSBkaXJlY3RvcnldKSwKK1sKKwkjIFVzZXIgd2FudHMgREFHIHN1cHBvcnQgYW5kIGhhcyBzcGVjaWZpZWQgYSBoZWFkZXIgZGlyZWN0b3J5LCBzbyB1c2UgdGhlIHByb3ZpZGVkIHZhbHVlLgorCXdhbnRfZGFnPXllcworCWRhZ19pbmNsdWRlX2Rpcj0kd2l0aHZhbAorXSxbXSkKKworQUNfQVJHX1dJVEgoW2RhZy1saWJyYXJpZXNdLAorQUNfSEVMUF9TVFJJTkcoWy0td2l0aC1kYWctbGlicmFyaWVzPURJUl0sW0VuZGFjZSBEQUcgbGlicmFyeSBkaXJlY3RvcnldKSwKK1sKKwkjIFVzZXIgd2FudHMgREFHIHN1cHBvcnQgYW5kIGhhcyBzcGVjaWZpZWQgYSBsaWJyYXJ5IGRpcmVjdG9yeSwgc28gdXNlIHRoZSBwcm92aWRlZCB2YWx1ZS4KKwl3YW50X2RhZz15ZXMKKwlkYWdfbGliX2Rpcj0kd2l0aHZhbAorXSxbXSkKKworY2FzZSAiJFZfUENBUCIgaW4KK2xpbnV4fGJwZnxkYWcpCisJIworCSMgV2Ugc3VwcG9ydCB0aGUgREFHIEFQSSBpZiB3ZSdyZSBvbiBMaW51eCBvciBCU0QsIG9yIGlmIHdlJ3JlCisJIyBidWlsZGluZyBhIERBRy1vbmx5IGxpYnBjYXAuCisJIworCTs7CisqKQorCSMKKwkjIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIERBRywgdGVsbCB0aGVtIGl0J3Mgbm90CisJIyBzdXBwb3J0ZWQuCisJIworCSMgSWYgdGhleSBleHByZXNzZWQgbm8gcHJlZmVyZW5jZSwgZG9uJ3QgaW5jbHVkZSBpdC4KKwkjCisJaWYgdGVzdCAkd2FudF9kYWcgPSB5ZXM7IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFtEQUcgc3VwcG9ydCBpcyBvbmx5IGF2YWlsYWJsZSB3aXRoICdsaW51eCcgJ2JwZicgYW5kICdkYWcnIHBhY2tldCBjYXB0dXJlIHR5cGVzXSkKKwllbGlmIHRlc3QgJHdhbnRfZGFnID0geWVzOyB0aGVuCisJCXdhbnRfZGFnPW5vCisJZmkKKwk7OworZXNhYworCithY19jdl9sYmxfZGFnX2FwaT1ubworaWYgdGVzdCAiJHdhbnRfZGFnIiAhPSBubzsgdGhlbgorCisJQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHdlIGhhdmUgREFHIEFQSSBoZWFkZXJzXSkKKworCSMgSWYgbmVjZXNzYXJ5LCBzZXQgZGVmYXVsdCBwYXRocyBmb3IgREFHIEFQSSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMuCisJaWYgdGVzdCAteiAiJGRhZ19yb290IjsgdGhlbgorCSAgICBkYWdfcm9vdD0vdXNyL2xvY2FsCisJZmkKKworCWlmIHRlc3QgLXogIiRkYWdfaW5jbHVkZV9kaXIiOyB0aGVuCisJCWRhZ19pbmNsdWRlX2Rpcj0iJGRhZ19yb290L2luY2x1ZGUiCisJZmkKKworCWlmIHRlc3QgLXogIiRkYWdfbGliX2RpciI7IHRoZW4KKwkgICAgZGFnX2xpYl9kaXI9IiRkYWdfcm9vdC9saWIiCisJZmkKKwkKKwlpZiB0ZXN0IC16ICIkZGFnX3Rvb2xzX2RpciI7IHRoZW4KKwkgICAgZGFnX3Rvb2xzX2Rpcj0iJGRhZ19yb290L3Rvb2xzIgorCWZpCisKKwlpZiB0ZXN0IC1yICRkYWdfaW5jbHVkZV9kaXIvZGFnYXBpLmg7IHRoZW4KKwkJYWNfY3ZfbGJsX2RhZ19hcGk9eWVzCisJZmkKKwlBQ19NU0dfUkVTVUxUKFskYWNfY3ZfbGJsX2RhZ19hcGkgKCRkYWdfaW5jbHVkZV9kaXIpXSkKK2ZpCisKK2lmIHRlc3QgJGFjX2N2X2xibF9kYWdfYXBpID0geWVzOyB0aGVuCisJVl9JTkNMUz0iJFZfSU5DTFMgLUkkZGFnX2luY2x1ZGVfZGlyIgorCisJaWYgdGVzdCAkVl9QQ0FQICE9IGRhZyA7IHRoZW4KKwkJIFNTUkM9InBjYXAtZGFnLmMiCisJZmkKKworCSMgU2VlIGlmIHdlIGNhbiBmaW5kIGEgZ2VuZXJhbCB2ZXJzaW9uIHN0cmluZy4KKwkjIERvbid0IG5lZWQgdG8gc2F2ZSBhbmQgcmVzdG9yZSBMSUJTIHRvIHByZXZlbnQgLWxkYWcgYmVpbmcKKwkjIGluY2x1ZGVkIGlmIHRoZXJlJ3MgYSBmb3VuZC1hY3Rpb24gKGFyZyAzKS4KKwlzYXZlZF9sZGZsYWdzPSRMREZMQUdTCisJTERGTEFHUz0iLUwkZGFnX2xpYl9kaXIiCisJQUNfQ0hFQ0tfTElCKFtkYWddLCBbZGFnX2F0dGFjaF9zdHJlYW1dLCBbZGFnX3N0cmVhbXM9IjEiXSwgW2RhZ19zdHJlYW1zPSIwIl0pCisJQUNfQ0hFQ0tfTElCKFtkYWddLFtkYWdfZ2V0X2VyZl90eXBlc10sIFsKKwkJQUNfREVGSU5FKEhBVkVfREFHX0dFVF9FUkZfVFlQRVMsIDEsIFtkZWZpbmUgaWYgeW91IGhhdmUgZGFnX2dldF9lcmZfdHlwZXMoKV0pXSkKKwlBQ19DSEVDS19MSUIoW2RhZ10sW2RhZ19nZXRfc3RyZWFtX2VyZl90eXBlc10sIFsKKwkJQUNfREVGSU5FKEhBVkVfREFHX0dFVF9TVFJFQU1fRVJGX1RZUEVTLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcygpXSldKQorCisJTERGTEFHUz0kc2F2ZWRfbGRmbGFncworCisJaWYgdGVzdCAiJGRhZ19zdHJlYW1zIiA9IDE7IHRoZW4KKwkJQUNfREVGSU5FKEhBVkVfREFHX1NUUkVBTVNfQVBJLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIHN0cmVhbXMgY2FwYWJsZSBEQUcgQVBJXSkKKwkJTElCUz0iJExJQlMgLWxkYWciCisJCUxERkxBR1M9IiRMREZMQUdTIC1MJGRhZ19saWJfZGlyIgorCQkKKwkJQUNfQ0hFQ0tfTElCKFt2ZGFnXSxbdmRhZ19zZXRfZGV2aWNlX2luZm9dLCBbYWNfZGFnX2hhdmVfdmRhZz0iMSJdLCBbYWNfZGFnX2hhdmVfdmRhZz0iMCJdKQorCQlpZiB0ZXN0ICIkYWNfZGFnX2hhdmVfdmRhZyIgPSAxOyB0aGVuCisJCQlBQ19ERUZJTkUoSEFWRV9EQUdfVkRBRywgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSB2ZGFnX3NldF9kZXZpY2VfaW5mbygpXSkKKwkJCUxJQlM9IiRMSUJTIC1scHRocmVhZCIKKwkJZmkKKwlmaQorCisJQUNfREVGSU5FKEhBVkVfREFHX0FQSSwgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSB0aGUgREFHIEFQSV0pCitmaQorCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB3ZSBoYXZlIHRoZSBEQUcgQVBJKQorCitpZiB0ZXN0ICRhY19jdl9sYmxfZGFnX2FwaSA9IG5vOyB0aGVuCisJQUNfTVNHX1JFU1VMVChubykKKwlpZiB0ZXN0ICIkd2FudF9kYWciID0geWVzOyB0aGVuCisgICAgICAgIAkjIFVzZXIgd2FudGVkIERBRyBzdXBwb3J0IGJ1dCB3ZSBjb3VsZG4ndCBmaW5kIGl0LgorCQlBQ19NU0dfRVJST1IoW0RBRyBBUEkgcmVxdWVzdGVkLCBidXQgbm90IGZvdW5kIGF0ICRkYWdfcm9vdDogdXNlIC0td2l0aG91dC1kYWddKQorCWZpCisKKwlpZiB0ZXN0ICIkVl9QQ0FQIiA9IGRhZzsgdGhlbgorCQkjIFVzZXIgcmVxdWVzdGVkICJkYWciIGNhcHR1cmUgdHlwZSBidXQgdGhlIERBRyBBUEkgd2Fzbid0CisJCSMgZm91bmQuCisJCUFDX01TR19FUlJPUihbU3BlY2lmeWluZyB0aGUgY2FwdHVyZSB0eXBlIGFzICJkYWciIHJlcXVpcmVzIHRoZSBEQUcgQVBJIHRvIGJlIHByZXNlbnQ7IHVzZSB0aGUgLS13aXRoLWRhZyBvcHRpb25zIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uLiAoVHJ5ICIuL2NvbmZpZ3VyZSAtLWhlbHAiIGZvciBtb3JlIGluZm9ybWF0aW9uLildKQorCWZpCitlbHNlCisJQUNfTVNHX1JFU1VMVCh5ZXMpCitmaQorCitBQ19BUkdfV0lUSChzZXB0ZWwsCitBQ19IRUxQX1NUUklORyhbLS13aXRoLXNlcHRlbEA8OkA9RElSQDo+QF0sW2luY2x1ZGUgU2VwdGVsIHN1cHBvcnQgKGxvY2F0ZWQgaW4gZGlyZWN0b3J5IERJUiwgaWYgc3VwcGxpZWQpLiAgQDw6QGRlZmF1bHQ9eWVzLCBvbiBMaW51eCwgaWYgcHJlc2VudEA6PkBdKSwKK1sKKwlpZiB0ZXN0ICIkd2l0aHZhbCIgPSBubworCXRoZW4KKwkJd2FudF9zZXB0ZWw9bm8KKwllbGlmIHRlc3QgIiR3aXRodmFsIiA9IHllcworCXRoZW4KKwkJd2FudF9zZXB0ZWw9eWVzCisJCXNlcHRlbF9yb290PQorCWVsc2UKKwkJd2FudF9zZXB0ZWw9eWVzCisJCXNlcHRlbF9yb290PSR3aXRodmFsCisJZmkKK10sWworCSMKKwkjIFVzZSBTZXB0ZWwgQVBJIGlmIHByZXNlbnQsIG90aGVyd2lzZSBkb24ndAorCSMKKwl3YW50X3NlcHRlbD1pZnByZXNlbnQKKwlzZXB0ZWxfcm9vdD0uLy4uL3NlcHRlbAorXSkKK2FjX2N2X2xibF9zZXB0ZWxfYXBpPW5vCitjYXNlICIkVl9QQ0FQIiBpbgorbGludXh8c2VwdGVsKQorCSMKKwkjIFdlIHN1cHBvcnQgdGhlIFNlcHRlbCBBUEkgaWYgd2UncmUgb24gTGludXgsIG9yIGlmIHdlJ3JlIGJ1aWxkaW5nCisJIyBhIFNlcHRlbC1vbmx5IGxpYnBjYXAuCisJIworCTs7CisqKQorCSMKKwkjIElmIHRoZSB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIFNlcHRlbCwgdGVsbCB0aGVtIGl0J3Mgbm90CisJIyBzdXBwb3J0ZWQuCisJIworCSMgSWYgdGhleSBleHByZXNzZWQgbm8gcHJlZmVyZW5jZSwgZG9uJ3QgaW5jbHVkZSBpdC4KKwkjCisJaWYgdGVzdCAkd2FudF9zZXB0ZWwgPSB5ZXM7IHRoZW4KKwkJQUNfTVNHX0VSUk9SKFNlcHRlbCBzdXBwb3J0IG9ubHkgYXZhaWxhYmxlIHdpdGggJ2xpbnV4JyBhbmQgJ3NlcHRlbCcgcGFja2V0IGNhcHR1cmUgdHlwZXMpCisJZWxpZiB0ZXN0ICR3YW50X3NlcHRlbCA9IHllczsgdGhlbgorCQl3YW50X3NlcHRlbD1ubworCWZpCisJOzsKK2VzYWMKKworaWYgdGVzdCAiJHdpdGhfc2VwdGVsIiAhPSBubzsgdGhlbgorCUFDX01TR19DSEVDS0lORyh3aGV0aGVyIHdlIGhhdmUgU2VwdGVsIEFQSSkKKworCWlmIHRlc3QgLXogIiRzZXB0ZWxfcm9vdCI7IHRoZW4KKwkJc2VwdGVsX3Jvb3Q9JHNyY2Rpci8uLi9zZXB0ZWwKKwlmaQorCisJc2VwdGVsX3Rvb2xzX2Rpcj0iJHNlcHRlbF9yb290IgorCXNlcHRlbF9pbmNsdWRlX2Rpcj0iJHNlcHRlbF9yb290L0lOQyIKKworCWFjX2N2X2xibF9zZXB0ZWxfYXBpPW5vCisJaWYgdGVzdCAtciAiJHNlcHRlbF9pbmNsdWRlX2Rpci9tc2cuaCI7IHRoZW4KKwkJVl9JTkNMUz0iJFZfSU5DTFMgLUkkc2VwdGVsX2luY2x1ZGVfZGlyIgorCQlBRERMT0JKUz0iJEFERExPQkpTICRzZXB0ZWxfdG9vbHNfZGlyL2FzY2lpYmluLm8gJHNlcHRlbF90b29sc19kaXIvYml0MmJ5dGUubyAkc2VwdGVsX3Rvb2xzX2Rpci9jb25maXJtLm8gJHNlcHRlbF90b29sc19kaXIvZm10bXNnLm8gJHNlcHRlbF90b29sc19kaXIvZ2N0X3VuaXgubyAkc2VwdGVsX3Rvb2xzX2Rpci9ocXVldWUubyAkc2VwdGVsX3Rvb2xzX2Rpci9pZGVudC5vICRzZXB0ZWxfdG9vbHNfZGlyL21lbS5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhY2subyAkc2VwdGVsX3Rvb2xzX2Rpci9wYXJzZS5vICRzZXB0ZWxfdG9vbHNfZGlyL3Bvb2wubyAkc2VwdGVsX3Rvb2xzX2Rpci9zZGxzaWcubyAkc2VwdGVsX3Rvb2xzX2Rpci9zdHJ0b251bS5vICRzZXB0ZWxfdG9vbHNfZGlyL3RpbWVyLm8gJHNlcHRlbF90b29sc19kaXIvdHJhY2UubyIKKwkJQURETEFSQ0hJVkVPQkpTPSIkQURETEFSQ0hJVkVPQkpTICRzZXB0ZWxfdG9vbHNfZGlyL2FzY2lpYmluLm8gJHNlcHRlbF90b29sc19kaXIvYml0MmJ5dGUubyAkc2VwdGVsX3Rvb2xzX2Rpci9jb25maXJtLm8gJHNlcHRlbF90b29sc19kaXIvZm10bXNnLm8gJHNlcHRlbF90b29sc19kaXIvZ2N0X3VuaXgubyAkc2VwdGVsX3Rvb2xzX2Rpci9ocXVldWUubyAkc2VwdGVsX3Rvb2xzX2Rpci9pZGVudC5vICRzZXB0ZWxfdG9vbHNfZGlyL21lbS5vICRzZXB0ZWxfdG9vbHNfZGlyL3BhY2subyAkc2VwdGVsX3Rvb2xzX2Rpci9wYXJzZS5vICRzZXB0ZWxfdG9vbHNfZGlyL3Bvb2wubyAkc2VwdGVsX3Rvb2xzX2Rpci9zZGxzaWcubyAkc2VwdGVsX3Rvb2xzX2Rpci9zdHJ0b251bS5vICRzZXB0ZWxfdG9vbHNfZGlyL3RpbWVyLm8gJHNlcHRlbF90b29sc19kaXIvdHJhY2UubyIKKworCQlpZiB0ZXN0ICIkVl9QQ0FQIiAhPSBzZXB0ZWwgOyB0aGVuCisJCQkgU1NSQz0icGNhcC1zZXB0ZWwuYyIKKwkJZmkKKwkJYWNfY3ZfbGJsX3NlcHRlbF9hcGk9eWVzCisJZmkKKworCUFDX01TR19SRVNVTFQoJGFjX2N2X2xibF9zZXB0ZWxfYXBpKQorCWlmIHRlc3QgJGFjX2N2X2xibF9zZXB0ZWxfYXBpID0gbm87IHRoZW4KKwkJaWYgdGVzdCAiJHdhbnRfc2VwdGVsIiA9IHllczsgdGhlbgorCQkJQUNfTVNHX0VSUk9SKFNlcHRlbCBBUEkgbm90IGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAkc2VwdGVsX3Jvb3Q7IHVzZSAtLXdpdGhvdXQtc2VwdGVsKQorCQlmaQorCWVsc2UKKwkJQUNfREVGSU5FKEhBVkVfU0VQVEVMX0FQSSwgMSwgW2RlZmluZSBpZiB5b3UgaGF2ZSBhIFNlcHRlbCBBUEldKQorCWZpCitmaQorCitpZiB0ZXN0ICIkVl9QQ0FQIiA9IHNlcHRlbCAtYSAiJGFjX2N2X2xibF9zZXB0ZWxfYXBpIiA9IG5vOyB0aGVuCisJQUNfTVNHX0VSUk9SKFNwZWNpZnlpbmcgdGhlIGNhcHR1cmUgdHlwZSBhcyAnc2VwdGVsJyByZXF1aXJlcyB0aGUgU2VwdGVsIEFQSSB0byBiZSBwcmVzZW50OyB1c2UgLS13aXRoLXNlcHRlbD1ESVIpCitmaQorCisjIENoZWNrIGZvciBNeXJpY29tIFNORiBzdXBwb3J0LgorQUNfQVJHX1dJVEgoW3NuZl0sCitBQ19IRUxQX1NUUklORyhbLS13aXRoLXNuZkA8OkA9RElSQDo+QF0sW2luY2x1ZGUgTXlyaWNvbSBTTkYgc3VwcG9ydCBAPDpAInllcyIsICJubyIgb3IgRElSOyBkZWZhdWx0PSJ5ZXMiIG9uIEJTRCBhbmQgTGludXggaWYgcHJlc2VudEA6PkBdKSwKK1sKKwlpZiB0ZXN0ICIkd2l0aHZhbCIgPSBubworCXRoZW4KKwkJIyBVc2VyIGV4cGxpY2l0bHkgZG9lc24ndCB3YW50IFNORgorCQl3YW50X3NuZj1ubworCWVsaWYgdGVzdCAiJHdpdGh2YWwiID0geWVzCisJdGhlbgorCQkjIFVzZXIgd2FudHMgU05GIHN1cHBvcnQgYnV0IGhhc24ndCBzcGVjaWZpYyBhIGRpcmVjdG9yeS4KKwkJd2FudF9zbmY9eWVzCisJZWxzZQorCQkjIFVzZXIgd2FudHMgU05GIHN1cHBvcnQgd2l0aCBhIHNwZWNpZmllZCBkaXJlY3RvcnkuCisJCXdhbnRfc25mPXllcworCQlzbmZfcm9vdD0kd2l0aHZhbAorCWZpCitdLFsKKwkjCisJIyBVc2UgU25pZmZlciBBUEkgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIGRvbid0CisJIworCXdhbnRfc25mPWlmcHJlc2VudAorXSkKKworQUNfQVJHX1dJVEgoW3NuZi1pbmNsdWRlc10sCitBQ19IRUxQX1NUUklORyhbLS13aXRoLXNuZi1pbmNsdWRlcz1ESVJdLFtNeXJpY29tIFNORiBpbmNsdWRlIGRpcmVjdG9yeV0pLAorWworCSMgVXNlciB3YW50cyBTTkYgd2l0aCBzcGVjaWZpYyBoZWFkZXIgZGlyZWN0b3J5CisJd2FudF9zbmY9eWVzCisJc25mX2luY2x1ZGVfZGlyPSR3aXRodmFsCitdLFtdKQorCitBQ19BUkdfV0lUSChbc25mLWxpYnJhcmllc10sCitBQ19IRUxQX1NUUklORyhbLS13aXRoLXNuZi1saWJyYXJpZXM9RElSXSxbTXlyaWNvbSBTTkYgbGlicmFyeSBkaXJlY3RvcnldKSwKK1sKKwkjIFVzZXIgd2FudHMgU05GIHdpdGggc3BlY2lmaWMgbGliIGRpcmVjdG9yeQorCXdhbnRfc25mPXllcworCXNuZl9saWJfZGlyPSR3aXRodmFsCitdLFtdKQorCitjYXNlICIkVl9QQ0FQIiBpbgorYnBmfGxpbnV4fHNuZikKKwkjCisJIyBXZSBzdXBwb3J0IHRoZSBTbmlmZmVyIEFQSSBpZiB3ZSdyZSBvbiBCU0QsIExpbnV4LCBvciBpZiB3ZSdyZQorCSMgYnVpbGRpbmcgYSBTbmlmZmVyLW9ubHkgbGlicGNhcC4KKwkjCisJOzsKKyopCisJIworCSMgSWYgdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgU25pZmZlciwgdGVsbCB0aGVtIGl0J3Mgbm90CisJIyBzdXBwb3J0ZWQuCisJIworCSMgSWYgdGhleSBleHByZXNzZWQgbm8gcHJlZmVyZW5jZSwgZG9uJ3QgaW5jbHVkZSBpdC4KKwkjCisJaWYgdGVzdCAkd2FudF9zbmYgPSB5ZXM7IHRoZW4KKwkJQUNfTVNHX0VSUk9SKE15cmljb20gU05GIHN1cHBvcnQgb25seSBhdmFpbGFibGUgd2l0aCAnYnBmJyAnbGludXgnIGFuZCAnc25mJyBwYWNrZXQgY2FwdHVyZSB0eXBlcykKKwllbGlmIHRlc3QgJHdhbnRfc25mID0geWVzOyB0aGVuCisJCXdhbnRfc25mPW5vCisJZmkKKwk7OworZXNhYworCithY19jdl9sYmxfc25mX2FwaT1ubworaWYgdGVzdCAiJHdpdGhfc25mIiAhPSBubzsgdGhlbgorCisJQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgd2UgaGF2ZSBNeXJpY29tIFNuaWZmZXIgQVBJKQorCisJaWYgdGVzdCAteiAiJHNuZl9yb290IjsgdGhlbgorCQlzbmZfcm9vdD0vb3B0L3NuZgorCWZpCisKKwlpZiB0ZXN0IC16ICIkc25mX2luY2x1ZGVfZGlyIjsgdGhlbgorCQlzbmZfaW5jbHVkZV9kaXI9IiRzbmZfcm9vdC9pbmNsdWRlIgorCWZpCisKKwlpZiB0ZXN0IC16ICIkc25mX2xpYl9kaXIiOyB0aGVuCisJCXNuZl9saWJfZGlyPSIkc25mX3Jvb3QvbGliIgorCWZpCisKKwlpZiB0ZXN0IC1mICIkc25mX2luY2x1ZGVfZGlyL3NuZi5oIjsgdGhlbgorCQlhY19jdl9sYmxfc25mX2FwaT15ZXMKKwlmaQorCUFDX01TR19SRVNVTFQoWyRhY19jdl9sYmxfc25mX2FwaSAoJHNuZl9yb290KV0pCisKKwlpZiB0ZXN0ICRhY19jdl9sYmxfc25mX2FwaSA9IG5vOyB0aGVuCisJCWlmIHRlc3QgIiR3YW50X3NuZiIgPSB5ZXM7IHRoZW4KKwkJCUFDX01TR19FUlJPUihTTkYgQVBJIGhlYWRlcnMgbm90IGZvdW5kIHVuZGVyICRzbmZfaW5jbHVkZV9kaXI7IHVzZSAtLXdpdGhvdXQtc25mKQorCQlmaQorCWVsc2UKKwkJc2F2ZWRfbGRmbGFncz0kTERGTEFHUworCQlMREZMQUdTPSIkTERGTEFHUyAtTCRzbmZfbGliX2RpciIKKwkJQUNfQ0hFQ0tfTElCKFtzbmZdLCBbc25mX2luaXRdLCBbYWNfY3ZfbGJsX3NuZl9hcGk9InllcyJdLCBbYWNfY3ZfbGJsX3NuZl9hcGk9Im5vIl0pCisJCUxERkxBR1M9IiRzYXZlZF9sZGZsYWdzIgorCisJCWlmIHRlc3QgJGFjX2N2X2xibF9zbmZfYXBpID0gbm87IHRoZW4KKwkJCWlmIHRlc3QgIiR3YW50X3NuZiIgPSB5ZXM7IHRoZW4KKwkJCQlBQ19NU0dfRVJST1IoU05GIEFQSSBjYW5ub3QgY29ycmVjdGx5IGJlIGxpbmtlZCBjaGVjayBjb25maWcubG9nOyB1c2UgLS13aXRob3V0LXNuZikKKwkJCWZpCisJCWVsc2UKKwkJCVZfSU5DTFM9IiRWX0lOQ0xTIC1JJHNuZl9pbmNsdWRlX2RpciIKKwkJCUxJQlM9IiRMSUJTIC1sc25mIgorCQkJTERGTEFHUz0iJExERkxBR1MgLUwkc25mX2xpYl9kaXIiCisJCQlpZiB0ZXN0ICIkVl9QQ0FQIiAhPSBzbmYgOyB0aGVuCisJCQkJU1NSQz0icGNhcC1zbmYuYyIKKwkJCWZpCisJCQlBQ19ERUZJTkUoSEFWRV9TTkZfQVBJLCAxLCBbZGVmaW5lIGlmIHlvdSBoYXZlIE15cmljb20gU05GIEFQSV0pCisJCWZpCisJZmkKK2ZpCisKK2lmIHRlc3QgIiRWX1BDQVAiID0gc25mIC1hICIkYWNfY3ZfbGJsX3NuZl9hcGkiID0gbm87IHRoZW4KKwlBQ19NU0dfRVJST1IoU3BlY2lmeWluZyB0aGUgY2FwdHVyZSB0eXBlIGFzICdzbmYnIHJlcXVpcmVzIHRoZSBNeXJpY29tIFNuaWZmZXIgQVBJIHRvIGJlIHByZXNlbnQ7IHVzZSAtLXdpdGgtc25mPURJUikKK2ZpCisKK0FDX0xCTF9MRVhfQU5EX1lBQ0MoVl9MRVgsIFZfWUFDQywgcGNhcF8pCitpZiB0ZXN0ICIkVl9MRVgiID0gbGV4IDsgdGhlbgorIyBTb21lIHZlcnNpb25zIG9mIGxleCBjYW4ndCBoYW5kbGUgdGhlIGRlZmluaXRpb25zIHNlY3Rpb24gb2Ygc2Nhbm5lci5sIC4KKyMgVHJ5IGxleGluZyBpdCBhbmQgY29tcGxhaW4gaWYgaXQgY2FuJ3QgZGVhbC4KKwlBQ19DQUNIRV9DSEVDSyhbZm9yIGNhcGFibGUgbGV4XSwgdGNwZHVtcF9jdl9jYXBhYmxlX2xleCwKKwkJaWYgbGV4IC10IHNjYW5uZXIubCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisJCQl0Y3BkdW1wX2N2X2NhcGFibGVfbGV4PXllcworCQllbHNlCisJCQl0Y3BkdW1wX2N2X2NhcGFibGVfbGV4PWluc3VmZmljaWVudAorCQlmaSkKKwlpZiB0ZXN0ICR0Y3BkdW1wX2N2X2NhcGFibGVfbGV4ID0gaW5zdWZmaWNpZW50IDsgdGhlbgorCQlBQ19NU0dfRVJST1IoW1lvdXIgb3BlcmF0aW5nIHN5c3RlbSdzIGxleCBpcyBpbnN1ZmZpY2llbnQgdG8gY29tcGlsZQorIGxpYnBjYXAuICBmbGV4IGlzIGEgbGV4IHJlcGxhY2VtZW50IHRoYXQgaGFzIG1hbnkgYWR2YW50YWdlcywgaW5jbHVkaW5nCisgYmVpbmcgYWJsZSB0byBjb21waWxlIGxpYnBjYXAuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2ZsZXgvZmxleC5odG1sIC5dKQorCWZpCitmaQorCisjCisjIEFzc3VtZSwgYnkgZGVmYXVsdCwgbm8gc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBhbmQgVjcvQlNEIGNvbnZlbnRpb24KKyMgZm9yIG1hbiBwYWdlcyAoZmlsZSBmb3JtYXRzIGluIHNlY3Rpb24gNSwgbWlzY2VsbGFuZW91cyBpbmZvIGluIHNlY3Rpb24gNykuCisjIEluZGl2aWR1YWwgY2FzZXMgY2FuIG92ZXJyaWRlIHRoaXMuCisjCitEWUVYVD0ibm9uZSIKK01BTl9GSUxFX0ZPUk1BVFM9NQorTUFOX01JU0NfSU5GTz03CitjYXNlICIkaG9zdF9vcyIgaW4KKworYWl4KikKKwlkbmwgV29ya2Fyb3VuZCB0byBlbmFibGUgY2VydGFpbiBmZWF0dXJlcworCUFDX0RFRklORShfU1VOLDEsW2RlZmluZSBvbiBBSVggdG8gZ2V0IGNlcnRhaW4gZnVuY3Rpb25zXSkKKworCSMKKwkjIEFJWCBtYWtlcyBpdCBmdW4gdG8gYnVpbGQgc2hhcmVkIGFuZCBzdGF0aWMgbGlicmFyaWVzLAorCSMgYmVjYXVzZSB0aGV5J3JlICpib3RoKiAiLmEiIGFyY2hpdmUgbGlicmFyaWVzLiAgV2UKKwkjIGJ1aWxkIHRoZSBzdGF0aWMgbGlicmFyeSBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIHRyYWRpdGlvbmFsCisJIyBzY2hlbWUgb2YgYnVpbGRpbmcgbGlicGNhcCBhbmQgdGNwZHVtcCBpbiBzdWJkaXJlY3RvcmllcyBvZgorCSMgdGhlIHNhbWUgZGlyZWN0b3J5LCB3aXRoIHRjcGR1bXAgc3RhdGljYWxseSBsaW5rZWQgd2l0aCB0aGUKKwkjIGxpYnBjYXAgaW4gcXVlc3Rpb24sIGJ1dCB3ZSBhbHNvIGJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgYXMKKwkjICJsaWJwY2FwLnNoYXJlZGEiIGFuZCBpbnN0YWxsICppdCosIHJhdGhlciB0aGFuIHRoZSBzdGF0aWMKKwkjIGxpYnJhcnksIGFzICJsaWJwY2FwLmEiLgorCSMKKwlEWUVYVD0ic2hhcmVkYSIKKworCWNhc2UgIiRWX1BDQVAiIGluCisKKwlkbHBpKQorCQkjCisJCSMgSWYgd2UncmUgdXNpbmcgRExQSSwgYXBwbGljYXRpb25zIHdpbGwgbmVlZCB0bworCQkjIHVzZSAvbGliL3BzZS5leHAgaWYgcHJlc2VudCwgYXMgd2UgdXNlIHRoZQorCQkjIFNUUkVBTVMgcm91dGluZXMuCisJCSMKKwkJcHNlZXhlPSIvbGliL3BzZS5leHAiCisJCUFDX01TR19DSEVDS0lORyhmb3IgJHBzZWV4ZSkKKwkJaWYgdGVzdCAtZiAkcHNlZXhlIDsgdGhlbgorCQkJQUNfTVNHX1JFU1VMVCh5ZXMpCisJCQlMSUJTPSItSTokcHNlZXhlIgorCQlmaQorCQk7OworCisJYnBmKQorCQkjCisJCSMgSWYgd2UncmUgdXNpbmcgQlBGLCB3ZSBuZWVkICItbG9kbSIgYW5kICItbGNmZyIsIGFzCisJCSMgd2UgdXNlIHRoZW0gdG8gbG9hZCB0aGUgQlBGIG1vZHVsZS4KKwkJIworCQlMSUJTPSItbG9kbSAtbGNmZyIKKwkJOzsKKwllc2FjCisJOzsKKworZGFyd2luKikKKwlEWUVYVD0iZHlsaWIiCisJVl9DQ09QVD0iJFZfQ0NPUFQgLWZuby1jb21tb24iCisJQUNfQVJHX0VOQUJMRSh1bml2ZXJzYWwsCisJQUNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS11bml2ZXJzYWxdLFtkb24ndCBidWlsZCB1bml2ZXJzYWwgb24gT1MgWF0pKQorCWlmIHRlc3QgIiRlbmFibGVfdW5pdmVyc2FsIiAhPSAibm8iOyB0aGVuCisJCWNhc2UgIiRob3N0X29zIiBpbgorCisJCWRhcndpbjkuKikKKwkJCSMKKwkJCSMgTGVvcGFyZC4gIEJ1aWxkIGZvciAzMi1iaXQgUG93ZXJQQywgNjQtYml0CisJCQkjIFBvd2VyUEMsIHg4NiwgYW5kIHg4Ni02NCwgd2l0aCAzMi1iaXQgUG93ZXJQQworCQkJIyBmaXJzdC4gIChUaGF0J3Mgd2hhdCBBcHBsZSBkb2VzLikKKwkJCSMKKwkJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1hcmNoIHBwYyAtYXJjaCBwcGM2NCAtYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1hcmNoIHBwYyAtYXJjaCBwcGM2NCAtYXJjaCBpMzg2IC1hcmNoIHg4Nl82NCIKKwkJCTs7CisKKwkJZGFyd2luMTAuKikKKwkJCSMKKwkJCSMgU25vdyBMZW9wYXJkLiAgQnVpbGQgZm9yIHg4Ni02NCwgeDg2LCBhbmQKKwkJCSMgMzItYml0IFBvd2VyUEMsIHdpdGggeDg2LTY0IGZpcnN0LiAgKFRoYXQncworCQkJIyB3aGF0IEFwcGxlIGRvZXMsIGV2ZW4gdGhvdWdoIFNub3cgTGVvcGFyZAorCQkJIyBkb2Vzbid0IHJ1biBvbiBQUEMsIHNvIFBQQyBsaWJwY2FwIHJ1bnMgdW5kZXIKKwkJCSMgUm9zZXR0YSwgYW5kIFJvc2V0dGEgZG9lc24ndCBzdXBwb3J0IEJQRgorCQkJIyBpb2N0bHMsIHNvIFBQQyBwcm9ncmFtcyBjYW4ndCBkbyBsaXZlCisJCQkjIGNhcHR1cmVzLikKKwkJCSMKKwkJCVZfQ0NPUFQ9IiRWX0NDT1BUIC1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IC1hcmNoIHBwYyIKKwkJCUxERkxBR1M9IiRMREZMQUdTIC1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IC1hcmNoIHBwYyIKKwkJCTs7CisKKwkJZGFyd2luMTEuKikKKwkJCSMKKwkJCSMgTGlvbi4gIEJ1aWxkIGZvciB4ODYtNjQgYW5kIHg4Niwgd2l0aCB4ODYtNjQKKwkJCSMgZmlyc3QuICAoVGhhdCdzIHByb2JhYmx5IHdoYXQgQXBwbGUgZG9lcywKKwkJCSMgZ2l2ZW4gdGhhdCBSb3NldHRhIGlzIGdvbmUuKQorCQkJIworCQkJVl9DQ09QVD0iJFZfQ0NPUFQgLWFyY2ggeDg2XzY0IC1hcmNoIGkzODYiCisJCQlMREZMQUdTPSIkTERGTEFHUyAtYXJjaCB4ODZfNjQgLWFyY2ggaTM4NiIKKwkJCTs7CisJCWVzYWMKKwlmaQorCTs7CisKK2hwdXg5KikKKwlBQ19ERUZJTkUoSEFWRV9IUFVYOSwxLFtvbiBIUC1VWCA5LnhdKQorCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7CisKK2hwdXgxMC4wKikKKworCSMKKwkjIFVzZSBTeXN0ZW0gViBjb252ZW50aW9ucyBmb3IgbWFuIHBhZ2VzLgorCSMKKwlNQU5fRklMRV9GT1JNQVRTPTQKKwlNQU5fTUlTQ19JTkZPPTUKKwk7OworCitocHV4MTAuMSopCisKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CisJOzsKKworaHB1eCopCisJZG5sIEhQVVggMTAuMjAgYW5kIGFib3ZlIGlzIHNpbWlsYXIgdG8gSFBVWCA5LCBidXQKKwlkbmwgbm90IHRoZSBzYW1lLi4uLgorCWRubAorCWRubCBYWFggLSBEWUVYVCBzaG91bGQgYmUgc2V0IHRvICJzbCIgaWYgdGhpcyBpcyBidWlsZGluZworCWRubCBmb3IgMzItYml0IFBBLVJJU0MsIGJ1dCBzaG91bGQgYmUgbGVmdCBhcyAic28iIGZvcgorCWRubCA2NC1iaXQgUEEtUklTQyBvciwgSSBzdXNwZWN0LCBJQS02NC4KKwlBQ19ERUZJTkUoSEFWRV9IUFVYMTBfMjBfT1JfTEFURVIsMSxbb24gSFAtVVggMTAuMjAgb3IgbGF0ZXJdKQorCWlmIHRlc3QgImB1bmFtZSAtbWAiID0gImlhNjQiOyB0aGVuCisJCURZRVhUPSJzbyIKKwllbHNlCisJCURZRVhUPSJzbCIKKwlmaQorCisJIworCSMgIi1iIiBidWlsZHMgYSBzaGFyZWQgbGlicmFyeTsgIitoIiBzZXRzIHRoZSBzb25hbWUuCisJIworCVNITElCX09QVD0iLWIiCisJU09OQU1FX09QVD0iK2giCisKKwkjCisJIyBVc2UgU3lzdGVtIFYgY29udmVudGlvbnMgZm9yIG1hbiBwYWdlcy4KKwkjCisJTUFOX0ZJTEVfRk9STUFUUz00CisJTUFOX01JU0NfSU5GTz01CisJOzsKKworaXJpeCopCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7CisKK2xpbnV4KnxmcmVlYnNkKnxuZXRic2QqfG9wZW5ic2QqfGRyYWdvbmZseSp8a2ZyZWVic2QqfGdudSopCisJRFlFWFQ9InNvIgorCisJIworCSMgQ29tcGlsZXIgYXNzdW1lZCB0byBiZSBHQ0M7IHJ1bi10aW1lIGxpbmtlciBtYXkgcmVxdWlyZSBhIC1SCisJIyBmbGFnLgorCSMKKwlpZiB0ZXN0ICIkbGliZGlyIiAhPSAiL3Vzci9saWIiOyB0aGVuCisJCVZfUkZMQUdTPS1XbCwtUiRsaWJkaXIKKwlmaQorCTs7CisKK29zZiopCisJRFlFWFQ9InNvIgorCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7CisKK3Npbml4KikKKwlBQ19NU0dfQ0hFQ0tJTkcoaWYgU0lOSVggY29tcGlsZXIgZGVmaW5lcyBzaW5peCkKKwlBQ19DQUNIRV9WQUwoYWNfY3ZfY2Nfc2luaXhfZGVmaW5lZCwKKwkJQUNfVFJZX0NPTVBJTEUoCisJCSAgICBbXSwKKwkJICAgIFtpbnQgaSA9IHNpbml4O10sCisJCSAgICBhY19jdl9jY19zaW5peF9kZWZpbmVkPXllcywKKwkJICAgIGFjX2N2X2NjX3Npbml4X2RlZmluZWQ9bm8pKQorCSAgICBBQ19NU0dfUkVTVUxUKCRhY19jdl9jY19zaW5peF9kZWZpbmVkKQorCSAgICBpZiB0ZXN0ICRhY19jdl9jY19zaW5peF9kZWZpbmVkID0gbm8gOyB0aGVuCisJCSAgICBBQ19ERUZJTkUoc2luaXgsMSxbb24gc2luaXhdKQorCSAgICBmaQorCTs7CisKK3NvbGFyaXMqKQorCUFDX0RFRklORShIQVZFX1NPTEFSSVMsMSxbT24gc29sYXJpc10pCisKKwlEWUVYVD0ic28iCisJIworCSMgVXNlIFN5c3RlbSBWIGNvbnZlbnRpb25zIGZvciBtYW4gcGFnZXMuCisJIworCU1BTl9GSUxFX0ZPUk1BVFM9NAorCU1BTl9NSVNDX0lORk89NQorCTs7Citlc2FjCisKK0FDX0FSR19FTkFCTEUoc2hhcmVkLAorQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLXNoYXJlZF0sW2J1aWxkIHNoYXJlZCBsaWJyYXJpZXMgQDw6QGRlZmF1bHQ9eWVzLCBpZiBzdXBwb3J0IGF2YWlsYWJsZUA6PkBdKSkKK3Rlc3QgIngkZW5hYmxlX3NoYXJlZCIgPSAieG5vIiAmJiBEWUVYVD0ibm9uZSIKKworQUNfUFJPR19SQU5MSUIKK0FDX0NIRUNLX1RPT0woW0FSXSwgW2FyXSkKKworQUNfTEJMX0RFVkVMKFZfQ0NPUFQpCisKK0FDX0xCTF9TT0NLQUREUl9TQV9MRU4KKworQUNfTEJMX1NPQ0tBRERSX1NUT1JBR0UKKworQUNfTEJMX0hQX1BQQV9JTkZPX1RfRExfTU9EVUxFX0lEXzEKKworQUNfTEJMX1VOQUxJR05FRF9BQ0NFU1MKKworIworIyBNYWtlZmlsZS5pbiBpbmNsdWRlcyBydWxlcyB0byBnZW5lcmF0ZSB2ZXJzaW9uLmgsIHNvIHdlIGFzc3VtZQorIyB0aGF0IGl0IHdpbGwgYmUgZ2VuZXJhdGVkIGlmIGF1dG9jb25mIGlzIHVzZWQuCisjCitBQ19ERUZJTkUoSEFWRV9WRVJTSU9OX0gsIDEsIFtkZWZpbmUgaWYgdmVyc2lvbi5oIGlzIGdlbmVyYXRlZCBpbiB0aGUgYnVpbGQgcHJvY2VkdXJlXSkKKworcm0gLWYgbmV0CitsbiAtcyAke3NyY2Rpcn0vYnBmL25ldCBuZXQKKworQUNfU1VCU1QoVl9DQ09QVCkKK0FDX1NVQlNUKFZfREVGUykKK0FDX1NVQlNUKFZfRklOREFMTERFVlMpCitBQ19TVUJTVChWX0lOQ0xTKQorQUNfU1VCU1QoVl9MRVgpCitBQ19TVUJTVChWX1BDQVApCitBQ19TVUJTVChWX1NITElCX0NNRCkKK0FDX1NVQlNUKFZfU0hMSUJfT1BUKQorQUNfU1VCU1QoVl9TT05BTUVfT1BUKQorQUNfU1VCU1QoVl9SUEFUSF9PUFQpCitBQ19TVUJTVChWX1lBQ0MpCitBQ19TVUJTVChBRERMT0JKUykKK0FDX1NVQlNUKEFERExBUkNISVZFT0JKUykKK0FDX1NVQlNUKFNTUkMpCitBQ19TVUJTVChEWUVYVCkKK0FDX1NVQlNUKE1BTl9GSUxFX0ZPUk1BVFMpCitBQ19TVUJTVChNQU5fTUlTQ19JTkZPKQorCitkbmwgY2hlY2sgZm9yIFVTQiBzbmlmZmluZyBzdXBwb3J0CitBQ19NU0dfQ0hFQ0tJTkcoZm9yIFVTQiBzbmlmZmluZyBzdXBwb3J0KQorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCopCisJQUNfREVGSU5FKFBDQVBfU1VQUE9SVF9VU0IsIDEsIFt0YXJnZXQgaG9zdCBzdXBwb3J0cyBVU0Igc25pZmZpbmddKQorCVVTQl9TUkM9cGNhcC11c2ItbGludXguYworCUFDX01TR19SRVNVTFQoeWVzKQorCWFjX3VzYl9kZXZfbmFtZT1gdWRldmluZm8gLXEgbmFtZSAtcCAvc3lzL2NsYXNzL3VzYl9kZXZpY2UvdXNibW9uIDI+L2Rldi9udWxsYAorCWlmIHRlc3QgJD8gLW5lIDAgOyB0aGVuCisJICBhY191c2JfZGV2X25hbWU9InVzYm1vbiIKKwlmaQorCUFDX0RFRklORV9VTlFVT1RFRChMSU5VWF9VU0JfTU9OX0RFViwgIi9kZXYvJGFjX3VzYl9kZXZfbmFtZSIsIFtwYXRoIGZvciBkZXZpY2UgZm9yIFVTQiBzbmlmZmluZ10pCisJQUNfTVNHX05PVElDRShEZXZpY2UgZm9yIFVTQiBzbmlmZmluZyBpcyAvZGV2LyRhY191c2JfZGV2X25hbWUpCisJIworCSMgRG8gd2UgaGF2ZSBhIHZlcnNpb24gb2YgPGxpbnV4L2NvbXBpbGVyLmg+IGF2YWlsYWJsZT8KKwkjIElmIHNvLCB3ZSBtaWdodCBuZWVkIGl0IGZvciA8bGludXgvdXNiZGV2aWNlX2ZzLmg+LgorCSMKKwlBQ19DSEVDS19IRUFERVJTKGxpbnV4L2NvbXBpbGVyLmgpCisJaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9saW51eF9jb21waWxlcl9oIiA9IHllczsgdGhlbgorCSAgIworCSAgIyBZZXMgLSBpbmNsdWRlIGl0IHdoZW4gdGVzdGluZyBmb3IgPGxpbnV4L3VzYmRldmljZV9mcy5oPi4KKwkgICMKKwkgIEFDX0NIRUNLX0hFQURFUlMobGludXgvdXNiZGV2aWNlX2ZzLmgsLCxbI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+XSkKKwllbHNlCisJICBBQ19DSEVDS19IRUFERVJTKGxpbnV4L3VzYmRldmljZV9mcy5oKQorCWZpCisJaWYgdGVzdCAiJGFjX2N2X2hlYWRlcl9saW51eF91c2JkZXZpY2VfZnNfaCIgPSB5ZXM7IHRoZW4KKwkgICMKKwkgICMgT0ssIGRvZXMgaXQgZGVmaW5lIGJSZXF1ZXN0VHlwZT8gIE9sZGVyIHZlcnNpb25zIG9mIHRoZSBrZXJuZWwKKwkgICMgZGVmaW5lIGZpZWxkcyB3aXRoIG5hbWVzIGxpa2UgInJlcXVlc3R0eXBlLCAicmVxdWVzdCIsIGFuZAorCSAgIyAidmFsdWUiLCByYXRoZXIgdGhhbiAiYlJlcXVlc3RUeXBlIiwgImJSZXF1ZXN0IiwgYW5kCisJICAjICJ3VmFsdWUiLgorCSAgIworCSAgQUNfTVNHX0NIRUNLSU5HKGlmIHVzYmRldmZzX2N0cmx0cmFuc2ZlciBzdHJ1Y3QgaGFzIGJSZXF1ZXN0VHlwZSBtZW1iZXIpCisJICBBQ19DQUNIRV9WQUwoYWNfY3ZfdXNiZGV2ZnNfY3RybHRyYW5zZmVyX2hhc19iUmVxdWVzdFR5cGUsCisJICAgIEFDX1RSWV9DT01QSUxFKFsKK0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9MSU5VWF9DT01QSUxFUl9ICisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L3VzYmRldmljZV9mcy5oPl0sCisJICAgICAgW3VfaW50IGkgPSBzaXplb2YoKChzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyICopMCktPmJSZXF1ZXN0VHlwZSldLAorCSAgICAgIGFjX2N2X3VzYmRldmZzX2N0cmx0cmFuc2Zlcl9oYXNfYlJlcXVlc3RUeXBlPXllcywKKwkgICAgICBhY19jdl91c2JkZXZmc19jdHJsdHJhbnNmZXJfaGFzX2JSZXF1ZXN0VHlwZT1ubykpCisJICAgIEFDX01TR19SRVNVTFQoJGFjX2N2X3VzYmRldmZzX2N0cmx0cmFuc2Zlcl9oYXNfYlJlcXVlc3RUeXBlKQorCSAgICBpZiB0ZXN0ICRhY19jdl91c2JkZXZmc19jdHJsdHJhbnNmZXJfaGFzX2JSZXF1ZXN0VHlwZSA9IHllcyA7IHRoZW4KKwkgICAgICBBQ19ERUZJTkUoSEFWRV9VU0JERVZGU19DVFJMVFJBTlNGRVJfQlJFUVVFU1RUWVBFLDEsCisJICAgICAgICBbaWYgc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlciBoYXMgYlJlcXVlc3RUeXBlXSkKKwkgICAgZmkKKwlmaQorCTs7CisqKQorCUFDX01TR19SRVNVTFQobm8pCisJOzsKK2VzYWMKK0FDX1NVQlNUKFBDQVBfU1VQUE9SVF9VU0IpCitBQ19TVUJTVChVU0JfU1JDKQorCitkbmwgY2hlY2sgZm9yIG5ldGZpbHRlciBzbmlmZmluZyBzdXBwb3J0CitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB0aGUgcGxhdGZvcm0gY291bGQgc3VwcG9ydCBuZXRmaWx0ZXIgc25pZmZpbmcpCitjYXNlICIkaG9zdF9vcyIgaW4KK2xpbnV4KikKKwlBQ19NU0dfUkVTVUxUKHllcykKKwkjCisJIyBMaWZlJ3MgdG9vIHNob3J0IHRvIGRlYWwgd2l0aCB0cnlpbmcgdG8gZ2V0IHRoaXMgdG8gY29tcGlsZQorCSMgaWYgeW91IGRvbid0IGdldCB0aGUgcmlnaHQgdHlwZXMgZGVmaW5lZCB3aXRoCisJIyBfX0tFUk5FTF9TVFJJQ1RfTkFNRVMgZ2V0dGluZyBkZWZpbmVkIGJ5IHNvbWUgb3RoZXIgaW5jbHVkZS4KKwkjCisJIyBDaGVjayB3aGV0aGVyIHRoZSBpbmNsdWRlcyBKdXN0IFdvcmsuICBJZiBub3QsIGRvbid0IHR1cm4gb24KKwkjIG5ldGZpbHRlciBzdXBwb3J0LgorCSMKKwlBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciB3ZSBjYW4gY29tcGlsZSB0aGUgbmV0ZmlsdGVyIHN1cHBvcnQpCisJQUNfQ0FDSEVfVkFMKGFjX2N2X25ldGZpbHRlcl9jYW5fY29tcGlsZSwKKwkgIEFDX1RSWV9DT01QSUxFKFsKK0FDX0lOQ0xVREVTX0RFRkFVTFQKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaD5dLAorCSAgICBbXSwKKwkgICAgYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlPXllcywKKwkgICAgYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlPW5vKSkKKwlBQ19NU0dfUkVTVUxUKCRhY19jdl9uZXRmaWx0ZXJfY2FuX2NvbXBpbGUpCisJaWYgdGVzdCAkYWNfY3ZfbmV0ZmlsdGVyX2Nhbl9jb21waWxlID0geWVzIDsgdGhlbgorCSAgQUNfREVGSU5FKFBDQVBfU1VQUE9SVF9ORVRGSUxURVIsIDEsCisJICAgIFt0YXJnZXQgaG9zdCBzdXBwb3J0cyBuZXRmaWx0ZXIgc25pZmZpbmddKQorCSAgTkVURklMVEVSX1NSQz1wY2FwLW5ldGZpbHRlci1saW51eC5jCisJZmkKKwk7OworKikKKwlBQ19NU0dfUkVTVUxUKG5vKQorCTs7Citlc2FjCitBQ19TVUJTVChQQ0FQX1NVUFBPUlRfTkVURklMVEVSKQorQUNfU1VCU1QoTkVURklMVEVSX1NSQykKKworQUNfQVJHX0VOQUJMRShbYmx1ZXRvb3RoXSwKK1tBQ19IRUxQX1NUUklORyhbLS1lbmFibGUtYmx1ZXRvb3RoXSxbZW5hYmxlIEJsdWV0b290aCBzdXBwb3J0IEA8OkBkZWZhdWx0PXllcywgaWYgc3VwcG9ydCBhdmFpbGFibGVAOj5AXSldLAorLGVuYWJsZV9ibHVldG9vdGg9eWVzKQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9ibHVldG9vdGgiICE9ICJ4bm8iIDsgdGhlbgorCWRubCBjaGVjayBmb3IgQmx1ZXRvb3RoIHNuaWZmaW5nIHN1cHBvcnQKKwljYXNlICIkaG9zdF9vcyIgaW4KKwlsaW51eCopCisJCUFDX0NIRUNLX0hFQURFUihibHVldG9vdGgvYmx1ZXRvb3RoLmgsCisJCVsKKwkJICBBQ19ERUZJTkUoUENBUF9TVVBQT1JUX0JULCAxLCBbdGFyZ2V0IGhvc3Qgc3VwcG9ydHMgQmx1ZXRvb3RoIHNuaWZmaW5nXSkKKwkJICBCVF9TUkM9cGNhcC1idC1saW51eC5jCisJCSAgQUNfTVNHX05PVElDRShCbHVldG9vdGggc25pZmZpbmcgaXMgc3VwcG9ydGVkKQorCQldLAorCQlBQ19NU0dfTk9USUNFKEJsdWV0b290aCBzbmlmZmluZyBpcyBub3Qgc3VwcG9ydGVkOyBpbnN0YWxsIGJsdWV6LWxpYiBkZXZlbCB0byBlbmFibGUgaXQpCisJCSkKKwkJOzsKKwkqKQorCQlBQ19NU0dfTk9USUNFKG5vIEJsdWV0b290aCBzbmlmZmluZyBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcykKKwkJOzsKKwllc2FjCisJQUNfU1VCU1QoUENBUF9TVVBQT1JUX0JUKQorCUFDX1NVQlNUKEJUX1NSQykKK2ZpCisKK0FDX0FSR19FTkFCTEUoW2NhbnVzYl0sCitbQUNfSEVMUF9TVFJJTkcoWy0tZW5hYmxlLWNhbnVzYl0sW2VuYWJsZSBjYW51c2Igc3VwcG9ydCBAPDpAZGVmYXVsdD15ZXMsIGlmIHN1cHBvcnQgYXZhaWxhYmxlQDo+QF0pXQorLGVuYWJsZV9jYW51c2I9eWVzKQorCitpZiB0ZXN0ICJ4JGVuYWJsZV9jYW51c2IiICE9ICJ4bm8iIDsgdGhlbgorCWRubCBjaGVjayBmb3IgY2FudXNiIHN1cHBvcnQKKwljYXNlICIkaG9zdF9vcyIgaW4KKwlsaW51eCopCisJCUFDX0NIRUNLX0hFQURFUihsaWJ1c2ItMS4wL2xpYnVzYi5oLAorCQlbCisJCSAgICBBQ19ERUZJTkUoUENBUF9TVVBQT1JUX0NBTlVTQiwgMSwgW3RhcmdldCBob3N0IHN1cHBvcnRzIGNhbnVzYl0pCisJCSAgICBDQU5VU0JfU1JDPXBjYXAtY2FudXNiLWxpbnV4LmMKKwkJICAgIExJQlM9Ii1sdXNiLTEuMCAkTElCUyIKKwkJICAgIEFDX01TR19OT1RJQ0UoY2FudXNiIHNuaWZmaW5nIGlzIHN1cHBvcnRlZCkKKwkJXSwKKwkJQUNfTVNHX05PVElDRShjYW51c2Igc25pZmZpbmcgaXMgbm90IHN1cHBvcnRlZDsgaW5zdGFsbCBsaWJ1c2IxLjAgbGliIGRldmVsIHRvIGVuYWJsZSBpdCkKKwkJKQorCQk7OworCSopCisJCUFDX01TR19OT1RJQ0Uobm8gY2FudXNiIHN1cHBvcnQgaW1wbGVtZW50ZWQgZm9yICRob3N0X29zKQorCQk7OworCWVzYWMKKwlBQ19TVUJTVChQQ0FQX1NVUFBPUlRfQ0FOVVNCKQorCUFDX1NVQlNUKENBTlVTQl9TUkMpCitmaQorCitBQ19BUkdfRU5BQkxFKFtjYW5dLAorW0FDX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1jYW5dLFtlbmFibGUgQ0FOIHN1cHBvcnQgQDw6QGRlZmF1bHQ9eWVzLCBpZiBzdXBwb3J0IGF2YWlsYWJsZUA6PkBdKV0sCissZW5hYmxlX2Nhbj15ZXMpCisKK2lmIHRlc3QgIngkZW5hYmxlX2NhbiIgIT0gInhubyIgOyB0aGVuCisJZG5sIGNoZWNrIGZvciBDQU4gc25pZmZpbmcgc3VwcG9ydAorCWNhc2UgIiRob3N0X29zIiBpbgorCWxpbnV4KikKKwkJQUNfQ0hFQ0tfSEVBREVSKGxpbnV4L2Nhbi5oLAorCQkJWyBBQ19ERUZJTkUoUENBUF9TVVBQT1JUX0NBTiwgMSwgW3RhcmdldCBob3N0IHN1cHBvcnRzIENBTiBzbmlmZmluZ10pCisJCQlDQU5fU1JDPXBjYXAtY2FuLWxpbnV4LmMKKwkJCUFDX01TR19OT1RJQ0UoQ0FOIHNuaWZmaW5nIGlzIHN1cHBvcnRlZCldLAorCQkJQUNfTVNHX05PVElDRShDQU4gc25pZmZpbmcgaXMgbm90IHN1cHBvcnRlZCksCisJCQlbI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD5dCisJCSAgICkKKwkJOzsKKwkqKQorCQlBQ19NU0dfTk9USUNFKG5vIENBTiBzbmlmZmluZyBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcykKKwkJOzsKKwllc2FjCisJQUNfU1VCU1QoUENBUF9TVVBQT1JUX0NBTikKKwlBQ19TVUJTVChDQU5fU1JDKQorZmkKKworZG5sIGNoZWNrIGZvciBoYXJkd2FyZSB0aW1lc3RhbXAgc3VwcG9ydAorY2FzZSAiJGhvc3Rfb3MiIGluCitsaW51eCopCisJQUNfQ0hFQ0tfSEVBREVSUyhbbGludXgvbmV0X3RzdGFtcC5oXSkKKwk7OworKikKKwlBQ19NU0dfTk9USUNFKG5vIGhhcmR3YXJlIHRpbWVzdGFtcCBzdXBwb3J0IGltcGxlbWVudGVkIGZvciAkaG9zdF9vcykKKwk7OworZXNhYworCitBQ19QUk9HX0lOU1RBTEwKKworQUNfQ09ORklHX0hFQURFUihjb25maWcuaCkKKworQUNfT1VUUFVUKE1ha2VmaWxlIHBjYXAtZmlsdGVyLm1hbm1pc2MgcGNhcC1saW5rdHlwZS5tYW5taXNjCisJcGNhcC10c3RhbXAubWFubWlzYyBwY2FwLXNhdmVmaWxlLm1hbmZpbGUgcGNhcC4zcGNhcAorCXBjYXBfY29tcGlsZS4zcGNhcCBwY2FwX2RhdGFsaW5rLjNwY2FwIHBjYXBfZHVtcF9vcGVuLjNwY2FwCisJcGNhcF9saXN0X2RhdGFsaW5rcy4zcGNhcCBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwCisJcGNhcF9vcGVuX2RlYWQuM3BjYXAgcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAKKwlwY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcCkKKworaWYgdGVzdCAtZiAuZGV2ZWwgOyB0aGVuCisJbWFrZSBkZXBlbmQKK2ZpCitleGl0IDAKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvZGxwaXN1YnMuYyBiL2xpYnBjYXAtMS4zLjAvZGxwaXN1YnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2M3OGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9kbHBpc3Vicy5jCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBjb2RlIGZvcm1lcmx5IGluIHBjYXAtZGxwaS5jLCBvcmlnaW5hbGx5CisgKiBjb250cmlidXRlZCBieSBBdGFudSBHaG9zaCAoYXRhbnVAY3MudWNsLmFjLnVrKSwgVW5pdmVyc2l0eSBDb2xsZWdlCisgKiBMb25kb24sIGFuZCBzdWJzZXF1ZW50bHkgbW9kaWZpZWQgYnkgR3V5IEhhcnJpcyAoZ3V5QGFsdW0ubWl0LmVkdSksCisgKiBNYXJrIFBpenpvbGF0byA8TGlzdC10Y3BkdW1wLXdvcmtlcnNAc3Vic2NyaXB0aW9ucy5waXp6b2xhdG8ubmV0PiwKKyAqIE1hcmsgQy4gQnJvd24gKG1icm93bkBocC5jb20pLCBhbmQgU2FndW4gU2hha3lhIDxTYWd1bi5TaGFreWFAU3VuLkNPTT4uCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkbHBpL2xpYmRscGkgcmVsYXRlZCBjb21tb24gZnVuY3Rpb25zIHVzZWQKKyAqIGJ5IHBjYXAtW2RscGksbGliZGxwaV0uYy4KKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisJIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZGxwaXN1YnMuYyx2IDEuMyAyMDA4LTEyLTAyIDE2OjQwOjE5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZuZGVmIERMX0lQQVRNCisjZGVmaW5lIERMX0lQQVRNCTB4MTIJLyogQVRNIENsYXNzaWNhbCBJUCBpbnRlcmZhY2UgKi8KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKwkvKgorCSAqIFNpemUgb2YgYSBidWZtb2QgY2h1bmsgdG8gcGFzcyB1cHN0cmVhbTsgdGhhdCBhcHBlYXJzIHRvIGJlIHRoZQorCSAqIGJpZ2dlc3QgdmFsdWUgdG8gd2hpY2ggeW91IGNhbiBzZXQgaXQsIGFuZCBzZXR0aW5nIGl0IHRvIHRoYXQgdmFsdWUKKwkgKiAod2hpY2ggaXMgYmlnZ2VyIHRoYW4gd2hhdCBhcHBlYXJzIHRvIGJlIHRoZSBTb2xhcmlzIGRlZmF1bHQgb2YgODE5MikKKwkgKiByZWR1Y2VzIHRoZSBudW1iZXIgb2YgcGFja2V0IGRyb3BzLgorCSAqLworI2RlZmluZQlDSFVOS1NJWkUJNjU1MzYKKworCS8qCisJICogU2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlIGZvciBwYWNrZXQgZGF0YSB3ZSByZWFkOyBpdCBtdXN0IGJlCisJICogbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBjaHVuay4KKwkgKi8KKyNkZWZpbmUJUEtUQlVGU0laRQlDSFVOS1NJWkUKKworI2Vsc2UgLyogSEFWRV9TWVNfQlVGTU9EX0ggKi8KKworCS8qCisJICogU2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlIGZvciBwYWNrZXQgZGF0YSB3ZSByZWFkOyB0aGlzIGlzCisJICogd2hhdCB0aGUgdmFsdWUgdXNlZCB0byBiZSAtIHRoZXJlJ3Mgbm8gcGFydGljdWxhciByZWFzb24gd2h5IGl0CisJICogc2hvdWxkIGJlIHRpZWQgdG8gTUFYRExCVUYsIGJ1dCB3ZSdsbCBsZWF2ZSBpdCBhcyB0aGlzIGZvciBub3cuCisJICovCisjZGVmaW5lCU1BWERMQlVGCTgxOTIKKyNkZWZpbmUJUEtUQlVGU0laRQkoTUFYRExCVUYgKiBzaXplb2YoYnBmX3VfaW50MzIpKQorCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKyNpbmNsdWRlIDxzeXMvYnVmbW9kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvZGxwaS5oPgorI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJvcHRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgImRscGlzdWJzLmgiCisKKyNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAorc3RhdGljIHZvaWQgcGNhcF9zdHJlYW1fZXJyKGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICopOworI2VuZGlmCisKKy8qCisgKiBHZXQgdGhlIHBhY2tldCBzdGF0aXN0aWNzLgorICovCitpbnQKK3BjYXBfc3RhdHNfZGxwaShwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQoreworCisJLyoKKwkgKiAicHNfcmVjdiIgY291bnRzIHBhY2tldHMgaGFuZGVkIHRvIHRoZSBmaWx0ZXIsIG5vdCBwYWNrZXRzCisJICogdGhhdCBwYXNzZWQgdGhlIGZpbHRlci4gIEFzIGZpbHRlcmluZyBpcyBkb25lIGluIHVzZXJsYW5kLAorCSAqIHRoaXMgd291bGQgbm90IGluY2x1ZGUgcGFja2V0cyBkcm9wcGVkIGJlY2F1c2Ugd2UgcmFuIG91dAorCSAqIG9mIGJ1ZmZlciBzcGFjZTsgaW4gb3JkZXIgdG8gbWFrZSB0aGlzIG1vcmUgbGlrZSBvdGhlcgorCSAqIHBsYXRmb3JtcyAoTGludXggMi40IGFuZCBsYXRlciwgQlNEcyB3aXRoIEJQRiksIHdoZXJlIHRoZQorCSAqICJwYWNrZXRzIHJlY2VpdmVkIiBjb3VudCBpbmNsdWRlcyBwYWNrZXRzIHJlY2VpdmVkIGJ1dCBkcm9wcGVkCisJICogZHVlIHRvIHJ1bm5pbmcgb3V0IG9mIGJ1ZmZlciBzcGFjZSwgYW5kIHRvIGtlZXAgZnJvbSBjb25mdXNpbmcKKwkgKiBhcHBsaWNhdGlvbnMgdGhhdCwgZm9yIGV4YW1wbGUsIGNvbXB1dGUgcGFja2V0IGRyb3AgcGVyY2VudGFnZXMsCisJICogd2UgYWxzbyBtYWtlIGl0IGNvdW50IHBhY2tldHMgZHJvcHBlZCBieSAiYnVmbW9kIiAob3RoZXJ3aXNlIHdlCisJICogbWlnaHQgcnVuIHRoZSByaXNrIG9mIHRoZSBwYWNrZXQgZHJvcCBjb3VudCBiZWluZyBiaWdnZXIgdGhhbgorCSAqIHRoZSByZWNlaXZlZC1wYWNrZXQgY291bnQpLgorCSAqCisJICogInBzX2Ryb3AiIGNvdW50cyBwYWNrZXRzIGRyb3BwZWQgYnkgImJ1Zm1vZCIgYmVjYXVzZSBvZgorCSAqIGZsb3cgY29udHJvbCByZXF1aXJlbWVudHMgb3IgcmVzb3VyY2UgZXhoYXVzdGlvbjsgaXQgZG9lc24ndAorCSAqIGNvdW50IHBhY2tldHMgZHJvcHBlZCBieSB0aGUgaW50ZXJmYWNlIGRyaXZlciwgb3IgcGFja2V0cworCSAqIGRyb3BwZWQgdXBzdHJlYW0uICBBcyBmaWx0ZXJpbmcgaXMgZG9uZSBpbiB1c2VybGFuZCwgaXQgY291bnRzCisJICogcGFja2V0cyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSB3b3VsZCd2ZSBwYXNzZWQgdGhlIGZpbHRlci4KKwkgKgorCSAqIFRoZXNlIHN0YXRpc3RpY3MgZG9uJ3QgaW5jbHVkZSBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tCisJICogdGhlIGtlcm5lbCBieSBsaWJwY2FwLCBidXQgdGhleSBtYXkgaW5jbHVkZSBwYWNrZXRzIG5vdAorCSAqIHlldCByZWFkIGZyb20gbGlicGNhcCBieSB0aGUgYXBwbGljYXRpb24uCisJICovCisJKnBzID0gcC0+bWQuc3RhdDsKKworCS8qCisJICogQWRkIGluIHRoZSBkcm9wIGNvdW50LCBhcyBwZXIgdGhlIGFib3ZlIGNvbW1lbnQuCisJICovCisJcHMtPnBzX3JlY3YgKz0gcHMtPnBzX2Ryb3A7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIExvb3AgdGhyb3VnaCB0aGUgcGFja2V0cyBhbmQgY2FsbCB0aGUgY2FsbGJhY2sgZm9yIGVhY2ggcGFja2V0LgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFja2V0cyByZWFkLgorICovCitpbnQKK3BjYXBfcHJvY2Vzc19wa3RzKHBjYXBfdCAqcCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIsCisJaW50IGNvdW50LCB1X2NoYXIgKmJ1ZnAsIGludCBsZW4pCit7CisJaW50IG4sIGNhcGxlbiwgb3JpZ2xlbjsKKwl1X2NoYXIgKmVwLCAqcGs7CisJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGhkcjsKKyNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAorCXN0cnVjdCBzYl9oZHIgKnNicDsKKyNpZmRlZiBMQkxfQUxJR04KKwlzdHJ1Y3Qgc2JfaGRyIHNiaGRyOworI2VuZGlmCisjZW5kaWYKKworCS8qIExvb3AgdGhyb3VnaCBwYWNrZXRzICovCisJZXAgPSBidWZwICsgbGVuOworCW4gPSAwOworCisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKwl3aGlsZSAoYnVmcCA8IGVwKSB7CisJCS8qCisJCSAqIEhhcyAicGNhcF9icmVha2xvb3AoKSIgYmVlbiBjYWxsZWQ/CisJCSAqIElmIHNvLCByZXR1cm4gaW1tZWRpYXRlbHkgLSBpZiB3ZSBoYXZlbid0IHJlYWQgYW55CisJCSAqIHBhY2tldHMsIGNsZWFyIHRoZSBmbGFnIGFuZCByZXR1cm4gLTIgdG8gaW5kaWNhdGUKKwkJICogdGhhdCB3ZSB3ZXJlIHRvbGQgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wLCBvdGhlcndpc2UKKwkJICogbGVhdmUgdGhlIGZsYWcgc2V0LCBzbyB0aGF0IHRoZSAqbmV4dCogY2FsbCB3aWxsIGJyZWFrCisJCSAqIG91dCBvZiB0aGUgbG9vcCB3aXRob3V0IGhhdmluZyByZWFkIGFueSBwYWNrZXRzLCBhbmQKKwkJICogcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSd2ZSBwcm9jZXNzZWQgc28gZmFyLgorCQkgKi8KKwkJaWYgKHAtPmJyZWFrX2xvb3ApIHsKKwkJCWlmIChuID09IDApIHsKKwkJCQlwLT5icmVha19sb29wID0gMDsKKwkJCQlyZXR1cm4gKC0yKTsKKwkJCX0gZWxzZSB7CisJCQkJcC0+YnAgPSBidWZwOworCQkJCXAtPmNjID0gZXAgLSBidWZwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKyNpZmRlZiBMQkxfQUxJR04KKwkJaWYgKChsb25nKWJ1ZnAgJiAzKSB7CisJCQlzYnAgPSAmc2JoZHI7CisJCQltZW1jcHkoc2JwLCBidWZwLCBzaXplb2YoKnNicCkpOworCQl9IGVsc2UKKyNlbmRpZgorCQkJc2JwID0gKHN0cnVjdCBzYl9oZHIgKilidWZwOworCQlwLT5tZC5zdGF0LnBzX2Ryb3AgPSBzYnAtPnNiaF9kcm9wczsKKwkJcGsgPSBidWZwICsgc2l6ZW9mKCpzYnApOworCQlidWZwICs9IHNicC0+c2JoX3RvdGxlbjsKKwkJb3JpZ2xlbiA9IHNicC0+c2JoX29yaWdsZW47CisJCWNhcGxlbiA9IHNicC0+c2JoX21zZ2xlbjsKKyNlbHNlCisJCW9yaWdsZW4gPSBsZW47CisJCWNhcGxlbiA9IG1pbihwLT5zbmFwc2hvdCwgbGVuKTsKKwkJcGsgPSBidWZwOworCQlidWZwICs9IGNhcGxlbjsKKyNlbmRpZgorCQkrK3AtPm1kLnN0YXQucHNfcmVjdjsKKwkJaWYgKGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIHBrLCBvcmlnbGVuLCBjYXBsZW4pKSB7CisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKwkJCXBrdGhkci50cy50dl9zZWMgPSBzYnAtPnNiaF90aW1lc3RhbXAudHZfc2VjOworCQkJcGt0aGRyLnRzLnR2X3VzZWMgPSBzYnAtPnNiaF90aW1lc3RhbXAudHZfdXNlYzsKKyNlbHNlCisJCQkodm9pZCkgZ2V0dGltZW9mZGF5KCZwa3RoZHIudHMsIE5VTEwpOworI2VuZGlmCisJCQlwa3RoZHIubGVuID0gb3JpZ2xlbjsKKwkJCXBrdGhkci5jYXBsZW4gPSBjYXBsZW47CisJCQkvKiBJbnN1cmUgY2FwbGVuIGRvZXMgbm90IGV4Y2VlZCBzbmFwc2hvdCAqLworCQkJaWYgKHBrdGhkci5jYXBsZW4gPiBwLT5zbmFwc2hvdCkKKwkJCQlwa3RoZHIuY2FwbGVuID0gcC0+c25hcHNob3Q7CisJCQkoKmNhbGxiYWNrKSh1c2VyLCAmcGt0aGRyLCBwayk7CisJCQlpZiAoKytuID49IGNvdW50ICYmIGNvdW50ID49IDApIHsKKwkJCQlwLT5jYyA9IGVwIC0gYnVmcDsKKwkJCQlwLT5icCA9IGJ1ZnA7CisJCQkJcmV0dXJuIChuKTsKKwkJCX0KKwkJfQorI2lmZGVmIEhBVkVfU1lTX0JVRk1PRF9ICisJfQorI2VuZGlmCisJcC0+Y2MgPSAwOworCXJldHVybiAobik7Cit9CisKKy8qCisgKiBQcm9jZXNzIHRoZSBtYWMgdHlwZS4gUmV0dXJucyAtMSBpZiBubyBtYXRjaGluZyBtYWMgdHlwZSBmb3VuZCwgb3RoZXJ3aXNlIDAuCisgKi8KK2ludAorcGNhcF9wcm9jZXNzX21hY3R5cGUocGNhcF90ICpwLCB1X2ludCBtYWN0eXBlKQoreworCWludCByZXR2ID0gMDsKKworCXN3aXRjaCAobWFjdHlwZSkgeworCisJY2FzZSBETF9DU01BQ0Q6CisJY2FzZSBETF9FVEhFUjoKKwkJcC0+bGlua3R5cGUgPSBETFRfRU4xME1COworCQlwLT5vZmZzZXQgPSAyOworCQkvKgorCQkgKiBUaGlzIGlzIChwcmVzdW1hYmx5KSBhIHJlYWwgRXRoZXJuZXQgY2FwdHVyZTsgZ2l2ZSBpdCBhCisJCSAqIGxpbmstbGF5ZXItdHlwZSBsaXN0IHdpdGggRExUX0VOMTBNQiBhbmQgRExUX0RPQ1NJUywgc28KKwkJICogdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gbGV0IHlvdSBjaG9vc2UgaXQsIGluIGNhc2UgeW91J3JlCisJCSAqIGNhcHR1cmluZyBET0NTSVMgdHJhZmZpYyB0aGF0IGEgQ2lzY28gQ2FibGUgTW9kZW0KKwkJICogVGVybWluYXRpb24gU3lzdGVtIGlzIHB1dHRpbmcgb3V0IG9udG8gYW4gRXRoZXJuZXQgKGl0CisJCSAqIGRvZXNuJ3QgcHV0IGFuIEV0aGVybmV0IGhlYWRlciBvbnRvIHRoZSB3aXJlLCBpdCBwdXRzIHJhdworCQkgKiBET0NTSVMgZnJhbWVzIG91dCBvbiB0aGUgd2lyZSBpbnNpZGUgdGhlIGxvdy1sZXZlbAorCQkgKiBFdGhlcm5ldCBmcmFtaW5nKS4KKwkJICovCisJCXAtPmRsdF9saXN0ID0gKHVfaW50ICopbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKKwkJLyoKKwkJICogSWYgdGhhdCBmYWlscywganVzdCBsZWF2ZSB0aGUgbGlzdCBlbXB0eS4KKwkJICovCisJCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7CisJCQlwLT5kbHRfbGlzdFswXSA9IERMVF9FTjEwTUI7CisJCQlwLT5kbHRfbGlzdFsxXSA9IERMVF9ET0NTSVM7CisJCQlwLT5kbHRfY291bnQgPSAyOworCQl9CisJCWJyZWFrOworCisJY2FzZSBETF9GRERJOgorCQlwLT5saW5rdHlwZSA9IERMVF9GRERJOworCQlwLT5vZmZzZXQgPSAzOworCQlicmVhazsKKworCWNhc2UgRExfVFBSOgorCQkvKiBYWFggLSB3aGF0IGFib3V0IERMX1RQQj8gIElzIHRoYXQgVG9rZW4gQnVzPyAgKi8KKwkJcC0+bGlua3R5cGUgPSBETFRfSUVFRTgwMjsKKwkJcC0+b2Zmc2V0ID0gMjsKKwkJYnJlYWs7CisKKyNpZmRlZiBIQVZFX1NPTEFSSVMKKwljYXNlIERMX0lQQVRNOgorCQlwLT5saW5rdHlwZSA9IERMVF9TVU5BVE07CisJCXAtPm9mZnNldCA9IDA7ICAvKiB3b3JrcyBmb3IgTEFORSBhbmQgTExDIGVuY2Fwc3VsYXRpb24gKi8KKwkJYnJlYWs7CisjZW5kaWYKKworCWRlZmF1bHQ6CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInVua25vd24gbWFjdHlwZSAldSIsCisJCSAgICBtYWN0eXBlKTsKKwkJcmV0diA9IC0xOworCX0KKworCXJldHVybiAocmV0dik7Cit9CisKKyNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAorLyoKKyAqIFB1c2ggYW5kIGNvbmZpZ3VyZSB0aGUgYnVmZmVyIG1vZHVsZS4gUmV0dXJucyAtMSBmb3IgZXJyb3IsIG90aGVyd2lzZSAwLgorICovCitpbnQKK3BjYXBfY29uZl9idWZtb2QocGNhcF90ICpwLCBpbnQgc25hcGxlbiwgaW50IHRpbWVvdXQpCit7CisJaW50IHJldHYgPSAwOworCisJYnBmX3VfaW50MzIgc3MsIGNodW5rc2l6ZTsKKworCS8qIE5vbi1zdGFuZGFyZCBjYWxsIHRvIGdldCB0aGUgZGF0YSBuaWNlbHkgYnVmZmVyZWQuICovCisJaWYgKGlvY3RsKHAtPmZkLCBJX1BVU0gsICJidWZtb2QiKSAhPSAwKSB7CisJCXBjYXBfc3RyZWFtX2VycigiSV9QVVNIIGJ1Zm1vZCIsIGVycm5vLCBwLT5lcnJidWYpOworCQlyZXR2ID0gLTE7CisJfQorCisJc3MgPSBzbmFwbGVuOworCWlmIChzcyA+IDAgJiYKKwkgICAgc3RyaW9jdGwocC0+ZmQsIFNCSU9DU1NOQVAsIHNpemVvZihzcyksIChjaGFyICopJnNzKSAhPSAwKSB7CisJCXBjYXBfc3RyZWFtX2VycigiU0JJT0NTU05BUCIsIGVycm5vLCBwLT5lcnJidWYpOworCQlyZXR2ID0gLTE7CisJfQorCisJLyogU2V0IHVwIHRoZSBidWZtb2QgdGltZW91dC4gKi8KKwlpZiAodGltZW91dCAhPSAwKSB7CisJCXN0cnVjdCB0aW1ldmFsIHRvOworCisJCXRvLnR2X3NlYyA9IHRpbWVvdXQgLyAxMDAwOworCQl0by50dl91c2VjID0gKHRpbWVvdXQgKiAxMDAwKSAlIDEwMDAwMDA7CisJCWlmIChzdHJpb2N0bChwLT5mZCwgU0JJT0NTVElNRSwgc2l6ZW9mKHRvKSwgKGNoYXIgKikmdG8pICE9IDApIHsKKwkJCXBjYXBfc3RyZWFtX2VycigiU0JJT0NTVElNRSIsIGVycm5vLCBwLT5lcnJidWYpOworCQkJcmV0diA9IC0xOworCQl9CisJfQorCisJLyogU2V0IHRoZSBjaHVuayBsZW5ndGguICovCisJY2h1bmtzaXplID0gQ0hVTktTSVpFOworCWlmIChzdHJpb2N0bChwLT5mZCwgU0JJT0NTQ0hVTkssIHNpemVvZihjaHVua3NpemUpLCAoY2hhciAqKSZjaHVua3NpemUpCisJICAgICE9IDApIHsKKwkJcGNhcF9zdHJlYW1fZXJyKCJTQklPQ1NDSFVOS1AiLCBlcnJubywgcC0+ZXJyYnVmKTsKKwkJcmV0diA9IC0xOworCX0KKworCXJldHVybiAocmV0dik7Cit9CisjZW5kaWYgLyogSEFWRV9TWVNfQlVGTU9EX0ggKi8KKworLyoKKyAqIEFsbG9jYXRlIGRhdGEgYnVmZmVyLiBSZXR1cm5zIC0xIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLCBlbHNlIDAuCisgKi8KK2ludAorcGNhcF9hbGxvY19kYXRhYnVmKHBjYXBfdCAqcCkKK3sKKwlwLT5idWZzaXplID0gUEtUQlVGU0laRTsKKwlwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKHAtPmJ1ZnNpemUgKyBwLT5vZmZzZXQpOworCWlmIChwLT5idWZmZXIgPT0gTlVMTCkgeworCQlzdHJsY3B5KHAtPmVycmJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICogSXNzdWUgYSBTVFJFQU1TIElfU1RSIGlvY3RsLiBSZXR1cm5zIC0xIG9uIGVycm9yLCBvdGhlcndpc2UKKyAqIGxlbmd0aCBvZiByZXR1cm5lZCBkYXRhIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorc3RyaW9jdGwoaW50IGZkLCBpbnQgY21kLCBpbnQgbGVuLCBjaGFyICpkcCkKK3sKKwlzdHJ1Y3Qgc3RyaW9jdGwgc3RyOworCWludCByZXR2OworCisJc3RyLmljX2NtZCA9IGNtZDsKKwlzdHIuaWNfdGltb3V0ID0gLTE7CisJc3RyLmljX2xlbiA9IGxlbjsKKwlzdHIuaWNfZHAgPSBkcDsKKwlpZiAoKHJldHYgPSBpb2N0bChmZCwgSV9TVFIsICZzdHIpKSA8IDApCisJCXJldHVybiAocmV0dik7CisKKwlyZXR1cm4gKHN0ci5pY19sZW4pOworfQorCisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKy8qCisgKiBXcml0ZSBzdHJlYW0gZXJyb3IgbWVzc2FnZSB0byBlcnJidWYuCisgKi8KK3N0YXRpYyB2b2lkCitwY2FwX3N0cmVhbV9lcnIoY29uc3QgY2hhciAqZnVuYywgaW50IGVyciwgY2hhciAqZXJyYnVmKQoreworCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsIGZ1bmMsIHBjYXBfc3RyZXJyb3IoZXJyKSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvZGxwaXN1YnMuaCBiL2xpYnBjYXAtMS4zLjAvZGxwaXN1YnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU3ZDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9kbHBpc3Vicy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2RscGlzdWJzLmgsdiAxLjIgMjAwOC0wNC0wNCAxOTozNzo0NSBndXkgRXhwICQKKyAqLworCisjaWZuZGVmIGRscGlzdWJzX2gKKyNkZWZpbmUJZGxwaXN1YnNfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgKiBGdW5jdGlvbnMgdXNlZCBieSBkbHBpc3Vicy5jLgorICovCitpbnQgcGNhcF9zdGF0c19kbHBpKHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9zdGF0ICopOworaW50IHBjYXBfcHJvY2Vzc19wa3RzKHBjYXBfdCAqLCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqLCBpbnQsIHVfY2hhciAqLCBpbnQpOworaW50IHBjYXBfcHJvY2Vzc19tYWN0eXBlKHBjYXBfdCAqLCB1X2ludCk7CisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKK2ludCBwY2FwX2NvbmZfYnVmbW9kKHBjYXBfdCAqLCBpbnQsIGludCk7CisjZW5kaWYKK2ludCBwY2FwX2FsbG9jX2RhdGFidWYocGNhcF90ICopOworaW50IHN0cmlvY3RsKGludCwgaW50LCBpbnQsIGNoYXIgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9ldGhlcmVudC5jIGIvbGlicGNhcC0xLjMuMC9ldGhlcmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGUxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2V0aGVyZW50LmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9ldGhlcmVudC5jLHYgMS4yMyAyMDA2LTEwLTA0IDE4OjA5OjIyIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSA8cGNhcC9uYW1lZGIuaD4KKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgeGR0b2koaW50KTsKK3N0YXRpYyBpbmxpbmUgaW50IHNraXBfc3BhY2UoRklMRSAqKTsKK3N0YXRpYyBpbmxpbmUgaW50IHNraXBfbGluZShGSUxFICopOworCisvKiBIZXggZGlnaXQgdG8gaW50ZWdlci4gKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit4ZHRvaShjKQorCXJlZ2lzdGVyIGludCBjOworeworCWlmIChpc2RpZ2l0KGMpKQorCQlyZXR1cm4gYyAtICcwJzsKKwllbHNlIGlmIChpc2xvd2VyKGMpKQorCQlyZXR1cm4gYyAtICdhJyArIDEwOworCWVsc2UKKwkJcmV0dXJuIGMgLSAnQScgKyAxMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NraXBfc3BhY2UoZikKKwlGSUxFICpmOworeworCWludCBjOworCisJZG8geworCQljID0gZ2V0YyhmKTsKKwl9IHdoaWxlIChpc3NwYWNlKGMpICYmIGMgIT0gJ1xuJyk7CisKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NraXBfbGluZShmKQorCUZJTEUgKmY7Cit7CisJaW50IGM7CisKKwlkbworCQljID0gZ2V0YyhmKTsKKwl3aGlsZSAoYyAhPSAnXG4nICYmIGMgIT0gRU9GKTsKKworCXJldHVybiBjOworfQorCitzdHJ1Y3QgcGNhcF9ldGhlcmVudCAqCitwY2FwX25leHRfZXRoZXJlbnQoRklMRSAqZnApCit7CisJcmVnaXN0ZXIgaW50IGMsIGQsIGk7CisJY2hhciAqYnA7CisJc3RhdGljIHN0cnVjdCBwY2FwX2V0aGVyZW50IGU7CisKKwltZW1zZXQoKGNoYXIgKikmZSwgMCwgc2l6ZW9mKGUpKTsKKwlkbyB7CisJCS8qIEZpbmQgYWRkciAqLworCQljID0gc2tpcF9zcGFjZShmcCk7CisJCWlmIChjID09ICdcbicpCisJCQljb250aW51ZTsKKworCQkvKiBJZiB0aGlzIGlzIGEgY29tbWVudCwgb3IgZmlyc3QgdGhpbmcgb24gbGluZQorCQkgICBjYW5ub3QgYmUgZXRlaHJuZXQgYWRkcmVzcywgc2tpcCB0aGUgbGluZS4gKi8KKwkJaWYgKCFpc3hkaWdpdChjKSkgeworCQkJYyA9IHNraXBfbGluZShmcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIG11c3QgYmUgdGhlIHN0YXJ0IG9mIGFuIGFkZHJlc3MgKi8KKwkJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMSkgeworCQkJZCA9IHhkdG9pKGMpOworCQkJYyA9IGdldGMoZnApOworCQkJaWYgKGlzeGRpZ2l0KGMpKSB7CisJCQkJZCA8PD0gNDsKKwkJCQlkIHw9IHhkdG9pKGMpOworCQkJCWMgPSBnZXRjKGZwKTsKKwkJCX0KKwkJCWUuYWRkcltpXSA9IGQ7CisJCQlpZiAoYyAhPSAnOicpCisJCQkJYnJlYWs7CisJCQljID0gZ2V0YyhmcCk7CisJCX0KKwkJaWYgKGMgPT0gRU9GKQorCQkJYnJlYWs7CisKKwkJLyogTXVzdCBiZSB3aGl0ZXNwYWNlICovCisJCWlmICghaXNzcGFjZShjKSkgeworCQkJYyA9IHNraXBfbGluZShmcCk7CisJCQljb250aW51ZTsKKwkJfQorCQljID0gc2tpcF9zcGFjZShmcCk7CisKKwkJLyogaGl0IGVuZCBvZiBsaW5lLi4uICovCisJCWlmIChjID09ICdcbicpCisJCQljb250aW51ZTsKKworCQlpZiAoYyA9PSAnIycpIHsKKwkJCWMgPSBza2lwX2xpbmUoZnApOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBwaWNrIHVwIG5hbWUgKi8KKwkJYnAgPSBlLm5hbWU7CisJCS8qIFVzZSAnZCcgdG8gcHJldmVudCBidWZmZXIgb3ZlcmZsb3cuICovCisJCWQgPSBzaXplb2YoZS5uYW1lKSAtIDE7CisJCWRvIHsKKwkJCSpicCsrID0gYzsKKwkJCWMgPSBnZXRjKGZwKTsKKwkJfSB3aGlsZSAoIWlzc3BhY2UoYykgJiYgYyAhPSBFT0YgJiYgLS1kID4gMCk7CisJCSpicCA9ICdcMCc7CisKKwkJLyogRWF0IHRyYWlsaW5nIGp1bmsgKi8KKwkJaWYgKGMgIT0gJ1xuJykKKwkJCSh2b2lkKXNraXBfbGluZShmcCk7CisKKwkJcmV0dXJuICZlOworCisJfSB3aGlsZSAoYyAhPSBFT0YpOworCisJcmV0dXJuIChOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvZXRoZXJ0eXBlLmggYi9saWJwY2FwLTEuMy4wL2V0aGVydHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNmJiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2V0aGVydHlwZS5oCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9ldGhlcnR5cGUuaCx2IDEuMTQgMjAwNS0wOS0wNSAwOTowNjo1OCBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogRXRoZXJuZXQgdHlwZXMuCisgKgorICogV2Ugd3JhcCB0aGUgZGVjbGFyYXRpb25zIHdpdGggI2lmZGVmLCBzbyB0aGF0IGlmIGEgZmlsZSBpbmNsdWRlcworICogPG5ldGluZXQvaWZfZXRoZXIuaD4sIHdoaWNoIG1heSBkZWNsYXJlIHNvbWUgb2YgdGhlc2UsIHdlIGRvbid0CisgKiBnZXQgYSBidW5jaCBvZiBjb21wbGFpbnRzIGZyb20gdGhlIEMgY29tcGlsZXIgYWJvdXQgcmVkZWZpbml0aW9ucworICogb2YgdGhlc2UgdmFsdWVzLgorICoKKyAqIFdlIGRlY2xhcmUgYWxsIG9mIHRoZW0gaGVyZSBzbyB0aGF0IG5vIGZpbGUgaGFzIHRvIGluY2x1ZGUKKyAqIDxuZXRpbmV0L2lmX2V0aGVyLmg+IGlmIGFsbCBpdCBuZWVkcyBhcmUgRVRIRVJUWVBFXyB2YWx1ZXMuCisgKi8KKworI2lmbmRlZiBFVEhFUlRZUEVfUFVQCisjZGVmaW5lCUVUSEVSVFlQRV9QVVAJCTB4MDIwMAkvKiBQVVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfSVAKKyNkZWZpbmUJRVRIRVJUWVBFX0lQCQkweDA4MDAJLyogSVAgcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfQVJQCisjZGVmaW5lIEVUSEVSVFlQRV9BUlAJCTB4MDgwNgkvKiBBZGRyLiByZXNvbHV0aW9uIHByb3RvY29sICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX1JFVkFSUAorI2RlZmluZSBFVEhFUlRZUEVfUkVWQVJQCTB4ODAzNQkvKiByZXZlcnNlIEFkZHIuIHJlc29sdXRpb24gcHJvdG9jb2wgKi8KKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfTlMKKyNkZWZpbmUgRVRIRVJUWVBFX05TCQkweDA2MDAKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfU1BSSVRFCisjZGVmaW5lCUVUSEVSVFlQRV9TUFJJVEUJMHgwNTAwCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX1RSQUlMCisjZGVmaW5lIEVUSEVSVFlQRV9UUkFJTAkJMHgxMDAwCisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX01PUERMCisjZGVmaW5lCUVUSEVSVFlQRV9NT1BETAkJMHg2MDAxCisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX01PUFJDCisjZGVmaW5lCUVUSEVSVFlQRV9NT1BSQwkJMHg2MDAyCisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX0ROCisjZGVmaW5lCUVUSEVSVFlQRV9ETgkJMHg2MDAzCisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX0xBVAorI2RlZmluZQlFVEhFUlRZUEVfTEFUCQkweDYwMDQKKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfU0NBCisjZGVmaW5lIEVUSEVSVFlQRV9TQ0EJCTB4NjAwNworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9SRVZBUlAKKyNkZWZpbmUgRVRIRVJUWVBFX1JFVkFSUAkweDgwMzUKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfTEFOQlJJREdFCisjZGVmaW5lCUVUSEVSVFlQRV9MQU5CUklER0UJMHg4MDM4CisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX0RFQ0ROUworI2RlZmluZQlFVEhFUlRZUEVfREVDRE5TCTB4ODAzYworI2VuZGlmCisjaWZuZGVmCUVUSEVSVFlQRV9ERUNEVFMKKyNkZWZpbmUJRVRIRVJUWVBFX0RFQ0RUUwkweDgwM2UKKyNlbmRpZgorI2lmbmRlZglFVEhFUlRZUEVfVkVYUAorI2RlZmluZQlFVEhFUlRZUEVfVkVYUAkJMHg4MDViCisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX1ZQUk9ECisjZGVmaW5lCUVUSEVSVFlQRV9WUFJPRAkJMHg4MDVjCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0FUQUxLCisjZGVmaW5lIEVUSEVSVFlQRV9BVEFMSwkJMHg4MDliCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0FBUlAKKyNkZWZpbmUgRVRIRVJUWVBFX0FBUlAJCTB4ODBmMworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV84MDIxUQorI2RlZmluZSBFVEhFUlRZUEVfODAyMVEJCTB4ODEwMAorI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9JUFgKKyNkZWZpbmUgRVRIRVJUWVBFX0lQWAkJMHg4MTM3CisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0lQVjYKKyNkZWZpbmUgRVRIRVJUWVBFX0lQVjYJCTB4ODZkZAorI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9NUExTCisjZGVmaW5lIEVUSEVSVFlQRV9NUExTICAgICAgICAgIDB4ODg0NworI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9NUExTX01VTFRJCisjZGVmaW5lIEVUSEVSVFlQRV9NUExTX01VTFRJICAgIDB4ODg0OAorI2VuZGlmCisjaWZuZGVmIEVUSEVSVFlQRV9QUFBPRUQKKyNkZWZpbmUgRVRIRVJUWVBFX1BQUE9FRAkweDg4NjMKKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfUFBQT0VTCisjZGVmaW5lIEVUSEVSVFlQRV9QUFBPRVMJMHg4ODY0CisjZW5kaWYKKyNpZm5kZWYJRVRIRVJUWVBFX0xPT1BCQUNLCisjZGVmaW5lCUVUSEVSVFlQRV9MT09QQkFDSwkweDkwMDAKKyNlbmRpZgorI2lmbmRlZiBFVEhFUlRZUEVfODAyMVFJTlEKKyNkZWZpbmUgRVRIRVJUWVBFXzgwMjFRSU5RCTB4OTEwMAorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2ZhZC1nZXRhZC5jIGIvbGlicGNhcC0xLjMuMC9mYWQtZ2V0YWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDJhZTFmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9mYWQtZ2V0YWQuYwpAQCAtMCwwICsxLDI5NyBAQAorLyogLSotIE1vZGU6IGM7IHRhYi13aWR0aDogODsgaW5kZW50LXRhYnMtbW9kZTogMTsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIENvbXB1dGVyIFN5c3RlbXMKKyAqCUVuZ2luZWVyaW5nIEdyb3VwIGF0IExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciBvZiB0aGUgTGFib3JhdG9yeSBtYXkgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2ZhZC1nZXRhZC5jLHYgMS4xMiAyMDA3LTA5LTE0IDAwOjQ0OjU1IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8aWZhZGRycy5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2lmZGVmIEFGX1BBQ0tFVAorIyBpZmRlZiBIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSAorLyogU29sYXJpcyAxMSBhbmQgbGF0ZXIsIExpbnV4IGRpc3RyaWJ1dGlvbnMgd2l0aCBuZXdlciBnbGliYyAqLworIyAgaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorIyBlbHNlIC8qIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9IICovCisvKiBMeW54T1MsIExpbnV4IGRpc3RyaWJ1dGlvbnMgd2l0aCBvbGRlciBnbGliYyAqLworIyBpZmRlZiBfX0x5bnhfXworLyogTHlueE9TICovCisjICBpbmNsdWRlIDxuZXRwYWNrZXQvaWZfcGFja2V0Lmg+CisjIGVsc2UgLyogX19MeW54X18gKi8KKy8qIExpbnV4ICovCisjICBpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorIyAgaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjIGVuZGlmIC8qIF9fTHlueF9fICovCisjIGVuZGlmIC8qIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9IICovCisjZW5kaWYgLyogQUZfUEFDS0VUICovCisKKy8qCisgKiBUaGlzIGlzIGZ1bi4KKyAqCisgKiBJbiBvbGRlciBCU0Qgc3lzdGVtcywgc29ja2V0IGFkZHJlc3NlcyB3ZXJlIGZpeGVkLWxlbmd0aCwgYW5kCisgKiAic2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHIpIiBnYXZlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUuCisgKiBBbGwgYWRkcmVzc2VzIGZpdCB3aXRoaW4gYSAic3RydWN0IHNvY2thZGRyIi4KKyAqCisgKiBJbiBuZXdlciBCU0Qgc3lzdGVtcywgdGhlIHNvY2tldCBhZGRyZXNzIGlzIHZhcmlhYmxlLWxlbmd0aCwgYW5kCisgKiB0aGVyZSdzIGFuICJzYV9sZW4iIGZpZWxkIGdpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3R1cmU7CisgKiB0aGlzIGFsbG93cyBzb2NrZXQgYWRkcmVzc2VzIHRvIGJlIGxvbmdlciB0aGFuIDIgYnl0ZXMgb2YgZmFtaWx5CisgKiBhbmQgMTQgYnl0ZXMgb2YgZGF0YS4KKyAqCisgKiBTb21lIGNvbW1lcmNpYWwgVU5JWGVzIHVzZSB0aGUgb2xkIEJTRCBzY2hlbWUsIHNvbWUgdXNlIHRoZSBSRkMgMjU1MworICogdmFyaWFudCBvZiB0aGUgb2xkIEJTRCBzY2hlbWUgKHdpdGggInN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIiByYXRoZXIKKyAqIHRoYW4gInN0cnVjdCBzb2NrYWRkciIpLCBhbmQgc29tZSB1c2UgdGhlIG5ldyBCU0Qgc2NoZW1lLgorICoKKyAqIFNvbWUgdmVyc2lvbnMgb2YgR05VIGxpYmMgdXNlIG5laXRoZXIgc2NoZW1lLCBidXQgaGFzIGFuICJTQV9MRU4oKSIKKyAqIG1hY3JvIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBiYXNlZCBvbiB0aGUgYWRkcmVzcyBmYW1pbHkuICBPdGhlcgorICogdmVyc2lvbnMgZG9uJ3QgaGF2ZSAiU0FfTEVOKCkiIChhcyBpdCB3YXMgaW4gZHJhZnRzIG9mIFJGQyAyNTUzCisgKiBidXQgbm90IGluIHRoZSBmaW5hbCB2ZXJzaW9uKS4gIE9uIHRoZSBsYXR0ZXIgc3lzdGVtcywgd2UgZXhwbGljaXRseQorICogY2hlY2sgdGhlIEFGXyB0eXBlIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoOyB3ZSBhc3N1bWUgdGhhdCBvbgorICogYWxsIHRob3NlIHN5c3RlbXMgd2UgaGF2ZSAic3RydWN0IHNvY2thZGRyX3N0b3JhZ2UiLgorICovCisjaWZuZGVmIFNBX0xFTgorI2lmZGVmIEhBVkVfU09DS0FERFJfU0FfTEVOCisjZGVmaW5lIFNBX0xFTihhZGRyKQkoKGFkZHIpLT5zYV9sZW4pCisjZWxzZSAvKiBIQVZFX1NPQ0tBRERSX1NBX0xFTiAqLworI2lmZGVmIEhBVkVfU09DS0FERFJfU1RPUkFHRQorc3RhdGljIHNpemVfdAorZ2V0X3NhX2xlbihzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIpCit7CisJc3dpdGNoIChhZGRyLT5zYV9mYW1pbHkpIHsKKworI2lmZGVmIEFGX0lORVQKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiAoc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKyNlbmRpZgorCisjaWZkZWYgQUZfSU5FVDYKKwljYXNlIEFGX0lORVQ2OgorCQlyZXR1cm4gKHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luNikpOworI2VuZGlmCisKKyNpZmRlZiBBRl9QQUNLRVQKKwljYXNlIEFGX1BBQ0tFVDoKKwkJcmV0dXJuIChzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9sbCkpOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQlyZXR1cm4gKHNpemVvZiAoc3RydWN0IHNvY2thZGRyKSk7CisJfQorfQorI2RlZmluZSBTQV9MRU4oYWRkcikJKGdldF9zYV9sZW4oYWRkcikpCisjZWxzZSAvKiBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgKi8KKyNkZWZpbmUgU0FfTEVOKGFkZHIpCShzaXplb2YgKHN0cnVjdCBzb2NrYWRkcikpCisjZW5kaWYgLyogSEFWRV9TT0NLQUREUl9TVE9SQUdFICovCisjZW5kaWYgLyogSEFWRV9TT0NLQUREUl9TQV9MRU4gKi8KKyNlbmRpZiAvKiBTQV9MRU4gKi8KKworLyoKKyAqIEdldCBhIGxpc3Qgb2YgYWxsIGludGVyZmFjZXMgdGhhdCBhcmUgdXAgYW5kIHRoYXQgd2UgY2FuIG9wZW4uCisgKiBSZXR1cm5zIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZS4KKyAqIFRoZSBsaXN0LCBhcyByZXR1cm5lZCB0aHJvdWdoICJhbGxkZXZzcCIsIG1heSBiZSBudWxsIGlmIG5vIGludGVyZmFjZXMKKyAqIHdlcmUgdXAgYW5kIGNvdWxkIGJlIG9wZW5lZC4KKyAqCisgKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIG9uIHBsYXRmb3JtcyB0aGF0IGhhdmUgImdldGlmYWRkcnMoKSIuCisgKi8KK2ludAorcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworCXBjYXBfaWZfdCAqZGV2bGlzdCA9IE5VTEw7CisJc3RydWN0IGlmYWRkcnMgKmlmYXAsICppZmE7CisJc3RydWN0IHNvY2thZGRyICphZGRyLCAqbmV0bWFzaywgKmJyb2FkYWRkciwgKmRzdGFkZHI7CisJc2l6ZV90IGFkZHJfc2l6ZSwgYnJvYWRhZGRyX3NpemUsIGRzdGFkZHJfc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpwLCAqcTsKKworCS8qCisJICogR2V0IHRoZSBsaXN0IG9mIGludGVyZmFjZSBhZGRyZXNzZXMuCisJICoKKwkgKiBOb3RlOiB0aGlzIHdvbid0IHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBpbnRlcmZhY2VzCisJICogd2l0aCBubyBhZGRyZXNzZXM7IGFyZSB0aGVyZSBhbnkgc3VjaCBpbnRlcmZhY2VzCisJICogdGhhdCB3b3VsZCBiZSBjYXBhYmxlIG9mIHJlY2VpdmluZyBwYWNrZXRzPworCSAqIChJbnRlcmZhY2VzIGluY2FwYWJsZSBvZiByZWNlaXZpbmcgcGFja2V0cyBhcmVuJ3QKKwkgKiB2ZXJ5IGludGVyZXN0aW5nIGZyb20gbGlicGNhcCdzIHBvaW50IG9mIHZpZXcuKQorCSAqCisJICogTEFOIGludGVyZmFjZXMgd2lsbCBwcm9iYWJseSBoYXZlIGxpbmstbGF5ZXIKKwkgKiBhZGRyZXNzZXM7IEkgZG9uJ3Qga25vdyB3aGV0aGVyIGFsbCBpbXBsZW1lbnRhdGlvbnMKKwkgKiBvZiAiZ2V0aWZhZGRycygpIiBub3csIG9yIGluIHRoZSBmdXR1cmUsIHdpbGwgcmV0dXJuCisJICogdGhvc2UuCisJICovCisJaWYgKGdldGlmYWRkcnMoJmlmYXApICE9IDApIHsKKwkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImdldGlmYWRkcnM6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJZm9yIChpZmEgPSBpZmFwOyBpZmEgIT0gTlVMTDsgaWZhID0gaWZhLT5pZmFfbmV4dCkgeworCQkvKgorCQkgKiBJcyB0aGlzIGludGVyZmFjZSB1cD8KKwkJICovCisJCWlmICghKGlmYS0+aWZhX2ZsYWdzICYgSUZGX1VQKSkgeworCQkJLyoKKwkJCSAqIE5vLCBzbyBkb24ndCBhZGQgaXQgdG8gdGhlIGxpc3QuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogImlmYV9hZGRyIiB3YXMgYXBwYXJlbnRseSBudWxsIG9uIGF0IGxlYXN0IG9uZQorCQkgKiBpbnRlcmZhY2Ugb24gc29tZSBzeXN0ZW0uCisJCSAqCisJCSAqICJpZmFfYnJvYWRhZGRyIiBtYXkgYmUgbm9uLW51bGwgZXZlbiBvbgorCQkgKiBub24tYnJvYWRjYXN0IGludGVyZmFjZXMsIGFuZCB3YXMgbnVsbCBvbgorCQkgKiBhdCBsZWFzdCBvbmUgT3BlbkJTRCAzLjQgc3lzdGVtIG9uIGF0IGxlYXN0CisJCSAqIG9uZSBpbnRlcmZhY2Ugd2l0aCBJRkZfQlJPQURDQVNUIHNldC4KKwkJICoKKwkJICogImlmYV9kc3RhZGRyIiB3YXMsIG9uIGF0IGxlYXN0IG9uZSBGcmVlQlNEIDQuMQorCQkgKiBzeXN0ZW0sIG5vbi1udWxsIG9uIGEgbm9uLXBvaW50LXRvLXBvaW50CisJCSAqIGludGVyZmFjZS4KKwkJICoKKwkJICogVGhlcmVmb3JlLCB3ZSBzdXBwbHkgdGhlIGFkZHJlc3MgYW5kIG5ldG1hc2sgb25seQorCQkgKiBpZiAiaWZhX2FkZHIiIGlzIG5vbi1udWxsIChpZiB0aGVyZSdzIG5vIGFkZHJlc3MsCisJCSAqIHRoZXJlJ3Mgb2J2aW91c2x5IG5vIG5ldG1hc2spLCBhbmQgc3VwcGx5IHRoZQorCQkgKiBicm9hZGNhc3QgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBpZiB0aGUgYXBwcm9wcmlhdGUKKwkJICogZmxhZyBpcyBzZXQgKmFuZCogdGhlIGFwcHJvcHJpYXRlICJpZmFfIiBlbnRyeSBkb2Vzbid0CisJCSAqIGV2YWx1YXRlIHRvIGEgbnVsbCBwb2ludGVyLgorCQkgKi8KKwkJaWYgKGlmYS0+aWZhX2FkZHIgIT0gTlVMTCkgeworCQkJYWRkciA9IGlmYS0+aWZhX2FkZHI7CisJCQlhZGRyX3NpemUgPSBTQV9MRU4oYWRkcik7CisJCQluZXRtYXNrID0gaWZhLT5pZmFfbmV0bWFzazsKKwkJfSBlbHNlIHsKKwkJCWFkZHIgPSBOVUxMOworCQkJYWRkcl9zaXplID0gMDsKKwkJCW5ldG1hc2sgPSBOVUxMOworCQl9CisJCWlmIChpZmEtPmlmYV9mbGFncyAmIElGRl9CUk9BRENBU1QgJiYKKwkJICAgIGlmYS0+aWZhX2Jyb2FkYWRkciAhPSBOVUxMKSB7CisJCQlicm9hZGFkZHIgPSBpZmEtPmlmYV9icm9hZGFkZHI7CisJCQlicm9hZGFkZHJfc2l6ZSA9IFNBX0xFTihicm9hZGFkZHIpOworCQl9IGVsc2UgeworCQkJYnJvYWRhZGRyID0gTlVMTDsKKwkJCWJyb2FkYWRkcl9zaXplID0gMDsKKwkJfQorCQlpZiAoaWZhLT5pZmFfZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQgJiYKKwkJICAgIGlmYS0+aWZhX2RzdGFkZHIgIT0gTlVMTCkgeworCQkJZHN0YWRkciA9IGlmYS0+aWZhX2RzdGFkZHI7CisJCQlkc3RhZGRyX3NpemUgPSBTQV9MRU4oaWZhLT5pZmFfZHN0YWRkcik7CisJCX0gZWxzZSB7CisJCQlkc3RhZGRyID0gTlVMTDsKKwkJCWRzdGFkZHJfc2l6ZSA9IDA7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGlzIGVudHJ5IGhhcyBhIGNvbG9uIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIGF0CisJCSAqIHRoZSBlbmQsIHdlIGFzc3VtZSBpdCdzIGEgbG9naWNhbCBpbnRlcmZhY2UuICBUaG9zZQorCQkgKiBhcmUganVzdCB0aGUgd2F5IHlvdSBhc3NpZ24gbXVsdGlwbGUgSVAgYWRkcmVzc2VzIHRvCisJCSAqIGEgcmVhbCBpbnRlcmZhY2Ugb24gTGludXgsIHNvIGFuIGVudHJ5IGZvciBhIGxvZ2ljYWwKKwkJICogaW50ZXJmYWNlIHNob3VsZCBiZSB0cmVhdGVkIGxpa2UgdGhlIGVudHJ5IGZvciB0aGUKKwkJICogcmVhbCBpbnRlcmZhY2U7IHdlIGRvIHRoYXQgYnkgc3RyaXBwaW5nIG9mZiB0aGUgIjoiCisJCSAqIGFuZCB0aGUgbnVtYmVyLgorCQkgKgorCQkgKiBYWFggLSBzaG91bGQgd2UgZG8gdGhpcyBvbmx5IG9uIExpbnV4PworCQkgKi8KKwkJcCA9IHN0cmNocihpZmEtPmlmYV9uYW1lLCAnOicpOworCQlpZiAocCAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogV2UgaGF2ZSBhICI6IjsgaXMgaXQgZm9sbG93ZWQgYnkgYSBudW1iZXI/CisJCQkgKi8KKwkJCXEgPSBwICsgMTsKKwkJCXdoaWxlIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSpxKSkKKwkJCQlxKys7CisJCQlpZiAoKnEgPT0gJ1wwJykgeworCQkJCS8qCisJCQkJICogQWxsIGRpZ2l0cyBhZnRlciB0aGUgIjoiIHVudGlsIHRoZSBlbmQuCisJCQkJICogU3RyaXAgb2ZmIHRoZSAiOiIgYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIKKwkJCQkgKiBpdC4KKwkJCQkgKi8KKwkJCSAgICAgICAqcCA9ICdcMCc7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBBZGQgaW5mb3JtYXRpb24gZm9yIHRoaXMgYWRkcmVzcyB0byB0aGUgbGlzdC4KKwkJICovCisJCWlmIChhZGRfYWRkcl90b19pZmxpc3QoJmRldmxpc3QsIGlmYS0+aWZhX25hbWUsCisJCSAgICBpZmEtPmlmYV9mbGFncywgYWRkciwgYWRkcl9zaXplLCBuZXRtYXNrLCBhZGRyX3NpemUsCisJCSAgICBicm9hZGFkZHIsIGJyb2FkYWRkcl9zaXplLCBkc3RhZGRyLCBkc3RhZGRyX3NpemUsCisJCSAgICBlcnJidWYpIDwgMCkgeworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCX0KKworCWZyZWVpZmFkZHJzKGlmYXApOworCisJaWYgKHJldCAhPSAtMSkgeworCQkvKgorCQkgKiBXZSBoYXZlbid0IGhhZCBhbnkgZXJyb3JzIHlldDsgZG8gYW55IHBsYXRmb3JtLXNwZWNpZmljCisJCSAqIG9wZXJhdGlvbnMgdG8gYWRkIGRldmljZXMuCisJCSAqLworCQlpZiAocGNhcF9wbGF0Zm9ybV9maW5kZGV2cygmZGV2bGlzdCwgZXJyYnVmKSA8IDApCisJCQlyZXQgPSAtMTsKKwl9CisKKwlpZiAocmV0ID09IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhZCBhbiBlcnJvcjsgZnJlZSB0aGUgbGlzdCB3ZSd2ZSBiZWVuIGNvbnN0cnVjdGluZy4KKwkJICovCisJCWlmIChkZXZsaXN0ICE9IE5VTEwpIHsKKwkJCXBjYXBfZnJlZWFsbGRldnMoZGV2bGlzdCk7CisJCQlkZXZsaXN0ID0gTlVMTDsKKwkJfQorCX0KKworCSphbGxkZXZzcCA9IGRldmxpc3Q7CisJcmV0dXJuIChyZXQpOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9mYWQtZ2lmYy5jIGIvbGlicGNhcC0xLjMuMC9mYWQtZ2lmYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTJlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2ZhZC1naWZjLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8qIC0qLSBNb2RlOiBjOyB0YWItd2lkdGg6IDg7IGluZGVudC10YWJzLW1vZGU6IDE7IGMtYmFzaWMtb2Zmc2V0OiA4OyAtKi0gKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDE5OTgKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCisgKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9mYWQtZ2lmYy5jLHYgMS4xMiAyMDA4LTA4LTA2IDA3OjM0OjA5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2lmZGVmIEhBVkVfU1lTX1NPQ0tJT19ICisjaW5jbHVkZSA8c3lzL3NvY2tpby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4JCQkJLyogY29uY2Vzc2lvbiB0byBBSVggKi8KKworc3RydWN0IG1idWY7CQkvKiBTcXVlbGNoIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHNvbWUgcGxhdGZvcm1zIGZvciAqLworc3RydWN0IHJ0ZW50cnk7CQkvKiBkZWNsYXJhdGlvbnMgaW4gPG5ldC9pZi5oPiAqLworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgZnVuLgorICoKKyAqIEluIG9sZGVyIEJTRCBzeXN0ZW1zLCBzb2NrZXQgYWRkcmVzc2VzIHdlcmUgZml4ZWQtbGVuZ3RoLCBhbmQKKyAqICJzaXplb2YgKHN0cnVjdCBzb2NrYWRkcikiIGdhdmUgdGhlIHNpemUgb2YgdGhlIHN0cnVjdHVyZS4KKyAqIEFsbCBhZGRyZXNzZXMgZml0IHdpdGhpbiBhICJzdHJ1Y3Qgc29ja2FkZHIiLgorICoKKyAqIEluIG5ld2VyIEJTRCBzeXN0ZW1zLCB0aGUgc29ja2V0IGFkZHJlc3MgaXMgdmFyaWFibGUtbGVuZ3RoLCBhbmQKKyAqIHRoZXJlJ3MgYW4gInNhX2xlbiIgZmllbGQgZ2l2aW5nIHRoZSBsZW5ndGggb2YgdGhlIHN0cnVjdHVyZTsKKyAqIHRoaXMgYWxsb3dzIHNvY2tldCBhZGRyZXNzZXMgdG8gYmUgbG9uZ2VyIHRoYW4gMiBieXRlcyBvZiBmYW1pbHkKKyAqIGFuZCAxNCBieXRlcyBvZiBkYXRhLgorICoKKyAqIFNvbWUgY29tbWVyY2lhbCBVTklYZXMgdXNlIHRoZSBvbGQgQlNEIHNjaGVtZSwgc29tZSB1c2UgdGhlIFJGQyAyNTUzCisgKiB2YXJpYW50IG9mIHRoZSBvbGQgQlNEIHNjaGVtZSAod2l0aCAic3RydWN0IHNvY2thZGRyX3N0b3JhZ2UiIHJhdGhlcgorICogdGhhbiAic3RydWN0IHNvY2thZGRyIiksIGFuZCBzb21lIHVzZSB0aGUgbmV3IEJTRCBzY2hlbWUuCisgKgorICogU29tZSB2ZXJzaW9ucyBvZiBHTlUgbGliYyB1c2UgbmVpdGhlciBzY2hlbWUsIGJ1dCBoYXMgYW4gIlNBX0xFTigpIgorICogbWFjcm8gdGhhdCBkZXRlcm1pbmVzIHRoZSBzaXplIGJhc2VkIG9uIHRoZSBhZGRyZXNzIGZhbWlseS4gIE90aGVyCisgKiB2ZXJzaW9ucyBkb24ndCBoYXZlICJTQV9MRU4oKSIgKGFzIGl0IHdhcyBpbiBkcmFmdHMgb2YgUkZDIDI1NTMKKyAqIGJ1dCBub3QgaW4gdGhlIGZpbmFsIHZlcnNpb24pLgorICoKKyAqIFdlIGFzc3VtZSB0aGF0IGEgVU5JWCB0aGF0IGRvZXNuJ3QgaGF2ZSAiZ2V0aWZhZGRycygpIiBhbmQgZG9lc24ndCBoYXZlCisgKiBTSU9DR0xJRkNPTkYsIGJ1dCBoYXMgU0lPQ0dJRkNPTkYsIHVzZXMgInN0cnVjdCBzb2NrYWRkciIgZm9yIHRoZQorICogYWRkcmVzcyBpbiBhbiBlbnRyeSByZXR1cm5lZCBieSBTSU9DR0lGQ09ORi4KKyAqLworI2lmbmRlZiBTQV9MRU4KKyNpZmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTgorI2RlZmluZSBTQV9MRU4oYWRkcikJKChhZGRyKS0+c2FfbGVuKQorI2Vsc2UgLyogSEFWRV9TT0NLQUREUl9TQV9MRU4gKi8KKyNkZWZpbmUgU0FfTEVOKGFkZHIpCShzaXplb2YgKHN0cnVjdCBzb2NrYWRkcikpCisjZW5kaWYgLyogSEFWRV9TT0NLQUREUl9TQV9MRU4gKi8KKyNlbmRpZiAvKiBTQV9MRU4gKi8KKworLyoKKyAqIFRoaXMgaXMgYWxzbyBmdW4uCisgKgorICogVGhlcmUgaXMgbm8gaW9jdGwgdGhhdCByZXR1cm5zIHRoZSBhbW91bnQgb2Ygc3BhY2UgcmVxdWlyZWQgZm9yIGFsbAorICogdGhlIGRhdGEgdGhhdCBTSU9DR0lGQ09ORiBjb3VsZCByZXR1cm4sIGFuZCBpZiBhIGJ1ZmZlciBpcyBzdXBwbGllZAorICogdGhhdCdzIG5vdCBsYXJnZSBlbm91Z2ggZm9yIGFsbCB0aGUgZGF0YSBTSU9DR0lGQ09ORiBjb3VsZCByZXR1cm4sCisgKiBvbiBhdCBsZWFzdCBzb21lIHBsYXRmb3JtcyBpdCBqdXN0IHJldHVybnMgdGhlIGRhdGEgdGhhdCdkIGZpdCB3aXRoCisgKiBubyBpbmRpY2F0aW9uIHRoYXQgdGhlcmUgd2Fzbid0IGVub3VnaCByb29tIGZvciBhbGwgdGhlIGRhdGEsIG11Y2gKKyAqIGxlc3MgYW4gaW5kaWNhdGlvbiBvZiBob3cgbXVjaCBtb3JlIHJvb20gaXMgcmVxdWlyZWQuCisgKgorICogVGhlIG9ubHkgd2F5IHRvIGVuc3VyZSB0aGF0IHdlIGdvdCBhbGwgdGhlIGRhdGEgaXMgdG8gcGFzcyBhIGJ1ZmZlcgorICogbGFyZ2UgZW5vdWdoIHRoYXQgdGhlIGFtb3VudCBvZiBzcGFjZSBpbiB0aGUgYnVmZmVyICpub3QqIGZpbGxlZCBpbgorICogaXMgZ3JlYXRlciB0aGFuIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGVudHJ5LgorICoKKyAqIFdlIGFzc3VtZSB0aGF0J3MgInNpemVvZihpZnJlcS5pZnJfbmFtZSkiIHBsdXMgMjU1LCB1bmRlciB0aGUgYXNzdW1wdGlvbgorICogdGhhdCBubyBhZGRyZXNzIGlzIG1vcmUgdGhhbiAyNTUgYnl0ZXMgKG9uIHN5c3RlbXMgd2hlcmUgdGhlICJzYV9sZW4iCisgKiBmaWVsZCBpbiBhICJzdHJ1Y3Qgc29ja2FkZHIiIGlzIDEgYnl0ZSwgZS5nLiBuZXdlciBCU0RzLCB0aGF0J3MgdGhlCisgKiBjYXNlLCBhbmQgYWRkcmVzc2VzIGFyZSB1bmxpa2VseSB0byBiZSBiaWdnZXIgdGhhbiB0aGF0IGluIGFueSBjYXNlKS4KKyAqLworI2RlZmluZSBNQVhfU0FfTEVOCTI1NQorCisvKgorICogR2V0IGEgbGlzdCBvZiBhbGwgaW50ZXJmYWNlcyB0aGF0IGFyZSB1cCBhbmQgdGhhdCB3ZSBjYW4gb3Blbi4KKyAqIFJldHVybnMgLTEgb24gZXJyb3IsIDAgb3RoZXJ3aXNlLgorICogVGhlIGxpc3QsIGFzIHJldHVybmVkIHRocm91Z2ggImFsbGRldnNwIiwgbWF5IGJlIG51bGwgaWYgbm8gaW50ZXJmYWNlcworICogd2VyZSB1cCBhbmQgY291bGQgYmUgb3BlbmVkLgorICoKKyAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgb24gcGxhdGZvcm1zIHRoYXQgaGF2ZSBTSU9DR0lGQ09ORiBidXQKKyAqIGRvbid0IGhhdmUgYW55IG90aGVyIG1lY2hhbmlzbSBmb3IgZ2V0dGluZyBhIGxpc3Qgb2YgaW50ZXJmYWNlcy4KKyAqCisgKiBYWFggLSBvciBwbGF0Zm9ybXMgdGhhdCBoYXZlIG90aGVyLCBiZXR0ZXIgbWVjaGFuaXNtcyBidXQgZm9yIHdoaWNoCisgKiB3ZSBkb24ndCB5ZXQgaGF2ZSBjb2RlIHRvIHVzZSB0aGF0IG1lY2hhbmlzbTsgSSB0aGluayB0aGVyZSdzIGEgYmV0dGVyCisgKiB3YXkgb24gTGludXgsIGZvciBleGFtcGxlLgorICovCitpbnQKK3BjYXBfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3sKKwlwY2FwX2lmX3QgKmRldmxpc3QgPSBOVUxMOworCXJlZ2lzdGVyIGludCBmZDsKKwlyZWdpc3RlciBzdHJ1Y3QgaWZyZXEgKmlmcnAsICppZmVuZCwgKmlmbmV4dDsKKwlpbnQgbjsKKwlzdHJ1Y3QgaWZjb25mIGlmYzsKKwljaGFyICpidWYgPSBOVUxMOworCXVuc2lnbmVkIGJ1Zl9zaXplOworI2lmIGRlZmluZWQgKEhBVkVfU09MQVJJUykgfHwgZGVmaW5lZCAoSEFWRV9IUFVYMTBfMjBfT1JfTEFURVIpCisJY2hhciAqcCwgKnE7CisjZW5kaWYKKwlzdHJ1Y3QgaWZyZXEgaWZyZmxhZ3MsIGlmcm5ldG1hc2ssIGlmcmJyb2FkYWRkciwgaWZyZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKm5ldG1hc2ssICpicm9hZGFkZHIsICpkc3RhZGRyOworCXNpemVfdCBuZXRtYXNrX3NpemUsIGJyb2FkYWRkcl9zaXplLCBkc3RhZGRyX3NpemU7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIENyZWF0ZSBhIHNvY2tldCBmcm9tIHdoaWNoIHRvIGZldGNoIHRoZSBsaXN0IG9mIGludGVyZmFjZXMuCisJICovCisJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkIDwgMCkgeworCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAic29ja2V0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBTdGFydCB3aXRoIGFuIDhLIGJ1ZmZlciwgYW5kIGtlZXAgZ3Jvd2luZyB0aGUgYnVmZmVyIHVudGlsCisJICogd2UgaGF2ZSBtb3JlIHRoYW4gInNpemVvZihpZnJwLT5pZnJfbmFtZSkgKyBNQVhfU0FfTEVOIgorCSAqIGJ5dGVzIGxlZnQgb3ZlciBpbiB0aGUgYnVmZmVyIG9yIHdlIGZhaWwgdG8gZ2V0IHRoZQorCSAqIGludGVyZmFjZSBsaXN0IGZvciBzb21lIHJlYXNvbiBvdGhlciB0aGFuIEVJTlZBTCAod2hpY2ggaXMKKwkgKiBwcmVzdW1lZCBoZXJlIHRvIG1lYW4gImJ1ZmZlciBpcyB0b28gc21hbGwiKS4KKwkgKi8KKwlidWZfc2l6ZSA9IDgxOTI7CisJZm9yICg7OykgeworCQlidWYgPSBtYWxsb2MoYnVmX3NpemUpOworCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCSh2b2lkKWNsb3NlKGZkKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisKKwkJaWZjLmlmY19sZW4gPSBidWZfc2l6ZTsKKwkJaWZjLmlmY19idWYgPSBidWY7CisJCW1lbXNldChidWYsIDAsIGJ1Zl9zaXplKTsKKwkJaWYgKGlvY3RsKGZkLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDAKKwkJICAgICYmIGVycm5vICE9IEVJTlZBTCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJTSU9DR0lGQ09ORjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkodm9pZCljbG9zZShmZCk7CisJCQlmcmVlKGJ1Zik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZiAoaWZjLmlmY19sZW4gPCBidWZfc2l6ZSAmJgorCQkgICAgKGJ1Zl9zaXplIC0gaWZjLmlmY19sZW4pID4gc2l6ZW9mKGlmcnAtPmlmcl9uYW1lKSArIE1BWF9TQV9MRU4pCisJCQlicmVhazsKKwkJZnJlZShidWYpOworCQlidWZfc2l6ZSAqPSAyOworCX0KKworCWlmcnAgPSAoc3RydWN0IGlmcmVxICopYnVmOworCWlmZW5kID0gKHN0cnVjdCBpZnJlcSAqKShidWYgKyBpZmMuaWZjX2xlbik7CisKKwlmb3IgKDsgaWZycCA8IGlmZW5kOyBpZnJwID0gaWZuZXh0KSB7CisJCS8qCisJCSAqIFhYWCAtIHdoYXQgaWYgdGhpcyBpc24ndCBhbiBJUHY0IGFkZHJlc3M/ICBDYW4KKwkJICogd2Ugc3RpbGwgZ2V0IHRoZSBuZXRtYXNrLCBldGMuIHdpdGggaW9jdGxzIG9uCisJCSAqIGFuIElQdjQgc29ja2V0PworCQkgKgorCQkgKiBUaGUgYW5zd2VyIGlzIHByb2JhYmx5IHBsYXRmb3JtLWRlcGVuZGVudCwgYW5kCisJCSAqIGlmIHRoZSBhbnN3ZXIgaXMgIm5vIiBvbiBtb3JlIHRoYW4gb25lIHBsYXRmb3JtLAorCQkgKiB0aGUgd2F5IHlvdSB3b3JrIGFyb3VuZCBpdCBpcyBwcm9iYWJseSBwbGF0Zm9ybS0KKwkJICogZGVwZW5kZW50IGFzIHdlbGwuCisJCSAqLworCQluID0gU0FfTEVOKCZpZnJwLT5pZnJfYWRkcikgKyBzaXplb2YoaWZycC0+aWZyX25hbWUpOworCQlpZiAobiA8IHNpemVvZigqaWZycCkpCisJCQlpZm5leHQgPSBpZnJwICsgMTsKKwkJZWxzZQorCQkJaWZuZXh0ID0gKHN0cnVjdCBpZnJlcSAqKSgoY2hhciAqKWlmcnAgKyBuKTsKKworCQkvKgorCQkgKiBYWFggLSBUaGUgMzItYml0IGNvbXBhdGliaWxpdHkgbGF5ZXIgZm9yIExpbnV4IG9uIElBLTY0CisJCSAqIGlzIHNsaWdodGx5IGJyb2tlbi4gSXQgY29ycmVjdGx5IGNvbnZlcnRzIHRoZSBzdHJ1Y3R1cmVzCisJCSAqIHRvIGFuZCBmcm9tIGtlcm5lbCBsYW5kIGZyb20gNjQgYml0IHRvIDMyIGJpdCBidXQgCisJCSAqIGRvZXNuJ3QgdXBkYXRlIGlmYy5pZmNfbGVuLCBsZWF2aW5nIGl0IGxhcmdlciB0aGFuIHRoZSAKKwkJICogYW1vdW50IHJlYWxseSB1c2VkLiBUaGlzIG1lYW5zIHdlIHJlYWQgb2ZmIHRoZSBlbmQgCisJCSAqIG9mIHRoZSBidWZmZXIgYW5kIGVuY291bnRlciBhbiBpbnRlcmZhY2Ugd2l0aCBhbiAKKwkJICogImVtcHR5IiBuYW1lLiBTaW5jZSB0aGlzIGlzIGhpZ2hseSB1bmxpa2VseSB0byBldmVyIAorCQkgKiBvY2N1ciBpbiBhIHZhbGlkIGNhc2Ugd2UgY2FuIGp1c3QgZmluaXNoIGxvb2tpbmcgZm9yIAorCQkgKiBpbnRlcmZhY2VzIGlmIHdlIHNlZSBhbiBlbXB0eSBuYW1lLgorCQkgKi8KKwkJaWYgKCEoKmlmcnAtPmlmcl9uYW1lKSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFNraXAgZW50cmllcyB0aGF0IGJlZ2luIHdpdGggImR1bW15Ii4KKwkJICogWFhYIC0gd2hhdCBhcmUgdGhlc2U/ICBJcyB0aGlzIExpbnV4LXNwZWNpZmljPworCQkgKiBBcmUgdGhlcmUgcGxhdGZvcm1zIG9uIHdoaWNoIHdlIHNob3VsZG4ndCBkbyB0aGlzPworCQkgKi8KKwkJaWYgKHN0cm5jbXAoaWZycC0+aWZyX25hbWUsICJkdW1teSIsIDUpID09IDApCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBHZXQgdGhlIGZsYWdzIGZvciB0aGlzIGludGVyZmFjZSwgYW5kIHNraXAgaXQgaWYgaXQncworCQkgKiBub3QgdXAuCisJCSAqLworCQlzdHJuY3B5KGlmcmZsYWdzLmlmcl9uYW1lLCBpZnJwLT5pZnJfbmFtZSwKKwkJICAgIHNpemVvZihpZnJmbGFncy5pZnJfbmFtZSkpOworCQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgKGNoYXIgKikmaWZyZmxhZ3MpIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVOWElPKQorCQkJCWNvbnRpbnVlOworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJTSU9DR0lGRkxBR1M6ICUuKnM6ICVzIiwKKwkJCSAgICAoaW50KXNpemVvZihpZnJmbGFncy5pZnJfbmFtZSksCisJCQkgICAgaWZyZmxhZ3MuaWZyX25hbWUsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShpZnJmbGFncy5pZnJfZmxhZ3MgJiBJRkZfVVApKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogR2V0IHRoZSBuZXRtYXNrIGZvciB0aGlzIGFkZHJlc3Mgb24gdGhpcyBpbnRlcmZhY2UuCisJCSAqLworCQlzdHJuY3B5KGlmcm5ldG1hc2suaWZyX25hbWUsIGlmcnAtPmlmcl9uYW1lLAorCQkgICAgc2l6ZW9mKGlmcm5ldG1hc2suaWZyX25hbWUpKTsKKwkJbWVtY3B5KCZpZnJuZXRtYXNrLmlmcl9hZGRyLCAmaWZycC0+aWZyX2FkZHIsCisJCSAgICBzaXplb2YoaWZybmV0bWFzay5pZnJfYWRkcikpOworCQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZORVRNQVNLLCAoY2hhciAqKSZpZnJuZXRtYXNrKSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFQUREUk5PVEFWQUlMKSB7CisJCQkJLyoKKwkJCQkgKiBOb3QgYXZhaWxhYmxlLgorCQkJCSAqLworCQkJCW5ldG1hc2sgPSBOVUxMOworCQkJCW5ldG1hc2tfc2l6ZSA9IDA7CisJCQl9IGVsc2UgeworCQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIlNJT0NHSUZORVRNQVNLOiAlLipzOiAlcyIsCisJCQkJICAgIChpbnQpc2l6ZW9mKGlmcm5ldG1hc2suaWZyX25hbWUpLAorCQkJCSAgICBpZnJuZXRtYXNrLmlmcl9uYW1lLAorCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0ID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQluZXRtYXNrID0gJmlmcm5ldG1hc2suaWZyX2FkZHI7CisJCQluZXRtYXNrX3NpemUgPSBTQV9MRU4obmV0bWFzayk7CisJCX0KKworCQkvKgorCQkgKiBHZXQgdGhlIGJyb2FkY2FzdCBhZGRyZXNzIGZvciB0aGlzIGFkZHJlc3Mgb24gdGhpcworCQkgKiBpbnRlcmZhY2UgKGlmIGFueSkuCisJCSAqLworCQlpZiAoaWZyZmxhZ3MuaWZyX2ZsYWdzICYgSUZGX0JST0FEQ0FTVCkgeworCQkJc3RybmNweShpZnJicm9hZGFkZHIuaWZyX25hbWUsIGlmcnAtPmlmcl9uYW1lLAorCQkJICAgIHNpemVvZihpZnJicm9hZGFkZHIuaWZyX25hbWUpKTsKKwkJCW1lbWNweSgmaWZyYnJvYWRhZGRyLmlmcl9hZGRyLCAmaWZycC0+aWZyX2FkZHIsCisJCQkgICAgc2l6ZW9mKGlmcmJyb2FkYWRkci5pZnJfYWRkcikpOworCQkJaWYgKGlvY3RsKGZkLCBTSU9DR0lGQlJEQUREUiwKKwkJCSAgICAoY2hhciAqKSZpZnJicm9hZGFkZHIpIDwgMCkgeworCQkJCWlmIChlcnJubyA9PSBFQUREUk5PVEFWQUlMKSB7CisJCQkJCS8qCisJCQkJCSAqIE5vdCBhdmFpbGFibGUuCisJCQkJCSAqLworCQkJCQlicm9hZGFkZHIgPSBOVUxMOworCQkJCQlicm9hZGFkZHJfc2l6ZSA9IDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkgICAgIlNJT0NHSUZCUkRBRERSOiAlLipzOiAlcyIsCisJCQkJCSAgICAoaW50KXNpemVvZihpZnJicm9hZGFkZHIuaWZyX25hbWUpLAorCQkJCQkgICAgaWZyYnJvYWRhZGRyLmlmcl9uYW1lLAorCQkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQlyZXQgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlicm9hZGFkZHIgPSAmaWZyYnJvYWRhZGRyLmlmcl9icm9hZGFkZHI7CisJCQkJYnJvYWRhZGRyX3NpemUgPSBTQV9MRU4oYnJvYWRhZGRyKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBOb3QgYSBicm9hZGNhc3QgaW50ZXJmYWNlLCBzbyBubyBicm9hZGNhc3QKKwkJCSAqIGFkZHJlc3MuCisJCQkgKi8KKwkJCWJyb2FkYWRkciA9IE5VTEw7CisJCQlicm9hZGFkZHJfc2l6ZSA9IDA7CisJCX0KKworCQkvKgorCQkgKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoaXMgYWRkcmVzcyBvbiB0aGlzCisJCSAqIGludGVyZmFjZSAoaWYgYW55KS4KKwkJICovCisJCWlmIChpZnJmbGFncy5pZnJfZmxhZ3MgJiBJRkZfUE9JTlRPUE9JTlQpIHsKKwkJCXN0cm5jcHkoaWZyZHN0YWRkci5pZnJfbmFtZSwgaWZycC0+aWZyX25hbWUsCisJCQkgICAgc2l6ZW9mKGlmcmRzdGFkZHIuaWZyX25hbWUpKTsKKwkJCW1lbWNweSgmaWZyZHN0YWRkci5pZnJfYWRkciwgJmlmcnAtPmlmcl9hZGRyLAorCQkJICAgIHNpemVvZihpZnJkc3RhZGRyLmlmcl9hZGRyKSk7CisJCQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZEU1RBRERSLAorCQkJICAgIChjaGFyICopJmlmcmRzdGFkZHIpIDwgMCkgeworCQkJCWlmIChlcnJubyA9PSBFQUREUk5PVEFWQUlMKSB7CisJCQkJCS8qCisJCQkJCSAqIE5vdCBhdmFpbGFibGUuCisJCQkJCSAqLworCQkJCQlkc3RhZGRyID0gTlVMTDsKKwkJCQkJZHN0YWRkcl9zaXplID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSAgICAiU0lPQ0dJRkRTVEFERFI6ICUuKnM6ICVzIiwKKwkJCQkJICAgIChpbnQpc2l6ZW9mKGlmcmRzdGFkZHIuaWZyX25hbWUpLAorCQkJCQkgICAgaWZyZHN0YWRkci5pZnJfbmFtZSwKKwkJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJcmV0ID0gLTE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJZHN0YWRkciA9ICZpZnJkc3RhZGRyLmlmcl9kc3RhZGRyOworCQkJCWRzdGFkZHJfc2l6ZSA9IFNBX0xFTihkc3RhZGRyKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBOb3QgYSBwb2ludC10by1wb2ludCBpbnRlcmZhY2UsIHNvIG5vIGRlc3RpbmF0aW9uCisJCQkgKiBhZGRyZXNzLgorCQkJICovCisJCQlkc3RhZGRyID0gTlVMTDsKKwkJCWRzdGFkZHJfc2l6ZSA9IDA7CisJCX0KKworI2lmIGRlZmluZWQgKEhBVkVfU09MQVJJUykgfHwgZGVmaW5lZCAoSEFWRV9IUFVYMTBfMjBfT1JfTEFURVIpCisJCS8qCisJCSAqIElmIHRoaXMgZW50cnkgaGFzIGEgY29sb24gZm9sbG93ZWQgYnkgYSBudW1iZXIgYXQKKwkJICogdGhlIGVuZCwgaXQncyBhIGxvZ2ljYWwgaW50ZXJmYWNlLiAgVGhvc2UgYXJlIGp1c3QKKwkJICogdGhlIHdheSB5b3UgYXNzaWduIG11bHRpcGxlIElQIGFkZHJlc3NlcyB0byBhIHJlYWwKKwkJICogaW50ZXJmYWNlLCBzbyBhbiBlbnRyeSBmb3IgYSBsb2dpY2FsIGludGVyZmFjZSBzaG91bGQKKwkJICogYmUgdHJlYXRlZCBsaWtlIHRoZSBlbnRyeSBmb3IgdGhlIHJlYWwgaW50ZXJmYWNlOworCQkgKiB3ZSBkbyB0aGF0IGJ5IHN0cmlwcGluZyBvZmYgdGhlICI6IiBhbmQgdGhlIG51bWJlci4KKwkJICovCisJCXAgPSBzdHJjaHIoaWZycC0+aWZyX25hbWUsICc6Jyk7CisJCWlmIChwICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgIjoiOyBpcyBpdCBmb2xsb3dlZCBieSBhIG51bWJlcj8KKwkJCSAqLworCQkJcSA9IHAgKyAxOworCQkJd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnEpKQorCQkJCXErKzsKKwkJCWlmICgqcSA9PSAnXDAnKSB7CisJCQkJLyoKKwkJCQkgKiBBbGwgZGlnaXRzIGFmdGVyIHRoZSAiOiIgdW50aWwgdGhlIGVuZC4KKwkJCQkgKiBTdHJpcCBvZmYgdGhlICI6IiBhbmQgZXZlcnl0aGluZyBhZnRlcgorCQkJCSAqIGl0LgorCQkJCSAqLworCQkJCSpwID0gJ1wwJzsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJLyoKKwkJICogQWRkIGluZm9ybWF0aW9uIGZvciB0aGlzIGFkZHJlc3MgdG8gdGhlIGxpc3QuCisJCSAqLworCQlpZiAoYWRkX2FkZHJfdG9faWZsaXN0KCZkZXZsaXN0LCBpZnJwLT5pZnJfbmFtZSwKKwkJICAgIGlmcmZsYWdzLmlmcl9mbGFncywgJmlmcnAtPmlmcl9hZGRyLAorCQkgICAgU0FfTEVOKCZpZnJwLT5pZnJfYWRkciksIG5ldG1hc2ssIG5ldG1hc2tfc2l6ZSwKKwkJICAgIGJyb2FkYWRkciwgYnJvYWRhZGRyX3NpemUsIGRzdGFkZHIsIGRzdGFkZHJfc2l6ZSwKKwkJICAgIGVycmJ1ZikgPCAwKSB7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZyZWUoYnVmKTsKKwkodm9pZCljbG9zZShmZCk7CisKKwlpZiAocmV0ICE9IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhdmVuJ3QgaGFkIGFueSBlcnJvcnMgeWV0OyBkbyBhbnkgcGxhdGZvcm0tc3BlY2lmaWMKKwkJICogb3BlcmF0aW9ucyB0byBhZGQgZGV2aWNlcy4KKwkJICovCisJCWlmIChwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKCZkZXZsaXN0LCBlcnJidWYpIDwgMCkKKwkJCXJldCA9IC0xOworCX0KKworCWlmIChyZXQgPT0gLTEpIHsKKwkJLyoKKwkJICogV2UgaGFkIGFuIGVycm9yOyBmcmVlIHRoZSBsaXN0IHdlJ3ZlIGJlZW4gY29uc3RydWN0aW5nLgorCQkgKi8KKwkJaWYgKGRldmxpc3QgIT0gTlVMTCkgeworCQkJcGNhcF9mcmVlYWxsZGV2cyhkZXZsaXN0KTsKKwkJCWRldmxpc3QgPSBOVUxMOworCQl9CisJfQorCisJKmFsbGRldnNwID0gZGV2bGlzdDsKKwlyZXR1cm4gKHJldCk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2ZhZC1nbGlmYy5jIGIvbGlicGNhcC0xLjMuMC9mYWQtZ2xpZmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjRiYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9mYWQtZ2xpZmMuYwpAQCAtMCwwICsxLDM4NiBAQAorLyogLSotIE1vZGU6IGM7IHRhYi13aWR0aDogODsgaW5kZW50LXRhYnMtbW9kZTogMTsgYy1iYXNpYy1vZmZzZXQ6IDg7IC0qLSAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIENvbXB1dGVyIFN5c3RlbXMKKyAqCUVuZ2luZWVyaW5nIEdyb3VwIGF0IExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciBvZiB0aGUgTGFib3JhdG9yeSBtYXkgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2ZhZC1nbGlmYy5jLHYgMS43IDIwMDgtMDEtMzAgMDk6MzU6NDggZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpZmRlZiBIQVZFX1NZU19TT0NLSU9fSAorI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CQkJCS8qIGNvbmNlc3Npb24gdG8gQUlYICovCisKK3N0cnVjdCBtYnVmOwkJLyogU3F1ZWxjaCBjb21waWxlciB3YXJuaW5ncyBvbiBzb21lIHBsYXRmb3JtcyBmb3IgKi8KK3N0cnVjdCBydGVudHJ5OwkJLyogZGVjbGFyYXRpb25zIGluIDxuZXQvaWYuaD4gKi8KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisKKyNpZmRlZiBIQVZFX09TX1BST1RPX0gKKyNpbmNsdWRlICJvcy1wcm90by5oIgorI2VuZGlmCisKKy8qCisgKiBHZXQgYSBsaXN0IG9mIGFsbCBpbnRlcmZhY2VzIHRoYXQgYXJlIHVwIGFuZCB0aGF0IHdlIGNhbiBvcGVuLgorICogUmV0dXJucyAtMSBvbiBlcnJvciwgMCBvdGhlcndpc2UuCisgKiBUaGUgbGlzdCwgYXMgcmV0dXJuZWQgdGhyb3VnaCAiYWxsZGV2c3AiLCBtYXkgYmUgbnVsbCBpZiBubyBpbnRlcmZhY2VzCisgKiB3ZXJlIHVwIGFuZCBjb3VsZCBiZSBvcGVuZWQuCisgKgorICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCBvbiBwbGF0Zm9ybXMgdGhhdCBoYXZlIFNJT0NHTElGQ09ORgorICogYnV0IGRvbid0IGhhdmUgImdldGlmYWRkcnMoKSIuICAoU29sYXJpcyA4IGFuZCBsYXRlcjsgd2UgdXNlCisgKiBTSU9DR0xJRkNPTkYgcmF0aGVyIHRoYW4gU0lPQ0dJRkNPTkYgaW4gb3JkZXIgdG8gZ2V0IElQdjYgYWRkcmVzc2VzLikKKyAqLworaW50CitwY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJcGNhcF9pZl90ICpkZXZsaXN0ID0gTlVMTDsKKwlyZWdpc3RlciBpbnQgZmQ0LCBmZDYsIGZkOworCXJlZ2lzdGVyIHN0cnVjdCBsaWZyZXEgKmlmcnAsICppZmVuZDsKKwlzdHJ1Y3QgbGlmbnVtIGlmbjsKKwlzdHJ1Y3QgbGlmY29uZiBpZmM7CisJY2hhciAqYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBidWZfc2l6ZTsKKyNpZmRlZiBIQVZFX1NPTEFSSVMKKwljaGFyICpwLCAqcTsKKyNlbmRpZgorCXN0cnVjdCBsaWZyZXEgaWZyZmxhZ3MsIGlmcm5ldG1hc2ssIGlmcmJyb2FkYWRkciwgaWZyZHN0YWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKm5ldG1hc2ssICpicm9hZGFkZHIsICpkc3RhZGRyOworCWludCByZXQgPSAwOworCisJLyoKKwkgKiBDcmVhdGUgYSBzb2NrZXQgZnJvbSB3aGljaCB0byBmZXRjaCB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzLAorCSAqIGFuZCBmcm9tIHdoaWNoIHRvIGZldGNoIElQdjQgaW5mb3JtYXRpb24uCisJICovCisJZmQ0ID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChmZDQgPCAwKSB7CisJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSBhIHNvY2tldCBmcm9tIHdoaWNoIHRvIGZldGNoIElQdjYgaW5mb3JtYXRpb24uCisJICovCisJZmQ2ID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQ2IDwgMCkgeworCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAic29ja2V0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpY2xvc2UoZmQ0KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBIb3cgbWFueSBlbnRyaWVzIHdpbGwgU0lPQ0dMSUZDT05GIHJldHVybj8KKwkgKi8KKwlpZm4ubGlmbl9mYW1pbHkgPSBBRl9VTlNQRUM7CisJaWZuLmxpZm5fZmxhZ3MgPSAwOworCWlmbi5saWZuX2NvdW50ID0gMDsKKwlpZiAoaW9jdGwoZmQ0LCBTSU9DR0xJRk5VTSwgKGNoYXIgKikmaWZuKSA8IDApIHsKKwkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIlNJT0NHTElGTlVNOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpY2xvc2UoZmQ2KTsKKwkJKHZvaWQpY2xvc2UoZmQ0KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhvc2UgZW50cmllcy4KKwkgKi8KKwlidWZfc2l6ZSA9IGlmbi5saWZuX2NvdW50ICogc2l6ZW9mIChzdHJ1Y3QgbGlmcmVxKTsKKwlidWYgPSBtYWxsb2MoYnVmX3NpemUpOworCWlmIChidWYgPT0gTlVMTCkgeworCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpY2xvc2UoZmQ2KTsKKwkJKHZvaWQpY2xvc2UoZmQ0KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGVudHJpZXMuCisJICovCisJaWZjLmxpZmNfbGVuID0gYnVmX3NpemU7CisJaWZjLmxpZmNfYnVmID0gYnVmOworCWlmYy5saWZjX2ZhbWlseSA9IEFGX1VOU1BFQzsKKwlpZmMubGlmY19mbGFncyA9IDA7CisJbWVtc2V0KGJ1ZiwgMCwgYnVmX3NpemUpOworCWlmIChpb2N0bChmZDQsIFNJT0NHTElGQ09ORiwgKGNoYXIgKikmaWZjKSA8IDApIHsKKwkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIlNJT0NHTElGQ09ORjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCSh2b2lkKWNsb3NlKGZkNik7CisJCSh2b2lkKWNsb3NlKGZkNCk7CisJCWZyZWUoYnVmKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBMb29wIG92ZXIgdGhlIGVudHJpZXMuCisJICovCisJaWZycCA9IChzdHJ1Y3QgbGlmcmVxICopYnVmOworCWlmZW5kID0gKHN0cnVjdCBsaWZyZXEgKikoYnVmICsgaWZjLmxpZmNfbGVuKTsKKworCWZvciAoOyBpZnJwIDwgaWZlbmQ7IGlmcnArKykgeworCQkvKgorCQkgKiBJUHY2IG9yIG5vdD8KKwkJICovCisJCWlmICgoKHN0cnVjdCBzb2NrYWRkciAqKSZpZnJwLT5saWZyX2FkZHIpLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCQlmZCA9IGZkNjsKKwkJZWxzZQorCQkJZmQgPSBmZDQ7CisKKwkJLyoKKwkJICogU2tpcCBlbnRyaWVzIHRoYXQgYmVnaW4gd2l0aCAiZHVtbXkiLgorCQkgKiBYWFggLSB3aGF0IGFyZSB0aGVzZT8gIElzIHRoaXMgTGludXgtc3BlY2lmaWM/CisJCSAqIEFyZSB0aGVyZSBwbGF0Zm9ybXMgb24gd2hpY2ggd2Ugc2hvdWxkbid0IGRvIHRoaXM/CisJCSAqLworCQlpZiAoc3RybmNtcChpZnJwLT5saWZyX25hbWUsICJkdW1teSIsIDUpID09IDApCisJCQljb250aW51ZTsKKworI2lmZGVmIEhBVkVfU09MQVJJUworCQkvKgorCQkgKiBTa2lwIGVudHJpZXMgdGhhdCBoYXZlIGEgIjoiIGZvbGxvd2VkIGJ5IGEgbnVtYmVyCisJCSAqIGF0IHRoZSBlbmQgLSB0aG9zZSBhcmUgU29sYXJpcyB2aXJ0dWFsIGludGVyZmFjZXMKKwkJICogb24gd2hpY2ggeW91IGNhbid0IGNhcHR1cmUuCisJCSAqLworCQlwID0gc3RyY2hyKGlmcnAtPmxpZnJfbmFtZSwgJzonKTsKKwkJaWYgKHAgIT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIFdlIGhhdmUgYSAiOiI7IGlzIGl0IGZvbGxvd2VkIGJ5IGEgbnVtYmVyPworCQkJICovCisJCQl3aGlsZSAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqcCkpCisJCQkJcCsrOworCQkJaWYgKCpwID09ICdcMCcpIHsKKwkJCQkvKgorCQkJCSAqIEFsbCBkaWdpdHMgYWZ0ZXIgdGhlICI6IiB1bnRpbCB0aGUgZW5kLgorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisjZW5kaWYKKworCQkvKgorCQkgKiBHZXQgdGhlIGZsYWdzIGZvciB0aGlzIGludGVyZmFjZSwgYW5kIHNraXAgaXQgaWYgaXQncworCQkgKiBub3QgdXAuCisJCSAqLworCQlzdHJuY3B5KGlmcmZsYWdzLmxpZnJfbmFtZSwgaWZycC0+bGlmcl9uYW1lLAorCQkgICAgc2l6ZW9mKGlmcmZsYWdzLmxpZnJfbmFtZSkpOworCQlpZiAoaW9jdGwoZmQsIFNJT0NHTElGRkxBR1MsIChjaGFyICopJmlmcmZsYWdzKSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTlhJTykKKwkJCQljb250aW51ZTsKKwkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiU0lPQ0dMSUZGTEFHUzogJS4qczogJXMiLAorCQkJICAgIChpbnQpc2l6ZW9mKGlmcmZsYWdzLmxpZnJfbmFtZSksCisJCQkgICAgaWZyZmxhZ3MubGlmcl9uYW1lLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEoaWZyZmxhZ3MubGlmcl9mbGFncyAmIElGRl9VUCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBHZXQgdGhlIG5ldG1hc2sgZm9yIHRoaXMgYWRkcmVzcyBvbiB0aGlzIGludGVyZmFjZS4KKwkJICovCisJCXN0cm5jcHkoaWZybmV0bWFzay5saWZyX25hbWUsIGlmcnAtPmxpZnJfbmFtZSwKKwkJICAgIHNpemVvZihpZnJuZXRtYXNrLmxpZnJfbmFtZSkpOworCQltZW1jcHkoJmlmcm5ldG1hc2subGlmcl9hZGRyLCAmaWZycC0+bGlmcl9hZGRyLAorCQkgICAgc2l6ZW9mKGlmcm5ldG1hc2subGlmcl9hZGRyKSk7CisJCWlmIChpb2N0bChmZCwgU0lPQ0dMSUZORVRNQVNLLCAoY2hhciAqKSZpZnJuZXRtYXNrKSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFQUREUk5PVEFWQUlMKSB7CisJCQkJLyoKKwkJCQkgKiBOb3QgYXZhaWxhYmxlLgorCQkJCSAqLworCQkJCW5ldG1hc2sgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJTSU9DR0xJRk5FVE1BU0s6ICUuKnM6ICVzIiwKKwkJCQkgICAgKGludClzaXplb2YoaWZybmV0bWFzay5saWZyX25hbWUpLAorCQkJCSAgICBpZnJuZXRtYXNrLmxpZnJfbmFtZSwKKwkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXJldCA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UKKwkJCW5ldG1hc2sgPSAoc3RydWN0IHNvY2thZGRyICopJmlmcm5ldG1hc2subGlmcl9hZGRyOworCisJCS8qCisJCSAqIEdldCB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgZm9yIHRoaXMgYWRkcmVzcyBvbiB0aGlzCisJCSAqIGludGVyZmFjZSAoaWYgYW55KS4KKwkJICovCisJCWlmIChpZnJmbGFncy5saWZyX2ZsYWdzICYgSUZGX0JST0FEQ0FTVCkgeworCQkJc3RybmNweShpZnJicm9hZGFkZHIubGlmcl9uYW1lLCBpZnJwLT5saWZyX25hbWUsCisJCQkgICAgc2l6ZW9mKGlmcmJyb2FkYWRkci5saWZyX25hbWUpKTsKKwkJCW1lbWNweSgmaWZyYnJvYWRhZGRyLmxpZnJfYWRkciwgJmlmcnAtPmxpZnJfYWRkciwKKwkJCSAgICBzaXplb2YoaWZyYnJvYWRhZGRyLmxpZnJfYWRkcikpOworCQkJaWYgKGlvY3RsKGZkLCBTSU9DR0xJRkJSREFERFIsCisJCQkgICAgKGNoYXIgKikmaWZyYnJvYWRhZGRyKSA8IDApIHsKKwkJCQlpZiAoZXJybm8gPT0gRUFERFJOT1RBVkFJTCkgeworCQkJCQkvKgorCQkJCQkgKiBOb3QgYXZhaWxhYmxlLgorCQkJCQkgKi8KKwkJCQkJYnJvYWRhZGRyID0gTlVMTDsKKwkJCQl9IGVsc2UgeworCQkJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSAgICAiU0lPQ0dMSUZCUkRBRERSOiAlLipzOiAlcyIsCisJCQkJCSAgICAoaW50KXNpemVvZihpZnJicm9hZGFkZHIubGlmcl9uYW1lKSwKKwkJCQkJICAgIGlmcmJyb2FkYWRkci5saWZyX25hbWUsCisJCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldCA9IC0xOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlicm9hZGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJmlmcmJyb2FkYWRkci5saWZyX2Jyb2FkYWRkcjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBOb3QgYSBicm9hZGNhc3QgaW50ZXJmYWNlLCBzbyBubyBicm9hZGNhc3QKKwkJCSAqIGFkZHJlc3MuCisJCQkgKi8KKwkJCWJyb2FkYWRkciA9IE5VTEw7CisJCX0KKworCQkvKgorCQkgKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHRoaXMgYWRkcmVzcyBvbiB0aGlzCisJCSAqIGludGVyZmFjZSAoaWYgYW55KS4KKwkJICovCisJCWlmIChpZnJmbGFncy5saWZyX2ZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSB7CisJCQlzdHJuY3B5KGlmcmRzdGFkZHIubGlmcl9uYW1lLCBpZnJwLT5saWZyX25hbWUsCisJCQkgICAgc2l6ZW9mKGlmcmRzdGFkZHIubGlmcl9uYW1lKSk7CisJCQltZW1jcHkoJmlmcmRzdGFkZHIubGlmcl9hZGRyLCAmaWZycC0+bGlmcl9hZGRyLAorCQkJICAgIHNpemVvZihpZnJkc3RhZGRyLmxpZnJfYWRkcikpOworCQkJaWYgKGlvY3RsKGZkLCBTSU9DR0xJRkRTVEFERFIsCisJCQkgICAgKGNoYXIgKikmaWZyZHN0YWRkcikgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVBRERSTk9UQVZBSUwpIHsKKwkJCQkJLyoKKwkJCQkJICogTm90IGF2YWlsYWJsZS4KKwkJCQkJICovCisJCQkJCWRzdGFkZHIgPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJICAgICJTSU9DR0xJRkRTVEFERFI6ICUuKnM6ICVzIiwKKwkJCQkJICAgIChpbnQpc2l6ZW9mKGlmcmRzdGFkZHIubGlmcl9uYW1lKSwKKwkJCQkJICAgIGlmcmRzdGFkZHIubGlmcl9uYW1lLAorCQkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQlyZXQgPSAtMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJZHN0YWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmaWZyZHN0YWRkci5saWZyX2RzdGFkZHI7CisJCX0gZWxzZQorCQkJZHN0YWRkciA9IE5VTEw7CisKKyNpZmRlZiBIQVZFX1NPTEFSSVMKKwkJLyoKKwkJICogSWYgdGhpcyBlbnRyeSBoYXMgYSBjb2xvbiBmb2xsb3dlZCBieSBhIG51bWJlciBhdAorCQkgKiB0aGUgZW5kLCBpdCdzIGEgbG9naWNhbCBpbnRlcmZhY2UuICBUaG9zZSBhcmUganVzdAorCQkgKiB0aGUgd2F5IHlvdSBhc3NpZ24gbXVsdGlwbGUgSVAgYWRkcmVzc2VzIHRvIGEgcmVhbAorCQkgKiBpbnRlcmZhY2UsIHNvIGFuIGVudHJ5IGZvciBhIGxvZ2ljYWwgaW50ZXJmYWNlIHNob3VsZAorCQkgKiBiZSB0cmVhdGVkIGxpa2UgdGhlIGVudHJ5IGZvciB0aGUgcmVhbCBpbnRlcmZhY2U7CisJCSAqIHdlIGRvIHRoYXQgYnkgc3RyaXBwaW5nIG9mZiB0aGUgIjoiIGFuZCB0aGUgbnVtYmVyLgorCQkgKi8KKwkJcCA9IHN0cmNocihpZnJwLT5saWZyX25hbWUsICc6Jyk7CisJCWlmIChwICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgIjoiOyBpcyBpdCBmb2xsb3dlZCBieSBhIG51bWJlcj8KKwkJCSAqLworCQkJcSA9IHAgKyAxOworCQkJd2hpbGUgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnEpKQorCQkJCXErKzsKKwkJCWlmICgqcSA9PSAnXDAnKSB7CisJCQkJLyoKKwkJCQkgKiBBbGwgZGlnaXRzIGFmdGVyIHRoZSAiOiIgdW50aWwgdGhlIGVuZC4KKwkJCQkgKiBTdHJpcCBvZmYgdGhlICI6IiBhbmQgZXZlcnl0aGluZyBhZnRlcgorCQkJCSAqIGl0LgorCQkJCSAqLworCQkJCSpwID0gJ1wwJzsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJLyoKKwkJICogQWRkIGluZm9ybWF0aW9uIGZvciB0aGlzIGFkZHJlc3MgdG8gdGhlIGxpc3QuCisJCSAqLworCQlpZiAoYWRkX2FkZHJfdG9faWZsaXN0KCZkZXZsaXN0LCBpZnJwLT5saWZyX25hbWUsCisJCSAgICBpZnJmbGFncy5saWZyX2ZsYWdzLCAoc3RydWN0IHNvY2thZGRyICopJmlmcnAtPmxpZnJfYWRkciwKKwkJICAgIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpLAorCQkgICAgbmV0bWFzaywgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSksCisJCSAgICBicm9hZGFkZHIsIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpLAorCQkgICAgZHN0YWRkciwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSksIGVycmJ1ZikgPCAwKSB7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWZyZWUoYnVmKTsKKwkodm9pZCljbG9zZShmZDYpOworCSh2b2lkKWNsb3NlKGZkNCk7CisKKwlpZiAocmV0ICE9IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhdmVuJ3QgaGFkIGFueSBlcnJvcnMgeWV0OyBkbyBhbnkgcGxhdGZvcm0tc3BlY2lmaWMKKwkJICogb3BlcmF0aW9ucyB0byBhZGQgZGV2aWNlcy4KKwkJICovCisJCWlmIChwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKCZkZXZsaXN0LCBlcnJidWYpIDwgMCkKKwkJCXJldCA9IC0xOworCX0KKworCWlmIChyZXQgPT0gLTEpIHsKKwkJLyoKKwkJICogV2UgaGFkIGFuIGVycm9yOyBmcmVlIHRoZSBsaXN0IHdlJ3ZlIGJlZW4gY29uc3RydWN0aW5nLgorCQkgKi8KKwkJaWYgKGRldmxpc3QgIT0gTlVMTCkgeworCQkJcGNhcF9mcmVlYWxsZGV2cyhkZXZsaXN0KTsKKwkJCWRldmxpc3QgPSBOVUxMOworCQl9CisJfQorCisJKmFsbGRldnNwID0gZGV2bGlzdDsKKwlyZXR1cm4gKHJldCk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2ZhZC1udWxsLmMgYi9saWJwY2FwLTEuMy4wL2ZhZC1udWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkNzkxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvZmFkLW51bGwuYwpAQCAtMCwwICsxLDY1IEBACisvKiAtKi0gTW9kZTogYzsgdGFiLXdpZHRoOiA4OyBpbmRlbnQtdGFicy1tb2RlOiAxOyBjLWJhc2ljLW9mZnNldDogODsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcworICoJRW5naW5lZXJpbmcgR3JvdXAgYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZmFkLW51bGwuYyx2IDEuMiAyMDAzLTExLTE1IDIzOjIzOjU4IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8cGNhcC5oPgorCisvKgorICogR2V0IGEgbGlzdCBvZiBhbGwgaW50ZXJmYWNlcyB0aGF0IGFyZSB1cCBhbmQgdGhhdCB3ZSBjYW4gb3Blbi4KKyAqIFJldHVybnMgLTEgb24gZXJyb3IsIDAgb3RoZXJ3aXNlLgorICogVGhlIGxpc3QsIGFzIHJldHVybmVkIHRocm91Z2ggImFsbGRldnNwIiwgbWF5IGJlIG51bGwgaWYgbm8gaW50ZXJmYWNlcworICogd2VyZSB1cCBhbmQgY291bGQgYmUgb3BlbmVkLgorICoKKyAqIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgb24gcGxhdGZvcm1zIHRoYXQgaGF2ZSBubyBzdXBwb3J0IGZvcgorICogcGFja2V0IGNhcHR1cmUuCisgKi8KK2ludAorcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworCS8qCisJICogU3VjY2VlZCwgYnV0IGRvbid0IHJldHVybiBhbnkgaW50ZXJmYWNlczsgd2UgcmV0dXJuIG9ubHkgdGhvc2UKKwkgKiB3ZSBjYW4gb3BlbiwgYW5kIHdlIGNhbid0IG9wZW4gYW55IGlmIHRoZXJlJ3Mgbm8gc3VwcG9ydAorCSAqIGZvciBwYWNrZXQgY2FwdHVyZS4KKwkgKi8KKwkqYWxsZGV2c3AgPSBOVUxMOworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2ZhZC1zaXRhLmMgYi9saWJwY2FwLTEuMy4wL2ZhZC1zaXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxOTA0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvZmFkLXNpdGEuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogIGZhZC1zaXRhLmM6IFBhY2tldCBjYXB0dXJlIGludGVyZmFjZSBhZGRpdGlvbnMgZm9yIFNJVEEgQUNOIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IEZ1bGtvIEhldywgU0lUQSBJTkMgQ2FuYWRhLCBJbmMgPGZ1bGtvLmhld0BzaXRhLmFlcm8+CisgKgorICogIExpY2Vuc2U6IEJTRAorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgICBkaXN0cmlidXRpb24uCisgKiAgMy4gVGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgICAgd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUgorICogIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECisgKiAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyAvKiAkSWQ6IGZhZC1zaXRhLmMgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2luY2x1ZGUgInBjYXAtc2l0YS5oIgorCitleHRlcm4gcGNhcF9pZl90CSphY25faWZfbGlzdDsJCQkJCQkJCS8qIHBjYXAncyBsaXN0IG9mIGF2YWlsYWJsZSBpbnRlcmZhY2VzICovCisKK2ludCBwY2FwX2ZpbmRhbGxkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpIHsKKworCS8vcHJpbnRmKCJwY2FwX2ZpbmRhbGxkZXZzKClcbiIpOwkJCQkvLyBmdWxrbworCisJKmFsbGRldnNwID0gMDsJCQkJCQkJCQkJCQkvKiBpbml0aWFsaXplIHRoZSByZXR1cm5lZCB2YXJpYWJsZXMgYmVmb3JlIHdlIGRvIGFueXRoaW5nICovCisJc3RyY3B5KGVycmJ1ZiwgIiIpOworCWlmIChhY25fcGFyc2VfaG9zdHNfZmlsZShlcnJidWYpKQkJCQkJCQkvKiBzY2FuIHRoZSBob3N0cyBmaWxlIGZvciBwb3RlbnRpYWwgSU9QcyAqLworCQl7CisJCS8vcHJpbnRmKCJwY2FwX2ZpbmRhbGxkZXZzKCkgcmV0dXJuaW5nIEJBRCBhZnRlciBwYXJzZWhvc3RzXG4iKTsJCQkJLy8gZnVsa28KKwkJcmV0dXJuIC0xOworCQl9CisJLy9wcmludGYoInBjYXBfZmluZGFsbGRldnMoKSBnb3QgaG9zdGxpc3Qgbm93IGZpbmRpbmcgZGV2c1xuIik7CQkJCS8vIGZ1bGtvCisJaWYgKGFjbl9maW5kYWxsZGV2cyhlcnJidWYpKQkJCQkJCQkJLyogdGhlbiBhc2sgdGhlIElPUHMgZm9yIHRoZWlyIG1vbml0b3JhYmxlIGRldmljZXMgKi8KKwkJeworCQkvL3ByaW50ZigicGNhcF9maW5kYWxsZGV2cygpIHJldHVybmluZyBCQUQgYWZ0ZXIgZmluZGFsbGRldnNcbiIpOwkJCQkvLyBmdWxrbworCQlyZXR1cm4gLTE7CisJCX0KKwkqYWxsZGV2c3AgPSBhY25faWZfbGlzdDsKKwlhY25faWZfbGlzdCA9IDA7CQkJCQkJCQkJCQkvKiB0aGVuIGZvcmdldCBvdXIgbGlzdCBoZWFkLCBiZWNhdXNlIHNvbWVvbmUgd2lsbCBjYWxsIHBjYXBfZnJlZWFsbGRldnMoKSB0byBlbXB0eSB0aGUgbWFsbG9jJ2VkIHN0dWZmICovCisJLy9wcmludGYoInBjYXBfZmluZGFsbGRldnMoKSByZXR1cm5pbmcgWkVSTyBPS1xuIik7CQkJCS8vIGZ1bGtvCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2ZhZC13aW4zMi5jIGIvbGlicGNhcC0xLjMuMC9mYWQtd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDFhOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9mYWQtd2luMzIuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiAtIDIwMDUgTmV0R3JvdXAsIFBvbGl0ZWNuaWNvIGRpIFRvcmlubyAoSXRhbHkpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgLSAyMDA2IENBQ0UgVGVjaG5vbG9naWVzLCBEYXZpcyAoQ2FsaWZvcm5pYSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgUG9saXRlY25pY28gZGkgVG9yaW5vLCBDQUNFIFRlY2hub2xvZ2llcyAKKyAqIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2ZhZC13aW4zMi5jLHYgMS4xNSAyMDA3LTA5LTI1IDIwOjM0OjM2IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHBjYXAtaW50Lmg+CisjaW5jbHVkZSA8UGFja2V0MzIuaD4KKworI2luY2x1ZGUgPGVycm5vLmg+CisJCisvKgorICogQWRkIGFuIGVudHJ5IHRvIHRoZSBsaXN0IG9mIGFkZHJlc3NlcyBmb3IgYW4gaW50ZXJmYWNlLgorICogImN1cmRldiIgaXMgdGhlIGVudHJ5IGZvciB0aGF0IGludGVyZmFjZS4KKyAqLworc3RhdGljIGludAorYWRkX2FkZHJfdG9fbGlzdChwY2FwX2lmX3QgKmN1cmRldiwgc3RydWN0IHNvY2thZGRyICphZGRyLAorICAgIHN0cnVjdCBzb2NrYWRkciAqbmV0bWFzaywgc3RydWN0IHNvY2thZGRyICpicm9hZGFkZHIsCisgICAgc3RydWN0IHNvY2thZGRyICpkc3RhZGRyLCBjaGFyICplcnJidWYpCit7CisJcGNhcF9hZGRyX3QgKmN1cmFkZHIsICpwcmV2YWRkciwgKm5leHRhZGRyOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgbmV3IGVudHJ5IGFuZCBmaWxsIGl0IGluLgorCSAqLworCWN1cmFkZHIgPSAocGNhcF9hZGRyX3QqKW1hbGxvYyhzaXplb2YocGNhcF9hZGRyX3QpKTsKKwlpZiAoY3VyYWRkciA9PSBOVUxMKSB7CisJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwljdXJhZGRyLT5uZXh0ID0gTlVMTDsKKwlpZiAoYWRkciAhPSBOVUxMKSB7CisJCWN1cmFkZHItPmFkZHIgPSAoc3RydWN0IHNvY2thZGRyKilkdXBfc29ja2FkZHIoYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7CisJCWlmIChjdXJhZGRyLT5hZGRyID09IE5VTEwpIHsKKwkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZyZWUoY3VyYWRkcik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZQorCQljdXJhZGRyLT5hZGRyID0gTlVMTDsKKworCWlmIChuZXRtYXNrICE9IE5VTEwpIHsKKwkJY3VyYWRkci0+bmV0bWFzayA9IChzdHJ1Y3Qgc29ja2FkZHIqKWR1cF9zb2NrYWRkcihuZXRtYXNrLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKTsKKwkJaWYgKGN1cmFkZHItPm5ldG1hc2sgPT0gTlVMTCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZnJlZShjdXJhZGRyKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfSBlbHNlCisJCWN1cmFkZHItPm5ldG1hc2sgPSBOVUxMOworCQkKKwlpZiAoYnJvYWRhZGRyICE9IE5VTEwpIHsKKwkJY3VyYWRkci0+YnJvYWRhZGRyID0gKHN0cnVjdCBzb2NrYWRkciopZHVwX3NvY2thZGRyKGJyb2FkYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKSk7CisJCWlmIChjdXJhZGRyLT5icm9hZGFkZHIgPT0gTlVMTCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZnJlZShjdXJhZGRyKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfSBlbHNlCisJCWN1cmFkZHItPmJyb2FkYWRkciA9IE5VTEw7CisJCQorCWlmIChkc3RhZGRyICE9IE5VTEwpIHsKKwkJY3VyYWRkci0+ZHN0YWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIqKWR1cF9zb2NrYWRkcihkc3RhZGRyLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpKTsKKwkJaWYgKGN1cmFkZHItPmRzdGFkZHIgPT0gTlVMTCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZnJlZShjdXJhZGRyKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfSBlbHNlCisJCWN1cmFkZHItPmRzdGFkZHIgPSBOVUxMOworCQkKKwkvKgorCSAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBhZGRyZXNzZXMuCisJICovCisJZm9yIChwcmV2YWRkciA9IGN1cmRldi0+YWRkcmVzc2VzOyBwcmV2YWRkciAhPSBOVUxMOyBwcmV2YWRkciA9IG5leHRhZGRyKSB7CisJCW5leHRhZGRyID0gcHJldmFkZHItPm5leHQ7CisJCWlmIChuZXh0YWRkciA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwcmV2YWRkciA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZSBsaXN0IHdhcyBlbXB0eTsgdGhpcyBpcyB0aGUgZmlyc3QgbWVtYmVyLgorCQkgKi8KKwkJY3VyZGV2LT5hZGRyZXNzZXMgPSBjdXJhZGRyOworCX0gZWxzZSB7CisJCS8qCisJCSAqICJwcmV2YWRkciIgaXMgdGhlIGxhc3QgbWVtYmVyIG9mIHRoZSBsaXN0OyBhcHBlbmQKKwkJICogdGhpcyBtZW1iZXIgdG8gaXQuCisJCSAqLworCQlwcmV2YWRkci0+bmV4dCA9IGN1cmFkZHI7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworCitzdGF0aWMgaW50CitwY2FwX2FkZF9pZl93aW4zMihwY2FwX2lmX3QgKipkZXZsaXN0LCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZXNjLAorICAgIGNoYXIgKmVycmJ1ZikKK3sKKwlwY2FwX2lmX3QgKmN1cmRldjsKKwlucGZfaWZfYWRkciBpZl9hZGRyc1tNQVhfTkVUV09SS19BRERSRVNTRVNdOworCUxPTkcgaWZfYWRkcl9zaXplOworCWludCByZXMgPSAwOworCisJaWZfYWRkcl9zaXplID0gTUFYX05FVFdPUktfQUREUkVTU0VTOworCisJLyoKKwkgKiBBZGQgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlLCB3aXRoIG5vIGFkZHJlc3Nlcy4KKwkgKi8KKwlpZiAoYWRkX29yX2ZpbmRfaWYoJmN1cmRldiwgZGV2bGlzdCwgbmFtZSwgMCwgZGVzYywgZXJyYnVmKSA9PSAtMSkgeworCQkvKgorCQkgKiBGYWlsdXJlLgorCQkgKi8KKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGxpc3Qgb2YgYWRkcmVzc2VzIGZvciB0aGUgaW50ZXJmYWNlLgorCSAqLworCWlmICghUGFja2V0R2V0TmV0SW5mb0V4KCh2b2lkICopbmFtZSwgaWZfYWRkcnMsICZpZl9hZGRyX3NpemUpKSB7CisJCS8qCisJCSAqIEZhaWx1cmUuCisJCSAqCisJCSAqIFdlIGRvbid0IHJldHVybiBhbiBlcnJvciwgYmVjYXVzZSB0aGlzIGNhbiBoYXBwZW4gd2l0aAorCQkgKiBOZGlzV2FuIGludGVyZmFjZXMsIGFuZCB3ZSB3YW50IHRvIHN1cHBseSB0aGVtIGV2ZW4KKwkJICogaWYgd2UgY2FuJ3Qgc3VwcGx5IHRoZWlyIGFkZHJlc3Nlcy4KKwkJICoKKwkJICogV2UgcmV0dXJuIGFuIGVudHJ5IHdpdGggYW4gZW1wdHkgYWRkcmVzcyBsaXN0LgorCQkgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIE5vdyBhZGQgdGhlIGFkZHJlc3Nlcy4KKwkgKi8KKwl3aGlsZSAoaWZfYWRkcl9zaXplLS0gPiAwKSB7CisJCS8qCisJCSAqICJjdXJkZXYiIGlzIGFuIGVudHJ5IGZvciB0aGlzIGludGVyZmFjZTsgYWRkIGFuIGVudHJ5IGZvcgorCQkgKiB0aGlzIGFkZHJlc3MgdG8gaXRzIGxpc3Qgb2YgYWRkcmVzc2VzLgorCQkgKi8KKwkJaWYoY3VyZGV2ID09IE5VTEwpCisJCQlicmVhazsKKwkJcmVzID0gYWRkX2FkZHJfdG9fbGlzdChjdXJkZXYsCisJCSAgICAoc3RydWN0IHNvY2thZGRyICopJmlmX2FkZHJzW2lmX2FkZHJfc2l6ZV0uSVBBZGRyZXNzLAorCQkgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZpZl9hZGRyc1tpZl9hZGRyX3NpemVdLlN1Ym5ldE1hc2ssCisJCSAgICAoc3RydWN0IHNvY2thZGRyICopJmlmX2FkZHJzW2lmX2FkZHJfc2l6ZV0uQnJvYWRjYXN0LAorCQkgICAgTlVMTCwKKwkJCWVycmJ1Zik7CisJCWlmIChyZXMgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBGYWlsdXJlLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAocmVzKTsKK30KKworCisvKgorICogR2V0IGEgbGlzdCBvZiBhbGwgaW50ZXJmYWNlcyB0aGF0IGFyZSB1cCBhbmQgdGhhdCB3ZSBjYW4gb3Blbi4KKyAqIFJldHVybnMgLTEgb24gZXJyb3IsIDAgb3RoZXJ3aXNlLgorICogVGhlIGxpc3QsIGFzIHJldHVybmVkIHRocm91Z2ggImFsbGRldnNwIiwgbWF5IGJlIG51bGwgaWYgbm8gaW50ZXJmYWNlcworICogd2VyZSB1cCBhbmQgY291bGQgYmUgb3BlbmVkLgorICoKKyAqIFdpbjMyIGltcGxlbWVudGF0aW9uLCBiYXNlZCBvbiBXaW5QY2FwCisgKi8KK2ludAorcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworCXBjYXBfaWZfdCAqZGV2bGlzdCA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJY29uc3QgY2hhciAqZGVzYzsKKwljaGFyICpBZGFwdGVyc05hbWU7CisJVUxPTkcgTmFtZUxlbmd0aDsKKwljaGFyICpuYW1lOworCQorCWlmICghUGFja2V0R2V0QWRhcHRlck5hbWVzKE5VTEwsICZOYW1lTGVuZ3RoKSkKKwl7CisJCURXT1JEIGxhc3RfZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKworCQlpZiAobGFzdF9lcnJvciAhPSBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKQorCQl7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJIlBhY2tldEdldEFkYXB0ZXJOYW1lczogJXMiLAorCQkJCXBjYXBfd2luMzJzdHJlcnJvcigpKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCisJaWYgKE5hbWVMZW5ndGggPiAwKQorCQlBZGFwdGVyc05hbWUgPSAoY2hhciopIG1hbGxvYyhOYW1lTGVuZ3RoKTsKKwllbHNlCisJeworCQkqYWxsZGV2c3AgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEFkYXB0ZXJzTmFtZSA9PSBOVUxMKQorCXsKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2Fubm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgdG8gbGlzdCB0aGUgYWRhcHRlcnMuIik7CisJCXJldHVybiAoLTEpOworCX0JCQkKKworCWlmICghUGFja2V0R2V0QWRhcHRlck5hbWVzKEFkYXB0ZXJzTmFtZSwgJk5hbWVMZW5ndGgpKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSJQYWNrZXRHZXRBZGFwdGVyTmFtZXM6ICVzIiwKKwkJCXBjYXBfd2luMzJzdHJlcnJvcigpKTsKKwkJZnJlZShBZGFwdGVyc05hbWUpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJCisJLyoKKwkgKiAiUGFja2V0R2V0QWRhcHRlck5hbWVzKCkiIHJldHVybmVkIGEgbGlzdCBvZgorCSAqIG51bGwtdGVybWluYXRlZCBBU0NJSSBpbnRlcmZhY2UgbmFtZSBzdHJpbmdzLAorCSAqIHRlcm1pbmF0ZWQgYnkgYSBudWxsIHN0cmluZywgZm9sbG93ZWQgYnkgYSBsaXN0CisJICogb2YgbnVsbC10ZXJtaW5hdGVkIEFTQ0lJIGludGVyZmFjZSBkZXNjcmlwdGlvbgorCSAqIHN0cmluZ3MsIHRlcm1pbmF0ZWQgYnkgYSBudWxsIHN0cmluZy4KKwkgKiBUaGlzIG1lYW5zIHRoZXJlIGFyZSB0d28gQVNDSUkgbnVsbHMgYXQgdGhlIGVuZAorCSAqIG9mIHRoZSBmaXJzdCBsaXN0LgorCSAqCisJICogRmluZCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBsaXN0OyB0aGF0J3MgdGhlCisJICogYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgbGlzdC4KKwkgKi8KKwlkZXNjID0gJkFkYXB0ZXJzTmFtZVswXTsKKwl3aGlsZSAoKmRlc2MgIT0gJ1wwJyB8fCAqKGRlc2MgKyAxKSAhPSAnXDAnKQorCQlkZXNjKys7CisJCisJLyoKKyAJICogRm91bmQgaXQgLSAiZGVzYyIgcG9pbnRzIHRvIHRoZSBmaXJzdCBvZiB0aGUgdHdvCisJICogbnVsbHMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiBuYW1lcywgc28gdGhlCisJICogZmlyc3QgYnl0ZSBvZiB0aGUgbGlzdCBvZiBkZXNjcmlwdGlvbnMgaXMgdHdvIGJ5dGVzCisJICogYWZ0ZXIgaXQuCisJICovCisJZGVzYyArPSAyOworCQorCS8qCisJICogTG9vcCBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGUgZmlyc3QgbGlzdC4KKwkgKi8KKwluYW1lID0gJkFkYXB0ZXJzTmFtZVswXTsKKwl3aGlsZSAoKm5hbWUgIT0gJ1wwJykgeworCQkvKgorCQkgKiBBZGQgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlLgorCQkgKi8KKwkJaWYgKHBjYXBfYWRkX2lmX3dpbjMyKCZkZXZsaXN0LCBuYW1lLCBkZXNjLCBlcnJidWYpID09IC0xKSB7CisJCQkvKgorCQkJICogRmFpbHVyZS4KKwkJCSAqLworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCQluYW1lICs9IHN0cmxlbihuYW1lKSArIDE7CisJCWRlc2MgKz0gc3RybGVuKGRlc2MpICsgMTsKKwl9CisKKwlpZiAocmV0ICE9IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhdmVuJ3QgaGFkIGFueSBlcnJvcnMgeWV0OyBkbyBhbnkgcGxhdGZvcm0tc3BlY2lmaWMKKwkJICogb3BlcmF0aW9ucyB0byBhZGQgZGV2aWNlcy4KKwkJICovCisJCWlmIChwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKCZkZXZsaXN0LCBlcnJidWYpIDwgMCkKKwkJCXJldCA9IC0xOworCX0KKwkKKwlpZiAocmV0ID09IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhZCBhbiBlcnJvcjsgZnJlZSB0aGUgbGlzdCB3ZSd2ZSBiZWVuIGNvbnN0cnVjdGluZy4KKwkJICovCisJCWlmIChkZXZsaXN0ICE9IE5VTEwpIHsKKwkJCXBjYXBfZnJlZWFsbGRldnMoZGV2bGlzdCk7CisJCQlkZXZsaXN0ID0gTlVMTDsKKwkJfQorCX0KKwkKKwkqYWxsZGV2c3AgPSBkZXZsaXN0OworCWZyZWUoQWRhcHRlcnNOYW1lKTsKKwlyZXR1cm4gKHJldCk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2dlbmNvZGUuYyBiL2xpYnBjYXAtMS4zLjAvZ2VuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjIyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2dlbmNvZGUuYwpAQCAtMCwwICsxLDg1MzUgQEAKKy8qI2RlZmluZSBDSEFTRV9DSEFJTiovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2dlbmNvZGUuYyx2IDEuMzA5IDIwMDgtMTItMjMgMjA6MTM6MjkgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZSAvKiBXSU4zMiAqLworI2lmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKy8qCisgKiBYWFggLSB3aHkgd2FzIHRoaXMgaW5jbHVkZWQgZXZlbiBvbiBVTklYPworICovCisjaWZkZWYgX19NSU5HVzMyX18KKyNpbmNsdWRlICJpcDZfbWlzYy5oIgorI2VuZGlmCisKKyNpZm5kZWYgV0lOMzIKKworI2lmZGVmIF9fTmV0QlNEX18KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjZW5kaWYgLyogV0lOMzIgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaWZkZWYgTVNET1MKKyNpbmNsdWRlICJwY2FwLWRvcy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSAiZXRoZXJ0eXBlLmgiCisjaW5jbHVkZSAibmxwaWQuaCIKKyNpbmNsdWRlICJsbGMuaCIKKyNpbmNsdWRlICJnZW5jb2RlLmgiCisjaW5jbHVkZSAiaWVlZTgwMjExLmgiCisjaW5jbHVkZSAiYXRtdW5pMzEuaCIKKyNpbmNsdWRlICJzdW5hdG1wb3MuaCIKKyNpbmNsdWRlICJwcHAuaCIKKyNpbmNsdWRlICJwY2FwL3NsbC5oIgorI2luY2x1ZGUgInBjYXAvaXBuZXQuaCIKKyNpbmNsdWRlICJhcmNuZXQuaCIKKyNpZiBkZWZpbmVkKFBGX1BBQ0tFVCkgJiYgZGVmaW5lZChTT19BVFRBQ0hfRklMVEVSKQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcGFja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX05FVF9QRlZBUl9ICisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9wZnZhci5oPgorI2luY2x1ZGUgPG5ldC9pZl9wZmxvZy5oPgorI2VuZGlmCisjaWZuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKHMsIGUpICgoc2l6ZV90KSYoKHMgKikwKS0+ZSkKKyNlbmRpZgorI2lmZGVmIElORVQ2CisjaWZuZGVmIFdJTjMyCisjaW5jbHVkZSA8bmV0ZGIuaD4JLyogZm9yICJzdHJ1Y3QgYWRkcmluZm8iICovCisjZW5kaWYgLyogV0lOMzIgKi8KKyNlbmRpZiAvKklORVQ2Ki8KKyNpbmNsdWRlIDxwY2FwL25hbWVkYi5oPgorCisjZGVmaW5lIEVUSEVSTVRVCTE1MDAKKworI2lmbmRlZiBJUFBST1RPX1NDVFAKKyNkZWZpbmUgSVBQUk9UT19TQ1RQIDEzMgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX09TX1BST1RPX0gKKyNpbmNsdWRlICJvcy1wcm90by5oIgorI2VuZGlmCisKKyNkZWZpbmUgSk1QKGMpICgoYyl8QlBGX0pNUHxCUEZfSykKKworLyogTG9jYWxzICovCitzdGF0aWMgam1wX2J1ZiB0b3BfY3R4Oworc3RhdGljIHBjYXBfdCAqYnBmX3BjYXA7CisKKy8qIEhhY2sgZm9yIHVwZGF0aW5nIFZMQU4sIE1QTFMsIGFuZCBQUFBvRSBvZmZzZXRzLiAqLworI2lmZGVmIFdJTjMyCitzdGF0aWMgdV9pbnQJb3JpZ19saW5rdHlwZSA9ICh1X2ludCktMSwgb3JpZ19ubCA9ICh1X2ludCktMSwgbGFiZWxfc3RhY2tfZGVwdGggPSAodV9pbnQpLTE7CisjZWxzZQorc3RhdGljIHVfaW50CW9yaWdfbGlua3R5cGUgPSAtMVUsIG9yaWdfbmwgPSAtMVUsIGxhYmVsX3N0YWNrX2RlcHRoID0gLTFVOworI2VuZGlmCisKKy8qIFhYWCAqLworI2lmZGVmIFBDQVBfRkRESVBBRAorc3RhdGljIGludAlwY2FwX2ZkZGlwYWQ7CisjZW5kaWYKKworLyogVkFSQVJHUyAqLwordm9pZAorYnBmX2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlpZiAoYnBmX3BjYXAgIT0gTlVMTCkKKwkJKHZvaWQpdnNucHJpbnRmKHBjYXBfZ2V0ZXJyKGJwZl9wY2FwKSwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJbG9uZ2ptcCh0b3BfY3R4LCAxKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB2b2lkIGluaXRfbGlua3R5cGUocGNhcF90ICopOworCitzdGF0aWMgdm9pZCBpbml0X3JlZ3Modm9pZCk7CitzdGF0aWMgaW50IGFsbG9jX3JlZyh2b2lkKTsKK3N0YXRpYyB2b2lkIGZyZWVfcmVnKGludCk7CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKnJvb3Q7CisKKy8qCisgKiBWYWx1ZSBwYXNzZWQgdG8gZ2VuX2xvYWRfYSgpIHRvIGluZGljYXRlIHdoYXQgdGhlIG9mZnNldCBhcmd1bWVudAorICogaXMgcmVsYXRpdmUgdG8uCisgKi8KK2VudW0gZV9vZmZyZWwgeworCU9SX1BBQ0tFVCwJLyogcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0ICovCisJT1JfTElOSywJLyogcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluay1sYXllciBoZWFkZXIgKi8KKwlPUl9NQUNQTCwJLyogcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgTUFDLWxheWVyIGhlYWRlciAqLworCU9SX05FVCwJCS8qIHJlbGF0aXZlIHRvIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlciAqLworCU9SX05FVF9OT1NOQVAsCS8qIHJlbGF0aXZlIHRvIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlciwgd2l0aCBubyBTTkFQIGhlYWRlciBhdCB0aGUgbGluayBsYXllciAqLworCU9SX1RSQU5fSVBWNCwJLyogcmVsYXRpdmUgdG8gdGhlIHRyYW5zcG9ydC1sYXllciBoZWFkZXIsIHdpdGggSVB2NCBuZXR3b3JrIGxheWVyICovCisJT1JfVFJBTl9JUFY2CS8qIHJlbGF0aXZlIHRvIHRoZSB0cmFuc3BvcnQtbGF5ZXIgaGVhZGVyLCB3aXRoIElQdjYgbmV0d29yayBsYXllciAqLworfTsKKworI2lmZGVmIElORVQ2CisvKgorICogQXMgZXJyb3JzIGFyZSBoYW5kbGVkIGJ5IGEgbG9uZ2ptcCwgYW55dGhpbmcgYWxsb2NhdGVkIG11c3QgYmUgZnJlZWQKKyAqIGluIHRoZSBsb25nam1wIGhhbmRsZXIsIHNvIGl0IG11c3QgYmUgcmVhY2hhYmxlIGZyb20gdGhhdCBoYW5kbGVyLgorICogT25lIHRoaW5nIHRoYXQncyBhbGxvY2F0ZWQgaXMgdGhlIHJlc3VsdCBvZiBwY2FwX25hbWV0b2FkZHJpbmZvKCk7CisgKiBpdCBtdXN0IGJlIGZyZWVkIHdpdGggZnJlZWFkZHJpbmZvKCkuICBUaGlzIHZhcmlhYmxlIHBvaW50cyB0byBhbnkKKyAqIGFkZHJpbmZvIHN0cnVjdHVyZSB0aGF0IHdvdWxkIG5lZWQgdG8gYmUgZnJlZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYWRkcmluZm8gKmFpOworI2VuZGlmCisKKy8qCisgKiBXZSBkaXZ5IG91dCBjaHVua3Mgb2YgbWVtb3J5IHJhdGhlciB0aGFuIGNhbGwgbWFsbG9jIGVhY2ggdGltZSBzbworICogd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBsZWFraW5nIG1lbW9yeS4gIEl0J3MgcHJvYmFibHkKKyAqIG5vdCBhIGJpZyBkZWFsIGlmIGFsbCB0aGlzIG1lbW9yeSB3YXMgd2FzdGVkIGJ1dCBpZiB0aGlzIGV2ZXIKKyAqIGdvZXMgaW50byBhIGxpYnJhcnkgdGhhdCB3b3VsZCBwcm9iYWJseSBub3QgYmUgYSBnb29kIGlkZWEuCisgKgorICogWFhYIC0gdGhpcyAqaXMqIGluIGEgbGlicmFyeS4uLi4KKyAqLworI2RlZmluZSBOQ0hVTktTIDE2CisjZGVmaW5lIENIVU5LMFNJWkUgMTAyNAorc3RydWN0IGNodW5rIHsKKwl1X2ludCBuX2xlZnQ7CisJdm9pZCAqbTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2h1bmsgY2h1bmtzW05DSFVOS1NdOworc3RhdGljIGludCBjdXJfY2h1bms7CisKK3N0YXRpYyB2b2lkICpuZXdjaHVuayh1X2ludCk7CitzdGF0aWMgdm9pZCBmcmVlY2h1bmtzKHZvaWQpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKm5ld19ibG9jayhpbnQpOworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2xpc3QgKm5ld19zdG10KGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcmV0YmxrKGludCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc3ludGF4KHZvaWQpOworCitzdGF0aWMgdm9pZCBiYWNrcGF0Y2goc3RydWN0IGJsb2NrICosIHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB2b2lkIG1lcmdlKHN0cnVjdCBibG9jayAqLCBzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fY21wKGVudW0gZV9vZmZyZWwsIHVfaW50LCB1X2ludCwgYnBmX2ludDMyKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9jbXBfZ3QoZW51bSBlX29mZnJlbCwgdV9pbnQsIHVfaW50LCBicGZfaW50MzIpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2NtcF9nZShlbnVtIGVfb2ZmcmVsLCB1X2ludCwgdV9pbnQsIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fY21wX2x0KGVudW0gZV9vZmZyZWwsIHVfaW50LCB1X2ludCwgYnBmX2ludDMyKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9jbXBfbGUoZW51bSBlX29mZnJlbCwgdV9pbnQsIHVfaW50LCBicGZfaW50MzIpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX21jbXAoZW51bSBlX29mZnJlbCwgdV9pbnQsIHVfaW50LCBicGZfaW50MzIsCisgICAgYnBmX3VfaW50MzIpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2JjbXAoZW51bSBlX29mZnJlbCwgdV9pbnQsIHVfaW50LCBjb25zdCB1X2NoYXIgKik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbmNtcChlbnVtIGVfb2ZmcmVsLCBicGZfdV9pbnQzMiwgYnBmX3VfaW50MzIsCisgICAgYnBmX3VfaW50MzIsIGJwZl91X2ludDMyLCBpbnQsIGJwZl9pbnQzMik7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9sbHJlbCh1X2ludCwgdV9pbnQpOworc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfbWFjcGxyZWwodV9pbnQsIHVfaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkX2EoZW51bSBlX29mZnJlbCwgdV9pbnQsIHVfaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkeF9pcGhkcmxlbih2b2lkKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl91bmNvbmQoaW50KTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrICpnZW5fdHJ1ZSh2b2lkKTsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrICpnZW5fZmFsc2Uodm9pZCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fZXRoZXJfbGlua3R5cGUoaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9pcG5ldF9saW5rdHlwZShpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2xpbnV4X3NsbF9saW5rdHlwZShpbnQpOworc3RhdGljIHN0cnVjdCBzbGlzdCAqZ2VuX2xvYWRfcHJpc21fbGxwcmVmaXhsZW4odm9pZCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9hdnNfbGxwcmVmaXhsZW4odm9pZCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbG9hZF9yYWRpb3RhcF9sbHByZWZpeGxlbih2b2lkKTsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKmdlbl9sb2FkX3BwaV9sbHByZWZpeGxlbih2b2lkKTsKK3N0YXRpYyB2b2lkIGluc2VydF9jb21wdXRlX3Zsb2Zmc2V0cyhzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fbGxwcmVmaXhsZW4odm9pZCk7CitzdGF0aWMgc3RydWN0IHNsaXN0ICpnZW5fb2ZmX21hY3BsKHZvaWQpOworc3RhdGljIGludCBldGhlcnR5cGVfdG9fcHBwdHlwZShpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2xpbmt0eXBlKGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fc25hcChicGZfdV9pbnQzMiwgYnBmX3VfaW50MzIpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2xsY19saW5rdHlwZShpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2hvc3RvcChicGZfdV9pbnQzMiwgYnBmX3VfaW50MzIsIGludCwgaW50LCB1X2ludCwgdV9pbnQpOworI2lmZGVmIElORVQ2CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faG9zdG9wNihzdHJ1Y3QgaW42X2FkZHIgKiwgc3RydWN0IGluNl9hZGRyICosIGludCwgaW50LCB1X2ludCwgdV9pbnQpOworI2VuZGlmCitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fYWhvc3RvcChjb25zdCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9laG9zdG9wKGNvbnN0IHVfY2hhciAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2Zob3N0b3AoY29uc3QgdV9jaGFyICosIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fdGhvc3RvcChjb25zdCB1X2NoYXIgKiwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl93bGFuaG9zdG9wKGNvbnN0IHVfY2hhciAqLCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2lwZmNob3N0b3AoY29uc3QgdV9jaGFyICosIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fZG5ob3N0b3AoYnBmX3VfaW50MzIsIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbXBsc19saW5rdHlwZShpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2hvc3QoYnBmX3VfaW50MzIsIGJwZl91X2ludDMyLCBpbnQsIGludCwgaW50KTsKKyNpZmRlZiBJTkVUNgorc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX2hvc3Q2KHN0cnVjdCBpbjZfYWRkciAqLCBzdHJ1Y3QgaW42X2FkZHIgKiwgaW50LCBpbnQsIGludCk7CisjZW5kaWYKKyNpZm5kZWYgSU5FVDYKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9nYXRld2F5KGNvbnN0IHVfY2hhciAqLCBicGZfdV9pbnQzMiAqKiwgaW50LCBpbnQpOworI2VuZGlmCitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5faXBmcmFnKHZvaWQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnRhdG9tKGludCwgYnBmX2ludDMyKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VhdG9tKGludCwgYnBmX2ludDMyLCBicGZfaW50MzIpOworI2lmZGVmIElORVQ2CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydGF0b202KGludCwgYnBmX2ludDMyKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VhdG9tNihpbnQsIGJwZl9pbnQzMiwgYnBmX2ludDMyKTsKKyNlbmRpZgorc3RydWN0IGJsb2NrICpnZW5fcG9ydG9wKGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnQoaW50LCBpbnQsIGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0cmFuZ2VvcChpbnQsIGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnRyYW5nZShpbnQsIGludCwgaW50LCBpbnQpOworI2lmZGVmIElORVQ2CitzdHJ1Y3QgYmxvY2sgKmdlbl9wb3J0b3A2KGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BvcnQ2KGludCwgaW50LCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fcG9ydHJhbmdlb3A2KGludCwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcG9ydHJhbmdlNihpbnQsIGludCwgaW50LCBpbnQpOworI2VuZGlmCitzdGF0aWMgaW50IGxvb2t1cF9wcm90byhjb25zdCBjaGFyICosIGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fcHJvdG9jaGFpbihpbnQsIGludCwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9wcm90byhpbnQsIGludCwgaW50KTsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKnhmZXJfdG9feChzdHJ1Y3QgYXJ0aCAqKTsKK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKnhmZXJfdG9fYShzdHJ1Y3QgYXJ0aCAqKTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9tYWNfbXVsdGljYXN0KGludCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbGVuKGludCwgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKmdlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZSh2b2lkKTsKKworc3RhdGljIHN0cnVjdCBibG9jayAqZ2VuX3BwaV9kbHRfY2hlY2sodm9pZCk7CitzdGF0aWMgc3RydWN0IGJsb2NrICpnZW5fbXNnX2FiYnJldihpbnQgdHlwZSk7CisKK3N0YXRpYyB2b2lkICoKK25ld2NodW5rKG4pCisJdV9pbnQgbjsKK3sKKwlzdHJ1Y3QgY2h1bmsgKmNwOworCWludCBrOworCXNpemVfdCBzaXplOworCisjaWZuZGVmIF9fTmV0QlNEX18KKwkvKiBYWFggUm91bmQgdXAgdG8gbmVhcmVzdCBsb25nLiAqLworCW4gPSAobiArIHNpemVvZihsb25nKSAtIDEpICYgfihzaXplb2YobG9uZykgLSAxKTsKKyNlbHNlCisJLyogWFhYIFJvdW5kIHVwIHRvIHN0cnVjdHVyZSBib3VuZGFyeS4gKi8KKwluID0gQUxJR04obik7CisjZW5kaWYKKworCWNwID0gJmNodW5rc1tjdXJfY2h1bmtdOworCWlmIChuID4gY3AtPm5fbGVmdCkgeworCQkrK2NwLCBrID0gKytjdXJfY2h1bms7CisJCWlmIChrID49IE5DSFVOS1MpCisJCQlicGZfZXJyb3IoIm91dCBvZiBtZW1vcnkiKTsKKwkJc2l6ZSA9IENIVU5LMFNJWkUgPDwgazsKKwkJY3AtPm0gPSAodm9pZCAqKW1hbGxvYyhzaXplKTsKKwkJaWYgKGNwLT5tID09IE5VTEwpCisJCQlicGZfZXJyb3IoIm91dCBvZiBtZW1vcnkiKTsKKwkJbWVtc2V0KChjaGFyICopY3AtPm0sIDAsIHNpemUpOworCQljcC0+bl9sZWZ0ID0gc2l6ZTsKKwkJaWYgKG4gPiBzaXplKQorCQkJYnBmX2Vycm9yKCJvdXQgb2YgbWVtb3J5Iik7CisJfQorCWNwLT5uX2xlZnQgLT0gbjsKKwlyZXR1cm4gKHZvaWQgKikoKGNoYXIgKiljcC0+bSArIGNwLT5uX2xlZnQpOworfQorCitzdGF0aWMgdm9pZAorZnJlZWNodW5rcygpCit7CisJaW50IGk7CisKKwljdXJfY2h1bmsgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOQ0hVTktTOyArK2kpCisJCWlmIChjaHVua3NbaV0ubSAhPSBOVUxMKSB7CisJCQlmcmVlKGNodW5rc1tpXS5tKTsKKwkJCWNodW5rc1tpXS5tID0gTlVMTDsKKwkJfQorfQorCisvKgorICogQSBzdHJkdXAgd2hvc2UgYWxsb2NhdGlvbnMgYXJlIGZyZWVkIGFmdGVyIGNvZGUgZ2VuZXJhdGlvbiBpcyBvdmVyLgorICovCitjaGFyICoKK3NkdXAocykKKwlyZWdpc3RlciBjb25zdCBjaGFyICpzOworeworCWludCBuID0gc3RybGVuKHMpICsgMTsKKwljaGFyICpjcCA9IG5ld2NodW5rKG4pOworCisJc3RybGNweShjcCwgcywgbik7CisJcmV0dXJuIChjcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJsb2NrICoKK25ld19ibG9jayhjb2RlKQorCWludCBjb2RlOworeworCXN0cnVjdCBibG9jayAqcDsKKworCXAgPSAoc3RydWN0IGJsb2NrICopbmV3Y2h1bmsoc2l6ZW9mKCpwKSk7CisJcC0+cy5jb2RlID0gY29kZTsKKwlwLT5oZWFkID0gcDsKKworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbGlzdCAqCituZXdfc3RtdChjb2RlKQorCWludCBjb2RlOworeworCXN0cnVjdCBzbGlzdCAqcDsKKworCXAgPSAoc3RydWN0IHNsaXN0ICopbmV3Y2h1bmsoc2l6ZW9mKCpwKSk7CisJcC0+cy5jb2RlID0gY29kZTsKKworCXJldHVybiBwOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9yZXRibGsodikKKwlpbnQgdjsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIgPSBuZXdfYmxvY2soQlBGX1JFVHxCUEZfSyk7CisKKwliLT5zLmsgPSB2OworCXJldHVybiBiOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3N5bnRheCgpCit7CisJYnBmX2Vycm9yKCJzeW50YXggZXJyb3IgaW4gZmlsdGVyIGV4cHJlc3Npb24iKTsKK30KKworc3RhdGljIGJwZl91X2ludDMyIG5ldG1hc2s7CitzdGF0aWMgaW50IHNuYXBsZW47CitpbnQgbm9fb3B0aW1pemU7CisjaWZkZWYgV0lOMzIKK3N0YXRpYyBpbnQKK3BjYXBfY29tcGlsZV91bnNhZmUocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKnByb2dyYW0sCisJICAgICBjb25zdCBjaGFyICpidWYsIGludCBvcHRpbWl6ZSwgYnBmX3VfaW50MzIgbWFzayk7CisKK2ludAorcGNhcF9jb21waWxlKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9ncmFtLAorCSAgICAgY29uc3QgY2hhciAqYnVmLCBpbnQgb3B0aW1pemUsIGJwZl91X2ludDMyIG1hc2spCit7CisJaW50IHJlc3VsdDsKKworCUVudGVyQ3JpdGljYWxTZWN0aW9uKCZnX1BjYXBDb21waWxlQ3JpdGljYWxTZWN0aW9uKTsKKworCXJlc3VsdCA9IHBjYXBfY29tcGlsZV91bnNhZmUocCwgcHJvZ3JhbSwgYnVmLCBvcHRpbWl6ZSwgbWFzayk7CisKKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbigmZ19QY2FwQ29tcGlsZUNyaXRpY2FsU2VjdGlvbik7CisJCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorcGNhcF9jb21waWxlX3Vuc2FmZShwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqcHJvZ3JhbSwKKwkgICAgIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IG9wdGltaXplLCBicGZfdV9pbnQzMiBtYXNrKQorI2Vsc2UgLyogV0lOMzIgKi8KK2ludAorcGNhcF9jb21waWxlKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9ncmFtLAorCSAgICAgY29uc3QgY2hhciAqYnVmLCBpbnQgb3B0aW1pemUsIGJwZl91X2ludDMyIG1hc2spCisjZW5kaWYgLyogV0lOMzIgKi8KK3sKKwlleHRlcm4gaW50IG5fZXJyb3JzOworCWNvbnN0IGNoYXIgKiB2b2xhdGlsZSB4YnVmID0gYnVmOworCXVfaW50IGxlbjsKKworCW5vX29wdGltaXplID0gMDsKKwluX2Vycm9ycyA9IDA7CisJcm9vdCA9IE5VTEw7CisJYnBmX3BjYXAgPSBwOworCWluaXRfcmVncygpOworCWlmIChzZXRqbXAodG9wX2N0eCkpIHsKKyNpZmRlZiBJTkVUNgorCQlpZiAoYWkgIT0gTlVMTCkgeworCQkJZnJlZWFkZHJpbmZvKGFpKTsKKwkJCWFpID0gTlVMTDsKKwkJfQorI2VuZGlmCisJCWxleF9jbGVhbnVwKCk7CisJCWZyZWVjaHVua3MoKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJbmV0bWFzayA9IG1hc2s7CisKKwlzbmFwbGVuID0gcGNhcF9zbmFwc2hvdChwKTsKKwlpZiAoc25hcGxlbiA9PSAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAic25hcGxlbiBvZiAwIHJlamVjdHMgYWxsIHBhY2tldHMiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWxleF9pbml0KHhidWYgPyB4YnVmIDogIiIpOworCWluaXRfbGlua3R5cGUocCk7CisJKHZvaWQpcGNhcF9wYXJzZSgpOworCisJaWYgKG5fZXJyb3JzKQorCQlzeW50YXgoKTsKKworCWlmIChyb290ID09IE5VTEwpCisJCXJvb3QgPSBnZW5fcmV0YmxrKHNuYXBsZW4pOworCisJaWYgKG9wdGltaXplICYmICFub19vcHRpbWl6ZSkgeworCQlicGZfb3B0aW1pemUoJnJvb3QpOworCQlpZiAocm9vdCA9PSBOVUxMIHx8CisJCSAgICAocm9vdC0+cy5jb2RlID09IChCUEZfUkVUfEJQRl9LKSAmJiByb290LT5zLmsgPT0gMCkpCisJCQlicGZfZXJyb3IoImV4cHJlc3Npb24gcmVqZWN0cyBhbGwgcGFja2V0cyIpOworCX0KKwlwcm9ncmFtLT5iZl9pbnNucyA9IGljb2RlX3RvX2Zjb2RlKHJvb3QsICZsZW4pOworCXByb2dyYW0tPmJmX2xlbiA9IGxlbjsKKworCWxleF9jbGVhbnVwKCk7CisJZnJlZWNodW5rcygpOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBlbnRyeSBwb2ludCBmb3IgdXNpbmcgdGhlIGNvbXBpbGVyIHdpdGggbm8gcGNhcCBvcGVuCisgKiBwYXNzIGluIGFsbCB0aGUgc3R1ZmYgdGhhdCBpcyBuZWVkZWQgZXhwbGljaXRseSBpbnN0ZWFkLgorICovCitpbnQKK3BjYXBfY29tcGlsZV9ub3BjYXAoaW50IHNuYXBsZW5fYXJnLCBpbnQgbGlua3R5cGVfYXJnLAorCQkgICAgc3RydWN0IGJwZl9wcm9ncmFtICpwcm9ncmFtLAorCSAgICAgY29uc3QgY2hhciAqYnVmLCBpbnQgb3B0aW1pemUsIGJwZl91X2ludDMyIG1hc2spCit7CisJcGNhcF90ICpwOworCWludCByZXQ7CisKKwlwID0gcGNhcF9vcGVuX2RlYWQobGlua3R5cGVfYXJnLCBzbmFwbGVuX2FyZyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisJcmV0ID0gcGNhcF9jb21waWxlKHAsIHByb2dyYW0sIGJ1Ziwgb3B0aW1pemUsIG1hc2spOworCXBjYXBfY2xvc2UocCk7CisJcmV0dXJuIChyZXQpOworfQorCisvKgorICogQ2xlYW4gdXAgYSAic3RydWN0IGJwZl9wcm9ncmFtIiBieSBmcmVlaW5nIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRlZAorICogaW4gaXQuCisgKi8KK3ZvaWQKK3BjYXBfZnJlZWNvZGUoc3RydWN0IGJwZl9wcm9ncmFtICpwcm9ncmFtKQoreworCXByb2dyYW0tPmJmX2xlbiA9IDA7CisJaWYgKHByb2dyYW0tPmJmX2luc25zICE9IE5VTEwpIHsKKwkJZnJlZSgoY2hhciAqKXByb2dyYW0tPmJmX2luc25zKTsKKwkJcHJvZ3JhbS0+YmZfaW5zbnMgPSBOVUxMOworCX0KK30KKworLyoKKyAqIEJhY2twYXRjaCB0aGUgYmxvY2tzIGluICdsaXN0JyB0byAndGFyZ2V0Jy4gIFRoZSAnc2Vuc2UnIGZpZWxkIGluZGljYXRlcworICogd2hpY2ggb2YgdGhlIGp0IGFuZCBqZiBmaWVsZHMgaGFzIGJlZW4gcmVzb2x2ZWQgYW5kIHdoaWNoIGlzIGEgcG9pbnRlcgorICogYmFjayB0byBhbm90aGVyIHVucmVzb2x2ZWQgYmxvY2sgKG9yIG5pbCkuICBBdCBsZWFzdCBvbmUgb2YgdGhlIGZpZWxkcworICogaW4gZWFjaCBibG9jayBpcyBhbHJlYWR5IHJlc29sdmVkLgorICovCitzdGF0aWMgdm9pZAorYmFja3BhdGNoKGxpc3QsIHRhcmdldCkKKwlzdHJ1Y3QgYmxvY2sgKmxpc3QsICp0YXJnZXQ7Cit7CisJc3RydWN0IGJsb2NrICpuZXh0OworCisJd2hpbGUgKGxpc3QpIHsKKwkJaWYgKCFsaXN0LT5zZW5zZSkgeworCQkJbmV4dCA9IEpUKGxpc3QpOworCQkJSlQobGlzdCkgPSB0YXJnZXQ7CisJCX0gZWxzZSB7CisJCQluZXh0ID0gSkYobGlzdCk7CisJCQlKRihsaXN0KSA9IHRhcmdldDsKKwkJfQorCQlsaXN0ID0gbmV4dDsKKwl9Cit9CisKKy8qCisgKiBNZXJnZSB0aGUgbGlzdHMgaW4gYjAgYW5kIGIxLCB1c2luZyB0aGUgJ3NlbnNlJyBmaWVsZCB0byBpbmRpY2F0ZQorICogd2hpY2ggb2YganQgYW5kIGpmIGlzIHRoZSBsaW5rLgorICovCitzdGF0aWMgdm9pZAorbWVyZ2UoYjAsIGIxKQorCXN0cnVjdCBibG9jayAqYjAsICpiMTsKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKipwID0gJmIwOworCisJLyogRmluZCBlbmQgb2YgbGlzdC4gKi8KKwl3aGlsZSAoKnApCisJCXAgPSAhKCgqcCktPnNlbnNlKSA/ICZKVCgqcCkgOiAmSkYoKnApOworCisJLyogQ29uY2F0ZW5hdGUgdGhlIGxpc3RzLiAqLworCSpwID0gYjE7Cit9CisKK3ZvaWQKK2ZpbmlzaF9wYXJzZShwKQorCXN0cnVjdCBibG9jayAqcDsKK3sKKwlzdHJ1Y3QgYmxvY2sgKnBwaV9kbHRfY2hlY2s7CisKKwkvKgorCSAqIEluc2VydCBiZWZvcmUgdGhlIHN0YXRlbWVudHMgb2YgdGhlIGZpcnN0IChyb290KSBibG9jayBhbnkKKwkgKiBzdGF0ZW1lbnRzIG5lZWRlZCB0byBsb2FkIHRoZSBsZW5ndGhzIG9mIGFueSB2YXJpYWJsZS1sZW5ndGgKKwkgKiBoZWFkZXJzIGludG8gcmVnaXN0ZXJzLgorCSAqCisJICogWFhYIC0gYSBmYW5jaWVyIHN0cmF0ZWd5IHdvdWxkIGJlIHRvIGluc2VydCB0aG9zZSBiZWZvcmUgdGhlCisJICogc3RhdGVtZW50cyBvZiBhbGwgYmxvY2tzIHRoYXQgdXNlIHRob3NlIGxlbmd0aHMgYW5kIHRoYXQKKwkgKiBoYXZlIG5vIHByZWRlY2Vzc29ycyB0aGF0IHVzZSB0aGVtLCBzbyB0aGF0IHdlIG9ubHkgY29tcHV0ZQorCSAqIHRoZSBsZW5ndGhzIGlmIHdlIG5lZWQgdGhlbS4gIFRoZXJlIG1pZ2h0IGJlIGV2ZW4gYmV0dGVyCisJICogYXBwcm9hY2hlcyB0aGFuIHRoYXQuCisJICoKKwkgKiBIb3dldmVyLCB0aG9zZSBzdHJhdGVnaWVzIHdvdWxkIGJlIG1vcmUgY29tcGxpY2F0ZWQsIGFuZAorCSAqIGFzIHdlIGRvbid0IGdlbmVyYXRlIGNvZGUgdG8gY29tcHV0ZSBhIGxlbmd0aCBpZiB0aGUKKwkgKiBwcm9ncmFtIGhhcyBubyB0ZXN0cyB0aGF0IHVzZSB0aGUgbGVuZ3RoLCBhbmQgYXMgbW9zdAorCSAqIHRlc3RzIHdpbGwgcHJvYmFibHkgdXNlIHRob3NlIGxlbmd0aHMsIHdlIHdvdWxkIGp1c3QKKwkgKiBwb3N0cG9uZSBjb21wdXRpbmcgdGhlIGxlbmd0aHMgc28gdGhhdCBpdCdzIG5vdCBkb25lCisJICogZm9yIHRlc3RzIHRoYXQgZmFpbCBlYXJseSwgYW5kIGl0J3Mgbm90IGNsZWFyIHRoYXQncworCSAqIHdvcnRoIHRoZSBlZmZvcnQuCisJICovCisJaW5zZXJ0X2NvbXB1dGVfdmxvZmZzZXRzKHAtPmhlYWQpOworCQorCS8qCisJICogRm9yIERMVF9QUEkgY2FwdHVyZXMsIGdlbmVyYXRlIGEgY2hlY2sgb2YgdGhlIHBlci1wYWNrZXQKKwkgKiBETFQgdmFsdWUgdG8gbWFrZSBzdXJlIGl0J3MgRExUX0lFRUU4MDJfMTEuCisJICovCisJcHBpX2RsdF9jaGVjayA9IGdlbl9wcGlfZGx0X2NoZWNrKCk7CisJaWYgKHBwaV9kbHRfY2hlY2sgIT0gTlVMTCkKKwkJZ2VuX2FuZChwcGlfZGx0X2NoZWNrLCBwKTsKKworCWJhY2twYXRjaChwLCBnZW5fcmV0YmxrKHNuYXBsZW4pKTsKKwlwLT5zZW5zZSA9ICFwLT5zZW5zZTsKKwliYWNrcGF0Y2gocCwgZ2VuX3JldGJsaygwKSk7CisJcm9vdCA9IHAtPmhlYWQ7Cit9CisKK3ZvaWQKK2dlbl9hbmQoYjAsIGIxKQorCXN0cnVjdCBibG9jayAqYjAsICpiMTsKK3sKKwliYWNrcGF0Y2goYjAsIGIxLT5oZWFkKTsKKwliMC0+c2Vuc2UgPSAhYjAtPnNlbnNlOworCWIxLT5zZW5zZSA9ICFiMS0+c2Vuc2U7CisJbWVyZ2UoYjEsIGIwKTsKKwliMS0+c2Vuc2UgPSAhYjEtPnNlbnNlOworCWIxLT5oZWFkID0gYjAtPmhlYWQ7Cit9CisKK3ZvaWQKK2dlbl9vcihiMCwgYjEpCisJc3RydWN0IGJsb2NrICpiMCwgKmIxOworeworCWIwLT5zZW5zZSA9ICFiMC0+c2Vuc2U7CisJYmFja3BhdGNoKGIwLCBiMS0+aGVhZCk7CisJYjAtPnNlbnNlID0gIWIwLT5zZW5zZTsKKwltZXJnZShiMSwgYjApOworCWIxLT5oZWFkID0gYjAtPmhlYWQ7Cit9CisKK3ZvaWQKK2dlbl9ub3QoYikKKwlzdHJ1Y3QgYmxvY2sgKmI7Cit7CisJYi0+c2Vuc2UgPSAhYi0+c2Vuc2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2NtcChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgdikKKwllbnVtIGVfb2ZmcmVsIG9mZnJlbDsKKwl1X2ludCBvZmZzZXQsIHNpemU7CisJYnBmX2ludDMyIHY7Cit7CisJcmV0dXJuIGdlbl9uY21wKG9mZnJlbCwgb2Zmc2V0LCBzaXplLCAweGZmZmZmZmZmLCBCUEZfSkVRLCAwLCB2KTsKK30KKworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fY21wX2d0KG9mZnJlbCwgb2Zmc2V0LCBzaXplLCB2KQorCWVudW0gZV9vZmZyZWwgb2ZmcmVsOworCXVfaW50IG9mZnNldCwgc2l6ZTsKKwlicGZfaW50MzIgdjsKK3sKKwlyZXR1cm4gZ2VuX25jbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIDB4ZmZmZmZmZmYsIEJQRl9KR1QsIDAsIHYpOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9jbXBfZ2Uob2ZmcmVsLCBvZmZzZXQsIHNpemUsIHYpCisJZW51bSBlX29mZnJlbCBvZmZyZWw7CisJdV9pbnQgb2Zmc2V0LCBzaXplOworCWJwZl9pbnQzMiB2OworeworCXJldHVybiBnZW5fbmNtcChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgMHhmZmZmZmZmZiwgQlBGX0pHRSwgMCwgdik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2NtcF9sdChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgdikKKwllbnVtIGVfb2ZmcmVsIG9mZnJlbDsKKwl1X2ludCBvZmZzZXQsIHNpemU7CisJYnBmX2ludDMyIHY7Cit7CisJcmV0dXJuIGdlbl9uY21wKG9mZnJlbCwgb2Zmc2V0LCBzaXplLCAweGZmZmZmZmZmLCBCUEZfSkdFLCAxLCB2KTsKK30KKworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fY21wX2xlKG9mZnJlbCwgb2Zmc2V0LCBzaXplLCB2KQorCWVudW0gZV9vZmZyZWwgb2ZmcmVsOworCXVfaW50IG9mZnNldCwgc2l6ZTsKKwlicGZfaW50MzIgdjsKK3sKKwlyZXR1cm4gZ2VuX25jbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIDB4ZmZmZmZmZmYsIEJQRl9KR1QsIDEsIHYpOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9tY21wKG9mZnJlbCwgb2Zmc2V0LCBzaXplLCB2LCBtYXNrKQorCWVudW0gZV9vZmZyZWwgb2ZmcmVsOworCXVfaW50IG9mZnNldCwgc2l6ZTsKKwlicGZfaW50MzIgdjsKKwlicGZfdV9pbnQzMiBtYXNrOworeworCXJldHVybiBnZW5fbmNtcChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgbWFzaywgQlBGX0pFUSwgMCwgdik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2JjbXAob2ZmcmVsLCBvZmZzZXQsIHNpemUsIHYpCisJZW51bSBlX29mZnJlbCBvZmZyZWw7CisJcmVnaXN0ZXIgdV9pbnQgb2Zmc2V0LCBzaXplOworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqdjsKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIsICp0bXA7CisKKwliID0gTlVMTDsKKwl3aGlsZSAoc2l6ZSA+PSA0KSB7CisJCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqcCA9ICZ2W3NpemUgLSA0XTsKKwkJYnBmX2ludDMyIHcgPSAoKGJwZl9pbnQzMilwWzBdIDw8IDI0KSB8CisJCSAgICAoKGJwZl9pbnQzMilwWzFdIDw8IDE2KSB8ICgoYnBmX2ludDMyKXBbMl0gPDwgOCkgfCBwWzNdOworCisJCXRtcCA9IGdlbl9jbXAob2ZmcmVsLCBvZmZzZXQgKyBzaXplIC0gNCwgQlBGX1csIHcpOworCQlpZiAoYiAhPSBOVUxMKQorCQkJZ2VuX2FuZChiLCB0bXApOworCQliID0gdG1wOworCQlzaXplIC09IDQ7CisJfQorCXdoaWxlIChzaXplID49IDIpIHsKKwkJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICpwID0gJnZbc2l6ZSAtIDJdOworCQlicGZfaW50MzIgdyA9ICgoYnBmX2ludDMyKXBbMF0gPDwgOCkgfCBwWzFdOworCisJCXRtcCA9IGdlbl9jbXAob2ZmcmVsLCBvZmZzZXQgKyBzaXplIC0gMiwgQlBGX0gsIHcpOworCQlpZiAoYiAhPSBOVUxMKQorCQkJZ2VuX2FuZChiLCB0bXApOworCQliID0gdG1wOworCQlzaXplIC09IDI7CisJfQorCWlmIChzaXplID4gMCkgeworCQl0bXAgPSBnZW5fY21wKG9mZnJlbCwgb2Zmc2V0LCBCUEZfQiwgKGJwZl9pbnQzMil2WzBdKTsKKwkJaWYgKGIgIT0gTlVMTCkKKwkJCWdlbl9hbmQoYiwgdG1wKTsKKwkJYiA9IHRtcDsKKwl9CisJcmV0dXJuIGI7Cit9CisKKy8qCisgKiBBTkQgdGhlIGZpZWxkIG9mIHNpemUgInNpemUiIGF0IG9mZnNldCAib2Zmc2V0IiByZWxhdGl2ZSB0byB0aGUgaGVhZGVyCisgKiBzcGVjaWZpZWQgYnkgIm9mZnJlbCIgd2l0aCAibWFzayIsIGFuZCBjb21wYXJlIGl0IHdpdGggdGhlIHZhbHVlICJ2IgorICogd2l0aCB0aGUgdGVzdCBzcGVjaWZpZWQgYnkgImp0eXBlIjsgaWYgInJldmVyc2UiIGlzIHRydWUsIHRoZSB0ZXN0CisgKiBzaG91bGQgdGVzdCB0aGUgb3Bwb3NpdGUgb2YgImp0eXBlIi4KKyAqLworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fbmNtcChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgbWFzaywganR5cGUsIHJldmVyc2UsIHYpCisJZW51bSBlX29mZnJlbCBvZmZyZWw7CisJYnBmX2ludDMyIHY7CisJYnBmX3VfaW50MzIgb2Zmc2V0LCBzaXplLCBtYXNrLCBqdHlwZTsKKwlpbnQgcmV2ZXJzZTsKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnMsICpzMjsKKwlzdHJ1Y3QgYmxvY2sgKmI7CisKKwlzID0gZ2VuX2xvYWRfYShvZmZyZWwsIG9mZnNldCwgc2l6ZSk7CisKKwlpZiAobWFzayAhPSAweGZmZmZmZmZmKSB7CisJCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQU5EfEJQRl9LKTsKKwkJczItPnMuayA9IG1hc2s7CisJCXNhcHBlbmQocywgczIpOworCX0KKworCWIgPSBuZXdfYmxvY2soSk1QKGp0eXBlKSk7CisJYi0+c3RtdHMgPSBzOworCWItPnMuayA9IHY7CisJaWYgKHJldmVyc2UgJiYgKGp0eXBlID09IEJQRl9KR1QgfHwganR5cGUgPT0gQlBGX0pHRSkpCisJCWdlbl9ub3QoYik7CisJcmV0dXJuIGI7Cit9CisKKy8qCisgKiBWYXJpb3VzIGNvZGUgY29uc3RydWN0cyBuZWVkIHRvIGtub3cgdGhlIGxheW91dCBvZiB0aGUgZGF0YSBsaW5rCisgKiBsYXllci4gIFRoZXNlIHZhcmlhYmxlcyBnaXZlIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcKKyAqIG9mIHRoZSBwYWNrZXQgZGF0YS4KKyAqLworCisvKgorICogVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGZyb20KKyAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhdyBwYWNrZXQgZGF0YS4KKyAqCisgKiBJdCdzIHVzdWFsbHkgMCwgZXhjZXB0IGZvciA4MDIuMTEgd2l0aCBhIGZpeGVkLWxlbmd0aCByYWRpbyBoZWFkZXIuCisgKiAoRm9yIDgwMi4xMSB3aXRoIGEgdmFyaWFibGUtbGVuZ3RoIHJhZGlvIGhlYWRlciwgd2UgaGF2ZSB0byBnZW5lcmF0ZQorICogY29kZSB0byBjb21wdXRlIHRoYXQgb2Zmc2V0OyBvZmZfbGwgaXMgMCBpbiB0aGF0IGNhc2UuKQorICovCitzdGF0aWMgdV9pbnQgb2ZmX2xsOworCisvKgorICogSWYgdGhlcmUncyBhIHZhcmlhYmxlLWxlbmd0aCBoZWFkZXIgcHJlY2VkaW5nIHRoZSBsaW5rLWxheWVyIGhlYWRlciwKKyAqICJyZWdfb2ZmX2xsIiBpcyB0aGUgcmVnaXN0ZXIgbnVtYmVyIGZvciBhIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlCisgKiBsZW5ndGggb2YgdGhhdCBoZWFkZXIsIGFuZCB0aGVyZWZvcmUgdGhlIG9mZnNldCBvZiB0aGUgbGluay1sYXllcgorICogaGVhZGVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmF3IHBhY2tldCBkYXRhLiAgT3RoZXJ3aXNlLAorICogInJlZ19vZmZfbGwiIGlzIC0xLgorICovCitzdGF0aWMgaW50IHJlZ19vZmZfbGw7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFDLWxheWVyIGhlYWRlciBmcm9tCisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rLWxheWVyIGhlYWRlci4KKyAqIEl0J3MgdXN1YWxseSAwLCBleGNlcHQgZm9yIEFUTSBMQU5FLCB3aGVyZSBpdCdzIHRoZSBvZmZzZXQsIHJlbGF0aXZlCisgKiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYXcgcGFja2V0IGRhdGEsIG9mIHRoZSBFdGhlcm5ldCBoZWFkZXIsIGFuZAorICogZm9yIEV0aGVybmV0IHdpdGggdmFyaW91cyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgdV9pbnQgb2ZmX21hYzsKKworLyoKKyAqIFRoaXMgaXMgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCwKKyAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmF3IHBhY2tldCBkYXRhLgorICoKKyAqIEkuZS4sIGl0J3MgdGhlIHN1bSBvZiB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5rLWxheWVyIGhlYWRlciAod2l0aG91dCwKKyAqIGZvciBleGFtcGxlLCBhbnkgODAyLjIgTExDIGhlYWRlciwgc28gaXQncyB0aGUgTUFDLWxheWVyCisgKiBwb3J0aW9uIG9mIHRoYXQgaGVhZGVyKSwgcGx1cyBhbnkgcHJlZml4IHByZWNlZGluZyB0aGUKKyAqIGxpbmstbGF5ZXIgaGVhZGVyLgorICovCitzdGF0aWMgdV9pbnQgb2ZmX21hY3BsOworCisvKgorICogVGhpcyBpcyAxIGlmIHRoZSBvZmZzZXQgb2YgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQKKyAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluay1sYXllciBoZWFkZXIgaXMgdmFyaWFibGUtbGVuZ3RoLgorICovCitzdGF0aWMgaW50IG9mZl9tYWNwbF9pc192YXJpYWJsZTsKKworLyoKKyAqIElmIHRoZSBsaW5rIGxheWVyIGhhcyB2YXJpYWJsZV9sZW5ndGggaGVhZGVycywgInJlZ19vZmZfbWFjcGwiCisgKiBpcyB0aGUgcmVnaXN0ZXIgbnVtYmVyIGZvciBhIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIGxpbmstbGF5ZXIgaGVhZGVyIHBsdXMgdGhlIGxlbmd0aCBvZiBhbnkgdmFyaWFibGUtbGVuZ3RoIGhlYWRlcgorICogcHJlY2VkaW5nIHRoZSBsaW5rLWxheWVyIGhlYWRlci4gIE90aGVyd2lzZSwgInJlZ19vZmZfbWFjcGwiCisgKiBpcyAtMS4KKyAqLworc3RhdGljIGludCByZWdfb2ZmX21hY3BsOworCisvKgorICogIm9mZl9saW5rdHlwZSIgaXMgdGhlIG9mZnNldCB0byBpbmZvcm1hdGlvbiBpbiB0aGUgbGluay1sYXllciBoZWFkZXIKKyAqIGdpdmluZyB0aGUgcGFja2V0IHR5cGUuICBUaGlzIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUgbGluay1sYXllciBoZWFkZXIgKGkuZS4sIGl0IGRvZXNuJ3QgaW5jbHVkZSBvZmZfbGwpLgorICoKKyAqIEZvciBFdGhlcm5ldCwgaXQncyB0aGUgb2Zmc2V0IG9mIHRoZSBFdGhlcm5ldCB0eXBlIGZpZWxkLgorICoKKyAqIEZvciBsaW5rLWxheWVyIHR5cGVzIHRoYXQgYWx3YXlzIHVzZSA4MDIuMiBoZWFkZXJzLCBpdCdzIHRoZQorICogb2Zmc2V0IG9mIHRoZSBMTEMgaGVhZGVyLgorICoKKyAqIEZvciBQUFAsIGl0J3MgdGhlIG9mZnNldCBvZiB0aGUgUFBQIHR5cGUgZmllbGQuCisgKgorICogRm9yIENpc2NvIEhETEMsIGl0J3MgdGhlIG9mZnNldCBvZiB0aGUgQ0hETEMgdHlwZSBmaWVsZC4KKyAqCisgKiBGb3IgQlNEIGxvb3BiYWNrLCBpdCdzIHRoZSBvZmZzZXQgb2YgdGhlIEFGXyB2YWx1ZS4KKyAqCisgKiBGb3IgTGludXggY29va2VkIHNvY2tldHMsIGl0J3MgdGhlIG9mZnNldCBvZiB0aGUgdHlwZSBmaWVsZC4KKyAqCisgKiBJdCdzIHNldCB0byAtMSBmb3Igbm8gZW5jYXBzdWxhdGlvbiwgaW4gd2hpY2ggY2FzZSwgSVAgaXMgYXNzdW1lZC4KKyAqLworc3RhdGljIHVfaW50IG9mZl9saW5rdHlwZTsKKworLyoKKyAqIFRSVUUgaWYgInBwcG9lcyIgYXBwZWFyZWQgaW4gdGhlIGZpbHRlcjsgaXQgY2F1c2VzIGxpbmstbGF5ZXIgdHlwZQorICogY2hlY2tzIHRvIGNoZWNrIHRoZSBQUFAgaGVhZGVyLCBhc3N1bWVkIHRvIGZvbGxvdyBhIExBTi1zdHlsZSBsaW5rLQorICogbGF5ZXIgaGVhZGVyIGFuZCBhIFBQUG9FIHNlc3Npb24gaGVhZGVyLgorICovCitzdGF0aWMgaW50IGlzX3BwcG9lcyA9IDA7CisKKy8qCisgKiBUUlVFIGlmIHRoZSBsaW5rIGxheWVyIGluY2x1ZGVzIGFuIEFUTSBwc2V1ZG8taGVhZGVyLgorICovCitzdGF0aWMgaW50IGlzX2F0bSA9IDA7CisKKy8qCisgKiBUUlVFIGlmICJsYW5lIiBhcHBlYXJlZCBpbiB0aGUgZmlsdGVyOyBpdCBjYXVzZXMgdXMgdG8gZ2VuZXJhdGUKKyAqIGNvZGUgdGhhdCBhc3N1bWVzIExBTkUgcmF0aGVyIHRoYW4gTExDLWVuY2Fwc3VsYXRlZCB0cmFmZmljIGluIFN1bkFUTS4KKyAqLworc3RhdGljIGludCBpc19sYW5lID0gMDsKKworLyoKKyAqIFRoZXNlIGFyZSBvZmZzZXRzIGZvciB0aGUgQVRNIHBzZXVkby1oZWFkZXIuCisgKi8KK3N0YXRpYyB1X2ludCBvZmZfdnBpOworc3RhdGljIHVfaW50IG9mZl92Y2k7CitzdGF0aWMgdV9pbnQgb2ZmX3Byb3RvOworCisvKgorICogVGhlc2UgYXJlIG9mZnNldHMgZm9yIHRoZSBNVFAyIGZpZWxkcy4KKyAqLworc3RhdGljIHVfaW50IG9mZl9saTsKKworLyoKKyAqIFRoZXNlIGFyZSBvZmZzZXRzIGZvciB0aGUgTVRQMyBmaWVsZHMuCisgKi8KK3N0YXRpYyB1X2ludCBvZmZfc2lvOworc3RhdGljIHVfaW50IG9mZl9vcGM7CitzdGF0aWMgdV9pbnQgb2ZmX2RwYzsKK3N0YXRpYyB1X2ludCBvZmZfc2xzOworCisvKgorICogVGhpcyBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBBVE0gcHNldWRvX2hlYWRlciwKKyAqIG9yIC0xIGlmIHRoZXJlIGlzIG5vIEFUTSBwc2V1ZG8taGVhZGVyLgorICovCitzdGF0aWMgdV9pbnQgb2ZmX3BheWxvYWQ7CisKKy8qCisgKiBUaGVzZSBhcmUgb2Zmc2V0cyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlci4KKyAqIFRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkIChpLmUuLAorICogdGhleSBkb24ndCBpbmNsdWRlIG9mZl9sbCBvciBvZmZfbWFjcGwpLgorICoKKyAqIElmIHRoZSBsaW5rIGxheWVyIG5ldmVyIHVzZXMgODAyLjIgTExDOgorICoKKyAqCSJvZmZfbmwiIGFuZCAib2ZmX25sX25vc25hcCIgYXJlIHRoZSBzYW1lLgorICoKKyAqIElmIHRoZSBsaW5rIGxheWVyIGFsd2F5cyB1c2VzIDgwMi4yIExMQzoKKyAqCisgKgkib2ZmX25sIiBpcyB0aGUgb2Zmc2V0IGlmIHRoZXJlJ3MgYSBTTkFQIGhlYWRlciBmb2xsb3dpbmcKKyAqCXRoZSA4MDIuMiBoZWFkZXI7CisgKgorICoJIm9mZl9ubF9ub3NuYXAiIGlzIHRoZSBvZmZzZXQgaWYgdGhlcmUncyBubyBTTkFQIGhlYWRlci4KKyAqCisgKiBJZiB0aGUgbGluayBsYXllciBpcyBFdGhlcm5ldDoKKyAqCisgKgkib2ZmX25sIiBpcyB0aGUgb2Zmc2V0IGlmIHRoZSBwYWNrZXQgaXMgYW4gRXRoZXJuZXQgSUkgcGFja2V0CisgKgkod2UgYXNzdW1lIG5vIDgwMi4zKzgwMi4yK1NOQVApOworICoKKyAqCSJvZmZfbmxfbm9zbmFwIiBpcyB0aGUgb2Zmc2V0IGlmIHRoZSBwYWNrZXQgaXMgYW4gODAyLjMgcGFja2V0CisgKgl3aXRoIGFuIDgwMi4yIGhlYWRlciBmb2xsb3dpbmcgaXQuCisgKi8KK3N0YXRpYyB1X2ludCBvZmZfbmw7CitzdGF0aWMgdV9pbnQgb2ZmX25sX25vc25hcDsKKworc3RhdGljIGludCBsaW5rdHlwZTsKKworc3RhdGljIHZvaWQKK2luaXRfbGlua3R5cGUocCkKKwlwY2FwX3QgKnA7Cit7CisJbGlua3R5cGUgPSBwY2FwX2RhdGFsaW5rKHApOworI2lmZGVmIFBDQVBfRkRESVBBRAorCXBjYXBfZmRkaXBhZCA9IHAtPmZkZGlwYWQ7CisjZW5kaWYKKworCS8qCisJICogQXNzdW1lIGl0J3Mgbm90IHJhdyBBVE0gd2l0aCBhIHBzZXVkby1oZWFkZXIsIGZvciBub3cuCisJICovCisJb2ZmX21hYyA9IDA7CisJaXNfYXRtID0gMDsKKwlpc19sYW5lID0gMDsKKwlvZmZfdnBpID0gLTE7CisJb2ZmX3ZjaSA9IC0xOworCW9mZl9wcm90byA9IC0xOworCW9mZl9wYXlsb2FkID0gLTE7CisKKwkvKgorCSAqIEFuZCB0aGF0IHdlJ3JlIG5vdCBkb2luZyBQUFBvRS4KKwkgKi8KKwlpc19wcHBvZXMgPSAwOworCisJLyoKKwkgKiBBbmQgYXNzdW1lIHdlJ3JlIG5vdCBkb2luZyBTUzcuCisJICovCisJb2ZmX2xpID0gLTE7CisJb2ZmX3NpbyA9IC0xOworCW9mZl9vcGMgPSAtMTsKKwlvZmZfZHBjID0gLTE7CisJb2ZmX3NscyA9IC0xOworCisJLyoKKwkgKiBBbHNvIGFzc3VtZSBpdCdzIG5vdCA4MDIuMTEuCisJICovCisJb2ZmX2xsID0gMDsKKwlvZmZfbWFjcGwgPSAwOworCW9mZl9tYWNwbF9pc192YXJpYWJsZSA9IDA7CisKKwlvcmlnX2xpbmt0eXBlID0gLTE7CisJb3JpZ19ubCA9IC0xOworICAgICAgICBsYWJlbF9zdGFja19kZXB0aCA9IDA7CisKKwlyZWdfb2ZmX2xsID0gLTE7CisJcmVnX29mZl9tYWNwbCA9IC0xOworCisJc3dpdGNoIChsaW5rdHlwZSkgeworCisJY2FzZSBETFRfQVJDTkVUOgorCQlvZmZfbGlua3R5cGUgPSAyOworCQlvZmZfbWFjcGwgPSA2OworCQlvZmZfbmwgPSAwOwkJLyogWFhYIGluIHJlYWxpdHksIHZhcmlhYmxlISAqLworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCXJldHVybjsKKworCWNhc2UgRExUX0FSQ05FVF9MSU5VWDoKKwkJb2ZmX2xpbmt0eXBlID0gNDsKKwkJb2ZmX21hY3BsID0gODsKKwkJb2ZmX25sID0gMDsJCS8qIFhYWCBpbiByZWFsaXR5LCB2YXJpYWJsZSEgKi8KKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9FTjEwTUI6CisJCW9mZl9saW5rdHlwZSA9IDEyOworCQlvZmZfbWFjcGwgPSAxNDsJCS8qIEV0aGVybmV0IGhlYWRlciBsZW5ndGggKi8KKwkJb2ZmX25sID0gMDsJCS8qIEV0aGVybmV0IElJICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMys4MDIuMiAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9TTElQOgorCQkvKgorCQkgKiBTTElQIGRvZXNuJ3QgaGF2ZSBhIGxpbmsgbGV2ZWwgdHlwZS4gIFRoZSAxNiBieXRlCisJCSAqIGhlYWRlciBpcyBoYWNrZWQgaW50byBvdXIgU0xJUCBkcml2ZXIuCisJCSAqLworCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gMTY7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfU0xJUF9CU0RPUzoKKwkJLyogWFhYIHRoaXMgbWF5IGJlIHRoZSBzYW1lIGFzIHRoZSBETFRfUFBQX0JTRE9TIGNhc2UgKi8KKwkJb2ZmX2xpbmt0eXBlID0gLTE7CisJCS8qIFhYWCBlbmQgKi8KKwkJb2ZmX21hY3BsID0gMjQ7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfTlVMTDoKKwljYXNlIERMVF9MT09QOgorCQlvZmZfbGlua3R5cGUgPSAwOworCQlvZmZfbWFjcGwgPSA0OworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCXJldHVybjsKKworCWNhc2UgRExUX0VOQzoKKwkJb2ZmX2xpbmt0eXBlID0gMDsKKwkJb2ZmX21hY3BsID0gMTI7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfUFBQOgorCWNhc2UgRExUX1BQUF9QUFBEOgorCWNhc2UgRExUX0NfSERMQzoJCS8qIEJTRC9PUyBDaXNjbyBIRExDICovCisJY2FzZSBETFRfUFBQX1NFUklBTDoJCS8qIE5ldEJTRCBzeW5jL2FzeW5jIHNlcmlhbCBQUFAgKi8KKwkJb2ZmX2xpbmt0eXBlID0gMjsKKwkJb2ZmX21hY3BsID0gNDsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9QUFBfRVRIRVI6CisJCS8qCisJCSAqIFRoaXMgZG9lcyBubyBpbmNsdWRlIHRoZSBFdGhlcm5ldCBoZWFkZXIsIGFuZAorCQkgKiBvbmx5IGNvdmVycyBzZXNzaW9uIHN0YXRlLgorCQkgKi8KKwkJb2ZmX2xpbmt0eXBlID0gNjsKKwkJb2ZmX21hY3BsID0gODsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9QUFBfQlNET1M6CisJCW9mZl9saW5rdHlwZSA9IDU7CisJCW9mZl9tYWNwbCA9IDI0OworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCXJldHVybjsKKworCWNhc2UgRExUX0ZEREk6CisJCS8qCisJCSAqIEZEREkgZG9lc24ndCByZWFsbHkgaGF2ZSBhIGxpbmstbGV2ZWwgdHlwZSBmaWVsZC4KKwkJICogV2Ugc2V0ICJvZmZfbGlua3R5cGUiIHRvIHRoZSBvZmZzZXQgb2YgdGhlIExMQyBoZWFkZXIuCisJCSAqCisJCSAqIFRvIGNoZWNrIGZvciBFdGhlcm5ldCB0eXBlcywgd2UgYXNzdW1lIHRoYXQgU1NBUCA9IFNOQVAKKwkJICogaXMgYmVpbmcgdXNlZCBhbmQgcGljayBvdXQgdGhlIGVuY2Fwc3VsYXRlZCBFdGhlcm5ldCB0eXBlLgorCQkgKiBYWFggLSBzaG91bGQgd2UgZ2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgU05BUD8KKwkJICovCisJCW9mZl9saW5rdHlwZSA9IDEzOworI2lmZGVmIFBDQVBfRkRESVBBRAorCQlvZmZfbGlua3R5cGUgKz0gcGNhcF9mZGRpcGFkOworI2VuZGlmCisJCW9mZl9tYWNwbCA9IDEzOwkJLyogRkRESSBNQUMgaGVhZGVyIGxlbmd0aCAqLworI2lmZGVmIFBDQVBfRkRESVBBRAorCQlvZmZfbWFjcGwgKz0gcGNhcF9mZGRpcGFkOworI2VuZGlmCisJCW9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9JRUVFODAyOgorCQkvKgorCQkgKiBUb2tlbiBSaW5nIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYSBsaW5rLWxldmVsIHR5cGUgZmllbGQuCisJCSAqIFdlIHNldCAib2ZmX2xpbmt0eXBlIiB0byB0aGUgb2Zmc2V0IG9mIHRoZSBMTEMgaGVhZGVyLgorCQkgKgorCQkgKiBUbyBjaGVjayBmb3IgRXRoZXJuZXQgdHlwZXMsIHdlIGFzc3VtZSB0aGF0IFNTQVAgPSBTTkFQCisJCSAqIGlzIGJlaW5nIHVzZWQgYW5kIHBpY2sgb3V0IHRoZSBlbmNhcHN1bGF0ZWQgRXRoZXJuZXQgdHlwZS4KKwkJICogWFhYIC0gc2hvdWxkIHdlIGdlbmVyYXRlIGNvZGUgdG8gY2hlY2sgZm9yIFNOQVA/CisJCSAqCisJCSAqIFhYWCAtIHRoZSBoZWFkZXIgaXMgYWN0dWFsbHkgdmFyaWFibGUtbGVuZ3RoLgorCQkgKiBTb21lIHZhcmlvdXMgTGludXggcGF0Y2hlZCB2ZXJzaW9ucyBnYXZlIDM4CisJCSAqIGFzICJvZmZfbGlua3R5cGUiIGFuZCA0MCBhcyAib2ZmX25sIjsgaG93ZXZlciwKKwkJICogaWYgYSB0b2tlbiByaW5nIHBhY2tldCBoYXMgKm5vKiByb3V0aW5nCisJCSAqIGluZm9ybWF0aW9uLCBpLmUuIGlzIG5vdCBzb3VyY2Utcm91dGVkLCB0aGUgY29ycmVjdAorCQkgKiB2YWx1ZXMgYXJlIDIwIGFuZCAyMiwgYXMgdGhleSBhcmUgaW4gdGhlIHZhbmlsbGEgY29kZS4KKwkJICoKKwkJICogQSBwYWNrZXQgaXMgc291cmNlLXJvdXRlZCBpZmYgdGhlIHVwcGVybW9zdCBiaXQKKwkJICogb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNvdXJjZSBhZGRyZXNzLCBhdCBhbgorCQkgKiBvZmZzZXQgb2YgOCwgaGFzIHRoZSB1cHBlcm1vc3QgYml0IHNldC4gIElmIHRoZQorCQkgKiBwYWNrZXQgaXMgc291cmNlLXJvdXRlZCwgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcworCQkgKiBvZiByb3V0aW5nIGluZm9ybWF0aW9uIGlzIDIgcGx1cyBiaXRzIDB4MUYwMCBvZgorCQkgKiB0aGUgMTYtYml0IHZhbHVlIGF0IGFuIG9mZnNldCBvZiAxNCAoc2hpZnRlZCByaWdodAorCQkgKiA4IC0gZmlndXJlIG91dCB3aGljaCBieXRlIHRoYXQgaXMpLgorCQkgKi8KKwkJb2ZmX2xpbmt0eXBlID0gMTQ7CisJCW9mZl9tYWNwbCA9IDE0OwkJLyogVG9rZW4gUmluZyBNQUMgaGVhZGVyIGxlbmd0aCAqLworCQlvZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLworCQlvZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfSUVFRTgwMl8xMToKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwkJLyoKKwkJICogODAyLjExIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYSBsaW5rLWxldmVsIHR5cGUgZmllbGQuCisJCSAqIFdlIHNldCAib2ZmX2xpbmt0eXBlIiB0byB0aGUgb2Zmc2V0IG9mIHRoZSBMTEMgaGVhZGVyLgorCQkgKgorCQkgKiBUbyBjaGVjayBmb3IgRXRoZXJuZXQgdHlwZXMsIHdlIGFzc3VtZSB0aGF0IFNTQVAgPSBTTkFQCisJCSAqIGlzIGJlaW5nIHVzZWQgYW5kIHBpY2sgb3V0IHRoZSBlbmNhcHN1bGF0ZWQgRXRoZXJuZXQgdHlwZS4KKwkJICogWFhYIC0gc2hvdWxkIHdlIGdlbmVyYXRlIGNvZGUgdG8gY2hlY2sgZm9yIFNOQVA/CisJCSAqCisJCSAqIFdlIGFsc28gaGFuZGxlIHZhcmlhYmxlLWxlbmd0aCByYWRpbyBoZWFkZXJzIGhlcmUuCisJCSAqIFRoZSBQcmlzbSBoZWFkZXIgaXMgaW4gdGhlb3J5IHZhcmlhYmxlLWxlbmd0aCwgYnV0IGluCisJCSAqIHByYWN0aWNlIGl0J3MgYWx3YXlzIDE0NCBieXRlcyBsb25nLiAgSG93ZXZlciwgc29tZQorCQkgKiBkcml2ZXJzIG9uIExpbnV4IHVzZSBBUlBIUkRfSUVFRTgwMjExX1BSSVNNLCBidXQKKwkJICogc29tZXRpbWVzIG9yIGFsd2F5cyBzdXBwbHkgYW4gQVZTIGhlYWRlciwgc28gd2UKKwkJICogaGF2ZSB0byBjaGVjayB3aGV0aGVyIHRoZSByYWRpbyBoZWFkZXIgaXMgYSBQcmlzbQorCQkgKiBoZWFkZXIgb3IgYW4gQVZTIGhlYWRlciwgc28sIGluIHByYWN0aWNlLCBpdCdzCisJCSAqIHZhcmlhYmxlLWxlbmd0aC4KKwkJICovCisJCW9mZl9saW5rdHlwZSA9IDI0OworCQlvZmZfbWFjcGwgPSAwOwkJLyogbGluay1sYXllciBoZWFkZXIgaXMgdmFyaWFibGUtbGVuZ3RoICovCisJCW9mZl9tYWNwbF9pc192YXJpYWJsZSA9IDE7CisJCW9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9QUEk6CisJCS8qIAorCQkgKiBBdCB0aGUgbW9tZW50IHdlIHRyZWF0IFBQSSB0aGUgc2FtZSB3YXkgdGhhdCB3ZSB0cmVhdAorCQkgKiBub3JtYWwgUmFkaW90YXAgZW5jb2RlZCBwYWNrZXRzLiBUaGUgZGlmZmVyZW5jZSBpcyBpbgorCQkgKiB0aGUgZnVuY3Rpb24gdGhhdCBnZW5lcmF0ZXMgdGhlIGNvZGUgYXQgdGhlIGJlZ2lubmluZworCQkgKiB0byBjb21wdXRlIHRoZSBoZWFkZXIgbGVuZ3RoLiAgU2luY2UgdGhpcyBjb2RlIGdlbmVyYXRvcgorCQkgKiBvZiBQUEkgc3VwcG9ydHMgYmFyZSA4MDIuMTEgZW5jYXBzdWxhdGlvbiBvbmx5IChpLmUuCisJCSAqIHRoZSBlbmNhcHN1bGF0ZWQgRExUIHNob3VsZCBiZSBETFRfSUVFRTgwMl8xMSkgd2UKKwkJICogZ2VuZXJhdGUgY29kZSB0byBjaGVjayBmb3IgdGhpcyB0b28uCisJCSAqLworCQlvZmZfbGlua3R5cGUgPSAyNDsKKwkJb2ZmX21hY3BsID0gMDsJCS8qIGxpbmstbGF5ZXIgaGVhZGVyIGlzIHZhcmlhYmxlLWxlbmd0aCAqLworCQlvZmZfbWFjcGxfaXNfdmFyaWFibGUgPSAxOworCQlvZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLworCQlvZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfQVRNX1JGQzE0ODM6CisJY2FzZSBETFRfQVRNX0NMSVA6CS8qIExpbnV4IEFUTSBkZWZpbmVzIHRoaXMgKi8KKwkJLyoKKwkJICogYXNzdW1lIHJvdXRlZCwgbm9uLUlTTyBQRFVzCisJCSAqIChpLmUuLCBMTEMgPSAweEFBLUFBLTAzLCBPVVQgPSAweDAwLTAwLTAwKQorCQkgKgorCQkgKiBYWFggLSB3aGF0IGFib3V0IElTTyBQRFVzLCBlLmcuIENMTlAsIElTSVMsIEVTSVMsCisJCSAqIG9yIFBQUCB3aXRoIHRoZSBQUFAgTkxQSUQgKGUuZy4sIFBQUG9BKT8gIFRoZQorCQkgKiBsYXR0ZXIgd291bGQgcHJlc3VtYWJseSBiZSB0cmVhdGVkIHRoZSB3YXkgUFBQb0UKKwkJICogc2hvdWxkIGJlLCBzbyB5b3UgY2FuIGRvICJwcHBvZSBhbmQgdWRwIHBvcnQgMjA0OSIKKwkJICogb3IgInBwcG9hIGFuZCB0Y3AgcG9ydCA4MCIgYW5kIGhhdmUgaXQgY2hlY2sgZm9yCisJCSAqIFBQUG97QSxFfSBhbmQgYSBQUFAgcHJvdG9jb2wgb2YgSVAgYW5kLi4uLgorCQkgKi8KKwkJb2ZmX2xpbmt0eXBlID0gMDsKKwkJb2ZmX21hY3BsID0gMDsJCS8qIHBhY2tldCBiZWdpbnMgd2l0aCBMTEMgaGVhZGVyICovCisJCW9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9TVU5BVE06CisJCS8qCisJCSAqIEZ1bGwgRnJvbnRhbCBBVE07IHlvdSBnZXQgQUFMbiBQRFVzIHdpdGggYW4gQVRNCisJCSAqIHBzZXVkby1oZWFkZXIuCisJCSAqLworCQlpc19hdG0gPSAxOworCQlvZmZfdnBpID0gU1VOQVRNX1ZQSV9QT1M7CisJCW9mZl92Y2kgPSBTVU5BVE1fVkNJX1BPUzsKKwkJb2ZmX3Byb3RvID0gUFJPVE9fUE9TOworCQlvZmZfbWFjID0gLTE7CS8qIGFzc3VtZSBMTEMtZW5jYXBzdWxhdGVkLCBzbyBubyBNQUMtbGF5ZXIgaGVhZGVyICovCisJCW9mZl9wYXlsb2FkID0gU1VOQVRNX1BLVF9CRUdJTl9QT1M7CisJCW9mZl9saW5rdHlwZSA9IG9mZl9wYXlsb2FkOworCQlvZmZfbWFjcGwgPSBvZmZfcGF5bG9hZDsJLyogaWYgTExDLWVuY2Fwc3VsYXRlZCAqLworCQlvZmZfbmwgPSA4OwkJLyogODAyLjIrU05BUCAqLworCQlvZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjIgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfUkFXOgorCWNhc2UgRExUX0lQVjQ6CisJY2FzZSBETFRfSVBWNjoKKwkJb2ZmX2xpbmt0eXBlID0gLTE7CisJCW9mZl9tYWNwbCA9IDA7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfTElOVVhfU0xMOgkvKiBmYWtlIGhlYWRlciBmb3IgTGludXggY29va2VkIHNvY2tldCAqLworCQlvZmZfbGlua3R5cGUgPSAxNDsKKwkJb2ZmX21hY3BsID0gMTY7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfTFRBTEs6CisJCS8qCisJCSAqIExvY2FsVGFsayBkb2VzIGhhdmUgYSAxLWJ5dGUgdHlwZSBmaWVsZCBpbiB0aGUgTExBUCBoZWFkZXIsCisJCSAqIGJ1dCByZWFsbHkgaXQganVzdCBpbmRpY2F0ZXMgd2hldGhlciB0aGVyZSBpcyBhICJzaG9ydCIgb3IKKwkJICogImxvbmciIEREUCBwYWNrZXQgZm9sbG93aW5nLgorCQkgKi8KKwkJb2ZmX2xpbmt0eXBlID0gLTE7CisJCW9mZl9tYWNwbCA9IDA7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfSVBfT1ZFUl9GQzoKKwkJLyoKKwkJICogUkZDIDI2MjUgSVAtb3Zlci1GaWJyZS1DaGFubmVsIGRvZXNuJ3QgcmVhbGx5IGhhdmUgYQorCQkgKiBsaW5rLWxldmVsIHR5cGUgZmllbGQuICBXZSBzZXQgIm9mZl9saW5rdHlwZSIgdG8gdGhlCisJCSAqIG9mZnNldCBvZiB0aGUgTExDIGhlYWRlci4KKwkJICoKKwkJICogVG8gY2hlY2sgZm9yIEV0aGVybmV0IHR5cGVzLCB3ZSBhc3N1bWUgdGhhdCBTU0FQID0gU05BUAorCQkgKiBpcyBiZWluZyB1c2VkIGFuZCBwaWNrIG91dCB0aGUgZW5jYXBzdWxhdGVkIEV0aGVybmV0IHR5cGUuCisJCSAqIFhYWCAtIHNob3VsZCB3ZSBnZW5lcmF0ZSBjb2RlIHRvIGNoZWNrIGZvciBTTkFQPyBSRkMKKwkJICogMjYyNSBzYXlzIFNOQVAgc2hvdWxkIGJlIHVzZWQuCisJCSAqLworCQlvZmZfbGlua3R5cGUgPSAxNjsKKwkJb2ZmX21hY3BsID0gMTY7CisJCW9mZl9ubCA9IDg7CQkvKiA4MDIuMitTTkFQICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkvKiA4MDIuMiAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9GUkVMQVk6CisJCS8qCisJCSAqIFhYWCAtIHdlIHNob3VsZCBzZXQgdGhpcyB0byBoYW5kbGUgU05BUC1lbmNhcHN1bGF0ZWQKKwkJICogZnJhbWVzIChOTFBJRCBvZiAweDgwKS4KKwkJICovCisJCW9mZl9saW5rdHlwZSA9IC0xOworCQlvZmZfbWFjcGwgPSAwOworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogbm8gODAyLjIgTExDICovCisJCXJldHVybjsKKworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogdGhlIG9ubHkgQlBGLWludGVyZXN0aW5nIEZSRi4xNiBmcmFtZXMgYXJlIG5vbi1jb250cm9sIGZyYW1lczsKKyAgICAgICAgICAgICAgICAgKiBGcmFtZSBSZWxheSBoYXMgYSB2YXJpYWJsZSBsZW5ndGggbGluay1sYXllcgorICAgICAgICAgICAgICAgICAqIHNvIGxldHMgc3RhcnQgd2l0aCBvZmZzZXQgNCBmb3Igbm93IGFuZCBpbmNyZW1lbnRzIGxhdGVyIG9uIChGSVhNRSk7CisgICAgICAgICAgICAgICAgICovCisJY2FzZSBETFRfTUZSOgorCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gMDsKKwkJb2ZmX25sID0gNDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIFhYWCAtIGZvciBub3cgLT4gbm8gODAyLjIgTExDICovCisJCXJldHVybjsKKworCWNhc2UgRExUX0FQUExFX0lQX09WRVJfSUVFRTEzOTQ6CisJCW9mZl9saW5rdHlwZSA9IDE2OworCQlvZmZfbWFjcGwgPSAxODsKKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDA7CS8qIG5vIDgwMi4yIExMQyAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9TWU1BTlRFQ19GSVJFV0FMTDoKKwkJb2ZmX2xpbmt0eXBlID0gNjsKKwkJb2ZmX21hY3BsID0gNDQ7CisJCW9mZl9ubCA9IDA7CQkvKiBFdGhlcm5ldCBJSSAqLworCQlvZmZfbmxfbm9zbmFwID0gMDsJLyogWFhYIC0gd2hhdCBkb2VzIGl0IGRvIHdpdGggODAyLjMgcGFja2V0cz8gKi8KKwkJcmV0dXJuOworCisjaWZkZWYgSEFWRV9ORVRfUEZWQVJfSAorCWNhc2UgRExUX1BGTE9HOgorCQlvZmZfbGlua3R5cGUgPSAwOworCQlvZmZfbWFjcGwgPSBQRkxPR19IRFJMRU47CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJcmV0dXJuOworI2VuZGlmCisKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9NRlI6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfTUxGUjoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9NTFBQUDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9QUFA6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfQ0hETEM6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfRlJFTEFZOgorICAgICAgICAgICAgICAgIG9mZl9saW5rdHlwZSA9IDQ7CisJCW9mZl9tYWNwbCA9IDQ7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAtMTsJLyogbm8gODAyLjIgTExDICovCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisJY2FzZSBETFRfSlVOSVBFUl9BVE0xOgorCQlvZmZfbGlua3R5cGUgPSA0OwkvKiBpbiByZWFsaXR5IHZhcmlhYmxlIGJldHdlZW4gNC04ICovCisJCW9mZl9tYWNwbCA9IDQ7CS8qIGluIHJlYWxpdHkgdmFyaWFibGUgYmV0d2VlbiA0LTggKi8KKwkJb2ZmX25sID0gMDsKKwkJb2ZmX25sX25vc25hcCA9IDEwOworCQlyZXR1cm47CisKKwljYXNlIERMVF9KVU5JUEVSX0FUTTI6CisJCW9mZl9saW5rdHlwZSA9IDg7CS8qIGluIHJlYWxpdHkgdmFyaWFibGUgYmV0d2VlbiA4LTEyICovCisJCW9mZl9tYWNwbCA9IDg7CS8qIGluIHJlYWxpdHkgdmFyaWFibGUgYmV0d2VlbiA4LTEyICovCisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAxMDsKKwkJcmV0dXJuOworCisJCS8qIGZyYW1lcyBjYXB0dXJlZCBvbiBhIEp1bmlwZXIgUFBQb0Ugc2VydmljZSBQSUMKKwkJICogY29udGFpbiByYXcgZXRoZXJuZXQgZnJhbWVzICovCisJY2FzZSBETFRfSlVOSVBFUl9QUFBPRToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9FVEhFUjoKKyAgICAgICAgCW9mZl9tYWNwbCA9IDE0OworCQlvZmZfbGlua3R5cGUgPSAxNjsKKwkJb2ZmX25sID0gMTg7CQkvKiBFdGhlcm5ldCBJSSAqLworCQlvZmZfbmxfbm9zbmFwID0gMjE7CS8qIDgwMi4zKzgwMi4yICovCisJCXJldHVybjsKKworCWNhc2UgRExUX0pVTklQRVJfUFBQT0VfQVRNOgorCQlvZmZfbGlua3R5cGUgPSA0OworCQlvZmZfbWFjcGwgPSA2OworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9KVU5JUEVSX0dHU046CisJCW9mZl9saW5rdHlwZSA9IDY7CisJCW9mZl9tYWNwbCA9IDEyOworCQlvZmZfbmwgPSAwOworCQlvZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9KVU5JUEVSX0VTOgorCQlvZmZfbGlua3R5cGUgPSA2OworCQlvZmZfbWFjcGwgPSAtMTsJCS8qIG5vdCByZWFsbHkgYSBuZXR3b3JrIGxheWVyIGJ1dCByYXcgSVAgYWRkcmVzc2VzICovCisJCW9mZl9ubCA9IC0xOwkJLyogbm90IHJlYWxseSBhIG5ldHdvcmsgbGF5ZXIgYnV0IHJhdyBJUCBhZGRyZXNzZXMgKi8KKwkJb2ZmX25sX25vc25hcCA9IC0xOwkvKiBubyA4MDIuMiBMTEMgKi8KKwkJcmV0dXJuOworCisJY2FzZSBETFRfSlVOSVBFUl9NT05JVE9SOgorCQlvZmZfbGlua3R5cGUgPSAxMjsKKwkJb2ZmX21hY3BsID0gMTI7CisJCW9mZl9ubCA9IDA7CQkvKiByYXcgSVAvSVA2IGhlYWRlciAqLworCQlvZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9KVU5JUEVSX1NFUlZJQ0VTOgorCQlvZmZfbGlua3R5cGUgPSAxMjsKKwkJb2ZmX21hY3BsID0gLTE7CQkvKiBMMyBwcm90byBsb2NhdGlvbiBkZXAuIG9uIGNvb2tpZSB0eXBlICovCisJCW9mZl9ubCA9IC0xOwkJLyogTDMgcHJvdG8gbG9jYXRpb24gZGVwLiBvbiBjb29raWUgdHlwZSAqLworCQlvZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9KVU5JUEVSX1ZQOgorCQlvZmZfbGlua3R5cGUgPSAxODsKKwkJb2ZmX21hY3BsID0gLTE7CisJCW9mZl9ubCA9IC0xOworCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCXJldHVybjsKKworCWNhc2UgRExUX0pVTklQRVJfU1Q6CisJCW9mZl9saW5rdHlwZSA9IDE4OworCQlvZmZfbWFjcGwgPSAtMTsKKwkJb2ZmX25sID0gLTE7CisJCW9mZl9ubF9ub3NuYXAgPSAtMTsKKwkJcmV0dXJuOworCisJY2FzZSBETFRfSlVOSVBFUl9JU006CisJCW9mZl9saW5rdHlwZSA9IDg7CisJCW9mZl9tYWNwbCA9IC0xOworCQlvZmZfbmwgPSAtMTsKKwkJb2ZmX25sX25vc25hcCA9IC0xOworCQlyZXR1cm47CisKKwljYXNlIERMVF9KVU5JUEVSX1ZTOgorCWNhc2UgRExUX0pVTklQRVJfU1JYX0UyRToKKwljYXNlIERMVF9KVU5JUEVSX0ZJQlJFQ0hBTk5FTDoKKwljYXNlIERMVF9KVU5JUEVSX0FUTV9DRU1JQzoKKwkJb2ZmX2xpbmt0eXBlID0gODsKKwkJb2ZmX21hY3BsID0gLTE7CisJCW9mZl9ubCA9IC0xOworCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCXJldHVybjsKKworCWNhc2UgRExUX01UUDI6CisJCW9mZl9saSA9IDI7CisJCW9mZl9zaW8gPSAzOworCQlvZmZfb3BjID0gNDsKKwkJb2ZmX2RwYyA9IDQ7CisJCW9mZl9zbHMgPSA3OworCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gLTE7CisJCW9mZl9ubCA9IC0xOworCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCXJldHVybjsKKworCWNhc2UgRExUX01UUDJfV0lUSF9QSERSOgorCQlvZmZfbGkgPSA2OworCQlvZmZfc2lvID0gNzsKKwkJb2ZmX29wYyA9IDg7CisJCW9mZl9kcGMgPSA4OworCQlvZmZfc2xzID0gMTE7CisJCW9mZl9saW5rdHlwZSA9IC0xOworCQlvZmZfbWFjcGwgPSAtMTsKKwkJb2ZmX25sID0gLTE7CisJCW9mZl9ubF9ub3NuYXAgPSAtMTsKKwkJcmV0dXJuOworCisJY2FzZSBETFRfRVJGOgorCQlvZmZfbGkgPSAyMjsKKwkJb2ZmX3NpbyA9IDIzOworCQlvZmZfb3BjID0gMjQ7CisJCW9mZl9kcGMgPSAyNDsKKwkJb2ZmX3NscyA9IDI3OworCQlvZmZfbGlua3R5cGUgPSAtMTsKKwkJb2ZmX21hY3BsID0gLTE7CisJCW9mZl9ubCA9IC0xOworCQlvZmZfbmxfbm9zbmFwID0gLTE7CisJCXJldHVybjsKKworCWNhc2UgRExUX1BGU1lOQzoKKwkJb2ZmX2xpbmt0eXBlID0gLTE7CisJCW9mZl9tYWNwbCA9IDQ7CisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAwOworCQlyZXR1cm47CisKKwljYXNlIERMVF9BWDI1X0tJU1M6CisJCS8qCisJCSAqIEN1cnJlbnRseSwgb25seSByYXcgImxpbmtbTjpNXSIgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZC4KKwkJICovCisJCW9mZl9saW5rdHlwZSA9IC0xOwkvKiB2YXJpYWJsZSwgbWluIDE1LCBtYXggNzEgc3RlcHMgb2YgNyAqLworCQlvZmZfbWFjcGwgPSAtMTsKKwkJb2ZmX25sID0gLTE7CQkvKiB2YXJpYWJsZSwgbWluIDE2LCBtYXggNzEgc3RlcHMgb2YgNyAqLworCQlvZmZfbmxfbm9zbmFwID0gLTE7CS8qIG5vIDgwMi4yIExMQyAqLworCQlvZmZfbWFjID0gMTsJCS8qIHN0ZXAgb3ZlciB0aGUga2lzcyBsZW5ndGggYnl0ZSAqLworCQlyZXR1cm47CisKKwljYXNlIERMVF9JUE5FVDoKKwkJb2ZmX2xpbmt0eXBlID0gMTsKKwkJb2ZmX21hY3BsID0gMjQ7CQkvKiBpcG5ldCBoZWFkZXIgbGVuZ3RoICovCisJCW9mZl9ubCA9IDA7CisJCW9mZl9ubF9ub3NuYXAgPSAtMTsKKwkJcmV0dXJuOworCisJY2FzZSBETFRfTkVUQU5BTFlaRVI6CisJCW9mZl9tYWMgPSA0OwkJLyogTUFDIGhlYWRlciBpcyBwYXN0IDQtYnl0ZSBwc2V1ZG8taGVhZGVyICovCisJCW9mZl9saW5rdHlwZSA9IDE2OwkvKiBpbmNsdWRlcyA0LWJ5dGUgcHNldWRvLWhlYWRlciAqLworCQlvZmZfbWFjcGwgPSAxODsJCS8qIHBzZXVkby1oZWFkZXIrRXRoZXJuZXQgaGVhZGVyIGxlbmd0aCAqLworCQlvZmZfbmwgPSAwOwkJLyogRXRoZXJuZXQgSUkgKi8KKwkJb2ZmX25sX25vc25hcCA9IDM7CS8qIDgwMi4zKzgwMi4yICovCisJCXJldHVybjsKKworCWNhc2UgRExUX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5UOgorCQlvZmZfbWFjID0gMTI7CQkvKiBNQUMgaGVhZGVyIGlzIHBhc3QgNC1ieXRlIHBzZXVkby1oZWFkZXIsIHByZWFtYmxlLCBhbmQgU0ZEICovCisJCW9mZl9saW5rdHlwZSA9IDI0OwkvKiBpbmNsdWRlcyA0LWJ5dGUgcHNldWRvLWhlYWRlcitwcmVhbWJsZStTRkQgKi8KKwkJb2ZmX21hY3BsID0gMjY7CQkvKiBwc2V1ZG8taGVhZGVyK3ByZWFtYmxlK1NGRCtFdGhlcm5ldCBoZWFkZXIgbGVuZ3RoICovCisJCW9mZl9ubCA9IDA7CQkvKiBFdGhlcm5ldCBJSSAqLworCQlvZmZfbmxfbm9zbmFwID0gMzsJLyogODAyLjMrODAyLjIgKi8KKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJLyoKKwkJICogRm9yIHZhbHVlcyBpbiB0aGUgcmFuZ2UgaW4gd2hpY2ggd2UndmUgYXNzaWduZWQgbmV3CisJCSAqIERMVF8gdmFsdWVzLCBvbmx5IHJhdyAibGlua1tOOk1dIiBmaWx0ZXJpbmcgaXMgc3VwcG9ydGVkLgorCQkgKi8KKwkJaWYgKGxpbmt0eXBlID49IERMVF9NQVRDSElOR19NSU4gJiYKKwkJICAgIGxpbmt0eXBlIDw9IERMVF9NQVRDSElOR19NQVgpIHsKKwkJCW9mZl9saW5rdHlwZSA9IC0xOworCQkJb2ZmX21hY3BsID0gLTE7CisJCQlvZmZfbmwgPSAtMTsKKwkJCW9mZl9ubF9ub3NuYXAgPSAtMTsKKwkJCXJldHVybjsKKwkJfQorCisJfQorCWJwZl9lcnJvcigidW5rbm93biBkYXRhIGxpbmsgdHlwZSAlZCIsIGxpbmt0eXBlKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qCisgKiBMb2FkIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluay1sYXllciBoZWFkZXIuCisgKiBUaGUgbGluay1sYXllciBoZWFkZXIgZG9lc24ndCBuZWNlc3NhcmlseSBiZWdpbiBhdCB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUgcGFja2V0IGRhdGE7IHRoZXJlIG1pZ2h0IGJlIGEgdmFyaWFibGUtbGVuZ3RoIHByZWZpeCBjb250YWluaW5nCisgKiByYWRpbyBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fbG9hZF9sbHJlbChvZmZzZXQsIHNpemUpCisJdV9pbnQgb2Zmc2V0LCBzaXplOworeworCXN0cnVjdCBzbGlzdCAqcywgKnMyOworCisJcyA9IGdlbl9sbHByZWZpeGxlbigpOworCisJLyoKKwkgKiBJZiAicyIgaXMgbm9uLW51bGwsIGl0IGhhcyBjb2RlIHRvIGFycmFuZ2UgdGhhdCB0aGUgWCByZWdpc3RlcgorCSAqIGNvbnRhaW5zIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIKKwkgKiBoZWFkZXIuCisJICoKKwkgKiBPdGhlcndpc2UsIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIKKwkgKiBoZWFkZXIgaXMgIm9mZl9sbCIuCisJICovCisJaWYgKHMgIT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGVyZSdzIGEgdmFyaWFibGUtbGVuZ3RoIHByZWZpeCBwcmVjZWRpbmcgdGhlCisJCSAqIGxpbmstbGF5ZXIgaGVhZGVyLiAgInMiIHBvaW50cyB0byBhIGxpc3Qgb2Ygc3RhdGVtZW50cworCQkgKiB0aGF0IHB1dCB0aGUgbGVuZ3RoIG9mIHRoYXQgcHJlZml4IGludG8gdGhlIFggcmVnaXN0ZXIuCisJCSAqIGRvIGFuIGluZGlyZWN0IGxvYWQsIHRvIHVzZSB0aGUgWCByZWdpc3RlciBhcyBhbiBvZmZzZXQuCisJCSAqLworCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOworCQlzMi0+cy5rID0gb2Zmc2V0OworCQlzYXBwZW5kKHMsIHMyKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGVyZSBpcyBubyB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHByZWNlZGluZyB0aGUKKwkJICogbGluay1sYXllciBoZWFkZXI7IGFkZCBpbiBvZmZfbGwsIHdoaWNoLCBpZiB0aGVyZSdzCisJCSAqIGEgZml4ZWQtbGVuZ3RoIGhlYWRlciBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLAorCQkgKiBpcyB0aGUgbGVuZ3RoIG9mIHRoYXQgaGVhZGVyLgorCQkgKi8KKwkJcyA9IG5ld19zdG10KEJQRl9MRHxCUEZfQUJTfHNpemUpOworCQlzLT5zLmsgPSBvZmZzZXQgKyBvZmZfbGw7CisJfQorCXJldHVybiBzOworfQorCisvKgorICogTG9hZCBhIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkLgorICovCitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9sb2FkX21hY3BscmVsKG9mZnNldCwgc2l6ZSkKKwl1X2ludCBvZmZzZXQsIHNpemU7Cit7CisJc3RydWN0IHNsaXN0ICpzLCAqczI7CisKKwlzID0gZ2VuX29mZl9tYWNwbCgpOworCisJLyoKKwkgKiBJZiBzIGlzIG5vbi1udWxsLCB0aGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCBpcworCSAqIHZhcmlhYmxlLCBhbmQgcyBwb2ludHMgdG8gYSBsaXN0IG9mIGluc3RydWN0aW9ucyB0aGF0CisJICogYXJyYW5nZSB0aGF0IHRoZSBYIHJlZ2lzdGVyIGNvbnRhaW5zIHRoYXQgb2Zmc2V0LgorCSAqCisJICogT3RoZXJ3aXNlLCB0aGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCBpcyBjb25zdGFudCwKKwkgKiBhbmQgaXMgaW4gb2ZmX21hY3BsLgorCSAqLworCWlmIChzICE9IE5VTEwpIHsKKwkJLyoKKwkJICogVGhlIG9mZnNldCBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQgaXMgaW4gdGhlIFgKKwkJICogcmVnaXN0ZXIuICBEbyBhbiBpbmRpcmVjdCBsb2FkLCB0byB1c2UgdGhlIFggcmVnaXN0ZXIKKwkJICogYXMgYW4gb2Zmc2V0LgorCQkgKi8KKwkJczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxzaXplKTsKKwkJczItPnMuayA9IG9mZnNldDsKKwkJc2FwcGVuZChzLCBzMik7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlIG9mZnNldCBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQgaXMgY29uc3RhbnQsCisJCSAqIGFuZCBpcyBpbiBvZmZfbWFjcGw7IGxvYWQgdGhlIHZhbHVlIGF0IHRoYXQgb2Zmc2V0CisJCSAqIHBsdXMgdGhlIHNwZWNpZmllZCBvZmZzZXQuCisJCSAqLworCQlzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9BQlN8c2l6ZSk7CisJCXMtPnMuayA9IG9mZl9tYWNwbCArIG9mZnNldDsKKwl9CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKiBMb2FkIGEgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3BlY2lmaWVkIGhlYWRlci4KKyAqLworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fbG9hZF9hKG9mZnJlbCwgb2Zmc2V0LCBzaXplKQorCWVudW0gZV9vZmZyZWwgb2ZmcmVsOworCXVfaW50IG9mZnNldCwgc2l6ZTsKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnMsICpzMjsKKworCXN3aXRjaCAob2ZmcmVsKSB7CisKKwljYXNlIE9SX1BBQ0tFVDoKKyAgICAgICAgICAgICAgICBzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9BQlN8c2l6ZSk7CisgICAgICAgICAgICAgICAgcy0+cy5rID0gb2Zmc2V0OworCQlicmVhazsKKworCWNhc2UgT1JfTElOSzoKKwkJcyA9IGdlbl9sb2FkX2xscmVsKG9mZnNldCwgc2l6ZSk7CisJCWJyZWFrOworCisJY2FzZSBPUl9NQUNQTDoKKwkJcyA9IGdlbl9sb2FkX21hY3BscmVsKG9mZnNldCwgc2l6ZSk7CisJCWJyZWFrOworCisJY2FzZSBPUl9ORVQ6CisJCXMgPSBnZW5fbG9hZF9tYWNwbHJlbChvZmZfbmwgKyBvZmZzZXQsIHNpemUpOworCQlicmVhazsKKworCWNhc2UgT1JfTkVUX05PU05BUDoKKwkJcyA9IGdlbl9sb2FkX21hY3BscmVsKG9mZl9ubF9ub3NuYXAgKyBvZmZzZXQsIHNpemUpOworCQlicmVhazsKKworCWNhc2UgT1JfVFJBTl9JUFY0OgorCQkvKgorCQkgKiBMb2FkIHRoZSBYIHJlZ2lzdGVyIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgSVB2NCBoZWFkZXIKKwkJICogKHBsdXMgdGhlIG9mZnNldCBvZiB0aGUgbGluay1sYXllciBoZWFkZXIsIGlmIGl0J3MKKwkJICogcHJlY2VkZWQgYnkgYSB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHN1Y2ggYXMgYSByYWRpbworCQkgKiBoZWFkZXIpLCBpbiBieXRlcy4KKwkJICovCisJCXMgPSBnZW5fbG9hZHhfaXBoZHJsZW4oKTsKKworCQkvKgorCQkgKiBMb2FkIHRoZSBpdGVtIGF0IHtvZmZzZXQgb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkfSArCisJCSAqIHtvZmZzZXQsIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgTUFDLWxheWVyCisJCSAqIHBheWxvZCwgb2YgdGhlIElQdjQgaGVhZGVyfSArIHtsZW5ndGggb2YgdGhlIElQdjQgaGVhZGVyfSArCisJCSAqIHtzcGVjaWZpZWQgb2Zmc2V0fS4KKwkJICoKKwkJICogKElmIHRoZSBvZmZzZXQgb2YgdGhlIE1BQy1sYXllciBwYXlsb2FkIGlzIHZhcmlhYmxlLAorCQkgKiBpdCdzIGluY2x1ZGVkIGluIHRoZSB2YWx1ZSBpbiB0aGUgWCByZWdpc3RlciwgYW5kCisJCSAqIG9mZl9tYWNwbCBpcyAwLikKKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8c2l6ZSk7CisJCXMyLT5zLmsgPSBvZmZfbWFjcGwgKyBvZmZfbmwgKyBvZmZzZXQ7CisJCXNhcHBlbmQocywgczIpOworCQlicmVhazsKKworCWNhc2UgT1JfVFJBTl9JUFY2OgorCQlzID0gZ2VuX2xvYWRfbWFjcGxyZWwob2ZmX25sICsgNDAgKyBvZmZzZXQsIHNpemUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gczsKK30KKworLyoKKyAqIEdlbmVyYXRlIGNvZGUgdG8gbG9hZCBpbnRvIHRoZSBYIHJlZ2lzdGVyIHRoZSBzdW0gb2YgdGhlIGxlbmd0aCBvZgorICogdGhlIElQdjQgaGVhZGVyIGFuZCBhbnkgdmFyaWFibGUtbGVuZ3RoIGhlYWRlciBwcmVjZWRpbmcgdGhlIGxpbmstbGF5ZXIKKyAqIGhlYWRlci4KKyAqLworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fbG9hZHhfaXBoZHJsZW4oKQoreworCXN0cnVjdCBzbGlzdCAqcywgKnMyOworCisJcyA9IGdlbl9vZmZfbWFjcGwoKTsKKwlpZiAocyAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZXJlJ3MgYSB2YXJpYWJsZS1sZW5ndGggcHJlZml4IHByZWNlZGluZyB0aGUKKwkJICogbGluay1sYXllciBoZWFkZXIsIG9yIHRoZSBsaW5rLWxheWVyIGhlYWRlciBpcyBpdHNlbGYKKwkJICogdmFyaWFibGUtbGVuZ3RoLiAgInMiIHBvaW50cyB0byBhIGxpc3Qgb2Ygc3RhdGVtZW50cworCQkgKiB0aGF0IHB1dCB0aGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCBpbnRvCisJCSAqIHRoZSBYIHJlZ2lzdGVyLgorCQkgKgorCQkgKiBUaGUgNCooW2tdJjB4ZikgYWRkcmVzc2luZyBtb2RlIGNhbid0IGJlIHVzZWQsIGFzIHdlCisJCSAqIGRvbid0IGhhdmUgYSBjb25zdGFudCBvZmZzZXQsIHNvIHdlIGhhdmUgdG8gbG9hZCB0aGUKKwkJICogdmFsdWUgaW4gcXVlc3Rpb24gaW50byB0aGUgQSByZWdpc3RlciBhbmQgYWRkIHRvIGl0CisJCSAqIHRoZSB2YWx1ZSBmcm9tIHRoZSBYIHJlZ2lzdGVyLgorCQkgKi8KKwkJczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxCUEZfQik7CisJCXMyLT5zLmsgPSBvZmZfbmw7CisJCXNhcHBlbmQocywgczIpOworCQlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FORHxCUEZfSyk7CisJCXMyLT5zLmsgPSAweGY7CisJCXNhcHBlbmQocywgczIpOworCQlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0xTSHxCUEZfSyk7CisJCXMyLT5zLmsgPSAyOworCQlzYXBwZW5kKHMsIHMyKTsKKworCQkvKgorCQkgKiBUaGUgQSByZWdpc3RlciBub3cgY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUKKwkJICogSVAgaGVhZGVyLiAgV2UgbmVlZCB0byBhZGQgdG8gaXQgdGhlIG9mZnNldCBvZgorCQkgKiB0aGUgTUFDLWxheWVyIHBheWxvYWQsIHdoaWNoIGlzIHN0aWxsIGluIHRoZSBYCisJCSAqIHJlZ2lzdGVyLCBhbmQgbW92ZSB0aGUgcmVzdWx0IGludG8gdGhlIFggcmVnaXN0ZXIuCisJCSAqLworCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfWCkpOworCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGVyZSBpcyBubyB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHByZWNlZGluZyB0aGUKKwkJICogbGluay1sYXllciBoZWFkZXIsIGFuZCB0aGUgbGluay1sYXllciBoZWFkZXIgaXMKKwkJICogZml4ZWQtbGVuZ3RoOyBsb2FkIHRoZSBsZW5ndGggb2YgdGhlIElQdjQgaGVhZGVyLAorCQkgKiB3aGljaCBpcyBhdCBhbiBvZmZzZXQgb2Ygb2ZmX25sIGZyb20gdGhlIGJlZ2lubmluZworCQkgKiBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQsIGFuZCB0aHVzIGF0IGFuIG9mZnNldAorCQkgKiBvZiBvZmZfbWFjX3BsICsgb2ZmX25sIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUKKwkJICogcmF3IHBhY2tldCBkYXRhLgorCQkgKi8KKwkJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01TSHxCUEZfQik7CisJCXMtPnMuayA9IG9mZl9tYWNwbCArIG9mZl9ubDsKKwl9CisJcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3VuY29uZChyc2Vuc2UpCisJaW50IHJzZW5zZTsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmI7CisJc3RydWN0IHNsaXN0ICpzOworCisJcyA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU1NKTsKKwlzLT5zLmsgPSAhcnNlbnNlOworCWIgPSBuZXdfYmxvY2soSk1QKEJQRl9KRVEpKTsKKwliLT5zdG10cyA9IHM7CisKKwlyZXR1cm4gYjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3RydWUoKQoreworCXJldHVybiBnZW5fdW5jb25kKDEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBibG9jayAqCitnZW5fZmFsc2UoKQoreworCXJldHVybiBnZW5fdW5jb25kKDApOworfQorCisvKgorICogQnl0ZS1zd2FwIGEgMzItYml0IG51bWJlci4KKyAqICgiaHRvbmwoKSIgb3IgIm50b2hsKCkiIHdvbid0IHdvcmsgLSB3ZSB3YW50IHRvIGJ5dGUtc3dhcCBldmVuIG9uCisgKiBiaWctZW5kaWFuIHBsYXRmb3Jtcy4pCisgKi8KKyNkZWZpbmUJU1dBUExPTkcoeSkgXAorKCgoKHkpJjB4ZmYpPDwyNCkgfCAoKCh5KSYweGZmMDApPDw4KSB8ICgoKHkpJjB4ZmYwMDAwKT4+OCkgfCAoKCh5KT4+MjQpJjB4ZmYpKQorCisvKgorICogR2VuZXJhdGUgY29kZSB0byBtYXRjaCBhIHBhcnRpY3VsYXIgcGFja2V0IHR5cGUuCisgKgorICogInByb3RvIiBpcyBhbiBFdGhlcm5ldCB0eXBlIHZhbHVlLCBpZiA+IEVUSEVSTVRVLCBvciBhbiBMTEMgU0FQCisgKiB2YWx1ZSwgaWYgPD0gRVRIRVJNVFUuICBXZSB1c2UgdGhhdCB0byBkZXRlcm1pbmUgd2hldGhlciB0bworICogbWF0Y2ggdGhlIHR5cGUvbGVuZ3RoIGZpZWxkIG9yIHRvIGNoZWNrIHRoZSB0eXBlL2xlbmd0aCBmaWVsZCBmb3IKKyAqIGEgdmFsdWUgPD0gRVRIRVJNVFUgdG8gc2VlIHdoZXRoZXIgaXQncyBhIHR5cGUgZmllbGQgYW5kIHRoZW4gZG8KKyAqIHRoZSBhcHByb3ByaWF0ZSB0ZXN0LgorICovCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9ldGhlcl9saW5rdHlwZShwcm90bykKKwlyZWdpc3RlciBpbnQgcHJvdG87Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxOworCisJc3dpdGNoIChwcm90bykgeworCisJY2FzZSBMTENTQVBfSVNPTlM6CisJY2FzZSBMTENTQVBfSVA6CisJY2FzZSBMTENTQVBfTkVUQkVVSToKKwkJLyoKKwkJICogT1NJIHByb3RvY29scyBhbmQgTmV0QkVVSSBhbHdheXMgdXNlIDgwMi4yIGVuY2Fwc3VsYXRpb24sCisJCSAqIHNvIHdlIGNoZWNrIHRoZSBEU0FQIGFuZCBTU0FQLgorCQkgKgorCQkgKiBMTENTQVBfSVAgY2hlY2tzIGZvciBJUC1vdmVyLTgwMi4yLCByYXRoZXIKKwkJICogdGhhbiBJUC1vdmVyLUV0aGVybmV0IG9yIElQLW92ZXItU05BUC4KKwkJICoKKwkJICogWFhYIC0gc2hvdWxkIHdlIGNoZWNrIGJvdGggdGhlIERTQVAgYW5kIHRoZQorCQkgKiBTU0FQLCBsaWtlIHRoaXMsIG9yIHNob3VsZCB3ZSBjaGVjayBqdXN0IHRoZQorCQkgKiBEU0FQLCBhcyB3ZSBkbyBmb3Igb3RoZXIgdHlwZXMgPD0gRVRIRVJNVFUKKwkJICogKGkuZS4sIG90aGVyIFNBUCB2YWx1ZXMpPworCQkgKi8KKwkJYjAgPSBnZW5fY21wX2d0KE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIEVUSEVSTVRVKTsKKwkJZ2VuX25vdChiMCk7CisJCWIxID0gZ2VuX2NtcChPUl9NQUNQTCwgMCwgQlBGX0gsIChicGZfaW50MzIpCisJCQkgICAgICgocHJvdG8gPDwgOCkgfCBwcm90bykpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgTExDU0FQX0lQWDoKKwkJLyoKKwkJICogQ2hlY2sgZm9yOworCQkgKgorCQkgKglFdGhlcm5ldF9JSSBmcmFtZXMsIHdoaWNoIGFyZSBFdGhlcm5ldAorCQkgKglmcmFtZXMgd2l0aCBhIGZyYW1lIHR5cGUgb2YgRVRIRVJUWVBFX0lQWDsKKwkJICoKKwkJICoJRXRoZXJuZXRfODAyLjMgZnJhbWVzLCB3aGljaCBhcmUgODAyLjMKKwkJICoJZnJhbWVzIChpLmUuLCB0aGUgdHlwZS9sZW5ndGggZmllbGQgaXMKKwkJICoJYSBsZW5ndGggZmllbGQsIDw9IEVUSEVSTVRVLCByYXRoZXIgdGhhbgorCQkgKglhIHR5cGUgZmllbGQpIHdpdGggdGhlIGZpcnN0IHR3byBieXRlcworCQkgKglhZnRlciB0aGUgRXRoZXJuZXQvODAyLjMgaGVhZGVyIGJlaW5nCisJCSAqCTB4RkZGRjsKKwkJICoKKwkJICoJRXRoZXJuZXRfODAyLjIgZnJhbWVzLCB3aGljaCBhcmUgODAyLjMKKwkJICoJZnJhbWVzIHdpdGggYW4gODAyLjIgTExDIGhlYWRlciBhbmQKKwkJICoJd2l0aCB0aGUgSVBYIExTQVAgYXMgdGhlIERTQVAgaW4gdGhlIExMQworCQkgKgloZWFkZXI7CisJCSAqCisJCSAqCUV0aGVybmV0X1NOQVAgZnJhbWVzLCB3aGljaCBhcmUgODAyLjMKKwkJICoJZnJhbWVzIHdpdGggYW4gTExDIGhlYWRlciBhbmQgYSBTTkFQCisJCSAqCWhlYWRlciBhbmQgd2l0aCBhbiBPVUkgb2YgMHgwMDAwMDAKKwkJICoJKGVuY2Fwc3VsYXRlZCBFdGhlcm5ldCkgYW5kIGEgcHJvdG9jb2wKKwkJICoJSUQgb2YgRVRIRVJUWVBFX0lQWCBpbiB0aGUgU05BUCBoZWFkZXIuCisJCSAqCisJCSAqIFhYWCAtIHNob3VsZCB3ZSBnZW5lcmF0ZSB0aGUgc2FtZSBjb2RlIGJvdGgKKwkJICogZm9yIHRlc3RzIGZvciBMTENTQVBfSVBYIGFuZCBmb3IgRVRIRVJUWVBFX0lQWD8KKwkJICovCisKKwkJLyoKKwkJICogVGhpcyBnZW5lcmF0ZXMgY29kZSB0byBjaGVjayBib3RoIGZvciB0aGUKKwkJICogSVBYIExTQVAgKEV0aGVybmV0XzgwMi4yKSBhbmQgZm9yIEV0aGVybmV0XzgwMi4zLgorCQkgKi8KKwkJYjAgPSBnZW5fY21wKE9SX01BQ1BMLCAwLCBCUEZfQiwgKGJwZl9pbnQzMilMTENTQVBfSVBYKTsKKwkJYjEgPSBnZW5fY21wKE9SX01BQ1BMLCAwLCBCUEZfSCwgKGJwZl9pbnQzMikweEZGRkYpOworCQlnZW5fb3IoYjAsIGIxKTsKKworCQkvKgorCQkgKiBOb3cgd2UgYWRkIGNvZGUgdG8gY2hlY2sgZm9yIFNOQVAgZnJhbWVzIHdpdGgKKwkJICogRVRIRVJUWVBFX0lQWCwgaS5lLiBFdGhlcm5ldF9TTkFQLgorCQkgKi8KKwkJYjAgPSBnZW5fc25hcCgweDAwMDAwMCwgRVRIRVJUWVBFX0lQWCk7CisJCWdlbl9vcihiMCwgYjEpOworCisJCS8qCisJCSAqIE5vdyB3ZSBnZW5lcmF0ZSBjb2RlIHRvIGNoZWNrIGZvciA4MDIuMworCQkgKiBmcmFtZXMgaW4gZ2VuZXJhbC4KKwkJICovCisJCWIwID0gZ2VuX2NtcF9ndChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILCBFVEhFUk1UVSk7CisJCWdlbl9ub3QoYjApOworCisJCS8qCisJCSAqIE5vdyBhZGQgdGhlIGNoZWNrIGZvciA4MDIuMyBmcmFtZXMgYmVmb3JlIHRoZQorCQkgKiBjaGVjayBmb3IgRXRoZXJuZXRfODAyLjIgYW5kIEV0aGVybmV0XzgwMi4zLAorCQkgKiBhcyB0aG9zZSBjaGVja3Mgc2hvdWxkIG9ubHkgYmUgZG9uZSBvbiA4MDIuMworCQkgKiBmcmFtZXMsIG5vdCBvbiBFdGhlcm5ldCBmcmFtZXMuCisJCSAqLworCQlnZW5fYW5kKGIwLCBiMSk7CisKKwkJLyoKKwkJICogTm93IGFkZCB0aGUgY2hlY2sgZm9yIEV0aGVybmV0X0lJIGZyYW1lcywgYW5kCisJCSAqIGRvIHRoYXQgYmVmb3JlIGNoZWNraW5nIGZvciB0aGUgb3RoZXIgZnJhbWUKKwkJICogdHlwZXMuCisJCSAqLworCQliMCA9IGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfSCwKKwkJICAgIChicGZfaW50MzIpRVRIRVJUWVBFX0lQWCk7CisJCWdlbl9vcihiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKKwljYXNlIEVUSEVSVFlQRV9BVEFMSzoKKwljYXNlIEVUSEVSVFlQRV9BQVJQOgorCQkvKgorCQkgKiBFdGhlclRhbGsgKEFwcGxlVGFsayBwcm90b2NvbHMgb24gRXRoZXJuZXQgbGluaworCQkgKiBsYXllcikgbWF5IHVzZSA4MDIuMiBlbmNhcHN1bGF0aW9uLgorCQkgKi8KKworCQkvKgorCQkgKiBDaGVjayBmb3IgODAyLjIgZW5jYXBzdWxhdGlvbiAoRXRoZXJUYWxrIHBoYXNlIDI/KTsKKwkJICogd2UgY2hlY2sgZm9yIGFuIEV0aGVybmV0IHR5cGUgZmllbGQgbGVzcyB0aGFuCisJCSAqIDE1MDAsIHdoaWNoIG1lYW5zIGl0J3MgYW4gODAyLjMgbGVuZ3RoIGZpZWxkLgorCQkgKi8KKwkJYjAgPSBnZW5fY21wX2d0KE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIEVUSEVSTVRVKTsKKwkJZ2VuX25vdChiMCk7CisKKwkJLyoKKwkJICogODAyLjItZW5jYXBzdWxhdGVkIEVUSEVSVFlQRV9BVEFMSyBwYWNrZXRzIGFyZQorCQkgKiBTTkFQIHBhY2tldHMgd2l0aCBhbiBvcmdhbml6YXRpb24gY29kZSBvZgorCQkgKiAweDA4MDAwNyAoQXBwbGUsIGZvciBBcHBsZXRhbGspIGFuZCBhIHByb3RvY29sCisJCSAqIHR5cGUgb2YgRVRIRVJUWVBFX0FUQUxLIChBcHBsZXRhbGspLgorCQkgKgorCQkgKiA4MDIuMi1lbmNhcHN1bGF0ZWQgRVRIRVJUWVBFX0FBUlAgcGFja2V0cyBhcmUKKwkJICogU05BUCBwYWNrZXRzIHdpdGggYW4gb3JnYW5pemF0aW9uIGNvZGUgb2YKKwkJICogMHgwMDAwMDAgKGVuY2Fwc3VsYXRlZCBFdGhlcm5ldCkgYW5kIGEgcHJvdG9jb2wKKwkJICogdHlwZSBvZiBFVEhFUlRZUEVfQUFSUCAoQXBwbGV0YWxrIEFSUCkuCisJCSAqLworCQlpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0FUQUxLKQorCQkJYjEgPSBnZW5fc25hcCgweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLKTsKKwkJZWxzZQkvKiBwcm90byA9PSBFVEhFUlRZUEVfQUFSUCAqLworCQkJYjEgPSBnZW5fc25hcCgweDAwMDAwMCwgRVRIRVJUWVBFX0FBUlApOworCQlnZW5fYW5kKGIwLCBiMSk7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIEV0aGVybmV0IGVuY2Fwc3VsYXRpb24gKEV0aGVydGFsaworCQkgKiBwaGFzZSAxPyk7IHdlIGp1c3QgY2hlY2sgZm9yIHRoZSBFdGhlcm5ldAorCQkgKiBwcm90b2NvbCB0eXBlLgorCQkgKi8KKwkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOworCisJCWdlbl9vcihiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKKwlkZWZhdWx0OgorCQlpZiAocHJvdG8gPD0gRVRIRVJNVFUpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGFuIExMQyBTQVAgdmFsdWUsIHNvIHRoZSBmcmFtZXMKKwkJCSAqIHRoYXQgbWF0Y2ggd291bGQgYmUgODAyLjIgZnJhbWVzLgorCQkJICogQ2hlY2sgdGhhdCB0aGUgZnJhbWUgaXMgYW4gODAyLjIgZnJhbWUKKwkJCSAqIChpLmUuLCB0aGF0IHRoZSBsZW5ndGgvdHlwZSBmaWVsZCBpcworCQkJICogYSBsZW5ndGggZmllbGQsIDw9IEVUSEVSTVRVKSBhbmQKKwkJCSAqIHRoZW4gY2hlY2sgdGhlIERTQVAuCisJCQkgKi8KKwkJCWIwID0gZ2VuX2NtcF9ndChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILCBFVEhFUk1UVSk7CisJCQlnZW5fbm90KGIwKTsKKwkJCWIxID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUgKyAyLCBCUEZfQiwKKwkJCSAgICAoYnBmX2ludDMyKXByb3RvKTsKKwkJCWdlbl9hbmQoYjAsIGIxKTsKKwkJCXJldHVybiBiMTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGFuIEV0aGVybmV0IHR5cGUsIHNvIGNvbXBhcmUKKwkJCSAqIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCB3aXRoIGl0IChpZgorCQkJICogdGhlIGZyYW1lIGlzIGFuIDgwMi4yIGZyYW1lLCB0aGUgbGVuZ3RoCisJCQkgKiBmaWVsZCB3aWxsIGJlIDw9IEVUSEVSTVRVLCBhbmQsIGFzCisJCQkgKiAicHJvdG8iIGlzID4gRVRIRVJNVFUsIHRoaXMgdGVzdAorCQkJICogd2lsbCBmYWlsIGFuZCB0aGUgZnJhbWUgd29uJ3QgbWF0Y2gsCisJCQkgKiB3aGljaCBpcyB3aGF0IHdlIHdhbnQpLgorCQkJICovCisJCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILAorCQkJICAgIChicGZfaW50MzIpcHJvdG8pOworCQl9CisJfQorfQorCisvKgorICogInByb3RvIiBpcyBhbiBFdGhlcm5ldCB0eXBlIHZhbHVlIGFuZCBmb3IgSVBORVQsIGlmIGl0IGlzIG5vdCBJUHY0CisgKiBvciBJUHY2IHRoZW4gd2UgaGF2ZSBhbiBlcnJvci4KKyAqLworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5faXBuZXRfbGlua3R5cGUocHJvdG8pCisJcmVnaXN0ZXIgaW50IHByb3RvOworeworCXN3aXRjaCAocHJvdG8pIHsKKworCWNhc2UgRVRIRVJUWVBFX0lQOgorCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9CLAorCQkgICAgKGJwZl9pbnQzMilJUEhfQUZfSU5FVCk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCXJldHVybiBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0IsCisJCSAgICAoYnBmX2ludDMyKUlQSF9BRl9JTkVUNik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBnZW5fZmFsc2UoKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGNvZGUgdG8gbWF0Y2ggYSBwYXJ0aWN1bGFyIHBhY2tldCB0eXBlLgorICoKKyAqICJwcm90byIgaXMgYW4gRXRoZXJuZXQgdHlwZSB2YWx1ZSwgaWYgPiBFVEhFUk1UVSwgb3IgYW4gTExDIFNBUAorICogdmFsdWUsIGlmIDw9IEVUSEVSTVRVLiAgV2UgdXNlIHRoYXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8KKyAqIG1hdGNoIHRoZSB0eXBlIGZpZWxkIG9yIHRvIGNoZWNrIHRoZSB0eXBlIGZpZWxkIGZvciB0aGUgc3BlY2lhbAorICogTElOVVhfU0xMX1BfODAyXzIgdmFsdWUgYW5kIHRoZW4gZG8gdGhlIGFwcHJvcHJpYXRlIHRlc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2xpbnV4X3NsbF9saW5rdHlwZShwcm90bykKKwlyZWdpc3RlciBpbnQgcHJvdG87Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxOworCisJc3dpdGNoIChwcm90bykgeworCisJY2FzZSBMTENTQVBfSVNPTlM6CisJY2FzZSBMTENTQVBfSVA6CisJY2FzZSBMTENTQVBfTkVUQkVVSToKKwkJLyoKKwkJICogT1NJIHByb3RvY29scyBhbmQgTmV0QkVVSSBhbHdheXMgdXNlIDgwMi4yIGVuY2Fwc3VsYXRpb24sCisJCSAqIHNvIHdlIGNoZWNrIHRoZSBEU0FQIGFuZCBTU0FQLgorCQkgKgorCQkgKiBMTENTQVBfSVAgY2hlY2tzIGZvciBJUC1vdmVyLTgwMi4yLCByYXRoZXIKKwkJICogdGhhbiBJUC1vdmVyLUV0aGVybmV0IG9yIElQLW92ZXItU05BUC4KKwkJICoKKwkJICogWFhYIC0gc2hvdWxkIHdlIGNoZWNrIGJvdGggdGhlIERTQVAgYW5kIHRoZQorCQkgKiBTU0FQLCBsaWtlIHRoaXMsIG9yIHNob3VsZCB3ZSBjaGVjayBqdXN0IHRoZQorCQkgKiBEU0FQLCBhcyB3ZSBkbyBmb3Igb3RoZXIgdHlwZXMgPD0gRVRIRVJNVFUKKwkJICogKGkuZS4sIG90aGVyIFNBUCB2YWx1ZXMpPworCQkgKi8KKwkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIExJTlVYX1NMTF9QXzgwMl8yKTsKKwkJYjEgPSBnZW5fY21wKE9SX01BQ1BMLCAwLCBCUEZfSCwgKGJwZl9pbnQzMikKKwkJCSAgICAgKChwcm90byA8PCA4KSB8IHByb3RvKSk7CisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworCisJY2FzZSBMTENTQVBfSVBYOgorCQkvKgorCQkgKglFdGhlcm5ldF9JSSBmcmFtZXMsIHdoaWNoIGFyZSBFdGhlcm5ldAorCQkgKglmcmFtZXMgd2l0aCBhIGZyYW1lIHR5cGUgb2YgRVRIRVJUWVBFX0lQWDsKKwkJICoKKwkJICoJRXRoZXJuZXRfODAyLjMgZnJhbWVzLCB3aGljaCBoYXZlIGEgZnJhbWUKKwkJICoJdHlwZSBvZiBMSU5VWF9TTExfUF84MDJfMzsKKwkJICoKKwkJICoJRXRoZXJuZXRfODAyLjIgZnJhbWVzLCB3aGljaCBhcmUgODAyLjMKKwkJICoJZnJhbWVzIHdpdGggYW4gODAyLjIgTExDIGhlYWRlciAoaS5lLCBoYXZlCisJCSAqCWEgZnJhbWUgdHlwZSBvZiBMSU5VWF9TTExfUF84MDJfMikgYW5kCisJCSAqCXdpdGggdGhlIElQWCBMU0FQIGFzIHRoZSBEU0FQIGluIHRoZSBMTEMKKwkJICoJaGVhZGVyOworCQkgKgorCQkgKglFdGhlcm5ldF9TTkFQIGZyYW1lcywgd2hpY2ggYXJlIDgwMi4zCisJCSAqCWZyYW1lcyB3aXRoIGFuIExMQyBoZWFkZXIgYW5kIGEgU05BUAorCQkgKgloZWFkZXIgYW5kIHdpdGggYW4gT1VJIG9mIDB4MDAwMDAwCisJCSAqCShlbmNhcHN1bGF0ZWQgRXRoZXJuZXQpIGFuZCBhIHByb3RvY29sCisJCSAqCUlEIG9mIEVUSEVSVFlQRV9JUFggaW4gdGhlIFNOQVAgaGVhZGVyLgorCQkgKgorCQkgKiBGaXJzdCwgZG8gdGhlIGNoZWNrcyBvbiBMSU5VWF9TTExfUF84MDJfMgorCQkgKiBmcmFtZXM7IGdlbmVyYXRlIHRoZSBjaGVjayBmb3IgZWl0aGVyCisJCSAqIEV0aGVybmV0XzgwMi4yIG9yIEV0aGVybmV0X1NOQVAgZnJhbWVzLCBhbmQKKwkJICogdGhlbiBwdXQgYSBjaGVjayBmb3IgTElOVVhfU0xMX1BfODAyXzIgZnJhbWVzCisJCSAqIGJlZm9yZSBpdC4KKwkJICovCisJCWIwID0gZ2VuX2NtcChPUl9NQUNQTCwgMCwgQlBGX0IsIChicGZfaW50MzIpTExDU0FQX0lQWCk7CisJCWIxID0gZ2VuX3NuYXAoMHgwMDAwMDAsIEVUSEVSVFlQRV9JUFgpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIExJTlVYX1NMTF9QXzgwMl8yKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCisJCS8qCisJCSAqIE5vdyBjaGVjayBmb3IgODAyLjMgZnJhbWVzIGFuZCBPUiB0aGF0IHdpdGgKKwkJICogdGhlIHByZXZpb3VzIHRlc3QuCisJCSAqLworCQliMCA9IGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfSCwgTElOVVhfU0xMX1BfODAyXzMpOworCQlnZW5fb3IoYjAsIGIxKTsKKworCQkvKgorCQkgKiBOb3cgYWRkIHRoZSBjaGVjayBmb3IgRXRoZXJuZXRfSUkgZnJhbWVzLCBhbmQKKwkJICogZG8gdGhhdCBiZWZvcmUgY2hlY2tpbmcgZm9yIHRoZSBvdGhlciBmcmFtZQorCQkgKiB0eXBlcy4KKwkJICovCisJCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILAorCQkgICAgKGJwZl9pbnQzMilFVEhFUlRZUEVfSVBYKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgRVRIRVJUWVBFX0FUQUxLOgorCWNhc2UgRVRIRVJUWVBFX0FBUlA6CisJCS8qCisJCSAqIEV0aGVyVGFsayAoQXBwbGVUYWxrIHByb3RvY29scyBvbiBFdGhlcm5ldCBsaW5rCisJCSAqIGxheWVyKSBtYXkgdXNlIDgwMi4yIGVuY2Fwc3VsYXRpb24uCisJCSAqLworCisJCS8qCisJCSAqIENoZWNrIGZvciA4MDIuMiBlbmNhcHN1bGF0aW9uIChFdGhlclRhbGsgcGhhc2UgMj8pOworCQkgKiB3ZSBjaGVjayBmb3IgdGhlIDgwMi4yIHByb3RvY29sIHR5cGUgaW4gdGhlCisJCSAqICJFdGhlcm5ldCB0eXBlIiBmaWVsZC4KKwkJICovCisJCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILCBMSU5VWF9TTExfUF84MDJfMik7CisKKwkJLyoKKwkJICogODAyLjItZW5jYXBzdWxhdGVkIEVUSEVSVFlQRV9BVEFMSyBwYWNrZXRzIGFyZQorCQkgKiBTTkFQIHBhY2tldHMgd2l0aCBhbiBvcmdhbml6YXRpb24gY29kZSBvZgorCQkgKiAweDA4MDAwNyAoQXBwbGUsIGZvciBBcHBsZXRhbGspIGFuZCBhIHByb3RvY29sCisJCSAqIHR5cGUgb2YgRVRIRVJUWVBFX0FUQUxLIChBcHBsZXRhbGspLgorCQkgKgorCQkgKiA4MDIuMi1lbmNhcHN1bGF0ZWQgRVRIRVJUWVBFX0FBUlAgcGFja2V0cyBhcmUKKwkJICogU05BUCBwYWNrZXRzIHdpdGggYW4gb3JnYW5pemF0aW9uIGNvZGUgb2YKKwkJICogMHgwMDAwMDAgKGVuY2Fwc3VsYXRlZCBFdGhlcm5ldCkgYW5kIGEgcHJvdG9jb2wKKwkJICogdHlwZSBvZiBFVEhFUlRZUEVfQUFSUCAoQXBwbGV0YWxrIEFSUCkuCisJCSAqLworCQlpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0FUQUxLKQorCQkJYjEgPSBnZW5fc25hcCgweDA4MDAwNywgRVRIRVJUWVBFX0FUQUxLKTsKKwkJZWxzZQkvKiBwcm90byA9PSBFVEhFUlRZUEVfQUFSUCAqLworCQkJYjEgPSBnZW5fc25hcCgweDAwMDAwMCwgRVRIRVJUWVBFX0FBUlApOworCQlnZW5fYW5kKGIwLCBiMSk7CisKKwkJLyoKKwkJICogQ2hlY2sgZm9yIEV0aGVybmV0IGVuY2Fwc3VsYXRpb24gKEV0aGVydGFsaworCQkgKiBwaGFzZSAxPyk7IHdlIGp1c3QgY2hlY2sgZm9yIHRoZSBFdGhlcm5ldAorCQkgKiBwcm90b2NvbCB0eXBlLgorCQkgKi8KKwkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOworCisJCWdlbl9vcihiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKKwlkZWZhdWx0OgorCQlpZiAocHJvdG8gPD0gRVRIRVJNVFUpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGFuIExMQyBTQVAgdmFsdWUsIHNvIHRoZSBmcmFtZXMKKwkJCSAqIHRoYXQgbWF0Y2ggd291bGQgYmUgODAyLjIgZnJhbWVzLgorCQkJICogQ2hlY2sgZm9yIHRoZSA4MDIuMiBwcm90b2NvbCB0eXBlCisJCQkgKiBpbiB0aGUgIkV0aGVybmV0IHR5cGUiIGZpZWxkLCBhbmQKKwkJCSAqIHRoZW4gY2hlY2sgdGhlIERTQVAuCisJCQkgKi8KKwkJCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILAorCQkJICAgIExJTlVYX1NMTF9QXzgwMl8yKTsKKwkJCWIxID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbWFjcGwsIEJQRl9CLAorCQkJICAgICAoYnBmX2ludDMyKXByb3RvKTsKKwkJCWdlbl9hbmQoYjAsIGIxKTsKKwkJCXJldHVybiBiMTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGFuIEV0aGVybmV0IHR5cGUsIHNvIGNvbXBhcmUKKwkJCSAqIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCB3aXRoIGl0IChpZgorCQkJICogdGhlIGZyYW1lIGlzIGFuIDgwMi4yIGZyYW1lLCB0aGUgbGVuZ3RoCisJCQkgKiBmaWVsZCB3aWxsIGJlIDw9IEVUSEVSTVRVLCBhbmQsIGFzCisJCQkgKiAicHJvdG8iIGlzID4gRVRIRVJNVFUsIHRoaXMgdGVzdAorCQkJICogd2lsbCBmYWlsIGFuZCB0aGUgZnJhbWUgd29uJ3QgbWF0Y2gsCisJCQkgKiB3aGljaCBpcyB3aGF0IHdlIHdhbnQpLgorCQkJICovCisJCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILAorCQkJICAgIChicGZfaW50MzIpcHJvdG8pOworCQl9CisJfQorfQorCitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9sb2FkX3ByaXNtX2xscHJlZml4bGVuKCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnMxLCAqczI7CisJc3RydWN0IHNsaXN0ICpzamVxX2F2c19jb29raWU7CisJc3RydWN0IHNsaXN0ICpzamNvbW1vbjsKKworCS8qCisJICogVGhpcyBjb2RlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGltaXplciwgYXMKKwkgKiB3ZSBhcmUgZ2VuZXJhdGluZyBqbXAgaW5zdHJ1Y3Rpb25zIHdpdGhpbiBhIG5vcm1hbAorCSAqIHNsaXN0IG9mIGluc3RydWN0aW9ucworCSAqLworCW5vX29wdGltaXplID0gMTsKKworCS8qCisJICogR2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSBsZW5ndGggb2YgdGhlIHJhZGlvIGhlYWRlciBpbnRvCisJICogdGhlIHJlZ2lzdGVyIGFzc2lnbmVkIHRvIGhvbGQgdGhhdCBsZW5ndGgsIGlmIG9uZSBoYXMgYmVlbgorCSAqIGFzc2lnbmVkLiAgKElmIG9uZSBoYXNuJ3QgYmVlbiBhc3NpZ25lZCwgbm8gY29kZSB3ZSd2ZQorCSAqIGdlbmVyYXRlZCB1c2VzIHRoYXQgcHJlZml4LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGFueQorCSAqIGNvZGUgdG8gbG9hZCBpdC4pCisJICoKKwkgKiBTb21lIExpbnV4IGRyaXZlcnMgdXNlIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gYnV0IHNvbWV0aW1lcworCSAqIG9yIGFsd2F5cyB1c2UgdGhlIEFWUyBoZWFkZXIgcmF0aGVyIHRoYW4gdGhlIFByaXNtIGhlYWRlci4KKwkgKiBXZSBsb2FkIGEgNC1ieXRlIGJpZy1lbmRpYW4gdmFsdWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKKwkgKiByYXcgcGFja2V0IGRhdGEsIGFuZCBzZWUgd2hldGhlciwgd2hlbiBtYXNrZWQgd2l0aCAweEZGRkZGMDAwLAorCSAqIGl0J3MgZXF1YWwgdG8gMHg4MDIxMTAwMC4gIElmIHNvLCB0aGF0IGluZGljYXRlcyB0aGF0IGl0J3MKKwkgKiBhbiBBVlMgaGVhZGVyICh0aGUgbWFza2VkLW91dCBiaXRzIGFyZSB0aGUgdmVyc2lvbiBudW1iZXIpLgorCSAqIE90aGVyd2lzZSwgaXQncyBhIFByaXNtIGhlYWRlci4KKwkgKgorCSAqIFhYWCAtIHRoZSBQcmlzbSBoZWFkZXIgaXMgYWxzbywgaW4gdGhlb3J5LCB2YXJpYWJsZS1sZW5ndGgsCisJICogYnV0IG5vIGtub3duIHNvZnR3YXJlIGdlbmVyYXRlcyBoZWFkZXJzIHRoYXQgYXJlbid0IDE0NAorCSAqIGJ5dGVzIGxvbmcuCisJICovCisJaWYgKHJlZ19vZmZfbGwgIT0gLTEpIHsKKwkJLyoKKwkJICogTG9hZCB0aGUgY29va2llLgorCQkgKi8KKwkJczEgPSBuZXdfc3RtdChCUEZfTER8QlBGX1d8QlBGX0FCUyk7CisJCXMxLT5zLmsgPSAwOworCisJCS8qCisJCSAqIEFORCBpdCB3aXRoIDB4RkZGRkYwMDAuCisJCSAqLworCQlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FORHxCUEZfSyk7CisJCXMyLT5zLmsgPSAweEZGRkZGMDAwOworCQlzYXBwZW5kKHMxLCBzMik7CisKKwkJLyoKKwkJICogQ29tcGFyZSB3aXRoIDB4ODAyMTEwMDAuCisJCSAqLworCQlzamVxX2F2c19jb29raWUgPSBuZXdfc3RtdChKTVAoQlBGX0pFUSkpOworCQlzamVxX2F2c19jb29raWUtPnMuayA9IDB4ODAyMTEwMDA7CisJCXNhcHBlbmQoczEsIHNqZXFfYXZzX2Nvb2tpZSk7CisKKwkJLyoKKwkJICogSWYgaXQncyBBVlM6CisJCSAqCisJCSAqIFRoZSA0IGJ5dGVzIGF0IGFuIG9mZnNldCBvZiA0IGZyb20gdGhlIGJlZ2lubmluZyBvZgorCQkgKiB0aGUgQVZTIGhlYWRlciBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgQVZTIGhlYWRlci4KKwkJICogVGhhdCBmaWVsZCBpcyBiaWctZW5kaWFuLgorCQkgKi8KKwkJczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX1d8QlBGX0FCUyk7CisJCXMyLT5zLmsgPSA0OworCQlzYXBwZW5kKHMxLCBzMik7CisJCXNqZXFfYXZzX2Nvb2tpZS0+cy5qdCA9IHMyOworCisJCS8qCisJCSAqIE5vdyBqdW1wIHRvIHRoZSBjb2RlIHRvIGFsbG9jYXRlIGEgcmVnaXN0ZXIKKwkJICogaW50byB3aGljaCB0byBzYXZlIHRoZSBoZWFkZXIgbGVuZ3RoIGFuZAorCQkgKiBzdG9yZSB0aGUgbGVuZ3RoIHRoZXJlLiAgKFRoZSAianVtcCBhbHdheXMiCisJCSAqIGluc3RydWN0aW9uIG5lZWRzIHRvIGhhdmUgdGhlIGsgZmllbGQgc2V0OworCQkgKiBpdCdzIGFkZGVkIHRvIHRoZSBQQywgc28sIGFzIHdlJ3JlIGp1bXBpbmcKKwkJICogb3ZlciBhIHNpbmdsZSBpbnN0cnVjdGlvbiwgaXQgc2hvdWxkIGJlIDEuKQorCQkgKi8KKwkJc2pjb21tb24gPSBuZXdfc3RtdChKTVAoQlBGX0pBKSk7CisJCXNqY29tbW9uLT5zLmsgPSAxOworCQlzYXBwZW5kKHMxLCBzamNvbW1vbik7CisKKwkJLyoKKwkJICogTm93IGZvciB0aGUgY29kZSB0aGF0IGhhbmRsZXMgdGhlIFByaXNtIGhlYWRlci4KKwkJICogSnVzdCBsb2FkIHRoZSBsZW5ndGggb2YgdGhlIFByaXNtIGhlYWRlciAoMTQ0KQorCQkgKiBpbnRvIHRoZSBBIHJlZ2lzdGVyLiAgSGF2ZSB0aGUgdGVzdCBmb3IgYW4gQVZTCisJCSAqIGhlYWRlciBicmFuY2ggaGVyZSBpZiB3ZSBkb24ndCBoYXZlIGFuIEFWUyBoZWFkZXIuCisJCSAqLworCQlzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfV3xCUEZfSU1NKTsKKwkJczItPnMuayA9IDE0NDsKKwkJc2FwcGVuZChzMSwgczIpOworCQlzamVxX2F2c19jb29raWUtPnMuamYgPSBzMjsKKworCQkvKgorCQkgKiBOb3cgYWxsb2NhdGUgYSByZWdpc3RlciB0byBob2xkIHRoYXQgdmFsdWUgYW5kIHN0b3JlCisJCSAqIGl0LiAgVGhlIGNvZGUgZm9yIHRoZSBBVlMgaGVhZGVyIHdpbGwganVtcCBoZXJlIGFmdGVyCisJCSAqIGxvYWRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgQVZTIGhlYWRlci4KKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKKwkJczItPnMuayA9IHJlZ19vZmZfbGw7CisJCXNhcHBlbmQoczEsIHMyKTsKKwkJc2pjb21tb24tPnMuamYgPSBzMjsKKworCQkvKgorCQkgKiBOb3cgbW92ZSBpdCBpbnRvIHRoZSBYIHJlZ2lzdGVyLgorCQkgKi8KKwkJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwkJc2FwcGVuZChzMSwgczIpOworCisJCXJldHVybiAoczEpOworCX0gZWxzZQorCQlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9sb2FkX2F2c19sbHByZWZpeGxlbigpCit7CisJc3RydWN0IHNsaXN0ICpzMSwgKnMyOworCisJLyoKKwkgKiBHZW5lcmF0ZSBjb2RlIHRvIGxvYWQgdGhlIGxlbmd0aCBvZiB0aGUgQVZTIGhlYWRlciBpbnRvCisJICogdGhlIHJlZ2lzdGVyIGFzc2lnbmVkIHRvIGhvbGQgdGhhdCBsZW5ndGgsIGlmIG9uZSBoYXMgYmVlbgorCSAqIGFzc2lnbmVkLiAgKElmIG9uZSBoYXNuJ3QgYmVlbiBhc3NpZ25lZCwgbm8gY29kZSB3ZSd2ZQorCSAqIGdlbmVyYXRlZCB1c2VzIHRoYXQgcHJlZml4LCBzbyB3ZSBkb24ndCBuZWVkIHRvIGdlbmVyYXRlIGFueQorCSAqIGNvZGUgdG8gbG9hZCBpdC4pCisJICovCisJaWYgKHJlZ19vZmZfbGwgIT0gLTEpIHsKKwkJLyoKKwkJICogVGhlIDQgYnl0ZXMgYXQgYW4gb2Zmc2V0IG9mIDQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisJCSAqIHRoZSBBVlMgaGVhZGVyIGFyZSB0aGUgbGVuZ3RoIG9mIHRoZSBBVlMgaGVhZGVyLgorCQkgKiBUaGF0IGZpZWxkIGlzIGJpZy1lbmRpYW4uCisJCSAqLworCQlzMSA9IG5ld19zdG10KEJQRl9MRHxCUEZfV3xCUEZfQUJTKTsKKwkJczEtPnMuayA9IDQ7CisKKwkJLyoKKwkJICogTm93IGFsbG9jYXRlIGEgcmVnaXN0ZXIgdG8gaG9sZCB0aGF0IHZhbHVlIGFuZCBzdG9yZQorCQkgKiBpdC4KKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKKwkJczItPnMuayA9IHJlZ19vZmZfbGw7CisJCXNhcHBlbmQoczEsIHMyKTsKKworCQkvKgorCQkgKiBOb3cgbW92ZSBpdCBpbnRvIHRoZSBYIHJlZ2lzdGVyLgorCQkgKi8KKwkJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwkJc2FwcGVuZChzMSwgczIpOworCisJCXJldHVybiAoczEpOworCX0gZWxzZQorCQlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9sb2FkX3JhZGlvdGFwX2xscHJlZml4bGVuKCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnMxLCAqczI7CisKKwkvKgorCSAqIEdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgbGVuZ3RoIG9mIHRoZSByYWRpb3RhcCBoZWFkZXIgaW50bworCSAqIHRoZSByZWdpc3RlciBhc3NpZ25lZCB0byBob2xkIHRoYXQgbGVuZ3RoLCBpZiBvbmUgaGFzIGJlZW4KKwkgKiBhc3NpZ25lZC4gIChJZiBvbmUgaGFzbid0IGJlZW4gYXNzaWduZWQsIG5vIGNvZGUgd2UndmUKKwkgKiBnZW5lcmF0ZWQgdXNlcyB0aGF0IHByZWZpeCwgc28gd2UgZG9uJ3QgbmVlZCB0byBnZW5lcmF0ZSBhbnkKKwkgKiBjb2RlIHRvIGxvYWQgaXQuKQorCSAqLworCWlmIChyZWdfb2ZmX2xsICE9IC0xKSB7CisJCS8qCisJCSAqIFRoZSAyIGJ5dGVzIGF0IG9mZnNldHMgb2YgMiBhbmQgMyBmcm9tIHRoZSBiZWdpbm5pbmcKKwkJICogb2YgdGhlIHJhZGlvdGFwIGhlYWRlciBhcmUgdGhlIGxlbmd0aCBvZiB0aGUgcmFkaW90YXAKKwkJICogaGVhZGVyOyB1bmZvcnR1bmF0ZWx5LCBpdCdzIGxpdHRsZS1lbmRpYW4sIHNvIHdlIGhhdmUKKwkJICogdG8gbG9hZCBpdCBhIGJ5dGUgYXQgYSB0aW1lIGFuZCBjb25zdHJ1Y3QgdGhlIHZhbHVlLgorCQkgKi8KKworCQkvKgorCQkgKiBMb2FkIHRoZSBoaWdoLW9yZGVyIGJ5dGUsIGF0IGFuIG9mZnNldCBvZiAzLCBzaGlmdCBpdAorCQkgKiBsZWZ0IGEgYnl0ZSwgYW5kIHB1dCB0aGUgcmVzdWx0IGluIHRoZSBYIHJlZ2lzdGVyLgorCQkgKi8KKwkJczEgPSBuZXdfc3RtdChCUEZfTER8QlBGX0J8QlBGX0FCUyk7CisJCXMxLT5zLmsgPSAzOworCQlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0xTSHxCUEZfSyk7CisJCXNhcHBlbmQoczEsIHMyKTsKKwkJczItPnMuayA9IDg7CisJCXMyID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJCXNhcHBlbmQoczEsIHMyKTsKKworCQkvKgorCQkgKiBMb2FkIHRoZSBuZXh0IGJ5dGUsIGF0IGFuIG9mZnNldCBvZiAyLCBhbmQgT1IgdGhlCisJCSAqIHZhbHVlIGZyb20gdGhlIFggcmVnaXN0ZXIgaW50byBpdC4KKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9CfEJQRl9BQlMpOworCQlzYXBwZW5kKHMxLCBzMik7CisJCXMyLT5zLmsgPSAyOworCQlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX09SfEJQRl9YKTsKKwkJc2FwcGVuZChzMSwgczIpOworCisJCS8qCisJCSAqIE5vdyBhbGxvY2F0ZSBhIHJlZ2lzdGVyIHRvIGhvbGQgdGhhdCB2YWx1ZSBhbmQgc3RvcmUKKwkJICogaXQuCisJCSAqLworCQlzMiA9IG5ld19zdG10KEJQRl9TVCk7CisJCXMyLT5zLmsgPSByZWdfb2ZmX2xsOworCQlzYXBwZW5kKHMxLCBzMik7CisKKwkJLyoKKwkJICogTm93IG1vdmUgaXQgaW50byB0aGUgWCByZWdpc3Rlci4KKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJCXNhcHBlbmQoczEsIHMyKTsKKworCQlyZXR1cm4gKHMxKTsKKwl9IGVsc2UKKwkJcmV0dXJuIChOVUxMKTsKK30KKworLyogCisgKiBBdCB0aGUgbW9tZW50IHdlIHRyZWF0IFBQSSBhcyBub3JtYWwgUmFkaW90YXAgZW5jb2RlZAorICogcGFja2V0cy4gVGhlIGRpZmZlcmVuY2UgaXMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzCisgKiB0aGUgY29kZSBhdCB0aGUgYmVnaW5uaW5nIHRvIGNvbXB1dGUgdGhlIGhlYWRlciBsZW5ndGguCisgKiBTaW5jZSB0aGlzIGNvZGUgZ2VuZXJhdG9yIG9mIFBQSSBzdXBwb3J0cyBiYXJlIDgwMi4xMQorICogZW5jYXBzdWxhdGlvbiBvbmx5IChpLmUuIHRoZSBlbmNhcHN1bGF0ZWQgRExUIHNob3VsZCBiZQorICogRExUX0lFRUU4MDJfMTEpIHdlIGdlbmVyYXRlIGNvZGUgdG8gY2hlY2sgZm9yIHRoaXMgdG9vOworICogdGhhdCdzIGRvbmUgaW4gZmluaXNoX3BhcnNlKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgorZ2VuX2xvYWRfcHBpX2xscHJlZml4bGVuKCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnMxLCAqczI7CisJCisJLyoKKwkgKiBHZW5lcmF0ZSBjb2RlIHRvIGxvYWQgdGhlIGxlbmd0aCBvZiB0aGUgcmFkaW90YXAgaGVhZGVyCisJICogaW50byB0aGUgcmVnaXN0ZXIgYXNzaWduZWQgdG8gaG9sZCB0aGF0IGxlbmd0aCwgaWYgb25lIGhhcworCSAqIGJlZW4gYXNzaWduZWQuCisJICovCisJaWYgKHJlZ19vZmZfbGwgIT0gLTEpIHsKKwkJLyoKKwkJICogVGhlIDIgYnl0ZXMgYXQgb2Zmc2V0cyBvZiAyIGFuZCAzIGZyb20gdGhlIGJlZ2lubmluZworCQkgKiBvZiB0aGUgcmFkaW90YXAgaGVhZGVyIGFyZSB0aGUgbGVuZ3RoIG9mIHRoZSByYWRpb3RhcAorCQkgKiBoZWFkZXI7IHVuZm9ydHVuYXRlbHksIGl0J3MgbGl0dGxlLWVuZGlhbiwgc28gd2UgaGF2ZQorCQkgKiB0byBsb2FkIGl0IGEgYnl0ZSBhdCBhIHRpbWUgYW5kIGNvbnN0cnVjdCB0aGUgdmFsdWUuCisJCSAqLworCisJCS8qCisJCSAqIExvYWQgdGhlIGhpZ2gtb3JkZXIgYnl0ZSwgYXQgYW4gb2Zmc2V0IG9mIDMsIHNoaWZ0IGl0CisJCSAqIGxlZnQgYSBieXRlLCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gdGhlIFggcmVnaXN0ZXIuCisJCSAqLworCQlzMSA9IG5ld19zdG10KEJQRl9MRHxCUEZfQnxCUEZfQUJTKTsKKwkJczEtPnMuayA9IDM7CisJCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfTFNIfEJQRl9LKTsKKwkJc2FwcGVuZChzMSwgczIpOworCQlzMi0+cy5rID0gODsKKwkJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwkJc2FwcGVuZChzMSwgczIpOworCisJCS8qCisJCSAqIExvYWQgdGhlIG5leHQgYnl0ZSwgYXQgYW4gb2Zmc2V0IG9mIDIsIGFuZCBPUiB0aGUKKwkJICogdmFsdWUgZnJvbSB0aGUgWCByZWdpc3RlciBpbnRvIGl0LgorCQkgKi8KKwkJczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX0J8QlBGX0FCUyk7CisJCXNhcHBlbmQoczEsIHMyKTsKKwkJczItPnMuayA9IDI7CisJCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfT1J8QlBGX1gpOworCQlzYXBwZW5kKHMxLCBzMik7CisKKwkJLyoKKwkJICogTm93IGFsbG9jYXRlIGEgcmVnaXN0ZXIgdG8gaG9sZCB0aGF0IHZhbHVlIGFuZCBzdG9yZQorCQkgKiBpdC4KKwkJICovCisJCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKKwkJczItPnMuayA9IHJlZ19vZmZfbGw7CisJCXNhcHBlbmQoczEsIHMyKTsKKworCQkvKgorCQkgKiBOb3cgbW92ZSBpdCBpbnRvIHRoZSBYIHJlZ2lzdGVyLgorCQkgKi8KKwkJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwkJc2FwcGVuZChzMSwgczIpOworCisJCXJldHVybiAoczEpOworCX0gZWxzZQorCQlyZXR1cm4gKE5VTEwpOworfQorCisvKgorICogTG9hZCBhIHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGFmdGVyIHRoZSA4MDIuMTEKKyAqIGhlYWRlciwgaS5lLiBMTENfU05BUC4KKyAqIFRoZSBsaW5rLWxheWVyIGhlYWRlciBkb2Vzbid0IG5lY2Vzc2FyaWx5IGJlZ2luIGF0IHRoZSBiZWdpbm5pbmcKKyAqIG9mIHRoZSBwYWNrZXQgZGF0YTsgdGhlcmUgbWlnaHQgYmUgYSB2YXJpYWJsZS1sZW5ndGggcHJlZml4IGNvbnRhaW5pbmcKKyAqIHJhZGlvIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9sb2FkXzgwMl8xMV9oZWFkZXJfbGVuKHN0cnVjdCBzbGlzdCAqcywgc3RydWN0IHNsaXN0ICpzbmV4dCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnMyOworCXN0cnVjdCBzbGlzdCAqc2pzZXRfZGF0YV9mcmFtZV8xOworCXN0cnVjdCBzbGlzdCAqc2pzZXRfZGF0YV9mcmFtZV8yOworCXN0cnVjdCBzbGlzdCAqc2pzZXRfcW9zOworCXN0cnVjdCBzbGlzdCAqc2pzZXRfcmFkaW90YXBfZmxhZ3M7CisJc3RydWN0IHNsaXN0ICpzanNldF9yYWRpb3RhcF90c2Z0OworCXN0cnVjdCBzbGlzdCAqc2pzZXRfdHNmdF9kYXRhcGFkLCAqc2pzZXRfbm90c2Z0X2RhdGFwYWQ7CisJc3RydWN0IHNsaXN0ICpzX3JvdW5kdXA7CisKKwlpZiAocmVnX29mZl9tYWNwbCA9PSAtMSkgeworCQkvKgorCQkgKiBObyByZWdpc3RlciBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGUgb2Zmc2V0IG9mCisJCSAqIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCwgd2hpY2ggbWVhbnMgbm9ib2R5IG5lZWRzCisJCSAqIGl0OyBkb24ndCBib3RoZXIgY29tcHV0aW5nIGl0IC0ganVzdCByZXR1cm4KKwkJICogd2hhdCB3ZSBhbHJlYWR5IGhhdmUuCisJCSAqLworCQlyZXR1cm4gKHMpOworCX0KKworCS8qCisJICogVGhpcyBjb2RlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG9wdGltaXplciwgYXMKKwkgKiB3ZSBhcmUgZ2VuZXJhdGluZyBqbXAgaW5zdHJ1Y3Rpb25zIHdpdGhpbiBhIG5vcm1hbAorCSAqIHNsaXN0IG9mIGluc3RydWN0aW9ucworCSAqLworCW5vX29wdGltaXplID0gMTsKKwkKKwkvKgorCSAqIElmICJzIiBpcyBub24tbnVsbCwgaXQgaGFzIGNvZGUgdG8gYXJyYW5nZSB0aGF0IHRoZSBYIHJlZ2lzdGVyCisJICogY29udGFpbnMgdGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4IHByZWNlZGluZyB0aGUgbGluay1sYXllcgorCSAqIGhlYWRlci4KKwkgKgorCSAqIE90aGVyd2lzZSwgdGhlIGxlbmd0aCBvZiB0aGUgcHJlZml4IHByZWNlZGluZyB0aGUgbGluay1sYXllcgorCSAqIGhlYWRlciBpcyAib2ZmX2xsIi4KKwkgKi8KKwlpZiAocyA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIG5vIHZhcmlhYmxlLWxlbmd0aCBoZWFkZXIgcHJlY2VkaW5nIHRoZQorCQkgKiBsaW5rLWxheWVyIGhlYWRlci4KKwkJICoKKwkJICogTG9hZCB0aGUgbGVuZ3RoIG9mIHRoZSBmaXhlZC1sZW5ndGggcHJlZml4IHByZWNlZGluZworCQkgKiB0aGUgbGluay1sYXllciBoZWFkZXIgKGlmIGFueSkgaW50byB0aGUgWCByZWdpc3RlciwKKwkJICogYW5kIHN0b3JlIGl0IGluIHRoZSByZWdfb2ZmX21hY3BsIHJlZ2lzdGVyLgorCQkgKiBUaGF0IGxlbmd0aCBpcyBvZmZfbGwuCisJCSAqLworCQlzID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfSU1NKTsKKwkJcy0+cy5rID0gb2ZmX2xsOworCX0KKworCS8qCisJICogVGhlIFggcmVnaXN0ZXIgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCSAqIGxpbmstbGF5ZXIgaGVhZGVyOyBhZGQgMjQsIHdoaWNoIGlzIHRoZSBtaW5pbXVtIGxlbmd0aAorCSAqIG9mIHRoZSBNQUMgaGVhZGVyIGZvciBhIGRhdGEgZnJhbWUsIHRvIHRoYXQsIGFuZCBzdG9yZSBpdAorCSAqIGluIHJlZ19vZmZfbWFjcGwsIGFuZCB0aGVuIGxvYWQgdGhlIEZyYW1lIENvbnRyb2wgZmllbGQsCisJICogd2hpY2ggaXMgYXQgdGhlIG9mZnNldCBpbiB0aGUgWCByZWdpc3Rlciwgd2l0aCBhbiBpbmRleGVkIGxvYWQuCisJICovCisJczIgPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVFhBKTsKKwlzYXBwZW5kKHMsIHMyKTsKKwlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfSyk7CisJczItPnMuayA9IDI0OworCXNhcHBlbmQocywgczIpOworCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKKwlzMi0+cy5rID0gcmVnX29mZl9tYWNwbDsKKwlzYXBwZW5kKHMsIHMyKTsKKworCXMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8QlBGX0IpOworCXMyLT5zLmsgPSAwOworCXNhcHBlbmQocywgczIpOworCisJLyoKKwkgKiBDaGVjayB0aGUgRnJhbWUgQ29udHJvbCBmaWVsZCB0byBzZWUgaWYgdGhpcyBpcyBhIGRhdGEgZnJhbWU7CisJICogYSBkYXRhIGZyYW1lIGhhcyB0aGUgMHgwOCBiaXQgKGIzKSBpbiB0aGF0IGZpZWxkIHNldCBhbmQgdGhlCisJICogMHgwNCBiaXQgKGIyKSBjbGVhci4KKwkgKi8KKwlzanNldF9kYXRhX2ZyYW1lXzEgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwlzanNldF9kYXRhX2ZyYW1lXzEtPnMuayA9IDB4MDg7CisJc2FwcGVuZChzLCBzanNldF9kYXRhX2ZyYW1lXzEpOworCQkKKwkvKgorCSAqIElmIGIzIGlzIHNldCwgdGVzdCBiMiwgb3RoZXJ3aXNlIGdvIHRvIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YKKwkgKiB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4KKwkgKi8KKwlzanNldF9kYXRhX2ZyYW1lXzEtPnMuanQgPSBzanNldF9kYXRhX2ZyYW1lXzIgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwlzanNldF9kYXRhX2ZyYW1lXzItPnMuayA9IDB4MDQ7CisJc2FwcGVuZChzLCBzanNldF9kYXRhX2ZyYW1lXzIpOworCXNqc2V0X2RhdGFfZnJhbWVfMS0+cy5qZiA9IHNuZXh0OworCisJLyoKKwkgKiBJZiBiMiBpcyBub3Qgc2V0LCB0aGlzIGlzIGEgZGF0YSBmcmFtZTsgdGVzdCB0aGUgUW9TIGJpdC4KKwkgKiBPdGhlcndpc2UsIGdvIHRvIHRoZSBmaXJzdCBzdGF0ZW1lbnQgb2YgdGhlIHJlc3Qgb2YgdGhlCisJICogcHJvZ3JhbS4KKwkgKi8KKwlzanNldF9kYXRhX2ZyYW1lXzItPnMuanQgPSBzbmV4dDsKKwlzanNldF9kYXRhX2ZyYW1lXzItPnMuamYgPSBzanNldF9xb3MgPSBuZXdfc3RtdChKTVAoQlBGX0pTRVQpKTsKKwlzanNldF9xb3MtPnMuayA9IDB4ODA7CS8qIFFvUyBiaXQgKi8KKwlzYXBwZW5kKHMsIHNqc2V0X3Fvcyk7CisJCQorCS8qCisJICogSWYgaXQncyBzZXQsIGFkZCAyIHRvIHJlZ19vZmZfbWFjcGwsIHRvIHNraXAgdGhlIFFvUworCSAqIGZpZWxkLgorCSAqIE90aGVyd2lzZSwgZ28gdG8gdGhlIGZpcnN0IHN0YXRlbWVudCBvZiB0aGUgcmVzdCBvZiB0aGUKKwkgKiBwcm9ncmFtLgorCSAqLworCXNqc2V0X3Fvcy0+cy5qdCA9IHMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9NRU0pOworCXMyLT5zLmsgPSByZWdfb2ZmX21hY3BsOworCXNhcHBlbmQocywgczIpOworCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9JTU0pOworCXMyLT5zLmsgPSAyOworCXNhcHBlbmQocywgczIpOworCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKKwlzMi0+cy5rID0gcmVnX29mZl9tYWNwbDsKKwlzYXBwZW5kKHMsIHMyKTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBhIHJhZGlvdGFwIGhlYWRlciwgbG9vayBhdCBpdCB0byBzZWUgd2hldGhlcgorCSAqIHRoZXJlJ3MgQXRoZXJvcyBwYWRkaW5nIGJldHdlZW4gdGhlIE1BQy1sYXllciBoZWFkZXIKKwkgKiBhbmQgdGhlIHBheWxvYWQuCisJICoKKwkgKiBOb3RlOiBhbGwgb2YgdGhlIGZpZWxkcyBpbiB0aGUgcmFkaW90YXAgaGVhZGVyIGFyZQorCSAqIGxpdHRsZS1lbmRpYW4sIHNvIHdlIGJ5dGUtc3dhcCBhbGwgb2YgdGhlIHZhbHVlcworCSAqIHdlIHRlc3QgYWdhaW5zdCwgYXMgdGhleSB3aWxsIGJlIGxvYWRlZCBhcyBiaWctZW5kaWFuCisJICogdmFsdWVzLgorCSAqLworCWlmIChsaW5rdHlwZSA9PSBETFRfSUVFRTgwMl8xMV9SQURJTykgeworCQkvKgorCQkgKiBJcyB0aGUgSUVFRTgwMjExX1JBRElPVEFQX0ZMQUdTIGJpdCAoMHgwMDAwMDAyKSBzZXQKKwkJICogaW4gdGhlIHByZXNlbmNlIGZsYWc/CisJCSAqLworCQlzanNldF9xb3MtPnMuamYgPSBzMiA9IG5ld19zdG10KEJQRl9MRHxCUEZfQUJTfEJQRl9XKTsKKwkJczItPnMuayA9IDQ7CisJCXNhcHBlbmQocywgczIpOworCisJCXNqc2V0X3JhZGlvdGFwX2ZsYWdzID0gbmV3X3N0bXQoSk1QKEJQRl9KU0VUKSk7CisJCXNqc2V0X3JhZGlvdGFwX2ZsYWdzLT5zLmsgPSBTV0FQTE9ORygweDAwMDAwMDAyKTsKKwkJc2FwcGVuZChzLCBzanNldF9yYWRpb3RhcF9mbGFncyk7CisKKwkJLyoKKwkJICogSWYgbm90LCBza2lwIGFsbCBvZiB0aGlzLgorCQkgKi8KKwkJc2pzZXRfcmFkaW90YXBfZmxhZ3MtPnMuamYgPSBzbmV4dDsKKworCQkvKgorCQkgKiBPdGhlcndpc2UsIGlzIHRoZSBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCBiaXQgc2V0PworCQkgKi8KKwkJc2pzZXRfcmFkaW90YXBfdHNmdCA9IHNqc2V0X3JhZGlvdGFwX2ZsYWdzLT5zLmp0ID0KKwkJICAgIG5ld19zdG10KEpNUChCUEZfSlNFVCkpOworCQlzanNldF9yYWRpb3RhcF90c2Z0LT5zLmsgPSBTV0FQTE9ORygweDAwMDAwMDAxKTsKKwkJc2FwcGVuZChzLCBzanNldF9yYWRpb3RhcF90c2Z0KTsKKworCQkvKgorCQkgKiBJZiBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCBpcyBzZXQsIHRoZSBmbGFncyBmaWVsZCBpcworCQkgKiBhdCBhbiBvZmZzZXQgb2YgMTYgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYXcgcGFja2V0CisJCSAqIGRhdGEgKDggYnl0ZXMgZm9yIHRoZSByYWRpb3RhcCBoZWFkZXIgYW5kIDggYnl0ZXMgZm9yCisJCSAqIHRoZSBUU0ZUIGZpZWxkKS4KKwkJICoKKwkJICogVGVzdCB3aGV0aGVyIHRoZSBJRUVFODAyMTFfUkFESU9UQVBfRl9EQVRBUEFEIGJpdCAoMHgyMCkKKwkJICogaXMgc2V0LgorCQkgKi8KKwkJc2pzZXRfcmFkaW90YXBfdHNmdC0+cy5qdCA9IHMyID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9BQlN8QlBGX0IpOworCQlzMi0+cy5rID0gMTY7CisJCXNhcHBlbmQocywgczIpOworCisJCXNqc2V0X3RzZnRfZGF0YXBhZCA9IG5ld19zdG10KEpNUChCUEZfSlNFVCkpOworCQlzanNldF90c2Z0X2RhdGFwYWQtPnMuayA9IDB4MjA7CisJCXNhcHBlbmQocywgc2pzZXRfdHNmdF9kYXRhcGFkKTsKKworCQkvKgorCQkgKiBJZiBJRUVFODAyMTFfUkFESU9UQVBfVFNGVCBpcyBub3Qgc2V0LCB0aGUgZmxhZ3MgZmllbGQgaXMKKwkJICogYXQgYW4gb2Zmc2V0IG9mIDggZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByYXcgcGFja2V0CisJCSAqIGRhdGEgKDggYnl0ZXMgZm9yIHRoZSByYWRpb3RhcCBoZWFkZXIpLgorCQkgKgorCQkgKiBUZXN0IHdoZXRoZXIgdGhlIElFRUU4MDIxMV9SQURJT1RBUF9GX0RBVEFQQUQgYml0ICgweDIwKQorCQkgKiBpcyBzZXQuCisJCSAqLworCQlzanNldF9yYWRpb3RhcF90c2Z0LT5zLmpmID0gczIgPSBuZXdfc3RtdChCUEZfTER8QlBGX0FCU3xCUEZfQik7CisJCXMyLT5zLmsgPSA4OworCQlzYXBwZW5kKHMsIHMyKTsKKworCQlzanNldF9ub3RzZnRfZGF0YXBhZCA9IG5ld19zdG10KEpNUChCUEZfSlNFVCkpOworCQlzanNldF9ub3RzZnRfZGF0YXBhZC0+cy5rID0gMHgyMDsKKwkJc2FwcGVuZChzLCBzanNldF9ub3RzZnRfZGF0YXBhZCk7CisKKwkJLyoKKwkJICogSW4gZWl0aGVyIGNhc2UsIGlmIElFRUU4MDIxMV9SQURJT1RBUF9GX0RBVEFQQUQgaXMKKwkJICogc2V0LCByb3VuZCB0aGUgbGVuZ3RoIG9mIHRoZSA4MDIuMTEgaGVhZGVyIHRvCisJCSAqIGEgbXVsdGlwbGUgb2YgNC4gIERvIHRoYXQgYnkgYWRkaW5nIDMgYW5kIHRoZW4KKwkJICogZGl2aWRpbmcgYnkgYW5kIG11bHRpcGx5aW5nIGJ5IDQsIHdoaWNoIHdlIGRvIGJ5CisJCSAqIEFORGluZyB3aXRoIH4zLgorCQkgKi8KKwkJc19yb3VuZHVwID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9NRU0pOworCQlzX3JvdW5kdXAtPnMuayA9IHJlZ19vZmZfbWFjcGw7CisJCXNhcHBlbmQocywgc19yb3VuZHVwKTsKKwkJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX0lNTSk7CisJCXMyLT5zLmsgPSAzOworCQlzYXBwZW5kKHMsIHMyKTsKKwkJczIgPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BTkR8QlBGX0lNTSk7CisJCXMyLT5zLmsgPSB+MzsKKwkJc2FwcGVuZChzLCBzMik7CisJCXMyID0gbmV3X3N0bXQoQlBGX1NUKTsKKwkJczItPnMuayA9IHJlZ19vZmZfbWFjcGw7CisJCXNhcHBlbmQocywgczIpOworCisJCXNqc2V0X3RzZnRfZGF0YXBhZC0+cy5qdCA9IHNfcm91bmR1cDsKKwkJc2pzZXRfdHNmdF9kYXRhcGFkLT5zLmpmID0gc25leHQ7CisJCXNqc2V0X25vdHNmdF9kYXRhcGFkLT5zLmp0ID0gc19yb3VuZHVwOworCQlzanNldF9ub3RzZnRfZGF0YXBhZC0+cy5qZiA9IHNuZXh0OworCX0gZWxzZQorCQlzanNldF9xb3MtPnMuamYgPSBzbmV4dDsKKworCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZAoraW5zZXJ0X2NvbXB1dGVfdmxvZmZzZXRzKGIpCisJc3RydWN0IGJsb2NrICpiOworeworCXN0cnVjdCBzbGlzdCAqczsKKworCS8qCisJICogRm9yIGxpbmstbGF5ZXIgdHlwZXMgdGhhdCBoYXZlIGEgdmFyaWFibGUtbGVuZ3RoIGhlYWRlcgorCSAqIHByZWNlZGluZyB0aGUgbGluay1sYXllciBoZWFkZXIsIGdlbmVyYXRlIGNvZGUgdG8gbG9hZAorCSAqIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGludG8gdGhlIHJlZ2lzdGVyCisJICogYXNzaWduZWQgdG8gdGhhdCBvZmZzZXQsIGlmIGFueS4KKwkgKi8KKwlzd2l0Y2ggKGxpbmt0eXBlKSB7CisKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CisJCXMgPSBnZW5fbG9hZF9wcmlzbV9sbHByZWZpeGxlbigpOworCQlicmVhazsKKworCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCQlzID0gZ2VuX2xvYWRfYXZzX2xscHJlZml4bGVuKCk7CisJCWJyZWFrOworCisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwkJcyA9IGdlbl9sb2FkX3JhZGlvdGFwX2xscHJlZml4bGVuKCk7CisJCWJyZWFrOworCisJY2FzZSBETFRfUFBJOgorCQlzID0gZ2VuX2xvYWRfcHBpX2xscHJlZml4bGVuKCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcyA9IE5VTEw7CisJCWJyZWFrOworCX0KKworCS8qCisJICogRm9yIGxpbmstbGF5ZXIgdHlwZXMgdGhhdCBoYXZlIGEgdmFyaWFibGUtbGVuZ3RoIGxpbmstbGF5ZXIKKwkgKiBoZWFkZXIsIGdlbmVyYXRlIGNvZGUgdG8gbG9hZCB0aGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIKKwkgKiBwYXlsb2FkIGludG8gdGhlIHJlZ2lzdGVyIGFzc2lnbmVkIHRvIHRoYXQgb2Zmc2V0LCBpZiBhbnkuCisJICovCisJc3dpdGNoIChsaW5rdHlwZSkgeworCisJY2FzZSBETFRfSUVFRTgwMl8xMToKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwljYXNlIERMVF9QUEk6CisJCXMgPSBnZW5fbG9hZF84MDJfMTFfaGVhZGVyX2xlbihzLCBiLT5zdG10cyk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBhbnkgb2Zmc2V0LWxvYWRpbmcgY29kZSwgYXBwZW5kIGFsbCB0aGUKKwkgKiBleGlzdGluZyBzdGF0ZW1lbnRzIGluIHRoZSBibG9jayB0byB0aG9zZSBzdGF0ZW1lbnRzLAorCSAqIGFuZCBtYWtlIHRoZSByZXN1bHRpbmcgbGlzdCB0aGUgbGlzdCBvZiBzdGF0ZW1lbnRzCisJICogZm9yIHRoZSBibG9jay4KKwkgKi8KKwlpZiAocyAhPSBOVUxMKSB7CisJCXNhcHBlbmQocywgYi0+c3RtdHMpOworCQliLT5zdG10cyA9IHM7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9wcGlfZGx0X2NoZWNrKHZvaWQpCit7CisJc3RydWN0IHNsaXN0ICpzX2xvYWRfZGx0OworCXN0cnVjdCBibG9jayAqYjsKKworCWlmIChsaW5rdHlwZSA9PSBETFRfUFBJKQorCXsKKwkJLyogQ3JlYXRlIHRoZSBzdGF0ZW1lbnRzIHRoYXQgY2hlY2sgZm9yIHRoZSBETFQKKwkJICovCisJCXNfbG9hZF9kbHQgPSBuZXdfc3RtdChCUEZfTER8QlBGX1d8QlBGX0FCUyk7CisJCXNfbG9hZF9kbHQtPnMuayA9IDQ7CisKKwkJYiA9IG5ld19ibG9jayhKTVAoQlBGX0pFUSkpOworCisJCWItPnN0bXRzID0gc19sb2FkX2RsdDsKKwkJYi0+cy5rID0gU1dBUExPTkcoRExUX0lFRUU4MDJfMTEpOworCX0KKwllbHNlCisJeworCQliID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gYjsKK30KKworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fcHJpc21fbGxwcmVmaXhsZW4odm9pZCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwlpZiAocmVnX29mZl9sbCA9PSAtMSkgeworCQkvKgorCQkgKiBXZSBoYXZlbid0IHlldCBhc3NpZ25lZCBhIHJlZ2lzdGVyIGZvciB0aGUgbGVuZ3RoCisJCSAqIG9mIHRoZSByYWRpbyBoZWFkZXI7IGFsbG9jYXRlIG9uZS4KKwkJICovCisJCXJlZ19vZmZfbGwgPSBhbGxvY19yZWcoKTsKKwl9CisKKwkvKgorCSAqIExvYWQgdGhlIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIHJhZGlvIGxlbmd0aAorCSAqIGludG8gdGhlIFggcmVnaXN0ZXIuCisJICovCisJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01FTSk7CisJcy0+cy5rID0gcmVnX29mZl9sbDsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fYXZzX2xscHJlZml4bGVuKHZvaWQpCit7CisJc3RydWN0IHNsaXN0ICpzOworCisJaWYgKHJlZ19vZmZfbGwgPT0gLTEpIHsKKwkJLyoKKwkJICogV2UgaGF2ZW4ndCB5ZXQgYXNzaWduZWQgYSByZWdpc3RlciBmb3IgdGhlIGxlbmd0aAorCQkgKiBvZiB0aGUgQVZTIGhlYWRlcjsgYWxsb2NhdGUgb25lLgorCQkgKi8KKwkJcmVnX29mZl9sbCA9IGFsbG9jX3JlZygpOworCX0KKworCS8qCisJICogTG9hZCB0aGUgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgQVZTIGxlbmd0aAorCSAqIGludG8gdGhlIFggcmVnaXN0ZXIuCisJICovCisJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01FTSk7CisJcy0+cy5rID0gcmVnX29mZl9sbDsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fcmFkaW90YXBfbGxwcmVmaXhsZW4odm9pZCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwlpZiAocmVnX29mZl9sbCA9PSAtMSkgeworCQkvKgorCQkgKiBXZSBoYXZlbid0IHlldCBhc3NpZ25lZCBhIHJlZ2lzdGVyIGZvciB0aGUgbGVuZ3RoCisJCSAqIG9mIHRoZSByYWRpb3RhcCBoZWFkZXI7IGFsbG9jYXRlIG9uZS4KKwkJICovCisJCXJlZ19vZmZfbGwgPSBhbGxvY19yZWcoKTsKKwl9CisKKwkvKgorCSAqIExvYWQgdGhlIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIHJhZGlvdGFwIGxlbmd0aAorCSAqIGludG8gdGhlIFggcmVnaXN0ZXIuCisJICovCisJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01FTSk7CisJcy0+cy5rID0gcmVnX29mZl9sbDsKKwlyZXR1cm4gczsKK30KKworLyogCisgKiBBdCB0aGUgbW9tZW50IHdlIHRyZWF0IFBQSSBhcyBub3JtYWwgUmFkaW90YXAgZW5jb2RlZAorICogcGFja2V0cy4gVGhlIGRpZmZlcmVuY2UgaXMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzCisgKiB0aGUgY29kZSBhdCB0aGUgYmVnaW5uaW5nIHRvIGNvbXB1dGUgdGhlIGhlYWRlciBsZW5ndGguCisgKiBTaW5jZSB0aGlzIGNvZGUgZ2VuZXJhdG9yIG9mIFBQSSBzdXBwb3J0cyBiYXJlIDgwMi4xMQorICogZW5jYXBzdWxhdGlvbiBvbmx5IChpLmUuIHRoZSBlbmNhcHN1bGF0ZWQgRExUIHNob3VsZCBiZQorICogRExUX0lFRUU4MDJfMTEpIHdlIGdlbmVyYXRlIGNvZGUgdG8gY2hlY2sgZm9yIHRoaXMgdG9vLgorICovCitzdGF0aWMgc3RydWN0IHNsaXN0ICoKK2dlbl9wcGlfbGxwcmVmaXhsZW4odm9pZCkKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwlpZiAocmVnX29mZl9sbCA9PSAtMSkgeworCQkvKgorCQkgKiBXZSBoYXZlbid0IHlldCBhc3NpZ25lZCBhIHJlZ2lzdGVyIGZvciB0aGUgbGVuZ3RoCisJCSAqIG9mIHRoZSByYWRpb3RhcCBoZWFkZXI7IGFsbG9jYXRlIG9uZS4KKwkJICovCisJCXJlZ19vZmZfbGwgPSBhbGxvY19yZWcoKTsKKwl9CisKKwkvKgorCSAqIExvYWQgdGhlIHJlZ2lzdGVyIGNvbnRhaW5pbmcgdGhlIFBQSSBsZW5ndGgKKwkgKiBpbnRvIHRoZSBYIHJlZ2lzdGVyLgorCSAqLworCXMgPSBuZXdfc3RtdChCUEZfTERYfEJQRl9NRU0pOworCXMtPnMuayA9IHJlZ19vZmZfbGw7CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBjb2RlIHRvIGNvbXB1dGUgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGxlbmd0aCwgaWYgbmVjZXNzYXJ5LAorICogcHV0dGluZyBpdCBpbnRvIHRoZSBYIHJlZ2lzdGVyLCBhbmQgdG8gcmV0dXJuIGVpdGhlciBhIHBvaW50ZXIgdG8gYQorICogInN0cnVjdCBzbGlzdCIgZm9yIHRoZSBsaXN0IG9mIHN0YXRlbWVudHMgaW4gdGhhdCBjb2RlLCBvciBOVUxMIGlmCisgKiBubyBjb2RlIGlzIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIHN0cnVjdCBzbGlzdCAqCitnZW5fbGxwcmVmaXhsZW4odm9pZCkKK3sKKwlzd2l0Y2ggKGxpbmt0eXBlKSB7CisKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CisJCXJldHVybiBnZW5fcHJpc21fbGxwcmVmaXhsZW4oKTsKKworCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCQlyZXR1cm4gZ2VuX2F2c19sbHByZWZpeGxlbigpOworCisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwkJcmV0dXJuIGdlbl9yYWRpb3RhcF9sbHByZWZpeGxlbigpOworCisJY2FzZSBETFRfUFBJOgorCQlyZXR1cm4gZ2VuX3BwaV9sbHByZWZpeGxlbigpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKgorICogR2VuZXJhdGUgY29kZSB0byBsb2FkIHRoZSByZWdpc3RlciBjb250YWluaW5nIHRoZSBvZmZzZXQgb2YgdGhlCisgKiBNQUMtbGF5ZXIgcGF5bG9hZCBpbnRvIHRoZSBYIHJlZ2lzdGVyOyBpZiBubyByZWdpc3RlciBmb3IgdGhhdCBvZmZzZXQKKyAqIGhhcyBiZWVuIGFsbG9jYXRlZCwgYWxsb2NhdGUgaXQgZmlyc3QuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2xpc3QgKgorZ2VuX29mZl9tYWNwbCh2b2lkKQoreworCXN0cnVjdCBzbGlzdCAqczsKKworCWlmIChvZmZfbWFjcGxfaXNfdmFyaWFibGUpIHsKKwkJaWYgKHJlZ19vZmZfbWFjcGwgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlbid0IHlldCBhc3NpZ25lZCBhIHJlZ2lzdGVyIGZvciB0aGUgb2Zmc2V0CisJCQkgKiBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQ7IGFsbG9jYXRlIG9uZS4KKwkJCSAqLworCQkJcmVnX29mZl9tYWNwbCA9IGFsbG9jX3JlZygpOworCQl9CisKKwkJLyoKKwkJICogTG9hZCB0aGUgcmVnaXN0ZXIgY29udGFpbmluZyB0aGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIKKwkJICogcGF5bG9hZCBpbnRvIHRoZSBYIHJlZ2lzdGVyLgorCQkgKi8KKwkJcyA9IG5ld19zdG10KEJQRl9MRFh8QlBGX01FTSk7CisJCXMtPnMuayA9IHJlZ19vZmZfbWFjcGw7CisJCXJldHVybiBzOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoYXQgb2Zmc2V0IGlzbid0IHZhcmlhYmxlLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisJCSAqIGdlbmVyYXRlIGFueSBjb2RlLgorCQkgKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKgorICogTWFwIGFuIEV0aGVybmV0IHR5cGUgdG8gdGhlIGVxdWl2YWxlbnQgUFBQIHR5cGUuCisgKi8KK3N0YXRpYyBpbnQKK2V0aGVydHlwZV90b19wcHB0eXBlKHByb3RvKQorCWludCBwcm90bzsKK3sKKwlzd2l0Y2ggKHByb3RvKSB7CisKKwljYXNlIEVUSEVSVFlQRV9JUDoKKwkJcHJvdG8gPSBQUFBfSVA7CisJCWJyZWFrOworCisjaWZkZWYgSU5FVDYKKwljYXNlIEVUSEVSVFlQRV9JUFY2OgorCQlwcm90byA9IFBQUF9JUFY2OworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBFVEhFUlRZUEVfRE46CisJCXByb3RvID0gUFBQX0RFQ05FVDsKKwkJYnJlYWs7CisKKwljYXNlIEVUSEVSVFlQRV9BVEFMSzoKKwkJcHJvdG8gPSBQUFBfQVBQTEU7CisJCWJyZWFrOworCisJY2FzZSBFVEhFUlRZUEVfTlM6CisJCXByb3RvID0gUFBQX05TOworCQlicmVhazsKKworCWNhc2UgTExDU0FQX0lTT05TOgorCQlwcm90byA9IFBQUF9PU0k7CisJCWJyZWFrOworCisJY2FzZSBMTENTQVBfODAyMUQ6CisJCS8qCisJCSAqIEknbSBhc3N1bWluZyB0aGUgIkJyaWRnaW5nIFBEVSJzIHRoYXQgZ28KKwkJICogb3ZlciBQUFAgYXJlIFNwYW5uaW5nIFRyZWUgUHJvdG9jb2wKKwkJICogQnJpZGdpbmcgUERVcy4KKwkJICovCisJCXByb3RvID0gUFBQX0JSUERVOworCQlicmVhazsKKworCWNhc2UgTExDU0FQX0lQWDoKKwkJcHJvdG8gPSBQUFBfSVBYOworCQlicmVhazsKKwl9CisJcmV0dXJuIChwcm90byk7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBjb2RlIHRvIG1hdGNoIGEgcGFydGljdWxhciBwYWNrZXQgdHlwZSBieSBtYXRjaGluZyB0aGUKKyAqIGxpbmstbGF5ZXIgdHlwZSBmaWVsZCBvciBmaWVsZHMgaW4gdGhlIDgwMi4yIExMQyBoZWFkZXIuCisgKgorICogInByb3RvIiBpcyBhbiBFdGhlcm5ldCB0eXBlIHZhbHVlLCBpZiA+IEVUSEVSTVRVLCBvciBhbiBMTEMgU0FQCisgKiB2YWx1ZSwgaWYgPD0gRVRIRVJNVFUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2xpbmt0eXBlKHByb3RvKQorCXJlZ2lzdGVyIGludCBwcm90bzsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICpiMjsKKworCS8qIGFyZSB3ZSBjaGVja2luZyBNUExTLWVuY2Fwc3VsYXRlZCBwYWNrZXRzPyAqLworCWlmIChsYWJlbF9zdGFja19kZXB0aCA+IDApIHsKKwkJc3dpdGNoIChwcm90bykgeworCQljYXNlIEVUSEVSVFlQRV9JUDoKKwkJY2FzZSBQUFBfSVA6CisJCQkvKiBGSVhNRSBhZGQgb3RoZXIgTDMgcHJvdG8gSURzICovCisJCQlyZXR1cm4gZ2VuX21wbHNfbGlua3R5cGUoUV9JUCk7IAorCisJCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCWNhc2UgUFBQX0lQVjY6CisJCQkvKiBGSVhNRSBhZGQgb3RoZXIgTDMgcHJvdG8gSURzICovCisJCQlyZXR1cm4gZ2VuX21wbHNfbGlua3R5cGUoUV9JUFY2KTsgCisKKwkJZGVmYXVsdDoKKwkJCWJwZl9lcnJvcigidW5zdXBwb3J0ZWQgcHJvdG9jb2wgb3ZlciBtcGxzIik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisKKwkvKgorCSAqIEFyZSB3ZSB0ZXN0aW5nIFBQUG9FIHBhY2tldHM/CisJICovCisJaWYgKGlzX3BwcG9lcykgeworCQkvKgorCQkgKiBUaGUgUFBQb0Ugc2Vzc2lvbiBoZWFkZXIgaXMgcGFydCBvZiB0aGUKKwkJICogTUFDLWxheWVyIHBheWxvYWQsIHNvIGFsbCByZWZlcmVuY2VzCisJCSAqIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCisJCSAqIHRoYXQgcGF5bG9hZC4KKwkJICovCisKKwkJLyoKKwkJICogV2UgdXNlIEV0aGVybmV0IHByb3RvY29sIHR5cGVzIGluc2lkZSBsaWJwY2FwOworCQkgKiBtYXAgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBQUFAgcHJvdG9jb2wgdHlwZXMuCisJCSAqLworCQlwcm90byA9IGV0aGVydHlwZV90b19wcHB0eXBlKHByb3RvKTsKKwkJcmV0dXJuIGdlbl9jbXAoT1JfTUFDUEwsIG9mZl9saW5rdHlwZSwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOworCX0KKworCXN3aXRjaCAobGlua3R5cGUpIHsKKworCWNhc2UgRExUX0VOMTBNQjoKKwljYXNlIERMVF9ORVRBTkFMWVpFUjoKKwljYXNlIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVDoKKwkJcmV0dXJuIGdlbl9ldGhlcl9saW5rdHlwZShwcm90byk7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfQ19IRExDOgorCQlzd2l0Y2ggKHByb3RvKSB7CisKKwkJY2FzZSBMTENTQVBfSVNPTlM6CisJCQlwcm90byA9IChwcm90byA8PCA4IHwgTExDU0FQX0lTT05TKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILAorCQkJICAgIChicGZfaW50MzIpcHJvdG8pOworCQkJLypOT1RSRUFDSEVEKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBETFRfSUVFRTgwMl8xMToKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwljYXNlIERMVF9QUEk6CisJCS8qCisJCSAqIENoZWNrIHRoYXQgd2UgaGF2ZSBhIGRhdGEgZnJhbWUuCisJCSAqLworCQliMCA9IGdlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZSgpOworCisJCS8qCisJCSAqIE5vdyBjaGVjayBmb3IgdGhlIHNwZWNpZmllZCBsaW5rLWxheWVyIHR5cGUuCisJCSAqLworCQliMSA9IGdlbl9sbGNfbGlua3R5cGUocHJvdG8pOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKwkJLypOT1RSRUFDSEVEKi8KKwkJYnJlYWs7CisKKwljYXNlIERMVF9GRERJOgorCQkvKgorCQkgKiBYWFggLSBjaGVjayBmb3IgYXN5bmNocm9ub3VzIGZyYW1lcywgYXMgcGVyIFJGQyAxMTAzLgorCQkgKi8KKwkJcmV0dXJuIGdlbl9sbGNfbGlua3R5cGUocHJvdG8pOworCQkvKk5PVFJFQUNIRUQqLworCQlicmVhazsKKworCWNhc2UgRExUX0lFRUU4MDI6CisJCS8qCisJCSAqIFhYWCAtIGNoZWNrIGZvciBMTEMgUERVcywgYXMgcGVyIElFRUUgODAyLjUuCisJCSAqLworCQlyZXR1cm4gZ2VuX2xsY19saW5rdHlwZShwcm90byk7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfQVRNX1JGQzE0ODM6CisJY2FzZSBETFRfQVRNX0NMSVA6CisJY2FzZSBETFRfSVBfT1ZFUl9GQzoKKwkJcmV0dXJuIGdlbl9sbGNfbGlua3R5cGUocHJvdG8pOworCQkvKk5PVFJFQUNIRUQqLworCQlicmVhazsKKworCWNhc2UgRExUX1NVTkFUTToKKwkJLyoKKwkJICogSWYgImlzX2xhbmUiIGlzIHNldCwgY2hlY2sgZm9yIGEgTEFORS1lbmNhcHN1bGF0ZWQKKwkJICogdmVyc2lvbiBvZiB0aGlzIHByb3RvY29sLCBvdGhlcndpc2UgY2hlY2sgZm9yIGFuCisJCSAqIExMQy1lbmNhcHN1bGF0ZWQgdmVyc2lvbiBvZiB0aGlzIHByb3RvY29sLgorCQkgKgorCQkgKiBXZSBhc3N1bWUgTEFORSBtZWFucyBFdGhlcm5ldCwgbm90IFRva2VuIFJpbmcuCisJCSAqLworCQlpZiAoaXNfbGFuZSkgeworCQkJLyoKKwkJCSAqIENoZWNrIHRoYXQgdGhlIHBhY2tldCBkb2Vzbid0IGJlZ2luIHdpdGggYW4KKwkJCSAqIExFIENvbnRyb2wgbWFya2VyLiAgKFdlJ3ZlIGFscmVhZHkgZ2VuZXJhdGVkCisJCQkgKiBhIHRlc3QgZm9yIExBTkUuKQorCQkJICovCisJCQliMCA9IGdlbl9jbXAoT1JfTElOSywgU1VOQVRNX1BLVF9CRUdJTl9QT1MsIEJQRl9ILAorCQkJICAgIDB4RkYwMCk7CisJCQlnZW5fbm90KGIwKTsKKworCQkJLyoKKwkJCSAqIE5vdyBnZW5lcmF0ZSBhbiBFdGhlcm5ldCB0ZXN0LgorCQkJICovCisJCQliMSA9IGdlbl9ldGhlcl9saW5rdHlwZShwcm90byk7CisJCQlnZW5fYW5kKGIwLCBiMSk7CisJCQlyZXR1cm4gYjE7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogQ2hlY2sgZm9yIExMQyBlbmNhcHN1bGF0aW9uIGFuZCB0aGVuIGNoZWNrIHRoZQorCQkJICogcHJvdG9jb2wuCisJCQkgKi8KKwkJCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9QUk9UT1RZUEUsIFBUX0xMQywgQlBGX0pFUSwgMCk7CisJCQliMSA9IGdlbl9sbGNfbGlua3R5cGUocHJvdG8pOworCQkJZ2VuX2FuZChiMCwgYjEpOworCQkJcmV0dXJuIGIxOworCQl9CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfTElOVVhfU0xMOgorCQlyZXR1cm4gZ2VuX2xpbnV4X3NsbF9saW5rdHlwZShwcm90byk7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfU0xJUDoKKwljYXNlIERMVF9TTElQX0JTRE9TOgorCWNhc2UgRExUX1JBVzoKKwkJLyoKKwkJICogVGhlc2UgdHlwZXMgZG9uJ3QgcHJvdmlkZSBhbnkgdHlwZSBmaWVsZDsgcGFja2V0cworCQkgKiBhcmUgYWx3YXlzIElQdjQgb3IgSVB2Ni4KKwkJICoKKwkJICogWFhYIC0gZm9yIElQdjQsIGNoZWNrIGZvciBhIHZlcnNpb24gbnVtYmVyIG9mIDQsIGFuZCwKKwkJICogZm9yIElQdjYsIGNoZWNrIGZvciBhIHZlcnNpb24gbnVtYmVyIG9mIDY/CisJCSAqLworCQlzd2l0Y2ggKHByb3RvKSB7CisKKwkJY2FzZSBFVEhFUlRZUEVfSVA6CisJCQkvKiBDaGVjayBmb3IgYSB2ZXJzaW9uIG51bWJlciBvZiA0LiAqLworCQkJcmV0dXJuIGdlbl9tY21wKE9SX0xJTkssIDAsIEJQRl9CLCAweDQwLCAweEYwKTsKKyNpZmRlZiBJTkVUNgorCQljYXNlIEVUSEVSVFlQRV9JUFY2OgorCQkJLyogQ2hlY2sgZm9yIGEgdmVyc2lvbiBudW1iZXIgb2YgNi4gKi8KKwkJCXJldHVybiBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfQiwgMHg2MCwgMHhGMCk7CisjZW5kaWYKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGdlbl9mYWxzZSgpOwkJLyogYWx3YXlzIGZhbHNlICovCisJCX0KKwkJLypOT1RSRUFDSEVEKi8KKwkJYnJlYWs7CisKKwljYXNlIERMVF9JUFY0OgorCQkvKgorCQkgKiBSYXcgSVB2NCwgc28gbm8gdHlwZSBmaWVsZC4KKwkJICovCisJCWlmIChwcm90byA9PSBFVEhFUlRZUEVfSVApCisJCQlyZXR1cm4gZ2VuX3RydWUoKTsJCS8qIGFsd2F5cyB0cnVlICovCisKKwkJLyogQ2hlY2tpbmcgZm9yIHNvbWV0aGluZyBvdGhlciB0aGFuIElQdjQ7IGFsd2F5cyBmYWxzZSAqLworCQlyZXR1cm4gZ2VuX2ZhbHNlKCk7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfSVBWNjoKKwkJLyoKKwkJICogUmF3IElQdjYsIHNvIG5vIHR5cGUgZmllbGQuCisJCSAqLworI2lmZGVmIElORVQ2CisJCWlmIChwcm90byA9PSBFVEhFUlRZUEVfSVBWNikKKwkJCXJldHVybiBnZW5fdHJ1ZSgpOwkJLyogYWx3YXlzIHRydWUgKi8KKyNlbmRpZgorCisJCS8qIENoZWNraW5nIGZvciBzb21ldGhpbmcgb3RoZXIgdGhhbiBJUHY2OyBhbHdheXMgZmFsc2UgKi8KKwkJcmV0dXJuIGdlbl9mYWxzZSgpOworCQkvKk5PVFJFQUNIRUQqLworCQlicmVhazsKKworCWNhc2UgRExUX1BQUDoKKwljYXNlIERMVF9QUFBfUFBQRDoKKwljYXNlIERMVF9QUFBfU0VSSUFMOgorCWNhc2UgRExUX1BQUF9FVEhFUjoKKwkJLyoKKwkJICogV2UgdXNlIEV0aGVybmV0IHByb3RvY29sIHR5cGVzIGluc2lkZSBsaWJwY2FwOworCQkgKiBtYXAgdGhlbSB0byB0aGUgY29ycmVzcG9uZGluZyBQUFAgcHJvdG9jb2wgdHlwZXMuCisJCSAqLworCQlwcm90byA9IGV0aGVydHlwZV90b19wcHB0eXBlKHByb3RvKTsKKwkJcmV0dXJuIGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfSCwgKGJwZl9pbnQzMilwcm90byk7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfUFBQX0JTRE9TOgorCQkvKgorCQkgKiBXZSB1c2UgRXRoZXJuZXQgcHJvdG9jb2wgdHlwZXMgaW5zaWRlIGxpYnBjYXA7CisJCSAqIG1hcCB0aGVtIHRvIHRoZSBjb3JyZXNwb25kaW5nIFBQUCBwcm90b2NvbCB0eXBlcy4KKwkJICovCisJCXN3aXRjaCAocHJvdG8pIHsKKworCQljYXNlIEVUSEVSVFlQRV9JUDoKKwkJCS8qCisJCQkgKiBBbHNvIGNoZWNrIGZvciBWYW4gSmFjb2Jzb24tY29tcHJlc3NlZCBJUC4KKwkJCSAqIFhYWCAtIGRvIHRoaXMgZm9yIG90aGVyIGZvcm1zIG9mIFBQUD8KKwkJCSAqLworCQkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIFBQUF9JUCk7CisJCQliMSA9IGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfSCwgUFBQX1ZKQyk7CisJCQlnZW5fb3IoYjAsIGIxKTsKKwkJCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILCBQUFBfVkpOQyk7CisJCQlnZW5fb3IoYjEsIGIwKTsKKwkJCXJldHVybiBiMDsKKworCQlkZWZhdWx0OgorCQkJcHJvdG8gPSBldGhlcnR5cGVfdG9fcHBwdHlwZShwcm90byk7CisJCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9ILAorCQkJCShicGZfaW50MzIpcHJvdG8pOworCQl9CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfTlVMTDoKKwljYXNlIERMVF9MT09QOgorCWNhc2UgRExUX0VOQzoKKwkJLyoKKwkJICogRm9yIERMVF9OVUxMLCB0aGUgbGluay1sYXllciBoZWFkZXIgaXMgYSAzMi1iaXQKKwkJICogd29yZCBjb250YWluaW5nIGFuIEFGXyB2YWx1ZSBpbiAqaG9zdCogYnl0ZSBvcmRlciwKKwkJICogYW5kIGZvciBETFRfRU5DLCB0aGUgbGluay1sYXllciBoZWFkZXIgYmVnaW5zCisJCSAqIHdpdGggYSAzMi1iaXQgd29yayBjb250YWluaW5nIGFuIEFGXyB2YWx1ZSBpbgorCQkgKiBob3N0IGJ5dGUgb3JkZXIuCisJCSAqCisJCSAqIEluIGFkZGl0aW9uLCBpZiB3ZSdyZSByZWFkaW5nIGEgc2F2ZWQgY2FwdHVyZSBmaWxlLAorCQkgKiB0aGUgaG9zdCBieXRlIG9yZGVyIGluIHRoZSBjYXB0dXJlIG1heSBub3QgYmUgdGhlCisJCSAqIHNhbWUgYXMgdGhlIGhvc3QgYnl0ZSBvcmRlciBvbiB0aGlzIG1hY2hpbmUuCisJCSAqCisJCSAqIEZvciBETFRfTE9PUCwgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGlzIGEgMzItYml0CisJCSAqIHdvcmQgY29udGFpbmluZyBhbiBBRl8gdmFsdWUgaW4gKm5ldHdvcmsqIGJ5dGUgb3JkZXIuCisJCSAqCisJCSAqIFhYWCAtIEFGXyB2YWx1ZXMgbWF5LCB1bmZvcnR1bmF0ZWx5LCBiZSBwbGF0Zm9ybS0KKwkJICogZGVwZW5kZW50OyBmb3IgZXhhbXBsZSwgRnJlZUJTRCdzIEFGX0lORVQ2IGlzIDI0CisJCSAqIHdoaWxzdCBOZXRCU0QncyBhbmQgT3BlbkJTRCdzIGlzIDI2LgorCQkgKgorCQkgKiBUaGlzIG1lYW5zIHRoYXQsIHdoZW4gcmVhZGluZyBhIGNhcHR1cmUgZmlsZSwganVzdAorCQkgKiBjaGVja2luZyBmb3Igb3VyIEFGX0lORVQ2IHZhbHVlIHdvbid0IHdvcmsgaWYgdGhlCisJCSAqIGNhcHR1cmUgZmlsZSBjYW1lIGZyb20gYW5vdGhlciBPUy4KKwkJICovCisJCXN3aXRjaCAocHJvdG8pIHsKKworCQljYXNlIEVUSEVSVFlQRV9JUDoKKwkJCXByb3RvID0gQUZfSU5FVDsKKwkJCWJyZWFrOworCisjaWZkZWYgSU5FVDYKKwkJY2FzZSBFVEhFUlRZUEVfSVBWNjoKKwkJCXByb3RvID0gQUZfSU5FVDY7CisJCQlicmVhazsKKyNlbmRpZgorCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogTm90IGEgdHlwZSBvbiB3aGljaCB3ZSBzdXBwb3J0IGZpbHRlcmluZy4KKwkJCSAqIFhYWCAtIHN1cHBvcnQgdGhvc2UgdGhhdCBoYXZlIEFGXyB2YWx1ZXMKKwkJCSAqICNkZWZpbmVkIG9uIHRoaXMgcGxhdGZvcm0sIGF0IGxlYXN0PworCQkJICovCisJCQlyZXR1cm4gZ2VuX2ZhbHNlKCk7CisJCX0KKworCQlpZiAobGlua3R5cGUgPT0gRExUX05VTEwgfHwgbGlua3R5cGUgPT0gRExUX0VOQykgeworCQkJLyoKKwkJCSAqIFRoZSBBRl8gdmFsdWUgaXMgaW4gaG9zdCBieXRlIG9yZGVyLCBidXQKKwkJCSAqIHRoZSBCUEYgaW50ZXJwcmV0ZXIgd2lsbCBjb252ZXJ0IGl0IHRvCisJCQkgKiBuZXR3b3JrIGJ5dGUgb3JkZXIuCisJCQkgKgorCQkJICogSWYgdGhpcyBpcyBhIHNhdmUgZmlsZSwgYW5kIGl0J3MgZnJvbSBhCisJCQkgKiBtYWNoaW5lIHdpdGggdGhlIG9wcG9zaXRlIGJ5dGUgb3JkZXIgdG8KKwkJCSAqIG91cnMsIHdlIGJ5dGUtc3dhcCB0aGUgQUZfIHZhbHVlLgorCQkJICoKKwkJCSAqIFRoZW4gd2UgcnVuIGl0IHRocm91Z2ggImh0b25sKCkiLCBhbmQKKwkJCSAqIGdlbmVyYXRlIGNvZGUgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSByZXN1bHQuCisJCQkgKi8KKwkJCWlmIChicGZfcGNhcC0+c2YucmZpbGUgIT0gTlVMTCAmJgorCQkJICAgIGJwZl9wY2FwLT5zZi5zd2FwcGVkKQorCQkJCXByb3RvID0gU1dBUExPTkcocHJvdG8pOworCQkJcHJvdG8gPSBodG9ubChwcm90byk7CisJCX0KKwkJcmV0dXJuIChnZW5fY21wKE9SX0xJTkssIDAsIEJQRl9XLCAoYnBmX2ludDMyKXByb3RvKSk7CisKKyNpZmRlZiBIQVZFX05FVF9QRlZBUl9ICisJY2FzZSBETFRfUEZMT0c6CisJCS8qCisJCSAqIGFmIGZpZWxkIGlzIGhvc3QgYnl0ZSBvcmRlciBpbiBjb250cmFzdCB0byB0aGUgcmVzdCBvZgorCQkgKiB0aGUgcGFja2V0LgorCQkgKi8KKwkJaWYgKHByb3RvID09IEVUSEVSVFlQRV9JUCkKKwkJCXJldHVybiAoZ2VuX2NtcChPUl9MSU5LLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIGFmKSwKKwkJCSAgICBCUEZfQiwgKGJwZl9pbnQzMilBRl9JTkVUKSk7CisjaWZkZWYgSU5FVDYKKwkJZWxzZSBpZiAocHJvdG8gPT0gRVRIRVJUWVBFX0lQVjYpCisJCQlyZXR1cm4gKGdlbl9jbXAoT1JfTElOSywgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBhZiksCisJCQkgICAgQlBGX0IsIChicGZfaW50MzIpQUZfSU5FVDYpKTsKKyNlbmRpZiAvKiBJTkVUNiAqLworCQllbHNlCisJCQlyZXR1cm4gZ2VuX2ZhbHNlKCk7CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworI2VuZGlmIC8qIEhBVkVfTkVUX1BGVkFSX0ggKi8KKworCWNhc2UgRExUX0FSQ05FVDoKKwljYXNlIERMVF9BUkNORVRfTElOVVg6CisJCS8qCisJCSAqIFhYWCBzaG91bGQgd2UgY2hlY2sgZm9yIGZpcnN0IGZyYWdtZW50IGlmIHRoZSBwcm90b2NvbAorCQkgKiB1c2VzIFBIRFM/CisJCSAqLworCQlzd2l0Y2ggKHByb3RvKSB7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBnZW5fZmFsc2UoKTsKKworI2lmZGVmIElORVQ2CisJCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCQlyZXR1cm4gKGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfQiwKKwkJCQkoYnBmX2ludDMyKUFSQ1RZUEVfSU5FVDYpKTsKKyNlbmRpZiAvKiBJTkVUNiAqLworCisJCWNhc2UgRVRIRVJUWVBFX0lQOgorCQkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0IsCisJCQkJICAgICAoYnBmX2ludDMyKUFSQ1RZUEVfSVApOworCQkJYjEgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0IsCisJCQkJICAgICAoYnBmX2ludDMyKUFSQ1RZUEVfSVBfT0xEKTsKKwkJCWdlbl9vcihiMCwgYjEpOworCQkJcmV0dXJuIChiMSk7CisKKwkJY2FzZSBFVEhFUlRZUEVfQVJQOgorCQkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0IsCisJCQkJICAgICAoYnBmX2ludDMyKUFSQ1RZUEVfQVJQKTsKKwkJCWIxID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZfbGlua3R5cGUsIEJQRl9CLAorCQkJCSAgICAgKGJwZl9pbnQzMilBUkNUWVBFX0FSUF9PTEQpOworCQkJZ2VuX29yKGIwLCBiMSk7CisJCQlyZXR1cm4gKGIxKTsKKworCQljYXNlIEVUSEVSVFlQRV9SRVZBUlA6CisJCQlyZXR1cm4gKGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfQiwKKwkJCQkJKGJwZl9pbnQzMilBUkNUWVBFX1JFVkFSUCkpOworCisJCWNhc2UgRVRIRVJUWVBFX0FUQUxLOgorCQkJcmV0dXJuIChnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0IsCisJCQkJCShicGZfaW50MzIpQVJDVFlQRV9BVEFMSykpOworCQl9CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfTFRBTEs6CisJCXN3aXRjaCAocHJvdG8pIHsKKwkJY2FzZSBFVEhFUlRZUEVfQVRBTEs6CisJCQlyZXR1cm4gZ2VuX3RydWUoKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBnZW5fZmFsc2UoKTsKKwkJfQorCQkvKk5PVFJFQUNIRUQqLworCQlicmVhazsKKworCWNhc2UgRExUX0ZSRUxBWToKKwkJLyoKKwkJICogWFhYIC0gYXNzdW1lcyBhIDItYnl0ZSBGcmFtZSBSZWxheSBoZWFkZXIgd2l0aAorCQkgKiBETENJIGFuZCBmbGFncy4gIFdoYXQgaWYgdGhlIGFkZHJlc3MgaXMgbG9uZ2VyPworCQkgKi8KKwkJc3dpdGNoIChwcm90bykgeworCisJCWNhc2UgRVRIRVJUWVBFX0lQOgorCQkJLyoKKwkJCSAqIENoZWNrIGZvciB0aGUgc3BlY2lhbCBOTFBJRCBmb3IgSVAuCisJCQkgKi8KKwkJCXJldHVybiBnZW5fY21wKE9SX0xJTkssIDIsIEJQRl9ILCAoMHgwMzw8OCkgfCAweGNjKTsKKworI2lmZGVmIElORVQ2CisJCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJCQkvKgorCQkJICogQ2hlY2sgZm9yIHRoZSBzcGVjaWFsIE5MUElEIGZvciBJUHY2LgorCQkJICovCisJCQlyZXR1cm4gZ2VuX2NtcChPUl9MSU5LLCAyLCBCUEZfSCwgKDB4MDM8PDgpIHwgMHg4ZSk7CisjZW5kaWYKKworCQljYXNlIExMQ1NBUF9JU09OUzoKKwkJCS8qCisJCQkgKiBDaGVjayBmb3Igc2V2ZXJhbCBPU0kgcHJvdG9jb2xzLgorCQkJICoKKwkJCSAqIEZyYW1lIFJlbGF5IHBhY2tldHMgdHlwaWNhbGx5IGhhdmUgYW4gT1NJCisJCQkgKiBOTFBJRCBhdCB0aGUgYmVnaW5uaW5nOyB3ZSBjaGVjayBmb3IgZWFjaAorCQkJICogb2YgdGhlbS4KKwkJCSAqCisJCQkgKiBXaGF0IHdlIGNoZWNrIGZvciBpcyB0aGUgTkxQSUQgYW5kIGEgZnJhbWUKKwkJCSAqIGNvbnRyb2wgZmllbGQgb2YgVUksIGkuZS4gMHgwMyBmb2xsb3dlZAorCQkJICogYnkgdGhlIE5MUElELgorCQkJICovCisJCQliMCA9IGdlbl9jbXAoT1JfTElOSywgMiwgQlBGX0gsICgweDAzPDw4KSB8IElTTzg0NzNfQ0xOUCk7CisJCQliMSA9IGdlbl9jbXAoT1JfTElOSywgMiwgQlBGX0gsICgweDAzPDw4KSB8IElTTzk1NDJfRVNJUyk7CisJCQliMiA9IGdlbl9jbXAoT1JfTElOSywgMiwgQlBGX0gsICgweDAzPDw4KSB8IElTTzEwNTg5X0lTSVMpOworCQkJZ2VuX29yKGIxLCBiMik7CisJCQlnZW5fb3IoYjAsIGIyKTsKKwkJCXJldHVybiBiMjsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGdlbl9mYWxzZSgpOworCQl9CisJCS8qTk9UUkVBQ0hFRCovCisJCWJyZWFrOworCisJY2FzZSBETFRfTUZSOgorCQlicGZfZXJyb3IoIk11bHRpLWxpbmsgRnJhbWUgUmVsYXkgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworICAgICAgICBjYXNlIERMVF9KVU5JUEVSX01GUjoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9NTEZSOgorICAgICAgICBjYXNlIERMVF9KVU5JUEVSX01MUFBQOgorCWNhc2UgRExUX0pVTklQRVJfQVRNMToKKwljYXNlIERMVF9KVU5JUEVSX0FUTTI6CisJY2FzZSBETFRfSlVOSVBFUl9QUFBPRToKKwljYXNlIERMVF9KVU5JUEVSX1BQUE9FX0FUTToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9HR1NOOgorICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0VTOgorICAgICAgICBjYXNlIERMVF9KVU5JUEVSX01PTklUT1I6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfU0VSVklDRVM6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfRVRIRVI6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfUFBQOgorICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0ZSRUxBWToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9DSERMQzoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9WUDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9TVDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9JU006CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfVlM6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfU1JYX0UyRToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9GSUJSRUNIQU5ORUw6CisJY2FzZSBETFRfSlVOSVBFUl9BVE1fQ0VNSUM6CisKKwkJLyoganVzdCBsZXRzIHZlcmlmeSB0aGUgbWFnaWMgbnVtYmVyIGZvciBub3cgLQorCQkgKiBvbiBBVE0gd2UgbWF5IGhhdmUgdXAgdG8gNiBkaWZmZXJlbnQgZW5jYXBzdWxhdGlvbnMgb24gdGhlIHdpcmUKKwkJICogYW5kIG5lZWQgYSBsb3Qgb2YgaGV1cmlzdGljcyB0byBmaWd1cmUgb3V0IHRoYXQgdGhlIHBheWxvYWQKKwkJICogbWlnaHQgYmU7CisJCSAqCisJCSAqIEZJWE1FIGVuY2Fwc3VsYXRpb24gc3BlY2lmaWMgQlBGXyBmaWx0ZXJzCisJCSAqLworCQlyZXR1cm4gZ2VuX21jbXAoT1JfTElOSywgMCwgQlBGX1csIDB4NGQ0NzQzMDAsIDB4ZmZmZmZmMDApOyAvKiBjb21wYXJlIHRoZSBtYWdpYyBudW1iZXIgKi8KKworCWNhc2UgRExUX0lQTkVUOgorCQlyZXR1cm4gZ2VuX2lwbmV0X2xpbmt0eXBlKHByb3RvKTsKKworCWNhc2UgRExUX0xJTlVYX0lSREE6CisJCWJwZl9lcnJvcigiSXJEQSBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBETFRfRE9DU0lTOgorCQlicGZfZXJyb3IoIkRPQ1NJUyBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBETFRfTVRQMjoKKwljYXNlIERMVF9NVFAyX1dJVEhfUEhEUjoKKwkJYnBmX2Vycm9yKCJNVFAyIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9FUkY6CisJCWJwZl9lcnJvcigiRVJGIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9QRlNZTkM6CisJCWJwZl9lcnJvcigiUEZTWU5DIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9MSU5VWF9MQVBEOgorCQlicGZfZXJyb3IoIkxBUEQgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgRExUX1VTQjoKKwljYXNlIERMVF9VU0JfTElOVVg6CisJY2FzZSBETFRfVVNCX0xJTlVYX01NQVBQRUQ6CisJCWJwZl9lcnJvcigiVVNCIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9CTFVFVE9PVEhfSENJX0g0OgorCWNhc2UgRExUX0JMVUVUT09USF9IQ0lfSDRfV0lUSF9QSERSOgorCQlicGZfZXJyb3IoIkJsdWV0b290aCBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBETFRfQ0FOMjBCOgorCWNhc2UgRExUX0NBTl9TT0NLRVRDQU46CisJCWJwZl9lcnJvcigiQ0FOIGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9JRUVFODAyXzE1XzQ6CisJY2FzZSBETFRfSUVFRTgwMl8xNV80X0xJTlVYOgorCWNhc2UgRExUX0lFRUU4MDJfMTVfNF9OT05BU0tfUEhZOgorCWNhc2UgRExUX0lFRUU4MDJfMTVfNF9OT0ZDUzoKKwkJYnBmX2Vycm9yKCJJRUVFIDgwMi4xNS40IGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIERMVF9JRUVFODAyXzE2X01BQ19DUFNfUkFESU86CisJCWJwZl9lcnJvcigiSUVFRSA4MDIuMTYgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgRExUX1NJVEE6CisJCWJwZl9lcnJvcigiU0lUQSBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBETFRfUkFJRjE6CisJCWJwZl9lcnJvcigiUkFJRjEgbGluay1sYXllciB0eXBlIGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgRExUX0lQTUI6CisJCWJwZl9lcnJvcigiSVBNQiBsaW5rLWxheWVyIHR5cGUgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBETFRfQVgyNV9LSVNTOgorCQlicGZfZXJyb3IoIkFYLjI1IGxpbmstbGF5ZXIgdHlwZSBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisJfQorCisJLyoKKwkgKiBBbGwgdGhlIHR5cGVzIHRoYXQgaGF2ZSBubyBlbmNhcHN1bGF0aW9uIHNob3VsZCBlaXRoZXIgYmUKKwkgKiBoYW5kbGVkIGFzIERMVF9TTElQLCBETFRfU0xJUF9CU0RPUywgYW5kIERMVF9SQVcgYXJlLCBpZgorCSAqIGFsbCBwYWNrZXRzIGFyZSBJUCBwYWNrZXRzLCBvciBzaG91bGQgYmUgaGFuZGxlZCBpbiBzb21lCisJICogc3BlY2lhbCBjYXNlLCBpZiBub25lIG9mIHRoZW0gYXJlIChpZiBzb21lIGFyZSBhbmQgc29tZQorCSAqIGFyZW4ndCwgdGhlIGxhY2sgb2YgZW5jYXBzdWxhdGlvbiBpcyBhIHByb2JsZW0sIGFzIHdlJ2QKKwkgKiBoYXZlIHRvIGZpbmQgc29tZSBvdGhlciB3YXkgb2YgZGV0ZXJtaW5pbmcgdGhlIHBhY2tldCB0eXBlKS4KKwkgKgorCSAqIFRoZXJlZm9yZSwgaWYgIm9mZl9saW5rdHlwZSIgaXMgLTEsIHRoZXJlJ3MgYW4gZXJyb3IuCisJICovCisJaWYgKG9mZl9saW5rdHlwZSA9PSAodV9pbnQpLTEpCisJCWFib3J0KCk7CisKKwkvKgorCSAqIEFueSB0eXBlIG5vdCBoYW5kbGVkIGFib3ZlIHNob3VsZCBhbHdheXMgaGF2ZSBhbiBFdGhlcm5ldAorCSAqIHR5cGUgYXQgYW4gb2Zmc2V0IG9mICJvZmZfbGlua3R5cGUiLgorCSAqLworCXJldHVybiBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsIChicGZfaW50MzIpcHJvdG8pOworfQorCisvKgorICogQ2hlY2sgZm9yIGFuIExMQyBTTkFQIHBhY2tldCB3aXRoIGEgZ2l2ZW4gb3JnYW5pemF0aW9uIGNvZGUgYW5kCisgKiBwcm90b2NvbCB0eXBlOyB3ZSBjaGVjayB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSA4MDIuMiBMTEMgYW5kCisgKiBzbmFwIGhlYWRlcnMsIGNoZWNraW5nIGZvciBEU0FQIGFuZCBTU0FQIG9mIFNOQVAgYW5kIGEgY29udHJvbAorICogZmllbGQgb2YgMHgwMyBpbiB0aGUgTExDIGhlYWRlciwgYW5kIGZvciB0aGUgc3BlY2lmaWVkIG9yZ2FuaXphdGlvbgorICogY29kZSBhbmQgcHJvdG9jb2wgdHlwZSBpbiB0aGUgU05BUCBoZWFkZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3NuYXAob3JnY29kZSwgcHR5cGUpCisJYnBmX3VfaW50MzIgb3JnY29kZTsKKwlicGZfdV9pbnQzMiBwdHlwZTsKK3sKKwl1X2NoYXIgc25hcGJsb2NrWzhdOworCisJc25hcGJsb2NrWzBdID0gTExDU0FQX1NOQVA7CS8qIERTQVAgPSBTTkFQICovCisJc25hcGJsb2NrWzFdID0gTExDU0FQX1NOQVA7CS8qIFNTQVAgPSBTTkFQICovCisJc25hcGJsb2NrWzJdID0gMHgwMzsJCS8qIGNvbnRyb2wgPSBVSSAqLworCXNuYXBibG9ja1szXSA9IChvcmdjb2RlID4+IDE2KTsJLyogdXBwZXIgOCBiaXRzIG9mIG9yZ2FuaXphdGlvbiBjb2RlICovCisJc25hcGJsb2NrWzRdID0gKG9yZ2NvZGUgPj4gOCk7CS8qIG1pZGRsZSA4IGJpdHMgb2Ygb3JnYW5pemF0aW9uIGNvZGUgKi8KKwlzbmFwYmxvY2tbNV0gPSAob3JnY29kZSA+PiAwKTsJLyogbG93ZXIgOCBiaXRzIG9mIG9yZ2FuaXphdGlvbiBjb2RlICovCisJc25hcGJsb2NrWzZdID0gKHB0eXBlID4+IDgpOwkvKiB1cHBlciA4IGJpdHMgb2YgcHJvdG9jb2wgdHlwZSAqLworCXNuYXBibG9ja1s3XSA9IChwdHlwZSA+PiAwKTsJLyogbG93ZXIgOCBiaXRzIG9mIHByb3RvY29sIHR5cGUgKi8KKwlyZXR1cm4gZ2VuX2JjbXAoT1JfTUFDUEwsIDAsIDgsIHNuYXBibG9jayk7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBjb2RlIHRvIG1hdGNoIGEgcGFydGljdWxhciBwYWNrZXQgdHlwZSwgZm9yIGxpbmstbGF5ZXIgdHlwZXMKKyAqIHVzaW5nIDgwMi4yIExMQyBoZWFkZXJzLgorICoKKyAqIFRoaXMgaXMgKk5PVCogdXNlZCBmb3IgRXRoZXJuZXQ7ICJnZW5fZXRoZXJfbGlua3R5cGUoKSIgaXMgdXNlZAorICogZm9yIHRoYXQgLSBpdCBoYW5kbGVzIHRoZSBEL0kvWCBFdGhlcm5ldCB2cy4gODAyLjMrODAyLjIgaXNzdWVzLgorICoKKyAqICJwcm90byIgaXMgYW4gRXRoZXJuZXQgdHlwZSB2YWx1ZSwgaWYgPiBFVEhFUk1UVSwgb3IgYW4gTExDIFNBUAorICogdmFsdWUsIGlmIDw9IEVUSEVSTVRVLiAgV2UgdXNlIHRoYXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8KKyAqIG1hdGNoIHRoZSBEU0FQIG9yIGJvdGggRFNBUCBhbmQgTFNBUCBvciB0byBjaGVjayB0aGUgT1VJIGFuZAorICogcHJvdG9jb2wgSUQgaW4gYSBTTkFQIGhlYWRlci4KKyAqLworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fbGxjX2xpbmt0eXBlKHByb3RvKQorCWludCBwcm90bzsKK3sKKwkvKgorCSAqIFhYWCAtIGhhbmRsZSB0b2tlbi1yaW5nIHZhcmlhYmxlLWxlbmd0aCBoZWFkZXIuCisJICovCisJc3dpdGNoIChwcm90bykgeworCisJY2FzZSBMTENTQVBfSVA6CisJY2FzZSBMTENTQVBfSVNPTlM6CisJY2FzZSBMTENTQVBfTkVUQkVVSToKKwkJLyoKKwkJICogWFhYIC0gc2hvdWxkIHdlIGNoZWNrIGJvdGggdGhlIERTQVAgYW5kIHRoZQorCQkgKiBTU0FQLCBsaWtlIHRoaXMsIG9yIHNob3VsZCB3ZSBjaGVjayBqdXN0IHRoZQorCQkgKiBEU0FQLCBhcyB3ZSBkbyBmb3Igb3RoZXIgdHlwZXMgPD0gRVRIRVJNVFUKKwkJICogKGkuZS4sIG90aGVyIFNBUCB2YWx1ZXMpPworCQkgKi8KKwkJcmV0dXJuIGdlbl9jbXAoT1JfTUFDUEwsIDAsIEJQRl9ILCAoYnBmX3VfaW50MzIpCisJCQkgICAgICgocHJvdG8gPDwgOCkgfCBwcm90bykpOworCisJY2FzZSBMTENTQVBfSVBYOgorCQkvKgorCQkgKiBYWFggLSBhcmUgdGhlcmUgZXZlciBTTkFQIGZyYW1lcyBmb3IgSVBYIG9uCisJCSAqIG5vbi1FdGhlcm5ldCA4MDIueCBuZXR3b3Jrcz8KKwkJICovCisJCXJldHVybiBnZW5fY21wKE9SX01BQ1BMLCAwLCBCUEZfQiwKKwkJICAgIChicGZfaW50MzIpTExDU0FQX0lQWCk7CisKKwljYXNlIEVUSEVSVFlQRV9BVEFMSzoKKwkJLyoKKwkJICogODAyLjItZW5jYXBzdWxhdGVkIEVUSEVSVFlQRV9BVEFMSyBwYWNrZXRzIGFyZQorCQkgKiBTTkFQIHBhY2tldHMgd2l0aCBhbiBvcmdhbml6YXRpb24gY29kZSBvZgorCQkgKiAweDA4MDAwNyAoQXBwbGUsIGZvciBBcHBsZXRhbGspIGFuZCBhIHByb3RvY29sCisJCSAqIHR5cGUgb2YgRVRIRVJUWVBFX0FUQUxLIChBcHBsZXRhbGspLgorCQkgKgorCQkgKiBYWFggLSBjaGVjayBmb3IgYW4gb3JnYW5pemF0aW9uIGNvZGUgb2YKKwkJICogZW5jYXBzdWxhdGVkIEV0aGVybmV0IGFzIHdlbGw/CisJCSAqLworCQlyZXR1cm4gZ2VuX3NuYXAoMHgwODAwMDcsIEVUSEVSVFlQRV9BVEFMSyk7CisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBYWFggLSB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciBJUFggODAyLjMKKwkJICogaGVyZSwgYnV0IHNob3VsZCB3ZSBjaGVjayBmb3IgdGhlIElQWCBFdGhlcnR5cGU/CisJCSAqLworCQlpZiAocHJvdG8gPD0gRVRIRVJNVFUpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGFuIExMQyBTQVAgdmFsdWUsIHNvIGNoZWNrCisJCQkgKiB0aGUgRFNBUC4KKwkJCSAqLworCQkJcmV0dXJuIGdlbl9jbXAoT1JfTUFDUEwsIDAsIEJQRl9CLCAoYnBmX2ludDMyKXByb3RvKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGFuIEV0aGVybmV0IHR5cGU7IHdlIGFzc3VtZSB0aGF0IGl0J3MKKwkJCSAqIHVubGlrZWx5IHRoYXQgaXQnbGwgYXBwZWFyIGluIHRoZSByaWdodCBwbGFjZQorCQkJICogYXQgcmFuZG9tLCBhbmQgdGhlcmVmb3JlIGNoZWNrIG9ubHkgdGhlCisJCQkgKiBsb2NhdGlvbiB0aGF0IHdvdWxkIGhvbGQgdGhlIEV0aGVybmV0IHR5cGUKKwkJCSAqIGluIGEgU05BUCBmcmFtZSB3aXRoIGFuIG9yZ2FuaXphdGlvbiBjb2RlIG9mCisJCQkgKiAweDAwMDAwMCAoZW5jYXBzdWxhdGVkIEV0aGVybmV0KS4KKwkJCSAqCisJCQkgKiBYWFggLSBpZiB3ZSB3ZXJlIHRvIGNoZWNrIGZvciB0aGUgU05BUCBEU0FQIGFuZAorCQkJICogTFNBUCwgYXMgcGVyIFhYWCwgYW5kIHdlcmUgYWxzbyB0byBjaGVjayBmb3IgYW4KKwkJCSAqIG9yZ2FuaXphdGlvbiBjb2RlIG9mIDB4MDAwMDAwIChlbmNhcHN1bGF0ZWQKKwkJCSAqIEV0aGVybmV0KSwgd2UnZCBkbworCQkJICoKKwkJCSAqCXJldHVybiBnZW5fc25hcCgweDAwMDAwMCwgcHJvdG8pOworCQkJICoKKwkJCSAqIGhlcmU7IGZvciBub3csIHdlIGRvbid0LCBhcyBwZXIgdGhlIGFib3ZlLgorCQkJICogSSBkb24ndCBrbm93IHdoZXRoZXIgaXQncyB3b3J0aCB0aGUgZXh0cmEgQ1BVCisJCQkgKiB0aW1lIHRvIGRvIHRoZSByaWdodCBjaGVjayBvciBub3QuCisJCQkgKi8KKwkJCXJldHVybiBnZW5fY21wKE9SX01BQ1BMLCA2LCBCUEZfSCwgKGJwZl9pbnQzMilwcm90byk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2hvc3RvcChhZGRyLCBtYXNrLCBkaXIsIHByb3RvLCBzcmNfb2ZmLCBkc3Rfb2ZmKQorCWJwZl91X2ludDMyIGFkZHI7CisJYnBmX3VfaW50MzIgbWFzazsKKwlpbnQgZGlyLCBwcm90bzsKKwl1X2ludCBzcmNfb2ZmLCBkc3Rfb2ZmOworeworCXN0cnVjdCBibG9jayAqYjAsICpiMTsKKwl1X2ludCBvZmZzZXQ7CisKKwlzd2l0Y2ggKGRpcikgeworCisJY2FzZSBRX1NSQzoKKwkJb2Zmc2V0ID0gc3JjX29mZjsKKwkJYnJlYWs7CisKKwljYXNlIFFfRFNUOgorCQlvZmZzZXQgPSBkc3Rfb2ZmOworCQlicmVhazsKKworCWNhc2UgUV9BTkQ6CisJCWIwID0gZ2VuX2hvc3RvcChhZGRyLCBtYXNrLCBRX1NSQywgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOworCQliMSA9IGdlbl9ob3N0b3AoYWRkciwgbWFzaywgUV9EU1QsIHByb3RvLCBzcmNfb2ZmLCBkc3Rfb2ZmKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKKwljYXNlIFFfT1I6CisJY2FzZSBRX0RFRkFVTFQ6CisJCWIwID0gZ2VuX2hvc3RvcChhZGRyLCBtYXNrLCBRX1NSQywgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOworCQliMSA9IGdlbl9ob3N0b3AoYWRkciwgbWFzaywgUV9EU1QsIHByb3RvLCBzcmNfb2ZmLCBkc3Rfb2ZmKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorCWIwID0gZ2VuX2xpbmt0eXBlKHByb3RvKTsKKwliMSA9IGdlbl9tY21wKE9SX05FVCwgb2Zmc2V0LCBCUEZfVywgKGJwZl9pbnQzMilhZGRyLCBtYXNrKTsKKwlnZW5fYW5kKGIwLCBiMSk7CisJcmV0dXJuIGIxOworfQorCisjaWZkZWYgSU5FVDYKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2hvc3RvcDYoYWRkciwgbWFzaywgZGlyLCBwcm90bywgc3JjX29mZiwgZHN0X29mZikKKwlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI7CisJc3RydWN0IGluNl9hZGRyICptYXNrOworCWludCBkaXIsIHByb3RvOworCXVfaW50IHNyY19vZmYsIGRzdF9vZmY7Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxOworCXVfaW50IG9mZnNldDsKKwl1X2ludDMyX3QgKmEsICptOworCisJc3dpdGNoIChkaXIpIHsKKworCWNhc2UgUV9TUkM6CisJCW9mZnNldCA9IHNyY19vZmY7CisJCWJyZWFrOworCisJY2FzZSBRX0RTVDoKKwkJb2Zmc2V0ID0gZHN0X29mZjsKKwkJYnJlYWs7CisKKwljYXNlIFFfQU5EOgorCQliMCA9IGdlbl9ob3N0b3A2KGFkZHIsIG1hc2ssIFFfU1JDLCBwcm90bywgc3JjX29mZiwgZHN0X29mZik7CisJCWIxID0gZ2VuX2hvc3RvcDYoYWRkciwgbWFzaywgUV9EU1QsIHByb3RvLCBzcmNfb2ZmLCBkc3Rfb2ZmKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKKwljYXNlIFFfT1I6CisJY2FzZSBRX0RFRkFVTFQ6CisJCWIwID0gZ2VuX2hvc3RvcDYoYWRkciwgbWFzaywgUV9TUkMsIHByb3RvLCBzcmNfb2ZmLCBkc3Rfb2ZmKTsKKwkJYjEgPSBnZW5faG9zdG9wNihhZGRyLCBtYXNrLCBRX0RTVCwgcHJvdG8sIHNyY19vZmYsIGRzdF9vZmYpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisJLyogdGhpcyBvcmRlciBpcyBpbXBvcnRhbnQgKi8KKwlhID0gKHVfaW50MzJfdCAqKWFkZHI7CisJbSA9ICh1X2ludDMyX3QgKiltYXNrOworCWIxID0gZ2VuX21jbXAoT1JfTkVULCBvZmZzZXQgKyAxMiwgQlBGX1csIG50b2hsKGFbM10pLCBudG9obChtWzNdKSk7CisJYjAgPSBnZW5fbWNtcChPUl9ORVQsIG9mZnNldCArIDgsIEJQRl9XLCBudG9obChhWzJdKSwgbnRvaGwobVsyXSkpOworCWdlbl9hbmQoYjAsIGIxKTsKKwliMCA9IGdlbl9tY21wKE9SX05FVCwgb2Zmc2V0ICsgNCwgQlBGX1csIG50b2hsKGFbMV0pLCBudG9obChtWzFdKSk7CisJZ2VuX2FuZChiMCwgYjEpOworCWIwID0gZ2VuX21jbXAoT1JfTkVULCBvZmZzZXQgKyAwLCBCUEZfVywgbnRvaGwoYVswXSksIG50b2hsKG1bMF0pKTsKKwlnZW5fYW5kKGIwLCBiMSk7CisJYjAgPSBnZW5fbGlua3R5cGUocHJvdG8pOworCWdlbl9hbmQoYjAsIGIxKTsKKwlyZXR1cm4gYjE7Cit9CisjZW5kaWYgLypJTkVUNiovCisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2Vob3N0b3AoZWFkZHIsIGRpcikKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOworCXJlZ2lzdGVyIGludCBkaXI7Cit7CisJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiMCwgKmIxOworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIFFfU1JDOgorCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOSywgb2ZmX21hYyArIDYsIDYsIGVhZGRyKTsKKworCWNhc2UgUV9EU1Q6CisJCXJldHVybiBnZW5fYmNtcChPUl9MSU5LLCBvZmZfbWFjICsgMCwgNiwgZWFkZHIpOworCisJY2FzZSBRX0FORDoKKwkJYjAgPSBnZW5fZWhvc3RvcChlYWRkciwgUV9TUkMpOworCQliMSA9IGdlbl9laG9zdG9wKGVhZGRyLCBRX0RTVCk7CisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworCisJY2FzZSBRX0RFRkFVTFQ6CisJY2FzZSBRX09SOgorCQliMCA9IGdlbl9laG9zdG9wKGVhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2Vob3N0b3AoZWFkZHIsIFFfRFNUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9BRERSMToKKwkJYnBmX2Vycm9yKCInYWRkcjEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CisJCWJyZWFrOworCisJY2FzZSBRX0FERFIyOgorCQlicGZfZXJyb3IoIidhZGRyMicgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIHdpdGggODAyLjExIGhlYWRlcnMiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjM6CisJCWJwZl9lcnJvcigiJ2FkZHIzJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEgd2l0aCA4MDIuMTEgaGVhZGVycyIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSNDoKKwkJYnBmX2Vycm9yKCInYWRkcjQnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CisJCWJyZWFrOworCisJY2FzZSBRX1JBOgorCQlicGZfZXJyb3IoIidyYScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIHdpdGggODAyLjExIGhlYWRlcnMiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfVEE6CisJCWJwZl9lcnJvcigiJ3RhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEgd2l0aCA4MDIuMTEgaGVhZGVycyIpOworCQlicmVhazsKKwl9CisJYWJvcnQoKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qCisgKiBMaWtlIGdlbl9laG9zdG9wLCBidXQgZm9yIERMVF9GRERJCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2Zob3N0b3AoZWFkZHIsIGRpcikKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOworCXJlZ2lzdGVyIGludCBkaXI7Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxOworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIFFfU1JDOgorI2lmZGVmIFBDQVBfRkRESVBBRAorCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOSywgNiArIDEgKyBwY2FwX2ZkZGlwYWQsIDYsIGVhZGRyKTsKKyNlbHNlCisJCXJldHVybiBnZW5fYmNtcChPUl9MSU5LLCA2ICsgMSwgNiwgZWFkZHIpOworI2VuZGlmCisKKwljYXNlIFFfRFNUOgorI2lmZGVmIFBDQVBfRkRESVBBRAorCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOSywgMCArIDEgKyBwY2FwX2ZkZGlwYWQsIDYsIGVhZGRyKTsKKyNlbHNlCisJCXJldHVybiBnZW5fYmNtcChPUl9MSU5LLCAwICsgMSwgNiwgZWFkZHIpOworI2VuZGlmCisKKwljYXNlIFFfQU5EOgorCQliMCA9IGdlbl9maG9zdG9wKGVhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2Zob3N0b3AoZWFkZHIsIFFfRFNUKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKKwljYXNlIFFfREVGQVVMVDoKKwljYXNlIFFfT1I6CisJCWIwID0gZ2VuX2Zob3N0b3AoZWFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5fZmhvc3RvcChlYWRkciwgUV9EU1QpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworCisJY2FzZSBRX0FERFIxOgorCQlicGZfZXJyb3IoIidhZGRyMScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX0FERFIyOgorCQlicGZfZXJyb3IoIidhZGRyMicgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX0FERFIzOgorCQlicGZfZXJyb3IoIidhZGRyMycgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX0FERFI0OgorCQlicGZfZXJyb3IoIidhZGRyNCcgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX1JBOgorCQlicGZfZXJyb3IoIidyYScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCisJY2FzZSBRX1RBOgorCQlicGZfZXJyb3IoIid0YScgaXMgb25seSBzdXBwb3J0ZWQgb24gODAyLjExIik7CisJCWJyZWFrOworCX0KKwlhYm9ydCgpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworLyoKKyAqIExpa2UgZ2VuX2Vob3N0b3AsIGJ1dCBmb3IgRExUX0lFRUU4MDIgKFRva2VuIFJpbmcpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3Rob3N0b3AoZWFkZHIsIGRpcikKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOworCXJlZ2lzdGVyIGludCBkaXI7Cit7CisJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiMCwgKmIxOworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIFFfU1JDOgorCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOSywgOCwgNiwgZWFkZHIpOworCisJY2FzZSBRX0RTVDoKKwkJcmV0dXJuIGdlbl9iY21wKE9SX0xJTkssIDIsIDYsIGVhZGRyKTsKKworCWNhc2UgUV9BTkQ6CisJCWIwID0gZ2VuX3Rob3N0b3AoZWFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5fdGhvc3RvcChlYWRkciwgUV9EU1QpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9ERUZBVUxUOgorCWNhc2UgUV9PUjoKKwkJYjAgPSBnZW5fdGhvc3RvcChlYWRkciwgUV9TUkMpOworCQliMSA9IGdlbl90aG9zdG9wKGVhZGRyLCBRX0RTVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKKwljYXNlIFFfQUREUjE6CisJCWJwZl9lcnJvcigiJ2FkZHIxJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjI6CisJCWJwZl9lcnJvcigiJ2FkZHIyJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjM6CisJCWJwZl9lcnJvcigiJ2FkZHIzJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjQ6CisJCWJwZl9lcnJvcigiJ2FkZHI0JyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfUkE6CisJCWJwZl9lcnJvcigiJ3JhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfVEE6CisJCWJwZl9lcnJvcigiJ3RhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisJfQorCWFib3J0KCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogTGlrZSBnZW5fZWhvc3RvcCwgYnV0IGZvciBETFRfSUVFRTgwMl8xMSAoODAyLjExIHdpcmVsZXNzIExBTikgYW5kCisgKiB2YXJpb3VzIDgwMi4xMSArIHJhZGlvIGhlYWRlcnMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3dsYW5ob3N0b3AoZWFkZHIsIGRpcikKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOworCXJlZ2lzdGVyIGludCBkaXI7Cit7CisJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiMCwgKmIxLCAqYjI7CisJcmVnaXN0ZXIgc3RydWN0IHNsaXN0ICpzOworCisjaWZkZWYgRU5BQkxFX1dMQU5fRklMVEVSSU5HX1BBVENICisJLyoKKwkgKiBUT0RPIEdWIDIwMDcwNjEzCisJICogV2UgbmVlZCB0byBkaXNhYmxlIHRoZSBvcHRpbWl6ZXIgYmVjYXVzZSB0aGUgb3B0aW1pemVyIGlzIGJ1Z2d5CisJICogYW5kIHdpcGVzIG91dCBzb21lIExEIGluc3RydWN0aW9ucyBnZW5lcmF0ZWQgYnkgdGhlIGJlbG93CisJICogY29kZSB0byB2YWxpZGF0ZSB0aGUgRnJhbWUgQ29udHJvbCBiaXRzCisJICovCisJbm9fb3B0aW1pemUgPSAxOworI2VuZGlmIC8qIEVOQUJMRV9XTEFOX0ZJTFRFUklOR19QQVRDSCAqLworCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIFFfU1JDOgorCQkvKgorCQkgKiBPaCwgeXVrLgorCQkgKgorCQkgKglGb3IgY29udHJvbCBmcmFtZXMsIHRoZXJlIGlzIG5vIFNBLgorCQkgKgorCQkgKglGb3IgbWFuYWdlbWVudCBmcmFtZXMsIFNBIGlzIGF0IGFuCisJCSAqCW9mZnNldCBvZiAxMCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKKwkJICoJdGhlIHBhY2tldC4KKwkJICoKKwkJICoJRm9yIGRhdGEgZnJhbWVzLCBTQSBpcyBhdCBhbiBvZmZzZXQKKwkJICoJb2YgMTAgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQKKwkJICoJaWYgRnJvbSBEUyBpcyBjbGVhciwgYXQgYW4gb2Zmc2V0IG9mCisJCSAqCTE2IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0CisJCSAqCWlmIEZyb20gRFMgaXMgc2V0IGFuZCBUbyBEUyBpcyBjbGVhciwKKwkJICoJYW5kIGFuIG9mZnNldCBvZiAyNCBmcm9tIHRoZSBiZWdpbm5pbmcKKwkJICoJb2YgdGhlIHBhY2tldCBpZiBGcm9tIERTIGlzIHNldCBhbmQgVG8gRFMKKwkJICoJaXMgc2V0LgorCQkgKi8KKworCQkvKgorCQkgKiBHZW5lcmF0ZSB0aGUgdGVzdHMgdG8gYmUgZG9uZSBmb3IgZGF0YSBmcmFtZXMKKwkJICogd2l0aCBGcm9tIERTIHNldC4KKwkJICoKKwkJICogRmlyc3QsIGNoZWNrIGZvciBUbyBEUyBzZXQsIGkuZS4gY2hlY2sgImxpbmtbMV0gJiAweDAxIi4KKwkJICovCisJCXMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDEsIEJQRl9CKTsKKwkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCWIxLT5zLmsgPSAweDAxOwkvKiBUbyBEUyAqLworCQliMS0+c3RtdHMgPSBzOworCisJCS8qCisJCSAqIElmIFRvIERTIGlzIHNldCwgdGhlIFNBIGlzIGF0IDI0LgorCQkgKi8KKwkJYjAgPSBnZW5fYmNtcChPUl9MSU5LLCAyNCwgNiwgZWFkZHIpOworCQlnZW5fYW5kKGIxLCBiMCk7CisKKwkJLyoKKwkJICogTm93LCBjaGVjayBmb3IgVG8gRFMgbm90IHNldCwgaS5lLiBjaGVjaworCQkgKiAiIShsaW5rWzFdICYgMHgwMSkiLgorCQkgKi8KKwkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMSwgQlBGX0IpOworCQliMiA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJYjItPnMuayA9IDB4MDE7CS8qIFRvIERTICovCisJCWIyLT5zdG10cyA9IHM7CisJCWdlbl9ub3QoYjIpOworCisJCS8qCisJCSAqIElmIFRvIERTIGlzIG5vdCBzZXQsIHRoZSBTQSBpcyBhdCAxNi4KKwkJICovCisJCWIxID0gZ2VuX2JjbXAoT1JfTElOSywgMTYsIDYsIGVhZGRyKTsKKwkJZ2VuX2FuZChiMiwgYjEpOworCisJCS8qCisJCSAqIE5vdyBPUiB0b2dldGhlciB0aGUgbGFzdCB0d28gY2hlY2tzLiAgVGhhdCBnaXZlcworCQkgKiB0aGUgY29tcGxldGUgc2V0IG9mIGNoZWNrcyBmb3IgZGF0YSBmcmFtZXMgd2l0aAorCQkgKiBGcm9tIERTIHNldC4KKwkJICovCisJCWdlbl9vcihiMSwgYjApOworCisJCS8qCisJCSAqIE5vdyBjaGVjayBmb3IgRnJvbSBEUyBiZWluZyBzZXQsIGFuZCBBTkQgdGhhdCB3aXRoCisJCSAqIHRoZSBPUmVkLXRvZ2V0aGVyIGNoZWNrcy4KKwkJICovCisJCXMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDEsIEJQRl9CKTsKKwkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCWIxLT5zLmsgPSAweDAyOwkvKiBGcm9tIERTICovCisJCWIxLT5zdG10cyA9IHM7CisJCWdlbl9hbmQoYjEsIGIwKTsKKworCQkvKgorCQkgKiBOb3cgY2hlY2sgZm9yIGRhdGEgZnJhbWVzIHdpdGggRnJvbSBEUyBub3Qgc2V0LgorCQkgKi8KKwkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMSwgQlBGX0IpOworCQliMiA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJYjItPnMuayA9IDB4MDI7CS8qIEZyb20gRFMgKi8KKwkJYjItPnN0bXRzID0gczsKKwkJZ2VuX25vdChiMik7CisKKwkJLyoKKwkJICogSWYgRnJvbSBEUyBpc24ndCBzZXQsIHRoZSBTQSBpcyBhdCAxMC4KKwkJICovCisJCWIxID0gZ2VuX2JjbXAoT1JfTElOSywgMTAsIDYsIGVhZGRyKTsKKwkJZ2VuX2FuZChiMiwgYjEpOworCisJCS8qCisJCSAqIE5vdyBPUiB0b2dldGhlciB0aGUgY2hlY2tzIGZvciBkYXRhIGZyYW1lcyB3aXRoCisJCSAqIEZyb20gRFMgbm90IHNldCBhbmQgZm9yIGRhdGEgZnJhbWVzIHdpdGggRnJvbSBEUworCQkgKiBzZXQ7IHRoYXQgZ2l2ZXMgdGhlIGNoZWNrcyBkb25lIGZvciBkYXRhIGZyYW1lcy4KKwkJICovCisJCWdlbl9vcihiMSwgYjApOworCisJCS8qCisJCSAqIE5vdyBjaGVjayBmb3IgYSBkYXRhIGZyYW1lLgorCQkgKiBJLmUsIGNoZWNrICJsaW5rWzBdICYgMHgwOCIuCisJCSAqLworCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAwLCBCUEZfQik7CisJCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQliMS0+cy5rID0gMHgwODsKKwkJYjEtPnN0bXRzID0gczsKKworCQkvKgorCQkgKiBBTkQgdGhhdCB3aXRoIHRoZSBjaGVja3MgZG9uZSBmb3IgZGF0YSBmcmFtZXMuCisJCSAqLworCQlnZW5fYW5kKGIxLCBiMCk7CisKKwkJLyoKKwkJICogSWYgdGhlIGhpZ2gtb3JkZXIgYml0IG9mIHRoZSB0eXBlIHZhbHVlIGlzIDAsIHRoaXMKKwkJICogaXMgYSBtYW5hZ2VtZW50IGZyYW1lLgorCQkgKiBJLmUsIGNoZWNrICIhKGxpbmtbMF0gJiAweDA4KSIuCisJCSAqLworCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAwLCBCUEZfQik7CisJCWIyID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQliMi0+cy5rID0gMHgwODsKKwkJYjItPnN0bXRzID0gczsKKwkJZ2VuX25vdChiMik7CisKKwkJLyoKKwkJICogRm9yIG1hbmFnZW1lbnQgZnJhbWVzLCB0aGUgU0EgaXMgYXQgMTAuCisJCSAqLworCQliMSA9IGdlbl9iY21wKE9SX0xJTkssIDEwLCA2LCBlYWRkcik7CisJCWdlbl9hbmQoYjIsIGIxKTsKKworCQkvKgorCQkgKiBPUiB0aGF0IHdpdGggdGhlIGNoZWNrcyBkb25lIGZvciBkYXRhIGZyYW1lcy4KKwkJICogVGhhdCBnaXZlcyB0aGUgY2hlY2tzIGRvbmUgZm9yIG1hbmFnZW1lbnQgYW5kCisJCSAqIGRhdGEgZnJhbWVzLgorCQkgKi8KKwkJZ2VuX29yKGIxLCBiMCk7CisKKwkJLyoKKwkJICogSWYgdGhlIGxvdy1vcmRlciBiaXQgb2YgdGhlIHR5cGUgdmFsdWUgaXMgMSwKKwkJICogdGhpcyBpcyBlaXRoZXIgYSBjb250cm9sIGZyYW1lIG9yIGEgZnJhbWUKKwkJICogd2l0aCBhIHJlc2VydmVkIHR5cGUsIGFuZCB0aHVzIG5vdCBhCisJCSAqIGZyYW1lIHdpdGggYW4gU0EuCisJCSAqCisJCSAqIEkuZS4sIGNoZWNrICIhKGxpbmtbMF0gJiAweDA0KSIuCisJCSAqLworCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAwLCBCUEZfQik7CisJCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQliMS0+cy5rID0gMHgwNDsKKwkJYjEtPnN0bXRzID0gczsKKwkJZ2VuX25vdChiMSk7CisKKwkJLyoKKwkJICogQU5EIHRoYXQgd2l0aCB0aGUgY2hlY2tzIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50CisJCSAqIGZyYW1lcy4KKwkJICovCisJCWdlbl9hbmQoYjEsIGIwKTsKKwkJcmV0dXJuIGIwOworCisJY2FzZSBRX0RTVDoKKwkJLyoKKwkJICogT2gsIHl1ay4KKwkJICoKKwkJICoJRm9yIGNvbnRyb2wgZnJhbWVzLCB0aGVyZSBpcyBubyBEQS4KKwkJICoKKwkJICoJRm9yIG1hbmFnZW1lbnQgZnJhbWVzLCBEQSBpcyBhdCBhbgorCQkgKglvZmZzZXQgb2YgNCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YKKwkJICoJdGhlIHBhY2tldC4KKwkJICoKKwkJICoJRm9yIGRhdGEgZnJhbWVzLCBEQSBpcyBhdCBhbiBvZmZzZXQKKwkJICoJb2YgNCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldAorCQkgKglpZiBUbyBEUyBpcyBjbGVhciBhbmQgYXQgYW4gb2Zmc2V0IG9mCisJCSAqCTE2IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0CisJCSAqCWlmIFRvIERTIGlzIHNldC4KKwkJICovCisKKwkJLyoKKwkJICogR2VuZXJhdGUgdGhlIHRlc3RzIHRvIGJlIGRvbmUgZm9yIGRhdGEgZnJhbWVzLgorCQkgKgorCQkgKiBGaXJzdCwgY2hlY2sgZm9yIFRvIERTIHNldCwgaS5lLiAibGlua1sxXSAmIDB4MDEiLgorCQkgKi8KKwkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMSwgQlBGX0IpOworCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJYjEtPnMuayA9IDB4MDE7CS8qIFRvIERTICovCisJCWIxLT5zdG10cyA9IHM7CisKKwkJLyoKKwkJICogSWYgVG8gRFMgaXMgc2V0LCB0aGUgREEgaXMgYXQgMTYuCisJCSAqLworCQliMCA9IGdlbl9iY21wKE9SX0xJTkssIDE2LCA2LCBlYWRkcik7CisJCWdlbl9hbmQoYjEsIGIwKTsKKworCQkvKgorCQkgKiBOb3csIGNoZWNrIGZvciBUbyBEUyBub3Qgc2V0LCBpLmUuIGNoZWNrCisJCSAqICIhKGxpbmtbMV0gJiAweDAxKSIuCisJCSAqLworCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAxLCBCUEZfQik7CisJCWIyID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQliMi0+cy5rID0gMHgwMTsJLyogVG8gRFMgKi8KKwkJYjItPnN0bXRzID0gczsKKwkJZ2VuX25vdChiMik7CisKKwkJLyoKKwkJICogSWYgVG8gRFMgaXMgbm90IHNldCwgdGhlIERBIGlzIGF0IDQuCisJCSAqLworCQliMSA9IGdlbl9iY21wKE9SX0xJTkssIDQsIDYsIGVhZGRyKTsKKwkJZ2VuX2FuZChiMiwgYjEpOworCisJCS8qCisJCSAqIE5vdyBPUiB0b2dldGhlciB0aGUgbGFzdCB0d28gY2hlY2tzLiAgVGhhdCBnaXZlcworCQkgKiB0aGUgY29tcGxldGUgc2V0IG9mIGNoZWNrcyBmb3IgZGF0YSBmcmFtZXMuCisJCSAqLworCQlnZW5fb3IoYjEsIGIwKTsKKworCQkvKgorCQkgKiBOb3cgY2hlY2sgZm9yIGEgZGF0YSBmcmFtZS4KKwkJICogSS5lLCBjaGVjayAibGlua1swXSAmIDB4MDgiLgorCQkgKi8KKwkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCQliMSA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJYjEtPnMuayA9IDB4MDg7CisJCWIxLT5zdG10cyA9IHM7CisKKwkJLyoKKwkJICogQU5EIHRoYXQgd2l0aCB0aGUgY2hlY2tzIGRvbmUgZm9yIGRhdGEgZnJhbWVzLgorCQkgKi8KKwkJZ2VuX2FuZChiMSwgYjApOworCisJCS8qCisJCSAqIElmIHRoZSBoaWdoLW9yZGVyIGJpdCBvZiB0aGUgdHlwZSB2YWx1ZSBpcyAwLCB0aGlzCisJCSAqIGlzIGEgbWFuYWdlbWVudCBmcmFtZS4KKwkJICogSS5lLCBjaGVjayAiIShsaW5rWzBdICYgMHgwOCkiLgorCQkgKi8KKwkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCQliMiA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJYjItPnMuayA9IDB4MDg7CisJCWIyLT5zdG10cyA9IHM7CisJCWdlbl9ub3QoYjIpOworCisJCS8qCisJCSAqIEZvciBtYW5hZ2VtZW50IGZyYW1lcywgdGhlIERBIGlzIGF0IDQuCisJCSAqLworCQliMSA9IGdlbl9iY21wKE9SX0xJTkssIDQsIDYsIGVhZGRyKTsKKwkJZ2VuX2FuZChiMiwgYjEpOworCisJCS8qCisJCSAqIE9SIHRoYXQgd2l0aCB0aGUgY2hlY2tzIGRvbmUgZm9yIGRhdGEgZnJhbWVzLgorCQkgKiBUaGF0IGdpdmVzIHRoZSBjaGVja3MgZG9uZSBmb3IgbWFuYWdlbWVudCBhbmQKKwkJICogZGF0YSBmcmFtZXMuCisJCSAqLworCQlnZW5fb3IoYjEsIGIwKTsKKworCQkvKgorCQkgKiBJZiB0aGUgbG93LW9yZGVyIGJpdCBvZiB0aGUgdHlwZSB2YWx1ZSBpcyAxLAorCQkgKiB0aGlzIGlzIGVpdGhlciBhIGNvbnRyb2wgZnJhbWUgb3IgYSBmcmFtZQorCQkgKiB3aXRoIGEgcmVzZXJ2ZWQgdHlwZSwgYW5kIHRodXMgbm90IGEKKwkJICogZnJhbWUgd2l0aCBhbiBTQS4KKwkJICoKKwkJICogSS5lLiwgY2hlY2sgIiEobGlua1swXSAmIDB4MDQpIi4KKwkJICovCisJCXMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDAsIEJQRl9CKTsKKwkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCWIxLT5zLmsgPSAweDA0OworCQliMS0+c3RtdHMgPSBzOworCQlnZW5fbm90KGIxKTsKKworCQkvKgorCQkgKiBBTkQgdGhhdCB3aXRoIHRoZSBjaGVja3MgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQKKwkJICogZnJhbWVzLgorCQkgKi8KKwkJZ2VuX2FuZChiMSwgYjApOworCQlyZXR1cm4gYjA7CisKKwljYXNlIFFfUkE6CisJCS8qCisJCSAqIE5vdCBwcmVzZW50IGluIG1hbmFnZW1lbnQgZnJhbWVzOyBhZGRyMSBpbiBvdGhlcgorCQkgKiBmcmFtZXMuCisJCSAqLworCisJCS8qCisJCSAqIElmIHRoZSBoaWdoLW9yZGVyIGJpdCBvZiB0aGUgdHlwZSB2YWx1ZSBpcyAwLCB0aGlzCisJCSAqIGlzIGEgbWFuYWdlbWVudCBmcmFtZS4KKwkJICogSS5lLCBjaGVjayAiKGxpbmtbMF0gJiAweDA4KSIuCisJCSAqLworCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAwLCBCUEZfQik7CisJCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQliMS0+cy5rID0gMHgwODsKKwkJYjEtPnN0bXRzID0gczsKKworCQkvKgorCQkgKiBDaGVjayBhZGRyMS4KKwkJICovCisJCWIwID0gZ2VuX2JjbXAoT1JfTElOSywgNCwgNiwgZWFkZHIpOworCisJCS8qCisJCSAqIEFORCB0aGF0IHdpdGggdGhlIGNoZWNrIG9mIGFkZHIxLgorCQkgKi8KKwkJZ2VuX2FuZChiMSwgYjApOworCQlyZXR1cm4gKGIwKTsKKworCWNhc2UgUV9UQToKKwkJLyoKKwkJICogTm90IHByZXNlbnQgaW4gbWFuYWdlbWVudCBmcmFtZXM7IGFkZHIyLCBpZiBwcmVzZW50LAorCQkgKiBpbiBvdGhlciBmcmFtZXMuCisJCSAqLworCisJCS8qCisJCSAqIE5vdCBwcmVzZW50IGluIENUUyBvciBBQ0sgY29udHJvbCBmcmFtZXMuCisJCSAqLworCQliMCA9IGdlbl9tY21wKE9SX0xJTkssIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLAorCQkJSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spOworCQlnZW5fbm90KGIwKTsKKwkJYjEgPSBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfQiwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NUUywKKwkJCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKTsKKwkJZ2VuX25vdChiMSk7CisJCWIyID0gZ2VuX21jbXAoT1JfTElOSywgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BQ0ssCisJCQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSyk7CisJCWdlbl9ub3QoYjIpOworCQlnZW5fYW5kKGIxLCBiMik7CisJCWdlbl9vcihiMCwgYjIpOworCisJCS8qCisJCSAqIElmIHRoZSBoaWdoLW9yZGVyIGJpdCBvZiB0aGUgdHlwZSB2YWx1ZSBpcyAwLCB0aGlzCisJCSAqIGlzIGEgbWFuYWdlbWVudCBmcmFtZS4KKwkJICogSS5lLCBjaGVjayAiKGxpbmtbMF0gJiAweDA4KSIuCisJCSAqLworCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAwLCBCUEZfQik7CisJCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQliMS0+cy5rID0gMHgwODsKKwkJYjEtPnN0bXRzID0gczsKKworCQkvKgorCQkgKiBBTkQgdGhhdCB3aXRoIHRoZSBjaGVjayBmb3IgZnJhbWVzIG90aGVyIHRoYW4KKwkJICogQ1RTIGFuZCBBQ0sgZnJhbWVzLgorCQkgKi8KKwkJZ2VuX2FuZChiMSwgYjIpOworCisJCS8qCisJCSAqIENoZWNrIGFkZHIyLgorCQkgKi8KKwkJYjEgPSBnZW5fYmNtcChPUl9MSU5LLCAxMCwgNiwgZWFkZHIpOworCQlnZW5fYW5kKGIyLCBiMSk7CisJCXJldHVybiBiMTsKKworCS8qCisJICogWFhYIC0gYWRkIEJTU0lEIGtleXdvcmQ/CisJICovCisJY2FzZSBRX0FERFIxOgorCQlyZXR1cm4gKGdlbl9iY21wKE9SX0xJTkssIDQsIDYsIGVhZGRyKSk7CisKKwljYXNlIFFfQUREUjI6CisJCS8qCisJCSAqIE5vdCBwcmVzZW50IGluIENUUyBvciBBQ0sgY29udHJvbCBmcmFtZXMuCisJCSAqLworCQliMCA9IGdlbl9tY21wKE9SX0xJTkssIDAsIEJQRl9CLCBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLAorCQkJSUVFRTgwMjExX0ZDMF9UWVBFX01BU0spOworCQlnZW5fbm90KGIwKTsKKwkJYjEgPSBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfQiwgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NUUywKKwkJCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKTsKKwkJZ2VuX25vdChiMSk7CisJCWIyID0gZ2VuX21jbXAoT1JfTElOSywgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BQ0ssCisJCQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSyk7CisJCWdlbl9ub3QoYjIpOworCQlnZW5fYW5kKGIxLCBiMik7CisJCWdlbl9vcihiMCwgYjIpOworCQliMSA9IGdlbl9iY21wKE9SX0xJTkssIDEwLCA2LCBlYWRkcik7CisJCWdlbl9hbmQoYjIsIGIxKTsKKwkJcmV0dXJuIGIxOworCisJY2FzZSBRX0FERFIzOgorCQkvKgorCQkgKiBOb3QgcHJlc2VudCBpbiBjb250cm9sIGZyYW1lcy4KKwkJICovCisJCWIwID0gZ2VuX21jbXAoT1JfTElOSywgMCwgQlBGX0IsIElFRUU4MDIxMV9GQzBfVFlQRV9DVEwsCisJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyk7CisJCWdlbl9ub3QoYjApOworCQliMSA9IGdlbl9iY21wKE9SX0xJTkssIDE2LCA2LCBlYWRkcik7CisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworCisJY2FzZSBRX0FERFI0OgorCQkvKgorCQkgKiBQcmVzZW50IG9ubHkgaWYgdGhlIGRpcmVjdGlvbiBtYXNrIGhhcyBib3RoICJGcm9tIERTIgorCQkgKiBhbmQgIlRvIERTIiBzZXQuICBOZWl0aGVyIGNvbnRyb2wgZnJhbWVzIG5vciBtYW5hZ2VtZW50CisJCSAqIGZyYW1lcyBzaG91bGQgaGF2ZSBib3RoIG9mIHRob3NlIHNldCwgc28gd2UgZG9uJ3QKKwkJICogY2hlY2sgdGhlIGZyYW1lIHR5cGUuCisJCSAqLworCQliMCA9IGdlbl9tY21wKE9SX0xJTkssIDEsIEJQRl9CLAorCQkJSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTLCBJRUVFODAyMTFfRkMxX0RJUl9NQVNLKTsKKwkJYjEgPSBnZW5fYmNtcChPUl9MSU5LLCAyNCwgNiwgZWFkZHIpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9BTkQ6CisJCWIwID0gZ2VuX3dsYW5ob3N0b3AoZWFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5fd2xhbmhvc3RvcChlYWRkciwgUV9EU1QpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9ERUZBVUxUOgorCWNhc2UgUV9PUjoKKwkJYjAgPSBnZW5fd2xhbmhvc3RvcChlYWRkciwgUV9TUkMpOworCQliMSA9IGdlbl93bGFuaG9zdG9wKGVhZGRyLCBRX0RTVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQlyZXR1cm4gYjE7CisJfQorCWFib3J0KCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogTGlrZSBnZW5fZWhvc3RvcCwgYnV0IGZvciBSRkMgMjYyNSBJUC1vdmVyLUZpYnJlLUNoYW5uZWwuCisgKiAoV2UgYXNzdW1lIHRoYXQgdGhlIGFkZHJlc3NlcyBhcmUgSUVFRSA0OC1iaXQgTUFDIGFkZHJlc3NlcywKKyAqIGFzIHRoZSBSRkMgc3RhdGVzLikKKyAqLworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5faXBmY2hvc3RvcChlYWRkciwgZGlyKQorCXJlZ2lzdGVyIGNvbnN0IHVfY2hhciAqZWFkZHI7CisJcmVnaXN0ZXIgaW50IGRpcjsKK3sKKwlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7CisKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgUV9TUkM6CisJCXJldHVybiBnZW5fYmNtcChPUl9MSU5LLCAxMCwgNiwgZWFkZHIpOworCisJY2FzZSBRX0RTVDoKKwkJcmV0dXJuIGdlbl9iY21wKE9SX0xJTkssIDIsIDYsIGVhZGRyKTsKKworCWNhc2UgUV9BTkQ6CisJCWIwID0gZ2VuX2lwZmNob3N0b3AoZWFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5faXBmY2hvc3RvcChlYWRkciwgUV9EU1QpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9ERUZBVUxUOgorCWNhc2UgUV9PUjoKKwkJYjAgPSBnZW5faXBmY2hvc3RvcChlYWRkciwgUV9TUkMpOworCQliMSA9IGdlbl9pcGZjaG9zdG9wKGVhZGRyLCBRX0RTVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQlyZXR1cm4gYjE7CisKKwljYXNlIFFfQUREUjE6CisJCWJwZl9lcnJvcigiJ2FkZHIxJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjI6CisJCWJwZl9lcnJvcigiJ2FkZHIyJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjM6CisJCWJwZl9lcnJvcigiJ2FkZHIzJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUREUjQ6CisJCWJwZl9lcnJvcigiJ2FkZHI0JyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfUkE6CisJCWJwZl9lcnJvcigiJ3JhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfVEE6CisJCWJwZl9lcnJvcigiJ3RhJyBpcyBvbmx5IHN1cHBvcnRlZCBvbiA4MDIuMTEiKTsKKwkJYnJlYWs7CisJfQorCWFib3J0KCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogVGhpcyBpcyBxdWl0ZSB0cmlja3kgYmVjYXVzZSB0aGVyZSBtYXkgYmUgcGFkIGJ5dGVzIGluIGZyb250IG9mIHRoZQorICogREVDTkVUIGhlYWRlciwgYW5kIHRoZW4gdGhlcmUgYXJlIHR3byBwb3NzaWJsZSBkYXRhIHBhY2tldCBmb3JtYXRzIHRoYXQKKyAqIGNhcnJ5IGJvdGggc3JjIGFuZCBkc3QgYWRkcmVzc2VzLCBwbHVzIDUgcGFja2V0IHR5cGVzIGluIGEgZm9ybWF0IHRoYXQKKyAqIGNhcnJpZXMgb25seSB0aGUgc3JjIG5vZGUsIHBsdXMgMiB0eXBlcyB0aGF0IHVzZSBhIGRpZmZlcmVudCBmb3JtYXQgYW5kCisgKiBhbHNvIGNhcnJ5IGp1c3QgdGhlIHNyYyBub2RlLgorICoKKyAqIFl1Y2suCisgKgorICogSW5zdGVhZCBvZiBkb2luZyB0aG9zZSBhbGwgcmlnaHQsIHdlIGp1c3QgbG9vayBmb3IgZGF0YSBwYWNrZXRzIHdpdGgKKyAqIDAgb3IgMSBieXRlcyBvZiBwYWRkaW5nLiAgSWYgeW91IHdhbnQgdG8gbG9vayBhdCBvdGhlciBwYWNrZXRzLCB0aGF0CisgKiB3aWxsIHJlcXVpcmUgYSBsb3QgbW9yZSBoYWNraW5nLgorICoKKyAqIFRvIGFkZCBzdXBwb3J0IGZvciBmaWx0ZXJpbmcgb24gREVDTkVUICJhcmVhcyIgKG5ldHdvcmsgbnVtYmVycykKKyAqIG9uZSB3b3VsZCB3YW50IHRvIGFkZCBhICJtYXNrIiBhcmd1bWVudCB0byB0aGlzIHJvdXRpbmUuICBUaGF0IHdvdWxkCisgKiBtYWtlIHRoZSBmaWx0ZXIgZXZlbiBtb3JlIGluZWZmaWNpZW50LCBhbHRob3VnaCBvbmUgY291bGQgYmUgY2xldmVyCisgKiBhbmQgbm90IGdlbmVyYXRlIG1hc2tpbmcgaW5zdHJ1Y3Rpb25zIGlmIHRoZSBtYXNrIGlzIDB4RkZGRi4KKyAqLworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fZG5ob3N0b3AoYWRkciwgZGlyKQorCWJwZl91X2ludDMyIGFkZHI7CisJaW50IGRpcjsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICpiMiwgKnRtcDsKKwl1X2ludCBvZmZzZXRfbGg7CS8qIG9mZnNldCBpZiBsb25nIGhlYWRlciBpcyByZWNlaXZlZCAqLworCXVfaW50IG9mZnNldF9zaDsJLyogb2Zmc2V0IGlmIHNob3J0IGhlYWRlciBpcyByZWNlaXZlZCAqLworCisJc3dpdGNoIChkaXIpIHsKKworCWNhc2UgUV9EU1Q6CisJCW9mZnNldF9zaCA9IDE7CS8qIGZvbGxvd3MgZmxhZ3MgKi8KKwkJb2Zmc2V0X2xoID0gNzsJLyogZmxncyxkYXJlYSxkc3ViYXJlYSxISU9SRCAqLworCQlicmVhazsKKworCWNhc2UgUV9TUkM6CisJCW9mZnNldF9zaCA9IDM7CS8qIGZvbGxvd3MgZmxhZ3MsIGRzdG5vZGUgKi8KKwkJb2Zmc2V0X2xoID0gMTU7CS8qIGZsZ3MsZGFyZWEsZHN1YmFyZWEsZGlkLHNhcmVhLHNzdWIsSElPUkQgKi8KKwkJYnJlYWs7CisKKwljYXNlIFFfQU5EOgorCQkvKiBJbmVmZmljaWVudCBiZWNhdXNlIHdlIGRvIG91ciBDYWx2aW5iYWxsIGRhbmNlIHR3aWNlICovCisJCWIwID0gZ2VuX2RuaG9zdG9wKGFkZHIsIFFfU1JDKTsKKwkJYjEgPSBnZW5fZG5ob3N0b3AoYWRkciwgUV9EU1QpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9PUjoKKwljYXNlIFFfREVGQVVMVDoKKwkJLyogSW5lZmZpY2llbnQgYmVjYXVzZSB3ZSBkbyBvdXIgQ2FsdmluYmFsbCBkYW5jZSB0d2ljZSAqLworCQliMCA9IGdlbl9kbmhvc3RvcChhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2RuaG9zdG9wKGFkZHIsIFFfRFNUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9JU086CisJCWJwZl9lcnJvcigiSVNPIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisJYjAgPSBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0ROKTsKKwkvKiBDaGVjayBmb3IgcGFkID0gMSwgbG9uZyBoZWFkZXIgY2FzZSAqLworCXRtcCA9IGdlbl9tY21wKE9SX05FVCwgMiwgQlBGX0gsCisJICAgIChicGZfaW50MzIpbnRvaHMoMHgwNjgxKSwgKGJwZl9pbnQzMiludG9ocygweDA3RkYpKTsKKwliMSA9IGdlbl9jbXAoT1JfTkVULCAyICsgMSArIG9mZnNldF9saCwKKwkgICAgQlBGX0gsIChicGZfaW50MzIpbnRvaHMoKHVfc2hvcnQpYWRkcikpOworCWdlbl9hbmQodG1wLCBiMSk7CisJLyogQ2hlY2sgZm9yIHBhZCA9IDAsIGxvbmcgaGVhZGVyIGNhc2UgKi8KKwl0bXAgPSBnZW5fbWNtcChPUl9ORVQsIDIsIEJQRl9CLCAoYnBmX2ludDMyKTB4MDYsIChicGZfaW50MzIpMHg3KTsKKwliMiA9IGdlbl9jbXAoT1JfTkVULCAyICsgb2Zmc2V0X2xoLCBCUEZfSCwgKGJwZl9pbnQzMiludG9ocygodV9zaG9ydClhZGRyKSk7CisJZ2VuX2FuZCh0bXAsIGIyKTsKKwlnZW5fb3IoYjIsIGIxKTsKKwkvKiBDaGVjayBmb3IgcGFkID0gMSwgc2hvcnQgaGVhZGVyIGNhc2UgKi8KKwl0bXAgPSBnZW5fbWNtcChPUl9ORVQsIDIsIEJQRl9ILAorCSAgICAoYnBmX2ludDMyKW50b2hzKDB4MDI4MSksIChicGZfaW50MzIpbnRvaHMoMHgwN0ZGKSk7CisJYjIgPSBnZW5fY21wKE9SX05FVCwgMiArIDEgKyBvZmZzZXRfc2gsIEJQRl9ILCAoYnBmX2ludDMyKW50b2hzKCh1X3Nob3J0KWFkZHIpKTsKKwlnZW5fYW5kKHRtcCwgYjIpOworCWdlbl9vcihiMiwgYjEpOworCS8qIENoZWNrIGZvciBwYWQgPSAwLCBzaG9ydCBoZWFkZXIgY2FzZSAqLworCXRtcCA9IGdlbl9tY21wKE9SX05FVCwgMiwgQlBGX0IsIChicGZfaW50MzIpMHgwMiwgKGJwZl9pbnQzMikweDcpOworCWIyID0gZ2VuX2NtcChPUl9ORVQsIDIgKyBvZmZzZXRfc2gsIEJQRl9ILCAoYnBmX2ludDMyKW50b2hzKCh1X3Nob3J0KWFkZHIpKTsKKwlnZW5fYW5kKHRtcCwgYjIpOworCWdlbl9vcihiMiwgYjEpOworCisJLyogQ29tYmluZSB3aXRoIHRlc3QgZm9yIGxpbmt0eXBlICovCisJZ2VuX2FuZChiMCwgYjEpOworCXJldHVybiBiMTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgY2hlY2sgZm9yIElQdjQgb3IgSVB2NiBmb3IgTVBMUy1lbmNhcHN1bGF0ZWQgcGFja2V0czsKKyAqIHRlc3QgdGhlIGJvdHRvbS1vZi1zdGFjayBiaXQsIGFuZCB0aGVuIGNoZWNrIHRoZSB2ZXJzaW9uIG51bWJlcgorICogZmllbGQgaW4gdGhlIElQIGhlYWRlci4KKyAqLworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fbXBsc19saW5rdHlwZShwcm90bykKKwlpbnQgcHJvdG87Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxOworCisgICAgICAgIHN3aXRjaCAocHJvdG8pIHsKKworICAgICAgICBjYXNlIFFfSVA6CisgICAgICAgICAgICAgICAgLyogbWF0Y2ggdGhlIGJvdHRvbS1vZi1zdGFjayBiaXQgKi8KKyAgICAgICAgICAgICAgICBiMCA9IGdlbl9tY21wKE9SX05FVCwgLTIsIEJQRl9CLCAweDAxLCAweDAxKTsKKyAgICAgICAgICAgICAgICAvKiBtYXRjaCB0aGUgSVB2NCB2ZXJzaW9uIG51bWJlciAqLworICAgICAgICAgICAgICAgIGIxID0gZ2VuX21jbXAoT1JfTkVULCAwLCBCUEZfQiwgMHg0MCwgMHhmMCk7CisgICAgICAgICAgICAgICAgZ2VuX2FuZChiMCwgYjEpOworICAgICAgICAgICAgICAgIHJldHVybiBiMTsKKyAKKyAgICAgICBjYXNlIFFfSVBWNjoKKyAgICAgICAgICAgICAgICAvKiBtYXRjaCB0aGUgYm90dG9tLW9mLXN0YWNrIGJpdCAqLworICAgICAgICAgICAgICAgIGIwID0gZ2VuX21jbXAoT1JfTkVULCAtMiwgQlBGX0IsIDB4MDEsIDB4MDEpOworICAgICAgICAgICAgICAgIC8qIG1hdGNoIHRoZSBJUHY0IHZlcnNpb24gbnVtYmVyICovCisgICAgICAgICAgICAgICAgYjEgPSBnZW5fbWNtcChPUl9ORVQsIDAsIEJQRl9CLCAweDYwLCAweGYwKTsKKyAgICAgICAgICAgICAgICBnZW5fYW5kKGIwLCBiMSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGIxOworIAorICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9ob3N0KGFkZHIsIG1hc2ssIHByb3RvLCBkaXIsIHR5cGUpCisJYnBmX3VfaW50MzIgYWRkcjsKKwlicGZfdV9pbnQzMiBtYXNrOworCWludCBwcm90bzsKKwlpbnQgZGlyOworCWludCB0eXBlOworeworCXN0cnVjdCBibG9jayAqYjAsICpiMTsKKwljb25zdCBjaGFyICp0eXBlc3RyOworCisJaWYgKHR5cGUgPT0gUV9ORVQpCisJCXR5cGVzdHIgPSAibmV0IjsKKwllbHNlCisJCXR5cGVzdHIgPSAiaG9zdCI7CisKKwlzd2l0Y2ggKHByb3RvKSB7CisKKwljYXNlIFFfREVGQVVMVDoKKwkJYjAgPSBnZW5faG9zdChhZGRyLCBtYXNrLCBRX0lQLCBkaXIsIHR5cGUpOworCQkvKgorCQkgKiBPbmx5IGNoZWNrIGZvciBub24tSVB2NCBhZGRyZXNzZXMgaWYgd2UncmUgbm90CisJCSAqIGNoZWNraW5nIE1QTFMtZW5jYXBzdWxhdGVkIHBhY2tldHMuCisJCSAqLworCQlpZiAobGFiZWxfc3RhY2tfZGVwdGggPT0gMCkgeworCQkJYjEgPSBnZW5faG9zdChhZGRyLCBtYXNrLCBRX0FSUCwgZGlyLCB0eXBlKTsKKwkJCWdlbl9vcihiMCwgYjEpOworCQkJYjAgPSBnZW5faG9zdChhZGRyLCBtYXNrLCBRX1JBUlAsIGRpciwgdHlwZSk7CisJCQlnZW5fb3IoYjEsIGIwKTsKKwkJfQorCQlyZXR1cm4gYjA7CisKKwljYXNlIFFfSVA6CisJCXJldHVybiBnZW5faG9zdG9wKGFkZHIsIG1hc2ssIGRpciwgRVRIRVJUWVBFX0lQLCAxMiwgMTYpOworCisJY2FzZSBRX1JBUlA6CisJCXJldHVybiBnZW5faG9zdG9wKGFkZHIsIG1hc2ssIGRpciwgRVRIRVJUWVBFX1JFVkFSUCwgMTQsIDI0KTsKKworCWNhc2UgUV9BUlA6CisJCXJldHVybiBnZW5faG9zdG9wKGFkZHIsIG1hc2ssIGRpciwgRVRIRVJUWVBFX0FSUCwgMTQsIDI0KTsKKworCWNhc2UgUV9UQ1A6CisJCWJwZl9lcnJvcigiJ3RjcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX1NDVFA6CisJCWJwZl9lcnJvcigiJ3NjdHAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9VRFA6CisJCWJwZl9lcnJvcigiJ3VkcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX0lDTVA6CisJCWJwZl9lcnJvcigiJ2ljbXAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9JR01QOgorCQlicGZfZXJyb3IoIidpZ21wJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfSUdSUDoKKwkJYnBmX2Vycm9yKCInaWdycCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX1BJTToKKwkJYnBmX2Vycm9yKCIncGltJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfVlJSUDoKKwkJYnBmX2Vycm9yKCIndnJycCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX0NBUlA6CisJCWJwZl9lcnJvcigiJ2NhcnAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9BVEFMSzoKKwkJYnBmX2Vycm9yKCJBVEFMSyBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgUV9BQVJQOgorCQlicGZfZXJyb3IoIkFBUlAgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIFFfREVDTkVUOgorCQlyZXR1cm4gZ2VuX2RuaG9zdG9wKGFkZHIsIGRpcik7CisKKwljYXNlIFFfU0NBOgorCQlicGZfZXJyb3IoIlNDQSBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgUV9MQVQ6CisJCWJwZl9lcnJvcigiTEFUIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBRX01PUERMOgorCQlicGZfZXJyb3IoIk1PUERMIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBRX01PUFJDOgorCQlicGZfZXJyb3IoIk1PUFJDIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisjaWZkZWYgSU5FVDYKKwljYXNlIFFfSVBWNjoKKwkJYnBmX2Vycm9yKCInaXA2JyBtb2RpZmllciBhcHBsaWVkIHRvIGlwIGhvc3QiKTsKKworCWNhc2UgUV9JQ01QVjY6CisJCWJwZl9lcnJvcigiJ2ljbXA2JyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisjZW5kaWYgLyogSU5FVDYgKi8KKworCWNhc2UgUV9BSDoKKwkJYnBmX2Vycm9yKCInYWgnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9FU1A6CisJCWJwZl9lcnJvcigiJ2VzcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX0lTTzoKKwkJYnBmX2Vycm9yKCJJU08gaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIFFfRVNJUzoKKwkJYnBmX2Vycm9yKCInZXNpcycgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX0lTSVM6CisJCWJwZl9lcnJvcigiJ2lzaXMnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9DTE5QOgorCQlicGZfZXJyb3IoIidjbG5wJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfU1RQOgorCQlicGZfZXJyb3IoIidzdHAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9JUFg6CisJCWJwZl9lcnJvcigiSVBYIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBRX05FVEJFVUk6CisJCWJwZl9lcnJvcigiJ25ldGJldWknIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9SQURJTzoKKwkJYnBmX2Vycm9yKCIncmFkaW8nIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorCS8qIE5PVFJFQUNIRUQgKi8KK30KKworI2lmZGVmIElORVQ2CitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9ob3N0NihhZGRyLCBtYXNrLCBwcm90bywgZGlyLCB0eXBlKQorCXN0cnVjdCBpbjZfYWRkciAqYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgKm1hc2s7CisJaW50IHByb3RvOworCWludCBkaXI7CisJaW50IHR5cGU7Cit7CisJY29uc3QgY2hhciAqdHlwZXN0cjsKKworCWlmICh0eXBlID09IFFfTkVUKQorCQl0eXBlc3RyID0gIm5ldCI7CisJZWxzZQorCQl0eXBlc3RyID0gImhvc3QiOworCisJc3dpdGNoIChwcm90bykgeworCisJY2FzZSBRX0RFRkFVTFQ6CisJCXJldHVybiBnZW5faG9zdDYoYWRkciwgbWFzaywgUV9JUFY2LCBkaXIsIHR5cGUpOworCisJY2FzZSBRX0lQOgorCQlicGZfZXJyb3IoIidpcCcgbW9kaWZpZXIgYXBwbGllZCB0byBpcDYgJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9SQVJQOgorCQlicGZfZXJyb3IoIidyYXJwJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwNiAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX0FSUDoKKwkJYnBmX2Vycm9yKCInYXJwJyBtb2RpZmllciBhcHBsaWVkIHRvIGlwNiAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX1NDVFA6CisJCWJwZl9lcnJvcigiJ3NjdHAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9UQ1A6CisJCWJwZl9lcnJvcigiJ3RjcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX1VEUDoKKwkJYnBmX2Vycm9yKCIndWRwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfSUNNUDoKKwkJYnBmX2Vycm9yKCInaWNtcCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX0lHTVA6CisJCWJwZl9lcnJvcigiJ2lnbXAnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9JR1JQOgorCQlicGZfZXJyb3IoIidpZ3JwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfUElNOgorCQlicGZfZXJyb3IoIidwaW0nIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9WUlJQOgorCQlicGZfZXJyb3IoIid2cnJwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfQ0FSUDoKKwkJYnBmX2Vycm9yKCInY2FycCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX0FUQUxLOgorCQlicGZfZXJyb3IoIkFUQUxLIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBRX0FBUlA6CisJCWJwZl9lcnJvcigiQUFSUCBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgUV9ERUNORVQ6CisJCWJwZl9lcnJvcigiJ2RlY25ldCcgbW9kaWZpZXIgYXBwbGllZCB0byBpcDYgJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9TQ0E6CisJCWJwZl9lcnJvcigiU0NBIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBRX0xBVDoKKwkJYnBmX2Vycm9yKCJMQVQgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIFFfTU9QREw6CisJCWJwZl9lcnJvcigiTU9QREwgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIFFfTU9QUkM6CisJCWJwZl9lcnJvcigiTU9QUkMgaG9zdCBmaWx0ZXJpbmcgbm90IGltcGxlbWVudGVkIik7CisKKwljYXNlIFFfSVBWNjoKKwkJcmV0dXJuIGdlbl9ob3N0b3A2KGFkZHIsIG1hc2ssIGRpciwgRVRIRVJUWVBFX0lQVjYsIDgsIDI0KTsKKworCWNhc2UgUV9JQ01QVjY6CisJCWJwZl9lcnJvcigiJ2ljbXA2JyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfQUg6CisJCWJwZl9lcnJvcigiJ2FoJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfRVNQOgorCQlicGZfZXJyb3IoIidlc3AnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9JU086CisJCWJwZl9lcnJvcigiSVNPIGhvc3QgZmlsdGVyaW5nIG5vdCBpbXBsZW1lbnRlZCIpOworCisJY2FzZSBRX0VTSVM6CisJCWJwZl9lcnJvcigiJ2VzaXMnIG1vZGlmaWVyIGFwcGxpZWQgdG8gJXMiLCB0eXBlc3RyKTsKKworCWNhc2UgUV9JU0lTOgorCQlicGZfZXJyb3IoIidpc2lzJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfQ0xOUDoKKwkJYnBmX2Vycm9yKCInY2xucCcgbW9kaWZpZXIgYXBwbGllZCB0byAlcyIsIHR5cGVzdHIpOworCisJY2FzZSBRX1NUUDoKKwkJYnBmX2Vycm9yKCInc3RwJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfSVBYOgorCQlicGZfZXJyb3IoIklQWCBob3N0IGZpbHRlcmluZyBub3QgaW1wbGVtZW50ZWQiKTsKKworCWNhc2UgUV9ORVRCRVVJOgorCQlicGZfZXJyb3IoIiduZXRiZXVpJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwljYXNlIFFfUkFESU86CisJCWJwZl9lcnJvcigiJ3JhZGlvJyBtb2RpZmllciBhcHBsaWVkIHRvICVzIiwgdHlwZXN0cik7CisKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CisjZW5kaWYgLypJTkVUNiovCisKKyNpZm5kZWYgSU5FVDYKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX2dhdGV3YXkoZWFkZHIsIGFsaXN0LCBwcm90bywgZGlyKQorCWNvbnN0IHVfY2hhciAqZWFkZHI7CisJYnBmX3VfaW50MzIgKiphbGlzdDsKKwlpbnQgcHJvdG87CisJaW50IGRpcjsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICp0bXA7CisKKwlpZiAoZGlyICE9IDApCisJCWJwZl9lcnJvcigiZGlyZWN0aW9uIGFwcGxpZWQgdG8gJ2dhdGV3YXknIik7CisKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBRX0RFRkFVTFQ6CisJY2FzZSBRX0lQOgorCWNhc2UgUV9BUlA6CisJY2FzZSBRX1JBUlA6CisJCXN3aXRjaCAobGlua3R5cGUpIHsKKwkJY2FzZSBETFRfRU4xME1COgorCQljYXNlIERMVF9ORVRBTkFMWVpFUjoKKwkJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CisJCQliMCA9IGdlbl9laG9zdG9wKGVhZGRyLCBRX09SKTsKKwkJCWJyZWFrOworCQljYXNlIERMVF9GRERJOgorCQkJYjAgPSBnZW5fZmhvc3RvcChlYWRkciwgUV9PUik7CisJCQlicmVhazsKKwkJY2FzZSBETFRfSUVFRTgwMjoKKwkJCWIwID0gZ2VuX3Rob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYnJlYWs7CisJCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCWNhc2UgRExUX1BQSToKKwkJCWIwID0gZ2VuX3dsYW5ob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYnJlYWs7CisJCWNhc2UgRExUX1NVTkFUTToKKwkJCWlmICghaXNfbGFuZSkKKwkJCQlicGZfZXJyb3IoCisJCQkJICAgICInZ2F0ZXdheScgc3VwcG9ydGVkIG9ubHkgb24gZXRoZXJuZXQvRkRESS90b2tlbiByaW5nLzgwMi4xMS9BVE0gTEFORS9GaWJyZSBDaGFubmVsIik7CisJCQkvKgorCQkJICogQ2hlY2sgdGhhdCB0aGUgcGFja2V0IGRvZXNuJ3QgYmVnaW4gd2l0aCBhbgorCQkJICogTEUgQ29udHJvbCBtYXJrZXIuICAoV2UndmUgYWxyZWFkeSBnZW5lcmF0ZWQKKwkJCSAqIGEgdGVzdCBmb3IgTEFORS4pCisJCQkgKi8KKwkJCWIxID0gZ2VuX2NtcChPUl9MSU5LLCBTVU5BVE1fUEtUX0JFR0lOX1BPUywKKwkJCSAgICBCUEZfSCwgMHhGRjAwKTsKKwkJCWdlbl9ub3QoYjEpOworCisJCQkvKgorCQkJICogTm93IGNoZWNrIHRoZSBNQUMgYWRkcmVzcy4KKwkJCSAqLworCQkJYjAgPSBnZW5fZWhvc3RvcChlYWRkciwgUV9PUik7CisJCQlnZW5fYW5kKGIxLCBiMCk7CisJCQlicmVhazsKKwkJY2FzZSBETFRfSVBfT1ZFUl9GQzoKKwkJCWIwID0gZ2VuX2lwZmNob3N0b3AoZWFkZHIsIFFfT1IpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicGZfZXJyb3IoCisJCQkgICAgIidnYXRld2F5JyBzdXBwb3J0ZWQgb25seSBvbiBldGhlcm5ldC9GRERJL3Rva2VuIHJpbmcvODAyLjExL0FUTSBMQU5FL0ZpYnJlIENoYW5uZWwiKTsKKwkJfQorCQliMSA9IGdlbl9ob3N0KCoqYWxpc3QrKywgMHhmZmZmZmZmZiwgcHJvdG8sIFFfT1IsIFFfSE9TVCk7CisJCXdoaWxlICgqYWxpc3QpIHsKKwkJCXRtcCA9IGdlbl9ob3N0KCoqYWxpc3QrKywgMHhmZmZmZmZmZiwgcHJvdG8sIFFfT1IsCisJCQkgICAgUV9IT1NUKTsKKwkJCWdlbl9vcihiMSwgdG1wKTsKKwkJCWIxID0gdG1wOworCQl9CisJCWdlbl9ub3QoYjEpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKwl9CisJYnBmX2Vycm9yKCJpbGxlZ2FsIG1vZGlmaWVyIG9mICdnYXRld2F5JyIpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKyNlbmRpZgorCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3Byb3RvX2FiYnJldihwcm90bykKKwlpbnQgcHJvdG87Cit7CisJc3RydWN0IGJsb2NrICpiMDsKKwlzdHJ1Y3QgYmxvY2sgKmIxOworCisJc3dpdGNoIChwcm90bykgeworCisJY2FzZSBRX1NDVFA6CisJCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fU0NUUCwgUV9JUCwgUV9ERUZBVUxUKTsKKyNpZmRlZiBJTkVUNgorCQliMCA9IGdlbl9wcm90byhJUFBST1RPX1NDVFAsIFFfSVBWNiwgUV9ERUZBVUxUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisjZW5kaWYKKwkJYnJlYWs7CisKKwljYXNlIFFfVENQOgorCQliMSA9IGdlbl9wcm90byhJUFBST1RPX1RDUCwgUV9JUCwgUV9ERUZBVUxUKTsKKyNpZmRlZiBJTkVUNgorCQliMCA9IGdlbl9wcm90byhJUFBST1RPX1RDUCwgUV9JUFY2LCBRX0RFRkFVTFQpOworCQlnZW5fb3IoYjAsIGIxKTsKKyNlbmRpZgorCQlicmVhazsKKworCWNhc2UgUV9VRFA6CisJCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fVURQLCBRX0lQLCBRX0RFRkFVTFQpOworI2lmZGVmIElORVQ2CisJCWIwID0gZ2VuX3Byb3RvKElQUFJPVE9fVURQLCBRX0lQVjYsIFFfREVGQVVMVCk7CisJCWdlbl9vcihiMCwgYjEpOworI2VuZGlmCisJCWJyZWFrOworCisJY2FzZSBRX0lDTVA6CisJCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fSUNNUCwgUV9JUCwgUV9ERUZBVUxUKTsKKwkJYnJlYWs7CisKKyNpZm5kZWYJSVBQUk9UT19JR01QCisjZGVmaW5lCUlQUFJPVE9fSUdNUAkyCisjZW5kaWYKKworCWNhc2UgUV9JR01QOgorCQliMSA9IGdlbl9wcm90byhJUFBST1RPX0lHTVAsIFFfSVAsIFFfREVGQVVMVCk7CisJCWJyZWFrOworCisjaWZuZGVmCUlQUFJPVE9fSUdSUAorI2RlZmluZQlJUFBST1RPX0lHUlAJOQorI2VuZGlmCisJY2FzZSBRX0lHUlA6CisJCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fSUdSUCwgUV9JUCwgUV9ERUZBVUxUKTsKKwkJYnJlYWs7CisKKyNpZm5kZWYgSVBQUk9UT19QSU0KKyNkZWZpbmUgSVBQUk9UT19QSU0JMTAzCisjZW5kaWYKKworCWNhc2UgUV9QSU06CisJCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fUElNLCBRX0lQLCBRX0RFRkFVTFQpOworI2lmZGVmIElORVQ2CisJCWIwID0gZ2VuX3Byb3RvKElQUFJPVE9fUElNLCBRX0lQVjYsIFFfREVGQVVMVCk7CisJCWdlbl9vcihiMCwgYjEpOworI2VuZGlmCisJCWJyZWFrOworCisjaWZuZGVmIElQUFJPVE9fVlJSUAorI2RlZmluZSBJUFBST1RPX1ZSUlAJMTEyCisjZW5kaWYKKworCWNhc2UgUV9WUlJQOgorCQliMSA9IGdlbl9wcm90byhJUFBST1RPX1ZSUlAsIFFfSVAsIFFfREVGQVVMVCk7CisJCWJyZWFrOworCisjaWZuZGVmIElQUFJPVE9fQ0FSUAorI2RlZmluZSBJUFBST1RPX0NBUlAJMTEyCisjZW5kaWYKKworCWNhc2UgUV9DQVJQOgorCQliMSA9IGdlbl9wcm90byhJUFBST1RPX0NBUlAsIFFfSVAsIFFfREVGQVVMVCk7CisJCWJyZWFrOworCisJY2FzZSBRX0lQOgorCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0lQKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQVJQOgorCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0FSUCk7CisJCWJyZWFrOworCisJY2FzZSBRX1JBUlA6CisJCWIxID0gIGdlbl9saW5rdHlwZShFVEhFUlRZUEVfUkVWQVJQKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfTElOSzoKKwkJYnBmX2Vycm9yKCJsaW5rIGxheWVyIGFwcGxpZWQgaW4gd3JvbmcgY29udGV4dCIpOworCisJY2FzZSBRX0FUQUxLOgorCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0FUQUxLKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQUFSUDoKKwkJYjEgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9BQVJQKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfREVDTkVUOgorCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0ROKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfU0NBOgorCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX1NDQSk7CisJCWJyZWFrOworCisJY2FzZSBRX0xBVDoKKwkJYjEgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9MQVQpOworCQlicmVhazsKKworCWNhc2UgUV9NT1BETDoKKwkJYjEgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9NT1BETCk7CisJCWJyZWFrOworCisJY2FzZSBRX01PUFJDOgorCQliMSA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX01PUFJDKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBJTkVUNgorCWNhc2UgUV9JUFY2OgorCQliMSA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVBWNik7CisJCWJyZWFrOworCisjaWZuZGVmIElQUFJPVE9fSUNNUFY2CisjZGVmaW5lIElQUFJPVE9fSUNNUFY2CTU4CisjZW5kaWYKKwljYXNlIFFfSUNNUFY2OgorCQliMSA9IGdlbl9wcm90byhJUFBST1RPX0lDTVBWNiwgUV9JUFY2LCBRX0RFRkFVTFQpOworCQlicmVhazsKKyNlbmRpZiAvKiBJTkVUNiAqLworCisjaWZuZGVmIElQUFJPVE9fQUgKKyNkZWZpbmUgSVBQUk9UT19BSAk1MQorI2VuZGlmCisJY2FzZSBRX0FIOgorCQliMSA9IGdlbl9wcm90byhJUFBST1RPX0FILCBRX0lQLCBRX0RFRkFVTFQpOworI2lmZGVmIElORVQ2CisJCWIwID0gZ2VuX3Byb3RvKElQUFJPVE9fQUgsIFFfSVBWNiwgUV9ERUZBVUxUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisjZW5kaWYKKwkJYnJlYWs7CisKKyNpZm5kZWYgSVBQUk9UT19FU1AKKyNkZWZpbmUgSVBQUk9UT19FU1AJNTAKKyNlbmRpZgorCWNhc2UgUV9FU1A6CisJCWIxID0gZ2VuX3Byb3RvKElQUFJPVE9fRVNQLCBRX0lQLCBRX0RFRkFVTFQpOworI2lmZGVmIElORVQ2CisJCWIwID0gZ2VuX3Byb3RvKElQUFJPVE9fRVNQLCBRX0lQVjYsIFFfREVGQVVMVCk7CisJCWdlbl9vcihiMCwgYjEpOworI2VuZGlmCisJCWJyZWFrOworCisJY2FzZSBRX0lTTzoKKwkJYjEgPSBnZW5fbGlua3R5cGUoTExDU0FQX0lTT05TKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfRVNJUzoKKwkJYjEgPSBnZW5fcHJvdG8oSVNPOTU0Ml9FU0lTLCBRX0lTTywgUV9ERUZBVUxUKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfSVNJUzoKKwkJYjEgPSBnZW5fcHJvdG8oSVNPMTA1ODlfSVNJUywgUV9JU08sIFFfREVGQVVMVCk7CisJCWJyZWFrOworCisJY2FzZSBRX0lTSVNfTDE6IC8qIGFsbCBJUy1JUyBMZXZlbDEgUERVLVR5cGVzICovCisJCWIwID0gZ2VuX3Byb3RvKElTSVNfTDFfTEFOX0lJSCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQliMSA9IGdlbl9wcm90byhJU0lTX1BUUF9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsgLyogRklYTUUgZXh0cmFjdCB0aGUgY2lyY3VpdC10eXBlIGJpdHMgKi8KKwkJZ2VuX29yKGIwLCBiMSk7CisJCWIwID0gZ2VuX3Byb3RvKElTSVNfTDFfTFNQLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX0NTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCWIwID0gZ2VuX3Byb3RvKElTSVNfTDFfUFNOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfSVNJU19MMjogLyogYWxsIElTLUlTIExldmVsMiBQRFUtVHlwZXMgKi8KKwkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMl9MQU5fSUlILCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKElTSVNfUFRQX0lJSCwgUV9JU0lTLCBRX0RFRkFVTFQpOyAvKiBGSVhNRSBleHRyYWN0IHRoZSBjaXJjdWl0LXR5cGUgYml0cyAqLworCQlnZW5fb3IoYjAsIGIxKTsKKwkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMl9MU1AsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCWIwID0gZ2VuX3Byb3RvKElTSVNfTDJfQ1NOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMl9QU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQlicmVhazsKKworCWNhc2UgUV9JU0lTX0lJSDogLyogYWxsIElTLUlTIEhlbGxvIFBEVS1UeXBlcyAqLworCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX0xBTl9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJYjEgPSBnZW5fcHJvdG8oSVNJU19MMl9MQU5fSUlILCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9wcm90byhJU0lTX1BUUF9JSUgsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCWJyZWFrOworCisJY2FzZSBRX0lTSVNfTFNQOgorCQliMCA9IGdlbl9wcm90byhJU0lTX0wxX0xTUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQliMSA9IGdlbl9wcm90byhJU0lTX0wyX0xTUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfSVNJU19TTlA6CisJCWIwID0gZ2VuX3Byb3RvKElTSVNfTDFfQ1NOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQliMSA9IGdlbl9wcm90byhJU0lTX0wyX0NTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCWIwID0gZ2VuX3Byb3RvKElTSVNfTDFfUFNOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMl9QU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQlicmVhazsKKworCWNhc2UgUV9JU0lTX0NTTlA6CisJCWIwID0gZ2VuX3Byb3RvKElTSVNfTDFfQ1NOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQliMSA9IGdlbl9wcm90byhJU0lTX0wyX0NTTlAsIFFfSVNJUywgUV9ERUZBVUxUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCWJyZWFrOworCisJY2FzZSBRX0lTSVNfUFNOUDoKKwkJYjAgPSBnZW5fcHJvdG8oSVNJU19MMV9QU05QLCBRX0lTSVMsIFFfREVGQVVMVCk7CisJCWIxID0gZ2VuX3Byb3RvKElTSVNfTDJfUFNOUCwgUV9JU0lTLCBRX0RFRkFVTFQpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQ0xOUDoKKwkJYjEgPSBnZW5fcHJvdG8oSVNPODQ3M19DTE5QLCBRX0lTTywgUV9ERUZBVUxUKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfU1RQOgorCQliMSA9IGdlbl9saW5rdHlwZShMTENTQVBfODAyMUQpOworCQlicmVhazsKKworCWNhc2UgUV9JUFg6CisJCWIxID0gZ2VuX2xpbmt0eXBlKExMQ1NBUF9JUFgpOworCQlicmVhazsKKworCWNhc2UgUV9ORVRCRVVJOgorCQliMSA9IGdlbl9saW5rdHlwZShMTENTQVBfTkVUQkVVSSk7CisJCWJyZWFrOworCisJY2FzZSBRX1JBRElPOgorCQlicGZfZXJyb3IoIidyYWRpbycgaXMgbm90IGEgdmFsaWQgcHJvdG9jb2wgdHlwZSIpOworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisJcmV0dXJuIGIxOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9pcGZyYWcoKQoreworCXN0cnVjdCBzbGlzdCAqczsKKwlzdHJ1Y3QgYmxvY2sgKmI7CisKKwkvKiBub3QgSVB2NCBmcmFnIG90aGVyIHRoYW4gdGhlIGZpcnN0IGZyYWcgKi8KKwlzID0gZ2VuX2xvYWRfYShPUl9ORVQsIDYsIEJQRl9IKTsKKwliID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCWItPnMuayA9IDB4MWZmZjsKKwliLT5zdG10cyA9IHM7CisJZ2VuX25vdChiKTsKKworCXJldHVybiBiOworfQorCisvKgorICogR2VuZXJhdGUgYSBjb21wYXJpc29uIHRvIGEgcG9ydCB2YWx1ZSBpbiB0aGUgdHJhbnNwb3J0LWxheWVyIGhlYWRlcgorICogYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoYXQgaGVhZGVyLgorICoKKyAqIFhYWCAtIHRoaXMgaGFuZGxlcyBhIHZhcmlhYmxlLWxlbmd0aCBwcmVmaXggcHJlY2VkaW5nIHRoZSBsaW5rLWxheWVyCisgKiBoZWFkZXIsIHN1Y2ggYXMgdGhlIHJhZGlvdGFwIG9yIEFWUyByYWRpbyBwcmVmaXgsIGJ1dCBkb2Vzbid0IGhhbmRsZQorICogdmFyaWFibGUtbGVuZ3RoIGxpbmstbGF5ZXIgaGVhZGVycyAoc3VjaCBhcyBUb2tlbiBSaW5nIG9yIDgwMi4xMQorICogaGVhZGVycykuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BvcnRhdG9tKG9mZiwgdikKKwlpbnQgb2ZmOworCWJwZl9pbnQzMiB2OworeworCXJldHVybiBnZW5fY21wKE9SX1RSQU5fSVBWNCwgb2ZmLCBCUEZfSCwgdik7Cit9CisKKyNpZmRlZiBJTkVUNgorc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fcG9ydGF0b202KG9mZiwgdikKKwlpbnQgb2ZmOworCWJwZl9pbnQzMiB2OworeworCXJldHVybiBnZW5fY21wKE9SX1RSQU5fSVBWNiwgb2ZmLCBCUEZfSCwgdik7Cit9CisjZW5kaWYvKklORVQ2Ki8KKworc3RydWN0IGJsb2NrICoKK2dlbl9wb3J0b3AocG9ydCwgcHJvdG8sIGRpcikKKwlpbnQgcG9ydCwgcHJvdG8sIGRpcjsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICp0bXA7CisKKwkvKiBpcCBwcm90byAncHJvdG8nIGFuZCBub3QgYSBmcmFnbWVudCBvdGhlciB0aGFuIHRoZSBmaXJzdCBmcmFnbWVudCAqLworCXRtcCA9IGdlbl9jbXAoT1JfTkVULCA5LCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7CisJYjAgPSBnZW5faXBmcmFnKCk7CisJZ2VuX2FuZCh0bXAsIGIwKTsKKworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSBRX1NSQzoKKwkJYjEgPSBnZW5fcG9ydGF0b20oMCwgKGJwZl9pbnQzMilwb3J0KTsKKwkJYnJlYWs7CisKKwljYXNlIFFfRFNUOgorCQliMSA9IGdlbl9wb3J0YXRvbSgyLCAoYnBmX2ludDMyKXBvcnQpOworCQlicmVhazsKKworCWNhc2UgUV9PUjoKKwljYXNlIFFfREVGQVVMVDoKKwkJdG1wID0gZ2VuX3BvcnRhdG9tKDAsIChicGZfaW50MzIpcG9ydCk7CisJCWIxID0gZ2VuX3BvcnRhdG9tKDIsIChicGZfaW50MzIpcG9ydCk7CisJCWdlbl9vcih0bXAsIGIxKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfQU5EOgorCQl0bXAgPSBnZW5fcG9ydGF0b20oMCwgKGJwZl9pbnQzMilwb3J0KTsKKwkJYjEgPSBnZW5fcG9ydGF0b20oMiwgKGJwZl9pbnQzMilwb3J0KTsKKwkJZ2VuX2FuZCh0bXAsIGIxKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKwlnZW5fYW5kKGIwLCBiMSk7CisKKwlyZXR1cm4gYjE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BvcnQocG9ydCwgaXBfcHJvdG8sIGRpcikKKwlpbnQgcG9ydDsKKwlpbnQgaXBfcHJvdG87CisJaW50IGRpcjsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICp0bXA7CisKKwkvKgorCSAqIGV0aGVyIHByb3RvIGlwCisJICoKKwkgKiBGb3IgRkRESSwgUkZDIDExODggc2F5cyB0aGF0IFNOQVAgZW5jYXBzdWxhdGlvbiBpcyB1c2VkLAorCSAqIG5vdCBMTEMgZW5jYXBzdWxhdGlvbiB3aXRoIExMQ1NBUF9JUC4KKwkgKgorCSAqIEZvciBJRUVFIDgwMiBuZXR3b3JrcyAtIHdoaWNoIGluY2x1ZGVzIDgwMi41IHRva2VuIHJpbmcKKwkgKiAod2hpY2ggaXMgd2hhdCBETFRfSUVFRTgwMiBtZWFucykgYW5kIDgwMi4xMSAtIFJGQyAxMDQyCisJICogc2F5cyB0aGF0IFNOQVAgZW5jYXBzdWxhdGlvbiBpcyB1c2VkLCBub3QgTExDIGVuY2Fwc3VsYXRpb24KKwkgKiB3aXRoIExMQ1NBUF9JUC4KKwkgKgorCSAqIEZvciBMTEMtZW5jYXBzdWxhdGVkIEFUTS8iQ2xhc3NpY2FsIElQIiwgUkZDIDE0ODMgYW5kCisJICogUkZDIDIyMjUgc2F5IHRoYXQgU05BUCBlbmNhcHN1bGF0aW9uIGlzIHVzZWQsIG5vdCBMTEMKKwkgKiBlbmNhcHN1bGF0aW9uIHdpdGggTExDU0FQX0lQLgorCSAqCisJICogU28gd2UgYWx3YXlzIGNoZWNrIGZvciBFVEhFUlRZUEVfSVAuCisJICovCisJYjAgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUCk7CisKKwlzd2l0Y2ggKGlwX3Byb3RvKSB7CisJY2FzZSBJUFBST1RPX1VEUDoKKwljYXNlIElQUFJPVE9fVENQOgorCWNhc2UgSVBQUk9UT19TQ1RQOgorCQliMSA9IGdlbl9wb3J0b3AocG9ydCwgaXBfcHJvdG8sIGRpcik7CisJCWJyZWFrOworCisJY2FzZSBQUk9UT19VTkRFRjoKKwkJdG1wID0gZ2VuX3BvcnRvcChwb3J0LCBJUFBST1RPX1RDUCwgZGlyKTsKKwkJYjEgPSBnZW5fcG9ydG9wKHBvcnQsIElQUFJPVE9fVURQLCBkaXIpOworCQlnZW5fb3IodG1wLCBiMSk7CisJCXRtcCA9IGdlbl9wb3J0b3AocG9ydCwgSVBQUk9UT19TQ1RQLCBkaXIpOworCQlnZW5fb3IodG1wLCBiMSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisJZ2VuX2FuZChiMCwgYjEpOworCXJldHVybiBiMTsKK30KKworI2lmZGVmIElORVQ2CitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BvcnRvcDYocG9ydCwgcHJvdG8sIGRpcikKKwlpbnQgcG9ydCwgcHJvdG8sIGRpcjsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjEsICp0bXA7CisKKwkvKiBpcDYgcHJvdG8gJ3Byb3RvJyAqLworCS8qIFhYWCAtIGNhdGNoIHRoZSBmaXJzdCBmcmFnbWVudCBvZiBhIGZyYWdtZW50ZWQgcGFja2V0PyAqLworCWIwID0gZ2VuX2NtcChPUl9ORVQsIDYsIEJQRl9CLCAoYnBmX2ludDMyKXByb3RvKTsKKworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSBRX1NSQzoKKwkJYjEgPSBnZW5fcG9ydGF0b202KDAsIChicGZfaW50MzIpcG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBRX0RTVDoKKwkJYjEgPSBnZW5fcG9ydGF0b202KDIsIChicGZfaW50MzIpcG9ydCk7CisJCWJyZWFrOworCisJY2FzZSBRX09SOgorCWNhc2UgUV9ERUZBVUxUOgorCQl0bXAgPSBnZW5fcG9ydGF0b202KDAsIChicGZfaW50MzIpcG9ydCk7CisJCWIxID0gZ2VuX3BvcnRhdG9tNigyLCAoYnBmX2ludDMyKXBvcnQpOworCQlnZW5fb3IodG1wLCBiMSk7CisJCWJyZWFrOworCisJY2FzZSBRX0FORDoKKwkJdG1wID0gZ2VuX3BvcnRhdG9tNigwLCAoYnBmX2ludDMyKXBvcnQpOworCQliMSA9IGdlbl9wb3J0YXRvbTYoMiwgKGJwZl9pbnQzMilwb3J0KTsKKwkJZ2VuX2FuZCh0bXAsIGIxKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKwlnZW5fYW5kKGIwLCBiMSk7CisKKwlyZXR1cm4gYjE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BvcnQ2KHBvcnQsIGlwX3Byb3RvLCBkaXIpCisJaW50IHBvcnQ7CisJaW50IGlwX3Byb3RvOworCWludCBkaXI7Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxLCAqdG1wOworCisJLyogbGluayBwcm90byBpcDYgKi8KKwliMCA9ICBnZW5fbGlua3R5cGUoRVRIRVJUWVBFX0lQVjYpOworCisJc3dpdGNoIChpcF9wcm90bykgeworCWNhc2UgSVBQUk9UT19VRFA6CisJY2FzZSBJUFBST1RPX1RDUDoKKwljYXNlIElQUFJPVE9fU0NUUDoKKwkJYjEgPSBnZW5fcG9ydG9wNihwb3J0LCBpcF9wcm90bywgZGlyKTsKKwkJYnJlYWs7CisKKwljYXNlIFBST1RPX1VOREVGOgorCQl0bXAgPSBnZW5fcG9ydG9wNihwb3J0LCBJUFBST1RPX1RDUCwgZGlyKTsKKwkJYjEgPSBnZW5fcG9ydG9wNihwb3J0LCBJUFBST1RPX1VEUCwgZGlyKTsKKwkJZ2VuX29yKHRtcCwgYjEpOworCQl0bXAgPSBnZW5fcG9ydG9wNihwb3J0LCBJUFBST1RPX1NDVFAsIGRpcik7CisJCWdlbl9vcih0bXAsIGIxKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKwlnZW5fYW5kKGIwLCBiMSk7CisJcmV0dXJuIGIxOworfQorI2VuZGlmIC8qIElORVQ2ICovCisKKy8qIGdlbl9wb3J0cmFuZ2UgY29kZSAqLworc3RhdGljIHN0cnVjdCBibG9jayAqCitnZW5fcG9ydHJhbmdlYXRvbShvZmYsIHYxLCB2MikKKwlpbnQgb2ZmOworCWJwZl9pbnQzMiB2MSwgdjI7Cit7CisJc3RydWN0IGJsb2NrICpiMSwgKmIyOworCisJaWYgKHYxID4gdjIpIHsKKwkJLyoKKwkJICogUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIHBvcnRzLCBzbyB2MSBpcyB0aGUgbG93ZXIgb25lLgorCQkgKi8KKwkJYnBmX2ludDMyIHZ0ZW1wOworCisJCXZ0ZW1wID0gdjE7CisJCXYxID0gdjI7CisJCXYyID0gdnRlbXA7CisJfQorCisJYjEgPSBnZW5fY21wX2dlKE9SX1RSQU5fSVBWNCwgb2ZmLCBCUEZfSCwgdjEpOworCWIyID0gZ2VuX2NtcF9sZShPUl9UUkFOX0lQVjQsIG9mZiwgQlBGX0gsIHYyKTsKKworCWdlbl9hbmQoYjEsIGIyKTsgCisKKwlyZXR1cm4gYjI7Cit9CisKK3N0cnVjdCBibG9jayAqCitnZW5fcG9ydHJhbmdlb3AocG9ydDEsIHBvcnQyLCBwcm90bywgZGlyKQorCWludCBwb3J0MSwgcG9ydDI7CisJaW50IHByb3RvOworCWludCBkaXI7Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxLCAqdG1wOworCisJLyogaXAgcHJvdG8gJ3Byb3RvJyBhbmQgbm90IGEgZnJhZ21lbnQgb3RoZXIgdGhhbiB0aGUgZmlyc3QgZnJhZ21lbnQgKi8KKwl0bXAgPSBnZW5fY21wKE9SX05FVCwgOSwgQlBGX0IsIChicGZfaW50MzIpcHJvdG8pOworCWIwID0gZ2VuX2lwZnJhZygpOworCWdlbl9hbmQodG1wLCBiMCk7CisKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgUV9TUkM6CisJCWIxID0gZ2VuX3BvcnRyYW5nZWF0b20oMCwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CisJCWJyZWFrOworCisJY2FzZSBRX0RTVDoKKwkJYjEgPSBnZW5fcG9ydHJhbmdlYXRvbSgyLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKKwkJYnJlYWs7CisKKwljYXNlIFFfT1I6CisJY2FzZSBRX0RFRkFVTFQ6CisJCXRtcCA9IGdlbl9wb3J0cmFuZ2VhdG9tKDAsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQliMSA9IGdlbl9wb3J0cmFuZ2VhdG9tKDIsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQlnZW5fb3IodG1wLCBiMSk7CisJCWJyZWFrOworCisJY2FzZSBRX0FORDoKKwkJdG1wID0gZ2VuX3BvcnRyYW5nZWF0b20oMCwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CisJCWIxID0gZ2VuX3BvcnRyYW5nZWF0b20oMiwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CisJCWdlbl9hbmQodG1wLCBiMSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisJZ2VuX2FuZChiMCwgYjEpOworCisJcmV0dXJuIGIxOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9wb3J0cmFuZ2UocG9ydDEsIHBvcnQyLCBpcF9wcm90bywgZGlyKQorCWludCBwb3J0MSwgcG9ydDI7CisJaW50IGlwX3Byb3RvOworCWludCBkaXI7Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxLCAqdG1wOworCisJLyogbGluayBwcm90byBpcCAqLworCWIwID0gIGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVApOworCisJc3dpdGNoIChpcF9wcm90bykgeworCWNhc2UgSVBQUk9UT19VRFA6CisJY2FzZSBJUFBST1RPX1RDUDoKKwljYXNlIElQUFJPVE9fU0NUUDoKKwkJYjEgPSBnZW5fcG9ydHJhbmdlb3AocG9ydDEsIHBvcnQyLCBpcF9wcm90bywgZGlyKTsKKwkJYnJlYWs7CisKKwljYXNlIFBST1RPX1VOREVGOgorCQl0bXAgPSBnZW5fcG9ydHJhbmdlb3AocG9ydDEsIHBvcnQyLCBJUFBST1RPX1RDUCwgZGlyKTsKKwkJYjEgPSBnZW5fcG9ydHJhbmdlb3AocG9ydDEsIHBvcnQyLCBJUFBST1RPX1VEUCwgZGlyKTsKKwkJZ2VuX29yKHRtcCwgYjEpOworCQl0bXAgPSBnZW5fcG9ydHJhbmdlb3AocG9ydDEsIHBvcnQyLCBJUFBST1RPX1NDVFAsIGRpcik7CisJCWdlbl9vcih0bXAsIGIxKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKwlnZW5fYW5kKGIwLCBiMSk7CisJcmV0dXJuIGIxOworfQorCisjaWZkZWYgSU5FVDYKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BvcnRyYW5nZWF0b202KG9mZiwgdjEsIHYyKQorCWludCBvZmY7CisJYnBmX2ludDMyIHYxLCB2MjsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIxLCAqYjI7CisKKwlpZiAodjEgPiB2MikgeworCQkvKgorCQkgKiBSZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgcG9ydHMsIHNvIHYxIGlzIHRoZSBsb3dlciBvbmUuCisJCSAqLworCQlicGZfaW50MzIgdnRlbXA7CisKKwkJdnRlbXAgPSB2MTsKKwkJdjEgPSB2MjsKKwkJdjIgPSB2dGVtcDsKKwl9CisKKwliMSA9IGdlbl9jbXBfZ2UoT1JfVFJBTl9JUFY2LCBvZmYsIEJQRl9ILCB2MSk7CisJYjIgPSBnZW5fY21wX2xlKE9SX1RSQU5fSVBWNiwgb2ZmLCBCUEZfSCwgdjIpOworCisJZ2VuX2FuZChiMSwgYjIpOyAKKworCXJldHVybiBiMjsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9wb3J0cmFuZ2VvcDYocG9ydDEsIHBvcnQyLCBwcm90bywgZGlyKQorCWludCBwb3J0MSwgcG9ydDI7CisJaW50IHByb3RvOworCWludCBkaXI7Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxLCAqdG1wOworCisJLyogaXA2IHByb3RvICdwcm90bycgKi8KKwkvKiBYWFggLSBjYXRjaCB0aGUgZmlyc3QgZnJhZ21lbnQgb2YgYSBmcmFnbWVudGVkIHBhY2tldD8gKi8KKwliMCA9IGdlbl9jbXAoT1JfTkVULCA2LCBCUEZfQiwgKGJwZl9pbnQzMilwcm90byk7CisKKwlzd2l0Y2ggKGRpcikgeworCWNhc2UgUV9TUkM6CisJCWIxID0gZ2VuX3BvcnRyYW5nZWF0b202KDAsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQlicmVhazsKKworCWNhc2UgUV9EU1Q6CisJCWIxID0gZ2VuX3BvcnRyYW5nZWF0b202KDIsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQlicmVhazsKKworCWNhc2UgUV9PUjoKKwljYXNlIFFfREVGQVVMVDoKKwkJdG1wID0gZ2VuX3BvcnRyYW5nZWF0b202KDAsIChicGZfaW50MzIpcG9ydDEsIChicGZfaW50MzIpcG9ydDIpOworCQliMSA9IGdlbl9wb3J0cmFuZ2VhdG9tNigyLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKKwkJZ2VuX29yKHRtcCwgYjEpOworCQlicmVhazsKKworCWNhc2UgUV9BTkQ6CisJCXRtcCA9IGdlbl9wb3J0cmFuZ2VhdG9tNigwLCAoYnBmX2ludDMyKXBvcnQxLCAoYnBmX2ludDMyKXBvcnQyKTsKKwkJYjEgPSBnZW5fcG9ydHJhbmdlYXRvbTYoMiwgKGJwZl9pbnQzMilwb3J0MSwgKGJwZl9pbnQzMilwb3J0Mik7CisJCWdlbl9hbmQodG1wLCBiMSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisJZ2VuX2FuZChiMCwgYjEpOworCisJcmV0dXJuIGIxOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9wb3J0cmFuZ2U2KHBvcnQxLCBwb3J0MiwgaXBfcHJvdG8sIGRpcikKKwlpbnQgcG9ydDEsIHBvcnQyOworCWludCBpcF9wcm90bzsKKwlpbnQgZGlyOworeworCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKnRtcDsKKworCS8qIGxpbmsgcHJvdG8gaXA2ICovCisJYjAgPSAgZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUFY2KTsKKworCXN3aXRjaCAoaXBfcHJvdG8pIHsKKwljYXNlIElQUFJPVE9fVURQOgorCWNhc2UgSVBQUk9UT19UQ1A6CisJY2FzZSBJUFBST1RPX1NDVFA6CisJCWIxID0gZ2VuX3BvcnRyYW5nZW9wNihwb3J0MSwgcG9ydDIsIGlwX3Byb3RvLCBkaXIpOworCQlicmVhazsKKworCWNhc2UgUFJPVE9fVU5ERUY6CisJCXRtcCA9IGdlbl9wb3J0cmFuZ2VvcDYocG9ydDEsIHBvcnQyLCBJUFBST1RPX1RDUCwgZGlyKTsKKwkJYjEgPSBnZW5fcG9ydHJhbmdlb3A2KHBvcnQxLCBwb3J0MiwgSVBQUk9UT19VRFAsIGRpcik7CisJCWdlbl9vcih0bXAsIGIxKTsKKwkJdG1wID0gZ2VuX3BvcnRyYW5nZW9wNihwb3J0MSwgcG9ydDIsIElQUFJPVE9fU0NUUCwgZGlyKTsKKwkJZ2VuX29yKHRtcCwgYjEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorCWdlbl9hbmQoYjAsIGIxKTsKKwlyZXR1cm4gYjE7Cit9CisjZW5kaWYgLyogSU5FVDYgKi8KKworc3RhdGljIGludAorbG9va3VwX3Byb3RvKG5hbWUsIHByb3RvKQorCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKm5hbWU7CisJcmVnaXN0ZXIgaW50IHByb3RvOworeworCXJlZ2lzdGVyIGludCB2OworCisJc3dpdGNoIChwcm90bykgeworCisJY2FzZSBRX0RFRkFVTFQ6CisJY2FzZSBRX0lQOgorCWNhc2UgUV9JUFY2OgorCQl2ID0gcGNhcF9uYW1ldG9wcm90byhuYW1lKTsKKwkJaWYgKHYgPT0gUFJPVE9fVU5ERUYpCisJCQlicGZfZXJyb3IoInVua25vd24gaXAgcHJvdG8gJyVzJyIsIG5hbWUpOworCQlicmVhazsKKworCWNhc2UgUV9MSU5LOgorCQkvKiBYWFggc2hvdWxkIGxvb2sgdXAgaC93IHByb3RvY29sIHR5cGUgYmFzZWQgb24gbGlua3R5cGUgKi8KKwkJdiA9IHBjYXBfbmFtZXRvZXByb3RvKG5hbWUpOworCQlpZiAodiA9PSBQUk9UT19VTkRFRikgeworCQkJdiA9IHBjYXBfbmFtZXRvbGxjKG5hbWUpOworCQkJaWYgKHYgPT0gUFJPVE9fVU5ERUYpCisJCQkJYnBmX2Vycm9yKCJ1bmtub3duIGV0aGVyIHByb3RvICclcyciLCBuYW1lKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUV9JU086CisJCWlmIChzdHJjbXAobmFtZSwgImVzaXMiKSA9PSAwKQorCQkJdiA9IElTTzk1NDJfRVNJUzsKKwkJZWxzZSBpZiAoc3RyY21wKG5hbWUsICJpc2lzIikgPT0gMCkKKwkJCXYgPSBJU08xMDU4OV9JU0lTOworCQllbHNlIGlmIChzdHJjbXAobmFtZSwgImNsbnAiKSA9PSAwKQorCQkJdiA9IElTTzg0NzNfQ0xOUDsKKwkJZWxzZQorCQkJYnBmX2Vycm9yKCJ1bmtub3duIG9zaSBwcm90byAnJXMnIiwgbmFtZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJdiA9IFBST1RPX1VOREVGOworCQlicmVhazsKKwl9CisJcmV0dXJuIHY7Cit9CisKKyNpZiAwCitzdHJ1Y3Qgc3RtdCAqCitnZW5fam9pbnNwKHMsIG4pCisJc3RydWN0IHN0bXQgKipzOworCWludCBuOworeworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3Byb3RvY2hhaW4odiwgcHJvdG8sIGRpcikKKwlpbnQgdjsKKwlpbnQgcHJvdG87CisJaW50IGRpcjsKK3sKKyNpZmRlZiBOT19QUk9UT0NIQUlOCisJcmV0dXJuIGdlbl9wcm90byh2LCBwcm90bywgZGlyKTsKKyNlbHNlCisJc3RydWN0IGJsb2NrICpiMCwgKmI7CisJc3RydWN0IHNsaXN0ICpzWzEwMF07CisJaW50IGZpeDIsIGZpeDMsIGZpeDQsIGZpeDU7CisJaW50IGFoY2hlY2ssIGFnYWluLCBlbmQ7CisJaW50IGksIG1heDsKKwlpbnQgcmVnMiA9IGFsbG9jX3JlZygpOworCisJbWVtc2V0KHMsIDAsIHNpemVvZihzKSk7CisJZml4MiA9IGZpeDMgPSBmaXg0ID0gZml4NSA9IDA7CisKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBRX0lQOgorCWNhc2UgUV9JUFY2OgorCQlicmVhazsKKwljYXNlIFFfREVGQVVMVDoKKwkJYjAgPSBnZW5fcHJvdG9jaGFpbih2LCBRX0lQLCBkaXIpOworCQliID0gZ2VuX3Byb3RvY2hhaW4odiwgUV9JUFY2LCBkaXIpOworCQlnZW5fb3IoYjAsIGIpOworCQlyZXR1cm4gYjsKKwlkZWZhdWx0OgorCQlicGZfZXJyb3IoImJhZCBwcm90b2NvbCBhcHBsaWVkIGZvciAncHJvdG9jaGFpbiciKTsKKwkJLypOT1RSRUFDSEVEKi8KKwl9CisKKwkvKgorCSAqIFdlIGRvbid0IGhhbmRsZSB2YXJpYWJsZS1sZW5ndGggcHJlZml4ZXMgYmVmb3JlIHRoZSBsaW5rLWxheWVyCisJICogaGVhZGVyLCBvciB2YXJpYWJsZS1sZW5ndGggbGluay1sYXllciBoZWFkZXJzLCBoZXJlIHlldC4KKwkgKiBXZSBtaWdodCB3YW50IHRvIGFkZCBCUEYgaW5zdHJ1Y3Rpb25zIHRvIGRvIHRoZSBwcm90b2NoYWluCisJICogd29yaywgdG8gc2ltcGxpZnkgdGhhdCBhbmQsIG9uIHBsYXRmb3JtcyB0aGF0IGhhdmUgYSBCUEYKKwkgKiBpbnRlcnByZXRlciB3aXRoIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zLCBsZXQgdGhlIGZpbHRlcmluZworCSAqIGJlIGRvbmUgaW4gdGhlIGtlcm5lbC4gIChXZSBhbHJlYWR5IHJlcXVpcmUgYSBtb2RpZmllZCBCUEYKKwkgKiBlbmdpbmUgdG8gZG8gdGhlIHByb3RvY2hhaW4gc3R1ZmYsIHRvIHN1cHBvcnQgYmFja3dhcmQKKwkgKiBicmFuY2hlcywgYW5kIGJhY2t3YXJkIGJyYW5jaCBzdXBwb3J0IGlzIHVubGlrZWx5IHRvIGFwcGVhcgorCSAqIGluIGtlcm5lbCBCUEYgZW5naW5lcy4pCisJICovCisJc3dpdGNoIChsaW5rdHlwZSkgeworCisJY2FzZSBETFRfSUVFRTgwMl8xMToKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwljYXNlIERMVF9QUEk6CisJCWJwZl9lcnJvcigiJ3Byb3RvY2hhaW4nIG5vdCBzdXBwb3J0ZWQgd2l0aCA4MDIuMTEiKTsKKwl9CisKKwlub19vcHRpbWl6ZSA9IDE7IC8qdGhpcyBjb2RlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggb3B0aW16ZXIgeWV0ICovCisKKwkvKgorCSAqIHNbMF0gaXMgYSBkdW1teSBlbnRyeSB0byBwcm90ZWN0IG90aGVyIEJQRiBpbnNuIGZyb20gZGFtYWdlCisJICogYnkgc1tmaXhdID0gZm9vIHdpdGggdW5pbml0aWFsaXplZCB2YXJpYWJsZSAiZml4Ii4gIEl0IGlzIHNvbWV3aGF0CisJICogaGFyZCB0byBmaW5kIGludGVyZGVwZW5kZW5jeSBtYWRlIGJ5IGp1bXAgdGFibGUgZml4dXAuCisJICovCisJaSA9IDA7CisJc1tpXSA9IG5ld19zdG10KDApOwkvKmR1bW15Ki8KKwlpKys7CisKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBRX0lQOgorCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVApOworCisJCS8qIEEgPSBpcC0+aXBfcCAqLworCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9BQlN8QlBGX0IpOworCQlzW2ldLT5zLmsgPSBvZmZfbWFjcGwgKyBvZmZfbmwgKyA5OworCQlpKys7CisJCS8qIFggPSBpcC0+aXBfaGwgPDwgMiAqLworCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfTVNIfEJQRl9CKTsKKwkJc1tpXS0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sOworCQlpKys7CisJCWJyZWFrOworI2lmZGVmIElORVQ2CisJY2FzZSBRX0lQVjY6CisJCWIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUFY2KTsKKworCQkvKiBBID0gaXA2LT5pcF9ueHQgKi8KKwkJc1tpXSA9IG5ld19zdG10KEJQRl9MRHxCUEZfQUJTfEJQRl9CKTsKKwkJc1tpXS0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sICsgNjsKKwkJaSsrOworCQkvKiBYID0gc2l6ZW9mKHN0cnVjdCBpcDZfaGRyKSAqLworCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfSU1NKTsKKwkJc1tpXS0+cy5rID0gNDA7CisJCWkrKzsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlicGZfZXJyb3IoInVuc3VwcG9ydGVkIHByb3RvIHRvIGdlbl9wcm90b2NoYWluIik7CisJCS8qTk9UUkVBQ0hFRCovCisJfQorCisJLyogYWdhaW46IGlmIChBID09IHYpIGdvdG8gZW5kOyBlbHNlIGZhbGwgdGhyb3VnaDsgKi8KKwlhZ2FpbiA9IGk7CisJc1tpXSA9IG5ld19zdG10KEJQRl9KTVB8QlBGX0pFUXxCUEZfSyk7CisJc1tpXS0+cy5rID0gdjsKKwlzW2ldLT5zLmp0ID0gTlVMTDsJCS8qbGF0ZXIqLworCXNbaV0tPnMuamYgPSBOVUxMOwkJLyp1cGRhdGUgaW4gbmV4dCBzdG10Ki8KKwlmaXg1ID0gaTsKKwlpKys7CisKKyNpZm5kZWYgSVBQUk9UT19OT05FCisjZGVmaW5lIElQUFJPVE9fTk9ORQk1OQorI2VuZGlmCisJLyogaWYgKEEgPT0gSVBQUk9UT19OT05FKSBnb3RvIGVuZCAqLworCXNbaV0gPSBuZXdfc3RtdChCUEZfSk1QfEJQRl9KRVF8QlBGX0spOworCXNbaV0tPnMuanQgPSBOVUxMOwkvKmxhdGVyKi8KKwlzW2ldLT5zLmpmID0gTlVMTDsJLyp1cGRhdGUgaW4gbmV4dCBzdG10Ki8KKwlzW2ldLT5zLmsgPSBJUFBST1RPX05PTkU7CisJc1tmaXg1XS0+cy5qZiA9IHNbaV07CisJZml4MiA9IGk7CisJaSsrOworCisjaWZkZWYgSU5FVDYKKwlpZiAocHJvdG8gPT0gUV9JUFY2KSB7CisJCWludCB2NnN0YXJ0LCB2NmVuZCwgdjZhZHZhbmNlLCBqOworCisJCXY2c3RhcnQgPSBpOworCQkvKiBpZiAoQSA9PSBJUFBST1RPX0hPUE9QVFMpIGdvdG8gdjZhZHZhbmNlICovCisJCXNbaV0gPSBuZXdfc3RtdChCUEZfSk1QfEJQRl9KRVF8QlBGX0spOworCQlzW2ldLT5zLmp0ID0gTlVMTDsJLypsYXRlciovCisJCXNbaV0tPnMuamYgPSBOVUxMOwkvKnVwZGF0ZSBpbiBuZXh0IHN0bXQqLworCQlzW2ldLT5zLmsgPSBJUFBST1RPX0hPUE9QVFM7CisJCXNbZml4Ml0tPnMuamYgPSBzW2ldOworCQlpKys7CisJCS8qIGlmIChBID09IElQUFJPVE9fRFNUT1BUUykgZ290byB2NmFkdmFuY2UgKi8KKwkJc1tpIC0gMV0tPnMuamYgPSBzW2ldID0gbmV3X3N0bXQoQlBGX0pNUHxCUEZfSkVRfEJQRl9LKTsKKwkJc1tpXS0+cy5qdCA9IE5VTEw7CS8qbGF0ZXIqLworCQlzW2ldLT5zLmpmID0gTlVMTDsJLyp1cGRhdGUgaW4gbmV4dCBzdG10Ki8KKwkJc1tpXS0+cy5rID0gSVBQUk9UT19EU1RPUFRTOworCQlpKys7CisJCS8qIGlmIChBID09IElQUFJPVE9fUk9VVElORykgZ290byB2NmFkdmFuY2UgKi8KKwkJc1tpIC0gMV0tPnMuamYgPSBzW2ldID0gbmV3X3N0bXQoQlBGX0pNUHxCUEZfSkVRfEJQRl9LKTsKKwkJc1tpXS0+cy5qdCA9IE5VTEw7CS8qbGF0ZXIqLworCQlzW2ldLT5zLmpmID0gTlVMTDsJLyp1cGRhdGUgaW4gbmV4dCBzdG10Ki8KKwkJc1tpXS0+cy5rID0gSVBQUk9UT19ST1VUSU5HOworCQlpKys7CisJCS8qIGlmIChBID09IElQUFJPVE9fRlJBR01FTlQpIGdvdG8gdjZhZHZhbmNlOyBlbHNlIGdvdG8gYWhjaGVjazsgKi8KKwkJc1tpIC0gMV0tPnMuamYgPSBzW2ldID0gbmV3X3N0bXQoQlBGX0pNUHxCUEZfSkVRfEJQRl9LKTsKKwkJc1tpXS0+cy5qdCA9IE5VTEw7CS8qbGF0ZXIqLworCQlzW2ldLT5zLmpmID0gTlVMTDsJLypsYXRlciovCisJCXNbaV0tPnMuayA9IElQUFJPVE9fRlJBR01FTlQ7CisJCWZpeDMgPSBpOworCQl2NmVuZCA9IGk7CisJCWkrKzsKKworCQkvKiB2NmFkdmFuY2U6ICovCisJCXY2YWR2YW5jZSA9IGk7CisKKwkJLyoKKwkJICogaW4gc2hvcnQsCisJCSAqIEEgPSBQW1ggKyBwYWNrZXQgaGVhZF07CisJCSAqIFggPSBYICsgKFBbWCArIHBhY2tldCBoZWFkICsgMV0gKyAxKSAqIDg7CisJCSAqLworCQkvKiBBID0gUFtYICsgcGFja2V0IGhlYWRdICovCisJCXNbaV0gPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxCUEZfQik7CisJCXNbaV0tPnMuayA9IG9mZl9tYWNwbCArIG9mZl9ubDsKKwkJaSsrOworCQkvKiBNRU1bcmVnMl0gPSBBICovCisJCXNbaV0gPSBuZXdfc3RtdChCUEZfU1QpOworCQlzW2ldLT5zLmsgPSByZWcyOworCQlpKys7CisJCS8qIEEgPSBQW1ggKyBwYWNrZXQgaGVhZCArIDFdOyAqLworCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8QlBGX0IpOworCQlzW2ldLT5zLmsgPSBvZmZfbWFjcGwgKyBvZmZfbmwgKyAxOworCQlpKys7CisJCS8qIEEgKz0gMSAqLworCQlzW2ldID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwkJc1tpXS0+cy5rID0gMTsKKwkJaSsrOworCQkvKiBBICo9IDggKi8KKwkJc1tpXSA9IG5ld19zdG10KEJQRl9BTFV8QlBGX01VTHxCUEZfSyk7CisJCXNbaV0tPnMuayA9IDg7CisJCWkrKzsKKwkJLyogQSArPSBYICovCisJCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX1gpOworCQlzW2ldLT5zLmsgPSAwOworCQlpKys7CisJCS8qIFggPSBBOyAqLworCQlzW2ldID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJCWkrKzsKKwkJLyogQSA9IE1FTVtyZWcyXSAqLworCQlzW2ldID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9NRU0pOworCQlzW2ldLT5zLmsgPSByZWcyOworCQlpKys7CisKKwkJLyogZ290byBhZ2FpbjsgKG11c3QgdXNlIEJQRl9KQSBmb3IgYmFja3dhcmQganVtcCkgKi8KKwkJc1tpXSA9IG5ld19zdG10KEJQRl9KTVB8QlBGX0pBKTsKKwkJc1tpXS0+cy5rID0gYWdhaW4gLSBpIC0gMTsKKwkJc1tpIC0gMV0tPnMuamYgPSBzW2ldOworCQlpKys7CisKKwkJLyogZml4dXAgKi8KKwkJZm9yIChqID0gdjZzdGFydDsgaiA8PSB2NmVuZDsgaisrKQorCQkJc1tqXS0+cy5qdCA9IHNbdjZhZHZhbmNlXTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyogbm9wICovCisJCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX0spOworCQlzW2ldLT5zLmsgPSAwOworCQlzW2ZpeDJdLT5zLmpmID0gc1tpXTsKKwkJaSsrOworCX0KKworCS8qIGFoY2hlY2s6ICovCisJYWhjaGVjayA9IGk7CisJLyogaWYgKEEgPT0gSVBQUk9UT19BSCkgdGhlbiBmYWxsIHRocm91Z2g7IGVsc2UgZ290byBlbmQ7ICovCisJc1tpXSA9IG5ld19zdG10KEJQRl9KTVB8QlBGX0pFUXxCUEZfSyk7CisJc1tpXS0+cy5qdCA9IE5VTEw7CS8qbGF0ZXIqLworCXNbaV0tPnMuamYgPSBOVUxMOwkvKmxhdGVyKi8KKwlzW2ldLT5zLmsgPSBJUFBST1RPX0FIOworCWlmIChmaXgzKQorCQlzW2ZpeDNdLT5zLmpmID0gc1thaGNoZWNrXTsKKwlmaXg0ID0gaTsKKwlpKys7CisKKwkvKgorCSAqIGluIHNob3J0LAorCSAqIEEgPSBQW1hdOworCSAqIFggPSBYICsgKFBbWCArIDFdICsgMikgKiA0OworCSAqLworCS8qIEEgPSBYICovCisJc1tpIC0gMV0tPnMuanQgPSBzW2ldID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RYQSk7CisJaSsrOworCS8qIEEgPSBQW1ggKyBwYWNrZXQgaGVhZF07ICovCisJc1tpXSA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfEJQRl9CKTsKKwlzW2ldLT5zLmsgPSBvZmZfbWFjcGwgKyBvZmZfbmw7CisJaSsrOworCS8qIE1FTVtyZWcyXSA9IEEgKi8KKwlzW2ldID0gbmV3X3N0bXQoQlBGX1NUKTsKKwlzW2ldLT5zLmsgPSByZWcyOworCWkrKzsKKwkvKiBBID0gWCAqLworCXNbaSAtIDFdLT5zLmp0ID0gc1tpXSA9IG5ld19zdG10KEJQRl9NSVNDfEJQRl9UWEEpOworCWkrKzsKKwkvKiBBICs9IDEgKi8KKwlzW2ldID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwlzW2ldLT5zLmsgPSAxOworCWkrKzsKKwkvKiBYID0gQSAqLworCXNbaV0gPSBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKTsKKwlpKys7CisJLyogQSA9IFBbWCArIHBhY2tldCBoZWFkXSAqLworCXNbaV0gPSBuZXdfc3RtdChCUEZfTER8QlBGX0lORHxCUEZfQik7CisJc1tpXS0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sOworCWkrKzsKKwkvKiBBICs9IDIgKi8KKwlzW2ldID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9LKTsKKwlzW2ldLT5zLmsgPSAyOworCWkrKzsKKwkvKiBBICo9IDQgKi8KKwlzW2ldID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfTVVMfEJQRl9LKTsKKwlzW2ldLT5zLmsgPSA0OworCWkrKzsKKwkvKiBYID0gQTsgKi8KKwlzW2ldID0gbmV3X3N0bXQoQlBGX01JU0N8QlBGX1RBWCk7CisJaSsrOworCS8qIEEgPSBNRU1bcmVnMl0gKi8KKwlzW2ldID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9NRU0pOworCXNbaV0tPnMuayA9IHJlZzI7CisJaSsrOworCisJLyogZ290byBhZ2FpbjsgKG11c3QgdXNlIEJQRl9KQSBmb3IgYmFja3dhcmQganVtcCkgKi8KKwlzW2ldID0gbmV3X3N0bXQoQlBGX0pNUHxCUEZfSkEpOworCXNbaV0tPnMuayA9IGFnYWluIC0gaSAtIDE7CisJaSsrOworCisJLyogZW5kOiBub3AgKi8KKwllbmQgPSBpOworCXNbaV0gPSBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX0spOworCXNbaV0tPnMuayA9IDA7CisJc1tmaXgyXS0+cy5qdCA9IHNbZW5kXTsKKwlzW2ZpeDRdLT5zLmpmID0gc1tlbmRdOworCXNbZml4NV0tPnMuanQgPSBzW2VuZF07CisJaSsrOworCisJLyoKKwkgKiBtYWtlIHNsaXN0IGNoYWluCisJICovCisJbWF4ID0gaTsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4IC0gMTsgaSsrKQorCQlzW2ldLT5uZXh0ID0gc1tpICsgMV07CisJc1ttYXggLSAxXS0+bmV4dCA9IE5VTEw7CisKKwkvKgorCSAqIGVtaXQgZmluYWwgY2hlY2sKKwkgKi8KKwliID0gbmV3X2Jsb2NrKEpNUChCUEZfSkVRKSk7CisJYi0+c3RtdHMgPSBzWzFdOwkvKnJlbWVtYmVyLCBzWzBdIGlzIGR1bW15Ki8KKwliLT5zLmsgPSB2OworCisJZnJlZV9yZWcocmVnMik7CisKKwlnZW5fYW5kKGIwLCBiKTsKKwlyZXR1cm4gYjsKKyNlbmRpZgorfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9jaGVja184MDJfMTFfZGF0YV9mcmFtZSgpCit7CisJc3RydWN0IHNsaXN0ICpzOworCXN0cnVjdCBibG9jayAqYjAsICpiMTsKKworCS8qCisJICogQSBkYXRhIGZyYW1lIGhhcyB0aGUgMHgwOCBiaXQgKGIzKSBpbiB0aGUgZnJhbWUgY29udHJvbCBmaWVsZCBzZXQKKwkgKiBhbmQgdGhlIDB4MDQgYml0IChiMikgY2xlYXIuCisJICovCisJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCWIwID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCWIwLT5zLmsgPSAweDA4OworCWIwLT5zdG10cyA9IHM7CisJCisJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCWIxLT5zLmsgPSAweDA0OworCWIxLT5zdG10cyA9IHM7CisJZ2VuX25vdChiMSk7CisKKwlnZW5fYW5kKGIxLCBiMCk7CisKKwlyZXR1cm4gYjA7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSBjb2RlIHRoYXQgY2hlY2tzIHdoZXRoZXIgdGhlIHBhY2tldCBpcyBhIHBhY2tldCBmb3IgcHJvdG9jb2wKKyAqIDxwcm90bz4gYW5kIHdoZXRoZXIgdGhlIHR5cGUgZmllbGQgaW4gdGhhdCBwcm90b2NvbCdzIGhlYWRlciBoYXMKKyAqIHRoZSB2YWx1ZSA8dj4sIGUuZy4gaWYgPHByb3RvPiBpcyBRX0lQLCBpdCBjaGVja3Mgd2hldGhlciBpdCdzIGFuCisgKiBJUCBwYWNrZXQgYW5kIGNoZWNrcyB0aGUgcHJvdG9jb2wgbnVtYmVyIGluIHRoZSBJUCBoZWFkZXIgYWdhaW5zdCA8dj4uCisgKgorICogSWYgPHByb3RvPiBpcyBRX0RFRkFVTFQsIGkuZS4ganVzdCAicHJvdG8iIHdhcyBzcGVjaWZpZWQsIGl0IGNoZWNrcworICogYWdhaW5zdCBRX0lQIGFuZCBRX0lQVjYuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX3Byb3RvKHYsIHByb3RvLCBkaXIpCisJaW50IHY7CisJaW50IHByb3RvOworCWludCBkaXI7Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxOworI2lmZGVmIElORVQ2CisjaWZuZGVmIENIQVNFX0NIQUlOCisJc3RydWN0IGJsb2NrICpiMjsKKyNlbmRpZgorI2VuZGlmCisKKwlpZiAoZGlyICE9IFFfREVGQVVMVCkKKwkJYnBmX2Vycm9yKCJkaXJlY3Rpb24gYXBwbGllZCB0byAncHJvdG8nIik7CisKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBRX0RFRkFVTFQ6CisjaWZkZWYgSU5FVDYKKwkJYjAgPSBnZW5fcHJvdG8odiwgUV9JUCwgZGlyKTsKKwkJYjEgPSBnZW5fcHJvdG8odiwgUV9JUFY2LCBkaXIpOworCQlnZW5fb3IoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworI2Vsc2UKKwkJLypGQUxMVEhST1VHSCovCisjZW5kaWYKKwljYXNlIFFfSVA6CisJCS8qCisJCSAqIEZvciBGRERJLCBSRkMgMTE4OCBzYXlzIHRoYXQgU05BUCBlbmNhcHN1bGF0aW9uIGlzIHVzZWQsCisJCSAqIG5vdCBMTEMgZW5jYXBzdWxhdGlvbiB3aXRoIExMQ1NBUF9JUC4KKwkJICoKKwkJICogRm9yIElFRUUgODAyIG5ldHdvcmtzIC0gd2hpY2ggaW5jbHVkZXMgODAyLjUgdG9rZW4gcmluZworCQkgKiAod2hpY2ggaXMgd2hhdCBETFRfSUVFRTgwMiBtZWFucykgYW5kIDgwMi4xMSAtIFJGQyAxMDQyCisJCSAqIHNheXMgdGhhdCBTTkFQIGVuY2Fwc3VsYXRpb24gaXMgdXNlZCwgbm90IExMQyBlbmNhcHN1bGF0aW9uCisJCSAqIHdpdGggTExDU0FQX0lQLgorCQkgKgorCQkgKiBGb3IgTExDLWVuY2Fwc3VsYXRlZCBBVE0vIkNsYXNzaWNhbCBJUCIsIFJGQyAxNDgzIGFuZAorCQkgKiBSRkMgMjIyNSBzYXkgdGhhdCBTTkFQIGVuY2Fwc3VsYXRpb24gaXMgdXNlZCwgbm90IExMQworCQkgKiBlbmNhcHN1bGF0aW9uIHdpdGggTExDU0FQX0lQLgorCQkgKgorCQkgKiBTbyB3ZSBhbHdheXMgY2hlY2sgZm9yIEVUSEVSVFlQRV9JUC4KKwkJICovCisJCWIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUCk7CisjaWZuZGVmIENIQVNFX0NIQUlOCisJCWIxID0gZ2VuX2NtcChPUl9ORVQsIDksIEJQRl9CLCAoYnBmX2ludDMyKXYpOworI2Vsc2UKKwkJYjEgPSBnZW5fcHJvdG9jaGFpbih2LCBRX0lQKTsKKyNlbmRpZgorCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9JU086CisJCXN3aXRjaCAobGlua3R5cGUpIHsKKworCQljYXNlIERMVF9GUkVMQVk6CisJCQkvKgorCQkJICogRnJhbWUgUmVsYXkgcGFja2V0cyB0eXBpY2FsbHkgaGF2ZSBhbiBPU0kKKwkJCSAqIE5MUElEIGF0IHRoZSBiZWdpbm5pbmc7ICJnZW5fbGlua3R5cGUoTExDU0FQX0lTT05TKSIKKwkJCSAqIGdlbmVyYXRlcyBjb2RlIHRvIGNoZWNrIGZvciBhbGwgdGhlIE9TSQorCQkJICogTkxQSURzLCBzbyBjYWxsaW5nIGl0IGFuZCB0aGVuIGFkZGluZyBhIGNoZWNrCisJCQkgKiBmb3IgdGhlIHBhcnRpY3VsYXIgTkxQSUQgZm9yIHdoaWNoIHdlJ3JlCisJCQkgKiBsb29raW5nIGlzIGJvZ3VzLCBhcyB3ZSBjYW4ganVzdCBjaGVjayBmb3IKKwkJCSAqIHRoZSBOTFBJRC4KKwkJCSAqCisJCQkgKiBXaGF0IHdlIGNoZWNrIGZvciBpcyB0aGUgTkxQSUQgYW5kIGEgZnJhbWUKKwkJCSAqIGNvbnRyb2wgZmllbGQgdmFsdWUgb2YgVUksIGkuZS4gMHgwMyBmb2xsb3dlZAorCQkJICogYnkgdGhlIE5MUElELgorCQkJICoKKwkJCSAqIFhYWCAtIGFzc3VtZXMgYSAyLWJ5dGUgRnJhbWUgUmVsYXkgaGVhZGVyIHdpdGgKKwkJCSAqIERMQ0kgYW5kIGZsYWdzLiAgV2hhdCBpZiB0aGUgYWRkcmVzcyBpcyBsb25nZXI/CisJCQkgKgorCQkJICogWFhYIC0gd2hhdCBhYm91dCBTTkFQLWVuY2Fwc3VsYXRlZCBmcmFtZXM/CisJCQkgKi8KKwkJCXJldHVybiBnZW5fY21wKE9SX0xJTkssIDIsIEJQRl9ILCAoMHgwMzw8OCkgfCB2KTsKKwkJCS8qTk9UUkVBQ0hFRCovCisJCQlicmVhazsKKworCQljYXNlIERMVF9DX0hETEM6CisJCQkvKgorCQkJICogQ2lzY28gdXNlcyBhbiBFdGhlcnR5cGUgbG9va2FsaWtlIC0gZm9yIE9TSSwKKwkJCSAqIGl0J3MgMHhmZWZlLgorCQkJICovCisJCQliMCA9IGdlbl9saW5rdHlwZShMTENTQVBfSVNPTlM8PDggfCBMTENTQVBfSVNPTlMpOworCQkJLyogT1NJIGluIEMtSERMQyBpcyBzdHVmZmVkIHdpdGggYSBmdWRnZSBieXRlICovCisJCQliMSA9IGdlbl9jbXAoT1JfTkVUX05PU05BUCwgMSwgQlBGX0IsIChsb25nKXYpOworCQkJZ2VuX2FuZChiMCwgYjEpOworCQkJcmV0dXJuIGIxOworCisJCWRlZmF1bHQ6CisJCQliMCA9IGdlbl9saW5rdHlwZShMTENTQVBfSVNPTlMpOworCQkJYjEgPSBnZW5fY21wKE9SX05FVF9OT1NOQVAsIDAsIEJQRl9CLCAobG9uZyl2KTsKKwkJCWdlbl9hbmQoYjAsIGIxKTsKKwkJCXJldHVybiBiMTsKKwkJfQorCisJY2FzZSBRX0lTSVM6CisJCWIwID0gZ2VuX3Byb3RvKElTTzEwNTg5X0lTSVMsIFFfSVNPLCBRX0RFRkFVTFQpOworCQkvKgorCQkgKiA0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIFBEVSB0eXBlIHJlbGF0aXZlIHRvIHRoZSBJUy1JUworCQkgKiBoZWFkZXIuCisJCSAqLworCQliMSA9IGdlbl9jbXAoT1JfTkVUX05PU05BUCwgNCwgQlBGX0IsIChsb25nKXYpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9BUlA6CisJCWJwZl9lcnJvcigiYXJwIGRvZXMgbm90IGVuY2Fwc3VsYXRlIGFub3RoZXIgcHJvdG9jb2wiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJY2FzZSBRX1JBUlA6CisJCWJwZl9lcnJvcigicmFycCBkb2VzIG5vdCBlbmNhcHN1bGF0ZSBhbm90aGVyIHByb3RvY29sIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgUV9BVEFMSzoKKwkJYnBmX2Vycm9yKCJhdGFsayBlbmNhcHN1bGF0aW9uIGlzIG5vdCBzcGVjaWZpYWJsZSIpOworCQkvKiBOT1RSRUFDSEVEICovCisKKwljYXNlIFFfREVDTkVUOgorCQlicGZfZXJyb3IoImRlY25ldCBlbmNhcHN1bGF0aW9uIGlzIG5vdCBzcGVjaWZpYWJsZSIpOworCQkvKiBOT1RSRUFDSEVEICovCisKKwljYXNlIFFfU0NBOgorCQlicGZfZXJyb3IoInNjYSBkb2VzIG5vdCBlbmNhcHN1bGF0ZSBhbm90aGVyIHByb3RvY29sIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgUV9MQVQ6CisJCWJwZl9lcnJvcigibGF0IGRvZXMgbm90IGVuY2Fwc3VsYXRlIGFub3RoZXIgcHJvdG9jb2wiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJY2FzZSBRX01PUFJDOgorCQlicGZfZXJyb3IoIm1vcHJjIGRvZXMgbm90IGVuY2Fwc3VsYXRlIGFub3RoZXIgcHJvdG9jb2wiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJY2FzZSBRX01PUERMOgorCQlicGZfZXJyb3IoIm1vcGRsIGRvZXMgbm90IGVuY2Fwc3VsYXRlIGFub3RoZXIgcHJvdG9jb2wiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJY2FzZSBRX0xJTks6CisJCXJldHVybiBnZW5fbGlua3R5cGUodik7CisKKwljYXNlIFFfVURQOgorCQlicGZfZXJyb3IoIid1ZHAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgUV9UQ1A6CisJCWJwZl9lcnJvcigiJ3RjcCBwcm90bycgaXMgYm9ndXMiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJY2FzZSBRX1NDVFA6CisJCWJwZl9lcnJvcigiJ3NjdHAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgUV9JQ01QOgorCQlicGZfZXJyb3IoIidpY21wIHByb3RvJyBpcyBib2d1cyIpOworCQkvKiBOT1RSRUFDSEVEICovCisKKwljYXNlIFFfSUdNUDoKKwkJYnBmX2Vycm9yKCInaWdtcCBwcm90bycgaXMgYm9ndXMiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJY2FzZSBRX0lHUlA6CisJCWJwZl9lcnJvcigiJ2lncnAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgUV9QSU06CisJCWJwZl9lcnJvcigiJ3BpbSBwcm90bycgaXMgYm9ndXMiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJY2FzZSBRX1ZSUlA6CisJCWJwZl9lcnJvcigiJ3ZycnAgcHJvdG8nIGlzIGJvZ3VzIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgUV9DQVJQOgorCQlicGZfZXJyb3IoIidjYXJwIHByb3RvJyBpcyBib2d1cyIpOworCQkvKiBOT1RSRUFDSEVEICovCisKKyNpZmRlZiBJTkVUNgorCWNhc2UgUV9JUFY2OgorCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVBWNik7CisjaWZuZGVmIENIQVNFX0NIQUlOCisJCS8qCisJCSAqIEFsc28gY2hlY2sgZm9yIGEgZnJhZ21lbnQgaGVhZGVyIGJlZm9yZSB0aGUgZmluYWwKKwkJICogaGVhZGVyLgorCQkgKi8KKwkJYjIgPSBnZW5fY21wKE9SX05FVCwgNiwgQlBGX0IsIElQUFJPVE9fRlJBR01FTlQpOworCQliMSA9IGdlbl9jbXAoT1JfTkVULCA0MCwgQlBGX0IsIChicGZfaW50MzIpdik7CisJCWdlbl9hbmQoYjIsIGIxKTsKKwkJYjIgPSBnZW5fY21wKE9SX05FVCwgNiwgQlBGX0IsIChicGZfaW50MzIpdik7CisJCWdlbl9vcihiMiwgYjEpOworI2Vsc2UKKwkJYjEgPSBnZW5fcHJvdG9jaGFpbih2LCBRX0lQVjYpOworI2VuZGlmCisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworCisJY2FzZSBRX0lDTVBWNjoKKwkJYnBmX2Vycm9yKCInaWNtcDYgcHJvdG8nIGlzIGJvZ3VzIik7CisjZW5kaWYgLyogSU5FVDYgKi8KKworCWNhc2UgUV9BSDoKKwkJYnBmX2Vycm9yKCInYWggcHJvdG8nIGlzIGJvZ3VzIik7CisKKwljYXNlIFFfRVNQOgorCQlicGZfZXJyb3IoIidhaCBwcm90bycgaXMgYm9ndXMiKTsKKworCWNhc2UgUV9TVFA6CisJCWJwZl9lcnJvcigiJ3N0cCBwcm90bycgaXMgYm9ndXMiKTsKKworCWNhc2UgUV9JUFg6CisJCWJwZl9lcnJvcigiJ2lweCBwcm90bycgaXMgYm9ndXMiKTsKKworCWNhc2UgUV9ORVRCRVVJOgorCQlicGZfZXJyb3IoIiduZXRiZXVpIHByb3RvJyBpcyBib2d1cyIpOworCisJY2FzZSBRX1JBRElPOgorCQlicGZfZXJyb3IoIidyYWRpbyBwcm90bycgaXMgYm9ndXMiKTsKKworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3Njb2RlKG5hbWUsIHEpCisJcmVnaXN0ZXIgY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgcXVhbCBxOworeworCWludCBwcm90byA9IHEucHJvdG87CisJaW50IGRpciA9IHEuZGlyOworCWludCB0cHJvdG87CisJdV9jaGFyICplYWRkcjsKKwlicGZfdV9pbnQzMiBtYXNrLCBhZGRyOworI2lmbmRlZiBJTkVUNgorCWJwZl91X2ludDMyICoqYWxpc3Q7CisjZWxzZQorCWludCB0cHJvdG82OworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luNDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworCXN0cnVjdCBhZGRyaW5mbyAqcmVzLCAqcmVzMDsKKwlzdHJ1Y3QgaW42X2FkZHIgbWFzazEyODsKKyNlbmRpZiAvKklORVQ2Ki8KKwlzdHJ1Y3QgYmxvY2sgKmIsICp0bXA7CisJaW50IHBvcnQsIHJlYWxfcHJvdG87CisJaW50IHBvcnQxLCBwb3J0MjsKKworCXN3aXRjaCAocS5hZGRyKSB7CisKKwljYXNlIFFfTkVUOgorCQlhZGRyID0gcGNhcF9uYW1ldG9uZXRhZGRyKG5hbWUpOworCQlpZiAoYWRkciA9PSAwKQorCQkJYnBmX2Vycm9yKCJ1bmtub3duIG5ldHdvcmsgJyVzJyIsIG5hbWUpOworCQkvKiBMZWZ0IGp1c3RpZnkgbmV0d29yayBhZGRyIGFuZCBjYWxjdWxhdGUgaXRzIG5ldHdvcmsgbWFzayAqLworCQltYXNrID0gMHhmZmZmZmZmZjsKKwkJd2hpbGUgKGFkZHIgJiYgKGFkZHIgJiAweGZmMDAwMDAwKSA9PSAwKSB7CisJCQlhZGRyIDw8PSA4OworCQkJbWFzayA8PD0gODsKKwkJfQorCQlyZXR1cm4gZ2VuX2hvc3QoYWRkciwgbWFzaywgcHJvdG8sIGRpciwgcS5hZGRyKTsKKworCWNhc2UgUV9ERUZBVUxUOgorCWNhc2UgUV9IT1NUOgorCQlpZiAocHJvdG8gPT0gUV9MSU5LKSB7CisJCQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisKKwkJCWNhc2UgRExUX0VOMTBNQjoKKwkJCWNhc2UgRExUX05FVEFOQUxZWkVSOgorCQkJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CisJCQkJZWFkZHIgPSBwY2FwX2V0aGVyX2hvc3R0b24obmFtZSk7CisJCQkJaWYgKGVhZGRyID09IE5VTEwpCisJCQkJCWJwZl9lcnJvcigKKwkJCQkJICAgICJ1bmtub3duIGV0aGVyIGhvc3QgJyVzJyIsIG5hbWUpOworCQkJCWIgPSBnZW5fZWhvc3RvcChlYWRkciwgZGlyKTsKKwkJCQlmcmVlKGVhZGRyKTsKKwkJCQlyZXR1cm4gYjsKKworCQkJY2FzZSBETFRfRkRESToKKwkJCQllYWRkciA9IHBjYXBfZXRoZXJfaG9zdHRvbihuYW1lKTsKKwkJCQlpZiAoZWFkZHIgPT0gTlVMTCkKKwkJCQkJYnBmX2Vycm9yKAorCQkJCQkgICAgInVua25vd24gRkRESSBob3N0ICclcyciLCBuYW1lKTsKKwkJCQliID0gZ2VuX2Zob3N0b3AoZWFkZHIsIGRpcik7CisJCQkJZnJlZShlYWRkcik7CisJCQkJcmV0dXJuIGI7CisKKwkJCWNhc2UgRExUX0lFRUU4MDI6CisJCQkJZWFkZHIgPSBwY2FwX2V0aGVyX2hvc3R0b24obmFtZSk7CisJCQkJaWYgKGVhZGRyID09IE5VTEwpCisJCQkJCWJwZl9lcnJvcigKKwkJCQkJICAgICJ1bmtub3duIHRva2VuIHJpbmcgaG9zdCAnJXMnIiwgbmFtZSk7CisJCQkJYiA9IGdlbl90aG9zdG9wKGVhZGRyLCBkaXIpOworCQkJCWZyZWUoZWFkZHIpOworCQkJCXJldHVybiBiOworCisJCQljYXNlIERMVF9JRUVFODAyXzExOgorCQkJY2FzZSBETFRfUFJJU01fSEVBREVSOgorCQkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJCQljYXNlIERMVF9JRUVFODAyXzExX1JBRElPOgorCQkJY2FzZSBETFRfUFBJOgorCQkJCWVhZGRyID0gcGNhcF9ldGhlcl9ob3N0dG9uKG5hbWUpOworCQkJCWlmIChlYWRkciA9PSBOVUxMKQorCQkJCQlicGZfZXJyb3IoCisJCQkJCSAgICAidW5rbm93biA4MDIuMTEgaG9zdCAnJXMnIiwgbmFtZSk7CisJCQkJYiA9IGdlbl93bGFuaG9zdG9wKGVhZGRyLCBkaXIpOworCQkJCWZyZWUoZWFkZHIpOworCQkJCXJldHVybiBiOworCisJCQljYXNlIERMVF9JUF9PVkVSX0ZDOgorCQkJCWVhZGRyID0gcGNhcF9ldGhlcl9ob3N0dG9uKG5hbWUpOworCQkJCWlmIChlYWRkciA9PSBOVUxMKQorCQkJCQlicGZfZXJyb3IoCisJCQkJCSAgICAidW5rbm93biBGaWJyZSBDaGFubmVsIGhvc3QgJyVzJyIsIG5hbWUpOworCQkJCWIgPSBnZW5faXBmY2hvc3RvcChlYWRkciwgZGlyKTsKKwkJCQlmcmVlKGVhZGRyKTsKKwkJCQlyZXR1cm4gYjsKKworCQkJY2FzZSBETFRfU1VOQVRNOgorCQkJCWlmICghaXNfbGFuZSkKKwkJCQkJYnJlYWs7CisKKwkJCQkvKgorCQkJCSAqIENoZWNrIHRoYXQgdGhlIHBhY2tldCBkb2Vzbid0IGJlZ2luCisJCQkJICogd2l0aCBhbiBMRSBDb250cm9sIG1hcmtlci4gIChXZSd2ZQorCQkJCSAqIGFscmVhZHkgZ2VuZXJhdGVkIGEgdGVzdCBmb3IgTEFORS4pCisJCQkJICovCisJCQkJdG1wID0gZ2VuX2NtcChPUl9MSU5LLCBTVU5BVE1fUEtUX0JFR0lOX1BPUywKKwkJCQkgICAgQlBGX0gsIDB4RkYwMCk7CisJCQkJZ2VuX25vdCh0bXApOworCisJCQkJZWFkZHIgPSBwY2FwX2V0aGVyX2hvc3R0b24obmFtZSk7CisJCQkJaWYgKGVhZGRyID09IE5VTEwpCisJCQkJCWJwZl9lcnJvcigKKwkJCQkJICAgICJ1bmtub3duIGV0aGVyIGhvc3QgJyVzJyIsIG5hbWUpOworCQkJCWIgPSBnZW5fZWhvc3RvcChlYWRkciwgZGlyKTsKKwkJCQlnZW5fYW5kKHRtcCwgYik7CisJCQkJZnJlZShlYWRkcik7CisJCQkJcmV0dXJuIGI7CisJCQl9CisKKwkJCWJwZl9lcnJvcigib25seSBldGhlcm5ldC9GRERJL3Rva2VuIHJpbmcvODAyLjExL0FUTSBMQU5FL0ZpYnJlIENoYW5uZWwgc3VwcG9ydHMgbGluay1sZXZlbCBob3N0IG5hbWUiKTsKKwkJfSBlbHNlIGlmIChwcm90byA9PSBRX0RFQ05FVCkgeworCQkJdW5zaWduZWQgc2hvcnQgZG5fYWRkciA9IF9fcGNhcF9uYW1ldG9kbmFkZHIobmFtZSk7CisJCQkvKgorCQkJICogSSBkb24ndCB0aGluayBERUNORVQgaG9zdHMgY2FuIGJlIG11bHRpaG9tZWQsIHNvCisJCQkgKiB0aGVyZSBpcyBubyBuZWVkIHRvIGJ1aWxkIHVwIGEgbGlzdCBvZiBhZGRyZXNzZXMKKwkJCSAqLworCQkJcmV0dXJuIChnZW5faG9zdChkbl9hZGRyLCAwLCBwcm90bywgZGlyLCBxLmFkZHIpKTsKKwkJfSBlbHNlIHsKKyNpZm5kZWYgSU5FVDYKKwkJCWFsaXN0ID0gcGNhcF9uYW1ldG9hZGRyKG5hbWUpOworCQkJaWYgKGFsaXN0ID09IE5VTEwgfHwgKmFsaXN0ID09IE5VTEwpCisJCQkJYnBmX2Vycm9yKCJ1bmtub3duIGhvc3QgJyVzJyIsIG5hbWUpOworCQkJdHByb3RvID0gcHJvdG87CisJCQlpZiAob2ZmX2xpbmt0eXBlID09ICh1X2ludCktMSAmJiB0cHJvdG8gPT0gUV9ERUZBVUxUKQorCQkJCXRwcm90byA9IFFfSVA7CisJCQliID0gZ2VuX2hvc3QoKiphbGlzdCsrLCAweGZmZmZmZmZmLCB0cHJvdG8sIGRpciwgcS5hZGRyKTsKKwkJCXdoaWxlICgqYWxpc3QpIHsKKwkJCQl0bXAgPSBnZW5faG9zdCgqKmFsaXN0KyssIDB4ZmZmZmZmZmYsCisJCQkJCSAgICAgICB0cHJvdG8sIGRpciwgcS5hZGRyKTsKKwkJCQlnZW5fb3IoYiwgdG1wKTsKKwkJCQliID0gdG1wOworCQkJfQorCQkJcmV0dXJuIGI7CisjZWxzZQorCQkJbWVtc2V0KCZtYXNrMTI4LCAweGZmLCBzaXplb2YobWFzazEyOCkpOworCQkJcmVzMCA9IHJlcyA9IHBjYXBfbmFtZXRvYWRkcmluZm8obmFtZSk7CisJCQlpZiAocmVzID09IE5VTEwpCisJCQkJYnBmX2Vycm9yKCJ1bmtub3duIGhvc3QgJyVzJyIsIG5hbWUpOworCQkJYWkgPSByZXM7CisJCQliID0gdG1wID0gTlVMTDsKKwkJCXRwcm90byA9IHRwcm90bzYgPSBwcm90bzsKKwkJCWlmIChvZmZfbGlua3R5cGUgPT0gLTEgJiYgdHByb3RvID09IFFfREVGQVVMVCkgeworCQkJCXRwcm90byA9IFFfSVA7CisJCQkJdHByb3RvNiA9IFFfSVBWNjsKKwkJCX0KKwkJCWZvciAocmVzID0gcmVzMDsgcmVzOyByZXMgPSByZXMtPmFpX25leHQpIHsKKwkJCQlzd2l0Y2ggKHJlcy0+YWlfZmFtaWx5KSB7CisJCQkJY2FzZSBBRl9JTkVUOgorCQkJCQlpZiAodHByb3RvID09IFFfSVBWNikKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCXNpbjQgPSAoc3RydWN0IHNvY2thZGRyX2luICopCisJCQkJCQlyZXMtPmFpX2FkZHI7CisJCQkJCXRtcCA9IGdlbl9ob3N0KG50b2hsKHNpbjQtPnNpbl9hZGRyLnNfYWRkciksCisJCQkJCQkweGZmZmZmZmZmLCB0cHJvdG8sIGRpciwgcS5hZGRyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBBRl9JTkVUNjoKKwkJCQkJaWYgKHRwcm90bzYgPT0gUV9JUCkKKwkJCQkJCWNvbnRpbnVlOworCisJCQkJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKQorCQkJCQkJcmVzLT5haV9hZGRyOworCQkJCQl0bXAgPSBnZW5faG9zdDYoJnNpbjYtPnNpbjZfYWRkciwKKwkJCQkJCSZtYXNrMTI4LCB0cHJvdG82LCBkaXIsIHEuYWRkcik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoYikKKwkJCQkJZ2VuX29yKGIsIHRtcCk7CisJCQkJYiA9IHRtcDsKKwkJCX0KKwkJCWFpID0gTlVMTDsKKwkJCWZyZWVhZGRyaW5mbyhyZXMwKTsKKwkJCWlmIChiID09IE5VTEwpIHsKKwkJCQlicGZfZXJyb3IoInVua25vd24gaG9zdCAnJXMnJXMiLCBuYW1lLAorCQkJCSAgICAocHJvdG8gPT0gUV9ERUZBVUxUKQorCQkJCQk/ICIiCisJCQkJCTogIiBmb3Igc3BlY2lmaWVkIGFkZHJlc3MgZmFtaWx5Iik7CisJCQl9CisJCQlyZXR1cm4gYjsKKyNlbmRpZiAvKklORVQ2Ki8KKwkJfQorCisJY2FzZSBRX1BPUlQ6CisJCWlmIChwcm90byAhPSBRX0RFRkFVTFQgJiYKKwkJICAgIHByb3RvICE9IFFfVURQICYmIHByb3RvICE9IFFfVENQICYmIHByb3RvICE9IFFfU0NUUCkKKwkJCWJwZl9lcnJvcigiaWxsZWdhbCBxdWFsaWZpZXIgb2YgJ3BvcnQnIik7CisJCWlmIChwY2FwX25hbWV0b3BvcnQobmFtZSwgJnBvcnQsICZyZWFsX3Byb3RvKSA9PSAwKQorCQkJYnBmX2Vycm9yKCJ1bmtub3duIHBvcnQgJyVzJyIsIG5hbWUpOworCQlpZiAocHJvdG8gPT0gUV9VRFApIHsKKwkJCWlmIChyZWFsX3Byb3RvID09IElQUFJPVE9fVENQKQorCQkJCWJwZl9lcnJvcigicG9ydCAnJXMnIGlzIHRjcCIsIG5hbWUpOworCQkJZWxzZSBpZiAocmVhbF9wcm90byA9PSBJUFBST1RPX1NDVFApCisJCQkJYnBmX2Vycm9yKCJwb3J0ICclcycgaXMgc2N0cCIsIG5hbWUpOworCQkJZWxzZQorCQkJCS8qIG92ZXJyaWRlIFBST1RPX1VOREVGICovCisJCQkJcmVhbF9wcm90byA9IElQUFJPVE9fVURQOworCQl9CisJCWlmIChwcm90byA9PSBRX1RDUCkgeworCQkJaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19VRFApCisJCQkJYnBmX2Vycm9yKCJwb3J0ICclcycgaXMgdWRwIiwgbmFtZSk7CisKKwkJCWVsc2UgaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19TQ1RQKQorCQkJCWJwZl9lcnJvcigicG9ydCAnJXMnIGlzIHNjdHAiLCBuYW1lKTsKKwkJCWVsc2UKKwkJCQkvKiBvdmVycmlkZSBQUk9UT19VTkRFRiAqLworCQkJCXJlYWxfcHJvdG8gPSBJUFBST1RPX1RDUDsKKwkJfQorCQlpZiAocHJvdG8gPT0gUV9TQ1RQKSB7CisJCQlpZiAocmVhbF9wcm90byA9PSBJUFBST1RPX1VEUCkKKwkJCQlicGZfZXJyb3IoInBvcnQgJyVzJyBpcyB1ZHAiLCBuYW1lKTsKKworCQkJZWxzZSBpZiAocmVhbF9wcm90byA9PSBJUFBST1RPX1RDUCkKKwkJCQlicGZfZXJyb3IoInBvcnQgJyVzJyBpcyB0Y3AiLCBuYW1lKTsKKwkJCWVsc2UKKwkJCQkvKiBvdmVycmlkZSBQUk9UT19VTkRFRiAqLworCQkJCXJlYWxfcHJvdG8gPSBJUFBST1RPX1NDVFA7CisJCX0KKwkJaWYgKHBvcnQgPCAwKQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkIDwgMCIsIHBvcnQpOworCQlpZiAocG9ydCA+IDY1NTM1KQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkID4gNjU1MzUiLCBwb3J0KTsKKyNpZm5kZWYgSU5FVDYKKwkJcmV0dXJuIGdlbl9wb3J0KHBvcnQsIHJlYWxfcHJvdG8sIGRpcik7CisjZWxzZQorCQliID0gZ2VuX3BvcnQocG9ydCwgcmVhbF9wcm90bywgZGlyKTsKKwkJZ2VuX29yKGdlbl9wb3J0Nihwb3J0LCByZWFsX3Byb3RvLCBkaXIpLCBiKTsKKwkJcmV0dXJuIGI7CisjZW5kaWYgLyogSU5FVDYgKi8KKworCWNhc2UgUV9QT1JUUkFOR0U6CisJCWlmIChwcm90byAhPSBRX0RFRkFVTFQgJiYKKwkJICAgIHByb3RvICE9IFFfVURQICYmIHByb3RvICE9IFFfVENQICYmIHByb3RvICE9IFFfU0NUUCkKKwkJCWJwZl9lcnJvcigiaWxsZWdhbCBxdWFsaWZpZXIgb2YgJ3BvcnRyYW5nZSciKTsKKwkJaWYgKHBjYXBfbmFtZXRvcG9ydHJhbmdlKG5hbWUsICZwb3J0MSwgJnBvcnQyLCAmcmVhbF9wcm90bykgPT0gMCkgCisJCQlicGZfZXJyb3IoInVua25vd24gcG9ydCBpbiByYW5nZSAnJXMnIiwgbmFtZSk7CisJCWlmIChwcm90byA9PSBRX1VEUCkgeworCQkJaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCQkJYnBmX2Vycm9yKCJwb3J0IGluIHJhbmdlICclcycgaXMgdGNwIiwgbmFtZSk7CisJCQllbHNlIGlmIChyZWFsX3Byb3RvID09IElQUFJPVE9fU0NUUCkKKwkJCQlicGZfZXJyb3IoInBvcnQgaW4gcmFuZ2UgJyVzJyBpcyBzY3RwIiwgbmFtZSk7CisJCQllbHNlCisJCQkJLyogb3ZlcnJpZGUgUFJPVE9fVU5ERUYgKi8KKwkJCQlyZWFsX3Byb3RvID0gSVBQUk9UT19VRFA7CisJCX0KKwkJaWYgKHByb3RvID09IFFfVENQKSB7CisJCQlpZiAocmVhbF9wcm90byA9PSBJUFBST1RPX1VEUCkKKwkJCQlicGZfZXJyb3IoInBvcnQgaW4gcmFuZ2UgJyVzJyBpcyB1ZHAiLCBuYW1lKTsKKwkJCWVsc2UgaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19TQ1RQKQorCQkJCWJwZl9lcnJvcigicG9ydCBpbiByYW5nZSAnJXMnIGlzIHNjdHAiLCBuYW1lKTsKKwkJCWVsc2UKKwkJCQkvKiBvdmVycmlkZSBQUk9UT19VTkRFRiAqLworCQkJCXJlYWxfcHJvdG8gPSBJUFBST1RPX1RDUDsKKwkJfQorCQlpZiAocHJvdG8gPT0gUV9TQ1RQKSB7CisJCQlpZiAocmVhbF9wcm90byA9PSBJUFBST1RPX1VEUCkKKwkJCQlicGZfZXJyb3IoInBvcnQgaW4gcmFuZ2UgJyVzJyBpcyB1ZHAiLCBuYW1lKTsKKwkJCWVsc2UgaWYgKHJlYWxfcHJvdG8gPT0gSVBQUk9UT19UQ1ApCisJCQkJYnBmX2Vycm9yKCJwb3J0IGluIHJhbmdlICclcycgaXMgdGNwIiwgbmFtZSk7CisJCQllbHNlCisJCQkJLyogb3ZlcnJpZGUgUFJPVE9fVU5ERUYgKi8KKwkJCQlyZWFsX3Byb3RvID0gSVBQUk9UT19TQ1RQOwkKKwkJfQorCQlpZiAocG9ydDEgPCAwKQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkIDwgMCIsIHBvcnQxKTsKKwkJaWYgKHBvcnQxID4gNjU1MzUpCisJCQlicGZfZXJyb3IoImlsbGVnYWwgcG9ydCBudW1iZXIgJWQgPiA2NTUzNSIsIHBvcnQxKTsKKwkJaWYgKHBvcnQyIDwgMCkKKwkJCWJwZl9lcnJvcigiaWxsZWdhbCBwb3J0IG51bWJlciAlZCA8IDAiLCBwb3J0Mik7CisJCWlmIChwb3J0MiA+IDY1NTM1KQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICVkID4gNjU1MzUiLCBwb3J0Mik7CisKKyNpZm5kZWYgSU5FVDYKKwkJcmV0dXJuIGdlbl9wb3J0cmFuZ2UocG9ydDEsIHBvcnQyLCByZWFsX3Byb3RvLCBkaXIpOworI2Vsc2UKKwkJYiA9IGdlbl9wb3J0cmFuZ2UocG9ydDEsIHBvcnQyLCByZWFsX3Byb3RvLCBkaXIpOworCQlnZW5fb3IoZ2VuX3BvcnRyYW5nZTYocG9ydDEsIHBvcnQyLCByZWFsX3Byb3RvLCBkaXIpLCBiKTsKKwkJcmV0dXJuIGI7CisjZW5kaWYgLyogSU5FVDYgKi8KKworCWNhc2UgUV9HQVRFV0FZOgorI2lmbmRlZiBJTkVUNgorCQllYWRkciA9IHBjYXBfZXRoZXJfaG9zdHRvbihuYW1lKTsKKwkJaWYgKGVhZGRyID09IE5VTEwpCisJCQlicGZfZXJyb3IoInVua25vd24gZXRoZXIgaG9zdDogJXMiLCBuYW1lKTsKKworCQlhbGlzdCA9IHBjYXBfbmFtZXRvYWRkcihuYW1lKTsKKwkJaWYgKGFsaXN0ID09IE5VTEwgfHwgKmFsaXN0ID09IE5VTEwpCisJCQlicGZfZXJyb3IoInVua25vd24gaG9zdCAnJXMnIiwgbmFtZSk7CisJCWIgPSBnZW5fZ2F0ZXdheShlYWRkciwgYWxpc3QsIHByb3RvLCBkaXIpOworCQlmcmVlKGVhZGRyKTsKKwkJcmV0dXJuIGI7CisjZWxzZQorCQlicGZfZXJyb3IoIidnYXRld2F5JyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgY29uZmlndXJhdGlvbiIpOworI2VuZGlmIC8qSU5FVDYqLworCisJY2FzZSBRX1BST1RPOgorCQlyZWFsX3Byb3RvID0gbG9va3VwX3Byb3RvKG5hbWUsIHByb3RvKTsKKwkJaWYgKHJlYWxfcHJvdG8gPj0gMCkKKwkJCXJldHVybiBnZW5fcHJvdG8ocmVhbF9wcm90bywgcHJvdG8sIGRpcik7CisJCWVsc2UKKwkJCWJwZl9lcnJvcigidW5rbm93biBwcm90b2NvbDogJXMiLCBuYW1lKTsKKworCWNhc2UgUV9QUk9UT0NIQUlOOgorCQlyZWFsX3Byb3RvID0gbG9va3VwX3Byb3RvKG5hbWUsIHByb3RvKTsKKwkJaWYgKHJlYWxfcHJvdG8gPj0gMCkKKwkJCXJldHVybiBnZW5fcHJvdG9jaGFpbihyZWFsX3Byb3RvLCBwcm90bywgZGlyKTsKKwkJZWxzZQorCQkJYnBmX2Vycm9yKCJ1bmtub3duIHByb3RvY29sOiAlcyIsIG5hbWUpOworCisJY2FzZSBRX1VOREVGOgorCQlzeW50YXgoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlhYm9ydCgpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9tY29kZShzMSwgczIsIG1hc2tsZW4sIHEpCisJcmVnaXN0ZXIgY29uc3QgY2hhciAqczEsICpzMjsKKwlyZWdpc3RlciBpbnQgbWFza2xlbjsKKwlzdHJ1Y3QgcXVhbCBxOworeworCXJlZ2lzdGVyIGludCBubGVuLCBtbGVuOworCWJwZl91X2ludDMyIG4sIG07CisKKwlubGVuID0gX19wY2FwX2F0b2luKHMxLCAmbik7CisJLyogUHJvbW90ZSBzaG9ydCBpcGFkZHIgKi8KKwluIDw8PSAzMiAtIG5sZW47CisKKwlpZiAoczIgIT0gTlVMTCkgeworCQltbGVuID0gX19wY2FwX2F0b2luKHMyLCAmbSk7CisJCS8qIFByb21vdGUgc2hvcnQgaXBhZGRyICovCisJCW0gPDw9IDMyIC0gbWxlbjsKKwkJaWYgKChuICYgfm0pICE9IDApCisJCQlicGZfZXJyb3IoIm5vbi1uZXR3b3JrIGJpdHMgc2V0IGluIFwiJXMgbWFzayAlc1wiIiwKKwkJCSAgICBzMSwgczIpOworCX0gZWxzZSB7CisJCS8qIENvbnZlcnQgbWFzayBsZW4gdG8gbWFzayAqLworCQlpZiAobWFza2xlbiA+IDMyKQorCQkJYnBmX2Vycm9yKCJtYXNrIGxlbmd0aCBtdXN0IGJlIDw9IDMyIik7CisJCWlmIChtYXNrbGVuID09IDApIHsKKwkJCS8qCisJCQkgKiBYIDw8IDMyIGlzIG5vdCBndWFyYW50ZWVkIGJ5IEMgdG8gYmUgMDsgaXQncworCQkJICogdW5kZWZpbmVkLgorCQkJICovCisJCQltID0gMDsKKwkJfSBlbHNlCisJCQltID0gMHhmZmZmZmZmZiA8PCAoMzIgLSBtYXNrbGVuKTsKKwkJaWYgKChuICYgfm0pICE9IDApCisJCQlicGZfZXJyb3IoIm5vbi1uZXR3b3JrIGJpdHMgc2V0IGluIFwiJXMvJWRcIiIsCisJCQkgICAgczEsIG1hc2tsZW4pOworCX0KKworCXN3aXRjaCAocS5hZGRyKSB7CisKKwljYXNlIFFfTkVUOgorCQlyZXR1cm4gZ2VuX2hvc3QobiwgbSwgcS5wcm90bywgcS5kaXIsIHEuYWRkcik7CisKKwlkZWZhdWx0OgorCQlicGZfZXJyb3IoIk1hc2sgc3ludGF4IGZvciBuZXR3b3JrcyBvbmx5Iik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX25jb2RlKHMsIHYsIHEpCisJcmVnaXN0ZXIgY29uc3QgY2hhciAqczsKKwlicGZfdV9pbnQzMiB2OworCXN0cnVjdCBxdWFsIHE7Cit7CisJYnBmX3VfaW50MzIgbWFzazsKKwlpbnQgcHJvdG8gPSBxLnByb3RvOworCWludCBkaXIgPSBxLmRpcjsKKwlyZWdpc3RlciBpbnQgdmxlbjsKKworCWlmIChzID09IE5VTEwpCisJCXZsZW4gPSAzMjsKKwllbHNlIGlmIChxLnByb3RvID09IFFfREVDTkVUKQorCQl2bGVuID0gX19wY2FwX2F0b2RuKHMsICZ2KTsKKwllbHNlCisJCXZsZW4gPSBfX3BjYXBfYXRvaW4ocywgJnYpOworCisJc3dpdGNoIChxLmFkZHIpIHsKKworCWNhc2UgUV9ERUZBVUxUOgorCWNhc2UgUV9IT1NUOgorCWNhc2UgUV9ORVQ6CisJCWlmIChwcm90byA9PSBRX0RFQ05FVCkKKwkJCXJldHVybiBnZW5faG9zdCh2LCAwLCBwcm90bywgZGlyLCBxLmFkZHIpOworCQllbHNlIGlmIChwcm90byA9PSBRX0xJTkspIHsKKwkJCWJwZl9lcnJvcigiaWxsZWdhbCBsaW5rIGxheWVyIGFkZHJlc3MiKTsKKwkJfSBlbHNlIHsKKwkJCW1hc2sgPSAweGZmZmZmZmZmOworCQkJaWYgKHMgPT0gTlVMTCAmJiBxLmFkZHIgPT0gUV9ORVQpIHsKKwkJCQkvKiBQcm9tb3RlIHNob3J0IG5ldCBudW1iZXIgKi8KKwkJCQl3aGlsZSAodiAmJiAodiAmIDB4ZmYwMDAwMDApID09IDApIHsKKwkJCQkJdiA8PD0gODsKKwkJCQkJbWFzayA8PD0gODsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIFByb21vdGUgc2hvcnQgaXBhZGRyICovCisJCQkJdiA8PD0gMzIgLSB2bGVuOworCQkJCW1hc2sgPDw9IDMyIC0gdmxlbjsKKwkJCX0KKwkJCXJldHVybiBnZW5faG9zdCh2LCBtYXNrLCBwcm90bywgZGlyLCBxLmFkZHIpOworCQl9CisKKwljYXNlIFFfUE9SVDoKKwkJaWYgKHByb3RvID09IFFfVURQKQorCQkJcHJvdG8gPSBJUFBST1RPX1VEUDsKKwkJZWxzZSBpZiAocHJvdG8gPT0gUV9UQ1ApCisJCQlwcm90byA9IElQUFJPVE9fVENQOworCQllbHNlIGlmIChwcm90byA9PSBRX1NDVFApCisJCQlwcm90byA9IElQUFJPVE9fU0NUUDsKKwkJZWxzZSBpZiAocHJvdG8gPT0gUV9ERUZBVUxUKQorCQkJcHJvdG8gPSBQUk9UT19VTkRFRjsKKwkJZWxzZQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHF1YWxpZmllciBvZiAncG9ydCciKTsKKworCQlpZiAodiA+IDY1NTM1KQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHBvcnQgbnVtYmVyICV1ID4gNjU1MzUiLCB2KTsKKworI2lmbmRlZiBJTkVUNgorCQlyZXR1cm4gZ2VuX3BvcnQoKGludCl2LCBwcm90bywgZGlyKTsKKyNlbHNlCisJICAgIHsKKwkJc3RydWN0IGJsb2NrICpiOworCQliID0gZ2VuX3BvcnQoKGludCl2LCBwcm90bywgZGlyKTsKKwkJZ2VuX29yKGdlbl9wb3J0NigoaW50KXYsIHByb3RvLCBkaXIpLCBiKTsKKwkJcmV0dXJuIGI7CisJICAgIH0KKyNlbmRpZiAvKiBJTkVUNiAqLworCisJY2FzZSBRX1BPUlRSQU5HRToKKwkJaWYgKHByb3RvID09IFFfVURQKQorCQkJcHJvdG8gPSBJUFBST1RPX1VEUDsKKwkJZWxzZSBpZiAocHJvdG8gPT0gUV9UQ1ApCisJCQlwcm90byA9IElQUFJPVE9fVENQOworCQllbHNlIGlmIChwcm90byA9PSBRX1NDVFApCisJCQlwcm90byA9IElQUFJPVE9fU0NUUDsKKwkJZWxzZSBpZiAocHJvdG8gPT0gUV9ERUZBVUxUKQorCQkJcHJvdG8gPSBQUk9UT19VTkRFRjsKKwkJZWxzZQorCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIHF1YWxpZmllciBvZiAncG9ydHJhbmdlJyIpOworCisJCWlmICh2ID4gNjU1MzUpCisJCQlicGZfZXJyb3IoImlsbGVnYWwgcG9ydCBudW1iZXIgJXUgPiA2NTUzNSIsIHYpOworCisjaWZuZGVmIElORVQ2CisJCXJldHVybiBnZW5fcG9ydHJhbmdlKChpbnQpdiwgKGludCl2LCBwcm90bywgZGlyKTsKKyNlbHNlCisJICAgIHsKKwkJc3RydWN0IGJsb2NrICpiOworCQliID0gZ2VuX3BvcnRyYW5nZSgoaW50KXYsIChpbnQpdiwgcHJvdG8sIGRpcik7CisJCWdlbl9vcihnZW5fcG9ydHJhbmdlNigoaW50KXYsIChpbnQpdiwgcHJvdG8sIGRpciksIGIpOworCQlyZXR1cm4gYjsKKwkgICAgfQorI2VuZGlmIC8qIElORVQ2ICovCisKKwljYXNlIFFfR0FURVdBWToKKwkJYnBmX2Vycm9yKCInZ2F0ZXdheScgcmVxdWlyZXMgYSBuYW1lIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworCWNhc2UgUV9QUk9UTzoKKwkJcmV0dXJuIGdlbl9wcm90bygoaW50KXYsIHByb3RvLCBkaXIpOworCisJY2FzZSBRX1BST1RPQ0hBSU46CisJCXJldHVybiBnZW5fcHJvdG9jaGFpbigoaW50KXYsIHByb3RvLCBkaXIpOworCisJY2FzZSBRX1VOREVGOgorCQlzeW50YXgoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CisKKyNpZmRlZiBJTkVUNgorc3RydWN0IGJsb2NrICoKK2dlbl9tY29kZTYoczEsIHMyLCBtYXNrbGVuLCBxKQorCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKnMxLCAqczI7CisJcmVnaXN0ZXIgaW50IG1hc2tsZW47CisJc3RydWN0IHF1YWwgcTsKK3sKKwlzdHJ1Y3QgYWRkcmluZm8gKnJlczsKKwlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI7CisJc3RydWN0IGluNl9hZGRyIG1hc2s7CisJc3RydWN0IGJsb2NrICpiOworCXVfaW50MzJfdCAqYSwgKm07CisKKwlpZiAoczIpCisJCWJwZl9lcnJvcigibm8gbWFzayAlcyBzdXBwb3J0ZWQiLCBzMik7CisKKwlyZXMgPSBwY2FwX25hbWV0b2FkZHJpbmZvKHMxKTsKKwlpZiAoIXJlcykKKwkJYnBmX2Vycm9yKCJpbnZhbGlkIGlwNiBhZGRyZXNzICVzIiwgczEpOworCWFpID0gcmVzOworCWlmIChyZXMtPmFpX25leHQpCisJCWJwZl9lcnJvcigiJXMgcmVzb2x2ZWQgdG8gbXVsdGlwbGUgYWRkcmVzcyIsIHMxKTsKKwlhZGRyID0gJigoc3RydWN0IHNvY2thZGRyX2luNiAqKXJlcy0+YWlfYWRkciktPnNpbjZfYWRkcjsKKworCWlmIChzaXplb2YobWFzaykgKiA4IDwgbWFza2xlbikKKwkJYnBmX2Vycm9yKCJtYXNrIGxlbmd0aCBtdXN0IGJlIDw9ICV1IiwgKHVuc2lnbmVkIGludCkoc2l6ZW9mKG1hc2spICogOCkpOworCW1lbXNldCgmbWFzaywgMCwgc2l6ZW9mKG1hc2spKTsKKwltZW1zZXQoJm1hc2ssIDB4ZmYsIG1hc2tsZW4gLyA4KTsKKwlpZiAobWFza2xlbiAlIDgpIHsKKwkJbWFzay5zNl9hZGRyW21hc2tsZW4gLyA4XSA9CisJCQkoMHhmZiA8PCAoOCAtIG1hc2tsZW4gJSA4KSkgJiAweGZmOworCX0KKworCWEgPSAodV9pbnQzMl90ICopYWRkcjsKKwltID0gKHVfaW50MzJfdCAqKSZtYXNrOworCWlmICgoYVswXSAmIH5tWzBdKSB8fCAoYVsxXSAmIH5tWzFdKQorCSB8fCAoYVsyXSAmIH5tWzJdKSB8fCAoYVszXSAmIH5tWzNdKSkgeworCQlicGZfZXJyb3IoIm5vbi1uZXR3b3JrIGJpdHMgc2V0IGluIFwiJXMvJWRcIiIsIHMxLCBtYXNrbGVuKTsKKwl9CisKKwlzd2l0Y2ggKHEuYWRkcikgeworCisJY2FzZSBRX0RFRkFVTFQ6CisJY2FzZSBRX0hPU1Q6CisJCWlmIChtYXNrbGVuICE9IDEyOCkKKwkJCWJwZl9lcnJvcigiTWFzayBzeW50YXggZm9yIG5ldHdvcmtzIG9ubHkiKTsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKworCWNhc2UgUV9ORVQ6CisJCWIgPSBnZW5faG9zdDYoYWRkciwgJm1hc2ssIHEucHJvdG8sIHEuZGlyLCBxLmFkZHIpOworCQlhaSA9IE5VTEw7CisJCWZyZWVhZGRyaW5mbyhyZXMpOworCQlyZXR1cm4gYjsKKworCWRlZmF1bHQ6CisJCWJwZl9lcnJvcigiaW52YWxpZCBxdWFsaWZpZXIgYWdhaW5zdCBJUHY2IGFkZHJlc3MiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZiAvKklORVQ2Ki8KKworc3RydWN0IGJsb2NrICoKK2dlbl9lY29kZShlYWRkciwgcSkKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOworCXN0cnVjdCBxdWFsIHE7Cit7CisJc3RydWN0IGJsb2NrICpiLCAqdG1wOworCisJaWYgKChxLmFkZHIgPT0gUV9IT1NUIHx8IHEuYWRkciA9PSBRX0RFRkFVTFQpICYmIHEucHJvdG8gPT0gUV9MSU5LKSB7CisJCXN3aXRjaCAobGlua3R5cGUpIHsKKwkJY2FzZSBETFRfRU4xME1COgorCQljYXNlIERMVF9ORVRBTkFMWVpFUjoKKwkJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CisJCQlyZXR1cm4gZ2VuX2Vob3N0b3AoZWFkZHIsIChpbnQpcS5kaXIpOworCQljYXNlIERMVF9GRERJOgorCQkJcmV0dXJuIGdlbl9maG9zdG9wKGVhZGRyLCAoaW50KXEuZGlyKTsKKwkJY2FzZSBETFRfSUVFRTgwMjoKKwkJCXJldHVybiBnZW5fdGhvc3RvcChlYWRkciwgKGludClxLmRpcik7CisJCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCWNhc2UgRExUX1BQSToKKwkJCXJldHVybiBnZW5fd2xhbmhvc3RvcChlYWRkciwgKGludClxLmRpcik7CisJCWNhc2UgRExUX1NVTkFUTToKKwkJCWlmIChpc19sYW5lKSB7CisJCQkJLyoKKwkJCQkgKiBDaGVjayB0aGF0IHRoZSBwYWNrZXQgZG9lc24ndCBiZWdpbiB3aXRoIGFuCisJCQkJICogTEUgQ29udHJvbCBtYXJrZXIuICAoV2UndmUgYWxyZWFkeSBnZW5lcmF0ZWQKKwkJCQkgKiBhIHRlc3QgZm9yIExBTkUuKQorCQkJCSAqLworCQkJCXRtcCA9IGdlbl9jbXAoT1JfTElOSywgU1VOQVRNX1BLVF9CRUdJTl9QT1MsIEJQRl9ILAorCQkJCQkweEZGMDApOworCQkJCWdlbl9ub3QodG1wKTsKKworCQkJCS8qCisJCQkJICogTm93IGNoZWNrIHRoZSBNQUMgYWRkcmVzcy4KKwkJCQkgKi8KKwkJCQliID0gZ2VuX2Vob3N0b3AoZWFkZHIsIChpbnQpcS5kaXIpOworCQkJCWdlbl9hbmQodG1wLCBiKTsKKwkJCQlyZXR1cm4gYjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIERMVF9JUF9PVkVSX0ZDOgorCQkJcmV0dXJuIGdlbl9pcGZjaG9zdG9wKGVhZGRyLCAoaW50KXEuZGlyKTsKKwkJZGVmYXVsdDoKKwkJCWJwZl9lcnJvcigiZXRoZXJuZXQgYWRkcmVzc2VzIHN1cHBvcnRlZCBvbmx5IG9uIGV0aGVybmV0L0ZEREkvdG9rZW4gcmluZy84MDIuMTEvQVRNIExBTkUvRmlicmUgQ2hhbm5lbCIpOworCQkJYnJlYWs7CisJCX0KKwl9CisJYnBmX2Vycm9yKCJldGhlcm5ldCBhZGRyZXNzIHVzZWQgaW4gbm9uLWV0aGVyIGV4cHJlc3Npb24iKTsKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK3NhcHBlbmQoczAsIHMxKQorCXN0cnVjdCBzbGlzdCAqczAsICpzMTsKK3sKKwkvKgorCSAqIFRoaXMgaXMgZGVmaW5pdGVseSBub3QgdGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMsIGJ1dCB0aGUKKwkgKiBsaXN0cyB3aWxsIHJhcmVseSBnZXQgbG9uZy4KKwkgKi8KKwl3aGlsZSAoczAtPm5leHQpCisJCXMwID0gczAtPm5leHQ7CisJczAtPm5leHQgPSBzMTsKK30KKworc3RhdGljIHN0cnVjdCBzbGlzdCAqCit4ZmVyX3RvX3goYSkKKwlzdHJ1Y3QgYXJ0aCAqYTsKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwlzID0gbmV3X3N0bXQoQlBGX0xEWHxCUEZfTUVNKTsKKwlzLT5zLmsgPSBhLT5yZWdubzsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHN0cnVjdCBzbGlzdCAqCit4ZmVyX3RvX2EoYSkKKwlzdHJ1Y3QgYXJ0aCAqYTsKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwlzID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9NRU0pOworCXMtPnMuayA9IGEtPnJlZ25vOworCXJldHVybiBzOworfQorCisvKgorICogTW9kaWZ5ICJpbmRleCIgdG8gdXNlIHRoZSB2YWx1ZSBzdG9yZWQgaW50byBpdHMgcmVnaXN0ZXIgYXMgYW4KKyAqIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoZWFkZXIgZm9yIHRoZSBwcm90b2NvbAorICogInByb3RvIiwgYW5kIGFsbG9jYXRlIGEgcmVnaXN0ZXIgYW5kIHB1dCBhbiBpdGVtICJzaXplIiBieXRlcyBsb25nCisgKiAoMSwgMiwgb3IgNCkgYXQgdGhhdCBvZmZzZXQgaW50byB0aGF0IHJlZ2lzdGVyLCBtYWtpbmcgaXQgdGhlIHJlZ2lzdGVyCisgKiBmb3IgImluZGV4Ii4KKyAqLworc3RydWN0IGFydGggKgorZ2VuX2xvYWQocHJvdG8sIGluc3QsIHNpemUpCisJaW50IHByb3RvOworCXN0cnVjdCBhcnRoICppbnN0OworCWludCBzaXplOworeworCXN0cnVjdCBzbGlzdCAqcywgKnRtcDsKKwlzdHJ1Y3QgYmxvY2sgKmI7CisJaW50IHJlZ25vID0gYWxsb2NfcmVnKCk7CisKKwlmcmVlX3JlZyhpbnN0LT5yZWdubyk7CisJc3dpdGNoIChzaXplKSB7CisKKwlkZWZhdWx0OgorCQlicGZfZXJyb3IoImRhdGEgc2l6ZSBtdXN0IGJlIDEsIDIsIG9yIDQiKTsKKworCWNhc2UgMToKKwkJc2l6ZSA9IEJQRl9COworCQlicmVhazsKKworCWNhc2UgMjoKKwkJc2l6ZSA9IEJQRl9IOworCQlicmVhazsKKworCWNhc2UgNDoKKwkJc2l6ZSA9IEJQRl9XOworCQlicmVhazsKKwl9CisJc3dpdGNoIChwcm90bykgeworCWRlZmF1bHQ6CisJCWJwZl9lcnJvcigidW5zdXBwb3J0ZWQgaW5kZXggb3BlcmF0aW9uIik7CisKKwljYXNlIFFfUkFESU86CisJCS8qCisJCSAqIFRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0CisJCSAqIGRhdGEsIGlmIHdlIGhhdmUgYSByYWRpbyBoZWFkZXIuICAoSWYgd2UgZG9uJ3QsIHRoaXMKKwkJICogaXMgYW4gZXJyb3IuKQorCQkgKi8KKwkJaWYgKGxpbmt0eXBlICE9IERMVF9JRUVFODAyXzExX1JBRElPX0FWUyAmJgorCQkgICAgbGlua3R5cGUgIT0gRExUX0lFRUU4MDJfMTFfUkFESU8gJiYKKwkJICAgIGxpbmt0eXBlICE9IERMVF9QUklTTV9IRUFERVIpCisJCQlicGZfZXJyb3IoInJhZGlvIGluZm9ybWF0aW9uIG5vdCBwcmVzZW50IGluIGNhcHR1cmUiKTsKKworCQkvKgorCQkgKiBMb2FkIGludG8gdGhlIFggcmVnaXN0ZXIgdGhlIG9mZnNldCBjb21wdXRlZCBpbnRvIHRoZQorCQkgKiByZWdpc3RlciBzcGVjaWZpZWQgYnkgImluZGV4Ii4KKwkJICovCisJCXMgPSB4ZmVyX3RvX3goaW5zdCk7CisKKwkJLyoKKwkJICogTG9hZCB0aGUgaXRlbSBhdCB0aGF0IG9mZnNldC4KKwkJICovCisJCXRtcCA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOworCQlzYXBwZW5kKHMsIHRtcCk7CisJCXNhcHBlbmQoaW5zdC0+cywgcyk7CisJCWJyZWFrOworCisJY2FzZSBRX0xJTks6CisJCS8qCisJCSAqIFRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZgorCQkgKiB0aGUgbGluay1sYXllciBoZWFkZXIuCisJCSAqCisJCSAqIFhYWCAtIHdoYXQgYWJvdXQgQVRNIExBTkU/ICBTaG91bGQgdGhlIGluZGV4IGJlCisJCSAqIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEFBTDUgZnJhbWUsIHNvCisJCSAqIHRoYXQgMCByZWZlcnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgTEUgQ29udHJvbAorCQkgKiBmaWVsZCwgb3IgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgTEFOCisJCSAqIGZyYW1lLCBzbyB0aGF0IDAgcmVmZXJzLCBmb3IgRXRoZXJuZXQgTEFORSwgdG8KKwkJICogdGhlIGJlZ2lubmluZyBvZiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcz8KKwkJICovCisJCXMgPSBnZW5fbGxwcmVmaXhsZW4oKTsKKworCQkvKgorCQkgKiBJZiAicyIgaXMgbm9uLW51bGwsIGl0IGhhcyBjb2RlIHRvIGFycmFuZ2UgdGhhdCB0aGUKKwkJICogWCByZWdpc3RlciBjb250YWlucyB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggcHJlY2VkaW5nCisJCSAqIHRoZSBsaW5rLWxheWVyIGhlYWRlci4gIEFkZCB0byBpdCB0aGUgb2Zmc2V0IGNvbXB1dGVkCisJCSAqIGludG8gdGhlIHJlZ2lzdGVyIHNwZWNpZmllZCBieSAiaW5kZXgiLCBhbmQgbW92ZSB0aGF0CisJCSAqIGludG8gdGhlIFggcmVnaXN0ZXIuICBPdGhlcndpc2UsIGp1c3QgbG9hZCBpbnRvIHRoZSBYCisJCSAqIHJlZ2lzdGVyIHRoZSBvZmZzZXQgY29tcHV0ZWQgaW50byB0aGUgcmVnaXN0ZXIgc3BlY2lmaWVkCisJCSAqIGJ5ICJpbmRleCIuCisJCSAqLworCQlpZiAocyAhPSBOVUxMKSB7CisJCQlzYXBwZW5kKHMsIHhmZXJfdG9fYShpbnN0KSk7CisJCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9BTFV8QlBGX0FERHxCUEZfWCkpOworCQkJc2FwcGVuZChzLCBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKSk7CisJCX0gZWxzZQorCQkJcyA9IHhmZXJfdG9feChpbnN0KTsKKworCQkvKgorCQkgKiBMb2FkIHRoZSBpdGVtIGF0IHRoZSBzdW0gb2YgdGhlIG9mZnNldCB3ZSd2ZSBwdXQgaW4gdGhlCisJCSAqIFggcmVnaXN0ZXIgYW5kIHRoZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaW5rCisJCSAqIGxheWVyIGhlYWRlciAod2hpY2ggaXMgMCBpZiB0aGUgcmFkaW8gaGVhZGVyIGlzCisJCSAqIHZhcmlhYmxlLWxlbmd0aDsgdGhhdCBoZWFkZXIgbGVuZ3RoIGlzIHdoYXQgd2UgcHV0CisJCSAqIGludG8gdGhlIFggcmVnaXN0ZXIgYW5kIHRoZW4gYWRkZWQgdG8gdGhlIGluZGV4KS4KKwkJICovCisJCXRtcCA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU5EfHNpemUpOworCQl0bXAtPnMuayA9IG9mZl9sbDsKKwkJc2FwcGVuZChzLCB0bXApOworCQlzYXBwZW5kKGluc3QtPnMsIHMpOworCQlicmVhazsKKworCWNhc2UgUV9JUDoKKwljYXNlIFFfQVJQOgorCWNhc2UgUV9SQVJQOgorCWNhc2UgUV9BVEFMSzoKKwljYXNlIFFfREVDTkVUOgorCWNhc2UgUV9TQ0E6CisJY2FzZSBRX0xBVDoKKwljYXNlIFFfTU9QUkM6CisJY2FzZSBRX01PUERMOgorI2lmZGVmIElORVQ2CisJY2FzZSBRX0lQVjY6CisjZW5kaWYKKwkJLyoKKwkJICogVGhlIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCisJCSAqIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlci4KKwkJICogWFhYIC0gYXJlIHRoZXJlIGFueSBjYXNlcyB3aGVyZSB3ZSB3YW50CisJCSAqIG9mZl9ubF9ub3NuYXA/CisJCSAqLworCQlzID0gZ2VuX29mZl9tYWNwbCgpOworCisJCS8qCisJCSAqIElmICJzIiBpcyBub24tbnVsbCwgaXQgaGFzIGNvZGUgdG8gYXJyYW5nZSB0aGF0IHRoZQorCQkgKiBYIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBvZmZzZXQgb2YgdGhlIE1BQy1sYXllcgorCQkgKiBwYXlsb2FkLiAgQWRkIHRvIGl0IHRoZSBvZmZzZXQgY29tcHV0ZWQgaW50byB0aGUKKwkJICogcmVnaXN0ZXIgc3BlY2lmaWVkIGJ5ICJpbmRleCIsIGFuZCBtb3ZlIHRoYXQgaW50bworCQkgKiB0aGUgWCByZWdpc3Rlci4gIE90aGVyd2lzZSwganVzdCBsb2FkIGludG8gdGhlIFgKKwkJICogcmVnaXN0ZXIgdGhlIG9mZnNldCBjb21wdXRlZCBpbnRvIHRoZSByZWdpc3RlciBzcGVjaWZpZWQKKwkJICogYnkgImluZGV4Ii4KKwkJICovCisJCWlmIChzICE9IE5VTEwpIHsKKwkJCXNhcHBlbmQocywgeGZlcl90b19hKGluc3QpKTsKKwkJCXNhcHBlbmQocywgbmV3X3N0bXQoQlBGX0FMVXxCUEZfQUREfEJQRl9YKSk7CisJCQlzYXBwZW5kKHMsIG5ld19zdG10KEJQRl9NSVNDfEJQRl9UQVgpKTsKKwkJfSBlbHNlCisJCQlzID0geGZlcl90b194KGluc3QpOworCisJCS8qCisJCSAqIExvYWQgdGhlIGl0ZW0gYXQgdGhlIHN1bSBvZiB0aGUgb2Zmc2V0IHdlJ3ZlIHB1dCBpbiB0aGUKKwkJICogWCByZWdpc3RlciwgdGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIG5ldHdvcmsKKwkJICogbGF5ZXIgaGVhZGVyIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFDLWxheWVyCisJCSAqIHBheWxvYWQsIGFuZCB0aGUgcHVycG9ydGVkIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlCisJCSAqIE1BQy1sYXllciBwYXlsb2FkICh3aGljaCBtaWdodCBiZSAwIGlmIHRoZXJlJ3MgYQorCQkgKiB2YXJpYWJsZS1sZW5ndGggcHJlZml4IGJlZm9yZSB0aGUgbGluay1sYXllciBoZWFkZXIKKwkJICogb3IgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGl0c2VsZiBpcyB2YXJpYWJsZS1sZW5ndGg7CisJCSAqIHRoZSB2YXJpYWJsZS1sZW5ndGggb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUKKwkJICogTUFDLWxheWVyIHBheWxvYWQgaXMgd2hhdCB3ZSBwdXQgaW50byB0aGUgWCByZWdpc3RlcgorCQkgKiBhbmQgdGhlbiBhZGRlZCB0byB0aGUgaW5kZXgpLgorCQkgKi8KKwkJdG1wID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8c2l6ZSk7CisJCXRtcC0+cy5rID0gb2ZmX21hY3BsICsgb2ZmX25sOworCQlzYXBwZW5kKHMsIHRtcCk7CisJCXNhcHBlbmQoaW5zdC0+cywgcyk7CisKKwkJLyoKKwkJICogRG8gdGhlIGNvbXB1dGF0aW9uIG9ubHkgaWYgdGhlIHBhY2tldCBjb250YWlucworCQkgKiB0aGUgcHJvdG9jb2wgaW4gcXVlc3Rpb24uCisJCSAqLworCQliID0gZ2VuX3Byb3RvX2FiYnJldihwcm90byk7CisJCWlmIChpbnN0LT5iKQorCQkJZ2VuX2FuZChpbnN0LT5iLCBiKTsKKwkJaW5zdC0+YiA9IGI7CisJCWJyZWFrOworCisJY2FzZSBRX1NDVFA6CisJY2FzZSBRX1RDUDoKKwljYXNlIFFfVURQOgorCWNhc2UgUV9JQ01QOgorCWNhc2UgUV9JR01QOgorCWNhc2UgUV9JR1JQOgorCWNhc2UgUV9QSU06CisJY2FzZSBRX1ZSUlA6CisJY2FzZSBRX0NBUlA6CisJCS8qCisJCSAqIFRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZgorCQkgKiB0aGUgdHJhbnNwb3J0LWxheWVyIGhlYWRlci4KKwkJICoKKwkJICogTG9hZCB0aGUgWCByZWdpc3RlciB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIElQdjQgaGVhZGVyCisJCSAqIChwbHVzIHRoZSBvZmZzZXQgb2YgdGhlIGxpbmstbGF5ZXIgaGVhZGVyLCBpZiBpdCdzCisJCSAqIGEgdmFyaWFibGUtbGVuZ3RoIGhlYWRlciksIGluIGJ5dGVzLgorCQkgKgorCQkgKiBYWFggLSBhcmUgdGhlcmUgYW55IGNhc2VzIHdoZXJlIHdlIHdhbnQKKwkJICogb2ZmX25sX25vc25hcD8KKwkJICogWFhYIC0gd2Ugc2hvdWxkLCBpZiB3ZSdyZSBidWlsdCB3aXRoCisJCSAqIElQdjYgc3VwcG9ydCwgZ2VuZXJhdGUgY29kZSB0byBsb2FkIGVpdGhlcgorCQkgKiBJUHY0LCBJUHY2LCBvciBib3RoLCBhcyBhcHByb3ByaWF0ZS4KKwkJICovCisJCXMgPSBnZW5fbG9hZHhfaXBoZHJsZW4oKTsKKworCQkvKgorCQkgKiBUaGUgWCByZWdpc3RlciBub3cgY29udGFpbnMgdGhlIHN1bSBvZiB0aGUgbGVuZ3RoCisJCSAqIG9mIGFueSB2YXJpYWJsZS1sZW5ndGggaGVhZGVyIHByZWNlZGluZyB0aGUgbGluay1sYXllcgorCQkgKiBoZWFkZXIsIGFueSB2YXJpYWJsZS1sZW5ndGggbGluay1sYXllciBoZWFkZXIsIGFuZCB0aGUKKwkJICogbGVuZ3RoIG9mIHRoZSBuZXR3b3JrLWxheWVyIGhlYWRlci4KKwkJICoKKwkJICogTG9hZCBpbnRvIHRoZSBBIHJlZ2lzdGVyIHRoZSBvZmZzZXQgcmVsYXRpdmUgdG8KKwkJICogdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhbnNwb3J0IGxheWVyIGhlYWRlciwKKwkJICogYWRkIHRoZSBYIHJlZ2lzdGVyIHRvIHRoYXQsIG1vdmUgdGhhdCB0byB0aGUKKwkJICogWCByZWdpc3RlciwgYW5kIGxvYWQgd2l0aCBhbiBvZmZzZXQgZnJvbSB0aGUKKwkJICogWCByZWdpc3RlciBlcXVhbCB0byB0aGUgb2Zmc2V0IG9mIHRoZSBuZXR3b3JrCisJCSAqIGxheWVyIGhlYWRlciByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCisJCSAqIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZCBwbHVzIHRoZSBmaXhlZC1sZW5ndGgKKwkJICogcG9ydGlvbiBvZiB0aGUgb2Zmc2V0IG9mIHRoZSBNQUMtbGF5ZXIgcGF5bG9hZAorCQkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJhdyBwYWNrZXQgZGF0YS4KKwkJICovCisJCXNhcHBlbmQocywgeGZlcl90b19hKGluc3QpKTsKKwkJc2FwcGVuZChzLCBuZXdfc3RtdChCUEZfQUxVfEJQRl9BRER8QlBGX1gpKTsKKwkJc2FwcGVuZChzLCBuZXdfc3RtdChCUEZfTUlTQ3xCUEZfVEFYKSk7CisJCXNhcHBlbmQocywgdG1wID0gbmV3X3N0bXQoQlBGX0xEfEJQRl9JTkR8c2l6ZSkpOworCQl0bXAtPnMuayA9IG9mZl9tYWNwbCArIG9mZl9ubDsKKwkJc2FwcGVuZChpbnN0LT5zLCBzKTsKKworCQkvKgorCQkgKiBEbyB0aGUgY29tcHV0YXRpb24gb25seSBpZiB0aGUgcGFja2V0IGNvbnRhaW5zCisJCSAqIHRoZSBwcm90b2NvbCBpbiBxdWVzdGlvbiAtIHdoaWNoIGlzIHRydWUgb25seQorCQkgKiBpZiB0aGlzIGlzIGFuIElQIGRhdGFncmFtIGFuZCBpcyB0aGUgZmlyc3Qgb3IKKwkJICogb25seSBmcmFnbWVudCBvZiB0aGF0IGRhdGFncmFtLgorCQkgKi8KKwkJZ2VuX2FuZChnZW5fcHJvdG9fYWJicmV2KHByb3RvKSwgYiA9IGdlbl9pcGZyYWcoKSk7CisJCWlmIChpbnN0LT5iKQorCQkJZ2VuX2FuZChpbnN0LT5iLCBiKTsKKyNpZmRlZiBJTkVUNgorCQlnZW5fYW5kKGdlbl9wcm90b19hYmJyZXYoUV9JUCksIGIpOworI2VuZGlmCisJCWluc3QtPmIgPSBiOworCQlicmVhazsKKyNpZmRlZiBJTkVUNgorCWNhc2UgUV9JQ01QVjY6CisJCWJwZl9lcnJvcigiSVB2NiB1cHBlci1sYXllciBwcm90b2NvbCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvW3hdIik7CisJCS8qTk9UUkVBQ0hFRCovCisjZW5kaWYKKwl9CisJaW5zdC0+cmVnbm8gPSByZWdubzsKKwlzID0gbmV3X3N0bXQoQlBGX1NUKTsKKwlzLT5zLmsgPSByZWdubzsKKwlzYXBwZW5kKGluc3QtPnMsIHMpOworCisJcmV0dXJuIGluc3Q7Cit9CisKK3N0cnVjdCBibG9jayAqCitnZW5fcmVsYXRpb24oY29kZSwgYTAsIGExLCByZXZlcnNlZCkKKwlpbnQgY29kZTsKKwlzdHJ1Y3QgYXJ0aCAqYTAsICphMTsKKwlpbnQgcmV2ZXJzZWQ7Cit7CisJc3RydWN0IHNsaXN0ICpzMCwgKnMxLCAqczI7CisJc3RydWN0IGJsb2NrICpiLCAqdG1wOworCisJczAgPSB4ZmVyX3RvX3goYTEpOworCXMxID0geGZlcl90b19hKGEwKTsKKwlpZiAoY29kZSA9PSBCUEZfSkVRKSB7CisJCXMyID0gbmV3X3N0bXQoQlBGX0FMVXxCUEZfU1VCfEJQRl9YKTsKKwkJYiA9IG5ld19ibG9jayhKTVAoY29kZSkpOworCQlzYXBwZW5kKHMxLCBzMik7CisJfQorCWVsc2UKKwkJYiA9IG5ld19ibG9jayhCUEZfSk1QfGNvZGV8QlBGX1gpOworCWlmIChyZXZlcnNlZCkKKwkJZ2VuX25vdChiKTsKKworCXNhcHBlbmQoczAsIHMxKTsKKwlzYXBwZW5kKGExLT5zLCBzMCk7CisJc2FwcGVuZChhMC0+cywgYTEtPnMpOworCisJYi0+c3RtdHMgPSBhMC0+czsKKworCWZyZWVfcmVnKGEwLT5yZWdubyk7CisJZnJlZV9yZWcoYTEtPnJlZ25vKTsKKworCS8qICdhbmQnIHRvZ2V0aGVyIHByb3RvY29sIGNoZWNrcyAqLworCWlmIChhMC0+YikgeworCQlpZiAoYTEtPmIpIHsKKwkJCWdlbl9hbmQoYTAtPmIsIHRtcCA9IGExLT5iKTsKKwkJfQorCQllbHNlCisJCQl0bXAgPSBhMC0+YjsKKwl9IGVsc2UKKwkJdG1wID0gYTEtPmI7CisKKwlpZiAodG1wKQorCQlnZW5fYW5kKHRtcCwgYik7CisKKwlyZXR1cm4gYjsKK30KKworc3RydWN0IGFydGggKgorZ2VuX2xvYWRsZW4oKQoreworCWludCByZWdubyA9IGFsbG9jX3JlZygpOworCXN0cnVjdCBhcnRoICphID0gKHN0cnVjdCBhcnRoICopbmV3Y2h1bmsoc2l6ZW9mKCphKSk7CisJc3RydWN0IHNsaXN0ICpzOworCisJcyA9IG5ld19zdG10KEJQRl9MRHxCUEZfTEVOKTsKKwlzLT5uZXh0ID0gbmV3X3N0bXQoQlBGX1NUKTsKKwlzLT5uZXh0LT5zLmsgPSByZWdubzsKKwlhLT5zID0gczsKKwlhLT5yZWdubyA9IHJlZ25vOworCisJcmV0dXJuIGE7Cit9CisKK3N0cnVjdCBhcnRoICoKK2dlbl9sb2FkaSh2YWwpCisJaW50IHZhbDsKK3sKKwlzdHJ1Y3QgYXJ0aCAqYTsKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisJaW50IHJlZzsKKworCWEgPSAoc3RydWN0IGFydGggKiluZXdjaHVuayhzaXplb2YoKmEpKTsKKworCXJlZyA9IGFsbG9jX3JlZygpOworCisJcyA9IG5ld19zdG10KEJQRl9MRHxCUEZfSU1NKTsKKwlzLT5zLmsgPSB2YWw7CisJcy0+bmV4dCA9IG5ld19zdG10KEJQRl9TVCk7CisJcy0+bmV4dC0+cy5rID0gcmVnOworCWEtPnMgPSBzOworCWEtPnJlZ25vID0gcmVnOworCisJcmV0dXJuIGE7Cit9CisKK3N0cnVjdCBhcnRoICoKK2dlbl9uZWcoYSkKKwlzdHJ1Y3QgYXJ0aCAqYTsKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnM7CisKKwlzID0geGZlcl90b19hKGEpOworCXNhcHBlbmQoYS0+cywgcyk7CisJcyA9IG5ld19zdG10KEJQRl9BTFV8QlBGX05FRyk7CisJcy0+cy5rID0gMDsKKwlzYXBwZW5kKGEtPnMsIHMpOworCXMgPSBuZXdfc3RtdChCUEZfU1QpOworCXMtPnMuayA9IGEtPnJlZ25vOworCXNhcHBlbmQoYS0+cywgcyk7CisKKwlyZXR1cm4gYTsKK30KKworc3RydWN0IGFydGggKgorZ2VuX2FydGgoY29kZSwgYTAsIGExKQorCWludCBjb2RlOworCXN0cnVjdCBhcnRoICphMCwgKmExOworeworCXN0cnVjdCBzbGlzdCAqczAsICpzMSwgKnMyOworCisJczAgPSB4ZmVyX3RvX3goYTEpOworCXMxID0geGZlcl90b19hKGEwKTsKKwlzMiA9IG5ld19zdG10KEJQRl9BTFV8QlBGX1h8Y29kZSk7CisKKwlzYXBwZW5kKHMxLCBzMik7CisJc2FwcGVuZChzMCwgczEpOworCXNhcHBlbmQoYTEtPnMsIHMwKTsKKwlzYXBwZW5kKGEwLT5zLCBhMS0+cyk7CisKKwlmcmVlX3JlZyhhMC0+cmVnbm8pOworCWZyZWVfcmVnKGExLT5yZWdubyk7CisKKwlzMCA9IG5ld19zdG10KEJQRl9TVCk7CisJYTAtPnJlZ25vID0gczAtPnMuayA9IGFsbG9jX3JlZygpOworCXNhcHBlbmQoYTAtPnMsIHMwKTsKKworCXJldHVybiBhMDsKK30KKworLyoKKyAqIEhlcmUgd2UgaGFuZGxlIHNpbXBsZSBhbGxvY2F0aW9uIG9mIHRoZSBzY3JhdGNoIHJlZ2lzdGVycy4KKyAqIElmIHRvbyBtYW55IHJlZ2lzdGVycyBhcmUgYWxsb2MnZCwgdGhlIGFsbG9jYXRvciBwdW50cy4KKyAqLworc3RhdGljIGludCByZWd1c2VkW0JQRl9NRU1XT1JEU107CitzdGF0aWMgaW50IGN1cnJlZzsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIHRhYmxlIG9mIHVzZWQgcmVnaXN0ZXJzIGFuZCB0aGUgY3VycmVudCByZWdpc3Rlci4KKyAqLworc3RhdGljIHZvaWQKK2luaXRfcmVncygpCit7CisJY3VycmVnID0gMDsKKwltZW1zZXQocmVndXNlZCwgMCwgc2l6ZW9mIHJlZ3VzZWQpOworfQorCisvKgorICogUmV0dXJuIHRoZSBuZXh0IGZyZWUgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQKK2FsbG9jX3JlZygpCit7CisJaW50IG4gPSBCUEZfTUVNV09SRFM7CisKKwl3aGlsZSAoLS1uID49IDApIHsKKwkJaWYgKHJlZ3VzZWRbY3VycmVnXSkKKwkJCWN1cnJlZyA9IChjdXJyZWcgKyAxKSAlIEJQRl9NRU1XT1JEUzsKKwkJZWxzZSB7CisJCQlyZWd1c2VkW2N1cnJlZ10gPSAxOworCQkJcmV0dXJuIGN1cnJlZzsKKwkJfQorCX0KKwlicGZfZXJyb3IoInRvbyBtYW55IHJlZ2lzdGVycyBuZWVkZWQgdG8gZXZhbHVhdGUgZXhwcmVzc2lvbiIpOworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybiBhIHJlZ2lzdGVyIHRvIHRoZSB0YWJsZSBzbyBpdCBjYW4KKyAqIGJlIHVzZWQgbGF0ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlX3JlZyhuKQorCWludCBuOworeworCXJlZ3VzZWRbbl0gPSAwOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9sZW4oam1wLCBuKQorCWludCBqbXAsIG47Cit7CisJc3RydWN0IHNsaXN0ICpzOworCXN0cnVjdCBibG9jayAqYjsKKworCXMgPSBuZXdfc3RtdChCUEZfTER8QlBGX0xFTik7CisJYiA9IG5ld19ibG9jayhKTVAoam1wKSk7CisJYi0+c3RtdHMgPSBzOworCWItPnMuayA9IG47CisKKwlyZXR1cm4gYjsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9ncmVhdGVyKG4pCisJaW50IG47Cit7CisJcmV0dXJuIGdlbl9sZW4oQlBGX0pHRSwgbik7Cit9CisKKy8qCisgKiBBY3R1YWxseSwgdGhpcyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwuCisgKi8KK3N0cnVjdCBibG9jayAqCitnZW5fbGVzcyhuKQorCWludCBuOworeworCXN0cnVjdCBibG9jayAqYjsKKworCWIgPSBnZW5fbGVuKEJQRl9KR1QsIG4pOworCWdlbl9ub3QoYik7CisKKwlyZXR1cm4gYjsKK30KKworLyoKKyAqIFRoaXMgaXMgZm9yICJieXRlIHtpZHh9IHtvcH0ge3ZhbH0iOyAiaWR4IiBpcyB0cmVhdGVkIGFzIHJlbGF0aXZlIHRvCisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5rLWxheWVyIGhlYWRlci4KKyAqIFhYWCAtIHRoYXQgbWVhbnMgeW91IGNhbid0IHRlc3QgdmFsdWVzIGluIHRoZSByYWRpb3RhcCBoZWFkZXIsIGJ1dAorICogYXMgdGhhdCBoZWFkZXIgaXMgZGlmZmljdWx0IGlmIG5vdCBpbXBvc3NpYmxlIHRvIHBhcnNlIGdlbmVyYWxseQorICogd2l0aG91dCBhIGxvb3AsIHRoYXQgbWlnaHQgbm90IGJlIGEgc2V2ZXJlIHByb2JsZW0uICBBIG5ldyBrZXl3b3JkCisgKiAicmFkaW8iIGNvdWxkIGJlIGFkZGVkIGZvciB0aGF0LCBhbHRob3VnaCB3aGF0IHlvdSdkIHJlYWxseSB3YW50CisgKiB3b3VsZCBiZSBhIHdheSBvZiB0ZXN0aW5nIHBhcnRpY3VsYXIgcmFkaW8gaGVhZGVyIHZhbHVlcywgd2hpY2gKKyAqIHdvdWxkIGdlbmVyYXRlIGNvZGUgYXBwcm9wcmlhdGUgdG8gdGhlIHJhZGlvIGhlYWRlciBpbiBxdWVzdGlvbi4KKyAqLworc3RydWN0IGJsb2NrICoKK2dlbl9ieXRlb3Aob3AsIGlkeCwgdmFsKQorCWludCBvcCwgaWR4LCB2YWw7Cit7CisJc3RydWN0IGJsb2NrICpiOworCXN0cnVjdCBzbGlzdCAqczsKKworCXN3aXRjaCAob3ApIHsKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCisJY2FzZSAnPSc6CisJCXJldHVybiBnZW5fY21wKE9SX0xJTkssICh1X2ludClpZHgsIEJQRl9CLCAoYnBmX2ludDMyKXZhbCk7CisKKwljYXNlICc8JzoKKwkJYiA9IGdlbl9jbXBfbHQoT1JfTElOSywgKHVfaW50KWlkeCwgQlBGX0IsIChicGZfaW50MzIpdmFsKTsKKwkJcmV0dXJuIGI7CisKKwljYXNlICc+JzoKKwkJYiA9IGdlbl9jbXBfZ3QoT1JfTElOSywgKHVfaW50KWlkeCwgQlBGX0IsIChicGZfaW50MzIpdmFsKTsKKwkJcmV0dXJuIGI7CisKKwljYXNlICd8JzoKKwkJcyA9IG5ld19zdG10KEJQRl9BTFV8QlBGX09SfEJQRl9LKTsKKwkJYnJlYWs7CisKKwljYXNlICcmJzoKKwkJcyA9IG5ld19zdG10KEJQRl9BTFV8QlBGX0FORHxCUEZfSyk7CisJCWJyZWFrOworCX0KKwlzLT5zLmsgPSB2YWw7CisJYiA9IG5ld19ibG9jayhKTVAoQlBGX0pFUSkpOworCWItPnN0bXRzID0gczsKKwlnZW5fbm90KGIpOworCisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyB1X2NoYXIgYWJyb2FkY2FzdFtdID0geyAweDAgfTsKKworc3RydWN0IGJsb2NrICoKK2dlbl9icm9hZGNhc3QocHJvdG8pCisJaW50IHByb3RvOworeworCWJwZl91X2ludDMyIGhvc3RtYXNrOworCXN0cnVjdCBibG9jayAqYjAsICpiMSwgKmIyOworCXN0YXRpYyB1X2NoYXIgZWJyb2FkY2FzdFtdID0geyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisKKwlzd2l0Y2ggKHByb3RvKSB7CisKKwljYXNlIFFfREVGQVVMVDoKKwljYXNlIFFfTElOSzoKKwkJc3dpdGNoIChsaW5rdHlwZSkgeworCQljYXNlIERMVF9BUkNORVQ6CisJCWNhc2UgRExUX0FSQ05FVF9MSU5VWDoKKwkJCXJldHVybiBnZW5fYWhvc3RvcChhYnJvYWRjYXN0LCBRX0RTVCk7CisJCWNhc2UgRExUX0VOMTBNQjoKKwkJY2FzZSBETFRfTkVUQU5BTFlaRVI6CisJCWNhc2UgRExUX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5UOgorCQkJcmV0dXJuIGdlbl9laG9zdG9wKGVicm9hZGNhc3QsIFFfRFNUKTsKKwkJY2FzZSBETFRfRkRESToKKwkJCXJldHVybiBnZW5fZmhvc3RvcChlYnJvYWRjYXN0LCBRX0RTVCk7CisJCWNhc2UgRExUX0lFRUU4MDI6CisJCQlyZXR1cm4gZ2VuX3Rob3N0b3AoZWJyb2FkY2FzdCwgUV9EU1QpOworCQljYXNlIERMVF9JRUVFODAyXzExOgorCQljYXNlIERMVF9QUklTTV9IRUFERVI6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCQljYXNlIERMVF9JRUVFODAyXzExX1JBRElPOgorCQljYXNlIERMVF9QUEk6CisJCQlyZXR1cm4gZ2VuX3dsYW5ob3N0b3AoZWJyb2FkY2FzdCwgUV9EU1QpOworCQljYXNlIERMVF9JUF9PVkVSX0ZDOgorCQkJcmV0dXJuIGdlbl9pcGZjaG9zdG9wKGVicm9hZGNhc3QsIFFfRFNUKTsKKwkJY2FzZSBETFRfU1VOQVRNOgorCQkJaWYgKGlzX2xhbmUpIHsKKwkJCQkvKgorCQkJCSAqIENoZWNrIHRoYXQgdGhlIHBhY2tldCBkb2Vzbid0IGJlZ2luIHdpdGggYW4KKwkJCQkgKiBMRSBDb250cm9sIG1hcmtlci4gIChXZSd2ZSBhbHJlYWR5IGdlbmVyYXRlZAorCQkJCSAqIGEgdGVzdCBmb3IgTEFORS4pCisJCQkJICovCisJCQkJYjEgPSBnZW5fY21wKE9SX0xJTkssIFNVTkFUTV9QS1RfQkVHSU5fUE9TLAorCQkJCSAgICBCUEZfSCwgMHhGRjAwKTsKKwkJCQlnZW5fbm90KGIxKTsKKworCQkJCS8qCisJCQkJICogTm93IGNoZWNrIHRoZSBNQUMgYWRkcmVzcy4KKwkJCQkgKi8KKwkJCQliMCA9IGdlbl9laG9zdG9wKGVicm9hZGNhc3QsIFFfRFNUKTsKKwkJCQlnZW5fYW5kKGIxLCBiMCk7CisJCQkJcmV0dXJuIGIwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicGZfZXJyb3IoIm5vdCBhIGJyb2FkY2FzdCBsaW5rIik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFFfSVA6CisJCS8qCisJCSAqIFdlIHRyZWF0IGEgbmV0bWFzayBvZiBQQ0FQX05FVE1BU0tfVU5LTk9XTiAoMHhmZmZmZmZmZikKKwkJICogYXMgYW4gaW5kaWNhdGlvbiB0aGF0IHdlIGRvbid0IGtub3cgdGhlIG5ldG1hc2ssIGFuZCBmYWlsCisJCSAqIGluIHRoYXQgY2FzZS4KKwkJICovCisJCWlmIChuZXRtYXNrID09IFBDQVBfTkVUTUFTS19VTktOT1dOKQorCQkJYnBmX2Vycm9yKCJuZXRtYXNrIG5vdCBrbm93biwgc28gJ2lwIGJyb2FkY2FzdCcgbm90IHN1cHBvcnRlZCIpOworCQliMCA9IGdlbl9saW5rdHlwZShFVEhFUlRZUEVfSVApOworCQlob3N0bWFzayA9IH5uZXRtYXNrOworCQliMSA9IGdlbl9tY21wKE9SX05FVCwgMTYsIEJQRl9XLCAoYnBmX2ludDMyKTAsIGhvc3RtYXNrKTsKKwkJYjIgPSBnZW5fbWNtcChPUl9ORVQsIDE2LCBCUEZfVywKKwkJCSAgICAgIChicGZfaW50MzIpKH4wICYgaG9zdG1hc2spLCBob3N0bWFzayk7CisJCWdlbl9vcihiMSwgYjIpOworCQlnZW5fYW5kKGIwLCBiMik7CisJCXJldHVybiBiMjsKKwl9CisJYnBmX2Vycm9yKCJvbmx5IGxpbmstbGF5ZXIvSVAgYnJvYWRjYXN0IGZpbHRlcnMgc3VwcG9ydGVkIik7CisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybiBOVUxMOworfQorCisvKgorICogR2VuZXJhdGUgY29kZSB0byB0ZXN0IHRoZSBsb3ctb3JkZXIgYml0IG9mIGEgTUFDIGFkZHJlc3MgKHRoYXQncworICogdGhlIGJvdHRvbSBiaXQgb2YgdGhlICpmaXJzdCogYnl0ZSkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX21hY19tdWx0aWNhc3Qob2Zmc2V0KQorCWludCBvZmZzZXQ7Cit7CisJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiMDsKKwlyZWdpc3RlciBzdHJ1Y3Qgc2xpc3QgKnM7CisKKwkvKiBsaW5rW29mZnNldF0gJiAxICE9IDAgKi8KKwlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCBvZmZzZXQsIEJQRl9CKTsKKwliMCA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwliMC0+cy5rID0gMTsKKwliMC0+c3RtdHMgPSBzOworCXJldHVybiBiMDsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9tdWx0aWNhc3QocHJvdG8pCisJaW50IHByb3RvOworeworCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjAsICpiMSwgKmIyOworCXJlZ2lzdGVyIHN0cnVjdCBzbGlzdCAqczsKKworCXN3aXRjaCAocHJvdG8pIHsKKworCWNhc2UgUV9ERUZBVUxUOgorCWNhc2UgUV9MSU5LOgorCQlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJCWNhc2UgRExUX0FSQ05FVDoKKwkJY2FzZSBETFRfQVJDTkVUX0xJTlVYOgorCQkJLyogYWxsIEFSQ25ldCBtdWx0aWNhc3RzIHVzZSB0aGUgc2FtZSBhZGRyZXNzICovCisJCQlyZXR1cm4gZ2VuX2Fob3N0b3AoYWJyb2FkY2FzdCwgUV9EU1QpOworCQljYXNlIERMVF9FTjEwTUI6CisJCWNhc2UgRExUX05FVEFOQUxZWkVSOgorCQljYXNlIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVDoKKwkJCS8qIGV0aGVyWzBdICYgMSAhPSAwICovCisJCQlyZXR1cm4gZ2VuX21hY19tdWx0aWNhc3QoMCk7CisJCWNhc2UgRExUX0ZEREk6CisJCQkvKgorCQkJICogWFhYIFRFU1QgVEhJUzogTUlHSFQgTk9UIFBPUlQgUFJPUEVSTFkgWFhYCisJCQkgKgorCQkJICogWFhYIC0gd2FzIHRoYXQgcmVmZXJyaW5nIHRvIGJpdC1vcmRlciBpc3N1ZXM/CisJCQkgKi8KKwkJCS8qIGZkZGlbMV0gJiAxICE9IDAgKi8KKwkJCXJldHVybiBnZW5fbWFjX211bHRpY2FzdCgxKTsKKwkJY2FzZSBETFRfSUVFRTgwMjoKKwkJCS8qIHRyWzJdICYgMSAhPSAwICovCisJCQlyZXR1cm4gZ2VuX21hY19tdWx0aWNhc3QoMik7CisJCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU86CisJCWNhc2UgRExUX1BQSToKKwkJCS8qCisJCQkgKiBPaCwgeXVrLgorCQkJICoKKwkJCSAqCUZvciBjb250cm9sIGZyYW1lcywgdGhlcmUgaXMgbm8gREEuCisJCQkgKgorCQkJICoJRm9yIG1hbmFnZW1lbnQgZnJhbWVzLCBEQSBpcyBhdCBhbgorCQkJICoJb2Zmc2V0IG9mIDQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mCisJCQkgKgl0aGUgcGFja2V0LgorCQkJICoKKwkJCSAqCUZvciBkYXRhIGZyYW1lcywgREEgaXMgYXQgYW4gb2Zmc2V0CisJCQkgKglvZiA0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0CisJCQkgKglpZiBUbyBEUyBpcyBjbGVhciBhbmQgYXQgYW4gb2Zmc2V0IG9mCisJCQkgKgkxNiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldAorCQkJICoJaWYgVG8gRFMgaXMgc2V0LgorCQkJICovCisKKwkJCS8qCisJCQkgKiBHZW5lcmF0ZSB0aGUgdGVzdHMgdG8gYmUgZG9uZSBmb3IgZGF0YSBmcmFtZXMuCisJCQkgKgorCQkJICogRmlyc3QsIGNoZWNrIGZvciBUbyBEUyBzZXQsIGkuZS4gImxpbmtbMV0gJiAweDAxIi4KKwkJCSAqLworCQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMSwgQlBGX0IpOworCQkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCQliMS0+cy5rID0gMHgwMTsJLyogVG8gRFMgKi8KKwkJCWIxLT5zdG10cyA9IHM7CisKKwkJCS8qCisJCQkgKiBJZiBUbyBEUyBpcyBzZXQsIHRoZSBEQSBpcyBhdCAxNi4KKwkJCSAqLworCQkJYjAgPSBnZW5fbWFjX211bHRpY2FzdCgxNik7CisJCQlnZW5fYW5kKGIxLCBiMCk7CisKKwkJCS8qCisJCQkgKiBOb3csIGNoZWNrIGZvciBUbyBEUyBub3Qgc2V0LCBpLmUuIGNoZWNrCisJCQkgKiAiIShsaW5rWzFdICYgMHgwMSkiLgorCQkJICovCisJCQlzID0gZ2VuX2xvYWRfYShPUl9MSU5LLCAxLCBCUEZfQik7CisJCQliMiA9IG5ld19ibG9jayhKTVAoQlBGX0pTRVQpKTsKKwkJCWIyLT5zLmsgPSAweDAxOwkvKiBUbyBEUyAqLworCQkJYjItPnN0bXRzID0gczsKKwkJCWdlbl9ub3QoYjIpOworCisJCQkvKgorCQkJICogSWYgVG8gRFMgaXMgbm90IHNldCwgdGhlIERBIGlzIGF0IDQuCisJCQkgKi8KKwkJCWIxID0gZ2VuX21hY19tdWx0aWNhc3QoNCk7CisJCQlnZW5fYW5kKGIyLCBiMSk7CisKKwkJCS8qCisJCQkgKiBOb3cgT1IgdG9nZXRoZXIgdGhlIGxhc3QgdHdvIGNoZWNrcy4gIFRoYXQgZ2l2ZXMKKwkJCSAqIHRoZSBjb21wbGV0ZSBzZXQgb2YgY2hlY2tzIGZvciBkYXRhIGZyYW1lcy4KKwkJCSAqLworCQkJZ2VuX29yKGIxLCBiMCk7CisKKwkJCS8qCisJCQkgKiBOb3cgY2hlY2sgZm9yIGEgZGF0YSBmcmFtZS4KKwkJCSAqIEkuZSwgY2hlY2sgImxpbmtbMF0gJiAweDA4Ii4KKwkJCSAqLworCQkJcyA9IGdlbl9sb2FkX2EoT1JfTElOSywgMCwgQlBGX0IpOworCQkJYjEgPSBuZXdfYmxvY2soSk1QKEJQRl9KU0VUKSk7CisJCQliMS0+cy5rID0gMHgwODsKKwkJCWIxLT5zdG10cyA9IHM7CisKKwkJCS8qCisJCQkgKiBBTkQgdGhhdCB3aXRoIHRoZSBjaGVja3MgZG9uZSBmb3IgZGF0YSBmcmFtZXMuCisJCQkgKi8KKwkJCWdlbl9hbmQoYjEsIGIwKTsKKworCQkJLyoKKwkJCSAqIElmIHRoZSBoaWdoLW9yZGVyIGJpdCBvZiB0aGUgdHlwZSB2YWx1ZSBpcyAwLCB0aGlzCisJCQkgKiBpcyBhIG1hbmFnZW1lbnQgZnJhbWUuCisJCQkgKiBJLmUsIGNoZWNrICIhKGxpbmtbMF0gJiAweDA4KSIuCisJCQkgKi8KKwkJCXMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDAsIEJQRl9CKTsKKwkJCWIyID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQkJYjItPnMuayA9IDB4MDg7CisJCQliMi0+c3RtdHMgPSBzOworCQkJZ2VuX25vdChiMik7CisKKwkJCS8qCisJCQkgKiBGb3IgbWFuYWdlbWVudCBmcmFtZXMsIHRoZSBEQSBpcyBhdCA0LgorCQkJICovCisJCQliMSA9IGdlbl9tYWNfbXVsdGljYXN0KDQpOworCQkJZ2VuX2FuZChiMiwgYjEpOworCisJCQkvKgorCQkJICogT1IgdGhhdCB3aXRoIHRoZSBjaGVja3MgZG9uZSBmb3IgZGF0YSBmcmFtZXMuCisJCQkgKiBUaGF0IGdpdmVzIHRoZSBjaGVja3MgZG9uZSBmb3IgbWFuYWdlbWVudCBhbmQKKwkJCSAqIGRhdGEgZnJhbWVzLgorCQkJICovCisJCQlnZW5fb3IoYjEsIGIwKTsKKworCQkJLyoKKwkJCSAqIElmIHRoZSBsb3ctb3JkZXIgYml0IG9mIHRoZSB0eXBlIHZhbHVlIGlzIDEsCisJCQkgKiB0aGlzIGlzIGVpdGhlciBhIGNvbnRyb2wgZnJhbWUgb3IgYSBmcmFtZQorCQkJICogd2l0aCBhIHJlc2VydmVkIHR5cGUsIGFuZCB0aHVzIG5vdCBhCisJCQkgKiBmcmFtZSB3aXRoIGFuIFNBLgorCQkJICoKKwkJCSAqIEkuZS4sIGNoZWNrICIhKGxpbmtbMF0gJiAweDA0KSIuCisJCQkgKi8KKwkJCXMgPSBnZW5fbG9hZF9hKE9SX0xJTkssIDAsIEJQRl9CKTsKKwkJCWIxID0gbmV3X2Jsb2NrKEpNUChCUEZfSlNFVCkpOworCQkJYjEtPnMuayA9IDB4MDQ7CisJCQliMS0+c3RtdHMgPSBzOworCQkJZ2VuX25vdChiMSk7CisKKwkJCS8qCisJCQkgKiBBTkQgdGhhdCB3aXRoIHRoZSBjaGVja3MgZm9yIGRhdGEgYW5kIG1hbmFnZW1lbnQKKwkJCSAqIGZyYW1lcy4KKwkJCSAqLworCQkJZ2VuX2FuZChiMSwgYjApOworCQkJcmV0dXJuIGIwOworCQljYXNlIERMVF9JUF9PVkVSX0ZDOgorCQkJYjAgPSBnZW5fbWFjX211bHRpY2FzdCgyKTsKKwkJCXJldHVybiBiMDsKKwkJY2FzZSBETFRfU1VOQVRNOgorCQkJaWYgKGlzX2xhbmUpIHsKKwkJCQkvKgorCQkJCSAqIENoZWNrIHRoYXQgdGhlIHBhY2tldCBkb2Vzbid0IGJlZ2luIHdpdGggYW4KKwkJCQkgKiBMRSBDb250cm9sIG1hcmtlci4gIChXZSd2ZSBhbHJlYWR5IGdlbmVyYXRlZAorCQkJCSAqIGEgdGVzdCBmb3IgTEFORS4pCisJCQkJICovCisJCQkJYjEgPSBnZW5fY21wKE9SX0xJTkssIFNVTkFUTV9QS1RfQkVHSU5fUE9TLAorCQkJCSAgICBCUEZfSCwgMHhGRjAwKTsKKwkJCQlnZW5fbm90KGIxKTsKKworCQkJCS8qIGV0aGVyW29mZl9tYWNdICYgMSAhPSAwICovCisJCQkJYjAgPSBnZW5fbWFjX211bHRpY2FzdChvZmZfbWFjKTsKKwkJCQlnZW5fYW5kKGIxLCBiMCk7CisJCQkJcmV0dXJuIGIwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQkvKiBMaW5rIG5vdCBrbm93biB0byBzdXBwb3J0IG11bHRpY2FzdHMgKi8KKwkJYnJlYWs7CisKKwljYXNlIFFfSVA6CisJCWIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUCk7CisJCWIxID0gZ2VuX2NtcF9nZShPUl9ORVQsIDE2LCBCUEZfQiwgKGJwZl9pbnQzMikyMjQpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworI2lmZGVmIElORVQ2CisJY2FzZSBRX0lQVjY6CisJCWIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9JUFY2KTsKKwkJYjEgPSBnZW5fY21wKE9SX05FVCwgMjQsIEJQRl9CLCAoYnBmX2ludDMyKTI1NSk7CisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworI2VuZGlmIC8qIElORVQ2ICovCisJfQorCWJwZl9lcnJvcigibGluay1sYXllciBtdWx0aWNhc3QgZmlsdGVycyBzdXBwb3J0ZWQgb25seSBvbiBldGhlcm5ldC9GRERJL3Rva2VuIHJpbmcvQVJDTkVULzgwMi4xMS9BVE0gTEFORS9GaWJyZSBDaGFubmVsIik7CisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybiBOVUxMOworfQorCisvKgorICogRmlsdGVyIG9uIGluYm91bmQgKGRpciA9PSAwKSBvciBvdXRib3VuZCAoZGlyID09IDEpIHRyYWZmaWMuCisgKiBPdXRib3VuZCB0cmFmZmljIGlzIHNlbnQgYnkgdGhpcyBtYWNoaW5lLCB3aGlsZSBpbmJvdW5kIHRyYWZmaWMgaXMKKyAqIHNlbnQgYnkgYSByZW1vdGUgbWFjaGluZSAoYW5kIG1heSBpbmNsdWRlIHBhY2tldHMgZGVzdGluZWQgZm9yIGEKKyAqIHVuaWNhc3Qgb3IgbXVsdGljYXN0IGxpbmstbGF5ZXIgYWRkcmVzcyB3ZSBhcmUgbm90IHN1YnNjcmliaW5nIHRvKS4KKyAqIFRoZXNlIGFyZSB0aGUgc2FtZSBkZWZpbml0aW9ucyBpbXBsZW1lbnRlZCBieSBwY2FwX3NldGRpcmVjdGlvbigpLgorICogQ2FwdHVyaW5nIG9ubHkgdW5pY2FzdCB0cmFmZmljIGRlc3RpbmVkIGZvciB0aGlzIGhvc3QgaXMgcHJvYmFibHkKKyAqIGJldHRlciBhY2NvbXBsaXNoZWQgdXNpbmcgYSBoaWdoZXItbGF5ZXIgZmlsdGVyLgorICovCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX2luYm91bmQoZGlyKQorCWludCBkaXI7Cit7CisJcmVnaXN0ZXIgc3RydWN0IGJsb2NrICpiMDsKKworCS8qCisJICogT25seSBzb21lIGRhdGEgbGluayB0eXBlcyBzdXBwb3J0IGluYm91bmQvb3V0Ym91bmQgcXVhbGlmaWVycy4KKwkgKi8KKwlzd2l0Y2ggKGxpbmt0eXBlKSB7CisJY2FzZSBETFRfU0xJUDoKKwkJYjAgPSBnZW5fcmVsYXRpb24oQlBGX0pFUSwKKwkJCSAgZ2VuX2xvYWQoUV9MSU5LLCBnZW5fbG9hZGkoMCksIDEpLAorCQkJICBnZW5fbG9hZGkoMCksCisJCQkgIGRpcik7CisJCWJyZWFrOworCisJY2FzZSBETFRfSVBORVQ6CisJCWlmIChkaXIpIHsKKwkJCS8qIG1hdGNoIG91dGdvaW5nIHBhY2tldHMgKi8KKwkJCWIwID0gZ2VuX2NtcChPUl9MSU5LLCAyLCBCUEZfSCwgSVBORVRfT1VUQk9VTkQpOworCQl9IGVsc2UgeworCQkJLyogbWF0Y2ggaW5jb21pbmcgcGFja2V0cyAqLworCQkJYjAgPSBnZW5fY21wKE9SX0xJTkssIDIsIEJQRl9ILCBJUE5FVF9JTkJPVU5EKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgRExUX0xJTlVYX1NMTDoKKwkJLyogbWF0Y2ggb3V0Z29pbmcgcGFja2V0cyAqLworCQliMCA9IGdlbl9jbXAoT1JfTElOSywgMCwgQlBGX0gsIExJTlVYX1NMTF9PVVRHT0lORyk7CisJCWlmICghZGlyKSB7CisJCQkvKiB0byBmaWx0ZXIgb24gaW5ib3VuZCB0cmFmZmljLCBpbnZlcnQgdGhlIG1hdGNoICovCisJCQlnZW5fbm90KGIwKTsKKwkJfQorCQlicmVhazsKKworI2lmZGVmIEhBVkVfTkVUX1BGVkFSX0gKKwljYXNlIERMVF9QRkxPRzoKKwkJYjAgPSBnZW5fY21wKE9SX0xJTkssIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgZGlyKSwgQlBGX0IsCisJCSAgICAoYnBmX2ludDMyKSgoZGlyID09IDApID8gUEZfSU4gOiBQRl9PVVQpKTsKKwkJYnJlYWs7CisjZW5kaWYKKworCWNhc2UgRExUX1BQUF9QUFBEOgorCQlpZiAoZGlyKSB7CisJCQkvKiBtYXRjaCBvdXRnb2luZyBwYWNrZXRzICovCisJCQliMCA9IGdlbl9jbXAoT1JfTElOSywgMCwgQlBGX0IsIFBQUF9QUFBEX09VVCk7CisJCX0gZWxzZSB7CisJCQkvKiBtYXRjaCBpbmNvbWluZyBwYWNrZXRzICovCisJCQliMCA9IGdlbl9jbXAoT1JfTElOSywgMCwgQlBGX0IsIFBQUF9QUFBEX0lOKTsKKwkJfQorCQlicmVhazsKKworICAgICAgICBjYXNlIERMVF9KVU5JUEVSX01GUjoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9NTEZSOgorICAgICAgICBjYXNlIERMVF9KVU5JUEVSX01MUFBQOgorCWNhc2UgRExUX0pVTklQRVJfQVRNMToKKwljYXNlIERMVF9KVU5JUEVSX0FUTTI6CisJY2FzZSBETFRfSlVOSVBFUl9QUFBPRToKKwljYXNlIERMVF9KVU5JUEVSX1BQUE9FX0FUTToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9HR1NOOgorICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0VTOgorICAgICAgICBjYXNlIERMVF9KVU5JUEVSX01PTklUT1I6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfU0VSVklDRVM6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfRVRIRVI6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfUFBQOgorICAgICAgICBjYXNlIERMVF9KVU5JUEVSX0ZSRUxBWToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9DSERMQzoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9WUDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9TVDoKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9JU006CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfVlM6CisgICAgICAgIGNhc2UgRExUX0pVTklQRVJfU1JYX0UyRToKKyAgICAgICAgY2FzZSBETFRfSlVOSVBFUl9GSUJSRUNIQU5ORUw6CisJY2FzZSBETFRfSlVOSVBFUl9BVE1fQ0VNSUM6CisKKwkJLyoganVuaXBlciBmbGFncyAoaW5jbHVkaW5nIGRpcmVjdGlvbikgYXJlIHN0b3JlZAorCQkgKiB0aGUgYnl0ZSBhZnRlciB0aGUgMy1ieXRlIG1hZ2ljIG51bWJlciAqLworCQlpZiAoZGlyKSB7CisJCQkvKiBtYXRjaCBvdXRnb2luZyBwYWNrZXRzICovCisJCQliMCA9IGdlbl9tY21wKE9SX0xJTkssIDMsIEJQRl9CLCAwLCAweDAxKTsKKwkJfSBlbHNlIHsKKwkJCS8qIG1hdGNoIGluY29taW5nIHBhY2tldHMgKi8KKwkJCWIwID0gZ2VuX21jbXAoT1JfTElOSywgMywgQlBGX0IsIDEsIDB4MDEpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBwYWNrZXQgbWV0YS1kYXRhIGluZGljYXRpbmcgYSBkaXJlY3Rpb24sCisJCSAqIGNoZWNrIGl0LCBvdGhlcndpc2UgZ2l2ZSB1cCBhcyB0aGlzIGxpbmstbGF5ZXIgdHlwZQorCQkgKiBoYXMgbm90aGluZyBpbiB0aGUgcGFja2V0IGRhdGEuCisJCSAqLworI2lmIGRlZmluZWQoUEZfUEFDS0VUKSAmJiBkZWZpbmVkKFNPX0FUVEFDSF9GSUxURVIpCisJCS8qCisJCSAqIFdlIGluZmVyIHRoYXQgdGhpcyBpcyBMaW51eCB3aXRoIFBGX1BBQ0tFVCBzdXBwb3J0LgorCQkgKiBJZiB0aGlzIGlzIGEgKmxpdmUqIGNhcHR1cmUsIHdlIGNhbiBsb29rIGF0CisJCSAqIHNwZWNpYWwgbWV0YS1kYXRhIGluIHRoZSBmaWx0ZXIgZXhwcmVzc2lvbjsKKwkJICogaWYgaXQncyBhIHNhdmVmaWxlLCB3ZSBjYW4ndC4KKwkJICovCisJCWlmIChicGZfcGNhcC0+c2YucmZpbGUgIT0gTlVMTCkgeworCQkJLyogV2UgaGF2ZSBhIEZJTEUgKiwgc28gdGhpcyBpcyBhIHNhdmVmaWxlICovCisJCQlicGZfZXJyb3IoImluYm91bmQvb3V0Ym91bmQgbm90IHN1cHBvcnRlZCBvbiBsaW5rdHlwZSAlZCB3aGVuIHJlYWRpbmcgc2F2ZWZpbGVzIiwKKwkJCSAgICBsaW5rdHlwZSk7CisJCQliMCA9IE5VTEw7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJLyogbWF0Y2ggb3V0Z29pbmcgcGFja2V0cyAqLworCQliMCA9IGdlbl9jbXAoT1JfTElOSywgU0tGX0FEX09GRiArIFNLRl9BRF9QS1RUWVBFLCBCUEZfSCwKKwkJICAgICAgICAgICAgIFBBQ0tFVF9PVVRHT0lORyk7CisJCWlmICghZGlyKSB7CisJCQkvKiB0byBmaWx0ZXIgb24gaW5ib3VuZCB0cmFmZmljLCBpbnZlcnQgdGhlIG1hdGNoICovCisJCQlnZW5fbm90KGIwKTsKKwkJfQorI2Vsc2UgLyogZGVmaW5lZChQRl9QQUNLRVQpICYmIGRlZmluZWQoU09fQVRUQUNIX0ZJTFRFUikgKi8KKwkJYnBmX2Vycm9yKCJpbmJvdW5kL291dGJvdW5kIG5vdCBzdXBwb3J0ZWQgb24gbGlua3R5cGUgJWQiLAorCQkgICAgbGlua3R5cGUpOworCQliMCA9IE5VTEw7CisJCS8qIE5PVFJFQUNIRUQgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKFBGX1BBQ0tFVCkgJiYgZGVmaW5lZChTT19BVFRBQ0hfRklMVEVSKSAqLworCX0KKwlyZXR1cm4gKGIwKTsKK30KKworI2lmZGVmIEhBVkVfTkVUX1BGVkFSX0gKKy8qIFBGIGZpcmV3YWxsIGxvZyBtYXRjaGVkIGludGVyZmFjZSAqLworc3RydWN0IGJsb2NrICoKK2dlbl9wZl9pZm5hbWUoY29uc3QgY2hhciAqaWZuYW1lKQoreworCXN0cnVjdCBibG9jayAqYjA7CisJdV9pbnQgbGVuLCBvZmY7CisKKwlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcigiaWZuYW1lIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisJbGVuID0gc2l6ZW9mKCgoc3RydWN0IHBmbG9naGRyICopMCktPmlmbmFtZSk7CisJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBpZm5hbWUpOworCWlmIChzdHJsZW4oaWZuYW1lKSA+PSBsZW4pIHsKKwkJYnBmX2Vycm9yKCJpZm5hbWUgaW50ZXJmYWNlIG5hbWVzIGNhbiBvbmx5IGJlICVkIGNoYXJhY3RlcnMiLAorCQkgICAgbGVuLTEpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCWIwID0gZ2VuX2JjbXAoT1JfTElOSywgb2ZmLCBzdHJsZW4oaWZuYW1lKSwgKGNvbnN0IHVfY2hhciAqKWlmbmFtZSk7CisJcmV0dXJuIChiMCk7Cit9CisKKy8qIFBGIGZpcmV3YWxsIGxvZyBydWxlc2V0IG5hbWUgKi8KK3N0cnVjdCBibG9jayAqCitnZW5fcGZfcnVsZXNldChjaGFyICpydWxlc2V0KQoreworCXN0cnVjdCBibG9jayAqYjA7CisKKwlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcigicnVsZXNldCBzdXBwb3J0ZWQgb25seSBvbiBQRiBsaW5rdHlwZSIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJaWYgKHN0cmxlbihydWxlc2V0KSA+PSBzaXplb2YoKChzdHJ1Y3QgcGZsb2doZHIgKikwKS0+cnVsZXNldCkpIHsKKwkJYnBmX2Vycm9yKCJydWxlc2V0IG5hbWVzIGNhbiBvbmx5IGJlICVsZCBjaGFyYWN0ZXJzIiwKKwkJICAgIChsb25nKShzaXplb2YoKChzdHJ1Y3QgcGZsb2doZHIgKikwKS0+cnVsZXNldCkgLSAxKSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwliMCA9IGdlbl9iY21wKE9SX0xJTkssIG9mZnNldG9mKHN0cnVjdCBwZmxvZ2hkciwgcnVsZXNldCksCisJICAgIHN0cmxlbihydWxlc2V0KSwgKGNvbnN0IHVfY2hhciAqKXJ1bGVzZXQpOworCXJldHVybiAoYjApOworfQorCisvKiBQRiBmaXJld2FsbCBsb2cgcnVsZSBudW1iZXIgKi8KK3N0cnVjdCBibG9jayAqCitnZW5fcGZfcm5yKGludCBybnIpCit7CisJc3RydWN0IGJsb2NrICpiMDsKKworCWlmIChsaW5rdHlwZSAhPSBETFRfUEZMT0cpIHsKKwkJYnBmX2Vycm9yKCJybnIgc3VwcG9ydGVkIG9ubHkgb24gUEYgbGlua3R5cGUiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCWIwID0gZ2VuX2NtcChPUl9MSU5LLCBvZmZzZXRvZihzdHJ1Y3QgcGZsb2doZHIsIHJ1bGVuciksIEJQRl9XLAorCQkgKGJwZl9pbnQzMilybnIpOworCXJldHVybiAoYjApOworfQorCisvKiBQRiBmaXJld2FsbCBsb2cgc3ViLXJ1bGUgbnVtYmVyICovCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BmX3NybnIoaW50IHNybnIpCit7CisJc3RydWN0IGJsb2NrICpiMDsKKworCWlmIChsaW5rdHlwZSAhPSBETFRfUEZMT0cpIHsKKwkJYnBmX2Vycm9yKCJzcm5yIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwliMCA9IGdlbl9jbXAoT1JfTElOSywgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBzdWJydWxlbnIpLCBCUEZfVywKKwkgICAgKGJwZl9pbnQzMilzcm5yKTsKKwlyZXR1cm4gKGIwKTsKK30KKworLyogUEYgZmlyZXdhbGwgbG9nIHJlYXNvbiBjb2RlICovCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BmX3JlYXNvbihpbnQgcmVhc29uKQoreworCXN0cnVjdCBibG9jayAqYjA7CisKKwlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcigicmVhc29uIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwliMCA9IGdlbl9jbXAoT1JfTElOSywgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCByZWFzb24pLCBCUEZfQiwKKwkgICAgKGJwZl9pbnQzMilyZWFzb24pOworCXJldHVybiAoYjApOworfQorCisvKiBQRiBmaXJld2FsbCBsb2cgYWN0aW9uICovCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BmX2FjdGlvbihpbnQgYWN0aW9uKQoreworCXN0cnVjdCBibG9jayAqYjA7CisKKwlpZiAobGlua3R5cGUgIT0gRExUX1BGTE9HKSB7CisJCWJwZl9lcnJvcigiYWN0aW9uIHN1cHBvcnRlZCBvbmx5IG9uIFBGIGxpbmt0eXBlIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwliMCA9IGdlbl9jbXAoT1JfTElOSywgb2Zmc2V0b2Yoc3RydWN0IHBmbG9naGRyLCBhY3Rpb24pLCBCUEZfQiwKKwkgICAgKGJwZl9pbnQzMilhY3Rpb24pOworCXJldHVybiAoYjApOworfQorI2Vsc2UgLyogIUhBVkVfTkVUX1BGVkFSX0ggKi8KK3N0cnVjdCBibG9jayAqCitnZW5fcGZfaWZuYW1lKGNvbnN0IGNoYXIgKmlmbmFtZSkKK3sKKwlicGZfZXJyb3IoImxpYnBjYXAgd2FzIGNvbXBpbGVkIHdpdGhvdXQgcGYgc3VwcG9ydCIpOworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gKE5VTEwpOworfQorCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BmX3J1bGVzZXQoY2hhciAqcnVsZXNldCkKK3sKKwlicGZfZXJyb3IoImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIChOVUxMKTsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9wZl9ybnIoaW50IHJucikKK3sKKwlicGZfZXJyb3IoImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIChOVUxMKTsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9wZl9zcm5yKGludCBzcm5yKQoreworCWJwZl9lcnJvcigibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gKE5VTEwpOworfQorCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BmX3JlYXNvbihpbnQgcmVhc29uKQoreworCWJwZl9lcnJvcigibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gKE5VTEwpOworfQorCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BmX2FjdGlvbihpbnQgYWN0aW9uKQoreworCWJwZl9lcnJvcigibGlicGNhcCB3YXMgY29tcGlsZWQgb24gYSBtYWNoaW5lIHdpdGhvdXQgcGYgc3VwcG9ydCIpOworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gKE5VTEwpOworfQorI2VuZGlmIC8qIEhBVkVfTkVUX1BGVkFSX0ggKi8KKworLyogSUVFRSA4MDIuMTEgd2lyZWxlc3MgaGVhZGVyICovCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3A4MDIxMV90eXBlKGludCB0eXBlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIwOworCisJc3dpdGNoIChsaW5rdHlwZSkgeworCisJY2FzZSBETFRfSUVFRTgwMl8xMToKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwkJYjAgPSBnZW5fbWNtcChPUl9MSU5LLCAwLCBCUEZfQiwgKGJwZl9pbnQzMil0eXBlLAorCQkgICAgKGJwZl9pbnQzMiltYXNrKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicGZfZXJyb3IoIjgwMi4xMSBsaW5rLWxheWVyIHR5cGVzIHN1cHBvcnRlZCBvbmx5IG9uIDgwMi4xMSIpOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJcmV0dXJuIChiMCk7Cit9CisKK3N0cnVjdCBibG9jayAqCitnZW5fcDgwMjExX2ZjZGlyKGludCBmY2RpcikKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIwOworCisJc3dpdGNoIChsaW5rdHlwZSkgeworCisJY2FzZSBETFRfSUVFRTgwMl8xMToKKwljYXNlIERMVF9QUklTTV9IRUFERVI6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlM6CisJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicGZfZXJyb3IoImZyYW1lIGRpcmVjdGlvbiBzdXBwb3J0ZWQgb25seSB3aXRoIDgwMi4xMSBoZWFkZXJzIik7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9CisKKwliMCA9IGdlbl9tY21wKE9SX0xJTkssIDEsIEJQRl9CLCAoYnBmX2ludDMyKWZjZGlyLAorCQkoYnBmX3VfaW50MzIpSUVFRTgwMjExX0ZDMV9ESVJfTUFTSyk7CisKKwlyZXR1cm4gKGIwKTsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9hY29kZShlYWRkciwgcSkKKwlyZWdpc3RlciBjb25zdCB1X2NoYXIgKmVhZGRyOworCXN0cnVjdCBxdWFsIHE7Cit7CisJc3dpdGNoIChsaW5rdHlwZSkgeworCisJY2FzZSBETFRfQVJDTkVUOgorCWNhc2UgRExUX0FSQ05FVF9MSU5VWDoKKwkJaWYgKChxLmFkZHIgPT0gUV9IT1NUIHx8IHEuYWRkciA9PSBRX0RFRkFVTFQpICYmCisJCSAgICBxLnByb3RvID09IFFfTElOSykKKwkJCXJldHVybiAoZ2VuX2Fob3N0b3AoZWFkZHIsIChpbnQpcS5kaXIpKTsKKwkJZWxzZSB7CisJCQlicGZfZXJyb3IoIkFSQ25ldCBhZGRyZXNzIHVzZWQgaW4gbm9uLWFyYyBleHByZXNzaW9uIik7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicGZfZXJyb3IoImFpZCBzdXBwb3J0ZWQgb25seSBvbiBBUkNuZXQiKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlicGZfZXJyb3IoIkFSQ25ldCBhZGRyZXNzIHVzZWQgaW4gbm9uLWFyYyBleHByZXNzaW9uIik7CisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2dlbl9haG9zdG9wKGVhZGRyLCBkaXIpCisJcmVnaXN0ZXIgY29uc3QgdV9jaGFyICplYWRkcjsKKwlyZWdpc3RlciBpbnQgZGlyOworeworCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjAsICpiMTsKKworCXN3aXRjaCAoZGlyKSB7CisJLyogc3JjIGNvbWVzIGZpcnN0LCBkaWZmZXJlbnQgZnJvbSBFdGhlcm5ldCAqLworCWNhc2UgUV9TUkM6CisJCXJldHVybiBnZW5fYmNtcChPUl9MSU5LLCAwLCAxLCBlYWRkcik7CisKKwljYXNlIFFfRFNUOgorCQlyZXR1cm4gZ2VuX2JjbXAoT1JfTElOSywgMSwgMSwgZWFkZHIpOworCisJY2FzZSBRX0FORDoKKwkJYjAgPSBnZW5fYWhvc3RvcChlYWRkciwgUV9TUkMpOworCQliMSA9IGdlbl9haG9zdG9wKGVhZGRyLCBRX0RTVCk7CisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJcmV0dXJuIGIxOworCisJY2FzZSBRX0RFRkFVTFQ6CisJY2FzZSBRX09SOgorCQliMCA9IGdlbl9haG9zdG9wKGVhZGRyLCBRX1NSQyk7CisJCWIxID0gZ2VuX2Fob3N0b3AoZWFkZHIsIFFfRFNUKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCXJldHVybiBiMTsKKworCWNhc2UgUV9BRERSMToKKwkJYnBmX2Vycm9yKCInYWRkcjEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSMjoKKwkJYnBmX2Vycm9yKCInYWRkcjInIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSMzoKKwkJYnBmX2Vycm9yKCInYWRkcjMnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9BRERSNDoKKwkJYnBmX2Vycm9yKCInYWRkcjQnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9SQToKKwkJYnBmX2Vycm9yKCIncmEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKworCWNhc2UgUV9UQToKKwkJYnBmX2Vycm9yKCIndGEnIGlzIG9ubHkgc3VwcG9ydGVkIG9uIDgwMi4xMSIpOworCQlicmVhazsKKwl9CisJYWJvcnQoKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qCisgKiBzdXBwb3J0IElFRUUgODAyLjFRIFZMQU4gdHJ1bmsgb3ZlciBldGhlcm5ldAorICovCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3ZsYW4odmxhbl9udW0pCisJaW50IHZsYW5fbnVtOworeworCXN0cnVjdAlibG9jawkqYjAsICpiMTsKKworCS8qIGNhbid0IGNoZWNrIGZvciBWTEFOLWVuY2Fwc3VsYXRlZCBwYWNrZXRzIGluc2lkZSBNUExTICovCisJaWYgKGxhYmVsX3N0YWNrX2RlcHRoID4gMCkKKwkJYnBmX2Vycm9yKCJubyBWTEFOIG1hdGNoIGFmdGVyIE1QTFMiKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGEgVkxBTiBwYWNrZXQsIGFuZCB0aGVuIGNoYW5nZSB0aGUgb2Zmc2V0cyB0byBwb2ludAorCSAqIHRvIHRoZSB0eXBlIGFuZCBkYXRhIGZpZWxkcyB3aXRoaW4gdGhlIFZMQU4gcGFja2V0LiAgSnVzdAorCSAqIGluY3JlbWVudCB0aGUgb2Zmc2V0cywgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydCBhIGhpZXJhcmNoeSwgZS5nLgorCSAqICJ2bGFuIDMwMCAmJiB2bGFuIDIwMCIgdG8gY2FwdHVyZSBWTEFOIDIwMCBlbmNhcHN1bGF0ZWQgd2l0aGluCisJICogVkxBTiAxMDAuCisJICoKKwkgKiBYWFggLSB0aGlzIGlzIGEgYml0IG9mIGEga2x1ZGdlLiAgSWYgd2Ugd2VyZSB0byBzcGxpdCB0aGUKKwkgKiBjb21waWxlciBpbnRvIGEgcGFyc2VyIHRoYXQgcGFyc2VzIGFuIGV4cHJlc3Npb24gYW5kCisJICogZ2VuZXJhdGVzIGFuIGV4cHJlc3Npb24gdHJlZSwgYW5kIGEgY29kZSBnZW5lcmF0b3IgdGhhdAorCSAqIHRha2VzIGFuIGV4cHJlc3Npb24gdHJlZSAod2hpY2ggY291bGQgY29tZSBmcm9tIG91cgorCSAqIHBhcnNlciBvciBmcm9tIHNvbWUgb3RoZXIgcGFyc2VyKSBhbmQgZ2VuZXJhdGVzIEJQRiBjb2RlLAorCSAqIHdlIGNvdWxkIHBlcmhhcHMgbWFrZSB0aGUgb2Zmc2V0cyBwYXJhbWV0ZXJzIG9mIHJvdXRpbmVzCisJICogYW5kLCBpbiB0aGUgaGFuZGxlciBmb3IgYW4gIkFORCIgbm9kZSwgcGFzcyB0byBzdWJub2RlcworCSAqIG90aGVyIHRoYW4gdGhlIFZMQU4gbm9kZSB0aGUgYWRqdXN0ZWQgb2Zmc2V0cy4KKwkgKgorCSAqIFRoaXMgd291bGQgbWVhbiB0aGF0ICJ2bGFuIiB3b3VsZCwgaW5zdGVhZCBvZiBjaGFuZ2luZyB0aGUKKwkgKiBiZWhhdmlvciBvZiAqYWxsKiB0ZXN0cyBhZnRlciBpdCwgY2hhbmdlIG9ubHkgdGhlIGJlaGF2aW9yCisJICogb2YgdGVzdHMgQU5EZWQgd2l0aCBpdC4gIFRoYXQgd291bGQgY2hhbmdlIHRoZSBkb2N1bWVudGVkCisJICogc2VtYW50aWNzIG9mICJ2bGFuIiwgd2hpY2ggbWlnaHQgYnJlYWsgc29tZSBleHByZXNzaW9ucy4KKwkgKiBIb3dldmVyLCBpdCB3b3VsZCBtZWFuIHRoYXQgIih2bGFuIGFuZCBpcCkgb3IgaXAiIHdvdWxkIGNoZWNrCisJICogYm90aCBmb3IgVkxBTi1lbmNhcHN1bGF0ZWQgSVAgYW5kIElQLW92ZXItRXRoZXJuZXQsIHJhdGhlciB0aGFuCisJICogY2hlY2tpbmcgb25seSBmb3IgVkxBTi1lbmNhcHN1bGF0ZWQgSVAsIHNvIHRoYXQgY291bGQgc3RpbGwKKwkgKiBiZSBjb25zaWRlcmVkIHdvcnRoIGRvaW5nOyBpdCB3b3VsZG4ndCBicmVhayBleHByZXNzaW9ucworCSAqIHRoYXQgYXJlIG9mIHRoZSBmb3JtICJ2bGFuIGFuZCAuLi4iIG9yICJ2bGFuIE4gYW5kIC4uLiIsCisJICogd2hpY2ggSSBzdXNwZWN0IGFyZSB0aGUgbW9zdCBjb21tb24gZXhwcmVzc2lvbnMgaW52b2x2aW5nCisJICogInZsYW4iLiAgInZsYW4gb3IgLi4uIiBkb2Vzbid0IG5lY2Vzc2FyaWx5IGRvIHdoYXQgdGhlIHVzZXIKKwkgKiB3b3VsZCByZWFsbHkgd2FudCwgbm93LCBhcyBhbGwgdGhlICJvciAuLi4iIHRlc3RzIHdvdWxkCisJICogYmUgZG9uZSBhc3N1bWluZyBhIFZMQU4sIGV2ZW4gdGhvdWdoIHRoZSAib3IiIGNvdWxkIGJlIHZpZXdlZAorCSAqIGFzIG1lYW5pbmcgIm9yLCBpZiB0aGlzIGlzbid0IGEgVkxBTiBwYWNrZXQuLi4iLgorCSAqLworCW9yaWdfbmwgPSBvZmZfbmw7CisKKwlzd2l0Y2ggKGxpbmt0eXBlKSB7CisKKwljYXNlIERMVF9FTjEwTUI6CisJY2FzZSBETFRfTkVUQU5BTFlaRVI6CisJY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CisJCS8qIGNoZWNrIGZvciBWTEFOLCBpbmNsdWRpbmcgUWluUSAqLworCQliMCA9IGdlbl9jbXAoT1JfTElOSywgb2ZmX2xpbmt0eXBlLCBCUEZfSCwKKwkJICAgIChicGZfaW50MzIpRVRIRVJUWVBFXzgwMjFRKTsKKwkJYjEgPSBnZW5fY21wKE9SX0xJTkssIG9mZl9saW5rdHlwZSwgQlBGX0gsCisJCSAgICAoYnBmX2ludDMyKUVUSEVSVFlQRV84MDIxUUlOUSk7CisJCWdlbl9vcihiMCxiMSk7CisJCWIwID0gYjE7CisKKwkJLyogSWYgYSBzcGVjaWZpYyBWTEFOIGlzIHJlcXVlc3RlZCwgY2hlY2sgVkxBTiBpZCAqLworCQlpZiAodmxhbl9udW0gPj0gMCkgeworCQkJYjEgPSBnZW5fbWNtcChPUl9NQUNQTCwgMCwgQlBGX0gsCisJCQkgICAgKGJwZl9pbnQzMil2bGFuX251bSwgMHgwZmZmKTsKKwkJCWdlbl9hbmQoYjAsIGIxKTsKKwkJCWIwID0gYjE7CisJCX0KKworCQlvZmZfbWFjcGwgKz0gNDsKKwkJb2ZmX2xpbmt0eXBlICs9IDQ7CisjaWYgMAorCQlvZmZfbmxfbm9zbmFwICs9IDQ7CisJCW9mZl9ubCArPSA0OworI2VuZGlmCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnBmX2Vycm9yKCJubyBWTEFOIHN1cHBvcnQgZm9yIGRhdGEgbGluayB0eXBlICVkIiwKKwkJICAgICAgbGlua3R5cGUpOworCQkvKk5PVFJFQUNIRUQqLworCX0KKworCXJldHVybiAoYjApOworfQorCisvKgorICogc3VwcG9ydCBmb3IgTVBMUworICovCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX21wbHMobGFiZWxfbnVtKQorCWludCBsYWJlbF9udW07Cit7CisJc3RydWN0CWJsb2NrCSpiMCwqYjE7CisKKwkvKgorCSAqIENoYW5nZSB0aGUgb2Zmc2V0cyB0byBwb2ludCB0byB0aGUgdHlwZSBhbmQgZGF0YSBmaWVsZHMgd2l0aGluCisJICogdGhlIE1QTFMgcGFja2V0LiAgSnVzdCBpbmNyZW1lbnQgdGhlIG9mZnNldHMsIHNvIHRoYXQgd2UKKwkgKiBjYW4gc3VwcG9ydCBhIGhpZXJhcmNoeSwgZS5nLiAibXBscyAxMDAwMDAgJiYgbXBscyAxMDI0IiB0bworCSAqIGNhcHR1cmUgcGFja2V0cyB3aXRoIGFuIG91dGVyIGxhYmVsIG9mIDEwMDAwMCBhbmQgYW4gaW5uZXIKKwkgKiBsYWJlbCBvZiAxMDI0LgorCSAqCisJICogWFhYIC0gdGhpcyBpcyBhIGJpdCBvZiBhIGtsdWRnZS4gIFNlZSBjb21tZW50cyBpbiBnZW5fdmxhbigpLgorCSAqLworICAgICAgICBvcmlnX25sID0gb2ZmX25sOworCisgICAgICAgIGlmIChsYWJlbF9zdGFja19kZXB0aCA+IDApIHsKKyAgICAgICAgICAgIC8qIGp1c3QgbWF0Y2ggdGhlIGJvdHRvbS1vZi1zdGFjayBiaXQgY2xlYXIgKi8KKyAgICAgICAgICAgIGIwID0gZ2VuX21jbXAoT1JfTUFDUEwsIG9yaWdfbmwtMiwgQlBGX0IsIDAsIDB4MDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluZGljYXRlIHRoYXQgd2UncmUgY2hlY2tpbmcgTVBMUy1lbmNhcHN1bGF0ZWQgaGVhZGVycywKKyAgICAgICAgICAgICAqIHRvIG1ha2Ugc3VyZSBoaWdoZXIgbGV2ZWwgY29kZSBnZW5lcmF0b3JzIGRvbid0IHRyeSB0bworICAgICAgICAgICAgICogbWF0Y2ggYWdhaW5zdCBJUC1yZWxhdGVkIHByb3RvY29scyBzdWNoIGFzIFFfQVJQLCBRX1JBUlAKKyAgICAgICAgICAgICAqIGV0Yy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3dpdGNoIChsaW5rdHlwZSkgeworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBETFRfQ19IRExDOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgIGNhc2UgRExUX0VOMTBNQjoKKyAgICAgICAgICAgIGNhc2UgRExUX05FVEFOQUxZWkVSOgorICAgICAgICAgICAgY2FzZSBETFRfTkVUQU5BTFlaRVJfVFJBTlNQQVJFTlQ6CisgICAgICAgICAgICAgICAgICAgIGIwID0gZ2VuX2xpbmt0eXBlKEVUSEVSVFlQRV9NUExTKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNlIERMVF9QUFA6CisgICAgICAgICAgICAgICAgICAgIGIwID0gZ2VuX2xpbmt0eXBlKFBQUF9NUExTX1VDQVNUKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIGFkZCBvdGhlciBETFRfcyAuLi4KKyAgICAgICAgICAgICAgICAgICAgICogZm9yIEZyYW1lLVJlbGF5L2FuZCBBVE0gdGhpcyBtYXkgZ2V0IG1lc3N5IGR1ZSB0byBTTkFQIGhlYWRlcnMKKyAgICAgICAgICAgICAgICAgICAgICogbGVhdmUgaXQgZm9yIG5vdyAqLworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnBmX2Vycm9yKCJubyBNUExTIHN1cHBvcnQgZm9yIGRhdGEgbGluayB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3R5cGUpOworICAgICAgICAgICAgICAgICAgICBiMCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIC8qTk9UUkVBQ0hFRCovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwkvKiBJZiBhIHNwZWNpZmljIE1QTFMgbGFiZWwgaXMgcmVxdWVzdGVkLCBjaGVjayBpdCAqLworCWlmIChsYWJlbF9udW0gPj0gMCkgeworCQlsYWJlbF9udW0gPSBsYWJlbF9udW0gPDwgMTI7IC8qIGxhYmVsIGlzIHNoaWZ0ZWQgMTIgYml0cyBvbiB0aGUgd2lyZSAqLworCQliMSA9IGdlbl9tY21wKE9SX01BQ1BMLCBvcmlnX25sLCBCUEZfVywgKGJwZl9pbnQzMilsYWJlbF9udW0sCisJCSAgICAweGZmZmZmMDAwKTsgLyogb25seSBjb21wYXJlIHRoZSBmaXJzdCAyMCBiaXRzICovCisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJYjAgPSBiMTsKKwl9CisKKyAgICAgICAgb2ZmX25sX25vc25hcCArPSA0OworICAgICAgICBvZmZfbmwgKz0gNDsKKyAgICAgICAgbGFiZWxfc3RhY2tfZGVwdGgrKzsKKwlyZXR1cm4gKGIwKTsKK30KKworLyoKKyAqIFN1cHBvcnQgUFBQT0UgZGlzY292ZXJ5IGFuZCBzZXNzaW9uLgorICovCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX3BwcG9lZCgpCit7CisJLyogY2hlY2sgZm9yIFBQUG9FIGRpc2NvdmVyeSAqLworCXJldHVybiBnZW5fbGlua3R5cGUoKGJwZl9pbnQzMilFVEhFUlRZUEVfUFBQT0VEKTsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9wcHBvZXMoKQoreworCXN0cnVjdCBibG9jayAqYjA7CisKKwkvKgorCSAqIFRlc3QgYWdhaW5zdCB0aGUgUFBQb0Ugc2Vzc2lvbiBsaW5rLWxheWVyIHR5cGUuCisJICovCisJYjAgPSBnZW5fbGlua3R5cGUoKGJwZl9pbnQzMilFVEhFUlRZUEVfUFBQT0VTKTsKKworCS8qCisJICogQ2hhbmdlIHRoZSBvZmZzZXRzIHRvIHBvaW50IHRvIHRoZSB0eXBlIGFuZCBkYXRhIGZpZWxkcyB3aXRoaW4KKwkgKiB0aGUgUFBQIHBhY2tldCwgYW5kIG5vdGUgdGhhdCB0aGlzIGlzIFBQUG9FIHJhdGhlciB0aGFuCisJICogcmF3IFBQUC4KKwkgKgorCSAqIFhYWCAtIHRoaXMgaXMgYSBiaXQgb2YgYSBrbHVkZ2UuICBJZiB3ZSB3ZXJlIHRvIHNwbGl0IHRoZQorCSAqIGNvbXBpbGVyIGludG8gYSBwYXJzZXIgdGhhdCBwYXJzZXMgYW4gZXhwcmVzc2lvbiBhbmQKKwkgKiBnZW5lcmF0ZXMgYW4gZXhwcmVzc2lvbiB0cmVlLCBhbmQgYSBjb2RlIGdlbmVyYXRvciB0aGF0CisJICogdGFrZXMgYW4gZXhwcmVzc2lvbiB0cmVlICh3aGljaCBjb3VsZCBjb21lIGZyb20gb3VyCisJICogcGFyc2VyIG9yIGZyb20gc29tZSBvdGhlciBwYXJzZXIpIGFuZCBnZW5lcmF0ZXMgQlBGIGNvZGUsCisJICogd2UgY291bGQgcGVyaGFwcyBtYWtlIHRoZSBvZmZzZXRzIHBhcmFtZXRlcnMgb2Ygcm91dGluZXMKKwkgKiBhbmQsIGluIHRoZSBoYW5kbGVyIGZvciBhbiAiQU5EIiBub2RlLCBwYXNzIHRvIHN1Ym5vZGVzCisJICogb3RoZXIgdGhhbiB0aGUgUFBQb0Ugbm9kZSB0aGUgYWRqdXN0ZWQgb2Zmc2V0cy4KKwkgKgorCSAqIFRoaXMgd291bGQgbWVhbiB0aGF0ICJwcHBvZXMiIHdvdWxkLCBpbnN0ZWFkIG9mIGNoYW5naW5nIHRoZQorCSAqIGJlaGF2aW9yIG9mICphbGwqIHRlc3RzIGFmdGVyIGl0LCBjaGFuZ2Ugb25seSB0aGUgYmVoYXZpb3IKKwkgKiBvZiB0ZXN0cyBBTkRlZCB3aXRoIGl0LiAgVGhhdCB3b3VsZCBjaGFuZ2UgdGhlIGRvY3VtZW50ZWQKKwkgKiBzZW1hbnRpY3Mgb2YgInBwcG9lcyIsIHdoaWNoIG1pZ2h0IGJyZWFrIHNvbWUgZXhwcmVzc2lvbnMuCisJICogSG93ZXZlciwgaXQgd291bGQgbWVhbiB0aGF0ICIocHBwb2VzIGFuZCBpcCkgb3IgaXAiIHdvdWxkIGNoZWNrCisJICogYm90aCBmb3IgVkxBTi1lbmNhcHN1bGF0ZWQgSVAgYW5kIElQLW92ZXItRXRoZXJuZXQsIHJhdGhlciB0aGFuCisJICogY2hlY2tpbmcgb25seSBmb3IgVkxBTi1lbmNhcHN1bGF0ZWQgSVAsIHNvIHRoYXQgY291bGQgc3RpbGwKKwkgKiBiZSBjb25zaWRlcmVkIHdvcnRoIGRvaW5nOyBpdCB3b3VsZG4ndCBicmVhayBleHByZXNzaW9ucworCSAqIHRoYXQgYXJlIG9mIHRoZSBmb3JtICJwcHBvZXMgYW5kIC4uLiIgd2hpY2ggSSBzdXNwZWN0IGFyZSB0aGUKKwkgKiBtb3N0IGNvbW1vbiBleHByZXNzaW9ucyBpbnZvbHZpbmcgInBwcG9lcyIuICAicHBwb2VzIG9yIC4uLiIKKwkgKiBkb2Vzbid0IG5lY2Vzc2FyaWx5IGRvIHdoYXQgdGhlIHVzZXIgd291bGQgcmVhbGx5IHdhbnQsIG5vdywKKwkgKiBhcyBhbGwgdGhlICJvciAuLi4iIHRlc3RzIHdvdWxkIGJlIGRvbmUgYXNzdW1pbmcgUFBQb0UsIGV2ZW4KKwkgKiB0aG91Z2ggdGhlICJvciIgY291bGQgYmUgdmlld2VkIGFzIG1lYW5pbmcgIm9yLCBpZiB0aGlzIGlzbid0CisJICogYSBQUFBvRSBwYWNrZXQuLi4iLgorCSAqLworCW9yaWdfbGlua3R5cGUgPSBvZmZfbGlua3R5cGU7CS8qIHNhdmUgb3JpZ2luYWwgdmFsdWVzICovCisJb3JpZ19ubCA9IG9mZl9ubDsKKwlpc19wcHBvZXMgPSAxOworCisJLyoKKwkgKiBUaGUgIm5ldHdvcmstbGF5ZXIiIHByb3RvY29sIGlzIFBQUG9FLCB3aGljaCBoYXMgYSA2LWJ5dGUKKwkgKiBQUFBvRSBoZWFkZXIsIGZvbGxvd2VkIGJ5IGEgUFBQIHBhY2tldC4KKwkgKgorCSAqIFRoZXJlIGlzIG5vIEhETEMgZW5jYXBzdWxhdGlvbiBmb3IgdGhlIFBQUCBwYWNrZXQgKGl0J3MKKwkgKiBlbmNhcHN1bGF0ZWQgaW4gUFBQb0VTIGluc3RlYWQpLCBzbyB0aGUgbGluay1sYXllciB0eXBlCisJICogc3RhcnRzIGF0IHRoZSBmaXJzdCBieXRlIG9mIHRoZSBQUFAgcGFja2V0LiAgRm9yIFBQUG9FLAorCSAqIHRoYXQgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRvdGFsCisJICogbGluay1sYXllciBwYXlsb2FkLCBpbmNsdWRpbmcgYW55IDgwMi4yIExMQyBoZWFkZXIsIHNvCisJICogaXQncyA2IGJ5dGVzIHBhc3Qgb2ZmX25sLgorCSAqLworCW9mZl9saW5rdHlwZSA9IG9mZl9ubCArIDY7CisKKwkvKgorCSAqIFRoZSBuZXR3b3JrLWxheWVyIG9mZnNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKwkgKiBvZiB0aGUgTUFDLWxheWVyIHBheWxvYWQ7IHRoYXQncyBwYXN0IHRoZSA2LWJ5dGUKKwkgKiBQUFBvRSBoZWFkZXIgYW5kIHRoZSAyLWJ5dGUgUFBQIGhlYWRlci4KKwkgKi8KKwlvZmZfbmwgPSA2KzI7CisJb2ZmX25sX25vc25hcCA9IDYrMjsKKworCXJldHVybiBiMDsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9hdG1maWVsZF9jb2RlKGF0bWZpZWxkLCBqdmFsdWUsIGp0eXBlLCByZXZlcnNlKQorCWludCBhdG1maWVsZDsKKwlicGZfaW50MzIganZhbHVlOworCWJwZl91X2ludDMyIGp0eXBlOworCWludCByZXZlcnNlOworeworCXN0cnVjdCBibG9jayAqYjA7CisKKwlzd2l0Y2ggKGF0bWZpZWxkKSB7CisKKwljYXNlIEFfVlBJOgorCQlpZiAoIWlzX2F0bSkKKwkJCWJwZl9lcnJvcigiJ3ZwaScgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQlpZiAob2ZmX3ZwaSA9PSAodV9pbnQpLTEpCisJCQlhYm9ydCgpOworCQliMCA9IGdlbl9uY21wKE9SX0xJTkssIG9mZl92cGksIEJQRl9CLCAweGZmZmZmZmZmLCBqdHlwZSwKKwkJICAgIHJldmVyc2UsIGp2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBBX1ZDSToKKwkJaWYgKCFpc19hdG0pCisJCQlicGZfZXJyb3IoIid2Y2knIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJaWYgKG9mZl92Y2kgPT0gKHVfaW50KS0xKQorCQkJYWJvcnQoKTsKKwkJYjAgPSBnZW5fbmNtcChPUl9MSU5LLCBvZmZfdmNpLCBCUEZfSCwgMHhmZmZmZmZmZiwganR5cGUsCisJCSAgICByZXZlcnNlLCBqdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgQV9QUk9UT1RZUEU6CisJCWlmIChvZmZfcHJvdG8gPT0gKHVfaW50KS0xKQorCQkJYWJvcnQoKTsJLyogWFhYIC0gdGhpcyBpc24ndCBvbiBGcmVlQlNEICovCisJCWIwID0gZ2VuX25jbXAoT1JfTElOSywgb2ZmX3Byb3RvLCBCUEZfQiwgMHgwZiwganR5cGUsCisJCSAgICByZXZlcnNlLCBqdmFsdWUpOworCQlicmVhazsKKworCWNhc2UgQV9NU0dUWVBFOgorCQlpZiAob2ZmX3BheWxvYWQgPT0gKHVfaW50KS0xKQorCQkJYWJvcnQoKTsKKwkJYjAgPSBnZW5fbmNtcChPUl9MSU5LLCBvZmZfcGF5bG9hZCArIE1TR19UWVBFX1BPUywgQlBGX0IsCisJCSAgICAweGZmZmZmZmZmLCBqdHlwZSwgcmV2ZXJzZSwganZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFfQ0FMTFJFRlRZUEU6CisJCWlmICghaXNfYXRtKQorCQkJYnBmX2Vycm9yKCInY2FsbHJlZicgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQlpZiAob2ZmX3Byb3RvID09ICh1X2ludCktMSkKKwkJCWFib3J0KCk7CisJCWIwID0gZ2VuX25jbXAoT1JfTElOSywgb2ZmX3Byb3RvLCBCUEZfQiwgMHhmZmZmZmZmZiwKKwkJICAgIGp0eXBlLCByZXZlcnNlLCBqdmFsdWUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorCXJldHVybiBiMDsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9hdG10eXBlX2FiYnJldih0eXBlKQorCWludCB0eXBlOworeworCXN0cnVjdCBibG9jayAqYjAsICpiMTsKKworCXN3aXRjaCAodHlwZSkgeworCisJY2FzZSBBX01FVEFDOgorCQkvKiBHZXQgYWxsIHBhY2tldHMgaW4gTWV0YSBzaWduYWxsaW5nIENpcmN1aXQgKi8KKwkJaWYgKCFpc19hdG0pCisJCQlicGZfZXJyb3IoIidtZXRhYycgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQliMCA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVlBJLCAwLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX1ZDSSwgMSwgQlBGX0pFUSwgMCk7CisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJYnJlYWs7CisKKwljYXNlIEFfQkNDOgorCQkvKiBHZXQgYWxsIHBhY2tldHMgaW4gQnJvYWRjYXN0IENpcmN1aXQqLworCQlpZiAoIWlzX2F0bSkKKwkJCWJwZl9lcnJvcigiJ2JjYycgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQliMCA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVlBJLCAwLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX1ZDSSwgMiwgQlBGX0pFUSwgMCk7CisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJYnJlYWs7CisKKwljYXNlIEFfT0FNRjRTQzoKKwkJLyogR2V0IGFsbCBjZWxscyBpbiBTZWdtZW50IE9BTSBGNCBjaXJjdWl0Ki8KKwkJaWYgKCFpc19hdG0pCisJCQlicGZfZXJyb3IoIidvYW00c2MnIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJYjAgPSBnZW5fYXRtZmllbGRfY29kZShBX1ZQSSwgMCwgQlBGX0pFUSwgMCk7CisJCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WQ0ksIDMsIEJQRl9KRVEsIDApOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCWJyZWFrOworCisJY2FzZSBBX09BTUY0RUM6CisJCS8qIEdldCBhbGwgY2VsbHMgaW4gRW5kLXRvLUVuZCBPQU0gRjQgQ2lyY3VpdCovCisJCWlmICghaXNfYXRtKQorCQkJYnBmX2Vycm9yKCInb2FtNGVjJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WUEksIDAsIEJQRl9KRVEsIDApOworCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVkNJLCA0LCBCUEZfSkVRLCAwKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQlicmVhazsKKworCWNhc2UgQV9TQzoKKwkJLyogIEdldCBhbGwgcGFja2V0cyBpbiBjb25uZWN0aW9uIFNpZ25hbGxpbmcgQ2lyY3VpdCAqLworCQlpZiAoIWlzX2F0bSkKKwkJCWJwZl9lcnJvcigiJ3NjJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WUEksIDAsIEJQRl9KRVEsIDApOworCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVkNJLCA1LCBCUEZfSkVRLCAwKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQlicmVhazsKKworCWNhc2UgQV9JTE1JQzoKKwkJLyogR2V0IGFsbCBwYWNrZXRzIGluIElMTUkgQ2lyY3VpdCAqLworCQlpZiAoIWlzX2F0bSkKKwkJCWJwZl9lcnJvcigiJ2lsbWljJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWIwID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9WUEksIDAsIEJQRl9KRVEsIDApOworCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVkNJLCAxNiwgQlBGX0pFUSwgMCk7CisJCWdlbl9hbmQoYjAsIGIxKTsKKwkJYnJlYWs7CisKKwljYXNlIEFfTEFORToKKwkJLyogR2V0IGFsbCBMQU5FIHBhY2tldHMgKi8KKwkJaWYgKCFpc19hdG0pCisJCQlicGZfZXJyb3IoIidsYW5lJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9QUk9UT1RZUEUsIFBUX0xBTkUsIEJQRl9KRVEsIDApOworCisJCS8qCisJCSAqIEFycmFuZ2UgdGhhdCBhbGwgc3Vic2VxdWVudCB0ZXN0cyBhc3N1bWUgTEFORQorCQkgKiByYXRoZXIgdGhhbiBMTEMtZW5jYXBzdWxhdGVkIHBhY2tldHMsIGFuZCBzZXQKKwkJICogdGhlIG9mZnNldHMgYXBwcm9wcmlhdGVseSBmb3IgTEFORS1lbmNhcHN1bGF0ZWQKKwkJICogRXRoZXJuZXQuCisJCSAqCisJCSAqICJvZmZfbWFjIiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBFdGhlcm5ldCBoZWFkZXIsCisJCSAqIHdoaWNoIGlzIDIgYnl0ZXMgcGFzdCB0aGUgQVRNIHBzZXVkby1oZWFkZXIKKwkJICogKHNraXBwaW5nIHRoZSBwc2V1ZG8taGVhZGVyIGFuZCAyLWJ5dGUgTEUgQ2xpZW50CisJCSAqIGZpZWxkKS4gIFRoZSBvdGhlciBvZmZzZXRzIGFyZSBFdGhlcm5ldCBvZmZzZXRzCisJCSAqIHJlbGF0aXZlIHRvICJvZmZfbWFjIi4KKwkJICovCisJCWlzX2xhbmUgPSAxOworCQlvZmZfbWFjID0gb2ZmX3BheWxvYWQgKyAyOwkvKiBNQUMgaGVhZGVyICovCisJCW9mZl9saW5rdHlwZSA9IG9mZl9tYWMgKyAxMjsKKwkJb2ZmX21hY3BsID0gb2ZmX21hYyArIDE0OwkvKiBFdGhlcm5ldCAqLworCQlvZmZfbmwgPSAwOwkJCS8qIEV0aGVybmV0IElJICovCisJCW9mZl9ubF9ub3NuYXAgPSAzOwkJLyogODAyLjMrODAyLjIgKi8KKwkJYnJlYWs7CisKKwljYXNlIEFfTExDOgorCQkvKiBHZXQgYWxsIExMQy1lbmNhcHN1bGF0ZWQgcGFja2V0cyAqLworCQlpZiAoIWlzX2F0bSkKKwkJCWJwZl9lcnJvcigiJ2xsYycgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfUFJPVE9UWVBFLCBQVF9MTEMsIEJQRl9KRVEsIDApOworCQlpc19sYW5lID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKwlyZXR1cm4gYjE7Cit9CisKKy8qIAorICogRmlsdGVyaW5nIGZvciBNVFAyIG1lc3NhZ2VzIGJhc2VkIG9uIGxpIHZhbHVlCisgKiBGSVNVLCBsZW5ndGggaXMgbnVsbAorICogTFNTVSwgbGVuZ3RoIGlzIDEgb3IgMgorICogTVNVLCBsZW5ndGggaXMgMyBvciBtb3JlCisgKi8KK3N0cnVjdCBibG9jayAqCitnZW5fbXRwMnR5cGVfYWJicmV2KHR5cGUpCisJaW50IHR5cGU7Cit7CisJc3RydWN0IGJsb2NrICpiMCwgKmIxOworCisJc3dpdGNoICh0eXBlKSB7CisKKwljYXNlIE1fRklTVToKKwkJaWYgKCAobGlua3R5cGUgIT0gRExUX01UUDIpICYmCisJCSAgICAgKGxpbmt0eXBlICE9IERMVF9FUkYpICYmCisJCSAgICAgKGxpbmt0eXBlICE9IERMVF9NVFAyX1dJVEhfUEhEUikgKQorCQkJYnBmX2Vycm9yKCInZmlzdScgc3VwcG9ydGVkIG9ubHkgb24gTVRQMiIpOworCQkvKiBnZW5fbmNtcChvZmZyZWwsIG9mZnNldCwgc2l6ZSwgbWFzaywganR5cGUsIHJldmVyc2UsIHZhbHVlKSAqLworCQliMCA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgb2ZmX2xpLCBCUEZfQiwgMHgzZiwgQlBGX0pFUSwgMCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBNX0xTU1U6CisJCWlmICggKGxpbmt0eXBlICE9IERMVF9NVFAyKSAmJgorCQkgICAgIChsaW5rdHlwZSAhPSBETFRfRVJGKSAmJgorCQkgICAgIChsaW5rdHlwZSAhPSBETFRfTVRQMl9XSVRIX1BIRFIpICkKKwkJCWJwZl9lcnJvcigiJ2xzc3UnIHN1cHBvcnRlZCBvbmx5IG9uIE1UUDIiKTsKKwkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9saSwgQlBGX0IsIDB4M2YsIEJQRl9KR1QsIDEsIDIpOworCQliMSA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgb2ZmX2xpLCBCUEZfQiwgMHgzZiwgQlBGX0pHVCwgMCwgMCk7CisJCWdlbl9hbmQoYjEsIGIwKTsKKwkJYnJlYWs7CisKKwljYXNlIE1fTVNVOgorCQlpZiAoIChsaW5rdHlwZSAhPSBETFRfTVRQMikgJiYKKwkJICAgICAobGlua3R5cGUgIT0gRExUX0VSRikgJiYKKwkJICAgICAobGlua3R5cGUgIT0gRExUX01UUDJfV0lUSF9QSERSKSApCisJCQlicGZfZXJyb3IoIidtc3UnIHN1cHBvcnRlZCBvbmx5IG9uIE1UUDIiKTsKKwkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9saSwgQlBGX0IsIDB4M2YsIEJQRl9KR1QsIDAsIDIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorCXJldHVybiBiMDsKK30KKworc3RydWN0IGJsb2NrICoKK2dlbl9tdHAzZmllbGRfY29kZShtdHAzZmllbGQsIGp2YWx1ZSwganR5cGUsIHJldmVyc2UpCisJaW50IG10cDNmaWVsZDsKKwlicGZfdV9pbnQzMiBqdmFsdWU7CisJYnBmX3VfaW50MzIganR5cGU7CisJaW50IHJldmVyc2U7Cit7CisJc3RydWN0IGJsb2NrICpiMDsKKwlicGZfdV9pbnQzMiB2YWwxICwgdmFsMiAsIHZhbDM7CisKKwlzd2l0Y2ggKG10cDNmaWVsZCkgeworCisJY2FzZSBNX1NJTzoKKwkJaWYgKG9mZl9zaW8gPT0gKHVfaW50KS0xKQorCQkJYnBmX2Vycm9yKCInc2lvJyBzdXBwb3J0ZWQgb25seSBvbiBTUzciKTsKKwkJLyogc2lvIGNvZGVkIG9uIDEgYnl0ZSBzbyBtYXggdmFsdWUgMjU1ICovCisJCWlmKGp2YWx1ZSA+IDI1NSkKKwkJICAgICAgICBicGZfZXJyb3IoInNpbyB2YWx1ZSAldSB0b28gYmlnOyBtYXggdmFsdWUgPSAyNTUiLAorCQkgICAgICAgICAgICBqdmFsdWUpOworCQliMCA9IGdlbl9uY21wKE9SX1BBQ0tFVCwgb2ZmX3NpbywgQlBGX0IsIDB4ZmZmZmZmZmYsCisJCSAgICAodV9pbnQpanR5cGUsIHJldmVyc2UsICh1X2ludClqdmFsdWUpOworCQlicmVhazsKKworICAgICAgICBjYXNlIE1fT1BDOgorCSAgICAgICAgaWYgKG9mZl9vcGMgPT0gKHVfaW50KS0xKQorCQkJYnBmX2Vycm9yKCInb3BjJyBzdXBwb3J0ZWQgb25seSBvbiBTUzciKTsKKwkJLyogb3BjIGNvZGVkIG9uIDE0IGJpdHMgc28gbWF4IHZhbHVlIDE2MzgzICovCisJCWlmIChqdmFsdWUgPiAxNjM4MykKKwkJICAgICAgICBicGZfZXJyb3IoIm9wYyB2YWx1ZSAldSB0b28gYmlnOyBtYXggdmFsdWUgPSAxNjM4MyIsCisJCSAgICAgICAgICAgIGp2YWx1ZSk7CisJCS8qIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBtYWRlIHRvIGNvbnZlcnQganZhbHVlCisJCSAqIHRvIHRoZSBmb3JtIHVzZWQgdG8gd3JpdGUgb3BjIGluIGFuIHNzNyBtZXNzYWdlKi8KKwkJdmFsMSA9IGp2YWx1ZSAmIDB4MDAwMDNjMDA7CisJCXZhbDEgPSB2YWwxID4+MTA7CisJCXZhbDIgPSBqdmFsdWUgJiAweDAwMDAwM2ZjOworCQl2YWwyID0gdmFsMiA8PDY7CisJCXZhbDMgPSBqdmFsdWUgJiAweDAwMDAwMDAzOworCQl2YWwzID0gdmFsMyA8PDIyOworCQlqdmFsdWUgPSB2YWwxICsgdmFsMiArIHZhbDM7CisJCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfb3BjLCBCUEZfVywgMHgwMGMwZmYwZiwKKwkJICAgICh1X2ludClqdHlwZSwgcmV2ZXJzZSwgKHVfaW50KWp2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBNX0RQQzoKKwkgICAgICAgIGlmIChvZmZfZHBjID09ICh1X2ludCktMSkKKwkJCWJwZl9lcnJvcigiJ2RwYycgc3VwcG9ydGVkIG9ubHkgb24gU1M3Iik7CisJCS8qIGRwYyBjb2RlZCBvbiAxNCBiaXRzIHNvIG1heCB2YWx1ZSAxNjM4MyAqLworCQlpZiAoanZhbHVlID4gMTYzODMpCisJCSAgICAgICAgYnBmX2Vycm9yKCJkcGMgdmFsdWUgJXUgdG9vIGJpZzsgbWF4IHZhbHVlID0gMTYzODMiLAorCQkgICAgICAgICAgICBqdmFsdWUpOworCQkvKiB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyBhcmUgbWFkZSB0byBjb252ZXJ0IGp2YWx1ZQorCQkgKiB0byB0aGUgZm9ybWUgdXNlZCB0byB3cml0ZSBkcGMgaW4gYW4gc3M3IG1lc3NhZ2UqLworCQl2YWwxID0ganZhbHVlICYgMHgwMDAwMDBmZjsKKwkJdmFsMSA9IHZhbDEgPDwgMjQ7CisJCXZhbDIgPSBqdmFsdWUgJiAweDAwMDAzZjAwOworCQl2YWwyID0gdmFsMiA8PCA4OworCQlqdmFsdWUgPSB2YWwxICsgdmFsMjsKKwkJYjAgPSBnZW5fbmNtcChPUl9QQUNLRVQsIG9mZl9kcGMsIEJQRl9XLCAweGZmM2YwMDAwLAorCQkgICAgKHVfaW50KWp0eXBlLCByZXZlcnNlLCAodV9pbnQpanZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1fU0xTOgorCSAgICAgICAgaWYgKG9mZl9zbHMgPT0gKHVfaW50KS0xKQorCQkJYnBmX2Vycm9yKCInc2xzJyBzdXBwb3J0ZWQgb25seSBvbiBTUzciKTsKKwkJLyogc2xzIGNvZGVkIG9uIDQgYml0cyBzbyBtYXggdmFsdWUgMTUgKi8KKwkJaWYgKGp2YWx1ZSA+IDE1KQorCQkgICAgICAgICBicGZfZXJyb3IoInNscyB2YWx1ZSAldSB0b28gYmlnOyBtYXggdmFsdWUgPSAxNSIsCisJCSAgICAgICAgICAgICBqdmFsdWUpOworCQkvKiB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uIGlzIG1hZGUgdG8gY29udmVydCBqdmFsdWUKKwkJICogdG8gdGhlIGZvcm1lIHVzZWQgdG8gd3JpdGUgc2xzIGluIGFuIHNzNyBtZXNzYWdlKi8KKwkJanZhbHVlID0ganZhbHVlIDw8IDQ7CisJCWIwID0gZ2VuX25jbXAoT1JfUEFDS0VULCBvZmZfc2xzLCBCUEZfQiwgMHhmMCwKKwkJICAgICh1X2ludClqdHlwZSxyZXZlcnNlLCAodV9pbnQpanZhbHVlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKwlyZXR1cm4gYjA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxvY2sgKgorZ2VuX21zZ19hYmJyZXYodHlwZSkKKwlpbnQgdHlwZTsKK3sKKwlzdHJ1Y3QgYmxvY2sgKmIxOworCisJLyoKKwkgKiBRLjI5MzEgc2lnbmFsbGluZyBwcm90b2NvbCBtZXNzYWdlcyBmb3IgaGFuZGxpbmcgdmlydHVhbCBjaXJjdWl0cworCSAqIGVzdGFibGlzaG1lbnQgYW5kIHRlYXJkb3duCisJICovCisJc3dpdGNoICh0eXBlKSB7CisKKwljYXNlIEFfU0VUVVA6CisJCWIxID0gZ2VuX2F0bWZpZWxkX2NvZGUoQV9NU0dUWVBFLCBTRVRVUCwgQlBGX0pFUSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBBX0NBTExQUk9DRUVEOgorCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfTVNHVFlQRSwgQ0FMTF9QUk9DRUVELCBCUEZfSkVRLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIEFfQ09OTkVDVDoKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX01TR1RZUEUsIENPTk5FQ1QsIEJQRl9KRVEsIDApOworCQlicmVhazsKKworCWNhc2UgQV9DT05ORUNUQUNLOgorCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfTVNHVFlQRSwgQ09OTkVDVF9BQ0ssIEJQRl9KRVEsIDApOworCQlicmVhazsKKworCWNhc2UgQV9SRUxFQVNFOgorCQliMSA9IGdlbl9hdG1maWVsZF9jb2RlKEFfTVNHVFlQRSwgUkVMRUFTRSwgQlBGX0pFUSwgMCk7CisJCWJyZWFrOworCisJY2FzZSBBX1JFTEVBU0VfRE9ORToKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX01TR1RZUEUsIFJFTEVBU0VfRE9ORSwgQlBGX0pFUSwgMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisJcmV0dXJuIGIxOworfQorCitzdHJ1Y3QgYmxvY2sgKgorZ2VuX2F0bW11bHRpX2FiYnJldih0eXBlKQorCWludCB0eXBlOworeworCXN0cnVjdCBibG9jayAqYjAsICpiMTsKKworCXN3aXRjaCAodHlwZSkgeworCisJY2FzZSBBX09BTToKKwkJaWYgKCFpc19hdG0pCisJCQlicGZfZXJyb3IoIidvYW0nIHN1cHBvcnRlZCBvbmx5IG9uIHJhdyBBVE0iKTsKKwkJYjEgPSBnZW5fYXRtbXVsdGlfYWJicmV2KEFfT0FNRjQpOworCQlicmVhazsKKworCWNhc2UgQV9PQU1GNDoKKwkJaWYgKCFpc19hdG0pCisJCQlicGZfZXJyb3IoIidvYW1mNCcgc3VwcG9ydGVkIG9ubHkgb24gcmF3IEFUTSIpOworCQkvKiBPQU0gRjQgdHlwZSAqLworCQliMCA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVkNJLCAzLCBCUEZfSkVRLCAwKTsKKwkJYjEgPSBnZW5fYXRtZmllbGRfY29kZShBX1ZDSSwgNCwgQlBGX0pFUSwgMCk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9hdG1maWVsZF9jb2RlKEFfVlBJLCAwLCBCUEZfSkVRLCAwKTsKKwkJZ2VuX2FuZChiMCwgYjEpOworCQlicmVhazsKKworCWNhc2UgQV9DT05ORUNUTVNHOgorCQkvKgorCQkgKiBHZXQgUS4yOTMxIHNpZ25hbGxpbmcgbWVzc2FnZXMgZm9yIHN3aXRjaGVkCisJCSAqIHZpcnR1YWwgY29ubmVjdGlvbgorCQkgKi8KKwkJaWYgKCFpc19hdG0pCisJCQlicGZfZXJyb3IoIidjb25uZWN0bXNnJyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWIwID0gZ2VuX21zZ19hYmJyZXYoQV9TRVRVUCk7CisJCWIxID0gZ2VuX21zZ19hYmJyZXYoQV9DQUxMUFJPQ0VFRCk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfQ09OTkVDVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfQ09OTkVDVEFDSyk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfUkVMRUFTRSk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfUkVMRUFTRV9ET05FKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCWIwID0gZ2VuX2F0bXR5cGVfYWJicmV2KEFfU0MpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCWJyZWFrOworCisJY2FzZSBBX01FVEFDT05ORUNUOgorCQlpZiAoIWlzX2F0bSkKKwkJCWJwZl9lcnJvcigiJ21ldGFjb25uZWN0JyBzdXBwb3J0ZWQgb25seSBvbiByYXcgQVRNIik7CisJCWIwID0gZ2VuX21zZ19hYmJyZXYoQV9TRVRVUCk7CisJCWIxID0gZ2VuX21zZ19hYmJyZXYoQV9DQUxMUFJPQ0VFRCk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfQ09OTkVDVCk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfUkVMRUFTRSk7CisJCWdlbl9vcihiMCwgYjEpOworCQliMCA9IGdlbl9tc2dfYWJicmV2KEFfUkVMRUFTRV9ET05FKTsKKwkJZ2VuX29yKGIwLCBiMSk7CisJCWIwID0gZ2VuX2F0bXR5cGVfYWJicmV2KEFfTUVUQUMpOworCQlnZW5fYW5kKGIwLCBiMSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisJcmV0dXJuIGIxOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9nZW5jb2RlLmggYi9saWJwY2FwLTEuMy4wL2dlbmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQyZDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9nZW5jb2RlLmgKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2dlbmNvZGUuaCx2IDEuNzEgMjAwNy0xMS0xOCAwMjowMzo1MiBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogQVRNIHN1cHBvcnQ6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3IFllbiBZZW4gTGltIGFuZCBOb3J0aCBEYWtvdGEgU3RhdGUgVW5pdmVyc2l0eQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFllbiBZZW4gTGltIGFuZAorICogICAgICBOb3J0aCBEYWtvdGEgU3RhdGUgVW5pdmVyc2l0eQorICogNC4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwKKyAqIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCisgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTgorICogQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEhBVkVfX19BVFRSSUJVVEVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjZW5kaWYgLyogSEFWRV9fX0FUVFJJQlVURV9fICovCisKKy8qIEFkZHJlc3MgcXVhbGlmaWVycy4gKi8KKworI2RlZmluZSBRX0hPU1QJCTEKKyNkZWZpbmUgUV9ORVQJCTIKKyNkZWZpbmUgUV9QT1JUCQkzCisjZGVmaW5lIFFfR0FURVdBWQk0CisjZGVmaW5lIFFfUFJPVE8JCTUKKyNkZWZpbmUgUV9QUk9UT0NIQUlOCTYKKyNkZWZpbmUgUV9QT1JUUkFOR0UJNworCisvKiBQcm90b2NvbCBxdWFsaWZpZXJzLiAqLworCisjZGVmaW5lIFFfTElOSwkJMQorI2RlZmluZSBRX0lQCQkyCisjZGVmaW5lIFFfQVJQCQkzCisjZGVmaW5lIFFfUkFSUAkJNAorI2RlZmluZSBRX1NDVFAJCTUKKyNkZWZpbmUgUV9UQ1AJCTYKKyNkZWZpbmUgUV9VRFAJCTcKKyNkZWZpbmUgUV9JQ01QCQk4CisjZGVmaW5lIFFfSUdNUAkJOQorI2RlZmluZSBRX0lHUlAJCTEwCisKKworI2RlZmluZQlRX0FUQUxLCQkxMQorI2RlZmluZQlRX0RFQ05FVAkxMgorI2RlZmluZQlRX0xBVAkJMTMKKyNkZWZpbmUgUV9TQ0EJCTE0CisjZGVmaW5lCVFfTU9QUkMJCTE1CisjZGVmaW5lCVFfTU9QREwJCTE2CisKKworI2RlZmluZSBRX0lQVjYJCTE3CisjZGVmaW5lIFFfSUNNUFY2CTE4CisjZGVmaW5lIFFfQUgJCTE5CisjZGVmaW5lIFFfRVNQCQkyMAorCisjZGVmaW5lIFFfUElNCQkyMQorI2RlZmluZSBRX1ZSUlAJCTIyCisKKyNkZWZpbmUgUV9BQVJQCQkyMworCisjZGVmaW5lIFFfSVNPCQkyNAorI2RlZmluZSBRX0VTSVMJCTI1CisjZGVmaW5lIFFfSVNJUwkJMjYKKyNkZWZpbmUgUV9DTE5QCQkyNworCisjZGVmaW5lIFFfU1RQCQkyOAorCisjZGVmaW5lIFFfSVBYCQkyOQorCisjZGVmaW5lIFFfTkVUQkVVSQkzMAorCisvKiBJUy1JUyBMZXZlbHMgKi8KKyNkZWZpbmUgUV9JU0lTX0wxICAgICAgIDMxCisjZGVmaW5lIFFfSVNJU19MMiAgICAgICAzMgorLyogUERVIHR5cGVzICovCisjZGVmaW5lIFFfSVNJU19JSUggICAgICAzMworI2RlZmluZSBRX0lTSVNfTEFOX0lJSCAgMzQKKyNkZWZpbmUgUV9JU0lTX1BUUF9JSUggIDM1CisjZGVmaW5lIFFfSVNJU19TTlAgICAgICAzNgorI2RlZmluZSBRX0lTSVNfQ1NOUCAgICAgMzcKKyNkZWZpbmUgUV9JU0lTX1BTTlAgICAgIDM4CisjZGVmaW5lIFFfSVNJU19MU1AgICAgICAzOQorCisjZGVmaW5lIFFfUkFESU8JCTQwCisKKyNkZWZpbmUgUV9DQVJQCQk0MQorCisvKiBEaXJlY3Rpb25hbCBxdWFsaWZpZXJzLiAqLworCisjZGVmaW5lIFFfU1JDCQkxCisjZGVmaW5lIFFfRFNUCQkyCisjZGVmaW5lIFFfT1IJCTMKKyNkZWZpbmUgUV9BTkQJCTQKKyNkZWZpbmUgUV9BRERSMQkJNQorI2RlZmluZSBRX0FERFIyCQk2CisjZGVmaW5lIFFfQUREUjMJCTcKKyNkZWZpbmUgUV9BRERSNAkJOAorI2RlZmluZSBRX1JBCQk5CisjZGVmaW5lIFFfVEEJCTEwCisKKyNkZWZpbmUgUV9ERUZBVUxUCTAKKyNkZWZpbmUgUV9VTkRFRgkJMjU1CisKKy8qIEFUTSB0eXBlcyAqLworI2RlZmluZSBBX01FVEFDCQkyMgkvKiBNZXRhIHNpZ25hbGxpbmcgQ2lyY3VpdCAqLworI2RlZmluZSBBX0JDQwkJMjMJLyogQnJvYWRjYXN0IENpcmN1aXQgKi8KKyNkZWZpbmUgQV9PQU1GNFNDCTI0CS8qIFNlZ21lbnQgT0FNIEY0IENpcmN1aXQgKi8KKyNkZWZpbmUgQV9PQU1GNEVDCTI1CS8qIEVuZC10by1FbmQgT0FNIEY0IENpcmN1aXQgKi8KKyNkZWZpbmUgQV9TQwkJMjYJLyogU2lnbmFsbGluZyBDaXJjdWl0Ki8KKyNkZWZpbmUgQV9JTE1JQwkJMjcJLyogSUxNSSBDaXJjdWl0ICovCisjZGVmaW5lIEFfT0FNCQkyOAkvKiBPQU0gY2VsbHMgOiBGNCBvbmx5ICovCisjZGVmaW5lIEFfT0FNRjQJCTI5CS8qIE9BTSBGNCBjZWxsczogU2VnbWVudCArIEVuZC10by1lbmQgKi8KKyNkZWZpbmUgQV9MQU5FCQkzMAkvKiBMQU5FIHRyYWZmaWMgKi8KKyNkZWZpbmUgQV9MTEMJCTMxCS8qIExMQy1lbmNhcHN1bGF0ZWQgdHJhZmZpYyAqLworCisvKiBCYXNlZCBvbiBRLjI5MzEgc2lnbmFsbGluZyBwcm90b2NvbCAqLworI2RlZmluZSBBX1NFVFVQCQk0MQkvKiBTZXR1cCBtZXNzYWdlICovCisjZGVmaW5lIEFfQ0FMTFBST0NFRUQJNDIJLyogQ2FsbCBwcm9jZWVkaW5nIG1lc3NhZ2UgKi8KKyNkZWZpbmUgQV9DT05ORUNUCTQzCS8qIENvbm5lY3QgbWVzc2FnZSAqLworI2RlZmluZSBBX0NPTk5FQ1RBQ0sJNDQJLyogQ29ubmVjdCBBY2sgbWVzc2FnZSAqLworI2RlZmluZSBBX1JFTEVBU0UJNDUJLyogUmVsZWFzZSBtZXNzYWdlICovCisjZGVmaW5lIEFfUkVMRUFTRV9ET05FCTQ2CS8qIFJlbGVhc2UgbWVzc2FnZSAqLworIAorLyogQVRNIGZpZWxkIHR5cGVzICovCisjZGVmaW5lIEFfVlBJCQk1MQorI2RlZmluZSBBX1ZDSQkJNTIKKyNkZWZpbmUgQV9QUk9UT1RZUEUJNTMKKyNkZWZpbmUgQV9NU0dUWVBFCTU0CisjZGVmaW5lIEFfQ0FMTFJFRlRZUEUJNTUKKworI2RlZmluZSBBX0NPTk5FQ1RNU0cJNzAJLyogcmV0dXJucyBRLjI5MzEgc2lnbmFsbGluZyBtZXNzYWdlcyBmb3IKKwkJCQkgICBlc3RhYmxpc2hpbmcgYW5kIGRlc3Ryb3lpbmcgc3dpdGNoZWQKKwkJCQkgICB2aXJ0dWFsIGNvbm5lY3Rpb24gKi8KKyNkZWZpbmUgQV9NRVRBQ09OTkVDVAk3MQkvKiByZXR1cm5zIFEuMjkzMSBzaWduYWxsaW5nIG1lc3NhZ2VzIGZvcgorCQkJCSAgIGVzdGFibGlzaGluZyBhbmQgZGVzdHJveWluZyBwcmVkZWZpbmVkCisJCQkJICAgdmlydHVhbCBjaXJjdWl0cywgc3VjaCBhcyBicm9hZGNhc3QKKwkJCQkgICBjaXJjdWl0LCBvYW1mNCBzZWdtZW50IGNpcmN1aXQsIG9hbWY0CisJCQkJICAgZW5kLXRvLWVuZCBjaXJjdWl0cywgSUxNSSBjaXJjdWl0cyBvcgorCQkJCSAgIGNvbm5lY3Rpb24gc2lnbmFsbGluZyBjaXJjdWl0LiAqLworCisvKiBNVFAyIHR5cGVzICovCisjZGVmaW5lIE1fRklTVQkJMjIJLyogRklTVSAqLworI2RlZmluZSBNX0xTU1UJCTIzCS8qIExTU1UgKi8KKyNkZWZpbmUgTV9NU1UJCTI0CS8qIE1TVSAqLworCisvKiBNVFAzIGZpZWxkIHR5cGVzICovCisjZGVmaW5lIE1fU0lPCQkxCisjZGVmaW5lIE1fT1BDCQkyCisjZGVmaW5lIE1fRFBDCQkzCisjZGVmaW5lIE1fU0xTCQk0CisKKworc3RydWN0IHNsaXN0OworCitzdHJ1Y3Qgc3RtdCB7CisJaW50IGNvZGU7CisJc3RydWN0IHNsaXN0ICpqdDsJLypvbmx5IGZvciByZWxhdGl2ZSBqdW1wIGluIGJsb2NrKi8KKwlzdHJ1Y3Qgc2xpc3QgKmpmOwkvKm9ubHkgZm9yIHJlbGF0aXZlIGp1bXAgaW4gYmxvY2sqLworCWJwZl9pbnQzMiBrOworfTsKKworc3RydWN0IHNsaXN0IHsKKwlzdHJ1Y3Qgc3RtdCBzOworCXN0cnVjdCBzbGlzdCAqbmV4dDsKK307CisKKy8qCisgKiBBIGJpdCB2ZWN0b3IgdG8gcmVwcmVzZW50IGRlZmluaXRpb24gc2V0cy4gIFdlIGFzc3VtZSBUT1RfUkVHSVNURVJTCisgKiBpcyBzbWFsbGVyIHRoYW4gOCpzaXplb2YoYXRvbXNldCkuCisgKi8KK3R5cGVkZWYgYnBmX3VfaW50MzIgYXRvbXNldDsKKyNkZWZpbmUgQVRPTU1BU0sobikgKDEgPDwgKG4pKQorI2RlZmluZSBBVE9NRUxFTShkLCBuKSAoZCAmIEFUT01NQVNLKG4pKQorCisvKgorICogQW4gdW5ib3VuZGVkIHNldC4KKyAqLwordHlwZWRlZiBicGZfdV9pbnQzMiAqdXNldDsKKworLyoKKyAqIFRvdGFsIG51bWJlciBvZiBhdG9taWMgZW50aXRpZXMsIGluY2x1ZGluZyBhY2N1bXVsYXRvciAoQSkgYW5kIGluZGV4IChYKS4KKyAqIFdlIHRyZWF0IGFsbCB0aGVzZSBndXlzIHNpbWlsYXJseSBkdXJpbmcgZmxvdyBhbmFseXNpcy4KKyAqLworI2RlZmluZSBOX0FUT01TIChCUEZfTUVNV09SRFMrMikKKworc3RydWN0IGVkZ2UgeworCWludCBpZDsKKwlpbnQgY29kZTsKKwl1c2V0IGVkb207CisJc3RydWN0IGJsb2NrICpzdWNjOworCXN0cnVjdCBibG9jayAqcHJlZDsKKwlzdHJ1Y3QgZWRnZSAqbmV4dDsJLyogbGluayBsaXN0IG9mIGluY29taW5nIGVkZ2VzIGZvciBhIG5vZGUgKi8KK307CisKK3N0cnVjdCBibG9jayB7CisJaW50IGlkOworCXN0cnVjdCBzbGlzdCAqc3RtdHM7CS8qIHNpZGUgZWZmZWN0IHN0bXRzICovCisJc3RydWN0IHN0bXQgczsJCS8qIGJyYW5jaCBzdG10ICovCisJaW50IG1hcms7CisJdV9pbnQgbG9uZ2p0OwkJLyoganQgYnJhbmNoIHJlcXVpcmVzIGxvbmcganVtcCAqLworCXVfaW50IGxvbmdqZjsJCS8qIGpmIGJyYW5jaCByZXF1aXJlcyBsb25nIGp1bXAgKi8KKwlpbnQgbGV2ZWw7CisJaW50IG9mZnNldDsKKwlpbnQgc2Vuc2U7CisJc3RydWN0IGVkZ2UgZXQ7CisJc3RydWN0IGVkZ2UgZWY7CisJc3RydWN0IGJsb2NrICpoZWFkOworCXN0cnVjdCBibG9jayAqbGluazsJLyogbGluayBmaWVsZCB1c2VkIGJ5IG9wdGltaXplciAqLworCXVzZXQgZG9tOworCXVzZXQgY2xvc3VyZTsKKwlzdHJ1Y3QgZWRnZSAqaW5fZWRnZXM7CisJYXRvbXNldCBkZWYsIGtpbGw7CisJYXRvbXNldCBpbl91c2U7CisJYXRvbXNldCBvdXRfdXNlOworCWludCBvdmFsOworCWludCB2YWxbTl9BVE9NU107Cit9OworCitzdHJ1Y3QgYXJ0aCB7CisJc3RydWN0IGJsb2NrICpiOwkvKiBwcm90b2NvbCBjaGVja3MgKi8KKwlzdHJ1Y3Qgc2xpc3QgKnM7CS8qIHN0bXQgbGlzdCAqLworCWludCByZWdubzsJCS8qIHZpcnR1YWwgcmVnaXN0ZXIgbnVtYmVyIG9mIHJlc3VsdCAqLworfTsKKworc3RydWN0IHF1YWwgeworCXVuc2lnbmVkIGNoYXIgYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHByb3RvOworCXVuc2lnbmVkIGNoYXIgZGlyOworCXVuc2lnbmVkIGNoYXIgcGFkOworfTsKKworc3RydWN0IGFydGggKmdlbl9sb2FkaShpbnQpOworc3RydWN0IGFydGggKmdlbl9sb2FkKGludCwgc3RydWN0IGFydGggKiwgaW50KTsKK3N0cnVjdCBhcnRoICpnZW5fbG9hZGxlbih2b2lkKTsKK3N0cnVjdCBhcnRoICpnZW5fbmVnKHN0cnVjdCBhcnRoICopOworc3RydWN0IGFydGggKmdlbl9hcnRoKGludCwgc3RydWN0IGFydGggKiwgc3RydWN0IGFydGggKik7CisKK3ZvaWQgZ2VuX2FuZChzdHJ1Y3QgYmxvY2sgKiwgc3RydWN0IGJsb2NrICopOwordm9pZCBnZW5fb3Ioc3RydWN0IGJsb2NrICosIHN0cnVjdCBibG9jayAqKTsKK3ZvaWQgZ2VuX25vdChzdHJ1Y3QgYmxvY2sgKik7CisKK3N0cnVjdCBibG9jayAqZ2VuX3Njb2RlKGNvbnN0IGNoYXIgKiwgc3RydWN0IHF1YWwpOworc3RydWN0IGJsb2NrICpnZW5fZWNvZGUoY29uc3QgdV9jaGFyICosIHN0cnVjdCBxdWFsKTsKK3N0cnVjdCBibG9jayAqZ2VuX2Fjb2RlKGNvbnN0IHVfY2hhciAqLCBzdHJ1Y3QgcXVhbCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9tY29kZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3QgcXVhbCk7CisjaWZkZWYgSU5FVDYKK3N0cnVjdCBibG9jayAqZ2VuX21jb2RlNihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3QgcXVhbCk7CisjZW5kaWYKK3N0cnVjdCBibG9jayAqZ2VuX25jb2RlKGNvbnN0IGNoYXIgKiwgYnBmX3VfaW50MzIsIHN0cnVjdCBxdWFsKTsKK3N0cnVjdCBibG9jayAqZ2VuX3Byb3RvX2FiYnJldihpbnQpOworc3RydWN0IGJsb2NrICpnZW5fcmVsYXRpb24oaW50LCBzdHJ1Y3QgYXJ0aCAqLCBzdHJ1Y3QgYXJ0aCAqLCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fbGVzcyhpbnQpOworc3RydWN0IGJsb2NrICpnZW5fZ3JlYXRlcihpbnQpOworc3RydWN0IGJsb2NrICpnZW5fYnl0ZW9wKGludCwgaW50LCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fYnJvYWRjYXN0KGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9tdWx0aWNhc3QoaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX2luYm91bmQoaW50KTsKKworc3RydWN0IGJsb2NrICpnZW5fdmxhbihpbnQpOworc3RydWN0IGJsb2NrICpnZW5fbXBscyhpbnQpOworCitzdHJ1Y3QgYmxvY2sgKmdlbl9wcHBvZWQodm9pZCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wcHBvZXModm9pZCk7CisKK3N0cnVjdCBibG9jayAqZ2VuX2F0bWZpZWxkX2NvZGUoaW50IGF0bWZpZWxkLCBicGZfaW50MzIganZhbHVlLCBicGZfdV9pbnQzMiBqdHlwZSwgaW50IHJldmVyc2UpOworc3RydWN0IGJsb2NrICpnZW5fYXRtdHlwZV9hYmJyZXYoaW50IHR5cGUpOworc3RydWN0IGJsb2NrICpnZW5fYXRtbXVsdGlfYWJicmV2KGludCB0eXBlKTsKKworc3RydWN0IGJsb2NrICpnZW5fbXRwMnR5cGVfYWJicmV2KGludCB0eXBlKTsKK3N0cnVjdCBibG9jayAqZ2VuX210cDNmaWVsZF9jb2RlKGludCBtdHAzZmllbGQsIGJwZl91X2ludDMyIGp2YWx1ZSwgYnBmX3VfaW50MzIganR5cGUsIGludCByZXZlcnNlKTsKKworc3RydWN0IGJsb2NrICpnZW5fcGZfaWZuYW1lKGNvbnN0IGNoYXIgKik7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wZl9ybnIoaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX3BmX3NybnIoaW50KTsKK3N0cnVjdCBibG9jayAqZ2VuX3BmX3J1bGVzZXQoY2hhciAqKTsKK3N0cnVjdCBibG9jayAqZ2VuX3BmX3JlYXNvbihpbnQpOworc3RydWN0IGJsb2NrICpnZW5fcGZfYWN0aW9uKGludCk7CitzdHJ1Y3QgYmxvY2sgKmdlbl9wZl9kaXIoaW50KTsKKworc3RydWN0IGJsb2NrICpnZW5fcDgwMjExX3R5cGUoaW50LCBpbnQpOworc3RydWN0IGJsb2NrICpnZW5fcDgwMjExX2ZjZGlyKGludCk7CisKK3ZvaWQgYnBmX29wdGltaXplKHN0cnVjdCBibG9jayAqKik7Cit2b2lkIGJwZl9lcnJvcihjb25zdCBjaGFyICosIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fKChub3JldHVybiwgZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK3ZvaWQgZmluaXNoX3BhcnNlKHN0cnVjdCBibG9jayAqKTsKK2NoYXIgKnNkdXAoY29uc3QgY2hhciAqKTsKKworc3RydWN0IGJwZl9pbnNuICppY29kZV90b19mY29kZShzdHJ1Y3QgYmxvY2sgKiwgdV9pbnQgKik7CitpbnQgcGNhcF9wYXJzZSh2b2lkKTsKK3ZvaWQgbGV4X2luaXQoY29uc3QgY2hhciAqKTsKK3ZvaWQgbGV4X2NsZWFudXAodm9pZCk7Cit2b2lkIHNhcHBlbmQoc3RydWN0IHNsaXN0ICosIHN0cnVjdCBzbGlzdCAqKTsKKworLyogWFhYICovCisjZGVmaW5lIEpUKGIpICAoKGIpLT5ldC5zdWNjKQorI2RlZmluZSBKRihiKSAgKChiKS0+ZWYuc3VjYykKKworZXh0ZXJuIGludCBub19vcHRpbWl6ZTsKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvZ3JhbW1hci55IGIvbGlicGNhcC0xLjMuMC9ncmFtbWFyLnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiYTI4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvZ3JhbW1hci55CkBAIC0wLDAgKzEsNjk3IEBACisleworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvZ3JhbW1hci55LHYgMS4xMDEgMjAwNy0xMS0xOCAwMjowMzo1MiBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNlbHNlIC8qIFdJTjMyICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmbmRlZiBXSU4zMgorI2lmIF9fU1REQ19fCitzdHJ1Y3QgbWJ1ZjsKK3N0cnVjdCBydGVudHJ5OworI2VuZGlmCisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjZW5kaWYgLyogV0lOMzIgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSAiZ2VuY29kZS5oIgorI2lmZGVmIEhBVkVfTkVUX1BGVkFSX0gKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvcGZ2YXIuaD4KKyNpbmNsdWRlIDxuZXQvaWZfcGZsb2cuaD4KKyNlbmRpZgorI2luY2x1ZGUgImllZWU4MDIxMS5oIgorI2luY2x1ZGUgPHBjYXAvbmFtZWRiLmg+CisKKyNpZmRlZiBIQVZFX09TX1BST1RPX0gKKyNpbmNsdWRlICJvcy1wcm90by5oIgorI2VuZGlmCisKKyNkZWZpbmUgUVNFVChxLCBwLCBkLCBhKSAocSkucHJvdG8gPSAocCksXAorCQkJIChxKS5kaXIgPSAoZCksXAorCQkJIChxKS5hZGRyID0gKGEpCisKK3N0cnVjdCB0b2sgeworCWludCB2OwkJCS8qIHZhbHVlICovCisJY29uc3QgY2hhciAqczsJCS8qIHN0cmluZyAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgaWVlZTgwMjExX3R5cGVzW10gPSB7CisJeyBJRUVFODAyMTFfRkMwX1RZUEVfREFUQSwgImRhdGEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1RZUEVfTUdULCAibWd0IiB9LAorCXsgSUVFRTgwMjExX0ZDMF9UWVBFX01HVCwgIm1hbmFnZW1lbnQiIH0sCisJeyBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLCAiY3RsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9UWVBFX0NUTCwgImNvbnRyb2wiIH0sCisJeyAwLCBOVUxMIH0KK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHRvayBpZWVlODAyMTFfbWd0X3N1YnR5cGVzW10gPSB7CisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVNTT0NfUkVRLCAiYXNzb2NyZXEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVNTT0NfUkVRLCAiYXNzb2MtcmVxIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FTU09DX1JFU1AsICJhc3NvY3Jlc3AiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVNTT0NfUkVTUCwgImFzc29jLXJlc3AiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVEsICJyZWFzc29jcmVxIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JFQVNTT0NfUkVRLCAicmVhc3NvYy1yZXEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVNQLCAicmVhc3NvY3Jlc3AiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVNQLCAicmVhc3NvYy1yZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFUSwgInByb2JlcmVxIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFUSwgInByb2JlLXJlcSIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9QUk9CRV9SRVNQLCAicHJvYmVyZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFU1AsICJwcm9iZS1yZXNwIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0JFQUNPTiwgImJlYWNvbiIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9BVElNLCAiYXRpbSIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9ESVNBU1NPQywgImRpc2Fzc29jIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RJU0FTU09DLCAiZGlzYXNzb2NpYXRpb24iIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVVUSCwgImF1dGgiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQVVUSCwgImF1dGhlbnRpY2F0aW9uIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RFQVVUSCwgImRlYXV0aCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9ERUFVVEgsICJkZWF1dGhlbnRpY2F0aW9uIiB9LAorCXsgMCwgTlVMTCB9Cit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB0b2sgaWVlZTgwMjExX2N0bF9zdWJ0eXBlc1tdID0geworCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BTX1BPTEwsICJwcy1wb2xsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1JUUywgInJ0cyIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DVFMsICJjdHMiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQUNLLCAiYWNrIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX0VORCwgImNmLWVuZCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9FTkRfQUNLLCAiY2YtZW5kLWFjayIgfSwKKwl7IDAsIE5VTEwgfQorfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdG9rIGllZWU4MDIxMV9kYXRhX3N1YnR5cGVzW10gPSB7CisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfREFUQSwgImRhdGEiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNLLCAiZGF0YS1jZi1hY2siIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfUE9MTCwgImRhdGEtY2YtcG9sbCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9BQ1BMLCAiZGF0YS1jZi1hY2stcG9sbCIgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEEsICJudWxsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PREFUQV9DRl9BQ0ssICJjZi1hY2siIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBX0NGX1BPTEwsICJjZi1wb2xsIiAgfSwKKwl7IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEFfQ0ZfQUNQTCwgImNmLWFjay1wb2xsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfREFUQSwgInFvcy1kYXRhIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNLLCAicW9zLWRhdGEtY2YtYWNrIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfUE9MTCwgInFvcy1kYXRhLWNmLXBvbGwiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TfElFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9BQ1BMLCAicW9zLWRhdGEtY2YtYWNrLXBvbGwiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TfElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEEsICJxb3MiIH0sCisJeyBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TfElFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEFfQ0ZfUE9MTCwgInFvcy1jZi1wb2xsIiB9LAorCXsgSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPU3xJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBX0NGX0FDUEwsICJxb3MtY2YtYWNrLXBvbGwiIH0sCisJeyAwLCBOVUxMIH0KK307CitzdHJ1Y3QgdHlwZTJ0b2sgeworCWludCB0eXBlOworCWNvbnN0IHN0cnVjdCB0b2sgKnRvazsKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IHR5cGUydG9rIGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW10gPSB7CisJeyBJRUVFODAyMTFfRkMwX1RZUEVfTUdULCBpZWVlODAyMTFfbWd0X3N1YnR5cGVzIH0sCisJeyBJRUVFODAyMTFfRkMwX1RZUEVfQ1RMLCBpZWVlODAyMTFfY3RsX3N1YnR5cGVzIH0sCisJeyBJRUVFODAyMTFfRkMwX1RZUEVfREFUQSwgaWVlZTgwMjExX2RhdGFfc3VidHlwZXMgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworc3RhdGljIGludAorc3RyMnRvayhjb25zdCBjaGFyICpzdHIsIGNvbnN0IHN0cnVjdCB0b2sgKnRva3MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyB0b2tzW2ldLnMgIT0gTlVMTDsgaSsrKSB7CisJCWlmIChwY2FwX3N0cmNhc2VjbXAodG9rc1tpXS5zLCBzdHIpID09IDApCisJCQlyZXR1cm4gKHRva3NbaV0udik7CisJfQorCXJldHVybiAoLTEpOworfQorCitpbnQgbl9lcnJvcnMgPSAwOworCitzdGF0aWMgc3RydWN0IHF1YWwgcWVyciA9IHsgUV9VTkRFRiwgUV9VTkRFRiwgUV9VTkRFRiwgUV9VTkRFRiB9OworCitzdGF0aWMgdm9pZAoreXllcnJvcihjb25zdCBjaGFyICptc2cpCit7CisJKytuX2Vycm9yczsKKwlicGZfZXJyb3IoIiVzIiwgbXNnKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKyNpZm5kZWYgWVlCSVNPTgoraW50IHl5cGFyc2Uodm9pZCk7CisKK2ludAorcGNhcF9wYXJzZSgpCit7CisJcmV0dXJuICh5eXBhcnNlKCkpOworfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX05FVF9QRlZBUl9ICitzdGF0aWMgaW50CitwZnJlYXNvbl90b19udW0oY29uc3QgY2hhciAqcmVhc29uKQoreworCWNvbnN0IGNoYXIgKnJlYXNvbnNbXSA9IFBGUkVTX05BTUVTOworCWludCBpOworCisJZm9yIChpID0gMDsgcmVhc29uc1tpXTsgaSsrKSB7CisJCWlmIChwY2FwX3N0cmNhc2VjbXAocmVhc29uLCByZWFzb25zW2ldKSA9PSAwKQorCQkJcmV0dXJuIChpKTsKKwl9CisJYnBmX2Vycm9yKCJ1bmtub3duIFBGIHJlYXNvbiIpOworCS8qTk9UUkVBQ0hFRCovCit9CisKK3N0YXRpYyBpbnQKK3BmYWN0aW9uX3RvX251bShjb25zdCBjaGFyICphY3Rpb24pCit7CisJaWYgKHBjYXBfc3RyY2FzZWNtcChhY3Rpb24sICJwYXNzIikgPT0gMCB8fAorCSAgICBwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAiYWNjZXB0IikgPT0gMCkKKwkJcmV0dXJuIChQRl9QQVNTKTsKKwllbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAiZHJvcCIpID09IDAgfHwKKwkJcGNhcF9zdHJjYXNlY21wKGFjdGlvbiwgImJsb2NrIikgPT0gMCkKKwkJcmV0dXJuIChQRl9EUk9QKTsKKyNpZiBIQVZFX1BGX05BVF9USFJPVUdIX1BGX05PUkRSCisJZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKGFjdGlvbiwgInJkciIpID09IDApCisJCXJldHVybiAoUEZfUkRSKTsKKwllbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoYWN0aW9uLCAibmF0IikgPT0gMCkKKwkJcmV0dXJuIChQRl9OQVQpOworCWVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcChhY3Rpb24sICJiaW5hdCIpID09IDApCisJCXJldHVybiAoUEZfQklOQVQpOworCWVsc2UgaWYgKHBjYXBfc3RyY2FzZWNtcChhY3Rpb24sICJub3JkciIpID09IDApCisJCXJldHVybiAoUEZfTk9SRFIpOworI2VuZGlmCisJZWxzZSB7CisJCWJwZl9lcnJvcigidW5rbm93biBQRiBhY3Rpb24iKTsKKwkJLypOT1RSRUFDSEVEKi8KKwl9Cit9CisjZWxzZSAvKiAhSEFWRV9ORVRfUEZWQVJfSCAqLworc3RhdGljIGludAorcGZyZWFzb25fdG9fbnVtKGNvbnN0IGNoYXIgKnJlYXNvbikKK3sKKwlicGZfZXJyb3IoImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKKwkvKk5PVFJFQUNIRUQqLworCisJLyogdGhpcyBpcyB0byBtYWtlIHRoZSBWQyBjb21waWxlciBoYXBweSAqLworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAorcGZhY3Rpb25fdG9fbnVtKGNvbnN0IGNoYXIgKmFjdGlvbikKK3sKKwlicGZfZXJyb3IoImxpYnBjYXAgd2FzIGNvbXBpbGVkIG9uIGEgbWFjaGluZSB3aXRob3V0IHBmIHN1cHBvcnQiKTsKKwkvKk5PVFJFQUNIRUQqLworCisJLyogdGhpcyBpcyB0byBtYWtlIHRoZSBWQyBjb21waWxlciBoYXBweSAqLworCXJldHVybiAtMTsKK30KKyNlbmRpZiAvKiBIQVZFX05FVF9QRlZBUl9IICovCislfQorCisldW5pb24geworCWludCBpOworCWJwZl91X2ludDMyIGg7CisJdV9jaGFyICplOworCWNoYXIgKnM7CisJc3RydWN0IHN0bXQgKnN0bXQ7CisJc3RydWN0IGFydGggKmE7CisJc3RydWN0IHsKKwkJc3RydWN0IHF1YWwgcTsKKwkJaW50IGF0bWZpZWxkdHlwZTsKKwkJaW50IG10cDNmaWVsZHR5cGU7CisJCXN0cnVjdCBibG9jayAqYjsKKwl9IGJsazsKKwlzdHJ1Y3QgYmxvY2sgKnJibGs7Cit9CisKKyV0eXBlCTxibGs+CWV4cHIgaWQgbmlkIHBpZCB0ZXJtIHJ0ZXJtIHFpZAorJXR5cGUJPGJsaz4JaGVhZAorJXR5cGUJPGk+CXBxdWFsIGRxdWFsIGFxdWFsIG5kYXF1YWwKKyV0eXBlCTxhPglhcnRoIG5hcnRoCisldHlwZQk8aT4JYnl0ZW9wIHBuYW1lIHBudW0gcmVsb3AgaXJlbG9wCisldHlwZQk8YmxrPglhbmQgb3IgcGFyZW4gbm90IG51bGwgcHJvZworJXR5cGUJPHJibGs+CW90aGVyIHBmdmFyIHA4MDIxMQorJXR5cGUJPGk+CWF0bXR5cGUgYXRtbXVsdGl0eXBlCisldHlwZQk8YmxrPglhdG1maWVsZAorJXR5cGUJPGJsaz4JYXRtZmllbGR2YWx1ZSBhdG12YWx1ZSBhdG1saXN0dmFsdWUKKyV0eXBlCTxpPgltdHAydHlwZQorJXR5cGUJPGJsaz4JbXRwM2ZpZWxkCisldHlwZQk8YmxrPgltdHAzZmllbGR2YWx1ZSBtdHAzdmFsdWUgbXRwM2xpc3R2YWx1ZQorCisKKyV0b2tlbiAgRFNUIFNSQyBIT1NUIEdBVEVXQVkKKyV0b2tlbiAgTkVUIE5FVE1BU0sgUE9SVCBQT1JUUkFOR0UgTEVTUyBHUkVBVEVSIFBST1RPIFBST1RPQ0hBSU4gQ0JZVEUKKyV0b2tlbiAgQVJQIFJBUlAgSVAgU0NUUCBUQ1AgVURQIElDTVAgSUdNUCBJR1JQIFBJTSBWUlJQIENBUlAKKyV0b2tlbiAgQVRBTEsgQUFSUCBERUNORVQgTEFUIFNDQSBNT1BSQyBNT1BETAorJXRva2VuICBUS19CUk9BRENBU1QgVEtfTVVMVElDQVNUCisldG9rZW4gIE5VTSBJTkJPVU5EIE9VVEJPVU5ECisldG9rZW4gIFBGX0lGTkFNRSBQRl9SU0VUIFBGX1JOUiBQRl9TUk5SIFBGX1JFQVNPTiBQRl9BQ1RJT04KKyV0b2tlbglUWVBFIFNVQlRZUEUgRElSIEFERFIxIEFERFIyIEFERFIzIEFERFI0IFJBIFRBCisldG9rZW4gIExJTksKKyV0b2tlbglHRVEgTEVRIE5FUQorJXRva2VuCUlEIEVJRCBISUQgSElENiBBSUQKKyV0b2tlbglMU0ggUlNICisldG9rZW4gIExFTgorJXRva2VuICBJUFY2IElDTVBWNiBBSCBFU1AKKyV0b2tlbglWTEFOIE1QTFMKKyV0b2tlbglQUFBPRUQgUFBQT0VTCisldG9rZW4gIElTTyBFU0lTIENMTlAgSVNJUyBMMSBMMiBJSUggTFNQIFNOUCBDU05QIFBTTlAgCisldG9rZW4gIFNUUAorJXRva2VuICBJUFgKKyV0b2tlbiAgTkVUQkVVSQorJXRva2VuCUxBTkUgTExDIE1FVEFDIEJDQyBTQyBJTE1JQyBPQU1GNEVDIE9BTUY0U0MKKyV0b2tlbglPQU0gT0FNRjQgQ09OTkVDVE1TRyBNRVRBQ09OTkVDVAorJXRva2VuCVZQSSBWQ0kKKyV0b2tlbglSQURJTworJXRva2VuCUZJU1UgTFNTVSBNU1UKKyV0b2tlbglTSU8gT1BDIERQQyBTTFMKKworJXR5cGUJPHM+IElECisldHlwZQk8ZT4gRUlECisldHlwZQk8ZT4gQUlECisldHlwZQk8cz4gSElEIEhJRDYKKyV0eXBlCTxpPiBOVU0gYWN0aW9uIHJlYXNvbiB0eXBlIHN1YnR5cGUgdHlwZV9zdWJ0eXBlIGRpcgorCislbGVmdCBPUiBBTkQKKyVub25hc3NvYyAgJyEnCislbGVmdCAnfCcKKyVsZWZ0ICcmJworJWxlZnQgTFNIIFJTSAorJWxlZnQgJysnICctJworJWxlZnQgJyonICcvJworJW5vbmFzc29jIFVNSU5VUworJSUKK3Byb2c6CSAgbnVsbCBleHByCit7CisJZmluaXNoX3BhcnNlKCQyLmIpOworfQorCXwgbnVsbAorCTsKK251bGw6CSAgLyogbnVsbCAqLwkJeyAkJC5xID0gcWVycjsgfQorCTsKK2V4cHI6CSAgdGVybQorCXwgZXhwciBhbmQgdGVybQkJeyBnZW5fYW5kKCQxLmIsICQzLmIpOyAkJCA9ICQzOyB9CisJfCBleHByIGFuZCBpZAkJeyBnZW5fYW5kKCQxLmIsICQzLmIpOyAkJCA9ICQzOyB9CisJfCBleHByIG9yIHRlcm0JCXsgZ2VuX29yKCQxLmIsICQzLmIpOyAkJCA9ICQzOyB9CisJfCBleHByIG9yIGlkCQl7IGdlbl9vcigkMS5iLCAkMy5iKTsgJCQgPSAkMzsgfQorCTsKK2FuZDoJICBBTkQJCQl7ICQkID0gJDxibGs+MDsgfQorCTsKK29yOgkgIE9SCQkJeyAkJCA9ICQ8YmxrPjA7IH0KKwk7CitpZDoJICBuaWQKKwl8IHBudW0JCQl7ICQkLmIgPSBnZW5fbmNvZGUoTlVMTCwgKGJwZl91X2ludDMyKSQxLAorCQkJCQkJICAgJCQucSA9ICQ8YmxrPjAucSk7IH0KKwl8IHBhcmVuIHBpZCAnKScJCXsgJCQgPSAkMjsgfQorCTsKK25pZDoJICBJRAkJCXsgJCQuYiA9IGdlbl9zY29kZSgkMSwgJCQucSA9ICQ8YmxrPjAucSk7IH0KKwl8IEhJRCAnLycgTlVNCQl7ICQkLmIgPSBnZW5fbWNvZGUoJDEsIE5VTEwsICQzLAorCQkJCSAgICAkJC5xID0gJDxibGs+MC5xKTsgfQorCXwgSElEIE5FVE1BU0sgSElECXsgJCQuYiA9IGdlbl9tY29kZSgkMSwgJDMsIDAsCisJCQkJICAgICQkLnEgPSAkPGJsaz4wLnEpOyB9CisJfCBISUQJCQl7CisJCQkJICAvKiBEZWNpZGUgaG93IHRvIHBhcnNlIEhJRCBiYXNlZCBvbiBwcm90byAqLworCQkJCSAgJCQucSA9ICQ8YmxrPjAucTsKKwkJCQkgIGlmICgkJC5xLmFkZHIgPT0gUV9QT1JUKQorCQkJCSAgCWJwZl9lcnJvcigiJ3BvcnQnIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXAgaG9zdCIpOworCQkJCSAgZWxzZSBpZiAoJCQucS5hZGRyID09IFFfUE9SVFJBTkdFKQorCQkJCSAgCWJwZl9lcnJvcigiJ3BvcnRyYW5nZScgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCQkJICBlbHNlIGlmICgkJC5xLmFkZHIgPT0gUV9QUk9UTykKKwkJCQkgIAlicGZfZXJyb3IoIidwcm90bycgbW9kaWZpZXIgYXBwbGllZCB0byBpcCBob3N0Iik7CisJCQkJICBlbHNlIGlmICgkJC5xLmFkZHIgPT0gUV9QUk9UT0NIQUlOKQorCQkJCSAgCWJwZl9lcnJvcigiJ3Byb3RvY2hhaW4nIG1vZGlmaWVyIGFwcGxpZWQgdG8gaXAgaG9zdCIpOworCQkJCSAgJCQuYiA9IGdlbl9uY29kZSgkMSwgMCwgJCQucSk7CisJCQkJfQorCXwgSElENiAnLycgTlVNCQl7CisjaWZkZWYgSU5FVDYKKwkJCQkgICQkLmIgPSBnZW5fbWNvZGU2KCQxLCBOVUxMLCAkMywKKwkJCQkgICAgJCQucSA9ICQ8YmxrPjAucSk7CisjZWxzZQorCQkJCSAgYnBmX2Vycm9yKCInaXA2YWRkci9wcmVmaXhsZW4nIG5vdCBzdXBwb3J0ZWQgIgorCQkJCQkiaW4gdGhpcyBjb25maWd1cmF0aW9uIik7CisjZW5kaWYgLypJTkVUNiovCisJCQkJfQorCXwgSElENgkJCXsKKyNpZmRlZiBJTkVUNgorCQkJCSAgJCQuYiA9IGdlbl9tY29kZTYoJDEsIDAsIDEyOCwKKwkJCQkgICAgJCQucSA9ICQ8YmxrPjAucSk7CisjZWxzZQorCQkJCSAgYnBmX2Vycm9yKCInaXA2YWRkcicgbm90IHN1cHBvcnRlZCAiCisJCQkJCSJpbiB0aGlzIGNvbmZpZ3VyYXRpb24iKTsKKyNlbmRpZiAvKklORVQ2Ki8KKwkJCQl9CisJfCBFSUQJCQl7IAorCQkJCSAgJCQuYiA9IGdlbl9lY29kZSgkMSwgJCQucSA9ICQ8YmxrPjAucSk7CisJCQkJICAvKgorCQkJCSAgICogJDEgd2FzIGFsbG9jYXRlZCBieSAicGNhcF9ldGhlcl9hdG9uKCkiLAorCQkJCSAgICogc28gd2UgbXVzdCBmcmVlIGl0IG5vdyB0aGF0IHdlJ3JlIGRvbmUKKwkJCQkgICAqIHdpdGggaXQuCisJCQkJICAgKi8KKwkJCQkgIGZyZWUoJDEpOworCQkJCX0KKwl8IEFJRAkJCXsKKwkJCQkgICQkLmIgPSBnZW5fYWNvZGUoJDEsICQkLnEgPSAkPGJsaz4wLnEpOworCQkJCSAgLyoKKwkJCQkgICAqICQxIHdhcyBhbGxvY2F0ZWQgYnkgInBjYXBfZXRoZXJfYXRvbigpIiwKKwkJCQkgICAqIHNvIHdlIG11c3QgZnJlZSBpdCBub3cgdGhhdCB3ZSdyZSBkb25lCisJCQkJICAgKiB3aXRoIGl0LgorCQkJCSAgICovCisJCQkJICBmcmVlKCQxKTsKKwkJCQl9CisJfCBub3QgaWQJCXsgZ2VuX25vdCgkMi5iKTsgJCQgPSAkMjsgfQorCTsKK25vdDoJICAnIScJCQl7ICQkID0gJDxibGs+MDsgfQorCTsKK3BhcmVuOgkgICcoJwkJCXsgJCQgPSAkPGJsaz4wOyB9CisJOworcGlkOgkgIG5pZAorCXwgcWlkIGFuZCBpZAkJeyBnZW5fYW5kKCQxLmIsICQzLmIpOyAkJCA9ICQzOyB9CisJfCBxaWQgb3IgaWQJCXsgZ2VuX29yKCQxLmIsICQzLmIpOyAkJCA9ICQzOyB9CisJOworcWlkOgkgIHBudW0JCQl7ICQkLmIgPSBnZW5fbmNvZGUoTlVMTCwgKGJwZl91X2ludDMyKSQxLAorCQkJCQkJICAgJCQucSA9ICQ8YmxrPjAucSk7IH0KKwl8IHBpZAorCTsKK3Rlcm06CSAgcnRlcm0KKwl8IG5vdCB0ZXJtCQl7IGdlbl9ub3QoJDIuYik7ICQkID0gJDI7IH0KKwk7CitoZWFkOgkgIHBxdWFsIGRxdWFsIGFxdWFsCXsgUVNFVCgkJC5xLCAkMSwgJDIsICQzKTsgfQorCXwgcHF1YWwgZHF1YWwJCXsgUVNFVCgkJC5xLCAkMSwgJDIsIFFfREVGQVVMVCk7IH0KKwl8IHBxdWFsIGFxdWFsCQl7IFFTRVQoJCQucSwgJDEsIFFfREVGQVVMVCwgJDIpOyB9CisJfCBwcXVhbCBQUk9UTwkJeyBRU0VUKCQkLnEsICQxLCBRX0RFRkFVTFQsIFFfUFJPVE8pOyB9CisJfCBwcXVhbCBQUk9UT0NIQUlOCXsgUVNFVCgkJC5xLCAkMSwgUV9ERUZBVUxULCBRX1BST1RPQ0hBSU4pOyB9CisJfCBwcXVhbCBuZGFxdWFsCQl7IFFTRVQoJCQucSwgJDEsIFFfREVGQVVMVCwgJDIpOyB9CisJOworcnRlcm06CSAgaGVhZCBpZAkJeyAkJCA9ICQyOyB9CisJfCBwYXJlbiBleHByICcpJwl7ICQkLmIgPSAkMi5iOyAkJC5xID0gJDEucTsgfQorCXwgcG5hbWUJCQl7ICQkLmIgPSBnZW5fcHJvdG9fYWJicmV2KCQxKTsgJCQucSA9IHFlcnI7IH0KKwl8IGFydGggcmVsb3AgYXJ0aAl7ICQkLmIgPSBnZW5fcmVsYXRpb24oJDIsICQxLCAkMywgMCk7CisJCQkJICAkJC5xID0gcWVycjsgfQorCXwgYXJ0aCBpcmVsb3AgYXJ0aAl7ICQkLmIgPSBnZW5fcmVsYXRpb24oJDIsICQxLCAkMywgMSk7CisJCQkJICAkJC5xID0gcWVycjsgfQorCXwgb3RoZXIJCQl7ICQkLmIgPSAkMTsgJCQucSA9IHFlcnI7IH0KKwl8IGF0bXR5cGUJCXsgJCQuYiA9IGdlbl9hdG10eXBlX2FiYnJldigkMSk7ICQkLnEgPSBxZXJyOyB9CisJfCBhdG1tdWx0aXR5cGUJCXsgJCQuYiA9IGdlbl9hdG1tdWx0aV9hYmJyZXYoJDEpOyAkJC5xID0gcWVycjsgfQorCXwgYXRtZmllbGQgYXRtdmFsdWUJeyAkJC5iID0gJDIuYjsgJCQucSA9IHFlcnI7IH0KKwl8IG10cDJ0eXBlCQl7ICQkLmIgPSBnZW5fbXRwMnR5cGVfYWJicmV2KCQxKTsgJCQucSA9IHFlcnI7IH0KKwl8IG10cDNmaWVsZCBtdHAzdmFsdWUJeyAkJC5iID0gJDIuYjsgJCQucSA9IHFlcnI7IH0KKwk7CisvKiBwcm90b2NvbCBsZXZlbCBxdWFsaWZpZXJzICovCitwcXVhbDoJICBwbmFtZQorCXwJCQl7ICQkID0gUV9ERUZBVUxUOyB9CisJOworLyogJ2RpcmVjdGlvbicgcXVhbGlmaWVycyAqLworZHF1YWw6CSAgU1JDCQkJeyAkJCA9IFFfU1JDOyB9CisJfCBEU1QJCQl7ICQkID0gUV9EU1Q7IH0KKwl8IFNSQyBPUiBEU1QJCXsgJCQgPSBRX09SOyB9CisJfCBEU1QgT1IgU1JDCQl7ICQkID0gUV9PUjsgfQorCXwgU1JDIEFORCBEU1QJCXsgJCQgPSBRX0FORDsgfQorCXwgRFNUIEFORCBTUkMJCXsgJCQgPSBRX0FORDsgfQorCXwgQUREUjEJCQl7ICQkID0gUV9BRERSMTsgfQorCXwgQUREUjIJCQl7ICQkID0gUV9BRERSMjsgfQorCXwgQUREUjMJCQl7ICQkID0gUV9BRERSMzsgfQorCXwgQUREUjQJCQl7ICQkID0gUV9BRERSNDsgfQorCXwgUkEJCQl7ICQkID0gUV9SQTsgfQorCXwgVEEJCQl7ICQkID0gUV9UQTsgfQorCTsKKy8qIGFkZHJlc3MgdHlwZSBxdWFsaWZpZXJzICovCithcXVhbDoJICBIT1NUCQkJeyAkJCA9IFFfSE9TVDsgfQorCXwgTkVUCQkJeyAkJCA9IFFfTkVUOyB9CisJfCBQT1JUCQkJeyAkJCA9IFFfUE9SVDsgfQorCXwgUE9SVFJBTkdFCQl7ICQkID0gUV9QT1JUUkFOR0U7IH0KKwk7CisvKiBub24tZGlyZWN0aW9uYWwgYWRkcmVzcyB0eXBlIHF1YWxpZmllcnMgKi8KK25kYXF1YWw6ICBHQVRFV0FZCQl7ICQkID0gUV9HQVRFV0FZOyB9CisJOworcG5hbWU6CSAgTElOSwkJCXsgJCQgPSBRX0xJTks7IH0KKwl8IElQCQkJeyAkJCA9IFFfSVA7IH0KKwl8IEFSUAkJCXsgJCQgPSBRX0FSUDsgfQorCXwgUkFSUAkJCXsgJCQgPSBRX1JBUlA7IH0KKwl8IFNDVFAJCQl7ICQkID0gUV9TQ1RQOyB9CisJfCBUQ1AJCQl7ICQkID0gUV9UQ1A7IH0KKwl8IFVEUAkJCXsgJCQgPSBRX1VEUDsgfQorCXwgSUNNUAkJCXsgJCQgPSBRX0lDTVA7IH0KKwl8IElHTVAJCQl7ICQkID0gUV9JR01QOyB9CisJfCBJR1JQCQkJeyAkJCA9IFFfSUdSUDsgfQorCXwgUElNCQkJeyAkJCA9IFFfUElNOyB9CisJfCBWUlJQCQkJeyAkJCA9IFFfVlJSUDsgfQorCXwgQ0FSUCAJCQl7ICQkID0gUV9DQVJQOyB9CisJfCBBVEFMSwkJCXsgJCQgPSBRX0FUQUxLOyB9CisJfCBBQVJQCQkJeyAkJCA9IFFfQUFSUDsgfQorCXwgREVDTkVUCQl7ICQkID0gUV9ERUNORVQ7IH0KKwl8IExBVAkJCXsgJCQgPSBRX0xBVDsgfQorCXwgU0NBCQkJeyAkJCA9IFFfU0NBOyB9CisJfCBNT1BETAkJCXsgJCQgPSBRX01PUERMOyB9CisJfCBNT1BSQwkJCXsgJCQgPSBRX01PUFJDOyB9CisJfCBJUFY2CQkJeyAkJCA9IFFfSVBWNjsgfQorCXwgSUNNUFY2CQl7ICQkID0gUV9JQ01QVjY7IH0KKwl8IEFICQkJeyAkJCA9IFFfQUg7IH0KKwl8IEVTUAkJCXsgJCQgPSBRX0VTUDsgfQorCXwgSVNPCQkJeyAkJCA9IFFfSVNPOyB9CisJfCBFU0lTCQkJeyAkJCA9IFFfRVNJUzsgfQorCXwgSVNJUwkJCXsgJCQgPSBRX0lTSVM7IH0KKwl8IEwxCQkJeyAkJCA9IFFfSVNJU19MMTsgfQorCXwgTDIJCQl7ICQkID0gUV9JU0lTX0wyOyB9CisJfCBJSUgJCQl7ICQkID0gUV9JU0lTX0lJSDsgfQorCXwgTFNQCQkJeyAkJCA9IFFfSVNJU19MU1A7IH0KKwl8IFNOUAkJCXsgJCQgPSBRX0lTSVNfU05QOyB9CisJfCBQU05QCQkJeyAkJCA9IFFfSVNJU19QU05QOyB9CisJfCBDU05QCQkJeyAkJCA9IFFfSVNJU19DU05QOyB9CisJfCBDTE5QCQkJeyAkJCA9IFFfQ0xOUDsgfQorCXwgU1RQCQkJeyAkJCA9IFFfU1RQOyB9CisJfCBJUFgJCQl7ICQkID0gUV9JUFg7IH0KKwl8IE5FVEJFVUkJCXsgJCQgPSBRX05FVEJFVUk7IH0KKwl8IFJBRElPCQkJeyAkJCA9IFFfUkFESU87IH0KKwk7CitvdGhlcjoJICBwcXVhbCBUS19CUk9BRENBU1QJeyAkJCA9IGdlbl9icm9hZGNhc3QoJDEpOyB9CisJfCBwcXVhbCBUS19NVUxUSUNBU1QJeyAkJCA9IGdlbl9tdWx0aWNhc3QoJDEpOyB9CisJfCBMRVNTIE5VTQkJeyAkJCA9IGdlbl9sZXNzKCQyKTsgfQorCXwgR1JFQVRFUiBOVU0JCXsgJCQgPSBnZW5fZ3JlYXRlcigkMik7IH0KKwl8IENCWVRFIE5VTSBieXRlb3AgTlVNCXsgJCQgPSBnZW5fYnl0ZW9wKCQzLCAkMiwgJDQpOyB9CisJfCBJTkJPVU5ECQl7ICQkID0gZ2VuX2luYm91bmQoMCk7IH0KKwl8IE9VVEJPVU5ECQl7ICQkID0gZ2VuX2luYm91bmQoMSk7IH0KKwl8IFZMQU4gcG51bQkJeyAkJCA9IGdlbl92bGFuKCQyKTsgfQorCXwgVkxBTgkJCXsgJCQgPSBnZW5fdmxhbigtMSk7IH0KKwl8IE1QTFMgcG51bQkJeyAkJCA9IGdlbl9tcGxzKCQyKTsgfQorCXwgTVBMUwkJCXsgJCQgPSBnZW5fbXBscygtMSk7IH0KKwl8IFBQUE9FRAkJeyAkJCA9IGdlbl9wcHBvZWQoKTsgfQorCXwgUFBQT0VTCQl7ICQkID0gZ2VuX3BwcG9lcygpOyB9CisJfCBwZnZhcgkJCXsgJCQgPSAkMTsgfQorCXwgcHF1YWwgcDgwMjExCQl7ICQkID0gJDI7IH0KKwk7CisKK3BmdmFyOgkgIFBGX0lGTkFNRSBJRAkJeyAkJCA9IGdlbl9wZl9pZm5hbWUoJDIpOyB9CisJfCBQRl9SU0VUIElECQl7ICQkID0gZ2VuX3BmX3J1bGVzZXQoJDIpOyB9CisJfCBQRl9STlIgTlVNCQl7ICQkID0gZ2VuX3BmX3JucigkMik7IH0KKwl8IFBGX1NSTlIgTlVNCQl7ICQkID0gZ2VuX3BmX3NybnIoJDIpOyB9CisJfCBQRl9SRUFTT04gcmVhc29uCXsgJCQgPSBnZW5fcGZfcmVhc29uKCQyKTsgfQorCXwgUEZfQUNUSU9OIGFjdGlvbgl7ICQkID0gZ2VuX3BmX2FjdGlvbigkMik7IH0KKwk7CisKK3A4MDIxMTogICBUWVBFIHR5cGUgU1VCVFlQRSBzdWJ0eXBlCisJCQkJeyAkJCA9IGdlbl9wODAyMTFfdHlwZSgkMiB8ICQ0LAorCQkJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8CisJCQkJCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKTsKKwkJCQl9CisJfCBUWVBFIHR5cGUJCXsgJCQgPSBnZW5fcDgwMjExX3R5cGUoJDIsCisJCQkJCUlFRUU4MDIxMV9GQzBfVFlQRV9NQVNLKTsKKwkJCQl9CisJfCBTVUJUWVBFIHR5cGVfc3VidHlwZQl7ICQkID0gZ2VuX3A4MDIxMV90eXBlKCQyLAorCQkJCQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8CisJCQkJCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKTsKKwkJCQl9CisJfCBESVIgZGlyCQl7ICQkID0gZ2VuX3A4MDIxMV9mY2RpcigkMik7IH0KKwk7CisKK3R5cGU6CSAgTlVNCisJfCBJRAkJCXsgJCQgPSBzdHIydG9rKCQxLCBpZWVlODAyMTFfdHlwZXMpOworCQkJCSAgaWYgKCQkID09IC0xKQorCQkJCSAgCWJwZl9lcnJvcigidW5rbm93biA4MDIuMTEgdHlwZSBuYW1lIik7CisJCQkJfQorCTsKKworc3VidHlwZTogIE5VTQorCXwgSUQJCQl7IGNvbnN0IHN0cnVjdCB0b2sgKnR5cGVzID0gTlVMTDsKKwkJCQkgIGludCBpOworCQkJCSAgZm9yIChpID0gMDs7IGkrKykgeworCQkJCSAgCWlmIChpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50b2sgPT0gTlVMTCkgeworCQkJCSAgCQkvKiBSYW4gb3V0IG9mIHR5cGVzICovCisJCQkJCQlicGZfZXJyb3IoInVua25vd24gODAyLjExIHR5cGUiKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmICgkPGk+LTEgPT0gaWVlZTgwMjExX3R5cGVfc3VidHlwZXNbaV0udHlwZSkgeworCQkJCQkJdHlwZXMgPSBpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50b2s7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCSAgfQorCisJCQkJICAkJCA9IHN0cjJ0b2soJDEsIHR5cGVzKTsKKwkJCQkgIGlmICgkJCA9PSAtMSkKKwkJCQkJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSBzdWJ0eXBlIG5hbWUiKTsKKwkJCQl9CisJOworCit0eXBlX3N1YnR5cGU6CUlECQl7IGludCBpOworCQkJCSAgZm9yIChpID0gMDs7IGkrKykgeworCQkJCSAgCWlmIChpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50b2sgPT0gTlVMTCkgeworCQkJCSAgCQkvKiBSYW4gb3V0IG9mIHR5cGVzICovCisJCQkJCQlicGZfZXJyb3IoInVua25vd24gODAyLjExIHR5cGUgbmFtZSIpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJJCQgPSBzdHIydG9rKCQxLCBpZWVlODAyMTFfdHlwZV9zdWJ0eXBlc1tpXS50b2spOworCQkJCQlpZiAoJCQgIT0gLTEpIHsKKwkJCQkJCSQkIHw9IGllZWU4MDIxMV90eXBlX3N1YnR5cGVzW2ldLnR5cGU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCSAgfQorCQkJCX0KKwkJOworCitkaXI6CSAgTlVNCisJfCBJRAkJCXsgaWYgKHBjYXBfc3RyY2FzZWNtcCgkMSwgIm5vZHMiKSA9PSAwKQorCQkJCQkkJCA9IElFRUU4MDIxMV9GQzFfRElSX05PRFM7CisJCQkJICBlbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoJDEsICJ0b2RzIikgPT0gMCkKKwkJCQkJJCQgPSBJRUVFODAyMTFfRkMxX0RJUl9UT0RTOworCQkJCSAgZWxzZSBpZiAocGNhcF9zdHJjYXNlY21wKCQxLCAiZnJvbWRzIikgPT0gMCkKKwkJCQkJJCQgPSBJRUVFODAyMTFfRkMxX0RJUl9GUk9NRFM7CisJCQkJICBlbHNlIGlmIChwY2FwX3N0cmNhc2VjbXAoJDEsICJkc3RvZHMiKSA9PSAwKQorCQkJCQkkJCA9IElFRUU4MDIxMV9GQzFfRElSX0RTVE9EUzsKKwkJCQkgIGVsc2UKKwkJCQkJYnBmX2Vycm9yKCJ1bmtub3duIDgwMi4xMSBkaXJlY3Rpb24iKTsKKwkJCQl9CisJOworCityZWFzb246CSAgTlVNCQkJeyAkJCA9ICQxOyB9CisJfCBJRAkJCXsgJCQgPSBwZnJlYXNvbl90b19udW0oJDEpOyB9CisJOworCithY3Rpb246CSAgSUQJCQl7ICQkID0gcGZhY3Rpb25fdG9fbnVtKCQxKTsgfQorCTsKKworcmVsb3A6CSAgJz4nCQkJeyAkJCA9IEJQRl9KR1Q7IH0KKwl8IEdFUQkJCXsgJCQgPSBCUEZfSkdFOyB9CisJfCAnPScJCQl7ICQkID0gQlBGX0pFUTsgfQorCTsKK2lyZWxvcDoJICBMRVEJCQl7ICQkID0gQlBGX0pHVDsgfQorCXwgJzwnCQkJeyAkJCA9IEJQRl9KR0U7IH0KKwl8IE5FUQkJCXsgJCQgPSBCUEZfSkVROyB9CisJOworYXJ0aDoJICBwbnVtCQkJeyAkJCA9IGdlbl9sb2FkaSgkMSk7IH0KKwl8IG5hcnRoCisJOworbmFydGg6CSAgcG5hbWUgJ1snIGFydGggJ10nCQl7ICQkID0gZ2VuX2xvYWQoJDEsICQzLCAxKTsgfQorCXwgcG5hbWUgJ1snIGFydGggJzonIE5VTSAnXScJeyAkJCA9IGdlbl9sb2FkKCQxLCAkMywgJDUpOyB9CisJfCBhcnRoICcrJyBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKEJQRl9BREQsICQxLCAkMyk7IH0KKwl8IGFydGggJy0nIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoQlBGX1NVQiwgJDEsICQzKTsgfQorCXwgYXJ0aCAnKicgYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChCUEZfTVVMLCAkMSwgJDMpOyB9CisJfCBhcnRoICcvJyBhcnRoCQkJeyAkJCA9IGdlbl9hcnRoKEJQRl9ESVYsICQxLCAkMyk7IH0KKwl8IGFydGggJyYnIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoQlBGX0FORCwgJDEsICQzKTsgfQorCXwgYXJ0aCAnfCcgYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChCUEZfT1IsICQxLCAkMyk7IH0KKwl8IGFydGggTFNIIGFydGgJCQl7ICQkID0gZ2VuX2FydGgoQlBGX0xTSCwgJDEsICQzKTsgfQorCXwgYXJ0aCBSU0ggYXJ0aAkJCXsgJCQgPSBnZW5fYXJ0aChCUEZfUlNILCAkMSwgJDMpOyB9CisJfCAnLScgYXJ0aCAlcHJlYyBVTUlOVVMJCXsgJCQgPSBnZW5fbmVnKCQyKTsgfQorCXwgcGFyZW4gbmFydGggJyknCQl7ICQkID0gJDI7IH0KKwl8IExFTgkJCQl7ICQkID0gZ2VuX2xvYWRsZW4oKTsgfQorCTsKK2J5dGVvcDoJICAnJicJCQl7ICQkID0gJyYnOyB9CisJfCAnfCcJCQl7ICQkID0gJ3wnOyB9CisJfCAnPCcJCQl7ICQkID0gJzwnOyB9CisJfCAnPicJCQl7ICQkID0gJz4nOyB9CisJfCAnPScJCQl7ICQkID0gJz0nOyB9CisJOworcG51bToJICBOVU0KKwl8IHBhcmVuIHBudW0gJyknCXsgJCQgPSAkMjsgfQorCTsKK2F0bXR5cGU6IExBTkUJCQl7ICQkID0gQV9MQU5FOyB9CisJfCBMTEMJCQl7ICQkID0gQV9MTEM7IH0KKwl8IE1FVEFDCQkJeyAkJCA9IEFfTUVUQUM7CX0KKwl8IEJDQwkJCXsgJCQgPSBBX0JDQzsgfQorCXwgT0FNRjRFQwkJeyAkJCA9IEFfT0FNRjRFQzsgfQorCXwgT0FNRjRTQwkJeyAkJCA9IEFfT0FNRjRTQzsgfQorCXwgU0MJCQl7ICQkID0gQV9TQzsgfQorCXwgSUxNSUMJCQl7ICQkID0gQV9JTE1JQzsgfQorCTsKK2F0bW11bHRpdHlwZTogT0FNCQl7ICQkID0gQV9PQU07IH0KKwl8IE9BTUY0CQkJeyAkJCA9IEFfT0FNRjQ7IH0KKwl8IENPTk5FQ1RNU0cJCXsgJCQgPSBBX0NPTk5FQ1RNU0c7IH0KKwl8IE1FVEFDT05ORUNUCQl7ICQkID0gQV9NRVRBQ09OTkVDVDsgfQorCTsKKwkvKiBBVE0gZmllbGQgdHlwZXMgcXVhbnRpZmllciAqLworYXRtZmllbGQ6IFZQSQkJCXsgJCQuYXRtZmllbGR0eXBlID0gQV9WUEk7IH0KKwl8IFZDSQkJCXsgJCQuYXRtZmllbGR0eXBlID0gQV9WQ0k7IH0KKwk7CithdG12YWx1ZTogYXRtZmllbGR2YWx1ZQorCXwgcmVsb3AgTlVNCQl7ICQkLmIgPSBnZW5fYXRtZmllbGRfY29kZSgkPGJsaz4wLmF0bWZpZWxkdHlwZSwgKGJwZl9pbnQzMikkMiwgKGJwZl91X2ludDMyKSQxLCAwKTsgfQorCXwgaXJlbG9wIE5VTQkJeyAkJC5iID0gZ2VuX2F0bWZpZWxkX2NvZGUoJDxibGs+MC5hdG1maWVsZHR5cGUsIChicGZfaW50MzIpJDIsIChicGZfdV9pbnQzMikkMSwgMSk7IH0KKwl8IHBhcmVuIGF0bWxpc3R2YWx1ZSAnKScgeyAkJC5iID0gJDIuYjsgJCQucSA9IHFlcnI7IH0KKwk7CithdG1maWVsZHZhbHVlOiBOVU0geworCSQkLmF0bWZpZWxkdHlwZSA9ICQ8YmxrPjAuYXRtZmllbGR0eXBlOworCWlmICgkJC5hdG1maWVsZHR5cGUgPT0gQV9WUEkgfHwKKwkgICAgJCQuYXRtZmllbGR0eXBlID09IEFfVkNJKQorCQkkJC5iID0gZ2VuX2F0bWZpZWxkX2NvZGUoJCQuYXRtZmllbGR0eXBlLCAoYnBmX2ludDMyKSAkMSwgQlBGX0pFUSwgMCk7CisJfQorCTsKK2F0bWxpc3R2YWx1ZTogYXRtZmllbGR2YWx1ZQorCXwgYXRtbGlzdHZhbHVlIG9yIGF0bWZpZWxkdmFsdWUgeyBnZW5fb3IoJDEuYiwgJDMuYik7ICQkID0gJDM7IH0KKwk7CisJLyogTVRQMiB0eXBlcyBxdWFudGlmaWVyICovCittdHAydHlwZTogRklTVQkJCXsgJCQgPSBNX0ZJU1U7IH0KKwl8IExTU1UJCQl7ICQkID0gTV9MU1NVOyB9CisJfCBNU1UJCQl7ICQkID0gTV9NU1U7IH0KKwk7CisJLyogTVRQMyBmaWVsZCB0eXBlcyBxdWFudGlmaWVyICovCittdHAzZmllbGQ6IFNJTwkJCXsgJCQubXRwM2ZpZWxkdHlwZSA9IE1fU0lPOyB9CisJfCBPUEMJCQl7ICQkLm10cDNmaWVsZHR5cGUgPSBNX09QQzsgfQorCXwgRFBDCQkJeyAkJC5tdHAzZmllbGR0eXBlID0gTV9EUEM7IH0KKwl8IFNMUyAgICAgICAgICAgICAgICAgICB7ICQkLm10cDNmaWVsZHR5cGUgPSBNX1NMUzsgfQorCTsKK210cDN2YWx1ZTogbXRwM2ZpZWxkdmFsdWUKKwl8IHJlbG9wIE5VTQkJeyAkJC5iID0gZ2VuX210cDNmaWVsZF9jb2RlKCQ8YmxrPjAubXRwM2ZpZWxkdHlwZSwgKHVfaW50KSQyLCAodV9pbnQpJDEsIDApOyB9CisJfCBpcmVsb3AgTlVNCQl7ICQkLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoJDxibGs+MC5tdHAzZmllbGR0eXBlLCAodV9pbnQpJDIsICh1X2ludCkkMSwgMSk7IH0KKwl8IHBhcmVuIG10cDNsaXN0dmFsdWUgJyknIHsgJCQuYiA9ICQyLmI7ICQkLnEgPSBxZXJyOyB9CisJOworbXRwM2ZpZWxkdmFsdWU6IE5VTSB7CisJJCQubXRwM2ZpZWxkdHlwZSA9ICQ8YmxrPjAubXRwM2ZpZWxkdHlwZTsKKwlpZiAoJCQubXRwM2ZpZWxkdHlwZSA9PSBNX1NJTyB8fAorCSAgICAkJC5tdHAzZmllbGR0eXBlID09IE1fT1BDIHx8CisJICAgICQkLm10cDNmaWVsZHR5cGUgPT0gTV9EUEMgfHwKKwkgICAgJCQubXRwM2ZpZWxkdHlwZSA9PSBNX1NMUyApCisJCSQkLmIgPSBnZW5fbXRwM2ZpZWxkX2NvZGUoJCQubXRwM2ZpZWxkdHlwZSwgKHVfaW50KSAkMSwgQlBGX0pFUSwgMCk7CisJfQorCTsKK210cDNsaXN0dmFsdWU6IG10cDNmaWVsZHZhbHVlCisJfCBtdHAzbGlzdHZhbHVlIG9yIG10cDNmaWVsZHZhbHVlIHsgZ2VuX29yKCQxLmIsICQzLmIpOyAkJCA9ICQzOyB9CisJOworJSUKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvaWVlZTgwMjExLmggYi9saWJwY2FwLTEuMy4wL2llZWU4MDIxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzgwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2llZWU4MDIxMS5oCkBAIC0wLDAgKzEsMTQ2IEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMjAwMSBBdHN1c2hpIE9ub2UKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA1IFNhbSBMZWZmbGVyLCBFcnJubyBDb25zdWx0aW5nCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICRGcmVlQlNEOiBzcmMvc3lzL25ldDgwMjExL2llZWU4MDIxMS5oLHYgMS4xMCAyMDA1LzA3LzIyIDE2OjU1OjI3IHNhbSBFeHAgJAorICovCisjaWZuZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfSF8KKyNkZWZpbmUgX05FVDgwMjExX0lFRUU4MDIxMV9IXworCisvKgorICogODAyLjExIHByb3RvY29sIGRlZmluaXRpb25zLgorICovCisKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9WRVJTSU9OX01BU0sJCTB4MDMKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9WRVJTSU9OX1NISUZUCQkwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfVkVSU0lPTl8wCQkJMHgwMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1RZUEVfTUFTSwkJCTB4MGMKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9UWVBFX1NISUZUCQkyCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfVFlQRV9NR1QJCQkweDAwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfVFlQRV9DVEwJCQkweDA0CisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfVFlQRV9EQVRBCQkJMHgwOAorCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLCQkweGYwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9TSElGVAkJNAorLyogZm9yIFRZUEVfTUdUICovCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9BU1NPQ19SRVEJCTB4MDAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FTU09DX1JFU1AJMHgxMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVEJMHgyMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUkVBU1NPQ19SRVNQCTB4MzAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1BST0JFX1JFUQkJMHg0MAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUFJPQkVfUkVTUAkweDUwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9CRUFDT04JCTB4ODAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FUSU0JCTB4OTAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RJU0FTU09DCQkweGEwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9BVVRICQkweGIwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9ERUFVVEgJCTB4YzAKKy8qIGZvciBUWVBFX0NUTCAqLworI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUFNfUE9MTAkJMHhhMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUlRTCQkweGIwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9DVFMJCTB4YzAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0FDSwkJMHhkMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfRU5ECQkweGUwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9DRl9FTkRfQUNLCTB4ZjAKKy8qIGZvciBUWVBFX0RBVEEgKGJpdCBjb21iaW5hdGlvbikgKi8KKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0RBVEEJCTB4MDAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX0NGX0FDSwkJMHgxMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfUE9MTAkJMHgyMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfQ0ZfQUNQTAkJMHgzMAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfTk9EQVRBCQkweDQwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzBfU1VCVFlQRV9OT0RBVEFfQ0ZfQUNLCTB4NTAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PREFUQV9DRl9QT0xMCTB4NjAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX05PREFUQV9DRl9BQ1BMCTB4NzAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMF9TVUJUWVBFX1FPUwkJMHg4MAorI2RlZmluZQlJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TX05VTEwJCTB4YzAKKworI2RlZmluZQlJRUVFODAyMTFfRkMxX0RJUl9NQVNLCQkJMHgwMworI2RlZmluZQlJRUVFODAyMTFfRkMxX0RJUl9OT0RTCQkJMHgwMAkvKiBTVEEtPlNUQSAqLworI2RlZmluZQlJRUVFODAyMTFfRkMxX0RJUl9UT0RTCQkJMHgwMQkvKiBTVEEtPkFQICAqLworI2RlZmluZQlJRUVFODAyMTFfRkMxX0RJUl9GUk9NRFMJCTB4MDIJLyogQVAgLT5TVEEgKi8KKyNkZWZpbmUJSUVFRTgwMjExX0ZDMV9ESVJfRFNUT0RTCQkweDAzCS8qIEFQIC0+QVAgICovCisKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMV9NT1JFX0ZSQUcJCQkweDA0CisjZGVmaW5lCUlFRUU4MDIxMV9GQzFfUkVUUlkJCQkweDA4CisjZGVmaW5lCUlFRUU4MDIxMV9GQzFfUFdSX01HVAkJCTB4MTAKKyNkZWZpbmUJSUVFRTgwMjExX0ZDMV9NT1JFX0RBVEEJCQkweDIwCisjZGVmaW5lCUlFRUU4MDIxMV9GQzFfV0VQCQkJMHg0MAorI2RlZmluZQlJRUVFODAyMTFfRkMxX09SREVSCQkJMHg4MAorCisjZGVmaW5lCUlFRUU4MDIxMV9TRVFfRlJBR19NQVNLCQkJMHgwMDBmCisjZGVmaW5lCUlFRUU4MDIxMV9TRVFfRlJBR19TSElGVAkJMAorI2RlZmluZQlJRUVFODAyMTFfU0VRX1NFUV9NQVNLCQkJMHhmZmYwCisjZGVmaW5lCUlFRUU4MDIxMV9TRVFfU0VRX1NISUZUCQkJNAorCisjZGVmaW5lCUlFRUU4MDIxMV9OV0lEX0xFTgkJCTMyCisKKyNkZWZpbmUJSUVFRTgwMjExX1FPU19UWE9QCQkJMHgwMGZmCisvKiBiaXQgOCBpcyByZXNlcnZlZCAqLworI2RlZmluZQlJRUVFODAyMTFfUU9TX0FDS1BPTElDWQkJCTB4NjAKKyNkZWZpbmUJSUVFRTgwMjExX1FPU19BQ0tQT0xJQ1lfUwkJNQorI2RlZmluZQlJRUVFODAyMTFfUU9TX0VTT1AJCQkweDEwCisjZGVmaW5lCUlFRUU4MDIxMV9RT1NfRVNPUF9TCQkJNAorI2RlZmluZQlJRUVFODAyMTFfUU9TX1RJRAkJCTB4MGYKKworI2RlZmluZSBJRUVFODAyMTFfTUdUX1NVQlRZUEVfTkFNRVMgewkJCVwKKwkiYXNzb2MtcmVxIiwJCSJhc3NvYy1yZXNwIiwJCVwKKwkicmVhc3NvYy1yZXEiLAkJInJlYXNzb2MtcmVzcCIsCQlcCisJInByb2JlLXJlcSIsCQkicHJvYmUtcmVzcCIsCQlcCisJInJlc2VydmVkIzYiLAkJInJlc2VydmVkIzciLAkJXAorCSJiZWFjb24iLAkJImF0aW0iLAkJCVwKKwkiZGlzYXNzb2MiLAkJImF1dGgiLAkJCVwKKwkiZGVhdXRoIiwJCSJyZXNlcnZlZCMxMyIsCQlcCisJInJlc2VydmVkIzE0IiwJCSJyZXNlcnZlZCMxNSIJCVwKK30KKworI2RlZmluZSBJRUVFODAyMTFfQ1RMX1NVQlRZUEVfTkFNRVMgewkJCVwKKwkicmVzZXJ2ZWQjMCIsCQkicmVzZXJ2ZWQjMSIsCQlcCisJInJlc2VydmVkIzIiLAkJInJlc2VydmVkIzMiLAkJXAorCSJyZXNlcnZlZCMzIiwJCSJyZXNlcnZlZCM1IiwJCVwKKwkicmVzZXJ2ZWQjNiIsCQkicmVzZXJ2ZWQjNyIsCQlcCisJInJlc2VydmVkIzgiLAkJInJlc2VydmVkIzkiLAkJXAorCSJwcy1wb2xsIiwJCSJydHMiLAkJCVwKKwkiY3RzIiwJCQkiYWNrIiwJCQlcCisJImNmLWVuZCIsCQkiY2YtZW5kLWFjayIJCVwKK30KKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9TVUJUWVBFX05BTUVTIHsJCQlcCisJImRhdGEiLAkJCSJkYXRhLWNmLWFjayIsCQlcCisJImRhdGEtY2YtcG9sbCIsCQkiZGF0YS1jZi1hY2stcG9sbCIsCVwKKwkibnVsbCIsCQkJImNmLWFjayIsCQlcCisJImNmLXBvbGwiLAkJImNmLWFjay1wb2xsIiwJCVwKKwkicW9zLWRhdGEiLAkJInFvcy1kYXRhLWNmLWFjayIsCVwKKwkicW9zLWRhdGEtY2YtcG9sbCIsCSJxb3MtZGF0YS1jZi1hY2stcG9sbCIsCVwKKwkicW9zIiwJCQkicmVzZXJ2ZWQjMTMiLAkJXAorCSJxb3MtY2YtcG9sbCIsCQkicW9zLWNmLWFjay1wb2xsIglcCit9CisKKyNkZWZpbmUgSUVFRTgwMjExX1RZUEVfTkFNRVMJeyAibWd0IiwgImN0bCIsICJkYXRhIiwgInJlc2VydmVkIzQiIH0KKworI2VuZGlmIC8qIF9ORVQ4MDIxMV9JRUVFODAyMTFfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvaW5ldC5jIGIvbGlicGNhcC0xLjMuMC9pbmV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlNDZlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvaW5ldC5jCkBAIC0wLDAgKzEsOTMzIEBACisvKiAtKi0gTW9kZTogYzsgdGFiLXdpZHRoOiA4OyBpbmRlbnQtdGFicy1tb2RlOiAxOyBjLWJhc2ljLW9mZnNldDogODsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcworICoJRW5naW5lZXJpbmcgR3JvdXAgYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvaW5ldC5jLHYgMS43OSAyMDA4LTA0LTIwIDE4OjE5OjAyIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2lmbmRlZiBNU0RPUworI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaWZkZWYgSEFWRV9TWVNfU09DS0lPX0gKKyNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CisjZW5kaWYKKworc3RydWN0IG1idWY7CQkvKiBTcXVlbGNoIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHNvbWUgcGxhdGZvcm1zIGZvciAqLworc3RydWN0IHJ0ZW50cnk7CQkvKiBkZWNsYXJhdGlvbnMgaW4gPG5ldC9pZi5oPiAqLworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKF9fQk9STEFORENfXykKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAvKiAhV0lOMzIgJiYgIV9fQk9STEFORENfXyAqLworI2lmZGVmIEhBVkVfTElNSVRTX0gKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbHNlCisjZGVmaW5lIElOVF9NQVgJCTIxNDc0ODM2NDcKKyNlbmRpZgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworLyogTm90IGFsbCBzeXN0ZW1zIGhhdmUgSUZGX0xPT1BCQUNLICovCisjaWZkZWYgSUZGX0xPT1BCQUNLCisjZGVmaW5lIElTTE9PUEJBQ0sobmFtZSwgZmxhZ3MpICgoZmxhZ3MpICYgSUZGX0xPT1BCQUNLKQorI2Vsc2UKKyNkZWZpbmUgSVNMT09QQkFDSyhuYW1lLCBmbGFncykgKChuYW1lKVswXSA9PSAnbCcgJiYgKG5hbWUpWzFdID09ICdvJyAmJiBcCisgICAgKGlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKChuYW1lKVsyXSkpIHx8IChuYW1lKVsyXSA9PSAnXDAnKSkKKyNlbmRpZgorCitzdHJ1Y3Qgc29ja2FkZHIgKgorZHVwX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqc2EsIHNpemVfdCBzYV9sZW5ndGgpCit7CisJc3RydWN0IHNvY2thZGRyICpuZXdzYTsKKworCWlmICgobmV3c2EgPSBtYWxsb2Moc2FfbGVuZ3RoKSkgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwlyZXR1cm4gKG1lbWNweShuZXdzYSwgc2EsIHNhX2xlbmd0aCkpOworfQorCitzdGF0aWMgaW50CitnZXRfaW5zdGFuY2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBjaGFyICpjcCwgKmVuZGNwOworCWludCBuOworCisJaWYgKHN0cmNtcChuYW1lLCAiYW55IikgPT0gMCkgeworCQkvKgorCQkgKiBHaXZlIHRoZSAiYW55IiBkZXZpY2UgYW4gYXJ0aWZpY2lhbGx5IGhpZ2ggaW5zdGFuY2UKKwkJICogbnVtYmVyLCBzbyBpdCBzaG93cyB1cCBhZnRlciBhbGwgb3RoZXIgbm9uLWxvb3BiYWNrCisJCSAqIGludGVyZmFjZXMuCisJCSAqLworCQlyZXR1cm4gSU5UX01BWDsKKwl9CisKKwllbmRjcCA9IG5hbWUgKyBzdHJsZW4obmFtZSk7CisJZm9yIChjcCA9IG5hbWU7IGNwIDwgZW5kY3AgJiYgIWlzZGlnaXQoKHVuc2lnbmVkIGNoYXIpKmNwKTsgKytjcCkKKwkJY29udGludWU7CisKKwlpZiAoaXNkaWdpdCgodW5zaWduZWQgY2hhcikqY3ApKQorCQluID0gYXRvaShjcCk7CisJZWxzZQorCQluID0gMDsKKwlyZXR1cm4gKG4pOworfQorCitpbnQKK2FkZF9vcl9maW5kX2lmKHBjYXBfaWZfdCAqKmN1cmRldl9yZXQsIHBjYXBfaWZfdCAqKmFsbGRldnMsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgdV9pbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLCBjaGFyICplcnJidWYpCit7CisJcGNhcF90ICpwOworCXBjYXBfaWZfdCAqY3VyZGV2LCAqcHJldmRldiwgKm5leHRkZXY7CisJaW50IHRoaXNfaW5zdGFuY2U7CisJY2hhciBvcGVuX2VycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKworCS8qCisJICogSXMgdGhlcmUgYWxyZWFkeSBhbiBlbnRyeSBpbiB0aGUgbGlzdCBmb3IgdGhpcyBpbnRlcmZhY2U/CisJICovCisJZm9yIChjdXJkZXYgPSAqYWxsZGV2czsgY3VyZGV2ICE9IE5VTEw7IGN1cmRldiA9IGN1cmRldi0+bmV4dCkgeworCQlpZiAoc3RyY21wKG5hbWUsIGN1cmRldi0+bmFtZSkgPT0gMCkKKwkJCWJyZWFrOwkvKiB5ZXMsIHdlIGZvdW5kIGl0ICovCisJfQorCisJaWYgKGN1cmRldiA9PSBOVUxMKSB7CisJCS8qCisJCSAqIE5vLCB3ZSBkaWRuJ3QgZmluZCBpdC4KKwkJICoKKwkJICogQ2FuIHdlIG9wZW4gdGhpcyBpbnRlcmZhY2UgZm9yIGxpdmUgY2FwdHVyZT8KKwkJICoKKwkJICogV2UgZG8gdGhpcyBjaGVjayBzbyB0aGF0IGludGVyZmFjZXMgdGhhdCBhcmUKKwkJICogc3VwcGxpZWQgYnkgdGhlIGludGVyZmFjZSBlbnVtZXJhdGlvbiBtZWNoYW5pc20KKwkJICogd2UncmUgdXNpbmcgYnV0IHRoYXQgZG9uJ3Qgc3VwcG9ydCBwYWNrZXQgY2FwdHVyZQorCQkgKiBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGxpc3QuICBMb29wYmFjayBpbnRlcmZhY2VzCisJCSAqIG9uIFNvbGFyaXMgYXJlIGFuIGV4YW1wbGUgb2YgdGhpczsgd2UgZG9uJ3QganVzdAorCQkgKiBvbWl0IGxvb3BiYWNrIGludGVyZmFjZXMgb24gYWxsIHBsYXRmb3JtcyBiZWNhdXNlCisJCSAqIHlvdSAqY2FuKiBjYXB0dXJlIG9uIGxvb3BiYWNrIGludGVyZmFjZXMgb24gc29tZQorCQkgKiBPU2VzLgorCQkgKgorCQkgKiBPbiBPUyBYLCB3ZSBkb24ndCBkbyB0aGlzIGNoZWNrIGlmIHRoZSBkZXZpY2UKKwkJICogbmFtZSBiZWdpbnMgd2l0aCAid2x0IjsgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucworCQkgKiBvZiBPUyBYIG9mZmVyIG1vbml0b3IgbW9kZSBjYXB0dXJpbmcgYnkgaGF2aW5nCisJCSAqIGEgc2VwYXJhdGUgIm1vbml0b3IgbW9kZSIgZGV2aWNlIGZvciBlYWNoIHdpcmVsZXNzCisJCSAqIGFkYXB0ZXIsIHJhdGhlciB0aGFuIGJ5IGltcGxlbWVudGluZyB0aGUgaW9jdGxzCisJCSAqIHRoYXQge0ZyZWUsTmV0LE9wZW4sRHJhZ29uRmx5fUJTRCBwcm92aWRlLgorCQkgKiBPcGVuaW5nIHRoYXQgZGV2aWNlIHB1dHMgdGhlIGFkYXB0ZXIgaW50byBtb25pdG9yCisJCSAqIG1vZGUsIHdoaWNoLCBhdCBsZWFzdCBmb3Igc29tZSBhZGFwdGVycywgY2F1c2VzCisJCSAqIHRoZW0gdG8gZGVhc3NvY2lhdGUgZnJvbSB0aGUgbmV0d29yayB3aXRoIHdoaWNoCisJCSAqIHRoZXkncmUgYXNzb2NpYXRlZC4KKwkJICoKKwkJICogSW5zdGVhZCwgd2UgdHJ5IHRvIG9wZW4gdGhlIGNvcnJlc3BvbmRpbmcgImVuIgorCQkgKiBkZXZpY2UgKHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIHdpdGgsIGZvciB1c2VycworCQkgKiB3aXRob3V0IHN1ZmZpY2llbnQgcHJpdmlsZWdlIHRvIG9wZW4gY2FwdHVyZQorCQkgKiBkZXZpY2VzLCBhIGxpc3Qgb2YgYWRhcHRlcnMgdGhhdCBvbmx5IGluY2x1ZGVzCisJCSAqIHRoZSB3bHQgZGV2aWNlcykuCisJCSAqLworI2lmZGVmIF9fQVBQTEVfXworCQlpZiAoc3RybmNtcChuYW1lLCAid2x0IiwgMykgPT0gMCkgeworCQkJY2hhciAqZW5fbmFtZTsKKwkJCXNpemVfdCBlbl9uYW1lX2xlbjsKKworCQkJLyoKKwkJCSAqIFRyeSB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlICJlbiIKKwkJCSAqIGRldmljZSdzIG5hbWUuCisJCQkgKi8KKwkJCWVuX25hbWVfbGVuID0gc3RybGVuKG5hbWUpIC0gMTsKKwkJCWVuX25hbWUgPSBtYWxsb2MoZW5fbmFtZV9sZW4gKyAxKTsKKwkJCWlmIChlbl9uYW1lID09IE5VTEwpIHsKKwkJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJc3RyY3B5KGVuX25hbWUsICJlbiIpOworCQkJc3RyY2F0KGVuX25hbWUsIG5hbWUgKyAzKTsKKwkJCXAgPSBwY2FwX29wZW5fbGl2ZShlbl9uYW1lLCA2OCwgMCwgMCwgb3Blbl9lcnJidWYpOworCQkJZnJlZShlbl9uYW1lKTsKKwkJfSBlbHNlCisjZW5kaWYgLyogX19BUFBMRSAqLworCQlwID0gcGNhcF9vcGVuX2xpdmUobmFtZSwgNjgsIDAsIDAsIG9wZW5fZXJyYnVmKTsKKwkJaWYgKHAgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIE5vLiAgRG9uJ3QgYm90aGVyIGluY2x1ZGluZyBpdC4KKwkJCSAqIERvbid0IHRyZWF0IHRoaXMgYXMgYW4gZXJyb3IsIHRob3VnaC4KKwkJCSAqLworCQkJKmN1cmRldl9yZXQgPSBOVUxMOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlwY2FwX2Nsb3NlKHApOworCisJCS8qCisJCSAqIFllcywgd2UgY2FuIG9wZW4gaXQuCisJCSAqIEFsbG9jYXRlIGEgbmV3IGVudHJ5LgorCQkgKi8KKwkJY3VyZGV2ID0gbWFsbG9jKHNpemVvZihwY2FwX2lmX3QpKTsKKwkJaWYgKGN1cmRldiA9PSBOVUxMKSB7CisJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCisJCS8qCisJCSAqIEZpbGwgaW4gdGhlIGVudHJ5LgorCQkgKi8KKwkJY3VyZGV2LT5uZXh0ID0gTlVMTDsKKwkJY3VyZGV2LT5uYW1lID0gc3RyZHVwKG5hbWUpOworCQlpZiAoY3VyZGV2LT5uYW1lID09IE5VTEwpIHsKKwkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZyZWUoY3VyZGV2KTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCWlmIChkZXNjcmlwdGlvbiAhPSBOVUxMKSB7CisJCQkvKgorCQkJICogV2UgaGF2ZSBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIGludGVyZmFjZS4KKwkJCSAqLworCQkJY3VyZGV2LT5kZXNjcmlwdGlvbiA9IHN0cmR1cChkZXNjcmlwdGlvbik7CisJCQlpZiAoY3VyZGV2LT5kZXNjcmlwdGlvbiA9PSBOVUxMKSB7CisJCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlmcmVlKGN1cmRldi0+bmFtZSk7CisJCQkJZnJlZShjdXJkZXYpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGRvbid0LgorCQkJICovCisJCQljdXJkZXYtPmRlc2NyaXB0aW9uID0gTlVMTDsKKwkJfQorCQljdXJkZXYtPmFkZHJlc3NlcyA9IE5VTEw7CS8qIGxpc3Qgc3RhcnRzIG91dCBhcyBlbXB0eSAqLworCQljdXJkZXYtPmZsYWdzID0gMDsKKwkJaWYgKElTTE9PUEJBQ0sobmFtZSwgZmxhZ3MpKQorCQkJY3VyZGV2LT5mbGFncyB8PSBQQ0FQX0lGX0xPT1BCQUNLOworCisJCS8qCisJCSAqIEFkZCBpdCB0byB0aGUgbGlzdCwgaW4gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uLgorCQkgKiBGaXJzdCwgZ2V0IHRoZSBpbnN0YW5jZSBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UuCisJCSAqLworCQl0aGlzX2luc3RhbmNlID0gZ2V0X2luc3RhbmNlKG5hbWUpOworCisJCS8qCisJCSAqIE5vdyBsb29rIGZvciB0aGUgbGFzdCBpbnRlcmZhY2Ugd2l0aCBhbiBpbnN0YW5jZSBudW1iZXIKKwkJICogbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBuZXcgaW50ZXJmYWNlJ3MgaW5zdGFuY2UKKwkJICogbnVtYmVyIC0gZXhjZXB0IHRoYXQgbm9uLWxvb3BiYWNrIGludGVyZmFjZXMgYXJlCisJCSAqIGFyYml0cmFyaWx5IHRyZWF0ZWQgYXMgaGF2aW5nIGludGVyZmFjZSBudW1iZXJzIGxlc3MKKwkJICogdGhhbiB0aG9zZSBvZiBsb29wYmFjayBpbnRlcmZhY2VzLCBzbyB0aGUgbG9vcGJhY2sKKwkJICogaW50ZXJmYWNlcyBhcmUgcHV0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisJCSAqCisJCSAqIFdlIHN0YXJ0IHdpdGggInByZXZkZXYiIGJlaW5nIE5VTEwsIG1lYW5pbmcgd2UncmUgYmVmb3JlCisJCSAqIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBsaXN0LgorCQkgKi8KKwkJcHJldmRldiA9IE5VTEw7CisJCWZvciAoOzspIHsKKwkJCS8qCisJCQkgKiBHZXQgdGhlIGludGVyZmFjZSBhZnRlciB0aGlzIG9uZS4KKwkJCSAqLworCQkJaWYgKHByZXZkZXYgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIG5leHQgZWxlbWVudCBpcyB0aGUgZmlyc3QgZWxlbWVudC4KKwkJCQkgKi8KKwkJCQluZXh0ZGV2ID0gKmFsbGRldnM7CisJCQl9IGVsc2UKKwkJCQluZXh0ZGV2ID0gcHJldmRldi0+bmV4dDsKKworCQkJLyoKKwkJCSAqIEFyZSB3ZSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0PworCQkJICovCisJCQlpZiAobmV4dGRldiA9PSBOVUxMKSB7CisJCQkJLyoKKwkJCQkgKiBZZXMgLSB3ZSBoYXZlIHRvIHB1dCB0aGUgbmV3IGVudHJ5CisJCQkJICogYWZ0ZXIgInByZXZkZXYiLgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogSXMgdGhlIG5ldyBpbnRlcmZhY2UgYSBub24tbG9vcGJhY2sgaW50ZXJmYWNlCisJCQkgKiBhbmQgdGhlIG5leHQgaW50ZXJmYWNlIGEgbG9vcGJhY2sgaW50ZXJmYWNlPworCQkJICovCisJCQlpZiAoIShjdXJkZXYtPmZsYWdzICYgUENBUF9JRl9MT09QQkFDSykgJiYKKwkJCSAgICAobmV4dGRldi0+ZmxhZ3MgJiBQQ0FQX0lGX0xPT1BCQUNLKSkgeworCQkJCS8qCisJCQkJICogWWVzLCB3ZSBzaG91bGQgcHV0IHRoZSBuZXcgZW50cnkKKwkJCQkgKiBiZWZvcmUgIm5leHRkZXYiLCBpLmUuIGFmdGVyICJwcmV2ZGV2Ii4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElzIHRoZSBuZXcgaW50ZXJmYWNlJ3MgaW5zdGFuY2UgbnVtYmVyIGxlc3MKKwkJCSAqIHRoYW4gdGhlIG5leHQgaW50ZXJmYWNlJ3MgaW5zdGFuY2UgbnVtYmVyLAorCQkJICogYW5kIGlzIGl0IHRoZSBjYXNlIHRoYXQgdGhlIG5ldyBpbnRlcmZhY2UgaXMgYQorCQkJICogbm9uLWxvb3BiYWNrIGludGVyZmFjZSBvciB0aGUgbmV4dCBpbnRlcmZhY2UgaXMKKwkJCSAqIGEgbG9vcGJhY2sgaW50ZXJmYWNlPworCQkJICoKKwkJCSAqIChUaGUgZ29hbCBvZiBib3RoIGxvb3BiYWNrIHRlc3RzIGlzIHRvIG1ha2UKKwkJCSAqIHN1cmUgdGhhdCB3ZSBuZXZlciBwdXQgYSBsb29wYmFjayBpbnRlcmZhY2UKKwkJCSAqIGJlZm9yZSBhbnkgbm9uLWxvb3BiYWNrIGludGVyZmFjZSBhbmQgdGhhdCB3ZQorCQkJICogYWx3YXlzIHB1dCBhIG5vbi1sb29wYmFjayBpbnRlcmZhY2UgYmVmb3JlIGFsbAorCQkJICogbG9vcGJhY2sgaW50ZXJmYWNlcy4pCisJCQkgKi8KKwkJCWlmICh0aGlzX2luc3RhbmNlIDwgZ2V0X2luc3RhbmNlKG5leHRkZXYtPm5hbWUpICYmCisJCQkgICAgKCEoY3VyZGV2LT5mbGFncyAmIFBDQVBfSUZfTE9PUEJBQ0spIHx8CisJCQkgICAgICAgKG5leHRkZXYtPmZsYWdzICYgUENBUF9JRl9MT09QQkFDSykpKSB7CisJCQkJLyoKKwkJCQkgKiBZZXMgLSB3ZSBzaG91bGQgcHV0IHRoZSBuZXcgZW50cnkKKwkJCQkgKiBiZWZvcmUgIm5leHRkZXYiLCBpLmUuIGFmdGVyICJwcmV2ZGV2Ii4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKworCQkJcHJldmRldiA9IG5leHRkZXY7CisJCX0KKworCQkvKgorCQkgKiBJbnNlcnQgYmVmb3JlICJuZXh0ZGV2Ii4KKwkJICovCisJCWN1cmRldi0+bmV4dCA9IG5leHRkZXY7CisKKwkJLyoKKwkJICogSW5zZXJ0IGFmdGVyICJwcmV2ZGV2IiAtIHVubGVzcyAicHJldmRldiIgaXMgbnVsbCwKKwkJICogaW4gd2hpY2ggY2FzZSB0aGlzIGlzIHRoZSBmaXJzdCBpbnRlcmZhY2UuCisJCSAqLworCQlpZiAocHJldmRldiA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgZmlyc3QgaW50ZXJmYWNlLiAgUGFzcyBiYWNrIGEKKwkJCSAqIHBvaW50ZXIgdG8gaXQsIGFuZCBwdXQgImN1cmRldiIgYmVmb3JlCisJCQkgKiAibmV4dGRldiIuCisJCQkgKi8KKwkJCSphbGxkZXZzID0gY3VyZGV2OworCQl9IGVsc2UKKwkJCXByZXZkZXYtPm5leHQgPSBjdXJkZXY7CisJfQorCisJKmN1cmRldl9yZXQgPSBjdXJkZXY7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFhYWCAtIG9uIEZyZWVCU0RzIHRoYXQgc3VwcG9ydCBpdCwgc2hvdWxkIGl0IGdldCB0aGUgc3lzY3RsIG5hbWVkCisgKiAiZGV2LnthZGFwdGVyIGZhbWlseSBuYW1lfS57YWRhcHRlciB1bml0fS4lZGVzYyIgdG8gZ2V0IGEgZGVzY3JpcHRpb24KKyAqIG9mIHRoZSBhZGFwdGVyPyAgTm90ZSB0aGF0ICJkZXYuYW4uMC4lZGVzYyIgaXMgIkFpcm9uZXQgUEM0NTAwL1BDNDgwMCIKKyAqIHdpdGggbXkgQ2lzY28gMzUwIGNhcmQsIHNvIHRoZSBuYW1lIGlzbid0IGVudGlyZWx5IGRlc2NyaXB0aXZlLiAgVGhlCisgKiAiZGV2LmFuLjAuJXBucGluZm8iIGhhcyBhIGJldHRlciBkZXNjcmlwdGlvbiwgYWx0aG91Z2ggb25lIG1pZ2h0IGFyZ3VlCisgKiB0aGF0IHRoZSBwcm9ibGVtIGlzIHJlYWxseSBhIGRyaXZlciBidWcgLSBpZiBpdCBjYW4gZmluZCBvdXQgdGhhdCBpdCdzCisgKiBhIENpc2NvIDM0MCBvciAzNTAsIHJhdGhlciB0aGFuIGFuIG9sZCBBaXJvbmV0IGNhcmQsIGl0IHNob3VsZCB1c2UKKyAqIHRoYXQgaW4gdGhlIGRlc2NyaXB0aW9uLgorICoKKyAqIERvIE5ldEJTRCwgRHJhZ29uZmx5QlNELCBvciBPcGVuQlNEIHN1cHBvcnQgdGhpcyBhcyB3ZWxsPyAgRnJlZUJTRAorICogYW5kIE9wZW5CU0QgbGV0IHlvdSBnZXQgYSBkZXNjcmlwdGlvbiwgYnV0IGl0J3Mgbm90IGdlbmVyYXRlZCBieSB0aGUgT1MsCisgKiBpdCdzIHNldCB3aXRoIGFub3RoZXIgaW9jdGwgdGhhdCBpZmNvbmZpZyBzdXBwb3J0czsgd2UgdXNlIHRoYXQgdG8gZ2V0CisgKiBhIGRlc2NyaXB0aW9uIGluIEZyZWVCU0QgYW5kIE9wZW5CU0QsIGJ1dCBpZiB0aGVyZSBpcyBubyBzdWNoCisgKiBkZXNjcmlwdGlvbiBhdmFpbGFibGUsIGl0IHN0aWxsIG1pZ2h0IGJlIG5pY2UgdG8gZ2V0IHNvbWUgZGVzY3JpcHRpb24KKyAqIHN0cmluZyBiYXNlZCBvbiB0aGUgZGV2aWNlIHR5cGUgb3Igc29tZXRoaW5nIHN1Y2ggYXMgdGhhdC4KKyAqCisgKiBJbiBPUyBYLCB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gZnJhbWV3b3JrIGNhbiBhcHBhcmVudGx5IHJldHVybgorICogbmFtZXMgaW4gMTAuNCBhbmQgbGF0ZXIuCisgKgorICogSXQgYWxzbyBhcHBlYXJzIHRoYXQgZnJlZWRlc2t0b3Aub3JnJ3MgSEFMIG9mZmVycyBhbiAiaW5mby5wcm9kdWN0IgorICogc3RyaW5nLCBidXQgdGhlIEhBTCBzcGVjaWZpY2F0aW9uIHNheXMgaXQgInNob3VsZCBub3QgYmUgdXNlZCBpbiBhbnkKKyAqIFVJIiBhbmQgInN1YnN5c3RlbS9jYXBhYmlsaXR5IHNwZWNpZmljIHByb3BlcnRpZXMiIHNob3VsZCBiZSB1c2VkCisgKiBpbnN0ZWFkIGFuZCwgaW4gYW55IGNhc2UsIEkgdGhpbmsgSEFMIGlzIGJlaW5nIGRlcHJlY2F0ZWQgaW4KKyAqIGZhdm9yIG9mIG90aGVyIHN0dWZmIHN1Y2ggYXMgRGV2aWNlS2l0LiAgRGV2aWNlS2l0IGRvZXNuJ3QgYXBwZWFyCisgKiB0byBoYXZlIGFueSBvYnZpb3VzIHByb2R1Y3QgaW5mb3JtYXRpb24gZm9yIGRldmljZXMsIGJ1dCBtYXliZQorICogSSBoYXZlbid0IGxvb2tlZCBoYXJkIGVub3VnaC4KKyAqCisgKiBVc2luZyB0aGUgU3lzdGVtIENvbmZpZ3VyYXRpb24gZnJhbWV3b3JrLCBvciBIQUwsIG9yIERldmljZUtpdCwgb3IKKyAqIHdoYXRldmVyLCB3b3VsZCByZXF1aXJlIHRoYXQgbGlicGNhcCBhcHBsaWNhdGlvbnMgYmUgbGlua2VkIHdpdGgKKyAqIHRoZSBmcmFtZXdvcmtzL2xpYnJhcmllcyBpbiBxdWVzdGlvbi4gIFRoYXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbQorICogZm9yIHByb2dyYW1zIGxpbmtpbmcgd2l0aCB0aGUgc2hhcmVkIHZlcnNpb24gb2YgbGlicGNhcCAodW5sZXNzCisgKiB5b3UncmUgcnVubmluZyBvbiBBSVggLSB3aGljaCBJIHRoaW5rIGlzIHRoZSBvbmx5IFVOKlggdGhhdCBkb2Vzbid0CisgKiBzdXBwb3J0IGxpbmtpbmcgYSBzaGFyZWQgbGlicmFyeSB3aXRoIG90aGVyIGxpYnJhcmllcyBvbiB3aGljaCBpdAorICogZGVwZW5kcywgYW5kIGhhdmluZyBhbiBleGVjdXRhYmxlIGxpbmtlZCBvbmx5IHdpdGggdGhlIGZpcnN0IHNoYXJlZAorICogbGlicmFyeSBhdXRvbWF0aWNhbGx5IHBpY2sgdXAgdGhlIG90aGVyIGxpYnJhcmllcyB3aGVuIHN0YXJ0ZWQgLQorICogYW5kIHVzaW5nIEhBTCBvciB3aGF0ZXZlcikuICBQcm9ncmFtcyBsaW5rZWQgd2l0aCB0aGUgc3RhdGljCisgKiB2ZXJzaW9uIG9mIGxpYnBjYXAgd291bGQgaGF2ZSB0byB1c2UgcGNhcC1jb25maWcgd2l0aCB0aGUgLS1zdGF0aWMKKyAqIGZsYWcgaW4gb3JkZXIgdG8gZ2V0IHRoZSByaWdodCBsaW5rZXIgZmxhZ3MgaW4gb3JkZXIgdG8gcGljayB1cAorICogdGhlIGFkZGl0aW9uYWwgbGlicmFyaWVzL2ZyYW1ld29ya3M7IHRob3NlIHByb2dyYW1zIG5lZWQgdGhhdCBhbnl3YXkKKyAqIGZvciBsaWJwY2FwIDEuMSBhbmQgYmV5b25kIG9uIExpbnV4LCBhcywgYnkgZGVmYXVsdCwgaXQgcmVxdWlyZXMKKyAqIC1sbmwuCisgKgorICogRG8gYW55IG90aGVyIFVOKlhlcywgb3IgZGVza3RvcCBlbnZpcm9ubWVudHMgc3VwcG9ydCBnZXR0aW5nIGEKKyAqIGRlc2NyaXB0aW9uPworICovCitpbnQKK2FkZF9hZGRyX3RvX2lmbGlzdChwY2FwX2lmX3QgKiphbGxkZXZzLCBjb25zdCBjaGFyICpuYW1lLCB1X2ludCBmbGFncywKKyAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNpemVfdCBhZGRyX3NpemUsCisgICAgc3RydWN0IHNvY2thZGRyICpuZXRtYXNrLCBzaXplX3QgbmV0bWFza19zaXplLAorICAgIHN0cnVjdCBzb2NrYWRkciAqYnJvYWRhZGRyLCBzaXplX3QgYnJvYWRhZGRyX3NpemUsCisgICAgc3RydWN0IHNvY2thZGRyICpkc3RhZGRyLCBzaXplX3QgZHN0YWRkcl9zaXplLAorICAgIGNoYXIgKmVycmJ1ZikKK3sKKwlwY2FwX2lmX3QgKmN1cmRldjsKKwljaGFyICpkZXNjcmlwdGlvbiA9IE5VTEw7CisJcGNhcF9hZGRyX3QgKmN1cmFkZHIsICpwcmV2YWRkciwgKm5leHRhZGRyOworI2lmZGVmIFNJT0NHSUZERVNDUgorCWludCBzOworCXN0cnVjdCBpZnJlcSBpZnJkZXNjOworI2lmbmRlZiBJRkRFU0NSU0laRQorCXNpemVfdCBkZXNjcmxlbiA9IDY0OworI2Vsc2UKKwlzaXplX3QgZGVzY3JsZW4gPSBJRkRFU0NSU0laRTsKKyNlbmRpZiAvKiBJRkRFU0NSU0laRSAqLworI2VuZGlmIC8qIFNJT0NHSUZERVNDUiAqLworCisjaWZkZWYgU0lPQ0dJRkRFU0NSCisJLyoKKwkgKiBHZXQgdGhlIGRlc2NyaXB0aW9uIGZvciB0aGUgaW50ZXJmYWNlLgorCSAqLworCW1lbXNldCgmaWZyZGVzYywgMCwgc2l6ZW9mIGlmcmRlc2MpOworCXN0cmxjcHkoaWZyZGVzYy5pZnJfbmFtZSwgbmFtZSwgc2l6ZW9mIGlmcmRlc2MuaWZyX25hbWUpOworCXMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHMgPj0gMCkgeworI2lmZGVmIF9fRnJlZUJTRF9fCisJCS8qCisJCSAqIE9uIEZyZWVCU0QsIGlmIHRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCBmb3IgdGhlCisJCSAqIGRlc2NyaXB0aW9uLCB0aGUgaW9jdGwgc3VjY2VlZHMsIGJ1dCB0aGUgZGVzY3JpcHRpb24KKwkJICogaXNuJ3QgY29waWVkLCBpZnJfYnVmZmVyLmxlbmd0aCBpcyBzZXQgdG8gdGhlIGRlc2NyaXB0aW9uCisJCSAqIGxlbmd0aCwgYW5kIGlmcl9idWZmZXIuYnVmZmVyIGlzIHNldCB0byBOVUxMLgorCQkgKi8KKwkJZm9yICg7OykgeworCQkJZnJlZShkZXNjcmlwdGlvbik7CisJCQlpZiAoKGRlc2NyaXB0aW9uID0gbWFsbG9jKGRlc2NybGVuKSkgIT0gTlVMTCkgeworCQkJCWlmcmRlc2MuaWZyX2J1ZmZlci5idWZmZXIgPSBkZXNjcmlwdGlvbjsKKwkJCQlpZnJkZXNjLmlmcl9idWZmZXIubGVuZ3RoID0gZGVzY3JsZW47CisJCQkJaWYgKGlvY3RsKHMsIFNJT0NHSUZERVNDUiwgJmlmcmRlc2MpID09IDApIHsKKwkJCQkJaWYgKGlmcmRlc2MuaWZyX2J1ZmZlci5idWZmZXIgPT0KKwkJCQkJICAgIGRlc2NyaXB0aW9uKQorCQkJCQkJYnJlYWs7CisJCQkJCWVsc2UKKwkJCQkJCWRlc2NybGVuID0gaWZyZGVzYy5pZnJfYnVmZmVyLmxlbmd0aDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBGYWlsZWQgdG8gZ2V0IGludGVyZmFjZSBkZXNjcmlwdGlvbi4KKwkJCQkJICovCisJCQkJCWZyZWUoZGVzY3JpcHRpb24pOworCQkJCQlkZXNjcmlwdGlvbiA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9CisjZWxzZSAvKiBfX0ZyZWVCU0RfXyAqLworCQkvKgorCQkgKiBUaGUgb25seSBvdGhlciBPUyB0aGF0IGN1cnJlbnRseSBzdXBwb3J0cworCQkgKiBTSU9DR0lGREVTQ1IgaXMgT3BlbkJTRCwgYW5kIGl0IGhhcyBubyB3YXkKKwkJICogdG8gZ2V0IHRoZSBkZXNjcmlwdGlvbiBsZW5ndGggLSBpdCdzIGNsYW1wZWQKKwkJICogdG8gYSBtYXhpbXVtIG9mIElGREVTQ1JTSVpFLgorCQkgKi8KKwkJaWYgKChkZXNjcmlwdGlvbiA9IG1hbGxvYyhkZXNjcmxlbikpICE9IE5VTEwpIHsKKwkJCWlmcmRlc2MuaWZyX2RhdGEgPSAoY2FkZHJfdClkZXNjcmlwdGlvbjsKKwkJCWlmIChpb2N0bChzLCBTSU9DR0lGREVTQ1IsICZpZnJkZXNjKSAhPSAwKSB7CisJCQkJLyoKKwkJCQkgKiBGYWlsZWQgdG8gZ2V0IGludGVyZmFjZSBkZXNjcmlwdGlvbi4KKwkJCQkgKi8KKwkJCQlmcmVlKGRlc2NyaXB0aW9uKTsKKwkJCQlkZXNjcmlwdGlvbiA9IE5VTEw7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBfX0ZyZWVCU0RfXyAqLworCQljbG9zZShzKTsKKwkJaWYgKGRlc2NyaXB0aW9uICE9IE5VTEwgJiYgc3RybGVuKGRlc2NyaXB0aW9uKSA9PSAwKSB7CisJCQlmcmVlKGRlc2NyaXB0aW9uKTsKKwkJCWRlc2NyaXB0aW9uID0gTlVMTDsKKwkJfQorCX0KKyNlbmRpZiAvKiBTSU9DR0lGREVTQ1IgKi8KKworCWlmIChhZGRfb3JfZmluZF9pZigmY3VyZGV2LCBhbGxkZXZzLCBuYW1lLCBmbGFncywgZGVzY3JpcHRpb24sCisJICAgIGVycmJ1ZikgPT0gLTEpIHsKKwkJZnJlZShkZXNjcmlwdGlvbik7CisJCS8qCisJCSAqIEVycm9yIC0gZ2l2ZSB1cC4KKwkJICovCisJCXJldHVybiAoLTEpOworCX0KKwlmcmVlKGRlc2NyaXB0aW9uKTsKKwlpZiAoY3VyZGV2ID09IE5VTEwpIHsKKwkJLyoKKwkJICogRGV2aWNlIHdhc24ndCBhZGRlZCBiZWNhdXNlIGl0IGNhbid0IGJlIG9wZW5lZC4KKwkJICogTm90IGEgZmF0YWwgZXJyb3IuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogImN1cmRldiIgaXMgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlOyBhZGQgYW4gZW50cnkgZm9yIHRoaXMKKwkgKiBhZGRyZXNzIHRvIGl0cyBsaXN0IG9mIGFkZHJlc3Nlcy4KKwkgKgorCSAqIEFsbG9jYXRlIHRoZSBuZXcgZW50cnkgYW5kIGZpbGwgaXQgaW4uCisJICovCisJY3VyYWRkciA9IG1hbGxvYyhzaXplb2YocGNhcF9hZGRyX3QpKTsKKwlpZiAoY3VyYWRkciA9PSBOVUxMKSB7CisJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwljdXJhZGRyLT5uZXh0ID0gTlVMTDsKKwlpZiAoYWRkciAhPSBOVUxMKSB7CisJCWN1cmFkZHItPmFkZHIgPSBkdXBfc29ja2FkZHIoYWRkciwgYWRkcl9zaXplKTsKKwkJaWYgKGN1cmFkZHItPmFkZHIgPT0gTlVMTCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZnJlZShjdXJhZGRyKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfSBlbHNlCisJCWN1cmFkZHItPmFkZHIgPSBOVUxMOworCisJaWYgKG5ldG1hc2sgIT0gTlVMTCkgeworCQljdXJhZGRyLT5uZXRtYXNrID0gZHVwX3NvY2thZGRyKG5ldG1hc2ssIG5ldG1hc2tfc2l6ZSk7CisJCWlmIChjdXJhZGRyLT5uZXRtYXNrID09IE5VTEwpIHsKKwkJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWlmIChjdXJhZGRyLT5hZGRyICE9IE5VTEwpCisJCQkJZnJlZShjdXJhZGRyLT5hZGRyKTsKKwkJCWZyZWUoY3VyYWRkcik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZQorCQljdXJhZGRyLT5uZXRtYXNrID0gTlVMTDsKKworCWlmIChicm9hZGFkZHIgIT0gTlVMTCkgeworCQljdXJhZGRyLT5icm9hZGFkZHIgPSBkdXBfc29ja2FkZHIoYnJvYWRhZGRyLCBicm9hZGFkZHJfc2l6ZSk7CisJCWlmIChjdXJhZGRyLT5icm9hZGFkZHIgPT0gTlVMTCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJaWYgKGN1cmFkZHItPm5ldG1hc2sgIT0gTlVMTCkKKwkJCQlmcmVlKGN1cmFkZHItPm5ldG1hc2spOworCQkJaWYgKGN1cmFkZHItPmFkZHIgIT0gTlVMTCkKKwkJCQlmcmVlKGN1cmFkZHItPmFkZHIpOworCQkJZnJlZShjdXJhZGRyKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfSBlbHNlCisJCWN1cmFkZHItPmJyb2FkYWRkciA9IE5VTEw7CisKKwlpZiAoZHN0YWRkciAhPSBOVUxMKSB7CisJCWN1cmFkZHItPmRzdGFkZHIgPSBkdXBfc29ja2FkZHIoZHN0YWRkciwgZHN0YWRkcl9zaXplKTsKKwkJaWYgKGN1cmFkZHItPmRzdGFkZHIgPT0gTlVMTCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJaWYgKGN1cmFkZHItPmJyb2FkYWRkciAhPSBOVUxMKQorCQkJCWZyZWUoY3VyYWRkci0+YnJvYWRhZGRyKTsKKwkJCWlmIChjdXJhZGRyLT5uZXRtYXNrICE9IE5VTEwpCisJCQkJZnJlZShjdXJhZGRyLT5uZXRtYXNrKTsKKwkJCWlmIChjdXJhZGRyLT5hZGRyICE9IE5VTEwpCisJCQkJZnJlZShjdXJhZGRyLT5hZGRyKTsKKwkJCWZyZWUoY3VyYWRkcik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0gZWxzZQorCQljdXJhZGRyLT5kc3RhZGRyID0gTlVMTDsKKworCS8qCisJICogRmluZCB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIGFkZHJlc3Nlcy4KKwkgKi8KKwlmb3IgKHByZXZhZGRyID0gY3VyZGV2LT5hZGRyZXNzZXM7IHByZXZhZGRyICE9IE5VTEw7IHByZXZhZGRyID0gbmV4dGFkZHIpIHsKKwkJbmV4dGFkZHIgPSBwcmV2YWRkci0+bmV4dDsKKwkJaWYgKG5leHRhZGRyID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGxpc3QuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHByZXZhZGRyID09IE5VTEwpIHsKKwkJLyoKKwkJICogVGhlIGxpc3Qgd2FzIGVtcHR5OyB0aGlzIGlzIHRoZSBmaXJzdCBtZW1iZXIuCisJCSAqLworCQljdXJkZXYtPmFkZHJlc3NlcyA9IGN1cmFkZHI7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogInByZXZhZGRyIiBpcyB0aGUgbGFzdCBtZW1iZXIgb2YgdGhlIGxpc3Q7IGFwcGVuZAorCQkgKiB0aGlzIG1lbWJlciB0byBpdC4KKwkJICovCisJCXByZXZhZGRyLT5uZXh0ID0gY3VyYWRkcjsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitpbnQKK3BjYXBfYWRkX2lmKHBjYXBfaWZfdCAqKmRldmxpc3QsIGNvbnN0IGNoYXIgKm5hbWUsIHVfaW50IGZsYWdzLAorICAgIGNvbnN0IGNoYXIgKmRlc2NyaXB0aW9uLCBjaGFyICplcnJidWYpCit7CisJcGNhcF9pZl90ICpjdXJkZXY7CisKKwlyZXR1cm4gKGFkZF9vcl9maW5kX2lmKCZjdXJkZXYsIGRldmxpc3QsIG5hbWUsIGZsYWdzLCBkZXNjcmlwdGlvbiwKKwkgICAgZXJyYnVmKSk7Cit9CisKKworLyoKKyAqIEZyZWUgYSBsaXN0IG9mIGludGVyZmFjZXMuCisgKi8KK3ZvaWQKK3BjYXBfZnJlZWFsbGRldnMocGNhcF9pZl90ICphbGxkZXZzKQoreworCXBjYXBfaWZfdCAqY3VyZGV2LCAqbmV4dGRldjsKKwlwY2FwX2FkZHJfdCAqY3VyYWRkciwgKm5leHRhZGRyOworCisJZm9yIChjdXJkZXYgPSBhbGxkZXZzOyBjdXJkZXYgIT0gTlVMTDsgY3VyZGV2ID0gbmV4dGRldikgeworCQluZXh0ZGV2ID0gY3VyZGV2LT5uZXh0OworCisJCS8qCisJCSAqIEZyZWUgYWxsIGFkZHJlc3Nlcy4KKwkJICovCisJCWZvciAoY3VyYWRkciA9IGN1cmRldi0+YWRkcmVzc2VzOyBjdXJhZGRyICE9IE5VTEw7IGN1cmFkZHIgPSBuZXh0YWRkcikgeworCQkJbmV4dGFkZHIgPSBjdXJhZGRyLT5uZXh0OworCQkJaWYgKGN1cmFkZHItPmFkZHIpCisJCQkJZnJlZShjdXJhZGRyLT5hZGRyKTsKKwkJCWlmIChjdXJhZGRyLT5uZXRtYXNrKQorCQkJCWZyZWUoY3VyYWRkci0+bmV0bWFzayk7CisJCQlpZiAoY3VyYWRkci0+YnJvYWRhZGRyKQorCQkJCWZyZWUoY3VyYWRkci0+YnJvYWRhZGRyKTsKKwkJCWlmIChjdXJhZGRyLT5kc3RhZGRyKQorCQkJCWZyZWUoY3VyYWRkci0+ZHN0YWRkcik7CisJCQlmcmVlKGN1cmFkZHIpOworCQl9CisKKwkJLyoKKwkJICogRnJlZSB0aGUgbmFtZSBzdHJpbmcuCisJCSAqLworCQlmcmVlKGN1cmRldi0+bmFtZSk7CisKKwkJLyoKKwkJICogRnJlZSB0aGUgZGVzY3JpcHRpb24gc3RyaW5nLCBpZiBhbnkuCisJCSAqLworCQlpZiAoY3VyZGV2LT5kZXNjcmlwdGlvbiAhPSBOVUxMKQorCQkJZnJlZShjdXJkZXYtPmRlc2NyaXB0aW9uKTsKKworCQkvKgorCQkgKiBGcmVlIHRoZSBpbnRlcmZhY2UuCisJCSAqLworCQlmcmVlKGN1cmRldik7CisJfQorfQorCisjaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQorCisvKgorICogUmV0dXJuIHRoZSBuYW1lIG9mIGEgbmV0d29yayBpbnRlcmZhY2UgYXR0YWNoZWQgdG8gdGhlIHN5c3RlbSwgb3IgTlVMTAorICogaWYgbm9uZSBjYW4gYmUgZm91bmQuICBUaGUgaW50ZXJmYWNlIG11c3QgYmUgY29uZmlndXJlZCB1cDsgdGhlCisgKiBsb3dlc3QgdW5pdCBudW1iZXIgaXMgcHJlZmVycmVkOyBsb29wYmFjayBpcyBpZ25vcmVkLgorICovCitjaGFyICoKK3BjYXBfbG9va3VwZGV2KGVycmJ1ZikKKwlyZWdpc3RlciBjaGFyICplcnJidWY7Cit7CisJcGNhcF9pZl90ICphbGxkZXZzOworLyogZm9yIG9sZCBCU0Qgc3lzdGVtcywgaW5jbHVkaW5nIGJzZGkzICovCisjaWZuZGVmIElGX05BTUVTSVpFCisjZGVmaW5lIElGX05BTUVTSVpFIElGTkFNU0laCisjZW5kaWYKKwlzdGF0aWMgY2hhciBkZXZpY2VbSUZfTkFNRVNJWkUgKyAxXTsKKwljaGFyICpyZXQ7CisKKwlpZiAocGNhcF9maW5kYWxsZGV2cygmYWxsZGV2cywgZXJyYnVmKSA9PSAtMSkKKwkJcmV0dXJuIChOVUxMKTsKKworCWlmIChhbGxkZXZzID09IE5VTEwgfHwgKGFsbGRldnMtPmZsYWdzICYgUENBUF9JRl9MT09QQkFDSykpIHsKKwkJLyoKKwkJICogVGhlcmUgYXJlIG5vIGRldmljZXMgb24gdGhlIGxpc3QsIG9yIHRoZSBmaXJzdCBkZXZpY2UKKwkJICogb24gdGhlIGxpc3QgaXMgYSBsb29wYmFjayBkZXZpY2UsIHdoaWNoIG1lYW5zIHRoZXJlCisJCSAqIGFyZSBubyBub24tbG9vcGJhY2sgZGV2aWNlcyBvbiB0aGUgbGlzdC4gIFRoaXMgbWVhbnMKKwkJICogd2UgY2FuJ3QgcmV0dXJuIGFueSBkZXZpY2UuCisJCSAqCisJCSAqIFhYWCAtIHdoeSBub3QgcmV0dXJuIGEgbG9vcGJhY2sgZGV2aWNlPyAgSWYgd2UgY2FuJ3QKKwkJICogY2FwdHVyZSBvbiBpdCwgaXQgd29uJ3QgYmUgb24gdGhlIGxpc3QsIGFuZCBpZiBpdCdzCisJCSAqIG9uIHRoZSBsaXN0LCB0aGVyZSBhcmVuJ3QgYW55IG5vbi1sb29wYmFjayBkZXZpY2VzLAorCQkgKiBzbyB3aHkgbm90IGp1c3Qgc3VwcGx5IGl0IGFzIHRoZSBkZWZhdWx0IGRldmljZT8KKwkJICovCisJCSh2b2lkKXN0cmxjcHkoZXJyYnVmLCAibm8gc3VpdGFibGUgZGV2aWNlIGZvdW5kIiwKKwkJICAgIFBDQVBfRVJSQlVGX1NJWkUpOworCQlyZXQgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgZGV2aWNlIG9uIHRoZSBsaXN0LgorCQkgKi8KKwkJKHZvaWQpc3RybGNweShkZXZpY2UsIGFsbGRldnMtPm5hbWUsIHNpemVvZihkZXZpY2UpKTsKKwkJcmV0ID0gZGV2aWNlOworCX0KKworCXBjYXBfZnJlZWFsbGRldnMoYWxsZGV2cyk7CisJcmV0dXJuIChyZXQpOworfQorCitpbnQKK3BjYXBfbG9va3VwbmV0KGRldmljZSwgbmV0cCwgbWFza3AsIGVycmJ1ZikKKwlyZWdpc3RlciBjb25zdCBjaGFyICpkZXZpY2U7CisJcmVnaXN0ZXIgYnBmX3VfaW50MzIgKm5ldHAsICptYXNrcDsKKwlyZWdpc3RlciBjaGFyICplcnJidWY7Cit7CisJcmVnaXN0ZXIgaW50IGZkOworCXJlZ2lzdGVyIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luNDsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJLyoKKwkgKiBUaGUgcHNldWRvLWRldmljZSAiYW55IiBsaXN0ZW5zIG9uIGFsbCBpbnRlcmZhY2VzIGFuZCB0aGVyZWZvcmUKKwkgKiBoYXMgdGhlIG5ldHdvcmsgYWRkcmVzcyBhbmQgLW1hc2sgIjAuMC4wLjAiIHRoZXJlZm9yZSBjYXRjaGluZworCSAqIGFsbCB0cmFmZmljLiBVc2luZyBOVUxMIGZvciB0aGUgaW50ZXJmYWNlIGlzIHRoZSBzYW1lIGFzICJhbnkiLgorCSAqLworCWlmICghZGV2aWNlIHx8IHN0cmNtcChkZXZpY2UsICJhbnkiKSA9PSAwCisjaWZkZWYgSEFWRV9EQUdfQVBJCisJICAgIHx8IHN0cnN0cihkZXZpY2UsICJkYWciKSAhPSBOVUxMCisjZW5kaWYKKyNpZmRlZiBIQVZFX1NFUFRFTF9BUEkKKwkgICAgfHwgc3Ryc3RyKGRldmljZSwgInNlcHRlbCIpICE9IE5VTEwKKyNlbmRpZgorI2lmZGVmIFBDQVBfU1VQUE9SVF9CVAorCSAgICB8fCBzdHJzdHIoZGV2aWNlLCAiYmx1ZXRvb3RoIikgIT0gTlVMTAorI2VuZGlmCisjaWZkZWYgUENBUF9TVVBQT1JUX1VTQgorCSAgICB8fCBzdHJzdHIoZGV2aWNlLCAidXNibW9uIikgIT0gTlVMTAorI2VuZGlmCisjaWZkZWYgSEFWRV9TTkZfQVBJCisJICAgIHx8IHN0cnN0cihkZXZpY2UsICJzbmYiKSAhPSBOVUxMCisjZW5kaWYKKwkgICAgKSB7CisJCSpuZXRwID0gKm1hc2twID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkIDwgMCkgeworCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzb2NrZXQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisjaWZkZWYgbGludXgKKwkvKiBYWFggV29yayBhcm91bmQgTGludXgga2VybmVsIGJ1ZyAqLworCWlmci5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOworI2VuZGlmCisJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIGRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCWlmIChpb2N0bChmZCwgU0lPQ0dJRkFERFIsIChjaGFyICopJmlmcikgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFQUREUk5PVEFWQUlMKSB7CisJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIiVzOiBubyBJUHY0IGFkZHJlc3MgYXNzaWduZWQiLCBkZXZpY2UpOworCQl9IGVsc2UgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJTSU9DR0lGQUREUjogJXM6ICVzIiwKKwkJCSAgICBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCQkodm9pZCljbG9zZShmZCk7CisJCXJldHVybiAoLTEpOworCX0KKwlzaW40ID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZpZnIuaWZyX2FkZHI7CisJKm5ldHAgPSBzaW40LT5zaW5fYWRkci5zX2FkZHI7CisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKyNpZmRlZiBsaW51eAorCS8qIFhYWCBXb3JrIGFyb3VuZCBMaW51eCBrZXJuZWwgYnVnICovCisJaWZyLmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisjZW5kaWYKKwkodm9pZClzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJaWYgKGlvY3RsKGZkLCBTSU9DR0lGTkVUTUFTSywgKGNoYXIgKikmaWZyKSA8IDApIHsKKwkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIlNJT0NHSUZORVRNQVNLOiAlczogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpY2xvc2UoZmQpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJKHZvaWQpY2xvc2UoZmQpOworCSptYXNrcCA9IHNpbjQtPnNpbl9hZGRyLnNfYWRkcjsKKwlpZiAoKm1hc2twID09IDApIHsKKwkJaWYgKElOX0NMQVNTQSgqbmV0cCkpCisJCQkqbWFza3AgPSBJTl9DTEFTU0FfTkVUOworCQllbHNlIGlmIChJTl9DTEFTU0IoKm5ldHApKQorCQkJKm1hc2twID0gSU5fQ0xBU1NCX05FVDsKKwkJZWxzZSBpZiAoSU5fQ0xBU1NDKCpuZXRwKSkKKwkJCSptYXNrcCA9IElOX0NMQVNTQ19ORVQ7CisJCWVsc2UgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJpbmV0IGNsYXNzIGZvciAweCV4IHVua25vd24iLCAqbmV0cCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0KKwkqbmV0cCAmPSAqbWFza3A7CisJcmV0dXJuICgwKTsKK30KKworI2VsaWYgZGVmaW5lZChXSU4zMikKKworLyoKKyAqIFJldHVybiB0aGUgbmFtZSBvZiBhIG5ldHdvcmsgaW50ZXJmYWNlIGF0dGFjaGVkIHRvIHRoZSBzeXN0ZW0sIG9yIE5VTEwKKyAqIGlmIG5vbmUgY2FuIGJlIGZvdW5kLiAgVGhlIGludGVyZmFjZSBtdXN0IGJlIGNvbmZpZ3VyZWQgdXA7IHRoZQorICogbG93ZXN0IHVuaXQgbnVtYmVyIGlzIHByZWZlcnJlZDsgbG9vcGJhY2sgaXMgaWdub3JlZC4KKyAqLworY2hhciAqCitwY2FwX2xvb2t1cGRldihlcnJidWYpCisJcmVnaXN0ZXIgY2hhciAqZXJyYnVmOworeworCURXT1JEIGR3VmVyc2lvbjsKKwlEV09SRCBkd1dpbmRvd3NNYWpvclZlcnNpb247CisJZHdWZXJzaW9uID0gR2V0VmVyc2lvbigpOwkvKiBnZXQgdGhlIE9TIHZlcnNpb24gKi8KKwlkd1dpbmRvd3NNYWpvclZlcnNpb24gPSAoRFdPUkQpKExPQllURShMT1dPUkQoZHdWZXJzaW9uKSkpOworCQorCWlmIChkd1ZlcnNpb24gPj0gMHg4MDAwMDAwMCAmJiBkd1dpbmRvd3NNYWpvclZlcnNpb24gPj0gNCkgeworCQkvKgorCQkgKiBXaW5kb3dzIDk1LCA5OCwgTUUuCisJCSAqLworCQlVTE9ORyBOYW1lTGVuZ3RoID0gODE5MjsKKwkJc3RhdGljIGNoYXIgQWRhcHRlcnNOYW1lWzgxOTJdOworCQkKKwkJaWYgKFBhY2tldEdldEFkYXB0ZXJOYW1lcyhBZGFwdGVyc05hbWUsJk5hbWVMZW5ndGgpICkKKwkJCXJldHVybiAoQWRhcHRlcnNOYW1lKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2luZG93cyBOVCAoTlQgNC4wLCBXMkssIFdYUCkuIENvbnZlcnQgdGhlIG5hbWVzIHRvIFVOSUNPREUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKwkJICovCisJCVVMT05HIE5hbWVMZW5ndGggPSA4MTkyOworCQlzdGF0aWMgV0NIQVIgQWRhcHRlcnNOYW1lWzgxOTJdOworCQljaGFyICp0QXN0cjsKKwkJV0NIQVIgKnRVc3RyOworCQlXQ0hBUiAqVEFkYXB0ZXJzTmFtZSA9IChXQ0hBUiopbWFsbG9jKDgxOTIgKiBzaXplb2YoV0NIQVIpKTsKKwkJaW50IE5BZGFwdHMgPSAwOworCisJCWlmKFRBZGFwdGVyc05hbWUgPT0gTlVMTCkKKwkJeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlpZiAoICFQYWNrZXRHZXRBZGFwdGVyTmFtZXMoKFBUU1RSKVRBZGFwdGVyc05hbWUsJk5hbWVMZW5ndGgpICkKKwkJeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSJQYWNrZXRHZXRBZGFwdGVyTmFtZXM6ICVzIiwKKwkJCQlwY2FwX3dpbjMyc3RyZXJyb3IoKSk7CisJCQlmcmVlKFRBZGFwdGVyc05hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCisJCXRBc3RyID0gKGNoYXIqKVRBZGFwdGVyc05hbWU7CisJCXRVc3RyID0gKFdDSEFSKilBZGFwdGVyc05hbWU7CisKKwkJLyoKKwkJICogQ29udmVydCBhbmQgY29weSB0aGUgZGV2aWNlIG5hbWVzCisJCSAqLworCQl3aGlsZShzc2NhbmYodEFzdHIsICIlUyIsIHRVc3RyKSA+IDApCisJCXsKKwkJCXRBc3RyICs9IHN0cmxlbih0QXN0cikgKyAxOworCQkJdFVzdHIgKz0gd2NzbGVuKHRVc3RyKSArIDE7CisJCQlOQWRhcHRzICsrOworCQl9CisKKwkJdEFzdHIrKzsKKwkJKnRVc3RyID0gMDsKKwkJdFVzdHIrKzsKKworCQkvKgorCQkgKiBDb3B5IHRoZSBkZXNjcmlwdGlvbnMKKwkJICovCisJCXdoaWxlKE5BZGFwdHMtLSkKKwkJeworCQkJY2hhciogdG1wID0gKGNoYXIqKXRVc3RyOworCQkJc3RyY3B5KHRtcCwgdEFzdHIpOworCQkJdG1wICs9IHN0cmxlbih0QXN0cikgKyAxOworCQkJdFVzdHIgPSAoV0NIQVIqKXRtcDsKKwkJCXRBc3RyICs9IHN0cmxlbih0QXN0cikgKyAxOworCQl9CisKKwkJZnJlZShUQWRhcHRlcnNOYW1lKTsKKwkJcmV0dXJuIChjaGFyICopKEFkYXB0ZXJzTmFtZSk7CisJfQkKK30KKworCitpbnQKK3BjYXBfbG9va3VwbmV0KGRldmljZSwgbmV0cCwgbWFza3AsIGVycmJ1ZikKKwlyZWdpc3RlciBjb25zdCBjaGFyICpkZXZpY2U7CisJcmVnaXN0ZXIgYnBmX3VfaW50MzIgKm5ldHAsICptYXNrcDsKKwlyZWdpc3RlciBjaGFyICplcnJidWY7Cit7CisJLyogCisJICogV2UgbmVlZCBvbmx5IHRoZSBmaXJzdCBJUHY0IGFkZHJlc3MsIHNvIHdlIG11c3Qgc2NhbiB0aGUgYXJyYXkgcmV0dXJuZWQgYnkgUGFja2V0R2V0TmV0SW5mbygpCisJICogaW4gb3JkZXIgdG8gc2tpcCBub24gSVB2NCAoaS5lLiBJUHY2IGFkZHJlc3NlcykKKwkgKi8KKwlucGZfaWZfYWRkciBpZl9hZGRyc1tNQVhfTkVUV09SS19BRERSRVNTRVNdOworCUxPTkcgaWZfYWRkcl9zaXplID0gMTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnRfYWRkcjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghUGFja2V0R2V0TmV0SW5mb0V4KCh2b2lkICopZGV2aWNlLCBpZl9hZGRycywgJmlmX2FkZHJfc2l6ZSkpIHsKKwkJKm5ldHAgPSAqbWFza3AgPSAwOworCQlyZXR1cm4gKDApOworCX0KKworCWZvcihpPTA7IGk8TUFYX05FVFdPUktfQUREUkVTU0VTOyBpKyspCisJeworCQlpZihpZl9hZGRyc1tpXS5JUEFkZHJlc3Muc3NfZmFtaWx5ID09IEFGX0lORVQpCisJCXsKKwkJCXRfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihpZl9hZGRyc1tpXS5JUEFkZHJlc3MpOworCQkJKm5ldHAgPSB0X2FkZHItPnNpbl9hZGRyLlNfdW4uU19hZGRyOworCQkJdF9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKGlmX2FkZHJzW2ldLlN1Ym5ldE1hc2spOworCQkJKm1hc2twID0gdF9hZGRyLT5zaW5fYWRkci5TX3VuLlNfYWRkcjsKKworCQkJKm5ldHAgJj0gKm1hc2twOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQkJCQorCX0KKworCSpuZXRwID0gKm1hc2twID0gMDsKKwlyZXR1cm4gKDApOworfQorCisjZW5kaWYgLyogIVdJTjMyICYmICFNU0RPUyAqLwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9pbnN0YWxsLXNoIGIvbGlicGNhcC0xLjMuMC9pbnN0YWxsLXNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmViYzY2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2luc3RhbGwtc2gKQEAgLTAsMCArMSwyNTAgQEAKKyMhIC9iaW4vc2gKKyMKKyMgaW5zdGFsbCAtIGluc3RhbGwgYSBwcm9ncmFtLCBzY3JpcHQsIG9yIGRhdGFmaWxlCisjIFRoaXMgY29tZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKS4KKyMKKyMgQ29weXJpZ2h0IDE5OTEgYnkgdGhlIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CisjIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAorIyBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCisjIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvcgorIyBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisjIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIE0uSS5ULiBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlCisjIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorIyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMgQ2FsbGluZyB0aGlzIHNjcmlwdCBpbnN0YWxsLXNoIGlzIHByZWZlcnJlZCBvdmVyIGluc3RhbGwuc2gsIHRvIHByZXZlbnQKKyMgYG1ha2UnIGltcGxpY2l0IHJ1bGVzIGZyb20gY3JlYXRpbmcgYSBmaWxlIGNhbGxlZCBpbnN0YWxsIGZyb20gaXQKKyMgd2hlbiB0aGVyZSBpcyBubyBNYWtlZmlsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBCU0QgaW5zdGFsbCBzY3JpcHQsIGJ1dCB3YXMgd3JpdHRlbgorIyBmcm9tIHNjcmF0Y2guICBJdCBjYW4gb25seSBpbnN0YWxsIG9uZSBmaWxlIGF0IGEgdGltZSwgYSByZXN0cmljdGlvbgorIyBzaGFyZWQgd2l0aCBtYW55IE9TJ3MgaW5zdGFsbCBwcm9ncmFtcy4KKworCisjIHNldCBET0lUUFJPRyB0byBlY2hvIHRvIHRlc3QgdGhpcyBzY3JpcHQKKworIyBEb24ndCB1c2UgOi0gc2luY2UgNC4zQlNEIGFuZCBlYXJsaWVyIHNoZWxscyBkb24ndCBsaWtlIGl0LgorZG9pdD0iJHtET0lUUFJPRy19IgorCisKKyMgcHV0IGluIGFic29sdXRlIHBhdGhzIGlmIHlvdSBkb24ndCBoYXZlIHRoZW0gaW4geW91ciBwYXRoOyBvciB1c2UgZW52LiB2YXJzLgorCittdnByb2c9IiR7TVZQUk9HLW12fSIKK2NwcHJvZz0iJHtDUFBST0ctY3B9IgorY2htb2Rwcm9nPSIke0NITU9EUFJPRy1jaG1vZH0iCitjaG93bnByb2c9IiR7Q0hPV05QUk9HLWNob3dufSIKK2NoZ3JwcHJvZz0iJHtDSEdSUFBST0ctY2hncnB9Igorc3RyaXBwcm9nPSIke1NUUklQUFJPRy1zdHJpcH0iCitybXByb2c9IiR7Uk1QUk9HLXJtfSIKK21rZGlycHJvZz0iJHtNS0RJUlBST0ctbWtkaXJ9IgorCit0cmFuc2Zvcm1iYXNlbmFtZT0iIgordHJhbnNmb3JtX2FyZz0iIgoraW5zdGNtZD0iJG12cHJvZyIKK2NobW9kY21kPSIkY2htb2Rwcm9nIDA3NTUiCitjaG93bmNtZD0iIgorY2hncnBjbWQ9IiIKK3N0cmlwY21kPSIiCitybWNtZD0iJHJtcHJvZyAtZiIKK212Y21kPSIkbXZwcm9nIgorc3JjPSIiCitkc3Q9IiIKK2Rpcl9hcmc9IiIKKword2hpbGUgWyB4IiQxIiAhPSB4IF07IGRvCisgICAgY2FzZSAkMSBpbgorCS1jKSBpbnN0Y21kPSIkY3Bwcm9nIgorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0iJHN0cmlwcHJvZyIKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gImluc3RhbGw6CW5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIgorCWV4aXQgMQorZWxzZQorCXRydWUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKwkKKwlpZiBbIC1kICRkc3QgXTsgdGhlbgorCQlpbnN0Y21kPToKKwllbHNlCisJCWluc3RjbWQ9bWtkaXIKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQgCisjIGlmICRzcmMgKGFuZCB0aHVzICRkc3R0bXApIGNvbnRhaW5zICcqJy4KKworCWlmIFsgLWYgJHNyYyAtbyAtZCAkc3JjIF0KKwl0aGVuCisJCXRydWUKKwllbHNlCisJCWVjaG8gImluc3RhbGw6ICAkc3JjIGRvZXMgbm90IGV4aXN0IgorCQlleGl0IDEKKwlmaQorCQorCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiaW5zdGFsbDoJbm8gZGVzdGluYXRpb24gc3BlY2lmaWVkIgorCQlleGl0IDEKKwllbHNlCisJCXRydWUKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICRkc3QgXQorCXRoZW4KKwkJZHN0PSIkZHN0Ii9gYmFzZW5hbWUgJHNyY2AKKwllbHNlCisJCXRydWUKKwlmaQorZmkKKworIyMgdGhpcyBzZWQgY29tbWFuZCBlbXVsYXRlcyB0aGUgZGlybmFtZSBjb21tYW5kCitkc3RkaXI9YGVjaG8gJGRzdCB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCQorJworSUZTPSIke0lGUy0ke2RlZmF1bHRJRlN9fSIKKworb0lGUz0iJHtJRlN9IgorIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICR7ZHN0ZGlyfSB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSIke29JRlN9IgorCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSIke3BhdGhjb21wfSR7MX0iCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHtwYXRoY29tcH0iIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiR7cGF0aGNvbXB9IgorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKwlwYXRoY29tcD0iJHtwYXRoY29tcH0vIgorZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAkZHN0ICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0OyBlbHNlIHRydWUgOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgJGRzdDsgZWxzZSB0cnVlIDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICRkc3Q7IGVsc2UgdHJ1ZSA7IGZpCitlbHNlCisKKyMgSWYgd2UncmUgZ29pbmcgdG8gcmVuYW1lIHRoZSBmaW5hbCBleGVjdXRhYmxlLCBkZXRlcm1pbmUgdGhlIG5hbWUgbm93LgorCisJaWYgWyB4IiR0cmFuc2Zvcm1hcmciID0geCBdIAorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgJGRzdGAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICRkc3QgJHRyYW5zZm9ybWJhc2VuYW1lIHwgCisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0gCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAkZHN0YAorCWVsc2UKKwkJdHJ1ZQorCWZpCisKKyMgTWFrZSBhIHRlbXAgZmlsZSBuYW1lIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisKKyMgTW92ZSBvciBjb3B5IHRoZSBmaWxlIG5hbWUgdG8gdGhlIHRlbXAgbmFtZQorCisJJGRvaXQgJGluc3RjbWQgJHNyYyAkZHN0dG1wICYmCisKKwl0cmFwICJybSAtZiAke2RzdHRtcH0iIDAgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAkZHN0dG1wOyBlbHNlIHRydWU7ZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICRkc3R0bXA7IGVsc2UgdHJ1ZTtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgJGRzdHRtcDsgZWxzZSB0cnVlO2ZpICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRybWNtZCAtZiAkZHN0ZGlyLyRkc3RmaWxlICYmCisJJGRvaXQgJG12Y21kICRkc3R0bXAgJGRzdGRpci8kZHN0ZmlsZSAKKworZmkgJiYKKworCitleGl0IDAKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvbGJsL29zLWFpeDQuaCBiL2xpYnBjYXAtMS4zLjAvbGJsL29zLWFpeDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWRmY2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9sYmwvb3MtYWl4NC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL2xibC9vcy1haXg0LmgsdiAxLjEgMjAwMi0wNi0wMSAwOTozNzo0MCBndXkgRXhwICQKKyAqLworCisvKiBQcm90b3R5cGVzIG1pc3NpbmcgaW4gQUlYIDQueCAqLworaW50CWZmcyhpbnQgaSk7CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2xibC9vcy1ocHV4MTEuaCBiL2xpYnBjYXAtMS4zLjAvbGJsL29zLWhwdXgxMS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzI1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL2xibC9vcy1ocHV4MTEuaApAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3MtaHB1eDExLmgsdiAxLjEgMjAwMi0wNi0wMSAwOTozNzo0MSBndXkgRXhwICQKKyAqLworCisvKiBQcm90b3R5cGVzIG1pc3NpbmcgaW4gSFAtVVggMTEueCAqLworaW50CWZmcyhpbnQgaSk7CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2xibC9vcy1vc2Y0LmggYi9saWJwY2FwLTEuMy4wL2xibC9vcy1vc2Y0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhYmNkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbGJsL29zLW9zZjQuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3Mtb3NmNC5oLHYgMS4yIDIwMDAtMTItMjIgMTE6NTE6MzMgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIERpZ2l0YWwgVU5JWCA0LnggKi8KK2ludAlzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworaW50CXZzbnByaW50ZihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCB2YV9saXN0KTsKK2ludAlwZm9wZW4oY2hhciAqLCBpbnQpOworICAgCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2xibC9vcy1vc2Y1LmggYi9saWJwY2FwLTEuMy4wL2xibC9vcy1vc2Y1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViY2FjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbGJsL29zLW9zZjUuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3Mtb3NmNS5oLHYgMS4yIDIwMDItMDgtMDIgMDM6MjQ6MTUgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgbWlzc2luZyBpbiBUcnU2NCBVTklYIDUueAorICogWFhYIC0gInNucHJpbnRmKCkiIGFuZCAidnNucHJpbnRmKCkiIGFyZW4ndCBtaXNzaW5nLCBidXQgeW91IGhhdmUgdG8KKyAqICNkZWZpbmUgdGhlIHJpZ2h0IHZhbHVlIHRvIGdldCB0aGVtIGRlZmluZWQgYnkgPHN0ZGlvLmg+LgorICovCitpbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2ludAl2c25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitpbnQJcGZvcGVuKGNoYXIgKiwgaW50KTsKKyAgIApkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9sYmwvb3Mtc29sYXJpczIuaCBiL2xpYnBjYXAtMS4zLjAvbGJsL29zLXNvbGFyaXMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlMmFhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbGJsL29zLXNvbGFyaXMyLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGJsL29zLXNvbGFyaXMyLmgsdiAxLjE5IDIwMDAtMTAtMTEgMDQ6MDI6NTIgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIFN1bk9TIDUgKi8KK2NoYXIgICAgKnN0cmVycm9yKGludCk7CitpbnQJc25wcmludGYoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgLi4uKTsKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvbGJsL29zLXN1bm9zNC5oIGIvbGlicGNhcC0xLjMuMC9sYmwvb3Mtc3Vub3M0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkNGIwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbGJsL29zLXN1bm9zNC5oCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkwLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3Mtc3Vub3M0LmgsdiAxLjMyIDE5OTktMTAtMDcgMjM6NDY6NDEgbWNyIEV4cCAkIChMQkwpCisgKi8KKworLyogUHJvdG90eXBlcyBtaXNzaW5nIGluIFN1bk9TIDQgKi8KKyNpZmRlZiBGSUxFCitpbnQJX2ZpbGJ1ZihGSUxFICopOworaW50CV9mbHNidWYodV9jaGFyLCBGSUxFICopOworaW50CWZjbG9zZShGSUxFICopOworaW50CWZmbHVzaChGSUxFICopOworaW50CWZnZXRjKEZJTEUgKik7CitpbnQJZnByaW50ZihGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2ludAlmcHV0YyhpbnQsIEZJTEUgKik7CitpbnQJZnB1dHMoY29uc3QgY2hhciAqLCBGSUxFICopOwordV9pbnQJZnJlYWQodm9pZCAqLCB1X2ludCwgdV9pbnQsIEZJTEUgKik7CitpbnQJZnNlZWsoRklMRSAqLCBsb25nLCBpbnQpOwordV9pbnQJZndyaXRlKGNvbnN0IHZvaWQgKiwgdV9pbnQsIHVfaW50LCBGSUxFICopOworaW50CXBjbG9zZShGSUxFICopOwordm9pZAlyZXdpbmQoRklMRSAqKTsKK3ZvaWQJc2V0YnVmKEZJTEUgKiwgY2hhciAqKTsKK2ludAlzZXRsaW5lYnVmKEZJTEUgKik7CitpbnQJdW5nZXRjKGludCwgRklMRSAqKTsKK2ludAl2ZnByaW50ZihGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKK2ludAl2cHJpbnRmKGNvbnN0IGNoYXIgKiwgLi4uKTsKKyNlbmRpZgorCisjaWYgX19HTlVDX18gPD0gMQoraW50CXJlYWQoaW50LCBjaGFyICosIHVfaW50KTsKK2ludAl3cml0ZShpbnQsIGNoYXIgKiwgdV9pbnQpOworI2VuZGlmCisKK2xvbmcJYTY0bChjb25zdCBjaGFyICopOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QJc29ja2FkZHI7CisjZW5kaWYKK2ludAlhY2NlcHQoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50ICopOworaW50CWJpbmQoaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50KTsKK2ludAliY21wKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqLCB1X2ludCk7Cit2b2lkCWJjb3B5KGNvbnN0IHZvaWQgKiwgdm9pZCAqLCB1X2ludCk7Cit2b2lkCWJ6ZXJvKHZvaWQgKiwgaW50KTsKK2ludAljaHJvb3QoY29uc3QgY2hhciAqKTsKK2ludAljbG9zZShpbnQpOwordm9pZAljbG9zZWxvZyh2b2lkKTsKK2ludAljb25uZWN0KGludCwgc3RydWN0IHNvY2thZGRyICosIGludCk7CitjaGFyCSpjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitpbnQJZGFlbW9uKGludCwgaW50KTsKK2ludAlmY2htb2QoaW50LCBpbnQpOworaW50CWZjaG93bihpbnQsIGludCwgaW50KTsKK3ZvaWQJZW5kZ3JlbnQodm9pZCk7Cit2b2lkCWVuZHB3ZW50KHZvaWQpOwordm9pZAllbmRzZXJ2ZW50KHZvaWQpOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QJZXRoZXJfYWRkcjsKKyNlbmRpZgorc3RydWN0CWV0aGVyX2FkZHIgKmV0aGVyX2F0b24oY29uc3QgY2hhciAqKTsKK2ludAlmbG9jayhpbnQsIGludCk7CisjaWZkZWYgX19TVERDX18KK3N0cnVjdAlzdGF0OworI2VuZGlmCitpbnQJZnN0YXQoaW50LCBzdHJ1Y3Qgc3RhdCAqKTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0IHN0YXRmczsKKyNlbmRpZgoraW50CWZzdGF0ZnMoaW50LCBzdHJ1Y3Qgc3RhdGZzICopOworaW50CWZzeW5jKGludCk7CisjaWZkZWYgX19TVERDX18KK3N0cnVjdCB0aW1lYjsKKyNlbmRpZgoraW50CWZ0aW1lKHN0cnVjdCB0aW1lYiAqKTsKK2ludAlmdHJ1bmNhdGUoaW50LCBvZmZfdCk7CitpbnQJZ2V0ZHRhYmxlc2l6ZSh2b2lkKTsKK2xvbmcJZ2V0aG9zdGlkKHZvaWQpOworaW50CWdldGhvc3RuYW1lKGNoYXIgKiwgaW50KTsKK2ludAlnZXRvcHQoaW50LCBjaGFyICogY29uc3QgKiwgY29uc3QgY2hhciAqKTsKK2ludAlnZXRwYWdlc2l6ZSh2b2lkKTsKK2NoYXIJKmdldHBhc3MoY2hhciAqKTsKK2ludAlnZXRwZWVybmFtZShpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQgKik7CitpbnQJZ2V0cHJpb3JpdHkoaW50LCBpbnQpOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QJcmxpbWl0OworI2VuZGlmCitpbnQJZ2V0cmxpbWl0KGludCwgc3RydWN0IHJsaW1pdCAqKTsKK2ludAlnZXRzb2NrbmFtZShpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQgKik7CitpbnQJZ2V0c29ja29wdChpbnQsIGludCwgaW50LCBjaGFyICosIGludCAqKTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0CXRpbWV2YWw7CitzdHJ1Y3QJdGltZXpvbmU7CisjZW5kaWYKK2ludAlnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKiwgc3RydWN0IHRpbWV6b25lICopOworY2hhcgkqZ2V0dXNlcnNoZWxsKHZvaWQpOworY2hhcgkqZ2V0d2QoY2hhciAqKTsKK2ludAlpbml0Z3JvdXBzKGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludAlpb2N0bChpbnQsIGludCwgY2FkZHJfdCk7CitpbnQJaXJ1c2Vyb2sodV9sb25nLCBpbnQsIGNoYXIgKiwgY2hhciAqKTsKK2ludAlpc2F0dHkoaW50KTsKK2ludAlraWxscGcoaW50LCBpbnQpOworaW50CWxpc3RlbihpbnQsIGludCk7CisjaWZkZWYgX19TVERDX18KK3N0cnVjdAl1dG1wOworI2VuZGlmCit2b2lkCWxvZ2luKHN0cnVjdCB1dG1wICopOworaW50CWxvZ291dChjb25zdCBjaGFyICopOworb2ZmX3QJbHNlZWsoaW50LCBvZmZfdCwgaW50KTsKK2ludAlsc3RhdChjb25zdCBjaGFyICosIHN0cnVjdCBzdGF0ICopOworaW50CW1rc3RlbXAoY2hhciAqKTsKK2NoYXIJKm1rdGVtcChjaGFyICopOworaW50CW11bm1hcChjYWRkcl90LCBpbnQpOwordm9pZAlvcGVubG9nKGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOwordm9pZAlwZXJyb3IoY29uc3QgY2hhciAqKTsKK2ludAlwcmludGYoY29uc3QgY2hhciAqLCAuLi4pOworaW50CXB1dHMoY29uc3QgY2hhciAqKTsKK2xvbmcJcmFuZG9tKHZvaWQpOworaW50CXJlYWRsaW5rKGNvbnN0IGNoYXIgKiwgY2hhciAqLCBpbnQpOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QJaW92ZWM7CisjZW5kaWYKK2ludAlyZWFkdihpbnQsIHN0cnVjdCBpb3ZlYyAqLCBpbnQpOworaW50CXJlY3YoaW50LCBjaGFyICosIHVfaW50LCBpbnQpOworaW50CXJlY3Zmcm9tKGludCwgY2hhciAqLCB1X2ludCwgaW50LCBzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50ICopOworaW50CXJlbmFtZShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CitpbnQJcmNtZChjaGFyICoqLCB1X3Nob3J0LCBjaGFyICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKik7CitpbnQJcnJlc3Zwb3J0KGludCAqKTsKK2ludAlzZW5kKGludCwgY2hhciAqLCB1X2ludCwgaW50KTsKK2ludAlzZW5kdG8oaW50LCBjaGFyICosIHVfaW50LCBpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQpOworaW50CXNldGVudihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2ludAlzZXRldWlkKGludCk7CitpbnQJc2V0cHJpb3JpdHkoaW50LCBpbnQsIGludCk7CitpbnQJc2VsZWN0KGludCwgZmRfc2V0ICosIGZkX3NldCAqLCBmZF9zZXQgKiwgc3RydWN0IHRpbWV2YWwgKik7CitpbnQJc2V0cGdycChpbnQsIGludCk7Cit2b2lkCXNldHB3ZW50KHZvaWQpOworaW50CXNldHJsaW1pdChpbnQsIHN0cnVjdCBybGltaXQgKik7Cit2b2lkCXNldHNlcnZlbnQoaW50KTsKK2ludAlzZXRzb2Nrb3B0KGludCwgaW50LCBpbnQsIGNoYXIgKiwgaW50KTsKK2ludAlzaHV0ZG93bihpbnQsIGludCk7CitpbnQJc2lnYmxvY2soaW50KTsKK3ZvaWQJKCpzaWduYWwgKGludCwgdm9pZCAoKikgKGludCkpKSAoaW50KTsKK2ludAlzaWdwYXVzZShpbnQpOworaW50CXNpZ3NldG1hc2soaW50KTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0CXNpZ3ZlYzsKKyNlbmRpZgoraW50CXNpZ3ZlYyhpbnQsIHN0cnVjdCBzaWd2ZWMgKiwgc3RydWN0IHNpZ3ZlYyopOworaW50CXNucHJpbnRmKGNoYXIgKiwgc2l6ZV90LCBjb25zdCBjaGFyICosIC4uLik7CitpbnQJc29ja2V0KGludCwgaW50LCBpbnQpOworaW50CXNvY2tldHBhaXIoaW50LCBpbnQsIGludCwgaW50ICopOworaW50CXN5bWxpbmsoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwordm9pZAlzcmFuZG9tKGludCk7CitpbnQJc3NjYW5mKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworaW50CXN0YXQoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3RhdCAqKTsKK2ludAlzdGF0ZnMoY2hhciAqLCBzdHJ1Y3Qgc3RhdGZzICopOworY2hhcgkqc3RyZXJyb3IoaW50KTsKK2ludAlzdHJjYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNpZmRlZiBfX1NURENfXworc3RydWN0CXRtOworI2VuZGlmCitpbnQJc3RyZnRpbWUoY2hhciAqLCBpbnQsIGNoYXIgKiwgc3RydWN0IHRtICopOworaW50CXN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworbG9uZwlzdHJ0b2woY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOwordm9pZAlzeW5jKHZvaWQpOwordm9pZAlzeXNsb2coaW50LCBjb25zdCBjaGFyICosIC4uLik7CitpbnQJc3lzdGVtKGNvbnN0IGNoYXIgKik7Citsb25nCXRlbGwoaW50KTsKK3RpbWVfdAl0aW1lKHRpbWVfdCAqKTsKK2NoYXIJKnRpbWV6b25lKGludCwgaW50KTsKK2ludAl0b2xvd2VyKGludCk7CitpbnQJdG91cHBlcihpbnQpOworaW50CXRydW5jYXRlKGNoYXIgKiwgb2ZmX3QpOwordm9pZAl1bnNldGVudihjb25zdCBjaGFyICopOworaW50CXZmb3JrKHZvaWQpOworaW50CXZzcHJpbnRmKGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworaW50CXdyaXRldihpbnQsIHN0cnVjdCBpb3ZlYyAqLCBpbnQpOworI2lmZGVmIF9fU1REQ19fCitzdHJ1Y3QJcnVzYWdlOworI2VuZGlmCitpbnQJdXRpbWVzKGNvbnN0IGNoYXIgKiwgc3RydWN0IHRpbWV2YWwgKik7CisjaWYgX19HTlVDX18gPD0gMQoraW50CXdhaXQoaW50ICopOworcGlkX3QJd2FpdDMoaW50ICosIGludCwgc3RydWN0IHJ1c2FnZSAqKTsKKyNlbmRpZgorCisvKiBVZ2x5IHNpZ25hbCBoYWNraW5nICovCisjaWZkZWYgU0lHX0VSUgorI3VuZGVmIFNJR19FUlIKKyNkZWZpbmUgU0lHX0VSUgkJKHZvaWQgKCopKGludCkpLTEKKyN1bmRlZiBTSUdfREZMCisjZGVmaW5lIFNJR19ERkwJCSh2b2lkICgqKShpbnQpKTAKKyN1bmRlZiBTSUdfSUdOCisjZGVmaW5lIFNJR19JR04JCSh2b2lkICgqKShpbnQpKTEKKworI2lmZGVmIEtFUk5FTAorI3VuZGVmIFNJR19DQVRDSAorI2RlZmluZSBTSUdfQ0FUQ0gJKHZvaWQgKCopKGludCkpMgorI2VuZGlmCisjdW5kZWYgU0lHX0hPTEQKKyNkZWZpbmUgU0lHX0hPTEQJKHZvaWQgKCopKGludCkpMworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL2xibC9vcy11bHRyaXg0LmggYi9saWJwY2FwLTEuMy4wL2xibC9vcy11bHRyaXg0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYyYTE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbGJsL29zLXVsdHJpeDQuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9sYmwvb3MtdWx0cml4NC5oLHYgMS4xOSAxOTk5LTEwLTA3IDIzOjQ2OjQxIG1jciBFeHAgJCAoTEJMKQorICovCisKKy8qIFByb3RvdHlwZXMgbWlzc2luZyBpbiBVbHRyaXggNCAqLworaW50CWJjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIHVfaW50KTsKK3ZvaWQJYmNvcHkoY29uc3Qgdm9pZCAqLCB2b2lkICosIHVfaW50KTsKK3ZvaWQJYnplcm8odm9pZCAqLCB1X2ludCk7Cit2b2lkCWVuZHNlcnZlbnQodm9pZCk7CitpbnQJZ2V0b3B0KGludCwgY2hhciAqIGNvbnN0ICosIGNvbnN0IGNoYXIgKik7CisjaWZkZWYgX19TVERDX18KK3N0cnVjdCB0aW1ldmFsOworc3RydWN0IHRpbWV6b25lOworI2VuZGlmCitpbnQJZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICosIHN0cnVjdCB0aW1lem9uZSAqKTsKK2ludAlpb2N0bChpbnQsIGludCwgY2FkZHJfdCk7CitpbnQJcGZvcGVuKGNoYXIgKiwgaW50KTsKK2ludAlzZXRsaW5lYnVmKEZJTEUgKik7CitpbnQJc29ja2V0KGludCwgaW50LCBpbnQpOworaW50CXN0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9sbGMuaCBiL2xpYnBjYXAtMS4zLjAvbGxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjMjIxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbGxjLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvbGxjLmgsdiAxLjIgMjAwMS0wMS0yOCAwOTo0NDo1MCBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogODAyLjIgTExDIFNBUCB2YWx1ZXMuCisgKi8KKworI2lmbmRlZiBMTENTQVBfTlVMTAorI2RlZmluZQlMTENTQVBfTlVMTAkJMHgwMAorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9HTE9CQUwKKyNkZWZpbmUJTExDU0FQX0dMT0JBTAkJMHhmZgorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF84MDIxQgorI2RlZmluZQlMTENTQVBfODAyMUJfSQkJMHgwMgorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF84MDIxQgorI2RlZmluZQlMTENTQVBfODAyMUJfRwkJMHgwMworI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9JUAorI2RlZmluZQlMTENTQVBfSVAJCTB4MDYKKyNlbmRpZgorI2lmbmRlZiBMTENTQVBfUFJPV0FZTk0KKyNkZWZpbmUJTExDU0FQX1BST1dBWU5NCQkweDBlCisjZW5kaWYKKyNpZm5kZWYgTExDU0FQXzgwMjFECisjZGVmaW5lCUxMQ1NBUF84MDIxRAkJMHg0MgorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9SUzUxMQorI2RlZmluZQlMTENTQVBfUlM1MTEJCTB4NGUKKyNlbmRpZgorI2lmbmRlZiBMTENTQVBfSVNPODIwOAorI2RlZmluZQlMTENTQVBfSVNPODIwOAkJMHg3ZQorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9QUk9XQVkKKyNkZWZpbmUJTExDU0FQX1BST1dBWQkJMHg4ZQorI2VuZGlmCisjaWZuZGVmIExMQ1NBUF9TTkFQCisjZGVmaW5lCUxMQ1NBUF9TTkFQCQkweGFhCisjZW5kaWYKKyNpZm5kZWYgTExDU0FQX0lQWAorI2RlZmluZSBMTENTQVBfSVBYCQkweGUwCisjZW5kaWYKKyNpZm5kZWYgTExDU0FQX05FVEJFVUkKKyNkZWZpbmUgTExDU0FQX05FVEJFVUkJCTB4ZjAKKyNlbmRpZgorI2lmbmRlZiBMTENTQVBfSVNPTlMKKyNkZWZpbmUJTExDU0FQX0lTT05TCQkweGZlCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvbWlzc2luZy9zbnByaW50Zi5jIGIvbGlicGNhcC0xLjMuMC9taXNzaW5nL3NucHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5MWYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbWlzc2luZy9zbnByaW50Zi5jCkBAIC0wLDAgKzEsNjMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCisgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBJbnN0aXR1dGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIElOU1RJVFVURSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIElOU1RJVFVURSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qICRJZDogc25wcmludGYuYyx2IDEuMSAyMDA0LTA0LTA1IDIyOjQzOjUxIGd1eSBFeHAgJCAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2VuZGlmCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9taXNzaW5nL3NucHJpbnRmLmMsdiAxLjEgMjAwNC0wNC0wNSAyMjo0Mzo1MSBndXkgRXhwICQiOworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxwY2FwLWludC5oPgorCitlbnVtIGZvcm1hdF9mbGFncyB7CisgICAgbWludXNfZmxhZyAgICAgPSAgMSwKKyAgICBwbHVzX2ZsYWcgICAgICA9ICAyLAorICAgIHNwYWNlX2ZsYWcgICAgID0gIDQsCisgICAgYWx0ZXJuYXRlX2ZsYWcgPSAgOCwKKyAgICB6ZXJvX2ZsYWcgICAgICA9IDE2Cit9OworCisvKgorICogQ29tbW9uIHN0YXRlCisgKi8KKworc3RydWN0IHN0YXRlIHsKKyAgdW5zaWduZWQgY2hhciAqc3RyOworICB1bnNpZ25lZCBjaGFyICpzOworICB1bnNpZ25lZCBjaGFyICp0aGVlbmQ7CisgIHNpemVfdCBzejsKKyAgc2l6ZV90IG1heF9zejsKKyAgaW50ICgqYXBwZW5kX2NoYXIpKHN0cnVjdCBzdGF0ZSAqLCB1bnNpZ25lZCBjaGFyKTsKKyAgaW50ICgqcmVzZXJ2ZSkoc3RydWN0IHN0YXRlICosIHNpemVfdCk7CisgIC8qIFhYWCAtIG1ldGhvZHMgKi8KK307CisKKyNpZm5kZWYgSEFWRV9WU05QUklOVEYKK3N0YXRpYyBpbnQKK3NuX3Jlc2VydmUgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHNpemVfdCBuKQoreworICByZXR1cm4gc3RhdGUtPnMgKyBuID4gc3RhdGUtPnRoZWVuZDsKK30KKworc3RhdGljIGludAorc25fYXBwZW5kX2NoYXIgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgaWYgKHNuX3Jlc2VydmUgKHN0YXRlLCAxKSkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgICpzdGF0ZS0+cysrID0gYzsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorI2VuZGlmCisKKyNpZiAwCitzdGF0aWMgaW50Cithc19yZXNlcnZlIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCBzaXplX3QgbikKK3sKKyAgaWYgKHN0YXRlLT5zICsgbiA+IHN0YXRlLT50aGVlbmQpIHsKKyAgICBpbnQgb2ZmID0gc3RhdGUtPnMgLSBzdGF0ZS0+c3RyOworICAgIHVuc2lnbmVkIGNoYXIgKnRtcDsKKworICAgIGlmIChzdGF0ZS0+bWF4X3N6ICYmIHN0YXRlLT5zeiA+PSBzdGF0ZS0+bWF4X3N6KQorICAgICAgcmV0dXJuIDE7CisKKyAgICBzdGF0ZS0+c3ogPSBtYXgoc3RhdGUtPnN6ICogMiwgc3RhdGUtPnN6ICsgbik7CisgICAgaWYgKHN0YXRlLT5tYXhfc3opCisgICAgICBzdGF0ZS0+c3ogPSBtaW4oc3RhdGUtPnN6LCBzdGF0ZS0+bWF4X3N6KTsKKyAgICB0bXAgPSByZWFsbG9jIChzdGF0ZS0+c3RyLCBzdGF0ZS0+c3opOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgIHJldHVybiAxOworICAgIHN0YXRlLT5zdHIgPSB0bXA7CisgICAgc3RhdGUtPnMgPSBzdGF0ZS0+c3RyICsgb2ZmOworICAgIHN0YXRlLT50aGVlbmQgPSBzdGF0ZS0+c3RyICsgc3RhdGUtPnN6IC0gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYXNfYXBwZW5kX2NoYXIgKHN0cnVjdCBzdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGNoYXIgYykKK3sKKyAgaWYoYXNfcmVzZXJ2ZSAoc3RhdGUsIDEpKQorICAgIHJldHVybiAxOworICBlbHNlIHsKKyAgICAqc3RhdGUtPnMrKyA9IGM7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50CithcHBlbmRfbnVtYmVyKHN0cnVjdCBzdGF0ZSAqc3RhdGUsCisJICAgICAgdW5zaWduZWQgbG9uZyBudW0sIHVuc2lnbmVkIGJhc2UsIGNoYXIgKnJlcCwKKwkgICAgICBpbnQgd2lkdGgsIGludCBwcmVjLCBpbnQgZmxhZ3MsIGludCBtaW51c3ApCit7CisgIGludCBsZW4gPSAwOworICBpbnQgaTsKKworICAvKiBnaXZlbiBwcmVjaXNpb24sIGlnbm9yZSB6ZXJvIGZsYWcgKi8KKyAgaWYocHJlYyAhPSAtMSkKKyAgICBmbGFncyAmPSB+emVyb19mbGFnOworICBlbHNlCisgICAgcHJlYyA9IDE7CisgIC8qIHplcm8gdmFsdWUgd2l0aCB6ZXJvIHByZWNpc2lvbiAtPiAiIiAqLworICBpZihwcmVjID09IDAgJiYgbnVtID09IDApCisgICAgcmV0dXJuIDA7CisgIGRveworICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgcmVwW251bSAlIGJhc2VdKSkKKyAgICAgIHJldHVybiAxOworICAgIGxlbisrOworICAgIG51bSAvPSBiYXNlOworICB9d2hpbGUobnVtKTsKKyAgcHJlYyAtPSBsZW47CisgIC8qIHBhZCB3aXRoIHByZWMgemVyb3MgKi8KKyAgd2hpbGUocHJlYy0tID4gMCl7CisgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnMCcpKQorICAgICAgcmV0dXJuIDE7CisgICAgbGVuKys7CisgIH0KKyAgLyogYWRkIGxlbmd0aCBvZiBhbHRlcm5hdGUgcHJlZml4IChhZGRlZCBsYXRlcikgdG8gbGVuICovCisgIGlmKGZsYWdzICYgYWx0ZXJuYXRlX2ZsYWcgJiYgKGJhc2UgPT0gMTYgfHwgYmFzZSA9PSA4KSkKKyAgICBsZW4gKz0gYmFzZSAvIDg7CisgIC8qIHBhZCB3aXRoIHplcm9zICovCisgIGlmKGZsYWdzICYgemVyb19mbGFnKXsKKyAgICB3aWR0aCAtPSBsZW47CisgICAgaWYobWludXNwIHx8IChmbGFncyAmIHNwYWNlX2ZsYWcpIHx8IChmbGFncyAmIHBsdXNfZmxhZykpCisgICAgICB3aWR0aC0tOworICAgIHdoaWxlKHdpZHRoLS0gPiAwKXsKKyAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKKwlyZXR1cm4gMTsKKyAgICAgIGxlbisrOworICAgIH0KKyAgfQorICAvKiBhZGQgYWx0ZXJuYXRlIHByZWZpeCAqLworICBpZihmbGFncyAmIGFsdGVybmF0ZV9mbGFnICYmIChiYXNlID09IDE2IHx8IGJhc2UgPT0gOCkpeworICAgIGlmKGJhc2UgPT0gMTYpCisgICAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsIHJlcFsxMF0gKyAyMykpIC8qIFhYWCAqLworCXJldHVybiAxOworICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJzAnKSkKKyAgICAgIHJldHVybiAxOworICB9CisgIC8qIGFkZCBzaWduICovCisgIGlmKG1pbnVzcCl7CisgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnLScpKQorICAgICAgcmV0dXJuIDE7CisgICAgbGVuKys7CisgIH0gZWxzZSBpZihmbGFncyAmIHBsdXNfZmxhZykgeworICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgJysnKSkKKyAgICAgIHJldHVybiAxOworICAgIGxlbisrOworICB9IGVsc2UgaWYoZmxhZ3MgJiBzcGFjZV9mbGFnKSB7CisgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCAnICcpKQorICAgICAgcmV0dXJuIDE7CisgICAgbGVuKys7CisgIH0KKyAgaWYoZmxhZ3MgJiBtaW51c19mbGFnKQorICAgIC8qIHN3YXAgYmVmb3JlIHBhZGRpbmcgd2l0aCBzcGFjZXMgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspeworICAgICAgY2hhciBjID0gc3RhdGUtPnNbLWktMV07CisgICAgICBzdGF0ZS0+c1staS0xXSA9IHN0YXRlLT5zWy1sZW4raV07CisgICAgICBzdGF0ZS0+c1stbGVuK2ldID0gYzsKKyAgICB9CisgIHdpZHRoIC09IGxlbjsKKyAgd2hpbGUod2lkdGgtLSA+IDApeworICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKShzdGF0ZSwgICcgJykpCisgICAgICByZXR1cm4gMTsKKyAgICBsZW4rKzsKKyAgfQorICBpZighKGZsYWdzICYgbWludXNfZmxhZykpCisgICAgLyogc3dhcCBhZnRlciBwYWRkaW5nIHdpdGggc3BhY2VzICovCisgICAgZm9yKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKXsKKyAgICAgIGNoYXIgYyA9IHN0YXRlLT5zWy1pLTFdOworICAgICAgc3RhdGUtPnNbLWktMV0gPSBzdGF0ZS0+c1stbGVuK2ldOworICAgICAgc3RhdGUtPnNbLWxlbitpXSA9IGM7CisgICAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CithcHBlbmRfc3RyaW5nIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAorCSAgICAgICB1bnNpZ25lZCBjaGFyICphcmcsCisJICAgICAgIGludCB3aWR0aCwKKwkgICAgICAgaW50IHByZWMsCisJICAgICAgIGludCBmbGFncykKK3sKKyAgaWYocHJlYyAhPSAtMSkKKyAgICB3aWR0aCAtPSBwcmVjOworICBlbHNlCisgICAgd2lkdGggLT0gc3RybGVuKChjaGFyICopYXJnKTsKKyAgaWYoIShmbGFncyAmIG1pbnVzX2ZsYWcpKQorICAgIHdoaWxlKHdpZHRoLS0gPiAwKQorICAgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKKwlyZXR1cm4gMTsKKyAgaWYgKHByZWMgIT0gLTEpIHsKKyAgICB3aGlsZSAoKmFyZyAmJiBwcmVjLS0pCisgICAgICBpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgKmFyZysrKSkKKwlyZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoKmFyZykKKyAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAqYXJnKyspKQorCXJldHVybiAxOworICB9CisgIGlmKGZsYWdzICYgbWludXNfZmxhZykKKyAgICB3aGlsZSh3aWR0aC0tID4gMCkKKyAgICAgIGlmKCgqc3RhdGUtPmFwcGVuZF9jaGFyKSAoc3RhdGUsICcgJykpCisJcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CithcHBlbmRfY2hhcihzdHJ1Y3Qgc3RhdGUgKnN0YXRlLAorCSAgICB1bnNpZ25lZCBjaGFyIGFyZywKKwkgICAgaW50IHdpZHRoLAorCSAgICBpbnQgZmxhZ3MpCit7CisgIHdoaWxlKCEoZmxhZ3MgJiBtaW51c19mbGFnKSAmJiAtLXdpZHRoID4gMCkKKyAgICBpZigoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCAnICcpKQorICAgICAgcmV0dXJuIDE7CisKKyAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgYXJnKSkKKyAgICByZXR1cm4gMTsKKyAgd2hpbGUoKGZsYWdzICYgbWludXNfZmxhZykgJiYgLS13aWR0aCA+IDApCisgICAgaWYoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpIChzdGF0ZSwgJyAnKSkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiAwOworfQorCisvKgorICogVGhpcyBjYW4ndCBiZSBtYWRlIGludG8gYSBmdW5jdGlvbi4uLgorICovCisKKyNkZWZpbmUgUEFSU0VfSU5UX0ZPUk1BVChyZXMsIGFyZywgdW5zaWcpIFwKK2lmIChsb25nX2ZsYWcpIFwKKyAgICAgcmVzID0gKHVuc2lnIGxvbmcpdmFfYXJnKGFyZywgdW5zaWcgbG9uZyk7IFwKK2Vsc2UgaWYgKHNob3J0X2ZsYWcpIFwKKyAgICAgcmVzID0gKHVuc2lnIHNob3J0KXZhX2FyZyhhcmcsIHVuc2lnIGludCk7IFwKK2Vsc2UgXAorICAgICByZXMgPSAodW5zaWcgaW50KXZhX2FyZyhhcmcsIHVuc2lnIGludCkKKworLyoKKyAqIHp5eHByaW50ZiAtIHJldHVybiAwIG9yIC0xCisgKi8KKworc3RhdGljIGludAoreHl6cHJpbnRmIChzdHJ1Y3Qgc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpjaGFyX2Zvcm1hdCwgdmFfbGlzdCBhcCkKK3sKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqZm9ybWF0ID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiljaGFyX2Zvcm1hdDsKKyAgdW5zaWduZWQgY2hhciBjOworCisgIHdoaWxlKChjID0gKmZvcm1hdCsrKSkgeworICAgIGlmIChjID09ICclJykgeworICAgICAgaW50IGZsYWdzICAgICAgPSAwOworICAgICAgaW50IHdpZHRoICAgICAgPSAwOworICAgICAgaW50IHByZWMgICAgICAgPSAtMTsKKyAgICAgIGludCBsb25nX2ZsYWcgID0gMDsKKyAgICAgIGludCBzaG9ydF9mbGFnID0gMDsKKworICAgICAgLyogZmxhZ3MgKi8KKyAgICAgIHdoaWxlKChjID0gKmZvcm1hdCsrKSl7CisJaWYoYyA9PSAnLScpCisJICBmbGFncyB8PSBtaW51c19mbGFnOworCWVsc2UgaWYoYyA9PSAnKycpCisJICBmbGFncyB8PSBwbHVzX2ZsYWc7CisJZWxzZSBpZihjID09ICcgJykKKwkgIGZsYWdzIHw9IHNwYWNlX2ZsYWc7CisJZWxzZSBpZihjID09ICcjJykKKwkgIGZsYWdzIHw9IGFsdGVybmF0ZV9mbGFnOworCWVsc2UgaWYoYyA9PSAnMCcpCisJICBmbGFncyB8PSB6ZXJvX2ZsYWc7CisJZWxzZQorCSAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmKChmbGFncyAmIHNwYWNlX2ZsYWcpICYmIChmbGFncyAmIHBsdXNfZmxhZykpCisJZmxhZ3MgXj0gc3BhY2VfZmxhZzsKKworICAgICAgaWYoKGZsYWdzICYgbWludXNfZmxhZykgJiYgKGZsYWdzICYgemVyb19mbGFnKSkKKwlmbGFncyBePSB6ZXJvX2ZsYWc7CisKKyAgICAgIC8qIHdpZHRoICovCisgICAgICBpZiAoaXNkaWdpdChjKSkKKwlkbyB7CisJICB3aWR0aCA9IHdpZHRoICogMTAgKyBjIC0gJzAnOworCSAgYyA9ICpmb3JtYXQrKzsKKwl9IHdoaWxlKGlzZGlnaXQoYykpOworICAgICAgZWxzZSBpZihjID09ICcqJykgeworCXdpZHRoID0gdmFfYXJnKGFwLCBpbnQpOworCWMgPSAqZm9ybWF0Kys7CisgICAgICB9CisKKyAgICAgIC8qIHByZWNpc2lvbiAqLworICAgICAgaWYgKGMgPT0gJy4nKSB7CisJcHJlYyA9IDA7CisJYyA9ICpmb3JtYXQrKzsKKwlpZiAoaXNkaWdpdChjKSkKKwkgIGRvIHsKKwkgICAgcHJlYyA9IHByZWMgKiAxMCArIGMgLSAnMCc7CisJICAgIGMgPSAqZm9ybWF0Kys7CisJICB9IHdoaWxlKGlzZGlnaXQoYykpOworCWVsc2UgaWYgKGMgPT0gJyonKSB7CisJICBwcmVjID0gdmFfYXJnKGFwLCBpbnQpOworCSAgYyA9ICpmb3JtYXQrKzsKKwl9CisgICAgICB9CisKKyAgICAgIC8qIHNpemUgKi8KKworICAgICAgaWYgKGMgPT0gJ2gnKSB7CisJc2hvcnRfZmxhZyA9IDE7CisJYyA9ICpmb3JtYXQrKzsKKyAgICAgIH0gZWxzZSBpZiAoYyA9PSAnbCcpIHsKKwlsb25nX2ZsYWcgPSAxOworCWMgPSAqZm9ybWF0Kys7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnYycgOgorCWlmKGFwcGVuZF9jaGFyKHN0YXRlLCB2YV9hcmcoYXAsIGludCksIHdpZHRoLCBmbGFncykpCisJICByZXR1cm4gLTE7CisJYnJlYWs7CisgICAgICBjYXNlICdzJyA6CisJaWYgKGFwcGVuZF9zdHJpbmcoc3RhdGUsCisJCQkgIHZhX2FyZyhhcCwgdW5zaWduZWQgY2hhciopLAorCQkJICB3aWR0aCwKKwkJCSAgcHJlYywKKwkJCSAgZmxhZ3MpKQorCSAgcmV0dXJuIC0xOworCWJyZWFrOworICAgICAgY2FzZSAnZCcgOgorICAgICAgY2FzZSAnaScgOiB7CisJbG9uZyBhcmc7CisJdW5zaWduZWQgbG9uZyBudW07CisJaW50IG1pbnVzcCA9IDA7CisKKwlQQVJTRV9JTlRfRk9STUFUKGFyZywgYXAsIHNpZ25lZCk7CisKKwlpZiAoYXJnIDwgMCkgeworCSAgbWludXNwID0gMTsKKwkgIG51bSA9IC1hcmc7CisJfSBlbHNlCisJICBudW0gPSBhcmc7CisKKwlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIG51bSwgMTAsICIwMTIzNDU2Nzg5IiwKKwkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgbWludXNwKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ3UnIDogeworCXVuc2lnbmVkIGxvbmcgYXJnOworCisJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CisKKwlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMTAsICIwMTIzNDU2Nzg5IiwKKwkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCisJICByZXR1cm4gLTE7CisJYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdvJyA6IHsKKwl1bnNpZ25lZCBsb25nIGFyZzsKKworCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOworCisJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDAxMCwgIjAxMjM0NTY3IiwKKwkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCisJICByZXR1cm4gLTE7CisJYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICd4JyA6IHsKKwl1bnNpZ25lZCBsb25nIGFyZzsKKworCVBBUlNFX0lOVF9GT1JNQVQoYXJnLCBhcCwgdW5zaWduZWQpOworCisJaWYgKGFwcGVuZF9udW1iZXIgKHN0YXRlLCBhcmcsIDB4MTAsICIwMTIzNDU2Nzg5YWJjZGVmIiwKKwkJCSAgIHdpZHRoLCBwcmVjLCBmbGFncywgMCkpCisJICByZXR1cm4gLTE7CisJYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdYJyA6eworCXVuc2lnbmVkIGxvbmcgYXJnOworCisJUEFSU0VfSU5UX0ZPUk1BVChhcmcsIGFwLCB1bnNpZ25lZCk7CisKKwlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlBQkNERUYiLAorCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ3AnIDogeworCXVuc2lnbmVkIGxvbmcgYXJnID0gKHVuc2lnbmVkIGxvbmcpdmFfYXJnKGFwLCB2b2lkKik7CisKKwlpZiAoYXBwZW5kX251bWJlciAoc3RhdGUsIGFyZywgMHgxMCwgIjAxMjM0NTY3ODlBQkNERUYiLAorCQkJICAgd2lkdGgsIHByZWMsIGZsYWdzLCAwKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ24nIDogeworCWludCAqYXJnID0gdmFfYXJnKGFwLCBpbnQqKTsKKwkqYXJnID0gc3RhdGUtPnMgLSBzdGF0ZS0+c3RyOworCWJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnXDAnIDoKKwkgIC0tZm9ybWF0OworCSAgLyogRkFMTFRIUk9VR0ggKi8KKyAgICAgIGNhc2UgJyUnIDoKKwlpZiAoKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCBjKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIGRlZmF1bHQgOgorCWlmICggICAoKnN0YXRlLT5hcHBlbmRfY2hhcikoc3RhdGUsICclJykKKwkgICAgfHwgKCpzdGF0ZS0+YXBwZW5kX2NoYXIpKHN0YXRlLCBjKSkKKwkgIHJldHVybiAtMTsKKwlicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgIGlmICgoKnN0YXRlLT5hcHBlbmRfY2hhcikgKHN0YXRlLCBjKSkKKwlyZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgSEFWRV9TTlBSSU5URgoraW50CitzbnByaW50ZiAoY2hhciAqc3RyLCBzaXplX3Qgc3osIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisgIGludCByZXQ7CisKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgcmV0ID0gdnNucHJpbnRmIChzdHIsIHN6LCBmb3JtYXQsIGFyZ3MpOworCisjaWZkZWYgUEFSQU5PSUEKKyAgeworICAgIGludCByZXQyOworICAgIGNoYXIgKnRtcDsKKworICAgIHRtcCA9IG1hbGxvYyAoc3opOworICAgIGlmICh0bXAgPT0gTlVMTCkKKyAgICAgIGFib3J0ICgpOworCisgICAgcmV0MiA9IHZzcHJpbnRmICh0bXAsIGZvcm1hdCwgYXJncyk7CisgICAgaWYgKHJldCAhPSByZXQyIHx8IHN0cmNtcChzdHIsIHRtcCkpCisgICAgICBhYm9ydCAoKTsKKyAgICBmcmVlICh0bXApOworICB9CisjZW5kaWYKKworICB2YV9lbmQoYXJncyk7CisgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmIDAKKyNpZm5kZWYgSEFWRV9BU1BSSU5URgoraW50Cithc3ByaW50ZiAoY2hhciAqKnJldCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHZhbDsKKworICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICB2YWwgPSB2YXNwcmludGYgKHJldCwgZm9ybWF0LCBhcmdzKTsKKworI2lmZGVmIFBBUkFOT0lBCisgIHsKKyAgICBpbnQgcmV0MjsKKyAgICBjaGFyICp0bXA7CisgICAgdG1wID0gbWFsbG9jICh2YWwgKyAxKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICBhYm9ydCAoKTsKKworICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOworICAgIGlmICh2YWwgIT0gcmV0MiB8fCBzdHJjbXAoKnJldCwgdG1wKSkKKyAgICAgIGFib3J0ICgpOworICAgIGZyZWUgKHRtcCk7CisgIH0KKyNlbmRpZgorCisgIHZhX2VuZChhcmdzKTsKKyAgcmV0dXJuIHZhbDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfQVNOUFJJTlRGCitpbnQKK2FzbnByaW50ZiAoY2hhciAqKnJldCwgc2l6ZV90IG1heF9zeiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisgIHZhX2xpc3QgYXJnczsKKyAgaW50IHZhbDsKKworICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICB2YWwgPSB2YXNucHJpbnRmIChyZXQsIG1heF9zeiwgZm9ybWF0LCBhcmdzKTsKKworI2lmZGVmIFBBUkFOT0lBCisgIHsKKyAgICBpbnQgcmV0MjsKKyAgICBjaGFyICp0bXA7CisgICAgdG1wID0gbWFsbG9jICh2YWwgKyAxKTsKKyAgICBpZiAodG1wID09IE5VTEwpCisgICAgICBhYm9ydCAoKTsKKworICAgIHJldDIgPSB2c3ByaW50ZiAodG1wLCBmb3JtYXQsIGFyZ3MpOworICAgIGlmICh2YWwgIT0gcmV0MiB8fCBzdHJjbXAoKnJldCwgdG1wKSkKKyAgICAgIGFib3J0ICgpOworICAgIGZyZWUgKHRtcCk7CisgIH0KKyNlbmRpZgorCisgIHZhX2VuZChhcmdzKTsKKyAgcmV0dXJuIHZhbDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVkFTUFJJTlRGCitpbnQKK3Zhc3ByaW50ZiAoY2hhciAqKnJldCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHJldHVybiB2YXNucHJpbnRmIChyZXQsIDAsIGZvcm1hdCwgYXJncyk7Cit9CisjZW5kaWYKKworCisjaWZuZGVmIEhBVkVfVkFTTlBSSU5URgoraW50Cit2YXNucHJpbnRmIChjaGFyICoqcmV0LCBzaXplX3QgbWF4X3N6LCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJncykKK3sKKyAgaW50IHN0OworICBzaXplX3QgbGVuOworICBzdHJ1Y3Qgc3RhdGUgc3RhdGU7CisKKyAgc3RhdGUubWF4X3N6ID0gbWF4X3N6OworICBzdGF0ZS5zeiAgICAgPSAxOworICBzdGF0ZS5zdHIgICAgPSBtYWxsb2Moc3RhdGUuc3opOworICBpZiAoc3RhdGUuc3RyID09IE5VTEwpIHsKKyAgICAqcmV0ID0gTlVMTDsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgc3RhdGUucyA9IHN0YXRlLnN0cjsKKyAgc3RhdGUudGhlZW5kID0gc3RhdGUucyArIHN0YXRlLnN6IC0gMTsKKyAgc3RhdGUuYXBwZW5kX2NoYXIgPSBhc19hcHBlbmRfY2hhcjsKKyAgc3RhdGUucmVzZXJ2ZSAgICAgPSBhc19yZXNlcnZlOworCisgIHN0ID0geHl6cHJpbnRmICgmc3RhdGUsIGZvcm1hdCwgYXJncyk7CisgIGlmIChzdCkgeworICAgIGZyZWUgKHN0YXRlLnN0cik7CisgICAgKnJldCA9IE5VTEw7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIGNoYXIgKnRtcDsKKworICAgICpzdGF0ZS5zID0gJ1wwJzsKKyAgICBsZW4gPSBzdGF0ZS5zIC0gc3RhdGUuc3RyOworICAgIHRtcCA9IHJlYWxsb2MgKHN0YXRlLnN0ciwgbGVuKzEpOworICAgIGlmICh0bXAgPT0gTlVMTCkgeworICAgICAgZnJlZSAoc3RhdGUuc3RyKTsKKyAgICAgICpyZXQgPSBOVUxMOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqcmV0ID0gdG1wOworICAgIHJldHVybiBsZW47CisgIH0KK30KKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9WU05QUklOVEYKK2ludAordnNucHJpbnRmIChjaGFyICpzdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZ3MpCit7CisgIHN0cnVjdCBzdGF0ZSBzdGF0ZTsKKyAgaW50IHJldDsKKyAgdW5zaWduZWQgY2hhciAqdXN0ciA9ICh1bnNpZ25lZCBjaGFyICopc3RyOworCisgIHN0YXRlLm1heF9zeiA9IDA7CisgIHN0YXRlLnN6ICAgICA9IHN6OworICBzdGF0ZS5zdHIgICAgPSB1c3RyOworICBzdGF0ZS5zICAgICAgPSB1c3RyOworICBzdGF0ZS50aGVlbmQgPSB1c3RyICsgc3ogLSAxOworICBzdGF0ZS5hcHBlbmRfY2hhciA9IHNuX2FwcGVuZF9jaGFyOworICBzdGF0ZS5yZXNlcnZlICAgICA9IHNuX3Jlc2VydmU7CisKKyAgcmV0ID0geHl6cHJpbnRmICgmc3RhdGUsIGZvcm1hdCwgYXJncyk7CisgICpzdGF0ZS5zID0gJ1wwJzsKKyAgaWYgKHJldCkKKyAgICByZXR1cm4gc3o7CisgIGVsc2UKKyAgICByZXR1cm4gc3RhdGUucyAtIHN0YXRlLnN0cjsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL21rZGVwIGIvbGlicGNhcC0xLjMuMC9ta2RlcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNDFhMDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9ta2RlcApAQCAtMCwwICsxLDEwOSBAQAorIyEvYmluL3NoIC0KKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2CisjCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zIGFyZSBwZXJtaXR0ZWQKKyMgcHJvdmlkZWQgdGhhdCB0aGlzIG5vdGljZSBpcyBwcmVzZXJ2ZWQgYW5kIHRoYXQgZHVlIGNyZWRpdCBpcyBnaXZlbgorIyB0byB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIGF0IEJlcmtlbGV5LiBUaGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eQorIyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisjIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBUaGlzIHNvZnR3YXJlCisjIGlzIHByb3ZpZGVkIGBgYXMgaXMnJyB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyMKKyMJQCgjKW1rZGVwLnNoCTUuMTEgKEJlcmtlbGV5KSA1LzUvODgKKyMKKworUEFUSD0vYmluOi91c3IvYmluOi91c3IvdWNiOi91c3IvbG9jYWw6L3Vzci9sb2NhbC9iaW46L3Vzci9zZncvYmluCitleHBvcnQgUEFUSAorCitNQUtFPU1ha2VmaWxlCQkJIyBkZWZhdWx0IG1ha2VmaWxlIG5hbWUgaXMgIk1ha2VmaWxlIgorQ0M9Y2MJCQkJIyBkZWZhdWx0IEMgY29tcGlsZXIgaXMgImNjIgorCit3aGlsZSA6CisJZG8gY2FzZSAiJDEiIGluCisJCSMgLWMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBDIGNvbXBpbGVyCisJCS1jKQorCQkJQ0M9JDIKKwkJCXNoaWZ0OyBzaGlmdCA7OworCisJCSMgLWYgYWxsb3dzIHlvdSB0byBzZWxlY3QgYSBtYWtlZmlsZSBuYW1lCisJCS1mKQorCQkJTUFLRT0kMgorCQkJc2hpZnQ7IHNoaWZ0IDs7CisKKwkJIyB0aGUgLXAgZmxhZyBwcm9kdWNlcyAicHJvZ3JhbTogcHJvZ3JhbS5jIiBzdHlsZSBkZXBlbmRlbmNpZXMKKwkJIyBzbyAubydzIGRvbid0IGdldCBwcm9kdWNlZAorCQktcCkKKwkJCVNFRD0ncztcLm87OycKKwkJCXNoaWZ0IDs7CisJCSopCisJCQlicmVhayA7OworCWVzYWMKK2RvbmUKKworaWYgWyAkIyA9IDAgXSA7IHRoZW4KKwllY2hvICd1c2FnZTogbWtkZXAgWy1wXSBbLWMgY2NdIFstZiBtYWtlZmlsZV0gW2ZsYWdzXSBmaWxlIC4uLicKKwlleGl0IDEKK2ZpCisKK2lmIFsgISAtdyAkTUFLRSBdOyB0aGVuCisJZWNobyAibWtkZXA6IG5vIHdyaXRlYWJsZSBmaWxlIFwiJE1BS0VcIiIKKwlleGl0IDEKK2ZpCisKK1RNUD0vdG1wL21rZGVwJCQKKwordHJhcCAncm0gLWYgJFRNUCA7IGV4aXQgMScgMSAyIDMgMTMgMTUKKworY3AgJE1BS0UgJHtNQUtFfS5iYWsKKworc2VkIC1lICcvRE8gTk9UIERFTEVURSBUSElTIExJTkUvLCRkJyA8ICRNQUtFID4gJFRNUAorCitjYXQgPDwgX0VPRl8gPj4gJFRNUAorIyBETyBOT1QgREVMRVRFIFRISVMgTElORSAtLSBta2RlcCB1c2VzIGl0LgorIyBETyBOT1QgUFVUIEFOWVRISU5HIEFGVEVSIFRISVMgTElORSwgSVQgV0lMTCBHTyBBV0FZLgorCitfRU9GXworCisjIElmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBoYXZlIC1NLCBhZGQgaXQuICBJZiB5b3UgY2FuJ3QsIHRoZSBuZXh0IHR3bworIyBsaW5lcyB3aWxsIHRyeSBhbmQgcmVwbGFjZSB0aGUgImNjIC1NIi4gIFRoZSByZWFsIHByb2JsZW0gaXMgdGhhdCB0aGlzCisjIGhhY2sgY2FuJ3QgZGVhbCB3aXRoIGFueXRoaW5nIHRoYXQgcmVxdWlyZXMgYSBzZWFyY2ggcGF0aCwgYW5kIGRvZXNuJ3QKKyMgZXZlbiB0cnkgZm9yIGFueXRoaW5nIHVzaW5nIGJyYWNrZXQgKDw+KSBzeW50YXguCisjCisjIGVncmVwICdeI2luY2x1ZGVbIAldKiIuKiInIC9kZXYvbnVsbCAkKiB8CisjIHNlZCAtZSAncy86W14iXSoiXChbXiJdKlwpIi4qLzogXDEvJyAtZSAncy9cLmMvLm8vJyB8CisKKyMgWFhYIHRoaXMgZG9lc24ndCB3b3JrIHdpdGggdGhpbmdzIGxpa2UgIi1EREVDTFdBSVRTVEFUVVM9dW5pb25cIHdhaXQiCiskQ0MgLU0gJCogfAorc2VkICIKKwlzOyBcLi87IDtnCisJJFNFRCIgfAorYXdrICd7CisJaWYgKCQxICE9IHByZXYpIHsKKwkJaWYgKHJlYyAhPSAiIikKKwkJCXByaW50IHJlYzsKKwkJcmVjID0gJDA7CisJCXByZXYgPSAkMTsKKwl9CisJZWxzZSB7CisJCWlmIChsZW5ndGgocmVjICQyKSA+IDc4KSB7CisJCQlwcmludCByZWM7CisJCQlyZWMgPSAkMDsKKwkJfQorCQllbHNlCisJCQlyZWMgPSByZWMgIiAiICQyCisJfQorfQorRU5EIHsKKwlwcmludCByZWMKK30nID4+ICRUTVAKKworY2F0IDw8IF9FT0ZfID4+ICRUTVAKKworIyBJRiBZT1UgUFVUIEFOWVRISU5HIEhFUkUgSVQgV0lMTCBHTyBBV0FZCitfRU9GXworCisjIGNvcHkgdG8gcHJlc2VydmUgcGVybWlzc2lvbnMKK2NwICRUTVAgJE1BS0UKK3JtIC1mICR7TUFLRX0uYmFrICRUTVAKK2V4aXQgMApkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9tc2Rvcy9iaW4yYy5jIGIvbGlicGNhcC0xLjMuMC9tc2Rvcy9iaW4yYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MjA1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL21zZG9zL2JpbjJjLmMKQEAgLTAsMCArMSw0MyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKyNpbmNsdWRlIDxzdGRhcmcuaD4NCisjaW5jbHVkZSA8dGltZS5oPg0KKw0KK3N0YXRpYyB2b2lkIEFib3J0IChjaGFyICpmbXQsLi4uKQ0KK3sNCisgIHZhX2xpc3QgYXJnczsNCisgIHZhX3N0YXJ0IChhcmdzLCBmbXQpOw0KKyAgdmZwcmludGYgKHN0ZGVyciwgZm10LCBhcmdzKTsNCisgIHZhX2VuZCAoYXJncyk7DQorICBleGl0ICgxKTsNCit9DQorDQoraW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikNCit7DQorICBGSUxFICAqaW5GaWxlOw0KKyAgRklMRSAgKm91dEZpbGUgPSBzdGRvdXQ7DQorICB0aW1lX3Qgbm93ICAgICA9IHRpbWUgKE5VTEwpOw0KKyAgaW50ICAgIGNoLCBpOw0KKw0KKyAgaWYgKGFyZ2MgIT0gMikNCisgICAgIEFib3J0ICgiVXNhZ2U6ICVzIGJpbi1maWxlIFs+IHJlc3VsdF0iLCBhcmd2WzBdKTsNCisNCisgIGlmICgoaW5GaWxlID0gZm9wZW4oYXJndlsxXSwicmIiKSkgPT0gTlVMTCkNCisgICAgIEFib3J0ICgiQ2Fubm90IG9wZW4gJXNcbiIsIGFyZ3ZbMV0pOw0KKw0KKyAgZnByaW50ZiAob3V0RmlsZSwNCisgICAgICAgICAgICIvKiBkYXRhIHN0YXRlbWVudHMgZm9yIGZpbGUgJXMgYXQgJS4yNHMgKi9cbiINCisgICAgICAgICAgICIvKiBHZW5lcmF0ZWQgYnkgQklOMkMsIEcuVmFuZW0gMTk5NSAqL1xuIiwNCisgICAgICAgICAgIGFyZ3ZbMV0sIGN0aW1lKCZub3cpKTsNCisNCisgIGkgPSAwOw0KKyAgd2hpbGUgKChjaCA9IGZnZXRjKGluRmlsZSkpICE9IEVPRikNCisgIHsNCisgICAgaWYgKGkrKyAlIDEyID09IDApDQorICAgICAgIGZwdXRzICgiXG4gICIsIG91dEZpbGUpOw0KKyAgICBmcHJpbnRmIChvdXRGaWxlLCAiMHglMDJYLCIsIGNoKTsNCisgIH0NCisgIGZwdXRjICgnXG4nLCBvdXRGaWxlKTsNCisgIGZjbG9zZSAoaW5GaWxlKTsNCisgIHJldHVybiAoMCk7DQorfQ0KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvbXNkb3MvY29tbW9uLmRqIGIvbGlicGNhcC0xLjMuMC9tc2Rvcy9jb21tb24uZGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2NGQxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvY29tbW9uLmRqCkBAIC0wLDAgKzEsODAgQEAKKyMKKyMgQ29tbW9uIGRlZmluZXMgZm9yIGxpYnBjYXAgYW5kIDE2LzMyLWJpdCBuZXR3b3JrIGRyaXZlcnMgKGRqZ3BwKQorIworIyBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL21zZG9zL2NvbW1vbi5kaix2IDEuMiAyMDA0LTEyLTE5IDE5OjM2OjMzIGd1eSBFeHAgJCAoTEJMKQorCisuU1VGRklYRVM6IC5leGUgLndsbSAuZHhlIC5sIC55CisuUEhPTlk6ICAgIGNoZWNrX2djY2xpYgorCitkZWZhdWx0OiBjaGVja19nY2NsaWIgYWxsCisKK0dDQ0xJQiAgID0gL2RqZ3BwL2xpYi9nY2MtbGliL2RqZ3BwLzMuMzEKK01BS0VGSUxFID0gTWFrZWZpbGUuZGoKKworIworIyBETFggMi45MSsgbGliLiBDaGFuZ2UgcGF0aCB0byBzdWl0ZS4KKyMgTm90IHVzZWQgYW55bW9yZS4gVXNlcyBEWEUzIG5vdy4KKyMKKyMgRExYX0xJQiAgPSAkKERKRElSKS9jb250cmliL2RseC4yOTEvbGliZGx4LmEKKyMgRExYX0xJTksgPSAkKERKRElSKS9iaW4vZGx4Z2VuLmV4ZQorCitXQVRUMzJfUk9PVCA9ICQoc3Vic3QgXCwvLCQoV0FUVF9ST09UKSkKKworCitpZmVxICgkKHdpbGRjYXJkICQoR0NDTElCKS9saWJnY2MuYSksKQorY2hlY2tfZ2NjbGliOgorCUBlY2hvIGxpYmdjYy5hIG5vdCBmb3VuZC4gU2V0IFwiJChHQ0NMSUIpXCIgdG8gXCIvZGpncHAvbGliL2djYy1saWIvZGpncHAvMy5YXCIKK2VuZGlmCisKKworIworIyBJbmNsdWRlIDMyLWJpdCBkcml2ZXIgc3VwcG9ydAorIworVVNFXzMyQklUX0RSSVZFUlMgPSAwCisKKyMKKyMgVXNlIGxvYWRhYmxlIGRyaXZlciBtb2R1bGVzIGluc3RlYWQgb2Ygc3RhdGljYWxseSBsaW5raW5nCisjIGFsbCBkcml2ZXJzLgorIworVVNFXzMyQklUX01PRFVMRVMgPSAwCisKKyMKKyMgUHV0IGludGVycnVwdCBzZW5zaXRpdmUgY29kZS9kYXRhIGluIGxvY2tlZCBzZWN0aW9ucworIyBEbyBgbWFrZSBjbGVhbicgaW4gYWxsIGFmZmVjdGVkIGRpcmVjdG9yaWVzIGFmdGVyIGNoYW5naW5nIHRoaXMuCisjCitVU0VfU0VDVElPTl9MT0NLSU5HID0gMAorCisjCisjIFNldCB0byAxIHRvIHVzZSBleGNlcHRpb24gaGFuZGxlciBsaWIgKG9ubHkgZm9yIG1lKQorIworVVNFX0VYQ0VQVCA9IDAKKworQ0MgICA9IGdjYy5leGUKK0xEICAgPSBsZC5leGUKK0FTTSAgPSBuYXNtLmV4ZSAtZmJpbiAtZERFQlVHCitZQUNDID0gYmlzb24uZXhlCitMRVggID0gZmxleC5leGUKKworQ0ZMQUdTID0gLWcgLWdjb2ZmIC1PMiAtV2FsbCAtSS4gLUkkKFdBVFQzMl9ST09UKS9pbmMKKworaWZlcSAoJChVU0VfRVhDRVBUKSwxKQorICBDRkxBR1MgKz0gLURVU0VfRVhDRVBUCisgIEVYQ19MSUIgPSBkOi9wcm9nL213L2V4Y2VwdC9saWIvbGliZXhjLmEKK2VuZGlmCisKK2lmZXEgKCQoVVNFX1NFQ1RJT05fTE9DS0lORyksMSkKKyAgQ0ZMQUdTICs9IC1EVVNFX1NFQ1RJT05fTE9DS0lORworZW5kaWYKKworaWZlcSAoJChVU0VfMzJCSVRfRFJJVkVSUyksMSkKKyAgQ0ZMQUdTICs9IC1EVVNFXzMyQklUX0RSSVZFUlMKK2VuZGlmCisKKyUubzogJS5jCisJJChDQykgLWMgJChDRkxBR1MpICQ8CisJQGVjaG8KKworJS5vOiAlLnMKKwkkKENDKSAtYyAkKENGTEFHUykgLXggYXNzZW1ibGVyLXdpdGgtY3BwIC1vICRAICQ8CisJQGVjaG8KKwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9tc2Rvcy9tYWtlZmlsZSBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvbWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiNGU3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvbWFrZWZpbGUKQEAgLTAsMCArMSwxODQgQEAKKyMNCisjICBNYWtlZmlsZSBmb3IgZG9zLWxpYnBjYXAuIE5CLiBUaGlzIG1ha2VmaWxlIHJlcXVpcmVzIGEgQm9ybGFuZA0KKyMgIGNvbXBhdGlibGUgbWFrZSB0b29sLg0KKyMNCisjICBUYXJnZXRzOg0KKyMgICAgQm9ybGFuZCBDIDQuMCsgICAgICAoRE9TIGxhcmdlIG1vZGVsKQ0KKyMgICAgTWV0YXdhcmUgSGlnaEMgMy4zKyAoUGhhckxhcCAzODZ8RG9zWCkNCisjDQorDQorLkFVVE9ERVBFTkQNCisuU1dBUA0KKw0KKyFpZiAiJChXQVRUX1JPT1QpIiA9PSAiIg0KKyFlcnJvciBFbnZpcm9ubWVudCB2YXJpYWJsZSAiV0FUVF9ST09UIiBub3Qgc2V0Lg0KKyFlbmRpZg0KKw0KK1dBVFRfSU5DID0gJChXQVRUX1JPT1QpXGluYw0KKw0KK0RFRlMgICA9IC1ETVNET1MgLURERUJVRyAtRE5ESVNfREVCVUcgLURfVV89IC1EaW5saW5lPSBcDQorICAgICAgICAgLURIQVZFX1NUUkVSUk9SIC1ESEFWRV9MSU1JVFNfSA0KKw0KK0FTTSAgICA9IHRhc20uZXhlIC10IC1sIC1teCAtbTIgLURERUJVRw0KKw0KK1NPVVJDRSA9IGdyYW1tYXIuYyAgc2Nhbm5lci5jIGJwZl9maWx0LmMgYnBmX2ltYWcuYyBicGZfZHVtcC5jIFwNCisgICAgICAgICBldGhlcmVudC5jIGdlbmNvZGUuYyBuYW1ldG9hZC5jIHBjYXAtZG9zLmMgb3B0aW1pemUuYyBcDQorICAgICAgICAgc2F2ZWZpbGUuYyBwY2FwLmMgaW5ldC5jIG1zZG9zXG5kaXMyLmMgbXNkb3NccGt0ZHJ2ci5jIFwNCisgICAgICAgICBtaXNzaW5nXHNucHJpbnRmLmMNCisNCitCT1JMQU5EX09CSiA9ICQoU09VUkNFOi5jPS5vYmopIG1zZG9zXHBrdF9yeDAub2JqIG1zZG9zXG5kaXNfMC5vYmoNCisNCitISUdIQ19PQkogICA9ICQoU09VUkNFOi5jPS5vMzIpIG1zZG9zXHBrdF9yeDAubzMyDQorDQorYWxsOg0KKyAgICAgICAgICAgIEBlY2hvIFVzYWdlOiBtYWtlIHBjYXBfYmMubGliIG9yIHBjYXBfaGMubGliDQorDQorDQorcGNhcF9iYy5saWI6IGJjYy5hcmcgJChCT1JMQU5EX09CSikgcGNhcF9iYw0KKw0KKw0KK3BjYXBfaGMubGliOiBoYzM4Ni5hcmcgJChISUdIQ19PQkopDQorICAgICAgICAgICAgMzg2bGliICQ8IEAmJnwNCisgICAgICAgICAgICAgICAtbm93YXJuIC1ub2JhY2t1cCAtdHdvY2FzZSAtcmVwbGFjZSAkKEhJR0hDX09CSikNCit8DQorDQorcGNhcF9iYzogICAgJChCT1JMQU5EX09CSikNCisgICAgICAgICAgICBAdGxpYiBwY2FwX2JjLmxpYiAvQyBAJiZ8DQorICAgICAgICAgICAgICAgLSskKCoqOi5vYmo9LSspDQorfA0KKw0KKy5jLm9iajoNCisgICAgICAgICAgICBiY2MuZXhlIEBiY2MuYXJnIC1vJCoub2JqICQqLmMNCisNCisuYy5vMzI6DQorICAgICAgICAgICAgaGMzODYuZXhlIEBoYzM4Ni5hcmcgLW8gJCoubzMyICQqLmMNCisNCisuYXNtLm9iajoNCisgICAgICAgICAgICAkKEFTTSkgJCouYXNtLCAkKi5vYmoNCisNCisuYXNtLm8zMjoNCisgICAgICAgICAgICAkKEFTTSkgLURET1NYPTEgJCouYXNtLCAkKi5vMzINCisNCitzY2FubmVyLmM6IHNjYW5uZXIubA0KKyAgICAgICAgICAgIGZsZXggLVBwY2FwXyAtNyAtb3NjYW5uZXIuYyBzY2FubmVyLmwNCisNCitncmFtbWFyLmMgdG9rZGVmcy5oOiBncmFtbWFyLnkNCisgICAgICAgICAgICBiaXNvbiAtLW5hbWUtcHJlZml4PXBjYXBfIC0teWFjYyAtLWRlZmluZXMgZ3JhbW1hci55DQorICAgICAgICAgICAgLSBAZGVsIGdyYW1tYXIuYw0KKyAgICAgICAgICAgIC0gQGRlbCB0b2tkZWZzLmgNCisgICAgICAgICAgICByZW4geV90YWIuYyBncmFtbWFyLmMNCisgICAgICAgICAgICByZW4geV90YWIuaCB0b2tkZWZzLmgNCisNCitiY2MuYXJnOiAgICBtc2Rvc1xNYWtlZmlsZQ0KKyAgICAgICAgICAgIEBjb3B5ICYmfA0KKyAgICAgICAgICAgICAgJChERUZTKSAtbWwgLWMgLXYgLTMgLU8yIC1wbyAtUlQtIC13LQ0KKyAgICAgICAgICAgICAgLUkkKFdBVFRfSU5DKSAtSS4gLUkuXG1zZG9zXHBtX2RydnIgLUg9JChURU1QKVxiY2Muc3ltDQorfCAkPA0KKw0KK2hjMzg2LmFyZzogIG1zZG9zXE1ha2VmaWxlDQorICAgICAgICAgICAgQGNvcHkgJiZ8DQorICAgICAgICAgICAgIyAtRFVTRV8zMkJJVF9EUklWRVJTDQorICAgICAgICAgICAgICAkKERFRlMpIC1ERE9TWD0xIC13MyAtYyAtZyAtTzUNCisgICAgICAgICAgICAgIC1JJChXQVRUX0lOQykgLUkuIC1JLlxtc2Rvc1xwbV9kcnZyDQorICAgICAgICAgICAgICAtSHN1ZmZpeD0ubzMyDQorICAgICAgICAgICAgICAtSG5vY29weXINCisgICAgICAgICAgICAgIC1IcHJhZ21hPU9mZndhcm4oNDkxLDU1Myw1NzIpDQorICAgICAgICAgICAgICAtSG9uPVJlY29nbml6ZV9saWJyYXJ5ICAjIG1ha2UgbWVtY3B5L3N0cmxlbiBldGMuIGlubGluZQ0KKyAgICAgICAgICAgICAgLUhvZmY9QmVoYXZlZCAgICAgICAgICAgIyB0dXJuIG9mZiBzb21lIG9wdGltaXNlciB3YXJuaW5ncw0KK3wgJDwNCisNCitjbGVhbjoNCisgICAgICAgICAgICBAZGVsICoub2JqDQorICAgICAgICAgICAgQGRlbCAqLm8zMg0KKyAgICAgICAgICAgIEBkZWwgKi5sc3QNCisgICAgICAgICAgICBAZGVsICoubWFwDQorICAgICAgICAgICAgQGRlbCBiY2MuYXJnDQorICAgICAgICAgICAgQGRlbCBoYzM4Ni5hcmcNCisgICAgICAgICAgICBAZGVsIGdyYW1tYXIuYw0KKyAgICAgICAgICAgIEBkZWwgdG9rZGVmcy5oDQorICAgICAgICAgICAgQGRlbCBzY2FubmVyLmMNCisgICAgICAgICAgICBAZWNobyBDbGVhbmVkDQorDQorIw0KKyMgZGVwZW5kZW5jaWVzDQorIyAgICAgICAgICAgICANCitwa3RfcngwLm9iajogIG1zZG9zXHBrdF9yeDAuYXNtDQorDQorYnBmX2ZpbHQub2JqOiBicGZfZmlsdC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ251Yy5oDQorDQorYnBmX2ltYWcub2JqOiBicGZfaW1hZy5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCisNCiticGZfZHVtcC5vYmo6IGJwZl9kdW1wLmMgcGNhcC5oIHBjYXAtYnBmLmgNCisNCitldGhlcmVudC5vYmo6IGV0aGVyZW50LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBwY2FwLW5hbWVkYi5oDQorDQorb3B0aW1pemUub2JqOiBvcHRpbWl6ZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oDQorDQorc2F2ZWZpbGUub2JqOiBzYXZlZmlsZS5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCisNCitwY2FwLm9iajogcGNhcC5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KK2luZXQub2JqOiBpbmV0LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KK2dyYW1tYXIub2JqOiBncmFtbWFyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXA0KKyAgcGYuaCBwY2FwLW5hbWVkYi5oDQorDQorc2Nhbm5lci5vYmo6IHNjYW5uZXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBcDQorICBwY2FwLW5hbWVkYi5oIHRva2RlZnMuaA0KKw0KK2dlbmNvZGUub2JqOiBnZW5jb2RlLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIFwNCisgIGV0aGVydHlwZS5oIG5scGlkLmggbGxjLmggZ2VuY29kZS5oIGF0bXVuaTMxLmggc3VuYXRtcG9zLmggcHBwLmggc2xsLmggXA0KKyAgYXJjbmV0LmggcGYuaCBwY2FwLW5hbWVkYi5oDQorDQorbmFtZXRvYWQub2JqOiBuYW1ldG9hZC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwNCisgIHBjYXAtbmFtZWRiLmggZXRoZXJ0eXBlLmgNCisNCitwY2FwLWRvcy5vYmo6IHBjYXAtZG9zLmMgcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1kb3MuaCBwY2FwLWludC5oIFwNCisgIG1zZG9zXHBrdGRydnIuaA0KKw0KK3BrdGRydnIub2JqOiBtc2Rvc1xwa3RkcnZyLmMgZ251Yy5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBcDQorICBwY2FwLmggcGNhcC1icGYuaCBtc2Rvc1xwa3RkcnZyLmggbXNkb3NccGt0X3N0dWIuaW5jDQorDQorbmRpczIub2JqOiBtc2Rvc1xuZGlzMi5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBcDQorICBtc2Rvc1xuZGlzMi5oDQorDQorcGt0X3J4MC5vMzI6ICBtc2Rvc1xwa3RfcngwLmFzbQ0KKw0KK2JwZl9maWx0Lm8zMjogYnBmX2ZpbHQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdudWMuaA0KKw0KK2JwZl9pbWFnLm8zMjogYnBmX2ltYWcuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQorDQorYnBmX2R1bXAubzMyOiBicGZfZHVtcC5jIHBjYXAuaCBwY2FwLWJwZi5oDQorDQorZXRoZXJlbnQubzMyOiBldGhlcmVudC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1uYW1lZGIuaA0KKw0KK29wdGltaXplLm8zMjogb3B0aW1pemUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaA0KKw0KK3NhdmVmaWxlLm8zMjogc2F2ZWZpbGUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQorDQorcGNhcC5vMzI6IHBjYXAuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCisNCitpbmV0Lm8zMjogaW5ldC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCisNCitncmFtbWFyLm8zMjogZ3JhbW1hci5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oIFwNCisgIHBmLmggcGNhcC1uYW1lZGIuaA0KKw0KK3NjYW5uZXIubzMyOiBzY2FubmVyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggXA0KKyAgcGNhcC1uYW1lZGIuaCB0b2tkZWZzLmgNCisNCitnZW5jb2RlLm8zMjogZ2VuY29kZS5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBcDQorICBldGhlcnR5cGUuaCBubHBpZC5oIGxsYy5oIGdlbmNvZGUuaCBhdG11bmkzMS5oIHN1bmF0bXBvcy5oIHBwcC5oIHNsbC5oIFwNCisgIGFyY25ldC5oIHBmLmggcGNhcC1uYW1lZGIuaA0KKw0KK25hbWV0b2FkLm8zMjogbmFtZXRvYWQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBcDQorICBwY2FwLW5hbWVkYi5oIGV0aGVydHlwZS5oDQorDQorcGNhcC1kb3MubzMyOiBwY2FwLWRvcy5jIHBjYXAuaCBwY2FwLWJwZi5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBcDQorICBtc2Rvc1xwa3RkcnZyLmgNCisNCitwa3RkcnZyLm8zMjogbXNkb3NccGt0ZHJ2ci5jIGdudWMuaCBwY2FwLWRvcy5oIHBjYXAtaW50LmggXA0KKyAgcGNhcC5oIHBjYXAtYnBmLmggbXNkb3NccGt0ZHJ2ci5oIG1zZG9zXHBrdF9zdHViLmluYw0KKw0KK25kaXMyLm8zMjogbXNkb3NcbmRpczIuYyBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggXA0KKyAgbXNkb3NcbmRpczIuaA0KKw0KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvbXNkb3MvbWFrZWZpbGUuZGogYi9saWJwY2FwLTEuMy4wL21zZG9zL21ha2VmaWxlLmRqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZTU4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL21zZG9zL21ha2VmaWxlLmRqCkBAIC0wLDAgKzEsMTUyIEBACisjCisjIEdOVSBNYWtlZmlsZSBmb3IgRE9TLWxpYnBjYXAuIGRqZ3BwIHZlcnNpb24uCisjCisjIFVzZSB0aGlzIG1ha2VmaWxlIGZyb20gdGhlIGxpYnBjYXAgcm9vdCBkaXJlY3RvcnkuCisjIEUuZy4gbGlrZSB0aGlzOgorIworIyAgYzpcbmV0XHBjYXA+IG1ha2UgLWYgbXNkb3MvbWFrZWZpbGUuZGoKKyMKKyMgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9tc2Rvcy9tYWtlZmlsZS5kaix2IDEuMiAyMDA0LTEyLTE5IDE5OjQxOjA2IGd1eSBFeHAgJCAoTEJMKQorCitWUEFUSCA9IG1pc3NpbmcgbXNkb3MKKworUFJFUkVRVUlTSVRFUyA9IHNjYW5uZXIuYyBncmFtbWFyLmMgdG9rZGVmcy5oIHZlcnNpb24uaCBtc2Rvcy9wa3Rfc3R1Yi5pbmMKKworaW5jbHVkZSBtc2Rvcy9jb21tb24uZGoKKworRFJJVkVSX0RJUiA9IC4vbXNkb3MvcG1fZHJ2cgorCitDRkxBR1MgKz0gLURERUJVRyAtRE5ESVNfREVCVUcgLURIQVZFX0xJTUlUU19IIC1ESEFWRV9TVFJFUlJPUiBcCisgICAgICAgICAgLURfVV89J19fYXR0cmlidXRlX18oKHVudXNlZCkpJyAtREhBVkVfVkVSU0lPTl9ICisKKyMgQ0ZMQUdTICs9IC1EeXlsdmFsPXBjYXBfbHZhbCAtREJERUJVRyAtRE5ERUJVRworCitTT1VSQ0VTID0gZ3JhbW1hci5jIHNjYW5uZXIuYyBicGZfZmlsdC5jIGJwZl9pbWFnLmMgYnBmX2R1bXAuYyAgIFwKKyAgICAgICAgICBldGhlcmVudC5jIGdlbmNvZGUuYyBuYW1ldG9hZC5jIHBjYXAtZG9zLmMgb3B0aW1pemUuYyAgXAorICAgICAgICAgIHNhdmVmaWxlLmMgcGNhcC5jIGluZXQuYyBtc2Rvc1xwa3RkcnZyLmMgbXNkb3MvbmRpczIuYyBcCisgICAgICAgICAgbWlzc2luZy9zbnByaW50Zi5jCisKK09CSkVDVFMgPSAkKG5vdGRpciAkKFNPVVJDRVM6LmM9Lm8pKQorVEVNUEJJTiA9IHRtcC5iaW4KKworaWZlcSAoJChVU0VfMzJCSVRfRFJJVkVSUyksMSkKKyAgUE1fT0JKRUNUUyA9ICQoYWRkcHJlZml4ICQoRFJJVkVSX0RJUikvLCBcCisgICAgICAgICAgICAgICAgIHByaW50ay5vIHBjaS5vIHBjaS1zY2FuLm8gYmlvczMyLm8gZG1hLm8gaXJxLm8gaW50d3JhcC5vIFwKKyAgICAgICAgICAgICAgICAgbG9jay5vIGttYWxsb2MubyBxdWlya3MubyB0aW1lci5vIG5ldF9pbml0Lm8pCisgICMKKyAgIyBTdGF0aWMgbGluayBvZiBkcml2ZXJzCisgICMKKyAgaWZlcSAoJChVU0VfMzJCSVRfTU9EVUxFUyksMCkKKyAgICBQTV9PQkpFQ1RTICs9ICQoYWRkcHJlZml4ICQoRFJJVkVSX0RJUikvLCBcCisgICAgICAgICAgICAgICAgICAgIGFjY3Rvbi5vIDgzOTAubyAzYzUwMy5vIDNjNTA5Lm8gM2M1OXgubyAzYzUxNS5vIFwKKyAgICAgICAgICAgICAgICAgICAgM2M1NzVfY2IubyAzYzkweC5vIG5lLm8gd2QubyBjczg5eDAubyBydGw4MTM5Lm8pCisgIGVuZGlmCitlbmRpZgorCithbGw6IGxpYnBjYXAuYQorCitpZmVxICgkKFVTRV8zMkJJVF9EUklWRVJTKSwxKQorJChQTV9PQkpFQ1RTKToKKwkkKE1BS0UpIC1mIE1ha2VmaWxlLmRqIC1DICQoRFJJVkVSX0RJUikgJChub3RkaXIgJEApCitlbmRpZgorCitsaWJwY2FwLmE6IHZlcnNpb24uaCAkKE9CSkVDVFMpICQoUE1fT0JKRUNUUykKKwlybSAtZiAkQAorCWFyIHJzICRAICReCisKK21zZG9zL3BrdF9zdHViLmluYzogbXNkb3MvYmluMmMuZXhlIG1zZG9zL3BrdF9yeDEuUworCSQoQVNNKSAtbyAkKFRFTVBCSU4pIC1sbXNkb3MvcGt0X3J4MS5sc3QgbXNkb3MvcGt0X3J4MS5TCisJLi9tc2Rvcy9iaW4yYyAkKFRFTVBCSU4pID4gJEAKKwlybSAtZiAkKFRFTVBCSU4pCisKK2dyYW1tYXIuYyB0b2tkZWZzLmg6IGdyYW1tYXIueQorCXJtIC1mIGdyYW1tYXIuYyB0b2tkZWZzLmgKKwkkKFlBQ0MpIC0tbmFtZS1wcmVmaXg9cGNhcF8gLS15YWNjIC0tZGVmaW5lcyBncmFtbWFyLnkKKwltdiAtZiB5X3RhYi5jIGdyYW1tYXIuYworCW12IC1mIHlfdGFiLmggdG9rZGVmcy5oCisKK3ZlcnNpb24uaDogLi9WRVJTSU9OCisJQGVjaG8gJy8qIEdlbmVyYXRlZCBmcm9tIFZFUlNJT04uIERvIG5vdCBlZGl0ICovJyA+ICRACisJc2VkIC1lICdzLy4qL3N0YXRpYyBjaGFyIHBjYXBfdmVyc2lvbl9zdHJpbmdbXSA9ICJsaWJwY2FwICgmKSI7LycgLi9WRVJTSU9OID4+ICRACisKK3NjYW5uZXIuYzogc2Nhbm5lci5sCisJJChMRVgpIC1QcGNhcF8gLTcgLXQgJF4gPiAkQAorCUBlY2hvCisKK21zZG9zL2JpbjJjLmV4ZTogbXNkb3MvYmluMmMuYworCSQoQ0MpICQqLmMgLW8gJCouZXhlCisKK2NsZWFuOgorCSQoTUFLRSkgLWYgTWFrZWZpbGUuZGogLUMgJChEUklWRVJfRElSKSBjbGVhbgorCSQoTUFLRSkgLWYgTWFrZWZpbGUuZGogLUMgbGliY3BjYXAgY2xlYW4KKwlybSAtZiAkKE9CSkVDVFMpIG1zZG9zL3BrdF9yeDEubHN0IE1ha2VmaWxlLmJhayAkKFBSRVJFUVVJU0lURVMpCisKK3ZjbGVhbjogY2xlYW4KKwlybSAtZiBsaWJwY2FwLmEgbXNkb3MvYmluMmMuZXhlCisKKyMKKyMgR2VuZXJhdGVkIGRlcGVuZGVuY2llczsgRHVlIHRvIHNvbWUgaGFja3MgaW4gZ2NjIDIuOTUgYW5kIGRqZ3BwIDIuMDMKKyMgd2UgbXVzdCBwcmV2ZW50ICIkKERKRElSKS9iaW4vLi4vaW5jbHVkZS9zeXMvdmVyc2lvbi5oIiBmcm9tIGJlZWluZworIyBpbmNsdWRlZCBpbiBkZXBlbmRlbmN5IG91dHB1dCAob3IgZWxzZSB0aGlzIG1ha2VmaWxlIGNhbm5vdCBiZSB1c2VkIG9uCisjIGFub3RoZXIgbWFjaGluZSkuIFdlIHRoZXJlZm9yZSB1c2UgYSBzcGVjaWFsICdzcGVjcycgZmlsZSBkdXJpbmcKKyMgcHJlLXByb2Nlc3NpbmcuCisjCitNTV9TUEVDUyA9IHNwZWNzLnRtcAorTUFLRUZJTEUgPSBtc2Rvcy9NYWtlZmlsZS5kagorCitkZXBlbmQ6ICQoUFJFUkVRVUlTSVRFUykKKwlAZWNobyBHZW5lcmF0aW5nIGRlcGVuZGVuY2llcy4uCisJQGNwICQoTUFLRUZJTEUpIE1ha2VmaWxlLmJhaworCUBlY2hvICIqY3BwOiAlKGNwcF9jcHUpICV7cG9zaXg6LURfUE9TSVhfU09VUkNFfSAtcmVtYXAiID4gJChNTV9TUEVDUykKKwlzZWQgLWUgIi9eIyBETyBOT1QgREVMRVRFIFRISVMgTElORS8sJCRkIiA8IE1ha2VmaWxlLmJhayA+ICQoTUFLRUZJTEUpCisJZWNobyAiIyBETyBOT1QgREVMRVRFIFRISVMgTElORSIgICAgICAgICAgICAgICAgICAgICAgICA+PiAkKE1BS0VGSUxFKQorCSQoQ0MpIC1NTSAtc3BlY3M9JChNTV9TUEVDUykgJChDRkxBR1MpICQoU09VUkNFUykgICAgICAgPj4gJChNQUtFRklMRSkKKwlybSAtZiAkKE1NX1NQRUNTKQorCisjCisjIE1hbnVhbGx5IGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMKKyMgICAgICAgICAgICAgCittc2Rvcy9wa3RkcnZyLmM6IG1zZG9zL3BrdF9zdHViLmluYworc2Nhbm5lci5jOiBzY2FubmVyLmwKK2dyYW1tYXIuYyB0b2tkZWZzLmg6IGdyYW1tYXIueQorZ3JhbW1hci5oOiBncmFtbWFyLnkKK3NjYW5uZXIubDogcGNhcC1pbnQuaCBwY2FwLW5hbWVkYi5oIGdlbmNvZGUuaCBncmFtbWFyLmggZ251Yy5oCitncmFtbWFyLnk6IHBjYXAtaW50LmggZ2VuY29kZS5oIHBjYXAtbmFtZWRiLmggZ251Yy5oCisKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZGVwZW5kZW5jaWVzCisjCisjIERPIE5PVCBERUxFVEUgVEhJUyBMSU5FCitncmFtbWFyLm86IGdyYW1tYXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBwZi5oIFwKKyAgcGNhcC1uYW1lZGIuaAorc2Nhbm5lci5vOiBzY2FubmVyLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmggcGNhcC1uYW1lZGIuaCBcCisgIHRva2RlZnMuaAorYnBmX2ZpbHQubzogYnBmX2ZpbHQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdudWMuaAorYnBmX2ltYWcubzogYnBmX2ltYWcuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oCiticGZfZHVtcC5vOiBicGZfZHVtcC5jIHBjYXAuaCBwY2FwLWJwZi5oCitldGhlcmVudC5vOiBldGhlcmVudC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1uYW1lZGIuaAorZ2VuY29kZS5vOiBnZW5jb2RlLmMgcGNhcC1kb3MuaCBtc2Rvcy9wbV9kcnZyL2xvY2suaCBwY2FwLWludC5oIHBjYXAuaCBcCisgIHBjYXAtYnBmLmggZXRoZXJ0eXBlLmggbmxwaWQuaCBsbGMuaCBnZW5jb2RlLmggYXRtdW5pMzEuaCBzdW5hdG1wb3MuaCBcCisgIHBwcC5oIHNsbC5oIGFyY25ldC5oIHBmLmggcGNhcC1uYW1lZGIuaAorbmFtZXRvYWQubzogbmFtZXRvYWQuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCBcCisgIHBjYXAtbmFtZWRiLmggZXRoZXJ0eXBlLmgKK3BjYXAtZG9zLm86IHBjYXAtZG9zLmMgbXNkb3MvcG1fZHJ2ci9wbWRydnIuaCBtc2Rvcy9wbV9kcnZyL2lmYWNlLmggXAorICBtc2Rvcy9wbV9kcnZyL2xvY2suaCBtc2Rvcy9wbV9kcnZyL2lvcG9ydC5oIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBcCisgIHBjYXAuaCBwY2FwLWJwZi5oIG1zZG9zL3BtX2RydnIva21hbGxvYy5oIG1zZG9zL3BtX2RydnIvYml0b3BzLmggXAorICBtc2Rvcy9wbV9kcnZyL3RpbWVyLmggbXNkb3MvcG1fZHJ2ci9kbWEuaCBtc2Rvcy9wbV9kcnZyL2lycS5oIFwKKyAgbXNkb3MvcG1fZHJ2ci9wcmludGsuaCBtc2Rvcy9wbV9kcnZyL3BjaS5oIG1zZG9zL3BtX2RydnIvYmlvczMyLmggXAorICBtc2Rvcy9wbV9kcnZyL21vZHVsZS5oIG1zZG9zL3BtX2RydnIvM2M1MDEuaCBtc2Rvcy9wbV9kcnZyLzNjNTAzLmggXAorICBtc2Rvcy9wbV9kcnZyLzNjNTA5LmggbXNkb3MvcG1fZHJ2ci8zYzU5eC5oIG1zZG9zL3BtX2RydnIvM2M1MTUuaCBcCisgIG1zZG9zL3BtX2RydnIvM2M5MHguaCBtc2Rvcy9wbV9kcnZyLzNjNTc1X2NiLmggbXNkb3MvcG1fZHJ2ci9uZS5oIFwKKyAgbXNkb3MvcG1fZHJ2ci93ZC5oIG1zZG9zL3BtX2RydnIvYWNjdG9uLmggbXNkb3MvcG1fZHJ2ci9jczg5eDAuaCBcCisgIG1zZG9zL3BtX2RydnIvcnRsODEzOS5oIG1zZG9zL3BtX2RydnIvbmUyay1wY2kuaCBtc2Rvcy9wa3RkcnZyLmgKK29wdGltaXplLm86IG9wdGltaXplLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBnZW5jb2RlLmgKK3NhdmVmaWxlLm86IHNhdmVmaWxlLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaAorcGNhcC5vOiBwY2FwLmMgcGNhcC1kb3MuaCBtc2Rvcy9wbV9kcnZyL2xvY2suaCBwY2FwLWludC5oIHBjYXAuaCBcCisgIHBjYXAtYnBmLmgKK2luZXQubzogaW5ldC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgKK3BrdGRydnIubzogbXNkb3MvcGt0ZHJ2ci5jIGdudWMuaCBwY2FwLWRvcy5oIG1zZG9zL3BtX2RydnIvbG9jay5oIFwKKyAgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBtc2Rvcy9wa3RkcnZyLmggbXNkb3MvcGt0X3N0dWIuaW5jCituZGlzMi5vOiBtc2Rvcy9uZGlzMi5jIHBjYXAtZG9zLmggbXNkb3MvcG1fZHJ2ci9sb2NrLmggcGNhcC1pbnQuaCBwY2FwLmggXAorICBwY2FwLWJwZi5oIG1zZG9zL25kaXMyLmgKK3NucHJpbnRmLm86IG1pc3Npbmcvc25wcmludGYuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL21zZG9zL21ha2VmaWxlLndjIGIvbGlicGNhcC0xLjMuMC9tc2Rvcy9tYWtlZmlsZS53YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGQ1NjcyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9tc2Rvcy9tYWtlZmlsZS53YwpAQCAtMCwwICsxLDEzMSBAQAorIw0KKyMgIFdhdGNvbSBNYWtlZmlsZSBmb3IgZG9zLWxpYnBjYXAuDQorIw0KKyMgU3BlY2lmeSBNT0RFTCA9IGAzcicgb3IgYDNzJw0KKyMgU3BlY2lmeSBUQVJHRVQgPSBgcGhhcmxhcCcgb3IgYGRvczRnJw0KKyMNCisjIFVzZSB0aGlzIG1ha2VmaWxlIGZyb20gdGhlIGxpYnBjYXAgcm9vdCBkaXJlY3RvcnkuDQorIyBFLmcuIGxpa2UgdGhpczoNCisjDQorIyAgYzpcbmV0XHBjYXA+IHdtYWtlIC1mIG1zZG9zXG1ha2VmaWxlLndjDQorIw0KKw0KK01PREVMICA9IDNzDQorVEFSR0VUID0gZG9zNGcNCisNCitPQkpESVIgPSBtc2Rvc1wkKFRBUkdFVCkudyQoTU9ERUwpDQorTElCICAgID0gJChPQkpESVIpXHBjYXAubGliDQorDQorLkVYVEVOU0lPTlM6IC5sIC55DQorDQorREVGUyA9IC1kREVCVUcgLWRORElTX0RFQlVHIC1kX1VfPSAtZEhBVkVfTElNSVRTX0ggLWRIQVZFX1NUUkVSUk9SICYNCisgICAgICAgLWRIQVZFX1NOUFJJTlRGIC1kSEFWRV9WU05QUklOVEYNCisNCitDQyAgPSB3Y2MzODYuZXhlDQorQVNNID0gd2FzbS5leGUgLSQoTU9ERUwpICQoREVGUykgLWRET1NYIC1kRE9TNEdXIC16cSAtYnQ9ZG9zIC1mcj1udWwgLWQzIC1zDQorDQorT0JKUyA9ICQoT0JKRElSKVxncmFtbWFyLm9iaiAgJChPQkpESVIpXHNjYW5uZXIub2JqICAkKE9CSkRJUilccGNhcC5vYmogICAgICYNCisgICAgICAgJChPQkpESVIpXGJwZl9maWx0Lm9iaiAkKE9CSkRJUilcYnBmX2ltYWcub2JqICQoT0JKRElSKVxicGZfZHVtcC5vYmogJg0KKyAgICAgICAkKE9CSkRJUilcZXRoZXJlbnQub2JqICQoT0JKRElSKVxnZW5jb2RlLm9iaiAgJChPQkpESVIpXG5hbWV0b2FkLm9iaiAmDQorICAgICAgICQoT0JKRElSKVxwY2FwLWRvcy5vYmogJChPQkpESVIpXHBrdGRydnIub2JqICAkKE9CSkRJUilcb3B0aW1pemUub2JqICYNCisgICAgICAgJChPQkpESVIpXHNhdmVmaWxlLm9iaiAkKE9CSkRJUilcaW5ldC5vYmogICAgICQoT0JKRElSKVxuZGlzMi5vYmoNCisNCitDRkxBR1MgPSAkKERFRlMpICQoWVlERUZTKSAtSS4gLUkkKCV3YXR0X3Jvb3QpXGluYyAtSS5cbXNkb3NccG1fZHJ2ciAmDQorICAgICAgICAgLSQoTU9ERUwpIC1tZiAtemZmIC16Z2YgLXpxIC1idD1kb3MgLWZyPW51bCAtdzYgLWZwaSAgICAgICAgJg0KKyAgICAgICAgIC1vaWxydGYgLXptDQorDQorVEVNUEJJTiA9IHRtcC5iaW4NCisNCithbGw6ICQoT0JKRElSKSAkKE9CSkRJUilccGNhcC5saWINCisNCiskKE9CSkRJUik6DQorICAgICAgICAgIC0gbWtkaXIgJChPQkpESVIpDQorDQorJChPQkpESVIpXHBjYXAubGliOiAkKE9CSlMpIHdsaWIuYXJnDQorICAgICAgICAgIHdsaWIgLXEgLWIgLWMgJChPQkpESVIpXHBjYXAubGliIEB3bGliLmFyZw0KKw0KK3dsaWIuYXJnOiBtc2Rvc1xtYWtlZmlsZS53Yw0KKyAgICAgICAgICAlY3JlYXRlICReQA0KKyAgICAgICAgICBmb3IgJWYgaW4gKCQoT0JKUykpIGRvICVhcHBlbmQgJF5AICstICVmDQorDQorJChPQkpESVIpXHBrdGRydnIub2JqOiBtc2Rvc1xwa3Rfc3R1Yi5pbmMgbXNkb3NccGt0ZHJ2ci5jIGdudWMuaCAmDQorICBwY2FwLWRvcy5oIHBjYXAtaW50LmggcGNhcC5oIG1zZG9zXHBrdGRydnIuaA0KKyAgICAgICAgICAqJChDQykgJChDRkxBR1MpIG1zZG9zXHBrdGRydnIuYyAtZm89JEANCisNCiskKE9CSkRJUilcbmRpczIub2JqOiBtc2Rvc1xuZGlzMi5jDQorICAgICAgICAgICokKENDKSAkKENGTEFHUykgbXNkb3NcbmRpczIuYyAtZm89JEANCisNCisuRVJBU0UNCisuY3skKE9CSkRJUil9Lm9iajoNCisgICAgICAgICAgKiQoQ0MpICQoQ0ZMQUdTKSAkW0AgLWZvPSRADQorDQorZ3JhbW1hci5jIHRva2RlZnMuaDogZ3JhbW1hci55IA0KKyAgICAgICAgICBiaXNvbiAtLW5hbWUtcHJlZml4PXBjYXBfIC0teWFjYyAtLWRlZmluZXMgJFtADQorICAgICAgICAgIC0gQGRlbCBncmFtbWFyLmMNCisgICAgICAgICAgLSBAZGVsIHRva2RlZnMuaA0KKyAgICAgICAgICByZW4geV90YWIuYyBncmFtbWFyLmMNCisgICAgICAgICAgcmVuIHlfdGFiLmggdG9rZGVmcy5oDQorDQorc2Nhbm5lci5jOiBzY2FubmVyLmwNCisgICAgICAgICAgZmxleCAtUHBjYXBfIC03IC1vJEAgJFtADQorDQorbXNkb3NccGt0X3N0dWIuaW5jOiBiaW4yYy5leGUgbXNkb3NccGt0X3J4MS5TDQorICAgICAgICAgIG5hc20gLWZiaW4gLWRERUJVRyAtbyAkKFRFTVBCSU4pIC1sbXNkb3NccGt0X3J4MS5sc3QgbXNkb3NccGt0X3J4MS5TDQorICAgICAgICAgIGJpbjJjLmV4ZSAgJChURU1QQklOKSA+ICRADQorICAgICAgICAgIEBkZWwgJChURU1QQklOKQ0KKw0KK2JpbjJjLmV4ZTogbXNkb3NcYmluMmMuYw0KKyAgICAgICAgICB3Y2wgJFtADQorDQorY2xlYW4gcmVhbGNsZWFuIHZjbGVhbjogLlNZTUJPTElDDQorICAgICAgICAgIGZvciAlZiBpbiAoZG9zNGcudzNyIGRvczRnLnczcyBwaGFybGFwLnczciBwaGFybGFwLnczcykgZG8gJg0KKyAgICAgICAgICAgIEBkZWwgJWZcKi5vYmoNCisgICAgICAgICAgQGRlbCBncmFtbWFyLmMNCisgICAgICAgICAgQGRlbCB0b2tkZWZzLmgNCisgICAgICAgICAgQGRlbCBzY2FubmVyLmMNCisgICAgICAgICAgQGRlbCBiaW4yYy5leGUNCisgICAgICAgICAgQGRlbCBiaW4yYy5vYmoNCisgICAgICAgICAgQGRlbCBtc2Rvc1xwa3Rfc3R1Yi5pbmMNCisgICAgICAgICAgQGVjaG8gQ2xlYW5lZA0KKw0KKyMNCisjIGRlcGVuZGVuY2llcw0KKyMgICAgICAgICAgICAgICAgICAgICANCiskKE9CSkRJUilcYnBmX2ZpbHQub2JqOiBicGZfZmlsdC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ251Yy5oDQorDQorJChPQkpESVIpXGJwZl9pbWFnLm9iajogYnBmX2ltYWcuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oDQorDQorJChPQkpESVIpXGJwZl9kdW1wLm9iajogYnBmX2R1bXAuYyBwY2FwLmggcGNhcC1icGYuaA0KKw0KKyQoT0JKRElSKVxldGhlcmVudC5vYmo6IGV0aGVyZW50LmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCBwY2FwLW5hbS5oDQorDQorJChPQkpESVIpXG9wdGltaXplLm9iajogb3B0aW1pemUuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaA0KKw0KKyQoT0JKRElSKVxzYXZlZmlsZS5vYmo6IHNhdmVmaWxlLmMgcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KKyQoT0JKRElSKVxwY2FwLm9iajogcGNhcC5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaA0KKw0KKyQoT0JKRElSKVxpbmV0Lm9iajogaW5ldC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmgNCisNCiskKE9CSkRJUilcZ3JhbW1hci5vYmo6IGdyYW1tYXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCAmDQorICBwZi5oIHBjYXAtbmFtLmgNCisNCiskKE9CSkRJUilcc2Nhbm5lci5vYmo6IHNjYW5uZXIuYyBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oIGdlbmNvZGUuaCAmDQorICBwY2FwLW5hbS5oIHRva2RlZnMuaA0KKw0KKyQoT0JKRElSKVxnZW5jb2RlLm9iajogZ2VuY29kZS5jIHBjYXAtZG9zLmggcGNhcC1pbnQuaCBwY2FwLmggcGNhcC1icGYuaCAmDQorICBldGhlcnR5cC5oIG5scGlkLmggbGxjLmggZ2VuY29kZS5oIGF0bXVuaTMxLmggc3VuYXRtcG8uaCBwcHAuaCBzbGwuaCAmDQorICBhcmNuZXQuaCBwZi5oIHBjYXAtbmFtLmgNCisNCiskKE9CSkRJUilcbmFtZXRvYWQub2JqOiBuYW1ldG9hZC5jIHBjYXAtaW50LmggcGNhcC5oIHBjYXAtYnBmLmggZ2VuY29kZS5oICYNCisgIHBjYXAtbmFtLmggZXRoZXJ0eXAuaA0KKw0KKyQoT0JKRElSKVxwY2FwLWRvcy5vYmo6IHBjYXAtZG9zLmMgcGNhcC5oIHBjYXAtYnBmLmggcGNhcC1kb3MuaCBwY2FwLWludC5oICYNCisgIG1zZG9zXHBrdGRydnIuaA0KKw0KKyQoT0JKRElSKVxwa3RkcnZyLm9iajogbXNkb3NccGt0ZHJ2ci5jIGdudWMuaCBwY2FwLWRvcy5oIHBjYXAtaW50LmggJg0KKyAgcGNhcC5oIHBjYXAtYnBmLmggbXNkb3NccGt0ZHJ2ci5oIG1zZG9zXHBrdF9zdHViLmluYw0KKw0KKyQoT0JKRElSKVxuZGlzMi5vYmo6IG1zZG9zXG5kaXMyLmMgcGNhcC1kb3MuaCBwY2FwLWludC5oIHBjYXAuaCBwY2FwLWJwZi5oICYNCisgIG1zZG9zXG5kaXMyLmgNCisNCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL21zZG9zL25kaXMyLmMgYi9saWJwY2FwLTEuMy4wL21zZG9zL25kaXMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1ZWEyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvbmRpczIuYwpAQCAtMCwwICsxLDg2MCBAQAorLyogDQorICogQ29weXJpZ2h0IChjKSAxOTkzLDE5OTQNCisgKiAgICAgIFRleGFzIEEmTSBVbml2ZXJzaXR5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KKyAqIGFyZSBtZXQ6DQorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUNCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6DQorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IFRleGFzIEEmTSBVbml2ZXJzaXR5DQorICogICAgICBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4NCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQ0KKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KKyAqDQorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgVU5JVkVSU0lUWSBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQNCisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFVOSVZFUlNJVFkgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQ0KKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMDQorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMNCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikNCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVA0KKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkNCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GDQorICogU1VDSCBEQU1BR0UuDQorICoNCisgKiBEZXZlbG9wZXJzOg0KKyAqICAgICAgICAgICAgIERhdmlkIEsuIEhlc3MsIERvdWdsYXMgTGVlIFNjaGFsZXMsIERhdmlkIFIuIFNhZmZvcmQNCisgKg0KKyAqIEhlYXZpbHkgbW9kaWZpZWQgZm9yIE1ldGF3YXJlIEhpZ2hDICsgR05VIEMgMi44Kw0KKyAqICAgICAgICAgICAgIEdpc2xlIFZhbmVtIDE5OTgNCisgKi8NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPGRvcy5oPg0KKyNpbmNsdWRlIDxpby5oPg0KKyNpbmNsdWRlIDxmY250bC5oPg0KKyNpbmNsdWRlIDxtYWxsb2MuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorDQorI2luY2x1ZGUgInBjYXAtZG9zLmgiDQorI2luY2x1ZGUgInBjYXAtaW50LmgiDQorI2luY2x1ZGUgIm1zZG9zL25kaXMyLmgiDQorDQorI2lmIGRlZmluZWQoVVNFX05ESVMyKQ0KKw0KKy8qDQorICogIFBhY2tldCBidWZmZXIgaGFuZGxpbmcNCisgKi8NCitleHRlcm4gaW50ICAgICBGcmVlUGt0QnVmICAoUGt0QnVmICpidWYpOw0KK2V4dGVybiBpbnQgICAgIEVucXVlUGt0QnVmIChQa3RCdWYgKmJ1Zik7DQorZXh0ZXJuIFBrdEJ1ZiogQWxsb2NQa3RCdWYgKHZvaWQpOw0KKw0KKy8qDQorICogIFZhcmlvdXMgZGVmaW5lcw0KKyAqLw0KKyNkZWZpbmUgTUFYX05VTV9ERUJVR19TVFJJTkdTIDkwDQorI2RlZmluZSBERUJVR19TVFJJTkdfTEVOR1RIICAgODANCisjZGVmaW5lIFNUQUNLX1BPT0xfU0laRSAgICAgICA2DQorI2RlZmluZSBTVEFDS19TSVpFICAgICAgICAgICAgMjU2DQorDQorI2RlZmluZSBNRURJQV9GRERJICAgICAgICAgICAgMQ0KKyNkZWZpbmUgTUVESUFfRVRIRVJORVQgICAgICAgIDINCisjZGVmaW5lIE1FRElBX1RPS0VOICAgICAgICAgICAzDQorDQorc3RhdGljIGludCAgICAgc3RhcnREZWJ1ZyAgICAgPSAwOw0KK3N0YXRpYyBpbnQgICAgIHN0b3BEZWJ1ZyAgICAgID0gMDsNCisNCitzdGF0aWMgRFdPUkQgICBkcm9wcGVkUGFja2V0cyA9IDBMOw0KK3N0YXRpYyBXT1JEICAgIGZyYW1lU2l6ZSAgICAgID0gMDsNCitzdGF0aWMgV09SRCAgICBoZWFkZXJTaXplICAgICA9IDA7DQorc3RhdGljIGludCAgICAgbWVkaWFUeXBlICAgICAgPSAwOw0KK3N0YXRpYyBjaGFyICAgKmxhc3RFcnIgICAgICAgID0gTlVMTDsNCisNCitzdGF0aWMgQllURSAgICBkZWJ1Z1N0cmluZ3MgW01BWF9OVU1fREVCVUdfU1RSSU5HU11bREVCVUdfU1RSSU5HX0xFTkdUSF07DQorc3RhdGljIEJZVEUgICAqZnJlZVN0YWNrcyAgIFtTVEFDS19QT09MX1NJWkVdOw0KK3N0YXRpYyBpbnQgICAgIGZyZWVTdGFja1B0ciA9IFNUQUNLX1BPT0xfU0laRSAtIDE7DQorDQorc3RhdGljIFByb3RNYW4gcHJvdE1hbkVudHJ5ID0gTlVMTDsNCitzdGF0aWMgV09SRCAgICBwcm90TWFuRFMgICAgPSAwOw0KK3N0YXRpYyB2b2xhdGlsZSBpbnQgeG1pdFBlbmRpbmc7DQorDQorc3RhdGljIHN0cnVjdCBfUGt0QnVmICAgICAgICAqdHhCdWZQZW5kaW5nOw0KK3N0YXRpYyBzdHJ1Y3QgX0NhcmRIYW5kbGUgICAgKmhhbmRsZTsNCitzdGF0aWMgc3RydWN0IF9Db21tb25DaGFycyAgICBjb21tb247DQorc3RhdGljIHN0cnVjdCBfUHJvdG9jb2xDaGFycyAgcHJvdENoYXJzOw0KK3N0YXRpYyBzdHJ1Y3QgX1Byb3REaXNwYXRjaCAgIGxvd2VyVGFibGU7DQorDQorc3RhdGljIHN0cnVjdCBfRmFpbGluZ01vZHVsZXMgZmFpbGluZ01vZHVsZXM7DQorc3RhdGljIHN0cnVjdCBfQmluZGluZ3NMaXN0ICAgYmluZGluZ3M7DQorDQorc3RhdGljIHN0cnVjdCB7DQorICAgICAgICAgV09SRCAgZXJyX251bTsNCisgICAgICAgICBjaGFyICplcnJfdGV4dDsNCisgICAgICAgfSBuZGlzX2Vycmxpc3RbXSA9IHsNCisNCisgIHsgRVJSX1NVQ0NFU1MsDQorICAgICJUaGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5cbiIgIH0sDQorDQorICB7IEVSUl9XQUlUX0ZPUl9SRUxFQVNFLA0KKyAgICAiVGhlIFJlY2VpdmVDaGFpbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IGJ1dCB0aGUgcHJvdG9jb2wgaGFzXG4iDQorICAgICJyZXRhaW5lZCBjb250cm9sIG9mIHRoZSBidWZmZXIuXG4iICB9LA0KKw0KKyAgeyBFUlJfUkVRVUVTVF9RVUVVRUQsDQorICAgICJUaGUgY3VycmVudCByZXF1ZXN0IGhhcyBiZWVuIHF1ZXVlZC5cbiIgIH0sDQorDQorICB7IEVSUl9GUkFNRV9OT1RfUkVDT0dOSVpFRCwNCisgICAgIkZyYW1lIG5vdCByZWNvZ25pemVkLlxuIiAgfSwNCisNCisgIHsgRVJSX0ZSQU1FX1JFSkVDVEVELA0KKyAgICAiRnJhbWUgd2FzIGRpc2NhcmRlZC5cbiIgIH0sDQorDQorICB7IEVSUl9GT1JXQVJEX0ZSQU1FLA0KKyAgICAiUHJvdG9jb2wgd2lzaGVzIHRvIGZvcndhcmQgZnJhbWUgdG8gYW5vdGhlciBwcm90b2NvbC5cbiIgIH0sDQorDQorICB7IEVSUl9PVVRfT0ZfUkVTT1VSQ0UsDQorICAgICJPdXQgb2YgcmVzb3VyY2UuXG4iICB9LA0KKw0KKyAgeyBFUlJfSU5WQUxJRF9QQVJBTUVURVIsDQorICAgICJJbnZhbGlkIHBhcmFtZXRlci5cbiIgIH0sDQorDQorICB7IEVSUl9JTlZBTElEX0ZVTkNUSU9OLA0KKyAgICAiSW52YWxpZCBmdW5jdGlvbi5cbiIgIH0sDQorDQorICB7IEVSUl9OT1RfU1VQUE9SVEVELA0KKyAgICAiTm90IHN1cHBvcnRlZC5cbiIgIH0sDQorDQorICB7IEVSUl9IQVJEV0FSRV9FUlJPUiwNCisgICAgIkhhcmR3YXJlIGVycm9yLlxuIiAgfSwNCisNCisgIHsgRVJSX1RSQU5TTUlUX0VSUk9SLA0KKyAgICAiVGhlIHBhY2tldCB3YXMgbm90IHRyYW5zbWl0dGVkIGR1ZSB0byBhbiBlcnJvci5cbiIgIH0sDQorDQorICB7IEVSUl9OT19TVUNIX0RFU1RJTkFUSU9OLA0KKyAgICAiVG9rZW4gcmluZyBwYWNrZXQgd2FzIG5vdCByZWNvZ25pemVkIHdoZW4gdHJhbnNtaXR0ZWQuXG4iICB9LA0KKw0KKyAgeyBFUlJfQlVGRkVSX1RPT19TTUFMTCwNCisgICAgIlByb3ZpZGVkIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLlxuIiAgfSwNCisNCisgIHsgRVJSX0FMUkVBRFlfU1RBUlRFRCwNCisgICAgIk5ldHdvcmsgZHJpdmVycyBhbHJlYWR5IHN0YXJ0ZWQuXG4iICB9LA0KKw0KKyAgeyBFUlJfSU5DT01QTEVURV9CSU5ESU5HLA0KKyAgICAiUHJvdG9jb2wgZHJpdmVyIGNvdWxkIG5vdCBjb21wbGV0ZSBpdHMgYmluZGluZ3MuXG4iICB9LA0KKw0KKyAgeyBFUlJfRFJJVkVSX05PVF9JTklUSUFMSVpFRCwNCisgICAgIk1BQyBkaWQgbm90IGluaXRpYWxpemUgcHJvcGVybHkuXG4iICB9LA0KKw0KKyAgeyBFUlJfSEFSRFdBUkVfTk9UX0ZPVU5ELA0KKyAgICAiSGFyZHdhcmUgbm90IGZvdW5kLlxuIiAgfSwNCisNCisgIHsgRVJSX0hBUkRXQVJFX0ZBSUxVUkUsDQorICAgICJIYXJkd2FyZSBmYWlsdXJlLlxuIiAgfSwNCisNCisgIHsgRVJSX0NPTkZJR1VSQVRJT05fRkFJTFVSRSwNCisgICAgIkNvbmZpZ3VyYXRpb24gZmFpbHVyZS5cbiIgIH0sDQorDQorICB7IEVSUl9JTlRFUlJVUFRfQ09ORkxJQ1QsDQorICAgICJJbnRlcnJ1cHQgY29uZmxpY3QuXG4iICB9LA0KKw0KKyAgeyBFUlJfSU5DT01QQVRJQkxFX01BQywNCisgICAgIlRoZSBNQUMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcHJvdG9jb2wuXG4iICB9LA0KKw0KKyAgeyBFUlJfSU5JVElBTElaQVRJT05fRkFJTEVELA0KKyAgICAiSW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIiAgfSwNCisNCisgIHsgRVJSX05PX0JJTkRJTkcsDQorICAgICJCaW5kaW5nIGRpZCBub3Qgb2NjdXIuXG4iICB9LA0KKw0KKyAgeyBFUlJfTkVUV09SS19NQVlfTk9UX0JFX0NPTk5FQ1RFRCwNCisgICAgIlRoZSBuZXR3b3JrIG1heSBub3QgYmUgY29ubmVjdGVkIHRvIHRoZSBhZGFwdGVyLlxuIiAgfSwNCisNCisgIHsgRVJSX0lOQ09NUEFUSUJMRV9PU19WRVJTSU9OLA0KKyAgICAiVGhlIHZlcnNpb24gb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3RvY29sLlxuIiAgfSwNCisNCisgIHsgRVJSX0FMUkVBRFlfUkVHSVNURVJFRCwNCisgICAgIlRoZSBwcm90b2NvbCBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuXG4iICB9LA0KKw0KKyAgeyBFUlJfUEFUSF9OT1RfRk9VTkQsDQorICAgICJQUk9UTUFOLkVYRSBjb3VsZCBub3QgYmUgZm91bmQuXG4iICB9LA0KKw0KKyAgeyBFUlJfSU5TVUZGSUNJRU5UX01FTU9SWSwNCisgICAgIkluc3VmZmljaWVudCBtZW1vcnkuXG4iICB9LA0KKw0KKyAgeyBFUlJfSU5GT19OT1RfRk9VTkQsDQorICAgICJQcm90b2NvbCBNYW5hbmdlciBpbmZvIHN0cnVjdHVyZSBpcyBsb3N0IG9yIGNvcnJ1cHRlZC5cbiIgIH0sDQorDQorICB7IEVSUl9HRU5FUkFMX0ZBSUxVUkUsDQorICAgICJHZW5lcmFsIGZhaWx1cmUuXG4iICB9DQorfTsNCisNCisvKg0KKyAqICBTb21lIGhhbmR5IG1hY3Jvcw0KKyAqLyAgICAgICANCisjZGVmaW5lIFBFUlJPUihzdHIpICAgIHByaW50ZigiJXMgKCVkKTogJXNcbiIsIF9fRklMRV9fLF9fTElORV9fLHN0cikNCisjZGVmaW5lIERFQlVHX1JJTkcoKSAgIChkZWJ1Z1N0cmluZ3Nbc3RvcERlYnVnKzEgPT0gTUFYX05VTV9ERUJVR19TVFJJTkdTID8gXA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BEZWJ1ZyA9IDAgOiArK3N0b3BEZWJ1Z10pDQorDQorLyoNCisgKiBuZWVkcyByZXdyaXRlIGZvciBET1NYDQorICovDQorI2RlZmluZSBNQUNfRElTUEFUQ0goaG5kKSAgKChzdHJ1Y3QgX01hY1VwcGVyRGlzcGF0Y2gqKShobmQpLT5jb21tb24tPnVwcGVyRGlzcGF0Y2hUYWJsZSkNCisjZGVmaW5lIE1BQ19TVEFUVVMoaG5kKSAgICAoKHN0cnVjdCBfTWFjU3RhdHVzVGFibGUqKSAgKGhuZCktPmNvbW1vbi0+c2VydmljZVN0YXR1cykNCisjZGVmaW5lIE1BQ19DSEFSKGhuZCkgICAgICAoKHN0cnVjdCBfTWFjQ2hhcnMqKSAgICAgICAgKGhuZCktPmNvbW1vbi0+c2VydmljZUNoYXJzKQ0KKw0KKyNpZmRlZiBORElTX0RFQlVHDQorICAjZGVmaW5lIERFQlVHMChzdHIpICAgICAgcHJpbnRmIChzdHIpDQorICAjZGVmaW5lIERFQlVHMShmbXQsYSkgICAgcHJpbnRmIChmbXQsYSkNCisgICNkZWZpbmUgREVCVUcyKGZtdCxhLGIpICBwcmludGYgKGZtdCxhLGIpDQorICAjZGVmaW5lIFRSQUNFMChzdHIpICAgICAgc3ByaW50ZiAoREVCVUdfUklORygpLHN0cikNCisgICNkZWZpbmUgVFJBQ0UxKGZtdCxhKSAgICBzcHJpbnRmIChERUJVR19SSU5HKCksZm10LGEpDQorI2Vsc2UNCisgICNkZWZpbmUgREVCVUcwKHN0cikgICAgICAoKHZvaWQpMCkNCisgICNkZWZpbmUgREVCVUcxKGZtdCxhKSAgICAoKHZvaWQpMCkNCisgICNkZWZpbmUgREVCVUcyKGZtdCxhLGIpICAoKHZvaWQpMCkNCisgICNkZWZpbmUgVFJBQ0UwKHN0cikgICAgICAoKHZvaWQpMCkNCisgICNkZWZpbmUgVFJBQ0UxKGZtdCxhKSAgICAoKHZvaWQpMCkNCisjZW5kaWYNCisNCisvKg0KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBib3RoIHRocmVhZHMNCisgKi8NCit2b2lkIE5kaXNGcmVlU3RhY2sgKEJZVEUgKmFTdGFjaykNCit7DQorICBHVUFSRCgpOw0KKw0KKyAgaWYgKGZyZWVTdGFja1B0ciA9PSBTVEFDS19QT09MX1NJWkUgLSAxKQ0KKyAgICAgUEVSUk9SICgidHJpZWQgdG8gZnJlZSB0b28gbWFueSBzdGFja3MiKTsNCisNCisgIGZyZWVTdGFja3NbKytmcmVlU3RhY2tQdHJdID0gYVN0YWNrOw0KKw0KKyAgaWYgKGZyZWVTdGFja1B0ciA9PSAwKQ0KKyAgICAgVFJBQ0UwICgiZnJlZVN0YWNrUHRyIHdlbnQgcG9zaXRpdmVcbiIpOw0KKw0KKyAgVU5HVUFSRCgpOw0KK30NCisNCisvKg0KKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZnJvbSBjYWxsYmFja3MgdG8gYWxsb2NhdGUgbG9jYWwgZGF0YQ0KKyAqLw0KK0JZVEUgKk5kaXNBbGxvY1N0YWNrICh2b2lkKQ0KK3sNCisgIEJZVEUgKnN0YWNrOw0KKw0KKyAgR1VBUkQoKTsNCisNCisgIGlmIChmcmVlU3RhY2tQdHIgPCAwKQ0KKyAgew0KKyAgICAvKiBSYW4gb3V0IG9mIHN0YWNrIGJ1ZmZlcnMuIFJldHVybiBOVUxMIHdoaWNoIHdpbGwgc3RhcnQNCisgICAgICogZHJvcHBpbmcgcGFja2V0cw0KKyAgICAgKi8NCisgICAgVFJBQ0UwICgiZnJlZVN0YWNrUHRyIHdlbnQgbmVnYXRpdmVcbiIpOw0KKyAgICBzdGFjayA9IDA7DQorICB9DQorICBlbHNlDQorICAgIHN0YWNrID0gZnJlZVN0YWNrc1tmcmVlU3RhY2tQdHItLV07DQorDQorICBVTkdVQVJEKCk7DQorICByZXR1cm4gKHN0YWNrKTsNCit9DQorDQorQ0FMTEJBQ0sgKE5kaXNTeXN0ZW1SZXF1ZXN0IChEV09SRCBwYXJhbTEsIERXT1JEIHBhcmFtMiwgV09SRCBwYXJhbTMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIG9wY29kZSwgV09SRCB0YXJnZXREUykpDQorew0KKyAgc3RhdGljIGludCAgICAgICAgICAgIGJpbmRFbnRyeSA9IDA7DQorICBzdHJ1Y3QgX0NvbW1vbkNoYXJzICAqbWFjQ29tbW9uOw0KKyAgdm9sYXRpbGUgV09SRCByZXN1bHQ7DQorDQorICBzd2l0Y2ggKG9wY29kZSkNCisgIHsNCisgICAgY2FzZSBSRVFfSU5JVElBVEVfQklORDoNCisgICAgICAgICBtYWNDb21tb24gPSAoc3RydWN0IF9Db21tb25DaGFycyopIHBhcmFtMjsNCisgICAgICAgICBpZiAobWFjQ29tbW9uID09IE5VTEwpDQorCSB7DQorICAgICAgICAgICBwcmludGYgKCJUaGVyZSBpcyBhbiBORElTIG1pc2NvbmZpZ3VyYXRpb24uXG4iKTsNCisgICAgICAgICAgIHJlc3VsdCA9IEVSUl9HRU5FUkFMX0ZBSUxVUkU7DQorCSAgIGJyZWFrOw0KKwkgfQ0KKyAgICAgICAgIERFQlVHMiAoIm1vZHVsZSBuYW1lICVzXG4iDQorICAgICAgICAgICAgICAgICAibW9kdWxlIHR5cGUgJXNcbiIsDQorICAgICAgICAgICAgICAgICBtYWNDb21tb24tPm1vZHVsZU5hbWUsDQorICAgICAgICAgICAgICAgICAoKE1hY0NoYXJzKikgbWFjQ29tbW9uLT5zZXJ2aWNlQ2hhcnMpLT5tYWNOYW1lKTsNCisNCisgICAgICAgICAvKiBCaW5kaW5nIHRvIHRoZSBNQUMgKi8NCisgICAgICAgICByZXN1bHQgPSBtYWNDb21tb24tPnN5c3RlbVJlcXVlc3QgKChEV09SRCkmY29tbW9uLCAoRFdPUkQpJm1hY0NvbW1vbiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFJFUV9CSU5ELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjQ29tbW9uLT5tb2R1bGVEUyk7DQorDQorICAgICAgICAgaWYgKCFzdHJjbXAoYmluZGluZ3MubW9kdWxlTmFtZVtiaW5kRW50cnldLCBoYW5kbGUtPm1vZHVsZU5hbWUpKQ0KKyAgICAgICAgICAgICAgaGFuZGxlLT5jb21tb24gPSBtYWNDb21tb247DQorICAgICAgICAgZWxzZSBQRVJST1IgKCJ1bmtub3duIG1vZHVsZSIpOw0KKyAgICAgICAgICsrYmluZEVudHJ5Ow0KKwkgYnJlYWs7DQorDQorICAgIGNhc2UgUkVRX0lOSVRJQVRFX1VOQklORDoNCisgICAgICAgICBtYWNDb21tb24gPSAoc3RydWN0IF9Db21tb25DaGFycyopIHBhcmFtMjsNCisgICAgICAgICByZXN1bHQgPSBtYWNDb21tb24tPnN5c3RlbVJlcXVlc3QgKChEV09SRCkmY29tbW9uLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUkVRX1VOQklORCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0NvbW1vbi0+bW9kdWxlRFMpOw0KKyAgICAgICAgIGJyZWFrOw0KKw0KKyAgICBkZWZhdWx0Og0KKyAgICAgICAgIHJlc3VsdCA9IEVSUl9HRU5FUkFMX0ZBSUxVUkU7DQorCSBicmVhazsNCisgIH0NCisgIEFSR1NVU0VEIChwYXJhbTEpOw0KKyAgQVJHU1VTRUQgKHBhcmFtMyk7DQorICBBUkdTVVNFRCAodGFyZ2V0RFMpOw0KKyAgcmV0dXJuIChyZXN1bHQpOw0KK30NCisNCitDQUxMQkFDSyAoTmRpc1JlcXVlc3RDb25maXJtIChXT1JEIHByb3RJZCwgV09SRCBtYWNJZCwgICBXT1JEIHJlcUhhbmRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIHN0YXR1cywgV09SRCByZXF1ZXN0LCBXT1JEIHByb3REUykpDQorew0KKyAgQVJHU1VTRUQgKHByb3RJZCk7ICAgIEFSR1NVU0VEIChtYWNJZCk7DQorICBBUkdTVVNFRCAocmVxSGFuZGxlKTsgQVJHU1VTRUQgKHN0YXR1cyk7DQorICBBUkdTVVNFRCAocmVxdWVzdCk7ICAgQVJHU1VTRUQgKHByb3REUyk7DQorICByZXR1cm4gKEVSUl9TVUNDRVNTKTsNCit9DQorDQorQ0FMTEJBQ0sgKE5kaXNUcmFuc21pdENvbmZpcm0gKFdPUkQgcHJvdElkLCBXT1JEIG1hY0lkLCBXT1JEIHJlcUhhbmRsZSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SRCBzdGF0dXMsIFdPUkQgcHJvdERTKSkNCit7DQorICB4bWl0UGVuZGluZy0tOw0KKyAgRnJlZVBrdEJ1ZiAodHhCdWZQZW5kaW5nKTsgIC8qIEFkZCBwYXNzZWQgRUNCIGJhY2sgdG8gdGhlIGZyZWUgbGlzdCAqLw0KKw0KKyAgQVJHU1VTRUQgKHJlcUhhbmRsZSk7DQorICBBUkdTVVNFRCAoc3RhdHVzKTsNCisgIEFSR1NVU0VEIChwcm90RFMpOw0KKyAgcmV0dXJuIChFUlJfU1VDQ0VTUyk7DQorfQ0KKw0KKw0KKy8qDQorICogVGhlIHByaW1hcnkgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyBwYWNrZXRzDQorICovDQorQ0FMTEJBQ0sgKE5kaXNSZWNlaXZlTG9va2FoZWFkIChXT1JEICBtYWNJZCwgICAgICBXT1JEICBmcmFtZVNpemUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICBieXRlc0F2YWlsLCBCWVRFICpidWZmZXIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCWVRFICppbmRpY2F0ZSwgICBXT1JEICBwcm90RFMpKQ0KK3sNCisgIGludCAgICAgcmVzdWx0Ow0KKyAgUGt0QnVmICpwa3RCdWY7DQorICBXT1JEICAgIGJ5dGVzQ29waWVkOw0KKyAgc3RydWN0IF9UREJ1ZkRlc2NyIHREQnVmRGVzY3I7DQorDQorI2lmIDANCisgIFRSQUNFMSAoImxvb2thaGVhZCBsZW5ndGggPSAlZCwgIiwgYnl0ZXNBdmFpbCk7DQorICBUUkFDRTEgKCJlY2IgPSAlMDhsWCwgIiwgICAgICAgICAgKmVjYik7DQorICBUUkFDRTEgKCJjb3VudCA9ICUwOGxYXG4iLCAgICAgICAgIGNvdW50KTsNCisgIFRSQUNFMSAoIm9mZnNldCA9ICUwOGxYLCAiLCAgICAgICAgb2Zmc2V0KTsNCisgIFRSQUNFMSAoInRpbWVzQWxsb3dlZCA9ICVkLCAiLCAgICAgdGltZXNBbGxvd2VkKTsNCisgIFRSQUNFMSAoInBhY2tldCBzaXplID0gJWRcbiIsICAgICAgbG9vay0+ZGF0YUxvb2tBaGVhZExlbik7DQorI2VuZGlmDQorDQorICAvKiBBbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIHBhY2tldA0KKyAgICovDQorICBpZiAoKHBrdEJ1ZiA9IEFsbG9jUGt0QnVmKCkpID09IE5VTEwpDQorICB7DQorICAgIGRyb3BwZWRQYWNrZXRzKys7DQorICAgIHJldHVybiAoRVJSX0ZSQU1FX1JFSkVDVEVEKTsNCisgIH0NCisNCisgIC8qDQorICAgKiBOb3cga2x1ZGdlIHRoaW5ncy4gTm90ZSB3ZSB3aWxsIGhhdmUgdG8gdW5kbyB0aGlzIGxhdGVyLiBUaGlzIHdpbGwNCisgICAqIG1ha2UgdGhlIHBhY2tldCBjb250aWd1b3VzIGFmdGVyIHRoZSBNTElEIGhhcyBkb25lIHRoZSByZXF1ZXN0ZWQgY29weS4NCisgICAqLw0KKw0KKyAgdERCdWZEZXNjci50RERhdGFDb3VudCA9IDE7DQorICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0udERQdHJUeXBlID0gTkRJU19QVFJfUEhZU0lDQUw7DQorICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0udEREYXRhUHRyID0gcGt0QnVmLT5idWZmZXI7DQorICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0udEREYXRhTGVuID0gcGt0QnVmLT5sZW5ndGg7DQorICB0REJ1ZkRlc2NyLnREQnVmRGVzY3JSZWNbMF0uZHVtbXkgICAgID0gMDsNCisNCisgIHJlc3VsdCA9IE1BQ19ESVNQQVRDSChoYW5kbGUpLT50cmFuc2ZlckRhdGEgKCZieXRlc0NvcGllZCwgMCwgJnREQnVmRGVzY3IsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPmNvbW1vbi0+bW9kdWxlRFMpOw0KKyAgcGt0QnVmLT5wYWNrZXRMZW5ndGggPSBieXRlc0NvcGllZDsNCisNCisgIGlmIChyZXN1bHQgPT0gRVJSX1NVQ0NFU1MpDQorICAgICAgIEVucXVlUGt0QnVmKHBrdEJ1Zik7DQorICBlbHNlIEZyZWVQa3RCdWYgKHBrdEJ1Zik7DQorDQorICBBUkdTVVNFRCAoZnJhbWVTaXplKTsNCisgIEFSR1NVU0VEIChieXRlc0F2YWlsKTsNCisgIEFSR1NVU0VEIChpbmRpY2F0ZSk7DQorICBBUkdTVVNFRCAocHJvdERTKTsNCisNCisgIHJldHVybiAoRVJSX1NVQ0NFU1MpOw0KK30NCisNCitDQUxMQkFDSyAoTmRpc0luZGljYXRpb25Db21wbGV0ZSAoV09SRCBtYWNJZCwgV09SRCBwcm90RFMpKQ0KK3sNCisgIEFSR1NVU0VEIChtYWNJZCk7DQorICBBUkdTVVNFRCAocHJvdERTKTsNCisNCisgIC8qIFdlIGRvbid0IGdpdmUgYSBob290IGFib3V0IHRoZXNlLiBKdXN0IHJldHVybg0KKyAgICovDQorICByZXR1cm4gKEVSUl9TVUNDRVNTKTsNCit9DQorDQorLyoNCisgKiBUaGlzIGlzIHRoZSBPVEhFUiB3YXkgd2UgbWF5IHJlY2VpdmUgcGFja2V0cw0KKyAqLw0KK0NBTExCQUNLIChOZGlzUmVjZWl2ZUNoYWluIChXT1JEIG1hY0lkLCBXT1JEIGZyYW1lU2l6ZSwgV09SRCByZXFIYW5kbGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfUnhCdWZEZXNjciAqcnhCdWZEZXNjciwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURSAqaW5kaWNhdGUsIFdPUkQgcHJvdERTKSkNCit7DQorICBzdHJ1Y3QgX1BrdEJ1ZiAqcGt0QnVmOw0KKyAgaW50ICAgICBpOw0KKw0KKyAgLyoNCisgICAqIEZvciBub3cgd2UgY29weSB0aGUgZW50aXJlIHBhY2tldCBvdmVyIHRvIGEgUGt0QnVmIHN0cnVjdHVyZS4gVGhpcyBtYXkgYmUNCisgICAqIGEgcGVyZm9ybWFuY2UgaGl0IGJ1dCB0aGlzIHJvdXRpbmUgcHJvYmFibHkgaXNuJ3QgY2FsbGVkIHZlcnkgbXVjaCwgYW5kDQorICAgKiBpdCBpcyBhIGxvdCBvZiB3b3JrIHRvIGRvIGl0IG90aGVyd2lzZS4gQWxzbyBpZiBpdCBpcyBhIGZpbHRlciBwcm90b2NvbA0KKyAgICogcGFja2V0IHdlIGNvdWxkIGVuZCB1cCBzdWNraW5nIHVwIE1BQyBidWZmZXMuDQorICAgKi8NCisNCisgIGlmICgocGt0QnVmID0gQWxsb2NQa3RCdWYoKSkgPT0gTlVMTCkNCisgIHsNCisgICAgZHJvcHBlZFBhY2tldHMrKzsNCisgICAgcmV0dXJuIChFUlJfRlJBTUVfUkVKRUNURUQpOw0KKyAgfQ0KKyAgcGt0QnVmLT5wYWNrZXRMZW5ndGggPSAwOw0KKw0KKyAgLyogQ29weSB0aGUgcGFja2V0IHRvIHRoZSBidWZmZXINCisgICAqLw0KKyAgZm9yIChpID0gMDsgaSA8IHJ4QnVmRGVzY3ItPnJ4RGF0YUNvdW50OyArK2kpDQorICB7DQorICAgIHN0cnVjdCBfUnhCdWZEZXNjclJlYyAqcnhEZXNjciA9ICZyeEJ1ZkRlc2NyLT5yeEJ1ZkRlc2NyUmVjW2ldOw0KKw0KKyAgICBtZW1jcHkgKHBrdEJ1Zi0+YnVmZmVyICsgcGt0QnVmLT5wYWNrZXRMZW5ndGgsDQorICAgICAgICAgICAgcnhEZXNjci0+cnhEYXRhUHRyLCByeERlc2NyLT5yeERhdGFMZW4pOw0KKyAgICBwa3RCdWYtPnBhY2tldExlbmd0aCArPSByeERlc2NyLT5yeERhdGFMZW47DQorICB9DQorDQorICBFbnF1ZVBrdEJ1ZiAocGt0QnVmKTsNCisNCisgIEFSR1NVU0VEIChmcmFtZVNpemUpOw0KKyAgQVJHU1VTRUQgKHJlcUhhbmRsZSk7DQorICBBUkdTVVNFRCAoaW5kaWNhdGUpOw0KKyAgQVJHU1VTRUQgKHByb3REUyk7ICAgDQorDQorICAvKiBUaGlzIGZyZWVzIHVwIHRoZSBidWZmZXIgZm9yIHRoZSBNQUMgdG8gdXNlDQorICAgKi8NCisgIHJldHVybiAoRVJSX1NVQ0NFU1MpOw0KK30NCisNCitDQUxMQkFDSyAoTmRpc1N0YXR1c1Byb2MgKFdPUkQgbWFjSWQsICBXT1JEIHBhcmFtMSwgQllURSAqaW5kaWNhdGUsDQorICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEIG9wY29kZSwgV09SRCBwcm90RFMpKQ0KK3sNCisgIHN3aXRjaCAob3Bjb2RlKQ0KKyAgew0KKyAgICBjYXNlIFNUQVRVU19SSU5HX1NUQVRVUzoNCisJIGJyZWFrOw0KKyAgICBjYXNlIFNUQVRVU19BREFQVEVSX0NIRUNLOg0KKwkgYnJlYWs7DQorICAgIGNhc2UgU1RBVFVTX1NUQVJUX1JFU0VUOg0KKwkgYnJlYWs7DQorICAgIGNhc2UgU1RBVFVTX0lOVEVSUlVQVDoNCisJIGJyZWFrOw0KKyAgICBjYXNlIFNUQVRVU19FTkRfUkVTRVQ6DQorCSBicmVhazsNCisgICAgZGVmYXVsdDoNCisJIGJyZWFrOw0KKyAgfQ0KKyAgQVJHU1VTRUQgKG1hY0lkKTsNCisgIEFSR1NVU0VEIChwYXJhbTEpOw0KKyAgQVJHU1VTRUQgKGluZGljYXRlKTsNCisgIEFSR1NVU0VEIChvcGNvZGUpOw0KKyAgQVJHU1VTRUQgKHByb3REUyk7DQorDQorICAvKiBXZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGFib3V0IHRoaXMgc3R1ZmYgeWV0DQorICAgKi8NCisgIHJldHVybiAoRVJSX1NVQ0NFU1MpOw0KK30NCisNCisvKg0KKyAqIFRlbGwgdGhlIE5ESVMgZHJpdmVyIHRvIHN0YXJ0IHRoZSBkZWxpdmVyeSBvZiB0aGUgcGFja2V0DQorICovDQoraW50IE5kaXNTZW5kUGFja2V0IChzdHJ1Y3QgX1BrdEJ1ZiAqcGt0QnVmLCBpbnQgbWFjSWQpDQoreyANCisgIHN0cnVjdCBfVHhCdWZEZXNjciB0eEJ1ZkRlc2NyOw0KKyAgaW50ICAgICByZXN1bHQ7DQorDQorICB4bWl0UGVuZGluZysrOw0KKyAgdHhCdWZQZW5kaW5nID0gcGt0QnVmOyAgICAvKiB3ZSBvbmx5IGhhdmUgMSBwZW5kaW5nIFR4IGF0IGEgdGltZSAqLw0KKw0KKyAgdHhCdWZEZXNjci50eEltbWVkTGVuICA9IDA7DQorICB0eEJ1ZkRlc2NyLnR4SW1tZWRQdHIgID0gTlVMTDsNCisgIHR4QnVmRGVzY3IudHhEYXRhQ291bnQgPSAxOw0KKyAgdHhCdWZEZXNjci50eEJ1ZkRlc2NyUmVjWzBdLnR4UHRyVHlwZSA9IE5ESVNfUFRSX1BIWVNJQ0FMOw0KKyAgdHhCdWZEZXNjci50eEJ1ZkRlc2NyUmVjWzBdLmR1bW15ICAgICA9IDA7DQorICB0eEJ1ZkRlc2NyLnR4QnVmRGVzY3JSZWNbMF0udHhEYXRhTGVuID0gcGt0QnVmLT5wYWNrZXRMZW5ndGg7DQorICB0eEJ1ZkRlc2NyLnR4QnVmRGVzY3JSZWNbMF0udHhEYXRhUHRyID0gcGt0QnVmLT5idWZmZXI7DQorDQorICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+dHJhbnNtaXRDaGFpbiAoY29tbW9uLm1vZHVsZUlkLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdEJ1Zi0+aGFuZGxlLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eEJ1ZkRlc2NyLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+Y29tbW9uLT5tb2R1bGVEUyk7DQorICBzd2l0Y2ggKHJlc3VsdCkNCisgIHsNCisgICAgY2FzZSBFUlJfT1VUX09GX1JFU09VUkNFOg0KKyAgICAgICAgIC8qIE5vdGUgdGhhdCB0aGlzIHNob3VsZCBub3QgaGFwcGVuIGJ1dCBpZiBpdCBkb2VzIHRoZXJlIGlzIG5vdA0KKyAgICAgICAgICAqIG11Y2ggd2UgY2FuIGRvIGFib3V0IGl0DQorICAgICAgICAgICovDQorICAgICAgICAgcHJpbnRmICgiRVJST1I6IHRyYW5zbWl0IHF1ZXVlIG92ZXJmbG93ZWRcbiIpOw0KKyAgICAgICAgIHJldHVybiAoMCk7DQorDQorICAgIGNhc2UgRVJSX1NVQ0NFU1M6DQorICAgICAgICAgLyogRXZlcnl0aGluZyB3YXMgaHVua3kgZG9yeSBhbmQgc3luY2hyb25vdXMuIEZyZWUgdXAgdGhlIA0KKyAgICAgICAgICAqIHBhY2tldCBidWZmZXINCisgICAgICAgICAgKi8NCisgICAgICAgICB4bWl0UGVuZGluZy0tOw0KKyAgICAgICAgIEZyZWVQa3RCdWYgKHBrdEJ1Zik7DQorICAgICAgICAgcmV0dXJuICgxKTsNCisNCisgICAgY2FzZSBFUlJfUkVRVUVTVF9RVUVVRUQ6DQorICAgICAgICAgLyogRXZlcnl0aGluZyB3YXMgaHVua3kgZG9yeSBhbmQgYXN5bmNocm9ub3VzLiBEbyBub3RoaW5nDQorICAgICAgICAgICovDQorICAgICAgICAgcmV0dXJuICgxKTsNCisNCisgICAgZGVmYXVsdDoNCisgICAgICAgICBwcmludGYgKCJUeCBmYWlsLCBjb2RlID0gJTA0WFxuIiwgcmVzdWx0KTsNCisgICAgICAgICByZXR1cm4gKDApOw0KKyAgfQ0KK30NCisNCisNCisNCitzdGF0aWMgaW50IG5kaXNfbmVyciA9IHNpemVvZihuZGlzX2Vycmxpc3QpIC8gc2l6ZW9mKG5kaXNfZXJybGlzdFswXSk7DQorDQorc3RhdGljIGNoYXIgKk5kaXNfc3RyZXJyb3IgKFdPUkQgZXJyb3JDb2RlKQ0KK3sNCisgIHN0YXRpYyBjaGFyIGJ1ZlszMF07DQorICBpbnQgICAgaTsNCisNCisgIGZvciAoaSA9IDA7IGkgPCBuZGlzX25lcnI7IGkrKykNCisgICAgICBpZiAoZXJyb3JDb2RlID09IG5kaXNfZXJybGlzdFtpXS5lcnJfbnVtKQ0KKyAgICAgICAgIHJldHVybiAobmRpc19lcnJsaXN0W2ldLmVycl90ZXh0KTsNCisNCisgIHNwcmludGYgKGJ1ZiwidW5rbm93biBlcnJvciAlZCIsZXJyb3JDb2RlKTsNCisgIHJldHVybiAoYnVmKTsNCit9DQorDQorDQorY2hhciAqTmRpc0xhc3RFcnJvciAodm9pZCkNCit7DQorICBjaGFyICplcnJTdHIgPSBsYXN0RXJyOw0KKyAgbGFzdEVyciA9IE5VTEw7DQorICByZXR1cm4gKGVyclN0cik7DQorfQ0KKw0KK2ludCBOZGlzT3BlbiAodm9pZCkNCit7DQorICBzdHJ1Y3QgX1JlcUJsb2NrIHJlcUJsb2NrOw0KKyAgaW50ICAgICByZXN1bHQ7DQorICBpbnQgICAgIG5kaXNGZCA9IG9wZW4gKE5ESVNfUEFUSCwgT19SRE9OTFkpOw0KKw0KKyAgaWYgKG5kaXNGZCA8IDApDQorICB7DQorICAgIHByaW50ZiAoIkNvdWxkIG5vdCBvcGVuIE5ESVMgUHJvdG9jb2wgTWFuYWdlciBkZXZpY2UuXG4iKTsNCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIG1lbXNldCAoJnJlcUJsb2NrLCAwLCBzaXplb2YoUmVxQmxvY2spKTsNCisNCisgIHJlcUJsb2NrLm9wY29kZSA9IFBNX0dFVF9QUk9UT0NPTF9NQU5BR0VSX0xJTktBR0U7DQorDQorICByZXN1bHQgPSBOZGlzR2V0TGlua2FnZSAobmRpc0ZkLCAoY2hhciopJnJlcUJsb2NrLCBzaXplb2YoUmVxQmxvY2spKTsNCisgIGlmIChyZXN1bHQgIT0gMCkNCisgIHsNCisgICAgcHJpbnRmICgiQ291bGQgbm90IGdldCBQcm90b2NvbCBNYW5hZ2VyIGxpbmthZ2UuXG4iKTsNCisgICAgY2xvc2UgKG5kaXNGZCk7DQorICAgIHJldHVybiAoMCk7DQorICB9DQorDQorICBjbG9zZSAobmRpc0ZkKTsNCisgIHByb3RNYW5FbnRyeSA9IChQcm90TWFuKSByZXFCbG9jay5wb2ludGVyMTsNCisgIHByb3RNYW5EUyAgICA9IHJlcUJsb2NrLndvcmQxOw0KKw0KKyAgREVCVUcyICgiRW50cnkgUG9pbnQgPSAlMDRYOiUwNFhcbiIsIEZQX1NFRyhwcm90TWFuRW50cnkpLEZQX09GRihwcm90TWFuRW50cnkpKTsNCisgIERFQlVHMSAoIlByb3RNYW4gRFMgID0gJTA0WFxuIiwgcHJvdE1hbkRTKTsNCisgIHJldHVybiAoMSk7DQorfQ0KKw0KKw0KK2ludCBOZGlzUmVnaXN0ZXJBbmRCaW5kIChpbnQgcHJvbWlzKQ0KK3sNCisgIHN0cnVjdCBfUmVxQmxvY2sgcmVxQmxvY2s7DQorICBXT1JEICAgIHJlc3VsdDsNCisNCisgIG1lbXNldCAoJmNvbW1vbiwwLHNpemVvZihjb21tb24pKTsNCisNCisgIGNvbW1vbi50YWJsZVNpemUgPSBzaXplb2YgKGNvbW1vbik7DQorDQorICBjb21tb24ubWFqb3JOZGlzVmVyc2lvbiAgID0gMjsNCisgIGNvbW1vbi5taW5vck5kaXNWZXJzaW9uICAgPSAwOw0KKyAgY29tbW9uLm1ham9yTW9kdWxlVmVyc2lvbiA9IDI7DQorICBjb21tb24ubWlub3JNb2R1bGVWZXJzaW9uID0gMDsNCisNCisgIC8qIEluZGljYXRlcyBiaW5kaW5nIGZyb20gYmVsb3cgYW5kIGR5bmFtaWNhbGx5IGxvYWRlZA0KKyAgICovDQorICBjb21tb24ubW9kdWxlRmxhZ3MgPSAweDAwMDAwMDA2TDsNCisNCisgIHN0cmNweSAoY29tbW9uLm1vZHVsZU5hbWUsICJQQ0FQIik7DQorDQorICBjb21tb24ucHJvdG9jb2xMZXZlbFVwcGVyID0gMHhGRjsNCisgIGNvbW1vbi5wcm90b2NvbExldmVsTG93ZXIgPSAxOw0KKyAgY29tbW9uLmludGVyZmFjZUxvd2VyICAgICA9IDE7DQorI2lmZGVmIF9fREpHUFBfXw0KKyAgY29tbW9uLm1vZHVsZURTICAgICAgICAgICA9IF9kb3NfZHM7IC8qIHRoZSBjYWxsYmFjayBkYXRhIHNlZ21lbnQgKi8NCisjZWxzZQ0KKyAgY29tbW9uLm1vZHVsZURTICAgICAgICAgICA9IF9EUzsNCisjZW5kaWYNCisNCisgIGNvbW1vbi5zeXN0ZW1SZXF1ZXN0ICAgICAgPSAoU3lzdGVtUmVxdWVzdCkgc3lzdGVtUmVxdWVzdEdsdWU7DQorICBjb21tb24uc2VydmljZUNoYXJzICAgICAgID0gKEJZVEUqKSAmcHJvdENoYXJzOw0KKyAgY29tbW9uLnNlcnZpY2VTdGF0dXMgICAgICA9IE5VTEw7DQorICBjb21tb24udXBwZXJEaXNwYXRjaFRhYmxlID0gTlVMTDsNCisgIGNvbW1vbi5sb3dlckRpc3BhdGNoVGFibGUgPSAoQllURSopICZsb3dlclRhYmxlOw0KKw0KKyAgcHJvdENoYXJzLmxlbmd0aCAgPSBzaXplb2YgKHByb3RDaGFycyk7DQorICBwcm90Q2hhcnMubmFtZVswXSA9IDA7DQorICBwcm90Q2hhcnMudHlwZSAgICA9IDA7DQorDQorICBsb3dlclRhYmxlLmJhY2tQb2ludGVyICAgICAgICA9ICZjb21tb247DQorICBsb3dlclRhYmxlLnJlcXVlc3RDb25maXJtICAgICA9IHJlcXVlc3RDb25maXJtR2x1ZTsNCisgIGxvd2VyVGFibGUudHJhbnNtaXRDb25maXJtICAgID0gdHJhbnNtaXRDb25maXJtR2x1ZTsNCisgIGxvd2VyVGFibGUucmVjZWl2ZUxvb2thaGVhZCAgID0gcmVjZWl2ZUxvb2thaGVhZEdsdWU7DQorICBsb3dlclRhYmxlLmluZGljYXRpb25Db21wbGV0ZSA9IGluZGljYXRpb25Db21wbGV0ZUdsdWU7DQorICBsb3dlclRhYmxlLnJlY2VpdmVDaGFpbiAgICAgICA9IHJlY2VpdmVDaGFpbkdsdWU7DQorICBsb3dlclRhYmxlLnN0YXR1cyAgICAgICAgICAgICA9IHN0YXR1c0dsdWU7DQorICBsb3dlclRhYmxlLmZsYWdzICAgICAgICAgICAgICA9IDM7DQorICBpZiAocHJvbWlzKQ0KKyAgICAgbG93ZXJUYWJsZS5mbGFncyB8PSA0OyAgIC8qIHByb21pc2NvdXMgbW9kZSAocmVjZWl2ZSBldmVyeXRoaW5nKSAqLw0KKw0KKyAgYmluZGluZ3MubnVtQmluZGluZ3MgPSAxOw0KKyAgc3RyY3B5IChiaW5kaW5ncy5tb2R1bGVOYW1lWzBdLCBoYW5kbGUtPm1vZHVsZU5hbWUpOw0KKw0KKyAgLyogUmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggTkRJUw0KKyAgICovDQorICByZXFCbG9jay5vcGNvZGUgICA9IFBNX1JFR0lTVEVSX01PRFVMRTsNCisgIHJlcUJsb2NrLnBvaW50ZXIxID0gKEJZVEUgRkFSKikgJmNvbW1vbjsNCisgIHJlcUJsb2NrLnBvaW50ZXIyID0gKEJZVEUgRkFSKikgJmJpbmRpbmdzOw0KKw0KKyAgcmVzdWx0ID0gKCpwcm90TWFuRW50cnkpICgmcmVxQmxvY2ssIHByb3RNYW5EUyk7DQorICBpZiAocmVzdWx0KQ0KKyAgew0KKyAgICBwcmludGYgKCJQcm90bWFuIHJlZ2lzdGVyaW5nIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7DQorICAgIHJldHVybiAoMCk7DQorICB9DQorDQorICAvKiBTdGFydCB0aGUgYmluZGluZyBwcm9jZXNzDQorICAgKi8NCisgIHJlcUJsb2NrLm9wY29kZSAgID0gUE1fQklORF9BTkRfU1RBUlQ7DQorICByZXFCbG9jay5wb2ludGVyMSA9IChCWVRFIEZBUiopICZmYWlsaW5nTW9kdWxlczsNCisNCisgIHJlc3VsdCA9ICgqcHJvdE1hbkVudHJ5KSAoJnJlcUJsb2NrLCBwcm90TWFuRFMpOw0KKyAgaWYgKHJlc3VsdCkNCisgIHsNCisgICAgcHJpbnRmICgiU3RhcnQgYmluZGluZyBmYWlsZWQ6ICVzXG4iLCBOZGlzX3N0cmVycm9yKHJlc3VsdCkpOw0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKyAgcmV0dXJuICgxKTsNCit9DQorDQorc3RhdGljIGludCBDaGVja01hY0ZlYXR1cmVzIChDYXJkSGFuZGxlICpjYXJkKQ0KK3sNCisgIERXT1JEICAgICAgc2VydmljZUZsYWdzOw0KKyAgQllURSBfZmFyICptZWRpYVN0cmluZzsNCisgIEJZVEUgX2ZhciAqbWFjX2FkZHI7DQorDQorICBERUJVRzIgKCJjaGVja2luZyBjYXJkIGZlYXR1cmVzXG4iDQorICAgICAgICAgICJjb21tb24gdGFibGUgYWRkcmVzcyA9ICUwOGxYLCBtYWNJZCA9ICVkXG4iLA0KKyAgICAgICAgICBjYXJkLT5jb21tb24sIGNhcmQtPmNvbW1vbi0+bW9kdWxlSWQpOw0KKw0KKyAgc2VydmljZUZsYWdzID0gTUFDX0NIQVIgKGhhbmRsZSktPnNlcnZpY2VGbGFnczsNCisNCisgIGlmICgoc2VydmljZUZsYWdzICYgU0ZfUFJPTUlTQ1VPVVMpID09IDApDQorICB7DQorICAgIHByaW50ZiAoIlRoZSBNQUMgJXMgZG9lcyBub3Qgc3VwcG9ydCBwcm9taXNjdW91cyBtb2RlLlxuIiwNCisgICAgICAgICAgICBjYXJkLT5tb2R1bGVOYW1lKTsNCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIG1lZGlhU3RyaW5nID0gTUFDX0NIQVIgKGhhbmRsZSktPm1hY05hbWU7DQorDQorICBERUJVRzEgKCJtZWRpYSB0eXBlID0gJXNcbiIsbWVkaWFTdHJpbmcpOw0KKw0KKyAgLyogR2V0IHRoZSBtZWRpYSB0eXBlLiBBbmQgc2V0IHRoZSBoZWFkZXIgc2l6ZQ0KKyAgICovDQorICBpZiAoIXN0cm5jbXAobWVkaWFTdHJpbmcsIjgwMi4zIiw1KSB8fA0KKyAgICAgICFzdHJuY21wKG1lZGlhU3RyaW5nLCJESVgiLDMpICAgfHwNCisgICAgICAhc3RybmNtcChtZWRpYVN0cmluZywiRElYKzgwMi4zIiw5KSkNCisgICAgICAgaGVhZGVyU2l6ZSA9IHNpemVvZiAoRXRoZXJuZXRJSUhlYWRlcik7DQorDQorICBlbHNlIGlmICghc3RybmNtcChtZWRpYVN0cmluZywiRkRESSIsNCkpDQorICAgICAgIGhlYWRlclNpemUgPSBzaXplb2YgKEZkZGlIZWFkZXIpICsNCisgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoSWVlZTgwMkRvdDJTbmFwSGVhZGVyKTsNCisgIGVsc2UNCisgIHsNCisgICAgcHJpbnRmICgiVW5zdXBwb3J0ZWQgTUFDIHR5cGU6IGAlcydcbiIsIG1lZGlhU3RyaW5nKTsNCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIGZyYW1lU2l6ZSA9IE1BQ19DSEFSIChoYW5kbGUpLT5tYXhGcmFtZVNpemU7DQorICBtYWNfYWRkciAgPSBNQUNfQ0hBUiAoaGFuZGxlKS0+Y3VycmVudEFkZHJlc3M7DQorDQorICBwcmludGYgKCJIYXJkd2FyZSBhZGRyZXNzOiAlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWFxuIiwNCisgICAgICAgICAgbWFjX2FkZHJbMF0sIG1hY19hZGRyWzFdLCBtYWNfYWRkclsyXSwNCisgICAgICAgICAgbWFjX2FkZHJbM10sIG1hY19hZGRyWzRdLCBtYWNfYWRkcls1XSk7DQorICByZXR1cm4gKDEpOw0KK30NCisNCitzdGF0aWMgaW50IE5kaXNTdGFydE1hYyAoQ2FyZEhhbmRsZSAqY2FyZCkNCit7DQorICBXT1JEIHJlc3VsdDsNCisNCisgIC8qIFNldCB0aGUgbG9va2FoZWFkIGxlbmd0aA0KKyAgICovDQorICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+cmVxdWVzdCAoY29tbW9uLm1vZHVsZUlkLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclNpemUsIDAsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRX1NFVF9MT09LQUhFQUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+Y29tbW9uLT5tb2R1bGVEUyk7DQorDQorICAvKiBXZSBhc3N1bWUgdGhhdCBpZiB3ZSBnb3QgSU5WQUxJRCBQQVJBTUVURVIgdGhlbiBlaXRoZXIgdGhpcw0KKyAgICogaXMgbm90IHN1cHBvcnRlZCBvciB3aWxsIHdvcmsgYW55d2F5LiBORTIwMDAgZG9lcyB0aGlzLg0KKyAgICovDQorICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTICYmIHJlc3VsdCAhPSBFUlJfSU5WQUxJRF9QQVJBTUVURVIpDQorICB7DQorICAgIERFQlVHMSAoIlNldCBsb29rYWhlYWQgZmFpbGVkOiAlc1xuIiwgTmRpc19zdHJlcnJvcihyZXN1bHQpKTsNCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIC8qIFNldCB0aGUgcGFja2V0IGZpbHRlci4gTm90ZSB0aGF0IGZvciBzb21lIG1lZGlhcyBhbmQgZHJpdmVycyB3ZQ0KKyAgICogbXVzdCBzcGVjaWZ5IGFsbCB0aHJlZSBmbGFncyBvciB0aGUgY2FyZChzKSB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseS4NCisgICAqLw0KKyAgcmVzdWx0ID0gTUFDX0RJU1BBVENIKGhhbmRsZSktPnJlcXVlc3QgKGNvbW1vbi5tb2R1bGVJZCwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgLyogYWxsIHBhY2tldHMgKi8gICBGSUxURVJfUFJPTUlTQ1VPVVMgfA0KKyAgICAgICAgICAgICAgICAgICAgICAvKiBwYWNrZXRzIHRvIHVzICovIEZJTFRFUl9ESVJFQ1RFRCAgICB8DQorICAgICAgICAgICAgICAgICAgICAgIC8qIGJyb2FkY2FzdHMgKi8gICAgRklMVEVSX0JST0FEQ0FTVCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBSRVFfU0VUX1BBQ0tFVF9GSUxURVIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+Y29tbW9uLT5tb2R1bGVEUyk7DQorICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTKQ0KKyAgew0KKyAgICBERUJVRzEgKCJTZXQgcGFja2V0IGZpbHRlciBmYWlsZWQ6ICVzXG4iLCBOZGlzX3N0cmVycm9yKHJlc3VsdCkpOw0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgLyogSWYgT1BFTi9DTE9TRSBzdXBwb3J0ZWQgdGhlbiBvcGVuIHRoZSBhZGFwdGVyDQorICAgKi8NCisgIGlmIChNQUNfQ0hBUihoYW5kbGUpLT5zZXJ2aWNlRmxhZ3MgJiBTRl9PUEVOX0NMT1NFKQ0KKyAgew0KKyAgICByZXN1bHQgPSBNQUNfRElTUEFUQ0goaGFuZGxlKS0+cmVxdWVzdCAoY29tbW9uLm1vZHVsZUlkLCAwLCAwLCBOVUxMLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVRX09QRU5fQURBUFRFUiwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtPmNvbW1vbi0+bW9kdWxlRFMpOw0KKyAgICBpZiAocmVzdWx0ICE9IEVSUl9TVUNDRVNTKQ0KKyAgICB7DQorICAgICAgREVCVUcxICgiT3BlbmluZyB0aGUgTUFDIGZhaWxlZDogJXNcbiIsIE5kaXNfc3RyZXJyb3IocmVzdWx0KSk7DQorICAgICAgcmV0dXJuICgwKTsNCisgICAgfQ0KKyAgfQ0KKyAgcmV0dXJuICgxKTsNCit9DQorDQordm9pZCBOZGlzU2h1dGRvd24gKHZvaWQpDQorew0KKyAgc3RydWN0IF9SZXFCbG9jayByZXFCbG9jazsNCisgIGludCAgICAgcmVzdWx0LCBpOw0KKw0KKyAgaWYgKCFoYW5kbGUpDQorICAgICByZXR1cm47DQorDQorICAvKiBJZiB0aGUgYWRhcHRlcnMgc3VwcG9ydCBvcGVuIGFuZCBhcmUgb3BlbiB0aGVuIGNsb3NlIHRoZW0NCisgICAqLw0KKyAgaWYgKChNQUNfQ0hBUihoYW5kbGUpLT5zZXJ2aWNlRmxhZ3MgJiBTRl9PUEVOX0NMT1NFKSAmJg0KKyAgICAgIChNQUNfU1RBVFVTKGhhbmRsZSktPm1hY1N0YXR1cyAmIE1BQ19PUEVOKSkNCisgIHsNCisgICAgcmVzdWx0ID0gTUFDX0RJU1BBVENIKGhhbmRsZSktPnJlcXVlc3QgKGNvbW1vbi5tb2R1bGVJZCwgMCwgMCwgMCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUV9DTE9TRV9BREFQVEVSLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLT5jb21tb24tPm1vZHVsZURTKTsNCisgICAgaWYgKHJlc3VsdCAhPSBFUlJfU1VDQ0VTUykNCisgICAgew0KKyAgICAgIHByaW50ZiAoIkNsb3NpbmcgdGhlIE1BQyBmYWlsZWQ6ICVzXG4iLCBOZGlzX3N0cmVycm9yKHJlc3VsdCkpOw0KKyAgICAgIHJldHVybjsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgLyogVGVsbCB0aGUgUHJvdG9jb2wgTWFuYWdlciB0byB1bmJpbmQgYW5kIHN0b3ANCisgICAqLw0KKyAgcmVxQmxvY2sub3Bjb2RlICAgPSBQTV9VTkJJTkRfQU5EX1NUT1A7DQorICByZXFCbG9jay5wb2ludGVyMSA9IChCWVRFIEZBUiopICZmYWlsaW5nTW9kdWxlczsNCisgIHJlcUJsb2NrLnBvaW50ZXIyID0gTlVMTDsNCisNCisgIHJlc3VsdCA9ICgqcHJvdE1hbkVudHJ5KSAoJnJlcUJsb2NrLCBwcm90TWFuRFMpOw0KKyAgaWYgKHJlc3VsdCkNCisgICAgIHByaW50ZiAoIlVuYmluZCBmYWlsZWQ6ICVzXG4iLCAgTmRpc19zdHJlcnJvcihyZXN1bHQpKTsNCisNCisgIGZvciAoaSA9IDA7IGkgPCBTVEFDS19QT09MX1NJWkU7ICsraSkNCisgICAgIGZyZWUgKGZyZWVTdGFja3NbaV0gLSBTVEFDS19TSVpFKTsNCisNCisgIGhhbmRsZSA9IE5VTEw7DQorfQ0KKw0KK2ludCBOZGlzSW5pdCAoaW50IHByb21pcykNCit7DQorICBpbnQgaSwgcmVzdWx0Ow0KKw0KKyAgLyogQWxsb2NhdGUgdGhlIHJlYWwgbW9kZSBzdGFja3MgdXNlZCBmb3IgTkRJUyBjYWxsYmFja3MNCisgICAqLw0KKyAgZm9yIChpID0gMDsgaSA8IFNUQUNLX1BPT0xfU0laRTsgKytpKQ0KKyAgew0KKyAgICBmcmVlU3RhY2tzW2ldID0gbWFsbG9jIChTVEFDS19TSVpFKTsNCisgICAgaWYgKCFmcmVlU3RhY2tzW2ldKQ0KKyAgICAgICByZXR1cm4gKDApOw0KKyAgICBmcmVlU3RhY2tzW2ldICs9IFNUQUNLX1NJWkU7DQorICB9DQorDQorICBpZiAoIU5kaXNPcGVuKCkpDQorICAgICByZXR1cm4gKDApOw0KKw0KKyAgaWYgKCFOZGlzUmVnaXN0ZXJBbmRCaW5kKHByb21pcykpDQorICAgICByZXR1cm4gKDApOw0KKw0KKyAgREVCVUcxICgiTXkgbW9kdWxlIGlkOiAlZFxuIiwgY29tbW9uLm1vZHVsZUlkKTsNCisgIERFQlVHMSAoIkhhbmRsZSBpZDsgICAgJWRcbiIsIGhhbmRsZS0+Y29tbW9uLT5tb2R1bGVJZCk7DQorICBERUJVRzEgKCJNQUMgY2FyZDogICAgICUtMTZzIC0gIiwgaGFuZGxlLT5tb2R1bGVOYW1lKTsNCisNCisgIGF0ZXhpdCAoTmRpc1NodXRkb3duKTsNCisNCisgIGlmICghQ2hlY2tNYWNGZWF0dXJlcygmaGFuZGxlKSkNCisgICAgIHJldHVybiAoMCk7DQorDQorICBzd2l0Y2ggKG1lZGlhVHlwZSkNCisgIHsNCisgICAgY2FzZSBNRURJQV9GRERJOg0KKyAgICAgICAgIERFQlVHMCAoIk1lZGlhIHR5cGU6IEZEREkiKTsNCisJIGJyZWFrOw0KKyAgICBjYXNlIE1FRElBX0VUSEVSTkVUOg0KKyAgICAgICAgIERFQlVHMCAoIk1lZGlhIHR5cGU6IEVUSEVSTkVUIik7DQorCSBicmVhazsNCisgICAgZGVmYXVsdDoNCisgICAgICAgICBERUJVRzAgKCJVbnN1cHBvcnRlZCBtZWRpYS5cbiIpOw0KKyAgICAgICAgIHJldHVybiAoMCk7DQorICB9DQorDQorICBERUJVRzEgKCIgLSBGcmFtZSBzaXplOiAlZFxuIiwgZnJhbWVTaXplKTsNCisNCisgIGlmICghTmRpc1N0YXJ0TWFjKCZoYW5kbGUpKQ0KKyAgICAgcmV0dXJuICgwKTsNCisgIHJldHVybiAoMSk7DQorfQ0KKyNlbmRpZiAgLyogVVNFX05ESVMyICovDQorDQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9tc2Rvcy9uZGlzMi5oIGIvbGlicGNhcC0xLjMuMC9tc2Rvcy9uZGlzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNzJmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL21zZG9zL25kaXMyLmgKQEAgLTAsMCArMSw1NTkgQEAKKy8qIA0KKyAqIENvcHlyaWdodCAoYykgMTk5MywxOTk0DQorICogICAgICBUZXhhcyBBJk0gVW5pdmVyc2l0eS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCisgKiBhcmUgbWV0Og0KKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlDQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50Og0KKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBUZXhhcyBBJk0gVW5pdmVyc2l0eQ0KKyAqICAgICAgYW5kIGl0cyBjb250cmlidXRvcnMuDQorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMNCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUNCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisgKg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFVOSVZFUlNJVFkgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EDQorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBVTklWRVJTSVRZIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUNCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTA0KKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTDQorICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pDQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QNCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZDQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRg0KKyAqIFNVQ0ggREFNQUdFLg0KKyAqDQorICogRGV2ZWxvcGVyczoNCisgKiAgICAgICAgICAgICBEYXZpZCBLLiBIZXNzLCBEb3VnbGFzIExlZSBTY2hhbGVzLCBEYXZpZCBSLiBTYWZmb3JkDQorICoNCisgKiBIZWF2aWx5IG1vZGlmaWVkIGZvciBNZXRhd2FyZSBIaWdoQyArIEdOVSBDIDIuOCsNCisgKiAgICAgICAgICAgICBHaXNsZSBWYW5lbSAxOTk4DQorICovDQorDQorI2lmbmRlZiBfX1BDQVBfTkRJU19IDQorI2RlZmluZSBfX1BDQVBfTkRJU19IDQorDQorI2lmIGRlZmluZWQgKF9fSElHSENfXykNCisgICNkZWZpbmUgcGFzY2FsICAgICAgICAgIF9DQyhfQ0FMTEVFX1BPUFNfU1RBQ0sgJiB+X1JFVkVSU0VfUEFSTVMpIC8qIGNhbGxpbmcgY29udmVudGlvbiAqLw0KKyAgI2RlZmluZSBDQUxMQkFDSyhmb28pICAgcGFzY2FsIFdPUkQgZm9vDQorICAjZGVmaW5lIFBBU19QVFIoeCxhcmcpICB0eXBlZGVmIEZBUiBXT1JEIHBhc2NhbCAoKngpIGFyZw0KKyAgI2RlZmluZSBHVUFSRCgpICAgICAgICAgX2lubGluZSAoMHg5QywweEZBKSAgIC8qIHB1c2hmZCwgY2xpICovDQorICAjZGVmaW5lIFVOR1VBUkQoKSAgICAgICBfaW5saW5lICgweDlEKSAgICAgICAgLyogcG9wZmQgKi8NCisgICNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXINCisNCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQ0KKyAgI2RlZmluZSBDQUxMQkFDSyhmb28pICAgV09SRCBmb28gX19hdHRyaWJ1dGVfXygoc3RkY2FsbCkpDQorICAjZGVmaW5lIFBBU19QVFIoeCxhcmcpICB0eXBlZGVmIFdPUkQgKCp4KSBhcmcgX19hdHRyaWJ1dGVfXygoc3RkY2FsbCkpDQorICAjZGVmaW5lIEdVQVJEKCkgICAgICAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoInB1c2hmZDsgY2xpIikNCisgICNkZWZpbmUgVU5HVUFSRCgpICAgICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgicG9wZmQiKQ0KKyAgI2RlZmluZSBGQVINCisNCisjZWxpZiBkZWZpbmVkIChfX1RVUkJPQ19fKQ0KKyAgI2RlZmluZSBDQUxMQkFDSyhmb28pICAgV09SRCBwYXNjYWwgZm9vDQorICAjZGVmaW5lIFBBU19QVFIoeCxhcmcpICB0eXBlZGVmIFdPUkQgcGFzY2FsIChfZmFyICp4KSBhcmcNCisgICNkZWZpbmUgR1VBUkQoKSAgICAgICAgIF9hc20geyBwdXNoZjsgY2xpIH0NCisgICNkZWZpbmUgVU5HVUFSRCgpICAgICAgIF9hc20geyBwb3BmIH0NCisgICNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXINCisNCisjZWxpZiBkZWZpbmVkIChfX1dBVENPTUNfXykNCisgICNkZWZpbmUgQ0FMTEJBQ0soZm9vKSAgIFdPUkQgcGFzY2FsIGZvbw0KKyAgI2RlZmluZSBQQVNfUFRSKHgsYXJnKSAgdHlwZWRlZiBXT1JEIHBhc2NhbCAoX2ZhciAqeCkgYXJnDQorICAjZGVmaW5lIEdVQVJEKCkgICAgICAgICBfZGlzYWJsZSgpDQorICAjZGVmaW5lIFVOR1VBUkQoKSAgICAgICBfZW5hYmxlKCkNCisgICNkZWZpbmUgRkFSICAgICAgICAgICAgIF9mYXINCisNCisjZWxzZQ0KKyAgI2Vycm9yIFVuc3VwcG9ydGVkIGNvbXBpbGVyDQorI2VuZGlmDQorDQorDQorLyoNCisgKiAgRm9yd2FyZHMNCisgKi8NCitzdHJ1Y3QgX1JlcUJsb2NrOw0KK3N0cnVjdCBfVHhCdWZEZXNjcjsNCitzdHJ1Y3QgX1REQnVmRGVzY3I7DQorDQorLyoNCisgKiBQcm90b2NvbCBNYW5hZ2VyIEFQSQ0KKyAqLw0KK1BBU19QVFIgKFByb3RNYW4sIChzdHJ1Y3QgX1JlcUJsb2NrIEZBUiosIFdPUkQpKTsNCisNCisvKg0KKyAqIFN5c3RlbSByZXF1ZXN0DQorICovDQorUEFTX1BUUiAoU3lzdGVtUmVxdWVzdCwgKERXT1JELCBEV09SRCwgV09SRCwgV09SRCwgV09SRCkpOw0KKw0KKy8qDQorICogTUFDIEFQSQ0KKyAqLw0KK1BBU19QVFIgKFRyYW5zbWl0Q2hhaW4sIChXT1JELCBXT1JELCBzdHJ1Y3QgX1R4QnVmRGVzY3IgRkFSKiwgV09SRCkpOw0KK1BBU19QVFIgKFRyYW5zZmVyRGF0YSwgIChXT1JEKixXT1JELCBzdHJ1Y3QgX1REQnVmRGVzY3IgRkFSKiwgV09SRCkpOw0KK1BBU19QVFIgKFJlcXVlc3QsICAgICAgIChXT1JELCBXT1JELCBXT1JELCBEV09SRCwgV09SRCwgV09SRCkpOw0KK1BBU19QVFIgKFJlY2VpdmVSZWxlYXNlLChXT1JELCBXT1JEKSk7DQorUEFTX1BUUiAoSW5kaWNhdGlvbk9uLCAgKFdPUkQpKTsNCitQQVNfUFRSIChJbmRpY2F0aW9uT2ZmLCAoV09SRCkpOw0KKw0KKw0KK3R5cGVkZWYgZW51bSB7DQorICAgICAgICBIQVJEV0FSRV9OT1RfSU5TVEFMTEVEICA9IDAsDQorICAgICAgICBIQVJEV0FSRV9GQUlMRURfRElBRyAgICA9IDEsDQorICAgICAgICBIQVJEV0FSRV9GQUlMRURfQ09ORklHICA9IDIsDQorICAgICAgICBIQVJEV0FSRV9IQVJEX0ZBVUxUICAgICA9IDMsDQorICAgICAgICBIQVJEV0FSRV9TT0ZUX0ZBVUxUICAgICA9IDQsDQorICAgICAgICBIQVJEV0FSRV9PSyAgICAgICAgICAgICA9IDcsDQorICAgICAgICBIQVJEV0FSRV9NQVNLICAgICAgICAgICA9IDB4MDAwNywNCisgICAgICAgIE1BQ19CT1VORCAgICAgICAgICAgICAgID0gMHgwMDA4LA0KKyAgICAgICAgTUFDX09QRU4gICAgICAgICAgICAgICAgPSAweDAwMTAsDQorICAgICAgICBESUFHX0lOX1BST0dSRVNTICAgICAgICA9IDB4MDAyMA0KKyAgICAgIH0gTmRpc01hY1N0YXR1czsNCisNCit0eXBlZGVmIGVudW0gew0KKyAgICAgICAgU1RBVFVTX1JJTkdfU1RBVFVTICAgICAgPSAxLA0KKyAgICAgICAgU1RBVFVTX0FEQVBURVJfQ0hFQ0sgICAgPSAyLA0KKyAgICAgICAgU1RBVFVTX1NUQVJUX1JFU0VUICAgICAgPSAzLA0KKyAgICAgICAgU1RBVFVTX0lOVEVSUlVQVCAgICAgICAgPSA0LA0KKyAgICAgICAgU1RBVFVTX0VORF9SRVNFVCAgICAgICAgPSA1DQorICAgICAgfSBOZGlzU3RhdHVzOw0KKw0KK3R5cGVkZWYgZW51bSB7DQorICAgICAgICBGSUxURVJfRElSRUNURUQgICAgICAgICA9IDEsDQorICAgICAgICBGSUxURVJfQlJPQURDQVNUICAgICAgICA9IDIsDQorICAgICAgICBGSUxURVJfUFJPTUlTQ1VPVVMgICAgICA9IDQsDQorICAgICAgICBGSUxURVJfU09VUkNFX1JPVVRFICAgICA9IDgNCisgICAgICB9IE5kaXNQYWNrZXRGaWx0ZXI7DQorDQordHlwZWRlZiBlbnVtIHsNCisgICAgICAgIFJFUV9JTklUSUFURV9ESUFHTk9TVElDUyAgICAgPSAxLA0KKyAgICAgICAgUkVRX1JFQURfRVJST1JfTE9HICAgICAgICAgICA9IDIsDQorICAgICAgICBSRVFfU0VUX1NUQVRJT05fQUREUkVTUyAgICAgID0gMywNCisgICAgICAgIFJFUV9PUEVOX0FEQVBURVIgICAgICAgICAgICAgPSA0LA0KKyAgICAgICAgUkVRX0NMT1NFX0FEQVBURVIgICAgICAgICAgICA9IDUsDQorICAgICAgICBSRVFfUkVTRVRfTUFDICAgICAgICAgICAgICAgID0gNiwNCisgICAgICAgIFJFUV9TRVRfUEFDS0VUX0ZJTFRFUiAgICAgICAgPSA3LA0KKyAgICAgICAgUkVRX0FERF9NVUxUSUNBU1RfQUREUkVTUyAgICA9IDgsDQorICAgICAgICBSRVFfREVMRVRFX01VTFRJQ0FTVF9BRERSRVNTID0gOSwNCisgICAgICAgIFJFUV9VUERBVEVfU1RBVElTVElDUyAgICAgICAgPSAxMCwNCisgICAgICAgIFJFUV9DTEVBUl9TVEFUSVNUSUNTICAgICAgICAgPSAxMSwNCisgICAgICAgIFJFUV9JTlRFUlJVUFRfUkVRVUVTVCAgICAgICAgPSAxMiwNCisgICAgICAgIFJFUV9TRVRfRlVOQ1RJT05BTF9BRERSRVNTICAgPSAxMywNCisgICAgICAgIFJFUV9TRVRfTE9PS0FIRUFEICAgICAgICAgICAgPSAxNA0KKyAgICAgIH0gTmRpc0dlbmVyYWxSZXF1ZXN0Ow0KKw0KK3R5cGVkZWYgZW51bSB7DQorICAgICAgICBTRl9CUk9BRENBU1QgICAgICAgICAgICAgPSAweDAwMDAwMDAxTCwNCisgICAgICAgIFNGX01VTFRJQ0FTVCAgICAgICAgICAgICA9IDB4MDAwMDAwMDJMLA0KKyAgICAgICAgU0ZfRlVOQ1RJT05BTCAgICAgICAgICAgID0gMHgwMDAwMDAwNEwsDQorICAgICAgICBTRl9QUk9NSVNDVU9VUyAgICAgICAgICAgPSAweDAwMDAwMDA4TCwNCisgICAgICAgIFNGX1NPRlRfQUREUkVTUyAgICAgICAgICA9IDB4MDAwMDAwMTBMLA0KKyAgICAgICAgU0ZfU1RBVFNfQ1VSUkVOVCAgICAgICAgID0gMHgwMDAwMDAyMEwsDQorICAgICAgICBTRl9JTklUSUFURV9ESUFHUyAgICAgICAgPSAweDAwMDAwMDQwTCwNCisgICAgICAgIFNGX0xPT1BCQUNLICAgICAgICAgICAgICA9IDB4MDAwMDAwODBMLA0KKyAgICAgICAgU0ZfUkVDRUlWRV9DSEFJTiAgICAgICAgID0gMHgwMDAwMDEwMEwsDQorICAgICAgICBTRl9TT1VSQ0VfUk9VVElORyAgICAgICAgPSAweDAwMDAwMjAwTCwNCisgICAgICAgIFNGX1JFU0VUX01BQyAgICAgICAgICAgICA9IDB4MDAwMDA0MDBMLA0KKyAgICAgICAgU0ZfT1BFTl9DTE9TRSAgICAgICAgICAgID0gMHgwMDAwMDgwMEwsDQorICAgICAgICBTRl9JTlRFUlJVUFRfUkVRVUVTVCAgICAgPSAweDAwMDAxMDAwTCwNCisgICAgICAgIFNGX1NPVVJDRV9ST1VUSU5HX0JSSURHRSA9IDB4MDAwMDIwMDBMLA0KKyAgICAgICAgU0ZfVklSVFVBTF9BRERSRVNTRVMgICAgID0gMHgwMDAwNDAwMEwNCisgICAgICB9IE5kaXNNYWNTZXJ2aWNlRmxhZ3M7DQorDQordHlwZWRlZiBlbnVtIHsNCisgICAgICAgIFJFUV9JTklUSUFURV9CSU5EICAgICAgICA9IDEsDQorICAgICAgICBSRVFfQklORCAgICAgICAgICAgICAgICAgPSAyLA0KKyAgICAgICAgUkVRX0lOSVRJQVRFX1BSRUJJTkQgICAgID0gMywNCisgICAgICAgIFJFUV9JTklUSUFURV9VTkJJTkQgICAgICA9IDQsDQorICAgICAgICBSRVFfVU5CSU5EICAgICAgICAgICAgICAgPSA1DQorICAgICAgfSBOZGlzU3lzUmVxdWVzdDsNCisNCit0eXBlZGVmIGVudW0gIHsNCisgICAgICAgIFBNX0dFVF9QUk9UT0NPTF9NQU5BR0VSX0lORk8gICAgICA9IDEsDQorICAgICAgICBQTV9SRUdJU1RFUl9NT0RVTEUgICAgICAgICAgICAgICAgPSAyLA0KKyAgICAgICAgUE1fQklORF9BTkRfU1RBUlQgICAgICAgICAgICAgICAgID0gMywNCisgICAgICAgIFBNX0dFVF9QUk9UT0NPTF9NQU5BR0VSX0xJTktBR0UgICA9IDQsDQorICAgICAgICBQTV9HRVRfUFJPVE9DT0xfSU5JX1BBVEggICAgICAgICAgPSA1LA0KKyAgICAgICAgUE1fUkVHSVNURVJfUFJPVE9DT0xfTUFOQUdFUl9JTkZPID0gNiwNCisgICAgICAgIFBNX0lOSVRfQU5EX1JFR0lTVEVSICAgICAgICAgICAgICA9IDcsDQorICAgICAgICBQTV9VTkJJTkRfQU5EX1NUT1AgICAgICAgICAgICAgICAgPSA4LA0KKyAgICAgICAgUE1fQklORF9TVEFUVVMgICAgICAgICAgICAgICAgICAgID0gOSwNCisgICAgICAgIFBNX1JFR0lTVEVSX1NUQVRVUyAgICAgICAgICAgICAgICA9IDEwDQorICAgICAgfSBOZGlzUHJvdE1hbmFnZXI7DQorDQorDQordHlwZWRlZiBlbnVtIHsNCisgICAgICAgIEVSUl9TVUNDRVNTICAgICAgICAgICAgICAgICAgICAgID0gMHgwMCwNCisgICAgICAgIEVSUl9XQUlUX0ZPUl9SRUxFQVNFICAgICAgICAgICAgID0gMHgwMSwNCisgICAgICAgIEVSUl9SRVFVRVNUX1FVRVVFRCAgICAgICAgICAgICAgID0gMHgwMiwNCisgICAgICAgIEVSUl9GUkFNRV9OT1RfUkVDT0dOSVpFRCAgICAgICAgID0gMHgwMywNCisgICAgICAgIEVSUl9GUkFNRV9SRUpFQ1RFRCAgICAgICAgICAgICAgID0gMHgwNCwNCisgICAgICAgIEVSUl9GT1JXQVJEX0ZSQU1FICAgICAgICAgICAgICAgID0gMHgwNSwNCisgICAgICAgIEVSUl9PVVRfT0ZfUkVTT1VSQ0UgICAgICAgICAgICAgID0gMHgwNiwNCisgICAgICAgIEVSUl9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgICAgID0gMHgwNywNCisgICAgICAgIEVSUl9JTlZBTElEX0ZVTkNUSU9OICAgICAgICAgICAgID0gMHgwOCwNCisgICAgICAgIEVSUl9OT1RfU1VQUE9SVEVEICAgICAgICAgICAgICAgID0gMHgwOSwNCisgICAgICAgIEVSUl9IQVJEV0FSRV9FUlJPUiAgICAgICAgICAgICAgID0gMHgwQSwNCisgICAgICAgIEVSUl9UUkFOU01JVF9FUlJPUiAgICAgICAgICAgICAgID0gMHgwQiwNCisgICAgICAgIEVSUl9OT19TVUNIX0RFU1RJTkFUSU9OICAgICAgICAgID0gMHgwQywNCisgICAgICAgIEVSUl9CVUZGRVJfVE9PX1NNQUxMICAgICAgICAgICAgID0gMHgwRCwNCisgICAgICAgIEVSUl9BTFJFQURZX1NUQVJURUQgICAgICAgICAgICAgID0gMHgyMCwNCisgICAgICAgIEVSUl9JTkNPTVBMRVRFX0JJTkRJTkcgICAgICAgICAgID0gMHgyMSwNCisgICAgICAgIEVSUl9EUklWRVJfTk9UX0lOSVRJQUxJWkVEICAgICAgID0gMHgyMiwNCisgICAgICAgIEVSUl9IQVJEV0FSRV9OT1RfRk9VTkQgICAgICAgICAgID0gMHgyMywNCisgICAgICAgIEVSUl9IQVJEV0FSRV9GQUlMVVJFICAgICAgICAgICAgID0gMHgyNCwNCisgICAgICAgIEVSUl9DT05GSUdVUkFUSU9OX0ZBSUxVUkUgICAgICAgID0gMHgyNSwNCisgICAgICAgIEVSUl9JTlRFUlJVUFRfQ09ORkxJQ1QgICAgICAgICAgID0gMHgyNiwNCisgICAgICAgIEVSUl9JTkNPTVBBVElCTEVfTUFDICAgICAgICAgICAgID0gMHgyNywNCisgICAgICAgIEVSUl9JTklUSUFMSVpBVElPTl9GQUlMRUQgICAgICAgID0gMHgyOCwNCisgICAgICAgIEVSUl9OT19CSU5ESU5HICAgICAgICAgICAgICAgICAgID0gMHgyOSwNCisgICAgICAgIEVSUl9ORVRXT1JLX01BWV9OT1RfQkVfQ09OTkVDVEVEID0gMHgyQSwNCisgICAgICAgIEVSUl9JTkNPTVBBVElCTEVfT1NfVkVSU0lPTiAgICAgID0gMHgyQiwNCisgICAgICAgIEVSUl9BTFJFQURZX1JFR0lTVEVSRUQgICAgICAgICAgID0gMHgyQywNCisgICAgICAgIEVSUl9QQVRIX05PVF9GT1VORCAgICAgICAgICAgICAgID0gMHgyRCwNCisgICAgICAgIEVSUl9JTlNVRkZJQ0lFTlRfTUVNT1JZICAgICAgICAgID0gMHgyRSwNCisgICAgICAgIEVSUl9JTkZPX05PVF9GT1VORCAgICAgICAgICAgICAgID0gMHgyRiwNCisgICAgICAgIEVSUl9HRU5FUkFMX0ZBSUxVUkUgICAgICAgICAgICAgID0gMHhGRg0KKyAgICAgIH0gTmRpc0Vycm9yOw0KKw0KKyNkZWZpbmUgTkRJU19QQVJBTV9JTlRFR0VSICAgMA0KKyNkZWZpbmUgTkRJU19QQVJBTV9TVFJJTkcgICAgMQ0KKw0KKyNkZWZpbmUgTkRJU19UWF9CVUZfTEVOR1RIICAgOA0KKyNkZWZpbmUgTkRJU19URF9CVUZfTEVOR1RIICAgMQ0KKyNkZWZpbmUgTkRJU19SWF9CVUZfTEVOR1RIICAgOA0KKw0KKyNkZWZpbmUgTkRJU19QVFJfUEhZU0lDQUwgICAgMA0KKyNkZWZpbmUgTkRJU19QVFJfVklSVFVBTCAgICAgMg0KKw0KKyNkZWZpbmUgTkRJU19QQVRIICAgICJQUk9UTUFOJCINCisNCisNCit0eXBlZGVmIHN0cnVjdCBfQ29tbW9uQ2hhcnMgew0KKyAgICAgICAgV09SRCAgdGFibGVTaXplOw0KKyAgICAgICAgQllURSAgbWFqb3JOZGlzVmVyc2lvbjsgICAgICAgIC8qIDIgLSBMYXRlc3QgdmVyc2lvbiAqLw0KKyAgICAgICAgQllURSAgbWlub3JOZGlzVmVyc2lvbjsgICAgICAgIC8qIDAgICAgICAgICAgICAgICAgICAqLw0KKyAgICAgICAgV09SRCAgcmVzZXJ2ZWQxOw0KKyAgICAgICAgQllURSAgbWFqb3JNb2R1bGVWZXJzaW9uOw0KKyAgICAgICAgQllURSAgbWlub3JNb2R1bGVWZXJzaW9uOw0KKyAgICAgICAgRFdPUkQgbW9kdWxlRmxhZ3M7DQorICAgICAgICAvKiAwIC0gQmluZGluZyBhdCB1cHBlciBib3VuZGFyeSBzdXBwb3J0ZWQNCisgICAgICAgICAqIDEgLSBCaW5kaW5nIGF0IGxvd2VyIGJvdW5kYXJ5IHN1cHBvcnRlZA0KKyAgICAgICAgICogMiAtIER5bmFtaWNhbGx5IGJvdW5kLg0KKyAgICAgICAgICogMy0zMSAtIFJlc2VydmVkLCBtdXN0IGJlIHplcm8uDQorICAgICAgICAgKi8NCisgICAgICAgIEJZVEUgIG1vZHVsZU5hbWVbMTZdOw0KKyAgICAgICAgQllURSAgcHJvdG9jb2xMZXZlbFVwcGVyOw0KKyAgICAgICAgLyogMSAtIE1BQw0KKyAgICAgICAgICogMiAtIERhdGEgTGluaw0KKyAgICAgICAgICogMyAtIE5ldHdvcmsNCisgICAgICAgICAqIDQgLSBUcmFuc3BvcnQNCisgICAgICAgICAqIDUgLSBTZXNzaW9uDQorICAgICAgICAgKiAtMSAtIE5vdCBzcGVjaWZpZWQNCisgICAgICAgICAqLw0KKyAgICAgICAgQllURSAgaW50ZXJmYWNlVXBwZXI7DQorICAgICAgICBCWVRFICBwcm90b2NvbExldmVsTG93ZXI7DQorICAgICAgICAvKiAwIC0gUGh5c2ljYWwNCisgICAgICAgICAqIDEgLSBNQUMNCisgICAgICAgICAqIDIgLSBEYXRhIExpbmsNCisgICAgICAgICAqIDMgLSBOZXR3b3JrDQorICAgICAgICAgKiA0IC0gVHJhbnNwb3J0DQorICAgICAgICAgKiA1IC0gU2Vzc2lvbg0KKyAgICAgICAgICogLTEgLSBOb3Qgc3BlY2lmaWVkDQorICAgICAgICAgKi8NCisgICAgICAgIEJZVEUgIGludGVyZmFjZUxvd2VyOw0KKyAgICAgICAgV09SRCAgbW9kdWxlSWQ7DQorICAgICAgICBXT1JEICBtb2R1bGVEUzsNCisgICAgICAgIFN5c3RlbVJlcXVlc3Qgc3lzdGVtUmVxdWVzdDsNCisgICAgICAgIEJZVEUgKnNlcnZpY2VDaGFyczsNCisgICAgICAgIEJZVEUgKnNlcnZpY2VTdGF0dXM7DQorICAgICAgICBCWVRFICp1cHBlckRpc3BhdGNoVGFibGU7DQorICAgICAgICBCWVRFICpsb3dlckRpc3BhdGNoVGFibGU7DQorICAgICAgICBCWVRFICpyZXNlcnZlZDI7ICAgICAgICAgICAgLyogTXVzdCBiZSBOVUxMICovDQorICAgICAgICBCWVRFICpyZXNlcnZlZDM7ICAgICAgICAgICAgLyogTXVzdCBiZSBOVUxMICovDQorICAgICAgfSBDb21tb25DaGFyczsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfTXVsdGljYXN0TGlzdCB7DQorICAgICAgICBXT1JEICAgbWF4TXVsdGljYXN0QWRkcmVzc2VzOw0KKyAgICAgICAgV09SRCAgIG51bWJlck11bHRpY2FzdEFkZHJlc3NlczsNCisgICAgICAgIEJZVEUgICBtdWx0aWNhc3RBZGRyZXNzWzE2XVsxNl07DQorICAgICAgfSBNdWx0aWNhc3RMaXN0Ow0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9NYWNDaGFycyB7DQorICAgICAgICBXT1JEICAgdGFibGVTaXplOw0KKyAgICAgICAgQllURSAgIG1hY05hbWVbMTZdOw0KKyAgICAgICAgV09SRCAgIGFkZHJlc3NMZW5ndGg7DQorICAgICAgICBCWVRFICAgcGVybWFuZW50QWRkcmVzc1sxNl07DQorICAgICAgICBCWVRFICAgY3VycmVudEFkZHJlc3NbMTZdOw0KKyAgICAgICAgRFdPUkQgIGN1cnJlbnRGdW5jdGlvbmFsQWRkcmVzczsNCisgICAgICAgIE11bHRpY2FzdExpc3QgKm11bHRpY2FzdExpc3Q7DQorICAgICAgICBEV09SRCAgbGlua1NwZWVkOw0KKyAgICAgICAgRFdPUkQgIHNlcnZpY2VGbGFnczsNCisgICAgICAgIFdPUkQgICBtYXhGcmFtZVNpemU7DQorICAgICAgICBEV09SRCAgdHhCdWZmZXJTaXplOw0KKyAgICAgICAgV09SRCAgIHR4QnVmZmVyQWxsb2NTaXplOw0KKyAgICAgICAgRFdPUkQgIHJ4QnVmZmVyU2l6ZTsNCisgICAgICAgIFdPUkQgICByeEJ1ZmZlckFsbG9jU2l6ZTsNCisgICAgICAgIEJZVEUgICBpZWVlVmVuZG9yWzNdOw0KKyAgICAgICAgQllURSAgIHZlbmRvckFkYXB0ZXI7DQorICAgICAgICBCWVRFICAqdmVuZG9yQWRhcHRlckRlc2NyaXB0aW9uOw0KKyAgICAgICAgV09SRCAgIGludGVycnVwdExldmVsOw0KKyAgICAgICAgV09SRCAgIHR4UXVldWVEZXB0aDsNCisgICAgICAgIFdPUkQgICBtYXhEYXRhQmxvY2tzOw0KKyAgICAgIH0gTWFjQ2hhcnM7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX1Byb3RvY29sQ2hhcnMgew0KKyAgICAgICAgV09SRCAgIGxlbmd0aDsNCisgICAgICAgIEJZVEUgICBuYW1lWzE2XTsNCisgICAgICAgIFdPUkQgICB0eXBlOw0KKyAgICAgIH0gUHJvdG9jb2xDaGFyczsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfTWFjVXBwZXJEaXNwYXRjaCB7DQorICAgICAgICBDb21tb25DaGFycyAgICAgICpiYWNrUG9pbnRlcjsNCisgICAgICAgIFJlcXVlc3QgICAgICAgICAgIHJlcXVlc3Q7DQorICAgICAgICBUcmFuc21pdENoYWluICAgICB0cmFuc21pdENoYWluOw0KKyAgICAgICAgVHJhbnNmZXJEYXRhICAgICAgdHJhbnNmZXJEYXRhOw0KKyAgICAgICAgUmVjZWl2ZVJlbGVhc2UgICAgcmVjZWl2ZVJlbGVhc2U7DQorICAgICAgICBJbmRpY2F0aW9uT24gICAgICBpbmRpY2F0aW9uT247DQorICAgICAgICBJbmRpY2F0aW9uT2ZmICAgICBpbmRpY2F0aW9uT2ZmOw0KKyAgICAgIH0gTWFjVXBwZXJEaXNwYXRjaDsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfTWFjU3RhdHVzVGFibGUgew0KKyAgICAgICAgV09SRCAgIHRhYmxlU2l6ZTsNCisgICAgICAgIERXT1JEICBsYXN0RGlhZzsNCisgICAgICAgIERXT1JEICBtYWNTdGF0dXM7DQorICAgICAgICBXT1JEICAgcGFja2V0RmlsdGVyOw0KKyAgICAgICAgQllURSAgKm1lZGlhU3BlY2lmaWNTdGF0czsNCisgICAgICAgIERXT1JEICBsYXN0Q2xlYXI7DQorICAgICAgICBEV09SRCAgdG90YWxGcmFtZXNSeDsNCisgICAgICAgIERXT1JEICB0b3RhbEZyYW1lc0NyYzsNCisgICAgICAgIERXT1JEICB0b3RhbEJ5dGVzUng7DQorICAgICAgICBEV09SRCAgdG90YWxEaXNjYXJkQnVmU3BhY2VSeDsNCisgICAgICAgIERXT1JEICB0b3RhbE11bHRpY2FzdFJ4Ow0KKyAgICAgICAgRFdPUkQgIHRvdGFsQnJvYWRjYXN0Ung7DQorICAgICAgICBEV09SRCAgb2Jzb2xldGUxWzVdOw0KKyAgICAgICAgRFdPUkQgIHRvdGFsRGlzY2FyZEh3RXJyb3JSeDsNCisgICAgICAgIERXT1JEICB0b3RhbEZyYW1lc1R4Ow0KKyAgICAgICAgRFdPUkQgIHRvdGFsQnl0ZXNUeDsNCisgICAgICAgIERXT1JEICB0b3RhbE11bHRpY2FzdFR4Ow0KKyAgICAgICAgRFdPUkQgIHRvdGFsQnJvYWRjYXN0VHg7DQorICAgICAgICBEV09SRCAgb2Jzb2xldGUyWzJdOw0KKyAgICAgICAgRFdPUkQgIHRvdGFsRGlzY2FyZFRpbWVvdXRUeDsNCisgICAgICAgIERXT1JEICB0b3RhbERpc2NhcmRId0Vycm9yVHg7DQorICAgICAgfSBNYWNTdGF0dXNUYWJsZTsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfUHJvdERpc3BhdGNoIHsNCisgICAgICAgIENvbW1vbkNoYXJzICpiYWNrUG9pbnRlcjsNCisgICAgICAgIERXT1JEICAgICAgICBmbGFnczsNCisgICAgICAgIC8qIDAgLSBoYW5kbGVzIG5vbi1MTEMgZnJhbWVzDQorICAgICAgICAgKiAxIC0gaGFuZGxlcyBzcGVjaWZpYy1MU0FQIExMQyBmcmFtZXMNCisgICAgICAgICAqIDIgLSBoYW5kbGVzIHNwZWNpZmljLUxTQVAgTExDIGZyYW1lcw0KKyAgICAgICAgICogMy0zMSAtIHJlc2VydmVkIG11c3QgYmUgMA0KKyAgICAgICAgICovDQorICAgICAgICB2b2lkICAoKnJlcXVlc3RDb25maXJtKSAodm9pZCk7DQorICAgICAgICB2b2lkICAoKnRyYW5zbWl0Q29uZmlybSkgKHZvaWQpOw0KKyAgICAgICAgdm9pZCAgKCpyZWNlaXZlTG9va2FoZWFkKSAodm9pZCk7DQorICAgICAgICB2b2lkICAoKmluZGljYXRpb25Db21wbGV0ZSkgKHZvaWQpOw0KKyAgICAgICAgdm9pZCAgKCpyZWNlaXZlQ2hhaW4pICh2b2lkKTsNCisgICAgICAgIHZvaWQgICgqc3RhdHVzKSAodm9pZCk7DQorICAgICAgfSBQcm90RGlzcGF0Y2g7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX1JlcUJsb2NrIHsNCisgICAgICAgIFdPUkQgICAgICBvcGNvZGU7DQorICAgICAgICBXT1JEICAgICAgc3RhdHVzOw0KKyAgICAgICAgQllURSBGQVIgKnBvaW50ZXIxOw0KKyAgICAgICAgQllURSBGQVIgKnBvaW50ZXIyOw0KKyAgICAgICAgV09SRCAgICAgIHdvcmQxOw0KKyAgICAgIH0gUmVxQmxvY2s7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX1R4QnVmRGVzY3JSZWMgew0KKyAgICAgICAgQllURSAgIHR4UHRyVHlwZTsNCisgICAgICAgIEJZVEUgICBkdW1teTsNCisgICAgICAgIFdPUkQgICB0eERhdGFMZW47DQorICAgICAgICBCWVRFICAqdHhEYXRhUHRyOw0KKyAgICAgIH0gVHhCdWZEZXNjclJlYzsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfVHhCdWZEZXNjciB7DQorICAgICAgICBXT1JEICAgICAgICAgIHR4SW1tZWRMZW47DQorICAgICAgICBCWVRFICAgICAgICAgKnR4SW1tZWRQdHI7DQorICAgICAgICBXT1JEICAgICAgICAgIHR4RGF0YUNvdW50Ow0KKyAgICAgICAgVHhCdWZEZXNjclJlYyB0eEJ1ZkRlc2NyUmVjW05ESVNfVFhfQlVGX0xFTkdUSF07DQorICAgICAgfSBUeEJ1ZkRlc2NyOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9UREJ1ZkRlc2NyUmVjIHsNCisgICAgICAgIEJZVEUgICB0RFB0clR5cGU7DQorICAgICAgICBCWVRFICAgZHVtbXk7DQorICAgICAgICBXT1JEICAgdEREYXRhTGVuOw0KKyAgICAgICAgQllURSAgKnRERGF0YVB0cjsNCisgICAgICB9IFREQnVmRGVzY3JSZWM7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX1REQnVmRGVzY3Igew0KKyAgICAgICAgV09SRCAgICAgICAgICB0RERhdGFDb3VudDsNCisgICAgICAgIFREQnVmRGVzY3JSZWMgdERCdWZEZXNjclJlY1tORElTX1REX0JVRl9MRU5HVEhdOw0KKyAgICAgIH0gVERCdWZEZXNjcjsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfUnhCdWZEZXNjclJlYyB7DQorICAgICAgICBXT1JEICAgcnhEYXRhTGVuOw0KKyAgICAgICAgQllURSAgKnJ4RGF0YVB0cjsNCisgICAgICB9IFJ4QnVmRGVzY3JSZWM7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX1J4QnVmRGVzY3Igew0KKyAgICAgICAgV09SRCAgICAgICAgICByeERhdGFDb3VudDsNCisgICAgICAgIFJ4QnVmRGVzY3JSZWMgcnhCdWZEZXNjclJlY1tORElTX1JYX0JVRl9MRU5HVEhdOw0KKyAgICAgIH0gUnhCdWZEZXNjcjsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfUGt0QnVmIHsNCisJc3RydWN0IF9Qa3RCdWYgKm5leHRMaW5rOw0KKwlzdHJ1Y3QgX1BrdEJ1ZiAqcHJldkxpbms7DQorICAgICAgICBpbnQgICAgaGFuZGxlOw0KKyAgICAgICAgaW50ICAgIGxlbmd0aDsNCisgICAgICAgIGludCAgICBwYWNrZXRMZW5ndGg7DQorICAgICAgICBEV09SRCAgc2VxdWVuY2U7DQorICAgICAgICBCWVRFICAqYnVmZmVyOw0KKyAgICAgIH0gUGt0QnVmOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9DYXJkSGFuZGxlIHsNCisgICAgICAgIEJZVEUgICAgICAgICBtb2R1bGVOYW1lWzE2XTsNCisgICAgICAgIENvbW1vbkNoYXJzICpjb21tb247DQorICAgICAgfSBDYXJkSGFuZGxlOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IF9CaW5kaW5nc0xpc3Qgew0KKyAgICAgICAgV09SRCAgbnVtQmluZGluZ3M7DQorICAgICAgICBCWVRFICBtb2R1bGVOYW1lWzJdWzE2XTsNCisgICAgICB9IEJpbmRpbmdzTGlzdDsNCisNCisNCit0eXBlZGVmIHN0cnVjdCBfRmFpbGluZ01vZHVsZXMgew0KKyAgICAgICAgQllURSAgdXBwZXJNb2R1bGVOYW1lWzE2XTsNCisgICAgICAgIEJZVEUgIGxvd2VyTW9kdWxlTmFtZVsxNl07DQorICAgICAgfSBGYWlsaW5nTW9kdWxlczsNCisNCisNCit0eXBlZGVmIHVuaW9uIF9IYXJkd2FyZUFkZHJlc3Mgew0KKyAgICAgICAgQllURSAgYnl0ZXNbNl07DQorICAgICAgICBXT1JEICB3b3Jkc1szXTsNCisgICAgICAgIHN0cnVjdCB7DQorICAgICAgICAgIEJZVEUgYnl0ZXNbNl07DQorICAgICAgICB9IGFkZHI7DQorICAgICAgfSBIYXJkd2FyZUFkZHJlc3M7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX0ZkZGlIZWFkZXIgew0KKyAgICAgICAgQllURSAgICAgICAgICAgICBmcmFtZUNvbnRyb2w7DQorICAgICAgICBIYXJkd2FyZUFkZHJlc3MgIGV0aGVyRGVzdEhvc3Q7DQorICAgICAgICBIYXJkd2FyZUFkZHJlc3MgIGV0aGVyU3JjSG9zdDsNCisgICAgICB9IEZkZGlIZWFkZXI7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX0V0aGVybmV0SUlIZWFkZXIgew0KKyAgICAgICAgSGFyZHdhcmVBZGRyZXNzICBldGhlckRlc3RIb3N0Ow0KKyAgICAgICAgSGFyZHdhcmVBZGRyZXNzICBldGhlclNyY0hvc3Q7DQorICAgICAgICBXT1JEICAgICAgICAgICAgIGV0aGVyVHlwZTsNCisgICAgICB9IEV0aGVybmV0SUlIZWFkZXI7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX0llZWU4MDJEb3Q1SGVhZGVyIHsNCisgICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJEZXN0SG9zdDsNCisgICAgICAgIEhhcmR3YXJlQWRkcmVzcyAgZXRoZXJTcmNIb3N0Ow0KKyAgICAgICAgQllURSAgICAgICAgICAgICByb3V0ZUluZm9bMzBdOw0KKyAgICAgIH0gSWVlZTgwMkRvdDVIZWFkZXI7DQorDQorDQordHlwZWRlZiBzdHJ1Y3QgX0llZWU4MDJEb3QyU25hcEhlYWRlciB7DQorICAgICAgICBCWVRFICBkc2FwOyAgICAgICAgICAgICAgICAgICAgICAvKiAweEFBICovDQorICAgICAgICBCWVRFICBzc2FwOyAgICAgICAgICAgICAgICAgICAgICAvKiAweEFBICovDQorICAgICAgICBCWVRFICBjb250cm9sOyAgICAgICAgICAgICAgICAgICAvKiAzICAgICovDQorICAgICAgICBCWVRFIHByb3RvY29sSWRbNV07DQorICAgICAgfSBJZWVlODAyRG90MlNuYXBIZWFkZXI7DQorDQorDQorLyoNCisgKiAgUHJvdG90eXBlcw0KKyAqLw0KK2V4dGVybiBjaGFyICpOZGlzTGFzdEVycm9yICAgICAgICAodm9pZCk7DQorZXh0ZXJuIGludCAgIE5kaXNPcGVuICAgICAgICAgICAgICh2b2lkKTsNCitleHRlcm4gaW50ICAgTmRpc0luaXQgICAgICAgICAgICAgKGludCBwcm9taXMpOw0KK2V4dGVybiBpbnQgICBOZGlzUmVnaXN0ZXJBbmRCaW5kICAoaW50IHByb21pcyk7DQorZXh0ZXJuIHZvaWQgIE5kaXNTaHV0ZG93biAgICAgICAgICh2b2lkKTsNCitleHRlcm4gdm9pZCAgTmRpc0NoZWNrTWFjRmVhdHVyZXMgKHN0cnVjdCBfQ2FyZEhhbmRsZSAqY2FyZCk7DQorZXh0ZXJuIGludCAgIE5kaXNTZW5kUGFja2V0ICAgICAgIChzdHJ1Y3QgX1BrdEJ1ZiAqcGt0QnVmLCBpbnQgbWFjSWQpOw0KKw0KKy8qDQorICogIEFzc2VtYmx5ICJnbHVlIiBmdW5jdGlvbnMNCisgKi8NCitleHRlcm4gaW50IHN5c3RlbVJlcXVlc3RHbHVlKCk7DQorZXh0ZXJuIGludCByZXF1ZXN0Q29uZmlybUdsdWUoKTsNCitleHRlcm4gaW50IHRyYW5zbWl0Q29uZmlybUdsdWUoKTsNCitleHRlcm4gaW50IHJlY2VpdmVMb29rYWhlYWRHbHVlKCk7DQorZXh0ZXJuIGludCBpbmRpY2F0aW9uQ29tcGxldGVHbHVlKCk7DQorZXh0ZXJuIGludCByZWNlaXZlQ2hhaW5HbHVlKCk7DQorZXh0ZXJuIGludCBzdGF0dXNHbHVlKCk7DQorDQorLyoNCisgKiAgSU9DVEwgZnVuY3Rpb24NCisgKi8NCisjaWZkZWYgX19TTUFMTF9fDQorZXh0ZXJuIGludCBfZmFyIE5kaXNHZXRMaW5rYWdlIChpbnQgaGFuZGxlLCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7DQorI2Vsc2UNCitleHRlcm4gaW50IE5kaXNHZXRMaW5rYWdlIChpbnQgaGFuZGxlLCBjaGFyICpkYXRhLCBpbnQgc2l6ZSk7DQorI2VuZGlmDQorDQorLyoNCisgKiAgTkRJUyBjYWxsYmFjayBoYW5kbGVycw0KKyAqLw0KK0NBTExCQUNLIChOZGlzU3lzdGVtUmVxdWVzdCAgICAgKERXT1JELERXT1JELCBXT1JELCBXT1JELCBXT1JEKSk7DQorQ0FMTEJBQ0sgKE5kaXNSZXF1ZXN0Q29uZmlybSAgICAoIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQsIFdPUkQsV09SRCkpOw0KK0NBTExCQUNLIChOZGlzVHJhbnNtaXRDb25maXJtICAgKCBXT1JELCBXT1JELCBXT1JELCBXT1JELCBXT1JEKSk7DQorQ0FMTEJBQ0sgKE5kaXNSZWNlaXZlTG9va2FoZWFkICAoIFdPUkQsIFdPUkQsIFdPUkQsIEJZVEUqLCBCWVRFKiwgV09SRCkpOw0KK0NBTExCQUNLIChOZGlzUmVjZWl2ZUNoYWluICAgICAgKCBXT1JELCBXT1JELCBXT1JELCBzdHJ1Y3QgX1J4QnVmRGVzY3IqLCBCWVRFKiwgV09SRCkpOw0KK0NBTExCQUNLIChOZGlzU3RhdHVzUHJvYyAgICAgICAgKCBXT1JELCBXT1JELCBCWVRFKiwgV09SRCxXT1JEKSk7DQorQ0FMTEJBQ0sgKE5kaXNJbmRpY2F0aW9uQ29tcGxldGUoIFdPUkQsIFdPUkQpKTsNCisNCitCWVRFICpOZGlzQWxsb2NTdGFjayAodm9pZCk7DQordm9pZCAgTmRpc0ZyZWVTdGFjayAgKEJZVEUqKTsNCisNCisjaWZkZWYgX19ISUdIQ19fDQorICAjZGVmaW5lIFJFTkFNRV9BU01fU1lNKHgpIHByYWdtYSBBbGlhcyh4LCJAIiAjeCAiIikgIC8qIHByZXBlbmQgYEAnICovDQorICAjZGVmaW5lIFJFTkFNRV9DX1NZTSh4KSAgIHByYWdtYSBBbGlhcyh4LCJfIiAjeCAiIikgIC8qIHByZXBlbmQgYF8nICovDQorDQorICBSRU5BTUVfQVNNX1NZTSAoc3lzdGVtUmVxdWVzdEdsdWUpOw0KKyAgUkVOQU1FX0FTTV9TWU0gKHJlcXVlc3RDb25maXJtR2x1ZSk7DQorICBSRU5BTUVfQVNNX1NZTSAodHJhbnNtaXRDb25maXJtR2x1ZSk7DQorICBSRU5BTUVfQVNNX1NZTSAocmVjZWl2ZUxvb2thaGVhZEdsdWUpOw0KKyAgUkVOQU1FX0FTTV9TWU0gKGluZGljYXRpb25Db21wbGV0ZUdsdWUpOw0KKyAgUkVOQU1FX0FTTV9TWU0gKHJlY2VpdmVDaGFpbkdsdWUpOw0KKyAgUkVOQU1FX0FTTV9TWU0gKHN0YXR1c0dsdWUpOw0KKyAgUkVOQU1FX0FTTV9TWU0gKE5kaXNHZXRMaW5rYWdlKTsNCisgIFJFTkFNRV9DX1NZTSAgIChOZGlzU3lzdGVtUmVxdWVzdCk7DQorICBSRU5BTUVfQ19TWU0gICAoTmRpc1JlcXVlc3RDb25maXJtKTsNCisgIFJFTkFNRV9DX1NZTSAgIChOZGlzVHJhbnNtaXRDb25maXJtKTsNCisgIFJFTkFNRV9DX1NZTSAgIChOZGlzUmVjZWl2ZUxvb2thaGVhZCk7DQorICBSRU5BTUVfQ19TWU0gICAoTmRpc0luZGljYXRpb25Db21wbGV0ZSk7DQorICBSRU5BTUVfQ19TWU0gICAoTmRpc1JlY2VpdmVDaGFpbik7DQorICBSRU5BTUVfQ19TWU0gICAoTmRpc1N0YXR1c1Byb2MpOw0KKyAgUkVOQU1FX0NfU1lNICAgKE5kaXNBbGxvY1N0YWNrKTsNCisgIFJFTkFNRV9DX1NZTSAgIChOZGlzRnJlZVN0YWNrKTsNCisjZW5kaWYNCisNCisjZW5kaWYNCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL21zZG9zL25kaXNfMC5hc20gYi9saWJwY2FwLTEuMy4wL21zZG9zL25kaXNfMC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5MDk4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvbmRpc18wLmFzbQpAQCAtMCwwICsxLDE4OCBAQAorUEFHRSA2MCwxMzINCitOQU1FIE5ESVNfMA0KKw0KK2lmZGVmIERPU1gNCisgIC4zODYNCisgIF9URVhUICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgVVNFMTYgJ0NPREUnDQorICBfVEVYVCAgIEVORFMNCisgIF9EQVRBICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgVVNFMTYgJ0NPREUnDQorICBfREFUQSAgIEVORFMNCisgIF9URVhUMzIgU0VHTUVOVCBQVUJMSUMgQllURSAgVVNFMzIgJ0NPREUnDQorICBfVEVYVDMyIEVORFMNCisgIENCX0RTRUcgRVFVIDxDUz4gICAgICAgICAgICAgICAgICAgICAgICAgIDsgRE9TWCBpcyB0aW55LW1vZGVsDQorICBEX1NFRyAgIEVRVSA8X1RFWFQgU0VHTUVOVD4NCisgIERfRU5EICAgRVFVIDxfVEVYVCBFTkRTPg0KKyAgQVNTVU1FICBDUzpfVEVYVCxEUzpfVEVYVA0KKw0KKyAgUFVTSFJFR1MgZXF1IDxwdXNoYWQ+DQorICBQT1BSRUdTICBlcXUgPHBvcGFkPg0KKw0KKyAgUFVCUFJPQyBtYWNybyBuYW1lDQorICAgICAgICAgIGFsaWduIDQNCisgICAgICAgICAgcHVibGljIEAmbmFtZQ0KKyAgICAgICAgICBAJm5hbWUgbGFiZWwgbmVhcg0KKyAgICAgICAgICBlbmRtDQorZWxzZQ0KKyAgLjI4Ng0KKyAgX1RFWFQgICBTRUdNRU5UIFBVQkxJQyBEV09SRCAnQ09ERScNCisgIF9URVhUICAgRU5EUw0KKyAgX0RBVEEgICBTRUdNRU5UIFBVQkxJQyBEV09SRCAnREFUQScNCisgIF9EQVRBICAgRU5EUw0KKyAgQ0JfRFNFRyBFUVUgPFNFRyBfREFUQT4gICAgICAgICAgICAgICAgICAgOyAxNmJpdCBpcyBzbWFsbC9sYXJnZSBtb2RlbA0KKyAgRF9TRUcgICBFUVUgPF9EQVRBIFNFR01FTlQ+DQorICBEX0VORCAgIEVRVSA8X0RBVEEgRU5EUz4NCisgIEFTU1VNRSAgQ1M6X1RFWFQsRFM6X0RBVEENCisNCisgIFBVU0hSRUdTIGVxdSA8cHVzaGE+DQorICBQT1BSRUdTICBlcXUgPHBvcGE+DQorDQorICBQVUJQUk9DICBtYWNybyBuYW1lDQorICAgICAgICAgICBwdWJsaWMgXyZuYW1lDQorICAgICAgICAgICBfJm5hbWUgbGFiZWwgZmFyDQorICAgICAgICAgICBlbmRtDQorZW5kaWYNCisNCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0RfU0VHDQorDQorRF9FTkQNCisNCisNCitfVEVYVCBTRUdNRU5UDQorDQorRVhUUk4gX05kaXNTeXN0ZW1SZXF1ZXN0ICAgICAgOiBuZWFyDQorRVhUUk4gX05kaXNSZXF1ZXN0Q29uZmlybSAgICAgOiBuZWFyDQorRVhUUk4gX05kaXNUcmFuc21pdENvbmZpcm0gICAgOiBuZWFyDQorRVhUUk4gX05kaXNSZWNlaXZlTG9va2FoZWFkICAgOiBuZWFyDQorRVhUUk4gX05kaXNJbmRpY2F0aW9uQ29tcGxldGUgOiBuZWFyDQorRVhUUk4gX05kaXNSZWNlaXZlQ2hhaW4gICAgICAgOiBuZWFyDQorRVhUUk4gX05kaXNTdGF0dXNQcm9jICAgICAgICAgOiBuZWFyDQorRVhUUk4gX05kaXNBbGxvY1N0YWNrICAgICAgICAgOiBuZWFyDQorRVhUUk4gX05kaXNGcmVlU3RhY2sgICAgICAgICAgOiBuZWFyDQorDQorOw0KKzsgKkFMTCogaW50ZXJydXB0IHRocmVhZHMgY29tZSB0aHJvdWdoIHRoaXMgbWFjcm8uDQorOw0KK0NBTExCQUNLIG1hY3JvIGNhbGxiYWNrUHJvYywgYXJnc1NpemUNCisNCisgICAgIHB1c2hmDQorICAgICBQVVNIUkVHUyAgICAgICAgICAgICAgICA7OyBTYXZlIHRoZSByZWdpc3RlcnMNCisNCisgICAgIHB1c2ggZXMNCisgICAgIHB1c2ggZHMNCisgICAgIG1vdiAgYXgsQ0JfRFNFRyAgICAgICAgIDs7IExvYWQgRFMNCisgICAgIG1vdiAgZHMsYXgNCisgICAgIGNhbGwgX05kaXNBbGxvY1N0YWNrICAgIDs7IEdldCBhbmQgaW5zdGFsbCBhIHN0YWNrLg0KKw0KKyAgICAgbW92ICBieCxzcyAgICAgICAgICAgICAgOzsgU2F2ZSBvZmYgdGhlIG9sZCBzdGFjayBpbiBvdGhlciByZWdzDQorICAgICBtb3YgIGN4LHNwDQorICAgICBtb3YgIHNzLGR4ICAgICAgICAgICAgICA7OyBJbnN0YWxsIHRoZSBuZXcgb25lDQorICAgICBtb3YgIHNwLGF4DQorICAgICBwdXNoIGJ4ICAgICAgICAgICAgICAgICA7OyBTYXZlIHRoZSBvbGQgb25lIG9uIHRvIHRoZSBuZXcgc3RhY2sNCisgICAgIHB1c2ggY3gNCisgICAgIHN1YiAgc3AsJmFyZ3NTaXplICAgICAgIDs7IEFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgb24gdGhlIHN0YWNrDQorDQorICAgICBtb3YgIGF4LHNzICAgICAgICAgICAgICA7OyBTZXQgdXAgdGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgbW92ZQ0KKyAgICAgbW92ICBlcyxheA0KKyAgICAgbW92ICBkaSxzcA0KKyAgICAgbW92ICBkcyxieCAgICAgICAgICAgICAgOzsgU2V0IHVwIHRoZSBzb3VyY2UgZm9yIHRoZSBtb3ZlLg0KKyAgICAgbW92ICBzaSxjeA0KKyAgICAgYWRkICBzaSw0KzYrMzINCisNCisgICAgIG1vdiAgY3gsJmFyZ3NTaXplICAgICAgIDs7IE1vdmUgdGhlIGFyZ3VtZW50cyB0byB0aGUgc3RhY2suDQorICAgICBzaHIgIGN4LDENCisgICAgIGNsZA0KKyAgICAgcmVwICBtb3Zzdw0KKw0KKyAgICAgbW92ICBheCxDQl9EU0VHICAgICAgICAgOzsgU2V0IG15IGRhdGEgc2VnbWVudCBhZ2Fpbi4NCisgICAgIG1vdiAgZHMsYXgNCisNCisgICAgIGNhbGwgJmNhbGxiYWNrUHJvYyAgICAgIDs7IENhbGwgdGhlIHJlYWwgY2FsbGJhY2suDQorICAgICBwb3AgIGRpICAgICAgICAgICAgICAgICA7OyBQb3Agb2ZmIHRoZSBvbGQgc3RhY2sNCisgICAgIHBvcCAgc2kNCisgICAgIG1vdiAgYngsc3MgICAgICAgICAgICAgIDs7IFNhdmUgb2ZmIHRoZSBjdXJyZW50IGFsbG9jYXRlZCBzdGFjay4NCisgICAgIG1vdiAgY3gsc3ANCisgICAgIG1vdiAgc3Msc2kgICAgICAgICAgICAgIDs7IFJlc3RvcmUgdGhlIG9sZCBzdGFjaw0KKyAgICAgbW92ICBzcCxkaQ0KKyAgICAgcHVzaCBheCAgICAgICAgICAgICAgICAgOzsgU2F2ZSB0aGUgcmV0dXJuIGNvZGUNCisgICAgIHB1c2ggYnggICAgICAgICAgICAgICAgIDs7IEZyZWUgdGhlIHN0YWNrLiBQdXNoIHRoZSBwb2ludGVyIHRvIGl0DQorICAgICBwdXNoIGN4DQorICAgICBjYWxsIF9OZGlzRnJlZVN0YWNrDQorICAgICBhZGQgIHNwLDQNCisgICAgIHBvcCAgYXggICAgICAgICAgICAgICAgIDs7IEdldCB0aGUgcmV0dXJuIGNvZGUgYmFjaw0KKyAgICAgYWRkICBkaSwzMiAgICAgICAgICAgICAgOzsgR2V0IGEgcG9pbnRlciB0byBheCBvbiB0aGUgc3RhY2sNCisgICAgIG1vdiAgd29yZCBwdHIgc3M6W2RpXSxheA0KKyAgICAgcG9wICBkcw0KKyAgICAgcG9wICBlcw0KKw0KKyAgICAgUE9QUkVHUw0KKyAgICAgcG9wZg0KK2VuZG0NCisNCis7DQorOyBEZWZpbmUgYWxsIG9mIHRoZSBjYWxsYmFja3MgZm9yIHRoZSBORElTIHByb2NzLg0KKzsNCisNCitQVUJQUk9DIHN5c3RlbVJlcXVlc3RHbHVlDQorQ0FMTEJBQ0sgX05kaXNTeXN0ZW1SZXF1ZXN0LDE0DQorUkVURg0KKw0KK1BVQlBST0MgcmVxdWVzdENvbmZpcm1HbHVlDQorQ0FMTEJBQ0sgX05kaXNSZXF1ZXN0Q29uZmlybSwxMg0KK1JFVEYNCisNCitQVUJQUk9DIHRyYW5zbWl0Q29uZmlybUdsdWUNCitDQUxMQkFDSyBfTmRpc1RyYW5zbWl0Q29uZmlybSwxMA0KK1JFVEYNCisNCitQVUJQUk9DIHJlY2VpdmVMb29rYWhlYWRHbHVlDQorQ0FMTEJBQ0sgX05kaXNSZWNlaXZlTG9va2FoZWFkLDE2DQorUkVURg0KKw0KK1BVQlBST0MgaW5kaWNhdGlvbkNvbXBsZXRlR2x1ZQ0KK0NBTExCQUNLIF9OZGlzSW5kaWNhdGlvbkNvbXBsZXRlLDQNCitSRVRGDQorDQorUFVCUFJPQyByZWNlaXZlQ2hhaW5HbHVlDQorQ0FMTEJBQ0sgX05kaXNSZWNlaXZlQ2hhaW4sMTYNCitSRVRGDQorDQorUFVCUFJPQyBzdGF0dXNHbHVlDQorQ0FMTEJBQ0sgX05kaXNTdGF0dXNQcm9jLDEyDQorUkVURg0KKw0KKzsNCis7IGludCBGQVIgTmRpc0dldExpbmthZ2UgKGludCBoYW5kbGUsIGNoYXIgKmRhdGEsIGludCBzaXplKTsNCis7DQorDQoraWZkZWYgRE9TWA0KKyAgUFVCUFJPQyBOZGlzR2V0TGlua2FnZQ0KKyAgICAgICAgICBwdXNoIGVieA0KKyAgICAgICAgICBtb3YgZWJ4LCBbZXNwKzhdICAgICAgICAgICAgICA7IGRldmljZSBoYW5kbGUNCisgICAgICAgICAgbW92IGVheCwgNDQwMmggICAgICAgICAgICAgICAgOyBJT0NUUkwgcmVhZCBmdW5jdGlvbg0KKyAgICAgICAgICBtb3YgZWR4LCBbZXNwKzEyXSAgICAgICAgICAgICA7IERTOkVEWCAtPiByZXN1bHQgZGF0YQ0KKyAgICAgICAgICBtb3YgZWN4LCBbZXNwKzE2XSAgICAgICAgICAgICA7IEVDWCA9IGxlbmd0aA0KKyAgICAgICAgICBpbnQgMjFoDQorICAgICAgICAgIHBvcCBlYngNCisgICAgICAgICAgamMgIEBmYWlsDQorICAgICAgICAgIHhvciBlYXgsIGVheA0KKyAgQGZhaWw6ICByZXQNCisNCitlbHNlDQorICBQVUJQUk9DIE5kaXNHZXRMaW5rYWdlDQorICAgICAgICAgIGVudGVyIDAsIDANCisgICAgICAgICAgbW92IGJ4LCBbYnArNl0NCisgICAgICAgICAgbW92IGF4LCA0NDAyaA0KKyAgICAgICAgICBtb3YgZHgsIFticCs4XQ0KKyAgICAgICAgICBtb3YgY3gsIFticCsxMl0NCisgICAgICAgICAgaW50IDIxaA0KKyAgICAgICAgICBqYyAgQGZhaWwNCisgICAgICAgICAgeG9yIGF4LCBheA0KKyAgQGZhaWw6ICBsZWF2ZQ0KKyAgICAgICAgICByZXRmDQorZW5kaWYNCisNCitFTkRTDQorDQorRU5EDQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9tc2Rvcy9wa3RfcngwLmFzbSBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvcGt0X3J4MC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmM2QwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvcGt0X3J4MC5hc20KQEAgLTAsMCArMSwxOTcgQEAKK1BBR0UgNjAsMTMyDQorTkFNRSBQS1RfUlgNCisNCitpZmRlZiA/P3ZlcnNpb24gICAgICAgIDsgdXNpbmcgVEFTTQ0KKyAgbWFzbQ0KKyAganVtcHMNCitlbmRpZg0KKw0KK1BVQkxJQyBfcGt0RHJvcCwgX3BrdFJ4QnVmLCBfcGt0VHhCdWYsICAgIF9wa3RUZW1wDQorUFVCTElDIF9yeE91dE9mcywgX3J4SW5PZnMsIF9Qa3RSZWNlaXZlciwgX3BrdFJ4RW5kDQorDQorOw0KKzsgdGhlc2Ugc2l6ZXMgTVVTVCBiZSBlcXVhbCB0byB0aGUgc2l6ZXMgaW4gUEtURFJWUi5IDQorOw0KKw0KK1JYX0JVRl9TSVpFID0gMTUwMCAgICAgIDsgbWF4IG1lc3NhZ2Ugc2l6ZSBvbiBFdGhlcm5ldA0KK1RYX0JVRl9TSVpFID0gMTUwMA0KKw0KK2lmZGVmIERPU1gNCisgLjM4Ng0KKyAgTlVNX1JYX0JVRiA9IDMyICAgICAgIDsgIyBvZiBSWCBlbGVtZW50IGJ1ZmZlcnMNCisgIF9URVhUICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgVVNFMTYgJ0NPREUnDQorICBfVEVYVCAgIEVORFMNCisgIF9EQVRBICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgVVNFMTYgJ0NPREUnDQorICBfREFUQSAgIEVORFMNCisgIERfU0VHICAgRVFVIDxfVEVYVCBTRUdNRU5UPg0KKyAgRF9FTkQgICBFUVUgPF9URVhUIEVORFM+DQorICBBU1NVTUUgIENTOl9URVhULERTOl9URVhUDQorZWxzZQ0KKyAuMjg2DQorICBOVU1fUlhfQlVGID0gMTANCisgIF9URVhUICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgJ0NPREUnDQorICBfVEVYVCAgIEVORFMNCisgIF9EQVRBICAgU0VHTUVOVCBQVUJMSUMgRFdPUkQgJ0RBVEEnDQorICBfREFUQSAgIEVORFMNCisgIERfU0VHICAgRVFVIDxfREFUQSBTRUdNRU5UPg0KKyAgRF9FTkQgICBFUVUgPF9EQVRBIEVORFM+DQorICBBU1NVTUUgIENTOl9URVhULERTOl9EQVRBDQorZW5kaWYNCisNCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK0RfU0VHDQorDQorUlhfRUxFTUVOVCAgICAgU1RSVUMNCisgICBmaXJzdENvdW50ICBkdyAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgOyAjIG9mIGJ5dGVzIG9uIDFzdCBjYWxsDQorICAgc2Vjb25kQ291bnQgZHcgIDAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgIyBvZiBieXRlcyBvbiAybmQgY2FsbA0KKyAgIGhhbmRsZSAgICAgIGR3ICAwICAgICAgICAgICAgICAgICAgICAgICAgICA7IGhhbmRsZSBmb3IgdXBjYWxsDQorICAgZGVzdGluQWRyICAgZGIgIDYgICAgICAgICAgIGR1cCAoMCkgICAgICAgIDsgcGFja2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MNCisgICBzb3VyY2VBZHIgICBkYiAgNiAgICAgICAgICAgZHVwICgwKSAgICAgICAgOyBwYWNrZXQgc291cmNlIGFkZHJlc3MNCisgICBwcm90b2NvbCAgICBkdyAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgcHJvdG9jb2wgbnVtYmVyDQorICAgcnhCdWZmZXIgICAgZGIgIFJYX0JVRl9TSVpFIGR1cCAoMCkgICAgICAgIDsgUlggYnVmZmVyDQorRU5EUw0KKyAgICAgICAgICAgICAgIGFsaWduIDQNCitfcnhPdXRPZnMgICAgICBkdyAgb2Zmc2V0IF9wa3RSeEJ1ZiAgICAgICAgICAgOyByaW5nIGJ1ZmZlciBvZmZzZXRzDQorX3J4SW5PZnMgICAgICAgZHcgIG9mZnNldCBfcGt0UnhCdWYgICAgICAgICAgIDsgaW50byBfcGt0UnhCdWYNCitfcGt0RHJvcCAgICAgICBkdyAgMCwwICAgICAgICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgZHJvcCBjb3VudGVyDQorX3BrdFRlbXAgICAgICAgZGIgIDIwICAgICAgICAgICAgICAgIGR1cCAoMCkgIDsgdGVtcCB3b3JrIGFyZWENCitfcGt0VHhCdWYgICAgICBkYiAgKFRYX0JVRl9TSVpFKzE0KSAgZHVwICgwKSAgOyBUWCBidWZmZXINCitfcGt0UnhCdWYgICAgICBSWF9FTEVNRU5UIE5VTV9SWF9CVUYgZHVwICg8PikgOyBSWCBzdHJ1Y3R1cmVzDQorIExBU1RfT0ZTICAgICAgPSBvZmZzZXQgJA0KKw0KKyBzY3JlZW5TZWcgICAgIGR3ICAwQjgwMGgNCisgbmV3SW5PZmZzZXQgICBkdyAgMA0KKw0KKyBmYW5DaGFycyAgICAgIGRiICAnLVx8LycNCisgZmFuSW5kZXggICAgICBkdyAgMA0KKw0KK0RfRU5EDQorDQorX1RFWFQgU0VHTUVOVA0KKw0KKw0KK1NIT1dfUlggIE1BQ1JPDQorICAgICAgICAgcHVzaCBlcw0KKyAgICAgICAgIHB1c2ggYngNCisgICAgICAgICBtb3YgYngsIHNjcmVlblNlZw0KKyAgICAgICAgIG1vdiBlcywgYnggICAgICAgICAgICAgICAgICAgIDs7IHItbW9kZSBzZWdtZW50IG9mIGNvbG91ciBzY3JlZW4NCisgICAgICAgICBtb3YgZGksIDE1OCAgICAgICAgICAgICAgICAgICA7OyB1cHBlciByaWdodCBjb3JuZXIgLSAxDQorICAgICAgICAgbW92IGJ4LCBmYW5JbmRleA0KKyAgICAgICAgIG1vdiBhbCwgZmFuQ2hhcnNbYnhdICAgICAgICAgIDs7IGdldCB3cml0ZSBjaGFyDQorICAgICAgICAgbW92IGFoLCAxNSAgICAgICAgICAgICAgICAgICAgOzsgIGFuZCB3aGl0ZSBjb2xvdXINCisgICAgICAgICBzdG9zdyAgICAgICAgICAgICAgICAgICAgICAgICA7OyB3cml0ZSB0byBzY3JlZW4gYXQgRVM6RURJDQorICAgICAgICAgaW5jIGZhbkluZGV4ICAgICAgICAgICAgICAgICAgOzsgdXBkYXRlIG5leHQgaW5kZXgNCisgICAgICAgICBhbmQgZmFuSW5kZXgsIDMNCisgICAgICAgICBwb3AgYngNCisgICAgICAgICBwb3AgZXMNCitFTkRNDQorDQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKzsNCis7IFRoaXMgbWFjcm8gcmV0dXJuIEVTOkRJIHRvIHRhaWwgb2YgUnggcXVldWUNCisNCitFTlFVRVVFICBNQUNSTw0KKyAgICAgICAgIExPQ0FMIEBub1dyYXANCisgICAgICAgICBtb3YgYXgsIF9yeEluT2ZzICAgICAgICAgICAgICA7OyBESSA9IGN1cnJlbnQgaW4tb2Zmc2V0DQorICAgICAgICAgYWRkIGF4LCBTSVpFIFJYX0VMRU1FTlQgICAgICAgOzsgcG9pbnQgdG8gbmV4dCBfcGt0UnhCdWYgYnVmZmVyDQorICAgICAgICAgY21wIGF4LCBMQVNUX09GUyAgICAgICAgICAgICAgOzsgcG9pbnRpbmcgcGFzdCBsYXN0ID8NCisgICAgICAgICBqYiAgQG5vV3JhcCAgICAgICAgICAgICAgICAgICA7OyBubyAtIGp1bXANCisgICAgICAgICBsZWEgYXgsIF9wa3RSeEJ1ZiAgICAgICAgICAgICA7OyB5ZXMsIHBvaW50IHRvIDFzdCBidWZmZXINCisgICAgICAgICBhbGlnbiA0DQorQG5vV3JhcDogY21wIGF4LCBfcnhPdXRPZnMgICAgICAgICAgICAgOzsgaW4tb2ZzID0gb3V0LW9mcyA/DQorICAgICAgICAgamUgIEBkdW1wICAgICAgICAgICAgICAgICAgICAgOzsgeWVzLCBxdWV1ZSBpcyBmdWxsDQorICAgICAgICAgbW92IGRpLCBfcnhJbk9mcyAgICAgICAgICAgICAgOzsgRVM6REkgLT4gYnVmZmVyIGF0IHF1ZXVlIGlucHV0DQorICAgICAgICAgbW92IG5ld0luT2Zmc2V0LCBheCAgICAgICAgICAgOzsgcmVtZW1iZXIgbmV3IGlucHV0IG9mZnNldA0KKw0KKyAgIDs7IE5PVEUuIHJ4SW5PZnMgaXMgdXBkYXRlZCBhZnRlciB0aGUgcGFja2V0IGhhcyBiZWVuIGNvcGllZA0KKyAgIDs7IHRvIEVTOkRJICg9IERTOlNJIG9uIDJuZCBjYWxsKSBieSB0aGUgcGFja2V0IGRyaXZlcg0KKw0KK0VORE0NCisNCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorOw0KKzsgVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGJ5IHRoZSBwYWNrZXQgZHJpdmVyIHR3aWNlOg0KKzsgICAxc3QgdGltZSAoQVg9MCkgaXQgcmVxdWVzdHMgYW4gYWRkcmVzcyB3aGVyZSB0byBwdXQgdGhlIHBhY2tldA0KKzsNCis7ICAgMm5kIHRpbWUgKEFYPTEpIHRoZSBwYWNrZXQgaGFzIGJlZW4gY29waWVkIHRvIHRoaXMgbG9jYXRpb24gKERTOlNJKQ0KKzsgICBCWCBoYXMgY2xpZW50IGhhbmRsZSAoc3RvcmVkIGluIFJYX0VMRU1FTlQuaGFuZGxlKS4NCis7ICAgQ1ggaGFzICMgb2YgYnl0ZXMgaW4gcGFja2V0IG9uIGJvdGggY2FsbC4gVGhleSBzaG91bGQgYmUgZXF1YWwuDQorOw0KKzsgQSB0ZXN0IGZvciBlcXVhbGl0eSBpcyBkb25lIGJ5IHB1dHRpbmcgQ1ggaW4gX3BrdFJ4QnVmIFtuXS5maXJzdENvdW50DQorOyBhbmQgX3BrdFJ4QnVmW25dLnNlY29uZENvdW50LCBhbmQgQ0wgb24gZmlyc3QgY2FsbCBpbg0KKzsgX3BrdFJ4QnVmW25dLnJ4QnVmZmVyW0NYXS4gVGhlc2UgdmFsdWVzIGFyZSBjaGVja2VkIGluICJQa3RSZWNlaXZlIg0KKzsgKFBLVERSVlIuQykNCis7DQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK19Qa3RSZWNlaXZlcjoNCisgICAgICAgICBwdXNoZg0KKyAgICAgICAgIGNsaSAgICAgICAgICAgICAgICAgICAgICAgICA7IG5vIGRpc3RyYWN0aW9uIHdhbnRlZCAhDQorICAgICAgICAgcHVzaCBkcw0KKyAgICAgICAgIHB1c2ggYngNCitpZmRlZiBET1NYDQorICAgICAgICAgbW92IGJ4LCBjcw0KK2Vsc2UNCisgICAgICAgICBtb3YgYngsIFNFRyBfREFUQQ0KK2VuZGlmDQorICAgICAgICAgbW92IGRzLCBieA0KKyAgICAgICAgIG1vdiBlcywgYnggICAgICAgICAgICAgICAgICA7IEVTID0gRFMgPSBDUyBvciBzZWcgX0RBVEENCisgICAgICAgICBwb3AgYnggICAgICAgICAgICAgICAgICAgICAgOyByZXN0b3JlIGhhbmRsZQ0KKw0KKyAgICAgICAgIGNtcCBheCwgMCAgICAgICAgICAgICAgICAgICA7IGZpcnN0IGNhbGw/IChBWD0wKQ0KKyAgICAgICAgIGpuZSBAcG9zdCAgICAgICAgICAgICAgICAgICA7IEFYPTE6IHNlY29uZCBjYWxsLCBkbyBwb3N0IHByb2Nlc3MNCisNCitpZmRlZiBERUJVRw0KKyAgICAgICAgIFNIT1dfUlggICAgICAgICAgICAgICAgICAgICA7IHNob3cgdGhhdCBhIHBhY2tldCBpcyByZWNlaXZlZA0KK2VuZGlmDQorICAgICAgICAgY21wIGN4LCBSWF9CVUZfU0laRSsxNCAgICAgIDsgc2l6ZSBPSyA/DQorICAgICAgICAgamEgIEBza2lwICAgICAgICAgICAgICAgICAgIDsgbm8sIHBhY2tldCB0byBsYXJnZSBmb3IgdXMNCisNCisgICAgICAgICBFTlFVRVVFICAgICAgICAgICAgICAgICAgICAgOyBFUzpESSAtPiBfcGt0UnhCdWZbbl0NCisNCisgICAgICAgICBtb3YgW2RpXS5maXJzdENvdW50LCBjeCAgICAgOyByZW1lbWJlciB0aGUgZmlyc3QgY291bnQuDQorICAgICAgICAgbW92IFtkaV0uaGFuZGxlLCBieCAgICAgICAgIDsgcmVtZW1iZXIgdGhlIGhhbmRsZS4NCisgICAgICAgICBhZGQgZGksIDYgICAgICAgICAgICAgICAgICAgOyBFUzpESSAtPiBfcGt0UnhCdWZbbl0uZGVzdGluQWRyDQorICAgICAgICAgcG9wIGRzDQorICAgICAgICAgcG9wZg0KKyAgICAgICAgIHJldGYgICAgICAgICAgICAgICAgICAgICAgICA7IGZhciByZXR1cm4gdG8gZHJpdmVyIHdpdGggRVM6REkNCisNCisgICAgICAgICBhbGlnbiA0DQorQGR1bXA6ICAgaW5jIF9wa3REcm9wWzBdICAgICAgICAgICAgIDsgZGlzY2FyZCB0aGUgcGFja2V0IG9uIDFzdCBjYWxsDQorICAgICAgICAgYWRjIF9wa3REcm9wWzJdLCAwICAgICAgICAgIDsgaW5jcmVtZW50IHBhY2tldHMgbG9zdA0KKw0KK0Bza2lwOiAgIHhvciBkaSwgZGkgICAgICAgICAgICAgICAgICA7IHJldHVybiBFUzpESSA9IE5JTCBwb2ludGVyDQorICAgICAgICAgeG9yIGF4LCBheA0KKyAgICAgICAgIG1vdiBlcywgYXgNCisgICAgICAgICBwb3AgZHMNCisgICAgICAgICBwb3BmDQorICAgICAgICAgcmV0Zg0KKw0KKyAgICAgICAgIGFsaWduIDQNCitAcG9zdDogICBvciBzaSwgc2kgICAgICAgICAgICAgICAgICAgOyBEUzpTSS0+X3BrdFJ4QnVmW25dW25dLmRlc3RpbkFkcg0KKyAgICAgICAgIGp6IEBkaXNjYXJkICAgICAgICAgICAgICAgICA7IG1ha2Ugc3VyZSB3ZSBkb24ndCB1c2UgTlVMTC1wb2ludGVyDQorDQorICAgICAgICAgc3ViIHNpLCA2ICAgICAgICAgICAgICAgICAgIDsgRFM6U0kgLT4gX3BrdFJ4QnVmW25dLmRlc3RpbkFkcg0KKyAgICAgICA7DQorICAgICAgIDsgcHVzaCBzaQ0KKyAgICAgICA7IHB1c2ggW3NpXS5maXJzdENvdW50DQorICAgICAgIDsgY2FsbCBicGZfZmlsdGVyX21hdGNoICAgICAgIDsgcnVuIHRoZSBmaWx0ZXIgaGVyZSBzb21lIGRheT8NCisgICAgICAgOyBhZGQgc3AsIDQNCisgICAgICAgOyBjbXAgYXgsIDANCisgICAgICAgOyBqZSAgQGRpc2NhcmQNCisNCisgICAgICAgICBtb3YgW3NpXS5zZWNvbmRDb3VudCwgY3gNCisgICAgICAgICBtb3YgYXgsIG5ld0luT2Zmc2V0DQorICAgICAgICAgbW92IF9yeEluT2ZzLCBheCAgICAgICAgICAgIDsgdXBkYXRlIF9wa3RSeEJ1ZiBpbnB1dCBvZmZzZXQNCisNCisgICAgICAgICBhbGlnbiA0DQorQGRpc2NhcmQ6cG9wIGRzDQorICAgICAgICAgcG9wZg0KKyAgICAgICAgIHJldGYNCisNCitfcGt0UnhFbmQgIGRiIDAgICAgICAgICAgICAgICAgICAgICAgOyBtYXJrZXIgZm9yIGVuZCBvZiByLW1vZGUgY29kZS9kYXRhDQorDQorX1RFWFQgRU5EUw0KKw0KK0VORA0KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvbXNkb3MvcGt0X3J4MS5zIGIvbGlicGNhcC0xLjMuMC9tc2Rvcy9wa3RfcngxLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5NGEzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvcGt0X3J4MS5zCkBAIC0wLDAgKzEsMTU1IEBACis7DQorOyBUaGlzIGZpbGUgcmVxdWlyZXMgTkFTTSAwLjk3KyB0byBhc3NlbWJsZQ0KKzsNCis7IEN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIGRqZ3BwICsgRE9TNEdXIHRhcmdldHMNCis7DQorOyB0aGVzZSBzaXplcyBNVVNUIGJlIGVxdWFsIHRvIHRoZSBzaXplcyBpbiBQS1REUlZSLkgNCis7DQorJWRlZmluZSAgRVRIX01UVSAgICAgMTUwMCAgICAgICAgICAgICAgICAgIDsgbWF4IGRhdGEgc2l6ZSBvbiBFdGhlcm5ldA0KKyVkZWZpbmUgIEVUSF9NSU4gICAgIDYwICAgICAgICAgICAgICAgICAgICA7IG1pbi9tYXggdG90YWwgZnJhbWUgc2l6ZQ0KKyVkZWZpbmUgIEVUSF9NQVggICAgIChFVEhfTVRVKzIqNisyKQ0KKyVkZWZpbmUgIE5VTV9SWF9CVUYgIDMyICAgICAgICAgICAgICAgICAgICA7ICMgb2YgUlggZWxlbWVudCBidWZmZXJzDQorJWRlZmluZSAgUlhfU0laRSAgICAgKEVUSF9NQVgrNikgICAgICAgICAgIDsgc2l6ZW9mKFJYX0VMRU1FTlQpID0gMTUxNCs2DQorJWlkZWZpbmUgb2Zmc2V0DQorDQorc3RydWMgUlhfRUxFTUVOVA0KKyAgICAgIC5maXJzdENvdW50ICByZXN3IDEgICAgICAgICAgICAgICAgICA7ICMgb2YgYnl0ZXMgb24gMXN0IGNhbGwNCisgICAgICAuc2Vjb25kQ291bnQgcmVzdyAxICAgICAgICAgICAgICAgICAgOyAjIG9mIGJ5dGVzIG9uIDJuZCBjYWxsDQorICAgICAgLmhhbmRsZSAgICAgIHJlc3cgMSAgICAgICAgICAgICAgICAgIDsgaGFuZGxlIGZvciB1cGNhbGwNCisgICAgOyAudGltZVN0YW1wICAgcmVzdyA0ICAgICAgICAgICAgICAgICAgOyA2NC1iaXQgUkRUU0MgdmFsdWUNCisgICAgICAuZGVzdGluQWRyICAgcmVzYiA2ICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgZGVzdGluYXRpb24gYWRkcmVzcw0KKyAgICAgIC5zb3VyY2VBZHIgICByZXNiIDYgICAgICAgICAgICAgICAgICA7IHBhY2tldCBzb3VyY2UgYWRkcmVzcw0KKyAgICAgIC5wcm90b2NvbCAgICByZXN3IDEgICAgICAgICAgICAgICAgICA7IHBhY2tldCBwcm90b2NvbCBudW1iZXINCisgICAgICAucnhCdWZmZXIgICAgcmVzYiBFVEhfTVRVICAgICAgICAgICAgOyBSWCBidWZmZXINCitlbmRzdHJ1Yw0KKw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorW29yZyAwXSAgOyBhc3NlbWJsZSB0byAuYmluIGZpbGUNCisNCitfcnhPdXRPZnMgICBkdyAgIG9mZnNldCBfcGt0UnhCdWYgICAgICAgICAgOyByaW5nIGJ1ZmZlciBvZmZzZXRzDQorX3J4SW5PZnMgICAgZHcgICBvZmZzZXQgX3BrdFJ4QnVmICAgICAgICAgIDsgaW50byBfcGt0UnhCdWYNCitfcGt0RHJvcCAgICBkdyAgIDAsMCAgICAgICAgICAgICAgICAgICAgICAgOyBwYWNrZXQgZHJvcCBjb3VudGVyDQorX3BrdFRlbXAgICAgcmVzYiAyMCAgICAgICAgICAgICAgICAgICAgICAgIDsgdGVtcCB3b3JrIGFyZWENCitfcGt0VHhCdWYgICByZXNiIChFVEhfTUFYKSAgICAgICAgICAgICAgICAgOyBUWCBidWZmZXINCitfcGt0UnhCdWYgICByZXNiIChSWF9TSVpFKk5VTV9SWF9CVUYpICAgICAgOyBSWCBzdHJ1Y3R1cmVzDQorIExBU1RfT0ZTICAgZXF1ICAkDQorDQorc2NyZWVuU2VnICAgZHcgIDBCODAwaA0KK25ld0luT2Zmc2V0IGR3ICAwDQorDQorZmFuQ2hhcnMgICAgZGIgICctXHwvJw0KK2ZhbkluZGV4ICAgIGR3ICAwDQorDQorJW1hY3JvIFNIT1dfUlggMA0KKyAgICAgICBwdXNoIGVzDQorICAgICAgIHB1c2ggYngNCisgICAgICAgbW92IGJ4LCBbc2NyZWVuU2VnXQ0KKyAgICAgICBtb3YgZXMsIGJ4ICAgICAgICAgICAgICAgICAgICA7OyByLW1vZGUgc2VnbWVudCBvZiBjb2xvdXIgc2NyZWVuDQorICAgICAgIG1vdiBkaSwgMTU4ICAgICAgICAgICAgICAgICAgIDs7IHVwcGVyIHJpZ2h0IGNvcm5lciAtIDENCisgICAgICAgbW92IGJ4LCBbZmFuSW5kZXhdDQorICAgICAgIG1vdiBhbCwgW2ZhbkNoYXJzK2J4XSAgICAgICAgIDs7IGdldCB3cml0ZSBjaGFyDQorICAgICAgIG1vdiBhaCwgMTUgICAgICAgICAgICAgICAgICAgIDs7ICBhbmQgd2hpdGUgY29sb3VyDQorICAgICAgIGNsZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IE5lZWRlZD8NCisgICAgICAgc3Rvc3cgICAgICAgICAgICAgICAgICAgICAgICAgOzsgd3JpdGUgdG8gc2NyZWVuIGF0IEVTOkVESQ0KKyAgICAgICBpbmMgd29yZCBbZmFuSW5kZXhdICAgICAgICAgICA7OyB1cGRhdGUgbmV4dCBpbmRleA0KKyAgICAgICBhbmQgd29yZCBbZmFuSW5kZXhdLCAzDQorICAgICAgIHBvcCBieA0KKyAgICAgICBwb3AgZXMNCislZW5kbWFjcm8NCisNCis7UHV0VGltZVN0YW1wDQorOyAgICAgICByZHRzYw0KKzsgICAgICAgbW92IFtzaV0udGltZVN0YW1wLCBlYXgNCis7ICAgICAgIG1vdiBbc2krNF0udGltZVN0YW1wLCBlZHgNCis7ICAgICAgIHJldA0KKw0KKw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCis7DQorOyBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgYnkgdGhlIHBhY2tldCBkcml2ZXIgdHdpY2U6DQorOyAgIDFzdCB0aW1lIChBWD0wKSBpdCByZXF1ZXN0cyBhbiBhZGRyZXNzIHdoZXJlIHRvIHB1dCB0aGUgcGFja2V0DQorOw0KKzsgICAybmQgdGltZSAoQVg9MSkgdGhlIHBhY2tldCBoYXMgYmVlbiBjb3BpZWQgdG8gdGhpcyBsb2NhdGlvbiAoRFM6U0kpDQorOyAgIEJYIGhhcyBjbGllbnQgaGFuZGxlIChzdG9yZWQgaW4gUlhfRUxFTUVOVC5oYW5kbGUpLg0KKzsgICBDWCBoYXMgIyBvZiBieXRlcyBpbiBwYWNrZXQgb24gYm90aCBjYWxsLiBUaGV5IHNob3VsZCBiZSBlcXVhbC4NCis7IEEgdGVzdCBmb3IgZXF1YWxpdHkgaXMgZG9uZSBieSBwdXR0aW5nIENYIGluIF9wa3RSeEJ1ZiBbbl0uZmlyc3RDb3VudA0KKzsgYW5kIF9wa3RSeEJ1ZltuXS5zZWNvbmRDb3VudCwgYW5kIENMIG9uIGZpcnN0IGNhbGwgaW4NCis7IF9wa3RSeEJ1ZltuXS5yeEJ1ZmZlcltDWF0uIFRoZXNlIHZhbHVlcyBhcmUgY2hlY2tlZCBpbiAiUGt0UmVjZWl2ZSINCis7IChQS1REUlZSLkMpDQorOw0KKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCitfUGt0UmVjZWl2ZXI6DQorICAgICAgICAgcHVzaGYNCisgICAgICAgICBjbGkgICAgICAgICAgICAgICAgICAgICAgICAgOyBubyBkaXN0cmFjdGlvbiB3YW50ZWQgIQ0KKyAgICAgICAgIHB1c2ggZHMNCisgICAgICAgICBwdXNoIGJ4DQorICAgICAgICAgbW92IGJ4LCBjcw0KKyAgICAgICAgIG1vdiBkcywgYngNCisgICAgICAgICBtb3YgZXMsIGJ4ICAgICAgICAgICAgICAgICAgOyBFUyA9IERTID0gQ1Mgb3Igc2VnIF9EQVRBDQorICAgICAgICAgcG9wIGJ4ICAgICAgICAgICAgICAgICAgICAgIDsgcmVzdG9yZSBoYW5kbGUNCisNCisgICAgICAgICBjbXAgYXgsIDAgICAgICAgICAgICAgICAgICAgOyBmaXJzdCBjYWxsPyAoQVg9MCkNCisgICAgICAgICBqbmUgQHBvc3QgICAgICAgICAgICAgICAgICAgOyBBWD0xOiBzZWNvbmQgY2FsbCwgZG8gcG9zdCBwcm9jZXNzDQorDQorJWlmZGVmIERFQlVHDQorICAgICAgICAgU0hPV19SWCAgICAgICAgICAgICAgICAgICAgIDsgc2hvdyB0aGF0IGEgcGFja2V0IGlzIHJlY2VpdmVkDQorJWVuZGlmDQorDQorICAgICAgICAgY21wIGN4LCBFVEhfTUFYICAgICAgICAgICAgIDsgc2l6ZSBPSyA/DQorICAgICAgICAgamEgIEBza2lwICAgICAgICAgICAgICAgICAgIDsgbm8sIHRvbyBiaWcNCisNCisgICAgICAgICBtb3YgYXgsIFtfcnhJbk9mc10NCisgICAgICAgICBhZGQgYXgsIFJYX1NJWkUNCisgICAgICAgICBjbXAgYXgsIExBU1RfT0ZTDQorICAgICAgICAgamIgIEBub1dyYXANCisgICAgICAgICBtb3YgYXgsIG9mZnNldCBfcGt0UnhCdWYNCitAbm9XcmFwOg0KKyAgICAgICAgIGNtcCBheCwgW19yeE91dE9mc10NCisgICAgICAgICBqZSAgQGR1bXANCisgICAgICAgICBtb3YgZGksIFtfcnhJbk9mc10gICAgICAgICAgOyBFUzpESSAtPiBfcGt0UnhCdWZbbl0NCisgICAgICAgICBtb3YgW25ld0luT2Zmc2V0XSwgYXgNCisNCisgICAgICAgICBtb3YgW2RpXSwgY3ggICAgICAgICAgICAgICAgOyByZW1lbWJlciBmaXJzdENvdW50Lg0KKyAgICAgICAgIG1vdiBbZGkrNF0sIGJ4ICAgICAgICAgICAgICA7IHJlbWVtYmVyIGhhbmRsZS4NCisgICAgICAgICBhZGQgZGksIDYgICAgICAgICAgICAgICAgICAgOyBFUzpESSAtPiBfcGt0UnhCdWZbbl0uZGVzdGluQWRyDQorICAgICAgICAgcG9wIGRzDQorICAgICAgICAgcG9wZg0KKyAgICAgICAgIHJldGYgICAgICAgICAgICAgICAgICAgICAgICA7IGZhciByZXR1cm4gdG8gZHJpdmVyIHdpdGggRVM6REkNCisNCitAZHVtcDogICBhZGQgd29yZCBbX3BrdERyb3ArMF0sIDEgICAgOyBkaXNjYXJkIHRoZSBwYWNrZXQgb24gMXN0IGNhbGwNCisgICAgICAgICBhZGMgd29yZCBbX3BrdERyb3ArMl0sIDAgICAgOyBpbmNyZW1lbnQgcGFja2V0cyBsb3N0DQorDQorQHNraXA6ICAgeG9yIGRpLCBkaSAgICAgICAgICAgICAgICAgIDsgcmV0dXJuIEVTOkRJID0gTklMIHBvaW50ZXINCisgICAgICAgICB4b3IgYXgsIGF4DQorICAgICAgICAgbW92IGVzLCBheA0KKyAgICAgICAgIHBvcCBkcw0KKyAgICAgICAgIHBvcGYNCisgICAgICAgICByZXRmDQorDQorQHBvc3Q6ICAgb3Igc2ksIHNpICAgICAgICAgICAgICAgICAgIDsgRFM6U0ktPl9wa3RSeEJ1ZltuXVtuXS5kZXN0aW5BZHINCisgICAgICAgICBqeiBAZGlzY2FyZCAgICAgICAgICAgICAgICAgOyBtYWtlIHN1cmUgd2UgZG9uJ3QgdXNlIE5VTEwtcG9pbnRlcg0KKw0KKyAgICAgICA7DQorICAgICAgIDsgcHVzaCBzaQ0KKyAgICAgICA7IGNhbGwgYnBmX2ZpbHRlcl9tYXRjaCAgICAgICA7IHJ1biB0aGUgZmlsdGVyIGhlcmUgc29tZSBkYXkNCisgICAgICAgOyBwb3Agc2kNCisgICAgICAgOyBjbXAgYXgsIDANCisgICAgICAgOyBqZSAgQGRpc2NhcmQNCisNCisgICAgICAgICBtb3YgW3NpLTYrMl0sIGN4ICAgICAgICAgICAgOyBzdG9yZSBfcGt0UnhCdWZbbl0uc2Vjb25kQ291bnQNCisgICAgICAgICBtb3YgYXgsIFtuZXdJbk9mZnNldF0NCisgICAgICAgICBtb3YgW19yeEluT2ZzXSwgYXggICAgICAgICAgOyB1cGRhdGUgX3BrdFJ4QnVmIGlucHV0IG9mZnNldA0KKw0KKyAgICAgICA7IGNhbGwgUHV0VGltZVN0YW1wDQorDQorQGRpc2NhcmQ6DQorICAgICAgICAgcG9wIGRzDQorICAgICAgICAgcG9wZg0KKyAgICAgICAgIHJldGYNCisNCitfcGt0UnhFbmQgIGRiIDAgICAgICAgICAgICAgICAgICAgICAgOyBtYXJrZXIgZm9yIGVuZCBvZiByLW1vZGUgY29kZS9kYXRhDQorDQorRU5EDQorDQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9tc2Rvcy9wa3RkcnZyLmMgYi9saWJwY2FwLTEuMy4wL21zZG9zL3BrdGRydnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDIyZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9tc2Rvcy9wa3RkcnZyLmMKQEAgLTAsMCArMSwxNDM2IEBACisvKg0KKyAqICBGaWxlLi4uLi4uLi4uOiBwa3RkcnZyLmMNCisgKg0KKyAqICBSZXNwb25zaWJsZS4uOiBHaXNsZSBWYW5lbSwgIGdpdmFAYmduZXR0Lm5vDQorICoNCisgKiAgQ3JlYXRlZC4uLi4uLjogMjYuU2VwdCAxOTk1DQorICoNCisgKiAgRGVzY3JpcHRpb24uLjogUGFja2V0LWRyaXZlciBpbnRlcmZhY2UgZm9yIDE2LzMyLWJpdCBDIDoNCisgKiAgICAgICAgICAgICAgICAgQm9ybGFuZCBDL0MrKyAzLjArIHNtYWxsL2xhcmdlIG1vZGVsDQorICogICAgICAgICAgICAgICAgIFdhdGNvbSBDL0MrKyAxMSssIERPUzRHVyBmbGF0IG1vZGVsDQorICogICAgICAgICAgICAgICAgIE1ldGF3YXJlIEhpZ2hDIDMuMSsgYW5kIFBoYXJMYXAgMzg2fERvc1gNCisgKiAgICAgICAgICAgICAgICAgR05VIEMvQysrIDIuNysgYW5kIGRqZ3BwIDIueCBleHRlbmRlcg0KKyAqDQorICogIFJlZmVyZW5jZXMuLi46IFBDL1RDUCBQYWNrZXQgZHJpdmVyIFNwZWNpZmljYXRpb24uIHJldiAxLjA5DQorICogICAgICAgICAgICAgICAgIEZUUCBTb2Z0d2FyZSBJbmMuDQorICoNCisgKi8NCisNCisjaW5jbHVkZSA8c3RkaW8uaD4NCisjaW5jbHVkZSA8c3RkbGliLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRlIDxkb3MuaD4NCisNCisjaW5jbHVkZSAicGNhcC1kb3MuaCINCisjaW5jbHVkZSAicGNhcC1pbnQuaCINCisjaW5jbHVkZSAibXNkb3MvcGt0ZHJ2ci5oIg0KKw0KKyNpZiAoRE9TWCkNCisjZGVmaW5lIE5VTV9SWF9CVUYgIDMyICAgICAgLyogIyBvZiBidWZmZXJzIGluIFJ4IEZJRk8gcXVldWUgKi8NCisjZWxzZQ0KKyNkZWZpbmUgTlVNX1JYX0JVRiAgMTANCisjZW5kaWYNCisNCisjZGVmaW5lIERJTSh4KSAgIChzaXplb2YoKHgpKSAvIHNpemVvZih4WzBdKSkNCisjZGVmaW5lIFBVVFMocykgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KKyAgICAgICAgICAgICAgICAgICBpZiAoIXBrdEluZm8ucXVpZXQpICAgICAgICAgICAgICAgICAgICAgICAgICBcDQorICAgICAgICAgICAgICAgICAgICAgIHBrdEluZm8uZXJyb3IgPyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYgKCIlczogJXNcbiIsIHMsIHBrdEluZm8uZXJyb3IpIDogXA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoIiVzXG4iLCBwa3RJbmZvLmVycm9yID0gcyk7ICAgICBcDQorICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQ0KKw0KKyNpZiBkZWZpbmVkKF9fSElHSENfXykNCisgIGV4dGVybiBVSU5UIF9td2VudjsNCisNCisjZWxpZiBkZWZpbmVkKF9fREpHUFBfXykNCisgICNpbmNsdWRlIDxzdGRkZWYuaD4NCisgICNpbmNsdWRlIDxkcG1pLmg+DQorICAjaW5jbHVkZSA8Z28zMi5oPg0KKyAgI2luY2x1ZGUgPHBjLmg+DQorICAjaW5jbHVkZSA8c3lzL2ZhcnB0ci5oPg0KKw0KKyNlbGlmIGRlZmluZWQoX19XQVRDT01DX18pDQorICAjaW5jbHVkZSA8aTg2Lmg+DQorICAjaW5jbHVkZSA8c3RkZGVmLmg+DQorICBleHRlcm4gY2hhciBfRXh0ZW5kZXI7DQorDQorI2Vsc2UNCisgIGV4dGVybiB2b2lkIGZhciBQa3RSZWNlaXZlciAodm9pZCk7DQorI2VuZGlmDQorDQorDQorI2lmIChET1NYICYgKERKR1BQfERPUzRHVykpDQorICAjaW5jbHVkZSA8c3lzL3BhY2tfb24uaD4NCisNCisgIHN0cnVjdCBEUE1JX3JlZ3Mgew0KKyAgICAgICAgIERXT1JEICByX2RpOw0KKyAgICAgICAgIERXT1JEICByX3NpOw0KKyAgICAgICAgIERXT1JEICByX2JwOw0KKyAgICAgICAgIERXT1JEICByZXNlcnZlZDsNCisgICAgICAgICBEV09SRCAgcl9ieDsNCisgICAgICAgICBEV09SRCAgcl9keDsNCisgICAgICAgICBEV09SRCAgcl9jeDsNCisgICAgICAgICBEV09SRCAgcl9heDsNCisgICAgICAgICBXT1JEICAgcl9mbGFnczsNCisgICAgICAgICBXT1JEICAgcl9lcywgcl9kcywgcl9mcywgcl9nczsNCisgICAgICAgICBXT1JEICAgcl9pcCwgcl9jcywgcl9zcCwgcl9zczsNCisgICAgICAgfTsNCisNCisgIC8qIERhdGEgbG9jYXRlZCBpbiBhIHJlYWwtbW9kZSBzZWdtZW50LiBUaGlzIGJlY29tZXMgZmFyIGF0IHJ1bnRpbWUNCisgICAqLw0KKyAgdHlwZWRlZiBzdHJ1Y3QgIHsgICAgICAgICAgLyogbXVzdCBtYXRjaCBkYXRhL2NvZGUgaW4gcGt0X3J4MS5zICovDQorICAgICAgICAgIFdPUkQgICAgICAgX3J4T3V0T2ZzOw0KKyAgICAgICAgICBXT1JEICAgICAgIF9yeEluT2ZzOw0KKyAgICAgICAgICBEV09SRCAgICAgIF9wa3REcm9wOw0KKyAgICAgICAgICBCWVRFICAgICAgIF9wa3RUZW1wIFsyMF07DQorICAgICAgICAgIFRYX0VMRU1FTlQgX3BrdFR4QnVmWzFdOw0KKyAgICAgICAgICBSWF9FTEVNRU5UIF9wa3RSeEJ1ZltOVU1fUlhfQlVGXTsNCisgICAgICAgICAgV09SRCAgICAgICBfZHVtbXlbMl07ICAgICAgICAvKiBzY3JlZW5TZWcsbmV3SW5PZmZzZXQgKi8NCisgICAgICAgICAgQllURSAgICAgICBfZmFuQ2hhcnNbNF07DQorICAgICAgICAgIFdPUkQgICAgICAgX2ZhbkluZGV4Ow0KKyAgICAgICAgICBCWVRFICAgICAgIF9Qa3RSZWNlaXZlclsxNV07IC8qIHN0YXJ0cyBvbiBhIHBhcmFncmFwaCAoMTZieXRlKSAqLw0KKyAgICAgICAgfSBQa3RSZWFsU3R1YjsNCisgICNpbmNsdWRlIDxzeXMvcGFja19vZmYuaD4NCisNCisgIHN0YXRpYyBCWVRFIHJlYWxfc3R1Yl9hcnJheSBbXSA9IHsNCisgICAgICAgICAjaW5jbHVkZSAicGt0X3N0dWIuaW5jIiAgICAgICAvKiBnZW5lcmF0ZWQgb3Bjb2RlIGFycmF5ICovDQorICAgICAgIH07DQorDQorICAjZGVmaW5lIHJ4T3V0T2ZzICAgICAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9yeE91dE9mcykNCisgICNkZWZpbmUgcnhJbk9mcyAgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3J4SW5PZnMpDQorICAjZGVmaW5lIFBrdFJlY2VpdmVyICAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9Qa3RSZWNlaXZlciBbcGFyYV9za2lwXSkNCisgICNkZWZpbmUgcGt0RHJvcCAgICAgICBvZmZzZXRvZiAoUGt0UmVhbFN0dWIsX3BrdERyb3ApDQorICAjZGVmaW5lIHBrdFRlbXAgICAgICAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9wa3RUZW1wKQ0KKyAgI2RlZmluZSBwa3RUeEJ1ZiAgICAgIG9mZnNldG9mIChQa3RSZWFsU3R1YixfcGt0VHhCdWYpDQorICAjZGVmaW5lIEZJUlNUX1JYX0JVRiAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9wa3RSeEJ1ZiBbMF0pDQorICAjZGVmaW5lIExBU1RfUlhfQlVGICAgb2Zmc2V0b2YgKFBrdFJlYWxTdHViLF9wa3RSeEJ1ZiBbTlVNX1JYX0JVRi0xXSkNCisNCisjZWxzZQ0KKyAgZXh0ZXJuIFdPUkQgICAgICAgcnhPdXRPZnM7ICAgIC8qIG9mZnNldHMgaW50byBwa3RSeEJ1ZiBGSUZPIHF1ZXVlICAgKi8NCisgIGV4dGVybiBXT1JEICAgICAgIHJ4SW5PZnM7DQorICBleHRlcm4gRFdPUkQgICAgICBwa3REcm9wOyAgICAgLyogIyBwYWNrZXRzIGRyb3BwZWQgaW4gUGt0UmVjZWl2ZXIoKSAqLw0KKyAgZXh0ZXJuIEJZVEUgICAgICAgcGt0UnhFbmQ7ICAgIC8qIG1hcmtzIHRoZSBlbmQgb2Ygci1tb2RlIGNvZGUvZGF0YSAgKi8NCisNCisgIGV4dGVybiBSWF9FTEVNRU5UIHBrdFJ4QnVmIFtOVU1fUlhfQlVGXTsgICAgICAgLyogUGt0RHJ2ciBSeCBidWZmZXJzICovDQorICBleHRlcm4gVFhfRUxFTUVOVCBwa3RUeEJ1ZjsgICAgICAgICAgICAgICAgICAgIC8qIFBrdERydnIgVHggYnVmZmVyICAqLw0KKyAgZXh0ZXJuIGNoYXIgICAgICAgcGt0VGVtcFsyMF07ICAgICAgICAgICAgICAgICAvKiBQa3REcnZyIHRlbXAgYXJlYSAgKi8NCisNCisgICNkZWZpbmUgRklSU1RfUlhfQlVGIChXT1JEKSAmcGt0UnhCdWYgWzBdDQorICAjZGVmaW5lIExBU1RfUlhfQlVGICAoV09SRCkgJnBrdFJ4QnVmIFtOVU1fUlhfQlVGLTFdDQorI2VuZGlmDQorDQorDQorI2lmZGVmIF9fQk9STEFORENfXyAgICAgICAgICAgLyogVXNlIEJvcmxhbmQncyBpbmxpbmUgZnVuY3Rpb25zICovDQorICAjZGVmaW5lIG1lbWNweSAgX19tZW1jcHlfXw0KKyAgI2RlZmluZSBtZW1jbXAgIF9fbWVtY21wX18NCisgICNkZWZpbmUgbWVtc2V0ICBfX21lbXNldF9fDQorI2VuZGlmDQorDQorDQorI2lmIChET1NYICYgUEhBUkxBUCkNCisgIGV4dGVybiB2b2lkIFBrdFJlY2VpdmVyICh2b2lkKTsgICAgIC8qIGluIHBrdF9yeDAuYXNtICovDQorICBzdGF0aWMgaW50ICBSZWFsQ29weSAgICAoVUxPTkcsIFVMT05HLCBSRUFMUFRSKiwgRkFSUFRSKiwgVVNIT1JUKik7DQorDQorICAjdW5kZWYgIEZQX1NFRw0KKyAgI3VuZGVmICBGUF9PRkYNCisgICNkZWZpbmUgRlBfT0ZGKHgpICAgICAoKFdPUkQpKHgpKQ0KKyAgI2RlZmluZSBGUF9TRUcoeCkgICAgICgoV09SRCkocmVhbEJhc2UgPj4gMTYpKQ0KKyAgI2RlZmluZSBET1NfQUREUihzLG8pICgoKERXT1JEKShzKSA8PCAxNikgKyAoV09SRCkobykpDQorICAjZGVmaW5lIHJfYXggICAgICAgICAgZWF4DQorICAjZGVmaW5lIHJfYnggICAgICAgICAgZWJ4DQorICAjZGVmaW5lIHJfZHggICAgICAgICAgZWR4DQorICAjZGVmaW5lIHJfY3ggICAgICAgICAgZWN4DQorICAjZGVmaW5lIHJfc2kgICAgICAgICAgZXNpDQorICAjZGVmaW5lIHJfZGkgICAgICAgICAgZWRpDQorICAjZGVmaW5lIHJfZHMgICAgICAgICAgZHMNCisgICNkZWZpbmUgcl9lcyAgICAgICAgICBlcw0KKyAgTE9DQUwgRkFSUFRSICAgICAgICAgIHByb3RCYXNlOw0KKyAgTE9DQUwgUkVBTFBUUiAgICAgICAgIHJlYWxCYXNlOw0KKyAgTE9DQUwgV09SRCAgICAgICAgICAgIHJlYWxTZWc7ICAgLyogRE9TIHBhcmEtYWRkcmVzcyBvZiBhbGxvY2F0ZWQgYXJlYSAqLw0KKyAgTE9DQUwgU1dJX1JFR1MgICAgICAgIHJlZzsNCisNCisgIHN0YXRpYyBXT1JEIF9mYXIgKnJ4T3V0T2ZzRnAsICpyeEluT2ZzRnA7DQorDQorI2VsaWYgKERPU1ggJiBESkdQUCkNCisgIHN0YXRpYyBfZ28zMl9kcG1pX3NlZ2luZm8gcm1fbWVtOw0KKyAgc3RhdGljIF9fZHBtaV9yZWdzICAgICAgICByZWc7DQorICBzdGF0aWMgRFdPUkQgICAgICAgICAgICAgIHJlYWxCYXNlOw0KKyAgc3RhdGljIGludCAgICAgICAgICAgICAgICBwYXJhX3NraXAgPSAwOw0KKw0KKyAgI2RlZmluZSBET1NfQUREUihzLG8pICAgICAoKChXT1JEKShzKSA8PCA0KSArIChvKSkNCisgICNkZWZpbmUgcl9heCAgICAgICAgICAgICAgeC5heA0KKyAgI2RlZmluZSByX2J4ICAgICAgICAgICAgICB4LmJ4DQorICAjZGVmaW5lIHJfZHggICAgICAgICAgICAgIHguZHgNCisgICNkZWZpbmUgcl9jeCAgICAgICAgICAgICAgeC5jeA0KKyAgI2RlZmluZSByX3NpICAgICAgICAgICAgICB4LnNpDQorICAjZGVmaW5lIHJfZGkgICAgICAgICAgICAgIHguZGkNCisgICNkZWZpbmUgcl9kcyAgICAgICAgICAgICAgeC5kcw0KKyAgI2RlZmluZSByX2VzICAgICAgICAgICAgICB4LmVzDQorDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICBMT0NBTCBzdHJ1Y3QgRFBNSV9yZWdzICAgIHJlZzsNCisgIExPQ0FMIFdPUkQgICAgICAgICAgICAgICAgcm1fYmFzZV9zZWcsIHJtX2Jhc2Vfc2VsOw0KKyAgTE9DQUwgRFdPUkQgICAgICAgICAgICAgICByZWFsQmFzZTsNCisgIExPQ0FMIGludCAgICAgICAgICAgICAgICAgcGFyYV9za2lwID0gMDsNCisNCisgIExPQ0FMIERXT1JEIGRwbWlfZ2V0X3JlYWxfdmVjdG9yIChpbnQgaW50cik7DQorICBMT0NBTCBXT1JEICBkcG1pX3JlYWxfbWFsbG9jICAgICAoaW50IHNpemUsIFdPUkQgKnNlbGVjdG9yKTsNCisgIExPQ0FMIHZvaWQgIGRwbWlfcmVhbF9mcmVlICAgICAgIChXT1JEIHNlbGVjdG9yKTsNCisgICNkZWZpbmUgRE9TX0FERFIocyxvKSAoKChEV09SRCkocykgPDwgNCkgKyAoV09SRCkobykpDQorDQorI2Vsc2UgICAgICAgICAgICAgIC8qIHJlYWwtbW9kZSBCb3JsYW5kIGV0Yy4gKi8NCisgIHN0YXRpYyBzdHJ1Y3QgIHsNCisgICAgICAgICBXT1JEIHJfYXgsIHJfYngsIHJfY3gsIHJfZHgsIHJfYnA7DQorICAgICAgICAgV09SRCByX3NpLCByX2RpLCByX2RzLCByX2VzLCByX2ZsYWdzOw0KKyAgICAgICB9IHJlZzsNCisjZW5kaWYNCisNCisjaWZkZWYgX19ISUdIQ19fDQorICAjcHJhZ21hIEFsaWFzIChwa3REcm9wLCAgICAiX3BrdERyb3AiKQ0KKyAgI3ByYWdtYSBBbGlhcyAocGt0UnhCdWYsICAgIl9wa3RSeEJ1ZiIpDQorICAjcHJhZ21hIEFsaWFzIChwa3RUeEJ1ZiwgICAiX3BrdFR4QnVmIikNCisgICNwcmFnbWEgQWxpYXMgKHBrdFRlbXAsICAgICJfcGt0VGVtcCIpDQorICAjcHJhZ21hIEFsaWFzIChyeE91dE9mcywgICAiX3J4T3V0T2ZzIikNCisgICNwcmFnbWEgQWxpYXMgKHJ4SW5PZnMsICAgICJfcnhJbk9mcyIpDQorICAjcHJhZ21hIEFsaWFzIChwa3RSeEVuZCwgICAiX3BrdFJ4RW5kIikNCisgICNwcmFnbWEgQWxpYXMgKFBrdFJlY2VpdmVyLCJfUGt0UmVjZWl2ZXIiKQ0KKyNlbmRpZg0KKw0KKw0KK1BVQkxJQyBQS1RfU1RBVCAgICBwa3RTdGF0OyAgICAvKiBzdGF0aXN0aWNzIGZvciBwYWNrZXRzICAgICovDQorUFVCTElDIFBLVF9JTkZPICAgIHBrdEluZm87ICAgIC8qIHBhY2tldC1kcml2ZXIgaW5mb3JtYXRpb24gKi8NCisNCitQVUJMSUMgUEtUX1JYX01PREUgcmVjZWl2ZU1vZGUgID0gUERSWF9ESVJFQ1Q7DQorUFVCTElDIEVUSEVSICAgICAgIG15QWRkcmVzcyAgICA9IHsgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAgfTsNCitQVUJMSUMgRVRIRVIgICAgICAgZXRoQnJvYWRjYXN0ID0geyAyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSB9Ow0KKw0KK0xPQ0FMICBzdHJ1Y3QgeyAgICAgICAgICAgICAvKiBpbnRlcm5hbCBzdGF0aXN0aWNzICovDQorICAgICAgIERXT1JEICB0b29TbWFsbDsgICAgIC8qIHNpemUgPCBFVEhfTUlOICovDQorICAgICAgIERXT1JEICB0b29MYXJnZTsgICAgIC8qIHNpemUgPiBFVEhfTUFYICovDQorICAgICAgIERXT1JEICBiYWRTeW5jOyAgICAgIC8qIGNvdW50XzEgIT0gY291bnRfMiAqLw0KKyAgICAgICBEV09SRCAgd3JvbmdIYW5kbGU7ICAvKiB1cGNhbGwgdG8gd3JvbmcgaGFuZGxlICovDQorICAgICB9IGludFN0YXQ7ICANCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBjb25zdCBjaGFyICpQa3RHZXRFcnJvclN0ciAoaW50IGVyck51bSkNCit7DQorICBzdGF0aWMgY29uc3QgY2hhciAqZXJyU3RyW10gPSB7DQorICAgICAgICAgICAgICAgICAgICAiIiwNCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGhhbmRsZSBudW1iZXIiLA0KKyAgICAgICAgICAgICAgICAgICAgIk5vIGludGVyZmFjZXMgb2Ygc3BlY2lmaWVkIGNsYXNzIGZvdW5kIiwNCisgICAgICAgICAgICAgICAgICAgICJObyBpbnRlcmZhY2VzIG9mIHNwZWNpZmllZCB0eXBlIGZvdW5kIiwNCisgICAgICAgICAgICAgICAgICAgICJObyBpbnRlcmZhY2VzIG9mIHNwZWNpZmllZCBudW1iZXIgZm91bmQiLA0KKyAgICAgICAgICAgICAgICAgICAgIkJhZCBwYWNrZXQgdHlwZSBzcGVjaWZpZWQiLA0KKyAgICAgICAgICAgICAgICAgICAgIkludGVyZmFjZSBkb2VzIG5vdCBzdXBwb3J0IG11bHRpY2FzdCIsDQorICAgICAgICAgICAgICAgICAgICAiUGFja2V0IGRyaXZlciBjYW5ub3QgdGVybWluYXRlIiwNCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlY2VpdmVyIG1vZGUgc3BlY2lmaWVkIiwNCisgICAgICAgICAgICAgICAgICAgICJJbnN1ZmZpY2llbnQgbWVtb3J5IHNwYWNlIiwNCisgICAgICAgICAgICAgICAgICAgICJUeXBlIHByZXZpb3VzbHkgYWNjZXNzZWQsIGFuZCBub3QgcmVsZWFzZWQiLA0KKyAgICAgICAgICAgICAgICAgICAgIkNvbW1hbmQgb3V0IG9mIHJhbmdlLCBvciBub3QgaW1wbGVtZW50ZWQiLA0KKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBzZW5kIHBhY2tldCAodXN1YWxseSBoYXJkd2FyZSBlcnJvcikiLA0KKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjaGFuZ2UgaGFyZHdhcmUgYWRkcmVzcyAoID4gMSBoYW5kbGUgb3BlbikiLA0KKyAgICAgICAgICAgICAgICAgICAgIkhhcmR3YXJlIGFkZHJlc3MgaGFzIGJhZCBsZW5ndGggb3IgZm9ybWF0IiwNCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcmVzZXQgaW50ZXJmYWNlIChtb3JlIHRoYW4gMSBoYW5kbGUgb3BlbikiLA0KKyAgICAgICAgICAgICAgICAgICAgIkJhZCBDaGVjay1zdW0iLA0KKyAgICAgICAgICAgICAgICAgICAgIkJhZCBzaXplIiwNCisgICAgICAgICAgICAgICAgICAgICJCYWQgc3luYyIgLA0KKyAgICAgICAgICAgICAgICAgICAgIlNvdXJjZSBoaXQiDQorICAgICAgICAgICAgICAgICAgfTsNCisNCisgIGlmIChlcnJOdW0gPCAwIHx8IGVyck51bSA+PSBESU0oZXJyU3RyKSkNCisgICAgIHJldHVybiAoIlVua25vd24gZHJpdmVyIGVycm9yLiIpOw0KKyAgcmV0dXJuIChlcnJTdHIgW2Vyck51bV0pOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIGNvbnN0IGNoYXIgKlBrdEdldENsYXNzTmFtZSAoV09SRCBjbGFzcykNCit7DQorICBzd2l0Y2ggKGNsYXNzKQ0KKyAgeyANCisgICAgY2FzZSBQRF9FVEhFUjoNCisgICAgICAgICByZXR1cm4gKCJESVgtRXRoZXIiKTsNCisgICAgY2FzZSBQRF9QUk9ORVQxMDoNCisgICAgICAgICByZXR1cm4gKCJQcm9ORVQtMTAiKTsNCisgICAgY2FzZSBQRF9JRUVFODAyNToNCisgICAgICAgICByZXR1cm4gKCJJRUVFIDgwMi41Iik7DQorICAgIGNhc2UgUERfT01OSU5FVDoNCisgICAgICAgICByZXR1cm4gKCJPbW5pTmV0Iik7DQorICAgIGNhc2UgUERfQVBQTEVUQUxLOg0KKyAgICAgICAgIHJldHVybiAoIkFwcGxlVGFsayIpOw0KKyAgICBjYXNlIFBEX1NMSVA6DQorICAgICAgICAgcmV0dXJuICgiU0xJUCIpOw0KKyAgICBjYXNlIFBEX1NUQVJUTEFOOg0KKyAgICAgICAgIHJldHVybiAoIlN0YXJ0TEFOIik7DQorICAgIGNhc2UgUERfQVJDTkVUOg0KKyAgICAgICAgIHJldHVybiAoIkFyY05ldCIpOw0KKyAgICBjYXNlIFBEX0FYMjU6DQorICAgICAgICAgcmV0dXJuICgiQVguMjUiKTsNCisgICAgY2FzZSBQRF9LSVNTOg0KKyAgICAgICAgIHJldHVybiAoIktJU1MiKTsNCisgICAgY2FzZSBQRF9JRUVFODAyM18yOg0KKyAgICAgICAgIHJldHVybiAoIklFRUUgODAyLjMgdy84MDIuMiBoZHIiKTsNCisgICAgY2FzZSBQRF9GRERJODAyMjoNCisgICAgICAgICByZXR1cm4gKCJGRERJIHcvODAyLjIgaGRyIik7DQorICAgIGNhc2UgUERfWDI1Og0KKyAgICAgICAgIHJldHVybiAoIlguMjUiKTsNCisgICAgY2FzZSBQRF9MQU5zdGFyOg0KKyAgICAgICAgIHJldHVybiAoIkxBTnN0YXIiKTsNCisgICAgY2FzZSBQRF9QUFA6DQorICAgICAgICAgcmV0dXJuICgiUFBQIik7DQorICAgIGRlZmF1bHQ6DQorICAgICAgICAgcmV0dXJuICgidW5rbm93biIpOw0KKyAgfQ0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIGNoYXIgY29uc3QgKlBrdFJYbW9kZVN0ciAoUEtUX1JYX01PREUgbW9kZSkNCit7DQorICBzdGF0aWMgY29uc3QgY2hhciAqbW9kZVN0ciBbXSA9IHsNCisgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlciB0dXJuZWQgb2ZmIiwNCisgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlIG9ubHkgZGlyZWN0bHkgYWRkcmVzc2VkIHBhY2tldHMiLA0KKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmUgZGlyZWN0ICYgYnJvYWRjYXN0IHBhY2tldHMiLA0KKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmUgZGlyZWN0LGJyb2FkY2FzdCBhbmQgbGltaXRlZCBtdWx0aWNhc3QgcGFja2V0cyIsDQorICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZSBkaXJlY3QsYnJvYWRjYXN0IGFuZCBhbGwgbXVsdGljYXN0IHBhY2tldHMiLA0KKyAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmUgYWxsIHBhY2tldHMgKHByb21pc2N1b3VvcyBtb2RlKSINCisgICAgICAgICAgICAgICAgICB9Ow0KKw0KKyAgaWYgKG1vZGUgPiBESU0obW9kZVN0cikpDQorICAgICByZXR1cm4gKCI/PyIpOw0KKyAgcmV0dXJuIChtb2RlU3RyIFttb2RlLTFdKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK0xPQ0FMIF9faW5saW5lIEJPT0wgUGt0SW50ZXJydXB0ICh2b2lkKQ0KK3sNCisgIEJPT0wgb2theTsNCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgX2R4X3JlYWxfaW50ICgoVUlOVClwa3RJbmZvLmludHIsICZyZWcpOw0KKyAgb2theSA9ICgocmVnLmZsYWdzICYgMSkgPT0gMCk7ICAvKiBPSyBpZiBjYXJyeSBjbGVhciAqLw0KKw0KKyNlbGlmIChET1NYICYgREpHUFApDQorICBfX2RwbWlfaW50ICgoaW50KXBrdEluZm8uaW50ciwgJnJlZyk7DQorICBva2F5ID0gKChyZWcueC5mbGFncyAmIDEpID09IDApOw0KKw0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgdW5pb24gIFJFR1MgIHI7DQorICBzdHJ1Y3QgU1JFR1MgczsNCisNCisgIG1lbXNldCAoJnIsIDAsIHNpemVvZihyKSk7DQorICBzZWdyZWFkICgmcyk7DQorICByLncuYXggID0gMHgzMDA7DQorICByLnguZWJ4ID0gcGt0SW5mby5pbnRyOw0KKyAgci53LmN4ICA9IDA7DQorICBzLmVzICAgID0gRlBfU0VHICgmcmVnKTsNCisgIHIueC5lZGkgPSBGUF9PRkYgKCZyZWcpOw0KKyAgcmVnLnJfZmxhZ3MgPSAwOw0KKyAgcmVnLnJfc3MgPSByZWcucl9zcCA9IDA7ICAgICAvKiBEUE1JIGhvc3QgcHJvdmlkZXMgc3RhY2sgKi8NCisNCisgIGludDM4NnggKDB4MzEsICZyLCAmciwgJnMpOw0KKyAgb2theSA9ICghci53LmNmbGFnKTsNCisNCisjZWxzZQ0KKyAgcmVnLnJfZmxhZ3MgPSAwOw0KKyAgaW50ciAocGt0SW5mby5pbnRyLCAoc3RydWN0IFJFR1BBQ0sqKSZyZWcpOw0KKyAgb2theSA9ICgocmVnLnJfZmxhZ3MgJiAxKSA9PSAwKTsNCisjZW5kaWYNCisNCisgIGlmIChva2F5KQ0KKyAgICAgICBwa3RJbmZvLmVycm9yID0gTlVMTDsNCisgIGVsc2UgcGt0SW5mby5lcnJvciA9IFBrdEdldEVycm9yU3RyIChyZWcucl9keCA+PiA4KTsNCisgIHJldHVybiAob2theSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisvKg0KKyAqIFNlYXJjaCBmb3IgcGFja2V0IGRyaXZlciBhdCBpbnRlcnJ1cHQgNjBoIHRocm91Z2ggODBoLiBJZiBBU0NJSVoNCisgKiBzdHJpbmcgIlBLVCBEUlZSIiBmb3VuZCBhdCBvZmZzZXQgMyBpbiB0aGUgaW50ZXJydXB0IGhhbmRsZXIsIHJldHVybg0KKyAqIGludGVycnVwdCBudW1iZXIsIGVsc2UgcmV0dXJuIHplcm8gaW4gcGt0SW5mby5pbnRyDQorICovDQorUFVCTElDIEJPT0wgUGt0U2VhcmNoRHJpdmVyICh2b2lkKQ0KK3sNCisgIEJZVEUgaW50ciAgPSAweDIwOw0KKyAgQk9PTCBmb3VuZCA9IEZBTFNFOw0KKw0KKyAgd2hpbGUgKCFmb3VuZCAmJiBpbnRyIDwgMHhGRikNCisgIHsNCisgICAgc3RhdGljIGNoYXIgc3RyWzEyXTsgICAgICAgICAgICAgICAgIC8qIDMgKyBzdHJsZW4oIlBLVCBEUlZSIikgKi8NCisgICAgc3RhdGljIGNoYXIgcGt0U3RyWzldID0gIlBLVCBEUlZSIjsgIC8qIEFTQ0lJWiBzdHJpbmcgYXQgb2ZzIDMgKi8NCisgICAgRFdPUkQgIHJwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluIGludGVycnVwdCAgcm91dGluZSAgKi8NCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgICBfZHhfcm1pdl9nZXQgKGludHIsICZycCk7DQorICAgIFJlYWRSZWFsTWVtICgmc3RyLCAoUkVBTFBUUilycCwgc2l6ZW9mKHN0cikpOw0KKw0KKyNlbGlmIChET1NYICYgREpHUFApDQorICAgIF9fZHBtaV9yYWRkciByZWFsQWRyOw0KKyAgICBfX2RwbWlfZ2V0X3JlYWxfbW9kZV9pbnRlcnJ1cHRfdmVjdG9yIChpbnRyLCAmcmVhbEFkcik7DQorICAgIHJwID0gKHJlYWxBZHIuc2VnbWVudCA8PCA0KSArIHJlYWxBZHIub2Zmc2V0MTY7DQorICAgIGRvc21lbWdldCAocnAsIHNpemVvZihzdHIpLCAmc3RyKTsNCisNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgICAgcnAgPSBkcG1pX2dldF9yZWFsX3ZlY3RvciAoaW50cik7DQorICAgIG1lbWNweSAoJnN0ciwgKHZvaWQqKXJwLCBzaXplb2Yoc3RyKSk7DQorDQorI2Vsc2UNCisgICAgX2ZtZW1jcHkgKCZzdHIsIGdldHZlY3QoaW50ciksIHNpemVvZihzdHIpKTsNCisjZW5kaWYNCisNCisgICAgZm91bmQgPSBtZW1jbXAgKCZzdHJbM10sJnBrdFN0cixzaXplb2YocGt0U3RyKSkgPT0gMDsNCisgICAgaW50cisrOw0KKyAgfQ0KKyAgcGt0SW5mby5pbnRyID0gKGZvdW5kID8gaW50ci0xIDogMCk7DQorICByZXR1cm4gKGZvdW5kKTsNCit9DQorDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK3N0YXRpYyBCT09MIFBrdFNldEFjY2VzcyAodm9pZCkNCit7DQorICByZWcucl9heCA9IDB4MDIwMCArIHBrdEluZm8uY2xhc3M7DQorICByZWcucl9ieCA9IDB4RkZGRjsNCisgIHJlZy5yX2R4ID0gMDsNCisgIHJlZy5yX2N4ID0gMDsNCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgcmVnLmRzICA9IDA7DQorICByZWcuZXNpID0gMDsNCisgIHJlZy5lcyAgPSBSUF9TRUcgKHJlYWxCYXNlKTsNCisgIHJlZy5lZGkgPSAoV09SRCkgJlBrdFJlY2VpdmVyOw0KKw0KKyNlbGlmIChET1NYICYgREpHUFApDQorICByZWcueC5kcyA9IDA7DQorICByZWcueC5zaSA9IDA7DQorICByZWcueC5lcyA9IHJtX21lbS5ybV9zZWdtZW50Ow0KKyAgcmVnLnguZGkgPSBQa3RSZWNlaXZlcjsNCisNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIHJlZy5yX2RzID0gMDsNCisgIHJlZy5yX3NpID0gMDsNCisgIHJlZy5yX2VzID0gcm1fYmFzZV9zZWc7DQorICByZWcucl9kaSA9IFBrdFJlY2VpdmVyOw0KKw0KKyNlbHNlDQorICByZWcucl9kcyA9IDA7DQorICByZWcucl9zaSA9IDA7DQorICByZWcucl9lcyA9IEZQX1NFRyAoJlBrdFJlY2VpdmVyKTsNCisgIHJlZy5yX2RpID0gRlBfT0ZGICgmUGt0UmVjZWl2ZXIpOw0KKyNlbmRpZg0KKw0KKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgcGt0SW5mby5oYW5kbGUgPSByZWcucl9heDsNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RSZWxlYXNlSGFuZGxlIChXT1JEIGhhbmRsZSkNCit7DQorICByZWcucl9heCA9IDB4MDMwMDsNCisgIHJlZy5yX2J4ID0gaGFuZGxlOw0KKyAgcmV0dXJuIFBrdEludGVycnVwdCgpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIEJPT0wgUGt0VHJhbnNtaXQgKGNvbnN0IHZvaWQgKmV0aCwgaW50IGxlbikNCit7DQorICBpZiAobGVuID4gRVRIX01UVSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgcmVnLnJfYXggPSAweDA0MDA7ICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIDQsIHNlbmQgcGt0ICovDQorICByZWcucl9jeCA9IGxlbjsgICAgICAgICAgICAgICAgLyogdG90YWwgc2l6ZSBvZiBmcmFtZSAgKi8NCisNCisjaWYgKERPU1ggJiBESkdQUCkNCisgIGRvc21lbXB1dCAoZXRoLCBsZW4sIHJlYWxCYXNlK3BrdFR4QnVmKTsNCisgIHJlZy54LmRzID0gcm1fbWVtLnJtX3NlZ21lbnQ7ICAvKiBET1MgZGF0YSBzZWdtZW50IGFuZCAqLw0KKyAgcmVnLnguc2kgPSBwa3RUeEJ1ZjsgICAgICAgICAgIC8qIERPUyBvZmZzZXQgdG8gYnVmZmVyICovDQorDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICBtZW1jcHkgKCh2b2lkKikocmVhbEJhc2UrcGt0VHhCdWYpLCBldGgsIGxlbik7DQorICByZWcucl9kcyA9IHJtX2Jhc2Vfc2VnOw0KKyAgcmVnLnJfc2kgPSBwa3RUeEJ1ZjsNCisNCisjZWxpZiAoRE9TWCAmIFBIQVJMQVApDQorICBtZW1jcHkgKCZwa3RUeEJ1ZiwgZXRoLCBsZW4pOw0KKyAgcmVnLnJfZHMgPSBGUF9TRUcgKCZwa3RUeEJ1Zik7DQorICByZWcucl9zaSA9IEZQX09GRiAoJnBrdFR4QnVmKTsNCisNCisjZWxzZQ0KKyAgcmVnLnJfZHMgPSBGUF9TRUcgKGV0aCk7DQorICByZWcucl9zaSA9IEZQX09GRiAoZXRoKTsNCisjZW5kaWYNCisNCisgIHJldHVybiBQa3RJbnRlcnJ1cHQoKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZiAoRE9TWCAmIChESkdQUHxET1M0R1cpKQ0KK0xPQ0FMIF9faW5saW5lIEJPT0wgQ2hlY2tFbGVtZW50IChSWF9FTEVNRU5UICpyeCkNCisjZWxzZQ0KK0xPQ0FMIF9faW5saW5lIEJPT0wgQ2hlY2tFbGVtZW50IChSWF9FTEVNRU5UIF9mYXIgKnJ4KQ0KKyNlbmRpZg0KK3sNCisgIFdPUkQgY291bnRfMSwgY291bnRfMjsNCisNCisgIC8qDQorICAgKiBXZSBnb3QgYW4gdXBjYWxsIHRvIHRoZSBzYW1lIFJNQ0Igd2l0aCB3cm9uZyBoYW5kbGUuDQorICAgKiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgZmFpbGVkIHRvIHJlbGVhc2UgaGFuZGxlIGF0IHByb2dyYW0gZXhpdA0KKyAgICovDQorICBpZiAocngtPmhhbmRsZSAhPSBwa3RJbmZvLmhhbmRsZSkNCisgIHsNCisgICAgcGt0SW5mby5lcnJvciA9ICJXcm9uZyBoYW5kbGUiOw0KKyAgICBpbnRTdGF0Lndyb25nSGFuZGxlKys7DQorICAgIFBrdFJlbGVhc2VIYW5kbGUgKHJ4LT5oYW5kbGUpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisgIGNvdW50XzEgPSByeC0+Zmlyc3RDb3VudDsNCisgIGNvdW50XzIgPSByeC0+c2Vjb25kQ291bnQ7DQorDQorICBpZiAoY291bnRfMSAhPSBjb3VudF8yKQ0KKyAgew0KKyAgICBwa3RJbmZvLmVycm9yID0gIkJhZCBzeW5jIjsNCisgICAgaW50U3RhdC5iYWRTeW5jKys7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKyAgaWYgKGNvdW50XzEgPiBFVEhfTUFYKQ0KKyAgew0KKyAgICBwa3RJbmZvLmVycm9yID0gIkxhcmdlIGVzaXplIjsNCisgICAgaW50U3RhdC50b29MYXJnZSsrOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisjaWYgMA0KKyAgaWYgKGNvdW50XzEgPCBFVEhfTUlOKQ0KKyAgew0KKyAgICBwa3RJbmZvLmVycm9yID0gIlNtYWxsIGVzaXplIjsNCisgICAgaW50U3RhdC50b29TbWFsbCsrOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisjZW5kaWYNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RUZXJtaW5IYW5kbGUgKFdPUkQgaGFuZGxlKQ0KK3sNCisgIHJlZy5yX2F4ID0gMHgwNTAwOw0KKyAgcmVnLnJfYnggPSBoYW5kbGU7DQorICByZXR1cm4gUGt0SW50ZXJydXB0KCk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RSZXNldEludGVyZmFjZSAoV09SRCBoYW5kbGUpDQorew0KKyAgcmVnLnJfYXggPSAweDA3MDA7DQorICByZWcucl9ieCA9IGhhbmRsZTsNCisgIHJldHVybiBQa3RJbnRlcnJ1cHQoKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdFNldFJlY2VpdmVyTW9kZSAoUEtUX1JYX01PREUgbW9kZSkNCit7DQorICBpZiAocGt0SW5mby5jbGFzcyA9PSBQRF9TTElQIHx8IHBrdEluZm8uY2xhc3MgPT0gUERfUFBQKQ0KKyAgICAgcmV0dXJuIChUUlVFKTsNCisNCisgIHJlZy5yX2F4ID0gMHgxNDAwOw0KKyAgcmVnLnJfYnggPSBwa3RJbmZvLmhhbmRsZTsNCisgIHJlZy5yX2N4ID0gKFdPUkQpbW9kZTsNCisNCisgIGlmICghUGt0SW50ZXJydXB0KCkpDQorICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisgIHJlY2VpdmVNb2RlID0gbW9kZTsNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RHZXRSZWNlaXZlck1vZGUgKFBLVF9SWF9NT0RFICptb2RlKQ0KK3sNCisgIHJlZy5yX2F4ID0gMHgxNTAwOw0KKyAgcmVnLnJfYnggPSBwa3RJbmZvLmhhbmRsZTsNCisNCisgIGlmICghUGt0SW50ZXJydXB0KCkpDQorICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisgICptb2RlID0gcmVnLnJfYXg7DQorICByZXR1cm4gKFRSVUUpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorc3RhdGljIFBLVF9TVEFUIGluaXRpYWxTdGF0OyAgICAgICAgIC8qIHN0YXRpc3RpY3MgYXQgc3RhcnR1cCAqLw0KK3N0YXRpYyBCT09MICAgICByZXNldFN0YXQgPSBGQUxTRTsgICAvKiBzdGF0aXN0aWNzIHJlc2V0ID8gKi8NCisNCitQVUJMSUMgQk9PTCBQa3RHZXRTdGF0aXN0aWNzIChXT1JEIGhhbmRsZSkNCit7DQorICByZWcucl9heCA9IDB4MTgwMDsNCisgIHJlZy5yX2J4ID0gaGFuZGxlOw0KKw0KKyAgaWYgKCFQa3RJbnRlcnJ1cHQoKSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyNpZiAoRE9TWCAmIFBIQVJMQVApDQorICBSZWFkUmVhbE1lbSAoJnBrdFN0YXQsIERPU19BRERSKHJlZy5kcyxyZWcuZXNpKSwgc2l6ZW9mKHBrdFN0YXQpKTsNCisNCisjZWxpZiAoRE9TWCAmIERKR1BQKQ0KKyAgZG9zbWVtZ2V0IChET1NfQUREUihyZWcueC5kcyxyZWcueC5zaSksIHNpemVvZihwa3RTdGF0KSwgJnBrdFN0YXQpOw0KKw0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgbWVtY3B5ICgmcGt0U3RhdCwgKHZvaWQqKURPU19BRERSKHJlZy5yX2RzLHJlZy5yX3NpKSwgc2l6ZW9mKHBrdFN0YXQpKTsNCisNCisjZWxzZQ0KKyAgX2ZtZW1jcHkgKCZwa3RTdGF0LCBNS19GUChyZWcucl9kcyxyZWcucl9zaSksIHNpemVvZihwa3RTdGF0KSk7DQorI2VuZGlmDQorDQorICByZXR1cm4gKFRSVUUpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIEJPT0wgUGt0U2Vzc1N0YXRpc3RpY3MgKFdPUkQgaGFuZGxlKQ0KK3sNCisgIGlmICghUGt0R2V0U3RhdGlzdGljcyhwa3RJbmZvLmhhbmRsZSkpDQorICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisgIGlmIChyZXNldFN0YXQpDQorICB7DQorICAgIHBrdFN0YXQuaW5QYWNrZXRzICAtPSBpbml0aWFsU3RhdC5pblBhY2tldHM7DQorICAgIHBrdFN0YXQub3V0UGFja2V0cyAtPSBpbml0aWFsU3RhdC5vdXRQYWNrZXRzOw0KKyAgICBwa3RTdGF0LmluQnl0ZXMgICAgLT0gaW5pdGlhbFN0YXQuaW5CeXRlczsNCisgICAgcGt0U3RhdC5vdXRCeXRlcyAgIC09IGluaXRpYWxTdGF0Lm91dEJ5dGVzOw0KKyAgICBwa3RTdGF0LmluRXJyb3JzICAgLT0gaW5pdGlhbFN0YXQuaW5FcnJvcnM7DQorICAgIHBrdFN0YXQub3V0RXJyb3JzICAtPSBpbml0aWFsU3RhdC5vdXRFcnJvcnM7DQorICAgIHBrdFN0YXQub3V0RXJyb3JzICAtPSBpbml0aWFsU3RhdC5vdXRFcnJvcnM7DQorICAgIHBrdFN0YXQubG9zdCAgICAgICAtPSBpbml0aWFsU3RhdC5sb3N0Ow0KKyAgfQ0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdFJlc2V0U3RhdGlzdGljcyAoV09SRCBoYW5kbGUpDQorew0KKyAgaWYgKCFQa3RHZXRTdGF0aXN0aWNzKHBrdEluZm8uaGFuZGxlKSkNCisgICAgIHJldHVybiAoRkFMU0UpOw0KKw0KKyAgbWVtY3B5ICgmaW5pdGlhbFN0YXQsICZwa3RTdGF0LCBzaXplb2YoaW5pdGlhbFN0YXQpKTsNCisgIHJlc2V0U3RhdCA9IFRSVUU7DQorICByZXR1cm4gKFRSVUUpOw0KK30NCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorUFVCTElDIEJPT0wgUGt0R2V0QWRkcmVzcyAoRVRIRVIgKmFkZHIpDQorew0KKyAgcmVnLnJfYXggPSAweDA2MDA7DQorICByZWcucl9ieCA9IHBrdEluZm8uaGFuZGxlOw0KKyAgcmVnLnJfY3ggPSBzaXplb2YgKCphZGRyKTsNCisNCisjaWYgKERPU1ggJiBESkdQUCkNCisgIHJlZy54LmVzID0gcm1fbWVtLnJtX3NlZ21lbnQ7DQorICByZWcueC5kaSA9IHBrdFRlbXA7DQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICByZWcucl9lcyA9IHJtX2Jhc2Vfc2VnOw0KKyAgcmVnLnJfZGkgPSBwa3RUZW1wOw0KKyNlbHNlDQorICByZWcucl9lcyA9IEZQX1NFRyAoJnBrdFRlbXApOw0KKyAgcmVnLnJfZGkgPSBGUF9PRkYgKCZwa3RUZW1wKTsgIC8qIEVTOkRJID0gYWRkcmVzcyBmb3IgcmVzdWx0ICovDQorI2VuZGlmDQorDQorICBpZiAoIVBrdEludGVycnVwdCgpKQ0KKyAgICAgcmV0dXJuIChGQUxTRSk7DQorDQorI2lmIChET1NYICYgUEhBUkxBUCkNCisgIFJlYWRSZWFsTWVtIChhZGRyLCByZWFsQmFzZSArIChXT1JEKSZwa3RUZW1wLCBzaXplb2YoKmFkZHIpKTsNCisNCisjZWxpZiAoRE9TWCAmIERKR1BQKQ0KKyAgZG9zbWVtZ2V0IChyZWFsQmFzZStwa3RUZW1wLCBzaXplb2YoKmFkZHIpLCBhZGRyKTsNCisNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIG1lbWNweSAoYWRkciwgKHZvaWQqKShyZWFsQmFzZStwa3RUZW1wKSwgc2l6ZW9mKCphZGRyKSk7DQorDQorI2Vsc2UNCisgIG1lbWNweSAoKHZvaWQqKWFkZHIsICZwa3RUZW1wLCBzaXplb2YoKmFkZHIpKTsNCisjZW5kaWYNCisNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RTZXRBZGRyZXNzIChjb25zdCBFVEhFUiAqYWRkcikNCit7DQorICAvKiBjb3B5IGFkZHIgdG8gcmVhbC1tb2RlIHNjcmF0aCBhcmVhICovDQorDQorI2lmIChET1NYICYgUEhBUkxBUCkNCisgIFdyaXRlUmVhbE1lbSAocmVhbEJhc2UgKyAoV09SRCkmcGt0VGVtcCwgKHZvaWQqKWFkZHIsIHNpemVvZigqYWRkcikpOw0KKw0KKyNlbGlmIChET1NYICYgREpHUFApDQorICBkb3NtZW1wdXQgKGFkZHIsIHNpemVvZigqYWRkciksIHJlYWxCYXNlK3BrdFRlbXApOw0KKw0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgbWVtY3B5ICgodm9pZCopKHJlYWxCYXNlK3BrdFRlbXApLCBhZGRyLCBzaXplb2YoKmFkZHIpKTsNCisNCisjZWxzZQ0KKyAgbWVtY3B5ICgmcGt0VGVtcCwgKHZvaWQqKWFkZHIsIHNpemVvZigqYWRkcikpOw0KKyNlbmRpZg0KKw0KKyAgcmVnLnJfYXggPSAweDE5MDA7DQorICByZWcucl9jeCA9IHNpemVvZiAoKmFkZHIpOyAgICAgIC8qIGFkZHJlc3MgbGVuZ3RoICAgICAgICovDQorDQorI2lmIChET1NYICYgREpHUFApDQorICByZWcueC5lcyA9IHJtX21lbS5ybV9zZWdtZW50OyAgIC8qIERPUyBvZmZzZXQgdG8gcGFyYW0gICovDQorICByZWcueC5kaSA9IHBrdFRlbXA7ICAgICAgICAgICAgIC8qIERPUyBzZWdtZW50IHRvIHBhcmFtICovDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICByZWcucl9lcyA9IHJtX2Jhc2Vfc2VnOw0KKyAgcmVnLnJfZGkgPSBwa3RUZW1wOw0KKyNlbHNlDQorICByZWcucl9lcyA9IEZQX1NFRyAoJnBrdFRlbXApOw0KKyAgcmVnLnJfZGkgPSBGUF9PRkYgKCZwa3RUZW1wKTsNCisjZW5kaWYNCisNCisgIHJldHVybiBQa3RJbnRlcnJ1cHQoKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KK1BVQkxJQyBCT09MIFBrdEdldERyaXZlckluZm8gKHZvaWQpDQorew0KKyAgcGt0SW5mby5tYWpWZXIgPSAwOw0KKyAgcGt0SW5mby5taW5WZXIgPSAwOw0KKyAgbWVtc2V0ICgmcGt0SW5mby5uYW1lLCAwLCBzaXplb2YocGt0SW5mby5uYW1lKSk7DQorICByZWcucl9heCA9IDB4MDFGRjsNCisgIHJlZy5yX2J4ID0gMDsNCisNCisgIGlmICghUGt0SW50ZXJydXB0KCkpDQorICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisgIHBrdEluZm8ubnVtYmVyID0gcmVnLnJfY3ggJiAweEZGOw0KKyAgcGt0SW5mby5jbGFzcyAgPSByZWcucl9jeCA+PiA4Ow0KKyNpZiAwDQorICBwa3RJbmZvLm1pblZlciA9IHJlZy5yX2J4ICUgMTA7DQorICBwa3RJbmZvLm1halZlciA9IHJlZy5yX2J4IC8gMTA7DQorI2Vsc2UNCisgIHBrdEluZm8ubWFqVmVyID0gcmVnLnJfYng7ICAvLyAhIQ0KKyNlbmRpZg0KKyAgcGt0SW5mby5mdW5jcyAgPSByZWcucl9heCAmIDB4RkY7DQorICBwa3RJbmZvLnR5cGUgICA9IHJlZy5yX2R4ICYgMHhGRjsNCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgUmVhZFJlYWxNZW0gKCZwa3RJbmZvLm5hbWUsIERPU19BRERSKHJlZy5kcyxyZWcuZXNpKSwgc2l6ZW9mKHBrdEluZm8ubmFtZSkpOw0KKw0KKyNlbGlmIChET1NYICYgREpHUFApDQorICBkb3NtZW1nZXQgKERPU19BRERSKHJlZy54LmRzLHJlZy54LnNpKSwgc2l6ZW9mKHBrdEluZm8ubmFtZSksICZwa3RJbmZvLm5hbWUpOw0KKw0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgbWVtY3B5ICgmcGt0SW5mby5uYW1lLCAodm9pZCopRE9TX0FERFIocmVnLnJfZHMscmVnLnJfc2kpLCBzaXplb2YocGt0SW5mby5uYW1lKSk7DQorDQorI2Vsc2UNCisgIF9mbWVtY3B5ICgmcGt0SW5mby5uYW1lLCBNS19GUChyZWcucl9kcyxyZWcucl9zaSksIHNpemVvZihwa3RJbmZvLm5hbWUpKTsNCisjZW5kaWYNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RHZXREcml2ZXJQYXJhbSAodm9pZCkNCit7DQorICByZWcucl9heCA9IDB4MEEwMDsNCisNCisgIGlmICghUGt0SW50ZXJydXB0KCkpDQorICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgUmVhZFJlYWxNZW0gKCZwa3RJbmZvLm1halZlciwgRE9TX0FERFIocmVnLmVzLHJlZy5lZGkpLCBQS1RfUEFSQU1fU0laRSk7DQorDQorI2VsaWYgKERPU1ggJiBESkdQUCkNCisgIGRvc21lbWdldCAoRE9TX0FERFIocmVnLnguZXMscmVnLnguZGkpLCBQS1RfUEFSQU1fU0laRSwgJnBrdEluZm8ubWFqVmVyKTsNCisNCisjZWxpZiAoRE9TWCAmIERPUzRHVykNCisgIG1lbWNweSAoJnBrdEluZm8ubWFqVmVyLCAodm9pZCopRE9TX0FERFIocmVnLnJfZXMscmVnLnJfZGkpLCBQS1RfUEFSQU1fU0laRSk7DQorDQorI2Vsc2UNCisgIF9mbWVtY3B5ICgmcGt0SW5mby5tYWpWZXIsIE1LX0ZQKHJlZy5yX2VzLHJlZy5yX2RpKSwgUEtUX1BBUkFNX1NJWkUpOw0KKyNlbmRpZg0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNpZiAoRE9TWCAmIFBIQVJMQVApDQorICBQVUJMSUMgaW50IFBrdFJlY2VpdmUgKEJZVEUgKmJ1ZiwgaW50IG1heCkNCisgIHsNCisgICAgV09SRCBpbk9mcyAgPSAqcnhJbk9mc0ZwOw0KKyAgICBXT1JEIG91dE9mcyA9ICpyeE91dE9mc0ZwOw0KKw0KKyAgICBpZiAob3V0T2ZzICE9IGluT2ZzKQ0KKyAgICB7DQorICAgICAgUlhfRUxFTUVOVCBfZmFyICpoZWFkID0gKFJYX0VMRU1FTlQgX2ZhciopKHByb3RCYXNlK291dE9mcyk7DQorICAgICAgaW50IHNpemUsIGxlbiA9IG1heDsNCisNCisgICAgICBpZiAoQ2hlY2tFbGVtZW50KGhlYWQpKQ0KKyAgICAgIHsNCisgICAgICAgIHNpemUgPSBtaW4gKGhlYWQtPmZpcnN0Q291bnQsIHNpemVvZihSWF9FTEVNRU5UKSk7DQorICAgICAgICBsZW4gID0gbWluIChzaXplLCBtYXgpOw0KKyAgICAgICAgX2ZtZW1jcHkgKGJ1ZiwgJmhlYWQtPmRlc3RpbiwgbGVuKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgc2l6ZSA9IC0xOw0KKw0KKyAgICAgIG91dE9mcyArPSBzaXplb2YgKFJYX0VMRU1FTlQpOw0KKyAgICAgIGlmIChvdXRPZnMgPiBMQVNUX1JYX0JVRikNCisgICAgICAgICAgb3V0T2ZzID0gRklSU1RfUlhfQlVGOw0KKyAgICAgICpyeE91dE9mc0ZwID0gb3V0T2ZzOw0KKyAgICAgIHJldHVybiAoc2l6ZSk7DQorICAgIH0NCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIFBVQkxJQyB2b2lkIFBrdFF1ZXVlQnVzeSAoQk9PTCBidXN5KQ0KKyAgew0KKyAgICAqcnhPdXRPZnNGcCA9IGJ1c3kgPyAoKnJ4SW5PZnNGcCArIHNpemVvZihSWF9FTEVNRU5UKSkgOiAqcnhJbk9mc0ZwOw0KKyAgICBpZiAoKnJ4T3V0T2ZzRnAgPiBMQVNUX1JYX0JVRikNCisgICAgICAgICpyeE91dE9mc0ZwID0gRklSU1RfUlhfQlVGOw0KKyAgICAqKERXT1JEIF9mYXIqKShwcm90QmFzZSArIChXT1JEKSZwa3REcm9wKSA9IDA7DQorICB9DQorDQorICBQVUJMSUMgV09SRCBQa3RCdWZmZXJzVXNlZCAodm9pZCkNCisgIHsNCisgICAgV09SRCBpbk9mcyAgPSAqcnhJbk9mc0ZwOw0KKyAgICBXT1JEIG91dE9mcyA9ICpyeE91dE9mc0ZwOw0KKw0KKyAgICBpZiAoaW5PZnMgPj0gb3V0T2ZzKQ0KKyAgICAgICByZXR1cm4gKGluT2ZzIC0gb3V0T2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKTsNCisgICAgcmV0dXJuIChOVU1fUlhfQlVGIC0gKG91dE9mcyAtIGluT2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKSk7DQorICB9DQorDQorICBQVUJMSUMgRFdPUkQgUGt0UnhEcm9wcGVkICh2b2lkKQ0KKyAgew0KKyAgICByZXR1cm4gKCooRFdPUkQgX2ZhciopKHByb3RCYXNlICsgKFdPUkQpJnBrdERyb3ApKTsNCisgIH0NCisNCisjZWxpZiAoRE9TWCAmIERKR1BQKQ0KKyAgUFVCTElDIGludCBQa3RSZWNlaXZlIChCWVRFICpidWYsIGludCBtYXgpDQorICB7DQorICAgIFdPUkQgb2ZzID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcyk7DQorDQorICAgIGlmIChvZnMgIT0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStyeEluT2ZzKSkNCisgICAgew0KKyAgICAgIFJYX0VMRU1FTlQgaGVhZDsNCisgICAgICBpbnQgIHNpemUsIGxlbiA9IG1heDsNCisNCisgICAgICBoZWFkLmZpcnN0Q291bnQgID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStvZnMpOw0KKyAgICAgIGhlYWQuc2Vjb25kQ291bnQgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK29mcysyKTsNCisgICAgICBoZWFkLmhhbmRsZSAgICAgID0gX2ZhcnBlZWt3IChfZG9zX2RzLCByZWFsQmFzZStvZnMrNCk7DQorDQorICAgICAgaWYgKENoZWNrRWxlbWVudCgmaGVhZCkpDQorICAgICAgew0KKyAgICAgICAgc2l6ZSA9IG1pbiAoaGVhZC5maXJzdENvdW50LCBzaXplb2YoUlhfRUxFTUVOVCkpOw0KKyAgICAgICAgbGVuICA9IG1pbiAoc2l6ZSwgbWF4KTsNCisgICAgICAgIGRvc21lbWdldCAocmVhbEJhc2Urb2ZzKzYsIGxlbiwgYnVmKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgc2l6ZSA9IC0xOw0KKw0KKyAgICAgIG9mcyArPSBzaXplb2YgKFJYX0VMRU1FTlQpOw0KKyAgICAgIGlmIChvZnMgPiBMQVNUX1JYX0JVRikNCisgICAgICAgICAgIF9mYXJwb2tldyAoX2Rvc19kcywgcmVhbEJhc2UrcnhPdXRPZnMsIEZJUlNUX1JYX0JVRik7DQorICAgICAgZWxzZSBfZmFycG9rZXcgKF9kb3NfZHMsIHJlYWxCYXNlK3J4T3V0T2ZzLCBvZnMpOw0KKyAgICAgIHJldHVybiAoc2l6ZSk7DQorICAgIH0NCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIFBVQkxJQyB2b2lkIFBrdFF1ZXVlQnVzeSAoQk9PTCBidXN5KQ0KKyAgew0KKyAgICBXT1JEIG9mczsNCisNCisgICAgZGlzYWJsZSgpOw0KKyAgICBvZnMgPSBfZmFycGVla3cgKF9kb3NfZHMsIHJlYWxCYXNlK3J4SW5PZnMpOw0KKyAgICBpZiAoYnVzeSkNCisgICAgICAgb2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7DQorDQorICAgIGlmIChvZnMgPiBMQVNUX1JYX0JVRikNCisgICAgICAgICBfZmFycG9rZXcgKF9kb3NfZHMsIHJlYWxCYXNlK3J4T3V0T2ZzLCBGSVJTVF9SWF9CVUYpOw0KKyAgICBlbHNlIF9mYXJwb2tldyAoX2Rvc19kcywgcmVhbEJhc2UrcnhPdXRPZnMsIG9mcyk7DQorICAgIF9mYXJwb2tlbCAoX2Rvc19kcywgcmVhbEJhc2UrcGt0RHJvcCwgMFVMKTsNCisgICAgZW5hYmxlKCk7DQorICB9DQorDQorICBQVUJMSUMgV09SRCBQa3RCdWZmZXJzVXNlZCAodm9pZCkNCisgIHsNCisgICAgV09SRCBpbk9mcywgb3V0T2ZzOw0KKw0KKyAgICBkaXNhYmxlKCk7DQorICAgIGluT2ZzICA9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2UrcnhJbk9mcyk7DQorICAgIG91dE9mcyA9IF9mYXJwZWVrdyAoX2Rvc19kcywgcmVhbEJhc2UrcnhPdXRPZnMpOw0KKyAgICBlbmFibGUoKTsNCisgICAgaWYgKGluT2ZzID49IG91dE9mcykNCisgICAgICAgcmV0dXJuIChpbk9mcyAtIG91dE9mcykgLyBzaXplb2YoUlhfRUxFTUVOVCk7DQorICAgIHJldHVybiAoTlVNX1JYX0JVRiAtIChvdXRPZnMgLSBpbk9mcykgLyBzaXplb2YoUlhfRUxFTUVOVCkpOw0KKyAgfQ0KKw0KKyAgUFVCTElDIERXT1JEIFBrdFJ4RHJvcHBlZCAodm9pZCkNCisgIHsNCisgICAgcmV0dXJuIF9mYXJwZWVrbCAoX2Rvc19kcywgcmVhbEJhc2UrcGt0RHJvcCk7DQorICB9DQorDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICBQVUJMSUMgaW50IFBrdFJlY2VpdmUgKEJZVEUgKmJ1ZiwgaW50IG1heCkNCisgIHsNCisgICAgV09SRCBvZnMgPSAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpOw0KKw0KKyAgICBpZiAob2ZzICE9ICooV09SRCopIChyZWFsQmFzZStyeEluT2ZzKSkNCisgICAgew0KKyAgICAgIFJYX0VMRU1FTlQgaGVhZDsNCisgICAgICBpbnQgIHNpemUsIGxlbiA9IG1heDsNCisNCisgICAgICBoZWFkLmZpcnN0Q291bnQgID0gKihXT1JEKikgKHJlYWxCYXNlK29mcyk7DQorICAgICAgaGVhZC5zZWNvbmRDb3VudCA9ICooV09SRCopIChyZWFsQmFzZStvZnMrMik7DQorICAgICAgaGVhZC5oYW5kbGUgICAgICA9ICooV09SRCopIChyZWFsQmFzZStvZnMrNCk7DQorDQorICAgICAgaWYgKENoZWNrRWxlbWVudCgmaGVhZCkpDQorICAgICAgew0KKyAgICAgICAgc2l6ZSA9IG1pbiAoaGVhZC5maXJzdENvdW50LCBzaXplb2YoUlhfRUxFTUVOVCkpOw0KKyAgICAgICAgbGVuICA9IG1pbiAoc2l6ZSwgbWF4KTsNCisgICAgICAgIG1lbWNweSAoYnVmLCAoY29uc3Qgdm9pZCopKHJlYWxCYXNlK29mcys2KSwgbGVuKTsNCisgICAgICB9DQorICAgICAgZWxzZQ0KKyAgICAgICAgc2l6ZSA9IC0xOw0KKw0KKyAgICAgIG9mcyArPSBzaXplb2YgKFJYX0VMRU1FTlQpOw0KKyAgICAgIGlmIChvZnMgPiBMQVNUX1JYX0JVRikNCisgICAgICAgICAgICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcykgPSBGSVJTVF9SWF9CVUY7DQorICAgICAgZWxzZSAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpID0gb2ZzOw0KKyAgICAgIHJldHVybiAoc2l6ZSk7DQorICAgIH0NCisgICAgcmV0dXJuICgwKTsNCisgIH0NCisNCisgIFBVQkxJQyB2b2lkIFBrdFF1ZXVlQnVzeSAoQk9PTCBidXN5KQ0KKyAgew0KKyAgICBXT1JEIG9mczsNCisNCisgICAgX2Rpc2FibGUoKTsNCisgICAgb2ZzID0gKihXT1JEKikgKHJlYWxCYXNlK3J4SW5PZnMpOw0KKyAgICBpZiAoYnVzeSkNCisgICAgICAgb2ZzICs9IHNpemVvZiAoUlhfRUxFTUVOVCk7DQorDQorICAgIGlmIChvZnMgPiBMQVNUX1JYX0JVRikNCisgICAgICAgICAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpID0gRklSU1RfUlhfQlVGOw0KKyAgICBlbHNlICooV09SRCopIChyZWFsQmFzZStyeE91dE9mcykgPSBvZnM7DQorICAgICooRFdPUkQqKSAocmVhbEJhc2UrcGt0RHJvcCkgPSAwVUw7DQorICAgIF9lbmFibGUoKTsNCisgIH0NCisNCisgIFBVQkxJQyBXT1JEIFBrdEJ1ZmZlcnNVc2VkICh2b2lkKQ0KKyAgew0KKyAgICBXT1JEIGluT2ZzLCBvdXRPZnM7DQorDQorICAgIF9kaXNhYmxlKCk7DQorICAgIGluT2ZzICA9ICooV09SRCopIChyZWFsQmFzZStyeEluT2ZzKTsNCisgICAgb3V0T2ZzID0gKihXT1JEKikgKHJlYWxCYXNlK3J4T3V0T2ZzKTsNCisgICAgX2VuYWJsZSgpOw0KKyAgICBpZiAoaW5PZnMgPj0gb3V0T2ZzKQ0KKyAgICAgICByZXR1cm4gKGluT2ZzIC0gb3V0T2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKTsNCisgICAgcmV0dXJuIChOVU1fUlhfQlVGIC0gKG91dE9mcyAtIGluT2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKSk7DQorICB9DQorDQorICBQVUJMSUMgRFdPUkQgUGt0UnhEcm9wcGVkICh2b2lkKQ0KKyAgew0KKyAgICByZXR1cm4gKihEV09SRCopIChyZWFsQmFzZStwa3REcm9wKTsNCisgIH0NCisNCisjZWxzZSAgICAgLyogcmVhbC1tb2RlIHNtYWxsL2xhcmdlIG1vZGVsICovDQorDQorICBQVUJMSUMgaW50IFBrdFJlY2VpdmUgKEJZVEUgKmJ1ZiwgaW50IG1heCkNCisgIHsNCisgICAgaWYgKHJ4T3V0T2ZzICE9IHJ4SW5PZnMpDQorICAgIHsNCisgICAgICBSWF9FTEVNRU5UIGZhciAqaGVhZCA9IChSWF9FTEVNRU5UIGZhciopIE1LX0ZQIChfRFMscnhPdXRPZnMpOw0KKyAgICAgIGludCAgc2l6ZSwgbGVuID0gbWF4Ow0KKw0KKyAgICAgIGlmIChDaGVja0VsZW1lbnQoaGVhZCkpDQorICAgICAgew0KKyAgICAgICAgc2l6ZSA9IG1pbiAoaGVhZC0+Zmlyc3RDb3VudCwgc2l6ZW9mKFJYX0VMRU1FTlQpKTsNCisgICAgICAgIGxlbiAgPSBtaW4gKHNpemUsIG1heCk7DQorICAgICAgICBfZm1lbWNweSAoYnVmLCAmaGVhZC0+ZGVzdGluLCBsZW4pOw0KKyAgICAgIH0NCisgICAgICBlbHNlDQorICAgICAgICBzaXplID0gLTE7DQorDQorICAgICAgcnhPdXRPZnMgKz0gc2l6ZW9mIChSWF9FTEVNRU5UKTsNCisgICAgICBpZiAocnhPdXRPZnMgPiBMQVNUX1JYX0JVRikNCisgICAgICAgICAgcnhPdXRPZnMgPSBGSVJTVF9SWF9CVUY7DQorICAgICAgcmV0dXJuIChzaXplKTsNCisgICAgfQ0KKyAgICByZXR1cm4gKDApOw0KKyAgfQ0KKw0KKyAgUFVCTElDIHZvaWQgUGt0UXVldWVCdXN5IChCT09MIGJ1c3kpDQorICB7DQorICAgIHJ4T3V0T2ZzID0gYnVzeSA/IChyeEluT2ZzICsgc2l6ZW9mKFJYX0VMRU1FTlQpKSA6IHJ4SW5PZnM7DQorICAgIGlmIChyeE91dE9mcyA+IExBU1RfUlhfQlVGKQ0KKyAgICAgICAgcnhPdXRPZnMgPSBGSVJTVF9SWF9CVUY7DQorICAgIHBrdERyb3AgPSAwTDsNCisgIH0NCisNCisgIFBVQkxJQyBXT1JEIFBrdEJ1ZmZlcnNVc2VkICh2b2lkKQ0KKyAgew0KKyAgICBXT1JEIGluT2ZzICA9IHJ4SW5PZnM7DQorICAgIFdPUkQgb3V0T2ZzID0gcnhPdXRPZnM7DQorDQorICAgIGlmIChpbk9mcyA+PSBvdXRPZnMpDQorICAgICAgIHJldHVybiAoKGluT2ZzIC0gb3V0T2ZzKSAvIHNpemVvZihSWF9FTEVNRU5UKSk7DQorICAgIHJldHVybiAoTlVNX1JYX0JVRiAtIChvdXRPZnMgLSBpbk9mcykgLyBzaXplb2YoUlhfRUxFTUVOVCkpOw0KKyAgfQ0KKw0KKyAgUFVCTElDIERXT1JEIFBrdFJ4RHJvcHBlZCAodm9pZCkNCisgIHsNCisgICAgcmV0dXJuIChwa3REcm9wKTsNCisgIH0NCisjZW5kaWYNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorTE9DQUwgX19pbmxpbmUgdm9pZCBQa3RGcmVlTWVtICh2b2lkKQ0KK3sNCisjaWYgKERPU1ggJiBQSEFSTEFQKQ0KKyAgaWYgKHJlYWxTZWcpDQorICB7DQorICAgIF9keF9yZWFsX2ZyZWUgKHJlYWxTZWcpOw0KKyAgICByZWFsU2VnID0gMDsNCisgIH0NCisjZWxpZiAoRE9TWCAmIERKR1BQKQ0KKyAgaWYgKHJtX21lbS5ybV9zZWdtZW50KQ0KKyAgew0KKyAgICB1bnNpZ25lZCBvZnM7ICAvKiBjbGVhciB0aGUgRE9TLW1lbSB0byBwcmV2ZW50IGZ1cnRoZXIgdXBjYWxscyAqLw0KKw0KKyAgICBmb3IgKG9mcyA9IDA7IG9mcyA8IDE2ICogcm1fbWVtLnNpemUgLyA0OyBvZnMgKz0gNCkNCisgICAgICAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZSArIG9mcywgMCk7DQorICAgIF9nbzMyX2RwbWlfZnJlZV9kb3NfbWVtb3J5ICgmcm1fbWVtKTsNCisgICAgcm1fbWVtLnJtX3NlZ21lbnQgPSAwOw0KKyAgfQ0KKyNlbGlmIChET1NYICYgRE9TNEdXKQ0KKyAgaWYgKHJtX2Jhc2Vfc2VsKQ0KKyAgew0KKyAgICBkcG1pX3JlYWxfZnJlZSAocm1fYmFzZV9zZWwpOw0KKyAgICBybV9iYXNlX3NlbCA9IDA7DQorICB9DQorI2VuZGlmDQorfQ0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCitQVUJMSUMgQk9PTCBQa3RFeGl0RHJpdmVyICh2b2lkKQ0KK3sgICAgICAgICAgIA0KKyAgaWYgKHBrdEluZm8uaGFuZGxlKQ0KKyAgew0KKyAgICBpZiAoIVBrdFNldFJlY2VpdmVyTW9kZShQRFJYX0JST0FEQ0FTVCkpDQorICAgICAgIFBVVFMgKCJFcnJvciByZXN0b3JpbmcgcmVjZWl2ZXIgbW9kZS4iKTsNCisNCisgICAgaWYgKCFQa3RSZWxlYXNlSGFuZGxlKHBrdEluZm8uaGFuZGxlKSkNCisgICAgICAgUFVUUyAoIkVycm9yIHJlbGVhc2luZyBQS1QtRFJWUiBoYW5kbGUuIik7DQorDQorICAgIFBrdEZyZWVNZW0oKTsNCisgICAgcGt0SW5mby5oYW5kbGUgPSAwOw0KKyAgfQ0KKw0KKyAgaWYgKHBjYXBfcGt0X2RlYnVnID49IDEpDQorICAgICBwcmludGYgKCJJbnRlcm5hbCBzdGF0czogdG9vLXNtYWxsICVsdSwgdG9vLWxhcmdlICVsdSwgYmFkLXN5bmMgJWx1LCAiDQorICAgICAgICAgICAgICJ3cm9uZy1oYW5kbGUgJWx1XG4iLA0KKyAgICAgICAgICAgICBpbnRTdGF0LnRvb1NtYWxsLCBpbnRTdGF0LnRvb0xhcmdlLA0KKyAgICAgICAgICAgICBpbnRTdGF0LmJhZFN5bmMsIGludFN0YXQud3JvbmdIYW5kbGUpOw0KKyAgcmV0dXJuIChUUlVFKTsNCit9DQorDQorI2lmIChET1NYICYgKERKR1BQfERPUzRHVykpDQorc3RhdGljIHZvaWQgZHVtcF9wa3Rfc3R1YiAodm9pZCkNCit7DQorICBpbnQgaTsNCisNCisgIGZwcmludGYgKHN0ZGVyciwgIlBrdFJlY2VpdmVyICVsdSwgcGt0X3N0dWJbUGt0UmVjZWl2ZXJdID1cbiIsDQorICAgICAgICAgICBQa3RSZWNlaXZlcik7DQorICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykNCisgICAgICBmcHJpbnRmIChzdGRlcnIsICIlMDJYLCAiLCByZWFsX3N0dWJfYXJyYXlbaStQa3RSZWNlaXZlcl0pOw0KKyAgZnB1dHMgKCJcbiIsIHN0ZGVycik7DQorfQ0KKyNlbmRpZg0KKw0KKy8qDQorICogRnJvbnQgZW5kIGluaXRpYWxpemF0aW9uIHJvdXRpbmUNCisgKi8NCitQVUJMSUMgQk9PTCBQa3RJbml0RHJpdmVyIChQS1RfUlhfTU9ERSBtb2RlKQ0KK3sNCisgIFBLVF9SWF9NT0RFIHJ4TW9kZTsNCisgIEJPT0wgICB3cml0ZUluZm8gPSAocGNhcF9wa3RfZGVidWcgPj0gMyk7DQorDQorICBwa3RJbmZvLnF1aWV0ID0gKHBjYXBfcGt0X2RlYnVnIDwgMyk7DQorDQorI2lmIChET1NYICYgUEhBUkxBUCkgJiYgZGVmaW5lZChfX0hJR0hDX18pDQorICBpZiAoX213ZW52ICE9IDIpDQorICB7DQorICAgIGZwcmludGYgKHN0ZGVyciwgIk9ubHkgUGhhcmxhcCBET1MgZXh0ZW5kZXIgc3VwcG9ydGVkLlxuIik7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKyNlbmRpZg0KKw0KKyNpZiAoRE9TWCAmIFBIQVJMQVApICYmIGRlZmluZWQoX19XQVRDT01DX18pDQorICBpZiAoX0V4dGVuZGVyICE9IDEpDQorICB7DQorICAgIGZwcmludGYgKHN0ZGVyciwgIk9ubHkgRE9TNEdXIHN0eWxlIGV4dGVuZGVycyBzdXBwb3J0ZWQuXG4iKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorI2VuZGlmDQorDQorICBpZiAoIVBrdFNlYXJjaERyaXZlcigpKQ0KKyAgew0KKyAgICBQVVRTICgiUGFja2V0IGRyaXZlciBub3QgZm91bmQuIik7DQorICAgIFBrdEZyZWVNZW0oKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorDQorICBpZiAoIVBrdEdldERyaXZlckluZm8oKSkNCisgIHsNCisgICAgUFVUUyAoIkVycm9yIGdldHRpbmcgcGt0LWRydnIgaW5mb3JtYXRpb24uIik7DQorICAgIFBrdEZyZWVNZW0oKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorDQorI2lmIChET1NYICYgUEhBUkxBUCkNCisgIGlmIChSZWFsQ29weSgoVUxPTkcpJnJ4T3V0T2ZzLCAoVUxPTkcpJnBrdFJ4RW5kLA0KKyAgICAgICAgICAgICAgICZyZWFsQmFzZSwgJnByb3RCYXNlLCAoVVNIT1JUKikmcmVhbFNlZykpDQorICB7DQorICAgIHJ4T3V0T2ZzRnAgID0gKFdPUkQgX2ZhciAqKSAocHJvdEJhc2UgKyAoV09SRCkgJnJ4T3V0T2ZzKTsNCisgICAgcnhJbk9mc0ZwICAgPSAoV09SRCBfZmFyICopIChwcm90QmFzZSArIChXT1JEKSAmcnhJbk9mcyk7DQorICAgICpyeE91dE9mc0ZwID0gRklSU1RfUlhfQlVGOw0KKyAgICAqcnhJbk9mc0ZwICA9IEZJUlNUX1JYX0JVRjsNCisgIH0NCisgIGVsc2UNCisgIHsNCisgICAgUFVUUyAoIkNhbm5vdCBhbGxvY2F0ZSByZWFsLW1vZGUgc3R1Yi4iKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorDQorI2VsaWYgKERPU1ggJiAoREpHUFB8RE9TNEdXKSkNCisgIGlmIChzaXplb2YocmVhbF9zdHViX2FycmF5KSA+IDB4RkZGRikNCisgIHsNCisgICAgZnByaW50ZiAoc3RkZXJyLCAiYHJlYWxfc3R1Yl9hcnJheVtdJyB0b28gYmlnLlxuIik7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKyNpZiAoRE9TWCAmIERKR1BQKQ0KKyAgcm1fbWVtLnNpemUgPSAoc2l6ZW9mKHJlYWxfc3R1Yl9hcnJheSkgKyAxNSkgLyAxNjsNCisNCisgIGlmIChfZ28zMl9kcG1pX2FsbG9jYXRlX2Rvc19tZW1vcnkoJnJtX21lbSkgfHwgcm1fbWVtLnJtX29mZnNldCAhPSAwKQ0KKyAgew0KKyAgICBQVVRTICgicmVhbC1tb2RlIGluaXQgZmFpbGVkLiIpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisgIHJlYWxCYXNlID0gKHJtX21lbS5ybV9zZWdtZW50IDw8IDQpOw0KKyAgZG9zbWVtcHV0ICgmcmVhbF9zdHViX2FycmF5LCBzaXplb2YocmVhbF9zdHViX2FycmF5KSwgcmVhbEJhc2UpOw0KKyAgX2ZhcnBva2VsIChfZG9zX2RzLCByZWFsQmFzZStyeE91dE9mcywgRklSU1RfUlhfQlVGKTsNCisgIF9mYXJwb2tlbCAoX2Rvc19kcywgcmVhbEJhc2UrcnhJbk9mcywgIEZJUlNUX1JYX0JVRik7DQorDQorI2VsaWYgKERPU1ggJiBET1M0R1cpDQorICBybV9iYXNlX3NlZyA9IGRwbWlfcmVhbF9tYWxsb2MgKHNpemVvZihyZWFsX3N0dWJfYXJyYXkpLCAmcm1fYmFzZV9zZWwpOw0KKyAgaWYgKCFybV9iYXNlX3NlZykNCisgIHsNCisgICAgUFVUUyAoInJlYWwtbW9kZSBpbml0IGZhaWxlZC4iKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorICByZWFsQmFzZSA9IChybV9iYXNlX3NlZyA8PCA0KTsNCisgIG1lbWNweSAoKHZvaWQqKXJlYWxCYXNlLCAmcmVhbF9zdHViX2FycmF5LCBzaXplb2YocmVhbF9zdHViX2FycmF5KSk7DQorICAqKFdPUkQqKSAocmVhbEJhc2UrcnhPdXRPZnMpID0gRklSU1RfUlhfQlVGOw0KKyAgKihXT1JEKikgKHJlYWxCYXNlK3J4SW5PZnMpICA9IEZJUlNUX1JYX0JVRjsNCisNCisjZW5kaWYNCisgIHsNCisgICAgaW50IHB1c2hmID0gUGt0UmVjZWl2ZXI7DQorDQorICAgIHdoaWxlIChyZWFsX3N0dWJfYXJyYXlbcHVzaGYrK10gIT0gMHg5QyAmJiAgICAvKiBwdXNoZiAqLw0KKyAgICAgICAgICAgcmVhbF9zdHViX2FycmF5W3B1c2hmXSAgICE9IDB4RkEpICAgICAgLyogY2xpICAgKi8NCisgICAgew0KKyAgICAgIGlmICgrK3BhcmFfc2tpcCA+IDE2KQ0KKyAgICAgIHsNCisgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIlNvbWV0aGluZyB3cm9uZyB3aXRoIGBwa3Rfc3R1Yi5pbmMnLlxuIik7DQorICAgICAgICBwYXJhX3NraXAgPSAwOw0KKyAgICAgICAgZHVtcF9wa3Rfc3R1YigpOw0KKyAgICAgICAgcmV0dXJuIChGQUxTRSk7DQorICAgICAgfQ0KKyAgICB9DQorICAgIGlmICgqKFdPUkQqKShyZWFsX3N0dWJfYXJyYXkgKyBvZmZzZXRvZihQa3RSZWFsU3R1YixfZHVtbXkpKSAhPSAweEI4MDApDQorICAgIHsNCisgICAgICBmcHJpbnRmIChzdGRlcnIsICJgcmVhbF9zdHViX2FycmF5W10nIGlzIG1pc2FsaWduZWQuXG4iKTsNCisgICAgICByZXR1cm4gKEZBTFNFKTsNCisgICAgfQ0KKyAgfQ0KKw0KKyAgaWYgKHBjYXBfcGt0X2RlYnVnID4gMikNCisgICAgICBkdW1wX3BrdF9zdHViKCk7DQorDQorI2Vsc2UNCisgIHJ4T3V0T2ZzID0gRklSU1RfUlhfQlVGOw0KKyAgcnhJbk9mcyAgPSBGSVJTVF9SWF9CVUY7DQorI2VuZGlmDQorDQorICBpZiAoIVBrdFNldEFjY2VzcygpKQ0KKyAgew0KKyAgICBQVVRTICgiRXJyb3Igc2V0dGluZyBwa3QtZHJ2ciBhY2Nlc3MuIik7DQorICAgIFBrdEZyZWVNZW0oKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorDQorICBpZiAoIVBrdEdldEFkZHJlc3MoJm15QWRkcmVzcykpDQorICB7DQorICAgIFBVVFMgKCJFcnJvciBmZXRjaGluZyBhZGFwdGVyIGFkZHJlc3MuIik7DQorICAgIFBrdEZyZWVNZW0oKTsNCisgICAgcmV0dXJuIChGQUxTRSk7DQorICB9DQorDQorICBpZiAoIVBrdFNldFJlY2VpdmVyTW9kZShtb2RlKSkNCisgIHsNCisgICAgUFVUUyAoIkVycm9yIHNldHRpbmcgcmVjZWl2ZXIgbW9kZS4iKTsNCisgICAgUGt0RnJlZU1lbSgpOw0KKyAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisNCisgIGlmICghUGt0R2V0UmVjZWl2ZXJNb2RlKCZyeE1vZGUpKQ0KKyAgew0KKyAgICBQVVRTICgiRXJyb3IgZ2V0dGluZyByZWNlaXZlciBtb2RlLiIpOw0KKyAgICBQa3RGcmVlTWVtKCk7DQorICAgIHJldHVybiAoRkFMU0UpOw0KKyAgfQ0KKw0KKyAgaWYgKHdyaXRlSW5mbykNCisgICAgIHByaW50ZiAoIlBrdC1kcml2ZXIgaW5mb3JtYXRpb246XG4iDQorICAgICAgICAgICAgICIgIFZlcnNpb24gIDogJWQuJWRcbiINCisgICAgICAgICAgICAgIiAgTmFtZSAgICAgOiAlLjE1c1xuIg0KKyAgICAgICAgICAgICAiICBDbGFzcyAgICA6ICV1ICglcylcbiINCisgICAgICAgICAgICAgIiAgVHlwZSAgICAgOiAldVxuIg0KKyAgICAgICAgICAgICAiICBOdW1iZXIgICA6ICV1XG4iDQorICAgICAgICAgICAgICIgIEZ1bmNzICAgIDogJXVcbiINCisgICAgICAgICAgICAgIiAgSW50ciAgICAgOiAlWGhcbiINCisgICAgICAgICAgICAgIiAgSGFuZGxlICAgOiAldVxuIg0KKyAgICAgICAgICAgICAiICBFeHRlbmRlZCA6ICVzXG4iDQorICAgICAgICAgICAgICIgIEhpLXBlcmYgIDogJXNcbiINCisgICAgICAgICAgICAgIiAgUlggbW9kZSAgOiAlc1xuIg0KKyAgICAgICAgICAgICAiICBFdGgtYWRkciA6ICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYXG4iLA0KKw0KKyAgICAgICAgICAgICBwa3RJbmZvLm1halZlciwgcGt0SW5mby5taW5WZXIsIHBrdEluZm8ubmFtZSwNCisgICAgICAgICAgICAgcGt0SW5mby5jbGFzcywgIFBrdEdldENsYXNzTmFtZShwa3RJbmZvLmNsYXNzKSwNCisgICAgICAgICAgICAgcGt0SW5mby50eXBlLCAgIHBrdEluZm8ubnVtYmVyLA0KKyAgICAgICAgICAgICBwa3RJbmZvLmZ1bmNzLCAgcGt0SW5mby5pbnRyLCAgIHBrdEluZm8uaGFuZGxlLA0KKyAgICAgICAgICAgICBwa3RJbmZvLmZ1bmNzID09IDIgfHwgcGt0SW5mby5mdW5jcyA9PSA2ID8gIlllcyIgOiAiTm8iLA0KKyAgICAgICAgICAgICBwa3RJbmZvLmZ1bmNzID09IDUgfHwgcGt0SW5mby5mdW5jcyA9PSA2ID8gIlllcyIgOiAiTm8iLA0KKyAgICAgICAgICAgICBQa3RSWG1vZGVTdHIocnhNb2RlKSwNCisgICAgICAgICAgICAgbXlBZGRyZXNzWzBdLCBteUFkZHJlc3NbMV0sIG15QWRkcmVzc1syXSwNCisgICAgICAgICAgICAgbXlBZGRyZXNzWzNdLCBteUFkZHJlc3NbNF0sIG15QWRkcmVzc1s1XSk7DQorDQorI2lmIGRlZmluZWQoREVCVUcpICYmIChET1NYICYgUEhBUkxBUCkNCisgIGlmICh3cml0ZUluZm8pDQorICB7DQorICAgIERXT1JEICAgIHJBZHIgPSByZWFsQmFzZSArIChXT1JEKSZQa3RSZWNlaXZlcjsNCisgICAgdW5zaWduZWQgc2VsLCBvZnM7DQorDQorICAgIHByaW50ZiAoIlxuUmVjZWl2ZXIgYXQgICAlMDRYOiUwNFhcbiIsIFJQX1NFRyhyQWRyKSwgICAgUlBfT0ZGKHJBZHIpKTsNCisgICAgcHJpbnRmICgiUmVhbGJhc2UgICAgPSAlMDRYOiUwNFhcbiIsICAgUlBfU0VHKHJlYWxCYXNlKSxSUF9PRkYocmVhbEJhc2UpKTsNCisNCisgICAgc2VsID0gX0ZQX1NFRyAocHJvdEJhc2UpOw0KKyAgICBvZnMgPSBfRlBfT0ZGIChwcm90QmFzZSk7DQorICAgIHByaW50ZiAoIlByb3RiYXNlICAgID0gJTA0WDolMDhYXG4iLCBzZWwsb2ZzKTsNCisgICAgcHJpbnRmICgiUmVhbFNlZyAgICAgPSAlMDRYXG4iLCByZWFsU2VnKTsNCisNCisgICAgc2VsID0gX0ZQX1NFRyAocnhPdXRPZnNGcCk7DQorICAgIG9mcyA9IF9GUF9PRkYgKHJ4T3V0T2ZzRnApOw0KKyAgICBwcmludGYgKCJyeE91dE9mc0ZwICA9ICUwNFg6JTA4WFxuIiwgc2VsLG9mcyk7DQorDQorICAgIHNlbCA9IF9GUF9TRUcgKHJ4SW5PZnNGcCk7DQorICAgIG9mcyA9IF9GUF9PRkYgKHJ4SW5PZnNGcCk7DQorICAgIHByaW50ZiAoInJ4SW5PZnNGcCAgID0gJTA0WDolMDhYXG4iLCBzZWwsb2ZzKTsNCisNCisgICAgcHJpbnRmICgiUmVhZHk6ICpyeE91dE9mc0ZwID0gJTA0WCAqcnhJbk9mc0ZwID0gJTA0WFxuIiwNCisgICAgICAgICAgICAqcnhPdXRPZnNGcCwgKnJ4SW5PZnNGcCk7DQorDQorICAgIFBrdFF1ZXVlQnVzeSAoVFJVRSk7DQorICAgIHByaW50ZiAoIkJ1c3k6ICAqcnhPdXRPZnNGcCA9ICUwNFggKnJ4SW5PZnNGcCA9ICUwNFhcbiIsDQorICAgICAgICAgICAgKnJ4T3V0T2ZzRnAsICpyeEluT2ZzRnApOw0KKyAgfQ0KKyNlbmRpZg0KKw0KKyAgbWVtc2V0ICgmcGt0U3RhdCwgMCwgc2l6ZW9mKHBrdFN0YXQpKTsgIC8qIGNsZWFyIHN0YXRpc3RpY3MgKi8NCisgIFBrdFF1ZXVlQnVzeSAoVFJVRSk7DQorICByZXR1cm4gKFRSVUUpOw0KK30NCisNCisNCisvKg0KKyAqIERQTUkgZnVuY3Rpb25zIG9ubHkgZm9yIFdhdGNvbSArIERPUzRHVyBleHRlbmRlcnMNCisgKi8NCisjaWYgKERPU1ggJiBET1M0R1cpDQorTE9DQUwgRFdPUkQgZHBtaV9nZXRfcmVhbF92ZWN0b3IgKGludCBpbnRyKQ0KK3sNCisgIHVuaW9uIFJFR1MgcjsNCisNCisgIHIueC5lYXggPSAweDIwMDsNCisgIHIueC5lYnggPSAoRFdPUkQpIGludHI7DQorICBpbnQzODYgKDB4MzEsICZyLCAmcik7DQorICByZXR1cm4gKChyLncuY3ggPDwgNCkgKyByLncuZHgpOw0KK30NCisNCitMT0NBTCBXT1JEIGRwbWlfcmVhbF9tYWxsb2MgKGludCBzaXplLCBXT1JEICpzZWxlY3RvcikNCit7DQorICB1bmlvbiBSRUdTIHI7DQorDQorICByLnguZWF4ID0gMHgwMTAwOyAgICAgICAgICAgICAvKiBEUE1JIGFsbG9jYXRlIERPUyBtZW1vcnkgKi8NCisgIHIueC5lYnggPSAoc2l6ZSArIDE1KSAvIDE2OyAgIC8qIE51bWJlciBvZiBwYXJhZ3JhcGhzIHJlcXVlc3RlZCAqLw0KKyAgaW50Mzg2ICgweDMxLCAmciwgJnIpOw0KKyAgaWYgKHIudy5jZmxhZyAmIDEpDQorICAgICByZXR1cm4gKDApOw0KKw0KKyAgKnNlbGVjdG9yID0gci53LmR4Ow0KKyAgcmV0dXJuIChyLncuYXgpOyAgICAgICAgICAgICAgLyogUmV0dXJuIHNlZ21lbnQgYWRkcmVzcyAqLw0KK30NCisNCitMT0NBTCB2b2lkIGRwbWlfcmVhbF9mcmVlIChXT1JEIHNlbGVjdG9yKQ0KK3sNCisgIHVuaW9uIFJFR1MgcjsNCisNCisgIHIueC5lYXggPSAweDEwMTsgICAgICAgICAgICAgIC8qIERQTUkgZnJlZSBET1MgbWVtb3J5ICovDQorICByLnguZWJ4ID0gc2VsZWN0b3I7ICAgICAgICAgICAvKiBTZWxlY3RvciB0byBmcmVlICovDQorICBpbnQzODYgKDB4MzEsICZyLCAmcik7DQorfQ0KKyNlbmRpZg0KKw0KKw0KKyNpZiBkZWZpbmVkKERPU1gpICYmIChET1NYICYgUEhBUkxBUCkNCisvKg0KKyAqIERlc2NyaXB0aW9uOg0KKyAqICAgICBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIGNvbnZlbnRpb25hbCBtZW1vcnkgZm9yIHRoZSBzcGVjaWZpZWQgYmxvY2sNCisgKiAgICAgb2YgY29kZSAod2hpY2ggbXVzdCBiZSB3aXRoaW4gdGhlIGZpcnN0IDY0SyBvZiB0aGUgcHJvdGVjdGVkIG1vZGUNCisgKiAgICAgcHJvZ3JhbSBzZWdtZW50KSBhbmQgY29waWVzIHRoZSBjb2RlIHRvIGl0Lg0KKyAqDQorICogICAgIFRoZSBjYWxsZXIgc2hvdWxkIGZyZWUgdXAgdGhlIGNvbnZlbnRpb25hbCBtZW1vcnkgYmxvY2sgd2hlbiBpdA0KKyAqICAgICBpcyBkb25lIHdpdGggdGhlIGNvbnZlbnRpb25hbCBtZW1vcnkuDQorICoNCisgKiAgICAgTk9URSBUSElTIFJPVVRJTkUgUkVRVUlSRVMgMzg2fERPUy1FWFRFTkRFUiAzLjAgT1IgTEFURVIuDQorICoNCisgKiBDYWxsaW5nIGFyZ3VtZW50czoNCisgKiAgICAgc3RhcnRfb2ZmcyAgICAgIHN0YXJ0IG9mIHJlYWwgbW9kZSBjb2RlIGluIHByb2dyYW0gc2VnbWVudA0KKyAqICAgICBlbmRfb2ZmcyAgICAgICAgMSBieXRlIHBhc3QgZW5kIG9mIHJlYWwgbW9kZSBjb2RlIGluIHByb2dyYW0gc2VnbWVudA0KKyAqICAgICByZWFsX2Jhc2VwICAgICAgcmV0dXJuZWQ7ICByZWFsIG1vZGUgcHRyIHRvIHVzZSBhcyBhIGJhc2UgZm9yIHRoZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCBtb2RlIGNvZGUgKGVnLCB0byBnZXQgdGhlIHJlYWwgbW9kZSBGQVINCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgb2YgYSBmdW5jdGlvbiBmb28oKSwgdGFrZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgcmVhbF9iYXNlcCArIChVTE9ORykgZm9vKS4NCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcG9pbnRlciBpcyBjb25zdHJ1Y3RlZCBzdWNoIHRoYXQNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHMgd2l0aGluIHRoZSByZWFsIG1vZGUgc2VnbWVudCBhcmUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGFzIHRoZSBsaW5rLXRpbWUgb2Zmc2V0cyBpbiB0aGUNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBtb2RlIHByb2dyYW0gc2VnbWVudA0KKyAqICAgICBwcm90X2Jhc2VwICAgICAgcmV0dXJuZWQ7ICBwcm90IG1vZGUgcHRyIHRvIHVzZSBhcyBhIGJhc2UgZm9yIGdldHRpbmcNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjb252ZW50aW9uYWwgbWVtb3J5LCBhbHNvIGNvbnN0cnVjdGVkDQorICogICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IGFkZGluZyB0aGUgcHJvdCBtb2RlIG9mZnNldCBvZiBhDQorICogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvciB2YXJpYWJsZSB0byB0aGUgYmFzZSBnZXRzIHlvdSBhDQorICogICAgICAgICAgICAgICAgICAgICAgICBwdHIgdG8gdGhlIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGluIHRoZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgY29udmVudGlvbmFsIG1lbW9yeSBibG9jay4NCisgKiAgICAgcm1lbV9hZHJwICAgICAgIHJldHVybmVkOyAgcmVhbCBtb2RlIHBhcmEgYWRkciBvZiBhbGxvY2F0ZWQNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlbnRpb25hbCBtZW1vcnkgYmxvY2ssIHRvIGJlIHVzZWQgdG8gZnJlZQ0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgdXAgdGhlIGNvbnZlbnRpb25hbCBtZW1vcnkgd2hlbiBkb25lLiAgRE8gTk9UDQorICogICAgICAgICAgICAgICAgICAgICAgICBVU0UgVEhJUyBUTyBDT05TVFJVQ1QgQSBSRUFMIE1PREUgUFRSLCBVU0UNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFJFQUxfQkFTRVAgSU5TVEVBRCBTTyBUSEFUIE9GRlNFVFMgV09SSyBPVVQNCisgKiAgICAgICAgICAgICAgICAgICAgICAgIENPUlJFQ1RMWS4NCisgKg0KKyAqIFJldHVybmVkIHZhbHVlczoNCisgKiAgICAgMCAgICAgIGlmIGVycm9yDQorICogICAgIDEgICAgICBpZiBzdWNjZXNzDQorICovDQoraW50IFJlYWxDb3B5IChVTE9ORyAgICBzdGFydF9vZmZzLA0KKyAgICAgICAgICAgICAgVUxPTkcgICAgZW5kX29mZnMsDQorICAgICAgICAgICAgICBSRUFMUFRSICpyZWFsX2Jhc2VwLA0KKyAgICAgICAgICAgICAgRkFSUFRSICAqcHJvdF9iYXNlcCwNCisgICAgICAgICAgICAgIFVTSE9SVCAgKnJtZW1fYWRycCkNCit7DQorICBVTE9ORyAgIHJtX2Jhc2U7ICAgIC8qIGJhc2UgcmVhbCBtb2RlIHBhcmEgYWRkciBmb3IgYWNjZXNzaW5nICovDQorICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbG9jYXRlZCBjb252ZW50aW9uYWwgbWVtb3J5ICAgICAgICAgICovDQorICBVQ0hBUiAgKnNvdXJjZTsgICAgIC8qIHNvdXJjZSBwb2ludGVyIGZvciBjb3B5ICAgICAgICAgICAgICAgICovDQorICBGQVJQVFIgIGRlc3RpbjsgICAgIC8qIGRlc3RpbmF0aW9uIHBvaW50ZXIgZm9yIGNvcHkgICAgICAgICAgICovDQorICBVTE9ORyAgIGxlbjsgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyB0byBjb3B5ICAgICAgICAgICAgICAgICovDQorICBVTE9ORyAgIHRlbXA7DQorICBVU0hPUlQgIHN0ZW1wOw0KKw0KKyAgLyogRmlyc3QgY2hlY2sgZm9yIHZhbGlkIGlucHV0cw0KKyAgICovDQorICBpZiAoc3RhcnRfb2ZmcyA+PSBlbmRfb2ZmcyB8fCBlbmRfb2ZmcyA+IDB4MTAwMDApDQorICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisgIC8qIFJvdW5kIHN0YXJ0X29mZnMgZG93biB0byBhIHBhcmFncmFwaCAoMTYtYnl0ZSkgYm91bmRhcnkgc28gd2UgY2FuIHNldCB1cA0KKyAgICogdGhlIHJlYWwgbW9kZSBwb2ludGVyIGVhc2lseS4gUm91bmQgdXAgZW5kX29mZnMgdG8gbWFrZSBzdXJlIHdlIGFsbG9jYXRlDQorICAgKiBlbm91Z2ggcGFyYWdyYXBocw0KKyAgICovDQorICBzdGFydF9vZmZzICY9IH4xNTsNCisgIGVuZF9vZmZzID0gKDE1ICsgKGVuZF9vZmZzIDw8IDQpKSA+PiA0Ow0KKw0KKyAgLyogQWxsb2NhdGUgdGhlIGNvbnZlbnRpb25hbCBtZW1vcnkgZm9yIG91ciByZWFsIG1vZGUgY29kZS4gIFJlbWVtYmVyIHRvDQorICAgKiByb3VuZCBieXRlIGNvdW50IFVQIHRvIDE2LWJ5dGUgcGFyYWdyYXBoIHNpemUuICBXZSBhbGxvYyBpdA0KKyAgICogYWJvdmUgdGhlIERPUyBkYXRhIGJ1ZmZlciBzbyBib3RoIHRoZSBET1MgZGF0YSBidWZmZXIgYW5kIHRoZSBhcHBsDQorICAgKiBjb252ZW50aW9uYWwgbWVtIGJsb2NrIGNhbiBzdGlsbCBiZSByZXNpemVkLg0KKyAgICoNCisgICAqIEZpcnN0IGp1c3QgdHJ5IHRvIGFsbG9jIGl0OyAgaWYgd2UgY2FuJ3QgZ2V0IGl0LCBzaHJpbmsgdGhlIGFwcGwgbWVtDQorICAgKiBibG9jayBkb3duIHRvIHRoZSBtaW5pbXVtLCB0cnkgdG8gYWxsb2MgdGhlIG1lbW9yeSBhZ2FpbiwgdGhlbiBncm93IHRoZQ0KKyAgICogYXBwbCBtZW0gYmxvY2sgYmFjayB0byB0aGUgbWF4aW11bS4gIChEb24ndCB0cnkgdG8gc2hyaW5rIHRoZSBET1MgZGF0YQ0KKyAgICogYnVmZmVyIHRvIGZyZWUgY29udmVudGlvbmFsIG1lbW9yeTsgIGl0IHdvdWxkbid0IGJlIGdvb2QgZm9yIHRoaXMgcm91dGluZQ0KKyAgICogdG8gaGF2ZSB0aGUgcG9zc2libGUgc2lkZSBlZmZlY3Qgb2YgbWFraW5nIGZpbGUgSS9PIHJ1biBzbG93ZXIuKQ0KKyAgICovDQorICBsZW4gPSAoKGVuZF9vZmZzIC0gc3RhcnRfb2ZmcykgKyAxNSkgPj4gNDsNCisgIGlmIChfZHhfcmVhbF9hYm92ZShsZW4sIHJtZW1fYWRycCwgJnN0ZW1wKSAhPSBfRE9TRV9OT05FKQ0KKyAgew0KKyAgICBpZiAoX2R4X2NtZW1fdXNhZ2UoMCwgMCwgJnRlbXAsICZ0ZW1wKSAhPSBfRE9TRV9OT05FKQ0KKyAgICAgICByZXR1cm4gKEZBTFNFKTsNCisNCisgICAgaWYgKF9keF9yZWFsX2Fib3ZlKGxlbiwgcm1lbV9hZHJwLCAmc3RlbXApICE9IF9ET1NFX05PTkUpDQorICAgICAgICpybWVtX2FkcnAgPSAwOw0KKw0KKyAgICBpZiAoX2R4X2NtZW1fdXNhZ2UoMCwgMSwgJnRlbXAsICZ0ZW1wKSAhPSBfRE9TRV9OT05FKQ0KKyAgICB7DQorICAgICAgaWYgKCpybWVtX2FkcnAgIT0gMCkNCisgICAgICAgICBfZHhfcmVhbF9mcmVlICgqcm1lbV9hZHJwKTsNCisgICAgICByZXR1cm4gKEZBTFNFKTsNCisgICAgfQ0KKw0KKyAgICBpZiAoKnJtZW1fYWRycCA9PSAwKQ0KKyAgICAgICByZXR1cm4gKEZBTFNFKTsNCisgIH0NCisNCisgIC8qIENvbnN0cnVjdCByZWFsIG1vZGUgJiBwcm90ZWN0ZWQgbW9kZSBwb2ludGVycyB0byBhY2Nlc3MgdGhlIGFsbG9jYXRlZA0KKyAgICogbWVtb3J5LiAgTm90ZSB3ZSBrbm93IHN0YXJ0X29mZnMgaXMgYWxpZ25lZCBvbiBhIHBhcmFncmFwaCAoMTYtYnl0ZSkNCisgICAqIGJvdW5kYXJ5LCBiZWNhdXNlIHdlIHJvdW5kZWQgaXQgZG93bi4NCisgICAqDQorICAgKiBXZSBtYWtlIHRoZSBvZmZzZXRzIGNvbWUgb3V0IHJpZ2h0cyBieSBiYWNraW5nIG9mZiB0aGUgcmVhbCBtb2RlIHNlbGVjdG9yDQorICAgKiBieSBzdGFydF9vZmZzLg0KKyAgICovDQorICBybV9iYXNlID0gKChVTE9ORykgKnJtZW1fYWRycCkgLSAoc3RhcnRfb2ZmcyA+PiA0KTsNCisgIFJQX1NFVCAoKnJlYWxfYmFzZXAsIDAsIHJtX2Jhc2UpOw0KKyAgRlBfU0VUICgqcHJvdF9iYXNlcCwgcm1fYmFzZSA8PCA0LCBTU19ET1NNRU0pOw0KKw0KKyAgLyogQ29weSB0aGUgcmVhbCBtb2RlIGNvZGUvZGF0YSB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeQ0KKyAgICovDQorICBzb3VyY2UgPSAoVUNIQVIgKikgc3RhcnRfb2ZmczsNCisgIGRlc3RpbiA9ICpwcm90X2Jhc2VwOw0KKyAgRlBfU0VUIChkZXN0aW4sIEZQX09GRigqcHJvdF9iYXNlcCkgKyBzdGFydF9vZmZzLCBGUF9TRUwoKnByb3RfYmFzZXApKTsNCisgIGxlbiA9IGVuZF9vZmZzIC0gc3RhcnRfb2ZmczsNCisgIFdyaXRlRmFyTWVtIChkZXN0aW4sIHNvdXJjZSwgbGVuKTsNCisNCisgIHJldHVybiAoVFJVRSk7DQorfQ0KKyNlbmRpZiAvKiBET1NYICYmIChET1NYICYgUEhBUkxBUCkgKi8NCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL21zZG9zL3BrdGRydnIuaCBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvcGt0ZHJ2ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODk4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL21zZG9zL3BrdGRydnIuaApAQCAtMCwwICsxLDE1MyBAQAorI2lmbmRlZiBfX1BLVERSVlJfSA0KKyNkZWZpbmUgX19QS1REUlZSX0gNCisNCisjZGVmaW5lIFBVQkxJQw0KKyNkZWZpbmUgTE9DQUwgICAgICAgIHN0YXRpYw0KKw0KKyNkZWZpbmUgUlhfQlVGX1NJWkUgIEVUSF9NVFUgICAvKiBidWZmZXIgc2l6ZSB2YXJpYWJsZXMuIE5CICEhICovDQorI2RlZmluZSBUWF9CVUZfU0laRSAgRVRIX01UVSAgIC8qIG11c3QgYmUgc2FtZSBhcyBpbiBwa3RfcngqLiogKi8NCisNCisjaWZkZWYgX19ISUdIQ19fDQorI3ByYWdtYSBPZmYoQWxpZ25fbWVtYmVycykNCisjZWxzZQ0KKyNwcmFnbWEgcGFjaygxKQ0KKyNlbmRpZg0KKw0KK3R5cGVkZWYgZW51bSAgeyAgICAgICAgICAgICAgICAvKiBQYWNrZXQtZHJpdmVyIGNsYXNzZXMgKi8NCisgICAgICAgIFBEX0VUSEVSICAgICAgPSAxLA0KKyAgICAgICAgUERfUFJPTkVUMTAgICA9IDIsDQorICAgICAgICBQRF9JRUVFODAyNSAgID0gMywNCisgICAgICAgIFBEX09NTklORVQgICAgPSA0LA0KKyAgICAgICAgUERfQVBQTEVUQUxLICA9IDUsDQorICAgICAgICBQRF9TTElQICAgICAgID0gNiwNCisgICAgICAgIFBEX1NUQVJUTEFOICAgPSA3LA0KKyAgICAgICAgUERfQVJDTkVUICAgICA9IDgsDQorICAgICAgICBQRF9BWDI1ICAgICAgID0gOSwNCisgICAgICAgIFBEX0tJU1MgICAgICAgPSAxMCwNCisgICAgICAgIFBEX0lFRUU4MDIzXzIgPSAxMSwNCisgICAgICAgIFBEX0ZEREk4MDIyICAgPSAxMiwNCisgICAgICAgIFBEX1gyNSAgICAgICAgPSAxMywNCisgICAgICAgIFBEX0xBTnN0YXIgICAgPSAxNCwNCisgICAgICAgIFBEX1BQUCAgICAgICAgPSAxOA0KKyAgICAgIH0gUEtUX0NMQVNTOw0KKw0KK3R5cGVkZWYgZW51bSAgeyAgICAgICAgICAgICAvKiBQYWNrZXQtZHJpdmVyIHJlY2VpdmUgbW9kZXMgICAgKi8NCisgICAgICAgIFBEUlhfT0ZGICAgID0gMSwgICAgLyogdHVybiBvZmYgcmVjZWl2ZXIgICAgICAgICAgICAgICovDQorICAgICAgICBQRFJYX0RJUkVDVCwgICAgICAgIC8qIHJlY2VpdmUgb25seSB0byB0aGlzIGludGVyZmFjZSAqLw0KKyAgICAgICAgUERSWF9CUk9BRENBU1QsICAgICAvKiBESVJFQ1QgKyBicm9hZGNhc3QgcGFja2V0cyAgICAgKi8NCisgICAgICAgIFBEUlhfTVVMVElDQVNUMSwgICAgLyogQlJPQURDQVNUICsgbGltaXRlZCBtdWx0aWNhc3QgICovDQorICAgICAgICBQRFJYX01VTFRJQ0FTVDIsICAgIC8qIEJST0FEQ0FTVCArIGFsbCBtdWx0aWNhc3QgICAgICAqLw0KKyAgICAgICAgUERSWF9BTExfUEFDS0VUUywgICAvKiByZWNlaXZlIGFsbCBwYWNrZXRzIG9uIG5ldHdvcmsgKi8NCisgICAgICB9IFBLVF9SWF9NT0RFOw0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisgICAgICAgIGNoYXIgdHlwZVs4XTsNCisgICAgICAgIGNoYXIgbGVuOw0KKyAgICAgIH0gUEtUX0ZSQU1FOw0KKw0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisgICAgICAgIEJZVEUgIGNsYXNzOyAgICAgICAgLyogPSAxIGZvciBERUMvSW50ZXJsL1hlcm94IEV0aGVybmV0ICovDQorICAgICAgICBCWVRFICBudW1iZXI7ICAgICAgIC8qID0gMCBmb3Igc2luZ2xlIExBTiBhZGFwdGVyICAgICAgICAqLw0KKyAgICAgICAgV09SRCAgdHlwZTsgICAgICAgICAvKiA9IDEzIGZvciAzQzUyMyAgICAgICAgICAgICAgICAgICAgKi8NCisgICAgICAgIEJZVEUgIGZ1bmNzOyAgICAgICAgLyogQmFzaWMvRXh0ZW5kZWQvSGlQZXJmIGZ1bmN0aW9ucyAgICovDQorICAgICAgICBXT1JEICBpbnRyOyAgICAgICAgIC8qIHVzZXIgaW50ZXJydXB0IHZlY3RvciBudW1iZXIgICAgICAqLw0KKyAgICAgICAgV09SRCAgaGFuZGxlOyAgICAgICAvKiBIYW5kbGUgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gICAgKi8NCisgICAgICAgIEJZVEUgIG5hbWUgWzE1XTsgICAgLyogTmFtZSBvZiBhZGFwdGVyIGludGVyZmFjZSxpZS4zQzUyMyovDQorICAgICAgICBCT09MICBxdWlldDsgICAgICAgIC8qIChkb24ndCkgcHJpbnQgZXJyb3JzIHRvIHN0ZG91dCAgICAqLw0KKyAgICAgICAgY29uc3QgY2hhciAqZXJyb3I7ICAvKiBhZGRyZXNzIG9mIGVycm9yIHN0cmluZyAgICAgICAgICAgKi8NCisgICAgICAgIEJZVEUgIG1halZlcjsgICAgICAgLyogTWFqb3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIHZlci4gICovDQorICAgICAgICBCWVRFICBtaW5WZXI7ICAgICAgIC8qIE1pbm9yIGRyaXZlciBpbXBsZW1lbnRhdGlvbiB2ZXIuICAqLw0KKyAgICAgICAgQllURSAgZHVtbXlMZW47ICAgICAvKiBsZW5ndGggb2YgZm9sbG93aW5nIGRhdGEgICAgICAgICAgKi8NCisgICAgICAgIFdPUkQgIE1BQ2xlbmd0aDsgICAgLyogSGlQZXJmb3JtYW5jZSBkYXRhLCBOL0EgICAgICAgICAgICovDQorICAgICAgICBXT1JEICBNVFU7ICAgICAgICAgIC8qIEhpUGVyZm9ybWFuY2UgZGF0YSwgTi9BICAgICAgICAgICAqLw0KKyAgICAgICAgV09SRCAgbXVsdGljYXN0OyAgICAvKiBIaVBlcmZvcm1hbmNlIGRhdGEsIE4vQSAgICAgICAgICAgKi8NCisgICAgICAgIFdPUkQgIHJjdnJCdWZmZXJzOyAgLyogdmFsaWQgZm9yICAgICAgICAgICAgICAgICAgICAgICAgICovDQorICAgICAgICBXT1JEICBVTVRidWZzOyAgICAgIC8qICAgSGlnaCBQZXJmb3JtYW5jZSBkcml2ZXJzIG9ubHkgICAqLw0KKyAgICAgICAgV09SRCAgcG9zdEVPSWludHI7ICAvKiAgICAgICAgICAgICAgICAgIFVzYWdlID8/ICAgICAgICAgKi8NCisgICAgICB9IFBLVF9JTkZPOw0KKw0KKyNkZWZpbmUgUEtUX1BBUkFNX1NJWkUgIDE0ICAgIC8qIG1lbWJlcnMgbWFqVmVyIC0gcG9zdEVPSWludHIgKi8NCisNCisNCit0eXBlZGVmIHN0cnVjdCB7DQorICAgICAgICBEV09SRCBpblBhY2tldHM7ICAgICAgICAgIC8qICMgb2YgcGFja2V0cyByZWNlaXZlZCAgICAqLw0KKyAgICAgICAgRFdPUkQgb3V0UGFja2V0czsgICAgICAgICAvKiAjIG9mIHBhY2tldHMgdHJhbnNtaXR0ZWQgKi8NCisgICAgICAgIERXT1JEIGluQnl0ZXM7ICAgICAgICAgICAgLyogIyBvZiBieXRlcyByZWNlaXZlZCAgICAgICovDQorICAgICAgICBEV09SRCBvdXRCeXRlczsgICAgICAgICAgIC8qICMgb2YgYnl0ZXMgdHJhbnNtaXR0ZWQgICAqLw0KKyAgICAgICAgRFdPUkQgaW5FcnJvcnM7ICAgICAgICAgICAvKiAjIG9mIHJlY2VwdGlvbiBlcnJvcnMgICAgKi8NCisgICAgICAgIERXT1JEIG91dEVycm9yczsgICAgICAgICAgLyogIyBvZiB0cmFuc21pc3Npb24gZXJyb3JzICovDQorICAgICAgICBEV09SRCBsb3N0OyAgICAgICAgICAgICAgIC8qICMgb2YgcGFja2V0cyBsb3N0IChSWCkgICAqLw0KKyAgICAgIH0gUEtUX1NUQVQ7DQorICAgICAgICAgICAgICAgICAgIA0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisgICAgICAgIEVUSEVSIGRlc3RpbjsNCisgICAgICAgIEVUSEVSIHNvdXJjZTsNCisgICAgICAgIFdPUkQgIHByb3RvOw0KKyAgICAgICAgQllURSAgZGF0YSBbVFhfQlVGX1NJWkVdOw0KKyAgICAgIH0gVFhfRUxFTUVOVDsNCisNCit0eXBlZGVmIHN0cnVjdCB7DQorICAgICAgICBXT1JEICBmaXJzdENvdW50OyAgICAgICAgIC8qICMgb2YgYnl0ZXMgb24gMXN0ICAgICAgICAgKi8NCisgICAgICAgIFdPUkQgIHNlY29uZENvdW50OyAgICAgICAgLyogYW5kIDJuZCB1cGNhbGwgICAgICAgICAgICAqLw0KKyAgICAgICAgV09SRCAgaGFuZGxlOyAgICAgICAgICAgICAvKiBpbnN0YW5jZSB0aGF0IHVwY2FsbGVkICAgICovDQorICAgICAgICBFVEhFUiBkZXN0aW47ICAgICAgICAgICAgIC8qIEUtbmV0IGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8NCisgICAgICAgIEVUSEVSIHNvdXJjZTsgICAgICAgICAgICAgLyogRS1uZXQgc291cmNlIGFkZHJlc3MgICAgICAqLw0KKyAgICAgICAgV09SRCAgcHJvdG87ICAgICAgICAgICAgICAvKiBwcm90b2NvbCBudW1iZXIgICAgICAgICAgICovDQorICAgICAgICBCWVRFICBkYXRhIFtSWF9CVUZfU0laRV07DQorICAgICAgfSBSWF9FTEVNRU5UOw0KKw0KKw0KKyNpZmRlZiBfX0hJR0hDX18NCisjcHJhZ21hIHBvcChBbGlnbl9tZW1iZXJzKQ0KKyNlbHNlDQorI3ByYWdtYSBwYWNrKCkNCisjZW5kaWYNCisNCisNCisvKg0KKyAqIFByb3RvdHlwZXMgZm9yIHB1YmxpY3MNCisgKi8NCisNCisjaWZkZWYgX19jcGx1c3BsdXMNCitleHRlcm4gIkMiIHsNCisjZW5kaWYNCisNCitleHRlcm4gUEtUX1NUQVQgICAgcGt0U3RhdDsgICAgIC8qIHN0YXRpc3RpY3MgZm9yIHBhY2tldHMgKi8NCitleHRlcm4gUEtUX0lORk8gICAgcGt0SW5mbzsgICAgIC8qIHBhY2tldC1kcml2ZXIgaW5mb3JtYXRpb24gKi8NCisNCitleHRlcm4gUEtUX1JYX01PREUgcmVjZWl2ZU1vZGU7DQorZXh0ZXJuIEVUSEVSICAgICAgIG15QWRkcmVzcywgZXRoQnJvYWRjYXN0Ow0KKw0KK2V4dGVybiBCT09MICBQa3RJbml0RHJpdmVyIChQS1RfUlhfTU9ERSBtb2RlKTsNCitleHRlcm4gQk9PTCAgUGt0RXhpdERyaXZlciAodm9pZCk7DQorDQorZXh0ZXJuIGNvbnN0IGNoYXIgKlBrdEdldEVycm9yU3RyICAgIChpbnQgZXJyTnVtKTsNCitleHRlcm4gY29uc3QgY2hhciAqUGt0R2V0Q2xhc3NOYW1lICAgKFdPUkQgY2xhc3MpOw0KK2V4dGVybiBjb25zdCBjaGFyICpQa3RSWG1vZGVTdHIgICAgICAoUEtUX1JYX01PREUgbW9kZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFNlYXJjaERyaXZlciAgICh2b2lkKTsNCitleHRlcm4gaW50ICAgICAgICAgUGt0UmVjZWl2ZSAgICAgICAgKEJZVEUgKmJ1ZiwgaW50IG1heCk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFRyYW5zbWl0ICAgICAgIChjb25zdCB2b2lkICpldGgsIGludCBsZW4pOw0KK2V4dGVybiBEV09SRCAgICAgICBQa3RSeERyb3BwZWQgICAgICAodm9pZCk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFJlbGVhc2VIYW5kbGUgIChXT1JEIGhhbmRsZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFRlcm1pbkhhbmRsZSAgIChXT1JEIGhhbmRsZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFJlc2V0SW50ZXJmYWNlIChXT1JEIGhhbmRsZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFNldFJlY2VpdmVyTW9kZShQS1RfUlhfTU9ERSAgbW9kZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldFJlY2VpdmVyTW9kZShQS1RfUlhfTU9ERSAqbW9kZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldFN0YXRpc3RpY3MgIChXT1JEIGhhbmRsZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFNlc3NTdGF0aXN0aWNzIChXT1JEIGhhbmRsZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFJlc2V0U3RhdGlzdGljcyhXT1JEIGhhbmRsZSk7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldEFkZHJlc3MgICAgIChFVEhFUiAqYWRkcik7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdFNldEFkZHJlc3MgICAgIChjb25zdCBFVEhFUiAqYWRkcik7DQorZXh0ZXJuIEJPT0wgICAgICAgIFBrdEdldERyaXZlckluZm8gICh2b2lkKTsNCitleHRlcm4gQk9PTCAgICAgICAgUGt0R2V0RHJpdmVyUGFyYW0gKHZvaWQpOw0KK2V4dGVybiB2b2lkICAgICAgICBQa3RRdWV1ZUJ1c3kgICAgICAoQk9PTCBidXN5KTsNCitleHRlcm4gV09SRCAgICAgICAgUGt0QnVmZmVyc1VzZWQgICAgKHZvaWQpOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisjZW5kaWYgLyogX19QS1REUlZSX0ggKi8NCisNCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL21zZG9zL3JlYWRtZS5kb3MgYi9saWJwY2FwLTEuMy4wL21zZG9zL3JlYWRtZS5kb3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlZjFmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbXNkb3MvcmVhZG1lLmRvcwpAQCAtMCwwICsxLDE2MiBAQAorQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9tc2Rvcy9yZWFkbWUuZG9zLHYgMS4zIDIwMDQtMTItMTkgMTk6NDc6MDEgZ3V5IEV4cCAkIChMQkwpCisKK2xpYnBjYXAgZm9yIERPUworLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZmlsZSBjb250YWlucyBzb21lIG5vdGVzIG9uIGJ1aWxkaW5nIGFuZCB1c2luZyBsaWJwY2FwIGZvciBNUy1ET1MuCitMb29rIGluIGBSRUFETUUnIGFuZCBgcGNhcC5tYW4nIGZvciB1c2FnZSBhbmQgZGV0YWlscy4gVGhlc2UgdGFyZ2V0cyBhcmUKK3N1cHBvcnRlZDoKKworIC0gQm9ybGFuZCBDIDQuMCsgc21hbGwgb3IgbGFyZ2UgbW9kZWwuCisgLSBNZXRhd2FyZSBIaWdoQyAzLjErIHdpdGggUGhhckxhcCBET1MtZXh0ZW5kZXIKKyAtIEdOVSBDIDIuNysgd2l0aCBkamdwcCAyLjAxKyBET1MgZXh0ZW5kZXIKKyAtIFdhdGNvbSBDIDExLnggd2l0aCBET1M0R1cgZXh0ZW5kZXIKKworTm90ZTogdGhlIGZpbGVzIGluIHRoZSBsaWJwY2FwLnppcCBjb250YWlucyBzaG9ydCB0cnVjYXRlZCBmaWxlbmFtZXMuCisgIFNvIGZvciBkamdwcCB0byB3b3JrIHdpdGggdGhlc2UsIGRpc2FibGUgdGhlIHVzZSBvZiBsb25nIGZpbGUgbmFtZXMgYnkKKyAgc2V0dGluZyAiTEZOPW4iIGluIHRoZSBlbnZpcm9ubWVudC4KKworRmlsZXMgc3BlY2lmaWMgdG8gRE9TIGFyZSBwY2FwLWRvcy5bY2hdIGFuZCB0aGUgYXNzZW1ibHkgYW5kIEMgZmlsZXMgaW4KK3RoZSBNU0RPUyBzdWItZGlyZWN0b3J5LiBSZW1lbWJlciB0byBidWlsdCBsaXBjYXAgbGlicmFyaWVzIGZyb20gdGhlIHRvcAoraW5zdGFsbCBkaXJlY3RvcnkuIEFuZCBub3QgZnJvbSB0aGUgTVNET1Mgc3ViLWRpcmVjdG9yeS4KKworTm90ZSBmb3IgZGpncHAgdXNlcnM6CisgIElmIHlvdSBnb3QgdGhlIGxpYnBjYXAgZnJvbSB0aGUgb2ZmaWNpYWwgc2l0ZSB3d3cudGNwZHVtcCwgdGhlbiB0aGF0CisgIGRpc3RyaWJ1dGlvbiBkb2VzIE5PVCBjb250YWluIGFueSBzb3VyY2VzIGZvciBidWlsZGluZyAzMi1iaXQgZHJpdmVycy4KKyAgSW5zdGVhZCBnZXQgdGhlIGZ1bGwgdmVyc2lvbiBhdAorICAgICBodHRwOi8vd3d3LmJnbmV0dC5uby9+Z2l2YS9wY2FwL2xpYnBjYXAuemlwCisKKyAgYW5kIHNldCAiVVNFXzMyQklUX0RSSVZFUlMgPSAxIiBpbiBtc2Rvc1xjb21tb24uZGouCisKKworCitSZXF1aXJlbWVudHMKKy0tLS0tLS0tLS0tLQorCitET1MtbGlicGNhcCBjdXJyZW50bHkgb25seSB3b3JrcyByZWxpYWJseSB3aXRoIGEgcmVhbC1tb2RlIEV0aGVybmV0IHBhY2tldC0KK2RyaXZlci4gVGhpcyBkcml2ZXIgbXVzdCBiZSBpbnN0YWxsZWQgcHJpb3IgdG8gdXNpbmcgYW55IHByb2dyYW0gKGUuZy4KK3RjcGR1bXApIGNvbXBpbGVkIHdpdGggbGlicGNhcC4gV29yayBpcyB1bmRlcndheSB0byBpbXBsZW1lbnQgcHJvdGVjdGVkLQorbW9kZSBkcml2ZXJzIGZvciAzMi1iaXQgdGFyZ2V0cyAoZGpncHAgb25seSkuIFRoZSAzQ29tIDNjNTA5IGRyaXZlciBpcword29ya2luZyBhbG1vc3QgcGVyZmVjdGx5LiBEdWUgdG8gbGFjayBvZiBMQU4tY2FyZHMsIEkndmUgbm90IGhhZCB0aGUKK29wcG9ydHVuaXR5IHRvIHRlc3Qgb3RoZXIgZHJpdmVycy4gVGhlc2UgMzItYml0IGRyaXZlcnMgYXJlIG1vZGlmaWVkCitMaW51eCBkcml2ZXJzLgorCisKK1JlcXVpcmVkIHBhY2thZ2VzCistLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIHBhY2thZ2VzIGFuZCB0b29scyBtdXN0IGJlIHByZXNlbnQgZm9yIGFsbCB0YXJnZXRzLgorCisxLiBXYXR0LTMyIHRjcC9pcCBsaWJyYXJ5LiBUaGlzIGxpYnJhcnkgaXMgKm5vdCogdXNlZCB0byBzZW5kIG9yCisgICByZWNlaXZlIG5ldHdvcmsgZGF0YS4gSXQncyBtb3N0bHkgdXNlZCB0byBhY2Nlc3MgdGhlICdob3N0cycKKyAgIGZpbGUgYW5kIG90aGVyIDxuZXRkYi5oPiBmZWF0dXJlcy4gR2V0ICd3YXR0MzJzKi56aXAnIGF0OgorCisgICAgIGh0dHA6Ly93d3cuYmduZXR0Lm5vL35naXZhLworCisyLiBFeGNlcHRpb24gaGFuZGxlciBhbmQgZGlzYXNzZW1iZXIgbGlicmFyeSAobGliZXhjLmEpIGlzIG5lZWRlZCBpZgorICAgIlVTRV9FWENFUFQgPSAxIiBpbiBjb21tb24uZGouIEF2YWlsYWJsZSBhdDoKKworICAgICBodHRwOi8vd3d3LmJnbmV0dC5uby9+Z2l2YS9taXNjL2V4Y19keDA3LnppcAorCiszLiBGbGV4ICYgQmlzb24gaXMgdXNlZCB0byBnZW5lcmF0ZSBwYXJzZXIgZm9yIHRoZSBmaWx0ZXIgaGFuZGxlcgorICAgcGNhcF9jb21waWxlOgorCisgICAgIGZ0cDovL2Z0cC5zaW10ZWwubmV0L3B1Yi9zaW10ZWxuZXQvZ251L2RqZ3BwL3YyZ251L2ZseDI1NGIuemlwCisgICAgIGZ0cDovL2Z0cC5zaW10ZWwubmV0L3B1Yi9zaW10ZWxuZXQvZ251L2RqZ3BwL3YyZ251L2JzbjEyOGIuemlwCisKKzQuIE5BU00gYXNzZW1ibGVyIHYgMC45OCBvciBsYXRlciBpcyByZXF1aXJlZCB3aGVuIGJ1aWxkaW5nIGRqZ3BwIGFuZAorICAgV2F0Y29tIHRhcmdldHM6CisKKyAgICAgZnRwOi8vZnRwLnNpbXRlbC5uZXQvcHViL3NpbXRlbG5ldC9nbnUvZGpncHAvdjJ0ay9uYXNtMDk4cC56aXAKKworNS4gc2VkIChTdHJlYW0gRWRpdG9yKSBpcyByZXF1aXJlZCBmb3IgZG9pbmcgYG1ha2UgZGVwZW5kJy4KKyAgIEl0J3MgYXZhaWxhYmxlIGF0CisgICAgIGZ0cDovL2Z0cC5zaW10ZWwubmV0L3B1Yi9zaW10ZWxuZXQvZ251L2RqZ3BwL3YyZ251L3NlZCouemlwCisKKyAgIEEgdG91Y2ggdG9vbCB0byB1cGRhdGUgdGhlIHRpbWUtc3RhbXAgb2YgYSBmaWxlLiBFLmcuCisgICAgIGZ0cDovL2Z0cC5zaW10ZWwubmV0L3B1Yi9zaW10ZWxuZXQvZ251L2RqZ3BwL3YyZ251L2dyZXAqLnppcAorCis2LiBGb3IgZGpncHAgcm0uZXhlIGFuZCBjcC5leGUgYXJlIHJlcXVpcmVkLiBUaGVzZSBzaG91bGQgYWxyZWFkeSBiZQorICAgcGFydCBvZiB5b3VyIGRqZ3BwIGluc3RhbGxhdGlvbi4gQWxzbyByZXF1aXJlZCAoZXhwZXJpbWVudGFsIGF0IHRoZQorICAgdGltZSkgZm9yIGRqZ3BwIGlzIERMWCAyLjkxIG9yIGxhdGVyLiBUaGlzIHRvb2wgaXMgZm9yIHRoZSBnZW5lcmF0aW9uCisgICBvZiBkeW5hbWljYWxseSBsb2FkYWJsZSBtb2R1bGVzLgorCisKK0NvbXBpbGluZyBsaWJwY2FwCistLS0tLS0tLS0tLS0tLS0tLQorCitGb2xsb3cgdGhlc2Ugc3RlcHMgaW4gYnVpbGRpbmcgbGlicGNhcDoKKworMS4gTWFrZSBzdXJlIHlvdSd2ZSBpbnN0YWxsZWQgV2F0dC0zMiBwcm9wZXJseSAoc2VlIGl0J3MgYElOU1RBTEwnIGZpbGUpLgorICAgRHVyaW5nIHRoYXQgaW5zdGFsbGF0aW9uIGEgZW52aXJvbm1lbnQgdmFyaWFibGUgYFdBVFRfUk9PVCcgaXMgc2V0LgorICAgVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGZvciBidWlsZGluZyBsaWJwY2FwIGFsc28gKGBXQVRUX0lOQycgaXMKKyAgIGRlZHVjdGVkIGZyb20gYFdBVFRfUk9PVCcpLiBkamdwcCB1c2VycyBzaG91bGQgYWxzbyBkZWZpbmUgZW52aXJvbm1lbnQKKyAgIHZhcmlhYmxlcyBgQ19JTkNMVURFX1BBVEgnIGFuZCBgTElCUkFSWV9QQVRIJyB0byBwb2ludCB0byB0aGUgaW5jbHVkZQorICAgZGlyZWN0b3J5IGFuZCBsaWJyYXJ5IGRpcmVjdG9yeSByZXNwZWN0aXZlbHkuICBFLmcuIHB1dCB0aGlzIGluIHlvdXIKKyAgIEFVVE9FWEVDLkJBVDoKKyAgICAgc2V0IENfSU5DTFVERV9QQVRIPWM6L25ldC93YXR0L2luYworICAgICBzZXQgTElCUkFSWV9QQVRIPWM6L25ldC93YXR0L2xpYgorCisyLiBSZXZpc2UgdGhlIG1zZG9zL2NvbW1vbi5kaiBmaWxlIGZvciB5b3VyIGRqZ3BwL2djYyBpbnN0YWxsYXRpb247CisgICAtIGNoYW5nZSB0aGUgdmFsdWUgb2YgYEdDQ0xJQicgdG8gbWF0Y2ggbG9jYXRpb24gb2YgbGliZ2NjLmEuCisgICAtIHNldCBgVVNFXzMyQklUX0RSSVZFUlMgPSAxJyB0byBidWlsZCAzMi1iaXQgZHJpdmVyIG9iamVjdHMuCisKKworMy4gQnVpbGQgcGNhcCBieSB1c2luZyBhcHByb3ByaWF0ZSBtYWtlZmlsZS4gRm9yIGRqZ3BwLCB1c2U6CisgICAgIGBtYWtlIC1mIG1zZG9zL21ha2VmaWxlLmRqJyAgKGkuZS4gR05VIGBtYWtlJykKKworICAgRm9yIGEgV2F0Y29tIHRhcmdldCBzYXk6CisgICAgIGB3bWFrZSAtZiBtc2Rvc1xtYWtlZmlsZS53YycKKworICAgRm9yIGEgQm9ybGFuZCB0YXJnZXQgc2F5OgorICAgICBgbWFrZXIgLWYgbXNkb3NcTWFrZWZpbGUgcGNhcF9iYy5saWInICAoQm9ybGFuZCdzIGBtYWtlci5leGUnKQorCisgICBBbmQgZm9yIGEgSGlnaEMvUGhhcmxhcCB0YXJnZXQgc2F5OgorICAgICBgbWFrZXIgLWYgbXNkb3NcTWFrZWZpbGUgcGNhcF9oYy5saWInICAoQm9ybGFuZCdzIGBtYWtlci5leGUnKQorCisgICBZb3UgbWlnaHQgbGlrZSB0byBjaGFuZ2Ugc29tZSBgQ0ZMQUdTJyAtLSBvbmx5IGBERUJVRycgZGVmaW5lIGN1cnJlbnRseQorICAgaGF2ZSBhbnkgZWZmZWN0LiBJdCBzaG93cyBhIHJvdGF0aW5nICJmYW4iIGluIHVwcGVyIHJpZ2h0IGNvcm5lciBvZgorICAgc2NyZWVuLiAgUmVtb3ZlIGBERUJVRycgaWYgeW91IGRvbid0IGxpa2UgaXQuIFlvdSBjb3VsZCBhZGQKKyAgIGAtZm9taXQtZnJhbWUtcG9pbnRlcicgdG8gYENGTEFHUycgdG8gc3BlZWQgdXAgdGhlIGdlbmVyYXRlZCBjb2RlLgorICAgQnV0IG5vdGUsIHRoaXMgbWFrZXMgZGVidWdnaW5nIGFuZCBjcmFzaC10cmFjZWJhY2sgZGlmZmljdWx0LiBPbmx5CisgICBhZGQgaXQgaWYgeW91J3JlIGZ1bGx5IGNvbmZpZGVudCB5b3VyIGFwcGxpY2F0aW9uIGlzIDEwMCUgc3RhYmxlLgorCisgICBOb3RlOiBDb2RlIGluIGBVU0VfTkRJUzInIGRvZXMgbm90IHdvcmsgYXQgdGhlIG1vbWVudC4KKworNC4gVGhlIHJlc3VsdGluZyBsaWJyYXJpZXMgYXJlIHB1dCBpbiBjdXJyZW50IGRpcmVjdG9yeS4gVGhlcmUncyBubworICAgdGVzdC1wcm9ncmFtIGZvciBgbGlicGNhcCcuIExpbmtpbmcgdGhlIGxpYnJhcnkgd2l0aCBgdGNwZHVtcCcgaXMKKyAgIHRoZSB1bHRpbWF0ZSB0ZXN0IGFueXdheS4KKworCisKK0V4dGVuc2lvbnMgdG8gbGlicGNhcAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0kndmUgaW5jbHVkZWQgc29tZSBleHRyYSBmdW5jdGlvbnMgdG8gRE9TLWxpYnBjYXA6CisKKyAgYHBjYXBfY29uZmlnX2hvb2sgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKScgCisKKyAgICBBbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gc2V0IHZhbHVlcyBvZiBpbnRlcm5hbCBsaWJwY2FwIHZhcmlhYmxlcy4KKyAgICBgbmFtZScgaXMgdHlwaWNhbGx5IGEgbGVmdC1zaWRlIGtleXdvcmQgd2l0aCBhbiBhc3NvY2lhdGVkIGB2YWx1ZScKKyAgICB0aGF0IGlzIGNhbGxlZCBmcm9tIGFwcGxpY2F0aW9uJ3MgY29uZmlndXJlIHByb2Nlc3MgKHNlZSB0Y3BkdW1wJ3MKKyAgICBjb25maWcuYyBmaWxlKS4gbGlicGNhcCBrZWVwcyBhIHNldCBvZiB0YWJsZXMgdGhhdCBhcmUgc2VhcmNoZWQgZm9yCisgICAgYSBuYW1lL3ZhbHVlIG1hdGNoLiBDdXJyZW50bHkgb25seSB1c2VkIHRvIHNldCBkZWJ1Zy1sZXZlbHMgYW5kCisgICAgcGFyYW1ldGVycyBmb3IgdGhlIDMyLWJpdCBuZXR3b3JrIGRyaXZlcnMuCisKKyAgYHBjYXBfc2V0X3dhaXQgKHBjYXBfdCAqLCB2b2lkICgqKSh2b2lkKSwgaW50KScgOgorCisgICAgT25seSBlZmZlY3RpdmUgd2hlbiByZWFkaW5nIG9mZmxpbmUgdHJhZmZpYyBmcm9tIGR1bXAtZmlsZXMuCisgICAgRnVuY3Rpb24gYHBjYXBfb2ZmbGluZV9yZWFkKCknIHdpbGwgd2FpdCAoYW5kIG9wdGlvbmFsbHkgeWllbGQpCisgICAgYmVmb3JlIHByaW50aW5nIG5leHQgcGFja2V0LiBUaGlzIHdpbGwgc2ltdWxhdGUgdGhlIHBhY2UgdGhlIHBhY2tldHMKKyAgICB3aGVyZSBhY3R1YWxseSByZWNvcmRlZC4KKworCisKK0hhcHB5IHNuaWZmaW5nICEKKworCitHaXNsZSBWYW5lbSA8Z2l2YUBiZ25ldHQubm8+CisgICAgICAgICAgICA8Z3ZhbmVtQGJyb2FkcGFyay5ubz4KKworT2N0b2JlciAxOTk5LCAyMDA0CisKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvbmFtZXRvYWRkci5jIGIvbGlicGNhcC0xLjMuMC9uYW1ldG9hZGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzNWU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvbmFtZXRvYWRkci5jCkBAIC0wLDAgKzEsNTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogTmFtZSB0byBpZCB0cmFuc2xhdGlvbiByb3V0aW5lcyB1c2VkIGJ5IHRoZSBzY2FubmVyLgorICogVGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgdGltZSBjcml0aWNhbC4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9uYW1ldG9hZGRyLmMsdiAxLjgzIDIwMDgtMDItMDYgMTA6MjE6MzAgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBERUNORVRMSUIKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRkbmV0L2RuZXRkYi5oPgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisKKyNlbHNlIC8qIFdJTjMyICovCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCQkJLyogY29uY2Vzc2lvbiB0byBBSVggKi8KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaWZuZGVmIFdJTjMyCisjaWZkZWYgSEFWRV9FVEhFUl9IT1NUVE9OCisvKgorICogWFhYIC0gZG8gd2UgbmVlZCBhbnkgb2YgdGhpcyBpZiA8bmV0aW5ldC9pZl9ldGhlci5oPiBkb2Vzbid0IGRlY2xhcmUKKyAqIGV0aGVyX2hvc3R0b24oKT8KKyAqLworI2lmZGVmIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9ICitzdHJ1Y3QgbWJ1ZjsJCS8qIFNxdWVsY2ggY29tcGlsZXIgd2FybmluZ3Mgb24gc29tZSBwbGF0Zm9ybXMgZm9yICovCitzdHJ1Y3QgcnRlbnRyeTsJCS8qIGRlY2xhcmF0aW9ucyBpbiA8bmV0L2lmLmg+ICovCisjaW5jbHVkZSA8bmV0L2lmLmg+CS8qIGZvciAic3RydWN0IGlmbmV0IiBpbiAic3RydWN0IGFycGNvbSIgb24gU29sYXJpcyAqLworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKyNlbmRpZiAvKiBIQVZFX05FVElORVRfSUZfRVRIRVJfSCAqLworI2lmZGVmIE5FVElORVRfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9IT1NUVE9OCisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2VuZGlmIC8qIE5FVElORVRfRVRIRVJfSF9ERUNMQVJFU19FVEhFUl9IT1NUVE9OICovCisjZW5kaWYgLyogSEFWRV9FVEhFUl9IT1NUVE9OICovCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSAiZ2VuY29kZS5oIgorI2luY2x1ZGUgPHBjYXAvbmFtZWRiLmg+CisKKyNpZmRlZiBIQVZFX09TX1BST1RPX0gKKyNpbmNsdWRlICJvcy1wcm90by5oIgorI2VuZGlmCisKKyNpZm5kZWYgTlRPSEwKKyNkZWZpbmUgTlRPSEwoeCkgKHgpID0gbnRvaGwoeCkKKyNkZWZpbmUgTlRPSFMoeCkgKHgpID0gbnRvaHMoeCkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCB4ZHRvaShpbnQpOworCisvKgorICogIENvbnZlcnQgaG9zdCBuYW1lIHRvIGludGVybmV0IGFkZHJlc3MuCisgKiAgUmV0dXJuIDAgdXBvbiBmYWlsdXJlLgorICovCiticGZfdV9pbnQzMiAqKgorcGNhcF9uYW1ldG9hZGRyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisjaWZuZGVmIGhfYWRkcgorCXN0YXRpYyBicGZfdV9pbnQzMiAqaGxpc3RbMl07CisjZW5kaWYKKwlicGZfdV9pbnQzMiAqKnA7CisJc3RydWN0IGhvc3RlbnQgKmhwOworCisJaWYgKChocCA9IGdldGhvc3RieW5hbWUobmFtZSkpICE9IE5VTEwpIHsKKyNpZm5kZWYgaF9hZGRyCisJCWhsaXN0WzBdID0gKGJwZl91X2ludDMyICopaHAtPmhfYWRkcjsKKwkJTlRPSEwoaHAtPmhfYWRkcik7CisJCXJldHVybiBobGlzdDsKKyNlbHNlCisJCWZvciAocCA9IChicGZfdV9pbnQzMiAqKilocC0+aF9hZGRyX2xpc3Q7ICpwOyArK3ApCisJCQlOVE9ITCgqKnApOworCQlyZXR1cm4gKGJwZl91X2ludDMyICoqKWhwLT5oX2FkZHJfbGlzdDsKKyNlbmRpZgorCX0KKwllbHNlCisJCXJldHVybiAwOworfQorCisjaWZkZWYgSU5FVDYKK3N0cnVjdCBhZGRyaW5mbyAqCitwY2FwX25hbWV0b2FkZHJpbmZvKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzOworCWludCBlcnJvcjsKKworCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCWhpbnRzLmFpX2ZhbWlseSA9IFBGX1VOU1BFQzsKKwloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwkvKm5vdCByZWFsbHkqLworCWhpbnRzLmFpX3Byb3RvY29sID0gSVBQUk9UT19UQ1A7CS8qbm90IHJlYWxseSovCisJZXJyb3IgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludHMsICZyZXMpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIE5VTEw7CisJZWxzZQorCQlyZXR1cm4gcmVzOworfQorI2VuZGlmIC8qSU5FVDYqLworCisvKgorICogIENvbnZlcnQgbmV0IG5hbWUgdG8gaW50ZXJuZXQgYWRkcmVzcy4KKyAqICBSZXR1cm4gMCB1cG9uIGZhaWx1cmUuCisgKi8KK2JwZl91X2ludDMyCitwY2FwX25hbWV0b25ldGFkZHIoY29uc3QgY2hhciAqbmFtZSkKK3sKKyNpZm5kZWYgV0lOMzIKKwlzdHJ1Y3QgbmV0ZW50ICpucDsKKworCWlmICgobnAgPSBnZXRuZXRieW5hbWUobmFtZSkpICE9IE5VTEwpCisJCXJldHVybiBucC0+bl9uZXQ7CisJZWxzZQorCQlyZXR1cm4gMDsKKyNlbHNlCisJLyoKKwkgKiBUaGVyZSdzIG5vICJnZXRuZXRieW5hbWUoKSIgb24gV2luZG93cy4KKwkgKi8KKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisvKgorICogQ29udmVydCBhIHBvcnQgbmFtZSB0byBpdHMgcG9ydCBhbmQgcHJvdG9jb2wgbnVtYmVycy4KKyAqIFdlIGFzc3VtZSBvbmx5IFRDUCBvciBVRFAuCisgKiBSZXR1cm4gMCB1cG9uIGZhaWx1cmUuCisgKi8KK2ludAorcGNhcF9uYW1ldG9wb3J0KGNvbnN0IGNoYXIgKm5hbWUsIGludCAqcG9ydCwgaW50ICpwcm90bykKK3sKKwlzdHJ1Y3Qgc2VydmVudCAqc3A7CisJaW50IHRjcF9wb3J0ID0gLTE7CisJaW50IHVkcF9wb3J0ID0gLTE7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gY2hlY2sgL2V0Yy9zZXJ2aWNlcyBmb3IgYW1iaWd1b3VzIGVudHJpZXMuCisJICogSWYgd2UgZmluZCB0aGUgYW1iaWd1b3VzIGVudHJ5LCBhbmQgaXQgaGFzIHRoZQorCSAqIHNhbWUgcG9ydCBudW1iZXIsIGNoYW5nZSB0aGUgcHJvdG8gdG8gUFJPVE9fVU5ERUYKKwkgKiBzbyBib3RoIFRDUCBhbmQgVURQIHdpbGwgYmUgY2hlY2tlZC4KKwkgKi8KKwlzcCA9IGdldHNlcnZieW5hbWUobmFtZSwgInRjcCIpOworCWlmIChzcCAhPSBOVUxMKSB0Y3BfcG9ydCA9IG50b2hzKHNwLT5zX3BvcnQpOworCXNwID0gZ2V0c2VydmJ5bmFtZShuYW1lLCAidWRwIik7CisJaWYgKHNwICE9IE5VTEwpIHVkcF9wb3J0ID0gbnRvaHMoc3AtPnNfcG9ydCk7CisJaWYgKHRjcF9wb3J0ID49IDApIHsKKwkJKnBvcnQgPSB0Y3BfcG9ydDsKKwkJKnByb3RvID0gSVBQUk9UT19UQ1A7CisJCWlmICh1ZHBfcG9ydCA+PSAwKSB7CisJCQlpZiAodWRwX3BvcnQgPT0gdGNwX3BvcnQpCisJCQkJKnByb3RvID0gUFJPVE9fVU5ERUY7CisjaWZkZWYgbm90ZGVmCisJCQllbHNlCisJCQkJLyogQ2FuJ3QgaGFuZGxlIGFtYmlndW91cyBuYW1lcyB0aGF0IHJlZmVyCisJCQkJICAgdG8gZGlmZmVyZW50IHBvcnQgbnVtYmVycy4gKi8KKwkJCQl3YXJuaW5nKCJhbWJpZ3VvdXMgcG9ydCAlcyBpbiAvZXRjL3NlcnZpY2VzIiwKKwkJCQkJbmFtZSk7CisjZW5kaWYKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisJaWYgKHVkcF9wb3J0ID49IDApIHsKKwkJKnBvcnQgPSB1ZHBfcG9ydDsKKwkJKnByb3RvID0gSVBQUk9UT19VRFA7CisJCXJldHVybiAxOworCX0KKyNpZiBkZWZpbmVkKHVsdHJpeCkgfHwgZGVmaW5lZChfX29zZl9fKQorCS8qIFNwZWNpYWwgaGFjayBpbiBjYXNlIE5GUyBpc24ndCBpbiAvZXRjL3NlcnZpY2VzICovCisJaWYgKHN0cmNtcChuYW1lLCAibmZzIikgPT0gMCkgeworCQkqcG9ydCA9IDIwNDk7CisJCSpwcm90byA9IFBST1RPX1VOREVGOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbnZlcnQgYSBzdHJpbmcgaW4gdGhlIGZvcm0gUFBQLVBQUCwgd2hlcmUgY29ycmVzcG9uZCB0byBwb3J0cywgdG8KKyAqIGEgc3RhcnRpbmcgYW5kIGVuZGluZyBwb3J0IGluIGEgcG9ydCByYW5nZS4KKyAqIFJldHVybiAwIG9uIGZhaWx1cmUuCisgKi8KK2ludAorcGNhcF9uYW1ldG9wb3J0cmFuZ2UoY29uc3QgY2hhciAqbmFtZSwgaW50ICpwb3J0MSwgaW50ICpwb3J0MiwgaW50ICpwcm90bykKK3sKKwl1X2ludCBwMSwgcDI7CisJY2hhciAqb2ZmLCAqY3B5OworCWludCBzYXZlX3Byb3RvOworCisJaWYgKHNzY2FuZihuYW1lLCAiJWQtJWQiLCAmcDEsICZwMikgIT0gMikgeworCQlpZiAoKGNweSA9IHN0cmR1cChuYW1lKSkgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCisJCWlmICgob2ZmID0gc3RyY2hyKGNweSwgJy0nKSkgPT0gTlVMTCkgeworCQkJZnJlZShjcHkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkqb2ZmID0gJ1wwJzsKKworCQlpZiAocGNhcF9uYW1ldG9wb3J0KGNweSwgcG9ydDEsIHByb3RvKSA9PSAwKSB7CisJCQlmcmVlKGNweSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzYXZlX3Byb3RvID0gKnByb3RvOworCisJCWlmIChwY2FwX25hbWV0b3BvcnQob2ZmICsgMSwgcG9ydDIsIHByb3RvKSA9PSAwKSB7CisJCQlmcmVlKGNweSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICgqcHJvdG8gIT0gc2F2ZV9wcm90bykKKwkJCSpwcm90byA9IFBST1RPX1VOREVGOworCX0gZWxzZSB7CisJCSpwb3J0MSA9IHAxOworCQkqcG9ydDIgPSBwMjsKKwkJKnByb3RvID0gUFJPVE9fVU5ERUY7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2ludAorcGNhcF9uYW1ldG9wcm90byhjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IHByb3RvZW50ICpwOworCisJcCA9IGdldHByb3RvYnluYW1lKHN0cik7CisJaWYgKHAgIT0gMCkKKwkJcmV0dXJuIHAtPnBfcHJvdG87CisJZWxzZQorCQlyZXR1cm4gUFJPVE9fVU5ERUY7Cit9CisKKyNpbmNsdWRlICJldGhlcnR5cGUuaCIKKworc3RydWN0IGVwcm90byB7CisJY29uc3QgY2hhciAqczsKKwl1X3Nob3J0IHA7Cit9OworCisvKiBTdGF0aWMgZGF0YSBiYXNlIG9mIGV0aGVyIHByb3RvY29sIHR5cGVzLiAqLworc3RydWN0IGVwcm90byBlcHJvdG9fZGJbXSA9IHsKKwl7ICJwdXAiLCBFVEhFUlRZUEVfUFVQIH0sCisJeyAieG5zIiwgRVRIRVJUWVBFX05TIH0sCisJeyAiaXAiLCBFVEhFUlRZUEVfSVAgfSwKKyNpZmRlZiBJTkVUNgorCXsgImlwNiIsIEVUSEVSVFlQRV9JUFY2IH0sCisjZW5kaWYKKwl7ICJhcnAiLCBFVEhFUlRZUEVfQVJQIH0sCisJeyAicmFycCIsIEVUSEVSVFlQRV9SRVZBUlAgfSwKKwl7ICJzcHJpdGUiLCBFVEhFUlRZUEVfU1BSSVRFIH0sCisJeyAibW9wZGwiLCBFVEhFUlRZUEVfTU9QREwgfSwKKwl7ICJtb3ByYyIsIEVUSEVSVFlQRV9NT1BSQyB9LAorCXsgImRlY25ldCIsIEVUSEVSVFlQRV9ETiB9LAorCXsgImxhdCIsIEVUSEVSVFlQRV9MQVQgfSwKKwl7ICJzY2EiLCBFVEhFUlRZUEVfU0NBIH0sCisJeyAibGFuYnJpZGdlIiwgRVRIRVJUWVBFX0xBTkJSSURHRSB9LAorCXsgInZleHAiLCBFVEhFUlRZUEVfVkVYUCB9LAorCXsgInZwcm9kIiwgRVRIRVJUWVBFX1ZQUk9EIH0sCisJeyAiYXRhbGsiLCBFVEhFUlRZUEVfQVRBTEsgfSwKKwl7ICJhdGFsa2FycCIsIEVUSEVSVFlQRV9BQVJQIH0sCisJeyAibG9vcGJhY2siLCBFVEhFUlRZUEVfTE9PUEJBQ0sgfSwKKwl7ICJkZWNkdHMiLCBFVEhFUlRZUEVfREVDRFRTIH0sCisJeyAiZGVjZG5zIiwgRVRIRVJUWVBFX0RFQ0ROUyB9LAorCXsgKGNoYXIgKikwLCAwIH0KK307CisKK2ludAorcGNhcF9uYW1ldG9lcHJvdG8oY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgZXByb3RvICpwID0gZXByb3RvX2RiOworCisJd2hpbGUgKHAtPnMgIT0gMCkgeworCQlpZiAoc3RyY21wKHAtPnMsIHMpID09IDApCisJCQlyZXR1cm4gcC0+cDsKKwkJcCArPSAxOworCX0KKwlyZXR1cm4gUFJPVE9fVU5ERUY7Cit9CisKKyNpbmNsdWRlICJsbGMuaCIKKworLyogU3RhdGljIGRhdGEgYmFzZSBvZiBMTEMgdmFsdWVzLiAqLworc3RhdGljIHN0cnVjdCBlcHJvdG8gbGxjX2RiW10gPSB7CisJeyAiaXNvIiwgTExDU0FQX0lTT05TIH0sCisJeyAic3RwIiwgTExDU0FQXzgwMjFEIH0sCisJeyAiaXB4IiwgTExDU0FQX0lQWCB9LAorCXsgIm5ldGJldWkiLCBMTENTQVBfTkVUQkVVSSB9LAorCXsgKGNoYXIgKikwLCAwIH0KK307CisKK2ludAorcGNhcF9uYW1ldG9sbGMoY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgZXByb3RvICpwID0gbGxjX2RiOworCisJd2hpbGUgKHAtPnMgIT0gMCkgeworCQlpZiAoc3RyY21wKHAtPnMsIHMpID09IDApCisJCQlyZXR1cm4gcC0+cDsKKwkJcCArPSAxOworCX0KKwlyZXR1cm4gUFJPVE9fVU5ERUY7Cit9CisKKy8qIEhleCBkaWdpdCB0byBpbnRlZ2VyLiAqLworc3RhdGljIGlubGluZSBpbnQKK3hkdG9pKGMpCisJcmVnaXN0ZXIgaW50IGM7Cit7CisJaWYgKGlzZGlnaXQoYykpCisJCXJldHVybiBjIC0gJzAnOworCWVsc2UgaWYgKGlzbG93ZXIoYykpCisJCXJldHVybiBjIC0gJ2EnICsgMTA7CisJZWxzZQorCQlyZXR1cm4gYyAtICdBJyArIDEwOworfQorCitpbnQKK19fcGNhcF9hdG9pbihjb25zdCBjaGFyICpzLCBicGZfdV9pbnQzMiAqYWRkcikKK3sKKwl1X2ludCBuOworCWludCBsZW47CisKKwkqYWRkciA9IDA7CisJbGVuID0gMDsKKwl3aGlsZSAoMSkgeworCQluID0gMDsKKwkJd2hpbGUgKCpzICYmICpzICE9ICcuJykKKwkJCW4gPSBuICogMTAgKyAqcysrIC0gJzAnOworCQkqYWRkciA8PD0gODsKKwkJKmFkZHIgfD0gbiAmIDB4ZmY7CisJCWxlbiArPSA4OworCQlpZiAoKnMgPT0gJ1wwJykKKwkJCXJldHVybiBsZW47CisJCSsrczsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitpbnQKK19fcGNhcF9hdG9kbihjb25zdCBjaGFyICpzLCBicGZfdV9pbnQzMiAqYWRkcikKK3sKKyNkZWZpbmUgQVJFQVNISUZUIDEwCisjZGVmaW5lIEFSRUFNQVNLIDAxNzYwMDAKKyNkZWZpbmUgTk9ERU1BU0sgMDE3NzcKKworCXVfaW50IG5vZGUsIGFyZWE7CisKKwlpZiAoc3NjYW5mKHMsICIlZC4lZCIsICZhcmVhLCAmbm9kZSkgIT0gMikKKwkJYnBmX2Vycm9yKCJtYWxmb3JtZWQgZGVjbmV0IGFkZHJlc3MgJyVzJyIsIHMpOworCisJKmFkZHIgPSAoYXJlYSA8PCBBUkVBU0hJRlQpICYgQVJFQU1BU0s7CisJKmFkZHIgfD0gKG5vZGUgJiBOT0RFTUFTSyk7CisKKwlyZXR1cm4oMzIpOworfQorCisvKgorICogQ29udmVydCAncycsIHdoaWNoIGNhbiBoYXZlIHRoZSBvbmUgb2YgdGhlIGZvcm1zOgorICoKKyAqCSJ4eDp4eDp4eDp4eDp4eDp4eCIKKyAqCSJ4eC54eC54eC54eC54eC54eCIKKyAqCSJ4eC14eC14eC14eC14eC14eCIKKyAqCSJ4eHh4Lnh4eHgueHh4eCIKKyAqCSJ4eHh4eHh4eHh4eHgiCisgKgorICogKG9yIHZhcmlvdXMgbWl4ZXMgb2YgJzonLCAnLicsIGFuZCAnLScpIGludG8gYSBuZXcKKyAqIGV0aGVybmV0IGFkZHJlc3MuICBBc3N1bWVzICdzJyBpcyB3ZWxsIGZvcm1lZC4KKyAqLwordV9jaGFyICoKK3BjYXBfZXRoZXJfYXRvbihjb25zdCBjaGFyICpzKQoreworCXJlZ2lzdGVyIHVfY2hhciAqZXAsICplOworCXJlZ2lzdGVyIHVfaW50IGQ7CisKKwllID0gZXAgPSAodV9jaGFyICopbWFsbG9jKDYpOworCisJd2hpbGUgKCpzKSB7CisJCWlmICgqcyA9PSAnOicgfHwgKnMgPT0gJy4nIHx8ICpzID09ICctJykKKwkJCXMgKz0gMTsKKwkJZCA9IHhkdG9pKCpzKyspOworCQlpZiAoaXN4ZGlnaXQoKHVuc2lnbmVkIGNoYXIpKnMpKSB7CisJCQlkIDw8PSA0OworCQkJZCB8PSB4ZHRvaSgqcysrKTsKKwkJfQorCQkqZXArKyA9IGQ7CisJfQorCisJcmV0dXJuIChlKTsKK30KKworI2lmbmRlZiBIQVZFX0VUSEVSX0hPU1RUT04KKy8qIFJvbGwgb3VyIG93biAqLwordV9jaGFyICoKK3BjYXBfZXRoZXJfaG9zdHRvbihjb25zdCBjaGFyICpuYW1lKQoreworCXJlZ2lzdGVyIHN0cnVjdCBwY2FwX2V0aGVyZW50ICplcDsKKwlyZWdpc3RlciB1X2NoYXIgKmFwOworCXN0YXRpYyBGSUxFICpmcCA9IE5VTEw7CisJc3RhdGljIGludCBpbml0ID0gMDsKKworCWlmICghaW5pdCkgeworCQlmcCA9IGZvcGVuKFBDQVBfRVRIRVJTX0ZJTEUsICJyIik7CisJCSsraW5pdDsKKwkJaWYgKGZwID09IE5VTEwpCisJCQlyZXR1cm4gKE5VTEwpOworCX0gZWxzZSBpZiAoZnAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwllbHNlCisJCXJld2luZChmcCk7CisKKwl3aGlsZSAoKGVwID0gcGNhcF9uZXh0X2V0aGVyZW50KGZwKSkgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKGVwLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlhcCA9ICh1X2NoYXIgKiltYWxsb2MoNik7CisJCQlpZiAoYXAgIT0gTlVMTCkgeworCQkJCW1lbWNweShhcCwgZXAtPmFkZHIsIDYpOworCQkJCXJldHVybiAoYXApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKyNlbHNlCisKKyNpZiAhZGVmaW5lZChIQVZFX0RFQ0xfRVRIRVJfSE9TVFRPTikgfHwgIUhBVkVfREVDTF9FVEhFUl9IT1NUVE9OCisjaWZuZGVmIEhBVkVfU1RSVUNUX0VUSEVSX0FERFIKK3N0cnVjdCBldGhlcl9hZGRyIHsKKwl1bnNpZ25lZCBjaGFyIGV0aGVyX2FkZHJfb2N0ZXRbNl07Cit9OworI2VuZGlmCitleHRlcm4gaW50IGV0aGVyX2hvc3R0b24oY29uc3QgY2hhciAqLCBzdHJ1Y3QgZXRoZXJfYWRkciAqKTsKKyNlbmRpZgorCisvKiBVc2UgdGhlIG9zIHN1cHBsaWVkIHJvdXRpbmVzICovCit1X2NoYXIgKgorcGNhcF9ldGhlcl9ob3N0dG9uKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmVnaXN0ZXIgdV9jaGFyICphcDsKKwl1X2NoYXIgYVs2XTsKKworCWFwID0gTlVMTDsKKwlpZiAoZXRoZXJfaG9zdHRvbihuYW1lLCAoc3RydWN0IGV0aGVyX2FkZHIgKilhKSA9PSAwKSB7CisJCWFwID0gKHVfY2hhciAqKW1hbGxvYyg2KTsKKwkJaWYgKGFwICE9IE5VTEwpCisJCQltZW1jcHkoKGNoYXIgKilhcCwgKGNoYXIgKilhLCA2KTsKKwl9CisJcmV0dXJuIChhcCk7Cit9CisjZW5kaWYKKwordV9zaG9ydAorX19wY2FwX25hbWV0b2RuYWRkcihjb25zdCBjaGFyICpuYW1lKQoreworI2lmZGVmCURFQ05FVExJQgorCXN0cnVjdCBub2RlZW50ICpnZXRub2RlYnluYW1lKCk7CisJc3RydWN0IG5vZGVlbnQgKm5lcDsKKwl1bnNpZ25lZCBzaG9ydCByZXM7CisKKwluZXAgPSBnZXRub2RlYnluYW1lKG5hbWUpOworCWlmIChuZXAgPT0gKChzdHJ1Y3Qgbm9kZWVudCAqKTApKQorCQlicGZfZXJyb3IoInVua25vd24gZGVjbmV0IGhvc3QgbmFtZSAnJXMnXG4iLCBuYW1lKTsKKworCW1lbWNweSgoY2hhciAqKSZyZXMsIChjaGFyICopbmVwLT5uX2FkZHIsIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworCXJldHVybihyZXMpOworI2Vsc2UKKwlicGZfZXJyb3IoImRlY25ldCBuYW1lIHN1cHBvcnQgbm90IGluY2x1ZGVkLCAnJXMnIGNhbm5vdCBiZSB0cmFuc2xhdGVkXG4iLAorCQluYW1lKTsKKwlyZXR1cm4oMCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvbmxwaWQuaCBiL2xpYnBjYXAtMS4zLjAvbmxwaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI3YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9ubHBpZC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTYKKyAqCUp1bmlwZXIgTmV0d29ya3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uICBUaGUgbmFtZSBvZiBKdW5pcGVyIE5ldHdvcmtzIG1heSBub3QKKyAqIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL25scGlkLmgsdiAxLjIgMjAwMi0xMi0wNiAwMDowMTozNCBoYW5uZXMgRXhwICQgKEp1bmlwZXIpCisgKi8KKworLyogVHlwZXMgbWlzc2luZyBmcm9tIHNvbWUgc3lzdGVtcyAqLworCisvKgorICogTmV0d29yayBsYXllciBwcm90b3RvY29sIGlkZW50aWZpZXJzCisgKi8KKyNpZm5kZWYgSVNPODQ3M19DTE5QCisjZGVmaW5lIElTTzg0NzNfQ0xOUAkJMHg4MQorI2VuZGlmCisjaWZuZGVmCUlTTzk1NDJfRVNJUworI2RlZmluZQlJU085NTQyX0VTSVMJCTB4ODIKKyNlbmRpZgorI2lmbmRlZiBJU085NTQyWDI1X0VTSVMKKyNkZWZpbmUgSVNPOTU0MlgyNV9FU0lTCQkweDhhCisjZW5kaWYKKyNpZm5kZWYJSVNPMTA1ODlfSVNJUworI2RlZmluZQlJU08xMDU4OV9JU0lTCQkweDgzCisjZW5kaWYKKy8qCisgKiB0aGlzIGRvZXMgbm90IHJlYWxseSBiZWxvbmcgaW4gdGhlIG5scGlkLmggZmlsZQorICogaG93ZXZlciB3ZSBuZWVkIGl0IGZvciBnZW5lcmF0aW5nIG5pY2UKKyAqIElTLUlTIHJlbGF0ZWQgQlBGIGZpbHRlcnMKKyAqLworI2RlZmluZSBJU0lTX0wxX0xBTl9JSUggICAgICAxNQorI2RlZmluZSBJU0lTX0wyX0xBTl9JSUggICAgICAxNgorI2RlZmluZSBJU0lTX1BUUF9JSUggICAgICAgICAxNworI2RlZmluZSBJU0lTX0wxX0xTUCAgICAgICAgICAxOAorI2RlZmluZSBJU0lTX0wyX0xTUCAgICAgICAgICAyMAorI2RlZmluZSBJU0lTX0wxX0NTTlAgICAgICAgICAyNAorI2RlZmluZSBJU0lTX0wyX0NTTlAgICAgICAgICAyNQorI2RlZmluZSBJU0lTX0wxX1BTTlAgICAgICAgICAyNgorI2RlZmluZSBJU0lTX0wyX1BTTlAgICAgICAgICAyNworCisjaWZuZGVmIElTTzg4NzhBX0NPTlMKKyNkZWZpbmUJSVNPODg3OEFfQ09OUwkJMHg4NAorI2VuZGlmCisjaWZuZGVmCUlTTzEwNzQ3X0lEUlAKKyNkZWZpbmUJSVNPMTA3NDdfSURSUAkJMHg4NQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL29wdGltaXplLmMgYi9saWJwY2FwLTEuMy4wL29wdGltaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiZGE5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvb3B0aW1pemUuYwpAQCAtMCwwICsxLDIzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiAgT3B0aW1pemF0aW9uIG1vZHVsZSBmb3IgdGNwZHVtcCBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24uCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL29wdGltaXplLmMsdiAxLjkxIDIwMDgtMDEtMDIgMDQ6MTY6NDYgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxzZSAvKiBXSU4zMiAqLworI2lmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxpZiBIQVZFX1NURElOVF9ICisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1NZU19CSVRZUEVTX0gKKyNpbmNsdWRlIDxzeXMvYml0eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogV0lOMzIgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2luY2x1ZGUgImdlbmNvZGUuaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2lmZGVmIEJERUJVRworZXh0ZXJuIGludCBkZmxhZzsKKyNlbmRpZgorCisjaWYgZGVmaW5lZChNU0RPUykgJiYgIWRlZmluZWQoX19ESkdQUF9fKQorZXh0ZXJuIGludCBfdzMyX2ZmcyAoaW50IG1hc2spOworI2RlZmluZSBmZnMgX3czMl9mZnMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChXSU4zMikgJiYgZGVmaW5lZCAoX01TQ19WRVIpCitpbnQgZmZzKGludCBtYXNrKTsKKyNlbmRpZgorCisvKgorICogUmVwcmVzZW50cyBhIGRlbGV0ZWQgaW5zdHJ1Y3Rpb24uCisgKi8KKyNkZWZpbmUgTk9QIC0xCisKKy8qCisgKiBSZWdpc3RlciBudW1iZXJzIGZvciB1c2UtZGVmIHZhbHVlcy4KKyAqIDAgdGhyb3VnaCBCUEZfTUVNV09SRFMtMSByZXByZXNlbnQgdGhlIGNvcnJlc3BvbmRpbmcgc2NyYXRjaCBtZW1vcnkKKyAqIGxvY2F0aW9uLiAgQV9BVE9NIGlzIHRoZSBhY2N1bXVsYXRvciBhbmQgWF9BVE9NIGlzIHRoZSBpbmRleAorICogcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQV9BVE9NIEJQRl9NRU1XT1JEUworI2RlZmluZSBYX0FUT00gKEJQRl9NRU1XT1JEUysxKQorCisvKgorICogVGhpcyBkZWZpbmUgaXMgdXNlZCB0byByZXByZXNlbnQgKmJvdGgqIHRoZSBhY2N1bXVsYXRvciBhbmQKKyAqIHggcmVnaXN0ZXIgaW4gdXNlLWRlZiBjb21wdXRhdGlvbnMuCisgKiBDdXJyZW50bHksIHRoZSB1c2UtZGVmIGNvZGUgYXNzdW1lcyBvbmx5IG9uZSBkZWZpbml0aW9uIHBlciBpbnN0cnVjdGlvbi4KKyAqLworI2RlZmluZSBBWF9BVE9NIE5fQVRPTVMKKworLyoKKyAqIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGZ1cnRoZXIgb3B0aW1pemF0aW9uIGlzIG5lZWRlZC4KKyAqIEl0ZXJhdGl2ZSBwYXNzZXMgYXJlIGNvbnRpbnVlZCB1bnRpbCBhIGdpdmVuIHBhc3MgeWllbGRzIG5vCisgKiBicmFuY2ggbW92ZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQgZG9uZTsKKworLyoKKyAqIEEgYmxvY2sgaXMgbWFya2VkIGlmIG9ubHkgaWYgaXRzIG1hcmsgZXF1YWxzIHRoZSBjdXJyZW50IG1hcmsuCisgKiBSYXRoZXIgdGhhbiB0cmF2ZXJzZSB0aGUgY29kZSBhcnJheSwgbWFya2luZyBlYWNoIGl0ZW0sICdjdXJfbWFyaycgaXMKKyAqIGluY3JlbWVudGVkLiAgVGhpcyBhdXRvbWF0aWNhbGx5IG1ha2VzIGVhY2ggZWxlbWVudCB1bm1hcmtlZC4KKyAqLworc3RhdGljIGludCBjdXJfbWFyazsKKyNkZWZpbmUgaXNNYXJrZWQocCkgKChwKS0+bWFyayA9PSBjdXJfbWFyaykKKyNkZWZpbmUgdW5NYXJrQWxsKCkgY3VyX21hcmsgKz0gMQorI2RlZmluZSBNYXJrKHApICgocCktPm1hcmsgPSBjdXJfbWFyaykKKworc3RhdGljIHZvaWQgb3B0X2luaXQoc3RydWN0IGJsb2NrICopOworc3RhdGljIHZvaWQgb3B0X2NsZWFudXAodm9pZCk7CisKK3N0YXRpYyB2b2lkIG1ha2VfbWFya3Moc3RydWN0IGJsb2NrICopOworc3RhdGljIHZvaWQgbWFya19jb2RlKHN0cnVjdCBibG9jayAqKTsKKworc3RhdGljIHZvaWQgaW50ZXJuX2Jsb2NrcyhzdHJ1Y3QgYmxvY2sgKik7CisKK3N0YXRpYyBpbnQgZXFfc2xpc3Qoc3RydWN0IHNsaXN0ICosIHN0cnVjdCBzbGlzdCAqKTsKKworc3RhdGljIHZvaWQgZmluZF9sZXZlbHNfcihzdHJ1Y3QgYmxvY2sgKik7CisKK3N0YXRpYyB2b2lkIGZpbmRfbGV2ZWxzKHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB2b2lkIGZpbmRfZG9tKHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB2b2lkIHByb3BlZG9tKHN0cnVjdCBlZGdlICopOworc3RhdGljIHZvaWQgZmluZF9lZG9tKHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB2b2lkIGZpbmRfY2xvc3VyZShzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgaW50IGF0b211c2Uoc3RydWN0IHN0bXQgKik7CitzdGF0aWMgaW50IGF0b21kZWYoc3RydWN0IHN0bXQgKik7CitzdGF0aWMgdm9pZCBjb21wdXRlX2xvY2FsX3VkKHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB2b2lkIGZpbmRfdWQoc3RydWN0IGJsb2NrICopOworc3RhdGljIHZvaWQgaW5pdF92YWwodm9pZCk7CitzdGF0aWMgaW50IEYoaW50LCBpbnQsIGludCk7CitzdGF0aWMgaW5saW5lIHZvaWQgdnN0b3JlKHN0cnVjdCBzdG10ICosIGludCAqLCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCBvcHRfYmxrKHN0cnVjdCBibG9jayAqLCBpbnQpOworc3RhdGljIGludCB1c2VfY29uZmxpY3Qoc3RydWN0IGJsb2NrICosIHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB2b2lkIG9wdF9qKHN0cnVjdCBlZGdlICopOworc3RhdGljIHZvaWQgb3JfcHVsbHVwKHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB2b2lkIGFuZF9wdWxsdXAoc3RydWN0IGJsb2NrICopOworc3RhdGljIHZvaWQgb3B0X2Jsa3Moc3RydWN0IGJsb2NrICosIGludCk7CitzdGF0aWMgaW5saW5lIHZvaWQgbGlua19pbmVkZ2Uoc3RydWN0IGVkZ2UgKiwgc3RydWN0IGJsb2NrICopOworc3RhdGljIHZvaWQgZmluZF9pbmVkZ2VzKHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB2b2lkIG9wdF9yb290KHN0cnVjdCBibG9jayAqKik7CitzdGF0aWMgdm9pZCBvcHRfbG9vcChzdHJ1Y3QgYmxvY2sgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGZvbGRfb3Aoc3RydWN0IHN0bXQgKiwgaW50LCBpbnQpOworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2xpc3QgKnRoaXNfb3Aoc3RydWN0IHNsaXN0ICopOworc3RhdGljIHZvaWQgb3B0X25vdChzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgdm9pZCBvcHRfcGVlcChzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgdm9pZCBvcHRfc3RtdChzdHJ1Y3Qgc3RtdCAqLCBpbnRbXSwgaW50KTsKK3N0YXRpYyB2b2lkIGRlYWRzdG10KHN0cnVjdCBzdG10ICosIHN0cnVjdCBzdG10ICpbXSk7CitzdGF0aWMgdm9pZCBvcHRfZGVhZHN0b3JlcyhzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgc3RydWN0IGJsb2NrICpmb2xkX2VkZ2Uoc3RydWN0IGJsb2NrICosIHN0cnVjdCBlZGdlICopOworc3RhdGljIGlubGluZSBpbnQgZXFfYmxrKHN0cnVjdCBibG9jayAqLCBzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgdV9pbnQgc2xlbmd0aChzdHJ1Y3Qgc2xpc3QgKik7CitzdGF0aWMgaW50IGNvdW50X2Jsb2NrcyhzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgdm9pZCBudW1iZXJfYmxrc19yKHN0cnVjdCBibG9jayAqKTsKK3N0YXRpYyB1X2ludCBjb3VudF9zdG10cyhzdHJ1Y3QgYmxvY2sgKik7CitzdGF0aWMgaW50IGNvbnZlcnRfY29kZV9yKHN0cnVjdCBibG9jayAqKTsKKyNpZmRlZiBCREVCVUcKK3N0YXRpYyB2b2lkIG9wdF9kdW1wKHN0cnVjdCBibG9jayAqKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IG5fYmxvY2tzOworc3RydWN0IGJsb2NrICoqYmxvY2tzOworc3RhdGljIGludCBuX2VkZ2VzOworc3RydWN0IGVkZ2UgKiplZGdlczsKKworLyoKKyAqIEEgYml0IHZlY3RvciBzZXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRvbWluYXRvcnMuCisgKiBXZSByb3VuZCB1cCB0aGUgc2V0IHNpemUgdG8gdGhlIG5leHQgcG93ZXIgb2YgdHdvLgorICovCitzdGF0aWMgaW50IG5vZGV3b3JkczsKK3N0YXRpYyBpbnQgZWRnZXdvcmRzOworc3RydWN0IGJsb2NrICoqbGV2ZWxzOworYnBmX3VfaW50MzIgKnNwYWNlOworI2RlZmluZSBCSVRTX1BFUl9XT1JEICg4KnNpemVvZihicGZfdV9pbnQzMikpCisvKgorICogVHJ1ZSBpZiBhIGlzIGluIHVzZXQge3B9CisgKi8KKyNkZWZpbmUgU0VUX01FTUJFUihwLCBhKSBcCisoKHApWyh1bnNpZ25lZCkoYSkgLyBCSVRTX1BFUl9XT1JEXSAmICgxIDw8ICgodW5zaWduZWQpKGEpICUgQklUU19QRVJfV09SRCkpKQorCisvKgorICogQWRkICdhJyB0byB1c2V0IHAuCisgKi8KKyNkZWZpbmUgU0VUX0lOU0VSVChwLCBhKSBcCisocClbKHVuc2lnbmVkKShhKSAvIEJJVFNfUEVSX1dPUkRdIHw9ICgxIDw8ICgodW5zaWduZWQpKGEpICUgQklUU19QRVJfV09SRCkpCisKKy8qCisgKiBEZWxldGUgJ2EnIGZyb20gdXNldCBwLgorICovCisjZGVmaW5lIFNFVF9ERUxFVEUocCwgYSkgXAorKHApWyh1bnNpZ25lZCkoYSkgLyBCSVRTX1BFUl9XT1JEXSAmPSB+KDEgPDwgKCh1bnNpZ25lZCkoYSkgJSBCSVRTX1BFUl9XT1JEKSkKKworLyoKKyAqIGEgOj0gYSBpbnRlcnNlY3QgYgorICovCisjZGVmaW5lIFNFVF9JTlRFUlNFQ1QoYSwgYiwgbilcCit7XAorCXJlZ2lzdGVyIGJwZl91X2ludDMyICpfeCA9IGEsICpfeSA9IGI7XAorCXJlZ2lzdGVyIGludCBfbiA9IG47XAorCXdoaWxlICgtLV9uID49IDApICpfeCsrICY9ICpfeSsrO1wKK30KKworLyoKKyAqIGEgOj0gYSAtIGIKKyAqLworI2RlZmluZSBTRVRfU1VCVFJBQ1QoYSwgYiwgbilcCit7XAorCXJlZ2lzdGVyIGJwZl91X2ludDMyICpfeCA9IGEsICpfeSA9IGI7XAorCXJlZ2lzdGVyIGludCBfbiA9IG47XAorCXdoaWxlICgtLV9uID49IDApICpfeCsrICY9fiAqX3krKztcCit9CisKKy8qCisgKiBhIDo9IGEgdW5pb24gYgorICovCisjZGVmaW5lIFNFVF9VTklPTihhLCBiLCBuKVwKK3tcCisJcmVnaXN0ZXIgYnBmX3VfaW50MzIgKl94ID0gYSwgKl95ID0gYjtcCisJcmVnaXN0ZXIgaW50IF9uID0gbjtcCisJd2hpbGUgKC0tX24gPj0gMCkgKl94KysgfD0gKl95Kys7XAorfQorCitzdGF0aWMgdXNldCBhbGxfZG9tX3NldHM7CitzdGF0aWMgdXNldCBhbGxfY2xvc3VyZV9zZXRzOworc3RhdGljIHVzZXQgYWxsX2VkZ2Vfc2V0czsKKworI2lmbmRlZiBNQVgKKyNkZWZpbmUgTUFYKGEsYikgKChhKT4oYik/KGEpOihiKSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorZmluZF9sZXZlbHNfcihiKQorCXN0cnVjdCBibG9jayAqYjsKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoaXNNYXJrZWQoYikpCisJCXJldHVybjsKKworCU1hcmsoYik7CisJYi0+bGluayA9IDA7CisKKwlpZiAoSlQoYikpIHsKKwkJZmluZF9sZXZlbHNfcihKVChiKSk7CisJCWZpbmRfbGV2ZWxzX3IoSkYoYikpOworCQlsZXZlbCA9IE1BWChKVChiKS0+bGV2ZWwsIEpGKGIpLT5sZXZlbCkgKyAxOworCX0gZWxzZQorCQlsZXZlbCA9IDA7CisJYi0+bGV2ZWwgPSBsZXZlbDsKKwliLT5saW5rID0gbGV2ZWxzW2xldmVsXTsKKwlsZXZlbHNbbGV2ZWxdID0gYjsKK30KKworLyoKKyAqIExldmVsIGdyYXBoLiAgVGhlIGxldmVscyBnbyBmcm9tIDAgYXQgdGhlIGxlYXZlcyB0bworICogTl9MRVZFTFMgYXQgdGhlIHJvb3QuICBUaGUgbGV2ZWxzW10gYXJyYXkgcG9pbnRzIHRvIHRoZQorICogZmlyc3Qgbm9kZSBvZiB0aGUgbGV2ZWwgbGlzdCwgd2hvc2UgZWxlbWVudHMgYXJlIGxpbmtlZAorICogd2l0aCB0aGUgJ2xpbmsnIGZpZWxkIG9mIHRoZSBzdHJ1Y3QgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkCitmaW5kX2xldmVscyhyb290KQorCXN0cnVjdCBibG9jayAqcm9vdDsKK3sKKwltZW1zZXQoKGNoYXIgKilsZXZlbHMsIDAsIG5fYmxvY2tzICogc2l6ZW9mKCpsZXZlbHMpKTsKKwl1bk1hcmtBbGwoKTsKKwlmaW5kX2xldmVsc19yKHJvb3QpOworfQorCisvKgorICogRmluZCBkb21pbmF0b3IgcmVsYXRpb25zaGlwcy4KKyAqIEFzc3VtZXMgZ3JhcGggaGFzIGJlZW4gbGV2ZWxlZC4KKyAqLworc3RhdGljIHZvaWQKK2ZpbmRfZG9tKHJvb3QpCisJc3RydWN0IGJsb2NrICpyb290OworeworCWludCBpOworCXN0cnVjdCBibG9jayAqYjsKKwlicGZfdV9pbnQzMiAqeDsKKworCS8qCisJICogSW5pdGlhbGl6ZSBzZXRzIHRvIGNvbnRhaW4gYWxsIG5vZGVzLgorCSAqLworCXggPSBhbGxfZG9tX3NldHM7CisJaSA9IG5fYmxvY2tzICogbm9kZXdvcmRzOworCXdoaWxlICgtLWkgPj0gMCkKKwkJKngrKyA9IH4wOworCS8qIFJvb3Qgc3RhcnRzIG9mZiBlbXB0eS4gKi8KKwlmb3IgKGkgPSBub2Rld29yZHM7IC0taSA+PSAwOykKKwkJcm9vdC0+ZG9tW2ldID0gMDsKKworCS8qIHJvb3QtPmxldmVsIGlzIHRoZSBoaWdoZXN0IGxldmVsIG5vIGZvdW5kLiAqLworCWZvciAoaSA9IHJvb3QtPmxldmVsOyBpID49IDA7IC0taSkgeworCQlmb3IgKGIgPSBsZXZlbHNbaV07IGI7IGIgPSBiLT5saW5rKSB7CisJCQlTRVRfSU5TRVJUKGItPmRvbSwgYi0+aWQpOworCQkJaWYgKEpUKGIpID09IDApCisJCQkJY29udGludWU7CisJCQlTRVRfSU5URVJTRUNUKEpUKGIpLT5kb20sIGItPmRvbSwgbm9kZXdvcmRzKTsKKwkJCVNFVF9JTlRFUlNFQ1QoSkYoYiktPmRvbSwgYi0+ZG9tLCBub2Rld29yZHMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJvcGVkb20oZXApCisJc3RydWN0IGVkZ2UgKmVwOworeworCVNFVF9JTlNFUlQoZXAtPmVkb20sIGVwLT5pZCk7CisJaWYgKGVwLT5zdWNjKSB7CisJCVNFVF9JTlRFUlNFQ1QoZXAtPnN1Y2MtPmV0LmVkb20sIGVwLT5lZG9tLCBlZGdld29yZHMpOworCQlTRVRfSU5URVJTRUNUKGVwLT5zdWNjLT5lZi5lZG9tLCBlcC0+ZWRvbSwgZWRnZXdvcmRzKTsKKwl9Cit9CisKKy8qCisgKiBDb21wdXRlIGVkZ2UgZG9taW5hdG9ycy4KKyAqIEFzc3VtZXMgZ3JhcGggaGFzIGJlZW4gbGV2ZWxlZCBhbmQgcHJlZGVjZXNzb3JzIGVzdGFibGlzaGVkLgorICovCitzdGF0aWMgdm9pZAorZmluZF9lZG9tKHJvb3QpCisJc3RydWN0IGJsb2NrICpyb290OworeworCWludCBpOworCXVzZXQgeDsKKwlzdHJ1Y3QgYmxvY2sgKmI7CisKKwl4ID0gYWxsX2VkZ2Vfc2V0czsKKwlmb3IgKGkgPSBuX2VkZ2VzICogZWRnZXdvcmRzOyAtLWkgPj0gMDsgKQorCQl4W2ldID0gfjA7CisKKwkvKiByb290LT5sZXZlbCBpcyB0aGUgaGlnaGVzdCBsZXZlbCBubyBmb3VuZC4gKi8KKwltZW1zZXQocm9vdC0+ZXQuZWRvbSwgMCwgZWRnZXdvcmRzICogc2l6ZW9mKCoodXNldCkwKSk7CisJbWVtc2V0KHJvb3QtPmVmLmVkb20sIDAsIGVkZ2V3b3JkcyAqIHNpemVvZigqKHVzZXQpMCkpOworCWZvciAoaSA9IHJvb3QtPmxldmVsOyBpID49IDA7IC0taSkgeworCQlmb3IgKGIgPSBsZXZlbHNbaV07IGIgIT0gMDsgYiA9IGItPmxpbmspIHsKKwkJCXByb3BlZG9tKCZiLT5ldCk7CisJCQlwcm9wZWRvbSgmYi0+ZWYpOworCQl9CisJfQorfQorCisvKgorICogRmluZCB0aGUgYmFja3dhcmRzIHRyYW5zaXRpdmUgY2xvc3VyZSBvZiB0aGUgZmxvdyBncmFwaC4gIFRoZXNlIHNldHMKKyAqIGFyZSBiYWNrd2FyZHMgaW4gdGhlIHNlbnNlIHRoYXQgd2UgZmluZCB0aGUgc2V0IG9mIG5vZGVzIHRoYXQgcmVhY2gKKyAqIGEgZ2l2ZW4gbm9kZSwgbm90IHRoZSBzZXQgb2Ygbm9kZXMgdGhhdCBjYW4gYmUgcmVhY2hlZCBieSBhIG5vZGUuCisgKgorICogQXNzdW1lcyBncmFwaCBoYXMgYmVlbiBsZXZlbGVkLgorICovCitzdGF0aWMgdm9pZAorZmluZF9jbG9zdXJlKHJvb3QpCisJc3RydWN0IGJsb2NrICpyb290OworeworCWludCBpOworCXN0cnVjdCBibG9jayAqYjsKKworCS8qCisJICogSW5pdGlhbGl6ZSBzZXRzIHRvIGNvbnRhaW4gbm8gbm9kZXMuCisJICovCisJbWVtc2V0KChjaGFyICopYWxsX2Nsb3N1cmVfc2V0cywgMCwKKwkgICAgICBuX2Jsb2NrcyAqIG5vZGV3b3JkcyAqIHNpemVvZigqYWxsX2Nsb3N1cmVfc2V0cykpOworCisJLyogcm9vdC0+bGV2ZWwgaXMgdGhlIGhpZ2hlc3QgbGV2ZWwgbm8gZm91bmQuICovCisJZm9yIChpID0gcm9vdC0+bGV2ZWw7IGkgPj0gMDsgLS1pKSB7CisJCWZvciAoYiA9IGxldmVsc1tpXTsgYjsgYiA9IGItPmxpbmspIHsKKwkJCVNFVF9JTlNFUlQoYi0+Y2xvc3VyZSwgYi0+aWQpOworCQkJaWYgKEpUKGIpID09IDApCisJCQkJY29udGludWU7CisJCQlTRVRfVU5JT04oSlQoYiktPmNsb3N1cmUsIGItPmNsb3N1cmUsIG5vZGV3b3Jkcyk7CisJCQlTRVRfVU5JT04oSkYoYiktPmNsb3N1cmUsIGItPmNsb3N1cmUsIG5vZGV3b3Jkcyk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIHJlZ2lzdGVyIG51bWJlciB0aGF0IGlzIHVzZWQgYnkgcy4gIElmIEEgYW5kIFggYXJlIGJvdGgKKyAqIHVzZWQsIHJldHVybiBBWF9BVE9NLiAgSWYgbm8gcmVnaXN0ZXIgaXMgdXNlZCwgcmV0dXJuIC0xLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcHJvYmFibHkgY2hhbmdlIHRvIGFuIGFycmF5IGFjY2Vzcy4KKyAqLworc3RhdGljIGludAorYXRvbXVzZShzKQorCXN0cnVjdCBzdG10ICpzOworeworCXJlZ2lzdGVyIGludCBjID0gcy0+Y29kZTsKKworCWlmIChjID09IE5PUCkKKwkJcmV0dXJuIC0xOworCisJc3dpdGNoIChCUEZfQ0xBU1MoYykpIHsKKworCWNhc2UgQlBGX1JFVDoKKwkJcmV0dXJuIChCUEZfUlZBTChjKSA9PSBCUEZfQSkgPyBBX0FUT00gOgorCQkJKEJQRl9SVkFMKGMpID09IEJQRl9YKSA/IFhfQVRPTSA6IC0xOworCisJY2FzZSBCUEZfTEQ6CisJY2FzZSBCUEZfTERYOgorCQlyZXR1cm4gKEJQRl9NT0RFKGMpID09IEJQRl9JTkQpID8gWF9BVE9NIDoKKwkJCShCUEZfTU9ERShjKSA9PSBCUEZfTUVNKSA/IHMtPmsgOiAtMTsKKworCWNhc2UgQlBGX1NUOgorCQlyZXR1cm4gQV9BVE9NOworCisJY2FzZSBCUEZfU1RYOgorCQlyZXR1cm4gWF9BVE9NOworCisJY2FzZSBCUEZfSk1QOgorCWNhc2UgQlBGX0FMVToKKwkJaWYgKEJQRl9TUkMoYykgPT0gQlBGX1gpCisJCQlyZXR1cm4gQVhfQVRPTTsKKwkJcmV0dXJuIEFfQVRPTTsKKworCWNhc2UgQlBGX01JU0M6CisJCXJldHVybiBCUEZfTUlTQ09QKGMpID09IEJQRl9UWEEgPyBYX0FUT00gOiBBX0FUT007CisJfQorCWFib3J0KCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogUmV0dXJuIHRoZSByZWdpc3RlciBudW1iZXIgdGhhdCBpcyBkZWZpbmVkIGJ5ICdzJy4gIFdlIGFzc3VtZSB0aGF0CisgKiBhIHNpbmdsZSBzdG10IGNhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSByZWdpc3Rlci4gIElmIG5vIHJlZ2lzdGVyCisgKiBpcyBkZWZpbmVkLCByZXR1cm4gLTEuCisgKgorICogVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBwcm9iYWJseSBjaGFuZ2UgdG8gYW4gYXJyYXkgYWNjZXNzLgorICovCitzdGF0aWMgaW50CithdG9tZGVmKHMpCisJc3RydWN0IHN0bXQgKnM7Cit7CisJaWYgKHMtPmNvZGUgPT0gTk9QKQorCQlyZXR1cm4gLTE7CisKKwlzd2l0Y2ggKEJQRl9DTEFTUyhzLT5jb2RlKSkgeworCisJY2FzZSBCUEZfTEQ6CisJY2FzZSBCUEZfQUxVOgorCQlyZXR1cm4gQV9BVE9NOworCisJY2FzZSBCUEZfTERYOgorCQlyZXR1cm4gWF9BVE9NOworCisJY2FzZSBCUEZfU1Q6CisJY2FzZSBCUEZfU1RYOgorCQlyZXR1cm4gcy0+azsKKworCWNhc2UgQlBGX01JU0M6CisJCXJldHVybiBCUEZfTUlTQ09QKHMtPmNvZGUpID09IEJQRl9UQVggPyBYX0FUT00gOiBBX0FUT007CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlIHNldHMgb2YgcmVnaXN0ZXJzIHVzZWQsIGRlZmluZWQsIGFuZCBraWxsZWQgYnkgJ2InLgorICoKKyAqICJVc2VkIiBtZWFucyB0aGF0IGEgc3RhdGVtZW50IGluICdiJyB1c2VzIHRoZSByZWdpc3RlciBiZWZvcmUgYW55CisgKiBzdGF0ZW1lbnQgaW4gJ2InIGRlZmluZXMgaXQsIGkuZS4gaXQgdXNlcyB0aGUgdmFsdWUgbGVmdCBpbgorICogdGhhdCByZWdpc3RlciBieSBhIHByZWRlY2Vzc29yIGJsb2NrIG9mIHRoaXMgYmxvY2suCisgKiAiRGVmaW5lZCIgbWVhbnMgdGhhdCBhIHN0YXRlbWVudCBpbiAnYicgZGVmaW5lcyBpdC4KKyAqICJLaWxsZWQiIG1lYW5zIHRoYXQgYSBzdGF0ZW1lbnQgaW4gJ2InIGRlZmluZXMgaXQgYmVmb3JlIGFueQorICogc3RhdGVtZW50IGluICdiJyB1c2VzIGl0LCBpLmUuIGl0IGtpbGxzIHRoZSB2YWx1ZSBsZWZ0IGluIHRoYXQKKyAqIHJlZ2lzdGVyIGJ5IGEgcHJlZGVjZXNzb3IgYmxvY2sgb2YgdGhpcyBibG9jay4KKyAqLworc3RhdGljIHZvaWQKK2NvbXB1dGVfbG9jYWxfdWQoYikKKwlzdHJ1Y3QgYmxvY2sgKmI7Cit7CisJc3RydWN0IHNsaXN0ICpzOworCWF0b21zZXQgZGVmID0gMCwgdXNlID0gMCwga2lsbCA9IDA7CisJaW50IGF0b207CisKKwlmb3IgKHMgPSBiLT5zdG10czsgczsgcyA9IHMtPm5leHQpIHsKKwkJaWYgKHMtPnMuY29kZSA9PSBOT1ApCisJCQljb250aW51ZTsKKwkJYXRvbSA9IGF0b211c2UoJnMtPnMpOworCQlpZiAoYXRvbSA+PSAwKSB7CisJCQlpZiAoYXRvbSA9PSBBWF9BVE9NKSB7CisJCQkJaWYgKCFBVE9NRUxFTShkZWYsIFhfQVRPTSkpCisJCQkJCXVzZSB8PSBBVE9NTUFTSyhYX0FUT00pOworCQkJCWlmICghQVRPTUVMRU0oZGVmLCBBX0FUT00pKQorCQkJCQl1c2UgfD0gQVRPTU1BU0soQV9BVE9NKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGF0b20gPCBOX0FUT01TKSB7CisJCQkJaWYgKCFBVE9NRUxFTShkZWYsIGF0b20pKQorCQkJCQl1c2UgfD0gQVRPTU1BU0soYXRvbSk7CisJCQl9CisJCQllbHNlCisJCQkJYWJvcnQoKTsKKwkJfQorCQlhdG9tID0gYXRvbWRlZigmcy0+cyk7CisJCWlmIChhdG9tID49IDApIHsKKwkJCWlmICghQVRPTUVMRU0odXNlLCBhdG9tKSkKKwkJCQlraWxsIHw9IEFUT01NQVNLKGF0b20pOworCQkJZGVmIHw9IEFUT01NQVNLKGF0b20pOworCQl9CisJfQorCWlmIChCUEZfQ0xBU1MoYi0+cy5jb2RlKSA9PSBCUEZfSk1QKSB7CisJCS8qCisJCSAqIFhYWCAtIHdoYXQgYWJvdXQgUkVUPworCQkgKi8KKwkJYXRvbSA9IGF0b211c2UoJmItPnMpOworCQlpZiAoYXRvbSA+PSAwKSB7CisJCQlpZiAoYXRvbSA9PSBBWF9BVE9NKSB7CisJCQkJaWYgKCFBVE9NRUxFTShkZWYsIFhfQVRPTSkpCisJCQkJCXVzZSB8PSBBVE9NTUFTSyhYX0FUT00pOworCQkJCWlmICghQVRPTUVMRU0oZGVmLCBBX0FUT00pKQorCQkJCQl1c2UgfD0gQVRPTU1BU0soQV9BVE9NKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGF0b20gPCBOX0FUT01TKSB7CisJCQkJaWYgKCFBVE9NRUxFTShkZWYsIGF0b20pKQorCQkJCQl1c2UgfD0gQVRPTU1BU0soYXRvbSk7CisJCQl9CisJCQllbHNlCisJCQkJYWJvcnQoKTsKKwkJfQorCX0KKworCWItPmRlZiA9IGRlZjsKKwliLT5raWxsID0ga2lsbDsKKwliLT5pbl91c2UgPSB1c2U7Cit9CisKKy8qCisgKiBBc3N1bWUgZ3JhcGggaXMgYWxyZWFkeSBsZXZlbGVkLgorICovCitzdGF0aWMgdm9pZAorZmluZF91ZChyb290KQorCXN0cnVjdCBibG9jayAqcm9vdDsKK3sKKwlpbnQgaSwgbWF4bGV2ZWw7CisJc3RydWN0IGJsb2NrICpwOworCisJLyoKKwkgKiByb290LT5sZXZlbCBpcyB0aGUgaGlnaGVzdCBsZXZlbCBubyBmb3VuZDsKKwkgKiBjb3VudCBkb3duIGZyb20gdGhlcmUuCisJICovCisJbWF4bGV2ZWwgPSByb290LT5sZXZlbDsKKwlmb3IgKGkgPSBtYXhsZXZlbDsgaSA+PSAwOyAtLWkpCisJCWZvciAocCA9IGxldmVsc1tpXTsgcDsgcCA9IHAtPmxpbmspIHsKKwkJCWNvbXB1dGVfbG9jYWxfdWQocCk7CisJCQlwLT5vdXRfdXNlID0gMDsKKwkJfQorCisJZm9yIChpID0gMTsgaSA8PSBtYXhsZXZlbDsgKytpKSB7CisJCWZvciAocCA9IGxldmVsc1tpXTsgcDsgcCA9IHAtPmxpbmspIHsKKwkJCXAtPm91dF91c2UgfD0gSlQocCktPmluX3VzZSB8IEpGKHApLT5pbl91c2U7CisJCQlwLT5pbl91c2UgfD0gcC0+b3V0X3VzZSAmfiBwLT5raWxsOworCQl9CisJfQorfQorCisvKgorICogVGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGluIGEgQ29ja2UgYW5kIFNod2FyeiBzdHlsZQorICogdmFsdWUgbnVtYmVyaW5nIHNjaGVtZS4gIFNpbmNlIHRoZSBmbG93Z3JhcGggaXMgYWN5Y2xpYywKKyAqIGV4aXQgdmFsdWVzIGNhbiBiZSBwcm9wYWdhdGVkIGZyb20gYSBub2RlJ3MgcHJlZGVjZXNzb3JzCisgKiBwcm92aWRlZCBpdCBpcyB1bmlxdWVseSBkZWZpbmVkLgorICovCitzdHJ1Y3QgdmFsbm9kZSB7CisJaW50IGNvZGU7CisJaW50IHYwLCB2MTsKKwlpbnQgdmFsOworCXN0cnVjdCB2YWxub2RlICpuZXh0OworfTsKKworI2RlZmluZSBNT0RVTFVTIDIxMworc3RhdGljIHN0cnVjdCB2YWxub2RlICpoYXNodGJsW01PRFVMVVNdOworc3RhdGljIGludCBjdXJ2YWw7CitzdGF0aWMgaW50IG1heHZhbDsKKworLyogSW50ZWdlciBjb25zdGFudHMgbWFwcGVkIHdpdGggdGhlIGxvYWQgaW1tZWRpYXRlIG9wY29kZS4gKi8KKyNkZWZpbmUgSyhpKSBGKEJQRl9MRHxCUEZfSU1NfEJQRl9XLCBpLCAwTCkKKworc3RydWN0IHZtYXBpbmZvIHsKKwlpbnQgaXNfY29uc3Q7CisJYnBmX2ludDMyIGNvbnN0X3ZhbDsKK307CisKK3N0cnVjdCB2bWFwaW5mbyAqdm1hcDsKK3N0cnVjdCB2YWxub2RlICp2bm9kZV9iYXNlOworc3RydWN0IHZhbG5vZGUgKm5leHRfdm5vZGU7CisKK3N0YXRpYyB2b2lkCitpbml0X3ZhbCgpCit7CisJY3VydmFsID0gMDsKKwluZXh0X3Zub2RlID0gdm5vZGVfYmFzZTsKKwltZW1zZXQoKGNoYXIgKil2bWFwLCAwLCBtYXh2YWwgKiBzaXplb2YoKnZtYXApKTsKKwltZW1zZXQoKGNoYXIgKiloYXNodGJsLCAwLCBzaXplb2YgaGFzaHRibCk7Cit9CisKKy8qIEJlY2F1c2Ugd2UgcmVhbGx5IGRvbid0IGhhdmUgYW4gSVIsIHRoaXMgc3R1ZmYgaXMgYSBsaXR0bGUgbWVzc3kuICovCitzdGF0aWMgaW50CitGKGNvZGUsIHYwLCB2MSkKKwlpbnQgY29kZTsKKwlpbnQgdjAsIHYxOworeworCXVfaW50IGhhc2g7CisJaW50IHZhbDsKKwlzdHJ1Y3QgdmFsbm9kZSAqcDsKKworCWhhc2ggPSAodV9pbnQpY29kZSBeICh2MCA8PCA0KSBeICh2MSA8PCA4KTsKKwloYXNoICU9IE1PRFVMVVM7CisKKwlmb3IgKHAgPSBoYXNodGJsW2hhc2hdOyBwOyBwID0gcC0+bmV4dCkKKwkJaWYgKHAtPmNvZGUgPT0gY29kZSAmJiBwLT52MCA9PSB2MCAmJiBwLT52MSA9PSB2MSkKKwkJCXJldHVybiBwLT52YWw7CisKKwl2YWwgPSArK2N1cnZhbDsKKwlpZiAoQlBGX01PREUoY29kZSkgPT0gQlBGX0lNTSAmJgorCSAgICAoQlBGX0NMQVNTKGNvZGUpID09IEJQRl9MRCB8fCBCUEZfQ0xBU1MoY29kZSkgPT0gQlBGX0xEWCkpIHsKKwkJdm1hcFt2YWxdLmNvbnN0X3ZhbCA9IHYwOworCQl2bWFwW3ZhbF0uaXNfY29uc3QgPSAxOworCX0KKwlwID0gbmV4dF92bm9kZSsrOworCXAtPnZhbCA9IHZhbDsKKwlwLT5jb2RlID0gY29kZTsKKwlwLT52MCA9IHYwOworCXAtPnYxID0gdjE7CisJcC0+bmV4dCA9IGhhc2h0YmxbaGFzaF07CisJaGFzaHRibFtoYXNoXSA9IHA7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3ZzdG9yZShzLCB2YWxwLCBuZXd2YWwsIGFsdGVyKQorCXN0cnVjdCBzdG10ICpzOworCWludCAqdmFscDsKKwlpbnQgbmV3dmFsOworCWludCBhbHRlcjsKK3sKKwlpZiAoYWx0ZXIgJiYgKnZhbHAgPT0gbmV3dmFsKQorCQlzLT5jb2RlID0gTk9QOworCWVsc2UKKwkJKnZhbHAgPSBuZXd2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitmb2xkX29wKHMsIHYwLCB2MSkKKwlzdHJ1Y3Qgc3RtdCAqczsKKwlpbnQgdjAsIHYxOworeworCWJwZl91X2ludDMyIGEsIGI7CisKKwlhID0gdm1hcFt2MF0uY29uc3RfdmFsOworCWIgPSB2bWFwW3YxXS5jb25zdF92YWw7CisKKwlzd2l0Y2ggKEJQRl9PUChzLT5jb2RlKSkgeworCWNhc2UgQlBGX0FERDoKKwkJYSArPSBiOworCQlicmVhazsKKworCWNhc2UgQlBGX1NVQjoKKwkJYSAtPSBiOworCQlicmVhazsKKworCWNhc2UgQlBGX01VTDoKKwkJYSAqPSBiOworCQlicmVhazsKKworCWNhc2UgQlBGX0RJVjoKKwkJaWYgKGIgPT0gMCkKKwkJCWJwZl9lcnJvcigiZGl2aXNpb24gYnkgemVybyIpOworCQlhIC89IGI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQU5EOgorCQlhICY9IGI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfT1I6CisJCWEgfD0gYjsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MU0g6CisJCWEgPDw9IGI7CisJCWJyZWFrOworCisJY2FzZSBCUEZfUlNIOgorCQlhID4+PSBiOworCQlicmVhazsKKworCWNhc2UgQlBGX05FRzoKKwkJYSA9IC1hOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorCXMtPmsgPSBhOworCXMtPmNvZGUgPSBCUEZfTER8QlBGX0lNTTsKKwlkb25lID0gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2xpc3QgKgordGhpc19vcChzKQorCXN0cnVjdCBzbGlzdCAqczsKK3sKKwl3aGlsZSAocyAhPSAwICYmIHMtPnMuY29kZSA9PSBOT1ApCisJCXMgPSBzLT5uZXh0OworCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZAorb3B0X25vdChiKQorCXN0cnVjdCBibG9jayAqYjsKK3sKKwlzdHJ1Y3QgYmxvY2sgKnRtcCA9IEpUKGIpOworCisJSlQoYikgPSBKRihiKTsKKwlKRihiKSA9IHRtcDsKK30KKworc3RhdGljIHZvaWQKK29wdF9wZWVwKGIpCisJc3RydWN0IGJsb2NrICpiOworeworCXN0cnVjdCBzbGlzdCAqczsKKwlzdHJ1Y3Qgc2xpc3QgKm5leHQsICpsYXN0OworCWludCB2YWw7CisKKwlzID0gYi0+c3RtdHM7CisJaWYgKHMgPT0gMCkKKwkJcmV0dXJuOworCisJbGFzdCA9IHM7CisJZm9yICgvKmVtcHR5Ki87IC8qZW1wdHkqLzsgcyA9IG5leHQpIHsKKwkJLyoKKwkJICogU2tpcCBvdmVyIG5vcHMuCisJCSAqLworCQlzID0gdGhpc19vcChzKTsKKwkJaWYgKHMgPT0gMCkKKwkJCWJyZWFrOwkvKiBub3RoaW5nIGxlZnQgaW4gdGhlIGJsb2NrICovCisKKwkJLyoKKwkJICogRmluZCB0aGUgbmV4dCByZWFsIGluc3RydWN0aW9uIGFmdGVyIHRoYXQgb25lCisJCSAqIChza2lwcGluZyBub3BzKS4KKwkJICovCisJCW5leHQgPSB0aGlzX29wKHMtPm5leHQpOworCQlpZiAobmV4dCA9PSAwKQorCQkJYnJlYWs7CS8qIG5vIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKwkJbGFzdCA9IG5leHQ7CisKKwkJLyoKKwkJICogc3QgIE1ba10JLS0+CXN0ICBNW2tdCisJCSAqIGxkeCBNW2tdCQl0YXgKKwkJICovCisJCWlmIChzLT5zLmNvZGUgPT0gQlBGX1NUICYmCisJCSAgICBuZXh0LT5zLmNvZGUgPT0gKEJQRl9MRFh8QlBGX01FTSkgJiYKKwkJICAgIHMtPnMuayA9PSBuZXh0LT5zLmspIHsKKwkJCWRvbmUgPSAwOworCQkJbmV4dC0+cy5jb2RlID0gQlBGX01JU0N8QlBGX1RBWDsKKwkJfQorCQkvKgorCQkgKiBsZCAgI2sJLS0+CWxkeCAgI2sKKwkJICogdGF4CQkJdHhhCisJCSAqLworCQlpZiAocy0+cy5jb2RlID09IChCUEZfTER8QlBGX0lNTSkgJiYKKwkJICAgIG5leHQtPnMuY29kZSA9PSAoQlBGX01JU0N8QlBGX1RBWCkpIHsKKwkJCXMtPnMuY29kZSA9IEJQRl9MRFh8QlBGX0lNTTsKKwkJCW5leHQtPnMuY29kZSA9IEJQRl9NSVNDfEJQRl9UWEE7CisJCQlkb25lID0gMDsKKwkJfQorCQkvKgorCQkgKiBUaGlzIGlzIGFuIHVnbHkgc3BlY2lhbCBjYXNlLCBidXQgaXQgaGFwcGVucworCQkgKiB3aGVuIHlvdSBzYXkgdGNwW2tdIG9yIHVkcFtrXSB3aGVyZSBrIGlzIGEgY29uc3RhbnQuCisJCSAqLworCQlpZiAocy0+cy5jb2RlID09IChCUEZfTER8QlBGX0lNTSkpIHsKKwkJCXN0cnVjdCBzbGlzdCAqYWRkLCAqdGF4LCAqaWxkOworCisJCQkvKgorCQkJICogQ2hlY2sgdGhhdCBYIGlzbid0IHVzZWQgb24gZXhpdCBmcm9tIHRoaXMKKwkJCSAqIGJsb2NrICh3aGljaCB0aGUgb3B0aW1pemVyIG1pZ2h0IGNhdXNlKS4KKwkJCSAqIFdlIGtub3cgdGhlIGNvZGUgZ2VuZXJhdG9yIHdvbid0IGdlbmVyYXRlCisJCQkgKiBhbnkgbG9jYWwgZGVwZW5kZW5jaWVzLgorCQkJICovCisJCQlpZiAoQVRPTUVMRU0oYi0+b3V0X3VzZSwgWF9BVE9NKSkKKwkJCQljb250aW51ZTsKKworCQkJLyoKKwkJCSAqIENoZWNrIHRoYXQgdGhlIGluc3RydWN0aW9uIGZvbGxvd2luZyB0aGUgbGRpCisJCQkgKiBpcyBhbiBhZGR4LCBvciBpdCdzIGFuIGxkeG1zIHdpdGggYW4gYWRkeAorCQkJICogZm9sbG93aW5nIGl0ICh3aXRoIDAgb3IgbW9yZSBub3BzIGJldHdlZW4gdGhlCisJCQkgKiBsZHhtcyBhbmQgYWRkeCkuCisJCQkgKi8KKwkJCWlmIChuZXh0LT5zLmNvZGUgIT0gKEJQRl9MRFh8QlBGX01TSHxCUEZfQikpCisJCQkJYWRkID0gbmV4dDsKKwkJCWVsc2UKKwkJCQlhZGQgPSB0aGlzX29wKG5leHQtPm5leHQpOworCQkJaWYgKGFkZCA9PSAwIHx8IGFkZC0+cy5jb2RlICE9IChCUEZfQUxVfEJQRl9BRER8QlBGX1gpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogQ2hlY2sgdGhhdCBhIHRheCBmb2xsb3dzIHRoYXQgKHdpdGggMCBvciBtb3JlCisJCQkgKiBub3BzIGJldHdlZW4gdGhlbSkuCisJCQkgKi8KKwkJCXRheCA9IHRoaXNfb3AoYWRkLT5uZXh0KTsKKwkJCWlmICh0YXggPT0gMCB8fCB0YXgtPnMuY29kZSAhPSAoQlBGX01JU0N8QlBGX1RBWCkpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBDaGVjayB0aGF0IGFuIGlsZCBmb2xsb3dzIHRoYXQgKHdpdGggMCBvciBtb3JlCisJCQkgKiBub3BzIGJldHdlZW4gdGhlbSkuCisJCQkgKi8KKwkJCWlsZCA9IHRoaXNfb3AodGF4LT5uZXh0KTsKKwkJCWlmIChpbGQgPT0gMCB8fCBCUEZfQ0xBU1MoaWxkLT5zLmNvZGUpICE9IEJQRl9MRCB8fAorCQkJICAgIEJQRl9NT0RFKGlsZC0+cy5jb2RlKSAhPSBCUEZfSU5EKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIFdlIHdhbnQgdG8gdHVybiB0aGlzIHNlcXVlbmNlOgorCQkJICoKKwkJCSAqICgwMDQpIGxkaSAgICAgIzB4MgkJe3N9CisJCQkgKiAoMDA1KSBsZHhtcyAgIFsxNF0JCXtuZXh0fSAgLS0gb3B0aW9uYWwKKwkJCSAqICgwMDYpIGFkZHgJCQl7YWRkfQorCQkJICogKDAwNykgdGF4CQkJe3RheH0KKwkJCSAqICgwMDgpIGlsZCAgICAgW3grMF0JCXtpbGR9CisJCQkgKgorCQkJICogaW50byB0aGlzIHNlcXVlbmNlOgorCQkJICoKKwkJCSAqICgwMDQpIG5vcAorCQkJICogKDAwNSkgbGR4bXMgICBbMTRdCisJCQkgKiAoMDA2KSBub3AKKwkJCSAqICgwMDcpIG5vcAorCQkJICogKDAwOCkgaWxkICAgICBbeCsyXQorCQkJICoKKwkJCSAqIFhYWCBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgWCBpcyBub3QKKwkJCSAqIHN1YnNlcXVlbnRseSB1c2VkLCBiZWNhdXNlIHdlIHdhbnQgdG8gY2hhbmdlCisJCQkgKiB3aGF0J2xsIGJlIGluIGl0IGFmdGVyIHRoaXMgc2VxdWVuY2UuCisJCQkgKgorCQkJICogV2Uga25vdyB3ZSBjYW4gZWxpbWluYXRlIHRoZSBhY2N1bXVsYXRvcgorCQkJICogbW9kaWZpY2F0aW9ucyBlYXJsaWVyIGluIHRoZSBzZXF1ZW5jZSBzaW5jZQorCQkJICogaXQgaXMgZGVmaW5lZCBieSB0aGUgbGFzdCBzdG10IG9mIHRoaXMgc2VxdWVuY2UKKwkJCSAqIChpLmUuLCB0aGUgbGFzdCBzdGF0ZW1lbnQgb2YgdGhlIHNlcXVlbmNlIGxvYWRzCisJCQkgKiBhIHZhbHVlIGludG8gdGhlIGFjY3VtdWxhdG9yLCBzbyB3ZSBjYW4gZWxpbWluYXRlCisJCQkgKiBlYXJsaWVyIG9wZXJhdGlvbnMgb24gdGhlIGFjY3VtdWxhdG9yKS4KKwkJCSAqLworCQkJaWxkLT5zLmsgKz0gcy0+cy5rOworCQkJcy0+cy5jb2RlID0gTk9QOworCQkJYWRkLT5zLmNvZGUgPSBOT1A7CisJCQl0YXgtPnMuY29kZSA9IE5PUDsKKwkJCWRvbmUgPSAwOworCQl9CisJfQorCS8qCisJICogSWYgdGhlIGNvbXBhcmlzb24gYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGlzIGFuIGVxdWFsaXR5CisJICogY29tcGFyaXNvbiBhZ2FpbnN0IGEgY29uc3RhbnQsIGFuZCBub2JvZHkgdXNlcyB0aGUgdmFsdWUKKwkgKiB3ZSBsZWF2ZSBpbiB0aGUgQSByZWdpc3RlciBhdCB0aGUgZW5kIG9mIGEgYmxvY2ssIGFuZAorCSAqIHRoZSBvcGVyYXRpb24gcHJlY2VkaW5nIHRoZSBjb21wYXJpc29uIGlzIGFuIGFyaXRobWV0aWMKKwkgKiBvcGVyYXRpb24sIHdlIGNhbiBzb21ldGltZSBvcHRpbWl6ZSBpdCBhd2F5LgorCSAqLworCWlmIChiLT5zLmNvZGUgPT0gKEJQRl9KTVB8QlBGX0pFUXxCUEZfSykgJiYKKwkgICAgIUFUT01FTEVNKGItPm91dF91c2UsIEFfQVRPTSkpIHsKKwkgICAgCS8qCisJICAgIAkgKiBXZSBjYW4gb3B0aW1pemUgYXdheSBjZXJ0YWluIHN1YnRyYWN0aW9ucyBvZiB0aGUKKwkgICAgCSAqIFggcmVnaXN0ZXIuCisJICAgIAkgKi8KKwkJaWYgKGxhc3QtPnMuY29kZSA9PSAoQlBGX0FMVXxCUEZfU1VCfEJQRl9YKSkgeworCQkJdmFsID0gYi0+dmFsW1hfQVRPTV07CisJCQlpZiAodm1hcFt2YWxdLmlzX2NvbnN0KSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBoYXZlIGEgc3VidHJhY3QgdG8gZG8gYSBjb21wYXJpc29uLAorCQkJCSAqIGFuZCB0aGUgWCByZWdpc3RlciBpcyBhIGtub3duIGNvbnN0YW50LAorCQkJCSAqIHdlIGNhbiBtZXJnZSB0aGlzIHZhbHVlIGludG8gdGhlCisJCQkJICogY29tcGFyaXNvbjoKKwkJCQkgKgorCQkJCSAqIHN1YiB4ICAtPglub3AKKwkJCQkgKiBqZXEgI3kJamVxICMoeCt5KQorCQkJCSAqLworCQkJCWItPnMuayArPSB2bWFwW3ZhbF0uY29uc3RfdmFsOworCQkJCWxhc3QtPnMuY29kZSA9IE5PUDsKKwkJCQlkb25lID0gMDsKKwkJCX0gZWxzZSBpZiAoYi0+cy5rID09IDApIHsKKwkJCQkvKgorCQkJCSAqIElmIHRoZSBYIHJlZ2lzdGVyIGlzbid0IGEgY29uc3RhbnQsCisJCQkJICogYW5kIHRoZSBjb21wYXJpc29uIGluIHRoZSB0ZXN0IGlzCisJCQkJICogYWdhaW5zdCAwLCB3ZSBjYW4gY29tcGFyZSB3aXRoIHRoZQorCQkJCSAqIFggcmVnaXN0ZXIsIGluc3RlYWQ6CisJCQkJICoKKwkJCQkgKiBzdWIgeCAgLT4Jbm9wCisJCQkJICogamVxICMwCWplcSB4CisJCQkJICovCisJCQkJbGFzdC0+cy5jb2RlID0gTk9QOworCQkJCWItPnMuY29kZSA9IEJQRl9KTVB8QlBGX0pFUXxCUEZfWDsKKwkJCQlkb25lID0gMDsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBMaWtld2lzZSwgYSBjb25zdGFudCBzdWJ0cmFjdCBjYW4gYmUgc2ltcGxpZmllZDoKKwkJICoKKwkJICogc3ViICN4IC0+CW5vcAorCQkgKiBqZXEgI3kgLT4JamVxICMoeCt5KQorCQkgKi8KKwkJZWxzZSBpZiAobGFzdC0+cy5jb2RlID09IChCUEZfQUxVfEJQRl9TVUJ8QlBGX0spKSB7CisJCQlsYXN0LT5zLmNvZGUgPSBOT1A7CisJCQliLT5zLmsgKz0gbGFzdC0+cy5rOworCQkJZG9uZSA9IDA7CisJCX0KKwkJLyoKKwkJICogQW5kLCBzaW1pbGFybHksIGEgY29uc3RhbnQgQU5EIGNhbiBiZSBzaW1wbGlmaWVkCisJCSAqIGlmIHdlJ3JlIHRlc3RpbmcgYWdhaW5zdCAwLCBpLmUuOgorCQkgKgorCQkgKiBhbmQgI2sJbm9wCisJCSAqIGplcSAjMCAgLT4JanNldCAjaworCQkgKi8KKwkJZWxzZSBpZiAobGFzdC0+cy5jb2RlID09IChCUEZfQUxVfEJQRl9BTkR8QlBGX0spICYmCisJCSAgICBiLT5zLmsgPT0gMCkgeworCQkJYi0+cy5rID0gbGFzdC0+cy5rOworCQkJYi0+cy5jb2RlID0gQlBGX0pNUHxCUEZfS3xCUEZfSlNFVDsKKwkJCWxhc3QtPnMuY29kZSA9IE5PUDsKKwkJCWRvbmUgPSAwOworCQkJb3B0X25vdChiKTsKKwkJfQorCX0KKwkvKgorCSAqIGpzZXQgIzAgICAgICAgIC0+ICAgbmV2ZXIKKwkgKiBqc2V0ICNmZmZmZmZmZiAtPiAgIGFsd2F5cworCSAqLworCWlmIChiLT5zLmNvZGUgPT0gKEJQRl9KTVB8QlBGX0t8QlBGX0pTRVQpKSB7CisJCWlmIChiLT5zLmsgPT0gMCkKKwkJCUpUKGIpID0gSkYoYik7CisJCWlmIChiLT5zLmsgPT0gMHhmZmZmZmZmZikKKwkJCUpGKGIpID0gSlQoYik7CisJfQorCS8qCisJICogSWYgd2UncmUgY29tcGFyaW5nIGFnYWluc3QgdGhlIGluZGV4IHJlZ2lzdGVyLCBhbmQgdGhlIGluZGV4CisJICogcmVnaXN0ZXIgaXMgYSBrbm93biBjb25zdGFudCwgd2UgY2FuIGp1c3QgY29tcGFyZSBhZ2FpbnN0IHRoYXQKKwkgKiBjb25zdGFudC4KKwkgKi8KKwl2YWwgPSBiLT52YWxbWF9BVE9NXTsKKwlpZiAodm1hcFt2YWxdLmlzX2NvbnN0ICYmIEJQRl9TUkMoYi0+cy5jb2RlKSA9PSBCUEZfWCkgeworCQlicGZfaW50MzIgdiA9IHZtYXBbdmFsXS5jb25zdF92YWw7CisJCWItPnMuY29kZSAmPSB+QlBGX1g7CisJCWItPnMuayA9IHY7CisJfQorCS8qCisJICogSWYgdGhlIGFjY3VtdWxhdG9yIGlzIGEga25vd24gY29uc3RhbnQsIHdlIGNhbiBjb21wdXRlIHRoZQorCSAqIGNvbXBhcmlzb24gcmVzdWx0LgorCSAqLworCXZhbCA9IGItPnZhbFtBX0FUT01dOworCWlmICh2bWFwW3ZhbF0uaXNfY29uc3QgJiYgQlBGX1NSQyhiLT5zLmNvZGUpID09IEJQRl9LKSB7CisJCWJwZl9pbnQzMiB2ID0gdm1hcFt2YWxdLmNvbnN0X3ZhbDsKKwkJc3dpdGNoIChCUEZfT1AoYi0+cy5jb2RlKSkgeworCisJCWNhc2UgQlBGX0pFUToKKwkJCXYgPSB2ID09IGItPnMuazsKKwkJCWJyZWFrOworCisJCWNhc2UgQlBGX0pHVDoKKwkJCXYgPSAodW5zaWduZWQpdiA+IGItPnMuazsKKwkJCWJyZWFrOworCisJCWNhc2UgQlBGX0pHRToKKwkJCXYgPSAodW5zaWduZWQpdiA+PSBiLT5zLms7CisJCQlicmVhazsKKworCQljYXNlIEJQRl9KU0VUOgorCQkJdiAmPSBiLT5zLms7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYWJvcnQoKTsKKwkJfQorCQlpZiAoSkYoYikgIT0gSlQoYikpCisJCQlkb25lID0gMDsKKwkJaWYgKHYpCisJCQlKRihiKSA9IEpUKGIpOworCQllbHNlCisJCQlKVChiKSA9IEpGKGIpOworCX0KK30KKworLyoKKyAqIENvbXB1dGUgdGhlIHN5bWJvbGljIHZhbHVlIG9mIGV4cHJlc3Npb24gb2YgJ3MnLCBhbmQgdXBkYXRlCisgKiBhbnl0aGluZyBpdCBkZWZpbmVzIGluIHRoZSB2YWx1ZSB0YWJsZSAndmFsJy4gIElmICdhbHRlcicgaXMgdHJ1ZSwKKyAqIGRvIHZhcmlvdXMgb3B0aW1pemF0aW9ucy4gIFRoaXMgY29kZSB3b3VsZCBiZSBjbGVhbmVyIGlmIHN5bWJvbGljCisgKiBldmFsdWF0aW9uIGFuZCBjb2RlIHRyYW5zZm9ybWF0aW9ucyB3ZXJlbid0IGZvbGRlZCB0b2dldGhlci4KKyAqLworc3RhdGljIHZvaWQKK29wdF9zdG10KHMsIHZhbCwgYWx0ZXIpCisJc3RydWN0IHN0bXQgKnM7CisJaW50IHZhbFtdOworCWludCBhbHRlcjsKK3sKKwlpbnQgb3A7CisJaW50IHY7CisKKwlzd2l0Y2ggKHMtPmNvZGUpIHsKKworCWNhc2UgQlBGX0xEfEJQRl9BQlN8QlBGX1c6CisJY2FzZSBCUEZfTER8QlBGX0FCU3xCUEZfSDoKKwljYXNlIEJQRl9MRHxCUEZfQUJTfEJQRl9COgorCQl2ID0gRihzLT5jb2RlLCBzLT5rLCAwTCk7CisJCXZzdG9yZShzLCAmdmFsW0FfQVRPTV0sIHYsIGFsdGVyKTsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRHxCUEZfSU5EfEJQRl9XOgorCWNhc2UgQlBGX0xEfEJQRl9JTkR8QlBGX0g6CisJY2FzZSBCUEZfTER8QlBGX0lORHxCUEZfQjoKKwkJdiA9IHZhbFtYX0FUT01dOworCQlpZiAoYWx0ZXIgJiYgdm1hcFt2XS5pc19jb25zdCkgeworCQkJcy0+Y29kZSA9IEJQRl9MRHxCUEZfQUJTfEJQRl9TSVpFKHMtPmNvZGUpOworCQkJcy0+ayArPSB2bWFwW3ZdLmNvbnN0X3ZhbDsKKwkJCXYgPSBGKHMtPmNvZGUsIHMtPmssIDBMKTsKKwkJCWRvbmUgPSAwOworCQl9CisJCWVsc2UKKwkJCXYgPSBGKHMtPmNvZGUsIHMtPmssIHYpOworCQl2c3RvcmUocywgJnZhbFtBX0FUT01dLCB2LCBhbHRlcik7CisJCWJyZWFrOworCisJY2FzZSBCUEZfTER8QlBGX0xFTjoKKwkJdiA9IEYocy0+Y29kZSwgMEwsIDBMKTsKKwkJdnN0b3JlKHMsICZ2YWxbQV9BVE9NXSwgdiwgYWx0ZXIpOworCQlicmVhazsKKworCWNhc2UgQlBGX0xEfEJQRl9JTU06CisJCXYgPSBLKHMtPmspOworCQl2c3RvcmUocywgJnZhbFtBX0FUT01dLCB2LCBhbHRlcik7CisJCWJyZWFrOworCisJY2FzZSBCUEZfTERYfEJQRl9JTU06CisJCXYgPSBLKHMtPmspOworCQl2c3RvcmUocywgJnZhbFtYX0FUT01dLCB2LCBhbHRlcik7CisJCWJyZWFrOworCisJY2FzZSBCUEZfTERYfEJQRl9NU0h8QlBGX0I6CisJCXYgPSBGKHMtPmNvZGUsIHMtPmssIDBMKTsKKwkJdnN0b3JlKHMsICZ2YWxbWF9BVE9NXSwgdiwgYWx0ZXIpOworCQlicmVhazsKKworCWNhc2UgQlBGX0FMVXxCUEZfTkVHOgorCQlpZiAoYWx0ZXIgJiYgdm1hcFt2YWxbQV9BVE9NXV0uaXNfY29uc3QpIHsKKwkJCXMtPmNvZGUgPSBCUEZfTER8QlBGX0lNTTsKKwkJCXMtPmsgPSAtdm1hcFt2YWxbQV9BVE9NXV0uY29uc3RfdmFsOworCQkJdmFsW0FfQVRPTV0gPSBLKHMtPmspOworCQl9CisJCWVsc2UKKwkJCXZhbFtBX0FUT01dID0gRihzLT5jb2RlLCB2YWxbQV9BVE9NXSwgMEwpOworCQlicmVhazsKKworCWNhc2UgQlBGX0FMVXxCUEZfQUREfEJQRl9LOgorCWNhc2UgQlBGX0FMVXxCUEZfU1VCfEJQRl9LOgorCWNhc2UgQlBGX0FMVXxCUEZfTVVMfEJQRl9LOgorCWNhc2UgQlBGX0FMVXxCUEZfRElWfEJQRl9LOgorCWNhc2UgQlBGX0FMVXxCUEZfQU5EfEJQRl9LOgorCWNhc2UgQlBGX0FMVXxCUEZfT1J8QlBGX0s6CisJY2FzZSBCUEZfQUxVfEJQRl9MU0h8QlBGX0s6CisJY2FzZSBCUEZfQUxVfEJQRl9SU0h8QlBGX0s6CisJCW9wID0gQlBGX09QKHMtPmNvZGUpOworCQlpZiAoYWx0ZXIpIHsKKwkJCWlmIChzLT5rID09IDApIHsKKwkJCQkvKiBkb24ndCBvcHRpbWl6ZSBhd2F5ICJzdWIgIzAiCisJCQkJICogYXMgaXQgbWF5IGJlIG5lZWRlZCBsYXRlciB0bworCQkJCSAqIGZpeHVwIHRoZSBnZW5lcmF0ZWQgbWF0aCBjb2RlICovCisJCQkJaWYgKG9wID09IEJQRl9BREQgfHwKKwkJCQkgICAgb3AgPT0gQlBGX0xTSCB8fCBvcCA9PSBCUEZfUlNIIHx8CisJCQkJICAgIG9wID09IEJQRl9PUikgeworCQkJCQlzLT5jb2RlID0gTk9QOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKG9wID09IEJQRl9NVUwgfHwgb3AgPT0gQlBGX0FORCkgeworCQkJCQlzLT5jb2RlID0gQlBGX0xEfEJQRl9JTU07CisJCQkJCXZhbFtBX0FUT01dID0gSyhzLT5rKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHZtYXBbdmFsW0FfQVRPTV1dLmlzX2NvbnN0KSB7CisJCQkJZm9sZF9vcChzLCB2YWxbQV9BVE9NXSwgSyhzLT5rKSk7CisJCQkJdmFsW0FfQVRPTV0gPSBLKHMtPmspOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXZhbFtBX0FUT01dID0gRihzLT5jb2RlLCB2YWxbQV9BVE9NXSwgSyhzLT5rKSk7CisJCWJyZWFrOworCisJY2FzZSBCUEZfQUxVfEJQRl9BRER8QlBGX1g6CisJY2FzZSBCUEZfQUxVfEJQRl9TVUJ8QlBGX1g6CisJY2FzZSBCUEZfQUxVfEJQRl9NVUx8QlBGX1g6CisJY2FzZSBCUEZfQUxVfEJQRl9ESVZ8QlBGX1g6CisJY2FzZSBCUEZfQUxVfEJQRl9BTkR8QlBGX1g6CisJY2FzZSBCUEZfQUxVfEJQRl9PUnxCUEZfWDoKKwljYXNlIEJQRl9BTFV8QlBGX0xTSHxCUEZfWDoKKwljYXNlIEJQRl9BTFV8QlBGX1JTSHxCUEZfWDoKKwkJb3AgPSBCUEZfT1Aocy0+Y29kZSk7CisJCWlmIChhbHRlciAmJiB2bWFwW3ZhbFtYX0FUT01dXS5pc19jb25zdCkgeworCQkJaWYgKHZtYXBbdmFsW0FfQVRPTV1dLmlzX2NvbnN0KSB7CisJCQkJZm9sZF9vcChzLCB2YWxbQV9BVE9NXSwgdmFsW1hfQVRPTV0pOworCQkJCXZhbFtBX0FUT01dID0gSyhzLT5rKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXMtPmNvZGUgPSBCUEZfQUxVfEJQRl9LfG9wOworCQkJCXMtPmsgPSB2bWFwW3ZhbFtYX0FUT01dXS5jb25zdF92YWw7CisJCQkJZG9uZSA9IDA7CisJCQkJdmFsW0FfQVRPTV0gPQorCQkJCQlGKHMtPmNvZGUsIHZhbFtBX0FUT01dLCBLKHMtPmspKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIENoZWNrIGlmIHdlJ3JlIGRvaW5nIHNvbWV0aGluZyB0byBhbiBhY2N1bXVsYXRvcgorCQkgKiB0aGF0IGlzIDAsIGFuZCBzaW1wbGlmeS4gIFRoaXMgbWF5IG5vdCBzZWVtIGxpa2UKKwkJICogbXVjaCBvZiBhIHNpbXBsaWZpY2F0aW9uIGJ1dCBpdCBjb3VsZCBvcGVuIHVwIGZ1cnRoZXIKKwkJICogb3B0aW1pemF0aW9ucy4KKwkJICogWFhYIFdlIGNvdWxkIGFsc28gY2hlY2sgZm9yIG11bCBieSAxLCBldGMuCisJCSAqLworCQlpZiAoYWx0ZXIgJiYgdm1hcFt2YWxbQV9BVE9NXV0uaXNfY29uc3QKKwkJICAgICYmIHZtYXBbdmFsW0FfQVRPTV1dLmNvbnN0X3ZhbCA9PSAwKSB7CisJCQlpZiAob3AgPT0gQlBGX0FERCB8fCBvcCA9PSBCUEZfT1IpIHsKKwkJCQlzLT5jb2RlID0gQlBGX01JU0N8QlBGX1RYQTsKKwkJCQl2c3RvcmUocywgJnZhbFtBX0FUT01dLCB2YWxbWF9BVE9NXSwgYWx0ZXIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZWxzZSBpZiAob3AgPT0gQlBGX01VTCB8fCBvcCA9PSBCUEZfRElWIHx8CisJCQkJIG9wID09IEJQRl9BTkQgfHwgb3AgPT0gQlBGX0xTSCB8fCBvcCA9PSBCUEZfUlNIKSB7CisJCQkJcy0+Y29kZSA9IEJQRl9MRHxCUEZfSU1NOworCQkJCXMtPmsgPSAwOworCQkJCXZzdG9yZShzLCAmdmFsW0FfQVRPTV0sIEsocy0+ayksIGFsdGVyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKG9wID09IEJQRl9ORUcpIHsKKwkJCQlzLT5jb2RlID0gTk9QOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXZhbFtBX0FUT01dID0gRihzLT5jb2RlLCB2YWxbQV9BVE9NXSwgdmFsW1hfQVRPTV0pOworCQlicmVhazsKKworCWNhc2UgQlBGX01JU0N8QlBGX1RYQToKKwkJdnN0b3JlKHMsICZ2YWxbQV9BVE9NXSwgdmFsW1hfQVRPTV0sIGFsdGVyKTsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRHxCUEZfTUVNOgorCQl2ID0gdmFsW3MtPmtdOworCQlpZiAoYWx0ZXIgJiYgdm1hcFt2XS5pc19jb25zdCkgeworCQkJcy0+Y29kZSA9IEJQRl9MRHxCUEZfSU1NOworCQkJcy0+ayA9IHZtYXBbdl0uY29uc3RfdmFsOworCQkJZG9uZSA9IDA7CisJCX0KKwkJdnN0b3JlKHMsICZ2YWxbQV9BVE9NXSwgdiwgYWx0ZXIpOworCQlicmVhazsKKworCWNhc2UgQlBGX01JU0N8QlBGX1RBWDoKKwkJdnN0b3JlKHMsICZ2YWxbWF9BVE9NXSwgdmFsW0FfQVRPTV0sIGFsdGVyKTsKKwkJYnJlYWs7CisKKwljYXNlIEJQRl9MRFh8QlBGX01FTToKKwkJdiA9IHZhbFtzLT5rXTsKKwkJaWYgKGFsdGVyICYmIHZtYXBbdl0uaXNfY29uc3QpIHsKKwkJCXMtPmNvZGUgPSBCUEZfTERYfEJQRl9JTU07CisJCQlzLT5rID0gdm1hcFt2XS5jb25zdF92YWw7CisJCQlkb25lID0gMDsKKwkJfQorCQl2c3RvcmUocywgJnZhbFtYX0FUT01dLCB2LCBhbHRlcik7CisJCWJyZWFrOworCisJY2FzZSBCUEZfU1Q6CisJCXZzdG9yZShzLCAmdmFsW3MtPmtdLCB2YWxbQV9BVE9NXSwgYWx0ZXIpOworCQlicmVhazsKKworCWNhc2UgQlBGX1NUWDoKKwkJdnN0b3JlKHMsICZ2YWxbcy0+a10sIHZhbFtYX0FUT01dLCBhbHRlcik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQKK2RlYWRzdG10KHMsIGxhc3QpCisJcmVnaXN0ZXIgc3RydWN0IHN0bXQgKnM7CisJcmVnaXN0ZXIgc3RydWN0IHN0bXQgKmxhc3RbXTsKK3sKKwlyZWdpc3RlciBpbnQgYXRvbTsKKworCWF0b20gPSBhdG9tdXNlKHMpOworCWlmIChhdG9tID49IDApIHsKKwkJaWYgKGF0b20gPT0gQVhfQVRPTSkgeworCQkJbGFzdFtYX0FUT01dID0gMDsKKwkJCWxhc3RbQV9BVE9NXSA9IDA7CisJCX0KKwkJZWxzZQorCQkJbGFzdFthdG9tXSA9IDA7CisJfQorCWF0b20gPSBhdG9tZGVmKHMpOworCWlmIChhdG9tID49IDApIHsKKwkJaWYgKGxhc3RbYXRvbV0pIHsKKwkJCWRvbmUgPSAwOworCQkJbGFzdFthdG9tXS0+Y29kZSA9IE5PUDsKKwkJfQorCQlsYXN0W2F0b21dID0gczsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitvcHRfZGVhZHN0b3JlcyhiKQorCXJlZ2lzdGVyIHN0cnVjdCBibG9jayAqYjsKK3sKKwlyZWdpc3RlciBzdHJ1Y3Qgc2xpc3QgKnM7CisJcmVnaXN0ZXIgaW50IGF0b207CisJc3RydWN0IHN0bXQgKmxhc3RbTl9BVE9NU107CisKKwltZW1zZXQoKGNoYXIgKilsYXN0LCAwLCBzaXplb2YgbGFzdCk7CisKKwlmb3IgKHMgPSBiLT5zdG10czsgcyAhPSAwOyBzID0gcy0+bmV4dCkKKwkJZGVhZHN0bXQoJnMtPnMsIGxhc3QpOworCWRlYWRzdG10KCZiLT5zLCBsYXN0KTsKKworCWZvciAoYXRvbSA9IDA7IGF0b20gPCBOX0FUT01TOyArK2F0b20pCisJCWlmIChsYXN0W2F0b21dICYmICFBVE9NRUxFTShiLT5vdXRfdXNlLCBhdG9tKSkgeworCQkJbGFzdFthdG9tXS0+Y29kZSA9IE5PUDsKKwkJCWRvbmUgPSAwOworCQl9Cit9CisKK3N0YXRpYyB2b2lkCitvcHRfYmxrKGIsIGRvX3N0bXRzKQorCXN0cnVjdCBibG9jayAqYjsKKwlpbnQgZG9fc3RtdHM7Cit7CisJc3RydWN0IHNsaXN0ICpzOworCXN0cnVjdCBlZGdlICpwOworCWludCBpOworCWJwZl9pbnQzMiBhdmFsLCB4dmFsOworCisjaWYgMAorCWZvciAocyA9IGItPnN0bXRzOyBzICYmIHMtPm5leHQ7IHMgPSBzLT5uZXh0KQorCQlpZiAoQlBGX0NMQVNTKHMtPnMuY29kZSkgPT0gQlBGX0pNUCkgeworCQkJZG9fc3RtdHMgPSAwOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBhdG9tIHZhbHVlcy4KKwkgKi8KKwlwID0gYi0+aW5fZWRnZXM7CisJaWYgKHAgPT0gMCkgeworCQkvKgorCQkgKiBXZSBoYXZlIG5vIHByZWRlY2Vzc29ycywgc28gZXZlcnl0aGluZyBpcyB1bmRlZmluZWQKKwkJICogdXBvbiBlbnRyeSB0byB0aGlzIGJsb2NrLgorCQkgKi8KKwkJbWVtc2V0KChjaGFyICopYi0+dmFsLCAwLCBzaXplb2YoYi0+dmFsKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSW5oZXJpdCB2YWx1ZXMgZnJvbSBvdXIgcHJlZGVjZXNzb3JzLgorCQkgKgorCQkgKiBGaXJzdCwgZ2V0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgcHJlZGVjZXNzb3IgYWxvbmcgdGhlCisJCSAqIGZpcnN0IGVkZ2UgbGVhZGluZyB0byB0aGlzIG5vZGUuCisJCSAqLworCQltZW1jcHkoKGNoYXIgKiliLT52YWwsIChjaGFyICopcC0+cHJlZC0+dmFsLCBzaXplb2YoYi0+dmFsKSk7CisJCS8qCisJCSAqIE5vdyBsb29rIGF0IGFsbCB0aGUgb3RoZXIgbm9kZXMgbGVhZGluZyB0byB0aGlzIG5vZGUuCisJCSAqIElmLCBmb3IgdGhlIHByZWRlY2Vzc29yIGFsb25nIHRoYXQgZWRnZSwgYSByZWdpc3RlcgorCQkgKiBoYXMgYSBkaWZmZXJlbnQgdmFsdWUgZnJvbSB0aGUgb25lIHdlIGhhdmUgKGkuZS4sCisJCSAqIGNvbnRyb2wgcGF0aHMgYXJlIG1lcmdpbmcsIGFuZCB0aGUgbWVyZ2luZyBwYXRocworCQkgKiBhc3NpZ24gZGlmZmVyZW50IHZhbHVlcyB0byB0aGF0IHJlZ2lzdGVyKSwgZ2l2ZSB0aGUKKwkJICogcmVnaXN0ZXIgdGhlIHVuZGVmaW5lZCB2YWx1ZSBvZiAwLgorCQkgKi8KKwkJd2hpbGUgKChwID0gcC0+bmV4dCkgIT0gTlVMTCkgeworCQkJZm9yIChpID0gMDsgaSA8IE5fQVRPTVM7ICsraSkKKwkJCQlpZiAoYi0+dmFsW2ldICE9IHAtPnByZWQtPnZhbFtpXSkKKwkJCQkJYi0+dmFsW2ldID0gMDsKKwkJfQorCX0KKwlhdmFsID0gYi0+dmFsW0FfQVRPTV07CisJeHZhbCA9IGItPnZhbFtYX0FUT01dOworCWZvciAocyA9IGItPnN0bXRzOyBzOyBzID0gcy0+bmV4dCkKKwkJb3B0X3N0bXQoJnMtPnMsIGItPnZhbCwgZG9fc3RtdHMpOworCisJLyoKKwkgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlOiBpZiB3ZSBkb24ndCB1c2UgYW55dGhpbmcgZnJvbSB0aGlzCisJICogYmxvY2ssIGFuZCB3ZSBsb2FkIHRoZSBhY2N1bXVsYXRvciBvciBpbmRleCByZWdpc3RlciB3aXRoIGEKKwkgKiB2YWx1ZSB0aGF0IGlzIGFscmVhZHkgdGhlcmUsIG9yIGlmIHRoaXMgYmxvY2sgaXMgYSByZXR1cm4sCisJICogZWxpbWluYXRlIGFsbCB0aGUgc3RhdGVtZW50cy4KKwkgKgorCSAqIFhYWCAtIHdoYXQgaWYgaXQgZG9lcyBhIHN0b3JlPworCSAqCisJICogWFhYIC0gd2h5IGRvZXMgaXQgbWF0dGVyIHdoZXRoZXIgd2UgdXNlIGFueXRoaW5nIGZyb20gdGhpcworCSAqIGJsb2NrPyAgSWYgdGhlIGFjY3VtdWxhdG9yIG9yIGluZGV4IHJlZ2lzdGVyIGRvZXNuJ3QgY2hhbmdlCisJICogaXRzIHZhbHVlLCBpc24ndCB0aGF0IE9LIGV2ZW4gaWYgd2UgdXNlIHRoYXQgdmFsdWU/CisJICoKKwkgKiBYWFggLSBpZiB3ZSBsb2FkIHRoZSBhY2N1bXVsYXRvciB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLAorCSAqIGFuZCB0aGUgYmxvY2sgZW5kcyB3aXRoIGEgY29uZGl0aW9uYWwgYnJhbmNoLCB3ZSBvYnZpb3VzbHkKKwkgKiBjYW4ndCBlbGltaW5hdGUgaXQsIGFzIHRoZSBicmFuY2ggZGVwZW5kcyBvbiB0aGF0IHZhbHVlLgorCSAqIEZvciB0aGUgaW5kZXggcmVnaXN0ZXIsIHRoZSBjb25kaXRpb25hbCBicmFuY2ggb25seSBkZXBlbmRzCisJICogb24gdGhlIGluZGV4IHJlZ2lzdGVyIHZhbHVlIGlmIHRoZSB0ZXN0IGlzIGFnYWluc3QgdGhlIGluZGV4CisJICogcmVnaXN0ZXIgdmFsdWUgcmF0aGVyIHRoYW4gYSBjb25zdGFudDsgaWYgbm90aGluZyB1c2VzIHRoZQorCSAqIHZhbHVlIHdlIHB1dCBpbnRvIHRoZSBpbmRleCByZWdpc3RlciwgYW5kIHdlJ3JlIG5vdCB0ZXN0aW5nCisJICogYWdhaW5zdCB0aGUgaW5kZXggcmVnaXN0ZXIncyB2YWx1ZSwgYW5kIHRoZXJlIGFyZW4ndCBhbnkKKwkgKiBvdGhlciBwcm9ibGVtcyB0aGF0IHdvdWxkIGtlZXAgdXMgZnJvbSBlbGltaW5hdGluZyB0aGlzCisJICogYmxvY2ssIGNhbiB3ZSBlbGltaW5hdGUgaXQ/CisJICovCisJaWYgKGRvX3N0bXRzICYmCisJICAgICgoYi0+b3V0X3VzZSA9PSAwICYmIGF2YWwgIT0gMCAmJiBiLT52YWxbQV9BVE9NXSA9PSBhdmFsICYmCisJICAgICAgeHZhbCAhPSAwICYmIGItPnZhbFtYX0FUT01dID09IHh2YWwpIHx8CisJICAgICBCUEZfQ0xBU1MoYi0+cy5jb2RlKSA9PSBCUEZfUkVUKSkgeworCQlpZiAoYi0+c3RtdHMgIT0gMCkgeworCQkJYi0+c3RtdHMgPSAwOworCQkJZG9uZSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlvcHRfcGVlcChiKTsKKwkJb3B0X2RlYWRzdG9yZXMoYik7CisJfQorCS8qCisJICogU2V0IHVwIHZhbHVlcyBmb3IgYnJhbmNoIG9wdGltaXplci4KKwkgKi8KKwlpZiAoQlBGX1NSQyhiLT5zLmNvZGUpID09IEJQRl9LKQorCQliLT5vdmFsID0gSyhiLT5zLmspOworCWVsc2UKKwkJYi0+b3ZhbCA9IGItPnZhbFtYX0FUT01dOworCWItPmV0LmNvZGUgPSBiLT5zLmNvZGU7CisJYi0+ZWYuY29kZSA9IC1iLT5zLmNvZGU7Cit9CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBhbnkgcmVnaXN0ZXIgdGhhdCBpcyB1c2VkIG9uIGV4aXQgZnJvbSAnc3VjYycsIGhhcworICogYW4gZXhpdCB2YWx1ZSB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGV4aXQgdmFsdWUKKyAqIGZyb20gJ2InLgorICovCitzdGF0aWMgaW50Cit1c2VfY29uZmxpY3QoYiwgc3VjYykKKwlzdHJ1Y3QgYmxvY2sgKmIsICpzdWNjOworeworCWludCBhdG9tOworCWF0b21zZXQgdXNlID0gc3VjYy0+b3V0X3VzZTsKKworCWlmICh1c2UgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGF0b20gPSAwOyBhdG9tIDwgTl9BVE9NUzsgKythdG9tKQorCQlpZiAoQVRPTUVMRU0odXNlLCBhdG9tKSkKKwkJCWlmIChiLT52YWxbYXRvbV0gIT0gc3VjYy0+dmFsW2F0b21dKQorCQkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGJsb2NrICoKK2ZvbGRfZWRnZShjaGlsZCwgZXApCisJc3RydWN0IGJsb2NrICpjaGlsZDsKKwlzdHJ1Y3QgZWRnZSAqZXA7Cit7CisJaW50IHNlbnNlOworCWludCBhdmFsMCwgYXZhbDEsIG92YWwwLCBvdmFsMTsKKwlpbnQgY29kZSA9IGVwLT5jb2RlOworCisJaWYgKGNvZGUgPCAwKSB7CisJCWNvZGUgPSAtY29kZTsKKwkJc2Vuc2UgPSAwOworCX0gZWxzZQorCQlzZW5zZSA9IDE7CisKKwlpZiAoY2hpbGQtPnMuY29kZSAhPSBjb2RlKQorCQlyZXR1cm4gMDsKKworCWF2YWwwID0gY2hpbGQtPnZhbFtBX0FUT01dOworCW92YWwwID0gY2hpbGQtPm92YWw7CisJYXZhbDEgPSBlcC0+cHJlZC0+dmFsW0FfQVRPTV07CisJb3ZhbDEgPSBlcC0+cHJlZC0+b3ZhbDsKKworCWlmIChhdmFsMCAhPSBhdmFsMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAob3ZhbDAgPT0gb3ZhbDEpCisJCS8qCisJCSAqIFRoZSBvcGVyYW5kcyBvZiB0aGUgYnJhbmNoIGluc3RydWN0aW9ucyBhcmUKKwkJICogaWRlbnRpY2FsLCBzbyB0aGUgcmVzdWx0IGlzIHRydWUgaWYgYSB0cnVlCisJCSAqIGJyYW5jaCB3YXMgdGFrZW4gdG8gZ2V0IGhlcmUsIG90aGVyd2lzZSBmYWxzZS4KKwkJICovCisJCXJldHVybiBzZW5zZSA/IEpUKGNoaWxkKSA6IEpGKGNoaWxkKTsKKworCWlmIChzZW5zZSAmJiBjb2RlID09IChCUEZfSk1QfEJQRl9KRVF8QlBGX0spKQorCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50LCB3ZSBvbmx5IGtub3cgdGhlIGNvbXBhcmlzb24gaWYgd2UKKwkJICogY2FtZSBkb3duIHRoZSB0cnVlIGJyYW5jaCwgYW5kIGl0IHdhcyBhbiBlcXVhbGl0eQorCQkgKiBjb21wYXJpc29uIHdpdGggYSBjb25zdGFudC4KKwkJICoKKwkJICogSS5lLiwgaWYgd2UgY2FtZSBkb3duIHRoZSB0cnVlIGJyYW5jaCwgYW5kIHRoZSBicmFuY2gKKwkJICogd2FzIGFuIGVxdWFsaXR5IGNvbXBhcmlzb24gd2l0aCBhIGNvbnN0YW50LCB3ZSBrbm93IHRoZQorCQkgKiBhY2N1bXVsYXRvciBjb250YWlucyB0aGF0IGNvbnN0YW50LiAgSWYgd2UgY2FtZSBkb3duCisJCSAqIHRoZSBmYWxzZSBicmFuY2gsIG9yIHRoZSBjb21wYXJpc29uIHdhc24ndCB3aXRoIGEKKwkJICogY29uc3RhbnQsIHdlIGRvbid0IGtub3cgd2hhdCB3YXMgaW4gdGhlIGFjY3VtdWxhdG9yLgorCQkgKgorCQkgKiBXZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgZGlzdGluY3QgY29uc3RhbnRzIGhhdmUgZGlzdGluY3QKKwkJICogdmFsdWUgbnVtYmVycy4KKwkJICovCisJCXJldHVybiBKRihjaGlsZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK29wdF9qKGVwKQorCXN0cnVjdCBlZGdlICplcDsKK3sKKwlyZWdpc3RlciBpbnQgaSwgazsKKwlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKnRhcmdldDsKKworCWlmIChKVChlcC0+c3VjYykgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKEpUKGVwLT5zdWNjKSA9PSBKRihlcC0+c3VjYykpIHsKKwkJLyoKKwkJICogQ29tbW9uIGJyYW5jaCB0YXJnZXRzIGNhbiBiZSBlbGltaW5hdGVkLCBwcm92aWRlZAorCQkgKiB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kuCisJCSAqLworCQlpZiAoIXVzZV9jb25mbGljdChlcC0+cHJlZCwgZXAtPnN1Y2MtPmV0LnN1Y2MpKSB7CisJCQlkb25lID0gMDsKKwkJCWVwLT5zdWNjID0gSlQoZXAtPnN1Y2MpOworCQl9CisJfQorCS8qCisJICogRm9yIGVhY2ggZWRnZSBkb21pbmF0b3IgdGhhdCBtYXRjaGVzIHRoZSBzdWNjZXNzb3Igb2YgdGhpcworCSAqIGVkZ2UsIHByb21vdGUgdGhlIGVkZ2Ugc3VjY2Vzc29yIHRvIHRoZSBpdHMgZ3JhbmRjaGlsZC4KKwkgKgorCSAqIFhYWCBXZSB2aW9sYXRlIHRoZSBzZXQgYWJzdHJhY3Rpb24gaGVyZSBpbiBmYXZvciBhIHJlYXNvbmFibHkKKwkgKiBlZmZpY2llbnQgbG9vcC4KKwkgKi8KKyB0b3A6CisJZm9yIChpID0gMDsgaSA8IGVkZ2V3b3JkczsgKytpKSB7CisJCXJlZ2lzdGVyIGJwZl91X2ludDMyIHggPSBlcC0+ZWRvbVtpXTsKKworCQl3aGlsZSAoeCAhPSAwKSB7CisJCQlrID0gZmZzKHgpIC0gMTsKKwkJCXggJj1+ICgxIDw8IGspOworCQkJayArPSBpICogQklUU19QRVJfV09SRDsKKworCQkJdGFyZ2V0ID0gZm9sZF9lZGdlKGVwLT5zdWNjLCBlZGdlc1trXSk7CisJCQkvKgorCQkJICogQ2hlY2sgdGhhdCB0aGVyZSBpcyBubyBkYXRhIGRlcGVuZGVuY3kgYmV0d2VlbgorCQkJICogbm9kZXMgdGhhdCB3aWxsIGJlIHZpb2xhdGVkIGlmIHdlIG1vdmUgdGhlIGVkZ2UuCisJCQkgKi8KKwkJCWlmICh0YXJnZXQgIT0gMCAmJiAhdXNlX2NvbmZsaWN0KGVwLT5wcmVkLCB0YXJnZXQpKSB7CisJCQkJZG9uZSA9IDA7CisJCQkJZXAtPnN1Y2MgPSB0YXJnZXQ7CisJCQkJaWYgKEpUKHRhcmdldCkgIT0gMCkKKwkJCQkJLyoKKwkJCQkJICogU3RhcnQgb3ZlciB1bmxlc3Mgd2UgaGl0IGEgbGVhZi4KKwkJCQkJICovCisJCQkJCWdvdG8gdG9wOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZAorb3JfcHVsbHVwKGIpCisJc3RydWN0IGJsb2NrICpiOworeworCWludCB2YWwsIGF0X3RvcDsKKwlzdHJ1Y3QgYmxvY2sgKnB1bGw7CisJc3RydWN0IGJsb2NrICoqZGlmZnAsICoqc2FtZXA7CisJc3RydWN0IGVkZ2UgKmVwOworCisJZXAgPSBiLT5pbl9lZGdlczsKKwlpZiAoZXAgPT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBNYWtlIHN1cmUgZWFjaCBwcmVkZWNlc3NvciBsb2FkcyB0aGUgc2FtZSB2YWx1ZS4KKwkgKiBYWFggd2h5PworCSAqLworCXZhbCA9IGVwLT5wcmVkLT52YWxbQV9BVE9NXTsKKwlmb3IgKGVwID0gZXAtPm5leHQ7IGVwICE9IDA7IGVwID0gZXAtPm5leHQpCisJCWlmICh2YWwgIT0gZXAtPnByZWQtPnZhbFtBX0FUT01dKQorCQkJcmV0dXJuOworCisJaWYgKEpUKGItPmluX2VkZ2VzLT5wcmVkKSA9PSBiKQorCQlkaWZmcCA9ICZKVChiLT5pbl9lZGdlcy0+cHJlZCk7CisJZWxzZQorCQlkaWZmcCA9ICZKRihiLT5pbl9lZGdlcy0+cHJlZCk7CisKKwlhdF90b3AgPSAxOworCXdoaWxlICgxKSB7CisJCWlmICgqZGlmZnAgPT0gMCkKKwkJCXJldHVybjsKKworCQlpZiAoSlQoKmRpZmZwKSAhPSBKVChiKSkKKwkJCXJldHVybjsKKworCQlpZiAoIVNFVF9NRU1CRVIoKCpkaWZmcCktPmRvbSwgYi0+aWQpKQorCQkJcmV0dXJuOworCisJCWlmICgoKmRpZmZwKS0+dmFsW0FfQVRPTV0gIT0gdmFsKQorCQkJYnJlYWs7CisKKwkJZGlmZnAgPSAmSkYoKmRpZmZwKTsKKwkJYXRfdG9wID0gMDsKKwl9CisJc2FtZXAgPSAmSkYoKmRpZmZwKTsKKwl3aGlsZSAoMSkgeworCQlpZiAoKnNhbWVwID09IDApCisJCQlyZXR1cm47CisKKwkJaWYgKEpUKCpzYW1lcCkgIT0gSlQoYikpCisJCQlyZXR1cm47CisKKwkJaWYgKCFTRVRfTUVNQkVSKCgqc2FtZXApLT5kb20sIGItPmlkKSkKKwkJCXJldHVybjsKKworCQlpZiAoKCpzYW1lcCktPnZhbFtBX0FUT01dID09IHZhbCkKKwkJCWJyZWFrOworCisJCS8qIFhYWCBOZWVkIHRvIGNoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGRhdGEgZGVwZW5kZW5jaWVzCisJCSAgIGJldHdlZW4gZHAwIGFuZCBkcDEuICBDdXJyZW50bHksIHRoZSBjb2RlIGdlbmVyYXRvcgorCQkgICB3aWxsIG5vdCBwcm9kdWNlIHN1Y2ggZGVwZW5kZW5jaWVzLiAqLworCQlzYW1lcCA9ICZKRigqc2FtZXApOworCX0KKyNpZmRlZiBub3RkZWYKKwkvKiBYWFggVGhpcyBkb2Vzbid0IGNvdmVyIGV2ZXJ5dGhpbmcuICovCisJZm9yIChpID0gMDsgaSA8IE5fQVRPTVM7ICsraSkKKwkJaWYgKCgqc2FtZXApLT52YWxbaV0gIT0gcHJlZC0+dmFsW2ldKQorCQkJcmV0dXJuOworI2VuZGlmCisJLyogUHVsbCB1cCB0aGUgbm9kZS4gKi8KKwlwdWxsID0gKnNhbWVwOworCSpzYW1lcCA9IEpGKHB1bGwpOworCUpGKHB1bGwpID0gKmRpZmZwOworCisJLyoKKwkgKiBBdCB0aGUgdG9wIG9mIHRoZSBjaGFpbiwgZWFjaCBwcmVkZWNlc3NvciBuZWVkcyB0byBwb2ludCBhdCB0aGUKKwkgKiBwdWxsZWQgdXAgbm9kZS4gIEluc2lkZSB0aGUgY2hhaW4sIHRoZXJlIGlzIG9ubHkgb25lIHByZWRlY2Vzc29yCisJICogdG8gd29ycnkgYWJvdXQuCisJICovCisJaWYgKGF0X3RvcCkgeworCQlmb3IgKGVwID0gYi0+aW5fZWRnZXM7IGVwICE9IDA7IGVwID0gZXAtPm5leHQpIHsKKwkJCWlmIChKVChlcC0+cHJlZCkgPT0gYikKKwkJCQlKVChlcC0+cHJlZCkgPSBwdWxsOworCQkJZWxzZQorCQkJCUpGKGVwLT5wcmVkKSA9IHB1bGw7CisJCX0KKwl9CisJZWxzZQorCQkqZGlmZnAgPSBwdWxsOworCisJZG9uZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCithbmRfcHVsbHVwKGIpCisJc3RydWN0IGJsb2NrICpiOworeworCWludCB2YWwsIGF0X3RvcDsKKwlzdHJ1Y3QgYmxvY2sgKnB1bGw7CisJc3RydWN0IGJsb2NrICoqZGlmZnAsICoqc2FtZXA7CisJc3RydWN0IGVkZ2UgKmVwOworCisJZXAgPSBiLT5pbl9lZGdlczsKKwlpZiAoZXAgPT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBNYWtlIHN1cmUgZWFjaCBwcmVkZWNlc3NvciBsb2FkcyB0aGUgc2FtZSB2YWx1ZS4KKwkgKi8KKwl2YWwgPSBlcC0+cHJlZC0+dmFsW0FfQVRPTV07CisJZm9yIChlcCA9IGVwLT5uZXh0OyBlcCAhPSAwOyBlcCA9IGVwLT5uZXh0KQorCQlpZiAodmFsICE9IGVwLT5wcmVkLT52YWxbQV9BVE9NXSkKKwkJCXJldHVybjsKKworCWlmIChKVChiLT5pbl9lZGdlcy0+cHJlZCkgPT0gYikKKwkJZGlmZnAgPSAmSlQoYi0+aW5fZWRnZXMtPnByZWQpOworCWVsc2UKKwkJZGlmZnAgPSAmSkYoYi0+aW5fZWRnZXMtPnByZWQpOworCisJYXRfdG9wID0gMTsKKwl3aGlsZSAoMSkgeworCQlpZiAoKmRpZmZwID09IDApCisJCQlyZXR1cm47CisKKwkJaWYgKEpGKCpkaWZmcCkgIT0gSkYoYikpCisJCQlyZXR1cm47CisKKwkJaWYgKCFTRVRfTUVNQkVSKCgqZGlmZnApLT5kb20sIGItPmlkKSkKKwkJCXJldHVybjsKKworCQlpZiAoKCpkaWZmcCktPnZhbFtBX0FUT01dICE9IHZhbCkKKwkJCWJyZWFrOworCisJCWRpZmZwID0gJkpUKCpkaWZmcCk7CisJCWF0X3RvcCA9IDA7CisJfQorCXNhbWVwID0gJkpUKCpkaWZmcCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCpzYW1lcCA9PSAwKQorCQkJcmV0dXJuOworCisJCWlmIChKRigqc2FtZXApICE9IEpGKGIpKQorCQkJcmV0dXJuOworCisJCWlmICghU0VUX01FTUJFUigoKnNhbWVwKS0+ZG9tLCBiLT5pZCkpCisJCQlyZXR1cm47CisKKwkJaWYgKCgqc2FtZXApLT52YWxbQV9BVE9NXSA9PSB2YWwpCisJCQlicmVhazsKKworCQkvKiBYWFggTmVlZCB0byBjaGVjayB0aGF0IHRoZXJlIGFyZSBubyBkYXRhIGRlcGVuZGVuY2llcworCQkgICBiZXR3ZWVuIGRpZmZwIGFuZCBzYW1lcC4gIEN1cnJlbnRseSwgdGhlIGNvZGUgZ2VuZXJhdG9yCisJCSAgIHdpbGwgbm90IHByb2R1Y2Ugc3VjaCBkZXBlbmRlbmNpZXMuICovCisJCXNhbWVwID0gJkpUKCpzYW1lcCk7CisJfQorI2lmZGVmIG5vdGRlZgorCS8qIFhYWCBUaGlzIGRvZXNuJ3QgY292ZXIgZXZlcnl0aGluZy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTl9BVE9NUzsgKytpKQorCQlpZiAoKCpzYW1lcCktPnZhbFtpXSAhPSBwcmVkLT52YWxbaV0pCisJCQlyZXR1cm47CisjZW5kaWYKKwkvKiBQdWxsIHVwIHRoZSBub2RlLiAqLworCXB1bGwgPSAqc2FtZXA7CisJKnNhbWVwID0gSlQocHVsbCk7CisJSlQocHVsbCkgPSAqZGlmZnA7CisKKwkvKgorCSAqIEF0IHRoZSB0b3Agb2YgdGhlIGNoYWluLCBlYWNoIHByZWRlY2Vzc29yIG5lZWRzIHRvIHBvaW50IGF0IHRoZQorCSAqIHB1bGxlZCB1cCBub2RlLiAgSW5zaWRlIHRoZSBjaGFpbiwgdGhlcmUgaXMgb25seSBvbmUgcHJlZGVjZXNzb3IKKwkgKiB0byB3b3JyeSBhYm91dC4KKwkgKi8KKwlpZiAoYXRfdG9wKSB7CisJCWZvciAoZXAgPSBiLT5pbl9lZGdlczsgZXAgIT0gMDsgZXAgPSBlcC0+bmV4dCkgeworCQkJaWYgKEpUKGVwLT5wcmVkKSA9PSBiKQorCQkJCUpUKGVwLT5wcmVkKSA9IHB1bGw7CisJCQllbHNlCisJCQkJSkYoZXAtPnByZWQpID0gcHVsbDsKKwkJfQorCX0KKwllbHNlCisJCSpkaWZmcCA9IHB1bGw7CisKKwlkb25lID0gMDsKK30KKworc3RhdGljIHZvaWQKK29wdF9ibGtzKHJvb3QsIGRvX3N0bXRzKQorCXN0cnVjdCBibG9jayAqcm9vdDsKKwlpbnQgZG9fc3RtdHM7Cit7CisJaW50IGksIG1heGxldmVsOworCXN0cnVjdCBibG9jayAqcDsKKworCWluaXRfdmFsKCk7CisJbWF4bGV2ZWwgPSByb290LT5sZXZlbDsKKworCWZpbmRfaW5lZGdlcyhyb290KTsKKwlmb3IgKGkgPSBtYXhsZXZlbDsgaSA+PSAwOyAtLWkpCisJCWZvciAocCA9IGxldmVsc1tpXTsgcDsgcCA9IHAtPmxpbmspCisJCQlvcHRfYmxrKHAsIGRvX3N0bXRzKTsKKworCWlmIChkb19zdG10cykKKwkJLyoKKwkJICogTm8gcG9pbnQgdHJ5aW5nIHRvIG1vdmUgYnJhbmNoZXM7IGl0IGNhbid0IHBvc3NpYmx5CisJCSAqIG1ha2UgYSBkaWZmZXJlbmNlIGF0IHRoaXMgcG9pbnQuCisJCSAqLworCQlyZXR1cm47CisKKwlmb3IgKGkgPSAxOyBpIDw9IG1heGxldmVsOyArK2kpIHsKKwkJZm9yIChwID0gbGV2ZWxzW2ldOyBwOyBwID0gcC0+bGluaykgeworCQkJb3B0X2ooJnAtPmV0KTsKKwkJCW9wdF9qKCZwLT5lZik7CisJCX0KKwl9CisKKwlmaW5kX2luZWRnZXMocm9vdCk7CisJZm9yIChpID0gMTsgaSA8PSBtYXhsZXZlbDsgKytpKSB7CisJCWZvciAocCA9IGxldmVsc1tpXTsgcDsgcCA9IHAtPmxpbmspIHsKKwkJCW9yX3B1bGx1cChwKTsKKwkJCWFuZF9wdWxsdXAocCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbGlua19pbmVkZ2UocGFyZW50LCBjaGlsZCkKKwlzdHJ1Y3QgZWRnZSAqcGFyZW50OworCXN0cnVjdCBibG9jayAqY2hpbGQ7Cit7CisJcGFyZW50LT5uZXh0ID0gY2hpbGQtPmluX2VkZ2VzOworCWNoaWxkLT5pbl9lZGdlcyA9IHBhcmVudDsKK30KKworc3RhdGljIHZvaWQKK2ZpbmRfaW5lZGdlcyhyb290KQorCXN0cnVjdCBibG9jayAqcm9vdDsKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYmxvY2sgKmI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9ibG9ja3M7ICsraSkKKwkJYmxvY2tzW2ldLT5pbl9lZGdlcyA9IDA7CisKKwkvKgorCSAqIFRyYXZlcnNlIHRoZSBncmFwaCwgYWRkaW5nIGVhY2ggZWRnZSB0byB0aGUgcHJlZGVjZXNzb3IKKwkgKiBsaXN0IG9mIGl0cyBzdWNjZXNzb3JzLiAgU2tpcCB0aGUgbGVhdmVzIChpLmUuIGxldmVsIDApLgorCSAqLworCWZvciAoaSA9IHJvb3QtPmxldmVsOyBpID4gMDsgLS1pKSB7CisJCWZvciAoYiA9IGxldmVsc1tpXTsgYiAhPSAwOyBiID0gYi0+bGluaykgeworCQkJbGlua19pbmVkZ2UoJmItPmV0LCBKVChiKSk7CisJCQlsaW5rX2luZWRnZSgmYi0+ZWYsIEpGKGIpKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK29wdF9yb290KGIpCisJc3RydWN0IGJsb2NrICoqYjsKK3sKKwlzdHJ1Y3Qgc2xpc3QgKnRtcCwgKnM7CisKKwlzID0gKCpiKS0+c3RtdHM7CisJKCpiKS0+c3RtdHMgPSAwOworCXdoaWxlIChCUEZfQ0xBU1MoKCpiKS0+cy5jb2RlKSA9PSBCUEZfSk1QICYmIEpUKCpiKSA9PSBKRigqYikpCisJCSpiID0gSlQoKmIpOworCisJdG1wID0gKCpiKS0+c3RtdHM7CisJaWYgKHRtcCAhPSAwKQorCQlzYXBwZW5kKHMsIHRtcCk7CisJKCpiKS0+c3RtdHMgPSBzOworCisJLyoKKwkgKiBJZiB0aGUgcm9vdCBub2RlIGlzIGEgcmV0dXJuLCB0aGVuIHRoZXJlIGlzIG5vCisJICogcG9pbnQgZXhlY3V0aW5nIGFueSBzdGF0ZW1lbnRzIChzaW5jZSB0aGUgYnBmIG1hY2hpbmUKKwkgKiBoYXMgbm8gc2lkZSBlZmZlY3RzKS4KKwkgKi8KKwlpZiAoQlBGX0NMQVNTKCgqYiktPnMuY29kZSkgPT0gQlBGX1JFVCkKKwkJKCpiKS0+c3RtdHMgPSAwOworfQorCitzdGF0aWMgdm9pZAorb3B0X2xvb3Aocm9vdCwgZG9fc3RtdHMpCisJc3RydWN0IGJsb2NrICpyb290OworCWludCBkb19zdG10czsKK3sKKworI2lmZGVmIEJERUJVRworCWlmIChkZmxhZyA+IDEpIHsKKwkJcHJpbnRmKCJvcHRfbG9vcChyb290LCAlZCkgYmVnaW5cbiIsIGRvX3N0bXRzKTsKKwkJb3B0X2R1bXAocm9vdCk7CisJfQorI2VuZGlmCisJZG8geworCQlkb25lID0gMTsKKwkJZmluZF9sZXZlbHMocm9vdCk7CisJCWZpbmRfZG9tKHJvb3QpOworCQlmaW5kX2Nsb3N1cmUocm9vdCk7CisJCWZpbmRfdWQocm9vdCk7CisJCWZpbmRfZWRvbShyb290KTsKKwkJb3B0X2Jsa3Mocm9vdCwgZG9fc3RtdHMpOworI2lmZGVmIEJERUJVRworCQlpZiAoZGZsYWcgPiAxKSB7CisJCQlwcmludGYoIm9wdF9sb29wKHJvb3QsICVkKSBib3R0b20sIGRvbmU9JWRcbiIsIGRvX3N0bXRzLCBkb25lKTsKKwkJCW9wdF9kdW1wKHJvb3QpOworCQl9CisjZW5kaWYKKwl9IHdoaWxlICghZG9uZSk7Cit9CisKKy8qCisgKiBPcHRpbWl6ZSB0aGUgZmlsdGVyIGNvZGUgaW4gaXRzIGRhZyByZXByZXNlbnRhdGlvbi4KKyAqLwordm9pZAorYnBmX29wdGltaXplKHJvb3RwKQorCXN0cnVjdCBibG9jayAqKnJvb3RwOworeworCXN0cnVjdCBibG9jayAqcm9vdDsKKworCXJvb3QgPSAqcm9vdHA7CisKKwlvcHRfaW5pdChyb290KTsKKwlvcHRfbG9vcChyb290LCAwKTsKKwlvcHRfbG9vcChyb290LCAxKTsKKwlpbnRlcm5fYmxvY2tzKHJvb3QpOworI2lmZGVmIEJERUJVRworCWlmIChkZmxhZyA+IDEpIHsKKwkJcHJpbnRmKCJhZnRlciBpbnRlcm5fYmxvY2tzKClcbiIpOworCQlvcHRfZHVtcChyb290KTsKKwl9CisjZW5kaWYKKwlvcHRfcm9vdChyb290cCk7CisjaWZkZWYgQkRFQlVHCisJaWYgKGRmbGFnID4gMSkgeworCQlwcmludGYoImFmdGVyIG9wdF9yb290KClcbiIpOworCQlvcHRfZHVtcChyb290KTsKKwl9CisjZW5kaWYKKwlvcHRfY2xlYW51cCgpOworfQorCitzdGF0aWMgdm9pZAorbWFrZV9tYXJrcyhwKQorCXN0cnVjdCBibG9jayAqcDsKK3sKKwlpZiAoIWlzTWFya2VkKHApKSB7CisJCU1hcmsocCk7CisJCWlmIChCUEZfQ0xBU1MocC0+cy5jb2RlKSAhPSBCUEZfUkVUKSB7CisJCQltYWtlX21hcmtzKEpUKHApKTsKKwkJCW1ha2VfbWFya3MoSkYocCkpOworCQl9CisJfQorfQorCisvKgorICogTWFyayBjb2RlIGFycmF5IHN1Y2ggdGhhdCBpc01hcmtlZChpKSBpcyB0cnVlCisgKiBvbmx5IGZvciBub2RlcyB0aGF0IGFyZSBhbGl2ZS4KKyAqLworc3RhdGljIHZvaWQKK21hcmtfY29kZShwKQorCXN0cnVjdCBibG9jayAqcDsKK3sKKwljdXJfbWFyayArPSAxOworCW1ha2VfbWFya3MocCk7Cit9CisKKy8qCisgKiBUcnVlIGlmZiB0aGUgdHdvIHN0bXQgbGlzdHMgbG9hZCB0aGUgc2FtZSB2YWx1ZSBmcm9tIHRoZSBwYWNrZXQgaW50bworICogdGhlIGFjY3VtdWxhdG9yLgorICovCitzdGF0aWMgaW50CitlcV9zbGlzdCh4LCB5KQorCXN0cnVjdCBzbGlzdCAqeCwgKnk7Cit7CisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKHggJiYgeC0+cy5jb2RlID09IE5PUCkKKwkJCXggPSB4LT5uZXh0OworCQl3aGlsZSAoeSAmJiB5LT5zLmNvZGUgPT0gTk9QKQorCQkJeSA9IHktPm5leHQ7CisJCWlmICh4ID09IDApCisJCQlyZXR1cm4geSA9PSAwOworCQlpZiAoeSA9PSAwKQorCQkJcmV0dXJuIHggPT0gMDsKKwkJaWYgKHgtPnMuY29kZSAhPSB5LT5zLmNvZGUgfHwgeC0+cy5rICE9IHktPnMuaykKKwkJCXJldHVybiAwOworCQl4ID0geC0+bmV4dDsKKwkJeSA9IHktPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludAorZXFfYmxrKGIwLCBiMSkKKwlzdHJ1Y3QgYmxvY2sgKmIwLCAqYjE7Cit7CisJaWYgKGIwLT5zLmNvZGUgPT0gYjEtPnMuY29kZSAmJgorCSAgICBiMC0+cy5rID09IGIxLT5zLmsgJiYKKwkgICAgYjAtPmV0LnN1Y2MgPT0gYjEtPmV0LnN1Y2MgJiYKKwkgICAgYjAtPmVmLnN1Y2MgPT0gYjEtPmVmLnN1Y2MpCisJCXJldHVybiBlcV9zbGlzdChiMC0+c3RtdHMsIGIxLT5zdG10cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlcm5fYmxvY2tzKHJvb3QpCisJc3RydWN0IGJsb2NrICpyb290OworeworCXN0cnVjdCBibG9jayAqcDsKKwlpbnQgaSwgajsKKwlpbnQgZG9uZTE7IC8qIGRvbid0IHNoYWRvdyBnbG9iYWwgKi8KKyB0b3A6CisJZG9uZTEgPSAxOworCWZvciAoaSA9IDA7IGkgPCBuX2Jsb2NrczsgKytpKQorCQlibG9ja3NbaV0tPmxpbmsgPSAwOworCisJbWFya19jb2RlKHJvb3QpOworCisJZm9yIChpID0gbl9ibG9ja3MgLSAxOyAtLWkgPj0gMDsgKSB7CisJCWlmICghaXNNYXJrZWQoYmxvY2tzW2ldKSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSBpICsgMTsgaiA8IG5fYmxvY2tzOyArK2opIHsKKwkJCWlmICghaXNNYXJrZWQoYmxvY2tzW2pdKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChlcV9ibGsoYmxvY2tzW2ldLCBibG9ja3Nbal0pKSB7CisJCQkJYmxvY2tzW2ldLT5saW5rID0gYmxvY2tzW2pdLT5saW5rID8KKwkJCQkJYmxvY2tzW2pdLT5saW5rIDogYmxvY2tzW2pdOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBuX2Jsb2NrczsgKytpKSB7CisJCXAgPSBibG9ja3NbaV07CisJCWlmIChKVChwKSA9PSAwKQorCQkJY29udGludWU7CisJCWlmIChKVChwKS0+bGluaykgeworCQkJZG9uZTEgPSAwOworCQkJSlQocCkgPSBKVChwKS0+bGluazsKKwkJfQorCQlpZiAoSkYocCktPmxpbmspIHsKKwkJCWRvbmUxID0gMDsKKwkJCUpGKHApID0gSkYocCktPmxpbms7CisJCX0KKwl9CisJaWYgKCFkb25lMSkKKwkJZ290byB0b3A7Cit9CisKK3N0YXRpYyB2b2lkCitvcHRfY2xlYW51cCgpCit7CisJZnJlZSgodm9pZCAqKXZub2RlX2Jhc2UpOworCWZyZWUoKHZvaWQgKil2bWFwKTsKKwlmcmVlKCh2b2lkICopZWRnZXMpOworCWZyZWUoKHZvaWQgKilzcGFjZSk7CisJZnJlZSgodm9pZCAqKWxldmVscyk7CisJZnJlZSgodm9pZCAqKWJsb2Nrcyk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzdG10cyBpbiAncycuCisgKi8KK3N0YXRpYyB1X2ludAorc2xlbmd0aChzKQorCXN0cnVjdCBzbGlzdCAqczsKK3sKKwl1X2ludCBuID0gMDsKKworCWZvciAoOyBzOyBzID0gcy0+bmV4dCkKKwkJaWYgKHMtPnMuY29kZSAhPSBOT1ApCisJCQkrK247CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBub2RlcyByZWFjaGFibGUgYnkgJ3AnLgorICogQWxsIG5vZGVzIHNob3VsZCBiZSBpbml0aWFsbHkgdW5tYXJrZWQuCisgKi8KK3N0YXRpYyBpbnQKK2NvdW50X2Jsb2NrcyhwKQorCXN0cnVjdCBibG9jayAqcDsKK3sKKwlpZiAocCA9PSAwIHx8IGlzTWFya2VkKHApKQorCQlyZXR1cm4gMDsKKwlNYXJrKHApOworCXJldHVybiBjb3VudF9ibG9ja3MoSlQocCkpICsgY291bnRfYmxvY2tzKEpGKHApKSArIDE7Cit9CisKKy8qCisgKiBEbyBhIGRlcHRoIGZpcnN0IHNlYXJjaCBvbiB0aGUgZmxvdyBncmFwaCwgbnVtYmVyaW5nIHRoZQorICogdGhlIGJhc2ljIGJsb2NrcywgYW5kIGVudGVyaW5nIHRoZW0gaW50byB0aGUgJ2Jsb2NrcycgYXJyYXkuYAorICovCitzdGF0aWMgdm9pZAorbnVtYmVyX2Jsa3NfcihwKQorCXN0cnVjdCBibG9jayAqcDsKK3sKKwlpbnQgbjsKKworCWlmIChwID09IDAgfHwgaXNNYXJrZWQocCkpCisJCXJldHVybjsKKworCU1hcmsocCk7CisJbiA9IG5fYmxvY2tzKys7CisJcC0+aWQgPSBuOworCWJsb2Nrc1tuXSA9IHA7CisKKwludW1iZXJfYmxrc19yKEpUKHApKTsKKwludW1iZXJfYmxrc19yKEpGKHApKTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHN0bXRzIGluIHRoZSBmbG93Z3JhcGggcmVhY2hhYmxlIGJ5ICdwJy4KKyAqIFRoZSBub2RlcyBzaG91bGQgYmUgdW5tYXJrZWQgYmVmb3JlIGNhbGxpbmcuCisgKgorICogTm90ZSB0aGF0ICJzdG10cyIgbWVhbnMgImluc3RydWN0aW9ucyIsIGFuZCB0aGF0IHRoaXMgaW5jbHVkZXMKKyAqCisgKglzaWRlLWVmZmVjdCBzdGF0ZW1lbnRzIGluICdwJyAoc2xlbmd0aChwLT5zdG10cykpOworICoKKyAqCXN0YXRlbWVudHMgaW4gdGhlIHRydWUgYnJhbmNoIGZyb20gJ3AnIChjb3VudF9zdG10cyhKVChwKSkpOworICoKKyAqCXN0YXRlbWVudHMgaW4gdGhlIGZhbHNlIGJyYW5jaCBmcm9tICdwJyAoY291bnRfc3RtdHMoSkYocCkpKTsKKyAqCisgKgl0aGUgY29uZGl0aW9uYWwganVtcCBpdHNlbGYgKDEpOworICoKKyAqCWFuIGV4dHJhIGxvbmcganVtcCBpZiB0aGUgdHJ1ZSBicmFuY2ggcmVxdWlyZXMgaXQgKHAtPmxvbmdqdCk7CisgKgorICoJYW4gZXh0cmEgbG9uZyBqdW1wIGlmIHRoZSBmYWxzZSBicmFuY2ggcmVxdWlyZXMgaXQgKHAtPmxvbmdqZikuCisgKi8KK3N0YXRpYyB1X2ludAorY291bnRfc3RtdHMocCkKKwlzdHJ1Y3QgYmxvY2sgKnA7Cit7CisJdV9pbnQgbjsKKworCWlmIChwID09IDAgfHwgaXNNYXJrZWQocCkpCisJCXJldHVybiAwOworCU1hcmsocCk7CisJbiA9IGNvdW50X3N0bXRzKEpUKHApKSArIGNvdW50X3N0bXRzKEpGKHApKTsKKwlyZXR1cm4gc2xlbmd0aChwLT5zdG10cykgKyBuICsgMSArIHAtPmxvbmdqdCArIHAtPmxvbmdqZjsKK30KKworLyoKKyAqIEFsbG9jYXRlIG1lbW9yeS4gIEFsbCBhbGxvY2F0aW9uIGlzIGRvbmUgYmVmb3JlIG9wdGltaXphdGlvbgorICogaXMgYmVndW4uICBBIGxpbmVhciBib3VuZCBvbiB0aGUgc2l6ZSBvZiBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGlzIGNvbXB1dGVkCisgKiBmcm9tIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIGFuZC9vciBzdGF0ZW1lbnRzLgorICovCitzdGF0aWMgdm9pZAorb3B0X2luaXQocm9vdCkKKwlzdHJ1Y3QgYmxvY2sgKnJvb3Q7Cit7CisJYnBmX3VfaW50MzIgKnA7CisJaW50IGksIG4sIG1heF9zdG10czsKKworCS8qCisJICogRmlyc3QsIGNvdW50IHRoZSBibG9ja3MsIHNvIHdlIGNhbiBtYWxsb2MgYW4gYXJyYXkgdG8gbWFwCisJICogYmxvY2sgbnVtYmVyIHRvIGJsb2NrLiAgVGhlbiwgcHV0IHRoZSBibG9ja3MgaW50byB0aGUgYXJyYXkuCisJICovCisJdW5NYXJrQWxsKCk7CisJbiA9IGNvdW50X2Jsb2Nrcyhyb290KTsKKwlibG9ja3MgPSAoc3RydWN0IGJsb2NrICoqKWNhbGxvYyhuLCBzaXplb2YoKmJsb2NrcykpOworCWlmIChibG9ja3MgPT0gTlVMTCkKKwkJYnBmX2Vycm9yKCJtYWxsb2MiKTsKKwl1bk1hcmtBbGwoKTsKKwluX2Jsb2NrcyA9IDA7CisJbnVtYmVyX2Jsa3Nfcihyb290KTsKKworCW5fZWRnZXMgPSAyICogbl9ibG9ja3M7CisJZWRnZXMgPSAoc3RydWN0IGVkZ2UgKiopY2FsbG9jKG5fZWRnZXMsIHNpemVvZigqZWRnZXMpKTsKKwlpZiAoZWRnZXMgPT0gTlVMTCkKKwkJYnBmX2Vycm9yKCJtYWxsb2MiKTsKKworCS8qCisJICogVGhlIG51bWJlciBvZiBsZXZlbHMgaXMgYm91bmRlZCBieSB0aGUgbnVtYmVyIG9mIG5vZGVzLgorCSAqLworCWxldmVscyA9IChzdHJ1Y3QgYmxvY2sgKiopY2FsbG9jKG5fYmxvY2tzLCBzaXplb2YoKmxldmVscykpOworCWlmIChsZXZlbHMgPT0gTlVMTCkKKwkJYnBmX2Vycm9yKCJtYWxsb2MiKTsKKworCWVkZ2V3b3JkcyA9IG5fZWRnZXMgLyAoOCAqIHNpemVvZihicGZfdV9pbnQzMikpICsgMTsKKwlub2Rld29yZHMgPSBuX2Jsb2NrcyAvICg4ICogc2l6ZW9mKGJwZl91X2ludDMyKSkgKyAxOworCisJLyogWFhYICovCisJc3BhY2UgPSAoYnBmX3VfaW50MzIgKiltYWxsb2MoMiAqIG5fYmxvY2tzICogbm9kZXdvcmRzICogc2l6ZW9mKCpzcGFjZSkKKwkJCQkgKyBuX2VkZ2VzICogZWRnZXdvcmRzICogc2l6ZW9mKCpzcGFjZSkpOworCWlmIChzcGFjZSA9PSBOVUxMKQorCQlicGZfZXJyb3IoIm1hbGxvYyIpOworCXAgPSBzcGFjZTsKKwlhbGxfZG9tX3NldHMgPSBwOworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKwkJYmxvY2tzW2ldLT5kb20gPSBwOworCQlwICs9IG5vZGV3b3JkczsKKwl9CisJYWxsX2Nsb3N1cmVfc2V0cyA9IHA7CisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlibG9ja3NbaV0tPmNsb3N1cmUgPSBwOworCQlwICs9IG5vZGV3b3JkczsKKwl9CisJYWxsX2VkZ2Vfc2V0cyA9IHA7CisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlyZWdpc3RlciBzdHJ1Y3QgYmxvY2sgKmIgPSBibG9ja3NbaV07CisKKwkJYi0+ZXQuZWRvbSA9IHA7CisJCXAgKz0gZWRnZXdvcmRzOworCQliLT5lZi5lZG9tID0gcDsKKwkJcCArPSBlZGdld29yZHM7CisJCWItPmV0LmlkID0gaTsKKwkJZWRnZXNbaV0gPSAmYi0+ZXQ7CisJCWItPmVmLmlkID0gbl9ibG9ja3MgKyBpOworCQllZGdlc1tuX2Jsb2NrcyArIGldID0gJmItPmVmOworCQliLT5ldC5wcmVkID0gYjsKKwkJYi0+ZWYucHJlZCA9IGI7CisJfQorCW1heF9zdG10cyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJbWF4X3N0bXRzICs9IHNsZW5ndGgoYmxvY2tzW2ldLT5zdG10cykgKyAxOworCS8qCisJICogV2UgYWxsb2NhdGUgYXQgbW9zdCAzIHZhbHVlIG51bWJlcnMgcGVyIHN0YXRlbWVudCwKKwkgKiBzbyB0aGlzIGlzIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdmFsbm9kZXMKKwkgKiB3ZSdsbCBuZWVkLgorCSAqLworCW1heHZhbCA9IDMgKiBtYXhfc3RtdHM7CisJdm1hcCA9IChzdHJ1Y3Qgdm1hcGluZm8gKiljYWxsb2MobWF4dmFsLCBzaXplb2YoKnZtYXApKTsKKwl2bm9kZV9iYXNlID0gKHN0cnVjdCB2YWxub2RlICopY2FsbG9jKG1heHZhbCwgc2l6ZW9mKCp2bm9kZV9iYXNlKSk7CisJaWYgKHZtYXAgPT0gTlVMTCB8fCB2bm9kZV9iYXNlID09IE5VTEwpCisJCWJwZl9lcnJvcigibWFsbG9jIik7Cit9CisKKy8qCisgKiBTb21lIHBvaW50ZXJzIHVzZWQgdG8gY29udmVydCB0aGUgYmFzaWMgYmxvY2sgZm9ybSBvZiB0aGUgY29kZSwKKyAqIGludG8gdGhlIGFycmF5IGZvcm0gdGhhdCBCUEYgcmVxdWlyZXMuICAnZnN0YXJ0JyB3aWxsIHBvaW50IHRvCisgKiB0aGUgbWFsbG9jJ2QgYXJyYXkgd2hpbGUgJ2Z0YWlsJyBpcyB1c2VkIGR1cmluZyB0aGUgcmVjdXJzaXZlIHRyYXZlcnNhbC4KKyAqLworc3RhdGljIHN0cnVjdCBicGZfaW5zbiAqZnN0YXJ0Oworc3RhdGljIHN0cnVjdCBicGZfaW5zbiAqZnRhaWw7CisKKyNpZmRlZiBCREVCVUcKK2ludCBiaWRzWzEwMDBdOworI2VuZGlmCisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4gIFJldHVybnMgZmFsc2UgaWYgYSBicmFuY2ggaGFzCisgKiBhbiBvZmZzZXQgdGhhdCBpcyB0b28gbGFyZ2UuICBJZiBzbywgd2UgaGF2ZSBtYXJrZWQgdGhhdAorICogYnJhbmNoIHNvIHRoYXQgb24gYSBzdWJzZXF1ZW50IGl0ZXJhdGlvbiwgaXQgd2lsbCBiZSB0cmVhdGVkCisgKiBwcm9wZXJseS4KKyAqLworc3RhdGljIGludAorY29udmVydF9jb2RlX3IocCkKKwlzdHJ1Y3QgYmxvY2sgKnA7Cit7CisJc3RydWN0IGJwZl9pbnNuICpkc3Q7CisJc3RydWN0IHNsaXN0ICpzcmM7CisJaW50IHNsZW47CisJdV9pbnQgb2ZmOworCWludCBleHRyYWptcHM7CQkvKiBudW1iZXIgb2YgZXh0cmEganVtcHMgaW5zZXJ0ZWQgKi8KKwlzdHJ1Y3Qgc2xpc3QgKipvZmZzZXQgPSBOVUxMOworCisJaWYgKHAgPT0gMCB8fCBpc01hcmtlZChwKSkKKwkJcmV0dXJuICgxKTsKKwlNYXJrKHApOworCisJaWYgKGNvbnZlcnRfY29kZV9yKEpGKHApKSA9PSAwKQorCQlyZXR1cm4gKDApOworCWlmIChjb252ZXJ0X2NvZGVfcihKVChwKSkgPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCXNsZW4gPSBzbGVuZ3RoKHAtPnN0bXRzKTsKKwlkc3QgPSBmdGFpbCAtPSAoc2xlbiArIDEgKyBwLT5sb25nanQgKyBwLT5sb25namYpOworCQkvKiBpbmZsYXRlIGxlbmd0aCBieSBhbnkgZXh0cmEganVtcHMgKi8KKworCXAtPm9mZnNldCA9IGRzdCAtIGZzdGFydDsKKworCS8qIGdlbmVyYXRlIG9mZnNldFtdIGZvciBjb252ZW5pZW5jZSAgKi8KKwlpZiAoc2xlbikgeworCQlvZmZzZXQgPSAoc3RydWN0IHNsaXN0ICoqKWNhbGxvYyhzbGVuLCBzaXplb2Yoc3RydWN0IHNsaXN0ICopKTsKKwkJaWYgKCFvZmZzZXQpIHsKKwkJCWJwZl9lcnJvcigibm90IGVub3VnaCBjb3JlIik7CisJCQkvKk5PVFJFQUNIRUQqLworCQl9CisJfQorCXNyYyA9IHAtPnN0bXRzOworCWZvciAob2ZmID0gMDsgb2ZmIDwgc2xlbiAmJiBzcmM7IG9mZisrKSB7CisjaWYgMAorCQlwcmludGYoIm9mZj0lZCBzcmM9JXhcbiIsIG9mZiwgc3JjKTsKKyNlbmRpZgorCQlvZmZzZXRbb2ZmXSA9IHNyYzsKKwkJc3JjID0gc3JjLT5uZXh0OworCX0KKworCW9mZiA9IDA7CisJZm9yIChzcmMgPSBwLT5zdG10czsgc3JjOyBzcmMgPSBzcmMtPm5leHQpIHsKKwkJaWYgKHNyYy0+cy5jb2RlID09IE5PUCkKKwkJCWNvbnRpbnVlOworCQlkc3QtPmNvZGUgPSAodV9zaG9ydClzcmMtPnMuY29kZTsKKwkJZHN0LT5rID0gc3JjLT5zLms7CisKKwkJLyogZmlsbCBibG9jay1sb2NhbCByZWxhdGl2ZSBqdW1wICovCisJCWlmIChCUEZfQ0xBU1Moc3JjLT5zLmNvZGUpICE9IEJQRl9KTVAgfHwgc3JjLT5zLmNvZGUgPT0gKEJQRl9KTVB8QlBGX0pBKSkgeworI2lmIDAKKwkJCWlmIChzcmMtPnMuanQgfHwgc3JjLT5zLmpmKSB7CisJCQkJYnBmX2Vycm9yKCJpbGxlZ2FsIGptcCBkZXN0aW5hdGlvbiIpOworCQkJCS8qTk9UUkVBQ0hFRCovCisJCQl9CisjZW5kaWYKKwkJCWdvdG8gZmlsbGVkOworCQl9CisJCWlmIChvZmYgPT0gc2xlbiAtIDIpCS8qPz8/Ki8KKwkJCWdvdG8gZmlsbGVkOworCisJICAgIHsKKwkJaW50IGk7CisJCWludCBqdCwgamY7CisJCWNvbnN0IGNoYXIgKmxqZXJyID0gIiVzIGZvciBibG9jay1sb2NhbCByZWxhdGl2ZSBqdW1wOiBvZmY9JWQiOworCisjaWYgMAorCQlwcmludGYoImNvZGU9JXggb2ZmPSVkICV4ICV4XG4iLCBzcmMtPnMuY29kZSwKKwkJCW9mZiwgc3JjLT5zLmp0LCBzcmMtPnMuamYpOworI2VuZGlmCisKKwkJaWYgKCFzcmMtPnMuanQgfHwgIXNyYy0+cy5qZikgeworCQkJYnBmX2Vycm9yKGxqZXJyLCAibm8gam1wIGRlc3RpbmF0aW9uIiwgb2ZmKTsKKwkJCS8qTk9UUkVBQ0hFRCovCisJCX0KKworCQlqdCA9IGpmID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IHNsZW47IGkrKykgeworCQkJaWYgKG9mZnNldFtpXSA9PSBzcmMtPnMuanQpIHsKKwkJCQlpZiAoanQpIHsKKwkJCQkJYnBmX2Vycm9yKGxqZXJyLCAibXVsdGlwbGUgbWF0Y2hlcyIsIG9mZik7CisJCQkJCS8qTk9UUkVBQ0hFRCovCisJCQkJfQorCisJCQkJZHN0LT5qdCA9IGkgLSBvZmYgLSAxOworCQkJCWp0Kys7CisJCQl9CisJCQlpZiAob2Zmc2V0W2ldID09IHNyYy0+cy5qZikgeworCQkJCWlmIChqZikgeworCQkJCQlicGZfZXJyb3IobGplcnIsICJtdWx0aXBsZSBtYXRjaGVzIiwgb2ZmKTsKKwkJCQkJLypOT1RSRUFDSEVEKi8KKwkJCQl9CisJCQkJZHN0LT5qZiA9IGkgLSBvZmYgLSAxOworCQkJCWpmKys7CisJCQl9CisJCX0KKwkJaWYgKCFqdCB8fCAhamYpIHsKKwkJCWJwZl9lcnJvcihsamVyciwgIm5vIGRlc3RpbmF0aW9uIGZvdW5kIiwgb2ZmKTsKKwkJCS8qTk9UUkVBQ0hFRCovCisJCX0KKwkgICAgfQorZmlsbGVkOgorCQkrK2RzdDsKKwkJKytvZmY7CisJfQorCWlmIChvZmZzZXQpCisJCWZyZWUob2Zmc2V0KTsKKworI2lmZGVmIEJERUJVRworCWJpZHNbZHN0IC0gZnN0YXJ0XSA9IHAtPmlkICsgMTsKKyNlbmRpZgorCWRzdC0+Y29kZSA9ICh1X3Nob3J0KXAtPnMuY29kZTsKKwlkc3QtPmsgPSBwLT5zLms7CisJaWYgKEpUKHApKSB7CisJCWV4dHJham1wcyA9IDA7CisJCW9mZiA9IEpUKHApLT5vZmZzZXQgLSAocC0+b2Zmc2V0ICsgc2xlbikgLSAxOworCQlpZiAob2ZmID49IDI1NikgeworCQkgICAgLyogb2Zmc2V0IHRvbyBsYXJnZSBmb3IgYnJhbmNoLCBtdXN0IGFkZCBhIGp1bXAgKi8KKwkJICAgIGlmIChwLT5sb25nanQgPT0gMCkgeworCQkgICAgCS8qIG1hcmsgdGhpcyBpbnN0cnVjdGlvbiBhbmQgcmV0cnkgKi8KKwkJCXAtPmxvbmdqdCsrOworCQkJcmV0dXJuKDApOworCQkgICAgfQorCQkgICAgLyogYnJhbmNoIGlmIFQgdG8gZm9sbG93aW5nIGp1bXAgKi8KKwkJICAgIGRzdC0+anQgPSBleHRyYWptcHM7CisJCSAgICBleHRyYWptcHMrKzsKKwkJICAgIGRzdFtleHRyYWptcHNdLmNvZGUgPSBCUEZfSk1QfEJQRl9KQTsKKwkJICAgIGRzdFtleHRyYWptcHNdLmsgPSBvZmYgLSBleHRyYWptcHM7CisJCX0KKwkJZWxzZQorCQkgICAgZHN0LT5qdCA9IG9mZjsKKwkJb2ZmID0gSkYocCktPm9mZnNldCAtIChwLT5vZmZzZXQgKyBzbGVuKSAtIDE7CisJCWlmIChvZmYgPj0gMjU2KSB7CisJCSAgICAvKiBvZmZzZXQgdG9vIGxhcmdlIGZvciBicmFuY2gsIG11c3QgYWRkIGEganVtcCAqLworCQkgICAgaWYgKHAtPmxvbmdqZiA9PSAwKSB7CisJCSAgICAJLyogbWFyayB0aGlzIGluc3RydWN0aW9uIGFuZCByZXRyeSAqLworCQkJcC0+bG9uZ2pmKys7CisJCQlyZXR1cm4oMCk7CisJCSAgICB9CisJCSAgICAvKiBicmFuY2ggaWYgRiB0byBmb2xsb3dpbmcganVtcCAqLworCQkgICAgLyogaWYgdHdvIGp1bXBzIGFyZSBpbnNlcnRlZCwgRiBnb2VzIHRvIHNlY29uZCBvbmUgKi8KKwkJICAgIGRzdC0+amYgPSBleHRyYWptcHM7CisJCSAgICBleHRyYWptcHMrKzsKKwkJICAgIGRzdFtleHRyYWptcHNdLmNvZGUgPSBCUEZfSk1QfEJQRl9KQTsKKwkJICAgIGRzdFtleHRyYWptcHNdLmsgPSBvZmYgLSBleHRyYWptcHM7CisJCX0KKwkJZWxzZQorCQkgICAgZHN0LT5qZiA9IG9mZjsKKwl9CisJcmV0dXJuICgxKTsKK30KKworCisvKgorICogQ29udmVydCBmbG93Z3JhcGggaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIHRvIHRoZQorICogQlBGIGFycmF5IHJlcHJlc2VudGF0aW9uLiAgU2V0ICpsZW5wIHRvIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgorICoKKyAqIFRoaXMgcm91dGluZSBkb2VzICpOT1QqIGxlYWsgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGZwLiAgSXQgKm11c3QKKyAqIG5vdCogZG8gZnJlZShmcCkgYmVmb3JlIHJldHVybmluZyBmcDsgZG9pbmcgc28gd291bGQgbWFrZSBubyBzZW5zZSwKKyAqIGFzIHRoZSBCUEYgYXJyYXkgcG9pbnRlZCB0byBieSB0aGUgcmV0dXJuIHZhbHVlIG9mIGljb2RlX3RvX2Zjb2RlKCkKKyAqIG11c3QgYmUgdmFsaWQgLSBpdCdzIGJlaW5nIHJldHVybmVkIGZvciB1c2UgaW4gYSBicGZfcHJvZ3JhbSBzdHJ1Y3R1cmUuCisgKgorICogSWYgaXQgYXBwZWFycyB0aGF0IGljb2RlX3RvX2Zjb2RlKCkgaXMgbGVha2luZywgdGhlIHByb2JsZW0gaXMgdGhhdAorICogdGhlIHByb2dyYW0gdXNpbmcgcGNhcF9jb21waWxlKCkgaXMgZmFpbGluZyB0byBmcmVlIHRoZSBtZW1vcnkgaW4KKyAqIHRoZSBCUEYgcHJvZ3JhbSB3aGVuIGl0J3MgZG9uZSAtIHRoZSBsZWFrIGlzIGluIHRoZSBwcm9ncmFtLCBub3QgaW4KKyAqIHRoZSByb3V0aW5lIHRoYXQgaGFwcGVucyB0byBiZSBhbGxvY2F0aW5nIHRoZSBtZW1vcnkuICAoQnkgYW5hbG9neSwgaWYKKyAqIGEgcHJvZ3JhbSBjYWxscyBmb3BlbigpIHdpdGhvdXQgZXZlciBjYWxsaW5nIGZjbG9zZSgpIG9uIHRoZSBGSUxFICosCisgKiBpdCB3aWxsIGxlYWsgdGhlIEZJTEUgc3RydWN0dXJlOyB0aGUgbGVhayBpcyBub3QgaW4gZm9wZW4oKSwgaXQncyBpbgorICogdGhlIHByb2dyYW0uKSAgQ2hhbmdlIHRoZSBwcm9ncmFtIHRvIHVzZSBwY2FwX2ZyZWVjb2RlKCkgd2hlbiBpdCdzCisgKiBkb25lIHdpdGggdGhlIGZpbHRlciBwcm9ncmFtLiAgU2VlIHRoZSBwY2FwIG1hbiBwYWdlLgorICovCitzdHJ1Y3QgYnBmX2luc24gKgoraWNvZGVfdG9fZmNvZGUocm9vdCwgbGVucCkKKwlzdHJ1Y3QgYmxvY2sgKnJvb3Q7CisJdV9pbnQgKmxlbnA7Cit7CisJdV9pbnQgbjsKKwlzdHJ1Y3QgYnBmX2luc24gKmZwOworCisJLyoKKwkgKiBMb29wIGRvaW5nIGNvbnZlcnRfY29kZV9yKCkgdW50aWwgbm8gYnJhbmNoZXMgcmVtYWluCisJICogd2l0aCB0b28tbGFyZ2Ugb2Zmc2V0cy4KKwkgKi8KKwl3aGlsZSAoMSkgeworCSAgICB1bk1hcmtBbGwoKTsKKwkgICAgbiA9ICpsZW5wID0gY291bnRfc3RtdHMocm9vdCk7CisKKwkgICAgZnAgPSAoc3RydWN0IGJwZl9pbnNuICopbWFsbG9jKHNpemVvZigqZnApICogbik7CisJICAgIGlmIChmcCA9PSBOVUxMKQorCQkgICAgYnBmX2Vycm9yKCJtYWxsb2MiKTsKKwkgICAgbWVtc2V0KChjaGFyICopZnAsIDAsIHNpemVvZigqZnApICogbik7CisJICAgIGZzdGFydCA9IGZwOworCSAgICBmdGFpbCA9IGZwICsgbjsKKworCSAgICB1bk1hcmtBbGwoKTsKKwkgICAgaWYgKGNvbnZlcnRfY29kZV9yKHJvb3QpKQorCQlicmVhazsKKwkgICAgZnJlZShmcCk7CisJfQorCisJcmV0dXJuIGZwOworfQorCisvKgorICogTWFrZSBhIGNvcHkgb2YgYSBCUEYgcHJvZ3JhbSBhbmQgcHV0IGl0IGluIHRoZSAiZmNvZGUiIG1lbWJlciBvZgorICogYSAicGNhcF90Ii4KKyAqCisgKiBJZiB3ZSBmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNvcHksIGZpbGwgaW4gdGhlICJlcnJidWYiCisgKiBtZW1iZXIgb2YgdGhlICJwY2FwX3QiIHdpdGggYW4gZXJyb3IgbWVzc2FnZSwgYW5kIHJldHVybiAtMTsKKyAqIG90aGVyd2lzZSwgcmV0dXJuIDAuCisgKi8KK2ludAoraW5zdGFsbF9icGZfcHJvZ3JhbShwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApCit7CisJc2l6ZV90IHByb2dfc2l6ZTsKKworCS8qCisJICogVmFsaWRhdGUgdGhlIHByb2dyYW0uCisJICovCisJaWYgKCFicGZfdmFsaWRhdGUoZnAtPmJmX2luc25zLCBmcC0+YmZfbGVuKSkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkJIkJQRiBwcm9ncmFtIGlzIG5vdCB2YWxpZCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIEZyZWUgdXAgYW55IGFscmVhZHkgaW5zdGFsbGVkIHByb2dyYW0uCisJICovCisJcGNhcF9mcmVlY29kZSgmcC0+ZmNvZGUpOworCisJcHJvZ19zaXplID0gc2l6ZW9mKCpmcC0+YmZfaW5zbnMpICogZnAtPmJmX2xlbjsKKwlwLT5mY29kZS5iZl9sZW4gPSBmcC0+YmZfbGVuOworCXAtPmZjb2RlLmJmX2luc25zID0gKHN0cnVjdCBicGZfaW5zbiAqKW1hbGxvYyhwcm9nX3NpemUpOworCWlmIChwLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwltZW1jcHkocC0+ZmNvZGUuYmZfaW5zbnMsIGZwLT5iZl9pbnNucywgcHJvZ19zaXplKTsKKwlyZXR1cm4gKDApOworfQorCisjaWZkZWYgQkRFQlVHCitzdGF0aWMgdm9pZAorb3B0X2R1bXAocm9vdCkKKwlzdHJ1Y3QgYmxvY2sgKnJvb3Q7Cit7CisJc3RydWN0IGJwZl9wcm9ncmFtIGY7CisKKwltZW1zZXQoYmlkcywgMCwgc2l6ZW9mIGJpZHMpOworCWYuYmZfaW5zbnMgPSBpY29kZV90b19mY29kZShyb290LCAmZi5iZl9sZW4pOworCWJwZl9kdW1wKCZmLCAxKTsKKwlwdXRjaGFyKCdcbicpOworCWZyZWUoKGNoYXIgKilmLmJmX2luc25zKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9vcmcudGNwZHVtcC5jaG1vZF9icGYucGxpc3QgYi9saWJwY2FwLTEuMy4wL29yZy50Y3BkdW1wLmNobW9kX2JwZi5wbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQ2ODUyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9vcmcudGNwZHVtcC5jaG1vZF9icGYucGxpc3QKQEAgLTAsMCArMSwxNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKwk8a2V5PkxhYmVsPC9rZXk+CisJPHN0cmluZz5vcmcudGNwZHVtcC5jaG1vZF9icGY8L3N0cmluZz4KKwk8a2V5PlJ1bkF0TG9hZDwva2V5PgorCTx0cnVlLz4KKwk8a2V5PlByb2dyYW08L2tleT4KKwk8c3RyaW5nPi91c3IvbG9jYWwvYmluL2NobW9kX2JwZjwvc3RyaW5nPgorCTxrZXk+UHJvZ3JhbUFyZ3VtZW50czwva2V5PgorCTxhcnJheT4KKwkJPHN0cmluZz4vdXNyL2xvY2FsL2Jpbi9jaG1vZF9icGY8L3N0cmluZz4KKwk8L2FycmF5PgorPC9kaWN0PgorPC9wbGlzdD4KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGFja2FnaW5nL3BjYXAuc3BlYy5pbiBiL2xpYnBjYXAtMS4zLjAvcGFja2FnaW5nL3BjYXAuc3BlYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjdiOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wYWNrYWdpbmcvcGNhcC5zcGVjLmluCkBAIC0wLDAgKzEsNzcgQEAKKyVkZWZpbmUgcHJlZml4ICAgL3VzcgorJWRlZmluZSB2ZXJzaW9uIEBWRVJTSU9OQAorCitTdW1tYXJ5OiBBIHN5c3RlbS1pbmRlcGVuZGVudCBpbnRlcmZhY2UgZm9yIHVzZXItbGV2ZWwgcGFja2V0IGNhcHR1cmUKK05hbWU6IGxpYnBjYXAKK1ZlcnNpb246ICV2ZXJzaW9uCitSZWxlYXNlOiAxCitHcm91cDogRGV2ZWxvcG1lbnQvTGlicmFyaWVzCitMaWNlbnNlOiBCU0Qgd2l0aCBhZHZlcnRpc2luZworU291cmNlOiBATkFNRUAudGFyLmd6CitCdWlsZFJvb3Q6IC90bXAvJXtuYW1lfS1idWlsZHJvb3QKK1VSTDogaHR0cDovL3d3dy50Y3BkdW1wLm9yZworCitTb3VyY2U6IGh0dHA6Ly93d3cudGNwZHVtcC5vcmcvcmVsZWFzZS8le25hbWV9LSV7dmVyc2lvbn0udGFyLmd6CisKKyVkZXNjcmlwdGlvbgorTGlicGNhcCBwcm92aWRlcyBhIHBvcnRhYmxlIGZyYW1ld29yayBmb3IgbG93LWxldmVsIG5ldHdvcmsKK21vbml0b3JpbmcuICBMaWJwY2FwIGNhbiBwcm92aWRlIG5ldHdvcmsgc3RhdGlzdGljcyBjb2xsZWN0aW9uLAorc2VjdXJpdHkgbW9uaXRvcmluZyBhbmQgbmV0d29yayBkZWJ1Z2dpbmcuICBTaW5jZSBhbG1vc3QgZXZlcnkgc3lzdGVtCit2ZW5kb3IgcHJvdmlkZXMgYSBkaWZmZXJlbnQgaW50ZXJmYWNlIGZvciBwYWNrZXQgY2FwdHVyZSwgdGhlIGxpYnBjYXAKK2F1dGhvcnMgY3JlYXRlZCB0aGlzIHN5c3RlbS1pbmRlcGVuZGVudCBBUEkgdG8gZWFzZSBpbiBwb3J0aW5nIGFuZCB0bworYWxsZXZpYXRlIHRoZSBuZWVkIGZvciBzZXZlcmFsIHN5c3RlbS1kZXBlbmRlbnQgcGFja2V0IGNhcHR1cmUgbW9kdWxlcworaW4gZWFjaCBhcHBsaWNhdGlvbi4KKworSW5zdGFsbCBsaWJwY2FwIGlmIHlvdSBuZWVkIHRvIGRvIGxvdy1sZXZlbCBuZXR3b3JrIHRyYWZmaWMgbW9uaXRvcmluZworb24geW91ciBuZXR3b3JrLgorCislcGFja2FnZSBkZXZlbAorU3VtbWFyeTogTGlicmFyaWVzIGFuZCBoZWFkZXIgZmlsZXMgZm9yIHRoZSBsaWJwY2FwIGxpYnJhcnkKK0dyb3VwOiBEZXZlbG9wbWVudC9MaWJyYXJpZXMKKworJWRlc2NyaXB0aW9uIGRldmVsCitMaWJwY2FwIHByb3ZpZGVzIGEgcG9ydGFibGUgZnJhbWV3b3JrIGZvciBsb3ctbGV2ZWwgbmV0d29yaworbW9uaXRvcmluZy4gIExpYnBjYXAgY2FuIHByb3ZpZGUgbmV0d29yayBzdGF0aXN0aWNzIGNvbGxlY3Rpb24sCitzZWN1cml0eSBtb25pdG9yaW5nIGFuZCBuZXR3b3JrIGRlYnVnZ2luZy4gIFNpbmNlIGFsbW9zdCBldmVyeSBzeXN0ZW0KK3ZlbmRvciBwcm92aWRlcyBhIGRpZmZlcmVudCBpbnRlcmZhY2UgZm9yIHBhY2tldCBjYXB0dXJlLCB0aGUgbGlicGNhcAorYXV0aG9ycyBjcmVhdGVkIHRoaXMgc3lzdGVtLWluZGVwZW5kZW50IEFQSSB0byBlYXNlIGluIHBvcnRpbmcgYW5kIHRvCithbGxldmlhdGUgdGhlIG5lZWQgZm9yIHNldmVyYWwgc3lzdGVtLWRlcGVuZGVudCBwYWNrZXQgY2FwdHVyZSBtb2R1bGVzCitpbiBlYWNoIGFwcGxpY2F0aW9uLgorCitUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGxpYnJhcmllcywgaW5jbHVkZSBmaWxlcywgYW5kIG90aGVyIAorcmVzb3VyY2VzIG5lZWRlZCBmb3IgZGV2ZWxvcGluZyBsaWJwY2FwIGFwcGxpY2F0aW9ucy4KKyAKKyVwcmVwCislc2V0dXAgLXEKKworJWJ1aWxkCitleHBvcnQgQ0ZMQUdTPSIkUlBNX09QVF9GTEFHUyAtZm5vLXN0cmljdC1hbGlhc2luZyIKKyVjb25maWd1cmUKK21ha2UgJXs/X3NtcF9tZmxhZ3N9CisKKyVpbnN0YWxsCitybSAtcmYgJFJQTV9CVUlMRF9ST09UCisKK21ha2UgREVTVERJUj0kUlBNX0JVSUxEX1JPT1QgaW5zdGFsbAorCislY2xlYW4KK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKKworJWZpbGVzCislZGVmYXR0cigtLHJvb3Qscm9vdCkKKyVkb2MgTElDRU5TRSBSRUFETUUgQ0hBTkdFUyBJTlNUQUxMLnR4dCBSRUFETUUubGludXggVE9ETyBWRVJTSU9OIENSRURJVFMgcGFja2FnaW5nL3BjYXAuc3BlYworJXtfbGliZGlyfS9saWJwY2FwLnNvLioKKyV7X21hbmRpcn0vbWFuNy9wY2FwKi43KgorCislZmlsZXMgZGV2ZWwKKyVkZWZhdHRyKC0scm9vdCxyb290KQorJXtfYmluZGlyfS9wY2FwLWNvbmZpZworJXtfaW5jbHVkZWRpcn0vcGNhcC8qLmgKKyV7X2luY2x1ZGVkaXJ9L3BjYXAuaAorJXtfaW5jbHVkZWRpcn0vcGNhcC1icGYuaAorJXtfaW5jbHVkZWRpcn0vcGNhcC1uYW1lZGIuaAorJXtfbGliZGlyfS9saWJwY2FwLnNvCisle19saWJkaXJ9L2xpYnBjYXAuYQorJXtfbWFuZGlyfS9tYW4xL3BjYXAtY29uZmlnLjEqCisle19tYW5kaXJ9L21hbjMvcGNhcCouMyoKKyV7X21hbmRpcn0vbWFuNS9wY2FwKi41KgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLWJwZi5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLWJwZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NDQ0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtYnBmLmMKQEAgLTAsMCArMSwyNzMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk4CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtYnBmLmMsdiAxLjExNiAyMDA4LTA5LTE2IDE4OjQyOjI5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CQkJLyogb3B0aW9uYWxseSBnZXQgQlNEIGRlZmluZSAqLworI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisvKgorICogPG5ldC9icGYuaD4gZGVmaW5lcyBpb2N0bHMsIGJ1dCBkb2Vzbid0IGluY2x1ZGUgPHN5cy9pb2Njb20uaD4uCisgKgorICogV2UgaW5jbHVkZSA8c3lzL2lvY3RsLmg+IGFzIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBkZWNsYXJlIGlvY3RsKCk7CisgKiBhdCBsZWFzdCBvbiAqQlNEIGFuZCBNYWMgT1MgWCwgaXQgYWxzbyBkZWZpbmVzIHZhcmlvdXMgU0lPQyBpb2N0bHMgLQorICogd2UgY291bGQgaW5jbHVkZSA8c3lzL3NvY2tpby5oPiwgYnV0IGlmIHdlJ3JlIGFscmVhZHkgaW5jbHVkaW5nCisgKiA8c3lzL2lvY3RsLmg+LCB3aGljaCBpbmNsdWRlcyA8c3lzL3NvY2tpby5oPiBvbiB0aG9zZSBwbGF0Zm9ybXMsCisgKiB0aGVyZSdzIG5vdCBtdWNoIHBvaW50IGluIGRvaW5nIHNvLgorICoKKyAqIElmIHdlIGhhdmUgPHN5cy9pb2Njb20uaD4sIHdlIGluY2x1ZGUgaXQgYXMgd2VsbCwgdG8gaGFuZGxlIHN5c3RlbXMKKyAqIHN1Y2ggYXMgU29sYXJpcyB3aGljaCBkb24ndCBhcnJhbmdlIHRvIGluY2x1ZGUgPHN5cy9pb2Njb20uaD4gaWYgeW91CisgKiBpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyAqLworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmZGVmIEhBVkVfU1lTX0lPQ0NPTV9ICisjaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisjaW5jbHVkZSA8bWFjaGluZS9hdG9taWMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKyNpZmRlZiBfQUlYCisKKy8qCisgKiBNYWtlICJwY2FwLmgiIG5vdCBpbmNsdWRlICJwY2FwL2JwZi5oIjsgd2UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgdGhlCisgKiBuYXRpdmUgT1MgdmVyc2lvbiwgYXMgd2UgbmVlZCAic3RydWN0IGJwZl9jb25maWciIGZyb20gaXQuCisgKi8KKyNkZWZpbmUgUENBUF9ET05UX0lOQ0xVREVfUENBUF9CUEZfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qCisgKiBQcmV2ZW50IGJwZi5oIGZyb20gcmVkZWZpbmluZyB0aGUgRExUXyB2YWx1ZXMgdG8gdGhlaXIKKyAqIElGVF8gdmFsdWVzLCBhcyB3ZSdyZSBnb2luZyB0byByZXR1cm4gdGhlIHN0YW5kYXJkIGxpYnBjYXAKKyAqIHZhbHVlcywgbm90IElCTSdzIG5vbi1zdGFuZGFyZCBJRlRfIHZhbHVlcy4KKyAqLworI3VuZGVmIF9BSVgKKyNpbmNsdWRlIDxuZXQvYnBmLmg+CisjZGVmaW5lIF9BSVgKKworI2luY2x1ZGUgPG5ldC9pZl90eXBlcy5oPgkJLyogZm9yIElGVF8gdmFsdWVzICovCisjaW5jbHVkZSA8c3lzL3N5c2NvbmZpZy5oPgorI2luY2x1ZGUgPHN5cy9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzeXMvY2Znb2RtLmg+CisjaW5jbHVkZSA8Y2YuaD4KKworI2lmZGVmIF9fNjRCSVRfXworI2RlZmluZSBkb21ha2VkZXYgbWFrZWRldjY0CisjZGVmaW5lIGdldG1ham9yIG1ham9yNjQKKyNkZWZpbmUgYnBmX2hkciBicGZfaGRyMzIKKyNlbHNlIC8qIF9fNjRCSVRfXyAqLworI2RlZmluZSBkb21ha2VkZXYgbWFrZWRldgorI2RlZmluZSBnZXRtYWpvciBtYWpvcgorI2VuZGlmIC8qIF9fNjRCSVRfXyAqLworCisjZGVmaW5lIEJQRl9OQU1FICJicGYiCisjZGVmaW5lIEJQRl9NSU5PUlMgNAorI2RlZmluZSBEUklWRVJfUEFUSCAiL3Vzci9saWIvZHJpdmVycyIKKyNkZWZpbmUgQlBGX05PREUgIi9kZXYvYnBmIgorc3RhdGljIGludCBicGZsb2FkZWRmbGFnID0gMDsKK3N0YXRpYyBpbnQgb2RtbG9ja2lkID0gMDsKKworc3RhdGljIGludCBicGZfbG9hZChjaGFyICplcnJidWYpOworCisjZWxzZSAvKiBfQUlYICovCisKKyNpbmNsdWRlIDxuZXQvYnBmLmg+CisKKyNlbmRpZiAvKiBfQUlYICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBIQVZFX05FVF9JRl9NRURJQV9ICisjIGluY2x1ZGUgPG5ldC9pZl9tZWRpYS5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaWZkZWYgSEFWRV9EQUdfQVBJCisjaW5jbHVkZSAicGNhcC1kYWcuaCIKKyNlbmRpZiAvKiBIQVZFX0RBR19BUEkgKi8KKworI2lmZGVmIEhBVkVfU05GX0FQSQorI2luY2x1ZGUgInBjYXAtc25mLmgiCisjZW5kaWYgLyogSEFWRV9TTkZfQVBJICovCisKKyNpZmRlZiBIQVZFX09TX1BST1RPX0gKKyNpbmNsdWRlICJvcy1wcm90by5oIgorI2VuZGlmCisKKyNpZmRlZiBCSU9DR0RMVExJU1QKKyMgaWYgKGRlZmluZWQoSEFWRV9ORVRfSUZfTUVESUFfSCkgJiYgZGVmaW5lZChJRk1fSUVFRTgwMjExKSkgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorI2RlZmluZSBIQVZFX0JTRF9JRUVFODAyMTEKKyMgZW5kaWYKKworIyBpZiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChIQVZFX0JTRF9JRUVFODAyMTEpCitzdGF0aWMgaW50IGZpbmRfODAyXzExKHN0cnVjdCBicGZfZGx0bGlzdCAqKTsKKworIyAgaWZkZWYgSEFWRV9CU0RfSUVFRTgwMjExCitzdGF0aWMgaW50IG1vbml0b3JfbW9kZShwY2FwX3QgKiwgaW50KTsKKyMgIGVuZGlmCisKKyMgIGlmIGRlZmluZWQoX19BUFBMRV9fKQorc3RhdGljIHZvaWQgcmVtb3ZlX2VuKHBjYXBfdCAqKTsKK3N0YXRpYyB2b2lkIHJlbW92ZV84MDJfMTEocGNhcF90ICopOworIyAgZW5kaWYKKworIyBlbmRpZiAvKiBkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChIQVZFX0JTRF9JRUVFODAyMTEpICovCisKKyNlbmRpZiAvKiBCSU9DR0RMVExJU1QgKi8KKworI2lmIGRlZmluZWQoc3VuKSAmJiBkZWZpbmVkKExJRk5BTVNJWikgJiYgZGVmaW5lZChsaWZyX3pvbmVpZCkKKyNpbmNsdWRlIDx6b25lLmg+CisjZW5kaWYKKworLyoKKyAqIFdlIGluY2x1ZGUgdGhlIE9TJ3MgPG5ldC9icGYuaD4sIG5vdCBvdXIgInBjYXAvYnBmLmgiLCBzbyB3ZSBwcm9iYWJseQorICogZG9uJ3QgZ2V0IERMVF9ET0NTSVMgZGVmaW5lZC4KKyAqLworI2lmbmRlZiBETFRfRE9DU0lTCisjZGVmaW5lIERMVF9ET0NTSVMJMTQzCisjZW5kaWYKKworLyoKKyAqIE9uIE9TIFgsIHdlIGRvbid0IGV2ZW4gZ2V0IGFueSBvZiB0aGUgODAyLjExLXBsdXMtcmFkaW8taGVhZGVyIERMVF8ncworICogZGVmaW5lZCwgZXZlbiB0aG91Z2ggc29tZSBvZiB0aGVtIGFyZSB1c2VkIGJ5IHZhcmlvdXMgQWlycG9ydCBkcml2ZXJzLgorICovCisjaWZuZGVmIERMVF9QUklTTV9IRUFERVIKKyNkZWZpbmUgRExUX1BSSVNNX0hFQURFUgkxMTkKKyNlbmRpZgorI2lmbmRlZiBETFRfQUlST05FVF9IRUFERVIKKyNkZWZpbmUgRExUX0FJUk9ORVRfSEVBREVSCTEyMAorI2VuZGlmCisjaWZuZGVmIERMVF9JRUVFODAyXzExX1JBRElPCisjZGVmaW5lIERMVF9JRUVFODAyXzExX1JBRElPCTEyNworI2VuZGlmCisjaWZuZGVmIERMVF9JRUVFODAyXzExX1JBRElPX0FWUworI2RlZmluZSBETFRfSUVFRTgwMl8xMV9SQURJT19BVlMgMTYzCisjZW5kaWYKKworc3RhdGljIGludCBwY2FwX2Nhbl9zZXRfcmZtb25fYnBmKHBjYXBfdCAqcCk7CitzdGF0aWMgaW50IHBjYXBfYWN0aXZhdGVfYnBmKHBjYXBfdCAqcCk7CitzdGF0aWMgaW50IHBjYXBfc2V0ZmlsdGVyX2JwZihwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApOworc3RhdGljIGludCBwY2FwX3NldGRpcmVjdGlvbl9icGYocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworc3RhdGljIGludCBwY2FwX3NldF9kYXRhbGlua19icGYocGNhcF90ICpwLCBpbnQgZGx0KTsKKworLyoKKyAqIEZvciB6ZXJvY29weSBicGYsIHRoZSBzZXRub25ibG9jay9nZXRub25ibG9jayByb3V0aW5lcyBuZWVkIHRvIG1vZGlmeQorICogcC0+bWQudGltZW91dCBzbyB3ZSBkb24ndCBjYWxsIHNlbGVjdCgyKSBpZiB0aGUgcGNhcCBoYW5kbGUgaXMgaW4gbm9uLQorICogYmxvY2tpbmcgbW9kZS4gIFdlIHByZXNlcnZlIHRoZSB0aW1lb3V0IHN1cHBsaWVkIGJ5IHBjYXBfb3BlbiBmdW5jdGlvbnMKKyAqIHRvIG1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBnZXQgY2xvYmJlcmVkIGlmIHRoZSBwY2FwIGhhbmRsZSBtb3ZlcyBiZXR3ZWVuCisgKiBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIG1vZGUuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfZ2V0bm9uYmxvY2tfYnBmKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKQoreyAKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCWlmIChwLT5tZC56ZXJvY29weSkgeworCQkvKgorCQkgKiBVc2UgYSBuZWdhdGl2ZSB2YWx1ZSBmb3IgdGhlIHRpbWVvdXQgdG8gcmVwcmVzZW50IHRoYXQgdGhlCisJCSAqIHBjYXAgaGFuZGxlIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlLgorCQkgKi8KKwkJcmV0dXJuIChwLT5tZC50aW1lb3V0IDwgMCk7CisJfQorI2VuZGlmCisJcmV0dXJuIChwY2FwX2dldG5vbmJsb2NrX2ZkKHAsIGVycmJ1ZikpOworfQorCitzdGF0aWMgaW50CitwY2FwX3NldG5vbmJsb2NrX2JwZihwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKQoreyAgIAorI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisJaWYgKHAtPm1kLnplcm9jb3B5KSB7CisJCS8qCisJCSAqIE1hcCBlYWNoIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIDIncyBjb21wbGVtZW50LCB0bworCQkgKiBwcmVzZXJ2ZSB0aGUgdGltZW91dCB2YWx1ZSBwcm92aWRlZCB3aXRoIHBjYXBfc2V0X3RpbWVvdXQuCisJCSAqIChmcm9tIHBjYXAtbGludXguYykuCisJCSAqLworCQlpZiAobm9uYmxvY2spIHsKKwkJCWlmIChwLT5tZC50aW1lb3V0ID49IDApIHsKKwkJCQkvKgorCQkJCSAqIFRpbWVvdXQgaXMgbm9uLW5lZ2F0aXZlLCBzbyB3ZSdyZSBub3QKKwkJCQkgKiBjdXJyZW50bHkgaW4gbm9uLWJsb2NraW5nIG1vZGU7IHNldCBpdAorCQkJCSAqIHRvIHRoZSAyJ3MgY29tcGxlbWVudCwgdG8gbWFrZSBpdAorCQkJCSAqIG5lZ2F0aXZlLCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgd2UncmUKKwkJCQkgKiBpbiBub24tYmxvY2tpbmcgbW9kZS4KKwkJCQkgKi8KKwkJCQlwLT5tZC50aW1lb3V0ID0gcC0+bWQudGltZW91dCAqIC0xIC0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChwLT5tZC50aW1lb3V0IDwgMCkgeworCQkJCS8qCisJCQkJICogVGltZW91dCBpcyBuZWdhdGl2ZSwgc28gd2UncmUgY3VycmVudGx5CisJCQkJICogaW4gYmxvY2tpbmcgbW9kZTsgcmV2ZXJzZSB0aGUgcHJldmlvdXMKKwkJCQkgKiBvcGVyYXRpb24sIHRvIG1ha2UgdGhlIHRpbWVvdXQgbm9uLW5lZ2F0aXZlCisJCQkJICogYWdhaW4uCisJCQkJICovCisJCQkJcC0+bWQudGltZW91dCA9IChwLT5tZC50aW1lb3V0ICsgMSkgKiAtMTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gKDApOworCX0KKyNlbmRpZgorCXJldHVybiAocGNhcF9zZXRub25ibG9ja19mZChwLCBub25ibG9jaywgZXJyYnVmKSk7Cit9CisKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorLyoKKyAqIFplcm8tY29weSBCUEYgYnVmZmVyIHJvdXRpbmVzIHRvIGNoZWNrIGZvciBhbmQgYWNrbm93bGVkZ2UgQlBGIGRhdGEgaW4KKyAqIHNoYXJlZCBtZW1vcnkgYnVmZmVycy4KKyAqCisgKiBwY2FwX25leHRfemJ1Zl9zaG0oKTogQ2hlY2sgZm9yIGEgbmV3bHkgYXZhaWxhYmxlIHNoYXJlZCBtZW1vcnkgYnVmZmVyLAorICogYW5kIHNldCB1cCBwLT5idWZmZXIgYW5kIGNjIHRvIHJlZmxlY3Qgb25lIGlmIGF2YWlsYWJsZS4gIE5vdGljZSB0aGF0IGlmCisgKiB0aGVyZSB3YXMgbm8gcHJpb3IgYnVmZmVyLCB3ZSBzZWxlY3QgemJ1ZjEgYXMgdGhpcyB3aWxsIGJlIHRoZSBmaXJzdAorICogYnVmZmVyIGZpbGxlZCBmb3IgYSBmcmVzaCBCUEYgc2Vzc2lvbi4KKyAqLworc3RhdGljIGludAorcGNhcF9uZXh0X3pidWZfc2htKHBjYXBfdCAqcCwgaW50ICpjYykKK3sKKwlzdHJ1Y3QgYnBmX3pidWZfaGVhZGVyICpiemg7CisKKwlpZiAocC0+bWQuemJ1ZmZlciA9PSBwLT5tZC56YnVmMiB8fCBwLT5tZC56YnVmZmVyID09IE5VTEwpIHsKKwkJYnpoID0gKHN0cnVjdCBicGZfemJ1Zl9oZWFkZXIgKilwLT5tZC56YnVmMTsKKwkJaWYgKGJ6aC0+YnpoX3VzZXJfZ2VuICE9CisJCSAgICBhdG9taWNfbG9hZF9hY3FfaW50KCZiemgtPmJ6aF9rZXJuZWxfZ2VuKSkgeworCQkJcC0+bWQuYnpoID0gYnpoOworCQkJcC0+bWQuemJ1ZmZlciA9ICh1X2NoYXIgKilwLT5tZC56YnVmMTsKKwkJCXAtPmJ1ZmZlciA9IHAtPm1kLnpidWZmZXIgKyBzaXplb2YoKmJ6aCk7CisJCQkqY2MgPSBiemgtPmJ6aF9rZXJuZWxfbGVuOworCQkJcmV0dXJuICgxKTsKKwkJfQorCX0gZWxzZSBpZiAocC0+bWQuemJ1ZmZlciA9PSBwLT5tZC56YnVmMSkgeworCQliemggPSAoc3RydWN0IGJwZl96YnVmX2hlYWRlciAqKXAtPm1kLnpidWYyOworCQlpZiAoYnpoLT5iemhfdXNlcl9nZW4gIT0KKwkJICAgIGF0b21pY19sb2FkX2FjcV9pbnQoJmJ6aC0+YnpoX2tlcm5lbF9nZW4pKSB7CisJCQlwLT5tZC5iemggPSBiemg7CisJCQlwLT5tZC56YnVmZmVyID0gKHVfY2hhciAqKXAtPm1kLnpidWYyOworICAJCQlwLT5idWZmZXIgPSBwLT5tZC56YnVmZmVyICsgc2l6ZW9mKCpiemgpOworCQkJKmNjID0gYnpoLT5iemhfa2VybmVsX2xlbjsKKwkJCXJldHVybiAoMSk7CisJCX0KKwl9CisJKmNjID0gMDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogcGNhcF9uZXh0X3pidWYoKSAtLSBTaW1pbGFyIHRvIHBjYXBfbmV4dF96YnVmX3NobSgpLCBleGNlcHQgd2FpdCB1c2luZworICogc2VsZWN0KCkgZm9yIGRhdGEgb3IgYSB0aW1lb3V0LCBhbmQgcG9zc2libHkgZm9yY2Ugcm90YXRpb24gb2YgdGhlIGJ1ZmZlcgorICogaW4gdGhlIGV2ZW50IHdlIHRpbWUgb3V0IG9yIGFyZSBpbiBpbW1lZGlhdGUgbW9kZS4gIEludm9rZSB0aGUgc2hhcmVkCisgKiBtZW1vcnkgY2hlY2sgYmVmb3JlIGRvaW5nIHN5c3RlbSBjYWxscyBpbiBvcmRlciB0byBhdm9pZCBkb2luZyBhdm9pZGFibGUKKyAqIHdvcmsuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfbmV4dF96YnVmKHBjYXBfdCAqcCwgaW50ICpjYykKK3sKKwlzdHJ1Y3QgYnBmX3pidWYgYno7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IHRpbWVzcGVjIGN1cjsKKwlmZF9zZXQgcl9zZXQ7CisJaW50IGRhdGEsIHI7CisJaW50IGV4cGlyZSwgdG1vdXQ7CisKKyNkZWZpbmUgVFNUT01JTExJKHRzKSAoKCh0cyktPnR2X3NlYyAqIDEwMDApICsgKCh0cyktPnR2X25zZWMgLyAxMDAwMDAwKSkKKwkvKgorCSAqIFN0YXJ0IG91dCBieSBzZWVpbmcgd2hldGhlciBhbnl0aGluZyBpcyB3YWl0aW5nIGJ5IGNoZWNraW5nIHRoZQorCSAqIG5leHQgc2hhcmVkIG1lbW9yeSBidWZmZXIgZm9yIGRhdGEuCisJICovCisJZGF0YSA9IHBjYXBfbmV4dF96YnVmX3NobShwLCBjYyk7CisJaWYgKGRhdGEpCisJCXJldHVybiAoZGF0YSk7CisJLyoKKwkgKiBJZiBhIHByZXZpb3VzIHNsZWVwIHdhcyBpbnRlcnJ1cHRlZCBkdWUgdG8gc2lnbmFsIGRlbGl2ZXJ5LCBtYWtlCisJICogc3VyZSB0aGF0IHRoZSB0aW1lb3V0IGdldHMgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuICBUaGlzIHJlcXVpcmVzCisJICogdGhhdCB3ZSBhbmFseXplIHdoZW4gdGhlIHRpbWVvdXQgc2hvdWxkIGJlIGJlZW4gZXhwaXJlZCwgYW5kCisJICogc3VidHJhY3QgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoYXQuICBJZiBhZnRlciB0aGlzIG9wZXJhdGlvbiwKKwkgKiBvdXIgdGltZW91dCBpcyBsZXNzIHRoZW4gb3IgZXF1YWwgdG8gemVybywgaGFuZGxlIGl0IGxpa2UgYQorCSAqIHJlZ3VsYXIgdGltZW91dC4KKwkgKi8KKwl0bW91dCA9IHAtPm1kLnRpbWVvdXQ7CisJaWYgKHRtb3V0KQorCQkodm9pZCkgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZjdXIpOworCWlmIChwLT5tZC5pbnRlcnJ1cHRlZCAmJiBwLT5tZC50aW1lb3V0KSB7CisJCWV4cGlyZSA9IFRTVE9NSUxMSSgmcC0+bWQuZmlyc3RzZWwpICsgcC0+bWQudGltZW91dDsKKwkJdG1vdXQgPSBleHBpcmUgLSBUU1RPTUlMTEkoJmN1cik7CisjdW5kZWYgVFNUT01JTExJCisJCWlmICh0bW91dCA8PSAwKSB7CisJCQlwLT5tZC5pbnRlcnJ1cHRlZCA9IDA7CisJCQlkYXRhID0gcGNhcF9uZXh0X3pidWZfc2htKHAsIGNjKTsKKwkJCWlmIChkYXRhKQorCQkJCXJldHVybiAoZGF0YSk7CisJCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NST1RaQlVGLCAmYnopIDwgMCkgeworCQkJCSh2b2lkKSBzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJCSU9DUk9UWkJVRjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCQl9CisJCQlyZXR1cm4gKHBjYXBfbmV4dF96YnVmX3NobShwLCBjYykpOworCQl9CisJfQorCS8qCisJICogTm8gZGF0YSBpbiB0aGUgYnVmZmVyLCBzbyBtdXN0IHVzZSBzZWxlY3QoKSB0byB3YWl0IGZvciBkYXRhIG9yCisJICogdGhlIG5leHQgdGltZW91dC4gIE5vdGUgdGhhdCB3ZSBvbmx5IGNhbGwgc2VsZWN0IGlmIHRoZSBoYW5kbGUKKwkgKiBpcyBpbiBibG9ja2luZyBtb2RlLgorCSAqLworCWlmIChwLT5tZC50aW1lb3V0ID49IDApIHsKKwkJRkRfWkVSTygmcl9zZXQpOworCQlGRF9TRVQocC0+ZmQsICZyX3NldCk7CisJCWlmICh0bW91dCAhPSAwKSB7CisJCQl0di50dl9zZWMgPSB0bW91dCAvIDEwMDA7CisJCQl0di50dl91c2VjID0gKHRtb3V0ICogMTAwMCkgJSAxMDAwMDAwOworCQl9CisJCXIgPSBzZWxlY3QocC0+ZmQgKyAxLCAmcl9zZXQsIE5VTEwsIE5VTEwsCisJCSAgICBwLT5tZC50aW1lb3V0ICE9IDAgPyAmdHYgOiBOVUxMKTsKKwkJaWYgKHIgPCAwICYmIGVycm5vID09IEVJTlRSKSB7CisJCQlpZiAoIXAtPm1kLmludGVycnVwdGVkICYmIHAtPm1kLnRpbWVvdXQpIHsKKwkJCQlwLT5tZC5pbnRlcnJ1cHRlZCA9IDE7CisJCQkJcC0+bWQuZmlyc3RzZWwgPSBjdXI7CisJCQl9CisJCQlyZXR1cm4gKDApOworCQl9IGVsc2UgaWYgKHIgPCAwKSB7CisJCQkodm9pZCkgc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJzZWxlY3Q6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwl9CisJcC0+bWQuaW50ZXJydXB0ZWQgPSAwOworCS8qCisJICogQ2hlY2sgYWdhaW4gZm9yIGRhdGEsIHdoaWNoIG1heSBleGlzdCBub3cgdGhhdCB3ZSd2ZSBlaXRoZXIgYmVlbgorCSAqIHdva2VuIHVwIGFzIGEgcmVzdWx0IG9mIGRhdGEgb3IgdGltZWQgb3V0LiAgVHJ5IHRoZSAidGhlcmUncyBkYXRhIgorCSAqIGNhc2UgZmlyc3Qgc2luY2UgaXQgZG9lc24ndCByZXF1aXJlIGEgc3lzdGVtIGNhbGwuCisJICovCisJZGF0YSA9IHBjYXBfbmV4dF96YnVmX3NobShwLCBjYyk7CisJaWYgKGRhdGEpCisJCXJldHVybiAoZGF0YSk7CisJLyoKKwkgKiBUcnkgZm9yY2luZyBhIGJ1ZmZlciByb3RhdGlvbiB0byBkaXNsb2RnZSB0aW1lZCBvdXQgb3IgaW1tZWRpYXRlCisJICogZGF0YS4KKwkgKi8KKwlpZiAoaW9jdGwocC0+ZmQsIEJJT0NST1RaQlVGLCAmYnopIDwgMCkgeworCQkodm9pZCkgc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkJJT0NST1RaQlVGOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCXJldHVybiAocGNhcF9uZXh0X3pidWZfc2htKHAsIGNjKSk7Cit9CisKKy8qCisgKiBOb3RpZnkga2VybmVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYnVmZmVyLiAgV2UgZG9uJ3QgcmVzZXQgemJ1ZmZlciBzbworICogdGhhdCB3ZSBrbm93IHdoaWNoIGJ1ZmZlciB0byB1c2UgbmV4dCB0aW1lIGFyb3VuZC4KKyAqLworc3RhdGljIGludAorcGNhcF9hY2tfemJ1ZihwY2FwX3QgKnApCit7CisKKwlhdG9taWNfc3RvcmVfcmVsX2ludCgmcC0+bWQuYnpoLT5iemhfdXNlcl9nZW4sCisJICAgIHAtPm1kLmJ6aC0+YnpoX2tlcm5lbF9nZW4pOworCXAtPm1kLmJ6aCA9IE5VTEw7CisJcC0+YnVmZmVyID0gTlVMTDsKKwlyZXR1cm4gKDApOworfQorI2VuZGlmIC8qIEhBVkVfWkVST0NPUFlfQlBGICovCisKK3BjYXBfdCAqCitwY2FwX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpwOworCisjaWZkZWYgSEFWRV9EQUdfQVBJCisJaWYgKHN0cnN0cihkZXZpY2UsICJkYWciKSkKKwkJcmV0dXJuIChkYWdfY3JlYXRlKGRldmljZSwgZWJ1ZikpOworI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLworI2lmZGVmIEhBVkVfU05GX0FQSQorCWlmIChzdHJzdHIoZGV2aWNlLCAic25mIikpCisJCXJldHVybiAoc25mX2NyZWF0ZShkZXZpY2UsIGVidWYpKTsKKyNlbmRpZiAvKiBIQVZFX1NORl9BUEkgKi8KKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX2JwZjsKKwlwLT5jYW5fc2V0X3JmbW9uX29wID0gcGNhcF9jYW5fc2V0X3JmbW9uX2JwZjsKKwlyZXR1cm4gKHApOworfQorCisvKgorICogT24gc3VjY2VzcywgcmV0dXJucyBhIGZpbGUgZGVzY3JpcHRvciBmb3IgYSBCUEYgZGV2aWNlLgorICogT24gZmFpbHVyZSwgcmV0dXJucyBhIFBDQVBfRVJST1JfIHZhbHVlLCBhbmQgc2V0cyBwLT5lcnJidWYuCisgKi8KK3N0YXRpYyBpbnQKK2JwZl9vcGVuKHBjYXBfdCAqcCkKK3sKKwlpbnQgZmQ7CisjaWZkZWYgSEFWRV9DTE9OSU5HX0JQRgorCXN0YXRpYyBjb25zdCBjaGFyIGRldmljZVtdID0gIi9kZXYvYnBmIjsKKyNlbHNlCisJaW50IG4gPSAwOworCWNoYXIgZGV2aWNlW3NpemVvZiAiL2Rldi9icGYwMDAwMDAwMDAwIl07CisjZW5kaWYKKworI2lmZGVmIF9BSVgKKwkvKgorCSAqIExvYWQgdGhlIGJwZiBkcml2ZXIsIGlmIGl0IGlzbid0IGFscmVhZHkgbG9hZGVkLAorCSAqIGFuZCBjcmVhdGUgdGhlIEJQRiBkZXZpY2UgZW50cmllcywgaWYgdGhleSBkb24ndAorCSAqIGFscmVhZHkgZXhpc3QuCisJICovCisJaWYgKGJwZl9sb2FkKHAtPmVycmJ1ZikgPT0gUENBUF9FUlJPUikKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DTE9OSU5HX0JQRgorCWlmICgoZmQgPSBvcGVuKGRldmljZSwgT19SRFdSKSkgPT0gLTEgJiYKKwkgICAgKGVycm5vICE9IEVBQ0NFUyB8fCAoZmQgPSBvcGVuKGRldmljZSwgT19SRE9OTFkpKSA9PSAtMSkpIHsKKwkJaWYgKGVycm5vID09IEVBQ0NFUykKKwkJCWZkID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKKwkJZWxzZQorCQkJZmQgPSBQQ0FQX0VSUk9SOworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgIihjYW5ub3Qgb3BlbiBkZXZpY2UpICVzOiAlcyIsIGRldmljZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCX0KKyNlbHNlCisJLyoKKwkgKiBHbyB0aHJvdWdoIGFsbCB0aGUgbWlub3JzIGFuZCBmaW5kIG9uZSB0aGF0IGlzbid0IGluIHVzZS4KKwkgKi8KKwlkbyB7CisJCSh2b2lkKXNucHJpbnRmKGRldmljZSwgc2l6ZW9mKGRldmljZSksICIvZGV2L2JwZiVkIiwgbisrKTsKKwkJLyoKKwkJICogSW5pdGlhbGx5IHRyeSBhIHJlYWQvd3JpdGUgb3BlbiAodG8gYWxsb3cgdGhlIGluamVjdAorCQkgKiBtZXRob2QgdG8gd29yaykuICBJZiB0aGF0IGZhaWxzIGR1ZSB0byBwZXJtaXNzaW9uCisJCSAqIGlzc3VlcywgZmFsbCBiYWNrIHRvIHJlYWQtb25seS4gIFRoaXMgYWxsb3dzIGEKKwkJICogbm9uLXJvb3QgdXNlciB0byBiZSBncmFudGVkIHNwZWNpZmljIGFjY2VzcyB0byBwY2FwCisJCSAqIGNhcGFiaWxpdGllcyB2aWEgZmlsZSBwZXJtaXNzaW9ucy4KKwkJICoKKwkJICogWFhYIC0gd2Ugc2hvdWxkIGhhdmUgYW4gQVBJIHRoYXQgaGFzIGEgZmxhZyB0aGF0CisJCSAqIGNvbnRyb2xzIHdoZXRoZXIgdG8gb3BlbiByZWFkLW9ubHkgb3IgcmVhZC13cml0ZSwKKwkJICogc28gdGhhdCBkZW5pYWwgb2YgcGVybWlzc2lvbiB0byBzZW5kIChvciBpbmFiaWxpdHkKKwkJICogdG8gc2VuZCwgaWYgc2VuZGluZyBwYWNrZXRzIGlzbid0IHN1cHBvcnRlZCBvbgorCQkgKiB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uKSBjYW4gYmUgaW5kaWNhdGVkIGF0IG9wZW4KKwkJICogdGltZS4KKwkJICovCisJCWZkID0gb3BlbihkZXZpY2UsIE9fUkRXUik7CisJCWlmIChmZCA9PSAtMSAmJiBlcnJubyA9PSBFQUNDRVMpCisJCQlmZCA9IG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJfSB3aGlsZSAoZmQgPCAwICYmIGVycm5vID09IEVCVVNZKTsKKworCS8qCisJICogWFhYIGJldHRlciBtZXNzYWdlIGZvciBhbGwgbWlub3JzIHVzZWQKKwkgKi8KKwlpZiAoZmQgPCAwKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKworCQljYXNlIEVOT0VOVDoKKwkJCWZkID0gUENBUF9FUlJPUjsKKwkJCWlmIChuID09IDEpIHsKKwkJCQkvKgorCQkJCSAqIC9kZXYvYnBmMCBkb2Vzbid0IGV4aXN0LCB3aGljaAorCQkJCSAqIG1lYW5zIHdlIHByb2JhYmx5IGhhdmUgbm8gQlBGCisJCQkJICogZGV2aWNlcy4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICIodGhlcmUgYXJlIG5vIEJQRiBkZXZpY2VzKSIpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFdlIGdvdCBFQlVTWSBvbiBhdCBsZWFzdCBvbmUKKwkJCQkgKiBCUEYgZGV2aWNlLCBzbyB3ZSBoYXZlIEJQRgorCQkJCSAqIGRldmljZXMsIGJ1dCBhbGwgdGhlIG9uZXMKKwkJCQkgKiB0aGF0IGV4aXN0IGFyZSBidXN5LgorCQkJCSAqLworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIihhbGwgQlBGIGRldmljZXMgYXJlIGJ1c3kpIik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEVBQ0NFUzoKKwkJCS8qCisJCQkgKiBHb3QgRUFDQ0VTIG9uIHRoZSBsYXN0IGRldmljZSB3ZSB0cmllZCwKKwkJCSAqIGFuZCBFQlVTWSBvbiBhbGwgZGV2aWNlcyBiZWZvcmUgdGhhdCwKKwkJCSAqIGlmIGFueS4KKwkJCSAqLworCQkJZmQgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICIoY2Fubm90IG9wZW4gQlBGIGRldmljZSkgJXM6ICVzIiwgZGV2aWNlLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogU29tZSBvdGhlciBwcm9ibGVtLgorCQkJICovCisJCQlmZCA9IFBDQVBfRVJST1I7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIihjYW5ub3Qgb3BlbiBCUEYgZGV2aWNlKSAlczogJXMiLCBkZXZpY2UsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiAoZmQpOworfQorCisjaWZkZWYgQklPQ0dETFRMSVNUCitzdGF0aWMgaW50CitnZXRfZGx0X2xpc3QoaW50IGZkLCBpbnQgdiwgc3RydWN0IGJwZl9kbHRsaXN0ICpiZGxwLCBjaGFyICplYnVmKQoreworCW1lbXNldChiZGxwLCAwLCBzaXplb2YoKmJkbHApKTsKKwlpZiAoaW9jdGwoZmQsIEJJT0NHRExUTElTVCwgKGNhZGRyX3QpYmRscCkgPT0gMCkgeworCQl1X2ludCBpOworCQlpbnQgaXNfZXRoZXJuZXQ7CisKKwkJYmRscC0+YmZsX2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAoYmRscC0+YmZsX2xlbiArIDEpKTsKKwkJaWYgKGJkbHAtPmJmbF9saXN0ID09IE5VTEwpIHsKKwkJCSh2b2lkKXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCQl9CisKKwkJaWYgKGlvY3RsKGZkLCBCSU9DR0RMVExJU1QsIChjYWRkcl90KWJkbHApIDwgMCkgeworCQkJKHZvaWQpc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiQklPQ0dETFRMSVNUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZyZWUoYmRscC0+YmZsX2xpc3QpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCisJCS8qCisJCSAqIE9LLCBmb3IgcmVhbCBFdGhlcm5ldCBkZXZpY2VzLCBhZGQgRExUX0RPQ1NJUyB0byB0aGUKKwkJICogbGlzdCwgc28gdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gbGV0IHlvdSBjaG9vc2UgaXQsCisJCSAqIGluIGNhc2UgeW91J3JlIGNhcHR1cmluZyBET0NTSVMgdHJhZmZpYyB0aGF0IGEgQ2lzY28KKwkJICogQ2FibGUgTW9kZW0gVGVybWluYXRpb24gU3lzdGVtIGlzIHB1dHRpbmcgb3V0IG9udG8KKwkJICogYW4gRXRoZXJuZXQgKGl0IGRvZXNuJ3QgcHV0IGFuIEV0aGVybmV0IGhlYWRlciBvbnRvCisJCSAqIHRoZSB3aXJlLCBpdCBwdXRzIHJhdyBET0NTSVMgZnJhbWVzIG91dCBvbiB0aGUgd2lyZQorCQkgKiBpbnNpZGUgdGhlIGxvdy1sZXZlbCBFdGhlcm5ldCBmcmFtaW5nKS4KKwkJICoKKwkJICogQSAicmVhbCBFdGhlcm5ldCBkZXZpY2UiIGlzIGRlZmluZWQgaGVyZSBhcyBhIGRldmljZQorCQkgKiB0aGF0IGhhcyBhIGxpbmstbGF5ZXIgdHlwZSBvZiBETFRfRU4xME1CIGFuZCB0aGF0IGhhcworCQkgKiBubyBhbHRlcm5hdGUgbGluay1sYXllciB0eXBlczsgdGhhdCdzIGRvbmUgdG8gZXhjbHVkZQorCQkgKiA4MDIuMTEgaW50ZXJmYWNlcyAod2hpY2ggbWlnaHQgb3IgbWlnaHQgbm90IGJlIHRoZQorCQkgKiByaWdodCB0aGluZyB0byBkbywgYnV0IEkgc3VzcGVjdCBpdCBpcyAtIEV0aGVybmV0IDwtPgorCQkgKiA4MDIuMTEgYnJpZGdlcyB3b3VsZCBwcm9iYWJseSBiYWRseSBtaXNoYW5kbGUgZnJhbWVzCisJCSAqIHRoYXQgZG9uJ3QgaGF2ZSBFdGhlcm5ldCBoZWFkZXJzKS4KKwkJICoKKwkJICogT24gU29sYXJpcyB3aXRoIEJQRiwgRXRoZXJuZXQgZGV2aWNlcyBhbHNvIG9mZmVyCisJCSAqIERMVF9JUE5FVCwgc28gd2UsIGlmIERMVF9JUE5FVCBpcyBkZWZpbmVkLCB3ZSBkb24ndAorCQkgKiB0cmVhdCBpdCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGRldmljZSBpc24ndCBhbgorCQkgKiBFdGhlcm5ldC4KKwkJICovCisJCWlmICh2ID09IERMVF9FTjEwTUIpIHsKKwkJCWlzX2V0aGVybmV0ID0gMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBiZGxwLT5iZmxfbGVuOyBpKyspIHsKKwkJCQlpZiAoYmRscC0+YmZsX2xpc3RbaV0gIT0gRExUX0VOMTBNQgorI2lmZGVmIERMVF9JUE5FVAorCQkJCSAgICAmJiBiZGxwLT5iZmxfbGlzdFtpXSAhPSBETFRfSVBORVQKKyNlbmRpZgorCQkJCSAgICApIHsKKwkJCQkJaXNfZXRoZXJuZXQgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaXNfZXRoZXJuZXQpIHsKKwkJCQkvKgorCQkJCSAqIFdlIHJlc2VydmVkIG9uZSBtb3JlIHNsb3QgYXQgdGhlIGVuZCBvZgorCQkJCSAqIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCWJkbHAtPmJmbF9saXN0W2JkbHAtPmJmbF9sZW5dID0gRExUX0RPQ1NJUzsKKwkJCQliZGxwLT5iZmxfbGVuKys7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBFSU5WQUwganVzdCBtZWFucyAid2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIGlvY3RsIG9uCisJCSAqIHRoaXMgZGV2aWNlIjsgZG9uJ3QgdHJlYXQgaXQgYXMgYW4gZXJyb3IuCisJCSAqLworCQlpZiAoZXJybm8gIT0gRUlOVkFMKSB7CisJCQkodm9pZClzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJCSU9DR0RMVExJU1Q6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCX0KKwlyZXR1cm4gKDApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3BjYXBfY2FuX3NldF9yZm1vbl9icGYocGNhcF90ICpwKQoreworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorCXN0cnVjdCB1dHNuYW1lIG9zaW5mbzsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKyNpZmRlZiBCSU9DR0RMVExJU1QKKwlzdHJ1Y3QgYnBmX2RsdGxpc3QgYmRsOworI2VuZGlmCisKKwkvKgorCSAqIFRoZSBqb3lzIG9mIG1vbml0b3IgbW9kZSBvbiBPUyBYLgorCSAqCisJICogUHJpb3IgdG8gMTAuNCwgaXQncyBub3Qgc3VwcG9ydGVkIGF0IGFsbC4KKwkgKgorCSAqIEluIDEwLjQsIGlmIGFkYXB0ZXIgZW5OIHN1cHBvcnRzIG1vbml0b3IgbW9kZSwgdGhlcmUncyBhCisJICogd2x0TiBhZGFwdGVyIGNvcnJlc3BvbmRpbmcgdG8gaXQ7IHlvdSBvcGVuIGl0LCBpbnN0ZWFkIG9mCisJICogZW5OLCB0byBnZXQgbW9uaXRvciBtb2RlLiAgWW91IGdldCB3aGF0ZXZlciBsaW5rLWxheWVyCisJICogaGVhZGVycyBpdCBzdXBwbGllcy4KKwkgKgorCSAqIEluIDEwLjUsIGFuZCwgd2UgYXNzdW1lLCBsYXRlciByZWxlYXNlcywgaWYgYWRhcHRlciBlbk4KKwkgKiBzdXBwb3J0cyBtb25pdG9yIG1vZGUsIGl0IG9mZmVycywgYW1vbmcgaXRzIHNlbGVjdGFibGUKKwkgKiBETFRfIHZhbHVlcywgdmFsdWVzIHRoYXQgbGV0IHlvdSBnZXQgdGhlIDgwMi4xMSBoZWFkZXI7CisJICogc2VsZWN0aW5nIG9uZSBvZiB0aG9zZSB2YWx1ZXMgcHV0cyB0aGUgYWRhcHRlciBpbnRvIG1vbml0b3IKKwkgKiBtb2RlIChpLmUuLCB5b3UgY2FuJ3QgZ2V0IDgwMi4xMSBoZWFkZXJzIGV4Y2VwdCBpbiBtb25pdG9yCisJICogbW9kZSwgYW5kIHlvdSBjYW4ndCBnZXQgRXRoZXJuZXQgaGVhZGVycyBpbiBtb25pdG9yIG1vZGUpLgorCSAqLworCWlmICh1bmFtZSgmb3NpbmZvKSA9PSAtMSkgeworCQkvKgorCQkgKiBDYW4ndCBnZXQgdGhlIE9TIHZlcnNpb247IGp1c3Qgc2F5ICJubyIuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KKwkvKgorCSAqIFdlIGFzc3VtZSBvc2luZm8uc3lzbmFtZSBpcyAiRGFyd2luIiwgYmVjYXVzZQorCSAqIF9fQVBQTEVfXyBpcyBkZWZpbmVkLiAgV2UganVzdCBjaGVjayB0aGUgdmVyc2lvbi4KKwkgKi8KKwlpZiAob3NpbmZvLnJlbGVhc2VbMF0gPCAnOCcgJiYgb3NpbmZvLnJlbGVhc2VbMV0gPT0gJy4nKSB7CisJCS8qCisJCSAqIDEwLjMgKERhcndpbiA3LngpIG9yIGVhcmxpZXIuCisJCSAqIE1vbml0b3IgbW9kZSBub3Qgc3VwcG9ydGVkLgorCQkgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisJaWYgKG9zaW5mby5yZWxlYXNlWzBdID09ICc4JyAmJiBvc2luZm8ucmVsZWFzZVsxXSA9PSAnLicpIHsKKwkJLyoKKwkJICogMTAuNCAoRGFyd2luIDgueCkuICBzL2VuL3dsdC8sIGFuZCBjaGVjaworCQkgKiB3aGV0aGVyIHRoZSBkZXZpY2UgZXhpc3RzLgorCQkgKi8KKwkJaWYgKHN0cm5jbXAocC0+b3B0LnNvdXJjZSwgImVuIiwgMikgIT0gMCkgeworCQkJLyoKKwkJCSAqIE5vdCBhbiBlbk4gZGV2aWNlOyBubyBtb25pdG9yIG1vZGUuCisJCQkgKi8KKwkJCXJldHVybiAoMCk7CisJCX0KKwkJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJCWlmIChmZCA9PSAtMSkgeworCQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCQlzdHJsY3B5KGlmci5pZnJfbmFtZSwgIndsdCIsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJc3RybGNhdChpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UgKyAyLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCWlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZnIpIDwgMCkgeworCQkJLyoKKwkJCSAqIE5vIHN1Y2ggZGV2aWNlPworCQkJICovCisJCQljbG9zZShmZCk7CisJCQlyZXR1cm4gKDApOworCQl9CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuICgxKTsKKwl9CisKKyNpZmRlZiBCSU9DR0RMVExJU1QKKwkvKgorCSAqIEV2ZXJ5dGhpbmcgZWxzZSBpcyAxMC41IG9yIGxhdGVyOyBmb3IgdGhvc2UsCisJICogd2UganVzdCBvcGVuIHRoZSBlbk4gZGV2aWNlLCBhbmQgY2hlY2sgd2hldGhlcgorCSAqIHdlIGhhdmUgYW55IDgwMi4xMSBkZXZpY2VzLgorCSAqCisJICogRmlyc3QsIG9wZW4gYSBCUEYgZGV2aWNlLgorCSAqLworCWZkID0gYnBmX29wZW4ocCk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIChmZCk7CS8qIGZkIGlzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBjb2RlICovCisKKwkvKgorCSAqIE5vdyBiaW5kIHRvIHRoZSBkZXZpY2UuCisJICovCisJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwlpZiAoaW9jdGwoZmQsIEJJT0NTRVRJRiwgKGNhZGRyX3QpJmlmcikgPCAwKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKworCQljYXNlIEVOWElPOgorCQkJLyoKKwkJCSAqIFRoZXJlJ3Mgbm8gc3VjaCBkZXZpY2UuCisJCQkgKi8KKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSk7CisKKwkJY2FzZSBFTkVURE9XTjoKKwkJCS8qCisJCQkgKiBSZXR1cm4gYSAibmV0d29yayBkb3duIiBpbmRpY2F0aW9uLCBzbyB0aGF0CisJCQkgKiB0aGUgYXBwbGljYXRpb24gY2FuIHJlcG9ydCB0aGF0IHJhdGhlciB0aGFuCisJCQkgKiBzYXlpbmcgd2UgaGFkIGEgbXlzdGVyaW91cyBmYWlsdXJlIGFuZAorCQkJICogc3VnZ2VzdCB0aGF0IHRoZXkgcmVwb3J0IGEgcHJvYmxlbSB0byB0aGUKKwkJCSAqIGxpYnBjYXAgZGV2ZWxvcGVycy4KKwkJCSAqLworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCk7CisKKwkJZGVmYXVsdDoKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiQklPQ1NFVElGOiAlczogJXMiLAorCQkJICAgIHAtPm9wdC5zb3VyY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGtub3cgdGhlIGRlZmF1bHQgbGluayB0eXBlIC0tIG5vdyBkZXRlcm1pbmUgYWxsIHRoZSBETFRzCisJICogdGhpcyBpbnRlcmZhY2Ugc3VwcG9ydHMuICBJZiB0aGlzIGZhaWxzIHdpdGggRUlOVkFMLCBpdCdzCisJICogbm90IGZhdGFsOyB3ZSBqdXN0IGRvbid0IGdldCB0byB1c2UgdGhlIGZlYXR1cmUgbGF0ZXIuCisJICogKFdlIGRvbid0IGNhcmUgYWJvdXQgRExUX0RPQ1NJUywgc28gd2UgcGFzcyBETFRfTlVMTAorCSAqIGFzIHRoZSBkZWZhdWx0IERMVCBmb3IgdGhpcyBhZGFwdGVyLikKKwkgKi8KKwlpZiAoZ2V0X2RsdF9saXN0KGZkLCBETFRfTlVMTCwgJmJkbCwgcC0+ZXJyYnVmKSA9PSBQQ0FQX0VSUk9SKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisJaWYgKGZpbmRfODAyXzExKCZiZGwpICE9IC0xKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYW4gODAyLjExIERMVCwgc28gd2UgY2FuIHNldCBtb25pdG9yIG1vZGUuCisJCSAqLworCQlmcmVlKGJkbC5iZmxfbGlzdCk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJZnJlZShiZGwuYmZsX2xpc3QpOworI2VuZGlmIC8qIEJJT0NHRExUTElTVCAqLworCXJldHVybiAoMCk7CisjZWxpZiBkZWZpbmVkKEhBVkVfQlNEX0lFRUU4MDIxMSkKKwlpbnQgcmV0OworCisJcmV0ID0gbW9uaXRvcl9tb2RlKHAsIDApOworCWlmIChyZXQgPT0gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVApCisJCXJldHVybiAoMCk7CS8qIG5vdCBhbiBlcnJvciwganVzdCBhICJjYW4ndCBkbyIgKi8KKwlpZiAocmV0ID09IDApCisJCXJldHVybiAoMSk7CS8qIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gKHJldCk7CisjZWxzZQorCXJldHVybiAoMCk7CisjZW5kaWYKK30KKworc3RhdGljIGludAorcGNhcF9zdGF0c19icGYocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykKK3sKKwlzdHJ1Y3QgYnBmX3N0YXQgczsKKworCS8qCisJICogInBzX3JlY3YiIGNvdW50cyBwYWNrZXRzIGhhbmRlZCB0byB0aGUgZmlsdGVyLCBub3QgcGFja2V0cworCSAqIHRoYXQgcGFzc2VkIHRoZSBmaWx0ZXIuICBUaGlzIGluY2x1ZGVzIHBhY2tldHMgbGF0ZXIgZHJvcHBlZAorCSAqIGJlY2F1c2Ugd2UgcmFuIG91dCBvZiBidWZmZXIgc3BhY2UuCisJICoKKwkgKiAicHNfZHJvcCIgY291bnRzIHBhY2tldHMgZHJvcHBlZCBpbnNpZGUgdGhlIEJQRiBkZXZpY2UKKwkgKiBiZWNhdXNlIHdlIHJhbiBvdXQgb2YgYnVmZmVyIHNwYWNlLiAgSXQgZG9lc24ndCBjb3VudAorCSAqIHBhY2tldHMgZHJvcHBlZCBieSB0aGUgaW50ZXJmYWNlIGRyaXZlci4gIEl0IGNvdW50cworCSAqIG9ubHkgcGFja2V0cyB0aGF0IHBhc3NlZCB0aGUgZmlsdGVyLgorCSAqCisJICogQm90aCBzdGF0aXN0aWNzIGluY2x1ZGUgcGFja2V0cyBub3QgeWV0IHJlYWQgZnJvbSB0aGUga2VybmVsCisJICogYnkgbGlicGNhcCwgYW5kIHRodXMgbm90IHlldCBzZWVuIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKwkgKi8KKwlpZiAoaW9jdGwocC0+ZmQsIEJJT0NHU1RBVFMsIChjYWRkcl90KSZzKSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ0dTVEFUUzogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKworCXBzLT5wc19yZWN2ID0gcy5ic19yZWN2OworCXBzLT5wc19kcm9wID0gcy5ic19kcm9wOworCXBzLT5wc19pZmRyb3AgPSAwOworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfcmVhZF9icGYocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwlpbnQgY2M7CisJaW50IG4gPSAwOworCXJlZ2lzdGVyIHVfY2hhciAqYnAsICplcDsKKwl1X2NoYXIgKmRhdGFwOworI2lmZGVmIFBDQVBfRkRESVBBRAorCXJlZ2lzdGVyIGludCBwYWQ7CisjZW5kaWYKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCWludCBpOworI2VuZGlmCisKKyBhZ2FpbjoKKwkvKgorCSAqIEhhcyAicGNhcF9icmVha2xvb3AoKSIgYmVlbiBjYWxsZWQ/CisJICovCisJaWYgKHAtPmJyZWFrX2xvb3ApIHsKKwkJLyoKKwkJICogWWVzIC0gY2xlYXIgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpdAorCQkgKiBoYXMsIGFuZCByZXR1cm4gUENBUF9FUlJPUl9CUkVBSyB0byBpbmRpY2F0ZQorCQkgKiB0aGF0IHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCSAqLworCQlwLT5icmVha19sb29wID0gMDsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX0JSRUFLKTsKKwl9CisJY2MgPSBwLT5jYzsKKwlpZiAocC0+Y2MgPT0gMCkgeworCQkvKgorCQkgKiBXaGVuIHJlYWRpbmcgd2l0aG91dCB6ZXJvLWNvcHkgZnJvbSBhIGZpbGUgZGVzY3JpcHRvciwgd2UKKwkJICogdXNlIGEgc2luZ2xlIGJ1ZmZlciBhbmQgcmV0dXJuIGEgbGVuZ3RoIG9mIGRhdGEgaW4gdGhlCisJCSAqIGJ1ZmZlci4gIFdpdGggemVyby1jb3B5LCB3ZSB1cGRhdGUgdGhlIHAtPmJ1ZmZlciBwb2ludGVyCisJCSAqIHRvIHBvaW50IGF0IHdoYXRldmVyIHVuZGVybHlpbmcgYnVmZmVyIGNvbnRhaW5zIHRoZSBuZXh0CisJCSAqIGRhdGEgYW5kIHVwZGF0ZSBjYyB0byByZWZsZWN0IHRoZSBkYXRhIGZvdW5kIGluIHRoZQorCQkgKiBidWZmZXIuCisJCSAqLworI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisJCWlmIChwLT5tZC56ZXJvY29weSkgeworCQkJaWYgKHAtPmJ1ZmZlciAhPSBOVUxMKQorCQkJCXBjYXBfYWNrX3pidWYocCk7CisJCQlpID0gcGNhcF9uZXh0X3pidWYocCwgJmNjKTsKKwkJCWlmIChpID09IDApCisJCQkJZ290byBhZ2FpbjsKKwkJCWlmIChpIDwgMCkKKwkJCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQljYyA9IHJlYWQocC0+ZmQsIChjaGFyICopcC0+YnVmZmVyLCBwLT5idWZzaXplKTsKKwkJfQorCQlpZiAoY2MgPCAwKSB7CisJCQkvKiBEb24ndCBjaG9rZSB3aGVuIHdlIGdldCBwdHJhY2VkICovCisJCQlzd2l0Y2ggKGVycm5vKSB7CisKKwkJCWNhc2UgRUlOVFI6CisJCQkJZ290byBhZ2FpbjsKKworI2lmZGVmIF9BSVgKKwkJCWNhc2UgRUZBVUxUOgorCQkJCS8qCisJCQkJICogU2lnaC4gIE1vcmUgQUlYIHdvbmRlcmZ1bG5lc3MuCisJCQkJICoKKwkJCQkgKiBGb3Igc29tZSB1bmtub3duIHJlYXNvbiB0aGUgdWlvbW92ZSgpCisJCQkJICogb3BlcmF0aW9uIGluIHRoZSBicGYga2VybmVsIGV4dGVuc2lvbgorCQkJCSAqIHVzZWQgdG8gY29weSB0aGUgYnVmZmVyIGludG8gdXNlcgorCQkJCSAqIHNwYWNlIHNvbWV0aW1lcyByZXR1cm5zIEVGQVVMVC4gSSBoYXZlCisJCQkJICogbm8gaWRlYSB3aHkgdGhpcyBpcyB0aGUgY2FzZSBnaXZlbiB0aGF0CisJCQkJICogYSBrZXJuZWwgZGVidWdnZXIgc2hvd3MgdGhlIHVzZXIgYnVmZmVyCisJCQkJICogaXMgY29ycmVjdC4gVGhpcyBwcm9ibGVtIGFwcGVhcnMgdG8KKwkJCQkgKiBiZSBtb3N0bHkgbWl0aWdhdGVkIGJ5IHRoZSBtZW1zZXQgb2YKKwkJCQkgKiB0aGUgYnVmZmVyIGJlZm9yZSBpdCBpcyBmaXJzdCB1c2VkLgorCQkJCSAqIFZlcnkgc3RyYW5nZS4uLi4gU2hhdW4gQ2xvd2VzCisJCQkJICoKKwkJCQkgKiBJbiBhbnkgY2FzZSB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkbid0CisJCQkJICogdHJlYXQgRUZBVUxUIGFzIGEgZmF0YWwgZXJyb3I7IGFzIHdlCisJCQkJICogZG9uJ3QgaGF2ZSBhbiBBUEkgZm9yIHJldHVybmluZworCQkJCSAqIGEgInNvbWUgcGFja2V0cyB3ZXJlIGRyb3BwZWQgc2luY2UKKwkJCQkgKiB0aGUgbGFzdCBwYWNrZXQgeW91IHNhdyIgaW5kaWNhdGlvbiwKKwkJCQkgKiB3ZSBqdXN0IGlnbm9yZSBFRkFVTFQgYW5kIGtlZXAgcmVhZGluZy4KKwkJCQkgKi8KKwkJCQlnb3RvIGFnYWluOworI2VuZGlmCisKKwkJCWNhc2UgRVdPVUxEQkxPQ0s6CisJCQkJcmV0dXJuICgwKTsKKworCQkJY2FzZSBFTlhJTzoKKwkJCQkvKgorCQkJCSAqIFRoZSBkZXZpY2Ugb24gd2hpY2ggd2UncmUgY2FwdHVyaW5nCisJCQkJICogd2VudCBhd2F5LgorCQkJCSAqCisJCQkJICogWFhYIC0gd2Ugc2hvdWxkIHJlYWxseSByZXR1cm4KKwkJCQkgKiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCwgYnV0CisJCQkJICogcGNhcF9kaXNwYXRjaCgpIGV0Yy4gYXJlbid0CisJCQkJICogZGVmaW5lZCB0byByZXR1ciB0aGF0LgorCQkJCSAqLworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIlRoZSBpbnRlcmZhY2Ugd2VudCBkb3duIik7CisJCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKworI2lmIGRlZmluZWQoc3VuKSAmJiAhZGVmaW5lZChCU0QpICYmICFkZWZpbmVkKF9fc3ZyNF9fKSAmJiAhZGVmaW5lZChfX1NWUjQpCisJCQkvKgorCQkJICogRHVlIHRvIGEgU3VuT1MgYnVnLCBhZnRlciAyXjMxIGJ5dGVzLCB0aGUga2VybmVsCisJCQkgKiBmaWxlIG9mZnNldCBvdmVyZmxvd3MgYW5kIHJlYWQgZmFpbHMgd2l0aCBFSU5WQUwuCisJCQkgKiBUaGUgbHNlZWsoKSB0byAwIHdpbGwgZml4IHRoaW5ncy4KKwkJCSAqLworCQkJY2FzZSBFSU5WQUw6CisJCQkJaWYgKGxzZWVrKHAtPmZkLCAwTCwgU0VFS19DVVIpICsKKwkJCQkgICAgcC0+YnVmc2l6ZSA8IDApIHsKKwkJCQkJKHZvaWQpbHNlZWsocC0+ZmQsIDBMLCBTRUVLX1NFVCk7CisJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworI2VuZGlmCisJCQl9CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJyZWFkOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCQlicCA9IHAtPmJ1ZmZlcjsKKwl9IGVsc2UKKwkJYnAgPSBwLT5icDsKKworCS8qCisJICogTG9vcCB0aHJvdWdoIGVhY2ggcGFja2V0LgorCSAqLworI2RlZmluZSBiaHAgKChzdHJ1Y3QgYnBmX2hkciAqKWJwKQorCWVwID0gYnAgKyBjYzsKKyNpZmRlZiBQQ0FQX0ZERElQQUQKKwlwYWQgPSBwLT5mZGRpcGFkOworI2VuZGlmCisJd2hpbGUgKGJwIDwgZXApIHsKKwkJcmVnaXN0ZXIgaW50IGNhcGxlbiwgaGRybGVuOworCisJCS8qCisJCSAqIEhhcyAicGNhcF9icmVha2xvb3AoKSIgYmVlbiBjYWxsZWQ/CisJCSAqIElmIHNvLCByZXR1cm4gaW1tZWRpYXRlbHkgLSBpZiB3ZSBoYXZlbid0IHJlYWQgYW55CisJCSAqIHBhY2tldHMsIGNsZWFyIHRoZSBmbGFnIGFuZCByZXR1cm4gUENBUF9FUlJPUl9CUkVBSworCQkgKiB0byBpbmRpY2F0ZSB0aGF0IHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsCisJCSAqIG90aGVyd2lzZSBsZWF2ZSB0aGUgZmxhZyBzZXQsIHNvIHRoYXQgdGhlICpuZXh0KiBjYWxsCisJCSAqIHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wIHdpdGhvdXQgaGF2aW5nIHJlYWQgYW55CisJCSAqIHBhY2tldHMsIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBwYWNrZXRzIHdlJ3ZlCisJCSAqIHByb2Nlc3NlZCBzbyBmYXIuCisJCSAqLworCQlpZiAocC0+YnJlYWtfbG9vcCkgeworCQkJcC0+YnAgPSBicDsKKwkJCXAtPmNjID0gZXAgLSBicDsKKwkJCS8qCisJCQkgKiBlcCBpcyBzZXQgYmFzZWQgb24gdGhlIHJldHVybiB2YWx1ZSBvZiByZWFkKCksCisJCQkgKiBidXQgcmVhZCgpIGZyb20gYSBCUEYgZGV2aWNlIGRvZXNuJ3QgbmVjZXNzYXJpbHkKKwkJCSAqIHJldHVybiBhIHZhbHVlIHRoYXQncyBhIG11bHRpcGxlIG9mIHRoZSBhbGlnbm1lbnQKKwkJCSAqIHZhbHVlIGZvciBCUEZfV09SREFMSUdOKCkuICBIb3dldmVyLCB3aGVuZXZlciB3ZQorCQkJICogaW5jcmVtZW50IGJwLCB3ZSByb3VuZCB1cCB0aGUgaW5jcmVtZW50IHZhbHVlIGJ5CisJCQkgKiBhIHZhbHVlIHJvdW5kZWQgdXAgYnkgQlBGX1dPUkRBTElHTigpLCBzbyB3ZQorCQkJICogY291bGQgaW5jcmVtZW50IGJwIHBhc3QgZXAgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUKKwkJCSAqIGxhc3QgcGFja2V0IGluIHRoZSBidWZmZXIuCisJCQkgKgorCQkJICogV2UgdHJlYXQgZXAgPCBicCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhpcworCQkJICogaGFwcGVuZWQsIGFuZCBqdXN0IHNldCBwLT5jYyB0byAwLgorCQkJICovCisJCQlpZiAocC0+Y2MgPCAwKQorCQkJCXAtPmNjID0gMDsKKwkJCWlmIChuID09IDApIHsKKwkJCQlwLT5icmVha19sb29wID0gMDsKKwkJCQlyZXR1cm4gKFBDQVBfRVJST1JfQlJFQUspOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIChuKTsKKwkJfQorCisJCWNhcGxlbiA9IGJocC0+YmhfY2FwbGVuOworCQloZHJsZW4gPSBiaHAtPmJoX2hkcmxlbjsKKwkJZGF0YXAgPSBicCArIGhkcmxlbjsKKwkJLyoKKwkJICogU2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uOiBpZiB1c2luZyBCUEYgZmlsdGVyCisJCSAqIGluIGtlcm5lbCwgbm8gbmVlZCB0byBkbyBpdCBub3cgLSB3ZSBhbHJlYWR5IGtub3cKKwkJICogdGhlIHBhY2tldCBwYXNzZWQgdGhlIGZpbHRlci4KKwkJICoKKyNpZmRlZiBQQ0FQX0ZERElQQUQKKwkJICogTm90ZTogdGhlIGZpbHRlciBjb2RlIHdhcyBnZW5lcmF0ZWQgYXNzdW1pbmcKKwkJICogdGhhdCBwLT5mZGRpcGFkIHdhcyB0aGUgYW1vdW50IG9mIHBhZGRpbmcKKwkJICogYmVmb3JlIHRoZSBoZWFkZXIsIGFzIHRoYXQncyB3aGF0J3MgcmVxdWlyZWQKKwkJICogaW4gdGhlIGtlcm5lbCwgc28gd2UgcnVuIHRoZSBmaWx0ZXIgYmVmb3JlCisJCSAqIHNraXBwaW5nIHRoYXQgcGFkZGluZy4KKyNlbmRpZgorCQkgKi8KKwkJaWYgKHAtPm1kLnVzZV9icGYgfHwKKwkJICAgIGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIGRhdGFwLCBiaHAtPmJoX2RhdGFsZW4sIGNhcGxlbikpIHsKKwkJCXN0cnVjdCBwY2FwX3BrdGhkciBwa3RoZHI7CisKKwkJCXBrdGhkci50cy50dl9zZWMgPSBiaHAtPmJoX3RzdGFtcC50dl9zZWM7CisjaWZkZWYgX0FJWAorCQkJLyoKKwkJCSAqIEFJWCdzIEJQRiByZXR1cm5zIHNlY29uZHMvbmFub3NlY29uZHMgdGltZQorCQkJICogc3RhbXBzLCBub3Qgc2Vjb25kcy9taWNyb3NlY29uZHMgdGltZSBzdGFtcHMuCisJCQkgKi8KKwkJCXBrdGhkci50cy50dl91c2VjID0gYmhwLT5iaF90c3RhbXAudHZfdXNlYy8xMDAwOworI2Vsc2UKKwkJCXBrdGhkci50cy50dl91c2VjID0gYmhwLT5iaF90c3RhbXAudHZfdXNlYzsKKyNlbmRpZgorI2lmZGVmIFBDQVBfRkRESVBBRAorCQkJaWYgKGNhcGxlbiA+IHBhZCkKKwkJCQlwa3RoZHIuY2FwbGVuID0gY2FwbGVuIC0gcGFkOworCQkJZWxzZQorCQkJCXBrdGhkci5jYXBsZW4gPSAwOworCQkJaWYgKGJocC0+YmhfZGF0YWxlbiA+IHBhZCkKKwkJCQlwa3RoZHIubGVuID0gYmhwLT5iaF9kYXRhbGVuIC0gcGFkOworCQkJZWxzZQorCQkJCXBrdGhkci5sZW4gPSAwOworCQkJZGF0YXAgKz0gcGFkOworI2Vsc2UKKwkJCXBrdGhkci5jYXBsZW4gPSBjYXBsZW47CisJCQlwa3RoZHIubGVuID0gYmhwLT5iaF9kYXRhbGVuOworI2VuZGlmCisJCQkoKmNhbGxiYWNrKSh1c2VyLCAmcGt0aGRyLCBkYXRhcCk7CisJCQlicCArPSBCUEZfV09SREFMSUdOKGNhcGxlbiArIGhkcmxlbik7CisJCQlpZiAoKytuID49IGNudCAmJiBjbnQgPiAwKSB7CisJCQkJcC0+YnAgPSBicDsKKwkJCQlwLT5jYyA9IGVwIC0gYnA7CisJCQkJLyoKKwkJCQkgKiBTZWUgY29tbWVudCBhYm92ZSBhYm91dCBwLT5jYyA8IDAuCisJCQkJICovCisJCQkJaWYgKHAtPmNjIDwgMCkKKwkJCQkJcC0+Y2MgPSAwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogU2tpcCB0aGlzIHBhY2tldC4KKwkJCSAqLworCQkJYnAgKz0gQlBGX1dPUkRBTElHTihjYXBsZW4gKyBoZHJsZW4pOworCQl9CisJfQorI3VuZGVmIGJocAorCXAtPmNjID0gMDsKKwlyZXR1cm4gKG4pOworfQorCitzdGF0aWMgaW50CitwY2FwX2luamVjdF9icGYocGNhcF90ICpwLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworCWludCByZXQ7CisKKwlyZXQgPSB3cml0ZShwLT5mZCwgYnVmLCBzaXplKTsKKyNpZmRlZiBfX0FQUExFX18KKwlpZiAocmV0ID09IC0xICYmIGVycm5vID09IEVBRk5PU1VQUE9SVCkgeworCQkvKgorCQkgKiBJbiBNYWMgT1MgWCwgdGhlcmUncyBhIGJ1ZyB3aGVyZWluIHNldHRpbmcgdGhlCisJCSAqIEJJT0NTSERSQ01QTFQgZmxhZyBjYXVzZXMgd3JpdGVzIHRvIGZhaWw7IHNlZSwKKwkJICogZm9yIGV4YW1wbGU6CisJCSAqCisJCSAqCWh0dHA6Ly9jZXJiZXJ1cy5zb3VyY2VmaXJlLmNvbS9+amVmZi9hcmNoaXZlcy9wYXRjaGVzL21hY29zeC9CSU9DU0hEUkNNUExULTEwLjMuMy5wYXRjaAorCQkgKgorCQkgKiBTbywgaWYsIG9uIE9TIFgsIHdlIGdldCBFQUZOT1NVUFBPUlQgZnJvbSB0aGUgd3JpdGUsIHdlCisJCSAqIGFzc3VtZSBpdCdzIGR1ZSB0byB0aGF0IGJ1ZywgYW5kIHR1cm4gb2ZmIHRoYXQgZmxhZworCQkgKiBhbmQgdHJ5IGFnYWluLiAgSWYgd2Ugc3VjY2VlZCwgaXQgZWl0aGVyIG1lYW5zIHRoYXQKKwkJICogc29tZWJvZHkgYXBwbGllZCB0aGUgZml4IGZyb20gdGhhdCBVUkwsIG9yIG90aGVyIHBhdGNoZXMKKwkJICogZm9yIHRoYXQgYnVnIGZyb20KKwkJICoKKwkJICoJaHR0cDovL2NlcmJlcnVzLnNvdXJjZWZpcmUuY29tL35qZWZmL2FyY2hpdmVzL3BhdGNoZXMvbWFjb3N4LworCQkgKgorCQkgKiBhbmQgYXJlIHJ1bm5pbmcgYSBEYXJ3aW4ga2VybmVsIHdpdGggdGhvc2UgZml4ZXMsIG9yCisJCSAqIHRoYXQgQXBwbGUgZml4ZWQgdGhlIHByb2JsZW0gaW4gc29tZSBPUyBYIHJlbGVhc2UuCisJCSAqLworCQl1X2ludCBzcG9vZl9ldGhfc3JjID0gMDsKKworCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTSERSQ01QTFQsICZzcG9vZl9ldGhfc3JjKSA9PSAtMSkgeworCQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJzZW5kOiBjYW4ndCB0dXJuIG9mZiBCSU9DU0hEUkNNUExUOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCisJCS8qCisJCSAqIE5vdyB0cnkgdGhlIHdyaXRlIGFnYWluLgorCQkgKi8KKwkJcmV0ID0gd3JpdGUocC0+ZmQsIGJ1Ziwgc2l6ZSk7CisJfQorI2VuZGlmIC8qIF9fQVBQTEVfXyAqLworCWlmIChyZXQgPT0gLTEpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKwlyZXR1cm4gKHJldCk7Cit9CisKKyNpZmRlZiBfQUlYCitzdGF0aWMgaW50CiticGZfb2RtaW5pdChjaGFyICplcnJidWYpCit7CisJY2hhciAqZXJyc3RyOworCisJaWYgKG9kbV9pbml0aWFsaXplKCkgPT0gLTEpIHsKKwkJaWYgKG9kbV9lcnJfbXNnKG9kbWVycm5vLCAmZXJyc3RyKSA9PSAtMSkKKwkJCWVycnN0ciA9ICJVbmtub3duIGVycm9yIjsKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImJwZl9sb2FkOiBvZG1faW5pdGlhbGl6ZSBmYWlsZWQ6ICVzIiwKKwkJICAgIGVycnN0cik7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCisJaWYgKChvZG1sb2NraWQgPSBvZG1fbG9jaygiL2V0Yy9vYmpyZXBvcy9jb25maWdfbG9jayIsIE9ETV9XQUlUKSkgPT0gLTEpIHsKKwkJaWYgKG9kbV9lcnJfbXNnKG9kbWVycm5vLCAmZXJyc3RyKSA9PSAtMSkKKwkJCWVycnN0ciA9ICJVbmtub3duIGVycm9yIjsKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImJwZl9sb2FkOiBvZG1fbG9jayBvZiAvZXRjL29ianJlcG9zL2NvbmZpZ19sb2NrIGZhaWxlZDogJXMiLAorCQkgICAgZXJyc3RyKTsKKwkJKHZvaWQpb2RtX3Rlcm1pbmF0ZSgpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2JwZl9vZG1jbGVhbnVwKGNoYXIgKmVycmJ1ZikKK3sKKwljaGFyICplcnJzdHI7CisKKwlpZiAob2RtX3VubG9jayhvZG1sb2NraWQpID09IC0xKSB7CisJCWlmIChlcnJidWYgIT0gTlVMTCkgeworCQkJaWYgKG9kbV9lcnJfbXNnKG9kbWVycm5vLCAmZXJyc3RyKSA9PSAtMSkKKwkJCQllcnJzdHIgPSAiVW5rbm93biBlcnJvciI7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImJwZl9sb2FkOiBvZG1fdW5sb2NrIGZhaWxlZDogJXMiLAorCQkJICAgIGVycnN0cik7CisJCX0KKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisKKwlpZiAob2RtX3Rlcm1pbmF0ZSgpID09IC0xKSB7CisJCWlmIChlcnJidWYgIT0gTlVMTCkgeworCQkJaWYgKG9kbV9lcnJfbXNnKG9kbWVycm5vLCAmZXJyc3RyKSA9PSAtMSkKKwkJCQllcnJzdHIgPSAiVW5rbm93biBlcnJvciI7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImJwZl9sb2FkOiBvZG1fdGVybWluYXRlIGZhaWxlZDogJXMiLAorCQkJICAgIGVycnN0cik7CisJCX0KKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CiticGZfbG9hZChjaGFyICplcnJidWYpCit7CisJbG9uZyBtYWpvcjsKKwlpbnQgKm1pbm9yczsKKwlpbnQgbnVtbWlub3JzLCBpLCByYzsKKwljaGFyIGJ1ZlsxMDI0XTsKKwlzdHJ1Y3Qgc3RhdCBzYnVmOworCXN0cnVjdCBicGZfY29uZmlnIGNmZ19icGY7CisJc3RydWN0IGNmZ19sb2FkIGNmZ19sZDsKKwlzdHJ1Y3QgY2ZnX2ttb2QgY2ZnX2ttOworCisJLyoKKwkgKiBUaGlzIGlzIHZlcnkgdmVyeSBjbG9zZSB0byB3aGF0IGhhcHBlbnMgaW4gdGhlIHJlYWwgaW1wbGVtZW50YXRpb24KKwkgKiBidXQgSSd2ZSBmaXhlZCBzb21lICh1bmxpa2VseSkgYnVnIHNpdHVhdGlvbnMuCisJICovCisJaWYgKGJwZmxvYWRlZGZsYWcpCisJCXJldHVybiAoMCk7CisKKwlpZiAoYnBmX29kbWluaXQoZXJyYnVmKSA9PSBQQ0FQX0VSUk9SKQorCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCisJbWFqb3IgPSBnZW5tYWpvcihCUEZfTkFNRSk7CisJaWYgKG1ham9yID09IC0xKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJicGZfbG9hZDogZ2VubWFqb3IgZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpYnBmX29kbWNsZWFudXAoTlVMTCk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCisJbWlub3JzID0gZ2V0bWlub3IobWFqb3IsICZudW1taW5vcnMsIEJQRl9OQU1FKTsKKwlpZiAoIW1pbm9ycykgeworCQltaW5vcnMgPSBnZW5taW5vcigiYnBmIiwgbWFqb3IsIDAsIEJQRl9NSU5PUlMsIDEsIDEpOworCQlpZiAoIW1pbm9ycykgeworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJicGZfbG9hZDogZ2VubWlub3IgZmFpbGVkOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJKHZvaWQpYnBmX29kbWNsZWFudXAoTlVMTCk7CisJCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCQl9CisJfQorCisJaWYgKGJwZl9vZG1jbGVhbnVwKGVycmJ1ZikgPT0gUENBUF9FUlJPUikKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKworCXJjID0gc3RhdChCUEZfTk9ERSAiMCIsICZzYnVmKTsKKwlpZiAocmMgPT0gLTEgJiYgZXJybm8gIT0gRU5PRU5UKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJicGZfbG9hZDogY2FuJ3Qgc3RhdCAlczogJXMiLAorCQkgICAgQlBGX05PREUgIjAiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCisJaWYgKHJjID09IC0xIHx8IGdldG1ham9yKHNidWYuc3RfcmRldikgIT0gbWFqb3IpIHsKKwkJZm9yIChpID0gMDsgaSA8IEJQRl9NSU5PUlM7IGkrKykgeworCQkJc3ByaW50ZihidWYsICIlcyVkIiwgQlBGX05PREUsIGkpOworCQkJdW5saW5rKGJ1Zik7CisJCQlpZiAobWtub2QoYnVmLCBTX0lSVVNSIHwgU19JRkNIUiwgZG9tYWtlZGV2KG1ham9yLCBpKSkgPT0gLTEpIHsKKwkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJicGZfbG9hZDogY2FuJ3QgbWtub2QgJXM6ICVzIiwKKwkJCQkgICAgYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENoZWNrIGlmIHRoZSBkcml2ZXIgaXMgbG9hZGVkICovCisJbWVtc2V0KCZjZmdfbGQsIDB4MCwgc2l6ZW9mKGNmZ19sZCkpOworCWNmZ19sZC5wYXRoID0gYnVmOworCXNwcmludGYoY2ZnX2xkLnBhdGgsICIlcy8lcyIsIERSSVZFUl9QQVRILCBCUEZfTkFNRSk7CisJaWYgKChzeXNjb25maWcoU1lTX1FVRVJZTE9BRCwgKHZvaWQgKikmY2ZnX2xkLCBzaXplb2YoY2ZnX2xkKSkgPT0gLTEpIHx8CisJICAgIChjZmdfbGQua21pZCA9PSAwKSkgeworCQkvKiBEcml2ZXIgaXNuJ3QgbG9hZGVkLCBsb2FkIGl0IG5vdyAqLworCQlpZiAoc3lzY29uZmlnKFNZU19TSU5HTEVMT0FELCAodm9pZCAqKSZjZmdfbGQsIHNpemVvZihjZmdfbGQpKSA9PSAtMSkgeworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJicGZfbG9hZDogY291bGQgbm90IGxvYWQgZHJpdmVyOiAlcyIsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwl9CisKKwkvKiBDb25maWd1cmUgdGhlIGRyaXZlciAqLworCWNmZ19rbS5jbWQgPSBDRkdfSU5JVDsKKwljZmdfa20ua21pZCA9IGNmZ19sZC5rbWlkOworCWNmZ19rbS5tZGlsZW4gPSBzaXplb2YoY2ZnX2JwZik7CisJY2ZnX2ttLm1kaXB0ciA9ICh2b2lkICopJmNmZ19icGY7CisJZm9yIChpID0gMDsgaSA8IEJQRl9NSU5PUlM7IGkrKykgeworCQljZmdfYnBmLmRldm5vID0gZG9tYWtlZGV2KG1ham9yLCBpKTsKKwkJaWYgKHN5c2NvbmZpZyhTWVNfQ0ZHS01PRCwgKHZvaWQgKikmY2ZnX2ttLCBzaXplb2YoY2ZnX2ttKSkgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiYnBmX2xvYWQ6IGNvdWxkIG5vdCBjb25maWd1cmUgZHJpdmVyOiAlcyIsCisJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwl9CisKKwlicGZsb2FkZWRmbGFnID0gMTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworLyoKKyAqIFR1cm4gb2ZmIHJmbW9uIG1vZGUgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgdm9pZAorcGNhcF9jbGVhbnVwX2JwZihwY2FwX3QgKnApCit7CisjaWZkZWYgSEFWRV9CU0RfSUVFRTgwMjExCisJaW50IHNvY2s7CisJc3RydWN0IGlmbWVkaWFyZXEgcmVxOworCXN0cnVjdCBpZnJlcSBpZnI7CisjZW5kaWYKKworCWlmIChwLT5tZC5tdXN0X2RvX29uX2Nsb3NlICE9IDApIHsKKwkJLyoKKwkJICogVGhlcmUncyBzb21ldGhpbmcgd2UgaGF2ZSB0byBkbyB3aGVuIGNsb3NpbmcgdGhpcworCQkgKiBwY2FwX3QuCisJCSAqLworI2lmZGVmIEhBVkVfQlNEX0lFRUU4MDIxMQorCQlpZiAocC0+bWQubXVzdF9kb19vbl9jbG9zZSAmIE1VU1RfQ0xFQVJfUkZNT04pIHsKKwkJCS8qCisJCQkgKiBXZSBwdXQgdGhlIGludGVyZmFjZSBpbnRvIHJmbW9uIG1vZGU7CisJCQkgKiB0YWtlIGl0IG91dCBvZiByZm1vbiBtb2RlLgorCQkJICoKKwkJCSAqIFhYWCAtIGlmIHNvbWVib2R5IGVsc2Ugd2FudHMgaXQgaW4gcmZtb24KKwkJCSAqIG1vZGUsIHRoaXMgY29kZSBjYW5ub3Qga25vdyB0aGF0LCBzbyBpdCdsbCB0YWtlCisJCQkgKiBpdCBvdXQgb2YgcmZtb24gbW9kZS4KKwkJCSAqLworCQkJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwkJCWlmIChzb2NrID09IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJICAgICJDYW4ndCByZXN0b3JlIGludGVyZmFjZSBmbGFncyAoc29ja2V0KCkgZmFpbGVkOiAlcykuXG4iCisJCQkJICAgICJQbGVhc2UgYWRqdXN0IG1hbnVhbGx5LlxuIiwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKwkJCQlzdHJuY3B5KHJlcS5pZm1fbmFtZSwgcC0+bWQuZGV2aWNlLAorCQkJCSAgICBzaXplb2YocmVxLmlmbV9uYW1lKSk7CisJCQkJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZNRURJQSwgJnJlcSkgPCAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkgICAgIkNhbid0IHJlc3RvcmUgaW50ZXJmYWNlIGZsYWdzIChTSU9DR0lGTUVESUEgZmFpbGVkOiAlcykuXG4iCisJCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIsCisJCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChyZXEuaWZtX2N1cnJlbnQgJiBJRk1fSUVFRTgwMjExX01PTklUT1IpIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBSZm1vbiBtb2RlIGlzIGN1cnJlbnRseSBvbjsKKwkJCQkJCSAqIHR1cm4gaXQgb2ZmLgorCQkJCQkJICovCisJCQkJCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCQkJCQkJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsCisJCQkJCQkgICAgcC0+bWQuZGV2aWNlLAorCQkJCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJCQkJCWlmci5pZnJfbWVkaWEgPQorCQkJCQkJICAgIHJlcS5pZm1fY3VycmVudCAmIH5JRk1fSUVFRTgwMjExX01PTklUT1I7CisJCQkJCQlpZiAoaW9jdGwoc29jaywgU0lPQ1NJRk1FRElBLAorCQkJCQkJICAgICZpZnIpID09IC0xKSB7CisJCQkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCQkJICAgICJDYW4ndCByZXN0b3JlIGludGVyZmFjZSBmbGFncyAoU0lPQ1NJRk1FRElBIGZhaWxlZDogJXMpLlxuIgorCQkJCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIsCisJCQkJCQkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJY2xvc2Uoc29jayk7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBIQVZFX0JTRF9JRUVFODAyMTEgKi8KKworCQkvKgorCQkgKiBUYWtlIHRoaXMgcGNhcCBvdXQgb2YgdGhlIGxpc3Qgb2YgcGNhcHMgZm9yIHdoaWNoIHdlCisJCSAqIGhhdmUgdG8gdGFrZSB0aGUgaW50ZXJmYWNlIG91dCBvZiBzb21lIG1vZGUuCisJCSAqLworCQlwY2FwX3JlbW92ZV9mcm9tX3BjYXBzX3RvX2Nsb3NlKHApOworCQlwLT5tZC5tdXN0X2RvX29uX2Nsb3NlID0gMDsKKwl9CisKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCWlmIChwLT5tZC56ZXJvY29weSkgeworCQkvKgorCQkgKiBEZWxldGUgdGhlIG1hcHBpbmdzLiAgTm90ZSB0aGF0IHAtPmJ1ZmZlciBnZXRzCisJCSAqIGluaXRpYWxpemVkIHRvIG9uZSBvZiB0aGUgbW1hcHBlZCByZWdpb25zIGluCisJCSAqIHRoaXMgY2FzZSwgc28gZG8gbm90IHRyeSBhbmQgZnJlZSBpdCBkaXJlY3RseTsKKwkJICogbnVsbCBpdCBvdXQgc28gdGhhdCBwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oKQorCQkgKiBkb2Vzbid0IHRyeSB0byBmcmVlIGl0LgorCQkgKi8KKwkJaWYgKHAtPm1kLnpidWYxICE9IE1BUF9GQUlMRUQgJiYgcC0+bWQuemJ1ZjEgIT0gTlVMTCkKKwkJCSh2b2lkKSBtdW5tYXAocC0+bWQuemJ1ZjEsIHAtPm1kLnpidWZzaXplKTsKKwkJaWYgKHAtPm1kLnpidWYyICE9IE1BUF9GQUlMRUQgJiYgcC0+bWQuemJ1ZjIgIT0gTlVMTCkKKwkJCSh2b2lkKSBtdW5tYXAocC0+bWQuemJ1ZjIsIHAtPm1kLnpidWZzaXplKTsKKwkJcC0+YnVmZmVyID0gTlVMTDsKKwl9CisjZW5kaWYKKwlpZiAocC0+bWQuZGV2aWNlICE9IE5VTEwpIHsKKwkJZnJlZShwLT5tZC5kZXZpY2UpOworCQlwLT5tZC5kZXZpY2UgPSBOVUxMOworCX0KKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocCk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrX3NldGlmX2ZhaWx1cmUocGNhcF90ICpwLCBpbnQgZXJyb3IpCit7CisjaWZkZWYgX19BUFBMRV9fCisJaW50IGZkOworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGVycjsKKyNlbmRpZgorCisJaWYgKGVycm9yID09IEVOWElPKSB7CisJCS8qCisJCSAqIE5vIHN1Y2ggZGV2aWNlIGV4aXN0cy4KKwkJICovCisjaWZkZWYgX19BUFBMRV9fCisJCWlmIChwLT5vcHQucmZtb24gJiYgc3RybmNtcChwLT5vcHQuc291cmNlLCAid2x0IiwgMykgPT0gMCkgeworCQkJLyoKKwkJCSAqIE1vbml0b3IgbW9kZSB3YXMgcmVxdWVzdGVkLCBhbmQgd2UncmUgdHJ5aW5nCisJCQkgKiB0byBvcGVuIGEgIndsdE4iIGRldmljZS4gIEFzc3VtZSB0aGF0IHRoaXMKKwkJCSAqIGlzIDEwLjQgYW5kIHRoYXQgd2Ugd2VyZSBhc2tlZCB0byBvcGVuIGFuCisJCQkgKiAiZW5OIiBkZXZpY2U7IGlmIHRoYXQgZGV2aWNlIGV4aXN0cywgcmV0dXJuCisJCQkgKiAibW9uaXRvciBtb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGRldmljZSIuCisJCQkgKi8KKwkJCWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCQkJaWYgKGZkICE9IC0xKSB7CisJCQkJc3RybGNweShpZnIuaWZyX25hbWUsICJlbiIsCisJCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJCQlzdHJsY2F0KGlmci5pZnJfbmFtZSwgcC0+b3B0LnNvdXJjZSArIDMsCisJCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJCQlpZiAoaW9jdGwoZmQsIFNJT0NHSUZGTEFHUywgKGNoYXIgKikmaWZyKSA8IDApIHsKKwkJCQkJLyoKKwkJCQkJICogV2UgYXNzdW1lIHRoaXMgZmFpbGVkIGJlY2F1c2UKKwkJCQkJICogdGhlIHVuZGVybHlpbmcgZGV2aWNlIGRvZXNuJ3QKKwkJCQkJICogZXhpc3QuCisJCQkJCSAqLworCQkJCQllcnIgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOworCQkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSAgICAiU0lPQ0dJRkZMQUdTIG9uICVzIGZhaWxlZDogJXMiLAorCQkJCQkgICAgaWZyLmlmcl9uYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogVGhlIHVuZGVybHlpbmcgImVuTiIgZGV2aWNlCisJCQkJCSAqIGV4aXN0cywgYnV0IHRoZXJlJ3Mgbm8KKwkJCQkJICogY29ycmVzcG9uZGluZyAid2x0TiIgZGV2aWNlOworCQkJCQkgKiB0aGF0IG1lYW5zIHRoYXQgdGhlICJlbk4iCisJCQkJCSAqIGRldmljZSBkb2Vzbid0IHN1cHBvcnQKKwkJCQkJICogbW9uaXRvciBtb2RlLCBwcm9iYWJseSBiZWNhdXNlCisJCQkJCSAqIGl0J3MgYW4gRXRoZXJuZXQgZGV2aWNlIHJhdGhlcgorCQkJCQkgKiB0aGFuIGEgd2lyZWxlc3MgZGV2aWNlLgorCQkJCQkgKi8KKwkJCQkJZXJyID0gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCQkJfQorCQkJCWNsb3NlKGZkKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW4ndCBmaW5kIG91dCB3aGV0aGVyIHRoZXJlJ3MKKwkJCQkgKiBhbiB1bmRlcmx5aW5nICJlbk4iIGRldmljZSwgc28KKwkJCQkgKiBqdXN0IHJlcG9ydCAibm8gc3VjaCBkZXZpY2UiLgorCQkJCSAqLworCQkJCWVyciA9IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAic29ja2V0KCkgZmFpbGVkOiAlcyIsCisJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCXJldHVybiAoZXJyKTsKKwkJfQorI2VuZGlmCisJCS8qCisJCSAqIE5vIHN1Y2ggZGV2aWNlLgorCQkgKi8KKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVElGIGZhaWxlZDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UpOworCX0gZWxzZSBpZiAoZXJybm8gPT0gRU5FVERPV04pIHsKKwkJLyoKKwkJICogUmV0dXJuIGEgIm5ldHdvcmsgZG93biIgaW5kaWNhdGlvbiwgc28gdGhhdAorCQkgKiB0aGUgYXBwbGljYXRpb24gY2FuIHJlcG9ydCB0aGF0IHJhdGhlciB0aGFuCisJCSAqIHNheWluZyB3ZSBoYWQgYSBteXN0ZXJpb3VzIGZhaWx1cmUgYW5kCisJCSAqIHN1Z2dlc3QgdGhhdCB0aGV5IHJlcG9ydCBhIHByb2JsZW0gdG8gdGhlCisJCSAqIGxpYnBjYXAgZGV2ZWxvcGVycy4KKwkJICovCisJCXJldHVybiAoUENBUF9FUlJPUl9JRkFDRV9OT1RfVVApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFNvbWUgb3RoZXIgZXJyb3I7IGZpbGwgaW4gdGhlIGVycm9yIHN0cmluZywgYW5kCisJCSAqIHJldHVybiBQQ0FQX0VSUk9SLgorCQkgKi8KKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVElGOiAlczogJXMiLAorCQkgICAgcC0+b3B0LnNvdXJjZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KK30KKworLyoKKyAqIERlZmF1bHQgY2FwdHVyZSBidWZmZXIgc2l6ZS4KKyAqIDMySyBpc24ndCB2ZXJ5IG11Y2ggZm9yIG1vZGVybiBtYWNoaW5lcyB3aXRoIGZhc3QgbmV0d29ya3M7IHdlCisgKiBwaWNrIC41TSwgYXMgdGhhdCdzIHRoZSBtYXhpbXVtIG9uIGF0IGxlYXN0IHNvbWUgc3lzdGVtcyB3aXRoIEJQRi4KKyAqCisgKiBIb3dldmVyLCBvbiBBSVggMy41LCB0aGUgbGFyZ2VyIGJ1ZmZlciBzaXplZCBjYXVzZWQgdW5yZWNvdmVyYWJsZQorICogcmVhZCBmYWlsdXJlcyB1bmRlciBzdHJlc3MsIHNvIHdlIGxlYXZlIGl0IGFzIDMySzsgeWV0IGFub3RoZXIKKyAqIHBsYWNlIHdoZXJlIEFJWCdzIEJQRiBpcyBicm9rZW4uCisgKi8KKyNpZmRlZiBfQUlYCisjZGVmaW5lIERFRkFVTFRfQlVGU0laRQkzMjc2OAorI2Vsc2UKKyNkZWZpbmUgREVGQVVMVF9CVUZTSVpFCTUyNDI4OAorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3BjYXBfYWN0aXZhdGVfYnBmKHBjYXBfdCAqcCkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlpbnQgZmQ7CisjaWZkZWYgTElGTkFNU0laCisJY2hhciAqem9uZXNlcDsKKwlzdHJ1Y3QgbGlmcmVxIGlmcjsKKwljaGFyICppZnJuYW1lID0gaWZyLmxpZnJfbmFtZTsKKwljb25zdCBzaXplX3QgaWZuYW1zaXogPSBzaXplb2YoaWZyLmxpZnJfbmFtZSk7CisjZWxzZQorCXN0cnVjdCBpZnJlcSBpZnI7CisJY2hhciAqaWZybmFtZSA9IGlmci5pZnJfbmFtZTsKKwljb25zdCBzaXplX3QgaWZuYW1zaXogPSBzaXplb2YoaWZyLmlmcl9uYW1lKTsKKyNlbmRpZgorCXN0cnVjdCBicGZfdmVyc2lvbiBidjsKKyNpZmRlZiBfX0FQUExFX18KKwlpbnQgc29ja2ZkOworCWNoYXIgKndsdGRldiA9IE5VTEw7CisjZW5kaWYKKyNpZmRlZiBCSU9DR0RMVExJU1QKKwlzdHJ1Y3QgYnBmX2RsdGxpc3QgYmRsOworI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKEhBVkVfQlNEX0lFRUU4MDIxMSkKKwlpbnQgbmV3X2RsdDsKKyNlbmRpZgorI2VuZGlmIC8qIEJJT0NHRExUTElTVCAqLworI2lmIGRlZmluZWQoQklPQ0dIRFJDTVBMVCkgJiYgZGVmaW5lZChCSU9DU0hEUkNNUExUKQorCXVfaW50IHNwb29mX2V0aF9zcmMgPSAxOworI2VuZGlmCisJdV9pbnQgdjsKKwlzdHJ1Y3QgYnBmX2luc24gdG90YWxfaW5zbjsKKwlzdHJ1Y3QgYnBmX3Byb2dyYW0gdG90YWxfcHJvZzsKKwlzdHJ1Y3QgdXRzbmFtZSBvc2luZm87CisJaW50IGhhdmVfb3NpbmZvID0gMDsKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCXN0cnVjdCBicGZfemJ1ZiBiejsKKwl1X2ludCBidWZtb2RlLCB6YnVmbWF4OworI2VuZGlmCisKKwlmZCA9IGJwZl9vcGVuKHApOworCWlmIChmZCA8IDApIHsKKwkJc3RhdHVzID0gZmQ7CisJCWdvdG8gYmFkOworCX0KKworCXAtPmZkID0gZmQ7CisKKwlpZiAoaW9jdGwoZmQsIEJJT0NWRVJTSU9OLCAoY2FkZHJfdCkmYnYpIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJCSU9DVkVSU0lPTjogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQlnb3RvIGJhZDsKKwl9CisJaWYgKGJ2LmJ2X21ham9yICE9IEJQRl9NQUpPUl9WRVJTSU9OIHx8CisJICAgIGJ2LmJ2X21pbm9yIDwgQlBGX01JTk9SX1ZFUlNJT04pIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImtlcm5lbCBicGYgZmlsdGVyIG91dCBvZiBkYXRlIik7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gYmFkOworCX0KKworI2lmIGRlZmluZWQoTElGTkFNU0laKSAmJiBkZWZpbmVkKFpPTkVOQU1FX01BWCkgJiYgZGVmaW5lZChsaWZyX3pvbmVpZCkKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBnaXZlbiBzb3VyY2UgbmV0d29yayBkZXZpY2UgaGFzIGEgJy8nIHNlcGFyYXRlZAorCSAqIHpvbmVuYW1lIHByZWZpeCBzdHJpbmcuIFRoZSB6b25lbmFtZSBwcmVmaXhlZCBzb3VyY2UgZGV2aWNlCisJICogY2FuIGJlIHVzZWQgYnkgbGlicGNhcCBjb25zdW1lcnMgdG8gY2FwdHVyZSBuZXR3b3JrIHRyYWZmaWMKKwkgKiBpbiBub24tZ2xvYmFsIHpvbmVzIGZyb20gdGhlIGdsb2JhbCB6b25lIG9uIFNvbGFyaXMgMTEgYW5kCisJICogYWJvdmUuIElmIHRoZSB6b25lbmFtZSBwcmVmaXggaXMgcHJlc2VudCB0aGVuIHdlIHN0cmlwIHRoZQorCSAqIHByZWZpeCBhbmQgcGFzcyB0aGUgem9uZSBJRCBhcyBwYXJ0IG9mIGxpZnJfem9uZWlkLgorCSAqLworCWlmICgoem9uZXNlcCA9IHN0cmNocihwLT5vcHQuc291cmNlLCAnLycpKSAhPSBOVUxMKSB7CisJCWNoYXIgem9uZW5hbWVbWk9ORU5BTUVfTUFYXTsKKwkJaW50ICB6bmFtZWxlbjsKKwkJY2hhciAqbG5hbWVwOworCisJCXpuYW1lbGVuID0gem9uZXNlcCAtIHAtPm9wdC5zb3VyY2U7CisJCSh2b2lkKSBzdHJsY3B5KHpvbmVuYW1lLCBwLT5vcHQuc291cmNlLCB6bmFtZWxlbiArIDEpOworCQlsbmFtZXAgPSBzdHJkdXAoem9uZXNlcCArIDEpOworCQlpZnIubGlmcl96b25laWQgPSBnZXR6b25laWRieW5hbWUoem9uZW5hbWUpOworCQlmcmVlKHAtPm9wdC5zb3VyY2UpOworCQlwLT5vcHQuc291cmNlID0gbG5hbWVwOworCX0KKyNlbmRpZgorCisJcC0+bWQuZGV2aWNlID0gc3RyZHVwKHAtPm9wdC5zb3VyY2UpOworCWlmIChwLT5tZC5kZXZpY2UgPT0gTlVMTCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzdHJkdXA6ICVzIiwKKwkJICAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gYmFkOworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byBmaW5kIG91dCB0aGUgdmVyc2lvbiBvZiB0aGUgT1Mgb24gd2hpY2ggd2UncmUgcnVubmluZy4KKwkgKi8KKwlpZiAodW5hbWUoJm9zaW5mbykgPT0gMCkKKwkJaGF2ZV9vc2luZm8gPSAxOworCisjaWZkZWYgX19BUFBMRV9fCisJLyoKKwkgKiBTZWUgY29tbWVudCBpbiBwY2FwX2Nhbl9zZXRfcmZtb25fYnBmKCkgZm9yIGFuIGV4cGxhbmF0aW9uCisJICogb2Ygd2h5IHdlIGNoZWNrIHRoZSB2ZXJzaW9uIG51bWJlci4KKwkgKi8KKwlpZiAocC0+b3B0LnJmbW9uKSB7CisJCWlmIChoYXZlX29zaW5mbykgeworCQkJLyoKKwkJCSAqIFdlIGFzc3VtZSBvc2luZm8uc3lzbmFtZSBpcyAiRGFyd2luIiwgYmVjYXVzZQorCQkJICogX19BUFBMRV9fIGlzIGRlZmluZWQuICBXZSBqdXN0IGNoZWNrIHRoZSB2ZXJzaW9uLgorCQkJICovCisJCQlpZiAob3NpbmZvLnJlbGVhc2VbMF0gPCAnOCcgJiYKKwkJCSAgICBvc2luZm8ucmVsZWFzZVsxXSA9PSAnLicpIHsKKwkJCQkvKgorCQkJCSAqIDEwLjMgKERhcndpbiA3LngpIG9yIGVhcmxpZXIuCisJCQkJICovCisJCQkJc3RhdHVzID0gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAob3NpbmZvLnJlbGVhc2VbMF0gPT0gJzgnICYmCisJCQkgICAgb3NpbmZvLnJlbGVhc2VbMV0gPT0gJy4nKSB7CisJCQkJLyoKKwkJCQkgKiAxMC40IChEYXJ3aW4gOC54KS4gIHMvZW4vd2x0LworCQkJCSAqLworCQkJCWlmIChzdHJuY21wKHAtPm9wdC5zb3VyY2UsICJlbiIsIDIpICE9IDApIHsKKwkJCQkJLyoKKwkJCQkJICogTm90IGFuIGVuTiBkZXZpY2U7IGNoZWNrCisJCQkJCSAqIHdoZXRoZXIgdGhlIGRldmljZSBldmVuIGV4aXN0cy4KKwkJCQkJICovCisJCQkJCXNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwkJCQkJaWYgKHNvY2tmZCAhPSAtMSkgeworCQkJCQkJc3RybGNweShpZnJuYW1lLAorCQkJCQkJICAgIHAtPm9wdC5zb3VyY2UsIGlmbmFtc2l6KTsKKwkJCQkJCWlmIChpb2N0bChzb2NrZmQsIFNJT0NHSUZGTEFHUywKKwkJCQkJCSAgICAoY2hhciAqKSZpZnIpIDwgMCkgeworCQkJCQkJCS8qCisJCQkJCQkJICogV2UgYXNzdW1lIHRoaXMKKwkJCQkJCQkgKiBmYWlsZWQgYmVjYXVzZQorCQkJCQkJCSAqIHRoZSB1bmRlcmx5aW5nCisJCQkJCQkJICogZGV2aWNlIGRvZXNuJ3QKKwkJCQkJCQkgKiBleGlzdC4KKwkJCQkJCQkgKi8KKwkJCQkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOworCQkJCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwKKwkJCQkJCQkgICAgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJCQkgICAgIlNJT0NHSUZGTEFHUyBmYWlsZWQ6ICVzIiwKKwkJCQkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQkJfSBlbHNlCisJCQkJCQkJc3RhdHVzID0gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCQkJCQljbG9zZShzb2NrZmQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJLyoKKwkJCQkJCSAqIFdlIGNhbid0IGZpbmQgb3V0IHdoZXRoZXIKKwkJCQkJCSAqIHRoZSBkZXZpY2UgZXhpc3RzLCBzbyBqdXN0CisJCQkJCQkgKiByZXBvcnQgIm5vIHN1Y2ggZGV2aWNlIi4KKwkJCQkJCSAqLworCQkJCQkJc3RhdHVzID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKwkJCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwKKwkJCQkJCSAgICBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkJICAgICJzb2NrZXQoKSBmYWlsZWQ6ICVzIiwKKwkJCQkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCX0KKwkJCQkJZ290byBiYWQ7CisJCQkJfQorCQkJCXdsdGRldiA9IG1hbGxvYyhzdHJsZW4ocC0+b3B0LnNvdXJjZSkgKyAyKTsKKwkJCQlpZiAod2x0ZGV2ID09IE5VTEwpIHsKKwkJCQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLAorCQkJCQkgICAgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAorCQkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQkJc3RyY3B5KHdsdGRldiwgIndsdCIpOworCQkJCXN0cmNhdCh3bHRkZXYsIHAtPm9wdC5zb3VyY2UgKyAyKTsKKwkJCQlmcmVlKHAtPm9wdC5zb3VyY2UpOworCQkJCXAtPm9wdC5zb3VyY2UgPSB3bHRkZXY7CisJCQl9CisJCQkvKgorCQkJICogRXZlcnl0aGluZyBlbHNlIGlzIDEwLjUgb3IgbGF0ZXI7IGZvciB0aG9zZSwKKwkJCSAqIHdlIGp1c3Qgb3BlbiB0aGUgZW5OIGRldmljZSwgYW5kIHNldCB0aGUgRExULgorCQkJICovCisJCX0KKwl9CisjZW5kaWYgLyogX19BUFBMRV9fICovCisjaWZkZWYgSEFWRV9aRVJPQ09QWV9CUEYKKwkvKgorCSAqIElmIHRoZSBCUEYgZXh0ZW5zaW9uIHRvIHNldCBidWZmZXIgbW9kZSBpcyBwcmVzZW50LCB0cnkgc2V0dGluZworCSAqIHRoZSBtb2RlIHRvIHplcm8tY29weS4gIElmIHRoYXQgZmFpbHMsIHVzZSByZWd1bGFyIGJ1ZmZlcmluZy4gIElmCisJICogaXQgc3VjY2VlZHMgYnV0IG90aGVyIHNldHVwIGZhaWxzLCByZXR1cm4gYW4gZXJyb3IgdG8gdGhlIHVzZXIuCisJICovCisJYnVmbW9kZSA9IEJQRl9CVUZNT0RFX1pCVUY7CisJaWYgKGlvY3RsKGZkLCBCSU9DU0VUQlVGTU9ERSwgKGNhZGRyX3QpJmJ1Zm1vZGUpID09IDApIHsKKwkJLyoKKwkJICogV2UgaGF2ZSB6ZXJvY29weSBCUEY7IHVzZSBpdC4KKwkJICovCisJCXAtPm1kLnplcm9jb3B5ID0gMTsKKworCQkvKgorCQkgKiBIb3cgdG8gcGljayBhIGJ1ZmZlciBzaXplOiBmaXJzdCwgcXVlcnkgdGhlIG1heGltdW0gYnVmZmVyCisJCSAqIHNpemUgc3VwcG9ydGVkIGJ5IHplcm8tY29weS4gIFRoaXMgYWxzbyBsZXRzIHVzIHF1aWNrbHkKKwkJICogZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGtlcm5lbCBnZW5lcmFsbHkgc3VwcG9ydHMgemVyby1jb3B5LgorCQkgKiBUaGVuLCBpZiBhIGJ1ZmZlciBzaXplIHdhcyBzcGVjaWZpZWQsIHVzZSB0aGF0LCBvdGhlcndpc2UKKwkJICogcXVlcnkgdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUsIHdoaWNoIHJlZmxlY3RzIGtlcm5lbAorCQkgKiBwb2xpY3kgZm9yIGEgZGVzaXJlZCBkZWZhdWx0LiAgUm91bmQgdG8gdGhlIG5lYXJlc3QgcGFnZQorCQkgKiBzaXplLgorCQkgKi8KKwkJaWYgKGlvY3RsKGZkLCBCSU9DR0VUWk1BWCwgKGNhZGRyX3QpJnpidWZtYXgpIDwgMCkgeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ0dFVFpNQVg6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCWlmIChwLT5vcHQuYnVmZmVyX3NpemUgIT0gMCkgeworCQkJLyoKKwkJCSAqIEEgYnVmZmVyIHNpemUgd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkOyB1c2UgaXQuCisJCQkgKi8KKwkJCXYgPSBwLT5vcHQuYnVmZmVyX3NpemU7CisJCX0gZWxzZSB7CisJCQlpZiAoKGlvY3RsKGZkLCBCSU9DR0JMRU4sIChjYWRkcl90KSZ2KSA8IDApIHx8CisJCQkgICAgdiA8IERFRkFVTFRfQlVGU0laRSkKKwkJCQl2ID0gREVGQVVMVF9CVUZTSVpFOworCQl9CisjaWZuZGVmIHJvdW5kdXAKKyNkZWZpbmUgcm91bmR1cCh4LCB5KSAgICgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkgIC8qIHRvIGFueSB5ICovCisjZW5kaWYKKwkJcC0+bWQuemJ1ZnNpemUgPSByb3VuZHVwKHYsIGdldHBhZ2VzaXplKCkpOworCQlpZiAocC0+bWQuemJ1ZnNpemUgPiB6YnVmbWF4KQorCQkJcC0+bWQuemJ1ZnNpemUgPSB6YnVmbWF4OworCQlwLT5tZC56YnVmMSA9IG1tYXAoTlVMTCwgcC0+bWQuemJ1ZnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgICBNQVBfQU5PTiwgLTEsIDApOworCQlwLT5tZC56YnVmMiA9IG1tYXAoTlVMTCwgcC0+bWQuemJ1ZnNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisJCSAgICBNQVBfQU5PTiwgLTEsIDApOworCQlpZiAocC0+bWQuemJ1ZjEgPT0gTUFQX0ZBSUxFRCB8fCBwLT5tZC56YnVmMiA9PSBNQVBfRkFJTEVEKSB7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtbWFwOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZ290byBiYWQ7CisJCX0KKwkJYnplcm8oJmJ6LCBzaXplb2YoYnopKTsKKwkJYnouYnpfYnVmYSA9IHAtPm1kLnpidWYxOworCQliei5iel9idWZiID0gcC0+bWQuemJ1ZjI7CisJCWJ6LmJ6X2J1ZmxlbiA9IHAtPm1kLnpidWZzaXplOworCQlpZiAoaW9jdGwoZmQsIEJJT0NTRVRaQlVGLCAoY2FkZHJfdCkmYnopIDwgMCkgeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVFpCVUY6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQkodm9pZClzdHJuY3B5KGlmcm5hbWUsIHAtPm9wdC5zb3VyY2UsIGlmbmFtc2l6KTsKKwkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUSUYsIChjYWRkcl90KSZpZnIpIDwgMCkgeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ1NFVElGOiAlczogJXMiLAorCQkJICAgIHAtPm9wdC5zb3VyY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gYmFkOworCQl9CisJCXYgPSBwLT5tZC56YnVmc2l6ZSAtIHNpemVvZihzdHJ1Y3QgYnBmX3pidWZfaGVhZGVyKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyoKKwkJICogV2UgZG9uJ3QgaGF2ZSB6ZXJvY29weSBCUEYuCisJCSAqIFNldCB0aGUgYnVmZmVyIHNpemUuCisJCSAqLworCQlpZiAocC0+b3B0LmJ1ZmZlcl9zaXplICE9IDApIHsKKwkJCS8qCisJCQkgKiBBIGJ1ZmZlciBzaXplIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZDsgdXNlIGl0LgorCQkJICovCisJCQlpZiAoaW9jdGwoZmQsIEJJT0NTQkxFTiwKKwkJCSAgICAoY2FkZHJfdCkmcC0+b3B0LmJ1ZmZlcl9zaXplKSA8IDApIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJCSU9DU0JMRU46ICVzOiAlcyIsIHAtPm9wdC5zb3VyY2UsCisJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCWdvdG8gYmFkOworCQkJfQorCisJCQkvKgorCQkJICogTm93IGJpbmQgdG8gdGhlIGRldmljZS4KKwkJCSAqLworCQkJKHZvaWQpc3RybmNweShpZnJuYW1lLCBwLT5vcHQuc291cmNlLCBpZm5hbXNpeik7CisjaWZkZWYgQklPQ1NFVExJRgorCQkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUTElGLCAoY2FkZHJfdCkmaWZyKSA8IDApCisjZWxzZQorCQkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUSUYsIChjYWRkcl90KSZpZnIpIDwgMCkKKyNlbmRpZgorCQkJeworCQkJCXN0YXR1cyA9IGNoZWNrX3NldGlmX2ZhaWx1cmUocCwgZXJybm8pOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE5vIGJ1ZmZlciBzaXplIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZC4KKwkJCSAqCisJCQkgKiBUcnkgZmluZGluZyBhIGdvb2Qgc2l6ZSBmb3IgdGhlIGJ1ZmZlcjsKKwkJCSAqIERFRkFVTFRfQlVGU0laRSBtYXkgYmUgdG9vIGJpZywgc28ga2VlcAorCQkJICogY3V0dGluZyBpdCBpbiBoYWxmIHVudGlsIHdlIGZpbmQgYSBzaXplCisJCQkgKiB0aGF0IHdvcmtzLCBvciBydW4gb3V0IG9mIHNpemVzIHRvIHRyeS4KKwkJCSAqIElmIHRoZSBkZWZhdWx0IGlzIGxhcmdlciwgZG9uJ3QgbWFrZSBpdCBzbWFsbGVyLgorCQkJICovCisJCQlpZiAoKGlvY3RsKGZkLCBCSU9DR0JMRU4sIChjYWRkcl90KSZ2KSA8IDApIHx8CisJCQkgICAgdiA8IERFRkFVTFRfQlVGU0laRSkKKwkJCQl2ID0gREVGQVVMVF9CVUZTSVpFOworCQkJZm9yICggOyB2ICE9IDA7IHYgPj49IDEpIHsKKwkJCQkvKgorCQkJCSAqIElnbm9yZSB0aGUgcmV0dXJuIHZhbHVlIC0gdGhpcyBpcyBiZWNhdXNlIHRoZQorCQkJCSAqIGNhbGwgZmFpbHMgb24gQlBGIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlCisJCQkJICoga2VybmVsIG1hbGxvYy4gIEFuZCBpZiB0aGUgY2FsbCBmYWlscywgaXQncworCQkJCSAqIG5vIGJpZyBkZWFsLCB3ZSBqdXN0IGNvbnRpbnVlIHRvIHVzZSB0aGUKKwkJCQkgKiBzdGFuZGFyZCBidWZmZXIgc2l6ZS4KKwkJCQkgKi8KKwkJCQkodm9pZCkgaW9jdGwoZmQsIEJJT0NTQkxFTiwgKGNhZGRyX3QpJnYpOworCisJCQkJKHZvaWQpc3RybmNweShpZnJuYW1lLCBwLT5vcHQuc291cmNlLCBpZm5hbXNpeik7CisjaWZkZWYgQklPQ1NFVExJRgorCQkJCWlmIChpb2N0bChmZCwgQklPQ1NFVExJRiwgKGNhZGRyX3QpJmlmcikgPj0gMCkKKyNlbHNlCisJCQkJaWYgKGlvY3RsKGZkLCBCSU9DU0VUSUYsIChjYWRkcl90KSZpZnIpID49IDApCisjZW5kaWYKKwkJCQkJYnJlYWs7CS8qIHRoYXQgc2l6ZSB3b3JrZWQ7IHdlJ3JlIGRvbmUgKi8KKworCQkJCWlmIChlcnJubyAhPSBFTk9CVUZTKSB7CisJCQkJCXN0YXR1cyA9IGNoZWNrX3NldGlmX2ZhaWx1cmUocCwgZXJybm8pOworCQkJCQlnb3RvIGJhZDsKKwkJCQl9CisJCQl9CisKKwkJCWlmICh2ID09IDApIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJCSU9DU0JMRU46ICVzOiBObyBidWZmZXIgc2l6ZSB3b3JrZWQiLAorCQkJCSAgICBwLT5vcHQuc291cmNlKTsKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCWdvdG8gYmFkOworCQkJfQorCQl9CisJfQorCisJLyogR2V0IHRoZSBkYXRhIGxpbmsgbGF5ZXIgdHlwZS4gKi8KKwlpZiAoaW9jdGwoZmQsIEJJT0NHRExULCAoY2FkZHJfdCkmdikgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NHRExUOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gYmFkOworCX0KKworI2lmZGVmIF9BSVgKKwkvKgorCSAqIEFJWCdzIEJQRiByZXR1cm5zIElGRl8gdHlwZXMsIG5vdCBETFRfIHR5cGVzLCBpbiBCSU9DR0RMVC4KKwkgKi8KKwlzd2l0Y2ggKHYpIHsKKworCWNhc2UgSUZUX0VUSEVSOgorCWNhc2UgSUZUX0lTTzg4MDIzOgorCQl2ID0gRExUX0VOMTBNQjsKKwkJYnJlYWs7CisKKwljYXNlIElGVF9GRERJOgorCQl2ID0gRExUX0ZEREk7CisJCWJyZWFrOworCisJY2FzZSBJRlRfSVNPODgwMjU6CisJCXYgPSBETFRfSUVFRTgwMjsKKwkJYnJlYWs7CisKKwljYXNlIElGVF9MT09QOgorCQl2ID0gRExUX05VTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyoKKwkJICogV2UgZG9uJ3Qga25vdyB3aGF0IHRvIG1hcCB0aGlzIHRvIHlldC4KKwkJICovCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInVua25vd24gaW50ZXJmYWNlIHR5cGUgJXUiLAorCQkgICAgdik7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gYmFkOworCX0KKyNlbmRpZgorI2lmIF9CU0RJX1ZFUlNJT04gLSAwID49IDE5OTUxMAorCS8qIFRoZSBTTElQIGFuZCBQUFAgbGluayBsYXllciBoZWFkZXIgY2hhbmdlZCBpbiBCU0QvT1MgMi4xICovCisJc3dpdGNoICh2KSB7CisKKwljYXNlIERMVF9TTElQOgorCQl2ID0gRExUX1NMSVBfQlNET1M7CisJCWJyZWFrOworCisJY2FzZSBETFRfUFBQOgorCQl2ID0gRExUX1BQUF9CU0RPUzsKKwkJYnJlYWs7CisKKwljYXNlIDExOgkvKkRMVF9GUiovCisJCXYgPSBETFRfRlJFTEFZOworCQlicmVhazsKKworCWNhc2UgMTI6CS8qRExUX0NfSERMQyovCisJCXYgPSBETFRfQ0hETEM7CisJCWJyZWFrOworCX0KKyNlbmRpZgorCisjaWZkZWYgQklPQ0dETFRMSVNUCisJLyoKKwkgKiBXZSBrbm93IHRoZSBkZWZhdWx0IGxpbmsgdHlwZSAtLSBub3cgZGV0ZXJtaW5lIGFsbCB0aGUgRExUcworCSAqIHRoaXMgaW50ZXJmYWNlIHN1cHBvcnRzLiAgSWYgdGhpcyBmYWlscyB3aXRoIEVJTlZBTCwgaXQncworCSAqIG5vdCBmYXRhbDsgd2UganVzdCBkb24ndCBnZXQgdG8gdXNlIHRoZSBmZWF0dXJlIGxhdGVyLgorCSAqLworCWlmIChnZXRfZGx0X2xpc3QoZmQsIHYsICZiZGwsIHAtPmVycmJ1ZikgPT0gLTEpIHsKKwkJc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJZ290byBiYWQ7CisJfQorCXAtPmRsdF9jb3VudCA9IGJkbC5iZmxfbGVuOworCXAtPmRsdF9saXN0ID0gYmRsLmJmbF9saXN0OworCisjaWZkZWYgX19BUFBMRV9fCisJLyoKKwkgKiBNb25pdG9yIG1vZGUgZnVuLCBjb250aW51ZWQuCisJICoKKwkgKiBGb3IgMTAuNSBhbmQsIHdlJ3JlIGFzc3VtaW5nLCBsYXRlciByZWxlYXNlcywgYXMgbm90ZWQgYWJvdmUsCisJICogODAyLjEgYWRhcHRlcnMgdGhhdCBzdXBwb3J0IG1vbml0b3IgbW9kZSBvZmZlciBib3RoIERMVF9FTjEwTUIsCisJICogRExUX0lFRUU4MDJfMTEsIGFuZCBwb3NzaWJseSBzb21lIDgwMi4xMS1wbHVzLXJhZGlvLWluZm9ybWF0aW9uCisJICogRExUXyB2YWx1ZS4gIENob29zaW5nIG9uZSBvZiB0aGUgODAyLjExIERMVF8gdmFsdWVzIHdpbGwgdHVybgorCSAqIG1vbml0b3IgbW9kZSBvbi4KKwkgKgorCSAqIFRoZXJlZm9yZSwgaWYgdGhlIHVzZXIgYXNrZWQgZm9yIG1vbml0b3IgbW9kZSwgd2UgZmlsdGVyIG91dAorCSAqIHRoZSBETFRfRU4xME1CIHZhbHVlLCBhcyB5b3UgY2FuJ3QgZ2V0IHRoYXQgaW4gbW9uaXRvciBtb2RlLAorCSAqIGFuZCwgaWYgdGhlIHVzZXIgZGlkbid0IGFzayBmb3IgbW9uaXRvciBtb2RlLCB3ZSBmaWx0ZXIgb3V0CisJICogdGhlIDgwMi4xMSBETFRfIHZhbHVlcywgYmVjYXVzZSBzZWxlY3RpbmcgdGhvc2Ugd2lsbCB0dXJuCisJICogbW9uaXRvciBtb2RlIG9uLiAgVGhlbiwgZm9yIG1vbml0b3IgbW9kZSwgaWYgYW4gODAyLjExLXBsdXMtCisJICogcmFkaW8gRExUXyB2YWx1ZSBpcyBvZmZlcmVkLCB3ZSB0cnkgdG8gc2VsZWN0IHRoYXQsIG90aGVyd2lzZQorCSAqIHdlIHRyeSB0byBzZWxlY3QgRExUX0lFRUU4MDJfMTEuCisJICovCisJaWYgKGhhdmVfb3NpbmZvKSB7CisJCWlmIChpc2RpZ2l0KCh1bnNpZ25lZClvc2luZm8ucmVsZWFzZVswXSkgJiYKKwkJICAgICAob3NpbmZvLnJlbGVhc2VbMF0gPT0gJzknIHx8CisJCSAgICAgaXNkaWdpdCgodW5zaWduZWQpb3NpbmZvLnJlbGVhc2VbMV0pKSkgeworCQkJLyoKKwkJCSAqIDEwLjUgKERhcndpbiA5LngpLCBvciBsYXRlci4KKwkJCSAqLworCQkJbmV3X2RsdCA9IGZpbmRfODAyXzExKCZiZGwpOworCQkJaWYgKG5ld19kbHQgIT0gLTEpIHsKKwkJCQkvKgorCQkJCSAqIFdlIGhhdmUgYXQgbGVhc3Qgb25lIDgwMi4xMSBETFRfIHZhbHVlLAorCQkJCSAqIHNvIHRoaXMgaXMgYW4gODAyLjExIGludGVyZmFjZS4KKwkJCQkgKiBuZXdfZGx0IGlzIHRoZSBiZXN0IG9mIHRoZSA4MDIuMTEKKwkJCQkgKiBETFRfIHZhbHVlcyBpbiB0aGUgbGlzdC4KKwkJCQkgKi8KKwkJCQlpZiAocC0+b3B0LnJmbW9uKSB7CisJCQkJCS8qCisJCQkJCSAqIE91ciBjYWxsZXIgd2FudHMgbW9uaXRvciBtb2RlLgorCQkJCQkgKiBQdXJnZSBETFRfRU4xME1CIGZyb20gdGhlIGxpc3QKKwkJCQkJICogb2YgbGluay1sYXllciB0eXBlcywgYXMgc2VsZWN0aW5nCisJCQkJCSAqIGl0IHdpbGwga2VlcCBtb25pdG9yIG1vZGUgb2ZmLgorCQkJCQkgKi8KKwkJCQkJcmVtb3ZlX2VuKHApOworCisJCQkJCS8qCisJCQkJCSAqIElmIHRoZSBuZXcgbW9kZSB3ZSB3YW50IGlzbid0CisJCQkJCSAqIHRoZSBkZWZhdWx0IG1vZGUsIGF0dGVtcHQgdG8KKwkJCQkJICogc2VsZWN0IHRoZSBuZXcgbW9kZS4KKwkJCQkJICovCisJCQkJCWlmIChuZXdfZGx0ICE9IHYpIHsKKwkJCQkJCWlmIChpb2N0bChwLT5mZCwgQklPQ1NETFQsCisJCQkJCQkgICAgJm5ld19kbHQpICE9IC0xKSB7CisJCQkJCQkJLyoKKwkJCQkJCQkgKiBXZSBzdWNjZWVkZWQ7CisJCQkJCQkJICogbWFrZSB0aGlzIHRoZQorCQkJCQkJCSAqIG5ldyBETFRfIHZhbHVlLgorCQkJCQkJCSAqLworCQkJCQkJCXYgPSBuZXdfZGx0OworCQkJCQkJfQorCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogT3VyIGNhbGxlciBkb2Vzbid0IHdhbnQKKwkJCQkJICogbW9uaXRvciBtb2RlLiAgVW5sZXNzIHRoaXMKKwkJCQkJICogaXMgYmVpbmcgZG9uZSBieSBwY2FwX29wZW5fbGl2ZSgpLAorCQkJCQkgKiBwdXJnZSB0aGUgODAyLjExIGxpbmstbGF5ZXIgdHlwZXMKKwkJCQkJICogZnJvbSB0aGUgbGlzdCwgYXMgc2VsZWN0aW5nCisJCQkJCSAqIG9uZSBvZiB0aGVtIHdpbGwgdHVybiBtb25pdG9yCisJCQkJCSAqIG1vZGUgb24uCisJCQkJCSAqLworCQkJCQlpZiAoIXAtPm9sZHN0eWxlKQorCQkJCQkJcmVtb3ZlXzgwMl8xMShwKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChwLT5vcHQucmZtb24pIHsKKwkJCQkJLyoKKwkJCQkJICogVGhlIGNhbGxlciByZXF1ZXN0ZWQgbW9uaXRvcgorCQkJCQkgKiBtb2RlLCBidXQgd2UgaGF2ZSBubyA4MDIuMTEKKwkJCQkJICogbGluay1sYXllciB0eXBlcywgc28gdGhleQorCQkJCQkgKiBjYW4ndCBoYXZlIGl0LgorCQkJCQkgKi8KKwkJCQkJc3RhdHVzID0gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCQkJCWdvdG8gYmFkOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbGlmIGRlZmluZWQoSEFWRV9CU0RfSUVFRTgwMjExKQorCS8qCisJICogKkJTRCB3aXRoIHRoZSBuZXcgODAyLjExIGlvY3Rscy4KKwkgKiBEbyB3ZSB3YW50IG1vbml0b3IgbW9kZT8KKwkgKi8KKwlpZiAocC0+b3B0LnJmbW9uKSB7CisJCS8qCisJCSAqIFRyeSB0byBwdXQgdGhlIGludGVyZmFjZSBpbnRvIG1vbml0b3IgbW9kZS4KKwkJICovCisJCXN0YXR1cyA9IG1vbml0b3JfbW9kZShwLCAxKTsKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQkvKgorCQkJICogV2UgZmFpbGVkLgorCQkJICovCisJCQlnb3RvIGJhZDsKKwkJfQorCisJCS8qCisJCSAqIFdlJ3JlIGluIG1vbml0b3IgbW9kZS4KKwkJICogVHJ5IHRvIGZpbmQgdGhlIGJlc3QgODAyLjExIERMVF8gdmFsdWUgYW5kLCBpZiB3ZQorCQkgKiBzdWNjZWVkLCB0cnkgdG8gc3dpdGNoIHRvIHRoYXQgbW9kZSBpZiB3ZSdyZSBub3QKKwkJICogYWxyZWFkeSBpbiB0aGF0IG1vZGUuCisJCSAqLworCQluZXdfZGx0ID0gZmluZF84MDJfMTEoJmJkbCk7CisJCWlmIChuZXdfZGx0ICE9IC0xKSB7CisJCQkvKgorCQkJICogV2UgaGF2ZSBhdCBsZWFzdCBvbmUgODAyLjExIERMVF8gdmFsdWUuCisJCQkgKiBuZXdfZGx0IGlzIHRoZSBiZXN0IG9mIHRoZSA4MDIuMTEKKwkJCSAqIERMVF8gdmFsdWVzIGluIHRoZSBsaXN0LgorCQkJICoKKwkJCSAqIElmIHRoZSBuZXcgbW9kZSB3ZSB3YW50IGlzbid0IHRoZSBkZWZhdWx0IG1vZGUsCisJCQkgKiBhdHRlbXB0IHRvIHNlbGVjdCB0aGUgbmV3IG1vZGUuCisJCQkgKi8KKwkJCWlmIChuZXdfZGx0ICE9IHYpIHsKKwkJCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTRExULCAmbmV3X2RsdCkgIT0gLTEpIHsKKwkJCQkJLyoKKwkJCQkJICogV2Ugc3VjY2VlZGVkOyBtYWtlIHRoaXMgdGhlCisJCQkJCSAqIG5ldyBETFRfIHZhbHVlLgorCQkJCQkgKi8KKwkJCQkJdiA9IG5ld19kbHQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIHZhcmlvdXMgcGxhdGZvcm1zICovCisjZW5kaWYgLyogQklPQ0dETFRMSVNUICovCisKKwkvKgorCSAqIElmIHRoaXMgaXMgYW4gRXRoZXJuZXQgZGV2aWNlLCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIERMVF8gbGlzdCwKKwkgKiBnaXZlIGl0IGEgbGlzdCB3aXRoIERMVF9FTjEwTUIgYW5kIERMVF9ET0NTSVMuICAoVGhhdCdkIGdpdmUKKwkgKiA4MDIuMTEgaW50ZXJmYWNlcyBETFRfRE9DU0lTLCB3aGljaCBpc24ndCB0aGUgcmlnaHQgdGhpbmcgdG8KKwkgKiBkbywgYnV0IHRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvIGFib3V0IHRoYXQgd2l0aG91dCBmaW5kaW5nCisJICogc29tZSBvdGhlciB3YXkgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciBpdCdzIGFuIEV0aGVybmV0IG9yIDgwMi4xMQorCSAqIGRldmljZS4pCisJICovCisJaWYgKHYgPT0gRExUX0VOMTBNQiAmJiBwLT5kbHRfY291bnQgPT0gMCkgeworCQlwLT5kbHRfbGlzdCA9ICh1X2ludCAqKSBtYWxsb2Moc2l6ZW9mKHVfaW50KSAqIDIpOworCQkvKgorCQkgKiBJZiB0aGF0IGZhaWxzLCBqdXN0IGxlYXZlIHRoZSBsaXN0IGVtcHR5LgorCQkgKi8KKwkJaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJCXAtPmRsdF9saXN0WzBdID0gRExUX0VOMTBNQjsKKwkJCXAtPmRsdF9saXN0WzFdID0gRExUX0RPQ1NJUzsKKwkJCXAtPmRsdF9jb3VudCA9IDI7CisJCX0KKwl9CisjaWZkZWYgUENBUF9GRERJUEFECisJaWYgKHYgPT0gRExUX0ZEREkpCisJCXAtPmZkZGlwYWQgPSBQQ0FQX0ZERElQQUQ7CisJZWxzZQorCQlwLT5mZGRpcGFkID0gMDsKKyNlbmRpZgorCXAtPmxpbmt0eXBlID0gdjsKKworI2lmIGRlZmluZWQoQklPQ0dIRFJDTVBMVCkgJiYgZGVmaW5lZChCSU9DU0hEUkNNUExUKQorCS8qCisJICogRG8gYSBCSU9DU0hEUkNNUExULCBpZiBkZWZpbmVkLCB0byB0dXJuIHRoYXQgZmxhZyBvbiwgc28KKwkgKiB0aGUgbGluay1sYXllciBzb3VyY2UgYWRkcmVzcyBpc24ndCBmb3JjaWJseSBvdmVyd3JpdHRlbi4KKwkgKiAoU2hvdWxkIHdlIGlnbm9yZSBlcnJvcnM/ICBTaG91bGQgd2UgZG8gdGhpcyBvbmx5IGlmCisJICogd2UncmUgb3BlbiBmb3Igd3JpdGluZz8pCisJICoKKwkgKiBYWFggLSBJIHNlZW0gdG8gcmVtZW1iZXIgc29tZSBwYWNrZXQtc2VuZGluZyBidWcgaW4gc29tZQorCSAqIEJTRHMgLSBjaGVjayBDVlMgbG9nIGZvciAiYnBmLmMiPworCSAqLworCWlmIChpb2N0bChmZCwgQklPQ1NIRFJDTVBMVCwgJnNwb29mX2V0aF9zcmMpID09IC0xKSB7CisJCSh2b2lkKXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJCSU9DU0hEUkNNUExUOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJZ290byBiYWQ7CisJfQorI2VuZGlmCisJLyogc2V0IHRpbWVvdXQgKi8KKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCWlmIChwLT5tZC50aW1lb3V0ICE9IDAgJiYgIXAtPm1kLnplcm9jb3B5KSB7CisjZWxzZQorCWlmIChwLT5tZC50aW1lb3V0KSB7CisjZW5kaWYKKwkJLyoKKwkJICogWFhYIC0gaXMgdGhpcyBzZWNvbmRzL25hbm9zZWNvbmRzIGluIEFJWD8KKwkJICogKFRyZWF0aW5nIGl0IGFzIHN1Y2ggZG9lc24ndCBmaXggdGhlIHRpbWVvdXQKKwkJICogcHJvYmxlbSBkZXNjcmliZWQgYmVsb3cuKQorCQkgKgorCQkgKiBYWFggLSBNYWMgT1MgWCAxMC42IG1pc2hhbmRsZXMgQklPQ1NSVElNRU9VVCBpbgorCQkgKiA2NC1iaXQgdXNlcmxhbmQgLSBpdCB0YWtlcywgYXMgYW4gYXJndW1lbnQsIGEKKwkJICogInN0cnVjdCBCUEZfVElNRVZBTCIsIHdoaWNoIGhhcyAzMi1iaXQgdHZfc2VjCisJCSAqIGFuZCB0dl91c2VjLCByYXRoZXIgdGhhbiBhICJzdHJ1Y3QgdGltZXZhbCIuCisJCSAqCisJCSAqIElmIHRoaXMgcGxhdGZvcm0gZGVmaW5lcyAic3RydWN0IEJQRl9USU1FVkFMIiwKKwkJICogd2UgY2hlY2sgd2hldGhlciB0aGUgc3RydWN0dXJlIHNpemUgaW4gQklPQ1NSVElNRU9VVAorCQkgKiBpcyB0aGF0IG9mIGEgInN0cnVjdCB0aW1ldmFsIiBhbmQsIGlmIG5vdCwgd2UgdXNlCisJCSAqIGEgInN0cnVjdCBCUEZfVElNRVZBTCIgcmF0aGVyIHRoYW4gYSAic3RydWN0IHRpbWV2YWwiLgorCQkgKiAoVGhhdCB3YXksIGlmIHRoZSBidWcgaXMgZml4ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZSwKKwkJICogd2Ugd2lsbCBzdGlsbCBkbyB0aGUgcmlnaHQgdGhpbmcuKQorCQkgKi8KKwkJc3RydWN0IHRpbWV2YWwgdG87CisjaWZkZWYgSEFWRV9TVFJVQ1RfQlBGX1RJTUVWQUwKKwkJc3RydWN0IEJQRl9USU1FVkFMIGJwZl90bzsKKworCQlpZiAoSU9DUEFSTV9MRU4oQklPQ1NSVElNRU9VVCkgIT0gc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSkgeworCQkJYnBmX3RvLnR2X3NlYyA9IHAtPm1kLnRpbWVvdXQgLyAxMDAwOworCQkJYnBmX3RvLnR2X3VzZWMgPSAocC0+bWQudGltZW91dCAqIDEwMDApICUgMTAwMDAwMDsKKwkJCWlmIChpb2N0bChwLT5mZCwgQklPQ1NSVElNRU9VVCwgKGNhZGRyX3QpJmJwZl90bykgPCAwKSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiQklPQ1NSVElNRU9VVDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJfSBlbHNlIHsKKyNlbmRpZgorCQkJdG8udHZfc2VjID0gcC0+bWQudGltZW91dCAvIDEwMDA7CisJCQl0by50dl91c2VjID0gKHAtPm1kLnRpbWVvdXQgKiAxMDAwKSAlIDEwMDAwMDA7CisJCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTUlRJTUVPVVQsIChjYWRkcl90KSZ0bykgPCAwKSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiQklPQ1NSVElNRU9VVDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKyNpZmRlZiBIQVZFX1NUUlVDVF9CUEZfVElNRVZBTAorCQl9CisjZW5kaWYKKwl9CisKKyNpZmRlZiBfQUlYCisjaWZkZWYJQklPQ0lNTUVESUFURQorCS8qCisJICogRGFycmVuIFJlZWQgbm90ZXMgdGhhdAorCSAqCisJICoJT24gQUlYICg0LjIgYXQgbGVhc3QpLCBpZiBCSU9DSU1NRURJQVRFIGlzIG5vdCBzZXQsIHRoZQorCSAqCXRpbWVvdXQgYXBwZWFycyB0byBiZSBpZ25vcmVkIGFuZCBpdCB3YWl0cyB1bnRpbCB0aGUgYnVmZmVyCisJICoJaXMgZmlsbGVkIGJlZm9yZSByZXR1cm5pbmcuICBUaGUgcmVzdWx0IG9mIG5vdCBoYXZpbmcgaXQKKwkgKglzZXQgaXMgYWxtb3N0IHdvcnNlIHRoYW4gdXNlbGVzcyBpZiB5b3VyIEJQRiBmaWx0ZXIKKwkgKglpcyByZWR1Y2luZyB0aGluZ3MgdG8gb25seSBhIGZldyBwYWNrZXRzIChpLmUuIG9uZSBldmVyeQorCSAqCXNlY29uZCBvciBzbykuCisJICoKKwkgKiBzbyB3ZSB0dXJuIEJJT0NJTU1FRElBVEUgbW9kZSBvbiBpZiB0aGlzIGlzIEFJWC4KKwkgKgorCSAqIFdlIGRvbid0IHR1cm4gaXQgb24gZm9yIG90aGVyIHBsYXRmb3JtcywgYXMgdGhhdCBtZWFucyB3ZQorCSAqIGdldCB3b2tlbiB1cCBmb3IgZXZlcnkgcGFja2V0LCB3aGljaCBtYXkgbm90IGJlIHdoYXQgd2Ugd2FudDsKKwkgKiBpbiB0aGUgV2ludGVyIDE5OTMgVVNFTklYIHBhcGVyIG9uIEJQRiwgdGhleSBzYXk6CisJICoKKwkgKglTaW5jZSBhIHByb2Nlc3MgbWlnaHQgd2FudCB0byBsb29rIGF0IGV2ZXJ5IHBhY2tldCBvbiBhCisJICoJbmV0d29yayBhbmQgdGhlIHRpbWUgYmV0d2VlbiBwYWNrZXRzIGNhbiBiZSBvbmx5IGEgZmV3CisJICoJbWljcm9zZWNvbmRzLCBpdCBpcyBub3QgcG9zc2libGUgdG8gZG8gYSByZWFkIHN5c3RlbSBjYWxsCisJICoJcGVyIHBhY2tldCBhbmQgQlBGIG11c3QgY29sbGVjdCB0aGUgZGF0YSBmcm9tIHNldmVyYWwKKwkgKglwYWNrZXRzIGFuZCByZXR1cm4gaXQgYXMgYSB1bml0IHdoZW4gdGhlIG1vbml0b3JpbmcKKwkgKglhcHBsaWNhdGlvbiBkb2VzIGEgcmVhZC4KKwkgKgorCSAqIHdoaWNoIEkgaW5mZXIgaXMgdGhlIHJlYXNvbiBmb3IgdGhlIHRpbWVvdXQgLSBpdCBtZWFucyB3ZQorCSAqIHdhaXQgdGhhdCBhbW91bnQgb2YgdGltZSwgaW4gdGhlIGhvcGVzIHRoYXQgbW9yZSBwYWNrZXRzCisJICogd2lsbCBhcnJpdmUgYW5kIHdlJ2xsIGdldCB0aGVtIGFsbCB3aXRoIG9uZSByZWFkLgorCSAqCisJICogU2V0dGluZyBCSU9DSU1NRURJQVRFIG1vZGUgb24gRnJlZUJTRCAoYW5kIHByb2JhYmx5IG90aGVyCisJICogQlNEcykgY2F1c2VzIHRoZSB0aW1lb3V0IHRvIGJlIGlnbm9yZWQuCisJICoKKwkgKiBPbiB0aGUgb3RoZXIgaGFuZCwgc29tZSBwbGF0Zm9ybXMgKGUuZy4sIExpbnV4KSBkb24ndCBzdXBwb3J0CisJICogdGltZW91dHMsIHRoZXkganVzdCBoYW5kIHN0dWZmIHRvIHlvdSBhcyBzb29uIGFzIGl0IGFycml2ZXM7CisJICogaWYgdGhhdCBkb2Vzbid0IGNhdXNlIGEgcHJvYmxlbSBvbiB0aG9zZSBwbGF0Zm9ybXMsIGl0IG1heQorCSAqIGJlIE9LIHRvIGhhdmUgQklPQ0lNTUVESUFURSBtb2RlIG9uIEJTRCBhcyB3ZWxsLgorCSAqCisJICogKE5vdGUsIHRob3VnaCwgdGhhdCBhcHBsaWNhdGlvbnMgbWF5IGRlcGVuZCBvbiB0aGUgcmVhZAorCSAqIGNvbXBsZXRpbmcsIGV2ZW4gaWYgbm8gcGFja2V0cyBoYXZlIGFycml2ZWQsIHdoZW4gdGhlIHRpbWVvdXQKKwkgKiBleHBpcmVzLCBlLmcuIEdVSSBhcHBsaWNhdGlvbnMgdGhhdCBoYXZlIHRvIGNoZWNrIGZvciBpbnB1dAorCSAqIHdoaWxlIHdhaXRpbmcgZm9yIHBhY2tldHMgdG8gYXJyaXZlOyBhIG5vbi16ZXJvIHRpbWVvdXQKKwkgKiBwcmV2ZW50cyAic2VsZWN0KCkiIGZyb20gd29ya2luZyByaWdodCBvbiBGcmVlQlNEIGFuZAorCSAqIHBvc3NpYmx5IG90aGVyIEJTRHMsIGFzIHRoZSB0aW1lciBkb2Vzbid0IHN0YXJ0IHVudGlsIGEKKwkgKiAicmVhZCgpIiBpcyBkb25lLCBzbyB0aGUgdGltZXIgaXNuJ3QgaW4gZWZmZWN0IGlmIHRoZQorCSAqIGFwcGxpY2F0aW9uIGlzIGJsb2NrZWQgb24gYSAic2VsZWN0KCkiLCBhbmQgdGhlICJzZWxlY3QoKSIKKwkgKiBkb2Vzbid0IGdldCB3b2tlbiB1cCBmb3IgYSBCUEYgZGV2aWNlIHVudGlsIHRoZSBidWZmZXIKKwkgKiBmaWxscyB1cC4pCisJICovCisJdiA9IDE7CisJaWYgKGlvY3RsKHAtPmZkLCBCSU9DSU1NRURJQVRFLCAmdikgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NJTU1FRElBVEU6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJZ290byBiYWQ7CisJfQorI2VuZGlmCS8qIEJJT0NJTU1FRElBVEUgKi8KKyNlbmRpZgkvKiBfQUlYICovCisKKwlpZiAocC0+b3B0LnByb21pc2MpIHsKKwkJLyogc2V0IHByb21pc2N1b3VzIG1vZGUsIGp1c3Qgd2FybiBpZiBpdCBmYWlscyAqLworCQlpZiAoaW9jdGwocC0+ZmQsIEJJT0NQUk9NSVNDLCBOVUxMKSA8IDApIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NQUk9NSVNDOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJc3RhdHVzID0gUENBUF9XQVJOSU5HX1BST01JU0NfTk9UU1VQOworCQl9CisJfQorCisJaWYgKGlvY3RsKGZkLCBCSU9DR0JMRU4sIChjYWRkcl90KSZ2KSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQklPQ0dCTEVOOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gYmFkOworCX0KKwlwLT5idWZzaXplID0gdjsKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorCWlmICghcC0+bWQuemVyb2NvcHkpIHsKKyNlbmRpZgorCXAtPmJ1ZmZlciA9ICh1X2NoYXIgKiltYWxsb2MocC0+YnVmc2l6ZSk7CisJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQlnb3RvIGJhZDsKKwl9CisjaWZkZWYgX0FJWAorCS8qIEZvciBzb21lIHN0cmFuZ2UgcmVhc29uIHRoaXMgc2VlbXMgdG8gcHJldmVudCB0aGUgRUZBVUxUCisJICogcHJvYmxlbXMgd2UgaGF2ZSBleHBlcmllbmNlZCBmcm9tIEFJWCBCUEYuICovCisJbWVtc2V0KHAtPmJ1ZmZlciwgMHgwLCBwLT5idWZzaXplKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfWkVST0NPUFlfQlBGCisJfQorI2VuZGlmCisKKwkvKgorCSAqIElmIHRoZXJlJ3Mgbm8gZmlsdGVyIHByb2dyYW0gaW5zdGFsbGVkLCB0aGVyZSdzCisJICogbm8gaW5kaWNhdGlvbiB0byB0aGUga2VybmVsIG9mIHdoYXQgdGhlIHNuYXBzaG90CisJICogbGVuZ3RoIHNob3VsZCBiZSwgc28gbm8gc25hcHNob3R0aW5nIGlzIGRvbmUuCisJICoKKwkgKiBUaGVyZWZvcmUsIHdoZW4gd2Ugb3BlbiB0aGUgZGV2aWNlLCB3ZSBpbnN0YWxsCisJICogYW4gImFjY2VwdCBldmVyeXRoaW5nIiBmaWx0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkCisJICogc25hcHNob3QgbGVuZ3RoLgorCSAqLworCXRvdGFsX2luc24uY29kZSA9ICh1X3Nob3J0KShCUEZfUkVUIHwgQlBGX0spOworCXRvdGFsX2luc24uanQgPSAwOworCXRvdGFsX2luc24uamYgPSAwOworCXRvdGFsX2luc24uayA9IHAtPnNuYXBzaG90OworCisJdG90YWxfcHJvZy5iZl9sZW4gPSAxOworCXRvdGFsX3Byb2cuYmZfaW5zbnMgPSAmdG90YWxfaW5zbjsKKwlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTRVRGLCAoY2FkZHJfdCkmdG90YWxfcHJvZykgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRGOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gYmFkOworCX0KKworCS8qCisJICogT24gbW9zdCBCUEYgcGxhdGZvcm1zLCBlaXRoZXIgeW91IGNhbiBkbyBhICJzZWxlY3QoKSIgb3IKKwkgKiAicG9sbCgpIiBvbiBhIEJQRiBmaWxlIGRlc2NyaXB0b3IgYW5kIGl0IHdvcmtzIGNvcnJlY3RseSwKKwkgKiBvciB5b3UgY2FuIGRvIGl0IGFuZCBpdCB3aWxsIHJldHVybiAicmVhZGFibGUiIGlmIHRoZQorCSAqIGhvbGQgYnVmZmVyIGlzIGZ1bGwgYnV0IG5vdCBpZiB0aGUgdGltZW91dCBleHBpcmVzICphbmQqCisJICogYSBub24tYmxvY2tpbmcgcmVhZCB3aWxsLCBpZiB0aGUgaG9sZCBidWZmZXIgaXMgZW1wdHkKKwkgKiBidXQgdGhlIHN0b3JlIGJ1ZmZlciBpc24ndCBlbXB0eSwgcm90YXRlIHRoZSBidWZmZXJzCisJICogYW5kIHJldHVybiB3aGF0IHBhY2tldHMgYXJlIGF2YWlsYWJsZS4KKwkgKgorCSAqIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGZhY3QgdGhhdCBhIG5vbi1ibG9ja2luZyByZWFkCisJICogd2lsbCBnaXZlIHlvdSB0aGUgYXZhaWxhYmxlIHBhY2tldHMgbWVhbnMgeW91IGNhbiB3b3JrCisJICogYXJvdW5kIHRoZSBmYWlsdXJlIG9mICJzZWxlY3QoKSIgYW5kICJwb2xsKCkiIHRvIHdha2UgdXAKKwkgKiBhbmQgcmV0dXJuICJyZWFkYWJsZSIgd2hlbiB0aGUgdGltZW91dCBleHBpcmVzIGJ5IHVzaW5nCisJICogdGhlIHRpbWVvdXQgYXMgdGhlICJzZWxlY3QoKSIgb3IgInBvbGwoKSIgdGltZW91dCwgcHV0dGluZworCSAqIHRoZSBCUEYgZGVzY3JpcHRvciBpbnRvIG5vbi1ibG9ja2luZyBtb2RlLCBhbmQgcmVhZCBmcm9tCisJICogaXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyICJzZWxlY3QoKSIgcmVwb3J0cyBpdCBhcyByZWFkYWJsZQorCSAqIG9yIG5vdC4KKwkgKgorCSAqIEhvd2V2ZXIsIGluIEZyZWVCU0QgNC4zIGFuZCA0LjQsICJzZWxlY3QoKSIgYW5kICJwb2xsKCkiCisJICogd29uJ3Qgd2FrZSB1cCBhbmQgcmV0dXJuICJyZWFkYWJsZSIgaWYgdGhlIHRpbWVyIGV4cGlyZXMKKwkgKiBhbmQgbm9uLWJsb2NraW5nIHJlYWRzIHJldHVybiBFV09VTERCTE9DSyBpZiB0aGUgaG9sZAorCSAqIGJ1ZmZlciBpcyBlbXB0eSwgZXZlbiBpZiB0aGUgc3RvcmUgYnVmZmVyIGlzIG5vbi1lbXB0eS4KKwkgKgorCSAqIFRoaXMgbWVhbnMgdGhlIHdvcmthcm91bmQgaW4gcXVlc3Rpb24gd29uJ3Qgd29yay4KKwkgKgorCSAqIFRoZXJlZm9yZSwgb24gRnJlZUJTRCA0LjMgYW5kIDQuNCwgd2Ugc2V0ICJwLT5zZWxlY3RhYmxlX2ZkIgorCSAqIHRvIC0xLCB3aGljaCBtZWFucyAic29ycnksIHlvdSBjYW4ndCB1c2UgJ3NlbGVjdCgpJyBvciAncG9sbCgpJworCSAqIGhlcmUiLiAgT24gYWxsIG90aGVyIEJQRiBwbGF0Zm9ybXMsIHdlIHNldCBpdCB0byB0aGUgRkQgZm9yCisJICogdGhlIEJQRiBkZXZpY2U7IGluIE5ldEJTRCwgT3BlbkJTRCwgYW5kIERhcndpbiwgYSBub24tYmxvY2tpbmcKKwkgKiByZWFkIHdpbGwsIGlmIHRoZSBob2xkIGJ1ZmZlciBpcyBlbXB0eSBhbmQgdGhlIHN0b3JlIGJ1ZmZlcgorCSAqIGlzbid0IGVtcHR5LCByb3RhdGUgdGhlIGJ1ZmZlcnMgYW5kIHJldHVybiB3aGF0IHBhY2tldHMgYXJlCisJICogdGhlcmUgKGFuZCBpbiBzdWZmaWNpZW50bHkgcmVjZW50IHZlcnNpb25zIG9mIE9wZW5CU0QKKwkgKiAic2VsZWN0KCkiIGFuZCAicG9sbCgpIiBzaG91bGQgd29yayBjb3JyZWN0bHkpLgorCSAqCisJICogWFhYIC0gd2hhdCBhYm91dCBBSVg/CisJICovCisJcC0+c2VsZWN0YWJsZV9mZCA9IHAtPmZkOwkvKiBhc3N1bWUgc2VsZWN0KCkgd29ya3MgdW50aWwgd2Uga25vdyBvdGhlcndpc2UgKi8KKwlpZiAoaGF2ZV9vc2luZm8pIHsKKwkJLyoKKwkJICogV2UgY2FuIGNoZWNrIHdoYXQgT1MgdGhpcyBpcy4KKwkJICovCisJCWlmIChzdHJjbXAob3NpbmZvLnN5c25hbWUsICJGcmVlQlNEIikgPT0gMCkgeworCQkJaWYgKHN0cm5jbXAob3NpbmZvLnJlbGVhc2UsICI0LjMtIiwgNCkgPT0gMCB8fAorCQkJICAgICBzdHJuY21wKG9zaW5mby5yZWxlYXNlLCAiNC40LSIsIDQpID09IDApCisJCQkJcC0+c2VsZWN0YWJsZV9mZCA9IC0xOworCQl9CisJfQorCisJcC0+cmVhZF9vcCA9IHBjYXBfcmVhZF9icGY7CisJcC0+aW5qZWN0X29wID0gcGNhcF9pbmplY3RfYnBmOworCXAtPnNldGZpbHRlcl9vcCA9IHBjYXBfc2V0ZmlsdGVyX2JwZjsKKwlwLT5zZXRkaXJlY3Rpb25fb3AgPSBwY2FwX3NldGRpcmVjdGlvbl9icGY7CisJcC0+c2V0X2RhdGFsaW5rX29wID0gcGNhcF9zZXRfZGF0YWxpbmtfYnBmOworCXAtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19icGY7CisJcC0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2JwZjsKKwlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfYnBmOworCXAtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfYnBmOworCisJcmV0dXJuIChzdGF0dXMpOworIGJhZDoKKyAJcGNhcF9jbGVhbnVwX2JwZihwKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKK2ludAorcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworI2lmZGVmIEhBVkVfREFHX0FQSQorCWlmIChkYWdfcGxhdGZvcm1fZmluZGRldnMoYWxsZGV2c3AsIGVycmJ1ZikgPCAwKQorCQlyZXR1cm4gKC0xKTsKKyNlbmRpZiAvKiBIQVZFX0RBR19BUEkgKi8KKyNpZmRlZiBIQVZFX1NORl9BUEkKKwlpZiAoc25mX3BsYXRmb3JtX2ZpbmRkZXZzKGFsbGRldnNwLCBlcnJidWYpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisjZW5kaWYgLyogSEFWRV9TTkZfQVBJICovCisKKwlyZXR1cm4gKDApOworfQorCisjaWZkZWYgSEFWRV9CU0RfSUVFRTgwMjExCitzdGF0aWMgaW50Cittb25pdG9yX21vZGUocGNhcF90ICpwLCBpbnQgc2V0KQoreworCWludCBzb2NrOworCXN0cnVjdCBpZm1lZGlhcmVxIHJlcTsKKwlpbnQgKm1lZGlhX2xpc3Q7CisJaW50IGk7CisJaW50IGNhbl9kbzsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoc29jayA9PSAtMSkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJjYW4ndCBvcGVuIHNvY2tldDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCX0KKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YgcmVxKTsKKwlzdHJuY3B5KHJlcS5pZm1fbmFtZSwgcC0+b3B0LnNvdXJjZSwgc2l6ZW9mIHJlcS5pZm1fbmFtZSk7CisKKwkvKgorCSAqIEZpbmQgb3V0IGhvdyBtYW55IG1lZGlhIHR5cGVzIHdlIGhhdmUuCisJICovCisJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZNRURJQSwgJnJlcSkgPCAwKSB7CisJCS8qCisJCSAqIENhbid0IGdldCB0aGUgbWVkaWEgdHlwZXMuCisJCSAqLworCQlzd2l0Y2ggKGVycm5vKSB7CisKKwkJY2FzZSBFTlhJTzoKKwkJCS8qCisJCQkgKiBUaGVyZSdzIG5vIHN1Y2ggZGV2aWNlLgorCQkJICovCisJCQljbG9zZShzb2NrKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSk7CisKKwkJY2FzZSBFSU5WQUw6CisJCQkvKgorCQkJICogSW50ZXJmYWNlIGRvZXNuJ3Qgc3VwcG9ydCBTSU9De0csU31JRk1FRElBLgorCQkJICovCisJCQljbG9zZShzb2NrKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUl9SRk1PTl9OT1RTVVApOworCisJCWRlZmF1bHQ6CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIlNJT0NHSUZNRURJQSAxOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWNsb3NlKHNvY2spOworCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJfQorCX0KKwlpZiAocmVxLmlmbV9jb3VudCA9PSAwKSB7CisJCS8qCisJCSAqIE5vIG1lZGlhIHR5cGVzLgorCQkgKi8KKwkJY2xvc2Uoc29jayk7CisJCXJldHVybiAoUENBUF9FUlJPUl9SRk1PTl9OT1RTVVApOworCX0KKworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCBhbGwgdGhlIG1lZGlhIHR5cGVzLCBhbmQKKwkgKiBnZXQgdGhlIG1lZGlhIHR5cGVzLgorCSAqLworCW1lZGlhX2xpc3QgPSBtYWxsb2MocmVxLmlmbV9jb3VudCAqIHNpemVvZihpbnQpKTsKKwlpZiAobWVkaWFfbGlzdCA9PSBOVUxMKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQljbG9zZShzb2NrKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisJcmVxLmlmbV91bGlzdCA9IG1lZGlhX2xpc3Q7CisJaWYgKGlvY3RsKHNvY2ssIFNJT0NHSUZNRURJQSwgJnJlcSkgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NHSUZNRURJQTogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlmcmVlKG1lZGlhX2xpc3QpOworCQljbG9zZShzb2NrKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisKKwkvKgorCSAqIExvb2sgZm9yIGFuIDgwMi4xMSAiYXV0b21hdGljIiBtZWRpYSB0eXBlLgorCSAqIFdlIGFzc3VtZSB0aGF0IGFsbCA4MDIuMTEgYWRhcHRlcnMgaGF2ZSB0aGF0IG1lZGlhIHR5cGUsCisJICogYW5kIHRoYXQgaXQgd2lsbCBjYXJyeSB0aGUgbW9uaXRvciBtb2RlIHN1cHBvcnRlZCBmbGFnLgorCSAqLworCWNhbl9kbyA9IDA7CisJZm9yIChpID0gMDsgaSA8IHJlcS5pZm1fY291bnQ7IGkrKykgeworCQlpZiAoSUZNX1RZUEUobWVkaWFfbGlzdFtpXSkgPT0gSUZNX0lFRUU4MDIxMQorCQkgICAgJiYgSUZNX1NVQlRZUEUobWVkaWFfbGlzdFtpXSkgPT0gSUZNX0FVVE8pIHsKKwkJCS8qIE9LLCBkb2VzIGl0IGRvIG1vbml0b3IgbW9kZT8gKi8KKwkJCWlmIChtZWRpYV9saXN0W2ldICYgSUZNX0lFRUU4MDIxMV9NT05JVE9SKSB7CisJCQkJY2FuX2RvID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlmcmVlKG1lZGlhX2xpc3QpOworCWlmICghY2FuX2RvKSB7CisJCS8qCisJCSAqIFRoaXMgYWRhcHRlciBkb2Vzbid0IHN1cHBvcnQgbW9uaXRvciBtb2RlLgorCQkgKi8KKwkJY2xvc2Uoc29jayk7CisJCXJldHVybiAoUENBUF9FUlJPUl9SRk1PTl9OT1RTVVApOworCX0KKworCWlmIChzZXQpIHsKKwkJLyoKKwkJICogRG9uJ3QganVzdCBjaGVjayB3aGV0aGVyIHdlIGNhbiBlbmFibGUgbW9uaXRvciBtb2RlLAorCQkgKiBkbyBzbywgaWYgaXQncyBub3QgYWxyZWFkeSBlbmFibGVkLgorCQkgKi8KKwkJaWYgKChyZXEuaWZtX2N1cnJlbnQgJiBJRk1fSUVFRTgwMjExX01PTklUT1IpID09IDApIHsKKwkJCS8qCisJCQkgKiBNb25pdG9yIG1vZGUgaXNuJ3QgY3VycmVudGx5IG9uLCBzbyB0dXJuIGl0IG9uLAorCQkJICogYW5kIHJlbWVtYmVyIHRoYXQgd2Ugc2hvdWxkIHR1cm4gaXQgb2ZmIHdoZW4gdGhlCisJCQkgKiBwY2FwX3QgaXMgY2xvc2VkLgorCQkJICovCisKKwkJCS8qCisJCQkgKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgYXJyYW5nZSB0byBoYXZlCisJCQkgKiAicGNhcF9jbG9zZV9hbGwoKSIgY2FsbGVkIHdoZW4gd2UgZXhpdC4KKwkJCSAqLworCQkJaWYgKCFwY2FwX2RvX2FkZGV4aXQocCkpIHsKKwkJCQkvKgorCQkJCSAqICJhdGV4aXQoKSIgZmFpbGVkOyBkb24ndCBwdXQgdGhlIGludGVyZmFjZQorCQkJCSAqIGluIG1vbml0b3IgbW9kZSwganVzdCBnaXZlIHVwLgorCQkJCSAqLworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgICJhdGV4aXQgZmFpbGVkIik7CisJCQkJY2xvc2Uoc29jayk7CisJCQkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwkJCX0KKwkJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCQkodm9pZClzdHJuY3B5KGlmci5pZnJfbmFtZSwgcC0+b3B0LnNvdXJjZSwKKwkJCSAgICBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCQlpZnIuaWZyX21lZGlhID0gcmVxLmlmbV9jdXJyZW50IHwgSUZNX0lFRUU4MDIxMV9NT05JVE9SOworCQkJaWYgKGlvY3RsKHNvY2ssIFNJT0NTSUZNRURJQSwgJmlmcikgPT0gLTEpIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICAiU0lPQ1NJRk1FRElBOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljbG9zZShzb2NrKTsKKwkJCQlyZXR1cm4gKFBDQVBfRVJST1IpOworCQkJfQorCisJCQlwLT5tZC5tdXN0X2RvX29uX2Nsb3NlIHw9IE1VU1RfQ0xFQVJfUkZNT047CisKKwkJCS8qCisJCQkgKiBBZGQgdGhpcyB0byB0aGUgbGlzdCBvZiBwY2FwcyB0byBjbG9zZSB3aGVuIHdlIGV4aXQuCisJCQkgKi8KKwkJCXBjYXBfYWRkX3RvX3BjYXBzX3RvX2Nsb3NlKHApOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisjZW5kaWYgLyogSEFWRV9CU0RfSUVFRTgwMjExICovCisKKyNpZiBkZWZpbmVkKEJJT0NHRExUTElTVCkgJiYgKGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKEhBVkVfQlNEX0lFRUU4MDIxMSkpCisvKgorICogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGFueSA4MDIuMTEgbGluay1sYXllciB0eXBlczsgcmV0dXJuIHRoZSBiZXN0CisgKiBvZiB0aGUgODAyLjExIGxpbmstbGF5ZXIgdHlwZXMgaWYgd2UgZmluZCBvbmUsIGFuZCByZXR1cm4gLTEKKyAqIG90aGVyd2lzZS4KKyAqCisgKiBETFRfSUVFRTgwMl8xMV9SQURJTywgd2l0aCB0aGUgcmFkaW90YXAgaGVhZGVyLCBpcyBjb25zaWRlcmVkIHRoZQorICogYmVzdCA4MDIuMTEgbGluay1sYXllciB0eXBlOyBhbnkgb2YgdGhlIG90aGVyIDgwMi4xMS1wbHVzLXJhZGlvCisgKiBoZWFkZXJzIGFyZSBzZWNvbmQtYmVzdDsgODAyLjExIHdpdGggbm8gcmFkaW8gaW5mb3JtYXRpb24gaXMKKyAqIHRoZSBsZWFzdCBnb29kLgorICovCitzdGF0aWMgaW50CitmaW5kXzgwMl8xMShzdHJ1Y3QgYnBmX2RsdGxpc3QgKmJkbHApCit7CisJaW50IG5ld19kbHQ7CisJaW50IGk7CisKKwkvKgorCSAqIFNjYW4gdGhlIGxpc3Qgb2YgRExUXyB2YWx1ZXMsIGxvb2tpbmcgZm9yIDgwMi4xMSB2YWx1ZXMsCisJICogYW5kLCBpZiB3ZSBmaW5kIGFueSwgY2hvb3NlIHRoZSBiZXN0IG9mIHRoZW0uCisJICovCisJbmV3X2RsdCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBiZGxwLT5iZmxfbGVuOyBpKyspIHsKKwkJc3dpdGNoIChiZGxwLT5iZmxfbGlzdFtpXSkgeworCisJCWNhc2UgRExUX0lFRUU4MDJfMTE6CisJCQkvKgorCQkJICogODAyLjExLCBidXQgbm8gcmFkaW8uCisJCQkgKgorCQkJICogT2ZmZXIgdGhpcywgYW5kIHNlbGVjdCBpdCBhcyB0aGUgbmV3IG1vZGUKKwkJCSAqIHVubGVzcyB3ZSd2ZSBhbHJlYWR5IGZvdW5kIGFuIDgwMi4xMQorCQkJICogaGVhZGVyIHdpdGggcmFkaW8gaW5mb3JtYXRpb24uCisJCQkgKi8KKwkJCWlmIChuZXdfZGx0ID09IC0xKQorCQkJCW5ld19kbHQgPSBiZGxwLT5iZmxfbGlzdFtpXTsKKwkJCWJyZWFrOworCisJCWNhc2UgRExUX1BSSVNNX0hFQURFUjoKKwkJY2FzZSBETFRfQUlST05FVF9IRUFERVI6CisJCWNhc2UgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTOgorCQkJLyoKKwkJCSAqIDgwMi4xMSB3aXRoIHJhZGlvLCBidXQgbm90IHJhZGlvdGFwLgorCQkJICoKKwkJCSAqIE9mZmVyIHRoaXMsIGFuZCBzZWxlY3QgaXQgYXMgdGhlIG5ldyBtb2RlCisJCQkgKiB1bmxlc3Mgd2UndmUgYWxyZWFkeSBmb3VuZCB0aGUgcmFkaW90YXAgRExUXy4KKwkJCSAqLworCQkJaWYgKG5ld19kbHQgIT0gRExUX0lFRUU4MDJfMTFfUkFESU8pCisJCQkJbmV3X2RsdCA9IGJkbHAtPmJmbF9saXN0W2ldOworCQkJYnJlYWs7CisKKwkJY2FzZSBETFRfSUVFRTgwMl8xMV9SQURJTzoKKwkJCS8qCisJCQkgKiA4MDIuMTEgd2l0aCByYWRpb3RhcC4KKwkJCSAqCisJCQkgKiBPZmZlciB0aGlzLCBhbmQgc2VsZWN0IGl0IGFzIHRoZSBuZXcgbW9kZS4KKwkJCSAqLworCQkJbmV3X2RsdCA9IGJkbHAtPmJmbF9saXN0W2ldOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBOb3QgODAyLjExLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAobmV3X2RsdCk7Cit9CisjZW5kaWYgLyogZGVmaW5lZChCSU9DR0RMVExJU1QpICYmIChkZWZpbmVkKF9fQVBQTEVfXykgfHwgZGVmaW5lZChIQVZFX0JTRF9JRUVFODAyMTEpKSAqLworCisjaWYgZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoQklPQ0dETFRMSVNUKQorLyoKKyAqIFJlbW92ZSBETFRfRU4xME1CIGZyb20gdGhlIGxpc3Qgb2YgRExUXyB2YWx1ZXMsIGFzIHdlJ3JlIGluIG1vbml0b3IgbW9kZSwKKyAqIGFuZCBETFRfRU4xME1CIGlzbid0IHN1cHBvcnRlZCBpbiBtb25pdG9yIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkCityZW1vdmVfZW4ocGNhcF90ICpwKQoreworCWludCBpLCBqOworCisJLyoKKwkgKiBTY2FuIHRoZSBsaXN0IG9mIERMVF8gdmFsdWVzIGFuZCBkaXNjYXJkIERMVF9FTjEwTUIuCisJICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IHAtPmRsdF9jb3VudDsgaSsrKSB7CisJCXN3aXRjaCAocC0+ZGx0X2xpc3RbaV0pIHsKKworCQljYXNlIERMVF9FTjEwTUI6CisJCQkvKgorCQkJICogRG9uJ3Qgb2ZmZXIgdGhpcyBvbmUuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogSnVzdCBjb3B5IHRoaXMgbW9kZSBvdmVyLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIENvcHkgdGhpcyBETFRfIHZhbHVlIHRvIGl0cyBuZXcgcG9zaXRpb24uCisJCSAqLworCQlwLT5kbHRfbGlzdFtqXSA9IHAtPmRsdF9saXN0W2ldOworCQlqKys7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIERMVF8gY291bnQgdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIHdlIGNvcGllZC4KKwkgKi8KKwlwLT5kbHRfY291bnQgPSBqOworfQorCisvKgorICogUmVtb3ZlIDgwMi4xMSBsaW5rLWxheWVyIHR5cGVzIGZyb20gdGhlIGxpc3Qgb2YgRExUXyB2YWx1ZXMsIGFzCisgKiB3ZSdyZSBub3QgaW4gbW9uaXRvciBtb2RlLCBhbmQgdGhvc2UgRExUXyB2YWx1ZXMgd2lsbCBzd2l0Y2ggdXMKKyAqIHRvIG1vbml0b3IgbW9kZS4KKyAqLworc3RhdGljIHZvaWQKK3JlbW92ZV84MDJfMTEocGNhcF90ICpwKQoreworCWludCBpLCBqOworCisJLyoKKwkgKiBTY2FuIHRoZSBsaXN0IG9mIERMVF8gdmFsdWVzIGFuZCBkaXNjYXJkIDgwMi4xMSB2YWx1ZXMuCisJICovCisJaiA9IDA7CisJZm9yIChpID0gMDsgaSA8IHAtPmRsdF9jb3VudDsgaSsrKSB7CisJCXN3aXRjaCAocC0+ZGx0X2xpc3RbaV0pIHsKKworCQljYXNlIERMVF9JRUVFODAyXzExOgorCQljYXNlIERMVF9QUklTTV9IRUFERVI6CisJCWNhc2UgRExUX0FJUk9ORVRfSEVBREVSOgorCQljYXNlIERMVF9JRUVFODAyXzExX1JBRElPOgorCQljYXNlIERMVF9JRUVFODAyXzExX1JBRElPX0FWUzoKKwkJCS8qCisJCQkgKiA4MDIuMTEuICBEb24ndCBvZmZlciB0aGlzIG9uZS4KKwkJCSAqLworCQkJY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJCS8qCisJCQkgKiBKdXN0IGNvcHkgdGhpcyBtb2RlIG92ZXIuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQ29weSB0aGlzIERMVF8gdmFsdWUgdG8gaXRzIG5ldyBwb3NpdGlvbi4KKwkJICovCisJCXAtPmRsdF9saXN0W2pdID0gcC0+ZGx0X2xpc3RbaV07CisJCWorKzsKKwl9CisKKwkvKgorCSAqIFNldCB0aGUgRExUXyBjb3VudCB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMgd2UgY29waWVkLgorCSAqLworCXAtPmRsdF9jb3VudCA9IGo7Cit9CisjZW5kaWYgLyogZGVmaW5lZChfX0FQUExFX18pICYmIGRlZmluZWQoQklPQ0dETFRMSVNUKSAqLworCitzdGF0aWMgaW50CitwY2FwX3NldGZpbHRlcl9icGYocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQoreworCS8qCisJICogRnJlZSBhbnkgdXNlci1tb2RlIGZpbHRlciB3ZSBtaWdodCBoYXBwZW4gdG8gaGF2ZSBpbnN0YWxsZWQuCisJICovCisJcGNhcF9mcmVlY29kZSgmcC0+ZmNvZGUpOworCisJLyoKKwkgKiBUcnkgdG8gaW5zdGFsbCB0aGUga2VybmVsIGZpbHRlci4KKwkgKi8KKwlpZiAoaW9jdGwocC0+ZmQsIEJJT0NTRVRGLCAoY2FkZHJfdClmcCkgPT0gMCkgeworCQkvKgorCQkgKiBJdCB3b3JrZWQuCisJCSAqLworCQlwLT5tZC51c2VfYnBmID0gMTsJLyogZmlsdGVyaW5nIGluIHRoZSBrZXJuZWwgKi8KKworCQkvKgorCQkgKiBEaXNjYXJkIGFueSBwcmV2aW91c2x5LXJlY2VpdmVkIHBhY2tldHMsIGFzIHRoZXkgbWlnaHQKKwkJICogaGF2ZSBwYXNzZWQgd2hhdGV2ZXIgZmlsdGVyIHdhcyBmb3JtZXJseSBpbiBlZmZlY3QsIGJ1dAorCQkgKiBtaWdodCBub3QgcGFzcyB0aGlzIGZpbHRlciAoQklPQ1NFVEYgZGlzY2FyZHMgcGFja2V0cworCQkgKiBidWZmZXJlZCBpbiB0aGUga2VybmVsLCBzbyB5b3UgY2FuIGxvc2UgcGFja2V0cyBpbiBhbnkKKwkJICogY2FzZSkuCisJCSAqLworCQlwLT5jYyA9IDA7CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBXZSBmYWlsZWQuCisJICoKKwkgKiBJZiBpdCBmYWlsZWQgd2l0aCBFSU5WQUwsIHRoYXQncyBwcm9iYWJseSBiZWNhdXNlIHRoZSBwcm9ncmFtCisJICogaXMgaW52YWxpZCBvciB0b28gYmlnLiAgVmFsaWRhdGUgaXQgb3Vyc2VsdmVzOyBpZiB3ZSBsaWtlIGl0CisJICogKHdlIGN1cnJlbnRseSBhbGxvdyBiYWNrd2FyZCBicmFuY2hlcywgdG8gc3VwcG9ydCBwcm90b2NoYWluKSwKKwkgKiBydW4gaXQgaW4gdXNlcmxhbmQuICAoVGhlcmUncyBubyBub3Rpb24gb2YgInRvbyBiaWciIGZvcgorCSAqIHVzZXJsYW5kLikKKwkgKgorCSAqIE90aGVyd2lzZSwganVzdCBnaXZlIHVwLgorCSAqIFhYWCAtIGlmIHRoZSBjb3B5IG9mIHRoZSBwcm9ncmFtIGludG8gdGhlIGtlcm5lbCBmYWlsZWQsCisJICogd2Ugd2lsbCBnZXQgRUlOVkFMIHJhdGhlciB0aGFuLCBzYXksIEVGQVVMVCBvbiBhdCBsZWFzdAorCSAqIHNvbWUga2VybmVscy4KKwkgKi8KKwlpZiAoZXJybm8gIT0gRUlOVkFMKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkJJT0NTRVRGOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qCisJICogaW5zdGFsbF9icGZfcHJvZ3JhbSgpIHZhbGlkYXRlcyB0aGUgcHJvZ3JhbS4KKwkgKgorCSAqIFhYWCAtIHdoYXQgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZmlsdGVyIGluIHRoZSBrZXJuZWw/CisJICovCisJaWYgKGluc3RhbGxfYnBmX3Byb2dyYW0ocCwgZnApIDwgMCkKKwkJcmV0dXJuICgtMSk7CisJcC0+bWQudXNlX2JwZiA9IDA7CS8qIGZpbHRlcmluZyBpbiB1c2VybGFuZCAqLworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBTZXQgZGlyZWN0aW9uIGZsYWc6IFdoaWNoIHBhY2tldHMgZG8gd2UgYWNjZXB0IG9uIGEgZm9yd2FyZGluZworICogc2luZ2xlIGRldmljZT8gSU4sIE9VVCBvciBib3RoPworICovCitzdGF0aWMgaW50CitwY2FwX3NldGRpcmVjdGlvbl9icGYocGNhcF90ICpwLCBwY2FwX2RpcmVjdGlvbl90IGQpCit7CisjaWYgZGVmaW5lZChCSU9DU0RJUkVDVElPTikKKwl1X2ludCBkaXJlY3Rpb247CisKKwlkaXJlY3Rpb24gPSAoZCA9PSBQQ0FQX0RfSU4pID8gQlBGX0RfSU4gOgorCSAgICAoKGQgPT0gUENBUF9EX09VVCkgPyBCUEZfRF9PVVQgOiBCUEZfRF9JTk9VVCk7CisJaWYgKGlvY3RsKHAtPmZkLCBCSU9DU0RJUkVDVElPTiwgJmRpcmVjdGlvbikgPT0gLTEpIHsKKwkJKHZvaWQpIHNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCSAgICAiQ2Fubm90IHNldCBkaXJlY3Rpb24gdG8gJXM6ICVzIiwKKwkJICAgICAgICAoZCA9PSBQQ0FQX0RfSU4pID8gIlBDQVBfRF9JTiIgOgorCQkJKChkID09IFBDQVBfRF9PVVQpID8gIlBDQVBfRF9PVVQiIDogIlBDQVBfRF9JTk9VVCIpLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoMCk7CisjZWxpZiBkZWZpbmVkKEJJT0NTU0VFU0VOVCkKKwl1X2ludCBzZWVzZW50OworCisJLyoKKwkgKiBXZSBkb24ndCBzdXBwb3J0IFBDQVBfRF9PVVQuCisJICovCisJaWYgKGQgPT0gUENBUF9EX09VVCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkgICAgIlNldHRpbmcgZGlyZWN0aW9uIHRvIFBDQVBfRF9PVVQgaXMgbm90IHN1cHBvcnRlZCBvbiBCUEYiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNlZXNlbnQgPSAoZCA9PSBQQ0FQX0RfSU5PVVQpOworCWlmIChpb2N0bChwLT5mZCwgQklPQ1NTRUVTRU5ULCAmc2Vlc2VudCkgPT0gLTEpIHsKKwkJKHZvaWQpIHNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCSAgICAiQ2Fubm90IHNldCBkaXJlY3Rpb24gdG8gJXM6ICVzIiwKKwkJICAgICAgICAoZCA9PSBQQ0FQX0RfSU5PVVQpID8gIlBDQVBfRF9JTk9VVCIgOiAiUENBUF9EX0lOIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKDApOworI2Vsc2UKKwkodm9pZCkgc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKKwkgICAgIlRoaXMgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBCSU9DU1NFRVNFTlQsIHNvIHRoZSBkaXJlY3Rpb24gY2FuJ3QgYmUgc2V0Iik7CisJcmV0dXJuICgtMSk7CisjZW5kaWYKK30KKworc3RhdGljIGludAorcGNhcF9zZXRfZGF0YWxpbmtfYnBmKHBjYXBfdCAqcCwgaW50IGRsdCkKK3sKKyNpZmRlZiBCSU9DU0RMVAorCWlmIChpb2N0bChwLT5mZCwgQklPQ1NETFQsICZkbHQpID09IC0xKSB7CisJCSh2b2lkKSBzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkgICAgIkNhbm5vdCBzZXQgRExUICVkOiAlcyIsIGRsdCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorI2VuZGlmCisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1icGYuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC1icGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdlOTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLWJwZi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBTdGFuZm9yZC9DTVUgZW5ldCBwYWNrZXQgZmlsdGVyLAorICogKG5ldC9lbmV0LmMpIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2YgNC4zQlNELCBhbmQgY29kZSBjb250cmlidXRlZAorICogdG8gQmVya2VsZXkgYnkgU3RldmVuIE1jQ2FubmUgYW5kIFZhbiBKYWNvYnNvbiBib3RoIG9mIExhd3JlbmNlIAorICogQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtYnBmLmgsdiAxLjUwIDIwMDctMDQtMDEgMjE6NDM6NTUgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyoKKyAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAqCisgKiBOb3RlIHRvIE9TIHZlbmRvcnM6IGRvIE5PVCBnZXQgcmlkIG9mIHRoaXMgZmlsZSEgIFNvbWUgYXBwbGljYXRpb25zCisgKiBtaWdodCBleHBlY3QgdG8gYmUgYWJsZSB0byBpbmNsdWRlIDxwY2FwLWJwZi5oPi4KKyAqLworI2luY2x1ZGUgPHBjYXAvYnBmLmg+CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtYnQtbGludXguYyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1idC1saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNmMwOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtYnQtbGludXguYwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBQYW9sbyBBYmVuaSAoSXRhbHkpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSAKKyAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiAKKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBCbHVldG9vdGggc25pZmZpbmcgQVBJIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBwbGF0Zm9ybQorICogQnkgUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0PgorICoKKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1idC1saW51eC5jLHYgMS4xNSAyMDA4LTA3LTAxIDA3OjA1OjU0IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKyAKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAicGNhcC1idC1saW51eC5oIgorI2luY2x1ZGUgInBjYXAvYmx1ZXRvb3RoLmgiCisKKyNpZmRlZiBORUVEX1NUUkVSUk9SX0gKKyNpbmNsdWRlICJzdHJlcnJvci5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPGJsdWV0b290aC9oY2kuaD4KKworI2RlZmluZSBCVF9JRkFDRSAiYmx1ZXRvb3RoIgorI2RlZmluZSBCVF9DVFJMX1NJWkUgMTI4CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgYnRfYWN0aXZhdGUocGNhcF90ICopOworc3RhdGljIGludCBidF9yZWFkX2xpbnV4KHBjYXBfdCAqLCBpbnQgLCBwY2FwX2hhbmRsZXIgLCB1X2NoYXIgKik7CitzdGF0aWMgaW50IGJ0X2luamVjdF9saW51eChwY2FwX3QgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworc3RhdGljIGludCBidF9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworc3RhdGljIGludCBidF9zdGF0c19saW51eChwY2FwX3QgKiwgc3RydWN0IHBjYXBfc3RhdCAqKTsKKworaW50IAorYnRfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycl9zdHIpCit7CisJcGNhcF9pZl90ICpmb3VuZF9kZXYgPSAqYWxsZGV2c3A7CisJc3RydWN0IGhjaV9kZXZfbGlzdF9yZXEgKmRldl9saXN0OworCXN0cnVjdCBoY2lfZGV2X3JlcSAqZGV2X3JlcTsKKwlpbnQgaSwgc29jazsKKwlpbnQgcmV0ID0gMDsKKwkKKwlzb2NrICA9IHNvY2tldChBRl9CTFVFVE9PVEgsIFNPQ0tfUkFXLCBCVFBST1RPX0hDSSk7CisJaWYgKHNvY2sgPCAwKQorCXsKKwkJLyogaWYgYmx1ZXRvb3RoIGlzIG5vdCBzdXBwb3J0ZWQgdGhpcyB0aGlzIGlzIG5vdCBmYXRhbCovIAorCQlpZiAoZXJybm8gPT0gRUFGTk9TVVBQT1JUKQorCQkJcmV0dXJuIDA7CisJCXNucHJpbnRmKGVycl9zdHIsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3Qgb3BlbiByYXcgQmx1ZXRvb3RoIHNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2X2xpc3QgPSBtYWxsb2MoSENJX01BWF9ERVYgKiBzaXplb2YoKmRldl9yZXEpICsgc2l6ZW9mKCpkZXZfbGlzdCkpOworCWlmICghZGV2X2xpc3QpIAorCXsKKwkJc25wcmludGYoZXJyX3N0ciwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGFsbG9jYXRlICV6dSBieXRlcyBmb3IgQmx1ZXRvb3RoIGRldmljZSBsaXN0IiwKKwkJCUhDSV9NQVhfREVWICogc2l6ZW9mKCpkZXZfcmVxKSArIHNpemVvZigqZGV2X2xpc3QpKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkZXZfbGlzdC0+ZGV2X251bSA9IEhDSV9NQVhfREVWOworCisJaWYgKGlvY3RsKHNvY2ssIEhDSUdFVERFVkxJU1QsICh2b2lkICopIGRldl9saXN0KSA8IDApIAorCXsKKwkJc25wcmludGYoZXJyX3N0ciwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCBnZXQgQmx1ZXRvb3RoIGRldmljZSBsaXN0IHZpYSBpb2N0bDogJXMiLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gZnJlZTsKKwl9CisKKwlkZXZfcmVxID0gZGV2X2xpc3QtPmRldl9yZXE7CisJZm9yIChpID0gMDsgaSA8IGRldl9saXN0LT5kZXZfbnVtOyBpKyssIGRldl9yZXErKykgeworCQljaGFyIGRldl9uYW1lWzIwXSwgZGV2X2Rlc2NyWzMwXTsKKwkJCisJCXNucHJpbnRmKGRldl9uYW1lLCAyMCwgQlRfSUZBQ0UiJWQiLCBkZXZfcmVxLT5kZXZfaWQpOworCQlzbnByaW50ZihkZXZfZGVzY3IsIDMwLCAiQmx1ZXRvb3RoIGFkYXB0ZXIgbnVtYmVyICVkIiwgaSk7CisJCQkKKwkJaWYgKHBjYXBfYWRkX2lmKCZmb3VuZF9kZXYsIGRldl9uYW1lLCAwLCAKKwkJICAgICAgIGRldl9kZXNjciwgZXJyX3N0cikgPCAwKQorCQl7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisKKwl9CisKK2ZyZWU6CisJZnJlZShkZXZfbGlzdCk7CisKK2RvbmU6CisJY2xvc2Uoc29jayk7CisJcmV0dXJuIHJldDsKK30KKworcGNhcF90ICoKK2J0X2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpwOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5hY3RpdmF0ZV9vcCA9IGJ0X2FjdGl2YXRlOworCXJldHVybiAocCk7Cit9CisKK3N0YXRpYyBpbnQKK2J0X2FjdGl2YXRlKHBjYXBfdCogaGFuZGxlKQoreworCXN0cnVjdCBzb2NrYWRkcl9oY2kgYWRkcjsKKwlpbnQgb3B0OworCWludAkJZGV2X2lkOworCXN0cnVjdCBoY2lfZmlsdGVyCWZsdDsKKwlpbnQgZXJyID0gUENBUF9FUlJPUjsKKworCS8qIGdldCBidCBpbnRlcmZhY2UgaWQgKi8KKwlpZiAoc3NjYW5mKGhhbmRsZS0+b3B0LnNvdXJjZSwgQlRfSUZBQ0UiJWQiLCAmZGV2X2lkKSAhPSAxKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiQ2FuJ3QgZ2V0IEJsdWV0b290aCBkZXZpY2UgaW5kZXggZnJvbSAlcyIsIAorCQkJIGhhbmRsZS0+b3B0LnNvdXJjZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKwloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90K0JUX0NUUkxfU0laRStzaXplb2YocGNhcF9ibHVldG9vdGhfaDRfaGVhZGVyKTsKKwloYW5kbGUtPm9mZnNldCA9IEJUX0NUUkxfU0laRTsKKwloYW5kbGUtPmxpbmt0eXBlID0gRExUX0JMVUVUT09USF9IQ0lfSDRfV0lUSF9QSERSOworCisJaGFuZGxlLT5yZWFkX29wID0gYnRfcmVhZF9saW51eDsKKwloYW5kbGUtPmluamVjdF9vcCA9IGJ0X2luamVjdF9saW51eDsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07IC8qIG5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IGJ0X3NldGRpcmVjdGlvbl9saW51eDsKKwloYW5kbGUtPnNldF9kYXRhbGlua19vcCA9IE5VTEw7CS8qIGNhbid0IGNoYW5nZSBkYXRhIGxpbmsgdHlwZSAqLworCWhhbmRsZS0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOworCWhhbmRsZS0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOworCWhhbmRsZS0+c3RhdHNfb3AgPSBidF9zdGF0c19saW51eDsKKwloYW5kbGUtPm1kLmlmaW5kZXggPSBkZXZfaWQ7CisJCisJLyogQ3JlYXRlIEhDSSBzb2NrZXQgKi8KKwloYW5kbGUtPmZkID0gc29ja2V0KEFGX0JMVUVUT09USCwgU09DS19SQVcsIEJUUFJPVE9fSENJKTsKKwlpZiAoaGFuZGxlLT5mZCA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3QgY3JlYXRlIHJhdyBzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJaGFuZGxlLT5idWZmZXIgPSBtYWxsb2MoaGFuZGxlLT5idWZzaXplKTsKKwlpZiAoIWhhbmRsZS0+YnVmZmVyKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgZHVtcCBidWZmZXI6ICVzIiwKKwkJCXBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBjbG9zZV9mYWlsOworCX0KKworCW9wdCA9IDE7CisJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX0hDSSwgSENJX0RBVEFfRElSLCAmb3B0LCBzaXplb2Yob3B0KSkgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IGVuYWJsZSBkYXRhIGRpcmVjdGlvbiBpbmZvOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gY2xvc2VfZmFpbDsKKwl9CisKKwlvcHQgPSAxOworCWlmIChzZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9IQ0ksIEhDSV9USU1FX1NUQU1QLCAmb3B0LCBzaXplb2Yob3B0KSkgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IGVuYWJsZSB0aW1lIHN0YW1wOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gY2xvc2VfZmFpbDsKKwl9CisKKwkvKiBTZXR1cCBmaWx0ZXIsIGRvIG5vdCBjYWxsIGhjaSBmdW5jdGlvbiB0byBhdm9pZCBkZXBlbmRlbmNlIG9uIAorCSAqIGV4dGVybmFsIGxpYnMJKi8KKwltZW1zZXQoJmZsdCwgMCwgc2l6ZW9mKGZsdCkpOworCW1lbXNldCgodm9pZCAqKSAmZmx0LnR5cGVfbWFzaywgMHhmZiwgc2l6ZW9mKGZsdC50eXBlX21hc2spKTsJCisJbWVtc2V0KCh2b2lkICopICZmbHQuZXZlbnRfbWFzaywgMHhmZiwgc2l6ZW9mKGZsdC5ldmVudF9tYXNrKSk7CisJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX0hDSSwgSENJX0ZJTFRFUiwgJmZsdCwgc2l6ZW9mKGZsdCkpIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCBzZXQgZmlsdGVyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gY2xvc2VfZmFpbDsKKwl9CisKKworCS8qIEJpbmQgc29ja2V0IHRvIHRoZSBIQ0kgZGV2aWNlICovCisJYWRkci5oY2lfZmFtaWx5ID0gQUZfQkxVRVRPT1RIOworCWFkZHIuaGNpX2RldiA9IGhhbmRsZS0+bWQuaWZpbmRleDsKKwlpZiAoYmluZChoYW5kbGUtPmZkLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCBhdHRhY2ggdG8gZGV2aWNlICVkOiAlcyIsIGhhbmRsZS0+bWQuaWZpbmRleCwKKwkJICAgIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gY2xvc2VfZmFpbDsKKwl9CisKKwlpZiAoaGFuZGxlLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogTW9uaXRvciBtb2RlIGRvZXNuJ3QgYXBwbHkgdG8gQmx1ZXRvb3RoIGRldmljZXMuCisJCSAqLworCQllcnIgPSBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJZ290byBjbG9zZV9mYWlsOworCX0KKworCWlmIChoYW5kbGUtPm9wdC5idWZmZXJfc2l6ZSAhPSAwKSB7CisJCS8qCisJCSAqIFNldCB0aGUgc29ja2V0IGJ1ZmZlciBzaXplIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisJCSAqLworCQlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCisJCSAgICAmaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUsCisJCSAgICBzaXplb2YoaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUpKSA9PSAtMSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICJTT19SQ1ZCVUY6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZ290byBjbG9zZV9mYWlsOworCQl9CisJfQorCisJaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKKwlyZXR1cm4gMDsKKworY2xvc2VfZmFpbDoKKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitidF9yZWFkX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBpb3ZlYyAgaXY7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGg7CisJcGNhcF9ibHVldG9vdGhfaDRfaGVhZGVyKiBidGhkcjsKKworCWJ0aGRyID0gKHBjYXBfYmx1ZXRvb3RoX2g0X2hlYWRlciopICZoYW5kbGUtPmJ1ZmZlcltoYW5kbGUtPm9mZnNldF07CisJaXYuaW92X2Jhc2UgPSAmaGFuZGxlLT5idWZmZXJbaGFuZGxlLT5vZmZzZXQrc2l6ZW9mKHBjYXBfYmx1ZXRvb3RoX2g0X2hlYWRlcildOworCWl2Lmlvdl9sZW4gID0gaGFuZGxlLT5zbmFwc2hvdDsKKwkKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5tc2dfaW92ID0gJml2OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSBoYW5kbGUtPmJ1ZmZlcjsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBoYW5kbGUtPm9mZnNldDsKKworCS8qIGlnbm9yZSBpbnRlcnJ1cHQgc3lzdGVtIGNhbGwgZXJyb3IgKi8KKwlkbyB7CisJCXJldCA9IHJlY3Ztc2coaGFuZGxlLT5mZCwgJm1zZywgMCk7CisJCWlmIChoYW5kbGUtPmJyZWFrX2xvb3ApCisJCXsKKwkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gLTI7CisJCX0KKwl9IHdoaWxlICgocmV0ID09IC0xKSAmJiAoZXJybm8gPT0gRUlOVFIpKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IHJlY2VpdmUgcGFja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwa3RoLmNhcGxlbiA9IHJldDsKKworCS8qIGdldCBkaXJlY3Rpb24gYW5kIHRpbWVzdGFtcCovIAorCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOworCWludCBpbj0wOworCXdoaWxlIChjbXNnKSB7CisJCXN3aXRjaCAoY21zZy0+Y21zZ190eXBlKSB7CisJCQljYXNlIEhDSV9DTVNHX0RJUjoKKwkJCQltZW1jcHkoJmluLCBDTVNHX0RBVEEoY21zZyksIHNpemVvZiBpbik7CisJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgSENJX0NNU0dfVFNUQU1QOgorICAgICAgICAgICAgICAgICAgICAgIAkJbWVtY3B5KCZwa3RoLnRzLCBDTVNHX0RBVEEoY21zZyksCisgICAgICAgICAgICAgICAgICAgICAgCQkgICAgc2l6ZW9mIHBrdGgudHMpOworCQkJCWJyZWFrOworCQl9CisJCWNtc2cgPSBDTVNHX05YVEhEUigmbXNnLCBjbXNnKTsKKwl9CisJaWYgKChpbiAmJiAoaGFuZGxlLT5kaXJlY3Rpb24gPT0gUENBUF9EX09VVCkpIHx8IAorCQkJCSgoIWluKSAmJiAoaGFuZGxlLT5kaXJlY3Rpb24gPT0gUENBUF9EX0lOKSkpCisJCXJldHVybiAwOworCisJYnRoZHItPmRpcmVjdGlvbiA9IGh0b25sKGluICE9IDApOworCXBrdGguY2FwbGVuKz1zaXplb2YocGNhcF9ibHVldG9vdGhfaDRfaGVhZGVyKTsKKwlwa3RoLmxlbiA9IHBrdGguY2FwbGVuOworCWlmIChoYW5kbGUtPmZjb2RlLmJmX2luc25zID09IE5VTEwgfHwKKwkgICAgYnBmX2ZpbHRlcihoYW5kbGUtPmZjb2RlLmJmX2luc25zLCAmaGFuZGxlLT5idWZmZXJbaGFuZGxlLT5vZmZzZXRdLAorCSAgICAgIHBrdGgubGVuLCBwa3RoLmNhcGxlbikpIHsKKwkJY2FsbGJhY2sodXNlciwgJnBrdGgsICZoYW5kbGUtPmJ1ZmZlcltoYW5kbGUtPm9mZnNldF0pOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7CS8qIGRpZG4ndCBwYXNzIGZpbHRlciAqLworfQorCitzdGF0aWMgaW50CitidF9pbmplY3RfbGludXgocGNhcF90ICpoYW5kbGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiAiCisgICAgCQkiYmx1ZXRvb3RoIGRldmljZXMiKTsKKwlyZXR1cm4gKC0xKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCitzdGF0aWMgaW50IAorYnRfc3RhdHNfbGludXgocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBwY2FwX3N0YXQgKnN0YXRzKQoreworCWludCByZXQ7CisJc3RydWN0IGhjaV9kZXZfaW5mbyBkZXZfaW5mbzsKKwlzdHJ1Y3QgaGNpX2Rldl9zdGF0cyAqIHMgPSAmZGV2X2luZm8uc3RhdDsKKwlkZXZfaW5mby5kZXZfaWQgPSBoYW5kbGUtPm1kLmlmaW5kZXg7CisJCisJLyogaWdub3JlIGVpbnRyICovCisJZG8geworCQlyZXQgPSBpb2N0bChoYW5kbGUtPmZkLCBIQ0lHRVRERVZJTkZPLCAodm9pZCAqKSZkZXZfaW5mbyk7CisJfSB3aGlsZSAoKHJldCA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisJICAgIAorCWlmIChyZXQgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IGdldCBzdGF0cyB2aWEgaW9jdGw6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJCQorCX0KKworCS8qIHdlIHJlY2VpdmUgYm90aCByeCBhbmQgdHggZnJhbWVzLCBzbyBjb211bGF0ZSBhbGwgc3RhdHMgKi8JCisJc3RhdHMtPnBzX3JlY3YgPSBzLT5ldnRfcnggKyBzLT5hY2xfcnggKyBzLT5zY29fcnggKyBzLT5jbWRfdHggKyAKKwkJcy0+YWNsX3R4ICtzLT5zY29fdHg7CisJc3RhdHMtPnBzX2Ryb3AgPSBzLT5lcnJfcnggKyBzLT5lcnJfdHg7CisJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgCitidF9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICpwLCBwY2FwX2RpcmVjdGlvbl90IGQpCit7CisJcC0+ZGlyZWN0aW9uID0gZDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1idC1saW51eC5oIGIvbGlicGNhcC0xLjMuMC9wY2FwLWJ0LWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwMTE5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1idC1saW51eC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUGFvbG8gQWJlbmkgKEl0YWx5KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogQmx1ZXRvb3RoIHNuaWZmaW5nIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggcGxhdGZvcm0KKyAqIEJ5IFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtYnQtbGludXguaCx2IDEuNSAyMDA4LTA0LTA0IDE5OjM3OjQ1IGd1eSBFeHAgJCAoTEJMKQorICovCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBCbHVldG9vdGgtcmVsYXRlZCBmdW5jdGlvbnMKKyAqLworaW50IGJ0X3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJfc3RyKTsKK3BjYXBfdCAqYnRfY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1Zik7CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtY2FuLWxpbnV4LmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtY2FuLWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4ZTIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1jYW4tbGludXguYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBGZWxpeCBPYmVuaHViZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBTb2NrZXRDYW4gc25pZmZpbmcgQVBJIGltcGxlbWVudGF0aW9uIGZvciBMaW51eCBwbGF0Zm9ybQorICogQnkgRmVsaXggT2Jlbmh1YmVyIDxmZWxpeEBvYmVuaHViZXIuZGU+CisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAicGNhcC1jYW4tbGludXguaCIKKworI2lmZGVmIE5FRURfU1RSRVJST1JfSAorI2luY2x1ZGUgInN0cmVycm9yLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9jYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vcmF3Lmg+CisKKy8qIG5vdCB5ZXQgZGVmaW5lZCBhbnl3aGVyZSAqLworI2lmbmRlZiBQRl9DQU4KKyNkZWZpbmUgUEZfQ0FOIDI5CisjZW5kaWYKKyNpZm5kZWYgQUZfQ0FOCisjZGVmaW5lIEFGX0NBTiBQRl9DQU4KKyNlbmRpZgorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdGF0aWMgaW50IGNhbl9hY3RpdmF0ZShwY2FwX3QgKik7CitzdGF0aWMgaW50IGNhbl9yZWFkX2xpbnV4KHBjYXBfdCAqLCBpbnQgLCBwY2FwX2hhbmRsZXIgLCB1X2NoYXIgKik7CitzdGF0aWMgaW50IGNhbl9pbmplY3RfbGludXgocGNhcF90ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgY2FuX3NldGZpbHRlcl9saW51eChwY2FwX3QgKiwgc3RydWN0IGJwZl9wcm9ncmFtICopOworc3RhdGljIGludCBjYW5fc2V0ZGlyZWN0aW9uX2xpbnV4KHBjYXBfdCAqLCBwY2FwX2RpcmVjdGlvbl90KTsKK3N0YXRpYyBpbnQgY2FuX3N0YXRzX2xpbnV4KHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9zdGF0ICopOworCitwY2FwX3QgKgorY2FuX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90KiBwOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5hY3RpdmF0ZV9vcCA9IGNhbl9hY3RpdmF0ZTsKKwlyZXR1cm4gKHApOworfQorCisKK3N0YXRpYyBpbnQKK2Nhbl9hY3RpdmF0ZShwY2FwX3QqIGhhbmRsZSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfY2FuIGFkZHI7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCS8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKwloYW5kbGUtPmJ1ZnNpemUgPSAyNDsKKwloYW5kbGUtPm9mZnNldCA9IDg7CisJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9DQU5fU09DS0VUQ0FOOworCWhhbmRsZS0+cmVhZF9vcCA9IGNhbl9yZWFkX2xpbnV4OworCWhhbmRsZS0+aW5qZWN0X29wID0gY2FuX2luamVjdF9saW51eDsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IGNhbl9zZXRmaWx0ZXJfbGludXg7CisJaGFuZGxlLT5zZXRkaXJlY3Rpb25fb3AgPSBjYW5fc2V0ZGlyZWN0aW9uX2xpbnV4OworCWhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsKKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnN0YXRzX29wID0gY2FuX3N0YXRzX2xpbnV4OworCisJLyogQ3JlYXRlIHNvY2tldCAqLworCWhhbmRsZS0+ZmQgPSBzb2NrZXQoUEZfQ0FOLCBTT0NLX1JBVywgQ0FOX1JBVyk7CisJaWYgKGhhbmRsZS0+ZmQgPCAwKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBjcmVhdGUgcmF3IHNvY2tldCAlZDolcyIsCisJCQllcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJLyogZ2V0IGludGVyZmFjZSBpbmRleCAqLworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RybmNweShpZnIuaWZyX25hbWUsIGhhbmRsZS0+b3B0LnNvdXJjZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR0lGSU5ERVgsICZpZnIpIDwgMCkKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSJVbmFibGUgdG8gZ2V0IGludGVyZmFjZSBpbmRleDogJXMiLAorCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCWhhbmRsZS0+bWQuaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKworCS8qIGFsbG9jYXRlIGJ1dHRlciAqLworCWhhbmRsZS0+YnVmZmVyID0gbWFsbG9jKGhhbmRsZS0+YnVmc2l6ZSk7CisJaWYgKCFoYW5kbGUtPmJ1ZmZlcikKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgZHVtcCBidWZmZXI6ICVzIiwKKwkJCXBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qIEJpbmQgdG8gdGhlIHNvY2tldCAqLworCWFkZHIuY2FuX2ZhbWlseSA9IEFGX0NBTjsKKwlhZGRyLmNhbl9pZmluZGV4ID0gaGFuZGxlLT5tZC5pZmluZGV4OworCWlmKCBiaW5kKCBoYW5kbGUtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpICkgPCAwICApCisJeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGF0dGFjaCB0byBkZXZpY2UgJWQgJWQ6JXMiLAorCQkJaGFuZGxlLT5tZC5pZmluZGV4LCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCWlmIChoYW5kbGUtPm9wdC5yZm1vbikKKwl7CisJCS8qIE1vbml0b3IgbW9kZSBkb2Vzbid0IGFwcGx5IHRvIENBTiBkZXZpY2VzLiAqLworCQlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKKwlyZXR1cm4gMDsKKworfQorCisKK3N0YXRpYyBpbnQKK2Nhbl9yZWFkX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBwY2FwX3BrdGhkciBwa3RoOworCXN0cnVjdCBpb3ZlYyBpdjsKKwlzdHJ1Y3QgY2FuX2ZyYW1lKiBjZjsKKworCWl2Lmlvdl9iYXNlID0gJmhhbmRsZS0+YnVmZmVyW2hhbmRsZS0+b2Zmc2V0XTsKKwlpdi5pb3ZfbGVuID0gaGFuZGxlLT5zbmFwc2hvdDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLm1zZ19pb3YgPSAmaXY7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfY29udHJvbCA9IGhhbmRsZS0+YnVmZmVyOworCW1zZy5tc2dfY29udHJvbGxlbiA9IGhhbmRsZS0+b2Zmc2V0OworCisJZG8KKwl7CisJCXBrdGguY2FwbGVuID0gcmVjdm1zZyhoYW5kbGUtPmZkLCAmbXNnLCAwKTsKKwkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkKKwkJeworCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKKwkJCXJldHVybiAtMjsKKwkJfQorCX0gd2hpbGUgKChwa3RoLmNhcGxlbiA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisKKwlpZiAocGt0aC5jYXBsZW4gPCAwKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCByZWNlaXZlIHBhY2tldCAlZDolcyIsCisJCQllcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGFkanVzdCBjYXB0dXJlIGxlbiBhY2NvcmRpbmcgdG8gZnJhbWUgbGVuICovCisJY2YgPSAoc3RydWN0IGNhbl9mcmFtZSopJmhhbmRsZS0+YnVmZmVyWzhdOworCXBrdGguY2FwbGVuIC09IDggLSBjZi0+Y2FuX2RsYzsKKwlwa3RoLmxlbiA9IHBrdGguY2FwbGVuOworCisJY2YtPmNhbl9pZCA9IGh0b25sKCBjZi0+Y2FuX2lkICk7CisKKwlpZiggLTEgPT0gZ2V0dGltZW9mZGF5KCZwa3RoLnRzLCBOVUxMKSApCisJeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGdldCB0aW1lIG9mIGRheSAlZDolcyIsCisJCQllcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNhbGxiYWNrKHVzZXIsICZwa3RoLCAmaGFuZGxlLT5idWZmZXJbOF0pOworCisJcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludAorY2FuX2luamVjdF9saW51eChwY2FwX3QgKmhhbmRsZSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwkvKiBub3QgeWV0IGltcGxlbWVudGVkICovCisJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiAiCisJCSJjYW4gZGV2aWNlcyIpOworCXJldHVybiAoLTEpOworfQorCisKK3N0YXRpYyBpbnQKK2Nhbl9zdGF0c19saW51eChwY2FwX3QgKmhhbmRsZSwgc3RydWN0IHBjYXBfc3RhdCAqc3RhdHMpCit7CisJLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLworCXN0YXRzLT5wc19yZWN2ID0gMDsJCQkgLyogbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwlzdGF0cy0+cHNfZHJvcCA9IDA7CQkJIC8qIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgKi8KKwlzdGF0cy0+cHNfaWZkcm9wID0gMDsJCSAvKiBkcm9wcyBieSBpbnRlcmZhY2UgLS0gb25seSBzdXBwb3J0ZWQgb24gc29tZSBwbGF0Zm9ybXMgKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitjYW5fc2V0ZmlsdGVyX2xpbnV4KHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCkKK3sKKwkvKiBub3QgeWV0IGltcGxlbWVudGVkICovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorY2FuX3NldGRpcmVjdGlvbl9saW51eChwY2FwX3QgKnAsIHBjYXBfZGlyZWN0aW9uX3QgZCkKK3sKKwkvKiBubyBzdXBwb3J0IGZvciBQQ0FQX0RfT1VUICovCisJaWYgKGQgPT0gUENBUF9EX09VVCkKKwl7CisJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkiU2V0dGluZyBkaXJlY3Rpb24gdG8gUENBUF9EX09VVCBpcyBub3Qgc3VwcG9ydGVkIG9uIGNhbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcC0+ZGlyZWN0aW9uID0gZDsKKworCXJldHVybiAwOworfQorCisKKy8qIGVvZiAqLwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLWNhbi1saW51eC5oIGIvbGlicGNhcC0xLjMuMC9wY2FwLWNhbi1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOGYzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtY2FuLWxpbnV4LmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBGZWxpeCBPYmVuaHViZXIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIFNvY2tldENBTiByZWxhdGVkIGZ1bmN0aW9ucworICovCitwY2FwX3QqIGNhbl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKTsKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1jYW51c2ItbGludXguYyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1jYW51c2ItbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJmZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLWNhbnVzYi1saW51eC5jCkBAIC0wLDAgKzEsNDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEZlbGl4IE9iZW5odWJlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFNvY2tldHRyYWNlIHNuaWZmaW5nIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggcGxhdGZvcm0KKyAqIEJ5IEZlbGl4IE9iZW5odWJlciA8ZmVsaXhAb2Jlbmh1YmVyLmRlPgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxsaWJ1c2ItMS4wL2xpYnVzYi5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyNkZWZpbmUgQ0FOVVNCX0lGQUNFICJjYW51c2IiCisKKyNkZWZpbmUgQ0FOVVNCX1ZJRCAweDA0MDMKKyNkZWZpbmUgQ0FOVVNCX1BJRCAweDg5OTAKKworI2RlZmluZSBVU0VfVEhSRUFEIDEKKworI2lmIFVTRV9USFJFQUQgPT0gMAorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCisKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIGludCBjYW51c2JfYWN0aXZhdGUocGNhcF90ICopOworc3RhdGljIGludCBjYW51c2JfcmVhZF9saW51eChwY2FwX3QgKiwgaW50ICwgcGNhcF9oYW5kbGVyICwgdV9jaGFyICopOworc3RhdGljIGludCBjYW51c2JfaW5qZWN0X2xpbnV4KHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitzdGF0aWMgaW50IGNhbnVzYl9zZXRmaWx0ZXJfbGludXgocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK3N0YXRpYyBpbnQgY2FudXNiX3NldGRpcmVjdGlvbl9saW51eChwY2FwX3QgKiwgcGNhcF9kaXJlY3Rpb25fdCk7CitzdGF0aWMgaW50IGNhbnVzYl9zdGF0c19saW51eChwY2FwX3QgKiwgc3RydWN0IHBjYXBfc3RhdCAqKTsKKworc3RydWN0IENBTl9Nc2cKK3sKKyAgICB1aW50MzJfdCB0aW1lc3RhbXA7CisgICAgdWludDMyX3QgaWQ7CisgICAgdWludDMyX3QgbGVuZ3RoOworICAgIHVpbnQ4X3QgZGF0YVs4XTsKK307CisKK3N0cnVjdCBjYW51c2JfdAoreworICBsaWJ1c2JfY29udGV4dCAqY3R4OworICBsaWJ1c2JfZGV2aWNlX2hhbmRsZSAqZGV2OworICBjaGFyKiBzcmM7CisgIHB0aHJlYWRfdCB3b3JrZXI7CisgIGludCByZHBpcGUsIHdycGlwZTsKKyAgdm9sYXRpbGUgaW50KiBsb29wOworfTsKKworc3RhdGljIHN0cnVjdCBjYW51c2JfdCBjYW51c2I7CitzdGF0aWMgdm9sYXRpbGUgaW50IGxvb3A7CisKKworCitpbnQgY2FudXNiX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJfc3RyKQoreworICAgIGxpYnVzYl9jb250ZXh0ICpmZGN0eDsKKyAgICBsaWJ1c2JfZGV2aWNlKiogZGV2czsKKyAgICB1bnNpZ25lZCBjaGFyIHNlcm51bVs2NV07CisgICAgdW5zaWduZWQgY2hhciBidWZbOTZdOworICAgIGludCBjbnQsIGk7CisgICAgCisgICAgbGlidXNiX2luaXQoJmZkY3R4KTsKKyAgICAgICAgCisgICAgY250ID0gbGlidXNiX2dldF9kZXZpY2VfbGlzdChmZGN0eCwmZGV2cyk7CisKKyAgICBmb3IoaT0wO2k8Y250O2krKykKKyAgICB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGV2aWNlIGlzIGludGVyZXN0aW5nLgorICAgICAgICBzdHJ1Y3QgbGlidXNiX2RldmljZV9kZXNjcmlwdG9yIGRlc2M7CisgICAgICAgIGxpYnVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IoZGV2c1tpXSwmZGVzYyk7CisKKyAgICAgICAgaWYgKChkZXNjLmlkVmVuZG9yICE9IENBTlVTQl9WSUQpIHx8IChkZXNjLmlkUHJvZHVjdCAhPSBDQU5VU0JfUElEKSkgCisgICAgICAgICAgY29udGludWU7IC8vSXQgaXMgbm90LCBjaGVjayBuZXh0IGRldmljZQorICAgICAgICAgIAorICAgICAgICAvL0l0IGlzIQorICAgICAgICBsaWJ1c2JfZGV2aWNlX2hhbmRsZSAqZGggPSBOVUxMOworCisgICAgICAgIGlmIChyZXQgPSBsaWJ1c2Jfb3BlbihkZXZzW2ldLCZkaCkgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIAljaGFyIGRldl9uYW1lWzMwXTsKKwkgICAgICAgICAgY2hhciBkZXZfZGVzY3JbNTBdOyAKKyAgICAgICAgICAgIGludCBuID0gbGlidXNiX2dldF9zdHJpbmdfZGVzY3JpcHRvcl9hc2NpaShkaCxkZXNjLmlTZXJpYWxOdW1iZXIsc2VybnVtLDY0KTsKKyAgICAgICAgICAgIHNlcm51bVtuXSA9IDA7CisKKyAgICAgICAgICAJc25wcmludGYoZGV2X25hbWUsIDMwLCBDQU5VU0JfSUZBQ0UiJXMiLCBzZXJudW0pOworICAgICAgICAgIAlzbnByaW50ZihkZXZfZGVzY3IsIDUwLCAiQ2FuVVNCIFslc10iLCBzZXJudW0pOworICAgICAgICAgICAgCisgICAgICAgICAgICBsaWJ1c2JfY2xvc2UoZGgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAocGNhcF9hZGRfaWYoYWxsZGV2c3AsIGRldl9uYW1lLCAwLCBkZXZfZGVzY3IsIGVycl9zdHIpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbGlidXNiX2ZyZWVfZGV2aWNlX2xpc3QoZGV2cywxKTsKKyAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbGlidXNiX2ZyZWVfZGV2aWNlX2xpc3QoZGV2cywxKTsKKyAgICBsaWJ1c2JfZXhpdChmZGN0eCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsaWJ1c2JfZGV2aWNlX2hhbmRsZSogY2FudXNiX29wZW5kZXZpY2Uoc3RydWN0IGxpYnVzYl9jb250ZXh0ICpjdHgsIGNoYXIqIGRldnNlcmlhbCkKK3sKKyAgICBsaWJ1c2JfZGV2aWNlX2hhbmRsZSogZGg7CisgICAgbGlidXNiX2RldmljZSoqIGRldnM7CisgICAgdW5zaWduZWQgY2hhciBzZXJpYWxbNjVdOworICAgIGludCBjbnQsaSxuOworICAgIAorICAgIGNudCA9IGxpYnVzYl9nZXRfZGV2aWNlX2xpc3QoY3R4LCZkZXZzKTsKKworICAgIGZvcihpPTA7aTxjbnQ7aSsrKQorICAgIHsgICAgCisgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZGV2aWNlIGlzIGludGVyZXN0aW5nLgorICAgICAgICBzdHJ1Y3QgbGlidXNiX2RldmljZV9kZXNjcmlwdG9yIGRlc2M7CisgICAgICAgIGxpYnVzYl9nZXRfZGV2aWNlX2Rlc2NyaXB0b3IoZGV2c1tpXSwmZGVzYyk7CisKKyAgICAgICAgaWYgKChkZXNjLmlkVmVuZG9yICE9IENBTlVTQl9WSUQpIHx8IChkZXNjLmlkUHJvZHVjdCAhPSBDQU5VU0JfUElEKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAKKyAgICAgICAgLy9Gb3VuZCBvbmUhCisgICAgICAgIGxpYnVzYl9kZXZpY2VfaGFuZGxlICpkaCA9IE5VTEw7CisKKyAgICAgICAgaWYgKGxpYnVzYl9vcGVuKGRldnNbaV0sJmRoKSAhPSAwKSBjb250aW51ZTsKKworICAgICAgICBuID0gbGlidXNiX2dldF9zdHJpbmdfZGVzY3JpcHRvcl9hc2NpaShkaCxkZXNjLmlTZXJpYWxOdW1iZXIsc2VyaWFsLDY0KTsKKyAgICAgICAgc2VyaWFsW25dID0gMDsKKworICAgICAgICBpZiAoKGRldnNlcmlhbCkgJiYgKHN0cmNtcChzZXJpYWwsZGV2c2VyaWFsKSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbGlidXNiX2Nsb3NlKGRoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChsaWJ1c2Jfa2VybmVsX2RyaXZlcl9hY3RpdmUoZGgsMCkpICYmIChsaWJ1c2JfZGV0YWNoX2tlcm5lbF9kcml2ZXIoZGgsMCkgIT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxpYnVzYl9jbG9zZShkaCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsaWJ1c2Jfc2V0X2NvbmZpZ3VyYXRpb24oZGgsMSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGlidXNiX2Nsb3NlKGRoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxpYnVzYl9jbGFpbV9pbnRlcmZhY2UoZGgsMCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGlidXNiX2Nsb3NlKGRoKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvL0ZvdW50IGl0IQorICAgICAgICBsaWJ1c2JfZnJlZV9kZXZpY2VfbGlzdChkZXZzLDEpOyAgICAgICAgCisgICAgICAgIHJldHVybiBkaDsKKyAgICB9CisKKyAgICBsaWJ1c2JfZnJlZV9kZXZpY2VfbGlzdChkZXZzLDEpOworICAgIHJldHVybiBOVUxMOworfQorCisKK3BjYXBfdCAqCitjYW51c2JfY3JlYXRlKGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3sgCisgIHBjYXBfdCogcDsKKyAgCQkKKyAgbGlidXNiX2luaXQoJmNhbnVzYi5jdHgpOworICAKKwlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Zik7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwkJCisgIG1lbXNldCgmY2FudXNiLCAweDAwLCBzaXplb2YoY2FudXNiKSk7CisJCQorCQorCXAtPmFjdGl2YXRlX29wID0gY2FudXNiX2FjdGl2YXRlOworCQorCWNhbnVzYi5zcmMgPSBzdHJkdXAocC0+b3B0LnNvdXJjZSk7CisJcmV0dXJuIChwKTsKK30KKworCitzdGF0aWMgdm9pZCogY2FudXNiX2NhcHR1cmVfdGhyZWFkKHN0cnVjdCBjYW51c2JfdCAqY2FudXNiKQoreworICBzdHJ1Y3QgbGlidXNiX2NvbnRleHQgKmN0eDsKKyAgbGlidXNiX2RldmljZV9oYW5kbGUgKmRldjsKKworICBpbnQgaSwgbjsgIAorICBzdHJ1Y3QgCisgIHsKKyAgICB1aW50OF90IHJ4c3osIHR4c3o7CisgIH0gc3RhdHVzOworICAKKyAgbGlidXNiX2luaXQoJmN0eCk7CisgIAorICBjaGFyICpzZXJpYWwgPSBjYW51c2ItPnNyYyArIHN0cmxlbihDQU5VU0JfSUZBQ0UpOyAgCisgIGRldiA9IGNhbnVzYl9vcGVuZGV2aWNlKGN0eCwgc2VyaWFsKTsKKyAgCisgIGZjbnRsKGNhbnVzYi0+d3JwaXBlLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsgIAorCisgIHdoaWxlKCpjYW51c2ItPmxvb3ApCisgIHsKKyAgICBpbnQgc3osIHJldDsKKyAgICBzdHJ1Y3QgQ0FOX01zZyBtc2c7CisgICAgCisgICAgbGlidXNiX2ludGVycnVwdF90cmFuc2ZlcihkZXYsIDB4ODEsICh1bnNpZ25lZCBjaGFyKikmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSwgJnN6LCAxMDApOworICAgIC8vSEFDSyEhISEhIC0+IGRyb3AgYnVmZmVyZWQgZGF0YSwgcmVhZCBuZXcgb25lIGJ5IHJlYWRpbmcgdHdpY2UuICAgICAgICAKKyAgICByZXQgPSBsaWJ1c2JfaW50ZXJydXB0X3RyYW5zZmVyKGRldiwgMHg4MSwgKHVuc2lnbmVkIGNoYXIqKSZzdGF0dXMsIHNpemVvZihzdGF0dXMpLCAmc3osIDEwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIGZvcihpID0gMDsgaTxzdGF0dXMucnhzejsgaSsrKQorICAgIHsKKyAgICAgIGxpYnVzYl9idWxrX3RyYW5zZmVyKGRldiwgMHg4NSwgKHVuc2lnbmVkIGNoYXIqKSZtc2csIHNpemVvZihtc2cpLCAmc3osIDEwMCk7ICAgICAgCisgICAgICBuID0gd3JpdGUoY2FudXNiLT53cnBpcGUsICZtc2csIHNpemVvZihtc2cpKTsKKyAgICB9CisKKyAgfQorICAKKyAgbGlidXNiX2Nsb3NlKGRldik7CisgIGxpYnVzYl9leGl0KGN0eCk7CisgIAorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjYW51c2Jfc3RhcnRjYXB0dXJlKHN0cnVjdCBjYW51c2JfdCogdGhpcykKK3sKKyAgaW50IHBpcGVmZFsyXTsKKworICBpZiAocGlwZShwaXBlZmQpID09IC0xKSByZXR1cm4gLTE7CisKKyAgY2FudXNiLnJkcGlwZSA9IHBpcGVmZFswXTsKKyAgY2FudXNiLndycGlwZSA9IHBpcGVmZFsxXTsKKyAgY2FudXNiLmxvb3AgPSAmbG9vcDsKKworICBsb29wID0gMTsgIAorICBwdGhyZWFkX2NyZWF0ZSgmdGhpcy0+d29ya2VyLCBOVUxMLCBjYW51c2JfY2FwdHVyZV90aHJlYWQsICZjYW51c2IpOworCisgIHJldHVybiBjYW51c2IucmRwaXBlOworfQorCitzdGF0aWMgdm9pZCBjYW51c2JfY2xlYXJidWZzKHN0cnVjdCBjYW51c2JfdCogdGhpcykKK3sKKyAgICAgICAgdW5zaWduZWQgY2hhciBjbWRbMTZdOworICAgICAgICBpbnQgYWw7CisKKyAgICAgICAgY21kWzBdID0gMTsgIC8vRW1wdHkgaW5jb21pbmcgYnVmZmVyCisgICAgICAgIGNtZFsxXSA9IDE7ICAvL0VtcHR5IG91dGdvaW5nIGJ1ZmZlcgorICAgICAgICBjbWRbM10gPSAwOyAgLy9Ob3QgYSB3cml0ZSB0byBzZXJpYWwgbnVtYmVyCisgICAgICAgIG1lbXNldCgmY21kWzRdLDAsMTYtNCk7CisgICAgICAgIAorICAgICAgICBsaWJ1c2JfaW50ZXJydXB0X3RyYW5zZmVyKHRoaXMtPmRldiwgMHgxLGNtZCwxNiwmYWwsMTAwKTsKK30KKworCitzdGF0aWMgdm9pZCBjYW51c2JfY2xvc2UocGNhcF90KiBoYW5kbGUpCit7CisgIGxvb3AgPSAwOworICBwdGhyZWFkX2pvaW4oY2FudXNiLndvcmtlciwgTlVMTCk7CisKKyAgaWYgKGNhbnVzYi5kZXYpCisgIHsKKyAgICBsaWJ1c2JfY2xvc2UoY2FudXNiLmRldik7CisgICAgY2FudXNiLmRldiA9IE5VTEw7ICAgIAorICB9ICAgIAorfQorCisKKworc3RhdGljIGludCBjYW51c2JfYWN0aXZhdGUocGNhcF90KiBoYW5kbGUpCit7CisJaGFuZGxlLT5yZWFkX29wID0gY2FudXNiX3JlYWRfbGludXg7CisKKwloYW5kbGUtPmluamVjdF9vcCA9IGNhbnVzYl9pbmplY3RfbGludXg7CisJaGFuZGxlLT5zZXRmaWx0ZXJfb3AgPSBjYW51c2Jfc2V0ZmlsdGVyX2xpbnV4OworCWhhbmRsZS0+c2V0ZGlyZWN0aW9uX29wID0gY2FudXNiX3NldGRpcmVjdGlvbl9saW51eDsKKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnN0YXRzX29wID0gY2FudXNiX3N0YXRzX2xpbnV4OworCWhhbmRsZS0+Y2xlYW51cF9vcCA9IGNhbnVzYl9jbG9zZTsKKworCS8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKwloYW5kbGUtPmJ1ZnNpemUgPSAzMjsKKwloYW5kbGUtPm9mZnNldCA9IDg7CisJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9DQU5fU09DS0VUQ0FOOworCWhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsKKworICBjaGFyKiBzZXJpYWwgPSBoYW5kbGUtPm9wdC5zb3VyY2UgKyBzdHJsZW4oImNhbnVzYiIpOworCisgIGNhbnVzYi5kZXYgPSBjYW51c2Jfb3BlbmRldmljZShjYW51c2IuY3R4LHNlcmlhbCk7CisgIGlmICghY2FudXNiLmRldikKKyAgeworICAJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBvcGVuIFVTQiBEZXZpY2U6Iik7ICAKKyAgIAlyZXR1cm4gUENBUF9FUlJPUjsKKyAJfQorCisgIGNhbnVzYl9jbGVhcmJ1ZnMoJmNhbnVzYik7CisKKyAgaGFuZGxlLT5mZCA9IGNhbnVzYl9zdGFydGNhcHR1cmUoJmNhbnVzYik7CisJaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKKwkJCQorCXJldHVybiAwOworfQorCisKKworCitzdGF0aWMgaW50CitjYW51c2JfcmVhZF9saW51eChwY2FwX3QgKmhhbmRsZSwgaW50IG1heF9wYWNrZXRzLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKyAgc3RhdGljIHN0cnVjdCB0aW1ldmFsIGZpcnN0cGFja2V0ID0geyAtMSwgLTF9OworICAKKyAgaW50IG1zZ3NlbnQgPSAwOworICBpbnQgaSA9IDA7CisgIHN0cnVjdCBDQU5fTXNnIG1zZzsKKwlzdHJ1Y3QgcGNhcF9wa3RoZHIgcGt0aDsKKyAgCisgIHdoaWxlKGkgPCBtYXhfcGFja2V0cykKKyAgeworICAgIHVzbGVlcCgxMCAqIDEwMDApOworICAgIGludCBuID0gcmVhZChoYW5kbGUtPmZkLCAmbXNnLCBzaXplb2YobXNnKSk7CisgICAgaWYgKG4gPD0gMCkgYnJlYWs7CisgICAgcGt0aC5jYXBsZW4gPSBwa3RoLmxlbiA9IG47CisgICAgcGt0aC5jYXBsZW4gLT0gNDsKKyAgICBwa3RoLmNhcGxlbiAtPSA4IC0gbXNnLmxlbmd0aDsKKyAgICAKKyAgICBpZiAoKGZpcnN0cGFja2V0LnR2X3NlYyA9PSAtMSkgJiYgKGZpcnN0cGFja2V0LnR2X3VzZWMgPT0gLTEpKQorICAgICAgZ2V0dGltZW9mZGF5KCZmaXJzdHBhY2tldCwgTlVMTCk7CisgICAgICAKKyAgICBwa3RoLnRzLnR2X3VzZWMgPSBmaXJzdHBhY2tldC50dl91c2VjICsgKG1zZy50aW1lc3RhbXAgJSAxMDApICogMTAwMDA7CisgICAgcGt0aC50cy50dl9zZWMgPSBmaXJzdHBhY2tldC50dl91c2VjICsgKG1zZy50aW1lc3RhbXAgLyAxMDApOworICAgIGlmIChwa3RoLnRzLnR2X3VzZWMgPiAxMDAwMDAwKQorICAgIHsKKyAgICAgIHBrdGgudHMudHZfdXNlYyAtPSAxMDAwMDAwOworICAgICAgcGt0aC50cy50dl9zZWMrKzsKKyAgICB9CisKKyAgICBjYWxsYmFjayh1c2VyLCAmcGt0aCwgKHZvaWQqKSZtc2cuaWQpOworICAgIGkrKzsKKyAgfQorICAKKyAgcmV0dXJuIGk7Cit9CisKKworc3RhdGljIGludAorY2FudXNiX2luamVjdF9saW51eChwY2FwX3QgKmhhbmRsZSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwkvKiBub3QgeWV0IGltcGxlbWVudGVkICovCisJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiBjYW51c2IgZGV2aWNlcyIpOworCXJldHVybiAoLTEpOworfQorCisKK3N0YXRpYyBpbnQKK2NhbnVzYl9zdGF0c19saW51eChwY2FwX3QgKmhhbmRsZSwgc3RydWN0IHBjYXBfc3RhdCAqc3RhdHMpCit7CisJLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLworCXN0YXRzLT5wc19yZWN2ID0gMDsJCQkgLyogbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwlzdGF0cy0+cHNfZHJvcCA9IDA7CQkJIC8qIG51bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgKi8KKwlzdGF0cy0+cHNfaWZkcm9wID0gMDsJCSAvKiBkcm9wcyBieSBpbnRlcmZhY2UgLS0gb25seSBzdXBwb3J0ZWQgb24gc29tZSBwbGF0Zm9ybXMgKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitjYW51c2Jfc2V0ZmlsdGVyX2xpbnV4KHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCkKK3sKKwkvKiBub3QgeWV0IGltcGxlbWVudGVkICovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorY2FudXNiX3NldGRpcmVjdGlvbl9saW51eChwY2FwX3QgKnAsIHBjYXBfZGlyZWN0aW9uX3QgZCkKK3sKKwkvKiBubyBzdXBwb3J0IGZvciBQQ0FQX0RfT1VUICovCisJaWYgKGQgPT0gUENBUF9EX09VVCkKKwl7CisJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkiU2V0dGluZyBkaXJlY3Rpb24gdG8gUENBUF9EX09VVCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgaW50ZXJmYWNlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwLT5kaXJlY3Rpb24gPSBkOworCisJcmV0dXJuIDA7Cit9CisKKworLyogZW9mICovCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtY2FudXNiLWxpbnV4LmggYi9saWJwY2FwLTEuMy4wL3BjYXAtY2FudXNiLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzMDUzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1jYW51c2ItbGludXguaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IEZlbGl4IE9iZW5odWJlcgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvKgorICogUHJvdG90eXBlcyBmb3IgU29ja2V0Q0FOIHJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KK3BjYXBfdCogY2FudXNiX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOworaW50IGNhbnVzYl9saXN0ZGV2aWNlcyhwY2FwX2lmX3QgKipwZGV2bGlzdCwgY2hhciogZXJyYnVmKTsKKwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLWNvbW1vbi5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLWNvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2Y4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtY29tbW9uLmMKQEAgLTAsMCArMSwxMTU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogcGNhcC1jb21tb24uYyAtIGNvbW1vbiBjb2RlIGZvciBwY2FwIGFuZCBwY2FwLW5nIGZpbGVzCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgInBjYXAvdXNiLmgiCisKKyNpbmNsdWRlICJwY2FwLWNvbW1vbi5oIgorCisvKgorICogV2UgZG9uJ3Qgd3JpdGUgRExUXyogdmFsdWVzIHRvIGNhcHR1cmUgZmlsZXMsIGJlY2F1c2UgdGhleSdyZSBub3QgdGhlCisgKiBzYW1lIG9uIGFsbCBwbGF0Zm9ybXMuCisgKgorICogVW5mb3J0dW5hdGVseSwgdGhlIHZhcmlvdXMgZmxhdm9ycyBvZiBCU0QgaGF2ZSBub3QgYWx3YXlzIHVzZWQgdGhlIHNhbWUKKyAqIG51bWVyaWNhbCB2YWx1ZXMgZm9yIHRoZSBzYW1lIGRhdGEgdHlwZXMsIGFuZCB2YXJpb3VzIHBhdGNoZXMgdG8KKyAqIGxpYnBjYXAgZm9yIG5vbi1CU0QgT1NlcyBoYXZlIGFkZGVkIHRoZWlyIG93biBETFRfKiBjb2RlcyBmb3IgbGluaworICogbGF5ZXIgZW5jYXBzdWxhdGlvbiB0eXBlcyBzZWVuIG9uIHRob3NlIE9TZXMsIGFuZCB0aG9zZSBjb2RlcyBoYXZlIGhhZCwKKyAqIGluIHNvbWUgY2FzZXMsIHZhbHVlcyB0aGF0IHdlcmUgYWxzbyB1c2VkLCBvbiBvdGhlciBwbGF0Zm9ybXMsIGZvciBvdGhlcgorICogbGluayBsYXllciBlbmNhcHN1bGF0aW9uIHR5cGVzLgorICoKKyAqIFRoaXMgbWVhbnMgdGhhdCBjYXB0dXJlIGZpbGVzIG9mIGEgdHlwZSB3aG9zZSBudW1lcmljYWwgRExUXyogY29kZQorICogbWVhbnMgZGlmZmVyZW50IHRoaW5ncyBvbiBkaWZmZXJlbnQgQlNEcywgb3Igd2l0aCBkaWZmZXJlbnQgdmVyc2lvbnMKKyAqIG9mIGxpYnBjYXAsIGNhbid0IGFsd2F5cyBiZSByZWFkIG9uIHN5c3RlbXMgb3RoZXIgdGhhbiB0aG9zZSBsaWtlCisgKiB0aGUgb25lIHJ1bm5pbmcgb24gdGhlIG1hY2hpbmUgb24gd2hpY2ggdGhlIGNhcHR1cmUgd2FzIG1hZGUuCisgKgorICogSW5zdGVhZCwgd2UgZGVmaW5lIGhlcmUgYSBzZXQgb2YgTElOS1RZUEVfKiBjb2RlcywgYW5kIG1hcCBETFRfKiBjb2RlcworICogdG8gTElOS1RZUEVfKiBjb2RlcyB3aGVuIHdyaXRpbmcgYSBzYXZlZmlsZSBoZWFkZXIsIGFuZCBtYXAgTElOS1RZUEVfKgorICogY29kZXMgdG8gRExUXyogY29kZXMgd2hlbiByZWFkaW5nIGEgc2F2ZWZpbGUgaGVhZGVyLgorICoKKyAqIEZvciB0aG9zZSBETFRfKiBjb2RlcyB0aGF0IGhhdmUsIGFzIGZhciBhcyB3ZSBrbm93LCB0aGUgc2FtZSB2YWx1ZXMgb24KKyAqIGFsbCBwbGF0Zm9ybXMgKERMVF9OVUxMIHRocm91Z2ggRExUX0ZEREkpLCB3ZSBkZWZpbmUgTElOS1RZUEVfeHh4IGFzCisgKiBETFRfeHh4OyB0aGF0IHdheSwgY2FwdHVyZXMgb2YgdGhvc2UgdHlwZXMgY2FuIHN0aWxsIGJlIHJlYWQgYnkKKyAqIHZlcnNpb25zIG9mIGxpYnBjYXAgdGhhdCBtYXAgTElOS1RZUEVfKiB2YWx1ZXMgdG8gRExUXyogdmFsdWVzLCBhbmQKKyAqIGNhcHR1cmVzIG9mIHRob3NlIHR5cGVzIHdyaXR0ZW4gYnkgdmVyc2lvbnMgb2YgbGlicGNhcCB0aGF0IG1hcCBETFRfCisgKiB2YWx1ZXMgdG8gTElOS1RZUEVfIHZhbHVlcyBjYW4gc3RpbGwgYmUgcmVhZCBieSBvbGRlciB2ZXJzaW9ucworICogb2YgbGlicGNhcC4KKyAqCisgKiBUaGUgb3RoZXIgTElOS1RZUEVfKiBjb2RlcyBhcmUgZ2l2ZW4gdmFsdWVzIHN0YXJ0aW5nIGF0IDEwMCwgaW4gdGhlCisgKiBob3BlcyB0aGF0IG5vIERMVF8qIGNvZGUgd2lsbCBiZSBnaXZlbiBvbmUgb2YgdGhvc2UgdmFsdWVzLgorICoKKyAqIEluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGEgZ2l2ZW4gTElOS1RZUEVfKiBjb2RlJ3MgdmFsdWUgd2lsbCByZWZlciB0bworICogdGhlIHNhbWUgZW5jYXBzdWxhdGlvbiB0eXBlIG9uIGFsbCBwbGF0Zm9ybXMsIHlvdSBzaG91bGQgbm90IGFsbG9jYXRlCisgKiBhIG5ldyBMSU5LVFlQRV8qIHZhbHVlIHdpdGhvdXQgY29uc3VsdGluZworICogInRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyIuICBUaGUgdGNwZHVtcCBkZXZlbG9wZXJzIHdpbGwKKyAqIGFsbG9jYXRlIGEgdmFsdWUgZm9yIHlvdSwgYW5kIHdpbGwgbm90IHN1YnNlcXVlbnRseSBhbGxvY2F0ZSBpdCB0bworICogYW55Ym9keSBlbHNlOyB0aGF0IHZhbHVlIHdpbGwgYmUgYWRkZWQgdG8gdGhlICJwY2FwLmgiIGluIHRoZQorICogdGNwZHVtcC5vcmcgR2l0IHJlcG9zaXRvcnksIHNvIHRoYXQgYSBmdXR1cmUgbGlicGNhcCByZWxlYXNlIHdpbGwKKyAqIGluY2x1ZGUgaXQuCisgKgorICogWW91IHNob3VsZCwgaWYgcG9zc2libGUsIGFsc28gY29udHJpYnV0ZSBwYXRjaGVzIHRvIGxpYnBjYXAgYW5kIHRjcGR1bXAKKyAqIHRvIGhhbmRsZSB0aGUgbmV3IGVuY2Fwc3VsYXRpb24gdHlwZSwgc28gdGhhdCB0aGV5IGNhbiBhbHNvIGJlIGNoZWNrZWQKKyAqIGludG8gdGhlIHRjcGR1bXAub3JnIEdpdCByZXBvc2l0b3J5IGFuZCBzbyB0aGF0IHRoZXkgd2lsbCBhcHBlYXIgaW4KKyAqIGZ1dHVyZSBsaWJwY2FwIGFuZCB0Y3BkdW1wIHJlbGVhc2VzLgorICoKKyAqIERvICpOT1QqIGFzc3VtZSB0aGF0IGFueSB2YWx1ZXMgYWZ0ZXIgdGhlIGxhcmdlc3QgdmFsdWUgaW4gdGhpcyBmaWxlCisgKiBhcmUgYXZhaWxhYmxlOyB5b3UgbWlnaHQgbm90IGhhdmUgdGhlIG1vc3QgdXAtdG8tZGF0ZSB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZpbGUsIGFuZCBuZXcgdmFsdWVzIGFmdGVyIHRoYXQgb25lIG1pZ2h0IGhhdmUgYmVlbiBhc3NpZ25lZC4gIEFsc28sCisgKiBkbyAqTk9UKiB1c2UgYW55IHZhbHVlcyBiZWxvdyAxMDAgLSB0aG9zZSBtaWdodCBhbHJlYWR5IGhhdmUgYmVlbgorICogdGFrZW4gYnkgb25lIChvciBtb3JlISkgb3JnYW5pemF0aW9ucy4KKyAqCisgKiBBbnkgcGxhdGZvcm0gdGhhdCBkZWZpbmVzIGFkZGl0aW9uYWwgRExUXyogY29kZXMgc2hvdWxkOgorICoKKyAqCXJlcXVlc3QgYSBMSU5LVFlQRV8qIGNvZGUgYW5kIHZhbHVlIGZyb20gdGNwZHVtcC5vcmcsCisgKglhcyBwZXIgdGhlIGFib3ZlOworICoKKyAqCWFkZCwgaW4gdGhlaXIgdmVyc2lvbiBvZiBsaWJwY2FwLCBhbiBlbnRyeSB0byBtYXAKKyAqCXRob3NlIERMVF8qIGNvZGVzIHRvIHRoZSBjb3JyZXNwb25kaW5nIExJTktUWVBFXyoKKyAqCWNvZGU7CisgKgorICoJcmVkZWZpbmUsIGluIHRoZWlyICJuZXQvYnBmLmgiLCBhbnkgRExUXyogdmFsdWVzCisgKgl0aGF0IGNvbGxpZGUgd2l0aCB0aGUgdmFsdWVzIHVzZWQgYnkgdGhlaXIgYWRkaXRpb25hbAorICoJRExUXyogY29kZXMsIHRvIHJlbW92ZSB0aG9zZSBjb2xsaXNpb25zIChidXQgd2l0aG91dAorICoJbWFraW5nIHRoZW0gY29sbGlkZSB3aXRoIGFueSBvZiB0aGUgTElOS1RZUEVfKgorICoJdmFsdWVzIGVxdWFsIHRvIDUwIG9yIGFib3ZlOyB0aGV5IHNob3VsZCBhbHNvIGF2b2lkCisgKglkZWZpbmluZyBETFRfKiB2YWx1ZXMgdGhhdCBjb2xsaWRlIHdpdGggdGhvc2UKKyAqCUxJTktUWVBFXyogdmFsdWVzLCBlaXRoZXIpLgorICovCisjZGVmaW5lIExJTktUWVBFX05VTEwJCURMVF9OVUxMCisjZGVmaW5lIExJTktUWVBFX0VUSEVSTkVUCURMVF9FTjEwTUIJLyogYWxzbyBmb3IgMTAwTWIgYW5kIHVwICovCisjZGVmaW5lIExJTktUWVBFX0VYUF9FVEhFUk5FVAlETFRfRU4zTUIJLyogM01iIGV4cGVyaW1lbnRhbCBFdGhlcm5ldCAqLworI2RlZmluZSBMSU5LVFlQRV9BWDI1CQlETFRfQVgyNQorI2RlZmluZSBMSU5LVFlQRV9QUk9ORVQJCURMVF9QUk9ORVQKKyNkZWZpbmUgTElOS1RZUEVfQ0hBT1MJCURMVF9DSEFPUworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzUJRExUX0lFRUU4MDIJLyogRExUX0lFRUU4MDIgaXMgdXNlZCBmb3IgODAyLjUgVG9rZW4gUmluZyAqLworI2RlZmluZSBMSU5LVFlQRV9BUkNORVRfQlNECURMVF9BUkNORVQJLyogQlNELXN0eWxlIGhlYWRlcnMgKi8KKyNkZWZpbmUgTElOS1RZUEVfU0xJUAkJRExUX1NMSVAKKyNkZWZpbmUgTElOS1RZUEVfUFBQCQlETFRfUFBQCisjZGVmaW5lIExJTktUWVBFX0ZEREkJCURMVF9GRERJCisKKy8qCisgKiBMSU5LVFlQRV9QUFAgaXMgZm9yIHVzZSB3aGVuIHRoZXJlIG1pZ2h0LCBvciBtaWdodCBub3QsIGJlIGFuIFJGQyAxNjYyCisgKiBQUFAgaW4gSERMQy1saWtlIGZyYW1pbmcgaGVhZGVyICh3aXRoIDB4ZmYgMHgwMyBiZWZvcmUgdGhlIFBQUCBwcm90b2NvbAorICogZmllbGQpIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldC4KKyAqCisgKiBUaGlzIGlzIGZvciB1c2Ugd2hlbiB0aGVyZSBpcyBhbHdheXMgc3VjaCBhIGhlYWRlcjsgdGhlIGFkZHJlc3MgZmllbGQKKyAqIG1pZ2h0IGJlIDB4ZmYsIGZvciByZWd1bGFyIFBQUCwgb3IgaXQgbWlnaHQgYmUgYW4gYWRkcmVzcyBmaWVsZCBmb3IgQ2lzY28KKyAqIHBvaW50LXRvLXBvaW50IHdpdGggSERMQyBmcmFtaW5nIGFzIHBlciBzZWN0aW9uIDQuMy4xIG9mIFJGQyAxNTQ3ICgiQ2lzY28KKyAqIEhETEMiKS4gIFRoaXMgaXMsIGZvciBleGFtcGxlLCB3aGF0IHlvdSBnZXQgd2l0aCBOZXRCU0QncyBETFRfUFBQX1NFUklBTC4KKyAqCisgKiBXZSBnaXZlIGl0IHRoZSBzYW1lIHZhbHVlIGFzIE5ldEJTRCdzIERMVF9QUFBfU0VSSUFMLCBpbiB0aGUgaG9wZXMgdGhhdAorICogbm9ib2R5IGVsc2Ugd2lsbCBjaG9vc2UgYSBETFRfIHZhbHVlIG9mIDUwLCBhbmQgc28gdGhhdCBETFRfUFBQX1NFUklBTAorICogY2FwdHVyZXMgd2lsbCBiZSB3cml0dGVuIG91dCB3aXRoIGEgbGluayB0eXBlIHRoYXQgTmV0QlNEJ3MgdGNwZHVtcAorICogY2FuIHJlYWQuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfUFBQX0hETEMJNTAJCS8qIFBQUCBpbiBIRExDLWxpa2UgZnJhbWluZyAqLworCisjZGVmaW5lIExJTktUWVBFX1BQUF9FVEhFUgk1MQkJLyogTmV0QlNEIFBQUC1vdmVyLUV0aGVybmV0ICovCisKKyNkZWZpbmUgTElOS1RZUEVfU1lNQU5URUNfRklSRVdBTEwgOTkJCS8qIFN5bWFudGVjIEVudGVycHJpc2UgRmlyZXdhbGwgKi8KKworLyoKKyAqIFRoZXNlIGNvcnJlc3BvbmQgdG8gRExUX3MgdGhhdCBoYXZlIGRpZmZlcmVudCB2YWx1ZXMgb24gZGlmZmVyZW50CisgKiBwbGF0Zm9ybXM7IHdlIG1hcCBiZXR3ZWVuIHRoZXNlIHZhbHVlcyBpbiBjYXB0dXJlIGZpbGVzIGFuZAorICogdGhlIERMVF8gdmFsdWVzIGFzIHJldHVybmVkIGJ5IHBjYXBfZGF0YWxpbmsoKSBhbmQgcGFzc2VkIHRvCisgKiBwY2FwX29wZW5fZGVhZCgpLgorICovCisjZGVmaW5lIExJTktUWVBFX0FUTV9SRkMxNDgzCTEwMAkJLyogTExDL1NOQVAtZW5jYXBzdWxhdGVkIEFUTSAqLworI2RlZmluZSBMSU5LVFlQRV9SQVcJCTEwMQkJLyogcmF3IElQICovCisjZGVmaW5lIExJTktUWVBFX1NMSVBfQlNET1MJMTAyCQkvKiBCU0QvT1MgU0xJUCBCUEYgaGVhZGVyICovCisjZGVmaW5lIExJTktUWVBFX1BQUF9CU0RPUwkxMDMJCS8qIEJTRC9PUyBQUFAgQlBGIGhlYWRlciAqLworCisvKgorICogVmFsdWVzIHN0YXJ0aW5nIHdpdGggMTA0IGFyZSB1c2VkIGZvciBuZXdseS1hc3NpZ25lZCBsaW5rLWxheWVyCisgKiBoZWFkZXIgdHlwZSB2YWx1ZXM7IGZvciB0aG9zZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlcywgdGhlIERMVF8KKyAqIHZhbHVlIHJldHVybmVkIGJ5IHBjYXBfZGF0YWxpbmsoKSBhbmQgcGFzc2VkIHRvIHBjYXBfb3Blbl9kZWFkKCksCisgKiBhbmQgdGhlIExJTktUWVBFXyB2YWx1ZSB0aGF0IGFwcGVhcnMgaW4gY2FwdHVyZSBmaWxlcywgYXJlIHRoZQorICogc2FtZS4KKyAqCisgKiBMSU5LVFlQRV9NQVRDSElOR19NSU4gaXMgdGhlIGxvd2VzdCBzdWNoIHZhbHVlOyBMSU5LVFlQRV9NQVRDSElOR19NQVgKKyAqIGlzIHRoZSBoaWdoZXN0IHN1Y2ggdmFsdWUuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTUFUQ0hJTkdfTUlOCTEwNAkJLyogbG93ZXN0IHZhbHVlIGluIHRoZSAibWF0Y2hpbmciIHJhbmdlICovCisKKyNkZWZpbmUgTElOS1RZUEVfQ19IRExDCQkxMDQJCS8qIENpc2NvIEhETEMgKi8KKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xMQkxMDUJCS8qIElFRUUgODAyLjExICh3aXJlbGVzcykgKi8KKyNkZWZpbmUgTElOS1RZUEVfQVRNX0NMSVAJMTA2CQkvKiBMaW51eCBDbGFzc2ljYWwgSVAgb3ZlciBBVE0gKi8KKyNkZWZpbmUgTElOS1RZUEVfRlJFTEFZCQkxMDcJCS8qIEZyYW1lIFJlbGF5ICovCisjZGVmaW5lIExJTktUWVBFX0xPT1AJCTEwOAkJLyogT3BlbkJTRCBsb29wYmFjayAqLworI2RlZmluZSBMSU5LVFlQRV9FTkMJCTEwOQkJLyogT3BlbkJTRCBJUFNFQyBlbmMgKi8KKworLyoKKyAqIFRoZXNlIHRocmVlIHR5cGVzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9MQU5FODAyMwkxMTAJCS8qIEFUTSBMQU5FICsgODAyLjMgKi8KKyNkZWZpbmUgTElOS1RZUEVfSElQUEkJCTExMQkJLyogTmV0QlNEIEhJUFBJICovCisjZGVmaW5lIExJTktUWVBFX0hETEMJCTExMgkJLyogTmV0QlNEIEhETEMgZnJhbWluZyAqLworCisjZGVmaW5lIExJTktUWVBFX0xJTlVYX1NMTAkxMTMJCS8qIExpbnV4IGNvb2tlZCBzb2NrZXQgY2FwdHVyZSAqLworI2RlZmluZSBMSU5LVFlQRV9MVEFMSwkJMTE0CQkvKiBBcHBsZSBMb2NhbFRhbGsgaGFyZHdhcmUgKi8KKyNkZWZpbmUgTElOS1RZUEVfRUNPTkVUCQkxMTUJCS8qIEFjb3JuIEVjb25ldCAqLworCisvKgorICogUmVzZXJ2ZWQgZm9yIHVzZSB3aXRoIE9wZW5CU0QgaXBmaWx0ZXIuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSVBGSUxURVIJMTE2CisKKyNkZWZpbmUgTElOS1RZUEVfUEZMT0cJCTExNwkJLyogT3BlbkJTRCBETFRfUEZMT0cgKi8KKyNkZWZpbmUgTElOS1RZUEVfQ0lTQ09fSU9TCTExOAkJLyogRm9yIENpc2NvLWludGVybmFsIHVzZSAqLworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzExX1BSSVNNIDExOQkJLyogODAyLjExIHBsdXMgUHJpc20gSUkgbW9uaXRvciBtb2RlIHJhZGlvIG1ldGFkYXRhIGhlYWRlciAqLworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzExX0FJUk9ORVQgMTIwCQkvKiA4MDIuMTEgcGx1cyBGcmVlQlNEIEFpcm9uZXQgZHJpdmVyIHJhZGlvIG1ldGFkYXRhIGhlYWRlciAqLworCisvKgorICogUmVzZXJ2ZWQgZm9yIFNpZW1lbnMgSGlQYXRoIEhETEMuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSEhETEMJCTEyMQorCisjZGVmaW5lIExJTktUWVBFX0lQX09WRVJfRkMJMTIyCQkvKiBSRkMgMjYyNSBJUC1vdmVyLUZpYnJlIENoYW5uZWwgKi8KKyNkZWZpbmUgTElOS1RZUEVfU1VOQVRNCQkxMjMJCS8qIFNvbGFyaXMrU3VuQVRNICovCisKKy8qCisgKiBSZXNlcnZlZCBhcyBwZXIgcmVxdWVzdCBmcm9tIEtlbnQgRGFobGdyZW4gPGtlbnRAcHJhZXN1bS5jb20+CisgKiBmb3IgcHJpdmF0ZSB1c2UuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfUklPCQkxMjQJCS8qIFJhcGlkSU8gKi8KKyNkZWZpbmUgTElOS1RZUEVfUENJX0VYUAkxMjUJCS8qIFBDSSBFeHByZXNzICovCisjZGVmaW5lIExJTktUWVBFX0FVUk9SQQkJMTI2CQkvKiBYaWxpbnggQXVyb3JhIGxpbmsgbGF5ZXIgKi8KKworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzExX1JBRElPVEFQIDEyNwkvKiA4MDIuMTEgcGx1cyByYWRpb3RhcCByYWRpbyBtZXRhZGF0YSBoZWFkZXIgKi8KKworLyoKKyAqIFJlc2VydmVkIGZvciB0aGUgVFpTUCBlbmNhcHN1bGF0aW9uLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBDaHJpcyBXYXRlcnMgPGNocmlzLndhdGVyc0BuZXR3b3JrY2hlbWlzdHJ5LmNvbT4KKyAqIFRaU1AgaXMgYSBnZW5lcmljIGVuY2Fwc3VsYXRpb24gZm9yIGFueSBvdGhlciBsaW5rIHR5cGUsCisgKiB3aGljaCBpbmNsdWRlcyBhIG1lYW5zIHRvIGluY2x1ZGUgbWV0YS1pbmZvcm1hdGlvbgorICogd2l0aCB0aGUgcGFja2V0LCBlLmcuIHNpZ25hbCBzdHJlbmd0aCBhbmQgY2hhbm5lbAorICogZm9yIDgwMi4xMSBwYWNrZXRzLgorICovCisjZGVmaW5lIExJTktUWVBFX1RaU1AJCTEyOAkJLyogVGF6bWVuIFNuaWZmZXIgUHJvdG9jb2wgKi8KKworI2RlZmluZSBMSU5LVFlQRV9BUkNORVRfTElOVVgJMTI5CQkvKiBMaW51eC1zdHlsZSBoZWFkZXJzICovCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGVzLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBjb3JyZXNwb25kaW5nCisgKiBETFRfcyBhcmUgdXNlZCBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsCisgKiBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcyBRT1MgcHJvZmlsZXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9NTFBQUCAgMTMwCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfTUxGUiAgIDEzMQorI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0VTICAgICAxMzIKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9HR1NOICAgMTMzCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfTUZSICAgIDEzNAorI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0FUTTIgICAxMzUKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9TRVJWSUNFUyAxMzYKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9BVE0xICAgMTM3CisKKyNkZWZpbmUgTElOS1RZUEVfQVBQTEVfSVBfT1ZFUl9JRUVFMTM5NCAxMzgJLyogQXBwbGUgSVAtb3Zlci1JRUVFIDEzOTQgY29va2VkIGhlYWRlciAqLworCisjZGVmaW5lIExJTktUWVBFX01UUDJfV0lUSF9QSERSCTEzOQorI2RlZmluZSBMSU5LVFlQRV9NVFAyCQkxNDAKKyNkZWZpbmUgTElOS1RZUEVfTVRQMwkJMTQxCisjZGVmaW5lIExJTktUWVBFX1NDQ1AJCTE0MgorCisjZGVmaW5lIExJTktUWVBFX0RPQ1NJUwkJMTQzCQkvKiBET0NTSVMgTUFDIGZyYW1lcyAqLworCisjZGVmaW5lIExJTktUWVBFX0xJTlVYX0lSREEJMTQ0CQkvKiBMaW51eC1JckRBICovCisKKy8qCisgKiBSZXNlcnZlZCBmb3IgSUJNIFNQIHN3aXRjaCBhbmQgSUJNIE5leHQgRmVkZXJhdGlvbiBzd2l0Y2guCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSUJNX1NQCQkxNDUKKyNkZWZpbmUgTElOS1RZUEVfSUJNX1NOCQkxNDYKKworLyoKKyAqIFJlc2VydmVkIGZvciBwcml2YXRlIHVzZS4gIElmIHlvdSBoYXZlIHNvbWUgbGluay1sYXllciBoZWFkZXIgdHlwZQorICogdGhhdCB5b3Ugd2FudCB0byB1c2Ugd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLCB3aXRoIHRoZSBjYXB0dXJlIGZpbGVzCisgKiB1c2luZyB0aGF0IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgbm90IGV2ZXIgYmUgc2VudCBvdXRzaWRlIHlvdXIKKyAqIG9yZ2FuaXphdGlvbiwgeW91IGNhbiB1c2UgdGhlc2UgdmFsdWVzLgorICoKKyAqIE5vIGxpYnBjYXAgcmVsZWFzZSB3aWxsIHVzZSB0aGVzZSBmb3IgYW55IHB1cnBvc2UsIG5vciB3aWxsIGFueQorICogdGNwZHVtcCByZWxlYXNlIHVzZSB0aGVtLCBlaXRoZXIuCisgKgorICogRG8gKk5PVCogdXNlIHRoZXNlIGluIGNhcHR1cmUgZmlsZXMgdGhhdCB5b3UgZXhwZWN0IGFueWJvZHkgbm90IHVzaW5nCisgKiB5b3VyIHByaXZhdGUgdmVyc2lvbnMgb2YgY2FwdHVyZS1maWxlLXJlYWRpbmcgdG9vbHMgdG8gcmVhZDsgaW4KKyAqIHBhcnRpY3VsYXIsIGRvICpOT1QqIHVzZSB0aGVtIGluIHByb2R1Y3RzLCBvdGhlcndpc2UgeW91IG1heSBmaW5kIHRoYXQKKyAqIHBlb3BsZSB3b24ndCBiZSBhYmxlIHRvIHVzZSB0Y3BkdW1wLCBvciBzbm9ydCwgb3IgRXRoZXJlYWwsIG9yLi4uIHRvCisgKiByZWFkIGNhcHR1cmUgZmlsZXMgZnJvbSB5b3VyIGZpcmV3YWxsL2ludHJ1c2lvbiBkZXRlY3Rpb24vdHJhZmZpYworICogbW9uaXRvcmluZy9ldGMuIGFwcGxpYW5jZSwgb3Igd2hhdGV2ZXIgcHJvZHVjdCB1c2VzIHRoYXQgTElOS1RZUEVfIHZhbHVlLAorICogYW5kIHlvdSBtYXkgYWxzbyBmaW5kIHRoYXQgdGhlIGRldmVsb3BlcnMgb2YgdGhvc2UgYXBwbGljYXRpb25zIHdpbGwKKyAqIG5vdCBhY2NlcHQgcGF0Y2hlcyB0byBsZXQgdGhlbSByZWFkIHRob3NlIGZpbGVzLgorICoKKyAqIEFsc28sIGRvIG5vdCB1c2UgdGhlbSBpZiBzb21lYm9keSBtaWdodCBzZW5kIHlvdSBhIGNhcHR1cmUgdXNpbmcgdGhlbQorICogZm9yICp0aGVpciogcHJpdmF0ZSB0eXBlIGFuZCB0b29scyB1c2luZyB0aGVtIGZvciAqeW91ciogcHJpdmF0ZSB0eXBlCisgKiB3b3VsZCBoYXZlIHRvIHJlYWQgdGhlbS4KKyAqCisgKiBJbnN0ZWFkLCBpbiB0aG9zZSBjYXNlcywgYXNrICJ0Y3BkdW1wLXdvcmtlcnNAbGlzdHMudGNwZHVtcC5vcmciIGZvciBhCisgKiBuZXcgRExUXyBhbmQgTElOS1RZUEVfIHZhbHVlLCBhcyBwZXIgdGhlIGNvbW1lbnQgaW4gcGNhcC9icGYuaCwgYW5kIHVzZQorICogdGhlIHR5cGUgeW91J3JlIGdpdmVuLgorICovCisjZGVmaW5lIExJTktUWVBFX1VTRVIwCQkxNDcKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjEJCTE0OAorI2RlZmluZSBMSU5LVFlQRV9VU0VSMgkJMTQ5CisjZGVmaW5lIExJTktUWVBFX1VTRVIzCQkxNTAKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjQJCTE1MQorI2RlZmluZSBMSU5LVFlQRV9VU0VSNQkJMTUyCisjZGVmaW5lIExJTktUWVBFX1VTRVI2CQkxNTMKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjcJCTE1NAorI2RlZmluZSBMSU5LVFlQRV9VU0VSOAkJMTU1CisjZGVmaW5lIExJTktUWVBFX1VTRVI5CQkxNTYKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjEwCQkxNTcKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjExCQkxNTgKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjEyCQkxNTkKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjEzCQkxNjAKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjE0CQkxNjEKKyNkZWZpbmUgTElOS1RZUEVfVVNFUjE1CQkxNjIKKworLyoKKyAqIEZvciBmdXR1cmUgdXNlIHdpdGggODAyLjExIGNhcHR1cmVzIC0gZGVmaW5lZCBieSBBYnNvbHV0ZVZhbHVlCisgKiBTeXN0ZW1zIHRvIHN0b3JlIGEgbnVtYmVyIG9mIGJpdHMgb2YgbGluay1sYXllciBpbmZvcm1hdGlvbgorICogaW5jbHVkaW5nIHJhZGlvIGluZm9ybWF0aW9uOgorICoKKyAqCWh0dHA6Ly93d3cuc2hhZnRuZXQub3JnL35waXp6YS9zb2Z0d2FyZS9jYXB0dXJlZnJtLnR4dAorICovCisjZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTFfQVZTCTE2MwkvKiA4MDIuMTEgcGx1cyBBVlMgcmFkaW8gbWV0YWRhdGEgaGVhZGVyICovCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIGNvcnJlc3BvbmRpbmcKKyAqIERMVF9zIGFyZSB1c2VkIGZvciBwYXNzaW5nIG9uIGNoYXNzaXMtaW50ZXJuYWwKKyAqIG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzIFFPUyBwcm9maWxlcywgZXRjLi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX01PTklUT1IgMTY0CisKKy8qCisgKiBCQUNuZXQgTVMvVFAgZnJhbWVzLgorICovCisjZGVmaW5lIExJTktUWVBFX0JBQ05FVF9NU19UUAkxNjUKKworLyoKKyAqIEFub3RoZXIgUFBQIHZhcmlhbnQgYXMgcGVyIHJlcXVlc3QgZnJvbSBLYXJzdGVuIEtlaWwgPGtrZWlsQHN1c2UuZGU+LgorICoKKyAqIFRoaXMgaXMgdXNlZCBpbiBzb21lIE9TZXMgdG8gYWxsb3cgYSBrZXJuZWwgc29ja2V0IGZpbHRlciB0byBkaXN0aW5ndWlzaAorICogYmV0d2VlbiBpbmNvbWluZyBhbmQgb3V0Z29pbmcgcGFja2V0cywgb24gYSBzb2NrZXQgaW50ZW5kZWQgdG8KKyAqIHN1cHBseSBwcHBkIHdpdGggb3V0Z29pbmcgcGFja2V0cyBzbyBpdCBjYW4gZG8gZGlhbC1vbi1kZW1hbmQgYW5kCisgKiBoYW5ndXAtb24tbGFjay1vZi1kZW1hbmQ7IGluY29taW5nIHBhY2tldHMgYXJlIGZpbHRlcmVkIG91dCBzbyB0aGV5CisgKiBkb24ndCBjYXVzZSBwcHBkIHRvIGhvbGQgdGhlIGNvbm5lY3Rpb24gdXAgKHlvdSBkb24ndCB3YW50IHJhbmRvbQorICogaW5wdXQgcGFja2V0cyBzdWNoIGFzIHBvcnQgc2NhbnMsIHBhY2tldHMgZnJvbSBvbGQgbG9zdCBjb25uZWN0aW9ucywKKyAqIGV0Yy4gdG8gZm9yY2UgdGhlIGNvbm5lY3Rpb24gdG8gc3RheSB1cCkuCisgKgorICogVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIFBQUCBoZWFkZXIgKDB4ZmYwMykgaXMgbW9kaWZpZWQgdG8gYWNjb21vZGF0ZQorICogdGhlIGRpcmVjdGlvbiAtIDB4MDAgPSBJTiwgMHgwMSA9IE9VVC4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9QUFBfUFBQRAkxNjYKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUX3MgYXJlIHVzZWQKKyAqIGZvciBwYXNzaW5nIG9uIGNoYXNzaXMtaW50ZXJuYWwgbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMKKyAqIFFPUyBwcm9maWxlcywgY29va2llcywgZXRjLi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX1BQUE9FICAgICAxNjcKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9QUFBPRV9BVE0gMTY4CisKKyNkZWZpbmUgTElOS1RZUEVfR1BSU19MTEMJMTY5CQkvKiBHUFJTIExMQyAqLworI2RlZmluZSBMSU5LVFlQRV9HUEZfVAkJMTcwCQkvKiBHUEYtVCAoSVRVLVQgRy43MDQxL1kuMTMwMykgKi8KKyNkZWZpbmUgTElOS1RZUEVfR1BGX0YJCTE3MQkJLyogR1BGLVQgKElUVS1UIEcuNzA0MS9ZLjEzMDMpICovCisKKy8qCisgKiBSZXF1ZXN0ZWQgYnkgT29sYW4gWmltbWVyIDxvekBnY29tLmNvbT4gZm9yIHVzZSBpbiBHY29tJ3MgVDEvRTEgbGluZQorICogbW9uaXRvcmluZyBlcXVpcG1lbnQuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfR0NPTV9UMUUxCTE3MgorI2RlZmluZSBMSU5LVFlQRV9HQ09NX1NFUklBTAkxNzMKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUXyBpcyB1c2VkCisgKiBmb3IgaW50ZXJuYWwgY29tbXVuaWNhdGlvbiB0byBQaHlzaWNhbCBJbnRlcmZhY2UgQ2FyZHMgKFBJQykKKyAqLworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX1BJQ19QRUVSICAgIDE3NAorCisvKgorICogTGluayB0eXBlcyByZXF1ZXN0ZWQgYnkgR3JlZ29yIE1haWVyIDxncmVnb3JAZW5kYWNlLmNvbT4gb2YgRW5kYWNlCisgKiBNZWFzdXJlbWVudCBTeXN0ZW1zLiAgVGhleSBhZGQgYW4gRVJGIGhlYWRlciAoc2VlCisgKiBodHRwOi8vd3d3LmVuZGFjZS5jb20vc3VwcG9ydC9FbmRhY2VSZWNvcmRGb3JtYXQucGRmKSBpbiBmcm9udCBvZgorICogdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgorICovCisjZGVmaW5lIExJTktUWVBFX0VSRl9FVEgJMTc1CS8qIEV0aGVybmV0ICovCisjZGVmaW5lIExJTktUWVBFX0VSRl9QT1MJMTc2CS8qIFBhY2tldC1vdmVyLVNPTkVUICovCisKKy8qCisgKiBSZXF1ZXN0ZWQgYnkgRGFuaWVsZSBPcmxhbmRpIDxkYW5pZWxlQG9ybGFuZGkuY29tPiBmb3IgcmF3IExBUEQKKyAqIGZvciB2SVNETiAoaHR0cDovL3d3dy5vcmxhbmRpLmNvbS92aXNkbi8pLiAgSXRzIGxpbmstbGF5ZXIgaGVhZGVyCisgKiBpbmNsdWRlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJlZm9yZSB0aGUgTEFQRCBoZWFkZXIsIHNvIGl0J3MKKyAqIG5vdCBuZWNlc3NhcmlseSBhIGdlbmVyaWMgTEFQRCBoZWFkZXIuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTElOVVhfTEFQRAkxNzcKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uIAorICogVGhlIExpbmsgVHlwZXMgYXJlIHVzZWQgZm9yIHByZXBlbmRpbmcgbWV0YS1pbmZvcm1hdGlvbgorICogbGlrZSBpbnRlcmZhY2UgaW5kZXgsIGludGVyZmFjZSBuYW1lCisgKiBiZWZvcmUgc3RhbmRhcmQgRXRoZXJuZXQsIFBQUCwgRnJlbGF5ICYgQy1IRExDIEZyYW1lcworICovCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfRVRIRVIgIDE3OAorI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX1BQUCAgICAxNzkKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9GUkVMQVkgMTgwCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfQ0hETEMgIDE4MQorCisvKgorICogTXVsdGkgTGluayBGcmFtZSBSZWxheSAoRlJGLjE2KQorICovCisjZGVmaW5lIExJTktUWVBFX01GUiAgICAgICAgICAgIDE4MgorCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHdpdGggYQorICogdm9pY2UgQWRhcHRlciBDYXJkIChQSUMpCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9WUCAgICAgMTgzCisKKy8qCisgKiBBcmluYyA0MjkgZnJhbWVzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogRXZlcnkgZnJhbWUgY29udGFpbnMgYSAzMmJpdCBBNDI5IGxhYmVsLgorICogTW9yZSBkb2N1bWVudGF0aW9uIG9uIEFyaW5jIDQyOSBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cuY29uZG9yZW5nLmNvbS9zdXBwb3J0L2Rvd25sb2Fkcy90dXRvcmlhbHMvQVJJTkNUdXRvcmlhbC5wZGYKKyAqLworI2RlZmluZSBMSU5LVFlQRV9BNDI5ICAgICAgICAgICAxODQKKworLyoKKyAqIEFyaW5jIDY1MyBJbnRlcnBhcnRpdGlvbiBDb21tdW5pY2F0aW9uIG1lc3NhZ2VzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBBNjUzLTEgc3RhbmRhcmQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfQTY1M19JQ00gICAgICAgMTg1CisKKy8qCisgKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBVU0Igc2V0dXAgaGVhZGVyOyByZXF1ZXN0ZWQgYnkKKyAqIFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfVVNCCQkxODYKKworLyoKKyAqIEJsdWV0b290aCBIQ0kgVUFSVCB0cmFuc3BvcnQgbGF5ZXIgKHBhcnQgSDo0KTsgcmVxdWVzdGVkIGJ5CisgKiBQYW9sbyBBYmVuaS4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9CTFVFVE9PVEhfSENJX0g0CTE4NworCisvKgorICogSUVFRSA4MDIuMTYgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyOyByZXF1ZXN0ZWQgYnkgTWFyaWEgQ3J1egorICogPGNydXpfcGV0YWdheUBiYWguY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzE2X01BQ19DUFMJMTg4CisKKy8qCisgKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBMaW51eCBVU0IgaGVhZGVyOyByZXF1ZXN0ZWQgYnkKKyAqIFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfVVNCX0xJTlVYCQkxODkKKworLyoKKyAqIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrIChDQU4pIHYuIDIuMEIgcGFja2V0cy4KKyAqIERMVF8gcmVxdWVzdGVkIGJ5IEdpYW5sdWNhIFZhcmVubmkgPGdpYW5sdWNhLnZhcmVubmlAY2FjZXRlY2guY29tPi4KKyAqIFVzZWQgdG8gZHVtcCBDQU4gcGFja2V0cyBjb21pbmcgZnJvbSBhIENBTiBWZWN0b3IgYm9hcmQuCisgKiBNb3JlIGRvY3VtZW50YXRpb24gb24gdGhlIENBTiB2Mi4wQiBmcmFtZXMgY2FuIGJlIGZvdW5kIGF0CisgKiBodHRwOi8vd3d3LmNhbi1jaWEub3JnL2Rvd25sb2Fkcy8/MjY5CisgKi8KKyNkZWZpbmUgTElOS1RZUEVfQ0FOMjBCICAgICAgICAgMTkwCisKKy8qCisgKiBJRUVFIDgwMi4xNS40LCB3aXRoIGFkZHJlc3MgZmllbGRzIHBhZGRlZCwgYXMgaXMgZG9uZSBieSBMaW51eAorICogZHJpdmVyczsgcmVxdWVzdGVkIGJ5IEp1ZXJnZW4gU2NoaW1tZXIuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xNV80X0xJTlVYCTE5MQorCisvKgorICogUGVyIFBhY2tldCBJbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZWQgcGFja2V0cy4KKyAqIExJTktUWVBFXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX1BQSQkJCTE5MgorCisvKgorICogSGVhZGVyIGZvciA4MDIuMTYgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyIHBsdXMgYSByYWRpb3RhcCByYWRpbyBoZWFkZXI7CisgKiByZXF1ZXN0ZWQgYnkgQ2hhcmxlcyBDbGFuY3kuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfSUVFRTgwMl8xNl9NQUNfQ1BTX1JBRElPCTE5MworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHdpdGggYQorICogaW50ZWdyYXRlZCBzZXJ2aWNlIG1vZHVsZSAoSVNNKS4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0lTTSAgICAxOTQKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpOyByZXF1ZXN0ZWQgYnkgTWlra28gU2Fhcm5pdmFsYSA8bWlra28uc2Fhcm5pdmFsYUBzZW5zaW5vZGUuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9JRUVFODAyXzE1XzQJMTk1CisKKy8qCisgKiBWYXJpb3VzIGxpbmstbGF5ZXIgdHlwZXMsIHdpdGggYSBwc2V1ZG8taGVhZGVyLCBmb3IgU0lUQQorICogKGh0dHA6Ly93d3cuc2l0YS5hZXJvLyk7IHJlcXVlc3RlZCBieSBGdWxrbyBIZXcgKGZ1bGtvLmhld0BnbWFpbC5jb20pLgorICovCisjZGVmaW5lIExJTktUWVBFX1NJVEEJCTE5NgorCisvKgorICogVmFyaW91cyBsaW5rLWxheWVyIHR5cGVzLCB3aXRoIGEgcHNldWRvLWhlYWRlciwgZm9yIEVuZGFjZSBEQUcgY2FyZHM7CisgKiBlbmNhcHN1bGF0ZXMgRW5kYWNlIEVSRiByZWNvcmRzLiAgUmVxdWVzdGVkIGJ5IFN0ZXBoZW4gRG9ubmVsbHkKKyAqIDxzdGVwaGVuQGVuZGFjZS5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX0VSRgkJMTk3CisKKy8qCisgKiBTcGVjaWFsIGhlYWRlciBwcmVwZW5kZWQgdG8gRXRoZXJuZXQgcGFja2V0cyB3aGVuIGNhcHR1cmluZyBmcm9tIGEKKyAqIHUxMCBOZXR3b3JrcyBib2FyZC4gIFJlcXVlc3RlZCBieSBQaGlsIE11bGhvbGxhbmQKKyAqIDxwaGlsQHUxMG5ldHdvcmtzLmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfUkFJRjEJCTE5OAorCisvKgorICogSVBNQiBwYWNrZXQgZm9yIElQTUksIGJlZ2lubmluZyB3aXRoIHRoZSBJMkMgc2xhdmUgYWRkcmVzcywgZm9sbG93ZWQKKyAqIGJ5IHRoZSBuZXRGbiBhbmQgTFVOLCBldGMuLiAgUmVxdWVzdGVkIGJ5IENoYW50aHkgVG9ldW5nCisgKiA8Y2hhbnRoeS50b2V1bmdAY2Eua29udHJvbi5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX0lQTUIJCTE5OQorCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBjYXB0dXJpbmcgZGF0YSBvbiBhIHNlY3VyZSB0dW5uZWwgaW50ZXJmYWNlLgorICovCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfU1QgICAgIDIwMAorCisvKgorICogQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciAocGFydCBIOjQpLCB3aXRoIHBzZXVkby1oZWFkZXIKKyAqIHRoYXQgaW5jbHVkZXMgZGlyZWN0aW9uIGluZm9ybWF0aW9uOyByZXF1ZXN0ZWQgYnkgUGFvbG8gQWJlbmkuCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfQkxVRVRPT1RIX0hDSV9INF9XSVRIX1BIRFIJMjAxCisKKy8qCisgKiBBWC4yNSBwYWNrZXQgd2l0aCBhIDEtYnl0ZSBLSVNTIGhlYWRlcjsgc2VlCisgKgorICoJaHR0cDovL3d3dy5heDI1Lm5ldC9raXNzLmh0bQorICoKKyAqIGFzIHBlciBSaWNoYXJkIFN0ZWFybiA8cmljaGFyZEBybnMtc3RlYXJuLmRlbW9uLmNvLnVrPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9BWDI1X0tJU1MJMjAyCisKKy8qCisgKiBMQVBEIHBhY2tldHMgZnJvbSBhbiBJU0ROIGNoYW5uZWwsIHN0YXJ0aW5nIHdpdGggdGhlIGFkZHJlc3MgZmllbGQsCisgKiB3aXRoIG5vIHBzZXVkby1oZWFkZXIuCisgKiBSZXF1ZXN0ZWQgYnkgVmFydW5hIERlIFNpbHZhIDx2YXJ1bmF4QGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTEFQRAkJMjAzCisKKy8qCisgKiBWYXJpYW50cyBvZiB2YXJpb3VzIGxpbmstbGF5ZXIgaGVhZGVycywgd2l0aCBhIG9uZS1ieXRlIGRpcmVjdGlvbgorICogcHNldWRvLWhlYWRlciBwcmVwZW5kZWQgLSB6ZXJvIG1lYW5zICJyZWNlaXZlZCBieSB0aGlzIGhvc3QiLAorICogbm9uLXplcm8gKGFueSBub24temVybyB2YWx1ZSkgbWVhbnMgInNlbnQgYnkgdGhpcyBob3N0IiAtIGFzIHBlcgorICogV2lsbCBCYXJrZXIgPHcuYmFya2VyQHplbi5jby51az4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfUFBQX1dJVEhfRElSCTIwNAkvKiBQUFAgKi8KKyNkZWZpbmUgTElOS1RZUEVfQ19IRExDX1dJVEhfRElSIDIwNQkvKiBDaXNjbyBIRExDICovCisjZGVmaW5lIExJTktUWVBFX0ZSRUxBWV9XSVRIX0RJUiAyMDYJLyogRnJhbWUgUmVsYXkgKi8KKyNkZWZpbmUgTElOS1RZUEVfTEFQQl9XSVRIX0RJUgkyMDcJLyogTEFQQiAqLworCisvKgorICogMjA4IGlzIHJlc2VydmVkIGZvciBhbiBhcy15ZXQtdW5zcGVjaWZpZWQgcHJvcHJpZXRhcnkgbGluay1sYXllcgorICogdHlwZSwgYXMgcmVxdWVzdGVkIGJ5IFdpbGwgQmFya2VyLgorICovCisKKy8qCisgKiBJUE1CIHdpdGggYSBMaW51eC1zcGVjaWZpYyBwc2V1ZG8taGVhZGVyOyBhcyByZXF1ZXN0ZWQgYnkgQWxleGV5IE5leW1hbgorICogPGF2bkBwaWdlb25wb2ludC5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX0lQTUJfTElOVVgJMjA5CisKKy8qCisgKiBGbGV4UmF5IGF1dG9tb3RpdmUgYnVzIC0gaHR0cDovL3d3dy5mbGV4cmF5LmNvbS8gLSBhcyByZXF1ZXN0ZWQKKyAqIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIExJTktUWVBFX0ZMRVhSQVkJMjEwCisKKy8qCisgKiBNZWRpYSBPcmllbnRlZCBTeXN0ZW1zIFRyYW5zcG9ydCAoTU9TVCkgYnVzIGZvciBtdWx0aW1lZGlhCisgKiB0cmFuc3BvcnQgLSBodHRwOi8vd3d3Lm1vc3Rjb29wZXJhdGlvbi5jb20vIC0gYXMgcmVxdWVzdGVkCisgKiBieSBIYW5uZXMgS2FlbGJlciA8aGFubmVzLmthZWxiZXJAeDJlLmRlPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9NT1NUCQkyMTEKKworLyoKKyAqIExvY2FsIEludGVyY29ubmVjdCBOZXR3b3JrIChMSU4pIGJ1cyBmb3IgdmVoaWNsZSBuZXR3b3JrcyAtCisgKiBodHRwOi8vd3d3Lmxpbi1zdWJidXMub3JnLyAtIGFzIHJlcXVlc3RlZCBieSBIYW5uZXMgS2FlbGJlcgorICogPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTElOCQkyMTIKKworLyoKKyAqIFgyRS1wcml2YXRlIGRhdGEgbGluayB0eXBlIHVzZWQgZm9yIHNlcmlhbCBsaW5lIGNhcHR1cmUsCisgKiBhcyByZXF1ZXN0ZWQgYnkgSGFubmVzIEthZWxiZXIgPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfWDJFX1NFUklBTAkyMTMKKworLyoKKyAqIFgyRS1wcml2YXRlIGRhdGEgbGluayB0eXBlIHVzZWQgZm9yIHRoZSBYb3JheWEgZGF0YSBsb2dnZXIKKyAqIGZhbWlseSwgYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIExJTktUWVBFX1gyRV9YT1JBWUEJMjE0CisKKy8qCisgKiBJRUVFIDgwMi4xNS40LCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gdGhlIHNwZWMgKG5vIHBhZGRpbmcsIG5vCisgKiBub3RoaW5nKSwgYnV0IHdpdGggdGhlIFBIWS1sZXZlbCBkYXRhIGZvciBub24tQVNLIFBIWXMgKDQgb2N0ZXRzCisgKiBvZiAwIGFzIHByZWFtYmxlLCBvbmUgb2N0ZXQgb2YgU0ZELCBvbmUgb2N0ZXQgb2YgZnJhbWUgbGVuZ3RoKworICogcmVzZXJ2ZWQgYml0LCBhbmQgdGhlbiB0aGUgTUFDLWxheWVyIGRhdGEsIHN0YXJ0aW5nIHdpdGggdGhlCisgKiBmcmFtZSBjb250cm9sIGZpZWxkKS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgTWF4IEZpbGlwcG92IDxqY212YmtiY0BnbWFpbC5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTVfNF9OT05BU0tfUEhZCTIxNQorCisvKiAKKyAqIERhdmlkIEdpYnNvbiA8ZGF2aWRAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiByZXF1ZXN0ZWQgdGhpcyBmb3IKKyAqIGNhcHR1cmVzIGZyb20gdGhlIExpbnV4IGtlcm5lbCAvZGV2L2lucHV0L2V2ZW50TiBkZXZpY2VzLiBUaGlzCisgKiBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGtleXN0cm9rZXMgYW5kIG1vdXNlIG1vdmVtZW50cyBmcm9tIHRoZQorICogTGludXgga2VybmVsIHRvIGRpc3BsYXkgc3lzdGVtcywgc3VjaCBhcyBYb3JnLiAKKyAqLworI2RlZmluZSBMSU5LVFlQRV9MSU5VWF9FVkRFVgkyMTYKKworLyoKKyAqIEdTTSBVbSBhbmQgQWJpcyBpbnRlcmZhY2VzLCBwcmVjZWRlZCBieSBhICJnc210YXAiIGhlYWRlci4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfR1NNVEFQX1VNCTIxNworI2RlZmluZSBMSU5LVFlQRV9HU01UQVBfQUJJUwkyMTgKKworLyoKKyAqIE1QTFMsIHdpdGggYW4gTVBMUyBsYWJlbCBhcyB0aGUgbGluay1sYXllciBoZWFkZXIuCisgKiBSZXF1ZXN0ZWQgYnkgTWljaGVsZSBNYXJjaGV0dG8gPG1pY2hlbGVAb3BlbmJzZC5vcmc+IG9uIGJlaGFsZgorICogb2YgT3BlbkJTRC4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9NUExTCQkyMTkKKworLyoKKyAqIFVTQiBwYWNrZXRzLCBiZWdpbm5pbmcgd2l0aCBhIExpbnV4IFVTQiBoZWFkZXIsIHdpdGggdGhlIFVTQiBoZWFkZXIKKyAqIHBhZGRlZCB0byA2NCBieXRlczsgcmVxdWlyZWQgZm9yIG1lbW9yeS1tYXBwZWQgYWNjZXNzLgorICovCisjZGVmaW5lIExJTktUWVBFX1VTQl9MSU5VWF9NTUFQUEVECQkyMjAKKworLyoKKyAqIERFQ1QgcGFja2V0cywgd2l0aCBhIHBzZXVkby1oZWFkZXI7IHJlcXVlc3RlZCBieQorICogTWF0dGhpYXMgV2VuemVsIDx0Y3BkdW1wQG1henpvby5kZT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfREVDVAkJMjIxCisKKy8qCisgKiBGcm9tOiAiTGlkd2EsIEVyaWMgKEdTRkMtNTgyLjApW1NHVCBJTkNdIiA8ZXJpYy5saWR3YS0xQG5hc2EuZ292PgorICogRGF0ZTogTW9uLCAxMSBNYXkgMjAwOSAxMToxODozMCAtMDUwMAorICoKKyAqIERMVF9BT1MuIFdlIG5lZWQgaXQgZm9yIEFPUyBTcGFjZSBEYXRhIExpbmsgUHJvdG9jb2wuCisgKiAgIEkgaGF2ZSBhbHJlYWR5IHdyaXR0ZW4gZGlzc2VjdG9ycyBmb3IgYnV0IG5lZWQgYW4gT0sgZnJvbQorICogICBsZWdhbCBiZWZvcmUgSSBjYW4gc3VibWl0IGEgcGF0Y2guCisgKgorICovCisjZGVmaW5lIExJTktUWVBFX0FPUwkJMjIyCisKKy8qCisgKiBXaXJlbGVzcyBIQVJUIChIaWdod2F5IEFkZHJlc3NhYmxlIFJlbW90ZSBUcmFuc2R1Y2VyKQorICogRnJvbSB0aGUgSEFSVCBDb21tdW5pY2F0aW9uIEZvdW5kYXRpb24KKyAqIElFUy9QQVMgNjI1OTEKKyAqCisgKiBSZXF1ZXN0ZWQgYnkgU2FtIFJvYmVydHMgPHZpZXV4dGVjaEBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX1dJSEFSVAkJMjIzCisKKy8qCisgKiBGaWJyZSBDaGFubmVsIEZDLTIgZnJhbWVzLCBiZWdpbm5pbmcgd2l0aCBhIEZyYW1lX0hlYWRlci4KKyAqIFJlcXVlc3RlZCBieSBLYWhvdSBMZWkgPGthaG91ODJAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9GQ18yCQkyMjQKKworLyoKKyAqIEZpYnJlIENoYW5uZWwgRkMtMiBmcmFtZXMsIGJlZ2lubmluZyB3aXRoIGFuIGVuY29kaW5nIG9mIHRoZQorICogU09GLCBhbmQgZW5kaW5nIHdpdGggYW4gZW5jb2Rpbmcgb2YgdGhlIEVPRi4KKyAqCisgKiBUaGUgZW5jb2RpbmdzIHJlcHJlc2VudCB0aGUgZnJhbWUgZGVsaW1pdGVycyBhcyA0LWJ5dGUgc2VxdWVuY2VzCisgKiByZXByZXNlbnRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXJlZCBzZXRzLCB3aXRoIEsyOC41CisgKiByZXByZXNlbnRlZCBhcyAweEJDLCBhbmQgdGhlIEQgc3ltYm9scyBhcyB0aGUgY29ycmVzcG9uZGluZworICogYnl0ZSB2YWx1ZXM7IGZvciBleGFtcGxlLCBTT0ZpMiwgd2hpY2ggaXMgSzI4LjUgLSBEMjEuNSAtIEQxLjIgLSBEMjEuMiwKKyAqIGlzIHJlcHJlc2VudGVkIGFzIDB4QkMgMHhCNSAweDU1IDB4NTUuCisgKgorICogUmVxdWVzdGVkIGJ5IEthaG91IExlaSA8a2Fob3U4MkBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX0ZDXzJfV0lUSF9GUkFNRV9ERUxJTVMJCTIyNQorCisvKgorICogU29sYXJpcyBpcG5ldCBwc2V1ZG8taGVhZGVyOyByZXF1ZXN0ZWQgYnkgRGFycmVuIFJlZWQgPERhcnJlbi5SZWVkQFN1bi5DT00+LgorICoKKyAqIFRoZSBwc2V1ZG8taGVhZGVyIHN0YXJ0cyB3aXRoIGEgb25lLWJ5dGUgdmVyc2lvbiBudW1iZXI7IGZvciB2ZXJzaW9uIDIsCisgKiB0aGUgcHNldWRvLWhlYWRlciBpczoKKyAqCisgKiBzdHJ1Y3QgZGxfaXBuZXRpbmZvIHsKKyAqICAgICB1X2ludDhfdCAgIGRsaV92ZXJzaW9uOworICogICAgIHVfaW50OF90ICAgZGxpX2ZhbWlseTsKKyAqICAgICB1X2ludDE2X3QgIGRsaV9odHlwZTsKKyAqICAgICB1X2ludDMyX3QgIGRsaV9wa3RsZW47CisgKiAgICAgdV9pbnQzMl90ICBkbGlfaWZpbmRleDsKKyAqICAgICB1X2ludDMyX3QgIGRsaV9ncmlmaW5kZXg7CisgKiAgICAgdV9pbnQzMl90ICBkbGlfenNyYzsKKyAqICAgICB1X2ludDMyX3QgIGRsaV96ZHN0OworICogfTsKKyAqCisgKiBkbGlfdmVyc2lvbiBpcyAyIGZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBwc2V1ZG8taGVhZGVyLgorICoKKyAqIGRsaV9mYW1pbHkgaXMgYSBTb2xhcmlzIGFkZHJlc3MgZmFtaWx5IHZhbHVlLCBzbyBpdCdzIDIgZm9yIElQdjQKKyAqIGFuZCAyNiBmb3IgSVB2Ni4KKyAqCisgKiBkbGlfaHR5cGUgaXMgYSAiaG9vayB0eXBlIiAtIDAgZm9yIGluY29taW5nIHBhY2tldHMsIDEgZm9yIG91dGdvaW5nCisgKiBwYWNrZXRzLCBhbmQgMiBmb3IgcGFja2V0cyBhcnJpdmluZyBmcm9tIGFub3RoZXIgem9uZSBvbiB0aGUgc2FtZQorICogbWFjaGluZS4KKyAqCisgKiBkbGlfcGt0bGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldCBkYXRhIGZvbGxvd2luZyB0aGUgcHNldWRvLWhlYWRlcgorICogKHNvIHRoZSBjYXB0dXJlZCBsZW5ndGggbWludXMgZGxpX3BrdGxlbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZQorICogcHNldWRvLWhlYWRlciwgYXNzdW1pbmcgdGhlIGVudGlyZSBwc2V1ZG8taGVhZGVyIHdhcyBjYXB0dXJlZCkuCisgKgorICogZGxpX2lmaW5kZXggaXMgdGhlIGludGVyZmFjZSBpbmRleCBvZiB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZQorICogcGFja2V0IGFycml2ZWQuCisgKgorICogZGxpX2dyaWZpbmRleCBpcyB0aGUgZ3JvdXAgaW50ZXJmYWNlIGluZGV4IG51bWJlciAoZm9yIElQTVAgaW50ZXJmYWNlcykuCisgKgorICogZGxpX3pzcmMgaXMgdGhlIHpvbmUgaWRlbnRpZmllciBmb3IgdGhlIHNvdXJjZSBvZiB0aGUgcGFja2V0LgorICoKKyAqIGRsaV96ZHN0IGlzIHRoZSB6b25lIGlkZW50aWZpZXIgZm9yIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcGFja2V0LgorICoKKyAqIEEgem9uZSBudW1iZXIgb2YgMCBpcyB0aGUgZ2xvYmFsIHpvbmU7IGEgem9uZSBudW1iZXIgb2YgMHhmZmZmZmZmZgorICogbWVhbnMgdGhhdCB0aGUgcGFja2V0IGFycml2ZWQgZnJvbSBhbm90aGVyIGhvc3Qgb24gdGhlIG5ldHdvcmssIG5vdAorICogZnJvbSBhbm90aGVyIHpvbmUgb24gdGhlIHNhbWUgbWFjaGluZS4KKyAqCisgKiBBbiBJUHY0IG9yIElQdjYgZGF0YWdyYW0gZm9sbG93cyB0aGUgcHNldWRvLWhlYWRlcjsgZGxpX2ZhbWlseSBpbmRpY2F0ZXMKKyAqIHdoaWNoIG9mIHRob3NlIGl0IGlzLgorICovCisjZGVmaW5lIExJTktUWVBFX0lQTkVUCQkyMjYKKworLyoKKyAqIENBTiAoQ29udHJvbGxlciBBcmVhIE5ldHdvcmspIGZyYW1lcywgd2l0aCBhIHBzZXVkby1oZWFkZXIgYXMgc3VwcGxpZWQKKyAqIGJ5IExpbnV4IFNvY2tldENBTi4gIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dCBpbiB0aGUgTGludXgKKyAqIHNvdXJjZS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgRmVsaXggT2Jlbmh1YmVyIDxmZWxpeEBvYmVuaHViZXIuZGU+LgorICovCisjZGVmaW5lIExJTktUWVBFX0NBTl9TT0NLRVRDQU4JMjI3CisKKy8qCisgKiBSYXcgSVB2NC9JUHY2OyBkaWZmZXJlbnQgZnJvbSBETFRfUkFXIGluIHRoYXQgdGhlIERMVF8gdmFsdWUgc3BlY2lmaWVzCisgKiB3aGV0aGVyIGl0J3MgdjQgb3IgdjYuICBSZXF1ZXN0ZWQgYnkgRGFycmVuIFJlZWQgPERhcnJlbi5SZWVkQFN1bi5DT00+LgorICovCisjZGVmaW5lIExJTktUWVBFX0lQVjQJCTIyOAorI2RlZmluZSBMSU5LVFlQRV9JUFY2CQkyMjkKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpLCBhbmQgd2l0aCBubyBGQ1MgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWU7IHJlcXVlc3RlZCBieQorICogSm9uIFNtaXJsIDxqb25zbWlybEBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX0lFRUU4MDJfMTVfNF9OT0ZDUwkJMjMwCisKKy8qCisgKiBSYXcgRC1CdXM6CisgKgorICoJaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvd2lraS9Tb2Z0d2FyZS9kYnVzCisgKgorICogbWVzc2FnZXM6CisgKgorICoJaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNtZXNzYWdlLXByb3RvY29sLW1lc3NhZ2VzCisgKgorICogc3RhcnRpbmcgd2l0aCB0aGUgZW5kaWFubmVzcyBmbGFnLCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZSB0eXBlLCBldGMuLAorICogYnV0IHdpdGhvdXQgdGhlIGF1dGhlbnRpY2F0aW9uIGhhbmRzaGFrZSBiZWZvcmUgdGhlIG1lc3NhZ2Ugc2VxdWVuY2U6CisgKgorICoJaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNhdXRoLXByb3RvY29sCisgKgorICogUmVxdWVzdGVkIGJ5IE1hcnRpbiBWaWRuZXIgPG1hcnRpbkB2aWRuZXIubmV0Pi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9EQlVTCQkyMzEKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uIAorICovCisjZGVmaW5lIExJTktUWVBFX0pVTklQRVJfVlMJCQkyMzIKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9TUlhfRTJFCQkyMzMKKyNkZWZpbmUgTElOS1RZUEVfSlVOSVBFUl9GSUJSRUNIQU5ORUwJCTIzNAorCisvKgorICogRFZCLUNJIChEVkIgQ29tbW9uIEludGVyZmFjZSBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGEgUEMgQ2FyZAorICogbW9kdWxlIGFuZCBhIERWQiByZWNlaXZlcikuICBTZWUKKyAqCisgKglodHRwOi8vd3d3LmthaXNlci5jeC9wY2FwLWR2YmNpLmh0bWwKKyAqCisgKiBmb3IgdGhlIHNwZWNpZmljYXRpb24uCisgKgorICogUmVxdWVzdGVkIGJ5IE1hcnRpbiBLYWlzZXIgPG1hcnRpbkBrYWlzZXIuY3g+LgorICovCisjZGVmaW5lIExJTktUWVBFX0RWQl9DSQkJMjM1CisKKy8qCisgKiBWYXJpYW50IG9mIDNHUFAgVFMgMjcuMDEwIG11bHRpcGxleGluZyBwcm90b2NvbC4gIFJlcXVlc3RlZAorICogYnkgSGFucy1DaHJpc3RvcGggU2NoZW1tZWwgPGhhbnMtY2hyaXN0b3BoLnNjaGVtbWVsQGNpbnRlcmlvbi5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX01VWDI3MDEwCTIzNgorCisvKgorICogU1RBTkFHIDUwNjYgRF9QRFVzLiAgUmVxdWVzdGVkIGJ5IE0uIEJhcmlzIERlbWlyYXkKKyAqIDxiYXJpc2RlbWlyYXlAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9TVEFOQUdfNTA2Nl9EX1BEVQkJMjM3CisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKKyAqLworI2RlZmluZSBMSU5LVFlQRV9KVU5JUEVSX0FUTV9DRU1JQwkJMjM4CisKKy8qCisgKiBOZXRGaWx0ZXIgTE9HIG1lc3NhZ2VzIAorICogKHBheWxvYWQgb2YgbmV0bGluayBORk5MX1NVQlNZU19VTE9HL05GVUxOTF9NU0dfUEFDS0VUIHBhY2tldHMpCisgKgorICogUmVxdWVzdGVkIGJ5IEpha3ViIFphd2FkemtpIDxkYXJramFtZXMtd3NAZGFya2phbWVzLnBsPgorICovCisjZGVmaW5lIExJTktUWVBFX05GTE9HCQkyMzkKKworLyoKKyAqIEhpbHNjaGVyIEdlc2VsbHNjaGFmdCBmdWVyIFN5c3RlbWF1dG9tYXRpb24gbWJIIGxpbmstbGF5ZXIgdHlwZQorICogZm9yIEV0aGVybmV0IHBhY2tldHMgd2l0aCBhIDQtYnl0ZSBwc2V1ZG8taGVhZGVyIGFuZCBhbHdheXMKKyAqIHdpdGggdGhlIHBheWxvYWQgaW5jbHVkaW5nIHRoZSBGQ1MsIGFzIHN1cHBsaWVkIGJ5IHRoZWlyCisgKiBuZXRBTkFMWVpFUiBoYXJkd2FyZSBhbmQgc29mdHdhcmUuCisgKgorICogUmVxdWVzdGVkIGJ5IEhvbGdlciBQLiBGcm9tbWVyIDxIUGZyb21tZXJAaGlsc2NoZXIuY29tPgorICovCisjZGVmaW5lIExJTktUWVBFX05FVEFOQUxZWkVSCTI0MAorCisvKgorICogSGlsc2NoZXIgR2VzZWxsc2NoYWZ0IGZ1ZXIgU3lzdGVtYXV0b21hdGlvbiBtYkggbGluay1sYXllciB0eXBlCisgKiBmb3IgRXRoZXJuZXQgcGFja2V0cyB3aXRoIGEgNC1ieXRlIHBzZXVkby1oZWFkZXIgYW5kIEZDUyBhbmQKKyAqIDEgYnl0ZSBvZiBTRkQsIGFzIHN1cHBsaWVkIGJ5IHRoZWlyIG5ldEFOQUxZWkVSIGhhcmR3YXJlIGFuZAorICogc29mdHdhcmUuCisgKgorICogUmVxdWVzdGVkIGJ5IEhvbGdlciBQLiBGcm9tbWVyIDxIUGZyb21tZXJAaGlsc2NoZXIuY29tPgorICovCisjZGVmaW5lIExJTktUWVBFX05FVEFOQUxZWkVSX1RSQU5TUEFSRU5UCTI0MQorCisvKgorICogSVAtb3Zlci1JbmZpbmliYW5kLCBhcyBzcGVjaWZpZWQgYnkgUkZDIDQzOTEuCisgKgorICogUmVxdWVzdGVkIGJ5IFBldHIgU3VtYmVyYSA8cGV0ci5zdW1iZXJhQG9yYWNsZS5jb20+LgorICovCisjZGVmaW5lIExJTktUWVBFX0lQT0lCCQkyNDIKKworLyoKKyAqIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtIChJU08gMTM4MTgtMS9JVFUtVCBILjIyMi4wKS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgR3V5IE1hcnRpbiA8Z21zb2Z0QHR1eGljb21hbi5iZT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTVBFR18yX1RTCTI0MworCisvKgorICogbmc0VCBHbWJIJ3MgVU1UUyBJdWIvSXVyLW92ZXItQVRNIGFuZCBJdWIvSXVyLW92ZXItSVAgZm9ybWF0IGFzCisgKiB1c2VkIGJ5IHRoZWlyIG5nNDAgcHJvdG9jb2wgdGVzdGVyLgorICoKKyAqIFJlcXVlc3RlZCBieSBKZW5zIEdyaW1tZXIgPGplbnMuZ3JpbW1lckBuZzR0LmNvbT4uCisgKi8KKyNkZWZpbmUgTElOS1RZUEVfTkc0MAkJMjQ0CisKKy8qCisgKiBQc2V1ZG8taGVhZGVyIGdpdmluZyBhZGFwdGVyIG51bWJlciBhbmQgZmxhZ3MsIGZvbGxvd2VkIGJ5IGFuIE5GQworICogKE5lYXItRmllbGQgQ29tbXVuaWNhdGlvbnMpIExvZ2ljYWwgTGluayBDb250cm9sIFByb3RvY29sIChMTENQKSBQRFUsCisgKiBhcyBzcGVjaWZpZWQgYnkgTkZDIEZvcnVtIExvZ2ljYWwgTGluayBDb250cm9sIFByb3RvY29sIFRlY2huaWNhbAorICogU3BlY2lmaWNhdGlvbiBMTENQIDEuMS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgTWlrZSBXYWtlcmx5IDxtaWtleUBnb29nbGUuY29tPi4KKyAqLworI2RlZmluZSBMSU5LVFlQRV9ORkNfTExDUAkyNDUKKworLyoKKyAqIHBmc3luYyBvdXRwdXQ7IERMVF9QRlNZTkMgaXMgMTgsIHdoaWNoIGNvbGxpZGVzIHdpdGggRExUX0NJUCBpbgorICogU3VTRSA2LjMsIG9uIE9wZW5CU0QsIE5ldEJTRCwgRHJhZ29uRmx5IEJTRCwgYW5kIE1hYyBPUyBYLCBhbmQKKyAqIGlzIDEyMSwgd2hpY2ggY29sbGlkZXMgd2l0aCBETFRfSEhETEMsIGluIEZyZWVCU0QuICBXZSBwaWNrIGEKKyAqIHNoaW55IG5ldyBsaW5rLWxheWVyIGhlYWRlciB0eXBlIHZhbHVlIHRoYXQgZG9lc24ndCBjb2xsaWRlIHdpdGgKKyAqIGFueXRoaW5nLCBpbiB0aGUgaG9wZXMgdGhhdCBmdXR1cmUgcGZzeW5jIHNhdmVmaWxlcywgaWYgYW55LAorICogd29uJ3QgcmVxdWlyZSBzcGVjaWFsIGhhY2tzIHRvIGRpc3Rpbmd1aXNoIGZyb20gb3RoZXIgc2F2ZWZpbGVzLgorICoKKyAqLworI2RlZmluZSBMSU5LVFlQRV9QRlNZTkMJCTI0NgorCisjZGVmaW5lIExJTktUWVBFX01BVENISU5HX01BWAkyNDYJCS8qIGhpZ2hlc3QgdmFsdWUgaW4gdGhlICJtYXRjaGluZyIgcmFuZ2UgKi8KKworc3RhdGljIHN0cnVjdCBsaW5rdHlwZV9tYXAgeworCWludAlkbHQ7CisJaW50CWxpbmt0eXBlOworfSBtYXBbXSA9IHsKKwkvKgorCSAqIFRoZXNlIERMVF8qIGNvZGVzIGhhdmUgTElOS1RZUEVfKiBjb2RlcyB3aXRoIHZhbHVlcyBpZGVudGljYWwKKwkgKiB0byB0aGUgdmFsdWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIERMVF8qIGNvZGUuCisJICovCisJeyBETFRfTlVMTCwJCUxJTktUWVBFX05VTEwgfSwKKwl7IERMVF9FTjEwTUIsCQlMSU5LVFlQRV9FVEhFUk5FVCB9LAorCXsgRExUX0VOM01CLAkJTElOS1RZUEVfRVhQX0VUSEVSTkVUIH0sCisJeyBETFRfQVgyNSwJCUxJTktUWVBFX0FYMjUgfSwKKwl7IERMVF9QUk9ORVQsCQlMSU5LVFlQRV9QUk9ORVQgfSwKKwl7IERMVF9DSEFPUywJCUxJTktUWVBFX0NIQU9TIH0sCisJeyBETFRfSUVFRTgwMiwJCUxJTktUWVBFX0lFRUU4MDJfNSB9LAorCXsgRExUX0FSQ05FVCwJCUxJTktUWVBFX0FSQ05FVF9CU0QgfSwKKwl7IERMVF9TTElQLAkJTElOS1RZUEVfU0xJUCB9LAorCXsgRExUX1BQUCwJCUxJTktUWVBFX1BQUCB9LAorCXsgRExUX0ZEREksCSAJTElOS1RZUEVfRkRESSB9LAorCXsgRExUX1NZTUFOVEVDX0ZJUkVXQUxMLCBMSU5LVFlQRV9TWU1BTlRFQ19GSVJFV0FMTCB9LAorCisJLyoKKwkgKiBUaGVzZSBETFRfKiBjb2RlcyBoYXZlIGRpZmZlcmVudCB2YWx1ZXMgb24gZGlmZmVyZW50CisJICogcGxhdGZvcm1zOyB3ZSBtYXAgdGhlbSB0byBMSU5LVFlQRV8qIGNvZGVzIHRoYXQKKwkgKiBoYXZlIHZhbHVlcyB0aGF0IHNob3VsZCBuZXZlciBiZSBlcXVhbCB0byBhbnkgRExUXyoKKwkgKiBjb2RlLgorCSAqLworI2lmZGVmIERMVF9GUgorCS8qIEJTRC9PUyBGcmFtZSBSZWxheSAqLworCXsgRExUX0ZSLAkJTElOS1RZUEVfRlJFTEFZIH0sCisjZW5kaWYKKworCXsgRExUX0FUTV9SRkMxNDgzLCAJTElOS1RZUEVfQVRNX1JGQzE0ODMgfSwKKwl7IERMVF9SQVcsCQlMSU5LVFlQRV9SQVcgfSwKKwl7IERMVF9TTElQX0JTRE9TLAlMSU5LVFlQRV9TTElQX0JTRE9TIH0sCisJeyBETFRfUFBQX0JTRE9TLAlMSU5LVFlQRV9QUFBfQlNET1MgfSwKKworCS8qIEJTRC9PUyBDaXNjbyBIRExDICovCisJeyBETFRfQ19IRExDLAkJTElOS1RZUEVfQ19IRExDIH0sCisKKwkvKgorCSAqIFRoZXNlIERMVF8qIGNvZGVzIGFyZSBub3Qgb24gYWxsIHBsYXRmb3JtcywgYnV0LCBzbyBmYXIsCisJICogdGhlcmUgZG9uJ3QgYXBwZWFyIHRvIGJlIGFueSBwbGF0Zm9ybXMgdGhhdCBkZWZpbmUKKwkgKiBvdGhlciBjb2RlcyB3aXRoIHRob3NlIHZhbHVlczsgd2UgbWFwIHRoZW0gdG8KKwkgKiBkaWZmZXJlbnQgTElOS1RZUEVfKiB2YWx1ZXMgYW55d2F5LCBqdXN0IGluIGNhc2UuCisJICovCisKKwkvKiBMaW51eCBBVE0gQ2xhc3NpY2FsIElQICovCisJeyBETFRfQVRNX0NMSVAsCQlMSU5LVFlQRV9BVE1fQ0xJUCB9LAorCisJLyogTmV0QlNEIHN5bmMvYXN5bmMgc2VyaWFsIFBQUCAob3IgQ2lzY28gSERMQykgKi8KKwl7IERMVF9QUFBfU0VSSUFMLAlMSU5LVFlQRV9QUFBfSERMQyB9LAorCisJLyogTmV0QlNEIFBQUCBvdmVyIEV0aGVybmV0ICovCisJeyBETFRfUFBQX0VUSEVSLAlMSU5LVFlQRV9QUFBfRVRIRVIgfSwKKworCS8qCisJICogQWxsIExJTktUWVBFXyB2YWx1ZXMgYmV0d2VlbiBMSU5LVFlQRV9NQVRDSElOR19NSU4KKwkgKiBhbmQgTElOS1RZUEVfTUFUQ0hJTkdfTUFYIGFyZSBtYXBwZWQgdG8gaWRlbnRpY2FsCisJICogRExUXyB2YWx1ZXMuCisJICovCisKKwl7IC0xLAkJCS0xIH0KK307CisKK2ludAorZGx0X3RvX2xpbmt0eXBlKGludCBkbHQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIE1hcCBETFRfUEZTWU5DLCB3aGF0ZXZlciBpdCBtaWdodCBiZSwgdG8gTElOS1RZUEVfUEZTWU5DLgorCSAqLworCWlmIChkbHQgPT0gRExUX1BGU1lOQykKKwkJcmV0dXJuIChMSU5LVFlQRV9QRlNZTkMpOworCisJLyoKKwkgKiBNYXAgdGhlIHZhbHVlcyBpbiB0aGUgbWF0Y2hpbmcgcmFuZ2UuCisJICovCisJaWYgKGRsdCA+PSBETFRfTUFUQ0hJTkdfTUlOICYmIGRsdCA8PSBETFRfTUFUQ0hJTkdfTUFYKQorCQlyZXR1cm4gKGRsdCk7CisKKwkvKgorCSAqIE1hcCB0aGUgdmFsdWVzIG91dHNpZGUgdGhhdCByYW5nZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBtYXBbaV0uZGx0ICE9IC0xOyBpKyspIHsKKwkJaWYgKG1hcFtpXS5kbHQgPT0gZGx0KQorCQkJcmV0dXJuIChtYXBbaV0ubGlua3R5cGUpOworCX0KKworCS8qCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIG1hcHBpbmcgZm9yIHRoaXMgRExUXyBjb2RlLCByZXR1cm4gYW4KKwkgKiBlcnJvcjsgdGhhdCBtZWFucyB0aGF0IHRoaXMgaXMgYSB2YWx1ZSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcKKwkgKiBMSU5LVFlQRV8gY29kZSwgYW5kIHdlIG5lZWQgdG8gYXNzaWduIG9uZS4KKwkgKi8KKwlyZXR1cm4gKC0xKTsKK30KKworaW50CitsaW5rdHlwZV90b19kbHQoaW50IGxpbmt0eXBlKQoreworCWludCBpOworCisJLyoKKwkgKiBNYXAgTElOS1RZUEVfUEZTWU5DIHRvIERMVF9QRlNZTkMsIHdoYXRldmVyIGl0IG1pZ2h0IGJlLgorCSAqIExJTktUWVBFX1BGU1lOQyBpcyBpbiB0aGUgbWF0Y2hpbmcgcmFuZ2UsIHRvIG1ha2Ugc3VyZQorCSAqIGl0J3MgYXMgc2FmZSBmcm9tIHJldXNlIGFzIHdlIGNhbiBhcnJhbmdlLCBzbyB3ZSBkbworCSAqIHRoaXMgdGVzdCBmaXJzdC4KKwkgKi8KKwlpZiAobGlua3R5cGUgPT0gTElOS1RZUEVfUEZTWU5DKQorCQlyZXR1cm4gKERMVF9QRlNZTkMpOworCisJLyoKKwkgKiBNYXAgdGhlIHZhbHVlcyBpbiB0aGUgbWF0Y2hpbmcgcmFuZ2UuCisJICovCisJaWYgKGxpbmt0eXBlID49IExJTktUWVBFX01BVENISU5HX01JTiAmJgorCSAgICBsaW5rdHlwZSA8PSBMSU5LVFlQRV9NQVRDSElOR19NQVgpCisJCXJldHVybiAobGlua3R5cGUpOworCisJLyoKKwkgKiBNYXAgdGhlIHZhbHVlcyBvdXRzaWRlIHRoYXQgcmFuZ2UuCisJICovCisJZm9yIChpID0gMDsgbWFwW2ldLmxpbmt0eXBlICE9IC0xOyBpKyspIHsKKwkJaWYgKG1hcFtpXS5saW5rdHlwZSA9PSBsaW5rdHlwZSkKKwkJCXJldHVybiAobWFwW2ldLmRsdCk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIGFuIGVudHJ5IGZvciB0aGlzIGxpbmsgdHlwZSwgcmV0dXJuCisJICogdGhlIGxpbmsgdHlwZSB2YWx1ZTsgaXQgbWF5IGJlIGEgRExUXyB2YWx1ZSBmcm9tIGFuCisJICogb2xkZXIgdmVyc2lvbiBvZiBsaWJwY2FwLgorCSAqLworCXJldHVybiBsaW5rdHlwZTsKK30KKworLyoKKyAqIFRoZSBETFRfVVNCX0xJTlVYIGFuZCBETFRfVVNCX0xJTlVYX01NQVBQRUQgaGVhZGVycyBhcmUgaW4gaG9zdAorICogYnl0ZSBvcmRlciB3aGVuIGNhcHR1cmluZyAoaXQncyBzdXBwbGllZCBkaXJlY3RseSBmcm9tIGEKKyAqIG1lbW9yeS1tYXBwZWQgYnVmZmVyIHNoYXJlZCBieSB0aGUga2VybmVsKS4KKyAqCisgKiBXaGVuIHJlYWRpbmcgYSBETFRfVVNCX0xJTlVYIG9yIERMVF9VU0JfTElOVVhfTU1BUFBFRCBjYXB0dXJlIGZpbGUsCisgKiB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgZnJvbSB0aGUgY2FwdHVyaW5nIGhvc3QncyBieXRlIG9yZGVyIHRvCisgKiB0aGUgcmVhZGluZyBob3N0J3MgYnl0ZSBvcmRlci4KKyAqLwordm9pZAorc3dhcF9saW51eF91c2JfaGVhZGVyKGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqaGRyLCB1X2NoYXIgKmJ1ZiwKKyAgICBpbnQgaGVhZGVyX2xlbl82NF9ieXRlcykKK3sKKwlwY2FwX3VzYl9oZWFkZXJfbW1hcHBlZCAqdWhkciA9IChwY2FwX3VzYl9oZWFkZXJfbW1hcHBlZCAqKWJ1ZjsKKwlicGZfdV9pbnQzMiBvZmZzZXQgPSAwOworCXVzYl9pc29kZXNjICpwaXNvZGVzYzsKKwlpbnQzMl90IG51bWRlc2MsIGk7CisKKwkvKgorCSAqICJvZmZzZXQiIGlzIHRoZSBvZmZzZXQgKnBhc3QqIHRoZSBmaWVsZCB3ZSdyZSBzd2FwcGluZzsKKwkgKiB3ZSBza2lwIHRoZSBmaWVsZCAqYmVmb3JlKiBjaGVja2luZyB0byBtYWtlIHN1cmUKKwkgKiB0aGUgY2FwdHVyZWQgZGF0YSBsZW5ndGggaW5jbHVkZXMgdGhlIGVudGlyZSBmaWVsZC4KKwkgKi8KKworCS8qCisJICogVGhlIFVSQiBpZCBpcyBhIHRvdGFsbHkgb3BhcXVlIHZhbHVlOyBkbyB3ZSByZWFsbHkgbmVlZCB0byAKKwkgKiBjb252ZXJ0IGl0IHRvIHRoZSByZWFkaW5nIGhvc3QncyBieXRlIG9yZGVyPz8/CisJICovCisJb2Zmc2V0ICs9IDg7CQkJLyogc2tpcCBwYXN0IGlkICovCisJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQlyZXR1cm47CisJdWhkci0+aWQgPSBTV0FQTEwodWhkci0+aWQpOworCisJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHZhcmlvdXMgMS1ieXRlIGZpZWxkcyAqLworCisJb2Zmc2V0ICs9IDI7CQkJLyogc2tpcCBwYXN0IGJ1c19pZCAqLworCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJcmV0dXJuOworCXVoZHItPmJ1c19pZCA9IFNXQVBTSE9SVCh1aGRyLT5idXNfaWQpOworCisJb2Zmc2V0ICs9IDI7CQkJLyogc2tpcCBwYXN0IHZhcmlvdXMgMS1ieXRlIGZpZWxkcyAqLworCisJb2Zmc2V0ICs9IDg7CQkJLyogc2tpcCBwYXN0IHRzX3NlYyAqLworCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJcmV0dXJuOworCXVoZHItPnRzX3NlYyA9IFNXQVBMTCh1aGRyLT50c19zZWMpOworCisJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHRzX3VzZWMgKi8KKwlpZiAoaGRyLT5jYXBsZW4gPCBvZmZzZXQpCisJCXJldHVybjsKKwl1aGRyLT50c191c2VjID0gU1dBUExPTkcodWhkci0+dHNfdXNlYyk7CisKKwlvZmZzZXQgKz0gNDsJCQkvKiBza2lwIHBhc3Qgc3RhdHVzICovCisJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQlyZXR1cm47CisJdWhkci0+c3RhdHVzID0gU1dBUExPTkcodWhkci0+c3RhdHVzKTsKKworCW9mZnNldCArPSA0OwkJCS8qIHNraXAgcGFzdCB1cmJfbGVuICovCisJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQlyZXR1cm47CisJdWhkci0+dXJiX2xlbiA9IFNXQVBMT05HKHVoZHItPnVyYl9sZW4pOworCisJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IGRhdGFfbGVuICovCisJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQlyZXR1cm47CisJdWhkci0+ZGF0YV9sZW4gPSBTV0FQTE9ORyh1aGRyLT5kYXRhX2xlbik7CisKKwlpZiAodWhkci0+dHJhbnNmZXJfdHlwZSA9PSBVUkJfSVNPQ0hST05PVVMpIHsKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHMuaXNvLmVycm9yX2NvdW50ICovCisJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCXJldHVybjsKKwkJdWhkci0+cy5pc28uZXJyb3JfY291bnQgPSBTV0FQTE9ORyh1aGRyLT5zLmlzby5lcnJvcl9jb3VudCk7CisKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHMuaXNvLm51bWRlc2MgKi8KKwkJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQkJcmV0dXJuOworCQl1aGRyLT5zLmlzby5udW1kZXNjID0gU1dBUExPTkcodWhkci0+cy5pc28ubnVtZGVzYyk7CisJfSBlbHNlCisJCW9mZnNldCArPSA4OwkJCS8qIHNraXAgVVNCIHNldHVwIGhlYWRlciAqLworCisJaWYgKGhlYWRlcl9sZW5fNjRfYnl0ZXMpIHsKKwkJLyoKKwkJICogVGhpcyBpcyBlaXRoZXIgdGhlICJ2ZXJzaW9uIDEiIGhlYWRlciwgd2l0aAorCQkgKiAxNiBieXRlcyBvZiBhZGRpdGlvbmFsIGZpZWxkcyBhdCB0aGUgZW5kLCBvcgorCQkgKiBhICJ2ZXJzaW9uIDAiIGhlYWRlciBmcm9tIGEgbWVtb3J5LW1hcHBlZAorCQkgKiBjYXB0dXJlLCB3aXRoIDE2IGJ5dGVzIG9mIHplcm9lZC1vdXQgcGFkZGluZworCQkgKiBhdCB0aGUgZW5kLiAgQnl0ZSBzd2FwIHRoZW0gYXMgaWYgdGhpcyB3ZXJlCisJCSAqIGEgInZlcnNpb24gMSIgaGVhZGVyLgorCQkgKi8KKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IGludGVydmFsICovCisJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCXJldHVybjsKKwkJdWhkci0+aW50ZXJ2YWwgPSBTV0FQTE9ORyh1aGRyLT5pbnRlcnZhbCk7CisKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHN0YXJ0X2ZyYW1lICovCisJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCXJldHVybjsKKwkJdWhkci0+c3RhcnRfZnJhbWUgPSBTV0FQTE9ORyh1aGRyLT5zdGFydF9mcmFtZSk7CisKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IHhmZXJfZmxhZ3MgKi8KKwkJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQkJcmV0dXJuOworCQl1aGRyLT54ZmVyX2ZsYWdzID0gU1dBUExPTkcodWhkci0+eGZlcl9mbGFncyk7CisKKwkJb2Zmc2V0ICs9IDQ7CQkJLyogc2tpcCBwYXN0IG5kZXNjICovCisJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCXJldHVybjsKKwkJdWhkci0+bmRlc2MgPSBTV0FQTE9ORyh1aGRyLT5uZGVzYyk7CisJfQkKKworCWlmICh1aGRyLT50cmFuc2Zlcl90eXBlID09IFVSQl9JU09DSFJPTk9VUykgeworCQkvKiBzd2FwIHRoZSB2YWx1ZXMgaW4gc3RydWN0IGxpbnV4X3VzYl9pc29kZXNjICovCisJCXBpc29kZXNjID0gKHVzYl9pc29kZXNjICopKHZvaWQgKikoYnVmK29mZnNldCk7CisJCW51bWRlc2MgPSB1aGRyLT5zLmlzby5udW1kZXNjOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtZGVzYzsgaSsrKSB7CisJCQlvZmZzZXQgKz0gNDsJCS8qIHNraXAgcGFzdCBzdGF0dXMgKi8KKwkJCWlmIChoZHItPmNhcGxlbiA8IG9mZnNldCkKKwkJCQlyZXR1cm47CisJCQlwaXNvZGVzYy0+c3RhdHVzID0gU1dBUExPTkcocGlzb2Rlc2MtPnN0YXR1cyk7CisKKwkJCW9mZnNldCArPSA0OwkJLyogc2tpcCBwYXN0IG9mZnNldCAqLworCQkJaWYgKGhkci0+Y2FwbGVuIDwgb2Zmc2V0KQorCQkJCXJldHVybjsKKwkJCXBpc29kZXNjLT5vZmZzZXQgPSBTV0FQTE9ORyhwaXNvZGVzYy0+b2Zmc2V0KTsKKworCQkJb2Zmc2V0ICs9IDQ7CQkvKiBza2lwIHBhc3QgbGVuICovCisJCQlpZiAoaGRyLT5jYXBsZW4gPCBvZmZzZXQpCisJCQkJcmV0dXJuOworCQkJcGlzb2Rlc2MtPmxlbiA9IFNXQVBMT05HKHBpc29kZXNjLT5sZW4pOworCisJCQlvZmZzZXQgKz0gNDsJCS8qIHNraXAgcGFzdCBwYWRkaW5nICovCisKKwkJCXBpc29kZXNjKys7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtY29tbW9uLmggYi9saWJwY2FwLTEuMy4wL3BjYXAtY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4MGJhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1jb21tb24uaApAQCAtMCwwICsxLDI1IEBACisKKy8qCisgKiBXZSB1c2UgdGhlICJyZWNlaXZlci1tYWtlcy1yaWdodCIgYXBwcm9hY2ggdG8gYnl0ZSBvcmRlciwKKyAqIGJlY2F1c2UgdGltZSBpcyBhdCBhIHByZW1pdW0gd2hlbiB3ZSBhcmUgd3JpdGluZyB0aGUgZmlsZS4KKyAqIEluIG90aGVyIHdvcmRzLCB0aGUgcGNhcF9maWxlX2hlYWRlciBhbmQgcGNhcF9wa3RoZHIsCisgKiByZWNvcmRzIGFyZSB3cml0dGVuIGluIGhvc3QgYnl0ZSBvcmRlci4KKyAqIE5vdGUgdGhhdCB0aGUgYnl0ZXMgb2YgcGFja2V0IGRhdGEgYXJlIHdyaXR0ZW4gb3V0IGluIHRoZSBvcmRlciBpbgorICogd2hpY2ggdGhleSB3ZXJlIHJlY2VpdmVkLCBzbyBtdWx0aS1ieXRlIGZpZWxkcyBpbiBwYWNrZXRzIGFyZSBub3QKKyAqIHdyaXR0ZW4gaW4gaG9zdCBieXRlIG9yZGVyLCB0aGV5J3JlIHdyaXR0ZW4gaW4gd2hhdGV2ZXIgb3JkZXIgdGhlCisgKiBzZW5kaW5nIG1hY2hpbmUgcHV0IHRoZW0gaW4uCisgKgorICogbnRvaFtsc10gYXJlbid0IHN1ZmZpY2llbnQgYmVjYXVzZSB3ZSBtaWdodCBuZWVkIHRvIHN3YXAgb24gYSBiaWctZW5kaWFuCisgKiBtYWNoaW5lIChpZiB0aGUgZmlsZSB3YXMgd3JpdHRlbiBpbiBsaXR0bGUtZW5kIG9yZGVyKS4KKyAqLworI2RlZmluZQlTV0FQTE9ORyh5KSBcCisoKCgoeSkmMHhmZik8PDI0KSB8ICgoKHkpJjB4ZmYwMCk8PDgpIHwgKCgoeSkmMHhmZjAwMDApPj44KSB8ICgoKHkpPj4yNCkmMHhmZikpCisjZGVmaW5lCVNXQVBTSE9SVCh5KSBcCisJKCAoKCh5KSYweGZmKTw8OCkgfCAoKHVfc2hvcnQpKCh5KSYweGZmMDApPj44KSApCisKK2V4dGVybiBpbnQgZGx0X3RvX2xpbmt0eXBlKGludCBkbHQpOworCitleHRlcm4gaW50IGxpbmt0eXBlX3RvX2RsdChpbnQgbGlua3R5cGUpOworCitleHRlcm4gdm9pZCBzd2FwX2xpbnV4X3VzYl9oZWFkZXIoY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoZHIsIHVfY2hhciAqYnVmLAorICAgIGludCBoZWFkZXJfbGVuXzY0X2J5dGVzKTsKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1jb25maWcuMSBiL2xpYnBjYXAtMS4zLjAvcGNhcC1jb25maWcuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFmNDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLWNvbmZpZy4xCkBAIC0wLDAgKzEsNzQgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtY29uZmlnLjEsdiAxLjEgMjAwOC0wOS0yMyAxODowNDowMSBndXkgRXhwICQgKExCTCkKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVAtQ09ORklHIDEgIjI2IE1hcmNoIDIwMDkiCisuU0ggTkFNRQorcGNhcC1jb25maWcgXC0gd3JpdGUgbGlicGNhcCBjb21waWxlciBhbmQgbGlua2VyIGZsYWdzIHRvIHN0YW5kYXJkIG91dHB1dAorLlNIIFNZTk9QU0lTCisubmEKKy5CIHBjYXAtY29uZmlnCitbCisuQiBcLVwtc3RhdGljCitdCitbCisuQiBcLVwtY2ZsYWdzIHwgXC1cLWxpYnMgfCBcLVwtYWRkaXRpb25hbC1saWJzCitdCisuYWQKKy5TSCBERVNDUklQVElPTgorLkxQCitXaGVuIHJ1biB3aXRoIHRoZQorLkIgXC1cLWNmbGFncworb3B0aW9uLAorLkkgcGNhcC1jb25maWcKK3dyaXRlcyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IHRoZQorLkIgXC1JCitjb21waWxlciBmbGFncyByZXF1aXJlZCB0byBpbmNsdWRlIGxpYnBjYXAncyBoZWFkZXIgZmlsZXMuCitXaGVuIHJ1biB3aXRoIHRoZQorLkIgXC1cLWxpYnMKK29wdGlvbiwKKy5JIHBjYXAtY29uZmlnCit3cml0ZXMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCB0aGUKKy5CIFwtTAorYW5kCisuQiBcLWwKK2xpbmtlciBmbGFncyByZXF1aXJlZCB0byBsaW5rIHdpdGggbGlicGNhcCwgaW5jbHVkaW5nCisuQiBcLWwKK2ZsYWdzIGZvciBsaWJyYXJpZXMgcmVxdWlyZWQgYnkgbGlicGNhcC4KK1doZW4gcnVuIHdpdGggdGhlCisuQiBcLVwtYWRkaXRpb25hbC1saWJzCitvcHRpb24sCisuSSBwY2FwLWNvbmZpZword3JpdGVzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgdGhlCisuQiBcLUwKK2FuZAorLkIgXC1sCitmbGFncyBmb3IgbGlicmFyaWVzIHJlcXVpcmVkIGJ5IGxpYnBjYXAsIGJ1dCBub3QgdGhlCisuQiBcLWxwY2FwCitmbGFnIHRvIGxpbmsgd2l0aCBsaWJwY2FwIGl0c2VsZi4KKy5MUAorQnkgZGVmYXVsdCwgaXQgd3JpdGVzIGZsYWdzIGFwcHJvcHJpYXRlIGZvciBjb21waWxpbmcgd2l0aCBhCitkeW5hbWljYWxseS1saW5rZWQgdmVyc2lvbiBvZiBsaWJwY2FwOyB0aGUKKy5CIFwtXC1zdGF0aWMKK2ZsYWcgY2F1c2VzIGl0IHRvIHdyaXRlIGZsYWdzIGFwcHJvcHJpYXRlIGZvciBjb21waWxpbmcgd2l0aCBhCitzdGF0aWNhbGx5LWxpbmtlZCB2ZXJzaW9uIG9mIGxpYnBjYXAuCisuU0ggIlNFRSBBTFNPIgorcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1jb25maWcuaW4gYi9saWJwY2FwLTEuMy4wL3BjYXAtY29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmJlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtY29uZmlnLmluCkBAIC0wLDAgKzEsODkgQEAKKyMhIC9iaW4vc2gKKworIworIyBTY3JpcHQgdG8gZ2l2ZSB0aGUgYXBwcm9wcmlhdGUgY29tcGlsZXIgZmxhZ3MgYW5kIGxpbmtlciBmbGFncworIyB0byB1c2Ugd2hlbiBidWlsZGluZyBjb2RlIHRoYXQgdXNlcyBsaWJwY2FwLgorIworcHJlZml4PSJAcHJlZml4QCIKK2V4ZWNfcHJlZml4PSJAZXhlY19wcmVmaXhAIgoraW5jbHVkZWRpcj0iQGluY2x1ZGVkaXJAIgorbGliZGlyPSJAbGliZGlyQCIKK1ZfUlBBVEhfT1BUPSJAVl9SUEFUSF9PUFRAIgorTElCUz0iQExJQlNAIgorCitzdGF0aWM9MAorc2hvd19jZmxhZ3M9MAorc2hvd19saWJzPTAKK3doaWxlIFsgIiQjIiAhPSAwIF0KK2RvCisJY2FzZSAiJDEiIGluCisKKwktLXN0YXRpYykKKwkJc3RhdGljPTEKKwkJOzsKKworCS0tY2ZsYWdzKQorCQlzaG93X2NmbGFncz0xCisJCTs7CisKKwktLWxpYnMpCisJCXNob3dfbGlicz0xCisJCTs7CisKKwktLWFkZGl0aW9uYWwtbGlicykKKwkJc2hvd19hZGRpdGlvbmFsX2xpYnM9MQorCQk7OworCWVzYWMKKwlzaGlmdAorZG9uZQoraWYgWyAiJFZfUlBBVEhfT1BUIiAhPSAiIiBdCit0aGVuCisJIworCSMgSWYgbGliZGlyIGlzbid0IC91c3IvbGliLCBhZGQgaXQgdG8gdGhlIHJ1bi10aW1lIGxpbmtlciBwYXRoLgorCSMKKwlpZiBbICIkbGliZGlyIiAhPSAiL3Vzci9saWIiIF0KKwl0aGVuCisJCVJQQVRIPSRWX1JQQVRIX09QVCRsaWJkaXIKKwlmaQorZmkKK2lmIFsgIiRzdGF0aWMiID0gMSBdCit0aGVuCisJIworCSMgSW5jbHVkZSBMSUJTIHNvIHRoYXQgdGhlIGZsYWdzIGluY2x1ZGUgbGlicmFyaWVzIGNvbnRhaW5pbmcKKwkjIHJvdXRpbmVzIHRoYXQgbGlicGNhcCB1c2VzLgorCSMKKwlpZiBbICIkc2hvd19jZmxhZ3MiID0gMSAtYSAiJHNob3dfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIgLUwkbGliZGlyIC1scGNhcCAkTElCUyIKKwllbGlmIFsgIiRzaG93X2NmbGFncyIgPSAxIC1hICIkc2hvd19hZGRpdGlvbmFsX2xpYnMiID0gMSBdCisJdGhlbgorCQllY2hvICItSSRpbmNsdWRlZGlyIC1MJGxpYmRpciAkTElCUyIKKwllbGlmIFsgIiRzaG93X2NmbGFncyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIiCisJZWxpZiBbICIkc2hvd19saWJzIiA9IDEgXQorCXRoZW4KKwkJZWNobyAiLUwkbGliZGlyIC1scGNhcCAkTElCUyIKKwllbGlmIFsgIiRzaG93X2FkZGl0aW9uYWxfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIiRMSUJTIgorCWZpCitlbHNlCisJIworCSMgT21pdCBMSUJTIC0gbGlicGNhcCBpcyBhc3N1bWVkIHRvIGJlIGxpbmtlZCB3aXRoIHRob3NlCisJIyBsaWJyYXJpZXMsIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byBkbyBzbyBleHBsaWNpdGx5LgorCSMKKwlpZiBbICIkc2hvd19jZmxhZ3MiID0gMSAtYSAiJHNob3dfbGlicyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIgLUwkbGliZGlyICRSUEFUSCAtbHBjYXAiCisJZWxpZiBbICIkc2hvd19jZmxhZ3MiID0gMSAtYSAiJHNob3dfYWRkaXRpb25hbF9saWJzIiA9IDEgXQorCXRoZW4KKwkJZWNobyAiLUkkaW5jbHVkZWRpciIKKwllbGlmIFsgIiRzaG93X2NmbGFncyIgPSAxIF0KKwl0aGVuCisJCWVjaG8gIi1JJGluY2x1ZGVkaXIiCisJZWxpZiBbICIkc2hvd19saWJzIiA9IDEgXQorCXRoZW4KKwkJZWNobyAiLUwkbGliZGlyICRSUEFUSCAtbHBjYXAiCisJZmkKK2ZpCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtZGFnLmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtZGFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkZTA2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1kYWcuYwpAQCAtMCwwICsxLDExNDEgQEAKKy8qCisgKiBwY2FwLWRhZy5jOiBQYWNrZXQgY2FwdHVyZSBpbnRlcmZhY2UgZm9yIEVuZGFjZSBEQUcgY2FyZC4KKyAqCisgKiBUaGUgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIGNvZGUgYXR0ZW1wdHMgdG8gbWltaWMgdGhhdCBvZiBwY2FwLWxpbnV4IGFzIG11Y2gKKyAqIGFzIHBvc3NpYmxlLiAgVGhpcyBjb2RlIGlzIGNvbXBpbGVkIGluIHNldmVyYWwgZGlmZmVyZW50IHdheXMgZGVwZW5kaW5nIG9uCisgKiB3aGV0aGVyIERBR19PTkxZIGFuZCBIQVZFX0RBR19BUEkgYXJlIGRlZmluZWQuICBJZiBIQVZFX0RBR19BUEkgaXMgbm90CisgKiBkZWZpbmVkIGl0IHNob3VsZCBub3QgZ2V0IGNvbXBpbGVkIGluLCBvdGhlcndpc2UgaWYgREFHX09OTFkgaXMgZGVmaW5lZCB0aGVuCisgKiB0aGUgJ2RhZ18nIGZ1bmN0aW9uIGNhbGxzIGFyZSByZW5hbWVkIHRvICdwY2FwXycgZXF1aXZhbGVudHMuICBJZiBEQUdfT05MWQorICogaXMgbm90IGRlZmluZWQgdGhlbiBub3RoaW5nIGlzIGFsdGVyZWQgLSB0aGUgZGFnXyBmdW5jdGlvbnMgd2lsbCBiZQorICogY2FsbGVkIGFzIHJlcXVpcmVkIGZyb20gdGhlaXIgcGNhcC1saW51eC9icGYgZXF1aXZhbGVudHMuCisgKgorICogQXV0aG9yczogUmljaGFyZCBMaXR0aW4sIFNlYW4gSXJ2aW5lICh7cmljaGFyZCxzZWFufUByZWVsdHdvLmNvbSkKKyAqIE1vZGlmaWNhdGlvbnM6IEplc3BlciBQZXRlcnNvbiAgPHN1cHBvcnRAZW5kYWNlLmNvbT4KKyAqICAgICAgICAgICAgICAgIEtvcnluIEdyYW50ICAgICAgPHN1cHBvcnRAZW5kYWNlLmNvbT4KKyAqICAgICAgICAgICAgICAgIFN0ZXBoZW4gRG9ubmVsbHkgPHN1cHBvcnRAZW5kYWNlLmNvbT4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKwkiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWRhZy5jLHYgMS4zOSAyMDA4LTA0LTE0IDIwOjQwOjU4IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CQkJLyogb3B0aW9uYWxseSBnZXQgQlNEIGRlZmluZSAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworc3RydWN0IG1idWY7CQkvKiBTcXVlbGNoIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHNvbWUgcGxhdGZvcm1zIGZvciAqLworc3RydWN0IHJ0ZW50cnk7CQkvKiBkZWNsYXJhdGlvbnMgaW4gPG5ldC9pZi5oPiAqLworI2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaW5jbHVkZSAiZGFnbmV3LmgiCisjaW5jbHVkZSAiZGFnYXBpLmgiCisKKyNpbmNsdWRlICJwY2FwLWRhZy5oIgorCisjZGVmaW5lIEFUTV9DRUxMX1NJWkUJCTUyCisjZGVmaW5lIEFUTV9IRFJfU0laRQkJNAorCisvKgorICogQSBoZWFkZXIgY29udGFpbmluZyBhZGRpdGlvbmFsIE1UUCBpbmZvcm1hdGlvbi4KKyAqLworI2RlZmluZSBNVFAyX1NFTlRfT0ZGU0VUCQkwCS8qIDEgYnl0ZSAqLworI2RlZmluZSBNVFAyX0FOTkVYX0FfVVNFRF9PRkZTRVQJMQkvKiAxIGJ5dGUgKi8KKyNkZWZpbmUgTVRQMl9MSU5LX05VTUJFUl9PRkZTRVQJCTIJLyogMiBieXRlcyAqLworI2RlZmluZSBNVFAyX0hEUl9MRU4JCQk0CS8qIGxlbmd0aCBvZiB0aGUgaGVhZGVyICovCisKKyNkZWZpbmUgTVRQMl9BTk5FWF9BX05PVF9VU0VEICAgICAgMAorI2RlZmluZSBNVFAyX0FOTkVYX0FfVVNFRCAgICAgICAgICAxCisjZGVmaW5lIE1UUDJfQU5ORVhfQV9VU0VEX1VOS05PV04gIDIKKworLyogU3VuQVRNIHBzZXVkbyBoZWFkZXIgKi8KK3N0cnVjdCBzdW5hdG1faGRyIHsKKwl1bnNpZ25lZCBjaGFyCWZsYWdzOwkJLyogZGVzdGluYXRpb24gYW5kIHRyYWZmaWMgdHlwZSAqLworCXVuc2lnbmVkIGNoYXIJdnBpOwkJLyogVlBJICovCisJdW5zaWduZWQgc2hvcnQJdmNpOwkJLyogVkNJICovCit9OworCit0eXBlZGVmIHN0cnVjdCBwY2FwX2RhZ19ub2RlIHsKKwlzdHJ1Y3QgcGNhcF9kYWdfbm9kZSAqbmV4dDsKKwlwY2FwX3QgKnA7CisJcGlkX3QgcGlkOworfSBwY2FwX2RhZ19ub2RlX3Q7CisKK3N0YXRpYyBwY2FwX2RhZ19ub2RlX3QgKnBjYXBfZGFncyA9IE5VTEw7CitzdGF0aWMgaW50IGF0ZXhpdF9oYW5kbGVyX2luc3RhbGxlZCA9IDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZW5kaWFuX3Rlc3Rfd29yZCA9IDB4MDEwMDsKKworI2RlZmluZSBJU19CSUdFTkRJQU4oKSAoKigodW5zaWduZWQgY2hhciAqKSZlbmRpYW5fdGVzdF93b3JkKSkKKworCisjaWZkZWYgREFHX09OTFkKKy8qIFRoaXMgY29kZSBpcyByZXF1aXJlZCB3aGVuIGNvbXBpbGluZyBmb3IgYSBEQUcgZGV2aWNlIG9ubHkuICovCisKKy8qIFJlcGxhY2UgZGFnIGZ1bmN0aW9uIG5hbWVzIHdpdGggcGNhcCBlcXVpdmFsZW50LiAqLworI2RlZmluZSBkYWdfY3JlYXRlIHBjYXBfY3JlYXRlCisjZGVmaW5lIGRhZ19wbGF0Zm9ybV9maW5kZGV2cyBwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzCisjZW5kaWYgLyogREFHX09OTFkgKi8KKworI2RlZmluZSBNQVhfREFHX1BBQ0tFVCA2NTUzNgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBUZW1wUGt0W01BWF9EQUdfUEFDS0VUXTsKKworc3RhdGljIGludCBkYWdfc2V0ZmlsdGVyKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCk7CitzdGF0aWMgaW50IGRhZ19zdGF0cyhwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKTsKK3N0YXRpYyBpbnQgZGFnX3NldF9kYXRhbGluayhwY2FwX3QgKnAsIGludCBkbHQpOworc3RhdGljIGludCBkYWdfZ2V0X2RhdGFsaW5rKHBjYXBfdCAqcCk7CitzdGF0aWMgaW50IGRhZ19zZXRub25ibG9jayhwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKTsKKworc3RhdGljIHZvaWQKK2RlbGV0ZV9wY2FwX2RhZyhwY2FwX3QgKnApCit7CisJcGNhcF9kYWdfbm9kZV90ICpjdXJyID0gTlVMTCwgKnByZXYgPSBOVUxMOworCisJZm9yIChwcmV2ID0gTlVMTCwgY3VyciA9IHBjYXBfZGFnczsgY3VyciAhPSBOVUxMICYmIGN1cnItPnAgIT0gcDsgcHJldiA9IGN1cnIsIGN1cnIgPSBjdXJyLT5uZXh0KSB7CisJCS8qIGVtcHR5ICovCisJfQorCisJaWYgKGN1cnIgIT0gTlVMTCAmJiBjdXJyLT5wID09IHApIHsKKwkJaWYgKHByZXYgIT0gTlVMTCkgeworCQkJcHJldi0+bmV4dCA9IGN1cnItPm5leHQ7CisJCX0gZWxzZSB7CisJCQlwY2FwX2RhZ3MgPSBjdXJyLT5uZXh0OworCQl9CisJfQorfQorCisvKgorICogUGVyZm9ybXMgYSBncmFjZWZ1bCBzaHV0ZG93biBvZiB0aGUgREFHIGNhcmQsIGZyZWVzIGR5bmFtaWMgbWVtb3J5IGhlbGQKKyAqIGluIHRoZSBwY2FwX3Qgc3RydWN0dXJlLCBhbmQgY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IgZm9yIHRoZSBEQUcgY2FyZC4KKyAqLworCitzdGF0aWMgdm9pZAorZGFnX3BsYXRmb3JtX2NsZWFudXAocGNhcF90ICpwKQoreworCQorCWlmIChwICE9IE5VTEwpIHsKKyNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQorCQlpZihkYWdfc3RvcF9zdHJlYW0ocC0+ZmQsIHAtPm1kLmRhZ19zdHJlYW0pIDwgMCkKKwkJCWZwcmludGYoc3RkZXJyLCJkYWdfc3RvcF9zdHJlYW06ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkKKwkJaWYoZGFnX2RldGFjaF9zdHJlYW0ocC0+ZmQsIHAtPm1kLmRhZ19zdHJlYW0pIDwgMCkKKwkJCWZwcmludGYoc3RkZXJyLCJkYWdfZGV0YWNoX3N0cmVhbTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisjZWxzZQorCQlpZihkYWdfc3RvcChwLT5mZCkgPCAwKQorCQkJZnByaW50ZihzdGRlcnIsImRhZ19zdG9wOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyNlbmRpZiAvKiBIQVZFX0RBR19TVFJFQU1TX0FQSSAqLworCQlpZihwLT5mZCAhPSAtMSkgeworCQkJaWYoZGFnX2Nsb3NlKHAtPmZkKSA8IDApCisJCQkJZnByaW50ZihzdGRlcnIsImRhZ19jbG9zZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlwLT5mZCA9IC0xOworCQl9CisJCWRlbGV0ZV9wY2FwX2RhZyhwKTsKKwkJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKHApOworCX0KKwkvKiBOb3RlOiBkb24ndCBuZWVkIHRvIGNhbGwgY2xvc2UocC0+ZmQpIGhlcmUgYXMgZGFnX2Nsb3NlKHAtPmZkKSBkb2VzIHRoaXMuICovCit9CisKK3N0YXRpYyB2b2lkCithdGV4aXRfaGFuZGxlcih2b2lkKQoreworCXdoaWxlIChwY2FwX2RhZ3MgIT0gTlVMTCkgeworCQlpZiAocGNhcF9kYWdzLT5waWQgPT0gZ2V0cGlkKCkpIHsKKwkJCWRhZ19wbGF0Zm9ybV9jbGVhbnVwKHBjYXBfZGFncy0+cCk7CisJCX0gZWxzZSB7CisJCQlkZWxldGVfcGNhcF9kYWcocGNhcF9kYWdzLT5wKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorbmV3X3BjYXBfZGFnKHBjYXBfdCAqcCkKK3sKKwlwY2FwX2RhZ19ub2RlX3QgKm5vZGUgPSBOVUxMOworCisJaWYgKChub2RlID0gbWFsbG9jKHNpemVvZihwY2FwX2RhZ19ub2RlX3QpKSkgPT0gTlVMTCkgeworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKCFhdGV4aXRfaGFuZGxlcl9pbnN0YWxsZWQpIHsKKwkJYXRleGl0KGF0ZXhpdF9oYW5kbGVyKTsKKwkJYXRleGl0X2hhbmRsZXJfaW5zdGFsbGVkID0gMTsKKwl9CisKKwlub2RlLT5uZXh0ID0gcGNhcF9kYWdzOworCW5vZGUtPnAgPSBwOworCW5vZGUtPnBpZCA9IGdldHBpZCgpOworCisJcGNhcF9kYWdzID0gbm9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50CitkYWdfZXJmX2V4dF9oZWFkZXJfY291bnQodWludDhfdCAqIGVyZiwgc2l6ZV90IGxlbikKK3sKKwl1aW50MzJfdCBoZHJfbnVtID0gMDsKKwl1aW50OF90ICBoZHJfdHlwZTsKKworCS8qIGJhc2ljIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoIGVyZiA9PSBOVUxMICkKKwkJcmV0dXJuIDA7CisJaWYgKCBsZW4gPCAxNiApCisJCXJldHVybiAwOworCisJLyogY2hlY2sgaWYgd2UgaGF2ZSBhbnkgZXh0ZW5zaW9uIGhlYWRlcnMgKi8KKwlpZiAoIChlcmZbOF0gJiAweDgwKSA9PSAweDAwICkKKwkJcmV0dXJuIDA7CisKKwkvKiBsb29wIG92ZXIgdGhlIGV4dGVuc2lvbiBoZWFkZXJzICovCisJZG8geworCQorCQkvKiBzYW5pdHkgY2hlY2sgd2UgaGF2ZSBlbm91Z2ggYnl0ZXMgKi8KKwkJaWYgKCBsZW4gPD0gKDI0ICsgKGhkcl9udW0gKiA4KSkgKQorCQkJcmV0dXJuIGhkcl9udW07CisKKwkJLyogZ2V0IHRoZSBoZWFkZXIgdHlwZSAqLworCQloZHJfdHlwZSA9IGVyZlsoMTYgKyAoaGRyX251bSAqIDgpKV07CisJCWhkcl9udW0rKzsKKworCX0gd2hpbGUgKCBoZHJfdHlwZSAmIDB4ODAgKTsKKworCXJldHVybiBoZHJfbnVtOworfQorCisvKgorICogIFJlYWQgYXQgbW9zdCBtYXhfcGFja2V0cyBmcm9tIHRoZSBjYXB0dXJlIHN0cmVhbSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sKKyAqICBmb3IgZWFjaCBvZiB0aGVtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyBoYW5kbGVkLCAtMSBpZiBhbgorICogIGVycm9yIG9jY3VyZWQsIG9yIC0yIGlmIHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgKi8KK3N0YXRpYyBpbnQKK2RhZ19yZWFkKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJdW5zaWduZWQgaW50IHByb2Nlc3NlZCA9IDA7CisJaW50IGZsYWdzID0gcC0+bWQuZGFnX29mZnNldF9mbGFnczsKKwl1bnNpZ25lZCBpbnQgbm9uYmxvY2tpbmcgPSBmbGFncyAmIERBR0ZfTk9OQkxPQ0s7CisJdW5zaWduZWQgaW50IG51bV9leHRfaGRyID0gMDsKKworCS8qIEdldCB0aGUgbmV4dCBidWZmZXJmdWwgb2YgcGFja2V0cyAoaWYgbmVjZXNzYXJ5KS4gKi8KKwl3aGlsZSAocC0+bWQuZGFnX21lbV90b3AgLSBwLT5tZC5kYWdfbWVtX2JvdHRvbSA8IGRhZ19yZWNvcmRfc2l6ZSkgeworIAorCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKi8KKwkJaWYgKHAtPmJyZWFrX2xvb3ApIHsKKwkJCS8qCisJCQkgKiBZZXMgLSBjbGVhciB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0CisJCQkgKiBpdCBoYXMsIGFuZCByZXR1cm4gLTIgdG8gaW5kaWNhdGUgdGhhdAorCQkJICogd2Ugd2VyZSB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJCSAqLworCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gLTI7CisJCX0KKworI2lmZGVmIEhBVkVfREFHX1NUUkVBTVNfQVBJCisJCS8qIGRhZ19hZHZhbmNlX3N0cmVhbSgpIHdpbGwgYmxvY2sgKHVubGVzcyBub25ibG9jayBpcyBjYWxsZWQpCisJCSAqIHVudGlsIDY0a0Igb2YgZGF0YSBoYXMgYWNjdW11bGF0ZWQuCisJCSAqIElmIHRvX21zIGlzIHNldCwgaXQgd2lsbCB0aW1lb3V0IGJlZm9yZSA2NGtCIGhhcyBhY2N1bXVsYXRlZC4KKwkJICogV2Ugd2FpdCBmb3IgNjRrQiBiZWNhdXNlIHByb2Nlc3NpbmcgYSBmZXcgcGFja2V0cyBhdCBhIHRpbWUKKwkJICogY2FuIGNhdXNlIHByb2JsZW1zIGF0IGhpZ2ggcGFja2V0IHJhdGVzICg+MjAwa3BwcykgZHVlCisJCSAqIHRvIGluZWZmaWNpZW5jaWVzLgorCQkgKiBUaGlzIGRvZXMgbWVhbiBpZiB0b19tcyBpcyBub3Qgc3BlY2lmaWVkIHRoZSBjYXB0dXJlIG1heSAnaGFuZycKKwkJICogZm9yIGxvbmcgcGVyaW9kcyBpZiB0aGUgZGF0YSByYXRlIGlzIGV4dHJlbWVseSBzbG93ICg8NjRrQi9zZWMpCisJCSAqIElmIG5vbi1ibG9jayBpcyBzcGVjaWZpZWQgaXQgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuIFRoZSB1c2VyCisJCSAqIGlzIHRoZW4gcmVzcG9uc2libGUgZm9yIGVmZmljaWVuY3kuCisJCSAqLworCQlpZiAoIE5VTEwgPT0gKHAtPm1kLmRhZ19tZW1fdG9wID0gZGFnX2FkdmFuY2Vfc3RyZWFtKHAtPmZkLCBwLT5tZC5kYWdfc3RyZWFtLCAmKHAtPm1kLmRhZ19tZW1fYm90dG9tKSkpICkgeworCQkgICAgIHJldHVybiAtMTsKKwkJfQorI2Vsc2UKKwkJLyogZGFnX29mZnNldCBkb2VzIG5vdCBzdXBwb3J0IHRpbWVvdXRzICovCisJCXAtPm1kLmRhZ19tZW1fdG9wID0gZGFnX29mZnNldChwLT5mZCwgJihwLT5tZC5kYWdfbWVtX2JvdHRvbSksIGZsYWdzKTsKKyNlbmRpZiAvKiBIQVZFX0RBR19TVFJFQU1TX0FQSSAqLworCisJCWlmIChub25ibG9ja2luZyAmJiAocC0+bWQuZGFnX21lbV90b3AgLSBwLT5tZC5kYWdfbWVtX2JvdHRvbSA8IGRhZ19yZWNvcmRfc2l6ZSkpCisJCXsKKwkJCS8qIFBjYXAgaXMgY29uZmlndXJlZCB0byBwcm9jZXNzIG9ubHkgYXZhaWxhYmxlIHBhY2tldHMsIGFuZCB0aGVyZSBhcmVuJ3QgYW55LCByZXR1cm4gaW1tZWRpYXRlbHkuICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJaWYoIW5vbmJsb2NraW5nICYmCisJCSAgIHAtPm1kLmRhZ190aW1lb3V0ICYmCisJCSAgIChwLT5tZC5kYWdfbWVtX3RvcCAtIHAtPm1kLmRhZ19tZW1fYm90dG9tIDwgZGFnX3JlY29yZF9zaXplKSkKKwkJeworCQkJLyogQmxvY2tpbmcgbW9kZSwgYnV0IHRpbWVvdXQgc2V0IGFuZCBubyBkYXRhIGhhcyBhcnJpdmVkLCByZXR1cm4gYW55d2F5LiovCisJCQlyZXR1cm4gMDsKKwkJfQorCisJfQorCQorCS8qIFByb2Nlc3MgdGhlIHBhY2tldHMuICovCisJd2hpbGUgKHAtPm1kLmRhZ19tZW1fdG9wIC0gcC0+bWQuZGFnX21lbV9ib3R0b20gPj0gZGFnX3JlY29yZF9zaXplKSB7CisJCQorCQl1bnNpZ25lZCBzaG9ydCBwYWNrZXRfbGVuID0gMDsKKwkJaW50IGNhcGxlbiA9IDA7CisJCXN0cnVjdCBwY2FwX3BrdGhkcglwY2FwX2hlYWRlcjsKKwkJCisjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkKKwkJZGFnX3JlY29yZF90ICpoZWFkZXIgPSAoZGFnX3JlY29yZF90ICopKHAtPm1kLmRhZ19tZW1fYm90dG9tKTsKKyNlbHNlCisJCWRhZ19yZWNvcmRfdCAqaGVhZGVyID0gKGRhZ19yZWNvcmRfdCAqKShwLT5tZC5kYWdfbWVtX2Jhc2UgKyBwLT5tZC5kYWdfbWVtX2JvdHRvbSk7CisjZW5kaWYgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KKworCQl1X2NoYXIgKmRwID0gKCh1X2NoYXIgKiloZWFkZXIpOyAvKiArIGRhZ19yZWNvcmRfc2l6ZTsgKi8KKwkJdW5zaWduZWQgc2hvcnQgcmxlbjsKKyAKKwkJLyoKKwkJICogSGFzICJwY2FwX2JyZWFrbG9vcCgpIiBiZWVuIGNhbGxlZD8KKwkJICovCisJCWlmIChwLT5icmVha19sb29wKSB7CisJCQkvKgorCQkJICogWWVzIC0gY2xlYXIgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdAorCQkJICogaXQgaGFzLCBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlIHRoYXQKKwkJCSAqIHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCQkgKi8KKwkJCXAtPmJyZWFrX2xvb3AgPSAwOworCQkJcmV0dXJuIC0yOworCQl9CisgCisJCXJsZW4gPSBudG9ocyhoZWFkZXItPnJsZW4pOworCQlpZiAocmxlbiA8IGRhZ19yZWNvcmRfc2l6ZSkKKwkJeworCQkJc3RybmNweShwLT5lcnJidWYsICJkYWdfcmVhZDogcmVjb3JkIHRvbyBzbWFsbCIsIFBDQVBfRVJSQlVGX1NJWkUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXAtPm1kLmRhZ19tZW1fYm90dG9tICs9IHJsZW47CisKKwkJLyogQ291bnQgbG9zdCBwYWNrZXRzLiAqLworCQlzd2l0Y2goKGhlYWRlci0+dHlwZSAmIDB4N2YpKSB7CisJCQkvKiBpbiB0aGVzZSB0eXBlcyB0aGUgY29sb3IgdmFsdWUgb3ZlcndyaXRlcyB0aGUgbGN0ciAqLworCQljYXNlIFRZUEVfQ09MT1JfSERMQ19QT1M6CisJCWNhc2UgVFlQRV9DT0xPUl9FVEg6CisJCWNhc2UgVFlQRV9EU01fQ09MT1JfSERMQ19QT1M6CisJCWNhc2UgVFlQRV9EU01fQ09MT1JfRVRIOgorCQljYXNlIFRZUEVfQ09MT1JfTUNfSERMQ19QT1M6CisJCWNhc2UgVFlQRV9DT0xPUl9IQVNIX0VUSDoKKwkJY2FzZSBUWVBFX0NPTE9SX0hBU0hfUE9TOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChoZWFkZXItPmxjdHIpIHsKKwkJCQlpZiAocC0+bWQuc3RhdC5wc19kcm9wID4gKFVJTlRfTUFYIC0gbnRvaHMoaGVhZGVyLT5sY3RyKSkpIHsKKwkJCQkJcC0+bWQuc3RhdC5wc19kcm9wID0gVUlOVF9NQVg7CisJCQkJfSBlbHNlIHsKKwkJCQkJcC0+bWQuc3RhdC5wc19kcm9wICs9IG50b2hzKGhlYWRlci0+bGN0cik7CisJCQkJfQorCQkJfQorCQl9CisJCQorCQlpZiAoKGhlYWRlci0+dHlwZSAmIDB4N2YpID09IFRZUEVfUEFEKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCW51bV9leHRfaGRyID0gZGFnX2VyZl9leHRfaGVhZGVyX2NvdW50KGRwLCBybGVuKTsKKworCQkvKiBFUkYgZW5jYXBzdWxhdGlvbiAqLworCQkvKiBUaGUgRXh0ZW5zaWJsZSBSZWNvcmQgRm9ybWF0IGlzIG5vdCBkcm9wcGVkIGZvciB0aGlzIGtpbmQgb2YgZW5jYXBzdWxhdGlvbiwgCisJCSAqIGFuZCB3aWxsIGJlIGhhbmRsZWQgYXMgYSBwc2V1ZG8gaGVhZGVyIGJ5IHRoZSBkZWNvZGluZyBhcHBsaWNhdGlvbi4KKwkJICogVGhlIGluZm9ybWF0aW9uIGNhcnJpZWQgaW4gdGhlIEVSRiBoZWFkZXIgYW5kIGluIHRoZSBvcHRpb25hbCBzdWJoZWFkZXIgKGlmIHByZXNlbnQpCisJCSAqIGNvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBsaWJwY2FwIGluZm9ybWF0aW9uLCB0byBvZmZlciBhIGJldHRlciBkZWNvZGluZy4KKwkJICogVGhlIHBhY2tldCBsZW5ndGggaXMKKwkJICogbyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgb24gdGhlIGxpbmsgKGhlYWRlci0+d2xlbiksCisJCSAqIG8gcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBFUkYgaGVhZGVyIChkYWdfcmVjb3JkX3NpemUpLCBhcyB0aGUgbGVuZ3RoIG9mIHRoZSAKKwkJICogICBwc2V1ZG8gaGVhZGVyIHdpbGwgYmUgYWRqdXN0ZWQgZHVyaW5nIHRoZSBkZWNvZGluZywKKwkJICogbyBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIG9wdGlvbmFsIHN1YmhlYWRlciAoaWYgcHJlc2VudCkuCisJCSAqCisJCSAqIFRoZSBjYXB0dXJlIGxlbmd0aCBpcyBoZWFkZXIucmxlbiBhbmQgdGhlIGJ5dGUgc3R1ZmZpbmcgZm9yIGFsaWdubWVudCB3aWxsIGJlIGRyb3BwZWQKKwkJICogaWYgdGhlIGNhcHR1cmUgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGFja2V0IGxlbmd0aC4KKwkJICovCisJCWlmIChwLT5saW5rdHlwZSA9PSBETFRfRVJGKSB7CisJCQlwYWNrZXRfbGVuID0gbnRvaHMoaGVhZGVyLT53bGVuKSArIGRhZ19yZWNvcmRfc2l6ZTsKKwkJCWNhcGxlbiA9IHJsZW47CisJCQlzd2l0Y2ggKChoZWFkZXItPnR5cGUgJiAweDdmKSkgeworCQkJY2FzZSBUWVBFX01DX0FBTDU6CisJCQljYXNlIFRZUEVfTUNfQVRNOgorCQkJY2FzZSBUWVBFX01DX0hETEM6CisJCQljYXNlIFRZUEVfTUNfUkFXX0NIQU5ORUw6CisJCQljYXNlIFRZUEVfTUNfUkFXOgorCQkJY2FzZSBUWVBFX01DX0FBTDI6CisJCQljYXNlIFRZUEVfQ09MT1JfTUNfSERMQ19QT1M6CisJCQkJcGFja2V0X2xlbiArPSA0OyAvKiBNQyBoZWFkZXIgKi8KKwkJCQlicmVhazsKKworCQkJY2FzZSBUWVBFX0NPTE9SX0hBU0hfRVRIOgorCQkJY2FzZSBUWVBFX0RTTV9DT0xPUl9FVEg6CisJCQljYXNlIFRZUEVfQ09MT1JfRVRIOgorCQkJY2FzZSBUWVBFX0VUSDoKKwkJCQlwYWNrZXRfbGVuICs9IDI7IC8qIEVUSCBoZWFkZXIgKi8KKwkJCQlicmVhazsKKwkJCX0gLyogc3dpdGNoIHR5cGUgKi8KKworCQkJLyogSW5jbHVkZSBFUkYgZXh0ZW5zaW9uIGhlYWRlcnMgKi8KKwkJCXBhY2tldF9sZW4gKz0gKDggKiBudW1fZXh0X2hkcik7CisKKwkJCWlmIChjYXBsZW4gPiBwYWNrZXRfbGVuKSB7CisJCQkJY2FwbGVuID0gcGFja2V0X2xlbjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIE90aGVyIGtpbmQgb2YgZW5jYXBzdWxhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGhlYWRlciBUeXBlICovCisKKwkJCS8qIFNraXAgb3ZlciBnZW5lcmljIEVSRiBoZWFkZXIgKi8KKwkJCWRwICs9IGRhZ19yZWNvcmRfc2l6ZTsKKwkJCS8qIFNraXAgb3ZlciBleHRlbnNpb24gaGVhZGVycyAqLworCQkJZHAgKz0gOCAqIG51bV9leHRfaGRyOworCQkJCisJCQlzd2l0Y2goKGhlYWRlci0+dHlwZSAmIDB4N2YpKSB7CisJCQljYXNlIFRZUEVfQVRNOgorCQkJY2FzZSBUWVBFX0FBTDU6CisJCQkJaWYgKGhlYWRlci0+dHlwZSA9PSBUWVBFX0FBTDUpIHsKKwkJCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7CisJCQkJCWNhcGxlbiA9IHJsZW4gLSBkYWdfcmVjb3JkX3NpemU7CisJCQkJfQorCQkJY2FzZSBUWVBFX01DX0FUTToKKwkJCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfTUNfQVRNKSB7CisJCQkJCWNhcGxlbiA9IHBhY2tldF9sZW4gPSBBVE1fQ0VMTF9TSVpFOworCQkJCQlkcCs9NDsKKwkJCQl9CisJCQljYXNlIFRZUEVfTUNfQUFMNToKKwkJCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfTUNfQUFMNSkgeworCQkJCQlwYWNrZXRfbGVuID0gbnRvaHMoaGVhZGVyLT53bGVuKTsKKwkJCQkJY2FwbGVuID0gcmxlbiAtIGRhZ19yZWNvcmRfc2l6ZSAtIDQ7CisJCQkJCWRwKz00OworCQkJCX0KKwkJCQlpZiAoaGVhZGVyLT50eXBlID09IFRZUEVfQVRNKSB7CisJCQkJCWNhcGxlbiA9IHBhY2tldF9sZW4gPSBBVE1fQ0VMTF9TSVpFOworCQkJCX0KKwkJCQlpZiAocC0+bGlua3R5cGUgPT0gRExUX1NVTkFUTSkgeworCQkJCQlzdHJ1Y3Qgc3VuYXRtX2hkciAqc3VuYXRtID0gKHN0cnVjdCBzdW5hdG1faGRyICopZHA7CisJCQkJCXVuc2lnbmVkIGxvbmcgcmF3YXRtOworCQkJCQkKKwkJCQkJcmF3YXRtID0gbnRvaGwoKigodW5zaWduZWQgbG9uZyAqKWRwKSk7CisJCQkJCXN1bmF0bS0+dmNpID0gaHRvbnMoKHJhd2F0bSA+PiAgNCkgJiAweGZmZmYpOworCQkJCQlzdW5hdG0tPnZwaSA9IChyYXdhdG0gPj4gMjApICYgMHgwMGZmOworCQkJCQlzdW5hdG0tPmZsYWdzID0gKChoZWFkZXItPmZsYWdzLmlmYWNlICYgMSkgPyAweDgwIDogMHgwMCkgfCAKKwkJCQkJCSgoc3VuYXRtLT52cGkgPT0gMCAmJiBzdW5hdG0tPnZjaSA9PSBodG9ucyg1KSkgPyA2IDoKKwkJCQkJCSAoKHN1bmF0bS0+dnBpID09IDAgJiYgc3VuYXRtLT52Y2kgPT0gaHRvbnMoMTYpKSA/IDUgOiAKKwkJCQkJCSAgKChkcFtBVE1fSERSX1NJWkVdID09IDB4YWEgJiYKKwkJCQkJCSAgICBkcFtBVE1fSERSX1NJWkUrMV0gPT0gMHhhYSAmJgorCQkJCQkJICAgIGRwW0FUTV9IRFJfU0laRSsyXSA9PSAweDAzKSA/IDIgOiAxKSkpOworCisJCQkJfSBlbHNlIHsKKwkJCQkJcGFja2V0X2xlbiAtPSBBVE1fSERSX1NJWkU7CisJCQkJCWNhcGxlbiAtPSBBVE1fSERSX1NJWkU7CisJCQkJCWRwICs9IEFUTV9IRFJfU0laRTsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVFlQRV9DT0xPUl9IQVNIX0VUSDoKKwkJCWNhc2UgVFlQRV9EU01fQ09MT1JfRVRIOgorCQkJY2FzZSBUWVBFX0NPTE9SX0VUSDoKKwkJCWNhc2UgVFlQRV9FVEg6CisJCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7CisJCQkJcGFja2V0X2xlbiAtPSAocC0+bWQuZGFnX2Zjc19iaXRzID4+IDMpOworCQkJCWNhcGxlbiA9IHJsZW4gLSBkYWdfcmVjb3JkX3NpemUgLSAyOworCQkJCWlmIChjYXBsZW4gPiBwYWNrZXRfbGVuKSB7CisJCQkJCWNhcGxlbiA9IHBhY2tldF9sZW47CisJCQkJfQorCQkJCWRwICs9IDI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVFlQRV9DT0xPUl9IQVNIX1BPUzoKKwkJCWNhc2UgVFlQRV9EU01fQ09MT1JfSERMQ19QT1M6CisJCQljYXNlIFRZUEVfQ09MT1JfSERMQ19QT1M6CisJCQljYXNlIFRZUEVfSERMQ19QT1M6CisJCQkJcGFja2V0X2xlbiA9IG50b2hzKGhlYWRlci0+d2xlbik7CisJCQkJcGFja2V0X2xlbiAtPSAocC0+bWQuZGFnX2Zjc19iaXRzID4+IDMpOworCQkJCWNhcGxlbiA9IHJsZW4gLSBkYWdfcmVjb3JkX3NpemU7CisJCQkJaWYgKGNhcGxlbiA+IHBhY2tldF9sZW4pIHsKKwkJCQkJY2FwbGVuID0gcGFja2V0X2xlbjsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgVFlQRV9DT0xPUl9NQ19IRExDX1BPUzoKKwkJCWNhc2UgVFlQRV9NQ19IRExDOgorCQkJCXBhY2tldF9sZW4gPSBudG9ocyhoZWFkZXItPndsZW4pOworCQkJCXBhY2tldF9sZW4gLT0gKHAtPm1kLmRhZ19mY3NfYml0cyA+PiAzKTsKKwkJCQljYXBsZW4gPSBybGVuIC0gZGFnX3JlY29yZF9zaXplIC0gNDsKKwkJCQlpZiAoY2FwbGVuID4gcGFja2V0X2xlbikgeworCQkJCQljYXBsZW4gPSBwYWNrZXRfbGVuOworCQkJCX0KKwkJCQkvKiBqdW1wIHRoZSBNQ19IRExDX0hFQURFUiAqLworCQkJCWRwICs9IDQ7CisjaWZkZWYgRExUX01UUDJfV0lUSF9QSERSCisJCQkJaWYgKHAtPmxpbmt0eXBlID09IERMVF9NVFAyX1dJVEhfUEhEUikgeworCQkJCQkvKiBBZGQgdGhlIE1UUDIgUHNldWRvIEhlYWRlciAqLworCQkJCQljYXBsZW4gKz0gTVRQMl9IRFJfTEVOOworCQkJCQlwYWNrZXRfbGVuICs9IE1UUDJfSERSX0xFTjsKKwkJCQkJCisJCQkJCVRlbXBQa3RbTVRQMl9TRU5UX09GRlNFVF0gPSAwOworCQkJCQlUZW1wUGt0W01UUDJfQU5ORVhfQV9VU0VEX09GRlNFVF0gPSBNVFAyX0FOTkVYX0FfVVNFRF9VTktOT1dOOworCQkJCQkqKFRlbXBQa3QrTVRQMl9MSU5LX05VTUJFUl9PRkZTRVQpID0gKChoZWFkZXItPnJlYy5tY19oZGxjLm1jX2hlYWRlcj4+MTYpJjB4MDEpOworCQkJCQkqKFRlbXBQa3QrTVRQMl9MSU5LX05VTUJFUl9PRkZTRVQrMSkgPSAoKGhlYWRlci0+cmVjLm1jX2hkbGMubWNfaGVhZGVyPj4yNCkmMHhmZik7CisJCQkJCW1lbWNweShUZW1wUGt0K01UUDJfSERSX0xFTiwgZHAsIGNhcGxlbik7CisJCQkJCWRwID0gVGVtcFBrdDsKKwkJCQl9CisjZW5kaWYKKwkJCQlicmVhazsKKworCQkJY2FzZSBUWVBFX0lQVjQ6CisJCQljYXNlIFRZUEVfSVBWNjoKKwkJCQlwYWNrZXRfbGVuID0gbnRvaHMoaGVhZGVyLT53bGVuKTsKKwkJCQljYXBsZW4gPSBybGVuIC0gZGFnX3JlY29yZF9zaXplOworCQkJCWlmIChjYXBsZW4gPiBwYWNrZXRfbGVuKSB7CisJCQkJCWNhcGxlbiA9IHBhY2tldF9sZW47CisJCQkJfQorCQkJCWJyZWFrOworCisJCQkvKiBUaGVzZSB0eXBlcyBoYXZlIG5vIG1hdGNoaW5nICduYXRpdmUnIERMVCwgYnV0IGNhbiBiZSB1c2VkIHdpdGggRExUX0VSRiBhYm92ZSAqLworCQkJY2FzZSBUWVBFX01DX1JBVzoKKwkJCWNhc2UgVFlQRV9NQ19SQVdfQ0hBTk5FTDoKKwkJCWNhc2UgVFlQRV9JUF9DT1VOVEVSOgorCQkJY2FzZSBUWVBFX1RDUF9GTE9XX0NPVU5URVI6CisJCQljYXNlIFRZUEVfSU5GSU5JQkFORDoKKwkJCWNhc2UgVFlQRV9SQVdfTElOSzoKKwkJCWNhc2UgVFlQRV9JTkZJTklCQU5EX0xJTks6CisJCQlkZWZhdWx0OgorCQkJCS8qIFVuaGFuZGxlZCBFUkYgdHlwZS4KKwkJCQkgKiBJZ25vcmUgcmF0aGVyIHRoYW4gZ2VuZXJhdGluZyBlcnJvcgorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfSAvKiBzd2l0Y2ggdHlwZSAqLworCisJCQkvKiBTa2lwIG92ZXIgZXh0ZW5zaW9uIGhlYWRlcnMgKi8KKwkJCWNhcGxlbiAtPSAoOCAqIG51bV9leHRfaGRyKTsKKworCQl9IC8qIEVSRiBlbmNhcHN1bGF0aW9uICovCisJCQorCQlpZiAoY2FwbGVuID4gcC0+c25hcHNob3QpCisJCQljYXBsZW4gPSBwLT5zbmFwc2hvdDsKKworCQkvKiBSdW4gdGhlIHBhY2tldCBmaWx0ZXIgaWYgdGhlcmUgaXMgb25lLiAqLworCQlpZiAoKHAtPmZjb2RlLmJmX2luc25zID09IE5VTEwpIHx8IGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIGRwLCBwYWNrZXRfbGVuLCBjYXBsZW4pKSB7CisJCQkKKwkJCS8qIGNvbnZlcnQgYmV0d2VlbiB0aW1lc3RhbXAgZm9ybWF0cyAqLworCQkJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBsb25nIHRzOworCQkJCQorCQkJaWYgKElTX0JJR0VORElBTigpKSB7CisJCQkJdHMgPSBTV0FQTEwoaGVhZGVyLT50cyk7CisJCQl9IGVsc2UgeworCQkJCXRzID0gaGVhZGVyLT50czsKKwkJCX0KKworCQkJcGNhcF9oZWFkZXIudHMudHZfc2VjID0gdHMgPj4gMzI7CisJCQl0cyA9ICh0cyAmIDB4ZmZmZmZmZmZVTEwpICogMTAwMDAwMDsKKwkJCXRzICs9IDB4ODAwMDAwMDA7IC8qIHJvdW5kaW5nICovCisJCQlwY2FwX2hlYWRlci50cy50dl91c2VjID0gdHMgPj4gMzI7CQkKKwkJCWlmIChwY2FwX2hlYWRlci50cy50dl91c2VjID49IDEwMDAwMDApIHsKKwkJCQlwY2FwX2hlYWRlci50cy50dl91c2VjIC09IDEwMDAwMDA7CisJCQkJcGNhcF9oZWFkZXIudHMudHZfc2VjKys7CisJCQl9CisKKwkJCS8qIEZpbGwgaW4gb3VyIG93biBoZWFkZXIgZGF0YSAqLworCQkJcGNhcF9oZWFkZXIuY2FwbGVuID0gY2FwbGVuOworCQkJcGNhcF9oZWFkZXIubGVuID0gcGFja2V0X2xlbjsKKwkKKwkJCS8qIENvdW50IHRoZSBwYWNrZXQuICovCisJCQlwLT5tZC5zdGF0LnBzX3JlY3YrKzsKKwkKKwkJCS8qIENhbGwgdGhlIHVzZXIgc3VwcGxpZWQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwkJCWNhbGxiYWNrKHVzZXIsICZwY2FwX2hlYWRlciwgZHApOworCQorCQkJLyogT25seSBjb3VudCBwYWNrZXRzIHRoYXQgcGFzcyB0aGUgZmlsdGVyLCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzdGFuZGFyZCBMaW51eCBiZWhhdmlvdXIuICovCisJCQlwcm9jZXNzZWQrKzsKKwkJCWlmIChwcm9jZXNzZWQgPT0gY250ICYmIGNudCA+IDApCisJCQl7CisJCQkJLyogUmVhY2hlZCB0aGUgdXNlci1zcGVjaWZpZWQgbGltaXQuICovCisJCQkJcmV0dXJuIGNudDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBwcm9jZXNzZWQ7Cit9CisKK3N0YXRpYyBpbnQKK2RhZ19pbmplY3QocGNhcF90ICpwLCBjb25zdCB2b2lkICpidWYgX1VfLCBzaXplX3Qgc2l6ZSBfVV8pCit7CisJc3RybGNweShwLT5lcnJidWYsICJTZW5kaW5nIHBhY2tldHMgaXNuJ3Qgc3VwcG9ydGVkIG9uIERBRyBjYXJkcyIsCisJICAgIFBDQVBfRVJSQlVGX1NJWkUpOworCXJldHVybiAoLTEpOworfQorCisvKgorICogIEdldCBhIGhhbmRsZSBmb3IgYSBsaXZlIGNhcHR1cmUgZnJvbSB0aGUgZ2l2ZW4gREFHIGRldmljZS4gIFBhc3NpbmcgYSBOVUxMCisgKiAgZGV2aWNlIHdpbGwgcmVzdWx0IGluIGEgZmFpbHVyZS4gIFRoZSBwcm9taXNjIGZsYWcgaXMgaWdub3JlZCBiZWNhdXNlIERBRworICogIGNhcmRzIGFyZSBhbHdheXMgcHJvbWlzY3VvdXMuICBUaGUgdG9fbXMgcGFyYW1ldGVyIGlzIHVzZWQgaW4gc2V0dGluZyB0aGUKKyAqICBBUEkgcG9sbGluZyBwYXJhbWV0ZXJzLgorICogIAorICogIHNuYXBsZW4gaXMgbm93IGFsc28gaWdub3JlZCwgdW50aWwgd2UgZ2V0IHBlci1zdHJlYW0gc2xlbiBzdXBwb3J0LiBTZXQKKyAqICBzbGVuIHdpdGggYXBwcm9wcml0ZSBEQUcgdG9vbCBCRUZPUkUgcGNhcF9hY3RpdmF0ZSgpLgorICoKKyAqICBTZWUgYWxzbyBwY2FwKDMpLgorICovCitzdGF0aWMgaW50IGRhZ19hY3RpdmF0ZShwY2FwX3QqIGhhbmRsZSkKK3sKKyNpZiAwCisJY2hhciBjb25mWzMwXTsgLyogZGFnIGNvbmZpZ3VyZSBzdHJpbmcgKi8KKyNlbmRpZgorCWNoYXIgKnM7CisJaW50IG47CisJZGFnaW5mX3QqIGRhZ2luZjsKKwljaGFyICogbmV3RGV2ID0gTlVMTDsKKwljaGFyICogZGV2aWNlID0gaGFuZGxlLT5vcHQuc291cmNlOworI2lmZGVmIEhBVkVfREFHX1NUUkVBTVNfQVBJCisJdWludDMyX3QgbWluZGF0YTsKKwlzdHJ1Y3QgdGltZXZhbCBtYXh3YWl0OworCXN0cnVjdCB0aW1ldmFsIHBvbGw7CisjZW5kaWYKKworCWlmIChkZXZpY2UgPT0gTlVMTCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRldmljZSBpcyBOVUxMOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKworI2lmZGVmIEhBVkVfREFHX1NUUkVBTVNfQVBJCisJbmV3RGV2ID0gKGNoYXIgKiltYWxsb2Moc3RybGVuKGRldmljZSkgKyAxNik7CisJaWYgKG5ld0RldiA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgc3RyaW5nIGZvciBkZXZpY2UgbmFtZTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsOworCX0KKwkKKwkvKiBQYXJzZSBpbnB1dCBuYW1lIHRvIGdldCBkYWcgZGV2aWNlIGFuZCBzdHJlYW0gbnVtYmVyIGlmIHByb3ZpZGVkICovCisJaWYgKGRhZ19wYXJzZV9uYW1lKGRldmljZSwgbmV3RGV2LCBzdHJsZW4oZGV2aWNlKSArIDE2LCAmaGFuZGxlLT5tZC5kYWdfc3RyZWFtKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfcGFyc2VfbmFtZTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsOworCX0KKwlkZXZpY2UgPSBuZXdEZXY7CisKKwlpZiAoaGFuZGxlLT5tZC5kYWdfc3RyZWFtJTIpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfcGFyc2VfbmFtZTogdHggKGV2ZW4gbnVtYmVyZWQpIHN0cmVhbXMgbm90IHN1cHBvcnRlZCBmb3IgY2FwdHVyZVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisjZWxzZQorCWlmIChzdHJuY21wKGRldmljZSwgIi9kZXYvIiwgNSkgIT0gMCkgeworCQluZXdEZXYgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4oZGV2aWNlKSArIDUpOworCQlpZiAobmV3RGV2ID09IE5VTEwpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgc3RyaW5nIGZvciBkZXZpY2UgbmFtZTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlzdHJjcHkobmV3RGV2LCAiL2Rldi8iKTsKKwkJc3RyY2F0KG5ld0RldiwgZGV2aWNlKTsKKwkJZGV2aWNlID0gbmV3RGV2OworCX0KKyNlbmRpZiAvKiBIQVZFX0RBR19TVFJFQU1TX0FQSSAqLworCisJLyogc2V0dXAgZGV2aWNlIHBhcmFtZXRlcnMgKi8KKwlpZigoaGFuZGxlLT5mZCA9IGRhZ19vcGVuKChjaGFyICopZGV2aWNlKSkgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZGFnX29wZW4gJXM6ICVzIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKyNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQorCS8qIE9wZW4gcmVxdWVzdGVkIHN0cmVhbS4gQ2FuIGZhaWwgaWYgYWxyZWFkeSBsb2NrZWQgb3Igb24gZXJyb3IgKi8KKwlpZiAoZGFnX2F0dGFjaF9zdHJlYW0oaGFuZGxlLT5mZCwgaGFuZGxlLT5tZC5kYWdfc3RyZWFtLCAwLCAwKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfYXR0YWNoX3N0cmVhbTogJXNcbiIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsY2xvc2U7CisJfQorCisJLyogU2V0IHVwIGRlZmF1bHQgcG9sbCBwYXJhbWV0ZXJzIGZvciBzdHJlYW0KKwkgKiBDYW4gYmUgb3ZlcnJpZGRlbiBieSBwY2FwX3NldF9ub25ibG9jaygpCisJICovCisJaWYgKGRhZ19nZXRfc3RyZWFtX3BvbGwoaGFuZGxlLT5mZCwgaGFuZGxlLT5tZC5kYWdfc3RyZWFtLAorCQkJCSZtaW5kYXRhLCAmbWF4d2FpdCwgJnBvbGwpIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19nZXRfc3RyZWFtX3BvbGw6ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmFpbGRldGFjaDsKKwl9CisJCisJLyogQW1vdW50IG9mIGRhdGEgdG8gY29sbGVjdCBpbiBCeXRlcyBiZWZvcmUgY2FsbGluZyBjYWxsYmFja3MuCisJICogSW1wb3J0YW50IGZvciBlZmZpY2llbmN5LCBidXQgY2FuIGludHJvZHVjZSBsYXRlbmN5CisJICogYXQgbG93IHBhY2tldCByYXRlcyBpZiB0b19tcyBub3Qgc2V0IQorCSAqLworCW1pbmRhdGEgPSA2NTUzNjsKKworCS8qIE9iZXkgbWQudGltZW91dCAod2FzIHRvX21zKSBpZiBzdXBwbGllZC4gVGhpcyBpcyBhIGdvb2QgaWRlYSEKKwkgKiBSZWNvbW1lbmQgMTAtMTAwbXMuIENhbGxzIHdpbGwgdGltZSBvdXQgZXZlbiBpZiBubyBkYXRhIGFycml2ZWQuCisJICovCisJbWF4d2FpdC50dl9zZWMgPSBoYW5kbGUtPm1kLnRpbWVvdXQvMTAwMDsKKwltYXh3YWl0LnR2X3VzZWMgPSAoaGFuZGxlLT5tZC50aW1lb3V0JTEwMDApICogMTAwMDsKKworCWlmIChkYWdfc2V0X3N0cmVhbV9wb2xsKGhhbmRsZS0+ZmQsIGhhbmRsZS0+bWQuZGFnX3N0cmVhbSwKKwkJCQltaW5kYXRhLCAmbWF4d2FpdCwgJnBvbGwpIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19zZXRfc3RyZWFtX3BvbGw6ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmFpbGRldGFjaDsKKwl9CisJCQorI2Vsc2UKKwlpZigoaGFuZGxlLT5tZC5kYWdfbWVtX2Jhc2UgPSBkYWdfbW1hcChoYW5kbGUtPmZkKSkgPT0gTUFQX0ZBSUxFRCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwiZGFnX21tYXAgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsY2xvc2U7CisJfQorCisjZW5kaWYgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KKworICAgICAgICAvKiBYWFggTm90IGNhbGxpbmcgZGFnX2NvbmZpZ3VyZSgpIHRvIHNldCBzbGVuOyB0aGlzIGlzIHVuc2FmZSBpbgorCSAqIG11bHRpLXN0cmVhbSBlbnZpcm9ubWVudHMgYXMgdGhlIGdwcCBjb25maWcgaXMgZ2xvYmFsLgorICAgICAgICAgKiBPbmNlIHRoZSBmaXJtd2FyZSBwcm92aWRlcyAncGVyLXN0cmVhbSBzbGVuJyB0aGlzIGNhbiBiZSBzdXBwb3J0ZWQKKwkgKiBhZ2FpbiB2aWEgdGhlIENvbmZpZyBBUEkgd2l0aG91dCBzaWRlLWVmZmVjdHMgKi8KKyNpZiAwCisJLyogc2V0IHRoZSBjYXJkIHNuYXAgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgc25hcGxlbiBwYXJhbWV0ZXIgKi8KKwkvKiBUaGlzIGlzIGEgcmVhbGx5IGJhZCBpZGVhLCBhcyBkaWZmZXJlbnQgY2FyZHMgaGF2ZSBkaWZmZXJlbnQKKwkgKiB2YWxpZCBzbGVuIHJhbmdlcy4gU2hvdWxkIGZpeCBpbiBDb25maWcgQVBJLiAqLworCWlmIChoYW5kbGUtPnNuYXBzaG90ID09IDAgfHwgaGFuZGxlLT5zbmFwc2hvdCA+IE1BWF9EQUdfU05BUExFTikgeworCQloYW5kbGUtPnNuYXBzaG90ID0gTUFYX0RBR19TTkFQTEVOOworCX0gZWxzZSBpZiAoc25hcGxlbiA8IE1JTl9EQUdfU05BUExFTikgeworCQloYW5kbGUtPnNuYXBzaG90ID0gTUlOX0RBR19TTkFQTEVOOworCX0KKwkvKiBzbmFwIGxlbiBoYXMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0ICovCisJc25wcmludGYoY29uZiwgMzAsICJ2YXJsZW4gc2xlbj0lZCIsIChzbmFwbGVuICsgMykgJiB+Myk7IAorCisJaWYoZGFnX2NvbmZpZ3VyZShoYW5kbGUtPmZkLCBjb25mKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsImRhZ19jb25maWd1cmUgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsZGV0YWNoOworCX0KKyNlbmRpZgkKKwkKKyNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQorCWlmKGRhZ19zdGFydF9zdHJlYW0oaGFuZGxlLT5mZCwgaGFuZGxlLT5tZC5kYWdfc3RyZWFtKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfc3RhcnRfc3RyZWFtICVzOiAlc1xuIiwgZGV2aWNlLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gZmFpbGRldGFjaDsKKwl9CisjZWxzZQorCWlmKGRhZ19zdGFydChoYW5kbGUtPmZkKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfc3RhcnQgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsY2xvc2U7CisJfQorI2VuZGlmIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCisKKwkvKgorCSAqIEltcG9ydGFudCEgWW91IGhhdmUgdG8gZW5zdXJlIGJvdHRvbSBpcyBwcm9wZXJseQorCSAqIGluaXRpYWxpemVkIHRvIHplcm8gb24gc3RhcnR1cCwgaXQgd29uJ3QgZ2l2ZSB5b3UKKwkgKiBhIGNvbXBpbGVyIHdhcm5pbmcgaWYgeW91IG1ha2UgdGhpcyBtaXN0YWtlIQorCSAqLworCWhhbmRsZS0+bWQuZGFnX21lbV9ib3R0b20gPSAwOworCWhhbmRsZS0+bWQuZGFnX21lbV90b3AgPSAwOworCisJLyoKKwkgKiBGaW5kIG91dCBob3cgbWFueSBGQ1MgYml0cyB3ZSBzaG91bGQgc3RyaXAuCisJICogRmlyc3QsIHF1ZXJ5IHRoZSBjYXJkIHRvIHNlZSBpZiBpdCBzdHJpcHMgdGhlIEZDUy4KKwkgKi8KKwlkYWdpbmYgPSBkYWdfaW5mbyhoYW5kbGUtPmZkKTsKKwlpZiAoKDB4NDIwMCA9PSBkYWdpbmYtPmRldmljZV9jb2RlKSB8fCAoMHg0MjMwID09IGRhZ2luZi0+ZGV2aWNlX2NvZGUpKQl7CisJCS8qIERBRyA0LjJTIGFuZCA0LjIzUyBhbHJlYWR5IHN0cmlwIHRoZSBGQ1MuICBTdHJpcHBpbmcgdGhlIGZpbmFsIHdvcmQgYWdhaW4gdHJ1bmNhdGVzIHRoZSBwYWNrZXQuICovCisJCWhhbmRsZS0+bWQuZGFnX2Zjc19iaXRzID0gMDsKKworCQkvKiBOb3RlIHRoYXQgbm8gRkNTIHdpbGwgYmUgc3VwcGxpZWQuICovCisJCWhhbmRsZS0+bGlua3R5cGVfZXh0ID0gTFRfRkNTX0RBVEFMSU5LX0VYVCgwKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdGFydCBvdXQgYXNzdW1pbmcgaXQncyAzMiBiaXRzLgorCQkgKi8KKwkJaGFuZGxlLT5tZC5kYWdfZmNzX2JpdHMgPSAzMjsKKworCQkvKiBBbGxvdyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBvdmVycmlkZS4gKi8KKwkJaWYgKChzID0gZ2V0ZW52KCJFUkZfRkNTX0JJVFMiKSkgIT0gTlVMTCkgeworCQkJaWYgKChuID0gYXRvaShzKSkgPT0gMCB8fCBuID09IDE2IHx8IG4gPT0gMzIpIHsKKwkJCQloYW5kbGUtPm1kLmRhZ19mY3NfYml0cyA9IG47CisJCQl9IGVsc2UgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkicGNhcF9hY3RpdmF0ZSAlczogYmFkIEVSRl9GQ1NfQklUUyB2YWx1ZSAoJWQpIGluIGVudmlyb25tZW50XG4iLCBkZXZpY2UsIG4pOworCQkJCWdvdG8gZmFpbHN0b3A7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBEaWQgdGhlIHVzZXIgcmVxdWVzdCB0aGF0IHRoZXkgbm90IGJlIHN0cmlwcGVkPworCQkgKi8KKwkJaWYgKChzID0gZ2V0ZW52KCJFUkZfRE9OVF9TVFJJUF9GQ1MiKSkgIT0gTlVMTCkgeworCQkJLyogWWVzLiAgTm90ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBiZQorCQkJICAgc3VwcGxpZWQuICovCisJCQloYW5kbGUtPmxpbmt0eXBlX2V4dCA9IExUX0ZDU19EQVRBTElOS19FWFQoaGFuZGxlLT5tZC5kYWdfZmNzX2JpdHMvMTYpOworCisJCQkvKiBBbmQgZG9uJ3Qgc3RyaXAgdGhlbS4gKi8KKwkJCWhhbmRsZS0+bWQuZGFnX2Zjc19iaXRzID0gMDsKKwkJfQorCX0KKworCWhhbmRsZS0+bWQuZGFnX3RpbWVvdXQJPSBoYW5kbGUtPm1kLnRpbWVvdXQ7CisKKwloYW5kbGUtPmxpbmt0eXBlID0gLTE7CisJaWYgKGRhZ19nZXRfZGF0YWxpbmsoaGFuZGxlKSA8IDApCisJCWdvdG8gZmFpbHN0b3A7CisJCisJaGFuZGxlLT5idWZzaXplID0gMDsKKworCWlmIChuZXdfcGNhcF9kYWcoaGFuZGxlKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJuZXdfcGNhcF9kYWcgJXM6ICVzXG4iLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBmYWlsc3RvcDsKKwl9CisKKwkvKgorCSAqICJzZWxlY3QoKSIgYW5kICJwb2xsKCkiIGRvbid0IHdvcmsgb24gREFHIGRldmljZSBkZXNjcmlwdG9ycy4KKwkgKi8KKwloYW5kbGUtPnNlbGVjdGFibGVfZmQgPSAtMTsKKworCWlmIChuZXdEZXYgIT0gTlVMTCkgeworCQlmcmVlKChjaGFyICopbmV3RGV2KTsKKwl9CisKKwloYW5kbGUtPnJlYWRfb3AgPSBkYWdfcmVhZDsKKwloYW5kbGUtPmluamVjdF9vcCA9IGRhZ19pbmplY3Q7CisJaGFuZGxlLT5zZXRmaWx0ZXJfb3AgPSBkYWdfc2V0ZmlsdGVyOworCWhhbmRsZS0+c2V0ZGlyZWN0aW9uX29wID0gTlVMTDsgLyogTm90IGltcGxlbWVudGVkLiovCisJaGFuZGxlLT5zZXRfZGF0YWxpbmtfb3AgPSBkYWdfc2V0X2RhdGFsaW5rOworCWhhbmRsZS0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOworCWhhbmRsZS0+c2V0bm9uYmxvY2tfb3AgPSBkYWdfc2V0bm9uYmxvY2s7CisJaGFuZGxlLT5zdGF0c19vcCA9IGRhZ19zdGF0czsKKwloYW5kbGUtPmNsZWFudXBfb3AgPSBkYWdfcGxhdGZvcm1fY2xlYW51cDsKKwloYW5kbGUtPm1kLnN0YXQucHNfZHJvcCA9IDA7CisJaGFuZGxlLT5tZC5zdGF0LnBzX3JlY3YgPSAwOworCWhhbmRsZS0+bWQuc3RhdC5wc19pZmRyb3AgPSAwOworCXJldHVybiAwOworCisjaWZkZWYgSEFWRV9EQUdfU1RSRUFNU19BUEkgCitmYWlsc3RvcDoKKwlpZiAoZGFnX3N0b3Bfc3RyZWFtKGhhbmRsZS0+ZmQsIGhhbmRsZS0+bWQuZGFnX3N0cmVhbSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJkYWdfc3RvcF9zdHJlYW06ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCX0KKwkKK2ZhaWxkZXRhY2g6CisJaWYgKGRhZ19kZXRhY2hfc3RyZWFtKGhhbmRsZS0+ZmQsIGhhbmRsZS0+bWQuZGFnX3N0cmVhbSkgPCAwKQorCQlmcHJpbnRmKHN0ZGVyciwiZGFnX2RldGFjaF9zdHJlYW06ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworI2Vsc2UKK2ZhaWxzdG9wOgorCWlmIChkYWdfc3RvcChoYW5kbGUtPmZkKSA8IDApCisJCWZwcmludGYoc3RkZXJyLCJkYWdfc3RvcDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisjZW5kaWYgLyogSEFWRV9EQUdfU1RSRUFNU19BUEkgKi8KKwkKK2ZhaWxjbG9zZToKKwlpZiAoZGFnX2Nsb3NlKGhhbmRsZS0+ZmQpIDwgMCkKKwkJZnByaW50ZihzdGRlcnIsImRhZ19jbG9zZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJZGVsZXRlX3BjYXBfZGFnKGhhbmRsZSk7CisKK2ZhaWw6CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7CisJaWYgKG5ld0RldiAhPSBOVUxMKSB7CisJCWZyZWUoKGNoYXIgKiluZXdEZXYpOworCX0KKworCXJldHVybiBQQ0FQX0VSUk9SOworfQorCitwY2FwX3QgKmRhZ19jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXAtPmFjdGl2YXRlX29wID0gZGFnX2FjdGl2YXRlOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW50CitkYWdfc3RhdHMocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykgeworCS8qIFRoaXMgbmVlZHMgdG8gYmUgZmlsbGVkIG91dCBjb3JyZWN0bHkuICBIb3BlZnVsbHkgYSBkYWdhcGkgY2FsbCB3aWxsCisJCSBwcm92aWRlIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24uCisJKi8KKwkvKnAtPm1kLnN0YXQucHNfcmVjdiA9IDA7Ki8KKwkvKnAtPm1kLnN0YXQucHNfZHJvcCA9IDA7Ki8KKwkKKwkqcHMgPSBwLT5tZC5zdGF0OworIAorCXJldHVybiAwOworfQorCisvKgorICogUHJldmlvdXNseSB3ZSBqdXN0IGdlbmVyYXRlZCBhIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIG5hbWVzIGFuZCBsZXQKKyAqIHBjYXBfYWRkX2lmKCkgYXR0ZW1wdCB0byBvcGVuIGVhY2ggb25lLCBidXQgd2l0aCBzdHJlYW1zIHRoaXMgYWRkcyB1cAorICogdG8gODEgcG9zc2liaWxpdGllcyB3aGljaCBpcyBpbmVmZmljaWVudC4KKyAqCisgKiBTaW5jZSB3ZSBrbm93IG1vcmUgYWJvdXQgdGhlIGRldmljZXMgd2UgY2FuIHBydW5lIHRoZSB0cmVlIGhlcmUuCisgKiBwY2FwX2FkZF9pZigpIHdpbGwgc3RpbGwgcmV0ZXN0IGVhY2ggZGV2aWNlIGJ1dCB0aGUgdG90YWwgbnVtYmVyIG9mCisgKiBvcGVuIGF0dGVtcHRzIHdpbGwgc3RpbGwgYmUgbXVjaCBsZXNzIHRoYW4gdGhlIG5haXZlIGFwcHJvYWNoLgorICovCitpbnQKK2RhZ19wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKQoreworCWNoYXIgbmFtZVsxMl07CS8qIFhYWCAtIHBpY2sgYSBzaXplICovCisJaW50IHJldCA9IDA7CisJaW50IGM7CisJY2hhciBkYWduYW1lW0RBR05BTUVfQlVGU0laRV07CisJaW50IGRhZ3N0cmVhbTsKKwlpbnQgZGFnZmQ7CisKKwkvKiBUcnkgYWxsIHRoZSBEQUdzIDAtMzEgKi8KKwlmb3IgKGMgPSAwOyBjIDwgMzI7IGMrKykgeworCQlzbnByaW50ZihuYW1lLCAxMiwgImRhZyVkIiwgYyk7CisJCWlmICgtMSA9PSBkYWdfcGFyc2VfbmFtZShuYW1lLCBkYWduYW1lLCBEQUdOQU1FX0JVRlNJWkUsICZkYWdzdHJlYW0pKQorCQl7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKCAoZGFnZmQgPSBkYWdfb3BlbihkYWduYW1lKSkgPj0gMCApIHsKKwkJCWlmIChwY2FwX2FkZF9pZihkZXZsaXN0cCwgbmFtZSwgMCwgTlVMTCwgZXJyYnVmKSA9PSAtMSkgeworCQkJCS8qCisJCQkJICogRmFpbHVyZS4KKwkJCQkgKi8KKwkJCQlyZXQgPSAtMTsKKwkJCX0KKyNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQorCQkJeworCQkJCWludCBzdHJlYW0sIHJ4c3RyZWFtczsKKwkJCQlyeHN0cmVhbXMgPSBkYWdfcnhfZ2V0X3N0cmVhbV9jb3VudChkYWdmZCk7CisJCQkJZm9yKHN0cmVhbT0wO3N0cmVhbTxEQUdfU1RSRUFNX01BWDtzdHJlYW0rPTIpIHsKKwkJCQkJaWYgKDAgPT0gZGFnX2F0dGFjaF9zdHJlYW0oZGFnZmQsIHN0cmVhbSwgMCwgMCkpIHsKKwkJCQkJCWRhZ19kZXRhY2hfc3RyZWFtKGRhZ2ZkLCBzdHJlYW0pOworCisJCQkJCQlzbnByaW50ZihuYW1lLCAgMTAsICJkYWclZDolZCIsIGMsIHN0cmVhbSk7CisJCQkJCQlpZiAocGNhcF9hZGRfaWYoZGV2bGlzdHAsIG5hbWUsIDAsIE5VTEwsIGVycmJ1ZikgPT0gLTEpIHsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIEZhaWx1cmUuCisJCQkJCQkJICovCisJCQkJCQkJcmV0ID0gLTE7CisJCQkJCQl9CisJCQkJCQkKKwkJCQkJCXJ4c3RyZWFtcy0tOworCQkJCQkJaWYocnhzdHJlYW1zIDw9IDApIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0JCQkJCisJCQl9CisjZW5kaWYgIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCisJCQlkYWdfY2xvc2UoZGFnZmQpOworCQl9CisKKwl9CisJcmV0dXJuIChyZXQpOworfQorCisvKgorICogSW5zdGFsbHMgdGhlIGdpdmVuIGJwZiBmaWx0ZXIgcHJvZ3JhbSBpbiB0aGUgZ2l2ZW4gcGNhcCBzdHJ1Y3R1cmUuICBUaGVyZSBpcworICogbm8gYXR0ZW1wdCB0byBzdG9yZSB0aGUgZmlsdGVyIGluIGtlcm5lbCBtZW1vcnkgYXMgdGhhdCBpcyBub3Qgc3VwcG9ydGVkCisgKiB3aXRoIERBRyBjYXJkcy4KKyAqLworc3RhdGljIGludAorZGFnX3NldGZpbHRlcihwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApCit7CisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CisJaWYgKCFmcCkgeworCQlzdHJuY3B5KHAtPmVycmJ1ZiwgInNldGZpbHRlcjogTm8gZmlsdGVyIHNwZWNpZmllZCIsCisJCQlzaXplb2YocC0+ZXJyYnVmKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBNYWtlIG91ciBwcml2YXRlIGNvcHkgb2YgdGhlIGZpbHRlciAqLworCisJaWYgKGluc3RhbGxfYnBmX3Byb2dyYW0ocCwgZnApIDwgMCkKKwkJcmV0dXJuIC0xOworCisJcC0+bWQudXNlX2JwZiA9IDA7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitkYWdfc2V0X2RhdGFsaW5rKHBjYXBfdCAqcCwgaW50IGRsdCkKK3sKKwlwLT5saW5rdHlwZSA9IGRsdDsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK2RhZ19zZXRub25ibG9jayhwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKQoreworCS8qCisJICogU2V0IG5vbi1ibG9ja2luZyBtb2RlIG9uIHRoZSBGRC4KKwkgKiBYWFggLSBpcyB0aGF0IG5lY2Vzc2FyeT8gIElmIG5vdCwgZG9uJ3QgYm90aGVyIGNhbGxpbmcgaXQsCisJICogYW5kIGhhdmUgYSAiZGFnX2dldG5vbmJsb2NrKCkiIGZ1bmN0aW9uIHRoYXQgbG9va3MgYXQKKwkgKiAicC0+bWQuZGFnX29mZnNldF9mbGFncyIuCisJICovCisJaWYgKHBjYXBfc2V0bm9uYmxvY2tfZmQocCwgbm9uYmxvY2ssIGVycmJ1ZikgPCAwKQorCQlyZXR1cm4gKC0xKTsKKyNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQorCXsKKwkJdWludDMyX3QgbWluZGF0YTsKKwkJc3RydWN0IHRpbWV2YWwgbWF4d2FpdDsKKwkJc3RydWN0IHRpbWV2YWwgcG9sbDsKKwkJCisJCWlmIChkYWdfZ2V0X3N0cmVhbV9wb2xsKHAtPmZkLCBwLT5tZC5kYWdfc3RyZWFtLAorCQkJCQkmbWluZGF0YSwgJm1heHdhaXQsICZwb2xsKSA8IDApIHsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRhZ19nZXRfc3RyZWFtX3BvbGw6ICVzXG4iLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJCisJCS8qIEFtb3VudCBvZiBkYXRhIHRvIGNvbGxlY3QgaW4gQnl0ZXMgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzLgorCQkgKiBJbXBvcnRhbnQgZm9yIGVmZmljaWVuY3ksIGJ1dCBjYW4gaW50cm9kdWNlIGxhdGVuY3kKKwkJICogYXQgbG93IHBhY2tldCByYXRlcyBpZiB0b19tcyBub3Qgc2V0IQorCQkgKi8KKwkJaWYobm9uYmxvY2spCisJCQltaW5kYXRhID0gMDsKKwkJZWxzZQorCQkJbWluZGF0YSA9IDY1NTM2OworCQkKKwkJaWYgKGRhZ19zZXRfc3RyZWFtX3BvbGwocC0+ZmQsIHAtPm1kLmRhZ19zdHJlYW0sCisJCQkJCW1pbmRhdGEsICZtYXh3YWl0LCAmcG9sbCkgPCAwKSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkYWdfc2V0X3N0cmVhbV9wb2xsOiAlc1xuIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorI2VuZGlmIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCisJaWYgKG5vbmJsb2NrKSB7CisJCXAtPm1kLmRhZ19vZmZzZXRfZmxhZ3MgfD0gREFHRl9OT05CTE9DSzsKKwl9IGVsc2UgeworCQlwLT5tZC5kYWdfb2Zmc2V0X2ZsYWdzICY9IH5EQUdGX05PTkJMT0NLOworCX0KKwlyZXR1cm4gKDApOworfQorCQkKK3N0YXRpYyBpbnQKK2RhZ19nZXRfZGF0YWxpbmsocGNhcF90ICpwKQoreworCWludCBpbmRleD0wLCBkbHRfaW5kZXg9MDsKKwl1aW50OF90IHR5cGVzWzI1NV07CisKKwltZW1zZXQodHlwZXMsIDAsIDI1NSk7CisKKwlpZiAocC0+ZGx0X2xpc3QgPT0gTlVMTCAmJiAocC0+ZGx0X2xpc3QgPSBtYWxsb2MoMjU1KnNpemVvZigqKHAtPmRsdF9saXN0KSkpKSA9PSBOVUxMKSB7CisJCSh2b2lkKXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlwLT5saW5rdHlwZSA9IDA7CisKKyNpZmRlZiBIQVZFX0RBR19HRVRfU1RSRUFNX0VSRl9UWVBFUworCS8qIEdldCBsaXN0IG9mIHBvc3NpYmxlIEVSRiB0eXBlcyBmb3IgdGhpcyBjYXJkICovCisJaWYgKGRhZ19nZXRfc3RyZWFtX2VyZl90eXBlcyhwLT5mZCwgcC0+bWQuZGFnX3N0cmVhbSwgdHlwZXMsIDI1NSkgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksICJkYWdfZ2V0X3N0cmVhbV9lcmZfdHlwZXM6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsJCQorCX0KKwkKKwl3aGlsZSAodHlwZXNbaW5kZXhdKSB7CisKKyNlbGlmIGRlZmluZWQgSEFWRV9EQUdfR0VUX0VSRl9UWVBFUworCS8qIEdldCBsaXN0IG9mIHBvc3NpYmxlIEVSRiB0eXBlcyBmb3IgdGhpcyBjYXJkICovCisJaWYgKGRhZ19nZXRfZXJmX3R5cGVzKHAtPmZkLCB0eXBlcywgMjU1KSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwgImRhZ19nZXRfZXJmX3R5cGVzOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CQkKKwl9CisJCisJd2hpbGUgKHR5cGVzW2luZGV4XSkgeworI2Vsc2UKKwkvKiBDaGVjayB0aGUgdHlwZSB0aHJvdWdoIGEgZGFnYXBpIGNhbGwuICovCisJdHlwZXNbaW5kZXhdID0gZGFnX2xpbmt0eXBlKHAtPmZkKTsKKworCXsKKyNlbmRpZgorCQlzd2l0Y2goKHR5cGVzW2luZGV4XSAmIDB4N2YpKSB7CisKKwkJY2FzZSBUWVBFX0hETENfUE9TOgorCQljYXNlIFRZUEVfQ09MT1JfSERMQ19QT1M6CisJCWNhc2UgVFlQRV9EU01fQ09MT1JfSERMQ19QT1M6CisJCWNhc2UgVFlQRV9DT0xPUl9IQVNIX1BPUzoKKworCQkJaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfQ0hETEM7CisJCQkJcC0+ZGx0X2xpc3RbZGx0X2luZGV4KytdID0gRExUX1BQUF9TRVJJQUw7CisJCQkJcC0+ZGx0X2xpc3RbZGx0X2luZGV4KytdID0gRExUX0ZSRUxBWTsKKwkJCX0KKwkJCWlmKCFwLT5saW5rdHlwZSkKKwkJCQlwLT5saW5rdHlwZSA9IERMVF9DSERMQzsKKwkJCWJyZWFrOworCisJCWNhc2UgVFlQRV9FVEg6CisJCWNhc2UgVFlQRV9DT0xPUl9FVEg6CisJCWNhc2UgVFlQRV9EU01fQ09MT1JfRVRIOgorCQljYXNlIFRZUEVfQ09MT1JfSEFTSF9FVEg6CisJCQkvKgorCQkJICogVGhpcyBpcyAocHJlc3VtYWJseSkgYSByZWFsIEV0aGVybmV0IGNhcHR1cmU7IGdpdmUgaXQgYQorCQkJICogbGluay1sYXllci10eXBlIGxpc3Qgd2l0aCBETFRfRU4xME1CIGFuZCBETFRfRE9DU0lTLCBzbworCQkJICogdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gbGV0IHlvdSBjaG9vc2UgaXQsIGluIGNhc2UgeW91J3JlCisJCQkgKiBjYXB0dXJpbmcgRE9DU0lTIHRyYWZmaWMgdGhhdCBhIENpc2NvIENhYmxlIE1vZGVtCisJCQkgKiBUZXJtaW5hdGlvbiBTeXN0ZW0gaXMgcHV0dGluZyBvdXQgb250byBhbiBFdGhlcm5ldCAoaXQKKwkJCSAqIGRvZXNuJ3QgcHV0IGFuIEV0aGVybmV0IGhlYWRlciBvbnRvIHRoZSB3aXJlLCBpdCBwdXRzIHJhdworCQkJICogRE9DU0lTIGZyYW1lcyBvdXQgb24gdGhlIHdpcmUgaW5zaWRlIHRoZSBsb3ctbGV2ZWwKKwkJCSAqIEV0aGVybmV0IGZyYW1pbmcpLgorCQkJICovCisJCQlpZiAocC0+ZGx0X2xpc3QgIT0gTlVMTCkgeworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9FTjEwTUI7CisJCQkJcC0+ZGx0X2xpc3RbZGx0X2luZGV4KytdID0gRExUX0RPQ1NJUzsKKwkJCX0KKwkJCWlmKCFwLT5saW5rdHlwZSkKKwkJCQlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7CisJCQlicmVhazsKKworCQljYXNlIFRZUEVfQVRNOiAKKwkJY2FzZSBUWVBFX0FBTDU6CisJCWNhc2UgVFlQRV9NQ19BVE06CisJCWNhc2UgVFlQRV9NQ19BQUw1OgorCQkJaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfQVRNX1JGQzE0ODM7CisJCQkJcC0+ZGx0X2xpc3RbZGx0X2luZGV4KytdID0gRExUX1NVTkFUTTsKKwkJCX0KKwkJCWlmKCFwLT5saW5rdHlwZSkKKwkJCQlwLT5saW5rdHlwZSA9IERMVF9BVE1fUkZDMTQ4MzsKKwkJCWJyZWFrOworCisJCWNhc2UgVFlQRV9DT0xPUl9NQ19IRExDX1BPUzoKKwkJY2FzZSBUWVBFX01DX0hETEM6CisJCQlpZiAocC0+ZGx0X2xpc3QgIT0gTlVMTCkgeworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9DSERMQzsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfUFBQX1NFUklBTDsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfRlJFTEFZOworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9NVFAyOworCQkJCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9NVFAyX1dJVEhfUEhEUjsKKwkJCQlwLT5kbHRfbGlzdFtkbHRfaW5kZXgrK10gPSBETFRfTEFQRDsKKwkJCX0KKwkJCWlmKCFwLT5saW5rdHlwZSkKKwkJCQlwLT5saW5rdHlwZSA9IERMVF9DSERMQzsKKwkJCWJyZWFrOworCisJCWNhc2UgVFlQRV9JUFY0OgorCQljYXNlIFRZUEVfSVBWNjoKKwkJCWlmKCFwLT5saW5rdHlwZSkKKwkJCQlwLT5saW5rdHlwZSA9IERMVF9SQVc7CisJCQlicmVhazsKKworCQljYXNlIFRZUEVfTEVHQUNZOgorCQljYXNlIFRZUEVfTUNfUkFXOgorCQljYXNlIFRZUEVfTUNfUkFXX0NIQU5ORUw6CisJCWNhc2UgVFlQRV9JUF9DT1VOVEVSOgorCQljYXNlIFRZUEVfVENQX0ZMT1dfQ09VTlRFUjoKKwkJY2FzZSBUWVBFX0lORklOSUJBTkQ6CisJCWNhc2UgVFlQRV9SQVdfTElOSzoKKwkJY2FzZSBUWVBFX0lORklOSUJBTkRfTElOSzoKKwkJZGVmYXVsdDoKKwkJCS8qIExpYnBjYXAgY2Fubm90IGRlYWwgd2l0aCB0aGVzZSB0eXBlcyB5ZXQgKi8KKwkJCS8qIEFkZCBubyAnbmF0aXZlJyBETFRzLCBidXQgc3RpbGwgY292ZXJlZCBieSBETFRfRVJGICovCisJCQlicmVhazsKKworCQl9IC8qIHN3aXRjaCAqLworCQlpbmRleCsrOworCX0KKworCXAtPmRsdF9saXN0W2RsdF9pbmRleCsrXSA9IERMVF9FUkY7CisKKwlwLT5kbHRfY291bnQgPSBkbHRfaW5kZXg7CisKKwlpZighcC0+bGlua3R5cGUpCisJCXAtPmxpbmt0eXBlID0gRExUX0VSRjsKKworCXJldHVybiBwLT5saW5rdHlwZTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1kYWcuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC1kYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2RlZjdiCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLWRhZy5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogcGNhcC1kYWcuYzogUGFja2V0IGNhcHR1cmUgaW50ZXJmYWNlIGZvciBFbmRhY2UgREFHIGNhcmQuCisgKgorICogVGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBjb2RlIGF0dGVtcHRzIHRvIG1pbWljIHRoYXQgb2YgcGNhcC1saW51eCBhcyBtdWNoCisgKiBhcyBwb3NzaWJsZS4gIFRoaXMgY29kZSBpcyBvbmx5IG5lZWRlZCB3aGVuIGNvbXBpbGluZyBpbiB0aGUgREFHIGNhcmQgY29kZQorICogYXQgdGhlIHNhbWUgdGltZSBhcyBhbm90aGVyIHR5cGUgb2YgZGV2aWNlLgorICoKKyAqIEF1dGhvcjogUmljaGFyZCBMaXR0aW4sIFNlYW4gSXJ2aW5lICh7cmljaGFyZCxzZWFufUByZWVsdHdvLmNvbSkKKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtZGFnLmgsdiAxLjcgMjAwOC0wNC0wNCAxOTozNzo0NSBndXkgRXhwICQgKExCTCkKKyAqLworCitwY2FwX3QgKmRhZ19jcmVhdGUoY29uc3QgY2hhciAqLCBjaGFyICopOworaW50IGRhZ19wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKTsKKworI2lmbmRlZiBUWVBFX0FBTDUKKyNkZWZpbmUgVFlQRV9BQUw1ICAgICAgICAgICAgICAgNAorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9NQ19IRExDCisjZGVmaW5lIFRZUEVfTUNfSERMQyAgICAgICAgICAgIDUKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfUkFXCisjZGVmaW5lIFRZUEVfTUNfUkFXICAgICAgICAgICAgIDYKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfQVRNCisjZGVmaW5lIFRZUEVfTUNfQVRNICAgICAgICAgICAgIDcKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfTUNfUkFXX0NIQU5ORUwKKyNkZWZpbmUgVFlQRV9NQ19SQVdfQ0hBTk5FTCAgICAgOAorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9NQ19BQUw1CisjZGVmaW5lIFRZUEVfTUNfQUFMNSAgICAgICAgICAgIDkKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSERMQ19QT1MKKyNkZWZpbmUgVFlQRV9DT0xPUl9IRExDX1BPUyAgICAgMTAKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfRVRICisjZGVmaW5lIFRZUEVfQ09MT1JfRVRIICAgICAgICAgIDExCisjZW5kaWYKKworI2lmbmRlZiBUWVBFX01DX0FBTDIKKyNkZWZpbmUgVFlQRV9NQ19BQUwyICAgICAgICAgICAgMTIKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSVBfQ09VTlRFUgorI2RlZmluZSBUWVBFX0lQX0NPVU5URVIgICAgICAgICAxMworI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9UQ1BfRkxPV19DT1VOVEVSCisjZGVmaW5lIFRZUEVfVENQX0ZMT1dfQ09VTlRFUiAgIDE0CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUworI2RlZmluZSBUWVBFX0RTTV9DT0xPUl9IRExDX1BPUyAxNQorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9EU01fQ09MT1JfRVRICisjZGVmaW5lIFRZUEVfRFNNX0NPTE9SX0VUSCAgICAgIDE2CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0NPTE9SX01DX0hETENfUE9TCisjZGVmaW5lIFRZUEVfQ09MT1JfTUNfSERMQ19QT1MgIDE3CisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0FBTDIKKyNkZWZpbmUgVFlQRV9BQUwyICAgICAgICAgICAgICAgMTgKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSEFTSF9QT1MKKyNkZWZpbmUgVFlQRV9DT0xPUl9IQVNIX1BPUyAgICAgMTkKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfQ09MT1JfSEFTSF9FVEgKKyNkZWZpbmUgVFlQRV9DT0xPUl9IQVNIX0VUSCAgICAgMjAKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSU5GSU5JQkFORAorI2RlZmluZSBUWVBFX0lORklOSUJBTkQgICAgICAgICAyMQorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9JUFY0CisjZGVmaW5lIFRZUEVfSVBWNCAgICAgICAgICAgICAgIDIyCisjZW5kaWYKKworI2lmbmRlZiBUWVBFX0lQVjYKKyNkZWZpbmUgVFlQRV9JUFY2ICAgICAgICAgICAgICAgMjMKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfUkFXX0xJTksKKyNkZWZpbmUgVFlQRV9SQVdfTElOSyAgICAgICAgICAgMjQKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVfSU5GSU5JQkFORF9MSU5LCisjZGVmaW5lIFRZUEVfSU5GSU5JQkFORF9MSU5LICAgIDI1CisjZW5kaWYKKworCisKKyNpZm5kZWYgVFlQRV9QQUQKKyNkZWZpbmUgVFlQRV9QQUQgICAgICAgICAgICAgICAgNDgKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLWRscGkuYyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1kbHBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiYjQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1kbHBpLmMKQEAgLTAsMCArMSwxNzA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogVGhpcyBjb2RlIGNvbnRyaWJ1dGVkIGJ5IEF0YW51IEdob3NoIChhdGFudUBjcy51Y2wuYWMudWspLAorICogVW5pdmVyc2l0eSBDb2xsZWdlIExvbmRvbiwgYW5kIHN1YnNlcXVlbnRseSBtb2RpZmllZCBieQorICogR3V5IEhhcnJpcyAoZ3V5QGFsdW0ubWl0LmVkdSksIE1hcmsgUGl6em9sYXRvCisgKiA8TGlzdC10Y3BkdW1wLXdvcmtlcnNAc3Vic2NyaXB0aW9ucy5waXp6b2xhdG8ubmV0PiwKKyAqIE1hcmsgQy4gQnJvd24gKG1icm93bkBocC5jb20pLCBhbmQgU2FndW4gU2hha3lhIDxTYWd1bi5TaGFreWFAU3VuLkNPTT4uCisgKi8KKworLyoKKyAqIFBhY2tldCBjYXB0dXJlIHJvdXRpbmUgZm9yIERMUEkgdW5kZXIgU3VuT1MgNSwgSFAtVVggOS8xMC8xMSwgYW5kIEFJWC4KKyAqCisgKiBOb3RlczoKKyAqCisgKiAgICAtIFRoZSBETElPQ1JBVyBpb2N0bCgpIGlzIHNwZWNpZmljIHRvIFN1bk9TLgorICoKKyAqICAgIC0gVGhlcmUgaXMgYSBidWcgaW4gYnVmbW9kKDcpIHN1Y2ggdGhhdCBzZXR0aW5nIHRoZSBzbmFwc2hvdAorICogICAgICBsZW5ndGggcmVzdWx0cyBpbiBkYXRhIGJlaW5nIGxlZnQgb2YgdGhlIGZyb250IG9mIHRoZSBwYWNrZXQuCisgKgorICogICAgLSBJdCBtaWdodCBiZSBkZXNpcmFibGUgdG8gdXNlIHBmbW9kKDcpIHRvIGZpbHRlciBwYWNrZXRzIGluIHRoZQorICogICAgICBrZXJuZWwgd2hlbiBwb3NzaWJsZS4KKyAqCisgKiAgICAtIEFuIG9sZGVyIHZlcnNpb24gb2YgdGhlIEhQLVVYIERMUEkgUHJvZ3JhbW1lcidzIEd1aWRlLCB3aGljaAorICogICAgICBJIHRoaW5rIHdhcyBhZHZlcnRpc2VkIGFzIHRoZSAxMC4yMCB2ZXJzaW9uLCB1c2VkIHRvIGJlIGF2YWlsYWJsZQorICogICAgICBhdAorICoKKyAqICAgICAgICAgICAgaHR0cDovL2RvY3MuaHAuY29tL2hwdXgvb25saW5lZG9jcy9CMjM1NS05MDA5My9CMjM1NS05MDA5My5odG1sCisgKgorICogICAgICBidXQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZTsgaXQgY2FuIHN0aWxsIGJlIGZvdW5kIGF0CisgKgorICogICAgICAgICAgICBodHRwOi8vaDIxMDA3Lnd3dzIuaHAuY29tL2RzcHAvZmlsZXMvdW5wcm90ZWN0ZWQvRHJpdmVycy9Eb2NzL1JlZnMvQjIzNTUtOTAwOTMucGRmCisgKgorICogICAgICBpbiBQREYgZm9ybS4KKyAqCisgKiAgICAtIFRoZSBIUC1VWCAxMC54LCAxMS4wLCBhbmQgMTFpIHYxLjYgdmVyc2lvbiBvZiB0aGUgSFAtVVggRExQSQorICogICAgICBQcm9ncmFtbWVyJ3MgR3VpZGUsIHdoaWNoIEkgdGhpbmsgd2FzIG9uY2UgYWR2ZXJ0aXNlZCBhcyB0aGUKKyAqICAgICAgMTEuMDAgdmVyc2lvbiBpcyBhdmFpbGFibGUgYXQKKyAqCisgKiAgICAgICAgICAgIGh0dHA6Ly9kb2NzLmhwLmNvbS9lbi9CMjM1NS05MDEzOS9pbmRleC5odG1sCisgKgorICogICAgLSBUaGUgSFAtVVggMTFpIHYyIHZlcnNpb24gb2YgdGhlIEhQLVVYIERMUEkgUHJvZ3JhbW1lcidzIEd1aWRlCisgKiAgICAgIGlzIGF2YWlsYWJsZSBhdAorICoKKyAqICAgICAgICAgICAgaHR0cDovL2RvY3MuaHAuY29tL2VuL0IyMzU1LTkwODcxL2luZGV4Lmh0bWwKKyAqCisgKiAgICAtIEFsbCBvZiB0aGUgSFAgZG9jdW1lbnRzIGRlc2NyaWJlIHJhdy1tb2RlIHNlcnZpY2VzLCB3aGljaCBhcmUKKyAqICAgICAgd2hhdCB3ZSB1c2UgaWYgRExfSFBfUkFXRExTIGlzIGRlZmluZWQuICBYWFggLSB3ZSB1c2UgX19ocHV4CisgKiAgICAgIGluIHNvbWUgcGxhY2VzIHRvIHRlc3QgZm9yIEhQLVVYLCBidXQgdXNlIERMX0hQX1JBV0RMUyBpbgorICogICAgICBvdGhlciBwbGFjZXM7IGRvIHdlIHN1cHBvcnQgYW55IHZlcnNpb25zIG9mIEhQLVVYIHdpdGhvdXQKKyAqICAgICAgRExfSFBfUkFXRExTPworICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtZGxwaS5jLHYgMS4xMjggMjAwOC0xMi0wMiAxNjoyMDoyMyBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKyNpbmNsdWRlIDxzeXMvYnVmbW9kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvZGxwaS5oPgorI2lmZGVmIEhBVkVfU1lTX0RMUElfRVhUX0gKKyNpbmNsdWRlIDxzeXMvZGxwaV9leHQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSFBVWDkKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKyNpZmRlZiBETF9IUF9QUEFfUkVRCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyNpZiBkZWZpbmVkKEhBVkVfU09MQVJJUykgJiYgZGVmaW5lZChIQVZFX1NZU19CVUZNT0RfSCkKKyNpbmNsdWRlIDxzeXMvc3lzdGVtaW5mby5oPgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0hQVVg5CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaWZkZWYgSEFWRV9IUFVYOQorI2luY2x1ZGUgPG5saXN0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJvcHRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBIQVZFX0xJTUlUU19ICisjaW5jbHVkZSA8bGltaXRzLmg+CisjZWxzZQorI2RlZmluZSBJTlRfTUFYCQkyMTQ3NDgzNjQ3CisjZW5kaWYKKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAiZGxwaXN1YnMuaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2lmbmRlZiBQQ0FQX0RFVl9QUkVGSVgKKyNpZmRlZiBfQUlYCisjZGVmaW5lIFBDQVBfREVWX1BSRUZJWCAiL2Rldi9kbHBpIgorI2Vsc2UKKyNkZWZpbmUgUENBUF9ERVZfUFJFRklYICIvZGV2IgorI2VuZGlmCisjZW5kaWYKKworI2RlZmluZQlNQVhETEJVRgk4MTkyCisKKy8qIEZvcndhcmRzICovCitzdGF0aWMgY2hhciAqc3BsaXRfZG5hbWUoY2hhciAqLCBpbnQgKiwgY2hhciAqKTsKK3N0YXRpYyBpbnQgZGxfZG9hdHRhY2goaW50LCBpbnQsIGNoYXIgKik7CisjaWZkZWYgRExfSFBfUkFXRExTCitzdGF0aWMgaW50IGRsX2RvaHB1eGJpbmQoaW50LCBjaGFyICopOworI2VuZGlmCitzdGF0aWMgaW50IGRscHJvbWlzY29uKHBjYXBfdCAqLCBicGZfdV9pbnQzMik7CitzdGF0aWMgaW50IGRsYmluZHJlcShpbnQsIGJwZl91X2ludDMyLCBjaGFyICopOworc3RhdGljIGludCBkbGJpbmRhY2soaW50LCBjaGFyICosIGNoYXIgKiwgaW50ICopOworc3RhdGljIGludCBkbG9rYWNrKGludCwgY29uc3QgY2hhciAqLCBjaGFyICosIGNoYXIgKik7CitzdGF0aWMgaW50IGRsaW5mb3JlcShpbnQsIGNoYXIgKik7CitzdGF0aWMgaW50IGRsaW5mb2FjayhpbnQsIGNoYXIgKiwgY2hhciAqKTsKKworI2lmZGVmIEhBVkVfRExQSV9QQVNTSVZFCitzdGF0aWMgdm9pZCBkbHBhc3NpdmUoaW50LCBjaGFyICopOworI2VuZGlmCisKKyNpZmRlZiBETF9IUF9SQVdETFMKK3N0YXRpYyBpbnQgZGxyYXdkYXRhcmVxKGludCwgY29uc3QgdV9jaGFyICosIGludCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgcmVjdl9hY2soaW50LCBpbnQsIGNvbnN0IGNoYXIgKiwgY2hhciAqLCBjaGFyICosIGludCAqKTsKK3N0YXRpYyBjaGFyICpkbHN0cmVycm9yKGJwZl91X2ludDMyKTsKK3N0YXRpYyBjaGFyICpkbHByaW0oYnBmX3VfaW50MzIpOworI2lmIGRlZmluZWQoSEFWRV9TT0xBUklTKSAmJiBkZWZpbmVkKEhBVkVfU1lTX0JVRk1PRF9IKQorc3RhdGljIGNoYXIgKmdldF9yZWxlYXNlKGJwZl91X2ludDMyICosIGJwZl91X2ludDMyICosIGJwZl91X2ludDMyICopOworI2VuZGlmCitzdGF0aWMgaW50IHNlbmRfcmVxdWVzdChpbnQsIGNoYXIgKiwgaW50LCBjaGFyICosIGNoYXIgKik7CisjaWZkZWYgSEFWRV9IUFVYOQorc3RhdGljIGludCBkbHBpX2tyZWFkKGludCwgb2ZmX3QsIHZvaWQgKiwgdV9pbnQsIGNoYXIgKik7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0RFVl9ETFBJCitzdGF0aWMgaW50IGdldF9kbHBpX3BwYShpbnQsIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICopOworI2VuZGlmCisKKy8qIFhYWCBOZWVkZWQgYnkgSFAtVVggKGF0IGxlYXN0KSAqLworc3RhdGljIGJwZl91X2ludDMyIGN0bGJ1ZltNQVhETEJVRl07CitzdGF0aWMgc3RydWN0IHN0cmJ1ZiBjdGwgPSB7CisJTUFYRExCVUYsCisJMCwKKwkoY2hhciAqKWN0bGJ1ZgorfTsKKworLyoKKyAqIENhc3QgYSBidWZmZXIgdG8gInVuaW9uIERMX3ByaW1pdGl2ZXMiIHdpdGhvdXQgcHJvdm9raW5nIHdhcm5pbmdzCisgKiBmcm9tIHRoZSBjb21waWxlci4KKyAqLworI2RlZmluZSBNQUtFX0RMX1BSSU1JVElWRVMocHRyKQkoKHVuaW9uIERMX3ByaW1pdGl2ZXMgKikodm9pZCAqKShwdHIpKQorCitzdGF0aWMgaW50CitwY2FwX3JlYWRfZGxwaShwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCWludCBjYzsKKwl1X2NoYXIgKmJwOworCWludCBmbGFnczsKKwlzdHJ1Y3Qgc3RyYnVmIGRhdGE7CisKKwlmbGFncyA9IDA7CisJY2MgPSBwLT5jYzsKKwlpZiAoY2MgPT0gMCkgeworCQlkYXRhLmJ1ZiA9IChjaGFyICopcC0+YnVmZmVyICsgcC0+b2Zmc2V0OworCQlkYXRhLm1heGxlbiA9IHAtPmJ1ZnNpemU7CisJCWRhdGEubGVuID0gMDsKKwkJZG8geworCQkJLyoKKwkJCSAqIEhhcyAicGNhcF9icmVha2xvb3AoKSIgYmVlbiBjYWxsZWQ/CisJCQkgKi8KKwkJCWlmIChwLT5icmVha19sb29wKSB7CisJCQkJLyoKKwkJCQkgKiBZZXMgLSBjbGVhciB0aGUgZmxhZyB0aGF0IGluZGljYXRlcworCQkJCSAqIHRoYXQgaXQgaGFzLCBhbmQgcmV0dXJuIC0yIHRvCisJCQkJICogaW5kaWNhdGUgdGhhdCB3ZSB3ZXJlIHRvbGQgdG8KKwkJCQkgKiBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisJCQkJICovCisJCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQkJcmV0dXJuICgtMik7CisJCQl9CisJCQkvKgorCQkJICogWFhYIC0gY2hlY2sgZm9yIHRoZSBETFBJIHByaW1pdGl2ZSwgd2hpY2gKKwkJCSAqIHdvdWxkIGJlIERMX0hQX1JBV0RBVEFfSU5EIG9uIEhQLVVYCisJCQkgKiBpZiB3ZSdyZSBpbiByYXcgbW9kZT8KKwkJCSAqLworCQkJaWYgKGdldG1zZyhwLT5mZCwgJmN0bCwgJmRhdGEsICZmbGFncykgPCAwKSB7CisJCQkJLyogRG9uJ3QgY2hva2Ugd2hlbiB3ZSBnZXQgcHRyYWNlZCAqLworCQkJCXN3aXRjaCAoZXJybm8pIHsKKworCQkJCWNhc2UgRUlOVFI6CisJCQkJCWNjID0gMDsKKwkJCQkJY29udGludWU7CisKKwkJCQljYXNlIEVBR0FJTjoKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQkJc3RybGNweShwLT5lcnJidWYsIHBjYXBfc3RyZXJyb3IoZXJybm8pLAorCQkJCSAgICBzaXplb2YocC0+ZXJyYnVmKSk7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQljYyA9IGRhdGEubGVuOworCQl9IHdoaWxlIChjYyA9PSAwKTsKKwkJYnAgPSBwLT5idWZmZXIgKyBwLT5vZmZzZXQ7CisJfSBlbHNlCisJCWJwID0gcC0+YnA7CisKKwlyZXR1cm4gKHBjYXBfcHJvY2Vzc19wa3RzKHAsIGNhbGxiYWNrLCB1c2VyLCBjbnQsIGJwLCBjYykpOworfQorCitzdGF0aWMgaW50CitwY2FwX2luamVjdF9kbHBpKHBjYXBfdCAqcCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisjaWYgZGVmaW5lZChETElPQ1JBVykKKwlyZXQgPSB3cml0ZShwLT5mZCwgYnVmLCBzaXplKTsKKwlpZiAocmV0ID09IC0xKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorI2VsaWYgZGVmaW5lZChETF9IUF9SQVdETFMpCisJaWYgKHAtPnNlbmRfZmQgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJzZW5kOiBPdXRwdXQgRkQgY291bGRuJ3QgYmUgb3BlbmVkIik7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXQgPSBkbHJhd2RhdGFyZXEocC0+c2VuZF9mZCwgYnVmLCBzaXplKTsKKwlpZiAocmV0ID09IC0xKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCS8qCisJICogcHV0bXNnKCkgcmV0dXJucyBlaXRoZXIgMCBvciAtMTsgaXQgZG9lc24ndCBpbmRpY2F0ZSBob3cKKwkgKiBtYW55IGJ5dGVzIHdlcmUgd3JpdHRlbiAocHJlc3VtYWJseSB0aGV5IHdlcmUgYWxsIHdyaXR0ZW4KKwkgKiBvciBub25lIG9mIHRoZW0gd2VyZSB3cml0dGVuKS4gIE9wZW5CU0QncyBwY2FwX2luamVjdCgpCisJICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHNvLCBmb3IgQVBJIGNvbXBhdGliaWxpdHksCisJICogd2UgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2Ugd2VyZSB0b2xkIHRvIHdyaXRlLgorCSAqLworCXJldCA9IHNpemU7CisjZWxzZSAvKiBubyByYXcgbW9kZSAqLworCS8qCisJICogWFhYIC0gdGhpcyBpcyBhIHBhaW4sIGJlY2F1c2UgeW91IG1pZ2h0IGhhdmUgdG8gZXh0cmFjdAorCSAqIHRoZSBhZGRyZXNzIGZyb20gdGhlIHBhY2tldCBhbmQgdXNlIGl0IGluIGEgRExfVU5JVERBVEFfUkVRCisJICogcmVxdWVzdC4gIFRoYXQgd291bGQgYmUgZGVwZW5kZW50IG9uIHRoZSBsaW5rLWxheWVyIHR5cGUuCisJICoKKwkgKiBJIGFsc28gZG9uJ3Qga25vdyB3aGF0IFNBUCB5b3UnZCBoYXZlIHRvIGJpbmQgdGhlIGRlc2NyaXB0b3IKKwkgKiB0bywgb3Igd2hldGhlciB5b3UnZCBuZWVkIHNlcGFyYXRlICJyZWNlaXZlIiBhbmQgInNlbmQiIEZEcywKKwkgKiBub3IgZG8gSSBrbm93IHdoZXRoZXIgeW91J2QgbmVlZCBkaWZmZXJlbnQgYmluZGluZ3MgZm9yCisJICogRC9JL1ggRXRoZXJuZXQgYW5kIDgwMi4zLCBvciBmb3Ige0ZEREksVG9rZW4gUmluZ30gcGx1cworCSAqIDgwMi4yIGFuZCB7RkRESSxUb2tlbiBSaW5nfSBwbHVzIDgwMi4yIHBsdXMgU05BUC4KKwkgKgorCSAqIFNvLCBmb3Igbm93LCB3ZSBqdXN0IHJldHVybiBhICJ5b3UgY2FuJ3Qgc2VuZCIgaW5kaWNhdGlvbiwKKwkgKiBhbmQgbGVhdmUgaXQgdXAgdG8gc29tZWJvZHkgd2l0aCBhIERMUEktYmFzZWQgc3lzdGVtIGxhY2tpbmcKKwkgKiBib3RoIERMSU9DUkFXIGFuZCBETF9IUF9SQVdETFMgdG8gc3VwcGx5IGNvZGUgdG8gaW1wbGVtZW50CisJICogcGFja2V0IHRyYW5zbWlzc2lvbiBvbiB0aGF0IHN5c3RlbS4gIElmIHRoZXkgZG8sIHRoZXkgc2hvdWxkCisJICogc2VuZCBpdCB0byB1cyAtIGJ1dCBzaG91bGQgbm90IHNlbmQgdXMgY29kZSB0aGF0IGFzc3VtZXMKKwkgKiBFdGhlcm5ldDsgaWYgdGhlIGNvZGUgZG9lc24ndCB3b3JrIG9uIG5vbi1FdGhlcm5ldCBpbnRlcmZhY2VzLAorCSAqIGl0IHNob3VsZCBjaGVjayAicC0+bGlua3R5cGUiIGFuZCByZWplY3QgdGhlIHNlbmQgcmVxdWVzdCBpZgorCSAqIGl0J3MgYW55dGhpbmcgb3RoZXIgdGhhbiBETFRfRU4xME1CLgorCSAqLworCXN0cmxjcHkocC0+ZXJyYnVmLCAic2VuZDogTm90IHN1cHBvcnRlZCBvbiB0aGlzIHZlcnNpb24gb2YgdGhpcyBPUyIsCisJICAgIFBDQVBfRVJSQlVGX1NJWkUpOworCXJldCA9IC0xOworI2VuZGlmIC8qIHJhdyBtb2RlICovCisJcmV0dXJuIChyZXQpOworfSAgIAorCisjaWZuZGVmIERMX0lQQVRNCisjZGVmaW5lIERMX0lQQVRNCTB4MTIJLyogQVRNIENsYXNzaWNhbCBJUCBpbnRlcmZhY2UgKi8KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TT0xBUklTCisvKgorICogRm9yIFN1bkFUTS4KKyAqLworI2lmbmRlZiBBX0dFVF9VTklUUworI2RlZmluZSBBX0dFVF9VTklUUwkoKCdBJzw8OCl8MTE4KQorI2VuZGlmIC8qIEFfR0VUX1VOSVRTICovCisjaWZuZGVmIEFfUFJPTUlTQ09OX1JFUQorI2RlZmluZSBBX1BST01JU0NPTl9SRVEJKCgnQSc8PDgpfDEyMSkKKyNlbmRpZiAvKiBBX1BST01JU0NPTl9SRVEgKi8KKyNlbmRpZiAvKiBIQVZFX1NPTEFSSVMgKi8KKworc3RhdGljIHZvaWQKK3BjYXBfY2xlYW51cF9kbHBpKHBjYXBfdCAqcCkKK3sKKwlpZiAocC0+c2VuZF9mZCA+PSAwKSB7CisJCWNsb3NlKHAtPnNlbmRfZmQpOworCQlwLT5zZW5kX2ZkID0gLTE7CisJfQorCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwKTsKK30KKworc3RhdGljIGludAorcGNhcF9hY3RpdmF0ZV9kbHBpKHBjYXBfdCAqcCkKK3sKKwlyZWdpc3RlciBjaGFyICpjcDsKKwlpbnQgcHBhOworI2lmZGVmIEhBVkVfU09MQVJJUworCWludCBpc2F0bSA9IDA7CisjZW5kaWYKKwlyZWdpc3RlciBkbF9pbmZvX2Fja190ICppbmZvcDsKKyNpZmRlZiBIQVZFX1NZU19CVUZNT0RfSAorCWJwZl91X2ludDMyIHNzOworI2lmZGVmIEhBVkVfU09MQVJJUworCXJlZ2lzdGVyIGNoYXIgKnJlbGVhc2U7CisJYnBmX3VfaW50MzIgb3NtYWpvciwgb3NtaW5vciwgb3NtaWNybzsKKyNlbmRpZgorI2VuZGlmCisJYnBmX3VfaW50MzIgYnVmW01BWERMQlVGXTsKKwljaGFyIGRuYW1lWzEwMF07CisjaWZuZGVmIEhBVkVfREVWX0RMUEkKKwljaGFyIGRuYW1lMlsxMDBdOworI2VuZGlmCisJaW50IHN0YXR1cyA9IFBDQVBfRVJST1I7CisKKyNpZmRlZiBIQVZFX0RFVl9ETFBJCisJLyoKKwkqKiBSZW1vdmUgYW55ICIvZGV2LyIgb24gdGhlIGZyb250IG9mIHRoZSBkZXZpY2UuCisJKi8KKwljcCA9IHN0cnJjaHIocC0+b3B0LnNvdXJjZSwgJy8nKTsKKwlpZiAoY3AgPT0gTlVMTCkKKwkJc3RybGNweShkbmFtZSwgcC0+b3B0LnNvdXJjZSwgc2l6ZW9mKGRuYW1lKSk7CisJZWxzZQorCQlzdHJsY3B5KGRuYW1lLCBjcCArIDEsIHNpemVvZihkbmFtZSkpOworCisJLyoKKwkgKiBTcGxpdCB0aGUgZGV2aWNlIG5hbWUgaW50byBhIGRldmljZSB0eXBlIG5hbWUgYW5kIGEgdW5pdCBudW1iZXI7CisJICogY2hvcCBvZmYgdGhlIHVuaXQgbnVtYmVyLCBzbyAiZG5hbWUiIGlzIGp1c3QgYSBkZXZpY2UgdHlwZSBuYW1lLgorCSAqLworCWNwID0gc3BsaXRfZG5hbWUoZG5hbWUsICZwcGEsIHAtPmVycmJ1Zik7CisJaWYgKGNwID09IE5VTEwpIHsKKwkJc3RhdHVzID0gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKwkJZ290byBiYWQ7CisJfQorCSpjcCA9ICdcMCc7CisKKwkvKgorCSAqIFVzZSAiL2Rldi9kbHBpIiBhcyB0aGUgZGV2aWNlLgorCSAqCisJICogWFhYIC0gSFAncyBETFBJIFByb2dyYW1tZXIncyBHdWlkZSBmb3IgSFAtVVggMTEuMDAgc2F5cyB0aGF0CisJICogdGhlICJkbF9tanJfbnVtIiBmaWVsZCBpcyBmb3IgdGhlICJtYWpvciBudW1iZXIgb2YgaW50ZXJmYWNlCisJICogZHJpdmVyIjsgdGhhdCdzIHRoZSBtYWpvciBvZiAiL2Rldi9kbHBpIiBvbiB0aGUgc3lzdGVtIG9uCisJICogd2hpY2ggSSB0cmllZCB0aGlzLCBidXQgdGhlcmUgbWF5IGJlIERMUEkgZGV2aWNlcyB0aGF0CisJICogdXNlIGEgZGlmZmVyZW50IGRyaXZlciwgaW4gd2hpY2ggY2FzZSB3ZSBtYXkgbmVlZCB0bworCSAqIHNlYXJjaCAiL2RldiIgZm9yIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2Ugd2l0aCB0aGF0IG1ham9yCisJICogZGV2aWNlIG51bWJlciwgcmF0aGVyIHRoYW4gaGFyZHdpcmluZyAiL2Rldi9kbHBpIi4KKwkgKi8KKwljcCA9ICIvZGV2L2RscGkiOworCWlmICgocC0+ZmQgPSBvcGVuKGNwLCBPX1JEV1IpKSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykKKwkJCXN0YXR1cyA9IFBDQVBfRVJST1JfUEVSTV9ERU5JRUQ7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogJXMiLCBjcCwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGJhZDsKKwl9CisKKyNpZmRlZiBETF9IUF9SQVdETFMKKwkvKgorCSAqIFhYWCAtIEhQLVVYIDEwLjIwIGFuZCAxMS54eCBkb24ndCBhcHBlYXIgdG8gc3VwcG9ydCBzZW5kaW5nIGFuZAorCSAqIHJlY2VpdmluZyBwYWNrZXRzIG9uIHRoZSBzYW1lIGRlc2NyaXB0b3IgLSB5b3UgbmVlZCBzZXBhcmF0ZQorCSAqIGRlc2NyaXB0b3JzIGZvciBzZW5kaW5nIGFuZCByZWNlaXZpbmcsIGJvdW5kIHRvIGRpZmZlcmVudCBTQVBzLgorCSAqCisJICogSWYgdGhlIG9wZW4gZmFpbHMsIHdlIGp1c3QgbGVhdmUgLTEgaW4gInAtPnNlbmRfZmQiIGFuZCByZWplY3QKKwkgKiBhdHRlbXB0cyB0byBzZW5kIHBhY2tldHMsIGp1c3QgYXMgaWYsIGluIHBjYXAtYnBmLmMsIHdlIGZhaWwKKwkgKiB0byBvcGVuIHRoZSBCUEYgZGV2aWNlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLCB3ZSBqdXN0IHRyeQorCSAqIHRvIG9wZW4gaXQgZm9yIHJlYWRpbmcgb25seSBhbmQsIGlmIHRoYXQgc3VjY2VlZHMsIGp1c3QgbGV0CisJICogdGhlIHNlbmQgYXR0ZW1wdHMgZmFpbC4KKwkgKi8KKwlwLT5zZW5kX2ZkID0gb3BlbihjcCwgT19SRFdSKTsKKyNlbmRpZgorCisJLyoKKwkgKiBHZXQgYSB0YWJsZSBvZiBhbGwgUFBBcyBmb3IgdGhhdCBkZXZpY2UsIGFuZCBzZWFyY2ggdGhhdAorCSAqIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGRldmljZSB0eXBlIG5hbWUgYW5kIHVuaXQgbnVtYmVyLgorCSAqLworCXBwYSA9IGdldF9kbHBpX3BwYShwLT5mZCwgZG5hbWUsIHBwYSwgcC0+ZXJyYnVmKTsKKwlpZiAocHBhIDwgMCkgeworCQlzdGF0dXMgPSBwcGE7CisJCWdvdG8gYmFkOworCX0KKyNlbHNlCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIG5hbWUgYmVnaW5zIHdpdGggIi8iLCBhc3N1bWUgaXQgYmVnaW5zIHdpdGgKKwkgKiB0aGUgcGF0aG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBkZXZpY2UgdG8gb3BlbjsKKwkgKiBvdGhlcndpc2UsIGNvbmNhdGVuYXRlIHRoZSBkZXZpY2UgZGlyZWN0b3J5IG5hbWUgYW5kIHRoZQorCSAqIGRldmljZSBuYW1lLgorCSAqLworCWlmICgqcC0+b3B0LnNvdXJjZSA9PSAnLycpCisJCXN0cmxjcHkoZG5hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihkbmFtZSkpOworCWVsc2UKKwkJc25wcmludGYoZG5hbWUsIHNpemVvZihkbmFtZSksICIlcy8lcyIsIFBDQVBfREVWX1BSRUZJWCwKKwkJICAgIHAtPm9wdC5zb3VyY2UpOworCisJLyoKKwkgKiBHZXQgdGhlIHVuaXQgbnVtYmVyLCBhbmQgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGRldmljZQorCSAqIHR5cGUgbmFtZS4KKwkgKi8KKwljcCA9IHNwbGl0X2RuYW1lKGRuYW1lLCAmcHBhLCBwLT5lcnJidWYpOworCWlmIChjcCA9PSBOVUxMKSB7CisJCXN0YXR1cyA9IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0U7CisJCWdvdG8gYmFkOworCX0KKworCS8qCisJICogTWFrZSBhIGNvcHkgb2YgdGhlIGRldmljZSBwYXRobmFtZSwgYW5kIHRoZW4gcmVtb3ZlIHRoZSB1bml0CisJICogbnVtYmVyIGZyb20gdGhlIGRldmljZSBwYXRobmFtZS4KKwkgKi8KKwlzdHJsY3B5KGRuYW1lMiwgZG5hbWUsIHNpemVvZihkbmFtZSkpOworCSpjcCA9ICdcMCc7CisKKwkvKiBUcnkgZGV2aWNlIHdpdGhvdXQgdW5pdCBudW1iZXIgKi8KKwlpZiAoKHAtPmZkID0gb3BlbihkbmFtZSwgT19SRFdSKSkgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWlmIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpCisJCQkJc3RhdHVzID0gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsIGRuYW1lLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gYmFkOworCQl9CisKKwkJLyogVHJ5IGFnYWluIHdpdGggdW5pdCBudW1iZXIgKi8KKwkJaWYgKChwLT5mZCA9IG9wZW4oZG5hbWUyLCBPX1JEV1IpKSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOworCisJCQkJLyoKKwkJCQkgKiBXZSBwcm92aWRlIGFuIGVycm9yIG1lc3NhZ2UgZXZlbgorCQkJCSAqIGZvciB0aGlzIGVycm9yLCBmb3IgZGlhZ25vc3RpYworCQkJCSAqIHB1cnBvc2VzIChzbyB0aGF0LCBmb3IgZXhhbXBsZSwKKwkJCQkgKiB0aGUgYXBwIGNhbiBzaG93IHRoZSBtZXNzYWdlIGlmIHRoZQorCQkJCSAqIHVzZXIgcmVxdWVzdHMgaXQpLgorCQkJCSAqCisJCQkJICogSW4gaXQsIHdlIGp1c3QgcmVwb3J0ICJObyBETFBJIGRldmljZQorCQkJCSAqIGZvdW5kIiB3aXRoIHRoZSBkZXZpY2UgbmFtZSwgc28gcGVvcGxlCisJCQkJICogZG9uJ3QgZ2V0IGNvbmZ1c2VkIGFuZCB0aGluaywgZm9yIGV4YW1wbGUsCisJCQkJICogdGhhdCBpZiB0aGV5IGNhbid0IGNhcHR1cmUgb24gImxvMCIKKwkJCQkgKiBvbiBTb2xhcmlzIHRoZSBmaXggaXMgdG8gY2hhbmdlIGxpYnBjYXAKKwkJCQkgKiAob3IgdGhlIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBpdCkgdG8KKwkJCQkgKiBsb29rIGZvciBzb21ldGhpbmcgb3RoZXIgdGhhbiAiL2Rldi9sbzAiLAorCQkJCSAqIGFzIHRoZSBmaXggaXMgdG8gbG9vayBmb3IgYW4gb3BlcmF0aW5nCisJCQkJICogc3lzdGVtIG90aGVyIHRoYW4gU29sYXJpcyAtIHlvdSBqdXN0CisJCQkJICogKmNhbid0KiBjYXB0dXJlIG9uIGEgbG9vcGJhY2sgaW50ZXJmYWNlCisJCQkJICogb24gU29sYXJpcywgdGhlIGxhY2sgb2YgYSBETFBJIGRldmljZQorCQkJCSAqIGZvciB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIGlzIGp1c3QgYQorCQkJCSAqIHN5bXB0b20gb2YgdGhhdCBpbmFiaWxpdHkuCisJCQkJICovCisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiJXM6IE5vIERMUEkgZGV2aWNlIGZvdW5kIiwgcC0+b3B0LnNvdXJjZSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpCisJCQkJCXN0YXR1cyA9IFBDQVBfRVJST1JfUEVSTV9ERU5JRUQ7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwKKwkJCQkgICAgZG5hbWUyLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQl9CisJCQlnb3RvIGJhZDsKKwkJfQorCQkvKiBYWFggQXNzdW1lIHVuaXQgemVybyAqLworCQlwcGEgPSAwOworCX0KKyNlbmRpZgorCisJLyoKKwkqKiBBdHRhY2ggaWYgInN0eWxlIDIiIHByb3ZpZGVyCisJKi8KKwlpZiAoZGxpbmZvcmVxKHAtPmZkLCBwLT5lcnJidWYpIDwgMCB8fAorCSAgICBkbGluZm9hY2socC0+ZmQsIChjaGFyICopYnVmLCBwLT5lcnJidWYpIDwgMCkKKwkJZ290byBiYWQ7CisJaW5mb3AgPSAmKE1BS0VfRExfUFJJTUlUSVZFUyhidWYpKS0+aW5mb19hY2s7CisjaWZkZWYgSEFWRV9TT0xBUklTCisJaWYgKGluZm9wLT5kbF9tYWNfdHlwZSA9PSBETF9JUEFUTSkKKwkJaXNhdG0gPSAxOworI2VuZGlmCisJaWYgKGluZm9wLT5kbF9wcm92aWRlcl9zdHlsZSA9PSBETF9TVFlMRTIpIHsKKwkJc3RhdHVzID0gZGxfZG9hdHRhY2gocC0+ZmQsIHBwYSwgcC0+ZXJyYnVmKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGJhZDsKKyNpZmRlZiBETF9IUF9SQVdETFMKKwkJaWYgKHAtPnNlbmRfZmQgPj0gMCkgeworCQkJaWYgKGRsX2RvYXR0YWNoKHAtPnNlbmRfZmQsIHBwYSwgcC0+ZXJyYnVmKSA8IDApCisJCQkJZ290byBiYWQ7CisJCX0KKyNlbmRpZgorCX0KKworCWlmIChwLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogVGhpcyBkZXZpY2UgZXhpc3RzLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCBtb25pdG9yIG1vZGUKKwkJICogYW55IHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgRExQSS4KKwkJICovCisJCXN0YXR1cyA9IFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCQlnb3RvIGJhZDsKKwl9CisKKyNpZmRlZiBIQVZFX0RMUElfUEFTU0lWRQorCS8qCisJICogRW5hYmxlIFBhc3NpdmUgbW9kZSB0byBiZSBhYmxlIHRvIGNhcHR1cmUgb24gYWdncmVnYXRlZCBsaW5rLgorCSAqIE5vdCBzdXBwb3J0ZWQgaW4gYWxsIFNvbGFyaXMgdmVyc2lvbnMuCisJICovCisJZGxwYXNzaXZlKHAtPmZkLCBwLT5lcnJidWYpOworI2VuZGlmCisJLyoKKwkqKiBCaW5kIChkZWZlciBpZiB1c2luZyBIUC1VWCA5IG9yIEhQLVVYIDEwLjIwIG9yIGxhdGVyLCB0b3RhbGx5CisJKiogc2tpcCBpZiB1c2luZyBTSU5JWCkKKwkqLworI2lmICFkZWZpbmVkKEhBVkVfSFBVWDkpICYmICFkZWZpbmVkKEhBVkVfSFBVWDEwXzIwX09SX0xBVEVSKSAmJiAhZGVmaW5lZChzaW5peCkKKyNpZmRlZiBfQUlYCisJLyoKKwkqKiBBSVguCisJKiogQWNjb3JkaW5nIHRvIElCTSdzIEFJWCBTdXBwb3J0IExpbmUsIHRoZSBkbF9zYXAgdmFsdWUKKwkqKiBzaG91bGQgbm90IGJlIGxlc3MgdGhhbiAweDYwMCAoMTUzNikgZm9yIHN0YW5kYXJkIEV0aGVybmV0LgorCSoqIEhvd2V2ZXIsIHdlIHNlZW0gdG8gZ2V0IERMX0JBREFERFIgLSAiRExTQVAgYWRkciBpbiBpbXByb3BlcgorCSoqIGZvcm1hdCBvciBpbnZhbGlkIiAtIGVycm9ycyBpZiB3ZSB1c2UgMTUzNyBvbiB0aGUgInRyMCIKKwkqKiBkZXZpY2UsIHdoaWNoLCBnaXZlbiB0aGF0IGl0cyBuYW1lIHN0YXJ0cyB3aXRoICJ0ciIgYW5kIHRoYXQKKwkqKiBpdCdzIElCTSwgcHJvYmFibHkgbWVhbnMgYSBUb2tlbiBSaW5nIGRldmljZS4gIChQZXJoYXBzIHdlCisJKiogbmVlZCB0byB1c2UgMTUzNyBvbiAiL2Rldi9kbHBpL2VuIiBiZWNhdXNlIHRoYXQgZGV2aWNlIGlzIGZvcgorCSoqIEQvSS9YIEV0aGVybmV0LCB0aGUgIlNBUCIgaXMgYWN0dWFsbHkgYW4gRXRoZXJuZXQgdHlwZSwgYW5kCisJKiogaXQgcmVqZWN0cyBpbnZhbGlkIEV0aGVybmV0IHR5cGVzLikKKwkqKgorCSoqIFNvIGlmIDE1MzcgZmFpbHMsIHdlIHRyeSAyLCBhcyBIeXVuZyBTaWsgWW9vbiBvZiBJQk0gS29yZWEKKwkqKiBzYXlzIHRoYXQgd29ya3Mgb24gVG9rZW4gUmluZyAoaGUgc2F5cyB0aGF0IDAgZG9lcyAqbm90KgorCSoqIHdvcms7IHBlcmhhcHMgdGhhdCdzIGNvbnNpZGVyZWQgYW4gaW52YWxpZCBMTEMgU0FQIHZhbHVlIC0gSQorCSoqIGFzc3VtZSB0aGUgU0FQIHZhbHVlIGluIGEgRExQSSBiaW5kIGlzIGFuIExMQyBTQVAgZm9yIG5ldHdvcmsKKwkqKiB0eXBlcyB0aGF0IHVzZSA4MDIuMiBMTEMpLgorCSovCisJaWYgKChkbGJpbmRyZXEocC0+ZmQsIDE1MzcsIHAtPmVycmJ1ZikgPCAwICYmCisJICAgICBkbGJpbmRyZXEocC0+ZmQsIDIsIHAtPmVycmJ1ZikgPCAwKSB8fAorCSAgICAgZGxiaW5kYWNrKHAtPmZkLCAoY2hhciAqKWJ1ZiwgcC0+ZXJyYnVmLCBOVUxMKSA8IDApCisJCWdvdG8gYmFkOworI2VsaWYgZGVmaW5lZChETF9IUF9SQVdETFMpCisJLyoKKwkqKiBIUC1VWCAxMC4weCBhbmQgMTAuMXguCisJKi8KKwlpZiAoZGxfZG9ocHV4YmluZChwLT5mZCwgcC0+ZXJyYnVmKSA8IDApCisJCWdvdG8gYmFkOworCWlmIChwLT5zZW5kX2ZkID49IDApIHsKKwkJLyoKKwkJKiogWFhYIC0gaWYgdGhpcyBmYWlscywganVzdCBjbG9zZSBzZW5kX2ZkIGFuZAorCQkqKiBzZXQgaXQgdG8gLTEsIHNvIHRoYXQgeW91IGNhbid0IHNlbmQgYnV0IGNhbgorCQkqKiBzdGlsbCByZWNlaXZlPworCQkqLworCQlpZiAoZGxfZG9ocHV4YmluZChwLT5zZW5kX2ZkLCBwLT5lcnJidWYpIDwgMCkKKwkJCWdvdG8gYmFkOworCX0KKyNlbHNlIC8qIG5laXRoZXIgQUlYIG5vciBIUC1VWCAqLworCS8qCisJKiogTm90IFNpbml4LCBhbmQgbmVpdGhlciBBSVggbm9yIEhQLVVYIC0gU29sYXJpcywgYW5kIGFueSBvdGhlcgorCSoqIE9TIHVzaW5nIERMUEkuCisJKiovCisJaWYgKGRsYmluZHJlcShwLT5mZCwgMCwgcC0+ZXJyYnVmKSA8IDAgfHwKKwkgICAgZGxiaW5kYWNrKHAtPmZkLCAoY2hhciAqKWJ1ZiwgcC0+ZXJyYnVmLCBOVUxMKSA8IDApCisJCWdvdG8gYmFkOworI2VuZGlmIC8qIEFJWCB2cy4gSFAtVVggdnMuIG90aGVyICovCisjZW5kaWYgLyogIUhQLVVYIDkgYW5kICFIUC1VWCAxMC4yMCBvciBsYXRlciBhbmQgIVNJTklYICovCisKKyNpZmRlZiBIQVZFX1NPTEFSSVMKKwlpZiAoaXNhdG0pIHsKKwkJLyoKKwkJKiogSGF2ZSB0byB0dXJuIG9uIHNvbWUgc3BlY2lhbCBBVE0gcHJvbWlzY3VvdXMgbW9kZQorCQkqKiBmb3IgU3VuQVRNLgorCQkqKiBEbyAqTk9UKiB0dXJuIHJlZ3VsYXIgcHJvbWlzY3VvdXMgbW9kZSBvbjsgaXQgZG9lc24ndAorCQkqKiBoZWxwLCBhbmQgbWF5IGJyZWFrIHRoaW5ncy4KKwkJKi8KKwkJaWYgKHN0cmlvY3RsKHAtPmZkLCBBX1BST01JU0NPTl9SRVEsIDAsIE5VTEwpIDwgMCkgeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJBX1BST01JU0NPTl9SRVE6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZ290byBiYWQ7CisJCX0KKwl9IGVsc2UKKyNlbmRpZgorCWlmIChwLT5vcHQucHJvbWlzYykgeworCQkvKgorCQkqKiBFbmFibGUgcHJvbWlzY3VvdXMgKG5vdCBuZWNlc3Nhcnkgb24gc2VuZCBGRCkKKwkJKi8KKwkJc3RhdHVzID0gZGxwcm9taXNjb24ocCwgRExfUFJPTUlTQ19QSFlTKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWlmIChzdGF0dXMgPT0gUENBUF9FUlJPUl9QRVJNX0RFTklFRCkKKwkJCQlzdGF0dXMgPSBQQ0FQX0VSUk9SX1BST01JU0NfUEVSTV9ERU5JRUQ7CisJCQlnb3RvIGJhZDsKKwkJfQorCisJCS8qCisJCSoqIFRyeSB0byBlbmFibGUgbXVsdGljYXN0ICh5b3Ugd291bGQgaGF2ZSB0aG91Z2h0CisJCSoqIHByb21pc2N1b3VzIHdvdWxkIGJlIHN1ZmZpY2llbnQpLiAoU2tpcCBpZiB1c2luZworCQkqKiBIUC1VWCBvciBTSU5JWCkgKE5vdCBuZWNlc3Nhcnkgb24gc2VuZCBGRCkKKwkJKi8KKyNpZiAhZGVmaW5lZChfX2hwdXgpICYmICFkZWZpbmVkKHNpbml4KQorCQlzdGF0dXMgPSBkbHByb21pc2NvbihwLCBETF9QUk9NSVNDX01VTFRJKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlzdGF0dXMgPSBQQ0FQX1dBUk5JTkc7CisjZW5kaWYKKwl9CisJLyoKKwkqKiBUcnkgdG8gZW5hYmxlIFNBUCBwcm9taXNjdWl0eSAod2hlbiBub3QgaW4gcHJvbWlzY3VvdXMgbW9kZQorCSoqIHdoZW4gdXNpbmcgSFAtVVgsIHdoZW4gbm90IGRvaW5nIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgbmV2ZXIKKwkqKiB1bmRlciBTSU5JWCkgKE5vdCBuZWNlc3Nhcnkgb24gc2VuZCBGRCkKKwkqLworI2lmbmRlZiBzaW5peAorI2lmIGRlZmluZWQoX19ocHV4KQorCS8qIEhQLVVYIC0gb25seSBkbyB0aGlzIHdoZW4gbm90IGluIHByb21pc2N1b3VzIG1vZGUgKi8KKwlpZiAoIXAtPm9wdC5wcm9taXNjKSB7CisjZWxpZiBkZWZpbmVkKEhBVkVfU09MQVJJUykKKwkvKiBTb2xhcmlzIC0gZG9uJ3QgZG8gdGhpcyBvbiBTdW5BVE0gZGV2aWNlcyAqLworCWlmICghaXNhdG0pIHsKKyNlbHNlCisJLyogRXZlcnl0aGluZyBlbHNlIChleGNlcHQgZm9yIFNJTklYKSAtIGFsd2F5cyBkbyB0aGlzICovCisJeworI2VuZGlmCisJCXN0YXR1cyA9IGRscHJvbWlzY29uKHAsIERMX1BST01JU0NfU0FQKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCS8qCisJCQkgKiBOb3QgZmF0YWwsIHNpbmNlIHRoZSBETF9QUk9NSVNDX1BIWVMgbW9kZSB3b3JrZWQuCisJCQkgKiBSZXBvcnQgaXQgYXMgYSB3YXJuaW5nLCBob3dldmVyLgorCQkJICovCisJCQlpZiAocC0+b3B0LnByb21pc2MpCisJCQkJc3RhdHVzID0gUENBUF9XQVJOSU5HOworCQkJZWxzZQorCQkJCWdvdG8gYmFkOworCQl9CisJfQorI2VuZGlmIC8qIHNpbml4ICovCisKKwkvKgorCSoqIEhQLVVYIDksIGFuZCBIUC1VWCAxMC4yMCBvciBsYXRlciwgbXVzdCBiaW5kIGFmdGVyIHNldHRpbmcKKwkqKiBwcm9taXNjdW91cyBvcHRpb25zLgorCSovCisjaWYgZGVmaW5lZChIQVZFX0hQVVg5KSB8fCBkZWZpbmVkKEhBVkVfSFBVWDEwXzIwX09SX0xBVEVSKQorCWlmIChkbF9kb2hwdXhiaW5kKHAtPmZkLCBwLT5lcnJidWYpIDwgMCkKKwkJZ290byBiYWQ7CisJLyoKKwkqKiBXZSBkb24ndCBzZXQgcHJvbWlzY3VvdXMgbW9kZSBvbiB0aGUgc2VuZCBGRCwgYnV0IHdlJ2xsIGRlZmVyCisJKiogYmluZGluZyBpdCBhbnl3YXksIGp1c3QgdG8ga2VlcCB0aGUgSFAtVVggOS8xMC4yMCBvciBsYXRlcgorCSoqIGNvZGUgdG9nZXRoZXIuCisJKi8KKwlpZiAocC0+c2VuZF9mZCA+PSAwKSB7CisJCS8qCisJCSoqIFhYWCAtIGlmIHRoaXMgZmFpbHMsIGp1c3QgY2xvc2Ugc2VuZF9mZCBhbmQKKwkJKiogc2V0IGl0IHRvIC0xLCBzbyB0aGF0IHlvdSBjYW4ndCBzZW5kIGJ1dCBjYW4KKwkJKiogc3RpbGwgcmVjZWl2ZT8KKwkJKi8KKwkJaWYgKGRsX2RvaHB1eGJpbmQocC0+c2VuZF9mZCwgcC0+ZXJyYnVmKSA8IDApCisJCQlnb3RvIGJhZDsKKwl9CisjZW5kaWYKKworCS8qCisJKiogRGV0ZXJtaW5lIGxpbmsgdHlwZQorCSoqIFhYWCAtIGdldCBTQVAgbGVuZ3RoIGFuZCBhZGRyZXNzIGxlbmd0aCBhcyB3ZWxsLCBmb3IgdXNlCisJKiogd2hlbiBzZW5kaW5nIHBhY2tldHMuCisJKi8KKwlpZiAoZGxpbmZvcmVxKHAtPmZkLCBwLT5lcnJidWYpIDwgMCB8fAorCSAgICBkbGluZm9hY2socC0+ZmQsIChjaGFyICopYnVmLCBwLT5lcnJidWYpIDwgMCkKKwkJZ290byBiYWQ7CisKKwlpbmZvcCA9ICYoTUFLRV9ETF9QUklNSVRJVkVTKGJ1ZikpLT5pbmZvX2FjazsKKwlpZiAocGNhcF9wcm9jZXNzX21hY3R5cGUocCwgaW5mb3AtPmRsX21hY190eXBlKSAhPSAwKQorCQlnb3RvIGJhZDsKKworI2lmZGVmCURMSU9DUkFXCisJLyoKKwkqKiBUaGlzIGlzIGEgbm9uIHN0YW5kYXJkIFN1bk9TIGhhY2sgdG8gZ2V0IHRoZSBmdWxsIHJhdyBsaW5rLWxheWVyCisJKiogaGVhZGVyLgorCSovCisJaWYgKHN0cmlvY3RsKHAtPmZkLCBETElPQ1JBVywgMCwgTlVMTCkgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkRMSU9DUkFXOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gYmFkOworCX0KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TWVNfQlVGTU9EX0gKKwlzcyA9IHAtPnNuYXBzaG90OworCisJLyoKKwkqKiBUaGVyZSBpcyBhIGJ1ZyBpbiBidWZtb2QoNykuIFdoZW4gZGVhbGluZyB3aXRoIG1lc3NhZ2VzIG9mCisJKiogbGVzcyB0aGFuIHNuYXBsZW4gc2l6ZSBpdCBzdHJpcHMgZGF0YSBmcm9tIHRoZSBiZWdpbm5pbmcgbm90CisJKiogdGhlIGVuZC4KKwkqKgorCSoqIFRoaXMgYnVnIGlzIGZpeGVkIGluIDUuMy4yLiBBbHNvLCB0aGVyZSBpcyBhIHBhdGNoIGF2YWlsYWJsZS4KKwkqKiBBc2sgZm9yIGJ1Z2lkIDExNDkwNjUuCisJKi8KKyNpZmRlZiBIQVZFX1NPTEFSSVMKKwlyZWxlYXNlID0gZ2V0X3JlbGVhc2UoJm9zbWFqb3IsICZvc21pbm9yLCAmb3NtaWNybyk7CisJaWYgKG9zbWFqb3IgPT0gNSAmJiAob3NtaW5vciA8PSAyIHx8IChvc21pbm9yID09IDMgJiYgb3NtaWNybyA8IDIpKSAmJgorCSAgICBnZXRlbnYoIkJVRk1PRF9GSVhFRCIpID09IE5VTEwpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkiV0FSTklORzogYnVmbW9kIGlzIGJyb2tlbiBpbiBTdW5PUyAlczsgaWdub3Jpbmcgc25hcGxlbi4iLAorCQkgICAgcmVsZWFzZSk7CisJCXNzID0gMDsKKwkJc3RhdHVzID0gUENBUF9XQVJOSU5HOworCX0KKyNlbmRpZgorCisJLyogUHVzaCBhbmQgY29uZmlndXJlIGJ1Zm1vZC4gKi8KKwlpZiAocGNhcF9jb25mX2J1Zm1vZChwLCBzcywgcC0+bWQudGltZW91dCkgIT0gMCkKKwkJZ290byBiYWQ7CisjZW5kaWYKKworCS8qCisJKiogQXMgdGhlIGxhc3Qgb3BlcmF0aW9uIGZsdXNoIHRoZSByZWFkIHNpZGUuCisJKi8KKwlpZiAoaW9jdGwocC0+ZmQsIElfRkxVU0gsIEZMVVNIUikgIT0gMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGTFVTSFI6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyogQWxsb2NhdGUgZGF0YSBidWZmZXIuICovCisJaWYgKHBjYXBfYWxsb2NfZGF0YWJ1ZihwKSAhPSAwKQorCQlnb3RvIGJhZDsKKworCS8qIFN1Y2Nlc3MgLSBidXQgcGVyaGFwcyB3aXRoIGEgd2FybmluZyAqLworCWlmIChzdGF0dXMgPCAwKQorCQlzdGF0dXMgPSAwOworCisJLyoKKwkgKiAicC0+ZmQiIGlzIGFuIEZEIGZvciBhIFNUUkVBTVMgZGV2aWNlLCBzbyAic2VsZWN0KCkiIGFuZAorCSAqICJwb2xsKCkiIHNob3VsZCB3b3JrIG9uIGl0LgorCSAqLworCXAtPnNlbGVjdGFibGVfZmQgPSBwLT5mZDsKKworCXAtPnJlYWRfb3AgPSBwY2FwX3JlYWRfZGxwaTsKKwlwLT5pbmplY3Rfb3AgPSBwY2FwX2luamVjdF9kbHBpOworCXAtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07CS8qIG5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwlwLT5zZXRkaXJlY3Rpb25fb3AgPSBOVUxMOwkvKiBOb3QgaW1wbGVtZW50ZWQuKi8KKwlwLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOwkvKiBjYW4ndCBjaGFuZ2UgZGF0YSBsaW5rIHR5cGUgKi8KKwlwLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CisJcC0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOworCXAtPnN0YXRzX29wID0gcGNhcF9zdGF0c19kbHBpOworCXAtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfZGxwaTsKKworCXJldHVybiAoc3RhdHVzKTsKK2JhZDoKKwlwY2FwX2NsZWFudXBfZGxwaShwKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiBTcGxpdCBhIGRldmljZSBuYW1lIGludG8gYSBkZXZpY2UgdHlwZSBuYW1lIGFuZCBhIHVuaXQgbnVtYmVyOworICogcmV0dXJuIHRoZSBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5pdCBudW1iZXIsIHdoaWNoCisgKiBpcyB0aGUgZW5kIG9mIHRoZSBkZXZpY2UgdHlwZSBuYW1lLCBhbmQgc2V0ICIqdW5pdHAiIHRvIHRoZSB1bml0CisgKiBudW1iZXIuCisgKgorICogUmV0dXJucyBOVUxMIG9uIGVycm9yLCBhbmQgZmlsbHMgImVidWYiIHdpdGggYW4gZXJyb3IgbWVzc2FnZS4KKyAqLworc3RhdGljIGNoYXIgKgorc3BsaXRfZG5hbWUoY2hhciAqZGV2aWNlLCBpbnQgKnVuaXRwLCBjaGFyICplYnVmKQoreworCWNoYXIgKmNwOworCWNoYXIgKmVvczsKKwlsb25nIHVuaXQ7CisKKwkvKgorCSAqIExvb2sgZm9yIGEgbnVtYmVyIGF0IHRoZSBlbmQgb2YgdGhlIGRldmljZSBuYW1lIHN0cmluZy4KKwkgKi8KKwljcCA9IGRldmljZSArIHN0cmxlbihkZXZpY2UpIC0gMTsKKwlpZiAoKmNwIDwgJzAnIHx8ICpjcCA+ICc5JykgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgbWlzc2luZyB1bml0IG51bWJlciIsCisJCSAgICBkZXZpY2UpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qIERpZ2l0cyBhdCBlbmQgb2Ygc3RyaW5nIGFyZSB1bml0IG51bWJlciAqLworCXdoaWxlIChjcC0xID49IGRldmljZSAmJiAqKGNwLTEpID49ICcwJyAmJiAqKGNwLTEpIDw9ICc5JykKKwkJY3AtLTsKKworCWVycm5vID0gMDsKKwl1bml0ID0gc3RydG9sKGNwLCAmZW9zLCAxMCk7CisJaWYgKCplb3MgIT0gJ1wwJykgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgYmFkIHVuaXQgbnVtYmVyIiwgZGV2aWNlKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJaWYgKGVycm5vID09IEVSQU5HRSB8fCB1bml0ID4gSU5UX01BWCkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgdW5pdCBudW1iZXIgdG9vIGxhcmdlIiwKKwkJICAgIGRldmljZSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCWlmICh1bml0IDwgMCkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXMgdW5pdCBudW1iZXIgaXMgbmVnYXRpdmUiLAorCQkgICAgZGV2aWNlKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJKnVuaXRwID0gKGludCl1bml0OworCXJldHVybiAoY3ApOworfQorCitzdGF0aWMgaW50CitkbF9kb2F0dGFjaChpbnQgZmQsIGludCBwcGEsIGNoYXIgKmVidWYpCit7CisJZGxfYXR0YWNoX3JlcV90CXJlcTsKKwlicGZfdV9pbnQzMiBidWZbTUFYRExCVUZdOworCWludCBlcnI7CisKKwlyZXEuZGxfcHJpbWl0aXZlID0gRExfQVRUQUNIX1JFUTsKKwlyZXEuZGxfcHBhID0gcHBhOworCWlmIChzZW5kX3JlcXVlc3QoZmQsIChjaGFyICopJnJlcSwgc2l6ZW9mKHJlcSksICJhdHRhY2giLCBlYnVmKSA8IDApCisJCXJldHVybiAoUENBUF9FUlJPUik7CisKKwllcnIgPSBkbG9rYWNrKGZkLCAiYXR0YWNoIiwgKGNoYXIgKilidWYsIGVidWYpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gKGVycik7CisJcmV0dXJuICgwKTsKK30KKworI2lmZGVmIERMX0hQX1JBV0RMUworc3RhdGljIGludAorZGxfZG9ocHV4YmluZChpbnQgZmQsIGNoYXIgKmVidWYpCit7CisJaW50IGhwc2FwOworCWludCB1ZXJyb3I7CisJYnBmX3VfaW50MzIgYnVmW01BWERMQlVGXTsKKworCS8qCisJICogWFhYIC0gd2Ugc3RhcnQgYXQgMjIgYmVjYXVzZSB3ZSB1c2VkIHRvIHVzZSBvbmx5IDIyLCBidXQKKwkgKiB0aGF0IHdhcyBqdXN0IGJlY2F1c2UgdGhhdCB3YXMgdGhlIHZhbHVlIHVzZWQgaW4gc29tZQorCSAqIHNhbXBsZSBjb2RlIGZyb20gSFAuICBXaXRoIHdoYXQgdmFsdWUgKnNob3VsZCogd2Ugc3RhcnQ/CisJICogRG9lcyBpdCBtYXR0ZXIsIGdpdmVuIHRoYXQgd2UncmUgZW5hYmxpbmcgU0FQIHByb21pc2N1aXR5CisJICogb24gdGhlIGlucHV0IEZEPworCSAqLworCWhwc2FwID0gMjI7CisJZm9yICg7OykgeworCQlpZiAoZGxiaW5kcmVxKGZkLCBocHNhcCwgZWJ1ZikgPCAwKQorCQkJcmV0dXJuICgtMSk7CisJCWlmIChkbGJpbmRhY2soZmQsIChjaGFyICopYnVmLCBlYnVmLCAmdWVycm9yKSA+PSAwKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIEZvciBhbnkgZXJyb3Igb3RoZXIgdGhhbiBhIFVOSVggRUJVU1ksIGdpdmUgdXAuCisJCSAqLworCQlpZiAodWVycm9yICE9IEVCVVNZKSB7CisJCQkvKgorCQkJICogZGxiaW5kYWNrKCkgaGFzIGFscmVhZHkgZmlsbGVkIGluIGVidWYgZm9yCisJCQkgKiB0aGlzIGVycm9yLgorCQkJICovCisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCisJCS8qCisJCSAqIEZvciBFQlVTWSwgdHJ5IHRoZSBuZXh0IFNBUCB2YWx1ZTsgdGhhdCBtZWFucyB0aGF0CisJCSAqIHNvbWVib2R5IGVsc2UgaXMgdXNpbmcgdGhhdCBTQVAuICBDbGVhciBlYnVmIHNvCisJCSAqIHRoYXQgYXBwbGljYXRpb24gZG9lc24ndCByZXBvcnQgdGhlICJEZXZpY2UgYnVzeSIKKwkJICogZXJyb3IgYXMgYSB3YXJuaW5nLgorCQkgKi8KKwkJKmVidWYgPSAnXDAnOworCQlocHNhcCsrOworCQlpZiAoaHBzYXAgPiAxMDApIHsKKwkJCXN0cmxjcHkoZWJ1ZiwKKwkJCSAgICAiQWxsIFNBUHMgZnJvbSAyMiB0aHJvdWdoIDEwMCBhcmUgaW4gdXNlIiwKKwkJCSAgICBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisjZW5kaWYKKworI2RlZmluZSBTVFJJTkdJRlkobikJI24KKworc3RhdGljIGludAorZGxwcm9taXNjb24ocGNhcF90ICpwLCBicGZfdV9pbnQzMiBsZXZlbCkKK3sKKwlkbF9wcm9taXNjb25fcmVxX3QgcmVxOworCWJwZl91X2ludDMyIGJ1ZltNQVhETEJVRl07CisJaW50IGVycjsKKworCXJlcS5kbF9wcmltaXRpdmUgPSBETF9QUk9NSVNDT05fUkVROworCXJlcS5kbF9sZXZlbCA9IGxldmVsOworCWlmIChzZW5kX3JlcXVlc3QocC0+ZmQsIChjaGFyICopJnJlcSwgc2l6ZW9mKHJlcSksICJwcm9taXNjb24iLAorCSAgICBwLT5lcnJidWYpIDwgMCkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwllcnIgPSBkbG9rYWNrKHAtPmZkLCAicHJvbWlzY29uIiBTVFJJTkdJRlkobGV2ZWwpLCAoY2hhciAqKWJ1ZiwKKwkgICAgcC0+ZXJyYnVmKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIChlcnIpOworCXJldHVybiAoMCk7Cit9CisKK2ludAorcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworI2lmZGVmIEhBVkVfU09MQVJJUworCWludCBmZDsKKwl1bmlvbiB7CisJCXVfaW50IG51bml0czsKKwkJY2hhciBwYWRbNTE2XTsJLyogWFhYIC0gbXVzdCBiZSBhdCBsZWFzdCA1MTM7IGlzIDUxNgorCQkJCSAgIGluICJhdG1nZXR1bml0cyIgKi8KKwl9IGJ1ZjsKKwljaGFyIGJhbmFtZVsyKzErMV07CisJdV9pbnQgaTsKKworCS8qCisJICogV2UgbWF5IGhhdmUgdG8gZG8gc3BlY2lhbCBtYWdpYyB0byBnZXQgQVRNIGRldmljZXMuCisJICovCisJaWYgKChmZCA9IG9wZW4oIi9kZXYvYmEiLCBPX1JEV1IpKSA8IDApIHsKKwkJLyoKKwkJICogV2UgY291bGRuJ3Qgb3BlbiB0aGUgImJhIiBkZXZpY2UuCisJCSAqIEZvciBub3csIGp1c3QgZ2l2ZSB1cDsgcGVyaGFwcyB3ZSBzaG91bGQKKwkJICogcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBwcm9ibGVtIGlzIG5laXRoZXIKKwkJICogYSAidGhhdCBkZXZpY2UgZG9lc24ndCBleGlzdCIgZXJyb3IgKEVOT0VOVCwKKwkJICogRU5YSU8sIGV0Yy4pIG9yIGEgInlvdSdyZSBub3QgYWxsb3dlZCB0byBkbworCQkgKiB0aGF0IiBlcnJvciAoRVBFUk0sIEVBQ0NFUykuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KKworCWlmIChzdHJpb2N0bChmZCwgQV9HRVRfVU5JVFMsIHNpemVvZihidWYpLCAoY2hhciAqKSZidWYpIDwgMCkgeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJBX0dFVF9VTklUUzogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGJ1Zi5udW5pdHM7IGkrKykgeworCQlzbnByaW50ZihiYW5hbWUsIHNpemVvZiBiYW5hbWUsICJiYSV1IiwgaSk7CisJCWlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgYmFuYW1lLCAwLCBOVUxMLCBlcnJidWYpIDwgMCkKKwkJCXJldHVybiAoLTEpOworCX0KKyNlbmRpZgorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorc2VuZF9yZXF1ZXN0KGludCBmZCwgY2hhciAqcHRyLCBpbnQgbGVuLCBjaGFyICp3aGF0LCBjaGFyICplYnVmKQoreworCXN0cnVjdAlzdHJidWYJY3RsOworCWludAlmbGFnczsKKworCWN0bC5tYXhsZW4gPSAwOworCWN0bC5sZW4gPSBsZW47CisJY3RsLmJ1ZiA9IHB0cjsKKworCWZsYWdzID0gMDsKKwlpZiAocHV0bXNnKGZkLCAmY3RsLCAoc3RydWN0IHN0cmJ1ZiAqKSBOVUxMLCBmbGFncykgPCAwKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAic2VuZF9yZXF1ZXN0OiBwdXRtc2cgXCIlc1wiOiAlcyIsCisJCSAgICB3aGF0LCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CityZWN2X2FjayhpbnQgZmQsIGludCBzaXplLCBjb25zdCBjaGFyICp3aGF0LCBjaGFyICpidWZwLCBjaGFyICplYnVmLCBpbnQgKnVlcnJvcikKK3sKKwl1bmlvbglETF9wcmltaXRpdmVzCSpkbHA7CisJc3RydWN0CXN0cmJ1ZgljdGw7CisJaW50CWZsYWdzOworCisJLyoKKwkgKiBDbGVhciBvdXQgIip1ZXJyb3IiLCBzbyBpdCdzIG9ubHkgc2V0IGZvciBETF9FUlJPUl9BQ0svRExfU1lTRVJSLAorCSAqIG1ha2luZyB0aGF0IHRoZSBvbmx5IHBsYWNlIHdoZXJlIEVCVVNZIGlzIHRyZWF0ZWQgc3BlY2lhbGx5LgorCSAqLworCWlmICh1ZXJyb3IgIT0gTlVMTCkKKwkJKnVlcnJvciA9IDA7CisKKwljdGwubWF4bGVuID0gTUFYRExCVUY7CisJY3RsLmxlbiA9IDA7CisJY3RsLmJ1ZiA9IGJ1ZnA7CisKKwlmbGFncyA9IDA7CisJaWYgKGdldG1zZyhmZCwgJmN0bCwgKHN0cnVjdCBzdHJidWYqKU5VTEwsICZmbGFncykgPCAwKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJyZWN2X2FjazogJXMgZ2V0bXNnOiAlcyIsCisJCSAgICB3aGF0LCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCisJZGxwID0gTUFLRV9ETF9QUklNSVRJVkVTKGN0bC5idWYpOworCXN3aXRjaCAoZGxwLT5kbF9wcmltaXRpdmUpIHsKKworCWNhc2UgRExfSU5GT19BQ0s6CisJY2FzZSBETF9CSU5EX0FDSzoKKwljYXNlIERMX09LX0FDSzoKKyNpZmRlZiBETF9IUF9QUEFfQUNLCisJY2FzZSBETF9IUF9QUEFfQUNLOgorI2VuZGlmCisJCS8qIFRoZXNlIGFyZSBPSyAqLworCQlicmVhazsKKworCWNhc2UgRExfRVJST1JfQUNLOgorCQlzd2l0Y2ggKGRscC0+ZXJyb3JfYWNrLmRsX2Vycm5vKSB7CisKKwkJY2FzZSBETF9TWVNFUlI6CisJCQlpZiAodWVycm9yICE9IE5VTEwpCisJCQkJKnVlcnJvciA9IGRscC0+ZXJyb3JfYWNrLmRsX3VuaXhfZXJybm87CisJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJyZWN2X2FjazogJXM6IFVOSVggZXJyb3IgLSAlcyIsCisJCQkgICAgd2hhdCwgcGNhcF9zdHJlcnJvcihkbHAtPmVycm9yX2Fjay5kbF91bml4X2Vycm5vKSk7CisJCQlpZiAoZGxwLT5lcnJvcl9hY2suZGxfdW5peF9lcnJubyA9PSBFUEVSTSB8fAorCQkJICAgIGRscC0+ZXJyb3JfYWNrLmRsX3VuaXhfZXJybm8gPT0gRUFDQ0VTKQorCQkJCXJldHVybiAoUENBUF9FUlJPUl9QRVJNX0RFTklFRCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlY3ZfYWNrOiAlczogJXMiLAorCQkJICAgIHdoYXQsIGRsc3RyZXJyb3IoZGxwLT5lcnJvcl9hY2suZGxfZXJybm8pKTsKKwkJCWlmIChkbHAtPmVycm9yX2Fjay5kbF9lcnJubyA9PSBETF9CQURQUEEpCisJCQkJcmV0dXJuIChQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFKTsKKwkJCWVsc2UgaWYgKGRscC0+ZXJyb3JfYWNrLmRsX2Vycm5vID09IERMX0FDQ0VTUykKKwkJCQlyZXR1cm4gKFBDQVBfRVJST1JfUEVSTV9ERU5JRUQpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKworCWRlZmF1bHQ6CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAicmVjdl9hY2s6ICVzOiBVbmV4cGVjdGVkIHByaW1pdGl2ZSBhY2sgJXMiLAorCQkgICAgd2hhdCwgZGxwcmltKGRscC0+ZGxfcHJpbWl0aXZlKSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCisJaWYgKGN0bC5sZW4gPCBzaXplKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAicmVjdl9hY2s6ICVzOiBBY2sgdG9vIHNtYWxsICglZCA8ICVkKSIsCisJCSAgICB3aGF0LCBjdGwubGVuLCBzaXplKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisJcmV0dXJuIChjdGwubGVuKTsKK30KKworc3RhdGljIGNoYXIgKgorZGxzdHJlcnJvcihicGZfdV9pbnQzMiBkbF9lcnJubykKK3sKKwlzdGF0aWMgY2hhciBlcnJzdHJpbmdbNisyKzgrMV07CisKKwlzd2l0Y2ggKGRsX2Vycm5vKSB7CisKKwljYXNlIERMX0FDQ0VTUzoKKwkJcmV0dXJuICgiSW1wcm9wZXIgcGVybWlzc2lvbnMgZm9yIHJlcXVlc3QiKTsKKworCWNhc2UgRExfQkFEQUREUjoKKwkJcmV0dXJuICgiRExTQVAgYWRkciBpbiBpbXByb3BlciBmb3JtYXQgb3IgaW52YWxpZCIpOworCisJY2FzZSBETF9CQURDT1JSOgorCQlyZXR1cm4gKCJTZXEgbnVtYmVyIG5vdCBmcm9tIG91dHN0YW5kIERMX0NPTk5fSU5EIik7CisKKwljYXNlIERMX0JBRERBVEE6CisJCXJldHVybiAoIlVzZXIgZGF0YSBleGNlZWRlZCBwcm92aWRlciBsaW1pdCIpOworCisJY2FzZSBETF9CQURQUEE6CisjaWZkZWYgSEFWRV9ERVZfRExQSQorCQkvKgorCQkgKiBXaXRoIGEgc2luZ2xlICIvZGV2L2RscGkiIGRldmljZSB1c2VkIGZvciBhbGwKKwkJICogRExQSSBwcm92aWRlcnMsIFBQQXMgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGgKKwkJICogdW5pdCBudW1iZXJzLgorCQkgKi8KKwkJcmV0dXJuICgiU3BlY2lmaWVkIFBQQSB3YXMgaW52YWxpZCIpOworI2Vsc2UKKwkJLyoKKwkJICogV2UgaGF2ZSBzZXBhcmF0ZSBkZXZpY2VzIGZvciBzZXBhcmF0ZSBkZXZpY2VzOworCQkgKiB0aGUgUFBBIGlzIGp1c3QgdGhlIHVuaXQgbnVtYmVyLgorCQkgKi8KKwkJcmV0dXJuICgiU3BlY2lmaWVkIFBQQSAoZGV2aWNlIHVuaXQpIHdhcyBpbnZhbGlkIik7CisjZW5kaWYKKworCWNhc2UgRExfQkFEUFJJTToKKwkJcmV0dXJuICgiUHJpbWl0aXZlIHJlY2VpdmVkIG5vdCBrbm93biBieSBwcm92aWRlciIpOworCisJY2FzZSBETF9CQURRT1NQQVJBTToKKwkJcmV0dXJuICgiUU9TIHBhcmFtZXRlcnMgY29udGFpbmVkIGludmFsaWQgdmFsdWVzIik7CisKKwljYXNlIERMX0JBRFFPU1RZUEU6CisJCXJldHVybiAoIlFPUyBzdHJ1Y3R1cmUgdHlwZSBpcyB1bmtub3duL3Vuc3VwcG9ydGVkIik7CisKKwljYXNlIERMX0JBRFNBUDoKKwkJcmV0dXJuICgiQmFkIExTQVAgc2VsZWN0b3IiKTsKKworCWNhc2UgRExfQkFEVE9LRU46CisJCXJldHVybiAoIlRva2VuIHVzZWQgbm90IGFuIGFjdGl2ZSBzdHJlYW0iKTsKKworCWNhc2UgRExfQk9VTkQ6CisJCXJldHVybiAoIkF0dGVtcHRlZCBzZWNvbmQgYmluZCB3aXRoIGRsX21heF9jb25pbmQiKTsKKworCWNhc2UgRExfSU5JVEZBSUxFRDoKKwkJcmV0dXJuICgiUGh5c2ljYWwgbGluayBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKworCWNhc2UgRExfTk9BRERSOgorCQlyZXR1cm4gKCJQcm92aWRlciBjb3VsZG4ndCBhbGxvY2F0ZSBhbHRlcm5hdGUgYWRkcmVzcyIpOworCisJY2FzZSBETF9OT1RJTklUOgorCQlyZXR1cm4gKCJQaHlzaWNhbCBsaW5rIG5vdCBpbml0aWFsaXplZCIpOworCisJY2FzZSBETF9PVVRTVEFURToKKwkJcmV0dXJuICgiUHJpbWl0aXZlIGlzc3VlZCBpbiBpbXByb3BlciBzdGF0ZSIpOworCisJY2FzZSBETF9TWVNFUlI6CisJCXJldHVybiAoIlVOSVggc3lzdGVtIGVycm9yIG9jY3VycmVkIik7CisKKwljYXNlIERMX1VOU1VQUE9SVEVEOgorCQlyZXR1cm4gKCJSZXF1ZXN0ZWQgc2VydmljZSBub3Qgc3VwcGxpZWQgYnkgcHJvdmlkZXIiKTsKKworCWNhc2UgRExfVU5ERUxJVkVSQUJMRToKKwkJcmV0dXJuICgiUHJldmlvdXMgZGF0YSB1bml0IGNvdWxkIG5vdCBiZSBkZWxpdmVyZWQiKTsKKworCWNhc2UgRExfTk9UU1VQUE9SVEVEOgorCQlyZXR1cm4gKCJQcmltaXRpdmUgaXMga25vd24gYnV0IG5vdCBzdXBwb3J0ZWQiKTsKKworCWNhc2UgRExfVE9PTUFOWToKKwkJcmV0dXJuICgiTGltaXQgZXhjZWVkZWQiKTsKKworCWNhc2UgRExfTk9URU5BQjoKKwkJcmV0dXJuICgiUHJvbWlzY3VvdXMgbW9kZSBub3QgZW5hYmxlZCIpOworCisJY2FzZSBETF9CVVNZOgorCQlyZXR1cm4gKCJPdGhlciBzdHJlYW1zIGZvciBQUEEgaW4gcG9zdC1hdHRhY2hlZCIpOworCisJY2FzZSBETF9OT0FVVE86CisJCXJldHVybiAoIkF1dG9tYXRpYyBoYW5kbGluZyBYSUQmVEVTVCBub3Qgc3VwcG9ydGVkIik7CisKKwljYXNlIERMX05PWElEQVVUTzoKKwkJcmV0dXJuICgiQXV0b21hdGljIGhhbmRsaW5nIG9mIFhJRCBub3Qgc3VwcG9ydGVkIik7CisKKwljYXNlIERMX05PVEVTVEFVVE86CisJCXJldHVybiAoIkF1dG9tYXRpYyBoYW5kbGluZyBvZiBURVNUIG5vdCBzdXBwb3J0ZWQiKTsKKworCWNhc2UgRExfWElEQVVUTzoKKwkJcmV0dXJuICgiQXV0b21hdGljIGhhbmRsaW5nIG9mIFhJRCByZXNwb25zZSIpOworCisJY2FzZSBETF9URVNUQVVUTzoKKwkJcmV0dXJuICgiQXV0b21hdGljIGhhbmRsaW5nIG9mIFRFU1QgcmVzcG9uc2UiKTsKKworCWNhc2UgRExfUEVORElORzoKKwkJcmV0dXJuICgiUGVuZGluZyBvdXRzdGFuZGluZyBjb25uZWN0IGluZGljYXRpb25zIik7CisKKwlkZWZhdWx0OgorCQlzcHJpbnRmKGVycnN0cmluZywgIkVycm9yICUwMngiLCBkbF9lcnJubyk7CisJCXJldHVybiAoZXJyc3RyaW5nKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICoKK2RscHJpbShicGZfdV9pbnQzMiBwcmltKQoreworCXN0YXRpYyBjaGFyIHByaW1idWZbODBdOworCisJc3dpdGNoIChwcmltKSB7CisKKwljYXNlIERMX0lORk9fUkVROgorCQlyZXR1cm4gKCJETF9JTkZPX1JFUSIpOworCisJY2FzZSBETF9JTkZPX0FDSzoKKwkJcmV0dXJuICgiRExfSU5GT19BQ0siKTsKKworCWNhc2UgRExfQVRUQUNIX1JFUToKKwkJcmV0dXJuICgiRExfQVRUQUNIX1JFUSIpOworCisJY2FzZSBETF9ERVRBQ0hfUkVROgorCQlyZXR1cm4gKCJETF9ERVRBQ0hfUkVRIik7CisKKwljYXNlIERMX0JJTkRfUkVROgorCQlyZXR1cm4gKCJETF9CSU5EX1JFUSIpOworCisJY2FzZSBETF9CSU5EX0FDSzoKKwkJcmV0dXJuICgiRExfQklORF9BQ0siKTsKKworCWNhc2UgRExfVU5CSU5EX1JFUToKKwkJcmV0dXJuICgiRExfVU5CSU5EX1JFUSIpOworCisJY2FzZSBETF9PS19BQ0s6CisJCXJldHVybiAoIkRMX09LX0FDSyIpOworCisJY2FzZSBETF9FUlJPUl9BQ0s6CisJCXJldHVybiAoIkRMX0VSUk9SX0FDSyIpOworCisJY2FzZSBETF9TVUJTX0JJTkRfUkVROgorCQlyZXR1cm4gKCJETF9TVUJTX0JJTkRfUkVRIik7CisKKwljYXNlIERMX1NVQlNfQklORF9BQ0s6CisJCXJldHVybiAoIkRMX1NVQlNfQklORF9BQ0siKTsKKworCWNhc2UgRExfVU5JVERBVEFfUkVROgorCQlyZXR1cm4gKCJETF9VTklUREFUQV9SRVEiKTsKKworCWNhc2UgRExfVU5JVERBVEFfSU5EOgorCQlyZXR1cm4gKCJETF9VTklUREFUQV9JTkQiKTsKKworCWNhc2UgRExfVURFUlJPUl9JTkQ6CisJCXJldHVybiAoIkRMX1VERVJST1JfSU5EIik7CisKKwljYXNlIERMX1VEUU9TX1JFUToKKwkJcmV0dXJuICgiRExfVURRT1NfUkVRIik7CisKKwljYXNlIERMX0NPTk5FQ1RfUkVROgorCQlyZXR1cm4gKCJETF9DT05ORUNUX1JFUSIpOworCisJY2FzZSBETF9DT05ORUNUX0lORDoKKwkJcmV0dXJuICgiRExfQ09OTkVDVF9JTkQiKTsKKworCWNhc2UgRExfQ09OTkVDVF9SRVM6CisJCXJldHVybiAoIkRMX0NPTk5FQ1RfUkVTIik7CisKKwljYXNlIERMX0NPTk5FQ1RfQ09OOgorCQlyZXR1cm4gKCJETF9DT05ORUNUX0NPTiIpOworCisJY2FzZSBETF9UT0tFTl9SRVE6CisJCXJldHVybiAoIkRMX1RPS0VOX1JFUSIpOworCisJY2FzZSBETF9UT0tFTl9BQ0s6CisJCXJldHVybiAoIkRMX1RPS0VOX0FDSyIpOworCisJY2FzZSBETF9ESVNDT05ORUNUX1JFUToKKwkJcmV0dXJuICgiRExfRElTQ09OTkVDVF9SRVEiKTsKKworCWNhc2UgRExfRElTQ09OTkVDVF9JTkQ6CisJCXJldHVybiAoIkRMX0RJU0NPTk5FQ1RfSU5EIik7CisKKwljYXNlIERMX1JFU0VUX1JFUToKKwkJcmV0dXJuICgiRExfUkVTRVRfUkVRIik7CisKKwljYXNlIERMX1JFU0VUX0lORDoKKwkJcmV0dXJuICgiRExfUkVTRVRfSU5EIik7CisKKwljYXNlIERMX1JFU0VUX1JFUzoKKwkJcmV0dXJuICgiRExfUkVTRVRfUkVTIik7CisKKwljYXNlIERMX1JFU0VUX0NPTjoKKwkJcmV0dXJuICgiRExfUkVTRVRfQ09OIik7CisKKwlkZWZhdWx0OgorCQkodm9pZCkgc3ByaW50ZihwcmltYnVmLCAidW5rbm93biBwcmltaXRpdmUgMHgleCIsIHByaW0pOworCQlyZXR1cm4gKHByaW1idWYpOworCX0KK30KKworc3RhdGljIGludAorZGxiaW5kcmVxKGludCBmZCwgYnBmX3VfaW50MzIgc2FwLCBjaGFyICplYnVmKQoreworCisJZGxfYmluZF9yZXFfdAlyZXE7CisKKwltZW1zZXQoKGNoYXIgKikmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJcmVxLmRsX3ByaW1pdGl2ZSA9IERMX0JJTkRfUkVROworCS8qIFhYWCAtIHdoYXQgaWYgbmVpdGhlciBvZiB0aGVzZSBhcmUgZGVmaW5lZD8gKi8KKyNpZiBkZWZpbmVkKERMX0hQX1JBV0RMUykKKwlyZXEuZGxfbWF4X2NvbmluZCA9IDE7CQkJLyogWFhYIG1hZ2ljIG51bWJlciAqLworCXJlcS5kbF9zZXJ2aWNlX21vZGUgPSBETF9IUF9SQVdETFM7CisjZWxpZiBkZWZpbmVkKERMX0NMRExTKQorCXJlcS5kbF9zZXJ2aWNlX21vZGUgPSBETF9DTERMUzsKKyNlbmRpZgorCXJlcS5kbF9zYXAgPSBzYXA7CisKKwlyZXR1cm4gKHNlbmRfcmVxdWVzdChmZCwgKGNoYXIgKikmcmVxLCBzaXplb2YocmVxKSwgImJpbmQiLCBlYnVmKSk7Cit9CisKK3N0YXRpYyBpbnQKK2RsYmluZGFjayhpbnQgZmQsIGNoYXIgKmJ1ZnAsIGNoYXIgKmVidWYsIGludCAqdWVycm9yKQoreworCisJcmV0dXJuIChyZWN2X2FjayhmZCwgRExfQklORF9BQ0tfU0laRSwgImJpbmQiLCBidWZwLCBlYnVmLCB1ZXJyb3IpKTsKK30KKworc3RhdGljIGludAorZGxva2FjayhpbnQgZmQsIGNvbnN0IGNoYXIgKndoYXQsIGNoYXIgKmJ1ZnAsIGNoYXIgKmVidWYpCit7CisKKwlyZXR1cm4gKHJlY3ZfYWNrKGZkLCBETF9PS19BQ0tfU0laRSwgd2hhdCwgYnVmcCwgZWJ1ZiwgTlVMTCkpOworfQorCisKK3N0YXRpYyBpbnQKK2RsaW5mb3JlcShpbnQgZmQsIGNoYXIgKmVidWYpCit7CisJZGxfaW5mb19yZXFfdCByZXE7CisKKwlyZXEuZGxfcHJpbWl0aXZlID0gRExfSU5GT19SRVE7CisKKwlyZXR1cm4gKHNlbmRfcmVxdWVzdChmZCwgKGNoYXIgKikmcmVxLCBzaXplb2YocmVxKSwgImluZm8iLCBlYnVmKSk7Cit9CisKK3N0YXRpYyBpbnQKK2RsaW5mb2FjayhpbnQgZmQsIGNoYXIgKmJ1ZnAsIGNoYXIgKmVidWYpCit7CisKKwlyZXR1cm4gKHJlY3ZfYWNrKGZkLCBETF9JTkZPX0FDS19TSVpFLCAiaW5mbyIsIGJ1ZnAsIGVidWYsIE5VTEwpKTsKK30KKworI2lmZGVmIEhBVkVfRExQSV9QQVNTSVZFCisvKgorICogRW5hYmxlIERMUEkgcGFzc2l2ZSBtb2RlLiBXZSBkbyBub3QgY2FyZSBpZiB0aGlzIHJlcXVlc3QgZmFpbHMsIGFzIHRoaXMKKyAqIGluZGljYXRlcyB0aGUgdW5kZXJseWluZyBETFBJIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGxpbmsgYWdncmVnYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitkbHBhc3NpdmUoaW50IGZkLCBjaGFyICplYnVmKQoreworCWRsX3Bhc3NpdmVfcmVxX3QgcmVxOworCWJwZl91X2ludDMyIGJ1ZltNQVhETEJVRl07CisKKwlyZXEuZGxfcHJpbWl0aXZlID0gRExfUEFTU0lWRV9SRVE7CisKKwlpZiAoc2VuZF9yZXF1ZXN0KGZkLCAoY2hhciAqKSZyZXEsIHNpemVvZihyZXEpLCAiZGxwYXNzaXZlIiwgZWJ1ZikgPT0gMCkKKwkgICAgKHZvaWQpIGRsb2thY2soZmQsICJkbHBhc3NpdmUiLCAoY2hhciAqKWJ1ZiwgZWJ1Zik7Cit9CisjZW5kaWYKKworI2lmZGVmIERMX0hQX1JBV0RMUworLyoKKyAqIFRoZXJlJ3MgYW4gYWNrICppZiogdGhlcmUncyBhbiBlcnJvci4KKyAqLworc3RhdGljIGludAorZGxyYXdkYXRhcmVxKGludCBmZCwgY29uc3QgdV9jaGFyICpkYXRhcCwgaW50IGRhdGFsZW4pCit7CisJc3RydWN0IHN0cmJ1ZiBjdGwsIGRhdGE7CisJbG9uZyBidWZbTUFYRExCVUZdOwkvKiBYWFggLSBjaGFyPyAqLworCXVuaW9uIERMX3ByaW1pdGl2ZXMgKmRscDsKKwlpbnQgZGxlbjsKKworCWRscCA9IE1BS0VfRExfUFJJTUlUSVZFUyhidWYpOworCisJZGxwLT5kbF9wcmltaXRpdmUgPSBETF9IUF9SQVdEQVRBX1JFUTsKKwlkbGVuID0gRExfSFBfUkFXREFUQV9SRVFfU0laRTsKKworCS8qCisJICogSFAncyBkb2N1bWVudGF0aW9uIGRvZXNuJ3QgYXBwZWFyIHRvIHNob3cgdXMgc3VwcGx5aW5nIGFueQorCSAqIGFkZHJlc3MgcG9pbnRlZCB0byBieSB0aGUgY29udHJvbCBwYXJ0IG9mIHRoZSBtZXNzYWdlLgorCSAqIEkgdGhpbmsgdGhhdCdzIHdoYXQgcmF3IG1vZGUgbWVhbnMgLSB5b3UganVzdCBzZW5kIHRoZSByYXcKKwkgKiBwYWNrZXQsIHlvdSBkb24ndCBzcGVjaWZ5IHdoZXJlIHRvIHNlbmQgaXQgdG8sIGFzIHRoYXQncworCSAqIGltcGxpZWQgYnkgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MuCisJICovCisJY3RsLm1heGxlbiA9IDA7CisJY3RsLmxlbiA9IGRsZW47CisJY3RsLmJ1ZiA9ICh2b2lkICopYnVmOworCisJZGF0YS5tYXhsZW4gPSAwOworCWRhdGEubGVuID0gZGF0YWxlbjsKKwlkYXRhLmJ1ZiA9ICh2b2lkICopZGF0YXA7CisKKwlyZXR1cm4gKHB1dG1zZyhmZCwgJmN0bCwgJmRhdGEsIDApKTsKK30KKyNlbmRpZiAvKiBETF9IUF9SQVdETFMgKi8KKworI2lmIGRlZmluZWQoSEFWRV9TT0xBUklTKSAmJiBkZWZpbmVkKEhBVkVfU1lTX0JVRk1PRF9IKQorc3RhdGljIGNoYXIgKgorZ2V0X3JlbGVhc2UoYnBmX3VfaW50MzIgKm1ham9ycCwgYnBmX3VfaW50MzIgKm1pbm9ycCwgYnBmX3VfaW50MzIgKm1pY3JvcCkKK3sKKwljaGFyICpjcDsKKwlzdGF0aWMgY2hhciBidWZbMzJdOworCisJKm1ham9ycCA9IDA7CisJKm1pbm9ycCA9IDA7CisJKm1pY3JvcCA9IDA7CisJaWYgKHN5c2luZm8oU0lfUkVMRUFTRSwgYnVmLCBzaXplb2YoYnVmKSkgPCAwKQorCQlyZXR1cm4gKCI/Iik7CisJY3AgPSBidWY7CisJaWYgKCFpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKSpjcCkpCisJCXJldHVybiAoYnVmKTsKKwkqbWFqb3JwID0gc3RydG9sKGNwLCAmY3AsIDEwKTsKKwlpZiAoKmNwKysgIT0gJy4nKQorCQlyZXR1cm4gKGJ1Zik7CisJKm1pbm9ycCA9ICBzdHJ0b2woY3AsICZjcCwgMTApOworCWlmICgqY3ArKyAhPSAnLicpCisJCXJldHVybiAoYnVmKTsKKwkqbWljcm9wID0gIHN0cnRvbChjcCwgJmNwLCAxMCk7CisJcmV0dXJuIChidWYpOworfQorI2VuZGlmCisKKyNpZmRlZiBETF9IUF9QUEFfUkVRCisvKgorICogVW5kZXIgSFAtVVggMTAgYW5kIEhQLVVYIDExLCB3ZSBjYW4gYXNrIGZvciB0aGUgcHBhCisgKi8KKworCisvKgorICogRGV0ZXJtaW5lIHBwYSBudW1iZXIgdGhhdCBzcGVjaWZpZXMgaWZuYW1lLgorICoKKyAqIElmIHRoZSAiZGxfaHBfcHBhX2luZm9fdCIgZG9lc24ndCBoYXZlIGEgImRsX21vZHVsZV9pZF8xIiBtZW1iZXIsCisgKiB0aGUgY29kZSB0aGF0J3MgdXNlZCBoZXJlIGlzIHRoZSBvbGQgY29kZSBmb3IgSFAtVVggMTAueC4KKyAqCisgKiBIb3dldmVyLCBIUC1VWCAxMC4yMCwgYXQgbGVhc3QsIGFwcGVhcnMgdG8gaGF2ZSBzdWNoIGEgbWVtYmVyCisgKiBpbiBpdHMgImRsX2hwX3BwYV9pbmZvX3QiIHN0cnVjdHVyZSwgc28gdGhlIG5ldyBjb2RlIGlzIHVzZWQuCisgKiBUaGUgbmV3IGNvZGUgZGlkbid0IHdvcmsgb24gYW4gb2xkIDEwLjIwIHN5c3RlbSBvbiB3aGljaCBSaWNrCisgKiBKb25lcyBvZiBIUCB0cmllZCBpdCwgYnV0IHdpdGggbGF0ZXIgcGF0Y2hlcyBpbnN0YWxsZWQsIGl0CisgKiB3b3JrZWQgLSBpdCBhcHBlYXJzIHRoYXQgdGhlIG9sZGVyIHN5c3RlbSBoYWQgdGhvc2UgbWVtYmVycyBidXQKKyAqIGRpZG4ndCBwdXQgYW55dGhpbmcgaW4gdGhlbSwgc28sIGlmIHRoZSBzZWFyY2ggYnkgbmFtZSBmYWlscywgd2UKKyAqIGRvIHRoZSBvbGQgc2VhcmNoLgorICoKKyAqIFJpY2sgc3VnZ2VzdHMgdGhhdCBtYWtpbmcgc3VyZSB5b3VyIHN5c3RlbSBpcyAidXAgb24gdGhlIGxhdGVzdAorICogbGFuY29tbW9uL0RMUEkvZHJpdmVyIHBhdGNoZXMiIGlzIHByb2JhYmx5IGEgZ29vZCBpZGVhOyBpdCdkIGZpeAorICogdGhhdCBwcm9ibGVtLCBhcyB3ZWxsIGFzIGFsbG93aW5nIGxpYnBjYXAgdG8gc2VlIHBhY2tldHMgc2VudAorICogZnJvbSB0aGUgc3lzdGVtIG9uIHdoaWNoIHRoZSBsaWJwY2FwIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHJ1bi4KKyAqIChPbiAxMC4yMCwgaW4gYWRkaXRpb24gdG8gZ2V0dGluZyB0aGUgbGF0ZXN0IHBhdGNoZXMsIHlvdSBuZWVkCisgKiB0byB0dXJuIHRoZSBrZXJuZWwgImxhbmNfb3V0Ym91bmRfcHJvbWlzY19mbGFnIiBmbGFnIG9uIHdpdGggQURCOworICogYSBwb3N0aW5nIHRvICJjb21wLnN5cy5ocC5ocHV4IiBhdAorICoKKyAqCWh0dHA6Ly93d3cuZGVqYS5jb20vW1NUX3JuPXBzXS9nZXRkb2MueHA/QU49NTU4MDkyMjY2CisgKgorICogc2F5cyB0aGF0LCB0byBzZWUgdGhlIG1hY2hpbmUncyBvdXRnb2luZyB0cmFmZmljLCB5b3UnZCBuZWVkIHRvCisgKiBhcHBseSB0aGUgcmlnaHQgcGF0Y2hlcyB0byB5b3VyIHN5c3RlbSwgYW5kIGFsc28gc2V0IHRoYXQgdmFyaWFibGUKKyAqIHdpdGg6CisKK2VjaG8gJ2xhbmNfb3V0Ym91bmRfcHJvbWlzY19mbGFnL1cxJyB8IC91c3IvYmluL2FkYiAtdyAvc3RhbmQvdm11bml4IC9kZXYva21lbQorCisgKiB3aGljaCBjb3VsZCBiZSBwdXQgaW4sIGZvciBleGFtcGxlLCAiL3NiaW4vaW5pdC5kL2xhbiIuCisgKgorICogU2V0dGluZyB0aGUgdmFyaWFibGUgaXMgbm90IG5lY2Vzc2FyeSBvbiBIUC1VWCAxMS54LgorICovCitzdGF0aWMgaW50CitnZXRfZGxwaV9wcGEocmVnaXN0ZXIgaW50IGZkLCByZWdpc3RlciBjb25zdCBjaGFyICpkZXZpY2UsIHJlZ2lzdGVyIGludCB1bml0LAorICAgIHJlZ2lzdGVyIGNoYXIgKmVidWYpCit7CisJcmVnaXN0ZXIgZGxfaHBfcHBhX2Fja190ICphcDsKKwlyZWdpc3RlciBkbF9ocF9wcGFfaW5mb190ICppcHN0YXJ0LCAqaXA7CisJcmVnaXN0ZXIgaW50IGk7CisJY2hhciBkbmFtZVsxMDBdOworCXJlZ2lzdGVyIHVfbG9uZyBtYWpkZXY7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlkbF9ocF9wcGFfcmVxX3QJcmVxOworCWNoYXIgYnVmW01BWERMQlVGXTsKKwljaGFyICpwcGFfZGF0YV9idWY7CisJZGxfaHBfcHBhX2Fja190CSpkbHA7CisJc3RydWN0IHN0cmJ1ZiBjdGw7CisJaW50IGZsYWdzOworCWludCBwcGE7CisKKwltZW1zZXQoKGNoYXIgKikmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJcmVxLmRsX3ByaW1pdGl2ZSA9IERMX0hQX1BQQV9SRVE7CisKKwltZW1zZXQoKGNoYXIgKilidWYsIDAsIHNpemVvZihidWYpKTsKKwlpZiAoc2VuZF9yZXF1ZXN0KGZkLCAoY2hhciAqKSZyZXEsIHNpemVvZihyZXEpLCAiaHBwcGEiLCBlYnVmKSA8IDApCisJCXJldHVybiAoUENBUF9FUlJPUik7CisKKwljdGwubWF4bGVuID0gRExfSFBfUFBBX0FDS19TSVpFOworCWN0bC5sZW4gPSAwOworCWN0bC5idWYgPSAoY2hhciAqKWJ1ZjsKKworCWZsYWdzID0gMDsKKwkvKgorCSAqIERMUEkgbWF5IHJldHVybiBhIGJpZyBjaHVuayBvZiBkYXRhIGZvciBhIERMX0hQX1BQQV9SRVEuIFRoZSBub3JtYWwKKwkgKiByZWN2X2FjayB3aWxsIGZhaWwgYmVjYXVzZSBpdCBzZXQgdGhlIG1heGxlbiB0byBNQVhETEJVRiAoODE5MikKKwkgKiB3aGljaCBpcyBOT1QgYmlnIGVub3VnaCBmb3IgYSBETF9IUF9QUEFfUkVRLgorCSAqCisJICogVGhpcyBjYXVzZXMgbGlicGNhcCBhcHBsaWNhdGlvbnMgdG8gZmFpbCBvbiBhIHN5c3RlbSB3aXRoIEhQLUFQQQorCSAqIGluc3RhbGxlZC4KKwkgKgorCSAqIFRvIGZpZ3VyZSBvdXQgaG93IGJpZyB0aGUgcmV0dXJuZWQgZGF0YSBpcywgd2UgZmlyc3QgY2FsbCBnZXRtc2cKKwkgKiB0byBnZXQgdGhlIHNtYWxsIGhlYWQgYW5kIHBlZWsgYXQgdGhlIGhlYWQgdG8gZ2V0IHRoZSBhY3R1YWwgZGF0YQorCSAqIGxlbmd0aCwgYW5kICB0aGVuIGlzc3VlIGFub3RoZXIgZ2V0bXNnIHRvIGdldCB0aGUgYWN0dWFsIFBQQSBkYXRhLgorCSAqLworCS8qIGdldCB0aGUgaGVhZCBmaXJzdCAqLworCWlmIChnZXRtc2coZmQsICZjdGwsIChzdHJ1Y3Qgc3RyYnVmICopTlVMTCwgJmZsYWdzKSA8IDApIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJnZXRfZGxwaV9wcGE6IGhwcHBhIGdldG1zZzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCisJZGxwID0gKGRsX2hwX3BwYV9hY2tfdCAqKWN0bC5idWY7CisJaWYgKGRscC0+ZGxfcHJpbWl0aXZlICE9IERMX0hQX1BQQV9BQ0spIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJnZXRfZGxwaV9wcGE6IGhwcHBhIHVuZXhwZWN0ZWQgcHJpbWl0aXZlIGFjayAweCV4IiwKKwkJICAgIChicGZfdV9pbnQzMilkbHAtPmRsX3ByaW1pdGl2ZSk7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCisJaWYgKGN0bC5sZW4gPCBETF9IUF9QUEFfQUNLX1NJWkUpIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJnZXRfZGxwaV9wcGE6IGhwcHBhIGFjayB0b28gc21hbGwgKCVkIDwgJWx1KSIsCisJCSAgICAgY3RsLmxlbiwgKHVuc2lnbmVkIGxvbmcpRExfSFBfUFBBX0FDS19TSVpFKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisKKwkvKiBhbGxvY2F0ZSBidWZmZXIgKi8KKwlpZiAoKHBwYV9kYXRhX2J1ZiA9IChjaGFyICopbWFsbG9jKGRscC0+ZGxfbGVuZ3RoKSkgPT0gTlVMTCkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImdldF9kbHBpX3BwYTogaHBwcGEgbWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisJY3RsLm1heGxlbiA9IGRscC0+ZGxfbGVuZ3RoOworCWN0bC5sZW4gPSAwOworCWN0bC5idWYgPSAoY2hhciAqKXBwYV9kYXRhX2J1ZjsKKwkvKiBnZXQgdGhlIGRhdGEgKi8KKwlpZiAoZ2V0bXNnKGZkLCAmY3RsLCAoc3RydWN0IHN0cmJ1ZiAqKU5VTEwsICZmbGFncykgPCAwKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiZ2V0X2RscGlfcHBhOiBocHBwYSBnZXRtc2c6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlmcmVlKHBwYV9kYXRhX2J1Zik7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCWlmIChjdGwubGVuIDwgZGxwLT5kbF9sZW5ndGgpIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJnZXRfZGxwaV9wcGE6IGhwcHBhIGFjayB0b28gc21hbGwgKCVkIDwgJWx1KSIsCisJCSAgICBjdGwubGVuLCAodW5zaWduZWQgbG9uZylkbHAtPmRsX2xlbmd0aCk7CisJCWZyZWUocHBhX2RhdGFfYnVmKTsKKwkJcmV0dXJuIChQQ0FQX0VSUk9SKTsKKwl9CisKKwlhcCA9IChkbF9ocF9wcGFfYWNrX3QgKilidWY7CisJaXBzdGFydCA9IChkbF9ocF9wcGFfaW5mb190ICopcHBhX2RhdGFfYnVmOworCWlwID0gaXBzdGFydDsKKworI2lmZGVmIEhBVkVfSFBfUFBBX0lORk9fVF9ETF9NT0RVTEVfSURfMQorCS8qCisJICogVGhlICJkbF9ocF9wcGFfaW5mb190IiBzdHJ1Y3R1cmUgaGFzIGEgImRsX21vZHVsZV9pZF8xIgorCSAqIG1lbWJlciB0aGF0IHNob3VsZCwgaW4gdGhlb3J5LCBjb250YWluIHRoZSBwYXJ0IG9mIHRoZQorCSAqIG5hbWUgZm9yIHRoZSBkZXZpY2UgdGhhdCBjb21lcyBiZWZvcmUgdGhlIHVuaXQgbnVtYmVyLAorCSAqIGFuZCBzaG91bGQgYWxzbyBoYXZlIGEgImRsX21vZHVsZV9pZF8yIiBtZW1iZXIgdGhhdCBtYXkKKwkgKiBjb250YWluIGFuIGFsdGVybmF0ZSBuYW1lIChlLmcuLCBJIHRoaW5rIEV0aGVybmV0IGRldmljZXMKKwkgKiBoYXZlIGJvdGggImxhbiIsIGZvciAibGFuTiIsIGFuZCAic25hcCIsIGZvciAic25hcE4iLCB3aXRoCisJICogdGhlIGZvcm1lciBiZWluZyBmb3IgRXRoZXJuZXQgcGFja2V0cyBhbmQgdGhlIGxhdHRlciBiZWluZworCSAqIGZvciA4MDIuMy84MDIuMiBwYWNrZXRzKS4KKwkgKgorCSAqIFNlYXJjaCBmb3IgdGhlIGRldmljZSB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kCisJICogaW5zdGFuY2UgbnVtYmVyLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBhcC0+ZGxfY291bnQ7IGkrKykgeworCQlpZiAoKHN0cmNtcCgoY29uc3QgY2hhciAqKWlwLT5kbF9tb2R1bGVfaWRfMSwgZGV2aWNlKSA9PSAwIHx8CisJCSAgICAgc3RyY21wKChjb25zdCBjaGFyICopaXAtPmRsX21vZHVsZV9pZF8yLCBkZXZpY2UpID09IDApICYmCisJCSAgICBpcC0+ZGxfaW5zdGFuY2VfbnVtID09IHVuaXQpCisJCQlicmVhazsKKworCQlpcCA9IChkbF9ocF9wcGFfaW5mb190ICopKCh1X2NoYXIgKilpcHN0YXJ0ICsgaXAtPmRsX25leHRfb2Zmc2V0KTsKKwl9CisjZWxzZQorCS8qCisJICogV2UgZG9uJ3QgaGF2ZSB0aGF0IG1lbWJlciwgc28gdGhlIHNlYXJjaCBpcyBpbXBvc3NpYmxlOyBtYWtlIGl0CisJICogbG9vayBhcyBpZiB0aGUgc2VhcmNoIGZhaWxlZC4KKwkgKi8KKwlpID0gYXAtPmRsX2NvdW50OworI2VuZGlmCisKKwlpZiAoaSA9PSBhcC0+ZGxfY291bnQpIHsKKwkJLyoKKwkJICogV2VsbCwgd2UgZGlkbid0LCBvciBjYW4ndCwgZmluZCB0aGUgZGV2aWNlIGJ5IG5hbWUuCisJCSAqCisJCSAqIEhQLVVYIDEwLjIwLCB3aGlsc3QgaXQgaGFzICJkbF9tb2R1bGVfaWRfMSIgYW5kCisJCSAqICJkbF9tb2R1bGVfaWRfMiIgZmllbGRzIGluIHRoZSAiZGxfaHBfcHBhX2luZm9fdCIsCisJCSAqIGRvZXNuJ3Qgc2VlbSB0byBmaWxsIHRoZW0gaW4gdW5sZXNzIHRoZSBzeXN0ZW0gaXMKKwkJICogYXQgYSByZWFzb25hYmx5IHVwLXRvLWRhdGUgcGF0Y2ggbGV2ZWwuCisJCSAqCisJCSAqIE9sZGVyIEhQLVVYIDEwLnggc3lzdGVtcyBtaWdodCBub3QgaGF2ZSB0aG9zZSBmaWVsZHMKKwkJICogYXQgYWxsLgorCQkgKgorCQkgKiBUaGVyZWZvcmUsIHdlJ2xsIHNlYXJjaCBmb3IgdGhlIGVudHJ5IHdpdGggdGhlIG1ham9yCisJCSAqIGRldmljZSBudW1iZXIgb2YgYSBkZXZpY2Ugd2l0aCB0aGUgbmFtZSAiL2Rldi88ZGV2Pjx1bml0PiIsCisJCSAqIGlmIHN1Y2ggYSBkZXZpY2UgZXhpc3RzLCBhcyB0aGUgb2xkIGNvZGUgZGlkLgorCQkgKi8KKwkJc25wcmludGYoZG5hbWUsIHNpemVvZihkbmFtZSksICIvZGV2LyVzJWQiLCBkZXZpY2UsIHVuaXQpOworCQlpZiAoc3RhdChkbmFtZSwgJnN0YXRidWYpIDwgMCkgeworCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInN0YXQ6ICVzOiAlcyIsCisJCQkgICAgZG5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwkJbWFqZGV2ID0gbWFqb3Ioc3RhdGJ1Zi5zdF9yZGV2KTsKKworCQlpcCA9IGlwc3RhcnQ7CisKKwkJZm9yIChpID0gMDsgaSA8IGFwLT5kbF9jb3VudDsgaSsrKSB7CisJCQlpZiAoaXAtPmRsX21qcl9udW0gPT0gbWFqZGV2ICYmCisJCQkgICAgaXAtPmRsX2luc3RhbmNlX251bSA9PSB1bml0KQorCQkJCWJyZWFrOworCisJCQlpcCA9IChkbF9ocF9wcGFfaW5mb190ICopKCh1X2NoYXIgKilpcHN0YXJ0ICsgaXAtPmRsX25leHRfb2Zmc2V0KTsKKwkJfQorCX0KKwlpZiAoaSA9PSBhcC0+ZGxfY291bnQpIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJjYW4ndCBmaW5kIC9kZXYvZGxwaSBQUEEgZm9yICVzJWQiLCBkZXZpY2UsIHVuaXQpOworCQlyZXR1cm4gKFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UpOworCX0KKwlpZiAoaXAtPmRsX2hkd19zdGF0ZSA9PSBIRFdfREVBRCkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzJWQ6IGhhcmR3YXJlIHN0YXRlOiBET1dOXG4iLCBkZXZpY2UsIHVuaXQpOworCQlmcmVlKHBwYV9kYXRhX2J1Zik7CisJCXJldHVybiAoUENBUF9FUlJPUik7CisJfQorCXBwYSA9IGlwLT5kbF9wcGE7CisJZnJlZShwcGFfZGF0YV9idWYpOworCXJldHVybiAocHBhKTsKK30KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9IUFVYOQorLyoKKyAqIFVuZGVyIEhQLVVYIDksIHRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIGRldGVybWluZSB0aGUgcHBhLgorICogU28gcHVudCBhbmQgcmVhZCBpdCBmcm9tIC9kZXYva21lbS4KKyAqLworc3RhdGljIHN0cnVjdCBubGlzdCBubFtdID0geworI2RlZmluZSBOTF9JRk5FVCAwCisJeyAiaWZuZXQiIH0sCisJeyAiIiB9Cit9OworCitzdGF0aWMgY2hhciBwYXRoX3ZtdW5peFtdID0gIi9ocC11eCI7CisKKy8qIERldGVybWluZSBwcGEgbnVtYmVyIHRoYXQgc3BlY2lmaWVzIGlmbmFtZSAqLworc3RhdGljIGludAorZ2V0X2RscGlfcHBhKHJlZ2lzdGVyIGludCBmZCwgcmVnaXN0ZXIgY29uc3QgY2hhciAqaWZuYW1lLCByZWdpc3RlciBpbnQgdW5pdCwKKyAgICByZWdpc3RlciBjaGFyICplYnVmKQoreworCXJlZ2lzdGVyIGNvbnN0IGNoYXIgKmNwOworCXJlZ2lzdGVyIGludCBrZDsKKwl2b2lkICphZGRyOworCXN0cnVjdCBpZm5ldCBpZm5ldDsKKwljaGFyIGlmX25hbWVbc2l6ZW9mKGlmbmV0LmlmX25hbWUpICsgMV07CisKKwljcCA9IHN0cnJjaHIoaWZuYW1lLCAnLycpOworCWlmIChjcCAhPSBOVUxMKQorCQlpZm5hbWUgPSBjcCArIDE7CisJaWYgKG5saXN0KHBhdGhfdm11bml4LCAmbmwpIDwgMCkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibmxpc3QgJXMgZmFpbGVkIiwKKwkJICAgIHBhdGhfdm11bml4KTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChubFtOTF9JRk5FVF0ubl92YWx1ZSA9PSAwKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiY291bGQndCBmaW5kICVzIGtlcm5lbCBzeW1ib2wiLAorCQkgICAgbmxbTkxfSUZORVRdLm5fbmFtZSk7CisJCXJldHVybiAoLTEpOworCX0KKwlrZCA9IG9wZW4oIi9kZXYva21lbSIsIE9fUkRPTkxZKTsKKwlpZiAoa2QgPCAwKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJrbWVtIG9wZW46ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWlmIChkbHBpX2tyZWFkKGtkLCBubFtOTF9JRk5FVF0ubl92YWx1ZSwKKwkgICAgJmFkZHIsIHNpemVvZihhZGRyKSwgZWJ1ZikgPCAwKSB7CisJCWNsb3NlKGtkKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWZvciAoOyBhZGRyICE9IE5VTEw7IGFkZHIgPSBpZm5ldC5pZl9uZXh0KSB7CisJCWlmIChkbHBpX2tyZWFkKGtkLCAob2ZmX3QpYWRkciwKKwkJICAgICZpZm5ldCwgc2l6ZW9mKGlmbmV0KSwgZWJ1ZikgPCAwIHx8CisJCSAgICBkbHBpX2tyZWFkKGtkLCAob2ZmX3QpaWZuZXQuaWZfbmFtZSwKKwkJICAgIGlmX25hbWUsIHNpemVvZihpZm5ldC5pZl9uYW1lKSwgZWJ1ZikgPCAwKSB7CisJCQkodm9pZCljbG9zZShrZCk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlpZl9uYW1lW3NpemVvZihpZm5ldC5pZl9uYW1lKV0gPSAnXDAnOworCQlpZiAoc3RyY21wKGlmX25hbWUsIGlmbmFtZSkgPT0gMCAmJiBpZm5ldC5pZl91bml0ID09IHVuaXQpCisJCQlyZXR1cm4gKGlmbmV0LmlmX2luZGV4KTsKKwl9CisKKwlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgZmluZCAlcyIsIGlmbmFtZSk7CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK2RscGlfa3JlYWQocmVnaXN0ZXIgaW50IGZkLCByZWdpc3RlciBvZmZfdCBhZGRyLAorICAgIHJlZ2lzdGVyIHZvaWQgKmJ1ZiwgcmVnaXN0ZXIgdV9pbnQgbGVuLCByZWdpc3RlciBjaGFyICplYnVmKQoreworCXJlZ2lzdGVyIGludCBjYzsKKworCWlmIChsc2VlayhmZCwgYWRkciwgU0VFS19TRVQpIDwgMCkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibHNlZWs6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCWNjID0gcmVhZChmZCwgYnVmLCBsZW4pOworCWlmIChjYyA8IDApIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInJlYWQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfSBlbHNlIGlmIChjYyAhPSBsZW4pIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNob3J0IHJlYWQgKCVkICE9ICVkKSIsIGNjLAorCQkgICAgbGVuKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAoY2MpOworfQorI2VuZGlmCisKK3BjYXBfdCAqCitwY2FwX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpwOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5zZW5kX2ZkID0gLTE7CS8qIGl0IGhhc24ndCBiZWVuIG9wZW5lZCB5ZXQgKi8KKworCXAtPmFjdGl2YXRlX29wID0gcGNhcF9hY3RpdmF0ZV9kbHBpOworCXJldHVybiAocCk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtZG9zLmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtZG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkMjc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1kb3MuYwpAQCAtMCwwICsxLDE0NzkgQEAKKy8qCisgKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRE9TLWxpYnBjYXAKKyAqICBQb3J0ZWQgdG8gRE9TL0RPU1ggYnkgRy4gVmFuZW0gPGd2YW5lbUBicm9hZHBhcmsubm8+CisgKgorICogIHBjYXAtZG9zLmM6IEludGVyZmFjZSB0byBQS1REUlZSLCBORElTMiBhbmQgMzItYml0IHBtb2RlCisgKiAgICAgICAgICAgICAgbmV0d29yayBkcml2ZXJzLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1kb3MuYyx2IDEuNyAyMDA4LTA0LTIyIDE3OjE2OjMwIGd1eSBFeHAgJCAoTEJMKQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpby5oPgorCisjaWYgZGVmaW5lZChVU0VfMzJCSVRfRFJJVkVSUykKKyAgI2luY2x1ZGUgIm1zZG9zL3BtX2RydnIvcG1kcnZyLmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyL3BjaS5oIgorICAjaW5jbHVkZSAibXNkb3MvcG1fZHJ2ci9iaW9zMzIuaCIKKyAgI2luY2x1ZGUgIm1zZG9zL3BtX2RydnIvbW9kdWxlLmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyLzNjNTAxLmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyLzNjNTAzLmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyLzNjNTA5LmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyLzNjNTl4LmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyLzNjNTE1LmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyLzNjOTB4LmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyLzNjNTc1X2NiLmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyL25lLmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyL3dkLmgiCisgICNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyL2FjY3Rvbi5oIgorICAjaW5jbHVkZSAibXNkb3MvcG1fZHJ2ci9jczg5eDAuaCIKKyAgI2luY2x1ZGUgIm1zZG9zL3BtX2RydnIvcnRsODEzOS5oIgorICAjaW5jbHVkZSAibXNkb3MvcG1fZHJ2ci9uZTJrLXBjaS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJwY2FwLmgiCisjaW5jbHVkZSAicGNhcC1kb3MuaCIKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgIm1zZG9zL3BrdGRydnIuaCIKKworI2lmZGVmIFVTRV9ORElTMgorI2luY2x1ZGUgIm1zZG9zL25kaXMyLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXQvaWZfcGFja2UuaD4KKyNpbmNsdWRlIDx0Y3AuaD4KKworI2lmIGRlZmluZWQoVVNFXzMyQklUX0RSSVZFUlMpCisgICNkZWZpbmUgRkxVU0hLKCkgICAgICAgZG8geyBfcHJpbnRrX3NhZmUgPSAxOyBfcHJpbnRrX2ZsdXNoKCk7IH0gd2hpbGUgKDApCisgICNkZWZpbmUgTkRJU19ORVhUX0RFViAgJnJ0bDgxMzlfZGV2CisKKyAgc3RhdGljIGNoYXIgKnJ4X3Bvb2wgPSBOVUxMOworICBzdGF0aWMgdm9pZCBpbml0XzMyYml0ICh2b2lkKTsKKworICBzdGF0aWMgaW50ICBwa3RxX2luaXQgICAgIChzdHJ1Y3QgcnhfcmluZ2J1ZiAqcSwgaW50IHNpemUsIGludCBudW0sIGNoYXIgKnBvb2wpOworICBzdGF0aWMgaW50ICBwa3RxX2NoZWNrICAgIChzdHJ1Y3QgcnhfcmluZ2J1ZiAqcSk7CisgIHN0YXRpYyBpbnQgIHBrdHFfaW5jX291dCAgKHN0cnVjdCByeF9yaW5nYnVmICpxKTsKKyAgc3RhdGljIGludCAgcGt0cV9pbl9pbmRleCAoc3RydWN0IHJ4X3JpbmdidWYgKnEpIExPQ0tFRF9GVU5DOworICBzdGF0aWMgdm9pZCBwa3RxX2NsZWFyICAgIChzdHJ1Y3QgcnhfcmluZ2J1ZiAqcSkgTE9DS0VEX0ZVTkM7CisKKyAgc3RhdGljIHN0cnVjdCByeF9lbGVtICpwa3RxX2luX2VsZW0gIChzdHJ1Y3QgcnhfcmluZ2J1ZiAqcSkgTE9DS0VEX0ZVTkM7CisgIHN0YXRpYyBzdHJ1Y3QgcnhfZWxlbSAqcGt0cV9vdXRfZWxlbSAoc3RydWN0IHJ4X3JpbmdidWYgKnEpOworCisjZWxzZQorICAjZGVmaW5lIEZMVVNISygpICAgICAgKCh2b2lkKTApCisgICNkZWZpbmUgTkRJU19ORVhUX0RFViAgTlVMTAorI2VuZGlmCisKKy8qCisgKiBJbnRlcm5hbCB2YXJpYWJsZXMvZnVuY3Rpb25zIGluIFdhdHQtMzIKKyAqLworZXh0ZXJuIFdPUkQgIF9wa3RkZXZjbGFzczsKK2V4dGVybiBCT09MICBfZXRoX2lzX2luaXQ7CitleHRlcm4gaW50ICAgX3czMl9keW5hbWljX2hvc3Q7CitleHRlcm4gaW50ICAgX3dhdHRfZG9fZXhpdDsKK2V4dGVybiBpbnQgICBfd2F0dF9pc19pbml0OworZXh0ZXJuIGludCAgIF93MzJfX2Jvb3RwX29uLCBfdzMyX19kaGNwX29uLCBfdzMyX19yYXJwX29uLCBfdzMyX19kb19tYXNrX3JlcTsKK2V4dGVybiB2b2lkICgqX3czMl91c3JfcG9zdF9pbml0KSAodm9pZCk7CitleHRlcm4gdm9pZCAoKl93MzJfcHJpbnRfaG9vaykoKTsKKworZXh0ZXJuIHZvaWQgZGJ1Z193cml0ZSAoY29uc3QgY2hhciAqKTsgIC8qIFdhdHQtMzIgbGliLCBwY2RidWcuYyAqLworZXh0ZXJuIGludCAgcGt0X2dldF9tdHUgKHZvaWQpOworCitzdGF0aWMgaW50IHJlZl9jb3VudCA9IDA7CisKK3N0YXRpYyB1X2xvbmcgbWFjX2NvdW50ICAgID0gMDsKK3N0YXRpYyB1X2xvbmcgZmlsdGVyX2NvdW50ID0gMDsKKworc3RhdGljIHZvbGF0aWxlIEJPT0wgZXhjX29jY3VyZWQgPSAwOworCitzdGF0aWMgc3RydWN0IGRldmljZSAqaGFuZGxlX3RvX2RldmljZSBbMjBdOworCitzdGF0aWMgaW50ICBwY2FwX2FjdGl2YXRlX2RvcyAocGNhcF90ICpwKTsKK3N0YXRpYyBpbnQgIHBjYXBfcmVhZF9kb3MgKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdV9jaGFyICpkYXRhKTsKK3N0YXRpYyB2b2lkIHBjYXBfY2xlYW51cF9kb3MgKHBjYXBfdCAqcCk7CitzdGF0aWMgaW50ICBwY2FwX3N0YXRzX2RvcyAocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcyk7CitzdGF0aWMgaW50ICBwY2FwX3NlbmRwYWNrZXRfZG9zIChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CitzdGF0aWMgaW50ICBwY2FwX3NldGZpbHRlcl9kb3MgKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCk7CisKK3N0YXRpYyBpbnQgIG5kaXNfcHJvYmUgKHN0cnVjdCBkZXZpY2UgKmRldik7CitzdGF0aWMgaW50ICBwa3RfcHJvYmUgIChzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitzdGF0aWMgdm9pZCBjbG9zZV9kcml2ZXIgKHZvaWQpOworc3RhdGljIGludCAgaW5pdF93YXR0MzIgKHN0cnVjdCBwY2FwICpwY2FwLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgY2hhciAqZXJyX2J1Zik7CitzdGF0aWMgaW50ICBmaXJzdF9pbml0IChjb25zdCBjaGFyICpuYW1lLCBjaGFyICplYnVmLCBpbnQgcHJvbWlzYyk7CisKK3N0YXRpYyB2b2lkIHdhdHQzMl9yZWN2X2hvb2sgKHVfY2hhciAqZHVtbXksIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqcGNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqYnVmKTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZGV2aWNlIHdlIGFsd2F5cyBzdXBwb3J0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIG5kaXNfZGV2ID0geworICAgICAgICAgICAgICAibmRpcyIsCisgICAgICAgICAgICAgICJORElTMiBMYW5NYW5hZ2VyIiwKKyAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgMCwwLDAsMCwwLDAsCisgICAgICAgICAgICAgIE5ESVNfTkVYVF9ERVYsICAvKiBOVUxMIG9yIGEgMzItYml0IGRldmljZSAqLworICAgICAgICAgICAgICBuZGlzX3Byb2JlCisgICAgICAgICAgICB9OworCitzdGF0aWMgc3RydWN0IGRldmljZSBwa3RfZGV2ID0geworICAgICAgICAgICAgICAicGt0IiwKKyAgICAgICAgICAgICAgIlBhY2tldC1Ecml2ZXIiLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAwLDAsMCwwLDAsMCwKKyAgICAgICAgICAgICAgJm5kaXNfZGV2LAorICAgICAgICAgICAgICBwa3RfcHJvYmUKKyAgICAgICAgICAgIH07CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpnZXRfZGV2aWNlIChpbnQgZmQpCit7CisgIGlmIChmZCA8PSAwIHx8IGZkID49IHNpemVvZihoYW5kbGVfdG9fZGV2aWNlKS9zaXplb2YoaGFuZGxlX3RvX2RldmljZVswXSkpCisgICAgIHJldHVybiAoTlVMTCk7CisgIHJldHVybiBoYW5kbGVfdG9fZGV2aWNlIFtmZC0xXTsKK30KKworcGNhcF90ICpwY2FwX2NyZWF0ZSAoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX2RvczsKKwlyZXR1cm4gKHApOworfQorCisvKgorICogT3BlbiBNQUMtZHJpdmVyIHdpdGggbmFtZSAnZGV2aWNlX25hbWUnIGZvciBsaXZlIGNhcHR1cmUgb2YKKyAqIG5ldHdvcmsgcGFja2V0cy4KKyAqLworc3RhdGljIGludCBwY2FwX2FjdGl2YXRlX2RvcyAocGNhcF90ICpwY2FwKQoreyAKKyAgaWYgKHBjYXAtPm9wdC5yZm1vbikgeworICAgIC8qCisgICAgICogTm8gbW9uaXRvciBtb2RlIG9uIERPUy4KKyAgICAgKi8KKyAgICByZXR1cm4gKFBDQVBfRVJST1JfUkZNT05fTk9UU1VQKTsKKyAgfQorCisgIGlmIChwY2FwLT5zbmFwc2hvdCA8IEVUSF9NSU4rOCkKKyAgICAgIHBjYXAtPnNuYXBzaG90ID0gRVRIX01JTis4OworCisgIGlmIChwY2FwLT5zbmFwc2hvdCA+IEVUSF9NQVgpICAgLyogc2lsZW50bHkgYWNjZXB0IGFuZCB0cnVuY2F0ZSBsYXJnZSBNVFVzICovCisgICAgICBwY2FwLT5zbmFwc2hvdCA9IEVUSF9NQVg7CisKKyAgcGNhcC0+bGlua3R5cGUgICAgICAgICAgPSBETFRfRU4xME1COyAgLyogISEgKi8KKyAgcGNhcC0+Y2xlYW51cF9vcCAgICAgICAgPSBwY2FwX2NsZWFudXBfZG9zOworICBwY2FwLT5yZWFkX29wICAgICAgICAgICA9IHBjYXBfcmVhZF9kb3M7CisgIHBjYXAtPnN0YXRzX29wICAgICAgICAgID0gcGNhcF9zdGF0c19kb3M7CisgIHBjYXAtPmluamVjdF9vcCAgICAgICAgID0gcGNhcF9zZW5kcGFja2V0X2RvczsKKyAgcGNhcC0+c2V0ZmlsdGVyX29wICAgICAgPSBwY2FwX3NldGZpbHRlcl9kb3M7CisgIHBjYXAtPnNldGRpcmVjdGlvbl9vcCAgID0gTlVMTDsgLyogTm90IGltcGxlbWVudGVkLiovCisgIHBjYXAtPmZkICAgICAgICAgICAgICAgID0gKytyZWZfY291bnQ7CisKKyAgaWYgKHBjYXAtPmZkID09IDEpICAvKiBmaXJzdCB0aW1lIHdlJ3JlIGNhbGxlZCAqLworICB7CisgICAgaWYgKCFpbml0X3dhdHQzMihwY2FwLCBwY2FwLT5vcHQuc291cmNlLCBwY2FwLT5lcnJidWYpIHx8CisgICAgICAgICFmaXJzdF9pbml0KHBjYXAtPm9wdC5zb3VyY2UsIHBjYXAtPmVycmJ1ZiwgcGNhcC0+b3B0LnByb21pc2MpKQorICAgIHsKKyAgICAgIHJldHVybiAoUENBUF9FUlJPUik7CisgICAgfSAKKyAgICBhdGV4aXQgKGNsb3NlX2RyaXZlcik7CisgIH0KKyAgZWxzZSBpZiAoc3RyaWNtcChhY3RpdmVfZGV2LT5uYW1lLHBjYXAtPm9wdC5zb3VyY2UpKQorICB7CisgICAgc25wcmludGYgKHBjYXAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKyAgICAgICAgICAgICAgIkNhbm5vdCB1c2UgZGlmZmVyZW50IGRldmljZXMgc2ltdWx0YW5lb3VzbHkgIgorICAgICAgICAgICAgICAiKGAlcycgdnMuIGAlcycpIiwgYWN0aXZlX2Rldi0+bmFtZSwgcGNhcC0+b3B0LnNvdXJjZSk7CisgICAgcmV0dXJuIChQQ0FQX0VSUk9SKTsKKyAgfQorICBoYW5kbGVfdG9fZGV2aWNlIFtwY2FwLT5mZC0xXSA9IGFjdGl2ZV9kZXY7CisgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBQb2xsIHRoZSByZWNlaXZlciBxdWV1ZSBhbmQgY2FsbCB0aGUgcGNhcCBjYWxsYmFjay1oYW5kbGVyCisgKiB3aXRoIHRoZSBwYWNrZXQuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfcmVhZF9vbmUgKHBjYXBfdCAqcCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKmRhdGEpCit7CisgIHN0cnVjdCBwY2FwX3BrdGhkciBwY2FwOworICBzdHJ1Y3QgdGltZXZhbCAgICAgbm93LCBleHBpcnk7CisgIEJZVEUgICpyeF9idWY7CisgIGludCAgICByeF9sZW4gPSAwOworCisgIGlmIChwLT5tZC50aW1lb3V0ID4gMCkKKyAgeworICAgIGdldHRpbWVvZmRheTIgKCZub3csIE5VTEwpOworICAgIGV4cGlyeS50dl91c2VjID0gbm93LnR2X3VzZWMgKyAxMDAwVUwgKiBwLT5tZC50aW1lb3V0OworICAgIGV4cGlyeS50dl9zZWMgID0gbm93LnR2X3NlYzsKKyAgICB3aGlsZSAoZXhwaXJ5LnR2X3VzZWMgPj0gMTAwMDAwMEwpCisgICAgeworICAgICAgZXhwaXJ5LnR2X3VzZWMgLT0gMTAwMDAwMEw7CisgICAgICBleHBpcnkudHZfc2VjKys7CisgICAgfQorICB9CisKKyAgd2hpbGUgKCFleGNfb2NjdXJlZCkKKyAgeworICAgIHZvbGF0aWxlIHN0cnVjdCBkZXZpY2UgKmRldjsgLyogbWlnaHQgYmUgcmVzZXQgYnkgc2lnX2hhbmRsZXIgKi8KKworICAgIGRldiA9IGdldF9kZXZpY2UgKHAtPmZkKTsKKyAgICBpZiAoIWRldikKKyAgICAgICBicmVhazsKKworICAgIFBDQVBfQVNTRVJUIChkZXYtPmNvcHlfcnhfYnVmIHx8IGRldi0+cGVla19yeF9idWYpOworICAgIEZMVVNISygpOworCisgICAgLyogSWYgZHJpdmVyIGhhcyBhIHplcm8tY29weSByZWNlaXZlIGZhY2lsaXR5LCBwZWVrIGF0IHRoZSBxdWV1ZSwKKyAgICAgKiBmaWx0ZXIgaXQsIGRvIHRoZSBjYWxsYmFjayBhbmQgcmVsZWFzZSB0aGUgYnVmZmVyLgorICAgICAqLworICAgIGlmIChkZXYtPnBlZWtfcnhfYnVmKQorICAgIHsKKyAgICAgIFBDQVBfQVNTRVJUIChkZXYtPnJlbGVhc2VfcnhfYnVmKTsKKyAgICAgIHJ4X2xlbiA9ICgqZGV2LT5wZWVrX3J4X2J1ZikgKCZyeF9idWYpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgQllURSBidWYgW0VUSF9NQVgrMTAwXTsgLyogYWRkIHNvbWUgbWFyZ2luICovCisgICAgICByeF9sZW4gPSAoKmRldi0+Y29weV9yeF9idWYpIChidWYsIHAtPnNuYXBzaG90KTsKKyAgICAgIHJ4X2J1ZiA9IGJ1ZjsKKyAgICB9CisKKyAgICBpZiAocnhfbGVuID4gMCkgIC8qIGdvdCBhIHBhY2tldCAqLworICAgIHsKKyAgICAgIG1hY19jb3VudCsrOworCisgICAgICBGTFVTSEsoKTsKKworICAgICAgcGNhcC5jYXBsZW4gPSBtaW4gKHJ4X2xlbiwgcC0+c25hcHNob3QpOworICAgICAgcGNhcC5sZW4gICAgPSByeF9sZW47CisKKyAgICAgIGlmIChjYWxsYmFjayAmJgorICAgICAgICAgICghcC0+ZmNvZGUuYmZfaW5zbnMgfHwgYnBmX2ZpbHRlcihwLT5mY29kZS5iZl9pbnNucywgcnhfYnVmLCBwY2FwLmxlbiwgcGNhcC5jYXBsZW4pKSkKKyAgICAgIHsKKyAgICAgICAgZmlsdGVyX2NvdW50Kys7CisKKyAgICAgICAgLyogRml4LW1lISEgU2hvdWxkIGJlIHRpbWUgb2YgYXJyaXZhbC4gTm90IHRpbWUgb2YKKyAgICAgICAgICogY2FwdHVyZS4KKyAgICAgICAgICovCisgICAgICAgIGdldHRpbWVvZmRheTIgKCZwY2FwLnRzLCBOVUxMKTsKKyAgICAgICAgKCpjYWxsYmFjaykgKGRhdGEsICZwY2FwLCByeF9idWYpOworICAgICAgfQorCisgICAgICBpZiAoZGV2LT5yZWxlYXNlX3J4X2J1ZikKKyAgICAgICAgKCpkZXYtPnJlbGVhc2VfcnhfYnVmKSAocnhfYnVmKTsKKworICAgICAgaWYgKHBjYXBfcGt0X2RlYnVnID4gMCkKKyAgICAgIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrID09IHdhdHQzMl9yZWN2X2hvb2spCisgICAgICAgICAgICAgZGJ1Z193cml0ZSAoInBjYXBfcmVjdl9ob29rXG4iKTsKKyAgICAgICAgZWxzZSBkYnVnX3dyaXRlICgicGNhcF9yZWFkX29wXG4iKTsKKyAgICAgIH0KKyAgICAgIEZMVVNISygpOworICAgICAgcmV0dXJuICgxKTsKKyAgICB9CisKKyAgICAvKiBJZiBub3QgdG8gd2FpdCBmb3IgYSBwYWNrZXQgb3IgcGNhcF9jbG9zZSgpIGNhbGxlZCBmcm9tCisgICAgICogZS5nLiBTSUdJTlQgaGFuZGxlciwgZXhpdCBsb29wIG5vdy4KKyAgICAgKi8KKyAgICBpZiAocC0+bWQudGltZW91dCA8PSAwIHx8ICh2b2xhdGlsZSBpbnQpcC0+ZmQgPD0gMCkKKyAgICAgICBicmVhazsKKworICAgIGdldHRpbWVvZmRheTIgKCZub3csIE5VTEwpOworCisgICAgaWYgKHRpbWVyY21wKCZub3csICZleHBpcnksID4pKQorICAgICAgIGJyZWFrOworCisjaWZuZGVmIERKR1BQCisgICAga2JoaXQoKTsgICAgLyogYSByZWFsIENQVSBob2cgKi8KKyNlbmRpZgorCisgICAgaWYgKHAtPndhaXRfcHJvYykKKyAgICAgICgqcC0+d2FpdF9wcm9jKSgpOyAgICAgLyogY2FsbCB5aWVsZCBmdW5jICovCisgIH0KKworICBpZiAocnhfbGVuIDwgMCkgICAgICAgICAgICAvKiByZWNlaXZlIGVycm9yICovCisgIHsKKyAgICBwLT5tZC5zdGF0LnBzX2Ryb3ArKzsKKyNpZmRlZiBVU0VfMzJCSVRfRFJJVkVSUworICAgIGlmIChwY2FwX3BrdF9kZWJ1ZyA+IDEpCisgICAgICAgcHJpbnRrICgicGt0LWVyciAlc1xuIiwgcGt0SW5mby5lcnJvcik7CisjZW5kaWYKKyAgICByZXR1cm4gKC0xKTsKKyAgfQorICByZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwY2FwX3JlYWRfZG9zIChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICpkYXRhKQoreworICBpbnQgcmMsIG51bSA9IDA7CisKKyAgd2hpbGUgKG51bSA8PSBjbnQgfHwgKGNudCA8IDApKQorICB7CisgICAgaWYgKHAtPmZkIDw9IDApCisgICAgICAgcmV0dXJuICgtMSk7CisgICAgcmMgPSBwY2FwX3JlYWRfb25lIChwLCBjYWxsYmFjaywgZGF0YSk7CisgICAgaWYgKHJjID4gMCkKKyAgICAgICBudW0rKzsKKyAgICBpZiAocmMgPCAwKQorICAgICAgIGJyZWFrOworICAgIF93MzJfb3NfeWllbGQoKTsgIC8qIGFsbG93IFNJR0lOVCBnZW5lcmF0aW9uLCB5aWVsZCB0byBXaW45NS9OVCAqLworICB9CisgIHJldHVybiAobnVtKTsKK30KKworLyoKKyAqIFJldHVybiBuZXR3b3JrIHN0YXRpc3RpY3MKKyAqLworc3RhdGljIGludCBwY2FwX3N0YXRzX2RvcyAocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykKK3sKKyAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzOworICBzdHJ1Y3QgZGV2aWNlICAgICAgICAgICAqZGV2ID0gcCA/IGdldF9kZXZpY2UocC0+ZmQpIDogTlVMTDsKKworICBpZiAoIWRldikKKyAgeworICAgIHN0cmNweSAocC0+ZXJyYnVmLCAiaWxsZWdhbCBwY2FwIGhhbmRsZSIpOworICAgIHJldHVybiAoLTEpOworICB9CisKKyAgaWYgKCFkZXYtPmdldF9zdGF0cyB8fCAoc3RhdHMgPSAoKmRldi0+Z2V0X3N0YXRzKShkZXYpKSA9PSBOVUxMKQorICB7CisgICAgc3RyY3B5IChwLT5lcnJidWYsICJkZXZpY2Ugc3RhdGlzdGljcyBub3QgYXZhaWxhYmxlIik7CisgICAgcmV0dXJuICgtMSk7CisgIH0KKworICBGTFVTSEsoKTsKKworICBwLT5tZC5zdGF0LnBzX3JlY3YgICA9IHN0YXRzLT5yeF9wYWNrZXRzOworICBwLT5tZC5zdGF0LnBzX2Ryb3AgICs9IHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzOworICBwLT5tZC5zdGF0LnBzX2lmZHJvcCA9IHN0YXRzLT5yeF9kcm9wcGVkICsgIC8qIHF1ZXVlIGZ1bGwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy0+cnhfZXJyb3JzOyAgICAvKiBIVyBlcnJvcnMgKi8KKyAgaWYgKHBzKQorICAgICAqcHMgPSBwLT5tZC5zdGF0OworCisgIHJldHVybiAoMCk7Cit9CisKKy8qCisgKiBSZXR1cm4gZGV0YWlsZWQgbmV0d29yay9kZXZpY2Ugc3RhdGlzdGljcy4KKyAqIE1heSBiZSBjYWxsZWQgYWZ0ZXIgJ2Rldi0+Y2xvc2UnIGlzIGNhbGxlZC4KKyAqLworaW50IHBjYXBfc3RhdHNfZXggKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdF9leCAqc2UpCit7CisgIHN0cnVjdCBkZXZpY2UgKmRldiA9IHAgPyBnZXRfZGV2aWNlIChwLT5mZCkgOiBOVUxMOworCisgIGlmICghZGV2IHx8ICFkZXYtPmdldF9zdGF0cykKKyAgeworICAgIHN0cmxjcHkgKHAtPmVycmJ1ZiwgImRldGFpbGVkIGRldmljZSBzdGF0aXN0aWNzIG5vdCBhdmFpbGFibGUiLAorICAgICAgICAgICAgIFBDQVBfRVJSQlVGX1NJWkUpOworICAgIHJldHVybiAoLTEpOworICB9CisKKyAgaWYgKCFzdHJuaWNtcChkZXYtPm5hbWUsInBrdCIsMykpCisgIHsKKyAgICBzdHJsY3B5IChwLT5lcnJidWYsICJwa3RkcnZyIGRvZXNuJ3QgaGF2ZSBkZXRhaWxlZCBzdGF0aXN0aWNzIiwKKyAgICAgICAgICAgICBQQ0FQX0VSUkJVRl9TSVpFKTsKKyAgICByZXR1cm4gKC0xKTsKKyAgfSAgICAgICAgICAgICAKKyAgbWVtY3B5IChzZSwgKCpkZXYtPmdldF9zdGF0cykoZGV2KSwgc2l6ZW9mKCpzZSkpOworICByZXR1cm4gKDApOworfQorCisvKgorICogU2ltcGx5IHN0b3JlIHRoZSBmaWx0ZXItY29kZSBmb3IgdGhlIHBjYXBfcmVhZF9kb3MoKSBjYWxsYmFjaworICogU29tZSBkYXkgdGhlIGZpbHRlci1jb2RlIGNvdWxkIGJlIGhhbmRlZCBkb3duIHRvIHRoZSBhY3RpdmUKKyAqIGRldmljZSAocGt0X3J4MS5zIG9yIDMyLWJpdCBkZXZpY2UgaW50ZXJydXB0IGhhbmRsZXIpLgorICovCitzdGF0aWMgaW50IHBjYXBfc2V0ZmlsdGVyX2RvcyAocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQoreworICBpZiAoIXApCisgICAgIHJldHVybiAoLTEpOworICBwLT5mY29kZSA9ICpmcDsKKyAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFJldHVybiAjIG9mIHBhY2tldHMgcmVjZWl2ZWQgaW4gcGNhcF9yZWFkX2RvcygpCisgKi8KK3VfbG9uZyBwY2FwX21hY19wYWNrZXRzICh2b2lkKQoreworICByZXR1cm4gKG1hY19jb3VudCk7Cit9CisKKy8qCisgKiBSZXR1cm4gIyBvZiBwYWNrZXRzIHBhc3NlZCB0aHJvdWdoIGZpbHRlciBpbiBwY2FwX3JlYWRfZG9zKCkKKyAqLwordV9sb25nIHBjYXBfZmlsdGVyX3BhY2tldHMgKHZvaWQpCit7CisgIHJldHVybiAoZmlsdGVyX2NvdW50KTsKK30KKworLyoKKyAqIENsb3NlIHBjYXAgZGV2aWNlLiBOb3QgY2FsbGVkIGZvciBvZmZsaW5lIGNhcHR1cmVzLgorICovCitzdGF0aWMgdm9pZCBwY2FwX2NsZWFudXBfZG9zIChwY2FwX3QgKnApCit7CisgIGlmIChwICYmICFleGNfb2NjdXJlZCkKKyAgeworICAgIGlmIChwY2FwX3N0YXRzKHAsTlVMTCkgPCAwKQorICAgICAgIHAtPm1kLnN0YXQucHNfZHJvcCA9IDA7CisgICAgaWYgKCFnZXRfZGV2aWNlKHAtPmZkKSkKKyAgICAgICByZXR1cm47CisKKyAgICBoYW5kbGVfdG9fZGV2aWNlIFtwLT5mZC0xXSA9IE5VTEw7CisgICAgcC0+ZmQgPSAwOworICAgIGlmIChyZWZfY291bnQgPiAwKQorICAgICAgICByZWZfY291bnQtLTsKKyAgICBpZiAocmVmX2NvdW50ID4gMCkKKyAgICAgICByZXR1cm47CisgIH0KKyAgY2xvc2VfZHJpdmVyKCk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIDFzdCBuZXR3b3JrIGludGVyZmFjZSwKKyAqIG9yIE5VTEwgaWYgbm9uZSBjYW4gYmUgZm91bmQuCisgKi8KK2NoYXIgKnBjYXBfbG9va3VwZGV2IChjaGFyICplYnVmKQoreworICBzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKyNpZmRlZiBVU0VfMzJCSVRfRFJJVkVSUworICBpbml0XzMyYml0KCk7CisjZW5kaWYKKworICBmb3IgKGRldiA9IChzdHJ1Y3QgZGV2aWNlKilkZXZfYmFzZTsgZGV2OyBkZXYgPSBkZXYtPm5leHQpCisgIHsKKyAgICBQQ0FQX0FTU0VSVCAoZGV2LT5wcm9iZSk7CisKKyAgICBpZiAoKCpkZXYtPnByb2JlKShkZXYpKQorICAgIHsKKyAgICAgIEZMVVNISygpOworICAgICAgcHJvYmVkX2RldiA9IChzdHJ1Y3QgZGV2aWNlKikgZGV2OyAvKiByZW1lbWJlciBsYXN0IHByb2JlZCBkZXZpY2UgKi8KKyAgICAgIHJldHVybiAoY2hhciopIGRldi0+bmFtZTsKKyAgICB9CisgIH0KKworICBpZiAoZWJ1ZikKKyAgICAgc3RyY3B5IChlYnVmLCAiTm8gZHJpdmVyIGZvdW5kIik7CisgIHJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKiBHZXRzIGxvY2FsbmV0ICYgbmV0bWFzayBmcm9tIFdhdHQtMzIuCisgKi8KK2ludCBwY2FwX2xvb2t1cG5ldCAoY29uc3QgY2hhciAqZGV2aWNlLCBicGZfdV9pbnQzMiAqbG9jYWxuZXQsCisgICAgICAgICAgICAgICAgICAgIGJwZl91X2ludDMyICpuZXRtYXNrLCBjaGFyICplcnJidWYpCit7CisgIGlmICghX3dhdHRfaXNfaW5pdCkKKyAgeworICAgIHN0cmNweSAoZXJyYnVmLCAicGNhcF9vcGVuX29mZmxpbmUoKSBvciBwY2FwX2FjdGl2YXRlKCkgbXVzdCBiZSAiCisgICAgICAgICAgICAgICAgICAgICJjYWxsZWQgZmlyc3QiKTsKKyAgICByZXR1cm4gKC0xKTsKKyAgfQorCisgICpuZXRtYXNrICA9IF93MzJfc2luX21hc2s7CisgICpsb2NhbG5ldCA9IG15X2lwX2FkZHIgJiAqbmV0bWFzazsKKyAgaWYgKCpsb2NhbG5ldCA9PSAwKQorICB7CisgICAgaWYgKElOX0NMQVNTQSgqbmV0bWFzaykpCisgICAgICAgKmxvY2FsbmV0ID0gSU5fQ0xBU1NBX05FVDsKKyAgICBlbHNlIGlmIChJTl9DTEFTU0IoKm5ldG1hc2spKQorICAgICAgICpsb2NhbG5ldCA9IElOX0NMQVNTQl9ORVQ7CisgICAgZWxzZSBpZiAoSU5fQ0xBU1NDKCpuZXRtYXNrKSkKKyAgICAgICAqbG9jYWxuZXQgPSBJTl9DTEFTU0NfTkVUOworICAgIGVsc2UKKyAgICB7CisgICAgICBzcHJpbnRmIChlcnJidWYsICJpbmV0IGNsYXNzIGZvciAweCVseCB1bmtub3duIiwgKm5ldG1hc2spOworICAgICAgcmV0dXJuICgtMSk7CisgICAgfQorICB9CisgIEFSR1NVU0VEIChkZXZpY2UpOworICByZXR1cm4gKDApOworfSAgICAgIAorCisvKgorICogR2V0IGEgbGlzdCBvZiBhbGwgaW50ZXJmYWNlcyB0aGF0IGFyZSBwcmVzZW50IGFuZCB0aGF0IHdlIHByb2JlIG9rYXkuCisgKiBSZXR1cm5zIC0xIG9uIGVycm9yLCAwIG90aGVyd2lzZS4KKyAqIFRoZSBsaXN0LCBhcyByZXR1cm5lZCB0aHJvdWdoICJhbGxkZXZzcCIsIG1heSBiZSBudWxsIGlmIG5vIGludGVyZmFjZXMKKyAqIHdlcmUgdXAgYW5kIGNvdWxkIGJlIG9wZW5lZC4KKyAqLworaW50IHBjYXBfZmluZGFsbGRldnMgKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisgIHN0cnVjdCBkZXZpY2UgICAgICpkZXY7CisgIHN0cnVjdCBzb2NrYWRkcl9sbCBzYV9sbF8xLCBzYV9sbF8yOworICBzdHJ1Y3Qgc29ja2FkZHIgICAqYWRkciwgKm5ldG1hc2ssICpicm9hZGFkZHIsICpkc3RhZGRyOworICBwY2FwX2lmX3QgKmRldmxpc3QgPSBOVUxMOworICBpbnQgICAgICAgcmV0ID0gMDsKKyAgc2l6ZV90ICAgIGFkZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpOworCisgIGZvciAoZGV2ID0gKHN0cnVjdCBkZXZpY2UqKWRldl9iYXNlOyBkZXY7IGRldiA9IGRldi0+bmV4dCkKKyAgeworICAgIFBDQVBfQVNTRVJUIChkZXYtPnByb2JlKTsKKworICAgIGlmICghKCpkZXYtPnByb2JlKShkZXYpKQorICAgICAgIGNvbnRpbnVlOworCisgICAgUENBUF9BU1NFUlQgKGRldi0+Y2xvc2UpOyAgLyogc2V0IGJ5IHByb2JlIHJvdXRpbmUgKi8KKyAgICBGTFVTSEsoKTsKKyAgICAoKmRldi0+Y2xvc2UpIChkZXYpOworCisgICAgbWVtc2V0ICgmc2FfbGxfMSwgMCwgc2l6ZW9mKHNhX2xsXzEpKTsKKyAgICBtZW1zZXQgKCZzYV9sbF8yLCAwLCBzaXplb2Yoc2FfbGxfMikpOworICAgIHNhX2xsXzEuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKyAgICBzYV9sbF8yLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisKKyAgICBhZGRyICAgICAgPSAoc3RydWN0IHNvY2thZGRyKikgJnNhX2xsXzE7CisgICAgbmV0bWFzayAgID0gKHN0cnVjdCBzb2NrYWRkciopICZzYV9sbF8xOworICAgIGRzdGFkZHIgICA9IChzdHJ1Y3Qgc29ja2FkZHIqKSAmc2FfbGxfMTsKKyAgICBicm9hZGFkZHIgPSAoc3RydWN0IHNvY2thZGRyKikgJnNhX2xsXzI7CisgICAgbWVtc2V0ICgmc2FfbGxfMi5zbGxfYWRkciwgMHhGRiwgc2l6ZW9mKHNhX2xsXzIuc2xsX2FkZHIpKTsKKworICAgIGlmIChwY2FwX2FkZF9pZigmZGV2bGlzdCwgZGV2LT5uYW1lLCBkZXYtPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICBkZXYtPmxvbmdfbmFtZSwgZXJyYnVmKSA8IDApCisgICAgeworICAgICAgcmV0ID0gLTE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGFkZF9hZGRyX3RvX2lmbGlzdCgmZGV2bGlzdCxkZXYtPm5hbWUsIGRldi0+ZmxhZ3MsIGFkZHIsIGFkZHJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldG1hc2ssIGFkZHJfc2l6ZSwgYnJvYWRhZGRyLCBhZGRyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RhZGRyLCBhZGRyX3NpemUsIGVycmJ1ZikgPCAwKQorICAgIHsKKyAgICAgIHJldCA9IC0xOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGRldmxpc3QgJiYgcmV0IDwgMCkKKyAgeworICAgIHBjYXBfZnJlZWFsbGRldnMgKGRldmxpc3QpOworICAgIGRldmxpc3QgPSBOVUxMOworICB9CisgIGVsc2UKKyAgaWYgKCFkZXZsaXN0KQorICAgICBzdHJjcHkgKGVycmJ1ZiwgIk5vIGRyaXZlcnMgZm91bmQiKTsKKworICAqYWxsZGV2c3AgPSBkZXZsaXN0OworICByZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiBwY2FwX2Fzc2VydCgpIGlzIG1haW5seSB1c2VkIGZvciBkZWJ1Z2dpbmcKKyAqLwordm9pZCBwY2FwX2Fzc2VydCAoY29uc3QgY2hhciAqd2hhdCwgY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbGluZSkKK3sKKyAgRkxVU0hLKCk7CisgIGZwcmludGYgKHN0ZGVyciwgIiVzICgldSk6IEFzc2VydGlvbiBcIiVzXCIgZmFpbGVkXG4iLAorICAgICAgICAgICBmaWxlLCBsaW5lLCB3aGF0KTsKKyAgY2xvc2VfZHJpdmVyKCk7CisgIF9leGl0ICgtMSk7Cit9CisKKy8qCisgKiBGb3IgcGNhcF9vZmZsaW5lX3JlYWQoKTogd2FpdCBhbmQgeWllbGQgYmV0d2VlbiBwcmludGluZyBwYWNrZXRzCisgKiB0byBzaW11bGF0ZSB0aGUgcGFjZSBwYWNrZXRzIHdoZXJlIGFjdHVhbGx5IHJlY29yZGVkLgorICovCit2b2lkIHBjYXBfc2V0X3dhaXQgKHBjYXBfdCAqcCwgdm9pZCAoKnlpZWxkKSh2b2lkKSwgaW50IHdhaXQpCit7CisgIGlmIChwKQorICB7CisgICAgcC0+d2FpdF9wcm9jICAgICAgICAgPSB5aWVsZDsKKyAgICBwLT5tZC50aW1lb3V0ICAgICAgICA9IHdhaXQ7CisgIH0KK30KKworLyoKKyAqIEluaXRpYWxpc2UgYSBuYW1lZCBuZXR3b3JrIGRldmljZS4KKyAqLworc3RhdGljIHN0cnVjdCBkZXZpY2UgKgorb3Blbl9kcml2ZXIgKGNvbnN0IGNoYXIgKmRldl9uYW1lLCBjaGFyICplYnVmLCBpbnQgcHJvbWlzYykKK3sKKyAgc3RydWN0IGRldmljZSAqZGV2OworCisgIGZvciAoZGV2ID0gKHN0cnVjdCBkZXZpY2UqKWRldl9iYXNlOyBkZXY7IGRldiA9IGRldi0+bmV4dCkKKyAgeworICAgIFBDQVBfQVNTRVJUIChkZXYtPm5hbWUpOworCisgICAgaWYgKHN0cmNtcCAoZGV2X25hbWUsZGV2LT5uYW1lKSkKKyAgICAgICBjb250aW51ZTsKKworICAgIGlmICghcHJvYmVkX2RldikgICAvKiB1c2VyIGRpZG4ndCBjYWxsIHBjYXBfbG9va3VwZGV2KCkgZmlyc3QgKi8KKyAgICB7CisgICAgICBQQ0FQX0FTU0VSVCAoZGV2LT5wcm9iZSk7CisKKyAgICAgIGlmICghKCpkZXYtPnByb2JlKShkZXYpKSAgICAvKiBjYWxsIHRoZSB4eF9wcm9iZSgpIGZ1bmN0aW9uICovCisgICAgICB7CisgICAgICAgIHNwcmludGYgKGVidWYsICJmYWlsZWQgdG8gZGV0ZWN0IGRldmljZSBgJXMnIiwgZGV2X25hbWUpOworICAgICAgICByZXR1cm4gKE5VTEwpOworICAgICAgfQorICAgICAgcHJvYmVkX2RldiA9IGRldjsgIC8qIGRldmljZSBpcyBwcm9iZWQgb2theSBhbmQgbWF5IGJlIHVzZWQgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoZGV2ICE9IHByb2JlZF9kZXYpCisgICAgeworICAgICAgZ290byBub3RfcHJvYmVkOworICAgIH0KKworICAgIEZMVVNISygpOworCisgICAgLyogU2VsZWN0IHdoYXQgdHJhZmZpYyB0byByZWNlaXZlCisgICAgICovCisgICAgaWYgKHByb21pc2MpCisgICAgICAgICBkZXYtPmZsYWdzIHw9ICAoSUZGX0FMTE1VTFRJIHwgSUZGX1BST01JU0MpOworICAgIGVsc2UgZGV2LT5mbGFncyAmPSB+KElGRl9BTExNVUxUSSB8IElGRl9QUk9NSVNDKTsKKworICAgIFBDQVBfQVNTRVJUIChkZXYtPm9wZW4pOworCisgICAgaWYgKCEoKmRldi0+b3BlbikoZGV2KSkKKyAgICB7CisgICAgICBzcHJpbnRmIChlYnVmLCAiZmFpbGVkIHRvIGFjdGl2YXRlIGRldmljZSBgJXMnIiwgZGV2X25hbWUpOworICAgICAgaWYgKHBrdEluZm8uZXJyb3IgJiYgIXN0cm5jbXAoZGV2LT5uYW1lLCJwa3QiLDMpKQorICAgICAgeworICAgICAgICBzdHJjYXQgKGVidWYsICI6ICIpOworICAgICAgICBzdHJjYXQgKGVidWYsIHBrdEluZm8uZXJyb3IpOworICAgICAgfQorICAgICAgcmV0dXJuIChOVUxMKTsKKyAgICB9CisKKyAgICAvKiBTb21lIGRldmljZXMgbmVlZCB0aGlzIHRvIG9wZXJhdGUgaW4gcHJvbWlzY291cyBtb2RlCisgICAgICovCisgICAgaWYgKHByb21pc2MgJiYgZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QpCisgICAgICAgKCpkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCkgKGRldik7CisKKyAgICBhY3RpdmVfZGV2ID0gZGV2OyAgIC8qIHJlbWVtYmVyIG91ciBhY3RpdmUgZGV2aWNlICovCisgICAgYnJlYWs7CisgIH0KKworICAvKiAnZGV2X25hbWUnIG5vdCBtYXRjaGVkIGluICdkZXZfYmFzZScgbGlzdC4KKyAgICovCisgIGlmICghZGV2KQorICB7CisgICAgc3ByaW50ZiAoZWJ1ZiwgImRldmljZSBgJXMnIG5vdCBzdXBwb3J0ZWQiLCBkZXZfbmFtZSk7CisgICAgcmV0dXJuIChOVUxMKTsKKyAgfQorCitub3RfcHJvYmVkOgorICBpZiAoIXByb2JlZF9kZXYpCisgIHsKKyAgICBzcHJpbnRmIChlYnVmLCAiZGV2aWNlIGAlcycgbm90IHByb2JlZCIsIGRldl9uYW1lKTsKKyAgICByZXR1cm4gKE5VTEwpOworICB9CisgIHJldHVybiAoZGV2KTsKK30KKworLyoKKyAqIERlaW5pdGlhbGlzZSBNQUMgZHJpdmVyLgorICogU2V0IHJlY2VpdmUgbW9kZSBiYWNrIHRvIGRlZmF1bHQgbW9kZS4KKyAqLworc3RhdGljIHZvaWQgY2xvc2VfZHJpdmVyICh2b2lkKQoreworICAvKiAhIXRvZG86IGxvb3Agb3ZlciBhbGwgJ2hhbmRsZV90b19kZXZpY2VbXScgPyAqLworICBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBhY3RpdmVfZGV2OworCisgIGlmIChkZXYgJiYgZGV2LT5jbG9zZSkKKyAgeworICAgICgqZGV2LT5jbG9zZSkgKGRldik7CisgICAgRkxVU0hLKCk7CisgIH0KKworICBhY3RpdmVfZGV2ID0gTlVMTDsKKworI2lmZGVmIFVTRV8zMkJJVF9EUklWRVJTCisgIGlmIChyeF9wb29sKQorICB7CisgICAga19mcmVlIChyeF9wb29sKTsKKyAgICByeF9wb29sID0gTlVMTDsKKyAgfQorICBpZiAoZGV2KQorICAgICBwY2liaW9zX2V4aXQoKTsKKyNlbmRpZgorfQorCisKKyNpZmRlZiBfX0RKR1BQX18KK3N0YXRpYyB2b2lkIHNldHVwX3NpZ25hbHMgKHZvaWQgKCpoYW5kbGVyKShpbnQpKQoreworICBzaWduYWwgKFNJR1NFR1YsaGFuZGxlcik7CisgIHNpZ25hbCAoU0lHSUxMLCBoYW5kbGVyKTsKKyAgc2lnbmFsIChTSUdGUEUsIGhhbmRsZXIpOworfQorCitzdGF0aWMgdm9pZCBleGNfaGFuZGxlciAoaW50IHNpZykKK3sKKyNpZmRlZiBVU0VfMzJCSVRfRFJJVkVSUworICBpZiAoYWN0aXZlX2Rldi0+aXJxID4gMCkgICAgLyogZXhjbHVkZXMgSVJRIDAgKi8KKyAgeworICAgIGRpc2FibGVfaXJxIChhY3RpdmVfZGV2LT5pcnEpOworICAgIGlycV9lb2lfY21kIChhY3RpdmVfZGV2LT5pcnEpOworICAgIF9wcmludGtfc2FmZSA9IDE7CisgIH0KKyNlbmRpZgorCisgIHN3aXRjaCAoc2lnKQorICB7CisgICAgY2FzZSBTSUdTRUdWOgorICAgICAgICAgZnB1dHMgKCJDYXRjaGluZyBTSUdTRUdWLlxuIiwgc3RkZXJyKTsKKyAgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0lHSUxMOgorICAgICAgICAgZnB1dHMgKCJDYXRjaGluZyBTSUdJTEwuXG4iLCBzdGRlcnIpOworICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSUdGUEU6CisgICAgICAgICBfZnByZXNldCgpOworICAgICAgICAgZnB1dHMgKCJDYXRjaGluZyBTSUdGUEUuXG4iLCBzdGRlcnIpOworICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgIGZwcmludGYgKHN0ZGVyciwgIkNhdGNoaW5nIHNpZ25hbCAlZC5cbiIsIHNpZyk7CisgIH0KKyAgZXhjX29jY3VyZWQgPSAxOworICBwY2FwX2NsZWFudXBfZG9zIChOVUxMKTsKK30KKyNlbmRpZiAgLyogX19ESkdQUF9fICovCisKKworLyoKKyAqIE9wZW4gdGhlIHBjYXAgZGV2aWNlIGZvciB0aGUgZmlyc3QgY2xpZW50IGNhbGxpbmcgcGNhcF9hY3RpdmF0ZSgpCisgKi8KK3N0YXRpYyBpbnQgZmlyc3RfaW5pdCAoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZWJ1ZiwgaW50IHByb21pc2MpCit7CisgIHN0cnVjdCBkZXZpY2UgKmRldjsKKworI2lmZGVmIFVTRV8zMkJJVF9EUklWRVJTCisgIHJ4X3Bvb2wgPSBrX2NhbGxvYyAoUkVDRUlWRV9CVUZfU0laRSwgUkVDRUlWRV9RVUVVRV9TSVpFKTsKKyAgaWYgKCFyeF9wb29sKQorICB7CisgICAgc3RyY3B5IChlYnVmLCAiTm90IGVub3VnaCBtZW1vcnkgKFJ4IHBvb2wpIik7CisgICAgcmV0dXJuICgwKTsKKyAgfQorI2VuZGlmCisKKyNpZmRlZiBfX0RKR1BQX18KKyAgc2V0dXBfc2lnbmFscyAoZXhjX2hhbmRsZXIpOworI2VuZGlmCisKKyNpZmRlZiBVU0VfMzJCSVRfRFJJVkVSUworICBpbml0XzMyYml0KCk7CisjZW5kaWYKKworICBkZXYgPSBvcGVuX2RyaXZlciAobmFtZSwgZWJ1ZiwgcHJvbWlzYyk7CisgIGlmICghZGV2KQorICB7CisjaWZkZWYgVVNFXzMyQklUX0RSSVZFUlMKKyAgICBrX2ZyZWUgKHJ4X3Bvb2wpOworICAgIHJ4X3Bvb2wgPSBOVUxMOworI2VuZGlmCisKKyNpZmRlZiBfX0RKR1BQX18KKyAgICBzZXR1cF9zaWduYWxzIChTSUdfREZMKTsKKyNlbmRpZgorICAgIHJldHVybiAoMCk7CisgIH0KKworI2lmZGVmIFVTRV8zMkJJVF9EUklWRVJTCisgIC8qCisgICAqIElmIGRyaXZlciBpcyBOT1QgYSAxNi1iaXQgInBrdC9uZGlzIiBkcml2ZXIgKGhhdmluZyBhICdjb3B5X3J4X2J1ZicKKyAgICogc2V0IGluIGl0J3MgcHJvYmUgaGFuZGxlciksIGluaXRpYWxpc2UgbmVhci1tZW1vcnkgcmluZy1idWZmZXIgZm9yCisgICAqIHRoZSAzMi1iaXQgZGV2aWNlLgorICAgKi8KKyAgaWYgKGRldi0+Y29weV9yeF9idWYgPT0gTlVMTCkKKyAgeworICAgIGRldi0+Z2V0X3J4X2J1ZiAgICAgPSBnZXRfcnhidWY7CisgICAgZGV2LT5wZWVrX3J4X2J1ZiAgICA9IHBlZWtfcnhidWY7CisgICAgZGV2LT5yZWxlYXNlX3J4X2J1ZiA9IHJlbGVhc2VfcnhidWY7CisgICAgcGt0cV9pbml0ICgmZGV2LT5xdWV1ZSwgUkVDRUlWRV9CVUZfU0laRSwgUkVDRUlWRV9RVUVVRV9TSVpFLCByeF9wb29sKTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAoMSk7Cit9CisKKyNpZmRlZiBVU0VfMzJCSVRfRFJJVkVSUworc3RhdGljIHZvaWQgaW5pdF8zMmJpdCAodm9pZCkKK3sKKyAgc3RhdGljIGludCBpbml0X3BjaSA9IDA7CisKKyAgaWYgKCFfcHJpbnRrX2ZpbGUpCisgICAgIF9wcmludGtfaW5pdCAoNjQqMTAyNCwgTlVMTCk7IC8qIGNhbGxzIGF0ZXhpdChwcmludGtfZXhpdCkgKi8KKworICBpZiAoIWluaXRfcGNpKQorICAgICAodm9pZClwY2lfaW5pdCgpOyAgICAgICAgICAgICAvKiBpbml0IEJJT1MzMitQQ0kgaW50ZXJmYWNlICovCisgIGluaXRfcGNpID0gMTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBIb29rIGZ1bmN0aW9ucyBmb3IgdXNpbmcgV2F0dC0zMiB0b2dldGhlciB3aXRoIHBjYXAKKyAqLworc3RhdGljIGNoYXIgcnhidWYgW0VUSF9NQVgrMTAwXTsgLyogcngtYnVmZmVyIHdpdGggc29tZSBtYXJnaW4gKi8KK3N0YXRpYyBXT1JEIGV0eXBlOworc3RhdGljIHBjYXBfdCBwY2FwX3NhdmU7CisKK3N0YXRpYyB2b2lkIHdhdHQzMl9yZWN2X2hvb2sgKHVfY2hhciAqZHVtbXksIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqcGNhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqYnVmKQoreworICAvKiBGaXggbWU6IGFzc3VtZXMgRXRoZXJuZXQgSUkgb25seSAqLworICBzdHJ1Y3QgZXRoZXJfaGVhZGVyICplcCA9IChzdHJ1Y3QgZXRoZXJfaGVhZGVyKikgYnVmOworCisgIG1lbWNweSAocnhidWYsIGJ1ZiwgcGNhcC0+Y2FwbGVuKTsKKyAgZXR5cGUgPSBlcC0+ZXRoZXJfdHlwZTsKKyAgQVJHU1VTRUQgKGR1bW15KTsKK30KKworI2lmIChXQVRUQ1BfVkVSID49IDB4MDIyNCkKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgV2F0dC0zMiB0byBwb2xsIGZvciBhIHBhY2tldC4KKyAqIGkuZS4gaXQncyBzZXQgdG8gYnlwYXNzIF9ldGhfYXJyaXZlZCgpCisgKi8KK3N0YXRpYyB2b2lkICpwY2FwX3JlY3ZfaG9vayAoV09SRCAqdHlwZSkKK3sKKyAgaW50IGxlbiA9IHBjYXBfcmVhZF9kb3MgKCZwY2FwX3NhdmUsIDEsIHdhdHQzMl9yZWN2X2hvb2ssIE5VTEwpOworCisgIGlmIChsZW4gPCAwKQorICAgICByZXR1cm4gKE5VTEwpOworCisgICp0eXBlID0gZXR5cGU7CisgIHJldHVybiAodm9pZCopICZyeGJ1ZjsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IFdhdHQtMzIgKHZpYSBfZXRoX3htaXRfaG9vaykuCisgKiBJZiBkYnVnX2luaXQoKSB3YXMgY2FsbGVkLCB3ZSBzaG91bGQgdHJhY2UgcGFja2V0cyBzZW50LgorICovCitzdGF0aWMgaW50IHBjYXBfeG1pdF9ob29rIChjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbikKK3sKKyAgaW50IHJjID0gMDsKKworICBpZiAocGNhcF9wa3RfZGVidWcgPiAwKQorICAgICBkYnVnX3dyaXRlICgicGNhcF94bWl0X2hvb2s6ICIpOworCisgIGlmIChhY3RpdmVfZGV2ICYmIGFjdGl2ZV9kZXYtPnhtaXQpCisgICAgIGlmICgoKmFjdGl2ZV9kZXYtPnhtaXQpIChhY3RpdmVfZGV2LCBidWYsIGxlbikgPiAwKQorICAgICAgICByYyA9IGxlbjsKKworICBpZiAocGNhcF9wa3RfZGVidWcgPiAwKQorICAgICBkYnVnX3dyaXRlIChyYyA/ICJva1xuIiA6ICJmYWlsXG4iKTsKKyAgcmV0dXJuIChyYyk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBwY2FwX3NlbmRwYWNrZXRfZG9zIChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKyAgc3RydWN0IGRldmljZSAqZGV2ID0gcCA/IGdldF9kZXZpY2UocC0+ZmQpIDogTlVMTDsKKworICBpZiAoIWRldiB8fCAhZGV2LT54bWl0KQorICAgICByZXR1cm4gKC0xKTsKKyAgcmV0dXJuICgqZGV2LT54bWl0KSAoZGV2LCBidWYsIGxlbik7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBXYXR0LTMyIGluIHRjcF9wb3N0X2luaXQoKS4KKyAqIFdlIHNob3VsZCBwcmV2ZW50IFdhdHQtMzIgZnJvbSB1c2luZyBCT09UUC9ESENQL1JBUlAgZXRjLgorICovCitzdGF0aWMgdm9pZCAoKnByZXZfcG9zdF9ob29rKSAodm9pZCk7CisKK3N0YXRpYyB2b2lkIHBjYXBfaW5pdF9ob29rICh2b2lkKQoreworICBfdzMyX19ib290cF9vbiA9IF93MzJfX2RoY3Bfb24gPSBfdzMyX19yYXJwX29uID0gMDsKKyAgX3czMl9fZG9fbWFza19yZXEgPSAwOworICBfdzMyX2R5bmFtaWNfaG9zdCA9IDA7CisgIGlmIChwcmV2X3Bvc3RfaG9vaykKKyAgICAoKnByZXZfcG9zdF9ob29rKSgpOworfQorCisvKgorICogU3VwcmVzcyBQUklOVCBtZXNzYWdlIGZyb20gV2F0dC0zMidzIHNvY2tfaW5pdCgpCisgKi8KK3N0YXRpYyB2b2lkIG51bGxfcHJpbnQgKHZvaWQpIHt9CisKKy8qCisgKiBUbyB1c2UgZmVhdHVyZXMgb2YgV2F0dC0zMiAobmV0ZGIgZnVuY3Rpb25zIGFuZCBzb2NrZXQgZXRjLikKKyAqIHdlIG11c3QgY2FsbCBzb2NrX2luaXQoKS4gQnV0IHdlIHNldCB2YXJpb3VzIGhvb2tzIHRvIHByZXZlbnQKKyAqIHVzaW5nIG5vcm1hbCBQS1REUlZSIGZ1bmN0aW9ucyBpbiBwY3BrdC5jLiBUaGlzIHNob3VsZCBob3BlZnVsbHkKKyAqIG1ha2UgV2F0dC0zMiBhbmQgcGNhcCBjby1vcGVyYXRlLgorICovCitzdGF0aWMgaW50IGluaXRfd2F0dDMyIChzdHJ1Y3QgcGNhcCAqcGNhcCwgY29uc3QgY2hhciAqZGV2X25hbWUsIGNoYXIgKmVycl9idWYpCit7CisgIGNoYXIgKmVudjsKKyAgaW50ICAgcmMsIE1UVSwgaGFzX2lwX2FkZHI7CisgIGludCAgIHVzaW5nX3BrdGRydiA9IDE7CisKKyAgLyogSWYgdXNlciBjYWxsZWQgc29ja19pbml0KCkgZmlyc3QsIHdlIG5lZWQgdG8gcmVpbml0IGluCisgICAqIG9yZGVyIHRvIG9wZW4gZGVidWcvdHJhY2UtZmlsZSBwcm9wZXJseQorICAgKi8KKyAgaWYgKF93YXR0X2lzX2luaXQpCisgICAgIHNvY2tfZXhpdCgpOworCisgIGVudiA9IGdldGVudiAoIlBDQVBfREVCVUciKTsKKyAgaWYgKGVudiAmJiBhdG9pKGVudikgPiAwICYmCisgICAgICBwY2FwX3BrdF9kZWJ1ZyA8IDApICAgLyogaWYgbm90IGFscmVhZHkgc2V0ICovCisgIHsKKyAgICBkYnVnX2luaXQoKTsKKyAgICBwY2FwX3BrdF9kZWJ1ZyA9IGF0b2kgKGVudik7CisgIH0KKworICBfd2F0dF9kb19leGl0ICAgICAgPSAwOyAgICAvKiBwcmV2ZW50IHNvY2tfaW5pdCgpIGNhbGxpbmcgZXhpdCgpICovCisgIHByZXZfcG9zdF9ob29rICAgICA9IF93MzJfdXNyX3Bvc3RfaW5pdDsKKyAgX3czMl91c3JfcG9zdF9pbml0ID0gcGNhcF9pbml0X2hvb2s7CisgIF93MzJfcHJpbnRfaG9vayAgICA9IG51bGxfcHJpbnQ7CisKKyAgaWYgKGRldl9uYW1lICYmIHN0cm5jbXAoZGV2X25hbWUsInBrdCIsMykpCisgICAgIHVzaW5nX3BrdGRydiA9IEZBTFNFOworCisgIHJjID0gc29ja19pbml0KCk7CisgIGhhc19pcF9hZGRyID0gKHJjICE9IDgpOyAgLyogSVAtYWRkcmVzcyBhc3NpZ25tZW50IGZhaWxlZCAqLworCisgIC8qIGlmIHBjYXAgaXMgdXNpbmcgYSAzMi1iaXQgZHJpdmVyIHcvbyBhIHBrdGRydnIgbG9hZGVkLCB3ZQorICAgKiBqdXN0IHByZXRlbmQgV2F0dC0zMiBpcyBpbml0aWFsaXNlZCBva2F5LgorICAgKgorICAgKiAhISBmaXgtbWU6IFRoZSBXYXR0LTMyIGNvbmZpZyBpc24ndCBkb25lIGlmIG5vIHBrdGRydnIKKyAgICogICAgICAgICAgICB3YXMgZm91bmQuIEluIHRoYXQgY2FzZSBteV9pcF9hZGRyICsgc2luX21hc2sKKyAgICogICAgICAgICAgICBoYXZlIGRlZmF1bHQgdmFsdWVzLiBTaG91bGQgYmUgdGFrZW4gZnJvbSBhbm90aGVyCisgICAqICAgICAgICAgICAgaW5pLWZpbGUvZW52aXJvbm1lbnQgaW4gYW55IGNhc2UgKHJlZi4gdGNwZHVtcC5pbmkpCisgICAqLworICBfd2F0dF9pc19pbml0ID0gMTsgIAorCisgIGlmICghdXNpbmdfcGt0ZHJ2IHx8ICFoYXNfaXBfYWRkcikgIC8qIGZvciBub3cgLi4uLiAqLworICB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgbXlpcFtdID0gIjE5Mi4xNjguMC4xIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtYXNrW10gPSAiMjU1LjI1NS4yNTUuMCI7CisKKyAgICBwcmludGYgKCJKdXN0IGd1ZXNzaW5nLCB1c2luZyBJUCAlcyBhbmQgbmV0bWFzayAlc1xuIiwgbXlpcCwgbWFzayk7CisgICAgbXlfaXBfYWRkciAgICA9IGF0b24gKG15aXApOworICAgIF93MzJfc2luX21hc2sgPSBhdG9uIChtYXNrKTsKKyAgfQorICBlbHNlIGlmIChyYyAmJiB1c2luZ19wa3RkcnYpCisgIHsKKyAgICBzcHJpbnRmIChlcnJfYnVmLCAic29ja19pbml0KCkgZmFpbGVkLCBjb2RlICVkIiwgcmMpOworICAgIHJldHVybiAoMCk7CisgIH0KKworICAvKiBTZXQgcmVjdi1ob29rIGZvciBwZWVraW5nIGluIF9ldGhfYXJyaXZlZCgpLgorICAgKi8KKyNpZiAoV0FUVENQX1ZFUiA+PSAweDAyMjQpCisgIF9ldGhfcmVjdl9ob29rID0gcGNhcF9yZWN2X2hvb2s7CisgIF9ldGhfeG1pdF9ob29rID0gcGNhcF94bWl0X2hvb2s7CisjZW5kaWYKKworICAvKiBGcmVlIHRoZSBwa3QtZHJ2ciBoYW5kbGUgYWxsb2NhdGVkIGluIHBrdF9pbml0KCkuCisgICAqIFRoZSBhYm92ZSBob29rcyBzaG91bGQgdGh1cyB1c2UgdGhlIGhhbmRsZSByZW9wZW5lZCBpbiBvcGVuX2RyaXZlcigpCisgICAqLworICBpZiAodXNpbmdfcGt0ZHJ2KQorICB7CisgICAgX2V0aF9yZWxlYXNlKCk7CisvKiAgX2V0aF9pc19pbml0ID0gMTsgKi8gIC8qIGhhY2sgdG8gZ2V0IFJ4L1R4LWhvb2tzIGluIFdhdHQtMzIgd29ya2luZyAqLworICB9CisKKyAgbWVtY3B5ICgmcGNhcF9zYXZlLCBwY2FwLCBzaXplb2YocGNhcF9zYXZlKSk7CisgIE1UVSA9IHBrdF9nZXRfbXR1KCk7CisgIHBjYXBfc2F2ZS5mY29kZS5iZl9pbnNucyA9IE5VTEw7CisgIHBjYXBfc2F2ZS5saW5rdHlwZSAgICAgICA9IF9ldGhfZ2V0X2h3dHlwZSAoTlVMTCwgTlVMTCk7CisgIHBjYXBfc2F2ZS5zbmFwc2hvdCAgICAgICA9IE1UVSA+IDAgPyBNVFUgOiBFVEhfTUFYOyAvKiBhc3N1bWUgMTUxNCAqLworCisjaWYgMQorICAvKiBwcmV2ZW50IHVzZSBvZiByZXNvbHZlKCkgYW5kIHJlc29sdmVfaXAoKQorICAgKi8KKyAgbGFzdF9uYW1lc2VydmVyID0gMDsKKyNlbmRpZgorICByZXR1cm4gKDEpOworfQorCitpbnQgRUlTQV9idXMgPSAwOyAgLyogV2hlcmUgaXMgbmF0dXJhbCBwbGFjZSBmb3IgdGhpcz8gKi8KKworLyoKKyAqIEFwcGxpY2F0aW9uIGNvbmZpZyBob29rcyB0byBzZXQgdmFyaW91cyBkcml2ZXIgcGFyYW1ldGVycy4KKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbmZpZ190YWJsZSBkZWJ1Z190YWJbXSA9IHsKKyAgICAgICAgICAgIHsgIlBLVC5ERUJVRyIsICAgICAgIEFSR19BVE9JLCAgICZwY2FwX3BrdF9kZWJ1ZyAgICB9LAorICAgICAgICAgICAgeyAiUEtULlZFQ1RPUiIsICAgICAgQVJHX0FUT1hfVywgTlVMTCAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7ICJORElTLkRFQlVHIiwgICAgICBBUkdfQVRPSSwgICBOVUxMICAgICAgICAgICAgICAgfSwKKyNpZmRlZiBVU0VfMzJCSVRfRFJJVkVSUworICAgICAgICAgICAgeyAiM0M1MDMuREVCVUciLCAgICAgQVJHX0FUT0ksICAgJmVpX2RlYnVnICAgICAgICAgIH0sCisgICAgICAgICAgICB7ICIzQzUwMy5JT19CQVNFIiwgICBBUkdfQVRPWF9XLCAmZWwyX2Rldi5iYXNlX2FkZHIgfSwKKyAgICAgICAgICAgIHsgIjNDNTAzLk1FTU9SWSIsICAgIEFSR19BVE9YX1csICZlbDJfZGV2Lm1lbV9zdGFydCB9LAorICAgICAgICAgICAgeyAiM0M1MDMuSVJRIiwgICAgICAgQVJHX0FUT0ksICAgJmVsMl9kZXYuaXJxICAgICAgIH0sCisgICAgICAgICAgICB7ICIzQzUwNS5ERUJVRyIsICAgICBBUkdfQVRPSSwgICBOVUxMICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsgIjNDNTA1LkJBU0UiLCAgICAgIEFSR19BVE9YX1csIE5VTEwgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgeyAiM0M1MDcuREVCVUciLCAgICAgQVJHX0FUT0ksICAgTlVMTCAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7ICIzQzUwOS5ERUJVRyIsICAgICBBUkdfQVRPSSwgICAmZWwzX2RlYnVnICAgICAgICAgfSwKKyAgICAgICAgICAgIHsgIjNDNTA5LklMT09QIiwgICAgIEFSR19BVE9JLCAgICZlbDNfbWF4X2xvb3AgICAgICB9LAorICAgICAgICAgICAgeyAiM0M1MjkuREVCVUciLCAgICAgQVJHX0FUT0ksICAgTlVMTCAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7ICIzQzU3NS5ERUJVRyIsICAgICBBUkdfQVRPSSwgICAmZGVidWdfM2M1NzUgICAgICAgfSwKKyAgICAgICAgICAgIHsgIjNDNTlYLkRFQlVHIiwgICAgIEFSR19BVE9JLCAgICZ2b3J0ZXhfZGVidWcgICAgICB9LAorICAgICAgICAgICAgeyAiM0M1OVguSUZBQ0UwIiwgICAgQVJHX0FUT0ksICAgJnZvcnRleF9vcHRpb25zWzBdIH0sCisgICAgICAgICAgICB7ICIzQzU5WC5JRkFDRTEiLCAgICBBUkdfQVRPSSwgICAmdm9ydGV4X29wdGlvbnNbMV0gfSwKKyAgICAgICAgICAgIHsgIjNDNTlYLklGQUNFMiIsICAgIEFSR19BVE9JLCAgICZ2b3J0ZXhfb3B0aW9uc1syXSB9LAorICAgICAgICAgICAgeyAiM0M1OVguSUZBQ0UzIiwgICAgQVJHX0FUT0ksICAgJnZvcnRleF9vcHRpb25zWzNdIH0sCisgICAgICAgICAgICB7ICIzQzkwWC5ERUJVRyIsICAgICBBUkdfQVRPWF9XLCAmdGM5MHhiY19kZWJ1ZyAgICAgfSwKKyAgICAgICAgICAgIHsgIkFDQ1QuREVCVUciLCAgICAgIEFSR19BVE9JLCAgICZldGhwa19kZWJ1ZyAgICAgICB9LAorICAgICAgICAgICAgeyAiQ1M4OS5ERUJVRyIsICAgICAgQVJHX0FUT0ksICAgJmNzODlfZGVidWcgICAgICAgIH0sCisgICAgICAgICAgICB7ICJSVEw4MTM5LkRFQlVHIiwgICBBUkdfQVRPSSwgICAmcnRsODEzOV9kZWJ1ZyAgICAgfSwKKyAgICAgICAgLyogIHsgIlJUTDgxMzkuRkRVUExFWCIsIEFSR19BVE9JLCAgICZydGw4MTM5X29wdGlvbnMgICB9LCAqLworICAgICAgICAgICAgeyAiU01DLkRFQlVHIiwgICAgICAgQVJHX0FUT0ksICAgJmVpX2RlYnVnICAgICAgICAgIH0sCisgICAgICAgIC8qICB7ICJFMTAwLkRFQlVHIiwgICAgICBBUkdfQVRPSSwgICAmZTEwMF9kZWJ1ZyAgICAgICAgfSwgKi8KKyAgICAgICAgICAgIHsgIlBDSS5ERUJVRyIsICAgICAgIEFSR19BVE9JLCAgICZwY2lfZGVidWcgICAgICAgICB9LAorICAgICAgICAgICAgeyAiQklPUzMyLkRFQlVHIiwgICAgQVJHX0FUT0ksICAgJmJpb3MzMl9kZWJ1ZyAgICAgIH0sCisgICAgICAgICAgICB7ICJJUlEuREVCVUciLCAgICAgICBBUkdfQVRPSSwgICAmaXJxX2RlYnVnICAgICAgICAgfSwKKyAgICAgICAgICAgIHsgIlRJTUVSLklSUSIsICAgICAgIEFSR19BVE9JLCAgICZ0aW1lcl9pcnEgICAgICAgICB9LAorI2VuZGlmCisgICAgICAgICAgICB7IE5VTEwgfQorICAgICAgICAgIH07CisKKy8qCisgKiBwY2FwX2NvbmZpZ19ob29rKCkgaXMgYW4gZXh0ZW5zaW9uIHRvIGFwcGxpY2F0aW9uJ3MgY29uZmlnCisgKiBoYW5kbGluZy4gVXNlcyBXYXR0LTMyJ3MgY29uZmlnLXRhYmxlIGZ1bmN0aW9uLgorICovCitpbnQgcGNhcF9jb25maWdfaG9vayAoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgIHJldHVybiBwYXJzZV9jb25maWdfdGFibGUgKGRlYnVnX3RhYiwgTlVMTCwgbmFtZSwgdmFsdWUpOworfQorCisvKgorICogTGlua2VkIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMKKyAqLworc3RydWN0IGRldmljZSAgICAgICAqYWN0aXZlX2RldiA9IE5VTEw7ICAgICAgLyogdGhlIGRldmljZSB3ZSBoYXZlIG9wZW5lZCAqLworc3RydWN0IGRldmljZSAgICAgICAqcHJvYmVkX2RldiA9IE5VTEw7ICAgICAgLyogdGhlIGRldmljZSB3ZSBoYXZlIHByb2JlZCAqLworY29uc3Qgc3RydWN0IGRldmljZSAqZGV2X2Jhc2UgICA9ICZwa3RfZGV2OyAgLyogbGlzdCBvZiBuZXR3b3JrIGRldmljZXMgKi8KKworLyoKKyAqIFBLVERSVlIgZGV2aWNlIGZ1bmN0aW9ucworICovCitpbnQgcGNhcF9wa3RfZGVidWcgPSAtMTsKKworc3RhdGljIHZvaWQgcGt0X2Nsb3NlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisgIEJPT0wgb2theSA9IFBrdEV4aXREcml2ZXIoKTsKKworICBpZiAocGNhcF9wa3RfZGVidWcgPiAxKQorICAgICBmcHJpbnRmIChzdGRlcnIsICJwa3RfY2xvc2UoKTogJWRcbiIsIG9rYXkpOworCisgIGlmIChkZXYtPnByaXYpCisgICAgIGZyZWUgKGRldi0+cHJpdik7CisgIGRldi0+cHJpdiA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGt0X29wZW4gKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyAgUEtUX1JYX01PREUgbW9kZTsKKworICBpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorICAgICAgIG1vZGUgPSBQRFJYX0FMTF9QQUNLRVRTOworICBlbHNlIG1vZGUgPSBQRFJYX0JST0FEQ0FTVDsKKworICBpZiAoIVBrdEluaXREcml2ZXIobW9kZSkpCisgICAgIHJldHVybiAoMCk7CisgCisgIFBrdFJlc2V0U3RhdGlzdGljcyAocGt0SW5mby5oYW5kbGUpOworICBQa3RRdWV1ZUJ1c3kgKEZBTFNFKTsKKyAgcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludCBwa3RfeG1pdCAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopIGRldi0+cHJpdjsKKworICBpZiAocGNhcF9wa3RfZGVidWcgPiAwKQorICAgICBkYnVnX3dyaXRlICgicGNhcF94bWl0XG4iKTsKKworICBpZiAoIVBrdFRyYW5zbWl0KGJ1ZixsZW4pKQorICB7CisgICAgc3RhdHMtPnR4X2Vycm9ycysrOworICAgIHJldHVybiAoMCk7CisgIH0KKyAgcmV0dXJuIChsZW4pOworfQorCitzdGF0aWMgdm9pZCAqcGt0X3N0YXRzIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9IChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyopIGRldi0+cHJpdjsKKworICBpZiAoIXN0YXRzIHx8ICFQa3RTZXNzU3RhdGlzdGljcyhwa3RJbmZvLmhhbmRsZSkpCisgICAgIHJldHVybiAoTlVMTCk7CisKKyAgc3RhdHMtPnJ4X3BhY2tldHMgICAgICAgPSBwa3RTdGF0LmluUGFja2V0czsKKyAgc3RhdHMtPnJ4X2Vycm9ycyAgICAgICAgPSBwa3RTdGF0Lmxvc3Q7CisgIHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzID0gUGt0UnhEcm9wcGVkKCk7CisgIHJldHVybiAoc3RhdHMpOworfQorCitzdGF0aWMgaW50IHBrdF9wcm9iZSAoc3RydWN0IGRldmljZSAqZGV2KQoreworICBpZiAoIVBrdFNlYXJjaERyaXZlcigpKQorICAgICByZXR1cm4gKDApOworCisgIGRldi0+b3BlbiAgICAgICAgICAgPSBwa3Rfb3BlbjsKKyAgZGV2LT54bWl0ICAgICAgICAgICA9IHBrdF94bWl0OworICBkZXYtPmNsb3NlICAgICAgICAgID0gcGt0X2Nsb3NlOworICBkZXYtPmdldF9zdGF0cyAgICAgID0gcGt0X3N0YXRzOworICBkZXYtPmNvcHlfcnhfYnVmICAgID0gUGt0UmVjZWl2ZTsgIC8qIGZhcm1lbSBwZWVrIGFuZCBjb3B5IHJvdXRpbmUgKi8KKyAgZGV2LT5nZXRfcnhfYnVmICAgICA9IE5VTEw7CisgIGRldi0+cGVla19yeF9idWYgICAgPSBOVUxMOworICBkZXYtPnJlbGVhc2VfcnhfYnVmID0gTlVMTDsKKyAgZGV2LT5wcml2ICAgICAgICAgICA9IGNhbGxvYyAoc2l6ZW9mKHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKSwgMSk7CisgIGlmICghZGV2LT5wcml2KQorICAgICByZXR1cm4gKDApOworICByZXR1cm4gKDEpOworfQorCisvKgorICogTkRJUyBkZXZpY2UgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyB2b2lkIG5kaXNfY2xvc2UgKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKyNpZmRlZiBVU0VfTkRJUzIKKyAgTmRpc1NodXRkb3duKCk7CisjZW5kaWYKKyAgQVJHU1VTRUQgKGRldik7Cit9CisKK3N0YXRpYyBpbnQgbmRpc19vcGVuIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisgIGludCBwcm9taXMgPSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKTsKKworI2lmZGVmIFVTRV9ORElTMgorICBpZiAoIU5kaXNJbml0KHByb21pcykpCisgICAgIHJldHVybiAoMCk7CisgIHJldHVybiAoMSk7CisjZWxzZQorICBBUkdTVVNFRCAocHJvbWlzKTsKKyAgcmV0dXJuICgwKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAqbmRpc19zdGF0cyAoc3RydWN0IGRldmljZSAqZGV2KQoreworICBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7CisKKyAgLyogdG8tZG8gKi8KKyAgQVJHU1VTRUQgKGRldik7CisgIHJldHVybiAoJnN0YXRzKTsKK30KKworc3RhdGljIGludCBuZGlzX3Byb2JlIChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisjaWZkZWYgVVNFX05ESVMyCisgIGlmICghTmRpc09wZW4oKSkKKyAgICAgcmV0dXJuICgwKTsKKyNlbmRpZgorCisgIGRldi0+b3BlbiAgICAgICAgICAgPSBuZGlzX29wZW47CisgIGRldi0+eG1pdCAgICAgICAgICAgPSBOVUxMOworICBkZXYtPmNsb3NlICAgICAgICAgID0gbmRpc19jbG9zZTsKKyAgZGV2LT5nZXRfc3RhdHMgICAgICA9IG5kaXNfc3RhdHM7CisgIGRldi0+Y29weV9yeF9idWYgICAgPSBOVUxMOyAgICAgICAvKiB0by1kbyAqLworICBkZXYtPmdldF9yeF9idWYgICAgID0gTlVMTDsgICAgICAgLyogdXBjYWxsIGlzIGZyb20gcm1vZGUgZHJpdmVyICovCisgIGRldi0+cGVla19yeF9idWYgICAgPSBOVUxMOworICBkZXYtPnJlbGVhc2VfcnhfYnVmID0gTlVMTDsKKyAgcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFNlYXJjaCAmIHByb2JlIGZvciBzdXBwb3J0ZWQgMzItYml0IChwbW9kZSkgcGNhcCBkZXZpY2VzCisgKi8KKyNpZiBkZWZpbmVkKFVTRV8zMkJJVF9EUklWRVJTKQorCitzdHJ1Y3QgZGV2aWNlIGVsMl9kZXYgTE9DS0VEX1ZBUiA9IHsKKyAgICAgICAgICAgICAgIjNjNTAzIiwKKyAgICAgICAgICAgICAgIkV0aGVyTGluayBJSSIsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICBlbDJfcHJvYmUKKyAgICAgICAgICAgIH07CisKK3N0cnVjdCBkZXZpY2UgZWwzX2RldiBMT0NLRURfVkFSID0geworICAgICAgICAgICAgICAiM2M1MDkiLAorICAgICAgICAgICAgICAiRXRoZXJMaW5rIElJSSIsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAmZWwyX2RldiwKKyAgICAgICAgICAgICAgZWwzX3Byb2JlCisgICAgICAgICAgICB9OworCitzdHJ1Y3QgZGV2aWNlIHRjNTE1X2RldiBMT0NLRURfVkFSID0geworICAgICAgICAgICAgICAiM2M1MTUiLAorICAgICAgICAgICAgICAiRXRoZXJMaW5rIFBDSSIsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAmZWwzX2RldiwKKyAgICAgICAgICAgICAgdGM1MTVfcHJvYmUKKyAgICAgICAgICAgIH07CisKK3N0cnVjdCBkZXZpY2UgdGM1OV9kZXYgTE9DS0VEX1ZBUiA9IHsKKyAgICAgICAgICAgICAgIjNjNTl4IiwKKyAgICAgICAgICAgICAgIkV0aGVyTGluayBQQ0kiLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAwLDAsMCwwLDAsMCwKKyAgICAgICAgICAgICAgJnRjNTE1X2RldiwKKyAgICAgICAgICAgICAgdGM1OXhfcHJvYmUKKyAgICAgICAgICAgIH07CisKK3N0cnVjdCBkZXZpY2UgdGM5MHhiY19kZXYgTE9DS0VEX1ZBUiA9IHsKKyAgICAgICAgICAgICAgIjNjOTB4IiwKKyAgICAgICAgICAgICAgIkV0aGVyTGluayA5MFgiLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAwLDAsMCwwLDAsMCwKKyAgICAgICAgICAgICAgJnRjNTlfZGV2LAorICAgICAgICAgICAgICB0YzkweGJjX3Byb2JlCisgICAgICAgICAgICB9OworCitzdHJ1Y3QgZGV2aWNlIHdkX2RldiBMT0NLRURfVkFSID0geworICAgICAgICAgICAgICAid2QiLAorICAgICAgICAgICAgICAiV2VzdGVuIERpZ2l0YWwiLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAwLDAsMCwwLDAsMCwKKyAgICAgICAgICAgICAgJnRjOTB4YmNfZGV2LAorICAgICAgICAgICAgICB3ZF9wcm9iZQorICAgICAgICAgICAgfTsKKworc3RydWN0IGRldmljZSBuZV9kZXYgTE9DS0VEX1ZBUiA9IHsKKyAgICAgICAgICAgICAgIm5lIiwKKyAgICAgICAgICAgICAgIk5FeDAwMCIsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIDAsMCwwLDAsMCwwLAorICAgICAgICAgICAgICAmd2RfZGV2LAorICAgICAgICAgICAgICBuZV9wcm9iZQorICAgICAgICAgICAgfTsKKworc3RydWN0IGRldmljZSBhY2N0X2RldiBMT0NLRURfVkFSID0geworICAgICAgICAgICAgICAiYWNjdCIsCisgICAgICAgICAgICAgICJBY2N0b24gRXRoZXJQb2NrZXQiLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAwLDAsMCwwLDAsMCwKKyAgICAgICAgICAgICAgJm5lX2RldiwKKyAgICAgICAgICAgICAgZXRocGtfcHJvYmUKKyAgICAgICAgICAgIH07CisKK3N0cnVjdCBkZXZpY2UgY3M4OV9kZXYgTE9DS0VEX1ZBUiA9IHsKKyAgICAgICAgICAgICAgImNzODkiLAorICAgICAgICAgICAgICAiQ3J5c3RhbCBTZW1pY29uZHVjdG9yIiwKKyAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgMCwwLDAsMCwwLDAsCisgICAgICAgICAgICAgICZhY2N0X2RldiwKKyAgICAgICAgICAgICAgY3M4OXgwX3Byb2JlCisgICAgICAgICAgICB9OworCitzdHJ1Y3QgZGV2aWNlIHJ0bDgxMzlfZGV2IExPQ0tFRF9WQVIgPSB7CisgICAgICAgICAgICAgICJydGw4MTM5IiwKKyAgICAgICAgICAgICAgIlJlYWxUZWsgUENJIiwKKyAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgMCwwLDAsMCwwLDAsCisgICAgICAgICAgICAgICZjczg5X2RldiwKKyAgICAgICAgICAgICAgcnRsODEzOV9wcm9iZSAgICAgLyogZGV2LT5wcm9iZSByb3V0aW5lICovCisgICAgICAgICAgICB9OyAgICAgICAgICAgIAorCisvKgorICogRGVxdWV1ZSByb3V0aW5lIGlzIGNhbGxlZCBieSBwb2xsaW5nLgorICogTk9URTogdGhlIHF1ZXVlLWVsZW1lbnQgaXMgbm90IGNvcGllZCwgb25seSBhIHBvaW50ZXIgaXMKKyAqIHJldHVybmVkIGF0ICcqYnVmJworICovCitpbnQgcGVla19yeGJ1ZiAoQllURSAqKmJ1ZikKK3sKKyAgc3RydWN0IHJ4X2VsZW0gKnRhaWwsICpoZWFkOworCisgIFBDQVBfQVNTRVJUIChwa3RxX2NoZWNrICgmYWN0aXZlX2Rldi0+cXVldWUpKTsKKworICBESVNBQkxFKCk7CisgIHRhaWwgPSBwa3RxX291dF9lbGVtICgmYWN0aXZlX2Rldi0+cXVldWUpOworICBoZWFkID0gcGt0cV9pbl9lbGVtICgmYWN0aXZlX2Rldi0+cXVldWUpOworICBFTkFCTEUoKTsKKworICBpZiAoaGVhZCAhPSB0YWlsKQorICB7CisgICAgUENBUF9BU1NFUlQgKHRhaWwtPnNpemUgPCBhY3RpdmVfZGV2LT5xdWV1ZS5lbGVtX3NpemUtNC0yKTsKKworICAgICpidWYgPSAmdGFpbC0+ZGF0YVswXTsKKyAgICByZXR1cm4gKHRhaWwtPnNpemUpOworICB9CisgICpidWYgPSBOVUxMOworICByZXR1cm4gKDApOworfQorCisvKgorICogUmVsZWFzZSBidWZmZXIgd2UgcGVla2VkIGF0IGFib3ZlLgorICovCitpbnQgcmVsZWFzZV9yeGJ1ZiAoQllURSAqYnVmKQoreworI2lmbmRlZiBOREVCVUcKKyAgc3RydWN0IHJ4X2VsZW0gKnRhaWwgPSBwa3RxX291dF9lbGVtICgmYWN0aXZlX2Rldi0+cXVldWUpOworCisgIFBDQVBfQVNTRVJUICgmdGFpbC0+ZGF0YVswXSA9PSBidWYpOworI2Vsc2UKKyAgQVJHU1VTRUQgKGJ1Zik7CisjZW5kaWYKKyAgcGt0cV9pbmNfb3V0ICgmYWN0aXZlX2Rldi0+cXVldWUpOworICByZXR1cm4gKDEpOworfQorCisvKgorICogZ2V0X3J4YnVmKCkgcm91dGluZSAoaW4gbG9ja2VkIGNvZGUpIGlzIGNhbGxlZCBmcm9tIElSUSBoYW5kbGVyCisgKiB0byByZXF1ZXN0IGEgYnVmZmVyLiBJbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCBhbmQgd2UgaGF2ZSBhIDMya0Igc3RhY2suCisgKi8KK0JZVEUgKmdldF9yeGJ1ZiAoaW50IGxlbikKK3sKKyAgaW50IGlkeDsKKworICBpZiAobGVuIDwgRVRIX01JTiB8fCBsZW4gPiBFVEhfTUFYKQorICAgICByZXR1cm4gKE5VTEwpOworCisgIGlkeCA9IHBrdHFfaW5faW5kZXggKCZhY3RpdmVfZGV2LT5xdWV1ZSk7CisKKyNpZmRlZiBERUJVRworICB7CisgICAgc3RhdGljIGludCBmYW5faWR4IExPQ0tFRF9WQVIgPSAwOworICAgIHdyaXRldyAoIi1cXHwvIltmYW5faWR4KytdIHwgKDE1IDw8IDgpLCAgICAgIC8qIHdoaXRlIG9uIGJsYWNrIGNvbG91ciAqLworICAgICAgICAgICAgMHhCODAwMCArIDIqNzkpOyAgLyogdXBwZXItcmlnaHQgY29ybmVyLCA4MC1jb2wgY29sb3VyIHNjcmVlbiAqLworICAgIGZhbl9pZHggJj0gMzsKKyAgfQorLyogd3JpdGV3IChpZHggKyAnMCcgKyAweDBGMDAsIDB4QjgwMDAgKyAyKjc4KTsgKi8KKyNlbmRpZgorCisgIGlmIChpZHggIT0gYWN0aXZlX2Rldi0+cXVldWUub3V0X2luZGV4KQorICB7CisgICAgc3RydWN0IHJ4X2VsZW0gKmhlYWQgPSBwa3RxX2luX2VsZW0gKCZhY3RpdmVfZGV2LT5xdWV1ZSk7CisKKyAgICBoZWFkLT5zaXplID0gbGVuOworICAgIGFjdGl2ZV9kZXYtPnF1ZXVlLmluX2luZGV4ID0gaWR4OworICAgIHJldHVybiAoJmhlYWQtPmRhdGFbMF0pOworICB9CisKKyAgLyogISF0by1kbzogZHJvcCAyNSUgb2YgdGhlIG9sZGVzdCBlbGVtZW50CisgICAqLworICBwa3RxX2NsZWFyICgmYWN0aXZlX2Rldi0+cXVldWUpOworICByZXR1cm4gKE5VTEwpOworfQorCisvKgorICogIFNpbXBsZSByaW5nLWJ1ZmZlciBxdWV1ZSBoYW5kbGVyIGZvciByZWNlcHRpb24gb2YgcGFja2V0cworICogIGZyb20gbmV0d29yayBkcml2ZXIuCisgKi8KKyNkZWZpbmUgUEtUUV9NQVJLRVIgIDB4REVBREJFRUYKKworc3RhdGljIGludCBwa3RxX2NoZWNrIChzdHJ1Y3QgcnhfcmluZ2J1ZiAqcSkKK3sKKyNpZm5kZWYgTkRFQlVHCisgIGludCAgIGk7CisgIGNoYXIgKmJ1ZjsKKyNlbmRpZgorCisgIGlmICghcSB8fCAhcS0+bnVtX2VsZW0gfHwgIXEtPmJ1Zl9zdGFydCkKKyAgICAgcmV0dXJuICgwKTsKKworI2lmbmRlZiBOREVCVUcKKyAgYnVmID0gcS0+YnVmX3N0YXJ0OworCisgIGZvciAoaSA9IDA7IGkgPCBxLT5udW1fZWxlbTsgaSsrKQorICB7CisgICAgYnVmICs9IHEtPmVsZW1fc2l6ZTsKKyAgICBpZiAoKihEV09SRCopKGJ1ZiAtIHNpemVvZihEV09SRCkpICE9IFBLVFFfTUFSS0VSKQorICAgICAgIHJldHVybiAoMCk7CisgIH0KKyNlbmRpZgorICByZXR1cm4gKDEpOworfQorCitzdGF0aWMgaW50IHBrdHFfaW5pdCAoc3RydWN0IHJ4X3JpbmdidWYgKnEsIGludCBzaXplLCBpbnQgbnVtLCBjaGFyICpwb29sKQoreworICBpbnQgaTsKKworICBxLT5lbGVtX3NpemUgPSBzaXplOworICBxLT5udW1fZWxlbSAgPSBudW07CisgIHEtPmJ1Zl9zdGFydCA9IHBvb2w7CisgIHEtPmluX2luZGV4ICA9IDA7CisgIHEtPm91dF9pbmRleCA9IDA7CisKKyAgUENBUF9BU1NFUlQgKHNpemUgPj0gc2l6ZW9mKHN0cnVjdCByeF9lbGVtKSArIHNpemVvZihEV09SRCkpOworICBQQ0FQX0FTU0VSVCAobnVtKTsKKyAgUENBUF9BU1NFUlQgKHBvb2wpOworCisgIGZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKyAgeworI2lmIDAKKyAgICBzdHJ1Y3QgcnhfZWxlbSAqZWxlbSA9IChzdHJ1Y3QgcnhfZWxlbSopIHBvb2w7CisKKyAgICAvKiBhc3NlcnQgZHdvcmQgYWxpZ25lZCBlbGVtZW50cworICAgICAqLworICAgIFBDQVBfQVNTRVJUICgoKHVuc2lnbmVkKSgmZWxlbS0+ZGF0YVswXSkgJiAzKSA9PSAwKTsKKyNlbmRpZgorICAgIHBvb2wgKz0gc2l6ZTsKKyAgICAqKERXT1JEKikgKHBvb2wgLSBzaXplb2YoRFdPUkQpKSA9IFBLVFFfTUFSS0VSOworICB9CisgIHJldHVybiAoMSk7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgdGhlIHF1ZXVlICdvdXRfaW5kZXgnICh0YWlsKS4KKyAqIENoZWNrIGZvciB3cmFwcy4KKyAqLworc3RhdGljIGludCBwa3RxX2luY19vdXQgKHN0cnVjdCByeF9yaW5nYnVmICpxKQoreworICBxLT5vdXRfaW5kZXgrKzsKKyAgaWYgKHEtPm91dF9pbmRleCA+PSBxLT5udW1fZWxlbSkKKyAgICAgIHEtPm91dF9pbmRleCA9IDA7CisgIHJldHVybiAocS0+b3V0X2luZGV4KTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgcXVldWUncyBuZXh0ICdpbl9pbmRleCcgKGhlYWQpLgorICogQ2hlY2sgZm9yIHdyYXBzLgorICovCitzdGF0aWMgaW50IHBrdHFfaW5faW5kZXggKHN0cnVjdCByeF9yaW5nYnVmICpxKQoreworICB2b2xhdGlsZSBpbnQgaW5kZXggPSBxLT5pbl9pbmRleCArIDE7CisKKyAgaWYgKGluZGV4ID49IHEtPm51bV9lbGVtKQorICAgICAgaW5kZXggPSAwOworICByZXR1cm4gKGluZGV4KTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgcXVldWUncyBoZWFkLWJ1ZmZlci4KKyAqLworc3RhdGljIHN0cnVjdCByeF9lbGVtICpwa3RxX2luX2VsZW0gKHN0cnVjdCByeF9yaW5nYnVmICpxKQoreworICByZXR1cm4gKHN0cnVjdCByeF9lbGVtKikgKHEtPmJ1Zl9zdGFydCArIChxLT5lbGVtX3NpemUgKiBxLT5pbl9pbmRleCkpOworfQorCisvKgorICogUmV0dXJuIHRoZSBxdWV1ZSdzIHRhaWwtYnVmZmVyLgorICovCitzdGF0aWMgc3RydWN0IHJ4X2VsZW0gKnBrdHFfb3V0X2VsZW0gKHN0cnVjdCByeF9yaW5nYnVmICpxKQoreworICByZXR1cm4gKHN0cnVjdCByeF9lbGVtKikgKHEtPmJ1Zl9zdGFydCArIChxLT5lbGVtX3NpemUgKiBxLT5vdXRfaW5kZXgpKTsKK30KKworLyoKKyAqIENsZWFyIHRoZSBxdWV1ZSByaW5nLWJ1ZmZlciBieSBzZXR0aW5nIGhlYWQ9dGFpbC4KKyAqLworc3RhdGljIHZvaWQgcGt0cV9jbGVhciAoc3RydWN0IHJ4X3JpbmdidWYgKnEpCit7CisgIHEtPmluX2luZGV4ID0gcS0+b3V0X2luZGV4OworfQorCisvKgorICogU3ltYm9scyB0aGF0IG11c3QgYmUgbGlua2FibGUgZm9yICJnY2MgLU8wIgorICovCisjdW5kZWYgX19JT1BPUlRfSAorI3VuZGVmIF9fRE1BX0gKKworI2RlZmluZSBleHRlcm4KKyNkZWZpbmUgX19pbmxpbmVfXworCisjaW5jbHVkZSAibXNkb3MvcG1fZHJ2ci9pb3BvcnQuaCIKKyNpbmNsdWRlICJtc2Rvcy9wbV9kcnZyL2RtYS5oIgorCisjZW5kaWYgLyogVVNFXzMyQklUX0RSSVZFUlMgKi8KKwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLWRvcy5oIGIvbGlicGNhcC0xLjMuMC9wY2FwLWRvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NzQ0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtZG9zLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBJbnRlcm5hbCBkZXRhaWxzIGZvciBsaWJwY2FwIG9uIERPUy4KKyAqIDMyLWJpdCB0YXJnZXRzOiBkamdwcCwgUGhhcmxhcCBvciBET1M0R1cuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLWRvcy5oLHYgMS4xIDIwMDQtMTItMTggMDg6NTI6MTAgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworI2lmbmRlZiBfX1BDQVBfRE9TX0gKKyNkZWZpbmUgX19QQ0FQX0RPU19ICisKKyNpZmRlZiBfX0RKR1BQX18KKyNpbmNsdWRlIDxwYy5oPiAgICAvKiBzaW1wbGUgbm9uLWNvbmlvIGtiaGl0ICovCisjZWxzZQorI2luY2x1ZGUgPGNvbmlvLmg+CisjZW5kaWYKKwordHlwZWRlZiBpbnQgICAgICAgICAgICBCT09MOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICBCWVRFOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBXT1JEOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICBEV09SRDsKK3R5cGVkZWYgQllURSAgICAgICAgICAgRVRIRVJbNl07CisKKyNkZWZpbmUgRVRIX0FMRU4gICAgICAgc2l6ZW9mKEVUSEVSKSAgIC8qIEV0aGVyIGFkZHJlc3MgbGVuZ3RoICovCisjZGVmaW5lIEVUSF9ITEVOICAgICAgICgyKkVUSF9BTEVOKzIpICAvKiBFdGhlciBoZWFkZXIgbGVuZ3RoICAqLworI2RlZmluZSBFVEhfTVRVICAgICAgICAxNTAwCisjZGVmaW5lIEVUSF9NSU4gICAgICAgIDYwCisjZGVmaW5lIEVUSF9NQVggICAgICAgIChFVEhfTVRVK0VUSF9ITEVOKQorCisjaWZuZGVmIFRSVUUKKyAgI2RlZmluZSBUUlVFICAgMQorICAjZGVmaW5lIEZBTFNFICAwCisjZW5kaWYKKworI2RlZmluZSBQSEFSTEFQICAxCisjZGVmaW5lIERKR1BQICAgIDIKKyNkZWZpbmUgRE9TNEdXICAgNAorCisjaWZkZWYgX19ESkdQUF9fCisgICN1bmRlZiAgRE9TWAorICAjZGVmaW5lIERPU1ggREpHUFAKKyNlbmRpZgorCisjaWZkZWYgX19XQVRDT01DX18KKyAgI3VuZGVmICBET1NYCisgICNkZWZpbmUgRE9TWCBET1M0R1cKKyNlbmRpZgorCisjaWZkZWYgX19ISUdIQ19fCisgICNpbmNsdWRlIDxwaGFybGFwLmg+CisgICN1bmRlZiAgRE9TWAorICAjZGVmaW5lIERPU1ggUEhBUkxBUAorICAjZGVmaW5lIGlubGluZQorI2Vsc2UKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDsKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fSElHSENfXykKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVpbnQ2NDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIFFXT1JEOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgIHVpbnQ2NDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICBRV09SRDsKKyNlbmRpZgorCisjZGVmaW5lIEFSR1NVU0VEKHgpICAodm9pZCkgeAorCisjaWYgZGVmaW5lZCAoX19TTUFMTF9fKSB8fCBkZWZpbmVkKF9fTEFSR0VfXykKKyAgI2RlZmluZSBET1NYIDAKKworI2VsaWYgIWRlZmluZWQoRE9TWCkKKyAgI2Vycm9yIERPU1ggbm90IGRlZmluZWQ7IDEgPSBQaGFyTGFwLCAyID0gZGpncHAsIDQgPSBET1M0R1cKKyNlbmRpZgorCisjaWZkZWYgX19ISUdIQ19fCisjZGVmaW5lIG1pbihhLGIpIF9taW4oYSxiKQorI2RlZmluZSBtYXgoYSxiKSBfbWF4KGEsYikKKyNlbmRpZgorCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoKGEpIDwgKGIpID8gKGEpIDogKGIpKQorI2VuZGlmCisKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLGIpICgoYSkgPCAoYikgPyAoYikgOiAoYSkpCisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9VXykgJiYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgX1VfICBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2VuZGlmCisKKyNpZm5kZWYgX1VfCisjZGVmaW5lIF9VXworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV8zMkJJVF9EUklWRVJTKQorICAjaW5jbHVkZSAibXNkb3MvcG1fZHJ2ci9sb2NrLmgiCisKKyAgI2lmbmRlZiBSRUNFSVZFX1FVRVVFX1NJWkUKKyAgI2RlZmluZSBSRUNFSVZFX1FVRVVFX1NJWkUgIDYwCisgICNlbmRpZgorCisgICNpZm5kZWYgUkVDRUlWRV9CVUZfU0laRQorICAjZGVmaW5lIFJFQ0VJVkVfQlVGX1NJWkUgICAoRVRIX01BWCsyMCkKKyAgI2VuZGlmCisKKyAgZXh0ZXJuIHN0cnVjdCBkZXZpY2UgZWwyX2RldiAgICAgTE9DS0VEX1ZBUjsgIC8qIDNDb20gRXRoZXJMaW5rIElJICovCisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIGVsM19kZXYgICAgIExPQ0tFRF9WQVI7ICAvKiAgICAgIEV0aGVyTGluayBJSUkgKi8KKyAgZXh0ZXJuIHN0cnVjdCBkZXZpY2UgdGM1OV9kZXYgICAgTE9DS0VEX1ZBUjsgIC8qIDNDb20gVm9ydGV4IENhcmQgKD8pICovCisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIHRjNTE1X2RldiAgIExPQ0tFRF9WQVI7CisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIHRjOTB4X2RldiAgIExPQ0tFRF9WQVI7CisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIHRjOTBiY3hfZGV2IExPQ0tFRF9WQVI7CisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIHdkX2RldiAgICAgIExPQ0tFRF9WQVI7CisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIG5lX2RldiAgICAgIExPQ0tFRF9WQVI7CisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIGFjY3RfZGV2ICAgIExPQ0tFRF9WQVI7CisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIGNzODlfZGV2ICAgIExPQ0tFRF9WQVI7CisgIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIHJ0bDgxMzlfZGV2IExPQ0tFRF9WQVI7CisKKyAgc3RydWN0IHJ4X3JpbmdidWYgeworICAgICAgICAgdm9sYXRpbGUgaW50IGluX2luZGV4OyAgIC8qIHF1ZXVlIGluZGV4IGhlYWQgKi8KKyAgICAgICAgIGludCAgICAgICAgICBvdXRfaW5kZXg7ICAvKiBxdWV1ZSBpbmRleCB0YWlsICovCisgICAgICAgICBpbnQgICAgICAgICAgZWxlbV9zaXplOyAgLyogc2l6ZSBvZiBlYWNoIGVsZW1lbnQgKi8KKyAgICAgICAgIGludCAgICAgICAgICBudW1fZWxlbTsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgKi8KKyAgICAgICAgIGNoYXIgICAgICAgICpidWZfc3RhcnQ7ICAvKiBzdGFydCBvZiBidWZmZXIgcG9vbCAqLworICAgICAgIH07CisKKyAgc3RydWN0IHJ4X2VsZW0geworICAgICAgICAgRFdPUkQgc2l6ZTsgICAgICAgICAgICAgIC8qIHNpemUgY29waWVkIHRvIHRoaXMgZWxlbWVudCAqLworICAgICAgICAgQllURSAgZGF0YVtFVEhfTUFYKzEwXTsgIC8qIGFkZCBzb21lIG1hcmdpbi4gZGF0YVswXSBzaG91bGQgYmUgKi8KKyAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkd29yZCBhbGlnbmVkICovCisKKyAgZXh0ZXJuIEJZVEUgKmdldF9yeGJ1ZiAgICAgKGludCBsZW4pIExPQ0tFRF9GVU5DOworICBleHRlcm4gaW50ICAgcGVla19yeGJ1ZiAgICAoQllURSAqKmJ1Zik7CisgIGV4dGVybiBpbnQgICByZWxlYXNlX3J4YnVmIChCWVRFICAqYnVmKTsKKworI2Vsc2UKKyAgI2RlZmluZSBMT0NLRURfVkFSCisgICNkZWZpbmUgTE9DS0VEX0ZVTkMKKworICBzdHJ1Y3QgZGV2aWNlIHsKKyAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgICBjb25zdCBjaGFyICpsb25nX25hbWU7CisgICAgICAgICBEV09SRCAgYmFzZV9hZGRyOyAgICAgIC8qIGRldmljZSBJL08gYWRkcmVzcyAgICAgICAqLworICAgICAgICAgaW50ICAgIGlycTsgICAgICAgICAgICAvKiBkZXZpY2UgSVJRIG51bWJlciAgICAgICAgKi8KKyAgICAgICAgIGludCAgICBkbWE7ICAgICAgICAgICAgLyogRE1BIGNoYW5uZWwgICAgICAgICAgICAgICovCisgICAgICAgICBEV09SRCAgbWVtX3N0YXJ0OyAgICAgIC8qIHNoYXJlZCBtZW0gc3RhcnQgICAgICAgICAqLworICAgICAgICAgRFdPUkQgIG1lbV9lbmQ7ICAgICAgICAvKiBzaGFyZWQgbWVtIGVuZCAgICAgICAgICAgKi8KKyAgICAgICAgIERXT1JEICBybWVtX3N0YXJ0OyAgICAgLyogc2htZW0gInJlY3YiIHN0YXJ0ICAgICAgICovCisgICAgICAgICBEV09SRCAgcm1lbV9lbmQ7ICAgICAgIC8qIHNoYXJlZCAicmVjdiIgZW5kICAgICAgICAqLworCisgICAgICAgICBzdHJ1Y3QgZGV2aWNlICpuZXh0OyAgIC8qIG5leHQgZGV2aWNlIGluIGxpc3QgICAgICAqLworCisgICAgICAgICAvKiBpbnRlcmZhY2Ugc2VydmljZSByb3V0aW5lcyAqLworICAgICAgICAgaW50ICAgKCpwcm9iZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKyAgICAgICAgIGludCAgICgqb3BlbikgKHN0cnVjdCBkZXZpY2UgKmRldik7CisgICAgICAgICB2b2lkICAoKmNsb3NlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworICAgICAgICAgaW50ICAgKCp4bWl0KSAoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCB2b2lkICpidWYsIGludCBsZW4pOworICAgICAgICAgdm9pZCAqKCpnZXRfc3RhdHMpKHN0cnVjdCBkZXZpY2UgKmRldik7CisgICAgICAgICB2b2lkICAoKnNldF9tdWx0aWNhc3RfbGlzdCkoc3RydWN0IGRldmljZSAqZGV2KTsKKworICAgICAgICAgLyogZHJpdmVyLXRvLXBjYXAgcmVjZWl2ZSBidWZmZXIgcm91dGluZXMgKi8KKyAgICAgICAgIGludCAgICgqY29weV9yeF9idWYpIChCWVRFICpidWYsIGludCBtYXgpOyAvKiByeC1jb3B5IChwa3RkcnZyIG9ubHkpICovCisgICAgICAgICBCWVRFICooKmdldF9yeF9idWYpIChpbnQgbGVuKTsgICAgICAgICAgICAgLyogcngtYnVmIGZldGNoL2VucXVldWUgKi8KKyAgICAgICAgIGludCAgICgqcGVla19yeF9idWYpIChCWVRFICoqYnVmKTsgICAgICAgICAvKiByeC1ub24tY29weSBhdCBxdWV1ZSAqLworICAgICAgICAgaW50ICAgKCpyZWxlYXNlX3J4X2J1ZikgKEJZVEUgKmJ1Zik7ICAgICAgIC8qIHJlbGVhc2UgYWZ0ZXIgcGVlayAqLworCisgICAgICAgICBXT1JEICAgZmxhZ3M7ICAgICAgICAgIC8qIExvdy1sZXZlbCBzdGF0dXMgZmxhZ3MuICovCisgICAgICAgICB2b2lkICAqcHJpdjsgICAgICAgICAgIC8qIHByaXZhdGUgZGF0YSAqLworICAgICAgIH07CisKKyAgLyoKKyAgICogTmV0d29yayBkZXZpY2Ugc3RhdGlzdGljcworICAgKi8KKyAgdHlwZWRlZiBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyB7CisgICAgICAgICAgRFdPUkQgIHJ4X3BhY2tldHM7ICAgICAgICAgICAgLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAgICAgICAqLworICAgICAgICAgIERXT1JEICB0eF9wYWNrZXRzOyAgICAgICAgICAgIC8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQgICAgKi8KKyAgICAgICAgICBEV09SRCAgcnhfYnl0ZXM7ICAgICAgICAgICAgICAvKiB0b3RhbCBieXRlcyByZWNlaXZlZCAgICAgICAgICovCisgICAgICAgICAgRFdPUkQgIHR4X2J5dGVzOyAgICAgICAgICAgICAgLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQgICAgICAqLworICAgICAgICAgIERXT1JEICByeF9lcnJvcnM7ICAgICAgICAgICAgIC8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkICAgICAgICAgKi8KKyAgICAgICAgICBEV09SRCAgdHhfZXJyb3JzOyAgICAgICAgICAgICAvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMgICAgICovCisgICAgICAgICAgRFdPUkQgIHJ4X2Ryb3BwZWQ7ICAgICAgICAgICAgLyogbm8gc3BhY2UgaW4gUnggYnVmZmVycyAgICAgICAqLworICAgICAgICAgIERXT1JEICB0eF9kcm9wcGVkOyAgICAgICAgICAgIC8qIG5vIHNwYWNlIGF2YWlsYWJsZSBmb3IgVHggICAgKi8KKyAgICAgICAgICBEV09SRCAgbXVsdGljYXN0OyAgICAgICAgICAgICAvKiBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZCAgICovCisKKyAgICAgICAgICAvKiBkZXRhaWxlZCByeF9lcnJvcnM6ICovCisgICAgICAgICAgRFdPUkQgIHJ4X2xlbmd0aF9lcnJvcnM7CisgICAgICAgICAgRFdPUkQgIHJ4X292ZXJfZXJyb3JzOyAgICAgICAgLyogcmVjdidyIG92ZXJydW4gZXJyb3IgICAgICAgICAqLworICAgICAgICAgIERXT1JEICByeF9vc2l6ZV9lcnJvcnM7ICAgICAgIC8qIHJlY3YnciBvdmVyLXNpemUgZXJyb3IgICAgICAgKi8KKyAgICAgICAgICBEV09SRCAgcnhfY3JjX2Vycm9yczsgICAgICAgICAvKiByZWN2J2QgcGt0IHdpdGggY3JjIGVycm9yICAgICovCisgICAgICAgICAgRFdPUkQgIHJ4X2ZyYW1lX2Vycm9yczsgICAgICAgLyogcmVjdidkIGZyYW1lIGFsaWdubWVudCBlcnJvciAqLworICAgICAgICAgIERXT1JEICByeF9maWZvX2Vycm9yczsgICAgICAgIC8qIHJlY3YnciBmaWZvIG92ZXJydW4gICAgICAgICAgKi8KKyAgICAgICAgICBEV09SRCAgcnhfbWlzc2VkX2Vycm9yczsgICAgICAvKiByZWN2J3IgbWlzc2VkIHBhY2tldCAgICAgICAgICovCisKKyAgICAgICAgICAvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKyAgICAgICAgICBEV09SRCAgdHhfYWJvcnRlZF9lcnJvcnM7CisgICAgICAgICAgRFdPUkQgIHR4X2NhcnJpZXJfZXJyb3JzOworICAgICAgICAgIERXT1JEICB0eF9maWZvX2Vycm9yczsKKyAgICAgICAgICBEV09SRCAgdHhfaGVhcnRiZWF0X2Vycm9yczsKKyAgICAgICAgICBEV09SRCAgdHhfd2luZG93X2Vycm9yczsKKyAgICAgICAgICBEV09SRCAgdHhfY29sbGlzaW9uczsKKyAgICAgICAgICBEV09SRCAgdHhfamFiYmVyczsKKyAgICAgICAgfSBORVRfU1RBVFM7CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBkZXZpY2UgICAgICAgKmFjdGl2ZV9kZXYgIExPQ0tFRF9WQVI7CitleHRlcm4gY29uc3Qgc3RydWN0IGRldmljZSAqZGV2X2Jhc2UgICAgTE9DS0VEX1ZBUjsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlICAgICAgICpwcm9iZWRfZGV2OworCitleHRlcm4gaW50IHBjYXBfcGt0X2RlYnVnOworCitleHRlcm4gdm9pZCBfdzMyX29zX3lpZWxkICh2b2lkKTsgLyogV2F0dC0zMidzIG1pc2MuYyAqLworCisjaWZkZWYgTkRFQlVHCisgICNkZWZpbmUgUENBUF9BU1NFUlQoeCkgKCh2b2lkKTApCisKKyNlbHNlCisgIHZvaWQgcGNhcF9hc3NlcnQgKGNvbnN0IGNoYXIgKndoYXQsIGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxpbmUpOyAgCisKKyAgI2RlZmluZSBQQ0FQX0FTU0VSVCh4KSBkbyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHgpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2FwX2Fzc2VydCAoI3gsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbmRpZiAgLyogX19QQ0FQX0RPU19IICovCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtZW5ldC5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLWVuZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWQ5MjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLWVuZXQuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIFN0YW5mb3JkIEVuZXRmaWx0ZXIgc3Vicm91dGluZXMgZm9yIHRjcGR1bXAKKyAqCisgKiBCYXNlZCBvbiB0aGUgTUVSSVQgTk5zdGF0IGV0aGVyaWZydC5jIGFuZCB0aGUgVWx0cml4IHBjYXAtcGYuYworICogc3Vicm91dGluZXMuCisgKgorICogUmF5YW4gWmFjaGFyaWFzc2VuLCBDQSpOZXQKKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1lbmV0LmMsdiAxLjkgMjAwNi0xMC0wNCAxODowOToyMiBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxwY2FwL2JwZi5oPgorI2luY2x1ZGUgPG5ldC9lbmV0Lmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCisKK3N0cnVjdCBwYWNrZXRfaGVhZGVyIHsKKyNpZmRlZglJQk1SVFBDCisJc3RydWN0IExlbmd0aFdvcmRzCWxlbmd0aDsKKwlzdHJ1Y3QgdGFwX2hlYWRlcgl0YXA7CisjZW5kaWYJLyogSUJNUlRQQyAqLworCXVfY2hhcgkJCXBhY2tldFs4XQorfTsKKworZXh0ZXJuIGludCBlcnJubzsKKworI2RlZmluZSBCVUZTUEFDRSAoNCoxMDI0KQorCisvKiBGb3J3YXJkcyAqLworc3RhdGljIHZvaWQgZWZSZWFkRXJyb3IoaW50LCBjaGFyICopOworCit2b2lkCityZWFkbG9vcChpbnQgY250LCBpbnQgaWZfZmQsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnAsIHByaW50ZnVuYyBwcmludGl0KQoreworI2lmZGVmCUlCTVJUUEMKKwlyZWdpc3RlciBzdHJ1Y3QgcGFja2V0X2hlYWRlciAqcGg7CisJcmVnaXN0ZXIgdV9jaGFyICpicDsKKwlyZWdpc3RlciBpbnQgaW5jOworI2Vsc2UJLyogIUlCTVJUUEMgKi8KKwlzdGF0aWMgc3RydWN0IHRpbWV2YWwgdHYgPSB7IDAgfTsKKyNlbmRpZgkvKiBJQk1SVFBDICovCisJcmVnaXN0ZXIgaW50IGNjLCBjYXBsZW47CisJcmVnaXN0ZXIgc3RydWN0IGJwZl9pbnNuICpmY29kZSA9IGZwLT5iZl9pbnNuczsKKwl1bmlvbiB7CisJCXN0cnVjdCBwYWNrZXRfaGVhZGVyIGhkcjsKKwkJdV9jaGFyCXBbQlVGU1BBQ0VdOworCQl1X3Nob3J0CXM7CisJfSBidWY7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKGNjID0gcmVhZChpZl9mZCwgKGNoYXIgKilidWYucCwgc2l6ZW9mKGJ1ZikpKSA8IDApCisJCQllZlJlYWRFcnJvcihpZl9mZCwgInJlYWRlciIpOworCisjaWZkZWYJSUJNUlRQQworCQkvKgorCQkgKiBMb29wIHRocm91Z2ggZWFjaCBwYWNrZXQuCisJCSAqLworCQlicCA9IGJ1Zi5wOworCQl3aGlsZSAoY2MgPiAwKSB7CisJCQlwaCA9IChzdHJ1Y3QgcGFja2V0X2hlYWRlciAqKWJwOworCQkJY2FwbGVuID0gcGgtPnRhcC50aF93aXJlbGVuID4gc25hcGxlbiA/IHNuYXBsZW4gOiBwaC0+dGFwCisudGhfd2lyZWxlbiA7CisJCQlpZiAoYnBmX2ZpbHRlcihmY29kZSwgKGNoYXIgKilwaC0+cGFja2V0LAorCQkJCQkJcGgtPnRhcC50aF93aXJlbGVuLCBjYXBsZW4pKSB7CisJCQkJaWYgKGNudCA+PSAwICYmIC0tY250IDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCQkJKCpwcmludGl0KSgoY2hhciAqKXBoLT5wYWNrZXQsCisJCQkJCShzdHJ1Y3QgdGltZXZhbCAqKXBoLT50YXAudGhfdGltZXN0YW1wLAorCQkJCQlwaC0+dGFwLnRoX3dpcmVsZW4sIGNhcGxlbik7CisJCQl9CisJCQlpbmMgPSBwaC0+bGVuZ3RoLlBhY2tldE9mZnNldDsKKwkJCWNjIC09IGluYzsKKwkJCWJwICs9IGluYzsKKwkJfQorI2Vsc2UJLyogIUlCTVJUUEMgKi8KKwkJY2FwbGVuID0gY2MgPiBzbmFwbGVuID8gc25hcGxlbiA6IGNjIDsKKwkJaWYgKGJwZl9maWx0ZXIoZmNvZGUsIGJ1Zi5oZHIucGFja2V0LCBjYywgY2FwbGVuKSkgeworCQkJaWYgKGNudCA+PSAwICYmIC0tY250IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCSgqcHJpbnRpdCkoYnVmLmhkci5wYWNrZXQsICZ0diwgY2MsIGNhcGxlbik7CisJCX0KKyNlbmRpZgkvKiBJQk1SVFBDICovCisJfQorIG91dDoKKwl3cmFwdXAoaWZfZmQpOworfQorCisvKiBDYWxsIE9OTFkgaWYgcmVhZCgpIGhhcyByZXR1cm5lZCBhbiBlcnJvciBvbiBwYWNrZXQgZmlsdGVyICovCitzdGF0aWMgdm9pZAorZWZSZWFkRXJyb3IoaW50IGZpZCwgY2hhciAqbXNnKQoreworCWlmIChlcnJubyA9PSBFSU5WQUwpIHsJLyogcmVhZCBNQVhJTlQgYnl0ZXMgYWxyZWFkeSEgKi8KKwkJaWYgKGxzZWVrKGZpZCwgMCwgMCkgPCAwKSB7CisJCQlwZXJyb3IoInRjcGR1bXA6IGVmUmVhZEVycm9yL2xzZWVrIik7CisJCQlleGl0KC0xKTsKKwkJfQorCQllbHNlCisJCQlyZXR1cm47CisJfQorCWVsc2UgeworCQkodm9pZCkgZnByaW50ZihzdGRlcnIsICJ0Y3BkdW1wOiAiKTsKKwkJcGVycm9yKG1zZyk7CisJCWV4aXQoLTEpOworCX0KK30KKwordm9pZAord3JhcHVwKGludCBmZCkKK3sKKyNpZmRlZglJQk1SVFBDCisJc3RydWN0IGVuc3RhdHMgZXM7CisKKwlpZiAoaW9jdGwoZmQsIEVJT1NUQVRTLCAmZXMpID09IC0xKSB7CisJCXBlcnJvcigidGNwZHVtcDogZW5ldCBpb2N0bCBFSU9TVEFUUyBlcnJvciIpOworCQlleGl0KC0xKTsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIiVkIHBhY2tldHMgcXVldWVkIiwgZXMuZW5TdGF0X1JjbnQpOworCWlmIChlcy5lblN0YXRfUmRyb3BzID4gMCkKKwkJZnByaW50ZihzdGRlcnIsICIsICVkIGRyb3BwZWQiLCBlcy5lblN0YXRfUmRyb3BzKTsKKwlpZiAoZXMuZW5TdGF0X1JlYWRzID4gMCkKKwkJZnByaW50ZihzdGRlcnIsICIsICVkIHRjcGR1bXAgJXMiLCBlcy5lblN0YXRfUmVhZHMsCisJCQkJZXMuZW5TdGF0X1JlYWRzID4gMSA/ICJyZWFkcyIgOiAicmVhZCIpOworCWlmIChlcy5lblN0YXRfTWF4UmVhZCA+IDEpCisJCWZwcmludGYoc3RkZXJyLCAiLCAlZCBwYWNrZXRzIGluIGxhcmdlc3QgcmVhZCIsCisJCQllcy5lblN0YXRfTWF4UmVhZCk7CisJcHV0YygnXG4nLCBzdGRlcnIpOworI2VuZGlmCS8qIElCTVJUUEMgKi8KKwljbG9zZShmZCk7Cit9CisKK2ludAoraW5pdGRldmljZShjaGFyICpkZXZpY2UsIGludCBwZmxhZywgaW50ICpsaW5rdHlwZSkKK3sKKwlzdHJ1Y3QgZW5pb2NiIGN0bDsKKwlzdHJ1Y3QgZW5maWx0ZXIgZmlsdGVyOworCXVfaW50IG1heHdhaXRpbmc7CisJaW50IGlmX2ZkOworCisjaWZkZWYJSUJNUlRQQworCUdFVEVORVRERVZJQ0UoMCwgT19SRE9OTFksICZpZl9mZCk7CisjZWxzZQkvKiAhSUJNUlRQQyAqLworCWlmX2ZkID0gb3BlbigiL2Rldi9lbmV0IiwgT19SRE9OTFksIDApOworI2VuZGlmCS8qIElCTVJUUEMgKi8KKworCWlmIChpZl9mZCA9PSAtMSkgeworCQlwZXJyb3IoInRjcGR1bXA6IGVuZXQgb3BlbiBlcnJvciIpOworCQllcnJvcigKKyJ5b3VyIHN5c3RlbSBtYXkgbm90IGJlIHByb3Blcmx5IGNvbmZpZ3VyZWQ7IHNlZSBcIm1hbiBlbmV0KDQpXCIiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJLyogIEdldCBvcGVyYXRpbmcgcGFyYW1ldGVycy4gKi8KKworCWlmIChpb2N0bChpZl9mZCwgRUlPQ0dFVFAsIChjaGFyICopJmN0bCkgPT0gLTEpIHsKKwkJcGVycm9yKCJ0Y3BkdW1wOiBlbmV0IGlvY3RsIEVJT0NHRVRQIGVycm9yIik7CisJCWV4aXQoLTEpOworCX0KKworCS8qICBTZXQgb3BlcmF0aW5nIHBhcmFtZXRlcnMuICovCisKKyNpZmRlZglJQk1SVFBDCisJY3RsLmVuX3J0b3V0ID0gMSAqIGN0bC5lbl9oejsKKwljdGwuZW5fdHJfZXRoZXJoZWFkID0gMTsKKwljdGwuZW5fdGFwX25ldHdvcmsgPSAxOworCWN0bC5lbl9tdWx0aV9wYWNrZXQgPSAxOworCWN0bC5lbl9tYXhsZW4gPSBCVUZTUEFDRTsKKyNlbHNlCS8qICFJQk1SVFBDICovCisJY3RsLmVuX3J0b3V0ID0gNjQ7CS8qIHJhbmRvbWx5IHBpY2tlZCB2YWx1ZSBmb3IgSFogKi8KKyNlbmRpZgkvKiBJQk1SVFBDICovCisJaWYgKGlvY3RsKGlmX2ZkLCBFSU9DU0VUUCwgJmN0bCkgPT0gLTEpIHsKKwkJcGVycm9yKCJ0Y3BkdW1wOiBlbmV0IGlvY3RsIEVJT0NTRVRQIGVycm9yIik7CisJCWV4aXQoLTEpOworCX0KKworCS8qICBGbHVzaCB0aGUgcmVjZWl2ZSBxdWV1ZSwgc2luY2Ugd2UndmUgY2hhbmdlZAorCSAgICB0aGUgb3BlcmF0aW5nIHBhcmFtZXRlcnMgYW5kIHdlIG90aGVyd2lzZSBtaWdodAorCSAgICByZWNlaXZlIGRhdGEgd2l0aG91dCBoZWFkZXJzLiAqLworCisJaWYgKGlvY3RsKGlmX2ZkLCBFSU9DRkxVU0gpID09IC0xKSB7CisJCXBlcnJvcigidGNwZHVtcDogZW5ldCBpb2N0bCBFSU9DRkxVU0ggZXJyb3IiKTsKKwkJZXhpdCgtMSk7CisJfQorCisJLyogIFNldCB0aGUgcmVjZWl2ZSBxdWV1ZSBkZXB0aCB0byBpdHMgbWF4aW11bS4gKi8KKworCW1heHdhaXRpbmcgPSBjdGwuZW5fbWF4d2FpdGluZzsKKwlpZiAoaW9jdGwoaWZfZmQsIEVJT0NTRVRXLCAmbWF4d2FpdGluZykgPT0gLTEpIHsKKwkJcGVycm9yKCJ0Y3BkdW1wOiBlbmV0IGlvY3RsIEVJT0NTRVRXIGVycm9yIik7CisJCWV4aXQoLTEpOworCX0KKworI2lmZGVmCUlCTVJUUEMKKwkvKiAgQ2xlYXIgc3RhdGlzdGljcy4gKi8KKworCWlmIChpb2N0bChpZl9mZCwgRUlPQ0xSU1RBVCwgMCkgPT0gLTEpIHsKKwkJcGVycm9yKCJ0Y3BkdW1wOiBlbmV0IGlvY3RsIEVJT0NMUlNUQVQgZXJyb3IiKTsKKwkJZXhpdCgtMSk7CisJfQorI2VuZGlmCS8qIElCTVJUUEMgKi8KKworCS8qICBTZXQgdGhlIGZpbHRlciAoYWNjZXB0IGFsbCBwYWNrZXRzKS4gKi8KKworCWZpbHRlci5lbmZfUHJpb3JpdHkgPSAzOworCWZpbHRlci5lbmZfRmlsdGVyTGVuID0gMDsKKwlpZiAoaW9jdGwoaWZfZmQsIEVJT0NTRVRGLCAmZmlsdGVyKSA9PSAtMSkgeworCQlwZXJyb3IoInRjcGR1bXA6IGVuZXQgaW9jdGwgRUlPQ1NFVEYgZXJyb3IiKTsKKwkJZXhpdCgtMSk7CisJfQorCS8qCisJICogImVuZXRmaWx0ZXIiIHN1cHBvcnRzIG9ubHkgZXRoZXJuZXRzLgorCSAqLworCSpsaW5rdHlwZSA9IERMVF9FTjEwTUI7CisKKwlyZXR1cm4oaWZfZmQpOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLWZpbHRlci5tYW5taXNjLmluIGIvbGlicGNhcC0xLjMuMC9wY2FwLWZpbHRlci5tYW5taXNjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjRiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtZmlsdGVyLm1hbm1pc2MuaW4KQEAgLTAsMCArMSw5NjIgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtZmlsdGVyLm1hbm1pc2MuaW4sdiAxLjEgMjAwOC0xMC0yMSAwNzozMzowMSBndXkgRXhwICQgKExCTCkKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVAtRklMVEVSIEBNQU5fTUlTQ19JTkZPQCAiNiBKYW51YXJ5IDIwMDgiCisuU0ggTkFNRQorcGNhcC1maWx0ZXIgXC0gcGFja2V0IGZpbHRlciBzeW50YXgKKy5icgorLmFkCisuU0ggREVTQ1JJUFRJT04KKy5MUAorLkIgcGNhcF9jb21waWxlKCkKK2lzIHVzZWQgdG8gY29tcGlsZSBhIHN0cmluZyBpbnRvIGEgZmlsdGVyIHByb2dyYW0uCitUaGUgcmVzdWx0aW5nIGZpbHRlciBwcm9ncmFtIGNhbiB0aGVuIGJlIGFwcGxpZWQgdG8KK3NvbWUgc3RyZWFtIG9mIHBhY2tldHMgdG8gZGV0ZXJtaW5lIHdoaWNoIHBhY2tldHMgd2lsbCBiZSBzdXBwbGllZCB0bworLkJSIHBjYXBfbG9vcCgpICwKKy5CUiBwY2FwX2Rpc3BhdGNoKCkgLAorLkJSIHBjYXBfbmV4dCgpICwKK29yCisuQlIgcGNhcF9uZXh0X2V4KCkgLgorLkxQCitUaGUgXGZJZmlsdGVyIGV4cHJlc3Npb25cZlAgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUKKy5JUiBwcmltaXRpdmVzIC4KK1ByaW1pdGl2ZXMgdXN1YWxseSBjb25zaXN0IG9mIGFuCisuSSBpZAorKG5hbWUgb3IgbnVtYmVyKSBwcmVjZWRlZCBieSBvbmUgb3IgbW9yZSBxdWFsaWZpZXJzLgorVGhlcmUgYXJlIHRocmVlCitkaWZmZXJlbnQga2luZHMgb2YgcXVhbGlmaWVyOgorLklQIFxmSXR5cGVcZlAKK3F1YWxpZmllcnMgc2F5IHdoYXQga2luZCBvZiB0aGluZyB0aGUgaWQgbmFtZSBvciBudW1iZXIgcmVmZXJzIHRvLgorUG9zc2libGUgdHlwZXMgYXJlCisuQlIgaG9zdCAsCisuQiBuZXQgLAorLkIgcG9ydAorYW5kCisuQlIgcG9ydHJhbmdlIC4KK0UuZy4sIGBob3N0IGZvbycsIGBuZXQgMTI4LjMnLCBgcG9ydCAyMCcsIGBwb3J0cmFuZ2UgNjAwMC02MDA4Jy4KK0lmIHRoZXJlIGlzIG5vIHR5cGUKK3F1YWxpZmllciwKKy5CIGhvc3QKK2lzIGFzc3VtZWQuCisuSVAgXGZJZGlyXGZQCitxdWFsaWZpZXJzIHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHRyYW5zZmVyIGRpcmVjdGlvbiB0byBhbmQvb3IgZnJvbQorLklSIGlkIC4KK1Bvc3NpYmxlIGRpcmVjdGlvbnMgYXJlCisuQlIgc3JjICwKKy5CUiBkc3QgLAorLkJSICJzcmMgb3IgZHN0IiAsCisuQlIgInNyYyBhbmQgZHN0IiAsCisuQlIgcmEgLAorLkJSIHRhICwKKy5CUiBhZGRyMSAsCisuQlIgYWRkcjIgLAorLkJSIGFkZHIzICwKK2FuZAorLkJSIGFkZHI0IC4KK0UuZy4sIGBzcmMgZm9vJywgYGRzdCBuZXQgMTI4LjMnLCBgc3JjIG9yIGRzdCBwb3J0IGZ0cC1kYXRhJy4KK0lmCit0aGVyZSBpcyBubyBkaXIgcXVhbGlmaWVyLAorLkIgInNyYyBvciBkc3QiCitpcyBhc3N1bWVkLgorVGhlCisuQlIgcmEgLAorLkJSIHRhICwKKy5CUiBhZGRyMSAsCisuQlIgYWRkcjIgLAorLkJSIGFkZHIzICwKK2FuZAorLkIgYWRkcjQKK3F1YWxpZmllcnMgYXJlIG9ubHkgdmFsaWQgZm9yIElFRUUgODAyLjExIFdpcmVsZXNzIExBTiBsaW5rIGxheWVycy4KK0ZvciBzb21lIGxpbmsgbGF5ZXJzLCBzdWNoIGFzIFNMSVAgYW5kIHRoZSBgYGNvb2tlZCcnIExpbnV4IGNhcHR1cmUgbW9kZQordXNlZCBmb3IgdGhlIGBgYW55JycgZGV2aWNlIGFuZCBmb3Igc29tZSBvdGhlciBkZXZpY2UgdHlwZXMsIHRoZQorLkIgaW5ib3VuZAorYW5kCisuQiBvdXRib3VuZAorcXVhbGlmaWVycyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZGVzaXJlZCBkaXJlY3Rpb24uCisuSVAgXGZJcHJvdG9cZlAKK3F1YWxpZmllcnMgcmVzdHJpY3QgdGhlIG1hdGNoIHRvIGEgcGFydGljdWxhciBwcm90b2NvbC4KK1Bvc3NpYmxlCitwcm90b3MgYXJlOgorLkJSIGV0aGVyICwKKy5CUiBmZGRpICwKKy5CUiB0ciAsCisuQlIgd2xhbiAsCisuQlIgaXAgLAorLkJSIGlwNiAsCisuQlIgYXJwICwKKy5CUiByYXJwICwKKy5CUiBkZWNuZXQgLAorLkIgdGNwCithbmQKKy5CUiB1ZHAgLgorRS5nLiwgYGV0aGVyIHNyYyBmb28nLCBgYXJwIG5ldCAxMjguMycsIGB0Y3AgcG9ydCAyMScsIGB1ZHAgcG9ydHJhbmdlCis3MDAwLTcwMDknLCBgd2xhbiBhZGRyMiAwOjI6Mzo0OjU6NicuCitJZiB0aGVyZSBpcworbm8gcHJvdG8gcXVhbGlmaWVyLCBhbGwgcHJvdG9jb2xzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdHlwZSBhcmUKK2Fzc3VtZWQuCitFLmcuLCBgc3JjIGZvbycgbWVhbnMgYChpcCBvciBhcnAgb3IgcmFycCkgc3JjIGZvbycKKyhleGNlcHQgdGhlIGxhdHRlciBpcyBub3QgbGVnYWwgc3ludGF4KSwgYG5ldCBiYXInIG1lYW5zIGAoaXAgb3IKK2FycCBvciByYXJwKSBuZXQgYmFyJyBhbmQgYHBvcnQgNTMnIG1lYW5zIGAodGNwIG9yIHVkcCkgcG9ydCA1MycuCisuTFAKK1tgZmRkaScgaXMgYWN0dWFsbHkgYW4gYWxpYXMgZm9yIGBldGhlcic7IHRoZSBwYXJzZXIgdHJlYXRzIHRoZW0KK2lkZW50aWNhbGx5IGFzIG1lYW5pbmcgYGB0aGUgZGF0YSBsaW5rIGxldmVsIHVzZWQgb24gdGhlIHNwZWNpZmllZAorbmV0d29yayBpbnRlcmZhY2UuJycgIEZEREkgaGVhZGVycyBjb250YWluIEV0aGVybmV0LWxpa2Ugc291cmNlCithbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzLCBhbmQgb2Z0ZW4gY29udGFpbiBFdGhlcm5ldC1saWtlIHBhY2tldAordHlwZXMsIHNvIHlvdSBjYW4gZmlsdGVyIG9uIHRoZXNlIEZEREkgZmllbGRzIGp1c3QgYXMgd2l0aCB0aGUKK2FuYWxvZ291cyBFdGhlcm5ldCBmaWVsZHMuCitGRERJIGhlYWRlcnMgYWxzbyBjb250YWluIG90aGVyIGZpZWxkcywKK2J1dCB5b3UgY2Fubm90IG5hbWUgdGhlbSBleHBsaWNpdGx5IGluIGEgZmlsdGVyIGV4cHJlc3Npb24uCisuTFAKK1NpbWlsYXJseSwgYHRyJyBhbmQgYHdsYW4nIGFyZSBhbGlhc2VzIGZvciBgZXRoZXInOyB0aGUgcHJldmlvdXMKK3BhcmFncmFwaCdzIHN0YXRlbWVudHMgYWJvdXQgRkRESSBoZWFkZXJzIGFsc28gYXBwbHkgdG8gVG9rZW4gUmluZworYW5kIDgwMi4xMSB3aXJlbGVzcyBMQU4gaGVhZGVycy4gIEZvciA4MDIuMTEgaGVhZGVycywgdGhlIGRlc3RpbmF0aW9uCithZGRyZXNzIGlzIHRoZSBEQSBmaWVsZCBhbmQgdGhlIHNvdXJjZSBhZGRyZXNzIGlzIHRoZSBTQSBmaWVsZDsgdGhlCitCU1NJRCwgUkEsIGFuZCBUQSBmaWVsZHMgYXJlbid0IHRlc3RlZC5dCisuTFAKK0luIGFkZGl0aW9uIHRvIHRoZSBhYm92ZSwgdGhlcmUgYXJlIHNvbWUgc3BlY2lhbCBgcHJpbWl0aXZlJyBrZXl3b3JkcwordGhhdCBkb24ndCBmb2xsb3cgdGhlIHBhdHRlcm46CisuQlIgZ2F0ZXdheSAsCisuQlIgYnJvYWRjYXN0ICwKKy5CUiBsZXNzICwKKy5CIGdyZWF0ZXIKK2FuZCBhcml0aG1ldGljIGV4cHJlc3Npb25zLgorQWxsIG9mIHRoZXNlIGFyZSBkZXNjcmliZWQgYmVsb3cuCisuTFAKK01vcmUgY29tcGxleCBmaWx0ZXIgZXhwcmVzc2lvbnMgYXJlIGJ1aWx0IHVwIGJ5IHVzaW5nIHRoZSB3b3JkcworLkJSIGFuZCAsCisuQiBvcgorYW5kCisuQiBub3QKK3RvIGNvbWJpbmUgcHJpbWl0aXZlcy4KK0UuZy4sIGBob3N0IGZvbyBhbmQgbm90IHBvcnQgZnRwIGFuZCBub3QgcG9ydCBmdHAtZGF0YScuCitUbyBzYXZlIHR5cGluZywgaWRlbnRpY2FsIHF1YWxpZmllciBsaXN0cyBjYW4gYmUgb21pdHRlZC4KK0UuZy4sCitgdGNwIGRzdCBwb3J0IGZ0cCBvciBmdHAtZGF0YSBvciBkb21haW4nIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMKK2B0Y3AgZHN0IHBvcnQgZnRwIG9yIHRjcCBkc3QgcG9ydCBmdHAtZGF0YSBvciB0Y3AgZHN0IHBvcnQgZG9tYWluJy4KKy5MUAorQWxsb3dhYmxlIHByaW1pdGl2ZXMgYXJlOgorLklQICJcZkJkc3QgaG9zdCBcZklob3N0XGZSIgorVHJ1ZSBpZiB0aGUgSVB2NC92NiBkZXN0aW5hdGlvbiBmaWVsZCBvZiB0aGUgcGFja2V0IGlzIFxmSWhvc3RcZlAsCit3aGljaCBtYXkgYmUgZWl0aGVyIGFuIGFkZHJlc3Mgb3IgYSBuYW1lLgorLklQICJcZkJzcmMgaG9zdCBcZklob3N0XGZSIgorVHJ1ZSBpZiB0aGUgSVB2NC92NiBzb3VyY2UgZmllbGQgb2YgdGhlIHBhY2tldCBpcyBcZklob3N0XGZQLgorLklQICJcZkJob3N0IFxmSWhvc3RcZlAKK1RydWUgaWYgZWl0aGVyIHRoZSBJUHY0L3Y2IHNvdXJjZSBvciBkZXN0aW5hdGlvbiBvZiB0aGUgcGFja2V0IGlzIFxmSWhvc3RcZlAuCisuSVAKK0FueSBvZiB0aGUgYWJvdmUgaG9zdCBleHByZXNzaW9ucyBjYW4gYmUgcHJlcGVuZGVkIHdpdGggdGhlIGtleXdvcmRzLAorXGZCaXBcZlAsIFxmQmFycFxmUCwgXGZCcmFycFxmUCwgb3IgXGZCaXA2XGZQIGFzIGluOgorLmluICsuNWkKKy5uZgorXGZCaXAgaG9zdCBcZklob3N0XGZSCisuZmkKKy5pbiAtLjVpCit3aGljaCBpcyBlcXVpdmFsZW50IHRvOgorLmluICsuNWkKKy5uZgorXGZCZXRoZXIgcHJvdG8gXGZJXFxpcFxmQiBhbmQgaG9zdCBcZklob3N0XGZSCisuZmkKKy5pbiAtLjVpCitJZiBcZklob3N0XGZSIGlzIGEgbmFtZSB3aXRoIG11bHRpcGxlIElQIGFkZHJlc3NlcywgZWFjaCBhZGRyZXNzIHdpbGwKK2JlIGNoZWNrZWQgZm9yIGEgbWF0Y2guCisuSVAgIlxmQmV0aGVyIGRzdCBcZkllaG9zdFxmUAorVHJ1ZSBpZiB0aGUgRXRoZXJuZXQgZGVzdGluYXRpb24gYWRkcmVzcyBpcyBcZkllaG9zdFxmUC4KK1xmSUVob3N0XGZQCittYXkgYmUgZWl0aGVyIGEgbmFtZSBmcm9tIC9ldGMvZXRoZXJzIG9yIGEgbnVtYmVyIChzZWUKKy5JUiBldGhlcnMgKDNOKQorZm9yIG51bWVyaWMgZm9ybWF0KS4KKy5JUCAiXGZCZXRoZXIgc3JjIFxmSWVob3N0XGZQCitUcnVlIGlmIHRoZSBFdGhlcm5ldCBzb3VyY2UgYWRkcmVzcyBpcyBcZkllaG9zdFxmUC4KKy5JUCAiXGZCZXRoZXIgaG9zdCBcZkllaG9zdFxmUAorVHJ1ZSBpZiBlaXRoZXIgdGhlIEV0aGVybmV0IHNvdXJjZSBvciBkZXN0aW5hdGlvbiBhZGRyZXNzIGlzIFxmSWVob3N0XGZQLgorLklQICJcZkJnYXRld2F5XGZQIFxmSWhvc3RcZlAKK1RydWUgaWYgdGhlIHBhY2tldCB1c2VkIFxmSWhvc3RcZlAgYXMgYSBnYXRld2F5LgorSS5lLiwgdGhlIEV0aGVybmV0Citzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyB3YXMgXGZJaG9zdFxmUCBidXQgbmVpdGhlciB0aGUgSVAgc291cmNlCitub3IgdGhlIElQIGRlc3RpbmF0aW9uIHdhcyBcZklob3N0XGZQLgorXGZJSG9zdFxmUCBtdXN0IGJlIGEgbmFtZSBhbmQKK211c3QgYmUgZm91bmQgYm90aCBieSB0aGUgbWFjaGluZSdzIGhvc3QtbmFtZS10by1JUC1hZGRyZXNzIHJlc29sdXRpb24KK21lY2hhbmlzbXMgKGhvc3QgbmFtZSBmaWxlLCBETlMsIE5JUywgZXRjLikgYW5kIGJ5IHRoZSBtYWNoaW5lJ3MKK2hvc3QtbmFtZS10by1FdGhlcm5ldC1hZGRyZXNzIHJlc29sdXRpb24gbWVjaGFuaXNtICgvZXRjL2V0aGVycywgZXRjLikuCisoQW4gZXF1aXZhbGVudCBleHByZXNzaW9uIGlzCisuaW4gKy41aQorLm5mCitcZkJldGhlciBob3N0IFxmSWVob3N0IFxmQmFuZCBub3QgaG9zdCBcZklob3N0XGZSCisuZmkKKy5pbiAtLjVpCit3aGljaCBjYW4gYmUgdXNlZCB3aXRoIGVpdGhlciBuYW1lcyBvciBudW1iZXJzIGZvciBcZklob3N0IC8gZWhvc3RcZlAuKQorVGhpcyBzeW50YXggZG9lcyBub3Qgd29yayBpbiBJUHY2LWVuYWJsZWQgY29uZmlndXJhdGlvbiBhdCB0aGlzIG1vbWVudC4KKy5JUCAiXGZCZHN0IG5ldCBcZkluZXRcZlIiCitUcnVlIGlmIHRoZSBJUHY0L3Y2IGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIHBhY2tldCBoYXMgYSBuZXR3b3JrCitudW1iZXIgb2YgXGZJbmV0XGZQLgorXGZJTmV0XGZQIG1heSBiZSBlaXRoZXIgYSBuYW1lIGZyb20gdGhlIG5ldHdvcmtzIGRhdGFiYXNlCisoL2V0Yy9uZXR3b3JrcywgZXRjLikgb3IgYSBuZXR3b3JrIG51bWJlci4KK0FuIElQdjQgbmV0d29yayBudW1iZXIgY2FuIGJlIHdyaXR0ZW4gYXMgYSBkb3R0ZWQgcXVhZCAoZS5nLiwgMTkyLjE2OC4xLjApLAorZG90dGVkIHRyaXBsZSAoZS5nLiwgMTkyLjE2OC4xKSwgZG90dGVkIHBhaXIgKGUuZywgMTcyLjE2KSwgb3Igc2luZ2xlCitudW1iZXIgKGUuZy4sIDEwKTsgdGhlIG5ldG1hc2sgaXMgMjU1LjI1NS4yNTUuMjU1IGZvciBhIGRvdHRlZCBxdWFkCisod2hpY2ggbWVhbnMgdGhhdCBpdCdzIHJlYWxseSBhIGhvc3QgbWF0Y2gpLCAyNTUuMjU1LjI1NS4wIGZvciBhIGRvdHRlZAordHJpcGxlLCAyNTUuMjU1LjAuMCBmb3IgYSBkb3R0ZWQgcGFpciwgb3IgMjU1LjAuMC4wIGZvciBhIHNpbmdsZSBudW1iZXIuCitBbiBJUHY2IG5ldHdvcmsgbnVtYmVyIG11c3QgYmUgd3JpdHRlbiBvdXQgZnVsbHk7IHRoZSBuZXRtYXNrIGlzCitmZjpmZjpmZjpmZjpmZjpmZjpmZjpmZiwgc28gSVB2NiAibmV0d29yayIgbWF0Y2hlcyBhcmUgcmVhbGx5IGFsd2F5cworaG9zdCBtYXRjaGVzLCBhbmQgYSBuZXR3b3JrIG1hdGNoIHJlcXVpcmVzIGEgbmV0bWFzayBsZW5ndGguCisuSVAgIlxmQnNyYyBuZXQgXGZJbmV0XGZSIgorVHJ1ZSBpZiB0aGUgSVB2NC92NiBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgcGFja2V0IGhhcyBhIG5ldHdvcmsKK251bWJlciBvZiBcZkluZXRcZlAuCisuSVAgIlxmQm5ldCBcZkluZXRcZlIiCitUcnVlIGlmIGVpdGhlciB0aGUgSVB2NC92NiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgcGFja2V0IGhhcyBhIG5ldHdvcmsKK251bWJlciBvZiBcZkluZXRcZlAuCisuSVAgIlxmQm5ldCBcZkluZXRcZlIgXGZCbWFzayBcZkluZXRtYXNrXGZSIgorVHJ1ZSBpZiB0aGUgSVB2NCBhZGRyZXNzIG1hdGNoZXMgXGZJbmV0XGZSIHdpdGggdGhlIHNwZWNpZmljIFxmSW5ldG1hc2tcZlIuCitNYXkgYmUgcXVhbGlmaWVkIHdpdGggXGZCc3JjXGZSIG9yIFxmQmRzdFxmUi4KK05vdGUgdGhhdCB0aGlzIHN5bnRheCBpcyBub3QgdmFsaWQgZm9yIElQdjYgXGZJbmV0XGZSLgorLklQICJcZkJuZXQgXGZJbmV0XGZSL1xmSWxlblxmUiIKK1RydWUgaWYgdGhlIElQdjQvdjYgYWRkcmVzcyBtYXRjaGVzIFxmSW5ldFxmUiB3aXRoIGEgbmV0bWFzayBcZklsZW5cZlIKK2JpdHMgd2lkZS4KK01heSBiZSBxdWFsaWZpZWQgd2l0aCBcZkJzcmNcZlIgb3IgXGZCZHN0XGZSLgorLklQICJcZkJkc3QgcG9ydCBcZklwb3J0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGlwL3RjcCwgaXAvdWRwLCBpcDYvdGNwIG9yIGlwNi91ZHAgYW5kIGhhcyBhCitkZXN0aW5hdGlvbiBwb3J0IHZhbHVlIG9mIFxmSXBvcnRcZlAuCitUaGUgXGZJcG9ydFxmUCBjYW4gYmUgYSBudW1iZXIgb3IgYSBuYW1lIHVzZWQgaW4gL2V0Yy9zZXJ2aWNlcyAoc2VlCisuSVIgdGNwICg0UCkKK2FuZAorLklSIHVkcCAoNFApKS4KK0lmIGEgbmFtZSBpcyB1c2VkLCBib3RoIHRoZSBwb3J0CitudW1iZXIgYW5kIHByb3RvY29sIGFyZSBjaGVja2VkLgorSWYgYSBudW1iZXIgb3IgYW1iaWd1b3VzIG5hbWUgaXMgdXNlZCwKK29ubHkgdGhlIHBvcnQgbnVtYmVyIGlzIGNoZWNrZWQgKGUuZy4sIFxmQmRzdCBwb3J0IDUxM1xmUiB3aWxsIHByaW50IGJvdGgKK3RjcC9sb2dpbiB0cmFmZmljIGFuZCB1ZHAvd2hvIHRyYWZmaWMsIGFuZCBcZkJwb3J0IGRvbWFpblxmUiB3aWxsIHByaW50Citib3RoIHRjcC9kb21haW4gYW5kIHVkcC9kb21haW4gdHJhZmZpYykuCisuSVAgIlxmQnNyYyBwb3J0IFxmSXBvcnRcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaGFzIGEgc291cmNlIHBvcnQgdmFsdWUgb2YgXGZJcG9ydFxmUC4KKy5JUCAiXGZCcG9ydCBcZklwb3J0XGZSIgorVHJ1ZSBpZiBlaXRoZXIgdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBwb3J0IG9mIHRoZSBwYWNrZXQgaXMgXGZJcG9ydFxmUC4KKy5JUCAiXGZCZHN0IHBvcnRyYW5nZSBcZklwb3J0MVxmQi1cZklwb3J0MlxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBpcC90Y3AsIGlwL3VkcCwgaXA2L3RjcCBvciBpcDYvdWRwIGFuZCBoYXMgYQorZGVzdGluYXRpb24gcG9ydCB2YWx1ZSBiZXR3ZWVuIFxmSXBvcnQxXGZQIGFuZCBcZklwb3J0MlxmUC4KKy5JIHBvcnQxCithbmQKKy5JIHBvcnQyCithcmUgaW50ZXJwcmV0ZWQgaW4gdGhlIHNhbWUgZmFzaGlvbiBhcyB0aGUKKy5JIHBvcnQKK3BhcmFtZXRlciBmb3IKKy5CUiBwb3J0IC4KKy5JUCAiXGZCc3JjIHBvcnRyYW5nZSBcZklwb3J0MVxmQi1cZklwb3J0MlxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBoYXMgYSBzb3VyY2UgcG9ydCB2YWx1ZSBiZXR3ZWVuIFxmSXBvcnQxXGZQIGFuZAorXGZJcG9ydDJcZlAuCisuSVAgIlxmQnBvcnRyYW5nZSBcZklwb3J0MVxmQi1cZklwb3J0MlxmUiIKK1RydWUgaWYgZWl0aGVyIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gcG9ydCBvZiB0aGUgcGFja2V0IGlzIGJldHdlZW4KK1xmSXBvcnQxXGZQIGFuZCBcZklwb3J0MlxmUC4KKy5JUAorQW55IG9mIHRoZSBhYm92ZSBwb3J0IG9yIHBvcnQgcmFuZ2UgZXhwcmVzc2lvbnMgY2FuIGJlIHByZXBlbmRlZCB3aXRoCit0aGUga2V5d29yZHMsIFxmQnRjcFxmUCBvciBcZkJ1ZHBcZlAsIGFzIGluOgorLmluICsuNWkKKy5uZgorXGZCdGNwIHNyYyBwb3J0IFxmSXBvcnRcZlIKKy5maQorLmluIC0uNWkKK3doaWNoIG1hdGNoZXMgb25seSB0Y3AgcGFja2V0cyB3aG9zZSBzb3VyY2UgcG9ydCBpcyBcZklwb3J0XGZQLgorLklQICJcZkJsZXNzIFxmSWxlbmd0aFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBoYXMgYSBsZW5ndGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFxmSWxlbmd0aFxmUC4KK1RoaXMgaXMgZXF1aXZhbGVudCB0bzoKKy5pbiArLjVpCisubmYKK1xmQmxlbiA8PSBcZklsZW5ndGhcZlAuCisuZmkKKy5pbiAtLjVpCisuSVAgIlxmQmdyZWF0ZXIgXGZJbGVuZ3RoXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGhhcyBhIGxlbmd0aCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXGZJbGVuZ3RoXGZQLgorVGhpcyBpcyBlcXVpdmFsZW50IHRvOgorLmluICsuNWkKKy5uZgorXGZCbGVuID49IFxmSWxlbmd0aFxmUC4KKy5maQorLmluIC0uNWkKKy5JUCAiXGZCaXAgcHJvdG8gXGZJcHJvdG9jb2xcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NCBwYWNrZXQgKHNlZQorLklSIGlwICg0UCkpCitvZiBwcm90b2NvbCB0eXBlIFxmSXByb3RvY29sXGZQLgorXGZJUHJvdG9jb2xcZlAgY2FuIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgbmFtZXMKK1xmQmljbXBcZlAsIFxmQmljbXA2XGZQLCBcZkJpZ21wXGZQLCBcZkJpZ3JwXGZQLCBcZkJwaW1cZlAsIFxmQmFoXGZQLAorXGZCZXNwXGZQLCBcZkJ2cnJwXGZQLCBcZkJ1ZHBcZlAsIG9yIFxmQnRjcFxmUC4KK05vdGUgdGhhdCB0aGUgaWRlbnRpZmllcnMgXGZCdGNwXGZQLCBcZkJ1ZHBcZlAsIGFuZCBcZkJpY21wXGZQIGFyZSBhbHNvCitrZXl3b3JkcyBhbmQgbXVzdCBiZSBlc2NhcGVkIHZpYSBiYWNrc2xhc2ggKFxcKSwgd2hpY2ggaXMgXFxcXCBpbiB0aGUgQy1zaGVsbC4KK05vdGUgdGhhdCB0aGlzIHByaW1pdGl2ZSBkb2VzIG5vdCBjaGFzZSB0aGUgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgorLklQICJcZkJpcDYgcHJvdG8gXGZJcHJvdG9jb2xcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NiBwYWNrZXQgb2YgcHJvdG9jb2wgdHlwZSBcZklwcm90b2NvbFxmUC4KK05vdGUgdGhhdCB0aGlzIHByaW1pdGl2ZSBkb2VzIG5vdCBjaGFzZSB0aGUgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgorLklQICJcZkJpcDYgcHJvdG9jaGFpbiBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBJUHY2IHBhY2tldCwKK2FuZCBjb250YWlucyBwcm90b2NvbCBoZWFkZXIgd2l0aCB0eXBlIFxmSXByb3RvY29sXGZSCitpbiBpdHMgcHJvdG9jb2wgaGVhZGVyIGNoYWluLgorRm9yIGV4YW1wbGUsCisuaW4gKy41aQorLm5mCitcZkJpcDYgcHJvdG9jaGFpbiA2XGZSCisuZmkKKy5pbiAtLjVpCittYXRjaGVzIGFueSBJUHY2IHBhY2tldCB3aXRoIFRDUCBwcm90b2NvbCBoZWFkZXIgaW4gdGhlIHByb3RvY29sIGhlYWRlciBjaGFpbi4KK1RoZSBwYWNrZXQgbWF5IGNvbnRhaW4sIGZvciBleGFtcGxlLAorYXV0aGVudGljYXRpb24gaGVhZGVyLCByb3V0aW5nIGhlYWRlciwgb3IgaG9wLWJ5LWhvcCBvcHRpb24gaGVhZGVyLAorYmV0d2VlbiBJUHY2IGhlYWRlciBhbmQgVENQIGhlYWRlci4KK1RoZSBCUEYgY29kZSBlbWl0dGVkIGJ5IHRoaXMgcHJpbWl0aXZlIGlzIGNvbXBsZXggYW5kCitjYW5ub3QgYmUgb3B0aW1pemVkIGJ5IHRoZSBCUEYgb3B0aW1pemVyIGNvZGUsIHNvIHRoaXMgY2FuIGJlIHNvbWV3aGF0CitzbG93LgorLklQICJcZkJpcCBwcm90b2NoYWluIFxmSXByb3RvY29sXGZSIgorRXF1aXZhbGVudCB0byBcZkJpcDYgcHJvdG9jaGFpbiBcZklwcm90b2NvbFxmUiwgYnV0IHRoaXMgaXMgZm9yIElQdjQuCisuSVAgIlxmQmV0aGVyIGJyb2FkY2FzdFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBFdGhlcm5ldCBicm9hZGNhc3QgcGFja2V0LgorVGhlIFxmSWV0aGVyXGZQCitrZXl3b3JkIGlzIG9wdGlvbmFsLgorLklQICJcZkJpcCBicm9hZGNhc3RcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSVB2NCBicm9hZGNhc3QgcGFja2V0LgorSXQgY2hlY2tzIGZvciBib3RoIHRoZSBhbGwtemVyb2VzIGFuZCBhbGwtb25lcyBicm9hZGNhc3QgY29udmVudGlvbnMsCithbmQgbG9va3MgdXAgdGhlIHN1Ym5ldCBtYXNrIG9uIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMKK2JlaW5nIGRvbmUuCisuSVAKK0lmIHRoZSBzdWJuZXQgbWFzayBvZiB0aGUgaW50ZXJmYWNlIG9uIHdoaWNoIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUKK2lzIG5vdCBhdmFpbGFibGUsIGVpdGhlciBiZWNhdXNlIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggY2FwdHVyZSBpcyBiZWluZworZG9uZSBoYXMgbm8gbmV0bWFzayBvciBiZWNhdXNlIHRoZSBjYXB0dXJlIGlzIGJlaW5nIGRvbmUgb24gdGhlIExpbnV4CisiYW55IiBpbnRlcmZhY2UsIHdoaWNoIGNhbiBjYXB0dXJlIG9uIG1vcmUgdGhhbiBvbmUgaW50ZXJmYWNlLCB0aGlzCitjaGVjayB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseS4KKy5JUCAiXGZCZXRoZXIgbXVsdGljYXN0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEV0aGVybmV0IG11bHRpY2FzdCBwYWNrZXQuCitUaGUgXGZCZXRoZXJcZlAKK2tleXdvcmQgaXMgb3B0aW9uYWwuCitUaGlzIGlzIHNob3J0aGFuZCBmb3IgYFxmQmV0aGVyWzBdICYgMSAhPSAwXGZQJy4KKy5JUCAiXGZCaXAgbXVsdGljYXN0XGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIElQdjQgbXVsdGljYXN0IHBhY2tldC4KKy5JUCAiXGZCaXA2IG11bHRpY2FzdFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBJUHY2IG11bHRpY2FzdCBwYWNrZXQuCisuSVAgICJcZkJldGhlciBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBvZiBldGhlciB0eXBlIFxmSXByb3RvY29sXGZSLgorXGZJUHJvdG9jb2xcZlAgY2FuIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgbmFtZXMKK1xmQmlwXGZQLCBcZkJpcDZcZlAsIFxmQmFycFxmUCwgXGZCcmFycFxmUCwgXGZCYXRhbGtcZlAsIFxmQmFhcnBcZlAsCitcZkJkZWNuZXRcZlAsIFxmQnNjYVxmUCwgXGZCbGF0XGZQLCBcZkJtb3BkbFxmUCwgXGZCbW9wcmNcZlAsCitcZkJpc29cZlAsIFxmQnN0cFxmUCwgXGZCaXB4XGZQLCBvciBcZkJuZXRiZXVpXGZQLgorTm90ZSB0aGVzZSBpZGVudGlmaWVycyBhcmUgYWxzbyBrZXl3b3JkcworYW5kIG11c3QgYmUgZXNjYXBlZCB2aWEgYmFja3NsYXNoIChcXCkuCisuSVAKK1tJbiB0aGUgY2FzZSBvZiBGRERJIChlLmcuLCBgXGZCZmRkaSBwcm90b2NvbCBhcnBcZlInKSwgVG9rZW4gUmluZworKGUuZy4sIGBcZkJ0ciBwcm90b2NvbCBhcnBcZlInKSwgYW5kIElFRUUgODAyLjExIHdpcmVsZXNzIExBTlMgKGUuZy4sCitgXGZCd2xhbiBwcm90b2NvbCBhcnBcZlInKSwgZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLCB0aGUKK3Byb3RvY29sIGlkZW50aWZpY2F0aW9uIGNvbWVzIGZyb20gdGhlIDgwMi4yIExvZ2ljYWwgTGluayBDb250cm9sIChMTEMpCitoZWFkZXIsIHdoaWNoIGlzIHVzdWFsbHkgbGF5ZXJlZCBvbiB0b3Agb2YgdGhlIEZEREksIFRva2VuIFJpbmcsIG9yCis4MDIuMTEgaGVhZGVyLgorLklQCitXaGVuIGZpbHRlcmluZyBmb3IgbW9zdCBwcm90b2NvbCBpZGVudGlmaWVycyBvbiBGRERJLCBUb2tlbiBSaW5nLCBvcgorODAyLjExLCB0aGUgZmlsdGVyIGNoZWNrcyBvbmx5IHRoZSBwcm90b2NvbCBJRCBmaWVsZCBvZiBhbiBMTEMgaGVhZGVyCitpbiBzby1jYWxsZWQgU05BUCBmb3JtYXQgd2l0aCBhbiBPcmdhbml6YXRpb25hbCBVbml0IElkZW50aWZpZXIgKE9VSSkgb2YKKzB4MDAwMDAwLCBmb3IgZW5jYXBzdWxhdGVkIEV0aGVybmV0OyBpdCBkb2Vzbid0IGNoZWNrIHdoZXRoZXIgdGhlIHBhY2tldAoraXMgaW4gU05BUCBmb3JtYXQgd2l0aCBhbiBPVUkgb2YgMHgwMDAwMDAuCitUaGUgZXhjZXB0aW9ucyBhcmU6CisuUlMKKy5UUAorXGZCaXNvXGZQCit0aGUgZmlsdGVyIGNoZWNrcyB0aGUgRFNBUCAoRGVzdGluYXRpb24gU2VydmljZSBBY2Nlc3MgUG9pbnQpIGFuZAorU1NBUCAoU291cmNlIFNlcnZpY2UgQWNjZXNzIFBvaW50KSBmaWVsZHMgb2YgdGhlIExMQyBoZWFkZXI7CisuVFAKK1xmQnN0cFxmUCBhbmQgXGZCbmV0YmV1aVxmUAordGhlIGZpbHRlciBjaGVja3MgdGhlIERTQVAgb2YgdGhlIExMQyBoZWFkZXI7CisuVFAKK1xmQmF0YWxrXGZQCit0aGUgZmlsdGVyIGNoZWNrcyBmb3IgYSBTTkFQLWZvcm1hdCBwYWNrZXQgd2l0aCBhbiBPVUkgb2YgMHgwODAwMDcKK2FuZCB0aGUgQXBwbGVUYWxrIGV0eXBlLgorLlJFCisuSVAKK0luIHRoZSBjYXNlIG9mIEV0aGVybmV0LCB0aGUgZmlsdGVyIGNoZWNrcyB0aGUgRXRoZXJuZXQgdHlwZSBmaWVsZAorZm9yIG1vc3Qgb2YgdGhvc2UgcHJvdG9jb2xzLiAgVGhlIGV4Y2VwdGlvbnMgYXJlOgorLlJTCisuVFAKK1xmQmlzb1xmUCwgXGZCc3RwXGZQLCBhbmQgXGZCbmV0YmV1aVxmUAordGhlIGZpbHRlciBjaGVja3MgZm9yIGFuIDgwMi4zIGZyYW1lIGFuZCB0aGVuIGNoZWNrcyB0aGUgTExDIGhlYWRlciBhcworaXQgZG9lcyBmb3IgRkRESSwgVG9rZW4gUmluZywgYW5kIDgwMi4xMTsKKy5UUAorXGZCYXRhbGtcZlAKK3RoZSBmaWx0ZXIgY2hlY2tzIGJvdGggZm9yIHRoZSBBcHBsZVRhbGsgZXR5cGUgaW4gYW4gRXRoZXJuZXQgZnJhbWUgYW5kCitmb3IgYSBTTkFQLWZvcm1hdCBwYWNrZXQgYXMgaXQgZG9lcyBmb3IgRkRESSwgVG9rZW4gUmluZywgYW5kIDgwMi4xMTsKKy5UUAorXGZCYWFycFxmUAordGhlIGZpbHRlciBjaGVja3MgZm9yIHRoZSBBcHBsZVRhbGsgQVJQIGV0eXBlIGluIGVpdGhlciBhbiBFdGhlcm5ldAorZnJhbWUgb3IgYW4gODAyLjIgU05BUCBmcmFtZSB3aXRoIGFuIE9VSSBvZiAweDAwMDAwMDsKKy5UUAorXGZCaXB4XGZQCit0aGUgZmlsdGVyIGNoZWNrcyBmb3IgdGhlIElQWCBldHlwZSBpbiBhbiBFdGhlcm5ldCBmcmFtZSwgdGhlIElQWAorRFNBUCBpbiB0aGUgTExDIGhlYWRlciwgdGhlIDgwMi4zLXdpdGgtbm8tTExDLWhlYWRlciBlbmNhcHN1bGF0aW9uIG9mCitJUFgsIGFuZCB0aGUgSVBYIGV0eXBlIGluIGEgU05BUCBmcmFtZS4KKy5SRQorLklQICJcZkJkZWNuZXQgc3JjIFxmSWhvc3RcZlIiCitUcnVlIGlmIHRoZSBERUNORVQgc291cmNlIGFkZHJlc3MgaXMKKy5JUiBob3N0ICwKK3doaWNoIG1heSBiZSBhbiBhZGRyZXNzIG9mIHRoZSBmb3JtIGBgMTAuMTIzJycsIG9yIGEgREVDTkVUIGhvc3QKK25hbWUuCitbREVDTkVUIGhvc3QgbmFtZSBzdXBwb3J0IGlzIG9ubHkgYXZhaWxhYmxlIG9uIFVMVFJJWCBzeXN0ZW1zCit0aGF0IGFyZSBjb25maWd1cmVkIHRvIHJ1biBERUNORVQuXQorLklQICJcZkJkZWNuZXQgZHN0IFxmSWhvc3RcZlIiCitUcnVlIGlmIHRoZSBERUNORVQgZGVzdGluYXRpb24gYWRkcmVzcyBpcworLklSIGhvc3QgLgorLklQICJcZkJkZWNuZXQgaG9zdCBcZklob3N0XGZSIgorVHJ1ZSBpZiBlaXRoZXIgdGhlIERFQ05FVCBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYWRkcmVzcyBpcworLklSIGhvc3QgLgorLklQICJcZkJpZm5hbWUgXGZJaW50ZXJmYWNlXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgYXMgY29taW5nIGZyb20gdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgKGFwcGxpZXMKK29ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzIG9yIEZyZWVCU0QncworLkJSIHBmICg0KSkuCisuSVAgIlxmQm9uIFxmSWludGVyZmFjZVxmUiIKK1N5bm9ueW1vdXMgd2l0aCB0aGUKKy5CIGlmbmFtZQorbW9kaWZpZXIuCisuSVAgIlxmQnJuciBcZkludW1cZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZCBhcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFBGIHJ1bGUgbnVtYmVyCisoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5IE9wZW5CU0QncyBvciBGcmVlQlNEJ3MKKy5CUiBwZiAoNCkpLgorLklQICJcZkJydWxlbnVtIFxmSW51bVxmUiIKK1N5bm9ueW1vdXMgd2l0aCB0aGUKKy5CIHJucgorbW9kaWZpZXIuCisuSVAgIlxmQnJlYXNvbiBcZkljb2RlXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgd2l0aCB0aGUgc3BlY2lmaWVkIFBGIHJlYXNvbiBjb2RlLiAgVGhlIGtub3duCitjb2RlcyBhcmU6CisuQlIgbWF0Y2ggLAorLkJSIGJhZC1vZmZzZXQgLAorLkJSIGZyYWdtZW50ICwKKy5CUiBzaG9ydCAsCisuQlIgbm9ybWFsaXplICwKK2FuZAorLkIgbWVtb3J5CisoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5IE9wZW5CU0QncyBvciBGcmVlQlNEJ3MKKy5CUiBwZiAoNCkpLgorLklQICJcZkJyc2V0IFxmSW5hbWVcZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZCBhcyBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFBGIHJ1bGVzZXQKK25hbWUgb2YgYW4gYW5jaG9yZWQgcnVsZXNldCAoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5IE9wZW5CU0Qncworb3IgRnJlZUJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCcnVsZXNldCBcZkluYW1lXGZSIgorU3lub25vbW91cyB3aXRoIHRoZQorLkIgcnNldAorbW9kaWZpZXIuCisuSVAgIlxmQnNybnIgXGZJbnVtXGZSIgorVHJ1ZSBpZiB0aGUgcGFja2V0IHdhcyBsb2dnZWQgYXMgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBQRiBydWxlIG51bWJlcgorb2YgYW4gYW5jaG9yZWQgcnVsZXNldCAoYXBwbGllcyBvbmx5IHRvIHBhY2tldHMgbG9nZ2VkIGJ5IE9wZW5CU0QncyBvcgorRnJlZUJTRCdzCisuQlIgcGYgKDQpKS4KKy5JUCAiXGZCc3VicnVsZW51bSBcZkludW1cZlIiCitTeW5vbm9tb3VzIHdpdGggdGhlCisuQiBzcm5yCittb2RpZmllci4KKy5JUCAiXGZCYWN0aW9uIFxmSWFjdFxmUiIKK1RydWUgaWYgUEYgdG9vayB0aGUgc3BlY2lmaWVkIGFjdGlvbiB3aGVuIHRoZSBwYWNrZXQgd2FzIGxvZ2dlZC4gIEtub3duIGFjdGlvbnMKK2FyZToKKy5CIHBhc3MKK2FuZAorLkIgYmxvY2sKK2FuZCwgd2l0aCBsYXRlciB2ZXJzaW9ucyBvZgorLkJSIHBmICg0KSksCisuQlIgbmF0ICwKKy5CUiByZHIgLAorLkIgYmluYXQKK2FuZAorLkIgc2NydWIKKyhhcHBsaWVzIG9ubHkgdG8gcGFja2V0cyBsb2dnZWQgYnkgT3BlbkJTRCdzIG9yIEZyZWVCU0QncworLkJSIHBmICg0KSkuCisuSVAgIlxmQndsYW4gcmEgXGZJZWhvc3RcZlIiCitUcnVlIGlmIHRoZSBJRUVFIDgwMi4xMSBSQSBpcworLklSIGVob3N0IC4KK1RoZSBSQSBmaWVsZCBpcyB1c2VkIGluIGFsbCBmcmFtZXMgZXhjZXB0IGZvciBtYW5hZ2VtZW50IGZyYW1lcy4KKy5JUCAiXGZCd2xhbiB0YSBcZkllaG9zdFxmUiIKK1RydWUgaWYgdGhlIElFRUUgODAyLjExIFRBIGlzCisuSVIgZWhvc3QgLgorVGhlIFRBIGZpZWxkIGlzIHVzZWQgaW4gYWxsIGZyYW1lcyBleGNlcHQgZm9yIG1hbmFnZW1lbnQgZnJhbWVzIGFuZAorQ1RTIChDbGVhciBUbyBTZW5kKSBhbmQgQUNLIChBY2tub3dsZWRnbWVudCkgY29udHJvbCBmcmFtZXMuCisuSVAgIlxmQndsYW4gYWRkcjEgXGZJZWhvc3RcZlIiCitUcnVlIGlmIHRoZSBmaXJzdCBJRUVFIDgwMi4xMSBhZGRyZXNzIGlzCisuSVIgZWhvc3QgLgorLklQICJcZkJ3bGFuIGFkZHIyIFxmSWVob3N0XGZSIgorVHJ1ZSBpZiB0aGUgc2Vjb25kIElFRUUgODAyLjExIGFkZHJlc3MsIGlmIHByZXNlbnQsIGlzCisuSVIgZWhvc3QgLgorVGhlIHNlY29uZCBhZGRyZXNzIGZpZWxkIGlzIHVzZWQgaW4gYWxsIGZyYW1lcyBleGNlcHQgZm9yIENUUyAoQ2xlYXIgVG8KK1NlbmQpIGFuZCBBQ0sgKEFja25vd2xlZGdtZW50KSBjb250cm9sIGZyYW1lcy4KKy5JUCAiXGZCd2xhbiBhZGRyMyBcZkllaG9zdFxmUiIKK1RydWUgaWYgdGhlIHRoaXJkIElFRUUgODAyLjExIGFkZHJlc3MsIGlmIHByZXNlbnQsIGlzCisuSVIgZWhvc3QgLgorVGhlIHRoaXJkIGFkZHJlc3MgZmllbGQgaXMgdXNlZCBpbiBtYW5hZ2VtZW50IGFuZCBkYXRhIGZyYW1lcywgYnV0IG5vdAoraW4gY29udHJvbCBmcmFtZXMuCisuSVAgIlxmQndsYW4gYWRkcjQgXGZJZWhvc3RcZlIiCitUcnVlIGlmIHRoZSBmb3VydGggSUVFRSA4MDIuMTEgYWRkcmVzcywgaWYgcHJlc2VudCwgaXMKKy5JUiBlaG9zdCAuCitUaGUgZm91cnRoIGFkZHJlc3MgZmllbGQgaXMgb25seSB1c2VkIGZvcgorV0RTIChXaXJlbGVzcyBEaXN0cmlidXRpb24gU3lzdGVtKSBmcmFtZXMuCisuSVAgIlxmQmlwXGZSLCBcZkJpcDZcZlIsIFxmQmFycFxmUiwgXGZCcmFycFxmUiwgXGZCYXRhbGtcZlIsIFxmQmFhcnBcZlIsIFxmQmRlY25ldFxmUiwgXGZCaXNvXGZSLCBcZkJzdHBcZlIsIFxmQmlweFxmUiwgXGZCbmV0YmV1aVxmUCIKK0FiYnJldmlhdGlvbnMgZm9yOgorLmluICsuNWkKKy5uZgorXGZCZXRoZXIgcHJvdG8gXGZJcFxmUgorLmZpCisuaW4gLS41aQord2hlcmUgXGZJcFxmUiBpcyBvbmUgb2YgdGhlIGFib3ZlIHByb3RvY29scy4KKy5JUCAiXGZCbGF0XGZSLCBcZkJtb3ByY1xmUiwgXGZCbW9wZGxcZlIiCitBYmJyZXZpYXRpb25zIGZvcjoKKy5pbiArLjVpCisubmYKK1xmQmV0aGVyIHByb3RvIFxmSXBcZlIKKy5maQorLmluIC0uNWkKK3doZXJlIFxmSXBcZlIgaXMgb25lIG9mIHRoZSBhYm92ZSBwcm90b2NvbHMuCitOb3RlIHRoYXQgbm90IGFsbCBhcHBsaWNhdGlvbnMgdXNpbmcKKy5CUiBwY2FwICgzKQorY3VycmVudGx5IGtub3cgaG93IHRvIHBhcnNlIHRoZXNlIHByb3RvY29scy4KKy5JUCAiXGZCdHlwZSBcZkl3bGFuX3R5cGVcZlIiCitUcnVlIGlmIHRoZSBJRUVFIDgwMi4xMSBmcmFtZSB0eXBlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBcZkl3bGFuX3R5cGVcZlIuCitWYWxpZCBcZkl3bGFuX3R5cGVcZlJzIGFyZToKK1xmQm1ndFxmUCwKK1xmQmN0bFxmUAorYW5kIFxmQmRhdGFcZlAuCisuSVAgIlxmQnR5cGUgXGZJd2xhbl90eXBlIFxmQnN1YnR5cGUgXGZJd2xhbl9zdWJ0eXBlXGZSIgorVHJ1ZSBpZiB0aGUgSUVFRSA4MDIuMTEgZnJhbWUgdHlwZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl90eXBlXGZSCithbmQgZnJhbWUgc3VidHlwZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl9zdWJ0eXBlXGZSLgorLklQCitJZiB0aGUgc3BlY2lmaWVkIFxmSXdsYW5fdHlwZVxmUiBpcyBcZkJtZ3RcZlAsCit0aGVuIHZhbGlkIFxmSXdsYW5fc3VidHlwZVxmUnMgYXJlOgorXGZCYXNzb2MtcmVxXGZQLAorXGZCYXNzb2MtcmVzcFxmUCwKK1xmQnJlYXNzb2MtcmVxXGZQLAorXGZCcmVhc3NvYy1yZXNwXGZQLAorXGZCcHJvYmUtcmVxXGZQLAorXGZCcHJvYmUtcmVzcFxmUCwKK1xmQmJlYWNvblxmUCwKK1xmQmF0aW1cZlAsCitcZkJkaXNhc3NvY1xmUCwKK1xmQmF1dGhcZlAgYW5kCitcZkJkZWF1dGhcZlAuCisuSVAKK0lmIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl90eXBlXGZSIGlzIFxmQmN0bFxmUCwKK3RoZW4gdmFsaWQgXGZJd2xhbl9zdWJ0eXBlXGZScyBhcmU6CitcZkJwcy1wb2xsXGZQLAorXGZCcnRzXGZQLAorXGZCY3RzXGZQLAorXGZCYWNrXGZQLAorXGZCY2YtZW5kXGZQIGFuZAorXGZCY2YtZW5kLWFja1xmUC4KKy5JUAorSWYgdGhlIHNwZWNpZmllZCBcZkl3bGFuX3R5cGVcZlIgaXMgXGZCZGF0YVxmUCwKK3RoZW4gdmFsaWQgXGZJd2xhbl9zdWJ0eXBlXGZScyBhcmU6CitcZkJkYXRhXGZQLAorXGZCZGF0YS1jZi1hY2tcZlAsCitcZkJkYXRhLWNmLXBvbGxcZlAsCitcZkJkYXRhLWNmLWFjay1wb2xsXGZQLAorXGZCbnVsbFxmUCwKK1xmQmNmLWFja1xmUCwKK1xmQmNmLXBvbGxcZlAsCitcZkJjZi1hY2stcG9sbFxmUCwKK1xmQnFvcy1kYXRhXGZQLAorXGZCcW9zLWRhdGEtY2YtYWNrXGZQLAorXGZCcW9zLWRhdGEtY2YtcG9sbFxmUCwKK1xmQnFvcy1kYXRhLWNmLWFjay1wb2xsXGZQLAorXGZCcW9zXGZQLAorXGZCcW9zLWNmLXBvbGxcZlAgYW5kCitcZkJxb3MtY2YtYWNrLXBvbGxcZlAuCisuSVAgIlxmQnN1YnR5cGUgXGZJd2xhbl9zdWJ0eXBlXGZSIgorVHJ1ZSBpZiB0aGUgSUVFRSA4MDIuMTEgZnJhbWUgc3VidHlwZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl9zdWJ0eXBlXGZSCithbmQgZnJhbWUgaGFzIHRoZSB0eXBlIHRvIHdoaWNoIHRoZSBzcGVjaWZpZWQgXGZJd2xhbl9zdWJ0eXBlXGZSIGJlbG9uZ3MuCisuSVAgIlxmQmRpciBcZklkaXJcZlIiCitUcnVlIGlmIHRoZSBJRUVFIDgwMi4xMSBmcmFtZSBkaXJlY3Rpb24gbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCisuSVIgZGlyIC4KK1ZhbGlkIGRpcmVjdGlvbnMgYXJlOgorLkJSIG5vZHMgLAorLkJSIHRvZHMgLAorLkJSIGZyb21kcyAsCisuQlIgZHN0b2RzICwKK29yIGEgbnVtZXJpYyB2YWx1ZS4KKy5JUCAiXGZCdmxhbiBcZklbdmxhbl9pZF1cZlIiCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gSUVFRSA4MDIuMVEgVkxBTiBwYWNrZXQuCitJZiBcZklbdmxhbl9pZF1cZlIgaXMgc3BlY2lmaWVkLCBvbmx5IHRydWUgaWYgdGhlIHBhY2tldCBoYXMgdGhlIHNwZWNpZmllZAorXGZJdmxhbl9pZFxmUi4KK05vdGUgdGhhdCB0aGUgZmlyc3QgXGZCdmxhblxmUiBrZXl3b3JkIGVuY291bnRlcmVkIGluIFxmSWV4cHJlc3Npb25cZlIKK2NoYW5nZXMgdGhlIGRlY29kaW5nIG9mZnNldHMgZm9yIHRoZSByZW1haW5kZXIgb2YgXGZJZXhwcmVzc2lvblxmUiBvbgordGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGEgVkxBTiBwYWNrZXQuICBUaGUgXGZCdmxhbgorXGZJW3ZsYW5faWRdXGZSIGV4cHJlc3Npb24gbWF5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UsIHRvIGZpbHRlciBvbiBWTEFOCitoaWVyYXJjaGllcy4gIEVhY2ggdXNlIG9mIHRoYXQgZXhwcmVzc2lvbiBpbmNyZW1lbnRzIHRoZSBmaWx0ZXIgb2Zmc2V0cworYnkgNC4KKy5JUAorRm9yIGV4YW1wbGU6CisuaW4gKy41aQorLm5mCitcZkJ2bGFuIDEwMCAmJiB2bGFuIDIwMFxmUgorLmZpCisuaW4gLS41aQorZmlsdGVycyBvbiBWTEFOIDIwMCBlbmNhcHN1bGF0ZWQgd2l0aGluIFZMQU4gMTAwLCBhbmQKKy5pbiArLjVpCisubmYKK1xmQnZsYW4gJiYgdmxhbiAzMDAgJiYgaXBcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgSVB2NCBwcm90b2NvbHMgZW5jYXBzdWxhdGVkIGluIFZMQU4gMzAwIGVuY2Fwc3VsYXRlZCB3aXRoaW4gYW55CitoaWdoZXIgb3JkZXIgVkxBTi4KKy5JUCAiXGZCbXBscyBcZklbbGFiZWxfbnVtXVxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBNUExTIHBhY2tldC4KK0lmIFxmSVtsYWJlbF9udW1dXGZSIGlzIHNwZWNpZmllZCwgb25seSB0cnVlIGlzIHRoZSBwYWNrZXQgaGFzIHRoZSBzcGVjaWZpZWQKK1xmSWxhYmVsX251bVxmUi4KK05vdGUgdGhhdCB0aGUgZmlyc3QgXGZCbXBsc1xmUiBrZXl3b3JkIGVuY291bnRlcmVkIGluIFxmSWV4cHJlc3Npb25cZlIKK2NoYW5nZXMgdGhlIGRlY29kaW5nIG9mZnNldHMgZm9yIHRoZSByZW1haW5kZXIgb2YgXGZJZXhwcmVzc2lvblxmUiBvbgordGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgcGFja2V0IGlzIGEgTVBMUy1lbmNhcHN1bGF0ZWQgSVAgcGFja2V0LiAgVGhlCitcZkJtcGxzIFxmSVtsYWJlbF9udW1dXGZSIGV4cHJlc3Npb24gbWF5IGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UsIHRvCitmaWx0ZXIgb24gTVBMUyBoaWVyYXJjaGllcy4gIEVhY2ggdXNlIG9mIHRoYXQgZXhwcmVzc2lvbiBpbmNyZW1lbnRzIHRoZQorZmlsdGVyIG9mZnNldHMgYnkgNC4gCisuSVAKK0ZvciBleGFtcGxlOgorLmluICsuNWkKKy5uZgorXGZCbXBscyAxMDAwMDAgJiYgbXBscyAxMDI0XGZSCisuZmkKKy5pbiAtLjVpCitmaWx0ZXJzIHBhY2tldHMgd2l0aCBhbiBvdXRlciBsYWJlbCBvZiAxMDAwMDAgYW5kIGFuIGlubmVyIGxhYmVsIG9mCisxMDI0LCBhbmQKKy5pbiArLjVpCisubmYKK1xmQm1wbHMgJiYgbXBscyAxMDI0ICYmIGhvc3QgMTkyLjkuMjAwLjFcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgcGFja2V0cyB0byBvciBmcm9tIDE5Mi45LjIwMC4xIHdpdGggYW4gaW5uZXIgbGFiZWwgb2YgMTAyNCBhbmQKK2FueSBvdXRlciBsYWJlbC4KKy5JUCBcZkJwcHBvZWRcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhIFBQUC1vdmVyLUV0aGVybmV0IERpc2NvdmVyeSBwYWNrZXQgKEV0aGVybmV0Cit0eXBlIDB4ODg2MykuCisuSVAgXGZCcHBwb2VzXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYSBQUFAtb3Zlci1FdGhlcm5ldCBTZXNzaW9uIHBhY2tldCAoRXRoZXJuZXQKK3R5cGUgMHg4ODY0KS4KK05vdGUgdGhhdCB0aGUgZmlyc3QgXGZCcHBwb2VzXGZSIGtleXdvcmQgZW5jb3VudGVyZWQgaW4gXGZJZXhwcmVzc2lvblxmUgorY2hhbmdlcyB0aGUgZGVjb2Rpbmcgb2Zmc2V0cyBmb3IgdGhlIHJlbWFpbmRlciBvZiBcZklleHByZXNzaW9uXGZSIG9uCit0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgYSBQUFBvRSBzZXNzaW9uIHBhY2tldC4KKy5JUAorRm9yIGV4YW1wbGU6CisuaW4gKy41aQorLm5mCitcZkJwcHBvZXMgJiYgaXBcZlIKKy5maQorLmluIC0uNWkKK2ZpbHRlcnMgSVB2NCBwcm90b2NvbHMgZW5jYXBzdWxhdGVkIGluIFBQUG9FLgorLklQICAiXGZCdGNwXGZSLCBcZkJ1ZHBcZlIsIFxmQmljbXBcZlIiCitBYmJyZXZpYXRpb25zIGZvcjoKKy5pbiArLjVpCisubmYKK1xmQmlwIHByb3RvIFxmSXBcZlJcZkIgb3IgaXA2IHByb3RvIFxmSXBcZlIKKy5maQorLmluIC0uNWkKK3doZXJlIFxmSXBcZlIgaXMgb25lIG9mIHRoZSBhYm92ZSBwcm90b2NvbHMuCisuSVAgIlxmQmlzbyBwcm90byBcZklwcm90b2NvbFxmUiIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBPU0kgcGFja2V0IG9mIHByb3RvY29sIHR5cGUgXGZJcHJvdG9jb2xcZlAuCitcZklQcm90b2NvbFxmUCBjYW4gYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBuYW1lcworXGZCY2xucFxmUCwgXGZCZXNpc1xmUCwgb3IgXGZCaXNpc1xmUC4KKy5JUCAiXGZCY2xucFxmUiwgXGZCZXNpc1xmUiwgXGZCaXNpc1xmUiIKK0FiYnJldmlhdGlvbnMgZm9yOgorLmluICsuNWkKKy5uZgorXGZCaXNvIHByb3RvIFxmSXBcZlIKKy5maQorLmluIC0uNWkKK3doZXJlIFxmSXBcZlIgaXMgb25lIG9mIHRoZSBhYm92ZSBwcm90b2NvbHMuCisuSVAgIlxmQmwxXGZSLCBcZkJsMlxmUiwgXGZCaWloXGZSLCBcZkJsc3BcZlIsIFxmQnNucFxmUiwgXGZCY3NucFxmUiwgXGZCcHNucFxmUiIKK0FiYnJldmlhdGlvbnMgZm9yIElTLUlTIFBEVSB0eXBlcy4KKy5JUCAiXGZCdnBpXGZQIFxmSW5cZlIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIHdpdGggYQordmlydHVhbCBwYXRoIGlkZW50aWZpZXIgb2YKKy5JUiBuIC4KKy5JUCAiXGZCdmNpXGZQIFxmSW5cZlIKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIHdpdGggYQordmlydHVhbCBjaGFubmVsIGlkZW50aWZpZXIgb2YKKy5JUiBuIC4KKy5JUCBcZkJsYW5lXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK2FuIEFUTSBMQU5FIHBhY2tldC4KK05vdGUgdGhhdCB0aGUgZmlyc3QgXGZCbGFuZVxmUiBrZXl3b3JkIGVuY291bnRlcmVkIGluIFxmSWV4cHJlc3Npb25cZlIKK2NoYW5nZXMgdGhlIHRlc3RzIGRvbmUgaW4gdGhlIHJlbWFpbmRlciBvZiBcZklleHByZXNzaW9uXGZSCitvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBwYWNrZXQgaXMgZWl0aGVyIGEgTEFORSBlbXVsYXRlZCBFdGhlcm5ldAorcGFja2V0IG9yIGEgTEFORSBMRSBDb250cm9sIHBhY2tldC4gIElmIFxmQmxhbmVcZlIgaXNuJ3Qgc3BlY2lmaWVkLCB0aGUKK3Rlc3RzIGFyZSBkb25lIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHBhY2tldCBpcyBhbgorTExDLWVuY2Fwc3VsYXRlZCBwYWNrZXQuCisuSVAgXGZCbGxjXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK2FuIExMQy1lbmNhcHN1bGF0ZWQgcGFja2V0LgorLklQIFxmQm9hbWY0c1xmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCithIHNlZ21lbnQgT0FNIEY0IGZsb3cgY2VsbCAoVlBJPTAgJiBWQ0k9MykuCisuSVAgXGZCb2FtZjRlXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK2FuIGVuZC10by1lbmQgT0FNIEY0IGZsb3cgY2VsbCAoVlBJPTAgJiBWQ0k9NCkuCisuSVAgXGZCb2FtZjRcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworYSBzZWdtZW50IG9yIGVuZC10by1lbmQgT0FNIEY0IGZsb3cgY2VsbCAoVlBJPTAgJiAoVkNJPTMgfCBWQ0k9NCkpLgorLklQIFxmQm9hbVxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCithIHNlZ21lbnQgb3IgZW5kLXRvLWVuZCBPQU0gRjQgZmxvdyBjZWxsIChWUEk9MCAmIChWQ0k9MyB8IFZDST00KSkuCisuSVAgXGZCbWV0YWNcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworb24gYSBtZXRhIHNpZ25hbGluZyBjaXJjdWl0IChWUEk9MCAmIFZDST0xKS4KKy5JUCBcZkJiY2NcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworb24gYSBicm9hZGNhc3Qgc2lnbmFsaW5nIGNpcmN1aXQgKFZQST0wICYgVkNJPTIpLgorLklQIFxmQnNjXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGEgc2lnbmFsaW5nIGNpcmN1aXQgKFZQST0wICYgVkNJPTUpLgorLklQIFxmQmlsbWljXGZQCitUcnVlIGlmIHRoZSBwYWNrZXQgaXMgYW4gQVRNIHBhY2tldCwgZm9yIFN1bkFUTSBvbiBTb2xhcmlzLCBhbmQgaXMKK29uIGFuIElMTUkgY2lyY3VpdCAoVlBJPTAgJiBWQ0k9MTYpLgorLklQIFxmQmNvbm5lY3Rtc2dcZlAKK1RydWUgaWYgdGhlIHBhY2tldCBpcyBhbiBBVE0gcGFja2V0LCBmb3IgU3VuQVRNIG9uIFNvbGFyaXMsIGFuZCBpcworb24gYSBzaWduYWxpbmcgY2lyY3VpdCBhbmQgaXMgYSBRLjI5MzEgU2V0dXAsIENhbGwgUHJvY2VlZGluZywgQ29ubmVjdCwKK0Nvbm5lY3QgQWNrLCBSZWxlYXNlLCBvciBSZWxlYXNlIERvbmUgbWVzc2FnZS4KKy5JUCBcZkJtZXRhY29ubmVjdFxmUAorVHJ1ZSBpZiB0aGUgcGFja2V0IGlzIGFuIEFUTSBwYWNrZXQsIGZvciBTdW5BVE0gb24gU29sYXJpcywgYW5kIGlzCitvbiBhIG1ldGEgc2lnbmFsaW5nIGNpcmN1aXQgYW5kIGlzIGEgUS4yOTMxIFNldHVwLCBDYWxsIFByb2NlZWRpbmcsIENvbm5lY3QsCitSZWxlYXNlLCBvciBSZWxlYXNlIERvbmUgbWVzc2FnZS4KKy5JUCAgIlxmSWV4cHIgcmVsb3AgZXhwclxmUiIKK1RydWUgaWYgdGhlIHJlbGF0aW9uIGhvbGRzLCB3aGVyZSBcZklyZWxvcFxmUiBpcyBvbmUgb2YgPiwgPCwgPj0sIDw9LCA9LAorIT0sIGFuZCBcZklleHByXGZSIGlzIGFuIGFyaXRobWV0aWMgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiBpbnRlZ2VyCitjb25zdGFudHMgKGV4cHJlc3NlZCBpbiBzdGFuZGFyZCBDIHN5bnRheCksIHRoZSBub3JtYWwgYmluYXJ5IG9wZXJhdG9ycworWyssIC0sICosIC8sICYsIHwsIDw8LCA+Pl0sIGEgbGVuZ3RoIG9wZXJhdG9yLCBhbmQgc3BlY2lhbCBwYWNrZXQgZGF0YQorYWNjZXNzb3JzLiAgTm90ZSB0aGF0IGFsbCBjb21wYXJpc29ucyBhcmUgdW5zaWduZWQsIHNvIHRoYXQsIGZvciBleGFtcGxlLAorMHg4MDAwMDAwMCBhbmQgMHhmZmZmZmZmZiBhcmUgPiAwLgorVG8gYWNjZXNzCitkYXRhIGluc2lkZSB0aGUgcGFja2V0LCB1c2UgdGhlIGZvbGxvd2luZyBzeW50YXg6CisuaW4gKy41aQorLm5mCitcZklwcm90b1xmQiBbIFxmSWV4cHJcZkIgOiBcZklzaXplXGZCIF1cZlIKKy5maQorLmluIC0uNWkKK1xmSVByb3RvXGZSIGlzIG9uZSBvZiBcZkJldGhlciwgZmRkaSwgdHIsIHdsYW4sIHBwcCwgc2xpcCwgbGluaywKK2lwLCBhcnAsIHJhcnAsIHRjcCwgdWRwLCBpY21wLCBpcDZcZlIgb3IgXGZCcmFkaW9cZlIsIGFuZAoraW5kaWNhdGVzIHRoZSBwcm90b2NvbCBsYXllciBmb3IgdGhlIGluZGV4IG9wZXJhdGlvbi4KKyhcZkJldGhlciwgZmRkaSwgd2xhbiwgdHIsIHBwcCwgc2xpcFxmUiBhbmQgXGZCbGlua1xmUiBhbGwgcmVmZXIgdG8gdGhlCitsaW5rIGxheWVyLiBcZkJyYWRpb1xmUiByZWZlcnMgdG8gdGhlICJyYWRpbyBoZWFkZXIiIGFkZGVkIHRvIHNvbWUKKzgwMi4xMSBjYXB0dXJlcy4pCitOb3RlIHRoYXQgXGZJdGNwLCB1ZHBcZlIgYW5kIG90aGVyIHVwcGVyLWxheWVyIHByb3RvY29sIHR5cGVzIG9ubHkKK2FwcGx5IHRvIElQdjQsIG5vdCBJUHY2ICh0aGlzIHdpbGwgYmUgZml4ZWQgaW4gdGhlIGZ1dHVyZSkuCitUaGUgYnl0ZSBvZmZzZXQsIHJlbGF0aXZlIHRvIHRoZSBpbmRpY2F0ZWQgcHJvdG9jb2wgbGF5ZXIsIGlzCitnaXZlbiBieSBcZklleHByXGZSLgorXGZJU2l6ZVxmUiBpcyBvcHRpb25hbCBhbmQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCitmaWVsZCBvZiBpbnRlcmVzdDsgaXQgY2FuIGJlIGVpdGhlciBvbmUsIHR3bywgb3IgZm91ciwgYW5kIGRlZmF1bHRzIHRvIG9uZS4KK1RoZSBsZW5ndGggb3BlcmF0b3IsIGluZGljYXRlZCBieSB0aGUga2V5d29yZCBcZkJsZW5cZlAsIGdpdmVzIHRoZQorbGVuZ3RoIG9mIHRoZSBwYWNrZXQuCisKK0ZvciBleGFtcGxlLCBgXGZCZXRoZXJbMF0gJiAxICE9IDBcZlAnIGNhdGNoZXMgYWxsIG11bHRpY2FzdCB0cmFmZmljLgorVGhlIGV4cHJlc3Npb24gYFxmQmlwWzBdICYgMHhmICE9IDVcZlAnCitjYXRjaGVzIGFsbCBJUHY0IHBhY2tldHMgd2l0aCBvcHRpb25zLgorVGhlIGV4cHJlc3Npb24KK2BcZkJpcFs2OjJdICYgMHgxZmZmID0gMFxmUCcKK2NhdGNoZXMgb25seSB1bmZyYWdtZW50ZWQgSVB2NCBkYXRhZ3JhbXMgYW5kIGZyYWcgemVybyBvZiBmcmFnbWVudGVkCitJUHY0IGRhdGFncmFtcy4KK1RoaXMgY2hlY2sgaXMgaW1wbGljaXRseSBhcHBsaWVkIHRvIHRoZSBcZkJ0Y3BcZlAgYW5kIFxmQnVkcFxmUAoraW5kZXggb3BlcmF0aW9ucy4KK0ZvciBpbnN0YW5jZSwgXGZCdGNwWzBdXGZQIGFsd2F5cyBtZWFucyB0aGUgZmlyc3QKK2J5dGUgb2YgdGhlIFRDUCBcZkloZWFkZXJcZlAsIGFuZCBuZXZlciBtZWFucyB0aGUgZmlyc3QgYnl0ZSBvZiBhbgoraW50ZXJ2ZW5pbmcgZnJhZ21lbnQuCisKK1NvbWUgb2Zmc2V0cyBhbmQgZmllbGQgdmFsdWVzIG1heSBiZSBleHByZXNzZWQgYXMgbmFtZXMgcmF0aGVyIHRoYW4KK2FzIG51bWVyaWMgdmFsdWVzLgorVGhlIGZvbGxvd2luZyBwcm90b2NvbCBoZWFkZXIgZmllbGQgb2Zmc2V0cyBhcmUKK2F2YWlsYWJsZTogXGZCaWNtcHR5cGVcZlAgKElDTVAgdHlwZSBmaWVsZCksIFxmQmljbXBjb2RlXGZQIChJQ01QCitjb2RlIGZpZWxkKSwgYW5kIFxmQnRjcGZsYWdzXGZQIChUQ1AgZmxhZ3MgZmllbGQpLgorCitUaGUgZm9sbG93aW5nIElDTVAgdHlwZSBmaWVsZCB2YWx1ZXMgYXJlIGF2YWlsYWJsZTogXGZCaWNtcC1lY2hvcmVwbHlcZlAsCitcZkJpY21wLXVucmVhY2hcZlAsIFxmQmljbXAtc291cmNlcXVlbmNoXGZQLCBcZkJpY21wLXJlZGlyZWN0XGZQLAorXGZCaWNtcC1lY2hvXGZQLCBcZkJpY21wLXJvdXRlcmFkdmVydFxmUCwgXGZCaWNtcC1yb3V0ZXJzb2xpY2l0XGZQLAorXGZCaWNtcC10aW14Y2VlZFxmUCwgXGZCaWNtcC1wYXJhbXByb2JcZlAsIFxmQmljbXAtdHN0YW1wXGZQLAorXGZCaWNtcC10c3RhbXByZXBseVxmUCwgXGZCaWNtcC1pcmVxXGZQLCBcZkJpY21wLWlyZXFyZXBseVxmUCwKK1xmQmljbXAtbWFza3JlcVxmUCwgXGZCaWNtcC1tYXNrcmVwbHlcZlAuCisKK1RoZSBmb2xsb3dpbmcgVENQIGZsYWdzIGZpZWxkIHZhbHVlcyBhcmUgYXZhaWxhYmxlOiBcZkJ0Y3AtZmluXGZQLAorXGZCdGNwLXN5blxmUCwgXGZCdGNwLXJzdFxmUCwgXGZCdGNwLXB1c2hcZlAsCitcZkJ0Y3AtYWNrXGZQLCBcZkJ0Y3AtdXJnXGZQLgorLkxQCitQcmltaXRpdmVzIG1heSBiZSBjb21iaW5lZCB1c2luZzoKKy5JUAorQSBwYXJlbnRoZXNpemVkIGdyb3VwIG9mIHByaW1pdGl2ZXMgYW5kIG9wZXJhdG9ycworKHBhcmVudGhlc2VzIGFyZSBzcGVjaWFsIHRvIHRoZSBTaGVsbCBhbmQgbXVzdCBiZSBlc2NhcGVkKS4KKy5JUAorTmVnYXRpb24gKGBcZkIhXGZQJyBvciBgXGZCbm90XGZQJykuCisuSVAKK0NvbmNhdGVuYXRpb24gKGBcZkImJlxmUCcgb3IgYFxmQmFuZFxmUCcpLgorLklQCitBbHRlcm5hdGlvbiAoYFxmQnx8XGZQJyBvciBgXGZCb3JcZlAnKS4KKy5MUAorTmVnYXRpb24gaGFzIGhpZ2hlc3QgcHJlY2VkZW5jZS4KK0FsdGVybmF0aW9uIGFuZCBjb25jYXRlbmF0aW9uIGhhdmUgZXF1YWwgcHJlY2VkZW5jZSBhbmQgYXNzb2NpYXRlCitsZWZ0IHRvIHJpZ2h0LgorTm90ZSB0aGF0IGV4cGxpY2l0IFxmQmFuZFxmUiB0b2tlbnMsIG5vdCBqdXh0YXBvc2l0aW9uLAorYXJlIG5vdyByZXF1aXJlZCBmb3IgY29uY2F0ZW5hdGlvbi4KKy5MUAorSWYgYW4gaWRlbnRpZmllciBpcyBnaXZlbiB3aXRob3V0IGEga2V5d29yZCwgdGhlIG1vc3QgcmVjZW50IGtleXdvcmQKK2lzIGFzc3VtZWQuCitGb3IgZXhhbXBsZSwKKy5pbiArLjVpCisubmYKK1xmQm5vdCBob3N0IHZzIGFuZCBhY2VcZlIKKy5maQorLmluIC0uNWkKK2lzIHNob3J0IGZvcgorLmluICsuNWkKKy5uZgorXGZCbm90IGhvc3QgdnMgYW5kIGhvc3QgYWNlXGZSCisuZmkKKy5pbiAtLjVpCit3aGljaCBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGgKKy5pbiArLjVpCisubmYKK1xmQm5vdCAoIGhvc3QgdnMgb3IgYWNlIClcZlIKKy5maQorLmluIC0uNWkKKy5TSCBFWEFNUExFUworLkxQCitUbyBzZWxlY3QgYWxsIHBhY2tldHMgYXJyaXZpbmcgYXQgb3IgZGVwYXJ0aW5nIGZyb20gXGZJc3VuZG93blxmUDoKKy5SUworLm5mCitcZkJob3N0IHN1bmRvd25cZlAKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCB0cmFmZmljIGJldHdlZW4gXGZJaGVsaW9zXGZSIGFuZCBlaXRoZXIgXGZJaG90XGZSIG9yIFxmSWFjZVxmUjoKKy5SUworLm5mCitcZkJob3N0IGhlbGlvcyBhbmQgXFwoIGhvdCBvciBhY2UgXFwpXGZQCisuZmkKKy5SRQorLkxQCitUbyBzZWxlY3QgYWxsIElQIHBhY2tldHMgYmV0d2VlbiBcZklhY2VcZlIgYW5kIGFueSBob3N0IGV4Y2VwdCBcZkloZWxpb3NcZlI6CisuUlMKKy5uZgorXGZCaXAgaG9zdCBhY2UgYW5kIG5vdCBoZWxpb3NcZlAKKy5maQorLlJFCisuTFAKK1RvIHNlbGVjdCBhbGwgdHJhZmZpYyBiZXR3ZWVuIGxvY2FsIGhvc3RzIGFuZCBob3N0cyBhdCBCZXJrZWxleToKKy5SUworLm5mCisuQgorbmV0IHVjYi1ldGhlcgorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IGFsbCBmdHAgdHJhZmZpYyB0aHJvdWdoIGludGVybmV0IGdhdGV3YXkgXGZJc251cFxmUDoKKy5SUworLm5mCisuQgorZ2F0ZXdheSBzbnVwIGFuZCAocG9ydCBmdHAgb3IgZnRwLWRhdGEpCisuZmkKKy5SRQorLkxQCitUbyBzZWxlY3QgdHJhZmZpYyBuZWl0aGVyIHNvdXJjZWQgZnJvbSBub3IgZGVzdGluZWQgZm9yIGxvY2FsIGhvc3RzCisoaWYgeW91IGdhdGV3YXkgdG8gb25lIG90aGVyIG5ldCwgdGhpcyBzdHVmZiBzaG91bGQgbmV2ZXIgbWFrZSBpdAorb250byB5b3VyIGxvY2FsIG5ldCkuCisuUlMKKy5uZgorLkIKK2lwIGFuZCBub3QgbmV0IFxmSWxvY2FsbmV0XGZQCisuZmkKKy5SRQorLkxQCitUbyBzZWxlY3QgdGhlIHN0YXJ0IGFuZCBlbmQgcGFja2V0cyAodGhlIFNZTiBhbmQgRklOIHBhY2tldHMpIG9mIGVhY2gKK1RDUCBjb252ZXJzYXRpb24gdGhhdCBpbnZvbHZlcyBhIG5vbi1sb2NhbCBob3N0LgorLlJTCisubmYKKy5CCit0Y3BbdGNwZmxhZ3NdICYgKHRjcC1zeW58dGNwLWZpbikgIT0gMCBhbmQgbm90IHNyYyBhbmQgZHN0IG5ldCBcZklsb2NhbG5ldFxmUAorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IGFsbCBJUHY0IEhUVFAgcGFja2V0cyB0byBhbmQgZnJvbSBwb3J0IDgwLCBpLmUuIHByaW50IG9ubHkKK3BhY2tldHMgdGhhdCBjb250YWluIGRhdGEsIG5vdCwgZm9yIGV4YW1wbGUsIFNZTiBhbmQgRklOIHBhY2tldHMgYW5kCitBQ0stb25seSBwYWNrZXRzLiAgKElQdjYgaXMgbGVmdCBhcyBhbiBleGVyY2lzZSBmb3IgdGhlIHJlYWRlci4pCisuUlMKKy5uZgorLkIKK3RjcCBwb3J0IDgwIGFuZCAoKChpcFsyOjJdIC0gKChpcFswXSYweGYpPDwyKSkgLSAoKHRjcFsxMl0mMHhmMCk+PjIpKSAhPSAwKQorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IElQIHBhY2tldHMgbG9uZ2VyIHRoYW4gNTc2IGJ5dGVzIHNlbnQgdGhyb3VnaCBnYXRld2F5IFxmSXNudXBcZlA6CisuUlMKKy5uZgorLkIKK2dhdGV3YXkgc251cCBhbmQgaXBbMjoyXSA+IDU3NgorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IElQIGJyb2FkY2FzdCBvciBtdWx0aWNhc3QgcGFja2V0cyB0aGF0IHdlcmUKKy5JIG5vdAorc2VudCB2aWEgRXRoZXJuZXQgYnJvYWRjYXN0IG9yIG11bHRpY2FzdDoKKy5SUworLm5mCisuQgorZXRoZXJbMF0gJiAxID0gMCBhbmQgaXBbMTZdID49IDIyNAorLmZpCisuUkUKKy5MUAorVG8gc2VsZWN0IGFsbCBJQ01QIHBhY2tldHMgdGhhdCBhcmUgbm90IGVjaG8gcmVxdWVzdHMvcmVwbGllcyAoaS5lLiwgbm90CitwaW5nIHBhY2tldHMpOgorLlJTCisubmYKKy5CCitpY21wW2ljbXB0eXBlXSAhPSBpY21wLWVjaG8gYW5kIGljbXBbaWNtcHR5cGVdICE9IGljbXAtZWNob3JlcGx5CisuZmkKKy5SRQorLlNIICJTRUUgQUxTTyIKK3BjYXAoM1BDQVApCisuU0ggQVVUSE9SUworVGhlIG9yaWdpbmFsIGF1dGhvcnMgYXJlOgorLkxQCitWYW4gSmFjb2Jzb24sCitDcmFpZyBMZXJlcyBhbmQKK1N0ZXZlbiBNY0Nhbm5lLCBhbGwgb2YgdGhlCitMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWJvcmF0b3J5LCBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LCBDQS4KKy5MUAorSXQgaXMgY3VycmVudGx5IGJlaW5nIG1haW50YWluZWQgYnkgdGNwZHVtcC5vcmcuCisuTFAKK1RoZSBjdXJyZW50IHZlcnNpb24gb2YgbGlicGNhcCBpcyBhdmFpbGFibGUgdmlhIGh0dHA6CisuTFAKKy5SUworLkkgaHR0cDovL3d3dy50Y3BkdW1wLm9yZy8KKy5SRQorLkxQCitUaGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZSB2aWEgYW5vbnltb3VzIGZ0cDoKKy5MUAorLlJTCisuSSBmdHA6Ly9mdHAuZWUubGJsLmdvdi90Y3BkdW1wLnRhci5aCisuUkUKKy5TSCBCVUdTCitQbGVhc2Ugc2VuZCBwcm9ibGVtcywgYnVncywgcXVlc3Rpb25zLCBkZXNpcmFibGUgZW5oYW5jZW1lbnRzLCBldGMuIHRvOgorLkxQCisuUlMKK3RjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZworLlJFCisuTFAKK0ZpbHRlciBleHByZXNzaW9ucyBvbiBmaWVsZHMgb3RoZXIgdGhhbiB0aG9zZSBpbiBUb2tlbiBSaW5nIGhlYWRlcnMgd2lsbAorbm90IGNvcnJlY3RseSBoYW5kbGUgc291cmNlLXJvdXRlZCBUb2tlbiBSaW5nIHBhY2tldHMuCisuTFAKK0ZpbHRlciBleHByZXNzaW9ucyBvbiBmaWVsZHMgb3RoZXIgdGhhbiB0aG9zZSBpbiA4MDIuMTEgaGVhZGVycyB3aWxsIG5vdAorY29ycmVjdGx5IGhhbmRsZSA4MDIuMTEgZGF0YSBwYWNrZXRzIHdpdGggYm90aCBUbyBEUyBhbmQgRnJvbSBEUyBzZXQuCisuTFAKKy5CUiAiaXA2IHByb3RvIgorc2hvdWxkIGNoYXNlIGhlYWRlciBjaGFpbiwgYnV0IGF0IHRoaXMgbW9tZW50IGl0IGRvZXMgbm90LgorLkJSICJpcDYgcHJvdG9jaGFpbiIKK2lzIHN1cHBsaWVkIGZvciB0aGlzIGJlaGF2aW9yLgorLkxQCitBcml0aG1ldGljIGV4cHJlc3Npb24gYWdhaW5zdCB0cmFuc3BvcnQgbGF5ZXIgaGVhZGVycywgbGlrZSBcZkJ0Y3BbMF1cZlAsCitkb2VzIG5vdCB3b3JrIGFnYWluc3QgSVB2NiBwYWNrZXRzLgorSXQgb25seSBsb29rcyBhdCBJUHY0IHBhY2tldHMuCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtaW50LmggYi9saWJwY2FwLTEuMy4wL3BjYXAtaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0NGU2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1pbnQuaApAQCAtMCwwICsxLDQ5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NSwgMTk5NgorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIENvbXB1dGVyIFN5c3RlbXMKKyAqCUVuZ2luZWVyaW5nIEdyb3VwIGF0IExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciBvZiB0aGUgTGFib3JhdG9yeSBtYXkgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1pbnQuaCx2IDEuOTQgMjAwOC0wOS0xNiAwMDoyMDoyMyBndXkgRXhwICQgKExCTCkKKyAqLworCisjaWZuZGVmIHBjYXBfaW50X2gKKyNkZWZpbmUJcGNhcF9pbnRfaAorCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTElCRExQSQorI2luY2x1ZGUgPGxpYmRscGkuaD4KKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxQYWNrZXQzMi5oPgorZXh0ZXJuIENSSVRJQ0FMX1NFQ1RJT04gZ19QY2FwQ29tcGlsZUNyaXRpY2FsU2VjdGlvbjsKKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaWZkZWYgTVNET1MKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU05GX0FQSQorI2luY2x1ZGUgPHNuZi5oPgorI2VuZGlmCisKKyNpZiAoZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSIDw9IDEyMDApKSAvKiB3ZSBhcmUgY29tcGlsaW5nIHdpdGggVmlzdWFsIFN0dWRpbyA2LCB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgTEwgc3VmZml4Ki8KKworLyoKKyAqIFN3YXAgYnl0ZSBvcmRlcmluZyBvZiB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wIG9uIGEgYmlnIGVuZGlhbgorICogbWFjaGluZS4KKyAqLworI2RlZmluZSBTV0FQTEwodWxsKSAgKCh1bGwgJiAweGZmMDAwMDAwMDAwMDAwMDApID4+IDU2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDBmZjAwMDAwMDAwMDAwMCkgPj4gNDApIHwgXAorICAgICAgICAgICAgICAgICAgICAgICgodWxsICYgMHgwMDAwZmYwMDAwMDAwMDAwKSA+PiAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCh1bGwgJiAweDAwMDAwMGZmMDAwMDAwMDApID4+IDgpICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDAwMDAwMDBmZjAwMDAwMCkgPDwgOCkgIHwgXAorICAgICAgICAgICAgICAgICAgICAgICgodWxsICYgMHgwMDAwMDAwMDAwZmYwMDAwKSA8PCAyNCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCh1bGwgJiAweDAwMDAwMDAwMDAwMGZmMDApIDw8IDQwKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDAwMDAwMDAwMDAwMDBmZikgPDwgNTYpCisKKyNlbHNlIC8qIEEgcmVjZW50IFZpc3VhbCBzdHVkaW8gY29tcGlsZXIgb3Igbm90IFZDICovCisKKy8qCisgKiBTd2FwIGJ5dGUgb3JkZXJpbmcgb2YgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCBvbiBhIGJpZyBlbmRpYW4KKyAqIG1hY2hpbmUuCisgKi8KKyNkZWZpbmUgU1dBUExMKHVsbCkgICgodWxsICYgMHhmZjAwMDAwMDAwMDAwMDAwTEwpID4+IDU2KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDBmZjAwMDAwMDAwMDAwMExMKSA+PiA0MCkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCh1bGwgJiAweDAwMDBmZjAwMDAwMDAwMDBMTCkgPj4gMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICgodWxsICYgMHgwMDAwMDBmZjAwMDAwMDAwTEwpID4+IDgpICB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDAwMDAwMDBmZjAwMDAwMExMKSA8PCA4KSAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgKCh1bGwgJiAweDAwMDAwMDAwMDBmZjAwMDBMTCkgPDwgMjQpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICgodWxsICYgMHgwMDAwMDAwMDAwMDBmZjAwTEwpIDw8IDQwKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAoKHVsbCAmIDB4MDAwMDAwMDAwMDAwMDBmZkxMKSA8PCA1NikKKworI2VuZGlmIC8qIF9NU0NfVkVSICovCisKKy8qCisgKiBTYXZlZmlsZQorICovCit0eXBlZGVmIGVudW0geworCU5PVF9TV0FQUEVELAorCVNXQVBQRUQsCisJTUFZQkVfU1dBUFBFRAorfSBzd2FwcGVkX3R5cGVfdDsKKworLyoKKyAqIFVzZWQgd2hlbiByZWFkaW5nIGEgc2F2ZWZpbGUuCisgKi8KK3N0cnVjdCBwY2FwX3NmIHsKKwlGSUxFICpyZmlsZTsKKwlpbnQgKCpuZXh0X3BhY2tldF9vcCkocGNhcF90ICosIHN0cnVjdCBwY2FwX3BrdGhkciAqLCB1X2NoYXIgKiopOworCWludCBzd2FwcGVkOworCXNpemVfdCBoZHJzaXplOworCXN3YXBwZWRfdHlwZV90IGxlbmd0aHNfc3dhcHBlZDsKKwlpbnQgdmVyc2lvbl9tYWpvcjsKKwlpbnQgdmVyc2lvbl9taW5vcjsKKwlicGZfdV9pbnQzMiBpZmNvdW50OwkvKiBudW1iZXIgb2YgaW50ZXJmYWNlcyBzZWVuIGluIHRoaXMgY2FwdHVyZSAqLworCXVfaW50IHRzcmVzb2w7CQkvKiB0aW1lIHN0YW1wIHJlc29sdXRpb24gKi8KKwl1X2ludCB0c3NjYWxlOwkJLyogc2NhbGluZyBmYWN0b3IgZm9yIHJlc29sdXRpb24gLT4gbWljcm9zZWNvbmRzICovCisJdV9pbnQ2NF90IHRzb2Zmc2V0OwkvKiB0aW1lIHN0YW1wIG9mZnNldCAqLworfTsKKworLyoKKyAqIFVzZWQgd2hlbiBkb2luZyBhIGxpdmUgY2FwdHVyZS4KKyAqLworc3RydWN0IHBjYXBfbWQgeworCXN0cnVjdCBwY2FwX3N0YXQgc3RhdDsKKwkvKlhYWCovCisJaW50IHVzZV9icGY7CQkvKiB1c2luZyBrZXJuZWwgZmlsdGVyICovCisJdV9sb25nCVRvdFBrdHM7CS8qIGNhbid0IG9mbG93IGZvciA3OSBocnMgb24gZXRoZXIgKi8KKwl1X2xvbmcJVG90QWNjZXB0ZWQ7CS8qIGNvdW50IGFjY2VwdGVkIGJ5IGZpbHRlciAqLworCXVfbG9uZwlUb3REcm9wczsJLyogY291bnQgb2YgZHJvcHBlZCBwYWNrZXRzICovCisJbG9uZwlUb3RNaXNzZWQ7CS8qIG1pc3NlZCBieSBpL2YgZHVyaW5nIHRoaXMgcnVuICovCisJbG9uZwlPcmlnTWlzc2VkOwkvKiBtaXNzZWQgYnkgaS9mIGJlZm9yZSB0aGlzIHJ1biAqLworCWNoYXIJKmRldmljZTsJLyogZGV2aWNlIG5hbWUgKi8KKwlpbnQJdGltZW91dDsJLyogdGltZW91dCBmb3IgYnVmZmVyaW5nICovCisJaW50CW11c3RfZG9fb25fY2xvc2U7IC8qIHN0dWZmIHdlIG11c3QgZG8gd2hlbiB3ZSBjbG9zZSAqLworCXN0cnVjdCBwY2FwICpuZXh0OwkvKiBsaXN0IG9mIG9wZW4gcGNhcHMgdGhhdCBuZWVkIHN0dWZmIGNsZWFyZWQgb24gY2xvc2UgKi8KKyNpZmRlZiBsaW51eAorCWludAlzb2NrX3BhY2tldDsJLyogdXNpbmcgTGludXggMi4wIGNvbXBhdGlibGUgaW50ZXJmYWNlICovCisJaW50CWNvb2tlZDsJCS8qIHVzaW5nIFNPQ0tfREdSQU0gcmF0aGVyIHRoYW4gU09DS19SQVcgKi8KKwlpbnQJaWZpbmRleDsJLyogaW50ZXJmYWNlIGluZGV4IG9mIGRldmljZSB3ZSdyZSBib3VuZCB0byAqLworCWludAlsb19pZmluZGV4OwkvKiBpbnRlcmZhY2UgaW5kZXggb2YgdGhlIGxvb3BiYWNrIGRldmljZSAqLworCXVfaW50CXBhY2tldHNfcmVhZDsJLyogY291bnQgb2YgcGFja2V0cyByZWFkIHdpdGggcmVjdmZyb20oKSAqLworCWJwZl91X2ludDMyIG9sZG1vZGU7CS8qIG1vZGUgdG8gcmVzdG9yZSB3aGVuIHR1cm5pbmcgbW9uaXRvciBtb2RlIG9mZiAqLworCWNoYXIJKm1vbmRldmljZTsJLyogbWFjODAyMTEgbW9uaXRvciBkZXZpY2Ugd2UgY3JlYXRlZCAqLworCXVfY2hhcgkqbW1hcGJ1ZjsJLyogbWVtb3J5LW1hcHBlZCByZWdpb24gcG9pbnRlciAqLworCXNpemVfdAltbWFwYnVmbGVuOwkvKiBzaXplIG9mIHJlZ2lvbiAqLworCXVfaW50CXRwX3ZlcnNpb247CS8qIHZlcnNpb24gb2YgdHBhY2tldF9oZHIgZm9yIG1tYXBlZCByaW5nICovCisJdV9pbnQJdHBfaGRybGVuOwkvKiBoZHJsZW4gb2YgdHBhY2tldF9oZHIgZm9yIG1tYXBlZCByaW5nICovCisJdV9jaGFyCSpvbmVzaG90X2J1ZmZlcjsgLyogYnVmZmVyIGZvciBjb3B5IG9mIHBhY2tldCAqLworCWxvbmcJcHJvY19kcm9wcGVkOyAvKiBwYWNrZXRzIHJlcG9ydGVkIGRyb3BwZWQgYnkgL3Byb2MvbmV0L2RldiAqLworI2VuZGlmIC8qIGxpbnV4ICovCisKKyNpZmRlZiBIQVZFX0RBR19BUEkKKyNpZmRlZiBIQVZFX0RBR19TVFJFQU1TX0FQSQorCXVfY2hhcgkqZGFnX21lbV9ib3R0b207CS8qIERBRyBjYXJkIGN1cnJlbnQgbWVtb3J5IGJvdHRvbSBwb2ludGVyICovCisJdV9jaGFyCSpkYWdfbWVtX3RvcDsJLyogREFHIGNhcmQgY3VycmVudCBtZW1vcnkgdG9wIHBvaW50ZXIgKi8KKyNlbHNlIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCisJdm9pZAkqZGFnX21lbV9iYXNlOwkvKiBEQUcgY2FyZCBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisJdV9pbnQJZGFnX21lbV9ib3R0b207CS8qIERBRyBjYXJkIGN1cnJlbnQgbWVtb3J5IGJvdHRvbSBvZmZzZXQgKi8KKwl1X2ludAlkYWdfbWVtX3RvcDsJLyogREFHIGNhcmQgY3VycmVudCBtZW1vcnkgdG9wIG9mZnNldCAqLworI2VuZGlmIC8qIEhBVkVfREFHX1NUUkVBTVNfQVBJICovCisJaW50CWRhZ19mY3NfYml0czsJLyogTnVtYmVyIG9mIGNoZWNrc3VtIGJpdHMgZnJvbSBsaW5rIGxheWVyICovCisJaW50CWRhZ19vZmZzZXRfZmxhZ3M7IC8qIEZsYWdzIHRvIHBhc3MgdG8gZGFnX29mZnNldCgpLiAqLworCWludAlkYWdfc3RyZWFtOwkvKiBEQUcgc3RyZWFtIG51bWJlciAqLworCWludAlkYWdfdGltZW91dDsJLyogdGltZW91dCBzcGVjaWZpZWQgdG8gcGNhcF9vcGVuX2xpdmUuCisJCQkJICogU2FtZSBhcyBpbiBsaW51eCBhYm92ZSwgaW50cm9kdWNlCisJCQkJICogZ2VuZXJhbGx5PyAqLworI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLworI2lmZGVmIEhBVkVfU05GX0FQSQorCXNuZl9oYW5kbGVfdCBzbmZfaGFuZGxlOyAvKiBvcGFxdWUgZGV2aWNlIGhhbmRsZSAqLworCXNuZl9yaW5nX3QgICBzbmZfcmluZzsgICAvKiBvcGFxdWUgZGV2aWNlIHJpbmcgaGFuZGxlICovCisgICAgICAgIGludCAgICAgICAgICBzbmZfdGltZW91dDsKKyAgICAgICAgaW50ICAgICAgICAgIHNuZl9ib2FyZG51bTsKKyNlbmRpZiAvKkhBVkVfU05GX0FQSSovCisKKyNpZmRlZiBIQVZFX1pFUk9DT1BZX0JQRgorICAgICAgIC8qCisgICAgICAgICogWmVyby1jb3B5IHJlYWQgYnVmZmVyIC0tIGZvciB6ZXJvLWNvcHkgQlBGLiAgJ2J1ZmZlcicgYWJvdmUgd2lsbAorICAgICAgICAqIGFsdGVybmF0aXZlIGJldHdlZW4gdGhlc2UgdHdvIGFjdHVhbCBtbWFwJ2QgYnVmZmVycyBhcyByZXF1aXJlZC4KKyAgICAgICAgKiBBcyB0aGVyZSBpcyBhIGhlYWRlciBvbiB0aGUgZnJvbnQgc2l6ZSBvZiB0aGUgbW1hcCdkIGJ1ZmZlciwgb25seQorICAgICAgICAqIHNvbWUgb2YgdGhlIGJ1ZmZlciBpcyBleHBvc2VkIHRvIGxpYnBjYXAgYXMgYSB3aG9sZSB2aWEgYnVmc2l6ZTsKKyAgICAgICAgKiB6YnVmc2l6ZSBpcyB0aGUgdHJ1ZSBzaXplLiAgemJ1ZmZlciB0cmFja3MgdGhlIGN1cnJlbnQgemJ1ZgorICAgICAgICAqIGFzc29jYXRlZCB3aXRoIGJ1ZmZlciBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGRlY2lkZSB3aGljaCB0aGUKKyAgICAgICAgKiBuZXh0IGJ1ZmZlciB0byByZWFkIHdpbGwgYmUuCisgICAgICAgICovCisgICAgICAgdV9jaGFyICp6YnVmMSwgKnpidWYyLCAqemJ1ZmZlcjsKKyAgICAgICB1X2ludCB6YnVmc2l6ZTsKKyAgICAgICB1X2ludCB6ZXJvY29weTsKKyAgICAgICB1X2ludCBpbnRlcnJ1cHRlZDsKKyAgICAgICBzdHJ1Y3QgdGltZXNwZWMgZmlyc3RzZWw7CisgICAgICAgLyoKKyAgICAgICAgKiBJZiB0aGVyZSdzIGN1cnJlbnRseSBhIGJ1ZmZlciBiZWluZyBhY3RpdmVseSBwcm9jZXNzZWQsIHRoZW4gaXQgaXMKKyAgICAgICAgKiByZWZlcmVuY2VkIGhlcmU7ICdidWZmZXInIGlzIGFsc28gcG9pbnRlZCBhdCBpdCwgYnV0IG9mZnNldCBieSB0aGUKKyAgICAgICAgKiBzaXplIG9mIHRoZSBoZWFkZXIuCisgICAgICAgICovCisgICAgICAgc3RydWN0IGJwZl96YnVmX2hlYWRlciAqYnpoOworI2VuZGlmIC8qIEhBVkVfWkVST0NPUFlfQlBGICovCit9OworCisvKgorICogU3R1ZmYgdG8gZG8gd2hlbiB3ZSBjbG9zZS4KKyAqLworI2RlZmluZSBNVVNUX0NMRUFSX1BST01JU0MJMHgwMDAwMDAwMQkvKiBjbGVhciBwcm9taXNjdW91cyBtb2RlICovCisjZGVmaW5lIE1VU1RfQ0xFQVJfUkZNT04JMHgwMDAwMDAwMgkvKiBjbGVhciByZm1vbiAobW9uaXRvcikgbW9kZSAqLworI2RlZmluZSBNVVNUX0RFTEVURV9NT05JRgkweDAwMDAwMDA0CS8qIGRlbGV0ZSBtb25pdG9yLW1vZGUgaW50ZXJmYWNlICovCisKK3N0cnVjdCBwY2FwX29wdCB7CisJaW50CWJ1ZmZlcl9zaXplOworCWNoYXIJKnNvdXJjZTsKKwlpbnQJcHJvbWlzYzsKKwlpbnQJcmZtb247CisJaW50CXRzdGFtcF90eXBlOworfTsKKworLyoKKyAqIFVsdHJpeCwgREVDIE9TRi8xXkheSF5IXkheSF5IXkheSF5IRGlnaXRhbCBVTklYXkheSF5IXkheSF5IXkheSF5IXkheSF5ICisgKiBUcnU2NCBVTklYLCBhbmQgc29tZSB2ZXJzaW9ucyBvZiBOZXRCU0QgcGFkIEZEREkgcGFja2V0cyB0byBtYWtlIGV2ZXJ5dGhpbmcKKyAqIGxpbmUgdXAgb24gYSBuaWNlIGJvdW5kYXJ5LgorICovCisjaWZkZWYgX19OZXRCU0RfXworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgkvKiBuZWVkZWQgdG8gZGVjbGFyZSBfX05ldEJTRF9WZXJzaW9uX18gKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZCh1bHRyaXgpIHx8IGRlZmluZWQoX19vc2ZfXykgfHwgKGRlZmluZWQoX19OZXRCU0RfXykgJiYgX19OZXRCU0RfVmVyc2lvbl9fID4gMTA2MDAwMDAwKQorI2RlZmluZSAgICAgICBQQ0FQX0ZERElQQUQgMworI2VuZGlmCisKK3R5cGVkZWYgaW50CSgqYWN0aXZhdGVfb3BfdCkocGNhcF90ICopOwordHlwZWRlZiBpbnQJKCpjYW5fc2V0X3JmbW9uX29wX3QpKHBjYXBfdCAqKTsKK3R5cGVkZWYgaW50CSgqcmVhZF9vcF90KShwY2FwX3QgKiwgaW50IGNudCwgcGNhcF9oYW5kbGVyLCB1X2NoYXIgKik7Cit0eXBlZGVmIGludAkoKmluamVjdF9vcF90KShwY2FwX3QgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOwordHlwZWRlZiBpbnQJKCpzZXRmaWx0ZXJfb3BfdCkocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK3R5cGVkZWYgaW50CSgqc2V0ZGlyZWN0aW9uX29wX3QpKHBjYXBfdCAqLCBwY2FwX2RpcmVjdGlvbl90KTsKK3R5cGVkZWYgaW50CSgqc2V0X2RhdGFsaW5rX29wX3QpKHBjYXBfdCAqLCBpbnQpOwordHlwZWRlZiBpbnQJKCpnZXRub25ibG9ja19vcF90KShwY2FwX3QgKiwgY2hhciAqKTsKK3R5cGVkZWYgaW50CSgqc2V0bm9uYmxvY2tfb3BfdCkocGNhcF90ICosIGludCwgY2hhciAqKTsKK3R5cGVkZWYgaW50CSgqc3RhdHNfb3BfdCkocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CisjaWZkZWYgV0lOMzIKK3R5cGVkZWYgaW50CSgqc2V0YnVmZl9vcF90KShwY2FwX3QgKiwgaW50KTsKK3R5cGVkZWYgaW50CSgqc2V0bW9kZV9vcF90KShwY2FwX3QgKiwgaW50KTsKK3R5cGVkZWYgaW50CSgqc2V0bWludG9jb3B5X29wX3QpKHBjYXBfdCAqLCBpbnQpOworI2VuZGlmCit0eXBlZGVmIHZvaWQJKCpjbGVhbnVwX29wX3QpKHBjYXBfdCAqKTsKKworc3RydWN0IHBjYXAgeworI2lmZGVmIFdJTjMyCisJQURBUFRFUiAqYWRhcHRlcjsKKwlMUFBBQ0tFVCBQYWNrZXQ7CisJaW50IG5vbmJsb2NrOworI2Vsc2UKKwlpbnQgZmQ7CisJaW50IHNlbGVjdGFibGVfZmQ7CisJaW50IHNlbmRfZmQ7CisjZW5kaWYgLyogV0lOMzIgKi8KKworI2lmZGVmIEhBVkVfTElCRExQSQorCWRscGlfaGFuZGxlX3QgZGxwaV9oZDsKKyNlbmRpZgorCWludCBzbmFwc2hvdDsKKwlpbnQgbGlua3R5cGU7CQkvKiBOZXR3b3JrIGxpbmt0eXBlICovCisJaW50IGxpbmt0eXBlX2V4dDsgICAgICAgLyogRXh0ZW5kZWQgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSBsaW5rdHlwZSBmaWVsZCBvZiBhIGZpbGUgKi8KKwlpbnQgdHpvZmY7CQkvKiB0aW1lem9uZSBvZmZzZXQgKi8KKwlpbnQgb2Zmc2V0OwkJLyogb2Zmc2V0IGZvciBwcm9wZXIgYWxpZ25tZW50ICovCisJaW50IGFjdGl2YXRlZDsJCS8qIHRydWUgaWYgdGhlIGNhcHR1cmUgaXMgcmVhbGx5IHN0YXJ0ZWQgKi8KKwlpbnQgb2xkc3R5bGU7CQkvKiBpZiB3ZSdyZSBvcGVuaW5nIHdpdGggcGNhcF9vcGVuX2xpdmUoKSAqLworCisJaW50IGJyZWFrX2xvb3A7CQkvKiBmbGFnIHNldCB0byBmb3JjZSBicmVhayBmcm9tIHBhY2tldC1yZWFkaW5nIGxvb3AgKi8KKworI2lmZGVmIFBDQVBfRkRESVBBRAorCWludCBmZGRpcGFkOworI2VuZGlmCisKKyNpZmRlZiBNU0RPUworICAgICAgICB2b2lkICgqd2FpdF9wcm9jKSh2b2lkKTsgLyogICAgICAgICAgY2FsbCBwcm9jIHdoaWxlIHdhaXRpbmcgKi8KKyNlbmRpZgorCisJc3RydWN0IHBjYXBfc2Ygc2Y7CisJc3RydWN0IHBjYXBfbWQgbWQ7CisJc3RydWN0IHBjYXBfb3B0IG9wdDsKKworCS8qCisJICogUmVhZCBidWZmZXIuCisJICovCisJaW50IGJ1ZnNpemU7CisJdV9jaGFyICpidWZmZXI7CisJdV9jaGFyICpicDsKKwlpbnQgY2M7CisKKwkvKgorCSAqIFBsYWNlIGhvbGRlciBmb3IgcGNhcF9uZXh0KCkuCisJICovCisJdV9jaGFyICpwa3Q7CisKKwkvKiBXZSdyZSBhY2NlcHRpbmcgb25seSBwYWNrZXRzIGluIHRoaXMgZGlyZWN0aW9uL3RoZXNlIGRpcmVjdGlvbnMuICovCisJcGNhcF9kaXJlY3Rpb25fdCBkaXJlY3Rpb247CisKKwkvKgorCSAqIE1ldGhvZHMuCisJICovCisJYWN0aXZhdGVfb3BfdCBhY3RpdmF0ZV9vcDsKKwljYW5fc2V0X3JmbW9uX29wX3QgY2FuX3NldF9yZm1vbl9vcDsKKwlyZWFkX29wX3QgcmVhZF9vcDsKKwlpbmplY3Rfb3BfdCBpbmplY3Rfb3A7CisJc2V0ZmlsdGVyX29wX3Qgc2V0ZmlsdGVyX29wOworCXNldGRpcmVjdGlvbl9vcF90IHNldGRpcmVjdGlvbl9vcDsKKwlzZXRfZGF0YWxpbmtfb3BfdCBzZXRfZGF0YWxpbmtfb3A7CisJZ2V0bm9uYmxvY2tfb3BfdCBnZXRub25ibG9ja19vcDsKKwlzZXRub25ibG9ja19vcF90IHNldG5vbmJsb2NrX29wOworCXN0YXRzX29wX3Qgc3RhdHNfb3A7CisKKwkvKgorCSAqIFJvdXRpbmUgdG8gdXNlIGFzIGNhbGxiYWNrIGZvciBwY2FwX25leHQoKS9wY2FwX25leHRfZXgoKS4KKwkgKi8KKwlwY2FwX2hhbmRsZXIgb25lc2hvdF9jYWxsYmFjazsKKworI2lmZGVmIFdJTjMyCisJLyoKKwkgKiBUaGVzZSBhcmUsIGF0IGxlYXN0IGN1cnJlbnRseSwgc3BlY2lmaWMgdG8gdGhlIFdpbjMyIE5QRgorCSAqIGRyaXZlci4KKwkgKi8KKwlzZXRidWZmX29wX3Qgc2V0YnVmZl9vcDsKKwlzZXRtb2RlX29wX3Qgc2V0bW9kZV9vcDsKKwlzZXRtaW50b2NvcHlfb3BfdCBzZXRtaW50b2NvcHlfb3A7CisjZW5kaWYKKwljbGVhbnVwX29wX3QgY2xlYW51cF9vcDsKKworCS8qCisJICogUGxhY2Vob2xkZXIgZm9yIGZpbHRlciBjb2RlIGlmIGJwZiBub3QgaW4ga2VybmVsLgorCSAqLworCXN0cnVjdCBicGZfcHJvZ3JhbSBmY29kZTsKKworCWNoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkUgKyAxXTsKKwlpbnQgZGx0X2NvdW50OworCXVfaW50ICpkbHRfbGlzdDsKKwlpbnQgdHN0YW1wX3R5cGVfY291bnQ7CisJdV9pbnQgKnRzdGFtcF90eXBlX2xpc3Q7CisKKwlzdHJ1Y3QgcGNhcF9wa3RoZHIgcGNhcF9oZWFkZXI7CS8qIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgcGNhcF9uZXh0X2V4KCkgdG8gd29yayAqLworfTsKKworLyoKKyAqIFRoaXMgaXMgYSB0aW1ldmFsIGFzIHN0b3JlZCBpbiBhIHNhdmVmaWxlLgorICogSXQgaGFzIHRvIHVzZSB0aGUgc2FtZSB0eXBlcyBldmVyeXdoZXJlLCBpbmRlcGVuZGVudCBvZiB0aGUgYWN0dWFsCisgKiBgc3RydWN0IHRpbWV2YWwnOyBgc3RydWN0IHRpbWV2YWwnIGhhcyAzMi1iaXQgdHZfc2VjIHZhbHVlcyBvbiBzb21lCisgKiBwbGF0Zm9ybXMgYW5kIDY0LWJpdCB0dl9zZWMgdmFsdWVzIG9uIG90aGVyIHBsYXRmb3JtcywgYW5kIHdyaXRpbmcKKyAqIG91dCBuYXRpdmUgYHN0cnVjdCB0aW1ldmFsJyB2YWx1ZXMgd291bGQgbWVhbiBmaWxlcyBjb3VsZCBvbmx5IGJlCisgKiByZWFkIG9uIHN5c3RlbXMgd2l0aCB0aGUgc2FtZSB0dl9zZWMgc2l6ZSBhcyB0aGUgc3lzdGVtIG9uIHdoaWNoCisgKiB0aGUgZmlsZSB3YXMgd3JpdHRlbi4KKyAqLworCitzdHJ1Y3QgcGNhcF90aW1ldmFsIHsKKyAgICBicGZfaW50MzIgdHZfc2VjOwkJLyogc2Vjb25kcyAqLworICAgIGJwZl9pbnQzMiB0dl91c2VjOwkJLyogbWljcm9zZWNvbmRzICovCit9OworCisvKgorICogVGhpcyBpcyBhIGBwY2FwX3BrdGhkcicgYXMgYWN0dWFsbHkgc3RvcmVkIGluIGEgc2F2ZWZpbGUuCisgKgorICogRG8gbm90IGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoaXMgc3RydWN0dXJlLCBpbiBhbnkgd2F5ICh0aGlzIGluY2x1ZGVzCisgKiBjaGFuZ2VzIHRoYXQgb25seSBhZmZlY3QgdGhlIGxlbmd0aCBvZiBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3R1cmUpLAorICogYW5kIGRvIG5vdCBtYWtlIHRoZSB0aW1lIHN0YW1wIGFueXRoaW5nIG90aGVyIHRoYW4gc2Vjb25kcyBhbmQKKyAqIG1pY3Jvc2Vjb25kcyAoZS5nLiwgc2Vjb25kcyBhbmQgbmFub3NlY29uZHMpLiAgSW5zdGVhZDoKKyAqCisgKglpbnRyb2R1Y2UgYSBuZXcgc3RydWN0dXJlIGZvciB0aGUgbmV3IGZvcm1hdDsKKyAqCisgKglzZW5kIG1haWwgdG8gInRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyIsIHJlcXVlc3RpbmcKKyAqCWEgbmV3IG1hZ2ljIG51bWJlciBmb3IgeW91ciBuZXcgY2FwdHVyZSBmaWxlIGZvcm1hdCwgYW5kLCB3aGVuCisgKgl5b3UgZ2V0IHRoZSBuZXcgbWFnaWMgbnVtYmVyLCBwdXQgaXQgaW4gInNhdmVmaWxlLmMiOworICoKKyAqCXVzZSB0aGF0IG1hZ2ljIG51bWJlciBmb3Igc2F2ZSBmaWxlcyB3aXRoIHRoZSBjaGFuZ2VkIHJlY29yZAorICoJaGVhZGVyOworICoKKyAqCW1ha2UgdGhlIGNvZGUgaW4gInNhdmVmaWxlLmMiIGNhcGFibGUgb2YgcmVhZGluZyBmaWxlcyB3aXRoCisgKgl0aGUgb2xkIHJlY29yZCBoZWFkZXIgYXMgd2VsbCBhcyBmaWxlcyB3aXRoIHRoZSBuZXcgcmVjb3JkIGhlYWRlcgorICoJKHVzaW5nIHRoZSBtYWdpYyBudW1iZXIgdG8gZGV0ZXJtaW5lIHRoZSBoZWFkZXIgZm9ybWF0KS4KKyAqCisgKiBUaGVuIHN1cHBseSB0aGUgY2hhbmdlcyBhcyBhIHBhdGNoIGF0CisgKgorICoJaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJwY2FwLworICoKKyAqIHNvIHRoYXQgZnV0dXJlIHZlcnNpb25zIG9mIGxpYnBjYXAgYW5kIHByb2dyYW1zIHRoYXQgdXNlIGl0IChzdWNoIGFzCisgKiB0Y3BkdW1wKSB3aWxsIGJlIGFibGUgdG8gcmVhZCB5b3VyIG5ldyBjYXB0dXJlIGZpbGUgZm9ybWF0LgorICovCisKK3N0cnVjdCBwY2FwX3NmX3BrdGhkciB7CisgICAgc3RydWN0IHBjYXBfdGltZXZhbCB0czsJLyogdGltZSBzdGFtcCAqLworICAgIGJwZl91X2ludDMyIGNhcGxlbjsJCS8qIGxlbmd0aCBvZiBwb3J0aW9uIHByZXNlbnQgKi8KKyAgICBicGZfdV9pbnQzMiBsZW47CQkvKiBsZW5ndGggdGhpcyBwYWNrZXQgKG9mZiB3aXJlKSAqLworfTsKKworLyoKKyAqIEhvdyBhIGBwY2FwX3BrdGhkcicgaXMgYWN0dWFsbHkgc3RvcmVkIGluIHNhdmVmaWxlcyB3cml0dGVuCisgKiBieSBzb21lIHBhdGNoZWQgdmVyc2lvbnMgb2YgbGlicGNhcCAoZS5nLiB0aGUgb25lcyBpbiBSZWQKKyAqIEhhdCBMaW51eCA2LjEgYW5kIDYuMikuCisgKgorICogRG8gbm90IGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoaXMgc3RydWN0dXJlLCBpbiBhbnkgd2F5ICh0aGlzIGluY2x1ZGVzCisgKiBjaGFuZ2VzIHRoYXQgb25seSBhZmZlY3QgdGhlIGxlbmd0aCBvZiBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3R1cmUpLgorICogSW5zdGVhZCwgaW50cm9kdWNlIGEgbmV3IHN0cnVjdHVyZSwgYXMgcGVyIHRoZSBhYm92ZS4KKyAqLworCitzdHJ1Y3QgcGNhcF9zZl9wYXRjaGVkX3BrdGhkciB7CisgICAgc3RydWN0IHBjYXBfdGltZXZhbCB0czsJLyogdGltZSBzdGFtcCAqLworICAgIGJwZl91X2ludDMyIGNhcGxlbjsJCS8qIGxlbmd0aCBvZiBwb3J0aW9uIHByZXNlbnQgKi8KKyAgICBicGZfdV9pbnQzMiBsZW47CQkvKiBsZW5ndGggdGhpcyBwYWNrZXQgKG9mZiB3aXJlKSAqLworICAgIGludAkJaW5kZXg7CisgICAgdW5zaWduZWQgc2hvcnQgcHJvdG9jb2w7CisgICAgdW5zaWduZWQgY2hhciBwa3RfdHlwZTsKK307CisKKy8qCisgKiBVc2VyIGRhdGEgc3RydWN0dXJlIGZvciB0aGUgb25lLXNob3QgY2FsbGJhY2sgdXNlZCBmb3IgcGNhcF9uZXh0KCkKKyAqIGFuZCBwY2FwX25leHRfZXgoKS4KKyAqLworc3RydWN0IG9uZXNob3RfdXNlcmRhdGEgeworCXN0cnVjdCBwY2FwX3BrdGhkciAqaGRyOworCWNvbnN0IHVfY2hhciAqKnBrdDsKKwlwY2FwX3QgKnBkOworfTsKKworaW50CXl5bGV4KHZvaWQpOworCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSwgYikgKChhKSA+IChiKSA/IChiKSA6IChhKSkKKyNlbmRpZgorCisvKiBYWFggc2hvdWxkIHRoZXNlIGJlIGluIHBjYXAuaD8gKi8KK2ludAlwY2FwX29mZmxpbmVfcmVhZChwY2FwX3QgKiwgaW50LCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqKTsKK2ludAlwY2FwX3JlYWQocGNhcF90ICosIGludCBjbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOworCisjaWZuZGVmIEhBVkVfU1RSTENQWQorI2RlZmluZSBzdHJsY3B5KHgsIHksIHopIFwKKwkoc3RybmNweSgoeCksICh5KSwgKHopKSwgXAorCSAoKHopIDw9IDAgPyAwIDogKCh4KVsoeikgLSAxXSA9ICdcMCcpKSwgXAorCSBzdHJsZW4oKHkpKSkKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZiAhZGVmaW5lZChIQVZFX1NOUFJJTlRGKQorI2RlZmluZSBzbnByaW50ZiBwY2FwX3NucHJpbnRmCitleHRlcm4gaW50IHNucHJpbnRmIChjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pOworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX1ZTTlBSSU5URikKKyNkZWZpbmUgdnNucHJpbnRmIHBjYXBfdnNucHJpbnRmCitleHRlcm4gaW50IHZzbnByaW50ZiAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCBhcCk7CisjZW5kaWYKKworLyoKKyAqIFJvdXRpbmVzIHRoYXQgbW9zdCBwY2FwIGltcGxlbWVudGF0aW9ucyBjYW4gdXNlIGZvciBub24tYmxvY2tpbmcgbW9kZS4KKyAqLworI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKK2ludAlwY2FwX2dldG5vbmJsb2NrX2ZkKHBjYXBfdCAqLCBjaGFyICopOworaW50CXBjYXBfc2V0bm9uYmxvY2tfZmQocGNhcF90ICpwLCBpbnQsIGNoYXIgKik7CisjZW5kaWYKKworcGNhcF90CSpwY2FwX2NyZWF0ZV9jb21tb24oY29uc3QgY2hhciAqLCBjaGFyICopOworaW50CXBjYXBfZG9fYWRkZXhpdChwY2FwX3QgKik7Cit2b2lkCXBjYXBfYWRkX3RvX3BjYXBzX3RvX2Nsb3NlKHBjYXBfdCAqKTsKK3ZvaWQJcGNhcF9yZW1vdmVfZnJvbV9wY2Fwc190b19jbG9zZShwY2FwX3QgKik7Cit2b2lkCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwY2FwX3QgKik7CitpbnQJcGNhcF9ub3RfaW5pdGlhbGl6ZWQocGNhcF90ICopOworaW50CXBjYXBfY2hlY2tfYWN0aXZhdGVkKHBjYXBfdCAqKTsKKworLyoKKyAqIEludGVybmFsIGludGVyZmFjZXMgZm9yICJwY2FwX2ZpbmRhbGxkZXZzKCkiLgorICoKKyAqICJwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKCkiIGlzIGEgcGxhdGZvcm0tZGVwZW5kZW50IHJvdXRpbmUgdG8KKyAqIGFkZCBkZXZpY2VzIG5vdCBmb3VuZCBieSB0aGUgInN0YW5kYXJkIiBtZWNoYW5pc21zIChTSU9DR0lGQ09ORiwKKyAqICJnZXRpZmFkZHJzKCkiLCBldGMuLgorICoKKyAqICJwY2FwX2FkZF9pZigpIiBhZGRzIGFuIGludGVyZmFjZSB0byB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzLgorICovCitpbnQJcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiosIGNoYXIgKik7CitpbnQJYWRkX2FkZHJfdG9faWZsaXN0KHBjYXBfaWZfdCAqKiwgY29uc3QgY2hhciAqLCB1X2ludCwgc3RydWN0IHNvY2thZGRyICosCisJICAgIHNpemVfdCwgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwKKwkgICAgc3RydWN0IHNvY2thZGRyICosIHNpemVfdCwgY2hhciAqKTsKK2ludAlwY2FwX2FkZF9pZihwY2FwX2lmX3QgKiosIGNvbnN0IGNoYXIgKiwgdV9pbnQsIGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKK3N0cnVjdCBzb2NrYWRkciAqZHVwX3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqLCBzaXplX3QpOworaW50CWFkZF9vcl9maW5kX2lmKHBjYXBfaWZfdCAqKiwgcGNhcF9pZl90ICoqLCBjb25zdCBjaGFyICosIHVfaW50LAorCSAgICBjb25zdCBjaGFyICosIGNoYXIgKik7CisKKyNpZmRlZiBXSU4zMgorY2hhcgkqcGNhcF93aW4zMnN0cmVycm9yKHZvaWQpOworI2VuZGlmCisKK2ludAlpbnN0YWxsX2JwZl9wcm9ncmFtKHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CisKK2ludAlwY2FwX3N0cmNhc2VjbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1saWJkbHBpLmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtbGliZGxwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNmEwMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtbGliZGxwaS5jCkBAIC0wLDAgKzEsNDA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogVGhpcyBjb2RlIGNvbnRyaWJ1dGVkIGJ5IFNhZ3VuIFNoYWt5YSAoc2FndW4uc2hha3lhQHN1bi5jb20pCisgKi8KKy8qCisgKiBQYWNrZXQgY2FwdHVyZSByb3V0aW5lcyBmb3IgRExQSSB1c2luZyBsaWJkbHBpIHVuZGVyIFN1bk9TIDUuMTEuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisJIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1saWJkbHBpLmMsdiAxLjYgMjAwOC0wNC0xNCAyMDo0MDo1OCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL2J1Zm1vZC5oPgorI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KKyNpbmNsdWRlIDxsaWJkbHBpLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKyNpbmNsdWRlIDxzdHJvcHRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAiZGxwaXN1YnMuaCIKKworLyogRm9yd2FyZHMuICovCitzdGF0aWMgaW50IGRscHJvbWlzY29uKHBjYXBfdCAqLCBicGZfdV9pbnQzMik7CitzdGF0aWMgaW50IHBjYXBfcmVhZF9saWJkbHBpKHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOworc3RhdGljIGludCBwY2FwX2luamVjdF9saWJkbHBpKHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitzdGF0aWMgdm9pZCBwY2FwX2Nsb3NlX2xpYmRscGkocGNhcF90ICopOworc3RhdGljIHZvaWQgcGNhcF9saWJkbHBpX2Vycihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LCBjaGFyICopOworc3RhdGljIHZvaWQgcGNhcF9jbGVhbnVwX2xpYmRscGkocGNhcF90ICopOworCisvKgorICogbGlzdF9pbnRlcmZhY2VzKCkgd2lsbCBsaXN0IGFsbCB0aGUgbmV0d29yayBsaW5rcyB0aGF0IGFyZQorICogYXZhaWxhYmxlIG9uIGEgc3lzdGVtLgorICovCitzdGF0aWMgYm9vbGVhbl90IGxpc3RfaW50ZXJmYWNlcyhjb25zdCBjaGFyICosIHZvaWQgKik7CisKK3R5cGVkZWYgc3RydWN0IGxpbmtuYW1lbGlzdCB7CisJY2hhcglsaW5rbmFtZVtETFBJX0xJTktOQU1FX01BWF07CisJc3RydWN0IGxpbmtuYW1lbGlzdCAqbG5sX25leHQ7Cit9IGxpbmtuYW1lbGlzdF90OworCit0eXBlZGVmIHN0cnVjdCBsaW5rd2FsayB7CisJbGlua25hbWVsaXN0X3QJKmx3X2xpc3Q7CisJaW50CQlsd19lcnI7Cit9IGxpbmt3YWxrX3Q7CisKKy8qCisgKiBUaGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQKKyAqIGZvciBlYWNoIGxpbmtuYW1lbGlzdF90ICJlbnRyeSIgYWxsb2NhdGVkLgorICovCitzdGF0aWMgYm9vbGVhbl90CitsaXN0X2ludGVyZmFjZXMoY29uc3QgY2hhciAqbGlua25hbWUsIHZvaWQgKmFyZykKK3sKKwlsaW5rd2Fsa190CSpsd3AgPSBhcmc7CisJbGlua25hbWVsaXN0X3QJKmVudHJ5OworCisJaWYgKChlbnRyeSA9IGNhbGxvYygxLCBzaXplb2YobGlua25hbWVsaXN0X3QpKSkgPT0gTlVMTCkgeworCQlsd3AtPmx3X2VyciA9IEVOT01FTTsKKwkJcmV0dXJuIChCX1RSVUUpOworCX0KKwkodm9pZCkgc3RybGNweShlbnRyeS0+bGlua25hbWUsIGxpbmtuYW1lLCBETFBJX0xJTktOQU1FX01BWCk7CisKKwlpZiAobHdwLT5sd19saXN0ID09IE5VTEwpIHsKKwkJbHdwLT5sd19saXN0ID0gZW50cnk7CisJfSBlbHNlIHsKKwkJZW50cnktPmxubF9uZXh0ID0gbHdwLT5sd19saXN0OworCQlsd3AtPmx3X2xpc3QgPSBlbnRyeTsKKwl9CisKKwlyZXR1cm4gKEJfRkFMU0UpOworfQorCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX2xpYmRscGkocGNhcF90ICpwKQoreworCWludCByZXR2OworCWRscGlfaGFuZGxlX3QgZGg7CisJZGxwaV9pbmZvX3QgZGxpbmZvOworCWludCBlcnIgPSBQQ0FQX0VSUk9SOworCisJLyoKKwkgKiBFbmFibGUgU29sYXJpcyByYXcgYW5kIHBhc3NpdmUgRExQSSBleHRlbnNpb25zOworCSAqIGRscGlfb3BlbigpIHdpbGwgbm90IGZhaWwgaWYgdGhlIHVuZGVybHlpbmcgbGluayBkb2VzIG5vdCBzdXBwb3J0CisJICogcGFzc2l2ZSBtb2RlLiBTZWUgZGxwaSg3UCkgZm9yIGRldGFpbHMuCisJICovCisJcmV0diA9IGRscGlfb3BlbihwLT5vcHQuc291cmNlLCAmZGgsIERMUElfUkFXfERMUElfUEFTU0lWRSk7CisJaWYgKHJldHYgIT0gRExQSV9TVUNDRVNTKSB7CisJCWlmIChyZXR2ID09IERMUElfRUxJTktOQU1FSU5WQUwgfHwgcmV0diA9PSBETFBJX0VOT0xJTkspCisJCQllcnIgPSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFOworCQllbHNlIGlmIChyZXR2ID09IERMX1NZU0VSUiAmJgorCQkgICAgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykpCisJCQllcnIgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQlwY2FwX2xpYmRscGlfZXJyKHAtPm9wdC5zb3VyY2UsICJkbHBpX29wZW4iLCByZXR2LAorCQkgICAgcC0+ZXJyYnVmKTsKKwkJcmV0dXJuIChlcnIpOworCX0KKwlwLT5kbHBpX2hkID0gZGg7CisKKwlpZiAocC0+b3B0LnJmbW9uKSB7CisJCS8qCisJCSAqIFRoaXMgZGV2aWNlIGV4aXN0cywgYnV0IHdlIGRvbid0IHN1cHBvcnQgbW9uaXRvciBtb2RlCisJCSAqIGFueSBwbGF0Zm9ybXMgdGhhdCBzdXBwb3J0IERMUEkuCisJCSAqLworCQllcnIgPSBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJZ290byBiYWQ7CisJfQorCisJLyogQmluZCB3aXRoIERMUElfQU5ZX1NBUC4gKi8KKwlpZiAoKHJldHYgPSBkbHBpX2JpbmQocC0+ZGxwaV9oZCwgRExQSV9BTllfU0FQLCAwKSkgIT0gRExQSV9TVUNDRVNTKSB7CisJCXBjYXBfbGliZGxwaV9lcnIocC0+b3B0LnNvdXJjZSwgImRscGlfYmluZCIsIHJldHYsIHAtPmVycmJ1Zik7CisJCWdvdG8gYmFkOworCX0KKworCS8qIEVuYWJsZSBwcm9taXNjdW91cyBtb2RlLiAqLworCWlmIChwLT5vcHQucHJvbWlzYykgeworCQllcnIgPSBkbHByb21pc2NvbihwLCBETF9QUk9NSVNDX1BIWVMpOworCQlpZiAoZXJyIDwgMCkgeworCQkJLyoKKwkJCSAqICJZb3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNhcHR1cmUgb24KKwkJCSAqIHRoaXMgZGV2aWNlIiBhbmQgInlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24KKwkJCSAqIHRvIGNhcHR1cmUgaW4gcHJvbWlzY3VvdXMgbW9kZSBvbiB0aGlzCisJCQkgKiBkZXZpY2UiIGFyZSBkaWZmZXJlbnQ7IGxldCB0aGUgdXNlciBrbm93LAorCQkJICogc28gaWYgdGhleSBjYW4ndCBnZXQgcGVybWlzc2lvbiB0bworCQkJICogY2FwdHVyZSBpbiBwcm9taXNjdW91cyBtb2RlLCB0aGV5IGNhbiBhdAorCQkJICogbGVhc3QgdHJ5IHRvIGNhcHR1cmUgaW4gbm9uLXByb21pc2N1b3VzCisJCQkgKiBtb2RlLgorCQkJICoKKwkJCSAqIFhYWCAtIHlvdSBtaWdodCBoYXZlIHRvIGNhcHR1cmUgaW4KKwkJCSAqIHByb21pc2N1b3VzIG1vZGUgdG8gc2VlIG91dGdvaW5nIHBhY2tldHMuCisJCQkgKi8KKwkJCWlmIChlcnIgPT0gUENBUF9FUlJPUl9QRVJNX0RFTklFRCkKKwkJCQllcnIgPSBQQ0FQX0VSUk9SX1BST01JU0NfUEVSTV9ERU5JRUQ7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRyeSB0byBlbmFibGUgbXVsdGljYXN0LiAqLworCQllcnIgPSBkbHByb21pc2NvbihwLCBETF9QUk9NSVNDX01VTFRJKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBUcnkgdG8gZW5hYmxlIFNBUCBwcm9taXNjdWl0eS4gKi8KKwllcnIgPSBkbHByb21pc2NvbihwLCBETF9QUk9NSVNDX1NBUCk7CisJaWYgKGVyciA8IDApIHsKKwkJLyoKKwkJICogTm90IGZhdGFsLCBzaW5jZSB0aGUgRExfUFJPTUlTQ19QSFlTIG1vZGUgd29ya2VkLgorCQkgKiBSZXBvcnQgaXQgYXMgYSB3YXJuaW5nLCBob3dldmVyLgorCQkgKi8KKwkJaWYgKHAtPm9wdC5wcm9taXNjKQorCQkJZXJyID0gUENBUF9XQVJOSU5HOworCQllbHNlCisJCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgbGluayB0eXBlLiAgKi8KKwlpZiAoKHJldHYgPSBkbHBpX2luZm8ocC0+ZGxwaV9oZCwgJmRsaW5mbywgMCkpICE9IERMUElfU1VDQ0VTUykgeworCQlwY2FwX2xpYmRscGlfZXJyKHAtPm9wdC5zb3VyY2UsICJkbHBpX2luZm8iLCByZXR2LCBwLT5lcnJidWYpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAocGNhcF9wcm9jZXNzX21hY3R5cGUocCwgZGxpbmZvLmRpX21hY3R5cGUpICE9IDApCisJCWdvdG8gYmFkOworCisJcC0+ZmQgPSBkbHBpX2ZkKHAtPmRscGlfaGQpOworCisJLyogUHVzaCBhbmQgY29uZmlndXJlIGJ1Zm1vZC4gKi8KKwlpZiAocGNhcF9jb25mX2J1Zm1vZChwLCBwLT5zbmFwc2hvdCwgcC0+bWQudGltZW91dCkgIT0gMCkKKwkJZ290byBiYWQ7CisKKwkvKgorCSAqIEZsdXNoIHRoZSByZWFkIHNpZGUuCisJICovCisJaWYgKGlvY3RsKHAtPmZkLCBJX0ZMVVNILCBGTFVTSFIpICE9IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRkxVU0hSOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gYmFkOworCX0KKworCS8qIEFsbG9jYXRlIGRhdGEgYnVmZmVyLiAqLworCWlmIChwY2FwX2FsbG9jX2RhdGFidWYocCkgIT0gMCkKKwkJZ290byBiYWQ7CisKKwkvKgorCSAqICJwLT5mZCIgaXMgYSBGRCBmb3IgYSBTVFJFQU1TIGRldmljZSwgc28gInNlbGVjdCgpIiBhbmQKKwkgKiAicG9sbCgpIiBzaG91bGQgd29yayBvbiBpdC4KKwkgKi8KKwlwLT5zZWxlY3RhYmxlX2ZkID0gcC0+ZmQ7CisKKwlwLT5yZWFkX29wID0gcGNhcF9yZWFkX2xpYmRscGk7CisJcC0+aW5qZWN0X29wID0gcGNhcF9pbmplY3RfbGliZGxwaTsKKwlwLT5zZXRmaWx0ZXJfb3AgPSBpbnN0YWxsX2JwZl9wcm9ncmFtOwkvKiBObyBrZXJuZWwgZmlsdGVyaW5nICovCisJcC0+c2V0ZGlyZWN0aW9uX29wID0gTlVMTDsJLyogTm90IGltcGxlbWVudGVkICovCisJcC0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsJLyogQ2FuJ3QgY2hhbmdlIGRhdGEgbGluayB0eXBlICovCisJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOworCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfZGxwaTsKKwlwLT5jbGVhbnVwX29wID0gcGNhcF9jbGVhbnVwX2xpYmRscGk7CisKKwlyZXR1cm4gKDApOworYmFkOgorCXBjYXBfY2xlYW51cF9saWJkbHBpKHApOworCXJldHVybiAoZXJyKTsKK30KKworI2RlZmluZSBTVFJJTkdJRlkobikJI24KKworc3RhdGljIGludAorZGxwcm9taXNjb24ocGNhcF90ICpwLCBicGZfdV9pbnQzMiBsZXZlbCkKK3sKKwlpbnQgZXJyOworCisJcmV0diA9IGRscGlfcHJvbWlzY29uKHAtPmhkLCBsZXZlbCk7CisJaWYgKHJldHYgIT0gRExQSV9TVUNDRVNTKSB7CisJCWlmIChyZXR2ID09IERMX1NZU0VSUiAmJgorCQkgICAgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykpCisJCQllcnIgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQllbHNlCisJCQllcnIgPSBQQ0FQX0VSUk9SOworCQlwY2FwX2xpYmRscGlfZXJyKHAtPm9wdC5zb3VyY2UsICJkbHBpX3Byb21pc2NvbiIgU1RSSU5HSUZZKGxldmVsKSwKKwkJICAgIHJldHYsIHAtPmVycmJ1Zik7CisJCXJldHVybiAoZXJyKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEluIFNvbGFyaXMsIHRoZSAic3RhbmRhcmQiIG1lY2hhbmlzbSIgaS5lIFNJT0NHTElGQ09ORiB3aWxsIG9ubHkgZmluZAorICogbmV0d29yayBsaW5rcyB0aGF0IGFyZSBwbHVtYmVkIGFuZCBhcmUgdXAuIGRscGlfd2FsaygzRExQSSkgd2lsbCBmaW5kCisgKiBhZGRpdGlvbmFsIG5ldHdvcmsgbGlua3MgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgorICovCitpbnQKK3BjYXBfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1ZikKK3sKKwlpbnQgcmV0diA9IDA7CisKKwlsaW5rbmFtZWxpc3RfdAkqZW50cnksICpuZXh0OworCWxpbmt3YWxrX3QJbHcgPSB7TlVMTCwgMH07CisJaW50IAkJc2F2ZV9lcnJubzsKKworCS8qIGRscGlfd2FsaygpIGZvciBsb29wYmFjayB3aWxsIGJlIGFkZGVkIGhlcmUuICovCisKKwlkbHBpX3dhbGsobGlzdF9pbnRlcmZhY2VzLCAmbHcsIDApOworCisJaWYgKGx3Lmx3X2VyciAhPSAwKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJkbHBpX3dhbGs6ICVzIiwgcGNhcF9zdHJlcnJvcihsdy5sd19lcnIpKTsKKwkJcmV0diA9IC0xOworCQlnb3RvIGRvbmU7CisJfQorCisJLyogQWRkIGxpbmtuYW1lIGlmIGl0IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBsaXN0LiAqLworCWZvciAoZW50cnkgPSBsdy5sd19saXN0OyBlbnRyeSAhPSBOVUxMOyBlbnRyeSA9IGVudHJ5LT5sbmxfbmV4dCkgeworCQlpZiAocGNhcF9hZGRfaWYoYWxsZGV2c3AsIGVudHJ5LT5saW5rbmFtZSwgMCwgTlVMTCwgZXJyYnVmKSA8IDApCisJCQlyZXR2ID0gLTE7CisJfQorZG9uZToKKwlzYXZlX2Vycm5vID0gZXJybm87CisJZm9yIChlbnRyeSA9IGx3Lmx3X2xpc3Q7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gbmV4dCkgeworCQluZXh0ID0gZW50cnktPmxubF9uZXh0OworCQlmcmVlKGVudHJ5KTsKKwl9CisJZXJybm8gPSBzYXZlX2Vycm5vOworCisJcmV0dXJuIChyZXR2KTsKK30KKworLyoKKyAqIFJlYWQgZGF0YSByZWNlaXZlZCBvbiBETFBJIGhhbmRsZS4gUmV0dXJucyAtMiBpZiB0b2xkIHRvIHRlcm1pbmF0ZSwgZWxzZQorICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhY2tldHMgcmVhZC4KKyAqLworc3RhdGljIGludAorcGNhcF9yZWFkX2xpYmRscGkocGNhcF90ICpwLCBpbnQgY291bnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCWludCBsZW47CisJdV9jaGFyICpidWZwOworCXNpemVfdCBtc2dsZW47CisJaW50IHJldHY7CisKKwlsZW4gPSBwLT5jYzsKKwlpZiAobGVuICE9IDApIHsKKwkJYnVmcCA9IHAtPmJwOworCQlnb3RvIHByb2Nlc3NfcGt0czsKKwl9CisJZG8geworCQkvKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPyAqLworCQlpZiAocC0+YnJlYWtfbG9vcCkgeworCQkJLyoKKwkJCSAqIFllcyAtIGNsZWFyIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgaXQgaGFzLAorCQkJICogYW5kIHJldHVybiAtMiB0byBpbmRpY2F0ZSB0aGF0IHdlIHdlcmUgdG9sZCB0bworCQkJICogYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorCQkJICovCisJCQlwLT5icmVha19sb29wID0gMDsKKwkJCXJldHVybiAoLTIpOworCQl9CisKKwkJbXNnbGVuID0gcC0+YnVmc2l6ZTsKKwkJYnVmcCA9IHAtPmJ1ZmZlciArIHAtPm9mZnNldDsKKworCQlyZXR2ID0gZGxwaV9yZWN2KHAtPmRscGlfaGQsIE5VTEwsIE5VTEwsIGJ1ZnAsCisJCSAgICAmbXNnbGVuLCAtMSwgTlVMTCk7CisJCWlmIChyZXR2ICE9IERMUElfU1VDQ0VTUykgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgbW9zdCBsaWtlbHkgYSBjYWxsIHRvIHRlcm1pbmF0ZSBvdXQgb2YgdGhlCisJCQkgKiBsb29wLiBTbywgZG8gbm90IHJldHVybiBhbiBlcnJvciBtZXNzYWdlLCBpbnN0ZWFkCisJCQkgKiBjaGVjayBpZiAicGNhcF9icmVha2xvb3AoKSIgaGFzIGJlZW4gY2FsbGVkIGFib3ZlLgorCQkJICovCisJCQlpZiAocmV0diA9PSBETF9TWVNFUlIgJiYgZXJybm8gPT0gRUlOVFIpIHsKKwkJCQlsZW4gPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcGNhcF9saWJkbHBpX2VycihkbHBpX2xpbmtuYW1lKHAtPmRscGlfaGQpLAorCQkJICAgICJkbHBpX3JlY3YiLCByZXR2LCBwLT5lcnJidWYpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJbGVuID0gbXNnbGVuOworCX0gd2hpbGUgKGxlbiA9PSAwKTsKKworcHJvY2Vzc19wa3RzOgorCXJldHVybiAocGNhcF9wcm9jZXNzX3BrdHMocCwgY2FsbGJhY2ssIHVzZXIsIGNvdW50LCBidWZwLCBsZW4pKTsKK30KKworc3RhdGljIGludAorcGNhcF9pbmplY3RfbGliZGxwaShwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldHY7CisKKwlyZXR2ID0gZGxwaV9zZW5kKHAtPmRscGlfaGQsIE5VTEwsIDAsIGJ1Ziwgc2l6ZSwgTlVMTCk7CisJaWYgKHJldHYgIT0gRExQSV9TVUNDRVNTKSB7CisJCXBjYXBfbGliZGxwaV9lcnIoZGxwaV9saW5rbmFtZShwLT5kbHBpX2hkKSwgImRscGlfc2VuZCIsIHJldHYsCisJCSAgICBwLT5lcnJidWYpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJLyoKKwkgKiBkbHBpX3NlbmQoM0RMUEkpIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YKKwkgKiBieXRlcyBzZW50IG9uIHRoZSB3aXJlLiBCYXNlZCBvbiB0aGUgZmFjdCB0aGF0IERMUElfU1VDQ0VTUyB3YXMKKwkgKiByZXR1cm5lZCB3ZSBhcmUgYXNzdW1pbmcgJ3NpemUnIGJ5dGVzIHdlcmUgc2VudC4KKwkgKi8KKwlyZXR1cm4gKHNpemUpOworfQorCisvKgorICogQ2xvc2UgZGxwaSBoYW5kbGUuCisgKi8KK3N0YXRpYyB2b2lkCitwY2FwX2NsZWFudXBfbGliZGxwaShwY2FwX3QgKnApCit7CisJaWYgKHAtPmRscGlfaGQgIT0gTlVMTCkgeworCQlkbHBpX2Nsb3NlKHAtPmRscGlfaGQpOworCQlwLT5kbHBpX2hkID0gTlVMTDsKKwkJcC0+ZmQgPSAtMTsKKwl9CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKHApOworfQorCisvKgorICogV3JpdGUgZXJyb3IgbWVzc2FnZSB0byBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkCitwY2FwX2xpYmRscGlfZXJyKGNvbnN0IGNoYXIgKmxpbmtuYW1lLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgZXJyLCBjaGFyICplcnJidWYpCit7CisJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibGlicGNhcDogJXMgZmFpbGVkIG9uICVzOiAlcyIsCisJICAgIGZ1bmMsIGxpbmtuYW1lLCBkbHBpX3N0cmVycm9yKGVycikpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX2xpYmRscGk7CisJcmV0dXJuIChwKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1saW5rdHlwZS5tYW5taXNjLmluIGIvbGlicGNhcC0xLjMuMC9wY2FwLWxpbmt0eXBlLm1hbm1pc2MuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwNDM4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1saW5rdHlwZS5tYW5taXNjLmluCkBAIC0wLDAgKzEsNTAgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbGlua3R5cGUubWFubWlzYy5pbix2IDEuMyAyMDA4LTEwLTI3IDIyOjUyOjMwIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTg3LCAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUC1MSU5LVFlQRSBATUFOX01JU0NfSU5GT0AgIjIzIE9jdG9iZXIgMjAwOCIKKy5TSCBOQU1FCitwY2FwLWxpbmt0eXBlIFwtIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIHN1cHBvcnRlZCBieSBsaWJwY2FwCisuU0ggREVTQ1JJUFRJT04KK0ZvciBhIGxpdmUgY2FwdHVyZSBvciBgYHNhdmVmaWxlJycsIGxpYnBjYXAgc3VwcGxpZXMsIGFzIHRoZSByZXR1cm4KK3ZhbHVlIG9mIHRoZQorLkJSIHBjYXBfZGF0YWxpbmsgKDNQQ0FQKQorcm91dGluZSwgYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgdHlwZSBvZiBsaW5rLWxheWVyIGhlYWRlciBhdCB0aGUKK2JlZ2lubmluZyBvZiB0aGUgcGFja2V0cyBpdCBwcm92aWRlcy4gIFRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSB0eXBlCitvZiBsaW5rLWxheWVyIGhlYWRlciB0aGF0IHRoZSBwYWNrZXRzIGJlaW5nIGNhcHR1cmVkIGhhdmUgb24gdGhlIG5ldHdvcmsKK2Zyb20gd2hpY2ggdGhleSdyZSBiZWluZyBjYXB0dXJlZDsgZm9yIGV4YW1wbGUsIHBhY2tldHMgZnJvbSBhbiBJRUVFCis4MDIuMTEgbmV0d29yayBtaWdodCBiZSBwcm92aWRlZCBieSBsaWJwY2FwIHdpdGggRXRoZXJuZXQgaGVhZGVycyB0aGF0Cit0aGUgbmV0d29yayBhZGFwdGVyIG9yIHRoZSBuZXR3b3JrIGFkYXB0ZXIgZHJpdmVyIGdlbmVyYXRlcyBmcm9tIHRoZQorODAyLjExIGhlYWRlcnMuICBUaGUgbmFtZXMgZm9yIHRob3NlIHZhbHVlcyBiZWdpbiB3aXRoCisuQlIgRExUXyAsCitzbyB0aGV5IGFyZSBzb21ldGltZXMgY2FsbGVkICJETFRfIHZhbHVlcyIuCisuUFAKK1RoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIGZpZWxkIGluIHRoZSBzYXZlZmlsZQoraGVhZGVyIGFyZSwgaW4gbW9zdCBidXQgbm90IGFsbCBjYXNlcywgdGhlIHNhbWUgYXMgdGhlIHZhbHVlcyByZXR1cm5lZAorYnkKKy5CUiBwY2FwX2RhdGFsaW5rKCkgLgorVGhlIG5hbWVzIGZvciB0aG9zZSB2YWx1ZXMgYmVnaW4gd2l0aAorLkJSIExJTktUWVBFXyAuCisuUFAKK1RoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlcyBzdXBwb3J0ZWQgYnkgbGlicGNhcCBhcmUgZGVzY3JpYmVkIGF0CitodHRwOi8vd3d3LnRjcGR1bXAub3JnL2xpbmt0eXBlcy5odG1sLgorLlNIIFNFRSBBTFNPCitwY2FwX2RhdGFsaW5rKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLWxpbnV4LmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY4ZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLWxpbnV4LmMKQEAgLTAsMCArMSw1NTYxIEBACisvKgorICogIHBjYXAtbGludXguYzogUGFja2V0IGNhcHR1cmUgaW50ZXJmYWNlIHRvIHRoZSBMaW51eCBrZXJuZWwKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAwIFRvcnN0ZW4gTGFuZHNjaG9mZiA8dG9yc3RlbkBkZWJpYW4ub3JnPgorICogIAkJICAgICAgIFNlYmFzdGlhbiBLcmFobWVyICA8a3JhaG1lckBjcy51bmktcG90c2RhbS5kZT4KKyAqCisgKiAgTGljZW5zZTogQlNECisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogIE1vZGlmaWNhdGlvbnM6ICAgICBBZGRlZCBQQUNLRVRfTU1BUCBzdXBwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgIFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4gCisgKiAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBwcmV2aW91cyB3b3JrcyBvZjoKKyAqICAgICAgICAgICAgICAgICAgICAgU2ltb24gUGF0YXJpbiA8cGF0YXJpbkBjcy51bmliby5pdD4KKyAqICAgICAgICAgICAgICAgICAgICAgUGhpbCBXb29kIDxjcHdAbGFubC5nb3Y+CisgKgorICogTW9uaXRvci1tb2RlIHN1cHBvcnQgZm9yIG1hYzgwMjExIGluY2x1ZGVzIGNvZGUgdGFrZW4gZnJvbSB0aGUgaXcKKyAqIGNvbW1hbmQ7IHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciB0aGF0IGNvZGUgaXMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDgJSm9oYW5uZXMgQmVyZworICogQ29weXJpZ2h0IChjKSAyMDA3CQlBbmR5IEx1dG9taXJza2kKKyAqIENvcHlyaWdodCAoYykgMjAwNwkJTWlrZSBLZXJzaGF3CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgJCUfDoWJvciBTdGVmYW5paworICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIAorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyAqIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VECisgKiBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbGludXguYyx2IDEuMTY0IDIwMDgtMTItMTQgMjI6MDA6NTcgZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisvKgorICogS25vd24gcHJvYmxlbXMgd2l0aCAyLjBbLnhdIGtlcm5lbHM6CisgKgorICogICAtIFRoZSBsb29wYmFjayBkZXZpY2UgZ2l2ZXMgZXZlcnkgcGFja2V0IHR3aWNlOyBvbiAyLjJbLnhdIGtlcm5lbHMsCisgKiAgICAgaWYgd2UgdXNlIFBGX1BBQ0tFVCwgd2UgY2FuIGZpbHRlciBvdXQgdGhlIHRyYW5zbWl0dGVkIHZlcnNpb24KKyAqICAgICBvZiB0aGUgcGFja2V0IGJ5IHVzaW5nIGRhdGEgaW4gdGhlICJzb2NrYWRkcl9sbCIgcmV0dXJuZWQgYnkKKyAqICAgICAicmVjdmZyb20oKSIsIGJ1dCwgb24gMi4wWy54XSBrZXJuZWxzLCB3ZSBoYXZlIHRvIHVzZQorICogICAgIFBGX0lORVQvU09DS19QQUNLRVQsIHdoaWNoIG1lYW5zICJyZWN2ZnJvbSgpIiBzdXBwbGllcyBhCisgKiAgICAgInNvY2thZGRyX3BrdCIgd2hpY2ggZG9lc24ndCBnaXZlIHVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBsZXQKKyAqICAgICB1cyBkbyB0aGF0LgorICoKKyAqICAgLSBXZSBoYXZlIHRvIHNldCB0aGUgaW50ZXJmYWNlJ3MgSUZGX1BST01JU0MgZmxhZyBvdXJzZWx2ZXMsIGlmCisgKiAgICAgd2UncmUgdG8gcnVuIGluIHByb21pc2N1b3VzIG1vZGUsIHdoaWNoIG1lYW5zIHdlIGhhdmUgdG8gdHVybgorICogICAgIGl0IG9mZiBvdXJzZWx2ZXMgd2hlbiB3ZSdyZSBkb25lOyB0aGUga2VybmVsIGRvZXNuJ3Qga2VlcCB0cmFjaworICogICAgIG9mIGhvdyBtYW55IHNvY2tldHMgYXJlIGxpc3RlbmluZyBwcm9taXNjdW91c2x5LCB3aGljaCBtZWFucworICogICAgIGl0IHdvbid0IGdldCB0dXJuZWQgb2ZmIGF1dG9tYXRpY2FsbHkgd2hlbiBubyBzb2NrZXRzIGFyZQorICogICAgIGxpc3RlbmluZyBwcm9taXNjdW91c2x5LiAgV2UgY2F0Y2ggInBjYXBfY2xvc2UoKSIgYW5kLCBmb3IKKyAqICAgICBpbnRlcmZhY2VzIHdlIHB1dCBpbnRvIHByb21pc2N1b3VzIG1vZGUsIHRha2UgdGhlbSBvdXQgb2YKKyAqICAgICBwcm9taXNjdW91cyBtb2RlIC0gd2hpY2ggaXNuJ3QgbmVjZXNzYXJpbHkgdGhlIHJpZ2h0IHRoaW5nIHRvCisgKiAgICAgZG8sIGlmIGFub3RoZXIgc29ja2V0IGFsc28gcmVxdWVzdGVkIHByb21pc2N1b3VzIG1vZGUgYmV0d2VlbgorICogICAgIHRoZSB0aW1lIHdoZW4gd2Ugb3BlbmVkIHRoZSBzb2NrZXQgYW5kIHRoZSB0aW1lIHdoZW4gd2UgY2xvc2UKKyAqICAgICB0aGUgc29ja2V0LgorICoKKyAqICAgLSBNU0dfVFJVTkMgaXNuJ3Qgc3VwcG9ydGVkLCBzbyB5b3UgY2FuJ3Qgc3BlY2lmeSB0aGF0ICJyZWN2ZnJvbSgpIgorICogICAgIHJldHVybiB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCB5b3UgY291bGQgaGF2ZSByZWFkLCByYXRoZXIgdGhhbgorICogICAgIHRoZSBhbW91bnQgdGhhdCB3YXMgcmV0dXJuZWQsIHNvIHdlIGNhbid0IGp1c3QgYWxsb2NhdGUgYSBidWZmZXIKKyAqICAgICB3aG9zZSBzaXplIGlzIHRoZSBzbmFwc2hvdCBsZW5ndGggYW5kIHBhc3MgdGhlIHNuYXBzaG90IGxlbmd0aAorICogICAgIGFzIHRoZSBieXRlIGNvdW50LCBhbmQgYWxzbyBwYXNzIE1TR19UUlVOQywgc28gdGhhdCB0aGUgcmV0dXJuCisgKiAgICAgdmFsdWUgdGVsbHMgdXMgaG93IGxvbmcgdGhlIHBhY2tldCB3YXMgb24gdGhlIHdpcmUuCisgKgorICogICAgIFRoaXMgbWVhbnMgdGhhdCwgaWYgd2Ugd2FudCB0byBnZXQgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBwYWNrZXQsCisgKiAgICAgc28gd2UgY2FuIHJldHVybiBpdCBpbiB0aGUgImxlbiIgZmllbGQgb2YgdGhlIHBhY2tldCBoZWFkZXIsCisgKiAgICAgd2UgaGF2ZSB0byByZWFkIHRoZSBlbnRpcmUgcGFja2V0LCBub3QganVzdCB0aGUgcGFydCB0aGF0IGZpdHMKKyAqICAgICB3aXRoaW4gdGhlIHNuYXBzaG90IGxlbmd0aCwgYW5kIHRodXMgd2FzdGUgQ1BVIHRpbWUgY29weWluZyBkYXRhCisgKiAgICAgZnJvbSB0aGUga2VybmVsIHRoYXQgb3VyIGNhbGxlciB3b24ndCBzZWUuCisgKgorICogICAgIFdlIGhhdmUgdG8gZ2V0IHRoZSBhY3R1YWwgc2l6ZSwgYW5kIHN1cHBseSBpdCBpbiAibGVuIiwgYmVjYXVzZQorICogICAgIG90aGVyd2lzZSwgdGhlIElQIGRpc3NlY3RvciBpbiB0Y3BkdW1wLCBmb3IgZXhhbXBsZSwgd2lsbCBjb21wbGFpbgorICogICAgIGFib3V0ICJ0cnVuY2F0ZWQtaXAiLCBhcyB0aGUgcGFja2V0IHdpbGwgYXBwZWFyIHRvIGhhdmUgYmVlbgorICogICAgIHNob3J0ZXIsIG9uIHRoZSB3aXJlLCB0aGFuIHRoZSBJUCBoZWFkZXIgc2FpZCBpdCBzaG91bGQgaGF2ZSBiZWVuLgorICovCisKKworI2RlZmluZSBfR05VX1NPVVJDRQorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKyNpbmNsdWRlICJwY2FwL3NsbC5oIgorI2luY2x1ZGUgInBjYXAvdmxhbi5oIgorCisjaWZkZWYgSEFWRV9EQUdfQVBJCisjaW5jbHVkZSAicGNhcC1kYWcuaCIKKyNlbmRpZiAvKiBIQVZFX0RBR19BUEkgKi8KKworI2lmZGVmIEhBVkVfU0VQVEVMX0FQSQorI2luY2x1ZGUgInBjYXAtc2VwdGVsLmgiCisjZW5kaWYgLyogSEFWRV9TRVBURUxfQVBJICovCisKKyNpZmRlZiBIQVZFX1NORl9BUEkKKyNpbmNsdWRlICJwY2FwLXNuZi5oIgorI2VuZGlmIC8qIEhBVkVfU05GX0FQSSAqLworCisjaWZkZWYgUENBUF9TVVBQT1JUX1VTQgorI2luY2x1ZGUgInBjYXAtdXNiLWxpbnV4LmgiCisjZW5kaWYKKworI2lmZGVmIFBDQVBfU1VQUE9SVF9CVAorI2luY2x1ZGUgInBjYXAtYnQtbGludXguaCIKKyNlbmRpZgorCisjaWZkZWYgUENBUF9TVVBQT1JUX0NBTgorI2luY2x1ZGUgInBjYXAtY2FuLWxpbnV4LmgiCisjZW5kaWYKKworI2lmIFBDQVBfU1VQUE9SVF9DQU5VU0IKKyNpbmNsdWRlICJwY2FwLWNhbnVzYi1saW51eC5oIgorI2VuZGlmCisKKyNpZmRlZiBQQ0FQX1NVUFBPUlRfTkVURklMVEVSCisjaW5jbHVkZSAicGNhcC1uZXRmaWx0ZXItbGludXguaCIKKyNlbmRpZgorCisvKgorICogSWYgUEZfUEFDS0VUIGlzIGRlZmluZWQsIHdlIGNhbiB1c2Uge1NPQ0tfUkFXLFNPQ0tfREdSQU19L1BGX1BBQ0tFVAorICogc29ja2V0cyByYXRoZXIgdGhhbiBTT0NLX1BBQ0tFVCBzb2NrZXRzLgorICoKKyAqIFRvIHVzZSB0aGVtLCB3ZSBpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4gcmF0aGVyIHRoYW4KKyAqIDxuZXRwYWNrZXQvcGFja2V0Lmg+OyB3ZSBkbyBzbyBiZWNhdXNlCisgKgorICoJc29tZSBMaW51eCBkaXN0cmlidXRpb25zIChlLmcuLCBTbGFja3dhcmUgNC4wKSBoYXZlIDIuMiBvcgorICoJbGF0ZXIga2VybmVscyBhbmQgbGliYzUsIGFuZCBkb24ndCBwcm92aWRlIGEgPG5ldHBhY2tldC9wYWNrZXQuaD4KKyAqCWZpbGU7CisgKgorICoJbm90IGFsbCB2ZXJzaW9ucyBvZiBnbGliYzIgaGF2ZSBhIDxuZXRwYWNrZXQvcGFja2V0Lmg+IGZpbGUKKyAqCXRoYXQgZGVmaW5lcyBzdHVmZiBuZWVkZWQgZm9yIHNvbWUgb2YgdGhlIDIuNC1vci1sYXRlci1rZXJuZWwKKyAqCWZlYXR1cmVzLCBzbyBpZiB0aGUgc3lzdGVtIGhhcyBhIDIuNCBvciBsYXRlciBrZXJuZWwsIHdlCisgKglzdGlsbCBjYW4ndCB1c2UgdGhvc2UgZmVhdHVyZXMuCisgKgorICogV2UncmUgYWxyZWFkeSBpbmNsdWRpbmcgYSBudW1iZXIgb2Ygb3RoZXIgPGxpbnV4L1hYWC5oPiBoZWFkZXJzLCBhbmQKKyAqIHRoaXMgY29kZSBpcyBMaW51eC1zcGVjaWZpYyAobm8gb3RoZXIgT1MgaGFzIFBGX1BBQ0tFVCBzb2NrZXRzIGFzCisgKiBhIHJhdyBwYWNrZXQgY2FwdHVyZSBtZWNoYW5pc20pLCBzbyBpdCdzIG5vdCBhcyBpZiB5b3UgZ2FpbiBhbnkKKyAqIHVzZWZ1bCBwb3J0YWJpbGl0eSBieSB1c2luZyA8bmV0cGFja2V0L3BhY2tldC5oPgorICoKKyAqIFhYWCAtIHNob3VsZCB3ZSBqdXN0IGluY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPiBldmVuIGlmIFBGX1BBQ0tFVAorICogaXNuJ3QgZGVmaW5lZD8gIEl0IG9ubHkgZGVmaW5lcyBvbmUgZGF0YSBzdHJ1Y3R1cmUgaW4gMi4wLngsIHNvCisgKiBpdCBzaG91bGRuJ3QgY2F1c2UgYW55IHByb2JsZW1zLgorICovCisjaWZkZWYgUEZfUEFDS0VUCisjIGluY2x1ZGUgPGxpbnV4L2lmX3BhY2tldC5oPgorCisgLyoKKyAgKiBPbiBhdCBsZWFzdCBzb21lIExpbnV4IGRpc3RyaWJ1dGlvbnMgKGZvciBleGFtcGxlLCBSZWQgSGF0IDUuMiksCisgICogdGhlcmUncyBubyA8bmV0cGFja2V0L3BhY2tldC5oPiBmaWxlLCBidXQgUEZfUEFDS0VUIGlzIGRlZmluZWQgaWYKKyAgKiB5b3UgaW5jbHVkZSA8c3lzL3NvY2tldC5oPiwgYnV0IDxsaW51eC9pZl9wYWNrZXQuaD4gZG9lc24ndCBkZWZpbmUKKyAgKiBhbnkgb2YgdGhlIFBGX1BBQ0tFVCBzdHVmZiBzdWNoIGFzICJzdHJ1Y3Qgc29ja2FkZHJfbGwiIG9yIGFueSBvZgorICAqIHRoZSBQQUNLRVRfeHh4IHN0dWZmLgorICAqCisgICogU28gd2UgY2hlY2sgd2hldGhlciBQQUNLRVRfSE9TVCBpcyBkZWZpbmVkLCBhbmQgYXNzdW1lIHRoYXQgd2UgaGF2ZQorICAqIFBGX1BBQ0tFVCBzb2NrZXRzIG9ubHkgaWYgaXQgaXMgZGVmaW5lZC4KKyAgKi8KKyMgaWZkZWYgUEFDS0VUX0hPU1QKKyMgIGRlZmluZSBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCisjICBpZmRlZiBQQUNLRVRfQVVYREFUQQorIyAgIGRlZmluZSBIQVZFX1BBQ0tFVF9BVVhEQVRBCisjICBlbmRpZiAvKiBQQUNLRVRfQVVYREFUQSAqLworIyBlbmRpZiAvKiBQQUNLRVRfSE9TVCAqLworCisKKyAvKiBjaGVjayBmb3IgbWVtb3J5IG1hcHBlZCBhY2Nlc3MgYXZhaWJpbGl0eS4gV2UgYXNzdW1lIGV2ZXJ5IG5lZWRlZCAKKyAgKiBzdHJ1Y3QgaXMgZGVmaW5lZCBpZiB0aGUgbWFjcm8gVFBBQ0tFVF9IRFJMRU4gaXMgZGVmaW5lZCwgYmVjYXVzZSBpdAorICAqIHVzZXMgbWFueSByaW5nIHJlbGF0ZWQgc3RydWN0cyBhbmQgbWFjcm9zICovCisjIGlmZGVmIFRQQUNLRVRfSERSTEVOCisjICBkZWZpbmUgSEFWRV9QQUNLRVRfUklORworIyAgaWZkZWYgVFBBQ0tFVDJfSERSTEVOCisjICAgZGVmaW5lIEhBVkVfVFBBQ0tFVDIKKyMgIGVsc2UKKyMgICBkZWZpbmUgVFBBQ0tFVF9WMQkwCisjICBlbmRpZiAvKiBUUEFDS0VUMl9IRFJMRU4gKi8KKyMgZW5kaWYgLyogVFBBQ0tFVF9IRFJMRU4gKi8KKyNlbmRpZiAvKiBQRl9QQUNLRVQgKi8KKworI2lmZGVmIFNPX0FUVEFDSF9GSUxURVIKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2VuZGlmCisKKy8qCisgKiBXZSBuZWVkIGxpbnV4L3NvY2tpb3MuaCBpZiB3ZSBoYXZlIGxpbnV4L25ldF90c3RhbXAuaCAoZm9yIHRpbWUgc3RhbXAKKyAqIHNwZWNpZmljYXRpb24pIG9yIGxpbnV4L2V0aHRvb2wuaCAoZm9yIGV0aHRvb2wgaW9jdGxzIHRvIGdldCBvZmZsb2FkaW5nCisgKiBpbmZvcm1hdGlvbikuCisgKi8KKyNpZiBkZWZpbmVkKEhBVkVfTElOVVhfTkVUX1RTVEFNUF9IKSB8fCBkZWZpbmVkKEhBVkVfTElOVVhfRVRIVE9PTF9IKQorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9MSU5VWF9ORVRfVFNUQU1QX0gKKyNpbmNsdWRlIDxsaW51eC9uZXRfdHN0YW1wLmg+CisjZW5kaWYKKworLyoKKyAqIEdvdCBXaXJlbGVzcyBFeHRlbnNpb25zPworICovCisjaWZkZWYgSEFWRV9MSU5VWF9XSVJFTEVTU19ICisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNlbmRpZiAvKiBIQVZFX0xJTlVYX1dJUkVMRVNTX0ggKi8KKworLyoKKyAqIEdvdCBsaWJubD8KKyAqLworI2lmZGVmIEhBVkVfTElCTkwKKyNpbmNsdWRlIDxsaW51eC9ubDgwMjExLmg+CisKKyNpbmNsdWRlIDxuZXRsaW5rL2dlbmwvZ2VubC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvZ2VubC9mYW1pbHkuaD4KKyNpbmNsdWRlIDxuZXRsaW5rL2dlbmwvY3RybC5oPgorI2luY2x1ZGUgPG5ldGxpbmsvbXNnLmg+CisjaW5jbHVkZSA8bmV0bGluay9hdHRyLmg+CisjZW5kaWYgLyogSEFWRV9MSUJOTCAqLworCisvKgorICogR290IGV0aHRvb2wgc3VwcG9ydD8KKyAqLworI2lmZGVmIEhBVkVfTElOVVhfRVRIVE9PTF9ICisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TT0NLTEVOX1QKK3R5cGVkZWYgaW50CQlzb2NrbGVuX3Q7CisjZW5kaWYKKworI2lmbmRlZiBNU0dfVFJVTkMKKy8qCisgKiBUaGlzIGlzIGJlaW5nIGNvbXBpbGVkIG9uIGEgc3lzdGVtIHRoYXQgbGFja3MgTVNHX1RSVU5DOyBkZWZpbmUgaXQKKyAqIHdpdGggdGhlIHZhbHVlIGl0IGhhcyBpbiB0aGUgMi4yIGFuZCBsYXRlciBrZXJuZWxzLCBzbyB0aGF0LCBvbgorICogdGhvc2Uga2VybmVscywgd2hlbiB3ZSBwYXNzIGl0IGluIHRoZSBmbGFncyBhcmd1bWVudCB0byAicmVjdmZyb20oKSIKKyAqIHdlJ3JlIHBhc3NpbmcgdGhlIHJpZ2h0IHZhbHVlIGFuZCB0aHVzIGdldCB0aGUgTVNHX1RSVU5DIGJlaGF2aW9yCisgKiB3ZSB3YW50LiAgKFdlIGRvbid0IGdldCB0aGF0IGJlaGF2aW9yIG9uIDIuMFsueF0ga2VybmVscywgYmVjYXVzZQorICogdGhleSBkaWRuJ3Qgc3VwcG9ydCBNU0dfVFJVTkMuKQorICovCisjZGVmaW5lIE1TR19UUlVOQwkweDIwCisjZW5kaWYKKworI2lmbmRlZiBTT0xfUEFDS0VUCisvKgorICogVGhpcyBpcyBiZWluZyBjb21waWxlZCBvbiBhIHN5c3RlbSB0aGF0IGxhY2tzIFNPTF9QQUNLRVQ7IGRlZmluZSBpdAorICogd2l0aCB0aGUgdmFsdWUgaXQgaGFzIGluIHRoZSAyLjIgYW5kIGxhdGVyIGtlcm5lbHMsIHNvIHRoYXQgd2UgY2FuCisgKiBzZXQgcHJvbWlzY3VvdXMgbW9kZSBpbiB0aGUgZ29vZCBtb2Rlcm4gd2F5IHJhdGhlciB0aGFuIHRoZSBvbGQKKyAqIDIuMC1rZXJuZWwgY3JhcHB5IHdheS4KKyAqLworI2RlZmluZSBTT0xfUEFDS0VUCTI2MworI2VuZGlmCisKKyNkZWZpbmUgTUFYX0xJTktIRUFERVJfU0laRQkyNTYKKworLyoKKyAqIFdoZW4gY2FwdHVyaW5nIG9uIGFsbCBpbnRlcmZhY2VzIHdlIHVzZSB0aGlzIGFzIHRoZSBidWZmZXIgc2l6ZS4KKyAqIFNob3VsZCBiZSBiaWdnZXIgdGhlbiBhbGwgTVRVcyB0aGF0IG9jY3VyIGluIHJlYWwgbGlmZS4KKyAqIDY0a0Igc2hvdWxkIGJlIGVub3VnaCBmb3Igbm93LgorICovCisjZGVmaW5lIEJJR0dFUl9USEFOX0FMTF9NVFVTCSg2NCoxMDI0KQorCisvKgorICogUHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zIGFuZCBtZXRob2RzLgorICovCitzdGF0aWMgdm9pZCBtYXBfYXJwaHJkX3RvX2RsdChwY2FwX3QgKiwgaW50LCBpbnQpOworI2lmZGVmIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKK3N0YXRpYyBzaG9ydCBpbnQgbWFwX3BhY2tldF90eXBlX3RvX3NsbF90eXBlKHNob3J0IGludCk7CisjZW5kaWYKK3N0YXRpYyBpbnQgcGNhcF9hY3RpdmF0ZV9saW51eChwY2FwX3QgKik7CitzdGF0aWMgaW50IGFjdGl2YXRlX29sZChwY2FwX3QgKik7CitzdGF0aWMgaW50IGFjdGl2YXRlX25ldyhwY2FwX3QgKik7CitzdGF0aWMgaW50IGFjdGl2YXRlX21tYXAocGNhcF90ICosIGludCAqKTsKK3N0YXRpYyBpbnQgcGNhcF9jYW5fc2V0X3JmbW9uX2xpbnV4KHBjYXBfdCAqKTsKK3N0YXRpYyBpbnQgcGNhcF9yZWFkX2xpbnV4KHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOworc3RhdGljIGludCBwY2FwX3JlYWRfcGFja2V0KHBjYXBfdCAqLCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgcGNhcF9pbmplY3RfbGludXgocGNhcF90ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgcGNhcF9zdGF0c19saW51eChwY2FwX3QgKiwgc3RydWN0IHBjYXBfc3RhdCAqKTsKK3N0YXRpYyBpbnQgcGNhcF9zZXRmaWx0ZXJfbGludXgocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK3N0YXRpYyBpbnQgcGNhcF9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworc3RhdGljIHZvaWQgcGNhcF9jbGVhbnVwX2xpbnV4KHBjYXBfdCAqKTsKKwordW5pb24gdGhkciB7CisJc3RydWN0IHRwYWNrZXRfaGRyCSpoMTsKKwlzdHJ1Y3QgdHBhY2tldDJfaGRyCSpoMjsKKwl2b2lkCQkJKnJhdzsKK307CisKKyNpZmRlZiBIQVZFX1BBQ0tFVF9SSU5HCisjZGVmaW5lIFJJTkdfR0VUX0ZSQU1FKGgpICgoKHVuaW9uIHRoZHIgKiopaC0+YnVmZmVyKVtoLT5vZmZzZXRdKQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3JpbmcocGNhcF90ICpoYW5kbGUpOworc3RhdGljIGludCBjcmVhdGVfcmluZyhwY2FwX3QgKmhhbmRsZSwgaW50ICpzdGF0dXMpOworc3RhdGljIGludCBwcmVwYXJlX3RwYWNrZXRfc29ja2V0KHBjYXBfdCAqaGFuZGxlKTsKK3N0YXRpYyB2b2lkIHBjYXBfY2xlYW51cF9saW51eF9tbWFwKHBjYXBfdCAqKTsKK3N0YXRpYyBpbnQgcGNhcF9yZWFkX2xpbnV4X21tYXAocGNhcF90ICosIGludCwgcGNhcF9oYW5kbGVyICwgdV9jaGFyICopOworc3RhdGljIGludCBwY2FwX3NldGZpbHRlcl9saW51eF9tbWFwKHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CitzdGF0aWMgaW50IHBjYXBfc2V0bm9uYmxvY2tfbW1hcChwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKTsKK3N0YXRpYyBpbnQgcGNhcF9nZXRub25ibG9ja19tbWFwKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKTsKK3N0YXRpYyB2b2lkIHBjYXBfb25lc2hvdF9tbWFwKHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLAorICAgIGNvbnN0IHVfY2hhciAqYnl0ZXMpOworI2VuZGlmCisKKy8qCisgKiBXcmFwIHNvbWUgaW9jdGwgY2FsbHMKKyAqLworI2lmZGVmIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKK3N0YXRpYyBpbnQJaWZhY2VfZ2V0X2lkKGludCBmZCwgY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKTsKKyNlbmRpZiAvKiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTICovCitzdGF0aWMgaW50CWlmYWNlX2dldF9tdHUoaW50IGZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOworc3RhdGljIGludCAJaWZhY2VfZ2V0X2FycHR5cGUoaW50IGZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOworI2lmZGVmIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKK3N0YXRpYyBpbnQgCWlmYWNlX2JpbmQoaW50IGZkLCBpbnQgaWZpbmRleCwgY2hhciAqZWJ1Zik7CisjaWZkZWYgSVdfTU9ERV9NT05JVE9SCitzdGF0aWMgaW50CWhhc193ZXh0KGludCBzb2NrX2ZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOworI2VuZGlmIC8qIElXX01PREVfTU9OSVRPUiAqLworc3RhdGljIGludAllbnRlcl9yZm1vbl9tb2RlKHBjYXBfdCAqaGFuZGxlLCBpbnQgc29ja19mZCwKKyAgICBjb25zdCBjaGFyICpkZXZpY2UpOworI2VuZGlmIC8qIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMgKi8KK3N0YXRpYyBpbnQJaWZhY2VfZ2V0X29mZmxvYWQocGNhcF90ICpoYW5kbGUpOworc3RhdGljIGludCAJaWZhY2VfYmluZF9vbGQoaW50IGZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOworCisjaWZkZWYgU09fQVRUQUNIX0ZJTFRFUgorc3RhdGljIGludAlmaXhfcHJvZ3JhbShwY2FwX3QgKmhhbmRsZSwgc3RydWN0IHNvY2tfZnByb2cgKmZjb2RlLAorICAgIGludCBpc19tYXBwZWQpOworc3RhdGljIGludAlmaXhfb2Zmc2V0KHN0cnVjdCBicGZfaW5zbiAqcCk7CitzdGF0aWMgaW50CXNldF9rZXJuZWxfZmlsdGVyKHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3Qgc29ja19mcHJvZyAqZmNvZGUpOworc3RhdGljIGludAlyZXNldF9rZXJuZWxfZmlsdGVyKHBjYXBfdCAqaGFuZGxlKTsKKworc3RhdGljIHN0cnVjdCBzb2NrX2ZpbHRlcgl0b3RhbF9pbnNuCisJPSBCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDApOworc3RhdGljIHN0cnVjdCBzb2NrX2Zwcm9nCXRvdGFsX2Zjb2RlCisJPSB7IDEsICZ0b3RhbF9pbnNuIH07CisjZW5kaWYgLyogU09fQVRUQUNIX0ZJTFRFUiAqLworCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqaGFuZGxlOworCisJLyoKKwkgKiBBIG51bGwgZGV2aWNlIG5hbWUgaXMgZXF1aXZhbGVudCB0byB0aGUgImFueSIgZGV2aWNlLgorCSAqLworCWlmIChkZXZpY2UgPT0gTlVMTCkKKwkJZGV2aWNlID0gImFueSI7CisKKyNpZmRlZiBIQVZFX0RBR19BUEkKKwlpZiAoc3Ryc3RyKGRldmljZSwgImRhZyIpKSB7CisJCXJldHVybiBkYWdfY3JlYXRlKGRldmljZSwgZWJ1Zik7CisJfQorI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLworCisjaWZkZWYgSEFWRV9TRVBURUxfQVBJCisJaWYgKHN0cnN0cihkZXZpY2UsICJzZXB0ZWwiKSkgeworCQlyZXR1cm4gc2VwdGVsX2NyZWF0ZShkZXZpY2UsIGVidWYpOworCX0KKyNlbmRpZiAvKiBIQVZFX1NFUFRFTF9BUEkgKi8KKworI2lmZGVmIEhBVkVfU05GX0FQSQorICAgICAgICBoYW5kbGUgPSBzbmZfY3JlYXRlKGRldmljZSwgZWJ1Zik7CisgICAgICAgIGlmIChzdHJzdHIoZGV2aWNlLCAic25mIikgfHwgaGFuZGxlICE9IE5VTEwpCisJCXJldHVybiBoYW5kbGU7CisKKyNlbmRpZiAvKiBIQVZFX1NORl9BUEkgKi8KKworI2lmZGVmIFBDQVBfU1VQUE9SVF9CVAorCWlmIChzdHJzdHIoZGV2aWNlLCAiYmx1ZXRvb3RoIikpIHsKKwkJcmV0dXJuIGJ0X2NyZWF0ZShkZXZpY2UsIGVidWYpOworCX0KKyNlbmRpZgorCisjaWYgUENBUF9TVVBQT1JUX0NBTlVTQgorICBpZiAoc3Ryc3RyKGRldmljZSwgImNhbnVzYiIpKSB7CisgICAgcmV0dXJuIGNhbnVzYl9jcmVhdGUoZGV2aWNlLCBlYnVmKTsKKyAgfQorI2VuZGlmCisKKyNpZmRlZiBQQ0FQX1NVUFBPUlRfQ0FOCisJaWYgKChzdHJuY21wKGRldmljZSwgImNhbiIsIDMpID09IDAgJiYgaXNkaWdpdChkZXZpY2VbM10pKSB8fAorCSAgICAoc3RybmNtcChkZXZpY2UsICJ2Y2FuIiwgNCkgPT0gMCAmJiBpc2RpZ2l0KGRldmljZVs0XSkpKSB7CisJCXJldHVybiBjYW5fY3JlYXRlKGRldmljZSwgZWJ1Zik7CisJfQorI2VuZGlmCisKKyNpZmRlZiBQQ0FQX1NVUFBPUlRfVVNCCisJaWYgKHN0cnN0cihkZXZpY2UsICJ1c2Jtb24iKSkgeworCQlyZXR1cm4gdXNiX2NyZWF0ZShkZXZpY2UsIGVidWYpOworCX0KKyNlbmRpZgorCisjaWZkZWYgUENBUF9TVVBQT1JUX05FVEZJTFRFUgorCWlmIChzdHJuY21wKGRldmljZSwgIm5mbG9nIiwgc3RybGVuKCJuZmxvZyIpKSA9PSAwKSB7CisJCXJldHVybiBuZmxvZ19jcmVhdGUoZGV2aWNlLCBlYnVmKTsKKwl9CisjZW5kaWYKKworCWhhbmRsZSA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYpOworCWlmIChoYW5kbGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwloYW5kbGUtPmFjdGl2YXRlX29wID0gcGNhcF9hY3RpdmF0ZV9saW51eDsKKwloYW5kbGUtPmNhbl9zZXRfcmZtb25fb3AgPSBwY2FwX2Nhbl9zZXRfcmZtb25fbGludXg7CisjaWYgZGVmaW5lZChIQVZFX0xJTlVYX05FVF9UU1RBTVBfSCkgJiYgZGVmaW5lZChQQUNLRVRfVElNRVNUQU1QKQorCS8qCisJICogV2UgY2xhaW0gdGhhdCB3ZSBzdXBwb3J0OgorCSAqCisJICoJc29mdHdhcmUgdGltZSBzdGFtcHMsIHdpdGggbm8gZGV0YWlscyBhYm91dCB0aGVpciBwcmVjaXNpb247CisJICoJaGFyZHdhcmUgdGltZSBzdGFtcHMsIHN5bmNlZCB0byB0aGUgaG9zdCB0aW1lOworCSAqCWhhcmR3YXJlIHRpbWUgc3RhbXBzLCBub3Qgc3luY2VkIHRvIHRoZSBob3N0IHRpbWUuCisJICoKKwkgKiBYWFggLSB3ZSBjYW4ndCBhc2sgYSBkZXZpY2Ugd2hldGhlciBpdCBzdXBwb3J0cworCSAqIGhhcmR3YXJlIHRpbWUgc3RhbXBzLCBzbyB3ZSBqdXN0IGNsYWltIGFsbCBkZXZpY2VzIGRvLgorCSAqLworCWhhbmRsZS0+dHN0YW1wX3R5cGVfY291bnQgPSAzOworCWhhbmRsZS0+dHN0YW1wX3R5cGVfbGlzdCA9IG1hbGxvYygzICogc2l6ZW9mKHVfaW50KSk7CisJaWYgKGhhbmRsZS0+dHN0YW1wX3R5cGVfbGlzdCA9PSBOVUxMKSB7CisJCWZyZWUoaGFuZGxlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWhhbmRsZS0+dHN0YW1wX3R5cGVfbGlzdFswXSA9IFBDQVBfVFNUQU1QX0hPU1Q7CisJaGFuZGxlLT50c3RhbXBfdHlwZV9saXN0WzFdID0gUENBUF9UU1RBTVBfQURBUFRFUjsKKwloYW5kbGUtPnRzdGFtcF90eXBlX2xpc3RbMl0gPSBQQ0FQX1RTVEFNUF9BREFQVEVSX1VOU1lOQ0VEOworI2VuZGlmCisKKwlyZXR1cm4gaGFuZGxlOworfQorCisjaWZkZWYgSEFWRV9MSUJOTAorLyoKKyAqIElmIGludGVyZmFjZSB7aWZ9IGlzIGEgbWFjODAyMTEgZHJpdmVyLCB0aGUgZmlsZQorICogL3N5cy9jbGFzcy9uZXQve2lmfS9waHk4MDIxMSBpcyBhIHN5bWxpbmsgdG8KKyAqIC9zeXMvY2xhc3MvaWVlZTgwMjExL3twaHlkZXZ9LCBmb3Igc29tZSB7cGh5ZGV2fS4KKyAqCisgKiBPbiBGZWRvcmEgOSwgd2l0aCBhIDIuNi4yNi4zLTI5IGtlcm5lbCwgbXkgWnlkYXMgc3RpY2ssIGF0CisgKiBsZWFzdCwgaGFzIGEgIndtYXN0ZXIwIiBkZXZpY2UgYW5kIGEgIndsYW4wIiBkZXZpY2U7IHRoZQorICogbGF0dGVyIGlzIHRoZSBvbmUgd2l0aCB0aGUgSVAgYWRkcmVzcy4gIEJvdGggc2hvdyB1cCBpbgorICogInRjcGR1bXAgLUQiIG91dHB1dC4gIENhcHR1cmluZyBvbiB0aGUgd21hc3RlcjAgZGV2aWNlCisgKiBjYXB0dXJlcyB3aXRoIDgwMi4xMSBoZWFkZXJzLgorICoKKyAqIGFpcm1vbi1uZyBzZWFyY2hlcyB0aHJvdWdoIC9zeXMvY2xhc3MvbmV0IGZvciBkZXZpY2VzIG5hbWVkCisgKiBtb25OLCBzdGFydGluZyB3aXRoIG1vbjA7IGFzIHNvb24gYXMgb25lICpkb2Vzbid0KiBleGlzdCwKKyAqIGl0IGNob29zZXMgdGhhdCBhcyB0aGUgbW9uaXRvciBkZXZpY2UgbmFtZS4gIElmIHRoZSAiaXciCisgKiBjb21tYW5kIGV4aXN0cywgaXQgZG9lcyAiaXcgZGV2IHtpZn0gaW50ZXJmYWNlIGFkZCB7bW9uaWZ9CisgKiB0eXBlIG1vbml0b3IiLCB3aGVyZSB7bW9uaWZ9IGlzIHRoZSBtb25pdG9yIGRldmljZS4gIEl0CisgKiB0aGVuIChzaWdoKSBzbGVlcHMgLjEgc2Vjb25kLCBhbmQgdGhlbiBjb25maWd1cmVzIHRoZQorICogZGV2aWNlIHVwLiAgT3RoZXJ3aXNlLCBpZiAvc3lzL2NsYXNzL2llZWU4MDIxMS97cGh5ZGV2fS9hZGRfaWZhY2UKKyAqIGlzIGEgZmlsZSwgaXQgd3JpdGVzIHttb25kZXZ9LCB3aXRob3V0IGEgbmV3bGluZSwgdG8gdGhhdCBmaWxlLAorICogYW5kIGFnYWluIChzaWdoKSBzbGVlcHMgLjEgc2Vjb25kLCBhbmQgdGhlbiBpd2NvbmZpZydzIHRoYXQKKyAqIGRldmljZSBpbnRvIG1vbml0b3IgbW9kZSBhbmQgY29uZmlndXJlcyBpdCB1cC4gIE90aGVyd2lzZSwKKyAqIHlvdSBjYW4ndCBkbyBtb25pdG9yIG1vZGUuCisgKgorICogQWxsIHRoZXNlIGRldmljZXMgYXJlICJnbHVlZCIgdG9nZXRoZXIgYnkgaGF2aW5nIHRoZQorICogL3N5cy9jbGFzcy9uZXQve2RldmljZX0vcGh5ODAyMTEgbGlua3MgcG9pbnRpbmcgdG8gdGhlIHNhbWUKKyAqIHBsYWNlLCBzbywgZ2l2ZW4gYSB3bWFzdGVyLCB3bGFuLCBvciBtb24gZGV2aWNlLCB5b3UgY2FuCisgKiBmaW5kIHRoZSBvdGhlciBkZXZpY2VzIGJ5IGxvb2tpbmcgZm9yIGRldmljZXMgd2l0aAorICogdGhlIHNhbWUgcGh5ODAyMTEgbGluay4KKyAqCisgKiBUbyB0dXJuIG1vbml0b3IgbW9kZSBvZmYsIGRlbGV0ZSB0aGUgbW9uaXRvciBpbnRlcmZhY2UsCisgKiBlaXRoZXIgd2l0aCAiaXcgZGV2IHttb25pZn0gaW50ZXJmYWNlIGRlbCIgb3IgYnkgc2VuZGluZworICoge21vbmlmfSwgd2l0aCBubyBOTCwgZG93biAvc3lzL2NsYXNzL2llZWU4MDIxMS97cGh5ZGV2fS9yZW1vdmVfaWZhY2UKKyAqCisgKiBOb3RlOiBpZiB5b3UgdHJ5IHRvIGNyZWF0ZSBhIG1vbml0b3IgZGV2aWNlIG5hbWVkICJtb25OIiwgYW5kCisgKiB0aGVyZSdzIGFscmVhZHkgYSAibW9uTiIgZGV2aWNlLCBpdCBmYWlscywgYXMgbGVhc3Qgd2l0aAorICogdGhlIG5ldGxpbmsgaW50ZXJmYWNlICh3aGljaCBpcyB3aGF0IGl3IHVzZXMpLCB3aXRoIGEgcmV0dXJuCisgKiB2YWx1ZSBvZiAtRU5GSUxFLiAgKFJldHVybiB2YWx1ZXMgYXJlIG5lZ2F0aXZlIGVycm5vcy4pICBXZQorICogY291bGQgcHJvYmFibHkgdXNlIHRoYXQgdG8gZmluZCBhbiB1bnVzZWQgZGV2aWNlLgorICoKKyAqIFllcywgeW91IGNhbiBoYXZlIG11bHRpcGxlIG1vbml0b3IgZGV2aWNlcyBmb3IgYSBnaXZlbgorICogcGh5c2ljYWwgZGV2aWNlLgorKi8KKworLyoKKyAqIElzIHRoaXMgYSBtYWM4MDIxMSBkZXZpY2U/ICBJZiBzbywgZmlsbCBpbiB0aGUgcGh5c2ljYWwgZGV2aWNlIHBhdGggYW5kCisgKiByZXR1cm4gMTsgaWYgbm90LCByZXR1cm4gMC4gIE9uIGFuIGVycm9yLCBmaWxsIGluIGhhbmRsZS0+ZXJyYnVmIGFuZAorICogcmV0dXJuIFBDQVBfRVJST1IuCisgKi8KK3N0YXRpYyBpbnQKK2dldF9tYWM4MDIxMV9waHlkZXYocGNhcF90ICpoYW5kbGUsIGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqcGh5ZGV2X3BhdGgsCisgICAgc2l6ZV90IHBoeWRldl9tYXhfcGF0aGxlbikKK3sKKwljaGFyICpwYXRoc3RyOworCXNzaXplX3QgYnl0ZXNfcmVhZDsKKworCS8qCisJICogR2VuZXJhdGUgdGhlIHBhdGggc3RyaW5nIGZvciB0aGUgc3ltbGluayB0byB0aGUgcGh5c2ljYWwgZGV2aWNlLgorCSAqLworCWlmIChhc3ByaW50ZigmcGF0aHN0ciwgIi9zeXMvY2xhc3MvbmV0LyVzL3BoeTgwMjExIiwgZGV2aWNlKSA9PSAtMSkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogQ2FuJ3QgZ2VuZXJhdGUgcGF0aCBuYW1lIHN0cmluZyBmb3IgL3N5cy9jbGFzcy9uZXQgZGV2aWNlIiwKKwkJICAgIGRldmljZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKwlieXRlc19yZWFkID0gcmVhZGxpbmsocGF0aHN0ciwgcGh5ZGV2X3BhdGgsIHBoeWRldl9tYXhfcGF0aGxlbik7CisJaWYgKGJ5dGVzX3JlYWQgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVOT0VOVCB8fCBlcnJubyA9PSBFSU5WQUwpIHsKKwkJCS8qCisJCQkgKiBEb2Vzbid0IGV4aXN0LCBvciBub3QgYSBzeW1saW5rOyBhc3N1bWUgdGhhdAorCQkJICogbWVhbnMgaXQncyBub3QgYSBtYWM4MDIxMSBkZXZpY2UuCisJCQkgKi8KKwkJCWZyZWUocGF0aHN0cik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogQ2FuJ3QgcmVhZGxpbmsgJXM6ICVzIiwgZGV2aWNlLCBwYXRoc3RyLAorCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJZnJlZShwYXRoc3RyKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCWZyZWUocGF0aHN0cik7CisJcGh5ZGV2X3BhdGhbYnl0ZXNfcmVhZF0gPSAnXDAnOworCXJldHVybiAxOworfQorCisjaWZkZWYgSEFWRV9MSUJOTF8yX3gKKyNkZWZpbmUgZ2V0X25sX2Vycm1zZwlubF9nZXRlcnJvcgorI2Vsc2UKKy8qIGxpYm5sIDIueCBjb21wYXRpYmlsaXR5IGNvZGUgKi8KKworI2RlZmluZSBubF9zb2NrIG5sX2hhbmRsZQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBubF9oYW5kbGUgKgorbmxfc29ja2V0X2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIG5sX2hhbmRsZV9hbGxvYygpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25sX3NvY2tldF9mcmVlKHN0cnVjdCBubF9oYW5kbGUgKmgpCit7CisJbmxfaGFuZGxlX2Rlc3Ryb3koaCk7Cit9CisKKyNkZWZpbmUgZ2V0X25sX2Vycm1zZwlzdHJlcnJvcgorCitzdGF0aWMgaW5saW5lIGludAorX19nZW5sX2N0cmxfYWxsb2NfY2FjaGUoc3RydWN0IG5sX2hhbmRsZSAqaCwgc3RydWN0IG5sX2NhY2hlICoqY2FjaGUpCit7CisJc3RydWN0IG5sX2NhY2hlICp0bXAgPSBnZW5sX2N0cmxfYWxsb2NfY2FjaGUoaCk7CisJaWYgKCF0bXApCisJCXJldHVybiAtRU5PTUVNOworCSpjYWNoZSA9IHRtcDsKKwlyZXR1cm4gMDsKK30KKyNkZWZpbmUgZ2VubF9jdHJsX2FsbG9jX2NhY2hlIF9fZ2VubF9jdHJsX2FsbG9jX2NhY2hlCisjZW5kaWYgLyogIUhBVkVfTElCTkxfMl94ICovCisKK3N0cnVjdCBubDgwMjExX3N0YXRlIHsKKwlzdHJ1Y3Qgbmxfc29jayAqbmxfc29jazsKKwlzdHJ1Y3QgbmxfY2FjaGUgKm5sX2NhY2hlOworCXN0cnVjdCBnZW5sX2ZhbWlseSAqbmw4MDIxMTsKK307CisKK3N0YXRpYyBpbnQKK25sODAyMTFfaW5pdChwY2FwX3QgKmhhbmRsZSwgc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICpkZXZpY2UpCit7CisJaW50IGVycjsKKworCXN0YXRlLT5ubF9zb2NrID0gbmxfc29ja2V0X2FsbG9jKCk7CisJaWYgKCFzdGF0ZS0+bmxfc29jaykgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG5ldGxpbmsgaGFuZGxlIiwgZGV2aWNlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJaWYgKGdlbmxfY29ubmVjdChzdGF0ZS0+bmxfc29jaykpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IGZhaWxlZCB0byBjb25uZWN0IHRvIGdlbmVyaWMgbmV0bGluayIsIGRldmljZSk7CisJCWdvdG8gb3V0X2hhbmRsZV9kZXN0cm95OworCX0KKworCWVyciA9IGdlbmxfY3RybF9hbGxvY19jYWNoZShzdGF0ZS0+bmxfc29jaywgJnN0YXRlLT5ubF9jYWNoZSk7CisJaWYgKGVyciA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBnZW5lcmljIG5ldGxpbmsgY2FjaGU6ICVzIiwKKwkJICAgIGRldmljZSwgZ2V0X25sX2Vycm1zZygtZXJyKSk7CisJCWdvdG8gb3V0X2hhbmRsZV9kZXN0cm95OworCX0KKworCXN0YXRlLT5ubDgwMjExID0gZ2VubF9jdHJsX3NlYXJjaF9ieV9uYW1lKHN0YXRlLT5ubF9jYWNoZSwgIm5sODAyMTEiKTsKKwlpZiAoIXN0YXRlLT5ubDgwMjExKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBubDgwMjExIG5vdCBmb3VuZCIsIGRldmljZSk7CisJCWdvdG8gb3V0X2NhY2hlX2ZyZWU7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9jYWNoZV9mcmVlOgorCW5sX2NhY2hlX2ZyZWUoc3RhdGUtPm5sX2NhY2hlKTsKK291dF9oYW5kbGVfZGVzdHJveToKKwlubF9zb2NrZXRfZnJlZShzdGF0ZS0+bmxfc29jayk7CisJcmV0dXJuIFBDQVBfRVJST1I7Cit9CisKK3N0YXRpYyB2b2lkCitubDgwMjExX2NsZWFudXAoc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlKQoreworCWdlbmxfZmFtaWx5X3B1dChzdGF0ZS0+bmw4MDIxMSk7CisJbmxfY2FjaGVfZnJlZShzdGF0ZS0+bmxfY2FjaGUpOworCW5sX3NvY2tldF9mcmVlKHN0YXRlLT5ubF9zb2NrKTsKK30KKworc3RhdGljIGludAorYWRkX21vbl9pZihwY2FwX3QgKmhhbmRsZSwgaW50IHNvY2tfZmQsIHN0cnVjdCBubDgwMjExX3N0YXRlICpzdGF0ZSwKKyAgICBjb25zdCBjaGFyICpkZXZpY2UsIGNvbnN0IGNoYXIgKm1vbmRldmljZSkKK3sKKwlpbnQgaWZpbmRleDsKKwlzdHJ1Y3QgbmxfbXNnICptc2c7CisJaW50IGVycjsKKworCWlmaW5kZXggPSBpZmFjZV9nZXRfaWQoc29ja19mZCwgZGV2aWNlLCBoYW5kbGUtPmVycmJ1Zik7CisJaWYgKGlmaW5kZXggPT0gLTEpCisJCXJldHVybiBQQ0FQX0VSUk9SOworCisJbXNnID0gbmxtc2dfYWxsb2MoKTsKKwlpZiAoIW1zZykgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogZmFpbGVkIHRvIGFsbG9jYXRlIG5ldGxpbmsgbXNnIiwgZGV2aWNlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJZ2VubG1zZ19wdXQobXNnLCAwLCAwLCBnZW5sX2ZhbWlseV9nZXRfaWQoc3RhdGUtPm5sODAyMTEpLCAwLAorCQkgICAgMCwgTkw4MDIxMV9DTURfTkVXX0lOVEVSRkFDRSwgMCk7CisJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgaWZpbmRleCk7CisJTkxBX1BVVF9TVFJJTkcobXNnLCBOTDgwMjExX0FUVFJfSUZOQU1FLCBtb25kZXZpY2UpOworCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0lGVFlQRSwgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUik7CisKKwllcnIgPSBubF9zZW5kX2F1dG9fY29tcGxldGUoc3RhdGUtPm5sX3NvY2ssIG1zZyk7CisJaWYgKGVyciA8IDApIHsKKyNpZmRlZiBIQVZFX0xJQk5MXzJfeAorCQlpZiAoZXJyID09IC1OTEVfRkFJTFVSRSkgeworI2Vsc2UKKwkJaWYgKGVyciA9PSAtRU5GSUxFKSB7CisjZW5kaWYKKwkJCS8qCisJCQkgKiBEZXZpY2Ugbm90IGF2YWlsYWJsZTsgb3VyIGNhbGxlciBzaG91bGQganVzdAorCQkJICoga2VlcCB0cnlpbmcuICAobGlibmwgMi54IG1hcHMgRU5GSUxFIHRvCisJCQkgKiBOTEVfRkFJTFVSRTsgaXQgY2FuIGFsc28gbWFwIG90aGVyIGVycm9ycworCQkJICogdG8gdGhhdCwgYnV0IHRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvCisJCQkgKiBhYm91dCB0aGF0LikKKwkJCSAqLworCQkJbmxtc2dfZnJlZShtc2cpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogUmVhbCBmYWlsdXJlLCBub3QganVzdCAidGhhdCBkZXZpY2UgaXMgbm90CisJCQkgKiBhdmFpbGFibGUuCisJCQkgKi8KKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICIlczogbmxfc2VuZF9hdXRvX2NvbXBsZXRlIGZhaWxlZCBhZGRpbmcgJXMgaW50ZXJmYWNlOiAlcyIsCisJCQkgICAgZGV2aWNlLCBtb25kZXZpY2UsIGdldF9ubF9lcnJtc2coLWVycikpOworCQkJbmxtc2dfZnJlZShtc2cpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKwl9CisJZXJyID0gbmxfd2FpdF9mb3JfYWNrKHN0YXRlLT5ubF9zb2NrKTsKKwlpZiAoZXJyIDwgMCkgeworI2lmZGVmIEhBVkVfTElCTkxfMl94CisJCWlmIChlcnIgPT0gLU5MRV9GQUlMVVJFKSB7CisjZWxzZQorCQlpZiAoZXJyID09IC1FTkZJTEUpIHsKKyNlbmRpZgorCQkJLyoKKwkJCSAqIERldmljZSBub3QgYXZhaWxhYmxlOyBvdXIgY2FsbGVyIHNob3VsZCBqdXN0CisJCQkgKiBrZWVwIHRyeWluZy4gIChsaWJubCAyLnggbWFwcyBFTkZJTEUgdG8KKwkJCSAqIE5MRV9GQUlMVVJFOyBpdCBjYW4gYWxzbyBtYXAgb3RoZXIgZXJyb3JzCisJCQkgKiB0byB0aGF0LCBidXQgdGhlcmUncyBub3QgbXVjaCB3ZSBjYW4gZG8KKwkJCSAqIGFib3V0IHRoYXQuKQorCQkJICovCisJCQlubG1zZ19mcmVlKG1zZyk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBSZWFsIGZhaWx1cmUsIG5vdCBqdXN0ICJ0aGF0IGRldmljZSBpcyBub3QKKwkJCSAqIGF2YWlsYWJsZS4KKwkJCSAqLworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIiVzOiBubF93YWl0X2Zvcl9hY2sgZmFpbGVkIGFkZGluZyAlcyBpbnRlcmZhY2U6ICVzIiwKKwkJCSAgICBkZXZpY2UsIG1vbmRldmljZSwgZ2V0X25sX2Vycm1zZygtZXJyKSk7CisJCQlubG1zZ19mcmVlKG1zZyk7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCX0KKworCS8qCisJICogU3VjY2Vzcy4KKwkgKi8KKwlubG1zZ19mcmVlKG1zZyk7CisJcmV0dXJuIDE7CisKK25sYV9wdXRfZmFpbHVyZToKKwlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIiVzOiBubF9wdXQgZmFpbGVkIGFkZGluZyAlcyBpbnRlcmZhY2UiLAorCSAgICBkZXZpY2UsIG1vbmRldmljZSk7CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiBQQ0FQX0VSUk9SOworfQorCitzdGF0aWMgaW50CitkZWxfbW9uX2lmKHBjYXBfdCAqaGFuZGxlLCBpbnQgc29ja19mZCwgc3RydWN0IG5sODAyMTFfc3RhdGUgKnN0YXRlLAorICAgIGNvbnN0IGNoYXIgKmRldmljZSwgY29uc3QgY2hhciAqbW9uZGV2aWNlKQoreworCWludCBpZmluZGV4OworCXN0cnVjdCBubF9tc2cgKm1zZzsKKwlpbnQgZXJyOworCisJaWZpbmRleCA9IGlmYWNlX2dldF9pZChzb2NrX2ZkLCBtb25kZXZpY2UsIGhhbmRsZS0+ZXJyYnVmKTsKKwlpZiAoaWZpbmRleCA9PSAtMSkKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisKKwltc2cgPSBubG1zZ19hbGxvYygpOworCWlmICghbXNnKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV0bGluayBtc2ciLCBkZXZpY2UpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwlnZW5sbXNnX3B1dChtc2csIDAsIDAsIGdlbmxfZmFtaWx5X2dldF9pZChzdGF0ZS0+bmw4MDIxMSksIDAsCisJCSAgICAwLCBOTDgwMjExX0NNRF9ERUxfSU5URVJGQUNFLCAwKTsKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBpZmluZGV4KTsKKworCWVyciA9IG5sX3NlbmRfYXV0b19jb21wbGV0ZShzdGF0ZS0+bmxfc29jaywgbXNnKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogbmxfc2VuZF9hdXRvX2NvbXBsZXRlIGZhaWxlZCBkZWxldGluZyAlcyBpbnRlcmZhY2U6ICVzIiwKKwkJICAgIGRldmljZSwgbW9uZGV2aWNlLCBnZXRfbmxfZXJybXNnKC1lcnIpKTsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisJZXJyID0gbmxfd2FpdF9mb3JfYWNrKHN0YXRlLT5ubF9zb2NrKTsKKwlpZiAoZXJyIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogbmxfd2FpdF9mb3JfYWNrIGZhaWxlZCBhZGRpbmcgJXMgaW50ZXJmYWNlOiAlcyIsCisJCSAgICBkZXZpY2UsIG1vbmRldmljZSwgZ2V0X25sX2Vycm1zZygtZXJyKSk7CisJCW5sbXNnX2ZyZWUobXNnKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJLyoKKwkgKiBTdWNjZXNzLgorCSAqLworCW5sbXNnX2ZyZWUobXNnKTsKKwlyZXR1cm4gMTsKKworbmxhX3B1dF9mYWlsdXJlOgorCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiJXM6IG5sX3B1dCBmYWlsZWQgZGVsZXRpbmcgJXMgaW50ZXJmYWNlIiwKKwkgICAgZGV2aWNlLCBtb25kZXZpY2UpOworCW5sbXNnX2ZyZWUobXNnKTsKKwlyZXR1cm4gUENBUF9FUlJPUjsKK30KKworc3RhdGljIGludAorZW50ZXJfcmZtb25fbW9kZV9tYWM4MDIxMShwY2FwX3QgKmhhbmRsZSwgaW50IHNvY2tfZmQsIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwlpbnQgcmV0OworCWNoYXIgcGh5ZGV2X3BhdGhbUEFUSF9NQVgrMV07CisJc3RydWN0IG5sODAyMTFfc3RhdGUgbmxzdGF0ZTsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXVfaW50IG47CisKKwkvKgorCSAqIElzIHRoaXMgYSBtYWM4MDIxMSBkZXZpY2U/CisJICovCisJcmV0ID0gZ2V0X21hYzgwMjExX3BoeWRldihoYW5kbGUsIGRldmljZSwgcGh5ZGV2X3BhdGgsIFBBVEhfTUFYKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsJLyogZXJyb3IgKi8KKwlpZiAocmV0ID09IDApCisJCXJldHVybiAwOwkvKiBubyBlcnJvciwgYnV0IG5vdCBtYWM4MDIxMSBkZXZpY2UgKi8KKworCS8qCisJICogWFhYIC0gaXMgdGhpcyBhbHJlYWR5IGEgbW9uTiBkZXZpY2U/CisJICogSWYgc28sIHdlJ3JlIGRvbmUuCisJICogSXMgdGhhdCBkZXRlcm1pbmVkIGJ5IG9sZCBXaXJlbGVzcyBFeHRlbnNpb25zIGlvY3Rscz8KKwkgKi8KKworCS8qCisJICogT0ssIGl0J3MgYXBwYXJlbnRseSBhIG1hYzgwMjExIGRldmljZS4KKwkgKiBUcnkgdG8gZmluZCBhbiB1bnVzZWQgbW9uTiBkZXZpY2UgZm9yIGl0LgorCSAqLworCXJldCA9IG5sODAyMTFfaW5pdChoYW5kbGUsICZubHN0YXRlLCBkZXZpY2UpOworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlmb3IgKG4gPSAwOyBuIDwgVUlOVF9NQVg7IG4rKykgeworCQkvKgorCQkgKiBUcnkgbW9ue259LgorCQkgKi8KKwkJY2hhciBtb25kZXZpY2VbMysxMCsxXTsJLyogbW9ue1VJTlRfTUFYfVwwICovCisKKwkJc25wcmludGYobW9uZGV2aWNlLCBzaXplb2YgbW9uZGV2aWNlLCAibW9uJXUiLCBuKTsKKwkJcmV0ID0gYWRkX21vbl9pZihoYW5kbGUsIHNvY2tfZmQsICZubHN0YXRlLCBkZXZpY2UsIG1vbmRldmljZSk7CisJCWlmIChyZXQgPT0gMSkgeworCQkJaGFuZGxlLT5tZC5tb25kZXZpY2UgPSBzdHJkdXAobW9uZGV2aWNlKTsKKwkJCWdvdG8gYWRkZWQ7CisJCX0KKwkJaWYgKHJldCA8IDApIHsKKwkJCS8qCisJCQkgKiBIYXJkIGZhaWx1cmUuICBKdXN0IHJldHVybiByZXQ7IGhhbmRsZS0+ZXJyYnVmCisJCQkgKiBoYXMgYWxyZWFkeSBiZWVuIHNldC4KKwkJCSAqLworCQkJbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIiVzOiBObyBmcmVlIG1vbk4gaW50ZXJmYWNlcyIsIGRldmljZSk7CisJbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKwlyZXR1cm4gUENBUF9FUlJPUjsKKworYWRkZWQ6CisKKyNpZiAwCisJLyoKKwkgKiBTbGVlcCBmb3IgLjEgc2Vjb25kcy4KKwkgKi8KKwlkZWxheS50dl9zZWMgPSAwOworCWRlbGF5LnR2X25zZWMgPSA1MDAwMDAwMDA7CisJbmFub3NsZWVwKCZkZWxheSwgTlVMTCk7CisjZW5kaWYKKworCS8qCisJICogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28sIGFycmFuZ2UgdG8gaGF2ZQorCSAqICJwY2FwX2Nsb3NlX2FsbCgpIiBjYWxsZWQgd2hlbiB3ZSBleGl0LgorCSAqLworCWlmICghcGNhcF9kb19hZGRleGl0KGhhbmRsZSkpIHsKKwkJLyoKKwkJICogImF0ZXhpdCgpIiBmYWlsZWQ7IGRvbid0IHB1dCB0aGUgaW50ZXJmYWNlCisJCSAqIGluIHJmbW9uIG1vZGUsIGp1c3QgZ2l2ZSB1cC4KKwkJICovCisJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwl9CisKKwkvKgorCSAqIE5vdyBjb25maWd1cmUgdGhlIG1vbml0b3IgaW50ZXJmYWNlIHVwLgorCSAqLworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RybmNweShpZnIuaWZyX25hbWUsIGhhbmRsZS0+bWQubW9uZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IENhbid0IGdldCBmbGFncyBmb3IgJXM6ICVzIiwgZGV2aWNlLAorCQkgICAgaGFuZGxlLT5tZC5tb25kZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCWRlbF9tb25faWYoaGFuZGxlLCBzb2NrX2ZkLCAmbmxzdGF0ZSwgZGV2aWNlLAorCQkgICAgaGFuZGxlLT5tZC5tb25kZXZpY2UpOworCQlubDgwMjExX2NsZWFudXAoJm5sc3RhdGUpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisJaWZyLmlmcl9mbGFncyB8PSBJRkZfVVB8SUZGX1JVTk5JTkc7CisJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IENhbid0IHNldCBmbGFncyBmb3IgJXM6ICVzIiwgZGV2aWNlLAorCQkgICAgaGFuZGxlLT5tZC5tb25kZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCWRlbF9tb25faWYoaGFuZGxlLCBzb2NrX2ZkLCAmbmxzdGF0ZSwgZGV2aWNlLAorCQkgICAgaGFuZGxlLT5tZC5tb25kZXZpY2UpOworCQlubDgwMjExX2NsZWFudXAoJm5sc3RhdGUpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwkvKgorCSAqIFN1Y2Nlc3MuICBDbGVhbiB1cCB0aGUgbGlibmwgc3RhdGUuCisJICovCisJbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKworCS8qCisJICogTm90ZSB0aGF0IHdlIGhhdmUgdG8gZGVsZXRlIHRoZSBtb25pdG9yIGRldmljZSB3aGVuIHdlIGNsb3NlCisJICogdGhlIGhhbmRsZS4KKwkgKi8KKwloYW5kbGUtPm1kLm11c3RfZG9fb25fY2xvc2UgfD0gTVVTVF9ERUxFVEVfTU9OSUY7CisKKwkvKgorCSAqIEFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIHBjYXBzIHRvIGNsb3NlIHdoZW4gd2UgZXhpdC4KKwkgKi8KKwlwY2FwX2FkZF90b19wY2Fwc190b19jbG9zZShoYW5kbGUpOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogSEFWRV9MSUJOTCAqLworCitzdGF0aWMgaW50CitwY2FwX2Nhbl9zZXRfcmZtb25fbGludXgocGNhcF90ICpoYW5kbGUpCit7CisjaWZkZWYgSEFWRV9MSUJOTAorCWNoYXIgcGh5ZGV2X3BhdGhbUEFUSF9NQVgrMV07CisJaW50IHJldDsKKyNlbmRpZgorI2lmZGVmIElXX01PREVfTU9OSVRPUgorCWludCBzb2NrX2ZkOworCXN0cnVjdCBpd3JlcSBpcmVxOworI2VuZGlmCisKKwlpZiAoc3RyY21wKGhhbmRsZS0+b3B0LnNvdXJjZSwgImFueSIpID09IDApIHsKKwkJLyoKKwkJICogTW9uaXRvciBtb2RlIG1ha2VzIG5vIHNlbnNlIG9uIHRoZSAiYW55IiBkZXZpY2UuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBIQVZFX0xJQk5MCisJLyoKKwkgKiBCbGVhaC4gIFRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIHdheSB0byBhc2sgYSBtYWM4MDIxMQorCSAqIGRldmljZSwgdGhyb3VnaCBsaWJubCwgd2hldGhlciBpdCBzdXBwb3J0cyBtb25pdG9yIG1vZGU7CisJICogd2UnbGwganVzdCBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2UgYXBwZWFycyB0byBiZSBhCisJICogbWFjODAyMTEgZGV2aWNlIGFuZCwgaWYgc28sIGFzc3VtZSB0aGUgZGV2aWNlIHN1cHBvcnRzCisJICogbW9uaXRvciBtb2RlLgorCSAqCisJICogd21hc3RlciBkZXZpY2VzIGRvbid0IGFwcGVhciB0byBzdXBwb3J0IHRoZSBXaXJlbGVzcworCSAqIEV4dGVuc2lvbnMsIGJ1dCB3ZSBjYW4gY3JlYXRlIGEgbW9uIGRldmljZSBmb3IgYQorCSAqIHdtYXN0ZXIgZGV2aWNlLCBzbyB3ZSBkb24ndCBib3RoZXIgY2hlY2tpbmcgd2hldGhlcgorCSAqIGEgbWFjODAyMTEgZGV2aWNlIHN1cHBvcnRzIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zLgorCSAqLworCXJldCA9IGdldF9tYWM4MDIxMV9waHlkZXYoaGFuZGxlLCBoYW5kbGUtPm9wdC5zb3VyY2UsIHBoeWRldl9wYXRoLAorCSAgICBQQVRIX01BWCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CS8qIGVycm9yICovCisJaWYgKHJldCA9PSAxKQorCQlyZXR1cm4gMTsJLyogbWFjODAyMTEgZGV2aWNlICovCisjZW5kaWYKKworI2lmZGVmIElXX01PREVfTU9OSVRPUgorCS8qCisJICogQmxlYWguICBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhbiBpb2N0bCB0byB1c2UgdG8gYXNrCisJICogd2hldGhlciBhIGRldmljZSBzdXBwb3J0cyBtb25pdG9yIG1vZGU7IHdlJ2xsIGp1c3QgZG8KKwkgKiBTSU9DR0lXTU9ERSBhbmQsIGlmIGl0IHN1Y2NlZWRzLCBhc3N1bWUgdGhlIGRldmljZSBzdXBwb3J0cworCSAqIG1vbml0b3IgbW9kZS4KKwkgKgorCSAqIE9wZW4gYSBzb2NrZXQgb24gd2hpY2ggdG8gYXR0ZW1wdCB0byBnZXQgdGhlIG1vZGUuCisJICogKFdlIGFzc3VtZSB0aGF0IGlmIHdlIGhhdmUgV2lyZWxlc3MgRXh0ZW5zaW9ucyBzdXBwb3J0CisJICogd2UgYWxzbyBoYXZlIFBGX1BBQ0tFVCBzdXBwb3J0LikKKwkgKi8KKwlzb2NrX2ZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19SQVcsIGh0b25zKEVUSF9QX0FMTCkpOworCWlmIChzb2NrX2ZkID09IC0xKSB7CisJCSh2b2lkKXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgInNvY2tldDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qCisJICogQXR0ZW1wdCB0byBnZXQgdGhlIGN1cnJlbnQgbW9kZS4KKwkgKi8KKwlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBoYW5kbGUtPm9wdC5zb3VyY2UsCisJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lXTU9ERSwgJmlyZXEpICE9IC0xKSB7CisJCS8qCisJCSAqIFdlbGwsIHdlIGdvdCB0aGUgbW9kZTsgYXNzdW1lIHdlIGNhbiBzZXQgaXQuCisJCSAqLworCQljbG9zZShzb2NrX2ZkKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChlcnJubyA9PSBFTk9ERVYpIHsKKwkJLyogVGhlIGRldmljZSBkb2Vzbid0IGV2ZW4gZXhpc3QuICovCisJCSh2b2lkKXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIlNJT0NHSVdNT0RFIGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHNvY2tfZmQpOworCQlyZXR1cm4gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKwl9CisJY2xvc2Uoc29ja19mZCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdyYWJzIHRoZSBudW1iZXIgb2YgZHJvcHBlZCBwYWNrZXRzIGJ5IHRoZSBpbnRlcmZhY2UgZnJvbSAvcHJvYy9uZXQvZGV2LgorICoKKyAqIFhYWCAtIHdoYXQgYWJvdXQgL3N5cy9jbGFzcy9uZXQve2ludGVyZmFjZSBuYW1lfS9yeF8qPyAgVGhlcmUgYXJlCisgKiBpbmRpdmlkdWFsIGRldmljZXMgZ2l2aW5nLCBpbiBBU0NJSSwgdmFyaW91cyByeF8gYW5kIHR4XyBzdGF0aXN0aWNzLgorICoKKyAqIE9yIGNhbiB3ZSBnZXQgdGhlbSBpbiBiaW5hcnkgZm9ybSBmcm9tIG5ldGxpbms/CisgKi8KK3N0YXRpYyBsb25nIGludAorbGludXhfaWZfZHJvcHMoY29uc3QgY2hhciAqIGlmX25hbWUpCit7CisJY2hhciBidWZmZXJbNTEyXTsKKwljaGFyICogYnVmcHRyOworCUZJTEUgKiBmaWxlOworCWludCBmaWVsZF90b19jb252ZXJ0ID0gMywgaWZfbmFtZV9zeiA9IHN0cmxlbihpZl9uYW1lKTsKKwlsb25nIGludCBkcm9wcGVkX3BrdHMgPSAwOworCQorCWZpbGUgPSBmb3BlbigiL3Byb2MvbmV0L2RldiIsICJyIik7CisJaWYgKCFmaWxlKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICghZHJvcHBlZF9wa3RzICYmIGZnZXRzKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCBmaWxlICkpCisJeworCQkvKiAJc2VhcmNoIGZvciAnYnl0ZXMnIC0tIGlmIGl0cyBpbiB0aGVyZSwgdGhlbgorCQkJdGhhdCBtZWFucyB3ZSBuZWVkIHRvIGdyYWIgdGhlIGZvdXJ0aCBmaWVsZC4gb3RoZXJ3aXNlCisJCQlncmFiIHRoZSB0aGlyZCBmaWVsZC4gKi8KKwkJaWYgKGZpZWxkX3RvX2NvbnZlcnQgIT0gNCAmJiBzdHJzdHIoYnVmZmVyLCAiYnl0ZXMiKSkKKwkJeworCQkJZmllbGRfdG9fY29udmVydCA9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCQorCQkvKiBmaW5kIGlmYWNlIGFuZCBtYWtlIHN1cmUgaXQgYWN0dWFsbHkgbWF0Y2hlcyAtLSBzcGFjZSBiZWZvcmUgdGhlIG5hbWUgYW5kIDogYWZ0ZXIgaXQgKi8KKwkJaWYgKChidWZwdHIgPSBzdHJzdHIoYnVmZmVyLCBpZl9uYW1lKSkgJiYKKwkJCShidWZwdHIgPT0gYnVmZmVyIHx8ICooYnVmcHRyLTEpID09ICcgJykgJiYKKwkJCSooYnVmcHRyICsgaWZfbmFtZV9zeikgPT0gJzonKQorCQl7CisJCQlidWZwdHIgPSBidWZwdHIgKyBpZl9uYW1lX3N6ICsgMTsKKworCQkJLyogZ3JhYiB0aGUgbnRoIGZpZWxkIGZyb20gaXQgKi8KKwkJCXdoaWxlKCAtLWZpZWxkX3RvX2NvbnZlcnQgJiYgKmJ1ZnB0ciAhPSAnXDAnKQorCQkJeworCQkJCXdoaWxlICgqYnVmcHRyICE9ICdcMCcgJiYgKihidWZwdHIrKykgPT0gJyAnKTsKKwkJCQl3aGlsZSAoKmJ1ZnB0ciAhPSAnXDAnICYmICooYnVmcHRyKyspICE9ICcgJyk7CisJCQl9CisJCQkKKwkJCS8qIGdldCByaWQgb2YgYW55IGZpbmFsIHNwYWNlcyAqLworCQkJd2hpbGUgKCpidWZwdHIgIT0gJ1wwJyAmJiAqYnVmcHRyID09ICcgJykgYnVmcHRyKys7CisJCQkKKwkJCWlmICgqYnVmcHRyICE9ICdcMCcpCisJCQkJZHJvcHBlZF9wa3RzID0gc3RydG9sKGJ1ZnB0ciwgTlVMTCwgMTApOworCisJCQlicmVhazsKKwkJfQorCX0KKwkKKwlmY2xvc2UoZmlsZSk7CisJcmV0dXJuIGRyb3BwZWRfcGt0czsKK30gCisKKworLyoKKyAqIFdpdGggb2xkZXIga2VybmVscyBwcm9taXNjdW91cyBtb2RlIGlzIGtpbmQgb2YgaW50ZXJlc3RpbmcgYmVjYXVzZSB3ZQorICogaGF2ZSB0byByZXNldCB0aGUgaW50ZXJmYWNlIGJlZm9yZSBleGl0aW5nLiBUaGUgcHJvYmxlbSBjYW4ndCByZWFsbHkKKyAqIGJlIHNvbHZlZCB3aXRob3V0IHNvbWUgZGFlbW9uIHRha2luZyBjYXJlIG9mIG1hbmFnaW5nIHVzYWdlIGNvdW50cy4KKyAqIElmIHdlIHB1dCB0aGUgaW50ZXJmYWNlIGludG8gcHJvbWlzY3VvdXMgbW9kZSwgd2Ugc2V0IGEgZmxhZyBpbmRpY2F0aW5nCisgKiB0aGF0IHdlIG11c3QgdGFrZSBpdCBvdXQgb2YgdGhhdCBtb2RlIHdoZW4gdGhlIGludGVyZmFjZSBpcyBjbG9zZWQsCisgKiBhbmQsIHdoZW4gY2xvc2luZyB0aGUgaW50ZXJmYWNlLCBpZiB0aGF0IGZsYWcgaXMgc2V0IHdlIHRha2UgaXQgb3V0CisgKiBvZiBwcm9taXNjdW91cyBtb2RlLgorICoKKyAqIEV2ZW4gd2l0aCBuZXdlciBrZXJuZWxzLCB3ZSBoYXZlIHRoZSBzYW1lIGlzc3VlIHdpdGggcmZtb24gbW9kZS4KKyAqLworCitzdGF0aWMgdm9pZAlwY2FwX2NsZWFudXBfbGludXgoIHBjYXBfdCAqaGFuZGxlICkKK3sKKwlzdHJ1Y3QgaWZyZXEJaWZyOworI2lmZGVmIEhBVkVfTElCTkwKKwlzdHJ1Y3Qgbmw4MDIxMV9zdGF0ZSBubHN0YXRlOworCWludCByZXQ7CisjZW5kaWYgLyogSEFWRV9MSUJOTCAqLworI2lmZGVmIElXX01PREVfTU9OSVRPUgorCWludCBvbGRmbGFnczsKKwlzdHJ1Y3QgaXdyZXEgaXJlcTsKKyNlbmRpZiAvKiBJV19NT0RFX01PTklUT1IgKi8KKworCWlmIChoYW5kbGUtPm1kLm11c3RfZG9fb25fY2xvc2UgIT0gMCkgeworCQkvKgorCQkgKiBUaGVyZSdzIHNvbWV0aGluZyB3ZSBoYXZlIHRvIGRvIHdoZW4gY2xvc2luZyB0aGlzCisJCSAqIHBjYXBfdC4KKwkJICovCisJCWlmIChoYW5kbGUtPm1kLm11c3RfZG9fb25fY2xvc2UgJiBNVVNUX0NMRUFSX1BST01JU0MpIHsKKwkJCS8qCisJCQkgKiBXZSBwdXQgdGhlIGludGVyZmFjZSBpbnRvIHByb21pc2N1b3VzIG1vZGU7CisJCQkgKiB0YWtlIGl0IG91dCBvZiBwcm9taXNjdW91cyBtb2RlLgorCQkJICoKKwkJCSAqIFhYWCAtIGlmIHNvbWVib2R5IGVsc2Ugd2FudHMgaXQgaW4gcHJvbWlzY3VvdXMKKwkJCSAqIG1vZGUsIHRoaXMgY29kZSBjYW5ub3Qga25vdyB0aGF0LCBzbyBpdCdsbCB0YWtlCisJCQkgKiBpdCBvdXQgb2YgcHJvbWlzY3VvdXMgbW9kZS4gIFRoYXQncyBub3QgZml4YWJsZQorCQkJICogaW4gMi4wWy54XSBrZXJuZWxzLgorCQkJICovCisJCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCQkJc3RybmNweShpZnIuaWZyX25hbWUsIGhhbmRsZS0+bWQuZGV2aWNlLAorCQkJICAgIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DR0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJICAgICJDYW4ndCByZXN0b3JlIGludGVyZmFjZSAlcyBmbGFncyAoU0lPQ0dJRkZMQUdTIGZhaWxlZDogJXMpLlxuIgorCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIKKwkJCQkgICAgIkhpbnQ6IFRoaXMgY2FuJ3QgaGFwcGVuIHdpdGggTGludXggPj0gMi4yLjAuXG4iLAorCQkJCSAgICBoYW5kbGUtPm1kLmRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlmci5pZnJfZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQkJCQkvKgorCQkJCQkgKiBQcm9taXNjdW91cyBtb2RlIGlzIGN1cnJlbnRseSBvbjsKKwkJCQkJICogdHVybiBpdCBvZmYuCisJCQkJCSAqLworCQkJCQlpZnIuaWZyX2ZsYWdzICY9IH5JRkZfUFJPTUlTQzsKKwkJCQkJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NTSUZGTEFHUywKKwkJCQkJICAgICZpZnIpID09IC0xKSB7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSAgICAiQ2FuJ3QgcmVzdG9yZSBpbnRlcmZhY2UgJXMgZmxhZ3MgKFNJT0NTSUZGTEFHUyBmYWlsZWQ6ICVzKS5cbiIKKwkJCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIKKwkJCQkJCSAgICAiSGludDogVGhpcyBjYW4ndCBoYXBwZW4gd2l0aCBMaW51eCA+PSAyLjIuMC5cbiIsCisJCQkJCQkgICAgaGFuZGxlLT5tZC5kZXZpY2UsCisJCQkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCisjaWZkZWYgSEFWRV9MSUJOTAorCQlpZiAoaGFuZGxlLT5tZC5tdXN0X2RvX29uX2Nsb3NlICYgTVVTVF9ERUxFVEVfTU9OSUYpIHsKKwkJCXJldCA9IG5sODAyMTFfaW5pdChoYW5kbGUsICZubHN0YXRlLCBoYW5kbGUtPm1kLmRldmljZSk7CisJCQlpZiAocmV0ID49IDApIHsKKwkJCQlyZXQgPSBkZWxfbW9uX2lmKGhhbmRsZSwgaGFuZGxlLT5mZCwgJm5sc3RhdGUsCisJCQkJICAgIGhhbmRsZS0+bWQuZGV2aWNlLCBoYW5kbGUtPm1kLm1vbmRldmljZSk7CisJCQkJbmw4MDIxMV9jbGVhbnVwKCZubHN0YXRlKTsKKwkJCX0KKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJICAgICJDYW4ndCBkZWxldGUgbW9uaXRvciBpbnRlcmZhY2UgJXMgKCVzKS5cbiIKKwkJCQkgICAgIlBsZWFzZSBkZWxldGUgbWFudWFsbHkuXG4iLAorCQkJCSAgICBoYW5kbGUtPm1kLm1vbmRldmljZSwgaGFuZGxlLT5lcnJidWYpOworCQkJfQorCQl9CisjZW5kaWYgLyogSEFWRV9MSUJOTCAqLworCisjaWZkZWYgSVdfTU9ERV9NT05JVE9SCisJCWlmIChoYW5kbGUtPm1kLm11c3RfZG9fb25fY2xvc2UgJiBNVVNUX0NMRUFSX1JGTU9OKSB7CisJCQkvKgorCQkJICogV2UgcHV0IHRoZSBpbnRlcmZhY2UgaW50byByZm1vbiBtb2RlOworCQkJICogdGFrZSBpdCBvdXQgb2YgcmZtb24gbW9kZS4KKwkJCSAqCisJCQkgKiBYWFggLSBpZiBzb21lYm9keSBlbHNlIHdhbnRzIGl0IGluIHJmbW9uCisJCQkgKiBtb2RlLCB0aGlzIGNvZGUgY2Fubm90IGtub3cgdGhhdCwgc28gaXQnbGwgdGFrZQorCQkJICogaXQgb3V0IG9mIHJmbW9uIG1vZGUuCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIEZpcnN0LCB0YWtlIHRoZSBpbnRlcmZhY2UgZG93biBpZiBpdCdzIHVwOworCQkJICogb3RoZXJ3aXNlLCB3ZSBtaWdodCBnZXQgRUJVU1kuCisJCQkgKiBJZiB3ZSBnZXQgZXJyb3JzLCBqdXN0IGRyaXZlIG9uIGFuZCBwcmludAorCQkJICogYSB3YXJuaW5nIGlmIHdlIGNhbid0IHJlc3RvcmUgdGhlIG1vZGUuCisJCQkgKi8KKwkJCW9sZGZsYWdzID0gMDsKKwkJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCQlzdHJuY3B5KGlmci5pZnJfbmFtZSwgaGFuZGxlLT5tZC5kZXZpY2UsCisJCQkgICAgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCQkJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NHSUZGTEFHUywgJmlmcikgIT0gLTEpIHsKKwkJCQlpZiAoaWZyLmlmcl9mbGFncyAmIElGRl9VUCkgeworCQkJCQlvbGRmbGFncyA9IGlmci5pZnJfZmxhZ3M7CisJCQkJCWlmci5pZnJfZmxhZ3MgJj0gfklGRl9VUDsKKwkJCQkJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpCisJCQkJCQlvbGRmbGFncyA9IDA7CS8qIGRpZG4ndCBzZXQsIGRvbid0IHJlc3RvcmUgKi8KKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBOb3cgcmVzdG9yZSB0aGUgbW9kZS4KKwkJCSAqLworCQkJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgaGFuZGxlLT5tZC5kZXZpY2UsCisJCQkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwkJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdCisJCQkgICAgPSAwOworCQkJaXJlcS51Lm1vZGUgPSBoYW5kbGUtPm1kLm9sZG1vZGU7CisJCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ1NJV01PREUsICZpcmVxKSA9PSAtMSkgeworCQkJCS8qCisJCQkJICogU2NpZW50aXN0LCB5b3UndmUgZmFpbGVkLgorCQkJCSAqLworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAiQ2FuJ3QgcmVzdG9yZSBpbnRlcmZhY2UgJXMgd2lyZWxlc3MgbW9kZSAoU0lPQ1NJV01PREUgZmFpbGVkOiAlcykuXG4iCisJCQkJICAgICJQbGVhc2UgYWRqdXN0IG1hbnVhbGx5LlxuIiwKKwkJCQkgICAgaGFuZGxlLT5tZC5kZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBOb3cgYnJpbmcgdGhlIGludGVyZmFjZSBiYWNrIHVwIGlmIHdlIGJyb3VnaHQKKwkJCSAqIGl0IGRvd24uCisJCQkgKi8KKwkJCWlmIChvbGRmbGFncyAhPSAwKSB7CisJCQkJaWZyLmlmcl9mbGFncyA9IG9sZGZsYWdzOworCQkJCWlmIChpb2N0bChoYW5kbGUtPmZkLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkgICAgIkNhbid0IGJyaW5nIGludGVyZmFjZSAlcyBiYWNrIHVwIChTSU9DU0lGRkxBR1MgZmFpbGVkOiAlcykuXG4iCisJCQkJCSAgICAiUGxlYXNlIGFkanVzdCBtYW51YWxseS5cbiIsCisJCQkJCSAgICBoYW5kbGUtPm1kLmRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZiAvKiBJV19NT0RFX01PTklUT1IgKi8KKworCQkvKgorCQkgKiBUYWtlIHRoaXMgcGNhcCBvdXQgb2YgdGhlIGxpc3Qgb2YgcGNhcHMgZm9yIHdoaWNoIHdlCisJCSAqIGhhdmUgdG8gdGFrZSB0aGUgaW50ZXJmYWNlIG91dCBvZiBzb21lIG1vZGUuCisJCSAqLworCQlwY2FwX3JlbW92ZV9mcm9tX3BjYXBzX3RvX2Nsb3NlKGhhbmRsZSk7CisJfQorCisJaWYgKGhhbmRsZS0+bWQubW9uZGV2aWNlICE9IE5VTEwpIHsKKwkJZnJlZShoYW5kbGUtPm1kLm1vbmRldmljZSk7CisJCWhhbmRsZS0+bWQubW9uZGV2aWNlID0gTlVMTDsKKwl9CisJaWYgKGhhbmRsZS0+bWQuZGV2aWNlICE9IE5VTEwpIHsKKwkJZnJlZShoYW5kbGUtPm1kLmRldmljZSk7CisJCWhhbmRsZS0+bWQuZGV2aWNlID0gTlVMTDsKKwl9CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7Cit9CisKKy8qCisgKiAgR2V0IGEgaGFuZGxlIGZvciBhIGxpdmUgY2FwdHVyZSBmcm9tIHRoZSBnaXZlbiBkZXZpY2UuIFlvdSBjYW4KKyAqICBwYXNzIE5VTEwgYXMgZGV2aWNlIHRvIGdldCBhbGwgcGFja2FnZXMgKHdpdGhvdXQgbGluayBsZXZlbAorICogIGluZm9ybWF0aW9uIG9mIGNvdXJzZSkuIElmIHlvdSBwYXNzIDEgYXMgcHJvbWlzYyB0aGUgaW50ZXJmYWNlCisgKiAgd2lsbCBiZSBzZXQgdG8gcHJvbWlzY291cyBtb2RlIChYWFg6IEkgdGhpbmsgdGhpcyB1c2FnZSBzaG91bGQKKyAqICBiZSBkZXByZWNhdGVkIGFuZCBmdW5jdGlvbnMgYmUgYWRkZWQgdG8gc2VsZWN0IHRoYXQgbGF0ZXIgYWxsb3cKKyAqICBtb2RpZmljYXRpb24gb2YgdGhhdCB2YWx1ZXMgLS0gVG9yc3RlbikuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfYWN0aXZhdGVfbGludXgocGNhcF90ICpoYW5kbGUpCit7CisJY29uc3QgY2hhcgkqZGV2aWNlOworCWludAkJc3RhdHVzID0gMDsKKworCWRldmljZSA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKKworCWhhbmRsZS0+aW5qZWN0X29wID0gcGNhcF9pbmplY3RfbGludXg7CisJaGFuZGxlLT5zZXRmaWx0ZXJfb3AgPSBwY2FwX3NldGZpbHRlcl9saW51eDsKKwloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IHBjYXBfc2V0ZGlyZWN0aW9uX2xpbnV4OworCWhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsJLyogY2FuJ3QgY2hhbmdlIGRhdGEgbGluayB0eXBlICovCisJaGFuZGxlLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CisJaGFuZGxlLT5zZXRub25ibG9ja19vcCA9IHBjYXBfc2V0bm9uYmxvY2tfZmQ7CisJaGFuZGxlLT5jbGVhbnVwX29wID0gcGNhcF9jbGVhbnVwX2xpbnV4OworCWhhbmRsZS0+cmVhZF9vcCA9IHBjYXBfcmVhZF9saW51eDsKKwloYW5kbGUtPnN0YXRzX29wID0gcGNhcF9zdGF0c19saW51eDsKKworCS8qCisJICogVGhlICJhbnkiIGRldmljZSBpcyBhIHNwZWNpYWwgZGV2aWNlIHdoaWNoIGNhdXNlcyB1cyBub3QKKwkgKiB0byBiaW5kIHRvIGEgcGFydGljdWxhciBkZXZpY2UgYW5kIHRodXMgdG8gbG9vayBhdCBhbGwKKwkgKiBkZXZpY2VzLgorCSAqLworCWlmIChzdHJjbXAoZGV2aWNlLCAiYW55IikgPT0gMCkgeworCQlpZiAoaGFuZGxlLT5vcHQucHJvbWlzYykgeworCQkJaGFuZGxlLT5vcHQucHJvbWlzYyA9IDA7CisJCQkvKiBKdXN0IGEgd2FybmluZy4gKi8KKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJQcm9taXNjdW91cyBtb2RlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIFwiYW55XCIgZGV2aWNlIik7CisJCQlzdGF0dXMgPSBQQ0FQX1dBUk5JTkdfUFJPTUlTQ19OT1RTVVA7CisJCX0KKwl9CisKKwloYW5kbGUtPm1kLmRldmljZQk9IHN0cmR1cChkZXZpY2UpOworCWlmIChoYW5kbGUtPm1kLmRldmljZSA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic3RyZHVwOiAlcyIsCisJCQkgcGNhcF9zdHJlcnJvcihlcnJubykgKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCQorCS8qCisJICogSWYgd2UncmUgaW4gcHJvbWlzY3VvdXMgbW9kZSwgdGhlbiB3ZSBwcm9iYWJseSB3YW50IAorCSAqIHRvIHNlZSB3aGVuIHRoZSBpbnRlcmZhY2UgZHJvcHMgcGFja2V0cyB0b28sIHNvIGdldCBhbgorCSAqIGluaXRpYWwgY291bnQgZnJvbSAvcHJvYy9uZXQvZGV2CisJICovCisJaWYgKGhhbmRsZS0+b3B0LnByb21pc2MpCisJCWhhbmRsZS0+bWQucHJvY19kcm9wcGVkID0gbGludXhfaWZfZHJvcHMoaGFuZGxlLT5tZC5kZXZpY2UpOworCisJLyoKKwkgKiBDdXJyZW50IExpbnV4IGtlcm5lbHMgdXNlIHRoZSBwcm90b2NvbCBmYW1pbHkgUEZfUEFDS0VUIHRvCisJICogYWxsb3cgZGlyZWN0IGFjY2VzcyB0byBhbGwgcGFja2V0cyBvbiB0aGUgbmV0d29yayB3aGlsZQorCSAqIG9sZGVyIGtlcm5lbHMgaGFkIGEgc3BlY2lhbCBzb2NrZXQgdHlwZSBTT0NLX1BBQ0tFVCB0bworCSAqIGltcGxlbWVudCB0aGlzIGZlYXR1cmUuCisJICogV2hpbGUgdGhpcyBvbGQgaW1wbGVtZW50YXRpb24gaXMga2luZCBvZiBvYnNvbGV0ZSB3ZSBuZWVkCisJICogdG8gYmUgY29tcGF0aWJsZSB3aXRoIG9sZGVyIGtlcm5lbHMgZm9yIGEgd2hpbGUgc28gd2UgYXJlCisJICogdHJ5aW5nIGJvdGggbWV0aG9kcyB3aXRoIHRoZSBuZXdlciBtZXRob2QgcHJlZmVycmVkLgorCSAqLworCXN0YXR1cyA9IGFjdGl2YXRlX25ldyhoYW5kbGUpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCS8qCisJCSAqIEZhdGFsIGVycm9yIHdpdGggdGhlIG5ldyB3YXk7IGp1c3QgZmFpbC4KKwkJICogc3RhdHVzIGhhcyB0aGUgZXJyb3IgcmV0dXJuOyBpZiBpdCdzIFBDQVBfRVJST1IsCisJCSAqIGhhbmRsZS0+ZXJyYnVmIGhhcyBiZWVuIHNldCBhcHByb3ByaWF0ZWx5LgorCQkgKi8KKwkJZ290byBmYWlsOworCX0KKwlpZiAoc3RhdHVzID09IDEpIHsKKwkJLyoKKwkJICogU3VjY2Vzcy4KKwkJICogVHJ5IHRvIHVzZSBtZW1vcnktbWFwcGVkIGFjY2Vzcy4KKwkJICovCisJCXN3aXRjaCAoYWN0aXZhdGVfbW1hcChoYW5kbGUsICZzdGF0dXMpKSB7CisKKwkJY2FzZSAxOgorCQkJLyoKKwkJCSAqIFdlIHN1Y2NlZWRlZC4gIHN0YXR1cyBoYXMgYmVlbgorCQkJICogc2V0IHRvIHRoZSBzdGF0dXMgdG8gcmV0dXJuLAorCQkJICogd2hpY2ggbWlnaHQgYmUgMCwgb3IgbWlnaHQgYmUKKwkJCSAqIGEgUENBUF9XQVJOSU5HXyB2YWx1ZS4KKwkJCSAqLworCQkJcmV0dXJuIHN0YXR1czsKKworCQljYXNlIDA6CisJCQkvKgorCQkJICogS2VybmVsIGRvZXNuJ3Qgc3VwcG9ydCBpdCAtIGp1c3QgY29udGludWUKKwkJCSAqIHdpdGggbm9uLW1lbW9yeS1tYXBwZWQgYWNjZXNzLgorCQkJICovCisJCQlicmVhazsKKworCQljYXNlIC0xOgorCQkJLyoKKwkJCSAqIFdlIGZhaWxlZCB0byBzZXQgdXAgdG8gdXNlIGl0LCBvciB0aGUga2VybmVsCisJCQkgKiBzdXBwb3J0cyBpdCwgYnV0IHdlIGZhaWxlZCB0byBlbmFibGUgaXQuCisJCQkgKiBzdGF0dXMgaGFzIGJlZW4gc2V0IHRvIHRoZSBlcnJvciBzdGF0dXMgdG8KKwkJCSAqIHJldHVybiBhbmQsIGlmIGl0J3MgUENBUF9FUlJPUiwgaGFuZGxlLT5lcnJidWYKKwkJCSAqIGNvbnRhaW5zIHRoZSBlcnJvciBtZXNzYWdlLgorCQkJICovCisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJZWxzZSBpZiAoc3RhdHVzID09IDApIHsKKwkJLyogTm9uLWZhdGFsIGVycm9yOyB0cnkgb2xkIHdheSAqLworCQlpZiAoKHN0YXR1cyA9IGFjdGl2YXRlX29sZChoYW5kbGUpKSAhPSAxKSB7CisJCQkvKgorCQkJICogQm90aCBtZXRob2RzIHRvIG9wZW4gdGhlIHBhY2tldCBzb2NrZXQgZmFpbGVkLgorCQkJICogVGlkeSB1cCBhbmQgcmVwb3J0IG91ciBmYWlsdXJlIChoYW5kbGUtPmVycmJ1ZgorCQkJICogaXMgZXhwZWN0ZWQgdG8gYmUgc2V0IGJ5IHRoZSBmdW5jdGlvbnMgYWJvdmUpLgorCQkJICovCisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIHNldCB1cCB0aGUgc29ja2V0LCBidXQgbm90IHdpdGggbWVtb3J5LW1hcHBlZCBhY2Nlc3MuCisJICovCisJc3RhdHVzID0gMDsKKwlpZiAoaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUgIT0gMCkgeworCQkvKgorCQkgKiBTZXQgdGhlIHNvY2tldCBidWZmZXIgc2l6ZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorCQkgKi8KKwkJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLAorCQkgICAgJmhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplLAorCQkgICAgc2l6ZW9mKGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplKSkgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAiU09fUkNWQlVGOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKiBBbGxvY2F0ZSB0aGUgYnVmZmVyICovCisKKwloYW5kbGUtPmJ1ZmZlcgkgPSBtYWxsb2MoaGFuZGxlLT5idWZzaXplICsgaGFuZGxlLT5vZmZzZXQpOworCWlmICghaGFuZGxlLT5idWZmZXIpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXN0YXR1cyA9IFBDQVBfRVJST1I7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqICJoYW5kbGUtPmZkIiBpcyBhIHNvY2tldCwgc28gInNlbGVjdCgpIiBhbmQgInBvbGwoKSIKKwkgKiBzaG91bGQgd29yayBvbiBpdC4KKwkgKi8KKwloYW5kbGUtPnNlbGVjdGFibGVfZmQgPSBoYW5kbGUtPmZkOworCisJcmV0dXJuIHN0YXR1czsKKworZmFpbDoKKwlwY2FwX2NsZWFudXBfbGludXgoaGFuZGxlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogIFJlYWQgYXQgbW9zdCBtYXhfcGFja2V0cyBmcm9tIHRoZSBjYXB0dXJlIHN0cmVhbSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sKKyAqICBmb3IgZWFjaCBvZiB0aGVtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyBoYW5kbGVkIG9yIC0xIGlmIGFuCisgKiAgZXJyb3Igb2NjdXJlZC4KKyAqLworc3RhdGljIGludAorcGNhcF9yZWFkX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCS8qCisJICogQ3VycmVudGx5LCBvbiBMaW51eCBvbmx5IG9uZSBwYWNrZXQgaXMgZGVsaXZlcmVkIHBlciByZWFkLAorCSAqIHNvIHdlIGRvbid0IGxvb3AuCisJICovCisJcmV0dXJuIHBjYXBfcmVhZF9wYWNrZXQoaGFuZGxlLCBjYWxsYmFjaywgdXNlcik7Cit9CisKKy8qCisgKiAgUmVhZCBhIHBhY2tldCBmcm9tIHRoZSBzb2NrZXQgY2FsbGluZyB0aGUgaGFuZGxlciBwcm92aWRlZCBieQorICogIHRoZSB1c2VyLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCBvciAtMSBpZiBhbgorICogIGVycm9yIG9jY3VyZWQuCisgKi8KK3N0YXRpYyBpbnQKK3BjYXBfcmVhZF9wYWNrZXQocGNhcF90ICpoYW5kbGUsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyZGF0YSkKK3sKKwl1X2NoYXIJCQkqYnA7CisJaW50CQkJb2Zmc2V0OworI2lmZGVmIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwJZnJvbTsKKwlzdHJ1Y3Qgc2xsX2hlYWRlcgkqaGRycDsKKyNlbHNlCisJc3RydWN0IHNvY2thZGRyCQlmcm9tOworI2VuZGlmCisjaWYgZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKQorCXN0cnVjdCBpb3ZlYwkJaW92OworCXN0cnVjdCBtc2doZHIJCW1zZzsKKwlzdHJ1Y3QgY21zZ2hkcgkJKmNtc2c7CisJdW5pb24geworCQlzdHJ1Y3QgY21zZ2hkcgljbXNnOworCQljaGFyCQlidWZbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHRwYWNrZXRfYXV4ZGF0YSkpXTsKKwl9IGNtc2dfYnVmOworI2Vsc2UgLyogZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKSAqLworCXNvY2tsZW5fdAkJZnJvbWxlbjsKKyNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfUEFDS0VUX0FVWERBVEEpICYmIGRlZmluZWQoSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kpICovCisJaW50CQkJcGFja2V0X2xlbiwgY2FwbGVuOworCXN0cnVjdCBwY2FwX3BrdGhkcglwY2FwX2hlYWRlcjsKKworI2lmZGVmIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBjb29rZWQgZGV2aWNlLCBsZWF2ZSBleHRyYSByb29tIGZvciBhCisJICogZmFrZSBwYWNrZXQgaGVhZGVyLgorCSAqLworCWlmIChoYW5kbGUtPm1kLmNvb2tlZCkKKwkJb2Zmc2V0ID0gU0xMX0hEUl9MRU47CisJZWxzZQorCQlvZmZzZXQgPSAwOworI2Vsc2UKKwkvKgorCSAqIFRoaXMgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBQRl9QQUNLRVQgc29ja2V0cywgc28gaXQgZG9lc24ndAorCSAqIHN1cHBvcnQgY29va2VkIGRldmljZXMuCisJICovCisJb2Zmc2V0ID0gMDsKKyNlbmRpZgorCisJLyoKKwkgKiBSZWNlaXZlIGEgc2luZ2xlIHBhY2tldCBmcm9tIHRoZSBrZXJuZWwuCisJICogV2UgaWdub3JlIEVJTlRSLCBhcyB0aGF0IG1pZ2h0IGp1c3QgYmUgZHVlIHRvIGEgc2lnbmFsCisJICogYmVpbmcgZGVsaXZlcmVkIC0gaWYgdGhlIHNpZ25hbCBzaG91bGQgaW50ZXJydXB0IHRoZQorCSAqIGxvb3AsIHRoZSBzaWduYWwgaGFuZGxlciBzaG91bGQgY2FsbCBwY2FwX2JyZWFrbG9vcCgpCisJICogdG8gc2V0IGhhbmRsZS0+YnJlYWtfbG9vcCAod2UgaWdub3JlIGl0IG9uIG90aGVyCisJICogcGxhdGZvcm1zIGFzIHdlbGwpLgorCSAqIFdlIGFsc28gaWdub3JlIEVORVRET1dOLCBzbyB0aGF0IHdlIGNhbiBjb250aW51ZSB0bworCSAqIGNhcHR1cmUgdHJhZmZpYyBpZiB0aGUgaW50ZXJmYWNlIGdvZXMgZG93biBhbmQgY29tZXMKKwkgKiBiYWNrIHVwIGFnYWluOyBjb21tZW50cyBpbiB0aGUga2VybmVsIGluZGljYXRlIHRoYXQKKwkgKiB3ZSdsbCBqdXN0IGJsb2NrIHdhaXRpbmcgZm9yIHBhY2tldHMgaWYgd2UgdHJ5IHRvCisJICogcmVjZWl2ZSBmcm9tIGEgc29ja2V0IHRoYXQgZGVsaXZlcmVkIEVORVRET1dOLCBhbmQsCisJICogaWYgd2UncmUgdXNpbmcgYSBtZW1vcnktbWFwcGVkIGJ1ZmZlciwgd2Ugd29uJ3QgZXZlbgorCSAqIGdldCBub3RpZmllZCBvZiAibmV0d29yayBkb3duIiBldmVudHMuCisJICovCisJYnAgPSBoYW5kbGUtPmJ1ZmZlciArIGhhbmRsZS0+b2Zmc2V0OworCisjaWYgZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKQorCW1zZy5tc2dfbmFtZQkJPSAmZnJvbTsKKwltc2cubXNnX25hbWVsZW4JCT0gc2l6ZW9mKGZyb20pOworCW1zZy5tc2dfaW92CQk9ICZpb3Y7CisJbXNnLm1zZ19pb3ZsZW4JCT0gMTsKKwltc2cubXNnX2NvbnRyb2wJCT0gJmNtc2dfYnVmOworCW1zZy5tc2dfY29udHJvbGxlbgk9IHNpemVvZihjbXNnX2J1Zik7CisJbXNnLm1zZ19mbGFncwkJPSAwOworCisJaW92Lmlvdl9sZW4JCT0gaGFuZGxlLT5idWZzaXplIC0gb2Zmc2V0OworCWlvdi5pb3ZfYmFzZQkJPSBicCArIG9mZnNldDsKKyNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfUEFDS0VUX0FVWERBVEEpICYmIGRlZmluZWQoSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kpICovCisKKwlkbyB7CisJCS8qCisJCSAqIEhhcyAicGNhcF9icmVha2xvb3AoKSIgYmVlbiBjYWxsZWQ/CisJCSAqLworCQlpZiAoaGFuZGxlLT5icmVha19sb29wKSB7CisJCQkvKgorCQkJICogWWVzIC0gY2xlYXIgdGhlIGZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBpdCBoYXMsCisJCQkgKiBhbmQgcmV0dXJuIFBDQVBfRVJST1JfQlJFQUsgYXMgYW4gaW5kaWNhdGlvbiB0aGF0CisJCQkgKiB3ZSB3ZXJlIHRvbGQgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorCQkJICovCisJCQloYW5kbGUtPmJyZWFrX2xvb3AgPSAwOworCQkJcmV0dXJuIFBDQVBfRVJST1JfQlJFQUs7CisJCX0KKworI2lmIGRlZmluZWQoSEFWRV9QQUNLRVRfQVVYREFUQSkgJiYgZGVmaW5lZChIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSkKKwkJcGFja2V0X2xlbiA9IHJlY3Ztc2coaGFuZGxlLT5mZCwgJm1zZywgTVNHX1RSVU5DKTsKKyNlbHNlIC8qIGRlZmluZWQoSEFWRV9QQUNLRVRfQVVYREFUQSkgJiYgZGVmaW5lZChIQVZFX0xJTlVYX1RQQUNLRVRfQVVYREFUQV9UUF9WTEFOX1RDSSkgKi8KKwkJZnJvbWxlbiA9IHNpemVvZihmcm9tKTsKKwkJcGFja2V0X2xlbiA9IHJlY3Zmcm9tKAorCQkJaGFuZGxlLT5mZCwgYnAgKyBvZmZzZXQsCisJCQloYW5kbGUtPmJ1ZnNpemUgLSBvZmZzZXQsIE1TR19UUlVOQywKKwkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgJmZyb20sICZmcm9tbGVuKTsKKyNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfUEFDS0VUX0FVWERBVEEpICYmIGRlZmluZWQoSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kpICovCisJfSB3aGlsZSAocGFja2V0X2xlbiA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisKKwkvKiBDaGVjayBpZiBhbiBlcnJvciBvY2N1cmVkICovCisKKwlpZiAocGFja2V0X2xlbiA9PSAtMSkgeworCQlzd2l0Y2ggKGVycm5vKSB7CisKKwkJY2FzZSBFQUdBSU46CisJCQlyZXR1cm4gMDsJLyogbm8gcGFja2V0IHRoZXJlICovCisKKwkJY2FzZSBFTkVURE9XTjoKKwkJCS8qCisJCQkgKiBUaGUgZGV2aWNlIG9uIHdoaWNoIHdlJ3JlIGNhcHR1cmluZyB3ZW50IGF3YXkuCisJCQkgKgorCQkJICogWFhYIC0gd2Ugc2hvdWxkIHJlYWxseSByZXR1cm4KKwkJCSAqIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQLCBidXQgcGNhcF9kaXNwYXRjaCgpCisJCQkgKiBldGMuIGFyZW4ndCBkZWZpbmVkIHRvIHJldHVybiB0aGF0LgorCQkJICovCisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkiVGhlIGludGVyZmFjZSB3ZW50IGRvd24iKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCisJCWRlZmF1bHQ6CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgInJlY3Zmcm9tOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisJfQorCisjaWZkZWYgSEFWRV9QRl9QQUNLRVRfU09DS0VUUworCWlmICghaGFuZGxlLT5tZC5zb2NrX3BhY2tldCkgeworCQkvKgorCQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBhIHdpbmRvdyBiZXR3ZWVuIHNvY2tldCgpIGFuZAorCQkgKiBiaW5kKCkgd2hlcmUgdGhlIGtlcm5lbCBtYXkgcXVldWUgcGFja2V0cyBmcm9tIGFueQorCQkgKiBpbnRlcmZhY2UuICBJZiB3ZSdyZSBib3VuZCB0byBhIHBhcnRpY3VsYXIgaW50ZXJmYWNlLAorCQkgKiBkaXNjYXJkIHBhY2tldHMgbm90IGZyb20gdGhhdCBpbnRlcmZhY2UuCisJCSAqCisJCSAqIChJZiBzb2NrZXQgZmlsdGVycyBhcmUgc3VwcG9ydGVkLCB3ZSBjb3VsZCBkbyB0aGUKKwkJICogc2FtZSB0aGluZyB3ZSBkbyB3aGVuIGNoYW5naW5nIHRoZSBmaWx0ZXI7IGhvd2V2ZXIsCisJCSAqIHRoYXQgd29uJ3QgaGFuZGxlIHBhY2tldCBzb2NrZXRzIHdpdGhvdXQgc29ja2V0CisJCSAqIGZpbHRlciBzdXBwb3J0LCBhbmQgaXQncyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLgorCQkgKiBJdCB3b3VsZCBzYXZlIHNvbWUgaW5zdHJ1Y3Rpb25zIHBlciBwYWNrZXQsIGhvd2V2ZXIuKQorCQkgKi8KKwkJaWYgKGhhbmRsZS0+bWQuaWZpbmRleCAhPSAtMSAmJgorCQkgICAgZnJvbS5zbGxfaWZpbmRleCAhPSBoYW5kbGUtPm1kLmlmaW5kZXgpCisJCQlyZXR1cm4gMDsKKworCQkvKgorCQkgKiBEbyBjaGVja3MgYmFzZWQgb24gcGFja2V0IGRpcmVjdGlvbi4KKwkJICogV2UgY2FuIG9ubHkgZG8gdGhpcyBpZiB3ZSdyZSB1c2luZyBQRl9QQUNLRVQ7IHRoZQorCQkgKiBhZGRyZXNzIHJldHVybmVkIGZvciBTT0NLX1BBQ0tFVCBpcyBhICJzb2NrYWRkcl9wa3QiCisJCSAqIHdoaWNoIGxhY2tzIHRoZSByZWxldmFudCBwYWNrZXQgdHlwZSBpbmZvcm1hdGlvbi4KKwkJICovCisJCWlmIChmcm9tLnNsbF9wa3R0eXBlID09IFBBQ0tFVF9PVVRHT0lORykgeworCQkJLyoKKwkJCSAqIE91dGdvaW5nIHBhY2tldC4KKwkJCSAqIElmIHRoaXMgaXMgZnJvbSB0aGUgbG9vcGJhY2sgZGV2aWNlLCByZWplY3QgaXQ7CisJCQkgKiB3ZSdsbCBzZWUgdGhlIHBhY2tldCBhcyBhbiBpbmNvbWluZyBwYWNrZXQgYXMgd2VsbCwKKwkJCSAqIGFuZCB3ZSBkb24ndCB3YW50IHRvIHNlZSBpdCB0d2ljZS4KKwkJCSAqLworCQkJaWYgKGZyb20uc2xsX2lmaW5kZXggPT0gaGFuZGxlLT5tZC5sb19pZmluZGV4KQorCQkJCXJldHVybiAwOworCisJCQkvKgorCQkJICogSWYgdGhlIHVzZXIgb25seSB3YW50cyBpbmNvbWluZyBwYWNrZXRzLCByZWplY3QgaXQuCisJCQkgKi8KKwkJCWlmIChoYW5kbGUtPmRpcmVjdGlvbiA9PSBQQ0FQX0RfSU4pCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSW5jb21pbmcgcGFja2V0LgorCQkJICogSWYgdGhlIHVzZXIgb25seSB3YW50cyBvdXRnb2luZyBwYWNrZXRzLCByZWplY3QgaXQuCisJCQkgKi8KKwkJCWlmIChoYW5kbGUtPmRpcmVjdGlvbiA9PSBQQ0FQX0RfT1VUKQorCQkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgY29va2VkIGRldmljZSwgZmlsbCBpbiB0aGUgZmFrZSBwYWNrZXQgaGVhZGVyLgorCSAqLworCWlmIChoYW5kbGUtPm1kLmNvb2tlZCkgeworCQkvKgorCQkgKiBBZGQgdGhlIGxlbmd0aCBvZiB0aGUgZmFrZSBoZWFkZXIgdG8gdGhlIGxlbmd0aAorCQkgKiBvZiBwYWNrZXQgZGF0YSB3ZSByZWFkLgorCQkgKi8KKwkJcGFja2V0X2xlbiArPSBTTExfSERSX0xFTjsKKworCQloZHJwID0gKHN0cnVjdCBzbGxfaGVhZGVyICopYnA7CisJCWhkcnAtPnNsbF9wa3R0eXBlID0gbWFwX3BhY2tldF90eXBlX3RvX3NsbF90eXBlKGZyb20uc2xsX3BrdHR5cGUpOworCQloZHJwLT5zbGxfaGF0eXBlID0gaHRvbnMoZnJvbS5zbGxfaGF0eXBlKTsKKwkJaGRycC0+c2xsX2hhbGVuID0gaHRvbnMoZnJvbS5zbGxfaGFsZW4pOworCQltZW1jcHkoaGRycC0+c2xsX2FkZHIsIGZyb20uc2xsX2FkZHIsCisJCSAgICAoZnJvbS5zbGxfaGFsZW4gPiBTTExfQUREUkxFTikgPworCQkgICAgICBTTExfQUREUkxFTiA6CisJCSAgICAgIGZyb20uc2xsX2hhbGVuKTsKKwkJaGRycC0+c2xsX3Byb3RvY29sID0gZnJvbS5zbGxfcHJvdG9jb2w7CisJfQorCisjaWYgZGVmaW5lZChIQVZFX1BBQ0tFVF9BVVhEQVRBKSAmJiBkZWZpbmVkKEhBVkVfTElOVVhfVFBBQ0tFVF9BVVhEQVRBX1RQX1ZMQU5fVENJKQorCWZvciAoY21zZyA9IENNU0dfRklSU1RIRFIoJm1zZyk7IGNtc2c7IGNtc2cgPSBDTVNHX05YVEhEUigmbXNnLCBjbXNnKSkgeworCQlzdHJ1Y3QgdHBhY2tldF9hdXhkYXRhICphdXg7CisJCXVuc2lnbmVkIGludCBsZW47CisJCXN0cnVjdCB2bGFuX3RhZyAqdGFnOworCisJCWlmIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgdHBhY2tldF9hdXhkYXRhKSkgfHwKKwkJICAgIGNtc2ctPmNtc2dfbGV2ZWwgIT0gU09MX1BBQ0tFVCB8fAorCQkgICAgY21zZy0+Y21zZ190eXBlICE9IFBBQ0tFVF9BVVhEQVRBKQorCQkJY29udGludWU7CisKKwkJYXV4ID0gKHN0cnVjdCB0cGFja2V0X2F1eGRhdGEgKilDTVNHX0RBVEEoY21zZyk7CisJCWlmIChhdXgtPnRwX3ZsYW5fdGNpID09IDApCisJCQljb250aW51ZTsKKworCQlsZW4gPSBwYWNrZXRfbGVuID4gaW92Lmlvdl9sZW4gPyBpb3YuaW92X2xlbiA6IHBhY2tldF9sZW47CisJCWlmIChsZW4gPCAyICogRVRIX0FMRU4pCisJCQlicmVhazsKKworCQlicCAtPSBWTEFOX1RBR19MRU47CisJCW1lbW1vdmUoYnAsIGJwICsgVkxBTl9UQUdfTEVOLCAyICogRVRIX0FMRU4pOworCisJCXRhZyA9IChzdHJ1Y3Qgdmxhbl90YWcgKikoYnAgKyAyICogRVRIX0FMRU4pOworCQl0YWctPnZsYW5fdHBpZCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKKwkJdGFnLT52bGFuX3RjaSA9IGh0b25zKGF1eC0+dHBfdmxhbl90Y2kpOworCisJCXBhY2tldF9sZW4gKz0gVkxBTl9UQUdfTEVOOworCX0KKyNlbmRpZiAvKiBkZWZpbmVkKEhBVkVfUEFDS0VUX0FVWERBVEEpICYmIGRlZmluZWQoSEFWRV9MSU5VWF9UUEFDS0VUX0FVWERBVEFfVFBfVkxBTl9UQ0kpICovCisjZW5kaWYgLyogSEFWRV9QRl9QQUNLRVRfU09DS0VUUyAqLworCisJLyoKKwkgKiBYWFg6IEFjY29yZGluZyB0byB0aGUga2VybmVsIHNvdXJjZSB3ZSBzaG91bGQgZ2V0IHRoZSByZWFsCisJICogcGFja2V0IGxlbiBpZiBjYWxsaW5nIHJlY3Zmcm9tIHdpdGggTVNHX1RSVU5DIHNldC4gSXQgZG9lcworCSAqIG5vdCBzZWVtIHRvIHdvcmsgaGVyZSA6KCwgYnV0IGl0IGlzIHN1cHBvcnRlZCBieSB0aGlzIGNvZGUKKwkgKiBhbnl3YXkuCisJICogVG8gYmUgaG9uZXN0IHRoZSBjb2RlIFJFTElFUyBvbiB0aGF0IGZlYXR1cmUgc28gdGhpcyBpcyByZWFsbHkKKwkgKiBicm9rZW4gd2l0aCAyLjIueCBrZXJuZWxzLgorCSAqIEkgc3BlbmQgYSBkYXkgdG8gZmlndXJlIG91dCB3aGF0J3MgZ29pbmcgb24gYW5kIEkgZm91bmQgb3V0CisJICogdGhhdCB0aGUgZm9sbG93aW5nIGlzIGhhcHBlbmluZzoKKwkgKgorCSAqIFRoZSBwYWNrZXQgY29tZXMgZnJvbSBhIHJhbmRvbSBpbnRlcmZhY2UgYW5kIHRoZSBwYWNrZXRfcmN2CisJICogaG9vayBpcyBjYWxsZWQgd2l0aCBhIGNsb25lIG9mIHRoZSBwYWNrZXQuIFRoYXQgY29kZSBpbnNlcnRzCisJICogdGhlIHBhY2tldCBpbnRvIHRoZSByZWNlaXZlIHF1ZXVlIG9mIHRoZSBwYWNrZXQgc29ja2V0LgorCSAqIElmIGEgZmlsdGVyIGlzIGF0dGFjaGVkIHRvIHRoYXQgc29ja2V0IHRoYXQgZmlsdGVyIGlzIHJ1bgorCSAqIGZpcnN0IC0gYW5kIHRoZXJlIGxpZXMgdGhlIHByb2JsZW0uIFRoZSBkZWZhdWx0IGZpbHRlciBhbHdheXMKKwkgKiBjdXRzIHRoZSBwYWNrZXQgYXQgdGhlIHNuYXBsZW46CisJICoKKwkgKiAjIHRjcGR1bXAgLWQKKwkgKiAoMDAwKSByZXQgICAgICAjNjgKKwkgKgorCSAqIFNvIHRoZSBwYWNrZXQgZmlsdGVyIGN1dHMgZG93biB0aGUgcGFja2V0LiBUaGUgcmVjdmZyb20gY2FsbAorCSAqIHNheXMgImhleSwgaXQncyBvbmx5IDY4IGJ5dGVzLCBpdCBmaXRzIGludG8gdGhlIGJ1ZmZlciIgd2l0aAorCSAqIHRoZSByZXN1bHQgdGhhdCB3ZSBkb24ndCBnZXQgdGhlIHJlYWwgcGFja2V0IGxlbmd0aC4gVGhpcworCSAqIGlzIHZhbGlkIGF0IGxlYXN0IHVudGlsIGtlcm5lbCAyLjIuMTdwcmU2LgorCSAqCisJICogV2UgY3VycmVudGx5IGhhbmRsZSB0aGlzIGJ5IG1ha2luZyBhIGNvcHkgb2YgdGhlIGZpbHRlcgorCSAqIHByb2dyYW0sIGZpeGluZyBhbGwgInJldCIgaW5zdHJ1Y3Rpb25zIHdpdGggbm9uLXplcm8KKwkgKiBvcGVyYW5kcyB0byBoYXZlIGFuIG9wZXJhbmQgb2YgNjU1MzUgc28gdGhhdCB0aGUgZmlsdGVyCisJICogZG9lc24ndCB0cnVuY2F0ZSB0aGUgcGFja2V0LCBhbmQgc3VwcGx5aW5nIHRoYXQgbW9kaWZpZWQKKwkgKiBmaWx0ZXIgdG8gdGhlIGtlcm5lbC4KKwkgKi8KKworCWNhcGxlbiA9IHBhY2tldF9sZW47CisJaWYgKGNhcGxlbiA+IGhhbmRsZS0+c25hcHNob3QpCisJCWNhcGxlbiA9IGhhbmRsZS0+c25hcHNob3Q7CisKKwkvKiBSdW4gdGhlIHBhY2tldCBmaWx0ZXIgaWYgbm90IHVzaW5nIGtlcm5lbCBmaWx0ZXIgKi8KKwlpZiAoIWhhbmRsZS0+bWQudXNlX2JwZiAmJiBoYW5kbGUtPmZjb2RlLmJmX2luc25zKSB7CisJCWlmIChicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsIGJwLAorCQkgICAgICAgICAgICAgICAgcGFja2V0X2xlbiwgY2FwbGVuKSA9PSAwKQorCQl7CisJCQkvKiByZWplY3RlZCBieSBmaWx0ZXIgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogRmlsbCBpbiBvdXIgb3duIGhlYWRlciBkYXRhICovCisKKwlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ0dTVEFNUCwgJnBjYXBfaGVhZGVyLnRzKSA9PSAtMSkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAiU0lPQ0dTVEFNUDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKwlwY2FwX2hlYWRlci5jYXBsZW4JPSBjYXBsZW47CisJcGNhcF9oZWFkZXIubGVuCQk9IHBhY2tldF9sZW47CisKKwkvKgorCSAqIENvdW50IHRoZSBwYWNrZXQuCisJICoKKwkgKiBBcmd1YWJseSwgd2Ugc2hvdWxkIGNvdW50IHRoZW0gYmVmb3JlIHdlIGNoZWNrIHRoZSBmaWx0ZXIsCisJICogYXMgb24gbWFueSBvdGhlciBwbGF0Zm9ybXMgInBzX3JlY3YiIGNvdW50cyBwYWNrZXRzCisJICogaGFuZGVkIHRvIHRoZSBmaWx0ZXIgcmF0aGVyIHRoYW4gcGFja2V0cyB0aGF0IHBhc3NlZAorCSAqIHRoZSBmaWx0ZXIsIGJ1dCBpZiBmaWx0ZXJpbmcgaXMgZG9uZSBpbiB0aGUga2VybmVsLCB3ZQorCSAqIGNhbid0IGdldCBhIGNvdW50IG9mIHBhY2tldHMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlciwKKwkgKiBhbmQgdGhhdCB3b3VsZCBtZWFuIHRoZSBtZWFuaW5nIG9mICJwc19yZWN2IiB3b3VsZG4ndAorCSAqIGJlIHRoZSBzYW1lIG9uIGFsbCBMaW51eCBzeXN0ZW1zLgorCSAqCisJICogWFhYIC0gaXQncyBub3QgdGhlIHNhbWUgb24gYWxsIHN5c3RlbXMgaW4gYW55IGNhc2U7CisJICogaWRlYWxseSwgd2Ugc2hvdWxkIGhhdmUgYSAiZ2V0IHRoZSBzdGF0aXN0aWNzIiBjYWxsCisJICogdGhhdCBzdXBwbGllcyBtb3JlIGNvdW50cyBhbmQgaW5kaWNhdGVzIHdoaWNoIG9mIHRoZW0KKwkgKiBpdCBzdXBwbGllcywgc28gdGhhdCB3ZSBzdXBwbHkgYSBjb3VudCBvZiBwYWNrZXRzCisJICogaGFuZGVkIHRvIHRoZSBmaWx0ZXIgb25seSBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhhdAorCSAqIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKwkgKgorCSAqIFdlIGNvdW50IHRoZW0gaGVyZSBldmVuIGlmIHdlIGNhbiBnZXQgdGhlIHBhY2tldCBjb3VudAorCSAqIGZyb20gdGhlIGtlcm5lbCwgYXMgd2UgY2FuIG9ubHkgZGV0ZXJtaW5lIGF0IHJ1biB0aW1lCisJICogd2hldGhlciB3ZSdsbCBiZSBhYmxlIHRvIGdldCBpdCBmcm9tIHRoZSBrZXJuZWwgKGlmCisJICogSEFWRV9UUEFDS0VUX1NUQVRTIGlzbid0IGRlZmluZWQsIHdlIGNhbid0IGdldCBpdCBmcm9tCisJICogdGhlIGtlcm5lbCwgYnV0IGlmIGl0IGlzIGRlZmluZWQsIHRoZSBsaWJyYXJ5IG1pZ2h0CisJICogaGF2ZSBiZWVuIGJ1aWx0IHdpdGggYSAyLjQgb3IgbGF0ZXIga2VybmVsLCBidXQgd2UKKwkgKiBtaWdodCBiZSBydW5uaW5nIG9uIGEgMi4yWy54XSBrZXJuZWwgd2l0aG91dCBBbGV4ZXkKKwkgKiBLdXpuZXR6b3YncyB0dXJib3BhY2tldCBwYXRjaGVzLCBhbmQgdGh1cyB0aGUga2VybmVsCisJICogbWlnaHQgbm90IGJlIGFibGUgdG8gc3VwcGx5IHRob3NlIHN0YXRpc3RpY3MpLiAgV2UKKwkgKiBjb3VsZCwgSSBndWVzcywgdHJ5LCB3aGVuIG9wZW5pbmcgdGhlIHNvY2tldCwgdG8gZ2V0CisJICogdGhlIHN0YXRpc3RpY3MsIGFuZCBpZiB3ZSBjYW4gbm90IGluY3JlbWVudCB0aGUgY291bnQKKwkgKiBoZXJlLCBidXQgaXQncyBub3QgY2xlYXIgdGhhdCBhbHdheXMgaW5jcmVtZW50aW5nCisJICogdGhlIGNvdW50IGlzIG1vcmUgZXhwZW5zaXZlIHRoYW4gYWx3YXlzIHRlc3RpbmcgYSBmbGFnCisJICogaW4gbWVtb3J5LgorCSAqCisJICogV2Uga2VlcCB0aGUgY291bnQgaW4gIm1kLnBhY2tldHNfcmVhZCIsIGFuZCB1c2UgdGhhdCBmb3IKKwkgKiAicHNfcmVjdiIgaWYgd2UgY2FuJ3QgZ2V0IHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlIGtlcm5lbC4KKwkgKiBXZSBkbyB0aGF0IGJlY2F1c2UsIGlmIHdlICpjYW4qIGdldCB0aGUgc3RhdGlzdGljcyBmcm9tCisJICogdGhlIGtlcm5lbCwgd2UgdXNlICJtZC5zdGF0LnBzX3JlY3YiIGFuZCAibWQuc3RhdC5wc19kcm9wIgorCSAqIGFzIHJ1bm5pbmcgY291bnRzLCBhcyByZWFkaW5nIHRoZSBzdGF0aXN0aWNzIGZyb20gdGhlCisJICoga2VybmVsIHJlc2V0cyB0aGUga2VybmVsIHN0YXRpc3RpY3MsIGFuZCBpZiB3ZSBkaXJlY3RseQorCSAqIGluY3JlbWVudCAibWQuc3RhdC5wc19yZWN2IiBoZXJlLCB0aGF0IG1lYW5zIGl0IHdpbGwKKwkgKiBjb3VudCBwYWNrZXRzICp0d2ljZSogb24gc3lzdGVtcyB3aGVyZSB3ZSBjYW4gZ2V0IGtlcm5lbAorCSAqIHN0YXRpc3RpY3MgLSBvbmNlIGhlcmUsIGFuZCBvbmNlIGluIHBjYXBfc3RhdHNfbGludXgoKS4KKwkgKi8KKwloYW5kbGUtPm1kLnBhY2tldHNfcmVhZCsrOworCisJLyogQ2FsbCB0aGUgdXNlciBzdXBwbGllZCBjYWxsYmFjayBmdW5jdGlvbiAqLworCWNhbGxiYWNrKHVzZXJkYXRhLCAmcGNhcF9oZWFkZXIsIGJwKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50CitwY2FwX2luamVjdF9saW51eChwY2FwX3QgKmhhbmRsZSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisjaWZkZWYgSEFWRV9QRl9QQUNLRVRfU09DS0VUUworCWlmICghaGFuZGxlLT5tZC5zb2NrX3BhY2tldCkgeworCQkvKiBQRl9QQUNLRVQgc29ja2V0ICovCisJCWlmIChoYW5kbGUtPm1kLmlmaW5kZXggPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCBzdXBwb3J0IHNlbmRpbmcgb24gdGhlICJhbnkiIGRldmljZS4KKwkJCSAqLworCQkJc3RybGNweShoYW5kbGUtPmVycmJ1ZiwKKwkJCSAgICAiU2VuZGluZyBwYWNrZXRzIGlzbid0IHN1cHBvcnRlZCBvbiB0aGUgXCJhbnlcIiBkZXZpY2UiLAorCQkJICAgIFBDQVBfRVJSQlVGX1NJWkUpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKworCQlpZiAoaGFuZGxlLT5tZC5jb29rZWQpIHsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCBzdXBwb3J0IHNlbmRpbmcgb24gdGhlICJhbnkiIGRldmljZS4KKwkJCSAqCisJCQkgKiBYWFggLSBob3cgZG8geW91IHNlbmQgb24gYSBib3VuZCBjb29rZWQtbW9kZQorCQkJICogc29ja2V0PworCQkJICogSXMgYSAic2VuZHRvKCkiIHJlcXVpcmVkIHRoZXJlPworCQkJICovCisJCQlzdHJsY3B5KGhhbmRsZS0+ZXJyYnVmLAorCQkJICAgICJTZW5kaW5nIHBhY2tldHMgaXNuJ3Qgc3VwcG9ydGVkIGluIGNvb2tlZCBtb2RlIiwKKwkJCSAgICBQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorI2VuZGlmCisKKwlyZXQgPSBzZW5kKGhhbmRsZS0+ZmQsIGJ1Ziwgc2l6ZSwgMCk7CisJaWYgKHJldCA9PSAtMSkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAocmV0KTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAKKworLyoKKyAqICBHZXQgdGhlIHN0YXRpc3RpY3MgZm9yIHRoZSBnaXZlbiBwYWNrZXQgY2FwdHVyZSBoYW5kbGUuCisgKiAgUmVwb3J0cyB0aGUgbnVtYmVyIG9mIGRyb3BwZWQgcGFja2V0cyBpZmYgdGhlIGtlcm5lbCBzdXBwb3J0cworICogIHRoZSBQQUNLRVRfU1RBVElTVElDUyAiZ2V0c29ja29wdCgpIiBhcmd1bWVudCAoMi40IGFuZCBsYXRlcgorICogIGtlcm5lbHMsIGFuZCAyLjJbLnhdIGtlcm5lbHMgd2l0aCBBbGV4ZXkgS3V6bmV0em92J3MgdHVyYm9wYWNrZXQKKyAqICBwYXRjaGVzKTsgb3RoZXJ3aXNlLCB0aGF0IGluZm9ybWF0aW9uIGlzbid0IGF2YWlsYWJsZSwgYW5kIHdlIGxpZQorICogIGFuZCByZXBvcnQgMCBhcyB0aGUgY291bnQgb2YgZHJvcHBlZCBwYWNrZXRzLgorICovCitzdGF0aWMgaW50CitwY2FwX3N0YXRzX2xpbnV4KHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpzdGF0cykKK3sKKyNpZmRlZiBIQVZFX1RQQUNLRVRfU1RBVFMKKwlzdHJ1Y3QgdHBhY2tldF9zdGF0cyBrc3RhdHM7CisJc29ja2xlbl90IGxlbiA9IHNpemVvZiAoc3RydWN0IHRwYWNrZXRfc3RhdHMpOworI2VuZGlmCisKKwlsb25nIGlmX2Ryb3BwZWQgPSAwOworCQorCS8qIAorCSAqCVRvIGZpbGwgaW4gcHNfaWZkcm9wLCB3ZSBwYXJzZSAvcHJvYy9uZXQvZGV2IGZvciB0aGUgbnVtYmVyCisJICovCisJaWYgKGhhbmRsZS0+b3B0LnByb21pc2MpCisJeworCQlpZl9kcm9wcGVkID0gaGFuZGxlLT5tZC5wcm9jX2Ryb3BwZWQ7CisJCWhhbmRsZS0+bWQucHJvY19kcm9wcGVkID0gbGludXhfaWZfZHJvcHMoaGFuZGxlLT5tZC5kZXZpY2UpOworCQloYW5kbGUtPm1kLnN0YXQucHNfaWZkcm9wICs9IChoYW5kbGUtPm1kLnByb2NfZHJvcHBlZCAtIGlmX2Ryb3BwZWQpOworCX0KKworI2lmZGVmIEhBVkVfVFBBQ0tFVF9TVEFUUworCS8qCisJICogVHJ5IHRvIGdldCB0aGUgcGFja2V0IGNvdW50cyBmcm9tIHRoZSBrZXJuZWwuCisJICovCisJaWYgKGdldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX1NUQVRJU1RJQ1MsCisJCQkma3N0YXRzLCAmbGVuKSA+IC0xKSB7CisJCS8qCisJCSAqIE9uIHN5c3RlbXMgd2hlcmUgdGhlIFBBQ0tFVF9TVEFUSVNUSUNTICJnZXRzb2Nrb3B0KCkiCisJCSAqIGFyZ3VtZW50IGlzIHN1cHBvcnRlZCBvbiBQRl9QQUNLRVQgc29ja2V0czoKKwkJICoKKwkJICoJInBzX3JlY3YiIGNvdW50cyBvbmx5IHBhY2tldHMgdGhhdCAqcGFzc2VkKiB0aGUKKwkJICoJZmlsdGVyLCBub3QgcGFja2V0cyB0aGF0IGRpZG4ndCBwYXNzIHRoZSBmaWx0ZXIuCisJCSAqCVRoaXMgaW5jbHVkZXMgcGFja2V0cyBsYXRlciBkcm9wcGVkIGJlY2F1c2Ugd2UKKwkJICoJcmFuIG91dCBvZiBidWZmZXIgc3BhY2UuCisJCSAqCisJCSAqCSJwc19kcm9wIiBjb3VudHMgcGFja2V0cyBkcm9wcGVkIGJlY2F1c2Ugd2UgcmFuCisJCSAqCW91dCBvZiBidWZmZXIgc3BhY2UuICBJdCBkb2Vzbid0IGNvdW50IHBhY2tldHMKKwkJICoJZHJvcHBlZCBieSB0aGUgaW50ZXJmYWNlIGRyaXZlci4gIEl0IGNvdW50cyBvbmx5CisJCSAqCXBhY2tldHMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlci4KKwkJICoKKwkJICoJU2VlIGFib3ZlIGZvciBwc19pZmRyb3AuIAorCQkgKgorCQkgKglCb3RoIHN0YXRpc3RpY3MgaW5jbHVkZSBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tCisJCSAqCXRoZSBrZXJuZWwgYnkgbGlicGNhcCwgYW5kIHRodXMgbm90IHlldCBzZWVuIGJ5CisJCSAqCXRoZSBhcHBsaWNhdGlvbi4KKwkJICoKKwkJICogSW4gImxpbnV4L25ldC9wYWNrZXQvYWZfcGFja2V0LmMiLCBhdCBsZWFzdCBpbiB0aGUKKwkJICogMi40Ljkga2VybmVsLCAidHBfcGFja2V0cyIgaXMgaW5jcmVtZW50ZWQgZm9yIGV2ZXJ5CisJCSAqIHBhY2tldCB0aGF0IHBhc3NlcyB0aGUgcGFja2V0IGZpbHRlciAqYW5kKiBpcworCQkgKiBzdWNjZXNzZnVsbHkgcXVldWVkIG9uIHRoZSBzb2NrZXQ7ICJ0cF9kcm9wcyIgaXMKKwkJICogaW5jcmVtZW50ZWQgZm9yIGV2ZXJ5IHBhY2tldCBkcm9wcGVkIGJlY2F1c2UgdGhlcmUncworCQkgKiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgaW4gdGhlIHNvY2tldCBidWZmZXIuCisJCSAqCisJCSAqIFdoZW4gdGhlIHN0YXRpc3RpY3MgYXJlIHJldHVybmVkIGZvciBhIFBBQ0tFVF9TVEFUSVNUSUNTCisJCSAqICJnZXRzb2Nrb3B0KCkiIGNhbGwsICJ0cF9kcm9wcyIgaXMgYWRkZWQgdG8gInRwX3BhY2tldHMiLAorCQkgKiBzbyB0aGF0ICJ0cF9wYWNrZXRzIiBjb3VudHMgYWxsIHBhY2tldHMgaGFuZGVkIHRvCisJCSAqIHRoZSBQRl9QQUNLRVQgc29ja2V0LCBpbmNsdWRpbmcgcGFja2V0cyBkcm9wcGVkIGJlY2F1c2UKKwkJICogdGhlcmUgd2Fzbid0IHJvb20gb24gdGhlIHNvY2tldCBidWZmZXIgLSBidXQgbm90CisJCSAqIGluY2x1ZGluZyBwYWNrZXRzIHRoYXQgZGlkbid0IHBhc3MgdGhlIGZpbHRlci4KKwkJICoKKwkJICogSW4gdGhlIEJTRCBCUEYsIHRoZSBjb3VudCBvZiByZWNlaXZlZCBwYWNrZXRzIGlzCisJCSAqIGluY3JlbWVudGVkIGZvciBldmVyeSBwYWNrZXQgaGFuZGVkIHRvIEJQRiwgcmVnYXJkbGVzcworCQkgKiBvZiB3aGV0aGVyIGl0IHBhc3NlZCB0aGUgZmlsdGVyLgorCQkgKgorCQkgKiBXZSBjYW4ndCBtYWtlICJwY2FwX3N0YXRzKCkiIHdvcmsgdGhlIHNhbWUgb24gYm90aAorCQkgKiBwbGF0Zm9ybXMsIGJ1dCB0aGUgYmVzdCBhcHByb3hpbWF0aW9uIGlzIHRvIHJldHVybgorCQkgKiAidHBfcGFja2V0cyIgYXMgdGhlIGNvdW50IG9mIHBhY2tldHMgYW5kICJ0cF9kcm9wcyIKKwkJICogYXMgdGhlIGNvdW50IG9mIGRyb3BzLgorCQkgKgorCQkgKiBLZWVwIGEgcnVubmluZyB0b3RhbCBiZWNhdXNlIGVhY2ggY2FsbCB0byAKKwkJICogICAgZ2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfU1RBVElTVElDUywgLi4uLgorCQkgKiByZXNldHMgdGhlIGNvdW50ZXJzIHRvIHplcm8uCisJCSAqLworCQloYW5kbGUtPm1kLnN0YXQucHNfcmVjdiArPSBrc3RhdHMudHBfcGFja2V0czsKKwkJaGFuZGxlLT5tZC5zdGF0LnBzX2Ryb3AgKz0ga3N0YXRzLnRwX2Ryb3BzOworCQkqc3RhdHMgPSBoYW5kbGUtPm1kLnN0YXQ7CisJCXJldHVybiAwOworCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBJZiB0aGUgZXJyb3Igd2FzIEVPUE5PVFNVUFAsIGZhbGwgdGhyb3VnaCwgc28gdGhhdAorCQkgKiBpZiB5b3UgYnVpbGQgdGhlIGxpYnJhcnkgb24gYSBzeXN0ZW0gd2l0aAorCQkgKiAic3RydWN0IHRwYWNrZXRfc3RhdHMiIGFuZCBydW4gaXQgb24gYSBzeXN0ZW0KKwkJICogdGhhdCBkb2Vzbid0LCBpdCB3b3JrcyBhcyBpdCBkb2VzIGlmIHRoZSBsaWJyYXJ5CisJCSAqIGlzIGJ1aWx0IG9uIGEgc3lzdGVtIHdpdGhvdXQgInN0cnVjdCB0cGFja2V0X3N0YXRzIi4KKwkJICovCisJCWlmIChlcnJubyAhPSBFT1BOT1RTVVBQKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAicGNhcF9zdGF0czogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisjZW5kaWYKKwkvKgorCSAqIE9uIHN5c3RlbXMgd2hlcmUgdGhlIFBBQ0tFVF9TVEFUSVNUSUNTICJnZXRzb2Nrb3B0KCkiIGFyZ3VtZW50CisJICogaXMgbm90IHN1cHBvcnRlZCBvbiBQRl9QQUNLRVQgc29ja2V0czoKKwkgKgorCSAqCSJwc19yZWN2IiBjb3VudHMgb25seSBwYWNrZXRzIHRoYXQgKnBhc3NlZCogdGhlIGZpbHRlciwKKwkgKglub3QgcGFja2V0cyB0aGF0IGRpZG4ndCBwYXNzIHRoZSBmaWx0ZXIuICBJdCBkb2VzIG5vdAorCSAqCWNvdW50IHBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIHdlIHJhbiBvdXQgb2YgYnVmZmVyCisJICoJc3BhY2UuCisJICoKKwkgKgkicHNfZHJvcCIgaXMgbm90IHN1cHBvcnRlZC4KKwkgKgorCSAqCSJwc19pZmRyb3AiIGlzIHN1cHBvcnRlZC4gSXQgd2lsbCByZXR1cm4gdGhlIG51bWJlcgorCSAqCW9mIGRyb3BzIHRoZSBpbnRlcmZhY2UgcmVwb3J0cyBpbiAvcHJvYy9uZXQvZGV2LAorCSAqCWlmIHRoYXQgaXMgYXZhaWxhYmxlLgorCSAqCisJICoJInBzX3JlY3YiIGRvZXNuJ3QgaW5jbHVkZSBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tCisJICoJdGhlIGtlcm5lbCBieSBsaWJwY2FwLgorCSAqCisJICogV2UgbWFpbnRhaW4gdGhlIGNvdW50IG9mIHBhY2tldHMgcHJvY2Vzc2VkIGJ5IGxpYnBjYXAgaW4KKwkgKiAibWQucGFja2V0c19yZWFkIiwgZm9yIHJlYXNvbnMgZGVzY3JpYmVkIGluIHRoZSBjb21tZW50CisJICogYXQgdGhlIGVuZCBvZiBwY2FwX3JlYWRfcGFja2V0KCkuICBXZSBoYXZlIG5vIGlkZWEgaG93IG1hbnkKKwkgKiBwYWNrZXRzIHdlcmUgZHJvcHBlZCBieSB0aGUga2VybmVsIGJ1ZmZlcnMgLS0gYnV0IHdlIGtub3cgCisJICogaG93IG1hbnkgdGhlIGludGVyZmFjZSBkcm9wcGVkLCBzbyB3ZSBjYW4gcmV0dXJuIHRoYXQuCisJICovCisJIAorCXN0YXRzLT5wc19yZWN2ID0gaGFuZGxlLT5tZC5wYWNrZXRzX3JlYWQ7CisJc3RhdHMtPnBzX2Ryb3AgPSAwOworCXN0YXRzLT5wc19pZmRyb3AgPSBoYW5kbGUtPm1kLnN0YXQucHNfaWZkcm9wOworCXJldHVybiAwOworfQorCisvKgorICogR2V0IGZyb20gIi9zeXMvY2xhc3MvbmV0IiBhbGwgaW50ZXJmYWNlcyBsaXN0ZWQgdGhlcmU7IGlmIHRoZXkncmUKKyAqIGFscmVhZHkgaW4gdGhlIGxpc3Qgb2YgaW50ZXJmYWNlcyB3ZSBoYXZlLCB0aGF0IHdvbid0IGFkZCBhbm90aGVyCisgKiBpbnN0YW5jZSwgYnV0IGlmIHRoZXkncmUgbm90LCB0aGF0J2xsIGFkZCB0aGVtLgorICoKKyAqIFdlIGRvbid0IGJvdGhlciBnZXR0aW5nIGFueSBhZGRyZXNzZXMgZm9yIHRoZW07IGl0IGFwcGVhcnMgeW91IGNhbid0CisgKiB1c2UgU0lPQ0dJRkFERFIgb24gTGludXggdG8gZ2V0IElQdjYgYWRkcmVzc2VzIGZvciBpbnRlcmZhY2VzLCBhbmQsCisgKiBhbHRob3VnaCBzb21lIG90aGVyIHR5cGVzIG9mIGFkZHJlc3NlcyBjYW4gYmUgZmV0Y2hlZCB3aXRoIFNJT0NHSUZBRERSLAorICogd2UgZG9uJ3QgYm90aGVyIHdpdGggdGhlbSBmb3Igbm93LgorICoKKyAqIFdlIGFsc28gZG9uJ3QgZmFpbCBpZiB3ZSBjb3VsZG4ndCBvcGVuICIvc3lzL2NsYXNzL25ldCI7IHdlIGp1c3QgbGVhdmUKKyAqIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgYXMgaXMsIGFuZCByZXR1cm4gMCwgc28gdGhhdCB3ZSBjYW4gdHJ5CisgKiBzY2FubmluZyAvcHJvYy9uZXQvZGV2LgorICovCitzdGF0aWMgaW50CitzY2FuX3N5c19jbGFzc19uZXQocGNhcF9pZl90ICoqZGV2bGlzdHAsIGNoYXIgKmVycmJ1ZikKK3sKKwlESVIgKnN5c19jbGFzc19uZXRfZDsKKwlpbnQgZmQ7CisJc3RydWN0IGRpcmVudCAqZW50OworCWNoYXIgKnA7CisJY2hhciBuYW1lWzUxMl07CS8qIFhYWCAtIHBpY2sgYSBzaXplICovCisJY2hhciAqcSwgKnNhdmVxOworCXN0cnVjdCBpZnJlcSBpZnJmbGFnczsKKwlpbnQgcmV0ID0gMTsKKworCXN5c19jbGFzc19uZXRfZCA9IG9wZW5kaXIoIi9zeXMvY2xhc3MvbmV0Iik7CisJaWYgKHN5c19jbGFzc19uZXRfZCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIERvbid0IGZhaWwgaWYgaXQgZG9lc24ndCBleGlzdCBhdCBhbGwuCisJCSAqLworCQlpZiAoZXJybm8gPT0gRU5PRU5UKQorCQkJcmV0dXJuICgwKTsKKworCQkvKgorCQkgKiBGYWlsIGlmIHdlIGdvdCBzb21lIG90aGVyIGVycm9yLgorCQkgKi8KKwkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IG9wZW4gL3N5cy9jbGFzcy9uZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSBhIHNvY2tldCBmcm9tIHdoaWNoIHRvIGZldGNoIGludGVyZmFjZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwlmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCSh2b2lkKXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkodm9pZCljbG9zZWRpcihzeXNfY2xhc3NfbmV0X2QpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWVycm5vID0gMDsKKwkJZW50ID0gcmVhZGRpcihzeXNfY2xhc3NfbmV0X2QpOworCQlpZiAoZW50ID09IE5VTEwpIHsKKwkJCS8qCisJCQkgKiBFcnJvciBvciBFT0Y7IGlmIGVycm5vICE9IDAsIGl0J3MgYW4gZXJyb3IuCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogSWdub3JlIGRpcmVjdG9yaWVzICgiLiIsICIuLiIsIGFuZCBhbnkgc3ViZGlyZWN0b3JpZXMpLgorCQkgKi8KKwkJaWYgKGVudC0+ZF90eXBlID09IERUX0RJUikKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEdldCB0aGUgaW50ZXJmYWNlIG5hbWUuCisJCSAqLworCQlwID0gJmVudC0+ZF9uYW1lWzBdOworCQlxID0gJm5hbWVbMF07CisJCXdoaWxlICgqcCAhPSAnXDAnICYmIGlzYXNjaWkoKnApICYmICFpc3NwYWNlKCpwKSkgeworCQkJaWYgKCpwID09ICc6JykgeworCQkJCS8qCisJCQkJICogVGhpcyBjb3VsZCBiZSB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYQorCQkJCSAqIG5hbWUgYW5kIGFuIGFsaWFzIG51bWJlciwgb3IgaXQgY291bGQgYmUKKwkJCQkgKiB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYSBuYW1lIHdpdGggbm8KKwkJCQkgKiBhbGlhcyBudW1iZXIgYW5kIHRoZSBuZXh0IGZpZWxkLgorCQkJCSAqCisJCQkJICogSWYgdGhlcmUncyBhIGNvbG9uIGFmdGVyIGRpZ2l0cywgaXQKKwkJCQkgKiBzZXBhcmF0ZXMgdGhlIG5hbWUgYW5kIHRoZSBhbGlhcyBudW1iZXIsCisJCQkJICogb3RoZXJ3aXNlIGl0IHNlcGFyYXRlcyB0aGUgbmFtZSBhbmQgdGhlCisJCQkJICogbmV4dCBmaWVsZC4KKwkJCQkgKi8KKwkJCQlzYXZlcSA9IHE7CisJCQkJd2hpbGUgKGlzYXNjaWkoKnApICYmIGlzZGlnaXQoKnApKQorCQkJCQkqcSsrID0gKnArKzsKKwkJCQlpZiAoKnAgIT0gJzonKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoYXQgd2FzIHRoZSBuZXh0IGZpZWxkLAorCQkJCQkgKiBub3QgdGhlIGFsaWFzIG51bWJlci4KKwkJCQkJICovCisJCQkJCXEgPSBzYXZlcTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQkqcSsrID0gKnArKzsKKwkJfQorCQkqcSA9ICdcMCc7CisKKwkJLyoKKwkJICogR2V0IHRoZSBmbGFncyBmb3IgdGhpcyBpbnRlcmZhY2UsIGFuZCBza2lwIGl0IGlmCisJCSAqIGl0J3Mgbm90IHVwLgorCQkgKi8KKwkJc3RybmNweShpZnJmbGFncy5pZnJfbmFtZSwgbmFtZSwgc2l6ZW9mKGlmcmZsYWdzLmlmcl9uYW1lKSk7CisJCWlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZnJmbGFncykgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5YSU8gfHwgZXJybm8gPT0gRU5PREVWKQorCQkJCWNvbnRpbnVlOworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJTSU9DR0lGRkxBR1M6ICUuKnM6ICVzIiwKKwkJCSAgICAoaW50KXNpemVvZihpZnJmbGFncy5pZnJfbmFtZSksCisJCQkgICAgaWZyZmxhZ3MuaWZyX25hbWUsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0ID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIShpZnJmbGFncy5pZnJfZmxhZ3MgJiBJRkZfVVApKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogQWRkIGFuIGVudHJ5IGZvciB0aGlzIGludGVyZmFjZSwgd2l0aCBubyBhZGRyZXNzZXMuCisJCSAqLworCQlpZiAocGNhcF9hZGRfaWYoZGV2bGlzdHAsIG5hbWUsIGlmcmZsYWdzLmlmcl9mbGFncywgTlVMTCwKKwkJICAgIGVycmJ1ZikgPT0gLTEpIHsKKwkJCS8qCisJCQkgKiBGYWlsdXJlLgorCQkJICovCisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChyZXQgIT0gLTEpIHsKKwkJLyoKKwkJICogV2VsbCwgd2UgZGlkbid0IGZhaWwgZm9yIGFueSBvdGhlciByZWFzb247IGRpZCB3ZQorCQkgKiBmYWlsIGR1ZSB0byBhbiBlcnJvciByZWFkaW5nIHRoZSBkaXJlY3Rvcnk/CisJCSAqLworCQlpZiAoZXJybm8gIT0gMCkgeworCQkJKHZvaWQpc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJFcnJvciByZWFkaW5nIC9zeXMvY2xhc3MvbmV0OiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0ID0gLTE7CisJCX0KKwl9CisKKwkodm9pZCljbG9zZShmZCk7CisJKHZvaWQpY2xvc2VkaXIoc3lzX2NsYXNzX25ldF9kKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiBHZXQgZnJvbSAiL3Byb2MvbmV0L2RldiIgYWxsIGludGVyZmFjZXMgbGlzdGVkIHRoZXJlOyBpZiB0aGV5J3JlCisgKiBhbHJlYWR5IGluIHRoZSBsaXN0IG9mIGludGVyZmFjZXMgd2UgaGF2ZSwgdGhhdCB3b24ndCBhZGQgYW5vdGhlcgorICogaW5zdGFuY2UsIGJ1dCBpZiB0aGV5J3JlIG5vdCwgdGhhdCdsbCBhZGQgdGhlbS4KKyAqCisgKiBTZWUgY29tbWVudHMgZnJvbSBzY2FuX3N5c19jbGFzc19uZXQoKS4KKyAqLworc3RhdGljIGludAorc2Nhbl9wcm9jX25ldF9kZXYocGNhcF9pZl90ICoqZGV2bGlzdHAsIGNoYXIgKmVycmJ1ZikKK3sKKwlGSUxFICpwcm9jX25ldF9mOworCWludCBmZDsKKwljaGFyIGxpbmVidWZbNTEyXTsKKwlpbnQgbGluZW51bTsKKwljaGFyICpwOworCWNoYXIgbmFtZVs1MTJdOwkvKiBYWFggLSBwaWNrIGEgc2l6ZSAqLworCWNoYXIgKnEsICpzYXZlcTsKKwlzdHJ1Y3QgaWZyZXEgaWZyZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlwcm9jX25ldF9mID0gZm9wZW4oIi9wcm9jL25ldC9kZXYiLCAiciIpOworCWlmIChwcm9jX25ldF9mID09IE5VTEwpIHsKKwkJLyoKKwkJICogRG9uJ3QgZmFpbCBpZiBpdCBkb2Vzbid0IGV4aXN0IGF0IGFsbC4KKwkJICovCisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gKDApOworCisJCS8qCisJCSAqIEZhaWwgaWYgd2UgZ290IHNvbWUgb3RoZXIgZXJyb3IuCisJCSAqLworCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3Qgb3BlbiAvcHJvYy9uZXQvZGV2OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSBzb2NrZXQgZnJvbSB3aGljaCB0byBmZXRjaCBpbnRlcmZhY2UgaW5mb3JtYXRpb24uCisJICovCisJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkIDwgMCkgeworCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAic29ja2V0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKHZvaWQpZmNsb3NlKHByb2NfbmV0X2YpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwlmb3IgKGxpbmVudW0gPSAxOworCSAgICBmZ2V0cyhsaW5lYnVmLCBzaXplb2YgbGluZWJ1ZiwgcHJvY19uZXRfZikgIT0gTlVMTDsgbGluZW51bSsrKSB7CisJCS8qCisJCSAqIFNraXAgdGhlIGZpcnN0IHR3byBsaW5lcyAtIHRoZXkncmUgaGVhZGVycy4KKwkJICovCisJCWlmIChsaW5lbnVtIDw9IDIpCisJCQljb250aW51ZTsKKworCQlwID0gJmxpbmVidWZbMF07CisKKwkJLyoKKwkJICogU2tpcCBsZWFkaW5nIHdoaXRlIHNwYWNlLgorCQkgKi8KKwkJd2hpbGUgKCpwICE9ICdcMCcgJiYgaXNhc2NpaSgqcCkgJiYgaXNzcGFjZSgqcCkpCisJCQlwKys7CisJCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICdcbicpCisJCQljb250aW51ZTsJLyogYmxhbmsgbGluZSAqLworCisJCS8qCisJCSAqIEdldCB0aGUgaW50ZXJmYWNlIG5hbWUuCisJCSAqLworCQlxID0gJm5hbWVbMF07CisJCXdoaWxlICgqcCAhPSAnXDAnICYmIGlzYXNjaWkoKnApICYmICFpc3NwYWNlKCpwKSkgeworCQkJaWYgKCpwID09ICc6JykgeworCQkJCS8qCisJCQkJICogVGhpcyBjb3VsZCBiZSB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYQorCQkJCSAqIG5hbWUgYW5kIGFuIGFsaWFzIG51bWJlciwgb3IgaXQgY291bGQgYmUKKwkJCQkgKiB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYSBuYW1lIHdpdGggbm8KKwkJCQkgKiBhbGlhcyBudW1iZXIgYW5kIHRoZSBuZXh0IGZpZWxkLgorCQkJCSAqCisJCQkJICogSWYgdGhlcmUncyBhIGNvbG9uIGFmdGVyIGRpZ2l0cywgaXQKKwkJCQkgKiBzZXBhcmF0ZXMgdGhlIG5hbWUgYW5kIHRoZSBhbGlhcyBudW1iZXIsCisJCQkJICogb3RoZXJ3aXNlIGl0IHNlcGFyYXRlcyB0aGUgbmFtZSBhbmQgdGhlCisJCQkJICogbmV4dCBmaWVsZC4KKwkJCQkgKi8KKwkJCQlzYXZlcSA9IHE7CisJCQkJd2hpbGUgKGlzYXNjaWkoKnApICYmIGlzZGlnaXQoKnApKQorCQkJCQkqcSsrID0gKnArKzsKKwkJCQlpZiAoKnAgIT0gJzonKSB7CisJCQkJCS8qCisJCQkJCSAqIFRoYXQgd2FzIHRoZSBuZXh0IGZpZWxkLAorCQkJCQkgKiBub3QgdGhlIGFsaWFzIG51bWJlci4KKwkJCQkJICovCisJCQkJCXEgPSBzYXZlcTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9IGVsc2UKKwkJCQkqcSsrID0gKnArKzsKKwkJfQorCQkqcSA9ICdcMCc7CisKKwkJLyoKKwkJICogR2V0IHRoZSBmbGFncyBmb3IgdGhpcyBpbnRlcmZhY2UsIGFuZCBza2lwIGl0IGlmCisJCSAqIGl0J3Mgbm90IHVwLgorCQkgKi8KKwkJc3RybmNweShpZnJmbGFncy5pZnJfbmFtZSwgbmFtZSwgc2l6ZW9mKGlmcmZsYWdzLmlmcl9uYW1lKSk7CisJCWlmIChpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSZpZnJmbGFncykgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5YSU8pCisJCQkJY29udGludWU7CisJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIlNJT0NHSUZGTEFHUzogJS4qczogJXMiLAorCQkJICAgIChpbnQpc2l6ZW9mKGlmcmZsYWdzLmlmcl9uYW1lKSwKKwkJCSAgICBpZnJmbGFncy5pZnJfbmFtZSwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCWlmICghKGlmcmZsYWdzLmlmcl9mbGFncyAmIElGRl9VUCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBBZGQgYW4gZW50cnkgZm9yIHRoaXMgaW50ZXJmYWNlLCB3aXRoIG5vIGFkZHJlc3Nlcy4KKwkJICovCisJCWlmIChwY2FwX2FkZF9pZihkZXZsaXN0cCwgbmFtZSwgaWZyZmxhZ3MuaWZyX2ZsYWdzLCBOVUxMLAorCQkgICAgZXJyYnVmKSA9PSAtMSkgeworCQkJLyoKKwkJCSAqIEZhaWx1cmUuCisJCQkgKi8KKwkJCXJldCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHJldCAhPSAtMSkgeworCQkvKgorCQkgKiBXZWxsLCB3ZSBkaWRuJ3QgZmFpbCBmb3IgYW55IG90aGVyIHJlYXNvbjsgZGlkIHdlCisJCSAqIGZhaWwgZHVlIHRvIGFuIGVycm9yIHJlYWRpbmcgdGhlIGZpbGU/CisJCSAqLworCQlpZiAoZmVycm9yKHByb2NfbmV0X2YpKSB7CisJCQkodm9pZClzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIkVycm9yIHJlYWRpbmcgL3Byb2MvbmV0L2RldjogJXMiLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldCA9IC0xOworCQl9CisJfQorCisJKHZvaWQpY2xvc2UoZmQpOworCSh2b2lkKWZjbG9zZShwcm9jX25ldF9mKTsKKwlyZXR1cm4gKHJldCk7Cit9CisKKy8qCisgKiBEZXNjcmlwdGlvbiBzdHJpbmcgZm9yIHRoZSAiYW55IiBkZXZpY2UuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGFueV9kZXNjcltdID0gIlBzZXVkby1kZXZpY2UgdGhhdCBjYXB0dXJlcyBvbiBhbGwgaW50ZXJmYWNlcyI7CisKK2ludAorcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIFJlYWQgIi9zeXMvY2xhc3MvbmV0IiwgYW5kIGFkZCB0byB0aGUgbGlzdCBvZiBpbnRlcmZhY2VzIGFsbAorCSAqIGludGVyZmFjZXMgbGlzdGVkIHRoZXJlIHRoYXQgd2UgZG9uJ3QgYWxyZWFkeSBoYXZlLCBiZWNhdXNlLAorCSAqIG9uIExpbnV4LCBTSU9DR0lGQ09ORiByZXBvcnRzIG9ubHkgaW50ZXJmYWNlcyB3aXRoIElQdjQgYWRkcmVzc2VzLAorCSAqIGFuZCBldmVuIGdldGlmYWRkcnMoKSB3b24ndCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKKwkgKiBpbnRlcmZhY2VzIHdpdGggbm8gYWRkcmVzc2VzLCBzbyB5b3UgbmVlZCB0byByZWFkICIvc3lzL2NsYXNzL25ldCIKKwkgKiB0byBnZXQgdGhlIG5hbWVzIG9mIHRoZSByZXN0IG9mIHRoZSBpbnRlcmZhY2VzLgorCSAqLworCXJldCA9IHNjYW5fc3lzX2NsYXNzX25ldChhbGxkZXZzcCwgZXJyYnVmKTsKKwlpZiAocmV0ID09IC0xKQorCQlyZXR1cm4gKC0xKTsJLyogZmFpbGVkICovCisJaWYgKHJldCA9PSAwKSB7CisJCS8qCisJCSAqIE5vIC9zeXMvY2xhc3MvbmV0OyB0cnkgcmVhZGluZyAvcHJvYy9uZXQvZGV2IGluc3RlYWQuCisJCSAqLworCQlpZiAoc2Nhbl9wcm9jX25ldF9kZXYoYWxsZGV2c3AsIGVycmJ1ZikgPT0gLTEpCisJCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIEFkZCB0aGUgImFueSIgZGV2aWNlLgorCSAqLworCWlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgImFueSIsIDAsIGFueV9kZXNjciwgZXJyYnVmKSA8IDApCisJCXJldHVybiAoLTEpOworCisjaWZkZWYgSEFWRV9EQUdfQVBJCisJLyoKKwkgKiBBZGQgREFHIGRldmljZXMuCisJICovCisJaWYgKGRhZ19wbGF0Zm9ybV9maW5kZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSA8IDApCisJCXJldHVybiAoLTEpOworI2VuZGlmIC8qIEhBVkVfREFHX0FQSSAqLworCisjaWZkZWYgSEFWRV9TRVBURUxfQVBJCisJLyoKKwkgKiBBZGQgU2VwdGVsIGRldmljZXMuCisJICovCisJaWYgKHNlcHRlbF9wbGF0Zm9ybV9maW5kZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSA8IDApCisJCXJldHVybiAoLTEpOworI2VuZGlmIC8qIEhBVkVfU0VQVEVMX0FQSSAqLworCisjaWZkZWYgSEFWRV9TTkZfQVBJCisJaWYgKHNuZl9wbGF0Zm9ybV9maW5kZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSA8IDApCisJCXJldHVybiAoLTEpOworI2VuZGlmIC8qIEhBVkVfU05GX0FQSSAqLworCisjaWZkZWYgUENBUF9TVVBQT1JUX0JUCisJLyoKKwkgKiBBZGQgQmx1ZXRvb3RoIGRldmljZXMuCisJICovCisJaWYgKGJ0X3BsYXRmb3JtX2ZpbmRkZXZzKGFsbGRldnNwLCBlcnJidWYpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisjZW5kaWYKKworI2lmZGVmIFBDQVBfU1VQUE9SVF9VU0IKKwkvKgorCSAqIEFkZCBVU0IgZGV2aWNlcy4KKwkgKi8KKwlpZiAodXNiX3BsYXRmb3JtX2ZpbmRkZXZzKGFsbGRldnNwLCBlcnJidWYpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisjZW5kaWYKKworI2lmZGVmIFBDQVBfU1VQUE9SVF9ORVRGSUxURVIKKwkvKgorCSAqIEFkZCBuZXRmaWx0ZXIgZGV2aWNlcy4KKwkgKi8KKwlpZiAobmV0ZmlsdGVyX3BsYXRmb3JtX2ZpbmRkZXZzKGFsbGRldnNwLCBlcnJidWYpIDwgMCkKKwkJcmV0dXJuICgtMSk7CisjZW5kaWYKKworI2lmIFBDQVBfU1VQUE9SVF9DQU5VU0IKKyAgaWYgKGNhbnVzYl9wbGF0Zm9ybV9maW5kZGV2cyhhbGxkZXZzcCwgZXJyYnVmKSA8IDApCisgICAgcmV0dXJuICgtMSk7CisjZW5kaWYKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiAgQXR0YWNoIHRoZSBnaXZlbiBCUEYgY29kZSB0byB0aGUgcGFja2V0IGNhcHR1cmUgZGV2aWNlLgorICovCitzdGF0aWMgaW50CitwY2FwX3NldGZpbHRlcl9saW51eF9jb21tb24ocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZmlsdGVyLAorICAgIGludCBpc19tbWFwcGVkKQoreworI2lmZGVmIFNPX0FUVEFDSF9GSUxURVIKKwlzdHJ1Y3Qgc29ja19mcHJvZwlmY29kZTsKKwlpbnQJCQljYW5fZmlsdGVyX2luX2tlcm5lbDsKKwlpbnQJCQllcnIgPSAwOworI2VuZGlmCisKKwlpZiAoIWhhbmRsZSkKKwkJcmV0dXJuIC0xOworCWlmICghZmlsdGVyKSB7CisJICAgICAgICBzdHJuY3B5KGhhbmRsZS0+ZXJyYnVmLCAic2V0ZmlsdGVyOiBObyBmaWx0ZXIgc3BlY2lmaWVkIiwKKwkJCVBDQVBfRVJSQlVGX1NJWkUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogTWFrZSBvdXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBmaWx0ZXIgKi8KKworCWlmIChpbnN0YWxsX2JwZl9wcm9ncmFtKGhhbmRsZSwgZmlsdGVyKSA8IDApCisJCS8qIGluc3RhbGxfYnBmX3Byb2dyYW0oKSBmaWxsZWQgaW4gZXJyYnVmICovCisJCXJldHVybiAtMTsKKworCS8qCisJICogUnVuIHVzZXIgbGV2ZWwgcGFja2V0IGZpbHRlciBieSBkZWZhdWx0LiBXaWxsIGJlIG92ZXJyaWRlbiBpZgorCSAqIGluc3RhbGxpbmcgYSBrZXJuZWwgZmlsdGVyIHN1Y2NlZWRzLgorCSAqLworCWhhbmRsZS0+bWQudXNlX2JwZiA9IDA7CisKKwkvKiBJbnN0YWxsIGtlcm5lbCBsZXZlbCBmaWx0ZXIgaWYgcG9zc2libGUgKi8KKworI2lmZGVmIFNPX0FUVEFDSF9GSUxURVIKKyNpZmRlZiBVU0hSVF9NQVgKKwlpZiAoaGFuZGxlLT5mY29kZS5iZl9sZW4gPiBVU0hSVF9NQVgpIHsKKwkJLyoKKwkJICogZmNvZGUubGVuIGlzIGFuIHVuc2lnbmVkIHNob3J0IGZvciBjdXJyZW50IGtlcm5lbC4KKwkJICogSSBoYXZlIHlldCB0byBzZWUgQlBGLUNvZGUgd2l0aCB0aGF0IG11Y2gKKwkJICogaW5zdHJ1Y3Rpb25zIGJ1dCBzdGlsbCBpdCBpcyBwb3NzaWJsZS4gU28gZm9yIHRoZQorCQkgKiBzYWtlIG9mIGNvcnJlY3RuZXNzIEkgYWRkZWQgdGhpcyBjaGVjay4KKwkJICovCisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogRmlsdGVyIHRvbyBjb21wbGV4IGZvciBrZXJuZWxcbiIpOworCQlmY29kZS5sZW4gPSAwOworCQlmY29kZS5maWx0ZXIgPSBOVUxMOworCQljYW5fZmlsdGVyX2luX2tlcm5lbCA9IDA7CisJfSBlbHNlCisjZW5kaWYgLyogVVNIUlRfTUFYICovCisJeworCQkvKgorCQkgKiBPaCBqb3ksIHRoZSBMaW51eCBrZXJuZWwgdXNlcyBzdHJ1Y3Qgc29ja19mcHJvZyBpbnN0ZWFkCisJCSAqIG9mIHN0cnVjdCBicGZfcHJvZ3JhbSBhbmQgb2YgY291cnNlIHRoZSBsZW5ndGggZmllbGQgaXMKKwkJICogb2YgZGlmZmVyZW50IHNpemUuIFBvaW50ZWQgb3V0IGJ5IFNlYmFzdGlhbgorCQkgKgorCQkgKiBPaCwgYW5kIHdlIGFsc28gbmVlZCB0byBmaXggaXQgdXAgc28gdGhhdCBhbGwgInJldCIKKwkJICogaW5zdHJ1Y3Rpb25zIHdpdGggbm9uLXplcm8gb3BlcmFuZHMgaGF2ZSA2NTUzNSBhcyB0aGUKKwkJICogb3BlcmFuZCBpZiB3ZSdyZSBub3QgY2FwdHVyaW5nIGluIG1lbW9yeS1tYXBwZWQgbW9kZWUsCisJCSAqIGFuZCBzbyB0aGF0LCBpZiB3ZSdyZSBpbiBjb29rZWQgbW9kZSwgYWxsIG1lbW9yeS1yZWZlcmVuY2UKKwkJICogaW5zdHJ1Y3Rpb25zIHVzZSBzcGVjaWFsIG1hZ2ljIG9mZnNldHMgaW4gcmVmZXJlbmNlcyB0bworCQkgKiB0aGUgbGluay1sYXllciBoZWFkZXIgYW5kIGFzc3VtZSB0aGF0IHRoZSBsaW5rLWxheWVyCisJCSAqIHBheWxvYWQgYmVnaW5zIGF0IDA7ICJmaXhfcHJvZ3JhbSgpIiB3aWxsIGRvIHRoYXQuCisJCSAqLworCQlzd2l0Y2ggKGZpeF9wcm9ncmFtKGhhbmRsZSwgJmZjb2RlLCBpc19tbWFwcGVkKSkgeworCisJCWNhc2UgLTE6CisJCWRlZmF1bHQ6CisJCQkvKgorCQkJICogRmF0YWwgZXJyb3I7IGp1c3QgcXVpdC4KKwkJCSAqIChUaGUgImRlZmF1bHQiIGNhc2Ugc2hvdWxkbid0IGhhcHBlbjsgd2UKKwkJCSAqIHJldHVybiAtMSBmb3IgdGhhdCByZWFzb24uKQorCQkJICovCisJCQlyZXR1cm4gLTE7CisKKwkJY2FzZSAwOgorCQkJLyoKKwkJCSAqIFRoZSBwcm9ncmFtIHBlcmZvcm1lZCBjaGVja3MgdGhhdCB3ZSBjYW4ndCBtYWtlCisJCQkgKiB3b3JrIGluIHRoZSBrZXJuZWwuCisJCQkgKi8KKwkJCWNhbl9maWx0ZXJfaW5fa2VybmVsID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgMToKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgZmlsdGVyIHRoYXQnbGwgd29yayBpbiB0aGUga2VybmVsLgorCQkJICovCisJCQljYW5fZmlsdGVyX2luX2tlcm5lbCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogTk9URTogYXQgdGhpcyBwb2ludCwgd2UndmUgc2V0IGJvdGggdGhlICJsZW4iIGFuZCAiZmlsdGVyIgorCSAqIGZpZWxkcyBvZiAiZmNvZGUiLiAgQXMgb2YgdGhlIDIuNi4zMi40IGtlcm5lbCwgYXQgbGVhc3QsCisJICogdGhvc2UgYXJlIHRoZSBvbmx5IG1lbWJlcnMgb2YgdGhlICJzb2NrX2Zwcm9nIiBzdHJ1Y3R1cmUsCisJICogc28gd2UgaW5pdGlhbGl6ZSBldmVyeSBtZW1iZXIgb2YgdGhhdCBzdHJ1Y3R1cmUuCisJICoKKwkgKiBJZiB0aGVyZSBpcyBhbnl0aGluZyBpbiAiZmNvZGUiIHRoYXQgaXMgbm90IGluaXRpYWxpemVkLAorCSAqIGl0IGlzIGVpdGhlciBhIGZpZWxkIGFkZGVkIGluIGEgbGF0ZXIga2VybmVsLCBvciBpdCdzCisJICogcGFkZGluZy4KKwkgKgorCSAqIElmIGEgbmV3IGZpZWxkIGlzIGFkZGVkLCB0aGlzIGNvZGUgbmVlZHMgdG8gYmUgdXBkYXRlZAorCSAqIHRvIHNldCBpdCBjb3JyZWN0bHkuCisJICoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgZmllbGRzLCB0aGVuOgorCSAqCisJICoJaWYgdGhlIExpbnV4IGtlcm5lbCBsb29rcyBhdCB0aGUgcGFkZGluZywgaXQncworCSAqCWJ1Z2d5OworCSAqCisJICoJaWYgdGhlIExpbnV4IGtlcm5lbCBkb2Vzbid0IGxvb2sgYXQgdGhlIHBhZGRpbmcsCisJICoJdGhlbiBpZiBzb21lIHRvb2wgY29tcGxhaW5zIHRoYXQgd2UncmUgcGFzc2luZworCSAqCXVuaW5pdGlhbGl6ZWQgZGF0YSB0byB0aGUga2VybmVsLCB0aGVuIHRoZSB0b29sCisJICoJaXMgYnVnZ3kgYW5kIG5lZWRzIHRvIHVuZGVyc3RhbmQgdGhhdCBpdCdzIGp1c3QKKwkgKglwYWRkaW5nLgorCSAqLworCWlmIChjYW5fZmlsdGVyX2luX2tlcm5lbCkgeworCQlpZiAoKGVyciA9IHNldF9rZXJuZWxfZmlsdGVyKGhhbmRsZSwgJmZjb2RlKSkgPT0gMCkKKwkJeworCQkJLyogSW5zdGFsbGF0aW9uIHN1Y2NlZGVkIC0gdXNpbmcga2VybmVsIGZpbHRlci4gKi8KKwkJCWhhbmRsZS0+bWQudXNlX2JwZiA9IDE7CisJCX0KKwkJZWxzZSBpZiAoZXJyID09IC0xKQkvKiBOb24tZmF0YWwgZXJyb3IgKi8KKwkJeworCQkJLyoKKwkJCSAqIFByaW50IGEgd2FybmluZyBpZiB3ZSB3ZXJlbid0IGFibGUgdG8gaW5zdGFsbAorCQkJICogdGhlIGZpbHRlciBmb3IgYSByZWFzb24gb3RoZXIgdGhhbiAidGhpcyBrZXJuZWwKKwkJCSAqIGlzbid0IGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCBzb2NrZXQgZmlsdGVycy4KKwkJCSAqLworCQkJaWYgKGVycm5vICE9IEVOT1BST1RPT1BUICYmIGVycm5vICE9IEVPUE5PVFNVUFApIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkgICAgIldhcm5pbmc6IEtlcm5lbCBmaWx0ZXIgZmFpbGVkOiAlc1xuIiwKKwkJCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSdyZSBub3QgdXNpbmcgdGhlIGtlcm5lbCBmaWx0ZXIsIGdldCByaWQgb2YgYW55IGtlcm5lbAorCSAqIGZpbHRlciB0aGF0IG1pZ2h0J3ZlIGJlZW4gdGhlcmUgYmVmb3JlLCBlLmcuIGJlY2F1c2UgdGhlCisJICogcHJldmlvdXMgZmlsdGVyIGNvdWxkIHdvcmsgaW4gdGhlIGtlcm5lbCwgb3IgYmVjYXVzZSBzb21lIG90aGVyCisJICogY29kZSBhdHRhY2hlZCBhIGZpbHRlciB0byB0aGUgc29ja2V0IGJ5IHNvbWUgbWVhbnMgb3RoZXIgdGhhbgorCSAqIGNhbGxpbmcgInBjYXBfc2V0ZmlsdGVyKCkiLiAgT3RoZXJ3aXNlLCB0aGUga2VybmVsIGZpbHRlciBtYXkKKwkgKiBmaWx0ZXIgb3V0IHBhY2tldHMgdGhhdCB3b3VsZCBwYXNzIHRoZSBuZXcgdXNlcmxhbmQgZmlsdGVyLgorCSAqLworCWlmICghaGFuZGxlLT5tZC51c2VfYnBmKQorCQlyZXNldF9rZXJuZWxfZmlsdGVyKGhhbmRsZSk7CisKKwkvKgorCSAqIEZyZWUgdXAgdGhlIGNvcHkgb2YgdGhlIGZpbHRlciB0aGF0IHdhcyBtYWRlIGJ5ICJmaXhfcHJvZ3JhbSgpIi4KKwkgKi8KKwlpZiAoZmNvZGUuZmlsdGVyICE9IE5VTEwpCisJCWZyZWUoZmNvZGUuZmlsdGVyKTsKKworCWlmIChlcnIgPT0gLTIpCisJCS8qIEZhdGFsIGVycm9yICovCisJCXJldHVybiAtMTsKKyNlbmRpZiAvKiBTT19BVFRBQ0hfRklMVEVSICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGNhcF9zZXRmaWx0ZXJfbGludXgocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZmlsdGVyKQoreworCXJldHVybiBwY2FwX3NldGZpbHRlcl9saW51eF9jb21tb24oaGFuZGxlLCBmaWx0ZXIsIDApOworfQorCisKKy8qCisgKiBTZXQgZGlyZWN0aW9uIGZsYWc6IFdoaWNoIHBhY2tldHMgZG8gd2UgYWNjZXB0IG9uIGEgZm9yd2FyZGluZworICogc2luZ2xlIGRldmljZT8gSU4sIE9VVCBvciBib3RoPworICovCitzdGF0aWMgaW50CitwY2FwX3NldGRpcmVjdGlvbl9saW51eChwY2FwX3QgKmhhbmRsZSwgcGNhcF9kaXJlY3Rpb25fdCBkKQoreworI2lmZGVmIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKKwlpZiAoIWhhbmRsZS0+bWQuc29ja19wYWNrZXQpIHsKKwkJaGFuZGxlLT5kaXJlY3Rpb24gPSBkOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwkvKgorCSAqIFdlJ3JlIG5vdCB1c2luZyBQRl9QQUNLRVQgc29ja2V0cywgc28gd2UgY2FuJ3QgZGV0ZXJtaW5lCisJICogdGhlIGRpcmVjdGlvbiBvZiB0aGUgcGFja2V0LgorCSAqLworCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiU2V0dGluZyBkaXJlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBTT0NLX1BBQ0tFVCBzb2NrZXRzIik7CisJcmV0dXJuIC0xOworfQorCisjaWZkZWYgSEFWRV9QRl9QQUNLRVRfU09DS0VUUworLyoKKyAqIE1hcCB0aGUgUEFDS0VUXyB2YWx1ZSB0byBhIExJTlVYX1NMTF8gdmFsdWU7IHdlCisgKiB3YW50IHRoZSBzYW1lIG51bWVyaWNhbCB2YWx1ZSB0byBiZSB1c2VkIGluCisgKiB0aGUgbGluay1sYXllciBoZWFkZXIgZXZlbiBpZiB0aGUgbnVtZXJpY2FsIHZhbHVlcworICogZm9yIHRoZSBQQUNLRVRfICNkZWZpbmVzIGNoYW5nZSwgc28gdGhhdCBwcm9ncmFtcworICogdGhhdCBsb29rIGF0IHRoZSBwYWNrZXQgdHlwZSBmaWVsZCB3aWxsIGFsd2F5cyBiZQorICogYWJsZSB0byBoYW5kbGUgRExUX0xJTlVYX1NMTCBjYXB0dXJlcy4KKyAqLworc3RhdGljIHNob3J0IGludAorbWFwX3BhY2tldF90eXBlX3RvX3NsbF90eXBlKHNob3J0IGludCBzbGxfcGt0dHlwZSkKK3sKKwlzd2l0Y2ggKHNsbF9wa3R0eXBlKSB7CisKKwljYXNlIFBBQ0tFVF9IT1NUOgorCQlyZXR1cm4gaHRvbnMoTElOVVhfU0xMX0hPU1QpOworCisJY2FzZSBQQUNLRVRfQlJPQURDQVNUOgorCQlyZXR1cm4gaHRvbnMoTElOVVhfU0xMX0JST0FEQ0FTVCk7CisKKwljYXNlIFBBQ0tFVF9NVUxUSUNBU1Q6CisJCXJldHVybiAgaHRvbnMoTElOVVhfU0xMX01VTFRJQ0FTVCk7CisKKwljYXNlIFBBQ0tFVF9PVEhFUkhPU1Q6CisJCXJldHVybiBodG9ucyhMSU5VWF9TTExfT1RIRVJIT1NUKTsKKworCWNhc2UgUEFDS0VUX09VVEdPSU5HOgorCQlyZXR1cm4gaHRvbnMoTElOVVhfU0xMX09VVEdPSU5HKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9Cit9CisjZW5kaWYKKworLyoKKyAqICBMaW51eCB1c2VzIHRoZSBBUlAgaGFyZHdhcmUgdHlwZSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBhbgorICogIGludGVyZmFjZS4gcGNhcCB1c2VzIHRoZSBETFRfeHh4IGNvbnN0YW50cyBmb3IgdGhpcy4gVGhpcworICogIGZ1bmN0aW9uIHRha2VzIGEgcG9pbnRlciB0byBhICJwY2FwX3QiLCBhbmQgYW4gQVJQSFJEX3h4eAorICogIGNvbnN0YW50LCBhcyBhcmd1bWVudHMsIGFuZCBzZXRzICJoYW5kbGUtPmxpbmt0eXBlIiB0byB0aGUKKyAqICBhcHByb3ByaWF0ZSBETFRfWFhYIGNvbnN0YW50IGFuZCBzZXRzICJoYW5kbGUtPm9mZnNldCIgdG8KKyAqICB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgKHRvIG1ha2UgImhhbmRsZS0+b2Zmc2V0IiBwbHVzIGxpbmstbGF5ZXIKKyAqICBoZWFkZXIgbGVuZ3RoIGJlIGEgbXVsdGlwbGUgb2YgNCwgc28gdGhhdCB0aGUgbGluay1sYXllciBwYXlsb2FkCisgKiAgd2lsbCBiZSBhbGlnbmVkIG9uIGEgNC1ieXRlIGJvdW5kYXJ5IHdoZW4gY2FwdHVyaW5nIHBhY2tldHMpLgorICogIChJZiB0aGUgb2Zmc2V0IGlzbid0IHNldCBoZXJlLCBpdCdsbCBiZSAwOyBhZGQgY29kZSBhcyBhcHByb3ByaWF0ZQorICogIGZvciBjYXNlcyB3aGVyZSBpdCBzaG91bGRuJ3QgYmUgMC4pCisgKgorICogIElmICJjb29rZWRfb2siIGlzIG5vbi16ZXJvLCB3ZSBjYW4gdXNlIERMVF9MSU5VWF9TTEwgYW5kIGNhcHR1cmUKKyAqICBpbiBjb29rZWQgbW9kZTsgb3RoZXJ3aXNlLCB3ZSBjYW4ndCB1c2UgY29va2VkIG1vZGUsIHNvIHdlIGhhdmUKKyAqICB0byBwaWNrIHNvbWUgdHlwZSB0aGF0IHdvcmtzIGluIHJhdyBtb2RlLCBvciBmYWlsLgorICoKKyAqICBTZXRzIHRoZSBsaW5rIHR5cGUgdG8gLTEgaWYgdW5hYmxlIHRvIG1hcCB0aGUgdHlwZS4KKyAqLworc3RhdGljIHZvaWQgbWFwX2FycGhyZF90b19kbHQocGNhcF90ICpoYW5kbGUsIGludCBhcnB0eXBlLCBpbnQgY29va2VkX29rKQoreworCXN3aXRjaCAoYXJwdHlwZSkgeworCisJY2FzZSBBUlBIUkRfRVRIRVI6CisJCS8qCisJCSAqIFRoaXMgaXMgKHByZXN1bWFibHkpIGEgcmVhbCBFdGhlcm5ldCBjYXB0dXJlOyBnaXZlIGl0IGEKKwkJICogbGluay1sYXllci10eXBlIGxpc3Qgd2l0aCBETFRfRU4xME1CIGFuZCBETFRfRE9DU0lTLCBzbworCQkgKiB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiBsZXQgeW91IGNob29zZSBpdCwgaW4gY2FzZSB5b3UncmUKKwkJICogY2FwdHVyaW5nIERPQ1NJUyB0cmFmZmljIHRoYXQgYSBDaXNjbyBDYWJsZSBNb2RlbQorCQkgKiBUZXJtaW5hdGlvbiBTeXN0ZW0gaXMgcHV0dGluZyBvdXQgb250byBhbiBFdGhlcm5ldCAoaXQKKwkJICogZG9lc24ndCBwdXQgYW4gRXRoZXJuZXQgaGVhZGVyIG9udG8gdGhlIHdpcmUsIGl0IHB1dHMgcmF3CisJCSAqIERPQ1NJUyBmcmFtZXMgb3V0IG9uIHRoZSB3aXJlIGluc2lkZSB0aGUgbG93LWxldmVsCisJCSAqIEV0aGVybmV0IGZyYW1pbmcpLgorCQkgKgorCQkgKiBYWFggLSBhcmUgdGhlcmUgYW55IHNvcnRzIG9mICJmYWtlIEV0aGVybmV0IiB0aGF0IGhhdmUKKwkJICogQVJQSFJEX0VUSEVSIGJ1dCB0aGF0ICpzaG91bGRuJ3Qgb2ZmZXIgRExUX0RPQ1NJUyBhcworCQkgKiBhIENpc2NvIENNVFMgd29uJ3QgcHV0IHRyYWZmaWMgb250byBpdCBvciBnZXQgdHJhZmZpYworCQkgKiBicmlkZ2VkIG9udG8gaXQ/ICBJU0ROIGlzIGhhbmRsZWQgaW4gImFjdGl2YXRlX25ldygpIiwKKwkJICogYXMgd2UgZmFsbCBiYWNrIG9uIGNvb2tlZCBtb2RlIHRoZXJlOyBhcmUgdGhlcmUgYW55CisJCSAqIG90aGVycz8KKwkJICovCisJCWhhbmRsZS0+ZGx0X2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKKwkJLyoKKwkJICogSWYgdGhhdCBmYWlscywganVzdCBsZWF2ZSB0aGUgbGlzdCBlbXB0eS4KKwkJICovCisJCWlmIChoYW5kbGUtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJCWhhbmRsZS0+ZGx0X2xpc3RbMF0gPSBETFRfRU4xME1COworCQkJaGFuZGxlLT5kbHRfbGlzdFsxXSA9IERMVF9ET0NTSVM7CisJCQloYW5kbGUtPmRsdF9jb3VudCA9IDI7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKworCWNhc2UgQVJQSFJEX01FVFJJQ09NOgorCWNhc2UgQVJQSFJEX0xPT1BCQUNLOgorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0VOMTBNQjsKKwkJaGFuZGxlLT5vZmZzZXQgPSAyOworCQlicmVhazsKKworCWNhc2UgQVJQSFJEX0VFVEhFUjoKKwkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9FTjNNQjsKKwkJYnJlYWs7CisKKwljYXNlIEFSUEhSRF9BWDI1OgorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0FYMjVfS0lTUzsKKwkJYnJlYWs7CisKKwljYXNlIEFSUEhSRF9QUk9ORVQ6CisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfUFJPTkVUOworCQlicmVhazsKKworCWNhc2UgQVJQSFJEX0NIQU9TOgorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0NIQU9TOworCQlicmVhazsKKyNpZm5kZWYgQVJQSFJEX0NBTgorI2RlZmluZSBBUlBIUkRfQ0FOIDI4MAorI2VuZGlmCisJY2FzZSBBUlBIUkRfQ0FOOgorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0NBTl9TT0NLRVRDQU47CisJCWJyZWFrOworCisjaWZuZGVmIEFSUEhSRF9JRUVFODAyX1RSCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyX1RSIDgwMAkvKiBGcm9tIExpbnV4IDIuNCAqLworI2VuZGlmCisJY2FzZSBBUlBIUkRfSUVFRTgwMl9UUjoKKwljYXNlIEFSUEhSRF9JRUVFODAyOgorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0lFRUU4MDI7CisJCWhhbmRsZS0+b2Zmc2V0ID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIEFSUEhSRF9BUkNORVQ6CisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfQVJDTkVUX0xJTlVYOworCQlicmVhazsKKworI2lmbmRlZiBBUlBIUkRfRkRESQkvKiBGcm9tIExpbnV4IDIuMi4xMyAqLworI2RlZmluZSBBUlBIUkRfRkRESQk3NzQKKyNlbmRpZgorCWNhc2UgQVJQSFJEX0ZEREk6CisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfRkRESTsKKwkJaGFuZGxlLT5vZmZzZXQgPSAzOworCQlicmVhazsKKworI2lmbmRlZiBBUlBIUkRfQVRNICAvKiBGSVhNRTogSG93IHRvICNpbmNsdWRlIHRoaXM/ICovCisjZGVmaW5lIEFSUEhSRF9BVE0gMTkKKyNlbmRpZgorCWNhc2UgQVJQSFJEX0FUTToKKwkJLyoKKwkJICogVGhlIENsYXNzaWNhbCBJUCBpbXBsZW1lbnRhdGlvbiBpbiBBVE0gZm9yIExpbnV4CisJCSAqIHN1cHBvcnRzIGJvdGggd2hhdCBSRkMgMTQ4MyBjYWxscyAiTExDIEVuY2Fwc3VsYXRpb24iLAorCQkgKiBpbiB3aGljaCBlYWNoIHBhY2tldCBoYXMgYW4gTExDIGhlYWRlciwgcG9zc2libHkKKwkJICogd2l0aCBhIFNOQVAgaGVhZGVyIGFzIHdlbGwsIHByZXBlbmRlZCB0byBpdCwgYW5kCisJCSAqIHdoYXQgUkZDIDE0ODMgY2FsbHMgIlZDIEJhc2VkIE11bHRpcGxleGluZyIsIGluIHdoaWNoCisJCSAqIGRpZmZlcmVudCB2aXJ0dWFsIGNpcmN1aXRzIGNhcnJ5IGRpZmZlcmVudCBuZXR3b3JrCisJCSAqIGxheWVyIHByb3RvY29scywgYW5kIG5vIGhlYWRlciBpcyBwcmVwZW5kZWQgdG8gcGFja2V0cy4KKwkJICoKKwkJICogVGhleSBib3RoIGhhdmUgYW4gQVJQSFJEXyB0eXBlIG9mIEFSUEhSRF9BVE0sIHNvCisJCSAqIHlvdSBjYW4ndCB1c2UgdGhlIEFSUEhSRF8gdHlwZSB0byBmaW5kIG91dCB3aGV0aGVyCisJCSAqIGNhcHR1cmVkIHBhY2tldHMgd2lsbCBoYXZlIGFuIExMQyBoZWFkZXIsIGFuZCwKKwkJICogd2hpbGUgdGhlcmUncyBhIHNvY2tldCBpb2N0bCB0byAqc2V0KiB0aGUgZW5jYXBzdWxhdGlvbgorCQkgKiB0eXBlLCB0aGVyZSdzIG5vIGlvY3RsIHRvICpnZXQqIHRoZSBlbmNhcHN1bGF0aW9uIHR5cGUuCisJCSAqCisJCSAqIFRoaXMgbWVhbnMgdGhhdAorCQkgKgorCQkgKglwcm9ncmFtcyB0aGF0IGRpc3NlY3QgTGludXggQ2xhc3NpY2FsIElQIGZyYW1lcworCQkgKgl3b3VsZCBoYXZlIHRvIGNoZWNrIGZvciBhbiBMTEMgaGVhZGVyIGFuZCwKKwkJICoJZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhleSBzZWUgb25lIG9yIG5vdCwgZGlzc2VjdAorCQkgKgl0aGUgZnJhbWUgYXMgTExDLWVuY2Fwc3VsYXRlZCBvciBhcyByYXcgSVAgKEkKKwkJICoJZG9uJ3Qga25vdyB3aGV0aGVyIHRoZXJlJ3MgYW55IHRyYWZmaWMgb3RoZXIgdGhhbgorCQkgKglJUCB0aGF0IHdvdWxkIHNob3cgdXAgb24gdGhlIHNvY2tldCwgb3Igd2hldGhlcgorCQkgKgl0aGVyZSdzIGFueSBzdXBwb3J0IGZvciBJUHY2IGluIHRoZSBMaW51eAorCQkgKglDbGFzc2ljYWwgSVAgY29kZSk7CisJCSAqCisJCSAqCWZpbHRlciBleHByZXNzaW9ucyB3b3VsZCBoYXZlIHRvIGNvbXBpbGUgaW50bworCQkgKgljb2RlIHRoYXQgY2hlY2tzIGZvciBhbiBMTEMgaGVhZGVyIGFuZCBkb2VzCisJCSAqCXRoZSByaWdodCB0aGluZy4KKwkJICoKKwkJICogQm90aCBvZiB0aG9zZSBhcmUgYSBudWlzYW5jZSAtIGFuZCwgYXQgbGVhc3Qgb24gc3lzdGVtcworCQkgKiB0aGF0IHN1cHBvcnQgUEZfUEFDS0VUIHNvY2tldHMsIHdlIGRvbid0IGhhdmUgdG8gcHV0CisJCSAqIHVwIHdpdGggdGhvc2UgbnVpc2FuY2VzOyBpbnN0ZWFkLCB3ZSBjYW4ganVzdCBjYXB0dXJlCisJCSAqIGluIGNvb2tlZCBtb2RlLiAgVGhhdCdzIHdoYXQgd2UnbGwgZG8sIGlmIHdlIGNhbi4KKwkJICogT3RoZXJ3aXNlLCB3ZSdsbCBqdXN0IGZhaWwuCisJCSAqLworCQlpZiAoY29va2VkX29rKQorCQkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9MSU5VWF9TTEw7CisJCWVsc2UKKwkJCWhhbmRsZS0+bGlua3R5cGUgPSAtMTsKKwkJYnJlYWs7CisKKyNpZm5kZWYgQVJQSFJEX0lFRUU4MDIxMSAgLyogRnJvbSBMaW51eCAyLjQuNiAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExIDgwMQorI2VuZGlmCisJY2FzZSBBUlBIUkRfSUVFRTgwMjExOgorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0lFRUU4MDJfMTE7CisJCWJyZWFrOworCisjaWZuZGVmIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gIC8qIEZyb20gTGludXggMi40LjE4ICovCisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTFfUFJJU00gODAyCisjZW5kaWYKKwljYXNlIEFSUEhSRF9JRUVFODAyMTFfUFJJU006CisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfUFJJU01fSEVBREVSOworCQlicmVhazsKKworI2lmbmRlZiBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQIC8qIG5ldyAqLworI2RlZmluZSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQIDgwMworI2VuZGlmCisJY2FzZSBBUlBIUkRfSUVFRTgwMjExX1JBRElPVEFQOgorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0lFRUU4MDJfMTFfUkFESU87CisJCWJyZWFrOworCisJY2FzZSBBUlBIUkRfUFBQOgorCQkvKgorCQkgKiBTb21lIFBQUCBjb2RlIGluIHRoZSBrZXJuZWwgc3VwcGxpZXMgbm8gbGluay1sYXllcgorCQkgKiBoZWFkZXIgd2hhdHNvZXZlciB0byBQRl9QQUNLRVQgc29ja2V0czsgb3RoZXIgUFBQCisJCSAqIGNvZGUgc3VwcGxpZXMgUFBQIGxpbmstbGF5ZXIgaGVhZGVycyAoInN5bmNwcHAuYyIpOworCQkgKiBzb21lIFBQUCBjb2RlIG1pZ2h0IHN1cHBseSByYW5kb20gbGluay1sYXllcgorCQkgKiBoZWFkZXJzIChQUFAgb3ZlciBJU0ROIC0gdGhlcmUncyBjb2RlIGluIEV0aGVyZWFsLAorCQkgKiBmb3IgZXhhbXBsZSwgdG8gY29wZSB3aXRoIFBQUC1vdmVyLUlTRE4gY2FwdHVyZXMKKwkJICogd2l0aCB3aGljaCB0aGUgRXRoZXJlYWwgZGV2ZWxvcGVycyBoYXZlIGhhZCB0byBjb3BlLAorCQkgKiBoZXVyaXN0aWNhbGx5IHRyeWluZyB0byBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlCisJCSAqIG9kZGJhbGwgbGluay1sYXllciBoZWFkZXJzIHBhcnRpY3VsYXIgcGFja2V0cyBoYXZlKS4KKwkJICoKKwkJICogQXMgc3VjaCwgd2UganVzdCBwdW50LCBhbmQgcnVuIGFsbCBQUFAgaW50ZXJmYWNlcworCQkgKiBpbiBjb29rZWQgbW9kZSwgaWYgd2UgY2FuOyBvdGhlcndpc2UsIHdlIGp1c3QgdHJlYXQKKwkJICogaXQgYXMgRExUX1JBVywgZm9yIG5vdyAtIGlmIHNvbWVib2R5IG5lZWRzIHRvIGNhcHR1cmUsCisJCSAqIG9uIGEgMi4wWy54XSBrZXJuZWwsIG9uIFBQUCBkZXZpY2VzIHRoYXQgc3VwcGx5IGEKKwkJICogbGluay1sYXllciBoZWFkZXIsIHRoZXknbGwgaGF2ZSB0byBhZGQgY29kZSBoZXJlIHRvCisJCSAqIG1hcCB0byB0aGUgYXBwcm9wcmlhdGUgRExUXyB0eXBlIChwb3NzaWJseSBhZGRpbmcgYQorCQkgKiBuZXcgRExUXyB0eXBlLCBpZiBuZWNlc3NhcnkpLgorCQkgKi8KKwkJaWYgKGNvb2tlZF9vaykKKwkJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfTElOVVhfU0xMOworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBYWFggLSBoYW5kbGUgSVNETiB0eXBlcyBoZXJlPyAgV2UgY2FuJ3QgZmFsbAorCQkJICogYmFjayBvbiBjb29rZWQgc29ja2V0cywgc28gd2UnZCBoYXZlIHRvCisJCQkgKiBmaWd1cmUgb3V0IGZyb20gdGhlIGRldmljZSBuYW1lIHdoYXQgdHlwZSBvZgorCQkJICogbGluay1sYXllciBlbmNhcHN1bGF0aW9uIGl0J3MgdXNpbmcsIGFuZCBtYXAKKwkJCSAqIHRoYXQgdG8gYW4gYXBwcm9wcmlhdGUgRExUXyB2YWx1ZSwgbWVhbmluZworCQkJICogd2UnZCBtYXAgImlzZG5OIiBkZXZpY2VzIHRvIERMVF9SQVcgKHRoZXkKKwkJCSAqIHN1cHBseSByYXcgSVAgcGFja2V0cyB3aXRoIG5vIGxpbmstbGF5ZXIKKwkJCSAqIGhlYWRlcikgYW5kICJpc2RZIiBkZXZpY2VzIHRvIGEgbmV3IERMVF9JNExfSVAKKwkJCSAqIHR5cGUgdGhhdCBoYXMgb25seSBhbiBFdGhlcm5ldCBwYWNrZXQgdHlwZSBhcworCQkJICogYSBsaW5rLWxheWVyIGhlYWRlci4KKwkJCSAqCisJCQkgKiBCdXQgc29tZXRpbWVzIHdlIHNlZW0gdG8gZ2V0IHJhbmRvbSBjcmFwCisJCQkgKiBpbiB0aGUgbGluay1sYXllciBoZWFkZXIgd2hlbiBjYXB0dXJpbmcgb24KKwkJCSAqIElTRE4gZGV2aWNlcy4uLi4KKwkJCSAqLworCQkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9SQVc7CisJCX0KKwkJYnJlYWs7CisKKyNpZm5kZWYgQVJQSFJEX0NJU0NPCisjZGVmaW5lIEFSUEhSRF9DSVNDTyA1MTMgLyogcHJldmlvdXNseSBBUlBIUkRfSERMQyAqLworI2VuZGlmCisJY2FzZSBBUlBIUkRfQ0lTQ086CisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfQ19IRExDOworCQlicmVhazsKKworCS8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCBmb3IgYWxsIHR1bm5lbHMsIGJ1dCBpdAorCSAqIHdvcmtzIGZvciBDSVBFICovCisJY2FzZSBBUlBIUkRfVFVOTkVMOgorI2lmbmRlZiBBUlBIUkRfU0lUCisjZGVmaW5lIEFSUEhSRF9TSVQgNzc2CS8qIEZyb20gTGludXggMi4yLjEzICovCisjZW5kaWYKKwljYXNlIEFSUEhSRF9TSVQ6CisJY2FzZSBBUlBIUkRfQ1NMSVA6CisJY2FzZSBBUlBIUkRfU0xJUDY6CisJY2FzZSBBUlBIUkRfQ1NMSVA2OgorCWNhc2UgQVJQSFJEX0FEQVBUOgorCWNhc2UgQVJQSFJEX1NMSVA6CisjaWZuZGVmIEFSUEhSRF9SQVdIRExDCisjZGVmaW5lIEFSUEhSRF9SQVdIRExDIDUxOAorI2VuZGlmCisJY2FzZSBBUlBIUkRfUkFXSERMQzoKKyNpZm5kZWYgQVJQSFJEX0RMQ0kKKyNkZWZpbmUgQVJQSFJEX0RMQ0kgMTUKKyNlbmRpZgorCWNhc2UgQVJQSFJEX0RMQ0k6CisJCS8qCisJCSAqIFhYWCAtIHNob3VsZCBzb21lIG9mIHRob3NlIGJlIG1hcHBlZCB0byBETFRfTElOVVhfU0xMCisJCSAqIGluc3RlYWQ/ICBTaG91bGQgd2UganVzdCBtYXAgYWxsIG9mIHRoZW0gdG8gRExUX0xJTlVYX1NMTD8KKwkJICovCisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfUkFXOworCQlicmVhazsKKworI2lmbmRlZiBBUlBIUkRfRlJBRAorI2RlZmluZSBBUlBIUkRfRlJBRCA3NzAKKyNlbmRpZgorCWNhc2UgQVJQSFJEX0ZSQUQ6CisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfRlJFTEFZOworCQlicmVhazsKKworCWNhc2UgQVJQSFJEX0xPQ0FMVExLOgorCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0xUQUxLOworCQlicmVhazsKKworI2lmbmRlZiBBUlBIUkRfRkNQUAorI2RlZmluZSBBUlBIUkRfRkNQUAk3ODQKKyNlbmRpZgorCWNhc2UgQVJQSFJEX0ZDUFA6CisjaWZuZGVmIEFSUEhSRF9GQ0FMCisjZGVmaW5lIEFSUEhSRF9GQ0FMCTc4NQorI2VuZGlmCisJY2FzZSBBUlBIUkRfRkNBTDoKKyNpZm5kZWYgQVJQSFJEX0ZDUEwKKyNkZWZpbmUgQVJQSFJEX0ZDUEwJNzg2CisjZW5kaWYKKwljYXNlIEFSUEhSRF9GQ1BMOgorI2lmbmRlZiBBUlBIUkRfRkNGQUJSSUMKKyNkZWZpbmUgQVJQSFJEX0ZDRkFCUklDCTc4NworI2VuZGlmCisJY2FzZSBBUlBIUkRfRkNGQUJSSUM6CisJCS8qCisJCSAqIFdlIGFzc3VtZSB0aGF0IHRob3NlIGFsbCBtZWFuIFJGQyAyNjI1IElQLW92ZXItCisJCSAqIEZpYnJlIENoYW5uZWwsIHdpdGggdGhlIFJGQyAyNjI1IGhlYWRlciBhdAorCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQuCisJCSAqLworCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0lQX09WRVJfRkM7CisJCWJyZWFrOworCisjaWZuZGVmIEFSUEhSRF9JUkRBCisjZGVmaW5lIEFSUEhSRF9JUkRBCTc4MworI2VuZGlmCisJY2FzZSBBUlBIUkRfSVJEQToKKwkJLyogRG9uJ3QgZXhwZWN0IElQIHBhY2tldCBvdXQgb2YgdGhpcyBpbnRlcmZhY2VzLi4uICovCisJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfTElOVVhfSVJEQTsKKwkJLyogV2UgbmVlZCB0byBzYXZlIHBhY2tldCBkaXJlY3Rpb24gZm9yIElyREEgZGVjb2RpbmcsCisJCSAqIHNvIGxldCdzIHVzZSAiTGludXgtY29va2VkIiBtb2RlLiBKZWFuIElJICovCisJCS8vaGFuZGxlLT5tZC5jb29rZWQgPSAxOworCQlicmVhazsKKworCS8qIEFSUEhSRF9MQVBEIGlzIHVub2ZmaWNpYWwgYW5kIHJhbmRvbWx5IGFsbG9jYXRlZCwgaWYgcmVhbGxvY2F0aW9uCisJICogaXMgbmVlZGVkLCBwbGVhc2UgcmVwb3J0IGl0IHRvIDxkYW5pZWxlQG9ybGFuZGkuY29tPiAqLworI2lmbmRlZiBBUlBIUkRfTEFQRAorI2RlZmluZSBBUlBIUkRfTEFQRAk4NDQ1CisjZW5kaWYKKwljYXNlIEFSUEhSRF9MQVBEOgorCQkvKiBEb24ndCBleHBlY3QgSVAgcGFja2V0IG91dCBvZiB0aGlzIGludGVyZmFjZXMuLi4gKi8KKwkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9MSU5VWF9MQVBEOworCQlicmVhazsKKworI2lmbmRlZiBBUlBIUkRfTk9ORQorI2RlZmluZSBBUlBIUkRfTk9ORQkweEZGRkUKKyNlbmRpZgorCWNhc2UgQVJQSFJEX05PTkU6CisJCS8qCisJCSAqIE5vIGxpbmstbGF5ZXIgaGVhZGVyOyBwYWNrZXRzIGFyZSBqdXN0IElQCisJCSAqIHBhY2tldHMsIHNvIHVzZSBETFRfUkFXLgorCQkgKi8KKwkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9SQVc7CisJCWJyZWFrOworCisjaWZuZGVmIEFSUEhSRF9JRUVFODAyMTU0CisjZGVmaW5lIEFSUEhSRF9JRUVFODAyMTU0ICAgICAgODA0CisjZW5kaWYKKyAgICAgICBjYXNlIEFSUEhSRF9JRUVFODAyMTU0OgorICAgICAgICAgICAgICAgaGFuZGxlLT5saW5rdHlwZSA9ICBETFRfSUVFRTgwMl8xNV80X05PRkNTOworICAgICAgICAgICAgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCQloYW5kbGUtPmxpbmt0eXBlID0gLTE7CisJCWJyZWFrOworCX0KK30KKworLyogPT09PT0gRnVuY3Rpb25zIHRvIGludGVyZmFjZSB0byB0aGUgbmV3ZXIga2VybmVscyA9PT09PT09PT09PT09PT09PT0gKi8KKworLyoKKyAqIFRyeSB0byBvcGVuIGEgcGFja2V0IHNvY2tldCB1c2luZyB0aGUgbmV3IGtlcm5lbCBQRl9QQUNLRVQgaW50ZXJmYWNlLgorICogUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAgb24gYW4gZXJyb3IgdGhhdCBtZWFucyB0aGUgbmV3IGludGVyZmFjZSBpc24ndAorICogcHJlc2VudCAoc28gdGhlIG9sZCBTT0NLX1BBQ0tFVCBpbnRlcmZhY2Ugc2hvdWxkIGJlIHRyaWVkKSwgYW5kIGEKKyAqIFBDQVBfRVJST1JfIHZhbHVlIG9uIGFuIGVycm9yIHRoYXQgbWVhbnMgdGhhdCB0aGUgb2xkIG1lY2hhbmlzbSB3b24ndAorICogd29yayBlaXRoZXIgKHNvIGl0IHNob3VsZG4ndCBiZSB0cmllZCkuCisgKi8KK3N0YXRpYyBpbnQKK2FjdGl2YXRlX25ldyhwY2FwX3QgKmhhbmRsZSkKK3sKKyNpZmRlZiBIQVZFX1BGX1BBQ0tFVF9TT0NLRVRTCisJY29uc3QgY2hhcgkJKmRldmljZSA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKKwlpbnQJCQlpc19hbnlfZGV2aWNlID0gKHN0cmNtcChkZXZpY2UsICJhbnkiKSA9PSAwKTsKKwlpbnQJCQlzb2NrX2ZkID0gLTEsIGFycHR5cGU7CisjaWZkZWYgSEFWRV9QQUNLRVRfQVVYREFUQQorCWludAkJCXZhbDsKKyNlbmRpZgorCWludAkJCWVyciA9IDA7CisJc3RydWN0IHBhY2tldF9tcmVxCW1yOworCisJLyoKKwkgKiBPcGVuIGEgc29ja2V0IHdpdGggcHJvdG9jb2wgZmFtaWx5IHBhY2tldC4gSWYgdGhlCisJICogImFueSIgZGV2aWNlIHdhcyBzcGVjaWZpZWQsIHdlIG9wZW4gYSBTT0NLX0RHUkFNCisJICogc29ja2V0IGZvciB0aGUgY29va2VkIGludGVyZmFjZSwgb3RoZXJ3aXNlIHdlIGZpcnN0CisJICogdHJ5IGEgU09DS19SQVcgc29ja2V0IGZvciB0aGUgcmF3IGludGVyZmFjZS4KKwkgKi8KKwlzb2NrX2ZkID0gaXNfYW55X2RldmljZSA/CisJCXNvY2tldChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIGh0b25zKEVUSF9QX0FMTCkpIDoKKwkJc29ja2V0KFBGX1BBQ0tFVCwgU09DS19SQVcsIGh0b25zKEVUSF9QX0FMTCkpOworCisJaWYgKHNvY2tfZmQgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFQUZOT1NVUFBPUlQpIHsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCBzdXBwb3J0IFBGX1BBQ0tFVC9TT0NLX3doYXRldmVyCisJCQkgKiBzb2NrZXRzOyB0cnkgdGhlIG9sZCBtZWNoYW5pc20uCisJCQkgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzb2NrZXQ6ICVzIiwKKwkJCSBwY2FwX3N0cmVycm9yKGVycm5vKSApOworCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKSB7CisJCQkvKgorCQkJICogWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIHRoZQorCQkJICogc29ja2V0LgorCQkJICovCisJCQlyZXR1cm4gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBPdGhlciBlcnJvci4KKwkJCSAqLworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKwl9CisKKwkvKiBJdCBzZWVtcyB0aGUga2VybmVsIHN1cHBvcnRzIHRoZSBuZXcgaW50ZXJmYWNlLiAqLworCWhhbmRsZS0+bWQuc29ja19wYWNrZXQgPSAwOworCisJLyoKKwkgKiBHZXQgdGhlIGludGVyZmFjZSBpbmRleCBvZiB0aGUgbG9vcGJhY2sgZGV2aWNlLgorCSAqIElmIHRoZSBhdHRlbXB0IGZhaWxzLCBkb24ndCBmYWlsLCBqdXN0IHNldCB0aGUKKwkgKiAibWQubG9faWZpbmRleCIgdG8gLTEuCisJICoKKwkgKiBYWFggLSBjYW4gdGhlcmUgYmUgbW9yZSB0aGFuIG9uZSBkZXZpY2UgdGhhdCBsb29wcworCSAqIHBhY2tldHMgYmFjaywgaS5lLiBkZXZpY2VzIG90aGVyIHRoYW4gImxvIj8gIElmIHNvLAorCSAqIHdlJ2QgbmVlZCB0byBmaW5kIHRoZW0gYWxsLCBhbmQgaGF2ZSBhbiBhcnJheSBvZgorCSAqIGluZGljZXMgZm9yIHRoZW0sIGFuZCBjaGVjayBhbGwgb2YgdGhlbSBpbgorCSAqICJwY2FwX3JlYWRfcGFja2V0KCkiLgorCSAqLworCWhhbmRsZS0+bWQubG9faWZpbmRleCA9IGlmYWNlX2dldF9pZChzb2NrX2ZkLCAibG8iLCBoYW5kbGUtPmVycmJ1Zik7CisKKwkvKgorCSAqIERlZmF1bHQgdmFsdWUgZm9yIG9mZnNldCB0byBhbGlnbiBsaW5rLWxheWVyIHBheWxvYWQKKwkgKiBvbiBhIDQtYnl0ZSBib3VuZGFyeS4KKwkgKi8KKwloYW5kbGUtPm9mZnNldAkgPSAwOworCisJLyoKKwkgKiBXaGF0IGtpbmQgb2YgZnJhbWVzIGRvIHdlIGhhdmUgdG8gZGVhbCB3aXRoPyBGYWxsIGJhY2sKKwkgKiB0byBjb29rZWQgbW9kZSBpZiB3ZSBoYXZlIGFuIHVua25vd24gaW50ZXJmYWNlIHR5cGUKKwkgKiBvciBhIHR5cGUgd2Uga25vdyBkb2Vzbid0IHdvcmsgd2VsbCBpbiByYXcgbW9kZS4KKwkgKi8KKwlpZiAoIWlzX2FueV9kZXZpY2UpIHsKKwkJLyogQXNzdW1lIGZvciBub3cgd2UgZG9uJ3QgbmVlZCBjb29rZWQgbW9kZS4gKi8KKwkJaGFuZGxlLT5tZC5jb29rZWQgPSAwOworCisJCWlmIChoYW5kbGUtPm9wdC5yZm1vbikgeworCQkJLyoKKwkJCSAqIFdlIHdlcmUgYXNrZWQgdG8gdHVybiBvbiBtb25pdG9yIG1vZGUuCisJCQkgKiBEbyBzbyBiZWZvcmUgd2UgZ2V0IHRoZSBsaW5rLWxheWVyIHR5cGUsCisJCQkgKiBiZWNhdXNlIGVudGVyaW5nIG1vbml0b3IgbW9kZSBjb3VsZCBjaGFuZ2UKKwkJCSAqIHRoZSBsaW5rLWxheWVyIHR5cGUuCisJCQkgKi8KKwkJCWVyciA9IGVudGVyX3JmbW9uX21vZGUoaGFuZGxlLCBzb2NrX2ZkLCBkZXZpY2UpOworCQkJaWYgKGVyciA8IDApIHsKKwkJCQkvKiBIYXJkIGZhaWx1cmUgKi8KKwkJCQljbG9zZShzb2NrX2ZkKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJaWYgKGVyciA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBOb3RoaW5nIHdvcmtlZCBmb3IgdHVybmluZyBtb25pdG9yIG1vZGUKKwkJCQkgKiBvbi4KKwkJCQkgKi8KKwkJCQljbG9zZShzb2NrX2ZkKTsKKwkJCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCQl9CisKKwkJCS8qCisJCQkgKiBFaXRoZXIgbW9uaXRvciBtb2RlIGhhcyBiZWVuIHR1cm5lZCBvbiBmb3IKKwkJCSAqIHRoZSBkZXZpY2UsIG9yIHdlJ3ZlIGJlZW4gZ2l2ZW4gYSBkaWZmZXJlbnQKKwkJCSAqIGRldmljZSB0byBvcGVuIGZvciBtb25pdG9yIG1vZGUuICBJZiB3ZSd2ZQorCQkJICogYmVlbiBnaXZlbiBhIGRpZmZlcmVudCBkZXZpY2UsIHVzZSBpdC4KKwkJCSAqLworCQkJaWYgKGhhbmRsZS0+bWQubW9uZGV2aWNlICE9IE5VTEwpCisJCQkJZGV2aWNlID0gaGFuZGxlLT5tZC5tb25kZXZpY2U7CisJCX0KKwkJYXJwdHlwZQk9IGlmYWNlX2dldF9hcnB0eXBlKHNvY2tfZmQsIGRldmljZSwgaGFuZGxlLT5lcnJidWYpOworCQlpZiAoYXJwdHlwZSA8IDApIHsKKwkJCWNsb3NlKHNvY2tfZmQpOworCQkJcmV0dXJuIGFycHR5cGU7CisJCX0KKwkJbWFwX2FycGhyZF90b19kbHQoaGFuZGxlLCBhcnB0eXBlLCAxKTsKKwkJaWYgKGhhbmRsZS0+bGlua3R5cGUgPT0gLTEgfHwKKwkJICAgIGhhbmRsZS0+bGlua3R5cGUgPT0gRExUX0xJTlVYX1NMTCB8fAorCQkgICAgaGFuZGxlLT5saW5rdHlwZSA9PSBETFRfTElOVVhfSVJEQSB8fAorCQkgICAgaGFuZGxlLT5saW5rdHlwZSA9PSBETFRfTElOVVhfTEFQRCB8fAorCQkgICAgKGhhbmRsZS0+bGlua3R5cGUgPT0gRExUX0VOMTBNQiAmJgorCQkgICAgIChzdHJuY21wKCJpc2RuIiwgZGV2aWNlLCA0KSA9PSAwIHx8CisJCSAgICAgIHN0cm5jbXAoImlzZFkiLCBkZXZpY2UsIDQpID09IDApKSkgeworCQkJLyoKKwkJCSAqIFVua25vd24gaW50ZXJmYWNlIHR5cGUgKC0xKSwgb3IgYQorCQkJICogZGV2aWNlIHdlIGV4cGxpY2l0bHkgY2hvc2UgdG8gcnVuCisJCQkgKiBpbiBjb29rZWQgbW9kZSAoZS5nLiwgUFBQIGRldmljZXMpLAorCQkJICogb3IgYW4gSVNETiBkZXZpY2UgKHdob3NlIGxpbmstbGF5ZXIKKwkJCSAqIHR5cGUgd2UgY2FuIG9ubHkgZGV0ZXJtaW5lIGJ5IHVzaW5nCisJCQkgKiBBUElzIHRoYXQgbWF5IGJlIGRpZmZlcmVudCBvbiBkaWZmZXJlbnQKKwkJCSAqIGtlcm5lbHMpIC0gcmVvcGVuIGluIGNvb2tlZCBtb2RlLgorCQkJICovCisJCQlpZiAoY2xvc2Uoc29ja19mZCkgPT0gLTEpIHsKKwkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkJICJjbG9zZTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQl9CisJCQlzb2NrX2ZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwKKwkJCSAgICBodG9ucyhFVEhfUF9BTEwpKTsKKwkJCWlmIChzb2NrX2ZkID09IC0xKSB7CisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCWlmIChlcnJubyA9PSBFUEVSTSB8fCBlcnJubyA9PSBFQUNDRVMpIHsKKwkJCQkJLyoKKwkJCQkJICogWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0bworCQkJCQkgKiBvcGVuIHRoZSBzb2NrZXQuCisJCQkJCSAqLworCQkJCQlyZXR1cm4gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKKwkJCQl9IGVsc2UgeworCQkJCQkvKgorCQkJCQkgKiBPdGhlciBlcnJvci4KKwkJCQkJICovCisJCQkJCXJldHVybiBQQ0FQX0VSUk9SOworCQkJCX0KKwkJCX0KKwkJCWhhbmRsZS0+bWQuY29va2VkID0gMTsKKworCQkJLyoKKwkJCSAqIEdldCByaWQgb2YgYW55IGxpbmstbGF5ZXIgdHlwZSBsaXN0CisJCQkgKiB3ZSBhbGxvY2F0ZWQgLSB0aGlzIG9ubHkgc3VwcG9ydHMgY29va2VkCisJCQkgKiBjYXB0dXJlLgorCQkJICovCisJCQlpZiAoaGFuZGxlLT5kbHRfbGlzdCAhPSBOVUxMKSB7CisJCQkJZnJlZShoYW5kbGUtPmRsdF9saXN0KTsKKwkJCQloYW5kbGUtPmRsdF9saXN0ID0gTlVMTDsKKwkJCQloYW5kbGUtPmRsdF9jb3VudCA9IDA7CisJCQl9CisKKwkJCWlmIChoYW5kbGUtPmxpbmt0eXBlID09IC0xKSB7CisJCQkJLyoKKwkJCQkgKiBXYXJuIHRoYXQgd2UncmUgZmFsbGluZyBiYWNrIG9uCisJCQkJICogY29va2VkIG1vZGU7IHdlIG1heSB3YW50IHRvCisJCQkJICogdXBkYXRlICJtYXBfYXJwaHJkX3RvX2RsdCgpIgorCQkJCSAqIHRvIGhhbmRsZSB0aGUgbmV3IHR5cGUuCisJCQkJICovCisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSJhcnB0eXBlICVkIG5vdCAiCisJCQkJCSJzdXBwb3J0ZWQgYnkgbGlicGNhcCAtICIKKwkJCQkJImZhbGxpbmcgYmFjayB0byBjb29rZWQgIgorCQkJCQkic29ja2V0IiwKKwkJCQkJYXJwdHlwZSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJckRBIGNhcHR1cmUgaXMgbm90IGEgcmVhbCAiY29va2VkIiBjYXB0dXJlLAorCQkJICogaXQncyBJckxBUCBmcmFtZXMsIG5vdCBJUCBwYWNrZXRzLiAgVGhlCisJCQkgKiBzYW1lIGFwcGxpZXMgdG8gTEFQRCBjYXB0dXJlLgorCQkJICovCisJCQlpZiAoaGFuZGxlLT5saW5rdHlwZSAhPSBETFRfTElOVVhfSVJEQSAmJgorCQkJICAgIGhhbmRsZS0+bGlua3R5cGUgIT0gRExUX0xJTlVYX0xBUEQpCisJCQkJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9MSU5VWF9TTEw7CisJCX0KKworCQloYW5kbGUtPm1kLmlmaW5kZXggPSBpZmFjZV9nZXRfaWQoc29ja19mZCwgZGV2aWNlLAorCQkgICAgaGFuZGxlLT5lcnJidWYpOworCQlpZiAoaGFuZGxlLT5tZC5pZmluZGV4ID09IC0xKSB7CisJCQljbG9zZShzb2NrX2ZkKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisKKwkJaWYgKChlcnIgPSBpZmFjZV9iaW5kKHNvY2tfZmQsIGhhbmRsZS0+bWQuaWZpbmRleCwKKwkJICAgIGhhbmRsZS0+ZXJyYnVmKSkgIT0gMSkgeworCQkgICAgCWNsb3NlKHNvY2tfZmQpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gMDsJLyogdHJ5IG9sZCBtZWNoYW5pc20gKi8KKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSAiYW55IiBkZXZpY2UuCisJCSAqLworCQlpZiAoaGFuZGxlLT5vcHQucmZtb24pIHsKKwkJCS8qCisJCQkgKiBJdCBkb2Vzbid0IHN1cHBvcnQgbW9uaXRvciBtb2RlLgorCQkJICovCisJCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCX0KKworCQkvKgorCQkgKiBJdCB1c2VzIGNvb2tlZCBtb2RlLgorCQkgKi8KKwkJaGFuZGxlLT5tZC5jb29rZWQgPSAxOworCQloYW5kbGUtPmxpbmt0eXBlID0gRExUX0xJTlVYX1NMTDsKKworCQkvKgorCQkgKiBXZSdyZSBub3QgYm91bmQgdG8gYSBkZXZpY2UuCisJCSAqIEZvciBub3csIHdlJ3JlIHVzaW5nIHRoaXMgYXMgYW4gaW5kaWNhdGlvbgorCQkgKiB0aGF0IHdlIGNhbid0IHRyYW5zbWl0OyBzdG9wIGRvaW5nIHRoYXQgb25seQorCQkgKiBpZiB3ZSBmaWd1cmUgb3V0IGhvdyB0byB0cmFuc21pdCBpbiBjb29rZWQKKwkJICogbW9kZS4KKwkJICovCisJCWhhbmRsZS0+bWQuaWZpbmRleCA9IC0xOworCX0KKworCS8qCisJICogU2VsZWN0IHByb21pc2N1b3VzIG1vZGUgb24gaWYgInByb21pc2MiIGlzIHNldC4KKwkgKgorCSAqIERvIG5vdCB0dXJuIGFsbG11bHRpIG1vZGUgb24gaWYgd2UgZG9uJ3Qgc2VsZWN0CisJICogcHJvbWlzY3VvdXMgbW9kZSAtIG9uIHNvbWUgZGV2aWNlcyAoZS5nLiwgT3Jpbm9jbworCSAqIHdpcmVsZXNzIGludGVyZmFjZXMpLCBhbGxtdWx0aSBtb2RlIGlzbid0IHN1cHBvcnRlZAorCSAqIGFuZCB0aGUgZHJpdmVyIGltcGxlbWVudHMgaXQgYnkgdHVybmluZyBwcm9taXNjdW91cworCSAqIG1vZGUgb24sIGFuZCB0aGF0IHNjcmV3cyB1cCB0aGUgb3BlcmF0aW9uIG9mIHRoZQorCSAqIGNhcmQgYXMgYSBub3JtYWwgbmV0d29ya2luZyBpbnRlcmZhY2UsIGFuZCBvbiBubworCSAqIG90aGVyIHBsYXRmb3JtIEkga25vdyBvZiBkb2VzIHN0YXJ0aW5nIGEgbm9uLQorCSAqIHByb21pc2N1b3VzIGNhcHR1cmUgYWZmZWN0IHdoaWNoIG11bHRpY2FzdCBwYWNrZXRzCisJICogYXJlIHJlY2VpdmVkIGJ5IHRoZSBpbnRlcmZhY2UuCisJICovCisKKwkvKgorCSAqIEhtbSwgaG93IGNhbiB3ZSBzZXQgcHJvbWlzY3VvdXMgbW9kZSBvbiBhbGwgaW50ZXJmYWNlcz8KKwkgKiBJIGFtIG5vdCBzdXJlIGlmIHRoYXQgaXMgcG9zc2libGUgYXQgYWxsLiAgRm9yIG5vdywgd2UKKwkgKiBzaWxlbnRseSBpZ25vcmUgYXR0ZW1wdHMgdG8gdHVybiBwcm9taXNjdW91cyBtb2RlIG9uCisJICogZm9yIHRoZSAiYW55IiBkZXZpY2UgKHNvIHlvdSBkb24ndCBoYXZlIHRvIGV4cGxpY2l0bHkKKwkgKiBkaXNhYmxlIGl0IGluIHByb2dyYW1zIHN1Y2ggYXMgdGNwZHVtcCkuCisJICovCisKKwlpZiAoIWlzX2FueV9kZXZpY2UgJiYgaGFuZGxlLT5vcHQucHJvbWlzYykgeworCQltZW1zZXQoJm1yLCAwLCBzaXplb2YobXIpKTsKKwkJbXIubXJfaWZpbmRleCA9IGhhbmRsZS0+bWQuaWZpbmRleDsKKwkJbXIubXJfdHlwZSAgICA9IFBBQ0tFVF9NUl9QUk9NSVNDOworCQlpZiAoc2V0c29ja29wdChzb2NrX2ZkLCBTT0xfUEFDS0VULCBQQUNLRVRfQUREX01FTUJFUlNISVAsCisJCSAgICAmbXIsIHNpemVvZihtcikpID09IC0xKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkic2V0c29ja29wdDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQljbG9zZShzb2NrX2ZkKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisJfQorCisJLyogRW5hYmxlIGF1eGlsbGFyeSBkYXRhIGlmIHN1cHBvcnRlZCBhbmQgcmVzZXJ2ZSByb29tIGZvcgorCSAqIHJlY29uc3RydWN0aW5nIFZMQU4gaGVhZGVycy4gKi8KKyNpZmRlZiBIQVZFX1BBQ0tFVF9BVVhEQVRBCisJdmFsID0gMTsKKwlpZiAoc2V0c29ja29wdChzb2NrX2ZkLCBTT0xfUEFDS0VULCBQQUNLRVRfQVVYREFUQSwgJnZhbCwKKwkJICAgICAgIHNpemVvZih2YWwpKSA9PSAtMSAmJiBlcnJubyAhPSBFTk9QUk9UT09QVCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAic2V0c29ja29wdDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlKHNvY2tfZmQpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisJaGFuZGxlLT5vZmZzZXQgKz0gVkxBTl9UQUdfTEVOOworI2VuZGlmIC8qIEhBVkVfUEFDS0VUX0FVWERBVEEgKi8KKworCS8qCisJICogVGhpcyBpcyBhIDIuMlsueF0gb3IgbGF0ZXIga2VybmVsICh3ZSBrbm93IHRoYXQKKwkgKiBiZWNhdXNlIHdlJ3JlIG5vdCB1c2luZyBhIFNPQ0tfUEFDS0VUIHNvY2tldCAtCisJICogUEZfUEFDS0VUIGlzIHN1cHBvcnRlZCBvbmx5IGluIDIuMiBhbmQgbGF0ZXIKKwkgKiBrZXJuZWxzKS4KKwkgKgorCSAqIFdlIGNhbiBzYWZlbHkgcGFzcyAicmVjdmZyb20oKSIgYSBieXRlIGNvdW50CisJICogYmFzZWQgb24gdGhlIHNuYXBzaG90IGxlbmd0aC4KKwkgKgorCSAqIElmIHdlJ3JlIGluIGNvb2tlZCBtb2RlLCBtYWtlIHRoZSBzbmFwc2hvdCBsZW5ndGgKKwkgKiBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhICJjb29rZWQgbW9kZSIgaGVhZGVyIHBsdXMKKwkgKiAxIGJ5dGUgb2YgcGFja2V0IGRhdGEgKHNvIHdlIGRvbid0IHBhc3MgYSBieXRlCisJICogY291bnQgb2YgMCB0byAicmVjdmZyb20oKSIpLgorCSAqLworCWlmIChoYW5kbGUtPm1kLmNvb2tlZCkgeworCQlpZiAoaGFuZGxlLT5zbmFwc2hvdCA8IFNMTF9IRFJfTEVOICsgMSkKKwkJCWhhbmRsZS0+c25hcHNob3QgPSBTTExfSERSX0xFTiArIDE7CisJfQorCWhhbmRsZS0+YnVmc2l6ZSA9IGhhbmRsZS0+c25hcHNob3Q7CisKKwkvKiBTYXZlIHRoZSBzb2NrZXQgRkQgaW4gdGhlIHBjYXAgc3RydWN0dXJlICovCisJaGFuZGxlLT5mZCA9IHNvY2tfZmQ7CisKKwlyZXR1cm4gMTsKKyNlbHNlCisJc3RybmNweShlYnVmLAorCQkiTmV3IHBhY2tldCBjYXB0dXJpbmcgaW50ZXJmYWNlIG5vdCBzdXBwb3J0ZWQgYnkgYnVpbGQgIgorCQkiZW52aXJvbm1lbnQiLCBQQ0FQX0VSUkJVRl9TSVpFKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCisjaWZkZWYgSEFWRV9QQUNLRVRfUklORworLyoKKyAqIEF0dGVtcHQgdG8gYWN0aXZhdGUgd2l0aCBtZW1vcnktbWFwcGVkIGFjY2Vzcy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIDEsIGFuZCBzZXRzICpzdGF0dXMgdG8gMCBpZiB0aGVyZSBhcmUgbm8gd2FybmluZ3MKKyAqIG9yIHRvIGEgUENBUF9XQVJOSU5HXyBjb2RlIGlmIHRoZXJlIGlzIGEgd2FybmluZy4KKyAqCisgKiBPbiBmYWlsdXJlIGR1ZSB0byBsYWNrIG9mIHN1cHBvcnQgZm9yIG1lbW9yeS1tYXBwZWQgY2FwdHVyZSwgcmV0dXJucworICogMC4KKyAqCisgKiBPbiBlcnJvciwgcmV0dXJucyAtMSwgYW5kIHNldHMgKnN0YXR1cyB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZTsKKyAqIGlmIHRoYXQgaXMgUENBUF9FUlJPUiwgc2V0cyBoYW5kbGUtPmVycmJ1ZiB0byB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZS4KKyAqLworc3RhdGljIGludCAKK2FjdGl2YXRlX21tYXAocGNhcF90ICpoYW5kbGUsIGludCAqc3RhdHVzKQoreworCWludCByZXQ7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gYWxsb2NhdGUgYSBidWZmZXIgdG8gaG9sZCB0aGUgY29udGVudHMgb2Ygb25lCisJICogcGFja2V0LCBmb3IgdXNlIGJ5IHRoZSBvbmVzaG90IGNhbGxiYWNrLgorCSAqLworCWhhbmRsZS0+bWQub25lc2hvdF9idWZmZXIgPSBtYWxsb2MoaGFuZGxlLT5zbmFwc2hvdCk7CisJaWYgKGhhbmRsZS0+bWQub25lc2hvdF9idWZmZXIgPT0gTlVMTCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAiY2FuJ3QgYWxsb2NhdGUgb25lc2hvdCBidWZmZXI6ICVzIiwKKwkJCSBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplID09IDApIHsKKwkJLyogYnkgZGVmYXVsdCByZXF1ZXN0IDJNIGZvciB0aGUgcmluZyBidWZmZXIgKi8KKwkJaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUgPSAyKjEwMjQqMTAyNDsKKwl9CisJcmV0ID0gcHJlcGFyZV90cGFja2V0X3NvY2tldChoYW5kbGUpOworCWlmIChyZXQgPT0gLTEpIHsKKwkJZnJlZShoYW5kbGUtPm1kLm9uZXNob3RfYnVmZmVyKTsKKwkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGNyZWF0ZV9yaW5nKGhhbmRsZSwgc3RhdHVzKTsKKwlpZiAocmV0ID09IDApIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qgc3VwcG9ydCBtZW1vcnktbWFwcGVkIGNhcHR1cmU7IG91ciBjYWxsZXIKKwkJICogd2lsbCBmYWxsIGJhY2sgb24gcmVhZGluZyBmcm9tIHRoZSBzb2NrZXQuCisJCSAqLworCQlmcmVlKGhhbmRsZS0+bWQub25lc2hvdF9idWZmZXIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJldCA9PSAtMSkgeworCQkvKgorCQkgKiBFcnJvciBhdHRlbXB0aW5nIHRvIGVuYWJsZSBtZW1vcnktbWFwcGVkIGNhcHR1cmU7CisJCSAqIGZhaWwuICBjcmVhdGVfcmluZygpIGhhcyBzZXQgKnN0YXR1cy4KKwkJICovCisJCWZyZWUoaGFuZGxlLT5tZC5vbmVzaG90X2J1ZmZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFN1Y2Nlc3MuICAqc3RhdHVzIGhhcyBiZWVuIHNldCBlaXRoZXIgdG8gMCBpZiB0aGVyZSBhcmUgbm8KKwkgKiB3YXJuaW5ncyBvciB0byBhIFBDQVBfV0FSTklOR18gdmFsdWUgaWYgdGhlcmUgaXMgYSB3YXJuaW5nLgorCSAqCisJICogT3ZlcnJpZGUgc29tZSBkZWZhdWx0cyBhbmQgaW5oZXJpdCB0aGUgb3RoZXIgZmllbGRzIGZyb20KKwkgKiBhY3RpdmF0ZV9uZXcuCisJICogaGFuZGxlLT5vZmZzZXQgaXMgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW50byB0aGUgcnggcmluZy4KKwkgKiBoYW5kbGUtPmNjIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHJpbmcgc2l6ZS4KKwkgKi8KKwloYW5kbGUtPnJlYWRfb3AgPSBwY2FwX3JlYWRfbGludXhfbW1hcDsKKwloYW5kbGUtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfbGludXhfbW1hcDsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IHBjYXBfc2V0ZmlsdGVyX2xpbnV4X21tYXA7CisJaGFuZGxlLT5zZXRub25ibG9ja19vcCA9IHBjYXBfc2V0bm9uYmxvY2tfbW1hcDsKKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19tbWFwOworCWhhbmRsZS0+b25lc2hvdF9jYWxsYmFjayA9IHBjYXBfb25lc2hvdF9tbWFwOworCWhhbmRsZS0+c2VsZWN0YWJsZV9mZCA9IGhhbmRsZS0+ZmQ7CisJcmV0dXJuIDE7Cit9CisjZWxzZSAvKiBIQVZFX1BBQ0tFVF9SSU5HICovCitzdGF0aWMgaW50IAorYWN0aXZhdGVfbW1hcChwY2FwX3QgKmhhbmRsZSBfVV8sIGludCAqc3RhdHVzIF9VXykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBIQVZFX1BBQ0tFVF9SSU5HICovCisKKyNpZmRlZiBIQVZFX1BBQ0tFVF9SSU5HCisvKgorICogQXR0ZW1wdCB0byBzZXQgdGhlIHNvY2tldCB0byB2ZXJzaW9uIDIgb2YgdGhlIG1lbW9yeS1tYXBwZWQgaGVhZGVyLgorICogUmV0dXJuIDEgaWYgd2Ugc3VjY2VlZCBvciBpZiB3ZSBmYWlsIGJlY2F1c2UgdmVyc2lvbiAyIGlzbid0CisgKiBzdXBwb3J0ZWQ7IHJldHVybiAtMSBvbiBhbnkgb3RoZXIgZXJyb3IsIGFuZCBzZXQgaGFuZGxlLT5lcnJidWYuCisgKi8KK3N0YXRpYyBpbnQKK3ByZXBhcmVfdHBhY2tldF9zb2NrZXQocGNhcF90ICpoYW5kbGUpCit7CisjaWZkZWYgSEFWRV9UUEFDS0VUMgorCXNvY2tsZW5fdCBsZW47CisJaW50IHZhbDsKKyNlbmRpZgorCisJaGFuZGxlLT5tZC50cF92ZXJzaW9uID0gVFBBQ0tFVF9WMTsKKwloYW5kbGUtPm1kLnRwX2hkcmxlbiA9IHNpemVvZihzdHJ1Y3QgdHBhY2tldF9oZHIpOworCisjaWZkZWYgSEFWRV9UUEFDS0VUMgorCS8qIFByb2JlIHdoZXRoZXIga2VybmVsIHN1cHBvcnRzIFRQQUNLRVRfVjIgKi8KKwl2YWwgPSBUUEFDS0VUX1YyOworCWxlbiA9IHNpemVvZih2YWwpOworCWlmIChnZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9IRFJMRU4sICZ2YWwsICZsZW4pIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU5PUFJPVE9PUFQpCisJCQlyZXR1cm4gMTsJLyogbm8gLSBqdXN0IGRyaXZlIG9uICovCisKKwkJLyogWWVzIC0gdHJlYXQgYXMgYSBmYWlsdXJlLiAqLworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJjYW4ndCBnZXQgVFBBQ0tFVF9WMiBoZWFkZXIgbGVuIG9uIHBhY2tldCBzb2NrZXQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwloYW5kbGUtPm1kLnRwX2hkcmxlbiA9IHZhbDsKKworCXZhbCA9IFRQQUNLRVRfVjI7CisJaWYgKHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1BBQ0tFVCwgUEFDS0VUX1ZFUlNJT04sICZ2YWwsCisJCSAgICAgICBzaXplb2YodmFsKSkgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImNhbid0IGFjdGl2YXRlIFRQQUNLRVRfVjIgb24gcGFja2V0IHNvY2tldDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCWhhbmRsZS0+bWQudHBfdmVyc2lvbiA9IFRQQUNLRVRfVjI7CisKKwkvKiBSZXNlcnZlIHNwYWNlIGZvciBWTEFOIHRhZyByZWNvbnN0cnVjdGlvbiAqLworCXZhbCA9IFZMQU5fVEFHX0xFTjsKKwlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfUkVTRVJWRSwgJnZhbCwKKwkJICAgICAgIHNpemVvZih2YWwpKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiY2FuJ3Qgc2V0IHVwIHJlc2VydmUgb24gcGFja2V0IHNvY2tldDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisjZW5kaWYgLyogSEFWRV9UUEFDS0VUMiAqLworCXJldHVybiAxOworfQorCisvKgorICogQXR0ZW1wdCB0byBzZXQgdXAgbWVtb3J5LW1hcHBlZCBhY2Nlc3MuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyAxLCBhbmQgc2V0cyAqc3RhdHVzIHRvIDAgaWYgdGhlcmUgYXJlIG5vIHdhcm5pbmdzCisgKiBvciB0byBhIFBDQVBfV0FSTklOR18gY29kZSBpZiB0aGVyZSBpcyBhIHdhcm5pbmcuCisgKgorICogT24gZmFpbHVyZSBkdWUgdG8gbGFjayBvZiBzdXBwb3J0IGZvciBtZW1vcnktbWFwcGVkIGNhcHR1cmUsIHJldHVybnMKKyAqIDAuCisgKgorICogT24gZXJyb3IsIHJldHVybnMgLTEsIGFuZCBzZXRzICpzdGF0dXMgdG8gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGU7CisgKiBpZiB0aGF0IGlzIFBDQVBfRVJST1IsIHNldHMgaGFuZGxlLT5lcnJidWYgdG8gdGhlIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyBpbnQKK2NyZWF0ZV9yaW5nKHBjYXBfdCAqaGFuZGxlLCBpbnQgKnN0YXR1cykKK3sKKwl1bnNpZ25lZCBpLCBqLCBmcmFtZXNfcGVyX2Jsb2NrOworCXN0cnVjdCB0cGFja2V0X3JlcSByZXE7CisJc29ja2xlbl90IGxlbjsKKwl1bnNpZ25lZCBpbnQgc2tfdHlwZSwgdHBfcmVzZXJ2ZSwgbWFjbGVuLCB0cF9oZHJsZW4sIG5ldG9mZiwgbWFjb2ZmOworCXVuc2lnbmVkIGludCBmcmFtZV9zaXplOworCisJLyoKKwkgKiBTdGFydCBvdXQgYXNzdW1pbmcgbm8gd2FybmluZ3Mgb3IgZXJyb3JzLgorCSAqLworCSpzdGF0dXMgPSAwOworCisJLyogTm90ZSB0aGF0IHdpdGggbGFyZ2Ugc25hcHNob3QgbGVuZ3RoIChzYXkgNjRLLCB3aGljaCBpcyB0aGUgZGVmYXVsdAorCSAqIGZvciByZWNlbnQgdmVyc2lvbnMgb2YgdGNwZHVtcCwgdGhlIHZhbHVlIHRoYXQgIi1zIDAiIGhhcyBnaXZlbgorCSAqIGZvciBhIGxvbmcgdGltZSB3aXRoIHRjcGR1bXAsIGFuZCB0aGUgZGVmYXVsdCBpbiBXaXJlc2hhcmsvVFNoYXJrKSwKKwkgKiBpZiB3ZSB1c2UgdGhlIHNuYXBzaG90IGxlbmd0aCB0byBjYWxjdWxhdGUgdGhlIGZyYW1lIGxlbmd0aCwKKwkgKiBvbmx5IGEgZmV3IGZyYW1lcyB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgcmluZyBldmVuIHdpdGggcHJldHR5CisJICogbGFyZ2UgcmluZyBzaXplIChhbmQgYSBsb3Qgb2YgbWVtb3J5IHdpbGwgYmUgdW51c2VkKS4KKwkgKgorCSAqIElkZWFsbHksIHdlIHNob3VsZCBjaG9vc2UgYSBmcmFtZSBsZW5ndGggYmFzZWQgb24gdGhlCisJICogbWluaW11bSBvZiB0aGUgc3BlY2lmaWVkIHNuYXBzaG90IGxlbmd0aCBhbmQgdGhlIG1heGltdW0KKwkgKiBwYWNrZXQgc2l6ZS4gIFRoYXQncyBub3QgYXMgZWFzeSBhcyBpdCBzb3VuZHM7IGNvbnNpZGVyLCBmb3IKKwkgKiBleGFtcGxlLCBhbiA4MDIuMTEgaW50ZXJmYWNlIGluIG1vbml0b3IgbW9kZSwgd2hlcmUgdGhlCisJICogZnJhbWUgd291bGQgaW5jbHVkZSBhIHJhZGlvdGFwIGhlYWRlciwgd2hlcmUgdGhlIG1heGltdW0KKwkgKiByYWRpb3RhcCBoZWFkZXIgbGVuZ3RoIGlzIGRldmljZS1kZXBlbmRlbnQuCisJICoKKwkgKiBTbywgZm9yIG5vdywgd2UganVzdCBkbyB0aGlzIGZvciBFdGhlcm5ldCBkZXZpY2VzLCB3aGVyZQorCSAqIHRoZXJlJ3Mgbm8gbWV0YWRhdGEgaGVhZGVyLCBhbmQgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGlzCisJICogZml4ZWQgbGVuZ3RoLiAgV2UgY2FuIGdldCB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSBieQorCSAqIGFkZGluZyAxOCwgdGhlIEV0aGVybmV0IGhlYWRlciBsZW5ndGggcGx1cyB0aGUgQ1JDIGxlbmd0aAorCSAqIChqdXN0IGluIGNhc2Ugd2UgaGFwcGVuIHRvIGdldCB0aGUgQ1JDIGluIHRoZSBwYWNrZXQpLCB0bworCSAqIHRoZSBNVFUgb2YgdGhlIGludGVyZmFjZTsgd2UgZmV0Y2ggdGhlIE1UVSBpbiB0aGUgaG9wZXMKKwkgKiB0aGF0IGl0IHJlZmxlY3RzIHN1cHBvcnQgZm9yIGp1bWJvIGZyYW1lcy4gIChFdmVuIGlmIHRoZQorCSAqIGludGVyZmFjZSBpcyBqdXN0IGJlaW5nIHVzZWQgZm9yIHBhc3NpdmUgc25vb3BpbmcsIHRoZSBkcml2ZXIKKwkgKiBtaWdodCBzZXQgdGhlIHNpemUgb2YgYnVmZmVycyBpbiB0aGUgcmVjZWl2ZSByaW5nIGJhc2VkIG9uCisJICogdGhlIE1UVSwgc28gdGhhdCB0aGUgTVRVIGxpbWl0cyB0aGUgbWF4aW11bSBzaXplIG9mIHBhY2tldHMKKwkgKiB0aGF0IHdlIGNhbiByZWNlaXZlLikKKwkgKgorCSAqIFdlIGRvbid0IGRvIHRoYXQgaWYgc2VnbWVudGF0aW9uL2ZyYWdtZW50YXRpb24gb3IgcmVjZWl2ZQorCSAqIG9mZmxvYWQgYXJlIGVuYWJsZWQsIHNvIHdlIGRvbid0IGdldCBydWRlbHkgc3VycHJpc2VkIGJ5CisJICogInBhY2tldHMiIGJpZ2dlciB0aGFuIHRoZSBNVFUuICovCisJZnJhbWVfc2l6ZSA9IGhhbmRsZS0+c25hcHNob3Q7CisJaWYgKGhhbmRsZS0+bGlua3R5cGUgPT0gRExUX0VOMTBNQikgeworCQlpbnQgbXR1OworCQlpbnQgb2ZmbG9hZDsKKworCQlvZmZsb2FkID0gaWZhY2VfZ2V0X29mZmxvYWQoaGFuZGxlKTsKKwkJaWYgKG9mZmxvYWQgPT0gLTEpIHsKKwkJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghb2ZmbG9hZCkgeworCQkJbXR1ID0gaWZhY2VfZ2V0X210dShoYW5kbGUtPmZkLCBoYW5kbGUtPm9wdC5zb3VyY2UsCisJCQkgICAgaGFuZGxlLT5lcnJidWYpOworCQkJaWYgKG10dSA9PSAtMSkgeworCQkJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChmcmFtZV9zaXplID4gbXR1ICsgMTgpCisJCQkJZnJhbWVfc2l6ZSA9IG10dSArIDE4OworCQl9CisJfQorCQorCS8qIE5PVEU6IGNhbGN1bHVzIG1hdGNoaW5nIHRob3NlIGluIHRwYWNrZXRfcmN2KCkKKwkgKiBpbiBsaW51eC0yLjYvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworCSAqLworCWxlbiA9IHNpemVvZihza190eXBlKTsKKwlpZiAoZ2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfU09DS0VULCBTT19UWVBFLCAmc2tfdHlwZSwgJmxlbikgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZ2V0c29ja29wdDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQlyZXR1cm4gLTE7CisJfQorI2lmZGVmIFBBQ0tFVF9SRVNFUlZFCisJbGVuID0gc2l6ZW9mKHRwX3Jlc2VydmUpOworCWlmIChnZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9SRVNFUlZFLCAmdHBfcmVzZXJ2ZSwgJmxlbikgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9QUk9UT09QVCkgeworCQkJLyoKKwkJCSAqIEVOT1BST1RPT1BUIG1lYW5zICJrZXJuZWwgZG9lc24ndCBzdXBwb3J0CisJCQkgKiBQQUNLRVRfUkVTRVJWRSIsIGluIHdoaWNoIGNhc2Ugd2UgZmFsbCBiYWNrCisJCQkgKiBhcyBiZXN0IHdlIGNhbi4KKwkJCSAqLworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJnZXRzb2Nrb3B0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJcmV0dXJuIC0xOworCQl9CisJCXRwX3Jlc2VydmUgPSAwOwkvKiBvbGRlciBrZXJuZWwsIHJlc2VydmUgbm90IHN1cHBvcnRlZCAqLworCX0KKyNlbHNlCisJdHBfcmVzZXJ2ZSA9IDA7CS8qIG9sZGVyIGtlcm5lbCwgcmVzZXJ2ZSBub3Qgc3VwcG9ydGVkICovCisjZW5kaWYKKwltYWNsZW4gPSAoc2tfdHlwZSA9PSBTT0NLX0RHUkFNKSA/IDAgOiBNQVhfTElOS0hFQURFUl9TSVpFOworCQkvKiBYWFg6IGluIHRoZSBrZXJuZWwgbWFjbGVuIGlzIGNhbGN1bGF0ZWQgZnJvbQorCQkgKiBMTF9BTExPQ0FURURfU1BBQ0UoZGV2KSBhbmQgdm5ldF9oZHIuaGRyX2xlbgorCQkgKiBpbjogIHBhY2tldF9zbmQoKSAgICAgICAgICAgaW4gbGludXgtMi42L25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKwkJICogdGhlbiBwYWNrZXRfYWxsb2Nfc2tiKCkgICAgIGluIGxpbnV4LTIuNi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCisJCSAqIHRoZW4gc29ja19hbGxvY19zZW5kX3Bza2IoKSBpbiBsaW51eC0yLjYvbmV0L2NvcmUvc29jay5jCisJCSAqIGJ1dCBJIHNlZSBubyB3YXkgdG8gZ2V0IHRob3NlIHNpemVzIGluIHVzZXJzcGFjZSwKKwkJICogbGlrZSBmb3IgaW5zdGFuY2Ugd2l0aCBhbiBpZnJlcSBpb2N0bCgpOworCQkgKiB0aGUgYmVzdCB0aGluZyBJJ3ZlIGZvdW5kIHNvIGZhciBpcyBNQVhfSEVBREVSIGluIHRoZSBrZXJuZWwKKwkJICogcGFydCBvZiBsaW51eC0yLjYvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAorCQkgKiB3aGljaCBnb2VzIHVwIHRvIDEyOCs0OD0xNzY7IHNpbmNlIHBjYXAtbGludXguYyBkZWZpbmVzCisJCSAqIGEgTUFYX0xJTktIRUFERVJfU0laRSBvZiAyNTYgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIHRoYXQsCisJCSAqIGxldCdzIHVzZSBpdC4uIG1heWJlIGlzIGl0IGV2ZW4gbGFyZ2UgZW5vdWdoIHRvIGRpcmVjdGx5CisJCSAqIHJlcGxhY2UgbWFjb2ZmLi4KKwkJICovCisJdHBfaGRybGVuID0gVFBBQ0tFVF9BTElHTihoYW5kbGUtPm1kLnRwX2hkcmxlbikgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSA7CisJbmV0b2ZmID0gVFBBQ0tFVF9BTElHTih0cF9oZHJsZW4gKyAobWFjbGVuIDwgMTYgPyAxNiA6IG1hY2xlbikpICsgdHBfcmVzZXJ2ZTsKKwkJLyogTk9URTogQUZBSUNTIHRwX3Jlc2VydmUgbWF5IGJyZWFrIHRoZSBUUEFDS0VUX0FMSUdOIG9mCisJCSAqIG5ldG9mZiwgd2hpY2ggY29udHJhZGljdHMKKwkJICogbGludXgtMi42L0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQKKwkJICogZG9jdW1lbnRpbmcgdGhhdDoKKwkJICogIi0gR2FwLCBjaG9zZW4gc28gdGhhdCBwYWNrZXQgZGF0YSAoU3RhcnQrdHBfbmV0KQorCQkgKiBhbGlnbnMgdG8gVFBBQ0tFVF9BTElHTk1FTlQ9MTYiCisJCSAqLworCQkvKiBOT1RFOiBpbiBsaW51eC0yLjYvaW5jbHVkZS9saW51eC9za2J1ZmYuaDoKKwkJICogIkNQVXMgb2Z0ZW4gdGFrZSBhIHBlcmZvcm1hbmNlIGhpdAorCQkgKiAgd2hlbiBhY2Nlc3NpbmcgdW5hbGlnbmVkIG1lbW9yeSBsb2NhdGlvbnMiCisJCSAqLworCW1hY29mZiA9IG5ldG9mZiAtIG1hY2xlbjsKKwlyZXEudHBfZnJhbWVfc2l6ZSA9IFRQQUNLRVRfQUxJR04obWFjb2ZmICsgZnJhbWVfc2l6ZSk7CisJcmVxLnRwX2ZyYW1lX25yID0gaGFuZGxlLT5vcHQuYnVmZmVyX3NpemUvcmVxLnRwX2ZyYW1lX3NpemU7CisKKwkvKiBjb21wdXRlIHRoZSBtaW51bXVtIGJsb2NrIHNpemUgdGhhdCB3aWxsIGhhbmRsZSB0aGlzIGZyYW1lLiAKKwkgKiBUaGUgYmxvY2sgaGFzIHRvIGJlIHBhZ2Ugc2l6ZSBhbGlnbmVkLiAKKwkgKiBUaGUgbWF4IGJsb2NrIHNpemUgYWxsb3dlZCBieSB0aGUga2VybmVsIGlzIGFyY2gtZGVwZW5kZW50IGFuZCAKKwkgKiBpdCdzIG5vdCBleHBsaWNpdGx5IGNoZWNrZWQgaGVyZS4gKi8KKwlyZXEudHBfYmxvY2tfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisJd2hpbGUgKHJlcS50cF9ibG9ja19zaXplIDwgcmVxLnRwX2ZyYW1lX3NpemUpIAorCQlyZXEudHBfYmxvY2tfc2l6ZSA8PD0gMTsKKworCWZyYW1lc19wZXJfYmxvY2sgPSByZXEudHBfYmxvY2tfc2l6ZS9yZXEudHBfZnJhbWVfc2l6ZTsKKworCS8qCisJICogUEFDS0VUX1RJTUVTVEFNUCB3YXMgYWRkZWQgYWZ0ZXIgbGludXgvbmV0X3RzdGFtcC5oIHdhcywKKwkgKiBzbyB3ZSBjaGVjayBmb3IgUEFDS0VUX1RJTUVTVEFNUC4gIFdlIGNoZWNrIGZvcgorCSAqIGxpbnV4L25ldF90c3RhbXAuaCBqdXN0IGluIGNhc2UgYSBzeXN0ZW0gc29tZWhvdyBoYXMKKwkgKiBQQUNLRVRfVElNRVNUQU1QIGJ1dCBub3QgbGludXgvbmV0X3RzdGFtcC5oOyB0aGF0IG1pZ2h0CisJICogYmUgdW5uZWNlc3NhcnkuCisJICoKKwkgKiBTSU9DU0hXVFNUQU1QIHdhcyBpbnRyb2R1Y2VkIGluIHRoZSBwYXRjaCB0aGF0IGludHJvZHVjZWQKKwkgKiBsaW51eC9uZXRfdHN0YW1wLmgsIHNvIHdlIGRvbid0IGJvdGhlciBjaGVja2luZyB3aGV0aGVyCisJICogU0lPQ1NIV1RTVEFNUCBpcyBkZWZpbmVkIChpZiB5b3VyIExpbnV4IHN5c3RlbSBoYXMKKwkgKiBsaW51eC9uZXRfdHN0YW1wLmggYnV0IGRvZXNuJ3QgZGVmaW5lIFNJT0NTSFdUU1RBTVAsIHlvdXIKKwkgKiBMaW51eCBzeXN0ZW0gaXMgYmFkbHkgYnJva2VuKS4KKwkgKi8KKyNpZiBkZWZpbmVkKEhBVkVfTElOVVhfTkVUX1RTVEFNUF9IKSAmJiBkZWZpbmVkKFBBQ0tFVF9USU1FU1RBTVApCisJLyoKKwkgKiBJZiB3ZSB3ZXJlIHRvbGQgdG8gZG8gc28sIGFzayB0aGUga2VybmVsIGFuZCB0aGUgZHJpdmVyCisJICogdG8gdXNlIGhhcmR3YXJlIHRpbWVzdGFtcHMuCisJICoKKwkgKiBIYXJkd2FyZSB0aW1lc3RhbXBzIGFyZSBvbmx5IHN1cHBvcnRlZCB3aXRoIG1tYXBwZWQKKwkgKiBjYXB0dXJlcy4KKwkgKi8KKwlpZiAoaGFuZGxlLT5vcHQudHN0YW1wX3R5cGUgPT0gUENBUF9UU1RBTVBfQURBUFRFUiB8fAorCSAgICBoYW5kbGUtPm9wdC50c3RhbXBfdHlwZSA9PSBQQ0FQX1RTVEFNUF9BREFQVEVSX1VOU1lOQ0VEKSB7CisJCXN0cnVjdCBod3RzdGFtcF9jb25maWcgaHdjb25maWc7CisJCXN0cnVjdCBpZnJlcSBpZnI7CisJCWludCB0aW1lc291cmNlOworCisJCS8qCisJCSAqIEFzayBmb3IgaGFyZHdhcmUgdGltZSBzdGFtcHMgb24gYWxsIHBhY2tldHMsCisJCSAqIGluY2x1ZGluZyB0cmFuc21pdHRlZCBwYWNrZXRzLgorCQkgKi8KKwkJbWVtc2V0KCZod2NvbmZpZywgMCwgc2l6ZW9mKGh3Y29uZmlnKSk7CisJCWh3Y29uZmlnLnR4X3R5cGUgPSBIV1RTVEFNUF9UWF9PTjsKKwkJaHdjb25maWcucnhfZmlsdGVyID0gSFdUU1RBTVBfRklMVEVSX0FMTDsKKworCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCQlzdHJjcHkoaWZyLmlmcl9uYW1lLCBoYW5kbGUtPm9wdC5zb3VyY2UpOworCQlpZnIuaWZyX2RhdGEgPSAodm9pZCAqKSZod2NvbmZpZzsKKworCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ1NIV1RTVEFNUCwgJmlmcikgPCAwKSB7CisJCQlzd2l0Y2ggKGVycm5vKSB7CisKKwkJCWNhc2UgRVBFUk06CisJCQkJLyoKKwkJCQkgKiBUcmVhdCB0aGlzIGFzIGFuIGVycm9yLCBhcyB0aGUKKwkJCQkgKiB1c2VyIHNob3VsZCB0cnkgdG8gcnVuIHRoaXMKKwkJCQkgKiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBwcml2aWxlZ2VzIC0KKwkJCQkgKiBhbmQsIGlmIHRoZXkgY2FuJ3QsIHNob3VsZG4ndAorCQkJCSAqIHRyeSByZXF1ZXN0aW5nIGhhcmR3YXJlIHRpbWUgc3RhbXBzLgorCQkJCSAqLworCQkJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SX1BFUk1fREVOSUVEOworCQkJCXJldHVybiAtMTsKKworCQkJY2FzZSBFT1BOT1RTVVBQOgorCQkJCS8qCisJCQkJICogVHJlYXQgdGhpcyBhcyBhIHdhcm5pbmcsIGFzIHRoZQorCQkJCSAqIG9ubHkgd2F5IHRvIGZpeCB0aGUgd2FybmluZyBpcyB0bworCQkJCSAqIGdldCBhbiBhZGFwdGVyIHRoYXQgc3VwcG9ydHMgaGFyZHdhcmUKKwkJCQkgKiB0aW1lIHN0YW1wcy4gIFdlJ2xsIGp1c3QgZmFsbCBiYWNrCisJCQkJICogb24gdGhlIHN0YW5kYXJkIGhvc3QgdGltZSBzdGFtcHMuCisJCQkJICovCisJCQkJKnN0YXR1cyA9IFBDQVBfV0FSTklOR19UU1RBTVBfVFlQRV9OT1RTVVA7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSJTSU9DU0hXVFNUQU1QIGZhaWxlZDogJXMiLAorCQkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlbGwsIHRoYXQgd29ya2VkLiAgTm93IHNwZWNpZnkgdGhlIHR5cGUgb2YKKwkJCSAqIGhhcmR3YXJlIHRpbWUgc3RhbXAgd2Ugd2FudCBmb3IgdGhpcworCQkJICogc29ja2V0LgorCQkJICovCisJCQlpZiAoaGFuZGxlLT5vcHQudHN0YW1wX3R5cGUgPT0gUENBUF9UU1RBTVBfQURBUFRFUikgeworCQkJCS8qCisJCQkJICogSGFyZHdhcmUgdGltZXN0YW1wLCBzeW5jaHJvbml6ZWQKKwkJCQkgKiB3aXRoIHRoZSBzeXN0ZW0gY2xvY2suCisJCQkJICovCisJCQkJdGltZXNvdXJjZSA9IFNPRl9USU1FU1RBTVBJTkdfU1lTX0hBUkRXQVJFOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFBDQVBfVFNUQU1QX0FEQVBURVJfVU5TWU5DRUQgLSBoYXJkd2FyZQorCQkJCSAqIHRpbWVzdGFtcCwgbm90IHN5bmNocm9uaXplZCB3aXRoIHRoZQorCQkJCSAqIHN5c3RlbSBjbG9jay4KKwkJCQkgKi8KKwkJCQl0aW1lc291cmNlID0gU09GX1RJTUVTVEFNUElOR19SQVdfSEFSRFdBUkU7CisJCQl9CisJCQlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfVElNRVNUQU1QLAorCQkJCSh2b2lkICopJnRpbWVzb3VyY2UsIHNpemVvZih0aW1lc291cmNlKSkpIHsKKwkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgCisJCQkJCSJjYW4ndCBzZXQgUEFDS0VUX1RJTUVTVEFNUDogJXMiLCAKKwkJCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCSpzdGF0dXMgPSBQQ0FQX0VSUk9SOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZiAvKiBIQVZFX0xJTlVYX05FVF9UU1RBTVBfSCAmJiBQQUNLRVRfVElNRVNUQU1QICovCisKKwkvKiBhc2sgdGhlIGtlcm5lbCB0byBjcmVhdGUgdGhlIHJpbmcgKi8KK3JldHJ5OgorCXJlcS50cF9ibG9ja19uciA9IHJlcS50cF9mcmFtZV9uciAvIGZyYW1lc19wZXJfYmxvY2s7CisKKwkvKiByZXEudHBfZnJhbWVfbnIgaXMgcmVxdWVzdGVkIHRvIG1hdGNoIGZyYW1lc19wZXJfYmxvY2sqcmVxLnRwX2Jsb2NrX25yICovCisJcmVxLnRwX2ZyYW1lX25yID0gcmVxLnRwX2Jsb2NrX25yICogZnJhbWVzX3Blcl9ibG9jazsKKwkKKwlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfUlhfUklORywKKwkJCQkJKHZvaWQgKikgJnJlcSwgc2l6ZW9mKHJlcSkpKSB7CisJCWlmICgoZXJybm8gPT0gRU5PTUVNKSAmJiAocmVxLnRwX2Jsb2NrX25yID4gMSkpIHsKKwkJCS8qCisJCQkgKiBNZW1vcnkgZmFpbHVyZTsgdHJ5IHRvIHJlZHVjZSB0aGUgcmVxdWVzdGVkIHJpbmcKKwkJCSAqIHNpemUuCisJCQkgKgorCQkJICogV2UgdXNlZCB0byByZWR1Y2UgdGhpcyBieSBoYWxmIC0tIGRvIDUlIGluc3RlYWQuCisJCQkgKiBUaGF0IG1heSByZXN1bHQgaW4gbW9yZSBpdGVyYXRpb25zIGFuZCBhIGxvbmdlcgorCQkJICogc3RhcnR1cCwgYnV0IHRoZSB1c2VyIHdpbGwgYmUgbXVjaCBoYXBwaWVyIHdpdGgKKwkJCSAqIHRoZSByZXN1bHRpbmcgYnVmZmVyIHNpemUuCisJCQkgKi8KKwkJCWlmIChyZXEudHBfZnJhbWVfbnIgPCAyMCkKKwkJCQlyZXEudHBfZnJhbWVfbnIgLT0gMTsKKwkJCWVsc2UKKwkJCQlyZXEudHBfZnJhbWVfbnIgLT0gcmVxLnRwX2ZyYW1lX25yLzIwOworCQkJZ290byByZXRyeTsKKwkJfQorCQlpZiAoZXJybm8gPT0gRU5PUFJPVE9PUFQpIHsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCBoYXZlIHJpbmcgYnVmZmVyIHN1cHBvcnQgaW4gdGhpcyBrZXJuZWwuCisJCQkgKi8KKwkJCXJldHVybiAwOworCQl9CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImNhbid0IGNyZWF0ZSByeCByaW5nIG9uIHBhY2tldCBzb2NrZXQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBtZW1vcnkgbWFwIHRoZSByeCByaW5nICovCisJaGFuZGxlLT5tZC5tbWFwYnVmbGVuID0gcmVxLnRwX2Jsb2NrX25yICogcmVxLnRwX2Jsb2NrX3NpemU7CisJaGFuZGxlLT5tZC5tbWFwYnVmID0gbW1hcCgwLCBoYW5kbGUtPm1kLm1tYXBidWZsZW4sCisJICAgIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBoYW5kbGUtPmZkLCAwKTsKKwlpZiAoaGFuZGxlLT5tZC5tbWFwYnVmID09IE1BUF9GQUlMRUQpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiY2FuJ3QgbW1hcCByeCByaW5nOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKworCQkvKiBjbGVhciB0aGUgYWxsb2NhdGVkIHJpbmcgb24gZXJyb3IqLworCQlkZXN0cm95X3JpbmcoaGFuZGxlKTsKKwkJKnN0YXR1cyA9IFBDQVBfRVJST1I7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhIHJpbmcgZm9yIGVhY2ggZnJhbWUgaGVhZGVyIHBvaW50ZXIqLworCWhhbmRsZS0+Y2MgPSByZXEudHBfZnJhbWVfbnI7CisJaGFuZGxlLT5idWZmZXIgPSBtYWxsb2MoaGFuZGxlLT5jYyAqIHNpemVvZih1bmlvbiB0aGRyICopKTsKKwlpZiAoIWhhbmRsZS0+YnVmZmVyKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgImNhbid0IGFsbG9jYXRlIHJpbmcgb2YgZnJhbWUgaGVhZGVyczogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCisJCWRlc3Ryb3lfcmluZyhoYW5kbGUpOworCQkqc3RhdHVzID0gUENBUF9FUlJPUjsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGZpbGwgdGhlIGhlYWRlciByaW5nIHdpdGggcHJvcGVyIGZyYW1lIHB0ciovCisJaGFuZGxlLT5vZmZzZXQgPSAwOworCWZvciAoaT0wOyBpPHJlcS50cF9ibG9ja19ucjsgKytpKSB7CisJCXZvaWQgKmJhc2UgPSAmaGFuZGxlLT5tZC5tbWFwYnVmW2kqcmVxLnRwX2Jsb2NrX3NpemVdOworCQlmb3IgKGo9MDsgajxmcmFtZXNfcGVyX2Jsb2NrOyArK2osICsraGFuZGxlLT5vZmZzZXQpIHsKKwkJCVJJTkdfR0VUX0ZSQU1FKGhhbmRsZSkgPSBiYXNlOworCQkJYmFzZSArPSByZXEudHBfZnJhbWVfc2l6ZTsKKwkJfQorCX0KKworCWhhbmRsZS0+YnVmc2l6ZSA9IHJlcS50cF9mcmFtZV9zaXplOworCWhhbmRsZS0+b2Zmc2V0ID0gMDsKKwlyZXR1cm4gMTsKK30KKworLyogZnJlZSBhbGwgcmluZyByZWxhdGVkIHJlc291cmNlcyovCitzdGF0aWMgdm9pZAorZGVzdHJveV9yaW5nKHBjYXBfdCAqaGFuZGxlKQoreworCS8qIHRlbGwgdGhlIGtlcm5lbCB0byBkZXN0cm95IHRoZSByaW5nKi8KKwlzdHJ1Y3QgdHBhY2tldF9yZXEgcmVxOworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfUEFDS0VULCBQQUNLRVRfUlhfUklORywKKwkJCQkodm9pZCAqKSAmcmVxLCBzaXplb2YocmVxKSk7CisKKwkvKiBpZiByaW5nIGlzIG1hcHBlZCwgdW5tYXAgaXQqLworCWlmIChoYW5kbGUtPm1kLm1tYXBidWYpIHsKKwkJLyogZG8gbm90IHRlc3QgZm9yIG1tYXAgZmFpbHVyZSwgYXMgd2UgY2FuJ3QgcmVjb3ZlciBmcm9tIGFueSBlcnJvciAqLworCQltdW5tYXAoaGFuZGxlLT5tZC5tbWFwYnVmLCBoYW5kbGUtPm1kLm1tYXBidWZsZW4pOworCQloYW5kbGUtPm1kLm1tYXBidWYgPSBOVUxMOworCX0KK30KKworLyoKKyAqIFNwZWNpYWwgb25lLXNob3QgY2FsbGJhY2ssIHVzZWQgZm9yIHBjYXBfbmV4dCgpIGFuZCBwY2FwX25leHRfZXgoKSwKKyAqIGZvciBMaW51eCBtbWFwcGVkIGNhcHR1cmUuCisgKgorICogVGhlIHByb2JsZW0gaXMgdGhhdCBwY2FwX25leHQoKSBhbmQgcGNhcF9uZXh0X2V4KCkgZXhwZWN0IHRoZSBwYWNrZXQKKyAqIGRhdGEgaGFuZGVkIHRvIHRoZSBjYWxsYmFjayB0byBiZSB2YWxpZCBhZnRlciB0aGUgY2FsbGJhY2sgcmV0dXJucywKKyAqIGJ1dCBwY2FwX3JlYWRfbGludXhfbW1hcCgpIGhhcyB0byByZWxlYXNlIHRoYXQgcGFja2V0IGFzIHNvb24gYXMKKyAqIHRoZSBjYWxsYmFjayByZXR1cm5zIChvdGhlcndpc2UsIHRoZSBrZXJuZWwgdGhpbmtzIHRoZXJlJ3Mgc3RpbGwKKyAqIGF0IGxlYXN0IG9uZSB1bnByb2Nlc3NlZCBwYWNrZXQgYXZhaWxhYmxlIGluIHRoZSByaW5nLCBzbyBhIHNlbGVjdCgpCisgKiB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBpbmRpY2F0aW5nIHRoYXQgdGhlcmUncyBkYXRhIHRvIHByb2Nlc3MpLCBzbywKKyAqIGluIHRoZSBjYWxsYmFjaywgd2UgaGF2ZSB0byBtYWtlIGEgY29weSBvZiB0aGUgcGFja2V0LgorICoKKyAqIFllcywgdGhpcyBtZWFucyB0aGF0LCBpZiB0aGUgY2FwdHVyZSBpcyB1c2luZyB0aGUgcmluZyBidWZmZXIsIHVzaW5nCisgKiBwY2FwX25leHQoKSBvciBwY2FwX25leHRfZXgoKSByZXF1aXJlcyBtb3JlIGNvcGllcyB0aGFuIHVzaW5nCisgKiBwY2FwX2xvb3AoKSBvciBwY2FwX2Rpc3BhdGNoKCkuICBJZiB0aGF0IGJvdGhlcnMgeW91LCBkb24ndCB1c2UKKyAqIHBjYXBfbmV4dCgpIG9yIHBjYXBfbmV4dF9leCgpLgorICovCitzdGF0aWMgdm9pZAorcGNhcF9vbmVzaG90X21tYXAodV9jaGFyICp1c2VyLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsCisgICAgY29uc3QgdV9jaGFyICpieXRlcykKK3sKKwlzdHJ1Y3Qgb25lc2hvdF91c2VyZGF0YSAqc3AgPSAoc3RydWN0IG9uZXNob3RfdXNlcmRhdGEgKil1c2VyOworCisJKnNwLT5oZHIgPSAqaDsKKwltZW1jcHkoc3AtPnBkLT5tZC5vbmVzaG90X2J1ZmZlciwgYnl0ZXMsIGgtPmNhcGxlbik7CisJKnNwLT5wa3QgPSBzcC0+cGQtPm1kLm9uZXNob3RfYnVmZmVyOworfQorICAgIAorc3RhdGljIHZvaWQKK3BjYXBfY2xlYW51cF9saW51eF9tbWFwKCBwY2FwX3QgKmhhbmRsZSApCit7CisJZGVzdHJveV9yaW5nKGhhbmRsZSk7CisJaWYgKGhhbmRsZS0+bWQub25lc2hvdF9idWZmZXIgIT0gTlVMTCkgeworCQlmcmVlKGhhbmRsZS0+bWQub25lc2hvdF9idWZmZXIpOworCQloYW5kbGUtPm1kLm9uZXNob3RfYnVmZmVyID0gTlVMTDsKKwl9CisJcGNhcF9jbGVhbnVwX2xpbnV4KGhhbmRsZSk7Cit9CisKKworc3RhdGljIGludAorcGNhcF9nZXRub25ibG9ja19tbWFwKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKQoreworCS8qIHVzZSBuZWdhdGl2ZSB2YWx1ZSBvZiB0aW1lb3V0IHRvIGluZGljYXRlIG5vbiBibG9ja2luZyBvcHMgKi8KKwlyZXR1cm4gKHAtPm1kLnRpbWVvdXQ8MCk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfc2V0bm9uYmxvY2tfbW1hcChwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKQoreworCS8qIG1hcCBlYWNoIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIDIncyBjb21wbGVtZW50LCB0byAKKwkgKiBwcmVzZXJ2ZSB0aGUgdGltZW91dCB2YWx1ZSBwcm92aWRlZCB3aXRoIHBjYXBfc2V0X3RpbWVvdXQgKi8KKwlpZiAobm9uYmxvY2spIHsKKwkJaWYgKHAtPm1kLnRpbWVvdXQgPj0gMCkgeworCQkJLyoKKwkJCSAqIFRpbWVvdXQgaXMgbm9uLW5lZ2F0aXZlLCBzbyB3ZSdyZSBub3QgYWxyZWFkeQorCQkJICogaW4gbm9uLWJsb2NraW5nIG1vZGU7IHNldCBpdCB0byB0aGUgMidzCisJCQkgKiBjb21wbGVtZW50LCB0byBtYWtlIGl0IG5lZ2F0aXZlLCBhcyBhbgorCQkJICogaW5kaWNhdGlvbiB0aGF0IHdlJ3JlIGluIG5vbi1ibG9ja2luZyBtb2RlLgorCQkJICovCisJCQlwLT5tZC50aW1lb3V0ID0gcC0+bWQudGltZW91dCotMSAtIDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocC0+bWQudGltZW91dCA8IDApIHsKKwkJCS8qCisJCQkgKiBUaW1lb3V0IGlzIG5lZ2F0aXZlLCBzbyB3ZSdyZSBub3QgYWxyZWFkeQorCQkJICogaW4gYmxvY2tpbmcgbW9kZTsgcmV2ZXJzZSB0aGUgcHJldmlvdXMKKwkJCSAqIG9wZXJhdGlvbiwgdG8gbWFrZSB0aGUgdGltZW91dCBub24tbmVnYXRpdmUKKwkJCSAqIGFnYWluLgorCQkJICovCisJCQlwLT5tZC50aW1lb3V0ID0gKHAtPm1kLnRpbWVvdXQrMSkqLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5pb24gdGhkciAqCitwY2FwX2dldF9yaW5nX2ZyYW1lKHBjYXBfdCAqaGFuZGxlLCBpbnQgc3RhdHVzKQoreworCXVuaW9uIHRoZHIgaDsKKworCWgucmF3ID0gUklOR19HRVRfRlJBTUUoaGFuZGxlKTsKKwlzd2l0Y2ggKGhhbmRsZS0+bWQudHBfdmVyc2lvbikgeworCWNhc2UgVFBBQ0tFVF9WMToKKwkJaWYgKHN0YXR1cyAhPSAoaC5oMS0+dHBfc3RhdHVzID8gVFBfU1RBVFVTX1VTRVIgOgorCQkJCQkJVFBfU1RBVFVTX0tFUk5FTCkpCisJCQlyZXR1cm4gTlVMTDsKKwkJYnJlYWs7CisjaWZkZWYgSEFWRV9UUEFDS0VUMgorCWNhc2UgVFBBQ0tFVF9WMjoKKwkJaWYgKHN0YXR1cyAhPSAoaC5oMi0+dHBfc3RhdHVzID8gVFBfU1RBVFVTX1VTRVIgOgorCQkJCQkJVFBfU1RBVFVTX0tFUk5FTCkpCisJCQlyZXR1cm4gTlVMTDsKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisJcmV0dXJuIGgucmF3OworfQorCisjaWZuZGVmIFBPTExSREhVUAorI2RlZmluZSBQT0xMUkRIVVAgMAorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3BjYXBfcmVhZF9saW51eF9tbWFwKHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgCisJCXVfY2hhciAqdXNlcikKK3sKKwlpbnQgdGltZW91dDsKKwlpbnQgcGt0cyA9IDA7CisJY2hhciBjOworCisJLyogd2FpdCBmb3IgZnJhbWVzIGF2YWlsYWJpbGl0eS4qLworCWlmICghcGNhcF9nZXRfcmluZ19mcmFtZShoYW5kbGUsIFRQX1NUQVRVU19VU0VSKSkgeworCQlzdHJ1Y3QgcG9sbGZkIHBvbGxpbmZvOworCQlpbnQgcmV0OworCisJCXBvbGxpbmZvLmZkID0gaGFuZGxlLT5mZDsKKwkJcG9sbGluZm8uZXZlbnRzID0gUE9MTElOOworCisJCWlmIChoYW5kbGUtPm1kLnRpbWVvdXQgPT0gMCkKKwkJCXRpbWVvdXQgPSAtMTsJLyogYmxvY2sgZm9yZXZlciAqLworCQllbHNlIGlmIChoYW5kbGUtPm1kLnRpbWVvdXQgPiAwKQorCQkJdGltZW91dCA9IGhhbmRsZS0+bWQudGltZW91dDsJLyogYmxvY2sgZm9yIHRoYXQgYW1vdW50IG9mIHRpbWUgKi8KKwkJZWxzZQorCQkJdGltZW91dCA9IDA7CS8qIG5vbi1ibG9ja2luZyBtb2RlIC0gcG9sbCB0byBwaWNrIHVwIGVycm9ycyAqLworCQlkbyB7CisJCQlyZXQgPSBwb2xsKCZwb2xsaW5mbywgMSwgdGltZW91dCk7CisJCQlpZiAocmV0IDwgMCAmJiBlcnJubyAhPSBFSU5UUikgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAKKwkJCQkJImNhbid0IHBvbGwgb24gcGFja2V0IHNvY2tldDogJXMiLAorCQkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQl9IGVsc2UgaWYgKHJldCA+IDAgJiYKKwkJCSAgICAocG9sbGluZm8ucmV2ZW50cyAmIChQT0xMSFVQfFBPTExSREhVUHxQT0xMRVJSfFBPTExOVkFMKSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoZXJlJ3Mgc29tZSBpbmRpY2F0aW9uIG90aGVyIHRoYW4KKwkJCQkgKiAieW91IGNhbiByZWFkIG9uIHRoaXMgZGVzY3JpcHRvciIgb24KKwkJCQkgKiB0aGUgZGVzY3JpcHRvci4KKwkJCQkgKi8KKwkJCQlpZiAocG9sbGluZm8ucmV2ZW50cyAmIChQT0xMSFVQIHwgUE9MTFJESFVQKSkgeworCQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwKKwkJCQkJCVBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCQkiSGFuZ3VwIG9uIHBhY2tldCBzb2NrZXQiKTsKKwkJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQkJfQorCQkJCWlmIChwb2xsaW5mby5yZXZlbnRzICYgUE9MTEVSUikgeworCQkJCQkvKgorCQkJCQkgKiBBIHJlY3YoKSB3aWxsIGdpdmUgdXMgdGhlCisJCQkJCSAqIGFjdHVhbCBlcnJvciBjb2RlLgorCQkJCQkgKgorCQkJCQkgKiBYWFggLSBtYWtlIHRoZSBzb2NrZXQgbm9uLWJsb2NraW5nPworCQkJCQkgKi8KKwkJCQkJaWYgKHJlY3YoaGFuZGxlLT5mZCwgJmMsIHNpemVvZiBjLAorCQkJCQkgICAgTVNHX1BFRUspICE9IC0xKQorCQkJCQkJY29udGludWU7CS8qIHdoYXQsIG5vIGVycm9yPyAqLworCQkJCQlpZiAoZXJybm8gPT0gRU5FVERPV04pIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBUaGUgZGV2aWNlIG9uIHdoaWNoIHdlJ3JlCisJCQkJCQkgKiBjYXB0dXJpbmcgd2VudCBhd2F5LgorCQkJCQkJICoKKwkJCQkJCSAqIFhYWCAtIHdlIHNob3VsZCByZWFsbHkgcmV0dXJuCisJCQkJCQkgKiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUCwKKwkJCQkJCSAqIGJ1dCBwY2FwX2Rpc3BhdGNoKCkgZXRjLgorCQkJCQkJICogYXJlbid0IGRlZmluZWQgdG8gcmV0dXJuCisJCQkJCQkgKiB0aGF0LgorCQkJCQkJICovCisJCQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwKKwkJCQkJCQlQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkJCSJUaGUgaW50ZXJmYWNlIHdlbnQgZG93biIpOworCQkJCQl9IGVsc2UgeworCQkJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsCisJCQkJCQkJUENBUF9FUlJCVUZfU0laRSwgCisJCQkJCQkJIkVycm9yIGNvbmRpdGlvbiBvbiBwYWNrZXQgc29ja2V0OiAlcyIsCisJCQkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJCQl9CisJCQkJaWYgKHBvbGxpbmZvLnJldmVudHMgJiBQT0xMTlZBTCkgeworCQkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwKKwkJCQkJCVBDQVBfRVJSQlVGX1NJWkUsIAorCQkJCQkJIkludmFsaWQgcG9sbGluZyByZXF1ZXN0IG9uIHBhY2tldCBzb2NrZXQiKTsKKwkJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQkJfQorICAJCQl9CisJCQkvKiBjaGVjayBmb3IgYnJlYWsgbG9vcCBjb25kaXRpb24gb24gaW50ZXJydXB0ZWQgc3lzY2FsbCovCisJCQlpZiAoaGFuZGxlLT5icmVha19sb29wKSB7CisJCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKKwkJCQlyZXR1cm4gUENBUF9FUlJPUl9CUkVBSzsKKwkJCX0KKwkJfSB3aGlsZSAocmV0IDwgMCk7CisJfQorCisJLyogbm9uLXBvc2l0aXZlIHZhbHVlcyBvZiBtYXhfcGFja2V0cyBhcmUgdXNlZCB0byByZXF1aXJlIGFsbCAKKwkgKiBwYWNrZXRzIGN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIHJpbmcgKi8KKwl3aGlsZSAoKHBrdHMgPCBtYXhfcGFja2V0cykgfHwgKG1heF9wYWNrZXRzIDw9IDApKSB7CisJCWludCBydW5fYnBmOworCQlzdHJ1Y3Qgc29ja2FkZHJfbGwgKnNsbDsKKwkJc3RydWN0IHBjYXBfcGt0aGRyIHBjYXBoZHI7CisJCXVuc2lnbmVkIGNoYXIgKmJwOworCQl1bmlvbiB0aGRyIGg7CisJCXVuc2lnbmVkIGludCB0cF9sZW47CisJCXVuc2lnbmVkIGludCB0cF9tYWM7CisJCXVuc2lnbmVkIGludCB0cF9zbmFwbGVuOworCQl1bnNpZ25lZCBpbnQgdHBfc2VjOworCQl1bnNpZ25lZCBpbnQgdHBfdXNlYzsKKworCQloLnJhdyA9IHBjYXBfZ2V0X3JpbmdfZnJhbWUoaGFuZGxlLCBUUF9TVEFUVVNfVVNFUik7CisJCWlmICghaC5yYXcpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGhhbmRsZS0+bWQudHBfdmVyc2lvbikgeworCQljYXNlIFRQQUNLRVRfVjE6CisJCQl0cF9sZW4JICAgPSBoLmgxLT50cF9sZW47CisJCQl0cF9tYWMJICAgPSBoLmgxLT50cF9tYWM7CisJCQl0cF9zbmFwbGVuID0gaC5oMS0+dHBfc25hcGxlbjsKKwkJCXRwX3NlYwkgICA9IGguaDEtPnRwX3NlYzsKKwkJCXRwX3VzZWMJICAgPSBoLmgxLT50cF91c2VjOworCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9UUEFDS0VUMgorCQljYXNlIFRQQUNLRVRfVjI6CisJCQl0cF9sZW4JICAgPSBoLmgyLT50cF9sZW47CisJCQl0cF9tYWMJICAgPSBoLmgyLT50cF9tYWM7CisJCQl0cF9zbmFwbGVuID0gaC5oMi0+dHBfc25hcGxlbjsKKwkJCXRwX3NlYwkgICA9IGguaDItPnRwX3NlYzsKKwkJCXRwX3VzZWMJICAgPSBoLmgyLT50cF9uc2VjIC8gMTAwMDsKKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgCisJCQkJInVuc3VwcG9ydGVkIHRwYWNrZXQgdmVyc2lvbiAlZCIsCisJCQkJaGFuZGxlLT5tZC50cF92ZXJzaW9uKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiBwZXJmb3JtIHNhbml0eSBjaGVjayBvbiBpbnRlcm5hbCBvZmZzZXQuICovCisJCWlmICh0cF9tYWMgKyB0cF9zbmFwbGVuID4gaGFuZGxlLT5idWZzaXplKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgCisJCQkJImNvcnJ1cHRlZCBmcmFtZSBvbiBrZXJuZWwgcmluZyBtYWMgIgorCQkJCSJvZmZzZXQgJWQgKyBjYXBsZW4gJWQgPiBmcmFtZSBsZW4gJWQiLCAKKwkJCQl0cF9tYWMsIHRwX3NuYXBsZW4sIGhhbmRsZS0+YnVmc2l6ZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQkvKiBydW4gZmlsdGVyIG9uIHJlY2VpdmVkIHBhY2tldAorCQkgKiBJZiB0aGUga2VybmVsIGZpbHRlcmluZyBpcyBlbmFibGVkIHdlIG5lZWQgdG8gcnVuIHRoZQorCQkgKiBmaWx0ZXIgdW50aWwgYWxsIHRoZSBmcmFtZXMgcHJlc2VudCBpbnRvIHRoZSByaW5nIAorCQkgKiBhdCBmaWx0ZXIgY3JlYXRpb24gdGltZSBhcmUgcHJvY2Vzc2VkLiAKKwkJICogSW4gc3VjaCBjYXNlIG1kLnVzZV9icGYgaXMgdXNlZCBhcyBhIGNvdW50ZXIgZm9yIHRoZSAKKwkJICogcGFja2V0IHdlIG5lZWQgdG8gZmlsdGVyLgorCQkgKiBOb3RlOiBhbHRlcm5hdGl2ZWx5IGl0IGNvdWxkIGJlIHBvc3NpYmxlIHRvIHN0b3AgYXBwbHlpbmcgCisJCSAqIHRoZSBmaWx0ZXIgd2hlbiB0aGUgcmluZyBiZWNhbWUgZW1wdHksIGJ1dCBpdCBjYW4gcG9zc2libHkKKwkJICogaGFwcGVuIGEgbG90IGxhdGVyLi4uICovCisJCWJwID0gKHVuc2lnbmVkIGNoYXIqKWgucmF3ICsgdHBfbWFjOworCQlydW5fYnBmID0gKCFoYW5kbGUtPm1kLnVzZV9icGYpIHx8IAorCQkJKChoYW5kbGUtPm1kLnVzZV9icGY+MSkgJiYgaGFuZGxlLT5tZC51c2VfYnBmLS0pOworCQlpZiAocnVuX2JwZiAmJiBoYW5kbGUtPmZjb2RlLmJmX2luc25zICYmIAorCQkJCShicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsIGJwLAorCQkJCQl0cF9sZW4sIHRwX3NuYXBsZW4pID09IDApKQorCQkJZ290byBza2lwOworCisJCS8qCisJCSAqIERvIGNoZWNrcyBiYXNlZCBvbiBwYWNrZXQgZGlyZWN0aW9uLgorCQkgKi8KKwkJc2xsID0gKHZvaWQgKiloLnJhdyArIFRQQUNLRVRfQUxJR04oaGFuZGxlLT5tZC50cF9oZHJsZW4pOworCQlpZiAoc2xsLT5zbGxfcGt0dHlwZSA9PSBQQUNLRVRfT1VUR09JTkcpIHsKKwkJCS8qCisJCQkgKiBPdXRnb2luZyBwYWNrZXQuCisJCQkgKiBJZiB0aGlzIGlzIGZyb20gdGhlIGxvb3BiYWNrIGRldmljZSwgcmVqZWN0IGl0OworCQkJICogd2UnbGwgc2VlIHRoZSBwYWNrZXQgYXMgYW4gaW5jb21pbmcgcGFja2V0IGFzIHdlbGwsCisJCQkgKiBhbmQgd2UgZG9uJ3Qgd2FudCB0byBzZWUgaXQgdHdpY2UuCisJCQkgKi8KKwkJCWlmIChzbGwtPnNsbF9pZmluZGV4ID09IGhhbmRsZS0+bWQubG9faWZpbmRleCkKKwkJCQlnb3RvIHNraXA7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgdXNlciBvbmx5IHdhbnRzIGluY29taW5nIHBhY2tldHMsIHJlamVjdCBpdC4KKwkJCSAqLworCQkJaWYgKGhhbmRsZS0+ZGlyZWN0aW9uID09IFBDQVBfRF9JTikKKwkJCQlnb3RvIHNraXA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSW5jb21pbmcgcGFja2V0LgorCQkJICogSWYgdGhlIHVzZXIgb25seSB3YW50cyBvdXRnb2luZyBwYWNrZXRzLCByZWplY3QgaXQuCisJCQkgKi8KKwkJCWlmIChoYW5kbGUtPmRpcmVjdGlvbiA9PSBQQ0FQX0RfT1VUKQorCQkJCWdvdG8gc2tpcDsKKwkJfQorCisJCS8qIGdldCByZXF1aXJlZCBwYWNrZXQgaW5mbyBmcm9tIHJpbmcgaGVhZGVyICovCisJCXBjYXBoZHIudHMudHZfc2VjID0gdHBfc2VjOworCQlwY2FwaGRyLnRzLnR2X3VzZWMgPSB0cF91c2VjOworCQlwY2FwaGRyLmNhcGxlbiA9IHRwX3NuYXBsZW47CisJCXBjYXBoZHIubGVuID0gdHBfbGVuOworCisJCS8qIGlmIHJlcXVpcmVkIGJ1aWxkIGluIHBsYWNlIHRoZSBzbGwgaGVhZGVyKi8KKwkJaWYgKGhhbmRsZS0+bWQuY29va2VkKSB7CisJCQlzdHJ1Y3Qgc2xsX2hlYWRlciAqaGRycDsKKworCQkJLyoKKwkJCSAqIFRoZSBrZXJuZWwgc2hvdWxkIGhhdmUgbGVmdCB1cyB3aXRoIGVub3VnaAorCQkJICogc3BhY2UgZm9yIGFuIHNsbCBoZWFkZXI7IGJhY2sgdXAgdGhlIHBhY2tldAorCQkJICogZGF0YSBwb2ludGVyIGludG8gdGhhdCBzcGFjZSwgYXMgdGhhdCdsbCBiZQorCQkJICogdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFja2V0IHdlIHBhc3MgdG8gdGhlCisJCQkgKiBjYWxsYmFjay4KKwkJCSAqLworCQkJYnAgLT0gU0xMX0hEUl9MRU47CisKKwkJCS8qCisJCQkgKiBMZXQncyBtYWtlIHN1cmUgdGhhdCdzIHBhc3QgdGhlIGVuZCBvZgorCQkJICogdGhlIHRwYWNrZXQgaGVhZGVyLCBpLmUuID49CisJCQkgKiAoKHVfY2hhciAqKXRoZHIgKyBUUEFDS0VUX0hEUkxFTiksIHNvIHdlCisJCQkgKiBkb24ndCBzdGVwIG9uIHRoZSBoZWFkZXIgd2hlbiB3ZSBjb25zdHJ1Y3QKKwkJCSAqIHRoZSBzbGwgaGVhZGVyLgorCQkJICovCisJCQlpZiAoYnAgPCAodV9jaGFyICopaC5yYXcgKworCQkJCQkgICBUUEFDS0VUX0FMSUdOKGhhbmRsZS0+bWQudHBfaGRybGVuKSArCisJCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpKSB7CisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsIAorCQkJCQkiY29va2VkLW1vZGUgZnJhbWUgZG9lc24ndCBoYXZlIHJvb20gZm9yIHNsbCBoZWFkZXIiKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCS8qCisJCQkgKiBPSywgdGhhdCB3b3JrZWQ7IGNvbnN0cnVjdCB0aGUgc2xsIGhlYWRlci4KKwkJCSAqLworCQkJaGRycCA9IChzdHJ1Y3Qgc2xsX2hlYWRlciAqKWJwOworCQkJaGRycC0+c2xsX3BrdHR5cGUgPSBtYXBfcGFja2V0X3R5cGVfdG9fc2xsX3R5cGUoCisJCQkJCQkJc2xsLT5zbGxfcGt0dHlwZSk7CisJCQloZHJwLT5zbGxfaGF0eXBlID0gaHRvbnMoc2xsLT5zbGxfaGF0eXBlKTsKKwkJCWhkcnAtPnNsbF9oYWxlbiA9IGh0b25zKHNsbC0+c2xsX2hhbGVuKTsKKwkJCW1lbWNweShoZHJwLT5zbGxfYWRkciwgc2xsLT5zbGxfYWRkciwgU0xMX0FERFJMRU4pOworCQkJaGRycC0+c2xsX3Byb3RvY29sID0gc2xsLT5zbGxfcHJvdG9jb2w7CisKKwkJCS8qIHVwZGF0ZSBwYWNrZXQgbGVuICovCisJCQlwY2FwaGRyLmNhcGxlbiArPSBTTExfSERSX0xFTjsKKwkJCXBjYXBoZHIubGVuICs9IFNMTF9IRFJfTEVOOworCQl9CisKKyNpZmRlZiBIQVZFX1RQQUNLRVQyCisJCWlmIChoYW5kbGUtPm1kLnRwX3ZlcnNpb24gPT0gVFBBQ0tFVF9WMiAmJiBoLmgyLT50cF92bGFuX3RjaSAmJgorCQkgICAgdHBfc25hcGxlbiA+PSAyICogRVRIX0FMRU4pIHsKKwkJCXN0cnVjdCB2bGFuX3RhZyAqdGFnOworCisJCQlicCAtPSBWTEFOX1RBR19MRU47CisJCQltZW1tb3ZlKGJwLCBicCArIFZMQU5fVEFHX0xFTiwgMiAqIEVUSF9BTEVOKTsKKworCQkJdGFnID0gKHN0cnVjdCB2bGFuX3RhZyAqKShicCArIDIgKiBFVEhfQUxFTik7CisJCQl0YWctPnZsYW5fdHBpZCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKKwkJCXRhZy0+dmxhbl90Y2kgPSBodG9ucyhoLmgyLT50cF92bGFuX3RjaSk7CisKKwkJCXBjYXBoZHIuY2FwbGVuICs9IFZMQU5fVEFHX0xFTjsKKwkJCXBjYXBoZHIubGVuICs9IFZMQU5fVEFHX0xFTjsKKwkJfQorI2VuZGlmCisKKwkJLyoKKwkJICogVGhlIG9ubHkgd2F5IHRvIHRlbGwgdGhlIGtlcm5lbCB0byBjdXQgb2ZmIHRoZQorCQkgKiBwYWNrZXQgYXQgYSBzbmFwc2hvdCBsZW5ndGggaXMgd2l0aCBhIGZpbHRlciBwcm9ncmFtOworCQkgKiBpZiB0aGVyZSdzIG5vIGZpbHRlciBwcm9ncmFtLCB0aGUga2VybmVsIHdvbid0IGN1dAorCQkgKiB0aGUgcGFja2V0IG9mZi4KKwkJICoKKwkJICogVHJpbSB0aGUgc25hcHNob3QgbGVuZ3RoIHRvIGJlIG5vIGxvbmdlciB0aGFuIHRoZQorCQkgKiBzcGVjaWZpZWQgc25hcHNob3QgbGVuZ3RoLgorCQkgKi8KKwkJaWYgKHBjYXBoZHIuY2FwbGVuID4gaGFuZGxlLT5zbmFwc2hvdCkKKwkJCXBjYXBoZHIuY2FwbGVuID0gaGFuZGxlLT5zbmFwc2hvdDsKKworCQkvKiBwYXNzIHRoZSBwYWNrZXQgdG8gdGhlIHVzZXIgKi8KKwkJcGt0cysrOworCQljYWxsYmFjayh1c2VyLCAmcGNhcGhkciwgYnApOworCQloYW5kbGUtPm1kLnBhY2tldHNfcmVhZCsrOworCitza2lwOgorCQkvKiBuZXh0IHBhY2tldCAqLworCQlzd2l0Y2ggKGhhbmRsZS0+bWQudHBfdmVyc2lvbikgeworCQljYXNlIFRQQUNLRVRfVjE6CisJCQloLmgxLT50cF9zdGF0dXMgPSBUUF9TVEFUVVNfS0VSTkVMOworCQkJYnJlYWs7CisjaWZkZWYgSEFWRV9UUEFDS0VUMgorCQljYXNlIFRQQUNLRVRfVjI6CisJCQloLmgyLT50cF9zdGF0dXMgPSBUUF9TVEFUVVNfS0VSTkVMOworCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQlpZiAoKytoYW5kbGUtPm9mZnNldCA+PSBoYW5kbGUtPmNjKQorCQkJaGFuZGxlLT5vZmZzZXQgPSAwOworCisJCS8qIGNoZWNrIGZvciBicmVhayBsb29wIGNvbmRpdGlvbiovCisJCWlmIChoYW5kbGUtPmJyZWFrX2xvb3ApIHsKKwkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gUENBUF9FUlJPUl9CUkVBSzsKKwkJfQorCX0KKwlyZXR1cm4gcGt0czsKK30KKworc3RhdGljIGludCAKK3BjYXBfc2V0ZmlsdGVyX2xpbnV4X21tYXAocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZmlsdGVyKQoreworCWludCBuLCBvZmZzZXQ7CisJaW50IHJldDsKKworCS8qCisJICogRG9uJ3QgcmV3cml0ZSAicmV0IiBpbnN0cnVjdGlvbnM7IHdlIGRvbid0IG5lZWQgdG8sIGFzCisJICogd2UncmUgbm90IHJlYWRpbmcgcGFja2V0cyB3aXRoIHJlY3Ztc2coKSwgYW5kIHdlIGRvbid0CisJICogd2FudCB0bywgYXMsIGJ5IG5vdCByZXdyaXRpbmcgdGhlbSwgdGhlIGtlcm5lbCBjYW4gYXZvaWQKKwkgKiBjb3B5aW5nIGV4dHJhIGRhdGEuCisJICovCisJcmV0ID0gcGNhcF9zZXRmaWx0ZXJfbGludXhfY29tbW9uKGhhbmRsZSwgZmlsdGVyLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGlmIHRoZSBrZXJuZWwgZmlsdGVyIGlzIGVuYWJsZWQsIHdlIG5lZWQgdG8gYXBwbHkgdGhlIGZpbHRlciBvbgorCSAqIGFsbCBwYWNrZXRzIHByZXNlbnQgaW50byB0aGUgcmluZy4gR2V0IGFuIHVwcGVyIGJvdW5kIG9mIHRoZWlyIG51bWJlcgorCSAqLworCWlmICghaGFuZGxlLT5tZC51c2VfYnBmKQorCQlyZXR1cm4gcmV0OworCisJLyogd2FsayB0aGUgcmluZyBiYWNrd2FyZCBhbmQgY291bnQgdGhlIGZyZWUgc2xvdCAqLworCW9mZnNldCA9IGhhbmRsZS0+b2Zmc2V0OworCWlmICgtLWhhbmRsZS0+b2Zmc2V0IDwgMCkKKwkJaGFuZGxlLT5vZmZzZXQgPSBoYW5kbGUtPmNjIC0gMTsKKwlmb3IgKG49MDsgbiA8IGhhbmRsZS0+Y2M7ICsrbikgeworCQlpZiAoLS1oYW5kbGUtPm9mZnNldCA8IDApCisJCQloYW5kbGUtPm9mZnNldCA9IGhhbmRsZS0+Y2MgLSAxOworCQlpZiAoIXBjYXBfZ2V0X3JpbmdfZnJhbWUoaGFuZGxlLCBUUF9TVEFUVVNfS0VSTkVMKSkKKwkJCWJyZWFrOworCX0KKworCS8qIGJlIGNhcmVmdWwgdG8gbm90IGNoYW5nZSBjdXJyZW50IHJpbmcgcG9zaXRpb24gKi8KKwloYW5kbGUtPm9mZnNldCA9IG9mZnNldDsKKworCS8qIHN0b3JlIHRoZSBudW1iZXIgb2YgcGFja2V0cyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgcmluZyAqLworCWhhbmRsZS0+bWQudXNlX2JwZiA9IDEgKyAoaGFuZGxlLT5jYyAtIG4pOworCXJldHVybiByZXQ7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1BBQ0tFVF9SSU5HICovCisKKworI2lmZGVmIEhBVkVfUEZfUEFDS0VUX1NPQ0tFVFMKKy8qCisgKiAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gZGV2aWNlIG5hbWUuIEZpbGwgZWJ1ZiBhbmQgcmV0dXJuCisgKiAgLTEgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludAoraWZhY2VfZ2V0X2lkKGludCBmZCwgY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXN0cnVjdCBpZnJlcQlpZnI7CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBkZXZpY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKworCWlmIChpb2N0bChmZCwgU0lPQ0dJRklOREVYLCAmaWZyKSA9PSAtMSkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJTSU9DR0lGSU5ERVg6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIGlmci5pZnJfaWZpbmRleDsKK30KKworLyoKKyAqICBCaW5kIHRoZSBzb2NrZXQgYXNzb2NpYXRlZCB3aXRoIEZEIHRvIHRoZSBnaXZlbiBkZXZpY2UuCisgKiAgUmV0dXJuIDEgb24gc3VjY2VzcywgMCBpZiB3ZSBzaG91bGQgdHJ5IGEgU09DS19QQUNLRVQgc29ja2V0LAorICogIG9yIGEgUENBUF9FUlJPUl8gdmFsdWUgb24gYSBoYXJkIGVycm9yLgorICovCitzdGF0aWMgaW50CitpZmFjZV9iaW5kKGludCBmZCwgaW50IGlmaW5kZXgsIGNoYXIgKmVidWYpCit7CisJc3RydWN0IHNvY2thZGRyX2xsCXNsbDsKKwlpbnQJCQllcnI7CisJc29ja2xlbl90CQllcnJsZW4gPSBzaXplb2YoZXJyKTsKKworCW1lbXNldCgmc2xsLCAwLCBzaXplb2Yoc2xsKSk7CisJc2xsLnNsbF9mYW1pbHkJCT0gQUZfUEFDS0VUOworCXNsbC5zbGxfaWZpbmRleAkJPSBpZmluZGV4OworCXNsbC5zbGxfcHJvdG9jb2wJPSBodG9ucyhFVEhfUF9BTEwpOworCisJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNsbCwgc2l6ZW9mKHNsbCkpID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFTkVURE9XTikgeworCQkJLyoKKwkJCSAqIFJldHVybiBhICJuZXR3b3JrIGRvd24iIGluZGljYXRpb24sIHNvIHRoYXQKKwkJCSAqIHRoZSBhcHBsaWNhdGlvbiBjYW4gcmVwb3J0IHRoYXQgcmF0aGVyIHRoYW4KKwkJCSAqIHNheWluZyB3ZSBoYWQgYSBteXN0ZXJpb3VzIGZhaWx1cmUgYW5kCisJCQkgKiBzdWdnZXN0IHRoYXQgdGhleSByZXBvcnQgYSBwcm9ibGVtIHRvIHRoZQorCQkJICogbGlicGNhcCBkZXZlbG9wZXJzLgorCQkJICovCisJCQlyZXR1cm4gUENBUF9FUlJPUl9JRkFDRV9OT1RfVVA7CisJCX0gZWxzZSB7CisJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAiYmluZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCX0KKworCS8qIEFueSBwZW5kaW5nIGVycm9ycywgZS5nLiwgbmV0d29yayBpcyBkb3duPyAqLworCisJaWYgKGdldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAmZXJyLCAmZXJybGVuKSA9PSAtMSkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJImdldHNvY2tvcHQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZXJyID09IEVORVRET1dOKSB7CisJCS8qCisJCSAqIFJldHVybiBhICJuZXR3b3JrIGRvd24iIGluZGljYXRpb24sIHNvIHRoYXQKKwkJICogdGhlIGFwcGxpY2F0aW9uIGNhbiByZXBvcnQgdGhhdCByYXRoZXIgdGhhbgorCQkgKiBzYXlpbmcgd2UgaGFkIGEgbXlzdGVyaW91cyBmYWlsdXJlIGFuZAorCQkgKiBzdWdnZXN0IHRoYXQgdGhleSByZXBvcnQgYSBwcm9ibGVtIHRvIHRoZQorCQkgKiBsaWJwY2FwIGRldmVsb3BlcnMuCisJCSAqLworCQlyZXR1cm4gUENBUF9FUlJPUl9JRkFDRV9OT1RfVVA7CisJfSBlbHNlIGlmIChlcnIgPiAwKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiYmluZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIElXX01PREVfTU9OSVRPUgorLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucy4KKyAqIFJldHVybnMgMSBpZiBpdCBkb2VzLCAwIGlmIGl0IGRvZXNuJ3QsIFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UKKyAqIGlmIHRoZSBkZXZpY2UgZG9lc24ndCBldmVuIGV4aXN0LgorICovCitzdGF0aWMgaW50CitoYXNfd2V4dChpbnQgc29ja19mZCwgY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXN0cnVjdCBpd3JlcSBpcmVxOworCisJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAorCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ0dJV05BTUUsICZpcmVxKSA+PSAwKQorCQlyZXR1cm4gMTsJLyogeWVzICovCisJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIiVzOiBTSU9DR0lXUFJJVjogJXMiLCBkZXZpY2UsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZXJybm8gPT0gRU5PREVWKQorCQlyZXR1cm4gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlciBtZSBzaSB2YSBuZSBsYSBjaXR0YSBkb2xlbnRlLAorICogUGVyIG1lIHNpIHZhIG5lIGwnZXR0ZXJubyBkb2xvcmUsCisgKgkuLi4KKyAqIExhc2NpYXRlIG9nbmUgc3BlcmFuemEsIHZvaSBjaCdpbnRyYXRlLgorICoKKyAqIFhYWCAtIGFpcm1vbi1uZyBkb2VzIHNwZWNpYWwgc3R1ZmYgd2l0aCB0aGUgT3Jpbm9jbyBkcml2ZXIgYW5kIHRoZQorICogd2xhbi1uZyBkcml2ZXIuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJTU9OSVRPUl9XRVhULAorCU1PTklUT1JfSE9TVEFQLAorCU1PTklUT1JfUFJJU00sCisJTU9OSVRPUl9QUklTTTU0LAorCU1PTklUT1JfQUNYMTAwLAorCU1PTklUT1JfUlQyNTAwLAorCU1PTklUT1JfUlQyNTcwLAorCU1PTklUT1JfUlQ3MywKKwlNT05JVE9SX1JUTDhYWFgKK30gbW9uaXRvcl90eXBlOworCisvKgorICogVXNlIHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zLCBpZiB3ZSBoYXZlIHRoZW0sIHRvIHRyeSB0byB0dXJuIG1vbml0b3IgbW9kZQorICogb24gaWYgaXQncyBub3QgYWxyZWFkeSBvbi4KKyAqCisgKiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBpZiB3ZSBkb24ndCBzdXBwb3J0IHRoZSBXaXJlbGVzcyBFeHRlbnNpb25zCisgKiBvbiB0aGlzIGRldmljZSwgb3IgYSBQQ0FQX0VSUk9SXyB2YWx1ZSBpZiB3ZSBkbyBzdXBwb3J0IHRoZW0gYnV0CisgKiB3ZSB3ZXJlbid0IGFibGUgdG8gdHVybiBtb25pdG9yIG1vZGUgb24uCisgKi8KK3N0YXRpYyBpbnQKK2VudGVyX3JmbW9uX21vZGVfd2V4dChwY2FwX3QgKmhhbmRsZSwgaW50IHNvY2tfZmQsIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwkvKgorCSAqIFhYWCAtIGF0IGxlYXN0IHNvbWUgYWRhcHRlcnMgcmVxdWlyZSBub24tV2lyZWxlc3MgRXh0ZW5zaW9ucworCSAqIG1lY2hhbmlzbXMgdG8gdHVybiBtb25pdG9yIG1vZGUgb24uCisJICoKKwkgKiBBdGhlcm9zIGNhcmRzIG1pZ2h0IHJlcXVpcmUgdGhhdCBhIHNlcGFyYXRlICJtb25pdG9yIHZpcnR1YWwgYWNjZXNzCisJICogcG9pbnQiIGJlIGNyZWF0ZWQsIHdpdGggbGF0ZXIgdmVyc2lvbnMgb2YgdGhlIG1hZHdpZmkgZHJpdmVyLgorCSAqIGFpcm1vbi1uZyBkb2VzICJ3bGFuY29uZmlnIGF0aCBjcmVhdGUgd2xhbmRldiB7aWZ9IHdsYW5tb2RlCisJICogbW9uaXRvciAtYnNzaWQiLCB3aGljaCBhcHBhcmVudGx5IHNwaXRzIG91dCBhIGxpbmUgImF0aE4iCisJICogd2hlcmUgImF0aE4iIGlzIHRoZSBtb25pdG9yIG1vZGUgZGV2aWNlLiAgVG8gbGVhdmUgbW9uaXRvcgorCSAqIG1vZGUsIGl0IGRlc3Ryb3lzIHRoZSBtb25pdG9yIG1vZGUgZGV2aWNlLgorCSAqCisJICogU29tZSBJbnRlbCBDZW50cmlubyBhZGFwdGVycyBtaWdodCByZXF1aXJlIHByaXZhdGUgaW9jdGxzIHRvIGdldAorCSAqIHJhZGlvIGhlYWRlcnM7IHRoZSBpcHcyMjAwIGFuZCBpcHczOTQ1IGRyaXZlcnMgYWxsb3cgeW91IHRvCisJICogY29uZmlndXJlIGEgc2VwYXJhdGUgInJ0YXBOIiBpbnRlcmZhY2UgdG8gY2FwdHVyZSBpbiBtb25pdG9yCisJICogbW9kZSB3aXRob3V0IHByZXZlbnRpbmcgdGhlIGFkYXB0ZXIgZnJvbSBvcGVyYXRpbmcgbm9ybWFsbHkuCisJICogKGFpcm1vbi1uZyBkb2Vzbid0IGFwcGVhciB0byB1c2UgdGhhdCwgdGhvdWdoLikKKwkgKgorCSAqIEl0IHdvdWxkIGJlIFRydWx5IFdvbmRlcmZ1bCBpZiBtYWM4MDIxMSBhbmQgbmw4MDIxMSBjbGVhbmVkIHRoaXMKKwkgKiB1cCwgYW5kIGlmIGFsbCBkcml2ZXJzIHdlcmUgY29udmVydGVkIHRvIG1hYzgwMjExIGRyaXZlcnMuCisJICoKKwkgKiBJZiBpbnRlcmZhY2Uge2lmfSBpcyBhIG1hYzgwMjExIGRyaXZlciwgdGhlIGZpbGUKKwkgKiAvc3lzL2NsYXNzL25ldC97aWZ9L3BoeTgwMjExIGlzIGEgc3ltbGluayB0bworCSAqIC9zeXMvY2xhc3MvaWVlZTgwMjExL3twaHlkZXZ9LCBmb3Igc29tZSB7cGh5ZGV2fS4KKwkgKgorCSAqIE9uIEZlZG9yYSA5LCB3aXRoIGEgMi42LjI2LjMtMjkga2VybmVsLCBteSBaeWRhcyBzdGljaywgYXQKKwkgKiBsZWFzdCwgaGFzIGEgIndtYXN0ZXIwIiBkZXZpY2UgYW5kIGEgIndsYW4wIiBkZXZpY2U7IHRoZQorCSAqIGxhdHRlciBpcyB0aGUgb25lIHdpdGggdGhlIElQIGFkZHJlc3MuICBCb3RoIHNob3cgdXAgaW4KKwkgKiAidGNwZHVtcCAtRCIgb3V0cHV0LiAgQ2FwdHVyaW5nIG9uIHRoZSB3bWFzdGVyMCBkZXZpY2UKKwkgKiBjYXB0dXJlcyB3aXRoIDgwMi4xMSBoZWFkZXJzLgorCSAqCisJICogYWlybW9uLW5nIHNlYXJjaGVzIHRocm91Z2ggL3N5cy9jbGFzcy9uZXQgZm9yIGRldmljZXMgbmFtZWQKKwkgKiBtb25OLCBzdGFydGluZyB3aXRoIG1vbjA7IGFzIHNvb24gYXMgb25lICpkb2Vzbid0KiBleGlzdCwKKwkgKiBpdCBjaG9vc2VzIHRoYXQgYXMgdGhlIG1vbml0b3IgZGV2aWNlIG5hbWUuICBJZiB0aGUgIml3IgorCSAqIGNvbW1hbmQgZXhpc3RzLCBpdCBkb2VzICJpdyBkZXYge2lmfSBpbnRlcmZhY2UgYWRkIHttb25pZn0KKwkgKiB0eXBlIG1vbml0b3IiLCB3aGVyZSB7bW9uaWZ9IGlzIHRoZSBtb25pdG9yIGRldmljZS4gIEl0CisJICogdGhlbiAoc2lnaCkgc2xlZXBzIC4xIHNlY29uZCwgYW5kIHRoZW4gY29uZmlndXJlcyB0aGUKKwkgKiBkZXZpY2UgdXAuICBPdGhlcndpc2UsIGlmIC9zeXMvY2xhc3MvaWVlZTgwMjExL3twaHlkZXZ9L2FkZF9pZmFjZQorCSAqIGlzIGEgZmlsZSwgaXQgd3JpdGVzIHttb25kZXZ9LCB3aXRob3V0IGEgbmV3bGluZSwgdG8gdGhhdCBmaWxlLAorCSAqIGFuZCBhZ2FpbiAoc2lnaCkgc2xlZXBzIC4xIHNlY29uZCwgYW5kIHRoZW4gaXdjb25maWcncyB0aGF0CisJICogZGV2aWNlIGludG8gbW9uaXRvciBtb2RlIGFuZCBjb25maWd1cmVzIGl0IHVwLiAgT3RoZXJ3aXNlLAorCSAqIHlvdSBjYW4ndCBkbyBtb25pdG9yIG1vZGUuCisJICoKKwkgKiBBbGwgdGhlc2UgZGV2aWNlcyBhcmUgImdsdWVkIiB0b2dldGhlciBieSBoYXZpbmcgdGhlCisJICogL3N5cy9jbGFzcy9uZXQve2RldmljZX0vcGh5ODAyMTEgbGlua3MgcG9pbnRpbmcgdG8gdGhlIHNhbWUKKwkgKiBwbGFjZSwgc28sIGdpdmVuIGEgd21hc3Rlciwgd2xhbiwgb3IgbW9uIGRldmljZSwgeW91IGNhbgorCSAqIGZpbmQgdGhlIG90aGVyIGRldmljZXMgYnkgbG9va2luZyBmb3IgZGV2aWNlcyB3aXRoCisJICogdGhlIHNhbWUgcGh5ODAyMTEgbGluay4KKwkgKgorCSAqIFRvIHR1cm4gbW9uaXRvciBtb2RlIG9mZiwgZGVsZXRlIHRoZSBtb25pdG9yIGludGVyZmFjZSwKKwkgKiBlaXRoZXIgd2l0aCAiaXcgZGV2IHttb25pZn0gaW50ZXJmYWNlIGRlbCIgb3IgYnkgc2VuZGluZworCSAqIHttb25pZn0sIHdpdGggbm8gTkwsIGRvd24gL3N5cy9jbGFzcy9pZWVlODAyMTEve3BoeWRldn0vcmVtb3ZlX2lmYWNlCisJICoKKwkgKiBOb3RlOiBpZiB5b3UgdHJ5IHRvIGNyZWF0ZSBhIG1vbml0b3IgZGV2aWNlIG5hbWVkICJtb25OIiwgYW5kCisJICogdGhlcmUncyBhbHJlYWR5IGEgIm1vbk4iIGRldmljZSwgaXQgZmFpbHMsIGFzIGxlYXN0IHdpdGgKKwkgKiB0aGUgbmV0bGluayBpbnRlcmZhY2UgKHdoaWNoIGlzIHdoYXQgaXcgdXNlcyksIHdpdGggYSByZXR1cm4KKwkgKiB2YWx1ZSBvZiAtRU5GSUxFLiAgKFJldHVybiB2YWx1ZXMgYXJlIG5lZ2F0aXZlIGVycm5vcy4pICBXZQorCSAqIGNvdWxkIHByb2JhYmx5IHVzZSB0aGF0IHRvIGZpbmQgYW4gdW51c2VkIGRldmljZS4KKwkgKi8KKwlpbnQgZXJyOworCXN0cnVjdCBpd3JlcSBpcmVxOworCXN0cnVjdCBpd19wcml2X2FyZ3MgKnByaXY7CisJbW9uaXRvcl90eXBlIG1vbnR5cGU7CisJaW50IGk7CisJX191MzIgY21kOworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IG9sZGZsYWdzOworCWludCBhcmdzWzJdOworCWludCBjaGFubmVsOworCisJLyoKKwkgKiBEb2VzIHRoaXMgZGV2aWNlICpzdXBwb3J0KiB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucz8KKwkgKi8KKwllcnIgPSBoYXNfd2V4dChzb2NrX2ZkLCBkZXZpY2UsIGhhbmRsZS0+ZXJyYnVmKTsKKwlpZiAoZXJyIDw9IDApCisJCXJldHVybiBlcnI7CS8qIGVpdGhlciBpdCBkb2Vzbid0IG9yIHRoZSBkZXZpY2UgZG9lc24ndCBldmVuIGV4aXN0ICovCisJLyoKKwkgKiBTdGFydCBvdXQgYXNzdW1pbmcgd2UgaGF2ZSBubyBwcml2YXRlIGV4dGVuc2lvbnMgdG8gY29udHJvbAorCSAqIHJhZGlvIG1ldGFkYXRhLgorCSAqLworCW1vbnR5cGUgPSBNT05JVE9SX1dFWFQ7CisJY21kID0gMDsKKworCS8qCisJICogVHJ5IHRvIGdldCBhbGwgdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgcHJpdmF0ZSBpb2N0bHMKKwkgKiBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UuCisJICoKKwkgKiBGaXJzdCwgZ2V0IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgd2UgbmVlZCwgYnkgc3VwcGx5aW5nIG5vCisJICogYnVmZmVyIGFuZCBhIGxlbmd0aCBvZiAwLiAgSWYgdGhlIGRldmljZSBzdXBwb3J0cyBwcml2YXRlCisJICogaW9jdGxzLCBpdCBzaG91bGQgcmV0dXJuIEUyQklHLCB3aXRoIGlyZXEudS5kYXRhLmxlbmd0aCBzZXQKKwkgKiB0byB0aGUgbGVuZ3RoIHdlIG5lZWQuICBJZiBpdCBkb2Vzbid0IHN1cHBvcnQgdGhlbSwgaXQgc2hvdWxkCisJICogcmV0dXJuIEVPUE5PVFNVUFAuCisJICovCisJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAorCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwlpcmVxLnUuZGF0YS5wb2ludGVyID0gKHZvaWQgKilhcmdzOworCWlyZXEudS5kYXRhLmxlbmd0aCA9IDA7CisJaXJlcS51LmRhdGEuZmxhZ3MgPSAwOworCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lXUFJJViwgJmlyZXEpICE9IC0xKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIiVzOiBTSU9DR0lXUFJJViB3aXRoIGEgemVyby1sZW5ndGggYnVmZmVyIGRpZG4ndCBmYWlsISIsCisJCSAgICBkZXZpY2UpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisJaWYgKGVycm5vICE9IEVPUE5PVFNVUFApIHsKKwkJLyoKKwkJICogT0ssIGl0J3Mgbm90IGFzIGlmIHRoZXJlIGFyZSBubyBwcml2YXRlIGlvY3Rscy4KKwkJICovCisJCWlmIChlcnJubyAhPSBFMkJJRykgeworCQkJLyoKKwkJCSAqIEZhaWxlZC4KKwkJCSAqLworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIiVzOiBTSU9DR0lXUFJJVjogJXMiLCBkZXZpY2UsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKworCQkvKgorCQkgKiBPSywgdHJ5IHRvIGdldCB0aGUgbGlzdCBvZiBwcml2YXRlIGlvY3Rscy4KKwkJICovCisJCXByaXYgPSBtYWxsb2MoaXJlcS51LmRhdGEubGVuZ3RoICogc2l6ZW9mIChzdHJ1Y3QgaXdfcHJpdl9hcmdzKSk7CisJCWlmIChwcml2ID09IE5VTEwpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKwkJaXJlcS51LmRhdGEucG9pbnRlciA9ICh2b2lkICopcHJpdjsKKwkJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSVdQUklWLCAmaXJlcSkgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICIlczogU0lPQ0dJV1BSSVY6ICVzIiwgZGV2aWNlLAorCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZyZWUocHJpdik7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCisJCS8qCisJCSAqIExvb2sgZm9yIHByaXZhdGUgaW9jdGxzIHRvIHR1cm4gbW9uaXRvciBtb2RlIG9uIG9yLCBpZgorCQkgKiBtb25pdG9yIG1vZGUgaXMgb24sIHRvIHNldCB0aGUgaGVhZGVyIHR5cGUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgaXJlcS51LmRhdGEubGVuZ3RoOyBpKyspIHsKKwkJCWlmIChzdHJjbXAocHJpdltpXS5uYW1lLCAibW9uaXRvcl90eXBlIikgPT0gMCkgeworCQkJCS8qCisJCQkJICogSG9zdGFwIGRyaXZlciwgdXNlIHRoaXMgb25lLgorCQkJCSAqIFNldCBtb25pdG9yIG1vZGUgZmlyc3QuCisJCQkJICogWW91IGNhbiBzZXQgaXQgdG8gMCB0byBnZXQgRExUX0lFRUU4MDIxMSwKKwkJCQkgKiAxIHRvIGdldCBETFRfUFJJU00sIDIgdG8gZ2V0CisJCQkJICogRExUX0lFRUU4MDIxMV9SQURJT19BVlMsIGFuZCwgd2l0aCBtb3JlCisJCQkJICogcmVjZW50IHZlcnNpb25zIG9mIHRoZSBkcml2ZXIsIDMgdG8gZ2V0CisJCQkJICogRExUX0lFRUU4MDIxMV9SQURJTy4KKwkJCQkgKi8KKwkJCQlpZiAoKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1RZUEVfTUFTSykgIT0gSVdfUFJJVl9UWVBFX0lOVCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCEocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfU0laRV9GSVhFRCkpCisJCQkJCWJyZWFrOworCQkJCWlmICgocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfU0laRV9NQVNLKSAhPSAxKQorCQkJCQlicmVhazsKKwkJCQltb250eXBlID0gTU9OSVRPUl9IT1NUQVA7CisJCQkJY21kID0gcHJpdltpXS5jbWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RyY21wKHByaXZbaV0ubmFtZSwgInNldF9wcmlzbWhkciIpID09IDApIHsKKwkJCQkvKgorCQkJCSAqIFByaXNtNTQgZHJpdmVyLCB1c2UgdGhpcyBvbmUuCisJCQkJICogU2V0IG1vbml0b3IgbW9kZSBmaXJzdC4KKwkJCQkgKiBZb3UgY2FuIHNldCBpdCB0byAyIHRvIGdldCBETFRfSUVFRTgwMjExCisJCQkJICogb3IgMyBvciBnZXQgRExUX1BSSVNNLgorCQkJCSAqLworCQkJCWlmICgocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSAhPSBJV19QUklWX1RZUEVfSU5UKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIShwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX01BU0spICE9IDEpCisJCQkJCWJyZWFrOworCQkJCW1vbnR5cGUgPSBNT05JVE9SX1BSSVNNNTQ7CisJCQkJY21kID0gcHJpdltpXS5jbWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RyY21wKHByaXZbaV0ubmFtZSwgImZvcmNlcHJpc21oZWFkZXIiKSA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBSVDI1NzAgZHJpdmVyLCB1c2UgdGhpcyBvbmUuCisJCQkJICogRG8gdGhpcyBhZnRlciB0dXJuaW5nIG1vbml0b3IgbW9kZSBvbi4KKwkJCQkgKiBZb3UgY2FuIHNldCBpdCB0byAxIHRvIGdldCBETFRfUFJJU00gb3IgMgorCQkJCSAqIHRvIGdldCBETFRfSUVFRTgwMjExLgorCQkJCSAqLworCQkJCWlmICgocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSAhPSBJV19QUklWX1RZUEVfSU5UKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIShwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX01BU0spICE9IDEpCisJCQkJCWJyZWFrOworCQkJCW1vbnR5cGUgPSBNT05JVE9SX1JUMjU3MDsKKwkJCQljbWQgPSBwcml2W2ldLmNtZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjbXAocHJpdltpXS5uYW1lLCAiZm9yY2VwcmlzbSIpID09IDApIHsKKwkJCQkvKgorCQkJCSAqIFJUNzMgZHJpdmVyLCB1c2UgdGhpcyBvbmUuCisJCQkJICogRG8gdGhpcyBhZnRlciB0dXJuaW5nIG1vbml0b3IgbW9kZSBvbi4KKwkJCQkgKiBJdHMgYXJndW1lbnQgaXMgYSAqc3RyaW5nKjsgeW91IGNhbgorCQkJCSAqIHNldCBpdCB0byAiMSIgdG8gZ2V0IERMVF9QUklTTSBvciAiMiIKKwkJCQkgKiB0byBnZXQgRExUX0lFRUU4MDIxMS4KKwkJCQkgKi8KKwkJCQlpZiAoKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1RZUEVfTUFTSykgIT0gSVdfUFJJVl9UWVBFX0NIQVIpCisJCQkJCWJyZWFrOworCQkJCWlmIChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKQorCQkJCQlicmVhazsKKwkJCQltb250eXBlID0gTU9OSVRPUl9SVDczOworCQkJCWNtZCA9IHByaXZbaV0uY21kOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0cmNtcChwcml2W2ldLm5hbWUsICJwcmlzbWhkciIpID09IDApIHsKKwkJCQkvKgorCQkJCSAqIE9uZSBvZiB0aGUgUlRMOHh4eCBkcml2ZXJzLCB1c2UgdGhpcyBvbmUuCisJCQkJICogSXQgY2FuIG9ubHkgYmUgZG9uZSBhZnRlciBtb25pdG9yIG1vZGUKKwkJCQkgKiBoYXMgYmVlbiB0dXJuZWQgb24uICBZb3UgY2FuIHNldCBpdCB0byAxCisJCQkJICogdG8gZ2V0IERMVF9QUklTTSBvciAwIHRvIGdldCBETFRfSUVFRTgwMjExLgorCQkJCSAqLworCQkJCWlmICgocHJpdltpXS5zZXRfYXJncyAmIElXX1BSSVZfVFlQRV9NQVNLKSAhPSBJV19QUklWX1RZUEVfSU5UKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIShwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX0ZJWEVEKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX01BU0spICE9IDEpCisJCQkJCWJyZWFrOworCQkJCW1vbnR5cGUgPSBNT05JVE9SX1JUTDhYWFg7CisJCQkJY21kID0gcHJpdltpXS5jbWQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc3RyY21wKHByaXZbaV0ubmFtZSwgInJmbW9udHgiKSA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBSVDI1MDAgb3IgUlQ2MSBkcml2ZXIsIHVzZSB0aGlzIG9uZS4KKwkJCQkgKiBJdCBoYXMgb25lIG9uZS1ieXRlIHBhcmFtZXRlcjsgc2V0CisJCQkJICogdS5kYXRhLmxlbmd0aCB0byAxIGFuZCB1LmRhdGEucG9pbnRlciB0bworCQkJCSAqIHBvaW50IHRvIHRoZSBwYXJhbWV0ZXIuCisJCQkJICogSXQgZG9lc24ndCBpdHNlbGYgdHVybiBtb25pdG9yIG1vZGUgb24uCisJCQkJICogWW91IGNhbiBzZXQgaXQgdG8gMSB0byBhbGxvdyB0cmFuc21pdHRpbmcKKwkJCQkgKiBpbiBtb25pdG9yIG1vZGUoPykgYW5kIGdldCBETFRfSUVFRTgwMjExLAorCQkJCSAqIG9yIHNldCBpdCB0byAwIHRvIGRpc2FsbG93IHRyYW5zbWl0dGluZyBpbgorCQkJCSAqIG1vbml0b3IgbW9kZSg/KSBhbmQgZ2V0IERMVF9QUklTTS4KKwkJCQkgKi8KKwkJCQlpZiAoKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1RZUEVfTUFTSykgIT0gSVdfUFJJVl9UWVBFX0lOVCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9TSVpFX01BU0spICE9IDIpCisJCQkJCWJyZWFrOworCQkJCW1vbnR5cGUgPSBNT05JVE9SX1JUMjUwMDsKKwkJCQljbWQgPSBwcml2W2ldLmNtZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjbXAocHJpdltpXS5uYW1lLCAibW9uaXRvciIpID09IDApIHsKKwkJCQkvKgorCQkJCSAqIEVpdGhlciBBQ1gxMDAgb3IgaG9zdGFwLCB1c2UgdGhpcyBvbmUuCisJCQkJICogSXQgdHVybnMgbW9uaXRvciBtb2RlIG9uLgorCQkJCSAqIElmIGl0IHRha2VzIHR3byBhcmd1bWVudHMsIGl0J3MgQUNYMTAwOworCQkJCSAqIHRoZSBmaXJzdCBhcmd1bWVudCBpcyAxIGZvciBETFRfUFJJU00KKwkJCQkgKiBvciAyIGZvciBETFRfSUVFRTgwMjExLCBhbmQgdGhlIHNlY29uZAorCQkJCSAqIGFyZ3VtZW50IGlzIHRoZSBjaGFubmVsIG9uIHdoaWNoIHRvCisJCQkJICogcnVuLiAgSWYgaXQgdGFrZXMgb25lIGFyZ3VtZW50LCBpdCdzCisJCQkJICogSG9zdEFQLCBhbmQgdGhlIGFyZ3VtZW50IGlzIDIgZm9yCisJCQkJICogRExUX0lFRUU4MDIxMSBhbmQgMyBmb3IgRExUX1BSSVNNLgorCQkJCSAqCisJCQkJICogSWYgd2Ugc2VlIHRoaXMsIHdlIGRvbid0IHF1aXQsIGFzIHRoaXMKKwkJCQkgKiBtaWdodCBiZSBhIHZlcnNpb24gb2YgdGhlIGhvc3RhcCBkcml2ZXIKKwkJCQkgKiB0aGF0IGFsc28gc3VwcG9ydHMgIm1vbml0b3JfdHlwZSIuCisJCQkJICovCisJCQkJaWYgKChwcml2W2ldLnNldF9hcmdzICYgSVdfUFJJVl9UWVBFX01BU0spICE9IElXX1BSSVZfVFlQRV9JTlQpCisJCQkJCWJyZWFrOworCQkJCWlmICghKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfRklYRUQpKQorCQkJCQlicmVhazsKKwkJCQlzd2l0Y2ggKHByaXZbaV0uc2V0X2FyZ3MgJiBJV19QUklWX1NJWkVfTUFTSykgeworCisJCQkJY2FzZSAxOgorCQkJCQltb250eXBlID0gTU9OSVRPUl9QUklTTTsKKwkJCQkJY21kID0gcHJpdltpXS5jbWQ7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAyOgorCQkJCQltb250eXBlID0gTU9OSVRPUl9BQ1gxMDA7CisJCQkJCWNtZCA9IHByaXZbaV0uY21kOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCQlmcmVlKHByaXYpOworCX0KKworCS8qCisJICogWFhYIC0gaXB3Mzk0NT8gIGlzbGlzbT8KKwkgKi8KKworCS8qCisJICogR2V0IHRoZSBvbGQgbW9kZS4KKwkgKi8KKwlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lXTU9ERSwgJmlyZXEpID09IC0xKSB7CisJCS8qCisJCSAqIFdlIHByb2JhYmx5IHdvbid0IGJlIGFibGUgdG8gc2V0IHRoZSBtb2RlLCBlaXRoZXIuCisJCSAqLworCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJfQorCisJLyoKKwkgKiBJcyBpdCBjdXJyZW50bHkgaW4gbW9uaXRvciBtb2RlPworCSAqLworCWlmIChpcmVxLnUubW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJLyoKKwkJICogWWVzLiAgSnVzdCBsZWF2ZSB0aGluZ3MgYXMgdGhleSBhcmUuCisJCSAqIFdlIGRvbid0IG9mZmVyIG11bHRpcGxlIGxpbmstbGF5ZXIgdHlwZXMsIGFzCisJCSAqIGNoYW5naW5nIHRoZSBsaW5rLWxheWVyIHR5cGUgb3V0IGZyb20gdW5kZXIKKwkJICogc29tZWJvZHkgZWxzZSBjYXB0dXJpbmcgaW4gbW9uaXRvciBtb2RlIHdvdWxkCisJCSAqIGJlIGNvbnNpZGVyZWQgcnVkZS4KKwkJICovCisJCXJldHVybiAxOworCX0KKwkvKgorCSAqIE5vLiAgV2UgaGF2ZSB0byBwdXQgdGhlIGFkYXB0ZXIgaW50byByZm1vbiBtb2RlLgorCSAqLworCisJLyoKKwkgKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgYXJyYW5nZSB0byBoYXZlCisJICogInBjYXBfY2xvc2VfYWxsKCkiIGNhbGxlZCB3aGVuIHdlIGV4aXQuCisJICovCisJaWYgKCFwY2FwX2RvX2FkZGV4aXQoaGFuZGxlKSkgeworCQkvKgorCQkgKiAiYXRleGl0KCkiIGZhaWxlZDsgZG9uJ3QgcHV0IHRoZSBpbnRlcmZhY2UKKwkJICogaW4gcmZtb24gbW9kZSwganVzdCBnaXZlIHVwLgorCQkgKi8KKwkJcmV0dXJuIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCX0KKworCS8qCisJICogU2F2ZSB0aGUgb2xkIG1vZGUuCisJICovCisJaGFuZGxlLT5tZC5vbGRtb2RlID0gaXJlcS51Lm1vZGU7CisKKwkvKgorCSAqIFB1dCB0aGUgYWRhcHRlciBpbiByZm1vbiBtb2RlLiAgSG93IHdlIGRvIHRoaXMgZGVwZW5kcworCSAqIG9uIHdoZXRoZXIgd2UgaGF2ZSBhIHNwZWNpYWwgcHJpdmF0ZSBpb2N0bCBvciBub3QuCisJICovCisJaWYgKG1vbnR5cGUgPT0gTU9OSVRPUl9QUklTTSkgeworCQkvKgorCQkgKiBXZSBoYXZlIHRoZSAibW9uaXRvciIgcHJpdmF0ZSBpb2N0bCwgYnV0IG5vbmUgb2YKKwkJICogdGhlIG90aGVyIHByaXZhdGUgaW9jdGxzLiAgVXNlIHRoaXMsIGFuZCBzZWxlY3QKKwkJICogdGhlIFByaXNtIGhlYWRlci4KKwkJICoKKwkJICogSWYgaXQgZmFpbHMsIGp1c3QgZmFsbCBiYWNrIG9uIFNJT0NTSVdNT0RFLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJaXJlcS51LmRhdGEubGVuZ3RoID0gMTsJLyogMSBhcmd1bWVudCAqLworCQlhcmdzWzBdID0gMzsJLyogcmVxdWVzdCBQcmlzbSBoZWFkZXIgKi8KKwkJbWVtY3B5KGlyZXEudS5uYW1lLCBhcmdzLCBJRk5BTVNJWik7CisJCWlmIChpb2N0bChzb2NrX2ZkLCBjbWQsICZpcmVxKSAhPSAtMSkgeworCQkJLyoKKwkJCSAqIFN1Y2Nlc3MuCisJCQkgKiBOb3RlIHRoYXQgd2UgaGF2ZSB0byBwdXQgdGhlIG9sZCBtb2RlIGJhY2sKKwkJCSAqIHdoZW4gd2UgY2xvc2UgdGhlIGRldmljZS4KKwkJCSAqLworCQkJaGFuZGxlLT5tZC5tdXN0X2RvX29uX2Nsb3NlIHw9IE1VU1RfQ0xFQVJfUkZNT047CisKKwkJCS8qCisJCQkgKiBBZGQgdGhpcyB0byB0aGUgbGlzdCBvZiBwY2FwcyB0byBjbG9zZQorCQkJICogd2hlbiB3ZSBleGl0LgorCQkJICovCisJCQlwY2FwX2FkZF90b19wY2Fwc190b19jbG9zZShoYW5kbGUpOworCisJCQlyZXR1cm4gMTsKKwkJfQorCisJCS8qCisJCSAqIEZhaWx1cmUuICBGYWxsIGJhY2sgb24gU0lPQ1NJV01PREUuCisJCSAqLworCX0KKworCS8qCisJICogRmlyc3QsIHRha2UgdGhlIGludGVyZmFjZSBkb3duIGlmIGl0J3MgdXA7IG90aGVyd2lzZSwgd2UKKwkgKiBtaWdodCBnZXQgRUJVU1kuCisJICovCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgZGV2aWNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IENhbid0IGdldCBmbGFnczogJXMiLCBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKwlvbGRmbGFncyA9IDA7CisJaWYgKGlmci5pZnJfZmxhZ3MgJiBJRkZfVVApIHsKKwkJb2xkZmxhZ3MgPSBpZnIuaWZyX2ZsYWdzOworCQlpZnIuaWZyX2ZsYWdzICY9IH5JRkZfVVA7CisJCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DU0lGRkxBR1MsICZpZnIpID09IC0xKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiJXM6IENhbid0IHNldCBmbGFnczogJXMiLCBkZXZpY2UsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCX0KKworCS8qCisJICogVGhlbiB0dXJuIG1vbml0b3IgbW9kZSBvbi4KKwkgKi8KKwlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCWlyZXEudS5tb2RlID0gSVdfTU9ERV9NT05JVE9SOworCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DU0lXTU9ERSwgJmlyZXEpID09IC0xKSB7CisJCS8qCisJCSAqIFNjaWVudGlzdCwgeW91J3ZlIGZhaWxlZC4KKwkJICogQnJpbmcgdGhlIGludGVyZmFjZSBiYWNrIHVwIGlmIHdlIHNodXQgaXQgZG93bi4KKwkJICovCisJCWlmci5pZnJfZmxhZ3MgPSBvbGRmbGFnczsKKwkJaWYgKGlvY3RsKHNvY2tfZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICIlczogQ2FuJ3Qgc2V0IGZsYWdzOiAlcyIsIGRldmljZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwl9CisKKwkvKgorCSAqIFhYWCAtIGFpcm1vbi1uZyBkb2VzICJpd2NvbmZpZyB7aWZ9IGtleSBvZmYiIGFmdGVyIHNldHRpbmcKKwkgKiBtb25pdG9yIG1vZGUgYW5kIHNldHRpbmcgdGhlIGNoYW5uZWwsIGFuZCB0aGVuIGRvZXMKKwkgKiAiaXdjb25maWcgdXAiLgorCSAqLworCisJLyoKKwkgKiBOb3cgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSByYWRpbyBoZWFkZXIuCisJICovCisJc3dpdGNoIChtb250eXBlKSB7CisKKwljYXNlIE1PTklUT1JfV0VYVDoKKwkJLyoKKwkJICogV2UgZG9uJ3QgaGF2ZSBhbnkgcHJpdmF0ZSBpb2N0bCB0byBzZXQgdGhlIGhlYWRlci4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBNT05JVE9SX0hPU1RBUDoKKwkJLyoKKwkJICogVHJ5IHRvIHNlbGVjdCB0aGUgcmFkaW90YXAgaGVhZGVyLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJYXJnc1swXSA9IDM7CS8qIHJlcXVlc3QgcmFkaW90YXAgaGVhZGVyICovCisJCW1lbWNweShpcmVxLnUubmFtZSwgYXJncywgc2l6ZW9mIChpbnQpKTsKKwkJaWYgKGlvY3RsKHNvY2tfZmQsIGNtZCwgJmlyZXEpICE9IC0xKQorCQkJYnJlYWs7CS8qIHN1Y2Nlc3MgKi8KKworCQkvKgorCQkgKiBUaGF0IGZhaWxlZC4gIFRyeSB0byBzZWxlY3QgdGhlIEFWUyBoZWFkZXIuCisJCSAqLworCQltZW1zZXQoJmlyZXEsIDAsIHNpemVvZiBpcmVxKTsKKwkJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAorCQkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwkJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCQlhcmdzWzBdID0gMjsJLyogcmVxdWVzdCBBVlMgaGVhZGVyICovCisJCW1lbWNweShpcmVxLnUubmFtZSwgYXJncywgc2l6ZW9mIChpbnQpKTsKKwkJaWYgKGlvY3RsKHNvY2tfZmQsIGNtZCwgJmlyZXEpICE9IC0xKQorCQkJYnJlYWs7CS8qIHN1Y2Nlc3MgKi8KKworCQkvKgorCQkgKiBUaGF0IGZhaWxlZC4gIFRyeSB0byBzZWxlY3QgdGhlIFByaXNtIGhlYWRlci4KKwkJICovCisJCW1lbXNldCgmaXJlcSwgMCwgc2l6ZW9mIGlyZXEpOworCQlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCQlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJCWFyZ3NbMF0gPSAxOwkvKiByZXF1ZXN0IFByaXNtIGhlYWRlciAqLworCQltZW1jcHkoaXJlcS51Lm5hbWUsIGFyZ3MsIHNpemVvZiAoaW50KSk7CisJCWlvY3RsKHNvY2tfZmQsIGNtZCwgJmlyZXEpOworCQlicmVhazsKKworCWNhc2UgTU9OSVRPUl9QUklTTToKKwkJLyoKKwkJICogVGhlIHByaXZhdGUgaW9jdGwgZmFpbGVkLgorCQkgKi8KKwkJYnJlYWs7CisKKwljYXNlIE1PTklUT1JfUFJJU001NDoKKwkJLyoKKwkJICogU2VsZWN0IHRoZSBQcmlzbSBoZWFkZXIuCisJCSAqLworCQltZW1zZXQoJmlyZXEsIDAsIHNpemVvZiBpcmVxKTsKKwkJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAorCQkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwkJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCQlhcmdzWzBdID0gMzsJLyogcmVxdWVzdCBQcmlzbSBoZWFkZXIgKi8KKwkJbWVtY3B5KGlyZXEudS5uYW1lLCBhcmdzLCBzaXplb2YgKGludCkpOworCQlpb2N0bChzb2NrX2ZkLCBjbWQsICZpcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIE1PTklUT1JfQUNYMTAwOgorCQkvKgorCQkgKiBHZXQgdGhlIGN1cnJlbnQgY2hhbm5lbC4KKwkJICovCisJCW1lbXNldCgmaXJlcSwgMCwgc2l6ZW9mIGlyZXEpOworCQlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCQlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJCWlmIChpb2N0bChzb2NrX2ZkLCBTSU9DR0lXRlJFUSwgJmlyZXEpID09IC0xKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiJXM6IFNJT0NHSVdGUkVROiAlcyIsIGRldmljZSwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJfQorCQljaGFubmVsID0gaXJlcS51LmZyZXEubTsKKworCQkvKgorCQkgKiBTZWxlY3QgdGhlIFByaXNtIGhlYWRlciwgYW5kIHNldCB0aGUgY2hhbm5lbCB0byB0aGUKKwkJICogY3VycmVudCB2YWx1ZS4KKwkJICovCisJCW1lbXNldCgmaXJlcSwgMCwgc2l6ZW9mIGlyZXEpOworCQlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCQlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJCWFyZ3NbMF0gPSAxOwkJLyogcmVxdWVzdCBQcmlzbSBoZWFkZXIgKi8KKwkJYXJnc1sxXSA9IGNoYW5uZWw7CS8qIHNldCBjaGFubmVsICovCisJCW1lbWNweShpcmVxLnUubmFtZSwgYXJncywgMipzaXplb2YgKGludCkpOworCQlpb2N0bChzb2NrX2ZkLCBjbWQsICZpcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIE1PTklUT1JfUlQyNTAwOgorCQkvKgorCQkgKiBEaXNhbGxvdyB0cmFuc21pc3Npb24gLSB0aGF0IHR1cm5zIG9uIHRoZQorCQkgKiBQcmlzbSBoZWFkZXIuCisJCSAqLworCQltZW1zZXQoJmlyZXEsIDAsIHNpemVvZiBpcmVxKTsKKwkJc3RybmNweShpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSwgZGV2aWNlLAorCQkgICAgc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lKTsKKwkJaXJlcS5pZnJfaWZybi5pZnJuX25hbWVbc2l6ZW9mIGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lIC0gMV0gPSAwOworCQlhcmdzWzBdID0gMDsJLyogZGlzYWxsb3cgdHJhbnNtaXR0aW5nICovCisJCW1lbWNweShpcmVxLnUubmFtZSwgYXJncywgc2l6ZW9mIChpbnQpKTsKKwkJaW9jdGwoc29ja19mZCwgY21kLCAmaXJlcSk7CisJCWJyZWFrOworCisJY2FzZSBNT05JVE9SX1JUMjU3MDoKKwkJLyoKKwkJICogRm9yY2UgdGhlIFByaXNtIGhlYWRlci4KKwkJICovCisJCW1lbXNldCgmaXJlcSwgMCwgc2l6ZW9mIGlyZXEpOworCQlzdHJuY3B5KGlyZXEuaWZyX2lmcm4uaWZybl9uYW1lLCBkZXZpY2UsCisJCSAgICBzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUpOworCQlpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZVtzaXplb2YgaXJlcS5pZnJfaWZybi5pZnJuX25hbWUgLSAxXSA9IDA7CisJCWFyZ3NbMF0gPSAxOwkvKiByZXF1ZXN0IFByaXNtIGhlYWRlciAqLworCQltZW1jcHkoaXJlcS51Lm5hbWUsIGFyZ3MsIHNpemVvZiAoaW50KSk7CisJCWlvY3RsKHNvY2tfZmQsIGNtZCwgJmlyZXEpOworCQlicmVhazsKKworCWNhc2UgTU9OSVRPUl9SVDczOgorCQkvKgorCQkgKiBGb3JjZSB0aGUgUHJpc20gaGVhZGVyLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJaXJlcS51LmRhdGEubGVuZ3RoID0gMTsJLyogMSBhcmd1bWVudCAqLworCQlpcmVxLnUuZGF0YS5wb2ludGVyID0gIjEiOworCQlpcmVxLnUuZGF0YS5mbGFncyA9IDA7CisJCWlvY3RsKHNvY2tfZmQsIGNtZCwgJmlyZXEpOworCQlicmVhazsKKworCWNhc2UgTU9OSVRPUl9SVEw4WFhYOgorCQkvKgorCQkgKiBGb3JjZSB0aGUgUHJpc20gaGVhZGVyLgorCQkgKi8KKwkJbWVtc2V0KCZpcmVxLCAwLCBzaXplb2YgaXJlcSk7CisJCXN0cm5jcHkoaXJlcS5pZnJfaWZybi5pZnJuX25hbWUsIGRldmljZSwKKwkJICAgIHNpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSk7CisJCWlyZXEuaWZyX2lmcm4uaWZybl9uYW1lW3NpemVvZiBpcmVxLmlmcl9pZnJuLmlmcm5fbmFtZSAtIDFdID0gMDsKKwkJYXJnc1swXSA9IDE7CS8qIHJlcXVlc3QgUHJpc20gaGVhZGVyICovCisJCW1lbWNweShpcmVxLnUubmFtZSwgYXJncywgc2l6ZW9mIChpbnQpKTsKKwkJaW9jdGwoc29ja19mZCwgY21kLCAmaXJlcSk7CisJCWJyZWFrOworCX0KKworCS8qCisJICogTm93IGJyaW5nIHRoZSBpbnRlcmZhY2UgYmFjayB1cCBpZiB3ZSBicm91Z2h0IGl0IGRvd24uCisJICovCisJaWYgKG9sZGZsYWdzICE9IDApIHsKKwkJaWZyLmlmcl9mbGFncyA9IG9sZGZsYWdzOworCQlpZiAoaW9jdGwoc29ja19mZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKSA9PSAtMSkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgIiVzOiBDYW4ndCBzZXQgZmxhZ3M6ICVzIiwgZGV2aWNlLCBzdHJlcnJvcihlcnJubykpOworCisJCQkvKgorCQkJICogQXQgbGVhc3QgdHJ5IHRvIHJlc3RvcmUgdGhlIG9sZCBtb2RlIG9uIHRoZQorCQkJICogaW50ZXJmYWNlLgorCQkJICovCisJCQlpZiAoaW9jdGwoaGFuZGxlLT5mZCwgU0lPQ1NJV01PREUsICZpcmVxKSA9PSAtMSkgeworCQkJCS8qCisJCQkJICogU2NpZW50aXN0LCB5b3UndmUgZmFpbGVkLgorCQkJCSAqLworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCSAgICAiQ2FuJ3QgcmVzdG9yZSBpbnRlcmZhY2Ugd2lyZWxlc3MgbW9kZSAoU0lPQ1NJV01PREUgZmFpbGVkOiAlcykuXG4iCisJCQkJICAgICJQbGVhc2UgYWRqdXN0IG1hbnVhbGx5LlxuIiwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0KKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisJfQorCisJLyoKKwkgKiBOb3RlIHRoYXQgd2UgaGF2ZSB0byBwdXQgdGhlIG9sZCBtb2RlIGJhY2sgd2hlbiB3ZQorCSAqIGNsb3NlIHRoZSBkZXZpY2UuCisJICovCisJaGFuZGxlLT5tZC5tdXN0X2RvX29uX2Nsb3NlIHw9IE1VU1RfQ0xFQVJfUkZNT047CisKKwkvKgorCSAqIEFkZCB0aGlzIHRvIHRoZSBsaXN0IG9mIHBjYXBzIHRvIGNsb3NlIHdoZW4gd2UgZXhpdC4KKwkgKi8KKwlwY2FwX2FkZF90b19wY2Fwc190b19jbG9zZShoYW5kbGUpOworCisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogSVdfTU9ERV9NT05JVE9SICovCisKKy8qCisgKiBUcnkgdmFyaW91cyBtZWNoYW5pc21zIHRvIGVudGVyIG1vbml0b3IgbW9kZS4KKyAqLworc3RhdGljIGludAorZW50ZXJfcmZtb25fbW9kZShwY2FwX3QgKmhhbmRsZSwgaW50IHNvY2tfZmQsIGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKyNpZiBkZWZpbmVkKEhBVkVfTElCTkwpIHx8IGRlZmluZWQoSVdfTU9ERV9NT05JVE9SKQorCWludCByZXQ7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTElCTkwKKwlyZXQgPSBlbnRlcl9yZm1vbl9tb2RlX21hYzgwMjExKGhhbmRsZSwgc29ja19mZCwgZGV2aWNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsJLyogZXJyb3IgYXR0ZW1wdGluZyB0byBkbyBzbyAqLworCWlmIChyZXQgPT0gMSkKKwkJcmV0dXJuIDE7CS8qIHN1Y2Nlc3MgKi8KKyNlbmRpZiAvKiBIQVZFX0xJQk5MICovCisKKyNpZmRlZiBJV19NT0RFX01PTklUT1IKKwlyZXQgPSBlbnRlcl9yZm1vbl9tb2RlX3dleHQoaGFuZGxlLCBzb2NrX2ZkLCBkZXZpY2UpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwkvKiBlcnJvciBhdHRlbXB0aW5nIHRvIGRvIHNvICovCisJaWYgKHJldCA9PSAxKQorCQlyZXR1cm4gMTsJLyogc3VjY2VzcyAqLworI2VuZGlmIC8qIElXX01PREVfTU9OSVRPUiAqLworCisJLyoKKwkgKiBFaXRoZXIgbm9uZSBvZiB0aGUgbWVjaGFuaXNtcyB3ZSBrbm93IGFib3V0IHdvcmsgb3Igbm9uZQorCSAqIG9mIHRob3NlIG1lY2hhbmlzbXMgYXJlIGF2YWlsYWJsZSwgc28gd2UgY2FuJ3QgZG8gbW9uaXRvcgorCSAqIG1vZGUuCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGaW5kIG91dCBpZiB3ZSBoYXZlIGFueSBmb3JtIG9mIGZyYWdtZW50YXRpb24vcmVhc3NlbWJseSBvZmZsb2FkaW5nLgorICoKKyAqIFdlIGRvIHNvIHVzaW5nIFNJT0NFVEhUT09MIGNoZWNraW5nIGZvciB2YXJpb3VzIHR5cGVzIG9mIG9mZmxvYWRpbmc7CisgKiBpZiBTSU9DRVRIVE9PTCBpc24ndCBkZWZpbmVkLCBvciB3ZSBkb24ndCBoYXZlIGFueSAjZGVmaW5lcyBmb3IgYW55CisgKiBvZiB0aGUgdHlwZXMgb2Ygb2ZmbG9hZGluZywgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyB0byBjaGVjaywgc28KKyAqIHdlIGp1c3Qgc2F5ICJubywgd2UgZG9uJ3QiLgorICovCisjaWYgZGVmaW5lZChTSU9DRVRIVE9PTCkgJiYgKGRlZmluZWQoRVRIVE9PTF9HVFNPKSB8fCBkZWZpbmVkKEVUSFRPT0xfR1VGTykgfHwgZGVmaW5lZChFVEhUT09MX0dHU08pIHx8IGRlZmluZWQoRVRIVE9PTF9HRkxBR1MpIHx8IGRlZmluZWQoRVRIVE9PTF9HR1JPKSkKK3N0YXRpYyBpbnQKK2lmYWNlX2V0aHRvb2xfaW9jdGwocGNhcF90ICpoYW5kbGUsIGludCBjbWQsIGNvbnN0IGNoYXIgKmNtZG5hbWUpCit7CisJc3RydWN0IGlmcmVxCWlmcjsKKwlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBldmFsOworCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5KGlmci5pZnJfbmFtZSwgaGFuZGxlLT5vcHQuc291cmNlLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJZXZhbC5jbWQgPSBjbWQ7CisJaWZyLmlmcl9kYXRhID0gKGNhZGRyX3QpJmV2YWw7CisJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NFVEhUT09MLCAmaWZyKSA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRU9QTk9UU1VQUCkgeworCQkJLyoKKwkJCSAqIE9LLCBsZXQncyBqdXN0IHJldHVybiAwLCB3aGljaCwgaW4gb3VyCisJCQkgKiBjYXNlLCBlaXRoZXIgbWVhbnMgIm5vLCB3aGF0IHdlJ3JlIGFza2luZworCQkJICogYWJvdXQgaXMgbm90IGVuYWJsZWQiIG9yICJhbGwgdGhlIGZsYWdzCisJCQkgKiBhcmUgY2xlYXIgKGkuZS4sIG5vdGhpbmcgaXMgZW5hYmxlZCkiLgorCQkJICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogU0lPRVRIVE9PTCglcykgaW9jdGwgZmFpbGVkOiAlcyIsIGhhbmRsZS0+b3B0LnNvdXJjZSwKKwkJICAgIGNtZG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIGV2YWwuZGF0YTsJCit9CisKK3N0YXRpYyBpbnQKK2lmYWNlX2dldF9vZmZsb2FkKHBjYXBfdCAqaGFuZGxlKQoreworCWludCByZXQ7CisKKyNpZmRlZiBFVEhUT09MX0dUU08KKwlyZXQgPSBpZmFjZV9ldGh0b29sX2lvY3RsKGhhbmRsZSwgRVRIVE9PTF9HVFNPLCAiRVRIVE9PTF9HVFNPIik7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmIChyZXQpCisJCXJldHVybiAxOwkvKiBUQ1Agc2VnbWVudGF0aW9uIG9mZmxvYWRpbmcgb24gKi8KKyNlbmRpZgorCisjaWZkZWYgRVRIVE9PTF9HVUZPCisJcmV0ID0gaWZhY2VfZXRodG9vbF9pb2N0bChoYW5kbGUsIEVUSFRPT0xfR1VGTywgIkVUSFRPT0xfR1VGTyIpOworCWlmIChyZXQgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMTsJLyogVURQIGZyYWdtZW50YXRpb24gb2ZmbG9hZGluZyBvbiAqLworI2VuZGlmCisKKyNpZmRlZiBFVEhUT09MX0dHU08KKwkvKgorCSAqIFhYWCAtIHdpbGwgdGhpcyBjYXVzZSBsYXJnZSB1bnNlZ21lbnRlZCBwYWNrZXRzIHRvIGJlCisJICogaGFuZGVkIHRvIFBGX1BBQ0tFVCBzb2NrZXRzIG9uIHRyYW5zbWlzc2lvbj8gIElmIG5vdCwKKwkgKiB0aGlzIG5lZWQgbm90IGJlIGNoZWNrZWQuCisJICovCisJcmV0ID0gaWZhY2VfZXRodG9vbF9pb2N0bChoYW5kbGUsIEVUSFRPT0xfR0dTTywgIkVUSFRPT0xfR0dTTyIpOworCWlmIChyZXQgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAocmV0KQorCQlyZXR1cm4gMTsJLyogZ2VuZXJpYyBzZWdtZW50YXRpb24gb2ZmbG9hZGluZyBvbiAqLworI2VuZGlmCisKKyNpZmRlZiBFVEhUT09MX0dGTEFHUworCXJldCA9IGlmYWNlX2V0aHRvb2xfaW9jdGwoaGFuZGxlLCBFVEhUT09MX0dGTEFHUywgIkVUSFRPT0xfR0ZMQUdTIik7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmIChyZXQgJiBFVEhfRkxBR19MUk8pCisJCXJldHVybiAxOwkvKiBsYXJnZSByZWNlaXZlIG9mZmxvYWRpbmcgb24gKi8KKyNlbmRpZgorCisjaWZkZWYgRVRIVE9PTF9HR1JPCisJLyoKKwkgKiBYWFggLSB3aWxsIHRoaXMgY2F1c2UgbGFyZ2UgcmVhc3NlbWJsZWQgcGFja2V0cyB0byBiZQorCSAqIGhhbmRlZCB0byBQRl9QQUNLRVQgc29ja2V0cyBvbiByZWNlaXB0PyAgSWYgbm90LAorCSAqIHRoaXMgbmVlZCBub3QgYmUgY2hlY2tlZC4KKwkgKi8KKwlyZXQgPSBpZmFjZV9ldGh0b29sX2lvY3RsKGhhbmRsZSwgRVRIVE9PTF9HR1JPLCAiRVRIVE9PTF9HR1JPIik7CisJaWYgKHJldCA9PSAtMSkKKwkJcmV0dXJuIC0xOworCWlmIChyZXQpCisJCXJldHVybiAxOwkvKiBnZW5lcmljIChsYXJnZSkgcmVjZWl2ZSBvZmZsb2FkaW5nIG9uICovCisjZW5kaWYKKworCXJldHVybiAwOworfQorI2Vsc2UgLyogU0lPQ0VUSFRPT0wgKi8KK3N0YXRpYyBpbnQKK2lmYWNlX2dldF9vZmZsb2FkKHBjYXBfdCAqaGFuZGxlIF9VXykKK3sKKwkvKgorCSAqIFhYWCAtIGRvIHdlIG5lZWQgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gaWYgd2UgZG9uJ3QKKwkgKiBoYXZlIHRoZSBldGh0b29sIGlvY3Rscz8gIElmIHNvLCBob3cgZG8gd2UgZG8gdGhhdD8KKwkgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBTSU9DRVRIVE9PTCAqLworCisjZW5kaWYgLyogSEFWRV9QRl9QQUNLRVRfU09DS0VUUyAqLworCisvKiA9PT09PSBGdW5jdGlvbnMgdG8gaW50ZXJmYWNlIHRvIHRoZSBvbGRlciBrZXJuZWxzID09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogVHJ5IHRvIG9wZW4gYSBwYWNrZXQgc29ja2V0IHVzaW5nIHRoZSBvbGQga2VybmVsIGludGVyZmFjZS4KKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzIGFuZCBhIFBDQVBfRVJST1JfIHZhbHVlIG9uIGFuIGVycm9yLgorICovCitzdGF0aWMgaW50CithY3RpdmF0ZV9vbGQocGNhcF90ICpoYW5kbGUpCit7CisJaW50CQlhcnB0eXBlOworCXN0cnVjdCBpZnJlcQlpZnI7CisJY29uc3QgY2hhcgkqZGV2aWNlID0gaGFuZGxlLT5vcHQuc291cmNlOworCXN0cnVjdCB1dHNuYW1lCXV0c25hbWU7CisJaW50CQltdHU7CisKKwkvKiBPcGVuIHRoZSBzb2NrZXQgKi8KKworCWhhbmRsZS0+ZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19QQUNLRVQsIGh0b25zKEVUSF9QX0FMTCkpOworCWlmIChoYW5kbGUtPmZkID09IC0xKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJzb2NrZXQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlpZiAoZXJybm8gPT0gRVBFUk0gfHwgZXJybm8gPT0gRUFDQ0VTKSB7CisJCQkvKgorCQkJICogWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIHRoZQorCQkJICogc29ja2V0LgorCQkJICovCisJCQlyZXR1cm4gUENBUF9FUlJPUl9QRVJNX0RFTklFRDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBPdGhlciBlcnJvci4KKwkJCSAqLworCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCX0KKwl9CisKKwkvKiBJdCB3b3JrZWQgLSB3ZSBhcmUgdXNpbmcgdGhlIG9sZCBpbnRlcmZhY2UgKi8KKwloYW5kbGUtPm1kLnNvY2tfcGFja2V0ID0gMTsKKworCS8qIC4uLndoaWNoIG1lYW5zIHdlIGdldCB0aGUgbGluay1sYXllciBoZWFkZXIuICovCisJaGFuZGxlLT5tZC5jb29rZWQgPSAwOworCisJLyogQmluZCB0byB0aGUgZ2l2ZW4gZGV2aWNlICovCisKKwlpZiAoc3RyY21wKGRldmljZSwgImFueSIpID09IDApIHsKKwkJc3RybmNweShoYW5kbGUtPmVycmJ1ZiwgInBjYXBfYWN0aXZhdGU6IFRoZSBcImFueVwiIGRldmljZSBpc24ndCBzdXBwb3J0ZWQgb24gMi4wWy54XS1rZXJuZWwgc3lzdGVtcyIsCisJCQlQQ0FQX0VSUkJVRl9TSVpFKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCWlmIChpZmFjZV9iaW5kX29sZChoYW5kbGUtPmZkLCBkZXZpY2UsIGhhbmRsZS0+ZXJyYnVmKSA9PSAtMSkKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisKKwkvKgorCSAqIFRyeSB0byBnZXQgdGhlIGxpbmstbGF5ZXIgdHlwZS4KKwkgKi8KKwlhcnB0eXBlID0gaWZhY2VfZ2V0X2FycHR5cGUoaGFuZGxlLT5mZCwgZGV2aWNlLCBoYW5kbGUtPmVycmJ1Zik7CisJaWYgKGFycHR5cGUgPCAwKQorCQlyZXR1cm4gUENBUF9FUlJPUjsKKworCS8qCisJICogVHJ5IHRvIGZpbmQgdGhlIERMVF8gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoYXQKKwkgKiBsaW5rLWxheWVyIHR5cGUuCisJICovCisJbWFwX2FycGhyZF90b19kbHQoaGFuZGxlLCBhcnB0eXBlLCAwKTsKKwlpZiAoaGFuZGxlLT5saW5rdHlwZSA9PSAtMSkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAidW5rbm93biBhcnB0eXBlICVkIiwgYXJwdHlwZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qIEdvIHRvIHByb21pc2MgbW9kZSBpZiByZXF1ZXN0ZWQgKi8KKworCWlmIChoYW5kbGUtPm9wdC5wcm9taXNjKSB7CisJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBkZXZpY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwkJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NHSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAiU0lPQ0dJRkZMQUdTOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SOworCQl9CisJCWlmICgoaWZyLmlmcl9mbGFncyAmIElGRl9QUk9NSVNDKSA9PSAwKSB7CisJCQkvKgorCQkJICogUHJvbWlzY3VvdXMgbW9kZSBpc24ndCBjdXJyZW50bHkgb24sCisJCQkgKiBzbyB0dXJuIGl0IG9uLCBhbmQgcmVtZW1iZXIgdGhhdAorCQkJICogd2Ugc2hvdWxkIHR1cm4gaXQgb2ZmIHdoZW4gdGhlCisJCQkgKiBwY2FwX3QgaXMgY2xvc2VkLgorCQkJICovCisKKwkJCS8qCisJCQkgKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgYXJyYW5nZQorCQkJICogdG8gaGF2ZSAicGNhcF9jbG9zZV9hbGwoKSIgY2FsbGVkIHdoZW4KKwkJCSAqIHdlIGV4aXQuCisJCQkgKi8KKwkJCWlmICghcGNhcF9kb19hZGRleGl0KGhhbmRsZSkpIHsKKwkJCQkvKgorCQkJCSAqICJhdGV4aXQoKSIgZmFpbGVkOyBkb24ndCBwdXQKKwkJCQkgKiB0aGUgaW50ZXJmYWNlIGluIHByb21pc2N1b3VzCisJCQkJICogbW9kZSwganVzdCBnaXZlIHVwLgorCQkJCSAqLworCQkJCXJldHVybiBQQ0FQX0VSUk9SOworCQkJfQorCisJCQlpZnIuaWZyX2ZsYWdzIHw9IElGRl9QUk9NSVNDOworCQkJaWYgKGlvY3RsKGhhbmRsZS0+ZmQsIFNJT0NTSUZGTEFHUywgJmlmcikgPT0gLTEpIHsKKwkJCSAgICAgICAgc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSAiU0lPQ1NJRkZMQUdTOiAlcyIsCisJCQkJCSBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQl9CisJCQloYW5kbGUtPm1kLm11c3RfZG9fb25fY2xvc2UgfD0gTVVTVF9DTEVBUl9QUk9NSVNDOworCisJCQkvKgorCQkJICogQWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2YgcGNhcHMKKwkJCSAqIHRvIGNsb3NlIHdoZW4gd2UgZXhpdC4KKwkJCSAqLworCQkJcGNhcF9hZGRfdG9fcGNhcHNfdG9fY2xvc2UoaGFuZGxlKTsKKwkJfQorCX0KKworCS8qCisJICogQ29tcHV0ZSB0aGUgYnVmZmVyIHNpemUuCisJICoKKwkgKiBXZSdyZSB1c2luZyBTT0NLX1BBQ0tFVCwgc28gdGhpcyBtaWdodCBiZSBhIDIuMFsueF0KKwkgKiBrZXJuZWwsIGFuZCBtaWdodCByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgLSBjaGVjay4KKwkgKi8KKwlpZiAodW5hbWUoJnV0c25hbWUpIDwgMCB8fAorCSAgICBzdHJuY21wKHV0c25hbWUucmVsZWFzZSwgIjIuMCIsIDMpID09IDApIHsKKwkJLyoKKwkJICogRWl0aGVyIHdlIGNvdWxkbid0IGZpbmQgb3V0IHdoYXQga2VybmVsIHJlbGVhc2UKKwkJICogdGhpcyBpcywgb3IgaXQncyBhIDIuMFsueF0ga2VybmVsLgorCQkgKgorCQkgKiBJbiB0aGUgMi4wWy54XSBrZXJuZWwsIGEgInJlY3Zmcm9tKCkiIG9uCisJCSAqIGEgU09DS19QQUNLRVQgc29ja2V0LCB3aXRoIE1TR19UUlVOQyBzZXQsIHdpbGwKKwkJICogcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgc28gaWYgd2UgcGFzcworCQkgKiBhIGxlbmd0aCBiYXNlZCBvbiB0aGUgc25hcHNob3QgbGVuZ3RoLCBpdCdsbAorCQkgKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBwYWNrZXQKKwkJICogY29waWVkIHRvIHVzZXJsYW5kLCBub3QgdGhlIGFjdHVhbCBsZW5ndGgKKwkJICogb2YgdGhlIHBhY2tldC4KKwkJICoKKwkJICogVGhpcyBtZWFucyB0aGF0LCBmb3IgZXhhbXBsZSwgdGhlIElQIGRpc3NlY3RvcgorCQkgKiBpbiB0Y3BkdW1wIHdpbGwgZ2V0IGhhbmRlZCBhIHBhY2tldCBsZW5ndGggbGVzcworCQkgKiB0aGFuIHRoZSBsZW5ndGggaW4gdGhlIElQIGhlYWRlciwgYW5kIHdpbGwKKwkJICogY29tcGxhaW4gYWJvdXQgInRydW5jYXRlZC1pcCIuCisJCSAqCisJCSAqIFNvIHdlIGRvbid0IGJvdGhlciB0cnlpbmcgdG8gY29weSBmcm9tIHRoZQorCQkgKiBrZXJuZWwgb25seSB0aGUgYnl0ZXMgaW4gd2hpY2ggd2UncmUgaW50ZXJlc3RlZCwKKwkJICogYnV0IGluc3RlYWQgY29weSB0aGVtIGFsbCwganVzdCBhcyB0aGUgb2xkZXIKKwkJICogdmVyc2lvbnMgb2YgbGlicGNhcCBmb3IgTGludXggZGlkLgorCQkgKgorCQkgKiBUaGUgYnVmZmVyIHRoZXJlZm9yZSBuZWVkcyB0byBiZSBiaWcgZW5vdWdoIHRvCisJCSAqIGhvbGQgdGhlIGxhcmdlc3QgcGFja2V0IHdlIGNhbiBnZXQgZnJvbSB0aGlzCisJCSAqIGRldmljZS4gIFVuZm9ydHVuYXRlbHksIHdlIGNhbid0IGdldCB0aGUgTVJVCisJCSAqIG9mIHRoZSBuZXR3b3JrOyB3ZSBjYW4gb25seSBnZXQgdGhlIE1UVS4gIFRoZQorCQkgKiBNVFUgbWF5IGJlIHRvbyBzbWFsbCwgaW4gd2hpY2ggY2FzZSBhIHBhY2tldCBsYXJnZXIKKwkJICogdGhhbiB0aGUgYnVmZmVyIHNpemUgd2lsbCBiZSB0cnVuY2F0ZWQgKmFuZCogd2UKKwkJICogd29uJ3QgZ2V0IHRoZSBhY3R1YWwgcGFja2V0IHNpemUuCisJCSAqCisJCSAqIEhvd2V2ZXIsIGlmIHRoZSBzbmFwc2hvdCBsZW5ndGggaXMgbGFyZ2VyIHRoYW4KKwkJICogdGhlIGJ1ZmZlciBzaXplIGJhc2VkIG9uIHRoZSBNVFUsIHdlIHVzZSB0aGUKKwkJICogc25hcHNob3QgbGVuZ3RoIGFzIHRoZSBidWZmZXIgc2l6ZSwgaW5zdGVhZDsKKwkJICogdGhpcyBtZWFucyB0aGF0IHdpdGggYSBzdWZmaWNpZW50bHkgbGFyZ2Ugc25hcHNob3QKKwkJICogbGVuZ3RoIHdlIHdvbid0IGFydGlmaWNpYWxseSB0cnVuY2F0ZSBwYWNrZXRzCisJCSAqIHRvIHRoZSBNVFUtYmFzZWQgc2l6ZS4KKwkJICoKKwkJICogVGhpcyBtZXNzIGp1c3Qgb25lIG9mIG1hbnkgcHJvYmxlbXMgd2l0aCBwYWNrZXQKKwkJICogY2FwdHVyZSBvbiAyLjBbLnhdIGtlcm5lbHM7IHlvdSByZWFsbHkgd2FudCBhCisJCSAqIDIuMlsueF0gb3IgbGF0ZXIga2VybmVsIGlmIHlvdSB3YW50IHBhY2tldCBjYXB0dXJlCisJCSAqIHRvIHdvcmsgd2VsbC4KKwkJICovCisJCW10dSA9IGlmYWNlX2dldF9tdHUoaGFuZGxlLT5mZCwgZGV2aWNlLCBoYW5kbGUtPmVycmJ1Zik7CisJCWlmIChtdHUgPT0gLTEpCisJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJaGFuZGxlLT5idWZzaXplID0gTUFYX0xJTktIRUFERVJfU0laRSArIG10dTsKKwkJaWYgKGhhbmRsZS0+YnVmc2l6ZSA8IGhhbmRsZS0+c25hcHNob3QpCisJCQloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90OworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoaXMgaXMgYSAyLjJbLnhdIG9yIGxhdGVyIGtlcm5lbC4KKwkJICoKKwkJICogV2UgY2FuIHNhZmVseSBwYXNzICJyZWN2ZnJvbSgpIiBhIGJ5dGUgY291bnQKKwkJICogYmFzZWQgb24gdGhlIHNuYXBzaG90IGxlbmd0aC4KKwkJICovCisJCWhhbmRsZS0+YnVmc2l6ZSA9IGhhbmRsZS0+c25hcHNob3Q7CisJfQorCisJLyoKKwkgKiBEZWZhdWx0IHZhbHVlIGZvciBvZmZzZXQgdG8gYWxpZ24gbGluay1sYXllciBwYXlsb2FkCisJICogb24gYSA0LWJ5dGUgYm91bmRhcnkuCisJICovCisJaGFuZGxlLT5vZmZzZXQJID0gMDsKKworCXJldHVybiAxOworfQorCisvKgorICogIEJpbmQgdGhlIHNvY2tldCBhc3NvY2lhdGVkIHdpdGggRkQgdG8gdGhlIGdpdmVuIGRldmljZSB1c2luZyB0aGUKKyAqICBpbnRlcmZhY2Ugb2YgdGhlIG9sZCBrZXJuZWxzLgorICovCitzdGF0aWMgaW50CitpZmFjZV9iaW5kX29sZChpbnQgZmQsIGNvbnN0IGNoYXIgKmRldmljZSwgY2hhciAqZWJ1ZikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIJc2FkZHI7CisJaW50CQllcnI7CisJc29ja2xlbl90CWVycmxlbiA9IHNpemVvZihlcnIpOworCisJbWVtc2V0KCZzYWRkciwgMCwgc2l6ZW9mKHNhZGRyKSk7CisJc3RybmNweShzYWRkci5zYV9kYXRhLCBkZXZpY2UsIHNpemVvZihzYWRkci5zYV9kYXRhKSk7CisJaWYgKGJpbmQoZmQsICZzYWRkciwgc2l6ZW9mKHNhZGRyKSkgPT0gLTEpIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAiYmluZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBBbnkgcGVuZGluZyBlcnJvcnMsIGUuZy4sIG5ldHdvcmsgaXMgZG93bj8gKi8KKworCWlmIChnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19FUlJPUiwgJmVyciwgJmVycmxlbikgPT0gLTEpIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSJnZXRzb2Nrb3B0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChlcnIgPiAwKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiYmluZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT0gU3lzdGVtIGNhbGxzIGF2YWlsYWJsZSBvbiBhbGwgc3VwcG9ydGVkIGtlcm5lbHMgPT09PT09PT09PT09PT0gKi8KKworLyoKKyAqICBRdWVyeSB0aGUga2VybmVsIGZvciB0aGUgTVRVIG9mIHRoZSBnaXZlbiBpbnRlcmZhY2UuCisgKi8KK3N0YXRpYyBpbnQKK2lmYWNlX2dldF9tdHUoaW50IGZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJc3RydWN0IGlmcmVxCWlmcjsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gQklHR0VSX1RIQU5fQUxMX01UVVM7CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHkoaWZyLmlmcl9uYW1lLCBkZXZpY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKworCWlmIChpb2N0bChmZCwgU0lPQ0dJRk1UVSwgJmlmcikgPT0gLTEpIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAiU0lPQ0dJRk1UVTogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gaWZyLmlmcl9tdHU7Cit9CisKKy8qCisgKiAgR2V0IHRoZSBoYXJkd2FyZSB0eXBlIG9mIHRoZSBnaXZlbiBpbnRlcmZhY2UgYXMgQVJQSFJEX3h4eCBjb25zdGFudC4KKyAqLworc3RhdGljIGludAoraWZhY2VfZ2V0X2FycHR5cGUoaW50IGZkLCBjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJc3RydWN0IGlmcmVxCWlmcjsKKworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RybmNweShpZnIuaWZyX25hbWUsIGRldmljZSwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCisJaWYgKGlvY3RsKGZkLCBTSU9DR0lGSFdBRERSLCAmaWZyKSA9PSAtMSkgeworCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJTSU9DR0lGSFdBRERSOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGVycm5vID09IEVOT0RFVikgeworCQkJLyoKKwkJCSAqIE5vIHN1Y2ggZGV2aWNlLgorCQkJICovCisJCQlyZXR1cm4gUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRTsKKwkJfQorCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwlyZXR1cm4gaWZyLmlmcl9od2FkZHIuc2FfZmFtaWx5OworfQorCisjaWZkZWYgU09fQVRUQUNIX0ZJTFRFUgorc3RhdGljIGludAorZml4X3Byb2dyYW0ocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBzb2NrX2Zwcm9nICpmY29kZSwgaW50IGlzX21tYXBwZWQpCit7CisJc2l6ZV90IHByb2dfc2l6ZTsKKwlyZWdpc3RlciBpbnQgaTsKKwlyZWdpc3RlciBzdHJ1Y3QgYnBmX2luc24gKnA7CisJc3RydWN0IGJwZl9pbnNuICpmOworCWludCBsZW47CisKKwkvKgorCSAqIE1ha2UgYSBjb3B5IG9mIHRoZSBmaWx0ZXIsIGFuZCBtb2RpZnkgdGhhdCBjb3B5IGlmCisJICogbmVjZXNzYXJ5LgorCSAqLworCXByb2dfc2l6ZSA9IHNpemVvZigqaGFuZGxlLT5mY29kZS5iZl9pbnNucykgKiBoYW5kbGUtPmZjb2RlLmJmX2xlbjsKKwlsZW4gPSBoYW5kbGUtPmZjb2RlLmJmX2xlbjsKKwlmID0gKHN0cnVjdCBicGZfaW5zbiAqKW1hbGxvYyhwcm9nX3NpemUpOworCWlmIChmID09IE5VTEwpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5KGYsIGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsIHByb2dfc2l6ZSk7CisJZmNvZGUtPmxlbiA9IGxlbjsKKwlmY29kZS0+ZmlsdGVyID0gKHN0cnVjdCBzb2NrX2ZpbHRlciAqKSBmOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCXAgPSAmZltpXTsKKwkJLyoKKwkJICogV2hhdCB0eXBlIG9mIGluc3RydWN0aW9uIGlzIHRoaXM/CisJCSAqLworCQlzd2l0Y2ggKEJQRl9DTEFTUyhwLT5jb2RlKSkgeworCisJCWNhc2UgQlBGX1JFVDoKKwkJCS8qCisJCQkgKiBJdCdzIGEgcmV0dXJuIGluc3RydWN0aW9uOyBhcmUgd2UgY2FwdHVyaW5nCisJCQkgKiBpbiBtZW1vcnktbWFwcGVkIG1vZGU/CisJCQkgKi8KKwkJCWlmICghaXNfbW1hcHBlZCkgeworCQkJCS8qCisJCQkJICogTm87IGlzIHRoZSBzbmFwc2hvdCBsZW5ndGggYSBjb25zdGFudCwKKwkJCQkgKiByYXRoZXIgdGhhbiB0aGUgY29udGVudHMgb2YgdGhlCisJCQkJICogYWNjdW11bGF0b3I/CisJCQkJICovCisJCQkJaWYgKEJQRl9NT0RFKHAtPmNvZGUpID09IEJQRl9LKSB7CisJCQkJCS8qCisJCQkJCSAqIFllcyAtIGlmIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCwKKwkJCQkJICogaS5lLiB0aGUgc25hcHNob3QgbGVuZ3RoLCBpcworCQkJCQkgKiBhbnl0aGluZyBvdGhlciB0aGFuIDAsIG1ha2UgaXQKKwkJCQkJICogNjU1MzUsIHNvIHRoYXQgdGhlIHBhY2tldCBpcworCQkJCQkgKiB0cnVuY2F0ZWQgYnkgInJlY3Zmcm9tKCkiLAorCQkJCQkgKiBub3QgYnkgdGhlIGZpbHRlci4KKwkJCQkJICoKKwkJCQkJICogWFhYIC0gdGhlcmUncyBub3RoaW5nIHdlIGNhbgorCQkJCQkgKiBlYXNpbHkgZG8gaWYgaXQncyBnZXR0aW5nIHRoZQorCQkJCQkgKiB2YWx1ZSBmcm9tIHRoZSBhY2N1bXVsYXRvcjsgd2UnZAorCQkJCQkgKiBoYXZlIHRvIGluc2VydCBjb2RlIHRvIGZvcmNlCisJCQkJCSAqIG5vbi16ZXJvIHZhbHVlcyB0byBiZSA2NTUzNS4KKwkJCQkJICovCisJCQkJCWlmIChwLT5rICE9IDApCisJCQkJCQlwLT5rID0gNjU1MzU7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBCUEZfTEQ6CisJCWNhc2UgQlBGX0xEWDoKKwkJCS8qCisJCQkgKiBJdCdzIGEgbG9hZCBpbnN0cnVjdGlvbjsgaXMgaXQgbG9hZGluZworCQkJICogZnJvbSB0aGUgcGFja2V0PworCQkJICovCisJCQlzd2l0Y2ggKEJQRl9NT0RFKHAtPmNvZGUpKSB7CisKKwkJCWNhc2UgQlBGX0FCUzoKKwkJCWNhc2UgQlBGX0lORDoKKwkJCWNhc2UgQlBGX01TSDoKKwkJCQkvKgorCQkJCSAqIFllczsgYXJlIHdlIGluIGNvb2tlZCBtb2RlPworCQkJCSAqLworCQkJCWlmIChoYW5kbGUtPm1kLmNvb2tlZCkgeworCQkJCQkvKgorCQkJCQkgKiBZZXMsIHNvIHdlIG5lZWQgdG8gZml4IHRoaXMKKwkJCQkJICogaW5zdHJ1Y3Rpb24uCisJCQkJCSAqLworCQkJCQlpZiAoZml4X29mZnNldChwKSA8IDApIHsKKwkJCQkJCS8qCisJCQkJCQkgKiBXZSBmYWlsZWQgdG8gZG8gc28uCisJCQkJCQkgKiBSZXR1cm4gMCwgc28gb3VyIGNhbGxlcgorCQkJCQkJICoga25vd3MgdG8gcHVudCB0byB1c2VybGFuZC4KKwkJCQkJCSAqLworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMTsJLyogd2Ugc3VjY2VlZGVkICovCit9CisKK3N0YXRpYyBpbnQKK2ZpeF9vZmZzZXQoc3RydWN0IGJwZl9pbnNuICpwKQoreworCS8qCisJICogV2hhdCdzIHRoZSBvZmZzZXQ/CisJICovCisJaWYgKHAtPmsgPj0gU0xMX0hEUl9MRU4pIHsKKwkJLyoKKwkJICogSXQncyB3aXRoaW4gdGhlIGxpbmstbGF5ZXIgcGF5bG9hZDsgdGhhdCBzdGFydHMgYXQgYW4KKwkJICogb2Zmc2V0IG9mIDAsIGFzIGZhciBhcyB0aGUga2VybmVsIHBhY2tldCBmaWx0ZXIgaXMKKwkJICogY29uY2VybmVkLCBzbyBzdWJ0cmFjdCB0aGUgbGVuZ3RoIG9mIHRoZSBsaW5rLWxheWVyCisJCSAqIGhlYWRlci4KKwkJICovCisJCXAtPmsgLT0gU0xMX0hEUl9MRU47CisJfSBlbHNlIGlmIChwLT5rID09IDApIHsKKwkJLyoKKwkJICogSXQncyB0aGUgcGFja2V0IHR5cGUgZmllbGQ7IG1hcCBpdCB0byB0aGUgc3BlY2lhbCBtYWdpYworCQkgKiBrZXJuZWwgb2Zmc2V0IGZvciB0aGF0IGZpZWxkLgorCQkgKi8KKwkJcC0+ayA9IFNLRl9BRF9PRkYgKyBTS0ZfQURfUEtUVFlQRTsKKwl9IGVsc2UgaWYgKHAtPmsgPT0gMTQpIHsKKwkJLyoKKwkJICogSXQncyB0aGUgcHJvdG9jb2wgZmllbGQ7IG1hcCBpdCB0byB0aGUgc3BlY2lhbCBtYWdpYworCQkgKiBrZXJuZWwgb2Zmc2V0IGZvciB0aGF0IGZpZWxkLgorCQkgKi8KKwkJcC0+ayA9IFNLRl9BRF9PRkYgKyBTS0ZfQURfUFJPVE9DT0w7CisJfSBlbHNlIGlmICgoYnBmX2ludDMyKShwLT5rKSA+IDApIHsKKwkJLyoKKwkJICogSXQncyB3aXRoaW4gdGhlIGhlYWRlciwgYnV0IGl0J3Mgbm90IG9uZSBvZiB0aG9zZQorCQkgKiBmaWVsZHM7IHdlIGNhbid0IGRvIHRoYXQgaW4gdGhlIGtlcm5lbCwgc28gcHVudAorCQkgKiB0byB1c2VybGFuZC4KKwkJICovCisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NldF9rZXJuZWxfZmlsdGVyKHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3Qgc29ja19mcHJvZyAqZmNvZGUpCit7CisJaW50IHRvdGFsX2ZpbHRlcl9vbiA9IDA7CisJaW50IHNhdmVfbW9kZTsKKwlpbnQgcmV0OworCWludCBzYXZlX2Vycm5vOworCisJLyoKKwkgKiBUaGUgc29ja2V0IGZpbHRlciBjb2RlIGRvZXNuJ3QgZGlzY2FyZCBhbGwgcGFja2V0cyBxdWV1ZWQKKwkgKiB1cCBvbiB0aGUgc29ja2V0IHdoZW4gdGhlIGZpbHRlciBpcyBjaGFuZ2VkOyB0aGlzIG1lYW5zCisJICogdGhhdCBwYWNrZXRzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIG5ldyBmaWx0ZXIgbWF5IHNob3cgdXAKKwkgKiBhZnRlciB0aGUgbmV3IGZpbHRlciBpcyBwdXQgb250byB0aGUgc29ja2V0LCBpZiB0aG9zZQorCSAqIHBhY2tldHMgaGF2ZW4ndCB5ZXQgYmVlbiByZWFkLgorCSAqCisJICogVGhpcyBtZWFucywgZm9yIGV4YW1wbGUsIHRoYXQgaWYgeW91IGRvIGEgdGNwZHVtcCBjYXB0dXJlCisJICogd2l0aCBhIGZpbHRlciwgdGhlIGZpcnN0IGZldyBwYWNrZXRzIGluIHRoZSBjYXB0dXJlIG1pZ2h0CisJICogYmUgcGFja2V0cyB0aGF0IHdvdWxkbid0IGhhdmUgcGFzc2VkIHRoZSBmaWx0ZXIuCisJICoKKwkgKiBXZSB0aGVyZWZvcmUgZGlzY2FyZCBhbGwgcGFja2V0cyBxdWV1ZWQgdXAgb24gdGhlIHNvY2tldAorCSAqIHdoZW4gc2V0dGluZyBhIGtlcm5lbCBmaWx0ZXIuICAoVGhpcyBpc24ndCBhbiBpc3N1ZSBmb3IKKwkgKiB1c2VybGFuZCBmaWx0ZXJzLCBhcyB0aGUgdXNlcmxhbmQgZmlsdGVyaW5nIGlzIGRvbmUgYWZ0ZXIKKwkgKiBwYWNrZXRzIGFyZSBxdWV1ZWQgdXAuKQorCSAqCisJICogVG8gZmx1c2ggdGhvc2UgcGFja2V0cywgd2UgcHV0IHRoZSBzb2NrZXQgaW4gcmVhZC1vbmx5IG1vZGUsCisJICogYW5kIHJlYWQgcGFja2V0cyBmcm9tIHRoZSBzb2NrZXQgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgdG8KKwkgKiByZWFkLgorCSAqCisJICogSW4gb3JkZXIgdG8ga2VlcCB0aGF0IGZyb20gYmVpbmcgYW4gaW5maW5pdGUgbG9vcCAtIGkuZS4sCisJICogdG8ga2VlcCBtb3JlIHBhY2tldHMgZnJvbSBhcnJpdmluZyB3aGlsZSB3ZSdyZSBkcmFpbmluZworCSAqIHRoZSBxdWV1ZSAtIHdlIHB1dCB0aGUgInRvdGFsIGZpbHRlciIsIHdoaWNoIGlzIGEgZmlsdGVyCisJICogdGhhdCByZWplY3RzIGFsbCBwYWNrZXRzLCBvbnRvIHRoZSBzb2NrZXQgYmVmb3JlIGRyYWluaW5nCisJICogdGhlIHF1ZXVlLgorCSAqCisJICogVGhpcyBjb2RlIGRlbGliZXJhdGVseSBpZ25vcmVzIGFueSBlcnJvcnMsIHNvIHRoYXQgeW91IG1heQorCSAqIGdldCBib2d1cyBwYWNrZXRzIGlmIGFuIGVycm9yIG9jY3VycywgcmF0aGVyIHRoYW4gaGF2aW5nCisJICogdGhlIGZpbHRlcmluZyBkb25lIGluIHVzZXJsYW5kIGV2ZW4gaWYgaXQgY291bGQgaGF2ZSBiZWVuCisJICogZG9uZSBpbiB0aGUga2VybmVsLgorCSAqLworCWlmIChzZXRzb2Nrb3B0KGhhbmRsZS0+ZmQsIFNPTF9TT0NLRVQsIFNPX0FUVEFDSF9GSUxURVIsCisJCSAgICAgICAmdG90YWxfZmNvZGUsIHNpemVvZih0b3RhbF9mY29kZSkpID09IDApIHsKKwkJY2hhciBkcmFpblsxXTsKKworCQkvKgorCQkgKiBOb3RlIHRoYXQgd2UndmUgcHV0IHRoZSB0b3RhbCBmaWx0ZXIgb250byB0aGUgc29ja2V0LgorCQkgKi8KKwkJdG90YWxfZmlsdGVyX29uID0gMTsKKworCQkvKgorCQkgKiBTYXZlIHRoZSBzb2NrZXQncyBjdXJyZW50IG1vZGUsIGFuZCBwdXQgaXQgaW4KKwkJICogbm9uLWJsb2NraW5nIG1vZGU7IHdlIGRyYWluIGl0IGJ5IHJlYWRpbmcgcGFja2V0cworCQkgKiB1bnRpbCB3ZSBnZXQgYW4gZXJyb3IgKHdoaWNoIGlzIG5vcm1hbGx5IGEKKwkJICogIm5vdGhpbmcgbW9yZSB0byBiZSByZWFkIiBlcnJvcikuCisJCSAqLworCQlzYXZlX21vZGUgPSBmY250bChoYW5kbGUtPmZkLCBGX0dFVEZMLCAwKTsKKwkJaWYgKHNhdmVfbW9kZSAhPSAtMSAmJgorCQkgICAgZmNudGwoaGFuZGxlLT5mZCwgRl9TRVRGTCwgc2F2ZV9tb2RlIHwgT19OT05CTE9DSykgPj0gMCkgeworCQkJd2hpbGUgKHJlY3YoaGFuZGxlLT5mZCwgJmRyYWluLCBzaXplb2YgZHJhaW4sCisJCQkgICAgICAgTVNHX1RSVU5DKSA+PSAwKQorCQkJCTsKKwkJCXNhdmVfZXJybm8gPSBlcnJubzsKKwkJCWZjbnRsKGhhbmRsZS0+ZmQsIEZfU0VURkwsIHNhdmVfbW9kZSk7CisJCQlpZiAoc2F2ZV9lcnJubyAhPSBFQUdBSU4pIHsKKwkJCQkvKiBGYXRhbCBlcnJvciAqLworCQkJCXJlc2V0X2tlcm5lbF9maWx0ZXIoaGFuZGxlKTsKKwkJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgInJlY3Y6ICVzIiwgcGNhcF9zdHJlcnJvcihzYXZlX2Vycm5vKSk7CisJCQkJcmV0dXJuIC0yOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBOb3cgYXR0YWNoIHRoZSBuZXcgZmlsdGVyLgorCSAqLworCXJldCA9IHNldHNvY2tvcHQoaGFuZGxlLT5mZCwgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwKKwkJCSBmY29kZSwgc2l6ZW9mKCpmY29kZSkpOworCWlmIChyZXQgPT0gLTEgJiYgdG90YWxfZmlsdGVyX29uKSB7CisJCS8qCisJCSAqIFdlbGwsIHdlIGNvdWxkbid0IHNldCB0aGF0IGZpbHRlciBvbiB0aGUgc29ja2V0LAorCQkgKiBidXQgd2UgY291bGQgc2V0IHRoZSB0b3RhbCBmaWx0ZXIgb24gdGhlIHNvY2tldC4KKwkJICoKKwkJICogVGhpcyBjb3VsZCwgZm9yIGV4YW1wbGUsIG1lYW4gdGhhdCB0aGUgZmlsdGVyIHdhcworCQkgKiB0b28gYmlnIHRvIHB1dCBpbnRvIHRoZSBrZXJuZWwsIHNvIHdlJ2xsIGhhdmUgdG8KKwkJICogZmlsdGVyIGluIHVzZXJsYW5kOyBpbiBhbnkgY2FzZSwgd2UnbGwgYmUgZG9pbmcKKwkJICogZmlsdGVyaW5nIGluIHVzZXJsYW5kLCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUKKwkJICogdG90YWwgZmlsdGVyIHNvIHdlIHNlZSBwYWNrZXRzLgorCQkgKi8KKwkJc2F2ZV9lcnJubyA9IGVycm5vOworCisJCS8qCisJCSAqIFhYWCAtIGlmIHRoaXMgZmFpbHMsIHdlJ3JlIHJlYWxseSBzY3Jld2VkOworCQkgKiB3ZSBoYXZlIHRoZSB0b3RhbCBmaWx0ZXIgb24gdGhlIHNvY2tldCwKKwkJICogYW5kIGl0IHdvbid0IGNvbWUgb2ZmLiAgV2hhdCBkbyB3ZSBkbyB0aGVuPworCQkgKi8KKwkJcmVzZXRfa2VybmVsX2ZpbHRlcihoYW5kbGUpOworCisJCWVycm5vID0gc2F2ZV9lcnJubzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorcmVzZXRfa2VybmVsX2ZpbHRlcihwY2FwX3QgKmhhbmRsZSkKK3sKKwkvKgorCSAqIHNldHNvY2tvcHQoKSBiYXJmcyB1bmxlc3MgaXQgZ2V0IGEgZHVtbXkgcGFyYW1ldGVyLgorCSAqIHZhbGdyaW5kIHdoaW5lcyB1bmxlc3MgdGhlIHZhbHVlIGlzIGluaXRpYWxpemVkLAorCSAqIGFzIGl0IGhhcyBubyBpZGVhIHRoYXQgc2V0c29ja29wdCgpIGlnbm9yZXMgaXRzCisJICogcGFyYW1ldGVyLgorCSAqLworCWludCBkdW1teSA9IDA7CisKKwlyZXR1cm4gc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfU09DS0VULCBTT19ERVRBQ0hfRklMVEVSLAorCQkJCSAgICZkdW1teSwgc2l6ZW9mKGR1bW15KSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1uYW1lZGIuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC1uYW1lZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGIyMjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLW5hbWVkYi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCisgKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbmFtZWRiLmgsdiAxLjEzIDIwMDYtMTAtMDQgMTg6MTM6MzIgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyoKKyAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyAqCisgKiBOb3RlIHRvIE9TIHZlbmRvcnM6IGRvIE5PVCBnZXQgcmlkIG9mIHRoaXMgZmlsZSEgIFNvbWUgYXBwbGljYXRpb25zCisgKiBtaWdodCBleHBlY3QgdG8gYmUgYWJsZSB0byBpbmNsdWRlIDxwY2FwLW5hbWVkYi5oPi4KKyAqLworI2luY2x1ZGUgPHBjYXAvbmFtZWRiLmg+CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljNmJlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1uZXRmaWx0ZXItbGludXguYwpAQCAtMCwwICsxLDQ2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBKYWt1YiBaYXdhZHpraQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2lmZGVmIE5FRURfU1RSRVJST1JfSAorI2luY2x1ZGUgInN0cmVycm9yLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmg+CisKKyNpbmNsdWRlICJwY2FwLW5ldGZpbHRlci1saW51eC5oIgorCisjZGVmaW5lIEhEUl9MRU5HVEggKE5MTVNHX0xFTkdUSChOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSkpKQorCisjZGVmaW5lIE5GTE9HX0lGQUNFICJuZmxvZyIKKworc3RhdGljIGludAorbmZsb2dfcmVhZF9saW51eChwY2FwX3QgKmhhbmRsZSwgaW50IG1heF9wYWNrZXRzLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpidWY7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgbGVuOworCisJLyogaWdub3JlIGludGVycnVwdCBzeXN0ZW0gY2FsbCBlcnJvciAqLworCWRvIHsKKwkJbGVuID0gcmVjdihoYW5kbGUtPmZkLCBoYW5kbGUtPmJ1ZmZlciwgaGFuZGxlLT5idWZzaXplLCAwKTsKKwkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkgeworCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKKwkJCXJldHVybiAtMjsKKwkJfQorCX0gd2hpbGUgKChsZW4gPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCisJaWYgKGxlbiA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCByZWNlaXZlIHBhY2tldCAlZDolcyIsIGVycm5vLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlidWYgPSBoYW5kbGUtPmJ1ZmZlcjsKKwl3aGlsZSAobGVuID49IE5MTVNHX1NQQUNFKDApKSB7CisJCWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoID0gKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqKSBidWY7CisJCXVfaW50MzJfdCBtc2dfbGVuOworCisJCWlmIChubGgtPm5sbXNnX2xlbiA8IHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpIHx8IGxlbiA8IG5saC0+bmxtc2dfbGVuKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk1lc3NhZ2UgdHJ1bmNhdGVkOiAoZ290OiAlZCkgKG5sbXNnX2xlbjogJXUpIiwgbGVuLCBubGgtPm5sbXNnX2xlbik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoTkZOTF9TVUJTWVNfSUQobmxoLT5ubG1zZ190eXBlKSA9PSBORk5MX1NVQlNZU19VTE9HICYmIAorCQkJTkZOTF9NU0dfVFlQRShubGgtPm5sbXNnX3R5cGUpID09IE5GVUxOTF9NU0dfUEFDS0VUKSAKKwkJeworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqcGF5bG9hZCA9IE5VTEw7CisJCQlzdHJ1Y3QgcGNhcF9wa3RoZHIgcGt0aDsKKworCQkJaWYgKGhhbmRsZS0+bGlua3R5cGUgIT0gRExUX05GTE9HKSB7CisJCQkJY29uc3Qgc3RydWN0IG5mYXR0ciAqcGF5bG9hZF9hdHRyID0gTlVMTDsKKworCQkJCWlmIChubGgtPm5sbXNnX2xlbiA8IEhEUl9MRU5HVEgpIHsKKwkJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJNYWxmb3JtZWQgbWVzc2FnZTogKG5sbXNnX2xlbjogJXUpIiwgbmxoLT5ubG1zZ19sZW4pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCisJCQkJaWYgKG5saC0+bmxtc2dfbGVuID4gSERSX0xFTkdUSCkgeworCQkJCQlzdHJ1Y3QgbmZhdHRyICphdHRyID0gTkZNX05GQShOTE1TR19EQVRBKG5saCkpOworCQkJCQlpbnQgYXR0cl9sZW4gPSBubGgtPm5sbXNnX2xlbiAtIE5MTVNHX0FMSUdOKEhEUl9MRU5HVEgpOworCisJCQkJCXdoaWxlIChORkFfT0soYXR0ciwgYXR0cl9sZW4pKSB7CisJCQkJCQlzd2l0Y2ggKE5GQV9UWVBFKGF0dHIpKSB7CisJCQkJCQkJY2FzZSBORlVMQV9QQVlMT0FEOgorCQkJCQkJCQlwYXlsb2FkX2F0dHIgPSBhdHRyOworCQkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWF0dHIgPSBORkFfTkVYVChhdHRyLCBhdHRyX2xlbik7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAocGF5bG9hZF9hdHRyKSB7CisJCQkJCXBheWxvYWQgPSBORkFfREFUQShwYXlsb2FkX2F0dHIpOworCQkJCQlwa3RoLmxlbiA9IHBrdGguY2FwbGVuID0gTkZBX1BBWUxPQUQocGF5bG9hZF9hdHRyKTsKKwkJCQl9CisKKwkJCX0gZWxzZSB7CisJCQkJcGF5bG9hZCA9IE5MTVNHX0RBVEEobmxoKTsKKwkJCQlwa3RoLmNhcGxlbiA9IHBrdGgubGVuID0gbmxoLT5ubG1zZ19sZW4tTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBubG1zZ2hkcikpOworCQkJfQorCisJCQlpZiAocGF5bG9hZCkgeworCQkJCS8qIHBrdGguY2FwbGVuID0gbWluIChwYXlsb2FkX2xlbiwgaGFuZGxlLT5zbmFwc2hvdCk7ICovCisKKwkJCQlnZXR0aW1lb2ZkYXkoJnBrdGgudHMsIE5VTEwpOworCQkJCWlmIChoYW5kbGUtPmZjb2RlLmJmX2luc25zID09IE5VTEwgfHwKKwkJCQkJCWJwZl9maWx0ZXIoaGFuZGxlLT5mY29kZS5iZl9pbnNucywgcGF5bG9hZCwgcGt0aC5sZW4sIHBrdGguY2FwbGVuKSkgCisJCQkJeworCQkJCQloYW5kbGUtPm1kLnBhY2tldHNfcmVhZCsrOworCQkJCQljYWxsYmFjayh1c2VyLCAmcGt0aCwgcGF5bG9hZCk7CisJCQkJCWNvdW50Kys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJbXNnX2xlbiA9IE5MTVNHX0FMSUdOKG5saC0+bmxtc2dfbGVuKTsKKwkJaWYgKG1zZ19sZW4gPiBsZW4pCisJCQltc2dfbGVuID0gbGVuOworCisJCWxlbiAtPSBtc2dfbGVuOworCQlidWYgKz0gbXNnX2xlbjsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CituZXRmaWx0ZXJfc2V0X2RhdGFsaW5rKHBjYXBfdCAqaGFuZGxlLCBpbnQgZGx0KQoreworCWhhbmRsZS0+bGlua3R5cGUgPSBkbHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25ldGZpbHRlcl9zdGF0c19saW51eChwY2FwX3QgKmhhbmRsZSwgc3RydWN0IHBjYXBfc3RhdCAqc3RhdHMpCit7CisJc3RhdHMtPnBzX3JlY3YgPSBoYW5kbGUtPm1kLnBhY2tldHNfcmVhZDsKKwlzdGF0cy0+cHNfZHJvcCA9IDA7CisJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25ldGZpbHRlcl9pbmplY3RfbGludXgocGNhcF90ICpoYW5kbGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJpbmplY3Qgbm90IHN1cHBvcnRlZCBvbiBuZXRmaWx0ZXIgZGV2aWNlcyIpOworCXJldHVybiAoLTEpOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdHJ1Y3QgbXlfbmZhdHRyIHsKKwl1X2ludDE2X3QgbmZhX2xlbjsKKwl1X2ludDE2X3QgbmZhX3R5cGU7CisJdm9pZCAqZGF0YTsKK307CisKK3N0YXRpYyBpbnQKK25mbG9nX3NlbmRfY29uZmlnX21zZyhjb25zdCBwY2FwX3QgKmhhbmRsZSwgdV9pbnQ4X3QgZmFtaWx5LCB1X2ludDE2X3QgcmVzX2lkLCBjb25zdCBzdHJ1Y3QgbXlfbmZhdHRyICpteW5mYSkKK3sKKwljaGFyIGJ1ZlsxMDI0XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCkpOworCisJc3RydWN0IG5sbXNnaGRyICpubGggPSAoc3RydWN0IG5sbXNnaGRyICopIGJ1ZjsKKwlzdHJ1Y3QgbmZnZW5tc2cgKm5mZyA9IChzdHJ1Y3QgbmZnZW5tc2cgKikgKGJ1ZiArIHNpemVvZihzdHJ1Y3Qgbmxtc2doZHIpKTsKKworCXN0cnVjdCBzb2NrYWRkcl9ubCBzbmw7CisJc3RhdGljIHVuc2lnbmVkIGludCBzZXFfaWQ7CisJCisJaWYgKCFzZXFfaWQpCisJCXNlcV9pZCA9IHRpbWUoTlVMTCk7CisJKytzZXFfaWQ7CisKKwlubGgtPm5sbXNnX2xlbiA9IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IG5mZ2VubXNnKSk7CisJbmxoLT5ubG1zZ190eXBlID0gKE5GTkxfU1VCU1lTX1VMT0cgPDwgOCkgfCBORlVMTkxfTVNHX0NPTkZJRzsKKwlubGgtPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVCB8IE5MTV9GX0FDSzsKKwlubGgtPm5sbXNnX3BpZCA9IDA7CS8qIHRvIGtlcm5lbCAqLworCW5saC0+bmxtc2dfc2VxID0gc2VxX2lkOworCisJbmZnLT5uZmdlbl9mYW1pbHkgPSBmYW1pbHk7CisJbmZnLT52ZXJzaW9uID0gTkZORVRMSU5LX1YwOworCW5mZy0+cmVzX2lkID0gaHRvbnMocmVzX2lkKTsKKworCWlmIChteW5mYSkgeworCQlzdHJ1Y3QgbmZhdHRyICpuZmEgPSAoc3RydWN0IG5mYXR0ciAqKSAoYnVmICsgTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pKTsKKworCQluZmEtPm5mYV90eXBlID0gbXluZmEtPm5mYV90eXBlOworCQluZmEtPm5mYV9sZW4gPSBORkFfTEVOR1RIKG15bmZhLT5uZmFfbGVuKTsKKwkJbWVtY3B5KE5GQV9EQVRBKG5mYSksIG15bmZhLT5kYXRhLCBteW5mYS0+bmZhX2xlbik7CisJCW5saC0+bmxtc2dfbGVuID0gTkxNU0dfQUxJR04obmxoLT5ubG1zZ19sZW4pICsgTkZBX0FMSUdOKG5mYS0+bmZhX2xlbik7CisJfQorCisJbWVtc2V0KCZzbmwsIDAsIHNpemVvZihzbmwpKTsKKwlzbmwubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKworCWlmIChzZW5kdG8oaGFuZGxlLT5mZCwgbmxoLCBubGgtPm5sbXNnX2xlbiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc25sLCBzaXplb2Yoc25sKSkgPT0gLTEpCisJCXJldHVybiAtMTsKKworCS8qIHdhaXRpbmcgZm9yIHJlcGx5IGxvb3AgKi8KKwlkbyB7CisJCXNvY2tsZW5fdCBhZGRybGVuID0gc2l6ZW9mKHNubCk7CisJCWludCBsZW47CisKKwkJLyogaWdub3JlIGludGVycnVwdCBzeXN0ZW0gY2FsbCBlcnJvciAqLworCQlkbyB7CisJCQlsZW4gPSByZWN2ZnJvbShoYW5kbGUtPmZkLCBidWYsIHNpemVvZihidWYpLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZzbmwsICZhZGRybGVuKTsKKwkJfSB3aGlsZSAoKGxlbiA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisKKwkJaWYgKGxlbiA8PSAwKQorCQkJcmV0dXJuIGxlbjsKKworCQlpZiAoYWRkcmxlbiAhPSBzaXplb2Yoc25sKSB8fCBzbmwubmxfZmFtaWx5ICE9IEFGX05FVExJTkspIHsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbmxoID0gKHN0cnVjdCBubG1zZ2hkciAqKSBidWY7CisJCWlmIChzbmwubmxfcGlkICE9IDAgfHwgc2VxX2lkICE9IG5saC0+bmxtc2dfc2VxKQkvKiBpZiBub3QgZnJvbSBrZXJuZWwgb3Igd3Jvbmcgc2VxdWVuY2Ugc2tpcCAqLworCQkJY29udGludWU7CisKKwkJd2hpbGUgKGxlbiA+PSBOTE1TR19TUEFDRSgwKSAmJiBOTE1TR19PSyhubGgsIGxlbikpIHsKKwkJCWlmIChubGgtPm5sbXNnX3R5cGUgPT0gTkxNU0dfRVJST1IgfHwgKG5saC0+bmxtc2dfdHlwZSA9PSBOTE1TR19ET05FICYmIG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9NVUxUSSkpIHsKKwkJCQlpZiAobmxoLT5ubG1zZ19sZW4gPCBOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IG5sbXNnZXJyKSkpIHsKKwkJCQkJZXJybm8gPSBFQkFETVNHOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCQkJCWVycm5vID0gLSgqKChpbnQgKilOTE1TR19EQVRBKG5saCkpKTsKKwkJCQlyZXR1cm4gKGVycm5vID09IDApID8gMCA6IC0xOworCQkJfQorCQkJbmxoID0gTkxNU0dfTkVYVChubGgsIGxlbik7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCXJldHVybiAtMTsgLyogbmV2ZXIgaGVyZSAqLworfQorCitzdGF0aWMgaW50CituZmxvZ19zZW5kX2NvbmZpZ19jbWQoY29uc3QgcGNhcF90ICpoYW5kbGUsIHVfaW50MTZfdCBncm91cF9pZCwgdV9pbnQ4X3QgY21kLCB1X2ludDhfdCBmYW1pbHkpCit7CisJc3RydWN0IG5mdWxubF9tc2dfY29uZmlnX2NtZCBtc2c7CisJc3RydWN0IG15X25mYXR0ciBuZmE7CisKKwltc2cuY29tbWFuZCA9IGNtZDsKKworCW5mYS5kYXRhID0gJm1zZzsKKwluZmEubmZhX3R5cGUgPSBORlVMQV9DRkdfQ01EOworCW5mYS5uZmFfbGVuID0gc2l6ZW9mKG1zZyk7CisKKwlyZXR1cm4gbmZsb2dfc2VuZF9jb25maWdfbXNnKGhhbmRsZSwgZmFtaWx5LCBncm91cF9pZCwgJm5mYSk7Cit9CisKK3N0YXRpYyBpbnQgCituZmxvZ19zZW5kX2NvbmZpZ19tb2RlKGNvbnN0IHBjYXBfdCAqaGFuZGxlLCB1X2ludDE2X3QgZ3JvdXBfaWQsIHVfaW50OF90IGNvcHlfbW9kZSwgdV9pbnQzMl90IGNvcHlfcmFuZ2UpCit7CisJc3RydWN0IG5mdWxubF9tc2dfY29uZmlnX21vZGUgbXNnOworCXN0cnVjdCBteV9uZmF0dHIgbmZhOworCisJbXNnLmNvcHlfcmFuZ2UgPSBodG9ubChjb3B5X3JhbmdlKTsKKwltc2cuY29weV9tb2RlID0gY29weV9tb2RlOworCisJbmZhLmRhdGEgPSAmbXNnOworCW5mYS5uZmFfdHlwZSA9IE5GVUxBX0NGR19NT0RFOworCW5mYS5uZmFfbGVuID0gc2l6ZW9mKG1zZyk7CisKKwlyZXR1cm4gbmZsb2dfc2VuZF9jb25maWdfbXNnKGhhbmRsZSwgQUZfVU5TUEVDLCBncm91cF9pZCwgJm5mYSk7Cit9CisKK3N0YXRpYyBpbnQKK25mbG9nX2FjdGl2YXRlKHBjYXBfdCogaGFuZGxlKQoreworCWNvbnN0IGNoYXIgKmRldiA9IGhhbmRsZS0+b3B0LnNvdXJjZTsKKwl1bnNpZ25lZCBzaG9ydCBncm91cHNbMzJdOworCWludCBncm91cF9jb3VudCA9IDA7CisJaW50IGk7CisKKwlpZiAoc3RybmNtcChkZXYsIE5GTE9HX0lGQUNFLCBzdHJsZW4oTkZMT0dfSUZBQ0UpKSA9PSAwKSB7CisJCWRldiArPSBzdHJsZW4oTkZMT0dfSUZBQ0UpOworCisJCS8qIG5mbG9nOjMwLDMzLDQyIGxvb2tzIG5pY2UsIGFsbG93IGl0ICovCisJCWlmICgqZGV2ID09ICc6JykKKwkJCWRldisrOworCisJCXdoaWxlICgqZGV2KSB7CisJCQlsb25nIGludCBncm91cF9pZDsKKwkJCWNoYXIgKmVuZF9kZXY7CisKKwkJCWlmIChncm91cF9jb3VudCA9PSAzMikgeworCQkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkJIk1heGltdW0gMzIgbmV0ZmlsdGVyIGdyb3VwcyEgZGV2OiAlcyIsIAorCQkJCQkJaGFuZGxlLT5vcHQuc291cmNlKTsKKwkJCQlyZXR1cm4gUENBUF9FUlJPUjsKKwkJCX0KKworCQkJZ3JvdXBfaWQgPSBzdHJ0b2woZGV2LCAmZW5kX2RldiwgMCk7CisJCQlpZiAoZW5kX2RldiAhPSBkZXYpIHsKKwkJCQlpZiAoZ3JvdXBfaWQgPCAwIHx8IGdyb3VwX2lkID4gNjU1MzUpIHsKKwkJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCQkJIk5ldGZpbHRlciBncm91cCByYW5nZSBmcm9tIDAgdG8gNjU1MzUgKGdvdCAlbGQpIiwKKwkJCQkJCQlncm91cF9pZCk7CisJCQkJCXJldHVybiBQQ0FQX0VSUk9SOworCQkJCX0KKworCQkJCWdyb3Vwc1tncm91cF9jb3VudCsrXSA9ICh1bnNpZ25lZCBzaG9ydCkgZ3JvdXBfaWQ7CisJCQkJZGV2ID0gZW5kX2RldjsKKwkJCX0KKwkJCWlmICgqZGV2ICE9ICcsJykKKwkJCQlicmVhazsKKwkJCWRldisrOworCQl9CisJfQorCisJaWYgKCpkZXYpIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJIkNhbid0IGdldCBuZXRmaWx0ZXIgZ3JvdXAocykgaW5kZXggZnJvbSAlcyIsIAorCQkJCWhhbmRsZS0+b3B0LnNvdXJjZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qIGlmIG5vIGdyb3VwcywgYWRkIGRlZmF1bHQ6IDAgKi8KKwlpZiAoIWdyb3VwX2NvdW50KSB7CisJCWdyb3Vwc1swXSA9IDA7CisJCWdyb3VwX2NvdW50ID0gMTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgcGNhcCBzdHJ1Y3R1cmUuICovCisJaGFuZGxlLT5idWZzaXplID0gMTI4ICsgaGFuZGxlLT5zbmFwc2hvdDsKKwloYW5kbGUtPm9mZnNldCA9IDA7CisJaGFuZGxlLT5saW5rdHlwZSA9IERMVF9ORkxPRzsKKwloYW5kbGUtPnJlYWRfb3AgPSBuZmxvZ19yZWFkX2xpbnV4OworCWhhbmRsZS0+aW5qZWN0X29wID0gbmV0ZmlsdGVyX2luamVjdF9saW51eDsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07IC8qIG5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IE5VTEw7CisJaGFuZGxlLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOworCWhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gbmV0ZmlsdGVyX3NldF9kYXRhbGluazsKKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnN0YXRzX29wID0gbmV0ZmlsdGVyX3N0YXRzX2xpbnV4OworCisJLyogQ3JlYXRlIG5ldGxpbmsgc29ja2V0ICovCisJaGFuZGxlLT5mZCA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19ORVRGSUxURVIpOworCWlmIChoYW5kbGUtPmZkIDwgMCkgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IGNyZWF0ZSByYXcgc29ja2V0ICVkOiVzIiwgZXJybm8sIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCisJaGFuZGxlLT5kbHRfbGlzdCA9ICh1X2ludCAqKSBtYWxsb2Moc2l6ZW9mKHVfaW50KSAqIDIpOworCWlmIChoYW5kbGUtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJaGFuZGxlLT5kbHRfbGlzdFswXSA9IERMVF9ORkxPRzsKKwkJaGFuZGxlLT5kbHRfbGlzdFsxXSA9IERMVF9JUFY0OworCQloYW5kbGUtPmRsdF9jb3VudCA9IDI7CisJfQorCisJaGFuZGxlLT5idWZmZXIgPSBtYWxsb2MoaGFuZGxlLT5idWZzaXplKTsKKwlpZiAoIWhhbmRsZS0+YnVmZmVyKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiQ2FuJ3QgYWxsb2NhdGUgZHVtcCBidWZmZXI6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGNsb3NlX2ZhaWw7CisJfQorCisJaWYgKG5mbG9nX3NlbmRfY29uZmlnX2NtZChoYW5kbGUsIDAsIE5GVUxOTF9DRkdfQ01EX1BGX1VOQklORCwgQUZfSU5FVCkgPCAwKSB7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTkZVTE5MX0NGR19DTURfUEZfVU5CSU5EOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBjbG9zZV9mYWlsOworCX0KKworCWlmIChuZmxvZ19zZW5kX2NvbmZpZ19jbWQoaGFuZGxlLCAwLCBORlVMTkxfQ0ZHX0NNRF9QRl9CSU5ELCBBRl9JTkVUKSA8IDApIHsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJORlVMTkxfQ0ZHX0NNRF9QRl9CSU5EOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBjbG9zZV9mYWlsOworCX0KKworCS8qIEJpbmQgc29ja2V0IHRvIHRoZSBuZmxvZyBncm91cHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3JvdXBfY291bnQ7IGkrKykgeworCQlpZiAobmZsb2dfc2VuZF9jb25maWdfY21kKGhhbmRsZSwgZ3JvdXBzW2ldLCBORlVMTkxfQ0ZHX0NNRF9CSU5ELCBBRl9VTlNQRUMpIDwgMCkgeworCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCBsaXN0ZW4gb24gZ3JvdXAgZ3JvdXAgaW5kZXg6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJZ290byBjbG9zZV9mYWlsOworCQl9CisKKwkJaWYgKG5mbG9nX3NlbmRfY29uZmlnX21vZGUoaGFuZGxlLCBncm91cHNbaV0sIE5GVUxOTF9DT1BZX1BBQ0tFVCwgaGFuZGxlLT5zbmFwc2hvdCkgPCAwKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5GVUxOTF9DT1BZX1BBQ0tFVDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGNsb3NlX2ZhaWw7CisJCX0KKwl9CisKKwlpZiAoaGFuZGxlLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogTW9uaXRvciBtb2RlIGRvZXNuJ3QgYXBwbHkgdG8gbmV0ZmlsdGVyIGRldmljZXMuCisJCSAqLworCQlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24oaGFuZGxlKTsKKwkJcmV0dXJuIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOworCX0KKworCWlmIChoYW5kbGUtPm9wdC5idWZmZXJfc2l6ZSAhPSAwKSB7CisJCS8qCisJCSAqIFNldCB0aGUgc29ja2V0IGJ1ZmZlciBzaXplIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisJCSAqLworCQlpZiAoc2V0c29ja29wdChoYW5kbGUtPmZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZoYW5kbGUtPm9wdC5idWZmZXJfc2l6ZSwgc2l6ZW9mKGhhbmRsZS0+b3B0LmJ1ZmZlcl9zaXplKSkgPT0gLTEpIHsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU09fUkNWQlVGOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCWdvdG8gY2xvc2VfZmFpbDsKKwkJfQorCX0KKworCWhhbmRsZS0+c2VsZWN0YWJsZV9mZCA9IGhhbmRsZS0+ZmQ7CisJcmV0dXJuIDA7CisKK2Nsb3NlX2ZhaWw6CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7CisJcmV0dXJuIFBDQVBfRVJST1I7Cit9CisKK3BjYXBfdCAqCituZmxvZ19jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBuZmxvZ19hY3RpdmF0ZTsKKwlyZXR1cm4gKHApOworfQorCitpbnQgCituZXRmaWx0ZXJfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycl9zdHIpCit7CisJcGNhcF9pZl90ICpmb3VuZF9kZXYgPSAqYWxsZGV2c3A7CisJaW50IHNvY2s7CisJCisJc29jayA9IHNvY2tldChBRl9ORVRMSU5LLCBTT0NLX1JBVywgTkVUTElOS19ORVRGSUxURVIpOworCWlmIChzb2NrIDwgMCkgeworCQkvKiBpZiBuZXRsaW5rIGlzIG5vdCBzdXBwb3J0ZWQgdGhpcyBpcyBub3QgZmF0YWwgKi8KKwkJaWYgKGVycm5vID09IEVBRk5PU1VQUE9SVCB8fCBlcnJubyA9PSBFUFJPVE9OT1NVUFBPUlQpCisJCQlyZXR1cm4gMDsKKwkJc25wcmludGYoZXJyX3N0ciwgUENBUF9FUlJCVUZfU0laRSwgIkNhbid0IG9wZW4gbmV0bGluayBzb2NrZXQgJWQ6JXMiLAorCQkJZXJybm8sIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShzb2NrKTsKKworCWlmIChwY2FwX2FkZF9pZigmZm91bmRfZGV2LCBORkxPR19JRkFDRSwgMCwgIkxpbnV4IG5ldGZpbHRlciBsb2cgKE5GTE9HKSBpbnRlcmZhY2UiLCBlcnJfc3RyKSA8IDApCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLW5ldGZpbHRlci1saW51eC5oIGIvbGlicGNhcC0xLjMuMC9wY2FwLW5ldGZpbHRlci1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNzZiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtbmV0ZmlsdGVyLWxpbnV4LmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBKYWt1YiBaYXdhZHpraQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIG5ldGxpbmstcmVsYXRlZCBmdW5jdGlvbnMKKyAqLworaW50IG5ldGZpbHRlcl9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyX3N0cik7CitwY2FwX3QgKm5mbG9nX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLW5pdC5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OTk1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtbml0LmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1uaXQuYyx2IDEuNjIgMjAwOC0wNC0xNCAyMDo0MDo1OCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWViLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvbml0Lmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvdWRwX3Zhci5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3BpcC5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaWZkZWYgSEFWRV9PU19QUk9UT19ICisjaW5jbHVkZSAib3MtcHJvdG8uaCIKKyNlbmRpZgorCisvKgorICogVGhlIGNodW5rIHNpemUgZm9yIE5JVC4gIFRoaXMgaXMgdGhlIGFtb3VudCBvZiBidWZmZXJpbmcKKyAqIGRvbmUgZm9yIHJlYWQgY2FsbHMuCisgKi8KKyNkZWZpbmUgQ0hVTktTSVpFICgyKjEwMjQpCisKKy8qCisgKiBUaGUgdG90YWwgYnVmZmVyIHNwYWNlIHVzZWQgYnkgTklULgorICovCisjZGVmaW5lIEJVRlNQQUNFICg0KkNIVU5LU0laRSkKKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyBpbnQgbml0X3NldGZsYWdzKGludCwgaW50LCBpbnQsIGNoYXIgKik7CisKK3N0YXRpYyBpbnQKK3BjYXBfc3RhdHNfbml0KHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCit7CisKKwkvKgorCSAqICJwc19yZWN2IiBjb3VudHMgcGFja2V0cyBoYW5kZWQgdG8gdGhlIGZpbHRlciwgbm90IHBhY2tldHMKKwkgKiB0aGF0IHBhc3NlZCB0aGUgZmlsdGVyLiAgQXMgZmlsdGVyaW5nIGlzIGRvbmUgaW4gdXNlcmxhbmQsCisJICogdGhpcyBkb2VzIG5vdCBpbmNsdWRlIHBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIHdlIHJhbiBvdXQKKwkgKiBvZiBidWZmZXIgc3BhY2UuCisJICoKKwkgKiAicHNfZHJvcCIgcHJlc3VtYWJseSBjb3VudHMgcGFja2V0cyBkcm9wcGVkIGJ5IHRoZSBzb2NrZXQKKwkgKiBiZWNhdXNlIG9mIGZsb3cgY29udHJvbCByZXF1aXJlbWVudHMgb3IgcmVzb3VyY2UgZXhoYXVzdGlvbjsKKwkgKiBpdCBkb2Vzbid0IGNvdW50IHBhY2tldHMgZHJvcHBlZCBieSB0aGUgaW50ZXJmYWNlIGRyaXZlci4KKwkgKiBBcyBmaWx0ZXJpbmcgaXMgZG9uZSBpbiB1c2VybGFuZCwgaXQgY291bnRzIHBhY2tldHMgcmVnYXJkbGVzcworCSAqIG9mIHdoZXRoZXIgdGhleSB3b3VsZCd2ZSBwYXNzZWQgdGhlIGZpbHRlci4KKwkgKgorCSAqIFRoZXNlIHN0YXRpc3RpY3MgZG9uJ3QgaW5jbHVkZSBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tIHRoZQorCSAqIGtlcm5lbCBieSBsaWJwY2FwIG9yIHBhY2tldHMgbm90IHlldCByZWFkIGZyb20gbGlicGNhcCBieSB0aGUKKwkgKiBhcHBsaWNhdGlvbi4KKwkgKi8KKwkqcHMgPSBwLT5tZC5zdGF0OworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfcmVhZF9uaXQocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwlyZWdpc3RlciBpbnQgY2MsIG47CisJcmVnaXN0ZXIgdV9jaGFyICpicCwgKmNwLCAqZXA7CisJcmVnaXN0ZXIgc3RydWN0IG5pdF9oZHIgKm5oOworCXJlZ2lzdGVyIGludCBjYXBsZW47CisKKwljYyA9IHAtPmNjOworCWlmIChjYyA9PSAwKSB7CisJCWNjID0gcmVhZChwLT5mZCwgKGNoYXIgKilwLT5idWZmZXIsIHAtPmJ1ZnNpemUpOworCQlpZiAoY2MgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0spCisJCQkJcmV0dXJuICgwKTsKKwkJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksICJwY2FwX3JlYWQ6ICVzIiwKKwkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlicCA9IHAtPmJ1ZmZlcjsKKwl9IGVsc2UKKwkJYnAgPSBwLT5icDsKKworCS8qCisJICogTG9vcCB0aHJvdWdoIGVhY2ggcGFja2V0LiAgVGhlIGluY3JlbWVudCBleHByZXNzaW9uCisJICogcm91bmRzIHVwIHRvIHRoZSBuZXh0IGludCBib3VuZGFyeSBwYXN0IHRoZSBlbmQgb2YKKwkgKiB0aGUgcHJldmlvdXMgcGFja2V0LgorCSAqLworCW4gPSAwOworCWVwID0gYnAgKyBjYzsKKwl3aGlsZSAoYnAgPCBlcCkgeworCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKiBJZiBzbywgcmV0dXJuIGltbWVkaWF0ZWx5IC0gaWYgd2UgaGF2ZW4ndCByZWFkIGFueQorCQkgKiBwYWNrZXRzLCBjbGVhciB0aGUgZmxhZyBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlCisJCSAqIHRoYXQgd2Ugd2VyZSB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgb3RoZXJ3aXNlCisJCSAqIGxlYXZlIHRoZSBmbGFnIHNldCwgc28gdGhhdCB0aGUgKm5leHQqIGNhbGwgd2lsbCBicmVhaworCQkgKiBvdXQgb2YgdGhlIGxvb3Agd2l0aG91dCBoYXZpbmcgcmVhZCBhbnkgcGFja2V0cywgYW5kCisJCSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UndmUgcHJvY2Vzc2VkIHNvIGZhci4KKwkJICovCisJCWlmIChwLT5icmVha19sb29wKSB7CisJCQlpZiAobiA9PSAwKSB7CisJCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQkJcmV0dXJuICgtMik7CisJCQl9IGVsc2UgeworCQkJCXAtPmNjID0gZXAgLSBicDsKKwkJCQlwLT5icCA9IGJwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKworCQluaCA9IChzdHJ1Y3Qgbml0X2hkciAqKWJwOworCQljcCA9IGJwICsgc2l6ZW9mKCpuaCk7CisKKwkJc3dpdGNoIChuaC0+bmhfc3RhdGUpIHsKKworCQljYXNlIE5JVF9DQVRDSDoKKwkJCWJyZWFrOworCisJCWNhc2UgTklUX05PTUJVRjoKKwkJY2FzZSBOSVRfTk9DTFVTVEVSOgorCQljYXNlIE5JVF9OT1NQQUNFOgorCQkJcC0+bWQuc3RhdC5wc19kcm9wID0gbmgtPm5oX2Ryb3BwZWQ7CisJCQljb250aW51ZTsKKworCQljYXNlIE5JVF9TRVFOTzoKKwkJCWNvbnRpbnVlOworCisJCWRlZmF1bHQ6CisJCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkJICAgICJiYWQgbml0IHN0YXRlICVkIiwgbmgtPm5oX3N0YXRlKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCSsrcC0+bWQuc3RhdC5wc19yZWN2OworCQlicCArPSAoKHNpemVvZihzdHJ1Y3Qgbml0X2hkcikgKyBuaC0+bmhfZGF0YWxlbiArCisJCSAgICBzaXplb2YoaW50KSAtIDEpICYgfihzaXplb2YoaW50KSAtIDEpKTsKKworCQljYXBsZW4gPSBuaC0+bmhfd2lyZWxlbjsKKwkJaWYgKGNhcGxlbiA+IHAtPnNuYXBzaG90KQorCQkJY2FwbGVuID0gcC0+c25hcHNob3Q7CisJCWlmIChicGZfZmlsdGVyKHAtPmZjb2RlLmJmX2luc25zLCBjcCwgbmgtPm5oX3dpcmVsZW4sIGNhcGxlbikpIHsKKwkJCXN0cnVjdCBwY2FwX3BrdGhkciBoOworCQkJaC50cyA9IG5oLT5uaF90aW1lc3RhbXA7CisJCQloLmxlbiA9IG5oLT5uaF93aXJlbGVuOworCQkJaC5jYXBsZW4gPSBjYXBsZW47CisJCQkoKmNhbGxiYWNrKSh1c2VyLCAmaCwgY3ApOworCQkJaWYgKCsrbiA+PSBjbnQgJiYgY250ID4gMCkgeworCQkJCXAtPmNjID0gZXAgLSBicDsKKwkJCQlwLT5icCA9IGJwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKwl9CisJcC0+Y2MgPSAwOworCXJldHVybiAobik7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfaW5qZWN0X25pdChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHNvY2thZGRyIHNhOworCWludCByZXQ7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzdHJuY3B5KHNhLnNhX2RhdGEsIGRldmljZSwgc2l6ZW9mKHNhLnNhX2RhdGEpKTsKKwlyZXQgPSBzZW5kdG8ocC0+ZmQsIGJ1Ziwgc2l6ZSwgMCwgJnNhLCBzaXplb2Yoc2EpKTsKKwlpZiAocmV0ID09IC0xKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAocmV0KTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAKKworc3RhdGljIGludAorbml0X3NldGZsYWdzKGludCBmZCwgaW50IHByb21pc2MsIGludCB0b19tcywgY2hhciAqZWJ1ZikKK3sKKwlzdHJ1Y3Qgbml0X2lvYyBuaW9jOworCisJbWVtc2V0KCZuaW9jLCAwLCBzaXplb2YobmlvYykpOworCW5pb2MubmlvY19idWZzcGFjZSA9IEJVRlNQQUNFOworCW5pb2MubmlvY19jaHVua3NpemUgPSBDSFVOS1NJWkU7CisJbmlvYy5uaW9jX3R5cGV0b21hdGNoID0gTlRfQUxMVFlQRVM7CisJbmlvYy5uaW9jX3NuYXBsZW4gPSBwLT5zbmFwc2hvdDsKKwluaW9jLm5pb2NfYnVmYWxpZ24gPSBzaXplb2YoaW50KTsKKwluaW9jLm5pb2NfYnVmb2Zmc2V0ID0gMDsKKworCWlmICh0b19tcyAhPSAwKSB7CisJCW5pb2MubmlvY19mbGFncyB8PSBORl9USU1FT1VUOworCQluaW9jLm5pb2NfdGltZW91dC50dl9zZWMgPSB0b19tcyAvIDEwMDA7CisJCW5pb2MubmlvY190aW1lb3V0LnR2X3VzZWMgPSAodG9fbXMgKiAxMDAwKSAlIDEwMDAwMDA7CisJfQorCWlmIChwcm9taXNjKQorCQluaW9jLm5pb2NfZmxhZ3MgfD0gTkZfUFJPTUlTQzsKKworCWlmIChpb2N0bChmZCwgU0lPQ1NOSVQsICZuaW9jKSA8IDApIHsKKwkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NTTklUOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX25pdChwY2FwX3QgKnApCit7CisJaW50IGZkOworCXN0cnVjdCBzb2NrYWRkcl9uaXQgc25pdDsKKworCWlmIChwLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogTm8gbW9uaXRvciBtb2RlIG9uIFN1bk9TIDMueCBvciBlYXJsaWVyIChubworCQkgKiBXaS1GaSAqZGV2aWNlcyogZm9yIHRoZSBoYXJkd2FyZSB0aGF0IHN1cHBvcnRlZAorCQkgKiB0aGVtISkuCisJCSAqLworCQlyZXR1cm4gKFBDQVBfRVJST1JfUkZNT05fTk9UU1VQKTsKKwl9CisKKwlpZiAocC0+c25hcHNob3QgPCA5NikKKwkJLyoKKwkJICogTklUIHJlcXVpcmVzIGEgc25hcHNob3QgbGVuZ3RoIG9mIGF0IGxlYXN0IDk2LgorCQkgKi8KKwkJcC0+c25hcHNob3QgPSA5NjsKKworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwlwLT5mZCA9IGZkID0gc29ja2V0KEFGX05JVCwgU09DS19SQVcsIE5JVFBST1RPX1JBVyk7CisJaWYgKGZkIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAic29ja2V0OiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCXNuaXQuc25pdF9mYW1pbHkgPSBBRl9OSVQ7CisJKHZvaWQpc3RybmNweShzbml0LnNuaXRfaWZuYW1lLCBwLT5vcHQuc291cmNlLCBOSVRJRlNJWik7CisKKwlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzbml0LCBzaXplb2Yoc25pdCkpKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJiaW5kOiAlczogJXMiLCBzbml0LnNuaXRfaWZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gYmFkOworCX0KKwluaXRfc2V0ZmxhZ3MocC0+ZmQsIHAtPm9wdC5wcm9taXNjLCBwLT5tZC50aW1lb3V0LCBwLT5lcnJidWYpOworCisJLyoKKwkgKiBOSVQgc3VwcG9ydHMgb25seSBldGhlcm5ldHMuCisJICovCisJcC0+bGlua3R5cGUgPSBETFRfRU4xME1COworCisJcC0+YnVmc2l6ZSA9IEJVRlNQQUNFOworCXAtPmJ1ZmZlciA9ICh1X2NoYXIgKiltYWxsb2MocC0+YnVmc2l6ZSk7CisJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXN0cmxjcHkocC0+ZXJyYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSwgUENBUF9FUlJCVUZfU0laRSk7CisJCWdvdG8gYmFkOworCX0KKworCS8qCisJICogInAtPmZkIiBpcyBhIHNvY2tldCwgc28gInNlbGVjdCgpIiBzaG91bGQgd29yayBvbiBpdC4KKwkgKi8KKwlwLT5zZWxlY3RhYmxlX2ZkID0gcC0+ZmQ7CisKKwkvKgorCSAqIFRoaXMgaXMgKHByZXN1bWFibHkpIGEgcmVhbCBFdGhlcm5ldCBjYXB0dXJlOyBnaXZlIGl0IGEKKwkgKiBsaW5rLWxheWVyLXR5cGUgbGlzdCB3aXRoIERMVF9FTjEwTUIgYW5kIERMVF9ET0NTSVMsIHNvCisJICogdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gbGV0IHlvdSBjaG9vc2UgaXQsIGluIGNhc2UgeW91J3JlCisJICogY2FwdHVyaW5nIERPQ1NJUyB0cmFmZmljIHRoYXQgYSBDaXNjbyBDYWJsZSBNb2RlbQorCSAqIFRlcm1pbmF0aW9uIFN5c3RlbSBpcyBwdXR0aW5nIG91dCBvbnRvIGFuIEV0aGVybmV0IChpdAorCSAqIGRvZXNuJ3QgcHV0IGFuIEV0aGVybmV0IGhlYWRlciBvbnRvIHRoZSB3aXJlLCBpdCBwdXRzIHJhdworCSAqIERPQ1NJUyBmcmFtZXMgb3V0IG9uIHRoZSB3aXJlIGluc2lkZSB0aGUgbG93LWxldmVsCisJICogRXRoZXJuZXQgZnJhbWluZykuCisJICovCisJcC0+ZGx0X2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKKwkvKgorCSAqIElmIHRoYXQgZmFpbHMsIGp1c3QgbGVhdmUgdGhlIGxpc3QgZW1wdHkuCisJICovCisJaWYgKHAtPmRsdF9saXN0ICE9IE5VTEwpIHsKKwkJcC0+ZGx0X2xpc3RbMF0gPSBETFRfRU4xME1COworCQlwLT5kbHRfbGlzdFsxXSA9IERMVF9ET0NTSVM7CisJCXAtPmRsdF9jb3VudCA9IDI7CisJfQorCisJcC0+cmVhZF9vcCA9IHBjYXBfcmVhZF9uaXQ7CisJcC0+aW5qZWN0X29wID0gcGNhcF9pbmplY3Rfbml0OworCXAtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07CS8qIG5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwlwLT5zZXRkaXJlY3Rpb25fb3AgPSBOVUxMOwkvKiBOb3QgaW1wbGVtZW50ZWQuICovCisJcC0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsJLyogY2FuJ3QgY2hhbmdlIGRhdGEgbGluayB0eXBlICovCisJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOworCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfbml0OworCisJcmV0dXJuICgwKTsKKyBiYWQ6CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKHApOworCXJldHVybiAoUENBUF9FUlJPUik7Cit9CisKK3BjYXBfdCAqCitwY2FwX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpwOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5hY3RpdmF0ZV9vcCA9IHBjYXBfYWN0aXZhdGVfbml0OworCXJldHVybiAocCk7Cit9CisKK2ludAorcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtbnVsbC5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLW51bGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI3MWViCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLW51bGwuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtbnVsbC5jLHYgMS4yMiAyMDA4LTA0LTA0IDE5OjM3OjQ1IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CQkJLyogb3B0aW9uYWxseSBnZXQgQlNEIGRlZmluZSAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX09TX1BST1RPX0gKKyNpbmNsdWRlICJvcy1wcm90by5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCitzdGF0aWMgY2hhciBub3N1cFtdID0gImxpdmUgcGFja2V0IGNhcHR1cmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSI7CisKK3BjYXBfdCAqCitwY2FwX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpCit7CisJKHZvaWQpc3RybGNweShlYnVmLCBub3N1cCwgUENBUF9FUlJCVUZfU0laRSk7CisJcmV0dXJuIChOVUxMKTsKK30KKworaW50CitwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1wZi5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLXBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgzMjZkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1wZi5jCkBAIC0wLDAgKzEsNjA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogcGFja2V0IGZpbHRlciBzdWJyb3V0aW5lcyBmb3IgdGNwZHVtcAorICoJRXh0cmFjdGlvbi9jcmVhdGlvbiBieSBKZWZmcmV5IE1vZ3VsLCBERUNXUkwKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXBmLmMsdiAxLjk3IDIwMDgtMDQtMTQgMjA6NDA6NTggZ3V5IEV4cCAkIChMQkwpIjsKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgImNvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lYi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPG5ldC9wZmlsdC5oPgorCitzdHJ1Y3QgbWJ1ZjsKK3N0cnVjdCBydGVudHJ5OworI2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW5fc3lzdG0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CisjaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3VkcF92YXIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwaXAuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qCisgKiBNYWtlICJwY2FwLmgiIG5vdCBpbmNsdWRlICJwY2FwL2JwZi5oIjsgd2UgYXJlIGdvaW5nIHRvIGluY2x1ZGUgdGhlCisgKiBuYXRpdmUgT1MgdmVyc2lvbiwgYXMgd2UgbmVlZCB2YXJpb3VzIEJQRiBpb2N0bHMgZnJvbSBpdC4KKyAqLworI2RlZmluZSBQQ0FQX0RPTlRfSU5DTFVERV9QQ0FQX0JQRl9ICisjaW5jbHVkZSA8bmV0L2JwZi5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworc3RhdGljIGludCBwY2FwX3NldGZpbHRlcl9wZihwY2FwX3QgKiwgc3RydWN0IGJwZl9wcm9ncmFtICopOworCisvKgorICogQlVGU1BBQ0UgaXMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHBhY2tldCByZWFkIGJ1ZmZlci4gIE1vc3QgdGNwZHVtcAorICogYXBwbGljYXRpb25zIGFyZW4ndCBnb2luZyB0byBuZWVkIG1vcmUgdGhhbiAyMDAgYnl0ZXMgb2YgcGFja2V0IGhlYWRlcgorICogYW5kIHRoZSByZWFkIHNob3VsZG4ndCByZXR1cm4gbW9yZSBwYWNrZXRzIHRoYW4gcGFja2V0ZmlsdGVyJ3MgaW50ZXJuYWwKKyAqIHF1ZXVlIGxpbWl0IChib3VuZGVkIGF0IDI1NikuCisgKi8KKyNkZWZpbmUgQlVGU1BBQ0UgKDIwMCAqIDI1NikKKworc3RhdGljIGludAorcGNhcF9yZWFkX3BmKHBjYXBfdCAqcGMsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXJlZ2lzdGVyIHVfY2hhciAqcCwgKmJwOworCXJlZ2lzdGVyIGludCBjYywgbiwgYnVmbGVuLCBpbmM7CisJcmVnaXN0ZXIgc3RydWN0IGVuc3RhbXAgKnNwOworI2lmZGVmIExCTF9BTElHTgorCXN0cnVjdCBlbnN0YW1wIHN0YW1wOworI2VuZGlmCisjaWZkZWYgUENBUF9GRERJUEFECisJcmVnaXN0ZXIgaW50IHBhZDsKKyNlbmRpZgorCisgYWdhaW46CisJY2MgPSBwYy0+Y2M7CisJaWYgKGNjID09IDApIHsKKwkJY2MgPSByZWFkKHBjLT5mZCwgKGNoYXIgKilwYy0+YnVmZmVyICsgcGMtPm9mZnNldCwgcGMtPmJ1ZnNpemUpOworCQlpZiAoY2MgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRVdPVUxEQkxPQ0spCisJCQkJcmV0dXJuICgwKTsKKwkJCWlmIChlcnJubyA9PSBFSU5WQUwgJiYKKwkJCSAgICBsc2VlayhwYy0+ZmQsIDBMLCBTRUVLX0NVUikgKyBwYy0+YnVmc2l6ZSA8IDApIHsKKwkJCQkvKgorCQkJCSAqIER1ZSB0byBhIGtlcm5lbCBidWcsIGFmdGVyIDJeMzEgYnl0ZXMsCisJCQkJICogdGhlIGtlcm5lbCBmaWxlIG9mZnNldCBvdmVyZmxvd3MgYW5kCisJCQkJICogcmVhZCBmYWlscyB3aXRoIEVJTlZBTC4gVGhlIGxzZWVrKCkKKwkJCQkgKiB0byAwIHdpbGwgZml4IHRoaW5ncy4KKwkJCQkgKi8KKwkJCQkodm9pZClsc2VlayhwYy0+ZmQsIDBMLCBTRUVLX1NFVCk7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCXNucHJpbnRmKHBjLT5lcnJidWYsIHNpemVvZihwYy0+ZXJyYnVmKSwgInBmIHJlYWQ6ICVzIiwKKwkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCQlicCA9IHBjLT5idWZmZXIgKyBwYy0+b2Zmc2V0OworCX0gZWxzZQorCQlicCA9IHBjLT5icDsKKwkvKgorCSAqIExvb3AgdGhyb3VnaCBlYWNoIHBhY2tldC4KKwkgKi8KKwluID0gMDsKKyNpZmRlZiBQQ0FQX0ZERElQQUQKKwlwYWQgPSBwYy0+ZmRkaXBhZDsKKyNlbmRpZgorCXdoaWxlIChjYyA+IDApIHsKKwkJLyoKKwkJICogSGFzICJwY2FwX2JyZWFrbG9vcCgpIiBiZWVuIGNhbGxlZD8KKwkJICogSWYgc28sIHJldHVybiBpbW1lZGlhdGVseSAtIGlmIHdlIGhhdmVuJ3QgcmVhZCBhbnkKKwkJICogcGFja2V0cywgY2xlYXIgdGhlIGZsYWcgYW5kIHJldHVybiAtMiB0byBpbmRpY2F0ZQorCQkgKiB0aGF0IHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AsIG90aGVyd2lzZQorCQkgKiBsZWF2ZSB0aGUgZmxhZyBzZXQsIHNvIHRoYXQgdGhlICpuZXh0KiBjYWxsIHdpbGwgYnJlYWsKKwkJICogb3V0IG9mIHRoZSBsb29wIHdpdGhvdXQgaGF2aW5nIHJlYWQgYW55IHBhY2tldHMsIGFuZAorCQkgKiByZXR1cm4gdGhlIG51bWJlciBvZiBwYWNrZXRzIHdlJ3ZlIHByb2Nlc3NlZCBzbyBmYXIuCisJCSAqLworCQlpZiAocGMtPmJyZWFrX2xvb3ApIHsKKwkJCWlmIChuID09IDApIHsKKwkJCQlwYy0+YnJlYWtfbG9vcCA9IDA7CisJCQkJcmV0dXJuICgtMik7CisJCQl9IGVsc2UgeworCQkJCXBjLT5jYyA9IGNjOworCQkJCXBjLT5icCA9IGJwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKwkJaWYgKGNjIDwgc2l6ZW9mKCpzcCkpIHsKKwkJCXNucHJpbnRmKHBjLT5lcnJidWYsIHNpemVvZihwYy0+ZXJyYnVmKSwKKwkJCSAgICAicGYgc2hvcnQgcmVhZCAoJWQpIiwgY2MpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKyNpZmRlZiBMQkxfQUxJR04KKwkJaWYgKChsb25nKWJwICYgMykgeworCQkJc3AgPSAmc3RhbXA7CisJCQltZW1jcHkoKGNoYXIgKilzcCwgKGNoYXIgKilicCwgc2l6ZW9mKCpzcCkpOworCQl9IGVsc2UKKyNlbmRpZgorCQkJc3AgPSAoc3RydWN0IGVuc3RhbXAgKilicDsKKwkJaWYgKHNwLT5lbnNfc3RhbXBsZW4gIT0gc2l6ZW9mKCpzcCkpIHsKKwkJCXNucHJpbnRmKHBjLT5lcnJidWYsIHNpemVvZihwYy0+ZXJyYnVmKSwKKwkJCSAgICAicGYgc2hvcnQgc3RhbXBsZW4gKCVkKSIsCisJCQkgICAgc3AtPmVuc19zdGFtcGxlbik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCisJCXAgPSBicCArIHNwLT5lbnNfc3RhbXBsZW47CisJCWJ1ZmxlbiA9IHNwLT5lbnNfY291bnQ7CisJCWlmIChidWZsZW4gPiBwYy0+c25hcHNob3QpCisJCQlidWZsZW4gPSBwYy0+c25hcHNob3Q7CisKKwkJLyogQ2FsY3VsYXRlIGluYyBiZWZvcmUgcG9zc2libGUgcGFkIHVwZGF0ZSAqLworCQlpbmMgPSBFTkFMSUdOKGJ1ZmxlbiArIHNwLT5lbnNfc3RhbXBsZW4pOworCQljYyAtPSBpbmM7CisJCWJwICs9IGluYzsKKwkJcGMtPm1kLlRvdFBrdHMrKzsKKwkJcGMtPm1kLlRvdERyb3BzICs9IHNwLT5lbnNfZHJvcHBlZDsKKwkJcGMtPm1kLlRvdE1pc3NlZCA9IHNwLT5lbnNfaWZvdmVyZmxvd3M7CisJCWlmIChwYy0+bWQuT3JpZ01pc3NlZCA8IDApCisJCQlwYy0+bWQuT3JpZ01pc3NlZCA9IHBjLT5tZC5Ub3RNaXNzZWQ7CisKKwkJLyoKKwkJICogU2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uOiBpZiB1c2luZyBCUEYgZmlsdGVyCisJCSAqIGluIGtlcm5lbCwgbm8gbmVlZCB0byBkbyBpdCBub3cgLSB3ZSBhbHJlYWR5IGtub3cKKwkJICogdGhlIHBhY2tldCBwYXNzZWQgdGhlIGZpbHRlci4KKwkJICoKKyNpZmRlZiBQQ0FQX0ZERElQQUQKKwkJICogTm90ZTogdGhlIGZpbHRlciBjb2RlIHdhcyBnZW5lcmF0ZWQgYXNzdW1pbmcKKwkJICogdGhhdCBwYy0+ZmRkaXBhZCB3YXMgdGhlIGFtb3VudCBvZiBwYWRkaW5nCisJCSAqIGJlZm9yZSB0aGUgaGVhZGVyLCBhcyB0aGF0J3Mgd2hhdCdzIHJlcXVpcmVkCisJCSAqIGluIHRoZSBrZXJuZWwsIHNvIHdlIHJ1biB0aGUgZmlsdGVyIGJlZm9yZQorCQkgKiBza2lwcGluZyB0aGF0IHBhZGRpbmcuCisjZW5kaWYKKwkJICovCisJCWlmIChwYy0+bWQudXNlX2JwZiB8fAorCQkgICAgYnBmX2ZpbHRlcihwYy0+ZmNvZGUuYmZfaW5zbnMsIHAsIHNwLT5lbnNfY291bnQsIGJ1ZmxlbikpIHsKKwkJCXN0cnVjdCBwY2FwX3BrdGhkciBoOworCQkJcGMtPm1kLlRvdEFjY2VwdGVkKys7CisJCQloLnRzID0gc3AtPmVuc190c3RhbXA7CisjaWZkZWYgUENBUF9GRERJUEFECisJCQloLmxlbiA9IHNwLT5lbnNfY291bnQgLSBwYWQ7CisjZWxzZQorCQkJaC5sZW4gPSBzcC0+ZW5zX2NvdW50OworI2VuZGlmCisjaWZkZWYgUENBUF9GRERJUEFECisJCQlwICs9IHBhZDsKKwkJCWJ1ZmxlbiAtPSBwYWQ7CisjZW5kaWYKKwkJCWguY2FwbGVuID0gYnVmbGVuOworCQkJKCpjYWxsYmFjaykodXNlciwgJmgsIHApOworCQkJaWYgKCsrbiA+PSBjbnQgJiYgY250ID4gMCkgeworCQkJCXBjLT5jYyA9IGNjOworCQkJCXBjLT5icCA9IGJwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKwl9CisJcGMtPmNjID0gMDsKKwlyZXR1cm4gKG4pOworfQorCitzdGF0aWMgaW50CitwY2FwX2luamVjdF9wZihwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IHJldDsKKworCXJldCA9IHdyaXRlKHAtPmZkLCBidWYsIHNpemUpOworCWlmIChyZXQgPT0gLTEpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuIChyZXQpOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdGF0aWMgaW50CitwY2FwX3N0YXRzX3BmKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCit7CisKKwkvKgorCSAqIElmIHBhY2tldCBmaWx0ZXJpbmcgaXMgYmVpbmcgZG9uZSBpbiB0aGUga2VybmVsOgorCSAqCisJICoJInBzX3JlY3YiIGNvdW50cyBvbmx5IHBhY2tldHMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlci4KKwkgKglUaGlzIGRvZXMgbm90IGluY2x1ZGUgcGFja2V0cyBkcm9wcGVkIGJlY2F1c2Ugd2UKKwkgKglyYW4gb3V0IG9mIGJ1ZmZlciBzcGFjZS4gIChYWFggLSBwZXJoYXBzIGl0IHNob3VsZCwKKwkgKglieSBhZGRpbmcgInBzX2Ryb3AiIHRvICJwc19yZWN2IiwgZm9yIGNvbXBhdGliaWxpdHkKKwkgKgl3aXRoIHNvbWUgb3RoZXIgcGxhdGZvcm1zLiAgT24gdGhlIG90aGVyIGhhbmQsIG9uCisJICoJc29tZSBwbGF0Zm9ybXMgInBzX3JlY3YiIGNvdW50cyBvbmx5IHBhY2tldHMgdGhhdAorCSAqCXBhc3NlZCB0aGUgZmlsdGVyLCBhbmQgb24gb3RoZXJzIGl0IGNvdW50cyBwYWNrZXRzCisJICoJdGhhdCBkaWRuJ3QgcGFzcyB0aGUgZmlsdGVyLi4uLikKKwkgKgorCSAqCSJwc19kcm9wIiBjb3VudHMgcGFja2V0cyB0aGF0IHBhc3NlZCB0aGUga2VybmVsIGZpbHRlcgorCSAqCShpZiBhbnkpIGJ1dCB3ZXJlIGRyb3BwZWQgYmVjYXVzZSB0aGUgaW5wdXQgcXVldWUgd2FzCisJICoJZnVsbC4KKwkgKgorCSAqCSJwc19pZmRyb3AiIGNvdW50cyBwYWNrZXRzIGRyb3BwZWQgYnkgdGhlIG5ldHdvcmsKKwkgKglpbnRlZmFjZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgaGF2ZSBwYXNzZWQKKwkgKgl0aGUgaW5wdXQgZmlsdGVyLCBvZiBjb3Vyc2UpLgorCSAqCisJICogSWYgcGFja2V0IGZpbHRlcmluZyBpcyBub3QgYmVpbmcgZG9uZSBpbiB0aGUga2VybmVsOgorCSAqCisJICoJInBzX3JlY3YiIGNvdW50cyBvbmx5IHBhY2tldHMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlci4KKwkgKgorCSAqCSJwc19kcm9wIiBjb3VudHMgcGFja2V0cyB0aGF0IHdlcmUgZHJvcHBlZCBiZWNhdXNlIHRoZQorCSAqCWlucHV0IHF1ZXVlIHdhcyBmdWxsLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBwYXNzZWQKKwkgKgl0aGUgdXNlcmxhbmQgZmlsdGVyLgorCSAqCisJICoJInBzX2lmZHJvcCIgY291bnRzIHBhY2tldHMgZHJvcHBlZCBieSB0aGUgbmV0d29yaworCSAqCWludGVmYWNlIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSB3b3VsZCBoYXZlIHBhc3NlZAorCSAqCXRoZSBpbnB1dCBmaWx0ZXIsIG9mIGNvdXJzZSkuCisJICoKKwkgKiBUaGVzZSBzdGF0aXN0aWNzIGRvbid0IGluY2x1ZGUgcGFja2V0cyBub3QgeWV0IHJlYWQgZnJvbQorCSAqIHRoZSBrZXJuZWwgYnkgbGlicGNhcCwgYnV0IHRoZXkgbWF5IGluY2x1ZGUgcGFja2V0cyBub3QKKwkgKiB5ZXQgcmVhZCBmcm9tIGxpYnBjYXAgYnkgdGhlIGFwcGxpY2F0aW9uLgorCSAqLworCXBzLT5wc19yZWN2ID0gcC0+bWQuVG90QWNjZXB0ZWQ7CisJcHMtPnBzX2Ryb3AgPSBwLT5tZC5Ub3REcm9wczsKKwlwcy0+cHNfaWZkcm9wID0gcC0+bWQuVG90TWlzc2VkIC0gcC0+bWQuT3JpZ01pc3NlZDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogV2UgaW5jbHVkZSB0aGUgT1MncyA8bmV0L2JwZi5oPiwgbm90IG91ciAicGNhcC9icGYuaCIsIHNvIHdlIHByb2JhYmx5CisgKiBkb24ndCBnZXQgRExUX0RPQ1NJUyBkZWZpbmVkLgorICovCisjaWZuZGVmIERMVF9ET0NTSVMKKyNkZWZpbmUgRExUX0RPQ1NJUwkxNDMKKyNlbmRpZgorCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX3BmKHBjYXBfdCAqcCkKK3sKKwlzaG9ydCBlbm1vZGU7CisJaW50IGJhY2tsb2cgPSAtMTsJLyogcmVxdWVzdCB0aGUgbW9zdCAqLworCXN0cnVjdCBlbmZpbHRlciBGaWx0ZXI7CisJc3RydWN0IGVuZGV2cCBkZXZwYXJhbXM7CisKKwkvKgorCSAqIEluaXRpYWxseSB0cnkgYSByZWFkL3dyaXRlIG9wZW4gKHRvIGFsbG93IHRoZSBpbmplY3QKKwkgKiBtZXRob2QgdG8gd29yaykuICBJZiB0aGF0IGZhaWxzIGR1ZSB0byBwZXJtaXNzaW9uCisJICogaXNzdWVzLCBmYWxsIGJhY2sgdG8gcmVhZC1vbmx5LiAgVGhpcyBhbGxvd3MgYQorCSAqIG5vbi1yb290IHVzZXIgdG8gYmUgZ3JhbnRlZCBzcGVjaWZpYyBhY2Nlc3MgdG8gcGNhcAorCSAqIGNhcGFiaWxpdGllcyB2aWEgZmlsZSBwZXJtaXNzaW9ucy4KKwkgKgorCSAqIFhYWCAtIHdlIHNob3VsZCBoYXZlIGFuIEFQSSB0aGF0IGhhcyBhIGZsYWcgdGhhdAorCSAqIGNvbnRyb2xzIHdoZXRoZXIgdG8gb3BlbiByZWFkLW9ubHkgb3IgcmVhZC13cml0ZSwKKwkgKiBzbyB0aGF0IGRlbmlhbCBvZiBwZXJtaXNzaW9uIHRvIHNlbmQgKG9yIGluYWJpbGl0eQorCSAqIHRvIHNlbmQsIGlmIHNlbmRpbmcgcGFja2V0cyBpc24ndCBzdXBwb3J0ZWQgb24KKwkgKiB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uKSBjYW4gYmUgaW5kaWNhdGVkIGF0IG9wZW4KKwkgKiB0aW1lLgorCSAqCisJICogWFhYIC0gd2UgYXNzdW1lIGhlcmUgdGhhdCAicGZvcGVuKCkiIGRvZXMgbm90LCBpbiBmYWN0LCBtb2RpZnkKKwkgKiBpdHMgYXJndW1lbnQsIGV2ZW4gdGhvdWdoIGl0IHRha2VzIGEgImNoYXIgKiIgcmF0aGVyIHRoYW4gYQorCSAqICJjb25zdCBjaGFyICoiIGFzIGl0cyBmaXJzdCBhcmd1bWVudC4gIFRoYXQgYXBwZWFycyB0byBiZQorCSAqIHRoZSBjYXNlLCBhdCBsZWFzdCBvbiBEaWdpdGFsIFVOSVggNC4wLgorCSAqLworCXAtPmZkID0gcGZvcGVuKHAtPm9wdC5zb3VyY2UsIE9fUkRXUik7CisJaWYgKHAtPmZkID09IC0xICYmIGVycm5vID09IEVBQ0NFUykKKwkJcC0+ZmQgPSBwZm9wZW4ocC0+b3B0LnNvdXJjZSwgT19SRE9OTFkpOworCWlmIChwLT5mZCA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAicGYgb3BlbjogJXM6ICVzXG5cCit5b3VyIHN5c3RlbSBtYXkgbm90IGJlIHByb3Blcmx5IGNvbmZpZ3VyZWQ7IHNlZSB0aGUgcGFja2V0ZmlsdGVyKDQpIG1hbiBwYWdlXG4iLAorCQkJcC0+b3B0LnNvdXJjZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGJhZDsKKwl9CisJcC0+bWQuT3JpZ01pc3NlZCA9IC0xOworCWVubW9kZSA9IEVOVFNUQU1QfEVOQkFUQ0h8RU5OT05FWENMOworCWlmIChwLT5vcHQucHJvbWlzYykKKwkJZW5tb2RlIHw9IEVOUFJPTUlTQzsKKwlpZiAoaW9jdGwocC0+ZmQsIEVJT0NNQklTLCAoY2FkZHJfdCkmZW5tb2RlKSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ01CSVM6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorI2lmZGVmCUVOQ09QWUFMTAorCS8qIFRyeSB0byBzZXQgQ09QWUFMTCBtb2RlIHNvIHRoYXQgd2Ugc2VlIHBhY2tldHMgdG8gb3Vyc2VsZiAqLworCWVubW9kZSA9IEVOQ09QWUFMTDsKKwkodm9pZClpb2N0bChwLT5mZCwgRUlPQ01CSVMsIChjYWRkcl90KSZlbm1vZGUpOy8qIE9LIGlmIHRoaXMgZmFpbHMgKi8KKyNlbmRpZgorCS8qIHNldCB0aGUgYmFja2xvZyAqLworCWlmIChpb2N0bChwLT5mZCwgRUlPQ1NFVFcsIChjYWRkcl90KSZiYWNrbG9nKSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRUlPQ1NFVFc6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCS8qIGRpc2NvdmVyIGludGVyZmFjZSB0eXBlICovCisJaWYgKGlvY3RsKHAtPmZkLCBFSU9DREVWUCwgKGNhZGRyX3QpJmRldnBhcmFtcykgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NERVZQOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gYmFkOworCX0KKwkvKiBIQUNLOiB0byBjb21waWxlIHByaW9yIHRvIFVsdHJpeCA0LjIgKi8KKyNpZm5kZWYJRU5EVF9GRERJCisjZGVmaW5lCUVORFRfRkRESQk0CisjZW5kaWYKKwlzd2l0Y2ggKGRldnBhcmFtcy5lbmRfZGV2X3R5cGUpIHsKKworCWNhc2UgRU5EVF8xME1COgorCQlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7CisJCXAtPm9mZnNldCA9IDI7CisJCS8qCisJCSAqIFRoaXMgaXMgKHByZXN1bWFibHkpIGEgcmVhbCBFdGhlcm5ldCBjYXB0dXJlOyBnaXZlIGl0IGEKKwkJICogbGluay1sYXllci10eXBlIGxpc3Qgd2l0aCBETFRfRU4xME1CIGFuZCBETFRfRE9DU0lTLCBzbworCQkgKiB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiBsZXQgeW91IGNob29zZSBpdCwgaW4gY2FzZSB5b3UncmUKKwkJICogY2FwdHVyaW5nIERPQ1NJUyB0cmFmZmljIHRoYXQgYSBDaXNjbyBDYWJsZSBNb2RlbQorCQkgKiBUZXJtaW5hdGlvbiBTeXN0ZW0gaXMgcHV0dGluZyBvdXQgb250byBhbiBFdGhlcm5ldCAoaXQKKwkJICogZG9lc24ndCBwdXQgYW4gRXRoZXJuZXQgaGVhZGVyIG9udG8gdGhlIHdpcmUsIGl0IHB1dHMgcmF3CisJCSAqIERPQ1NJUyBmcmFtZXMgb3V0IG9uIHRoZSB3aXJlIGluc2lkZSB0aGUgbG93LWxldmVsCisJCSAqIEV0aGVybmV0IGZyYW1pbmcpLgorCQkgKi8KKwkJcC0+ZGx0X2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKKwkJLyoKKwkJICogSWYgdGhhdCBmYWlscywganVzdCBsZWF2ZSB0aGUgbGlzdCBlbXB0eS4KKwkJICovCisJCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7CisJCQlwLT5kbHRfbGlzdFswXSA9IERMVF9FTjEwTUI7CisJCQlwLT5kbHRfbGlzdFsxXSA9IERMVF9ET0NTSVM7CisJCQlwLT5kbHRfY291bnQgPSAyOworCQl9CisJCWJyZWFrOworCisJY2FzZSBFTkRUX0ZEREk6CisJCXAtPmxpbmt0eXBlID0gRExUX0ZEREk7CisJCWJyZWFrOworCisjaWZkZWYgRU5EVF9TTElQCisJY2FzZSBFTkRUX1NMSVA6CisJCXAtPmxpbmt0eXBlID0gRExUX1NMSVA7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBFTkRUX1BQUAorCWNhc2UgRU5EVF9QUFA6CisJCXAtPmxpbmt0eXBlID0gRExUX1BQUDsKKwkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIEVORFRfTE9PUEJBQ0sKKwljYXNlIEVORFRfTE9PUEJBQ0s6CisJCS8qCisJCSAqIEl0IGFwcGVhcnMgdG8gdXNlIEV0aGVybmV0IGZyYW1pbmcsIGF0IGxlYXN0IG9uCisJCSAqIERpZ2l0YWwgVU5JWCA0LjAuCisJCSAqLworCQlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7CisJCXAtPm9mZnNldCA9IDI7CisJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBFTkRUX1RSTgorCWNhc2UgRU5EVF9UUk46CisJCXAtPmxpbmt0eXBlID0gRExUX0lFRUU4MDI7CisJCWJyZWFrOworI2VuZGlmCisKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBYWFggLSB3aGF0IGFib3V0IEVORFRfSUVFRTgwMj8gIFRoZSBwZmlsdC5oIGhlYWRlcgorCQkgKiBmaWxlIGNhbGxzIHRoaXMgIklFRUUgODAyIG5ldHdvcmtzIChub24tRXRoZXJuZXQpIiwKKwkJICogYnV0IHRoYXQgZG9lc24ndCBzcGVjaWZ5IGEgc3BlY2lmaWMgbGluayBsYXllciB0eXBlOworCQkgKiBpdCBjb3VsZCBiZSA4MDIuNCwgb3IgODAyLjUgKGV4Y2VwdCB0aGF0IDgwMi41IGlzCisJCSAqIEVORFRfVFJOKSwgb3IgODAyLjYsIG9yIDgwMi4xMSwgb3IuLi4uICBUaGF0J3Mgd2h5CisJCSAqIERMVF9JRUVFODAyIHdhcyBoaWphY2tlZCB0byBtZWFuIFRva2VuIFJpbmcgaW4gdmFyaW91cworCQkgKiBCU0RzLCBhbmQgd2h5IHdlIHdlbnQgYWxvbmcgd2l0aCB0aGF0IGhpamFja2luZy4KKwkJICoKKwkJICogWFhYIC0gd2hhdCBhYm91dCBFTkRUX0hETEMgYW5kIEVORFRfTlVMTD8KKwkJICogUHJlc3VtYWJseSwgYXMgRU5EVF9PVEhFUiBpcyBqdXN0ICJNaXNjZWxsYW5lb3VzCisJCSAqIGZyYW1pbmciLCB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbywgYXMgdGhhdAorCQkgKiBkb2Vzbid0IHNwZWNpZnkgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgaGVhZGVyLgorCQkgKi8KKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgInVua25vd24gZGF0YS1saW5rIHR5cGUgJXUiLCBkZXZwYXJhbXMuZW5kX2Rldl90eXBlKTsKKwkJZ290byBiYWQ7CisJfQorCS8qIHNldCB0cnVuY2F0aW9uICovCisjaWZkZWYgUENBUF9GRERJUEFECisJaWYgKHAtPmxpbmt0eXBlID09IERMVF9GRERJKSB7CisJCXAtPmZkZGlwYWQgPSBQQ0FQX0ZERElQQUQ7CisKKwkJLyogcGFja2V0ZmlsdGVyIGluY2x1ZGVzIHRoZSBwYWRkaW5nIGluIHRoZSBzbmFwc2hvdCAqLworCQlwLT5zbmFwc2hvdCArPSBQQ0FQX0ZERElQQUQ7CisJfSBlbHNlCisJCXAtPmZkZGlwYWQgPSAwOworI2VuZGlmCisJaWYgKGlvY3RsKHAtPmZkLCBFSU9DVFJVTkNBVEUsIChjYWRkcl90KSZwLT5zbmFwc2hvdCkgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NUUlVOQ0FURTogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGJhZDsKKwl9CisJLyogYWNjZXB0IGFsbCBwYWNrZXRzICovCisJbWVtc2V0KCZGaWx0ZXIsIDAsIHNpemVvZihGaWx0ZXIpKTsKKwlGaWx0ZXIuZW5mX1ByaW9yaXR5ID0gMzc7CS8qIGFueXRoaW5nID4gMiAqLworCUZpbHRlci5lbmZfRmlsdGVyTGVuID0gMDsJLyogbWVhbnMgImFsd2F5cyB0cnVlIiAqLworCWlmIChpb2N0bChwLT5mZCwgRUlPQ1NFVEYsIChjYWRkcl90KSZGaWx0ZXIpIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJFSU9DU0VURjogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZiAocC0+bWQudGltZW91dCAhPSAwKSB7CisJCXN0cnVjdCB0aW1ldmFsIHRpbWVvdXQ7CisJCXRpbWVvdXQudHZfc2VjID0gcC0+bWQudGltZW91dCAvIDEwMDA7CisJCXRpbWVvdXQudHZfdXNlYyA9IChwLT5tZC50aW1lb3V0ICogMTAwMCkgJSAxMDAwMDAwOworCQlpZiAoaW9jdGwocC0+ZmQsIEVJT0NTUlRJTUVPVVQsIChjYWRkcl90KSZ0aW1lb3V0KSA8IDApIHsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkVJT0NTUlRJTUVPVVQ6ICVzIiwKKwkJCQlwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKworCXAtPmJ1ZnNpemUgPSBCVUZTUEFDRTsKKwlwLT5idWZmZXIgPSAodV9jaGFyKiltYWxsb2MocC0+YnVmc2l6ZSArIHAtPm9mZnNldCk7CisJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXN0cmxjcHkocC0+ZXJyYnVmLCBwY2FwX3N0cmVycm9yKGVycm5vKSwgUENBUF9FUlJCVUZfU0laRSk7CisJCWdvdG8gYmFkOworCX0KKworCS8qCisJICogInNlbGVjdCgpIiBhbmQgInBvbGwoKSIgd29yayBvbiBwYWNrZXRmaWx0ZXIgZGV2aWNlcy4KKwkgKi8KKwlwLT5zZWxlY3RhYmxlX2ZkID0gcC0+ZmQ7CisKKwlwLT5yZWFkX29wID0gcGNhcF9yZWFkX3BmOworCXAtPmluamVjdF9vcCA9IHBjYXBfaW5qZWN0X3BmOworCXAtPnNldGZpbHRlcl9vcCA9IHBjYXBfc2V0ZmlsdGVyX3BmOworCXAtPnNldGRpcmVjdGlvbl9vcCA9IE5VTEw7CS8qIE5vdCBpbXBsZW1lbnRlZC4gKi8KKwlwLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOwkvKiBjYW4ndCBjaGFuZ2UgZGF0YSBsaW5rIHR5cGUgKi8KKwlwLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CisJcC0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOworCXAtPnN0YXRzX29wID0gcGNhcF9zdGF0c19wZjsKKworCXJldHVybiAoMCk7CisgYmFkOgorCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwKTsKKwlyZXR1cm4gKFBDQVBfRVJST1IpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX3BmOworCXJldHVybiAocCk7Cit9CisKK2ludAorcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfc2V0ZmlsdGVyX3BmKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCkKK3sKKwlzdHJ1Y3QgYnBmX3ZlcnNpb24gYnY7CisKKwkvKgorCSAqIFNlZSBpZiBCSU9DVkVSU0lPTiB3b3Jrcy4gIElmIG5vdCwgd2UgYXNzdW1lIHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIHN1cHBvcnQgQlBGLXN0eWxlIGZpbHRlcnMgKGl0J3Mgbm90IGRvY3VtZW50ZWQgaW4gdGhlIGJwZig3KQorCSAqIG9yIHBhY2tldGZpbGVyKDcpIG1hbiBwYWdlcywgYnV0IHRoZSBjb2RlIHVzZWQgdG8gZmFpbCBpZgorCSAqIEJJT0NTRVRGIHdvcmtlZCBidXQgQklPQ1ZFUlNJT04gZGlkbid0LCBhbmQgSSd2ZSBzZWVuIGl0IGRvCisJICoga2VybmVsIGZpbHRlcmluZyBpbiBEVSA0LjAsIHNvIHByZXN1bWFibHkgQklPQ1ZFUlNJT04gd29ya3MKKwkgKiB0aGVyZSwgYXQgbGVhc3QpLgorCSAqLworCWlmIChpb2N0bChwLT5mZCwgQklPQ1ZFUlNJT04sIChjYWRkcl90KSZidikgPj0gMCkgeworCQkvKgorCQkgKiBPSywgd2UgaGF2ZSB0aGUgdmVyc2lvbiBvZiB0aGUgQlBGIGludGVycHJldGVyOworCQkgKiBpcyBpdCB0aGUgc2FtZSBtYWpvciB2ZXJzaW9uIGFzIHVzLCBhbmQgdGhlIHNhbWUKKwkJICogb3IgYmV0dGVyIG1pbm9yIHZlcnNpb24/CisJCSAqLworCQlpZiAoYnYuYnZfbWFqb3IgPT0gQlBGX01BSk9SX1ZFUlNJT04gJiYKKwkJICAgIGJ2LmJ2X21pbm9yID49IEJQRl9NSU5PUl9WRVJTSU9OKSB7CisJCQkvKgorCQkJICogWWVzLiAgVHJ5IHRvIGluc3RhbGwgdGhlIGZpbHRlci4KKwkJCSAqLworCQkJaWYgKGlvY3RsKHAtPmZkLCBCSU9DU0VURiwgKGNhZGRyX3QpZnApIDwgMCkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkJICAgICJCSU9DU0VURjogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBPSywgdGhhdCBzdWNjZWVkZWQuICBXZSdyZSBkb2luZyBmaWx0ZXJpbmcgaW4KKwkJCSAqIHRoZSBrZXJuZWwuICAoV2UgYXNzdW1lIHdlIGRvbid0IGhhdmUgYQorCQkJICogdXNlcmxhbmQgZmlsdGVyIGluc3RhbGxlZCAtIHRoYXQnZCByZXF1aXJlCisJCQkgKiBhIHByZXZpb3VzIHZlcnNpb24gY2hlY2sgdG8gaGF2ZSBmYWlsZWQgYnV0CisJCQkgKiB0aGlzIG9uZSB0byBzdWNjZWVkLikKKwkJCSAqCisJCQkgKiBYWFggLSB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHN1cHBsaWVkIHRvIHRoZQorCQkJICogYXBwbGljYXRpb24gYXMgYSB3YXJuaW5nIG9mIHNvbWUgc29ydCwKKwkJCSAqIGV4Y2VwdCB0aGF0IGlmIGl0J3MgYSBHVUkgYXBwbGljYXRpb24sIGl0J3MKKwkJCSAqIG5vdCBjbGVhciB0aGF0IGl0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4KKwkJCSAqIGEgd2luZG93IHRvIGFubm95IHRoZSB1c2VyLgorCQkJICovCisJCQlmcHJpbnRmKHN0ZGVyciwgInRjcGR1bXA6IFVzaW5nIGtlcm5lbCBCUEYgZmlsdGVyXG4iKTsKKwkJCXAtPm1kLnVzZV9icGYgPSAxOworCisJCQkvKgorCQkJICogRGlzY2FyZCBhbnkgcHJldmlvdXNseS1yZWNlaXZlZCBwYWNrZXRzLAorCQkJICogYXMgdGhleSBtaWdodCBoYXZlIHBhc3NlZCB3aGF0ZXZlciBmaWx0ZXIKKwkJCSAqIHdhcyBmb3JtZXJseSBpbiBlZmZlY3QsIGJ1dCBtaWdodCBub3QgcGFzcworCQkJICogdGhpcyBmaWx0ZXIgKEJJT0NTRVRGIGRpc2NhcmRzIHBhY2tldHMgYnVmZmVyZWQKKwkJCSAqIGluIHRoZSBrZXJuZWwsIHNvIHlvdSBjYW4gbG9zZSBwYWNrZXRzIGluIGFueQorCQkJICogY2FzZSkuCisJCQkgKi8KKwkJCXAtPmNjID0gMDsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCQkvKgorCQkgKiBXZSBjYW4ndCB1c2UgdGhlIGtlcm5lbCdzIEJQRiBpbnRlcnByZXRlcjsgZG9uJ3QgZ2l2ZQorCQkgKiB1cCwganVzdCBsb2cgYSBtZXNzYWdlIGFuZCBiZSBpbmVmZmljaWVudC4KKwkJICoKKwkJICogWFhYIC0gdGhpcyBzaG91bGQgcmVhbGx5IGJlIHN1cHBsaWVkIHRvIHRoZSBhcHBsaWNhdGlvbgorCQkgKiBhcyBhIHdhcm5pbmcgb2Ygc29tZSBzb3J0LgorCQkgKi8KKwkJZnByaW50ZihzdGRlcnIsCisJICAgICJ0Y3BkdW1wOiBSZXF1aXJlcyBCUEYgbGFuZ3VhZ2UgJWQuJWQgb3IgaGlnaGVyOyBrZXJuZWwgaXMgJWQuJWRcbiIsCisJCSAgICBCUEZfTUFKT1JfVkVSU0lPTiwgQlBGX01JTk9SX1ZFUlNJT04sCisJCSAgICBidi5idl9tYWpvciwgYnYuYnZfbWlub3IpOworCX0KKworCS8qCisJICogV2UgY291bGRuJ3QgZG8gZmlsdGVyaW5nIGluIHRoZSBrZXJuZWw7IGRvIGl0IGluIHVzZXJsYW5kLgorCSAqLworCWlmIChpbnN0YWxsX2JwZl9wcm9ncmFtKHAsIGZwKSA8IDApCisJCXJldHVybiAoLTEpOworCisJLyoKKwkgKiBYWFggLSB0aGlzIG1lc3NhZ2Ugc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhcworCSAqIGEgd2FybmluZyBvZiBzb21lIHNvcnQuCisJICovCisJZnByaW50ZihzdGRlcnIsICJ0Y3BkdW1wOiBGaWx0ZXJpbmcgaW4gdXNlciBwcm9jZXNzXG4iKTsKKwlwLT5tZC51c2VfYnBmID0gMDsKKwlyZXR1cm4gKDApOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLXNhdmVmaWxlLm1hbmZpbGUuaW4gYi9saWJwY2FwLTEuMy4wL3BjYXAtc2F2ZWZpbGUubWFuZmlsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc1NTljCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNhdmVmaWxlLm1hbmZpbGUuaW4KQEAgLTAsMCArMSwxMjcgQEAKKydcIiB0CisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXNhdmVmaWxlLm1hbmZpbGUuaW4sdiAxLjIgMjAwOC0xMC0yNCAwNzozMzo1MCBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQLVNBVkVGSUxFIEBNQU5fRklMRV9GT1JNQVRTQCAiMjEgT2N0b2JlciAyMDA4IgorLlNIIE5BTUUKK3BjYXAtc2F2ZWZpbGUgXC0gbGlicGNhcCBzYXZlZmlsZSBmb3JtYXQKKy5TSCBERVNDUklQVElPTgorTk9URTogYXBwbGljYXRpb25zIGFuZCBsaWJyYXJpZXMgc2hvdWxkLCBpZiBwb3NzaWJsZSwgdXNlIGxpYnBjYXAgdG8KK3JlYWQgc2F2ZWZpbGVzLCByYXRoZXIgdGhhbiBoYXZpbmcgdGhlaXIgb3duIGNvZGUgdG8gcmVhZCBzYXZlZmlsZXMuIAorSWYsIGluIHRoZSBmdXR1cmUsIGEgbmV3IGZpbGUgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSBsaWJwY2FwLAorYXBwbGljYXRpb25zIGFuZCBsaWJyYXJpZXMgdXNpbmcgbGlicGNhcCB0byByZWFkIHNhdmVmaWxlcyB3aWxsIGJlIGFibGUKK3RvIHJlYWQgdGhlIG5ldyBmb3JtYXQgb2Ygc2F2ZWZpbGVzLCBidXQgYXBwbGljYXRpb25zIGFuZCBsaWJyYXJpZXMKK3VzaW5nIHRoZWlyIG93biBjb2RlIHRvIHJlYWQgc2F2ZWZpbGVzIHdpbGwgaGF2ZSB0byBiZSBjaGFuZ2VkIHRvCitzdXBwb3J0IHRoZSBuZXcgZmlsZSBmb3JtYXQuCisuUFAKK2BgU2F2ZWZpbGVzJycgcmVhZCBhbmQgd3JpdHRlbiBieSBsaWJwY2FwIGFuZCBhcHBsaWNhdGlvbnMgdXNpbmcgbGlicGNhcAorc3RhcnQgd2l0aCBhIHBlci1maWxlIGhlYWRlci4gIFRoZSBmb3JtYXQgb2YgdGhlIHBlci1maWxlIGhlYWRlciBpczoKKy5SUworLlRTCitib3g7CitjIHMKK2MgfCBjCitjIHMuCitNYWdpYyBudW1iZXIKK18KK01ham9yIHZlcnNpb24JTWlub3IgdmVyc2lvbgorXworVGltZSB6b25lIG9mZnNldAorXworVGltZSBzdGFtcCBhY2N1cmFjeQorXworU25hcHNob3QgbGVuZ3RoCitfCitMaW5rLWxheWVyIGhlYWRlciB0eXBlCisuVEUKKy5SRQorLlBQCitBbGwgZmllbGRzIGluIHRoZSBwZXItZmlsZSBoZWFkZXIgYXJlIGluIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0Cit3cml0aW5nIHRoZSBmaWxlLiAgVGhlIGZpcnN0IGZpZWxkIGluIHRoZSBwZXItZmlsZSBoZWFkZXIgaXMgYSA0LWJ5dGUKK21hZ2ljIG51bWJlciwgd2l0aCB0aGUgdmFsdWUgMHhhMWIyYzNkNC4gIFRoZSBtYWdpYyBudW1iZXIsIHdoZW4gcmVhZCBieQorYSBob3N0IHdpdGggdGhlIHNhbWUgYnl0ZSBvcmRlciBhcyB0aGUgaG9zdCB0aGF0IHdyb3RlIHRoZSBmaWxlLCB3aWxsCitoYXZlIHRoZSB2YWx1ZSAweGExYjJjM2Q0LCBhbmQsIHdoZW4gcmVhZCBieSBhIGhvc3Qgd2l0aCB0aGUgb3Bwb3NpdGUKK2J5dGUgb3JkZXIgYXMgdGhlIGhvc3QgdGhhdCB3cm90ZSB0aGUgZmlsZSwgd2lsbCBoYXZlIHRoZSB2YWx1ZQorMHhkNGMzYjJhMS4gIFRoYXQgYWxsb3dzIHNvZnR3YXJlIHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKK3RoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0IHRoYXQgd3JvdGUgdGhlIGZpbGUgaXMgdGhlIHNhbWUgYXMgdGhlIGJ5dGUKK29yZGVyIG9mIHRoZSBob3N0IG9uIHdoaWNoIHRoZSBmaWxlIGlzIGJlaW5nIHJlYWQsIGFuZCB0aHVzIHdoZXRoZXIgdGhlCit2YWx1ZXMgaW4gdGhlIHBlci1maWxlIGFuZCBwZXItcGFja2V0IGhlYWRlcnMgbmVlZCB0byBiZSBieXRlLXN3YXBwZWQuCisuUFAKK0ZvbGxvd2luZyB0aGlzIGFyZToKKy5JUAorQSAyLWJ5dGUgZmlsZSBmb3JtYXQgbWFqb3IgdmVyc2lvbiBudW1iZXI7IHRoZSBjdXJyZW50IHZlcnNpb24gbnVtYmVyIGlzCisyLgorLklQCitBIDItYnl0ZSBmaWxlIGZvcm1hdCBtaW5vciB2ZXJzaW9uIG51bWJlcjsgdGhlIGN1cnJlbnQgdmVyc2lvbiBudW1iZXIgaXMKKzQuCisuSVAKK0EgNC1ieXRlIHRpbWUgem9uZSBvZmZzZXQ7IHRoaXMgaXMgYWx3YXlzIDAuCisuSVAKK0EgNC1ieXRlIG51bWJlciBnaXZpbmcgdGhlIGFjY3VyYWN5IG9mIHRpbWUgc3RhbXBzIGluIHRoZSBmaWxlOyB0aGlzIGlzCithbHdheXMgMC4KKy5JUAorQSA0LWJ5dGUgbnVtYmVyIGdpdmluZyB0aGUgInNuYXBzaG90IGxlbmd0aCIgb2YgdGhlIGNhcHR1cmU7IHBhY2tldHMKK2xvbmdlciB0aGFuIHRoZSBzbmFwc2hvdCBsZW5ndGggYXJlIHRydW5jYXRlZCB0byB0aGUgc25hcHNob3QgbGVuZ3RoLCBzbwordGhhdCwgaWYgdGhlIHNuYXBzaG90IGxlbmd0aCBpcworLklSIE4gLAorb25seSB0aGUgZmlyc3QKKy5JIE4KK2J5dGVzIG9mIGEgcGFja2V0IGxvbmdlciB0aGFuCisuSSBOCitieXRlcyB3aWxsIGJlIHNhdmVkIGluIHRoZSBjYXB0dXJlLgorLklQCithIDQtYnl0ZSBudW1iZXIgZ2l2aW5nIHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIGZvciBwYWNrZXRzIGluIHRoZQorY2FwdHVyZTsgc2VlCisuQlIgcGNhcC1saW5rdHlwZSAoQE1BTl9NSVNDX0lORk9AKQorZm9yIHRoZQorLkIgTElOS1RZUEVfCit2YWx1ZXMgdGhhdCBjYW4gYXBwZWFyIGluIHRoaXMgZmllbGQuCisuUFAKK0ZvbGxvd2luZyB0aGUgcGVyLWZpbGUgaGVhZGVyIGFyZSB6ZXJvIG9yIG1vcmUgcGFja2V0czsgZWFjaCBwYWNrZXQKK2JlZ2lucyB3aXRoIGEgcGVyLXBhY2tldCBoZWFkZXIsIHdoaWNoIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZQorcmF3IHBhY2tldCBkYXRhLiAgVGhlIGZvcm1hdCBvZiB0aGUgcGVyLXBhY2tldCBoZWFkZXIgaXM6CisuUlMKKy5UUworYm94OworYy4KK1RpbWUgc3RhbXAsIHNlY29uZHMgdmFsdWUKK18KK1RpbWUgc3RhbXAsIG1pY3Jvc2Vjb25kcyB2YWx1ZQorXworTGVuZ3RoIG9mIGNhcHR1cmVkIHBhY2tldCBkYXRhCitfCitVbi10cnVuY2F0ZWQgbGVuZ3RoIG9mIHRoZSBwYWNrZXQgZGF0YQorLlRFCisuUkUKKy5QUAorQWxsIGZpZWxkcyBpbiB0aGUgcGVyLXBhY2tldCBoZWFkZXIgYXJlIGluIHRoZSBieXRlIG9yZGVyIG9mIHRoZSBob3N0Cit3cml0aW5nIHRoZSBmaWxlLiAgVGhlIHBlci1wYWNrZXQgaGVhZGVyIGJlZ2lucyB3aXRoIGEgdGltZSBzdGFtcCBnaXZpbmcKK3RoZSBhcHByb3hpbWF0ZSB0aW1lIHRoZSBwYWNrZXQgd2FzIGNhcHR1cmVkOyB0aGUgdGltZSBzdGFtcCBjb25zaXN0cyBvZgorYSA0LWJ5dGUgdmFsdWUsIGdpdmluZyB0aGUgdGltZSBpbiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MCwKKzAwOjAwOjAwIFVUQywgZm9sbG93ZWQgYnkgYSA0LWJ5dGUgdmFsdWUsIGdpdmluZyB0aGUgdGltZSBpbgorbWljcm9zZWNvbmRzIHNpbmNlIHRoYXQgc2Vjb25kLiAgRm9sbG93aW5nIHRoYXQgYXJlIGEgNC1ieXRlIHZhbHVlCitnaXZpbmcgdGhlIG51bWJlciBvZiBieXRlcyBvZiBjYXB0dXJlZCBkYXRhIHRoYXQgZm9sbG93IHRoZSBwZXItcGFja2V0CitoZWFkZXIgYW5kIGEgNC1ieXRlIHZhbHVlIGdpdmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgaGF2ZQorYmVlbiBwcmVzZW50IGhhZCB0aGUgcGFja2V0IG5vdCBiZWVuIHRydW5jYXRlZCBieSB0aGUgc25hcHNob3QgbGVuZ3RoLiAKK1RoZSB0d28gbGVuZ3RocyB3aWxsIGJlIGVxdWFsIGlmIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgcGFja2V0IGRhdGEgYXJlCitsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNuYXBzaG90IGxlbmd0aC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXAtbGlua3R5cGUoQE1BTl9NSVNDX0lORk9AKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLXNlcHRlbC5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNlcHRlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzI0MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtc2VwdGVsLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBwY2FwLXNlcHRlbC5jOiBQYWNrZXQgY2FwdHVyZSBpbnRlcmZhY2UgZm9yIEludGVsL1NlcHRlbCBjYXJkLgorICoKKyAqIFRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoaXMgY29kZSBhdHRlbXB0cyB0byBtaW1pYyB0aGF0IG9mIHBjYXAtbGludXggYXMgbXVjaAorICogYXMgcG9zc2libGUuICBUaGlzIGNvZGUgaXMgY29tcGlsZWQgaW4gc2V2ZXJhbCBkaWZmZXJlbnQgd2F5cyBkZXBlbmRpbmcgb24KKyAqIHdoZXRoZXIgU0VQVEVMX09OTFkgYW5kIEhBVkVfU0VQVEVMX0FQSSBhcmUgZGVmaW5lZC4gIElmIEhBVkVfU0VQVEVMX0FQSSBpcworICogbm90IGRlZmluZWQgaXQgc2hvdWxkIG5vdCBnZXQgY29tcGlsZWQgaW4sIG90aGVyd2lzZSBpZiBTRVBURUxfT05MWSBpcworICogZGVmaW5lZCB0aGVuIHRoZSAnc2VwdGVsXycgZnVuY3Rpb24gY2FsbHMgYXJlIHJlbmFtZWQgdG8gJ3BjYXBfJworICogZXF1aXZhbGVudHMuICBJZiBTRVBURUxfT05MWSBpcyBub3QgZGVmaW5lZCB0aGVuIG5vdGhpbmcgaXMgYWx0ZXJlZCAtIHRoZQorICogc2VwdGVsXyBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgYXMgcmVxdWlyZWQgZnJvbSB0aGVpcgorICogcGNhcC1saW51eC9lcXVpdmFsZW50cy4KKyAqCisgKiBBdXRob3JzOiBHaWxiZXJ0IEhPWUVLIChnaWxfaG95ZWtAaG90bWFpbC5jb20pLCBFbGlhcyBNLiBLSE9VUlkKKyAqICgrOTYxIDMgNDg1MjQzKQorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtc2VwdGVsLmMsdiAxLjQgMjAwOC0wNC0xNCAyMDo0MDo1OCBndXkgRXhwICQiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIEhBVkVfU0VQVEVMX0FQSQorI2luY2x1ZGUgPG1zZy5oPgorI2luY2x1ZGUgPHNzN19pbmMuaD4KKyNpbmNsdWRlIDxzeXNnY3QuaD4KKyNpbmNsdWRlIDxwYWNrLmg+CisjaW5jbHVkZSA8c3lzdGVtLmg+CisjZW5kaWYgLyogSEFWRV9TRVBURUxfQVBJICovCisKKyNpZmRlZiBTRVBURUxfT05MWQorLyogVGhpcyBjb2RlIGlzIHJlcXVpcmVkIHdoZW4gY29tcGlsaW5nIGZvciBhIFNlcHRlbCBkZXZpY2Ugb25seS4gKi8KKyNpbmNsdWRlICJwY2FwLXNlcHRlbC5oIgorCisvKiBSZXBsYWNlIHNlcHRlbCBmdW5jdGlvbiBuYW1lcyB3aXRoIHBjYXAgZXF1aXZhbGVudC4gKi8KKyNkZWZpbmUgc2VwdGVsX2NyZWF0ZSBwY2FwX2NyZWF0ZQorI2RlZmluZSBzZXB0ZWxfcGxhdGZvcm1fZmluZGRldnMgcGNhcF9wbGF0Zm9ybV9maW5kZGV2cworI2VuZGlmIC8qIFNFUFRFTF9PTkxZICovCisKK3N0YXRpYyBpbnQgc2VwdGVsX3NldGZpbHRlcihwY2FwX3QgKnAsIHN0cnVjdCBicGZfcHJvZ3JhbSAqZnApOworc3RhdGljIGludCBzZXB0ZWxfc3RhdHMocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcyk7CitzdGF0aWMgaW50IHNlcHRlbF9zZXRub25ibG9jayhwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKTsKKworLyoKKyAqICBSZWFkIGF0IG1vc3QgbWF4X3BhY2tldHMgZnJvbSB0aGUgY2FwdHVyZSBxdWV1ZSBhbmQgY2FsbCB0aGUgY2FsbGJhY2sKKyAqICBmb3IgZWFjaCBvZiB0aGVtLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyBoYW5kbGVkLCAtMSBpZiBhbgorICogIGVycm9yIG9jY3VyZWQsIG9yIC0yIGlmIHdlIHdlcmUgdG9sZCB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AuCisgKi8KK3N0YXRpYyBpbnQgc2VwdGVsX3JlYWQocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikgeworCisgIEhEUiAqaDsKKyAgTVNHICptOworICBpbnQgcHJvY2Vzc2VkID0gMCA7CisgIGludCB0ID0gMCA7CisKKyAgLyogaWRlbnRpZmllciBmb3IgdGhlIG1lc3NhZ2UgcXVldWUgb2YgdGhlIG1vZHVsZSh1cGUpIGZyb20gd2hpY2ggd2UgYXJlIGNhcHR1cmluZworICAgKiBwYWNrZXRzLlRoZXNlIElEcyBhcmUgZGVmaW5lZCBpbiBzeXN0ZW0udHh0IC4gQnkgZGVmYXVsdCBpdCBpcyBzZXQgdG8gMHgyZAorICAgKiBzbyBjaGFuZ2UgaXQgdG8gMHhkZCBmb3IgdGVjaG5pY2FsIHJlYXNvbiBhbmQgdGhlcmVmb3JlIHRoZSBtb2R1bGUgaWQgZm9yIHVwZSBiZWNvbWVzOgorICAgKiBMT0NBTCAgICAgICAgMHhkZCAgICAgICAgICAgKiB1cGUgLSBFeGFtcGxlIHVzZXIgcGFydCB0YXNrICovCisgIHVuc2lnbmVkIGludCBpZCA9IDB4ZGQ7CisKKyAgLyogcHJvY2VzcyB0aGUgcGFja2V0cyAqLworICBkbyAgeworCisgICAgdW5zaWduZWQgc2hvcnQgcGFja2V0X2xlbiA9IDA7CisgICAgaW50IGNhcGxlbiA9IDA7CisgICAgaW50IGNvdW50ZXIgPSAwOworICAgIHN0cnVjdCBwY2FwX3BrdGhkciAgIHBjYXBfaGVhZGVyOworICAgIHVfY2hhciAqZHAgOworCisgICAgLyoKKyAgICAgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworICAgICAqLworbG9vcDoKKyAgICBpZiAocC0+YnJlYWtfbG9vcCkgeworICAgICAgLyoKKyAgICAgICAqIFllcyAtIGNsZWFyIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQKKyAgICAgICAqIGl0IGhhcywgYW5kIHJldHVybiAtMiB0byBpbmRpY2F0ZSB0aGF0CisgICAgICAgKiB3ZSB3ZXJlIHRvbGQgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorICAgICAgICovCisgICAgICBwLT5icmVha19sb29wID0gMDsKKyAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICAvKnJlcGVhdCB1bnRpbCBhIHBhY2tldCBpcyByZWFkCisgICAgICphIE5VTEwgbWVzc2FnZSBtZWFucyA6CisgICAgICogd2hlbiBubyBwYWNrZXQgaXMgaW4gcXVldWUgb3IgYWxsIHBhY2tldHMgaW4gcXVldWUgYWxyZWFkeSByZWFkICovCisgICAgZG8gIHsKKyAgICAgIC8qIHJlY2VpdmUgcGFja2V0IGluIG5vbi1ibG9ja2luZyBtb2RlCisgICAgICAgKiBHQ1RfZ3JhYiBpcyBkZWZpbmVkIGluIHRoZSBzZXB0ZWwgbGlicmFyeSBzb2Z0d2FyZSAqLworICAgICAgaCA9IEdDVF9ncmFiKGlkKTsKKworICAgICAgbSA9IChNU0cqKWg7CisgICAgICAvKiBhIGNvdXRlciBpcyBhZGRlZCBoZXJlIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AKKyAgICAgICAqIHRoYXQgd2lsbCBjYXVzZSBvdXIgY2FwdHVyZSBwcm9ncmFtIEdVSSB0byBmcmVlemUgd2hpbGUgd2FpdGluZworICAgICAgICogZm9yIGEgcGFja2V0Ki8KKyAgICAgIGNvdW50ZXIrKyA7CisKKyAgICB9CisgICAgd2hpbGUgICgobSA9PSBOVUxMKSYmIChjb3VudGVyPCAxMDApKSA7CisKKyAgICBpZiAobSAhPSBOVUxMKSB7CisKKyAgICAgIHQgPSBoLT50eXBlIDsKKworICAgICAgLyogY2F0Y2ggb25seSBtZXNzYWdlcyB3aXRoIHR5cGUgPSAweGNmMDAgb3IgMHg4ZjAxIGNvcnJzcG9uZGluZyB0byBzczcgbWVzc2FnZXMqLworICAgICAgLyogWFhYID0gd2h5IG5vdCB1c2UgQVBJX01TR19UWF9SRVEgZm9yIDB4Y2YwMCBhbmQgQVBJX01TR19SWF9JTkQKKyAgICAgICAqIGZvciAweDhmMDE/ICovCisgICAgICBpZiAoKHQgIT0gMHhjZjAwKSAmJiAodCAhPSAweDhmMDEpKSB7CisgICAgICAgIHJlbG0oaCk7CisgICAgICAgIGdvdG8gbG9vcCA7CisgICAgICB9CisKKyAgICAgIC8qIFhYWCAtIGlzIEFQSV9NU0dfUlhfSU5EIGZvciBhbiBNVFAyIG9yIE1UUDMgbWVzc2FnZT8gKi8KKyAgICAgIGRwID0gZ2V0X3BhcmFtKG0pOy8qIGdldCBwb2ludGVyIHRvIE1TRyBwYXJhbWV0ZXIgYXJlYSAobS0+cGFyYW0pICovCisgICAgICBwYWNrZXRfbGVuID0gbS0+bGVuOworICAgICAgY2FwbGVuID0gIHAtPnNuYXBzaG90IDsKKworCisgICAgICBpZiAoY2FwbGVuID4gcGFja2V0X2xlbikgeworCisgICAgICAgIGNhcGxlbiA9IHBhY2tldF9sZW47CisgICAgICB9CisgICAgICAvKiBSdW4gdGhlIHBhY2tldCBmaWx0ZXIgaWYgdGhlcmUgaXMgb25lLiAqLworICAgICAgaWYgKChwLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMKSB8fCBicGZfZmlsdGVyKHAtPmZjb2RlLmJmX2luc25zLCBkcCwgcGFja2V0X2xlbiwgY2FwbGVuKSkgeworCisKKyAgICAgICAgLyogIGdldCBhIHRpbWUgc3RhbXAgLCBjb25zaXN0aW5nIG9mIDoKKyAgICAgICAgICoKKyAgICAgICAgICogIHBjYXBfaGVhZGVyLnRzLnR2X3NlYzoKKyAgICAgICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICogICBhIFVOSVggZm9ybWF0IHRpbWUtaW4tc2Vjb25kcyB3aGVuIGhlIHBhY2tldCB3YXMgY2FwdHVyZWQsCisgICAgICAgICAqICAgaS5lLiB0aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgRXBvY2ggdGltZSAoSmFudWFyeSAxLDE5NzAsIDAwOjAwOjAwIEdNVCkKKyAgICAgICAgICoKKyAgICAgICAgICogIHBjYXBfaGVhZGVyLnRzLnR2X3VzZWMgOgorICAgICAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAqICAgdGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgc2luY2UgdGhhdCBzZWNvbmQKKyAgICAgICAgICogICB3aGVuIHRoZSBwYWNrZXQgd2FzIGNhcHR1cmVkCisgICAgICAgICAqLworCisgICAgICAgICh2b2lkKWdldHRpbWVvZmRheSgmcGNhcF9oZWFkZXIudHMsIE5VTEwpOworCisgICAgICAgIC8qIEZpbGwgaW4gb3VyIG93biBoZWFkZXIgZGF0YSAqLworICAgICAgICBwY2FwX2hlYWRlci5jYXBsZW4gPSBjYXBsZW47CisgICAgICAgIHBjYXBfaGVhZGVyLmxlbiA9IHBhY2tldF9sZW47CisKKyAgICAgICAgLyogQ291bnQgdGhlIHBhY2tldC4gKi8KKyAgICAgICAgcC0+bWQuc3RhdC5wc19yZWN2Kys7CisKKyAgICAgICAgLyogQ2FsbCB0aGUgdXNlciBzdXBwbGllZCBjYWxsYmFjayBmdW5jdGlvbiAqLworICAgICAgICBjYWxsYmFjayh1c2VyLCAmcGNhcF9oZWFkZXIsIGRwKTsKKworICAgICAgICBwcm9jZXNzZWQrKyA7CisKKyAgICAgIH0KKyAgICAgIC8qIGFmdGVyIGJlaW5nIHByb2Nlc3NlZCB0aGUgcGFja2V0IG11c3QgYmUKKyAgICAgICAqcmVsZWFzZWQgaW4gb3JkZXIgdG8gcmVjZWl2ZSBhbm90aGVyIG9uZSAqLworICAgICAgcmVsbShoKTsKKyAgICB9ZWxzZQorICAgICAgcHJvY2Vzc2VkKys7CisKKyAgfQorICB3aGlsZSAocHJvY2Vzc2VkIDwgY250KSA7CisKKyAgcmV0dXJuIHByb2Nlc3NlZCA7Cit9CisKKworc3RhdGljIGludAorc2VwdGVsX2luamVjdChwY2FwX3QgKmhhbmRsZSwgY29uc3Qgdm9pZCAqYnVmIF9VXywgc2l6ZV90IHNpemUgX1VfKQoreworICBzdHJsY3B5KGhhbmRsZS0+ZXJyYnVmLCAiU2VuZGluZyBwYWNrZXRzIGlzbid0IHN1cHBvcnRlZCBvbiBTZXB0ZWwgY2FyZHMiLAorICAgICAgICAgIFBDQVBfRVJSQlVGX1NJWkUpOworICByZXR1cm4gKC0xKTsKK30KKworLyoKKyAqICBBY3RpdmF0ZSBhIGhhbmRsZSBmb3IgYSBsaXZlIGNhcHR1cmUgZnJvbSB0aGUgZ2l2ZW4gU2VwdGVsIGRldmljZS4gIEFsd2F5cyBwYXNzIGEgTlVMTCBkZXZpY2UKKyAqICBUaGUgcHJvbWlzYyBmbGFnIGlzIGlnbm9yZWQgYmVjYXVzZSBTZXB0ZWwgY2FyZHMgaGF2ZSBidWlsdC1pbiB0cmFjaW5nLgorICogIFRoZSB0aW1lb3V0IGlzIGFsc28gaWdub3JlZCBhcyBpdCBpcyBub3Qgc3VwcG9ydGVkIGluIGhhcmR3YXJlLgorICoKKyAqICBTZWUgYWxzbyBwY2FwKDMpLgorICovCitzdGF0aWMgcGNhcF90ICpzZXB0ZWxfYWN0aXZhdGUocGNhcF90KiBoYW5kbGUpIHsKKyAgLyogSW5pdGlhbGl6ZSBzb21lIGNvbXBvbmVudHMgb2YgdGhlIHBjYXAgc3RydWN0dXJlLiAqLyAgCisgIGhhbmRsZS0+bGlua3R5cGUgPSBETFRfTVRQMjsKKyAgCisgIGhhbmRsZS0+YnVmc2l6ZSA9IDA7CisKKyAgLyoKKyAgICogInNlbGVjdCgpIiBhbmQgInBvbGwoKSIgZG9uJ3Qgd29yayBvbiBTZXB0ZWwgcXVldWVzCisgICAqLworICBoYW5kbGUtPnNlbGVjdGFibGVfZmQgPSAtMTsKKworICBoYW5kbGUtPnJlYWRfb3AgPSBzZXB0ZWxfcmVhZDsKKyAgaGFuZGxlLT5pbmplY3Rfb3AgPSBzZXB0ZWxfaW5qZWN0OworICBoYW5kbGUtPnNldGZpbHRlcl9vcCA9IHNlcHRlbF9zZXRmaWx0ZXI7CisgIGhhbmRsZS0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsgLyogY2FuJ3QgY2hhbmdlIGRhdGEgbGluayB0eXBlICovCisgIGhhbmRsZS0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOworICBoYW5kbGUtPnNldG5vbmJsb2NrX29wID0gc2VwdGVsX3NldG5vbmJsb2NrOworICBoYW5kbGUtPnN0YXRzX29wID0gc2VwdGVsX3N0YXRzOworCisgIHJldHVybiAwOworfQorCitwY2FwX3QgKnNlcHRlbF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKSB7CisJcGNhcF90ICpwOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcC0+YWN0aXZhdGVfb3AgPSBzZXB0ZWxfYWN0aXZhdGU7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQgc2VwdGVsX3N0YXRzKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpIHsKKyAgLypwLT5tZC5zdGF0LnBzX3JlY3YgPSAwOyovCisgIC8qcC0+bWQuc3RhdC5wc19kcm9wID0gMDsqLworICAKKyAgKnBzID0gcC0+bWQuc3RhdDsKKyAKKyAgcmV0dXJuIDA7Cit9CisKKworaW50CitzZXB0ZWxfcGxhdGZvcm1fZmluZGRldnMocGNhcF9pZl90ICoqZGV2bGlzdHAsIGNoYXIgKmVycmJ1ZikKK3sKK3Vuc2lnbmVkIGNoYXIgKnA7CisgIGNvbnN0IGNoYXIgZGVzY3JpcHRpb25bNTEyXT0gIkludGVsL1NlcHRlbCBkZXZpY2UiOworICBjaGFyIG5hbWVbNTEyXT0ic2VwdGVsIiA7CisgIGludCByZXQgPSAwOworICBwY2FwX2FkZF9pZihkZXZsaXN0cCxuYW1lLDAsZGVzY3JpcHRpb24sZXJyYnVmKTsKKworICByZXR1cm4gKHJldCk7IAorfQorCisKKy8qCisgKiBJbnN0YWxscyB0aGUgZ2l2ZW4gYnBmIGZpbHRlciBwcm9ncmFtIGluIHRoZSBnaXZlbiBwY2FwIHN0cnVjdHVyZS4gIFRoZXJlIGlzCisgKiBubyBhdHRlbXB0IHRvIHN0b3JlIHRoZSBmaWx0ZXIgaW4ga2VybmVsIG1lbW9yeSBhcyB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQKKyAqIHdpdGggU2VwdGVsIGNhcmRzLgorICovCitzdGF0aWMgaW50IHNlcHRlbF9zZXRmaWx0ZXIocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKSB7CisgIGlmICghcCkKKyAgICByZXR1cm4gLTE7CisgIGlmICghZnApIHsKKyAgICBzdHJuY3B5KHAtPmVycmJ1ZiwgInNldGZpbHRlcjogTm8gZmlsdGVyIHNwZWNpZmllZCIsCisJICAgIHNpemVvZihwLT5lcnJidWYpKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBNYWtlIG91ciBwcml2YXRlIGNvcHkgb2YgdGhlIGZpbHRlciAqLworCisgIGlmIChpbnN0YWxsX2JwZl9wcm9ncmFtKHAsIGZwKSA8IDApIHsKKyAgICBzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCSAgICAgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcC0+bWQudXNlX2JwZiA9IDA7CisKKyAgcmV0dXJuICgwKTsKK30KKworCitzdGF0aWMgaW50CitzZXB0ZWxfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1ZikKK3sKKyAgcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1zZXB0ZWwuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC1zZXB0ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdkMDU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNlcHRlbC5oCkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBwY2FwLXNlcHRlbC5jOiBQYWNrZXQgY2FwdHVyZSBpbnRlcmZhY2UgZm9yIEludGVsIFNlcHRlbCBjYXJkCisgKgorICogVGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhpcyBjb2RlIGF0dGVtcHRzIHRvIG1pbWljIHRoYXQgb2YgcGNhcC1saW51eCBhcyBtdWNoCisgKiBhcyBwb3NzaWJsZS4gIFRoaXMgY29kZSBpcyBvbmx5IG5lZWRlZCB3aGVuIGNvbXBpbGluZyBpbiB0aGUgSW50ZWwvU2VwdGVsCisgKiBjYXJkIGNvZGUgYXQgdGhlIHNhbWUgdGltZSBhcyBhbm90aGVyIHR5cGUgb2YgZGV2aWNlLgorICoKKyAqIEF1dGhvcnM6IEdpbGJlcnQgSE9ZRUsgKGdpbF9ob3lla0Bob3RtYWlsLmNvbSksIEVsaWFzIE0uIEtIT1VSWQorICogKCs5NjEgMyA0ODUzNDMpOworICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC1zZXB0ZWwuaCx2IDEuMiAyMDA4LTA0LTA0IDE5OjM3OjQ1IGd1eSBFeHAgJAorICovCisKK3BjYXBfdCAqc2VwdGVsX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOworCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtc2l0YS5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNpdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzFmOGIwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNpdGEuYwpAQCAtMCwwICsxLDk4MCBAQAorLyoKKyAqICBwY2FwLXNpdGEuYzogUGFja2V0IGNhcHR1cmUgaW50ZXJmYWNlIGFkZGl0aW9ucyBmb3IgU0lUQSBBQ04gZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgRnVsa28gSGV3LCBTSVRBIElOQyBDYW5hZGEsIEluYyA8ZnVsa28uaGV3QHNpdGEuYWVybz4KKyAqCisgKiAgTGljZW5zZTogQlNECisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBUaGUgbmFtZXMgb2YgdGhlIGF1dGhvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqICAgICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SCisgKiAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKKyAqICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworIC8qICRJZDogcGNhcC1zaXRhLmMgKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgInBjYXAtaW50LmgiCisKKyNpbmNsdWRlICJwY2FwLXNpdGEuaCIKKworCS8qIG5vbi1jb25maWd1cmVhYmxlIG1hbmlmZXN0cyBmb2xsb3cgKi8KKworI2RlZmluZSBJT1BfU05JRkZFUl9QT1JUCTQ5MTUyCQkJLyogVENQIHBvcnQgb24gdGhlIElPUCB1c2VkIGZvciAnZGlzdHJpYnV0ZWQgcGNhcCcgdXNhZ2UgKi8KKyNkZWZpbmUgTUFYX0xJTkVfU0laRQkJMjU1CQkJCS8qIG1heCBzaXplIG9mIGEgYnVmZmVyL2xpbmUgaW4gL2V0Yy9ob3N0cyB3ZSBhbGxvdyAqLworI2RlZmluZSBNQVhfQ0hBU1NJUwkJCTgJCQkJLyogbnVtYmVyIG9mIGNoYXNzaXMgaW4gYW4gQUNOIHNpdGUgKi8KKyNkZWZpbmUgTUFYX0dFT1NMT1QJCQk4CQkJCS8qIG1heCBudW1iZXIgb2YgYWNjZXNzIHVuaXRzIGluIGFuIEFDTiBzaXRlICovCisKKyNkZWZpbmUgRklORAkJCTAKKyNkZWZpbmUgTElWRQkJCTEKKwordHlwZWRlZiBzdHJ1Y3QgaWZhY2UgeworCXN0cnVjdCBpZmFjZQkqbmV4dDsJCQkJCS8qIGEgcG9pbnRlciB0byB0aGUgbmV4dCBpbnRlcmZhY2UgKi8KKwljaGFyCQkJKm5hbWU7CQkJCQkvKiB0aGlzIGludGVyZmFjZSdzIG5hbWUgb24gV2lyZXNoYXJrICovCisJY2hhcgkJCSpJT1BuYW1lOwkJCQkvKiB0aGlzIGludGVyZmFjZSdzIG5hbWUgb24gYW4gSU9QICovCisJdWludDMyX3QJCWlmdHlwZTsJCQkJCS8qIHRoZSB0eXBlIG9mIGludGVyZmFjZSAoRExUIHZhbHVlcykgKi8KK30gaWZhY2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdW5pdCB7CisJY2hhcgkJCQkqaXA7CQkJCS8qIHRoaXMgdW5pdCdzIElQIGFkZHJlc3MgKGFzIGV4dHJhY3RlZCBmcm9tIC9ldGMvaG9zdHMpICovCisJaW50CQkJCQlmZDsJCQkJCS8qIHRoZSBjb25uZWN0aW9uIHRvIHRoaXMgdW5pdCAoaWYgaXQgZXhpc3RzKSAqLworCWludAkJCQkJZmluZF9mZDsJCQkvKiBhIGJpZyBrbHVkZ2UgdG8gYXZvaWQgbXkgcHJvZ3JhbW1pbmcgbGltaXRhdGlvbnMgc2luY2UgSSBjb3VsZCBoYXZlIHRoaXMgdW5pdCBvcGVuIGZvciBmaW5kYWxsZGV2cyBwdXJwb3NlcyAqLworCWludAkJCQkJZmlyc3RfdGltZTsJCQkvKiAwID0ganVzdCBvcGVuZWQgdmlhIGFjbl9vcGVuX2xpdmUoKSwgIGllLiB0aGUgZmlyc3QgdGltZSwgTlogPSBudGggdGltZSAqLworCXN0cnVjdCBzb2NrYWRkcl9pbgkqc2Vydl9hZGRyOwkJCS8qIHRoZSBhZGRyZXNzIGNvbnRyb2wgYmxvY2sgZm9yIGNvbW1zIHRvIHRoaXMgdW5pdCAqLworCWludAkJCQkJY2hhc3NpczsKKwlpbnQJCQkJCWdlb3Nsb3Q7CisJaWZhY2VfdAkJCQkqaWZhY2U7CQkJCS8qIGEgcG9pbnRlciB0byBhIGxpbmtlZCBsaXN0IG9mIGludGVyZmFjZSBzdHJ1Y3R1cmVzICovCisJY2hhcgkJCQkqaW1zZzsJCQkJLyogYSBwb2ludGVyIHRvIGFuIGluYm91bmQgbWVzc2FnZSAqLworCWludAkJCQkJbGVuOwkJCQkvKiB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBpbmJvdW5kIG1lc3NhZ2UgKi8KK30gdW5pdF90OworCitzdGF0aWMgY2hhcgkJCSplcnJvclN0cmluZzsKK3N0YXRpYyB1bml0X3QJCXVuaXRzW01BWF9DSEFTU0lTKzFdW01BWF9HRU9TTE9UKzFdOwkvKiB3ZSB1c2UgaW5kZXhlcyBvZiAxIHRocm91Z2ggOCwgYnV0IHdlIHJlc2VydmUvd2FzdGUgaW5kZXggMCAqLworc3RhdGljIGZkX3NldAkJcmVhZGZkczsJCQkJCQkJCS8qIGEgcGxhY2UgdG8gc3RvcmUgdGhlIGZpbGUgZGVzY3JpcHRvcnMgZm9yIHRoZSBjb25uZWN0aW9ucyB0byB0aGUgSU9QcyAqLworc3RhdGljIGZkX3NldAkJd29ya2luZ19zZXQ7CitzdGF0aWMgaW50CQkJbWF4X2ZzOworc3RhdGljIGNoYXIJCQlzdGF0aWNfYnVmWzMyXTsKKworcGNhcF9pZl90CQkJKmFjbl9pZl9saXN0OwkJCQkJCQkvKiBwY2FwJ3MgbGlzdCBvZiBhdmFpbGFibGUgaW50ZXJmYWNlcyAqLworCitzdGF0aWMgdm9pZCBkdW1wX2ludGVyZmFjZV9saXN0KHZvaWQpIHsKKwlwY2FwX2lmX3QJCSppZmY7CisJcGNhcF9hZGRyX3QJCSphZGRyOworCWludAkJCQlsb25nZXN0X25hbWVfbGVuID0gMDsKKwljaGFyCQkJKm4sICpkLCAqZjsKKwlpbnQJCQkJaWZfbnVtYmVyID0gMDsKKworCWlmZiA9IGFjbl9pZl9saXN0OworCXdoaWxlIChpZmYpIHsKKwkJaWYgKGlmZi0+bmFtZSAmJiAoc3RybGVuKGlmZi0+bmFtZSkgPiBsb25nZXN0X25hbWVfbGVuKSkgbG9uZ2VzdF9uYW1lX2xlbiA9IHN0cmxlbihpZmYtPm5hbWUpOworCQlpZmYgPSBpZmYtPm5leHQ7CisJfQorCWlmZiA9IGFjbl9pZl9saXN0OworCXByaW50ZigiSW50ZXJmYWNlIExpc3Q6XG4iKTsKKwl3aGlsZSAoaWZmKSB7CisJCW4gPSAoaWZmLT5uYW1lKQkJCQkJCQk/IGlmZi0+bmFtZQkJCTogIiI7CisJCWQgPSAoaWZmLT5kZXNjcmlwdGlvbikJCQkJCT8gaWZmLT5kZXNjcmlwdGlvbgk6ICIiOworCQlmID0gKGlmZi0+ZmxhZ3MgPT0gUENBUF9JRl9MT09QQkFDSykJPyAiTCIJCQkJOiAiIjsKKwkJcHJpbnRmKCIlM2Q6ICUqcyAlcyAnJXMnXG4iLCBpZl9udW1iZXIrKywgbG9uZ2VzdF9uYW1lX2xlbiwgbiwgZiwgZCk7CisJCWFkZHIgPSBpZmYtPmFkZHJlc3NlczsKKwkJd2hpbGUgKGFkZHIpIHsKKwkJCXByaW50ZigiJSpzICIsICg1ICsgbG9uZ2VzdF9uYW1lX2xlbiksICIiKTsJCS8qIGFkZCBzb21lIGluZGVudGF0aW9uICovCisJCQlwcmludGYoIiUxNXMgICIsIChhZGRyLT5hZGRyKQkJPyBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyLT5hZGRyKS0+c2luX2FkZHIpCQk6ICIiKTsKKwkJCXByaW50ZigiJTE1cyAgIiwgKGFkZHItPm5ldG1hc2spCT8gaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopYWRkci0+bmV0bWFzayktPnNpbl9hZGRyKQk6ICIiKTsKKwkJCXByaW50ZigiJTE1cyAgIiwgKGFkZHItPmJyb2FkYWRkcikJPyBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilhZGRyLT5icm9hZGFkZHIpLT5zaW5fYWRkcikJOiAiIik7CisJCQlwcmludGYoIiUxNXMgICIsIChhZGRyLT5kc3RhZGRyKQk/IGluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWFkZHItPmRzdGFkZHIpLT5zaW5fYWRkcikJOiAiIik7CisJCQlwcmludGYoIlxuIik7CisJCQlhZGRyID0gYWRkci0+bmV4dDsKKwkJfQorCQlpZmYgPSBpZmYtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wKHVuc2lnbmVkIGNoYXIgKnB0ciwgaW50IGksIGludCBpbmRlbnQpIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiUqcyIsIGluZGVudCwgIiAiKTsKKwlmb3IgKDsgaSA+IDA7IGktLSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiUyLjJ4ICIsICpwdHIrKyk7CisJfQorCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9pbnRlcmZhY2VfbGlzdF9wKHZvaWQpIHsKKwlwY2FwX2lmX3QJCSppZmY7CisJcGNhcF9hZGRyX3QJCSphZGRyOworCWludAkJCQlpZl9udW1iZXIgPSAwOworCisJaWZmID0gYWNuX2lmX2xpc3Q7CisJcHJpbnRmKCJJbnRlcmZhY2UgUG9pbnRlciBAICVwIGlzICVwOlxuIiwgJmFjbl9pZl9saXN0LCBpZmYpOworCXdoaWxlIChpZmYpIHsKKwkJcHJpbnRmKCIlM2Q6ICVwICVwIG5leHQ6ICVwXG4iLCBpZl9udW1iZXIrKywgaWZmLT5uYW1lLCBpZmYtPmRlc2NyaXB0aW9uLCBpZmYtPm5leHQpOworCQlkdW1wKCh1bnNpZ25lZCBjaGFyICopaWZmLCBzaXplb2YocGNhcF9pZl90KSwgNSk7CisJCWFkZHIgPSBpZmYtPmFkZHJlc3NlczsKKwkJd2hpbGUgKGFkZHIpIHsKKwkJCXByaW50ZigiICAgICAgICAgICVwICVwICVwICVwLCBuZXh0OiAlcFxuIiwgYWRkci0+YWRkciwgYWRkci0+bmV0bWFzaywgYWRkci0+YnJvYWRhZGRyLCBhZGRyLT5kc3RhZGRyLCBhZGRyLT5uZXh0KTsKKwkJCWR1bXAoKHVuc2lnbmVkIGNoYXIgKilhZGRyLCBzaXplb2YocGNhcF9hZGRyX3QpLCAxMCk7CisJCQlhZGRyID0gYWRkci0+bmV4dDsKKwkJfQorCQlpZmYgPSBpZmYtPm5leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX3VuaXRfdGFibGUodm9pZCkgeworCWludAkJY2hhc3NpcywgZ2Vvc2xvdDsKKwlpZmFjZV90CSpwOworCisJcHJpbnRmKCIlYzolYyAlcyAlc1xuIiwgJ0MnLCAnUycsICJmZCIsICJJUCBBZGRyZXNzIik7CisJZm9yIChjaGFzc2lzID0gMDsgY2hhc3NpcyA8PSBNQVhfQ0hBU1NJUzsgY2hhc3NpcysrKSB7CisJCWZvciAoZ2Vvc2xvdCA9IDA7IGdlb3Nsb3QgPD0gTUFYX0dFT1NMT1Q7IGdlb3Nsb3QrKykgeworCQkJaWYgKHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlwICE9IE5VTEwpCisJCQkJcHJpbnRmKCIlZDolZCAlMmQgJXNcbiIsIGNoYXNzaXMsIGdlb3Nsb3QsIHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmZkLCB1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5pcCk7CisJCQlwID0gdW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF0uaWZhY2U7CisJCQl3aGlsZSAocCkgeworCQkJCWNoYXIgKm4gPSAocC0+bmFtZSkJCQk/IHAtPm5hbWUJCQk6ICIiOworCQkJCWNoYXIgKmkgPSAocC0+SU9QbmFtZSkJCT8gcC0+SU9QbmFtZQkJOiAiIjsKKwkJCQlwID0gcC0+bmV4dDsKKwkJCQlwcmludGYoIiAgICUxMnMgICAgLT4gJTEyc1xuIiwgaSwgbik7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgZmluZF91bml0X2J5X2ZkKGludCBmZCwgaW50ICpjaGFzc2lzLCBpbnQgKmdlb3Nsb3QsIHVuaXRfdCAqKnVuaXRfcHRyKSB7CisJaW50CQljLCBzOworCisJZm9yIChjID0gMDsgYyA8PSBNQVhfQ0hBU1NJUzsgYysrKSB7CisJCWZvciAocyA9IDA7IHMgPD0gTUFYX0dFT1NMT1Q7IHMrKykgeworCQkJaWYgKHVuaXRzW2NdW3NdLmZkID09IGZkIHx8IHVuaXRzW2NdW3NdLmZpbmRfZmQgPT0gZmQpIHsKKwkJCQlpZiAoY2hhc3NpcykJKmNoYXNzaXMgPSBjOworCQkJCWlmIChnZW9zbG90KQkqZ2Vvc2xvdCA9IHM7CisJCQkJaWYgKHVuaXRfcHRyKQkqdW5pdF9wdHIgPSAmdW5pdHNbY11bc107CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jbGllbnRfbmJ5dGVzKGludCBmZCwgaW50IGNvdW50LCB1bnNpZ25lZCBjaGFyICpidWYpIHsKKwl1bml0X3QJCQkqdTsKKwlpbnQJCQkJY2hhc3NpcywgZ2Vvc2xvdDsKKwlpbnQJCQkJbGVuOworCisJZmluZF91bml0X2J5X2ZkKGZkLCAmY2hhc3NpcywgJmdlb3Nsb3QsICZ1KTsKKwl3aGlsZSAoY291bnQpIHsKKwkJaWYgKChsZW4gPSByZWN2KGZkLCBidWYsIGNvdW50LCAwKSkgPD0gMCkJcmV0dXJuIC0xOwkvKiByZWFkIGluIHdoYXRldmVyIGRhdGEgd2FzIHNlbnQgdG8gdXMgKi8KKwkJY291bnQgLT0gbGVuOwkKKwkJYnVmICs9IGxlbjsKKwl9CQkJCQkJCQkJCQkJCQkJLyogdGlsbCB3ZSBoYXZlIGV2ZXJ5dGhpbmcgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVtcHR5X3VuaXRfaWZhY2UodW5pdF90ICp1KSB7CisJaWZhY2VfdAkqcCwgKmN1cjsKKworCWN1ciA9IHUtPmlmYWNlOworCXdoaWxlIChjdXIpIHsJCQkJCQkJCQkJCS8qIGxvb3Agb3ZlciBhbGwgdGhlIGludGVyZmFjZSBlbnRyaWVzICovCisJCWlmIChjdXItPm5hbWUpCQkJZnJlZShjdXItPm5hbWUpOwkJCS8qIHRocm93aW5nIGF3YXkgdGhlIGNvbnRlbnRzIGlmIHRoZXkgZXhpc3QgKi8KKwkJaWYgKGN1ci0+SU9QbmFtZSkJCWZyZWUoY3VyLT5JT1BuYW1lKTsKKwkJcCA9IGN1ci0+bmV4dDsKKwkJZnJlZShjdXIpOwkJCQkJCQkJCQkJLyogdGhlbiB0aHJvdyBhd2F5IHRoZSBzdHJ1Y3R1cmUgaXRzZWxmICovCisJCWN1ciA9IHA7CisJfQorCXUtPmlmYWNlID0gMDsJCQkJCQkJCQkJCS8qIGFuZCBmaW5hbGx5IHJlbWVtYmVyIHRoYXQgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBzdHJ1Y3R1cmUgKi8KK30KKworc3RhdGljIHZvaWQgZW1wdHlfdW5pdChpbnQgY2hhc3NpcywgaW50IGdlb3Nsb3QpIHsKKwl1bml0X3QJKnUgPSAmdW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF07CisKKwllbXB0eV91bml0X2lmYWNlKHUpOworCWlmICh1LT5pbXNnKSB7CQkJCQkJCQkJCQkvKiB0aGVuIGlmIGFuIGluYm91bmQgbWVzc2FnZSBidWZmZXIgZXhpc3RzICovCisJCXUtPmltc2cgPSAoY2hhciAqKXJlYWxsb2ModS0+aW1zZywgMSk7CQkJCS8qIGFuZCByZS1hbGxvY2F0ZSB0aGUgb2xkIGxhcmdlIGJ1ZmZlciBpbnRvIGEgbmV3IHNtYWxsIG9uZSAqLworCX0KK30KKworc3RhdGljIHZvaWQgZW1wdHlfdW5pdF90YWJsZSh2b2lkKSB7CisJaW50CQljaGFzc2lzLCBnZW9zbG90OworCisJZm9yIChjaGFzc2lzID0gMDsgY2hhc3NpcyA8PSBNQVhfQ0hBU1NJUzsgY2hhc3NpcysrKSB7CisJCWZvciAoZ2Vvc2xvdCA9IDA7IGdlb3Nsb3QgPD0gTUFYX0dFT1NMT1Q7IGdlb3Nsb3QrKykgeworCQkJaWYgKHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlwICE9IE5VTEwpIHsKKwkJCQlmcmVlKHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlwKTsJCQkvKiBnZXQgcmlkIG9mIHRoZSBtYWxsb2MnZWQgc3BhY2UgdGhhdCBob2xkcyB0aGUgSVAgYWRkcmVzcyAqLworCQkJCXVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlwID0gMDsJCQkJLyogdGhlbiBzZXQgdGhlIHBvaW50ZXIgdG8gTlVMTCAqLworCQkJfQorCQkJZW1wdHlfdW5pdChjaGFzc2lzLCBnZW9zbG90KTsKKwkJfQorCX0KK30KKworc3RhdGljIGNoYXIgKmZpbmRfbnRoX2ludGVyZmFjZV9uYW1lKGludCBuKSB7CisJaW50CQljaGFzc2lzLCBnZW9zbG90OworCWlmYWNlX3QJKnA7CisJY2hhcgkqbGFzdF9uYW1lID0gMDsKKworCWlmIChuIDwgMCkgbiA9IDA7CQkJCQkJCQkJCQkJLyogZW5zdXJlIHdlIGFyZSB3b3JraW5nIHdpdGggYSB2YWxpZCBudW1iZXIgKi8KKwlmb3IgKGNoYXNzaXMgPSAwOyBjaGFzc2lzIDw9IE1BWF9DSEFTU0lTOyBjaGFzc2lzKyspIHsJCQkvKiBzY2FuIHRoZSB0YWJsZS4uLiAqLworCQlmb3IgKGdlb3Nsb3QgPSAwOyBnZW9zbG90IDw9IE1BWF9HRU9TTE9UOyBnZW9zbG90KyspIHsKKwkJCWlmICh1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5pcCAhPSBOVUxMKSB7CisJCQkJcCA9IHVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmlmYWNlOworCQkJCXdoaWxlIChwKSB7CQkJCQkJCQkJCQkvKiBhbmQgYWxsIGludGVyZmFjZXMuLi4gKi8KKwkJCQkJaWYgKHAtPklPUG5hbWUpIGxhc3RfbmFtZSA9IHAtPm5hbWU7CQkJLyogcmVtZW1iZXJpbmcgdGhlIGxhc3QgbmFtZSBmb3VuZCAqLworCQkJCQlpZiAobi0tID09IDApIHJldHVybiBsYXN0X25hbWU7CQkJCQkvKiBhbmQgaWYgd2UgaGl0IHRoZSBpbnN0YW5jZSByZXF1ZXN0ZWQgKi8KKwkJCQkJcCA9IHAtPm5leHQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCQkJCQkJCQkJCQkvKiBpZiB3ZSBjb3VsZG4ndCBmaW5lIHRoZSBzZWxlY3RlZCBlbnRyeSAqLworCWlmIChsYXN0X25hbWUpCXJldHVybiBsYXN0X25hbWU7CQkvKiAuLi4gYnV0IHdlIGRpZCBoYXZlIGF0IGxlYXN0IG9uZSBlbnRyeS4uLiByZXR1cm4gdGhlIGxhc3QgZW50cnkgZm91bmQgKi8KKwlyZXR1cm4gIiI7CQkJCQkJCQkvKiAuLi4gYnV0IGlmIHRoZXJlIHdhc24ndCBhbnkgZW50cnkuLi4gcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkICovCit9CisKK2ludCBhY25fcGFyc2VfaG9zdHNfZmlsZShjaGFyICplcnJidWYpIHsJCQkJLyogcmV0dXJuczogLTEgPSBlcnJvciwgMCA9IE9LICovCisJRklMRQkqZnA7CisJY2hhcglidWZbTUFYX0xJTkVfU0laRV07CisJY2hhcgkqcHRyLCAqcHRyMjsKKwlpbnQJCXBvczsKKwlpbnQJCWNoYXNzaXMsIGdlb3Nsb3Q7CisJdW5pdF90CSp1OworCisJZW1wdHlfdW5pdF90YWJsZSgpOworCWlmICgoZnAgPSBmb3BlbigiL2V0Yy9ob3N0cyIsICJyIikpID09IE5VTEwpIHsJCQkJCQkJCQkJLyogdHJ5IHRvIG9wZW4gdGhlIGhvc3RzIGZpbGUgYW5kIGlmIGl0IGZhaWxzICovCisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIkNhbm5vdCBvcGVuICcvZXRjL2hvc3RzJyBmb3IgcmVhZGluZy4iKTsJLyogcmV0dXJuIHRoZSBub2hvc3RzZmlsZSBlcnJvciByZXNwb25zZSAqLworCQlyZXR1cm4gLTE7CisJfQorCXdoaWxlIChmZ2V0cyhidWYsIE1BWF9MSU5FX1NJWkUtMSwgZnApKSB7CQkJLyogd2hpbGUgbG9vcGluZyBvdmVyIHRoZSBmaWxlICovCisKKwkJcG9zID0gc3RyY3NwbihidWYsICIjXG5cciIpOwkJCQkJLyogZmluZCB0aGUgZmlyc3QgY29tbWVudCBjaGFyYWN0ZXIgb3IgRU9MICovCisJCSooYnVmICsgcG9zKSA9ICdcMCc7CQkJCQkJCS8qIGFuZCBjbG9iYmVyIGl0IGFuZCBhbnl0aGluZyB0aGF0IGZvbGxvd3MgaXQgKi8KKworCQlwb3MgPSBzdHJzcG4oYnVmLCAiIFx0Iik7CQkJCQkJLyogdGhlbiBmaW5kIHRoZSBmaXJzdCBub24td2hpdGUgc3BhY2UgKi8KKwkJaWYgKHBvcyA9PSBzdHJsZW4oYnVmKSkJCQkJCQkJLyogaWYgdGhlcmUgaXMgbm90aGluZyBidXQgd2hpdGUgc3BhY2Ugb24gdGhlIGxpbmUgKi8KKwkJCWNvbnRpbnVlOwkJCQkJCQkJCS8qIGlnbm9yZSB0aGF0IGVtcHR5IGxpbmUgKi8KKwkJcHRyID0gYnVmICsgcG9zOwkJCQkJCQkJLyogYW5kIHNraXAgb3ZlciBhbnkgb2YgdGhhdCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KKworCQlpZiAoKHB0cjIgPSBzdHJzdHIocHRyLCAiX0lfIikpID09IE5VTEwpCQkvKiBza2lwIGFueSBsaW5lcyB0aGF0IGRvbid0IGhhdmUgbmFtZXMgdGhhdCBsb29rIGxpa2UgdGhleSBiZWxvbmcgdG8gSU9QcyAqLworCQkJY29udGludWU7CisJCWlmICgqKHB0cjIgKyA0KSAhPSAnXycpCQkJCQkJCS8qIGFuZCBza2lwIG90aGVyIGxpbmVzIHRoYXQgaGF2ZSBuYW1lcyB0aGF0IGRvbid0IGxvb2sgbGlrZSBBQ04gY29tcG9uZW50cyAqLworCQkJY29udGludWU7CisJCSoocHRyICsgc3RyY3NwbihwdHIsICIgXHQiKSkgPSAnXDAnOwkJCS8qIG51bGwgdGVybWluYXRlIHRoZSBJUCBhZGRyZXNzIHNvIGl0cyBhIHN0YW5kYWxvbmUgc3RyaW5nICovCisKKwkJY2hhc3NpcyA9ICoocHRyMiArIDMpIC0gJzAnOwkJCQkJLyogZXh0cmFjdCB0aGUgY2hhc3NpcyBudW1iZXIgKi8KKwkJZ2Vvc2xvdCA9ICoocHRyMiArIDUpIC0gJzAnOwkJCQkJLyogYW5kIGdlby1zbG90IG51bWJlciAqLworCQlpZiAoY2hhc3NpcyA8IDEgfHwgY2hhc3NpcyA+IE1BWF9DSEFTU0lTIHx8CisJCQlnZW9zbG90IDwgMSB8fCBnZW9zbG90ID4gTUFYX0dFT1NMT1QpIHsJCS8qIGlmIHRoZSBjaGFzc2lzIGFuZC9vciBzbG90IG51bWJlcnMgYXBwZWFyIHRvIGJlIGJhZC4uLiAqLworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiSW52YWxpZCBBQ04gbmFtZSBpbiAnL2V0Yy9ob3N0cycuIik7CS8qIHdhcm4gdGhlIHVzZXIgKi8KKwkJCWNvbnRpbnVlOwkJCQkJCQkJCQkJCQkJCQkJLyogYW5kIGlnbm9yZSB0aGUgZW50cnkgKi8KKwkJfQorCQlpZiAoKHB0cjIgPSAoY2hhciAqKW1hbGxvYyhzdHJsZW4ocHRyKSArIDEpKSA9PSBOVUxMKSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJY29udGludWU7CisJCX0KKwkJc3RyY3B5KHB0cjIsIHB0cik7CQkJCQkJCQkvKiBjb3B5IHRoZSBJUCBhZGRyZXNzIGludG8gb3VyIG1hbGxvYydlZCBtZW1vcnkgKi8KKwkJdSA9ICZ1bml0c1tjaGFzc2lzXVtnZW9zbG90XTsKKwkJdS0+aXAgPSBwdHIyOwkJCQkJCQkJCS8qIGFuZCByZW1lbWJlciB0aGUgd2hvbGUgc2hlYmFuZyAqLworCQl1LT5jaGFzc2lzID0gY2hhc3NpczsKKwkJdS0+Z2Vvc2xvdCA9IGdlb3Nsb3Q7CisJfQorCWZjbG9zZShmcCk7CisJaWYgKCplcnJidWYpCXJldHVybiAtMTsKKwllbHNlCQkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl93aXRoX0lPUCh1bml0X3QgICp1LCBpbnQgZmxhZykgeworCWludAkJCQkJc29ja2ZkOworCWNoYXIJCQkJKmlwOworCisJaWYgKHUtPnNlcnZfYWRkciA9PSBOVUxMKSB7CisJCXUtPnNlcnZfYWRkciA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJfQorCWlwID0gdS0+aXA7CisJYnplcm8oKGNoYXIgKil1LT5zZXJ2X2FkZHIsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwl1LT5zZXJ2X2FkZHItPnNpbl9mYW1pbHkJCT0gQUZfSU5FVDsKKwl1LT5zZXJ2X2FkZHItPnNpbl9hZGRyLnNfYWRkcgk9IGluZXRfYWRkcihpcCk7CisJdS0+c2Vydl9hZGRyLT5zaW5fcG9ydAkJCT0gaHRvbnMoSU9QX1NOSUZGRVJfUE9SVCk7CisKKwlpZiAoKHNvY2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCkpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInBjYXAgY2FuJ3Qgb3BlbiBhIHNvY2tldCBmb3IgY29ubmVjdGluZyB0byBJT1AgYXQgJXNcbiIsIGlwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjb25uZWN0KHNvY2tmZCwgKHN0cnVjdCBzb2NrYWRkciAqKXUtPnNlcnZfYWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInBjYXAgY2FuJ3QgY29ubmVjdCB0byBJT1AgYXQgJXNcbiIsIGlwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChmbGFnID09IExJVkUpCXUtPmZkID0gc29ja2ZkOworCWVsc2UJCQkJdS0+ZmluZF9mZCA9IHNvY2tmZDsKKwl1LT5maXJzdF90aW1lID0gMDsKKwlyZXR1cm4gc29ja2ZkOwkJCS8qIHJldHVybiB0aGUgbm9uLXplcm8gZmlsZSBkZXNjcmlwdG9yIGFzIGEgJ3N1Y2Nlc3MnIGluZGljYXRvciAqLworfQorCitzdGF0aWMgdm9pZCBjbG9zZV93aXRoX0lPUChpbnQgY2hhc3NpcywgaW50IGdlb3Nsb3QsIGludCBmbGFnKSB7CisJaW50CQkqaWQ7CisKKwlpZiAoZmxhZyA9PSBMSVZFKQlpZCA9ICZ1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5mZDsKKwllbHNlCQkJCWlkID0gJnVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdLmZpbmRfZmQ7CisKKwlpZiAoKmlkKSB7CQkJCQkJCQkJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IHRpbWUsIHNvLi4uIGlmIHdlIGFyZSBjb25uZWN0ZWQuLi4gKi8KKwkJY2xvc2UoKmlkKTsJCQkJCQkJCQkvKiBkaXNjb25uZWN0IHVzICovCisJCSppZCA9IDA7CQkJCQkJCQkJLyogYW5kIGZvcmdldCB0aGF0IHRoZSBkZXNjcmlwdG9yIGV4aXN0cyBiZWNhdXNlIHdlIGFyZSBub3Qgb3BlbiAqLworCX0KK30KKworc3RhdGljIHZvaWQgcGNhcF9jbGVhbnVwX2FjbihwY2FwX3QgKmhhbmRsZSkgeworCWludAkJY2hhc3NpcywgZ2Vvc2xvdDsKKwl1bml0X3QJKnU7CisKKwlpZiAoZmluZF91bml0X2J5X2ZkKGhhbmRsZS0+ZmQsICZjaGFzc2lzLCAmZ2Vvc2xvdCwgJnUpID09IDApCisJCXJldHVybjsKKwljbG9zZV93aXRoX0lPUChjaGFzc2lzLCBnZW9zbG90LCBMSVZFKTsKKwlpZiAodSkKKwkJdS0+Zmlyc3RfdGltZSA9IDA7CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfdG9fZmQoaW50IGZkLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpzdHIpIHsKKwlpbnQJCW53cml0dGVuOworCWludAkJY2hhc3NpcywgZ2Vvc2xvdDsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCWlmICgobndyaXR0ZW4gPSB3cml0ZShmZCwgc3RyLCBsZW4pKSA8PSAwKSB7CisJCQlmaW5kX3VuaXRfYnlfZmQoZmQsICZjaGFzc2lzLCAmZ2Vvc2xvdCwgTlVMTCk7CisJCQlpZiAodW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF0uZmQgPT0gZmQpCQkJY2xvc2Vfd2l0aF9JT1AoY2hhc3NpcywgZ2Vvc2xvdCwgTElWRSk7CisJCQllbHNlIGlmICh1bml0c1tjaGFzc2lzXVtnZW9zbG90XS5maW5kX2ZkID09IGZkKQljbG9zZV93aXRoX0lPUChjaGFzc2lzLCBnZW9zbG90LCBGSU5EKTsKKwkJCWVtcHR5X3VuaXQoY2hhc3NpcywgZ2Vvc2xvdCk7CisJCQlyZXR1cm47CisJCX0KKwkJbGVuIC09IG53cml0dGVuOworCQlzdHIgKz0gbndyaXR0ZW47CisJfQorfQorCitzdGF0aWMgdm9pZCBhY25fZnJlZWFsbGRldnModm9pZCkgeworCisJcGNhcF9pZl90CSppZmYsICpuZXh0X2lmZjsKKwlwY2FwX2FkZHJfdAkqYWRkciwgKm5leHRfYWRkcjsKKworCWZvciAoaWZmID0gYWNuX2lmX2xpc3Q7IGlmZiAhPSBOVUxMOyBpZmYgPSBuZXh0X2lmZikgeworCQluZXh0X2lmZiA9IGlmZi0+bmV4dDsKKwkJZm9yIChhZGRyID0gaWZmLT5hZGRyZXNzZXM7IGFkZHIgIT0gTlVMTDsgYWRkciA9IG5leHRfYWRkcikgeworCQkJbmV4dF9hZGRyID0gYWRkci0+bmV4dDsKKwkJCWlmIChhZGRyLT5hZGRyKQkJCWZyZWUoYWRkci0+YWRkcik7CisJCQlpZiAoYWRkci0+bmV0bWFzaykJCWZyZWUoYWRkci0+bmV0bWFzayk7CisJCQlpZiAoYWRkci0+YnJvYWRhZGRyKQlmcmVlKGFkZHItPmJyb2FkYWRkcik7CisJCQlpZiAoYWRkci0+ZHN0YWRkcikJCWZyZWUoYWRkci0+ZHN0YWRkcik7CisJCQlmcmVlKGFkZHIpOworCQl9CisJCWlmIChpZmYtPm5hbWUpCQkJZnJlZShpZmYtPm5hbWUpOworCQlpZiAoaWZmLT5kZXNjcmlwdGlvbikJZnJlZShpZmYtPmRlc2NyaXB0aW9uKTsKKwkJZnJlZShpZmYpOworCX0KK30KKworc3RhdGljIGNoYXIgKm5vblVuaWZpZWRfcG9ydF9udW0odW5pdF90ICp1LCBpbnQgSU9QcG9ydG51bSkgeworCisJc3ByaW50ZihzdGF0aWNfYnVmLCAiJWRfJWQiLCB1LT5jaGFzc2lzLCB1LT5nZW9zbG90KTsKKwlyZXR1cm4gc3RhdGljX2J1ZjsKK30KKworc3RhdGljIGNoYXIgKnVuaWZpZWRfcG9ydF9udW0odW5pdF90ICp1LCBpbnQgSU9QcG9ydG51bSkgeworCWludAkJCXBvcnRudW07CisKKwlwb3J0bnVtID0gKCh1LT5jaGFzc2lzIC0gMSkgKiA2NCkgKyAoKHUtPmdlb3Nsb3QgLSAxKSAqIDgpICsgSU9QcG9ydG51bSArIDE7CisJc3ByaW50ZihzdGF0aWNfYnVmLCAiJWQiLCBwb3J0bnVtKTsKKwlyZXR1cm4gc3RhdGljX2J1ZjsKK30KKworc3RhdGljIGNoYXIgKnRyYW5zbGF0ZV9JT1BfdG9fcGNhcF9uYW1lKHVuaXRfdCAqdSwgY2hhciAqSU9QbmFtZSwgYnBmX3VfaW50MzIgaWZ0eXBlKSB7CisJaWZhY2VfdAkJKmlmYWNlX3B0ciwgKmlmYWNlOworCWNoYXIJCSpuYW1lOworCWNoYXIJCWJ1ZlszMl07CisJY2hhcgkJKnByb3RvOworCWNoYXIJCSpwb3J0OworCWludAkJCUlPUHBvcnRudW0gPSAwOworCisJaWZhY2UgPSBtYWxsb2Moc2l6ZW9mKGlmYWNlX3QpKTsJCS8qIGdldCBtZW1vcnkgZm9yIGEgc3RydWN0dXJlICovCisJYnplcm8oKGNoYXIgKilpZmFjZSwgc2l6ZW9mKGlmYWNlX3QpKTsKKworCWlmYWNlLT5pZnR5cGUgPSBpZnR5cGU7CQkJCQkvKiByZW1lbWJlciB0aGUgaW50ZXJmYWNlIHR5cGUgb2YgdGhpcyBpbnRlcmZhY2UgKi8KKworCW5hbWUgPSBtYWxsb2Moc3RybGVuKElPUG5hbWUpICsgMSk7CQkvKiBnZXQgbWVtb3J5IGZvciB0aGUgSU9QJ3MgbmFtZSAqLworCXN0cmNweShuYW1lLCBJT1BuYW1lKTsJCQkJCS8qIGFuZCBjb3B5IGl0IGluICovCisJaWZhY2UtPklPUG5hbWUgPSBuYW1lOwkJCQkJLyogYW5kIHN0aWNrIGl0IGludG8gdGhlIHN0cnVjdHVyZSAqLworCisJaWYgKHN0cm5jbXAoSU9QbmFtZSwgImxvIiwgMikgPT0gMCkgeworCQlJT1Bwb3J0bnVtID0gYXRvaSgmSU9QbmFtZVsyXSk7CisJCXN3aXRjaCAoaWZ0eXBlKSB7CisJCQljYXNlIERMVF9FTjEwTUI6CXByb3RvID0gImxvIjsJCXBvcnQgPSBub25VbmlmaWVkX3BvcnRfbnVtKHUsIElPUHBvcnRudW0pOwlicmVhazsKKwkJCWRlZmF1bHQ6CQkJcHJvdG8gPSAiPz8/IjsJCXBvcnQgPSB1bmlmaWVkX3BvcnRfbnVtKHUsIElPUHBvcnRudW0pOwkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHN0cm5jbXAoSU9QbmFtZSwgImV0aCIsIDMpID09IDApIHsKKwkJSU9QcG9ydG51bSA9IGF0b2koJklPUG5hbWVbM10pOworCQlzd2l0Y2ggKGlmdHlwZSkgeworCQkJY2FzZSBETFRfRU4xME1COglwcm90byA9ICJldGgiOwkJcG9ydCA9IG5vblVuaWZpZWRfcG9ydF9udW0odSwgSU9QcG9ydG51bSk7CWJyZWFrOworCQkJZGVmYXVsdDoJCQlwcm90byA9ICI/Pz8iOwkJcG9ydCA9IHVuaWZpZWRfcG9ydF9udW0odSwgSU9QcG9ydG51bSk7CQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoc3RybmNtcChJT1BuYW1lLCAid2FuIiwgMykgPT0gMCkgeworCQlJT1Bwb3J0bnVtID0gYXRvaSgmSU9QbmFtZVszXSk7CisJCXN3aXRjaCAoaWZ0eXBlKSB7CisJCQljYXNlIERMVF9TSVRBOgkJcHJvdG8gPSAid2FuIjsJCXBvcnQgPSB1bmlmaWVkX3BvcnRfbnVtKHUsIElPUHBvcnRudW0pOwkJYnJlYWs7CisJCQlkZWZhdWx0OgkJCXByb3RvID0gIj8/PyI7CQlwb3J0ID0gdW5pZmllZF9wb3J0X251bSh1LCBJT1Bwb3J0bnVtKTsJCWJyZWFrOworCQl9CisJfQorCisJc3ByaW50ZihidWYsICIlc18lcyIsIHByb3RvLCBwb3J0KTsJCS8qIGNvbXBvc2UgdGhlIHVzZXIncyBuYW1lIGZvciB0aGF0IElPUCBwb3J0IG5hbWUgKi8KKwluYW1lID0gbWFsbG9jKHN0cmxlbihidWYpICsgMSk7CQkJLyogZ2V0IG1lbW9yeSBmb3IgdGhhdCBuYW1lICovCisJc3RyY3B5KG5hbWUsIGJ1Zik7CQkJCQkJLyogYW5kIGNvcHkgaXQgaW4gKi8KKwlpZmFjZS0+bmFtZSA9IG5hbWU7CQkJCQkJLyogYW5kIHN0aWNrIGl0IGludG8gdGhlIHN0cnVjdHVyZSAqLworCisJaWYgKHUtPmlmYWNlID09IDApIHsJCQkJCS8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IG5hbWUgKi8KKwkJdS0+aWZhY2UgPSBpZmFjZTsJCQkJCS8qIHN0aWNrIHRoaXMgZW50cnkgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKwl9IGVsc2UgeworCQlpZmFjZV9wdHIgPSB1LT5pZmFjZTsKKwkJd2hpbGUgKGlmYWNlX3B0ci0+bmV4dCkgewkJCS8qIG90aGV3aXNlIHNjYW4gdGhlIGxpc3QgKi8KKwkJCWlmYWNlX3B0ciA9IGlmYWNlX3B0ci0+bmV4dDsJLyogdGlsbCB3ZSdyZSBhdCB0aGUgbGFzdCBlbnRyeSAqLworCQl9CisJCWlmYWNlX3B0ci0+bmV4dCA9IGlmYWNlOwkJCS8qIHRoZW4gdGFjayB0aGlzIGVudHJ5IG9uIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKwl9CisJcmV0dXJuIGlmYWNlLT5uYW1lOworfQorCitzdGF0aWMgaW50IGlmX3NvcnQoY2hhciAqczEsIGNoYXIgKnMyKSB7CisJY2hhcgkqczFfcDIsICpzMl9wMjsKKwljaGFyCXN0cjFbTUFYX0xJTkVfU0laRV0sIHN0cjJbTUFYX0xJTkVfU0laRV07CisJaW50CQlzMV9wMV9sZW4sIHMyX3AxX2xlbjsKKwlpbnQJCXJldHZhbDsKKworCWlmICgoczFfcDIgPSBzdHJjaHIoczEsICdfJykpKSB7CS8qIGlmIGFuIHVuZGVyc2NvcmUgaXMgZm91bmQuLi4gKi8KKwkJczFfcDFfbGVuID0gczFfcDIgLSBzMTsJCQkvKiB0aGUgcHJlZml4IGxlbmd0aCBpcyB0aGUgZGlmZmVyZW5jZSBpbiBwb2ludGVycyAqLworCQlzMV9wMisrOwkJCQkJCS8qIHRoZSBzdWZmaXggYWN0dWFsbHkgc3RhcnRzIF9hZnRlcl8gdGhlIHVuZGVyc2NvcmUgKi8KKwl9IGVsc2UgewkJCQkJCQkvKiBvdGhlcndpc2UuLi4gKi8KKwkJczFfcDFfbGVuID0gc3RybGVuKHMxKTsJCQkvKiB0aGUgcHJlZml4IGxlbmd0aCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXRzZWxmICovCisJCXMxX3AyID0gMDsJCQkJCQkvKiBhbmQgdGhlcmUgaXMgbm8gc3VmZml4ICovCisJfQorCWlmICgoczJfcDIgPSBzdHJjaHIoczIsICdfJykpKSB7CS8qIG5vdyBkbyB0aGUgc2FtZSBmb3IgdGhlIHNlY29uZCBzdHJpbmcgKi8KKwkJczJfcDFfbGVuID0gczJfcDIgLSBzMjsKKwkJczJfcDIrKzsKKwl9IGVsc2UgeworCQlzMl9wMV9sZW4gPSBzdHJsZW4oczIpOworCQlzMl9wMiA9IDA7CisJfQorCXN0cm5jcHkoc3RyMSwgczEsIChzMV9wMV9sZW4gPiBzaXplb2Yoc3RyMSkpID8gczFfcDFfbGVuIDogc2l6ZW9mKHN0cjEpKTsgICAqKHN0cjEgKyBzMV9wMV9sZW4pID0gMDsKKwlzdHJuY3B5KHN0cjIsIHMyLCAoczJfcDFfbGVuID4gc2l6ZW9mKHN0cjIpKSA/IHMyX3AxX2xlbiA6IHNpemVvZihzdHIyKSk7ICAgKihzdHIyICsgczJfcDFfbGVuKSA9IDA7CisJcmV0dmFsID0gc3RyY21wKHN0cjEsIHN0cjIpOworCWlmIChyZXR2YWwgIT0gMCkgcmV0dXJuIHJldHZhbDsJCS8qIGlmIHRoZXkgYXJlIG5vdCBpZGVudGljYWwsIHRoZW4gd2UgY2FuIHF1aXQgbm93IGFuZCByZXR1cm4gdGhlIGluZGljYXRpb24gKi8KKwlyZXR1cm4gc3RyY21wKHMxX3AyLCBzMl9wMik7CQkvKiBvdGhlcndpc2Ugd2UgcmV0dXJuIHRoZSByZXN1bHQgb2YgY29tcGFyaW5nIHRoZSAybmQgaGFsZiBvZiB0aGUgc3RyaW5nICovCit9CisKK3N0YXRpYyB2b2lkIHNvcnRfaWZfdGFibGUodm9pZCkgeworCXBjYXBfaWZfdAkqcDEsICpwMiwgKnByZXYsICp0ZW1wOworCWludAkJCWhhc19zd2FwcGVkOworCisJaWYgKCFhY25faWZfbGlzdCkgcmV0dXJuOwkJCQkvKiBub3RoaW5nIHRvIGRvIGlmIHRoZSBsaXN0IGlzIGVtcHR5ICovCisKKwl3aGlsZSAoMSkgeworCQlwMSA9IGFjbl9pZl9saXN0OwkJCQkJLyogc3RhcnQgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKi8KKwkJcHJldiA9IDA7CisJCWhhc19zd2FwcGVkID0gMDsKKwkJd2hpbGUgKChwMiA9IHAxLT5uZXh0KSkgeworCQkJaWYgKGlmX3NvcnQocDEtPm5hbWUsIHAyLT5uYW1lKSA+IDApIHsKKwkJCQlpZiAocHJldikgewkJCQkJLyogd2UgYXJlIHN3YXBwaW5nIHRoaW5ncyB0aGF0IGFyZSBfbm90XyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworCQkJCQl0ZW1wID0gcDItPm5leHQ7CisJCQkJCXByZXYtPm5leHQgPSBwMjsKKwkJCQkJcDItPm5leHQgPSBwMTsKKwkJCQkJcDEtPm5leHQgPSB0ZW1wOworCQkJCX0gZWxzZSB7CQkJCQkvKiBzcGVjaWFsIHRyZWF0bWVudCBpZiB3ZSBhcmUgc3dhcHBpbmcgd2l0aCB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworCQkJCQl0ZW1wID0gcDItPm5leHQ7CisJCQkJCWFjbl9pZl9saXN0PSBwMjsKKwkJCQkJcDItPm5leHQgPSBwMTsKKwkJCQkJcDEtPm5leHQgPSB0ZW1wOworCQkJCX0KKwkJCQlwMSA9IHAyOworCQkJCXByZXYgPSBwMTsKKwkJCQloYXNfc3dhcHBlZCA9IDE7CisJCQl9CisJCQlwcmV2ID0gcDE7CisJCQlwMSA9IHAxLT5uZXh0OworCQl9CisJCWlmIChoYXNfc3dhcHBlZCA9PSAwKQorCQkJcmV0dXJuOworCX0JCisJcmV0dXJuOworfQorCQorc3RhdGljIGludCBwcm9jZXNzX2NsaWVudF9kYXRhIChjaGFyICplcnJidWYpIHsJCQkJCQkJCS8qIHJldHVybnM6IC0xID0gZXJyb3IsIDAgPSBPSyAqLworCWludAkJCQkJY2hhc3NpcywgZ2Vvc2xvdDsKKwl1bml0X3QJCQkJKnU7CisJcGNhcF9pZl90CQkJKmlmZiwgKnByZXZfaWZmOworCXBjYXBfYWRkcl90CQkJKmFkZHIsICpwcmV2X2FkZHI7CisJY2hhcgkJCQkqcHRyOworCWludAkJCQkJYWRkcmVzc19jb3VudDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4JKnM7CisJY2hhcgkJCQkqbmV3bmFtZTsKKwlicGZfdV9pbnQzMgkJCQlpbnRlcmZhY2VUeXBlOworCXVuc2lnbmVkIGNoYXIJCWZsYWdzOworCisJcHJldl9pZmYgPSAwOworCWZvciAoY2hhc3NpcyA9IDA7IGNoYXNzaXMgPD0gTUFYX0NIQVNTSVM7IGNoYXNzaXMrKykgeworCQlmb3IgKGdlb3Nsb3QgPSAwOyBnZW9zbG90IDw9IE1BWF9HRU9TTE9UOyBnZW9zbG90KyspIHsJCQkJLyogbm93IGxvb3Agb3ZlciBhbGwgdGhlIGRldmljZXMgKi8KKwkJCXUgPSAmdW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF07CisJCQllbXB0eV91bml0X2lmYWNlKHUpOworCQkJcHRyID0gdS0+aW1zZzsJCQkJCQkJCQkJCQkJLyogcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtc2cgZm9yIHRoaXMgSU9QICovCisJCQl3aGlsZSAocHRyIDwgKHUtPmltc2cgKyB1LT5sZW4pKSB7CisJCQkJaWYgKChpZmYgPSBtYWxsb2Moc2l6ZW9mKHBjYXBfaWZfdCkpKSA9PSBOVUxMKSB7CisJCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJYnplcm8oKGNoYXIgKilpZmYsIHNpemVvZihwY2FwX2lmX3QpKTsKKwkJCQlpZiAoYWNuX2lmX2xpc3QgPT0gMCkJYWNuX2lmX2xpc3QgPSBpZmY7CQkJCQkvKiByZW1lbWJlciB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworCQkJCWlmIChwcmV2X2lmZikJCQlwcmV2X2lmZi0+bmV4dCA9IGlmZjsJCQkJLyogaW5zZXJ0IGEgZm9yd2FyZCBsaW5rICovCisKKwkJCQlpZiAoKnB0cikgewkJCQkJCQkJCQkJCQkvKiBpZiB0aGVyZSBpcyBhIGNvdW50IGZvciB0aGUgbmFtZSAqLworCQkJCQlpZiAoKGlmZi0+bmFtZSA9IG1hbGxvYygqcHRyICsgMSkpID09IE5VTEwpIHsJCQkvKiBnZXQgdGhhdCBhbW91bnQgb2Ygc3BhY2UgKi8KKwkJCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQkJbWVtY3B5KGlmZi0+bmFtZSwgKHB0ciArIDEpLCAqcHRyKTsJCQkJCQkvKiBjb3B5IHRoZSBuYW1lIGludG8gdGhlIG1hbGxvYydlZCBzcGFjZSAqLworCQkJCQkqKGlmZi0+bmFtZSArICpwdHIpID0gMDsJCQkJCQkJCS8qIGFuZCBudWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJCQkJCXB0ciArPSAqcHRyOwkJCQkJCQkJCQkJLyogbm93IG1vdmUgdGhlIHBvaW50ZXIgZm9yd2FyZHMgYnkgdGhlIGxlbmd0aCBvZiB0aGUgY291bnQgcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKi8KKwkJCQl9CisJCQkJcHRyKys7CisKKwkJCQlpZiAoKnB0cikgewkJCQkJCQkJCQkJCQkvKiBpZiB0aGVyZSBpcyBhIGNvdW50IGZvciB0aGUgZGVzY3JpcHRpb24gKi8KKwkJCQkJaWYgKChpZmYtPmRlc2NyaXB0aW9uID0gbWFsbG9jKCpwdHIgKyAxKSkgPT0gTlVMTCkgewkvKiBnZXQgdGhhdCBhbW91bnQgb2Ygc3BhY2UgKi8KKwkJCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQkJCQlyZXR1cm4gLTE7CisJCQkJCX0KKwkJCQkJbWVtY3B5KGlmZi0+ZGVzY3JpcHRpb24sIChwdHIgKyAxKSwgKnB0cik7CQkJCS8qIGNvcHkgdGhlIG5hbWUgaW50byB0aGUgbWFsbG9jJ2VkIHNwYWNlICovCisJCQkJCSooaWZmLT5kZXNjcmlwdGlvbiArICpwdHIpID0gMDsJCQkJCQkJLyogYW5kIG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwkJCQkJcHRyICs9ICpwdHI7CQkJCQkJCQkJCQkvKiBub3cgbW92ZSB0aGUgcG9pbnRlciBmb3J3YXJkcyBieSB0aGUgbGVuZ3RoIG9mIHRoZSBjb3VudCBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAqLworCQkJCX0KKwkJCQlwdHIrKzsKKworCQkJCWludGVyZmFjZVR5cGUgPSBudG9obCgqKGJwZl91X2ludDMyICopcHRyKTsKKwkJCQlwdHIgKz0gNDsJCQkJCQkJCQkJCQkJLyogc2tpcCBvdmVyIHRoZSBpbnRlcmZhY2UgdHlwZSAqLworCisJCQkJZmxhZ3MgPSAqcHRyKys7CisJCQkJaWYgKGZsYWdzKSBpZmYtPmZsYWdzID0gUENBUF9JRl9MT09QQkFDSzsJCQkJCS8qIGlmIHRoaXMgaXMgYSBsb29wYmFjayBzdHlsZSBpbnRlcmZhY2UsIGxldHMgbWFyayBpdCBhcyBzdWNoICovCisKKwkJCQlhZGRyZXNzX2NvdW50ID0gKnB0cisrOworCisJCQkJcHJldl9hZGRyID0gMDsKKwkJCQl3aGlsZSAoYWRkcmVzc19jb3VudC0tKSB7CisJCQkJCWlmICgoYWRkciA9IG1hbGxvYyhzaXplb2YocGNhcF9hZGRyX3QpKSkgPT0gTlVMTCkgeworCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorCQkJCQliemVybygoY2hhciAqKWFkZHIsIHNpemVvZihwY2FwX2FkZHJfdCkpOworCQkJCQlpZiAoaWZmLT5hZGRyZXNzZXMgPT0gMCkgaWZmLT5hZGRyZXNzZXMgPSBhZGRyOworCQkJCQlpZiAocHJldl9hZGRyKSBwcmV2X2FkZHItPm5leHQgPSBhZGRyOwkJCQkJCQkvKiBpbnNlcnQgYSBmb3J3YXJkIGxpbmsgKi8KKwkJCQkJaWYgKCpwdHIpIHsJCQkJCQkJCQkJCQkJCS8qIGlmIHRoZXJlIGlzIGEgY291bnQgZm9yIHRoZSBhZGRyZXNzICovCisJCQkJCQlpZiAoKHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSA9PSBOVUxMKSB7CQkvKiBnZXQgdGhhdCBhbW91bnQgb2Ygc3BhY2UgKi8KKwkJCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCX0KKwkJCQkJCWJ6ZXJvKChjaGFyICopcywgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQkJCQkJYWRkci0+YWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilzOworCQkJCQkJcy0+c2luX2ZhbWlseQkJPSBBRl9JTkVUOworCQkJCQkJcy0+c2luX2FkZHIuc19hZGRyCT0gKihicGZfdV9pbnQzMiAqKShwdHIgKyAxKTsJCQkvKiBjb3B5IHRoZSBhZGRyZXNzIGluICovCisJCQkJCQlwdHIgKz0gKnB0cjsJCQkJCQkJCQkJLyogbm93IG1vdmUgdGhlIHBvaW50ZXIgZm9yd2FyZHMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIG9mIHRoZSBhZGRyZXNzICovCisJCQkJCX0KKwkJCQkJcHRyKys7CQkJCQkJCQkJCQkJCS8qIHRoZW4gZm9yd2FyZHMgb25lIG1vcmUgZm9yIHRoZSAnbGVuZ3RoIG9mIHRoZSBhZGRyZXNzJyBmaWVsZCAqLworCQkJCQlpZiAoKnB0cikgewkJCQkJCQkJCQkJCS8qIHByb2Nlc3MgYW55IG5ldG1hc2sgKi8KKwkJCQkJCWlmICgocyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkpID09IE5VTEwpIHsKKwkJCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCX0KKwkJCQkJCWJ6ZXJvKChjaGFyICopcywgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQkJCQkJYWRkci0+bmV0bWFzayA9IChzdHJ1Y3Qgc29ja2FkZHIgKilzOworCQkJCQkJcy0+c2luX2ZhbWlseQkJPSBBRl9JTkVUOworCQkJCQkJcy0+c2luX2FkZHIuc19hZGRyCT0gKihicGZfdV9pbnQzMiopKHB0ciArIDEpOworCQkJCQkJcHRyICs9ICpwdHI7CisJCQkJCX0KKwkJCQkJcHRyKys7CisJCQkJCWlmICgqcHRyKSB7CQkJCQkJCQkJCQkJLyogcHJvY2VzcyBhbnkgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwkJCQkJCWlmICgocyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkpID09IE5VTEwpIHsKKwkJCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJCQkJCXJldHVybiAtMTsKKwkJCQkJCX0KKwkJCQkJCWJ6ZXJvKChjaGFyICopcywgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCQkJCQkJYWRkci0+YnJvYWRhZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKXM7CisJCQkJCQlzLT5zaW5fZmFtaWx5CQk9IEFGX0lORVQ7CisJCQkJCQlzLT5zaW5fYWRkci5zX2FkZHIJPSAqKGJwZl91X2ludDMyKikocHRyICsgMSk7CisJCQkJCQlwdHIgKz0gKnB0cjsKKwkJCQkJfQorCQkJCQlwdHIrKzsKKwkJCQkJaWYgKCpwdHIpIHsJCQkJCQkJCQkJCQkvKiBwcm9jZXNzIGFueSBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJCQkJCQlpZiAoKHMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpKSA9PSBOVUxMKSB7CisJCQkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCQlyZXR1cm4gLTE7CisJCQkJCQl9CisJCQkJCQliemVybygoY2hhciAqKXMsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwkJCQkJCWFkZHItPmRzdGFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopczsKKwkJCQkJCXMtPnNpbl9mYW1pbHkJCT0gQUZfSU5FVDsKKwkJCQkJCXMtPnNpbl9hZGRyLnNfYWRkcgk9ICooYnBmX3VfaW50MzIqKShwdHIgKyAxKTsKKwkJCQkJCXB0ciArPSAqcHRyOworCQkJCQl9CisJCQkJCXB0cisrOworCQkJCQlwcmV2X2FkZHIgPSBhZGRyOworCQkJCX0KKwkJCQlwcmV2X2lmZiA9IGlmZjsKKworCQkJCW5ld25hbWUgPSB0cmFuc2xhdGVfSU9QX3RvX3BjYXBfbmFtZSh1LCBpZmYtPm5hbWUsIGludGVyZmFjZVR5cGUpOwkJLyogYWRkIGEgdHJhbnNsYXRpb24gZW50cnkgYW5kIGdldCBhIHBvaW50IHRvIHRoZSBtYW5nbGVkIG5hbWUgKi8KKwkJCQlpZiAoKGlmZi0+bmFtZSA9IHJlYWxsb2MoaWZmLT5uYW1lLCBzdHJsZW4obmV3bmFtZSkgKyAxKSkgPT0gTlVMTCkgewkvKiB3ZSBub3cgcmUtd3JpdGUgdGhlIG5hbWUgc3RvcmVkIGluIHRoZSBpbnRlcmZhY2UgbGlzdCAqLworCQkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJyZWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlzdHJjcHkoaWZmLT5uYW1lLCBuZXduYW1lKTsJCQkJCQkJCQkJCQkvKiB0byB0aGlzIG5ldyBuYW1lICovCisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9jbGllbnRfZGF0YSAoaW50IGZkKSB7CisJdW5zaWduZWQgY2hhcglidWZbMjU2XTsKKwlpbnQJCQkJY2hhc3NpcywgZ2Vvc2xvdDsKKwl1bml0X3QJCQkqdTsKKwlpbnQJCQkJbGVuOworCisJZmluZF91bml0X2J5X2ZkKGZkLCAmY2hhc3NpcywgJmdlb3Nsb3QsICZ1KTsKKworCWlmICgobGVuID0gcmVjdihmZCwgYnVmLCBzaXplb2YoYnVmKSwgMCkpIDw9IDApCXJldHVybiAwOwkvKiByZWFkIGluIHdoYXRldmVyIGRhdGEgd2FzIHNlbnQgdG8gdXMgKi8KKworCWlmICgodS0+aW1zZyA9IHJlYWxsb2ModS0+aW1zZywgKHUtPmxlbiArIGxlbikpKSA9PSBOVUxMKQkvKiBleHRlbmQgdGhlIGJ1ZmZlciBmb3IgdGhlIG5ldyBkYXRhICovCisJCXJldHVybiAwOworCW1lbWNweSgodS0+aW1zZyArIHUtPmxlbiksIGJ1ZiwgbGVuKTsJCQkJCQkvKiBhcHBlbmQgdGhlIG5ldyBkYXRhICovCisJdS0+bGVuICs9IGxlbjsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfYWxsX2Fuc3dlcnModm9pZCkgeworCWludAkJcmV0dmFsOworCXN0cnVjdAl0aW1ldmFsIHR2OworCWludAkJZmQ7CisJaW50CQljaGFzc2lzLCBnZW9zbG90OworCisJdHYudHZfc2VjID0gMjsKKwl0di50dl91c2VjID0gMDsKKworCXdoaWxlICgxKSB7CisJCWludCBmbGFnID0gMDsKKwkJZm9yIChmZCA9IDA7IGZkIDw9IG1heF9mczsgZmQrKykgewkJCQkJCQkJLyogc2NhbiB0aGUgbGlzdCBvZiBkZXNjcmlwdG9ycyB3ZSBtYXkgYmUgbGlzdGVuaW5nIHRvICovCisJCQlpZiAoRkRfSVNTRVQoZmQsICZyZWFkZmRzKSkgZmxhZyA9IDE7CQkJCQkJLyogYW5kIHNlZSBpZiB0aGVyZSBhcmUgYW55IHN0aWxsIHNldCAqLworCQl9CisJCWlmIChmbGFnID09IDApIHJldHVybjsJCQkJCQkJCQkJCS8qIHdlIGFyZSBkb25lLCB3aGVuIHRoZXkgYXJlIGFsbCBnb25lICovCisKKwkJbWVtY3B5KCZ3b3JraW5nX3NldCwgJnJlYWRmZHMsIHNpemVvZihyZWFkZmRzKSk7CQkJCS8qIG90aGVyd2lzZSwgd2Ugc3RpbGwgaGF2ZSB0byBsaXN0ZW4gZm9yIG1vcmUgc3R1ZmYsIHRpbGwgd2UgdGltZW91dCAqLworCQlyZXR2YWwgPSBzZWxlY3QobWF4X2ZzICsgMSwgJndvcmtpbmdfc2V0LCBOVUxMLCBOVUxMLCAmdHYpOworCQlpZiAocmV0dmFsID09IC0xKSB7CQkJCQkJCQkJCQkJLyogYW4gZXJyb3Igb2NjdXJlZCAhISEhISAqLworCQkJcmV0dXJuOworCQl9IGVsc2UgaWYgKHJldHZhbCA9PSAwKSB7CQkJCQkJCQkJCS8qIHRpbWVvdXQgb2NjdXJlZCwgc28gcHJvY2VzcyB3aGF0IHdlJ3ZlIGdvdCBzb2ZhciBhbmQgcmV0dXJuICovCisJCQlwcmludGYoInRpbWVvdXRcbiIpOworCQkJcmV0dXJuOworCQl9IGVsc2UgeworCQkJZm9yIChmZCA9IDA7IGZkIDw9IG1heF9mczsgZmQrKykgewkJCQkJCQkvKiBzY2FuIHRoZSBsaXN0IG9mIHRoaW5ncyB0byBkbywgYW5kIGRvIHRoZW0gKi8KKwkJCQlpZiAoRkRfSVNTRVQoZmQsICZ3b3JraW5nX3NldCkpIHsKKwkJCQkJaWYgKHJlYWRfY2xpZW50X2RhdGEoZmQpID09IDApIHsJCQkJCS8qIGlmIHRoZSBzb2NrZXQgaGFzIGNsb3NlZCAqLworCQkJCQkJRkRfQ0xSKGZkLCAmcmVhZGZkcyk7CQkJCQkJCS8qIGFuZCBkZXNjcmlwdG9ycyB3ZSBsaXN0ZW4gdG8gZm9yIGVycm9ycyAqLworCQkJCQkJZmluZF91bml0X2J5X2ZkKGZkLCAmY2hhc3NpcywgJmdlb3Nsb3QsIE5VTEwpOworCQkJCQkJY2xvc2Vfd2l0aF9JT1AoY2hhc3NpcywgZ2Vvc2xvdCwgRklORCk7CQkJLyogYW5kIGNsb3NlIG91dCBjb25uZWN0aW9uIHRvIGhpbSAqLworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqZ2V0X2Vycm9yX3Jlc3BvbnNlKGludCBmZCwgY2hhciAqZXJyYnVmKSB7CQkvKiByZXR1cm4gYSBwb2ludGVyIG9uIGVycm9yLCBOVUxMIG9uIG5vIGVycm9yICovCisJY2hhcglieXRlOworCWludAkJbGVuID0gMDsKKworCXdoaWxlICgxKSB7CisJCXJlY3YoZmQsICZieXRlLCAxLCAwKTsJCQkJCQkJLyogcmVhZCBhbm90aGVyIGJ5dGUgaW4gKi8KKwkJaWYgKGVycmJ1ZiAmJiAobGVuKysgPCBQQ0FQX0VSUkJVRl9TSVpFKSkgewkJLyogYW5kIGlmIHRoZXJlIGlzIHN0aWxsIHJvb20gaW4gdGhlIGJ1ZmZlciAqLworCQkJKmVycmJ1ZisrID0gYnl0ZTsJCQkJCQkJLyogc3RpY2sgaXQgaW4gKi8KKwkJCSplcnJidWYgPSAnXDAnOwkJCQkJCQkJLyogZW5zdXJlIHRoZSBzdHJpbmcgaXMgbnVsbCB0ZXJtaW5hdGVkIGp1c3QgaW4gY2FzZSB3ZSBtaWdodCBleGNlZWQgdGhlIGJ1ZmZlcidzIHNpemUgKi8KKwkJfQorCQlpZiAoYnl0ZSA9PSAnXDAnKSB7CisJCQlpZiAobGVuID4gMSkJeyByZXR1cm4gZXJyYnVmOwl9CisJCQllbHNlCQkJeyByZXR1cm4gTlVMTDsJCX0KKwkJfQorCX0KK30KKworaW50IGFjbl9maW5kYWxsZGV2cyhjaGFyICplcnJidWYpIHsJCQkJCQkJCS8qIHJldHVybnM6IC0xID0gZXJyb3IsIDAgPSBPSyAqLworCWludAkJY2hhc3NpcywgZ2Vvc2xvdDsKKwl1bml0X3QJKnU7CisKKwlGRF9aRVJPKCZyZWFkZmRzKTsKKwltYXhfZnMgPSAwOworCWZvciAoY2hhc3NpcyA9IDA7IGNoYXNzaXMgPD0gTUFYX0NIQVNTSVM7IGNoYXNzaXMrKykgeworCQlmb3IgKGdlb3Nsb3QgPSAwOyBnZW9zbG90IDw9IE1BWF9HRU9TTE9UOyBnZW9zbG90KyspIHsKKwkJCXUgPSAmdW5pdHNbY2hhc3Npc11bZ2Vvc2xvdF07CisJCQlpZiAodS0+aXAgJiYgKG9wZW5fd2l0aF9JT1AodSwgRklORCkpKSB7CQkJLyogY29ubmVjdCB0byB0aGUgcmVtb3RlIElPUCAqLworCQkJCXNlbmRfdG9fZmQodS0+ZmluZF9mZCwgMSwgKHVuc2lnbmVkIGNoYXIgKikiXDAiKTsKKwkJCQlpZiAoZ2V0X2Vycm9yX3Jlc3BvbnNlKHUtPmZpbmRfZmQsIGVycmJ1ZikpCisJCQkJCWNsb3NlX3dpdGhfSU9QKGNoYXNzaXMsIGdlb3Nsb3QsIEZJTkQpOworCQkJCWVsc2UgeworCQkJCQlpZiAodS0+ZmluZF9mZCA+IG1heF9mcykKKwkJCQkJCW1heF9mcyA9IHUtPmZpbmRfZmQ7CQkJCQkJCQkvKiByZW1lbWJlciB0aGUgaGlnaGVzdCBudW1iZXIgY3VycmVudGx5IGluIHVzZSAqLworCQkJCQlGRF9TRVQodS0+ZmluZF9mZCwgJnJlYWRmZHMpOwkJCQkJCS8qIHdlIGFyZSBnb2luZyB0byB3YW50IHRvIHJlYWQgdGhpcyBndXkncyByZXNwb25zZSB0byAqLworCQkJCQl1LT5sZW4gPSAwOworCQkJCQlzZW5kX3RvX2ZkKHUtPmZpbmRfZmQsIDEsICh1bnNpZ25lZCBjaGFyICopIlEiKTsJCS8qIHRoaXMgaW50ZXJmYWNlIHF1ZXJ5IHJlcXVlc3QgKi8KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJd2FpdF9mb3JfYWxsX2Fuc3dlcnMoKTsKKwlpZiAocHJvY2Vzc19jbGllbnRfZGF0YShlcnJidWYpKQorCQlyZXR1cm4gLTE7CisJc29ydF9pZl90YWJsZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjYXBfc3RhdHNfYWNuKHBjYXBfdCAqaGFuZGxlLCBzdHJ1Y3QgcGNhcF9zdGF0ICpwcykgeworCXVuc2lnbmVkIGNoYXIJYnVmWzEyXTsKKworCXNlbmRfdG9fZmQoaGFuZGxlLT5mZCwgMSwgKHVuc2lnbmVkIGNoYXIgKikiUyIpOwkJCQkJCS8qIHNlbmQgdGhlIGdldF9zdGF0cyBjb21tYW5kIHRvIHRoZSBJT1AgKi8KKworCWlmIChyZWFkX2NsaWVudF9uYnl0ZXMoaGFuZGxlLT5mZCwgc2l6ZW9mKGJ1ZiksIGJ1ZikgPT0gLTEpIHJldHVybiAtMTsJLyogdHJ5IHJlYWRpbmcgdGhlIHJlcXVpcmVkIGJ5dGVzICovCisKKwlwcy0+cHNfcmVjdgkJPSBudG9obCgqKHVpbnQzMl90ICopJmJ1ZlswXSk7CQkJCQkJCS8qIGJyZWFrIHRoZSBidWZmZXIgaW50byBpdHMgdGhyZWUgMzIgYml0IGNvbXBvbmVudHMgKi8KKwlwcy0+cHNfZHJvcAkJPSBudG9obCgqKHVpbnQzMl90ICopJmJ1Zls0XSk7CisJcHMtPnBzX2lmZHJvcAk9IG50b2hsKCoodWludDMyX3QgKikmYnVmWzhdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjbl9vcGVuX2xpdmUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqZXJyYnVmLCBpbnQgKmxpbmt0eXBlKSB7CQkvKiByZXR1cm5zIDAgb24gZXJyb3IsIGVsc2UgcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yICovCisJaW50CQkJY2hhc3NpcywgZ2Vvc2xvdDsKKwl1bml0X3QJCSp1OworCWlmYWNlX3QJCSpwOworCXBjYXBfaWZfdAkqYWxsZGV2c3A7CisKKwlwY2FwX2ZpbmRhbGxkZXZzKCZhbGxkZXZzcCwgZXJyYnVmKTsKKwlmb3IgKGNoYXNzaXMgPSAwOyBjaGFzc2lzIDw9IE1BWF9DSEFTU0lTOyBjaGFzc2lzKyspIHsJCQkJCQkJCQkJLyogc2NhbiB0aGUgdGFibGUuLi4gKi8KKwkJZm9yIChnZW9zbG90ID0gMDsgZ2Vvc2xvdCA8PSBNQVhfR0VPU0xPVDsgZ2Vvc2xvdCsrKSB7CisJCQl1ID0gJnVuaXRzW2NoYXNzaXNdW2dlb3Nsb3RdOworCQkJaWYgKHUtPmlwICE9IE5VTEwpIHsKKwkJCQlwID0gdS0+aWZhY2U7CisJCQkJd2hpbGUgKHApIHsJCQkJCQkJCQkJCQkJCQkJCQkvKiBhbmQgYWxsIGludGVyZmFjZXMuLi4gKi8KKwkJCQkJaWYgKHAtPklPUG5hbWUgJiYgcC0+bmFtZSAmJiAoc3RyY21wKHAtPm5hbWUsIG5hbWUpID09IDApKSB7CQkJCS8qIGFuZCBpZiB3ZSBmb3VuZCB0aGUgaW50ZXJmYWNlIHdlIHdhbnQuLi4gKi8KKwkJCQkJCSpsaW5rdHlwZSA9IHAtPmlmdHlwZTsKKwkJCQkJCW9wZW5fd2l0aF9JT1AodSwgTElWRSk7CQkJCQkJCQkJCQkJCS8qIHN0YXJ0IGEgY29ubmVjdGlvbiB3aXRoIHRoYXQgSU9QICovCisJCQkJCQlzZW5kX3RvX2ZkKHUtPmZkLCBzdHJsZW4ocC0+SU9QbmFtZSkrMSwgKHVuc2lnbmVkIGNoYXIgKilwLT5JT1BuYW1lKTsJLyogc2VuZCB0aGUgSU9QJ3MgaW50ZXJmYWNlIG5hbWUsIGFuZCBhIHRlcm1pbmF0aW5nIG51bGwgKi8KKwkJCQkJCWlmIChnZXRfZXJyb3JfcmVzcG9uc2UodS0+ZmQsIGVycmJ1ZikpIHsKKwkJCQkJCQlyZXR1cm4gLTE7CisJCQkJCQl9CisJCQkJCQlyZXR1cm4gdS0+ZmQ7CQkJCQkJCQkJCQkJCQkJLyogYW5kIHJldHVybiB0aGF0IG9wZW4gZGVzY3JpcHRvciAqLworCQkJCQl9CisJCQkJCXAgPSBwLT5uZXh0OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7CQkJCQkJCQkJCQkJCQkJCQkJCQkvKiBpZiB0aGUgaW50ZXJmYWNlIHdhc24ndCBmb3VuZCwgcmV0dXJuIGFuIGVycm9yICovCit9CisKK3N0YXRpYyB2b2lkIGFjbl9zdGFydF9tb25pdG9yKGludCBmZCwgaW50IHNuYXBsZW4sIGludCB0aW1lb3V0LCBpbnQgcHJvbWlzY3VvdXMsIGludCBkaXJlY3Rpb24pIHsKKwl1bnNpZ25lZCBjaGFyCWJ1Zls4XTsKKwl1bml0X3QJCQkqdTsKKworCS8vcHJpbnRmKCJhY25fc3RhcnRfbW9uaXRvcigpXG4iKTsJCQkJLy8gZnVsa28KKwlmaW5kX3VuaXRfYnlfZmQoZmQsIE5VTEwsIE5VTEwsICZ1KTsKKwlpZiAodS0+Zmlyc3RfdGltZSA9PSAwKSB7CisJCWJ1ZlswXQkJCQkJPSAnTSc7CisJCSoodWludDMyX3QgKikmYnVmWzFdCT0gaHRvbmwoc25hcGxlbik7CisJCWJ1Zls1XQkJCQkJPSB0aW1lb3V0OworCQlidWZbNl0JCQkJCT0gcHJvbWlzY3VvdXM7CisJCWJ1Zls3XQkJCQkJPSBkaXJlY3Rpb247CisJLy9wcmludGYoImFjbl9zdGFydF9tb25pdG9yKCkgZmlyc3QgdGltZVxuIik7CQkJCS8vIGZ1bGtvCisJCXNlbmRfdG9fZmQoZmQsIDgsIGJ1Zik7CQkJCQkJCQkvKiBzZW5kIHRoZSBzdGFydCBtb25pdG9yIGNvbW1hbmQgd2l0aCBpdHMgcGFyYW1ldGVycyB0byB0aGUgSU9QICovCisJCXUtPmZpcnN0X3RpbWUgPSAxOworCX0KKwkvL3ByaW50ZigiYWNuX3N0YXJ0X21vbml0b3IoKSBjb21wbGV0ZVxuIik7CQkJCS8vIGZ1bGtvCit9CisKK3N0YXRpYyBpbnQgcGNhcF9pbmplY3RfYWNuKHBjYXBfdCAqcCwgY29uc3Qgdm9pZCAqYnVmIF9VXywgc2l6ZV90IHNpemUgX1VfKSB7CisJc3RybGNweShwLT5lcnJidWYsICJTZW5kaW5nIHBhY2tldHMgaXNuJ3Qgc3VwcG9ydGVkIG9uIEFDTiBhZGFwdGVycyIsCisJICAgIFBDQVBfRVJSQlVGX1NJWkUpOworCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgaW50IHBjYXBfc2V0ZmlsdGVyX2FjbihwY2FwX3QgKmhhbmRsZSwgc3RydWN0IGJwZl9wcm9ncmFtICpicGYpIHsKKwlpbnQJCQkJZmQgPSBoYW5kbGUtPmZkOworCWludAkJCQljb3VudDsKKwlzdHJ1Y3QgYnBmX2luc24JKnA7CisJdWludDE2X3QJCXNob3J0SW50OworCXVpbnQzMl90CQlsb25nSW50OworCisJc2VuZF90b19mZChmZCwgMSwgKHVuc2lnbmVkIGNoYXIgKikiRiIpOwkJCS8qIEJQRiBmaWx0ZXIgZm9sbG93cyBjb21tYW5kICovCisJY291bnQgPSBicGYtPmJmX2xlbjsKKwlsb25nSW50ID0gaHRvbmwoY291bnQpOworCXNlbmRfdG9fZmQoZmQsIDQsICh1bnNpZ25lZCBjaGFyICopJmxvbmdJbnQpOwkJLyogc2VuZCB0aGUgaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgY291bnQgKi8KKwlwID0gYnBmLT5iZl9pbnNuczsKKwl3aGlsZSAoY291bnQtLSkgewkJCQkJCQkJCS8qIGZvbGxvd2VkIGJ5IHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucyAqLworCQlzaG9ydEludCA9IGh0b25zKHAtPmNvZGUpOworCQlsb25nSW50ID0gaHRvbmwocC0+ayk7CisJCXNlbmRfdG9fZmQoZmQsIDIsICh1bnNpZ25lZCBjaGFyICopJnNob3J0SW50KTsKKwkJc2VuZF90b19mZChmZCwgMSwgKHVuc2lnbmVkIGNoYXIgKikmcC0+anQpOworCQlzZW5kX3RvX2ZkKGZkLCAxLCAodW5zaWduZWQgY2hhciAqKSZwLT5qZik7CisJCXNlbmRfdG9fZmQoZmQsIDQsICh1bnNpZ25lZCBjaGFyICopJmxvbmdJbnQpOworCQlwKys7CisJfQorCWlmIChnZXRfZXJyb3JfcmVzcG9uc2UoZmQsIE5VTEwpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNhcF9zZXRkaXJlY3Rpb25fYWNuKHBjYXBfdCAqaGFuZGxlLCBwY2FwX2RpcmVjdGlvbl90IGQpIHsKKwlzbnByaW50ZihoYW5kbGUtPmVycmJ1Ziwgc2l6ZW9mKGhhbmRsZS0+ZXJyYnVmKSwKKwkgICAgIlNldHRpbmcgZGlyZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gQUNOIGFkYXB0ZXJzIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGFjbl9yZWFkX25fYnl0ZXNfd2l0aF90aW1lb3V0KHBjYXBfdCAqaGFuZGxlLCBpbnQgY291bnQpIHsKKwlzdHJ1Y3QJCXRpbWV2YWwgdHY7CisJaW50CQkJcmV0dmFsLCBmZDsKKwlmZF9zZXQJCXJfZmRzOworCWZkX3NldAkJd19mZHM7CisJdV9jaGFyCQkqYnA7CisJaW50CQkJbGVuID0gMDsKKwlpbnQJCQlvZmZzZXQgPSAwOworCisJdHYudHZfc2VjID0gNTsKKwl0di50dl91c2VjID0gMDsKKworCWZkID0gaGFuZGxlLT5mZDsKKwlGRF9aRVJPKCZyX2Zkcyk7CisJRkRfU0VUKGZkLCAmcl9mZHMpOworCW1lbWNweSgmd19mZHMsICZyX2Zkcywgc2l6ZW9mKHJfZmRzKSk7CisJYnAgPSBoYW5kbGUtPmJwOworCXdoaWxlIChjb3VudCkgeworCQlyZXR2YWwgPSBzZWxlY3QoZmQgKyAxLCAmd19mZHMsIE5VTEwsIE5VTEwsICZ0dik7CisJCWlmIChyZXR2YWwgPT0gLTEpIHsJCQkJCQkJCQkJCS8qIGFuIGVycm9yIG9jY3VyZWQgISEhISEgKi8KKy8vCQkJZnByaW50ZihzdGRlcnIsICJlcnJvciBkdXJpbmcgcGFja2V0IGRhdGEgcmVhZFxuIik7CisJCQlyZXR1cm4gLTE7CQkJCQkJCQkJCQkJLyogYnV0IHdlIG5lZWQgdG8gcmV0dXJuIGEgZ29vZCBpbmRpY2F0aW9uIHRvIHByZXZlbnQgdW5uZWNjZXNzYXJ5IHBvcHVwcyAqLworCQl9IGVsc2UgaWYgKHJldHZhbCA9PSAwKSB7CQkJCQkJCQkJLyogdGltZW91dCBvY2N1cmVkLCBzbyBwcm9jZXNzIHdoYXQgd2UndmUgZ290IHNvZmFyIGFuZCByZXR1cm4gKi8KKy8vCQkJZnByaW50ZihzdGRlcnIsICJ0aW1lb3V0IGR1cmluZyBwYWNrZXQgZGF0YSByZWFkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWlmICgobGVuID0gcmVjdihmZCwgKGJwICsgb2Zmc2V0KSwgY291bnQsIDApKSA8PSAwKSB7CisvLwkJCQlmcHJpbnRmKHN0ZGVyciwgInByZW1hdHVyZSBleGl0IGR1cmluZyBwYWNrZXQgZGF0YSByeFxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY291bnQgLT0gbGVuOworCQkJb2Zmc2V0ICs9IGxlbjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY2FwX3JlYWRfYWNuKHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKSB7CisJI2RlZmluZSBIRUFERVJfU0laRSAoNCAqIDQpCisJdW5zaWduZWQgY2hhcgkJcGFja2V0X2hlYWRlcltIRUFERVJfU0laRV07CisJc3RydWN0IHBjYXBfcGt0aGRyCXBjYXBfaGVhZGVyOworCisJLy9wcmludGYoInBjYXBfcmVhZF9hY24oKVxuIik7CQkJLy8gZnVsa28KKwlhY25fc3RhcnRfbW9uaXRvcihoYW5kbGUtPmZkLCBoYW5kbGUtPnNuYXBzaG90LCBoYW5kbGUtPm1kLnRpbWVvdXQsIGhhbmRsZS0+bWQuY2xlYXJfcHJvbWlzYywgaGFuZGxlLT5kaXJlY3Rpb24pOwkvKiBtYXliZSB0ZWxsIGhpbSB0byBzdGFydCBtb25pdG9yaW5nICovCisJLy9wcmludGYoInBjYXBfcmVhZF9hY24oKSBhZnRlciBzdGFydCBtb25pdG9yXG4iKTsJCQkvLyBmdWxrbworCisJaGFuZGxlLT5icCA9IHBhY2tldF9oZWFkZXI7CisJaWYgKGFjbl9yZWFkX25fYnl0ZXNfd2l0aF90aW1lb3V0KGhhbmRsZSwgSEVBREVSX1NJWkUpID09IC0xKSByZXR1cm4gMDsJCQkvKiB0cnkgdG8gcmVhZCBhIHBhY2tldCBoZWFkZXIgaW4gc28gd2UgY2FuIGdldCB0aGUgc2l6ZW9mIHRoZSBwYWNrZXQgZGF0YSAqLworCisJcGNhcF9oZWFkZXIudHMudHZfc2VjCT0gbnRvaGwoKih1aW50MzJfdCAqKSZwYWNrZXRfaGVhZGVyWzBdKTsJCQkJLyogdHZfc2VjICovCisJcGNhcF9oZWFkZXIudHMudHZfdXNlYwk9IG50b2hsKCoodWludDMyX3QgKikmcGFja2V0X2hlYWRlcls0XSk7CQkJCS8qIHR2X3VzZWMgKi8KKwlwY2FwX2hlYWRlci5jYXBsZW4JCT0gbnRvaGwoKih1aW50MzJfdCAqKSZwYWNrZXRfaGVhZGVyWzhdKTsJCQkJLyogY2FwbGVuICovCisJcGNhcF9oZWFkZXIubGVuCQkJPSBudG9obCgqKHVpbnQzMl90ICopJnBhY2tldF9oZWFkZXJbMTJdKTsJCQkJLyogbGVuICovCisKKwloYW5kbGUtPmJwID0gaGFuZGxlLT5idWZmZXIgKyBoYW5kbGUtPm9mZnNldDsJCQkJCQkJCQkvKiBzdGFydCBvZmYgdGhlIHJlY2VpdmUgcG9pbnRlciBhdCB0aGUgcmlnaHQgc3BvdCAqLworCWlmIChhY25fcmVhZF9uX2J5dGVzX3dpdGhfdGltZW91dChoYW5kbGUsIHBjYXBfaGVhZGVyLmNhcGxlbikgPT0gLTEpIHJldHVybiAwOwkvKiB0aGVuIHRyeSB0byByZWFkIGluIHRoZSByZXN0IG9mIHRoZSBkYXRhICovCisKKwljYWxsYmFjayh1c2VyLCAmcGNhcF9oZWFkZXIsIGhhbmRsZS0+YnApOwkJCQkJCQkJCQkvKiBjYWxsIHRoZSB1c2VyIHN1cHBsaWVkIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGNhcF9hY3RpdmF0ZV9zaXRhKHBjYXBfdCAqaGFuZGxlKSB7CisJaW50CQlmZDsKKworCWlmIChoYW5kbGUtPm9wdC5yZm1vbikgeworCQkvKgorCQkgKiBObyBtb25pdG9yIG1vZGUgb24gU0lUQSBkZXZpY2VzICh0aGV5J3JlIG5vdCBXaS1GaQorCQkgKiBkZXZpY2VzKS4KKwkJICovCisJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHNvbWUgY29tcG9uZW50cyBvZiB0aGUgcGNhcCBzdHJ1Y3R1cmUuICovCisKKwloYW5kbGUtPmluamVjdF9vcCA9IHBjYXBfaW5qZWN0X2FjbjsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IHBjYXBfc2V0ZmlsdGVyX2FjbjsKKwloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IHBjYXBfc2V0ZGlyZWN0aW9uX2FjbjsKKwloYW5kbGUtPnNldF9kYXRhbGlua19vcCA9IE5VTEw7CS8qIGNhbid0IGNoYW5nZSBkYXRhIGxpbmsgdHlwZSAqLworCWhhbmRsZS0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOworCWhhbmRsZS0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOworCWhhbmRsZS0+Y2xlYW51cF9vcCA9IHBjYXBfY2xlYW51cF9hY247CisJaGFuZGxlLT5yZWFkX29wID0gcGNhcF9yZWFkX2FjbjsKKwloYW5kbGUtPnN0YXRzX29wID0gcGNhcF9zdGF0c19hY247CisKKwlmZCA9IGFjbl9vcGVuX2xpdmUoaGFuZGxlLT5vcHQuc291cmNlLCBoYW5kbGUtPmVycmJ1ZiwKKwkgICAgJmhhbmRsZS0+bGlua3R5cGUpOworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJaGFuZGxlLT5tZC5jbGVhcl9wcm9taXNjID0gaGFuZGxlLT5tZC5wcm9taXNjOworCWhhbmRsZS0+ZmQgPSBmZDsKKwloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90OworCisJLyogQWxsb2NhdGUgdGhlIGJ1ZmZlciAqLworCisJaGFuZGxlLT5idWZmZXIJID0gbWFsbG9jKGhhbmRsZS0+YnVmc2l6ZSArIGhhbmRsZS0+b2Zmc2V0KTsKKwlpZiAoIWhhbmRsZS0+YnVmZmVyKSB7CisJICAgICAgICBzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcGNhcF9jbGVhbnVwX2FjbihoYW5kbGUpOworCQlyZXR1cm4gUENBUF9FUlJPUjsKKwl9CisKKwkvKgorCSAqICJoYW5kbGUtPmZkIiBpcyBhIHNvY2tldCwgc28gInNlbGVjdCgpIiBhbmQgInBvbGwoKSIKKwkgKiBzaG91bGQgd29yayBvbiBpdC4KKwkgKi8KKwloYW5kbGUtPnNlbGVjdGFibGVfZmQgPSBoYW5kbGUtPmZkOworCisJcmV0dXJuIDA7Cit9CisKK3BjYXBfdCAqcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKSB7CisJcGNhcF90ICpwOworCisJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2UsIGVidWYpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwLT5hY3RpdmF0ZV9vcCA9IHBjYXBfYWN0aXZhdGVfc2l0YTsKKwlyZXR1cm4gKHApOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLXNpdGEuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC1zaXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzMmVlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1zaXRhLmgKQEAgLTAsMCArMSwxMCBAQAorLyoKKyAqIHBjYXAtc2l0YS5oOiBQYWNrZXQgY2FwdHVyZSBpbnRlcmZhY2UgZm9yIFNJVEEgV0FOIGRldmljZXMKKyAqCisgKiBBdXRob3JzOiBGdWxrbyBIZXcgKGZ1bGtvLmhld0BzaXRhLmFlcm8pICgrMSA5MDUgNjgxNTU3MCk7CisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXNpdGEuaAorICovCisKK2V4dGVybiBpbnQgYWNuX3BhcnNlX2hvc3RzX2ZpbGUoY2hhciAqZXJyYnVmKTsKK2V4dGVybiBpbnQgYWNuX2ZpbmRhbGxkZXZzKGNoYXIgKmVycmJ1Zik7CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtc2l0YS5odG1sIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNpdGEuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzQwOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNpdGEuaHRtbApAQCAtMCwwICsxLDk0MyBAQAorPEhUTUw+PEhFQUQ+Cis8U1RZTEUgdHlwZT0idGV4dC9jc3MiPgorPCEtLQorQSB7IHRleHQtZGVjb3JhdGlvbjpub25lIH0KKy0tPgorPC9TVFlMRT4KKzwvSEVBRD4KKzxCT0RZPgorCis8VEFCTEUgV0lEVEg9MTAwJT48VFI+CisJPFREIEFMSUdOPUxFRlQgVkFMSUdOPVRPUD4KKwkJPEZPTlQgU0laRT0rMCBGQUNFPSJDT1VSSUVSIj48Qj5BICJEaXN0cmlidXRlZCBQY2FwIiBmb3I8QlI+UmVtb3RlIE1vbml0b3JpbmcgTEFOcyAmIFdBTnM8L0I+PEJSPgorCQkJCQkJCQkJCShEZXNpZ24gTm90ZXMgZm9yIHRoZSBTSVRBIEFDTiBkZXZpY2UpPC9GT05UPgorCTwvVEQ+CisJPFREIEFMSUdOPVJJR0hUIFZBTElHTj1UT1A+CisJCUZ1bGtvIEhldzxCUj5TSVRBIElOQyBDYW5hZGEsIEluYy48QlI+UmV2aXNlZDogT2N0b2JlciAyLCAyMDA3CisJPC9URD4KKzwvVFI+PC9UQUJMRT4KKworCis8SDM+U1VNTUFSWTwvSDM+Cis8VUw+CisJPFNUUk9ORz5Ob3RlOjwvU1RST05HPiBUaGlzIGRvY3VtZW50IGlzIHBhcnQgb2YgdGhlIGxpYnBjYXAgR2l0IGFuZCB3YXMgZGVyaXZlZCBmcm9tICdwY2FwLjMnIChjaXJjYSBBdWcvMDcpLgorCTxQPgorCVRoZSBBQ04gcHJvdmlkZXMgYSBjdXN0b21pemVkL2Rpc3RyaWJ1dGVkIHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5IHRoYXQgYWxvd3MgU01QcyB0bworCWludGVyYWN0IHdpdGggdGhlIHZhcmlvdXMgSU9QcyB3aXRoaW4gdGhlIHNpdGUgcHJvdmlkaW5nIGEgc3RhbmRhcmQgbWVjaGFuaXNtCisJdG8gY2FwdHVyZSBMQU4gYW5kIFdBTiBtZXNzYWdlIHRyYWZmaWMuCisJPFA+CisJPENFTlRFUj4KKwkJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MyBXSURUSD03NSU+CisJCQk8VFI+CisJCQkJPFRIIFZBTElHTj1UT1A+U01QPC9USD4KKwkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgU3VwZXJ2aXNvcnkgTWFuYWdlbWVudCBQcm9jZXNzb3Igd2hlcmUgV2lyZXNoYXJrIChvciBlcXVpdmFsZW50KQorCQkJCQkJCQlydW5zIGluIGNvbmp1Y3Rpb24gd2l0aCBhIGxpYnBjYXAgZnJvbnQtZW5kLjwvVEQ+CisJCQk8L1RSPgorCQkJPFRSPgorCQkJCTxUSCBWQUxJR049VE9QPklPUDwvVEg+CisJCQkJPFREIFZBTElHTj1UT1A+SS9PIFByb2Nlc3NvcnMgd2hlcmUgdGhlIG1vbml0b3JlZCBwb3J0cyBleGlzdCBpbiBjb25qdW5jdGlvbgorCQkJCQkJCQl3aXRoIGEgY3VzdG9tIGRldmljZSBkcml2ZXIvbGlicGNhcCBiYWNrLWVuZC48L1REPgorCQkJPC9UUj4KKwkJPC9UQUJMRT4KKwk8L0NFTlRFUj4KKwk8UD4KKwlFYWNoIElPUCB3aWxsIGJlIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBtdWx0aXBsZSBjb25uZWN0aW9ucyBmcm9tIGFuIFNNUAorCWVuYWJsaW5nIG1vbml0b3Jpbmcgb2YgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgYXQgYSB0aW1lLCBlYWNoIHRocm91Z2gKKwlpdHMgb3duIHNlcGVyYXRlIGNvbm5lY3Rpb24uICBUaGUgSU9QIGlzIHJlc3BvbnNpYmxlIHRvIGVuc3VyZSBhbmQgcmVwb3J0CisJYW4gZXJyb3IgaWYgYW55IGF0dGVtcHQgaXMgbWFkZSB0byBtb25pdG9yIHRoZSBzYW1lIGludGVyZmFjZSBtb3JlIHRoYW4gb25jZS4KKwk8UD4KKwlUaGVyZSBhcmUgdGhyZWUgYXBwbGljYXRpb25zIHRoYXQgd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIEFDTiB2ZXJzaW9uIG9mIGxpYnBjYXAuCisJVGhleSBlYWNoIHVzZSBhIHNsaWdodGx5IGRpZmZlcmVudCBtb2RlIGZvciBsb29waW5nL2NhcHR1cmluZyBhbmQgdGVybWluYXRpb24KKwlhcyBzdW1tYXJpemVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisJPFA+CisJPENFTlRFUj4KKwk8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorICAgIAk8VFI+PFRIPkFwcGxpY2F0aW9uPC9USD4JPFRIPkNhcHR1cmU8L1RIPgk8VEg+VGVybWluYXRpb248L1RIPjwvVFI+CisgICAgCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+d2lyZXNoYXJrPC9USD4KKwkJCTxURCBWQUxJR049VE9QPnBjYXBfZGlzcGF0Y2goYWxsIHBhY2tldHMgaW4gb25lIGJ1ZmZlciBvZiBjYXB0dXJlIG9ubHkpPC9URD4KKwkJCTxURCBWQUxJR049VE9QPnBjYXBfYnJlYWtsb29wKCk8L1REPgorCQk8L1RSPgorICAgIAk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPnRzaGFyazwvVEg+CisJCQk8VEQgVkFMSUdOPVRPUD5wY2FwX2Rpc3BhdGNoKG9uZSBidWZmZXIgb2YgY2FwdHVyZSBvbmx5KTwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5TaW5jZSBhIENUUkwtQyB3YXMgdXNlZCB0byB0ZXJtaW5hdGUgdGhlIGFwcGxpY2F0aW9uLCBwY2FwX2JyZWFrbG9vcCgpIGlzIG5ldmVyIGNhbGxlZC48L1REPgorCQk8L1RSPgorICAgIAk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPnRjcGR1bXA8L1RIPgorCQkJPFREIFZBTElHTj1UT1A+cGNhcF9sb29wKGFsbCBwYWNrZXRzIGluIHRoZSBuZXh0IGJ1ZmZlciwgYW5kIGxvb3AgZm9yZXZlcik8L1REPgorCQkJPFREIFZBTElHTj1UT1A+cGNhcF9icmVha2xvb3AoKTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKwk8L0NFTlRFUj4KKwk8UD4KKwk8Qj5Ob3RlOiA8L0I+SW4gYWxsIGNhc2VzLCB0aGUgdGVybWluYXRpb24gb2YgY2FwdHVyaW5nIGlzIGFsd2F5cyAoYXBwYXJlbnRseSkgZm9sbG93ZWQgYnkKKwlwY2FwX2Nsb3NlKCkuICBQY2FwX2JyZWFrbG9vcCgpIGlzIG9ubHkgdXNlZCB0byBzdG9wL3N1c3BlbmQgbG9vcGluZy9wcm9jZXNzaW5nLAorCWFuZCB1cG9uIGNsb3NlIGludGVycHJldGF0aW9uIG9mIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9ucywgaXQgaXMgcG9zc2libGUgdG8gcmVzdW1lCisJY2FwdHVyaW5nIGZvbGxvd2luZyBhIHBjYXBfYnJlYWtsb29wKCkgd2l0aG91dCBhbnkgcmUtaW5pdGlhbGl6YXRpb24uCisJPFA+CisJPEg0PkFDTiBMaW1pdGF0aW9uczwvSDQ+CisJPE9MPgorCQk8TEk+TW9uaXRvcmluZyBvZiBiYWNrdXAgSU9QcyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZC4KKwkJPExJPkV0aGVybmV0IGludGVyZmFjZXMgY2Fubm90IGJlIG1vbml0b3JlZCBpbiBwcm9taXNjdW91cyBtb2RlLgorCTwvT0w+CisKKzwvVUw+CisKKzxIMz5ST1VUSU5FUzwvSDM+Cis8VUw+CisJCVRoZSBmb2xsb3dpbmcgbGlzdCBvZiBmdW5jdGlvbnMgaXMgdGhlIHN1Yi1zZXQgb2YgUGNhcCBmdW5jdGlvbnMgdGhhdCBoYXZlIGJlZW4KKwkJYWx0ZXJlZC9lbmhhbmNlZCB0byBzdXBwb3J0IHRoZSBBQ04gcmVtb3RlIG1vbml0b3JpbmcgZmFjaWxpdHkuICBUaGUgcmVtYWluZGVyIG9mIHRoZSBQY2FwCisJCWZ1bmN0aW9ucyBjb250aW51ZSB0byBwZXJmb3JtIHRoZWlyIGR1dGllcyB1bi1hbHRlcmVkLiAgTGlicGNhcCBvbmx5IHN1cHBvcnRzIHRoaXMKKwkJbW9kZSBvZiBvcGVyYXRpb24gaWYgaXQgaGFzIGJlZW4gY29uZmlndXJlZC9jb21waWxlZCBmb3IgU0lUQS9BQ04gc3VwcG9ydC4KKwkJPFA+CisJCTxVTD48Rk9OVCBGQUNFPUNPVVJJRVI+CisJCQlwY2FwX2ZpbmRhbGxkZXZzPEJSPgorCQkJcGNhcF9mcmVlYWxsZGV2czxCUj4KKwkJCXBjYXBfb3Blbl9saXZlPEJSPgorCQkJcGNhcF9jbG9zZTxCUj4KKwkJCXBjYXBfc2V0ZmlsdGVyPEJSPgorCQkJcGNhcF9kaXNwYXRjaDxCUj4KKwkJCXBjYXBfbG9vcDxCUj4KKwkJCXBjYXBfbmV4dDxCUj4KKwkJCXBjYXBfbmV4dF9leDxCUj4KKwkJCXBjYXBfc3RhdHM8QlI+CisJCTwvRk9OVD48L1VMPgorCisJVGhlc2Ugc3Vicm91dGluZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIGZvciB0aGUgQUNOIHNwZWNpZmljIGRpc3RyaWJ1dGVkIGFuZCByZW1vdGUgbW9uaXRvcmluZworCWFiaWxpdHkgcGVyZm9ybSB0aGUgZm9sbG93aW5nIGJhc2ljIGZ1bmN0aW9ucy4gIE1vcmUgZGV0YWlsIGlzIHByb3ZpZGVkIGluIHRoZQorCSJTTVAvSU9QIEludGVyLVByb2Nlc3MgQ29tbXVuaWNhdGlvbiBQcm90b2NvbCIgc2VjdGlvbi4KKwk8UD4KKzxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJPFRSPgorCQk8VEQgVkFMSUdOPVRPUCBST1dTUEFOPTI+PEI+cGNhcF9vcGVuX2xpdmUoKTwvQj48L1REPgorCQk8VEQgVkFMSUdOPVRPUD5Vc2VkIHRvIG9idGFpbiBhIHBhY2tldCBjYXB0dXJlIGRlc2NyaXB0b3IgdG8gbG9vayBhdCBwYWNrZXRzIG9uIHRoZSBuZXR3b3JrLjwvVEQ+CisJPC9UUj4KKwk8VFI+PFREPjxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9MTAwJT4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgd2lsbCBvcGVuIGEgY29ubmVjdGlvbiB0byB0aGUgc2VsZWN0ZWQgSU9QIG9uIGl0cyAnc25pZmZlcicgcG9ydAorCQkJdG8gZW5zdXJlIGl0IGlzIGF2YWlsYWJsZS4gIEl0IHNlbmRzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBpZGVudGlmeWluZworCQkJdGhlIGludGVyZmFjZSB0byBiZSBtb25pdG9yZWQuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUCAtPiBTTVA8L1RIPgorCQkJPFREPgorCQkJQWZ0ZXIgYW55IHJlcXVpcmVkIHByb2Nlc3NpbmcgaXMgY29tcGxldGUsIHRoZSBJT1Agd2lsbCByZXR1cm4gYQorCQkJbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIGFuIGVycm9yIG1lc3NhZ2UgaWYgb25lIG9jY3VyZWQuCisJCQlJZiBubyBlcnJvciBvY2N1cmVkLCBhIGVtcHR5IHN0cmluZyBpcyBzdGlsbCByZXR1cm5lZC4KKwkJCUVycm9ycyBhcmU6CisJCQk8VUw+CisJCQk8TEk+IkludGVyZmFjZSAoeHh4KSBkb2VzIG5vdCBleGlzdC4iCisJCQk8TEk+IkludGVyZmFjZSAoeHh4KSBub3QgY29uZmlndXJlZC4iCisJCQk8TEk+IkludGVyZmFjZSAoeHh4KSBhbHJlYWR5IGJlaW5nIG1vbml0b3JlZC4iCisJCQk8L1VMPgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPjwvVEQ+PC9UUj4KKworCTxUUj4KKwkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPjxCPnBjYXBfZmluZGFsbGRldnMoKTwvQj48L1REPgorCQk8VEQgVkFMSUdOPVRPUD5JdCBjb25zdHJ1Y3RzIGEgbGlzdCBvZiBuZXR3b3JrIGRldmljZXMgdGhhdCBjYW4gYmUgb3BlbmVkIHdpdGggcGNhcF9vcGVuX2xpdmUoKS48L1REPgorCTwvVFI+CisJPFRSPjxURD48VEFCTEUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zIFdJRFRIPTEwMCU+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QPC9USD4KKwkJCTxURD4KKwkJCUl0IG9idGFpbnMgYSBsaXN0IG9mIElPUHMgY3VycmVudGx5IGF2YWlsYWJsZSAodmlhIC9ldGMvaG9zdHMpLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgd2lsbCBzZXF1ZW50aWFsbHkgb3BlbiBhIGNvbm5lY3Rpb24gdG8gZWFjaCBJT1Agb24gaXRzICdzbmlmZmVyJyBwb3J0IHRvIGVuc3VyZQorCQkJdGhlIElPUCBpcyBhdmFpbGFibGUuCisJCQlJdCBzZW5kcyBhIG51bGwgdGVybWluYXRlZCBlbXB0eSBpbnRlcmZhY2UgSUQgZm9sbG93ZWQgYnkgdGhlIHF1ZXJ5IHJlcXVlc3QgY29tbWFuZC4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+SU9QIC0+IFNNUDwvVEg+CisJCQk8VEQ+VGhlIElPUCByZXR1cm5zIGFuIGVycm9yIHJlc3BvbnNlIGFuZCBpdHMgbGlzdCBvZiBkZXZpY2VzLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgY2xvc2VzIHRoZSBUQ1AgY29ubmVjdGlvbiB3aXRoIGVhY2ggSU9QLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIFNNUCBhZGRzIHRoZSByZWNlaXZlZCBpbmZvcm1hdGlvbiB0byBpdHMgaW50ZXJuYWwgc3RydWN0dXJlLgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPjwvVEQ+PC9UUj4KKworCTxUUj4KKwkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPjxCPnBjYXBfZnJlZWFsbGRldnMoKTwvQj48L1REPgorCQk8VEQgVkFMSUdOPVRPUD5Vc2VkIHRvIGZyZWUgYSBsaXN0IGFsbG9jYXRlZCBieSBwY2FwX2ZpbmRhbGxkZXZzKCkuPC9URD4KKwk8L1RSPgorCTxUUj48VEQ+PFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MyBXSURUSD0xMDAlPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIGZyZWVzIHRoZSBzdHJ1Y3R1cmUgaXQgYnVpbHQgYXMgYSByZXN1bHQgb2YgdGhlIHByZXZpb3VzCisJCQlpbnZvY2F0aW9uIG9mIHBjYXBfZmluZGFsbGRldnMoKS4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT48L1REPjwvVFI+CisKKwk8VFI+CisJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj48Qj5wY2FwX2Rpc3BhdGNoKCk8L0I+PC9URD4KKwkJPFREIFZBTElHTj1UT1A+VXNlZCB0byBjb2xsZWN0IGFuZCBwcm9jZXNzIHBhY2tldHMuPC9URD4KKwk8L1RSPgorCTxUUj48VEQ+PFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MyBXSURUSD0xMDAlPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUCAtPiBJT1A8L1RIPgorCQkJPFREPgorCQkJT24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgcGNhcF9kaXNwYXRjaCgpLCBwY2FwX2xvb3AoKSwgb3IgcGNhcF9uZXh0KCksIG9yIHBjYXBfbmV4dF9leCgpIGZvbGxvd2luZyBhIHBjYXBfb3Blbl9saXZlKCksCisJCQl0aGUgU01QIHdpbGwgcGFzcyBkb3duIHRoZSBtb25pdG9yIHN0YXJ0IGNvbW1hbmQgYW5kIHZhcmlvdXMgcGFyYW1ldGVycyB0aGUgSU9QIHNob3VsZCB1c2UuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUCAtPiBTTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIElPUCBub3cgc2VuZHMgYSBzdHJlYW0gb2YgY2FwdHVyZWQgZGF0YS4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgd2lsbCByZWFkIHRoZSByZXZlcnNlIGNoYW5uZWwgb2YgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgU01QIGFuZCB0aGUKKwkJCUlPUCB0aGF0IHByb3ZpZGVzIHRoZSBjYXB0dXJlZCBkYXRhICh2aWEgJ3AtPnJlYWRfb3AnIHdoaWNoIGlzICdwY2FwX3JlYWRfbGludXgoKScKKwkJCXVudGlsIHRoZSBzZWxlY3QoKSBjYWxsIHJldHVybnMgYSAnbm8gbW9yZSBkYXRhJyBpbmRpY2F0aW9uLgorCQkJSXQgd2lsbCB0aGUgcHJvY2VzcyAoYXQgbW9zdCkgdGhlIG5leHQgJ2NudCcgcGFja2V0cyBhbmQgaW52b2tlIHRoZSBzcGVjaWZpZWQKKwkJCWNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIHBhY2tldCBwcm9jZXNzZWQuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgSU9QIGNvbnRpbnVlcyB0byBsaXN0ZW4gZm9yIGFkZGl0aW9uYWwgY29tbWFuZHMgYXMgd2VsbCBhcyBjYXB0dXJpbmcgYW5kIGZvcndhcmRpbmcgZGF0YSB0byB0aGUgU01QLgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPjwvVEQ+PC9UUj4KKworCTxUUj4KKwkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPjxCPnBjYXBfbG9vcCgpPC9CPjwvVEQ+CisJCTxURCBWQUxJR049VE9QPgorCQkJCUlzIHNpbWlsYXIgdG8gcGNhcF9kaXNwYXRjaCgpIGV4Y2VwdCBpdCBrZWVwcyByZWFkaW5nIHBhY2tldHMgdW50aWwKKwkJCQl0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBwYWNrZXRzIGFyZSBwcm9jZXNzZWQgb3IgYW4gZXJyb3Igb2NjdXJzLgorCQk8L1REPgorCTwvVFI+CisJPFRSPjxURD48VEFCTEUgQk9SREVSPTAgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zIFdJRFRIPTEwMCU+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QIC0+IElPUDwvVEg+CisJCQk8VEQ+CisJCQlPbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBvZiBwY2FwX2Rpc3BhdGNoKCksIHBjYXBfbG9vcCgpLCBvciBwY2FwX25leHQoKSwgb3IgcGNhcF9uZXh0X2V4KCkgZm9sbG93aW5nIGEgcGNhcF9vcGVuX2xpdmUoKSwKKwkJCXRoZSBTTVAgd2lsbCBwYXNzIGRvd24gdGhlIG1vbml0b3Igc3RhcnQgY29tbWFuZCBhbmQgdmFyaW91cyBwYXJhbWV0ZXJzIHRoZSBJT1Agc2hvdWxkIHVzZS4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+SU9QIC0+IFNNUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgSU9QIG5vdyBzZW5kcyBhIHN0cmVhbSBvZiBjYXB0dXJlZCBkYXRhLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIFNNUCBjb250aW51b3VzbHkgcmVhZHMgdGhlIG5leHQgcGFja2V0IGZyb20gdGhlIHJldmVyc2UgY2hhbm5lbCBvZiB0aGUgY29ubmVjdGlvbgorCQkJYmV0d2VlbiB0aGUgU01QIGFuZCB0aGUgSU9QIHRoYXQgcHJvdmlkZXMgdGhlIGNhcHR1cmVkIGRhdGEgKHZpYSAncC0+cmVhZF9vcCcKKwkJCXdoaWNoIGlzICdwY2FwX3JlYWRfbGludXgoKScgdW50aWwgJ2NudCcgcGFja2V0cyBoYXZlIGJlZW4gcmVjZWl2ZWQuCisJCQlUaGUgc3BlY2lmaWVkIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBmb3IgZWFjaCBwYWNrZXQgcmVjZWl2ZWQuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgSU9QIGNvbnRpbnVlcyB0byBsaXN0ZW4gZm9yIGFkZGl0aW9uYWwgY29tbWFuZHMgYXMgd2VsbCBhcyBjYXB0dXJpbmcgYW5kIGZvcndhcmRpbmcgZGF0YSB0byB0aGUgU01QLgorCQkJPC9URD4KKwkJPC9UUj4KKwk8L1RBQkxFPjwvVEQ+PC9UUj4KKworCTxUUj4KKwkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPjxCPnBjYXBfbmV4dCgpPC9CPjwvVEQ+CisJCTxURCBWQUxJR049VE9QPgorCQkJSXQgcmVhZHMgdGhlIG5leHQgcGFja2V0IChieSBjYWxsaW5nIHBjYXBfZGlzcGF0Y2goKSB3aXRoIGEgY291bnQgb2YgMSkKKwkJCWFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGF0YSBpbiB0aGF0IHBhY2tldC4KKwkJPC9URD4KKwk8L1RSPgorCTxUUj48VEQ+PFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MyBXSURUSD0xMDAlPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUCAtPiBJT1A8L1RIPgorCQkJPFREPgorCQkJT24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgcGNhcF9kaXNwYXRjaCgpLCBwY2FwX2xvb3AoKSwgb3IgcGNhcF9uZXh0KCksIG9yIHBjYXBfbmV4dF9leCgpIGZvbGxvd2luZyBhIHBjYXBfb3Blbl9saXZlKCksCisJCQl0aGUgU01QIHdpbGwgcGFzcyBkb3duIHRoZSBtb25pdG9yIHN0YXJ0IGNvbW1hbmQgYW5kIHZhcmlvdXMgcGFyYW1ldGVycyB0aGUgSU9QIHNob3VsZCB1c2UuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUCAtPiBTTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIElPUCBub3cgc2VuZHMgYSBzdHJlYW0gb2YgY2FwdHVyZWQgZGF0YS4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgcmVhZHMgb25seSB0aGUgbmV4dCBwYWNrZXQgZnJvbSB0aGUgcmV2ZXJzZSBjaGFubmVsIG9mIHRoZSBjb25uZWN0aW9uCisJCQliZXR3ZWVuIHRoZSBTTVAgYW5kIHRoZSBJT1AgdGhhdCBwcm92aWRlcyB0aGUgY2FwdHVyZWQgZGF0YSAodmlhIGNhbGxpbmcgcGNhcF9kaXNwYXRjaCgpCisJCQl3aXRoIGEgY291bnQgb2YgMSkgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoYXQgZGF0YSBieSBpbnZva2luZyBhbiBpbnRlcm5hbCBjYWxsYmFjay4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+SU9QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBJT1AgY29udGludWVzIHRvIGxpc3RlbiBmb3IgYWRkaXRpb25hbCBjb21tYW5kcyBhcyB3ZWxsIGFzIGNhcHR1cmluZyBhbmQgZm9yd2FyZGluZyBkYXRhIHRvIHRoZSBTTVAuCisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+PC9URD48L1RSPgorCisJPFRSPgorCQk8VEQgVkFMSUdOPVRPUCBST1dTUEFOPTI+PEI+cGNhcF9uZXh0X2V4KCk8L0I+PC9URD4KKwkJPFREIFZBTElHTj1UT1A+UmVhZHMgdGhlIG5leHQgcGFja2V0IGFuZCByZXR1cm5zIGEgc3VjY2Vzcy9mYWlsdXJlIGluZGljYXRpb24uPC9URD4KKwk8L1RSPgorCTxUUj48VEQ+PFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MyBXSURUSD0xMDAlPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUCAtPiBJT1A8L1RIPgorCQkJPFREPgorCQkJT24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgcGNhcF9kaXNwYXRjaCgpLCBwY2FwX2xvb3AoKSwgb3IgcGNhcF9uZXh0KCksIG9yIHBjYXBfbmV4dF9leCgpIGZvbGxvd2luZyBhIHBjYXBfb3Blbl9saXZlKCksCisJCQl0aGUgU01QIHdpbGwgcGFzcyBkb3duIHRoZSBtb25pdG9yIHN0YXJ0IGNvbW1hbmQgYW5kIHZhcmlvdXMgcGFyYW1ldGVycyB0aGUgSU9QIHNob3VsZCB1c2UuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPklPUCAtPiBTTVA8L1RIPgorCQkJPFREPgorCQkJVGhlIElPUCBub3cgc2VuZHMgYSBzdHJlYW0gb2YgY2FwdHVyZWQgZGF0YS4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+U01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgcmVhZHMgb25seSB0aGUgbmV4dCBwYWNrZXQgZnJvbSB0aGUgcmV2ZXJzZSBjaGFubmVsIG9mIHRoZSBjb25uZWN0aW9uCisJCQliZXR3ZWVuIHRoZSBTTVAgYW5kIHRoZSBJT1AgdGhhdCBwcm92aWRlcyB0aGUgY2FwdHVyZWQgZGF0YSAodmlhIGNhbGxpbmcgcGNhcF9kaXNwYXRjaCgpCisJCQl3aXRoIGEgY291bnQgb2YgMSkgYW5kIHJldHVybnMgc2VwZXJhdGUgcG9pbnRlcnMgdG8gYm90aCB0aGUKKwkJCXBhY2tldCBoZWFkZXIgYW5kIHBhY2tldCBkYXRhIGJ5IGludm9raW5nIGFuIGludGVybmFsIGNhbGxiYWNrLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1A8L1RIPgorCQkJPFREPgorCQkJVGhlIElPUCBjb250aW51ZXMgdG8gbGlzdGVuIGZvciBhZGRpdGlvbmFsIGNvbW1hbmRzIGFzIHdlbGwgYXMgY2FwdHVyaW5nIGFuZCBmb3J3YXJkaW5nIGRhdGEgdG8gdGhlIFNNUC4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT48L1REPjwvVFI+CisKKwk8VFI+CisJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj48Qj5wY2FwX3NldGZpbHRlcigpPC9CPjwvVEQ+CisgICAgICAgIDxURCBWQUxJR049VE9QPlVzZWQgdG8gc3BlY2lmeSBhIGZpbHRlciBwcm9ncmFtLjwvVEQ+CisJPC9UUj4KKwk8VFI+PFREPjxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9MTAwJT4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgc2VuZHMgYSAnc2V0IGZpbHRlcicgY29tbWFuZCBmb2xsb3dlZCBieSB0aGUgQlBGIGNvbW1hbmRzLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1AgLT4gU01QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBJT1AgcmV0dXJucyBhIG51bGwgdGVybWluYXRlZCBlcnJvciBzdHJpbmcgaWYgaXQgZmFpbGVkIHRvIGFjY2VwdCB0aGUgZmlsdGVyLgorCQkJSWYgbm8gZXJyb3Igb2NjdXJlZCwgdGhlbiBhIE5VTEwgdGVybWluYXRlZCBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW5zdGVhZC4KKwkJCUVycm9ycyBhcmU6CisJCQk8VUw+CisJCQk8TEk+IkludmFsaWQgQlBGLiIKKwkJCTxMST4iSW5zdWZmaWNpZW50IHJlc291cmNlcyBmb3IgQlBGLiIKKwkJCTwvVUw+CisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+PC9URD48L1RSPgorCisJPFRSPgorCQk8VEQgVkFMSUdOPVRPUCBST1dTUEFOPTI+PEI+cGNhcF9zdGF0cygpPC9CPjwvVEQ+CisgICAgICAgIDxURCBWQUxJR049VE9QPkZpbGxzIGluIGEgcGNhcF9zdGF0IHN0cnVjdCB3aXRoIHBhY2tldCBzdGF0aXN0aWNzLjwvVEQ+CisJPC9UUj4KKwk8VFI+PFREPjxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTMgV0lEVEg9MTAwJT4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5TTVAgLT4gSU9QPC9USD4KKwkJCTxURD4KKwkJCVRoZSBTTVAgc2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBJT1AgcmVxdWVzdGluZyBpdHMgc3RhdGlzdGljcy4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggVkFMSUdOPVRPUCBOT1dSQVA+SU9QIC0+IFNNUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgSU9QIHJldHVybnMgdGhlIHN0YXRpc3RpY3MuCisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUDwvVEg+CisJCQk8VEQ+CisJCQlUaGUgU01QIGZpbGxzIGluIHRoZSBzdHJ1Y3R1cmUgcHJvdmlkZWQgd2l0aCB0aGUgaW5mb3JtYXRpb24gcmV0cmlldmVkIGZyb20gdGhlIElPUC4KKwkJCTwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT48L1REPjwvVFI+CisKKwk8VFI+CisJCTxURCBWQUxJR049VE9QIFJPV1NQQU49Mj48Qj5wY2FwX2Nsb3NlKCk8L0I+PC9URD4KKyAgICAgICAgPFREIFZBTElHTj1UT1A+Q2xvc2VzIHRoZSBmaWxlIGFuZCBkZWFsbG9jYXRlcyByZXNvdXJjZXMuPC9URD4KKwk8L1RSPgorCTxUUj48VEQ+PFRBQkxFIEJPUkRFUj0wIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MyBXSURUSD0xMDAlPgorCQk8VFI+PFRIIFZBTElHTj1UT1AgTk9XUkFQPlNNUCAtPiBJT1A8L1RIPgorCQkJPFREPgorCQkJVGhlIFNNUCBjbG9zZXMgdGhlIGZpbGUgZGVzY3JpcHRvciwgYW5kIGlmIHRoZSBkZXNjcmlwdG9yIGlzIHRoYXQgb2YKKwkJCXRoZSBjb21taW51Y2F0aW9uIHNlc3Npb24gd2l0aCBhbiBJT1AsIGl0IHRvbyBpcyB0ZXJtaW5hdGVkLgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBWQUxJR049VE9QIE5PV1JBUD5JT1A8L1RIPgorCQkJPFREPgorCQkJSWYgdGhlIElPUCBkZXRlY3RzIHRoYXQgaXRzIGNvbW11bmljYXRpb24gc2Vzc2lvbiB3aXRoIGFuIFNNUAorCQkJaGFzIGNsb3NlZCwgaXQgd2lsbCB0ZXJtaW5hdGUgYW55IG1vbml0b3JpbmcgaW4gcHJvZ3Jlc3MsCisJCQlyZWxlYXNlIGFueSByZXNvdXJjZXMgYW5kIGNsb3NlIGl0cyBlbmQgb2YgdGhlIHNlc3Npb24uCisJCQlJdCB3aWxsIG5vdCBtYWludGFpbiBwZXJzaXN0YW5jZSBvZiBhbnkgaW5mb3JtYXRpb24gb3IgcHJpb3IgbW9kZSBvZiBvcGVyYXRpb24uCisJCQk8L1REPgorCQk8L1RSPgorCTwvVEFCTEU+PC9URD48L1RSPgorPC9UQUJMRT4KKzwvVUw+CisKKzxQPgorPEgzPlNNUC9JT1AgSW50ZXItUHJvY2VzcyBDb21tdW5pY2F0aW9uIFByb3RvY29sPC9IMz4KKworPFVMPgorCTxMST48UD5Db21tdW5pY2F0aW9ucyBiZXR3ZWVuIGFuIFNNUCBhbmQgYW4gSU9QIGNvbnNpc3RzIG9mIGEgVENQIHNlc3Npb24KKwkJCWJldHdlZW4gYW4gZXBoZW1lcmFsIHBvcnQgb24gdGhlIFNNUCBhbmQgdGhlIHdlbGwga25vd24gcG9ydCBvZiA0OTE1MgorCQkJKHdoaWNoIGlzIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9ydCBpbiB0aGUgJ2R5bmFtaWMgYW5kL29yIHByaXZhdGUgcG9ydCcKKwkJCXJhbmdlKSBvbiBhbiBJT1AuCisJPExJPjxQPkZvbGxvd2luZyBhIFRDUCBvcGVuIG9wZXJhdGlvbiB0aGUgSU9QIHJlY2VpdmVzIGEgbnVsbCB0ZXJtaW5hdGVkCisJCQknaW50ZXJmYWNlIElEJyBzdHJpbmcgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIG9wZXJhdGlvbiB0aGF0IGZvbGxvd3M6CisJPExJPjxQPkV2ZXJ5IGNvbW1hbmQgcmVjZWl2ZWQgYnkgYW4gSU9QIGltcGxpZXMgYSAnc3RvcCB0cmFjZS9zdG9wIGZvcndhcmRpbmcnIG9wZXJhdGlvbiBtdXN0CisJCQlvY2N1ciBiZWZvcmUgZXhlY3V0aW5nIHRoZSByZWNlaXZlZCBjb21tYW5kLgorCTxMST48UD5BIHNlc3Npb24gaXMgY2xvc2VkIHdoZW4gdGhlIFNNUCBjbG9zZXMgdGhlIFRDUCBzZXNzaW9uIHdpdGggdGhlIElPUC4KKwkJCU9idmlvdXNseSBtb25pdG9yaW5nIGFuZCBmb3J3YXJkaW5nIGlzIGFsc28gc3RvcHBlZCBhdCB0aGF0IHRpbWUuCisKKwk8Qj5Ob3RlOiA8L0I+QWxsIG11bHRpLW9jdGV0IGVudGl0aWVzIGFyZSBzZW50IGluIG5ldHdvcmsgbmV1dHJhbCBvcmRlci4KKwk8UD4KKworCTxUQUJMRSBCT1JERVI9MCBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTU+CisJCTxUUj48VEggQ09MU1BBTj0zPjxIUiBXSURUSD0xMDAlPjwvVEg+PC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj02PnBjYXBfZmluZGFsbGRldnMoKTwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNNUCAtPiBJT1A8L1REPgorCQkJPFREIFZBTElHTj1UT1A+T3BlbiBzb2NrZXQgKHRvIGVhY2ggSU9QKSwgYW5kIHNlbmRzOgorCQkJCTxQPgorCQkJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQkJCTxUUj4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5hbWUvPEJSPlB1cnBvc2U8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNpemU8QlI+KGluIGJ5dGVzKTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5EZXNjcmlwdGlvbjwvVEg+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPkludGVyZmFjZSBJRDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5BIE5VTEwgdG8gaW5kaWNhdGUgYW4gYW4gZW1wdHkgJ2ludGVyZmFjZSBJRCcuPC9URD4KKwkJCQkJPC9UUj4KKwkJCQk8L1RBQkxFPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5JT1AgLT4gU01QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPlNlbmQgaXRzIChwb3NzaWJseSBlbXB0eSkgTlVMTCB0ZXJtaW5hdGVkIGVycm9yIHJlc3BvbnNlIHN0cmluZy48L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNNUCAtPiBJT1A8L1REPgorCQkJPFREIFZBTElHTj1UT1A+U2VuZHMgdGhlICdpbnRlcmZhY2UgcXVlcnkgcmVxdWVzdCc6CisJCQkJPFA+CisJCQkJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9Mz4KKwkJCQkJPFRSPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+TmFtZS88QlI+UHVycG9zZTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U2l6ZTxCUj4oaW4gYnl0ZXMpPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPkRlc2NyaXB0aW9uPC9USD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+SW50ZXJmYWNlIElEPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPkEgJ1EnIChpbmRpY2F0aW5nICdpbnRlcmZhY2UgcXVlcnkgcmVxdWVzdCcpLjwvVEQ+CisJCQkJCTwvVFI+CisJCQkJPC9UQUJMRT4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+SU9QIC0+IFNNUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5UaGUgSU9QIHJldHVybnMgYSBsaXN0IG9mIHNlcXVlbmNlcyBvZiBpbmZvcm1hdGlvbiBhcworCQkJCWRlZmluZWQgYnkgdGhlIHJldHVybiBwYXJhbWV0ZXIgb2YgdGhpcyBmdW5jdGlvbiBjYWxsIChhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIHRhYmxlKS4KKwkJCQlFbGVtZW50cyBhcmUgc3BlY2lmaWVkIGJ5IHByb3ZpZGluZyBhbiB1bnNpZ25lZCBieXRlIHByZWNlZWRpbmcgdGhlIGFjdHVhbCBkYXRhIHRoYXQgY29udGFpbnMgbGVuZ3RoIGluZm9ybWF0aW9uLgorCQkJCTxQPgorCQkJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQkJPFRSPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+Tm90ZXM6PC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5hbWUvPEJSPlB1cnBvc2U8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNpemU8QlI+KGluIGJ5dGVzKTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5EZXNjcmlwdGlvbjwvVEg+CisJCQkJPC9UUj4KKwkJCQk8VFI+CisJCQkJCTxURCBST1dTUEFOPTc+Jm5ic3A7PC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049UklHSFQ+bGVuZ3RoPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgbnVtYmVyIG9mIG9jdGV0cyBpbiB0aGUgbmFtZSBmaWVsZCB0aGF0IGZvbGxvd3MuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1MRUZUPk5hbWU8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MS0yNTU8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlLiBUaGUgZm9ybWF0IG9mIHRoZSBuYW1lIGlzIGFuIGFscGhhYmV0aWMgc3RyaW5nIChpbmRpY2F0aW5nCisJCQkJCQkJCQl0aGUgdHlwZSBvZiBpbnRlcmZhY2UpIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIG51bWVyaWMgc3RyaW5nIChpbmRpY2F0aW5nIHRoZSBpbnRlcmZhY2UncworCQkJCQkJCQkJc2VxdWVuY2UgbnVtYmVyKS4KKwkJCQkJCQkJCVNlcXVlbmNlIG51bWJlcnMgKGlmIG5lZWRlZCkgd2lsbCBiZWdpbiBhdCB6ZXJvIGFuZCBwcm9ncmVzcyBtb25vdG9uaWNhbGx5IHVwd2FyZHMuCisJCQkJCQkJCQkoaS5lLiAnZXRoMCcsICdsbycsICd3YW4wJywgZXRjLikKKwkJCQkJCQkJCTxQPgorCQkJCQkJCQkJRm9yIGFuIElPUCwgdGhlIGFscGhhYmV0aWMgc3RyaW5nIHdpbGwgYmUgb25lIG9mOiAnZXRoJywgJ3dhbicsIGFuZCAnbG8nCisJCQkJCQkJCQlmb3IgRXRoZXJuZXQsIFdBTiBwb3J0cyBhbmQgdGhlIElQIGxvb3BiYWNrIGRldmljZSByZXNwZWN0aXZlbHkuCisJCQkJCQkJCQlBbiBJT1AgY3VycmVudGx5IHN1cHBvcnRzOiAnZXRoMCcsICdldGgxJywgJ2xvJywgJ3dhbjAnIC4uLiAnd2FuNycuCisJCQkJCQkJCQk8UD4KKwkJCQkJCTxCPk5vdGU6PC9CPiBJT1BzIGFuZCBBQ05zIHdpbGwgbm90IGN1cnJlbnRseSBzdXBwb3J0IHRoZSBjb25jZXB0IG9mICdhbnknIGludGVyZmFjZS48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPVJJR0hUPmxlbmd0aDwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG51bWJlciBvZiBvY3RldHMgaW4gdGhlIGludGVyZmFjZSBkZXNjcmlwdGlvbiBmaWVsZCB0aGF0IGZvbGxvd3MuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1MRUZUPkludGVyZmFjZSBEZXNjcmlwdGlvbjwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4wLTI1NTwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QPkEgZGVzY3JpcHRpb24gb2YgdGhlIGludGVyZmFjZSBvciBpdCBtYXkgYmUgYW4gZW1wdHkgc3RyaW5nLiAoaS5lLiAnQUxDJyk8L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPUxFRlQ+SW50ZXJmYWNlIFR5cGU8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+NDwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QPlRoZSB0eXBlIG9mIGludGVyZmFjZSBhcyBkZWZpbmVkIGluIHRoZSBkZXNjcmlwdGlvbiBmb3IgcGNhcF9kYXRhbGluaygpIChpbiBuZXR3b3JrIG5ldXRyYWwgb3JkZXIpLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8VFI+PFREIFZBTElHTj1UT1AgQUxJR049TEVGVD5Mb29wYmFjayBGbGFnPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD4xID0gaWYgdGhlIGludGVyZmFjZSBpcyBhIGxvb3BiYWNrIGludGVyZmFjZSwgemVybyA9IG90aGVyd2lzZS48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPVJJR0hUPmNvdW50PC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD4jIG9mIGFkZHJlc3MgZW50cmllcyB0aGF0IGZvbGxvdy4KKwkJCQkJCUVhY2ggZW50cnkgaXMgYSBzZXJpZXMgb2YgYnl0ZXMgaW4gbmV0d29yayBuZXV0cmFsIG9yZGVyLgorCQkJCQkJU2VlIHRoZSBwYXJhbWV0ZXIgZGVmaW5pdGlvbiBhYm92ZSBmb3IgbW9yZSBkZXRhaWxzLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8VFI+CisJCQkJCTxURCBBTElHTj1DRU5URVIgUk9XU1BBTj04IFdJRFRIPTElPlJlcGVhdGVkICdjb3VudCcgbnVtYmVyIG9mIHRpbWVzLjwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPVJJR0hUPmxlbmd0aDwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG51bWJlciBvZiBvY3RldHMgaW4gdGhlIGFkZHJlc3MgZmllbGQgdGhhdCBmb2xsb3dzLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8VFI+PFREIFZBTElHTj1UT1AgQUxJR049TEVGVD5BZGRyZXNzPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjEtMjU1PC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIGFkZHJlc3Mgb2YgdGhpcyBpbnRlcmZhY2UgKGluIG5ldHdvcmsgbmV1dHJhbCBvcmRlcikuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1SSUdIVD5sZW5ndGg8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QPlRoZSBudW1iZXIgb2Ygb2N0ZXRzIGluIHRoZSBuZXRtYXNrIGZpZWxkIHRoYXQgZm9sbG93cy48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPUxFRlQ+TmV0d29yayBNYXNrPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjAtMjU1PC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG5ldHdvcmsgbWFzayB1c2VkIG9uIHRoaXMgaW50ZXJmYWNlIChpZiBhcHBsaWNhYmxlKSAoaW4gbmV0d29yayBuZXV0cmFsIG9yZGVyKS48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPVJJR0hUPmxlbmd0aDwvVEQ+CisJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG51bWJlciBvZiBvY3RldHMgaW4gdGhlIGJyb2FkY2FzdCBhZGRyZXNzIGZpZWxkIHRoYXQgZm9sbG93cy48L1REPgorCQkJCTwvVFI+CisJCQkJPFRSPjxURCBWQUxJR049VE9QIEFMSUdOPUxFRlQ+QnJvYWRjYXN0IEFkZHJlc3M8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MC0yNTU8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgYnJvYWRjYXN0IGFkZHJlc3Mgb2YgdGhpcyBpbnRlcmZhY2UgKGlmIGFwcGxpY2FibGUpIChpbiBuZXR3b3JrIG5ldXRyYWwgb3JkZXIpLjwvVEQ+CisJCQkJPC9UUj4KKwkJCQk8VFI+PFREIFZBTElHTj1UT1AgQUxJR049UklHSFQ+bGVuZ3RoPC9URD4KKwkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgbnVtYmVyIG9mIG9jdGV0cyBpbiB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBmaWVsZCB0aGF0IGZvbGxvd3MuPC9URD4KKwkJCQk8L1RSPgorCQkJCTxUUj48VEQgVkFMSUdOPVRPUCBBTElHTj1MRUZUPkRlc3RpbmF0aW9uIEFkZHJlc3M8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MC0yNTU8L1REPgorCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGlzIGludGVyZmFjZSAoaWYgYXBwbGljYWJsZSkgKGluIG5ldHdvcmsgbmV1dHJhbCBvcmRlcikuPC9URD4KKwkJCQk8L1RSPgorCQkJCTwvVEFCTEU+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U01QIC0+IElPUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5DbG9zZSB0aGUgc29ja2V0LjwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+SU9QIC0+IFNNUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5DbG9zZSB0aGUgc29ja2V0LjwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggQ09MU1BBTj0zPjxIUiBXSURUSD0xMDAlPjwvVEg+PC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPnBjYXBfb3Blbl9saXZlKCk8L1REPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TTVAgLT4gSU9QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPk9wZW4gc29ja2V0LCBhbmQgc2VuZHM6CisJCQkJPFA+CisJCQkJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9Mz4KKwkJCQkJPFRSPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+TmFtZS88QlI+UHVycG9zZTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U2l6ZTxCUj4oaW4gYnl0ZXMpPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPkRlc2NyaXB0aW9uPC9USD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+SW50ZXJmYWNlIElEPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4nbic8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+J24nIG9jdGV0cyBjb250YWluaW5nIGEgTlVMTCB0ZXJtaW5hdGVkIGludGVyZmFjZSBuYW1lIHN0cmluZy48L1REPgorCQkJCQk8L1RSPgorCQkJCTwvVEFCTEU+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPklPUCAtPiBTTVA8L1REPgorCQkJPFREIFZBTElHTj1UT1A+U2VuZCBpdHMgTlVMTCB0ZXJtaW5hdGVkIGVycm9yIHJlc3BvbnNlIHN0cmluZy48L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIENPTFNQQU49Mz48SFIgV0lEVEg9MTAwJT48L1RIPjwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIE5PV1JBUCBST1dTUEFOPTI+cGNhcF9kaXNwYXRjaCgpPEJSPnBjYXBfbG9vcCgpPEJSPnBjYXBfbmV4dCgpPEJSPnBjYXBfbmV4dF9leCgpPC9URD4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U01QIC0+IElPUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5PbiB0aGUgZmlyc3QgaW52b2NhdGlvbiBmb2xsb3dpbmcgYSBwY2FwX29wZW5fbGl2ZSgpIG9yIHBjYXBfYnJlYWtsb29wKCkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBzZW50OgorCQkJCTxQPgorCQkJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQkJCTxUUj4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5hbWUvPEJSPlB1cnBvc2U8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNpemU8QlI+KGluIGJ5dGVzKTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5EZXNjcmlwdGlvbjwvVEg+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPmNvbW1hbmQ8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+J00nIChpbmRpY2F0aW5nICdtb25pdG9yIHN0YXJ0Jyk8L1REPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5zbmFwbGVuPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj40PC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPnNuYXBsZW48L1REPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD50aW1lb3V0PC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPnRpbWVvdXQgdmFsdWUgKGluIG1pbGxpc2Vjb25kcyk8L1REPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5wcm9taXNjdW91czwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5BIGZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBpbnRlcmZhY2UgYmVpbmcgbW9uaXRvcmVkIHNob3cgb3BlcmF0ZQorCQkJCQkJCWluIHByb21pc2N1b3VzIG1vZGUuIFtvZmYoMCkgLyBvbihOWildPC9URD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+ZGlyZWN0aW9uPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPkEgZmxhZyBpbmRpY2F0aW5nIHRoZSBkaXJlY3Rpb24gb2YgdHJhZmZpYyB0aGF0IHNob3VsZCBiZSBjYXB0dXRlZCBbYm90aCgwKSAvIGluKDEpIC8gb3V0KDIpXTwvVEQ+CisJCQkJCTwvVFI+CisJCQkJPC9UQUJMRT4KKwkJCTwvVEQ+CisJCTwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+SU9QIC0+IFNNUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5TZW5kcyBjYXB0dXJlZCBwYWNrZXRzLjwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggQ09MU1BBTj0zPjxIUiBXSURUSD0xMDAlPjwvVEg+PC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgUk9XU1BBTj0yPnBjYXBfc2V0ZmlsdGVyKCk8L1REPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TTVAgLT4gSU9QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPkF0IGFueSB0aW1lLCB0aGUgU01QIGNhbiBpc3N1ZSBhIHNldCBmaWx0ZXIgY29tbWFuZCB3aGljaCBjb250YWlucworCQkJCQkJCWFuIGluZGljYXRvciwgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHN0YXRlbWVudHMgaW4gdGhlIGZpbHRlciwKKwkJCQkJCQlmb2xsb3dlZCBieSB0aGUgc2VxdWVuY2Ugb2YgZmlsdGVyIGNvbW1hbmRzIHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2UKKwkJCQkJCQlvZiBDLXN0eWxlIHN0cnVjdHVyZXMuCisJCQkJPFA+CisJCQkJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9Mz4KKwkJCQkJPFRSPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+TmFtZS88QlI+UHVycG9zZTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U2l6ZTxCUj4oaW4gYnl0ZXMpPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPkRlc2NyaXB0aW9uPC9USD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+Y29tbWFuZDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD4nRicgKGluZGljYXRpbmcgJ2ZpbHRlcicpPC9URD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+Y291bnQ8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjQ8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG51bWJlciBvZiBjb21tYW5kIGluIHRoZSBCZXJrZWxleSBQYWNrZXQgRmlsdGVyIHRoYXQgZm9sbG93LjwvVEQ+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPkJQRiBwcm9ncmFtPC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4nbic8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+OCBieXRlcyBvZiBlYWNoIGNvbW1hbmQgKHJlcGVhdGVkICduJyB0aW1lcykuPEJSPgorCQkJCQkJCQkgCUVhY2ggY29tbWFuZCBjb25zaXN0cyBvZiB0aGF0IEMtc3R5bGUgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zOgorCQkJCQkJCTxQPgorCQkJCQkJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQkJCQkJCTxUUj4KKwkJCQkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPk5hbWUvPEJSPlB1cnBvc2U8L1RIPgorCQkJCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPlNpemU8QlI+KGluIGJ5dGVzKTwvVEg+CisJCQkJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5EZXNjcmlwdGlvbjwvVEg+CisJCQkJCQkJCTwvVFI+CisJCQkJCQkJCTxUUj4KKwkJCQkJCQkJCTxURCBWQUxJR049VE9QPm9wY29kZTwvVEQ+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MjwvVEQ+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgY29tbWFuZCdzIG9wY29kZS48L1REPgorCQkJCQkJCQk8L1RSPgorCQkJCQkJCQk8VFI+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUD4nanQnPC9URD4KKwkJCQkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj4xPC9URD4KKwkJCQkJCQkJCTxURCBWQUxJR049VE9QPlRoZSAnanVtcCBpZiB0cnVlJyBwcm9ncmFtIGNvdW50ZXIgb2Zmc2V0LjwvVEQ+CisJCQkJCQkJCTwvVFI+CisJCQkJCQkJCTxUUj4KKwkJCQkJCQkJCTxURCBWQUxJR049VE9QPidqZic8L1REPgorCQkJCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjE8L1REPgorCQkJCQkJCQkJPFREIFZBTElHTj1UT1A+VGhlICdqdW1wIGlmIGZhbHNlJyBwcm9ncmFtIGNvdW50ZXIgb2Zmc2V0LjwvVEQ+CisJCQkJCQkJCTwvVFI+CisJCQkJCQkJCTxUUj4KKwkJCQkJCQkJCTxURCBWQUxJR049VE9QPidrJzwvVEQ+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+NDwvVEQ+CisJCQkJCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgJ290aGVyJyBkYXRhIGZpZWxkLjwvVEQ+CisJCQkJCQkJCTwvVFI+CisJCQkJCQkJPC9UQUJMRT4KKwkJCQkJCQk8UD4KKwkJCQkJCQlSZWZlciB0byB0aGUgYnBmKDQpIG1hbiBwYWdlIGZvciBtb3JlIGRldGFpbHMuCisJCQkJCQk8L1REPgorCQkJCQk8L1RSPgorCQkJCTwvVEFCTEU+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgTk9XUkFQPklPUCAtPiBTTVA8L1REPgorCQkJPFREIFZBTElHTj1UT1A+SW4gcmV0dXJuIHRoZSBJT1Agd2lsbCBzZW5kIGl0cyAocG9zc2libHkgZW1wdHkpIE5VTEwgdGVybWluYXRlZCBlcnJvciByZXNwb25zZSBzdHJpbmcuPC9URD4KKwkJPC9UUj4KKwkJPFRSPjxUSCBDT0xTUEFOPTM+PEhSIFdJRFRIPTEwMCU+PC9USD48L1RSPgorCQk8VFI+CisJCQk8VEQgVkFMSUdOPVRPUCBST1dTUEFOPTI+cGNhcF9zdGF0cygpPC9URD4KKwkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U01QIC0+IElPUDwvVEQ+CisJCQk8VEQgVkFMSUdOPVRPUD5BdCBhbnkgdGltZSwgdGhlIFNNUCBjYW4gaXNzdWUgYSAncmV0cmlldmUgc3RhdGlzdGljcycgY29tbWFuZCB3aGljaCBjb250YWluczo8QlI+CisJCQkJPFA+CisJCQkJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9Mz4KKwkJCQkJPFRSPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+TmFtZS88QlI+UHVycG9zZTwvVEg+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBOT1dSQVA+U2l6ZTxCUj4oaW4gYnl0ZXMpPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPkRlc2NyaXB0aW9uPC9USD4KKwkJCQkJPC9UUj4KKwkJCQkJPFRSPgorCQkJCQkJPFREIFZBTElHTj1UT1A+Y29tbWFuZDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+MTwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD4nUycgKGluZGljYXRpbmcgJ3JlcXVlc3Qgc3RhdGlzdGljcycpPC9URD4KKwkJCQkJPC9UUj4KKwkJCQk8L1RBQkxFPgorCQkJPC9URD4KKwkJPC9UUj4KKwkJPFRSPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5JT1AgLT4gU01QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPkluIHJldHVybiB0aGUgSU9QIHdpbGwgc2VuZDoKKwkJCQk8UD4KKwkJCQk8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorCQkJCQk8VFI+CisJCQkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5OYW1lLzxCUj5QdXJwb3NlPC9USD4KKwkJCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TaXplPEJSPihpbiBieXRlcyk8L1RIPgorCQkJCQk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+RGVzY3JpcHRpb248L1RIPgorCQkJCQk8L1RSPgorCQkJCQk8VFI+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5wc19yZWN2PC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj40PC9URD4KKwkJCQkJCTxURCBWQUxJR049VE9QPlRoZSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHBhc3NlZCB0aGUgZmlsdGVyLjwvVEQ+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPnBzX2Ryb3A8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjQ8L1REPgorCQkJCQkJPFREIFZBTElHTj1UT1A+VGhlIG51bWJlciBvZiBwYWNrZXRzIHRoYXQgd2VyZSBkcm9wcGVkIGJlY2F1c2UgdGhlIGlucHV0IHF1ZXVlIHdhcyBmdWxsLAorCQkJCQkJCXJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IHBhc3NlZCB0aGUgZmlsdGVyLjwvVEQ+CisJCQkJCTwvVFI+CisJCQkJCTxUUj4KKwkJCQkJCTxURCBWQUxJR049VE9QPnBzX2lmZHJvcDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+NDwvVEQ+CisJCQkJCQk8VEQgVkFMSUdOPVRPUD5UaGUgbnVtYmVyIG9mIHBhY2tldHMgZHJvcHBlZCBieSB0aGUgbmV0d29yayBpbnRlZmFjZQorCQkJCQkJCShyZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSB3b3VsZCBoYXZlIHBhc3NlZCB0aGUgaW5wdXQgZmlsdGVyKS48L1REPgorCQkJCQk8L1RSPgorCQkJCTwvVEFCTEU+CisJCQk8L1REPgorCQk8L1RSPgorCQk8VFI+PFRIIENPTFNQQU49Mz48SFIgV0lEVEg9MTAwJT48L1RIPjwvVFI+CisJCTxUUj4KKwkJCTxURCBWQUxJR049VE9QIFJPV1NQQU49MT5wY2FwX2Nsb3NlKCk8L1REPgorCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIE5PV1JBUD5TTVAgLT4gSU9QPC9URD4KKwkJCTxURCBWQUxJR049VE9QPkF0IGFueSB0aW1lLCB0aGUgU01QIGNhbiBjbG9zZSB0aGUgVENQIHNlc3Npb24gd2l0aCB0aGUgSU9QLjwvVEQ+CisJCTwvVFI+CisJCTxUUj48VEggQ09MU1BBTj0zPjxIUiBXSURUSD0xMDAlPjwvVEg+PC9UUj4KKwk8L1RBQkxFPgorPC9VTD4KKworPEgzPkludGVyZmFjZSBJRCBOYW1pbmcgQ29udmVudGlvbjwvSDM+Cis8VUw+CisJRWFjaCBpbnRlcmZhY2Ugd2l0aGluIGFuIElPUCB3aWxsIGJlIHJlZmVycmVkIHRvIHVuaXF1ZWx5LiAgU2luY2UgYW4gY3VycmVudGx5IGNvbnRhaW5zCisJOCBtb25pdG9yYWJsZSBXQU4gcG9ydHMgYW5kIGEgbW9uaXRvcmFibGUgRXRoZXJuZXQgcG9ydCwgdGhlIG5hbWluZyBjb252ZW50aW9uIGlzOgorCTxQPgorCTxDRU5URVI+CisJPFRBQkxFIEJPUkRFUj0xIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9Mz4KKwkJPFRSPjxUSD5JbnRlcmZhY2UgIzwvVEg+CQk8VEg+VHlwZTwvVEg+CQkJCQk8VEg+TmFtZTwvVEg+PC9UUj4KKwkJPFRSPjxURCBBTElHTj1DRU5URVI+MTwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPldBTjwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPndhbjA8L1REPjwvVFI+CisJCTxUUj48VEQgQUxJR049Q0VOVEVSPjI8L1REPgkJPFREIEFMSUdOPUNFTlRFUj5XQU48L1REPgkJPFREIEFMSUdOPUNFTlRFUj53YW4xPC9URD48L1RSPgorCQk8VFI+PFREIEFMSUdOPUNFTlRFUj4zPC9URD4JCTxURCBBTElHTj1DRU5URVI+V0FOPC9URD4JCTxURCBBTElHTj1DRU5URVI+d2FuMjwvVEQ+PC9UUj4KKwkJPFRSPjxURCBBTElHTj1DRU5URVI+NDwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPldBTjwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPndhbjM8L1REPjwvVFI+CisJCTxUUj48VEQgQUxJR049Q0VOVEVSPjU8L1REPgkJPFREIEFMSUdOPUNFTlRFUj5XQU48L1REPgkJPFREIEFMSUdOPUNFTlRFUj53YW40PC9URD48L1RSPgorCQk8VFI+PFREIEFMSUdOPUNFTlRFUj42PC9URD4JCTxURCBBTElHTj1DRU5URVI+V0FOPC9URD4JCTxURCBBTElHTj1DRU5URVI+d2FuNTwvVEQ+PC9UUj4KKwkJPFRSPjxURCBBTElHTj1DRU5URVI+NzwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPldBTjwvVEQ+CQk8VEQgQUxJR049Q0VOVEVSPndhbjY8L1REPjwvVFI+CisJCTxUUj48VEQgQUxJR049Q0VOVEVSPjg8L1REPgkJPFREIEFMSUdOPUNFTlRFUj5XQU48L1REPgkJPFREIEFMSUdOPUNFTlRFUj53YW43PC9URD48L1RSPgorCQk8VFI+PFREIEFMSUdOPUNFTlRFUj45PC9URD4JCTxURCBBTElHTj1DRU5URVI+RXRoZXJuZXQ8L1REPgk8VEQgQUxJR049Q0VOVEVSPmV0aDA8L1REPjwvVFI+CisJCTxUUj48VEQgQUxJR049Q0VOVEVSPjEwPC9URD4JPFREIEFMSUdOPUNFTlRFUj5FdGhlcm5ldDwvVEQ+CTxURCBBTElHTj1DRU5URVI+ZXRoMTwvVEQ+PC9UUj4KKwk8L1RBQkxFPgorCTwvQ0VOVEVSPgorPC9VTD4KKworPEgzPlBhY2tldCBUcmFjZSBEYXRhIEZvcm1hdDwvSDM+Cis8VUw+CisJVGhlIGZvcm1hdCBvZiB0aGUgdHJhY2UgZGF0YSB0aGF0IGlzIHNlbnQgdG8gdGhlIFNNUCBmb2xsb3dzIGEgcG9ydGlvbiBvZiB0aGUgbGlicGNhcCBmaWxlIGZvcm1hdAorCWFuZCBpcyBzdW1tYXJpemVkIGhlcmUuICBUaGlzIGZvcm1hdCBzcGVjaWZpZXMgdGhlIGdlbmVyaWMgcmVxdWlyZW1lbnRzIG5lZWRlZCB0bworCWJlIGFibGUgdG8gZGVjb2RlIHBhY2tldHMsIGJ1dCBkb2VzIG5vdCBjb3ZlciBBQ04gc3BlY2lmaWNzIHN1Y2ggYXMgY3VzdG9tIE1BQyBhZGRyZXNzaW5nCisJYW5kIFdBTiBwcm90b2NvbCBzdXBwb3J0LgorCTxQPgorCisJQWx0aG91Z2ggYSBsaWJwY2FwIGZpbGUgYmVnaW5zIHdpdGggYSBnbG9iYWwgaGVhZGVyIGZvbGxvd2VkIGJ5IHplcm8gb3IKKwltb3JlIHJlY29yZHMgZm9yIGVhY2ggY2FwdHVyZWQgcGFja2V0LCB0cmFjZSBkYXRhIHNlbnQgdG8gdGhlIFNNUCBkb2VzIE5PVCBiZWdpbiB3aXRoIGEgZ2xvYmFsIGhlYWRlci4KKwlBIHRyYWNlIHNlcXVlbmNlIGxvb2tzIGxpa2UgdGhpczoKKwk8UD4KKwk8VEFCTEU+CisJCTxUUj4KKyAgCQkJPFREIFNUWUxFPSJiYWNrZ3JvdW5kLWNvbG9yOiAjYzBGRmMwIj4mbmJzcDtbUGFja2V0IEhlYWRlcl0mbmJzcDs8L1REPgorICAJCQk8VEQgU1RZTEU9ImJhY2tncm91bmQtY29sb3I6ICNjMEZGYzAiPiZuYnNwO1tQYWNrZXQgRGF0YV0mbmJzcDs8L1REPgorICAJCQk8VEQgU1RZTEU9ImJhY2tncm91bmQtY29sb3I6ICNjMGMwRkYiPiZuYnNwO1tQYWNrZXQgSGVhZGVyXSZuYnNwOzwvVEQ+CisgIAkJCTxURCBTVFlMRT0iYmFja2dyb3VuZC1jb2xvcjogI2MwYzBGRiI+Jm5ic3A7W1BhY2tldCBEYXRhXSZuYnNwOzwvVEQ+CisgIAkJCTxURCBTVFlMRT0iYmFja2dyb3VuZC1jb2xvcjogI2UwYzBjMCI+Jm5ic3A7W1BhY2tldCBIZWFkZXJdJm5ic3A7PC9URD4KKyAgCQkJPFREIFNUWUxFPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZTBjMGMwIj4mbmJzcDtbUGFja2V0IERhdGFdJm5ic3A7PC9URD4KKyAgCQkJPFREPi4uLjwvVEQ+CisJCTwvVFI+CisJPC9UQUJMRT4KKworPEg0PlBhY2tldCBIZWFkZXI8L0g0PgorCTxVTD4KKwkJRWFjaCBjYXB0dXJlZCBwYWNrZXQgc3RhcnRzIHdpdGggYSBoZWFkZXIgdGhhdCBjb250YWlucyB0aGUgZm9sbG93aW5nIHZhbHVlcworCQkoaW4gbmV0d29yayBuZXV0cmFsIG9yZGVyKToKKworCQk8Rk9OVCBTSVpFPS0xPgorCQk8UFJFPgorIHVpbnQzMiB0dl9zZWM7ICAvKiB0aW1lc3RhbXAgc2Vjb25kcyAqLworIHVpbnQzMiB0dl91c2VjOyAvKiB0aW1lc3RhbXAgbWljcm9zZWNvbmRzICovCisgdWludDMyIGNhcGxlbjsgIC8qIG51bWJlciBvZiBvY3RldHMgaW4gdGhlIGZvbGxvd2luZyBwYWNrZXQgKi8KKyB1aW50MzIgbGVuOyAgICAgLyogb3JpZ2luYWwgbGVuZ3RoIG9mIHBhY2tldCBvbiB0aGUgd2lyZSAqLworCQk8L1BSRT4KKwkJPC9GT05UPgorCisJCTxUQUJMRSBCT1JERVI9MSBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTM+CisJCQk8VFI+CisJCQkJPFREIFZBTElHTj1UT1A+dHZfc2VjPC9URD4KKwkJCQk8VEQ+VGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIHBhY2tldCB3YXMgY2FwdHVyZWQuCisJCQkJCVRoaXMgdmFsdWUgaXMgaW4gc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEsIDE5NzAgMDA6MDA6MDAgR01UOworCQkJCQl0aGlzIGlzIGFsc28ga25vd24gYXMgYSBVTipYIHRpbWVfdC4gWW91IGNhbiB1c2UgdGhlIEFOU0kgQworCQkJCQk8ZW0+dGltZSgpPC9lbT4gZnVuY3Rpb24gZnJvbSA8ZW0+dGltZS5oPC9lbT4gdG8gZ2V0IHRoaXMgdmFsdWUsCisJCQkJCWJ1dCB5b3UgbWlnaHQgdXNlIGEgbW9yZSBvcHRpbWl6ZWQgd2F5IHRvIGdldCB0aGlzIHRpbWVzdGFtcCB2YWx1ZS4KKwkJCQkJSWYgdGhpcyB0aW1lc3RhbXAgaXNuJ3QgYmFzZWQgb24gR01UIChVVEMpLCB1c2UgPGVtPnRoaXN6b25lPC9lbT4KKwkJCQkJZnJvbSB0aGUgZ2xvYmFsIGhlYWRlciBmb3IgYWRqdXN0bWVudHMuPC9URD4KKwkJCTwvVFI+CisJCQk8VFI+CisJCQkJPFREIFZBTElHTj1UT1A+dHZfdXNlYzwvVEQ+CisJCQkJPFREPlRoZSBtaWNyb3NlY29uZHMgd2hlbiB0aGlzIHBhY2tldCB3YXMgY2FwdHVyZWQsIGFzIGFuIG9mZnNldCB0byA8ZW0+dHNfc2VjPC9lbT4uCisJCQkJCTxCPkJld2FyZTogPC9CPnRoaXMgdmFsdWUgbXVzdCBuZXZlciByZWFjaCAxIHNlY29uZCAoMSwwMDAsMDAwKSwKKwkJCQkJaW4gdGhpcyBjYXNlIDxlbT50c19zZWM8L2VtPiBtdXN0IGJlIGluY3JlYXNlZCBpbnN0ZWFkITwvVEQ+CisJCQk8L1RSPgorCQkJPFRSPgorCQkJCTxURCBWQUxJR049VE9QPmNhcGxlbjwvVEQ+CisJCQkJPFREPlRoZSBudW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgcHJvdmlkZWQgaW4gdGhlIGNhcHR1cmUgcmVjb3JkLgorCQkJCQlUaGlzIHZhbHVlIHNob3VsZCBuZXZlciBiZWNvbWUgbGFyZ2VyIHRoYW4gPGVtPmxlbjwvZW0+IG9yIHRoZQorCQkJCQk8ZW0+c25hcGxlbjwvZW0+IHZhbHVlIHNwZWNpZmllZCBkdXJpbmcgdGhlIGNhcHR1cmUuPC9URD4KKwkJCTwvVFI+CisJCQk8VFI+CisJCQkJPFREIFZBTElHTj1UT1A+bGVuPC9URD4KKwkJCQk8VEQ+VGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0ICJvbiB0aGUgd2lyZSIgd2hlbiBpdCB3YXMgY2FwdHVyZWQuCisJCQkJCUlmIDxlbT5jYXBsZW48L2VtPiBhbmQgPGVtPmxlbjwvZW0+IGRpZmZlciwgdGhlIGFjdHVhbGx5CisJCQkJCXNhdmVkIHBhY2tldCBzaXplIHdhcyBsaW1pdGVkIGJ5IHRoZSB2YWx1ZSBvZiA8ZW0+c25hcGxlbjwvZW0+IHNwZWNpZmllZAorCQkJCQlkdXJpbmcgb25lIG9mIHRoZSBjYXB0dXJlIGRpcmVjdGl2ZXMgc3VjaCBhcyBwY2FwX2Rpc3BhdGNoKCkuPC9URD4KKwkJCTwvVFI+CisJCTwvVEFCTEU+CisJPC9VTD4KKworPEg0PlBhY2tldCBEYXRhPC9IND4KKwk8VUw+CisJVGhlIGFjdHVhbCBwYWNrZXQgZGF0YSB3aWxsIGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgcGFja2V0IGhlYWRlciBhcyBhIHNlcXVlbmNlIG9mIDxlbT5jYXBsZW48L2VtPiBvY3RldHMuCisJRGVwZW5kaW5nIG9uIHRoZSBETFQgZW5jb2RpbmcgbnVtYmVyIGFzc2lnbmVkIHRvIHRoZSBpbnRlcmZhY2UsIHRoZSBwYWNrZXQgZGF0YSB3aWxsIGNvbnRhaW4gYW4gYWRkaXRpb25hbAorCWN1c3RvbSBoZWFkZXIgdXNlZCB0byBjb252ZXkgV0FOIHBvcnQgcmVsYXRlZCBpbmZvcm1hdGlvbi4KKwk8L1VMPgorCis8SDQ+QUNOIEN1c3RvbSBQYWNrZXQgSGVhZGVyPC9IND4KKwk8VUw+CisJUENBUCwgV2lyZXNoYXJrIGFuZCBUY3BkdW1wIGVuaGFuY2VtZW50cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIEFDTiB0byBzdXBwb3J0CisJbW9uaXRvcmluZyBvZiBpdHMgcG9ydHMsIGhvd2V2ZXIgZWFjaCBvZiB0aGVzZSBmYWNpbGl0aWVzIHdlcmUgZm9jdXNlZCBvbiBjYXB0dXJpbmcKKwlhbmQgZGlzcGxheWluZyB0cmFmZmljIGZyb20gTEFOIGludGVyZmFjZXMuICBUaGUgU0lUQSBleHRlbnRpb25zIHRvIHRoZXNlIGZhY2lsaXRpZXMKKwlhcmUgdXNlZCB0byBhbHNvIHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8gY2FwdHVyZSwgZmlsdGVyLCBhbmQgZGlzcGxheSBpbmZvcm1hdGlvbiBmcm9tCisJYW4gQUNOJ3MgV0FOIHBvcnRzLgorCTxQPgorCUFsdGhvdWdoIGVhY2ggcGFja2V0IGZvbGxvd3MgdGhlIHN0YW5kYXJkIGxpYnBjYXAgZm9ybWF0LCBzaW5jZSB0aGVyZSBhcmUKKwl0d28gdHlwZXMgb2YgaW50ZXJmYWNlcyB0aGF0IGNhbiBiZSBtb25pdG9yZWQsIHRoZSBmb3JtYXQgb2YgdGhlIGRhdGEKKwlwYWNrZXQgdmFyaWVzIHNsaWdodGx5LgorCTxQPgorCTxVTCBUWVBFPURJU0M+CisJCTxMST5Gb3IgRXRoZXJuZXQgKGxpa2UpIGRldmljZXMsIHRoZSBwYWNrZXQgZm9ybWF0IGlzIHVuY2hhbmdlZCBmcm9tIHRoZSBzdGFuZGFyZCBQY2FwIGZvcm1hdC4KKwkJPExJPkZvciBXQU4gZGV2aWNlcywgdGhlIHBhY2tldCBjb250YWlucyBhIDUgYnl0ZSBoZWFkZXIgdGhhdCBwcmVjZWVkcyB0aGUgYWN0dWFsIGNhcHR1cmVkIGRhdGEKKwkJCWRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIHRhYmxlOgorCTwvVUw+CisJPFA+CisJPENFTlRFUj4KKwk8VEFCTEUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0zPgorCTxUUj4JPFRIPk9jdGV0PC9USD4KKwkJCTxUSD5OYW1lPC9USD4KKwkJCTxUSD5NYXNrL1ZhbHVlPC9USD4KKwkJCTxUSCBDT0xTUEFOPTI+RGVmaW5pdGlvbjwvVEg+CQk8L1RSPgorCisJPFRSPgk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgUk9XU1BBTj0zPjA8L1RIPgorCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIFJPV1NQQU49Mz5Db250cm9sIC8gU3RhdHVzPC9USD4KKworCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHh4eHgwPC9GT05UPjwvVEQ+CisJCQk8VEQ+VHJhbnNtaXR0ZWQgYnkgY2FwdHVyZSBkZXZpY2U8L1REPgorCQkJPFREIFJPV1NQQU49MiBBTElHTj1DRU5URVI+KHNlZSAnRXJyb3JzJyBvY3RldHMpPC9URD4JCQkJCQkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4eHh4MTwvRk9OVD48L1REPgorCQkJPFREPlJlY2VpdmVkIGJ5IGNhcHR1cmUgZGV2aWNlPC9URD4JCQkJCQkJCQkJCQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPjF4eHh4eHh4PC9GT05UPjwvVEQ+CisJCQk8VEQgQ09MU1BBTj0yPk5vIGJ1ZmZlciB3YXMgYXZhaWxhYmxlIGR1cmluZyBjYXB0dXJlIG9mIHByZXZpb3VzIHBhY2tldC48L1REPgk8L1RSPgorCisJPFRSPgk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgUk9XU1BBTj04PjE8L1RIPgorCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIFJPV1NQQU49OD5TaWduYWxzPC9USD4KKworCQkJPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHh4eHgxPC9GT05UPjwvVEQ+CTxURCBDT0xTUEFOPTI+RFNSIGFzc2VydGVkPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eHh4MXg8L0ZPTlQ+PC9URD4JPFREIENPTFNQQU49Mj5EVFIgYXNzZXJ0ZWQ8L1REPgkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4eDF4eDwvRk9OVD48L1REPgk8VEQgQ09MU1BBTj0yPkNUUyBhc3NlcnRlZDwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHgxeHh4PC9GT05UPjwvVEQ+CTxURCBDT0xTUEFOPTI+UlRTIGFzc2VydGVkPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4MXh4eHg8L0ZPTlQ+PC9URD4JPFREIENPTFNQQU49Mj5EQ0QgYXNzZXJ0ZWQ8L1REPgkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eDF4eHh4eDwvRk9OVD48L1REPgk8VEQgQ09MU1BBTj0yPlVuZGVmaW5lZDwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPngxeHh4eHh4PC9GT05UPjwvVEQ+CTxURCBDT0xTUEFOPTI+VW5kZWZpbmVkPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+MXh4eHh4eHg8L0ZPTlQ+PC9URD4JPFREIENPTFNQQU49Mj5VbmRlZmluZWQ8L1REPgkJPC9UUj4KKworCTxUUj4JPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIFJPV1NQQU49OT4yPC9USD4KKwkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUiBST1dTUEFOPTk+RXJyb3JzPEJSPihvY3RldCAxKTwvVEg+CisKKwkJCTxUSD4mbmJzcDs8L1RIPgkJCQkJCQkJCQkJCQkJCTxUSD5UeDwvVEg+CQkJCQkJPFRIPlJ4PC9USD4JCQkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4eHh4MTwvRk9OVD48L1REPgk8VEQ+VW5kZXJydW48L1REPgkJCQk8VEQ+RnJhbWluZzwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHh4eDF4PC9GT05UPjwvVEQ+CTxURD5DVFMgTG9zdDwvVEQ+CQkJCTxURD5QYXJpdHk8L1REPgkJCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eHgxeHg8L0ZPTlQ+PC9URD4JPFREPlVBUlQgRXJyb3I8L1REPgkJCQk8VEQ+Q29sbGlzaW9uPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eDF4eHg8L0ZPTlQ+PC9URD4JPFREPlJlLVR4IExpbWl0IFJlYWNoZWQ8L1REPgk8VEQ+TG9uZyBGcmFtZTwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eDF4eHh4PC9GT05UPjwvVEQ+CTxURD5VbmRlZmluZWQ8L1REPgkJCQk8VEQ+U2hvcnQgRnJhbWU8L1REPgk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4MXh4eHh4PC9GT05UPjwvVEQ+CTxURD5VbmRlZmluZWQ8L1REPgkJCQk8VEQ+VW5kZWZpbmVkPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eDF4eHh4eHg8L0ZPTlQ+PC9URD4JPFREPlVuZGVmaW5lZDwvVEQ+CQkJCTxURD5VbmRlZmluZWQ8L1REPgkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj4xeHh4eHh4eDwvRk9OVD48L1REPgk8VEQ+VW5kZWZpbmVkPC9URD4JCQkJPFREPlVuZGVmaW5lZDwvVEQ+CQk8L1RSPgorCisJPFRSPgk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgUk9XU1BBTj05PjM8L1RIPgorCQkJPFRIIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSIFJPV1NQQU49OT5FcnJvcnM8QlI+KG9jdGV0IDIpPC9USD4KKworCQkJPFRIPiZuYnNwOzwvVEg+CQkJCQkJCQkJCQkJCQkJPFRIPlR4PC9USD4JCQk8VEg+Ung8L1RIPgkJCQkJCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eHh4eDE8L0ZPTlQ+PC9URD4JPFREPlVuZGVmaW5lZDwvVEQ+CTxURD5Ob24tT2N0ZXQgQWxpZ25lZDwvVEQ+CQk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPnh4eHh4eDF4PC9GT05UPjwvVEQ+CTxURD5VbmRlZmluZWQ8L1REPgk8VEQ+QWJvcnQgUmVjZWl2ZWQ8L1REPgkJCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4eHgxeHg8L0ZPTlQ+PC9URD4JPFREPlVuZGVmaW5lZDwvVEQ+CTxURD5DRCBMb3N0PC9URD4JCQkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eHh4MXh4eDwvRk9OVD48L1REPgk8VEQ+VW5kZWZpbmVkPC9URD4JPFREPkRpZ2l0YWwgUExMIEVycm9yPC9URD4JCTwvVFI+CisJPFRSPgk8VEQgVkFMSUdOPVRPUCBBTElHTj1DRU5URVI+PEZPTlQgRkFDRT0iQ09VUklFUiI+eHh4MXh4eHg8L0ZPTlQ+PC9URD4JPFREPlVuZGVmaW5lZDwvVEQ+CTxURD5PdmVycnVuPC9URD4JCQkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj54eDF4eHh4eDwvRk9OVD48L1REPgk8VEQ+VW5kZWZpbmVkPC9URD4JPFREPkZyYW1lIExlbmd0aCBWaW9sYXRpb248L1REPgk8L1RSPgorCTxUUj4JPFREIFZBTElHTj1UT1AgQUxJR049Q0VOVEVSPjxGT05UIEZBQ0U9IkNPVVJJRVIiPngxeHh4eHh4PC9GT05UPjwvVEQ+CTxURD5VbmRlZmluZWQ8L1REPgk8VEQ+Q1JDIEVycm9yPC9URD4JCQkJPC9UUj4KKwk8VFI+CTxURCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj48Rk9OVCBGQUNFPSJDT1VSSUVSIj4xeHh4eHh4eDwvRk9OVD48L1REPgk8VEQ+VW5kZWZpbmVkPC9URD4JPFREPkJyZWFrIFJlY2VpdmVkPC9URD4JCQk8L1RSPgorCisJPFRSPgk8VEggVkFMSUdOPVRPUCBBTElHTj1DRU5URVIgUk9XU1BBTj0xMj40PC9USD4KKwkJCTxUSCBWQUxJR049VE9QIEFMSUdOPUNFTlRFUj5Qcm90b2NvbDwvVEg+CisKKwkJCTxURCBDT0xTUEFOPTM+CisJCQkJPENFTlRFUj4KKwkJCQk8VEFCTEUgQk9SREVSPTAgQ0VMTFBBRERJTkc9MCBDRUxMU1BBQ0lORz0wPgorCQkJCQk8VFIgVkFMSUdOPUJPVFRPTT48VEQgQUxJR049Q0VOVEVSPjB4MDE8L1REPgk8VEQ+LTwvVEQ+CTxURD5MQVBCIChCT1ApCQkJCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgwMjwvVEQ+CTxURD4tPC9URD4JPFREPkV0aGVybmV0CQkJCTxTVVA+MTwvU1VQPgkJPC9URD4JPC9UUj4KKwkJCQkJPFRSIFZBTElHTj1CT1RUT00+PFREIEFMSUdOPUNFTlRFUj4weDAzPC9URD4JPFREPi08L1REPgk8VEQ+QXN5bmMgKEludGVycnVwdCBJTykJPFNVUD4mbmJzcDs8L1NVUD4JPC9URD4JPC9UUj4KKwkJCQkJPFRSIFZBTElHTj1CT1RUT00+PFREIEFMSUdOPUNFTlRFUj4weDA0PC9URD4JPFREPi08L1REPgk8VEQ+QXN5bmMgKEJsb2NrIElPKQkJPFNVUD4mbmJzcDs8L1NVUD4JPC9URD4JPC9UUj4KKwkJCQkJPFRSIFZBTElHTj1CT1RUT00+PFREIEFMSUdOPUNFTlRFUj4weDA1PC9URD4JPFREPi08L1REPgk8VEQ+SVBBUlMJCQkJCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgwNjwvVEQ+CTxURD4tPC9URD4JPFREPlVUUwkJCQkJCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgwNzwvVEQ+CTxURD4tPC9URD4JPFREPlBQUCAoSERMQykJCQkJPFNVUD4mbmJzcDs8L1NVUD4JPC9URD4JPC9UUj4KKwkJCQkJPFRSIFZBTElHTj1CT1RUT00+PFREIEFMSUdOPUNFTlRFUj4weDA4PC9URD4JPFREPi08L1REPgk8VEQ+U0RMQwkJCQkJPFNVUD4mbmJzcDs8L1NVUD4JPC9URD4JPC9UUj4KKwkJCQkJPFRSIFZBTElHTj1CT1RUT00+PFREIEFMSUdOPUNFTlRFUj4weDA5PC9URD4JPFREPi08L1REPgk8VEQ+VG9rZW4gUmluZwkJCQk8U1VQPjE8L1NVUD4JCTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgxMDwvVEQ+CTxURD4tPC9URD4JPFREPkkyQwkJCQkJCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgxMTwvVEQ+CTxURD4tPC9URD4JPFREPkRQTSBMaW5rCQkJCTxTVVA+Jm5ic3A7PC9TVVA+CTwvVEQ+CTwvVFI+CisJCQkJCTxUUiBWQUxJR049Qk9UVE9NPjxURCBBTElHTj1DRU5URVI+MHgxMjwvVEQ+CTxURD4tPC9URD4JPFREPkZyYW1lIFJlbGF5IChCT1ApCQk8U1VQPiZuYnNwOzwvU1VQPgk8L1REPgk8L1RSPgorCQkJCTwvVEFCTEU+CisJCQkJPC9DRU5URVI+CisJCQkJPFA+CisJCQkJPFNUUk9ORz5Ob3RlIDE6PC9TVFJPTkc+CisJCQkJRXRoZXJuZXQgYW5kIFRva2VuIFJpbmcgZnJhbWVzIHdpbGwgbmV2ZXIgYmUgc2VudCBhcyBETFRfU0lUQSAod2l0aCB0aGUgNSBvY3RldCBoZWFkZXIpLAorCQkJCWJ1dCB3aWxsIGJlIHNlbnQgYXMgdGhlaXIgY29ycmVzcG9uZGluZyBETFQgdHlwZXMgaW5zdGVhZC4KKwkJCTwvVEQ+CisJPC9UUj4KKwk8L1RBQkxFPgorCTwvQ0VOVEVSPgorPC9VTD4KKzxQPgorPC9VTD4KKzwvVUw+CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtc25mLmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtc25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3ODFiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1zbmYuYwpAQCAtMCwwICsxLDMwNiBAQAorI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJzbmYuaCIKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaWZkZWYgU05GX09OTFkKKyNkZWZpbmUgc25mX2NyZWF0ZSBwY2FwX2NyZWF0ZQorI2RlZmluZSBzbmZfcGxhdGZvcm1fZmluZGRldnMgcGNhcF9wbGF0Zm9ybV9maW5kZGV2cworI2VuZGlmCisKK3N0YXRpYyBpbnQKK3NuZl9zZXRfZGF0YWxpbmsocGNhcF90ICpwLCBpbnQgZGx0KQoreworCXAtPmxpbmt0eXBlID0gZGx0OworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3NuZl9wY2FwX3N0YXRzKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCit7CisJc3RydWN0IHNuZl9yaW5nX3N0YXRzIHN0YXRzOworCWludCByYzsKKworCWlmICgocmMgPSBzbmZfcmluZ19nZXRzdGF0cyhwLT5tZC5zbmZfcmluZywgJnN0YXRzKSkpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic25mX2dldF9zdGF0czogJXMiLAorCQkJIHBjYXBfc3RyZXJyb3IocmMpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcy0+cHNfcmVjdiA9IHN0YXRzLnJpbmdfcGt0X3JlY3YgKyBzdGF0cy5yaW5nX3BrdF9vdmVyZmxvdzsKKwlwcy0+cHNfZHJvcCA9IHN0YXRzLnJpbmdfcGt0X292ZXJmbG93OworCXBzLT5wc19pZmRyb3AgPSBzdGF0cy5uaWNfcGt0X292ZXJmbG93ICsgc3RhdHMubmljX3BrdF9iYWQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitzbmZfcGxhdGZvcm1fY2xlYW51cChwY2FwX3QgKnApCit7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc25mX3JpbmdfY2xvc2UocC0+bWQuc25mX3JpbmcpOworCXNuZl9jbG9zZShwLT5tZC5zbmZfaGFuZGxlKTsKKwlwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocCk7Cit9CisKK3N0YXRpYyBpbnQKK3NuZl9nZXRub25ibG9jayhwY2FwX3QgKnAsIGNoYXIgKmVycmJ1ZikKK3sKKwlyZXR1cm4gKHAtPm1kLnNuZl90aW1lb3V0ID09IDApOworfQorCitzdGF0aWMgaW50CitzbmZfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1ZikKK3sKKwlpZiAobm9uYmxvY2spCisJCXAtPm1kLnNuZl90aW1lb3V0ID0gMDsKKwllbHNlIHsKKwkJaWYgKHAtPm1kLnRpbWVvdXQgPD0gMCkKKwkJCXAtPm1kLnNuZl90aW1lb3V0ID0gLTE7IC8qIGZvcmV2ZXIgKi8KKwkJZWxzZQorCQkJcC0+bWQuc25mX3RpbWVvdXQgPSBwLT5tZC50aW1lb3V0OworCX0KKwlyZXR1cm4gKDApOworfQorCisjZGVmaW5lIF9OU0VDX1BFUl9TRUMgMTAwMDAwMDAwMAorCitzdGF0aWMgaW5saW5lCitzdHJ1Y3QgdGltZXZhbAorc25mX3RpbWVzdGFtcF90b190aW1ldmFsKGNvbnN0IGludDY0X3QgdHNfbmFub3NlYykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQzMl90IHJlbTsKKwlpZiAodHNfbmFub3NlYyA9PSAwKQorCQlyZXR1cm4gKHN0cnVjdCB0aW1ldmFsKSB7IDAsIDAgfTsKKwl0di50dl9zZWMgPSB0c19uYW5vc2VjIC8gX05TRUNfUEVSX1NFQzsKKwl0di50dl91c2VjID0gKHRzX25hbm9zZWMgJSBfTlNFQ19QRVJfU0VDKSAvIDEwMDA7CisJcmV0dXJuIHR2OworfQorCitzdGF0aWMgaW50CitzbmZfcmVhZChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBwY2FwX3BrdGhkciBoZHI7CisJaW50IGksIGZsYWdzLCBlcnIsIGNhcGxlbiwgbjsKKwlzdHJ1Y3Qgc25mX3JlY3ZfcmVxIHJlcTsKKworCWlmICghcCB8fCBjbnQgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJbiA9IDA7CisJd2hpbGUgKG4gPCBjbnQgfHwgY250IDwgMCkgeworCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKi8KKwkJaWYgKHAtPmJyZWFrX2xvb3ApIHsKKwkJCWlmIChuID09IDApIHsKKwkJCQlwLT5icmVha19sb29wID0gMDsKKwkJCQlyZXR1cm4gKC0yKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dXJuIChuKTsKKwkJCX0KKwkJfQorCisJCWVyciA9IHNuZl9yaW5nX3JlY3YocC0+bWQuc25mX3JpbmcsIHAtPm1kLnNuZl90aW1lb3V0LCAmcmVxKTsKKworCQlpZiAoZXJyKSB7CisJCQlpZiAoZXJyID09IEVCVVNZIHx8IGVyciA9PSBFQUdBSU4pCisJCQkJcmV0dXJuICgwKTsKKwkJCWlmIChlcnIgPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlpZiAoZXJyICE9IDApIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzbmZfcmVhZDogJXMiLAorCQkJCSAJIHBjYXBfc3RyZXJyb3IoZXJyKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisKKwkJY2FwbGVuID0gcmVxLmxlbmd0aDsKKwkJaWYgKGNhcGxlbiA+IHAtPnNuYXBzaG90KQorCQkJY2FwbGVuID0gcC0+c25hcHNob3Q7CisKKwkJaWYgKChwLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMKSB8fAorCQkgICAgIGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIHJlcS5wa3RfYWRkciwgcmVxLmxlbmd0aCwgY2FwbGVuKSkgeworCQkJaGRyLnRzID0gc25mX3RpbWVzdGFtcF90b190aW1ldmFsKHJlcS50aW1lc3RhbXApOworCQkJaGRyLmNhcGxlbiA9IGNhcGxlbjsKKwkJCWhkci5sZW4gPSByZXEubGVuZ3RoOworCQkJY2FsbGJhY2sodXNlciwgJmhkciwgcmVxLnBrdF9hZGRyKTsKKwkJfQorCQluKys7CisJfQorCXJldHVybiAobik7Cit9CisKK3N0YXRpYyBpbnQKK3NuZl9zZXRmaWx0ZXIocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQoreworCWlmICghcCkKKwkJcmV0dXJuIC0xOworCWlmICghZnApIHsKKwkJc3RybmNweShwLT5lcnJidWYsICJzZXRmaWx0ZXI6IE5vIGZpbHRlciBzcGVjaWZpZWQiLAorCQkJc2l6ZW9mKHAtPmVycmJ1ZikpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogTWFrZSBvdXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBmaWx0ZXIgKi8KKworCWlmIChpbnN0YWxsX2JwZl9wcm9ncmFtKHAsIGZwKSA8IDApCisJCXJldHVybiAtMTsKKworCXAtPm1kLnVzZV9icGYgPSAwOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorc25mX2luamVjdChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1ZiBfVV8sIHNpemVfdCBzaXplIF9VXykKK3sKKwlzdHJsY3B5KHAtPmVycmJ1ZiwgIlNlbmRpbmcgcGFja2V0cyBpc24ndCBzdXBwb3J0ZWQgd2l0aCBzbmYiLAorCSAgICBQQ0FQX0VSUkJVRl9TSVpFKTsKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludAorc25mX2FjdGl2YXRlKHBjYXBfdCogcCkKK3sKKwljaGFyICpkZXZpY2UgPSBwLT5vcHQuc291cmNlOworCWNvbnN0IGNoYXIgKm5yID0gTlVMTDsKKwlpbnQgZXJyOworCWludCBmbGFncyA9IDA7CisKKwlpZiAoZGV2aWNlID09IE5VTEwpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICJkZXZpY2UgaXMgTlVMTDogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBJbiBMaWJwY2FwLCB3ZSBzZXQgcHNoYXJlZCBieSBkZWZhdWx0IGlmIE5VTV9SSU5HUyBpcyBzZXQgdG8gPiAxLgorCSAqIFNpbmNlIGxpYnBjYXAgaXNuJ3QgdGhyZWFkLXNhZmUgKi8KKwlpZiAoKG5yID0gZ2V0ZW52KCJTTkZfTlVNX1JJTkdTIikpICYmICpuciAmJiBhdG9pKG5yKSA+IDEpCisJCWZsYWdzIHw9IFNORl9GX1BTSEFSRUQ7CisJZWxzZQorCQluciA9IE5VTEw7CisKKwllcnIgPSBzbmZfb3BlbihwLT5tZC5zbmZfYm9hcmRudW0sCisJCQkwLCAvKiBsZXQgU05GIEFQSSBwYXJzZSBTTkZfTlVNX1JJTkdTLCBpZiBzZXQgKi8KKwkJCU5VTEwsIC8qIGRlZmF1bHQgUlNTLCBvciB1c2UgU05GX1JTU19GTEFHUyBlbnYgKi8KKwkJCTAsIC8qIGRlZmF1bHQgdG8gU05GX0RBVEFSSU5HX1NJWkUgZnJvbSBlbnYgKi8KKwkJCWZsYWdzLCAvKiBtYXkgd2FudCBwc2hhcmVkICovCisJCQkmcC0+bWQuc25mX2hhbmRsZSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAic25mX29wZW4gZmFpbGVkOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJyKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwllcnIgPSBzbmZfcmluZ19vcGVuKHAtPm1kLnNuZl9oYW5kbGUsICZwLT5tZC5zbmZfcmluZyk7CisJaWYgKGVyciAhPSAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAic25mX3Jpbmdfb3BlbiBmYWlsZWQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnIpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChwLT5tZC50aW1lb3V0IDw9IDApCisJCXAtPm1kLnNuZl90aW1lb3V0ID0gLTE7CisJZWxzZQorCQlwLT5tZC5zbmZfdGltZW91dCA9IHAtPm1kLnRpbWVvdXQ7CisKKwllcnIgPSBzbmZfc3RhcnQocC0+bWQuc25mX2hhbmRsZSk7CisJaWYgKGVyciAhPSAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAic25mX3N0YXJ0IGZhaWxlZDogJXMiLCBwY2FwX3N0cmVycm9yKGVycikpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiAic2VsZWN0KCkiIGFuZCAicG9sbCgpIiBkb24ndCB3b3JrIG9uIHNuZiBkZXNjcmlwdG9ycy4KKwkgKi8KKwlwLT5zZWxlY3RhYmxlX2ZkID0gLTE7CisJcC0+bGlua3R5cGUgPSBETFRfRU4xME1COworCXAtPnJlYWRfb3AgPSBzbmZfcmVhZDsKKwlwLT5pbmplY3Rfb3AgPSBzbmZfaW5qZWN0OworCXAtPnNldGZpbHRlcl9vcCA9IHNuZl9zZXRmaWx0ZXI7CisJcC0+c2V0ZGlyZWN0aW9uX29wID0gTlVMTDsgLyogTm90IGltcGxlbWVudGVkLiovCisJcC0+c2V0X2RhdGFsaW5rX29wID0gc25mX3NldF9kYXRhbGluazsKKwlwLT5nZXRub25ibG9ja19vcCA9IHNuZl9nZXRub25ibG9jazsKKwlwLT5zZXRub25ibG9ja19vcCA9IHNuZl9zZXRub25ibG9jazsKKwlwLT5zdGF0c19vcCA9IHNuZl9wY2FwX3N0YXRzOworCXAtPmNsZWFudXBfb3AgPSBzbmZfcGxhdGZvcm1fY2xlYW51cDsKKwlwLT5tZC5zdGF0LnBzX3JlY3YgPSAwOworCXAtPm1kLnN0YXQucHNfZHJvcCA9IDA7CisJcC0+bWQuc3RhdC5wc19pZmRyb3AgPSAwOworCXJldHVybiAwOworfQorCitpbnQKK3NuZl9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKQoreworCS8qCisJICogVGhlcmUgYXJlIG5vIHBsYXRmb3JtLXNwZWNpZmljIGRldmljZXMgc2luY2UgZWFjaCBkZXZpY2UKKwkgKiBleGlzdHMgYXMgYSByZWd1bGFyIEV0aGVybmV0IGRldmljZS4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKworcGNhcF90ICoKK3NuZl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKwlpbnQgYm9hcmRudW0gPSAtMTsKKwlzdHJ1Y3Qgc25mX2lmYWRkcnMgKmlmYWRkcnMsICppZmE7CisJc2l6ZV90IGRldmxlbjsKKworCWlmIChzbmZfaW5pdChTTkZfVkVSU0lPTl9BUEkpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogTWF0Y2ggYSBnaXZlbiBpbnRlcmZhY2UgbmFtZSB0byBvdXIgbGlzdCBvZiBpbnRlcmZhY2UgbmFtZXMsIGZyb20KKwkgKiB3aGljaCB3ZSBjYW4gb2J0YWluIHRoZSBpbnRlbmRlZCBib2FyZCBudW1iZXIKKwkgKi8KKwlpZiAoc25mX2dldGlmYWRkcnMoJmlmYWRkcnMpIHx8IGlmYWRkcnMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJZGV2bGVuID0gc3RybGVuKGRldmljZSkgKyAxOworCWlmYSA9IGlmYWRkcnM7CisJd2hpbGUgKGlmYSkgeworCQlpZiAoIXN0cm5jbXAoZGV2aWNlLCBpZmEtPnNuZl9pZmFfbmFtZSwgZGV2bGVuKSkgeworCQkJYm9hcmRudW0gPSBpZmEtPnNuZl9pZmFfYm9hcmRudW07CisJCQlicmVhazsKKwkJfQorCQlpZmEgPSBpZmEtPnNuZl9pZmFfbmV4dDsKKwl9CisJc25mX2ZyZWVpZmFkZHJzKGlmYWRkcnMpOworCisJaWYgKGlmYSA9PSBOVUxMKSB7CisJCS8qCisJCSAqIElmIHdlIGNhbid0IGZpbmQgdGhlIGRldmljZSBieSBuYW1lLCBzdXBwb3J0IHRoZSBuYW1lICJzbmZYIgorCQkgKiBhbmQgInNuZjEwZ1giIHdoZXJlIFggaXMgdGhlIGJvYXJkIG51bWJlci4KKwkJICovCisJCWlmIChzc2NhbmYoZGV2aWNlLCAic25mMTBnJWQiLCAmYm9hcmRudW0pICE9IDEgJiYKKwkJICAgIHNzY2FuZihkZXZpY2UsICJzbmYlZCIsICZib2FyZG51bSkgIT0gMSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXAtPmFjdGl2YXRlX29wID0gc25mX2FjdGl2YXRlOworCXAtPm1kLnNuZl9ib2FyZG51bSA9IGJvYXJkbnVtOworCXJldHVybiBwOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLXNuZi5oIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNuZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTk3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtc25mLmgKQEAgLTAsMCArMSwyIEBACitwY2FwX3QgKnNuZl9jcmVhdGUoY29uc3QgY2hhciAqLCBjaGFyICopOworaW50IHNuZl9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKipkZXZsaXN0cCwgY2hhciAqZXJyYnVmKTsKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1zbml0LmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtc25pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMGM0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtc25pdC5jCkBAIC0wLDAgKzEsNDI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogTW9kaWZpY2F0aW9ucyBtYWRlIHRvIGFjY29tbW9kYXRlIHRoZSBuZXcgU3VuT1M0LjAgTklUIGZhY2lsaXR5IGJ5CisgKiBNaWNreSBMaXUsIG1pY2t5QGN1bml4Yy5jYy5jb2x1bWJpYS5lZHUsIENvbHVtYmlhIFVuaXZlcnNpdHkgaW4gTWF5LCAxOTg5LgorICogVGhpcyBtb2R1bGUgbm93IGhhbmRsZXMgdGhlIFNUUkVBTVMgYmFzZWQgTklULgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtc25pdC5jLHYgMS43NyAyMDA4LTA0LTE0IDIwOjQwOjU4IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZWIuaD4KKyNpbmNsdWRlIDxzeXMvZGlyLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsY29tLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3N0cm9wdHMuaD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldC9uaXQuaD4KKyNpbmNsdWRlIDxuZXQvbml0X2lmLmg+CisjaW5jbHVkZSA8bmV0L25pdF9wZi5oPgorI2luY2x1ZGUgPG5ldC9uaXRfYnVmLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvdWRwX3Zhci5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3BpcC5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaWZkZWYgSEFWRV9PU19QUk9UT19ICisjaW5jbHVkZSAib3MtcHJvdG8uaCIKKyNlbmRpZgorCisvKgorICogVGhlIGNodW5rIHNpemUgZm9yIE5JVC4gIFRoaXMgaXMgdGhlIGFtb3VudCBvZiBidWZmZXJpbmcKKyAqIGRvbmUgZm9yIHJlYWQgY2FsbHMuCisgKi8KKyNkZWZpbmUgQ0hVTktTSVpFICgyKjEwMjQpCisKKy8qCisgKiBUaGUgdG90YWwgYnVmZmVyIHNwYWNlIHVzZWQgYnkgTklULgorICovCisjZGVmaW5lIEJVRlNQQUNFICg0KkNIVU5LU0laRSkKKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyBpbnQgbml0X3NldGZsYWdzKGludCwgaW50LCBpbnQsIGNoYXIgKik7CisKK3N0YXRpYyBpbnQKK3BjYXBfc3RhdHNfc25pdChwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQoreworCisJLyoKKwkgKiAicHNfcmVjdiIgY291bnRzIHBhY2tldHMgaGFuZGVkIHRvIHRoZSBmaWx0ZXIsIG5vdCBwYWNrZXRzCisJICogdGhhdCBwYXNzZWQgdGhlIGZpbHRlci4gIEFzIGZpbHRlcmluZyBpcyBkb25lIGluIHVzZXJsYW5kLAorCSAqIHRoaXMgZG9lcyBub3QgaW5jbHVkZSBwYWNrZXRzIGRyb3BwZWQgYmVjYXVzZSB3ZSByYW4gb3V0CisJICogb2YgYnVmZmVyIHNwYWNlLgorCSAqCisJICogInBzX2Ryb3AiIGNvdW50cyBwYWNrZXRzIGRyb3BwZWQgaW5zaWRlIHRoZSAiL2Rldi9uaXQiCisJICogZGV2aWNlIGJlY2F1c2Ugb2YgZmxvdyBjb250cm9sIHJlcXVpcmVtZW50cyBvciByZXNvdXJjZQorCSAqIGV4aGF1c3Rpb247IGl0IGRvZXNuJ3QgY291bnQgcGFja2V0cyBkcm9wcGVkIGJ5IHRoZQorCSAqIGludGVyZmFjZSBkcml2ZXIsIG9yIHBhY2tldHMgZHJvcHBlZCB1cHN0cmVhbS4gIEFzIGZpbHRlcmluZworCSAqIGlzIGRvbmUgaW4gdXNlcmxhbmQsIGl0IGNvdW50cyBwYWNrZXRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorCSAqIHRoZXkgd291bGQndmUgcGFzc2VkIHRoZSBmaWx0ZXIuCisJICoKKwkgKiBUaGVzZSBzdGF0aXN0aWNzIGRvbid0IGluY2x1ZGUgcGFja2V0cyBub3QgeWV0IHJlYWQgZnJvbSB0aGUKKwkgKiBrZXJuZWwgYnkgbGlicGNhcCBvciBwYWNrZXRzIG5vdCB5ZXQgcmVhZCBmcm9tIGxpYnBjYXAgYnkgdGhlCisJICogYXBwbGljYXRpb24uCisJICovCisJKnBzID0gcC0+bWQuc3RhdDsKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwY2FwX3JlYWRfc25pdChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXJlZ2lzdGVyIGludCBjYywgbjsKKwlyZWdpc3RlciB1X2NoYXIgKmJwLCAqY3AsICplcDsKKwlyZWdpc3RlciBzdHJ1Y3Qgbml0X2J1ZmhkciAqaGRycDsKKwlyZWdpc3RlciBzdHJ1Y3Qgbml0X2lmdGltZSAqbnRwOworCXJlZ2lzdGVyIHN0cnVjdCBuaXRfaWZsZW4gKm5scDsKKwlyZWdpc3RlciBzdHJ1Y3Qgbml0X2lmZHJvcHMgKm5kcDsKKwlyZWdpc3RlciBpbnQgY2FwbGVuOworCisJY2MgPSBwLT5jYzsKKwlpZiAoY2MgPT0gMCkgeworCQljYyA9IHJlYWQocC0+ZmQsIChjaGFyICopcC0+YnVmZmVyLCBwLT5idWZzaXplKTsKKwkJaWYgKGNjIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVXT1VMREJMT0NLKQorCQkJCXJldHVybiAoMCk7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLCAicGNhcF9yZWFkOiAlcyIsCisJCQkJcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJYnAgPSBwLT5idWZmZXI7CisJfSBlbHNlCisJCWJwID0gcC0+YnA7CisKKwkvKgorCSAqIGxvb3AgdGhyb3VnaCBlYWNoIHNuYXBzaG90IGluIHRoZSBjaHVuaworCSAqLworCW4gPSAwOworCWVwID0gYnAgKyBjYzsKKwl3aGlsZSAoYnAgPCBlcCkgeworCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKiBJZiBzbywgcmV0dXJuIGltbWVkaWF0ZWx5IC0gaWYgd2UgaGF2ZW4ndCByZWFkIGFueQorCQkgKiBwYWNrZXRzLCBjbGVhciB0aGUgZmxhZyBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlCisJCSAqIHRoYXQgd2Ugd2VyZSB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgb3RoZXJ3aXNlCisJCSAqIGxlYXZlIHRoZSBmbGFnIHNldCwgc28gdGhhdCB0aGUgKm5leHQqIGNhbGwgd2lsbCBicmVhaworCQkgKiBvdXQgb2YgdGhlIGxvb3Agd2l0aG91dCBoYXZpbmcgcmVhZCBhbnkgcGFja2V0cywgYW5kCisJCSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UndmUgcHJvY2Vzc2VkIHNvIGZhci4KKwkJICovCisJCWlmIChwLT5icmVha19sb29wKSB7CisJCQlpZiAobiA9PSAwKSB7CisJCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQkJcmV0dXJuICgtMik7CisJCQl9IGVsc2UgeworCQkJCXAtPmJwID0gYnA7CisJCQkJcC0+Y2MgPSBlcCAtIGJwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKworCQkrK3AtPm1kLnN0YXQucHNfcmVjdjsKKwkJY3AgPSBicDsKKworCQkvKiBnZXQgcGFzdCBOSVQgYnVmZmVyICAqLworCQloZHJwID0gKHN0cnVjdCBuaXRfYnVmaGRyICopY3A7CisJCWNwICs9IHNpemVvZigqaGRycCk7CisKKwkJLyogZ2V0IHBhc3QgTklUIHRpbWVyICAgKi8KKwkJbnRwID0gKHN0cnVjdCBuaXRfaWZ0aW1lICopY3A7CisJCWNwICs9IHNpemVvZigqbnRwKTsKKworCQluZHAgPSAoc3RydWN0IG5pdF9pZmRyb3BzICopY3A7CisJCXAtPm1kLnN0YXQucHNfZHJvcCA9IG5kcC0+bmhfZHJvcHM7CisJCWNwICs9IHNpemVvZiAqbmRwOworCisJCS8qIGdldCBwYXN0IHBhY2tldCBsZW4gICovCisJCW5scCA9IChzdHJ1Y3Qgbml0X2lmbGVuICopY3A7CisJCWNwICs9IHNpemVvZigqbmxwKTsKKworCQkvKiBuZXh0IHNuYXBzaG90ICAgICAgICAqLworCQlicCArPSBoZHJwLT5uaGJfdG90bGVuOworCisJCWNhcGxlbiA9IG5scC0+bmhfcGt0bGVuOworCQlpZiAoY2FwbGVuID4gcC0+c25hcHNob3QpCisJCQljYXBsZW4gPSBwLT5zbmFwc2hvdDsKKworCQlpZiAoYnBmX2ZpbHRlcihwLT5mY29kZS5iZl9pbnNucywgY3AsIG5scC0+bmhfcGt0bGVuLCBjYXBsZW4pKSB7CisJCQlzdHJ1Y3QgcGNhcF9wa3RoZHIgaDsKKwkJCWgudHMgPSBudHAtPm5oX3RpbWVzdGFtcDsKKwkJCWgubGVuID0gbmxwLT5uaF9wa3RsZW47CisJCQloLmNhcGxlbiA9IGNhcGxlbjsKKwkJCSgqY2FsbGJhY2spKHVzZXIsICZoLCBjcCk7CisJCQlpZiAoKytuID49IGNudCAmJiBjbnQgPiAwKSB7CisJCQkJcC0+Y2MgPSBlcCAtIGJwOworCQkJCXAtPmJwID0gYnA7CisJCQkJcmV0dXJuIChuKTsKKwkJCX0KKwkJfQorCX0KKwlwLT5jYyA9IDA7CisJcmV0dXJuIChuKTsKK30KKworc3RhdGljIGludAorcGNhcF9pbmplY3Rfc25pdChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHN0cmJ1ZiBjdGwsIGRhdGE7CisJCisJLyoKKwkgKiBYWFggLSBjYW4gd2UganVzdCBkbworCSAqCisJcmV0ID0gd3JpdGUocGQtPmYsIGJ1Ziwgc2l6ZSk7CisJICovCisJY3RsLmxlbiA9IHNpemVvZigqc2EpOwkvKiBYWFggLSB3aGF0IHdhcyB0aGlzPyAqLworCWN0bC5idWYgPSAoY2hhciAqKXNhOworCWRhdGEuYnVmID0gYnVmOworCWRhdGEubGVuID0gc2l6ZTsKKwlyZXQgPSBwdXRtc2cocC0+ZmQsICZjdGwsICZkYXRhKTsKKwlpZiAocmV0ID09IC0xKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXJldHVybiAocmV0KTsKK30KKworc3RhdGljIGludAorbml0X3NldGZsYWdzKGludCBmZCwgaW50IHByb21pc2MsIGludCB0b19tcywgY2hhciAqZWJ1ZikKK3sKKwlicGZfdV9pbnQzMiBmbGFnczsKKwlzdHJ1Y3Qgc3RyaW9jdGwgc2k7CisJc3RydWN0IHRpbWV2YWwgdGltZW91dDsKKworCXNpLmljX3RpbW91dCA9IElORlRJTTsKKwlpZiAodG9fbXMgIT0gMCkgeworCQl0aW1lb3V0LnR2X3NlYyA9IHRvX21zIC8gMTAwMDsKKwkJdGltZW91dC50dl91c2VjID0gKHRvX21zICogMTAwMCkgJSAxMDAwMDAwOworCQlzaS5pY19jbWQgPSBOSU9DU1RJTUU7CisJCXNpLmljX2xlbiA9IHNpemVvZih0aW1lb3V0KTsKKwkJc2kuaWNfZHAgPSAoY2hhciAqKSZ0aW1lb3V0OworCQlpZiAoaW9jdGwoZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7CisJCQlzbnByaW50ZihlYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiTklPQ1NUSU1FOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwl9CisJZmxhZ3MgPSBOSV9USU1FU1RBTVAgfCBOSV9MRU4gfCBOSV9EUk9QUzsKKwlpZiAocHJvbWlzYykKKwkJZmxhZ3MgfD0gTklfUFJPTUlTQzsKKwlzaS5pY19jbWQgPSBOSU9DU0ZMQUdTOworCXNpLmljX2xlbiA9IHNpemVvZihmbGFncyk7CisJc2kuaWNfZHAgPSAoY2hhciAqKSZmbGFnczsKKwlpZiAoaW9jdGwoZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DU0ZMQUdTOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX3NuaXQocGNhcF90ICpwKQoreworCXN0cnVjdCBzdHJpb2N0bCBzaTsJCS8qIHN0cnVjdCBmb3IgaW9jdGwoKSAqLworCXN0cnVjdCBpZnJlcSBpZnI7CQkvKiBpbnRlcmZhY2UgcmVxdWVzdCBzdHJ1Y3QgKi8KKwlpbnQgY2h1bmtzaXplID0gQ0hVTktTSVpFOworCWludCBmZDsKKwlzdGF0aWMgY2hhciBkZXZbXSA9ICIvZGV2L25pdCI7CisKKwlpZiAocC0+b3B0LnJmbW9uKSB7CisJCS8qCisJCSAqIE5vIG1vbml0b3IgbW9kZSBvbiBTdW5PUyA0LnggKG5vIFdpLUZpIGRldmljZXMgb24KKwkJICogaGFyZHdhcmUgc3VwcG9ydGVkIGJ5IFN1bk9TIDQueCkuCisJCSAqLworCQlyZXR1cm4gKFBDQVBfRVJST1JfUkZNT05fTk9UU1VQKTsKKwl9CisKKwlpZiAocC0+c25hcHNob3QgPCA5NikKKwkJLyoKKwkJICogTklUIHJlcXVpcmVzIGEgc25hcHNob3QgbGVuZ3RoIG9mIGF0IGxlYXN0IDk2LgorCQkgKi8KKwkJcC0+c25hcHNob3QgPSA5NjsKKworCS8qCisJICogSW5pdGlhbGx5IHRyeSBhIHJlYWQvd3JpdGUgb3BlbiAodG8gYWxsb3cgdGhlIGluamVjdAorCSAqIG1ldGhvZCB0byB3b3JrKS4gIElmIHRoYXQgZmFpbHMgZHVlIHRvIHBlcm1pc3Npb24KKwkgKiBpc3N1ZXMsIGZhbGwgYmFjayB0byByZWFkLW9ubHkuICBUaGlzIGFsbG93cyBhCisJICogbm9uLXJvb3QgdXNlciB0byBiZSBncmFudGVkIHNwZWNpZmljIGFjY2VzcyB0byBwY2FwCisJICogY2FwYWJpbGl0aWVzIHZpYSBmaWxlIHBlcm1pc3Npb25zLgorCSAqCisJICogWFhYIC0gd2Ugc2hvdWxkIGhhdmUgYW4gQVBJIHRoYXQgaGFzIGEgZmxhZyB0aGF0CisJICogY29udHJvbHMgd2hldGhlciB0byBvcGVuIHJlYWQtb25seSBvciByZWFkLXdyaXRlLAorCSAqIHNvIHRoYXQgZGVuaWFsIG9mIHBlcm1pc3Npb24gdG8gc2VuZCAob3IgaW5hYmlsaXR5CisJICogdG8gc2VuZCwgaWYgc2VuZGluZyBwYWNrZXRzIGlzbid0IHN1cHBvcnRlZCBvbgorCSAqIHRoZSBkZXZpY2UgaW4gcXVlc3Rpb24pIGNhbiBiZSBpbmRpY2F0ZWQgYXQgb3BlbgorCSAqIHRpbWUuCisJICovCisJcC0+ZmQgPSBmZCA9IG9wZW4oZGV2LCBPX1JEV1IpOworCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRUFDQ0VTKQorCQlwLT5mZCA9IGZkID0gb3BlbihkZXYsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsIGRldiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyogYXJyYW5nZSB0byBnZXQgZGlzY3JldGUgbWVzc2FnZXMgZnJvbSB0aGUgU1RSRUFNIGFuZCB1c2UgTklUX0JVRiAqLworCWlmIChpb2N0bChmZCwgSV9TUkRPUFQsIChjaGFyICopUk1TR0QpIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJJX1NSRE9QVDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGJhZDsKKwl9CisJaWYgKGlvY3RsKGZkLCBJX1BVU0gsICJuYnVmIikgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInB1c2ggbmJ1ZjogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGJhZDsKKwl9CisJLyogc2V0IHRoZSBjaHVua3NpemUgKi8KKwlzaS5pY19jbWQgPSBOSU9DU0NIVU5LOworCXNpLmljX3RpbW91dCA9IElORlRJTTsKKwlzaS5pY19sZW4gPSBzaXplb2YoY2h1bmtzaXplKTsKKwlzaS5pY19kcCA9IChjaGFyICopJmNodW5rc2l6ZTsKKwlpZiAoaW9jdGwoZmQsIElfU1RSLCAoY2hhciAqKSZzaSkgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk5JT0NTQ0hVTks6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyogcmVxdWVzdCB0aGUgaW50ZXJmYWNlICovCisJc3RybmNweShpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwlpZnIuaWZyX25hbWVbc2l6ZW9mKGlmci5pZnJfbmFtZSkgLSAxXSA9ICdcMCc7CisJc2kuaWNfY21kID0gTklPQ0JJTkQ7CisJc2kuaWNfbGVuID0gc2l6ZW9mKGlmcik7CisJc2kuaWNfZHAgPSAoY2hhciAqKSZpZnI7CisJaWYgKGlvY3RsKGZkLCBJX1NUUiwgKGNoYXIgKikmc2kpIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DQklORDogJXM6ICVzIiwKKwkJCWlmci5pZnJfbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKiBzZXQgdGhlIHNuYXBzaG90IGxlbmd0aCAqLworCXNpLmljX2NtZCA9IE5JT0NTU05BUDsKKwlzaS5pY19sZW4gPSBzaXplb2YocC0+c25hcHNob3QpOworCXNpLmljX2RwID0gKGNoYXIgKikmcC0+c25hcHNob3Q7CisJaWYgKGlvY3RsKGZkLCBJX1NUUiwgKGNoYXIgKikmc2kpIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJOSU9DU1NOQVA6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCWlmIChuaXRfc2V0ZmxhZ3MocC0+ZmQsIHAtPm9wdC5wcm9taXNjLCBwLT5tZC50aW1lb3V0LCBwLT5lcnJidWYpIDwgMCkKKwkJZ290byBiYWQ7CisKKwkodm9pZClpb2N0bChmZCwgSV9GTFVTSCwgKGNoYXIgKilGTFVTSFIpOworCS8qCisJICogTklUIHN1cHBvcnRzIG9ubHkgZXRoZXJuZXRzLgorCSAqLworCXAtPmxpbmt0eXBlID0gRExUX0VOMTBNQjsKKworCXAtPmJ1ZnNpemUgPSBCVUZTUEFDRTsKKwlwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKHAtPmJ1ZnNpemUpOworCWlmIChwLT5idWZmZXIgPT0gTlVMTCkgeworCQlzdHJsY3B5KHAtPmVycmJ1ZiwgcGNhcF9zdHJlcnJvcihlcnJubyksIFBDQVBfRVJSQlVGX1NJWkUpOworCQlnb3RvIGJhZDsKKwl9CisKKwkvKgorCSAqICJwLT5mZCIgaXMgYW4gRkQgZm9yIGEgU1RSRUFNUyBkZXZpY2UsIHNvICJzZWxlY3QoKSIgYW5kCisJICogInBvbGwoKSIgc2hvdWxkIHdvcmsgb24gaXQuCisJICovCisJcC0+c2VsZWN0YWJsZV9mZCA9IHAtPmZkOworCisJLyoKKwkgKiBUaGlzIGlzIChwcmVzdW1hYmx5KSBhIHJlYWwgRXRoZXJuZXQgY2FwdHVyZTsgZ2l2ZSBpdCBhCisJICogbGluay1sYXllci10eXBlIGxpc3Qgd2l0aCBETFRfRU4xME1CIGFuZCBETFRfRE9DU0lTLCBzbworCSAqIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIGxldCB5b3UgY2hvb3NlIGl0LCBpbiBjYXNlIHlvdSdyZQorCSAqIGNhcHR1cmluZyBET0NTSVMgdHJhZmZpYyB0aGF0IGEgQ2lzY28gQ2FibGUgTW9kZW0KKwkgKiBUZXJtaW5hdGlvbiBTeXN0ZW0gaXMgcHV0dGluZyBvdXQgb250byBhbiBFdGhlcm5ldCAoaXQKKwkgKiBkb2Vzbid0IHB1dCBhbiBFdGhlcm5ldCBoZWFkZXIgb250byB0aGUgd2lyZSwgaXQgcHV0cyByYXcKKwkgKiBET0NTSVMgZnJhbWVzIG91dCBvbiB0aGUgd2lyZSBpbnNpZGUgdGhlIGxvdy1sZXZlbAorCSAqIEV0aGVybmV0IGZyYW1pbmcpLgorCSAqLworCXAtPmRsdF9saXN0ID0gKHVfaW50ICopIG1hbGxvYyhzaXplb2YodV9pbnQpICogMik7CisJLyoKKwkgKiBJZiB0aGF0IGZhaWxzLCBqdXN0IGxlYXZlIHRoZSBsaXN0IGVtcHR5LgorCSAqLworCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7CisJCXAtPmRsdF9saXN0WzBdID0gRExUX0VOMTBNQjsKKwkJcC0+ZGx0X2xpc3RbMV0gPSBETFRfRE9DU0lTOworCQlwLT5kbHRfY291bnQgPSAyOworCX0KKworCXAtPnJlYWRfb3AgPSBwY2FwX3JlYWRfc25pdDsKKwlwLT5pbmplY3Rfb3AgPSBwY2FwX2luamVjdF9zbml0OworCXAtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07CS8qIG5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwlwLT5zZXRkaXJlY3Rpb25fb3AgPSBOVUxMOwkvKiBOb3QgaW1wbGVtZW50ZWQuICovCisJcC0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsJLyogY2FuJ3QgY2hhbmdlIGRhdGEgbGluayB0eXBlICovCisJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX2ZkOworCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKwlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfc25pdDsKKworCXJldHVybiAoMCk7CisgYmFkOgorCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwKTsKKwlyZXR1cm4gKFBDQVBfRVJST1IpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX3NuaXQ7CisJcmV0dXJuIChwKTsKK30KKworaW50CitwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC1zbm9vcC5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLXNub29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwZTAxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1zbm9vcC5jCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtc25vb3AuYyx2IDEuNTkgMjAwOC0xMi0wMiAxNjoyNToxNCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxuZXQvcmF3Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3VkcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvdWRwX3Zhci5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3BpcC5oPgorCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworc3RhdGljIGludAorcGNhcF9yZWFkX3Nub29wKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJaW50IGNjOworCXJlZ2lzdGVyIHN0cnVjdCBzbm9vcGhlYWRlciAqc2g7CisJcmVnaXN0ZXIgdV9pbnQgZGF0YWxlbjsKKwlyZWdpc3RlciB1X2ludCBjYXBsZW47CisJcmVnaXN0ZXIgdV9jaGFyICpjcDsKKworYWdhaW46CisJLyoKKwkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCSAqLworCWlmIChwLT5icmVha19sb29wKSB7CisJCS8qCisJCSAqIFllcyAtIGNsZWFyIHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgaXQKKwkJICogaGFzLCBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlIHRoYXQgd2Ugd2VyZQorCQkgKiB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCXAtPmJyZWFrX2xvb3AgPSAwOworCQlyZXR1cm4gKC0yKTsKKwl9CisJY2MgPSByZWFkKHAtPmZkLCAoY2hhciAqKXAtPmJ1ZmZlciwgcC0+YnVmc2l6ZSk7CisJaWYgKGNjIDwgMCkgeworCQkvKiBEb24ndCBjaG9rZSB3aGVuIHdlIGdldCBwdHJhY2VkICovCisJCXN3aXRjaCAoZXJybm8pIHsKKworCQljYXNlIEVJTlRSOgorCQkJZ290byBhZ2FpbjsKKworCQljYXNlIEVXT1VMREJMT0NLOgorCQkJcmV0dXJuICgwKTsJCQkvKiBYWFggKi8KKwkJfQorCQlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkgICAgInJlYWQ6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJc2ggPSAoc3RydWN0IHNub29waGVhZGVyICopcC0+YnVmZmVyOworCWRhdGFsZW4gPSBzaC0+c25vb3BfcGFja2V0bGVuOworCisJLyoKKwkgKiBYWFggLSBTaWdoLCBzbm9vcF9wYWNrZXRsZW4gaXMgYSAxNiBiaXQgcXVhbnRpdHkuICBJZiB3ZQorCSAqIGdvdCBhIHNob3J0IGxlbmd0aCwgYnV0IHJlYWQgYSBmdWxsIHNpemVkIHNub29wIHBha2NldCwKKwkgKiBhc3N1bWUgd2Ugb3ZlcmZsb3dlZCBhbmQgYWRkIGJhY2sgdGhlIDY0Sy4uLgorCSAqLworCWlmIChjYyA9PSAocC0+c25hcHNob3QgKyBzaXplb2Yoc3RydWN0IHNub29waGVhZGVyKSkgJiYKKwkgICAgKGRhdGFsZW4gPCBwLT5zbmFwc2hvdCkpCisJCWRhdGFsZW4gKz0gKDY0ICogMTAyNCk7CisKKwljYXBsZW4gPSAoZGF0YWxlbiA8IHAtPnNuYXBzaG90KSA/IGRhdGFsZW4gOiBwLT5zbmFwc2hvdDsKKwljcCA9ICh1X2NoYXIgKikoc2ggKyAxKSArIHAtPm9mZnNldDsJCS8qIFhYWCAqLworCisJLyogCisJICogWFhYIHVuZm9ydHVuYXRlbHkgc25vb3AgbG9vcGJhY2sgaXNuJ3QgZXhhY3RseSBsaWtlCisJICogQlNEJ3MuICBUaGUgYWRkcmVzcyBmYW1pbHkgaXMgZW5jb2RlZCBpbiB0aGUgZmlyc3QgMgorCSAqIGJ5dGVzIHJhdGhlciB0aGFuIHRoZSBmaXJzdCA0IGJ5dGVzISAgTHVja2lseSB0aGUgbGFzdAorCSAqIHR3byBzbm9vcCBsb29wYmFjayBieXRlcyBhcmUgemVyb2VkLgorCSAqLworCWlmIChwLT5saW5rdHlwZSA9PSBETFRfTlVMTCAmJiAqKChzaG9ydCAqKShjcCArIDIpKSA9PSAwKSB7CisJCXVfaW50ICp1aXAgPSAodV9pbnQgKiljcDsKKwkJKnVpcCA+Pj0gMTY7CisJfQorCisJaWYgKHAtPmZjb2RlLmJmX2luc25zID09IE5VTEwgfHwKKwkgICAgYnBmX2ZpbHRlcihwLT5mY29kZS5iZl9pbnNucywgY3AsIGRhdGFsZW4sIGNhcGxlbikpIHsKKwkJc3RydWN0IHBjYXBfcGt0aGRyIGg7CisJCSsrcC0+bWQuc3RhdC5wc19yZWN2OworCQloLnRzLnR2X3NlYyA9IHNoLT5zbm9vcF90aW1lc3RhbXAudHZfc2VjOworCQloLnRzLnR2X3VzZWMgPSBzaC0+c25vb3BfdGltZXN0YW1wLnR2X3VzZWM7CisJCWgubGVuID0gZGF0YWxlbjsKKwkJaC5jYXBsZW4gPSBjYXBsZW47CisJCSgqY2FsbGJhY2spKHVzZXIsICZoLCBjcCk7CisJCXJldHVybiAoMSk7CisJfQorCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfaW5qZWN0X3Nub29wKHBjYXBfdCAqcCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBYWFggLSBsaWJuZXQgb3ZlcndyaXRlcyB0aGUgc291cmNlIGFkZHJlc3Mgd2l0aCB3aGF0IEkKKwkgKiBwcmVzdW1lIGlzIHRoZSBpbnRlcmZhY2UncyBhZGRyZXNzOyBpcyB0aGF0IHJlcXVpcmVkPworCSAqLworCXJldCA9IHdyaXRlKHAtPmZkLCBidWYsIHNpemUpOworCWlmIChyZXQgPT0gLTEpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAic2VuZDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuIChyZXQpOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdGF0aWMgaW50CitwY2FwX3N0YXRzX3Nub29wKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpCit7CisJcmVnaXN0ZXIgc3RydWN0IHJhd3N0YXRzICpyczsKKwlzdHJ1Y3QgcmF3c3RhdHMgcmF3c3RhdHM7CisKKwlycyA9ICZyYXdzdGF0czsKKwltZW1zZXQocnMsIDAsIHNpemVvZigqcnMpKTsKKwlpZiAoaW9jdGwocC0+ZmQsIFNJT0NSQVdTVEFUUywgKGNoYXIgKilycykgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCSAgICAiU0lPQ1JBV1NUQVRTOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiAiaWZkcm9wcyIgYXJlIHRob3NlIGRyb3BwZWQgYnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlCisJICogZHVlIHRvIHJlc291cmNlIHNob3J0YWdlcyBvciBoYXJkd2FyZSBlcnJvcnMuCisJICoKKwkgKiAic2Jkcm9wcyIgYXJlIHRob3NlIGRyb3BwZWQgZHVlIHRvIHNvY2tldCBidWZmZXIgbGltaXRzLgorCSAqCisJICogQXMgZmlsdGVyIGlzIGRvbmUgaW4gdXNlcmxhbmQsICJzYmRyb3BzIiBjb3VudHMgcGFja2V0cworCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IHdvdWxkJ3ZlIHBhc3NlZCB0aGUgZmlsdGVyLgorCSAqCisJICogWFhYIC0gZG9lcyB0aGlzIGNvdW50ICphbGwqIFNub29wIG9yIERyYWluIHNvY2tldHMsCisJICogcmF0aGVyIHRoYW4ganVzdCB0aGlzIHNvY2tldD8gIElmIG5vdCwgd2h5IGRvZXMgaXQgaGF2ZQorCSAqIGJvdGggU25vb3AgYW5kIERyYWluIHN0YXRpc3RpY3M/CisJICovCisJcC0+bWQuc3RhdC5wc19kcm9wID0KKwkgICAgcnMtPnJzX3Nub29wLnNzX2lmZHJvcHMgKyBycy0+cnNfc25vb3Auc3Nfc2Jkcm9wcyArCisJICAgIHJzLT5yc19kcmFpbi5kc19pZmRyb3BzICsgcnMtPnJzX2RyYWluLmRzX3NiZHJvcHM7CisKKwkvKgorCSAqICJwc19yZWN2IiBjb3VudHMgb25seSBwYWNrZXRzIHRoYXQgcGFzc2VkIHRoZSBmaWx0ZXIuCisJICogQXMgZmlsdGVyaW5nIGlzIGRvbmUgaW4gdXNlcmxhbmQsIHRoaXMgZG9lcyBub3QgaW5jbHVkZQorCSAqIHBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIHdlIHJhbiBvdXQgb2YgYnVmZmVyIHNwYWNlLgorCSAqLworCSpwcyA9IHAtPm1kLnN0YXQ7CisJcmV0dXJuICgwKTsKK30KKworLyogWFhYIGNhbid0IGRpc2FibGUgcHJvbWlzY3VvdXMgKi8KK3N0YXRpYyBpbnQKK3BjYXBfYWN0aXZhdGVfc25vb3AocGNhcF90ICpwKQoreworCWludCBmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfcmF3IHNyOworCXN0cnVjdCBzbm9vcGZpbHRlciBzZjsKKwl1X2ludCB2OworCWludCBsbF9oZHJsZW47CisJaW50IHNub29wbGVuOworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwlmZCA9IHNvY2tldChQRl9SQVcsIFNPQ0tfUkFXLCBSQVdQUk9UT19TTk9PUCk7CisJaWYgKGZkIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJzbm9vcCBzb2NrZXQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCXAtPmZkID0gZmQ7CisJbWVtc2V0KCZzciwgMCwgc2l6ZW9mKHNyKSk7CisJc3Iuc3JfZmFtaWx5ID0gQUZfUkFXOworCSh2b2lkKXN0cm5jcHkoc3Iuc3JfaWZuYW1lLCBwLT5vcHQuc291cmNlLCBzaXplb2Yoc3Iuc3JfaWZuYW1lKSk7CisJaWYgKGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3IsIHNpemVvZihzcikpKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNub29wIGJpbmQ6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCW1lbXNldCgmc2YsIDAsIHNpemVvZihzZikpOworCWlmIChpb2N0bChmZCwgU0lPQ0FERFNOT09QLCAmc2YpIDwgMCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJTSU9DQUREU05PT1A6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCWlmIChwLT5vcHQuYnVmZmVyX3NpemUgIT0gMCkKKwkJdiA9IHAtPm9wdC5idWZmZXJfc2l6ZTsKKwllbHNlCisJCXYgPSA2NCAqIDEwMjQ7CS8qIGRlZmF1bHQgdG8gNjRLIGJ1ZmZlciBzaXplICovCisJKHZvaWQpc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fUkNWQlVGLCAoY2hhciAqKSZ2LCBzaXplb2YodikpOworCS8qCisJICogWFhYIGhhY2sgLSBtYXAgZGV2aWNlIG5hbWUgdG8gbGluayBsYXllciB0eXBlCisJICovCisJaWYgKHN0cm5jbXAoImV0IiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCB8fAkvKiBDaGFsbGVuZ2UgMTAgTWJpdCAqLworCSAgICBzdHJuY21wKCJlYyIsIHAtPm9wdC5zb3VyY2UsIDIpID09IDAgfHwJLyogSW5kaWdvL0luZHkgMTAgTWJpdCwKKwkJCQkJCQkgICBPMiAxMC8xMDAgKi8KKwkgICAgc3RybmNtcCgiZWYiLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwIHx8CS8qIE8yMDAvMjAwMCAxMC8xMDAgTWJpdCAqLworCSAgICBzdHJuY21wKCJlZyIsIHAtPm9wdC5zb3VyY2UsIDIpID09IDAgfHwJLyogT2N0YW5lL08yeHh4L08zeHh4IEdpZ2FiaXQgKi8KKwkgICAgc3RybmNtcCgiZ2ZlIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCB8fAkvKiBHSU8gMTAwIE1iaXQgKi8KKwkgICAgc3RybmNtcCgiZnhwIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCB8fAkvKiBDaGFsbGVuZ2UgVk1FIEVuZXQgKi8KKwkgICAgc3RybmNtcCgiZXAiLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwIHx8CS8qIENoYWxsZW5nZSA4eDEwIE1iaXQgRVBMRVggKi8KKwkgICAgc3RybmNtcCgidmZlIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCB8fAkvKiBDaGFsbGVuZ2UgVk1FIDEwME1iaXQgKi8KKwkgICAgc3RybmNtcCgiZmEiLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwIHx8CisJICAgIHN0cm5jbXAoInFhYSIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDAgfHwKKwkgICAgc3RybmNtcCgiY2lwIiwgcC0+b3B0LnNvdXJjZSwgMykgPT0gMCB8fAorCSAgICBzdHJuY21wKCJlbCIsIHAtPm9wdC5zb3VyY2UsIDIpID09IDApIHsKKwkJcC0+bGlua3R5cGUgPSBETFRfRU4xME1COworCQlwLT5vZmZzZXQgPSBSQVdfSERSUEFEKHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKSk7CisJCWxsX2hkcmxlbiA9IHNpemVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKTsKKwkJLyoKKwkJICogVGhpcyBpcyAocHJlc3VtYWJseSkgYSByZWFsIEV0aGVybmV0IGNhcHR1cmU7IGdpdmUgaXQgYQorCQkgKiBsaW5rLWxheWVyLXR5cGUgbGlzdCB3aXRoIERMVF9FTjEwTUIgYW5kIERMVF9ET0NTSVMsIHNvCisJCSAqIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIGxldCB5b3UgY2hvb3NlIGl0LCBpbiBjYXNlIHlvdSdyZQorCQkgKiBjYXB0dXJpbmcgRE9DU0lTIHRyYWZmaWMgdGhhdCBhIENpc2NvIENhYmxlIE1vZGVtCisJCSAqIFRlcm1pbmF0aW9uIFN5c3RlbSBpcyBwdXR0aW5nIG91dCBvbnRvIGFuIEV0aGVybmV0IChpdAorCQkgKiBkb2Vzbid0IHB1dCBhbiBFdGhlcm5ldCBoZWFkZXIgb250byB0aGUgd2lyZSwgaXQgcHV0cyByYXcKKwkJICogRE9DU0lTIGZyYW1lcyBvdXQgb24gdGhlIHdpcmUgaW5zaWRlIHRoZSBsb3ctbGV2ZWwKKwkJICogRXRoZXJuZXQgZnJhbWluZykuCisJCSAqCisJCSAqIFhYWCAtIGFyZSB0aGVyZSBhbnkgc29ydHMgb2YgImZha2UgRXRoZXJuZXQiIHRoYXQgaGF2ZQorCQkgKiBFdGhlcm5ldCBsaW5rLWxheWVyIGhlYWRlcnMgYnV0IHRoYXQgKnNob3VsZG4ndCBvZmZlcgorCQkgKiBETFRfRE9DU0lTIGFzIGEgQ2lzY28gQ01UUyB3b24ndCBwdXQgdHJhZmZpYyBvbnRvIGl0CisJCSAqIG9yIGdldCB0cmFmZmljIGJyaWRnZWQgb250byBpdD8gICJlbCIgaXMgZm9yIEFUTSBMQU5FCisJCSAqIEV0aGVybmV0IGRldmljZXMsIHNvIHRoYXQgbWlnaHQgYmUgdGhlIGNhc2UgZm9yIHRoZW07CisJCSAqIHRoZSBzYW1lIGFwcGxpZXMgZm9yICJxYWEiIGNsYXNzaWNhbCBJUCBkZXZpY2VzLiAgSWYKKwkJICogImZhIiBkZXZpY2VzIGFyZSBmb3IgRk9SRSBTUEFOUywgdGhhdCdkIGFwcGx5IHRvIHRoZW0KKwkJICogYXMgd2VsbDsgd2hhdCBhcmUgImNpcCIgZGV2aWNlcyAtIHNvbWUgb3RoZXIgQVRNCisJCSAqIENsYXNzaWNhbCBJUCBkZXZpY2VzPworCQkgKi8KKwkJcC0+ZGx0X2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKKwkJLyoKKwkJICogSWYgdGhhdCBmYWlscywganVzdCBsZWF2ZSB0aGUgbGlzdCBlbXB0eS4KKwkJICovCisJCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7CisJCQlwLT5kbHRfbGlzdFswXSA9IERMVF9FTjEwTUI7CisJCQlwLT5kbHRfbGlzdFsxXSA9IERMVF9ET0NTSVM7CisJCQlwLT5kbHRfY291bnQgPSAyOworCQl9CisJfSBlbHNlIGlmIChzdHJuY21wKCJpcGciLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwIHx8CisJCSAgIHN0cm5jbXAoInJucyIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDAgfHwJLyogTzIvMjAwLzIwMDAgRkRESSAqLworCQkgICBzdHJuY21wKCJ4cGkiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwKSB7CisJCXAtPmxpbmt0eXBlID0gRExUX0ZEREk7CisJCXAtPm9mZnNldCA9IDM7CQkJCS8qIFhYWCB5ZWFoPyAqLworCQlsbF9oZHJsZW4gPSAxMzsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoInBwcCIsIHAtPm9wdC5zb3VyY2UsIDMpID09IDApIHsKKwkJcC0+bGlua3R5cGUgPSBETFRfUkFXOworCQlsbF9oZHJsZW4gPSAwOwkvKiBETFRfUkFXIG1lYW5pbmcgIm5vIFBQUCBoZWFkZXIsIGp1c3QgdGhlIElQIHBhY2tldCI/ICovCisJfSBlbHNlIGlmIChzdHJuY21wKCJxZmEiLCBwLT5vcHQuc291cmNlLCAzKSA9PSAwKSB7CisJCXAtPmxpbmt0eXBlID0gRExUX0lQX09WRVJfRkM7CisJCWxsX2hkcmxlbiA9IDI0OworCX0gZWxzZSBpZiAoc3RybmNtcCgicGwiLCBwLT5vcHQuc291cmNlLCAyKSA9PSAwKSB7CisJCXAtPmxpbmt0eXBlID0gRExUX1JBVzsKKwkJbGxfaGRybGVuID0gMDsJLyogQ3JheSBVTklDT1MvbXAgcHNldWRvIGxpbmsgKi8KKwl9IGVsc2UgaWYgKHN0cm5jbXAoImxvIiwgcC0+b3B0LnNvdXJjZSwgMikgPT0gMCkgeworCQlwLT5saW5rdHlwZSA9IERMVF9OVUxMOworCQlsbF9oZHJsZW4gPSA0OworCX0gZWxzZSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJzbm9vcDogdW5rbm93biBwaHlzaWNhbCBsYXllciB0eXBlIik7CisJCWdvdG8gYmFkOworCX0KKworCWlmIChwLT5vcHQucmZtb24pIHsKKwkJLyoKKwkJICogTm8gbW9uaXRvciBtb2RlIG9uIElyaXggKG5vIFdpLUZpIGRldmljZXMgb24KKwkJICogaGFyZHdhcmUgc3VwcG9ydGVkIGJ5IElyaXgpLgorCQkgKi8KKwkJcmV0dXJuIChQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUCk7CisJfQorCisjaWZkZWYgU0lPQ0dJRk1UVQorCS8qCisJICogWFhYIC0gSVJJWCBhcHBlYXJzIHRvIGdpdmUgeW91IGFuIGVycm9yIGlmIHlvdSB0cnkgdG8gc2V0IHRoZQorCSAqIGNhcHR1cmUgbGVuZ3RoIHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgTVRVLCBzbyBsZXQncyB0cnkgdG8gZ2V0CisJICogdGhlIE1UVSBmaXJzdCBhbmQsIGlmIHRoYXQgc3VjY2VlZHMsIHRyaW0gdGhlIHNuYXAgbGVuZ3RoCisJICogdG8gYmUgbm8gZ3JlYXRlciB0aGFuIHRoZSBNVFUuCisJICovCisJKHZvaWQpc3RybmNweShpZnIuaWZyX25hbWUsIHAtPm9wdC5zb3VyY2UsIHNpemVvZihpZnIuaWZyX25hbWUpKTsKKwlpZiAoaW9jdGwoZmQsIFNJT0NHSUZNVFUsIChjaGFyICopJmlmcikgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NHSUZNVFU6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCS8qCisJICogT0ssIHdlIGdvdCBpdC4KKwkgKgorCSAqIFhYWCAtIHNvbWUgdmVyc2lvbnMgb2YgSVJJWCA2LjUgZGVmaW5lICJpZnJfbXR1IiBhbmQgaGF2ZSBhbgorCSAqICJpZnJ1X21ldHJpYyIgbWVtYmVyIG9mIHRoZSAiaWZyX2lmcnUiIHVuaW9uIGluIGFuICJpZnJlcSIKKwkgKiBzdHJ1Y3R1cmUsIG90aGVycyBkb24ndC4KKwkgKgorCSAqIEkndmUgbm8gaWRlYSB3aGF0J3MgZ29pbmcgb24sIHNvLCBpZiAiaWZyX210dSIgaXNuJ3QgZGVmaW5lZCwKKwkgKiB3ZSBkZWZpbmUgaXQgYXMgImlmcl9tZXRyaWMiLCBhcyB1c2luZyB0aGF0IGZpZWxkIGFwcGVhcnMgdG8KKwkgKiB3b3JrIG9uIHRoZSB2ZXJzaW9ucyB0aGF0IGxhY2sgImlmcl9tdHUiIChhbmQsIG9uIHRob3NlIHRoYXQKKwkgKiBkb24ndCBsYWNrIGl0LCAiaWZydV9tZXRyaWMiIGFuZCAiaWZydV9tdHUiIGFyZSBib3RoICJpbnQiCisJICogbWVtYmVycyBvZiB0aGUgImlmcl9pZnJ1IiB1bmlvbiwgd2hpY2ggc3VnZ2VzdHMgdGhhdCB0aGV5CisJICogbWF5IGJlIGludGVyY2hhbmdlYWJsZSBpbiB0aGlzIGNhc2UpLgorCSAqLworI2lmbmRlZiBpZnJfbXR1CisjZGVmaW5lIGlmcl9tdHUJaWZyX21ldHJpYworI2VuZGlmCisJaWYgKHAtPnNuYXBzaG90ID4gaWZyLmlmcl9tdHUgKyBsbF9oZHJsZW4pCisJCXAtPnNuYXBzaG90ID0gaWZyLmlmcl9tdHUgKyBsbF9oZHJsZW47CisjZW5kaWYKKworCS8qCisJICogVGhlIGFyZ3VtZW50IHRvIFNJT0NTTk9PUExFTiBpcyB0aGUgbnVtYmVyIG9mIGxpbmstbGF5ZXIKKwkgKiBwYXlsb2FkIGJ5dGVzIHRvIGNhcHR1cmUgLSBpdCBkb2Vzbid0IGNvdW50IGxpbmstbGF5ZXIKKwkgKiBoZWFkZXIgYnl0ZXMuCisJICovCisJc25vb3BsZW4gPSBwLT5zbmFwc2hvdCAtIGxsX2hkcmxlbjsKKwlpZiAoc25vb3BsZW4gPCAwKQorCQlzbm9vcGxlbiA9IDA7CisJaWYgKGlvY3RsKGZkLCBTSU9DU05PT1BMRU4sICZzbm9vcGxlbikgPCAwKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIlNJT0NTTk9PUExFTjogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlnb3RvIGJhZDsKKwl9CisJdiA9IDE7CisJaWYgKGlvY3RsKGZkLCBTSU9DU05PT1BJTkcsICZ2KSA8IDApIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiU0lPQ1NOT09QSU5HOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gYmFkOworCX0KKworCXAtPmJ1ZnNpemUgPSA0MDk2OwkJCQkvKiBYWFggKi8KKwlwLT5idWZmZXIgPSAodV9jaGFyICopbWFsbG9jKHAtPmJ1ZnNpemUpOworCWlmIChwLT5idWZmZXIgPT0gTlVMTCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBiYWQ7CisJfQorCisJLyoKKwkgKiAicC0+ZmQiIGlzIGEgc29ja2V0LCBzbyAic2VsZWN0KCkiIHNob3VsZCB3b3JrIG9uIGl0LgorCSAqLworCXAtPnNlbGVjdGFibGVfZmQgPSBwLT5mZDsKKworCXAtPnJlYWRfb3AgPSBwY2FwX3JlYWRfc25vb3A7CisJcC0+aW5qZWN0X29wID0gcGNhcF9pbmplY3Rfc25vb3A7CisJcC0+c2V0ZmlsdGVyX29wID0gaW5zdGFsbF9icGZfcHJvZ3JhbTsJLyogbm8ga2VybmVsIGZpbHRlcmluZyAqLworCXAtPnNldGRpcmVjdGlvbl9vcCA9IE5VTEw7CS8qIE5vdCBpbXBsZW1lbnRlZC4gKi8KKwlwLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOwkvKiBjYW4ndCBjaGFuZ2UgZGF0YSBsaW5rIHR5cGUgKi8KKwlwLT5nZXRub25ibG9ja19vcCA9IHBjYXBfZ2V0bm9uYmxvY2tfZmQ7CisJcC0+c2V0bm9uYmxvY2tfb3AgPSBwY2FwX3NldG5vbmJsb2NrX2ZkOworCXAtPnN0YXRzX29wID0gcGNhcF9zdGF0c19zbm9vcDsKKworCXJldHVybiAoMCk7CisgYmFkOgorCXBjYXBfY2xlYW51cF9saXZlX2NvbW1vbihwKTsKKwlyZXR1cm4gKFBDQVBfRVJST1IpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSBwY2FwX2FjdGl2YXRlX3Nub29wOworCXJldHVybiAocCk7Cit9CisKK2ludAorcGNhcF9wbGF0Zm9ybV9maW5kZGV2cyhwY2FwX2lmX3QgKiphbGxkZXZzcCwgY2hhciAqZXJyYnVmKQoreworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtc3RkaW5jLmggYi9saWJwY2FwLTEuMy4wL3BjYXAtc3RkaW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjNzM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC1zdGRpbmMuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIC0gMjAwNSBOZXRHcm91cCwgUG9saXRlY25pY28gZGkgVG9yaW5vIChJdGFseSkKKyAqIENvcHlyaWdodCAoYykgMjAwNSAtIDIwMDkgQ0FDRSBUZWNobm9sb2dpZXMsIEluYy4gRGF2aXMgKENhbGlmb3JuaWEpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFBvbGl0ZWNuaWNvIGRpIFRvcmlubyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAtc3RkaW5jLmgsdiAxLjEwLjIuMSAyMDA4LTEwLTA2IDE1OjM4OjM5IGdpYW5sdWNhIEV4cCAkIChMQkwpCisgKi8KKyNpZm5kZWYgcGNhcF9zdGRpbmNfaAorI2RlZmluZSBwY2FwX3N0ZGluY19oCisKKy8qCisgKiBBdm9pZHMgYSBjb21waWxlciB3YXJuaW5nIGluIGNhc2UgdGhpcyB3YXMgYWxyZWFkeSBkZWZpbmVkICAgICAgCisgKiAoc29tZW9uZSBkZWZpbmVkIF9XSU5TT0NLQVBJXyB3aGVuIGluY2x1ZGluZyAnd2luZG93cy5oJywgaW4gb3JkZXIKKyAqIHRvIHByZXZlbnQgaXQgZnJvbSBpbmNsdWRpbmcgJ3dpbnNvY2suaCcpCisgKi8KKyNpZmRlZiBfV0lOU09DS0FQSV8KKyN1bmRlZiBfV0lOU09DS0FQSV8KKyNlbmRpZgorI2luY2x1ZGUgPHdpbnNvY2syLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSAiYml0dHlwZXMuaCIKKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8aW8uaD4KKworI2lmbmRlZiBfX01JTkdXMzJfXworI2luY2x1ZGUgIklQNl9taXNjLmgiCisjZW5kaWYKKworI2RlZmluZSBjYWRkcl90IGNoYXIqCisKKyNpZiBfTVNDX1ZFUiA8IDE1MDAKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjZGVmaW5lIHN0cmR1cCBfc3RyZHVwCisjZW5kaWYKKworI2RlZmluZSBpbmxpbmUgX19pbmxpbmUgCisKKyNpZmRlZiBfX01JTkdXMzJfXworI2luY2x1ZGUgPHN0ZGludC5oPgorI2Vsc2UgLypfX01JTkdXMzJfXyovCisvKiBNU1ZDIGNvbXBpbGVyICovCisjaWZuZGVmIF9VSU5UUFRSX1RfREVGSU5FRAorI2lmZGVmICBfV0lONjQKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgICB1aW50cHRyX3Q7CisjZWxzZQordHlwZWRlZiBfVzY0IHVuc2lnbmVkIGludCAgIHVpbnRwdHJfdDsKKyNlbmRpZgorI2RlZmluZSBfVUlOVFBUUl9UX0RFRklORUQKKyNlbmRpZgorCisjaWZuZGVmIF9JTlRQVFJfVF9ERUZJTkVECisjaWZkZWYgIF9XSU42NAordHlwZWRlZiBfX2ludDY0ICAgIGludHB0cl90OworI2Vsc2UKK3R5cGVkZWYgX1c2NCBpbnQgICBpbnRwdHJfdDsKKyNlbmRpZgorI2RlZmluZSBfSU5UUFRSX1RfREVGSU5FRAorI2VuZGlmIAorCisjZW5kaWYgLypfX01JTkdXMzJfXyovCisjZW5kaWYgLyogcGNhcF9zdGRpbmNfaCAqLwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLXRzdGFtcC5tYW5taXNjLmluIGIvbGlicGNhcC0xLjMuMC9wY2FwLXRzdGFtcC5tYW5taXNjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDMyYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtdHN0YW1wLm1hbm1pc2MuaW4KQEAgLTAsMCArMSwxMzIgQEAKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk4NywgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVAtVFNUQU1QIEBNQU5fTUlTQ19JTkZPQCAiMjIgQXVndXN0IDIwMTAiCisuU0ggTkFNRQorcGNhcC10c3RhbXAgXC0gcGFja2V0IHRpbWUgc3RhbXBzIGluIGxpYnBjYXAKKy5TSCBERVNDUklQVElPTgorV2hlbiBjYXB0dXJpbmcgdHJhZmZpYywgZWFjaCBwYWNrZXQgaXMgZ2l2ZW4gYSB0aW1lIHN0YW1wIHJlcHJlc2VudGluZywKK2ZvciBpbmNvbWluZyBwYWNrZXRzLCB0aGUgYXJyaXZhbCB0aW1lIG9mIHRoZSBwYWNrZXQgYW5kLCBmb3Igb3V0Z29pbmcKK3BhY2tldHMsIHRoZSB0cmFuc21pc3Npb24gdGltZSBvZiB0aGUgcGFja2V0LiAgVGhpcyB0aW1lIGlzIGFuCithcHByb3hpbWF0aW9uIG9mIHRoZSBhcnJpdmFsIG9yIHRyYW5zbWlzc2lvbiB0aW1lLiAgSWYgaXQgaXMgc3VwcGxpZWQgYnkKK3RoZSBvcGVyYXRpbmcgc3lzdGVtIHJ1bm5pbmcgb24gdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcKK2RvbmUsIHRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2h5IGl0IG1pZ2h0IG5vdCBwcmVjaXNlbHkgcmVwcmVzZW50IHRoZQorYXJyaXZhbCBvciB0cmFuc21pc3Npb24gdGltZToKKy5JUAoraWYgdGhlIHRpbWUgc3RhbXAgaXMgYXBwbGllZCB0byB0aGUgcGFja2V0IHdoZW4gdGhlIG5ldHdvcmtpbmcgc3RhY2sKK3JlY2VpdmVzIHRoZSBwYWNrZXQsIHRoZSBuZXR3b3JraW5nIHN0YWNrIG1pZ2h0IG5vdCBzZWUgdGhlIHBhY2tldCB1bnRpbAorYW4gaW50ZXJydXB0IGlzIGRlbGl2ZXJlZCBmb3IgdGhlIHBhY2tldCBvciBhIHRpbWVyIGV2ZW50IGNhdXNlcyB0aGUKK25ldHdvcmtpbmcgZGV2aWNlIGRyaXZlciB0byBwb2xsIGZvciBwYWNrZXRzLCBhbmQgdGhlIHRpbWUgc3RhbXAgbWlnaHQKK25vdCBiZSBhcHBsaWVkIHVudGlsIHRoZSBwYWNrZXQgaGFzIGhhZCBzb21lIHByb2Nlc3NpbmcgZG9uZSBieSBvdGhlcgorY29kZSBpbiB0aGUgbmV0d29ya2luZyBzdGFjaywgc28gdGhlcmUgbWlnaHQgYmUgYSBzaWduaWZpY2FudCBkZWxheQorYmV0d2VlbiB0aGUgdGltZSB3aGVuIHRoZSBsYXN0IGJpdCBvZiB0aGUgcGFja2V0IGlzIHJlY2VpdmVkIGJ5IHRoZQorY2FwdHVyZSBkZXZpY2UgYW5kIHdoZW4gdGhlIG5ldHdvcmtpbmcgc3RhY2sgdGltZS1zdGFtcHMgdGhlIHBhY2tldDsKKy5JUAordGhlIHRpbWVyIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHRpbWUgc3RhbXBzIG1pZ2h0IGhhdmUgbG93IHJlc29sdXRpb24sCitmb3IgZXhhbXBsZSwgaXQgbWlnaHQgYmUgYSB0aW1lciB1cGRhdGVkIG9uY2UgcGVyIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbQordGltZXIgdGljaywgd2l0aCB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtIHRpbWVyIHRpY2tpbmcgb25jZSBldmVyeSBmZXcKK21pbGxpc2Vjb25kczsKKy5JUAorYSBoaWdoLXJlc29sdXRpb24gdGltZXIgbWlnaHQgdXNlIGEgY291bnRlciB0aGF0IHJ1bnMgYXQgYSByYXRlCitkZXBlbmRlbnQgb24gdGhlIHByb2Nlc3NvciBjbG9jayBzcGVlZCwgYW5kIHRoYXQgY2xvY2sgc3BlZWQgbWlnaHQgYmUKK2FkanVzdGVkIHVwd2FyZHMgb3IgZG93bndhcmRzIG92ZXIgdGltZSBhbmQgdGhlIHRpbWVyIG1pZ2h0IG5vdCBiZSBhYmxlCit0byBjb21wZW5zYXRlIGZvciBhbGwgdGhvc2UgYWRqdXN0bWVudHM7CisuSVAKK3RoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyBjbG9jayBtaWdodCBiZSBhZGp1c3RlZCBvdmVyIHRpbWUgdG8gbWF0Y2ggYQordGltZSBzdGFuZGFyZCB0byB3aGljaCB0aGUgaG9zdCBpcyBiZWluZyBzeW5jaHJvbml6ZWQsIHdoaWNoIG1pZ2h0IGJlCitkb25lIGJ5IHRlbXBvcmFyaWx5IHNsb3dpbmcgZG93biBvciBzcGVlZGluZyB1cCB0aGUgY2xvY2sgb3IgYnkgbWFraW5nIGEKK3NpbmdsZSBhZGp1c3RtZW50OworLklQCitkaWZmZXJlbnQgQ1BVIGNvcmVzIG9uIGEgbXVsdGktY29yZSBvciBtdWx0aS1wcm9jZXNzb3Igc3lzdGVtIG1pZ2h0IGJlCitydW5uaW5nIGF0IGRpZmZlcmVudCBzcGVlZHMsIG9yIG1pZ2h0IG5vdCBoYXZlIHRpbWUgY291bnRlcnMgYWxsCitzeW5jaHJvbml6ZWQsIHNvIHBhY2tldHMgdGltZS1zdGFtcGVkIGJ5IGRpZmZlcmVudCBjb3JlcyBtaWdodCBub3QgaGF2ZQorY29uc2lzdGVudCB0aW1lIHN0YW1wcy4KKy5MUAorSW4gYWRkaXRpb24sIHBhY2tldHMgdGltZS1zdGFtcGVkIGJ5IGRpZmZlcmVudCBjb3JlcyBtaWdodCBiZQordGltZS1zdGFtcGVkIGluIG9uZSBvcmRlciBhbmQgYWRkZWQgdG8gdGhlIHF1ZXVlIG9mIHBhY2tldHMgZm9yIGxpYnBjYXAKK3RvIHJlYWQgaW4gYW5vdGhlciBvcmRlciwgc28gdGltZSBzdGFtcHMgbWlnaHQgbm90IGJlIG1vbm90b25pY2FsbHkKK2luY3JlYXNpbmcuCisuTFAKK1NvbWUgY2FwdHVyZSBkZXZpY2VzIG9uIHNvbWUgcGxhdGZvcm1zIGNhbiBwcm92aWRlIHRpbWUgc3RhbXBzIGZvcgorcGFja2V0czsgdGhvc2UgdGltZSBzdGFtcHMgYXJlIHVzdWFsbHkgaGlnaC1yZXNvbHV0aW9uIHRpbWUgc3RhbXBzLCBhbmQKK2FyZSB1c3VhbGx5IGFwcGxpZWQgdG8gdGhlIHBhY2tldCB3aGVuIHRoZSBmaXJzdCBvciBsYXN0IGJpdCBvZiB0aGUKK3BhY2tldCBhcnJpdmVzLCBhbmQgYXJlIHRodXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHRpbWUgc3RhbXBzIHByb3ZpZGVkIGJ5Cit0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtLiAgVGhvc2UgdGltZSBzdGFtcHMgbWlnaHQgbm90LCBob3dldmVyLCBiZQorc3luY2hyb25pemVkIHdpdGggdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSdzIGNsb2NrLCBzbyB0aGF0LCBmb3IKK2V4YW1wbGUsIHRoZSB0aW1lIHN0YW1wIG9mIGEgcGFja2V0IG1pZ2h0IG5vdCBjb3JyZXNwb25kIHRvIHRoZSB0aW1lCitzdGFtcCBvZiBhbiBldmVudCBvbiB0aGUgaG9zdCB0cmlnZ2VyZWQgYnkgdGhlIGFycml2YWwgb2YgdGhhdCBwYWNrZXQuCisuTFAKK0RlcGVuZGluZyBvbiB0aGUgY2FwdHVyZSBkZXZpY2UgYW5kIHRoZSBzb2Z0d2FyZSBvbiB0aGUgaG9zdCwgbGlicGNhcAorbWlnaHQgYWxsb3cgZGlmZmVyZW50IHR5cGVzIG9mIHRpbWUgc3RhbXAgdG8gYmUgdXNlZC4gIFRoZQorLkJSIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMgKDNQQ0FQKQorcm91dGluZSBwcm92aWRlcywgZm9yIGEgcGFja2V0IGNhcHR1cmUgaGFuZGxlIGNyZWF0ZWQgYnkKKy5CUiBwY2FwX2NyZWF0ZSAoM1BDQVApCitidXQgbm90IHlldCBhY3RpdmF0ZWQgYnkKKy5CUiBwY2FwX2FjdGl2YXRlICgzUENBUCksCithIGxpc3Qgb2YgdGltZSBzdGFtcCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGNhcHR1cmUgZGV2aWNlIGZvciB0aGF0CitoYW5kbGUuCitUaGUgbGlzdCBtaWdodCBiZSBlbXB0eSwgaW4gd2hpY2ggY2FzZSBubyBjaG9pY2Ugb2YgdGltZSBzdGFtcCB0eXBlIGlzCitvZmZlcmVkIGZvciB0aGF0IGNhcHR1cmUgZGV2aWNlLiAgSWYgdGhlIGxpc3QgaXMgbm90IGVtcHR5LCB0aGUKKy5CUiBwY2FwX3NldF90c3RhbXBfdHlwZSAoM1BDQVApCityb3V0aW5lIGNhbiBiZSB1c2VkIGFmdGVyIGEKKy5CIHBjYXBfY3JlYXRlKCkKK2NhbGwgYW5kIGJlZm9yZSBhCisuQiBwY2FwX2FjdGl2YXRlKCkKK2NhbGwgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiB0aW1lIHN0YW1wIHRvIGJlIHVzZWQgb24gdGhlIGRldmljZS4KK1RoZSB0aW1lIHN0YW1wIHR5cGVzIGFyZSBsaXN0ZWQgaGVyZTsgdGhlIGZpcnN0IHZhbHVlIGlzIHRoZSAjZGVmaW5lIHRvCit1c2UgaW4gY29kZSwgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKKy5CIHBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUoKQorYW5kIGFjY2VwdGVkIGJ5CisuQlIgcGNhcF90c3RhbXBfbmFtZV90b192YWwoKSAuCisuUlMgNQorLlRQIDUKKy5CUiBQQ0FQX1RTVEFNUF9IT1NUICIgLSAiIGhvc3QKK1RpbWUgc3RhbXAgcHJvdmlkZWQgYnkgdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcgZG9uZS4gIFRoZQorcHJlY2lzaW9uIG9mIHRoaXMgdGltZSBzdGFtcCBpcyB1bnNwZWNpZmllZDsgaXQgbWlnaHQgb3IgbWlnaHQgbm90IGJlCitzeW5jaHJvbml6ZWQgd2l0aCB0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtJ3MgY2xvY2suCisuVFAgNQorLkJSIFBDQVBfVFNUQU1QX0hPU1RfTE9XUFJFQyAiIC0gIiBob3N0X2xvd3ByZWMKK1RpbWUgc3RhbXAgcHJvdmlkZWQgYnkgdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcgZG9uZS4gCitUaGlzIGlzIGEgbG93LXByZWNpc2lvbiB0aW1lIHN0YW1wLCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgaG9zdCBvcGVyYXRpbmcKK3N5c3RlbSdzIGNsb2NrLgorLlRQIDUKKy5CUiBQQ0FQX1RTVEFNUF9IT1NUX0hJUFJFQyAiIC0gIiBob3N0X2hpcHJlYworVGltZSBzdGFtcCBwcm92aWRlZCBieSB0aGUgaG9zdCBvbiB3aGljaCB0aGUgY2FwdHVyZSBpcyBiZWluZyBkb25lLiAKK1RoaXMgaXMgYSBoaWdoLXByZWNpc2lvbiB0aW1lIHN0YW1wOyBpdCBtaWdodCBvciBtaWdodCBub3QgYmUKK3N5bmNocm9uaXplZCB3aXRoIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyBjbG9jay4gIEl0IG1pZ2h0IGJlIG1vcmUKK2V4cGVuc2l2ZSB0byBmZXRjaCB0aGFuCisuQlIgUENBUF9UU1RBTVBfSE9TVF9MT1dQUkVDIC4KKy5UUCA1CisuQlIgUENBUF9UU1RBTVBfQURBUFRFUiAiIC0gIiBhZGFwdGVyCitUaW1lIHN0YW1wIHByb3ZpZGVkIGJ5IHRoZSBuZXR3b3JrIGFkYXB0ZXIgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcKK2RvbmUuICBUaGlzIGlzIGEgaGlnaC1wcmVjaXNpb24gdGltZSBzdGFtcCwgc3luY2hyb25pemVkIHdpdGggdGhlIGhvc3QKK29wZXJhdGluZyBzeXN0ZW0ncyBjbG9jay4KKy5UUCA1CisuQlIgUENBUF9UU1RBTVBfQURBUFRFUl9VTlNZTkNFRCAiIC0gIiBhZGFwdGVyX3Vuc3luY2VkCitUaW1lIHN0YW1wIHByb3ZpZGVkIGJ5IHRoZSBuZXR3b3JrIGFkYXB0ZXIgb24gd2hpY2ggdGhlIGNhcHR1cmUgaXMgYmVpbmcKK2RvbmUuICBUaGlzIGlzIGEgaGlnaC1wcmVjaXNpb24gdGltZSBzdGFtcDsgaXQgaXMgbm90IHN5bmNocm9uaXplZCB3aXRoCit0aGUgaG9zdCBvcGVyYXRpbmcgc3lzdGVtJ3MgY2xvY2suCisuUkUKKy5TSCBTRUUgQUxTTworcGNhcF9zZXRfdHN0YW1wX3R5cGUoM1BDQVApLAorcGNhcF9saXN0X3RzdGFtcF90eXBlcygzUENBUCksCitwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKDNQQ0FQKSwKK3BjYXBfdHN0YW1wX25hbWVfdG9fdmFsKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLXVzYi1saW51eC5jIGIvbGlicGNhcC0xLjMuMC9wY2FwLXVzYi1saW51eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjQzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAtdXNiLWxpbnV4LmMKQEAgLTAsMCArMSw4ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUGFvbG8gQWJlbmkgKEl0YWx5KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVVNCIHNuaWZmaW5nIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXggcGxhdGZvcm0KKyAqIEJ5IFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4KKyAqIE1vZGlmaWNhdGlvbnM6IEtyaXMgS2F0dGVyam9obiA8a2F0dGVyam9obkBnbWFpbC5jb20+CisgKgorICovCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXVzYi1saW51eC5jLHYgMS4zMyAyMDA4LTEyLTIzIDIxOjM4OjUwIGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKyAKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisjaW5jbHVkZSAicGNhcC11c2ItbGludXguaCIKKyNpbmNsdWRlICJwY2FwL3VzYi5oIgorCisjaWZkZWYgTkVFRF9TVFJFUlJPUl9ICisjaW5jbHVkZSAic3RyZXJyb3IuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpZmRlZiBIQVZFX0xJTlVYX1VTQkRFVklDRV9GU19ICisvKgorICogV2UgbWlnaHQgbmVlZCA8bGludXgvY29tcGlsZXIuaD4gdG8gZGVmaW5lIF9fdXNlciBmb3IKKyAqIDxsaW51eC91c2JkZXZpY2VfZnMuaD4uCisgKi8KKyNpZmRlZiBIQVZFX0xJTlVYX0NPTVBJTEVSX0gKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2VuZGlmIC8qIEhBVkVfTElOVVhfQ09NUElMRVJfSCAqLworI2luY2x1ZGUgPGxpbnV4L3VzYmRldmljZV9mcy5oPgorI2VuZGlmIC8qIEhBVkVfTElOVVhfVVNCREVWSUNFX0ZTX0ggKi8KKworI2RlZmluZSBVU0JfSUZBQ0UgInVzYm1vbiIKKyNkZWZpbmUgVVNCX1RFWFRfRElSX09MRCAiL3N5cy9rZXJuZWwvZGVidWcvdXNibW9uIgorI2RlZmluZSBVU0JfVEVYVF9ESVIgIi9zeXMva2VybmVsL2RlYnVnL3VzYi91c2Jtb24iCisjZGVmaW5lIFNZU19VU0JfQlVTX0RJUiAiL3N5cy9idXMvdXNiL2RldmljZXMiCisjZGVmaW5lIFBST0NfVVNCX0JVU19ESVIgIi9wcm9jL2J1cy91c2IiCisjZGVmaW5lIFVTQl9MSU5FX0xFTiA0MDk2CisKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIGh0b2xzKHMpIHMKKyNkZWZpbmUgaHRvbGwobCkgbAorI2RlZmluZSBodG9sNjQobGwpIGxsCisjZWxzZQorI2RlZmluZSBodG9scyhzKSBic3dhcF8xNihzKQorI2RlZmluZSBodG9sbChsKSBic3dhcF8zMihsKQorI2RlZmluZSBodG9sNjQobGwpIGJzd2FwXzY0KGxsKQorI2VuZGlmCisKK3N0cnVjdCBtb25fYmluX3N0YXRzIHsKKwl1X2ludDMyX3QgcXVldWVkOworCXVfaW50MzJfdCBkcm9wcGVkOworfTsKKworc3RydWN0IG1vbl9iaW5fZ2V0IHsKKwlwY2FwX3VzYl9oZWFkZXIgKmhkcjsKKwl2b2lkICpkYXRhOworCXNpemVfdCBkYXRhX2xlbjsgICAvKiBMZW5ndGggb2YgZGF0YSAoY2FuIGJlIHplcm8pICovCit9OworCitzdHJ1Y3QgbW9uX2Jpbl9tZmV0Y2ggeworCWludDMyX3QgKm9mZnZlYzsgICAvKiBWZWN0b3Igb2YgZXZlbnRzIGZldGNoZWQgKi8KKwlpbnQzMl90IG5mZXRjaDsgICAgLyogTnVtYmVyIG9mIGV2ZW50cyB0byBmZXRjaCAob3V0OiBmZXRjaGVkKSAqLworCWludDMyX3QgbmZsdXNoOyAgICAvKiBOdW1iZXIgb2YgZXZlbnRzIHRvIGZsdXNoICovCit9OworCisjZGVmaW5lIE1PTl9JT0NfTUFHSUMgMHg5MgorCisjZGVmaW5lIE1PTl9JT0NRX1VSQl9MRU4gX0lPKE1PTl9JT0NfTUFHSUMsIDEpCisjZGVmaW5lIE1PTl9JT0NYX1VSQiAgX0lPV1IoTU9OX0lPQ19NQUdJQywgMiwgc3RydWN0IG1vbl9iaW5faGRyKQorI2RlZmluZSBNT05fSU9DR19TVEFUUyBfSU9SKE1PTl9JT0NfTUFHSUMsIDMsIHN0cnVjdCBtb25fYmluX3N0YXRzKQorI2RlZmluZSBNT05fSU9DVF9SSU5HX1NJWkUgX0lPKE1PTl9JT0NfTUFHSUMsIDQpCisjZGVmaW5lIE1PTl9JT0NRX1JJTkdfU0laRSBfSU8oTU9OX0lPQ19NQUdJQywgNSkKKyNkZWZpbmUgTU9OX0lPQ1hfR0VUICAgX0lPVyhNT05fSU9DX01BR0lDLCA2LCBzdHJ1Y3QgbW9uX2Jpbl9nZXQpCisjZGVmaW5lIE1PTl9JT0NYX01GRVRDSCBfSU9XUihNT05fSU9DX01BR0lDLCA3LCBzdHJ1Y3QgbW9uX2Jpbl9tZmV0Y2gpCisjZGVmaW5lIE1PTl9JT0NIX01GTFVTSCBfSU8oTU9OX0lPQ19NQUdJQywgOCkKKworI2RlZmluZSBNT05fQklOX1NFVFVQIAkweDEgLyogc2V0dXAgaGRyIGlzIHByZXNlbnQqLworI2RlZmluZSBNT05fQklOX1NFVFVQX1pFUk8gCTB4MiAvKiBzZXR1cCBidWZmZXIgaXMgbm90IGF2YWlsYWJsZSAqLworI2RlZmluZSBNT05fQklOX0RBVEFfWkVSTyAJMHg0IC8qIGRhdGEgYnVmZmVyIGlzIG5vdCBhdmFpbGFibGUgKi8KKyNkZWZpbmUgTU9OX0JJTl9FUlJPUiAJMHg4CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0YXRpYyBpbnQgdXNiX2FjdGl2YXRlKHBjYXBfdCAqKTsKK3N0YXRpYyBpbnQgdXNiX3N0YXRzX2xpbnV4KHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9zdGF0ICopOworc3RhdGljIGludCB1c2Jfc3RhdHNfbGludXhfYmluKHBjYXBfdCAqLCBzdHJ1Y3QgcGNhcF9zdGF0ICopOworc3RhdGljIGludCB1c2JfcmVhZF9saW51eChwY2FwX3QgKiwgaW50ICwgcGNhcF9oYW5kbGVyICwgdV9jaGFyICopOworc3RhdGljIGludCB1c2JfcmVhZF9saW51eF9iaW4ocGNhcF90ICosIGludCAsIHBjYXBfaGFuZGxlciAsIHVfY2hhciAqKTsKK3N0YXRpYyBpbnQgdXNiX3JlYWRfbGludXhfbW1hcChwY2FwX3QgKiwgaW50ICwgcGNhcF9oYW5kbGVyICwgdV9jaGFyICopOworc3RhdGljIGludCB1c2JfaW5qZWN0X2xpbnV4KHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitzdGF0aWMgaW50IHVzYl9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworc3RhdGljIHZvaWQgdXNiX2NsZWFudXBfbGludXhfbW1hcChwY2FwX3QgKik7CisKKy8qIGZhY2lsaXR5IHRvIGFkZCBhbiBVU0IgZGV2aWNlIHRvIHRoZSBkZXZpY2UgbGlzdCovCitzdGF0aWMgaW50IAordXNiX2Rldl9hZGQocGNhcF9pZl90KiogYWxsZGV2c3AsIGludCBuLCBjaGFyICplcnJfc3RyKQoreworCWNoYXIgZGV2X25hbWVbMTBdOworCWNoYXIgZGV2X2Rlc2NyWzMwXTsgCisJc25wcmludGYoZGV2X25hbWUsIDEwLCBVU0JfSUZBQ0UiJWQiLCBuKTsKKwlzbnByaW50ZihkZXZfZGVzY3IsIDMwLCAiVVNCIGJ1cyBudW1iZXIgJWQiLCBuKTsKKworCWlmIChwY2FwX2FkZF9pZihhbGxkZXZzcCwgZGV2X25hbWUsIDAsIAorCSAgICBkZXZfZGVzY3IsIGVycl9zdHIpIDwgMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOyAKK30KKworaW50IAordXNiX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJfc3RyKQoreworCXN0cnVjdCBkaXJlbnQqIGRhdGE7CisJaW50IHJldCA9IDA7CisJRElSKiBkaXI7CisJaW50IG47CisJY2hhciogbmFtZTsKKwlzaXplX3QgbGVuOworCisJLyogdHJ5IHNjYW5uaW5nIHN5c2ZzIHVzYiBidXMgZGlyZWN0b3J5ICovCisJZGlyID0gb3BlbmRpcihTWVNfVVNCX0JVU19ESVIpOworCWlmIChkaXIgIT0gTlVMTCkgeworCQl3aGlsZSAoKHJldCA9PSAwKSAmJiAoKGRhdGEgPSByZWFkZGlyKGRpcikpICE9IDApKSB7CisJCQluYW1lID0gZGF0YS0+ZF9uYW1lOworCisJCQlpZiAoc3RybmNtcChuYW1lLCAidXNiIiwgMykgIT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNzY2FuZigmbmFtZVszXSwgIiVkIiwgJm4pID09IDApIAorCQkJCWNvbnRpbnVlOworCisJCQlyZXQgPSB1c2JfZGV2X2FkZChhbGxkZXZzcCwgbiwgZXJyX3N0cik7CisJCX0KKworCQljbG9zZWRpcihkaXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHRoYXQgZGlkbid0IHdvcms7IHRyeSBzY2FubmluZyBwcm9jZnMgdXNiIGJ1cyBkaXJlY3RvcnkgKi8KKwlkaXIgPSBvcGVuZGlyKFBST0NfVVNCX0JVU19ESVIpOworCWlmIChkaXIgIT0gTlVMTCkgeworCQl3aGlsZSAoKHJldCA9PSAwKSAmJiAoKGRhdGEgPSByZWFkZGlyKGRpcikpICE9IDApKSB7CisJCQluYW1lID0gZGF0YS0+ZF9uYW1lOworCQkJbGVuID0gc3RybGVuKG5hbWUpOworCisJCQkvKiBpZiB0aGlzIGZpbGUgbmFtZSBkb2VzIG5vdCBlbmQgd2l0aCBhIG51bWJlciBpdCdzIG5vdCBvZiBvdXIgaW50ZXJlc3QgKi8KKwkJCWlmICgobGVuIDwgMSkgfHwgIWlzZGlnaXQobmFtZVstLWxlbl0pKQorCQkJCWNvbnRpbnVlOworCQkJd2hpbGUgKGlzZGlnaXQobmFtZVstLWxlbl0pKTsKKwkJCWlmIChzc2NhbmYoJm5hbWVbbGVuKzFdLCAiJWQiLCAmbikgIT0gMSkgCisJCQkJY29udGludWU7CisKKwkJCXJldCA9IHVzYl9kZXZfYWRkKGFsbGRldnNwLCBuLCBlcnJfc3RyKTsKKwkJfQorCisJCWNsb3NlZGlyKGRpcik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbmVpdGhlciBvZiB0aGVtIHdvcmtlZCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgCitpbnQgdXNiX21tYXAocGNhcF90KiBoYW5kbGUpCit7CisJaW50IGxlbiA9IGlvY3RsKGhhbmRsZS0+ZmQsIE1PTl9JT0NRX1JJTkdfU0laRSk7CisJaWYgKGxlbiA8IDApIAorCQlyZXR1cm4gMDsKKworCWhhbmRsZS0+bWQubW1hcGJ1ZmxlbiA9IGxlbjsKKwloYW5kbGUtPm1kLm1tYXBidWYgPSBtbWFwKDAsIGhhbmRsZS0+bWQubW1hcGJ1ZmxlbiwgUFJPVF9SRUFELAorCSAgICBNQVBfU0hBUkVELCBoYW5kbGUtPmZkLCAwKTsKKwlyZXR1cm4gaGFuZGxlLT5tZC5tbWFwYnVmICE9IE1BUF9GQUlMRUQ7Cit9CisKKyNkZWZpbmUgQ1RSTF9USU1FT1VUICAgICg1KjEwMDApICAgICAgICAvKiBtaWxsaXNlY29uZHMgKi8KKworI2RlZmluZSBVU0JfRElSX0lOCQkweDgwCisjZGVmaW5lIFVTQl9UWVBFX1NUQU5EQVJECTB4MDAKKyNkZWZpbmUgVVNCX1JFQ0lQX0RFVklDRQkweDAwCisKKyNkZWZpbmUgVVNCX1JFUV9HRVRfREVTQ1JJUFRPUgk2CisKKyNkZWZpbmUgVVNCX0RUX0RFVklDRQkJMQorCisvKiBwcm9iZSB0aGUgZGVzY3JpcHRvcnMgb2YgdGhlIGRldmljZXMgYXR0YWNoZWQgdG8gdGhlIGJ1cyAqLworLyogdGhlIGRlc2NyaXB0b3JzIHdpbGwgZW5kIHVwIGluIHRoZSBjYXB0dXJlZCBwYWNrZXQgc3RyZWFtICovCisvKiBhbmQgYmUgZGVjb2RlZCBieSBleHRlcm5hbCBhcHBzIGxpa2Ugd2lyZXNoYXJrICovCisvKiB3aXRob3V0IHRoZXNlIGlkZW50aWZ5aW5nIHByb2JlcyBwYWNrZXQgZGF0YSBjYW4ndCBiZSBmdWxseSBkZWNvZGVkICovCitzdGF0aWMgdm9pZAorcHJvYmVfZGV2aWNlcyhpbnQgYnVzKQoreworCXN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgY3RybDsKKwlzdHJ1Y3QgZGlyZW50KiBkYXRhOworCWludCByZXQgPSAwOworCWNoYXIgYnVmWzQwXTsKKwlESVIqIGRpcjsKKworCS8qIHNjYW4gdXNiIGJ1cyBkaXJlY3RvcmllcyBmb3IgZGV2aWNlIG5vZGVzICovCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9kZXYvYnVzL3VzYi8lMDNkIiwgYnVzKTsKKwlkaXIgPSBvcGVuZGlyKGJ1Zik7CisJaWYgKCFkaXIpCisJCXJldHVybjsKKworCXdoaWxlICgocmV0ID49IDApICYmICgoZGF0YSA9IHJlYWRkaXIoZGlyKSkgIT0gMCkpIHsKKwkJaW50IGZkOworCQljaGFyKiBuYW1lID0gZGF0YS0+ZF9uYW1lOworCisJCWlmIChuYW1lWzBdID09ICcuJykKKwkJCWNvbnRpbnVlOworCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIvZGV2L2J1cy91c2IvJTAzZC8lcyIsIGJ1cywgZGF0YS0+ZF9uYW1lKTsKKwkJCisJCWZkID0gb3BlbihidWYsIE9fUkRXUik7CisJCWlmIChmZCA9PSAtMSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFNpZ2guICBEaWZmZXJlbnQga2VybmVscyBoYXZlIGRpZmZlcmVudCBtZW1iZXIgbmFtZXMKKwkJICogZm9yIHRoaXMgc3RydWN0dXJlLgorCQkgKi8KKyNpZmRlZiBIQVZFX1VTQkRFVkZTX0NUUkxUUkFOU0ZFUl9CUkVRVUVTVFRZUEUKKwkJY3RybC5iUmVxdWVzdFR5cGUgPSBVU0JfRElSX0lOIHwgVVNCX1RZUEVfU1RBTkRBUkQgfCBVU0JfUkVDSVBfREVWSUNFOworCQljdHJsLmJSZXF1ZXN0ID0gVVNCX1JFUV9HRVRfREVTQ1JJUFRPUjsKKwkJY3RybC53VmFsdWUgPSBVU0JfRFRfREVWSUNFIDw8IDg7CisJCWN0cmwud0luZGV4ID0gMDsKKyAJCWN0cmwud0xlbmd0aCA9IHNpemVvZihidWYpOworI2Vsc2UKKwkJY3RybC5yZXF1ZXN0dHlwZSA9IFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9TVEFOREFSRCB8IFVTQl9SRUNJUF9ERVZJQ0U7CisJCWN0cmwucmVxdWVzdCA9IFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I7CisJCWN0cmwudmFsdWUgPSBVU0JfRFRfREVWSUNFIDw8IDg7CisJCWN0cmwuaW5kZXggPSAwOworIAkJY3RybC5sZW5ndGggPSBzaXplb2YoYnVmKTsKKyNlbmRpZgorCQljdHJsLmRhdGEgPSBidWY7CisJCWN0cmwudGltZW91dCA9IENUUkxfVElNRU9VVDsKKworCQlyZXQgPSBpb2N0bChmZCwgVVNCREVWRlNfQ09OVFJPTCwgJmN0cmwpOworCisJCWNsb3NlKGZkKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKK30KKworcGNhcF90ICoKK3VzYl9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oZGV2aWNlLCBlYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCisJcC0+YWN0aXZhdGVfb3AgPSB1c2JfYWN0aXZhdGU7CisJcmV0dXJuIChwKTsKK30KKworc3RhdGljIGludAordXNiX2FjdGl2YXRlKHBjYXBfdCogaGFuZGxlKQoreworCWNoYXIgCQlmdWxsX3BhdGhbVVNCX0xJTkVfTEVOXTsKKworCS8qIEluaXRpYWxpemUgc29tZSBjb21wb25lbnRzIG9mIHRoZSBwY2FwIHN0cnVjdHVyZS4gKi8KKwloYW5kbGUtPmJ1ZnNpemUgPSBoYW5kbGUtPnNuYXBzaG90OworCWhhbmRsZS0+b2Zmc2V0ID0gMDsKKwloYW5kbGUtPmxpbmt0eXBlID0gRExUX1VTQl9MSU5VWDsKKworCWhhbmRsZS0+aW5qZWN0X29wID0gdXNiX2luamVjdF9saW51eDsKKwloYW5kbGUtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07IC8qIG5vIGtlcm5lbCBmaWx0ZXJpbmcgKi8KKwloYW5kbGUtPnNldGRpcmVjdGlvbl9vcCA9IHVzYl9zZXRkaXJlY3Rpb25fbGludXg7CisJaGFuZGxlLT5zZXRfZGF0YWxpbmtfb3AgPSBOVUxMOwkvKiBjYW4ndCBjaGFuZ2UgZGF0YSBsaW5rIHR5cGUgKi8KKwloYW5kbGUtPmdldG5vbmJsb2NrX29wID0gcGNhcF9nZXRub25ibG9ja19mZDsKKwloYW5kbGUtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja19mZDsKKworCS8qZ2V0IHVzYiBidXMgaW5kZXggZnJvbSBkZXZpY2UgbmFtZSAqLworCWlmIChzc2NhbmYoaGFuZGxlLT5vcHQuc291cmNlLCBVU0JfSUZBQ0UiJWQiLCAmaGFuZGxlLT5tZC5pZmluZGV4KSAhPSAxKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiQ2FuJ3QgZ2V0IFVTQiBidXMgaW5kZXggZnJvbSAlcyIsIGhhbmRsZS0+b3B0LnNvdXJjZSk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKworCS8qbm93IHNlbGVjdCB0aGUgcmVhZCBtZXRob2Q6IHRyeSB0byBvcGVuIGJpbmFyeSBpbnRlcmZhY2UgKi8KKwlzbnByaW50ZihmdWxsX3BhdGgsIFVTQl9MSU5FX0xFTiwgTElOVVhfVVNCX01PTl9ERVYiJWQiLCBoYW5kbGUtPm1kLmlmaW5kZXgpOyAgCisJaGFuZGxlLT5mZCA9IG9wZW4oZnVsbF9wYXRoLCBPX1JET05MWSwgMCk7CisJaWYgKGhhbmRsZS0+ZmQgPj0gMCkKKwl7CisJCWlmIChoYW5kbGUtPm9wdC5yZm1vbikgeworCQkJLyoKKwkJCSAqIE1vbml0b3IgbW9kZSBkb2Vzbid0IGFwcGx5IHRvIFVTQiBkZXZpY2VzLgorCQkJICovCisJCQljbG9zZShoYW5kbGUtPmZkKTsKKwkJCXJldHVybiBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUDsKKwkJfQorCisJCS8qIGJpbmFyeSBhcGkgaXMgYXZhaWxhYmxlLCB0cnkgdG8gdXNlIGZhc3QgbW1hcCBhY2Nlc3MgKi8KKwkJaWYgKHVzYl9tbWFwKGhhbmRsZSkpIHsKKwkJCWhhbmRsZS0+bGlua3R5cGUgPSBETFRfVVNCX0xJTlVYX01NQVBQRUQ7CisJCQloYW5kbGUtPnN0YXRzX29wID0gdXNiX3N0YXRzX2xpbnV4X2JpbjsKKwkJCWhhbmRsZS0+cmVhZF9vcCA9IHVzYl9yZWFkX2xpbnV4X21tYXA7CisJCQloYW5kbGUtPmNsZWFudXBfb3AgPSB1c2JfY2xlYW51cF9saW51eF9tbWFwOworCQkJcHJvYmVfZGV2aWNlcyhoYW5kbGUtPm1kLmlmaW5kZXgpOworCisJCQkvKgorCQkJICogImhhbmRsZS0+ZmQiIGlzIGEgcmVhbCBmaWxlLCBzbyAic2VsZWN0KCkiIGFuZAorCQkJICogInBvbGwoKSIgd29yayBvbiBpdC4KKwkJCSAqLworCQkJaGFuZGxlLT5zZWxlY3RhYmxlX2ZkID0gaGFuZGxlLT5mZDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogY2FuJ3QgbW1hcCwgdXNlIHBsYWluIGJpbmFyeSBpbnRlcmZhY2UgYWNjZXNzICovCisJCWhhbmRsZS0+c3RhdHNfb3AgPSB1c2Jfc3RhdHNfbGludXhfYmluOworCQloYW5kbGUtPnJlYWRfb3AgPSB1c2JfcmVhZF9saW51eF9iaW47CisJCXByb2JlX2RldmljZXMoaGFuZGxlLT5tZC5pZmluZGV4KTsKKwl9CisJZWxzZSB7CisJCS8qQmluYXJ5IGludGVyZmFjZSBub3QgYXZhaWxhYmxlLCB0cnkgb3BlbiB0ZXh0IGludGVyZmFjZSAqLworCQlzbnByaW50ZihmdWxsX3BhdGgsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSIi8lZHQiLCBoYW5kbGUtPm1kLmlmaW5kZXgpOyAgCisJCWhhbmRsZS0+ZmQgPSBvcGVuKGZ1bGxfcGF0aCwgT19SRE9OTFksIDApOworCQlpZiAoaGFuZGxlLT5mZCA8IDApCisJCXsKKwkJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBOb3QgZm91bmQgYXQgdGhlIG5ldyBsb2NhdGlvbjsgdHJ5CisJCQkJICogdGhlIG9sZCBsb2NhdGlvbi4KKwkJCQkgKi8KKwkJCQlzbnByaW50ZihmdWxsX3BhdGgsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSX09MRCIvJWR0IiwgaGFuZGxlLT5tZC5pZmluZGV4KTsgIAorCQkJCWhhbmRsZS0+ZmQgPSBvcGVuKGZ1bGxfcGF0aCwgT19SRE9OTFksIDApOworCQkJfQorCQkJaWYgKGhhbmRsZS0+ZmQgPCAwKSB7CisJCQkJLyogbm8gbW9yZSBmYWxsYmFjaywgZ2l2ZSBpdCB1cCovCisJCQkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJCSJDYW4ndCBvcGVuIFVTQiBidXMgZmlsZSAlczogJXMiLCBmdWxsX3BhdGgsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIFBDQVBfRVJST1I7CisJCQl9CisJCX0KKworCQlpZiAoaGFuZGxlLT5vcHQucmZtb24pIHsKKwkJCS8qCisJCQkgKiBNb25pdG9yIG1vZGUgZG9lc24ndCBhcHBseSB0byBVU0IgZGV2aWNlcy4KKwkJCSAqLworCQkJY2xvc2UoaGFuZGxlLT5mZCk7CisJCQlyZXR1cm4gUENBUF9FUlJPUl9SRk1PTl9OT1RTVVA7CisJCX0KKworCQloYW5kbGUtPnN0YXRzX29wID0gdXNiX3N0YXRzX2xpbnV4OworCQloYW5kbGUtPnJlYWRfb3AgPSB1c2JfcmVhZF9saW51eDsKKwl9CisKKwkvKgorCSAqICJoYW5kbGUtPmZkIiBpcyBhIHJlYWwgZmlsZSwgc28gInNlbGVjdCgpIiBhbmQgInBvbGwoKSIKKwkgKiB3b3JrIG9uIGl0LgorCSAqLworCWhhbmRsZS0+c2VsZWN0YWJsZV9mZCA9IGhhbmRsZS0+ZmQ7CisKKwkvKiBmb3IgcGxhaW4gYmluYXJ5IGFjY2VzcyBhbmQgdGV4dCBhY2Nlc3Mgd2UgbmVlZCB0byBhbGxvY2F0ZSB0aGUgcmVhZAorCSAqIGJ1ZmZlciAqLworCWhhbmRsZS0+YnVmZmVyID0gbWFsbG9jKGhhbmRsZS0+YnVmc2l6ZSk7CisJaWYgKCFoYW5kbGUtPmJ1ZmZlcikgeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoaGFuZGxlLT5mZCk7CisJCXJldHVybiBQQ0FQX0VSUk9SOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgCithc2NpaV90b19pbnQoY2hhciBjKQoreworCXJldHVybiBjIDwgJ0EnID8gYy0gJzAnOiAoKGM8J2EnKSA/IGMgLSAnQScgKyAxMDogYy0nYScrMTApOworfQorCisvKgorICogc2VlIDxsaW51eC1rZXJuZWwtc291cmNlPi9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0IGFuZCAKKyAqIDxsaW51eC1rZXJuZWwtc291cmNlPi9kcml2ZXJzL3VzYi9tb24vbW9uX3RleHQuYyBmb3IgdXJiIHN0cmluZyAKKyAqIGZvcm1hdCBkZXNjcmlwdGlvbgorICovCitzdGF0aWMgaW50Cit1c2JfcmVhZF9saW51eChwY2FwX3QgKmhhbmRsZSwgaW50IG1heF9wYWNrZXRzLCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwkvKiBzZWU6CisJKiAvdXNyL3NyYy9saW51eC9Eb2N1bWVudGF0aW9uL3VzYi91c2Jtb24udHh0IAorCSogZm9yIG1lc3NhZ2UgZm9ybWF0CisJKi8KKwl1bnNpZ25lZCB0aW1lc3RhbXA7CisJaW50IHRhZywgY250LCBlcF9udW0sIGRldl9hZGRyLCBkdW1teSwgcmV0LCB1cmJfbGVuLCBkYXRhX2xlbjsKKwljaGFyIGV0eXBlLCBwaXBlaWQxLCBwaXBlaWQyLCBzdGF0dXNbMTZdLCB1cmJfdGFnLCBsaW5lW1VTQl9MSU5FX0xFTl07CisJY2hhciAqc3RyaW5nID0gbGluZTsKKwl1X2NoYXIgKiByYXdkYXRhID0gaGFuZGxlLT5idWZmZXI7CisJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGg7CisJcGNhcF91c2JfaGVhZGVyKiB1aGRyID0gKHBjYXBfdXNiX2hlYWRlciopaGFuZGxlLT5idWZmZXI7CisJdV9jaGFyIHVyYl90cmFuc2Zlcj0wOworCWludCBpbmNvbWluZz0wOworCisJLyogaWdub3JlIGludGVycnVwdCBzeXN0ZW0gY2FsbCBlcnJvcnMgKi8KKwlkbyB7CisJCXJldCA9IHJlYWQoaGFuZGxlLT5mZCwgbGluZSwgVVNCX0xJTkVfTEVOIC0gMSk7CisJCWlmIChoYW5kbGUtPmJyZWFrX2xvb3ApCisJCXsKKwkJCWhhbmRsZS0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gLTI7CisJCX0KKwl9IHdoaWxlICgocmV0ID09IC0xKSAmJiAoZXJybm8gPT0gRUlOVFIpKTsKKwlpZiAocmV0IDwgMCkKKwl7CisJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQlyZXR1cm4gMDsJLyogbm8gZGF0YSB0aGVyZSAqLworCisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIkNhbid0IHJlYWQgZnJvbSBmZCAlZDogJXMiLCBoYW5kbGUtPmZkLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogcmVhZCB1cmIgaGVhZGVyOyAlbiBhcmd1bWVudCBtYXkgaW5jcmVtZW50IHJldHVybiB2YWx1ZSwgYnV0IGl0J3MgCisJKiBub3QgbWFuZGF0b3J5LCBzbyBkb2VzIG5vdCBjb3VudCBvbiBpdCovCisJc3RyaW5nW3JldF0gPSAwOworCXJldCA9IHNzY2FuZihzdHJpbmcsICIleCAlZCAlYyAlYyVjOiVkOiVkICVzJW4iLCAmdGFnLCAmdGltZXN0YW1wLCAmZXR5cGUsIAorCQkmcGlwZWlkMSwgJnBpcGVpZDIsICZkZXZfYWRkciwgJmVwX251bSwgc3RhdHVzLCAKKwkJJmNudCk7CisJaWYgKHJldCA8IDgpCisJeworCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJDYW4ndCBwYXJzZSBVU0IgYnVzIG1lc3NhZ2UgJyVzJywgdG9vIGZldyB0b2tlbnMgKGV4cGVjdGVkIDggZ290ICVkKSIsCisJCSAgICBzdHJpbmcsIHJldCk7CisJCXJldHVybiAtMTsKKwl9CisJdWhkci0+aWQgPSB0YWc7CisJdWhkci0+ZGV2aWNlX2FkZHJlc3MgPSBkZXZfYWRkcjsKKwl1aGRyLT5idXNfaWQgPSBoYW5kbGUtPm1kLmlmaW5kZXg7CisJdWhkci0+c3RhdHVzID0gMDsKKwlzdHJpbmcgKz0gY250OworCisJLyogZG9uJ3QgdXNlIHVzYm1vbiBwcm92aWRlZCB0aW1lc3RhbXAsIHNpbmNlIGl0IGhhdmUgbG93IHByZWNpc2lvbiovCisJaWYgKGdldHRpbWVvZmRheSgmcGt0aC50cywgTlVMTCkgPCAwKSAKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJIkNhbid0IGdldCB0aW1lc3RhbXAgZm9yIG1lc3NhZ2UgJyVzJyAlZDolcyIsIAorCQkJc3RyaW5nLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwl1aGRyLT50c19zZWMgPSBwa3RoLnRzLnR2X3NlYzsKKwl1aGRyLT50c191c2VjID0gcGt0aC50cy50dl91c2VjOworCisJLyogcGFyc2UgZW5kcG9pbnQgaW5mb3JtYXRpb24gKi8KKwlpZiAocGlwZWlkMSA9PSAnQycpCisJCXVyYl90cmFuc2ZlciA9IFVSQl9DT05UUk9MOworCWVsc2UgaWYgKHBpcGVpZDEgPT0gJ1onKQorCQl1cmJfdHJhbnNmZXIgPSBVUkJfSVNPQ0hST05PVVM7CisJZWxzZSBpZiAocGlwZWlkMSA9PSAnSScpCisJCXVyYl90cmFuc2ZlciA9IFVSQl9JTlRFUlJVUFQ7CisJZWxzZSBpZiAocGlwZWlkMSA9PSAnQicpCisJCXVyYl90cmFuc2ZlciA9IFVSQl9CVUxLOworCWlmIChwaXBlaWQyID09ICdpJykgeworCQllcF9udW0gfD0gVVJCX1RSQU5TRkVSX0lOOworCQlpbmNvbWluZyA9IDE7CisJfQorCWlmIChldHlwZSA9PSAnQycpCisJCWluY29taW5nID0gIWluY29taW5nOworCisJLyogZGlyZWN0aW9uIGNoZWNrKi8KKwlpZiAoaW5jb21pbmcpCisJeworCQlpZiAoaGFuZGxlLT5kaXJlY3Rpb24gPT0gUENBUF9EX09VVCkKKwkJCXJldHVybiAwOworCX0KKwllbHNlCisJCWlmIChoYW5kbGUtPmRpcmVjdGlvbiA9PSBQQ0FQX0RfSU4pCisJCQlyZXR1cm4gMDsKKwl1aGRyLT5ldmVudF90eXBlID0gZXR5cGU7CisJdWhkci0+dHJhbnNmZXJfdHlwZSA9IHVyYl90cmFuc2ZlcjsKKwl1aGRyLT5lbmRwb2ludF9udW1iZXIgPSBlcF9udW07CisJcGt0aC5jYXBsZW4gPSBzaXplb2YocGNhcF91c2JfaGVhZGVyKTsKKwlyYXdkYXRhICs9IHNpemVvZihwY2FwX3VzYl9oZWFkZXIpOworCisJLyogY2hlY2sgaWYgdGhpcyBpcyBhIHNldHVwIHBhY2tldCAqLworCXJldCA9IHNzY2FuZihzdGF0dXMsICIlZCIsICZkdW1teSk7CisJaWYgKHJldCAhPSAxKQorCXsKKwkJLyogdGhpcyBhIHNldHVwIHBhY2tldCwgc2V0dXAgZGF0YSBjYW4gYmUgZmlsbGVkIHdpdGggdW5kZXJzY29yZSBpZgorCQkqIHVzYm1vbiBoYXMgbm90IGJlZW4gYWJsZSB0byByZWFkIHRoZW0sIHNvIHdlIG11c3QgcGFyc2UgdGhpcyBmaWVsZHMgYXMgCisJCSogc3RyaW5ncyAqLworCQlwY2FwX3VzYl9zZXR1cCogc2hkcjsKKwkJY2hhciBzdHIxWzNdLCBzdHIyWzNdLCBzdHIzWzVdLCBzdHI0WzVdLCBzdHI1WzVdOworCQlyZXQgPSBzc2NhbmYoc3RyaW5nLCAiJXMgJXMgJXMgJXMgJXMlbiIsIHN0cjEsIHN0cjIsIHN0cjMsIHN0cjQsIAorCQlzdHI1LCAmY250KTsKKwkJaWYgKHJldCA8IDUpCisJCXsKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSJDYW4ndCBwYXJzZSBVU0IgYnVzIG1lc3NhZ2UgJyVzJywgdG9vIGZldyB0b2tlbnMgKGV4cGVjdGVkIDUgZ290ICVkKSIsCisJCQkJc3RyaW5nLCByZXQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXN0cmluZyArPSBjbnQ7CisKKwkJLyogdHJ5IHRvIGNvbnZlcnQgdG8gY29ycmVzcG9uZGluZyBpbnRlZ2VyICovCisJCXNoZHIgPSAmdWhkci0+c2V0dXA7CisJCXNoZHItPmJtUmVxdWVzdFR5cGUgPSBzdHJ0b3VsKHN0cjEsIDAsIDE2KTsKKwkJc2hkci0+YlJlcXVlc3QgPSBzdHJ0b3VsKHN0cjIsIDAsIDE2KTsKKwkJc2hkci0+d1ZhbHVlID0gaHRvbHMoc3RydG91bChzdHIzLCAwLCAxNikpOworCQlzaGRyLT53SW5kZXggPSBodG9scyhzdHJ0b3VsKHN0cjQsIDAsIDE2KSk7CisJCXNoZHItPndMZW5ndGggPSBodG9scyhzdHJ0b3VsKHN0cjUsIDAsIDE2KSk7CisKKwkJdWhkci0+c2V0dXBfZmxhZyA9IDA7CisJfQorCWVsc2UgCisJCXVoZHItPnNldHVwX2ZsYWcgPSAxOworCisJLyogcmVhZCB1cmIgZGF0YSAqLworCXJldCA9IHNzY2FuZihzdHJpbmcsICIgJWQlbiIsICZ1cmJfbGVuLCAmY250KTsKKwlpZiAocmV0IDwgMSkKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICJDYW4ndCBwYXJzZSB1cmIgbGVuZ3RoIGZyb20gJyVzJyIsIHN0cmluZyk7CisJCXJldHVybiAtMTsKKwl9CisJc3RyaW5nICs9IGNudDsKKworCS8qIHVyYiB0YWcgaXMgbm90IHByZXNlbnQgaWYgdXJiIGxlbmd0aCBpcyAwLCBzbyB3ZSBjYW4gc3RvcCBoZXJlIAorCSAqIHRleHQgcGFyc2luZyAqLworCXBrdGgubGVuID0gdXJiX2xlbitwa3RoLmNhcGxlbjsKKwl1aGRyLT51cmJfbGVuID0gdXJiX2xlbjsKKwl1aGRyLT5kYXRhX2ZsYWcgPSAxOworCWRhdGFfbGVuID0gMDsKKwlpZiAodWhkci0+dXJiX2xlbiA9PSAwKQorCQlnb3RvIGdvdDsKKworCS8qIGNoZWNrIGZvciBkYXRhIHByZXNlbmNlOyBkYXRhIGlzIHByZXNlbnQgaWYgYW5kIG9ubHkgaWYgdXJiIHRhZyBpcyAnPScgKi8KKwlpZiAoc3NjYW5mKHN0cmluZywgIiAlYyIsICZ1cmJfdGFnKSAhPSAxKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiQ2FuJ3QgcGFyc2UgdXJiIHRhZyBmcm9tICclcyciLCBzdHJpbmcpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHVyYl90YWcgIT0gJz0nKSAKKwkJZ290byBnb3Q7CisKKwkvKiBza2lwIHVyYiB0YWcgYW5kIGZvbGxvd2luZyBzcGFjZSAqLworCXN0cmluZyArPSAzOworCisJLyogaWYgd2UgcmVhY2ggdGhpcyBwb2ludCB3ZSBnb3Qgc29tZSB1cmIgZGF0YSovCisJdWhkci0+ZGF0YV9mbGFnID0gMDsKKworCS8qIHJlYWQgYWxsIHVyYiBkYXRhOyBpZiB1cmIgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhlbiB0aGUgdXNibW9uIGludGVybmFsIAorCSAqIGJ1ZmZlciBsZW5ndGggdXNlZCBieSB0aGUga2VybmVsIHRvIHNwb29sIHRoZSBVUkIsIHdlIGdldCBvbmx5CisJICogYSBwYXJ0aWFsIGluZm9ybWF0aW9uLgorCSAqIEF0IGxlYXN0IHVudGlsIGxpbnV4IDIuNi4xNyB0aGVyZSBpcyBubyB3YXkgdG8gc2V0IHVzYm1vbiBpbnRlbmFsIGJ1ZmZlcgorCSAqIGxlbmd0aCBhbmQgZGVmYXVsdCB2YWx1ZSBpcyAxMzAuICovCisJd2hpbGUgKChzdHJpbmdbMF0gIT0gMCkgJiYgKHN0cmluZ1sxXSAhPSAwKSAmJiAocGt0aC5jYXBsZW4gPCBoYW5kbGUtPnNuYXBzaG90KSkKKwl7CisJCXJhd2RhdGFbMF0gPSBhc2NpaV90b19pbnQoc3RyaW5nWzBdKSAqIDE2ICsgYXNjaWlfdG9faW50KHN0cmluZ1sxXSk7CisJCXJhd2RhdGErKzsKKwkJc3RyaW5nKz0yOworCQlpZiAoc3RyaW5nWzBdID09ICcgJykKKwkJCXN0cmluZysrOworCQlwa3RoLmNhcGxlbisrOworCQlkYXRhX2xlbisrOworCX0KKworZ290OgorCXVoZHItPmRhdGFfbGVuID0gZGF0YV9sZW47CisJaWYgKHBrdGguY2FwbGVuID4gaGFuZGxlLT5zbmFwc2hvdCkKKwkJcGt0aC5jYXBsZW4gPSBoYW5kbGUtPnNuYXBzaG90OworCisJaWYgKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMgPT0gTlVMTCB8fAorCSAgICBicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsIGhhbmRsZS0+YnVmZmVyLAorCSAgICAgIHBrdGgubGVuLCBwa3RoLmNhcGxlbikpIHsKKwkJaGFuZGxlLT5tZC5wYWNrZXRzX3JlYWQrKzsKKwkJY2FsbGJhY2sodXNlciwgJnBrdGgsIGhhbmRsZS0+YnVmZmVyKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOwkvKiBkaWRuJ3QgcGFzcyBmaWx0ZXIgKi8KK30KKworc3RhdGljIGludAordXNiX2luamVjdF9saW51eChwY2FwX3QgKmhhbmRsZSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImluamVjdCBub3Qgc3VwcG9ydGVkIG9uICIKKwkJIlVTQiBkZXZpY2VzIik7CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQgCit1c2Jfc3RhdHNfbGludXgocGNhcF90ICpoYW5kbGUsIHN0cnVjdCBwY2FwX3N0YXQgKnN0YXRzKQoreworCWludCBkdW1teSwgcmV0LCBjb25zdW1lZCwgY250OworCWNoYXIgc3RyaW5nW1VTQl9MSU5FX0xFTl07CisJY2hhciB0b2tlbltVU0JfTElORV9MRU5dOworCWNoYXIgKiBwdHIgPSBzdHJpbmc7CisJaW50IGZkOworCisJc25wcmludGYoc3RyaW5nLCBVU0JfTElORV9MRU4sIFVTQl9URVhUX0RJUiIvJWRzIiwgaGFuZGxlLT5tZC5pZmluZGV4KTsKKwlmZCA9IG9wZW4oc3RyaW5nLCBPX1JET05MWSwgMCk7CisJaWYgKGZkIDwgMCkKKwl7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCXsKKwkJCS8qCisJCQkgKiBOb3QgZm91bmQgYXQgdGhlIG5ldyBsb2NhdGlvbjsgdHJ5IHRoZSBvbGQKKwkJCSAqIGxvY2F0aW9uLgorCQkJICovCisJCQlzbnByaW50ZihzdHJpbmcsIFVTQl9MSU5FX0xFTiwgVVNCX1RFWFRfRElSX09MRCIvJWRzIiwgaGFuZGxlLT5tZC5pZmluZGV4KTsKKwkJCWZkID0gb3BlbihzdHJpbmcsIE9fUkRPTkxZLCAwKTsKKwkJfQorCQlpZiAoZmQgPCAwKSB7CisJCQlzbnByaW50ZihoYW5kbGUtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkiQ2FuJ3Qgb3BlbiBVU0Igc3RhdHMgZmlsZSAlczogJXMiLCAKKwkJCQlzdHJpbmcsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwkvKiByZWFkIHN0YXRzIGxpbmUgKi8KKwlkbyB7CisJCXJldCA9IHJlYWQoZmQsIHN0cmluZywgVVNCX0xJTkVfTEVOLTEpOworCX0gd2hpbGUgKChyZXQgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCWNsb3NlKGZkKTsKKworCWlmIChyZXQgPCAwKQorCXsKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkiQ2FuJ3QgcmVhZCBzdGF0cyBmcm9tIGZkICVkICIsIGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdHJpbmdbcmV0XSA9IDA7CisKKwkvKiBleHRyYWN0IGluZm8gb24gZHJvcHBlZCB1cmJzICovCisJZm9yIChjb25zdW1lZD0wOyBjb25zdW1lZCA8IHJldDsgKSB7CisJCS8qIGZyb20gdGhlIHNzY2FuZiBtYW4gcGFnZTogCisgCQkgKiBUaGUgQyBzdGFuZGFyZCBzYXlzOiAiRXhlY3V0aW9uIG9mIGEgJW4gZGlyZWN0aXZlIGRvZXMgCisgCQkgKiBub3QgaW5jcmVtZW50IHRoZSBhc3NpZ25tZW50IGNvdW50IHJldHVybmVkIGF0IHRoZSBjb21wbGV0aW9uCisJCSAqIG9mICBleGVjdXRpb24iIGJ1dCB0aGUgQ29ycmlnZW5kdW0gc2VlbXMgdG8gY29udHJhZGljdCB0aGlzLgorCQkgKiBEbyBub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgb24gdGhlIGVmZmVjdCBvZiAlbiBjb252ZXJzaW9ucyAKKwkJICogb24gdGhlIHJldHVybiB2YWx1ZSBhbmQgZXhwbGljaXRseSBjaGVjayBmb3IgY250IGFzc2lnbm1ldCovCisJCWludCBudG9rOworCisJCWNudCA9IC0xOworCQludG9rID0gc3NjYW5mKHB0ciwgIiVzJW4iLCB0b2tlbiwgJmNudCk7CisJCWlmICgobnRvayA8IDEpIHx8IChjbnQgPCAwKSkKKwkJCWJyZWFrOworCQljb25zdW1lZCArPSBjbnQ7CisJCXB0ciArPSBjbnQ7CisJCWlmIChzdHJjbXAodG9rZW4sICJucmVhZGVycyIpID09IDApCisJCQlyZXQgPSBzc2NhbmYocHRyLCAiJWQiLCAmc3RhdHMtPnBzX2Ryb3ApOworCQllbHNlIAorCQkJcmV0ID0gc3NjYW5mKHB0ciwgIiVkIiwgJmR1bW15KTsKKwkJaWYgKG50b2sgIT0gMSkKKwkJCWJyZWFrOworCQljb25zdW1lZCArPSBjbnQ7CisJCXB0ciArPSBjbnQ7CisJfQorCisJc3RhdHMtPnBzX3JlY3YgPSBoYW5kbGUtPm1kLnBhY2tldHNfcmVhZDsKKwlzdGF0cy0+cHNfaWZkcm9wID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCAKK3VzYl9zZXRkaXJlY3Rpb25fbGludXgocGNhcF90ICpwLCBwY2FwX2RpcmVjdGlvbl90IGQpCit7CisJcC0+ZGlyZWN0aW9uID0gZDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IAordXNiX3N0YXRzX2xpbnV4X2JpbihwY2FwX3QgKmhhbmRsZSwgc3RydWN0IHBjYXBfc3RhdCAqc3RhdHMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbW9uX2Jpbl9zdGF0cyBzdDsKKwlyZXQgPSBpb2N0bChoYW5kbGUtPmZkLCBNT05fSU9DR19TVEFUUywgJnN0KTsKKwlpZiAocmV0IDwgMCkKKwl7CisJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJIkNhbid0IHJlYWQgc3RhdHMgZnJvbSBmZCAlZDolcyAiLCBoYW5kbGUtPmZkLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RhdHMtPnBzX3JlY3YgPSBoYW5kbGUtPm1kLnBhY2tldHNfcmVhZCArIHN0LnF1ZXVlZDsKKwlzdGF0cy0+cHNfZHJvcCA9IHN0LmRyb3BwZWQ7CisJc3RhdHMtPnBzX2lmZHJvcCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzZWUgPGxpbnV4LWtlcm5lbC1zb3VyY2U+L0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQgYW5kIAorICogPGxpbnV4LWtlcm5lbC1zb3VyY2U+L2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMgYmluYXJ5IEFCSQorICovCitzdGF0aWMgaW50Cit1c2JfcmVhZF9saW51eF9iaW4ocGNhcF90ICpoYW5kbGUsIGludCBtYXhfcGFja2V0cywgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJc3RydWN0IG1vbl9iaW5fZ2V0IGluZm87CisJaW50IHJldDsKKwlzdHJ1Y3QgcGNhcF9wa3RoZHIgcGt0aDsKKwlpbnQgY2xlbiA9IGhhbmRsZS0+c25hcHNob3QgLSBzaXplb2YocGNhcF91c2JfaGVhZGVyKTsKKworCS8qIHRoZSB1c2IgaGVhZGVyIGlzIGdvaW5nIHRvIGJlIHBhcnQgb2YgJ3BhY2tldCcgZGF0YSovCisJaW5mby5oZHIgPSAocGNhcF91c2JfaGVhZGVyKikgaGFuZGxlLT5idWZmZXI7CisJaW5mby5kYXRhID0gaGFuZGxlLT5idWZmZXIgKyBzaXplb2YocGNhcF91c2JfaGVhZGVyKTsKKwlpbmZvLmRhdGFfbGVuID0gY2xlbjsKKworCS8qIGlnbm9yZSBpbnRlcnJ1cHQgc3lzdGVtIGNhbGwgZXJyb3JzICovCisJZG8geworCQlyZXQgPSBpb2N0bChoYW5kbGUtPmZkLCBNT05fSU9DWF9HRVQsICZpbmZvKTsKKwkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkKKwkJeworCQkJaGFuZGxlLT5icmVha19sb29wID0gMDsKKwkJCXJldHVybiAtMjsKKwkJfQorCX0gd2hpbGUgKChyZXQgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCWlmIChyZXQgPCAwKQorCXsKKwkJaWYgKGVycm5vID09IEVBR0FJTikKKwkJCXJldHVybiAwOwkvKiBubyBkYXRhIHRoZXJlICovCisKKwkJc25wcmludGYoaGFuZGxlLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiQ2FuJ3QgcmVhZCBmcm9tIGZkICVkOiAlcyIsIGhhbmRsZS0+ZmQsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB3ZSBjYW4gZ2V0IGxlc3MgdGhhdCB0aGFuIHJlYWxseSBjYXB0dXJlZCBmcm9tIGtlcm5lbCwgZGVwZW5kaW5nIG9uCisJICogc25hcGxlbiwgc28gYWRqdXN0IGhlYWRlciBhY2NvcmRpbmdseSAqLworCWlmIChpbmZvLmhkci0+ZGF0YV9sZW4gPCBjbGVuKQorCQljbGVuID0gaW5mby5oZHItPmRhdGFfbGVuOworCWluZm8uaGRyLT5kYXRhX2xlbiA9IGNsZW47CisJcGt0aC5jYXBsZW4gPSBjbGVuICsgc2l6ZW9mKHBjYXBfdXNiX2hlYWRlcik7CisJcGt0aC5sZW4gPSBpbmZvLmhkci0+ZGF0YV9sZW4gKyBzaXplb2YocGNhcF91c2JfaGVhZGVyKTsKKwlwa3RoLnRzLnR2X3NlYyA9IGluZm8uaGRyLT50c19zZWM7CisJcGt0aC50cy50dl91c2VjID0gaW5mby5oZHItPnRzX3VzZWM7CisKKwlpZiAoaGFuZGxlLT5mY29kZS5iZl9pbnNucyA9PSBOVUxMIHx8CisJICAgIGJwZl9maWx0ZXIoaGFuZGxlLT5mY29kZS5iZl9pbnNucywgaGFuZGxlLT5idWZmZXIsCisJICAgICAgcGt0aC5sZW4sIHBrdGguY2FwbGVuKSkgeworCQloYW5kbGUtPm1kLnBhY2tldHNfcmVhZCsrOworCQljYWxsYmFjayh1c2VyLCAmcGt0aCwgaGFuZGxlLT5idWZmZXIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsJLyogZGlkbid0IHBhc3MgZmlsdGVyICovCit9CisKKy8qCisgKiBzZWUgPGxpbnV4LWtlcm5lbC1zb3VyY2U+L0RvY3VtZW50YXRpb24vdXNiL3VzYm1vbi50eHQgYW5kIAorICogPGxpbnV4LWtlcm5lbC1zb3VyY2U+L2RyaXZlcnMvdXNiL21vbi9tb25fYmluLmMgYmluYXJ5IEFCSQorICovCisjZGVmaW5lIFZFQ19TSVpFIDMyCitzdGF0aWMgaW50Cit1c2JfcmVhZF9saW51eF9tbWFwKHBjYXBfdCAqaGFuZGxlLCBpbnQgbWF4X3BhY2tldHMsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBtb25fYmluX21mZXRjaCBmZXRjaDsKKwlpbnQzMl90IHZlY1tWRUNfU0laRV07CisJc3RydWN0IHBjYXBfcGt0aGRyIHBrdGg7CisJcGNhcF91c2JfaGVhZGVyKiBoZHI7CisJaW50IG5mbHVzaCA9IDA7CisJaW50IHBhY2tldHMgPSAwOworCWludCBjbGVuLCBtYXhfY2xlbjsKKworCW1heF9jbGVuID0gaGFuZGxlLT5zbmFwc2hvdCAtIHNpemVvZihwY2FwX3VzYl9oZWFkZXIpOworCisJZm9yICg7OykgeworCQlpbnQgaSwgcmV0OworCQlpbnQgbGltaXQgPSBtYXhfcGFja2V0cyAtIHBhY2tldHM7CisJCWlmIChsaW1pdCA8PSAwKQorCQkJbGltaXQgPSBWRUNfU0laRTsKKwkJaWYgKGxpbWl0ID4gVkVDX1NJWkUpCisJCQlsaW1pdCA9IFZFQ19TSVpFOworCisJCS8qIHRyeSB0byBmZXRjaCBhcyBtYW55IGV2ZW50cyBhcyBwb3NzaWJsZSovCisJCWZldGNoLm9mZnZlYyA9IHZlYzsKKwkJZmV0Y2gubmZldGNoID0gbGltaXQ7CisJCWZldGNoLm5mbHVzaCA9IG5mbHVzaDsKKwkJLyogaWdub3JlIGludGVycnVwdCBzeXN0ZW0gY2FsbCBlcnJvcnMgKi8KKwkJZG8geworCQkJcmV0ID0gaW9jdGwoaGFuZGxlLT5mZCwgTU9OX0lPQ1hfTUZFVENILCAmZmV0Y2gpOworCQkJaWYgKGhhbmRsZS0+YnJlYWtfbG9vcCkKKwkJCXsKKwkJCQloYW5kbGUtPmJyZWFrX2xvb3AgPSAwOworCQkJCXJldHVybiAtMjsKKwkJCX0KKwkJfSB3aGlsZSAoKHJldCA9PSAtMSkgJiYgKGVycm5vID09IEVJTlRSKSk7CisJCWlmIChyZXQgPCAwKQorCQl7CisJCQlpZiAoZXJybm8gPT0gRUFHQUlOKQorCQkJCXJldHVybiAwOwkvKiBubyBkYXRhIHRoZXJlICovCisKKwkJCXNucHJpbnRmKGhhbmRsZS0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJDYW4ndCBtZmV0Y2ggZmQgJWQ6ICVzIiwgaGFuZGxlLT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qIGtlZXAgdHJhY2sgb2YgcHJvY2Vzc2VkIGV2ZW50cywgd2Ugd2lsbCBmbHVzaCB0aGVtIGxhdGVyICovCisJCW5mbHVzaCA9IGZldGNoLm5mZXRjaDsKKwkJZm9yIChpPTA7IGk8ZmV0Y2gubmZldGNoOyArK2kpIHsKKwkJCS8qIGRpc2NhcmQgZmlsbGVyICovCisJCQloZHIgPSAocGNhcF91c2JfaGVhZGVyKikgJmhhbmRsZS0+bWQubW1hcGJ1Zlt2ZWNbaV1dOworCQkJaWYgKGhkci0+ZXZlbnRfdHlwZSA9PSAnQCcpIAorCQkJCWNvbnRpbnVlOworCisJCQkvKiB3ZSBjYW4gZ2V0IGxlc3MgdGhhdCB0aGFuIHJlYWxseSBjYXB0dXJlZCBmcm9tIGtlcm5lbCwgZGVwZW5kaW5nIG9uCisJIAkJKiBzbmFwbGVuLCBzbyBhZGp1c3QgaGVhZGVyIGFjY29yZGluZ2x5ICovCisJCQljbGVuID0gbWF4X2NsZW47CisJCQlpZiAoaGRyLT5kYXRhX2xlbiA8IGNsZW4pCisJCQkJY2xlbiA9IGhkci0+ZGF0YV9sZW47CisKKwkJCS8qIGdldCBwYWNrZXQgaW5mbyBmcm9tIGhlYWRlciovCisJCQlwa3RoLmNhcGxlbiA9IGNsZW4gKyBzaXplb2YocGNhcF91c2JfaGVhZGVyX21tYXBwZWQpOworCQkJcGt0aC5sZW4gPSBoZHItPmRhdGFfbGVuICsgc2l6ZW9mKHBjYXBfdXNiX2hlYWRlcl9tbWFwcGVkKTsKKwkJCXBrdGgudHMudHZfc2VjID0gaGRyLT50c19zZWM7CisJCQlwa3RoLnRzLnR2X3VzZWMgPSBoZHItPnRzX3VzZWM7CisKKwkJCWlmIChoYW5kbGUtPmZjb2RlLmJmX2luc25zID09IE5VTEwgfHwKKwkJCSAgICBicGZfZmlsdGVyKGhhbmRsZS0+ZmNvZGUuYmZfaW5zbnMsICh1X2NoYXIqKSBoZHIsCisJCQkgICAgICBwa3RoLmxlbiwgcGt0aC5jYXBsZW4pKSB7CisJCQkJaGFuZGxlLT5tZC5wYWNrZXRzX3JlYWQrKzsKKwkJCQljYWxsYmFjayh1c2VyLCAmcGt0aCwgKHVfY2hhciopIGhkcik7CisJCQkJcGFja2V0cysrOworCQkJfQorCQl9CisKKwkJLyogd2l0aCBtYXhfcGFja2V0cyA8PSAwIHdlIHN0b3AgYWZlciB0aGUgZmlyc3QgY2h1bmsqLworCQlpZiAoKG1heF9wYWNrZXRzIDw9IDApIHx8IChwYWNrZXRzID09IG1heF9wYWNrZXRzKSkKKwkJCWJyZWFrOworCX0KKworCS8qIGZsdXNoIHBlbmRpbmcgZXZlbnRzKi8KKwlpb2N0bChoYW5kbGUtPmZkLCBNT05fSU9DSF9NRkxVU0gsIG5mbHVzaCk7CisJcmV0dXJuIHBhY2tldHM7Cit9CisKK3N0YXRpYyB2b2lkCit1c2JfY2xlYW51cF9saW51eF9tbWFwKHBjYXBfdCogaGFuZGxlKQoreworCS8qIGlmIHdlIGhhdmUgYSBtZW1vcnktbWFwcGVkIGJ1ZmZlciwgdW5tYXAgaXQgKi8KKwlpZiAoaGFuZGxlLT5tZC5tbWFwYnVmICE9IE5VTEwpIHsKKwkJbXVubWFwKGhhbmRsZS0+bWQubW1hcGJ1ZiwgaGFuZGxlLT5tZC5tbWFwYnVmbGVuKTsKKwkJaGFuZGxlLT5tZC5tbWFwYnVmID0gTlVMTDsKKwl9CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKGhhbmRsZSk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAtdXNiLWxpbnV4LmggYi9saWJwY2FwLTEuMy4wL3BjYXAtdXNiLWxpbnV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5NjM4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC11c2ItbGludXguaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBhb2xvIEFiZW5pIChJdGFseSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFVTQiBzbmlmZmluZyBBUEkgaW1wbGVtZW50YXRpb24gZm9yIExpbnV4IHBsYXRmb3JtCisgKiBCeSBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+CisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXVzYi1saW51eC5oLHYgMS41IDIwMDgtMDQtMDQgMTk6Mzc6NDUgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIFVTQi1yZWxhdGVkIGZ1bmN0aW9ucworICovCitpbnQgdXNiX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJfc3RyKTsKK3BjYXBfdCAqdXNiX2NyZWF0ZShjb25zdCBjaGFyICpkZXZpY2UsIGNoYXIgKmVidWYpOwpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLXdpbjMyLmMgYi9saWJwY2FwLTEuMy4wL3BjYXAtd2luMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGVkNDUzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLXdpbjMyLmMKQEAgLTAsMCArMSw4NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgLSAyMDA1IE5ldEdyb3VwLCBQb2xpdGVjbmljbyBkaSBUb3Jpbm8gKEl0YWx5KQorICogQ29weXJpZ2h0IChjKSAyMDA1IC0gMjAwOCBDQUNFIFRlY2hub2xvZ2llcywgRGF2aXMgKENhbGlmb3JuaWEpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFBvbGl0ZWNuaWNvIGRpIFRvcmlubywgQ0FDRSBUZWNobm9sb2dpZXMgCisgKiBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLXdpbjMyLmMsdiAxLjQyIDIwMDgtMDUtMjEgMjI6MTU6MjUgZ2lhbmx1Y2EgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpbmNsdWRlIDxwY2FwLWludC5oPgorI2luY2x1ZGUgPFBhY2tldDMyLmg+CisjaWZkZWYgX19NSU5HVzMyX18KKyNpZmRlZiBfX01JTkdXNjRfXworI2luY2x1ZGUgPG50ZGRuZGlzLmg+CisjZWxzZSAgLypfX01JTkdXNjRfXyovCisjaW5jbHVkZSA8ZGRrL250ZGRuZGlzLmg+CisjaW5jbHVkZSA8ZGRrL25kaXMuaD4KKyNlbmRpZiAvKl9fTUlOR1c2NF9fKi8KKyNlbHNlIC8qX19NSU5HVzMyX18qLworI2luY2x1ZGUgPG50ZGRuZGlzLmg+CisjZW5kaWYgLypfX01JTkdXMzJfXyovCisjaWZkZWYgSEFWRV9EQUdfQVBJCisjaW5jbHVkZSA8ZGFnbmV3Lmg+CisjaW5jbHVkZSA8ZGFnYXBpLmg+CisjZW5kaWYgLyogSEFWRV9EQUdfQVBJICovCisjaWZkZWYgX19NSU5HVzMyX18KK2ludCogX2Vycm5vKCk7CisjZGVmaW5lIGVycm5vICgqX2Vycm5vKCkpCisjZW5kaWYgLyogX19NSU5HVzMyX18gKi8KKworc3RhdGljIGludCBwY2FwX3NldGZpbHRlcl93aW4zMl9ucGYocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK3N0YXRpYyBpbnQgcGNhcF9zZXRmaWx0ZXJfd2luMzJfZGFnKHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CitzdGF0aWMgaW50IHBjYXBfZ2V0bm9uYmxvY2tfd2luMzIocGNhcF90ICosIGNoYXIgKik7CitzdGF0aWMgaW50IHBjYXBfc2V0bm9uYmxvY2tfd2luMzIocGNhcF90ICosIGludCwgY2hhciAqKTsKKworLypkaW1lbnNpb24gb2YgdGhlIGJ1ZmZlciBpbiB0aGUgcGNhcF90IHN0cnVjdHVyZSovCisjZGVmaW5lCVdJTjMyX0RFRkFVTFRfVVNFUl9CVUZGRVJfU0laRSAyNTYwMDAKKworLypkaW1lbnNpb24gb2YgdGhlIGJ1ZmZlciBpbiB0aGUga2VybmVsIGRyaXZlciBOUEYgKi8KKyNkZWZpbmUJV0lOMzJfREVGQVVMVF9LRVJORUxfQlVGRkVSX1NJWkUgMTAwMDAwMAorCisvKiBFcXVpdmFsZW50IHRvIG50b2hzKCksIGJ1dCBhIGxvdCBmYXN0ZXIgdW5kZXIgV2luZG93cyAqLworI2RlZmluZSBTV0FQUyhfWCkgKChfWCAmIDB4ZmYpIDw8IDgpIHwgKF9YID4+IDgpCisKKy8qCisgKiBIZWFkZXIgdGhhdCB0aGUgV2luUGNhcCBkcml2ZXIgYXNzb2NpYXRlcyB0byB0aGUgcGFja2V0cy4KKyAqIE9uY2Ugd2FzIGluIGJwZi5oCisgKi8KK3N0cnVjdCBicGZfaGRyIHsKKwlzdHJ1Y3QgdGltZXZhbAliaF90c3RhbXA7CS8qIHRpbWUgc3RhbXAgKi8KKwlicGZfdV9pbnQzMgliaF9jYXBsZW47CS8qIGxlbmd0aCBvZiBjYXB0dXJlZCBwb3J0aW9uICovCisJYnBmX3VfaW50MzIJYmhfZGF0YWxlbjsJLyogb3JpZ2luYWwgbGVuZ3RoIG9mIHBhY2tldCAqLworCXVfc2hvcnQJCWJoX2hkcmxlbjsJLyogbGVuZ3RoIG9mIGJwZiBoZWFkZXIgKHRoaXMgc3RydWN0CisJCQkJCSAgIHBsdXMgYWxpZ25tZW50IHBhZGRpbmcpICovCit9OworCitDUklUSUNBTF9TRUNUSU9OIGdfUGNhcENvbXBpbGVDcml0aWNhbFNlY3Rpb247CisKK0JPT0wgV0lOQVBJIERsbE1haW4oCisgIEhBTkRMRSBoaW5zdERMTCwKKyAgRFdPUkQgZHdSZWFzb24sCisgIExQVk9JRCBscHZSZXNlcnZlZAorKQoreworCWlmIChkd1JlYXNvbiA9PSBETExfUFJPQ0VTU19BVFRBQ0gpCisJeworCQlJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCZnX1BjYXBDb21waWxlQ3JpdGljYWxTZWN0aW9uKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyogU3RhcnQgd2luc29jayAqLworaW50IAord3NvY2tpbml0KCkKK3sKKwlXT1JEIHdWZXJzaW9uUmVxdWVzdGVkOworCVdTQURBVEEgd3NhRGF0YTsKKwlpbnQgZXJyOworCXdWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoIDEsIDEpOyAKKwllcnIgPSBXU0FTdGFydHVwKCB3VmVyc2lvblJlcXVlc3RlZCwgJndzYURhdGEgKTsKKwlpZiAoIGVyciAhPSAwICkKKwl7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorcGNhcF9zdGF0c193aW4zMihwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQoreworCisJaWYoUGFja2V0R2V0U3RhdHMocC0+YWRhcHRlciwgKHN0cnVjdCBicGZfc3RhdCopcHMpICE9IFRSVUUpeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJQYWNrZXRHZXRTdGF0cyBlcnJvcjogJXMiLCBwY2FwX3dpbjMyc3RyZXJyb3IoKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIGtlcm5lbC1sZXZlbCBjYXB0dXJlIGJ1ZmZlciAqLworc3RhdGljIGludAorcGNhcF9zZXRidWZmX3dpbjMyKHBjYXBfdCAqcCwgaW50IGRpbSkKK3sKKwlpZihQYWNrZXRTZXRCdWZmKHAtPmFkYXB0ZXIsZGltKT09RkFMU0UpCisJeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJkcml2ZXIgZXJyb3I6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBrZXJuZWwgYnVmZmVyIik7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFNldCB0aGUgZHJpdmVyIHdvcmtpbmcgbW9kZSAqLworc3RhdGljIGludAorcGNhcF9zZXRtb2RlX3dpbjMyKHBjYXBfdCAqcCwgaW50IG1vZGUpCit7CisJaWYoUGFja2V0U2V0TW9kZShwLT5hZGFwdGVyLG1vZGUpPT1GQUxTRSkKKwl7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImRyaXZlciBlcnJvcjogd29ya2luZyBtb2RlIG5vdCByZWNvZ25pemVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLypzZXQgdGhlIG1pbmltdW0gYW1vdW50IG9mIGRhdGEgdGhhdCB3aWxsIHJlbGVhc2UgYSByZWFkIGNhbGwqLworc3RhdGljIGludAorcGNhcF9zZXRtaW50b2NvcHlfd2luMzIocGNhcF90ICpwLCBpbnQgc2l6ZSkKK3sKKwlpZihQYWNrZXRTZXRNaW5Ub0NvcHkocC0+YWRhcHRlciwgc2l6ZSk9PUZBTFNFKQorCXsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZHJpdmVyIGVycm9yOiB1bmFibGUgdG8gc2V0IHRoZSByZXF1ZXN0ZWQgbWludG9jb3B5IHNpemUiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGNhcF9yZWFkX3dpbjMyX25wZihwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCWludCBjYzsKKwlpbnQgbiA9IDA7CisJcmVnaXN0ZXIgdV9jaGFyICpicCwgKmVwOworCisJY2MgPSBwLT5jYzsKKwlpZiAocC0+Y2MgPT0gMCkgeworCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKi8KKwkJaWYgKHAtPmJyZWFrX2xvb3ApIHsKKwkJCS8qCisJCQkgKiBZZXMgLSBjbGVhciB0aGUgZmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGl0CisJCQkgKiBoYXMsIGFuZCByZXR1cm4gLTIgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3ZXJlCisJCQkgKiB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJCSAqLworCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQlyZXR1cm4gKC0yKTsKKwkJfQorCisJICAgIC8qIGNhcHR1cmUgdGhlIHBhY2tldHMgKi8KKwkJaWYoUGFja2V0UmVjZWl2ZVBhY2tldChwLT5hZGFwdGVyLHAtPlBhY2tldCxUUlVFKT09RkFMU0UpeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAicmVhZCBlcnJvcjogUGFja2V0UmVjZWl2ZVBhY2tldCBmYWlsZWQiKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisJCQkKKwkJY2MgPSBwLT5QYWNrZXQtPnVsQnl0ZXNSZWNlaXZlZDsKKworCQlicCA9IHAtPlBhY2tldC0+QnVmZmVyOworCX0gCisJZWxzZQorCQlicCA9IHAtPmJwOworCisJLyoKKwkgKiBMb29wIHRocm91Z2ggZWFjaCBwYWNrZXQuCisJICovCisjZGVmaW5lIGJocCAoKHN0cnVjdCBicGZfaGRyICopYnApCisJZXAgPSBicCArIGNjOworCXdoaWxlICgxKSB7CisJCXJlZ2lzdGVyIGludCBjYXBsZW4sIGhkcmxlbjsKKworCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKiBJZiBzbywgcmV0dXJuIGltbWVkaWF0ZWx5IC0gaWYgd2UgaGF2ZW4ndCByZWFkIGFueQorCQkgKiBwYWNrZXRzLCBjbGVhciB0aGUgZmxhZyBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlCisJCSAqIHRoYXQgd2Ugd2VyZSB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgb3RoZXJ3aXNlCisJCSAqIGxlYXZlIHRoZSBmbGFnIHNldCwgc28gdGhhdCB0aGUgKm5leHQqIGNhbGwgd2lsbCBicmVhaworCQkgKiBvdXQgb2YgdGhlIGxvb3Agd2l0aG91dCBoYXZpbmcgcmVhZCBhbnkgcGFja2V0cywgYW5kCisJCSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UndmUgcHJvY2Vzc2VkIHNvIGZhci4KKwkJICovCisJCWlmIChwLT5icmVha19sb29wKSB7CisJCQlpZiAobiA9PSAwKSB7CisJCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQkJcmV0dXJuICgtMik7CisJCQl9IGVsc2UgeworCQkJCXAtPmJwID0gYnA7CisJCQkJcC0+Y2MgPSBlcCAtIGJwOworCQkJCXJldHVybiAobik7CisJCQl9CisJCX0KKwkJaWYgKGJwID49IGVwKQorCQkJYnJlYWs7CisKKwkJY2FwbGVuID0gYmhwLT5iaF9jYXBsZW47CisJCWhkcmxlbiA9IGJocC0+YmhfaGRybGVuOworCisJCS8qCisJCSAqIFhYWCBBIGJwZl9oZHIgbWF0Y2hlcyBhIHBjYXBfcGt0aGRyLgorCQkgKi8KKwkJKCpjYWxsYmFjaykodXNlciwgKHN0cnVjdCBwY2FwX3BrdGhkciopYnAsIGJwICsgaGRybGVuKTsKKwkJYnAgKz0gUGFja2V0X1dPUkRBTElHTihjYXBsZW4gKyBoZHJsZW4pOworCQlpZiAoKytuID49IGNudCAmJiBjbnQgPiAwKSB7CisJCQlwLT5icCA9IGJwOworCQkJcC0+Y2MgPSBlcCAtIGJwOworCQkJcmV0dXJuIChuKTsKKwkJfQorCX0KKyN1bmRlZiBiaHAKKwlwLT5jYyA9IDA7CisJcmV0dXJuIChuKTsKK30KKworI2lmZGVmIEhBVkVfREFHX0FQSQorc3RhdGljIGludAorcGNhcF9yZWFkX3dpbjMyX2RhZyhwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXVfY2hhciAqZHAgPSBOVUxMOworCWludAlwYWNrZXRfbGVuID0gMCwgY2FwbGVuID0gMDsKKwlzdHJ1Y3QgcGNhcF9wa3RoZHIJcGNhcF9oZWFkZXI7CisJdV9jaGFyICplbmRvZmJ1ZjsKKwlpbnQgbiA9IDA7CisJZGFnX3JlY29yZF90ICpoZWFkZXI7CisJdW5zaWduZWQgZXJmX3JlY29yZF9sZW47CisJVUxPTkdMT05HIHRzOworCWludCBjYzsKKwl1bnNpZ25lZCBzd3Q7CisJdW5zaWduZWQgZGZwID0gcC0+YWRhcHRlci0+RGFnRmFzdFByb2Nlc3M7CisKKwljYyA9IHAtPmNjOworCWlmIChjYyA9PSAwKSAvKiBHZXQgbmV3IHBhY2tldHMgb25seSBpZiB3ZSBoYXZlIHByb2Nlc3NlZCBhbGwgdGhlIG9uZXMgb2YgdGhlIHByZXZpb3VzIHJlYWQgKi8KKwl7CisJICAgIC8qIEdldCBuZXcgcGFja2V0cyBmcm9tIHRoZSBuZXR3b3JrICovCisJCWlmKFBhY2tldFJlY2VpdmVQYWNrZXQocC0+YWRhcHRlciwgcC0+UGFja2V0LCBUUlVFKT09RkFMU0UpeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAicmVhZCBlcnJvcjogUGFja2V0UmVjZWl2ZVBhY2tldCBmYWlsZWQiKTsKKwkJCXJldHVybiAoLTEpOworCQl9CisKKwkJY2MgPSBwLT5QYWNrZXQtPnVsQnl0ZXNSZWNlaXZlZDsKKwkJaWYoY2MgPT0gMCkKKwkJCS8qIFRoZSB0aW1lb3V0IGhhcyBleHBpcmVkIGJ1dCB3ZSBubyBwYWNrZXRzIGFycml2ZWQgKi8KKwkJCXJldHVybiAwOworCQloZWFkZXIgPSAoZGFnX3JlY29yZF90KilwLT5hZGFwdGVyLT5EYWdCdWZmZXI7CisJfSAKKwllbHNlCisJCWhlYWRlciA9IChkYWdfcmVjb3JkX3QqKXAtPmJwOworCQorCWVuZG9mYnVmID0gKGNoYXIqKWhlYWRlciArIGNjOworCQorCS8qIAorCSAqIEN5Y2xlIHRocm91Z2ggdGhlIHBhY2tldHMgCisJICovCisJZG8KKwl7CisJCWVyZl9yZWNvcmRfbGVuID0gU1dBUFMoaGVhZGVyLT5ybGVuKTsKKwkJaWYoKGNoYXIqKWhlYWRlciArIGVyZl9yZWNvcmRfbGVuID4gZW5kb2ZidWYpCisJCQlicmVhazsKKworCQkvKiBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGNhcHR1cmVkIHBhY2tldHMgKi8KKwkJcC0+bWQuc3RhdC5wc19yZWN2Kys7CisJCQorCQkvKiBGaW5kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhY2tldCAqLworCQlkcCA9ICgodV9jaGFyICopaGVhZGVyKSArIGRhZ19yZWNvcmRfc2l6ZTsKKworCQkvKiBEZXRlcm1pbmUgYWN0dWFsIHBhY2tldCBsZW4gKi8KKwkJc3dpdGNoKGhlYWRlci0+dHlwZSkgCisJCXsKKwkJY2FzZSBUWVBFX0FUTToKKwkJCXBhY2tldF9sZW4gPSBBVE1fU05BUExFTjsKKwkJCWNhcGxlbiA9IEFUTV9TTkFQTEVOOworCQkJZHAgKz0gNDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBUWVBFX0VUSDoKKwkJCXN3dCA9IFNXQVBTKGhlYWRlci0+d2xlbik7CisJCQlwYWNrZXRfbGVuID0gc3d0IC0gKHAtPm1kLmRhZ19mY3NfYml0cyk7CisJCQljYXBsZW4gPSBlcmZfcmVjb3JkX2xlbiAtIGRhZ19yZWNvcmRfc2l6ZSAtIDI7CisJCQlpZiAoY2FwbGVuID4gcGFja2V0X2xlbikKKwkJCXsKKwkJCQljYXBsZW4gPSBwYWNrZXRfbGVuOworCQkJfQorCQkJZHAgKz0gMjsKKwkJCQorCQkJYnJlYWs7CisJCQorCQljYXNlIFRZUEVfSERMQ19QT1M6CisJCQlzd3QgPSBTV0FQUyhoZWFkZXItPndsZW4pOworCQkJcGFja2V0X2xlbiA9IHN3dCAtIChwLT5tZC5kYWdfZmNzX2JpdHMpOworCQkJY2FwbGVuID0gZXJmX3JlY29yZF9sZW4gLSBkYWdfcmVjb3JkX3NpemU7CisJCQlpZiAoY2FwbGVuID4gcGFja2V0X2xlbikKKwkJCXsKKwkJCQljYXBsZW4gPSBwYWNrZXRfbGVuOworCQkJfQorCQkJCisJCQlicmVhazsKKwkJfQorCQkKKwkJaWYoY2FwbGVuID4gcC0+c25hcHNob3QpCisJCQljYXBsZW4gPSBwLT5zbmFwc2hvdDsKKworCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKiBJZiBzbywgcmV0dXJuIGltbWVkaWF0ZWx5IC0gaWYgd2UgaGF2ZW4ndCByZWFkIGFueQorCQkgKiBwYWNrZXRzLCBjbGVhciB0aGUgZmxhZyBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlCisJCSAqIHRoYXQgd2Ugd2VyZSB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgb3RoZXJ3aXNlCisJCSAqIGxlYXZlIHRoZSBmbGFnIHNldCwgc28gdGhhdCB0aGUgKm5leHQqIGNhbGwgd2lsbCBicmVhaworCQkgKiBvdXQgb2YgdGhlIGxvb3Agd2l0aG91dCBoYXZpbmcgcmVhZCBhbnkgcGFja2V0cywgYW5kCisJCSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UndmUgcHJvY2Vzc2VkIHNvIGZhci4KKwkJICovCisJCWlmIChwLT5icmVha19sb29wKSAKKwkJeworCQkJaWYgKG4gPT0gMCkgCisJCQl7CisJCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQkJcmV0dXJuICgtMik7CisJCQl9IAorCQkJZWxzZSAKKwkJCXsKKwkJCQlwLT5icCA9IChjaGFyKiloZWFkZXI7CisJCQkJcC0+Y2MgPSBlbmRvZmJ1ZiAtIChjaGFyKiloZWFkZXI7CisJCQkJcmV0dXJuIChuKTsKKwkJCX0KKwkJfQorCisJCWlmKCFkZnApCisJCXsKKwkJCS8qIGNvbnZlcnQgYmV0d2VlbiB0aW1lc3RhbXAgZm9ybWF0cyAqLworCQkJdHMgPSBoZWFkZXItPnRzOworCQkJcGNhcF9oZWFkZXIudHMudHZfc2VjID0gKGludCkodHMgPj4gMzIpOworCQkJdHMgPSAodHMgJiAweGZmZmZmZmZmaTY0KSAqIDEwMDAwMDA7CisJCQl0cyArPSAweDgwMDAwMDAwOyAvKiByb3VuZGluZyAqLworCQkJcGNhcF9oZWFkZXIudHMudHZfdXNlYyA9IChpbnQpKHRzID4+IDMyKTsKKwkJCWlmIChwY2FwX2hlYWRlci50cy50dl91c2VjID49IDEwMDAwMDApIHsKKwkJCQlwY2FwX2hlYWRlci50cy50dl91c2VjIC09IDEwMDAwMDA7CisJCQkJcGNhcF9oZWFkZXIudHMudHZfc2VjKys7CisJCQl9CisJCX0KKwkJCisJCS8qIE5vIHVuZGVybGF5aW5nIGZpbHRlcmluZyBzeXN0ZW0uIFdlIG5lZWQgdG8gZmlsdGVyIG9uIG91ciBvd24gKi8KKwkJaWYgKHAtPmZjb2RlLmJmX2luc25zKSAKKwkJeworCQkJaWYgKGJwZl9maWx0ZXIocC0+ZmNvZGUuYmZfaW5zbnMsIGRwLCBwYWNrZXRfbGVuLCBjYXBsZW4pID09IDApIAorCQkJeworCQkJCS8qIE1vdmUgdG8gbmV4dCBwYWNrZXQgKi8KKwkJCQloZWFkZXIgPSAoZGFnX3JlY29yZF90KikoKGNoYXIqKWhlYWRlciArIGVyZl9yZWNvcmRfbGVuKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkKKwkJLyogRmlsbCB0aGUgaGVhZGVyIGZvciB0aGUgdXNlciBzdXBwcGxpZWQgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwkJcGNhcF9oZWFkZXIuY2FwbGVuID0gY2FwbGVuOworCQlwY2FwX2hlYWRlci5sZW4gPSBwYWNrZXRfbGVuOworCQkKKwkJLyogQ2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwkJKCpjYWxsYmFjaykodXNlciwgJnBjYXBfaGVhZGVyLCBkcCk7CisJCQorCQkvKiBNb3ZlIHRvIG5leHQgcGFja2V0ICovCisJCWhlYWRlciA9IChkYWdfcmVjb3JkX3QqKSgoY2hhciopaGVhZGVyICsgZXJmX3JlY29yZF9sZW4pOworCisJCS8qIFN0b3AgaWYgdGhlIG51bWJlciBvZiBwYWNrZXRzIHJlcXVlc3RlZCBieSB1c2VyIGhhcyBiZWVuIHJlYWNoZWQqLworCQlpZiAoKytuID49IGNudCAmJiBjbnQgPiAwKSAKKwkJeworCQkJcC0+YnAgPSAoY2hhciopaGVhZGVyOworCQkJcC0+Y2MgPSBlbmRvZmJ1ZiAtIChjaGFyKiloZWFkZXI7CisJCQlyZXR1cm4gKG4pOworCQl9CisJfQorCXdoaWxlKCh1X2NoYXIqKWhlYWRlciA8IGVuZG9mYnVmKTsKKwkKKyAgcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogSEFWRV9EQUdfQVBJICovCisKKy8qIFNlbmQgYSBwYWNrZXQgdG8gdGhlIG5ldHdvcmsgKi8KK3N0YXRpYyBpbnQgCitwY2FwX2luamVjdF93aW4zMihwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpeworCUxQUEFDS0VUIFBhY2tldFRvU2VuZDsKKworCVBhY2tldFRvU2VuZD1QYWNrZXRBbGxvY2F0ZVBhY2tldCgpOworCQorCWlmIChQYWNrZXRUb1NlbmQgPT0gTlVMTCkKKwl7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQgZXJyb3I6IFBhY2tldEFsbG9jYXRlUGFja2V0IGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCQorCVBhY2tldEluaXRQYWNrZXQoUGFja2V0VG9TZW5kLChQVk9JRClidWYsc2l6ZSk7CisJaWYoUGFja2V0U2VuZFBhY2tldChwLT5hZGFwdGVyLFBhY2tldFRvU2VuZCxUUlVFKSA9PSBGQUxTRSl7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgInNlbmQgZXJyb3I6IFBhY2tldFNlbmRQYWNrZXQgZmFpbGVkIik7CisJCVBhY2tldEZyZWVQYWNrZXQoUGFja2V0VG9TZW5kKTsKKwkJcmV0dXJuIC0xOworCX0KKworCVBhY2tldEZyZWVQYWNrZXQoUGFja2V0VG9TZW5kKTsKKworCS8qCisJICogV2UgYXNzdW1lIGl0IGFsbCBnb3Qgc2VudCBpZiAiUGFja2V0U2VuZFBhY2tldCgpIiBzdWNjZWVkZWQuCisJICogInBjYXBfaW5qZWN0KCkiIGlzIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisJICogc2VudC4KKwkgKi8KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHZvaWQKK3BjYXBfY2xlYW51cF93aW4zMihwY2FwX3QgKnApCit7CisJaWYgKHAtPmFkYXB0ZXIgIT0gTlVMTCkgeworCQlQYWNrZXRDbG9zZUFkYXB0ZXIocC0+YWRhcHRlcik7CisJCXAtPmFkYXB0ZXIgPSBOVUxMOworCX0KKwlpZiAocC0+UGFja2V0KSB7CisJCVBhY2tldEZyZWVQYWNrZXQocC0+UGFja2V0KTsKKwkJcC0+UGFja2V0ID0gTlVMTDsKKwl9CisJcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKHApOworfQorCitzdGF0aWMgaW50CitwY2FwX2FjdGl2YXRlX3dpbjMyKHBjYXBfdCAqcCkKK3sKKwlOZXRUeXBlIHR5cGU7CisKKwlpZiAocC0+b3B0LnJmbW9uKSB7CisJCS8qCisJCSAqIE5vIG1vbml0b3IgbW9kZSBvbiBXaW5kb3dzLiAgSXQgY291bGQgYmUgZG9uZSBvbgorCQkgKiBWaXN0YSB3aXRoIGRyaXZlcnMgdGhhdCBzdXBwb3J0IHRoZSBuYXRpdmUgODAyLjExCisJCSAqIG1lY2hhbmlzbSBhbmQgbW9uaXRvciBtb2RlLgorCQkgKi8KKwkJcmV0dXJuIChQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUCk7CisJfQorCisJLyogSW5pdCBXaW5Tb2NrICovCisJd3NvY2tpbml0KCk7CisKKwlwLT5hZGFwdGVyID0gUGFja2V0T3BlbkFkYXB0ZXIocC0+b3B0LnNvdXJjZSk7CisJCisJaWYgKHAtPmFkYXB0ZXIgPT0gTlVMTCkKKwl7CisJCS8qIEFkYXB0ZXIgZGV0ZWN0ZWQgYnV0IHdlIGFyZSBub3QgYWJsZSB0byBvcGVuIGl0LiBSZXR1cm4gZmFpbHVyZS4gKi8KKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRXJyb3Igb3BlbmluZyBhZGFwdGVyOiAlcyIsIHBjYXBfd2luMzJzdHJlcnJvcigpKTsKKwkJcmV0dXJuIFBDQVBfRVJST1I7CisJfQorCQorCS8qZ2V0IG5ldHdvcmsgdHlwZSovCisJaWYoUGFja2V0R2V0TmV0VHlwZSAocC0+YWRhcHRlciwmdHlwZSkgPT0gRkFMU0UpCisJeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW5ub3QgZGV0ZXJtaW5lIHRoZSBuZXR3b3JrIHR5cGU6ICVzIiwgcGNhcF93aW4zMnN0cmVycm9yKCkpOworCQlnb3RvIGJhZDsKKwl9CisJCisJLypTZXQgdGhlIGxpbmt0eXBlKi8KKwlzd2l0Y2ggKHR5cGUuTGlua1R5cGUpIAorCXsKKwljYXNlIE5kaXNNZWRpdW1XYW46CisJCXAtPmxpbmt0eXBlID0gRExUX0VOMTBNQjsKKwkJYnJlYWs7CisJCQorCWNhc2UgTmRpc01lZGl1bTgwMl8zOgorCQlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7CisJCS8qCisJCSAqIFRoaXMgaXMgKHByZXN1bWFibHkpIGEgcmVhbCBFdGhlcm5ldCBjYXB0dXJlOyBnaXZlIGl0IGEKKwkJICogbGluay1sYXllci10eXBlIGxpc3Qgd2l0aCBETFRfRU4xME1CIGFuZCBETFRfRE9DU0lTLCBzbworCQkgKiB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiBsZXQgeW91IGNob29zZSBpdCwgaW4gY2FzZSB5b3UncmUKKwkJICogY2FwdHVyaW5nIERPQ1NJUyB0cmFmZmljIHRoYXQgYSBDaXNjbyBDYWJsZSBNb2RlbQorCQkgKiBUZXJtaW5hdGlvbiBTeXN0ZW0gaXMgcHV0dGluZyBvdXQgb250byBhbiBFdGhlcm5ldCAoaXQKKwkJICogZG9lc24ndCBwdXQgYW4gRXRoZXJuZXQgaGVhZGVyIG9udG8gdGhlIHdpcmUsIGl0IHB1dHMgcmF3CisJCSAqIERPQ1NJUyBmcmFtZXMgb3V0IG9uIHRoZSB3aXJlIGluc2lkZSB0aGUgbG93LWxldmVsCisJCSAqIEV0aGVybmV0IGZyYW1pbmcpLgorCQkgKi8KKwkJcC0+ZGx0X2xpc3QgPSAodV9pbnQgKikgbWFsbG9jKHNpemVvZih1X2ludCkgKiAyKTsKKwkJLyoKKwkJICogSWYgdGhhdCBmYWlscywganVzdCBsZWF2ZSB0aGUgbGlzdCBlbXB0eS4KKwkJICovCisJCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7CisJCQlwLT5kbHRfbGlzdFswXSA9IERMVF9FTjEwTUI7CisJCQlwLT5kbHRfbGlzdFsxXSA9IERMVF9ET0NTSVM7CisJCQlwLT5kbHRfY291bnQgPSAyOworCQl9CisJCWJyZWFrOworCQkKKwljYXNlIE5kaXNNZWRpdW1GZGRpOgorCQlwLT5saW5rdHlwZSA9IERMVF9GRERJOworCQlicmVhazsKKwkJCisJY2FzZSBOZGlzTWVkaXVtODAyXzU6CQkJCisJCXAtPmxpbmt0eXBlID0gRExUX0lFRUU4MDI7CQorCQlicmVhazsKKwkJCisJY2FzZSBOZGlzTWVkaXVtQXJjbmV0UmF3OgorCQlwLT5saW5rdHlwZSA9IERMVF9BUkNORVQ7CisJCWJyZWFrOworCQkKKwljYXNlIE5kaXNNZWRpdW1BcmNuZXQ4NzhfMjoKKwkJcC0+bGlua3R5cGUgPSBETFRfQVJDTkVUOworCQlicmVhazsKKwkJCisJY2FzZSBOZGlzTWVkaXVtQXRtOgorCQlwLT5saW5rdHlwZSA9IERMVF9BVE1fUkZDMTQ4MzsKKwkJYnJlYWs7CisJCQorCWNhc2UgTmRpc01lZGl1bUNIRExDOgorCQlwLT5saW5rdHlwZSA9IERMVF9DSERMQzsKKwkJYnJlYWs7CisKKwljYXNlIE5kaXNNZWRpdW1QUFBTZXJpYWw6CisJCXAtPmxpbmt0eXBlID0gRExUX1BQUF9TRVJJQUw7CisJCWJyZWFrOworCisJY2FzZSBOZGlzTWVkaXVtTnVsbDoKKwkJcC0+bGlua3R5cGUgPSBETFRfTlVMTDsKKwkJYnJlYWs7CisKKwljYXNlIE5kaXNNZWRpdW1CYXJlODAyMTE6CisJCXAtPmxpbmt0eXBlID0gRExUX0lFRUU4MDJfMTE7CisJCWJyZWFrOworCisJY2FzZSBOZGlzTWVkaXVtUmFkaW84MDIxMToKKwkJcC0+bGlua3R5cGUgPSBETFRfSUVFRTgwMl8xMV9SQURJTzsKKwkJYnJlYWs7CisKKwljYXNlIE5kaXNNZWRpdW1QcGk6CisJCXAtPmxpbmt0eXBlID0gRExUX1BQSTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwLT5saW5rdHlwZSA9IERMVF9FTjEwTUI7CQkJLyphbiB1bmtub3duIGFkYXB0ZXIgaXMgYXNzdW1lZCB0byBiZSBldGhlcm5ldCovCisJCWJyZWFrOworCX0KKworCS8qIFNldCBwcm9taXNjdW91cyBtb2RlICovCisJaWYgKHAtPm9wdC5wcm9taXNjKSAKKwl7CisKKwkJaWYgKFBhY2tldFNldEh3RmlsdGVyKHAtPmFkYXB0ZXIsTkRJU19QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUykgPT0gRkFMU0UpCisJCXsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImZhaWxlZCB0byBzZXQgaGFyZHdhcmUgZmlsdGVyIHRvIHByb21pc2N1b3VzIG1vZGUiKTsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCWVsc2UgCisJeworCQlpZiAoUGFja2V0U2V0SHdGaWx0ZXIocC0+YWRhcHRlcixORElTX1BBQ0tFVF9UWVBFX0FMTF9MT0NBTCkgPT0gRkFMU0UpCisJCXsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImZhaWxlZCB0byBzZXQgaGFyZHdhcmUgZmlsdGVyIHRvIG5vbi1wcm9taXNjdW91cyBtb2RlIik7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKworCS8qIFNldCB0aGUgYnVmZmVyIHNpemUgKi8KKwlwLT5idWZzaXplID0gV0lOMzJfREVGQVVMVF9VU0VSX0JVRkZFUl9TSVpFOworCisJLyogYWxsb2NhdGUgUGFja2V0IHN0cnVjdHVyZSB1c2VkIGR1cmluZyB0aGUgY2FwdHVyZSAqLworCWlmKChwLT5QYWNrZXQgPSBQYWNrZXRBbGxvY2F0ZVBhY2tldCgpKT09TlVMTCkKKwl7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgImZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgUEFDS0VUIHN0cnVjdHVyZSIpOworCQlnb3RvIGJhZDsKKwl9CisKKwlpZighKHAtPmFkYXB0ZXItPkZsYWdzICYgSU5GT19GTEFHX0RBR19DQVJEKSkKKwl7CisJLyogCisJICogVHJhZGl0aW9uYWwgQWRhcHRlciAKKwkgKi8KKwkJLyoKKwkJICogSWYgdGhlIGJ1ZmZlciBzaXplIHdhc24ndCBleHBsaWNpdGx5IHNldCwgZGVmYXVsdCB0bworCQkgKiBXSU4zMl9ERUZBVUxUX1VTRVJfQlVGRkVSX1NJWkUuCisJCSAqLworCSAJaWYgKHAtPm9wdC5idWZmZXJfc2l6ZSA9PSAwKQorCSAJCXAtPm9wdC5idWZmZXJfc2l6ZSA9IFdJTjMyX0RFRkFVTFRfS0VSTkVMX0JVRkZFUl9TSVpFOworCisJCWlmKFBhY2tldFNldEJ1ZmYocC0+YWRhcHRlcixwLT5vcHQuYnVmZmVyX3NpemUpPT1GQUxTRSkKKwkJeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiZHJpdmVyIGVycm9yOiBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUga2VybmVsIGJ1ZmZlciIpOworCQkJZ290byBiYWQ7CisJCX0KKwkJCisJCXAtPmJ1ZmZlciA9ICh1X2NoYXIgKiltYWxsb2MocC0+YnVmc2l6ZSk7CisJCWlmIChwLT5idWZmZXIgPT0gTlVMTCkgCisJCXsKKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm1hbGxvYzogJXMiLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCQkKKwkJUGFja2V0SW5pdFBhY2tldChwLT5QYWNrZXQsKEJZVEUqKXAtPmJ1ZmZlcixwLT5idWZzaXplKTsKKwkJCisJCS8qIHRlbGwgdGhlIGRyaXZlciB0byBjb3B5IHRoZSBidWZmZXIgb25seSBpZiBpdCBjb250YWlucyBhdCBsZWFzdCAxNksgKi8KKwkJaWYoUGFja2V0U2V0TWluVG9Db3B5KHAtPmFkYXB0ZXIsMTYwMDApPT1GQUxTRSkKKwkJeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCJFcnJvciBjYWxsaW5nIFBhY2tldFNldE1pblRvQ29weTogJXMiLCBwY2FwX3dpbjMyc3RyZXJyb3IoKSk7CisJCQlnb3RvIGJhZDsKKwkJfQorCX0KKwllbHNlCisjaWZkZWYgSEFWRV9EQUdfQVBJCisJeworCS8qIAorCSAqIERhZyBDYXJkIAorCSAqLworCQlMT05HCXN0YXR1czsKKwkJSEtFWQlkYWdrZXk7CisJCURXT1JECWxwdHlwZTsKKwkJRFdPUkQJbHBjYmRhdGE7CisJCWludAkJcG9zdHlwZSA9IDA7CisJCWNoYXIJa2V5bmFtZVs1MTJdOworCQkKKwkJc25wcmludGYoa2V5bmFtZSwgc2l6ZW9mKGtleW5hbWUpLCAiJXNcXENhcmRQYXJhbXNcXCVzIiwgCisJCQkiU1lTVEVNXFxDdXJyZW50Q29udHJvbFNldFxcU2VydmljZXNcXERBRyIsCisJCQlzdHJzdHIoX3N0cmx3cihwLT5vcHQuc291cmNlKSwgImRhZyIpKTsKKwkJZG8KKwkJeworCQkJc3RhdHVzID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwga2V5bmFtZSwgMCwgS0VZX1JFQUQsICZkYWdrZXkpOworCQkJaWYoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCisJCQkJYnJlYWs7CisJCQkKKwkJCXN0YXR1cyA9IFJlZ1F1ZXJ5VmFsdWVFeChkYWdrZXksCisJCQkJIlBvc1R5cGUiLAorCQkJCU5VTEwsCisJCQkJJmxwdHlwZSwKKwkJCQkoY2hhciopJnBvc3R5cGUsCisJCQkJJmxwY2JkYXRhKTsKKwkJCQorCQkJaWYoc3RhdHVzICE9IEVSUk9SX1NVQ0NFU1MpCisJCQl7CisJCQkJcG9zdHlwZSA9IDA7CisJCQl9CisJCQkKKwkJCVJlZ0Nsb3NlS2V5KGRhZ2tleSk7CisJCX0KKwkJd2hpbGUoRkFMU0UpOworCQkKKwkJCisJCXAtPnNuYXBzaG90ID0gUGFja2V0U2V0U25hcExlbihwLT5hZGFwdGVyLCBzbmFwbGVuKTsKKwkJCisJCS8qIFNldCB0aGUgbGVuZ3RoIG9mIHRoZSBGQ1MgYXNzb2NpYXRlZCB0byBhbnkgcGFja2V0LiBUaGlzIHZhbHVlIAorCQkgKiB3aWxsIGJlIHN1YnRyYWN0ZWQgdG8gdGhlIHBhY2tldCBsZW5ndGggKi8KKwkJcC0+bWQuZGFnX2Zjc19iaXRzID0gcC0+YWRhcHRlci0+RGFnRmNzTGVuOworCX0KKyNlbHNlCisJZ290byBiYWQ7CisjZW5kaWYgLyogSEFWRV9EQUdfQVBJICovCisJCisJUGFja2V0U2V0UmVhZFRpbWVvdXQocC0+YWRhcHRlciwgcC0+bWQudGltZW91dCk7CisJCisjaWZkZWYgSEFWRV9EQUdfQVBJCisJaWYocC0+YWRhcHRlci0+RmxhZ3MgJiBJTkZPX0ZMQUdfREFHX0NBUkQpCisJeworCQkvKiBpbnN0YWxsIGRhZyBzcGVjaWZpYyBoYW5kbGVycyBmb3IgcmVhZCBhbmQgc2V0ZmlsdGVyICovCisJCXAtPnJlYWRfb3AgPSBwY2FwX3JlYWRfd2luMzJfZGFnOworCQlwLT5zZXRmaWx0ZXJfb3AgPSBwY2FwX3NldGZpbHRlcl93aW4zMl9kYWc7CisJfQorCWVsc2UKKwl7CisjZW5kaWYgLyogSEFWRV9EQUdfQVBJICovCisJCS8qIGluc3RhbGwgdHJhZGl0aW9uYWwgbnBmIGhhbmRsZXJzIGZvciByZWFkIGFuZCBzZXRmaWx0ZXIgKi8KKwkJcC0+cmVhZF9vcCA9IHBjYXBfcmVhZF93aW4zMl9ucGY7CisJCXAtPnNldGZpbHRlcl9vcCA9IHBjYXBfc2V0ZmlsdGVyX3dpbjMyX25wZjsKKyNpZmRlZiBIQVZFX0RBR19BUEkKKwl9CisjZW5kaWYgLyogSEFWRV9EQUdfQVBJICovCisJcC0+c2V0ZGlyZWN0aW9uX29wID0gTlVMTDsJLyogTm90IGltcGxlbWVudGVkLiAqLworCSAgICAvKiBYWFggLSBjYW4gdGhpcyBiZSBpbXBsZW1lbnRlZCBvbiBzb21lIHZlcnNpb25zIG9mIFdpbmRvd3M/ICovCisJcC0+aW5qZWN0X29wID0gcGNhcF9pbmplY3Rfd2luMzI7CisJcC0+c2V0X2RhdGFsaW5rX29wID0gTlVMTDsJLyogY2FuJ3QgY2hhbmdlIGRhdGEgbGluayB0eXBlICovCisJcC0+Z2V0bm9uYmxvY2tfb3AgPSBwY2FwX2dldG5vbmJsb2NrX3dpbjMyOworCXAtPnNldG5vbmJsb2NrX29wID0gcGNhcF9zZXRub25ibG9ja193aW4zMjsKKwlwLT5zdGF0c19vcCA9IHBjYXBfc3RhdHNfd2luMzI7CisJcC0+c2V0YnVmZl9vcCA9IHBjYXBfc2V0YnVmZl93aW4zMjsKKwlwLT5zZXRtb2RlX29wID0gcGNhcF9zZXRtb2RlX3dpbjMyOworCXAtPnNldG1pbnRvY29weV9vcCA9IHBjYXBfc2V0bWludG9jb3B5X3dpbjMyOworCXAtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfd2luMzI7CisKKwlyZXR1cm4gKDApOworYmFkOgorCXBjYXBfY2xlYW51cF93aW4zMihwKTsKKwlyZXR1cm4gKFBDQVBfRVJST1IpOworfQorCitwY2FwX3QgKgorcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqZGV2aWNlLCBjaGFyICplYnVmKQoreworCXBjYXBfdCAqcDsKKworCWlmIChzdHJsZW4oZGV2aWNlKSA9PSAxKQorCXsKKwkJLyoKKwkJICogSXQncyBwcm9iYWJseSBhIHVuaWNvZGUgc3RyaW5nCisJCSAqIENvbnZlcnQgdG8gYXNjaWkgYW5kIHBhc3MgaXQgdG8gcGNhcF9jcmVhdGVfY29tbW9uCisJCSAqCisJCSAqIFRoaXMgd29uZGVyZnVsIGhhY2sgaXMgbmVlZGVkIGJlY2F1c2UgcGNhcF9sb29rdXBkZXYgc3RpbGwgcmV0dXJucworCQkgKiB1bmljb2RlIHN0cmluZ3MsIGFuZCBpdCdzIHVzZWQgYnkgd2luZHVtcCB3aGVuIG5vIGRldmljZSBpcyBzcGVjaWZpZWQKKwkJICogaW4gdGhlIGNvbW1hbmQgbGluZQorCQkgKi8KKwkJc2l6ZV90IGxlbmd0aDsKKwkJY2hhciogZGV2aWNlQXNjaWk7CisKKwkJbGVuZ3RoID0gd2NzbGVuKCh3Y2hhcl90KilkZXZpY2UpOworCisJCWRldmljZUFzY2lpID0gKGNoYXIqKW1hbGxvYyhsZW5ndGggKyAxKTsKKworCQlpZiAoZGV2aWNlQXNjaWkgPT0gTlVMTCkKKwkJeworCQkJc25wcmludGYoZWJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIk1hbGxvYyBmYWlsZWQiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJc25wcmludGYoZGV2aWNlQXNjaWksIGxlbmd0aCArIDEsICIld3MiLCAod2NoYXJfdCopZGV2aWNlKTsKKwkJcCA9IHBjYXBfY3JlYXRlX2NvbW1vbihkZXZpY2VBc2NpaSwgZWJ1Zik7CisJCWZyZWUoZGV2aWNlQXNjaWkpOworCX0KKwllbHNlCisJeworCQlwID0gcGNhcF9jcmVhdGVfY29tbW9uKGRldmljZSwgZWJ1Zik7CisJfQorCisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKworCXAtPmFjdGl2YXRlX29wID0gcGNhcF9hY3RpdmF0ZV93aW4zMjsKKwlyZXR1cm4gKHApOworfQorCitzdGF0aWMgaW50CitwY2FwX3NldGZpbHRlcl93aW4zMl9ucGYocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQoreworCWlmKFBhY2tldFNldEJwZihwLT5hZGFwdGVyLGZwKT09RkFMU0UpeworCQkvKgorCQkgKiBLZXJuZWwgZmlsdGVyIG5vdCBpbnN0YWxsZWQuCisJCSAqIFhYWCAtIGZhbGwgYmFjayBvbiB1c2VybGFuZCBmaWx0ZXJpbmcsIGFzIGlzIGRvbmUKKwkJICogb24gb3RoZXIgcGxhdGZvcm1zPworCQkgKi8KKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRHJpdmVyIGVycm9yOiBjYW5ub3Qgc2V0IGJwZiBmaWx0ZXI6ICVzIiwgcGNhcF93aW4zMnN0cmVycm9yKCkpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIERpc2NhcmQgYW55IHByZXZpb3VzbHktcmVjZWl2ZWQgcGFja2V0cywgYXMgdGhleSBtaWdodCBoYXZlCisJICogcGFzc2VkIHdoYXRldmVyIGZpbHRlciB3YXMgZm9ybWVybHkgaW4gZWZmZWN0LCBidXQgbWlnaHQKKwkgKiBub3QgcGFzcyB0aGlzIGZpbHRlciAoQklPQ1NFVEYgZGlzY2FyZHMgcGFja2V0cyBidWZmZXJlZAorCSAqIGluIHRoZSBrZXJuZWwsIHNvIHlvdSBjYW4gbG9zZSBwYWNrZXRzIGluIGFueSBjYXNlKS4KKwkgKi8KKwlwLT5jYyA9IDA7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFdlIGZpbHRlciBhdCB1c2VyIGxldmVsLCBzaW5jZSB0aGUga2VybmVsIGRyaXZlciBkb2VzJ3QgcHJvY2VzcyB0aGUgcGFja2V0cworICovCitzdGF0aWMgaW50IAorcGNhcF9zZXRmaWx0ZXJfd2luMzJfZGFnKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCkgeworCQorCWlmKCFmcCkgCisJeworCQlzdHJuY3B5KHAtPmVycmJ1ZiwgInNldGZpbHRlcjogTm8gZmlsdGVyIHNwZWNpZmllZCIsIHNpemVvZihwLT5lcnJidWYpKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwkvKiBJbnN0YWxsIGEgdXNlciBsZXZlbCBmaWx0ZXIgKi8KKwlpZiAoaW5zdGFsbF9icGZfcHJvZ3JhbShwLCBmcCkgPCAwKSAKKwl7CisJCXNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCQkic2V0ZmlsdGVyLCB1bmFibGUgdG8gaW5zdGFsbCB0aGUgZmlsdGVyOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKwkKKwlwLT5tZC51c2VfYnBmID0gMDsKKwkKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitwY2FwX2dldG5vbmJsb2NrX3dpbjMyKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKQoreworCS8qCisJICogWFhYIC0gaWYgdGhlcmUgd2VyZSBhIFBhY2tldEdldFJlYWRUaW1lb3V0KCkgY2FsbCwgd2UKKwkgKiB3b3VsZCB1c2UgaXQsIGFuZCByZXR1cm4gMSBpZiB0aGUgdGltZW91dCBpcyAtMQorCSAqIGFuZCAwIG90aGVyd2lzZS4KKwkgKi8KKwlyZXR1cm4gKHAtPm5vbmJsb2NrKTsKK30KKworc3RhdGljIGludAorcGNhcF9zZXRub25ibG9ja193aW4zMihwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKQoreworCWludCBuZXd0aW1lb3V0OworCisJaWYgKG5vbmJsb2NrKSB7CisJCS8qCisJCSAqIFNldCB0aGUgcmVhZCB0aW1lb3V0IHRvIC0xIGZvciBub24tYmxvY2tpbmcgbW9kZS4KKwkJICovCisJCW5ld3RpbWVvdXQgPSAtMTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBSZXN0b3JlIHRoZSB0aW1lb3V0IHNldCB3aGVuIHRoZSBkZXZpY2Ugd2FzIG9wZW5lZC4KKwkJICogKE5vdGUgdGhhdCB0aGlzIG1heSBiZSAtMSwgaW4gd2hpY2ggY2FzZSB3ZSdyZSBub3QKKwkJICogcmVhbGx5IGxlYXZpbmcgbm9uLWJsb2NraW5nIG1vZGUuKQorCQkgKi8KKwkJbmV3dGltZW91dCA9IHAtPm1kLnRpbWVvdXQ7CisJfQorCWlmICghUGFja2V0U2V0UmVhZFRpbWVvdXQocC0+YWRhcHRlciwgbmV3dGltZW91dCkpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIlBhY2tldFNldFJlYWRUaW1lb3V0OiAlcyIsIHBjYXBfd2luMzJzdHJlcnJvcigpKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCXAtPm5vbmJsb2NrID0gKG5ld3RpbWVvdXQgPT0gLTEpOworCXJldHVybiAoMCk7Cit9CisKKy8qcGxhdGZvcm0tZGVwZW5kZW50IHJvdXRpbmUgdG8gYWRkIGRldmljZXMgb3RoZXIgdGhhbiBORElTIGludGVyZmFjZXMqLworaW50CitwY2FwX3BsYXRmb3JtX2ZpbmRkZXZzKHBjYXBfaWZfdCAqKmFsbGRldnNwLCBjaGFyICplcnJidWYpCit7CisJcmV0dXJuICgwKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC4zcGNhcC5pbiBiL2xpYnBjYXAtMS4zLjAvcGNhcC4zcGNhcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjk5Y2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLjNwY2FwLmluCkBAIC0wLDAgKzEsODgzIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwLjNwY2FwLmluLHYgMS4xIDIwMDgtMTAtMjEgMDc6MzM6MDEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUCAzUENBUCAiNCBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXAgXC0gUGFja2V0IENhcHR1cmUgbGlicmFyeQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuTFAKKy5mdCBCCisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCitUaGUgUGFja2V0IENhcHR1cmUgbGlicmFyeQorcHJvdmlkZXMgYSBoaWdoIGxldmVsIGludGVyZmFjZSB0byBwYWNrZXQgY2FwdHVyZSBzeXN0ZW1zLiBBbGwgcGFja2V0cworb24gdGhlIG5ldHdvcmssIGV2ZW4gdGhvc2UgZGVzdGluZWQgZm9yIG90aGVyIGhvc3RzLCBhcmUgYWNjZXNzaWJsZQordGhyb3VnaCB0aGlzIG1lY2hhbmlzbS4KK0l0IGFsc28gc3VwcG9ydHMgc2F2aW5nIGNhcHR1cmVkIHBhY2tldHMgdG8gYSBgYHNhdmVmaWxlJycsIGFuZCByZWFkaW5nCitwYWNrZXRzIGZyb20gYSBgYHNhdmVmaWxlJycuCisuU1MgT3BlbmluZyBhIGNhcHR1cmUgaGFuZGxlIGZvciByZWFkaW5nCitUbyBvcGVuIGEgaGFuZGxlIGZvciBhIGxpdmUgY2FwdHVyZSwgZ2l2ZW4gdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgb3IKK290aGVyIGludGVyZmFjZSBvbiB3aGljaCB0aGUgY2FwdHVyZSBzaG91bGQgYmUgZG9uZSwgY2FsbAorLkJSIHBjYXBfY3JlYXRlICgpLAorc2V0IHRoZSBhcHByb3ByaWF0ZSBvcHRpb25zIG9uIHRoZSBoYW5kbGUsIGFuZCB0aGVuIGFjdGl2YXRlIGl0IHdpdGgKKy5CUiBwY2FwX2FjdGl2YXRlICgpLgorLlBQCitUbyBvYnRhaW4gYSBsaXN0IG9mIGRldmljZXMgdGhhdCBjYW4gYmUgb3BlbmVkIGZvciBhIGxpdmUgY2FwdHVyZSwgY2FsbAorLkJSIHBjYXBfZmluZGFsbGRldnMgKCk7Cit0byBmcmVlIHRoZSBsaXN0IHJldHVybmVkIGJ5CisuQlIgcGNhcF9maW5kYWxsZGV2cyAoKSwKK2NhbGwKKy5CUiBwY2FwX2ZyZWVhbGxkZXZzICgpLgorLkJSIHBjYXBfbG9va3VwZGV2ICgpCit3aWxsIHJldHVybiB0aGUgZmlyc3QgZGV2aWNlIG9uIHRoYXQgbGlzdCB0aGF0IGlzIG5vdCBhIGBgbG9vcGJhY2tgYAorbmV0d29yayBpbnRlcmZhY2UuCisuUFAKK1RvIG9wZW4gYSBoYW5kbGUgZm9yIGEgYGBzYXZlZmlsZScnIGZyb20gd2hpY2ggdG8gcmVhZCBwYWNrZXRzLCBnaXZlbiB0aGUKK3BhdGhuYW1lIG9mIHRoZSBgYHNhdmVmaWxlJycsIGNhbGwKKy5CUiBwY2FwX29wZW5fb2ZmbGluZSAoKTsKK3RvIHNldCB1cCBhIGhhbmRsZSBmb3IgYSBgYHNhdmVmaWxlJycsIGdpdmVuIGEKKy5CICJGSUxFXCAqIgorcmVmZXJyaW5nIHRvIGEgZmlsZSBhbHJlYWR5IG9wZW5lZCBmb3IgcmVhZGluZywgY2FsbAorLkJSIHBjYXBfZm9wZW5fb2ZmbGluZSAoKS4KKy5QUAorSW4gb3JkZXIgdG8gZ2V0IGEgYGBmYWtlJycKKy5CIHBjYXBfdAorZm9yIHVzZSBpbiByb3V0aW5lcyB0aGF0IHJlcXVpcmUgYQorLkIgcGNhcF90CithcyBhbiBhcmd1bWVudCwgc3VjaCBhcyByb3V0aW5lcyB0byBvcGVuIGEgYGBzYXZlZmlsZScnIGZvciB3cml0aW5nIGFuZAordG8gY29tcGlsZSBhIGZpbHRlciBleHByZXNzaW9uLCBjYWxsCisuQlIgcGNhcF9vcGVuX2RlYWQgKCkuCisuUFAKKy5CUiBwY2FwX2NyZWF0ZSAoKSwKKy5CUiBwY2FwX29wZW5fb2ZmbGluZSAoKSwKKy5CUiBwY2FwX2ZvcGVuX29mZmxpbmUgKCksCithbmQKKy5CUiBwY2FwX29wZW5fZGVhZCAoKQorcmV0dXJuIGEgcG9pbnRlciB0byBhCisuQlIgcGNhcF90ICwKK3doaWNoIGlzIHRoZSBoYW5kbGUgdXNlZCBmb3IgcmVhZGluZyBwYWNrZXRzIGZyb20gdGhlIGNhcHR1cmUgc3RyZWFtIG9yCit0aGUgYGBzYXZlZmlsZScnLCBhbmQgZm9yIGZpbmRpbmcgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYXB0dXJlCitzdHJlYW0gb3IgYGBzYXZlZmlsZScnLgorVG8gY2xvc2UgYSBoYW5kbGUsIHVzZQorLkJSIHBjYXBfY2xvc2UgKCkuCisuUFAKK1RoZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBvbiBhIGNhcHR1cmUgaGFuZGxlIGluY2x1ZGUKKy5JUCAic25hcHNob3QgbGVuZ3RoIgorSWYsIHdoZW4gY2FwdHVyaW5nLCB5b3UgY2FwdHVyZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBwYWNrZXQsIHRoYXQKK3JlcXVpcmVzIG1vcmUgQ1BVIHRpbWUgdG8gY29weSB0aGUgcGFja2V0IHRvIHlvdXIgYXBwbGljYXRpb24sIG1vcmUgZGlzaworYW5kIHBvc3NpYmx5IG5ldHdvcmsgYmFuZHdpZHRoIHRvIHdyaXRlIHRoZSBwYWNrZXQgZGF0YSB0byBhIGZpbGUsIGFuZAorbW9yZSBkaXNrIHNwYWNlIHRvIHNhdmUgdGhlIHBhY2tldC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBlbnRpcmUKK2NvbnRlbnRzIG9mIHRoZSBwYWNrZXQgLSBmb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlCitUQ1AgaGVhZGVycyBvZiBwYWNrZXRzIC0geW91IGNhbiBzZXQgdGhlICJzbmFwc2hvdCBsZW5ndGgiIGZvciB0aGUKK2NhcHR1cmUgdG8gYW4gYXBwcm9wcmlhdGUgdmFsdWUuICBJZiB0aGUgc25hcHNob3QgbGVuZ3RoIGlzIHNldCB0bworLklSIHNuYXBsZW4gLAorYW5kCisuSSBzbmFwbGVuCitpcyBsZXNzCit0aGFuIHRoZSBzaXplIG9mIGEgcGFja2V0IHRoYXQgaXMgY2FwdHVyZWQsIG9ubHkgdGhlIGZpcnN0CisuSSBzbmFwbGVuCitieXRlcyBvZiB0aGF0IHBhY2tldCB3aWxsIGJlIGNhcHR1cmVkIGFuZCBwcm92aWRlZCBhcyBwYWNrZXQgZGF0YS4KKy5JUAorQSBzbmFwc2hvdCBsZW5ndGggb2YgNjU1MzUgc2hvdWxkIGJlIHN1ZmZpY2llbnQsIG9uIG1vc3QgaWYgbm90IGFsbAorbmV0d29ya3MsIHRvIGNhcHR1cmUgYWxsIHRoZSBkYXRhIGF2YWlsYWJsZSBmcm9tIHRoZSBwYWNrZXQuCisuSVAKK1RoZSBzbmFwc2hvdCBsZW5ndGggaXMgc2V0IHdpdGgKKy5CUiBwY2FwX3NldF9zbmFwbGVuICgpLgorLklQICJwcm9taXNjdW91cyBtb2RlIgorT24gYnJvYWRjYXN0IExBTnMgc3VjaCBhcyBFdGhlcm5ldCwgaWYgdGhlIG5ldHdvcmsgaXNuJ3Qgc3dpdGNoZWQsIG9yIGlmCit0aGUgYWRhcHRlciBpcyBjb25uZWN0ZWQgdG8gYSAibWlycm9yIHBvcnQiIG9uIGEgc3dpdGNoIHRvIHdoaWNoIGFsbAorcGFja2V0cyBwYXNzaW5nIHRocm91Z2ggdGhlIHN3aXRjaCBhcmUgc2VudCwgYSBuZXR3b3JrIGFkYXB0ZXIgcmVjZWl2ZXMKK2FsbCBwYWNrZXRzIG9uIHRoZSBMQU4sIGluY2x1ZGluZyB1bmljYXN0IG9yIG11bHRpY2FzdCBwYWNrZXRzIG5vdCBzZW50Cit0byBhIG5ldHdvcmsgYWRkcmVzcyB0aGF0IHRoZSBuZXR3b3JrIGFkYXB0ZXIgaXNuJ3QgY29uZmlndXJlZCB0bworcmVjb2duaXplLgorLklQCitOb3JtYWxseSwgdGhlIGFkYXB0ZXIgd2lsbCBkaXNjYXJkIHRob3NlIHBhY2tldHM7IGhvd2V2ZXIsIG1hbnkgbmV0d29yaworYWRhcHRlcnMgc3VwcG9ydCAicHJvbWlzY3VvdXMgbW9kZSIsIHdoaWNoIGlzIGEgbW9kZSBpbiB3aGljaCBhbGwKK3BhY2tldHMsIGV2ZW4gaWYgdGhleSBhcmUgbm90IHNlbnQgdG8gYW4gYWRkcmVzcyB0aGF0IHRoZSBhZGFwdGVyCityZWNvZ25pemVzLCBhcmUgcHJvdmlkZWQgdG8gdGhlIGhvc3QuICBUaGlzIGlzIHVzZWZ1bCBmb3IgcGFzc2l2ZWx5CitjYXB0dXJpbmcgdHJhZmZpYyBiZXR3ZWVuIHR3byBvciBtb3JlIG90aGVyIGhvc3RzIGZvciBhbmFseXNpcy4KKy5JUAorTm90ZSB0aGF0IGV2ZW4gaWYgYW4gYXBwbGljYXRpb24gZG9lcyBub3Qgc2V0IHByb21pc2N1b3VzIG1vZGUsIHRoZQorYWRhcHRlciBjb3VsZCB3ZWxsIGJlIGluIHByb21pc2N1b3VzIG1vZGUgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgorLklQCitGb3Igbm93LCB0aGlzIGRvZXNuJ3Qgd29yayBvbiB0aGUgImFueSIgZGV2aWNlOyBpZiBhbiBhcmd1bWVudCBvZiAiYW55Igorb3IgTlVMTCBpcyBzdXBwbGllZCwgdGhlIHNldHRpbmcgb2YgcHJvbWlzY3VvdXMgbW9kZSBpcyBpZ25vcmVkLgorLklQCitQcm9taXNjdW91cyBtb2RlIGlzIHNldCB3aXRoCisuQlIgcGNhcF9zZXRfcHJvbWlzYyAoKS4KKy5JUCAibW9uaXRvciBtb2RlIgorT24gSUVFRSA4MDIuMTEgd2lyZWxlc3MgTEFOcywgZXZlbiBpZiBhbiBhZGFwdGVyIGlzIGluIHByb21pc2N1b3VzIG1vZGUsCitpdCB3aWxsIHN1cHBseSB0byB0aGUgaG9zdCBvbmx5IGZyYW1lcyBmb3IgdGhlIG5ldHdvcmsgd2l0aCB3aGljaCBpdCdzCithc3NvY2lhdGVkLiAgSXQgbWlnaHQgYWxzbyBzdXBwbHkgb25seSBkYXRhIGZyYW1lcywgbm90IG1hbmFnZW1lbnQgb3IKK2NvbnRyb2wgZnJhbWVzLCBhbmQgbWlnaHQgbm90IHByb3ZpZGUgdGhlIDgwMi4xMSBoZWFkZXIgb3IgcmFkaW8KK2luZm9ybWF0aW9uIHBzZXVkby1oZWFkZXIgZm9yIHRob3NlIGZyYW1lcy4KKy5JUAorSW4gIm1vbml0b3IgbW9kZSIsIHNvbWV0aW1lcyBhbHNvIGNhbGxlZCAicmZtb24gbW9kZSIgKGZvciAiUmFkaW8KK0ZyZXF1ZW5jeSBNT05pdG9yIiksIHRoZSBhZGFwdGVyIHdpbGwgc3VwcGx5IGFsbCBmcmFtZXMgdGhhdCBpdAorcmVjZWl2ZXMsIHdpdGggODAyLjExIGhlYWRlcnMsIGFuZCBtaWdodCBzdXBwbHkgYSBwc2V1ZG8taGVhZGVyIHdpdGgKK3JhZGlvIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmcmFtZSBhcyB3ZWxsLgorLklQCitOb3RlIHRoYXQgaW4gbW9uaXRvciBtb2RlIHRoZSBhZGFwdGVyIG1pZ2h0IGRpc2Fzc29jaWF0ZSBmcm9tIHRoZQorbmV0d29yayB3aXRoIHdoaWNoIGl0J3MgYXNzb2NpYXRlZCwgc28gdGhhdCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byB1c2UKK2FueSB3aXJlbGVzcyBuZXR3b3JrcyB3aXRoIHRoYXQgYWRhcHRlci4gIFRoaXMgY291bGQgcHJldmVudCBhY2Nlc3NpbmcKK2ZpbGVzIG9uIGEgbmV0d29yayBzZXJ2ZXIsIG9yIHJlc29sdmluZyBob3N0IG5hbWVzIG9yIG5ldHdvcmsgYWRkcmVzc2VzLAoraWYgeW91IGFyZSBjYXB0dXJpbmcgaW4gbW9uaXRvciBtb2RlIGFuZCBhcmUgbm90IGNvbm5lY3RlZCB0byBhbm90aGVyCituZXR3b3JrIHdpdGggYW5vdGhlciBhZGFwdGVyLgorLklQCitNb25pdG9yIG1vZGUgaXMgc2V0IHdpdGgKKy5CUiBwY2FwX3NldF9yZm1vbiAoKSwKK2FuZAorLkJSIHBjYXBfY2FuX3NldF9yZm1vbiAoKQorY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gYWRhcHRlciBjYW4gYmUgcHV0IGludG8gbW9uaXRvcgorbW9kZS4KKy5JUCAicmVhZCB0aW1lb3V0IgorSWYsIHdoZW4gY2FwdHVyaW5nLCBwYWNrZXRzIGFyZSBkZWxpdmVyZWQgYXMgc29vbiBhcyB0aGV5IGFycml2ZSwgdGhlCithcHBsaWNhdGlvbiBjYXB0dXJpbmcgdGhlIHBhY2tldHMgd2lsbCBiZSB3b2tlbiB1cCBmb3IgZWFjaCBwYWNrZXQgYXMgaXQKK2Fycml2ZXMsIGFuZCBtaWdodCBoYXZlIHRvIG1ha2Ugb25lIG9yIG1vcmUgY2FsbHMgdG8gdGhlIG9wZXJhdGluZworc3lzdGVtIHRvIGZldGNoIGVhY2ggcGFja2V0LgorLklQCitJZiwgaW5zdGVhZCwgcGFja2V0cyBhcmUgbm90IGRlbGl2ZXJlZCBhcyBzb29uIGFzIHRoZXkgYXJyaXZlLCBidXQgYXJlCitkZWxpdmVyZWQgYWZ0ZXIgYSBzaG9ydCBkZWxheSAoY2FsbGVkIGEgInJlYWQgdGltZW91dCIpLCBtb3JlIHRoYW4gb25lCitwYWNrZXQgY2FuIGJlIGFjY3VtdWxhdGVkIGJlZm9yZSB0aGUgcGFja2V0cyBhcmUgZGVsaXZlcmVkLCBzbyB0aGF0IGEKK3NpbmdsZSB3YWtldXAgd291bGQgYmUgZG9uZSBmb3IgbXVsdGlwbGUgcGFja2V0cywgYW5kIGVhY2ggc2V0IG9mIGNhbGxzCittYWRlIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdvdWxkIHN1cHBseSBtdWx0aXBsZSBwYWNrZXRzLCByYXRoZXIgdGhhbgorYSBzaW5nbGUgcGFja2V0LiAgVGhpcyByZWR1Y2VzIHRoZSBwZXItcGFja2V0IENQVSBvdmVyaGVhZCBpZiBwYWNrZXRzCithcmUgYXJyaXZpbmcgYXQgYSBoaWdoIHJhdGUsIGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBwYWNrZXRzIHBlciBzZWNvbmQKK3RoYXQgY2FuIGJlIGNhcHR1cmVkLgorLklQCitUaGUgcmVhZCB0aW1lb3V0IGlzIHJlcXVpcmVkIHNvIHRoYXQgYW4gYXBwbGljYXRpb24gd29uJ3Qgd2FpdCBmb3IgdGhlCitvcGVyYXRpbmcgc3lzdGVtJ3MgY2FwdHVyZSBidWZmZXIgdG8gZmlsbCB1cCBiZWZvcmUgcGFja2V0cyBhcmUKK2RlbGl2ZXJlZDsgaWYgcGFja2V0cyBhcmUgYXJyaXZpbmcgc2xvd2x5LCB0aGF0IHdhaXQgY291bGQgdGFrZSBhbgorYXJiaXRyYXJpbHkgbG9uZyBwZXJpb2Qgb2YgdGltZS4KKy5JUAorTm90IGFsbCBwbGF0Zm9ybXMgc3VwcG9ydCBhIHJlYWQgdGltZW91dDsgb24gcGxhdGZvcm1zIHRoYXQKK2Rvbid0LCB0aGUgcmVhZCB0aW1lb3V0IGlzIGlnbm9yZWQuICBBIHplcm8gdmFsdWUgZm9yIHRoZSB0aW1lb3V0LAorb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBhIHJlYWQgdGltZW91dCwKK3dpbGwgY2F1c2UgYSByZWFkIHRvIHdhaXQgZm9yZXZlciB0byBhbGxvdyBlbm91Z2ggcGFja2V0cyB0bworYXJyaXZlLCB3aXRoIG5vIHRpbWVvdXQuCisuSVAKKy5CUiBOT1RFIDoKK3RoZSByZWFkIHRpbWVvdXQgY2Fubm90IGJlIHVzZWQgdG8gY2F1c2UgY2FsbHMgdGhhdCByZWFkCitwYWNrZXRzIHRvIHJldHVybiB3aXRoaW4gYSBsaW1pdGVkIHBlcmlvZCBvZiB0aW1lLCBiZWNhdXNlLCBvbiBzb21lCitwbGF0Zm9ybXMsIHRoZSByZWFkIHRpbWVvdXQgaXNuJ3Qgc3VwcG9ydGVkLCBhbmQsIG9uIG90aGVyIHBsYXRmb3JtcywKK3RoZSB0aW1lciBkb2Vzbid0IHN0YXJ0IHVudGlsIGF0IGxlYXN0IG9uZSBwYWNrZXQgYXJyaXZlcy4gIFRoaXMgbWVhbnMKK3RoYXQgdGhlIHJlYWQgdGltZW91dCBzaG91bGQKKy5CIE5PVAorYmUgdXNlZCwgZm9yIGV4YW1wbGUsIGluIGFuIGludGVyYWN0aXZlIGFwcGxpY2F0aW9uIHRvIGFsbG93IHRoZSBwYWNrZXQKK2NhcHR1cmUgbG9vcCB0byBgYHBvbGwnJyBmb3IgdXNlciBpbnB1dCBwZXJpb2RpY2FsbHksIGFzIHRoZXJlJ3Mgbm8KK2d1YXJhbnRlZSB0aGF0IGEgY2FsbCByZWFkaW5nIHBhY2tldHMgd2lsbCByZXR1cm4gYWZ0ZXIgdGhlIHRpbWVvdXQKK2V4cGlyZXMgZXZlbiBpZiBubyBwYWNrZXRzIGhhdmUgYXJyaXZlZC4KKy5JUAorVGhlIHJlYWQgdGltZW91dCBpcyBzZXQgd2l0aAorLkJSIHBjYXBfc2V0X3RpbWVvdXQgKCkuCisuSVAgImJ1ZmZlciBzaXplIgorUGFja2V0cyB0aGF0IGFycml2ZSBmb3IgYSBjYXB0dXJlIGFyZSBzdG9yZWQgaW4gYSBidWZmZXIsIHNvIHRoYXQgdGhleQorZG8gbm90IGhhdmUgdG8gYmUgcmVhZCBieSB0aGUgYXBwbGljYXRpb24gYXMgc29vbiBhcyB0aGV5IGFycml2ZS4gIE9uCitzb21lIHBsYXRmb3JtcywgdGhlIGJ1ZmZlcidzIHNpemUgY2FuIGJlIHNldDsgYSBzaXplIHRoYXQncyB0b28gc21hbGwKK2NvdWxkIG1lYW4gdGhhdCwgaWYgdG9vIG1hbnkgcGFja2V0cyBhcmUgYmVpbmcgY2FwdHVyZWQgYW5kIHRoZSBzbmFwc2hvdAorbGVuZ3RoIGRvZXNuJ3QgbGltaXQgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQncyBidWZmZXJlZCwgcGFja2V0cyBjb3VsZAorYmUgZHJvcHBlZCBpZiB0aGUgYnVmZmVyIGZpbGxzIHVwIGJlZm9yZSB0aGUgYXBwbGljYXRpb24gY2FuIHJlYWQKK3BhY2tldHMgZnJvbSBpdCwgd2hpbGUgYSBzaXplIHRoYXQncyB0b28gbGFyZ2UgY291bGQgdXNlIG1vcmUKK25vbi1wYWdlYWJsZSBvcGVyYXRpbmcgc3lzdGVtIG1lbW9yeSB0aGFuIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50CitwYWNrZXRzIGZyb20gYmVpbmcgZHJvcHBlZC4KKy5JUAorVGhlIGJ1ZmZlciBzaXplIGlzIHNldCB3aXRoCisuQlIgcGNhcF9zZXRfYnVmZmVyX3NpemUgKCkuCisuSVAgInRpbWVzdGFtcCB0eXBlIgorT24gc29tZSBwbGF0Zm9ybXMsIHRoZSB0aW1lIHN0YW1wIGdpdmVuIHRvIHBhY2tldHMgb24gbGl2ZSBjYXB0dXJlcyBjYW4KK2NvbWUgZnJvbSBkaWZmZXJlbnQgc291cmNlcyB0aGF0IGNhbiBoYXZlIGRpZmZlcmVudCByZXNvbHV0aW9ucyBvciB0aGF0CitjYW4gaGF2ZSBkaWZmZXJlbnQgcmVsYXRpb25zaGlwcyB0byB0aGUgdGltZSB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IHRpbWUKK3N1cHBsaWVkIGJ5IHJvdXRpbmVzIG9uIHRoZSBuYXRpdmUgb3BlcmF0aW5nIHN5c3RlbS4gIFNlZQorLkJSIHBjYXAtdHN0YW1wIChATUFOX01JU0NfSU5GT0ApCitmb3IgYSBsaXN0IG9mIHRpbWUgc3RhbXAgdHlwZXMuCisuSVAKK1RoZSB0aW1lIHN0YW1wIHR5cGUgaXMgc2V0IHdpdGgKKy5CUiBwY2FwX3NldF90c3RhbXBfdHlwZSAoKS4KKy5QUAorUmVhZGluZyBwYWNrZXRzIGZyb20gYSBuZXR3b3JrIGludGVyZmFjZSBtYXkgcmVxdWlyZSB0aGF0IHlvdSBoYXZlCitzcGVjaWFsIHByaXZpbGVnZXM6CisuVFAKKy5CIFVuZGVyIFN1bk9TIDMueCBvciA0Lnggd2l0aCBOSVQgb3IgQlBGOgorWW91IG11c3QgaGF2ZSByZWFkIGFjY2VzcyB0bworLkkgL2Rldi9uaXQKK29yCisuSVIgL2Rldi9icGYqIC4KKy5UUAorLkIgVW5kZXIgU29sYXJpcyB3aXRoIERMUEk6CitZb3UgbXVzdCBoYXZlIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHRoZSBuZXR3b3JrIHBzZXVkbyBkZXZpY2UsIGUuZy4KKy5JUiAvZGV2L2xlIC4KK09uIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMgb2YgU29sYXJpcywgaG93ZXZlciwgdGhpcyBpcyBub3Qgc3VmZmljaWVudCB0bworYWxsb3cKKy5JIHRjcGR1bXAKK3RvIGNhcHR1cmUgaW4gcHJvbWlzY3VvdXMgbW9kZTsgb24gdGhvc2UgdmVyc2lvbnMgb2YgU29sYXJpcywgeW91IG11c3QKK2JlIHJvb3QsIG9yIHRoZSBhcHBsaWNhdGlvbiBjYXB0dXJpbmcgcGFja2V0cworbXVzdCBiZSBpbnN0YWxsZWQgc2V0dWlkIHRvIHJvb3QsIGluIG9yZGVyIHRvIGNhcHR1cmUgaW4gcHJvbWlzY3VvdXMKK21vZGUuICBOb3RlIHRoYXQsIG9uIG1hbnkgKHBlcmhhcHMgYWxsKSBpbnRlcmZhY2VzLCBpZiB5b3UgZG9uJ3QgY2FwdHVyZQoraW4gcHJvbWlzY3VvdXMgbW9kZSwgeW91IHdpbGwgbm90IHNlZSBhbnkgb3V0Z29pbmcgcGFja2V0cywgc28gYSBjYXB0dXJlCitub3QgZG9uZSBpbiBwcm9taXNjdW91cyBtb2RlIG1heSBub3QgYmUgdmVyeSB1c2VmdWwuCisuSVAKK0luIG5ld2VyIHZlcnNpb25zIG9mIFNvbGFyaXMsIHlvdSBtdXN0IGhhdmUgYmVlbiBnaXZlbiB0aGUKKy5CIG5ldF9yYXdhY2Nlc3MKK3ByaXZpbGVnZTsgdGhpcyBpcyBib3RoIG5lY2Vzc2FyeSBhbmQgc3VmZmljaWVudCB0byBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlCituZXR3b3JrIHBzZXVkby1kZXZpY2UgLSB0aGVyZSBpcyBubyBuZWVkIHRvIGNoYW5nZSB0aGUgcHJpdmlsZWdlcyBvbgordGhhdCBkZXZpY2UuICBBIHVzZXIgY2FuIGJlIGdpdmVuIHRoYXQgcHJpdmlsZWdlIGJ5LCBmb3IgZXhhbXBsZSwgYWRkaW5nCit0aGF0IHByaXZpbGVnZSB0byB0aGUgdXNlcidzCisuQiBkZWZhdWx0cHJpdgora2V5IHdpdGggdGhlCisuQiB1c2VybW9kICgxTSkKK2NvbW1hbmQuCisuVFAKKy5CIFVuZGVyIEhQLVVYIHdpdGggRExQSToKK1lvdSBtdXN0IGJlIHJvb3Qgb3IgdGhlIGFwcGxpY2F0aW9uIGNhcHR1cmluZyBwYWNrZXRzIG11c3QgYmUgaW5zdGFsbGVkCitzZXR1aWQgdG8gcm9vdC4KKy5UUAorLkIgVW5kZXIgSVJJWCB3aXRoIHNub29wOgorWW91IG11c3QgYmUgcm9vdCBvciB0aGUgYXBwbGljYXRpb24gY2FwdHVyaW5nIHBhY2tldHMgbXVzdCBiZSBpbnN0YWxsZWQKK3NldHVpZCB0byByb290LgorLlRQCisuQiBVbmRlciBMaW51eDoKK1lvdSBtdXN0IGJlIHJvb3Qgb3IgdGhlIGFwcGxpY2F0aW9uIGNhcHR1cmluZyBwYWNrZXRzIG11c3QgYmUgaW5zdGFsbGVkCitzZXR1aWQgdG8gcm9vdCAodW5sZXNzIHlvdXIgZGlzdHJpYnV0aW9uIGhhcyBhIGtlcm5lbAordGhhdCBzdXBwb3J0cyBjYXBhYmlsaXR5IGJpdHMgc3VjaCBhcyBDQVBfTkVUX1JBVyBhbmQgY29kZSB0byBhbGxvdwordGhvc2UgY2FwYWJpbGl0eSBiaXRzIHRvIGJlIGdpdmVuIHRvIHBhcnRpY3VsYXIgYWNjb3VudHMgYW5kIHRvIGNhdXNlCit0aG9zZSBiaXRzIHRvIGJlIHNldCBvbiBhIHVzZXIncyBpbml0aWFsIHByb2Nlc3NlcyB3aGVuIHRoZXkgbG9nIGluLCBpbgord2hpY2ggY2FzZSB5b3UgIG11c3QgaGF2ZSBDQVBfTkVUX1JBVyBpbiBvcmRlciB0byBjYXB0dXJlIGFuZAorQ0FQX05FVF9BRE1JTiB0byBlbnVtZXJhdGUgbmV0d29yayBkZXZpY2VzIHdpdGgsIGZvciBleGFtcGxlLCB0aGUKKy5CIFwtRAorZmxhZykuCisuVFAKKy5CIFVuZGVyIFVMVFJJWCBhbmQgRGlnaXRhbCBVTklYL1RydTY0IFVOSVg6CitBbnkgdXNlciBtYXkgY2FwdHVyZSBuZXR3b3JrIHRyYWZmaWMuCitIb3dldmVyLCBubyB1c2VyIChub3QgZXZlbiB0aGUgc3VwZXItdXNlcikgY2FuIGNhcHR1cmUgaW4gcHJvbWlzY3VvdXMKK21vZGUgb24gYW4gaW50ZXJmYWNlIHVubGVzcyB0aGUgc3VwZXItdXNlciBoYXMgZW5hYmxlZCBwcm9taXNjdW91cy1tb2RlCitvcGVyYXRpb24gb24gdGhhdCBpbnRlcmZhY2UgdXNpbmcKKy5JUiBwZmNvbmZpZyAoOCksCithbmQgbm8gdXNlciAobm90IGV2ZW4gdGhlIHN1cGVyLXVzZXIpIGNhbiBjYXB0dXJlIHVuaWNhc3QgdHJhZmZpYworcmVjZWl2ZWQgYnkgb3Igc2VudCBieSB0aGUgbWFjaGluZSBvbiBhbiBpbnRlcmZhY2UgdW5sZXNzIHRoZSBzdXBlci11c2VyCitoYXMgZW5hYmxlZCBjb3B5LWFsbC1tb2RlIG9wZXJhdGlvbiBvbiB0aGF0IGludGVyZmFjZSB1c2luZworLklSIHBmY29uZmlnICwKK3NvCisuSSB1c2VmdWwKK3BhY2tldCBjYXB0dXJlIG9uIGFuIGludGVyZmFjZSBwcm9iYWJseSByZXF1aXJlcyB0aGF0IGVpdGhlcgorcHJvbWlzY3VvdXMtbW9kZSBvciBjb3B5LWFsbC1tb2RlIG9wZXJhdGlvbiwgb3IgYm90aCBtb2RlcyBvZgorb3BlcmF0aW9uLCBiZSBlbmFibGVkIG9uIHRoYXQgaW50ZXJmYWNlLgorLlRQCisuQiBVbmRlciBCU0QgKHRoaXMgaW5jbHVkZXMgTWFjIE9TIFgpOgorWW91IG11c3QgaGF2ZSByZWFkIGFjY2VzcyB0bworLkkgL2Rldi9icGYqCitvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBhIGNsb25pbmcgQlBGIGRldmljZSwgb3IgdG8KKy5JIC9kZXYvYnBmCitvbiBzeXN0ZW1zIHRoYXQgZG8uCitPbiBCU0RzIHdpdGggYSBkZXZmcyAodGhpcyBpbmNsdWRlcyBNYWMgT1MgWCksIHRoaXMgbWlnaHQgaW52b2x2ZSBtb3JlCit0aGFuIGp1c3QgaGF2aW5nIHNvbWVib2R5IHdpdGggc3VwZXItdXNlciBhY2Nlc3Mgc2V0dGluZyB0aGUgb3duZXJzaGlwCitvciBwZXJtaXNzaW9ucyBvbiB0aGUgQlBGIGRldmljZXMgLSBpdCBtaWdodCBpbnZvbHZlIGNvbmZpZ3VyaW5nIGRldmZzCit0byBzZXQgdGhlIG93bmVyc2hpcCBvciBwZXJtaXNzaW9ucyBldmVyeSB0aW1lIHRoZSBzeXN0ZW0gaXMgYm9vdGVkLAoraWYgdGhlIHN5c3RlbSBldmVuIHN1cHBvcnRzIHRoYXQ7IGlmIGl0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0LCB5b3UgbWlnaHQKK2hhdmUgdG8gZmluZCBzb21lIG90aGVyIHdheSB0byBtYWtlIHRoYXQgaGFwcGVuIGF0IGJvb3QgdGltZS4KKy5QUAorUmVhZGluZyBhIHNhdmVkIHBhY2tldCBmaWxlIGRvZXNuJ3QgcmVxdWlyZSBzcGVjaWFsIHByaXZpbGVnZXMuCisuUFAKK1RoZSBwYWNrZXRzIHJlYWQgZnJvbSB0aGUgaGFuZGxlIG1heSBpbmNsdWRlIGEgYGBwc2V1ZG8taGVhZGVyJycKK2NvbnRhaW5pbmcgdmFyaW91cyBmb3JtcyBvZiBwYWNrZXQgbWV0YS1kYXRhLCBhbmQgcHJvYmFibHkgaW5jbHVkZXMgYQorbGluay1sYXllciBoZWFkZXIgd2hvc2UgY29udGVudHMgY2FuIGRpZmZlciBmb3IgZGlmZmVyZW50IG5ldHdvcmsKK2ludGVyZmFjZXMuICBUbyBkZXRlcm1pbmUgdGhlIGZvcm1hdCBvZiB0aGUgcGFja2V0cyBzdXBwbGllZCBieSB0aGUKK2hhbmRsZSwgY2FsbAorLkJSIHBjYXBfZGF0YWxpbmsgKCk7CisuSSBodHRwOi8vd3d3LnRjcGR1bXAub3JnL2xpbmt0eXBlcy5odG1sCitsaXN0cyB0aGUgdmFsdWVzIGl0IHJldHVybnMgYW5kIGRlc2NyaWJlcyB0aGUgcGFja2V0IGZvcm1hdHMgdGhhdAorY29ycmVzcG9uZCB0byB0aG9zZSB2YWx1ZXMuCisuUFAKK1RvIG9idGFpbiB0aGUKKy5CICJGSUxFXCAqIgorY29ycmVzcG9uZGluZyB0byBhCisuQiBwY2FwX3QKK29wZW5lZCBmb3IgYSBgYHNhdmVmaWxlJycsIGNhbGwKKy5CUiBwY2FwX2ZpbGUgKCkuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfY3JlYXRlICgzUENBUCkKK2dldCBhCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfYWN0aXZhdGUgKDNQQ0FQKQorYWN0aXZhdGUgYQorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX2ZpbmRhbGxkZXZzICgzUENBUCkKK2dldCBhIGxpc3Qgb2YgZGV2aWNlcyB0aGF0IGNhbiBiZSBvcGVuZWQgZm9yIGEgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX2ZyZWVhbGxkZXZzICgzUENBUCkKK2ZyZWUgbGlzdCBvZiBkZXZpY2VzCisuVFAKKy5CUiBwY2FwX2xvb2t1cGRldiAoM1BDQVApCitnZXQgZmlyc3Qgbm9uLWxvb3BiYWNrIGRldmljZSBvbiB0aGF0IGxpc3QKKy5UUAorLkJSIHBjYXBfb3Blbl9vZmZsaW5lICgzUENBUCkKK29wZW4gYQorLkIgcGNhcF90Citmb3IgYSBgYHNhdmVmaWxlJycsIGdpdmVuIGEgcGF0aG5hbWUKKy5UUAorLkJSIHBjYXBfZm9wZW5fb2ZmbGluZSAoM1BDQVApCitvcGVuIGEKKy5CIHBjYXBfdAorZm9yIGEgYGBzYXZlZmlsZScnLCBnaXZlbiBhCisuQiAiRklMRVwgKiIKKy5UUAorLkJSIHBjYXBfb3Blbl9kZWFkICgzUENBUCkKK2NyZWF0ZSBhIGBgZmFrZScnCisuQiBwY2FwX3QKKy5UUAorLkJSIHBjYXBfY2xvc2UgKDNQQ0FQKQorY2xvc2UgYQorLkIgcGNhcF90CisuVFAKKy5CUiBwY2FwX3NldF9zbmFwbGVuICgzUENBUCkKK3NldCB0aGUgc25hcHNob3QgbGVuZ3RoIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfc25hcHNob3QgKDNQQ0FQKQorZ2V0IHRoZSBzbmFwc2hvdCBsZW5ndGggZm9yIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9zZXRfcHJvbWlzYyAoM1BDQVApCitzZXQgcHJvbWlzY3VvdXMgbW9kZSBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX3NldF9yZm1vbiAoM1BDQVApCitzZXQgbW9uaXRvciBtb2RlIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfY2FuX3NldF9yZm1vbiAoM1BDQVApCitkZXRlcm1pbmUgd2hldGhlciBtb25pdG9yIG1vZGUgY2FuIGJlIHNldCBmb3IgYQorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX3NldF90aW1lb3V0ICgzUENBUCkKK3NldCByZWFkIHRpbWVvdXQgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9zZXRfYnVmZmVyX3NpemUgKDNQQ0FQKQorc2V0IGJ1ZmZlciBzaXplIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciBsaXZlIGNhcHR1cmUKKy5UUAorLkJSIHBjYXBfc2V0X3RzdGFtcF90eXBlICgzUENBUCkKK3NldCB0aW1lIHN0YW1wIHR5cGUgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKKy5CIHBjYXBfdAorZm9yIGxpdmUgY2FwdHVyZQorLlRQCisuQlIgcGNhcF9saXN0X3RzdGFtcF90eXBlcyAoM1BDQVApCitnZXQgbGlzdCBvZiBhdmFpbGFibGUgdGltZSBzdGFtcCB0eXBlcyBmb3IgYSBub3QteWV0LWFjdGl2YXRlZAorLkIgcGNhcF90Citmb3IgbGl2ZSBjYXB0dXJlCisuVFAKKy5CUiBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzICgzUENBUCkKK2ZyZWUgbGlzdCBvZiBhdmFpbGFibGUgdGltZSBzdGFtcCB0eXBlcworLlRQCisuQlIgcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZSAoM1BDQVApCitnZXQgbmFtZSBmb3IgYSB0aW1lIHN0YW1wIHR5cGUKKy5UUAorLkJSIHBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX2Rlc2NyaXB0aW9uICgzUENBUCkKK2dldCBkZXNjcmlwdGlvbiBmb3IgYSB0aW1lIHN0YW1wIHR5cGUKKy5UUAorLkJSIHBjYXBfdHN0YW1wX25hbWVfdG9fdmFsICgzUENBUCkKK2dldCB0aW1lIHN0YW1wIHR5cGUgY29ycmVzcG9uZGluZyB0byBhIG5hbWUKKy5UUAorLkJSIHBjYXBfZGF0YWxpbmsgKDNQQ0FQKQorZ2V0IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9maWxlICgzUENBUCkKK2dldCB0aGUKKy5CICJGSUxFXCAqIgorZm9yIGEKKy5CIHBjYXBfdAorb3BlbmVkIGZvciBhIGBgc2F2ZWZpbGUnJworLlRQCisuQlIgcGNhcF9pc19zd2FwcGVkICgzUENBUCkKK2RldGVybWluZSB3aGV0aGVyIGEgYGBzYXZlZmlsZScnIGJlaW5nIHJlYWQgY2FtZSBmcm9tIGEgbWFjaGluZSB3aXRoIHRoZQorb3Bwb3NpdGUgYnl0ZSBvcmRlcgorLlRQCisuQlIgcGNhcF9tYWpvcl92ZXJzaW9uICgzUENBUCkKKy5QRCAwCisuVFAKKy5CUiBwY2FwX21pbm9yX3ZlcnNpb24gKDNQQ0FQKQorZ2V0IHRoZSBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBvZiB0aGUgZmlsZSBmb3JtYXQgdmVyc2lvbiBmb3IgYQorYGBzYXZlZmlsZScnCisuUEQKKy5SRQorLlNTIFNlbGVjdGluZyBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgZm9yIGEgbGl2ZSBjYXB0dXJlCitTb21lIGRldmljZXMgbWF5IHByb3ZpZGUgbW9yZSB0aGFuIG9uZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlLiAgVG8KK29idGFpbiBhIGxpc3Qgb2YgYWxsIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIHByb3ZpZGVkIGJ5IGEgZGV2aWNlLCBjYWxsCisuQlIgcGNhcF9saXN0X2RhdGFsaW5rcyAoKQorb24gYW4gYWN0aXZhdGVkCisuQiBwY2FwX3QKK2ZvciB0aGUgZGV2aWNlLgorVG8gZnJlZSBhIGxpc3Qgb2YgbGluay1sYXllciBoZWFkZXIgdHlwZXMsIGNhbGwKKy5CUiBwY2FwX2ZyZWVfZGF0YWxpbmtzICgpLgorVG8gc2V0IHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIGZvciBhIGRldmljZSwgY2FsbAorLkJSIHBjYXBfc2V0X2RhdGFsaW5rICgpLgorVGhpcyBzaG91bGQgYmUgZG9uZSBhZnRlciB0aGUgZGV2aWNlIGhhcyBiZWVuIGFjdGl2YXRlZCBidXQgYmVmb3JlIGFueQorcGFja2V0cyBhcmUgcmVhZCBhbmQgYmVmb3JlIGFueSBmaWx0ZXJzIGFyZSBjb21waWxlZCBvciBpbnN0YWxsZWQuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfbGlzdF9kYXRhbGlua3MgKDNQQ0FQKQorZ2V0IGEgbGlzdCBvZiBsaW5rLWxheWVyIGhlYWRlciB0eXBlcyBmb3IgYSBkZXZpY2UKKy5UUAorLkJSIHBjYXBfZnJlZV9kYXRhbGlua3MgKDNQQ0FQKQorZnJlZSBsaXN0IG9mIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzCisuVFAKKy5CUiBwY2FwX3NldF9kYXRhbGluayAoM1BDQVApCitzZXQgbGluay1sYXllciBoZWFkZXIgdHlwZSBmb3IgYSBkZXZpY2UKKy5UUAorLkJSIHBjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUgKDNQQ0FQKQorZ2V0IG5hbWUgZm9yIGEgbGluay1sYXllciBoZWFkZXIgdHlwZQorLlRQCisuQlIgcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24gKDNQQ0FQKQorZ2V0IGRlc2NyaXB0aW9uIGZvciBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUKKy5UUAorLkJSIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwgKDNQQ0FQKQorZ2V0IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgY29ycmVzcG9uZGluZyB0byBhIG5hbWUKKy5SRQorLlNTIFJlYWRpbmcgcGFja2V0cworUGFja2V0cyBhcmUgcmVhZCB3aXRoCisuQlIgcGNhcF9kaXNwYXRjaCAoKQorb3IKKy5CUiBwY2FwX2xvb3AgKCksCit3aGljaCBwcm9jZXNzIG9uZSBvciBtb3JlIHBhY2tldHMsIGNhbGxpbmcgYSBjYWxsYmFjayByb3V0aW5lIGZvciBlYWNoCitwYWNrZXQsIG9yIHdpdGgKKy5CUiBwY2FwX25leHQgKCkKK29yCisuQlIgcGNhcF9uZXh0X2V4ICgpLAord2hpY2ggcmV0dXJuIHRoZSBuZXh0IHBhY2tldC4KK1RoZSBjYWxsYmFjayBmb3IKKy5CUiBwY2FwX2Rpc3BhdGNoICgpCithbmQKKy5CUiBwY2FwX2xvb3AgKCkKK2lzIHN1cHBsaWVkIGEgcG9pbnRlciB0byBhCisuSVIgInN0cnVjdCBwY2FwX3BrdGhkciIgLAord2hpY2ggaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgorLlJTCisuVFAKKy5CIHRzCithCisuSSBzdHJ1Y3QgdGltZXZhbAorY29udGFpbmluZyB0aGUgdGltZSB3aGVuIHRoZSBwYWNrZXQgd2FzIGNhcHR1cmVkCisuVFAKKy5CIGNhcGxlbgorYQorLkkgYnBmX3VfaW50MzIKK2dpdmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBwYWNrZXQgdGhhdCBhcmUgYXZhaWxhYmxlIGZyb20gdGhlCitjYXB0dXJlCisuVFAKKy5CIGxlbgorYQorLkkgYnBmX3VfaW50MzIKK2dpdmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZXQsIGluIGJ5dGVzICh3aGljaCBtaWdodCBiZSBtb3JlIHRoYW4gdGhlCitudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZyb20gdGhlIGNhcHR1cmUsIGlmIHRoZSBsZW5ndGggb2YgdGhlIHBhY2tldAoraXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNhcHR1cmUpLgorLlJFCisuUFAKKy5CUiBwY2FwX25leHRfZXggKCkKK3N1cHBsaWVzIHRoYXQgcG9pbnRlciB0aHJvdWdoIGEgcG9pbnRlciBhcmd1bWVudC4KKy5CUiBwY2FwX25leHQgKCkKK2lzIHBhc3NlZCBhbiBhcmd1bWVudCB0aGF0IHBvaW50cyB0byBhCisuSSBzdHJ1Y3QgcGNhcF9wa3RoZHIKK3N0cnVjdHVyZSwgYW5kIGZpbGxzIGl0IGluLgorLlBQCitUaGUgY2FsbGJhY2sgaXMgYWxzbyBzdXBwbGllZCBhCisuSSBjb25zdCB1X2NoYXIKK3BvaW50ZXIgdG8gdGhlIGZpcnN0CisuQiBjYXBsZW4KKyhhcyBnaXZlbiBpbiB0aGUKKy5JIHN0cnVjdCBwY2FwX3BrdGhkcgorYSBwb2ludGVyIHRvIHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgcm91dGluZSkKK2J5dGVzIG9mIGRhdGEgZnJvbSB0aGUgcGFja2V0LiAgVGhpcyB3b24ndCBuZWNlc3NhcmlseSBiZSB0aGUgZW50aXJlCitwYWNrZXQ7IHRvIGNhcHR1cmUgdGhlIGVudGlyZSBwYWNrZXQsIHlvdSB3aWxsIGhhdmUgdG8gcHJvdmlkZSBhIHZhbHVlCitmb3IKKy5JIHNuYXBsZW4KK2luIHlvdXIgY2FsbCB0bworLkJSIHBjYXBfc2V0X3NuYXBsZW4gKCkKK3RoYXQgaXMgc3VmZmljaWVudGx5IGxhcmdlIHRvIGdldCBhbGwgb2YgdGhlIHBhY2tldCdzIGRhdGEgLSBhIHZhbHVlIG9mCis2NTUzNSBzaG91bGQgYmUgc3VmZmljaWVudCBvbiBtb3N0IGlmIG5vdCBhbGwgbmV0d29ya3MpLiAgV2hlbiByZWFkaW5nCitmcm9tIGEgYGBzYXZlZmlsZScnLCB0aGUgc25hcHNob3QgbGVuZ3RoIHNwZWNpZmllZCB3aGVuIHRoZSBjYXB0dXJlIHdhcworcGVyZm9ybWVkIHdpbGwgbGltaXQgdGhlIGFtb3VudCBvZiBwYWNrZXQgZGF0YSBhdmFpbGFibGUuCisuQlIgcGNhcF9uZXh0ICgpCityZXR1cm5zIHRoYXQgcG9pbnRlcjsKKy5CUiBwY2FwX25leHRfZXggKCkKK3N1cHBsaWVzIHRoYXQgcG9pbnRlciB0aHJvdWdoIGEgcG9pbnRlciBhcmd1bWVudC4KKy5QUAorVG8gZm9yY2UgdGhlIGxvb3AgaW4KKy5CUiBwY2FwX2Rpc3BhdGNoICgpCitvcgorLkJSIHBjYXBfbG9vcCAoKQordG8gdGVybWluYXRlLCBjYWxsCisuQlIgcGNhcF9icmVha2xvb3AgKCkuCisuUFAKK0J5IGRlZmF1bHQsIHdoZW4gcmVhZGluZyBwYWNrZXRzIGZyb20gYW4gaW50ZXJmYWNlIG9wZW5lZCBmb3IgYSBsaXZlCitjYXB0dXJlLAorLkJSIHBjYXBfZGlzcGF0Y2ggKCksCisuQlIgcGNhcF9uZXh0ICgpLAorYW5kCisuQlIgcGNhcF9uZXh0X2V4ICgpCit3aWxsLCBpZiBubyBwYWNrZXRzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIHRvIGJlIHJlYWQsIGJsb2NrIHdhaXRpbmcKK2ZvciBwYWNrZXRzIHRvIGJlY29tZSBhdmFpbGFibGUuICBPbiBzb21lLCBidXQKKy5JIG5vdAorYWxsLCBwbGF0Zm9ybXMsIGlmIGEgcmVhZCB0aW1lb3V0IHdhcyBzcGVjaWZpZWQsIHRoZSB3YWl0IHdpbGwgdGVybWluYXRlCithZnRlciB0aGUgcmVhZCB0aW1lb3V0IGV4cGlyZXM7IGFwcGxpY2F0aW9ucyBzaG91bGQgYmUgcHJlcGFyZWQgZm9yCit0aGlzLCBhcyBpdCBoYXBwZW5zIG9uIHNvbWUgcGxhdGZvcm1zLCBidXQgc2hvdWxkIG5vdCByZWx5IG9uIGl0LCBhcyBpdAorZG9lcyBub3QgaGFwcGVuIG9uIG90aGVyIHBsYXRmb3Jtcy4KKy5QUAorQSBoYW5kbGUgY2FuIGJlIHB1dCBpbnRvIGBgbm9uLWJsb2NraW5nIG1vZGUnJywgc28gdGhhdCB0aG9zZSByb3V0aW5lcword2lsbCwgcmF0aGVyIHRoYW4gYmxvY2tpbmcsIHJldHVybiBhbiBpbmRpY2F0aW9uIHRoYXQgbm8gcGFja2V0cyBhcmUKK2F2YWlsYWJsZSB0byByZWFkLiAgQ2FsbAorLkJSIHBjYXBfc2V0bm9uYmxvY2sgKCkKK3RvIHB1dCBhIGhhbmRsZSBpbnRvIG5vbi1ibG9ja2luZyBtb2RlIG9yIHRvIHRha2UgaXQgb3V0IG9mIG5vbi1ibG9ja2luZworbW9kZTsgY2FsbAorLkJSIHBjYXBfZ2V0bm9uYmxvY2sgKCkKK3RvIGRldGVybWluZSB3aGV0aGVyIGEgaGFuZGxlIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlLiAgTm90ZSB0aGF0Citub24tYmxvY2tpbmcgbW9kZSBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSBpbiBNYWMgT1MgWCAxMC42LgorLlBQCitOb24tYmxvY2tpbmcgbW9kZSBpcyBvZnRlbiBjb21iaW5lZCB3aXRoIHJvdXRpbmVzIHN1Y2ggYXMKKy5CUiBzZWxlY3QgKDIpCitvcgorLkJSIHBvbGwgKDIpCitvciBvdGhlciByb3V0aW5lcyBhIHBsYXRmb3JtIG9mZmVycyB0byB3YWl0IGZvciB0aGUgYXZhaWxhYmlsaXR5IG9mIGRhdGEKK29uIGFueSBvZiBhIHNldCBvZiBkZXNjcmlwdG9ycy4gIFRvIG9idGFpbiwgZm9yIGEgaGFuZGxlLCBhIGRlc2NyaXB0b3IKK3RoYXQgY2FuIGJlIHVzZWQgaW4gdGhvc2Ugcm91dGluZXMsIGNhbGwKKy5CUiBwY2FwX2dldF9zZWxlY3RhYmxlX2ZkICgpLgorTm90IGFsbCBoYW5kbGVzIGhhdmUgc3VjaCBhIGRlc2NyaXB0b3IgYXZhaWxhYmxlOworLkJSIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQgKCkKK3dpbGwgcmV0dXJuIFwtMSBpZiBubyBzdWNoIGRlc2NyaXB0b3IgZXhpc3RzLiAgSW4gYWRkaXRpb24sIGZvciB2YXJpb3VzCityZWFzb25zLCBvbmUgb3IgbW9yZSBvZiB0aG9zZSByb3V0aW5lcyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IHdpdGggdGhlCitkZXNjcmlwdG9yOyB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKy5CUiBwY2FwX2dldF9zZWxlY3RhYmxlX2ZkICgpCitnaXZlcyBkZXRhaWxzLgorLlRQCisuQiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX2Rpc3BhdGNoICgzUENBUCkKK3JlYWQgYSBidWZmZXJmdWwgb2YgcGFja2V0cyBmcm9tIGEKKy5CIHBjYXBfdAorb3BlbiBmb3IgYSBsaXZlIGNhcHR1cmUgb3IgdGhlIGZ1bGwgc2V0IG9mIHBhY2tldHMgZnJvbSBhCisuQiBwY2FwX3QKK29wZW4gZm9yIGEgYGBzYXZlZmlsZScnCisuVFAKKy5CUiBwY2FwX2xvb3AgKDNQQ0FQKQorcmVhZCBwYWNrZXRzIGZyb20gYQorLkIgcGNhcF90Cit1bnRpbCBhbiBpbnRlcnJ1cHQgb3IgZXJyb3Igb2NjdXJzCisuVFAKKy5CUiBwY2FwX25leHQgKDNQQ0FQKQorcmVhZCB0aGUgbmV4dCBwYWNrZXQgZnJvbSBhCisuQiBwY2FwX3QKK3dpdGhvdXQgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIGFuIGVycm9yIG9jY3VycmVkCisuVFAKKy5CUiBwY2FwX25leHRfZXggKDNQQ0FQKQorcmVhZCB0aGUgbmV4dCBwYWNrZXQgZnJvbSBhCisuQiBwY2FwX3QKK3dpdGggYW4gZXJyb3IgaW5kaWNhdGlvbiBvbiBhbiBlcnJvcgorLlRQCisuQlIgcGNhcF9icmVha2xvb3AgKDNQQ0FQKQorcHJlbWF0dXJlbHkgdGVybWluYXRlIHRoZSBsb29wIGluCisuQlIgcGNhcF9kaXNwYXRjaCAoKQorb3IKKy5CUiBwY2FwX2xvb3AgKCkKKy5UUAorLkJSIHBjYXBfc2V0bm9uYmxvY2sgKDNQQ0FQKQorc2V0IG9yIGNsZWFyIG5vbi1ibG9ja2luZyBtb2RlIG9uIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9nZXRub25ibG9jayAoM1BDQVApCitnZXQgdGhlIHN0YXRlIG9mIG5vbi1ibG9ja2luZyBtb2RlIGZvciBhCisuQiBwY2FwX3QKKy5UUAorLkJSIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQgKDNQQ0FQKQorYXR0ZW1wdCB0byBnZXQgYSBkZXNjcmlwdG9yIGZvciBhCisuQiBwY2FwX3QKK3RoYXQgY2FuIGJlIHVzZWQgaW4gY2FsbHMgc3VjaCBhcworLkJSIHNlbGVjdCAoMikKK2FuZAorLkJSIHBvbGwgKDIpCisuUkUKKy5TUyBGaWx0ZXJzCitJbiBvcmRlciB0byBjYXVzZSBvbmx5IGNlcnRhaW4gcGFja2V0cyB0byBiZSByZXR1cm5lZCB3aGVuIHJlYWRpbmcKK3BhY2tldHMsIGEgZmlsdGVyIGNhbiBiZSBzZXQgb24gYSBoYW5kbGUuICBGb3IgYSBsaXZlIGNhcHR1cmUsIHRoZQorZmlsdGVyaW5nIHdpbGwgYmUgcGVyZm9ybWVkIGluIGtlcm5lbCBtb2RlLCBpZiBwb3NzaWJsZSwgdG8gYXZvaWQKK2NvcHlpbmcgYGB1bmludGVyZXN0aW5nJycgcGFja2V0cyBmcm9tIHRoZSBrZXJuZWwgdG8gdXNlciBtb2RlLgorLlBQCitBIGZpbHRlciBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgdGV4dCBzdHJpbmc7IHRoZSBzeW50YXggYW5kIHNlbWFudGljcyBvZgordGhlIHN0cmluZyBhcmUgYXMgZGVzY3JpYmVkIGJ5CisuQlIgcGNhcC1maWx0ZXIgKEBNQU5fTUlTQ19JTkZPQCkuCitBIGZpbHRlciBzdHJpbmcgaXMgY29tcGlsZWQgaW50byBhIHByb2dyYW0gaW4gYSBwc2V1ZG8tbWFjaGluZS1sYW5ndWFnZQorYnkKKy5CUiBwY2FwX2NvbXBpbGUgKCkKK2FuZCB0aGUgcmVzdWx0aW5nIHByb2dyYW0gY2FuIGJlIG1hZGUgYSBmaWx0ZXIgZm9yIGEgaGFuZGxlIHdpdGgKKy5CUiBwY2FwX3NldGZpbHRlciAoKS4KK1RoZSByZXN1bHQgb2YKKy5CUiBwY2FwX2NvbXBpbGUgKCkKK2NhbiBiZSBmcmVlZCB3aXRoIGEgY2FsbCB0bworLkJSIHBjYXBfZnJlZWNvZGUgKCkuCisuQlIgcGNhcF9jb21waWxlICgpCittYXkgcmVxdWlyZSBhIG5ldHdvcmsgbWFzayBmb3IgY2VydGFpbiBleHByZXNzaW9ucyBpbiB0aGUgZmlsdGVyIHN0cmluZzsKKy5CUiBwY2FwX2xvb2t1cG5ldCAoKQorY2FuIGJlIHVzZWQgdG8gZmluZCB0aGUgbmV0d29yayBhZGRyZXNzIGFuZCBuZXR3b3JrIG1hc2sgZm9yIGEgZ2l2ZW4KK2NhcHR1cmUgZGV2aWNlLgorLlBQCitBIGNvbXBpbGVkIGZpbHRlciBjYW4gYWxzbyBiZSBhcHBsaWVkIGRpcmVjdGx5IHRvIGEgcGFja2V0IHRoYXQgaGFzIGJlZW4KK3JlYWQgdXNpbmcKKy5CUiBwY2FwX29mZmxpbmVfZmlsdGVyICgpLgorLlRQCisuQiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX2NvbXBpbGUgKDNQQ0FQKQorY29tcGlsZSBmaWx0ZXIgZXhwcmVzc2lvbiB0byBhIHBzZXVkby1tYWNoaW5lLWxhbmd1YWdlIGNvZGUgcHJvZ3JhbQorLlRQCisuQlIgcGNhcF9mcmVlY29kZSAoM1BDQVApCitmcmVlIGEgZmlsdGVyIHByb2dyYW0KKy5UUAorLkJSIHBjYXBfc2V0ZmlsdGVyICgzUENBUCkKK3NldCBmaWx0ZXIgZm9yIGEKKy5CIHBjYXBfdAorLlRQCisuQlIgcGNhcF9sb29rdXBuZXQgKDNQQ0FQKQorZ2V0IG5ldHdvcmsgYWRkcmVzcyBhbmQgbmV0d29yayBtYXNrIGZvciBhIGNhcHR1cmUgZGV2aWNlCisuVFAKKy5CUiBwY2FwX29mZmxpbmVfZmlsdGVyICgzUENBUCkKK2FwcGx5IGEgZmlsdGVyIHByb2dyYW0gdG8gYSBwYWNrZXQKKy5SRQorLlNTIEluY29taW5nIGFuZCBvdXRnb2luZyBwYWNrZXRzCitCeSBkZWZhdWx0LCBsaWJwY2FwIHdpbGwgYXR0ZW1wdCB0byBjYXB0dXJlIGJvdGggcGFja2V0cyBzZW50IGJ5IHRoZQorbWFjaGluZSBhbmQgcGFja2V0cyByZWNlaXZlZCBieSB0aGUgbWFjaGluZS4gIFRvIGxpbWl0IGl0IHRvIGNhcHR1cmluZworb25seSBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBtYWNoaW5lIG9yLCBpZiBwb3NzaWJsZSwgb25seSBwYWNrZXRzIHNlbnQKK2J5IHRoZSBtYWNoaW5lLCBjYWxsCisuQlIgcGNhcF9zZXRkaXJlY3Rpb24gKCkuCisuVFAKKy5CUiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX3NldGRpcmVjdGlvbiAoM1BDQVApCitzcGVjaWZ5IHdoZXRoZXIgdG8gY2FwdHVyZSBpbmNvbWluZyBwYWNrZXRzLCBvdXRnb2luZyBwYWNrZXRzLCBvciBib3RoCisuUkUKKy5TUyBDYXB0dXJlIHN0YXRpc3RpY3MKK1RvIGdldCBzdGF0aXN0aWNzIGFib3V0IHBhY2tldHMgcmVjZWl2ZWQgYW5kIGRyb3BwZWQgaW4gYSBsaXZlIGNhcHR1cmUsCitjYWxsCisuQlIgcGNhcF9zdGF0cyAoKS4KKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9zdGF0cyAoM1BDQVApCitnZXQgY2FwdHVyZSBzdGF0aXN0aWNzCisuUkUKKy5TUyBPcGVuaW5nIGEgaGFuZGxlIGZvciB3cml0aW5nIGNhcHR1cmVkIHBhY2tldHMKK1RvIG9wZW4gYSBgYHNhdmVmaWxlYGAgdG8gd2hpY2ggdG8gd3JpdGUgcGFja2V0cywgZ2l2ZW4gdGhlIHBhdGhuYW1lIHRoZQorYGBzYXZlZmlsZScnIHNob3VsZCBoYXZlLCBjYWxsCisuQlIgcGNhcF9kdW1wX29wZW4gKCkuCitUbyBvcGVuIGEgYGBzYXZlZmlsZWBgIHRvIHdoaWNoIHRvIHdyaXRlIHBhY2tldHMsIGdpdmVuIHRoZSBwYXRobmFtZSB0aGUKK2Bgc2F2ZWZpbGUnJyBzaG91bGQgaGF2ZSwgY2FsbAorLkJSIHBjYXBfZHVtcF9vcGVuICgpOwordG8gc2V0IHVwIGEgaGFuZGxlIGZvciBhIGBgc2F2ZWZpbGUnJywgZ2l2ZW4gYQorLkIgIkZJTEVcICoiCityZWZlcnJpbmcgdG8gYSBmaWxlIGFscmVhZHkgb3BlbmVkIGZvciB3cml0aW5nLCBjYWxsCisuQlIgcGNhcF9kdW1wX2ZvcGVuICgpLgorVGhleSBlYWNoIHJldHVybiBwb2ludGVycyB0byBhCisuQlIgcGNhcF9kdW1wZXJfdCAsCit3aGljaCBpcyB0aGUgaGFuZGxlIHVzZWQgZm9yIHdyaXRpbmcgcGFja2V0cyB0byB0aGUgYGBzYXZlZmlsZScnLiAgSWYgaXQKK3N1Y2NlZWRzLCBpdCB3aWxsIGhhdmUgY3JlYXRlZCB0aGUgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZAordHJ1bmNhdGVkIHRoZSBmaWxlIGlmIGl0IGRvZXMgZXhpc3QuCitUbyBjbG9zZSBhCisuQlIgcGNhcF9kdW1wZXJfdCAsCitjYWxsCisuQlIgcGNhcF9kdW1wX2Nsb3NlICgpLgorLlRQCisuQiBSb3V0aW5lcworLlJTCisuVFAKKy5CUiBwY2FwX2R1bXBfb3BlbiAoM1BDQVApCitvcGVuIGEKKy5CIHBjYXBfZHVtcGVyX3QKK2ZvciBhIGBgc2F2ZWZpbGVgYCwgZ2l2ZW4gYSBwYXRobmFtZQorLlRQCisuQlIgcGNhcF9kdW1wX2ZvcGVuICgzUENBUCkKK29wZW4gYQorLkIgcGNhcF9kdW1wZXJfdAorZm9yIGEgYGBzYXZlZmlsZWBgLCBnaXZlbiBhCisuQiAiRklMRVwgKiIKKy5UUAorLkJSIHBjYXBfZHVtcF9jbG9zZSAoM1BDQVApCitjbG9zZSBhCisuQiBwY2FwX2R1bXBlcl90CisuVFAKKy5CUiBwY2FwX2R1bXBfZmlsZSAoM1BDQVApCitnZXQgdGhlCisuQiAiRklMRVwgKiIKK2ZvciBhCisuQiBwY2FwX2R1bXBlcl90CitvcGVuZWQgZm9yIGEgYGBzYXZlZmlsZScnCisuUkUKKy5TUyBXcml0aW5nIHBhY2tldHMKK1RvIHdyaXRlIGEgcGFja2V0IHRvIGEKKy5CUiBwY2FwX2R1bXBlcl90ICwKK2NhbGwKKy5CUiBwY2FwX2R1bXAgKCkuCitQYWNrZXRzIHdyaXR0ZW4gd2l0aAorLkJSIHBjYXBfZHVtcCAoKQorbWF5IGJlIGJ1ZmZlcmVkLCByYXRoZXIgdGhhbiBiZWluZyBpbW1lZGlhdGVseSB3cml0dGVuIHRvIHRoZQorYGBzYXZlZmlsZScnLiAgQ2xvc2luZyB0aGUKKy5CIHBjYXBfZHVtcGVyX3QKK3dpbGwgY2F1c2UgYWxsIGJ1ZmZlcmVkLWJ1dC1ub3QteWV0LXdyaXR0ZW4gcGFja2V0cyB0byBiZSB3cml0dGVuIHRvIHRoZQorYGBzYXZlZmlsZScnLgorVG8gZm9yY2UgYWxsIHBhY2tldHMgd3JpdHRlbiB0byB0aGUKKy5CUiBwY2FwX2R1bXBlcl90ICwKK2FuZCBub3QgeWV0IHdyaXR0ZW4gdG8gdGhlIGBgc2F2ZWZpbGUnJyBiZWNhdXNlIHRoZXkncmUgYnVmZmVyZWQgYnkgdGhlCisuQlIgcGNhcF9kdW1wZXJfdCAsCit0byBiZSB3cml0dGVuIHRvIHRoZSBgYHNhdmVmaWxlJycsIHdpdGhvdXQgY2xvc2luZyB0aGUKKy5CUiBwY2FwX2R1bXBlcl90ICwKK2NhbGwKKy5CUiBwY2FwX2R1bXBfZmx1c2ggKCkuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfZHVtcCAoM1BDQVApCit3cml0ZSBwYWNrZXQgdG8gYQorLkIgcGNhcF9kdW1wZXJfdAorLlRQCisuQlIgcGNhcF9kdW1wX2ZsdXNoICgzUENBUCkKK2ZsdXNoIGJ1ZmZlcmVkIHBhY2tldHMgd3JpdHRlbiB0byBhCisuQiBwY2FwX2R1bXBlcl90Cit0byB0aGUgYGBzYXZlZmlsZScnCisuVFAKKy5CUiBwY2FwX2R1bXBfZnRlbGwgKDNQQ0FQKQorZ2V0IGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBmb3IgYQorLkIgcGNhcF9kdW1wZXJfdAorLlJFCisuU1MgSW5qZWN0aW5nIHBhY2tldHMKK0lmIHlvdSBoYXZlIHRoZSByZXF1aXJlZCBwcml2aWxlZ2VzLCB5b3UgY2FuIGluamVjdCBwYWNrZXRzIG9udG8gYQorbmV0d29yayB3aXRoIGEKKy5CIHBjYXBfdAorZm9yIGEgbGl2ZSBjYXB0dXJlLCB1c2luZworLkJSIHBjYXBfaW5qZWN0ICgpCitvcgorLkJSIHBjYXBfc2VuZHBhY2tldCAoKS4KKyhUaGUgdHdvIHJvdXRpbmVzIGV4aXN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggYm90aCBPcGVuQlNEIGFuZCBXaW5QY2FwOwordGhleSBwZXJmb3JtIHRoZSBzYW1lIGZ1bmN0aW9uLCBidXQgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuIHZhbHVlcy4pCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfaW5qZWN0ICgzUENBUCkKKy5QRCAwCisuVFAKKy5CUiBwY2FwX3NlbmRwYWNrZXQgKDNQQ0FQKQordHJhbnNtaXQgYSBwYWNrZXQKKy5QRAorLlJFCisuU1MgUmVwb3J0aW5nIGVycm9ycworU29tZSByb3V0aW5lcyByZXR1cm4gZXJyb3Igb3Igd2FybmluZyBzdGF0dXMgY29kZXM7IHRvIGNvbnZlcnQgdGhlbSB0byBhCitzdHJpbmcsIHVzZQorLkJSIHBjYXBfc3RhdHVzdG9zdHIgKCkuCisuVFAKKy5CIFJvdXRpbmVzCisuUlMKKy5UUAorLkJSIHBjYXBfc3RhdHVzdG9zdHIgKDNQQ0FQKQorZ2V0IGEgc3RyaW5nIGZvciBhbiBlcnJvciBvciB3YXJuaW5nIHN0YXR1cyBjb2RlCisuUkUKKy5TUyBHZXR0aW5nIGxpYnJhcnkgdmVyc2lvbiBpbmZvcm1hdGlvbgorVG8gZ2V0IGEgc3RyaW5nIGdpdmluZyB2ZXJzaW9uIGluZm9ybWF0aW9uIGFib3V0IGxpYnBjYXAsIGNhbGwKKy5CUiBwY2FwX2xpYnJhcnlfdmVyc2lvbiAoKS4KKy5UUAorLkIgUm91dGluZXMKKy5SUworLlRQCisuQlIgcGNhcF9saWJyYXJ5X3ZlcnNpb24gKDNQQ0FQKQorZ2V0IGxpYnJhcnkgdmVyc2lvbiBzdHJpbmcKKy5SRQorLlNIIEJBQ0tXQVJEUyBDT01QQVRJQklMSVRZCisuUFAKK0luIHZlcnNpb25zIG9mIGxpYnBjYXAgcHJpb3IgdG8gMS4wLCB0aGUKKy5CIHBjYXAuaAoraGVhZGVyIGZpbGUgd2FzIG5vdCBpbiBhCisuQiBwY2FwCitkaXJlY3Rvcnkgb24gbW9zdCBwbGF0Zm9ybXM7IGlmIHlvdSBhcmUgd3JpdGluZyBhbiBhcHBsaWNhdGlvbiB0aGF0IG11c3QKK3dvcmsgb24gdmVyc2lvbnMgb2YgbGlicGNhcCBwcmlvciB0byAxLjAsIGluY2x1ZGUKKy5CUiA8cGNhcC5oPiAsCit3aGljaCB3aWxsIGluY2x1ZGUKKy5CIDxwY2FwL3BjYXAuaD4KK2ZvciB5b3UsIHJhdGhlciB0aGFuIGluY2x1ZGluZworLkJSIDxwY2FwL3BjYXAuaD4gLgorLlBQCisuQlIgcGNhcF9jcmVhdGUgKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUgKCkKK3dlcmUgbm90IGF2YWlsYWJsZSBpbiB2ZXJzaW9ucyBvZiBsaWJwY2FwIHByaW9yIHRvIDEuMDsgaWYgeW91IGFyZQord3JpdGluZyBhbiBhcHBsaWNhdGlvbiB0aGF0IG11c3Qgd29yayBvbiB2ZXJzaW9ucyBvZiBsaWJwY2FwIHByaW9yIHRvCisxLjAsIGVpdGhlciB1c2UKKy5CUiBwY2FwX29wZW5fbGl2ZSAoKQordG8gZ2V0IGEgaGFuZGxlIGZvciBhIGxpdmUgY2FwdHVyZSBvciwgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgdGhlCithZGRpdGlvbmFsIGNhcGFiaWxpdGllcyBvZmZlcmVkIGJ5IHVzaW5nCisuQlIgcGNhcF9jcmVhdGUgKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUgKCksCit1c2UgYW4KKy5CUiBhdXRvY29uZiAoMSkKK3NjcmlwdCBvciBzb21lIG90aGVyIGNvbmZpZ3VyYXRpb24gc2NyaXB0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGxpYnBjYXAKKzEuMCBBUElzIGFyZSBhdmFpbGFibGUgYW5kIHVzZSB0aGVtIG9ubHkgaWYgdGhleSBhcmUuCisuU0ggU0VFIEFMU08KK2F1dG9jb25mKDEpLCB0Y3BkdW1wKDEpLCB0Y3BzbGljZSgxKSwgcGNhcC1maWx0ZXIoQE1BTl9NSVNDX0lORk9AKSwgcGZjb25maWcoOCksCit1c2VybW9kKDFNKQorLlNIIEFVVEhPUlMKK1RoZSBvcmlnaW5hbCBhdXRob3JzIG9mIGxpYnBjYXAgYXJlOgorLkxQCitWYW4gSmFjb2Jzb24sCitDcmFpZyBMZXJlcyBhbmQKK1N0ZXZlbiBNY0Nhbm5lLCBhbGwgb2YgdGhlCitMYXdyZW5jZSBCZXJrZWxleSBOYXRpb25hbCBMYWJvcmF0b3J5LCBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LCBDQS4KKy5MUAorVGhlIGN1cnJlbnQgdmVyc2lvbiBpcyBhdmFpbGFibGUgZnJvbSAiVGhlIFRjcGR1bXAgR3JvdXAiJ3MgV2ViIHNpdGUgYXQKKy5MUAorLlJTCisuSSBodHRwOi8vd3d3LnRjcGR1bXAub3JnLworLlJFCisuU0ggQlVHUworUGxlYXNlIHNlbmQgcHJvYmxlbXMsIGJ1Z3MsIHF1ZXN0aW9ucywgZGVzaXJhYmxlIGVuaGFuY2VtZW50cywgZXRjLiB0bzoKKy5MUAorLlJTCit0Y3BkdW1wLXdvcmtlcnNAbGlzdHMudGNwZHVtcC5vcmcKKy5SRQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLmMgYi9saWJwY2FwLTEuMy4wL3BjYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmRkODNmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLmMKQEAgLTAsMCArMSwxNTkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcworICoJRW5naW5lZXJpbmcgR3JvdXAgYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC5jLHYgMS4xMjggMjAwOC0xMi0yMyAyMDoxMzoyOSBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNlbHNlIC8qIFdJTjMyICovCisjaWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2lmZGVmIE1TRE9TCisjaW5jbHVkZSAicGNhcC1kb3MuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAicGNhcC1pbnQuaCIKKworI2lmZGVmIEhBVkVfREFHX0FQSQorI2luY2x1ZGUgPGRhZ25ldy5oPgorI2luY2x1ZGUgPGRhZ2FwaS5oPgorI2VuZGlmCisKK2ludCAKK3BjYXBfbm90X2luaXRpYWxpemVkKHBjYXBfdCAqcGNhcCkKK3sKKwkvKiB0aGlzIG1lYW5zICdub3QgaW5pdGlhbGl6ZWQnICovCisJcmV0dXJuIChQQ0FQX0VSUk9SX05PVF9BQ1RJVkFURUQpOworfQorCisvKgorICogUmV0dXJucyAxIGlmIHJmbW9uIG1vZGUgY2FuIGJlIHNldCBvbiB0aGUgcGNhcF90LCAwIGlmIGl0IGNhbid0LAorICogYSBQQ0FQX0VSUk9SIHZhbHVlIG9uIGFuIGVycm9yLgorICovCitpbnQKK3BjYXBfY2FuX3NldF9yZm1vbihwY2FwX3QgKnApCit7CisJcmV0dXJuIChwLT5jYW5fc2V0X3JmbW9uX29wKHApKTsKK30KKworLyoKKyAqIEZvciBzeXN0ZW1zIHdoZXJlIHJmbW9uIG1vZGUgaXMgbmV2ZXIgc3VwcG9ydGVkLgorICovCitzdGF0aWMgaW50CitwY2FwX2NhbnRfc2V0X3JmbW9uKHBjYXBfdCAqcCBfVV8pCit7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFNldHMgKnRzdGFtcF90eXBlc3AgdG8gcG9pbnQgdG8gYW4gYXJyYXkgMSBvciBtb3JlIHN1cHBvcnRlZCB0aW1lIHN0YW1wCisgKiB0eXBlczsgdGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHN1cHBvcnRlZCB0aW1lIHN0YW1wIHR5cGVzLgorICogVGhlIGxpc3Qgc2hvdWxkIGJlIGZyZWVkIGJ5IGEgY2FsbCB0byBwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzKCkgd2hlbgorICogeW91J3JlIGRvbmUgd2l0aCBpdC4KKyAqCisgKiBBIHJldHVybiB2YWx1ZSBvZiAwIG1lYW5zICJ5b3UgZG9uJ3QgZ2V0IGEgY2hvaWNlIG9mIHRpbWUgc3RhbXAgdHlwZSIsCisgKiBpbiB3aGljaCBjYXNlICp0c3RhbXBfdHlwZXNwIGlzIHNldCB0byBudWxsLgorICoKKyAqIFBDQVBfRVJST1IgaXMgcmV0dXJuZWQgb24gZXJyb3IuCisgKi8KK2ludAorcGNhcF9saXN0X3RzdGFtcF90eXBlcyhwY2FwX3QgKnAsIGludCAqKnRzdGFtcF90eXBlc3ApCit7CisJaWYgKHAtPnRzdGFtcF90eXBlX2NvdW50ID09IDApIHsKKwkJLyoKKwkJICogV2UgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSB0aW1lIHN0YW1wIHR5cGVzLgorCQkgKi8KKwkJKnRzdGFtcF90eXBlc3AgPSBOVUxMOworCX0gZWxzZSB7CisJCSp0c3RhbXBfdHlwZXNwID0gKGludCopY2FsbG9jKHNpemVvZigqKnRzdGFtcF90eXBlc3ApLAorCQkgICAgcC0+dHN0YW1wX3R5cGVfY291bnQpOworCQlpZiAoKnRzdGFtcF90eXBlc3AgPT0gTlVMTCkgeworCQkJKHZvaWQpc25wcmludGYocC0+ZXJyYnVmLCBzaXplb2YocC0+ZXJyYnVmKSwKKwkJCSAgICAibWFsbG9jOiAlcyIsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAoUENBUF9FUlJPUik7CisJCX0KKwkJKHZvaWQpbWVtY3B5KCp0c3RhbXBfdHlwZXNwLCBwLT50c3RhbXBfdHlwZV9saXN0LAorCQkgICAgc2l6ZW9mKCoqdHN0YW1wX3R5cGVzcCkgKiBwLT50c3RhbXBfdHlwZV9jb3VudCk7CisJfQorCXJldHVybiAocC0+dHN0YW1wX3R5cGVfY291bnQpOworfQorCisvKgorICogSW4gV2luZG93cywgeW91IG1pZ2h0IGhhdmUgYSBsaWJyYXJ5IGJ1aWx0IHdpdGggb25lIHZlcnNpb24gb2YgdGhlCisgKiBDIHJ1bnRpbWUgbGlicmFyeSBhbmQgYW4gYXBwbGljYXRpb24gYnVpbHQgd2l0aCBhbm90aGVyIHZlcnNpb24gb2YKKyAqIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgbGlicmFyeSBtaWdodCB1c2Ugb25lCisgKiB2ZXJzaW9uIG9mIG1hbGxvYygpIGFuZCBmcmVlKCkgYW5kIHRoZSBhcHBsaWNhdGlvbiBtaWdodCB1c2UgYW5vdGhlcgorICogdmVyc2lvbiBvZiBtYWxsb2MoKSBhbmQgZnJlZSgpLiAgSWYgc28sIHRoYXQgbWVhbnMgc29tZXRoaW5nCisgKiBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkgY2Fubm90IGJlIGZyZWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgc28gd2UKKyAqIG5lZWQgdG8gaGF2ZSBhIHBjYXBfZnJlZV90c3RhbXBfdHlwZXMoKSByb3V0aW5lIHRvIGZyZWUgdXAgdGhlIGxpc3QKKyAqIGFsbG9jYXRlZCBieSBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKCksIGV2ZW4gdGhvdWdoIGl0J3MganVzdCBhIHdyYXBwZXIKKyAqIGFyb3VuZCBmcmVlKCkuCisgKi8KK3ZvaWQKK3BjYXBfZnJlZV90c3RhbXBfdHlwZXMoaW50ICp0c3RhbXBfdHlwZV9saXN0KQoreworCWZyZWUodHN0YW1wX3R5cGVfbGlzdCk7Cit9CisKKy8qCisgKiBEZWZhdWx0IG9uZS1zaG90IGNhbGxiYWNrOyBvdmVycmlkZGVuIGZvciBjYXB0dXJlIHR5cGVzIHdoZXJlIHRoZQorICogcGFja2V0IGRhdGEgY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gYmUgYXZhaWxhYmxlIGFmdGVyIHRoZSBjYWxsYmFjaworICogcmV0dXJucywgc28gdGhhdCBhIGNvcHkgbXVzdCBiZSBtYWRlLgorICovCitzdGF0aWMgdm9pZAorcGNhcF9vbmVzaG90KHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnBrdCkKK3sKKwlzdHJ1Y3Qgb25lc2hvdF91c2VyZGF0YSAqc3AgPSAoc3RydWN0IG9uZXNob3RfdXNlcmRhdGEgKil1c2VyOworCisJKnNwLT5oZHIgPSAqaDsKKwkqc3AtPnBrdCA9IHBrdDsKK30KKworY29uc3QgdV9jaGFyICoKK3BjYXBfbmV4dChwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3BrdGhkciAqaCkKK3sKKwlzdHJ1Y3Qgb25lc2hvdF91c2VyZGF0YSBzOworCWNvbnN0IHVfY2hhciAqcGt0OworCisJcy5oZHIgPSBoOworCXMucGt0ID0gJnBrdDsKKwlzLnBkID0gcDsKKwlpZiAocGNhcF9kaXNwYXRjaChwLCAxLCBwLT5vbmVzaG90X2NhbGxiYWNrLCAodV9jaGFyICopJnMpIDw9IDApCisJCXJldHVybiAoMCk7CisJcmV0dXJuIChwa3QpOworfQorCitpbnQgCitwY2FwX25leHRfZXgocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKipwa3RfaGVhZGVyLAorICAgIGNvbnN0IHVfY2hhciAqKnBrdF9kYXRhKQoreworCXN0cnVjdCBvbmVzaG90X3VzZXJkYXRhIHM7CisKKwlzLmhkciA9ICZwLT5wY2FwX2hlYWRlcjsKKwlzLnBrdCA9IHBrdF9kYXRhOworCXMucGQgPSBwOworCisJLyogU2F2ZXMgYSBwb2ludGVyIHRvIHRoZSBwYWNrZXQgaGVhZGVycyAqLworCSpwa3RfaGVhZGVyPSAmcC0+cGNhcF9oZWFkZXI7CisKKwlpZiAocC0+c2YucmZpbGUgIT0gTlVMTCkgeworCQlpbnQgc3RhdHVzOworCisJCS8qIFdlIGFyZSBvbiBhbiBvZmZsaW5lIGNhcHR1cmUgKi8KKwkJc3RhdHVzID0gcGNhcF9vZmZsaW5lX3JlYWQocCwgMSwgcC0+b25lc2hvdF9jYWxsYmFjaywKKwkJICAgICh1X2NoYXIgKikmcyk7CisKKwkJLyoKKwkJICogUmV0dXJuIGNvZGVzIGZvciBwY2FwX29mZmxpbmVfcmVhZCgpIGFyZToKKwkJICogICAtICAwOiBFT0YKKwkJICogICAtIC0xOiBlcnJvcgorCQkgKiAgIC0gPjE6IE9LCisJCSAqIFRoZSBmaXJzdCBvbmUgKCcwJykgY29uZmxpY3RzIHdpdGggdGhlIHJldHVybiBjb2RlIG9mCisJCSAqIDAgZnJvbSBwY2FwX3JlYWQoKSBtZWFuaW5nICJubyBwYWNrZXRzIGFycml2ZWQgYmVmb3JlCisJCSAqIHRoZSB0aW1lb3V0IGV4cGlyZWQiLCBzbyB3ZSBtYXAgaXQgdG8gLTIgc28geW91IGNhbgorCQkgKiBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFuIEVPRiBmcm9tIGEgc2F2ZWZpbGUgYW5kIGEKKwkJICogIm5vIHBhY2tldHMgYXJyaXZlZCBiZWZvcmUgdGhlIHRpbWVvdXQgZXhwaXJlZCwgdHJ5CisJCSAqIGFnYWluIiBmcm9tIGEgbGl2ZSBjYXB0dXJlLgorCQkgKi8KKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJcmV0dXJuICgtMik7CisJCWVsc2UKKwkJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwkvKgorCSAqIFJldHVybiBjb2RlcyBmb3IgcGNhcF9yZWFkKCkgYXJlOgorCSAqICAgLSAgMDogdGltZW91dAorCSAqICAgLSAtMTogZXJyb3IKKwkgKiAgIC0gLTI6IGxvb3Agd2FzIGJyb2tlbiBvdXQgb2Ygd2l0aCBwY2FwX2JyZWFrbG9vcCgpCisJICogICAtID4xOiBPSworCSAqIFRoZSBmaXJzdCBvbmUgKCcwJykgY29uZmxpY3RzIHdpdGggdGhlIHJldHVybiBjb2RlIG9mIDAgZnJvbQorCSAqIHBjYXBfb2ZmbGluZV9yZWFkKCkgbWVhbmluZyAiZW5kIG9mIGZpbGUiLgorCSovCisJcmV0dXJuIChwLT5yZWFkX29wKHAsIDEsIHAtPm9uZXNob3RfY2FsbGJhY2ssICh1X2NoYXIgKikmcykpOworfQorCitzdGF0aWMgdm9pZAoraW5pdGlhbGl6ZV9vcHMocGNhcF90ICpwKQoreworCS8qCisJICogU2V0IG9wZXJhdGlvbiBwb2ludGVycyBmb3Igb3BlcmF0aW9ucyB0aGF0IG9ubHkgd29yayBvbgorCSAqIGFuIGFjdGl2YXRlZCBwY2FwX3QgdG8gcG9pbnQgdG8gYSByb3V0aW5lIHRoYXQgcmV0dXJucworCSAqIGEgInRoaXMgaXNuJ3QgYWN0aXZhdGVkIiBlcnJvci4KKwkgKi8KKwlwLT5yZWFkX29wID0gKHJlYWRfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5pbmplY3Rfb3AgPSAoaW5qZWN0X29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CisJcC0+c2V0ZmlsdGVyX29wID0gKHNldGZpbHRlcl9vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPnNldGRpcmVjdGlvbl9vcCA9IChzZXRkaXJlY3Rpb25fb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5zZXRfZGF0YWxpbmtfb3AgPSAoc2V0X2RhdGFsaW5rX29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CisJcC0+Z2V0bm9uYmxvY2tfb3AgPSAoZ2V0bm9uYmxvY2tfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5zZXRub25ibG9ja19vcCA9IChzZXRub25ibG9ja19vcF90KXBjYXBfbm90X2luaXRpYWxpemVkOworCXAtPnN0YXRzX29wID0gKHN0YXRzX29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CisjaWZkZWYgV0lOMzIKKwlwLT5zZXRidWZmX29wID0gKHNldGJ1ZmZfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5zZXRtb2RlX29wID0gKHNldG1vZGVfb3BfdClwY2FwX25vdF9pbml0aWFsaXplZDsKKwlwLT5zZXRtaW50b2NvcHlfb3AgPSAoc2V0bWludG9jb3B5X29wX3QpcGNhcF9ub3RfaW5pdGlhbGl6ZWQ7CisjZW5kaWYKKworCS8qCisJICogRGVmYXVsdCBjbGVhbnVwIG9wZXJhdGlvbiAtIGltcGxlbWVudGF0aW9ucyBjYW4gb3ZlcnJpZGUKKwkgKiB0aGlzLCBidXQgc2hvdWxkIGNhbGwgcGNhcF9jbGVhbnVwX2xpdmVfY29tbW9uKCkgYWZ0ZXIKKwkgKiBkb2luZyB0aGVpciBvd24gYWRkaXRpb25hbCBjbGVhbnVwLgorCSAqLworCXAtPmNsZWFudXBfb3AgPSBwY2FwX2NsZWFudXBfbGl2ZV9jb21tb247CisKKwkvKgorCSAqIEluIG1vc3QgY2FzZXMsIHRoZSBzdGFuZGFyZCBvbmUtc2hvcnQgY2FsbGJhY2sgY2FuCisJICogYmUgdXNlZCBmb3IgcGNhcF9uZXh0KCkvcGNhcF9uZXh0X2V4KCkuCisJICovCisJcC0+b25lc2hvdF9jYWxsYmFjayA9IHBjYXBfb25lc2hvdDsKK30KKworcGNhcF90ICoKK3BjYXBfY3JlYXRlX2NvbW1vbihjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmVidWYpCit7CisJcGNhcF90ICpwOworCisJcCA9IG1hbGxvYyhzaXplb2YoKnApKTsKKwlpZiAocCA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworI2lmbmRlZiBXSU4zMgorCXAtPmZkID0gLTE7CS8qIG5vdCBvcGVuZWQgeWV0ICovCisJcC0+c2VsZWN0YWJsZV9mZCA9IC0xOworCXAtPnNlbmRfZmQgPSAtMTsKKyNlbmRpZiAKKworCXAtPm9wdC5zb3VyY2UgPSBzdHJkdXAoc291cmNlKTsKKwlpZiAocC0+b3B0LnNvdXJjZSA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGVidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJtYWxsb2M6ICVzIiwKKwkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJZnJlZShwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKgorCSAqIERlZmF1bHQgdG8gImNhbid0IHNldCByZm1vbiBtb2RlIjsgaWYgaXQncyBzdXBwb3J0ZWQgYnkKKwkgKiBhIHBsYXRmb3JtLCB0aGUgY3JlYXRlIHJvdXRpbmUgdGhhdCBjYWxsZWQgdXMgY2FuIHNldAorCSAqIHRoZSBvcCB0byBpdHMgcm91dGluZSB0byBjaGVjayB3aGV0aGVyIGEgcGFydGljdWxhcgorCSAqIGRldmljZSBzdXBwb3J0cyBpdC4KKwkgKi8KKwlwLT5jYW5fc2V0X3JmbW9uX29wID0gcGNhcF9jYW50X3NldF9yZm1vbjsKKworCWluaXRpYWxpemVfb3BzKHApOworCisJLyogcHV0IGluIHNvbWUgZGVmYXVsdHMqLworCXBjYXBfc2V0X3RpbWVvdXQocCwgMCk7CisJcGNhcF9zZXRfc25hcGxlbihwLCA2NTUzNSk7CS8qIG1heCBwYWNrZXQgc2l6ZSAqLworCXAtPm9wdC5wcm9taXNjID0gMDsKKwlwLT5vcHQuYnVmZmVyX3NpemUgPSAwOworCXAtPm9wdC50c3RhbXBfdHlwZSA9IC0xOwkvKiBkZWZhdWx0IHRvIG5vdCBzZXR0aW5nIHRpbWUgc3RhbXAgdHlwZSAqLworCXJldHVybiAocCk7Cit9CisKK2ludAorcGNhcF9jaGVja19hY3RpdmF0ZWQocGNhcF90ICpwKQoreworCWlmIChwLT5hY3RpdmF0ZWQpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiY2FuJ3QgcGVyZm9ybSAiCisJCQkiIG9wZXJhdGlvbiBvbiBhY3RpdmF0ZWQgY2FwdHVyZSIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworaW50CitwY2FwX3NldF9zbmFwbGVuKHBjYXBfdCAqcCwgaW50IHNuYXBsZW4pCit7CisJaWYgKHBjYXBfY2hlY2tfYWN0aXZhdGVkKHApKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKKwlwLT5zbmFwc2hvdCA9IHNuYXBsZW47CisJcmV0dXJuICgwKTsKK30KKworaW50CitwY2FwX3NldF9wcm9taXNjKHBjYXBfdCAqcCwgaW50IHByb21pc2MpCit7CisJaWYgKHBjYXBfY2hlY2tfYWN0aXZhdGVkKHApKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKKwlwLT5vcHQucHJvbWlzYyA9IHByb21pc2M7CisJcmV0dXJuICgwKTsKK30KKworaW50CitwY2FwX3NldF9yZm1vbihwY2FwX3QgKnAsIGludCByZm1vbikKK3sKKwlpZiAocGNhcF9jaGVja19hY3RpdmF0ZWQocCkpCisJCXJldHVybiAoUENBUF9FUlJPUl9BQ1RJVkFURUQpOworCXAtPm9wdC5yZm1vbiA9IHJmbW9uOworCXJldHVybiAoMCk7Cit9CisKK2ludAorcGNhcF9zZXRfdGltZW91dChwY2FwX3QgKnAsIGludCB0aW1lb3V0X21zKQoreworCWlmIChwY2FwX2NoZWNrX2FjdGl2YXRlZChwKSkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX0FDVElWQVRFRCk7CisJcC0+bWQudGltZW91dCA9IHRpbWVvdXRfbXM7CisJcmV0dXJuICgwKTsKK30KKworaW50CitwY2FwX3NldF90c3RhbXBfdHlwZShwY2FwX3QgKnAsIGludCB0c3RhbXBfdHlwZSkKK3sKKwlpbnQgaTsKKworCWlmIChwY2FwX2NoZWNrX2FjdGl2YXRlZChwKSkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX0FDVElWQVRFRCk7CisKKwkvKgorCSAqIElmIHAtPnRzdGFtcF90eXBlX2NvdW50IGlzIDAsIHdlIGRvbid0IHN1cHBvcnQgc2V0dGluZworCSAqIHRoZSB0aW1lIHN0YW1wIHR5cGUgYXQgYWxsLgorCSAqLworCWlmIChwLT50c3RhbXBfdHlwZV9jb3VudCA9PSAwKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfQ0FOVFNFVF9UU1RBTVBfVFlQRSk7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgd2UgY2xhaW0gdG8gc3VwcG9ydCB0aGlzIHR5cGUgb2YgdGltZSBzdGFtcC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcC0+dHN0YW1wX3R5cGVfY291bnQ7IGkrKykgeworCQlpZiAocC0+dHN0YW1wX3R5cGVfbGlzdFtpXSA9PSB0c3RhbXBfdHlwZSkgeworCQkJLyoKKwkJCSAqIFllcy4KKwkJCSAqLworCQkJcC0+b3B0LnRzdGFtcF90eXBlID0gdHN0YW1wX3R5cGU7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCisJLyoKKwkgKiBOby4gIFdlIHN1cHBvcnQgc2V0dGluZyB0aGUgdGltZSBzdGFtcCB0eXBlLCBidXQgbm90IHRvIHRoaXMKKwkgKiBwYXJ0aWN1bGFyIHZhbHVlLgorCSAqLworCXJldHVybiAoUENBUF9XQVJOSU5HX1RTVEFNUF9UWVBFX05PVFNVUCk7Cit9CisKK2ludAorcGNhcF9zZXRfYnVmZmVyX3NpemUocGNhcF90ICpwLCBpbnQgYnVmZmVyX3NpemUpCit7CisJaWYgKHBjYXBfY2hlY2tfYWN0aXZhdGVkKHApKQorCQlyZXR1cm4gKFBDQVBfRVJST1JfQUNUSVZBVEVEKTsKKwlwLT5vcHQuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKKwlyZXR1cm4gKDApOworfQorCitpbnQKK3BjYXBfYWN0aXZhdGUocGNhcF90ICpwKQoreworCWludCBzdGF0dXM7CisKKwkvKgorCSAqIENhdGNoIGF0dGVtcHRzIHRvIHJlLWFjdGl2YXRlIGFuIGFscmVhZHktYWN0aXZhdGVkCisJICogcGNhcF90OyB0aGlzIHNob3VsZCwgZm9yIGV4YW1wbGUsIGNhdGNoIGNvZGUgdGhhdAorCSAqIGNhbGxzIHBjYXBfb3Blbl9saXZlKCkgZm9sbG93ZWQgYnkgcGNhcF9hY3RpdmF0ZSgpLAorCSAqIGFzIHNvbWUgY29kZSB0aGF0IHNob3dlZCB1cCBpbiBhIFN0YWNrIEV4Y2hhbmdlCisJICogcXVlc3Rpb24gZGlkLgorCSAqLworCWlmIChwY2FwX2NoZWNrX2FjdGl2YXRlZChwKSkKKwkJcmV0dXJuIChQQ0FQX0VSUk9SX0FDVElWQVRFRCk7CisJc3RhdHVzID0gcC0+YWN0aXZhdGVfb3AocCk7CisJaWYgKHN0YXR1cyA+PSAwKQorCQlwLT5hY3RpdmF0ZWQgPSAxOworCWVsc2UgeworCQlpZiAocC0+ZXJyYnVmWzBdID09ICdcMCcpIHsKKwkJCS8qCisJCQkgKiBObyBlcnJvciBtZXNzYWdlIHN1cHBsaWVkIGJ5IHRoZSBhY3RpdmF0ZSByb3V0aW5lOworCQkJICogZm9yIHRoZSBiZW5lZml0IG9mIHByb2dyYW1zIHRoYXQgZG9uJ3Qgc3BlY2lhbGx5CisJCQkgKiBoYW5kbGUgZXJyb3JzIG90aGVyIHRoYW4gUENBUF9FUlJPUiwgcmV0dXJuIHRoZQorCQkJICogZXJyb3IgbWVzc2FnZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGF0dXMuCisJCQkgKi8KKwkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzIiwKKwkJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cykpOworCQl9CisKKwkJLyoKKwkJICogVW5kbyBhbnkgb3BlcmF0aW9uIHBvaW50ZXIgc2V0dGluZywgZXRjLiBkb25lIGJ5CisJCSAqIHRoZSBhY3RpdmF0ZSBvcGVyYXRpb24uCisJCSAqLworCQlpbml0aWFsaXplX29wcyhwKTsKKwl9CisJcmV0dXJuIChzdGF0dXMpOworfQorCitwY2FwX3QgKgorcGNhcF9vcGVuX2xpdmUoY29uc3QgY2hhciAqc291cmNlLCBpbnQgc25hcGxlbiwgaW50IHByb21pc2MsIGludCB0b19tcywgY2hhciAqZXJyYnVmKQoreworCXBjYXBfdCAqcDsKKwlpbnQgc3RhdHVzOworCisJcCA9IHBjYXBfY3JlYXRlKHNvdXJjZSwgZXJyYnVmKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gKE5VTEwpOworCXN0YXR1cyA9IHBjYXBfc2V0X3NuYXBsZW4ocCwgc25hcGxlbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKwlzdGF0dXMgPSBwY2FwX3NldF9wcm9taXNjKHAsIHByb21pc2MpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGZhaWw7CisJc3RhdHVzID0gcGNhcF9zZXRfdGltZW91dChwLCB0b19tcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKwkvKgorCSAqIE1hcmsgdGhpcyBhcyBvcGVuZWQgd2l0aCBwY2FwX29wZW5fbGl2ZSgpLCBzbyB0aGF0LCBmb3IKKwkgKiBleGFtcGxlLCB3ZSBzaG93IHRoZSBmdWxsIGxpc3Qgb2YgRExUXyB2YWx1ZXMsIHJhdGhlcgorCSAqIHRoYW4ganVzdCB0aGUgb25lcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggY2FwdHVyaW5nCisJICogd2hlbiBub3QgaW4gbW9uaXRvciBtb2RlLiAgVGhhdCBhbGxvd3MgZXhpc3RpbmcgYXBwbGljYXRpb25zCisJICogdG8gd29yayB0aGUgd2F5IHRoZXkgdXNlZCB0byB3b3JrLCBidXQgYWxsb3dzIG5ldyBhcHBsaWNhdGlvbnMKKwkgKiB0aGF0IGtub3cgYWJvdXQgdGhlIG5ldyBvcGVuIEFQSSB0bywgZm9yIGV4YW1wbGUsIGZpbmQgb3V0IHRoZQorCSAqIERMVF8gdmFsdWVzIHRoYXQgdGhleSBjYW4gc2VsZWN0IHdpdGhvdXQgY2hhbmdpbmcgd2hldGhlcgorCSAqIHRoZSBhZGFwdGVyIGlzIGluIG1vbml0b3IgbW9kZSBvciBub3QuCisJICovCisJcC0+b2xkc3R5bGUgPSAxOworCXN0YXR1cyA9IHBjYXBfYWN0aXZhdGUocCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZmFpbDsKKwlyZXR1cm4gKHApOworZmFpbDoKKwlpZiAoc3RhdHVzID09IFBDQVBfRVJST1IpCisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIiVzOiAlcyIsIHNvdXJjZSwKKwkJICAgIHAtPmVycmJ1Zik7CisJZWxzZSBpZiAoc3RhdHVzID09IFBDQVBfRVJST1JfTk9fU1VDSF9ERVZJQ0UgfHwKKwkgICAgc3RhdHVzID09IFBDQVBfRVJST1JfUEVSTV9ERU5JRUQgfHwKKwkgICAgc3RhdHVzID09IFBDQVBfRVJST1JfUFJPTUlTQ19QRVJNX0RFTklFRCkKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzICglcykiLCBzb3VyY2UsCisJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cyksIHAtPmVycmJ1Zik7CisJZWxzZQorCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICIlczogJXMiLCBzb3VyY2UsCisJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cykpOworCXBjYXBfY2xvc2UocCk7CisJcmV0dXJuIChOVUxMKTsKK30KKworaW50CitwY2FwX2Rpc3BhdGNoKHBjYXBfdCAqcCwgaW50IGNudCwgcGNhcF9oYW5kbGVyIGNhbGxiYWNrLCB1X2NoYXIgKnVzZXIpCit7CisJcmV0dXJuIChwLT5yZWFkX29wKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpKTsKK30KKworLyoKKyAqIFhYWCAtIGlzIHRoaXMgbmVjZXNzYXJ5PworICovCitpbnQKK3BjYXBfcmVhZChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCisJcmV0dXJuIChwLT5yZWFkX29wKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpKTsKK30KKworaW50CitwY2FwX2xvb3AocGNhcF90ICpwLCBpbnQgY250LCBwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcikKK3sKKwlyZWdpc3RlciBpbnQgbjsKKworCWZvciAoOzspIHsKKwkJaWYgKHAtPnNmLnJmaWxlICE9IE5VTEwpIHsKKwkJCS8qCisJCQkgKiAwIG1lYW5zIEVPRiwgc28gZG9uJ3QgbG9vcCBpZiB3ZSBnZXQgMC4KKwkJCSAqLworCQkJbiA9IHBjYXBfb2ZmbGluZV9yZWFkKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFhYWCBrZWVwIHJlYWRpbmcgdW50aWwgd2UgZ2V0IHNvbWV0aGluZworCQkJICogKG9yIGFuIGVycm9yIG9jY3VycykKKwkJCSAqLworCQkJZG8geworCQkJCW4gPSBwLT5yZWFkX29wKHAsIGNudCwgY2FsbGJhY2ssIHVzZXIpOworCQkJfSB3aGlsZSAobiA9PSAwKTsKKwkJfQorCQlpZiAobiA8PSAwKQorCQkJcmV0dXJuIChuKTsKKwkJaWYgKGNudCA+IDApIHsKKwkJCWNudCAtPSBuOworCQkJaWYgKGNudCA8PSAwKQorCQkJCXJldHVybiAoMCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBGb3JjZSB0aGUgbG9vcCBpbiAicGNhcF9yZWFkKCkiIG9yICJwY2FwX3JlYWRfb2ZmbGluZSgpIiB0byB0ZXJtaW5hdGUuCisgKi8KK3ZvaWQKK3BjYXBfYnJlYWtsb29wKHBjYXBfdCAqcCkKK3sKKwlwLT5icmVha19sb29wID0gMTsKK30KKworaW50CitwY2FwX2RhdGFsaW5rKHBjYXBfdCAqcCkKK3sKKwlyZXR1cm4gKHAtPmxpbmt0eXBlKTsKK30KKworaW50CitwY2FwX2RhdGFsaW5rX2V4dChwY2FwX3QgKnApCit7CisJcmV0dXJuIChwLT5saW5rdHlwZV9leHQpOworfQorCitpbnQKK3BjYXBfbGlzdF9kYXRhbGlua3MocGNhcF90ICpwLCBpbnQgKipkbHRfYnVmZmVyKQoreworCWlmIChwLT5kbHRfY291bnQgPT0gMCkgeworCQkvKgorCQkgKiBXZSBjb3VsZG4ndCBmZXRjaCB0aGUgbGlzdCBvZiBETFRzLCB3aGljaCBtZWFucworCQkgKiB0aGlzIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCBjaGFuZ2luZyB0aGUKKwkJICogRExUIGZvciBhbiBpbnRlcmZhY2UuICBSZXR1cm4gYSBsaXN0IG9mIERMVHMKKwkJICogY29udGFpbmluZyBvbmx5IHRoZSBETFQgdGhpcyBkZXZpY2Ugc3VwcG9ydHMuCisJCSAqLworCQkqZGx0X2J1ZmZlciA9IChpbnQqKW1hbGxvYyhzaXplb2YoKipkbHRfYnVmZmVyKSk7CisJCWlmICgqZGx0X2J1ZmZlciA9PSBOVUxMKSB7CisJCQkodm9pZClzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJKipkbHRfYnVmZmVyID0gcC0+bGlua3R5cGU7CisJCXJldHVybiAoMSk7CisJfSBlbHNlIHsKKwkJKmRsdF9idWZmZXIgPSAoaW50KiljYWxsb2Moc2l6ZW9mKCoqZGx0X2J1ZmZlciksIHAtPmRsdF9jb3VudCk7CisJCWlmICgqZGx0X2J1ZmZlciA9PSBOVUxMKSB7CisJCQkodm9pZClzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkJICAgICJtYWxsb2M6ICVzIiwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJKHZvaWQpbWVtY3B5KCpkbHRfYnVmZmVyLCBwLT5kbHRfbGlzdCwKKwkJICAgIHNpemVvZigqKmRsdF9idWZmZXIpICogcC0+ZGx0X2NvdW50KTsKKwkJcmV0dXJuIChwLT5kbHRfY291bnQpOworCX0KK30KKworLyoKKyAqIEluIFdpbmRvd3MsIHlvdSBtaWdodCBoYXZlIGEgbGlicmFyeSBidWlsdCB3aXRoIG9uZSB2ZXJzaW9uIG9mIHRoZQorICogQyBydW50aW1lIGxpYnJhcnkgYW5kIGFuIGFwcGxpY2F0aW9uIGJ1aWx0IHdpdGggYW5vdGhlciB2ZXJzaW9uIG9mCisgKiB0aGUgQyBydW50aW1lIGxpYnJhcnksIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGxpYnJhcnkgbWlnaHQgdXNlIG9uZQorICogdmVyc2lvbiBvZiBtYWxsb2MoKSBhbmQgZnJlZSgpIGFuZCB0aGUgYXBwbGljYXRpb24gbWlnaHQgdXNlIGFub3RoZXIKKyAqIHZlcnNpb24gb2YgbWFsbG9jKCkgYW5kIGZyZWUoKS4gIElmIHNvLCB0aGF0IG1lYW5zIHNvbWV0aGluZworICogYWxsb2NhdGVkIGJ5IHRoZSBsaWJyYXJ5IGNhbm5vdCBiZSBmcmVlZCBieSB0aGUgYXBwbGljYXRpb24sIHNvIHdlCisgKiBuZWVkIHRvIGhhdmUgYSBwY2FwX2ZyZWVfZGF0YWxpbmtzKCkgcm91dGluZSB0byBmcmVlIHVwIHRoZSBsaXN0CisgKiBhbGxvY2F0ZWQgYnkgcGNhcF9saXN0X2RhdGFsaW5rcygpLCBldmVuIHRob3VnaCBpdCdzIGp1c3QgYSB3cmFwcGVyCisgKiBhcm91bmQgZnJlZSgpLgorICovCit2b2lkCitwY2FwX2ZyZWVfZGF0YWxpbmtzKGludCAqZGx0X2xpc3QpCit7CisJZnJlZShkbHRfbGlzdCk7Cit9CisKK2ludAorcGNhcF9zZXRfZGF0YWxpbmsocGNhcF90ICpwLCBpbnQgZGx0KQoreworCWludCBpOworCWNvbnN0IGNoYXIgKmRsdF9uYW1lOworCisJaWYgKHAtPmRsdF9jb3VudCA9PSAwIHx8IHAtPnNldF9kYXRhbGlua19vcCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFdlIGNvdWxkbid0IGZldGNoIHRoZSBsaXN0IG9mIERMVHMsIG9yIHdlIGRvbid0CisJCSAqIGhhdmUgYSAic2V0IGRhdGFsaW5rIiBvcGVyYXRpb24sIHdoaWNoIG1lYW5zCisJCSAqIHRoaXMgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IGNoYW5naW5nIHRoZQorCQkgKiBETFQgZm9yIGFuIGludGVyZmFjZS4gIENoZWNrIHdoZXRoZXIgdGhlIG5ldworCQkgKiBETFQgaXMgdGhlIG9uZSB0aGlzIGludGVyZmFjZSBzdXBwb3J0cy4KKwkJICovCisJCWlmIChwLT5saW5rdHlwZSAhPSBkbHQpCisJCQlnb3RvIHVuc3VwcG9ydGVkOworCisJCS8qCisJCSAqIEl0IGlzLCBzbyB0aGVyZSdzIG5vdGhpbmcgd2UgbmVlZCB0byBkbyBoZXJlLgorCQkgKi8KKwkJcmV0dXJuICgwKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHAtPmRsdF9jb3VudDsgaSsrKQorCQlpZiAocC0+ZGx0X2xpc3RbaV0gPT0gZGx0KQorCQkJYnJlYWs7CisJaWYgKGkgPj0gcC0+ZGx0X2NvdW50KQorCQlnb3RvIHVuc3VwcG9ydGVkOworCWlmIChwLT5kbHRfY291bnQgPT0gMiAmJiBwLT5kbHRfbGlzdFswXSA9PSBETFRfRU4xME1CICYmCisJICAgIGRsdCA9PSBETFRfRE9DU0lTKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgcHJlc3VtYWJseSBhbiBFdGhlcm5ldCBkZXZpY2UsIGFzIHRoZSBmaXJzdAorCQkgKiBsaW5rLWxheWVyIHR5cGUgaXQgb2ZmZXJzIGlzIERMVF9FTjEwTUIsIGFuZCB0aGUgb25seQorCQkgKiBvdGhlciB0eXBlIGl0IG9mZmVycyBpcyBETFRfRE9DU0lTLiAgVGhhdCBtZWFucyB0aGF0CisJCSAqIHdlIGNhbid0IHRlbGwgdGhlIGRyaXZlciB0byBzdXBwbHkgRE9DU0lTIGxpbmstbGF5ZXIKKwkJICogaGVhZGVycyAtIHdlJ3JlIGp1c3QgcHJldGVuZGluZyB0aGF0J3Mgd2hhdCB3ZSdyZQorCQkgKiBnZXR0aW5nLCBhcywgcHJlc3VtYWJseSwgd2UncmUgY2FwdHVyaW5nIG9uIGEgZGVkaWNhdGVkCisJCSAqIGxpbmsgdG8gYSBDaXNjbyBDYWJsZSBNb2RlbSBUZXJtaW5hdGlvbiBTeXN0ZW0sIGFuZAorCQkgKiBpdCdzIHB1dHRpbmcgcmF3IERPQ1NJUyBmcmFtZXMgb24gdGhlIHdpcmUgaW5zaWRlIGxvdy1sZXZlbAorCQkgKiBFdGhlcm5ldCBmcmFtaW5nLgorCQkgKi8KKwkJcC0+bGlua3R5cGUgPSBkbHQ7CisJCXJldHVybiAoMCk7CisJfQorCWlmIChwLT5zZXRfZGF0YWxpbmtfb3AocCwgZGx0KSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisJcC0+bGlua3R5cGUgPSBkbHQ7CisJcmV0dXJuICgwKTsKKwordW5zdXBwb3J0ZWQ6CisJZGx0X25hbWUgPSBwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKGRsdCk7CisJaWYgKGRsdF9uYW1lICE9IE5VTEwpIHsKKwkJKHZvaWQpIHNucHJpbnRmKHAtPmVycmJ1Ziwgc2l6ZW9mKHAtPmVycmJ1ZiksCisJCSAgICAiJXMgaXMgbm90IG9uZSBvZiB0aGUgRExUcyBzdXBwb3J0ZWQgYnkgdGhpcyBkZXZpY2UiLAorCQkgICAgZGx0X25hbWUpOworCX0gZWxzZSB7CisJCSh2b2lkKSBzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCQkgICAgIkRMVCAlZCBpcyBub3Qgb25lIG9mIHRoZSBETFRzIHN1cHBvcnRlZCBieSB0aGlzIGRldmljZSIsCisJCSAgICBkbHQpOworCX0KKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIFRoaXMgYXJyYXkgaXMgZGVzaWduZWQgZm9yIG1hcHBpbmcgdXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVyCisgKiB0b2dldGhlciBmb3IgYSBjYXNlIGluZGVwZW5kZW50IGNvbXBhcmlzb24uICBUaGUgbWFwcGluZ3MgYXJlCisgKiBiYXNlZCB1cG9uIGFzY2lpIGNoYXJhY3RlciBzZXF1ZW5jZXMuCisgKi8KK3N0YXRpYyBjb25zdCB1X2NoYXIgY2hhcm1hcFtdID0geworCSh1X2NoYXIpJ1wwMDAnLCAodV9jaGFyKSdcMDAxJywgKHVfY2hhciknXDAwMicsICh1X2NoYXIpJ1wwMDMnLAorCSh1X2NoYXIpJ1wwMDQnLCAodV9jaGFyKSdcMDA1JywgKHVfY2hhciknXDAwNicsICh1X2NoYXIpJ1wwMDcnLAorCSh1X2NoYXIpJ1wwMTAnLCAodV9jaGFyKSdcMDExJywgKHVfY2hhciknXDAxMicsICh1X2NoYXIpJ1wwMTMnLAorCSh1X2NoYXIpJ1wwMTQnLCAodV9jaGFyKSdcMDE1JywgKHVfY2hhciknXDAxNicsICh1X2NoYXIpJ1wwMTcnLAorCSh1X2NoYXIpJ1wwMjAnLCAodV9jaGFyKSdcMDIxJywgKHVfY2hhciknXDAyMicsICh1X2NoYXIpJ1wwMjMnLAorCSh1X2NoYXIpJ1wwMjQnLCAodV9jaGFyKSdcMDI1JywgKHVfY2hhciknXDAyNicsICh1X2NoYXIpJ1wwMjcnLAorCSh1X2NoYXIpJ1wwMzAnLCAodV9jaGFyKSdcMDMxJywgKHVfY2hhciknXDAzMicsICh1X2NoYXIpJ1wwMzMnLAorCSh1X2NoYXIpJ1wwMzQnLCAodV9jaGFyKSdcMDM1JywgKHVfY2hhciknXDAzNicsICh1X2NoYXIpJ1wwMzcnLAorCSh1X2NoYXIpJ1wwNDAnLCAodV9jaGFyKSdcMDQxJywgKHVfY2hhciknXDA0MicsICh1X2NoYXIpJ1wwNDMnLAorCSh1X2NoYXIpJ1wwNDQnLCAodV9jaGFyKSdcMDQ1JywgKHVfY2hhciknXDA0NicsICh1X2NoYXIpJ1wwNDcnLAorCSh1X2NoYXIpJ1wwNTAnLCAodV9jaGFyKSdcMDUxJywgKHVfY2hhciknXDA1MicsICh1X2NoYXIpJ1wwNTMnLAorCSh1X2NoYXIpJ1wwNTQnLCAodV9jaGFyKSdcMDU1JywgKHVfY2hhciknXDA1NicsICh1X2NoYXIpJ1wwNTcnLAorCSh1X2NoYXIpJ1wwNjAnLCAodV9jaGFyKSdcMDYxJywgKHVfY2hhciknXDA2MicsICh1X2NoYXIpJ1wwNjMnLAorCSh1X2NoYXIpJ1wwNjQnLCAodV9jaGFyKSdcMDY1JywgKHVfY2hhciknXDA2NicsICh1X2NoYXIpJ1wwNjcnLAorCSh1X2NoYXIpJ1wwNzAnLCAodV9jaGFyKSdcMDcxJywgKHVfY2hhciknXDA3MicsICh1X2NoYXIpJ1wwNzMnLAorCSh1X2NoYXIpJ1wwNzQnLCAodV9jaGFyKSdcMDc1JywgKHVfY2hhciknXDA3NicsICh1X2NoYXIpJ1wwNzcnLAorCSh1X2NoYXIpJ1wxMDAnLCAodV9jaGFyKSdcMTQxJywgKHVfY2hhciknXDE0MicsICh1X2NoYXIpJ1wxNDMnLAorCSh1X2NoYXIpJ1wxNDQnLCAodV9jaGFyKSdcMTQ1JywgKHVfY2hhciknXDE0NicsICh1X2NoYXIpJ1wxNDcnLAorCSh1X2NoYXIpJ1wxNTAnLCAodV9jaGFyKSdcMTUxJywgKHVfY2hhciknXDE1MicsICh1X2NoYXIpJ1wxNTMnLAorCSh1X2NoYXIpJ1wxNTQnLCAodV9jaGFyKSdcMTU1JywgKHVfY2hhciknXDE1NicsICh1X2NoYXIpJ1wxNTcnLAorCSh1X2NoYXIpJ1wxNjAnLCAodV9jaGFyKSdcMTYxJywgKHVfY2hhciknXDE2MicsICh1X2NoYXIpJ1wxNjMnLAorCSh1X2NoYXIpJ1wxNjQnLCAodV9jaGFyKSdcMTY1JywgKHVfY2hhciknXDE2NicsICh1X2NoYXIpJ1wxNjcnLAorCSh1X2NoYXIpJ1wxNzAnLCAodV9jaGFyKSdcMTcxJywgKHVfY2hhciknXDE3MicsICh1X2NoYXIpJ1wxMzMnLAorCSh1X2NoYXIpJ1wxMzQnLCAodV9jaGFyKSdcMTM1JywgKHVfY2hhciknXDEzNicsICh1X2NoYXIpJ1wxMzcnLAorCSh1X2NoYXIpJ1wxNDAnLCAodV9jaGFyKSdcMTQxJywgKHVfY2hhciknXDE0MicsICh1X2NoYXIpJ1wxNDMnLAorCSh1X2NoYXIpJ1wxNDQnLCAodV9jaGFyKSdcMTQ1JywgKHVfY2hhciknXDE0NicsICh1X2NoYXIpJ1wxNDcnLAorCSh1X2NoYXIpJ1wxNTAnLCAodV9jaGFyKSdcMTUxJywgKHVfY2hhciknXDE1MicsICh1X2NoYXIpJ1wxNTMnLAorCSh1X2NoYXIpJ1wxNTQnLCAodV9jaGFyKSdcMTU1JywgKHVfY2hhciknXDE1NicsICh1X2NoYXIpJ1wxNTcnLAorCSh1X2NoYXIpJ1wxNjAnLCAodV9jaGFyKSdcMTYxJywgKHVfY2hhciknXDE2MicsICh1X2NoYXIpJ1wxNjMnLAorCSh1X2NoYXIpJ1wxNjQnLCAodV9jaGFyKSdcMTY1JywgKHVfY2hhciknXDE2NicsICh1X2NoYXIpJ1wxNjcnLAorCSh1X2NoYXIpJ1wxNzAnLCAodV9jaGFyKSdcMTcxJywgKHVfY2hhciknXDE3MicsICh1X2NoYXIpJ1wxNzMnLAorCSh1X2NoYXIpJ1wxNzQnLCAodV9jaGFyKSdcMTc1JywgKHVfY2hhciknXDE3NicsICh1X2NoYXIpJ1wxNzcnLAorCSh1X2NoYXIpJ1wyMDAnLCAodV9jaGFyKSdcMjAxJywgKHVfY2hhciknXDIwMicsICh1X2NoYXIpJ1wyMDMnLAorCSh1X2NoYXIpJ1wyMDQnLCAodV9jaGFyKSdcMjA1JywgKHVfY2hhciknXDIwNicsICh1X2NoYXIpJ1wyMDcnLAorCSh1X2NoYXIpJ1wyMTAnLCAodV9jaGFyKSdcMjExJywgKHVfY2hhciknXDIxMicsICh1X2NoYXIpJ1wyMTMnLAorCSh1X2NoYXIpJ1wyMTQnLCAodV9jaGFyKSdcMjE1JywgKHVfY2hhciknXDIxNicsICh1X2NoYXIpJ1wyMTcnLAorCSh1X2NoYXIpJ1wyMjAnLCAodV9jaGFyKSdcMjIxJywgKHVfY2hhciknXDIyMicsICh1X2NoYXIpJ1wyMjMnLAorCSh1X2NoYXIpJ1wyMjQnLCAodV9jaGFyKSdcMjI1JywgKHVfY2hhciknXDIyNicsICh1X2NoYXIpJ1wyMjcnLAorCSh1X2NoYXIpJ1wyMzAnLCAodV9jaGFyKSdcMjMxJywgKHVfY2hhciknXDIzMicsICh1X2NoYXIpJ1wyMzMnLAorCSh1X2NoYXIpJ1wyMzQnLCAodV9jaGFyKSdcMjM1JywgKHVfY2hhciknXDIzNicsICh1X2NoYXIpJ1wyMzcnLAorCSh1X2NoYXIpJ1wyNDAnLCAodV9jaGFyKSdcMjQxJywgKHVfY2hhciknXDI0MicsICh1X2NoYXIpJ1wyNDMnLAorCSh1X2NoYXIpJ1wyNDQnLCAodV9jaGFyKSdcMjQ1JywgKHVfY2hhciknXDI0NicsICh1X2NoYXIpJ1wyNDcnLAorCSh1X2NoYXIpJ1wyNTAnLCAodV9jaGFyKSdcMjUxJywgKHVfY2hhciknXDI1MicsICh1X2NoYXIpJ1wyNTMnLAorCSh1X2NoYXIpJ1wyNTQnLCAodV9jaGFyKSdcMjU1JywgKHVfY2hhciknXDI1NicsICh1X2NoYXIpJ1wyNTcnLAorCSh1X2NoYXIpJ1wyNjAnLCAodV9jaGFyKSdcMjYxJywgKHVfY2hhciknXDI2MicsICh1X2NoYXIpJ1wyNjMnLAorCSh1X2NoYXIpJ1wyNjQnLCAodV9jaGFyKSdcMjY1JywgKHVfY2hhciknXDI2NicsICh1X2NoYXIpJ1wyNjcnLAorCSh1X2NoYXIpJ1wyNzAnLCAodV9jaGFyKSdcMjcxJywgKHVfY2hhciknXDI3MicsICh1X2NoYXIpJ1wyNzMnLAorCSh1X2NoYXIpJ1wyNzQnLCAodV9jaGFyKSdcMjc1JywgKHVfY2hhciknXDI3NicsICh1X2NoYXIpJ1wyNzcnLAorCSh1X2NoYXIpJ1wzMDAnLCAodV9jaGFyKSdcMzQxJywgKHVfY2hhciknXDM0MicsICh1X2NoYXIpJ1wzNDMnLAorCSh1X2NoYXIpJ1wzNDQnLCAodV9jaGFyKSdcMzQ1JywgKHVfY2hhciknXDM0NicsICh1X2NoYXIpJ1wzNDcnLAorCSh1X2NoYXIpJ1wzNTAnLCAodV9jaGFyKSdcMzUxJywgKHVfY2hhciknXDM1MicsICh1X2NoYXIpJ1wzNTMnLAorCSh1X2NoYXIpJ1wzNTQnLCAodV9jaGFyKSdcMzU1JywgKHVfY2hhciknXDM1NicsICh1X2NoYXIpJ1wzNTcnLAorCSh1X2NoYXIpJ1wzNjAnLCAodV9jaGFyKSdcMzYxJywgKHVfY2hhciknXDM2MicsICh1X2NoYXIpJ1wzNjMnLAorCSh1X2NoYXIpJ1wzNjQnLCAodV9jaGFyKSdcMzY1JywgKHVfY2hhciknXDM2NicsICh1X2NoYXIpJ1wzNjcnLAorCSh1X2NoYXIpJ1wzNzAnLCAodV9jaGFyKSdcMzcxJywgKHVfY2hhciknXDM3MicsICh1X2NoYXIpJ1wzMzMnLAorCSh1X2NoYXIpJ1wzMzQnLCAodV9jaGFyKSdcMzM1JywgKHVfY2hhciknXDMzNicsICh1X2NoYXIpJ1wzMzcnLAorCSh1X2NoYXIpJ1wzNDAnLCAodV9jaGFyKSdcMzQxJywgKHVfY2hhciknXDM0MicsICh1X2NoYXIpJ1wzNDMnLAorCSh1X2NoYXIpJ1wzNDQnLCAodV9jaGFyKSdcMzQ1JywgKHVfY2hhciknXDM0NicsICh1X2NoYXIpJ1wzNDcnLAorCSh1X2NoYXIpJ1wzNTAnLCAodV9jaGFyKSdcMzUxJywgKHVfY2hhciknXDM1MicsICh1X2NoYXIpJ1wzNTMnLAorCSh1X2NoYXIpJ1wzNTQnLCAodV9jaGFyKSdcMzU1JywgKHVfY2hhciknXDM1NicsICh1X2NoYXIpJ1wzNTcnLAorCSh1X2NoYXIpJ1wzNjAnLCAodV9jaGFyKSdcMzYxJywgKHVfY2hhciknXDM2MicsICh1X2NoYXIpJ1wzNjMnLAorCSh1X2NoYXIpJ1wzNjQnLCAodV9jaGFyKSdcMzY1JywgKHVfY2hhciknXDM2NicsICh1X2NoYXIpJ1wzNjcnLAorCSh1X2NoYXIpJ1wzNzAnLCAodV9jaGFyKSdcMzcxJywgKHVfY2hhciknXDM3MicsICh1X2NoYXIpJ1wzNzMnLAorCSh1X2NoYXIpJ1wzNzQnLCAodV9jaGFyKSdcMzc1JywgKHVfY2hhciknXDM3NicsICh1X2NoYXIpJ1wzNzcnLAorfTsKKworaW50CitwY2FwX3N0cmNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCXJlZ2lzdGVyIGNvbnN0IHVfY2hhcgkqY20gPSBjaGFybWFwLAorCQkJCSp1czEgPSAoY29uc3QgdV9jaGFyICopczEsCisJCQkJKnVzMiA9IChjb25zdCB1X2NoYXIgKilzMjsKKworCXdoaWxlIChjbVsqdXMxXSA9PSBjbVsqdXMyKytdKQorCQlpZiAoKnVzMSsrID09ICdcMCcpCisJCQlyZXR1cm4oMCk7CisJcmV0dXJuIChjbVsqdXMxXSAtIGNtWyotLXVzMl0pOworfQorCitzdHJ1Y3QgZGx0X2Nob2ljZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKwlpbnQJZGx0OworfTsKKworI2RlZmluZSBETFRfQ0hPSUNFKGNvZGUsIGRlc2NyaXB0aW9uKSB7ICNjb2RlLCBkZXNjcmlwdGlvbiwgY29kZSB9CisjZGVmaW5lIERMVF9DSE9JQ0VfU0VOVElORUwgeyBOVUxMLCBOVUxMLCAwIH0KKworc3RhdGljIHN0cnVjdCBkbHRfY2hvaWNlIGRsdF9jaG9pY2VzW10gPSB7CisJRExUX0NIT0lDRShETFRfTlVMTCwgIkJTRCBsb29wYmFjayIpLAorCURMVF9DSE9JQ0UoRExUX0VOMTBNQiwgIkV0aGVybmV0IiksCisJRExUX0NIT0lDRShETFRfSUVFRTgwMiwgIlRva2VuIHJpbmciKSwKKwlETFRfQ0hPSUNFKERMVF9BUkNORVQsICJCU0QgQVJDTkVUIiksCisJRExUX0NIT0lDRShETFRfU0xJUCwgIlNMSVAiKSwKKwlETFRfQ0hPSUNFKERMVF9QUFAsICJQUFAiKSwKKwlETFRfQ0hPSUNFKERMVF9GRERJLCAiRkRESSIpLAorCURMVF9DSE9JQ0UoRExUX0FUTV9SRkMxNDgzLCAiUkZDIDE0ODMgTExDLWVuY2Fwc3VsYXRlZCBBVE0iKSwKKwlETFRfQ0hPSUNFKERMVF9SQVcsICJSYXcgSVAiKSwKKwlETFRfQ0hPSUNFKERMVF9TTElQX0JTRE9TLCAiQlNEL09TIFNMSVAiKSwKKwlETFRfQ0hPSUNFKERMVF9QUFBfQlNET1MsICJCU0QvT1MgUFBQIiksCisJRExUX0NIT0lDRShETFRfQVRNX0NMSVAsICJMaW51eCBDbGFzc2ljYWwgSVAtb3Zlci1BVE0iKSwKKwlETFRfQ0hPSUNFKERMVF9QUFBfU0VSSUFMLCAiUFBQIG92ZXIgc2VyaWFsIiksCisJRExUX0NIT0lDRShETFRfUFBQX0VUSEVSLCAiUFBQb0UiKSwKKyAgICAgICAgRExUX0NIT0lDRShETFRfU1lNQU5URUNfRklSRVdBTEwsICJTeW1hbnRlYyBGaXJld2FsbCIpLAorCURMVF9DSE9JQ0UoRExUX0NfSERMQywgIkNpc2NvIEhETEMiKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzExLCAiODAyLjExIiksCisJRExUX0NIT0lDRShETFRfRlJFTEFZLCAiRnJhbWUgUmVsYXkiKSwKKwlETFRfQ0hPSUNFKERMVF9MT09QLCAiT3BlbkJTRCBsb29wYmFjayIpLAorCURMVF9DSE9JQ0UoRExUX0VOQywgIk9wZW5CU0QgZW5jYXBzdWxhdGVkIElQIiksCisJRExUX0NIT0lDRShETFRfTElOVVhfU0xMLCAiTGludXggY29va2VkIiksCisJRExUX0NIT0lDRShETFRfTFRBTEssICJMb2NhbHRhbGsiKSwKKwlETFRfQ0hPSUNFKERMVF9QRkxPRywgIk9wZW5CU0QgcGZsb2cgZmlsZSIpLAorCURMVF9DSE9JQ0UoRExUX1BGU1lOQywgIlBhY2tldCBmaWx0ZXIgc3RhdGUgc3luY2luZyIpLAorCURMVF9DSE9JQ0UoRExUX1BSSVNNX0hFQURFUiwgIjgwMi4xMSBwbHVzIFByaXNtIGhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX0lQX09WRVJfRkMsICJSRkMgMjYyNSBJUC1vdmVyLUZpYnJlIENoYW5uZWwiKSwKKwlETFRfQ0hPSUNFKERMVF9TVU5BVE0sICJTdW4gcmF3IEFUTSIpLAorCURMVF9DSE9JQ0UoRExUX0lFRUU4MDJfMTFfUkFESU8sICI4MDIuMTEgcGx1cyByYWRpb3RhcCBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9BUkNORVRfTElOVVgsICJMaW51eCBBUkNORVQiKSwKKyAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9NTFBQUCwgIkp1bmlwZXIgTXVsdGktTGluayBQUFAiKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX01MRlIsICJKdW5pcGVyIE11bHRpLUxpbmsgRnJhbWUgUmVsYXkiKSwKKyAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9FUywgIkp1bmlwZXIgRW5jcnlwdGlvbiBTZXJ2aWNlcyBQSUMiKSwKKyAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9HR1NOLCAiSnVuaXBlciBHR1NOIFBJQyIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfTUZSLCAiSnVuaXBlciBGUkYuMTYgRnJhbWUgUmVsYXkiKSwKKyAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9BVE0yLCAiSnVuaXBlciBBVE0yIFBJQyIpLAorICAgICAgICBETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1NFUlZJQ0VTLCAiSnVuaXBlciBBZHZhbmNlZCBTZXJ2aWNlcyBQSUMiKSwKKyAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9BVE0xLCAiSnVuaXBlciBBVE0xIFBJQyIpLAorCURMVF9DSE9JQ0UoRExUX0FQUExFX0lQX09WRVJfSUVFRTEzOTQsICJBcHBsZSBJUC1vdmVyLUlFRUUgMTM5NCIpLAorCURMVF9DSE9JQ0UoRExUX01UUDJfV0lUSF9QSERSLCAiU1M3IE1UUDIgd2l0aCBQc2V1ZG8taGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfTVRQMiwgIlNTNyBNVFAyIiksCisJRExUX0NIT0lDRShETFRfTVRQMywgIlNTNyBNVFAzIiksCisJRExUX0NIT0lDRShETFRfU0NDUCwgIlNTNyBTQ0NQIiksCisJRExUX0NIT0lDRShETFRfRE9DU0lTLCAiRE9DU0lTIiksCisJRExUX0NIT0lDRShETFRfTElOVVhfSVJEQSwgIkxpbnV4IElyREEiKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzExX1JBRElPX0FWUywgIjgwMi4xMSBwbHVzIEFWUyByYWRpbyBpbmZvcm1hdGlvbiBoZWFkZXIiKSwKKyAgICAgICAgRExUX0NIT0lDRShETFRfSlVOSVBFUl9NT05JVE9SLCAiSnVuaXBlciBQYXNzaXZlIE1vbml0b3IgUElDIiksCisJRExUX0NIT0lDRShETFRfUFBQX1BQUEQsICJQUFAgZm9yIHBwcGQsIHdpdGggZGlyZWN0aW9uIGZsYWciKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1BQUE9FLCAiSnVuaXBlciBQUFBvRSIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfUFBQT0VfQVRNLCAiSnVuaXBlciBQUFBvRS9BVE0iKSwKKwlETFRfQ0hPSUNFKERMVF9HUFJTX0xMQywgIkdQUlMgTExDIiksCisJRExUX0NIT0lDRShETFRfR1BGX1QsICJHUEYtVCIpLAorCURMVF9DSE9JQ0UoRExUX0dQRl9GLCAiR1BGLUYiKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1BJQ19QRUVSLCAiSnVuaXBlciBQSUMgUGVlciIpLAorCURMVF9DSE9JQ0UoRExUX0VSRl9FVEgsCSJFdGhlcm5ldCB3aXRoIEVuZGFjZSBFUkYgaGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfRVJGX1BPUywgIlBhY2tldC1vdmVyLVNPTkVUIHdpdGggRW5kYWNlIEVSRiBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9MSU5VWF9MQVBELCAiTGludXggdklTRE4gTEFQRCIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfRVRIRVIsICJKdW5pcGVyIEV0aGVybmV0IiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9QUFAsICJKdW5pcGVyIFBQUCIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfRlJFTEFZLCAiSnVuaXBlciBGcmFtZSBSZWxheSIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfQ0hETEMsICJKdW5pcGVyIEMtSERMQyIpLAorCURMVF9DSE9JQ0UoRExUX01GUiwgIkZSRi4xNiBGcmFtZSBSZWxheSIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfVlAsICJKdW5pcGVyIFZvaWNlIFBJQyIpLAorCURMVF9DSE9JQ0UoRExUX0E0MjksICJBcmluYyA0MjkiKSwKKwlETFRfQ0hPSUNFKERMVF9BNjUzX0lDTSwgIkFyaW5jIDY1MyBJbnRlcnBhcnRpdGlvbiBDb21tdW5pY2F0aW9uIiksCisJRExUX0NIT0lDRShETFRfVVNCLCAiVVNCIiksCisJRExUX0NIT0lDRShETFRfQkxVRVRPT1RIX0hDSV9INCwgIkJsdWV0b290aCBIQ0kgVUFSVCB0cmFuc3BvcnQgbGF5ZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzE2X01BQ19DUFMsICJJRUVFIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9VU0JfTElOVVgsICJVU0Igd2l0aCBMaW51eCBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9DQU4yMEIsICJDb250cm9sbGVyIEFyZWEgTmV0d29yayAoQ0FOKSB2LiAyLjBCIiksCisJRExUX0NIT0lDRShETFRfSUVFRTgwMl8xNV80X0xJTlVYLCAiSUVFRSA4MDIuMTUuNCB3aXRoIExpbnV4IHBhZGRpbmciKSwKKwlETFRfQ0hPSUNFKERMVF9QUEksICJQZXItUGFja2V0IEluZm9ybWF0aW9uIiksCisJRExUX0NIT0lDRShETFRfSUVFRTgwMl8xNl9NQUNfQ1BTX1JBRElPLCAiSUVFRSA4MDIuMTYgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyIHBsdXMgcmFkaW90YXAgaGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9JU00sICJKdW5pcGVyIEludGVncmF0ZWQgU2VydmljZSBNb2R1bGUiKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzE1XzQsICJJRUVFIDgwMi4xNS40IHdpdGggRkNTIiksCisJRExUX0NIT0lDRShETFRfU0lUQSwgIlNJVEEgcHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX0VSRiwgIkVuZGFjZSBFUkYgaGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfUkFJRjEsICJFdGhlcm5ldCB3aXRoIHUxMCBOZXR3b3JrcyBwc2V1ZG8taGVhZGVyIiksCisJRExUX0NIT0lDRShETFRfSVBNQiwgIklQTUIiKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX1NULCAiSnVuaXBlciBTZWN1cmUgVHVubmVsIiksCisJRExUX0NIT0lDRShETFRfQkxVRVRPT1RIX0hDSV9INF9XSVRIX1BIRFIsICJCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIHBsdXMgcHNldWRvLWhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX0FYMjVfS0lTUywgIkFYLjI1IHdpdGggS0lTUyBoZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9JRUVFODAyXzE1XzRfTk9OQVNLX1BIWSwgIklFRUUgODAyLjE1LjQgd2l0aCBub24tQVNLIFBIWSBkYXRhIiksCisJRExUX0NIT0lDRShETFRfTVBMUywgIk1QTFMgd2l0aCBsYWJlbCBhcyBsaW5rLWxheWVyIGhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX1VTQl9MSU5VWF9NTUFQUEVELCAiVVNCIHdpdGggcGFkZGVkIExpbnV4IGhlYWRlciIpLAorCURMVF9DSE9JQ0UoRExUX0RFQ1QsICJERUNUIiksCisJRExUX0NIT0lDRShETFRfQU9TLCAiQU9TIFNwYWNlIERhdGEgTGluayBwcm90b2NvbCIpLAorCURMVF9DSE9JQ0UoRExUX1dJSEFSVCwgIldpcmVsZXNzIEhBUlQiKSwKKwlETFRfQ0hPSUNFKERMVF9GQ18yLCAiRmlicmUgQ2hhbm5lbCBGQy0yIiksCisJRExUX0NIT0lDRShETFRfRkNfMl9XSVRIX0ZSQU1FX0RFTElNUywgIkZpYnJlIENoYW5uZWwgRkMtMiB3aXRoIGZyYW1lIGRlbGltaXRlcnMiKSwKKwlETFRfQ0hPSUNFKERMVF9JUE5FVCwgIlNvbGFyaXMgaXBuZXQiKSwKKwlETFRfQ0hPSUNFKERMVF9DQU5fU09DS0VUQ0FOLCAiQ0FOLWJ1cyB3aXRoIFNvY2tldENBTiBoZWFkZXJzIiksCisJRExUX0NIT0lDRShETFRfSVBWNCwgIlJhdyBJUHY0IiksCisJRExUX0NIT0lDRShETFRfSVBWNiwgIlJhdyBJUHY2IiksCisJRExUX0NIT0lDRShETFRfSUVFRTgwMl8xNV80X05PRkNTLCAiSUVFRSA4MDIuMTUuNCB3aXRob3V0IEZDUyIpLAorCURMVF9DSE9JQ0UoRExUX0pVTklQRVJfVlMsICJKdW5pcGVyIFZpcnR1YWwgU2VydmVyIiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9TUlhfRTJFLCAiSnVuaXBlciBTUlggRTJFIiksCisJRExUX0NIT0lDRShETFRfSlVOSVBFUl9GSUJSRUNIQU5ORUwsICJKdW5pcGVyIEZpYnJlIENoYW5uZWwiKSwKKwlETFRfQ0hPSUNFKERMVF9EVkJfQ0ksICJEVkItQ0kiKSwKKwlETFRfQ0hPSUNFKERMVF9KVU5JUEVSX0FUTV9DRU1JQywgIkp1bmlwZXIgQVRNIENFTUlDIiksCisJRExUX0NIT0lDRShETFRfTkZMT0csICJMaW51eCBuZXRmaWx0ZXIgbG9nIG1lc3NhZ2VzIiksCisJRExUX0NIT0lDRShETFRfTkVUQU5BTFlaRVIsICJFdGhlcm5ldCB3aXRoIEhpbHNjaGVyIG5ldEFOQUxZWkVSIHBzZXVkby1oZWFkZXIiKSwKKwlETFRfQ0hPSUNFKERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVCwgIkV0aGVybmV0IHdpdGggSGlsc2NoZXIgbmV0QU5BTFlaRVIgcHNldWRvLWhlYWRlciBhbmQgd2l0aCBwcmVhbWJsZSBhbmQgU0ZEIiksCisJRExUX0NIT0lDRShETFRfSVBPSUIsICJSRkMgNDM5MSBJUC1vdmVyLUluZmluaWJhbmQiKSwKKwlETFRfQ0hPSUNFX1NFTlRJTkVMCit9OworCitpbnQKK3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGRsdF9jaG9pY2VzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisJCWlmIChwY2FwX3N0cmNhc2VjbXAoZGx0X2Nob2ljZXNbaV0ubmFtZSArIHNpemVvZigiRExUXyIpIC0gMSwKKwkJICAgIG5hbWUpID09IDApCisJCQlyZXR1cm4gKGRsdF9jaG9pY2VzW2ldLmRsdCk7CisJfQorCXJldHVybiAoLTEpOworfQorCitjb25zdCBjaGFyICoKK3BjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUoaW50IGRsdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGRsdF9jaG9pY2VzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisJCWlmIChkbHRfY2hvaWNlc1tpXS5kbHQgPT0gZGx0KQorCQkJcmV0dXJuIChkbHRfY2hvaWNlc1tpXS5uYW1lICsgc2l6ZW9mKCJETFRfIikgLSAxKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworY29uc3QgY2hhciAqCitwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbihpbnQgZGx0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgZGx0X2Nob2ljZXNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKGRsdF9jaG9pY2VzW2ldLmRsdCA9PSBkbHQpCisJCQlyZXR1cm4gKGRsdF9jaG9pY2VzW2ldLmRlc2NyaXB0aW9uKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworc3RydWN0IHRzdGFtcF90eXBlX2Nob2ljZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKwlpbnQJdHlwZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHN0YW1wX3R5cGVfY2hvaWNlIHRzdGFtcF90eXBlX2Nob2ljZXNbXSA9IHsKKwl7ICJob3N0IiwgIkhvc3QiLCBQQ0FQX1RTVEFNUF9IT1NUIH0sCisJeyAiaG9zdF9sb3dwcmVjIiwgIkhvc3QsIGxvdyBwcmVjaXNpb24iLCBQQ0FQX1RTVEFNUF9IT1NUX0xPV1BSRUMgfSwKKwl7ICJob3N0X2hpcHJlYyIsICJIb3N0LCBoaWdoIHByZWNpc2lvbiIsIFBDQVBfVFNUQU1QX0hPU1RfSElQUkVDIH0sCisJeyAiYWRhcHRlciIsICJBZGFwdGVyIiwgUENBUF9UU1RBTVBfQURBUFRFUiB9LAorCXsgImFkYXB0ZXJfdW5zeW5jZWQiLCAiQWRhcHRlciwgbm90IHN5bmNlZCB3aXRoIHN5c3RlbSB0aW1lIiwgUENBUF9UU1RBTVBfQURBUFRFUl9VTlNZTkNFRCB9LAorCXsgTlVMTCwgTlVMTCwgMCB9Cit9OworCitpbnQKK3BjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHRzdGFtcF90eXBlX2Nob2ljZXNbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKHBjYXBfc3RyY2FzZWNtcCh0c3RhbXBfdHlwZV9jaG9pY2VzW2ldLm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gKHRzdGFtcF90eXBlX2Nob2ljZXNbaV0udHlwZSk7CisJfQorCXJldHVybiAoUENBUF9FUlJPUik7Cit9CisKK2NvbnN0IGNoYXIgKgorcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZShpbnQgdHN0YW1wX3R5cGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyB0c3RhbXBfdHlwZV9jaG9pY2VzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKSB7CisJCWlmICh0c3RhbXBfdHlwZV9jaG9pY2VzW2ldLnR5cGUgPT0gdHN0YW1wX3R5cGUpCisJCQlyZXR1cm4gKHRzdGFtcF90eXBlX2Nob2ljZXNbaV0ubmFtZSk7CisJfQorCXJldHVybiAoTlVMTCk7Cit9CisKK2NvbnN0IGNoYXIgKgorcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fZGVzY3JpcHRpb24oaW50IHRzdGFtcF90eXBlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgdHN0YW1wX3R5cGVfY2hvaWNlc1tpXS5uYW1lICE9IE5VTEw7IGkrKykgeworCQlpZiAodHN0YW1wX3R5cGVfY2hvaWNlc1tpXS50eXBlID09IHRzdGFtcF90eXBlKQorCQkJcmV0dXJuICh0c3RhbXBfdHlwZV9jaG9pY2VzW2ldLmRlc2NyaXB0aW9uKTsKKwl9CisJcmV0dXJuIChOVUxMKTsKK30KKworaW50CitwY2FwX3NuYXBzaG90KHBjYXBfdCAqcCkKK3sKKwlyZXR1cm4gKHAtPnNuYXBzaG90KTsKK30KKworaW50CitwY2FwX2lzX3N3YXBwZWQocGNhcF90ICpwKQoreworCXJldHVybiAocC0+c2Yuc3dhcHBlZCk7Cit9CisKK2ludAorcGNhcF9tYWpvcl92ZXJzaW9uKHBjYXBfdCAqcCkKK3sKKwlyZXR1cm4gKHAtPnNmLnZlcnNpb25fbWFqb3IpOworfQorCitpbnQKK3BjYXBfbWlub3JfdmVyc2lvbihwY2FwX3QgKnApCit7CisJcmV0dXJuIChwLT5zZi52ZXJzaW9uX21pbm9yKTsKK30KKworRklMRSAqCitwY2FwX2ZpbGUocGNhcF90ICpwKQoreworCXJldHVybiAocC0+c2YucmZpbGUpOworfQorCitpbnQKK3BjYXBfZmlsZW5vKHBjYXBfdCAqcCkKK3sKKyNpZm5kZWYgV0lOMzIKKwlyZXR1cm4gKHAtPmZkKTsKKyNlbHNlCisJaWYgKHAtPmFkYXB0ZXIgIT0gTlVMTCkKKwkJcmV0dXJuICgoaW50KShEV09SRClwLT5hZGFwdGVyLT5oRmlsZSk7CisJZWxzZQorCQlyZXR1cm4gKC0xKTsKKyNlbmRpZgorfQorCisjaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQoraW50CitwY2FwX2dldF9zZWxlY3RhYmxlX2ZkKHBjYXBfdCAqcCkKK3sKKwlyZXR1cm4gKHAtPnNlbGVjdGFibGVfZmQpOworfQorI2VuZGlmCisKK3ZvaWQKK3BjYXBfcGVycm9yKHBjYXBfdCAqcCwgY2hhciAqcHJlZml4KQoreworCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcmVmaXgsIHAtPmVycmJ1Zik7Cit9CisKK2NoYXIgKgorcGNhcF9nZXRlcnIocGNhcF90ICpwKQoreworCXJldHVybiAocC0+ZXJyYnVmKTsKK30KKworaW50CitwY2FwX2dldG5vbmJsb2NrKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKQoreworCXJldHVybiAocC0+Z2V0bm9uYmxvY2tfb3AocCwgZXJyYnVmKSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIGN1cnJlbnQgbm9uLWJsb2NraW5nIG1vZGUgc2V0dGluZywgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdAorICogaXQncyBqdXN0IHRoZSBzdGFuZGFyZCBQT1NJWCBub24tYmxvY2tpbmcgZmxhZy4KKyAqCisgKiBXZSBkb24ndCBsb29rIGF0ICJwLT5ub25ibG9jayIsIGluIGNhc2Ugc29tZWJvZHkgdHdlYWtlZCB0aGUgRkQKKyAqIGRpcmVjdGx5LgorICovCisjaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQoraW50CitwY2FwX2dldG5vbmJsb2NrX2ZkKHBjYXBfdCAqcCwgY2hhciAqZXJyYnVmKQoreworCWludCBmZGZsYWdzOworCisJZmRmbGFncyA9IGZjbnRsKHAtPmZkLCBGX0dFVEZMLCAwKTsKKwlpZiAoZmRmbGFncyA9PSAtMSkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJGX0dFVEZMOiAlcyIsCisJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAoLTEpOworCX0KKwlpZiAoZmRmbGFncyAmIE9fTk9OQkxPQ0spCisJCXJldHVybiAoMSk7CisJZWxzZQorCQlyZXR1cm4gKDApOworfQorI2VuZGlmCisKK2ludAorcGNhcF9zZXRub25ibG9jayhwY2FwX3QgKnAsIGludCBub25ibG9jaywgY2hhciAqZXJyYnVmKQoreworCXJldHVybiAocC0+c2V0bm9uYmxvY2tfb3AocCwgbm9uYmxvY2ssIGVycmJ1ZikpOworfQorCisjaWYgIWRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TRE9TKQorLyoKKyAqIFNldCBub24tYmxvY2tpbmcgbW9kZSwgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdCdzIGp1c3QgdGhlCisgKiBzdGFuZGFyZCBQT1NJWCBub24tYmxvY2tpbmcgZmxhZy4gIChUaGlzIGNhbiBiZSBjYWxsZWQgYnkgdGhlCisgKiBwZXItcGxhdGZvcm0gbm9uLWJsb2NraW5nLW1vZGUgcm91dGluZSBpZiB0aGF0IHJvdXRpbmUgYWxzbworICogbmVlZHMgdG8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsuKQorICovCitpbnQKK3BjYXBfc2V0bm9uYmxvY2tfZmQocGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1ZikKK3sKKwlpbnQgZmRmbGFnczsKKworCWZkZmxhZ3MgPSBmY250bChwLT5mZCwgRl9HRVRGTCwgMCk7CisJaWYgKGZkZmxhZ3MgPT0gLTEpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRl9HRVRGTDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJaWYgKG5vbmJsb2NrKQorCQlmZGZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJZWxzZQorCQlmZGZsYWdzICY9IH5PX05PTkJMT0NLOworCWlmIChmY250bChwLT5mZCwgRl9TRVRGTCwgZmRmbGFncykgPT0gLTEpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiRl9TRVRGTDogJXMiLAorCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKy8qCisgKiBHZW5lcmF0ZSBhIHN0cmluZyBmb3IgdGhlIGxhc3QgV2luMzItc3BlY2lmaWMgZXJyb3IgKGkuZS4gYW4gZXJyb3IgZ2VuZXJhdGVkIHdoZW4gCisgKiBjYWxsaW5nIGEgV2luMzIgQVBJKS4KKyAqIEZvciBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHN0YW5kYXJkIEMgY2FsbHMsIHdlIHN0aWxsIHVzZSBwY2FwX3N0cmVycm9yKCkKKyAqLworY2hhciAqCitwY2FwX3dpbjMyc3RyZXJyb3Iodm9pZCkKK3sKKwlEV09SRCBlcnJvcjsKKwlzdGF0aWMgY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRSsxXTsKKwlpbnQgZXJybGVuOworCWNoYXIgKnA7CisKKwllcnJvciA9IEdldExhc3RFcnJvcigpOworCUZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0sIE5VTEwsIGVycm9yLCAwLCBlcnJidWYsCisJICAgIFBDQVBfRVJSQlVGX1NJWkUsIE5VTEwpOworCisJLyoKKwkgKiAiRm9ybWF0TWVzc2FnZSgpIiAiaGVscGZ1bGx5IiBzdGlja3MgQ1IvTEYgYXQgdGhlIGVuZCBvZiB0aGUKKwkgKiBtZXNzYWdlLiAgR2V0IHJpZCBvZiBpdC4KKwkgKi8KKwllcnJsZW4gPSBzdHJsZW4oZXJyYnVmKTsKKwlpZiAoZXJybGVuID49IDIpIHsKKwkJZXJyYnVmW2VycmxlbiAtIDFdID0gJ1wwJzsKKwkJZXJyYnVmW2VycmxlbiAtIDJdID0gJ1wwJzsKKwl9CisJcCA9IHN0cmNocihlcnJidWYsICdcMCcpOworCXNucHJpbnRmIChwLCBzaXplb2YoZXJyYnVmKS0ocC1lcnJidWYpLCAiICglbHUpIiwgZXJyb3IpOworCXJldHVybiAoZXJyYnVmKTsKK30KKyNlbmRpZgorCisvKgorICogR2VuZXJhdGUgZXJyb3Igc3RyaW5ncyBmb3IgUENBUF9FUlJPUl8gYW5kIFBDQVBfV0FSTklOR18gdmFsdWVzLgorICovCitjb25zdCBjaGFyICoKK3BjYXBfc3RhdHVzdG9zdHIoaW50IGVycm51bSkKK3sKKwlzdGF0aWMgY2hhciBlYnVmWzE1KzEwKzFdOworCisJc3dpdGNoIChlcnJudW0pIHsKKworCWNhc2UgUENBUF9XQVJOSU5HOgorCQlyZXR1cm4oIkdlbmVyaWMgd2FybmluZyIpOworCisJY2FzZSBQQ0FQX1dBUk5JTkdfVFNUQU1QX1RZUEVfTk9UU1VQOgorCQlyZXR1cm4gKCJUaGF0IHR5cGUgb2YgdGltZSBzdGFtcCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoYXQgZGV2aWNlIik7CisKKwljYXNlIFBDQVBfV0FSTklOR19QUk9NSVNDX05PVFNVUDoKKwkJcmV0dXJuICgiVGhhdCBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHByb21pc2N1b3VzIG1vZGUiKTsKKworCWNhc2UgUENBUF9FUlJPUjoKKwkJcmV0dXJuKCJHZW5lcmljIGVycm9yIik7CisKKwljYXNlIFBDQVBfRVJST1JfQlJFQUs6CisJCXJldHVybigiTG9vcCB0ZXJtaW5hdGVkIGJ5IHBjYXBfYnJlYWtsb29wIik7CisKKwljYXNlIFBDQVBfRVJST1JfTk9UX0FDVElWQVRFRDoKKwkJcmV0dXJuKCJUaGUgcGNhcF90IGhhcyBub3QgYmVlbiBhY3RpdmF0ZWQiKTsKKworCWNhc2UgUENBUF9FUlJPUl9BQ1RJVkFURUQ6CisJCXJldHVybiAoIlRoZSBzZXR0aW5nIGNhbid0IGJlIGNoYW5nZWQgYWZ0ZXIgdGhlIHBjYXBfdCBpcyBhY3RpdmF0ZWQiKTsKKworCWNhc2UgUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRToKKwkJcmV0dXJuICgiTm8gc3VjaCBkZXZpY2UgZXhpc3RzIik7CisKKwljYXNlIFBDQVBfRVJST1JfUkZNT05fTk9UU1VQOgorCQlyZXR1cm4gKCJUaGF0IGRldmljZSBkb2Vzbid0IHN1cHBvcnQgbW9uaXRvciBtb2RlIik7CisKKwljYXNlIFBDQVBfRVJST1JfTk9UX1JGTU9OOgorCQlyZXR1cm4gKCJUaGF0IG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgb25seSBpbiBtb25pdG9yIG1vZGUiKTsKKworCWNhc2UgUENBUF9FUlJPUl9QRVJNX0RFTklFRDoKKwkJcmV0dXJuICgiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBjYXB0dXJlIG9uIHRoYXQgZGV2aWNlIik7CisKKwljYXNlIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQOgorCQlyZXR1cm4gKCJUaGF0IGRldmljZSBpcyBub3QgdXAiKTsKKworCWNhc2UgUENBUF9FUlJPUl9DQU5UU0VUX1RTVEFNUF9UWVBFOgorCQlyZXR1cm4gKCJUaGF0IGRldmljZSBkb2Vzbid0IHN1cHBvcnQgc2V0dGluZyB0aGUgdGltZSBzdGFtcCB0eXBlIik7CisKKwljYXNlIFBDQVBfRVJST1JfUFJPTUlTQ19QRVJNX0RFTklFRDoKKwkJcmV0dXJuICgiWW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBjYXB0dXJlIGluIHByb21pc2N1b3VzIG1vZGUgb24gdGhhdCBkZXZpY2UiKTsKKwl9CisJKHZvaWQpc25wcmludGYoZWJ1Ziwgc2l6ZW9mIGVidWYsICJVbmtub3duIGVycm9yOiAlZCIsIGVycm51bSk7CisJcmV0dXJuKGVidWYpOworfQorCisvKgorICogTm90IGFsbCBzeXN0ZW1zIGhhdmUgc3RyZXJyb3IoKS4KKyAqLworY29uc3QgY2hhciAqCitwY2FwX3N0cmVycm9yKGludCBlcnJudW0pCit7CisjaWZkZWYgSEFWRV9TVFJFUlJPUgorCXJldHVybiAoc3RyZXJyb3IoZXJybnVtKSk7CisjZWxzZQorCWV4dGVybiBpbnQgc3lzX25lcnI7CisJZXh0ZXJuIGNvbnN0IGNoYXIgKmNvbnN0IHN5c19lcnJsaXN0W107CisJc3RhdGljIGNoYXIgZWJ1ZlsxNSsxMCsxXTsKKworCWlmICgodW5zaWduZWQgaW50KWVycm51bSA8IHN5c19uZXJyKQorCQlyZXR1cm4gKChjaGFyICopc3lzX2Vycmxpc3RbZXJybnVtXSk7CisJKHZvaWQpc25wcmludGYoZWJ1Ziwgc2l6ZW9mIGVidWYsICJVbmtub3duIGVycm9yOiAlZCIsIGVycm51bSk7CisJcmV0dXJuKGVidWYpOworI2VuZGlmCit9CisKK2ludAorcGNhcF9zZXRmaWx0ZXIocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKQoreworCXJldHVybiAocC0+c2V0ZmlsdGVyX29wKHAsIGZwKSk7Cit9CisKKy8qCisgKiBTZXQgZGlyZWN0aW9uIGZsYWcsIHdoaWNoIGNvbnRyb2xzIHdoZXRoZXIgd2UgYWNjZXB0IG9ubHkgaW5jb21pbmcKKyAqIHBhY2tldHMsIG9ubHkgb3V0Z29pbmcgcGFja2V0cywgb3IgYm90aC4KKyAqIE5vdGUgdGhhdCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSwgc29tZSBvciBhbGwgZGlyZWN0aW9uIGFyZ3VtZW50cworICogbWlnaHQgbm90IGJlIHN1cHBvcnRlZC4KKyAqLworaW50CitwY2FwX3NldGRpcmVjdGlvbihwY2FwX3QgKnAsIHBjYXBfZGlyZWN0aW9uX3QgZCkKK3sKKwlpZiAocC0+c2V0ZGlyZWN0aW9uX29wID09IE5VTEwpIHsKKwkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgIlNldHRpbmcgZGlyZWN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIHBsYXRmb3JtIik7CisJCXJldHVybiAoLTEpOworCX0gZWxzZQorCQlyZXR1cm4gKHAtPnNldGRpcmVjdGlvbl9vcChwLCBkKSk7Cit9CisKK2ludAorcGNhcF9zdGF0cyhwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQoreworCXJldHVybiAocC0+c3RhdHNfb3AocCwgcHMpKTsKK30KKworc3RhdGljIGludAorcGNhcF9zdGF0c19kZWFkKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMgX1VfKQoreworCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlN0YXRpc3RpY3MgYXJlbid0IGF2YWlsYWJsZSBmcm9tIGEgcGNhcF9vcGVuX2RlYWQgcGNhcF90Iik7CisJcmV0dXJuICgtMSk7Cit9CisKKyNpZmRlZiBXSU4zMgoraW50CitwY2FwX3NldGJ1ZmYocGNhcF90ICpwLCBpbnQgZGltKQoreworCXJldHVybiAocC0+c2V0YnVmZl9vcChwLCBkaW0pKTsKK30KKworc3RhdGljIGludAorcGNhcF9zZXRidWZmX2RlYWQocGNhcF90ICpwLCBpbnQgZGltKQoreworCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlRoZSBrZXJuZWwgYnVmZmVyIHNpemUgY2Fubm90IGJlIHNldCBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoLTEpOworfQorCitpbnQKK3BjYXBfc2V0bW9kZShwY2FwX3QgKnAsIGludCBtb2RlKQoreworCXJldHVybiAocC0+c2V0bW9kZV9vcChwLCBtb2RlKSk7Cit9CisKK3N0YXRpYyBpbnQKK3BjYXBfc2V0bW9kZV9kZWFkKHBjYXBfdCAqcCwgaW50IG1vZGUpCit7CisJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiaW1wb3NzaWJsZSB0byBzZXQgbW9kZSBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoLTEpOworfQorCitpbnQKK3BjYXBfc2V0bWludG9jb3B5KHBjYXBfdCAqcCwgaW50IHNpemUpCit7CisJcmV0dXJuIChwLT5zZXRtaW50b2NvcHlfb3AocCwgc2l6ZSkpOworfQorCitzdGF0aWMgaW50CitwY2FwX3NldG1pbnRvY29weV9kZWFkKHBjYXBfdCAqcCwgaW50IHNpemUpCit7CisJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiVGhlIG1pbnRvY29weSBwYXJhbWV0ZXIgY2Fubm90IGJlIHNldCBvbiBhIHBjYXBfb3Blbl9kZWFkIHBjYXBfdCIpOworCXJldHVybiAoLTEpOworfQorI2VuZGlmCisKKy8qCisgKiBPbiBzb21lIHBsYXRmb3Jtcywgd2UgbmVlZCB0byBjbGVhbiB1cCBwcm9taXNjdW91cyBvciBtb25pdG9yIG1vZGUKKyAqIHdoZW4gd2UgY2xvc2UgYSBkZXZpY2UgLSBhbmQgd2Ugd2FudCB0aGF0IHRvIGhhcHBlbiBldmVuIGlmIHRoZQorICogYXBwbGljYXRpb24ganVzdCBleGl0cyB3aXRob3V0IGV4cGxpY2l0bCBjbG9zaW5nIGRldmljZXMuCisgKiBPbiB0aG9zZSBwbGF0Zm9ybXMsIHdlIG5lZWQgdG8gcmVnaXN0ZXIgYSAiY2xvc2UgYWxsIHRoZSBwY2FwcyIKKyAqIHJvdXRpbmUgdG8gYmUgY2FsbGVkIHdoZW4gd2UgZXhpdCwgYW5kIG5lZWQgdG8gbWFpbnRhaW4gYSBsaXN0IG9mCisgKiBwY2FwcyB0aGF0IG5lZWQgdG8gYmUgY2xvc2VkIHRvIGNsZWFuIHVwIG1vZGVzLgorICoKKyAqIFhYWCAtIG5vdCB0aHJlYWQtc2FmZS4KKyAqLworCisvKgorICogTGlzdCBvZiBwY2FwcyBvbiB3aGljaCB3ZSd2ZSBkb25lIHNvbWV0aGluZyB0aGF0IG5lZWRzIHRvIGJlCisgKiBjbGVhbmVkIHVwLgorICogSWYgdGhlcmUgYXJlIGFueSBzdWNoIHBjYXBzLCB3ZSBhcnJhbmdlIHRvIGNhbGwgInBjYXBfY2xvc2VfYWxsKCkiCisgKiB3aGVuIHdlIGV4aXQsIGFuZCBoYXZlIGl0IGNsb3NlIGFsbCBvZiB0aGVtLgorICovCitzdGF0aWMgc3RydWN0IHBjYXAgKnBjYXBzX3RvX2Nsb3NlOworCisvKgorICogVFJVRSBpZiB3ZSd2ZSBhbHJlYWR5IGNhbGxlZCAiYXRleGl0KCkiIHRvIGNhdXNlICJwY2FwX2Nsb3NlX2FsbCgpIiB0bworICogYmUgY2FsbGVkIG9uIGV4aXQuCisgKi8KK3N0YXRpYyBpbnQgZGlkX2F0ZXhpdDsKKworc3RhdGljIHZvaWQKK3BjYXBfY2xvc2VfYWxsKHZvaWQpCit7CisJc3RydWN0IHBjYXAgKmhhbmRsZTsKKworCXdoaWxlICgoaGFuZGxlID0gcGNhcHNfdG9fY2xvc2UpICE9IE5VTEwpCisJCXBjYXBfY2xvc2UoaGFuZGxlKTsKK30KKworaW50CitwY2FwX2RvX2FkZGV4aXQocGNhcF90ICpwKQoreworCS8qCisJICogSWYgd2UgaGF2ZW4ndCBhbHJlYWR5IGRvbmUgc28sIGFycmFuZ2UgdG8gaGF2ZQorCSAqICJwY2FwX2Nsb3NlX2FsbCgpIiBjYWxsZWQgd2hlbiB3ZSBleGl0LgorCSAqLworCWlmICghZGlkX2F0ZXhpdCkgeworCQlpZiAoYXRleGl0KHBjYXBfY2xvc2VfYWxsKSA9PSAtMSkgeworCQkJLyoKKwkJCSAqICJhdGV4aXQoKSIgZmFpbGVkOyBsZXQgb3VyIGNhbGxlciBrbm93LgorCQkJICovCisJCQlzdHJuY3B5KHAtPmVycmJ1ZiwgImF0ZXhpdCBmYWlsZWQiLAorCQkJICAgIFBDQVBfRVJSQlVGX1NJWkUpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlkaWRfYXRleGl0ID0gMTsKKwl9CisJcmV0dXJuICgxKTsKK30KKwordm9pZAorcGNhcF9hZGRfdG9fcGNhcHNfdG9fY2xvc2UocGNhcF90ICpwKQoreworCXAtPm1kLm5leHQgPSBwY2Fwc190b19jbG9zZTsKKwlwY2Fwc190b19jbG9zZSA9IHA7Cit9CisKK3ZvaWQKK3BjYXBfcmVtb3ZlX2Zyb21fcGNhcHNfdG9fY2xvc2UocGNhcF90ICpwKQoreworCXBjYXBfdCAqcGMsICpwcmV2cGM7CisKKwlmb3IgKHBjID0gcGNhcHNfdG9fY2xvc2UsIHByZXZwYyA9IE5VTEw7IHBjICE9IE5VTEw7CisJICAgIHByZXZwYyA9IHBjLCBwYyA9IHBjLT5tZC5uZXh0KSB7CisJCWlmIChwYyA9PSBwKSB7CisJCQkvKgorCQkJICogRm91bmQgaXQuICBSZW1vdmUgaXQgZnJvbSB0aGUgbGlzdC4KKwkJCSAqLworCQkJaWYgKHByZXZwYyA9PSBOVUxMKSB7CisJCQkJLyoKKwkJCQkgKiBJdCB3YXMgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJCQkJICovCisJCQkJcGNhcHNfdG9fY2xvc2UgPSBwYy0+bWQubmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBJdCB3YXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdC4KKwkJCQkgKi8KKwkJCQlwcmV2cGMtPm1kLm5leHQgPSBwYy0+bWQubmV4dDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkCitwY2FwX2NsZWFudXBfbGl2ZV9jb21tb24ocGNhcF90ICpwKQoreworCWlmIChwLT5idWZmZXIgIT0gTlVMTCkgeworCQlmcmVlKHAtPmJ1ZmZlcik7CisJCXAtPmJ1ZmZlciA9IE5VTEw7CisJfQorCWlmIChwLT5kbHRfbGlzdCAhPSBOVUxMKSB7CisJCWZyZWUocC0+ZGx0X2xpc3QpOworCQlwLT5kbHRfbGlzdCA9IE5VTEw7CisJCXAtPmRsdF9jb3VudCA9IDA7CisJfQorCWlmIChwLT50c3RhbXBfdHlwZV9saXN0ICE9IE5VTEwpIHsKKwkJZnJlZShwLT50c3RhbXBfdHlwZV9saXN0KTsKKwkJcC0+dHN0YW1wX3R5cGVfbGlzdCA9IE5VTEw7CisJCXAtPnRzdGFtcF90eXBlX2NvdW50ID0gMDsKKwl9CisJcGNhcF9mcmVlY29kZSgmcC0+ZmNvZGUpOworI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKKwlpZiAocC0+ZmQgPj0gMCkgeworCQljbG9zZShwLT5mZCk7CisJCXAtPmZkID0gLTE7CisJfQorCXAtPnNlbGVjdGFibGVfZmQgPSAtMTsKKwlwLT5zZW5kX2ZkID0gLTE7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK3BjYXBfY2xlYW51cF9kZWFkKHBjYXBfdCAqcCBfVV8pCit7CisJLyogTm90aGluZyB0byBkby4gKi8KK30KKworcGNhcF90ICoKK3BjYXBfb3Blbl9kZWFkKGludCBsaW5rdHlwZSwgaW50IHNuYXBsZW4pCit7CisJcGNhcF90ICpwOworCisJcCA9IG1hbGxvYyhzaXplb2YoKnApKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQgKHAsIDAsIHNpemVvZigqcCkpOworCXAtPnNuYXBzaG90ID0gc25hcGxlbjsKKwlwLT5saW5rdHlwZSA9IGxpbmt0eXBlOworCXAtPnN0YXRzX29wID0gcGNhcF9zdGF0c19kZWFkOworI2lmZGVmIFdJTjMyCisJcC0+c2V0YnVmZl9vcCA9IHBjYXBfc2V0YnVmZl9kZWFkOworCXAtPnNldG1vZGVfb3AgPSBwY2FwX3NldG1vZGVfZGVhZDsKKwlwLT5zZXRtaW50b2NvcHlfb3AgPSBwY2FwX3NldG1pbnRvY29weV9kZWFkOworI2VuZGlmCisJcC0+Y2xlYW51cF9vcCA9IHBjYXBfY2xlYW51cF9kZWFkOworCXAtPmFjdGl2YXRlZCA9IDE7CisJcmV0dXJuIChwKTsKK30KKworLyoKKyAqIEFQSSBjb21wYXRpYmxlIHdpdGggV2luUGNhcCdzICJzZW5kIGEgcGFja2V0IiByb3V0aW5lIC0gcmV0dXJucyAtMQorICogb24gZXJyb3IsIDAgb3RoZXJ3aXNlLgorICoKKyAqIFhYWCAtIHdoYXQgaWYgd2UgZ2V0IGEgc2hvcnQgd3JpdGU/CisgKi8KK2ludAorcGNhcF9zZW5kcGFja2V0KHBjYXBfdCAqcCwgY29uc3QgdV9jaGFyICpidWYsIGludCBzaXplKQoreworCWlmIChwLT5pbmplY3Rfb3AocCwgYnVmLCBzaXplKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEFQSSBjb21wYXRpYmxlIHdpdGggT3BlbkJTRCdzICJzZW5kIGEgcGFja2V0IiByb3V0aW5lIC0gcmV0dXJucyAtMSBvbgorICogZXJyb3IsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG90aGVyd2lzZS4KKyAqLworaW50CitwY2FwX2luamVjdChwY2FwX3QgKnAsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIChwLT5pbmplY3Rfb3AocCwgYnVmLCBzaXplKSk7Cit9CisKK3ZvaWQKK3BjYXBfY2xvc2UocGNhcF90ICpwKQoreworCWlmIChwLT5vcHQuc291cmNlICE9IE5VTEwpCisJCWZyZWUocC0+b3B0LnNvdXJjZSk7CisJcC0+Y2xlYW51cF9vcChwKTsKKwlmcmVlKHApOworfQorCisvKgorICogR2l2ZW4gYSBCUEYgcHJvZ3JhbSwgYSBwY2FwX3BrdGhkciBzdHJ1Y3R1cmUgZm9yIGEgcGFja2V0LCBhbmQgdGhlIHJhdworICogZGF0YSBmb3IgdGhlIHBhY2tldCwgY2hlY2sgd2hldGhlciB0aGUgcGFja2V0IHBhc3NlcyB0aGUgZmlsdGVyLgorICogUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmaWx0ZXIgcHJvZ3JhbSwgd2hpY2ggd2lsbCBiZSB6ZXJvIGlmCisgKiB0aGUgcGFja2V0IGRvZXNuJ3QgcGFzcyBhbmQgbm9uLXplcm8gaWYgdGhlIHBhY2tldCBkb2VzIHBhc3MuCisgKi8KK2ludAorcGNhcF9vZmZsaW5lX2ZpbHRlcihzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsCisgICAgY29uc3QgdV9jaGFyICpwa3QpCit7CisJc3RydWN0IGJwZl9pbnNuICpmY29kZSA9IGZwLT5iZl9pbnNuczsKKworCWlmIChmY29kZSAhPSBOVUxMKSAKKwkJcmV0dXJuIChicGZfZmlsdGVyKGZjb2RlLCBwa3QsIGgtPmxlbiwgaC0+Y2FwbGVuKSk7CisJZWxzZQorCQlyZXR1cm4gKDApOworfQorCisvKgorICogV2UgbWFrZSB0aGUgdmVyc2lvbiBzdHJpbmcgc3RhdGljLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdCwgcmF0aGVyCisgKiB0aGFuIGV4cG9ydGluZyB0aGUgdmVyc2lvbiBzdHJpbmcgZGlyZWN0bHkuICBPbiBhdCBsZWFzdCBzb21lIFVOSVhlcywKKyAqIGlmIHlvdSBpbXBvcnQgZGF0YSBmcm9tIGEgc2hhcmVkIGxpYnJhcnkgaW50byBhbiBwcm9ncmFtLCB0aGUgZGF0YSBpcworICogYm91bmQgaW50byB0aGUgcHJvZ3JhbSBiaW5hcnksIHNvIGlmIHRoZSBzdHJpbmcgaW4gdGhlIHZlcnNpb24gb2YgdGhlCisgKiBsaWJyYXJ5IHdpdGggd2hpY2ggdGhlIHByb2dyYW0gd2FzIGxpbmtlZCBpc24ndCB0aGUgc2FtZSBhcyB0aGUKKyAqIHN0cmluZyBpbiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSB3aXRoIHdoaWNoIHRoZSBwcm9ncmFtIGlzIGJlaW5nCisgKiBydW4sIHZhcmlvdXMgdW5kZXNpcmFibGUgdGhpbmdzIG1heSBoYXBwZW4gKHdhcm5pbmdzLCB0aGUgc3RyaW5nCisgKiBiZWluZyB0aGUgb25lIGZyb20gdGhlIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgd2l0aCB3aGljaCB0aGUgcHJvZ3JhbQorICogd2FzIGxpbmtlZCwgb3IgZXZlbiB3ZWlyZGVyIHRoaW5ncywgc3VjaCBhcyB0aGUgc3RyaW5nIGJlaW5nIHRoZSBvbmUKKyAqIGZyb20gdGhlIGxpYnJhcnkgYnV0IGJlaW5nIHRydW5jYXRlZCkuCisgKi8KKyNpZmRlZiBIQVZFX1ZFUlNJT05fSAorI2luY2x1ZGUgInZlcnNpb24uaCIKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciBwY2FwX3ZlcnNpb25fc3RyaW5nW10gPSAibGlicGNhcCB2ZXJzaW9uIDEueC55IjsKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKy8qCisgKiBYWFggLSBpdCdkIGJlIG5pY2UgaWYgd2UgY291bGQgc29tZWhvdyBnZW5lcmF0ZSB0aGUgV2luUGNhcCBhbmQgbGlicGNhcAorICogdmVyc2lvbiBudW1iZXJzIHdoZW4gYnVpbGRpbmcgV2luUGNhcC4gIChJdCdkIGJlIG5pY2UgdG8gZG8gc28gZm9yCisgKiB0aGUgcGFja2V0LmRsbCB2ZXJzaW9uIG51bWJlciBhcyB3ZWxsLikKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgd3BjYXBfdmVyc2lvbl9zdHJpbmdbXSA9ICI0LjAiOworc3RhdGljIGNvbnN0IGNoYXIgcGNhcF92ZXJzaW9uX3N0cmluZ19mbXRbXSA9CisgICAgIldpblBjYXAgdmVyc2lvbiAlcywgYmFzZWQgb24gJXMiOworc3RhdGljIGNvbnN0IGNoYXIgcGNhcF92ZXJzaW9uX3N0cmluZ19wYWNrZXRfZGxsX2ZtdFtdID0KKyAgICAiV2luUGNhcCB2ZXJzaW9uICVzIChwYWNrZXQuZGxsIHZlcnNpb24gJXMpLCBiYXNlZCBvbiAlcyI7CitzdGF0aWMgY2hhciAqZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nOworCitjb25zdCBjaGFyICoKK3BjYXBfbGliX3ZlcnNpb24odm9pZCkKK3sKKwljaGFyICpwYWNrZXRfdmVyc2lvbl9zdHJpbmc7CisJc2l6ZV90IGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZ19sZW47CisKKwlpZiAoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nID09IE5VTEwpIHsKKwkJLyoKKwkJICogR2VuZXJhdGUgdGhlIHZlcnNpb24gc3RyaW5nLgorCQkgKi8KKwkJcGFja2V0X3ZlcnNpb25fc3RyaW5nID0gUGFja2V0R2V0VmVyc2lvbigpOworCQlpZiAoc3RyY21wKHdwY2FwX3ZlcnNpb25fc3RyaW5nLCBwYWNrZXRfdmVyc2lvbl9zdHJpbmcpID09IDApIHsKKwkJCS8qCisJCQkgKiBXaW5QY2FwIHZlcnNpb24gc3RyaW5nIGFuZCBwYWNrZXQuZGxsIHZlcnNpb24KKwkJCSAqIHN0cmluZyBhcmUgdGhlIHNhbWU7IGp1c3QgcmVwb3J0IHRoZSBXaW5QY2FwCisJCQkgKiB2ZXJzaW9uLgorCQkJICovCisJCQlmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuID0KKwkJCSAgICAoc2l6ZW9mIHBjYXBfdmVyc2lvbl9zdHJpbmdfZm10IC0gNCkgKworCQkJICAgIHN0cmxlbih3cGNhcF92ZXJzaW9uX3N0cmluZykgKworCQkJICAgIHN0cmxlbihwY2FwX3ZlcnNpb25fc3RyaW5nKTsKKwkJCWZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZyA9CisJCQkgICAgbWFsbG9jKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZ19sZW4pOworCQkJc3ByaW50ZihmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcsCisJCQkgICAgcGNhcF92ZXJzaW9uX3N0cmluZ19mbXQsIHdwY2FwX3ZlcnNpb25fc3RyaW5nLAorCQkJICAgIHBjYXBfdmVyc2lvbl9zdHJpbmcpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdpblBjYXAgdmVyc2lvbiBzdHJpbmcgYW5kIHBhY2tldC5kbGwgdmVyc2lvbgorCQkJICogc3RyaW5nIGFyZSBkaWZmZXJlbnQ7IHRoYXQgc2hvdWxkbid0IGJlIHRoZQorCQkJICogY2FzZSAodGhlIHR3byBsaWJyYXJpZXMgc2hvdWxkIGNvbWUgZnJvbSB0aGUKKwkJCSAqIHNhbWUgdmVyc2lvbiBvZiBXaW5QY2FwKSwgc28gd2UgcmVwb3J0IGJvdGgKKwkJCSAqIHZlcnNpb25zLgorCQkJICovCisJCQlmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuID0KKwkJCSAgICAoc2l6ZW9mIHBjYXBfdmVyc2lvbl9zdHJpbmdfcGFja2V0X2RsbF9mbXQgLSA2KSArCisJCQkgICAgc3RybGVuKHdwY2FwX3ZlcnNpb25fc3RyaW5nKSArCisJCQkgICAgc3RybGVuKHBhY2tldF92ZXJzaW9uX3N0cmluZykgKworCQkJICAgIHN0cmxlbihwY2FwX3ZlcnNpb25fc3RyaW5nKTsKKwkJCWZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZyA9IG1hbGxvYyhmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuKTsKKworCQkJc3ByaW50ZihmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcsCisJCQkgICAgcGNhcF92ZXJzaW9uX3N0cmluZ19wYWNrZXRfZGxsX2ZtdCwKKwkJCSAgICB3cGNhcF92ZXJzaW9uX3N0cmluZywgcGFja2V0X3ZlcnNpb25fc3RyaW5nLAorCQkJICAgIHBjYXBfdmVyc2lvbl9zdHJpbmcpOworCQl9CisJfQorCXJldHVybiAoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nKTsKK30KKworI2VsaWYgZGVmaW5lZChNU0RPUykKKworc3RhdGljIGNoYXIgKmZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZzsKKworY29uc3QgY2hhciAqCitwY2FwX2xpYl92ZXJzaW9uICh2b2lkKQoreworCWNoYXIgKnBhY2tldF92ZXJzaW9uX3N0cmluZzsKKwlzaXplX3QgZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nX2xlbjsKKwlzdGF0aWMgY2hhciBkb3NwZnhbXSA9ICJET1MtIjsKKworCWlmIChmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcgPT0gTlVMTCkgeworCQkvKgorCQkgKiBHZW5lcmF0ZSB0aGUgdmVyc2lvbiBzdHJpbmcuCisJCSAqLworCQlmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmdfbGVuID0KKwkJICAgIHNpemVvZiBkb3NwZnggKyBzdHJsZW4ocGNhcF92ZXJzaW9uX3N0cmluZyk7CisJCWZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZyA9CisJCSAgICBtYWxsb2MoZnVsbF9wY2FwX3ZlcnNpb25fc3RyaW5nX2xlbik7CisJCXN0cmNweShmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcsIGRvc3BmeCk7CisJCXN0cmNhdChmdWxsX3BjYXBfdmVyc2lvbl9zdHJpbmcsIHBjYXBfdmVyc2lvbl9zdHJpbmcpOworCX0KKwlyZXR1cm4gKGZ1bGxfcGNhcF92ZXJzaW9uX3N0cmluZyk7Cit9CisKKyNlbHNlIC8qIFVOKlggKi8KKworY29uc3QgY2hhciAqCitwY2FwX2xpYl92ZXJzaW9uKHZvaWQpCit7CisJcmV0dXJuIChwY2FwX3ZlcnNpb25fc3RyaW5nKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwLmggYi9saWJwY2FwLTEuMy4wL3BjYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBhNGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqCVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIENvbXB1dGVyIFN5c3RlbXMKKyAqCUVuZ2luZWVyaW5nIEdyb3VwIGF0IExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciBvZiB0aGUgTGFib3JhdG9yeSBtYXkgYmUgdXNlZAorICogICAgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKKyAqICAgIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC5oLHYgMS41OSAyMDA2LTEwLTA0IDE4OjA5OjIyIGd1eSBFeHAgJCAoTEJMKQorICovCisKKy8qCisgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgKgorICogTm90ZSB0byBPUyB2ZW5kb3JzOiBkbyBOT1QgZ2V0IHJpZCBvZiB0aGlzIGZpbGUhICBNYW55IGFwcGxpY2F0aW9ucworICogZXhwZWN0IHRvIGJlIGFibGUgdG8gaW5jbHVkZSA8cGNhcC5oPiwgYW5kIGF0IGxlYXN0IHNvbWUgb2YgdGhlbQorICogZ28gdGhyb3VnaCBjb250b3J0aW9ucyBpbiB0aGVpciBjb25maWd1cmUgc2NyaXB0cyB0byB0cnkgdG8gZGV0ZWN0CisgKiBPU2VzIHRoYXQgaGF2ZSAiaGVscGZ1bGx5IiBtb3ZlZCBwY2FwLmggdG8gPHBjYXAvcGNhcC5oPiB3aXRob3V0CisgKiBsZWF2aW5nIGJlaGluZCBhIDxwY2FwLmg+IGZpbGUuCisgKi8KKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC9ibHVldG9vdGguaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC9ibHVldG9vdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNiZWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwL2JsdWV0b290aC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgUGFvbG8gQWJlbmkgKEl0YWx5KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gCisgKiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogYmx1ZXRvb3RoIGRhdGEgc3RydWN0CisgKiBCeSBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+CisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwL2JsdWV0b290aC5oLHYgMS4xIDIwMDctMDktMjIgMDI6MTA6MTcgZ3V5IEV4cCAkCisgKi8KKyAKKyNpZm5kZWYgX1BDQVBfQkxVRVRPT1RIX1NUUlVDVFNfSF9fCisjZGVmaW5lIF9QQ0FQX0JMVUVUT09USF9TVFJVQ1RTX0hfXworCisvKgorICogSGVhZGVyIHByZXBlbmRlZCBsaWJwY2FwIHRvIGVhY2ggYmx1ZXRvb3RoIGg6NCBmcmFtZS4KKyAqIGZpZWxkcyBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IF9wY2FwX2JsdWV0b290aF9oNF9oZWFkZXIgeworCXVfaW50MzJfdCBkaXJlY3Rpb247IC8qIGlmIGZpcnN0IGJpdCBpcyBzZXQgZGlyZWN0aW9uIGlzIGluY29taW5nICovCit9IHBjYXBfYmx1ZXRvb3RoX2g0X2hlYWRlcjsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC9icGYuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC9icGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmNkZTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwL2JwZi5oCkBAIC0wLDAgKzEsMTI4OSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIFN0YW5mb3JkL0NNVSBlbmV0IHBhY2tldCBmaWx0ZXIsCisgKiAobmV0L2VuZXQuYykgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiA0LjNCU0QsIGFuZCBjb2RlIGNvbnRyaWJ1dGVkCisgKiB0byBCZXJrZWxleSBieSBTdGV2ZW4gTWNDYW5uZSBhbmQgVmFuIEphY29ic29uIGJvdGggb2YgTGF3cmVuY2UgCisgKiBCZXJrZWxleSBMYWJvcmF0b3J5LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICAgICAgQCgjKWJwZi5oICAgICAgIDcuMSAoQmVya2VsZXkpIDUvNy85MQorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC9icGYuaCx2IDEuMzIgMjAwOC0xMi0yMyAyMDoxMzoyOSBndXkgRXhwICQgKExCTCkKKyAqLworCisvKgorICogVGhpcyBpcyBsaWJwY2FwJ3MgY3V0LWRvd24gdmVyc2lvbiBvZiBicGYuaDsgaXQgaW5jbHVkZXMgb25seQorICogdGhlIHN0dWZmIG5lZWRlZCBmb3IgdGhlIGNvZGUgZ2VuZXJhdG9yIGFuZCB0aGUgdXNlcmxhbmQgQlBGCisgKiBpbnRlcnByZXRlciwgYW5kIHRoZSBsaWJwY2FwIEFQSXMgZm9yIHNldHRpbmcgZmlsdGVycywgZXRjLi4KKyAqCisgKiAicGNhcC1icGYuYyIgd2lsbCBpbmNsdWRlIHRoZSBuYXRpdmUgT1MgdmVyc2lvbiwgYXMgaXQgZGVhbHMgd2l0aAorICogdGhlIE9TJ3MgQlBGIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEF0IGxlYXN0IHR3byBwcm9ncmFtcyBmb3VuZCBieSBHb29nbGUgQ29kZSBTZWFyY2ggZXhwbGljaXRseSBpbmNsdWRlcworICogPHBjYXAvYnBmLmg+IChldmVuIHRob3VnaCA8cGNhcC5oPi88cGNhcC9wY2FwLmg+IGluY2x1ZGVzIGl0IGZvciB5b3UpLAorICogc28gbW92aW5nIHRoYXQgc3R1ZmYgdG8gPHBjYXAvcGNhcC5oPiB3b3VsZCBicmVhayB0aGUgYnVpbGQgZm9yIHNvbWUKKyAqIHByb2dyYW1zLgorICovCisKKy8qCisgKiBJZiB3ZSd2ZSBhbHJlYWR5IGluY2x1ZGVkIDxuZXQvYnBmLmg+LCBkb24ndCByZS1kZWZpbmUgdGhpcyBzdHVmZi4KKyAqIFdlIGFzc3VtZSBCU0Qtc3R5bGUgbXVsdGlwbGUtaW5jbHVkZSBwcm90ZWN0aW9uIGluIDxuZXQvYnBmLmg+LAorICogd2hpY2ggaXMgdHJ1ZSBvZiBhbGwgYnV0IHRoZSBvbGRlc3QgdmVyc2lvbnMgb2YgRnJlZUJTRCBhbmQgTmV0QlNELAorICogb3IgVHJ1NjQgVU5JWC1zdHlsZSBtdWx0aXBsZS1pbmNsdWRlIHByb3RlY3Rpb24gKG9yLCBhdCBsZWFzdCwKKyAqIFRydTY0IFVOSVggNS54LXN0eWxlOyBJIGRvbid0IGhhdmUgZWFybGllciB2ZXJzaW9ucyBhdmFpbGFibGUgdG8gY2hlY2spLAorICogb3IgQUlYLXN0eWxlIG11bHRpcGxlLWluY2x1ZGUgcHJvdGVjdGlvbiAob3IsIGF0IGxlYXN0LCBBSVggNS54LXN0eWxlOworICogSSBkb24ndCBoYXZlIGVhcmxpZXIgdmVyc2lvbnMgYXZhaWxhYmxlIHRvIGNoZWNrKS4KKyAqCisgKiBXZSBkbyBub3QgY2hlY2sgZm9yIEJQRl9NQUpPUl9WRVJTSU9OLCBhcyB0aGF0J3MgZGVmaW5lZCBieQorICogPGxpbnV4L2ZpbHRlci5oPiwgd2hpY2ggaXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmNsdWRlZCBpbiBzb21lCisgKiBwcm9ncmFtcyB0aGF0IGFsc28gaW5jbHVkZSBwY2FwLmgsIGFuZCA8bGludXgvZmlsdGVyLmg+IGRvZXNuJ3QKKyAqIGRlZmluZSBzdHVmZiB3ZSBuZWVkLgorICoKKyAqIFRoaXMgYWxzbyBwcm92aWRlcyBvdXIgb3duIG11bHRpcGxlLWluY2x1ZGUgcHJvdGVjdGlvbi4KKyAqLworI2lmICFkZWZpbmVkKF9ORVRfQlBGX0hfKSAmJiAhZGVmaW5lZChfQlBGX0hfKSAmJiAhZGVmaW5lZChfSF9CUEYpICYmICFkZWZpbmVkKGxpYl9wY2FwX2JwZl9oKQorI2RlZmluZSBsaWJfcGNhcF9icGZfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEJTRCBzdHlsZSByZWxlYXNlIGRhdGUgKi8KKyNkZWZpbmUgQlBGX1JFTEVBU0UgMTk5NjA2CisKKyNpZmRlZiBNU0RPUyAvKiBtdXN0IGJlIDMyLWJpdCAqLwordHlwZWRlZiBsb25nICAgICAgICAgIGJwZl9pbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBicGZfdV9pbnQzMjsKKyNlbHNlCit0eXBlZGVmCWludCBicGZfaW50MzI7Cit0eXBlZGVmCXVfaW50IGJwZl91X2ludDMyOworI2VuZGlmCisKKy8qCisgKiBBbGlnbm1lbnQgbWFjcm9zLiAgQlBGX1dPUkRBTElHTiByb3VuZHMgdXAgdG8gdGhlIG5leHQgCisgKiBldmVuIG11bHRpcGxlIG9mIEJQRl9BTElHTk1FTlQuCisgKgorICogVGNwZHVtcCdzIHByaW50LXBmbG9nLmMgdXNlcyB0aGlzLCBzbyB3ZSBkZWZpbmUgaXQgaGVyZS4KKyAqLworI2lmbmRlZiBfX05ldEJTRF9fCisjZGVmaW5lIEJQRl9BTElHTk1FTlQgc2l6ZW9mKGJwZl9pbnQzMikKKyNlbHNlCisjZGVmaW5lIEJQRl9BTElHTk1FTlQgc2l6ZW9mKGxvbmcpCisjZW5kaWYKKyNkZWZpbmUgQlBGX1dPUkRBTElHTih4KSAoKCh4KSsoQlBGX0FMSUdOTUVOVC0xKSkmfihCUEZfQUxJR05NRU5ULTEpKQorCisvKgorICogU3RydWN0dXJlIGZvciAicGNhcF9jb21waWxlKCkiLCAicGNhcF9zZXRmaWx0ZXIoKSIsIGV0Yy4uCisgKi8KK3N0cnVjdCBicGZfcHJvZ3JhbSB7CisJdV9pbnQgYmZfbGVuOworCXN0cnVjdCBicGZfaW5zbiAqYmZfaW5zbnM7Cit9OworIAorLyoKKyAqIExpbmstbGF5ZXIgaGVhZGVyIHR5cGUgY29kZXMuCisgKgorICogRG8gKk5PVCogYWRkIG5ldyB2YWx1ZXMgdG8gdGhpcyBsaXN0IHdpdGhvdXQgYXNraW5nCisgKiAidGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIiBmb3IgYSB2YWx1ZS4gIE90aGVyd2lzZSwgeW91IHJ1bgorICogdGhlIHJpc2sgb2YgdXNpbmcgYSB2YWx1ZSB0aGF0J3MgYWxyZWFkeSBiZWluZyB1c2VkIGZvciBzb21lIG90aGVyCisgKiBwdXJwb3NlLCBhbmQgb2YgaGF2aW5nIHRvb2xzIHRoYXQgcmVhZCBsaWJwY2FwLWZvcm1hdCBjYXB0dXJlcyBub3QKKyAqIGJlaW5nIGFibGUgdG8gaGFuZGxlIGNhcHR1cmVzIHdpdGggeW91ciBuZXcgRExUXyB2YWx1ZSwgd2l0aCBubyBob3BlCisgKiB0aGF0IHRoZXkgd2lsbCBldmVyIGJlIGNoYW5nZWQgdG8gZG8gc28gKGFzIHRoYXQgd291bGQgZGVzdHJveSB0aGVpcgorICogYWJpbGl0eSB0byByZWFkIGNhcHR1cmVzIHVzaW5nIHRoYXQgdmFsdWUgZm9yIHRoYXQgb3RoZXIgcHVycG9zZSkuCisgKgorICogU2VlCisgKgorICoJaHR0cDovL3d3dy50Y3BkdW1wLm9yZy9saW5rdHlwZXMuaHRtbAorICoKKyAqIGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbnMgb2Ygc29tZSBvZiB0aGVzZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlcy4KKyAqLworCisvKgorICogVGhlc2UgYXJlIHRoZSB0eXBlcyB0aGF0IGFyZSB0aGUgc2FtZSBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgdGhhdAorICogaGF2ZSBiZWVuIGRlZmluZWQgYnkgPG5ldC9icGYuaD4gZm9yIGFnZXMuCisgKi8KKyNkZWZpbmUgRExUX05VTEwJMAkvKiBCU0QgbG9vcGJhY2sgZW5jYXBzdWxhdGlvbiAqLworI2RlZmluZSBETFRfRU4xME1CCTEJLyogRXRoZXJuZXQgKDEwTWIpICovCisjZGVmaW5lIERMVF9FTjNNQgkyCS8qIEV4cGVyaW1lbnRhbCBFdGhlcm5ldCAoM01iKSAqLworI2RlZmluZSBETFRfQVgyNQkzCS8qIEFtYXRldXIgUmFkaW8gQVguMjUgKi8KKyNkZWZpbmUgRExUX1BST05FVAk0CS8qIFByb3Rlb24gUHJvTkVUIFRva2VuIFJpbmcgKi8KKyNkZWZpbmUgRExUX0NIQU9TCTUJLyogQ2hhb3MgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDIJNgkvKiA4MDIuNSBUb2tlbiBSaW5nICovCisjZGVmaW5lIERMVF9BUkNORVQJNwkvKiBBUkNORVQsIHdpdGggQlNELXN0eWxlIGhlYWRlciAqLworI2RlZmluZSBETFRfU0xJUAk4CS8qIFNlcmlhbCBMaW5lIElQICovCisjZGVmaW5lIERMVF9QUFAJCTkJLyogUG9pbnQtdG8tcG9pbnQgUHJvdG9jb2wgKi8KKyNkZWZpbmUgRExUX0ZEREkJMTAJLyogRkRESSAqLworCisvKgorICogVGhlc2UgYXJlIHR5cGVzIHRoYXQgYXJlIGRpZmZlcmVudCBvbiBzb21lIHBsYXRmb3JtcywgYW5kIHRoYXQKKyAqIGhhdmUgYmVlbiBkZWZpbmVkIGJ5IDxuZXQvYnBmLmg+IGZvciBhZ2VzLiAgV2UgdXNlICNpZmRlZnMgdG8KKyAqIGRldGVjdCB0aGUgQlNEcyB0aGF0IGRlZmluZSB0aGVtIGRpZmZlcmVudGx5IGZyb20gdGhlIHRyYWRpdGlvbmFsCisgKiBsaWJwY2FwIDxuZXQvYnBmLmg+CisgKgorICogWFhYIC0gRExUX0FUTV9SRkMxNDgzIGlzIDEzIGluIEJTRC9PUywgYW5kIERMVF9SQVcgaXMgMTQgaW4gQlNEL09TLAorICogYnV0IEkgZG9uJ3Qga25vdyB3aGF0IHRoZSByaWdodCAjZGVmaW5lIGlzIGZvciBCU0QvT1MuCisgKi8KKyNkZWZpbmUgRExUX0FUTV9SRkMxNDgzCTExCS8qIExMQy1lbmNhcHN1bGF0ZWQgQVRNICovCisKKyNpZmRlZiBfX09wZW5CU0RfXworI2RlZmluZSBETFRfUkFXCQkxNAkvKiByYXcgSVAgKi8KKyNlbHNlCisjZGVmaW5lIERMVF9SQVcJCTEyCS8qIHJhdyBJUCAqLworI2VuZGlmCisKKy8qCisgKiBHaXZlbiB0aGF0IHRoZSBvbmx5IE9TIHRoYXQgY3VycmVudGx5IGdlbmVyYXRlcyBCU0QvT1MgU0xJUCBvciBQUFAKKyAqIGlzLCB3ZWxsLCBCU0QvT1MsIGFyZ3VhYmx5IGV2ZXJ5Ym9keSBzaG91bGQgaGF2ZSBjaG9zZW4gaXRzIHZhbHVlcworICogZm9yIERMVF9TTElQX0JTRE9TIGFuZCBETFRfUFBQX0JTRE9TLCB3aGljaCBhcmUgMTUgYW5kIDE2LCBidXQgdGhleQorICogZGlkbid0LiAgU28gaXQgZ29lcy4KKyAqLworI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKKyNpZm5kZWYgRExUX1NMSVBfQlNET1MKKyNkZWZpbmUgRExUX1NMSVBfQlNET1MJMTMJLyogQlNEL09TIFNlcmlhbCBMaW5lIElQICovCisjZGVmaW5lIERMVF9QUFBfQlNET1MJMTQJLyogQlNEL09TIFBvaW50LXRvLXBvaW50IFByb3RvY29sICovCisjZW5kaWYKKyNlbHNlCisjZGVmaW5lIERMVF9TTElQX0JTRE9TCTE1CS8qIEJTRC9PUyBTZXJpYWwgTGluZSBJUCAqLworI2RlZmluZSBETFRfUFBQX0JTRE9TCTE2CS8qIEJTRC9PUyBQb2ludC10by1wb2ludCBQcm90b2NvbCAqLworI2VuZGlmCisKKy8qCisgKiAxNyB3YXMgdXNlZCBmb3IgRExUX1BGTE9HIGluIE9wZW5CU0Q7IGl0IG5vIGxvbmdlciBpcy4KKyAqCisgKiBJdCB3YXMgRExUX0xBTkU4MDIzIGluIFN1U0UgNi4zLCBzbyB3ZSBkZWZpbmVkIExJTktUWVBFX1BGTE9HCisgKiBhcyAxMTcgc28gdGhhdCBwZmxvZyBjYXB0dXJlcyB3b3VsZCB1c2UgYSBsaW5rLWxheWVyIGhlYWRlciB0eXBlCisgKiB2YWx1ZSB0aGF0IGRpZG4ndCBjb2xsaWRlIHdpdGggYW55IG90aGVyIHZhbHVlcy4gIE9uIGFsbAorICogcGxhdGZvcm1zIG90aGVyIHRoYW4gT3BlbkJTRCwgd2UgZGVmaW5lZCBETFRfUEZMT0cgYXMgMTE3LAorICogYW5kIHdlIG1hcHBlZCBiZXR3ZWVuIExJTktUWVBFX1BGTE9HIGFuZCBETFRfUEZMT0cuCisgKgorICogT3BlbkJTRCBldmVudHVhbGx5IHN3aXRjaGVkIHRvIHVzaW5nIDExNyBmb3IgRExUX1BGTE9HIGFzIHdlbGwuCisgKgorICogRG9uJ3QgdXNlIDE3IGZvciBhbnl0aGluZyBlbHNlLgorICovCisKKy8qCisgKiAxOCBpcyB1c2VkIGZvciBETFRfUEZTWU5DIGluIE9wZW5CU0QsIE5ldEJTRCwgRHJhZ29uRmx5IEJTRCBhbmQKKyAqIE1hYyBPUyBYOyBkb24ndCB1c2UgaXQgZm9yIGFueXRoaW5nIGVsc2UuICAoRnJlZUJTRCB1c2VzIDEyMSwKKyAqIHdoaWNoIGNvbGxpZGVzIHdpdGggRExUX0hIRExDLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IHVzZSAxOAorICogZm9yIGFueXRoaW5nIGFuZCBkb2Vzbid0IGFwcGVhciB0byBoYXZlIGV2ZXIgdXNlZCBpdCBmb3IgYW55dGhpbmcuKQorICoKKyAqIFdlIGRlZmluZSBpdCBhcyAxOCBvbiB0aG9zZSBwbGF0Zm9ybXM7IGl0IGlzLCB1bmZvcnR1bmF0ZWx5LCB1c2VkCisgKiBmb3IgRExUX0NJUCBpbiBTdXNlIDYuMywgc28gd2UgZG9uJ3QgZGVmaW5lIGl0IGFzIERMVF9QRlNZTkMKKyAqIGluIGdlbmVyYWwuICBBcyB0aGUgcGFja2V0IGZvcm1hdCBmb3IgaXQsIGxpa2UgdGhhdCBmb3IKKyAqIERMVF9QRkxPRywgaXMgbm90IG9ubHkgT1MtZGVwZW5kZW50IGJ1dCBPUy12ZXJzaW9uLWRlcGVuZGVudCwKKyAqIHdlIGRvbid0IHN1cHBvcnQgcHJpbnRpbmcgaXQgaW4gdGNwZHVtcCBleGNlcHQgb24gT1NlcyB0aGF0CisgKiBoYXZlIHRoZSByZWxldmFudCBoZWFkZXIgZmlsZXMsIHNvIGl0J3Mgbm90IHRoYXQgdXNlZnVsIG9uCisgKiBvdGhlciBwbGF0Zm9ybXMuCisgKi8KKyNpZiBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19EcmFnb25GbHlfXykgfHwgZGVmaW5lZChfX0FQUExFX18pCisjZGVmaW5lIERMVF9QRlNZTkMJMTgKKyNlbmRpZgorCisjZGVmaW5lIERMVF9BVE1fQ0xJUAkxOQkvKiBMaW51eCBDbGFzc2ljYWwtSVAgb3ZlciBBVE0gKi8KKworLyoKKyAqIEFwcGFyZW50bHkgUmVkYmFjayB1c2VzIHRoaXMgZm9yIGl0cyBTbWFydEVkZ2UgNDAwLzgwMC4gIEkgaG9wZQorICogbm9ib2R5IGVsc2UgZGVjaWRlZCB0byB1c2UgaXQsIHRvby4KKyAqLworI2RlZmluZSBETFRfUkVEQkFDS19TTUFSVEVER0UJMzIKKworLyoKKyAqIFRoZXNlIHZhbHVlcyBhcmUgZGVmaW5lZCBieSBOZXRCU0Q7IG90aGVyIHBsYXRmb3JtcyBzaG91bGQgcmVmcmFpbiBmcm9tCisgKiB1c2luZyB0aGVtIGZvciBvdGhlciBwdXJwb3Nlcywgc28gdGhhdCBOZXRCU0Qgc2F2ZWZpbGVzIHdpdGggbGluaworICogdHlwZXMgb2YgNTAgb3IgNTEgY2FuIGJlIHJlYWQgYXMgdGhpcyB0eXBlIG9uIGFsbCBwbGF0Zm9ybXMuCisgKi8KKyNkZWZpbmUgRExUX1BQUF9TRVJJQUwJNTAJLyogUFBQIG92ZXIgc2VyaWFsIHdpdGggSERMQyBlbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIERMVF9QUFBfRVRIRVIJNTEJLyogUFBQIG92ZXIgRXRoZXJuZXQgKi8KKworLyoKKyAqIFRoZSBBeGVudCBSYXB0b3IgZmlyZXdhbGwgLSBub3cgdGhlIFN5bWFudGVjIEVudGVycHJpc2UgRmlyZXdhbGwgLSB1c2VzCisgKiBhIGxpbmstbGF5ZXIgdHlwZSBvZiA5OSBmb3IgdGhlIHRjcGR1bXAgaXQgc3VwcGxpZXMuICBUaGUgbGluay1sYXllcgorICogaGVhZGVyIGhhcyA2IGJ5dGVzIG9mIHVua25vd24gZGF0YSwgc29tZXRoaW5nIHRoYXQgYXBwZWFycyB0byBiZSBhbgorICogRXRoZXJuZXQgdHlwZSwgYW5kIDM2IGJ5dGVzIHRoYXQgYXBwZWFyIHRvIGJlIDAgaW4gYXQgbGVhc3Qgb25lIGNhcHR1cmUKKyAqIEkndmUgc2Vlbi4KKyAqLworI2RlZmluZSBETFRfU1lNQU5URUNfRklSRVdBTEwJOTkKKworLyoKKyAqIFZhbHVlcyBiZXR3ZWVuIDEwMCBhbmQgMTAzIGFyZSB1c2VkIGluIGNhcHR1cmUgZmlsZSBoZWFkZXJzIGFzCisgKiBsaW5rLWxheWVyIGhlYWRlciB0eXBlIExJTktUWVBFXyB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBETFRfIHR5cGVzCisgKiB0aGF0IGRpZmZlciBiZXR3ZWVuIHBsYXRmb3JtczsgZG9uJ3QgdXNlIHRob3NlIHZhbHVlcyBmb3IgbmV3IERMVF8KKyAqIG5ldyB0eXBlcy4KKyAqLworCisvKgorICogVmFsdWVzIHN0YXJ0aW5nIHdpdGggMTA0IGFyZSB1c2VkIGZvciBuZXdseS1hc3NpZ25lZCBsaW5rLWxheWVyCisgKiBoZWFkZXIgdHlwZSB2YWx1ZXM7IGZvciB0aG9zZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlcywgdGhlIERMVF8KKyAqIHZhbHVlIHJldHVybmVkIGJ5IHBjYXBfZGF0YWxpbmsoKSBhbmQgcGFzc2VkIHRvIHBjYXBfb3Blbl9kZWFkKCksCisgKiBhbmQgdGhlIExJTktUWVBFXyB2YWx1ZSB0aGF0IGFwcGVhcnMgaW4gY2FwdHVyZSBmaWxlcywgYXJlIHRoZQorICogc2FtZS4KKyAqCisgKiBETFRfTUFUQ0hJTkdfTUlOIGlzIHRoZSBsb3dlc3Qgc3VjaCB2YWx1ZTsgRExUX01BVENISU5HX01BWCBpcworICogdGhlIGhpZ2hlc3Qgc3VjaCB2YWx1ZS4KKyAqLworI2RlZmluZSBETFRfTUFUQ0hJTkdfTUlOCTEwNAorCisvKgorICogVGhpcyB2YWx1ZSB3YXMgZGVmaW5lZCBieSBsaWJwY2FwIDAuNTsgcGxhdGZvcm1zIHRoYXQgaGF2ZSBkZWZpbmVkCisgKiBpdCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlIHNob3VsZCBkZWZpbmUgaXQgaGVyZSB3aXRoIHRoYXQgdmFsdWUgLQorICogYSBsaW5rIHR5cGUgb2YgMTA0IGluIGEgc2F2ZSBmaWxlIHdpbGwgYmUgbWFwcGVkIHRvIERMVF9DX0hETEMsCisgKiB3aGF0ZXZlciB2YWx1ZSB0aGF0IGhhcHBlbnMgdG8gYmUsIHNvIHByb2dyYW1zIHdpbGwgY29ycmVjdGx5CisgKiBoYW5kbGUgZmlsZXMgd2l0aCB0aGF0IGxpbmsgdHlwZSByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZgorICogRExUX0NfSERMQy4KKyAqCisgKiBUaGUgbmFtZSBETFRfQ19IRExDIHdhcyB1c2VkIGJ5IEJTRC9PUzsgd2UgdXNlIHRoYXQgbmFtZSBmb3Igc291cmNlCisgKiBjb21wYXRpYmlsaXR5IHdpdGggcHJvZ3JhbXMgd3JpdHRlbiBmb3IgQlNEL09TLgorICoKKyAqIGxpYnBjYXAgMC41IGRlZmluZWQgaXQgYXMgRExUX0NIRExDOyB3ZSBkZWZpbmUgRExUX0NIRExDIGFzIHdlbGwsCisgKiBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBwcm9ncmFtcyB3cml0dGVuIGZvciBsaWJwY2FwIDAuNS4KKyAqLworI2RlZmluZSBETFRfQ19IRExDCTEwNAkvKiBDaXNjbyBIRExDICovCisjZGVmaW5lIERMVF9DSERMQwlETFRfQ19IRExDCisKKyNkZWZpbmUgRExUX0lFRUU4MDJfMTEJMTA1CS8qIElFRUUgODAyLjExIHdpcmVsZXNzICovCisKKy8qCisgKiAxMDYgaXMgcmVzZXJ2ZWQgZm9yIExpbnV4IENsYXNzaWNhbCBJUCBvdmVyIEFUTTsgaXQncyBsaWtlIERMVF9SQVcsCisgKiBleGNlcHQgd2hlbiBpdCBpc24ndC4gIChJLmUuLCBzb21ldGltZXMgaXQncyBqdXN0IHJhdyBJUCwgYW5kCisgKiBzb21ldGltZXMgaXQgaXNuJ3QuKSAgV2UgY3VycmVudGx5IGhhbmRsZSBpdCBhcyBETFRfTElOVVhfU0xMLAorICogc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBsaW5rLWxheWVyIGhlYWRlci4pCisgKi8KKworLyoKKyAqIEZyYW1lIFJlbGF5OyBCU0QvT1MgaGFzIGEgRExUX0ZSIHdpdGggYSB2YWx1ZSBvZiAxMSwgYnV0IHRoYXQgY29sbGlkZXMKKyAqIHdpdGggb3RoZXIgdmFsdWVzLgorICogRExUX0ZSIGFuZCBETFRfRlJFTEFZIHBhY2tldHMgc3RhcnQgd2l0aCB0aGUgUS45MjIgRnJhbWUgUmVsYXkgaGVhZGVyCisgKiAoRExDSSwgZXRjLikuCisgKi8KKyNkZWZpbmUgRExUX0ZSRUxBWQkxMDcKKworLyoKKyAqIE9wZW5CU0QgRExUX0xPT1AsIGZvciBsb29wYmFjayBkZXZpY2VzOyBpdCdzIGxpa2UgRExUX05VTEwsIGV4Y2VwdAorICogdGhhdCB0aGUgQUZfIHR5cGUgaW4gdGhlIGxpbmstbGF5ZXIgaGVhZGVyIGlzIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqCisgKiBETFRfTE9PUCBpcyAxMiBpbiBPcGVuQlNELCBidXQgdGhhdCdzIERMVF9SQVcgaW4gb3RoZXIgT1Nlcywgc28KKyAqIHdlIGRvbid0IHVzZSAxMiBmb3IgaXQgaW4gT1NlcyBvdGhlciB0aGFuIE9wZW5CU0QuCisgKi8KKyNpZmRlZiBfX09wZW5CU0RfXworI2RlZmluZSBETFRfTE9PUAkxMgorI2Vsc2UKKyNkZWZpbmUgRExUX0xPT1AJMTA4CisjZW5kaWYKKworLyoKKyAqIEVuY2Fwc3VsYXRlZCBwYWNrZXRzIGZvciBJUHNlYzsgRExUX0VOQyBpcyAxMyBpbiBPcGVuQlNELCBidXQgdGhhdCdzCisgKiBETFRfU0xJUF9CU0RPUyBpbiBOZXRCU0QsIHNvIHdlIGRvbid0IHVzZSAxMyBmb3IgaXQgaW4gT1NlcyBvdGhlcgorICogdGhhbiBPcGVuQlNELgorICovCisjaWZkZWYgX19PcGVuQlNEX18KKyNkZWZpbmUgRExUX0VOQwkJMTMKKyNlbHNlCisjZGVmaW5lIERMVF9FTkMJCTEwOQorI2VuZGlmCisKKy8qCisgKiBWYWx1ZXMgYmV0d2VlbiAxMTAgYW5kIDExMiBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBpbiBjYXB0dXJlIGZpbGUgaGVhZGVycworICogYXMgbGluay1sYXllciB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIERMVF8gdHlwZXMgdGhhdCBtaWdodCBkaWZmZXIKKyAqIGJldHdlZW4gcGxhdGZvcm1zOyBkb24ndCB1c2UgdGhvc2UgdmFsdWVzIGZvciBuZXcgRExUXyB0eXBlcworICogb3RoZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBETFRfIHR5cGVzLgorICovCisKKy8qCisgKiBUaGlzIGlzIGZvciBMaW51eCBjb29rZWQgc29ja2V0cy4KKyAqLworI2RlZmluZSBETFRfTElOVVhfU0xMCTExMworCisvKgorICogQXBwbGUgTG9jYWxUYWxrIGhhcmR3YXJlLgorICovCisjZGVmaW5lIERMVF9MVEFMSwkxMTQKKworLyoKKyAqIEFjb3JuIEVjb25ldC4KKyAqLworI2RlZmluZSBETFRfRUNPTkVUCTExNQorCisvKgorICogUmVzZXJ2ZWQgZm9yIHVzZSB3aXRoIE9wZW5CU0QgaXBmaWx0ZXIuCisgKi8KKyNkZWZpbmUgRExUX0lQRklMVEVSCTExNgorCisvKgorICogT3BlbkJTRCBETFRfUEZMT0cuCisgKi8KKyNkZWZpbmUgRExUX1BGTE9HCTExNworCisvKgorICogUmVnaXN0ZXJlZCBmb3IgQ2lzY28taW50ZXJuYWwgdXNlLgorICovCisjZGVmaW5lIERMVF9DSVNDT19JT1MJMTE4CisKKy8qCisgKiBGb3IgODAyLjExIGNhcmRzIHVzaW5nIHRoZSBQcmlzbSBJSSBjaGlwcywgd2l0aCBhIGxpbmstbGF5ZXIKKyAqIGhlYWRlciBpbmNsdWRpbmcgUHJpc20gbW9uaXRvciBtb2RlIGluZm9ybWF0aW9uIHBsdXMgYW4gODAyLjExCisgKiBoZWFkZXIuCisgKi8KKyNkZWZpbmUgRExUX1BSSVNNX0hFQURFUgkxMTkKKworLyoKKyAqIFJlc2VydmVkIGZvciBBaXJvbmV0IDgwMi4xMSBjYXJkcywgd2l0aCBhbiBBaXJvbmV0IGxpbmstbGF5ZXIgaGVhZGVyCisgKiAoc2VlIERvdWcgQW1icmlza28ncyBGcmVlQlNEIHBhdGNoZXMpLgorICovCisjZGVmaW5lIERMVF9BSVJPTkVUX0hFQURFUgkxMjAKKworLyoKKyAqIFNpZ2guCisgKgorICogVGhpcyB3YXMgcmVzZXJ2ZWQgZm9yIFNpZW1lbnMgSGlQYXRoIEhETEMgb24gMjAwMi0wMS0yNSwgYXMKKyAqIHJlcXVlc3RlZCBieSBUb21hcyBLdWtvc2EuCisgKgorICogT24gMjAwNC0wMi0yNSwgYSBGcmVlQlNEIGNoZWNraW4gdG8gc3lzL25ldC9icGYuaCB3YXMgbWFkZSB0aGF0CisgKiBhc3NpZ25lZCAxMjEgYXMgRExUX1BGU1lOQy4gIEl0cyBsaWJwY2FwIGRvZXMgRExUXyA8LT4gTElOS1RZUEVfCisgKiBtYXBwaW5nLCBzbyBpdCBwcm9iYWJseSBzdXBwb3J0cyBjYXB0dXJpbmcgb24gdGhlIHBmc3luYyBkZXZpY2UKKyAqIGJ1dCBub3Qgc2F2aW5nIHRoZSBjYXB0dXJlZCBkYXRhIHRvIGEgcGNhcCBmaWxlLgorICoKKyAqIE9wZW5CU0QsIGZyb20gd2hpY2ggcGYgY2FtZSwgaG93ZXZlciwgdXNlcyAxOCBmb3IgRExUX1BGU1lOQzsKKyAqIHRoZWlyIGxpYnBjYXAgZG9lcyBubyBETFRfIDwtPiBMSU5LVFlQRV8gbWFwcGluZywgc28gaXQgd291bGQKKyAqIHVzZSAxOCBpbiBwY2FwIGZpbGVzIGFzIHdlbGwuCisgKgorICogTmV0QlNEIGFuZCBEcmFnb25GbHkgQlNEIGFsc28gdXNlIDE4IGZvciBETFRfUEZTWU5DOyB0aGVpcgorICogbGlicGNhcHMgZG8gRExUXyA8LT4gTElOS1RZUEVfIG1hcHBpbmcsIGFuZCBuZWl0aGVyIGhhcyBhbiBlbnRyeQorICogZm9yIERMVF9QRlNZTkMsIHNvIGl0IG1pZ2h0IG5vdCBiZSBhYmxlIHRvIHdyaXRlIG91dCBkdW1wIGZpbGVzCisgKiB3aXRoIDE4IGFzIHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlLiAgKEVhcmxpZXIgdmVyc2lvbnMgbWlnaHQKKyAqIG5vdCBoYXZlIGRvbmUgbWFwcGluZywgaW4gd2hpY2ggY2FzZSB0aGV5J2Qgd29yayB0aGUgc2FtZSB3YXkKKyAqIE9wZW5CU0QgZG9lcy4pCisgKgorICogTWFjIE9TIFggZGVmaW5lcyBpdCBhcyAxOCwgYnV0IGRvZXNuJ3QgYXBwZWFyIHRvIHVzZSBpdCBhcyBvZgorICogTWFjIE9TIFggMTAuNy4zLiAgSXRzIGxpYnBjYXAgZG9lcyBETFRfIDwtPiBMSU5LVFlQRV8gbWFwcGluZy4KKyAqCisgKiBXZSdsbCBkZWZpbmUgRExUX1BGU1lOQyBhcyAxMjEgb24gRnJlZUJTRCBhbmQgZGVmaW5lIGl0IGFzIDE4IG9uCisgKiBhbGwgb3RoZXIgcGxhdGZvcm1zLiAgV2UnbGwgZGVmaW5lIERMVF9ISERMQyBhcyAxMjEgb24gZXZlcnl0aGluZworICogZXhjZXB0IGZvciBGcmVlQlNEOyBhbnlib2R5IHdobyB3YW50cyB0byBjb21waWxlLCBvbiBGcmVlQlNELCBjb2RlCisgKiB0aGF0IHVzZXMgRExUX0hIRExDIGlzIG91dCBvZiBsdWNrLgorICoKKyAqIFdlJ2xsIGRlZmluZSBMSU5LVFlQRV9QRlNZTkMgYXMgMTgsICpldmVuIG9uIEZyZWVCU0QqLCBhbmQgbWFwCisgKiBpdCwgc28gdGhhdCBzYXZlZmlsZXMgd29uJ3QgdXNlIDEyMSBmb3IgUEZTWU5DIC0gdGhleSdsbCBhbGwKKyAqIHVzZSAxOC4gIENvZGUgdGhhdCB1c2VzIHBjYXBfZGF0YWxpbmsoKSB0byBkZXRlcm1pbmUgdGhlIGxpbmstbGF5ZXIKKyAqIGhlYWRlciB0eXBlIG9mIGEgc2F2ZWZpbGUgd29uJ3QsIHdoZW4gYnVpbHQgYW5kIHJ1biBvbiBGcmVlQlNELAorICogYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIExJTktUWVBFX1BGU1lOQyBhbmQgTElOS1RZUEVfSEhETEMKKyAqIGNhcHR1cmUgZmlsZXM7IGNvZGUgdGhhdCBkb2Vzbid0LCBzdWNoIGFzIHRoZSBjb2RlIGluIFdpcmVzaGFyaywKKyAqIHdpbGwgYmUgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZW0uCisgKi8KKyNpZmRlZiBfX0ZyZWVCU0RfXworI2RlZmluZSBETFRfUEZTWU5DCQkxMjEKKyNlbHNlCisjZGVmaW5lIERMVF9ISERMQwkJMTIxCisjZW5kaWYKKworLyoKKyAqIFRoaXMgaXMgZm9yIFJGQyAyNjI1IElQLW92ZXItRmlicmUgQ2hhbm5lbC4KKyAqCisgKiBUaGlzIGlzIG5vdCBmb3IgdXNlIHdpdGggcmF3IEZpYnJlIENoYW5uZWwsIHdoZXJlIHRoZSBsaW5rLWxheWVyCisgKiBoZWFkZXIgc3RhcnRzIHdpdGggYSBGaWJyZSBDaGFubmVsIGZyYW1lIGhlYWRlcjsgaXQncyBmb3IgSVAtb3Zlci1GQywKKyAqIHdoZXJlIHRoZSBsaW5rLWxheWVyIGhlYWRlciBzdGFydHMgd2l0aCBhbiBSRkMgMjYyNSBOZXR3b3JrX0hlYWRlcgorICogZmllbGQuCisgKi8KKyNkZWZpbmUgRExUX0lQX09WRVJfRkMJCTEyMgorCisvKgorICogVGhpcyBpcyBmb3IgRnVsbCBGcm9udGFsIEFUTSBvbiBTb2xhcmlzIHdpdGggU3VuQVRNLCB3aXRoIGEKKyAqIHBzZXVkby1oZWFkZXIgZm9sbG93ZWQgYnkgYW4gQUFMbiBQRFUuCisgKgorICogVGhlcmUgbWF5IGJlIG90aGVyIGZvcm1zIG9mIEZ1bGwgRnJvbnRhbCBBVE0gb24gb3RoZXIgT1NlcywKKyAqIHdpdGggZGlmZmVyZW50IHBzZXVkby1oZWFkZXJzLgorICoKKyAqIElmIEFUTSBzb2Z0d2FyZSByZXR1cm5zIGEgcHNldWRvLWhlYWRlciB3aXRoIFZQSS9WQ0kgaW5mb3JtYXRpb24KKyAqIChhbmQsIGlkZWFsbHksIHBhY2tldCB0eXBlIGluZm9ybWF0aW9uLCBlLmcuIHNpZ25hbGxpbmcsIElMTUksCisgKiBMQU5FLCBMTEMtbXVsdGlwbGV4ZWQgdHJhZmZpYywgZXRjLiksIGl0IHNob3VsZCBub3QgdXNlCisgKiBETFRfQVRNX1JGQzE0ODMsIGJ1dCBzaG91bGQgZ2V0IGEgbmV3IERMVF8gdmFsdWUsIHNvIHRjcGR1bXAKKyAqIGFuZCB0aGUgbGlrZSBkb24ndCBoYXZlIHRvIGluZmVyIHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIGEKKyAqIHBzZXVkby1oZWFkZXIgYW5kIHRoZSBmb3JtIG9mIHRoZSBwc2V1ZG8taGVhZGVyLgorICovCisjZGVmaW5lIERMVF9TVU5BVE0JCTEyMwkvKiBTb2xhcmlzK1N1bkFUTSAqLworCisvKiAKKyAqIFJlc2VydmVkIGFzIHBlciByZXF1ZXN0IGZyb20gS2VudCBEYWhsZ3JlbiA8a2VudEBwcmFlc3VtLmNvbT4KKyAqIGZvciBwcml2YXRlIHVzZS4KKyAqLworI2RlZmluZSBETFRfUklPICAgICAgICAgICAgICAgICAxMjQgICAgIC8qIFJhcGlkSU8gKi8KKyNkZWZpbmUgRExUX1BDSV9FWFAgICAgICAgICAgICAgMTI1ICAgICAvKiBQQ0kgRXhwcmVzcyAqLworI2RlZmluZSBETFRfQVVST1JBICAgICAgICAgICAgICAxMjYgICAgIC8qIFhpbGlueCBBdXJvcmEgbGluayBsYXllciAqLworCisvKgorICogSGVhZGVyIGZvciA4MDIuMTEgcGx1cyBhIG51bWJlciBvZiBiaXRzIG9mIGxpbmstbGF5ZXIgaW5mb3JtYXRpb24KKyAqIGluY2x1ZGluZyByYWRpbyBpbmZvcm1hdGlvbiwgdXNlZCBieSBzb21lIHJlY2VudCBCU0QgZHJpdmVycyBhcworICogd2VsbCBhcyB0aGUgbWFkd2lmaSBBdGhlcm9zIGRyaXZlciBmb3IgTGludXguCisgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDJfMTFfUkFESU8JMTI3CS8qIDgwMi4xMSBwbHVzIHJhZGlvdGFwIHJhZGlvIGhlYWRlciAqLworCisvKgorICogUmVzZXJ2ZWQgZm9yIHRoZSBUWlNQIGVuY2Fwc3VsYXRpb24sIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIENocmlzIFdhdGVycyA8Y2hyaXMud2F0ZXJzQG5ldHdvcmtjaGVtaXN0cnkuY29tPgorICogVFpTUCBpcyBhIGdlbmVyaWMgZW5jYXBzdWxhdGlvbiBmb3IgYW55IG90aGVyIGxpbmsgdHlwZSwKKyAqIHdoaWNoIGluY2x1ZGVzIGEgbWVhbnMgdG8gaW5jbHVkZSBtZXRhLWluZm9ybWF0aW9uCisgKiB3aXRoIHRoZSBwYWNrZXQsIGUuZy4gc2lnbmFsIHN0cmVuZ3RoIGFuZCBjaGFubmVsCisgKiBmb3IgODAyLjExIHBhY2tldHMuCisgKi8KKyNkZWZpbmUgRExUX1RaU1AgICAgICAgICAgICAgICAgMTI4ICAgICAvKiBUYXptZW4gU25pZmZlciBQcm90b2NvbCAqLworCisvKgorICogQlNEJ3MgQVJDTkVUIGhlYWRlcnMgaGF2ZSB0aGUgc291cmNlIGhvc3QsIGRlc3RpbmF0aW9uIGhvc3QsCisgKiBhbmQgdHlwZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQ7IHRoYXQncyB3aGF0J3MgaGFuZGVkCisgKiB1cCB0byB1c2VybGFuZCB2aWEgQlBGLgorICoKKyAqIExpbnV4J3MgQVJDTkVUIGhlYWRlcnMsIGhvd2V2ZXIsIGhhdmUgYSAyLWJ5dGUgb2Zmc2V0IGZpZWxkCisgKiBiZXR3ZWVuIHRoZSBob3N0IElEcyBhbmQgdGhlIHR5cGU7IHRoYXQncyB3aGF0J3MgaGFuZGVkIHVwCisgKiB0byB1c2VybGFuZCB2aWEgUEZfUEFDS0VUIHNvY2tldHMuCisgKgorICogV2UgdGhlcmVmb3JlIGhhdmUgdG8gaGF2ZSBzZXBhcmF0ZSBETFRfIHZhbHVlcyBmb3IgdGhlbS4KKyAqLworI2RlZmluZSBETFRfQVJDTkVUX0xJTlVYCTEyOQkvKiBBUkNORVQgKi8KKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZXMsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF9zIGFyZSB1c2VkCisgKiBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsIG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzCisgKiBRT1MgcHJvZmlsZXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfTUxQUFAgICAgICAgMTMwCisjZGVmaW5lIERMVF9KVU5JUEVSX01MRlIgICAgICAgIDEzMQorI2RlZmluZSBETFRfSlVOSVBFUl9FUyAgICAgICAgICAxMzIKKyNkZWZpbmUgRExUX0pVTklQRVJfR0dTTiAgICAgICAgMTMzCisjZGVmaW5lIERMVF9KVU5JUEVSX01GUiAgICAgICAgIDEzNAorI2RlZmluZSBETFRfSlVOSVBFUl9BVE0yICAgICAgICAxMzUKKyNkZWZpbmUgRExUX0pVTklQRVJfU0VSVklDRVMgICAgMTM2CisjZGVmaW5lIERMVF9KVU5JUEVSX0FUTTEgICAgICAgIDEzNworCisvKgorICogQXBwbGUgSVAtb3Zlci1JRUVFIDEzOTQsIGFzIHBlciBhIHJlcXVlc3QgZnJvbSBEaWV0ZXIgU2llZ211bmQKKyAqIDxkaWV0ZXJAYXBwbGUuY29tPi4gIFRoZSBoZWFkZXIgdGhhdCdzIHByZXNlbnRlZCBpcyBhbiBFdGhlcm5ldC1saWtlCisgKiBoZWFkZXI6CisgKgorICoJI2RlZmluZSBGSVJFV0lSRV9FVUk2NF9MRU4JOAorICoJc3RydWN0IGZpcmV3aXJlX2hlYWRlciB7CisgKgkJdV9jaGFyICBmaXJld2lyZV9kaG9zdFtGSVJFV0lSRV9FVUk2NF9MRU5dOworICoJCXVfY2hhciAgZmlyZXdpcmVfc2hvc3RbRklSRVdJUkVfRVVJNjRfTEVOXTsKKyAqCQl1X3Nob3J0IGZpcmV3aXJlX3R5cGU7CisgKgl9OworICoKKyAqIHdpdGggImZpcmV3aXJlX3R5cGUiIGJlaW5nIGFuIEV0aGVybmV0IHR5cGUgdmFsdWUsIHJhdGhlciB0aGFuLAorICogZm9yIGV4YW1wbGUsIHJhdyBHQVNQIGZyYW1lcyBiZWluZyBoYW5kZWQgdXAuCisgKi8KKyNkZWZpbmUgRExUX0FQUExFX0lQX09WRVJfSUVFRTEzOTQJMTM4CisKKy8qCisgKiBWYXJpb3VzIFNTNyBlbmNhcHN1bGF0aW9ucywgYXMgcGVyIGEgcmVxdWVzdCBmcm9tIEplZmYgTW9ycmlzcworICogPGplZmYubW9ycmlzc1tBVF11bHRpY29tLmNvbT4gYW5kIHN1YnNlcXVlbnQgZGlzY3Vzc2lvbnMuCisgKi8KKyNkZWZpbmUgRExUX01UUDJfV0lUSF9QSERSCTEzOQkvKiBwc2V1ZG8taGVhZGVyIHdpdGggdmFyaW91cyBpbmZvLCBmb2xsb3dlZCBieSBNVFAyICovCisjZGVmaW5lIERMVF9NVFAyCQkxNDAJLyogTVRQMiwgd2l0aG91dCBwc2V1ZG8taGVhZGVyICovCisjZGVmaW5lIERMVF9NVFAzCQkxNDEJLyogTVRQMywgd2l0aG91dCBwc2V1ZG8taGVhZGVyIG9yIE1UUDIgKi8KKyNkZWZpbmUgRExUX1NDQ1AJCTE0MgkvKiBTQ0NQLCB3aXRob3V0IHBzZXVkby1oZWFkZXIgb3IgTVRQMiBvciBNVFAzICovCisKKy8qCisgKiBET0NTSVMgTUFDIGZyYW1lcy4KKyAqLworI2RlZmluZSBETFRfRE9DU0lTCQkxNDMKKworLyoKKyAqIExpbnV4LUlyREEgcGFja2V0cy4gUHJvdG9jb2wgZGVmaW5lZCBhdCBodHRwOi8vd3d3LmlyZGEub3JnLgorICogVGhvc2UgcGFja2V0cyBpbmNsdWRlIElyTEFQIGhlYWRlcnMgYW5kIGFib3ZlIChJckxNUC4uLiksIGJ1dAorICogZG9uJ3QgaW5jbHVkZSBQaHkgZnJhbWluZyAoU09GL0VPRi9DUkMgJiBieXRlIHN0dWZmaW5nKSwgYmVjYXVzZSBQaHkKKyAqIGZyYW1pbmcgY2FuIGJlIGhhbmRsZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCBkZXBlbmQgb24gdGhlIGJpdHJhdGUuCisgKiBUaGlzIGlzIGV4YWN0bHkgdGhlIGZvcm1hdCB5b3Ugd291bGQgZ2V0IGNhcHR1cmluZyBvbiBhIExpbnV4LUlyREEKKyAqIGludGVyZmFjZSAoaXJkYVgpLCBidXQgbm90IG9uIGEgcmF3IHNlcmlhbCBwb3J0LgorICogTm90ZSB0aGUgY2FwdHVyZSBpcyBkb25lIGluICJMaW51eC1jb29rZWQiIG1vZGUsIHNvIGVhY2ggcGFja2V0IGluY2x1ZGUKKyAqIGEgZmFrZSBwYWNrZXQgaGVhZGVyIChzdHJ1Y3Qgc2xsX2hlYWRlcikuIFRoaXMgaXMgYmVjYXVzZSBJckRBIHBhY2tldAorICogZGVjb2RpbmcgaXMgZGVwZW5kYW50IG9uIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHBhY2tldCAoaW5jb21taW5nIG9yCisgKiBvdXRnb2luZykuCisgKiBXaGVuL2lmIG90aGVyIHBsYXRmb3JtIGltcGxlbWVudCBJckRBIGNhcHR1cmUsIHdlIG1heSByZXZpc2l0IHRoZQorICogaXNzdWUgYW5kIGRlZmluZSBhIHJlYWwgRExUX0lSREEuLi4KKyAqIEplYW4gSUkKKyAqLworI2RlZmluZSBETFRfTElOVVhfSVJEQQkJMTQ0CisKKy8qCisgKiBSZXNlcnZlZCBmb3IgSUJNIFNQIHN3aXRjaCBhbmQgSUJNIE5leHQgRmVkZXJhdGlvbiBzd2l0Y2guCisgKi8KKyNkZWZpbmUgRExUX0lCTV9TUAkJMTQ1CisjZGVmaW5lIERMVF9JQk1fU04JCTE0NgorCisvKgorICogUmVzZXJ2ZWQgZm9yIHByaXZhdGUgdXNlLiAgSWYgeW91IGhhdmUgc29tZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlCisgKiB0aGF0IHlvdSB3YW50IHRvIHVzZSB3aXRoaW4geW91ciBvcmdhbml6YXRpb24sIHdpdGggdGhlIGNhcHR1cmUgZmlsZXMKKyAqIHVzaW5nIHRoYXQgbGluay1sYXllciBoZWFkZXIgdHlwZSBub3QgZXZlciBiZSBzZW50IG91dHNpZGUgeW91cgorICogb3JnYW5pemF0aW9uLCB5b3UgY2FuIHVzZSB0aGVzZSB2YWx1ZXMuCisgKgorICogTm8gbGlicGNhcCByZWxlYXNlIHdpbGwgdXNlIHRoZXNlIGZvciBhbnkgcHVycG9zZSwgbm9yIHdpbGwgYW55CisgKiB0Y3BkdW1wIHJlbGVhc2UgdXNlIHRoZW0sIGVpdGhlci4KKyAqCisgKiBEbyAqTk9UKiB1c2UgdGhlc2UgaW4gY2FwdHVyZSBmaWxlcyB0aGF0IHlvdSBleHBlY3QgYW55Ym9keSBub3QgdXNpbmcKKyAqIHlvdXIgcHJpdmF0ZSB2ZXJzaW9ucyBvZiBjYXB0dXJlLWZpbGUtcmVhZGluZyB0b29scyB0byByZWFkOyBpbgorICogcGFydGljdWxhciwgZG8gKk5PVCogdXNlIHRoZW0gaW4gcHJvZHVjdHMsIG90aGVyd2lzZSB5b3UgbWF5IGZpbmQgdGhhdAorICogcGVvcGxlIHdvbid0IGJlIGFibGUgdG8gdXNlIHRjcGR1bXAsIG9yIHNub3J0LCBvciBFdGhlcmVhbCwgb3IuLi4gdG8KKyAqIHJlYWQgY2FwdHVyZSBmaWxlcyBmcm9tIHlvdXIgZmlyZXdhbGwvaW50cnVzaW9uIGRldGVjdGlvbi90cmFmZmljCisgKiBtb25pdG9yaW5nL2V0Yy4gYXBwbGlhbmNlLCBvciB3aGF0ZXZlciBwcm9kdWN0IHVzZXMgdGhhdCBETFRfIHZhbHVlLAorICogYW5kIHlvdSBtYXkgYWxzbyBmaW5kIHRoYXQgdGhlIGRldmVsb3BlcnMgb2YgdGhvc2UgYXBwbGljYXRpb25zIHdpbGwKKyAqIG5vdCBhY2NlcHQgcGF0Y2hlcyB0byBsZXQgdGhlbSByZWFkIHRob3NlIGZpbGVzLgorICoKKyAqIEFsc28sIGRvIG5vdCB1c2UgdGhlbSBpZiBzb21lYm9keSBtaWdodCBzZW5kIHlvdSBhIGNhcHR1cmUgdXNpbmcgdGhlbQorICogZm9yICp0aGVpciogcHJpdmF0ZSB0eXBlIGFuZCB0b29scyB1c2luZyB0aGVtIGZvciAqeW91ciogcHJpdmF0ZSB0eXBlCisgKiB3b3VsZCBoYXZlIHRvIHJlYWQgdGhlbS4KKyAqCisgKiBJbnN0ZWFkLCBhc2sgInRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyIgZm9yIGEgbmV3IERMVF8gdmFsdWUsCisgKiBhcyBwZXIgdGhlIGNvbW1lbnQgYWJvdmUsIGFuZCB1c2UgdGhlIHR5cGUgeW91J3JlIGdpdmVuLgorICovCisjZGVmaW5lIERMVF9VU0VSMAkJMTQ3CisjZGVmaW5lIERMVF9VU0VSMQkJMTQ4CisjZGVmaW5lIERMVF9VU0VSMgkJMTQ5CisjZGVmaW5lIERMVF9VU0VSMwkJMTUwCisjZGVmaW5lIERMVF9VU0VSNAkJMTUxCisjZGVmaW5lIERMVF9VU0VSNQkJMTUyCisjZGVmaW5lIERMVF9VU0VSNgkJMTUzCisjZGVmaW5lIERMVF9VU0VSNwkJMTU0CisjZGVmaW5lIERMVF9VU0VSOAkJMTU1CisjZGVmaW5lIERMVF9VU0VSOQkJMTU2CisjZGVmaW5lIERMVF9VU0VSMTAJCTE1NworI2RlZmluZSBETFRfVVNFUjExCQkxNTgKKyNkZWZpbmUgRExUX1VTRVIxMgkJMTU5CisjZGVmaW5lIERMVF9VU0VSMTMJCTE2MAorI2RlZmluZSBETFRfVVNFUjE0CQkxNjEKKyNkZWZpbmUgRExUX1VTRVIxNQkJMTYyCisKKy8qCisgKiBGb3IgZnV0dXJlIHVzZSB3aXRoIDgwMi4xMSBjYXB0dXJlcyAtIGRlZmluZWQgYnkgQWJzb2x1dGVWYWx1ZQorICogU3lzdGVtcyB0byBzdG9yZSBhIG51bWJlciBvZiBiaXRzIG9mIGxpbmstbGF5ZXIgaW5mb3JtYXRpb24KKyAqIGluY2x1ZGluZyByYWRpbyBpbmZvcm1hdGlvbjoKKyAqCisgKglodHRwOi8vd3d3LnNoYWZ0bmV0Lm9yZy9+cGl6emEvc29mdHdhcmUvY2FwdHVyZWZybS50eHQKKyAqCisgKiBidXQgaXQgbWlnaHQgYmUgdXNlZCBieSBzb21lIG5vbi1BVlMgZHJpdmVycyBub3cgb3IgaW4gdGhlCisgKiBmdXR1cmUuCisgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDJfMTFfUkFESU9fQVZTIDE2MwkvKiA4MDIuMTEgcGx1cyBBVlMgcmFkaW8gaGVhZGVyICovCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAgVGhlIERMVF9zIGFyZSB1c2VkCisgKiBmb3IgcGFzc2luZyBvbiBjaGFzc2lzLWludGVybmFsIG1ldGFpbmZvcm1hdGlvbiBzdWNoIGFzCisgKiBRT1MgcHJvZmlsZXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfTU9OSVRPUiAgICAgMTY0CisKKy8qCisgKiBCQUNuZXQgTVMvVFAgZnJhbWVzLgorICovCisjZGVmaW5lIERMVF9CQUNORVRfTVNfVFAJMTY1CisKKy8qCisgKiBBbm90aGVyIFBQUCB2YXJpYW50IGFzIHBlciByZXF1ZXN0IGZyb20gS2Fyc3RlbiBLZWlsIDxra2VpbEBzdXNlLmRlPi4KKyAqCisgKiBUaGlzIGlzIHVzZWQgaW4gc29tZSBPU2VzIHRvIGFsbG93IGEga2VybmVsIHNvY2tldCBmaWx0ZXIgdG8gZGlzdGluZ3Vpc2gKKyAqIGJldHdlZW4gaW5jb21pbmcgYW5kIG91dGdvaW5nIHBhY2tldHMsIG9uIGEgc29ja2V0IGludGVuZGVkIHRvCisgKiBzdXBwbHkgcHBwZCB3aXRoIG91dGdvaW5nIHBhY2tldHMgc28gaXQgY2FuIGRvIGRpYWwtb24tZGVtYW5kIGFuZAorICogaGFuZ3VwLW9uLWxhY2stb2YtZGVtYW5kOyBpbmNvbWluZyBwYWNrZXRzIGFyZSBmaWx0ZXJlZCBvdXQgc28gdGhleQorICogZG9uJ3QgY2F1c2UgcHBwZCB0byBob2xkIHRoZSBjb25uZWN0aW9uIHVwICh5b3UgZG9uJ3Qgd2FudCByYW5kb20KKyAqIGlucHV0IHBhY2tldHMgc3VjaCBhcyBwb3J0IHNjYW5zLCBwYWNrZXRzIGZyb20gb2xkIGxvc3QgY29ubmVjdGlvbnMsCisgKiBldGMuIHRvIGZvcmNlIHRoZSBjb25uZWN0aW9uIHRvIHN0YXkgdXApLgorICoKKyAqIFRoZSBmaXJzdCBieXRlIG9mIHRoZSBQUFAgaGVhZGVyICgweGZmMDMpIGlzIG1vZGlmaWVkIHRvIGFjY29tb2RhdGUKKyAqIHRoZSBkaXJlY3Rpb24gLSAweDAwID0gSU4sIDB4MDEgPSBPVVQuCisgKi8KKyNkZWZpbmUgRExUX1BQUF9QUFBECQkxNjYKKworLyoKKyAqIE5hbWVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIHNvbWUgUFBQCisgKiBzb2Z0d2FyZTsgbmV3IHNvZnR3YXJlIHNob3VsZCB1c2UgRExUX1BQUF9QUFBELgorICovCisjZGVmaW5lIERMVF9QUFBfV0lUSF9ESVJFQ1RJT04JRExUX1BQUF9QUFBECisjZGVmaW5lIERMVF9MSU5VWF9QUFBfV0lUSERJUkVDVElPTglETFRfUFBQX1BQUEQKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uICBUaGUgRExUX3MgYXJlIHVzZWQKKyAqIGZvciBwYXNzaW5nIG9uIGNoYXNzaXMtaW50ZXJuYWwgbWV0YWluZm9ybWF0aW9uIHN1Y2ggYXMKKyAqIFFPUyBwcm9maWxlcywgY29va2llcywgZXRjLi4KKyAqLworI2RlZmluZSBETFRfSlVOSVBFUl9QUFBPRSAgICAgICAxNjcKKyNkZWZpbmUgRExUX0pVTklQRVJfUFBQT0VfQVRNICAgMTY4CisKKyNkZWZpbmUgRExUX0dQUlNfTExDCQkxNjkJLyogR1BSUyBMTEMgKi8KKyNkZWZpbmUgRExUX0dQRl9UCQkxNzAJLyogR1BGLVQgKElUVS1UIEcuNzA0MS9ZLjEzMDMpICovCisjZGVmaW5lIERMVF9HUEZfRgkJMTcxCS8qIEdQRi1GIChJVFUtVCBHLjcwNDEvWS4xMzAzKSAqLworCisvKgorICogUmVxdWVzdGVkIGJ5IE9vbGFuIFppbW1lciA8b3pAZ2NvbS5jb20+IGZvciB1c2UgaW4gR2NvbSdzIFQxL0UxIGxpbmUKKyAqIG1vbml0b3JpbmcgZXF1aXBtZW50LgorICovCisjZGVmaW5lIERMVF9HQ09NX1QxRTEJCTE3MgorI2RlZmluZSBETFRfR0NPTV9TRVJJQUwJCTE3MworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gIFRoZSBETFRfIGlzIHVzZWQKKyAqIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHRvIFBoeXNpY2FsIEludGVyZmFjZSBDYXJkcyAoUElDKQorICovCisjZGVmaW5lIERMVF9KVU5JUEVSX1BJQ19QRUVSICAgIDE3NAorCisvKgorICogTGluayB0eXBlcyByZXF1ZXN0ZWQgYnkgR3JlZ29yIE1haWVyIDxncmVnb3JAZW5kYWNlLmNvbT4gb2YgRW5kYWNlCisgKiBNZWFzdXJlbWVudCBTeXN0ZW1zLiAgVGhleSBhZGQgYW4gRVJGIGhlYWRlciAoc2VlCisgKiBodHRwOi8vd3d3LmVuZGFjZS5jb20vc3VwcG9ydC9FbmRhY2VSZWNvcmRGb3JtYXQucGRmKSBpbiBmcm9udCBvZgorICogdGhlIGxpbmstbGF5ZXIgaGVhZGVyLgorICovCisjZGVmaW5lIERMVF9FUkZfRVRICQkxNzUJLyogRXRoZXJuZXQgKi8KKyNkZWZpbmUgRExUX0VSRl9QT1MJCTE3NgkvKiBQYWNrZXQtb3Zlci1TT05FVCAqLworCisvKgorICogUmVxdWVzdGVkIGJ5IERhbmllbGUgT3JsYW5kaSA8ZGFuaWVsZUBvcmxhbmRpLmNvbT4gZm9yIHJhdyBMQVBECisgKiBmb3IgdklTRE4gKGh0dHA6Ly93d3cub3JsYW5kaS5jb20vdmlzZG4vKS4gIEl0cyBsaW5rLWxheWVyIGhlYWRlcgorICogaW5jbHVkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBiZWZvcmUgdGhlIExBUEQgaGVhZGVyLCBzbyBpdCdzCisgKiBub3QgbmVjZXNzYXJpbHkgYSBnZW5lcmljIExBUEQgaGVhZGVyLgorICovCisjZGVmaW5lIERMVF9MSU5VWF9MQVBECQkxNzcKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uIAorICogVGhlIERMVF8gYXJlIHVzZWQgZm9yIHByZXBlbmRpbmcgbWV0YS1pbmZvcm1hdGlvbgorICogbGlrZSBpbnRlcmZhY2UgaW5kZXgsIGludGVyZmFjZSBuYW1lCisgKiBiZWZvcmUgc3RhbmRhcmQgRXRoZXJuZXQsIFBQUCwgRnJlbGF5ICYgQy1IRExDIEZyYW1lcworICovCisjZGVmaW5lIERMVF9KVU5JUEVSX0VUSEVSICAgICAgIDE3OAorI2RlZmluZSBETFRfSlVOSVBFUl9QUFAgICAgICAgICAxNzkKKyNkZWZpbmUgRExUX0pVTklQRVJfRlJFTEFZICAgICAgMTgwCisjZGVmaW5lIERMVF9KVU5JUEVSX0NIRExDICAgICAgIDE4MQorCisvKgorICogTXVsdGkgTGluayBGcmFtZSBSZWxheSAoRlJGLjE2KQorICovCisjZGVmaW5lIERMVF9NRlIgICAgICAgICAgICAgICAgIDE4MgorCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHdpdGggYQorICogdm9pY2UgQWRhcHRlciBDYXJkIChQSUMpCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfVlAgICAgICAgICAgMTgzCisKKy8qCisgKiBBcmluYyA0MjkgZnJhbWVzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogRXZlcnkgZnJhbWUgY29udGFpbnMgYSAzMmJpdCBBNDI5IGxhYmVsLgorICogTW9yZSBkb2N1bWVudGF0aW9uIG9uIEFyaW5jIDQyOSBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cuY29uZG9yZW5nLmNvbS9zdXBwb3J0L2Rvd25sb2Fkcy90dXRvcmlhbHMvQVJJTkNUdXRvcmlhbC5wZGYKKyAqLworI2RlZmluZSBETFRfQTQyOSAgICAgICAgICAgICAgICAxODQKKworLyoKKyAqIEFyaW5jIDY1MyBJbnRlcnBhcnRpdGlvbiBDb21tdW5pY2F0aW9uIG1lc3NhZ2VzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBBNjUzLTEgc3RhbmRhcmQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgRExUX0E2NTNfSUNNICAgICAgICAgICAgMTg1CisKKy8qCisgKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBVU0Igc2V0dXAgaGVhZGVyOyByZXF1ZXN0ZWQgYnkKKyAqIFBhb2xvIEFiZW5pIDxwYW9sby5hYmVuaUBlbWFpbC5pdD4uCisgKi8KKyNkZWZpbmUgRExUX1VTQgkJCTE4NgorCisvKgorICogQmx1ZXRvb3RoIEhDSSBVQVJUIHRyYW5zcG9ydCBsYXllciAocGFydCBIOjQpOyByZXF1ZXN0ZWQgYnkKKyAqIFBhb2xvIEFiZW5pLgorICovCisjZGVmaW5lIERMVF9CTFVFVE9PVEhfSENJX0g0CTE4NworCisvKgorICogSUVFRSA4MDIuMTYgTUFDIENvbW1vbiBQYXJ0IFN1YmxheWVyOyByZXF1ZXN0ZWQgYnkgTWFyaWEgQ3J1egorICogPGNydXpfcGV0YWdheUBiYWguY29tPi4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNl9NQUNfQ1BTCTE4OAorCisvKgorICogVVNCIHBhY2tldHMsIGJlZ2lubmluZyB3aXRoIGEgTGludXggVVNCIGhlYWRlcjsgcmVxdWVzdGVkIGJ5CisgKiBQYW9sbyBBYmVuaSA8cGFvbG8uYWJlbmlAZW1haWwuaXQ+LgorICovCisjZGVmaW5lIERMVF9VU0JfTElOVVgJCTE4OQorCisvKgorICogQ29udHJvbGxlciBBcmVhIE5ldHdvcmsgKENBTikgdi4gMi4wQiBwYWNrZXRzLgorICogRExUXyByZXF1ZXN0ZWQgYnkgR2lhbmx1Y2EgVmFyZW5uaSA8Z2lhbmx1Y2EudmFyZW5uaUBjYWNldGVjaC5jb20+LgorICogVXNlZCB0byBkdW1wIENBTiBwYWNrZXRzIGNvbWluZyBmcm9tIGEgQ0FOIFZlY3RvciBib2FyZC4KKyAqIE1vcmUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgQ0FOIHYyLjBCIGZyYW1lcyBjYW4gYmUgZm91bmQgYXQKKyAqIGh0dHA6Ly93d3cuY2FuLWNpYS5vcmcvZG93bmxvYWRzLz8yNjkKKyAqLworI2RlZmluZSBETFRfQ0FOMjBCICAgICAgICAgICAgICAxOTAKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIHdpdGggYWRkcmVzcyBmaWVsZHMgcGFkZGVkLCBhcyBpcyBkb25lIGJ5IExpbnV4CisgKiBkcml2ZXJzOyByZXF1ZXN0ZWQgYnkgSnVlcmdlbiBTY2hpbW1lci4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNV80X0xJTlVYCTE5MQorCisvKgorICogUGVyIFBhY2tldCBJbmZvcm1hdGlvbiBlbmNhcHN1bGF0ZWQgcGFja2V0cy4KKyAqIERMVF8gcmVxdWVzdGVkIGJ5IEdpYW5sdWNhIFZhcmVubmkgPGdpYW5sdWNhLnZhcmVubmlAY2FjZXRlY2guY29tPi4KKyAqLworI2RlZmluZSBETFRfUFBJCQkJMTkyCisKKy8qCisgKiBIZWFkZXIgZm9yIDgwMi4xNiBNQUMgQ29tbW9uIFBhcnQgU3VibGF5ZXIgcGx1cyBhIHJhZGlvdGFwIHJhZGlvIGhlYWRlcjsKKyAqIHJlcXVlc3RlZCBieSBDaGFybGVzIENsYW5jeS4KKyAqLworI2RlZmluZSBETFRfSUVFRTgwMl8xNl9NQUNfQ1BTX1JBRElPCTE5MworCisvKgorICogSnVuaXBlci1wcml2YXRlIGRhdGEgbGluayB0eXBlLCBhcyBwZXIgcmVxdWVzdCBmcm9tCisgKiBIYW5uZXMgR3JlZGxlciA8aGFubmVzQGp1bmlwZXIubmV0Pi4gCisgKiBUaGUgRExUXyBpcyB1c2VkIGZvciBpbnRlcm5hbCBjb21tdW5pY2F0aW9uIHdpdGggYQorICogaW50ZWdyYXRlZCBzZXJ2aWNlIG1vZHVsZSAoSVNNKS4KKyAqLworI2RlZmluZSBETFRfSlVOSVBFUl9JU00gICAgICAgICAxOTQKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpOyByZXF1ZXN0ZWQgYnkgTWlra28gU2Fhcm5pdmFsYSA8bWlra28uc2Fhcm5pdmFsYUBzZW5zaW5vZGUuY29tPi4KKyAqIEZvciB0aGlzIG9uZSwgd2UgZXhwZWN0IHRoZSBGQ1MgdG8gYmUgcHJlc2VudCBhdCB0aGUgZW5kIG9mIHRoZSBmcmFtZTsKKyAqIGlmIHRoZSBmcmFtZSBoYXMgbm8gRkNTLCBETFRfSUVFRTgwMl8xNV80X05PRkNTIHNob3VsZCBiZSB1c2VkLgorICovCisjZGVmaW5lIERMVF9JRUVFODAyXzE1XzQJMTk1CisKKy8qCisgKiBWYXJpb3VzIGxpbmstbGF5ZXIgdHlwZXMsIHdpdGggYSBwc2V1ZG8taGVhZGVyLCBmb3IgU0lUQQorICogKGh0dHA6Ly93d3cuc2l0YS5hZXJvLyk7IHJlcXVlc3RlZCBieSBGdWxrbyBIZXcgKGZ1bGtvLmhld0BnbWFpbC5jb20pLgorICovCisjZGVmaW5lIERMVF9TSVRBCQkxOTYKKworLyoKKyAqIFZhcmlvdXMgbGluay1sYXllciB0eXBlcywgd2l0aCBhIHBzZXVkby1oZWFkZXIsIGZvciBFbmRhY2UgREFHIGNhcmRzOworICogZW5jYXBzdWxhdGVzIEVuZGFjZSBFUkYgcmVjb3Jkcy4gIFJlcXVlc3RlZCBieSBTdGVwaGVuIERvbm5lbGx5CisgKiA8c3RlcGhlbkBlbmRhY2UuY29tPi4KKyAqLworI2RlZmluZSBETFRfRVJGCQkJMTk3CisKKy8qCisgKiBTcGVjaWFsIGhlYWRlciBwcmVwZW5kZWQgdG8gRXRoZXJuZXQgcGFja2V0cyB3aGVuIGNhcHR1cmluZyBmcm9tIGEKKyAqIHUxMCBOZXR3b3JrcyBib2FyZC4gIFJlcXVlc3RlZCBieSBQaGlsIE11bGhvbGxhbmQKKyAqIDxwaGlsQHUxMG5ldHdvcmtzLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX1JBSUYxCQkxOTgKKworLyoKKyAqIElQTUIgcGFja2V0IGZvciBJUE1JLCBiZWdpbm5pbmcgd2l0aCB0aGUgSTJDIHNsYXZlIGFkZHJlc3MsIGZvbGxvd2VkCisgKiBieSB0aGUgbmV0Rm4gYW5kIExVTiwgZXRjLi4gIFJlcXVlc3RlZCBieSBDaGFudGh5IFRvZXVuZworICogPGNoYW50aHkudG9ldW5nQGNhLmtvbnRyb24uY29tPi4KKyAqLworI2RlZmluZSBETFRfSVBNQgkJMTk5CisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LiAKKyAqIFRoZSBETFRfIGlzIHVzZWQgZm9yIGNhcHR1cmluZyBkYXRhIG9uIGEgc2VjdXJlIHR1bm5lbCBpbnRlcmZhY2UuCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfU1QgICAgICAgICAgMjAwCisKKy8qCisgKiBCbHVldG9vdGggSENJIFVBUlQgdHJhbnNwb3J0IGxheWVyIChwYXJ0IEg6NCksIHdpdGggcHNldWRvLWhlYWRlcgorICogdGhhdCBpbmNsdWRlcyBkaXJlY3Rpb24gaW5mb3JtYXRpb247IHJlcXVlc3RlZCBieSBQYW9sbyBBYmVuaS4KKyAqLworI2RlZmluZSBETFRfQkxVRVRPT1RIX0hDSV9INF9XSVRIX1BIRFIJMjAxCisKKy8qCisgKiBBWC4yNSBwYWNrZXQgd2l0aCBhIDEtYnl0ZSBLSVNTIGhlYWRlcjsgc2VlCisgKgorICoJaHR0cDovL3d3dy5heDI1Lm5ldC9raXNzLmh0bQorICoKKyAqIGFzIHBlciBSaWNoYXJkIFN0ZWFybiA8cmljaGFyZEBybnMtc3RlYXJuLmRlbW9uLmNvLnVrPi4KKyAqLworI2RlZmluZSBETFRfQVgyNV9LSVNTCQkyMDIKKworLyoKKyAqIExBUEQgcGFja2V0cyBmcm9tIGFuIElTRE4gY2hhbm5lbCwgc3RhcnRpbmcgd2l0aCB0aGUgYWRkcmVzcyBmaWVsZCwKKyAqIHdpdGggbm8gcHNldWRvLWhlYWRlci4KKyAqIFJlcXVlc3RlZCBieSBWYXJ1bmEgRGUgU2lsdmEgPHZhcnVuYXhAZ21haWwuY29tPi4KKyAqLworI2RlZmluZSBETFRfTEFQRAkJMjAzCisKKy8qCisgKiBWYXJpYW50cyBvZiB2YXJpb3VzIGxpbmstbGF5ZXIgaGVhZGVycywgd2l0aCBhIG9uZS1ieXRlIGRpcmVjdGlvbgorICogcHNldWRvLWhlYWRlciBwcmVwZW5kZWQgLSB6ZXJvIG1lYW5zICJyZWNlaXZlZCBieSB0aGlzIGhvc3QiLAorICogbm9uLXplcm8gKGFueSBub24temVybyB2YWx1ZSkgbWVhbnMgInNlbnQgYnkgdGhpcyBob3N0IiAtIGFzIHBlcgorICogV2lsbCBCYXJrZXIgPHcuYmFya2VyQHplbi5jby51az4uCisgKi8KKyNkZWZpbmUgRExUX1BQUF9XSVRIX0RJUgkyMDQJLyogUFBQIC0gZG9uJ3QgY29uZnVzZSB3aXRoIERMVF9QUFBfV0lUSF9ESVJFQ1RJT04gKi8KKyNkZWZpbmUgRExUX0NfSERMQ19XSVRIX0RJUgkyMDUJLyogQ2lzY28gSERMQyAqLworI2RlZmluZSBETFRfRlJFTEFZX1dJVEhfRElSCTIwNgkvKiBGcmFtZSBSZWxheSAqLworI2RlZmluZSBETFRfTEFQQl9XSVRIX0RJUgkyMDcJLyogTEFQQiAqLworCisvKgorICogMjA4IGlzIHJlc2VydmVkIGZvciBhbiBhcy15ZXQtdW5zcGVjaWZpZWQgcHJvcHJpZXRhcnkgbGluay1sYXllcgorICogdHlwZSwgYXMgcmVxdWVzdGVkIGJ5IFdpbGwgQmFya2VyLgorICovCisKKy8qCisgKiBJUE1CIHdpdGggYSBMaW51eC1zcGVjaWZpYyBwc2V1ZG8taGVhZGVyOyBhcyByZXF1ZXN0ZWQgYnkgQWxleGV5IE5leW1hbgorICogPGF2bkBwaWdlb25wb2ludC5jb20+LgorICovCisjZGVmaW5lIERMVF9JUE1CX0xJTlVYCQkyMDkKKworLyoKKyAqIEZsZXhSYXkgYXV0b21vdGl2ZSBidXMgLSBodHRwOi8vd3d3LmZsZXhyYXkuY29tLyAtIGFzIHJlcXVlc3RlZAorICogYnkgSGFubmVzIEthZWxiZXIgPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCisgKi8KKyNkZWZpbmUgRExUX0ZMRVhSQVkJCTIxMAorCisvKgorICogTWVkaWEgT3JpZW50ZWQgU3lzdGVtcyBUcmFuc3BvcnQgKE1PU1QpIGJ1cyBmb3IgbXVsdGltZWRpYQorICogdHJhbnNwb3J0IC0gaHR0cDovL3d3dy5tb3N0Y29vcGVyYXRpb24uY29tLyAtIGFzIHJlcXVlc3RlZAorICogYnkgSGFubmVzIEthZWxiZXIgPGhhbm5lcy5rYWVsYmVyQHgyZS5kZT4uCisgKi8KKyNkZWZpbmUgRExUX01PU1QJCTIxMQorCisvKgorICogTG9jYWwgSW50ZXJjb25uZWN0IE5ldHdvcmsgKExJTikgYnVzIGZvciB2ZWhpY2xlIG5ldHdvcmtzIC0KKyAqIGh0dHA6Ly93d3cubGluLXN1YmJ1cy5vcmcvIC0gYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyCisgKiA8aGFubmVzLmthZWxiZXJAeDJlLmRlPi4KKyAqLworI2RlZmluZSBETFRfTElOCQkJMjEyCisKKy8qCisgKiBYMkUtcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSB1c2VkIGZvciBzZXJpYWwgbGluZSBjYXB0dXJlLAorICogYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIERMVF9YMkVfU0VSSUFMCQkyMTMKKworLyoKKyAqIFgyRS1wcml2YXRlIGRhdGEgbGluayB0eXBlIHVzZWQgZm9yIHRoZSBYb3JheWEgZGF0YSBsb2dnZXIKKyAqIGZhbWlseSwgYXMgcmVxdWVzdGVkIGJ5IEhhbm5lcyBLYWVsYmVyIDxoYW5uZXMua2FlbGJlckB4MmUuZGU+LgorICovCisjZGVmaW5lIERMVF9YMkVfWE9SQVlBCQkyMTQKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpLCBidXQgd2l0aCB0aGUgUEhZLWxldmVsIGRhdGEgZm9yIG5vbi1BU0sgUEhZcyAoNCBvY3RldHMKKyAqIG9mIDAgYXMgcHJlYW1ibGUsIG9uZSBvY3RldCBvZiBTRkQsIG9uZSBvY3RldCBvZiBmcmFtZSBsZW5ndGgrCisgKiByZXNlcnZlZCBiaXQsIGFuZCB0aGVuIHRoZSBNQUMtbGF5ZXIgZGF0YSwgc3RhcnRpbmcgd2l0aCB0aGUKKyAqIGZyYW1lIGNvbnRyb2wgZmllbGQpLgorICoKKyAqIFJlcXVlc3RlZCBieSBNYXggRmlsaXBwb3YgPGpjbXZia2JjQGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX0lFRUU4MDJfMTVfNF9OT05BU0tfUEhZCTIxNQorCisvKiAKKyAqIERhdmlkIEdpYnNvbiA8ZGF2aWRAZ2lic29uLmRyb3BiZWFyLmlkLmF1PiByZXF1ZXN0ZWQgdGhpcyBmb3IKKyAqIGNhcHR1cmVzIGZyb20gdGhlIExpbnV4IGtlcm5lbCAvZGV2L2lucHV0L2V2ZW50TiBkZXZpY2VzLiBUaGlzCisgKiBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGtleXN0cm9rZXMgYW5kIG1vdXNlIG1vdmVtZW50cyBmcm9tIHRoZQorICogTGludXgga2VybmVsIHRvIGRpc3BsYXkgc3lzdGVtcywgc3VjaCBhcyBYb3JnLiAKKyAqLworI2RlZmluZSBETFRfTElOVVhfRVZERVYJCTIxNgorCisvKgorICogR1NNIFVtIGFuZCBBYmlzIGludGVyZmFjZXMsIHByZWNlZGVkIGJ5IGEgImdzbXRhcCIgaGVhZGVyLgorICoKKyAqIFJlcXVlc3RlZCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPi4KKyAqLworI2RlZmluZSBETFRfR1NNVEFQX1VNCQkyMTcKKyNkZWZpbmUgRExUX0dTTVRBUF9BQklTCQkyMTgKKworLyoKKyAqIE1QTFMsIHdpdGggYW4gTVBMUyBsYWJlbCBhcyB0aGUgbGluay1sYXllciBoZWFkZXIuCisgKiBSZXF1ZXN0ZWQgYnkgTWljaGVsZSBNYXJjaGV0dG8gPG1pY2hlbGVAb3BlbmJzZC5vcmc+IG9uIGJlaGFsZgorICogb2YgT3BlbkJTRC4KKyAqLworI2RlZmluZSBETFRfTVBMUwkJMjE5CisKKy8qCisgKiBVU0IgcGFja2V0cywgYmVnaW5uaW5nIHdpdGggYSBMaW51eCBVU0IgaGVhZGVyLCB3aXRoIHRoZSBVU0IgaGVhZGVyCisgKiBwYWRkZWQgdG8gNjQgYnl0ZXM7IHJlcXVpcmVkIGZvciBtZW1vcnktbWFwcGVkIGFjY2Vzcy4KKyAqLworI2RlZmluZSBETFRfVVNCX0xJTlVYX01NQVBQRUQJMjIwCisKKy8qCisgKiBERUNUIHBhY2tldHMsIHdpdGggYSBwc2V1ZG8taGVhZGVyOyByZXF1ZXN0ZWQgYnkKKyAqIE1hdHRoaWFzIFdlbnplbCA8dGNwZHVtcEBtYXp6b28uZGU+LgorICovCisjZGVmaW5lIERMVF9ERUNUCQkyMjEKKworLyoKKyAqIEZyb206ICJMaWR3YSwgRXJpYyAoR1NGQy01ODIuMClbU0dUIElOQ10iIDxlcmljLmxpZHdhLTFAbmFzYS5nb3Y+CisgKiBEYXRlOiBNb24sIDExIE1heSAyMDA5IDExOjE4OjMwIC0wNTAwCisgKgorICogRExUX0FPUy4gV2UgbmVlZCBpdCBmb3IgQU9TIFNwYWNlIERhdGEgTGluayBQcm90b2NvbC4KKyAqICAgSSBoYXZlIGFscmVhZHkgd3JpdHRlbiBkaXNzZWN0b3JzIGZvciBidXQgbmVlZCBhbiBPSyBmcm9tCisgKiAgIGxlZ2FsIGJlZm9yZSBJIGNhbiBzdWJtaXQgYSBwYXRjaC4KKyAqCisgKi8KKyNkZWZpbmUgRExUX0FPUyAgICAgICAgICAgICAgICAgMjIyCisKKy8qCisgKiBXaXJlbGVzcyBIQVJUIChIaWdod2F5IEFkZHJlc3NhYmxlIFJlbW90ZSBUcmFuc2R1Y2VyKQorICogRnJvbSB0aGUgSEFSVCBDb21tdW5pY2F0aW9uIEZvdW5kYXRpb24KKyAqIElFUy9QQVMgNjI1OTEKKyAqCisgKiBSZXF1ZXN0ZWQgYnkgU2FtIFJvYmVydHMgPHZpZXV4dGVjaEBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9XSUhBUlQJCTIyMworCisvKgorICogRmlicmUgQ2hhbm5lbCBGQy0yIGZyYW1lcywgYmVnaW5uaW5nIHdpdGggYSBGcmFtZV9IZWFkZXIuCisgKiBSZXF1ZXN0ZWQgYnkgS2Fob3UgTGVpIDxrYWhvdTgyQGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX0ZDXzIJCTIyNAorCisvKgorICogRmlicmUgQ2hhbm5lbCBGQy0yIGZyYW1lcywgYmVnaW5uaW5nIHdpdGggYW4gZW5jb2Rpbmcgb2YgdGhlCisgKiBTT0YsIGFuZCBlbmRpbmcgd2l0aCBhbiBlbmNvZGluZyBvZiB0aGUgRU9GLgorICoKKyAqIFRoZSBlbmNvZGluZ3MgcmVwcmVzZW50IHRoZSBmcmFtZSBkZWxpbWl0ZXJzIGFzIDQtYnl0ZSBzZXF1ZW5jZXMKKyAqIHJlcHJlc2VudGluZyB0aGUgY29ycmVzcG9uZGluZyBvcmRlcmVkIHNldHMsIHdpdGggSzI4LjUKKyAqIHJlcHJlc2VudGVkIGFzIDB4QkMsIGFuZCB0aGUgRCBzeW1ib2xzIGFzIHRoZSBjb3JyZXNwb25kaW5nCisgKiBieXRlIHZhbHVlczsgZm9yIGV4YW1wbGUsIFNPRmkyLCB3aGljaCBpcyBLMjguNSAtIEQyMS41IC0gRDEuMiAtIEQyMS4yLAorICogaXMgcmVwcmVzZW50ZWQgYXMgMHhCQyAweEI1IDB4NTUgMHg1NS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgS2Fob3UgTGVpIDxrYWhvdTgyQGdtYWlsLmNvbT4uCisgKi8KKyNkZWZpbmUgRExUX0ZDXzJfV0lUSF9GUkFNRV9ERUxJTVMJMjI1CisKKy8qCisgKiBTb2xhcmlzIGlwbmV0IHBzZXVkby1oZWFkZXI7IHJlcXVlc3RlZCBieSBEYXJyZW4gUmVlZCA8RGFycmVuLlJlZWRAU3VuLkNPTT4uCisgKgorICogVGhlIHBzZXVkby1oZWFkZXIgc3RhcnRzIHdpdGggYSBvbmUtYnl0ZSB2ZXJzaW9uIG51bWJlcjsgZm9yIHZlcnNpb24gMiwKKyAqIHRoZSBwc2V1ZG8taGVhZGVyIGlzOgorICoKKyAqIHN0cnVjdCBkbF9pcG5ldGluZm8geworICogICAgIHVfaW50OF90ICAgZGxpX3ZlcnNpb247CisgKiAgICAgdV9pbnQ4X3QgICBkbGlfZmFtaWx5OworICogICAgIHVfaW50MTZfdCAgZGxpX2h0eXBlOworICogICAgIHVfaW50MzJfdCAgZGxpX3BrdGxlbjsKKyAqICAgICB1X2ludDMyX3QgIGRsaV9pZmluZGV4OworICogICAgIHVfaW50MzJfdCAgZGxpX2dyaWZpbmRleDsKKyAqICAgICB1X2ludDMyX3QgIGRsaV96c3JjOworICogICAgIHVfaW50MzJfdCAgZGxpX3pkc3Q7CisgKiB9OworICoKKyAqIGRsaV92ZXJzaW9uIGlzIDIgZm9yIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHBzZXVkby1oZWFkZXIuCisgKgorICogZGxpX2ZhbWlseSBpcyBhIFNvbGFyaXMgYWRkcmVzcyBmYW1pbHkgdmFsdWUsIHNvIGl0J3MgMiBmb3IgSVB2NAorICogYW5kIDI2IGZvciBJUHY2LgorICoKKyAqIGRsaV9odHlwZSBpcyBhICJob29rIHR5cGUiIC0gMCBmb3IgaW5jb21pbmcgcGFja2V0cywgMSBmb3Igb3V0Z29pbmcKKyAqIHBhY2tldHMsIGFuZCAyIGZvciBwYWNrZXRzIGFycml2aW5nIGZyb20gYW5vdGhlciB6b25lIG9uIHRoZSBzYW1lCisgKiBtYWNoaW5lLgorICoKKyAqIGRsaV9wa3RsZW4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IGRhdGEgZm9sbG93aW5nIHRoZSBwc2V1ZG8taGVhZGVyCisgKiAoc28gdGhlIGNhcHR1cmVkIGxlbmd0aCBtaW51cyBkbGlfcGt0bGVuIGlzIHRoZSBsZW5ndGggb2YgdGhlCisgKiBwc2V1ZG8taGVhZGVyLCBhc3N1bWluZyB0aGUgZW50aXJlIHBzZXVkby1oZWFkZXIgd2FzIGNhcHR1cmVkKS4KKyAqCisgKiBkbGlfaWZpbmRleCBpcyB0aGUgaW50ZXJmYWNlIGluZGV4IG9mIHRoZSBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlCisgKiBwYWNrZXQgYXJyaXZlZC4KKyAqCisgKiBkbGlfZ3JpZmluZGV4IGlzIHRoZSBncm91cCBpbnRlcmZhY2UgaW5kZXggbnVtYmVyIChmb3IgSVBNUCBpbnRlcmZhY2VzKS4KKyAqCisgKiBkbGlfenNyYyBpcyB0aGUgem9uZSBpZGVudGlmaWVyIGZvciB0aGUgc291cmNlIG9mIHRoZSBwYWNrZXQuCisgKgorICogZGxpX3pkc3QgaXMgdGhlIHpvbmUgaWRlbnRpZmllciBmb3IgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwYWNrZXQuCisgKgorICogQSB6b25lIG51bWJlciBvZiAwIGlzIHRoZSBnbG9iYWwgem9uZTsgYSB6b25lIG51bWJlciBvZiAweGZmZmZmZmZmCisgKiBtZWFucyB0aGF0IHRoZSBwYWNrZXQgYXJyaXZlZCBmcm9tIGFub3RoZXIgaG9zdCBvbiB0aGUgbmV0d29yaywgbm90CisgKiBmcm9tIGFub3RoZXIgem9uZSBvbiB0aGUgc2FtZSBtYWNoaW5lLgorICoKKyAqIEFuIElQdjQgb3IgSVB2NiBkYXRhZ3JhbSBmb2xsb3dzIHRoZSBwc2V1ZG8taGVhZGVyOyBkbGlfZmFtaWx5IGluZGljYXRlcworICogd2hpY2ggb2YgdGhvc2UgaXQgaXMuCisgKi8KKyNkZWZpbmUgRExUX0lQTkVUCQkyMjYKKworLyoKKyAqIENBTiAoQ29udHJvbGxlciBBcmVhIE5ldHdvcmspIGZyYW1lcywgd2l0aCBhIHBzZXVkby1oZWFkZXIgYXMgc3VwcGxpZWQKKyAqIGJ5IExpbnV4IFNvY2tldENBTi4gIFNlZSBEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dCBpbiB0aGUgTGludXgKKyAqIHNvdXJjZS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgRmVsaXggT2Jlbmh1YmVyIDxmZWxpeEBvYmVuaHViZXIuZGU+LgorICovCisjZGVmaW5lIERMVF9DQU5fU09DS0VUQ0FOCTIyNworCisvKgorICogUmF3IElQdjQvSVB2NjsgZGlmZmVyZW50IGZyb20gRExUX1JBVyBpbiB0aGF0IHRoZSBETFRfIHZhbHVlIHNwZWNpZmllcworICogd2hldGhlciBpdCdzIHY0IG9yIHY2LiAgUmVxdWVzdGVkIGJ5IERhcnJlbiBSZWVkIDxEYXJyZW4uUmVlZEBTdW4uQ09NPi4KKyAqLworI2RlZmluZSBETFRfSVBWNAkJMjI4CisjZGVmaW5lIERMVF9JUFY2CQkyMjkKKworLyoKKyAqIElFRUUgODAyLjE1LjQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUgc3BlYyAobm8gcGFkZGluZywgbm8KKyAqIG5vdGhpbmcpLCBhbmQgd2l0aCBubyBGQ1MgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWU7IHJlcXVlc3RlZCBieQorICogSm9uIFNtaXJsIDxqb25zbWlybEBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9JRUVFODAyXzE1XzRfTk9GQ1MJMjMwCisKKy8qCisgKiBSYXcgRC1CdXM6CisgKgorICoJaHR0cDovL3d3dy5mcmVlZGVza3RvcC5vcmcvd2lraS9Tb2Z0d2FyZS9kYnVzCisgKgorICogbWVzc2FnZXM6CisgKgorICoJaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNtZXNzYWdlLXByb3RvY29sLW1lc3NhZ2VzCisgKgorICogc3RhcnRpbmcgd2l0aCB0aGUgZW5kaWFubmVzcyBmbGFnLCBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZSB0eXBlLCBldGMuLAorICogYnV0IHdpdGhvdXQgdGhlIGF1dGhlbnRpY2F0aW9uIGhhbmRzaGFrZSBiZWZvcmUgdGhlIG1lc3NhZ2Ugc2VxdWVuY2U6CisgKgorICoJaHR0cDovL2RidXMuZnJlZWRlc2t0b3Aub3JnL2RvYy9kYnVzLXNwZWNpZmljYXRpb24uaHRtbCNhdXRoLXByb3RvY29sCisgKgorICogUmVxdWVzdGVkIGJ5IE1hcnRpbiBWaWRuZXIgPG1hcnRpbkB2aWRuZXIubmV0Pi4KKyAqLworI2RlZmluZSBETFRfREJVUwkJMjMxCisKKy8qCisgKiBKdW5pcGVyLXByaXZhdGUgZGF0YSBsaW5rIHR5cGUsIGFzIHBlciByZXF1ZXN0IGZyb20KKyAqIEhhbm5lcyBHcmVkbGVyIDxoYW5uZXNAanVuaXBlci5uZXQ+LgorICovCisjZGVmaW5lIERMVF9KVU5JUEVSX1ZTCQkJMjMyCisjZGVmaW5lIERMVF9KVU5JUEVSX1NSWF9FMkUJCTIzMworI2RlZmluZSBETFRfSlVOSVBFUl9GSUJSRUNIQU5ORUwJMjM0CisKKy8qCisgKiBEVkItQ0kgKERWQiBDb21tb24gSW50ZXJmYWNlIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gYSBQQyBDYXJkCisgKiBtb2R1bGUgYW5kIGEgRFZCIHJlY2VpdmVyKS4gIFNlZQorICoKKyAqCWh0dHA6Ly93d3cua2Fpc2VyLmN4L3BjYXAtZHZiY2kuaHRtbAorICoKKyAqIGZvciB0aGUgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgTWFydGluIEthaXNlciA8bWFydGluQGthaXNlci5jeD4uCisgKi8KKyNkZWZpbmUgRExUX0RWQl9DSQkJMjM1CisKKy8qCisgKiBWYXJpYW50IG9mIDNHUFAgVFMgMjcuMDEwIG11bHRpcGxleGluZyBwcm90b2NvbCAoc2ltaWxhciB0bywgYnV0CisgKiAqbm90KiB0aGUgc2FtZSBhcywgMjcuMDEwKS4gIFJlcXVlc3RlZCBieSBIYW5zLUNocmlzdG9waCBTY2hlbW1lbAorICogPGhhbnMtY2hyaXN0b3BoLnNjaGVtbWVsQGNpbnRlcmlvbi5jb20+LgorICovCisjZGVmaW5lIERMVF9NVVgyNzAxMAkJMjM2CisKKy8qCisgKiBTVEFOQUcgNTA2NiBEX1BEVXMuICBSZXF1ZXN0ZWQgYnkgTS4gQmFyaXMgRGVtaXJheQorICogPGJhcmlzZGVtaXJheUBnbWFpbC5jb20+LgorICovCisjZGVmaW5lIERMVF9TVEFOQUdfNTA2Nl9EX1BEVQkyMzcKKworLyoKKyAqIEp1bmlwZXItcHJpdmF0ZSBkYXRhIGxpbmsgdHlwZSwgYXMgcGVyIHJlcXVlc3QgZnJvbQorICogSGFubmVzIEdyZWRsZXIgPGhhbm5lc0BqdW5pcGVyLm5ldD4uCisgKi8KKyNkZWZpbmUgRExUX0pVTklQRVJfQVRNX0NFTUlDCTIzOAorCisvKgorICogTmV0RmlsdGVyIExPRyBtZXNzYWdlcyAKKyAqIChwYXlsb2FkIG9mIG5ldGxpbmsgTkZOTF9TVUJTWVNfVUxPRy9ORlVMTkxfTVNHX1BBQ0tFVCBwYWNrZXRzKQorICoKKyAqIFJlcXVlc3RlZCBieSBKYWt1YiBaYXdhZHpraSA8ZGFya2phbWVzLXdzQGRhcmtqYW1lcy5wbD4KKyAqLworI2RlZmluZSBETFRfTkZMT0cJCTIzOQorCisvKgorICogSGlsc2NoZXIgR2VzZWxsc2NoYWZ0IGZ1ZXIgU3lzdGVtYXV0b21hdGlvbiBtYkggbGluay1sYXllciB0eXBlCisgKiBmb3IgRXRoZXJuZXQgcGFja2V0cyB3aXRoIGEgNC1ieXRlIHBzZXVkby1oZWFkZXIgYW5kIGFsd2F5cworICogd2l0aCB0aGUgcGF5bG9hZCBpbmNsdWRpbmcgdGhlIEZDUywgYXMgc3VwcGxpZWQgYnkgdGhlaXIKKyAqIG5ldEFOQUxZWkVSIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZS4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgSG9sZ2VyIFAuIEZyb21tZXIgPEhQZnJvbW1lckBoaWxzY2hlci5jb20+CisgKi8KKyNkZWZpbmUgRExUX05FVEFOQUxZWkVSCQkyNDAKKworLyoKKyAqIEhpbHNjaGVyIEdlc2VsbHNjaGFmdCBmdWVyIFN5c3RlbWF1dG9tYXRpb24gbWJIIGxpbmstbGF5ZXIgdHlwZQorICogZm9yIEV0aGVybmV0IHBhY2tldHMgd2l0aCBhIDQtYnl0ZSBwc2V1ZG8taGVhZGVyIGFuZCBGQ1MgYW5kCisgKiB3aXRoIHRoZSBFdGhlcm5ldCBoZWFkZXIgcHJlY2VkZWQgYnkgNyBieXRlcyBvZiBwcmVhbWJsZSBhbmQKKyAqIDEgYnl0ZSBvZiBTRkQsIGFzIHN1cHBsaWVkIGJ5IHRoZWlyIG5ldEFOQUxZWkVSIGhhcmR3YXJlIGFuZAorICogc29mdHdhcmUuCisgKgorICogUmVxdWVzdGVkIGJ5IEhvbGdlciBQLiBGcm9tbWVyIDxIUGZyb21tZXJAaGlsc2NoZXIuY29tPgorICovCisjZGVmaW5lIERMVF9ORVRBTkFMWVpFUl9UUkFOU1BBUkVOVAkyNDEKKworLyoKKyAqIElQLW92ZXItSW5maW5pYmFuZCwgYXMgc3BlY2lmaWVkIGJ5IFJGQyA0MzkxLgorICoKKyAqIFJlcXVlc3RlZCBieSBQZXRyIFN1bWJlcmEgPHBldHIuc3VtYmVyYUBvcmFjbGUuY29tPi4KKyAqLworI2RlZmluZSBETFRfSVBPSUIJCTI0MgorCisvKgorICogTVBFRy0yIHRyYW5zcG9ydCBzdHJlYW0gKElTTyAxMzgxOC0xL0lUVS1UIEguMjIyLjApLgorICoKKyAqIFJlcXVlc3RlZCBieSBHdXkgTWFydGluIDxnbXNvZnRAdHV4aWNvbWFuLmJlPi4KKyAqLworI2RlZmluZSBETFRfTVBFR18yX1RTCQkyNDMKKworLyoKKyAqIG5nNFQgR21iSCdzIFVNVFMgSXViL0l1ci1vdmVyLUFUTSBhbmQgSXViL0l1ci1vdmVyLUlQIGZvcm1hdCBhcworICogdXNlZCBieSB0aGVpciBuZzQwIHByb3RvY29sIHRlc3Rlci4KKyAqCisgKiBSZXF1ZXN0ZWQgYnkgSmVucyBHcmltbWVyIDxqZW5zLmdyaW1tZXJAbmc0dC5jb20+LgorICovCisjZGVmaW5lIERMVF9ORzQwCQkyNDQKKworLyoKKyAqIFBzZXVkby1oZWFkZXIgZ2l2aW5nIGFkYXB0ZXIgbnVtYmVyIGFuZCBmbGFncywgZm9sbG93ZWQgYnkgYW4gTkZDCisgKiAoTmVhci1GaWVsZCBDb21tdW5pY2F0aW9ucykgTG9naWNhbCBMaW5rIENvbnRyb2wgUHJvdG9jb2wgKExMQ1ApIFBEVSwKKyAqIGFzIHNwZWNpZmllZCBieSBORkMgRm9ydW0gTG9naWNhbCBMaW5rIENvbnRyb2wgUHJvdG9jb2wgVGVjaG5pY2FsCisgKiBTcGVjaWZpY2F0aW9uIExMQ1AgMS4xLgorICoKKyAqIFJlcXVlc3RlZCBieSBNaWtlIFdha2VybHkgPG1pa2V5QGdvb2dsZS5jb20+LgorICovCisjZGVmaW5lIERMVF9ORkNfTExDUAkJMjQ1CisKKy8qCisgKiAyNDUgaXMgdXNlZCBhcyBMSU5LVFlQRV9QRlNZTkM7IGRvIG5vdCB1c2UgaXQgZm9yIGFueSBvdGhlciBwdXJwb3NlLgorICoKKyAqIERMVF9QRlNZTkMgaGFzIGRpZmZlcmVudCB2YWx1ZXMgb24gZGlmZmVyZW50IHBsYXRmb3JtcywgYW5kIGFsbCBvZgorICogdGhlbSBjb2xsaWRlIHdpdGggc29tZXRoaW5nIHVzZWQgZWxzZXdoZXJlLiAgT24gcGxhdGZvcm1zIHRoYXQKKyAqIGRvbid0IGFscmVhZHkgZGVmaW5lIGl0LCBkZWZpbmUgaXQgYXMgMjQ1LgorICovCisjaWYgIWRlZmluZWQoX19GcmVlQlNEX18pICYmICFkZWZpbmVkKF9fT3BlbkJTRF9fKSAmJiAhZGVmaW5lZChfX05ldEJTRF9fKSAmJiAhZGVmaW5lZChfX0RyYWdvbkZseV9fKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCisjZGVmaW5lIERMVF9QRlNZTkMJCTI0NgorI2VuZGlmCisKKyNkZWZpbmUgRExUX01BVENISU5HX01BWAkyNDYJLyogaGlnaGVzdCB2YWx1ZSBpbiB0aGUgIm1hdGNoaW5nIiByYW5nZSAqLworCisvKgorICogRExUIGFuZCBzYXZlZmlsZSBsaW5rIHR5cGUgdmFsdWVzIGFyZSBzcGxpdCBpbnRvIGEgY2xhc3MgYW5kCisgKiBhIG1lbWJlciBvZiB0aGF0IGNsYXNzLiAgQSBjbGFzcyB2YWx1ZSBvZiAwIGluZGljYXRlcyBhIHJlZ3VsYXIKKyAqIERMVF8vTElOS1RZUEVfIHZhbHVlLgorICovCisjZGVmaW5lIERMVF9DTEFTUyh4KQkJKCh4KSAmIDB4MDNmZjAwMDApCisKKy8qCisgKiBOZXRCU0Qtc3BlY2lmaWMgZ2VuZXJpYyAicmF3IiBsaW5rIHR5cGUuICBUaGUgY2xhc3MgdmFsdWUgaW5kaWNhdGVzCisgKiB0aGF0IHRoaXMgaXMgdGhlIGdlbmVyaWMgcmF3IHR5cGUsIGFuZCB0aGUgbG93ZXIgMTYgYml0cyBhcmUgdGhlCisgKiBhZGRyZXNzIGZhbWlseSB3ZSdyZSBkZWFsaW5nIHdpdGguICBUaG9zZSB2YWx1ZXMgYXJlIE5ldEJTRC1zcGVjaWZpYzsKKyAqIGRvIG5vdCBhc3N1bWUgdGhhdCB0aGV5IGNvcnJlc3BvbmQgdG8gQUZfIHZhbHVlcyBmb3IgeW91ciBvcGVyYXRpbmcKKyAqIHN5c3RlbS4KKyAqLworI2RlZmluZQlETFRfQ0xBU1NfTkVUQlNEX1JBV0FGCTB4MDIyNDAwMDAKKyNkZWZpbmUJRExUX05FVEJTRF9SQVdBRihhZikJKERMVF9DTEFTU19ORVRCU0RfUkFXQUYgfCAoYWYpKQorI2RlZmluZQlETFRfTkVUQlNEX1JBV0FGX0FGKHgpCSgoeCkgJiAweDAwMDBmZmZmKQorI2RlZmluZQlETFRfSVNfTkVUQlNEX1JBV0FGKHgpCShETFRfQ0xBU1MoeCkgPT0gRExUX0NMQVNTX05FVEJTRF9SQVdBRikKKworCisvKgorICogVGhlIGluc3RydWN0aW9uIGVuY29kaW5ncy4KKyAqLworLyogaW5zdHJ1Y3Rpb24gY2xhc3NlcyAqLworI2RlZmluZSBCUEZfQ0xBU1MoY29kZSkgKChjb2RlKSAmIDB4MDcpCisjZGVmaW5lCQlCUEZfTEQJCTB4MDAKKyNkZWZpbmUJCUJQRl9MRFgJCTB4MDEKKyNkZWZpbmUJCUJQRl9TVAkJMHgwMgorI2RlZmluZQkJQlBGX1NUWAkJMHgwMworI2RlZmluZQkJQlBGX0FMVQkJMHgwNAorI2RlZmluZQkJQlBGX0pNUAkJMHgwNQorI2RlZmluZQkJQlBGX1JFVAkJMHgwNgorI2RlZmluZQkJQlBGX01JU0MJMHgwNworCisvKiBsZC9sZHggZmllbGRzICovCisjZGVmaW5lIEJQRl9TSVpFKGNvZGUpCSgoY29kZSkgJiAweDE4KQorI2RlZmluZQkJQlBGX1cJCTB4MDAKKyNkZWZpbmUJCUJQRl9ICQkweDA4CisjZGVmaW5lCQlCUEZfQgkJMHgxMAorI2RlZmluZSBCUEZfTU9ERShjb2RlKQkoKGNvZGUpICYgMHhlMCkKKyNkZWZpbmUJCUJQRl9JTU0gCTB4MDAKKyNkZWZpbmUJCUJQRl9BQlMJCTB4MjAKKyNkZWZpbmUJCUJQRl9JTkQJCTB4NDAKKyNkZWZpbmUJCUJQRl9NRU0JCTB4NjAKKyNkZWZpbmUJCUJQRl9MRU4JCTB4ODAKKyNkZWZpbmUJCUJQRl9NU0gJCTB4YTAKKworLyogYWx1L2ptcCBmaWVsZHMgKi8KKyNkZWZpbmUgQlBGX09QKGNvZGUpCSgoY29kZSkgJiAweGYwKQorI2RlZmluZQkJQlBGX0FERAkJMHgwMAorI2RlZmluZQkJQlBGX1NVQgkJMHgxMAorI2RlZmluZQkJQlBGX01VTAkJMHgyMAorI2RlZmluZQkJQlBGX0RJVgkJMHgzMAorI2RlZmluZQkJQlBGX09SCQkweDQwCisjZGVmaW5lCQlCUEZfQU5ECQkweDUwCisjZGVmaW5lCQlCUEZfTFNICQkweDYwCisjZGVmaW5lCQlCUEZfUlNICQkweDcwCisjZGVmaW5lCQlCUEZfTkVHCQkweDgwCisjZGVmaW5lCQlCUEZfSkEJCTB4MDAKKyNkZWZpbmUJCUJQRl9KRVEJCTB4MTAKKyNkZWZpbmUJCUJQRl9KR1QJCTB4MjAKKyNkZWZpbmUJCUJQRl9KR0UJCTB4MzAKKyNkZWZpbmUJCUJQRl9KU0VUCTB4NDAKKyNkZWZpbmUgQlBGX1NSQyhjb2RlKQkoKGNvZGUpICYgMHgwOCkKKyNkZWZpbmUJCUJQRl9LCQkweDAwCisjZGVmaW5lCQlCUEZfWAkJMHgwOAorCisvKiByZXQgLSBCUEZfSyBhbmQgQlBGX1ggYWxzbyBhcHBseSAqLworI2RlZmluZSBCUEZfUlZBTChjb2RlKQkoKGNvZGUpICYgMHgxOCkKKyNkZWZpbmUJCUJQRl9BCQkweDEwCisKKy8qIG1pc2MgKi8KKyNkZWZpbmUgQlBGX01JU0NPUChjb2RlKSAoKGNvZGUpICYgMHhmOCkKKyNkZWZpbmUJCUJQRl9UQVgJCTB4MDAKKyNkZWZpbmUJCUJQRl9UWEEJCTB4ODAKKworLyoKKyAqIFRoZSBpbnN0cnVjdGlvbiBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IGJwZl9pbnNuIHsKKwl1X3Nob3J0CWNvZGU7CisJdV9jaGFyIAlqdDsKKwl1X2NoYXIgCWpmOworCWJwZl91X2ludDMyIGs7Cit9OworCisvKgorICogTWFjcm9zIGZvciBpbnNuIGFycmF5IGluaXRpYWxpemVycy4KKyAqLworI2RlZmluZSBCUEZfU1RNVChjb2RlLCBrKSB7ICh1X3Nob3J0KShjb2RlKSwgMCwgMCwgayB9CisjZGVmaW5lIEJQRl9KVU1QKGNvZGUsIGssIGp0LCBqZikgeyAodV9zaG9ydCkoY29kZSksIGp0LCBqZiwgayB9CisKKyNpZiBfX1NURENfXyB8fCBkZWZpbmVkKF9fY3BsdXNwbHVzKQorZXh0ZXJuIGludCBicGZfdmFsaWRhdGUoY29uc3Qgc3RydWN0IGJwZl9pbnNuICosIGludCk7CitleHRlcm4gdV9pbnQgYnBmX2ZpbHRlcihjb25zdCBzdHJ1Y3QgYnBmX2luc24gKiwgY29uc3QgdV9jaGFyICosIHVfaW50LCB1X2ludCk7CisjZWxzZQorZXh0ZXJuIGludCBicGZfdmFsaWRhdGUoKTsKK2V4dGVybiB1X2ludCBicGZfZmlsdGVyKCk7CisjZW5kaWYKKworLyoKKyAqIE51bWJlciBvZiBzY3JhdGNoIG1lbW9yeSB3b3JkcyAoZm9yIEJQRl9MRHxCUEZfTUVNIGFuZCBCUEZfU1QpLgorICovCisjZGVmaW5lIEJQRl9NRU1XT1JEUyAxNgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQoX05FVF9CUEZfSF8pICYmICFkZWZpbmVkKF9CUEZfSF8pICYmICFkZWZpbmVkKF9IX0JQRikgJiYgIWRlZmluZWQobGliX3BjYXBfYnBmX2gpICovCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAvaXBuZXQuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC9pcG5ldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzA4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAvaXBuZXQuaApAQCAtMCwwICsxLDQzIEBACisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSB0aGUgU3RhbmZvcmQvQ01VIGVuZXQgcGFja2V0IGZpbHRlciwKKyAqIChuZXQvZW5ldC5jKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIDQuM0JTRCwgYW5kIGNvZGUgY29udHJpYnV0ZWQKKyAqIHRvIEJlcmtlbGV5IGJ5IFN0ZXZlbiBNY0Nhbm5lIGFuZCBWYW4gSmFjb2Jzb24gYm90aCBvZiBMYXdyZW5jZQorICogQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjZGVmaW5lCUlQSF9BRl9JTkVUCTIJCS8qIE1hdGNoZXMgU29sYXJpcydzIEFGX0lORVQgKi8KKyNkZWZpbmUJSVBIX0FGX0lORVQ2CTI2CQkvKiBNYXRjaGVzIFNvbGFyaXMncyBBRl9JTkVUNiAqLworCisjZGVmaW5lCUlQTkVUX09VVEJPVU5ECQkxCisjZGVmaW5lCUlQTkVUX0lOQk9VTkQJCTIKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC9uYW1lZGIuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC9uYW1lZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzE0NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwL25hbWVkYi5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisgKiAgICBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKglUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBDb21wdXRlciBTeXN0ZW1zCisgKglFbmdpbmVlcmluZyBHcm91cCBhdCBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5LgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3Igb2YgdGhlIExhYm9yYXRvcnkgbWF5IGJlIHVzZWQKKyAqICAgIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAvbmFtZWRiLmgsdiAxLjEgMjAwNi0xMC0wNCAxODowOToyMiBndXkgRXhwICQgKExCTCkKKyAqLworCisjaWZuZGVmIGxpYl9wY2FwX25hbWVkYl9oCisjZGVmaW5lIGxpYl9wY2FwX25hbWVkYl9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIEFzIHJldHVybmVkIGJ5IHRoZSBwY2FwX25leHRfZXRoZXJlbnQoKQorICogWFhYIHRoaXMgc3R1ZmYgZG9lc24ndCBiZWxvbmcgaW4gdGhpcyBpbnRlcmZhY2UsIGJ1dCB0aGlzCisgKiBsaWJyYXJ5IGFscmVhZHkgbXVzdCBkbyBuYW1lIHRvIGFkZHJlc3MgdHJhbnNsYXRpb24sIHNvCisgKiBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSBzdXBwb3J0IGZvciAvZXRjL2V0aGVycywgd2UKKyAqIGV4cG9ydCB0aGVzZSBob29rcyBzaW5jZSB0aGV5J2xsCisgKi8KK3N0cnVjdCBwY2FwX2V0aGVyZW50IHsKKwl1X2NoYXIgYWRkcls2XTsKKwljaGFyIG5hbWVbMTIyXTsKK307CisjaWZuZGVmIFBDQVBfRVRIRVJTX0ZJTEUKKyNkZWZpbmUgUENBUF9FVEhFUlNfRklMRSAiL2V0Yy9ldGhlcnMiCisjZW5kaWYKK3N0cnVjdAlwY2FwX2V0aGVyZW50ICpwY2FwX25leHRfZXRoZXJlbnQoRklMRSAqKTsKK3VfY2hhciAqcGNhcF9ldGhlcl9ob3N0dG9uKGNvbnN0IGNoYXIqKTsKK3VfY2hhciAqcGNhcF9ldGhlcl9hdG9uKGNvbnN0IGNoYXIgKik7CisKK2JwZl91X2ludDMyICoqcGNhcF9uYW1ldG9hZGRyKGNvbnN0IGNoYXIgKik7CisjaWZkZWYgSU5FVDYKK3N0cnVjdCBhZGRyaW5mbyAqcGNhcF9uYW1ldG9hZGRyaW5mbyhjb25zdCBjaGFyICopOworI2VuZGlmCiticGZfdV9pbnQzMiBwY2FwX25hbWV0b25ldGFkZHIoY29uc3QgY2hhciAqKTsKKworaW50CXBjYXBfbmFtZXRvcG9ydChjb25zdCBjaGFyICosIGludCAqLCBpbnQgKik7CitpbnQJcGNhcF9uYW1ldG9wb3J0cmFuZ2UoY29uc3QgY2hhciAqLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2ludAlwY2FwX25hbWV0b3Byb3RvKGNvbnN0IGNoYXIgKik7CitpbnQJcGNhcF9uYW1ldG9lcHJvdG8oY29uc3QgY2hhciAqKTsKK2ludAlwY2FwX25hbWV0b2xsYyhjb25zdCBjaGFyICopOworLyoKKyAqIElmIGEgcHJvdG9jb2wgaXMgdW5rbm93biwgUFJPVE9fVU5ERUYgaXMgcmV0dXJuZWQuCisgKiBBbHNvLCBwY2FwX25hbWV0b3BvcnQoKSByZXR1cm5zIHRoZSBwcm90b2NvbCBhbG9uZyB3aXRoIHRoZSBwb3J0IG51bWJlci4KKyAqIElmIHRoZXJlIGFyZSBhbWJpZ3VvdXMgZW50cmllZCBpbiAvZXRjL3NlcnZpY2VzIChpLmUuIGRvbWFpbgorICogY2FuIGJlIGVpdGhlciB0Y3Agb3IgdWRwKSBQUk9UT19VTkRFRiBpcyByZXR1cm5lZC4KKyAqLworI2RlZmluZSBQUk9UT19VTkRFRgkJLTEKKworLyogWFhYIG1vdmUgdGhlc2UgdG8gcGNhcC1pbnQuaD8gKi8KK2ludCBfX3BjYXBfYXRvZG4oY29uc3QgY2hhciAqLCBicGZfdV9pbnQzMiAqKTsKK2ludCBfX3BjYXBfYXRvaW4oY29uc3QgY2hhciAqLCBicGZfdV9pbnQzMiAqKTsKK3Vfc2hvcnQJX19wY2FwX25hbWV0b2RuYWRkcihjb25zdCBjaGFyICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC9wY2FwLmggYi9saWJwY2FwLTEuMy4wL3BjYXAvcGNhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMmIzNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAvcGNhcC5oCkBAIC0wLDAgKzEsNDYyIEBACisvKiAtKi0gTW9kZTogYzsgdGFiLXdpZHRoOiA4OyBpbmRlbnQtdGFicy1tb2RlOiAxOyBjLWJhc2ljLW9mZnNldDogODsgLSotICovCisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgQ29tcHV0ZXIgU3lzdGVtcworICoJRW5naW5lZXJpbmcgR3JvdXAgYXQgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeS4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIG9mIHRoZSBMYWJvcmF0b3J5IG1heSBiZSB1c2VkCisgKiAgICB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dAorICogICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwL3BjYXAuaCx2IDEuMTUgMjAwOC0xMC0wNiAxNToyNzozMiBnaWFubHVjYSBFeHAgJCAoTEJMKQorICovCisKKyNpZm5kZWYgbGliX3BjYXBfcGNhcF9oCisjZGVmaW5lIGxpYl9wY2FwX3BjYXBfaAorCisjaWYgZGVmaW5lZChXSU4zMikKKyAgI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisjZWxpZiBkZWZpbmVkKE1TRE9TKQorICAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisgICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+ICAvKiB1X2ludCwgdV9jaGFyIGV0Yy4gKi8KKyNlbHNlIC8qIFVOKlggKi8KKyAgI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorICAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbmRpZiAvKiBXSU4zMi9NU0RPUy9VTipYICovCisKKyNpZm5kZWYgUENBUF9ET05UX0lOQ0xVREVfUENBUF9CUEZfSAorI2luY2x1ZGUgPHBjYXAvYnBmLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHBjYXAgZmlsZSBmb3JtYXQuCisgKgorICogTk9URTogdGhpcyBpcyAqTk9UKiB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnBjYXAgbGlicmFyeS4KKyAqIFRvIGZldGNoIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgdmVyc2lvbiBvZiBsaWJwY2FwCisgKiB5b3UncmUgdXNpbmcsIHVzZSBwY2FwX2xpYl92ZXJzaW9uKCkuCisgKi8KKyNkZWZpbmUgUENBUF9WRVJTSU9OX01BSk9SIDIKKyNkZWZpbmUgUENBUF9WRVJTSU9OX01JTk9SIDQKKworI2RlZmluZSBQQ0FQX0VSUkJVRl9TSVpFIDI1NgorCisvKgorICogQ29tcGF0aWJpbGl0eSBmb3Igc3lzdGVtcyB0aGF0IGhhdmUgYSBicGYuaCB0aGF0CisgKiBwcmVkYXRlcyB0aGUgYnBmIHR5cGVkZWZzIGZvciA2NC1iaXQgc3VwcG9ydC4KKyAqLworI2lmIEJQRl9SRUxFQVNFIC0gMCA8IDE5OTQwNgordHlwZWRlZglpbnQgYnBmX2ludDMyOwordHlwZWRlZgl1X2ludCBicGZfdV9pbnQzMjsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBwY2FwIHBjYXBfdDsKK3R5cGVkZWYgc3RydWN0IHBjYXBfZHVtcGVyIHBjYXBfZHVtcGVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBwY2FwX2lmIHBjYXBfaWZfdDsKK3R5cGVkZWYgc3RydWN0IHBjYXBfYWRkciBwY2FwX2FkZHJfdDsKKworLyoKKyAqIFRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGZpbGUgY29udGFpbnMgc2F2ZWQgdmFsdWVzIGZvciBzb21lCisgKiBvZiB0aGUgZmxhZ3MgdXNlZCBpbiB0aGUgcHJpbnRvdXQgcGhhc2VzIG9mIHRjcGR1bXAuCisgKiBNYW55IGZpZWxkcyBoZXJlIGFyZSAzMiBiaXQgaW50cyBzbyBjb21waWxlcnMgd29uJ3QgaW5zZXJ0IHVud2FudGVkCisgKiBwYWRkaW5nOyB0aGVzZSBmaWxlcyBuZWVkIHRvIGJlIGludGVyY2hhbmdlYWJsZSBhY3Jvc3MgYXJjaGl0ZWN0dXJlcy4KKyAqCisgKiBEbyBub3QgY2hhbmdlIHRoZSBsYXlvdXQgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIGFueSB3YXkgKHRoaXMgaW5jbHVkZXMKKyAqIGNoYW5nZXMgdGhhdCBvbmx5IGFmZmVjdCB0aGUgbGVuZ3RoIG9mIGZpZWxkcyBpbiB0aGlzIHN0cnVjdHVyZSkuCisgKgorICogQWxzbywgZG8gbm90IGNoYW5nZSB0aGUgaW50ZXJwcmV0YXRpb24gb2YgYW55IG9mIHRoZSBtZW1iZXJzIG9mIHRoaXMKKyAqIHN0cnVjdHVyZSwgaW4gYW55IHdheSAodGhpcyBpbmNsdWRlcyB1c2luZyB2YWx1ZXMgb3RoZXIgdGhhbgorICogTElOS1RZUEVfIHZhbHVlcywgYXMgZGVmaW5lZCBpbiAic2F2ZWZpbGUuYyIsIGluIHRoZSAibGlua3R5cGUiCisgKiBmaWVsZCkuCisgKgorICogSW5zdGVhZDoKKyAqCisgKglpbnRyb2R1Y2UgYSBuZXcgc3RydWN0dXJlIGZvciB0aGUgbmV3IGZvcm1hdCwgaWYgdGhlIGxheW91dAorICoJb2YgdGhlIHN0cnVjdHVyZSBjaGFuZ2VkOworICoKKyAqCXNlbmQgbWFpbCB0byAidGNwZHVtcC13b3JrZXJzQGxpc3RzLnRjcGR1bXAub3JnIiwgcmVxdWVzdGluZworICoJYSBuZXcgbWFnaWMgbnVtYmVyIGZvciB5b3VyIG5ldyBjYXB0dXJlIGZpbGUgZm9ybWF0LCBhbmQsIHdoZW4KKyAqCXlvdSBnZXQgdGhlIG5ldyBtYWdpYyBudW1iZXIsIHB1dCBpdCBpbiAic2F2ZWZpbGUuYyI7CisgKgorICoJdXNlIHRoYXQgbWFnaWMgbnVtYmVyIGZvciBzYXZlIGZpbGVzIHdpdGggdGhlIGNoYW5nZWQgZmlsZQorICoJaGVhZGVyOworICoKKyAqCW1ha2UgdGhlIGNvZGUgaW4gInNhdmVmaWxlLmMiIGNhcGFibGUgb2YgcmVhZGluZyBmaWxlcyB3aXRoCisgKgl0aGUgb2xkIGZpbGUgaGVhZGVyIGFzIHdlbGwgYXMgZmlsZXMgd2l0aCB0aGUgbmV3IGZpbGUgaGVhZGVyCisgKgkodXNpbmcgdGhlIG1hZ2ljIG51bWJlciB0byBkZXRlcm1pbmUgdGhlIGhlYWRlciBmb3JtYXQpLgorICoKKyAqIFRoZW4gc3VwcGx5IHRoZSBjaGFuZ2VzIGFzIGEgcGF0Y2ggYXQKKyAqCisgKglodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnBjYXAvCisgKgorICogc28gdGhhdCBmdXR1cmUgdmVyc2lvbnMgb2YgbGlicGNhcCBhbmQgcHJvZ3JhbXMgdGhhdCB1c2UgaXQgKHN1Y2ggYXMKKyAqIHRjcGR1bXApIHdpbGwgYmUgYWJsZSB0byByZWFkIHlvdXIgbmV3IGNhcHR1cmUgZmlsZSBmb3JtYXQuCisgKi8KK3N0cnVjdCBwY2FwX2ZpbGVfaGVhZGVyIHsKKwlicGZfdV9pbnQzMiBtYWdpYzsKKwl1X3Nob3J0IHZlcnNpb25fbWFqb3I7CisJdV9zaG9ydCB2ZXJzaW9uX21pbm9yOworCWJwZl9pbnQzMiB0aGlzem9uZTsJLyogZ210IHRvIGxvY2FsIGNvcnJlY3Rpb24gKi8KKwlicGZfdV9pbnQzMiBzaWdmaWdzOwkvKiBhY2N1cmFjeSBvZiB0aW1lc3RhbXBzICovCisJYnBmX3VfaW50MzIgc25hcGxlbjsJLyogbWF4IGxlbmd0aCBzYXZlZCBwb3J0aW9uIG9mIGVhY2ggcGt0ICovCisJYnBmX3VfaW50MzIgbGlua3R5cGU7CS8qIGRhdGEgbGluayB0eXBlIChMSU5LVFlQRV8qKSAqLworfTsKKworLyoKKyAqIE1hY3JvcyBmb3IgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHBjYXBfZGF0YWxpbmtfZXh0KCkuCisgKiAKKyAqIElmIExUX0ZDU19MRU5HVEhfUFJFU0VOVCh4KSBpcyB0cnVlLCB0aGUgTFRfRkNTX0xFTkdUSCh4KSBtYWNybworICogZ2l2ZXMgdGhlIEZDUyBsZW5ndGggb2YgcGFja2V0cyBpbiB0aGUgY2FwdHVyZS4KKyAqLworI2RlZmluZSBMVF9GQ1NfTEVOR1RIX1BSRVNFTlQoeCkJKCh4KSAmIDB4MDQwMDAwMDApCisjZGVmaW5lIExUX0ZDU19MRU5HVEgoeCkJCSgoKHgpICYgMHhGMDAwMDAwMCkgPj4gMjgpCisjZGVmaW5lIExUX0ZDU19EQVRBTElOS19FWFQoeCkJCSgoKCh4KSAmIDB4RikgPDwgMjgpIHwgMHgwNDAwMDAwMCkKKwordHlwZWRlZiBlbnVtIHsKKyAgICAgICBQQ0FQX0RfSU5PVVQgPSAwLAorICAgICAgIFBDQVBfRF9JTiwKKyAgICAgICBQQ0FQX0RfT1VUCit9IHBjYXBfZGlyZWN0aW9uX3Q7CisKKy8qCisgKiBHZW5lcmljIHBlci1wYWNrZXQgaW5mb3JtYXRpb24sIGFzIHN1cHBsaWVkIGJ5IGxpYnBjYXAuCisgKgorICogVGhlIHRpbWUgc3RhbXAgY2FuIGFuZCBzaG91bGQgYmUgYSAic3RydWN0IHRpbWV2YWwiLCByZWdhcmRsZXNzIG9mCisgKiB3aGV0aGVyIHlvdXIgc3lzdGVtIHN1cHBvcnRzIDMyLWJpdCB0dl9zZWMgaW4gInN0cnVjdCB0aW1ldmFsIiwKKyAqIDY0LWJpdCB0dl9zZWMgaW4gInN0cnVjdCB0aW1ldmFsIiwgb3IgYm90aCBpZiBpdCBzdXBwb3J0cyBib3RoIDMyLWJpdAorICogYW5kIDY0LWJpdCBhcHBsaWNhdGlvbnMuICBUaGUgb24tZGlzayBmb3JtYXQgb2Ygc2F2ZWZpbGVzIHVzZXMgMzItYml0CisgKiB0dl9zZWMgKGFuZCB0dl91c2VjKTsgdGhpcyBzdHJ1Y3R1cmUgaXMgaXJyZWxldmFudCB0byB0aGF0LiAgMzItYml0CisgKiBhbmQgNjQtYml0IHZlcnNpb25zIG9mIGxpYnBjYXAsIGV2ZW4gaWYgdGhleSdyZSBvbiB0aGUgc2FtZSBwbGF0Zm9ybSwKKyAqIHNob3VsZCBzdXBwbHkgdGhlIGFwcHJvcHJpYXRlIHZlcnNpb24gb2YgInN0cnVjdCB0aW1ldmFsIiwgZXZlbiBpZgorICogdGhhdCdzIG5vdCB3aGF0IHRoZSB1bmRlcmx5aW5nIHBhY2tldCBjYXB0dXJlIG1lY2hhbmlzbSBzdXBwbGllcy4KKyAqLworc3RydWN0IHBjYXBfcGt0aGRyIHsKKwlzdHJ1Y3QgdGltZXZhbCB0czsJLyogdGltZSBzdGFtcCAqLworCWJwZl91X2ludDMyIGNhcGxlbjsJLyogbGVuZ3RoIG9mIHBvcnRpb24gcHJlc2VudCAqLworCWJwZl91X2ludDMyIGxlbjsJLyogbGVuZ3RoIHRoaXMgcGFja2V0IChvZmYgd2lyZSkgKi8KK307CisKKy8qCisgKiBBcyByZXR1cm5lZCBieSB0aGUgcGNhcF9zdGF0cygpCisgKi8KK3N0cnVjdCBwY2FwX3N0YXQgeworCXVfaW50IHBzX3JlY3Y7CQkvKiBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCAqLworCXVfaW50IHBzX2Ryb3A7CQkvKiBudW1iZXIgb2YgcGFja2V0cyBkcm9wcGVkICovCisJdV9pbnQgcHNfaWZkcm9wOwkvKiBkcm9wcyBieSBpbnRlcmZhY2UgLS0gb25seSBzdXBwb3J0ZWQgb24gc29tZSBwbGF0Zm9ybXMgKi8KKyNpZmRlZiBXSU4zMgorCXVfaW50IGJzX2NhcHQ7CQkvKiBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHJlYWNoIHRoZSBhcHBsaWNhdGlvbiAqLworI2VuZGlmIC8qIFdJTjMyICovCit9OworCisjaWZkZWYgTVNET1MKKy8qCisgKiBBcyByZXR1cm5lZCBieSB0aGUgcGNhcF9zdGF0c19leCgpCisgKi8KK3N0cnVjdCBwY2FwX3N0YXRfZXggeworICAgICAgIHVfbG9uZyAgcnhfcGFja2V0czsgICAgICAgIC8qIHRvdGFsIHBhY2tldHMgcmVjZWl2ZWQgICAgICAgKi8KKyAgICAgICB1X2xvbmcgIHR4X3BhY2tldHM7ICAgICAgICAvKiB0b3RhbCBwYWNrZXRzIHRyYW5zbWl0dGVkICAgICovCisgICAgICAgdV9sb25nICByeF9ieXRlczsgICAgICAgICAgLyogdG90YWwgYnl0ZXMgcmVjZWl2ZWQgICAgICAgICAqLworICAgICAgIHVfbG9uZyAgdHhfYnl0ZXM7ICAgICAgICAgIC8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkICAgICAgKi8KKyAgICAgICB1X2xvbmcgIHJ4X2Vycm9yczsgICAgICAgICAvKiBiYWQgcGFja2V0cyByZWNlaXZlZCAgICAgICAgICovCisgICAgICAgdV9sb25nICB0eF9lcnJvcnM7ICAgICAgICAgLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zICAgICAqLworICAgICAgIHVfbG9uZyAgcnhfZHJvcHBlZDsgICAgICAgIC8qIG5vIHNwYWNlIGluIFJ4IGJ1ZmZlcnMgICAgICAgKi8KKyAgICAgICB1X2xvbmcgIHR4X2Ryb3BwZWQ7ICAgICAgICAvKiBubyBzcGFjZSBhdmFpbGFibGUgZm9yIFR4ICAgICovCisgICAgICAgdV9sb25nICBtdWx0aWNhc3Q7ICAgICAgICAgLyogbXVsdGljYXN0IHBhY2tldHMgcmVjZWl2ZWQgICAqLworICAgICAgIHVfbG9uZyAgY29sbGlzaW9uczsKKworICAgICAgIC8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKyAgICAgICB1X2xvbmcgIHJ4X2xlbmd0aF9lcnJvcnM7CisgICAgICAgdV9sb25nICByeF9vdmVyX2Vycm9yczsgICAgLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93ICAqLworICAgICAgIHVfbG9uZyAgcnhfY3JjX2Vycm9yczsgICAgIC8qIHJlY3YnZCBwa3Qgd2l0aCBjcmMgZXJyb3IgICAgKi8KKyAgICAgICB1X2xvbmcgIHJ4X2ZyYW1lX2Vycm9yczsgICAvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisgICAgICAgdV9sb25nICByeF9maWZvX2Vycm9yczsgICAgLyogcmVjdidyIGZpZm8gb3ZlcnJ1biAgICAgICAgICAqLworICAgICAgIHVfbG9uZyAgcnhfbWlzc2VkX2Vycm9yczsgIC8qIHJlY3YnciBtaXNzZWQgcGFja2V0ICAgICAgICAgKi8KKworICAgICAgIC8qIGRldGFpbGVkIHR4X2Vycm9ycyAqLworICAgICAgIHVfbG9uZyAgdHhfYWJvcnRlZF9lcnJvcnM7CisgICAgICAgdV9sb25nICB0eF9jYXJyaWVyX2Vycm9yczsKKyAgICAgICB1X2xvbmcgIHR4X2ZpZm9fZXJyb3JzOworICAgICAgIHVfbG9uZyAgdHhfaGVhcnRiZWF0X2Vycm9yczsKKyAgICAgICB1X2xvbmcgIHR4X3dpbmRvd19lcnJvcnM7CisgICAgIH07CisjZW5kaWYKKworLyoKKyAqIEl0ZW0gaW4gYSBsaXN0IG9mIGludGVyZmFjZXMuCisgKi8KK3N0cnVjdCBwY2FwX2lmIHsKKwlzdHJ1Y3QgcGNhcF9pZiAqbmV4dDsKKwljaGFyICpuYW1lOwkJLyogbmFtZSB0byBoYW5kIHRvICJwY2FwX29wZW5fbGl2ZSgpIiAqLworCWNoYXIgKmRlc2NyaXB0aW9uOwkvKiB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIGludGVyZmFjZSwgb3IgTlVMTCAqLworCXN0cnVjdCBwY2FwX2FkZHIgKmFkZHJlc3NlczsKKwlicGZfdV9pbnQzMiBmbGFnczsJLyogUENBUF9JRl8gaW50ZXJmYWNlIGZsYWdzICovCit9OworCisjZGVmaW5lIFBDQVBfSUZfTE9PUEJBQ0sJMHgwMDAwMDAwMQkvKiBpbnRlcmZhY2UgaXMgbG9vcGJhY2sgKi8KKworLyoKKyAqIFJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVyZmFjZSBhZGRyZXNzLgorICovCitzdHJ1Y3QgcGNhcF9hZGRyIHsKKwlzdHJ1Y3QgcGNhcF9hZGRyICpuZXh0OworCXN0cnVjdCBzb2NrYWRkciAqYWRkcjsJCS8qIGFkZHJlc3MgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgKm5ldG1hc2s7CS8qIG5ldG1hc2sgZm9yIHRoYXQgYWRkcmVzcyAqLworCXN0cnVjdCBzb2NrYWRkciAqYnJvYWRhZGRyOwkvKiBicm9hZGNhc3QgYWRkcmVzcyBmb3IgdGhhdCBhZGRyZXNzICovCisJc3RydWN0IHNvY2thZGRyICpkc3RhZGRyOwkvKiBQMlAgZGVzdGluYXRpb24gYWRkcmVzcyBmb3IgdGhhdCBhZGRyZXNzICovCit9OworCit0eXBlZGVmIHZvaWQgKCpwY2FwX2hhbmRsZXIpKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwKKwkJCSAgICAgY29uc3QgdV9jaGFyICopOworCisvKgorICogRXJyb3IgY29kZXMgZm9yIHRoZSBwY2FwIEFQSS4KKyAqIFRoZXNlIHdpbGwgYWxsIGJlIG5lZ2F0aXZlLCBzbyB5b3UgY2FuIGNoZWNrIGZvciB0aGUgc3VjY2VzcyBvcgorICogZmFpbHVyZSBvZiBhIGNhbGwgdGhhdCByZXR1cm5zIHRoZXNlIGNvZGVzIGJ5IGNoZWNraW5nIGZvciBhCisgKiBuZWdhdGl2ZSB2YWx1ZS4KKyAqLworI2RlZmluZSBQQ0FQX0VSUk9SCQkJLTEJLyogZ2VuZXJpYyBlcnJvciBjb2RlICovCisjZGVmaW5lIFBDQVBfRVJST1JfQlJFQUsJCS0yCS8qIGxvb3AgdGVybWluYXRlZCBieSBwY2FwX2JyZWFrbG9vcCAqLworI2RlZmluZSBQQ0FQX0VSUk9SX05PVF9BQ1RJVkFURUQJLTMJLyogdGhlIGNhcHR1cmUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkICovCisjZGVmaW5lIFBDQVBfRVJST1JfQUNUSVZBVEVECQktNAkvKiB0aGUgb3BlcmF0aW9uIGNhbid0IGJlIHBlcmZvcm1lZCBvbiBhbHJlYWR5IGFjdGl2YXRlZCBjYXB0dXJlcyAqLworI2RlZmluZSBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFCS01CS8qIG5vIHN1Y2ggZGV2aWNlIGV4aXN0cyAqLworI2RlZmluZSBQQ0FQX0VSUk9SX1JGTU9OX05PVFNVUAkJLTYJLyogdGhpcyBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IHJmbW9uIChtb25pdG9yKSBtb2RlICovCisjZGVmaW5lIFBDQVBfRVJST1JfTk9UX1JGTU9OCQktNwkvKiBvcGVyYXRpb24gc3VwcG9ydGVkIG9ubHkgaW4gbW9uaXRvciBtb2RlICovCisjZGVmaW5lIFBDQVBfRVJST1JfUEVSTV9ERU5JRUQJCS04CS8qIG5vIHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgZGV2aWNlICovCisjZGVmaW5lIFBDQVBfRVJST1JfSUZBQ0VfTk9UX1VQCQktOQkvKiBpbnRlcmZhY2UgaXNuJ3QgdXAgKi8KKyNkZWZpbmUgUENBUF9FUlJPUl9DQU5UU0VUX1RTVEFNUF9UWVBFCS0xMAkvKiB0aGlzIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgc2V0dGluZyB0aGUgdGltZSBzdGFtcCB0eXBlICovCisjZGVmaW5lIFBDQVBfRVJST1JfUFJPTUlTQ19QRVJNX0RFTklFRAktMTEJLyogeW91IGRvbid0IGhhdmUgcGVybWlzc2lvbiB0byBjYXB0dXJlIGluIHByb21pc2N1b3VzIG1vZGUgKi8KKworLyoKKyAqIFdhcm5pbmcgY29kZXMgZm9yIHRoZSBwY2FwIEFQSS4KKyAqIFRoZXNlIHdpbGwgYWxsIGJlIHBvc2l0aXZlIGFuZCBub24temVybywgc28gdGhleSB3b24ndCBsb29rIGxpa2UKKyAqIGVycm9ycy4KKyAqLworI2RlZmluZSBQQ0FQX1dBUk5JTkcJCQkxCS8qIGdlbmVyaWMgd2FybmluZyBjb2RlICovCisjZGVmaW5lIFBDQVBfV0FSTklOR19QUk9NSVNDX05PVFNVUAkyCS8qIHRoaXMgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBwcm9taXNjdW91cyBtb2RlICovCisjZGVmaW5lIFBDQVBfV0FSTklOR19UU1RBTVBfVFlQRV9OT1RTVVAJMwkvKiB0aGUgcmVxdWVzdGVkIHRpbWUgc3RhbXAgdHlwZSBpcyBub3Qgc3VwcG9ydGVkICovCisKKy8qCisgKiBWYWx1ZSB0byBwYXNzIHRvIHBjYXBfY29tcGlsZSgpIGFzIHRoZSBuZXRtYXNrIGlmIHlvdSBkb24ndCBrbm93IHdoYXQKKyAqIHRoZSBuZXRtYXNrIGlzLgorICovCisjZGVmaW5lIFBDQVBfTkVUTUFTS19VTktOT1dOCTB4ZmZmZmZmZmYKKworY2hhcgkqcGNhcF9sb29rdXBkZXYoY2hhciAqKTsKK2ludAlwY2FwX2xvb2t1cG5ldChjb25zdCBjaGFyICosIGJwZl91X2ludDMyICosIGJwZl91X2ludDMyICosIGNoYXIgKik7CisKK3BjYXBfdAkqcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqLCBjaGFyICopOworaW50CXBjYXBfc2V0X3NuYXBsZW4ocGNhcF90ICosIGludCk7CitpbnQJcGNhcF9zZXRfcHJvbWlzYyhwY2FwX3QgKiwgaW50KTsKK2ludAlwY2FwX2Nhbl9zZXRfcmZtb24ocGNhcF90ICopOworaW50CXBjYXBfc2V0X3JmbW9uKHBjYXBfdCAqLCBpbnQpOworaW50CXBjYXBfc2V0X3RpbWVvdXQocGNhcF90ICosIGludCk7CitpbnQJcGNhcF9zZXRfdHN0YW1wX3R5cGUocGNhcF90ICosIGludCk7CitpbnQJcGNhcF9zZXRfYnVmZmVyX3NpemUocGNhcF90ICosIGludCk7CitpbnQJcGNhcF9hY3RpdmF0ZShwY2FwX3QgKik7CisKK2ludAlwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKHBjYXBfdCAqLCBpbnQgKiopOwordm9pZAlwY2FwX2ZyZWVfdHN0YW1wX3R5cGVzKGludCAqKTsKK2ludAlwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsKGNvbnN0IGNoYXIgKik7Citjb25zdCBjaGFyICpwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKGludCk7Citjb25zdCBjaGFyICpwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19kZXNjcmlwdGlvbihpbnQpOworCisvKgorICogVGltZSBzdGFtcCB0eXBlcy4KKyAqIE5vdCBhbGwgc3lzdGVtcyBhbmQgaW50ZXJmYWNlcyB3aWxsIG5lY2Vzc2FyaWx5IHN1cHBvcnQgYWxsIG9mIHRoZXNlLgorICoKKyAqIEEgc3lzdGVtIHRoYXQgc3VwcG9ydHMgUENBUF9UU1RBTVBfSE9TVCBpcyBvZmZlcmluZyB0aW1lIHN0YW1wcworICogcHJvdmlkZWQgYnkgdGhlIGhvc3QgbWFjaGluZSwgcmF0aGVyIHRoYW4gYnkgdGhlIGNhcHR1cmUgZGV2aWNlLAorICogYnV0IG5vdCBjb21taXR0aW5nIHRvIGFueSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHRpbWUgc3RhbXA7CisgKiBpdCB3aWxsIG5vdCBvZmZlciBhbnkgb2YgdGhlIFBDQVBfVFNUQU1QX0hPU1RfIHN1YnR5cGVzLgorICoKKyAqIFBDQVBfVFNUQU1QX0hPU1RfTE9XUFJFQyBpcyBhIHRpbWUgc3RhbXAsIHByb3ZpZGVkIGJ5IHRoZSBob3N0IG1hY2hpbmUsCisgKiB0aGF0J3MgbG93LXByZWNpc2lvbiBidXQgcmVsYXRpdmVseSBjaGVhcCB0byBmZXRjaDsgaXQncyBub3JtYWxseSBkb25lCisgKiB1c2luZyB0aGUgc3lzdGVtIGNsb2NrLCBzbyBpdCdzIG5vcm1hbGx5IHN5bmNocm9uaXplZCB3aXRoIHRpbWVzIHlvdSdkCisgKiBmZXRjaCBmcm9tIHN5c3RlbSBjYWxscy4KKyAqCisgKiBQQ0FQX1RTVEFNUF9IT1NUX0hJUFJFQyBpcyBhIHRpbWUgc3RhbXAsIHByb3ZpZGVkIGJ5IHRoZSBob3N0IG1hY2hpbmUsCisgKiB0aGF0J3MgaGlnaC1wcmVjaXNpb247IGl0IG1pZ2h0IGJlIG1vcmUgZXhwZW5zaXZlIHRvIGZldGNoLiAgSXQgbWlnaHQKKyAqIG9yIG1pZ2h0IG5vdCBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgc3lzdGVtIGNsb2NrLCBhbmQgbWlnaHQgaGF2ZQorICogcHJvYmxlbXMgd2l0aCB0aW1lIHN0YW1wcyBmb3IgcGFja2V0cyByZWNlaXZlZCBvbiBkaWZmZXJlbnQgQ1BVcywKKyAqIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCisgKgorICogUENBUF9UU1RBTVBfQURBUFRFUiBpcyBhIGhpZ2gtcHJlY2lzaW9uIHRpbWUgc3RhbXAgc3VwcGxpZWQgYnkgdGhlCisgKiBjYXB0dXJlIGRldmljZTsgaXQncyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgc3lzdGVtIGNsb2NrLgorICoKKyAqIFBDQVBfVFNUQU1QX0FEQVBURVJfVU5TWU5DRUQgaXMgYSBoaWdoLXByZWNpc2lvbiB0aW1lIHN0YW1wIHN1cHBsaWVkIGJ5CisgKiB0aGUgY2FwdHVyZSBkZXZpY2U7IGl0J3Mgbm90IHN5bmNocm9uaXplZCB3aXRoIHRoZSBzeXN0ZW0gY2xvY2suCisgKgorICogTm90ZSB0aGF0IHRpbWUgc3RhbXBzIHN5bmNocm9uaXplZCB3aXRoIHRoZSBzeXN0ZW0gY2xvY2sgY2FuIGdvCisgKiBiYWNrd2FyZHMsIGFzIHRoZSBzeXN0ZW0gY2xvY2sgY2FuIGdvIGJhY2t3YXJkcy4gIElmIGEgY2xvY2sgaXMKKyAqIG5vdCBpbiBzeW5jIHdpdGggdGhlIHN5c3RlbSBjbG9jaywgdGhhdCBjb3VsZCBiZSBiZWNhdXNlIHRoZQorICogc3lzdGVtIGNsb2NrIGlzbid0IGtlZXBpbmcgYWNjdXJhdGUgdGltZSwgYmVjYXVzZSB0aGUgb3RoZXIKKyAqIGNsb2NrIGlzbid0IGtlZXBpbmcgYWNjdXJhdGUgdGltZSwgb3IgYm90aC4KKyAqCisgKiBOb3RlIHRoYXQgaG9zdC1wcm92aWRlZCB0aW1lIHN0YW1wcyBnZW5lcmFsbHkgY29ycmVzcG9uZCB0byB0aGUKKyAqIHRpbWUgd2hlbiB0aGUgdGltZS1zdGFtcGluZyBjb2RlIHNlZXMgdGhlIHBhY2tldDsgdGhpcyBjb3VsZAorICogYmUgc29tZSB1bmtub3duIGFtb3VudCBvZiB0aW1lIGFmdGVyIHRoZSBmaXJzdCBvciBsYXN0IGJpdCBvZgorICogdGhlIHBhY2tldCBpcyByZWNlaXZlZCBieSB0aGUgbmV0d29yayBhZGFwdGVyLCBkdWUgdG8gYmF0Y2hpbmcKKyAqIG9mIGludGVycnVwdHMgZm9yIHBhY2tldCBhcnJpdmFsLCBxdWV1ZWluZyBkZWxheXMsIGV0Yy4uCisgKi8KKyNkZWZpbmUgUENBUF9UU1RBTVBfSE9TVAkJMAkvKiBob3N0LXByb3ZpZGVkLCB1bmtub3duIGNoYXJhY3RlcmlzdGljcyAqLworI2RlZmluZSBQQ0FQX1RTVEFNUF9IT1NUX0xPV1BSRUMJMQkvKiBob3N0LXByb3ZpZGVkLCBsb3cgcHJlY2lzaW9uICovCisjZGVmaW5lIFBDQVBfVFNUQU1QX0hPU1RfSElQUkVDCQkyCS8qIGhvc3QtcHJvdmlkZWQsIGhpZ2ggcHJlY2lzaW9uICovCisjZGVmaW5lIFBDQVBfVFNUQU1QX0FEQVBURVIJCTMJLyogZGV2aWNlLXByb3ZpZGVkLCBzeW5jZWQgd2l0aCB0aGUgc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFBDQVBfVFNUQU1QX0FEQVBURVJfVU5TWU5DRUQJNAkvKiBkZXZpY2UtcHJvdmlkZWQsIG5vdCBzeW5jZWQgd2l0aCB0aGUgc3lzdGVtIGNsb2NrICovCisKK3BjYXBfdAkqcGNhcF9vcGVuX2xpdmUoY29uc3QgY2hhciAqLCBpbnQsIGludCwgaW50LCBjaGFyICopOworcGNhcF90CSpwY2FwX29wZW5fZGVhZChpbnQsIGludCk7CitwY2FwX3QJKnBjYXBfb3Blbl9vZmZsaW5lKGNvbnN0IGNoYXIgKiwgY2hhciAqKTsKKyNpZiBkZWZpbmVkKFdJTjMyKQorcGNhcF90ICAqcGNhcF9ob3Blbl9vZmZsaW5lKGludHB0cl90LCBjaGFyICopOworI2lmICFkZWZpbmVkKExJQlBDQVBfRVhQT1JUUykKKyNkZWZpbmUgcGNhcF9mb3Blbl9vZmZsaW5lKGYsYikgXAorCXBjYXBfaG9wZW5fb2ZmbGluZShfZ2V0X29zZmhhbmRsZShfZmlsZW5vKGYpKSwgYikKKyNlbHNlIC8qTElCUENBUF9FWFBPUlRTKi8KK3N0YXRpYyBwY2FwX3QgKnBjYXBfZm9wZW5fb2ZmbGluZShGSUxFICosIGNoYXIgKik7CisjZW5kaWYKKyNlbHNlIC8qV0lOMzIqLworcGNhcF90CSpwY2FwX2ZvcGVuX29mZmxpbmUoRklMRSAqLCBjaGFyICopOworI2VuZGlmIC8qV0lOMzIqLworCit2b2lkCXBjYXBfY2xvc2UocGNhcF90ICopOworaW50CXBjYXBfbG9vcChwY2FwX3QgKiwgaW50LCBwY2FwX2hhbmRsZXIsIHVfY2hhciAqKTsKK2ludAlwY2FwX2Rpc3BhdGNoKHBjYXBfdCAqLCBpbnQsIHBjYXBfaGFuZGxlciwgdV9jaGFyICopOworY29uc3QgdV9jaGFyKgorCXBjYXBfbmV4dChwY2FwX3QgKiwgc3RydWN0IHBjYXBfcGt0aGRyICopOworaW50IAlwY2FwX25leHRfZXgocGNhcF90ICosIHN0cnVjdCBwY2FwX3BrdGhkciAqKiwgY29uc3QgdV9jaGFyICoqKTsKK3ZvaWQJcGNhcF9icmVha2xvb3AocGNhcF90ICopOworaW50CXBjYXBfc3RhdHMocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXQgKik7CitpbnQJcGNhcF9zZXRmaWx0ZXIocGNhcF90ICosIHN0cnVjdCBicGZfcHJvZ3JhbSAqKTsKK2ludCAJcGNhcF9zZXRkaXJlY3Rpb24ocGNhcF90ICosIHBjYXBfZGlyZWN0aW9uX3QpOworaW50CXBjYXBfZ2V0bm9uYmxvY2socGNhcF90ICosIGNoYXIgKik7CitpbnQJcGNhcF9zZXRub25ibG9jayhwY2FwX3QgKiwgaW50LCBjaGFyICopOworaW50CXBjYXBfaW5qZWN0KHBjYXBfdCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CitpbnQJcGNhcF9zZW5kcGFja2V0KHBjYXBfdCAqLCBjb25zdCB1X2NoYXIgKiwgaW50KTsKK2NvbnN0IGNoYXIgKnBjYXBfc3RhdHVzdG9zdHIoaW50KTsKK2NvbnN0IGNoYXIgKnBjYXBfc3RyZXJyb3IoaW50KTsKK2NoYXIJKnBjYXBfZ2V0ZXJyKHBjYXBfdCAqKTsKK3ZvaWQJcGNhcF9wZXJyb3IocGNhcF90ICosIGNoYXIgKik7CitpbnQJcGNhcF9jb21waWxlKHBjYXBfdCAqLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwgY29uc3QgY2hhciAqLCBpbnQsCisJICAgIGJwZl91X2ludDMyKTsKK2ludAlwY2FwX2NvbXBpbGVfbm9wY2FwKGludCwgaW50LCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwKKwkgICAgY29uc3QgY2hhciAqLCBpbnQsIGJwZl91X2ludDMyKTsKK3ZvaWQJcGNhcF9mcmVlY29kZShzdHJ1Y3QgYnBmX3Byb2dyYW0gKik7CitpbnQJcGNhcF9vZmZsaW5lX2ZpbHRlcihzdHJ1Y3QgYnBmX3Byb2dyYW0gKiwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICosCisJICAgIGNvbnN0IHVfY2hhciAqKTsKK2ludAlwY2FwX2RhdGFsaW5rKHBjYXBfdCAqKTsKK2ludAlwY2FwX2RhdGFsaW5rX2V4dChwY2FwX3QgKik7CitpbnQJcGNhcF9saXN0X2RhdGFsaW5rcyhwY2FwX3QgKiwgaW50ICoqKTsKK2ludAlwY2FwX3NldF9kYXRhbGluayhwY2FwX3QgKiwgaW50KTsKK3ZvaWQJcGNhcF9mcmVlX2RhdGFsaW5rcyhpbnQgKik7CitpbnQJcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbChjb25zdCBjaGFyICopOworY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZShpbnQpOworY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fZGVzY3JpcHRpb24oaW50KTsKK2ludAlwY2FwX3NuYXBzaG90KHBjYXBfdCAqKTsKK2ludAlwY2FwX2lzX3N3YXBwZWQocGNhcF90ICopOworaW50CXBjYXBfbWFqb3JfdmVyc2lvbihwY2FwX3QgKik7CitpbnQJcGNhcF9taW5vcl92ZXJzaW9uKHBjYXBfdCAqKTsKKworLyogWFhYICovCitGSUxFCSpwY2FwX2ZpbGUocGNhcF90ICopOworaW50CXBjYXBfZmlsZW5vKHBjYXBfdCAqKTsKKworcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX29wZW4ocGNhcF90ICosIGNvbnN0IGNoYXIgKik7CitwY2FwX2R1bXBlcl90ICpwY2FwX2R1bXBfZm9wZW4ocGNhcF90ICosIEZJTEUgKmZwKTsKK0ZJTEUJKnBjYXBfZHVtcF9maWxlKHBjYXBfZHVtcGVyX3QgKik7Citsb25nCXBjYXBfZHVtcF9mdGVsbChwY2FwX2R1bXBlcl90ICopOworaW50CXBjYXBfZHVtcF9mbHVzaChwY2FwX2R1bXBlcl90ICopOwordm9pZAlwY2FwX2R1bXBfY2xvc2UocGNhcF9kdW1wZXJfdCAqKTsKK3ZvaWQJcGNhcF9kdW1wKHVfY2hhciAqLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKiwgY29uc3QgdV9jaGFyICopOworCitpbnQJcGNhcF9maW5kYWxsZGV2cyhwY2FwX2lmX3QgKiosIGNoYXIgKik7Cit2b2lkCXBjYXBfZnJlZWFsbGRldnMocGNhcF9pZl90ICopOworCitjb25zdCBjaGFyICpwY2FwX2xpYl92ZXJzaW9uKHZvaWQpOworCisvKgorICogT24gYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyBvZiBOZXRCU0QsIHdlIGRvbid0IHdhbnQgdG8gZGVjbGFyZQorICogYnBmX2ZpbHRlcigpIGhlcmUsIGFzIGl0J3MgYWxzbyBiZSBkZWNsYXJlZCBpbiA8bmV0L2JwZi5oPiwgd2l0aCBhCisgKiBkaWZmZXJlbnQgc2lnbmF0dXJlLCBidXQsIG9uIG90aGVyIEJTRC1mbGF2b3JlZCBVTipYZXMsIGl0J3Mgbm90CisgKiBkZWNsYXJlZCBpbiA8bmV0L2JwZi5oPiwgc28gd2UgKmRvKiB3YW50IHRvIGRlY2xhcmUgaXQgaGVyZSwgc28gaXQncworICogZGVjbGFyZWQgd2hlbiB3ZSBidWlsZCBwY2FwLWJwZi5jLgorICovCisjaWZuZGVmIF9fTmV0QlNEX18KK3VfaW50CWJwZl9maWx0ZXIoY29uc3Qgc3RydWN0IGJwZl9pbnNuICosIGNvbnN0IHVfY2hhciAqLCB1X2ludCwgdV9pbnQpOworI2VuZGlmCitpbnQJYnBmX3ZhbGlkYXRlKGNvbnN0IHN0cnVjdCBicGZfaW5zbiAqZiwgaW50IGxlbik7CitjaGFyCSpicGZfaW1hZ2UoY29uc3Qgc3RydWN0IGJwZl9pbnNuICosIGludCk7Cit2b2lkCWJwZl9kdW1wKGNvbnN0IHN0cnVjdCBicGZfcHJvZ3JhbSAqLCBpbnQpOworCisjaWYgZGVmaW5lZChXSU4zMikKKworLyoKKyAqIFdpbjMyIGRlZmluaXRpb25zCisgKi8KKworaW50IHBjYXBfc2V0YnVmZihwY2FwX3QgKnAsIGludCBkaW0pOworaW50IHBjYXBfc2V0bW9kZShwY2FwX3QgKnAsIGludCBtb2RlKTsKK2ludCBwY2FwX3NldG1pbnRvY29weShwY2FwX3QgKnAsIGludCBzaXplKTsKKworI2lmZGVmIFdQQ0FQCisvKiBJbmNsdWRlIGZpbGUgd2l0aCB0aGUgd3BjYXAtc3BlY2lmaWMgZXh0ZW5zaW9ucyAqLworI2luY2x1ZGUgPFdpbjMyLUV4dGVuc2lvbnMuaD4KKyNlbmRpZiAvKiBXUENBUCAqLworCisjZGVmaW5lIE1PREVfQ0FQVCAwCisjZGVmaW5lIE1PREVfU1RBVCAxCisjZGVmaW5lIE1PREVfTU9OIDIKKworI2VsaWYgZGVmaW5lZChNU0RPUykKKworLyoKKyAqIE1TLURPUyBkZWZpbml0aW9ucworICovCisKK2ludCAgcGNhcF9zdGF0c19leCAocGNhcF90ICosIHN0cnVjdCBwY2FwX3N0YXRfZXggKik7Cit2b2lkIHBjYXBfc2V0X3dhaXQgKHBjYXBfdCAqcCwgdm9pZCAoKnlpZWxkKSh2b2lkKSwgaW50IHdhaXQpOwordV9sb25nIHBjYXBfbWFjX3BhY2tldHMgKHZvaWQpOworCisjZWxzZSAvKiBVTipYICovCisKKy8qCisgKiBVTipYIGRlZmluaXRpb25zCisgKi8KKworaW50CXBjYXBfZ2V0X3NlbGVjdGFibGVfZmQocGNhcF90ICopOworCisjZW5kaWYgLyogV0lOMzIvTVNET1MvVU4qWCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogbGliX3BjYXBfcGNhcF9oICovCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXAvc2xsLmggYi9saWJwY2FwLTEuMy4wL3BjYXAvc2xsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkODExZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcC9zbGwuaApAQCAtMCwwICsxLDEyOSBAQAorLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gdGhlIFN0YW5mb3JkL0NNVSBlbmV0IHBhY2tldCBmaWx0ZXIsCisgKiAobmV0L2VuZXQuYykgZGlzdHJpYnV0ZWQgYXMgcGFydCBvZiA0LjNCU0QsIGFuZCBjb2RlIGNvbnRyaWJ1dGVkCisgKiB0byBCZXJrZWxleSBieSBTdGV2ZW4gTWNDYW5uZSBhbmQgVmFuIEphY29ic29uIGJvdGggb2YgTGF3cmVuY2UKKyAqIEJlcmtlbGV5IExhYm9yYXRvcnkuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorICogICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwL3NsbC5oLHYgMS4zIDIwMDgtMDUtMzAgMDE6MzU6MzMgZ3V5IEV4cCAkIChMQkwpCisgKi8KKworLyoKKyAqIEZvciBjYXB0dXJlcyBvbiBMaW51eCBjb29rZWQgc29ja2V0cywgd2UgY29uc3RydWN0IGEgZmFrZSBoZWFkZXIKKyAqIHRoYXQgaW5jbHVkZXM6CisgKgorICoJYSAyLWJ5dGUgInBhY2tldCB0eXBlIiB3aGljaCBpcyBvbmUgb2Y6CisgKgorICoJCUxJTlVYX1NMTF9IT1NUCQlwYWNrZXQgd2FzIHNlbnQgdG8gdXMKKyAqCQlMSU5VWF9TTExfQlJPQURDQVNUCXBhY2tldCB3YXMgYnJvYWRjYXN0CisgKgkJTElOVVhfU0xMX01VTFRJQ0FTVAlwYWNrZXQgd2FzIG11bHRpY2FzdAorICoJCUxJTlVYX1NMTF9PVEhFUkhPU1QJcGFja2V0IHdhcyBzZW50IHRvIHNvbWVib2R5IGVsc2UKKyAqCQlMSU5VWF9TTExfT1VUR09JTkcJcGFja2V0IHdhcyBzZW50ICpieSogdXM7CisgKgorICoJYSAyLWJ5dGUgRXRoZXJuZXQgcHJvdG9jb2wgZmllbGQ7CisgKgorICoJYSAyLWJ5dGUgbGluay1sYXllciB0eXBlOworICoKKyAqCWEgMi1ieXRlIGxpbmstbGF5ZXIgYWRkcmVzcyBsZW5ndGg7CisgKgorICoJYW4gOC1ieXRlIHNvdXJjZSBsaW5rLWxheWVyIGFkZHJlc3MsIHdob3NlIGFjdHVhbCBsZW5ndGggaXMKKyAqCXNwZWNpZmllZCBieSB0aGUgcHJldmlvdXMgdmFsdWUuCisgKgorICogQWxsIGZpZWxkcyBleGNlcHQgZm9yIHRoZSBsaW5rLWxheWVyIGFkZHJlc3MgYXJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqCisgKiBETyBOT1QgY2hhbmdlIHRoZSBsYXlvdXQgb2YgdGhpcyBzdHJ1Y3R1cmUsIG9yIGNoYW5nZSBhbnkgb2YgdGhlCisgKiBMSU5VWF9TTExfIHZhbHVlcyBiZWxvdy4gIElmIHlvdSBtdXN0IGNoYW5nZSB0aGUgbGluay1sYXllciBoZWFkZXIKKyAqIGZvciBhICJjb29rZWQiIExpbnV4IGNhcHR1cmUsIGludHJvZHVjZSBhIG5ldyBETFRfIHR5cGUgKGFzaworICogInRjcGR1bXAtd29ya2Vyc0BsaXN0cy50Y3BkdW1wLm9yZyIgZm9yIG9uZSwgc28gdGhhdCB5b3UgZG9uJ3QgZ2l2ZSBpdAorICogYSB2YWx1ZSB0aGF0IGNvbGxpZGVzIHdpdGggYSB2YWx1ZSBhbHJlYWR5IGJlaW5nIHVzZWQpLCBhbmQgdXNlIHRoZQorICogbmV3IGhlYWRlciBpbiBjYXB0dXJlcyBvZiB0aGF0IHR5cGUsIHNvIHRoYXQgcHJvZ3JhbXMgdGhhdCBjYW4KKyAqIGhhbmRsZSBETFRfTElOVVhfU0xMIGNhcHR1cmVzIHdpbGwgY29udGludWUgdG8gaGFuZGxlIHRoZW0gY29ycmVjdGx5CisgKiB3aXRob3V0IGFueSBjaGFuZ2UsIGFuZCBzbyB0aGF0IGNhcHR1cmUgZmlsZXMgd2l0aCBkaWZmZXJlbnQgaGVhZGVycworICogY2FuIGJlIHRvbGQgYXBhcnQgYW5kIHByb2dyYW1zIHRoYXQgcmVhZCB0aGVtIGNhbiBkaXNzZWN0IHRoZQorICogcGFja2V0cyBpbiB0aGVtLgorICovCisKKyNpZm5kZWYgbGliX3BjYXBfc2xsX2gKKyNkZWZpbmUgbGliX3BjYXBfc2xsX2gKKworLyoKKyAqIEEgRExUX0xJTlVYX1NMTCBmYWtlIGxpbmstbGF5ZXIgaGVhZGVyLgorICovCisjZGVmaW5lIFNMTF9IRFJfTEVOCTE2CQkvKiB0b3RhbCBoZWFkZXIgbGVuZ3RoICovCisjZGVmaW5lIFNMTF9BRERSTEVOCTgJCS8qIGxlbmd0aCBvZiBhZGRyZXNzIGZpZWxkICovCisKK3N0cnVjdCBzbGxfaGVhZGVyIHsKKwl1X2ludDE2X3Qgc2xsX3BrdHR5cGU7CQkvKiBwYWNrZXQgdHlwZSAqLworCXVfaW50MTZfdCBzbGxfaGF0eXBlOwkJLyogbGluay1sYXllciBhZGRyZXNzIHR5cGUgKi8KKwl1X2ludDE2X3Qgc2xsX2hhbGVuOwkJLyogbGluay1sYXllciBhZGRyZXNzIGxlbmd0aCAqLworCXVfaW50OF90IHNsbF9hZGRyW1NMTF9BRERSTEVOXTsJLyogbGluay1sYXllciBhZGRyZXNzICovCisJdV9pbnQxNl90IHNsbF9wcm90b2NvbDsJCS8qIHByb3RvY29sICovCit9OworCisvKgorICogVGhlIExJTlVYX1NMTF8gdmFsdWVzIGZvciAic2xsX3BrdHR5cGUiOyB0aGVzZSBjb3JyZXNwb25kIHRvIHRoZQorICogUEFDS0VUXyB2YWx1ZXMgb24gTGludXgsIGJ1dCBhcmUgZGVmaW5lZCBoZXJlIHNvIHRoYXQgdGhleSdyZQorICogYXZhaWxhYmxlIGV2ZW4gb24gc3lzdGVtcyBvdGhlciB0aGFuIExpbnV4LCBhbmQgc28gdGhhdCB0aGV5CisgKiBkb24ndCBjaGFuZ2UgZXZlbiBpZiB0aGUgUEFDS0VUXyB2YWx1ZXMgY2hhbmdlLgorICovCisjZGVmaW5lIExJTlVYX1NMTF9IT1NUCQkwCisjZGVmaW5lIExJTlVYX1NMTF9CUk9BRENBU1QJMQorI2RlZmluZSBMSU5VWF9TTExfTVVMVElDQVNUCTIKKyNkZWZpbmUgTElOVVhfU0xMX09USEVSSE9TVAkzCisjZGVmaW5lIExJTlVYX1NMTF9PVVRHT0lORwk0CisKKy8qCisgKiBUaGUgTElOVVhfU0xMXyB2YWx1ZXMgZm9yICJzbGxfcHJvdG9jb2wiOyB0aGVzZSBjb3JyZXNwb25kIHRvIHRoZQorICogRVRIX1BfIHZhbHVlcyBvbiBMaW51eCwgYnV0IGFyZSBkZWZpbmVkIGhlcmUgc28gdGhhdCB0aGV5J3JlCisgKiBhdmFpbGFibGUgZXZlbiBvbiBzeXN0ZW1zIG90aGVyIHRoYW4gTGludXguICBXZSBhc3N1bWUsIGZvciBub3csCisgKiB0aGF0IHRoZSBFVEhfUF8gdmFsdWVzIHdvbid0IGNoYW5nZSBpbiBMaW51eDsgaWYgdGhleSBkbywgdGhlbjoKKyAqCisgKglpZiB3ZSBkb24ndCB0cmFuc2xhdGUgdGhlbSBpbiAicGNhcC1saW51eC5jIiwgY2FwdHVyZSBmaWxlcworICoJd29uJ3QgbmVjZXNzYXJpbHkgYmUgcmVhZGFibGUgaWYgY2FwdHVyZWQgb24gYSBzeXN0ZW0gdGhhdAorICoJZGVmaW5lcyBFVEhfUF8gdmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlc2UgdmFsdWVzOworICoKKyAqCWlmIHdlIGRvIHRyYW5zbGF0ZSB0aGVtIGluICJwY2FwLWxpbnV4LmMiLCB0aGF0IG1ha2VzIGxpZmUKKyAqCXVucGxlYXNhbnQgZm9yIHRoZSBCUEYgY29kZSBnZW5lcmF0b3IsIGFzIHRoZSB2YWx1ZXMgeW91IHRlc3QKKyAqCWZvciBpbiB0aGUga2VybmVsIGFyZW4ndCB0aGUgdmFsdWVzIHRoYXQgeW91IHRlc3QgZm9yIHdoZW4KKyAqCXJlYWRpbmcgYSBjYXB0dXJlIGZpbGUsIHNvIHRoZSBmaXh1cCBjb2RlIHJ1biBvbiBCUEYgcHJvZ3JhbXMKKyAqCWhhbmRlZCB0byB0aGUga2VybmVsIGVuZHMgdXAgaGF2aW5nIHRvIGRvIG1vcmUgd29yay4KKyAqCisgKiBBZGQgb3RoZXIgdmFsdWVzIGhlcmUgYXMgbmVjZXNzYXJ5LCBmb3IgaGFuZGxpbmcgcGFja2V0IHR5cGVzIHRoYXQKKyAqIG1pZ2h0IHNob3cgdXAgb24gbm9uLUV0aGVybmV0LCBub24tODAyLnggbmV0d29ya3MuICAoTm90IGFsbCB0aGUgb25lcworICogaW4gdGhlIExpbnV4ICJpZl9ldGhlci5oIiB3aWxsLCBJIHN1c3BlY3QsIGFjdHVhbGx5IHNob3cgdXAgaW4KKyAqIGNhcHR1cmVzLikKKyAqLworI2RlZmluZSBMSU5VWF9TTExfUF84MDJfMwkweDAwMDEJLyogTm92ZWxsIDgwMi4zIGZyYW1lcyB3aXRob3V0IDgwMi4yIExMQyBoZWFkZXIgKi8KKyNkZWZpbmUgTElOVVhfU0xMX1BfODAyXzIJMHgwMDA0CS8qIDgwMi4yIGZyYW1lcyAobm90IEQvSS9YIEV0aGVybmV0KSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC91c2IuaCBiL2xpYnBjYXAtMS4zLjAvcGNhcC91c2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTM1MTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwL3VzYi5oCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFBhb2xvIEFiZW5pIChJdGFseSkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIAorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIAorICogcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEJhc2ljIFVTQiBkYXRhIHN0cnVjdAorICogQnkgUGFvbG8gQWJlbmkgPHBhb2xvLmFiZW5pQGVtYWlsLml0PgorICoKKyAqIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcC91c2IuaCx2IDEuOSAyMDA4LTEyLTIzIDIwOjEzOjI5IGd1eSBFeHAgJAorICovCisgCisjaWZuZGVmIF9QQ0FQX1VTQl9TVFJVQ1RTX0hfXworI2RlZmluZSBfUENBUF9VU0JfU1RSVUNUU19IX18KKworLyogCisgKiBwb3NzaWJsZSB0cmFuc2ZlciBtb2RlCisgKi8KKyNkZWZpbmUgVVJCX1RSQU5TRkVSX0lOICAgMHg4MAorI2RlZmluZSBVUkJfSVNPQ0hST05PVVMgICAweDAKKyNkZWZpbmUgVVJCX0lOVEVSUlVQVCAgICAgMHgxCisjZGVmaW5lIFVSQl9DT05UUk9MICAgICAgIDB4MgorI2RlZmluZSBVUkJfQlVMSyAgICAgICAgICAweDMKKworLyoKKyAqIHBvc3NpYmxlIGV2ZW50IHR5cGUKKyAqLworI2RlZmluZSBVUkJfU1VCTUlUICAgICAgICAnUycKKyNkZWZpbmUgVVJCX0NPTVBMRVRFICAgICAgJ0MnCisjZGVmaW5lIFVSQl9FUlJPUiAgICAgICAgICdFJworCisvKgorICogVVNCIHNldHVwIGhlYWRlciBhcyBkZWZpbmVkIGluIFVTQiBzcGVjaWZpY2F0aW9uLgorICogQXBwZWFycyBhdCB0aGUgZnJvbnQgb2YgZWFjaCBDb250cm9sIFMtdHlwZSBwYWNrZXQgaW4gRExUX1VTQiBjYXB0dXJlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX3VzYl9zZXR1cCB7CisJdV9pbnQ4X3QgYm1SZXF1ZXN0VHlwZTsKKwl1X2ludDhfdCBiUmVxdWVzdDsKKwl1X2ludDE2X3Qgd1ZhbHVlOworCXVfaW50MTZfdCB3SW5kZXg7CisJdV9pbnQxNl90IHdMZW5ndGg7Cit9IHBjYXBfdXNiX3NldHVwOworCisvKgorICogSW5mb3JtYXRpb24gZnJvbSB0aGUgVVJCIGZvciBJc29jaHJvbm91cyB0cmFuc2ZlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF9pc29fcmVjIHsKKwlpbnQzMl90CWVycm9yX2NvdW50OworCWludDMyX3QJbnVtZGVzYzsKK30gaXNvX3JlYzsKKworLyoKKyAqIEhlYWRlciBwcmVwZW5kZWQgYnkgbGludXgga2VybmVsIHRvIGVhY2ggZXZlbnQuCisgKiBBcHBlYXJzIGF0IHRoZSBmcm9udCBvZiBlYWNoIHBhY2tldCBpbiBETFRfVVNCX0xJTlVYIGNhcHR1cmVzLgorICovCit0eXBlZGVmIHN0cnVjdCBfdXNiX2hlYWRlciB7CisJdV9pbnQ2NF90IGlkOworCXVfaW50OF90IGV2ZW50X3R5cGU7CisJdV9pbnQ4X3QgdHJhbnNmZXJfdHlwZTsKKwl1X2ludDhfdCBlbmRwb2ludF9udW1iZXI7CisJdV9pbnQ4X3QgZGV2aWNlX2FkZHJlc3M7CisJdV9pbnQxNl90IGJ1c19pZDsKKwljaGFyIHNldHVwX2ZsYWc7LyppZiAhPTAgdGhlIHVyYiBzZXR1cCBoZWFkZXIgaXMgbm90IHByZXNlbnQqLworCWNoYXIgZGF0YV9mbGFnOyAvKmlmICE9MCBubyB1cmIgZGF0YSBpcyBwcmVzZW50Ki8KKwlpbnQ2NF90IHRzX3NlYzsKKwlpbnQzMl90IHRzX3VzZWM7CisJaW50MzJfdCBzdGF0dXM7CisJdV9pbnQzMl90IHVyYl9sZW47CisJdV9pbnQzMl90IGRhdGFfbGVuOyAvKiBhbW91bnQgb2YgdXJiIGRhdGEgcmVhbGx5IHByZXNlbnQgaW4gdGhpcyBldmVudCovCisJcGNhcF91c2Jfc2V0dXAgc2V0dXA7Cit9IHBjYXBfdXNiX2hlYWRlcjsKKworLyoKKyAqIEhlYWRlciBwcmVwZW5kZWQgYnkgbGludXgga2VybmVsIHRvIGVhY2ggZXZlbnQgZm9yIHRoZSAyLjYuMzEKKyAqIGFuZCBsYXRlciBrZXJuZWxzOyBmb3IgdGhlIDIuNi4yMSB0aHJvdWdoIDIuNi4zMCBrZXJuZWxzLCB0aGUKKyAqICJpc29fcmVjIiBpbmZvcm1hdGlvbiwgYW5kIHRoZSBmaWVsZHMgc3RhcnRpbmcgd2l0aCAiaW50ZXJ2YWwiCisgKiBhcmUgemVyb2VkLW91dCBwYWRkaW5nIGZpZWxkcy4KKyAqCisgKiBBcHBlYXJzIGF0IHRoZSBmcm9udCBvZiBlYWNoIHBhY2tldCBpbiBETFRfVVNCX0xJTlVYX01NQVBQRUQgY2FwdHVyZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF91c2JfaGVhZGVyX21tYXBwZWQgeworCXVfaW50NjRfdCBpZDsKKwl1X2ludDhfdCBldmVudF90eXBlOworCXVfaW50OF90IHRyYW5zZmVyX3R5cGU7CisJdV9pbnQ4X3QgZW5kcG9pbnRfbnVtYmVyOworCXVfaW50OF90IGRldmljZV9hZGRyZXNzOworCXVfaW50MTZfdCBidXNfaWQ7CisJY2hhciBzZXR1cF9mbGFnOy8qaWYgIT0wIHRoZSB1cmIgc2V0dXAgaGVhZGVyIGlzIG5vdCBwcmVzZW50Ki8KKwljaGFyIGRhdGFfZmxhZzsgLyppZiAhPTAgbm8gdXJiIGRhdGEgaXMgcHJlc2VudCovCisJaW50NjRfdCB0c19zZWM7CisJaW50MzJfdCB0c191c2VjOworCWludDMyX3Qgc3RhdHVzOworCXVfaW50MzJfdCB1cmJfbGVuOworCXVfaW50MzJfdCBkYXRhX2xlbjsgLyogYW1vdW50IG9mIHVyYiBkYXRhIHJlYWxseSBwcmVzZW50IGluIHRoaXMgZXZlbnQqLworCXVuaW9uIHsKKwkJcGNhcF91c2Jfc2V0dXAgc2V0dXA7CisJCWlzb19yZWMgaXNvOworCX0gczsKKwlpbnQzMl90CWludGVydmFsOwkvKiBmb3IgSW50ZXJydXB0IGFuZCBJc29jaHJvbm91cyBldmVudHMgKi8KKwlpbnQzMl90IHN0YXJ0X2ZyYW1lOwkvKiBmb3IgSXNvY2hyb25vdXMgZXZlbnRzICovCisJdV9pbnQzMl90IHhmZXJfZmxhZ3M7CS8qIGNvcHkgb2YgVVJCJ3MgdHJhbnNmZXIgZmxhZ3MgKi8KKwl1X2ludDMyX3QgbmRlc2M7CS8qIG51bWJlciBvZiBpc29jaHJvbm91cyBkZXNjcmlwdG9ycyAqLworfSBwY2FwX3VzYl9oZWFkZXJfbW1hcHBlZDsKKworLyoKKyAqIElzb2Nocm9ub3VzIGRlc2NyaXB0b3JzOyBmb3IgaXNvY2hyb25vdXMgdHJhbnNmZXJzIHRoZXJlIG1pZ2h0IGJlCisgKiBvbmUgb3IgbW9yZSBvZiB0aGVzZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgZGF0YS4gIFRoZQorICogbnVtYmVyIG9mIGRlc2NyaXB0b3JzIGlzIGdpdmVuIGJ5IHRoZSAibmRlc2MiIGZpZWxkIGluIHRoZSBoZWFkZXI7CisgKiBhcyBpbmRpY2F0ZWQsIGluIG9sZGVyIGtlcm5lbHMgdGhhdCBkb24ndCBwdXQgdGhlIGRlc2NyaXB0b3JzIGF0CisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQsIHRoYXQgZmllbGQgaXMgemVyb2VkIG91dCwgc28gdGhhdCBmaWVsZAorICogY2FuIGJlIHRydXN0ZWQgZXZlbiBpbiBjYXB0dXJlcyBmcm9tIG9sZGVyIGtlcm5lbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IF91c2JfaXNvZGVzYyB7CisJaW50MzJfdAkJc3RhdHVzOworCXVfaW50MzJfdAlvZmZzZXQ7CisJdV9pbnQzMl90CWxlbjsKKwl1X2ludDhfdAlwYWRbNF07Cit9IHVzYl9pc29kZXNjOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcC92bGFuLmggYi9saWJwY2FwLTEuMy4wL3BjYXAvdmxhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYWE4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXAvdmxhbi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXAvdmxhbi5oLHYgMS4xIDIwMDgtMDgtMDYgMDc6NDU6MDAgZ3V5IEV4cCAkCisgKi8KKworI2lmbmRlZiBsaWJfcGNhcF92bGFuX2gKKyNkZWZpbmUgbGliX3BjYXBfdmxhbl9oCisKK3N0cnVjdCB2bGFuX3RhZyB7CisJdV9pbnQxNl90CXZsYW5fdHBpZDsJCS8qIEVUSF9QXzgwMjFRICovCisJdV9pbnQxNl90CXZsYW5fdGNpOwkJLyogVkxBTiBUQ0kgKi8KK307CisKKyNkZWZpbmUgVkxBTl9UQUdfTEVOCTQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfYWN0aXZhdGUuM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfYWN0aXZhdGUuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2M2QzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9hY3RpdmF0ZS4zcGNhcApAQCAtMCwwICsxLDk3IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2FjdGl2YXRlLjNwY2FwLHYgMS41IDIwMDgtMDctMDEgMDg6MDI6MzMgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9BQ1RJVkFURSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfYWN0aXZhdGUgXC0gYWN0aXZhdGUgYSBjYXB0dXJlIGhhbmRsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2FjdGl2YXRlKHBjYXBfdCAqcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2FjdGl2YXRlKCkKK2lzIHVzZWQgdG8gYWN0aXZhdGUgYSBwYWNrZXQgY2FwdHVyZSBoYW5kbGUgdG8gbG9vaworYXQgcGFja2V0cyBvbiB0aGUgbmV0d29yaywgd2l0aCB0aGUgb3B0aW9ucyB0aGF0IHdlcmUgc2V0IG9uIHRoZSBoYW5kbGUKK2JlaW5nIGluIGVmZmVjdC4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfYWN0aXZhdGUoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3Mgd2l0aG91dCB3YXJuaW5ncywKKy5CIFBDQVBfV0FSTklOR19QUk9NSVNDX05PVFNVUAorb24gc3VjY2VzcyBvbiBhIGRldmljZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBwcm9taXNjdW91cyBtb2RlIGlmCitwcm9taXNjdW91cyBtb2RlIHdhcyByZXF1ZXN0ZWQsCisuQiBQQ0FQX1dBUk5JTkdfVFNUQU1QX1RZUEVfTk9UU1VQCitvbiBzdWNjZXNzIGlmIHRoZSB0aW1lIHN0YW1wIHR5cGUgc3BlY2lmaWVkIGluIGEgcHJldmlvdXMKKy5CIHBjYXBfc2V0X3RzdGFtcF90eXBlKCkKK2NhbGwgaXNuJ3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYXB0dXJlIHNvdXJjZSAodGhlIHRpbWUgc3RhbXAgdHlwZSBpcworbGVmdCBhcyB0aGUgZGVmYXVsdCksCisuQiBQQ0FQX1dBUk5JTkcKK29uIHN1Y2Nlc3Mgd2l0aCBhbnkgb3RoZXIgd2FybmluZywKKy5CIFBDQVBfRVJST1JfQUNUSVZBVEVECitpZiB0aGUgaGFuZGxlIGhhcyBhbHJlYWR5IGJlZW4gYWN0aXZhdGVkLAorLkIgUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRQoraWYgdGhlIGNhcHR1cmUgc291cmNlIHNwZWNpZmllZCB3aGVuIHRoZSBoYW5kbGUgd2FzIGNyZWF0ZWQgZG9lc24ndAorZXhpc3QsCisuQiBQQ0FQX0VSUk9SX1BFUk1fREVOSUVECitpZiB0aGUgcHJvY2VzcyBkb2Vzbid0IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIHRoZSBjYXB0dXJlIHNvdXJjZSwKKy5CIFBDQVBfRVJST1JfUFJPTUlTQ19QRVJNX0RFTklFRAoraWYgdGhlIHByb2Nlc3MgaGFzIHBlcm1pc3Npb24gdG8gb3BlbiB0aGUgY2FwdHVyZSBzb3VyY2UgYnV0IGRvZXNuJ3QKK2hhdmUgcGVybWlzc2lvbiB0byBwdXQgaXQgaW50byBwcm9taXNjdW91cyBtb2RlLAorLkIgUENBUF9FUlJPUl9SRk1PTl9OT1RTVVAKK2lmIG1vbml0b3IgbW9kZSB3YXMgc3BlY2lmaWVkIGJ1dCB0aGUgY2FwdHVyZSBzb3VyY2UgZG9lc24ndCBzdXBwb3J0Cittb25pdG9yIG1vZGUsCisuQiBQQ0FQX0VSUk9SX0lGQUNFX05PVF9VUAoraWYgdGhlIGNhcHR1cmUgc291cmNlIGlzIG5vdCB1cCwgYW5kCisuQiBQQ0FQX0VSUk9SCitpZiBhbm90aGVyIGVycm9yIG9jY3VycmVkLgorSWYKKy5CIFBDQVBfV0FSTklORworb3IKKy5CIFBDQVBfRVJST1IKK2lzIHJldHVybmVkLAorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgd2FybmluZyBvcgorZXJyb3IuCitJZgorLkJSIFBDQVBfV0FSTklOR19QUk9NSVNDX05PVFNVUCAsCisuQlIgUENBUF9FUlJPUl9OT19TVUNIX0RFVklDRSAsCitvcgorLkIgUENBUF9FUlJPUl9QRVJNX0RFTklFRAoraXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IGFuIG1lc3NhZ2UgZ2l2aW5nIGFkZGl0aW9uYWwgZGV0YWlscworYWJvdXQgdGhlIHByb2JsZW0gdGhhdCBtaWdodCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyB0aGUgcHJvYmxlbSBpZiBpdCdzCit1bmV4cGVjdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2JyZWFrbG9vcC4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9icmVha2xvb3AuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3MjM0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9icmVha2xvb3AuM3BjYXAKQEAgLTAsMCArMSwxMDUgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfYnJlYWtsb29wLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9CUkVBS0xPT1AgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2JyZWFrbG9vcCBcLSBmb3JjZSBhIHBjYXBfZGlzcGF0Y2goKSBvciBwY2FwX2xvb3AoKSBjYWxsIHRvIHJldHVybgorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK3ZvaWQgcGNhcF9icmVha2xvb3AocGNhcF90ICopOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9icmVha2xvb3AoKQorc2V0cyBhIGZsYWcgdGhhdCB3aWxsIGZvcmNlCisuQiBwY2FwX2Rpc3BhdGNoKCkKK29yCisuQiBwY2FwX2xvb3AoKQordG8gcmV0dXJuIHJhdGhlciB0aGFuIGxvb3Bpbmc7IHRoZXkgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBwYWNrZXRzCit0aGF0IGhhdmUgYmVlbiBwcm9jZXNzZWQgc28gZmFyLCBvciBcLTIgaWYgbm8gcGFja2V0cyBoYXZlIGJlZW4KK3Byb2Nlc3NlZCBzbyBmYXIuCisuUFAKK1RoaXMgcm91dGluZSBpcyBzYWZlIHRvIHVzZSBpbnNpZGUgYSBzaWduYWwgaGFuZGxlciBvbiBVTklYIG9yIGEgY29uc29sZQorY29udHJvbCBoYW5kbGVyIG9uIFdpbmRvd3MsIGFzIGl0IG1lcmVseSBzZXRzIGEgZmxhZyB0aGF0IGlzIGNoZWNrZWQKK3dpdGhpbiB0aGUgbG9vcC4KKy5QUAorVGhlIGZsYWcgaXMgY2hlY2tlZCBpbiBsb29wcyByZWFkaW5nIHBhY2tldHMgZnJvbSB0aGUgT1MgLSBhIHNpZ25hbCBieQoraXRzZWxmIHdpbGwgbm90IG5lY2Vzc2FyaWx5IHRlcm1pbmF0ZSB0aG9zZSBsb29wcyAtIGFzIHdlbGwgYXMgaW4gbG9vcHMKK3Byb2Nlc3NpbmcgYSBzZXQgb2YgcGFja2V0cyByZXR1cm5lZCBieSB0aGUgT1MuCisuZnQgQgorTm90ZSB0aGF0IGlmIHlvdSBhcmUgY2F0Y2hpbmcgc2lnbmFscyBvbiBVTklYIHN5c3RlbXMgdGhhdCBzdXBwb3J0CityZXN0YXJ0aW5nIHN5c3RlbSBjYWxscyBhZnRlciBhIHNpZ25hbCwgYW5kIGNhbGxpbmcgcGNhcF9icmVha2xvb3AoKQoraW4gdGhlIHNpZ25hbCBoYW5kbGVyLCB5b3UgbXVzdCBzcGVjaWZ5LCB3aGVuIGNhdGNoaW5nIHRob3NlIHNpZ25hbHMsCit0aGF0IHN5c3RlbSBjYWxscyBzaG91bGQgTk9UIGJlIHJlc3RhcnRlZCBieSB0aGF0IHNpZ25hbC4gIE90aGVyd2lzZSwKK2lmIHRoZSBzaWduYWwgaW50ZXJydXB0ZWQgYSBjYWxsIHJlYWRpbmcgcGFja2V0cyBpbiBhIGxpdmUgY2FwdHVyZSwKK3doZW4geW91ciBzaWduYWwgaGFuZGxlciByZXR1cm5zIGFmdGVyIGNhbGxpbmcgcGNhcF9icmVha2xvb3AoKSwgdGhlCitjYWxsIHdpbGwgYmUgcmVzdGFydGVkLCBhbmQgdGhlIGxvb3Agd2lsbCBub3QgdGVybWluYXRlIHVudGlsIG1vcmUKK3BhY2tldHMgYXJyaXZlIGFuZCB0aGUgY2FsbCBjb21wbGV0ZXMuCisuUFAKK05vdGUgYWxzbyB0aGF0LCBpbiBhIG11bHRpLXRocmVhZGVkIGFwcGxpY2F0aW9uLCBpZiBvbmUgdGhyZWFkIGlzCitibG9ja2VkIGluCisuQlIgcGNhcF9kaXNwYXRjaCgpICwKKy5CUiBwY2FwX2xvb3AoKSAsCisuQlIgcGNhcF9uZXh0KCkgLAorb3IKKy5CUiBwY2FwX25leHRfZXgoKSAsCithIGNhbGwgdG8KKy5CIHBjYXBfYnJlYWtsb29wKCkKK2luIGEgZGlmZmVyZW50IHRocmVhZCB3aWxsIG5vdCB1bmJsb2NrIHRoYXQgdGhyZWFkOyB5b3Ugd2lsbCBuZWVkIHRvIHVzZQord2hhdGV2ZXIgbWVjaGFuaXNtIHRoZSBPUyBwcm92aWRlcyBmb3IgYnJlYWtpbmcgYSB0aHJlYWQgb3V0IG9mIGJsb2NraW5nCitjYWxscyBpbiBvcmRlciB0byB1bmJsb2NrIHRoZSB0aHJlYWQsIHN1Y2ggYXMgdGhyZWFkIGNhbmNlbGxhdGlvbiBpbgorc3lzdGVtcyB0aGF0IHN1cHBvcnQgUE9TSVggdGhyZWFkcy4KKy5mdCBSCisuUFAKK05vdGUgdGhhdAorLkIgcGNhcF9uZXh0KCkKK2FuZAorLkIgcGNhcF9uZXh0X2V4KCkKK3dpbGwsIG9uIHNvbWUgcGxhdGZvcm1zLCBsb29wIHJlYWRpbmcgcGFja2V0cyBmcm9tIHRoZSBPUzsgdGhhdCBsb29wCit3aWxsIG5vdCBuZWNlc3NhcmlseSBiZSB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsLCBzbworLkIgcGNhcF9icmVha2xvb3AoKQorc2hvdWxkIGJlIHVzZWQgdG8gdGVybWluYXRlIHBhY2tldCBwcm9jZXNzaW5nIGV2ZW4gaWYKKy5CIHBjYXBfbmV4dCgpCitvcgorLkIgcGNhcF9uZXh0X2V4KCkKK2lzIGJlaW5nIHVzZWQuCisuUFAKKy5CIHBjYXBfYnJlYWtsb29wKCkKK2RvZXMgbm90IGd1YXJhbnRlZSB0aGF0IG5vIGZ1cnRoZXIgcGFja2V0cyB3aWxsIGJlIHByb2Nlc3NlZCBieQorLkIgcGNhcF9kaXNwYXRjaCgpCitvcgorLkIgcGNhcF9sb29wKCkKK2FmdGVyIGl0IGlzIGNhbGxlZDsgYXQgbW9zdCBvbmUgbW9yZSBwYWNrZXQgbWlnaHQgYmUgcHJvY2Vzc2VkLgorLlBQCitJZiBcLTIgaXMgcmV0dXJuZWQgZnJvbQorLkIgcGNhcF9kaXNwYXRjaCgpCitvcgorLkJSIHBjYXBfbG9vcCgpICwKK3RoZSBmbGFnIGlzIGNsZWFyZWQsIHNvIGEgc3Vic2VxdWVudCBjYWxsIHdpbGwgcmVzdW1lIHJlYWRpbmcgcGFja2V0cy4gCitJZiBhIHBvc2l0aXZlIG51bWJlciBpcyByZXR1cm5lZCwgdGhlIGZsYWcgaXMgbm90IGNsZWFyZWQsIHNvIGEKK3N1YnNlcXVlbnQgY2FsbCB3aWxsIHJldHVybiBcLTIgYW5kIGNsZWFyIHRoZSBmbGFnLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9sb29wKDNQQ0FQKSwgcGNhcF9uZXh0X2V4KDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2Nhbl9zZXRfcmZtb24uM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfY2FuX3NldF9yZm1vbi4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI5MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX2Nhbl9zZXRfcmZtb24uM3BjYXAKQEAgLTAsMCArMSw2NCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9jYW5fc2V0X3JmbW9uLjNwY2FwLHYgMS4xIDIwMDgtMDQtMDYgMDI6NTM6MjEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9DQU5fU0VUX1JGTU9OIDNQQ0FQICIxOCBNYXkgMjAxMCIKKy5TSCBOQU1FCitwY2FwX2Nhbl9zZXRfcmZtb24gXC0gY2hlY2sgd2hldGhlciBtb25pdG9yIG1vZGUgY2FuIGJlIHNldCBmb3IgYQorbm90LXlldC1hY3RpdmF0ZWQgY2FwdHVyZSBoYW5kbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLkxQCisuZnQgQgoraW50IHBjYXBfY2FuX3NldF9yZm1vbihwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9jYW5fc2V0X3JmbW9uKCkKK2NoZWNrcyB3aGV0aGVyIG1vbml0b3IgbW9kZSBjb3VsZCBiZSBzZXQgb24gYSBjYXB0dXJlIGhhbmRsZSB3aGVuCit0aGUgaGFuZGxlIGlzIGFjdGl2YXRlZC4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfY2FuX3NldF9yZm1vbigpCityZXR1cm5zIDAgaWYgbW9uaXRvciBtb2RlIGNvdWxkIG5vdCBiZSBzZXQsCisxIGlmIG1vbml0b3IgbW9kZSBjb3VsZCBiZSBzZXQsCisuQiBQQ0FQX0VSUk9SX05PX1NVQ0hfREVWSUNFCitpZiB0aGUgY2FwdHVyZSBzb3VyY2Ugc3BlY2lmaWVkIHdoZW4gdGhlIGhhbmRsZSB3YXMgY3JlYXRlZCBkb2Vzbid0CitleGlzdCwKKy5CIFBDQVBfRVJST1JfUEVSTV9ERU5JRUQKK2lmIHRoZSBwcm9jZXNzIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGNoZWNrIHdoZXRoZXIgbW9uaXRvciBtb2RlCitjb3VsZCBiZSBzdXBwb3J0ZWQsCisuQiBQQ0FQX0VSUk9SX0FDVElWQVRFRAoraWYgY2FsbGVkIG9uIGEgY2FwdHVyZSBoYW5kbGUgdGhhdCBoYXMgYmVlbiBhY3RpdmF0ZWQsIG9yCisuQiBQQ0FQX0VSUk9SCitpZiBhbiBlcnJvciBvY2N1cnJlZC4KK0lmCisuQiBQQ0FQX0VSUk9SCitpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2NyZWF0ZSgzUENBUCksIHBjYXBfYWN0aXZhdGUoM1BDQVApLAorcGNhcF9zZXRfcmZtb24oM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfY2xvc2UuM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfY2xvc2UuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwNjY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9jbG9zZS4zcGNhcApAQCAtMCwwICsxLDQxIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2Nsb3NlLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9DTE9TRSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfY2xvc2UgXC0gY2xvc2UgYSBjYXB0dXJlIGRldmljZSBvciBzYXZlZmlsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK3ZvaWQgcGNhcF9jbG9zZShwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9jbG9zZSgpCitjbG9zZXMgdGhlIGZpbGVzIGFzc29jaWF0ZWQgd2l0aAorLkkgcAorYW5kIGRlYWxsb2NhdGVzIHJlc291cmNlcy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9jb21waWxlLjNwY2FwLmluIGIvbGlicGNhcC0xLjMuMC9wY2FwX2NvbXBpbGUuM3BjYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiZGFkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9jb21waWxlLjNwY2FwLmluCkBAIC0wLDAgKzEsNzIgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfY29tcGlsZS4zcGNhcC5pbix2IDEuMSAyMDA4LTEwLTIxIDA3OjMzOjAyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfQ09NUElMRSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfY29tcGlsZSBcLSBjb21waWxlIGEgZmlsdGVyIGV4cHJlc3Npb24KKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9jb21waWxlKHBjYXBfdCAqcCwgc3RydWN0IGJwZl9wcm9ncmFtICpmcCwKKy50aSArOAorY29uc3QgY2hhciAqc3RyLCBpbnQgb3B0aW1pemUsIGJwZl91X2ludDMyIG5ldG1hc2spOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9jb21waWxlKCkKK2lzIHVzZWQgdG8gY29tcGlsZSB0aGUgc3RyaW5nCisuSSBzdHIKK2ludG8gYSBmaWx0ZXIgcHJvZ3JhbS4gIFNlZQorLkJSIHBjYXAtZmlsdGVyIChATUFOX01JU0NfSU5GT0ApCitmb3IgdGhlIHN5bnRheCBvZiB0aGF0IHN0cmluZy4KKy5JIHByb2dyYW0KK2lzIGEgcG9pbnRlciB0byBhCisuSSBicGZfcHJvZ3JhbQorc3RydWN0IGFuZCBpcyBmaWxsZWQgaW4gYnkKKy5CUiBwY2FwX2NvbXBpbGUoKSAuCisuSSBvcHRpbWl6ZQorY29udHJvbHMgd2hldGhlciBvcHRpbWl6YXRpb24gb24gdGhlIHJlc3VsdGluZyBjb2RlIGlzIHBlcmZvcm1lZC4KKy5JIG5ldG1hc2sKK3NwZWNpZmllcyB0aGUgSVB2NCBuZXRtYXNrIG9mIHRoZSBuZXR3b3JrIG9uIHdoaWNoIHBhY2tldHMgYXJlIGJlaW5nCitjYXB0dXJlZDsgaXQgaXMgdXNlZCBvbmx5IHdoZW4gY2hlY2tpbmcgZm9yIElQdjQgYnJvYWRjYXN0IGFkZHJlc3NlcyBpbgordGhlIGZpbHRlciBwcm9ncmFtLiAgSWYgdGhlIG5ldG1hc2sgb2YgdGhlIG5ldHdvcmsgb24gd2hpY2ggcGFja2V0cyBhcmUKK2JlaW5nIGNhcHR1cmVkIGlzbid0IGtub3duIHRvIHRoZSBwcm9ncmFtLCBvciBpZiBwYWNrZXRzIGFyZSBiZWluZworY2FwdHVyZWQgb24gdGhlIExpbnV4ICJhbnkiIHBzZXVkby1pbnRlcmZhY2UgdGhhdCBjYW4gY2FwdHVyZSBvbiBtb3JlCit0aGFuIG9uZSBuZXR3b3JrLCBhIHZhbHVlIG9mIFBDQVBfTkVUTUFTS19VTktOT1dOIGNhbiBiZSBzdXBwbGllZDsgdGVzdHMKK2ZvciBJUHY0IGJyb2FkY2FzdCBhZGRyZXNzZXMgd2lsbCBmYWlsIHRvIGNvbXBpbGUsIGJ1dCBhbGwgb3RoZXIgdGVzdHMgaW4KK3RoZSBmaWx0ZXIgcHJvZ3JhbSB3aWxsIGJlIE9LLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9jb21waWxlKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBcLTEgb24gZmFpbHVyZS4KK0lmIFwtMSBpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX3NldGZpbHRlcigzUENBUCksIHBjYXBfZnJlZWNvZGUoM1BDQVApLAorcGNhcF9nZXRlcnIoM1BDQVApLCBwY2FwLWZpbHRlcihATUFOX01JU0NfSU5GT0ApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfY3JlYXRlLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX2NyZWF0ZS4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTNmOWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX2NyZWF0ZS4zcGNhcApAQCAtMCwwICsxLDc0IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2NyZWF0ZS4zcGNhcCx2IDEuMSAyMDA4LTA0LTA2IDAyOjUzOjIxIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfQ1JFQVRFIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9jcmVhdGUgXC0gY3JlYXRlIGEgbGl2ZSBjYXB0dXJlIGhhbmRsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLm5mCisuZnQgQgorY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRV07CisuZnQKKy5MUAorLmZ0IEIKK3BjYXBfdCAqcGNhcF9jcmVhdGUoY29uc3QgY2hhciAqc291cmNlLCBjaGFyICplcnJidWYpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9jcmVhdGUoKQoraXMgdXNlZCB0byBjcmVhdGUgYSBwYWNrZXQgY2FwdHVyZSBoYW5kbGUgdG8gbG9vaworYXQgcGFja2V0cyBvbiB0aGUgbmV0d29yay4KKy5JIHNvdXJjZQoraXMgYSBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIG5ldHdvcmsgZGV2aWNlIHRvIG9wZW47IG9uIExpbnV4IHN5c3RlbXMKK3dpdGggMi4yIG9yIGxhdGVyIGtlcm5lbHMsIGEKKy5JIHNvdXJjZQorYXJndW1lbnQgb2YgImFueSIgb3IKKy5CIE5VTEwKK2NhbiBiZSB1c2VkIHRvIGNhcHR1cmUgcGFja2V0cyBmcm9tIGFsbCBpbnRlcmZhY2VzLgorLlBQCitUaGUgcmV0dXJuZWQgaGFuZGxlIG11c3QgYmUgYWN0aXZhdGVkIHdpdGgKKy5CIHBjYXBfYWN0aXZhdGUoKQorYmVmb3JlIHBhY2tldHMgY2FuIGJlIGNhcHR1cmVkCit3aXRoIGl0OyBvcHRpb25zIGZvciB0aGUgY2FwdHVyZSwgc3VjaCBhcyBwcm9taXNjdW91cyBtb2RlLCBjYW4gYmUgc2V0CitvbiB0aGUgaGFuZGxlIGJlZm9yZSBhY3RpdmF0aW5nIGl0LgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9jcmVhdGUoKQorcmV0dXJucyBhCisuSSBwY2FwX3QgKgorb24gc3VjY2VzcyBhbmQKKy5CIE5VTEwKK29uIGZhaWx1cmUuCitJZgorLkIgTlVMTAoraXMgcmV0dXJuZWQsCisuSSBlcnJidWYKK2lzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisuSSBlcnJidWYKK2lzIGFzc3VtZWQgdG8gYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0CisuQiBQQ0FQX0VSUkJVRl9TSVpFCitjaGFycy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfYWN0aXZhdGUoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfZGF0YWxpbmsuM3BjYXAuaW4gYi9saWJwY2FwLTEuMy4wL3BjYXBfZGF0YWxpbmsuM3BjYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q0YWNlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9kYXRhbGluay4zcGNhcC5pbgpAQCAtMCwwICsxLDQxIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2RhdGFsaW5rLjNwY2FwLmluLHYgMS4xIDIwMDgtMTAtMjEgMDc6MzM6MDIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9EQVRBTElOSyAzUENBUCAiMjIgQXVndXN0IDIwMTAiCisuU0ggTkFNRQorcGNhcF9kYXRhbGluayBcLSBnZXQgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9kYXRhbGluayhwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kYXRhbGluaygpCityZXR1cm5zIHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIGZvciB0aGUgbGl2ZSBjYXB0dXJlIG9yIGBgc2F2ZWZpbGUnJworc3BlY2lmaWVkIGJ5CisuSVIgcCAuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwLWxpbmt0eXBlKEBNQU5fTUlTQ19JTkZPQCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbC4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbC4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzhlMThhCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsLjNwY2FwCkBAIC0wLDAgKzEsNDggQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZGF0YWxpbmtfbmFtZV90b192YWwuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RBVEFMSU5LX05BTUVfVE9fVkFMIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsIFwtIGdldCB0aGUgbGluay1sYXllciBoZWFkZXIgdHlwZSB2YWx1ZQorY29ycmVzcG9uZGluZyB0byBhIGhlYWRlciB0eXBlIG5hbWUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9kYXRhbGlua19uYW1lX3RvX3ZhbChjb25zdCBjaGFyICpuYW1lKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoKQordHJhbnNsYXRlcyBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgbmFtZSwgd2hpY2ggaXMgYQorLkIgRExUXworbmFtZSB3aXRoIHRoZQorLkIgRExUXworcmVtb3ZlZCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGluay1sYXllciBoZWFkZXIgdHlwZSB2YWx1ZS4gIFRoZQordHJhbnNsYXRpb24gaXMgY2FzZS1pbnNlbnNpdGl2ZS4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Mzk3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUuM3BjYXAKQEAgLTAsMCArMSw0NCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZS4zcGNhcCx2IDEuMyAyMDA4LTEyLTI0IDIxOjQ1OjI1IGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfREFUQUxJTktfVkFMX1RPX05BTUUgM1BDQVAgIjIyIEF1Z3VzdCAyMDEwIgorLlNIIE5BTUUKK3BjYXBfZGF0YWxpbmtfdmFsX3RvX25hbWUsIHBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uIFwtIGdldCBhCituYW1lIG9yIGRlc2NyaXB0aW9uIGZvciBhIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgdmFsdWUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAuaD4KKy5mdAorLkxQCisuZnQgQgorY29uc3QgY2hhciAqcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZShpbnQgZGx0KTsKK2NvbnN0IGNoYXIgKnBjYXBfZGF0YWxpbmtfdmFsX3RvX2Rlc2NyaXB0aW9uKGludCBkbHQpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kYXRhbGlua192YWxfdG9fbmFtZSgpCit0cmFuc2xhdGVzIGEgbGluay1sYXllciBoZWFkZXIgdHlwZSB2YWx1ZSB0byB0aGUgY29ycmVzcG9uZGluZworbGluay1sYXllciBoZWFkZXIgdHlwZSBuYW1lLiAgTlVMTCBpcyByZXR1cm5lZCBvbiBmYWlsdXJlLgorLlBQCisuQiBwY2FwX2RhdGFsaW5rX3ZhbF90b19kZXNjcmlwdGlvbigpCit0cmFuc2xhdGVzIGEgbGluay1sYXllciBoZWFkZXIgdHlwZSB2YWx1ZSB0byBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoYXQKK2xpbmstbGF5ZXIgaGVhZGVyIHR5cGUuICBOVUxMIGlzIHJldHVybmVkIG9uIGZhaWx1cmUuCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfZHVtcC4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9kdW1wLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjY2Q4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfZHVtcC4zcGNhcApAQCAtMCwwICsxLDUzIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2R1bXAuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RVTVAgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2R1bXAgXC0gd3JpdGUgYSBwYWNrZXQgdG8gYSBjYXB0dXJlIGZpbGUKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCit2b2lkIHBjYXBfZHVtcCh1X2NoYXIgKnVzZXIsIHN0cnVjdCBwY2FwX3BrdGhkciAqaCwKKy50aSArOAordV9jaGFyICpzcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2R1bXAoKQorb3V0cHV0cyBhIHBhY2tldCB0byB0aGUgYGBzYXZlZmlsZScnIG9wZW5lZCB3aXRoCisuQlIgcGNhcF9kdW1wX29wZW4oKSAuCitOb3RlIHRoYXQgaXRzIGNhbGxpbmcgYXJndW1lbnRzIGFyZSBzdWl0YWJsZSBmb3IgdXNlIHdpdGgKKy5CIHBjYXBfZGlzcGF0Y2goKQorb3IKKy5CUiBwY2FwX2xvb3AoKSAuCitJZiBjYWxsZWQgZGlyZWN0bHksIHRoZSAKKy5JIHVzZXIKK3BhcmFtZXRlciBpcyBvZiB0eXBlIAorLkIgcGNhcF9kdW1wZXJfdAorYXMgcmV0dXJuZWQgYnkKKy5CUiBwY2FwX2R1bXBfb3BlbigpIC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfZHVtcF9vcGVuKDNQQ0FQKSwgcGNhcF9kaXNwYXRjaCgzUENBUCksCitwY2FwX2xvb3AoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfZHVtcF9jbG9zZS4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9kdW1wX2Nsb3NlLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZDgyMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfZHVtcF9jbG9zZS4zcGNhcApAQCAtMCwwICsxLDM5IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2R1bXBfY2xvc2UuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RVTVBfQ0xPU0UgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2R1bXBfY2xvc2UgXC0gY2xvc2UgYSBzYXZlZmlsZSBiZWluZyB3cml0dGVuIHRvCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgordm9pZCBwY2FwX2R1bXBfY2xvc2UocGNhcF9kdW1wZXJfdCAqcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2R1bXBfY2xvc2UoKQorY2xvc2VzIHRoZSBgYHNhdmVmaWxlLicnCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2R1bXBfb3BlbigzUENBUCksIHBjYXBfZHVtcCgzUENBUCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9kdW1wX2ZpbGUuM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfZHVtcF9maWxlLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNTFhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfZHVtcF9maWxlLjNwY2FwCkBAIC0wLDAgKzEsNDAgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZHVtcF9maWxlLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9EVU1QX0ZJTEUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2R1bXBfZmlsZSBcLSBnZXQgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gZm9yIGEgc2F2ZWZpbGUgYmVpbmcgd3JpdHRlbgorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK0ZJTEUgKnBjYXBfZHVtcF9maWxlKHBjYXBfZHVtcGVyX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kdW1wX2ZpbGUoKQorcmV0dXJucyB0aGUgc3RhbmRhcmQgSS9PIHN0cmVhbSBvZiB0aGUgYGBzYXZlZmlsZScnIG9wZW5lZCBieQorLkJSIHBjYXBfZHVtcF9vcGVuKCkgLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2R1bXBfZmx1c2guM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfZHVtcF9mbHVzaC4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTUzODgzCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX2R1bXBfZmx1c2guM3BjYXAKQEAgLTAsMCArMSw0NSBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9kdW1wX2ZsdXNoLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjEgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9EVU1QX0ZMVVNIIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9kdW1wX2ZsdXNoIFwtIGZsdXNoIHRvIGEgc2F2ZWZpbGUgcGFja2V0cyBkdW1wZWQKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9kdW1wX2ZsdXNoKHBjYXBfZHVtcGVyX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kdW1wX2ZsdXNoKCkKK2ZsdXNoZXMgdGhlIG91dHB1dCBidWZmZXIgdG8gdGhlIGBgc2F2ZWZpbGUsJycgc28gdGhhdCBhbnkgcGFja2V0cword3JpdHRlbiB3aXRoCisuQiBwY2FwX2R1bXAoKQorYnV0IG5vdCB5ZXQgd3JpdHRlbiB0byB0aGUgYGBzYXZlZmlsZScnIHdpbGwgYmUgd3JpdHRlbi4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfZHVtcF9mbHVzaCgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgXC0xIG9uIGZhaWx1cmUuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2R1bXBfb3BlbigzUENBUCksIHBjYXBfZHVtcCgzUENBUCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9kdW1wX2Z0ZWxsLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX2R1bXBfZnRlbGwuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwZjk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9kdW1wX2Z0ZWxsLjNwY2FwCkBAIC0wLDAgKzEsNDQgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZHVtcF9mdGVsbC4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIxIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfRFVNUF9GVEVMTCAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfZHVtcF9mdGVsbCBcLSBnZXQgdGhlIGN1cnJlbnQgZmlsZSBvZmZzZXQgZm9yIGEgc2F2ZWZpbGUgYmVpbmcgd3JpdHRlbgorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2xvbmcgcGNhcF9kdW1wX2Z0ZWxsKHBjYXBfZHVtcGVyX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9kdW1wX2Z0ZWxsKCkKK3JldHVybnMgdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBmb3IgdGhlIGBgc2F2ZWZpbGUnJywgcmVwcmVzZW50aW5nIHRoZQorbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gYnkKKy5CIHBjYXBfZHVtcF9vcGVuKCkKK2FuZAorLkJSIHBjYXBfZHVtcCgpIC4KK1wtMSBpcyByZXR1cm5lZCBvbiBlcnJvci4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfZHVtcF9vcGVuKDNQQ0FQKSwgcGNhcF9kdW1wKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2R1bXBfb3Blbi4zcGNhcC5pbiBiL2xpYnBjYXAtMS4zLjAvcGNhcF9kdW1wX29wZW4uM3BjYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1ZGM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9kdW1wX29wZW4uM3BjYXAuaW4KQEAgLTAsMCArMSw4NyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9kdW1wX29wZW4uM3BjYXAuaW4sdiAxLjEgMjAwOC0xMC0yMyAwNTo1Njo1OSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0RVTVBfT1BFTiAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfZHVtcF9vcGVuLCBwY2FwX2R1bXBfZm9wZW4gXC0gb3BlbiBhIGZpbGUgdG8gd2hpY2ggdG8gd3JpdGUgcGFja2V0cworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5uZgorLkxQCisuZnQgQgorcGNhcF9kdW1wZXJfdCAqcGNhcF9kdW1wX29wZW4ocGNhcF90ICpwLCBjb25zdCBjaGFyICpmbmFtZSk7CitwY2FwX2R1bXBlcl90ICpwY2FwX2R1bXBfZm9wZW4ocGNhcF90ICpwLCBGSUxFICpmcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2R1bXBfb3BlbigpCitpcyBjYWxsZWQgdG8gb3BlbiBhIGBgc2F2ZWZpbGUnJyBmb3Igd3JpdGluZy4KKy5JIGZuYW1lCitzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gb3Blbi4gVGhlIGZpbGUgd2lsbCBoYXZlCit0aGUgc2FtZSBmb3JtYXQgYXMgdGhvc2UgdXNlZCBieQorLkJSIHRjcGR1bXAgKDEpCithbmQKKy5CUiB0Y3BzbGljZSAoMSkuCitUaGUgbmFtZSAiLSIgaW4gYSBzeW5vbnltCitmb3IKKy5CUiBzdGRvdXQgLgorLlBQCisuQiBwY2FwX2R1bXBfZm9wZW4oKQoraXMgY2FsbGVkIHRvIHdyaXRlIGRhdGEgdG8gYW4gZXhpc3Rpbmcgb3BlbiBzdHJlYW0KKy5JUiBmcCAuCitOb3RlIHRoYXQgb24gV2luZG93cywgdGhhdCBzdHJlYW0gc2hvdWxkIGJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZS4KKy5QUAorLkkgcAoraXMgYSBjYXB0dXJlIG9yIGBgc2F2ZWZpbGUnJyBoYW5kbGUgcmV0dXJuZWQgYnkgYW4gZWFybGllciBjYWxsIHRvCisuQiBwY2FwX2NyZWF0ZSgpCithbmQgYWN0aXZhdGVkIGJ5IGFuIGVhcmxpZXIgY2FsbCB0bworLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciByZXR1cm5lZCBieSBhbiBlYXJsaWVyIGNhbGwgdG8KKy5CUiBwY2FwX29wZW5fb2ZmbGluZSgpICwKKy5CUiBwY2FwX29wZW5fbGl2ZSgpICwKK29yCisuQlIgcGNhcF9vcGVuX2RlYWQoKSAuCitUaGUgbGluay1sYXllciB0eXBlIGFuZCBzbmFwc2hvdCBsZW5ndGggZnJvbQorLkkgcAorYXJlIHVzZWQgYXMgdGhlIGxpbmstbGF5ZXIgdHlwZSBhbmQgc25hcHNob3QgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgZmlsZS4KKy5TSCBSRVRVUk4gVkFMVUVTCitBIHBvaW50ZXIgdG8gYQorLkIgcGNhcF9kdW1wZXJfdAorc3RydWN0dXJlIHRvIHVzZSBpbiBzdWJzZXF1ZW50CisuQiBwY2FwX2R1bXAoKQorYW5kCisuQiBwY2FwX2R1bXBfY2xvc2UoKQorY2FsbHMgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4KKy5CIE5VTEwKK2lzIHJldHVybmVkIG9uIGZhaWx1cmUuCitJZgorLkIgTlVMTAoraXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycihcZklwXGZCKQorY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKSwKK3BjYXBfb3Blbl9vZmZsaW5lKDNQQ0FQKSwgcGNhcF9vcGVuX2xpdmUoM1BDQVApLCBwY2FwX29wZW5fZGVhZCgzUENBUCksCitwY2FwX2R1bXAoM1BDQVApLCBwY2FwX2R1bXBfY2xvc2UoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCksCitwY2FwLXNhdmVmaWxlKEBNQU5fRklMRV9GT1JNQVRTQCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9maWxlLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX2ZpbGUuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3MWFiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9maWxlLjNwY2FwCkBAIC0wLDAgKzEsNTkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZmlsZS4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfRklMRSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfZmlsZSBcLSBnZXQgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gZm9yIGEgc2F2ZWZpbGUgYmVpbmcgcmVhZAorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK0ZJTEUgKnBjYXBfZmlsZShwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9maWxlKCkKK3JldHVybnMgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gb2YgdGhlIGBgc2F2ZWZpbGUsJycgaWYgYSBgYHNhdmVmaWxlJycKK3dhcyBvcGVuZWQgd2l0aAorLkJSIHBjYXBfb3Blbl9vZmZsaW5lKCkgLAorb3IgTlVMTCwgaWYgYSBuZXR3b3JrIGRldmljZSB3YXMgb3BlbmVkIHdpdGgKKy5CIHBjYXBfY3JlYXRlKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciB3aXRoCisuQlIgcGNhcF9vcGVuX2xpdmUoKSAuCisuUFAKK05vdGUgdGhhdCB0aGUgUGFja2V0IENhcHR1cmUgbGlicmFyeSBpcyB1c3VhbGx5IGJ1aWx0IHdpdGggbGFyZ2UgZmlsZQorc3VwcG9ydCwgc28gdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW0gb2YgdGhlIGBgc2F2ZWZpbGUnJyBtaWdodCByZWZlciB0bworYSBmaWxlIGxhcmdlciB0aGFuIDIgZ2lnYWJ5dGVzOyBhcHBsaWNhdGlvbnMgdGhhdCB1c2UKKy5CIHBjYXBfZmlsZSgpCitzaG91bGQsIGlmIHBvc3NpYmxlLCB1c2UgY2FsbHMgdGhhdCBzdXBwb3J0IGxhcmdlIGZpbGVzIG9uIHRoZSByZXR1cm4KK3ZhbHVlIG9mCisuQiBwY2FwX2ZpbGUoKQorb3IgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisuQiBmaWxlbm8oKQord2hlbiBwYXNzZWQgdGhlIHJldHVybiB2YWx1ZSBvZgorLkJSIHBjYXBfZmlsZSgpIC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfb3Blbl9vZmZsaW5lKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2ZpbGVuby4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9maWxlbm8uM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzNzMzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9maWxlbm8uM3BjYXAKQEAgLTAsMCArMSw2OCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9maWxlbm8uM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0ZJTEVOTyAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfZmlsZW5vIFwtIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhIGxpdmUgY2FwdHVyZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2ZpbGVubyhwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorSWYKKy5JIHAKK3JlZmVycyB0byBhIG5ldHdvcmsgZGV2aWNlIHRoYXQgd2FzIG9wZW5lZCBmb3IgYSBsaXZlIGNhcHR1cmUgdXNpbmcKK2EgY29tYmluYXRpb24gb2YKKy5CIHBjYXBfY3JlYXRlKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciB1c2luZworLkJSIHBjYXBfb3Blbl9saXZlKCkgLAorLkIgcGNhcF9maWxlbm8oKQorcmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZyb20gd2hpY2ggY2FwdHVyZWQgcGFja2V0cyBhcmUgcmVhZC4KKy5MUAorSWYKKy5JIHAKK3JlZmVycyB0byBhIGBgc2F2ZWZpbGUnJyB0aGF0IHdhcyBvcGVuZWQgdXNpbmcgZnVuY3Rpb25zIHN1Y2ggYXMKKy5CUiBwY2FwX29wZW5fb2ZmbGluZSgpCitvcgorLkJSIHBjYXBfZm9wZW5fb2ZmbGluZSgpICwKK2EgYGBkZWFkJycKKy5CIHBjYXBfdAorb3BlbmVkIHVzaW5nCisuQlIgcGNhcF9vcGVuX2RlYWQoKSAsCitvciBhCisuQiBwY2FwX3QKK3RoYXQgd2FzIGNyZWF0ZWQgd2l0aAorLkIgcGNhcF9jcmVhdGUoKQorYnV0IHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBhY3RpdmF0ZWQgd2l0aAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitpdCByZXR1cm5zIFwtMS4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCksCitwY2FwX29wZW5fbGl2ZSgzUENBUCksIHBjYXBfb3Blbl9vZmZsaW5lKDNQQ0FQKSwKK3BjYXBfZm9wZW5fb2ZmbGluZSgzUENBUCksIHBjYXBfb3Blbl9kZWFkKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2ZpbmRhbGxkZXZzLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX2ZpbmRhbGxkZXZzLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTZkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfZmluZGFsbGRldnMuM3BjYXAKQEAgLTAsMCArMSwxODYgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZmluZGFsbGRldnMuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0ZJTkRBTExERVZTIDNQQ0FQICIyMiBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX2ZpbmRhbGxkZXZzLCBwY2FwX2ZyZWVhbGxkZXZzIFwtIGdldCBhIGxpc3Qgb2YgY2FwdHVyZSBkZXZpY2VzLCBhbmQKK2ZyZWUgdGhhdCBsaXN0CisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisubmYKKy5mdCBCCitjaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfZmluZGFsbGRldnMocGNhcF9pZl90ICoqYWxsZGV2c3AsIGNoYXIgKmVycmJ1Zik7Cit2b2lkIHBjYXBfZnJlZWFsbGRldnMocGNhcF9pZl90ICphbGxkZXZzKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfZmluZGFsbGRldnMoKQorY29uc3RydWN0cyBhIGxpc3Qgb2YgbmV0d29yayBkZXZpY2VzIHRoYXQgY2FuIGJlIG9wZW5lZCB3aXRoCisuQiBwY2FwX2NyZWF0ZSgpCithbmQKKy5CIHBjYXBfYWN0aXZhdGUoKQorb3Igd2l0aAorLkJSIHBjYXBfb3Blbl9saXZlKCkgLgorKE5vdGUgdGhhdCB0aGVyZSBtYXkgYmUgbmV0d29yayBkZXZpY2VzIHRoYXQgY2Fubm90IGJlIG9wZW5lZCBieSB0aGUKK3Byb2Nlc3MgY2FsbGluZworLkJSIHBjYXBfZmluZGFsbGRldnMoKSAsCitiZWNhdXNlLCBmb3IgZXhhbXBsZSwgdGhhdCBwcm9jZXNzIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBwcml2aWxlZ2VzCit0byBvcGVuIHRoZW0gZm9yIGNhcHR1cmluZzsgaWYgc28sIHRob3NlIGRldmljZXMgd2lsbCBub3QgYXBwZWFyIG9uIHRoZQorbGlzdC4pCitJZgorLkIgcGNhcF9maW5kYWxsZGV2cygpCitzdWNjZWVkcywgdGhlIHBvaW50ZXIgcG9pbnRlZCB0byBieQorLkkgYWxsZGV2c3AKK2lzIHNldCB0byBwb2ludCB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCwgb3IgdG8KKy5CIE5VTEwKK2lmIG5vIGRldmljZXMgd2VyZSBmb3VuZCAodGhpcyBpcyBjb25zaWRlcmVkIHN1Y2Nlc3MpLgorRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0IGlzIG9mIHR5cGUKKy5CUiBwY2FwX2lmX3QgLAorYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisuUlMKKy5UUAorLkIgbmV4dAoraWYgbm90CisuQlIgTlVMTCAsCithIHBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdDsKKy5CIE5VTEwKK2ZvciB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsaXN0CisuVFAKKy5CIG5hbWUKK2EgcG9pbnRlciB0byBhIHN0cmluZyBnaXZpbmcgYSBuYW1lIGZvciB0aGUgZGV2aWNlIHRvIHBhc3MgdG8KKy5CIHBjYXBfb3Blbl9saXZlKCkKKy5UUAorLkIgZGVzY3JpcHRpb24KK2lmIG5vdAorLkJSIE5VTEwgLAorYSBwb2ludGVyIHRvIGEgc3RyaW5nIGdpdmluZyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXZpY2UKKy5UUAorLkIgYWRkcmVzc2VzCithIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBsaXN0IG9mIG5ldHdvcmsgYWRkcmVzc2VzIGZvciB0aGUKK2RldmljZSwKK29yCisuQiBOVUxMCitpZiB0aGUgZGV2aWNlIGhhcyBubyBhZGRyZXNzZXMKKy5UUAorLkIgZmxhZ3MKK2RldmljZSBmbGFnczoKKy5SUworLlRQCisuQiBQQ0FQX0lGX0xPT1BCQUNLCitzZXQgaWYgdGhlIGRldmljZSBpcyBhIGxvb3BiYWNrIGludGVyZmFjZQorLlJFCisuUkUKKy5QUAorRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0IG9mIGFkZHJlc3NlcyBpcyBvZiB0eXBlCisuQlIgcGNhcF9hZGRyX3QgLAorYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisuUlMKKy5UUAorLkIgbmV4dAoraWYgbm90CisuQlIgTlVMTCAsCithIHBvaW50ZXIgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdDsKKy5CIE5VTEwKK2ZvciB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBsaXN0CisuVFAKKy5CIGFkZHIKK2EgcG9pbnRlciB0byBhCisuQiAic3RydWN0IHNvY2thZGRyIgorY29udGFpbmluZyBhbiBhZGRyZXNzCisuVFAKKy5CIG5ldG1hc2sKK2lmIG5vdAorLkJSIE5VTEwgLAorYSBwb2ludGVyIHRvIGEKKy5CICJzdHJ1Y3Qgc29ja2FkZHIiCit0aGF0IGNvbnRhaW5zIHRoZSBuZXRtYXNrIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgcG9pbnRlZCB0byBieQorLkIgYWRkcgorLlRQCisuQiBicm9hZGFkZHIKK2lmIG5vdAorLkJSIE5VTEwgLAorYSBwb2ludGVyIHRvIGEKKy5CICJzdHJ1Y3Qgc29ja2FkZHIiCit0aGF0IGNvbnRhaW5zIHRoZSBicm9hZGNhc3QgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhZGRyZXNzIHBvaW50ZWQKK3RvIGJ5CisuQlIgYWRkciA7CittYXkgYmUgbnVsbCBpZiB0aGUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBicm9hZGNhc3RzCisuVFAKKy5CIGRzdGFkZHIKK2lmIG5vdAorLkJSIE5VTEwgLAorYSBwb2ludGVyIHRvIGEKKy5CICJzdHJ1Y3Qgc29ja2FkZHIiCit0aGF0IGNvbnRhaW5zIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFkZHJlc3MgcG9pbnRlZAordG8gYnkKKy5CUiBhZGRyIDsKK21heSBiZSBudWxsIGlmIHRoZSBkZXZpY2UgaXNuJ3QgYSBwb2ludC10by1wb2ludCBpbnRlcmZhY2UKKy5SRQorLlBQCitOb3RlIHRoYXQgdGhlIGFkZHJlc3NlcyBpbiB0aGUgbGlzdCBvZiBhZGRyZXNzZXMgbWlnaHQgYmUgSVB2NAorYWRkcmVzc2VzLCBJUHY2IGFkZHJlc3Nlcywgb3Igc29tZSBvdGhlciB0eXBlIG9mIGFkZHJlc3Nlcywgc28geW91IG11c3QKK2NoZWNrIHRoZQorLkIgc2FfZmFtaWx5CittZW1iZXIgb2YgdGhlCisuQiAic3RydWN0IHNvY2thZGRyIgorYmVmb3JlIGludGVycHJldGluZyB0aGUgY29udGVudHMgb2YgdGhlIGFkZHJlc3M7IGRvIG5vdCBhc3N1bWUgdGhhdCB0aGUKK2FkZHJlc3NlcyBhcmUgYWxsIElQdjQgYWRkcmVzc2VzLCBvciBldmVuIGFsbCBJUHY0IG9yIElQdjYgYWRkcmVzc2VzLgorSVB2NCBhZGRyZXNzZXMgaGF2ZSB0aGUgdmFsdWUKKy5CUiBBRl9JTkVUICwKK0lQdjYgYWRkcmVzc2VzIGhhdmUgdGhlIHZhbHVlCisuQiBBRl9JTkVUNgorKHdoaWNoIG9sZGVyIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBJUHY2IG1pZ2h0IG5vdAorZGVmaW5lKSwgYW5kIG90aGVyIGFkZHJlc3NlcyBoYXZlIG90aGVyIHZhbHVlcy4gIFdoZXRoZXIgb3RoZXIgYWRkcmVzc2VzCithcmUgcmV0dXJuZWQsIGFuZCB3aGF0IHR5cGVzIHRoZXkgbWlnaHQgaGF2ZSBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQuCitGb3IgSVB2NCBhZGRyZXNzZXMsIHRoZQorLkIgInN0cnVjdCBzb2NrYWRkciIKK3BvaW50ZXIgY2FuIGJlIGludGVycHJldGVkIGFzIGlmIGl0IHBvaW50ZWQgdG8gYQorLkJSICJzdHJ1Y3Qgc29ja2FkZHJfaW4iIDsKK2ZvciBJUHY2IGFkZHJlc3NlcywgaXQgY2FuIGJlIGludGVycHJldGVkIGFzIGlmIGl0IHBvaW50ZWQgdG8gYQorLkJSICJzdHJ1Y3Qgc29ja2FkZHJfaW42Ii4KKy5QUAorVGhlIGxpc3Qgb2YgZGV2aWNlcyBtdXN0IGJlIGZyZWVkIHdpdGgKKy5CUiBwY2FwX2ZyZWVhbGxkZXZzKCkgLAord2hjaCBmcmVlcyB0aGUgbGlzdCBwb2ludGVkIHRvIGJ5CisuSVIgYWxsZGV2cyAuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX2ZpbmRhbGxkZXZzKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBcLTEgb24gZmFpbHVyZTsgYXMgaW5kaWNhdGVkLCBmaW5kaW5nIG5vCitkZXZpY2VzIGlzIGNvbnNpZGVyZWQgc3VjY2VzcywgcmF0aGVyIHRoYW4gZmFpbHVyZSwgc28gMCB3aWxsIGJlCityZXR1cm5lZCBpbiB0aGF0IGNhc2UuCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuSSBlcnJidWYKK2lzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisuSSBlcnJidWYKK2lzIGFzc3VtZWQgdG8gYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0CisuQiBQQ0FQX0VSUkJVRl9TSVpFCitjaGFycy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCksCitwY2FwX29wZW5fbGl2ZSgzUENBUCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9mcmVlY29kZS4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9mcmVlY29kZS4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWI0Zjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX2ZyZWVjb2RlLjNwY2FwCkBAIC0wLDAgKzEsNDUgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZnJlZWNvZGUuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0ZSRUVDT0RFIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9mcmVlY29kZSBcLSBmcmVlIGEgQlBGIHByb2dyYW0KKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCit2b2lkIHBjYXBfZnJlZWNvZGUoc3RydWN0IGJwZl9wcm9ncmFtICopOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9mcmVlY29kZSgpCitpcyB1c2VkIHRvIGZyZWUgdXAgYWxsb2NhdGVkIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGEKKy5JIGJwZl9wcm9ncmFtCitzdHJ1Y3QgZ2VuZXJhdGVkIGJ5CisuQiBwY2FwX2NvbXBpbGUoKQord2hlbiB0aGF0IEJQRiBwcm9ncmFtIGlzIG5vIGxvbmdlciBuZWVkZWQsIGZvciBleGFtcGxlIGFmdGVyIGl0CitoYXMgYmVlbiBtYWRlIHRoZSBmaWx0ZXIgcHJvZ3JhbSBmb3IgYSBwY2FwIHN0cnVjdHVyZSBieSBhIGNhbGwgdG8KKy5CUiBwY2FwX3NldGZpbHRlcigpIC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY29tcGlsZSgzUENBUCksIHBjYXBfc2V0ZmlsdGVyKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2dldF9zZWxlY3RhYmxlX2ZkLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX2dldF9zZWxlY3RhYmxlX2ZkLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMzNkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfZ2V0X3NlbGVjdGFibGVfZmQuM3BjYXAKQEAgLTAsMCArMSwxMjkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZ2V0X3NlbGVjdGFibGVfZmQuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0dFVF9TRUxFQ1RBQkxFX0ZEIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCBcLSBnZXQgYSBmaWxlIGRlc2NyaXB0b3Igb24gd2hpY2ggYSBzZWxlY3QoKSBjYW4KK2JlIGRvbmUgZm9yIGEgbGl2ZSBjYXB0dXJlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKQorcmV0dXJucywgb24gVU5JWCwgYSBmaWxlIGRlc2NyaXB0b3IgbnVtYmVyIGZvciBhIGZpbGUgZGVzY3JpcHRvciBvbgord2hpY2ggb25lIGNhbgorZG8gYQorLkIgc2VsZWN0KCkKK29yCisuQiBwb2xsKCkKK3RvIHdhaXQgZm9yIGl0IHRvIGJlIHBvc3NpYmxlIHRvIHJlYWQgcGFja2V0cyB3aXRob3V0IGJsb2NraW5nLCBpZiBzdWNoCithIGRlc2NyaXB0b3IgZXhpc3RzLCBvciBcLTEsIGlmIG5vIHN1Y2ggZGVzY3JpcHRvciBleGlzdHMuICBTb21lIG5ldHdvcmsKK2RldmljZXMgb3BlbmVkIHdpdGgKKy5CIHBjYXBfY3JlYXRlKCkKK2FuZAorLkJSIHBjYXBfYWN0aXZhdGUoKSAsCitvciB3aXRoCisuQlIgcGNhcF9vcGVuX2xpdmUoKSAsCitkbyBub3Qgc3VwcG9ydAorLkIgc2VsZWN0KCkKK29yCisuQiBwb2xsKCkKKyhmb3IgZXhhbXBsZSwgcmVndWxhciBuZXR3b3JrIGRldmljZXMgb24gRnJlZUJTRCA0LjMgYW5kIDQuNCwgYW5kIEVuZGFjZQorREFHIGRldmljZXMpLCBzbyBcLTEgaXMgcmV0dXJuZWQgZm9yIHRob3NlIGRldmljZXMuCisuUFAKK05vdGUgdGhhdCBpbjoKKy5JUAorRnJlZUJTRCBwcmlvciB0byBGcmVlQlNEIDQuNjsKKy5JUAorTmV0QlNEIHByaW9yIHRvIE5ldEJTRCAzLjA7CisuSVAKK09wZW5CU0QgcHJpb3IgdG8gT3BlbkJTRCAyLjQ7CisuSVAKK01hYyBPUyBYIHByaW9yIHRvIE1hYyBPUyBYIDEwLjc7CisuUFAKKy5CIHNlbGVjdCgpCithbmQKKy5CIHBvbGwoKQorZG8gbm90IHdvcmsgY29ycmVjdGx5IG9uIEJQRiBkZXZpY2VzOworLkIgcGNhcF9nZXRfc2VsZWN0YWJsZV9mZCgpCit3aWxsIHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBvbiBtb3N0IG9mIHRob3NlIHZlcnNpb25zICh0aGUgZXhjZXB0aW9ucworYmVpbmcgRnJlZUJTRCA0LjMgYW5kIDQuNCksIGJ1dCBhIHNpbXBsZQorLkIgc2VsZWN0KCkKK29yCisuQiBwb2xsKCkKK3dpbGwgbm90IGluZGljYXRlIHRoYXQgdGhlIGRlc2NyaXB0b3IgaXMgcmVhZGFibGUgdW50aWwgYSBmdWxsIGJ1ZmZlcidzCit3b3J0aCBvZiBwYWNrZXRzIGlzIHJlY2VpdmVkLCBldmVuIGlmIHRoZSByZWFkIHRpbWVvdXQgZXhwaXJlcyBiZWZvcmUKK3RoZW4uICBUbyB3b3JrIGFyb3VuZCB0aGlzLCBhbiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMKKy5CIHNlbGVjdCgpCitvcgorLkIgcG9sbCgpCit0byB3YWl0IGZvciBwYWNrZXRzIHRvIGFycml2ZSBtdXN0IHB1dCB0aGUKKy5CIHBjYXBfdAoraW4gbm9uLWJsb2NraW5nIG1vZGUsIGFuZCBtdXN0IGFycmFuZ2UgdGhhdCB0aGUKKy5CIHNlbGVjdCgpCitvcgorLkIgcG9sbCgpCitoYXZlIGEgdGltZW91dCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlYWQgdGltZW91dCwKK2FuZCBtdXN0IHRyeSB0byByZWFkIHBhY2tldHMgYWZ0ZXIgdGhhdCB0aW1lb3V0IGV4cGlyZXMsIHJlZ2FyZGxlc3Mgb2YKK3doZXRoZXIKKy5CIHNlbGVjdCgpCitvcgorLkIgcG9sbCgpCitpbmRpY2F0ZWQgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGUKKy5CIHBjYXBfdAoraXMgcmVhZHkgdG8gYmUgcmVhZCBvciBub3QuICAoVGhhdCB3b3JrYXJvdW5kIHdpbGwgbm90IHdvcmsgaW4gRnJlZUJTRAorNC4zIGFuZCBsYXRlcjsgaG93ZXZlciwgaW4gRnJlZUJTRCA0LjYgYW5kIGxhdGVyLAorLkIgc2VsZWN0KCkKK2FuZAorLkIgcG9sbCgpCit3b3JrIGNvcnJlY3RseSBvbiBCUEYgZGV2aWNlcywgc28gdGhlIHdvcmthcm91bmQgaXNuJ3QgbmVjZXNzYXJ5LAorYWx0aG91Z2ggaXQgZG9lcyBubyBoYXJtLikKKy5QUAorTm90ZSBhbHNvIHRoYXQKKy5CIHBvbGwoKQorZG9lc24ndCB3b3JrIG9uIGNoYXJhY3RlciBzcGVjaWFsIGZpbGVzLCBpbmNsdWRpbmcgQlBGIGRldmljZXMsIGluIE1hYworT1MgWCAxMC40IGFuZCAxMC41LCBzbywgd2hpbGUKKy5CIHNlbGVjdCgpCitjYW4gYmUgdXNlZCBvbiB0aGUgZGVzY3JpcHRvciByZXR1cm5lZCBieQorLkJSIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKSAsCisuQiBwb2xsKCkKK2Nhbm5vdCBiZSB1c2VkIG9uIGl0IHRob3NlIHZlcnNpb25zIG9mIE1hYyBPUyBYLiAgS3F1ZXVlcyBhbHNvIGRvbid0Cit3b3JrIG9uIHRoYXQgZGVzY3JpcHRvci4KKy5CUiBwb2xsKCkgLAorYnV0IG5vdCBrcXVldWVzLCB3b3JrIG9uIHRoYXQgZGVzY3JpcHRvciBpbiBNYWMgT1MgWCByZWxlYXNlcyBwcmlvciB0bworMTAuNDsKKy5CIHBvbGwoKQorYW5kIGtxdWV1ZXMgd29yayBvbiB0aGF0IGRlc2NyaXB0b3IgaW4gTWFjIE9TIFggMTAuNiBhbmQgbGF0ZXIuCisuUFAKKy5CIHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQoKQoraXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzLgorLlNIIFJFVFVSTiBWQUxVRQorQSBzZWxlY3RhYmxlIGZpbGUgZGVzY3JpcHRvciBpcyByZXR1cm5lZCBpZiBvbmUgZXhpc3RzOyBvdGhlcndpc2UsIFwtMQoraXMgcmV0dXJuZWQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBzZWxlY3QoMiksIHBvbGwoMikKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9nZXRlcnIuM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfZ2V0ZXJyLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNGVhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfZ2V0ZXJyLjNwY2FwCkBAIC0wLDAgKzEsNTMgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfZ2V0ZXJyLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9HRVRFUlIgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2dldGVyciwgcGNhcF9wZXJyb3IgXC0gZ2V0IG9yIHByaW50IGxpYnBjYXAgZXJyb3IgbWVzc2FnZSB0ZXh0CisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgorY2hhciAqcGNhcF9nZXRlcnIocGNhcF90ICpwKTsKK3ZvaWQgcGNhcF9wZXJyb3IocGNhcF90ICpwLCBjaGFyICpwcmVmaXgpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9nZXRlcnIoKQorcmV0dXJucyB0aGUgZXJyb3IgdGV4dCBwZXJ0YWluaW5nIHRvIHRoZSBsYXN0IHBjYXAgbGlicmFyeSBlcnJvci4KKy5CUiBOT1RFIDoKK3RoZSBwb2ludGVyIGl0IHJldHVybnMgd2lsbCBubyBsb25nZXIgcG9pbnQgdG8gYSB2YWxpZCBlcnJvciBtZXNzYWdlCitzdHJpbmcgYWZ0ZXIgdGhlCisuQiBwY2FwX3QKK3Bhc3NlZCB0byBpdCBpcyBjbG9zZWQ7IHlvdSBtdXN0IHVzZSBvciBjb3B5IHRoZSBzdHJpbmcgYmVmb3JlIGNsb3NpbmcKK3RoZQorLkJSIHBjYXBfdCAuCisuUFAKKy5CIHBjYXBfcGVycm9yKCkKK3ByaW50cyB0aGUgdGV4dCBvZiB0aGUgbGFzdCBwY2FwIGxpYnJhcnkgZXJyb3Igb24KKy5CUiBzdGRlcnIgLAorcHJlZml4ZWQgYnkKKy5JUiBwcmVmaXggLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2luamVjdC4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9pbmplY3QuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhM2VlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9pbmplY3QuM3BjYXAKQEAgLTAsMCArMSw5MCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9pbmplY3QuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0lOSkVDVCAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfaW5qZWN0LCBwY2FwX3NlbmRwYWNrZXQgXC0gdHJhbnNtaXQgYSBwYWNrZXQKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9pbmplY3QocGNhcF90ICpwLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsKK2ludCBwY2FwX3NlbmRwYWNrZXQocGNhcF90ICpwLCBjb25zdCB1X2NoYXIgKmJ1ZiwgaW50IHNpemUpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9pbmplY3QoKQorc2VuZHMgYSByYXcgcGFja2V0IHRocm91Z2ggdGhlIG5ldHdvcmsgaW50ZXJmYWNlOworLkkgYnVmCitwb2ludHMgdG8gdGhlIGRhdGEgb2YgdGhlIHBhY2tldCwgaW5jbHVkaW5nIHRoZSBsaW5rLWxheWVyIGhlYWRlciwgYW5kCisuSSBzaXplCitpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBwYWNrZXQuCisuUFAKK05vdGUgdGhhdCwgZXZlbiBpZiB5b3Ugc3VjY2Vzc2Z1bGx5IG9wZW4gdGhlIG5ldHdvcmsgaW50ZXJmYWNlLCB5b3UKK21pZ2h0IG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gc2VuZCBwYWNrZXRzIG9uIGl0LCBvciBpdCBtaWdodCBub3Qgc3VwcG9ydAorc2VuZGluZyBwYWNrZXRzOyBhcworLkkgcGNhcF9vcGVuX2xpdmUoKQorZG9lc24ndCBoYXZlIGEgZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIG9wZW4gZm9yIGNhcHR1cmluZywgc2VuZGluZywKK29yIGNhcHR1cmluZyBhbmQgc2VuZGluZywgeW91IGNhbm5vdCByZXF1ZXN0IGFuIG9wZW4gdGhhdCBzdXBwb3J0cworc2VuZGluZyBhbmQgYmUgbm90aWZpZWQgYXQgb3BlbiB0aW1lIHdoZXRoZXIgc2VuZGluZyB3aWxsIGJlIHBvc3NpYmxlLgorTm90ZSBhbHNvIHRoYXQgc29tZSBkZXZpY2VzIG1pZ2h0IG5vdCBzdXBwb3J0IHNlbmRpbmcgcGFja2V0cy4KKy5QUAorTm90ZSB0aGF0LCBvbiBzb21lIHBsYXRmb3JtcywgdGhlIGxpbmstbGF5ZXIgaGVhZGVyIG9mIHRoZSBwYWNrZXQgdGhhdCdzCitzZW50IG1pZ2h0IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgbGluay1sYXllciBoZWFkZXIgb2YgdGhlIHBhY2tldAorc3VwcGxpZWQgdG8KKy5CUiBwY2FwX2luamVjdCgpICwKK2FzIHRoZSBzb3VyY2UgbGluay1sYXllciBhZGRyZXNzLCBpZiB0aGUgaGVhZGVyIGNvbnRhaW5zIHN1Y2ggYW4KK2FkZHJlc3MsIG1pZ2h0IGJlIGNoYW5nZWQgdG8gYmUgdGhlIGFkZHJlc3MgYXNzaWduZWQgdG8gdGhlIGludGVyZmFjZSBvbgord2hpY2ggdGhlIHBhY2tldCBpdCBzZW50LCBpZiB0aGUgcGxhdGZvcm0gZG9lc24ndCBzdXBwb3J0IHNlbmRpbmcKK2NvbXBsZXRlbHkgcmF3IGFuZCB1bmNoYW5nZWQgcGFja2V0cy4gIEV2ZW4gd29yc2UsIHNvbWUgZHJpdmVycyBvbiBzb21lCitwbGF0Zm9ybXMgbWlnaHQgY2hhbmdlIHRoZSBsaW5rLWxheWVyIHR5cGUgZmllbGQgdG8gd2hhdGV2ZXIgdmFsdWUKK2xpYnBjYXAgdXNlZCB3aGVuIGF0dGFjaGluZyB0byB0aGUgZGV2aWNlLCBldmVuIG9uIHBsYXRmb3JtcyB0aGF0CisuSSBkbworbm9taW5hbGx5IHN1cHBvcnQgc2VuZGluZyBjb21wbGV0ZWx5IHJhdyBhbmQgdW5jaGFuZ2VkIHBhY2tldHMuCisuUFAKKy5CIHBjYXBfc2VuZHBhY2tldCgpCitpcyBsaWtlCisuQlIgcGNhcF9pbmplY3QoKSAsCitidXQgaXQgcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIHJhdGhlciB0aGFuIHJldHVybmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzCit3cml0dGVuLgorLlJCICggcGNhcF9pbmplY3QoKQorY29tZXMgZnJvbSBPcGVuQlNEOworLkIgcGNhcF9zZW5kcGFja2V0KCkKK2NvbWVzIGZyb20gV2luUGNhcC4gIEJvdGggYXJlIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5LikKKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfaW5qZWN0KCkKK3JldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorLlBQCisuQiBwY2FwX3NlbmRwYWNrZXQoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorLlBQCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9nZXRlcnIoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfaXNfc3dhcHBlZC4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9pc19zd2FwcGVkLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMjZiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfaXNfc3dhcHBlZC4zcGNhcApAQCAtMCwwICsxLDQyIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2lzX3N3YXBwZWQuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0lTX1NXQVBQRUQgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX2lzX3N3YXBwZWQgXC0gZmluZCBvdXQgd2hldGhlciBhIHNhdmVmaWxlIGhhcyB0aGUgbmF0aXZlIGJ5dGUgb3JkZXIKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9pc19zd2FwcGVkKHBjYXBfdCAqcCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2lzX3N3YXBwZWQoKQorcmV0dXJucyB0cnVlIGlmCisuSSBwCityZWZlcnMgdG8gYSBgYHNhdmVmaWxlJycgdGhhdCB1c2VzIGEgZGlmZmVyZW50IGJ5dGUgb3JkZXIKK3RoYW4gdGhlIGN1cnJlbnQgc3lzdGVtLiAgRm9yIGEgbGl2ZSBjYXB0dXJlLCBpdCBhbHdheXMgcmV0dXJucyBmYWxzZS4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9saWJfdmVyc2lvbi4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9saWJfdmVyc2lvbi4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjM5YmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX2xpYl92ZXJzaW9uLjNwY2FwCkBAIC0wLDAgKzEsNDEgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfbGliX3ZlcnNpb24uM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0xJQl9WRVJTSU9OIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9saWJfdmVyc2lvbiBcLSBnZXQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIGxpYnBjYXAKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitjb25zdCBjaGFyICpwY2FwX2xpYl92ZXJzaW9uKHZvaWQpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9saWJfdmVyc2lvbigpCityZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBnaXZpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gb2YKK3RoZSBsaWJwY2FwIGxpYnJhcnkgYmVpbmcgdXNlZDsgbm90ZSB0aGF0IGl0IGNvbnRhaW5zIG1vcmUgaW5mb3JtYXRpb24KK3RoYW4ganVzdCBhIHZlcnNpb24gbnVtYmVyLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwLmluIGIvbGlicGNhcC0xLjMuMC9wY2FwX2xpc3RfZGF0YWxpbmtzLjNwY2FwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMjc1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfbGlzdF9kYXRhbGlua3MuM3BjYXAuaW4KQEAgLTAsMCArMSw2NCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9saXN0X2RhdGFsaW5rcy4zcGNhcC5pbix2IDEuMSAyMDA4LTEwLTIxIDA3OjMzOjAyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfTElTVF9EQVRBTElOS1MgM1BDQVAgIjIyIEF1Z3VzdCAyMDEwIgorLlNIIE5BTUUKK3BjYXBfbGlzdF9kYXRhbGlua3MsIHBjYXBfZnJlZV9kYXRhbGlua3MgXC0gZ2V0IGEgbGlzdCBvZiBsaW5rLWxheWVyIGhlYWRlcgordHlwZXMgc3VwcG9ydGVkIGJ5IGEgY2FwdHVyZSBkZXZpY2UsIGFuZCBmcmVlIHRoYXQgbGlzdAorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2xpc3RfZGF0YWxpbmtzKHBjYXBfdCAqcCwgaW50ICoqZGx0X2J1Zik7Cit2b2lkIHBjYXBfZnJlZV9kYXRhbGlua3MoaW50ICpkbHRfbGlzdCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2xpc3RfZGF0YWxpbmtzKCkKK2lzIHVzZWQgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgc3VwcG9ydGVkIGxpbmstbGF5ZXIgaGVhZGVyIHR5cGVzIG9mIHRoZQoraW50ZXJmYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGNhcCBkZXNjcmlwdG9yLgorLkIgcGNhcF9saXN0X2RhdGFsaW5rcygpCithbGxvY2F0ZXMgYW4gYXJyYXkgdG8gaG9sZCB0aGUgbGlzdCBhbmQgc2V0cworLklSICpkbHRfYnVmIAordG8gcG9pbnQgdG8gdGhhdCBhcnJheS4KKy5MUAorVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZnJlZWluZyB0aGUgYXJyYXkgd2l0aAorLkJSIHBjYXBfZnJlZV9kYXRhbGlua3MoKSAsCit3aGljaCBmcmVlcyB0aGUgbGlzdCBvZiBsaW5rLWxheWVyIGhlYWRlciB0eXBlcyBwb2ludGVkIHRvIGJ5CisuSVIgZGx0X2xpc3QgLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9saXN0X2RhdGFsaW5rcygpCityZXR1cm5zIHRoZSBudW1iZXIgb2YgbGluay1sYXllciBoZWFkZXIgdHlwZXMgaW4gdGhlIGFycmF5IG9uIHN1Y2Nlc3MKK2FuZCBcLTEgb24gZmFpbHVyZS4KK0lmIFwtMSBpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCksCitwY2FwX2RhdGFsaW5rX3ZhbF90b19uYW1lKDNQQ0FQKSwKK3BjYXAtbGlua3R5cGUoQE1BTl9NSVNDX0lORk9AKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwLmluIGIvbGlicGNhcC0xLjMuMC9wY2FwX2xpc3RfdHN0YW1wX3R5cGVzLjNwY2FwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZDNkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfbGlzdF90c3RhbXBfdHlwZXMuM3BjYXAuaW4KQEAgLTAsMCArMSw3MCBAQAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfTElTVF9UU1RBTVBfVFlQRVMgM1BDQVAgIjIxIEF1Z3VzdCAyMDEwIgorLlNIIE5BTUUKK3BjYXBfbGlzdF90c3RhbXBfdHlwZXMsIHBjYXBfZnJlZV90c3RhbXBfdHlwZXMgXC0gZ2V0IGEgbGlzdCBvZiB0aW1lCitzdGFtcCB0eXBlcyBzdXBwb3J0ZWQgYnkgYSBjYXB0dXJlIGRldmljZSwgYW5kIGZyZWUgdGhhdCBsaXN0CisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfbGlzdF90c3RhbXBfdHlwZXMocGNhcF90ICpwLCBpbnQgKip0c3RhbXBfdHlwZXNwKTsKK3ZvaWQgcGNhcF9mcmVlX3RzdGFtcF90eXBlcyhpbnQgKnRzdGFtcF90eXBlcyk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKCkKK2lzIHVzZWQgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgc3VwcG9ydGVkIHRpbWUgc3RhbXAgdHlwZXMgb2YgdGhlIGludGVyZmFjZQorYXNzb2NpYXRlZCB3aXRoIHRoZSBwY2FwIGRlc2NyaXB0b3IuCisuQiBwY2FwX2xpc3RfdHN0YW1wX3R5cGVzKCkKK2FsbG9jYXRlcyBhbiBhcnJheSB0byBob2xkIHRoZSBsaXN0IGFuZCBzZXRzCisuSSAqdHN0YW1wX3R5cGVzcAordG8gcG9pbnQgdG8gdGhlIGFycmF5LgorU2VlCisuQlIgcGNhcC10c3RhbXAgKEBNQU5fTUlTQ19JTkZPQCkKK2ZvciBhIGxpc3Qgb2YgYWxsIHRoZSB0aW1lIHN0YW1wIHR5cGVzLgorLlBQCitUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBhcnJheSB3aXRoCisuQlIgcGNhcF9mcmVlX3RzdGFtcF90eXBlcygpICwKK3doaWNoIGZyZWVzIHRoZSBsaXN0IHBvaW50ZWQgdG8gYnkKKy5JUiB0c3RhbXBfdHlwZXMgLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9saXN0X3RzdGFtcF90eXBlcygpCityZXR1cm5zIHRoZSBudW1iZXIgb2YgdGltZSBzdGFtcCB0eXBlcyBpbiB0aGUgYXJyYXkgb24gc3VjY2VzcyBhbmQKKy5CIFBDQVBfRVJST1IKK29uIGZhaWx1cmUuCitBIHJldHVybiB2YWx1ZSBvZiB6ZXJvIG1lYW5zIHRoYXQgeW91IGNhbm5vdCBzcGVjaWZ5IGEgdGltZSBzdGFtcCB0eXBlOworeW91IGFyZSBsaW1pdGVkIHRvIHRoZSBjYXB0dXJlIGRldmljZSdzIGRlZmF1bHQgdGltZSBzdGFtcCB0eXBlLgorSWYKKy5CIFBDQVBfRVJST1IKK2lzIHJldHVybmVkLAorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSB0aGUgZXJyb3IgdGV4dC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfZ2V0ZXJyKDNQQ0FQKSwgcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZSgzUENBUCksCitwY2FwLXRzdGFtcChATUFOX01JU0NfSU5GT0ApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfbG9va3VwZGV2LjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX2xvb2t1cGRldi4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIzY2I4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX2xvb2t1cGRldi4zcGNhcApAQCAtMCwwICsxLDYyIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX2xvb2t1cGRldi4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfTE9PS1VQREVWIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9sb29rdXBkZXYgXC0gZmluZCB0aGUgZGVmYXVsdCBkZXZpY2Ugb24gd2hpY2ggdG8gY2FwdHVyZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLm5mCisuZnQgQgorY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRV07CisuZnQKKy5MUAorLmZ0IEIKK2NoYXIgKnBjYXBfbG9va3VwZGV2KGNoYXIgKmVycmJ1Zik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX2xvb2t1cGRldigpCityZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZyBnaXZpbmcgdGhlIG5hbWUgb2YgYSBuZXR3b3JrIGRldmljZQorc3VpdGFibGUgZm9yIHVzZSB3aXRoCisuQiBwY2FwX2NyZWF0ZSgpCithbmQKKy5CUiBwY2FwX2FjdGl2YXRlKCkgLAorb3Igd2l0aAorLkJSIHBjYXBfb3Blbl9saXZlKCkgLAorYW5kIHdpdGgKKy5CUiBwY2FwX2xvb2t1cG5ldCgpIC4KK0lmIHRoZXJlIGlzIGFuIGVycm9yLAorLkIgTlVMTAoraXMgcmV0dXJuZWQgYW5kCisuSSBlcnJidWYKK2lzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisuSSBlcnJidWYKK2lzIGFzc3VtZWQgdG8gYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0CisuQiBQQ0FQX0VSUkJVRl9TSVpFCitjaGFycy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY3JlYXRlKDNQQ0FQKSwgcGNhcF9hY3RpdmF0ZSgzUENBUCksCitwY2FwX29wZW5fbGl2ZSgzUENBUCksIHBjYXBfbG9va3VwbmV0KDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX2xvb2t1cG5ldC4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9sb29rdXBuZXQuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjODJjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9sb29rdXBuZXQuM3BjYXAKQEAgLTAsMCArMSw2NSBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9sb29rdXBuZXQuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX0xPT0tVUE5FVCAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfbG9va3VwbmV0IFwtIGZpbmQgdGhlIElQdjQgbmV0d29yayBudW1iZXIgYW5kIG5ldG1hc2sgZm9yIGEgZGV2aWNlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisubmYKKy5mdCBCCitjaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfbG9va3VwbmV0KGNvbnN0IGNoYXIgKmRldmljZSwgYnBmX3VfaW50MzIgKm5ldHAsCisudGkgKzgKK2JwZl91X2ludDMyICptYXNrcCwgY2hhciAqZXJyYnVmKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfbG9va3VwbmV0KCkKK2lzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBJUHY0IG5ldHdvcmsgbnVtYmVyIGFuZCBtYXNrCithc3NvY2lhdGVkIHdpdGggdGhlIG5ldHdvcmsgZGV2aWNlCisuSVIgZGV2aWNlIC4KK0JvdGgKKy5JIG5ldHAKK2FuZAorLkkgbWFza3AKK2FyZQorLkkgYnBmX3VfaW50MzIKK3BvaW50ZXJzLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9sb29rdXBuZXQoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorSWYgXC0xIGlzIHJldHVybmVkLAorLkkgZXJyYnVmCitpcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgorLkkgZXJyYnVmCitpcyBhc3N1bWVkIHRvIGJlIGFibGUgdG8gaG9sZCBhdCBsZWFzdAorLkIgUENBUF9FUlJCVUZfU0laRQorY2hhcnMuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfbG9vcC4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9sb29wLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMzA2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfbG9vcC4zcGNhcApAQCAtMCwwICsxLDE1NyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9sb29wLjNwY2FwLHYgMS40IDIwMDgtMTItMjUgMDI6MDE6MzIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9MT09QIDNQQ0FQICIyNCBEZWNlbWJlciAyMDA4IgorLlNIIE5BTUUKK3BjYXBfbG9vcCwgcGNhcF9kaXNwYXRjaCBcLSBwcm9jZXNzIHBhY2tldHMgZnJvbSBhIGxpdmUgY2FwdHVyZSBvciBzYXZlZmlsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK3R5cGVkZWYgdm9pZCAoKnBjYXBfaGFuZGxlcikodV9jaGFyICp1c2VyLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsCisudGkgKzgKKwkJCSAgICAgY29uc3QgdV9jaGFyICpieXRlcyk7CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX2xvb3AocGNhcF90ICpwLCBpbnQgY250LAorLnRpICs4CitwY2FwX2hhbmRsZXIgY2FsbGJhY2ssIHVfY2hhciAqdXNlcik7CitpbnQgcGNhcF9kaXNwYXRjaChwY2FwX3QgKnAsIGludCBjbnQsCisudGkgKzgKK3BjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfbG9vcCgpCitwcm9jZXNzZXMgcGFja2V0cyBmcm9tIGEgbGl2ZSBjYXB0dXJlIG9yIGBgc2F2ZWZpbGUnJyB1bnRpbAorLkkgY250CitwYWNrZXRzIGFyZSBwcm9jZXNzZWQsIHRoZSBlbmQgb2YgdGhlIGBgc2F2ZWZpbGUnJyBpcworcmVhY2hlZCB3aGVuIHJlYWRpbmcgZnJvbSBhIGBgc2F2ZWZpbGUnJywKKy5CIHBjYXBfYnJlYWtsb29wKCkKK2lzIGNhbGxlZCwgb3IgYW4gZXJyb3Igb2NjdXJzLgorSXQgZG9lcworLkIgbm90CityZXR1cm4gd2hlbiBsaXZlIHJlYWQgdGltZW91dHMgb2NjdXIuCitBIHZhbHVlIG9mIFwtMSBvciAwIGZvcgorLkkgY250CitpcyBlcXVpdmFsZW50IHRvIGluZmluaXR5LCBzbyB0aGF0IHBhY2tldHMgYXJlIHByb2Nlc3NlZCB1bnRpbCBhbm90aGVyCitlbmRpbmcgY29uZGl0aW9uIG9jY3Vycy4KKy5QUAorLkIgcGNhcF9kaXNwYXRjaCgpCitwcm9jZXNzZXMgcGFja2V0cyBmcm9tIGEgbGl2ZSBjYXB0dXJlIG9yIGBgc2F2ZWZpbGUnJyB1bnRpbAorLkkgY250CitwYWNrZXRzIGFyZSBwcm9jZXNzZWQsIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyZnVsIG9mIHBhY2tldHMgaXMKK3JlYWNoZWQgd2hlbiBkb2luZyBhIGxpdmUgY2FwdHVyZSwgdGhlIGVuZCBvZiB0aGUgYGBzYXZlZmlsZScnIGlzCityZWFjaGVkIHdoZW4gcmVhZGluZyBmcm9tIGEgYGBzYXZlZmlsZScnLAorLkIgcGNhcF9icmVha2xvb3AoKQoraXMgY2FsbGVkLCBvciBhbiBlcnJvciBvY2N1cnMuCitUaHVzLCB3aGVuIGRvaW5nIGEgbGl2ZSBjYXB0dXJlLAorLkkgY250CitpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0byBwcm9jZXNzIGJlZm9yZSByZXR1cm5pbmcsIGJ1dCBpcyBub3QKK2EgbWluaW11bSBudW1iZXI7IHdoZW4gcmVhZGluZyBhIGxpdmUgY2FwdHVyZSwgb25seSBvbmUKK2J1ZmZlcmZ1bCBvZiBwYWNrZXRzIGlzIHJlYWQgYXQgYSB0aW1lLCBzbyBmZXdlciB0aGFuCisuSSBjbnQKK3BhY2tldHMgbWF5IGJlIHByb2Nlc3NlZC4gQSB2YWx1ZSBvZiBcLTEgb3IgMCBmb3IKKy5JIGNudAorY2F1c2VzIGFsbCB0aGUgcGFja2V0cyByZWNlaXZlZCBpbiBvbmUgYnVmZmVyIHRvIGJlIHByb2Nlc3NlZCB3aGVuCityZWFkaW5nIGEgbGl2ZSBjYXB0dXJlLCBhbmQgY2F1c2VzIGFsbCB0aGUgcGFja2V0cyBpbiB0aGUgZmlsZSB0byBiZQorcHJvY2Vzc2VkIHdoZW4gcmVhZGluZyBhIGBgc2F2ZWZpbGUnJy4KKy5QUAorLmZ0IEIKKyhJbiBvbGRlciB2ZXJzaW9ucyBvZiBsaWJwY2FwLCB0aGUgYmVoYXZpb3Igd2hlbgorXGZJY250XGZQCit3YXMgMCB3YXMgdW5kZWZpbmVkOyBkaWZmZXJlbnQgcGxhdGZvcm1zIGFuZCBkZXZpY2VzIGJlaGF2ZWQKK2RpZmZlcmVudGx5LCBzbyBjb2RlIHRoYXQgbXVzdCB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgbGlicGNhcAorc2hvdWxkIHVzZSBcLTEsIG5vciAwLCBhcyB0aGUgdmFsdWUgb2YKK1xmSWNudFxmUC4pCisuZnQgUgorLlBQCisuSSBjYWxsYmFjaworc3BlY2lmaWVzIGEKKy5JIHBjYXBfaGFuZGxlcgorcm91dGluZSB0byBiZSBjYWxsZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6CithCisuSSB1X2NoYXIKK3BvaW50ZXIgd2hpY2ggaXMgcGFzc2VkIGluIHRoZQorLkkgdXNlcgorYXJndW1lbnQgdG8KKy5CIHBjYXBfbG9vcCgpCitvcgorLkJSIHBjYXBfZGlzcGF0Y2goKSAsCithCisuSSBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIKK3BvaW50ZXIgcG9pbnRpbmcgdG8gdGhlIHBhY2tldCB0aW1lIHN0YW1wIGFuZCBsZW5ndGhzLCBhbmQgYQorLkkgY29uc3QgdV9jaGFyCitwb2ludGVyIHRvIHRoZSBmaXJzdAorLkIgY2FwbGVuCisoYXMgZ2l2ZW4gaW4gdGhlCisuSSBzdHJ1Y3QgcGNhcF9wa3RoZHIKK2EgcG9pbnRlciB0byB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHJvdXRpbmUpCitieXRlcyBvZiBkYXRhIGZyb20gdGhlIHBhY2tldC4gIFRoZQorLkkgc3RydWN0IHBjYXBfcGt0aGRyCithbmQgdGhlIHBhY2tldCBkYXRhIGFyZSBub3QgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxiYWNrIHJvdXRpbmUsIGFuZCBhcmUKK25vdCBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIGFmdGVyIHRoZSBjYWxsYmFjayByb3V0aW5lIHJldHVybnM7IGlmIHRoZQorY29kZSBuZWVkcyB0aGVtIHRvIGJlIHZhbGlkIGFmdGVyIHRoZSBjYWxsYmFjaywgaXQgbXVzdCBtYWtlIGEgY29weSBvZgordGhlbS4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfbG9vcCgpCityZXR1cm5zIDAgaWYKKy5JIGNudAoraXMgZXhoYXVzdGVkLCBcLTEgaWYgYW4gZXJyb3Igb2NjdXJzLCBvciBcLTIgaWYgdGhlIGxvb3AgdGVybWluYXRlZCBkdWUKK3RvIGEgY2FsbCB0bworLkIgcGNhcF9icmVha2xvb3AoKQorYmVmb3JlIGFueSBwYWNrZXRzIHdlcmUgcHJvY2Vzc2VkLgorSXQgZG9lcworLkIgbm90CityZXR1cm4gd2hlbiBsaXZlIHJlYWQgdGltZW91dHMgb2NjdXI7IGluc3RlYWQsIGl0IGF0dGVtcHRzIHRvIHJlYWQgbW9yZQorcGFja2V0cy4KKy5QUAorLkIgcGNhcF9kaXNwYXRjaCgpCityZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFja2V0cyBwcm9jZXNzZWQgb24gc3VjY2VzczsgdGhpcyBjYW4gYmUgMCBpZiBubworcGFja2V0cyB3ZXJlIHJlYWQgZnJvbSBhIGxpdmUgY2FwdHVyZSAoaWYsIGZvciBleGFtcGxlLCB0aGV5IHdlcmUKK2Rpc2NhcmRlZCBiZWNhdXNlIHRoZXkgZGlkbid0IHBhc3MgdGhlIHBhY2tldCBmaWx0ZXIsIG9yIGlmLCBvbgorcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBhIHJlYWQgdGltZW91dCB0aGF0IHN0YXJ0cyBiZWZvcmUgYW55IHBhY2tldHMKK2Fycml2ZSwgdGhlIHRpbWVvdXQgZXhwaXJlcyBiZWZvcmUgYW55IHBhY2tldHMgYXJyaXZlLCBvciBpZiB0aGUgZmlsZQorZGVzY3JpcHRvciBmb3IgdGhlIGNhcHR1cmUgZGV2aWNlIGlzIGluIG5vbi1ibG9ja2luZyBtb2RlIGFuZCBubyBwYWNrZXRzCit3ZXJlIGF2YWlsYWJsZSB0byBiZSByZWFkKSBvciBpZiBubyBtb3JlIHBhY2tldHMgYXJlIGF2YWlsYWJsZSBpbiBhCitgYHNhdmVmaWxlLicnICBJdCByZXR1cm5zIFwtMSBpZiBhbiBlcnJvciBvY2N1cnMgb3IgXC0yIGlmIHRoZSBsb29wCit0ZXJtaW5hdGVkIGR1ZSB0byBhIGNhbGwgdG8KKy5CIHBjYXBfYnJlYWtsb29wKCkKK2JlZm9yZSBhbnkgcGFja2V0cyB3ZXJlIHByb2Nlc3NlZC4KKy5mdCBCCitJZiB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgcGNhcF9icmVha2xvb3AoKSwKK21ha2Ugc3VyZSB0aGF0IHlvdSBleHBsaWNpdGx5IGNoZWNrIGZvciBcLTEgYW5kIFwtMiwgcmF0aGVyIHRoYW4ganVzdAorY2hlY2tpbmcgZm9yIGEgcmV0dXJuIHZhbHVlIDwgMC4KKy5mdCBSCisuUFAKK0lmIFwtMSBpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCksIHBjYXBfYnJlYWtsb29wKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX21ham9yX3ZlcnNpb24uM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfbWFqb3JfdmVyc2lvbi4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTkwM2RjCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX21ham9yX3ZlcnNpb24uM3BjYXAKQEAgLTAsMCArMSw1NiBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9tYWpvcl92ZXJzaW9uLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9NQUpPUl9WRVJTSU9OIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9tYWpvcl92ZXJzaW9uLCBwY2FwX21pbm9yX3ZlcnNpb24gXC0gZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBvZiBhIHNhdmVmaWxlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfbWFqb3JfdmVyc2lvbihwY2FwX3QgKnApOworaW50IHBjYXBfbWlub3JfdmVyc2lvbihwY2FwX3QgKnApOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorSWYKKy5JIHAKK3JlZmVycyB0byBhIGBgc2F2ZWZpbGUnJywKKy5CIHBjYXBfbWFqb3JfdmVyc2lvbigpCityZXR1cm5zIHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIGZpbGUgZm9ybWF0IG9mIHRoZSBgYHNhdmVmaWxlJycgYW5kCisuQiBwY2FwX21pbm9yX3ZlcnNpb24oKQorcmV0dXJucyB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgYGBzYXZlZmlsZScnLiAgVGhlCit2ZXJzaW9uIG51bWJlciBpcyBzdG9yZWQgaW4gdGhlIGBgc2F2ZWZpbGUnJzsgbm90ZSB0aGF0IHRoZSBtZWFuaW5nIG9mCitpdHMgdmFsdWVzIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgYGBzYXZlZmlsZScnIChmb3IgZXhhbXBsZSwgcGNhcCBvcgorcGNhcC1ORykuCisuUFAKK0lmCisuSSBwCityZWZlcnMgdG8gYSBsaXZlIGNhcHR1cmUsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkKKy5CIHBjYXBfbWFqb3JfdmVyc2lvbigpCithbmQKKy5CIHBjYXBfbWlub3JfdmVyc2lvbigpCithcmUgbm90IG1lYW5pbmdmdWwuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfbmV4dF9leC4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9uZXh0X2V4LjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzM4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfbmV4dF9leC4zcGNhcApAQCAtMCwwICsxLDEwNyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9uZXh0X2V4LjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9ORVhUX0VYIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9uZXh0X2V4LCBwY2FwX25leHQgXC0gcmVhZCB0aGUgbmV4dCBwYWNrZXQgZnJvbSBhIHBjYXBfdAorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX25leHRfZXgocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKipwa3RfaGVhZGVyLAorLnRpICs4Citjb25zdCB1X2NoYXIgKipwa3RfZGF0YSk7Citjb25zdCB1X2NoYXIgKnBjYXBfbmV4dChwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3BrdGhkciAqaCk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX25leHRfZXgoKQorcmVhZHMgdGhlIG5leHQgcGFja2V0IGFuZCByZXR1cm5zIGEgc3VjY2Vzcy9mYWlsdXJlIGluZGljYXRpb24uCitJZiB0aGUgcGFja2V0IHdhcyByZWFkIHdpdGhvdXQgcHJvYmxlbXMsIHRoZSBwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlCisuSSBwa3RfaGVhZGVyCithcmd1bWVudCBpcyBzZXQgdG8gcG9pbnQgdG8gdGhlCisuSSBwY2FwX3BrdGhkcgorc3RydWN0IGZvciB0aGUgcGFja2V0LCBhbmQgdGhlCitwb2ludGVyIHBvaW50ZWQgdG8gYnkgdGhlCisuSSBwa3RfZGF0YQorYXJndW1lbnQgaXMgc2V0IHRvIHBvaW50IHRvIHRoZSBkYXRhIGluIHRoZSBwYWNrZXQuICBUaGUKKy5JIHN0cnVjdCBwY2FwX3BrdGhkcgorYW5kIHRoZSBwYWNrZXQgZGF0YSBhcmUgbm90IHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBhcmUgbm90CitndWFyYW50ZWVkIHRvIGJlIHZhbGlkIGFmdGVyIHRoZSBuZXh0IGNhbGwgdG8KKy5CUiBwY2FwX25leHRfZXgoKSAsCisuQlIgcGNhcF9uZXh0KCkgLAorLkJSIHBjYXBfbG9vcCgpICwKK29yCisuQlIgcGNhcF9kaXNwYXRjaCgpIDsKK2lmIHRoZSBjb2RlIG5lZWRzIHRoZW0gdG8gcmVtYWluIHZhbGlkLCBpdCBtdXN0IG1ha2UgYSBjb3B5IG9mIHRoZW0uCisuUFAKKy5CIHBjYXBfbmV4dCgpCityZWFkcyB0aGUgbmV4dCBwYWNrZXQgKGJ5IGNhbGxpbmcKKy5CIHBjYXBfZGlzcGF0Y2goKQord2l0aCBhCisuSSBjbnQKK29mIDEpIGFuZCByZXR1cm5zIGEKKy5JIHVfY2hhcgorcG9pbnRlciB0byB0aGUgZGF0YSBpbiB0aGF0IHBhY2tldC4gIFRoZQorcGFja2V0IGRhdGEgaXMgbm90IHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIsIGFuZCBpcyBub3QKK2d1YXJhbnRlZWQgdG8gYmUgdmFsaWQgYWZ0ZXIgdGhlIG5leHQgY2FsbCB0bworLkJSIHBjYXBfbmV4dF9leCgpICwKKy5CUiBwY2FwX25leHQoKSAsCisuQlIgcGNhcF9sb29wKCkgLAorb3IKKy5CUiBwY2FwX2Rpc3BhdGNoKCkgOworaWYgdGhlIGNvZGUgbmVlZHMgaXQgdG8gcmVtYWluIHZhbGlkLCBpdCBtdXN0IG1ha2UgYSBjb3B5IG9mIGl0LgorVGhlCisuSSBwY2FwX3BrdGhkcgorc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkKKy5JIGgKK2lzIGZpbGxlZCBpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHRoZSBwYWNrZXQuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX25leHRfZXgoKQorcmV0dXJucyAxIGlmIHRoZSBwYWNrZXQgd2FzIHJlYWQgd2l0aG91dCBwcm9ibGVtcywgMAoraWYgcGFja2V0cyBhcmUgYmVpbmcgcmVhZCBmcm9tIGEgbGl2ZSBjYXB0dXJlLCBhbmQgdGhlIHRpbWVvdXQgZXhwaXJlZCwKK1wtMSBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIHRoZSBwYWNrZXQsIGFuZCBcLTIgaWYKK3BhY2tldHMgYXJlIGJlaW5nIHJlYWQgZnJvbSBhIGBgc2F2ZWZpbGUnJywgYW5kIHRoZXJlIGFyZSBubyBtb3JlCitwYWNrZXRzIHRvIHJlYWQgZnJvbSB0aGUgc2F2ZWZpbGUuCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlBQCisuQiBwY2FwX25leHQoKQorcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHBhY2tldCBkYXRhIG9uIHN1Y2Nlc3MsIGFuZCByZXR1cm5zCisuQiBOVUxMCitpZiBhbiBlcnJvciBvY2N1cnJlZCwgb3IgaWYgbm8gcGFja2V0cyB3ZXJlIHJlYWQgZnJvbSBhIGxpdmUKK2NhcHR1cmUgKGlmLCBmb3IgZXhhbXBsZSwgdGhleSB3ZXJlIGRpc2NhcmRlZCBiZWNhdXNlIHRoZXkgZGlkbid0IHBhc3MKK3RoZSBwYWNrZXQgZmlsdGVyLCBvciBpZiwgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBhIHJlYWQgdGltZW91dCB0aGF0CitzdGFydHMgYmVmb3JlIGFueSBwYWNrZXRzIGFycml2ZSwgdGhlIHRpbWVvdXQgZXhwaXJlcyBiZWZvcmUgYW55IHBhY2tldHMKK2Fycml2ZSwgb3IgaWYgdGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGNhcHR1cmUgZGV2aWNlIGlzIGluCitub24tYmxvY2tpbmcgbW9kZSBhbmQgbm8gcGFja2V0cyB3ZXJlIGF2YWlsYWJsZSB0byBiZSByZWFkKSwgb3IgaWYgbm8KK21vcmUgcGFja2V0cyBhcmUgYXZhaWxhYmxlIGluIGEgYGBzYXZlZmlsZS4nJyAgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMKK25vIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBlcnJvciBvY2N1cnJlZCBvciBub3QuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCksIHBjYXBfZGlzcGF0Y2goM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfb2ZmbGluZV9maWx0ZXIuM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfb2ZmbGluZV9maWx0ZXIuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2YzVlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9vZmZsaW5lX2ZpbHRlci4zcGNhcApAQCAtMCwwICsxLDU3IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX29mZmxpbmVfZmlsdGVyLjNwY2FwLHYgMS4xIDIwMDgtMDUtMTMgMTU6MTk6NTYgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9PRkZMSU5FX0ZJTFRFUiAzUENBUCAiMTMgTWF5IDIwMDgiCisuU0ggTkFNRQorcGNhcF9vZmZsaW5lX2ZpbHRlciBcLSBjaGVjayB3aGV0aGVyIGEgZmlsdGVyIG1hdGNoZXMgYSBwYWNrZXQKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9vZmZsaW5lX2ZpbHRlcihzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwLAorLnRpICs4Citjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqcGt0KQorLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9vZmZsaW5lX2ZpbHRlcigpCitjaGVja3Mgd2hldGhlciBhIGZpbHRlciBtYXRjaGVzIGEgcGFja2V0LgorLkkgZnAKK2lzIGEgcG9pbnRlciB0byBhCisuSSBicGZfcHJvZ3JhbQorc3RydWN0LCB1c3VhbGx5IHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvCisuQlIgcGNhcF9jb21waWxlKCkgLgorLkkgaAorcG9pbnRzIHRvIHRoZQorLkkgcGNhcF9wa3RoZHIKK3N0cnVjdHVyZSBmb3IgdGhlIHBhY2tldCwgYW5kCisuSSBwa3QKK3BvaW50cyB0byB0aGUgZGF0YSBpbiB0aGUgcGFja2V0LgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9vZmZsaW5lX2ZpbHRlcigpCityZXR1cm5zIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZpbHRlciBwcm9ncmFtLiAgVGhpcyB3aWxsIGJlIHplcm8gaWYKK3RoZSBwYWNrZXQgZG9lc24ndCBtYXRjaCB0aGUgZmlsdGVyIGFuZCBub24temVybyBpZiB0aGUgcGFja2V0IG1hdGNoZXMKK3RoZSBmaWx0ZXIuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2NvbXBpbGUoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfb3Blbl9kZWFkLjNwY2FwLmluIGIvbGlicGNhcC0xLjMuMC9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRmNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbgpAQCAtMCwwICsxLDUyIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX29wZW5fZGVhZC4zcGNhcC5pbix2IDEuMSAyMDA4LTEwLTIxIDA3OjMzOjAyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfT1BFTl9ERUFEIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9vcGVuX2RlYWQgXC0gb3BlbiBhIGZha2UgcGNhcF90IGZvciBjb21waWxpbmcgZmlsdGVycyBvciBvcGVuaW5nIGEKK2NhcHR1cmUgZm9yIG91dHB1dAorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK3BjYXBfdCAqcGNhcF9vcGVuX2RlYWQoaW50IGxpbmt0eXBlLCBpbnQgc25hcGxlbik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuUFAKKy5CIHBjYXBfb3Blbl9kZWFkKCkKK2lzIHVzZWQgZm9yIGNyZWF0aW5nIGEKKy5CIHBjYXBfdAorc3RydWN0dXJlIHRvIHVzZSB3aGVuIGNhbGxpbmcgdGhlIG90aGVyIGZ1bmN0aW9ucyBpbiBsaWJwY2FwLiAgSXQgaXMKK3R5cGljYWxseSB1c2VkIHdoZW4ganVzdCB1c2luZyBsaWJwY2FwIGZvciBjb21waWxpbmcgQlBGIGNvZGUuCisuUFAKKy5JIGxpbmt0eXBlCitzcGVjaWZpZXMgdGhlIGxpbmstbGF5ZXIgdHlwZSBmb3IgdGhlCisuQlIgcGNhcF90IC4KKy5QUAorLkkgc25hcGxlbgorc3BlY2lmaWVzIHRoZSBzbmFwc2hvdCBsZW5ndGggZm9yIHRoZQorLkJSIHBjYXBfdCAuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwLWxpbmt0eXBlKEBNQU5fTUlTQ19JTkZPQCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9vcGVuX2xpdmUuM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfb3Blbl9saXZlLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODlhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfb3Blbl9saXZlLjNwY2FwCkBAIC0wLDAgKzEsODkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfb3Blbl9saXZlLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9PUEVOX0xJVkUgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX29wZW5fbGl2ZSBcLSBvcGVuIGEgZGV2aWNlIGZvciBjYXB0dXJpbmcKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5uZgorLmZ0IEIKK2NoYXIgZXJyYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworLmZ0CisuTFAKKy5mdCBCCitwY2FwX3QgKnBjYXBfb3Blbl9saXZlKGNvbnN0IGNoYXIgKmRldmljZSwgaW50IHNuYXBsZW4sCisudGkgKzgKK2ludCBwcm9taXNjLCBpbnQgdG9fbXMsIGNoYXIgKmVycmJ1Zik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX29wZW5fbGl2ZSgpCitpcyB1c2VkIHRvIG9idGFpbiBhIHBhY2tldCBjYXB0dXJlIGhhbmRsZSB0byBsb29rCithdCBwYWNrZXRzIG9uIHRoZSBuZXR3b3JrLgorLkkgZGV2aWNlCitpcyBhIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgbmV0d29yayBkZXZpY2UgdG8gb3Blbjsgb24gTGludXggc3lzdGVtcword2l0aCAyLjIgb3IgbGF0ZXIga2VybmVscywgYQorLkkgZGV2aWNlCithcmd1bWVudCBvZiAiYW55IiBvcgorLkIgTlVMTAorY2FuIGJlIHVzZWQgdG8gY2FwdHVyZSBwYWNrZXRzIGZyb20gYWxsIGludGVyZmFjZXMuCisuUFAKKy5JIHNuYXBsZW4KK3NwZWNpZmllcyB0aGUgc25hcHNob3QgbGVuZ3RoIHRvIGJlIHNldCBvbiB0aGUgaGFuZGxlLgorLlBQCisuSSBwcm9taXNjCitzcGVjaWZpZXMgaWYgdGhlIGludGVyZmFjZSBpcyB0byBiZSBwdXQgaW50byBwcm9taXNjdW91cyBtb2RlLgorLlBQCisuSSB0b19tcworc3BlY2lmaWVzIHRoZSByZWFkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9vcGVuX2xpdmUoKQorcmV0dXJucyBhCisuSSBwY2FwX3QgKgorb24gc3VjY2VzcyBhbmQKKy5CIE5VTEwKK29uIGZhaWx1cmUuCitJZgorLkIgTlVMTAoraXMgcmV0dXJuZWQsCisuSSBlcnJidWYKK2lzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisuSSBlcnJidWYKK21heSBhbHNvIGJlIHNldCB0byB3YXJuaW5nIHRleHQgd2hlbgorLkIgcGNhcF9vcGVuX2xpdmUoKQorc3VjY2VlZHM7IHRvIGRldGVjdCB0aGlzIGNhc2UgdGhlIGNhbGxlciBzaG91bGQgc3RvcmUgYSB6ZXJvLWxlbmd0aCBzdHJpbmcgaW4KKy5JIGVycmJ1ZgorYmVmb3JlIGNhbGxpbmcKKy5CIHBjYXBfb3Blbl9saXZlKCkKK2FuZCBkaXNwbGF5IHRoZSB3YXJuaW5nIHRvIHRoZSB1c2VyIGlmCisuSSBlcnJidWYKK2lzIG5vIGxvbmdlciBhIHplcm8tbGVuZ3RoIHN0cmluZy4KKy5JIGVycmJ1ZgoraXMgYXNzdW1lZCB0byBiZSBhYmxlIHRvIGhvbGQgYXQgbGVhc3QKKy5CIFBDQVBfRVJSQlVGX1NJWkUKK2NoYXJzLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX29wZW5fb2ZmbGluZS4zcGNhcC5pbiBiL2xpYnBjYXAtMS4zLjAvcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5ZjVhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAuaW4KQEAgLTAsMCArMSw4MiBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9vcGVuX29mZmxpbmUuM3BjYXAuaW4sdiAxLjEgMjAwOC0xMC0yMyAwNTo1Njo1OSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX09QRU5fT0ZGTElORSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfb3Blbl9vZmZsaW5lLCBwY2FwX2ZvcGVuX29mZmxpbmUgXC0gb3BlbiBhIHNhdmVkIGNhcHR1cmUgZmlsZSBmb3IgcmVhZGluZworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLm5mCisuZnQgQgorY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRV07CisuZnQKKy5MUAorLmZ0IEIKK3BjYXBfdCAqcGNhcF9vcGVuX29mZmxpbmUoY29uc3QgY2hhciAqZm5hbWUsIGNoYXIgKmVycmJ1Zik7CitwY2FwX3QgKnBjYXBfZm9wZW5fb2ZmbGluZShGSUxFICpmcCwgY2hhciAqZXJyYnVmKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfb3Blbl9vZmZsaW5lKCkKK2lzIGNhbGxlZCB0byBvcGVuIGEgYGBzYXZlZmlsZScnIGZvciByZWFkaW5nLgorLlBQCisuSSBmbmFtZQorc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIG9wZW4uIFRoZSBmaWxlIGNhbiBoYXZlIHRoZSBwY2FwIGZpbGUKK2Zvcm1hdCBhcyBkZXNjcmliZWQgaW4KKy5CUiBwY2FwLXNhdmVmaWxlIChATUFOX0ZJTEVfRk9STUFUU0ApLAord2hpY2ggaXMgdGhlIGZpbGUgZm9ybWF0IHVzZWQgYnksIGFtb25nIG90aGVyIHByb2dyYW1zLAorLkJSIHRjcGR1bXAgKDEpCithbmQKKy5CUiB0Y3BzbGljZSAoMSksCitvciBjYW4gaGF2ZSB0aGUgcGNhcC1uZyBmaWxlIGZvcm1hdCwgYWx0aG91Z2ggbm90IGFsbCBwY2FwLW5nIGZpbGVzIGNhbgorYmUgcmVhZC4KK1RoZSBuYW1lICItIiBpbiBhIHN5bm9ueW0gZm9yCisuQlIgc3RkaW4gLgorLlBQCitBbHRlcm5hdGl2ZWx5LCB5b3UgbWF5IGNhbGwKKy5CIHBjYXBfZm9wZW5fb2ZmbGluZSgpCit0byByZWFkIGR1bXBlZCBkYXRhIGZyb20gYW4gZXhpc3Rpbmcgb3BlbiBzdHJlYW0KKy5JUiBmcCAuCitOb3RlIHRoYXQgb24gV2luZG93cywgdGhhdCBzdHJlYW0gc2hvdWxkIGJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZS4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfb3Blbl9vZmZsaW5lKCkKK2FuZAorLkIgcGNhcF9mb3Blbl9vZmZsaW5lKCkKK3JldHVybiBhCisuSSBwY2FwX3QgKgorb24gc3VjY2VzcyBhbmQKKy5CIE5VTEwKK29uIGZhaWx1cmUuCitJZgorLkIgTlVMTAoraXMgcmV0dXJuZWQsCisuSSBlcnJidWYKK2lzIGZpbGxlZCBpbiB3aXRoIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UuCisuSSBlcnJidWYKK2lzIGFzc3VtZWQgdG8gYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0CisuQiBQQ0FQX0VSUkJVRl9TSVpFCitjaGFycy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXAtc2F2ZWZpbGUoQE1BTl9GSUxFX0ZPUk1BVFNAKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NldF9idWZmZXJfc2l6ZS4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRfYnVmZmVyX3NpemUuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwZTkyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRfYnVmZmVyX3NpemUuM3BjYXAKQEAgLTAsMCArMSw0NyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zZXRfYnVmZmVyX3NpemUuM3BjYXAsdiAxLjEgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NFVF9CVUZGRVJfU0laRSAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfc2V0X2J1ZmZlcl9zaXplIFwtIHNldCB0aGUgYnVmZmVyIHNpemUgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQKK2NhcHR1cmUgaGFuZGxlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5MUAorLmZ0IEIKK2ludCBwY2FwX3NldF9idWZmZXJfc2l6ZShwY2FwX3QgKnAsIGludCBidWZmZXJfc2l6ZSk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3NldF9idWZmZXJfc2l6ZSgpCitzZXRzIHRoZSBidWZmZXIgc2l6ZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHdoZW4KK3RoZSBoYW5kbGUgaXMgYWN0aXZhdGVkIHRvCisuSVIgYnVmZmVyX3NpemUgLAord2hpY2ggaXMgaW4gdW5pdHMgb2YgYnl0ZXMuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldF9idWZmZXJfc2l6ZSgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBvcgorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NldF9kYXRhbGluay4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRfZGF0YWxpbmsuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmMzJkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRfZGF0YWxpbmsuM3BjYXAKQEAgLTAsMCArMSw1MyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zZXRfZGF0YWxpbmsuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NFVF9EQVRBTElOSyAzUENBUCAiMjIgQXVndXN0IDIwMTAiCisuU0ggTkFNRQorcGNhcF9zZXRfZGF0YWxpbmsgXC0gc2V0IHRoZSBsaW5rLWxheWVyIGhlYWRlciB0eXBlIHRvIGJlIHVzZWQgYnkgYQorY2FwdHVyZSBkZXZpY2UKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRfZGF0YWxpbmsocGNhcF90ICpwLCBpbnQgZGx0KTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0X2RhdGFsaW5rKCkKK2lzIHVzZWQgdG8gc2V0IHRoZSBjdXJyZW50IGxpbmstbGF5ZXIgaGVhZGVyIHR5cGUgb2YgdGhlIHBjYXAgZGVzY3JpcHRvcgordG8gdGhlIHR5cGUgc3BlY2lmaWVkIGJ5CisuSVIgZGx0IC4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfc2V0X2RhdGFsaW5rKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBcLTEgb24gZmFpbHVyZS4KK0lmIFwtMSBpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCksCitwY2FwX2RhdGFsaW5rX25hbWVfdG9fdmFsKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NldF9wcm9taXNjLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX3NldF9wcm9taXNjLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjI2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfc2V0X3Byb21pc2MuM3BjYXAKQEAgLTAsMCArMSw0OCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zZXRfcHJvbWlzYy4zcGNhcCx2IDEuMSAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUX1BST01JU0MgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NldF9wcm9taXNjIFwtIHNldCBwcm9taXNjdW91cyBtb2RlIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCitjYXB0dXJlIGhhbmRsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRfcHJvbWlzYyhwY2FwX3QgKnAsIGludCBwcm9taXNjKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0X3Byb21pc2MoKQorc2V0cyB3aGV0aGVyIHByb21pc2N1b3VzIG1vZGUgc2hvdWxkIGJlIHNldCBvbiBhIGNhcHR1cmUgaGFuZGxlIHdoZW4KK3RoZSBoYW5kbGUgaXMgYWN0aXZhdGVkLgorSWYKKy5JIHByb21pc2MKK2lzIG5vbi16ZXJvLCBwcm9taXNjdW91cyBtb2RlIHdpbGwgYmUgc2V0LCBvdGhlcndpc2UgaXQgd2lsbCBub3QgYmUgc2V0LgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zZXRfcHJvbWlzYygpCityZXR1cm5zIDAgb24gc3VjY2VzcyBvcgorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NldF9yZm1vbi4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRfcmZtb24uM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3MzU1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRfcmZtb24uM3BjYXAKQEAgLTAsMCArMSw0OSBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zZXRfcmZtb24uM3BjYXAsdiAxLjEgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NFVF9SRk1PTiAzUENBUCAiNSBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfc2V0X3JmbW9uIFwtIHNldCBtb25pdG9yIG1vZGUgZm9yIGEgbm90LXlldC1hY3RpdmF0ZWQgY2FwdHVyZQoraGFuZGxlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5MUAorLmZ0IEIKK2ludCBwY2FwX3NldF9yZm1vbihwY2FwX3QgKnAsIGludCByZm1vbik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3NldF9yZm1vbigpCitzZXRzIHdoZXRoZXIgbW9uaXRvciBtb2RlIHNob3VsZCBiZSBzZXQgb24gYSBjYXB0dXJlIGhhbmRsZSB3aGVuCit0aGUgaGFuZGxlIGlzIGFjdGl2YXRlZC4KK0lmCisuSSByZm1vbgoraXMgbm9uLXplcm8sIG1vbml0b3IgbW9kZSB3aWxsIGJlIHNldCwgb3RoZXJ3aXNlIGl0IHdpbGwgbm90IGJlIHNldC4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfc2V0X3JmbW9uKCkKK3JldHVybnMgMCBvbiBzdWNjZXNzIG9yCisuQiBQQ0FQX0VSUk9SX0FDVElWQVRFRAoraWYgY2FsbGVkIG9uIGEgY2FwdHVyZSBoYW5kbGUgdGhhdCBoYXMgYmVlbiBhY3RpdmF0ZWQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2NyZWF0ZSgzUENBUCksIHBjYXBfYWN0aXZhdGUoM1BDQVApLAorcGNhcF9jYW5fc2V0X3JmbW9uKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NldF9zbmFwbGVuLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX3NldF9zbmFwbGVuLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTk1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfc2V0X3NuYXBsZW4uM3BjYXAKQEAgLTAsMCArMSw0NiBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zZXRfc25hcGxlbi4zcGNhcCx2IDEuMSAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUX1NOQVBMRU4gM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NldF9zbmFwbGVuIFwtIHNldCB0aGUgc25hcHNob3QgbGVuZ3RoIGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCitjYXB0dXJlIGhhbmRsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRfc25hcGxlbihwY2FwX3QgKnAsIGludCBzbmFwbGVuKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0X3NuYXBsZW4oKQorc2V0cyB0aGUgc25hcHNob3QgbGVuZ3RoIHRvIGJlIHVzZWQgb24gYSBjYXB0dXJlIGhhbmRsZSB3aGVuIHRoZSBoYW5kbGUKK2lzIGFjdGl2YXRlZCB0bworLklSIHNuYXBsZW4gLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zZXRfc25hcGxlbigpCityZXR1cm5zIDAgb24gc3VjY2VzcyBvcgorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NldF90aW1lb3V0LjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX3NldF90aW1lb3V0LjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjFiN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfc2V0X3RpbWVvdXQuM3BjYXAKQEAgLTAsMCArMSw0NyBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zZXRfdGltZW91dC4zcGNhcCx2IDEuMSAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUX1RJTUVPVVQgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NldF90aW1lb3V0IFwtIHNldCB0aGUgcmVhZCB0aW1lb3V0IGZvciBhIG5vdC15ZXQtYWN0aXZhdGVkCitjYXB0dXJlIGhhbmRsZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRfdGltZW91dChwY2FwX3QgKnAsIGludCB0b19tcyk7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3NldF90aW1lb3V0KCkKK3NldHMgdGhlIHJlYWQgdGltZW91dCB0aGF0IHdpbGwgYmUgdXNlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHdoZW4KK3RoZSBoYW5kbGUgaXMgYWN0aXZhdGVkIHRvCisuSVIgdG9fbXMgLAord2hpY2ggaXMgaW4gdW5pdHMgb2YgbWlsbGlzZWNvbmRzLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zZXRfdGltZW91dCgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBvcgorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9jcmVhdGUoM1BDQVApLCBwY2FwX2FjdGl2YXRlKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NldF90c3RhbXBfdHlwZS4zcGNhcC5pbiBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRfdHN0YW1wX3R5cGUuM3BjYXAuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxYzMxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRfdHN0YW1wX3R5cGUuM3BjYXAuaW4KQEAgLTAsMCArMSw2NSBAQAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUX1RTVEFNUF9UWVBFIDNQQ0FQICIyMSBBdWd1c3QgMjAxMCIKKy5TSCBOQU1FCitwY2FwX3NldF90c3RhbXBfdHlwZSBcLSBzZXQgdGhlIHRpbWUgc3RhbXAgdHlwZSB0byBiZSB1c2VkIGJ5IGEKK2NhcHR1cmUgZGV2aWNlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0X3RzdGFtcF90eXBlKHBjYXBfdCAqcCwgaW50IHRzdGFtcF90eXBlKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0X3RzdGFtcF90eXBlKCkKK3NldHMgdGhlIHRoZSB0eXBlIG9mIHRpbWUgc3RhbXAgZGVzaXJlZCBmb3IgcGFja2V0cyBjYXB0dXJlZCBvbiB0aGUgcGNhcAorZGVzY3JpcHRvciB0byB0aGUgdHlwZSBzcGVjaWZpZWQgYnkKKy5JUiB0c3RhbXBfdHlwZSAuCitJdCBtdXN0IGJlIGNhbGxlZCBvbiBhIHBjYXAgZGVzY3JpcHRvciBjcmVhdGVkIGJ5CisuQiBwY2FwX2NyZWF0ZSgpCit0aGF0IGhhcyBub3QgeWV0IGJlZW4gYWN0aXZhdGVkIGJ5CisuQlIgcGNhcF9hY3RpdmF0ZSgpIC4KKy5CIHBjYXBfbGlzdF90c3RhbXBfdHlwZXMoKQord2lsbCBnaXZlIGEgbGlzdCBvZiB0aGUgdGltZSBzdGFtcCB0eXBlcyBzdXBwb3J0ZWQgYnkgYSBnaXZlbiBjYXB0dXJlCitkZXZpY2UuCitTZWUKKy5CUiBwY2FwLXRzdGFtcCAoQE1BTl9NSVNDX0lORk9AKQorZm9yIGEgbGlzdCBvZiBhbGwgdGhlIHRpbWUgc3RhbXAgdHlwZXMuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldF90c3RhbXBfdHlwZSgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBpZiB0aGUgc3BlY2lmaWVkIHRpbWUgc3RhbXAgdHlwZSBpcyBleHBlY3RlZCB0byBiZQorc3VwcG9ydGVkIGJ5IHRoZSBjYXB0dXJlIGRldmljZSwKKy5CIFBDQVBfV0FSTklOR19UU1RBTVBfVFlQRV9OT1RTVVAKK29uIHN1Y2Nlc3MgaWYgdGhlIHNwZWNpZmllZCB0aW1lIHN0YW1wIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKK2NhcHR1cmUgZGV2aWNlLAorLkIgUENBUF9FUlJPUl9BQ1RJVkFURUQKK2lmIGNhbGxlZCBvbiBhIGNhcHR1cmUgaGFuZGxlIHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkLCBhbmQKKy5CIFBDQVBfRVJST1JfQ0FOVFNFVF9UU1RBTVBfVFlQRQoraWYgdGhlIGNhcHR1cmUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBzZXR0aW5nIHRoZSB0aW1lIHN0YW1wIHR5cGUuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLAorcGNhcF9saXN0X3RzdGFtcF90eXBlcygzUENBUCksCitwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsKDNQQ0FQKSwKK3BjYXAtdHN0YW1wKEBNQU5fTUlTQ19JTkZPQCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9zZXRkaXJlY3Rpb24uM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfc2V0ZGlyZWN0aW9uLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMGZiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfc2V0ZGlyZWN0aW9uLjNwY2FwCkBAIC0wLDAgKzEsNzEgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc2V0ZGlyZWN0aW9uLjNwY2FwLHYgMS4zIDIwMDgtMDQtMDYgMDI6NTM6MjIgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9TRVRESVJFQ1RJT04gM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NldGRpcmVjdGlvbiBcLSBzZXQgdGhlIGRpcmVjdGlvbiBmb3Igd2hpY2ggcGFja2V0cyB3aWxsIGJlIGNhcHR1cmVkCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0ZGlyZWN0aW9uKHBjYXBfdCAqcCwgcGNhcF9kaXJlY3Rpb25fdCBkKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0ZGlyZWN0aW9uKCkKK2lzIHVzZWQgdG8gc3BlY2lmeSBhIGRpcmVjdGlvbiB0aGF0IHBhY2tldHMgd2lsbCBiZSBjYXB0dXJlZC4KKy5JIGQKK2lzIG9uZSBvZiB0aGUgY29uc3RhbnRzCisuQlIgUENBUF9EX0lOICwKKy5CIFBDQVBfRF9PVVQKK29yIAorLkJSIFBDQVBfRF9JTk9VVCAuCisuQiBQQ0FQX0RfSU4KK3dpbGwgb25seSBjYXB0dXJlIHBhY2tldHMgcmVjZWl2ZWQgYnkgdGhlIGRldmljZSwKKy5CIFBDQVBfRF9PVVQKK3dpbGwgb25seSBjYXB0dXJlIHBhY2tldHMgc2VudCBieSB0aGUgZGV2aWNlIGFuZAorLkIgUENBUF9EX0lOT1VUCit3aWxsIGNhcHR1cmUgcGFja2V0cyByZWNlaXZlZCBieSBvciBzZW50IGJ5IHRoZSBkZXZpY2UuCisuQiBQQ0FQX0RfSU5PVVQKK2lzIHRoZSBkZWZhdWx0IHNldHRpbmcgaWYgdGhpcyBmdW5jdGlvbiBpcyBub3QgY2FsbGVkLgorLlBQCisuQiBwY2FwX3NldGRpcmVjdGlvbigpCitpc24ndCBuZWNlc3NhcmlseSBmdWxseSBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtczsgc29tZSBwbGF0Zm9ybXMgbWlnaHQKK3JldHVybiBhbiBlcnJvciBmb3IgYWxsIHZhbHVlcywgYW5kIHNvbWUgb3RoZXIgcGxhdGZvcm1zIG1pZ2h0IG5vdAorc3VwcG9ydAorLkJSIFBDQVBfRF9PVVQgLgorLlBQCitUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGlmIGEgYGBzYXZlZmlsZScnIGlzIGJlaW5nIHJlYWQuCisuU0ggUkVUVVJOIFZBTFVFCisuQiBwY2FwX3NldGRpcmVjdGlvbigpCityZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgXC0xIG9uIGZhaWx1cmUuCitJZiBcLTEgaXMgcmV0dXJuZWQsCisuQiBwY2FwX2dldGVycigpCitvcgorLkIgcGNhcF9wZXJyb3IoKQorbWF5IGJlIGNhbGxlZCB3aXRoCisuSSBwCithcyBhbiBhcmd1bWVudCB0byBmZXRjaCBvciBkaXNwbGF5IHRoZSBlcnJvciB0ZXh0LgorLlNIIFNFRSBBTFNPCitwY2FwKDNQQ0FQKSwgcGNhcF9nZXRlcnIoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfc2V0ZmlsdGVyLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX3NldGZpbHRlci4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQ1ZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX3NldGZpbHRlci4zcGNhcApAQCAtMCwwICsxLDU0IEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX3NldGZpbHRlci4zcGNhcCx2IDEuNCAyMDA4LTA1LTEzIDE1OjE5OjU2IGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VURklMVEVSIDNQQ0FQICI1IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9zZXRmaWx0ZXIgXC0gc2V0IHRoZSBmaWx0ZXIKKy5TSCBTWU5PUFNJUworLm5mCisuZnQgQgorI2luY2x1ZGUgPHBjYXAvcGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitpbnQgcGNhcF9zZXRmaWx0ZXIocGNhcF90ICpwLCBzdHJ1Y3QgYnBmX3Byb2dyYW0gKmZwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc2V0ZmlsdGVyKCkKK2lzIHVzZWQgdG8gc3BlY2lmeSBhIGZpbHRlciBwcm9ncmFtLgorLkkgZnAKK2lzIGEgcG9pbnRlciB0byBhCisuSSBicGZfcHJvZ3JhbQorc3RydWN0LCB1c3VhbGx5IHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvCisuQlIgcGNhcF9jb21waWxlKCkgLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zZXRmaWx0ZXIoKQorcmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIFwtMSBvbiBmYWlsdXJlLgorSWYgXC0xIGlzIHJldHVybmVkLAorLkIgcGNhcF9nZXRlcnIoKQorb3IKKy5CIHBjYXBfcGVycm9yKCkKK21heSBiZSBjYWxsZWQgd2l0aAorLkkgcAorYXMgYW4gYXJndW1lbnQgdG8gZmV0Y2ggb3IgZGlzcGxheSB0aGUgZXJyb3IgdGV4dC4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfY29tcGlsZSgzUENBUCksIHBjYXBfZ2V0ZXJyKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NldG5vbmJsb2NrLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX3NldG5vbmJsb2NrLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMGZjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfc2V0bm9uYmxvY2suM3BjYXAKQEAgLTAsMCArMSw3NSBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zZXRub25ibG9jay4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU0VUTk9OQkxPQ0sgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NldG5vbmJsb2NrLCBwY2FwX2dldG5vbmJsb2NrIFwtIHNldCBvciBnZXQgdGhlIHN0YXRlIG9mCitub24tYmxvY2tpbmcgbW9kZSBvbiBhIGNhcHR1cmUgZGV2aWNlCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisubmYKKy5mdCBCCitjaGFyIGVycmJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1Zik7CitpbnQgcGNhcF9nZXRub25ibG9jayhwY2FwX3QgKnAsIGNoYXIgKmVycmJ1Zik7CisuZnQKKy5maQorLlNIIERFU0NSSVBUSU9OCisuQiBwY2FwX3NldG5vbmJsb2NrKCkKK3B1dHMgYSBjYXB0dXJlIGhhbmRsZSBpbnRvIGBgbm9uLWJsb2NraW5nJycgbW9kZSwgb3IgdGFrZXMgaXQgb3V0CitvZiBgYG5vbi1ibG9ja2luZycnIG1vZGUsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQorLkkgbm9uYmxvY2sKK2FyZ3VtZW50IGlzIG5vbi16ZXJvIG9yIHplcm8uICBJdCBoYXMgbm8gZWZmZWN0IG9uIGBgc2F2ZWZpbGVzJycuCitJZiB0aGVyZSBpcyBhbiBlcnJvciwgXC0xIGlzIHJldHVybmVkIGFuZAorLkkgZXJyYnVmCitpcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlOyBvdGhlcndpc2UsIDAgaXMKK3JldHVybmVkLgorSW4KK2Bgbm9uLWJsb2NraW5nJycgbW9kZSwgYW4gYXR0ZW1wdCB0byByZWFkIGZyb20gdGhlIGNhcHR1cmUgZGVzY3JpcHRvcgord2l0aAorLkIgcGNhcF9kaXNwYXRjaCgpCit3aWxsLCBpZiBubyBwYWNrZXRzIGFyZSBjdXJyZW50bHkgYXZhaWxhYmxlIHRvIGJlIHJlYWQsIHJldHVybiAwCitpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBibG9ja2luZyB3YWl0aW5nIGZvciBwYWNrZXRzIHRvIGFycml2ZS4KKy5CIHBjYXBfbG9vcCgpCithbmQKKy5CIHBjYXBfbmV4dCgpCit3aWxsIG5vdCB3b3JrIGluIGBgbm9uLWJsb2NraW5nJycgbW9kZS4KKy5TSCBSRVRVUk4gVkFMVUUKKy5CIHBjYXBfZ2V0bm9uYmxvY2soKQorcmV0dXJucyB0aGUgY3VycmVudCBgYG5vbi1ibG9ja2luZycnIHN0YXRlIG9mIHRoZSBjYXB0dXJlIGRlc2NyaXB0b3I7IGl0CithbHdheXMgcmV0dXJucyAwIG9uIGBgc2F2ZWZpbGVzJycuCitJZiB0aGVyZSBpcyBhbiBlcnJvciwgXC0xIGlzIHJldHVybmVkIGFuZAorLkkgZXJyYnVmCitpcyBmaWxsZWQgaW4gd2l0aCBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlLgorLlBQCisuSSBlcnJidWYKK2lzIGFzc3VtZWQgdG8gYmUgYWJsZSB0byBob2xkIGF0IGxlYXN0CisuQiBQQ0FQX0VSUkJVRl9TSVpFCitjaGFycy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfbG9vcCgzUENBUCksIHBjYXBfbmV4dF9leCgzUENBUCksIHBjYXBfZ2V0ZXJyKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3NuYXBzaG90LjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX3NuYXBzaG90LjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMjUzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfc25hcHNob3QuM3BjYXAKQEAgLTAsMCArMSw0NCBAQAorLlwiIEAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvcGNhcF9zbmFwc2hvdC4zcGNhcCx2IDEuMyAyMDA4LTA0LTA2IDAyOjUzOjIyIGd1eSBFeHAgJAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfU05BUFNIT1QgM1BDQVAgIjUgQXByaWwgMjAwOCIKKy5TSCBOQU1FCitwY2FwX3NuYXBzaG90IFwtIGdldCB0aGUgc25hcHNob3QgbGVuZ3RoCisuU0ggU1lOT1BTSVMKKy5uZgorLmZ0IEIKKyNpbmNsdWRlIDxwY2FwL3BjYXAuaD4KKy5mdAorLkxQCisuZnQgQgoraW50IHBjYXBfc25hcHNob3QocGNhcF90ICpwKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc25hcHNob3QoKQorcmV0dXJucyB0aGUgc25hcHNob3QgbGVuZ3RoIHNwZWNpZmllZCB3aGVuCisuQiBwY2FwX3NldF9zbmFwc2hvdCgpCitvcgorLkIgcGNhcF9vcGVuX2xpdmUoKQord2FzIGNhbGxlZCwgZm9yIGEgbGl2ZSBjYXB0dXJlLCBvciB0aGUgc25hcHNob3QgbGVuZ3RoIGZyb20gdGhlIGNhcHR1cmUKK2ZpbGUsIGZvciBhIGBgc2F2ZWZpbGUnJy4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9zdGF0cy4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zdGF0cy4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTUzZTIxCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX3N0YXRzLjNwY2FwCkBAIC0wLDAgKzEsOTkgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc3RhdHMuM3BjYXAsdiAxLjMgMjAwOC0wNC0wNiAwMjo1MzoyMiBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NUQVRTIDNQQ0FQICI3IFNlcHRlbWJlciAyMDA5IgorLlNIIE5BTUUKK3BjYXBfc3RhdHMgXC0gZ2V0IGNhcHR1cmUgc3RhdGlzdGljcworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX3N0YXRzKHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfc3RhdCAqcHMpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF9zdGF0cygpCitmaWxscyBpbiB0aGUKKy5CIHN0cnVjdCBwY2FwX3N0YXQKK3BvaW50ZWQgdG8gYnkgaXRzIHNlY29uZCBhcmd1bWVudC4gIFRoZSB2YWx1ZXMgcmVwcmVzZW50CitwYWNrZXQgc3RhdGlzdGljcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcnVuIHRvIHRoZSB0aW1lIG9mIHRoZSBjYWxsLgorLlBQCisuQiBwY2FwX3N0YXRzKCkKK2lzIHN1cHBvcnRlZCBvbmx5IG9uIGxpdmUgY2FwdHVyZXMsIG5vdCBvbiBgYHNhdmVmaWxlcycnOyBubyBzdGF0aXN0aWNzCithcmUgc3RvcmVkIGluIGBgc2F2ZWZpbGVzJycsIHNvIG5vIHN0YXRpc3RpY3MgYXJlIGF2YWlsYWJsZSB3aGVuIHJlYWRpbmcKK2Zyb20gYSBgYHNhdmVmaWxlJycuCisuUFAKK0EKKy5CIHN0cnVjdCBwY2FwX3N0YXQKK2hhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisuUlMKKy5UUAorLkIgcHNfcmVjdgorbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQ7CisuVFAKKy5CIHBzX2Ryb3AKK251bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgYmVjYXVzZSB0aGVyZSB3YXMgbm8gcm9vbSBpbiB0aGUgb3BlcmF0aW5nCitzeXN0ZW0ncyBidWZmZXIgd2hlbiB0aGV5IGFycml2ZWQsIGJlY2F1c2UgcGFja2V0cyB3ZXJlbid0IGJlaW5nIHJlYWQKK2Zhc3QgZW5vdWdoOworLlRQCisuQiBwc19pZmRyb3AKK251bWJlciBvZiBwYWNrZXRzIGRyb3BwZWQgYnkgdGhlIG5ldHdvcmsgaW50ZXJmYWNlIG9yIGl0cyBkcml2ZXIuCisuUkUKKy5QUAorVGhlIHN0YXRpc3RpY3MgZG8gbm90IGJlaGF2ZSB0aGUgc2FtZSB3YXkgb24gYWxsIHBsYXRmb3Jtcy4KKy5CIHBzX3JlY3YKK21pZ2h0IGNvdW50IHBhY2tldHMgd2hldGhlciB0aGV5IHBhc3NlZCBhbnkgZmlsdGVyIHNldCB3aXRoCisuQlIgcGNhcF9zZXRmaWx0ZXIgKDNQQ0FQKQorb3Igbm90LCBvciBpdCBtaWdodCBjb3VudCBvbmx5IHBhY2tldHMgdGhhdCBwYXNzIHRoZSBmaWx0ZXIuCitJdCBhbHNvIG1pZ2h0LCBvciBtaWdodCBub3QsIGNvdW50IHBhY2tldHMgZHJvcHBlZCBiZWNhdXNlIHRoZXJlIHdhcyBubworcm9vbSBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGJ1ZmZlciB3aGVuIHRoZXkgYXJyaXZlZC4KKy5CIHBzX2Ryb3AKK2lzIG5vdCBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtczsgaXQgaXMgemVybyBvbiBwbGF0Zm9ybXMgd2hlcmUgaXQncworbm90IGF2YWlsYWJsZS4gIElmIHBhY2tldCBmaWx0ZXJpbmcgaXMgZG9uZSBpbiBsaWJwY2FwLCByYXRoZXIgdGhhbiBpbgordGhlIG9wZXJhdGluZyBzeXN0ZW0sIGl0IHdvdWxkIGNvdW50IHBhY2tldHMgdGhhdCBkb24ndCBwYXNzIHRoZSBmaWx0ZXIuCitCb3RoCisuQiBwc19yZWN2CithbmQKKy5CIHBzX2Ryb3AKK21pZ2h0LCBvciBtaWdodCBub3QsIGNvdW50IHBhY2tldHMgbm90IHlldCByZWFkIGZyb20gdGhlIG9wZXJhdGluZworc3lzdGVtIGFuZCB0aHVzIG5vdCB5ZXQgc2VlbiBieSB0aGUgYXBwbGljYXRpb24uCisuQiBwc19pZmRyb3AKK21pZ2h0LCBvciBtaWdodCBub3QsIGJlIGltcGxlbWVudGVkOyBpZiBpdCdzIHplcm8sIHRoYXQgbWlnaHQgbWVhbiB0aGF0CitubyBwYWNrZXRzIHdlcmUgZHJvcHBlZCBieSB0aGUgaW50ZXJmYWNlLCBvciBpdCBtaWdodCBtZWFuIHRoYXQgdGhlCitzdGF0aXN0aWMgaXMgdW5hdmFpbGFibGUsIHNvIGl0IHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBhbiBpbmRpY2F0aW9uCit0aGF0IHRoZSBpbnRlcmZhY2UgZGlkIG5vdCBkcm9wIGFueSBwYWNrZXRzLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF9zdGF0cygpCityZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgcmV0dXJucyBcLTEgaWYgdGhlcmUgaXMgYW4gZXJyb3Igb3IgaWYKKy5JIHAKK2RvZXNuJ3Qgc3VwcG9ydCBwYWNrZXQgc3RhdGlzdGljcy4KK0lmIFwtMSBpcyByZXR1cm5lZCwKKy5CIHBjYXBfZ2V0ZXJyKCkKK29yCisuQiBwY2FwX3BlcnJvcigpCittYXkgYmUgY2FsbGVkIHdpdGgKKy5JIHAKK2FzIGFuIGFyZ3VtZW50IHRvIGZldGNoIG9yIGRpc3BsYXkgdGhlIGVycm9yIHRleHQuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX2dldGVycigzUENBUCkKZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcGNhcF9zdGF0dXN0b3N0ci4zcGNhcCBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zdGF0dXN0b3N0ci4zcGNhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE4ZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wY2FwX3N0YXR1c3Rvc3RyLjNwY2FwCkBAIC0wLDAgKzEsNDMgQEAKKy5cIiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BjYXBfc3RhdHVzdG9zdHIuM3BjYXAsdiAxLjEgMjAwOC0wNC0wOSAyMTozOToyMSBndXkgRXhwICQKKy5cIgorLlwiIENvcHlyaWdodCAoYykgMTk5NCwgMTk5NiwgMTk5NworLlwiCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLlwiCisuXCIgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisuXCIgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisuXCIgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorLlwiIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisuXCIgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworLlwiIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKy5cIiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLlwiIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorLlwiIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorLlwiIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisuXCIgb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisuXCIgd3JpdHRlbiBwZXJtaXNzaW9uLgorLlwiIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKy5cIiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorLlwiIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisuXCIKKy5USCBQQ0FQX1NUQVRVU1RPU1RSIDNQQ0FQICI5IEFwcmlsIDIwMDgiCisuU0ggTkFNRQorcGNhcF9zdGF0dXN0b3N0ciBcLSBjb252ZXJ0IGEgUENBUF9FUlJPUl8gb3IgUENBUF9XQVJOSU5HXyB2YWx1ZSB0byBhIHN0cmluZworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2NvbnN0IGNoYXIgKnBjYXBfc3RhdHVzdG9zdHIoaW50IGVycm9yKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc3RhdHVzdG9zdHIoKQorY29udmVydHMgYQorLkIgUENBUF9FUlJPUl8KK29yCisuQiBQQ0FQX1dBUk5JTkdfCit2YWx1ZSByZXR1cm5lZCBieSBhIGxpYnBjYXAgcm91dGluZSB0byBhbiBlcnJvciBzdHJpbmcuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BjYXBfc3RyZXJyb3IuM3BjYXAgYi9saWJwY2FwLTEuMy4wL3BjYXBfc3RyZXJyb3IuM3BjYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2MzE5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcGNhcF9zdHJlcnJvci4zcGNhcApAQCAtMCwwICsxLDQyIEBACisuXCIgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9wY2FwX3N0cmVycm9yLjNwY2FwLHYgMS4yIDIwMDgtMDQtMDUgMjA6MjY6NTYgZ3V5IEV4cCAkCisuXCIKKy5cIiBDb3B5cmlnaHQgKGMpIDE5OTQsIDE5OTYsIDE5OTcKKy5cIglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy5cIgorLlwiIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLlwiIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworLlwiIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKy5cIiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorLlwiIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKy5cIiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisuXCIgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy5cIiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKy5cIiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKy5cIiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorLlwiIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorLlwiIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy5cIiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisuXCIgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKy5cIiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorLlwiCisuVEggUENBUF9TVFJFUlJPUiAzUENBUCAiNCBBcHJpbCAyMDA4IgorLlNIIE5BTUUKK3BjYXBfc3RyZXJyb3IgXC0gY29udmVydCBhbiBlcnJubyB2YWx1ZSB0byBhIHN0cmluZworLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2NvbnN0IGNoYXIgKnBjYXBfc3RyZXJyb3IoaW50IGVycm9yKTsKKy5mdAorLmZpCisuU0ggREVTQ1JJUFRJT04KKy5CIHBjYXBfc3RyZXJyb3IoKQoraXMgcHJvdmlkZWQgaW4gY2FzZQorLkJSIHN0cmVycm9yICgzKQoraXNuJ3QgYXZhaWxhYmxlLiAgSXQgcmV0dXJucyBhbiBlcnJvciBtZXNzYWdlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvCisuSVIgZXJyb3IgLgorLlNIIFNFRSBBTFNPCitzdHJlcnJvcigzKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmY2M0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwuM3BjYXAKQEAgLTAsMCArMSw0NSBAQAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfVFNUQU1QX1RZUEVfTkFNRV9UT19WQUwgM1BDQVAgIjIxIEF1Z3VzdCAyMDEwIgorLlNIIE5BTUUKK3BjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwgXC0gZ2V0IHRoZSB0aW1lIHN0YW1wIHR5cGUgdmFsdWUKK2NvcnJlc3BvbmRpbmcgdG8gYSB0aW1lIHN0YW1wIHR5cGUgbmFtZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC9wY2FwLmg+CisuZnQKKy5MUAorLmZ0IEIKK2ludCBwY2FwX3RzdGFtcF90eXBlX25hbWVfdG9fdmFsKGNvbnN0IGNoYXIgKm5hbWUpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbCgpCit0cmFuc2xhdGVzIGEgdGltZSBzdGFtcCB0eXBlIG5hbWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGltZSBzdGFtcCB0eXBlCit2YWx1ZS4gIFRoZSB0cmFuc2xhdGlvbiBpcyBjYXNlLWluc2Vuc2l0aXZlLgorLlNIIFJFVFVSTiBWQUxVRQorLkIgcGNhcF90c3RhbXBfdHlwZV9uYW1lX3RvX3ZhbCgpCityZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQKKy5CIFBDQVBfRVJST1IKK29uIGZhaWx1cmUuCisuU0ggU0VFIEFMU08KK3BjYXAoM1BDQVApLCBwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKDNQQ0FQKQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9wY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lLjNwY2FwIGIvbGlicGNhcC0xLjMuMC9wY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lLjNwY2FwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOGQ3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3BjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUuM3BjYXAKQEAgLTAsMCArMSw0NSBAQAorLlwiCisuXCIgQ29weXJpZ2h0IChjKSAxOTk0LCAxOTk2LCAxOTk3CisuXCIJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisuXCIKKy5cIiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy5cIiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKy5cIiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisuXCIgZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKy5cIiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisuXCIgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworLlwiIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisuXCIgYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisuXCIgTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisuXCIgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKy5cIiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKy5cIiB3cml0dGVuIHBlcm1pc3Npb24uCisuXCIgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorLlwiIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisuXCIgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKy5cIgorLlRIIFBDQVBfVFNUQU1QX1RZUEVfVkFMX1RPX05BTUUgM1BDQVAgIjIxIEF1Z3VzdCAyMDEwIgorLlNIIE5BTUUKK3BjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX25hbWUsIHBjYXBfdHN0YW1wX3R5cGVfdmFsX3RvX2Rlc2NyaXB0aW9uIFwtIGdldAorYSBuYW1lIG9yIGRlc2NyaXB0aW9uIGZvciBhIHRpbWUgc3RhbXAgdHlwZSB2YWx1ZQorLlNIIFNZTk9QU0lTCisubmYKKy5mdCBCCisjaW5jbHVkZSA8cGNhcC5oPgorLmZ0CisuTFAKKy5mdCBCCitjb25zdCBjaGFyICpwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19uYW1lKGludCB0c3RhbXBfdHlwZSk7Citjb25zdCBjaGFyICpwY2FwX3RzdGFtcF90eXBlX3ZhbF90b19kZXNjcmlwdGlvbihpbnQgdHN0YW1wX3R5cGUpOworLmZ0CisuZmkKKy5TSCBERVNDUklQVElPTgorLkIgcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fbmFtZSgpCit0cmFuc2xhdGVzIGEgdGltZSBzdGFtcCB0eXBlIHZhbHVlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRpbWUgc3RhbXAgdHlwZQorbmFtZS4gIE5VTEwgaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4KKy5QUAorLkIgcGNhcF90c3RhbXBfdHlwZV92YWxfdG9fZGVzY3JpcHRpb24oKQordHJhbnNsYXRlcyBhIHRpbWUgc3RhbXAgdHlwZSB2YWx1ZSB0byBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoYXQgdGltZQorc3RhbXAgdHlwZS4gIE5VTEwgaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4KKy5TSCBTRUUgQUxTTworcGNhcCgzUENBUCksIHBjYXBfdHN0YW1wX3R5cGVfbmFtZV90b192YWwoM1BDQVApCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3BwcC5oIGIvbGlicGNhcC0xLjMuMC9wcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTFkMDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9wcHAuaApAQCAtMCwwICsxLDU4IEBACisvKiBAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3BwcC5oLHYgMS4xMiAyMDA1LTAyLTA4IDE5OjUyOjE5IGd1eSBFeHAgJCAoTEJMKSAqLworLyoKKyAqIFBvaW50IHRvIFBvaW50IFByb3RvY29sIChQUFApIFJGQzEzMzEKKyAqCisgKiBDb3B5cmlnaHQgMTk4OSBieSBDYXJuZWdpZSBNZWxsb24uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBwcm9ncmFtIGZvciBhbnkKKyAqIHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0CisgKiBhbmQgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIG9uIGFsbCBjb3BpZXMgYW5kIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwKKyAqIHRoZSBuYW1lIG9mIENhcm5lZ2llIE1lbGxvbiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyAqIHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBwcm9ncmFtIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHBlcm1pc3Npb24sIGFuZCBub3RpY2UgYmUgZ2l2ZW4gaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIHRoYXQgY29weWluZworICogYW5kIGRpc3RyaWJ1dGlvbiBpcyBieSBwZXJtaXNzaW9uIG9mIENhcm5lZ2llIE1lbGxvbiBhbmQgU3RhbmZvcmQKKyAqIFVuaXZlcnNpdHkuICBDYXJuZWdpZSBNZWxsb24gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZQorICogc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAqLworI2RlZmluZSBQUFBfQUREUkVTUwkweGZmCS8qIFRoZSBhZGRyZXNzIGJ5dGUgdmFsdWUgKi8KKyNkZWZpbmUgUFBQX0NPTlRST0wJMHgwMwkvKiBUaGUgY29udHJvbCBieXRlIHZhbHVlICovCisKKyNkZWZpbmUgUFBQX1BQUERfSU4JMHgwMAkvKiBub24tc3RhbmRhcmQgZm9yIERMVF9QUFBfUFBQRCAqLworI2RlZmluZSBQUFBfUFBQRF9PVVQJMHgwMQkvKiBub24tc3RhbmRhcmQgZm9yIERMVF9QUFBfUFBQRCAqLworCisvKiBQcm90b2NvbCBudW1iZXJzICovCisjZGVmaW5lIFBQUF9JUAkJMHgwMDIxCS8qIFJhdyBJUCAqLworI2RlZmluZSBQUFBfT1NJCQkweDAwMjMJLyogT1NJIE5ldHdvcmsgTGF5ZXIgKi8KKyNkZWZpbmUgUFBQX05TCQkweDAwMjUJLyogWGVyb3ggTlMgSURQICovCisjZGVmaW5lIFBQUF9ERUNORVQJMHgwMDI3CS8qIERFQ25ldCBQaGFzZSBJViAqLworI2RlZmluZSBQUFBfQVBQTEUJMHgwMDI5CS8qIEFwcGxldGFsayAqLworI2RlZmluZSBQUFBfSVBYCQkweDAwMmIJLyogTm92ZWxsIElQWCAqLworI2RlZmluZSBQUFBfVkpDCQkweDAwMmQJLyogVmFuIEphY29ic29uIENvbXByZXNzZWQgVENQL0lQICovCisjZGVmaW5lIFBQUF9WSk5DCTB4MDAyZgkvKiBWYW4gSmFjb2Jzb24gVW5jb21wcmVzc2VkIFRDUC9JUCAqLworI2RlZmluZSBQUFBfQlJQRFUJMHgwMDMxCS8qIEJyaWRnaW5nIFBEVSAqLworI2RlZmluZSBQUFBfU1RJSQkweDAwMzMJLyogU3RyZWFtIFByb3RvY29sIChTVC1JSSkgKi8KKyNkZWZpbmUgUFBQX1ZJTkVTCTB4MDAzNQkvKiBCYW55YW4gVmluZXMgKi8KKyNkZWZpbmUgUFBQX0lQVjYJMHgwMDU3CS8qIEludGVybmV0IFByb3RvY29sIHZlcnNpb24gNiAqLworCisjZGVmaW5lIFBQUF9IRUxMTwkweDAyMDEJLyogODAyLjFkIEhlbGxvIFBhY2tldHMgKi8KKyNkZWZpbmUgUFBQX0xVWENPTQkweDAyMzEJLyogTHV4Y29tICovCisjZGVmaW5lIFBQUF9TTlMJCTB4MDIzMwkvKiBTaWdtYSBOZXR3b3JrIFN5c3RlbXMgKi8KKyNkZWZpbmUgUFBQX01QTFNfVUNBU1QgIDB4MDI4MSAgLyogcmZjIDMwMzIgKi8KKyNkZWZpbmUgUFBQX01QTFNfTUNBU1QgIDB4MDI4MyAgLyogcmZjIDMwMjIgKi8KKworI2RlZmluZSBQUFBfSVBDUAkweDgwMjEJLyogSVAgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfT1NJQ1AJMHg4MDIzCS8qIE9TSSBOZXR3b3JrIExheWVyIENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX05TQ1AJMHg4MDI1CS8qIFhlcm94IE5TIElEUCBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9ERUNORVRDUAkweDgwMjcJLyogREVDbmV0IENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX0FQUExFQ1AJMHg4MDI5CS8qIEFwcGxldGFsayBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9JUFhDUAkweDgwMmIJLyogTm92ZWxsIElQWCBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9TVElJQ1AJMHg4MDMzCS8qIFN0cmVhbiBQcm90b2NvbCBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9WSU5FU0NQCTB4ODAzNQkvKiBCYW55YW4gVmluZXMgQ29udHJvbCBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfSVBWNkNQCTB4ODA1NwkvKiBJUHY2IENvbnRyb2wgUHJvdG9jb2wgKi8KKyNkZWZpbmUgUFBQX01QTFNDUCAgICAgIDB4ODI4MSAgLyogcmZjIDMwMjIgKi8KKworI2RlZmluZSBQUFBfTENQCQkweGMwMjEJLyogTGluayBDb250cm9sIFByb3RvY29sICovCisjZGVmaW5lIFBQUF9QQVAJCTB4YzAyMwkvKiBQYXNzd29yZCBBdXRoZW50aWNhdGlvbiBQcm90b2NvbCAqLworI2RlZmluZSBQUFBfTFFNCQkweGMwMjUJLyogTGluayBRdWFsaXR5IE1vbml0b3JpbmcgKi8KKyNkZWZpbmUgUFBQX0NIQVAJMHhjMjIzCS8qIENoYWxsZW5nZSBIYW5kc2hha2UgQXV0aGVudGljYXRpb24gUHJvdG9jb2wgKi8KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvcnVubGV4LnNoIGIvbGlicGNhcC0xLjMuMC9ydW5sZXguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzRmMjE2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvcnVubGV4LnNoCkBAIC0wLDAgKzEsMjM1IEBACisjISAvYmluL3NoCisKKyMKKyMgcnVubGV4LnNoCisjIFNjcmlwdCB0byBydW4gTGV4L0ZsZXguCisjIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSAocXVvdGVkKSBuYW1lIG9mIHRoZSBjb21tYW5kOyBpZiBpdCdzIG51bGwsIHRoYXQKKyMgbWVhbnMgdGhhdCBuZWl0aGVyIEZsZXggbm9yIExleCB3YXMgZm91bmQsIHNvIHdlIHJlcG9ydCBhbiBlcnJvciBhbmQKKyMgcXVpdC4KKyMKKyMgQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9ydW5sZXguc2gsdiAxLjQgMjAwNy0xMi0zMSAwMzozODozOSBndXkgRXhwICQKKyMKKworIworIyBHZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdG8gcnVuLCBhbmQgdGhlbiBzaGlmdCB0byBnZXQgdGhlIGFyZ3VtZW50cy4KKyMKK2lmIFsgJCMgLWVxIDAgXQordGhlbgorCWVjaG8gIlVzYWdlOiBydW5sZXggPGxleC9mbGV4IGNvbW1hbmQgdG8gcnVuPiBbIGFyZ3VtZW50cyBdIiAxPiYyCisJZXhpdCAxCitmaQorTEVYPSIkMSIKK3NoaWZ0CisKKyMKKyMgQ2hlY2sgd2hldGhlciB3ZSBoYXZlIExleCBvciBGbGV4LgorIworaWYgWyAteiAiJHtMRVh9IiBdCit0aGVuCisJZWNobyAiTmVpdGhlciBsZXggbm9yIGZsZXggd2FzIGZvdW5kIiAxPiYyCisJZXhpdCAxCitmaQorCisjCisjIFByb2Nlc3MgdGhlIGZsYWdzLiAgV2UgZG9uJ3QgdXNlIGdldG9wdCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8KKyMgZW1iZWQgY29tcGxldGUga25vd2xlZGdlIG9mIHdoYXQgb3B0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IExleC9GbGV4LgorIworZmxhZ3M9IiIKK291dGZpbGU9bGV4Lnl5LmMKK3doaWxlIFsgJCMgLW5lIDAgXQorZG8KKwljYXNlICIkMSIgaW4KKworCS1vKikKKwkJIworCQkjIFNldCB0aGUgb3V0cHV0IGZpbGUgbmFtZS4KKwkJIworCQlvdXRmaWxlPWBlY2hvICIkMSIgfCBzZWQgJ3MvLW9cKC4qXCkvXDEvJ2AKKwkJOzsKKworCS0qKQorCQkjCisJCSMgQWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2YgZmxhZ3MuCisJCSMKKwkJZmxhZ3M9IiRmbGFncyAkMSIKKwkJOzsKKworCS0tfCopCisJCSMKKwkJIyBFbmQgb2YgZmxhZ3MuCisJCSMKKwkJYnJlYWsKKwkJOzsKKwllc2FjCisJc2hpZnQKK2RvbmUKKworIworIyBJcyBpdCBMZXgsIG9yIGlzIGl0IEZsZXg/CisjCitpZiBbICIke0xFWH0iID0gZmxleCBdCit0aGVuCisJIworCSMgSXQncyBGbGV4LgorCSMKKwloYXZlX2ZsZXg9eWVzCisKKwkjCisJIyBEb2VzIGl0IHN1cHBvcnQgdGhlIC0tbm9GVU5DVElPTiBvcHRpb25zPyAgSWYgc28sIHdlIHBhc3MKKwkjIC0tbm91bnB1dCwgYXMgYXQgbGVhc3Qgc29tZSB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UKKwkjIG9wdGlvbnMgZG9uJ3Qgc3VwcG9ydCBkaXNhYmxpbmcgeXl1bnB1dCBieSBkZWZpbmluZworCSMgWVlfTk9fVU5QVVQuCisJIworCWlmIGZsZXggLS1oZWxwIHwgZWdyZXAgbm9GVU5DVElPTiA+L2Rldi9udWxsCisJdGhlbgorCQlmbGFncz0iJGZsYWdzIC0tbm91bnB1dCIKKworCQkjCisJCSMgRG9lcyBpdCBzdXBwb3J0IC1SLCBmb3IgZ2VuZXJhdGluZyByZWVudHJhbnQgc2Nhbm5lcnM/CisJCSMgSWYgc28sIHdlJ3JlIG5vdCBjdXJyZW50bHkgdXNpbmcgdGhhdCBmZWF0dXJlLCBidXQKKwkJIyBpdCdsbCBnZW5lcmF0ZSBzb21lIHVudXNlZCBmdW5jdGlvbnMgYW55d2F5IC0gYW5kIHRoZXJlCisJCSMgd29uJ3QgYmUgYW55IGhlYWRlciBmaWxlIGRlY2xhcmluZyB0aGVtLCBzbyB0aGVyZSdsbCBiZQorCQkjIGRlZmluZWQtYnV0LW5vdC1kZWNsYXJlZCB3YXJuaW5ncy4gIFRoZXJlZm9yZSwgd2UgdXNlCisJCSMgLS1ub0ZVTkNUSU9OIG9wdGlvbnMgdG8gc3VwcHJlc3MgZ2VuZXJhdGluZyB0aG9zZQorCQkjIGZ1bmN0aW9ucy4KKwkJIworCQlpZiBmbGV4IC0taGVscCB8IGVncmVwIHJlZW50cmFudCA+L2Rldi9udWxsCisJCXRoZW4KKwkJCWZsYWdzPSIkZmxhZ3MgLS1ub3l5Z2V0X2xpbmVubyAtLW5veXlnZXRfaW4gLS1ub3l5Z2V0X291dCAtLW5veXlnZXRfbGVuZyAtLW5veXlnZXRfdGV4dCAtLW5veXlzZXRfbGluZW5vIC0tbm95eXNldF9pbiAtLW5veXlzZXRfb3V0IgorCQlmaQorCWZpCitlbHNlCisJIworCSMgSXQncyBMZXguCisJIworCWhhdmVfZmxleD1ubworZmkKKworIworIyBPSywgcnVuIGl0LgorIyBJZiBpdCdzIGxleCwgaXQgZG9lc24ndCBzdXBwb3J0IC1vLCBzbyB3ZSBqdXN0IHdyaXRlIHRvCisjIGxleC55eS5jIGFuZCwgaWYgaXQgc3VjY2VlZHMsIHJlbmFtZSBpdCB0byB0aGUgcmlnaHQgbmFtZSwKKyMgb3RoZXJ3aXNlIHdlIHJlbW92ZSBsZXgueXkuYy4KKyMgSWYgaXQncyBmbGV4LCBpdCBzdXBwb3J0cyAtbywgc28gd2UgdXNlIHRoYXQgLSBmbGV4IHdpdGggLVAgZG9lc24ndAorIyB3cml0ZSB0byBsZXgueXkuYywgaXQgd3JpdGVzIHRvIGEgbGV4LntwcmVmaXggZnJvbSAtUH0uYy4KKyMKK2lmIFsgJGhhdmVfZmxleCA9IHllcyBdCit0aGVuCisJJHtMRVh9ICRmbGFncyAtbyIkb3V0ZmlsZSIgIiRAIgorCisJIworCSMgRGlkIGl0IHN1Y2NlZWQ/CisJIworCXN0YXR1cz0kPworCWlmIFsgJHN0YXR1cyAtbmUgMCBdCisJdGhlbgorCQkjCisJCSMgTm8uICBFeGl0IHdpdGggdGhlIGZhaWxpbmcgZXhpdCBzdGF0dXMuCisJCSMKKwkJZXhpdCAkc3RhdHVzCisJZmkKKworCSMKKwkjIEZsZXggaGFzIHRoZSBhbm5veWluZyBoYWJpdCBvZiBzdHJpcHBpbmcgYWxsIGJ1dCB0aGUgbGFzdAorCSMgY29tcG9uZW50IG9mIHRoZSAiLW8iIGZsYWcgYXJndW1lbnQgYW5kIHVzaW5nIHRoYXQgYXMgdGhlCisJIyBwbGFjZSB0byBwdXQgdGhlIG91dHB1dC4gIFRoaXMgZ2V0cyBpbiB0aGUgd2F5IG9mIGJ1aWxkaW5nCisJIyBpbiBhIGRpcmVjdG9yeSBkaWZmZXJlbnQgZnJvbSB0aGUgc291cmNlIGRpcmVjdG9yeS4gIFRyeQorCSMgdG8gd29yayBhcm91bmQgdGhpcy4KKwkjCisJIyBJcyB0aGUgb3V0ZmlsZSB3aGVyZSB3ZSB0aGluayBpdCBpcz8KKwkjCisJb3V0ZmlsZV9iYXNlPWBiYXNlbmFtZSAiJG91dGZpbGUiYAorCWlmIFsgIiRvdXRmaWxlX2Jhc2UiICE9ICIkb3V0ZmlsZSIgLWEgXCggISAtciAiJG91dGZpbGUiIFwpIC1hIC1yICIkb3V0ZmlsZV9iYXNlIiBdCisJdGhlbgorCQkjCisJCSMgTm8sIGl0J3Mgbm90LCBidXQgaXQgaXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgUHV0IGl0CisJCSMgd2hlcmUgaXQncyBzdXBwb3NlZCB0byBiZS4KKwkJIworCQltdiAiJG91dGZpbGVfYmFzZSIgIiRvdXRmaWxlIgorCisJCSMKKwkJIyBEaWQgdGhhdCBzdWNjZWVkPworCQkjCisJCXN0YXR1cz0kPworCQlpZiBbICRzdGF0dXMgLW5lIDAgXQorCQl0aGVuCisJCQkjCisJCQkjIE5vLiAgRXhpdCB3aXRoIHRoZSBmYWlsaW5nIGV4aXQgc3RhdHVzLgorCQkJIworCQkJZXhpdCAkc3RhdHVzCisJCWZpCisJZmkKK2Vsc2UKKwkke0xFWH0gJGZsYWdzICIkQCIKKworCSMKKwkjIERpZCBpdCBzdWNjZWVkPworCSMKKwlzdGF0dXM9JD8KKwlpZiBbICRzdGF0dXMgLW5lIDAgXQorCXRoZW4KKwkJIworCQkjIE5vLiAgR2V0IHJpZCBvZiBhbnkgbGV4Lnl5LmMgZmlsZSB3ZSBnZW5lcmF0ZWQsIGFuZAorCQkjIGV4aXQgd2l0aCB0aGUgZmFpbGluZyBleGl0IHN0YXR1cy4KKwkJIworCQlybSAtZiBsZXgueXkuYworCQlleGl0ICRzdGF0dXMKKwlmaQorCisJIworCSMgT0ssIHJlbmFtZSBsZXgueXkuYyB0byB0aGUgcmlnaHQgb3V0cHV0IGZpbGUuCisJIworCW12IGxleC55eS5jICIkb3V0ZmlsZSIgCisKKwkjCisJIyBEaWQgdGhhdCBzdWNjZWVkPworCSMKKwlzdGF0dXM9JD8KKwlpZiBbICRzdGF0dXMgLW5lIDAgXQorCXRoZW4KKwkJIworCQkjIE5vLiAgR2V0IHJpZCBvZiBhbnkgbGV4Lnl5LmMgZmlsZSB3ZSBnZW5lcmF0ZWQsIGFuZAorCQkjIGV4aXQgd2l0aCB0aGUgZmFpbGluZyBleGl0IHN0YXR1cy4KKwkJIworCQlybSAtZiBsZXgueXkuYworCQlleGl0ICRzdGF0dXMKKwlmaQorZmkKKworIworIyBPSywgbm93IGxldCdzIGdlbmVyYXRlIGEgaGVhZGVyIGZpbGUgZGVjbGFyaW5nIHRoZSByZWxldmFudCBmdW5jdGlvbnMKKyMgZGVmaW5lZCBieSB0aGUgLmMgZmlsZTsgaWYgdGhlIC5jIGZpbGUgaXMgLi4uL2Zvby5jLCB0aGUgaGVhZGVyIGZpbGUKKyMgd2lsbCBiZSAuLi4vZm9vLmguCisjCisjIFRoaXMgd29ya3MgYXJvdW5kIHNvbWUgb3RoZXIgRmxleCBzdWNrYWdlLCB3aGVyZWluIGl0IGRvZXNuJ3QgZGVjbGFyZQorIyB0aGUgbGV4IHJvdXRpbmUgYmVmb3JlIGRlZmluaW5nIGl0LCBjYXVzaW5nIGNvbXBpbGVyIHdhcm5pbmdzLgorIyBYWFggLSBuZXdlciB2ZXJzaW9ucyBvZiBGbGV4IHN1cHBvcnQgLS1oZWFkZXItZmlsZT0sIHRvIGdlbmVyYXRlIHRoZQorIyBhcHByb3ByaWF0ZSBoZWFkZXIgZmlsZS4gIFdpdGggdGhvc2UgdmVyc2lvbnMsIHdlIHNob3VsZCB1c2UgdGhhdCBvcHRpb24uCisjCisKKyMKKyMgR2V0IHRoZSBuYW1lIG9mIHRoZSBwcmVmaXg7IHNjYW4gdGhlIHNvdXJjZSBmaWxlcyBmb3IgYSAlb3B0aW9uIHByZWZpeAorIyBsaW5lLiAgV2UgdXNlIHRoZSBsYXN0IG9uZS4KKyMKK3ByZWZpeD1gc2VkIC1uICdzLyVvcHRpb25bIAldWyAJXSpwcmVmaXg9IlwoLipcKSIuKi9cMS9wJyAiJEAiIHwgdGFpbCAtMWAKK2lmIFsgISAteiAiJHByZWZpeCIgXQordGhlbgorCXByZWZpeGxpbmU9IiNkZWZpbmUgeXlsZXggJHtwcmVmaXh9bGV4IgorZmkKKworIworIyBDb25zdHJ1Y3QgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlLgorIworaGVhZGVyX2ZpbGU9YGRpcm5hbWUgIiRvdXRmaWxlImAvYGJhc2VuYW1lICIkb3V0ZmlsZSIgLmNgLmgKKworIworIyBTcGV3IG91dCB0aGUgZGVjbGFyYXRpb24uCisjCitjYXQgPDxFT0YgPiRoZWFkZXJfZmlsZQorLyogVGhpcyBpcyBnZW5lcmF0ZWQgYnkgcnVubGV4LnNoLiAgRG8gbm90IGVkaXQgaXQuICovCiskcHJlZml4bGluZQorI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0wgaW50IHl5bGV4KHZvaWQpCisjZW5kaWYgIAorWVlfREVDTDsKK0VPRgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9zYXZlZmlsZS5jIGIvbGlicGNhcC0xLjMuMC9zYXZlZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTU3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3NhdmVmaWxlLmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBzYXZlZmlsZS5jIC0gc3VwcG9ydHMgb2ZmbGluZSB1c2Ugb2YgdGNwZHVtcAorICoJRXh0cmFjdGlvbi9jcmVhdGlvbiBieSBKZWZmcmV5IE1vZ3VsLCBERUNXUkwKKyAqCU1vZGlmaWVkIGJ5IFN0ZXZlIE1jQ2FubmUsIExCTC4KKyAqCisgKiBVc2VkIHRvIHNhdmUgdGhlIHJlY2VpdmVkIHBhY2tldCBoZWFkZXJzLCBhZnRlciBmaWx0ZXJpbmcsIHRvCisgKiBhIGZpbGUsIGFuZCB0aGVuIHJlYWQgdGhlbSBsYXRlci4KKyAqIFRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGZpbGUgY29udGFpbnMgc2F2ZWQgdmFsdWVzIGZvciB0aGUgbWFjaGluZQorICogZGVwZW5kZW50IHZhbHVlcyBzbyB3ZSBjYW4gcHJpbnQgdGhlIGR1bXAgZmlsZSBvbiBhbnkgYXJjaGl0ZWN0dXJlLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSBfVV8gPQorICAgICJAKCMpICRIZWFkZXI6IC90Y3BkdW1wL21hc3Rlci9saWJwY2FwL3NhdmVmaWxlLmMsdiAxLjE4MyAyMDA4LTEyLTIzIDIwOjEzOjI5IGd1eSBFeHAgJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorI2luY2x1ZGUgInBjYXAvdXNiLmgiCisKKyNpZmRlZiBIQVZFX09TX1BST1RPX0gKKyNpbmNsdWRlICJvcy1wcm90by5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzZi1wY2FwLmgiCisjaW5jbHVkZSAic2YtcGNhcC1uZy5oIgorCisvKgorICogU2V0dGluZyBPX0JJTkFSWSBvbiBET1MvV2luZG93cyBpcyBhIGJpdCB0cmlja3kKKyAqLworI2lmIGRlZmluZWQoV0lOMzIpCisgICNkZWZpbmUgU0VUX0JJTk1PREUoZikgIF9zZXRtb2RlKF9maWxlbm8oZiksIF9PX0JJTkFSWSkKKyNlbGlmIGRlZmluZWQoTVNET1MpCisgICNpZiBkZWZpbmVkKF9fSElHSENfXykKKyAgI2RlZmluZSBTRVRfQklOTU9ERShmKSAgc2V0bW9kZShmLCBPX0JJTkFSWSkKKyAgI2Vsc2UKKyAgI2RlZmluZSBTRVRfQklOTU9ERShmKSAgc2V0bW9kZShmaWxlbm8oZiksIE9fQklOQVJZKQorICAjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgaW50CitzZl9nZXRub25ibG9jayhwY2FwX3QgKnAsIGNoYXIgKmVycmJ1ZikKK3sKKwkvKgorCSAqIFRoaXMgaXMgYSBzYXZlZmlsZSwgbm90IGEgbGl2ZSBjYXB0dXJlIGZpbGUsIHNvIG5ldmVyIHNheQorCSAqIGl0J3MgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisJICovCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAorc2Zfc2V0bm9uYmxvY2socGNhcF90ICpwLCBpbnQgbm9uYmxvY2ssIGNoYXIgKmVycmJ1ZikKK3sKKwkvKgorCSAqIFRoaXMgaXMgYSBzYXZlZmlsZSwgbm90IGEgbGl2ZSBjYXB0dXJlIGZpbGUsIHNvIHJlamVjdAorCSAqIHJlcXVlc3RzIHRvIHB1dCBpdCBpbiBub24tYmxvY2tpbmcgbW9kZS4gIChJZiBpdCdzIGEKKwkgKiBwaXBlLCBpdCBjb3VsZCBiZSBwdXQgaW4gbm9uLWJsb2NraW5nIG1vZGUsIGJ1dCB0aGF0CisJICogd291bGQgc2lnbmlmaWNhbnRseSBjb21wbGljYXRlIHRoZSBjb2RlIHRvIHJlYWQgcGFja2V0cywKKwkgKiBhcyBpdCB3b3VsZCBoYXZlIHRvIGhhbmRsZSByZWFkaW5nIHBhcnRpYWwgcGFja2V0cyBhbmQKKwkgKiBrZWVwaW5nIHRoZSBzdGF0ZSBvZiB0aGUgcmVhZC4pCisJICovCisJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiU2F2ZWZpbGVzIGNhbm5vdCBiZSBwdXQgaW50byBub24tYmxvY2tpbmcgbW9kZSIpOworCXJldHVybiAoLTEpOworfQorCitzdGF0aWMgaW50CitzZl9zdGF0cyhwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3N0YXQgKnBzKQoreworCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlN0YXRpc3RpY3MgYXJlbid0IGF2YWlsYWJsZSBmcm9tIHNhdmVmaWxlcyIpOworCXJldHVybiAoLTEpOworfQorCisjaWZkZWYgV0lOMzIKK3N0YXRpYyBpbnQKK3NmX3NldGJ1ZmYocGNhcF90ICpwLCBpbnQgZGltKQoreworCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkgICAgIlRoZSBrZXJuZWwgYnVmZmVyIHNpemUgY2Fubm90IGJlIHNldCB3aGlsZSByZWFkaW5nIGZyb20gYSBmaWxlIik7CisJcmV0dXJuICgtMSk7Cit9CisKK3N0YXRpYyBpbnQKK3NmX3NldG1vZGUocGNhcF90ICpwLCBpbnQgbW9kZSkKK3sKKwlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJICAgICJpbXBvc3NpYmxlIHRvIHNldCBtb2RlIHdoaWxlIHJlYWRpbmcgZnJvbSBhIGZpbGUiKTsKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIGludAorc2Zfc2V0bWludG9jb3B5KHBjYXBfdCAqcCwgaW50IHNpemUpCit7CisJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCSAgICAiVGhlIG1pbnRvY29weSBwYXJhbWV0ZXIgY2Fubm90IGJlIHNldCB3aGlsZSByZWFkaW5nIGZyb20gYSBmaWxlIik7CisJcmV0dXJuICgtMSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorc2ZfaW5qZWN0KHBjYXBfdCAqcCwgY29uc3Qgdm9pZCAqYnVmIF9VXywgc2l6ZV90IHNpemUgX1VfKQoreworCXN0cmxjcHkocC0+ZXJyYnVmLCAiU2VuZGluZyBwYWNrZXRzIGlzbid0IHN1cHBvcnRlZCBvbiBzYXZlZmlsZXMiLAorCSAgICBQQ0FQX0VSUkJVRl9TSVpFKTsKKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIFNldCBkaXJlY3Rpb24gZmxhZzogV2hpY2ggcGFja2V0cyBkbyB3ZSBhY2NlcHQgb24gYSBmb3J3YXJkaW5nCisgKiBzaW5nbGUgZGV2aWNlPyBJTiwgT1VUIG9yIGJvdGg/CisgKi8KK3N0YXRpYyBpbnQKK3NmX3NldGRpcmVjdGlvbihwY2FwX3QgKnAsIHBjYXBfZGlyZWN0aW9uX3QgZCkKK3sKKwlzbnByaW50ZihwLT5lcnJidWYsIHNpemVvZihwLT5lcnJidWYpLAorCSAgICAiU2V0dGluZyBkaXJlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBvbiBzYXZlZmlsZXMiKTsKKwlyZXR1cm4gKC0xKTsKK30KKworc3RhdGljIHZvaWQKK3NmX2NsZWFudXAocGNhcF90ICpwKQoreworCWlmIChwLT5zZi5yZmlsZSAhPSBzdGRpbikKKwkJKHZvaWQpZmNsb3NlKHAtPnNmLnJmaWxlKTsKKwlpZiAocC0+YnVmZmVyICE9IE5VTEwpCisJCWZyZWUocC0+YnVmZmVyKTsKKwlwY2FwX2ZyZWVjb2RlKCZwLT5mY29kZSk7Cit9CisKK3BjYXBfdCAqCitwY2FwX29wZW5fb2ZmbGluZShjb25zdCBjaGFyICpmbmFtZSwgY2hhciAqZXJyYnVmKQoreworCUZJTEUgKmZwOworCXBjYXBfdCAqcDsKKworCWlmIChmbmFtZVswXSA9PSAnLScgJiYgZm5hbWVbMV0gPT0gJ1wwJykKKwl7CisJCWZwID0gc3RkaW47CisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChNU0RPUykKKwkJLyoKKwkJICogV2UncmUgcmVhZGluZyBmcm9tIHRoZSBzdGFuZGFyZCBpbnB1dCwgc28gcHV0IGl0IGluIGJpbmFyeQorCQkgKiBtb2RlLCBhcyBzYXZlZmlsZXMgYXJlIGJpbmFyeSBmaWxlcy4KKwkJICovCisJCVNFVF9CSU5NT0RFKGZwKTsKKyNlbmRpZgorCX0KKwllbHNlIHsKKyNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCisJCWZwID0gZm9wZW4oZm5hbWUsICJyIik7CisjZWxzZQorCQlmcCA9IGZvcGVuKGZuYW1lLCAicmIiKTsKKyNlbmRpZgorCQlpZiAoZnAgPT0gTlVMTCkgeworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwgZm5hbWUsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCX0KKwlwID0gcGNhcF9mb3Blbl9vZmZsaW5lKGZwLCBlcnJidWYpOworCWlmIChwID09IE5VTEwpIHsKKwkJaWYgKGZwICE9IHN0ZGluKQorCQkJZmNsb3NlKGZwKTsKKwl9CisJcmV0dXJuIChwKTsKK30KKworI2lmZGVmIFdJTjMyCitwY2FwX3QqIHBjYXBfaG9wZW5fb2ZmbGluZShpbnRwdHJfdCBvc2ZkLCBjaGFyICplcnJidWYpCit7CisJaW50IGZkOworCUZJTEUgKmZpbGU7CisKKwlmZCA9IF9vcGVuX29zZmhhbmRsZShvc2ZkLCBfT19SRE9OTFkpOworCWlmICggZmQgPCAwICkgCisJeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZmlsZSA9IF9mZG9wZW4oZmQsICJyYiIpOworCWlmICggZmlsZSA9PSBOVUxMICkgCisJeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIHBjYXBfZm9wZW5fb2ZmbGluZShmaWxlLCBlcnJidWYpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgKCpjaGVja19oZWFkZXJzW10pKHBjYXBfdCAqLCBicGZfdV9pbnQzMiwgRklMRSAqLCBjaGFyICopID0geworCXBjYXBfY2hlY2tfaGVhZGVyLAorCXBjYXBfbmdfY2hlY2tfaGVhZGVyCit9OworCisjZGVmaW5lCU5fRklMRV9UWVBFUwkoc2l6ZW9mIGNoZWNrX2hlYWRlcnMgLyBzaXplb2YgY2hlY2tfaGVhZGVyc1swXSkKKworI2lmZGVmIFdJTjMyCitzdGF0aWMKKyNlbmRpZgorcGNhcF90ICoKK3BjYXBfZm9wZW5fb2ZmbGluZShGSUxFICpmcCwgY2hhciAqZXJyYnVmKQoreworCXJlZ2lzdGVyIHBjYXBfdCAqcDsKKwlicGZfdV9pbnQzMiBtYWdpYzsKKwlzaXplX3QgYW10X3JlYWQ7CisJdV9pbnQgaTsKKworCXAgPSBwY2FwX2NyZWF0ZV9jb21tb24oIihzYXZlZmlsZSkiLCBlcnJidWYpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwkvKgorCSAqIFJlYWQgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGZpbGU7IHRoZSBuZXR3b3JrIGFuYWx5emVyIGR1bXAKKwkgKiBmaWxlIGZvcm1hdHMgd2Ugc3VwcG9ydCAocGNhcCBhbmQgcGNhcC1uZyksIGFuZCBzZXZlcmFsIG90aGVyCisJICogZm9ybWF0cyB3ZSBtaWdodCBzdXBwb3J0IGluIHRoZSBmdXR1cmUgKHN1Y2ggYXMgc25vb3AsIERPUyBhbmQKKwkgKiBXaW5kb3dzIFNuaWZmZXIsIGFuZCBNaWNyb3NvZnQgTmV0d29yayBNb25pdG9yKSBhbGwgaGF2ZSBtYWdpYworCSAqIG51bWJlcnMgdGhhdCBhcmUgdW5pcXVlIGluIHRoZWlyIGZpcnN0IDQgYnl0ZXMuCisJICovCisJYW10X3JlYWQgPSBmcmVhZCgoY2hhciAqKSZtYWdpYywgMSwgc2l6ZW9mKG1hZ2ljKSwgZnApOworCWlmIChhbXRfcmVhZCAhPSBzaXplb2YobWFnaWMpKSB7CisJCWlmIChmZXJyb3IoZnApKSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQl9IGVsc2UgeworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICVsdSBmaWxlIGhlYWRlciBieXRlcywgb25seSBnb3QgJWx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZylzaXplb2YobWFnaWMpLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKKwkJfQorCQlnb3RvIGJhZDsKKwl9CisKKwkvKgorCSAqIFRyeSBhbGwgZmlsZSB0eXBlcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTl9GSUxFX1RZUEVTOyBpKyspIHsKKwkJc3dpdGNoICgoKmNoZWNrX2hlYWRlcnNbaV0pKHAsIG1hZ2ljLCBmcCwgZXJyYnVmKSkgeworCisJCWNhc2UgLTE6CisJCQkvKgorCQkJICogRXJyb3IgdHJ5aW5nIHRvIHJlYWQgdGhlIGhlYWRlci4KKwkJCSAqLworCQkJZ290byBiYWQ7CisKKwkJY2FzZSAxOgorCQkJLyoKKwkJCSAqIFl1cCwgdGhhdCdzIGl0LgorCQkJICovCisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCisJLyoKKwkgKiBXZWxsLCB3aG8ga25vd3Mgd2hhdCB0aGlzIG1lc3MgaXMuLi4uCisJICovCisJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAidW5rbm93biBmaWxlIGZvcm1hdCIpOworCWdvdG8gYmFkOworCitmb3VuZDoKKwlwLT5zZi5yZmlsZSA9IGZwOworCisjaWZkZWYgUENBUF9GRERJUEFECisJLyogUGFkZGluZyBvbmx5IG5lZWRlZCBmb3IgbGl2ZSBjYXB0dXJlIGZjb2RlICovCisJcC0+ZmRkaXBhZCA9IDA7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdJTjMyKSAmJiAhZGVmaW5lZChNU0RPUykKKwkvKgorCSAqIFlvdSBjYW4gZG8gInNlbGVjdCgpIiBhbmQgInBvbGwoKSIgb24gcGxhaW4gZmlsZXMgb24gbW9zdAorCSAqIHBsYXRmb3JtcywgYW5kIHNob3VsZCBiZSBhYmxlIHRvIGRvIHNvIG9uIHBpcGVzLgorCSAqCisJICogWW91IGNhbid0IGRvICJzZWxlY3QoKSIgb24gYW55dGhpbmcgb3RoZXIgdGhhbiBzb2NrZXRzIGluCisJICogV2luZG93cywgc28sIG9uIFdpbjMyIHN5c3RlbXMsIHdlIGRvbid0IGhhdmUgInNlbGVjdGFibGVfZmQiLgorCSAqLworCXAtPnNlbGVjdGFibGVfZmQgPSBmaWxlbm8oZnApOworI2VuZGlmCisKKwlwLT5yZWFkX29wID0gcGNhcF9vZmZsaW5lX3JlYWQ7CisJcC0+aW5qZWN0X29wID0gc2ZfaW5qZWN0OworCXAtPnNldGZpbHRlcl9vcCA9IGluc3RhbGxfYnBmX3Byb2dyYW07CisJcC0+c2V0ZGlyZWN0aW9uX29wID0gc2Zfc2V0ZGlyZWN0aW9uOworCXAtPnNldF9kYXRhbGlua19vcCA9IE5VTEw7CS8qIHdlIGRvbid0IHN1cHBvcnQgbXVuZ2luZyBsaW5rLWxheWVyIGhlYWRlcnMgKi8KKwlwLT5nZXRub25ibG9ja19vcCA9IHNmX2dldG5vbmJsb2NrOworCXAtPnNldG5vbmJsb2NrX29wID0gc2Zfc2V0bm9uYmxvY2s7CisJcC0+c3RhdHNfb3AgPSBzZl9zdGF0czsKKyNpZmRlZiBXSU4zMgorCXAtPnNldGJ1ZmZfb3AgPSBzZl9zZXRidWZmOworCXAtPnNldG1vZGVfb3AgPSBzZl9zZXRtb2RlOworCXAtPnNldG1pbnRvY29weV9vcCA9IHNmX3NldG1pbnRvY29weTsKKyNlbmRpZgorCXAtPmNsZWFudXBfb3AgPSBzZl9jbGVhbnVwOworCXAtPmFjdGl2YXRlZCA9IDE7CisKKwlyZXR1cm4gKHApOworIGJhZDoKKwlmcmVlKHApOworCXJldHVybiAoTlVMTCk7Cit9CisKKy8qCisgKiBSZWFkIHBhY2tldHMgZnJvbSBhIGNhcHR1cmUgZmlsZSwgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIGZvciBlYWNoCisgKiBwYWNrZXQuCisgKiBJZiBjbnQgPiAwLCByZXR1cm4gYWZ0ZXIgJ2NudCcgcGFja2V0cywgb3RoZXJ3aXNlIGNvbnRpbnVlIHVudGlsIGVvZi4KKyAqLworaW50CitwY2FwX29mZmxpbmVfcmVhZChwY2FwX3QgKnAsIGludCBjbnQsIHBjYXBfaGFuZGxlciBjYWxsYmFjaywgdV9jaGFyICp1c2VyKQoreworCXN0cnVjdCBicGZfaW5zbiAqZmNvZGU7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IG4gPSAwOworCXVfY2hhciAqZGF0YTsKKworCXdoaWxlIChzdGF0dXMgPT0gMCkgeworCQlzdHJ1Y3QgcGNhcF9wa3RoZHIgaDsKKworCQkvKgorCQkgKiBIYXMgInBjYXBfYnJlYWtsb29wKCkiIGJlZW4gY2FsbGVkPworCQkgKiBJZiBzbywgcmV0dXJuIGltbWVkaWF0ZWx5IC0gaWYgd2UgaGF2ZW4ndCByZWFkIGFueQorCQkgKiBwYWNrZXRzLCBjbGVhciB0aGUgZmxhZyBhbmQgcmV0dXJuIC0yIHRvIGluZGljYXRlCisJCSAqIHRoYXQgd2Ugd2VyZSB0b2xkIHRvIGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgb3RoZXJ3aXNlCisJCSAqIGxlYXZlIHRoZSBmbGFnIHNldCwgc28gdGhhdCB0aGUgKm5leHQqIGNhbGwgd2lsbCBicmVhaworCQkgKiBvdXQgb2YgdGhlIGxvb3Agd2l0aG91dCBoYXZpbmcgcmVhZCBhbnkgcGFja2V0cywgYW5kCisJCSAqIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UndmUgcHJvY2Vzc2VkIHNvIGZhci4KKwkJICovCisJCWlmIChwLT5icmVha19sb29wKSB7CisJCQlpZiAobiA9PSAwKSB7CisJCQkJcC0+YnJlYWtfbG9vcCA9IDA7CisJCQkJcmV0dXJuICgtMik7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gKG4pOworCQl9CisKKwkJc3RhdHVzID0gcC0+c2YubmV4dF9wYWNrZXRfb3AocCwgJmgsICZkYXRhKTsKKwkJaWYgKHN0YXR1cykgeworCQkJaWYgKHN0YXR1cyA9PSAxKQorCQkJCXJldHVybiAoMCk7CisJCQlyZXR1cm4gKHN0YXR1cyk7CisJCX0KKworCQlpZiAoKGZjb2RlID0gcC0+ZmNvZGUuYmZfaW5zbnMpID09IE5VTEwgfHwKKwkJICAgIGJwZl9maWx0ZXIoZmNvZGUsIGRhdGEsIGgubGVuLCBoLmNhcGxlbikpIHsKKwkJCSgqY2FsbGJhY2spKHVzZXIsICZoLCBkYXRhKTsKKwkJCWlmICgrK24gPj0gY250ICYmIGNudCA+IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJLypYWFggdGhpcyBicmVha3Mgc2VtYW50aWNzIHRjcHNsaWNlIGV4cGVjdHMgKi8KKwlyZXR1cm4gKG4pOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9zY2FubmVyLmwgYi9saWJwY2FwLTEuMy4wL3NjYW5uZXIubApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjRlOWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC9zY2FubmVyLmwKQEAgLTAsMCArMSw0NjYgQEAKKyV7CisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTg5LCAxOTkwLCAxOTkxLCAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKi8KKworI2lmbmRlZiBsaW50CitzdGF0aWMgY29uc3QgY2hhciByY3NpZFtdIF9VXyA9CisgICAgIkAoIykgJEhlYWRlcjogL3RjcGR1bXAvbWFzdGVyL2xpYnBjYXAvc2Nhbm5lci5sLHYgMS4xMTIgMjAwOC0wMi0wNiAxMDoyMTozMCBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8cGNhcC1zdGRpbmMuaD4KKyNlbHNlIC8qIFdJTjMyICovCisjaWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX0JJVFlQRVNfSAorI2luY2x1ZGUgPHN5cy9iaXR5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInBjYXAtaW50LmgiCisKKyNpbmNsdWRlICJnZW5jb2RlLmgiCisjaWZkZWYgSU5FVDYKKyNpZmRlZiBXSU4zMgorI2luY2x1ZGUgPHBjYXAtc3RkaW5jLmg+CisKKyNpZmRlZiBfX01JTkdXMzJfXworI2luY2x1ZGUgImlwNl9taXNjLmgiCisjZW5kaWYKKyNlbHNlIC8qIFdJTjMyICovCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgkvKiBmb3IgInN0cnVjdCBzb2NrYWRkciIgaW4gInN0cnVjdCBhZGRyaW5mbyIgKi8KKyNpbmNsdWRlIDxuZXRkYi5oPgkvKiBmb3IgInN0cnVjdCBhZGRyaW5mbyIgKi8KKyNlbmRpZiAvKiBXSU4zMiAqLworCisvKiBXb3JrYXJvdW5kIGZvciBBSVggNC4zICovCisjaWYgIWRlZmluZWQoQUlfTlVNRVJJQ0hPU1QpCisjZGVmaW5lIEFJX05VTUVSSUNIT1NUIDB4MDQKKyNlbmRpZgorI2VuZGlmIC8qSU5FVDYqLworI2luY2x1ZGUgPHBjYXAvbmFtZWRiLmg+CisjaW5jbHVkZSAidG9rZGVmcy5oIgorCisjaWZkZWYgSEFWRV9PU19QUk9UT19ICisjaW5jbHVkZSAib3MtcHJvdG8uaCIKKyNlbmRpZgorCitzdGF0aWMgaW50IHN0b2koY2hhciAqKTsKK3N0YXRpYyBpbmxpbmUgaW50IHhkdG9pKGludCk7CisKKyNpZmRlZiBGTEVYX1NDQU5ORVIKKyNkZWZpbmUgWVlfTk9fSU5QVVQKKyNkZWZpbmUgWVlfTk9fVU5QVVQKK3N0YXRpYyBZWV9CVUZGRVJfU1RBVEUgaW5fYnVmZmVyOworI2Vsc2UKK3N0YXRpYyBjb25zdCBjaGFyICppbl9idWZmZXI7CisKKyN1bmRlZiBnZXRjCisjZGVmaW5lIGdldGMoZnApICAoKmluX2J1ZmZlciA9PSAwID8gRU9GIDogKmluX2J1ZmZlcisrKQorI2VuZGlmCisKKyNkZWZpbmUgeXlsdmFsIHBjYXBfbHZhbAorZXh0ZXJuIFlZU1RZUEUgeXlsdmFsOworCislfQorCitOCQkoWzAtOV0rfCgwWHwweClbMC05QS1GYS1mXSspCitCCQkoWzAtOUEtRmEtZl1bMC05QS1GYS1mXT8pCitCMgkJKFswLTlBLUZhLWZdWzAtOUEtRmEtZl1bMC05QS1GYS1mXVswLTlBLUZhLWZdKQorVwkJKFswLTlBLUZhLWZdWzAtOUEtRmEtZl0/WzAtOUEtRmEtZl0/WzAtOUEtRmEtZl0/KQorCislYSAxODQwMAorJW8gMjE1MDAKKyVlIDc2MDAKKyVrIDQ1NTAKKyVwIDI3NjAwCislbiAyMDAwCisKK1Y2ODAJCXtXfTp7V306e1d9OntXfTp7V306e1d9OntXfTp7V30KKworVjY3MAkJOjp7V306e1d9OntXfTp7V306e1d9OntXfTp7V30KK1Y2NzEJCXtXfTo6e1d9OntXfTp7V306e1d9OntXfTp7V30KK1Y2NzIJCXtXfTp7V306OntXfTp7V306e1d9OntXfTp7V30KK1Y2NzMJCXtXfTp7V306e1d9Ojp7V306e1d9OntXfTp7V30KK1Y2NzQJCXtXfTp7V306e1d9OntXfTo6e1d9OntXfTp7V30KK1Y2NzUJCXtXfTp7V306e1d9OntXfTp7V306OntXfTp7V30KK1Y2NzYJCXtXfTp7V306e1d9OntXfTp7V306e1d9Ojp7V30KK1Y2NzcJCXtXfTp7V306e1d9OntXfTp7V306e1d9OntXfTo6CisKK1Y2NjAJCTo6e1d9OntXfTp7V306e1d9OntXfTp7V30KK1Y2NjEJCXtXfTo6e1d9OntXfTp7V306e1d9OntXfQorVjY2MgkJe1d9OntXfTo6e1d9OntXfTp7V306e1d9CitWNjYzCQl7V306e1d9OntXfTo6e1d9OntXfTp7V30KK1Y2NjQJCXtXfTp7V306e1d9OntXfTo6e1d9OntXfQorVjY2NQkJe1d9OntXfTp7V306e1d9OntXfTo6e1d9CitWNjY2CQl7V306e1d9OntXfTp7V306e1d9OntXfTo6CisKK1Y2NTAJCTo6e1d9OntXfTp7V306e1d9OntXfQorVjY1MQkJe1d9Ojp7V306e1d9OntXfTp7V30KK1Y2NTIJCXtXfTp7V306OntXfTp7V306e1d9CitWNjUzCQl7V306e1d9OntXfTo6e1d9OntXfQorVjY1NAkJe1d9OntXfTp7V306e1d9Ojp7V30KK1Y2NTUJCXtXfTp7V306e1d9OntXfTp7V306OgorCitWNjQwCQk6OntXfTp7V306e1d9OntXfQorVjY0MQkJe1d9Ojp7V306e1d9OntXfQorVjY0MgkJe1d9OntXfTo6e1d9OntXfQorVjY0MwkJe1d9OntXfTp7V306OntXfQorVjY0NAkJe1d9OntXfTp7V306e1d9OjoKKworVjYzMAkJOjp7V306e1d9OntXfQorVjYzMQkJe1d9Ojp7V306e1d9CitWNjMyCQl7V306e1d9Ojp7V30KK1Y2MzMJCXtXfTp7V306e1d9OjoKKworVjYyMAkJOjp7V306e1d9CitWNjIxCQl7V306OntXfQorVjYyMgkJe1d9OntXfTo6CisKK1Y2MTAJCTo6e1d9CitWNjExCQl7V306OgorCitWNjAwCQk6OgorCitWNjYwNAkJe1d9OntXfTp7V306e1d9OntXfTp7V306e059XC57Tn1cLntOfVwue059CisKK1Y2NTA0CQk6OntXfTp7V306e1d9OntXfTp7V306e059XC57Tn1cLntOfVwue059CitWNjUxNAkJe1d9Ojp7V306e1d9OntXfTp7V306e059XC57Tn1cLntOfVwue059CitWNjUyNAkJe1d9OntXfTo6e1d9OntXfTp7V306e059XC57Tn1cLntOfVwue059CitWNjUzNAkJe1d9OntXfTp7V306OntXfTp7V306e059XC57Tn1cLntOfVwue059CitWNjU0NAkJe1d9OntXfTp7V306e1d9Ojp7V306e059XC57Tn1cLntOfVwue059CitWNjU1NAkJe1d9OntXfTp7V306e1d9OntXfTo6e059XC57Tn1cLntOfVwue059CisKK1Y2NDA0CQk6OntXfTp7V306e1d9OntXfTp7Tn1cLntOfVwue059XC57Tn0KK1Y2NDE0CQl7V306OntXfTp7V306e1d9OntOfVwue059XC57Tn1cLntOfQorVjY0MjQJCXtXfTp7V306OntXfTp7V306e059XC57Tn1cLntOfVwue059CitWNjQzNAkJe1d9OntXfTp7V306OntXfTp7Tn1cLntOfVwue059XC57Tn0KK1Y2NDQ0CQl7V306e1d9OntXfTp7V306OntOfVwue059XC57Tn1cLntOfQorCitWNjMwNAkJOjp7V306e1d9OntXfTp7Tn1cLntOfVwue059XC57Tn0KK1Y2MzE0CQl7V306OntXfTp7V306e059XC57Tn1cLntOfVwue059CitWNjMyNAkJe1d9OntXfTo6e1d9OntOfVwue059XC57Tn1cLntOfQorVjYzMzQJCXtXfTp7V306e1d9Ojp7Tn1cLntOfVwue059XC57Tn0KKworVjYyMDQJCTo6e1d9OntXfTp7Tn1cLntOfVwue059XC57Tn0KK1Y2MjE0CQl7V306OntXfTp7Tn1cLntOfVwue059XC57Tn0KK1Y2MjI0CQl7V306e1d9Ojp7Tn1cLntOfVwue059XC57Tn0KKworVjYxMDQJCTo6e1d9OntOfVwue059XC57Tn1cLntOfQorVjYxMTQJCXtXfTo6e059XC57Tn1cLntOfVwue059CisKK1Y2MDA0CQk6OntOfVwue059XC57Tn1cLntOfQorCisKK1Y2CQkoe1Y2ODB9fHtWNjcwfXx7VjY3MX18e1Y2NzJ9fHtWNjczfXx7VjY3NH18e1Y2NzV9fHtWNjc2fXx7VjY3N318e1Y2NjB9fHtWNjYxfXx7VjY2Mn18e1Y2NjN9fHtWNjY0fXx7VjY2NX18e1Y2NjZ9fHtWNjUwfXx7VjY1MX18e1Y2NTJ9fHtWNjUzfXx7VjY1NH18e1Y2NTV9fHtWNjQwfXx7VjY0MX18e1Y2NDJ9fHtWNjQzfXx7VjY0NH18e1Y2MzB9fHtWNjMxfXx7VjYzMn18e1Y2MzN9fHtWNjIwfXx7VjYyMX18e1Y2MjJ9fHtWNjEwfXx7VjYxMX18e1Y2MDB9fHtWNjYwNH18e1Y2NTA0fXx7VjY1MTR9fHtWNjUyNH18e1Y2NTM0fXx7VjY1NDR9fHtWNjU1NH18e1Y2NDA0fXx7VjY0MTR9fHtWNjQyNH18e1Y2NDM0fXx7VjY0NDR9fHtWNjMwNH18e1Y2MzE0fXx7VjYzMjR9fHtWNjMzNH18e1Y2MjA0fXx7VjYyMTR9fHtWNjIyNH18e1Y2MTA0fXx7VjYxMTR9fHtWNjAwNH0pCisKK01BQwkJKHtCfTp7Qn06e0J9OntCfTp7Qn06e0J9fHtCfVwte0J9XC17Qn1cLXtCfVwte0J9XC17Qn18e0J9XC57Qn1cLntCfVwue0J9XC57Qn1cLntCfXx7QjJ9XC57QjJ9XC57QjJ9fHtCMn17M30pCisKKworCislJQorZHN0CQlyZXR1cm4gRFNUOworc3JjCQlyZXR1cm4gU1JDOworCitsaW5rfGV0aGVyfHBwcHxzbGlwICByZXR1cm4gTElOSzsKK2ZkZGl8dHJ8d2xhbglyZXR1cm4gTElOSzsKK2FycAkJcmV0dXJuIEFSUDsKK3JhcnAJCXJldHVybiBSQVJQOworaXAJCXJldHVybiBJUDsKK3NjdHAJCXJldHVybiBTQ1RQOwordGNwCQlyZXR1cm4gVENQOwordWRwCQlyZXR1cm4gVURQOworaWNtcAkJcmV0dXJuIElDTVA7CitpZ21wCQlyZXR1cm4gSUdNUDsKK2lncnAJCXJldHVybiBJR1JQOworcGltCQlyZXR1cm4gUElNOwordnJycAkJcmV0dXJuIFZSUlA7CitjYXJwCQlyZXR1cm4gQ0FSUDsKK3JhZGlvCQlyZXR1cm4gUkFESU87CisKK2lwNgkJeworI2lmZGVmIElORVQ2CisJCXJldHVybiBJUFY2OworI2Vsc2UKKwkJYnBmX2Vycm9yKCIlcyBub3Qgc3VwcG9ydGVkIiwgeXl0ZXh0KTsKKyNlbmRpZgorCQl9CitpY21wNgkJeworI2lmZGVmIElORVQ2CisJCXJldHVybiBJQ01QVjY7CisjZWxzZQorCQlicGZfZXJyb3IoIiVzIG5vdCBzdXBwb3J0ZWQiLCB5eXRleHQpOworI2VuZGlmCisJCX0KK2FoCQlyZXR1cm4gQUg7Citlc3AJCXJldHVybiBFU1A7CisKK2F0YWxrCQlyZXR1cm4gQVRBTEs7CithYXJwCQlyZXR1cm4gQUFSUDsKK2RlY25ldAkJcmV0dXJuIERFQ05FVDsKK2xhdAkJcmV0dXJuIExBVDsKK3NjYQkJcmV0dXJuIFNDQTsKK21vcHJjCQlyZXR1cm4gTU9QUkM7Cittb3BkbAkJcmV0dXJuIE1PUERMOworCitpc28JCXJldHVybiBJU087Citlc2lzCQlyZXR1cm4gRVNJUzsKK2VzLWlzCQlyZXR1cm4gRVNJUzsKK2lzaXMJCXJldHVybiBJU0lTOworaXMtaXMJCXJldHVybiBJU0lTOworbDEgICAgICAgICAgICAgIHJldHVybiBMMTsKK2wyICAgICAgICAgICAgICByZXR1cm4gTDI7CitpaWggICAgICAgICAgICAgcmV0dXJuIElJSDsKK2xzcCAgICAgICAgICAgICByZXR1cm4gTFNQOworc25wICAgICAgICAgICAgIHJldHVybiBTTlA7Citjc25wICAgICAgICAgICAgcmV0dXJuIENTTlA7Citwc25wICAgICAgICAgICAgcmV0dXJuIFBTTlA7CisKK2NsbnAJCXJldHVybiBDTE5QOworCitzdHAJCXJldHVybiBTVFA7CisKK2lweAkJcmV0dXJuIElQWDsKKworbmV0YmV1aQkJcmV0dXJuIE5FVEJFVUk7CisKK2hvc3QJCXJldHVybiBIT1NUOworbmV0CQlyZXR1cm4gTkVUOworbWFzawkJcmV0dXJuIE5FVE1BU0s7Citwb3J0CQlyZXR1cm4gUE9SVDsKK3BvcnRyYW5nZQlyZXR1cm4gUE9SVFJBTkdFOworcHJvdG8JCXJldHVybiBQUk9UTzsKK3Byb3RvY2hhaW4JeworI2lmZGVmIE5PX1BST1RPQ0hBSU4KKwkJICBicGZfZXJyb3IoIiVzIG5vdCBzdXBwb3J0ZWQiLCB5eXRleHQpOworI2Vsc2UKKwkJICByZXR1cm4gUFJPVE9DSEFJTjsKKyNlbmRpZgorCQl9CisKK2dhdGV3YXkJCXJldHVybiBHQVRFV0FZOworCit0eXBlCQlyZXR1cm4gVFlQRTsKK3N1YnR5cGUJCXJldHVybiBTVUJUWVBFOworZGlyZWN0aW9ufGRpcglyZXR1cm4gRElSOworYWRkcmVzczF8YWRkcjEJcmV0dXJuIEFERFIxOworYWRkcmVzczJ8YWRkcjIJcmV0dXJuIEFERFIyOworYWRkcmVzczN8YWRkcjMJcmV0dXJuIEFERFIzOworYWRkcmVzczR8YWRkcjQJcmV0dXJuIEFERFI0OworcmEJCXJldHVybiBSQTsKK3RhCQlyZXR1cm4gVEE7CisKK2xlc3MJCXJldHVybiBMRVNTOworZ3JlYXRlcgkJcmV0dXJuIEdSRUFURVI7CitieXRlCQlyZXR1cm4gQ0JZVEU7Citicm9hZGNhc3QJcmV0dXJuIFRLX0JST0FEQ0FTVDsKK211bHRpY2FzdAlyZXR1cm4gVEtfTVVMVElDQVNUOworCithbmR8IiYmIglyZXR1cm4gQU5EOworb3J8Inx8IgkJcmV0dXJuIE9SOworbm90CQlyZXR1cm4gJyEnOworCitsZW58bGVuZ3RoCXJldHVybiBMRU47CitpbmJvdW5kCQlyZXR1cm4gSU5CT1VORDsKK291dGJvdW5kCXJldHVybiBPVVRCT1VORDsKKwordmxhbgkJcmV0dXJuIFZMQU47CittcGxzCQlyZXR1cm4gTVBMUzsKK3BwcG9lZAkJcmV0dXJuIFBQUE9FRDsKK3BwcG9lcwkJcmV0dXJuIFBQUE9FUzsKKworbGFuZQkJcmV0dXJuIExBTkU7CitsbGMJCXJldHVybiBMTEM7CittZXRhYwkJcmV0dXJuIE1FVEFDOworYmNjCQlyZXR1cm4gQkNDOworb2FtCQlyZXR1cm4gT0FNOworb2FtZjQJCXJldHVybiBPQU1GNDsKK29hbWY0ZWMJCXJldHVybiBPQU1GNEVDOworb2FtZjRzYwkJcmV0dXJuIE9BTUY0U0M7CitzYwkJcmV0dXJuIFNDOworaWxtaWMJCXJldHVybiBJTE1JQzsKK3ZwaQkJcmV0dXJuIFZQSTsKK3ZjaQkJcmV0dXJuIFZDSTsKK2Nvbm5lY3Rtc2cJcmV0dXJuIENPTk5FQ1RNU0c7CittZXRhY29ubmVjdAlyZXR1cm4gTUVUQUNPTk5FQ1Q7CisKK29ufGlmbmFtZQlyZXR1cm4gUEZfSUZOQU1FOworcnNldHxydWxlc2V0CXJldHVybiBQRl9SU0VUOworcm5yfHJ1bGVudW0JcmV0dXJuIFBGX1JOUjsKK3NybnJ8c3VicnVsZW51bQlyZXR1cm4gUEZfU1JOUjsKK3JlYXNvbgkJcmV0dXJuIFBGX1JFQVNPTjsKK2FjdGlvbgkJcmV0dXJuIFBGX0FDVElPTjsKKworZmlzdQkJcmV0dXJuIEZJU1U7Citsc3N1CQlyZXR1cm4gTFNTVTsKK2xzdQkJcmV0dXJuIExTU1U7Cittc3UJCXJldHVybiBNU1U7CitzaW8JCXJldHVybiBTSU87CitvcGMJCXJldHVybiBPUEM7CitkcGMJCXJldHVybiBEUEM7CitzbHMJCXJldHVybiBTTFM7CisKK1sgXHJcblx0XQkJOworWytcLSovOlxbXF0hPD4oKSZ8PV0JcmV0dXJuIHl5dGV4dFswXTsKKyI+PSIJCQlyZXR1cm4gR0VROworIjw9IgkJCXJldHVybiBMRVE7CisiIT0iCQkJcmV0dXJuIE5FUTsKKyI9PSIJCQlyZXR1cm4gJz0nOworIjw8IgkJCXJldHVybiBMU0g7CisiPj4iCQkJcmV0dXJuIFJTSDsKKyR7Qn0JCQl7IHl5bHZhbC5lID0gcGNhcF9ldGhlcl9hdG9uKCgoY2hhciAqKXl5dGV4dCkrMSk7CisJCQkgIHJldHVybiBBSUQ7IH0KK3tNQUN9CQkJeyB5eWx2YWwuZSA9IHBjYXBfZXRoZXJfYXRvbigoY2hhciAqKXl5dGV4dCk7CisJCQkgIHJldHVybiBFSUQ7IH0KK3tOfQkJCXsgeXlsdmFsLmkgPSBzdG9pKChjaGFyICopeXl0ZXh0KTsgcmV0dXJuIE5VTTsgfQorKHtOfVwue059KXwoe059XC57Tn1cLntOfSl8KHtOfVwue059XC57Tn1cLntOfSkJeworCQkJeXlsdmFsLnMgPSBzZHVwKChjaGFyICopeXl0ZXh0KTsgcmV0dXJuIEhJRDsgfQore1Y2fQkJCXsKKyNpZmRlZiBJTkVUNgorCQkJICBzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXM7CisJCQkgIG1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOworCQkJICBoaW50cy5haV9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCSAgaGludHMuYWlfZmxhZ3MgPSBBSV9OVU1FUklDSE9TVDsKKwkJCSAgaWYgKGdldGFkZHJpbmZvKHl5dGV4dCwgTlVMTCwgJmhpbnRzLCAmcmVzKSkKKwkJCQlicGZfZXJyb3IoImJvZ3VzIElQdjYgYWRkcmVzcyAlcyIsIHl5dGV4dCk7CisJCQkgIGVsc2UgeworCQkJCWZyZWVhZGRyaW5mbyhyZXMpOworCQkJCXl5bHZhbC5zID0gc2R1cCgoY2hhciAqKXl5dGV4dCk7IHJldHVybiBISUQ2OworCQkJICB9CisjZWxzZQorCQkJICBicGZfZXJyb3IoIklQdjYgYWRkcmVzcyAlcyBub3Qgc3VwcG9ydGVkIiwgeXl0ZXh0KTsKKyNlbmRpZiAvKklORVQ2Ki8KKwkJCX0KK3tCfTorKHtCfTorKSsJCXsgYnBmX2Vycm9yKCJib2d1cyBldGhlcm5ldCBhZGRyZXNzICVzIiwgeXl0ZXh0KTsgfQoraWNtcHR5cGUJCXsgeXlsdmFsLmkgPSAwOyByZXR1cm4gTlVNOyB9CitpY21wY29kZQkJeyB5eWx2YWwuaSA9IDE7IHJldHVybiBOVU07IH0KK2ljbXAtZWNob3JlcGx5CQl7IHl5bHZhbC5pID0gMDsgcmV0dXJuIE5VTTsgfQoraWNtcC11bnJlYWNoCQl7IHl5bHZhbC5pID0gMzsgcmV0dXJuIE5VTTsgfQoraWNtcC1zb3VyY2VxdWVuY2gJeyB5eWx2YWwuaSA9IDQ7IHJldHVybiBOVU07IH0KK2ljbXAtcmVkaXJlY3QJCXsgeXlsdmFsLmkgPSA1OyByZXR1cm4gTlVNOyB9CitpY21wLWVjaG8JCXsgeXlsdmFsLmkgPSA4OyByZXR1cm4gTlVNOyB9CitpY21wLXJvdXRlcmFkdmVydAl7IHl5bHZhbC5pID0gOTsgcmV0dXJuIE5VTTsgfQoraWNtcC1yb3V0ZXJzb2xpY2l0CXsgeXlsdmFsLmkgPSAxMDsgcmV0dXJuIE5VTTsgfQoraWNtcC10aW14Y2VlZAkJeyB5eWx2YWwuaSA9IDExOyByZXR1cm4gTlVNOyB9CitpY21wLXBhcmFtcHJvYgkJeyB5eWx2YWwuaSA9IDEyOyByZXR1cm4gTlVNOyB9CitpY21wLXRzdGFtcAkJeyB5eWx2YWwuaSA9IDEzOyByZXR1cm4gTlVNOyB9CitpY21wLXRzdGFtcHJlcGx5CXsgeXlsdmFsLmkgPSAxNDsgcmV0dXJuIE5VTTsgfQoraWNtcC1pcmVxCQl7IHl5bHZhbC5pID0gMTU7IHJldHVybiBOVU07IH0KK2ljbXAtaXJlcXJlcGx5CQl7IHl5bHZhbC5pID0gMTY7IHJldHVybiBOVU07IH0KK2ljbXAtbWFza3JlcQkJeyB5eWx2YWwuaSA9IDE3OyByZXR1cm4gTlVNOyB9CitpY21wLW1hc2tyZXBseQkJeyB5eWx2YWwuaSA9IDE4OyByZXR1cm4gTlVNOyB9Cit0Y3BmbGFncwkJeyB5eWx2YWwuaSA9IDEzOyByZXR1cm4gTlVNOyB9Cit0Y3AtZmluCQkJeyB5eWx2YWwuaSA9IDB4MDE7IHJldHVybiBOVU07IH0KK3RjcC1zeW4JCQl7IHl5bHZhbC5pID0gMHgwMjsgcmV0dXJuIE5VTTsgfQordGNwLXJzdAkJCXsgeXlsdmFsLmkgPSAweDA0OyByZXR1cm4gTlVNOyB9Cit0Y3AtcHVzaAkJeyB5eWx2YWwuaSA9IDB4MDg7IHJldHVybiBOVU07IH0KK3RjcC1hY2sJCQl7IHl5bHZhbC5pID0gMHgxMDsgcmV0dXJuIE5VTTsgfQordGNwLXVyZwkJCXsgeXlsdmFsLmkgPSAweDIwOyByZXR1cm4gTlVNOyB9CitbQS1aYS16MC05XShbLV8uQS1aYS16MC05XSpbLkEtWmEtejAtOV0pPyB7CisJCQkgeXlsdmFsLnMgPSBzZHVwKChjaGFyICopeXl0ZXh0KTsgcmV0dXJuIElEOyB9CisiXFwiW14gISgpXG5cdF0rCXsgeXlsdmFsLnMgPSBzZHVwKChjaGFyICopeXl0ZXh0ICsgMSk7IHJldHVybiBJRDsgfQorW14gXFtcXVx0XG5cLV8uQS1aYS16MC05ITw+KCkmfD1dKyB7CisJCQlicGZfZXJyb3IoImlsbGVnYWwgdG9rZW46ICVzIiwgeXl0ZXh0KTsgfQorLgkJCXsgYnBmX2Vycm9yKCJpbGxlZ2FsIGNoYXIgJyVjJyIsICp5eXRleHQpOyB9CislJQordm9pZAorbGV4X2luaXQoYnVmKQorCWNvbnN0IGNoYXIgKmJ1ZjsKK3sKKyNpZmRlZiBGTEVYX1NDQU5ORVIKKwlpbl9idWZmZXIgPSB5eV9zY2FuX3N0cmluZyhidWYpOworI2Vsc2UKKwlpbl9idWZmZXIgPSBidWY7CisjZW5kaWYKK30KKworLyoKKyAqIERvIGFueSBjbGVhbnVwIG5lY2Vzc2FyeSBhZnRlciBwYXJzaW5nLgorICovCit2b2lkCitsZXhfY2xlYW51cCgpCit7CisjaWZkZWYgRkxFWF9TQ0FOTkVSCisJaWYgKGluX2J1ZmZlciAhPSBOVUxMKQorCQl5eV9kZWxldGVfYnVmZmVyKGluX2J1ZmZlcik7CisJaW5fYnVmZmVyID0gTlVMTDsKKyNlbmRpZgorfQorCisvKgorICogQWxzbyBkZWZpbmUgYSB5eXdyYXAuICBOb3RlIHRoYXQgaWYgd2UncmUgdXNpbmcgZmxleCwgaXQgd2lsbAorICogZGVmaW5lIGEgbWFjcm8gdG8gbWFwIHRoaXMgaWRlbnRpZmllciB0byBwY2FwX3dyYXAuCisgKi8KK2ludAoreXl3cmFwKCkKK3sKKwlyZXR1cm4gMTsKK30KKworLyogSGV4IGRpZ2l0IHRvIGludGVnZXIuICovCitzdGF0aWMgaW5saW5lIGludAoreGR0b2koYykKKwlyZWdpc3RlciBpbnQgYzsKK3sKKwlpZiAoaXNkaWdpdChjKSkKKwkJcmV0dXJuIGMgLSAnMCc7CisJZWxzZSBpZiAoaXNsb3dlcihjKSkKKwkJcmV0dXJuIGMgLSAnYScgKyAxMDsKKwllbHNlCisJCXJldHVybiBjIC0gJ0EnICsgMTA7Cit9CisKKy8qCisgKiBDb252ZXJ0IHN0cmluZyB0byBpbnRlZ2VyLiAgSnVzdCBsaWtlIGF0b2koKSwgYnV0IGNoZWNrcyBmb3IKKyAqIHByZWNlZGluZyAweCBvciAwIGFuZCB1c2VzIGhleCBvciBvY3RhbCBpbnN0ZWFkIG9mIGRlY2ltYWwuCisgKi8KK3N0YXRpYyBpbnQKK3N0b2kocykKKwljaGFyICpzOworeworCWludCBiYXNlID0gMTA7CisJaW50IG4gPSAwOworCisJaWYgKCpzID09ICcwJykgeworCQlpZiAoc1sxXSA9PSAneCcgfHwgc1sxXSA9PSAnWCcpIHsKKwkJCXMgKz0gMjsKKwkJCWJhc2UgPSAxNjsKKwkJfQorCQllbHNlIHsKKwkJCWJhc2UgPSA4OworCQkJcyArPSAxOworCQl9CisJfQorCXdoaWxlICgqcykKKwkJbiA9IG4gKiBiYXNlICsgeGR0b2koKnMrKyk7CisKKwlyZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvc2YtcGNhcC1uZy5jIGIvbGlicGNhcC0xLjMuMC9zZi1wY2FwLW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ViNmRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvc2YtcGNhcC1uZy5jCkBAIC0wLDAgKzEsMTEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIHNmLXBjYXAtbmcuYyAtIHBjYXAtbmctZmlsZS1mb3JtYXQtc3BlY2lmaWMgY29kZSBmcm9tIHNhdmVmaWxlLmMKKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSAicGNhcC1jb21tb24uaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNmLXBjYXAtbmcuaCIKKworLyoKKyAqIEJsb2NrIHR5cGVzLgorICovCisKKy8qCisgKiBDb21tb24gcGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIGFsbCBibG9ja3MuCisgKi8KK3N0cnVjdCBibG9ja19oZWFkZXIgeworCWJwZl91X2ludDMyCWJsb2NrX3R5cGU7CisJYnBmX3VfaW50MzIJdG90YWxfbGVuZ3RoOworfTsKKworLyoKKyAqIENvbW1vbiB0cmFpbGVyIGF0IHRoZSBlbmQgb2YgYWxsIGJsb2Nrcy4KKyAqLworc3RydWN0IGJsb2NrX3RyYWlsZXIgeworCWJwZl91X2ludDMyCXRvdGFsX2xlbmd0aDsKK307CisKKy8qCisgKiBDb21tb24gb3B0aW9ucy4KKyAqLworI2RlZmluZSBPUFRfRU5ET0ZPUFQJMAkvKiBlbmQgb2Ygb3B0aW9ucyAqLworI2RlZmluZSBPUFRfQ09NTUVOVAkxCS8qIGNvbW1lbnQgc3RyaW5nICovCisKKy8qCisgKiBPcHRpb24gaGVhZGVyLgorICovCitzdHJ1Y3Qgb3B0aW9uX2hlYWRlciB7CisJdV9zaG9ydAkJb3B0aW9uX2NvZGU7CisJdV9zaG9ydAkJb3B0aW9uX2xlbmd0aDsKK307CisKKy8qCisgKiBTdHJ1Y3R1cmVzIGZvciB0aGUgcGFydCBvZiBlYWNoIGJsb2NrIHR5cGUgZm9sbG93aW5nIHRoZSBjb21tb24KKyAqIHBhcnQuCisgKi8KKworLyoKKyAqIFNlY3Rpb24gSGVhZGVyIEJsb2NrLgorICovCisjZGVmaW5lIEJUX1NIQgkJCTB4MEEwRDBEMEEKKworc3RydWN0IHNlY3Rpb25faGVhZGVyX2Jsb2NrIHsKKwlicGZfdV9pbnQzMglieXRlX29yZGVyX21hZ2ljOworCXVfc2hvcnQJCW1ham9yX3ZlcnNpb247CisJdV9zaG9ydAkJbWlub3JfdmVyc2lvbjsKKwl1X2ludDY0X3QJc2VjdGlvbl9sZW5ndGg7CisJLyogZm9sbG93ZWQgYnkgb3B0aW9ucyBhbmQgdHJhaWxlciAqLworfTsKKworLyoKKyAqIEJ5dGUtb3JkZXIgbWFnaWMgdmFsdWUuCisgKi8KKyNkZWZpbmUgQllURV9PUkRFUl9NQUdJQwkweDFBMkIzQzRECisKKy8qCisgKiBDdXJyZW50IHZlcnNpb24gbnVtYmVyLiAgSWYgbWFqb3JfdmVyc2lvbiBpc24ndCBQQ0FQX05HX1ZFUlNJT05fTUFKT1IsCisgKiB0aGF0IG1lYW5zIHRoYXQgdGhpcyBjb2RlIGNhbid0IHJlYWQgdGhlIGZpbGUuCisgKi8KKyNkZWZpbmUgUENBUF9OR19WRVJTSU9OX01BSk9SCTEKKworLyoKKyAqIEludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jay4KKyAqLworI2RlZmluZSBCVF9JREIJCQkweDAwMDAwMDAxCisKK3N0cnVjdCBpbnRlcmZhY2VfZGVzY3JpcHRpb25fYmxvY2sgeworCXVfc2hvcnQJCWxpbmt0eXBlOworCXVfc2hvcnQJCXJlc2VydmVkOworCWJwZl91X2ludDMyCXNuYXBsZW47CisJLyogZm9sbG93ZWQgYnkgb3B0aW9ucyBhbmQgdHJhaWxlciAqLworfTsKKworLyoKKyAqIE9wdGlvbnMgaW4gdGhlIElEQi4KKyAqLworI2RlZmluZSBJRl9OQU1FCQkyCS8qIGludGVyZmFjZSBuYW1lIHN0cmluZyAqLworI2RlZmluZSBJRl9ERVNDUklQVElPTgkzCS8qIGludGVyZmFjZSBkZXNjcmlwdGlvbiBzdHJpbmcgKi8KKyNkZWZpbmUgSUZfSVBWNEFERFIJNAkvKiBpbnRlcmZhY2UncyBJUHY0IGFkZHJlc3MgYW5kIG5ldG1hc2sgKi8KKyNkZWZpbmUgSUZfSVBWNkFERFIJNQkvKiBpbnRlcmZhY2UncyBJUHY2IGFkZHJlc3MgYW5kIHByZWZpeCBsZW5ndGggKi8KKyNkZWZpbmUgSUZfTUFDQUREUgk2CS8qIGludGVyZmFjZSdzIE1BQyBhZGRyZXNzICovCisjZGVmaW5lIElGX0VVSUFERFIJNwkvKiBpbnRlcmZhY2UncyBFVUkgYWRkcmVzcyAqLworI2RlZmluZSBJRl9TUEVFRAk4CS8qIGludGVyZmFjZSdzIHNwZWVkLCBpbiBiaXRzL3MgKi8KKyNkZWZpbmUgSUZfVFNSRVNPTAk5CS8qIGludGVyZmFjZSdzIHRpbWUgc3RhbXAgcmVzb2x1dGlvbiAqLworI2RlZmluZSBJRl9UWk9ORQkxMAkvKiBpbnRlcmZhY2UncyB0aW1lIHpvbmUgKi8KKyNkZWZpbmUgSUZfRklMVEVSCTExCS8qIGZpbHRlciB1c2VkIHdoZW4gY2FwdHVyaW5nIG9uIGludGVyZmFjZSAqLworI2RlZmluZSBJRl9PUwkJMTIJLyogc3RyaW5nIE9TIG9uIHdoaWNoIGNhcHR1cmUgb24gdGhpcyBpbnRlcmZhY2Ugd2FzIGRvbmUgKi8KKyNkZWZpbmUgSUZfRkNTTEVOCTEzCS8qIEZDUyBsZW5ndGggZm9yIHRoaXMgaW50ZXJmYWNlICovCisjZGVmaW5lIElGX1RTT0ZGU0VUCTE0CS8qIHRpbWUgc3RhbXAgb2Zmc2V0IGZvciB0aGlzIGludGVyZmFjZSAqLworCisvKgorICogRW5oYW5jZWQgUGFja2V0IEJsb2NrLgorICovCisjZGVmaW5lIEJUX0VQQgkJCTB4MDAwMDAwMDYKKworc3RydWN0IGVuaGFuY2VkX3BhY2tldF9ibG9jayB7CisJYnBmX3VfaW50MzIJaW50ZXJmYWNlX2lkOworCWJwZl91X2ludDMyCXRpbWVzdGFtcF9oaWdoOworCWJwZl91X2ludDMyCXRpbWVzdGFtcF9sb3c7CisJYnBmX3VfaW50MzIJY2FwbGVuOworCWJwZl91X2ludDMyCWxlbjsKKwkvKiBmb2xsb3dlZCBieSBwYWNrZXQgZGF0YSwgb3B0aW9ucywgYW5kIHRyYWlsZXIgKi8KK307CisKKy8qCisgKiBTaW1wbGUgUGFja2V0IEJsb2NrLgorICovCisjZGVmaW5lIEJUX1NQQgkJCTB4MDAwMDAwMDMKKworc3RydWN0IHNpbXBsZV9wYWNrZXRfYmxvY2sgeworCWJwZl91X2ludDMyCWxlbjsKKwkvKiBmb2xsb3dlZCBieSBwYWNrZXQgZGF0YSBhbmQgdHJhaWxlciAqLworfTsKKworLyoKKyAqIFBhY2tldCBCbG9jay4KKyAqLworI2RlZmluZSBCVF9QQgkJCTB4MDAwMDAwMDIKKworc3RydWN0IHBhY2tldF9ibG9jayB7CisJdV9zaG9ydAkJaW50ZXJmYWNlX2lkOworCXVfc2hvcnQJCWRyb3BzX2NvdW50OworCWJwZl91X2ludDMyCXRpbWVzdGFtcF9oaWdoOworCWJwZl91X2ludDMyCXRpbWVzdGFtcF9sb3c7CisJYnBmX3VfaW50MzIJY2FwbGVuOworCWJwZl91X2ludDMyCWxlbjsKKwkvKiBmb2xsb3dlZCBieSBwYWNrZXQgZGF0YSwgb3B0aW9ucywgYW5kIHRyYWlsZXIgKi8KK307CisKKy8qCisgKiBCbG9jayBjdXJzb3IgLSB1c2VkIHdoZW4gcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYSBibG9jay4KKyAqIENvbnRhaW5zIGEgcG9pbnRlciBpbnRvIHRoZSBkYXRhIGJlaW5nIHByb2Nlc3NlZCBhbmQgYSBjb3VudAorICogb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBibG9jay4KKyAqLworc3RydWN0IGJsb2NrX2N1cnNvciB7CisJdV9jaGFyCQkqZGF0YTsKKwlzaXplX3QJCWRhdGFfcmVtYWluaW5nOworCWJwZl91X2ludDMyCWJsb2NrX3R5cGU7Cit9OworCitzdGF0aWMgaW50IHBjYXBfbmdfbmV4dF9wYWNrZXQocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkciwKKyAgICB1X2NoYXIgKipkYXRhKTsKKworc3RhdGljIGludAorcmVhZF9ieXRlcyhGSUxFICpmcCwgdm9pZCAqYnVmLCBzaXplX3QgYnl0ZXNfdG9fcmVhZCwgaW50IGZhaWxfb25fZW9mLAorICAgIGNoYXIgKmVycmJ1ZikKK3sKKwlzaXplX3QgYW10X3JlYWQ7CisKKwlhbXRfcmVhZCA9IGZyZWFkKGJ1ZiwgMSwgYnl0ZXNfdG9fcmVhZCwgZnApOworCWlmIChhbXRfcmVhZCAhPSBieXRlc190b19yZWFkKSB7CisJCWlmIChmZXJyb3IoZnApKSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQl9IGVsc2UgeworCQkJaWYgKGFtdF9yZWFkID09IDAgJiYgIWZhaWxfb25fZW9mKQorCQkJCXJldHVybiAoMCk7CS8qIEVPRiAqLworCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICVsdSBieXRlcywgb25seSBnb3QgJWx1IiwKKwkJCSAgICAodW5zaWduZWQgbG9uZylieXRlc190b19yZWFkLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKKwkJfQorCQlyZXR1cm4gKC0xKTsKKwl9CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIGludAorcmVhZF9ibG9jayhGSUxFICpmcCwgcGNhcF90ICpwLCBzdHJ1Y3QgYmxvY2tfY3Vyc29yICpjdXJzb3IsIGNoYXIgKmVycmJ1ZikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBibG9ja19oZWFkZXIgYmhkcjsKKworCXN0YXR1cyA9IHJlYWRfYnl0ZXMoZnAsICZiaGRyLCBzaXplb2YoYmhkciksIDAsIGVycmJ1Zik7CisJaWYgKHN0YXR1cyA8PSAwKQorCQlyZXR1cm4gKHN0YXR1cyk7CS8qIGVycm9yIG9yIEVPRiAqLworCisJaWYgKHAtPnNmLnN3YXBwZWQpIHsKKwkJYmhkci5ibG9ja190eXBlID0gU1dBUExPTkcoYmhkci5ibG9ja190eXBlKTsKKwkJYmhkci50b3RhbF9sZW5ndGggPSBTV0FQTE9ORyhiaGRyLnRvdGFsX2xlbmd0aCk7CisJfQorCisJLyoKKwkgKiBJcyB0aGlzIGJsb2NrICJ0b28gYmlnIj8KKwkgKgorCSAqIFdlIGNob29zZSAxNk1CIGFzICJ0b28gYmlnIiwgZm9yIG5vdywgc28gdGhhdCB3ZSBoYW5kbGUKKwkgKiAicmVhc29uYWJseSIgbGFyZ2UgYnVmZmVycyBidXQgZG9uJ3QgY2hldyB1cCBhbGwgdGhlCisJICogbWVtb3J5IGlmIHdlIHJlYWQgYSBtYWxmb3JtZWQgZmlsZS4KKwkgKi8KKwlpZiAoYmhkci50b3RhbF9sZW5ndGggPiAxNioxMDI0KjEwMjQpIHsKKwkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkgICAgInBjYXAtbmcgYmxvY2sgc2l6ZSAldSA+IG1heGltdW0gJXUiLAorCQkgICAgYmhkci50b3RhbF9sZW5ndGgsIDE2KjEwMjQqMTAyNCk7CisJCSAgICByZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIElzIHRoaXMgYmxvY2sgInRvbyBzbWFsbCIgLSBpLmUuLCBpcyBpdCBzaG9ydGVyIHRoYW4gYSBibG9jaworCSAqIGhlYWRlciBwbHVzIGEgYmxvY2sgdHJhaWxlcj8KKwkgKi8KKwlpZiAoYmhkci50b3RhbF9sZW5ndGggPCBzaXplb2Yoc3RydWN0IGJsb2NrX2hlYWRlcikgKworCSAgICBzaXplb2Yoc3RydWN0IGJsb2NrX3RyYWlsZXIpKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJibG9jayBpbiBwY2FwLW5nIGR1bXAgZmlsZSBoYXMgYSBsZW5ndGggb2YgJXUgPCAlbHUiLAorCQkgICAgYmhkci50b3RhbF9sZW5ndGgsCisJCSAgICAodW5zaWduZWQgbG9uZykoc2l6ZW9mKHN0cnVjdCBibG9ja19oZWFkZXIpICsgc2l6ZW9mKHN0cnVjdCBibG9ja190cmFpbGVyKSkpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIElzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8KKwkgKi8KKwlpZiAocC0+YnVmc2l6ZSA8IGJoZHIudG90YWxfbGVuZ3RoKSB7CisJCS8qCisJCSAqIE5vIC0gbWFrZSBpdCBiaWcgZW5vdWdoLgorCQkgKi8KKwkJcC0+YnVmZmVyID0gcmVhbGxvYyhwLT5idWZmZXIsIGJoZHIudG90YWxfbGVuZ3RoKTsKKwkJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJvdXQgb2YgbWVtb3J5Iik7CisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCX0KKworCS8qCisJICogQ29weSB0aGUgc3R1ZmYgd2UndmUgcmVhZCB0byB0aGUgYnVmZmVyLCBhbmQgcmVhZCB0aGUgcmVzdAorCSAqIG9mIHRoZSBibG9jay4KKwkgKi8KKwltZW1jcHkocC0+YnVmZmVyLCAmYmhkciwgc2l6ZW9mKGJoZHIpKTsKKwlpZiAocmVhZF9ieXRlcyhmcCwgcC0+YnVmZmVyICsgc2l6ZW9mKGJoZHIpLAorCSAgICBiaGRyLnRvdGFsX2xlbmd0aCAtIHNpemVvZihiaGRyKSwgMSwgZXJyYnVmKSA9PSAtMSkKKwkJcmV0dXJuICgtMSk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGN1cnNvci4KKwkgKi8KKwljdXJzb3ItPmRhdGEgPSBwLT5idWZmZXIgKyBzaXplb2YoYmhkcik7CisJY3Vyc29yLT5kYXRhX3JlbWFpbmluZyA9IGJoZHIudG90YWxfbGVuZ3RoIC0gc2l6ZW9mKGJoZHIpIC0KKwkgICAgc2l6ZW9mKHN0cnVjdCBibG9ja190cmFpbGVyKTsKKwljdXJzb3ItPmJsb2NrX3R5cGUgPSBiaGRyLmJsb2NrX3R5cGU7CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQgKgorZ2V0X2Zyb21fYmxvY2tfZGF0YShzdHJ1Y3QgYmxvY2tfY3Vyc29yICpjdXJzb3IsIHNpemVfdCBjaHVua19zaXplLAorICAgIGNoYXIgKmVycmJ1ZikKK3sKKwl2b2lkICpkYXRhOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBkYXRhIHJlbWFpbmluZyBpbgorCSAqIHRoZSBibG9jayBkYXRhLgorCSAqLworCWlmIChjdXJzb3ItPmRhdGFfcmVtYWluaW5nIDwgY2h1bmtfc2l6ZSkgeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiYmxvY2sgb2YgdHlwZSAldSBpbiBwY2FwLW5nIGR1bXAgZmlsZSBpcyB0b28gc2hvcnQiLAorCQkgICAgY3Vyc29yLT5ibG9ja190eXBlKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKgorCSAqIFJldHVybiB0aGUgY3VycmVudCBwb2ludGVyLCBhbmQgc2tpcCBwYXN0IHRoZSBjaHVuay4KKwkgKi8KKwlkYXRhID0gY3Vyc29yLT5kYXRhOworCWN1cnNvci0+ZGF0YSArPSBjaHVua19zaXplOworCWN1cnNvci0+ZGF0YV9yZW1haW5pbmcgLT0gY2h1bmtfc2l6ZTsKKwlyZXR1cm4gKGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbl9oZWFkZXIgKgorZ2V0X29wdGhkcl9mcm9tX2Jsb2NrX2RhdGEocGNhcF90ICpwLCBzdHJ1Y3QgYmxvY2tfY3Vyc29yICpjdXJzb3IsIGNoYXIgKmVycmJ1ZikKK3sKKwlzdHJ1Y3Qgb3B0aW9uX2hlYWRlciAqb3B0aGRyOworCisJb3B0aGRyID0gZ2V0X2Zyb21fYmxvY2tfZGF0YShjdXJzb3IsIHNpemVvZigqb3B0aGRyKSwgZXJyYnVmKTsKKwlpZiAob3B0aGRyID09IE5VTEwpIHsKKwkJLyoKKwkJICogT3B0aW9uIGhlYWRlciBpcyBjdXQgc2hvcnQuCisJCSAqLworCQlyZXR1cm4gKE5VTEwpOworCX0KKworCS8qCisJICogQnl0ZS1zd2FwIGl0IGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAocC0+c2Yuc3dhcHBlZCkgeworCQlvcHRoZHItPm9wdGlvbl9jb2RlID0gU1dBUFNIT1JUKG9wdGhkci0+b3B0aW9uX2NvZGUpOworCQlvcHRoZHItPm9wdGlvbl9sZW5ndGggPSBTV0FQU0hPUlQob3B0aGRyLT5vcHRpb25fbGVuZ3RoKTsKKwl9CisKKwlyZXR1cm4gKG9wdGhkcik7Cit9CisKK3N0YXRpYyB2b2lkICoKK2dldF9vcHR2YWx1ZV9mcm9tX2Jsb2NrX2RhdGEoc3RydWN0IGJsb2NrX2N1cnNvciAqY3Vyc29yLAorICAgIHN0cnVjdCBvcHRpb25faGVhZGVyICpvcHRoZHIsIGNoYXIgKmVycmJ1ZikKK3sKKwlzaXplX3QgcGFkZGVkX29wdGlvbl9sZW47CisJdm9pZCAqb3B0dmFsdWU7CisKKwkvKiBQYWQgb3B0aW9uIGxlbmd0aCB0byA0LWJ5dGUgYm91bmRhcnkgKi8KKwlwYWRkZWRfb3B0aW9uX2xlbiA9IG9wdGhkci0+b3B0aW9uX2xlbmd0aDsKKwlwYWRkZWRfb3B0aW9uX2xlbiA9ICgocGFkZGVkX29wdGlvbl9sZW4gKyAzKS80KSo0OworCisJb3B0dmFsdWUgPSBnZXRfZnJvbV9ibG9ja19kYXRhKGN1cnNvciwgcGFkZGVkX29wdGlvbl9sZW4sIGVycmJ1Zik7CisJaWYgKG9wdHZhbHVlID09IE5VTEwpIHsKKwkJLyoKKwkJICogT3B0aW9uIHZhbHVlIGlzIGN1dCBzaG9ydC4KKwkJICovCisJCXJldHVybiAoTlVMTCk7CisJfQorCisJcmV0dXJuIChvcHR2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfaWRiX29wdGlvbnMocGNhcF90ICpwLCBzdHJ1Y3QgYmxvY2tfY3Vyc29yICpjdXJzb3IsIHVfaW50ICp0c3Jlc29sLAorICAgIHVfaW50NjRfdCAqdHNvZmZzZXQsIGNoYXIgKmVycmJ1ZikKK3sKKwlzdHJ1Y3Qgb3B0aW9uX2hlYWRlciAqb3B0aGRyOworCXZvaWQgKm9wdHZhbHVlOworCWludCBzYXdfdHNyZXNvbCwgc2F3X3Rzb2Zmc2V0OworCXVfY2hhciB0c3Jlc29sX29wdDsKKwl1X2ludCBpOworCisJc2F3X3RzcmVzb2wgPSAwOworCXNhd190c29mZnNldCA9IDA7CisJd2hpbGUgKGN1cnNvci0+ZGF0YV9yZW1haW5pbmcgIT0gMCkgeworCQkvKgorCQkgKiBHZXQgdGhlIG9wdGlvbiBoZWFkZXIuCisJCSAqLworCQlvcHRoZHIgPSBnZXRfb3B0aGRyX2Zyb21fYmxvY2tfZGF0YShwLCBjdXJzb3IsIGVycmJ1Zik7CisJCWlmIChvcHRoZHIgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIE9wdGlvbiBoZWFkZXIgaXMgY3V0IHNob3J0LgorCQkJICovCisJCQlyZXR1cm4gKC0xKTsKKwkJfQorCisJCS8qCisJCSAqIEdldCBvcHRpb24gdmFsdWUuCisJCSAqLworCQlvcHR2YWx1ZSA9IGdldF9vcHR2YWx1ZV9mcm9tX2Jsb2NrX2RhdGEoY3Vyc29yLCBvcHRoZHIsCisJCSAgICBlcnJidWYpOworCQlpZiAob3B0dmFsdWUgPT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIE9wdGlvbiB2YWx1ZSBpcyBjdXQgc2hvcnQuCisJCQkgKi8KKwkJCXJldHVybiAoLTEpOworCQl9CisKKwkJc3dpdGNoIChvcHRoZHItPm9wdGlvbl9jb2RlKSB7CisKKwkJY2FzZSBPUFRfRU5ET0ZPUFQ6CisJCQlpZiAob3B0aGRyLT5vcHRpb25fbGVuZ3RoICE9IDApIHsKKwkJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2sgaGFzIG9wdF9lbmRvZm9wdCBvcHRpb24gd2l0aCBsZW5ndGggJXUgIT0gMCIsCisJCQkJICAgIG9wdGhkci0+b3B0aW9uX2xlbmd0aCk7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlnb3RvIGRvbmU7CisKKwkJY2FzZSBJRl9UU1JFU09MOgorCQkJaWYgKG9wdGhkci0+b3B0aW9uX2xlbmd0aCAhPSAxKSB7CisJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGhhcyBpZl90c3Jlc29sIG9wdGlvbiB3aXRoIGxlbmd0aCAldSAhPSAxIiwKKwkJCQkgICAgb3B0aGRyLT5vcHRpb25fbGVuZ3RoKTsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCWlmIChzYXdfdHNyZXNvbCkgeworCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jayBoYXMgbW9yZSB0aGFuIG9uZSBpZl90c3Jlc29sIG9wdGlvbiIpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJc2F3X3RzcmVzb2wgPSAxOworCQkJdHNyZXNvbF9vcHQgPSAqKHVfaW50ICopb3B0dmFsdWU7CisJCQlpZiAodHNyZXNvbF9vcHQgJiAweDgwKSB7CisJCQkJLyoKKwkJCQkgKiBSZXNvbHV0aW9uIGlzIG5lZ2F0aXZlIHBvd2VyIG9mIDIuCisJCQkJICovCisJCQkJKnRzcmVzb2wgPSAxIDw8ICh0c3Jlc29sX29wdCAmIDB4N0YpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFJlc29sdXRpb24gaXMgbmVnYXRpdmUgcG93ZXIgb2YgMTAuCisJCQkJICovCisJCQkJKnRzcmVzb2wgPSAxOworCQkJCWZvciAoaSA9IDA7IGkgPCB0c3Jlc29sX29wdDsgaSsrKQorCQkJCQkqdHNyZXNvbCAqPSAxMDsKKwkJCX0KKwkJCWlmICgqdHNyZXNvbCA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBSZXNvbHV0aW9uIGlzIHRvbyBoaWdoLgorCQkJCSAqLworCQkJCWlmICh0c3Jlc29sX29wdCAmIDB4ODApIHsKKwkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkgICAgIkludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jayBpZl90c3Jlc29sIG9wdGlvbiByZXNvbHV0aW9uIDJeLSV1IGlzIHRvbyBoaWdoIiwKKwkJCQkJICAgIHRzcmVzb2xfb3B0ICYgMHg3Rik7CisJCQkJfSBlbHNlIHsKKwkJCQkJc25wcmludGYoZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCQkgICAgIkludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jayBpZl90c3Jlc29sIG9wdGlvbiByZXNvbHV0aW9uIDEwXi0ldSBpcyB0b28gaGlnaCIsCisJCQkJCSAgICB0c3Jlc29sX29wdCk7CisJCQkJfQorCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJRl9UU09GRlNFVDoKKwkJCWlmIChvcHRoZHItPm9wdGlvbl9sZW5ndGggIT0gOCkgeworCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jayBoYXMgaWZfdHNvZmZzZXQgb3B0aW9uIHdpdGggbGVuZ3RoICV1ICE9IDgiLAorCQkJCSAgICBvcHRoZHItPm9wdGlvbl9sZW5ndGgpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJaWYgKHNhd190c29mZnNldCkgeworCQkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgIkludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jayBoYXMgbW9yZSB0aGFuIG9uZSBpZl90c29mZnNldCBvcHRpb24iKTsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkJCXNhd190c29mZnNldCA9IDE7CisJCQltZW1jcHkodHNvZmZzZXQsIG9wdHZhbHVlLCBzaXplb2YoKnRzb2Zmc2V0KSk7CisJCQlpZiAocC0+c2Yuc3dhcHBlZCkKKwkJCQkqdHNvZmZzZXQgPSBTV0FQTEwoKnRzb2Zmc2V0KTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworZG9uZToKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGEgcGNhcC1uZyBzYXZlZmlsZSBhbmQsIGlmIGl0IGlzLCBleHRyYWN0IHRoZQorICogcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgaGVhZGVyLgorICovCitpbnQKK3BjYXBfbmdfY2hlY2tfaGVhZGVyKHBjYXBfdCAqcCwgYnBmX3VfaW50MzIgbWFnaWMsIEZJTEUgKmZwLCBjaGFyICplcnJidWYpCit7CisJc2l6ZV90IGFtdF9yZWFkOworCWJwZl91X2ludDMyIHRvdGFsX2xlbmd0aDsKKwlicGZfdV9pbnQzMiBieXRlX29yZGVyX21hZ2ljOworCXN0cnVjdCBibG9ja19oZWFkZXIgKmJoZHJwOworCXN0cnVjdCBzZWN0aW9uX2hlYWRlcl9ibG9jayAqc2hicDsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBibG9ja19jdXJzb3IgY3Vyc29yOworCXN0cnVjdCBpbnRlcmZhY2VfZGVzY3JpcHRpb25fYmxvY2sgKmlkYnA7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIGZpbGUgYXJlIHRoZSBibG9jaworCSAqIHR5cGUgZm9yIGEgcGNhcC1uZyBzYXZlZmlsZS4gCisJICovCisJaWYgKG1hZ2ljICE9IEJUX1NIQikgeworCQkvKgorCQkgKiBYWFggLSBjaGVjayB3aGV0aGVyIHRoaXMgbG9va3MgbGlrZSB3aGF0IHRoZSBibG9jaworCQkgKiB0eXBlIHdvdWxkIGJlIGFmdGVyIGJlaW5nIG11bmdlZCBieSBtYXBwaW5nIGJldHdlZW4KKwkJICogVU4qWCBhbmQgRE9TL1dpbmRvd3MgdGV4dCBmaWxlIGZvcm1hdCBhbmQsIGlmIGl0CisJCSAqIGRvZXMsIGxvb2sgZm9yIHRoZSBieXRlLW9yZGVyIG1hZ2ljIG51bWJlciBpbgorCQkgKiB0aGUgYXBwcm9wcmlhdGUgcGxhY2UgYW5kLCBpZiB3ZSBmaW5kIGl0LCByZXBvcnQKKwkJICogdGhpcyBhcyBwb3NzaWJseSBiZWluZyBhIHBjYXAtbmcgZmlsZSB0cmFuc2ZlcnJlZAorCQkgKiBiZXR3ZWVuIFVOKlggYW5kIFdpbmRvd3MgaW4gdGV4dCBmaWxlIGZvcm1hdD8KKwkJICovCisJCXJldHVybiAoMCk7CS8qIG5vcGUgKi8KKwl9CisKKwkvKgorCSAqIE9LLCB0aGV5IGFyZS4gIEhvd2V2ZXIsIHRoYXQncyBqdXN0IFxuXHJcclxuLCBzbyBpdCBjb3VsZCwKKwkgKiBjb25jZWl2YWJseSwgYmUgYW4gb3JkaW5hcnkgdGV4dCBmaWxlLgorCSAqCisJICogSXQgY291bGQgbm90LCBob3dldmVyLCBjb25jZWl2YWJseSBiZSBhbnkgb3RoZXIgdHlwZSBvZgorCSAqIGNhcHR1cmUgZmlsZSwgc28gd2UgY2FuIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIHB1dGF0aXZlCisJICogU2VjdGlvbiBIZWFkZXIgQmxvY2s7IHB1dCB0aGUgYmxvY2sgdHlwZSBpbiB0aGUgY29tbW9uCisJICogaGVhZGVyLCByZWFkIHRoZSByZXN0IG9mIHRoZSBjb21tb24gaGVhZGVyIGFuZCB0aGUKKwkgKiBmaXhlZC1sZW5ndGggcG9ydGlvbiBvZiB0aGUgU0hCLCBhbmQgbG9vayBmb3IgdGhlIGJ5dGUtb3JkZXIKKwkgKiBtYWdpYyB2YWx1ZS4KKwkgKi8KKwlhbXRfcmVhZCA9IGZyZWFkKCZ0b3RhbF9sZW5ndGgsIDEsIHNpemVvZih0b3RhbF9sZW5ndGgpLCBmcCk7CisJaWYgKGFtdF9yZWFkIDwgc2l6ZW9mKHRvdGFsX2xlbmd0aCkpIHsKKwkJaWYgKGZlcnJvcihmcCkpIHsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKC0xKTsJLyogZmFpbCAqLworCQl9CisKKwkJLyoKKwkJICogUG9zc2libHkgYSB3ZWlyZCBzaG9ydCB0ZXh0IGZpbGUsIHNvIGp1c3Qgc2F5CisJCSAqICJub3QgcGNhcC1uZyIuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KKwlhbXRfcmVhZCA9IGZyZWFkKCZieXRlX29yZGVyX21hZ2ljLCAxLCBzaXplb2YoYnl0ZV9vcmRlcl9tYWdpYyksIGZwKTsKKwlpZiAoYW10X3JlYWQgPCBzaXplb2YoYnl0ZV9vcmRlcl9tYWdpYykpIHsKKwkJaWYgKGZlcnJvcihmcCkpIHsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gKC0xKTsJLyogZmFpbCAqLworCQl9CisKKwkJLyoKKwkJICogUG9zc2libHkgYSB3ZWlyZCBzaG9ydCB0ZXh0IGZpbGUsIHNvIGp1c3Qgc2F5CisJCSAqICJub3QgcGNhcC1uZyIuCisJCSAqLworCQlyZXR1cm4gKDApOworCX0KKwlpZiAoYnl0ZV9vcmRlcl9tYWdpYyAhPSBCWVRFX09SREVSX01BR0lDKSB7CisJCWJ5dGVfb3JkZXJfbWFnaWMgPSBTV0FQTE9ORyhieXRlX29yZGVyX21hZ2ljKTsKKwkJaWYgKGJ5dGVfb3JkZXJfbWFnaWMgIT0gQllURV9PUkRFUl9NQUdJQykgeworCQkJLyoKKwkJCSAqIE5vdCBhIHBjYXAtbmcgZmlsZS4KKwkJCSAqLworCQkJcmV0dXJuICgwKTsKKwkJfQorCQlwLT5zZi5zd2FwcGVkID0gMTsKKwkJdG90YWxfbGVuZ3RoID0gU1dBUExPTkcodG90YWxfbGVuZ3RoKTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoZSBzYW5pdHkgb2YgdGhlIHRvdGFsIGxlbmd0aC4KKwkgKi8KKwlpZiAodG90YWxfbGVuZ3RoIDwgc2l6ZW9mKCpiaGRycCkgKyBzaXplb2YoKnNoYnApICsgc2l6ZW9mKHN0cnVjdCBibG9ja190cmFpbGVyKSkgeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiU2VjdGlvbiBIZWFkZXIgQmxvY2sgaW4gcGNhcC1uZyBkdW1wIGZpbGUgaGFzIGEgbGVuZ3RoIG9mICV1IDwgJWx1IiwKKwkJICAgIHRvdGFsX2xlbmd0aCwKKwkJICAgICh1bnNpZ25lZCBsb25nKShzaXplb2YoKmJoZHJwKSArIHNpemVvZigqc2hicCkgKyBzaXplb2Yoc3RydWN0IGJsb2NrX3RyYWlsZXIpKSk7CisJCXJldHVybiAoLTEpOworCX0KKworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgaW50byB3aGljaCB0byByZWFkIGJsb2Nrcy4gIFdlIGRlZmF1bHQgdG8KKwkgKiB0aGUgbWF4aW11bSBvZjoKKwkgKgorCSAqCXRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIFNIQiBmb3Igd2hpY2ggd2UgcmVhZCB0aGUgaGVhZGVyOworCSAqCisJICoJMkssIHdoaWNoIHNob3VsZCBiZSBtb3JlIHRoYW4gbGFyZ2UgZW5vdWdoIGZvciBhbiBFbmhhbmNlZAorCSAqCVBhY2tldCBCbG9jayBjb250YWluaW5nIGEgZnVsbC1zaXplIEV0aGVybmV0IGZyYW1lLCBhbmQKKwkgKglsZWF2aW5nIHJvb20gZm9yIHNvbWUgb3B0aW9ucy4KKwkgKgorCSAqIElmIHdlIGZpbmQgYSBiaWdnZXIgYmxvY2ssIHdlIHJlYWxsb2NhdGUgdGhlIGJ1ZmZlci4KKwkgKi8KKwlwLT5idWZzaXplID0gMjA0ODsKKwlpZiAocC0+YnVmc2l6ZSA8IHRvdGFsX2xlbmd0aCkKKwkJcC0+YnVmc2l6ZSA9IHRvdGFsX2xlbmd0aDsKKwlwLT5idWZmZXIgPSBtYWxsb2MocC0+YnVmc2l6ZSk7CisJaWYgKHAtPmJ1ZmZlciA9PSBOVUxMKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwgIm91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuICgtMSk7CisJfQorCisJLyoKKwkgKiBDb3B5IHRoZSBzdHVmZiB3ZSd2ZSByZWFkIHRvIHRoZSBidWZmZXIsIGFuZCByZWFkIHRoZSByZXN0CisJICogb2YgdGhlIFNIQi4KKwkgKi8KKwliaGRycCA9IChzdHJ1Y3QgYmxvY2tfaGVhZGVyICopcC0+YnVmZmVyOworCXNoYnAgPSAoc3RydWN0IHNlY3Rpb25faGVhZGVyX2Jsb2NrICopKHAtPmJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgYmxvY2tfaGVhZGVyKSk7CisJYmhkcnAtPmJsb2NrX3R5cGUgPSBtYWdpYzsKKwliaGRycC0+dG90YWxfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOworCXNoYnAtPmJ5dGVfb3JkZXJfbWFnaWMgPSBieXRlX29yZGVyX21hZ2ljOworCWlmIChyZWFkX2J5dGVzKGZwLAorCSAgICBwLT5idWZmZXIgKyAoc2l6ZW9mKG1hZ2ljKSArIHNpemVvZih0b3RhbF9sZW5ndGgpICsgc2l6ZW9mKGJ5dGVfb3JkZXJfbWFnaWMpKSwKKwkgICAgdG90YWxfbGVuZ3RoIC0gKHNpemVvZihtYWdpYykgKyBzaXplb2YodG90YWxfbGVuZ3RoKSArIHNpemVvZihieXRlX29yZGVyX21hZ2ljKSksCisJICAgIDEsIGVycmJ1ZikgPT0gLTEpCisJCWdvdG8gZmFpbDsKKworCWlmIChwLT5zZi5zd2FwcGVkKSB7CisJCS8qCisJCSAqIEJ5dGUtc3dhcCB0aGUgZmllbGRzIHdlJ3ZlIHJlYWQuCisJCSAqLworCQlzaGJwLT5tYWpvcl92ZXJzaW9uID0gU1dBUFNIT1JUKHNoYnAtPm1ham9yX3ZlcnNpb24pOworCQlzaGJwLT5taW5vcl92ZXJzaW9uID0gU1dBUFNIT1JUKHNoYnAtPm1pbm9yX3ZlcnNpb24pOworCisJCS8qCisJCSAqIFhYWCAtIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHNlY3Rpb24gbGVuZ3RoLgorCQkgKi8KKwl9CisJaWYgKHNoYnAtPm1ham9yX3ZlcnNpb24gIT0gUENBUF9OR19WRVJTSU9OX01BSk9SKSB7CisJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJ1bmtub3duIHBjYXAtbmcgc2F2ZWZpbGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgJXUiLAorCQkgICAgc2hicC0+bWFqb3JfdmVyc2lvbik7CisJCWdvdG8gZmFpbDsKKwl9CisJcC0+c2YudmVyc2lvbl9tYWpvciA9IHNoYnAtPm1ham9yX3ZlcnNpb247CisJcC0+c2YudmVyc2lvbl9taW5vciA9IHNoYnAtPm1pbm9yX3ZlcnNpb247CisKKwkvKgorCSAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHN0YW1wIHJlc29sdXRpb24gYW5kIG9mZnNldC4KKwkgKi8KKwlwLT5zZi50c3Jlc29sID0gMTAwMDAwMDsJLyogbWljcm9zZWNvbmQgcmVzb2x1dGlvbiAqLworCXAtPnNmLnRzc2NhbGUgPSAxOwkJLyogbXVsdGlwbHkgYnkgMSB0byBzY2FsZSB0byBtaWNyb3NlY29uZHMgKi8KKwlwLT5zZi50c29mZnNldCA9IDA7CQkvKiBhYnNvbHV0ZSB0aW1lc3RhbXBzICovCisKKwkvKgorCSAqIE5vdyBzdGFydCBsb29raW5nIGZvciBhbiBJbnRlcmZhY2UgRGVzY3JpcHRpb24gQmxvY2suCisJICovCisJZm9yICg7OykgeworCQkvKgorCQkgKiBSZWFkIHRoZSBuZXh0IGJsb2NrLgorCQkgKi8KKwkJc3RhdHVzID0gcmVhZF9ibG9jayhmcCwgcCwgJmN1cnNvciwgZXJyYnVmKTsKKwkJaWYgKHN0YXR1cyA9PSAwKSB7CisJCQkvKiBFT0YgLSBubyBJREIgaW4gdGhpcyBmaWxlICovCisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgInRoZSBjYXB0dXJlIGZpbGUgaGFzIG5vIEludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9ja3MiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpZiAoc3RhdHVzID09IC0xKQorCQkJZ290byBmYWlsOwkvKiBlcnJvciAqLworCQlzd2l0Y2ggKGN1cnNvci5ibG9ja190eXBlKSB7CisKKwkJY2FzZSBCVF9JREI6CisJCQkvKgorCQkJICogR2V0IGEgcG9pbnRlciB0byB0aGUgZml4ZWQtbGVuZ3RoIHBvcnRpb24gb2YgdGhlCisJCQkgKiBJREIuCisJCQkgKi8KKwkJCWlkYnAgPSBnZXRfZnJvbV9ibG9ja19kYXRhKCZjdXJzb3IsIHNpemVvZigqaWRicCksCisJCQkgICAgZXJyYnVmKTsKKwkJCWlmIChpZGJwID09IE5VTEwpCisJCQkJZ290byBmYWlsOwkvKiBlcnJvciAqLworCisJCQkvKgorCQkJICogQnl0ZS1zd2FwIGl0IGlmIG5lY2Vzc2FyeS4KKwkJCSAqLworCQkJaWYgKHAtPnNmLnN3YXBwZWQpIHsKKwkJCQlpZGJwLT5saW5rdHlwZSA9IFNXQVBTSE9SVChpZGJwLT5saW5rdHlwZSk7CisJCQkJaWRicC0+c25hcGxlbiA9IFNXQVBMT05HKGlkYnAtPnNuYXBsZW4pOworCQkJfQorCisJCQkvKgorCQkJICogQ291bnQgdGhpcyBpbnRlcmZhY2UuCisJCQkgKi8KKwkJCXAtPnNmLmlmY291bnQrKzsKKworCQkJLyoKKwkJCSAqIE5vdyBsb29rIGZvciB2YXJpb3VzIHRpbWUgc3RhbXAgb3B0aW9ucywgc28KKwkJCSAqIHdlIGtub3cgaG93IHRvIGludGVycHJldCB0aGUgdGltZSBzdGFtcHMuCisJCQkgKi8KKwkJCWlmIChwcm9jZXNzX2lkYl9vcHRpb25zKHAsICZjdXJzb3IsICZwLT5zZi50c3Jlc29sLAorCQkJICAgICZwLT5zZi50c29mZnNldCwgZXJyYnVmKSA9PSAtMSkKKwkJCQlnb3RvIGZhaWw7CisKKwkJCS8qCisJCQkgKiBDb21wdXRlIHRoZSBzY2FsaW5nIGZhY3RvciB0byBjb252ZXJ0IHRoZQorCQkJICogc3ViLXNlY29uZCBwYXJ0IG9mIHRoZSB0aW1lIHN0YW1wIHRvCisJCQkgKiBtaWNyb3NlY29uZHMuCisJCQkgKi8KKwkJCWlmIChwLT5zZi50c3Jlc29sID4gMTAwMDAwMCkgeworCQkJCS8qCisJCQkJICogSGlnaGVyIHRoYW4gbWljcm9zZWNvbmQgcmVzb2x1dGlvbjsKKwkJCQkgKiBzY2FsZSBkb3duIHRvIG1pY3Jvc2Vjb25kcy4KKwkJCQkgKi8KKwkJCQlwLT5zZi50c3NjYWxlID0gKHAtPnNmLnRzcmVzb2wgLyAxMDAwMDAwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBMb3dlciB0aGFuIG1pY3Jvc2Vjb25kIHJlc29sdXRpb247CisJCQkJICogc2NhbGUgdXAgdG8gbWljcm9zZWNvbmRzLgorCQkJCSAqLworCQkJCXAtPnNmLnRzc2NhbGUgPSAoMTAwMDAwMCAvIHAtPnNmLnRzcmVzb2wpOworCQkJfQorCQkJZ290byBkb25lOworCisJCWNhc2UgQlRfRVBCOgorCQljYXNlIEJUX1NQQjoKKwkJY2FzZSBCVF9QQjoKKwkJCS8qCisJCQkgKiBTYXcgYSBwYWNrZXQgYmVmb3JlIHdlIHNhdyBhbnkgSURCcy4gIFRoYXQncworCQkJICogbm90IHZhbGlkLCBhcyB3ZSBkb24ndCBrbm93IHdoYXQgbGluay1sYXllcgorCQkJICogZW5jYXBzdWxhdGlvbiB0aGUgcGFja2V0IGhhcy4KKwkJCSAqLworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJICAgICJ0aGUgY2FwdHVyZSBmaWxlIGhhcyBhIHBhY2tldCBibG9jayBiZWZvcmUgYW55IEludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9ja3MiKTsKKwkJCWdvdG8gZmFpbDsKKworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIEp1c3QgaWdub3JlIGl0LgorCQkJICovCisJCQlicmVhazsKKwkJfQorCX0KKworZG9uZToKKwlwLT50em9mZiA9IDA7CS8qIFhYWCAtIG5vdCB1c2VkIGluIHBjYXAgKi8KKwlwLT5zbmFwc2hvdCA9IGlkYnAtPnNuYXBsZW47CisJcC0+bGlua3R5cGUgPSBsaW5rdHlwZV90b19kbHQoaWRicC0+bGlua3R5cGUpOworCXAtPmxpbmt0eXBlX2V4dCA9IDA7CisKKwlwLT5zZi5uZXh0X3BhY2tldF9vcCA9IHBjYXBfbmdfbmV4dF9wYWNrZXQ7CisKKwlyZXR1cm4gKDEpOworCitmYWlsOgorCWZyZWUocC0+YnVmZmVyKTsKKwlyZXR1cm4gKC0xKTsKK30KKworLyoKKyAqIFJlYWQgYW5kIHJldHVybiB0aGUgbmV4dCBwYWNrZXQgZnJvbSB0aGUgc2F2ZWZpbGUuICBSZXR1cm4gdGhlIGhlYWRlcgorICogaW4gaGRyIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGNvbnRlbnRzIGluIGRhdGEuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAxCisgKiBpZiB0aGVyZSB3ZXJlIG5vIG1vcmUgcGFja2V0cywgYW5kIC0xIG9uIGFuIGVycm9yLgorICovCitzdGF0aWMgaW50CitwY2FwX25nX25leHRfcGFja2V0KHBjYXBfdCAqcCwgc3RydWN0IHBjYXBfcGt0aGRyICpoZHIsIHVfY2hhciAqKmRhdGEpCit7CisJc3RydWN0IGJsb2NrX2N1cnNvciBjdXJzb3I7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgZW5oYW5jZWRfcGFja2V0X2Jsb2NrICplcGJwOworCXN0cnVjdCBzaW1wbGVfcGFja2V0X2Jsb2NrICpzcGJwOworCXN0cnVjdCBwYWNrZXRfYmxvY2sgKnBicDsKKwlicGZfdV9pbnQzMiBpbnRlcmZhY2VfaWQgPSAweEZGRkZGRkZGOworCXN0cnVjdCBpbnRlcmZhY2VfZGVzY3JpcHRpb25fYmxvY2sgKmlkYnA7CisJc3RydWN0IHNlY3Rpb25faGVhZGVyX2Jsb2NrICpzaGJwOworCUZJTEUgKmZwID0gcC0+c2YucmZpbGU7CisJdV9pbnQgdHNyZXNvbDsKKwl1X2ludDY0X3QgdHNvZmZzZXQ7CisJdV9pbnQ2NF90IHQsIHNlYywgZnJhYzsKKworCS8qCisJICogTG9vayBmb3IgYW4gRW5oYW5jZWQgUGFja2V0IEJsb2NrLCBhIFNpbXBsZSBQYWNrZXQgQmxvY2ssCisJICogb3IgYSBQYWNrZXQgQmxvY2suCisJICovCisJZm9yICg7OykgeworCQkvKgorCQkgKiBSZWFkIHRoZSBibG9jayB0eXBlIGFuZCBsZW5ndGg7IHRob3NlIGFyZSBjb21tb24KKwkJICogdG8gYWxsIGJsb2Nrcy4KKwkJICovCisJCXN0YXR1cyA9IHJlYWRfYmxvY2soZnAsIHAsICZjdXJzb3IsIHAtPmVycmJ1Zik7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCXJldHVybiAoMSk7CS8qIEVPRiAqLworCQlpZiAoc3RhdHVzID09IC0xKQorCQkJcmV0dXJuICgtMSk7CS8qIGVycm9yICovCisJCXN3aXRjaCAoY3Vyc29yLmJsb2NrX3R5cGUpIHsKKworCQljYXNlIEJUX0VQQjoKKwkJCS8qCisJCQkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBmaXhlZC1sZW5ndGggcG9ydGlvbiBvZiB0aGUKKwkJCSAqIEVQQi4KKwkJCSAqLworCQkJZXBicCA9IGdldF9mcm9tX2Jsb2NrX2RhdGEoJmN1cnNvciwgc2l6ZW9mKCplcGJwKSwKKwkJCSAgICBwLT5lcnJidWYpOworCQkJaWYgKGVwYnAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKC0xKTsJLyogZXJyb3IgKi8KKworCQkJLyoKKwkJCSAqIEJ5dGUtc3dhcCBpdCBpZiBuZWNlc3NhcnkuCisJCQkgKi8KKwkJCWlmIChwLT5zZi5zd2FwcGVkKSB7CisJCQkJLyogdGhlc2Ugd2VyZSB3cml0dGVuIGluIG9wcG9zaXRlIGJ5dGUgb3JkZXIgKi8KKwkJCQlpbnRlcmZhY2VfaWQgPSBTV0FQTE9ORyhlcGJwLT5pbnRlcmZhY2VfaWQpOworCQkJCWhkci0+Y2FwbGVuID0gU1dBUExPTkcoZXBicC0+Y2FwbGVuKTsKKwkJCQloZHItPmxlbiA9IFNXQVBMT05HKGVwYnAtPmxlbik7CisJCQkJdCA9ICgodV9pbnQ2NF90KVNXQVBMT05HKGVwYnAtPnRpbWVzdGFtcF9oaWdoKSkgPDwgMzIgfAorCQkJCSAgICBTV0FQTE9ORyhlcGJwLT50aW1lc3RhbXBfbG93KTsKKwkJCX0gZWxzZSB7CisJCQkJaW50ZXJmYWNlX2lkID0gZXBicC0+aW50ZXJmYWNlX2lkOworCQkJCWhkci0+Y2FwbGVuID0gZXBicC0+Y2FwbGVuOworCQkJCWhkci0+bGVuID0gZXBicC0+bGVuOworCQkJCXQgPSAoKHVfaW50NjRfdCllcGJwLT50aW1lc3RhbXBfaGlnaCkgPDwgMzIgfAorCQkJCSAgICBlcGJwLT50aW1lc3RhbXBfbG93OworCQkJfQorCQkJZ290byBmb3VuZDsKKwkJCQorCQljYXNlIEJUX1NQQjoKKwkJCS8qCisJCQkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBmaXhlZC1sZW5ndGggcG9ydGlvbiBvZiB0aGUKKwkJCSAqIFNQQi4KKwkJCSAqLworCQkJc3BicCA9IGdldF9mcm9tX2Jsb2NrX2RhdGEoJmN1cnNvciwgc2l6ZW9mKCpzcGJwKSwKKwkJCSAgICBwLT5lcnJidWYpOworCQkJaWYgKHNwYnAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKC0xKTsJLyogZXJyb3IgKi8KKworCQkJLyoKKwkJCSAqIFNQQiBwYWNrZXRzIGFyZSBhc3N1bWVkIHRvIGhhdmUgYXJyaXZlZCBvbgorCQkJICogdGhlIGZpcnN0IGludGVyZmFjZS4KKwkJCSAqLworCQkJaW50ZXJmYWNlX2lkID0gMDsKKworCQkJLyoKKwkJCSAqIEJ5dGUtc3dhcCBpdCBpZiBuZWNlc3NhcnkuCisJCQkgKi8KKwkJCWlmIChwLT5zZi5zd2FwcGVkKSB7CisJCQkJLyogdGhlc2Ugd2VyZSB3cml0dGVuIGluIG9wcG9zaXRlIGJ5dGUgb3JkZXIgKi8KKwkJCQloZHItPmxlbiA9IFNXQVBMT05HKHNwYnAtPmxlbik7CisJCQl9IGVsc2UKKwkJCQloZHItPmxlbiA9IHNwYnAtPmxlbjsKKworCQkJLyoKKwkJCSAqIFRoZSBTUEIgZG9lc24ndCBnaXZlIHRoZSBjYXB0dXJlZCBsZW5ndGg7CisJCQkgKiBpdCdzIHRoZSBtaW5pbXVtIG9mIHRoZSBzbmFwc2hvdCBsZW5ndGgKKwkJCSAqIGFuZCB0aGUgcGFja2V0IGxlbmd0aC4KKwkJCSAqLworCQkJaGRyLT5jYXBsZW4gPSBoZHItPmxlbjsKKwkJCWlmIChoZHItPmNhcGxlbiA+IHAtPnNuYXBzaG90KQorCQkJCWhkci0+Y2FwbGVuID0gcC0+c25hcHNob3Q7CisJCQl0ID0gMDsJLyogbm8gdGltZSBzdGFtcHMgKi8KKwkJCWdvdG8gZm91bmQ7CisKKwkJY2FzZSBCVF9QQjoKKwkJCS8qCisJCQkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBmaXhlZC1sZW5ndGggcG9ydGlvbiBvZiB0aGUKKwkJCSAqIFBCLgorCQkJICovCisJCQlwYnAgPSBnZXRfZnJvbV9ibG9ja19kYXRhKCZjdXJzb3IsIHNpemVvZigqcGJwKSwKKwkJCSAgICBwLT5lcnJidWYpOworCQkJaWYgKHBicCA9PSBOVUxMKQorCQkJCXJldHVybiAoLTEpOwkvKiBlcnJvciAqLworCisJCQkvKgorCQkJICogQnl0ZS1zd2FwIGl0IGlmIG5lY2Vzc2FyeS4KKwkJCSAqLworCQkJaWYgKHAtPnNmLnN3YXBwZWQpIHsKKwkJCQkvKiB0aGVzZSB3ZXJlIHdyaXR0ZW4gaW4gb3Bwb3NpdGUgYnl0ZSBvcmRlciAqLworCQkJCWludGVyZmFjZV9pZCA9IFNXQVBTSE9SVChwYnAtPmludGVyZmFjZV9pZCk7CisJCQkJaGRyLT5jYXBsZW4gPSBTV0FQTE9ORyhwYnAtPmNhcGxlbik7CisJCQkJaGRyLT5sZW4gPSBTV0FQTE9ORyhwYnAtPmxlbik7CisJCQkJdCA9ICgodV9pbnQ2NF90KVNXQVBMT05HKHBicC0+dGltZXN0YW1wX2hpZ2gpKSA8PCAzMiB8CisJCQkJICAgIFNXQVBMT05HKHBicC0+dGltZXN0YW1wX2xvdyk7CisJCQl9IGVsc2UgeworCQkJCWludGVyZmFjZV9pZCA9IHBicC0+aW50ZXJmYWNlX2lkOworCQkJCWhkci0+Y2FwbGVuID0gcGJwLT5jYXBsZW47CisJCQkJaGRyLT5sZW4gPSBwYnAtPmxlbjsKKwkJCQl0ID0gKCh1X2ludDY0X3QpcGJwLT50aW1lc3RhbXBfaGlnaCkgPDwgMzIgfAorCQkJCSAgICBwYnAtPnRpbWVzdGFtcF9sb3c7CisJCQl9CisJCQlnb3RvIGZvdW5kOworCisJCWNhc2UgQlRfSURCOgorCQkJLyoKKwkJCSAqIEludGVyZmFjZSBEZXNjcmlwdGlvbiBCbG9jay4gIEdldCBhIHBvaW50ZXIKKwkJCSAqIHRvIGl0cyBmaXhlZC1sZW5ndGggcG9ydGlvbi4KKwkJCSAqLworCQkJaWRicCA9IGdldF9mcm9tX2Jsb2NrX2RhdGEoJmN1cnNvciwgc2l6ZW9mKCppZGJwKSwKKwkJCSAgICBwLT5lcnJidWYpOworCQkJaWYgKGlkYnAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKC0xKTsJLyogZXJyb3IgKi8KKworCQkJLyoKKwkJCSAqIEJ5dGUtc3dhcCBpdCBpZiBuZWNlc3NhcnkuCisJCQkgKi8KKwkJCWlmIChwLT5zZi5zd2FwcGVkKSB7CisJCQkJaWRicC0+bGlua3R5cGUgPSBTV0FQU0hPUlQoaWRicC0+bGlua3R5cGUpOworCQkJCWlkYnAtPnNuYXBsZW4gPSBTV0FQTE9ORyhpZGJwLT5zbmFwbGVuKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIElmIHRoZSBsaW5rLWxheWVyIHR5cGUgb3Igc25hcHNob3QgbGVuZ3RoCisJCQkgKiBkaWZmZXIgZnJvbSB0aGUgb25lcyBmb3IgdGhlIGZpcnN0IElEQiB3ZQorCQkJICogc2F3LCBxdWl0LgorCQkJICoKKwkJCSAqIFhYWCAtIGp1c3QgZGlzY2FyZCBwYWNrZXRzIGZyb20gdGhvc2UKKwkJCSAqIGludGVyZmFjZXM/CisJCQkgKi8KKwkJCWlmIChwLT5saW5rdHlwZSAhPSBpZGJwLT5saW5rdHlwZSkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgImFuIGludGVyZmFjZSBoYXMgYSB0eXBlICV1IGRpZmZlcmVudCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBpbnRlcmZhY2UiLAorCQkJCSAgICBpZGJwLT5saW5rdHlwZSk7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlpZiAocC0+c25hcHNob3QgIT0gaWRicC0+c25hcGxlbikgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgImFuIGludGVyZmFjZSBoYXMgYSBzbmFwc2hvdCBsZW5ndGggJXUgZGlmZmVyZW50IGZyb20gdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGludGVyZmFjZSIsCisJCQkJICAgIGlkYnAtPnNuYXBsZW4pOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCisJCQkvKgorCQkJICogQ291bnQgdGhpcyBpbnRlcmZhY2UuCisJCQkgKi8KKwkJCXAtPnNmLmlmY291bnQrKzsKKworCQkJLyoKKwkJCSAqIFNldCB0aGUgZGVmYXVsdCB0aW1lIHN0YW1wIHJlc29sdXRpb24gYW5kIG9mZnNldC4KKwkJCSAqLworCQkJdHNyZXNvbCA9IDEwMDAwMDA7CS8qIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24gKi8KKwkJCXRzb2Zmc2V0ID0gMDsJCS8qIGFic29sdXRlIHRpbWVzdGFtcHMgKi8KKworCQkJLyoKKwkJCSAqIE5vdyBsb29rIGZvciB2YXJpb3VzIHRpbWUgc3RhbXAgb3B0aW9ucywgdG8KKwkJCSAqIG1ha2Ugc3VyZSB0aGV5J3JlIHRoZSBzYW1lLgorCQkJICoKKwkJCSAqIFhYWCAtIHdlIGNvdWxkLCBpbiB0aGVvcnksIGhhbmRsZSBtdWx0aXBsZQorCQkJICogZGlmZmVyZW50IHJlc29sdXRpb25zIGFuZCBvZmZzZXRzLCBidXQgd2UKKwkJCSAqIGRvbid0IGRvIHNvIGZvciBub3cuCisJCQkgKi8KKwkJCWlmIChwcm9jZXNzX2lkYl9vcHRpb25zKHAsICZjdXJzb3IsICZ0c3Jlc29sLCAmdHNvZmZzZXQsCisJCQkgICAgcC0+ZXJyYnVmKSA9PSAtMSkKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCWlmICh0c3Jlc29sICE9IHAtPnNmLnRzcmVzb2wpIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJhbiBpbnRlcmZhY2UgaGFzIGEgdGltZSBzdGFtcCByZXNvbHV0aW9uIGRpZmZlcmVudCBmcm9tIHRoZSB0aW1lIHN0YW1wIHJlc29sdXRpb24gb2YgdGhlIGZpcnN0IGludGVyZmFjZSIpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJaWYgKHRzb2Zmc2V0ICE9IHAtPnNmLnRzb2Zmc2V0KSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiYW4gaW50ZXJmYWNlIGhhcyBhIHRpbWUgc3RhbXAgb2Zmc2V0IGRpZmZlcmVudCBmcm9tIHRoZSB0aW1lIHN0YW1wIG9mZnNldCBvZiB0aGUgZmlyc3QgaW50ZXJmYWNlIik7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEJUX1NIQjoKKwkJCS8qCisJCQkgKiBTZWN0aW9uIEhlYWRlciBCbG9jay4gIEdldCBhIHBvaW50ZXIKKwkJCSAqIHRvIGl0cyBmaXhlZC1sZW5ndGggcG9ydGlvbi4KKwkJCSAqLworCQkJc2hicCA9IGdldF9mcm9tX2Jsb2NrX2RhdGEoJmN1cnNvciwgc2l6ZW9mKCpzaGJwKSwKKwkJCSAgICBwLT5lcnJidWYpOworCQkJaWYgKHNoYnAgPT0gTlVMTCkKKwkJCQlyZXR1cm4gKC0xKTsJLyogZXJyb3IgKi8KKworCQkJLyoKKwkJCSAqIEFzc3VtZSB0aGUgYnl0ZSBvcmRlciBvZiB0aGlzIHNlY3Rpb24gaXMKKwkJCSAqIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIHByZXZpb3VzIHNlY3Rpb24uCisJCQkgKiBXZSdsbCBjaGVjayBmb3IgdGhhdCBsYXRlci4KKwkJCSAqLworCQkJaWYgKHAtPnNmLnN3YXBwZWQpIHsKKwkJCQlzaGJwLT5ieXRlX29yZGVyX21hZ2ljID0KKwkJCQkgICAgU1dBUExPTkcoc2hicC0+Ynl0ZV9vcmRlcl9tYWdpYyk7CisJCQkJc2hicC0+bWFqb3JfdmVyc2lvbiA9CisJCQkJICAgIFNXQVBTSE9SVChzaGJwLT5tYWpvcl92ZXJzaW9uKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSB0aGUgYnl0ZSBvcmRlciBkb2Vzbid0IGNoYW5nZTsKKwkJCSAqIHBjYXBfaXNfc3dhcHBlZCgpIHNob3VsZG4ndCBjaGFuZ2UgaXRzCisJCQkgKiByZXR1cm4gdmFsdWUgaW4gdGhlIG1pZGRsZSBvZiByZWFkaW5nIGEgY2FwdHVyZS4KKwkJCSAqLworCQkJc3dpdGNoIChzaGJwLT5ieXRlX29yZGVyX21hZ2ljKSB7CisKKwkJCWNhc2UgQllURV9PUkRFUl9NQUdJQzoKKwkJCQkvKgorCQkJCSAqIE9LLgorCQkJCSAqLworCQkJCWJyZWFrOworCisJCQljYXNlIFNXQVBMT05HKEJZVEVfT1JERVJfTUFHSUMpOgorCQkJCS8qCisJCQkJICogQnl0ZSBvcmRlciBjaGFuZ2VzLgorCQkJCSAqLworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgInRoZSBmaWxlIGhhcyBzZWN0aW9ucyB3aXRoIGRpZmZlcmVudCBieXRlIG9yZGVycyIpOworCQkJCXJldHVybiAoLTEpOworCisJCQlkZWZhdWx0OgorCQkJCS8qCisJCQkJICogTm90IGEgdmFsaWQgU0hCLgorCQkJCSAqLworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgInRoZSBmaWxlIGhhcyBhIHNlY3Rpb24gd2l0aCBhIGJhZCBieXRlIG9yZGVyIG1hZ2ljIGZpZWxkIik7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgdGhlIG1ham9yIHZlcnNpb24gaXMgdGhlIHZlcnNpb24KKwkJCSAqIHdlIGhhbmRsZS4KKwkJCSAqLworCQkJaWYgKHNoYnAtPm1ham9yX3ZlcnNpb24gIT0gUENBUF9OR19WRVJTSU9OX01BSk9SKSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAidW5rbm93biBwY2FwLW5nIHNhdmVmaWxlIG1ham9yIHZlcnNpb24gbnVtYmVyICV1IiwKKwkJCQkgICAgc2hicC0+bWFqb3JfdmVyc2lvbik7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBSZXNldCB0aGUgaW50ZXJmYWNlIGNvdW50OyB0aGlzIHNlY3Rpb24gc2hvdWxkCisJCQkgKiBoYXZlIGl0cyBvd24gc2V0IG9mIElEQnMuICBJZiBhbnkgb2YgdGhlbQorCQkJICogZG9uJ3QgaGF2ZSB0aGUgc2FtZSBpbnRlcmZhY2UgdHlwZSwgc25hcHNob3QKKwkJCSAqIGxlbmd0aCwgb3IgcmVzb2x1dGlvbiBhcyB0aGUgZmlyc3QgaW50ZXJmYWNlCisJCQkgKiB3ZSBzYXcsIHdlJ2xsIGZhaWwuICAoQW5kIGlmIHdlIGRvbid0IHNlZQorCQkJICogYW55IElEQnMsIHdlJ2xsIGZhaWwgd2hlbiB3ZSBzZWUgYSBwYWNrZXQKKwkJCSAqIGJsb2NrLikKKwkJCSAqLworCQkJcC0+c2YuaWZjb3VudCA9IDA7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyoKKwkJCSAqIE5vdCBhIHBhY2tldCBibG9jaywgSURCLCBvciBTSEI7IGlnbm9yZSBpdC4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0JCSAKKwl9CisKK2ZvdW5kOgorCS8qCisJICogSXMgdGhlIGludGVyZmFjZSBJRCBhbiBpbnRlcmZhY2Ugd2Uga25vdz8KKwkgKi8KKwlpZiAoaW50ZXJmYWNlX2lkID49IHAtPnNmLmlmY291bnQpIHsKKwkJLyoKKwkJICogWWVzLiAgRmFpbC4KKwkJICovCisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICJhIHBhY2tldCBhcnJpdmVkIG9uIGludGVyZmFjZSAldSwgYnV0IHRoZXJlJ3Mgbm8gSW50ZXJmYWNlIERlc2NyaXB0aW9uIEJsb2NrIGZvciB0aGF0IGludGVyZmFjZSIsCisJCSAgICBpbnRlcmZhY2VfaWQpOworCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIENvbnZlcnQgdGhlIHRpbWUgc3RhbXAgdG8gYSBzdHJ1Y3QgdGltZXZhbC4KKwkgKi8KKwlzZWMgPSB0IC8gcC0+c2YudHNyZXNvbCArIHAtPnNmLnRzb2Zmc2V0OworCWZyYWMgPSB0ICUgcC0+c2YudHNyZXNvbDsKKwlpZiAocC0+c2YudHNyZXNvbCA+IDEwMDAwMDApIHsKKwkJLyoKKwkJICogSGlnaGVyIHRoYW4gbWljcm9zZWNvbmQgcmVzb2x1dGlvbjsgc2NhbGUgZG93biB0bworCQkgKiBtaWNyb3NlY29uZHMuCisJCSAqLworCQlmcmFjIC89IHAtPnNmLnRzc2NhbGU7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTG93ZXIgdGhhbiBtaWNyb3NlY29uZCByZXNvbHV0aW9uOyBzY2FsZSB1cCB0bworCQkgKiBtaWNyb3NlY29uZHMuCisJCSAqLworCQlmcmFjICo9IHAtPnNmLnRzc2NhbGU7CisJfQorCWhkci0+dHMudHZfc2VjID0gc2VjOworCWhkci0+dHMudHZfdXNlYyA9IGZyYWM7CisKKwkvKgorCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIHBhY2tldCBkYXRhLgorCSAqLworCSpkYXRhID0gZ2V0X2Zyb21fYmxvY2tfZGF0YSgmY3Vyc29yLCBoZHItPmNhcGxlbiwgcC0+ZXJyYnVmKTsKKwlpZiAoKmRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuICgtMSk7CisKKwlpZiAocC0+c2Yuc3dhcHBlZCkgeworCQkvKgorCQkgKiBDb252ZXJ0IHBzZXVkby1oZWFkZXJzIGZyb20gdGhlIGJ5dGUgb3JkZXIgb2YKKwkJICogdGhlIGhvc3Qgb24gd2hpY2ggdGhlIGZpbGUgd2FzIHNhdmVkIHRvIG91cgorCQkgKiBieXRlIG9yZGVyLCBhcyBuZWNlc3NhcnkuCisJCSAqLworCQlzd2l0Y2ggKHAtPmxpbmt0eXBlKSB7CisKKwkJY2FzZSBETFRfVVNCX0xJTlVYOgorCQkJc3dhcF9saW51eF91c2JfaGVhZGVyKGhkciwgKmRhdGEsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBETFRfVVNCX0xJTlVYX01NQVBQRUQ6CisJCQlzd2FwX2xpbnV4X3VzYl9oZWFkZXIoaGRyLCAqZGF0YSwgMSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAoMCk7Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3NmLXBjYXAtbmcuaCBiL2xpYnBjYXAtMS4zLjAvc2YtcGNhcC1uZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTUxODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3NmLXBjYXAtbmcuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3CisgKglUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0OiAoMSkgc291cmNlIGNvZGUgZGlzdHJpYnV0aW9ucworICogcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHksICgyKQorICogZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgYmluYXJ5IGNvZGUgaW5jbHVkZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQKKyAqIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvciBvdGhlciBtYXRlcmlhbHMKKyAqIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiwgYW5kICgzKSBhbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcKKyAqIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CisgKiBgYFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSwKKyAqIExhd3JlbmNlIEJlcmtlbGV5IExhYm9yYXRvcnkgYW5kIGl0cyBjb250cmlidXRvcnMuJycgTmVpdGhlciB0aGUgbmFtZSBvZgorICogdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2UKKyAqIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogd3JpdHRlbiBwZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogc2YtcGNhcC1uZy5oIC0gcGNhcC1uZy1maWxlLWZvcm1hdC1zcGVjaWZpYyByb3V0aW5lcworICoKKyAqIFVzZWQgdG8gcmVhZCBwY2FwLW5nIHNhdmVmaWxlcy4KKyAqLworCisjaWZuZGVmIHNmX3BjYXBfbmdfaAorI2RlZmluZQlzZl9wY2FwX25nX2gKKworZXh0ZXJuIGludCBwY2FwX25nX2NoZWNrX2hlYWRlcihwY2FwX3QgKiwgYnBmX3VfaW50MzIsIEZJTEUgKiwgY2hhciAqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3NmLXBjYXAuYyBiL2xpYnBjYXAtMS4zLjAvc2YtcGNhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMzFhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3NmLXBjYXAuYwpAQCAtMCwwICsxLDYxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIHNmLXBjYXAuYyAtIGxpYnBjYXAtZmlsZS1mb3JtYXQtc3BlY2lmaWMgY29kZSBmcm9tIHNhdmVmaWxlLmMKKyAqCUV4dHJhY3Rpb24vY3JlYXRpb24gYnkgSmVmZnJleSBNb2d1bCwgREVDV1JMCisgKglNb2RpZmllZCBieSBTdGV2ZSBNY0Nhbm5lLCBMQkwuCisgKgorICogVXNlZCB0byBzYXZlIHRoZSByZWNlaXZlZCBwYWNrZXQgaGVhZGVycywgYWZ0ZXIgZmlsdGVyaW5nLCB0bworICogYSBmaWxlLCBhbmQgdGhlbiByZWFkIHRoZW0gbGF0ZXIuCisgKiBUaGUgZmlyc3QgcmVjb3JkIGluIHRoZSBmaWxlIGNvbnRhaW5zIHNhdmVkIHZhbHVlcyBmb3IgdGhlIG1hY2hpbmUKKyAqIGRlcGVuZGVudCB2YWx1ZXMgc28gd2UgY2FuIHByaW50IHRoZSBkdW1wIGZpbGUgb24gYW55IGFyY2hpdGVjdHVyZS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyJCAoTEJMKSI7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJjb25maWcuaCIKKyNlbmRpZgorCisjaWZkZWYgV0lOMzIKKyNpbmNsdWRlIDxwY2FwLXN0ZGluYy5oPgorI2Vsc2UgLyogV0lOMzIgKi8KKyNpZiBIQVZFX0lOVFRZUEVTX0gKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2VsaWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaWZkZWYgSEFWRV9TWVNfQklUWVBFU19ICisjaW5jbHVkZSA8c3lzL2JpdHlwZXMuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIFdJTjMyICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJwY2FwLWludC5oIgorCisjaW5jbHVkZSAicGNhcC1jb21tb24uaCIKKworI2lmZGVmIEhBVkVfT1NfUFJPVE9fSAorI2luY2x1ZGUgIm9zLXByb3RvLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNmLXBjYXAuaCIKKworLyoKKyAqIFNldHRpbmcgT19CSU5BUlkgb24gRE9TL1dpbmRvd3MgaXMgYSBiaXQgdHJpY2t5CisgKi8KKyNpZiBkZWZpbmVkKFdJTjMyKQorICAjZGVmaW5lIFNFVF9CSU5NT0RFKGYpICBfc2V0bW9kZShfZmlsZW5vKGYpLCBfT19CSU5BUlkpCisjZWxpZiBkZWZpbmVkKE1TRE9TKQorICAjaWYgZGVmaW5lZChfX0hJR0hDX18pCisgICNkZWZpbmUgU0VUX0JJTk1PREUoZikgIHNldG1vZGUoZiwgT19CSU5BUlkpCisgICNlbHNlCisgICNkZWZpbmUgU0VUX0JJTk1PREUoZikgIHNldG1vZGUoZmlsZW5vKGYpLCBPX0JJTkFSWSkKKyAgI2VuZGlmCisjZW5kaWYKKworLyoKKyAqIFN0YW5kYXJkIGxpYnBjYXAgZm9ybWF0LgorICovCisjZGVmaW5lIFRDUERVTVBfTUFHSUMJCTB4YTFiMmMzZDQKKworLyoKKyAqIEFsZXhleSBLdXpuZXR6b3YncyBtb2RpZmllZCBsaWJwY2FwIGZvcm1hdC4KKyAqLworI2RlZmluZSBLVVpORVRaT1ZfVENQRFVNUF9NQUdJQwkweGExYjJjZDM0CisKKy8qCisgKiBSZXNlcnZlZCBmb3IgRnJhbmNpc2NvIE1lc3F1aXRhIDxmcmFuY2lzY28ubWVzcXVpdGFAcmFkaW9tb3ZlbC5wdD4KKyAqIGZvciBhbm90aGVyIG1vZGlmaWVkIGZvcm1hdC4KKyAqLworI2RlZmluZSBGTUVTUVVJVEFfVENQRFVNUF9NQUdJQwkweGExYjIzNGNkCisKKy8qCisgKiBOYXZ0ZWwgQ29tbXVuY2F0aW9ucycgZm9ybWF0LCB3aXRoIG5hbm9zZWNvbmQgdGltZXN0YW1wcywKKyAqIGFzIHBlciBhIHJlcXVlc3QgZnJvbSBEdW1hcyBId2FuZyA8ZHVtYXMuaHdhbmdAbmF2dGVsY29tLmNvbT4uCisgKi8KKyNkZWZpbmUgTkFWVEVMX1RDUERVTVBfTUFHSUMJMHhhMTJiM2M0ZAorCisvKgorICogTm9ybWFsIGxpYnBjYXAgZm9ybWF0LCBleGNlcHQgZm9yIHNlY29uZHMvbmFub3NlY29uZHMgdGltZXN0YW1wcywKKyAqIGFzIHBlciBhIHJlcXVlc3QgYnkgVWxmIExhbXBpbmcgPHVsZi5sYW1waW5nQHdlYi5kZT4KKyAqLworI2RlZmluZSBOU0VDX1RDUERVTVBfTUFHSUMJMHhhMWIyM2M0ZAorCisvKgorICogTWVjaGFuaXNtIGZvciBzdG9yaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgY2FwdHVyZSBpbiB0aGUgdXBwZXIKKyAqIDYgYml0cyBvZiBhIGxpbmt0eXBlIHZhbHVlIGluIGEgY2FwdHVyZSBmaWxlLgorICoKKyAqIExUX0xJTktUWVBFX0VYVCh4KSBleHRyYWN0cyB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgZm9yIGEgdmFsdWUgZGVzY3JpYmluZyB0aGUgbGluay1sYXllcgorICogdmFsdWUuICBMVF9MSU5LVFlQRSh4KSBleHRyYWN0cyB0aGF0IHZhbHVlLgorICovCisjZGVmaW5lIExUX0xJTktUWVBFKHgpCQkoKHgpICYgMHgwM0ZGRkZGRikKKyNkZWZpbmUgTFRfTElOS1RZUEVfRVhUKHgpCSgoeCkgJiAweEZDMDAwMDAwKQorCitzdGF0aWMgaW50IHBjYXBfbmV4dF9wYWNrZXQocGNhcF90ICpwLCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmhkciwgdV9jaGFyICoqZGF0YXApOworCisvKgorICogQ2hlY2sgd2hldGhlciB0aGlzIGlzIGEgcGNhcCBzYXZlZmlsZSBhbmQsIGlmIGl0IGlzLCBleHRyYWN0IHRoZQorICogcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgaGVhZGVyLgorICovCitpbnQKK3BjYXBfY2hlY2tfaGVhZGVyKHBjYXBfdCAqcCwgYnBmX3VfaW50MzIgbWFnaWMsIEZJTEUgKmZwLCBjaGFyICplcnJidWYpCit7CisJc3RydWN0IHBjYXBfZmlsZV9oZWFkZXIgaGRyOworCXNpemVfdCBhbXRfcmVhZDsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0aGUgZmlyc3QgNCBieXRlcyBvZiB0aGUgZmlsZSBhcmUgdGhlIG1hZ2ljCisJICogbnVtYmVyIGZvciBhIHBjYXAgc2F2ZWZpbGUsIG9yIGZvciBhIGJ5dGUtc3dhcHBlZCBwY2FwCisJICogc2F2ZWZpbGUuCisJICovCisJaWYgKG1hZ2ljICE9IFRDUERVTVBfTUFHSUMgJiYgbWFnaWMgIT0gS1VaTkVUWk9WX1RDUERVTVBfTUFHSUMpIHsKKwkJbWFnaWMgPSBTV0FQTE9ORyhtYWdpYyk7CisJCWlmIChtYWdpYyAhPSBUQ1BEVU1QX01BR0lDICYmIG1hZ2ljICE9IEtVWk5FVFpPVl9UQ1BEVU1QX01BR0lDKQorCQkJcmV0dXJuICgwKTsJLyogbm9wZSAqLworCQlwLT5zZi5zd2FwcGVkID0gMTsKKwl9CisKKwkvKgorCSAqIFRoZXkgYXJlLiAgUHV0IHRoZSBtYWdpYyBudW1iZXIgaW4gdGhlIGhlYWRlciwgYW5kIHJlYWQKKwkgKiB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyLgorCSAqLworCWhkci5tYWdpYyA9IG1hZ2ljOworCWFtdF9yZWFkID0gZnJlYWQoKChjaGFyICopJmhkcikgKyBzaXplb2YgaGRyLm1hZ2ljLCAxLAorCSAgICBzaXplb2YoaGRyKSAtIHNpemVvZihoZHIubWFnaWMpLCBmcCk7CisJaWYgKGFtdF9yZWFkICE9IHNpemVvZihoZHIpIC0gc2l6ZW9mKGhkci5tYWdpYykpIHsKKwkJaWYgKGZlcnJvcihmcCkpIHsKKwkJCXNucHJpbnRmKGVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKKwkJCSAgICBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJCX0gZWxzZSB7CisJCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgInRydW5jYXRlZCBkdW1wIGZpbGU7IHRyaWVkIHRvIHJlYWQgJWx1IGZpbGUgaGVhZGVyIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAorCQkJICAgICh1bnNpZ25lZCBsb25nKXNpemVvZihoZHIpLAorCQkJICAgICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKKwkJfQorCQlyZXR1cm4gKC0xKTsKKwl9CisKKwkvKgorCSAqIElmIGl0J3MgYSBieXRlLXN3YXBwZWQgY2FwdHVyZSBmaWxlLCBieXRlLXN3YXAgdGhlIGhlYWRlci4KKwkgKi8KKwlpZiAocC0+c2Yuc3dhcHBlZCkgeworCQloZHIudmVyc2lvbl9tYWpvciA9IFNXQVBTSE9SVChoZHIudmVyc2lvbl9tYWpvcik7CisJCWhkci52ZXJzaW9uX21pbm9yID0gU1dBUFNIT1JUKGhkci52ZXJzaW9uX21pbm9yKTsKKwkJaGRyLnRoaXN6b25lID0gU1dBUExPTkcoaGRyLnRoaXN6b25lKTsKKwkJaGRyLnNpZ2ZpZ3MgPSBTV0FQTE9ORyhoZHIuc2lnZmlncyk7CisJCWhkci5zbmFwbGVuID0gU1dBUExPTkcoaGRyLnNuYXBsZW4pOworCQloZHIubGlua3R5cGUgPSBTV0FQTE9ORyhoZHIubGlua3R5cGUpOworCX0KKworCWlmIChoZHIudmVyc2lvbl9tYWpvciA8IFBDQVBfVkVSU0lPTl9NQUpPUikgeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiYXJjaGFpYyBwY2FwIHNhdmVmaWxlIGZvcm1hdCIpOworCQlyZXR1cm4gKC0xKTsKKwl9CisJcC0+c2YudmVyc2lvbl9tYWpvciA9IGhkci52ZXJzaW9uX21ham9yOworCXAtPnNmLnZlcnNpb25fbWlub3IgPSBoZHIudmVyc2lvbl9taW5vcjsKKwlwLT50em9mZiA9IGhkci50aGlzem9uZTsKKwlwLT5zbmFwc2hvdCA9IGhkci5zbmFwbGVuOworCXAtPmxpbmt0eXBlID0gbGlua3R5cGVfdG9fZGx0KExUX0xJTktUWVBFKGhkci5saW5rdHlwZSkpOworCXAtPmxpbmt0eXBlX2V4dCA9IExUX0xJTktUWVBFX0VYVChoZHIubGlua3R5cGUpOworCisJcC0+c2YubmV4dF9wYWNrZXRfb3AgPSBwY2FwX25leHRfcGFja2V0OworCisJLyoKKwkgKiBXZSBpbnRlcmNoYW5nZWQgdGhlIGNhcGxlbiBhbmQgbGVuIGZpZWxkcyBhdCB2ZXJzaW9uIDIuMywKKwkgKiBpbiBvcmRlciB0byBtYXRjaCB0aGUgYnBmIGhlYWRlciBsYXlvdXQuICBCdXQgdW5mb3J0dW5hdGVseQorCSAqIHNvbWUgZmlsZXMgd2VyZSB3cml0dGVuIHdpdGggdmVyc2lvbiAyLjMgaW4gdGhlaXIgaGVhZGVycworCSAqIGJ1dCB3aXRob3V0IHRoZSBpbnRlcmNoYW5nZWQgZmllbGRzLgorCSAqCisJICogSW4gYWRkaXRpb24sIERHL1VYIHRjcGR1bXAgd3JpdGVzIG91dCBmaWxlcyB3aXRoIGEgdmVyc2lvbgorCSAqIG51bWJlciBvZiA1NDMuMCwgYW5kIHdpdGggdGhlIGNhcGxlbiBhbmQgbGVuIGZpZWxkcyBpbiB0aGUKKwkgKiBwcmUtMi4zIG9yZGVyLgorCSAqLworCXN3aXRjaCAoaGRyLnZlcnNpb25fbWFqb3IpIHsKKworCWNhc2UgMjoKKwkJaWYgKGhkci52ZXJzaW9uX21pbm9yIDwgMykKKwkJCXAtPnNmLmxlbmd0aHNfc3dhcHBlZCA9IFNXQVBQRUQ7CisJCWVsc2UgaWYgKGhkci52ZXJzaW9uX21pbm9yID09IDMpCisJCQlwLT5zZi5sZW5ndGhzX3N3YXBwZWQgPSBNQVlCRV9TV0FQUEVEOworCQllbHNlCisJCQlwLT5zZi5sZW5ndGhzX3N3YXBwZWQgPSBOT1RfU1dBUFBFRDsKKwkJYnJlYWs7CisKKwljYXNlIDU0MzoKKwkJcC0+c2YubGVuZ3Roc19zd2FwcGVkID0gU1dBUFBFRDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwLT5zZi5sZW5ndGhzX3N3YXBwZWQgPSBOT1RfU1dBUFBFRDsKKwkJYnJlYWs7CisJfQorCisJaWYgKG1hZ2ljID09IEtVWk5FVFpPVl9UQ1BEVU1QX01BR0lDKSB7CisJCS8qCisJCSAqIFhYWCAtIHRoZSBwYXRjaCB0aGF0J3MgaW4gc29tZSB2ZXJzaW9ucyBvZiBsaWJwY2FwCisJCSAqIGNoYW5nZXMgdGhlIHBhY2tldCBoZWFkZXIgYnV0IG5vdCB0aGUgbWFnaWMgbnVtYmVyLAorCQkgKiBhbmQgc29tZSBvdGhlciB2ZXJzaW9ucyB3aXRoIHRoaXMgbWFnaWMgbnVtYmVyIGhhdmUKKwkJICogc29tZSBleHRyYSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHBhY2tldCBoZWFkZXI7CisJCSAqIHdlJ2QgaGF2ZSB0byB1c2Ugc29tZSBoYWNrc15IXkheSF5IXkhoZXVyaXN0aWNzIHRvCisJCSAqIGRldGVjdCB0aG9zZSB2YXJpYW50cy4KKwkJICoKKwkJICogRXRoZXJlYWwgZG9lcyB0aGF0LCBidXQgaXQgZG9lcyBzbyBieSB0cnlpbmcgdG8gcmVhZAorCQkgKiB0aGUgZmlyc3QgdHdvIHBhY2tldHMgb2YgdGhlIGZpbGUgd2l0aCBlYWNoIG9mIHRoZQorCQkgKiByZWNvcmQgaGVhZGVyIGZvcm1hdHMuICBUaGF0IGN1cnJlbnRseSBtZWFucyBpdCBzZWVrcworCQkgKiBiYWNrd2FyZHMgYW5kIHJldHJpZXMgdGhlIHJlYWRzLCB3aGljaCBkb2Vzbid0IHdvcmsKKwkJICogb24gcGlwZXMuICBXZSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZCBmcm9tIGEgcGlwZSwgc28KKwkJICogdGhhdCBzdHJhdGVneSB3b24ndCB3b3JrOyB3ZSdkIGhhdmUgdG8gYnVmZmVyIHNvbWUKKwkJICogZGF0YSBvdXJzZWx2ZXMgYW5kIHJlYWQgZnJvbSB0aGF0IGJ1ZmZlciBpbiBvcmRlciB0bworCQkgKiBtYWtlIHRoYXQgd29yay4KKwkJICovCisJCXAtPnNmLmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IHBjYXBfc2ZfcGF0Y2hlZF9wa3RoZHIpOworCisJCWlmIChwLT5saW5rdHlwZSA9PSBETFRfRU4xME1CKSB7CisJCQkvKgorCQkJICogVGhpcyBjYXB0dXJlIG1pZ2h0IGhhdmUgYmVlbiBkb25lIGluIHJhdyBtb2RlCisJCQkgKiBvciBjb29rZWQgbW9kZS4KKwkJCSAqCisJCQkgKiBJZiBpdCB3YXMgZG9uZSBpbiBjb29rZWQgbW9kZSwgcC0+c25hcHNob3Qgd2FzCisJCQkgKiBwYXNzZWQgdG8gcmVjdmZyb20oKSBhcyB0aGUgYnVmZmVyIHNpemUsIG1lYW5pbmcKKwkJCSAqIHRoYXQgdGhlIG1vc3QgcGFja2V0IGRhdGEgdGhhdCB3b3VsZCBiZSBjb3BpZWQKKwkJCSAqIHdvdWxkIGJlIHAtPnNuYXBzaG90LiAgSG93ZXZlciwgYSBmYWtlZCBFdGhlcm5ldAorCQkJICogaGVhZGVyIHdvdWxkIHRoZW4gaGF2ZSBiZWVuIGFkZGVkIHRvIGl0LCBzbyB0aGUKKwkJCSAqIG1vc3QgZGF0YSB0aGF0IHdvdWxkIGJlIGluIGEgcGFja2V0IGluIHRoZSBmaWxlCisJCQkgKiB3b3VsZCBiZSBwLT5zbmFwc2hvdCArIDE0LgorCQkJICoKKwkJCSAqIFdlIGNhbid0IGVhc2lseSB0ZWxsIHdoZXRoZXIgdGhlIGNhcHR1cmUgd2FzIGRvbmUKKwkJCSAqIGluIHJhdyBtb2RlIG9yIGNvb2tlZCBtb2RlLCBzbyB3ZSdsbCBhc3N1bWUgaXQgd2FzCisJCQkgKiBjb29rZWQgbW9kZSwgYW5kIGFkZCAxNCB0byB0aGUgc25hcHNob3QgbGVuZ3RoLgorCQkJICogVGhhdCBtZWFucyB0aGF0LCBmb3IgYSByYXcgY2FwdHVyZSwgdGhlIHNuYXBzaG90CisJCQkgKiBsZW5ndGggd2lsbCBiZSBtaXNsZWFkaW5nIGlmIHlvdSB1c2UgaXQgdG8gZmlndXJlCisJCQkgKiBvdXQgd2h5IGEgY2FwdHVyZSBkb2Vzbid0IGhhdmUgYWxsIHRoZSBwYWNrZXQgZGF0YSwKKwkJCSAqIGJ1dCB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbyB0byBhdm9pZCB0aGF0LgorCQkJICovCisJCQlwLT5zbmFwc2hvdCArPSAxNDsKKwkJfQorCX0gZWxzZQorCQlwLT5zZi5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBwY2FwX3NmX3BrdGhkcik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgcGFja2V0IGRhdGEuCisJICovCisJcC0+YnVmc2l6ZSA9IHAtPnNuYXBzaG90OworCWlmIChwLT5idWZzaXplIDw9IDApIHsKKwkJLyoKKwkJICogQm9ndXMgc25hcHNob3QgbGVuZ3RoOyB1c2UgNjRLaUIgYXMgYSBmYWxsYmFjay4KKwkJICovCisJCXAtPmJ1ZnNpemUgPSA2NTUzNjsKKwl9CisJcC0+YnVmZmVyID0gbWFsbG9jKHAtPmJ1ZnNpemUpOworCWlmIChwLT5idWZmZXIgPT0gTlVMTCkgeworCQlzbnByaW50ZihlcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJvdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybiAoLTEpOworCX0KKworCXJldHVybiAoMSk7Cit9CisKKy8qCisgKiBSZWFkIGFuZCByZXR1cm4gdGhlIG5leHQgcGFja2V0IGZyb20gdGhlIHNhdmVmaWxlLiAgUmV0dXJuIHRoZSBoZWFkZXIKKyAqIGluIGhkciBhbmQgYSBwb2ludGVyIHRvIHRoZSBjb250ZW50cyBpbiBkYXRhLiAgUmV0dXJuIDAgb24gc3VjY2VzcywgMQorICogaWYgdGhlcmUgd2VyZSBubyBtb3JlIHBhY2tldHMsIGFuZCAtMSBvbiBhbiBlcnJvci4KKyAqLworc3RhdGljIGludAorcGNhcF9uZXh0X3BhY2tldChwY2FwX3QgKnAsIHN0cnVjdCBwY2FwX3BrdGhkciAqaGRyLCB1X2NoYXIgKipkYXRhKQoreworCXN0cnVjdCBwY2FwX3NmX3BhdGNoZWRfcGt0aGRyIHNmX2hkcjsKKwlGSUxFICpmcCA9IHAtPnNmLnJmaWxlOworCXNpemVfdCBhbXRfcmVhZDsKKwlicGZfdV9pbnQzMiB0OworCisJLyoKKwkgKiBSZWFkIHRoZSBwYWNrZXQgaGVhZGVyOyB0aGUgc3RydWN0dXJlIHdlIHVzZSBhcyBhIGJ1ZmZlcgorCSAqIGlzIHRoZSBsb25nZXIgc3RydWN0dXJlIGZvciBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIHBhdGNoZWQKKwkgKiBsaWJwY2FwLCBidXQgaWYgdGhlIGZpbGUgaGFzIHRoZSBtYWdpYyBudW1iZXIgZm9yIGFuCisJICogdW5wYXRjaGVkIGxpYnBjYXAgd2Ugb25seSByZWFkIGFzIG1hbnkgYnl0ZXMgYXMgdGhlIHJlZ3VsYXIKKwkgKiBoZWFkZXIgaGFzLgorCSAqLworCWFtdF9yZWFkID0gZnJlYWQoJnNmX2hkciwgMSwgcC0+c2YuaGRyc2l6ZSwgZnApOworCWlmIChhbXRfcmVhZCAhPSBwLT5zZi5oZHJzaXplKSB7CisJCWlmIChmZXJyb3IoZnApKSB7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCisJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuICgtMSk7CisJCX0gZWxzZSB7CisJCQlpZiAoYW10X3JlYWQgIT0gMCkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgInRydW5jYXRlZCBkdW1wIGZpbGU7IHRyaWVkIHRvIHJlYWQgJWx1IGhlYWRlciBieXRlcywgb25seSBnb3QgJWx1IiwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpcC0+c2YuaGRyc2l6ZSwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOworCQkJCXJldHVybiAoLTEpOworCQkJfQorCQkJLyogRU9GICovCisJCQlyZXR1cm4gKDEpOworCQl9CisJfQorCisJaWYgKHAtPnNmLnN3YXBwZWQpIHsKKwkJLyogdGhlc2Ugd2VyZSB3cml0dGVuIGluIG9wcG9zaXRlIGJ5dGUgb3JkZXIgKi8KKwkJaGRyLT5jYXBsZW4gPSBTV0FQTE9ORyhzZl9oZHIuY2FwbGVuKTsKKwkJaGRyLT5sZW4gPSBTV0FQTE9ORyhzZl9oZHIubGVuKTsKKwkJaGRyLT50cy50dl9zZWMgPSBTV0FQTE9ORyhzZl9oZHIudHMudHZfc2VjKTsKKwkJaGRyLT50cy50dl91c2VjID0gU1dBUExPTkcoc2ZfaGRyLnRzLnR2X3VzZWMpOworCX0gZWxzZSB7CisJCWhkci0+Y2FwbGVuID0gc2ZfaGRyLmNhcGxlbjsKKwkJaGRyLT5sZW4gPSBzZl9oZHIubGVuOworCQloZHItPnRzLnR2X3NlYyA9IHNmX2hkci50cy50dl9zZWM7CisJCWhkci0+dHMudHZfdXNlYyA9IHNmX2hkci50cy50dl91c2VjOworCX0KKwkvKiBTd2FwIHRoZSBjYXBsZW4gYW5kIGxlbiBmaWVsZHMsIGlmIG5lY2Vzc2FyeS4gKi8KKwlzd2l0Y2ggKHAtPnNmLmxlbmd0aHNfc3dhcHBlZCkgeworCisJY2FzZSBOT1RfU1dBUFBFRDoKKwkJYnJlYWs7CisKKwljYXNlIE1BWUJFX1NXQVBQRUQ6CisJCWlmIChoZHItPmNhcGxlbiA8PSBoZHItPmxlbikgeworCQkJLyoKKwkJCSAqIFRoZSBjYXB0dXJlZCBsZW5ndGggaXMgPD0gdGhlIGFjdHVhbCBsZW5ndGgsCisJCQkgKiBzbyBwcmVzdW1hYmx5IHRoZXkgd2VyZW4ndCBzd2FwcGVkLgorCQkJICovCisJCQlicmVhazsKKwkJfQorCQkvKiBGQUxMVEhST1VHSCAqLworCisJY2FzZSBTV0FQUEVEOgorCQl0ID0gaGRyLT5jYXBsZW47CisJCWhkci0+Y2FwbGVuID0gaGRyLT5sZW47CisJCWhkci0+bGVuID0gdDsKKwkJYnJlYWs7CisJfQorCisJaWYgKGhkci0+Y2FwbGVuID4gcC0+YnVmc2l6ZSkgeworCQkvKgorCQkgKiBUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIFNvbGFyaXMgMi4zIHN5c3RlbXMgdHJpcHBpbmcKKwkJICogb3ZlciB0aGUgQlVGTU9EIHByb2JsZW0gYW5kIG5vdCBzZXR0aW5nIHRoZSBzbmFwc2hvdAorCQkgKiBjb3JyZWN0bHkgaW4gdGhlIHNhdmVmaWxlIGhlYWRlci4gIElmIHRoZSBjYXBsZW4gaXNuJ3QKKwkJICogZ3Jvc3NseSB3cm9uZywgdHJ5IHRvIHNhbHZhZ2UuCisJCSAqLworCQlzdGF0aWMgdV9jaGFyICp0cCA9IE5VTEw7CisJCXN0YXRpYyBzaXplX3QgdHNpemUgPSAwOworCisJCWlmIChoZHItPmNhcGxlbiA+IDY1NTM1KSB7CisJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkgICAgImJvZ3VzIHNhdmVmaWxlIGhlYWRlciIpOworCQkJcmV0dXJuICgtMSk7CisJCX0KKworCQlpZiAodHNpemUgPCBoZHItPmNhcGxlbikgeworCQkJdHNpemUgPSAoKGhkci0+Y2FwbGVuICsgMTAyMykgLyAxMDI0KSAqIDEwMjQ7CisJCQlpZiAodHAgIT0gTlVMTCkKKwkJCQlmcmVlKCh1X2NoYXIgKil0cCk7CisJCQl0cCA9ICh1X2NoYXIgKiltYWxsb2ModHNpemUpOworCQkJaWYgKHRwID09IE5VTEwpIHsKKwkJCQl0c2l6ZSA9IDA7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiQlVGTU9EIGhhY2sgbWFsbG9jIik7CisJCQkJcmV0dXJuICgtMSk7CisJCQl9CisJCX0KKwkJYW10X3JlYWQgPSBmcmVhZCgoY2hhciAqKXRwLCAxLCBoZHItPmNhcGxlbiwgZnApOworCQlpZiAoYW10X3JlYWQgIT0gaGRyLT5jYXBsZW4pIHsKKwkJCWlmIChmZXJyb3IoZnApKSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAiZXJyb3IgcmVhZGluZyBkdW1wIGZpbGU6ICVzIiwKKwkJCQkgICAgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIHsKKwkJCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCQkJICAgICJ0cnVuY2F0ZWQgZHVtcCBmaWxlOyB0cmllZCB0byByZWFkICV1IGNhcHR1cmVkIGJ5dGVzLCBvbmx5IGdvdCAlbHUiLAorCQkJCSAgICBoZHItPmNhcGxlbiwgKHVuc2lnbmVkIGxvbmcpYW10X3JlYWQpOworCQkJfQorCQkJcmV0dXJuICgtMSk7CisJCX0KKwkJLyoKKwkJICogV2UgY2FuIG9ubHkga2VlcCB1cCB0byBwLT5idWZzaXplIGJ5dGVzLiAgU2luY2UKKwkJICogY2FwbGVuID4gcC0+YnVmc2l6ZSBpcyBleGFjdGx5IGhvdyB3ZSBnb3QgaGVyZSwKKwkJICogd2Uga25vdyB3ZSBjYW4gb25seSBrZWVwIHRoZSBmaXJzdCBwLT5idWZzaXplIGJ5dGVzCisJCSAqIGFuZCBtdXN0IGRyb3AgdGhlIHJlbWFpbmRlci4gIEFkanVzdCBjYXBsZW4gYWNjb3JkaW5nbHksCisJCSAqIHNvIHdlIGRvbid0IGdldCBjb25mdXNlZCBsYXRlciBhcyB0byBob3cgbWFueSBieXRlcyB3ZQorCQkgKiBoYXZlIHRvIHBsYXkgd2l0aC4KKwkJICovCisJCWhkci0+Y2FwbGVuID0gcC0+YnVmc2l6ZTsKKwkJbWVtY3B5KHAtPmJ1ZmZlciwgKGNoYXIgKil0cCwgcC0+YnVmc2l6ZSk7CisJfSBlbHNlIHsKKwkJLyogcmVhZCB0aGUgcGFja2V0IGl0c2VsZiAqLworCQlhbXRfcmVhZCA9IGZyZWFkKHAtPmJ1ZmZlciwgMSwgaGRyLT5jYXBsZW4sIGZwKTsKKwkJaWYgKGFtdF9yZWFkICE9IGhkci0+Y2FwbGVuKSB7CisJCQlpZiAoZmVycm9yKGZwKSkgeworCQkJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJCQkgICAgImVycm9yIHJlYWRpbmcgZHVtcCBmaWxlOiAlcyIsCisJCQkJICAgIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLAorCQkJCSAgICAidHJ1bmNhdGVkIGR1bXAgZmlsZTsgdHJpZWQgdG8gcmVhZCAldSBjYXB0dXJlZCBieXRlcywgb25seSBnb3QgJWx1IiwKKwkJCQkgICAgaGRyLT5jYXBsZW4sICh1bnNpZ25lZCBsb25nKWFtdF9yZWFkKTsKKwkJCX0KKwkJCXJldHVybiAoLTEpOworCQl9CisJfQorCSpkYXRhID0gcC0+YnVmZmVyOworCisJaWYgKHAtPnNmLnN3YXBwZWQpIHsKKwkJLyoKKwkJICogQ29udmVydCBwc2V1ZG8taGVhZGVycyBmcm9tIHRoZSBieXRlIG9yZGVyIG9mCisJCSAqIHRoZSBob3N0IG9uIHdoaWNoIHRoZSBmaWxlIHdhcyBzYXZlZCB0byBvdXIKKwkJICogYnl0ZSBvcmRlciwgYXMgbmVjZXNzYXJ5LgorCQkgKi8KKwkJc3dpdGNoIChwLT5saW5rdHlwZSkgeworCisJCWNhc2UgRExUX1VTQl9MSU5VWDoKKwkJCXN3YXBfbGludXhfdXNiX2hlYWRlcihoZHIsICpkYXRhLCAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRExUX1VTQl9MSU5VWF9NTUFQUEVEOgorCQkJc3dhcF9saW51eF91c2JfaGVhZGVyKGhkciwgKmRhdGEsIDEpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50CitzZl93cml0ZV9oZWFkZXIoRklMRSAqZnAsIGludCBsaW5rdHlwZSwgaW50IHRoaXN6b25lLCBpbnQgc25hcGxlbikKK3sKKwlzdHJ1Y3QgcGNhcF9maWxlX2hlYWRlciBoZHI7CisKKwloZHIubWFnaWMgPSBUQ1BEVU1QX01BR0lDOworCWhkci52ZXJzaW9uX21ham9yID0gUENBUF9WRVJTSU9OX01BSk9SOworCWhkci52ZXJzaW9uX21pbm9yID0gUENBUF9WRVJTSU9OX01JTk9SOworCisJaGRyLnRoaXN6b25lID0gdGhpc3pvbmU7CisJaGRyLnNuYXBsZW4gPSBzbmFwbGVuOworCWhkci5zaWdmaWdzID0gMDsKKwloZHIubGlua3R5cGUgPSBsaW5rdHlwZTsKKworCWlmIChmd3JpdGUoKGNoYXIgKikmaGRyLCBzaXplb2YoaGRyKSwgMSwgZnApICE9IDEpCisJCXJldHVybiAoLTEpOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIE91dHB1dCBhIHBhY2tldCB0byB0aGUgaW5pdGlhbGl6ZWQgZHVtcCBmaWxlLgorICovCit2b2lkCitwY2FwX2R1bXAodV9jaGFyICp1c2VyLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqc3ApCit7CisJcmVnaXN0ZXIgRklMRSAqZjsKKwlzdHJ1Y3QgcGNhcF9zZl9wa3RoZHIgc2ZfaGRyOworCisJZiA9IChGSUxFICopdXNlcjsKKwlzZl9oZHIudHMudHZfc2VjICA9IGgtPnRzLnR2X3NlYzsKKwlzZl9oZHIudHMudHZfdXNlYyA9IGgtPnRzLnR2X3VzZWM7CisJc2ZfaGRyLmNhcGxlbiAgICAgPSBoLT5jYXBsZW47CisJc2ZfaGRyLmxlbiAgICAgICAgPSBoLT5sZW47CisJLyogWFhYIHdlIHNob3VsZCBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cyAqLworCSh2b2lkKWZ3cml0ZSgmc2ZfaGRyLCBzaXplb2Yoc2ZfaGRyKSwgMSwgZik7CisJKHZvaWQpZndyaXRlKHNwLCBoLT5jYXBsZW4sIDEsIGYpOworfQorCitzdGF0aWMgcGNhcF9kdW1wZXJfdCAqCitwY2FwX3NldHVwX2R1bXAocGNhcF90ICpwLCBpbnQgbGlua3R5cGUsIEZJTEUgKmYsIGNvbnN0IGNoYXIgKmZuYW1lKQoreworCisjaWYgZGVmaW5lZChXSU4zMikgfHwgZGVmaW5lZChNU0RPUykKKwkvKgorCSAqIElmIHdlJ3JlIHdyaXRpbmcgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCwgcHV0IGl0IGluIGJpbmFyeQorCSAqIG1vZGUsIGFzIHNhdmVmaWxlcyBhcmUgYmluYXJ5IGZpbGVzLgorCSAqCisJICogT3RoZXJ3aXNlLCB3ZSB0dXJuIG9mZiBidWZmZXJpbmcuCisJICogWFhYIC0gd2h5PyAgQW5kIHdoeSBub3Qgb24gdGhlIHN0YW5kYXJkIG91dHB1dD8KKwkgKi8KKwlpZiAoZiA9PSBzdGRvdXQpCisJCVNFVF9CSU5NT0RFKGYpOworCWVsc2UKKwkJc2V0YnVmKGYsIE5VTEwpOworI2VuZGlmCisJaWYgKHNmX3dyaXRlX2hlYWRlcihmLCBsaW5rdHlwZSwgcC0+dHpvZmYsIHAtPnNuYXBzaG90KSA9PSAtMSkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsICJDYW4ndCB3cml0ZSB0byAlczogJXMiLAorCQkgICAgZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKGYgIT0gc3Rkb3V0KQorCQkJKHZvaWQpZmNsb3NlKGYpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlyZXR1cm4gKChwY2FwX2R1bXBlcl90ICopZik7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHNvIHRoYXQgc2Zfd3JpdGUoKSB3aWxsIG91dHB1dCB0byB0aGUgZmlsZSBuYW1lZCAnZm5hbWUnLgorICovCitwY2FwX2R1bXBlcl90ICoKK3BjYXBfZHVtcF9vcGVuKHBjYXBfdCAqcCwgY29uc3QgY2hhciAqZm5hbWUpCit7CisJRklMRSAqZjsKKwlpbnQgbGlua3R5cGU7CisKKwkvKgorCSAqIElmIHRoaXMgcGNhcF90IGhhc24ndCBiZWVuIGFjdGl2YXRlZCwgaXQgZG9lc24ndCBoYXZlIGEKKwkgKiBsaW5rLWxheWVyIHR5cGUsIHNvIHdlIGNhbid0IHVzZSBpdC4KKwkgKi8KKwlpZiAoIXAtPmFjdGl2YXRlZCkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAiJXM6IG5vdC15ZXQtYWN0aXZhdGVkIHBjYXBfdCBwYXNzZWQgdG8gcGNhcF9kdW1wX29wZW4iLAorCQkgICAgZm5hbWUpOworCQlyZXR1cm4gKE5VTEwpOworCX0KKwlsaW5rdHlwZSA9IGRsdF90b19saW5rdHlwZShwLT5saW5rdHlwZSk7CisJaWYgKGxpbmt0eXBlID09IC0xKSB7CisJCXNucHJpbnRmKHAtPmVycmJ1ZiwgUENBUF9FUlJCVUZfU0laRSwKKwkJICAgICIlczogbGluay1sYXllciB0eXBlICVkIGlzbid0IHN1cHBvcnRlZCBpbiBzYXZlZmlsZXMiLAorCQkgICAgZm5hbWUsIHAtPmxpbmt0eXBlKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisJbGlua3R5cGUgfD0gcC0+bGlua3R5cGVfZXh0OworCisJaWYgKGZuYW1lWzBdID09ICctJyAmJiBmbmFtZVsxXSA9PSAnXDAnKSB7CisJCWYgPSBzdGRvdXQ7CisJCWZuYW1lID0gInN0YW5kYXJkIG91dHB1dCI7CisJfSBlbHNlIHsKKyNpZiAhZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNET1MpCisJCWYgPSBmb3BlbihmbmFtZSwgInciKTsKKyNlbHNlCisJCWYgPSBmb3BlbihmbmFtZSwgIndiIik7CisjZW5kaWYKKwkJaWYgKGYgPT0gTlVMTCkgeworCQkJc25wcmludGYocC0+ZXJyYnVmLCBQQ0FQX0VSUkJVRl9TSVpFLCAiJXM6ICVzIiwKKwkJCSAgICBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCX0KKwlyZXR1cm4gKHBjYXBfc2V0dXBfZHVtcChwLCBsaW5rdHlwZSwgZiwgZm5hbWUpKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgc28gdGhhdCBzZl93cml0ZSgpIHdpbGwgb3V0cHV0IHRvIHRoZSBnaXZlbiBzdHJlYW0uCisgKi8KK3BjYXBfZHVtcGVyX3QgKgorcGNhcF9kdW1wX2ZvcGVuKHBjYXBfdCAqcCwgRklMRSAqZikKK3sJCisJaW50IGxpbmt0eXBlOworCisJbGlua3R5cGUgPSBkbHRfdG9fbGlua3R5cGUocC0+bGlua3R5cGUpOworCWlmIChsaW5rdHlwZSA9PSAtMSkgeworCQlzbnByaW50ZihwLT5lcnJidWYsIFBDQVBfRVJSQlVGX1NJWkUsCisJCSAgICAic3RyZWFtOiBsaW5rLWxheWVyIHR5cGUgJWQgaXNuJ3Qgc3VwcG9ydGVkIGluIHNhdmVmaWxlcyIsCisJCSAgICBwLT5saW5rdHlwZSk7CisJCXJldHVybiAoTlVMTCk7CisJfQorCWxpbmt0eXBlIHw9IHAtPmxpbmt0eXBlX2V4dDsKKworCXJldHVybiAocGNhcF9zZXR1cF9kdW1wKHAsIGxpbmt0eXBlLCBmLCAic3RyZWFtIikpOworfQorCitGSUxFICoKK3BjYXBfZHVtcF9maWxlKHBjYXBfZHVtcGVyX3QgKnApCit7CisJcmV0dXJuICgoRklMRSAqKXApOworfQorCitsb25nCitwY2FwX2R1bXBfZnRlbGwocGNhcF9kdW1wZXJfdCAqcCkKK3sKKwlyZXR1cm4gKGZ0ZWxsKChGSUxFICopcCkpOworfQorCitpbnQKK3BjYXBfZHVtcF9mbHVzaChwY2FwX2R1bXBlcl90ICpwKQoreworCisJaWYgKGZmbHVzaCgoRklMRSAqKXApID09IEVPRikKKwkJcmV0dXJuICgtMSk7CisJZWxzZQorCQlyZXR1cm4gKDApOworfQorCit2b2lkCitwY2FwX2R1bXBfY2xvc2UocGNhcF9kdW1wZXJfdCAqcCkKK3sKKworI2lmZGVmIG5vdHlldAorCWlmIChmZXJyb3IoKEZJTEUgKilwKSkKKwkJcmV0dXJuLWFuLWVycm9yOworCS8qIFhYWCBzaG91bGQgY2hlY2sgcmV0dXJuIGZyb20gZmNsb3NlKCkgdG9vICovCisjZW5kaWYKKwkodm9pZClmY2xvc2UoKEZJTEUgKilwKTsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAtMS4zLjAvc2YtcGNhcC5oIGIvbGlicGNhcC0xLjMuMC9zZi1wY2FwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzZmJlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvc2YtcGNhcC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBzZi1wY2FwLmggLSBsaWJwY2FwLWZpbGUtZm9ybWF0LXNwZWNpZmljIHJvdXRpbmVzCisgKglFeHRyYWN0aW9uL2NyZWF0aW9uIGJ5IEplZmZyZXkgTW9ndWwsIERFQ1dSTAorICoJTW9kaWZpZWQgYnkgU3RldmUgTWNDYW5uZSwgTEJMLgorICoKKyAqIFVzZWQgdG8gc2F2ZSB0aGUgcmVjZWl2ZWQgcGFja2V0IGhlYWRlcnMsIGFmdGVyIGZpbHRlcmluZywgdG8KKyAqIGEgZmlsZSwgYW5kIHRoZW4gcmVhZCB0aGVtIGxhdGVyLgorICogVGhlIGZpcnN0IHJlY29yZCBpbiB0aGUgZmlsZSBjb250YWlucyBzYXZlZCB2YWx1ZXMgZm9yIHRoZSBtYWNoaW5lCisgKiBkZXBlbmRlbnQgdmFsdWVzIHNvIHdlIGNhbiBwcmludCB0aGUgZHVtcCBmaWxlIG9uIGFueSBhcmNoaXRlY3R1cmUuCisgKi8KKworI2lmbmRlZiBzZl9wY2FwX2gKKyNkZWZpbmUJc2ZfcGNhcF9oCisKK2V4dGVybiBpbnQgcGNhcF9jaGVja19oZWFkZXIocGNhcF90ICosIGJwZl91X2ludDMyLCBGSUxFICosIGNoYXIgKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC9zdW5hdG1wb3MuaCBiL2xpYnBjYXAtMS4zLjAvc3VuYXRtcG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2MDE3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvc3VuYXRtcG9zLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NyBZZW4gWWVuIExpbSBhbmQgTm9ydGggRGFrb3RhIFN0YXRlIFVuaXZlcnNpdHkKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSBZZW4gWWVuIExpbSBhbmQKKyAgICAgICAgTm9ydGggRGFrb3RhIFN0YXRlIFVuaXZlcnNpdHkKKyAqIDQuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsCisgKiBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgorICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4KKyAqIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9zdW5hdG1wb3MuaCx2IDEuMSAyMDAyLTA3LTExIDA5OjA2OjQ3IGd1eSBFeHAgJCAoTEJMKQorICovCisKKy8qIFN1bkFUTSBoZWFkZXIgZm9yIEFUTSBwYWNrZXQgKi8KKyNkZWZpbmUgU1VOQVRNX0RJUl9QT1MJCTAKKyNkZWZpbmUgU1VOQVRNX1ZQSV9QT1MJCTEKKyNkZWZpbmUgU1VOQVRNX1ZDSV9QT1MJCTIKKyNkZWZpbmUgU1VOQVRNX1BLVF9CRUdJTl9QT1MJNAkvKiBTdGFydCBvZiBBVE0gcGFja2V0ICovCisKKy8qIFByb3RvY29sIHR5cGUgdmFsdWVzIGluIHRoZSBib3R0b20gZm9yIGJpdHMgb2YgdGhlIGJ5dGUgYXQgU1VOQVRNX0RJUl9QT1MuICovCisjZGVmaW5lIFBUX0xBTkUJCTB4MDEJLyogTEFORSAqLworI2RlZmluZSBQVF9MTEMJCTB4MDIJLyogTExDIGVuY2Fwc3VsYXRpb24gKi8KKyNkZWZpbmUgUFRfSUxNSQkJMHgwNQkvKiBJTE1JICovCisjZGVmaW5lIFBUX1FTQUFMCTB4MDYJLyogUS5TQUFMICovCmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3Rlc3RzL2ZpbHRlcnRlc3QuYyBiL2xpYnBjYXAtMS4zLjAvdGVzdHMvZmlsdGVydGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NmQxZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3Rlc3RzL2ZpbHRlcnRlc3QuYwpAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gX1VfID0KKyAgICAiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDBcblwKK1RoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIjsKK3N0YXRpYyBjb25zdCBjaGFyIHJjc2lkW10gX1VfID0KKyAgICAiQCgjKSAkSGVhZGVyOiAvdGNwZHVtcC9tYXN0ZXIvbGlicGNhcC9maWx0ZXJ0ZXN0LmMsdiAxLjIgMjAwNS0wOC0wOCAxNzo1MDoxMyBndXkgRXhwICQgKExCTCkiOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHBjYXAuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaWZuZGVmIEhBVkVfX19BVFRSSUJVVEVfXworI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjZW5kaWYKKworc3RhdGljIGNoYXIgKnByb2dyYW1fbmFtZTsKKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CitzdGF0aWMgdm9pZCBlcnJvcihjb25zdCBjaGFyICosIC4uLikKKyAgICBfX2F0dHJpYnV0ZV9fKChub3JldHVybiwgZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK2V4dGVybiBpbnQgb3B0aW5kOworZXh0ZXJuIGludCBvcHRlcnI7CitleHRlcm4gY2hhciAqb3B0YXJnOworCisvKgorICogT24gV2luZG93cywgd2UgbmVlZCB0byBvcGVuIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlLCBzbyB0aGF0CisgKiB3ZSBnZXQgYWxsIHRoZSBieXRlcyBzcGVjaWZpZWQgYnkgdGhlIHNpemUgd2UgZ2V0IGZyb20gImZzdGF0KCkiLgorICogT24gVU5JWCwgdGhhdCdzIG5vdCBuZWNlc3NhcnkuICBPX0JJTkFSWSBpcyBkZWZpbmVkIG9uIFdpbmRvd3M7CisgKiB3ZSBkZWZpbmUgaXQgYXMgMCBpZiBpdCdzIG5vdCBkZWZpbmVkLCBzbyBpdCBkb2VzIG5vdGhpbmcuCisgKi8KKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkJMAorI2VuZGlmCisKK3N0YXRpYyBjaGFyICoKK3JlYWRfaW5maWxlKGNoYXIgKmZuYW1lKQoreworCXJlZ2lzdGVyIGludCBpLCBmZCwgY2M7CisJcmVnaXN0ZXIgY2hhciAqY3A7CisJc3RydWN0IHN0YXQgYnVmOworCisJZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWXxPX0JJTkFSWSk7CisJaWYgKGZkIDwgMCkKKwkJZXJyb3IoImNhbid0IG9wZW4gJXM6ICVzIiwgZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKworCWlmIChmc3RhdChmZCwgJmJ1ZikgPCAwKQorCQllcnJvcigiY2FuJ3Qgc3RhdCAlczogJXMiLCBmbmFtZSwgcGNhcF9zdHJlcnJvcihlcnJubykpOworCisJY3AgPSBtYWxsb2MoKHVfaW50KWJ1Zi5zdF9zaXplICsgMSk7CisJaWYgKGNwID09IE5VTEwpCisJCWVycm9yKCJtYWxsb2MoJWQpIGZvciAlczogJXMiLCAodV9pbnQpYnVmLnN0X3NpemUgKyAxLAorCQkJZm5hbWUsIHBjYXBfc3RyZXJyb3IoZXJybm8pKTsKKwljYyA9IHJlYWQoZmQsIGNwLCAodV9pbnQpYnVmLnN0X3NpemUpOworCWlmIChjYyA8IDApCisJCWVycm9yKCJyZWFkICVzOiAlcyIsIGZuYW1lLCBwY2FwX3N0cmVycm9yKGVycm5vKSk7CisJaWYgKGNjICE9IGJ1Zi5zdF9zaXplKQorCQllcnJvcigic2hvcnQgcmVhZCAlcyAoJWQgIT0gJWQpIiwgZm5hbWUsIGNjLCAoaW50KWJ1Zi5zdF9zaXplKTsKKworCWNsb3NlKGZkKTsKKwkvKiByZXBsYWNlICIjIGNvbW1lbnQiIHdpdGggc3BhY2VzICovCisJZm9yIChpID0gMDsgaSA8IGNjOyBpKyspIHsKKwkJaWYgKGNwW2ldID09ICcjJykKKwkJCXdoaWxlIChpIDwgY2MgJiYgY3BbaV0gIT0gJ1xuJykKKwkJCQljcFtpKytdID0gJyAnOworCX0KKwljcFtjY10gPSAnXDAnOworCXJldHVybiAoY3ApOworfQorCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAorZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJKHZvaWQpdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWlmICgqZm10KSB7CisJCWZtdCArPSBzdHJsZW4oZm10KTsKKwkJaWYgKGZtdFstMV0gIT0gJ1xuJykKKwkJCSh2b2lkKWZwdXRjKCdcbicsIHN0ZGVycik7CisJfQorCWV4aXQoMSk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogQ29weSBhcmcgdmVjdG9yIGludG8gYSBuZXcgYnVmZmVyLCBjb25jYXRlbmF0aW5nIGFyZ3VtZW50cyB3aXRoIHNwYWNlcy4KKyAqLworc3RhdGljIGNoYXIgKgorY29weV9hcmd2KHJlZ2lzdGVyIGNoYXIgKiphcmd2KQoreworCXJlZ2lzdGVyIGNoYXIgKipwOworCXJlZ2lzdGVyIHVfaW50IGxlbiA9IDA7CisJY2hhciAqYnVmOworCWNoYXIgKnNyYywgKmRzdDsKKworCXAgPSBhcmd2OworCWlmICgqcCA9PSAwKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgqcCkKKwkJbGVuICs9IHN0cmxlbigqcCsrKSArIDE7CisKKwlidWYgPSAoY2hhciAqKW1hbGxvYyhsZW4pOworCWlmIChidWYgPT0gTlVMTCkKKwkJZXJyb3IoImNvcHlfYXJndjogbWFsbG9jIik7CisKKwlwID0gYXJndjsKKwlkc3QgPSBidWY7CisJd2hpbGUgKChzcmMgPSAqcCsrKSAhPSBOVUxMKSB7CisJCXdoaWxlICgoKmRzdCsrID0gKnNyYysrKSAhPSAnXDAnKQorCQkJOworCQlkc3RbLTFdID0gJyAnOworCX0KKwlkc3RbLTFdID0gJ1wwJzsKKworCXJldHVybiBidWY7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqY3A7CisJaW50IG9wOworCWludCBkZmxhZzsKKwljaGFyICppbmZpbGU7CisJaW50IE9mbGFnOworCWxvbmcgc25hcGxlbjsKKwlpbnQgZGx0OworCWJwZl91X2ludDMyIG5ldG1hc2sgPSBQQ0FQX05FVE1BU0tfVU5LTk9XTjsKKwljaGFyICpjbWRidWY7CisJcGNhcF90ICpwZDsKKwlzdHJ1Y3QgYnBmX3Byb2dyYW0gZmNvZGU7CisKKyNpZmRlZiBXSU4zMgorCWlmKHdzb2NraW5pdCgpICE9IDApIHJldHVybiAxOworI2VuZGlmIC8qIFdJTjMyICovCisKKwlkZmxhZyA9IDE7CisJaW5maWxlID0gTlVMTDsKKwlPZmxhZyA9IDE7CisJc25hcGxlbiA9IDY4OworICAKKwlpZiAoKGNwID0gc3RycmNocihhcmd2WzBdLCAnLycpKSAhPSBOVUxMKQorCQlwcm9ncmFtX25hbWUgPSBjcCArIDE7CisJZWxzZQorCQlwcm9ncmFtX25hbWUgPSBhcmd2WzBdOworCisJb3B0ZXJyID0gMDsKKwl3aGlsZSAoKG9wID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkRjptOk9zOiIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wKSB7CisKKwkJY2FzZSAnZCc6CisJCQkrK2RmbGFnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnRic6CisJCQlpbmZpbGUgPSBvcHRhcmc7CisJCQlicmVhazsKKworCQljYXNlICdPJzoKKwkJCU9mbGFnID0gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgJ20nOiB7CisJCQlpbl9hZGRyX3QgYWRkcjsKKworCQkJYWRkciA9IGluZXRfYWRkcihvcHRhcmcpOworCQkJaWYgKGFkZHIgPT0gSU5BRERSX05PTkUpCisJCQkJZXJyb3IoImludmFsaWQgbmV0bWFzayAlcyIsIG9wdGFyZyk7CisJCQluZXRtYXNrID0gYWRkcjsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSAncyc6IHsKKwkJCWNoYXIgKmVuZDsKKworCQkJc25hcGxlbiA9IHN0cnRvbChvcHRhcmcsICZlbmQsIDApOworCQkJaWYgKG9wdGFyZyA9PSBlbmQgfHwgKmVuZCAhPSAnXDAnCisJCQkgICAgfHwgc25hcGxlbiA8IDAgfHwgc25hcGxlbiA+IDY1NTM1KQorCQkJCWVycm9yKCJpbnZhbGlkIHNuYXBsZW4gJXMiLCBvcHRhcmcpOworCQkJZWxzZSBpZiAoc25hcGxlbiA9PSAwKQorCQkJCXNuYXBsZW4gPSA2NTUzNTsKKwkJCWJyZWFrOworCQl9CisKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKCk7CisJCQkvKiBOT1RSRUFDSEVEICovCisJCX0KKwl9CisKKwlpZiAob3B0aW5kID49IGFyZ2MpIHsKKwkJdXNhZ2UoKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKworCWRsdCA9IHBjYXBfZGF0YWxpbmtfbmFtZV90b192YWwoYXJndltvcHRpbmRdKTsKKwlpZiAoZGx0IDwgMCkKKwkJZXJyb3IoImludmFsaWQgZGF0YSBsaW5rIHR5cGUgJXMiLCBhcmd2W29wdGluZF0pOworCQorCWlmIChpbmZpbGUpCisJCWNtZGJ1ZiA9IHJlYWRfaW5maWxlKGluZmlsZSk7CisJZWxzZQorCQljbWRidWYgPSBjb3B5X2FyZ3YoJmFyZ3Zbb3B0aW5kKzFdKTsKKworCXBkID0gcGNhcF9vcGVuX2RlYWQoZGx0LCBzbmFwbGVuKTsKKwlpZiAocGQgPT0gTlVMTCkKKwkJZXJyb3IoIkNhbid0IG9wZW4gZmFrZSBwY2FwX3QiKTsKKworCWlmIChwY2FwX2NvbXBpbGUocGQsICZmY29kZSwgY21kYnVmLCBPZmxhZywgbmV0bWFzaykgPCAwKQorCQllcnJvcigiJXMiLCBwY2FwX2dldGVycihwZCkpOworCWJwZl9kdW1wKCZmY29kZSwgZGZsYWcpOworCXBjYXBfY2xvc2UocGQpOworCWV4aXQoMCk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXMsIHdpdGggJXNcbiIsIHByb2dyYW1fbmFtZSwKKwkgICAgcGNhcF9saWJfdmVyc2lvbigpKTsKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwKKwkgICAgIlVzYWdlOiAlcyBbLWRPXSBbIC1GIGZpbGUgXSBbIC1tIG5ldG1hc2tdIFsgLXMgc25hcGxlbiBdIGRsdCBbIGV4cHJlc3Npb24gXVxuIiwKKwkgICAgcHJvZ3JhbV9uYW1lKTsKKwlleGl0KDEpOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC90ZXN0cy9maW5kYWxsZGV2c3Rlc3QuYyBiL2xpYnBjYXAtMS4zLjAvdGVzdHMvZmluZGFsbGRldnN0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3Yzk1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvdGVzdHMvZmluZGFsbGRldnN0ZXN0LmMKQEAgLTAsMCArMSwxMzEgQEAKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAiY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPHBjYXAuaD4KKworc3RhdGljIHZvaWQgaWZwcmludChwY2FwX2lmX3QgKmQpOworc3RhdGljIGNoYXIgKmlwdG9zKGJwZl91X2ludDMyIGluKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBwY2FwX2lmX3QgKmFsbGRldnM7CisgIHBjYXBfaWZfdCAqZDsKKyAgY2hhciAqczsKKyAgYnBmX3VfaW50MzIgbmV0LCBtYXNrOworICAKKyAgY2hhciBlcnJidWZbUENBUF9FUlJCVUZfU0laRSsxXTsKKyAgaWYgKHBjYXBfZmluZGFsbGRldnMoJmFsbGRldnMsIGVycmJ1ZikgPT0gLTEpCisgIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gcGNhcF9maW5kYWxsZGV2czogJXNcbiIsZXJyYnVmKTsKKyAgICBleGl0KDEpOworICB9CisgIGZvcihkPWFsbGRldnM7ZDtkPWQtPm5leHQpCisgIHsKKyAgICBpZnByaW50KGQpOworICB9CisKKyAgaWYgKCAocyA9IHBjYXBfbG9va3VwZGV2KGVycmJ1ZikpID09IE5VTEwpCisgIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gcGNhcF9sb29rdXBkZXY6ICVzXG4iLGVycmJ1Zik7CisgIH0KKyAgZWxzZQorICB7CisgICAgcHJpbnRmKCJQcmVmZXJyZWQgZGV2aWNlIG5hbWU6ICVzXG4iLHMpOworICB9CisKKyAgaWYgKHBjYXBfbG9va3VwbmV0KHMsICZuZXQsICZtYXNrLCBlcnJidWYpIDwgMCkKKyAgeworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBwY2FwX2xvb2t1cG5ldDogJXNcbiIsZXJyYnVmKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBwcmludGYoIlByZWZlcnJlZCBkZXZpY2UgaXMgb24gbmV0d29yazogJXMvJXNcbiIsaXB0b3MobmV0KSwgaXB0b3MobWFzaykpOworICB9CisgIAorICBleGl0KDApOworfQorCitzdGF0aWMgdm9pZCBpZnByaW50KHBjYXBfaWZfdCAqZCkKK3sKKyAgcGNhcF9hZGRyX3QgKmE7CisjaWZkZWYgSU5FVDYKKyAgY2hhciBudG9wX2J1ZltJTkVUNl9BRERSU1RSTEVOXTsKKyNlbmRpZgorCisgIHByaW50ZigiJXNcbiIsZC0+bmFtZSk7CisgIGlmIChkLT5kZXNjcmlwdGlvbikKKyAgICBwcmludGYoIlx0RGVzY3JpcHRpb246ICVzXG4iLGQtPmRlc2NyaXB0aW9uKTsKKyAgcHJpbnRmKCJcdExvb3BiYWNrOiAlc1xuIiwoZC0+ZmxhZ3MgJiBQQ0FQX0lGX0xPT1BCQUNLKT8ieWVzIjoibm8iKTsKKworICBmb3IoYT1kLT5hZGRyZXNzZXM7YTthPWEtPm5leHQpIHsKKyAgICBzd2l0Y2goYS0+YWRkci0+c2FfZmFtaWx5KQorICAgIHsKKyAgICAgIGNhc2UgQUZfSU5FVDoKKyAgICAgICAgcHJpbnRmKCJcdEFkZHJlc3MgRmFtaWx5OiBBRl9JTkVUXG4iKTsKKyAgICAgICAgaWYgKGEtPmFkZHIpCisgICAgICAgICAgcHJpbnRmKCJcdFx0QWRkcmVzczogJXNcbiIsCisgICAgICAgICAgICBpbmV0X250b2EoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoYS0+YWRkcikpLT5zaW5fYWRkcikpOworICAgICAgICBpZiAoYS0+bmV0bWFzaykKKyAgICAgICAgICBwcmludGYoIlx0XHROZXRtYXNrOiAlc1xuIiwKKyAgICAgICAgICAgIGluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShhLT5uZXRtYXNrKSktPnNpbl9hZGRyKSk7CisgICAgICAgIGlmIChhLT5icm9hZGFkZHIpCisgICAgICAgICAgcHJpbnRmKCJcdFx0QnJvYWRjYXN0IEFkZHJlc3M6ICVzXG4iLAorICAgICAgICAgICAgaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luICopKGEtPmJyb2FkYWRkcikpLT5zaW5fYWRkcikpOworICAgICAgICBpZiAoYS0+ZHN0YWRkcikKKyAgICAgICAgICBwcmludGYoIlx0XHREZXN0aW5hdGlvbiBBZGRyZXNzOiAlc1xuIiwKKyAgICAgICAgICAgIGluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShhLT5kc3RhZGRyKSktPnNpbl9hZGRyKSk7CisgICAgICAgIGJyZWFrOworI2lmZGVmIElORVQ2CisgICAgICBjYXNlIEFGX0lORVQ2OgorICAgICAgICBwcmludGYoIlx0QWRkcmVzcyBGYW1pbHk6IEFGX0lORVQ2XG4iKTsKKyAgICAgICAgaWYgKGEtPmFkZHIpCisgICAgICAgICAgcHJpbnRmKCJcdFx0QWRkcmVzczogJXNcbiIsCisgICAgICAgICAgICBpbmV0X250b3AoQUZfSU5FVDYsCisgICAgICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikoYS0+YWRkcikpLT5zaW42X2FkZHIuczZfYWRkciwKKyAgICAgICAgICAgICAgIG50b3BfYnVmLCBzaXplb2YgbnRvcF9idWYpKTsKKyAgICAgICAgaWYgKGEtPm5ldG1hc2spCisgICAgICAgICAgcHJpbnRmKCJcdFx0TmV0bWFzazogJXNcbiIsCisgICAgICAgICAgICBpbmV0X250b3AoQUZfSU5FVDYsCisgICAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKShhLT5uZXRtYXNrKSktPnNpbjZfYWRkci5zNl9hZGRyLAorICAgICAgICAgICAgICAgbnRvcF9idWYsIHNpemVvZiBudG9wX2J1ZikpOworICAgICAgICBpZiAoYS0+YnJvYWRhZGRyKQorICAgICAgICAgIHByaW50ZigiXHRcdEJyb2FkY2FzdCBBZGRyZXNzOiAlc1xuIiwKKyAgICAgICAgICAgIGluZXRfbnRvcChBRl9JTkVUNiwKKyAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKGEtPmJyb2FkYWRkcikpLT5zaW42X2FkZHIuczZfYWRkciwKKyAgICAgICAgICAgICAgIG50b3BfYnVmLCBzaXplb2YgbnRvcF9idWYpKTsKKyAgICAgICAgaWYgKGEtPmRzdGFkZHIpCisgICAgICAgICAgcHJpbnRmKCJcdFx0RGVzdGluYXRpb24gQWRkcmVzczogJXNcbiIsCisgICAgICAgICAgICBpbmV0X250b3AoQUZfSU5FVDYsCisgICAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luNiAqKShhLT5kc3RhZGRyKSktPnNpbjZfYWRkci5zNl9hZGRyLAorICAgICAgICAgICAgICAgbnRvcF9idWYsIHNpemVvZiBudG9wX2J1ZikpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpbnRmKCJcdEFkZHJlc3MgRmFtaWx5OiBVbmtub3duICglZClcbiIsIGEtPmFkZHItPnNhX2ZhbWlseSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBwcmludGYoIlxuIik7Cit9CisKKy8qIEZyb20gdGNwdHJhY2Vyb3V0ZSAqLworI2RlZmluZSBJUFRPU0JVRkZFUlMJMTIKK3N0YXRpYyBjaGFyICppcHRvcyhicGZfdV9pbnQzMiBpbikKK3sKKwlzdGF0aWMgY2hhciBvdXRwdXRbSVBUT1NCVUZGRVJTXVszKjQrMysxXTsKKwlzdGF0aWMgc2hvcnQgd2hpY2g7CisJdV9jaGFyICpwOworCisJcCA9ICh1X2NoYXIgKikmaW47CisJd2hpY2ggPSAod2hpY2ggKyAxID09IElQVE9TQlVGRkVSUyA/IDAgOiB3aGljaCArIDEpOworCXNwcmludGYob3V0cHV0W3doaWNoXSwgIiVkLiVkLiVkLiVkIiwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSk7CisJcmV0dXJuIG91dHB1dFt3aGljaF07Cit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3Rlc3RzL25vbmJsb2NrdGVzdC5jIGIvbGlicGNhcC0xLjMuMC90ZXN0cy9ub25ibG9ja3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE2YmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGlicGNhcC0xLjMuMC90ZXN0cy9ub25ibG9ja3Rlc3QuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gPQorICAgICJAKCMpIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMFxuXAorVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iOworI2VuZGlmCisKKyNpbmNsdWRlIDxwY2FwLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisKK2NoYXIgKnByb2dyYW1fbmFtZTsKKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyB2b2lkIGNvdW50bWUodV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pOworc3RhdGljIHZvaWQgd2FybmluZyhjb25zdCBjaGFyICosIC4uLik7CitzdGF0aWMgY2hhciAqY29weV9hcmd2KGNoYXIgKiopOworCitzdGF0aWMgcGNhcF90ICpwZDsKKworZXh0ZXJuIGludCBvcHRpbmQ7CitleHRlcm4gaW50IG9wdGVycjsKK2V4dGVybiBjaGFyICpvcHRhcmc7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmVnaXN0ZXIgaW50IG9wOworCWJwZl91X2ludDMyIGxvY2FsbmV0LCBuZXRtYXNrOworCXJlZ2lzdGVyIGNoYXIgKmNwLCAqY21kYnVmLCAqZGV2aWNlOworCXN0cnVjdCBicGZfcHJvZ3JhbSBmY29kZTsKKwljaGFyIGVidWZbUENBUF9FUlJCVUZfU0laRV07CisJaW50IHN0YXR1czsKKwlpbnQgcGFja2V0X2NvdW50OworCisJZGV2aWNlID0gTlVMTDsKKwlpZiAoKGNwID0gc3RycmNocihhcmd2WzBdLCAnLycpKSAhPSBOVUxMKQorCQlwcm9ncmFtX25hbWUgPSBjcCArIDE7CisJZWxzZQorCQlwcm9ncmFtX25hbWUgPSBhcmd2WzBdOworCisJb3B0ZXJyID0gMDsKKwl3aGlsZSAoKG9wID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJpOiIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wKSB7CisKKwkJY2FzZSAnaSc6CisJCQlkZXZpY2UgPSBvcHRhcmc7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKworCWlmIChkZXZpY2UgPT0gTlVMTCkgeworCQlkZXZpY2UgPSBwY2FwX2xvb2t1cGRldihlYnVmKTsKKwkJaWYgKGRldmljZSA9PSBOVUxMKQorCQkJZXJyb3IoIiVzIiwgZWJ1Zik7CisJfQorCSplYnVmID0gJ1wwJzsKKwlwZCA9IHBjYXBfb3Blbl9saXZlKGRldmljZSwgNjU1MzUsIDAsIDEwMDAsIGVidWYpOworCWlmIChwZCA9PSBOVUxMKQorCQllcnJvcigiJXMiLCBlYnVmKTsKKwllbHNlIGlmICgqZWJ1ZikKKwkJd2FybmluZygiJXMiLCBlYnVmKTsKKwlpZiAocGNhcF9sb29rdXBuZXQoZGV2aWNlLCAmbG9jYWxuZXQsICZuZXRtYXNrLCBlYnVmKSA8IDApIHsKKwkJbG9jYWxuZXQgPSAwOworCQluZXRtYXNrID0gMDsKKwkJd2FybmluZygiJXMiLCBlYnVmKTsKKwl9CisJY21kYnVmID0gY29weV9hcmd2KCZhcmd2W29wdGluZF0pOworCisJaWYgKHBjYXBfY29tcGlsZShwZCwgJmZjb2RlLCBjbWRidWYsIDEsIG5ldG1hc2spIDwgMCkKKwkJZXJyb3IoIiVzIiwgcGNhcF9nZXRlcnIocGQpKTsKKworCWlmIChwY2FwX3NldGZpbHRlcihwZCwgJmZjb2RlKSA8IDApCisJCWVycm9yKCIlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7CisJaWYgKHBjYXBfc2V0bm9uYmxvY2socGQsIDEsIGVidWYpID09IC0xKQorCQllcnJvcigicGNhcF9zZXRub25ibG9jayBmYWlsZWQ6ICVzIiwgZWJ1Zik7CisJcHJpbnRmKCJMaXN0ZW5pbmcgb24gJXNcbiIsIGRldmljZSk7CisJZm9yICg7OykgeworCQlwYWNrZXRfY291bnQgPSAwOworCQlzdGF0dXMgPSBwY2FwX2Rpc3BhdGNoKHBkLCAtMSwgY291bnRtZSwKKwkJICAgICh1X2NoYXIgKikmcGFja2V0X2NvdW50KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKHN0YXR1cyAhPSAwKSB7CisJCQlwcmludGYoIiVkIHBhY2tldHMgc2VlbiwgJWQgcGFja2V0cyBjb3VudGVkIGFmdGVyIHBjYXBfZGlzcGF0Y2ggcmV0dXJuc1xuIiwKKwkJCSAgICBzdGF0dXMsIHBhY2tldF9jb3VudCk7CisJCX0KKwl9CisJaWYgKHN0YXR1cyA9PSAtMikgeworCQkvKgorCQkgKiBXZSBnb3QgaW50ZXJydXB0ZWQsIHNvIHBlcmhhcHMgd2UgZGlkbid0CisJCSAqIG1hbmFnZSB0byBmaW5pc2ggYSBsaW5lIHdlIHdlcmUgcHJpbnRpbmcuCisJCSAqIFByaW50IGFuIGV4dHJhIG5ld2xpbmUsIGp1c3QgaW4gY2FzZS4KKwkJICovCisJCXB1dGNoYXIoJ1xuJyk7CisJfQorCSh2b2lkKWZmbHVzaChzdGRvdXQpOworCWlmIChzdGF0dXMgPT0gLTEpIHsKKwkJLyoKKwkJICogRXJyb3IuICBSZXBvcnQgaXQuCisJCSAqLworCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBwY2FwX2xvb3A6ICVzXG4iLAorCQkgICAgcHJvZ3JhbV9uYW1lLCBwY2FwX2dldGVycihwZCkpOworCX0KKwlwY2FwX2Nsb3NlKHBkKTsKKwlleGl0KHN0YXR1cyA9PSAtMSA/IDEgOiAwKTsKK30KKworc3RhdGljIHZvaWQKK2NvdW50bWUodV9jaGFyICp1c2VyLCBjb25zdCBzdHJ1Y3QgcGNhcF9wa3RoZHIgKmgsIGNvbnN0IHVfY2hhciAqc3ApCit7CisJaW50ICpjb3VudGVycCA9IChpbnQgKil1c2VyOworCisJKCpjb3VudGVycCkrKzsKK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJKHZvaWQpZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWyAtc3B0biBdIFsgLWkgaW50ZXJmYWNlIF0gW2V4cHJlc3Npb25dXG4iLAorCSAgICBwcm9ncmFtX25hbWUpOworCWV4aXQoMSk7Cit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCitlcnJvcihjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogIiwgcHJvZ3JhbV9uYW1lKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9CisJZXhpdCgxKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisKKy8qIFZBUkFSR1MgKi8KK3N0YXRpYyB2b2lkCit3YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiBXQVJOSU5HOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KK30KKworLyoKKyAqIENvcHkgYXJnIHZlY3RvciBpbnRvIGEgbmV3IGJ1ZmZlciwgY29uY2F0ZW5hdGluZyBhcmd1bWVudHMgd2l0aCBzcGFjZXMuCisgKi8KK3N0YXRpYyBjaGFyICoKK2NvcHlfYXJndihyZWdpc3RlciBjaGFyICoqYXJndikKK3sKKwlyZWdpc3RlciBjaGFyICoqcDsKKwlyZWdpc3RlciB1X2ludCBsZW4gPSAwOworCWNoYXIgKmJ1ZjsKKwljaGFyICpzcmMsICpkc3Q7CisKKwlwID0gYXJndjsKKwlpZiAoKnAgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKnApCisJCWxlbiArPSBzdHJsZW4oKnArKykgKyAxOworCisJYnVmID0gKGNoYXIgKiltYWxsb2MobGVuKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWVycm9yKCJjb3B5X2FyZ3Y6IG1hbGxvYyIpOworCisJcCA9IGFyZ3Y7CisJZHN0ID0gYnVmOworCXdoaWxlICgoc3JjID0gKnArKykgIT0gTlVMTCkgeworCQl3aGlsZSAoKCpkc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJCTsKKwkJZHN0Wy0xXSA9ICcgJzsKKwl9CisJZHN0Wy0xXSA9ICdcMCc7CisKKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC90ZXN0cy9vcGVudGVzdC5jIGIvbGlicGNhcC0xLjMuMC90ZXN0cy9vcGVudGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTE1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3Rlc3RzL29wZW50ZXN0LmMKQEAgLTAsMCArMSwyMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDAKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisjaWZuZGVmIGxpbnQKK3N0YXRpYyBjb25zdCBjaGFyIGNvcHlyaWdodFtdID0KKyAgICAiQCgjKSBDb3B5cmlnaHQgKGMpIDE5ODgsIDE5ODksIDE5OTAsIDE5OTEsIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTcsIDIwMDBcblwKK1RoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIjsKKyNlbmRpZgorCisjaW5jbHVkZSA8cGNhcC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2RlZmluZSBNQVhJTVVNX1NOQVBMRU4JCTY1NTM1CisKK3N0YXRpYyBjaGFyICpwcm9ncmFtX25hbWU7CisKKy8qIEZvcndhcmRzICovCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pOworc3RhdGljIHZvaWQgd2FybmluZyhjb25zdCBjaGFyICosIC4uLik7CisKK2V4dGVybiBpbnQgb3B0aW5kOworZXh0ZXJuIGludCBvcHRlcnI7CitleHRlcm4gY2hhciAqb3B0YXJnOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXJlZ2lzdGVyIGludCBvcDsKKwlyZWdpc3RlciBjaGFyICpjcCwgKmRldmljZTsKKwlpbnQgZG9yZm1vbiwgZG9wcm9taXNjLCBzbmFwbGVuLCB1c2VhY3RpdmF0ZSwgYnVmc2l6ZTsKKwljaGFyIGVidWZbUENBUF9FUlJCVUZfU0laRV07CisJcGNhcF90ICpwZDsKKwlpbnQgc3RhdHVzID0gMDsKKworCWRldmljZSA9IE5VTEw7CisJZG9yZm1vbiA9IDA7CisJZG9wcm9taXNjID0gMDsKKwlzbmFwbGVuID0gTUFYSU1VTV9TTkFQTEVOOworCWJ1ZnNpemUgPSAwOworCXVzZWFjdGl2YXRlID0gMDsKKwlpZiAoKGNwID0gc3RycmNocihhcmd2WzBdLCAnLycpKSAhPSBOVUxMKQorCQlwcm9ncmFtX25hbWUgPSBjcCArIDE7CisJZWxzZQorCQlwcm9ncmFtX25hbWUgPSBhcmd2WzBdOworCisJb3B0ZXJyID0gMDsKKwl3aGlsZSAoKG9wID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJpOklwczphQjoiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcCkgeworCisJCWNhc2UgJ2knOgorCQkJZGV2aWNlID0gb3B0YXJnOworCQkJYnJlYWs7CisKKwkJY2FzZSAnSSc6CisJCQlkb3JmbW9uID0gMTsKKwkJCXVzZWFjdGl2YXRlID0gMTsJLyogcmVxdWlyZWQgZm9yIHJmbW9uICovCisJCQlicmVhazsKKworCQljYXNlICdwJzoKKwkJCWRvcHJvbWlzYyA9IDE7CisJCQlicmVhazsKKworCQljYXNlICdzJzogeworCQkJY2hhciAqZW5kOworCisJCQlzbmFwbGVuID0gc3RydG9sKG9wdGFyZywgJmVuZCwgMCk7CisJCQlpZiAob3B0YXJnID09IGVuZCB8fCAqZW5kICE9ICdcMCcKKwkJCSAgICB8fCBzbmFwbGVuIDwgMCB8fCBzbmFwbGVuID4gTUFYSU1VTV9TTkFQTEVOKQorCQkJCWVycm9yKCJpbnZhbGlkIHNuYXBsZW4gJXMiLCBvcHRhcmcpOworCQkJZWxzZSBpZiAoc25hcGxlbiA9PSAwKQorCQkJCXNuYXBsZW4gPSBNQVhJTVVNX1NOQVBMRU47CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgJ0InOgorCQkJYnVmc2l6ZSA9IGF0b2kob3B0YXJnKSoxMDI0OworCQkJaWYgKGJ1ZnNpemUgPD0gMCkKKwkJCQllcnJvcigiaW52YWxpZCBwYWNrZXQgYnVmZmVyIHNpemUgJXMiLCBvcHRhcmcpOworCQkJdXNlYWN0aXZhdGUgPSAxOwkvKiByZXF1aXJlZCBmb3IgYnVmc2l6ZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSAnYSc6CisJCQl1c2VhY3RpdmF0ZSA9IDE7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJdXNhZ2UoKTsKKwkJCS8qIE5PVFJFQUNIRUQgKi8KKwkJfQorCX0KKworCWlmICh1c2VhY3RpdmF0ZSkgeworCQlwZCA9IHBjYXBfY3JlYXRlKGRldmljZSwgZWJ1Zik7CisJCWlmIChwZCA9PSBOVUxMKQorCQkJZXJyb3IoIiVzIiwgZWJ1Zik7CisJCXN0YXR1cyA9IHBjYXBfc2V0X3NuYXBsZW4ocGQsIHNuYXBsZW4pOworCQlpZiAoc3RhdHVzICE9IDApCisJCQllcnJvcigiJXM6IHBjYXBfc2V0X3NuYXBsZW4gZmFpbGVkOiAlcyIsCisJCQkgICAgZGV2aWNlLCBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cykpOworCQlpZiAoZG9wcm9taXNjKSB7CisJCQlzdGF0dXMgPSBwY2FwX3NldF9wcm9taXNjKHBkLCAxKTsKKwkJCWlmIChzdGF0dXMgIT0gMCkKKwkJCQllcnJvcigiJXM6IHBjYXBfc2V0X3Byb21pc2MgZmFpbGVkOiAlcyIsCisJCQkJICAgIGRldmljZSwgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwkJfQorCQlpZiAoZG9yZm1vbikgeworCQkJc3RhdHVzID0gcGNhcF9zZXRfcmZtb24ocGQsIDEpOworCQkJaWYgKHN0YXR1cyAhPSAwKQorCQkJCWVycm9yKCIlczogcGNhcF9zZXRfcmZtb24gZmFpbGVkOiAlcyIsCisJCQkJICAgIGRldmljZSwgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwkJfQorCQlzdGF0dXMgPSBwY2FwX3NldF90aW1lb3V0KHBkLCAxMDAwKTsKKwkJaWYgKHN0YXR1cyAhPSAwKQorCQkJZXJyb3IoIiVzOiBwY2FwX3NldF90aW1lb3V0IGZhaWxlZDogJXMiLAorCQkJICAgIGRldmljZSwgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwkJaWYgKGJ1ZnNpemUgIT0gMCkgeworCQkJc3RhdHVzID0gcGNhcF9zZXRfYnVmZmVyX3NpemUocGQsIGJ1ZnNpemUpOworCQkJaWYgKHN0YXR1cyAhPSAwKQorCQkJCWVycm9yKCIlczogcGNhcF9zZXRfYnVmZmVyX3NpemUgZmFpbGVkOiAlcyIsCisJCQkJICAgIGRldmljZSwgcGNhcF9zdGF0dXN0b3N0cihzdGF0dXMpKTsKKwkJfQorCQlzdGF0dXMgPSBwY2FwX2FjdGl2YXRlKHBkKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCS8qCisJCQkgKiBwY2FwX2FjdGl2YXRlKCkgZmFpbGVkLgorCQkJICovCisJCQllcnJvcigiJXM6ICVzXG4oJXMpIiwgZGV2aWNlLAorCQkJICAgIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSwgcGNhcF9nZXRlcnIocGQpKTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgPiAwKSB7CisJCQkvKgorCQkJICogcGNhcF9hY3RpdmF0ZSgpIHN1Y2NlZWRlZCwgYnV0IGl0J3Mgd2FybmluZyB1cworCQkJICogb2YgYSBwcm9ibGVtIGl0IGhhZC4KKwkJCSAqLworCQkJd2FybmluZygiJXM6ICVzXG4oJXMpIiwgZGV2aWNlLAorCQkJICAgIHBjYXBfc3RhdHVzdG9zdHIoc3RhdHVzKSwgcGNhcF9nZXRlcnIocGQpKTsKKwkJfQorCX0gZWxzZSB7CisJCSplYnVmID0gJ1wwJzsKKwkJcGQgPSBwY2FwX29wZW5fbGl2ZShkZXZpY2UsIDY1NTM1LCAwLCAxMDAwLCBlYnVmKTsKKwkJaWYgKHBkID09IE5VTEwpCisJCQllcnJvcigiJXMiLCBlYnVmKTsKKwkJZWxzZSBpZiAoKmVidWYpCisJCQl3YXJuaW5nKCIlcyIsIGVidWYpOworCX0KKwlwY2FwX2Nsb3NlKHBkKTsKKwlleGl0KHN0YXR1cyA8IDAgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCSh2b2lkKWZwcmludGYoc3RkZXJyLAorCSAgICAiVXNhZ2U6ICVzIFsgLUlwYSBdIFsgLWkgaW50ZXJmYWNlIF0gWyAtcyBzbmFwbGVuIF0gWyAtQiBidWZzaXplIF1cbiIsCisJICAgIHByb2dyYW1fbmFtZSk7CisJZXhpdCgxKTsKK30KKworLyogVkFSQVJHUyAqLworc3RhdGljIHZvaWQKK2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9ncmFtX25hbWUpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCSh2b2lkKXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlpZiAoKmZtdCkgeworCQlmbXQgKz0gc3RybGVuKGZtdCk7CisJCWlmIChmbXRbLTFdICE9ICdcbicpCisJCQkodm9pZClmcHV0YygnXG4nLCBzdGRlcnIpOworCX0KKwlleGl0KDEpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworLyogVkFSQVJHUyAqLworc3RhdGljIHZvaWQKK3dhcm5pbmcoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6IFdBUk5JTkc6ICIsIHByb2dyYW1fbmFtZSk7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJKHZvaWQpdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWlmICgqZm10KSB7CisJCWZtdCArPSBzdHJsZW4oZm10KTsKKwkJaWYgKGZtdFstMV0gIT0gJ1xuJykKKwkJCSh2b2lkKWZwdXRjKCdcbicsIHN0ZGVycik7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlicGNhcC0xLjMuMC90ZXN0cy9yZWFjdGl2YXRldGVzdC5jIGIvbGlicGNhcC0xLjMuMC90ZXN0cy9yZWFjdGl2YXRldGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzFhNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLTEuMy4wL3Rlc3RzL3JlYWN0aXZhdGV0ZXN0LmMKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gPQorICAgICJAKCMpIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMFxuXAorVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iOworI2VuZGlmCisKKyNpbmNsdWRlIDxwY2FwLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyB2b2lkIGVycm9yKGNvbnN0IGNoYXIgKiwgLi4uKTsKKworaW50CittYWluKHZvaWQpCit7CisJY2hhciBlYnVmW1BDQVBfRVJSQlVGX1NJWkVdOworCXBjYXBfdCAqcGQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwlwZCA9IHBjYXBfb3Blbl9saXZlKCJsbzAiLCA2NTUzNSwgMCwgMTAwMCwgZWJ1Zik7CisJaWYgKHBkID09IE5VTEwpIHsKKwkJcGQgPSBwY2FwX29wZW5fbGl2ZSgibG8iLCA2NTUzNSwgMCwgMTAwMCwgZWJ1Zik7CisJCWlmIChwZCA9PSBOVUxMKSB7CisJCQllcnJvcigiTmVpdGhlciBsbzAgbm9yIGxvIGNvdWxkIGJlIG9wZW5lZDogJXMiLAorCQkJICAgIGVidWYpOworCQkJcmV0dXJuIDI7CisJCX0KKwl9CisJc3RhdHVzID0gcGNhcF9hY3RpdmF0ZShwZCk7CisJaWYgKHN0YXR1cyAhPSBQQ0FQX0VSUk9SX0FDVElWQVRFRCkgeworCQlpZiAoc3RhdHVzID09IDApCisJCQllcnJvcigicGNhcF9hY3RpdmF0ZSgpIG9mIG9wZW5lZCBwY2FwX3Qgc3VjY2VlZGVkIik7CisJCWVsc2UgaWYgKHN0YXR1cyA9PSBQQ0FQX0VSUk9SKQorCQkJZXJyb3IoInBjYXBfYWN0aXZhdGUoKSBvZiBvcGVuZWQgcGNhcF90IGZhaWxlZCB3aXRoICVzLCBub3QgUENBUF9FUlJPUl9BQ1RJVkFURUQiLAorCQkJICAgIHBjYXBfZ2V0ZXJyKHBkKSk7CisJCWVsc2UKKwkJCWVycm9yKCJwY2FwX2FjdGl2YXRlKCkgb2Ygb3BlbmVkIHBjYXBfdCBmYWlsZWQgd2l0aCAlcywgbm90IFBDQVBfRVJST1JfQUNUSVZBVEVEIiwKKwkJCSAgICBwY2FwX3N0YXR1c3Rvc3RyKHN0YXR1cykpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogVkFSQVJHUyAqLworc3RhdGljIHZvaWQKK2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwkodm9pZClmcHJpbnRmKHN0ZGVyciwgInJlYWN0aXZhdGV0ZXN0OiAiKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9CisJZXhpdCgxKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CmRpZmYgLS1naXQgYS9saWJwY2FwLTEuMy4wL3Rlc3RzL3NlbHBvbGx0ZXN0LmMgYi9saWJwY2FwLTEuMy4wL3Rlc3RzL3NlbHBvbGx0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0ZmI1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAtMS4zLjAvdGVzdHMvc2VscG9sbHRlc3QuYwpAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdDogKDEpIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGlvbnMKKyAqIHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5LCAoMikKKyAqIGRpc3RyaWJ1dGlvbnMgaW5jbHVkaW5nIGJpbmFyeSBjb2RlIGluY2x1ZGUgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgKiB0aGlzIHBhcmFncmFwaCBpbiBpdHMgZW50aXJldHkgaW4gdGhlIGRvY3VtZW50YXRpb24gb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24sIGFuZCAoMykgYWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nCisgKiBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogYGBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsCisgKiBMYXdyZW5jZSBCZXJrZWxleSBMYWJvcmF0b3J5IGFuZCBpdHMgY29udHJpYnV0b3JzLicnIE5laXRoZXIgdGhlIG5hbWUgb2YKKyAqIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlCisgKiBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICovCisKKyNpZm5kZWYgbGludAorc3RhdGljIGNvbnN0IGNoYXIgY29weXJpZ2h0W10gPQorICAgICJAKCMpIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MCwgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMjAwMFxuXAorVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4iOworI2VuZGlmCisKKyNpbmNsdWRlIDxwY2FwLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisKK2NoYXIgKnByb2dyYW1fbmFtZTsKKworLyogRm9yd2FyZHMgKi8KK3N0YXRpYyB2b2lkIGNvdW50bWUodV9jaGFyICosIGNvbnN0IHN0cnVjdCBwY2FwX3BrdGhkciAqLCBjb25zdCB1X2NoYXIgKik7CitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpOworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pOworc3RhdGljIHZvaWQgd2FybmluZyhjb25zdCBjaGFyICosIC4uLik7CitzdGF0aWMgY2hhciAqY29weV9hcmd2KGNoYXIgKiopOworCitzdGF0aWMgcGNhcF90ICpwZDsKKworZXh0ZXJuIGludCBvcHRpbmQ7CitleHRlcm4gaW50IG9wdGVycjsKK2V4dGVybiBjaGFyICpvcHRhcmc7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmVnaXN0ZXIgaW50IG9wOworCWJwZl91X2ludDMyIGxvY2FsbmV0LCBuZXRtYXNrOworCXJlZ2lzdGVyIGNoYXIgKmNwLCAqY21kYnVmLCAqZGV2aWNlOworCWludCBkb3NlbGVjdCwgZG9wb2xsLCBkb3RpbWVvdXQsIGRvbm9uYmxvY2s7CisJc3RydWN0IGJwZl9wcm9ncmFtIGZjb2RlOworCWNoYXIgZWJ1ZltQQ0FQX0VSUkJVRl9TSVpFXTsKKwlpbnQgc2VsZWN0YWJsZV9mZDsKKwlpbnQgc3RhdHVzOworCWludCBwYWNrZXRfY291bnQ7CisKKwlkZXZpY2UgPSBOVUxMOworCWRvc2VsZWN0ID0gMDsKKwlkb3BvbGwgPSAwOworCWRvdGltZW91dCA9IDA7CisJZG9ub25ibG9jayA9IDA7CisJaWYgKChjcCA9IHN0cnJjaHIoYXJndlswXSwgJy8nKSkgIT0gTlVMTCkKKwkJcHJvZ3JhbV9uYW1lID0gY3AgKyAxOworCWVsc2UKKwkJcHJvZ3JhbV9uYW1lID0gYXJndlswXTsKKworCW9wdGVyciA9IDA7CisJd2hpbGUgKChvcCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaTpzcHRuIikpICE9IC0xKSB7CisJCXN3aXRjaCAob3ApIHsKKworCQljYXNlICdpJzoKKwkJCWRldmljZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3MnOgorCQkJZG9zZWxlY3QgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAncCc6CisJCQlkb3BvbGwgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAndCc6CisJCQlkb3RpbWVvdXQgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSAnbic6CisJCQlkb25vbmJsb2NrID0gMTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJfQorCisJaWYgKGRvc2VsZWN0ICYmIGRvcG9sbCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInNlbHBvbGx0ZXN0OiBjaG9vc2Ugc2VsZWN0ICgtcykgb3IgcG9sbCAoLXApLCBidXQgbm90IGJvdGhcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGRvdGltZW91dCAmJiAhZG9zZWxlY3QgJiYgIWRvcG9sbCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInNlbHBvbGx0ZXN0OiB0aW1lb3V0ICgtdCkgcmVxdWlyZXMgc2VsZWN0ICgtcykgb3IgcG9sbCAoLXApXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChkZXZpY2UgPT0gTlVMTCkgeworCQlkZXZpY2UgPSBwY2FwX2xvb2t1cGRldihlYnVmKTsKKwkJaWYgKGRldmljZSA9PSBOVUxMKQorCQkJZXJyb3IoIiVzIiwgZWJ1Zik7CisJfQorCSplYnVmID0gJ1wwJzsKKwlwZCA9IHBjYXBfb3Blbl9saXZlKGRldmljZSwgNjU1MzUsIDAsIDEwMDAsIGVidWYpOworCWlmIChwZCA9PSBOVUxMKQorCQllcnJvcigiJXMiLCBlYnVmKTsKKwllbHNlIGlmICgqZWJ1ZikKKwkJd2FybmluZygiJXMiLCBlYnVmKTsKKwlpZiAocGNhcF9sb29rdXBuZXQoZGV2aWNlLCAmbG9jYWxuZXQsICZuZXRtYXNrLCBlYnVmKSA8IDApIHsKKwkJbG9jYWxuZXQgPSAwOworCQluZXRtYXNrID0gMDsKKwkJd2FybmluZygiJXMiLCBlYnVmKTsKKwl9CisJY21kYnVmID0gY29weV9hcmd2KCZhcmd2W29wdGluZF0pOworCisJaWYgKHBjYXBfY29tcGlsZShwZCwgJmZjb2RlLCBjbWRidWYsIDEsIG5ldG1hc2spIDwgMCkKKwkJZXJyb3IoIiVzIiwgcGNhcF9nZXRlcnIocGQpKTsKKworCWlmIChwY2FwX3NldGZpbHRlcihwZCwgJmZjb2RlKSA8IDApCisJCWVycm9yKCIlcyIsIHBjYXBfZ2V0ZXJyKHBkKSk7CisJaWYgKHBjYXBfZ2V0X3NlbGVjdGFibGVfZmQocGQpID09IC0xKQorCQllcnJvcigicGNhcF9nZXRfc2VsZWN0YWJsZV9mZCgpIGZhaWxzIik7CisJaWYgKGRvbm9uYmxvY2spIHsKKwkJaWYgKHBjYXBfc2V0bm9uYmxvY2socGQsIDEsIGVidWYpID09IC0xKQorCQkJZXJyb3IoInBjYXBfc2V0bm9uYmxvY2sgZmFpbGVkOiAlcyIsIGVidWYpOworCX0KKwlzZWxlY3RhYmxlX2ZkID0gcGNhcF9nZXRfc2VsZWN0YWJsZV9mZChwZCk7CisJcHJpbnRmKCJMaXN0ZW5pbmcgb24gJXNcbiIsIGRldmljZSk7CisJaWYgKGRvc2VsZWN0KSB7CisJCWZvciAoOzspIHsKKwkJCWZkX3NldCBzZXRyZWFkLCBzZXRleGNlcHQ7CisJCQlzdHJ1Y3QgdGltZXZhbCBzZWx0aW1lb3V0OworCisJCQlGRF9aRVJPKCZzZXRyZWFkKTsKKwkJCUZEX1NFVChzZWxlY3RhYmxlX2ZkLCAmc2V0cmVhZCk7CisJCQlGRF9aRVJPKCZzZXRleGNlcHQpOworCQkJRkRfU0VUKHNlbGVjdGFibGVfZmQsICZzZXRleGNlcHQpOworCQkJaWYgKGRvdGltZW91dCkgeworCQkJCXNlbHRpbWVvdXQudHZfc2VjID0gMDsKKwkJCQlzZWx0aW1lb3V0LnR2X3VzZWMgPSAxMDAwOworCQkJCXN0YXR1cyA9IHNlbGVjdChzZWxlY3RhYmxlX2ZkICsgMSwgJnNldHJlYWQsCisJCQkJICAgIE5VTEwsICZzZXRleGNlcHQsICZzZWx0aW1lb3V0KTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gc2VsZWN0KHNlbGVjdGFibGVfZmQgKyAxLCAmc2V0cmVhZCwKKwkJCQkgICAgTlVMTCwgJnNldGV4Y2VwdCwgTlVMTCk7CisJCQl9CisJCQlpZiAoc3RhdHVzID09IC0xKSB7CisJCQkJcHJpbnRmKCJTZWxlY3QgcmV0dXJucyBlcnJvciAoJXMpXG4iLAorCQkJCSAgICBzdHJlcnJvcihlcnJubykpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoc3RhdHVzID09IDApCisJCQkJCXByaW50ZigiU2VsZWN0IHRpbWVkIG91dDogIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIlNlbGVjdCByZXR1cm5lZCBhIGRlc2NyaXB0b3I6ICIpOworCQkJCWlmIChGRF9JU1NFVChzZWxlY3RhYmxlX2ZkLCAmc2V0cmVhZCkpCisJCQkJCXByaW50ZigicmVhZGFibGUsICIpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCJub3QgcmVhZGFibGUsICIpOworCQkJCWlmIChGRF9JU1NFVChzZWxlY3RhYmxlX2ZkLCAmc2V0ZXhjZXB0KSkKKwkJCQkJcHJpbnRmKCJleGNlcHRpb25hbCBjb25kaXRpb25cbiIpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCJubyBleGNlcHRpb25hbCBjb25kaXRpb25cbiIpOworCQkJCXBhY2tldF9jb3VudCA9IDA7CisJCQkJc3RhdHVzID0gcGNhcF9kaXNwYXRjaChwZCwgLTEsIGNvdW50bWUsCisJCQkJICAgICh1X2NoYXIgKikmcGFja2V0X2NvdW50KTsKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CisJCQkJcHJpbnRmKCIlZCBwYWNrZXRzIHNlZW4sICVkIHBhY2tldHMgY291bnRlZCBhZnRlciBzZWxlY3QgcmV0dXJuc1xuIiwKKwkJCQkgICAgc3RhdHVzLCBwYWNrZXRfY291bnQpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChkb3BvbGwpIHsKKwkJZm9yICg7OykgeworCQkJc3RydWN0IHBvbGxmZCBmZDsKKwkJCWludCBwb2xsdGltZW91dDsKKworCQkJZmQuZmQgPSBzZWxlY3RhYmxlX2ZkOworCQkJZmQuZXZlbnRzID0gUE9MTElOOworCQkJaWYgKGRvdGltZW91dCkKKwkJCQlwb2xsdGltZW91dCA9IDE7CisJCQllbHNlCisJCQkJcG9sbHRpbWVvdXQgPSAtMTsKKwkJCXN0YXR1cyA9IHBvbGwoJmZkLCAxLCBwb2xsdGltZW91dCk7CisJCQlpZiAoc3RhdHVzID09IC0xKSB7CisJCQkJcHJpbnRmKCJQb2xsIHJldHVybnMgZXJyb3IgKCVzKVxuIiwKKwkJCQkgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHN0YXR1cyA9PSAwKQorCQkJCQlwcmludGYoIlBvbGwgdGltZWQgb3V0XG4iKTsKKwkJCQllbHNlIHsKKwkJCQkJcHJpbnRmKCJQb2xsIHJldHVybmVkIGEgZGVzY3JpcHRvcjogIik7CisJCQkJCWlmIChmZC5yZXZlbnRzICYgUE9MTElOKQorCQkJCQkJcHJpbnRmKCJyZWFkYWJsZSwgIik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50Zigibm90IHJlYWRhYmxlLCAiKTsKKwkJCQkJaWYgKGZkLnJldmVudHMgJiBQT0xMRVJSKQorCQkJCQkJcHJpbnRmKCJleGNlcHRpb25hbCBjb25kaXRpb24sICIpOworCQkJCQllbHNlCisJCQkJCQlwcmludGYoIm5vIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbiwgIik7CisJCQkJCWlmIChmZC5yZXZlbnRzICYgUE9MTEhVUCkKKwkJCQkJCXByaW50ZigiZGlzY29ubmVjdCwgIik7CisJCQkJCWVsc2UKKwkJCQkJCXByaW50Zigibm8gZGlzY29ubmVjdCwgIik7CisJCQkJCWlmIChmZC5yZXZlbnRzICYgUE9MTE5WQUwpCisJCQkJCQlwcmludGYoImludmFsaWRcbiIpOworCQkJCQllbHNlCisJCQkJCQlwcmludGYoIm5vdCBpbnZhbGlkXG4iKTsKKwkJCQl9CisJCQkJcGFja2V0X2NvdW50ID0gMDsKKwkJCQlzdGF0dXMgPSBwY2FwX2Rpc3BhdGNoKHBkLCAtMSwgY291bnRtZSwKKwkJCQkgICAgKHVfY2hhciAqKSZwYWNrZXRfY291bnQpOworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsKKwkJCQlwcmludGYoIiVkIHBhY2tldHMgc2VlbiwgJWQgcGFja2V0cyBjb3VudGVkIGFmdGVyIHBvbGwgcmV0dXJuc1xuIiwKKwkJCQkgICAgc3RhdHVzLCBwYWNrZXRfY291bnQpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZm9yICg7OykgeworCQkJcGFja2V0X2NvdW50ID0gMDsKKwkJCXN0YXR1cyA9IHBjYXBfZGlzcGF0Y2gocGQsIC0xLCBjb3VudG1lLAorCQkJICAgICh1X2NoYXIgKikmcGFja2V0X2NvdW50KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJcHJpbnRmKCIlZCBwYWNrZXRzIHNlZW4sICVkIHBhY2tldHMgY291bnRlZCBhZnRlciBwY2FwX2Rpc3BhdGNoIHJldHVybnNcbiIsCisJCQkgICAgc3RhdHVzLCBwYWNrZXRfY291bnQpOworCQl9CisJfQorCWlmIChzdGF0dXMgPT0gLTIpIHsKKwkJLyoKKwkJICogV2UgZ290IGludGVycnVwdGVkLCBzbyBwZXJoYXBzIHdlIGRpZG4ndAorCQkgKiBtYW5hZ2UgdG8gZmluaXNoIGEgbGluZSB3ZSB3ZXJlIHByaW50aW5nLgorCQkgKiBQcmludCBhbiBleHRyYSBuZXdsaW5lLCBqdXN0IGluIGNhc2UuCisJCSAqLworCQlwdXRjaGFyKCdcbicpOworCX0KKwkodm9pZClmZmx1c2goc3Rkb3V0KTsKKwlpZiAoc3RhdHVzID09IC0xKSB7CisJCS8qCisJCSAqIEVycm9yLiAgUmVwb3J0IGl0LgorCQkgKi8KKwkJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogcGNhcF9sb29wOiAlc1xuIiwKKwkJICAgIHByb2dyYW1fbmFtZSwgcGNhcF9nZXRlcnIocGQpKTsKKwl9CisJcGNhcF9jbG9zZShwZCk7CisJZXhpdChzdGF0dXMgPT0gLTEgPyAxIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3VudG1lKHVfY2hhciAqdXNlciwgY29uc3Qgc3RydWN0IHBjYXBfcGt0aGRyICpoLCBjb25zdCB1X2NoYXIgKnNwKQoreworCWludCAqY291bnRlcnAgPSAoaW50ICopdXNlcjsKKworCSgqY291bnRlcnApKys7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZSh2b2lkKQoreworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFsgLXNwdG4gXSBbIC1pIGludGVyZmFjZSBdIFtleHByZXNzaW9uXVxuIiwKKwkgICAgcHJvZ3JhbV9uYW1lKTsKKwlleGl0KDEpOworfQorCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAorZXJyb3IoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJKHZvaWQpdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWlmICgqZm10KSB7CisJCWZtdCArPSBzdHJsZW4oZm10KTsKKwkJaWYgKGZtdFstMV0gIT0gJ1xuJykKKwkJCSh2b2lkKWZwdXRjKCdcbicsIHN0ZGVycik7CisJfQorCWV4aXQoMSk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKiBWQVJBUkdTICovCitzdGF0aWMgdm9pZAord2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJKHZvaWQpZnByaW50ZihzdGRlcnIsICIlczogV0FSTklORzogIiwgcHJvZ3JhbV9uYW1lKTsKKwl2YV9zdGFydChhcCwgZm10KTsKKwkodm9pZCl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJaWYgKCpmbXQpIHsKKwkJZm10ICs9IHN0cmxlbihmbXQpOworCQlpZiAoZm10Wy0xXSAhPSAnXG4nKQorCQkJKHZvaWQpZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwl9Cit9CisKKy8qCisgKiBDb3B5IGFyZyB2ZWN0b3IgaW50byBhIG5ldyBidWZmZXIsIGNvbmNhdGVuYXRpbmcgYXJndW1lbnRzIHdpdGggc3BhY2VzLgorICovCitzdGF0aWMgY2hhciAqCitjb3B5X2FyZ3YocmVnaXN0ZXIgY2hhciAqKmFyZ3YpCit7CisJcmVnaXN0ZXIgY2hhciAqKnA7CisJcmVnaXN0ZXIgdV9pbnQgbGVuID0gMDsKKwljaGFyICpidWY7CisJY2hhciAqc3JjLCAqZHN0OworCisJcCA9IGFyZ3Y7CisJaWYgKCpwID09IDApCisJCXJldHVybiAwOworCisJd2hpbGUgKCpwKQorCQlsZW4gKz0gc3RybGVuKCpwKyspICsgMTsKKworCWJ1ZiA9IChjaGFyICopbWFsbG9jKGxlbik7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQllcnJvcigiY29weV9hcmd2OiBtYWxsb2MiKTsKKworCXAgPSBhcmd2OworCWRzdCA9IGJ1ZjsKKwl3aGlsZSAoKHNyYyA9ICpwKyspICE9IE5VTEwpIHsKKwkJd2hpbGUgKCgqZHN0KysgPSAqc3JjKyspICE9ICdcMCcpCisJCQk7CisJCWRzdFstMV0gPSAnICc7CisJfQorCWRzdFstMV0gPSAnXDAnOworCisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2xpYnBjYXAudGFyLmd6IGIvbGlicGNhcC50YXIuZ3oKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4ZGMzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAudGFyLmd6CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYnBjYXAudXJsIGIvbGlicGNhcC51cmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiZmFkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnBjYXAudXJsCkBAIC0wLDAgKzEgQEAKK2h0dHA6Ly93d3cudGNwZHVtcC5vcmcvcmVsZWFzZS9saWJwY2FwLTEuMy4wLnRhci5negpkaWZmIC0tZ2l0IGEvbGlicGNhcC52ZXJzaW9uIGIvbGlicGNhcC52ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYmIyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJwY2FwLnZlcnNpb24KQEAgLTAsMCArMSBAQAorMS4zLjAK