ZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDEzMmIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9LY29uZmlnCkBAIC0wLDAgKzEsNzUgQEAKKworbWVudSAiSTJPIGRldmljZSBzdXBwb3J0IgorCitjb25maWcgSTJPCisJdHJpc3RhdGUgIkkyTyBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJCisJLS0taGVscC0tLQorCSAgVGhlIEludGVsbGlnZW50IElucHV0L091dHB1dCAoSTJPKSBhcmNoaXRlY3R1cmUgYWxsb3dzIGhhcmR3YXJlCisJICBkcml2ZXJzIHRvIGJlIHNwbGl0IGludG8gdHdvIHBhcnRzOiBhbiBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljCisJICBtb2R1bGUgY2FsbGVkIHRoZSBPU00gYW5kIGFuIGhhcmR3YXJlIHNwZWNpZmljIG1vZHVsZSBjYWxsZWQgdGhlCisJICBIRE0uIFRoZSBPU00gY2FuIHRhbGsgdG8gYSB3aG9sZSByYW5nZSBvZiBIRE0ncywgYW5kIGlkZWFsbHkgdGhlCisJICBIRE0ncyBhcmUgbm90IE9TIGRlcGVuZGVudC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBzYW1lIEhETSBkcml2ZXIgdG8KKwkgIGJlIHVzZWQgdW5kZXIgZGlmZmVyZW50IG9wZXJhdGluZyBzeXN0ZW1zIGlmIHRoZSByZWxldmFudCBPU00gaXMgaW4KKwkgIHBsYWNlLiBJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrLCB5b3UgbmVlZCB0byBoYXZlIGFuIEkyTyBpbnRlcmZhY2UKKwkgIGFkYXB0ZXIgY2FyZCBpbiB5b3VyIGNvbXB1dGVyLiBUaGlzIGNhcmQgY29udGFpbnMgYSBzcGVjaWFsIEkvTworCSAgcHJvY2Vzc29yIChJT1ApLCB0aHVzIGFsbG93aW5nIGhpZ2ggc3BlZWRzIHNpbmNlIHRoZSBDUFUgZG9lcyBub3QKKwkgIGhhdmUgdG8gZGVhbCB3aXRoIEkvTy4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGdldCBhIGNob2ljZSBvZiBpbnRlcmZhY2UgYWRhcHRlcgorCSAgZHJpdmVycyBhbmQgT1NNJ3Mgd2l0aCB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KKworCSAgVG8gY29tcGlsZSB0aGlzIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlcyB3aWxsIGJlIGNhbGxlZCBpMm9fY29yZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEkyT19DT05GSUcKKwl0cmlzdGF0ZSAiSTJPIENvbmZpZ3VyYXRpb24gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBDSSAmJiBJMk8KKwloZWxwCisJICBTYXkgWSBmb3Igc3VwcG9ydCBvZiB0aGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSBJMk8gYWRhcHRlcnMuCisJICBJZiB5b3UgaGF2ZSBhIFJBSUQgY29udHJvbGxlciBmcm9tIEFkYXB0ZWMgYW5kIHlvdSB3YW50IHRvIHVzZSB0aGUKKwkgIHJhaWR1dGlscyB0byBtYW5hZ2UgeW91ciBSQUlEIGFycmF5LCB5b3UgaGF2ZSB0byBzYXkgWSBoZXJlLgorCisJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTJvX2NvbmZpZy4KKworY29uZmlnIEkyT19CTE9DSworCXRyaXN0YXRlICJJMk8gQmxvY2sgT1NNIgorCWRlcGVuZHMgb24gSTJPCisJaGVscAorCSAgSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgSTJPIEJsb2NrIE9TTS4gVGhlIEJsb2NrIE9TTSBwcmVzZW50cyBkaXNrCisJICBhbmQgb3RoZXIgc3RydWN0dXJlZCBibG9jayBkZXZpY2VzIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBJZiB5b3UKKwkgIGFyZSB1c2luZyBhbiBSQUlEIGNvbnRyb2xsZXIsIHlvdSBjb3VsZCBhY2Nlc3MgdGhlIGFycmF5IG9ubHkgYnkKKwkgIHRoZSBCbG9jayBPU00gZHJpdmVyLiBCdXQgaXQgaXMgcG9zc2libGUgdG8gYWNjZXNzIHRoZSBzaW5nbGUgZGlza3MKKwkgIGJ5IHRoZSBTQ1NJIE9TTSBkcml2ZXIsIGZvciBleGFtcGxlIHRvIG1vbml0b3IgdGhlIGRpc2tzLgorCisJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTJvX2Jsb2NrLgorCitjb25maWcgSTJPX1NDU0kKKwl0cmlzdGF0ZSAiSTJPIFNDU0kgT1NNIgorCWRlcGVuZHMgb24gSTJPICYmIFNDU0kKKwloZWxwCisJICBBbGxvd3MgZGlyZWN0IFNDU0kgYWNjZXNzIHRvIFNDU0kgZGV2aWNlcyBvbiBhIFNDU0kgb3IgRmlicmVDaGFubmVsCisJICBJMk8gY29udHJvbGxlci4gWW91IGNhbiB1c2UgYm90aCB0aGUgU0NTSSBhbmQgQmxvY2sgT1NNIHRvZ2V0aGVyIGlmCisJICB5b3Ugd2lzaC4gVG8gYWNjZXNzIGEgUkFJRCBhcnJheSwgeW91IG11c3QgdXNlIHRoZSBCbG9jayBPU00gZHJpdmVyLgorCSAgQnV0IHlvdSBjb3VsZCB1c2UgdGhlIFNDU0kgT1NNIGRyaXZlciB0byBtb25pdG9yIHRoZSBzaW5nbGUgZGlza3MuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpMm9fc2NzaS4KKworY29uZmlnIEkyT19QUk9DCisJdHJpc3RhdGUgIkkyTyAvcHJvYyBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJPCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgYW5kIHRvICIvcHJvYyBmaWxlIHN5c3RlbSBzdXBwb3J0IiwgeW91IHdpbGwgYmUKKwkgIGFibGUgdG8gcmVhZCBJMk8gcmVsYXRlZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSB2aXJ0dWFsIGRpcmVjdG9yeQorCSAgL3Byb2MvaTJvLgorCisJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgaTJvX3Byb2MuCisKK2VuZG1lbnUKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9NYWtlZmlsZSBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiYzZjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBJMk8gT1NNLgorIworIyBOb3RlIDogYXQgdGhpcyBwb2ludCwgdGhlc2UgZmlsZXMgYXJlIGNvbXBpbGVkIG9uIGFsbCBzeXN0ZW1zLgorIyBJbiB0aGUgZnV0dXJlLCBzb21lIG9mIHRoZXNlIHNob3VsZCBiZSBidWlsdCBjb25kaXRpb25hbGx5LgorIworCitpMm9fY29yZS15CQkrPSBpb3AubyBkcml2ZXIubyBkZXZpY2UubyBkZWJ1Zy5vIHBjaS5vIGV4ZWMtb3NtLm8KK29iai0kKENPTkZJR19JMk8pCSs9IGkyb19jb3JlLm8KK29iai0kKENPTkZJR19JMk9fQ09ORklHKSs9IGkyb19jb25maWcubworb2JqLSQoQ09ORklHX0kyT19CTE9DSykJKz0gaTJvX2Jsb2NrLm8KK29iai0kKENPTkZJR19JMk9fU0NTSSkJKz0gaTJvX3Njc2kubworb2JqLSQoQ09ORklHX0kyT19QUk9DKQkrPSBpMm9fcHJvYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL1JFQURNRSBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MWY4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL1JFQURNRQpAQCAtMCwwICsxLDk4IEBACisKKwlMaW51eCBJMk8gU3VwcG9ydAkoYykgQ29weXJpZ2h0IDE5OTkgUmVkIEhhdCBTb2Z0d2FyZQorCQkJCQlhbmQgb3RoZXJzLgorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworQVVUSE9SUyAoc28gZmFyKQorCitBbGFuIENveCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZC4KKwlDb3JlIGNvZGUsIFNDU0kgYW5kIEJsb2NrIE9TTXMKKworU3RldmUgUmFsc3RvbiwgTFNJIExvZ2ljIENvcnAuCisJRGVidWdnaW5nIFNDU0kgYW5kIEJsb2NrIE9TTQorCitEZWVwYWsgU2F4ZW5hLCBJbnRlbCBDb3JwLgorCVZhcmlvdXMgY29yZS9ibG9jayBleHRlbnNpb25zCisJL3Byb2MgaW50ZXJmYWNlLCBidWcgZml4ZXMKKwlJb2N0bCBpbnRlcmZhY2VzIGZvciBjb250cm9sCisJRGVidWdnaW5nIExBTiBPU00KKworUGhpbGlwIFJ1bXBmCisJRml4ZWQgYXNzb3J0ZWQgZHVtYiBTTVAgbG9ja2luZyBidWdzCisKK0p1aGEgU2lldmFuZW4sIFVuaXZlcnNpdHkgb2YgSGVsc2lua2kgRmlubGFuZAorCUxBTiBPU00gY29kZQorCS9wcm9jIGludGVyZmFjZSB0byBMQU4gY2xhc3MKKwlCdWcgZml4ZXMKKwlDb3JlIGNvZGUgZXh0ZW5zaW9ucworCitBdXZvIEjka2tpbmVuLCBVbml2ZXJzaXR5IG9mIEhlbHNpbmtpIEZpbmxhbmQKKwlMQU4gT1NNIGNvZGUKKwkvUHJvYyBpbnRlcmZhY2UgdG8gTEFOIGNsYXNzCisJQnVnIGZpeGVzCisJQ29yZSBjb2RlIGV4dGVuc2lvbnMKKworVGFuZWxpIFbkaORrYW5nYXMsIFVuaXZlcnNpdHkgb2YgSGVsc2lua2kgRmlubGFuZAorCUZpeGVzIHRvIGkyb19jb25maWcKKworQ1JFRElUUworCisJVGhpcyB3b3JrIHdhcyBtYWRlIHBvc3NpYmxlIGJ5IAorCitSZWQgSGF0IFNvZnR3YXJlCisJRnVuZGluZyBmb3IgdGhlIEJ1aWxkaW5nICMzIHBhcnQgb2YgdGhlIHByb2plY3QKKworU3ltYmlvcyBMb2dpYyAoTm93IExTSSkKKwlIb3N0IGFkYXB0ZXJzLCBoaW50cywga25vd24gdG8gd29yayBwbGF0Zm9ybXMgd2hlbiBJIGhpdAorCWNvbXBhdGliaWxpdHkgcHJvYmxlbXMKKworQm94SGlsbCBDb3Jwb3JhdGlvbgorCUxvYW4gb2YgaW5pdGlhbCBGaWJyZUNoYW5uZWwgZGlzayBhcnJheSB1c2VkIGZvciBkZXZlbG9wbWVudCB3b3JrLgorCitFdXJvcGVhbiBDb21pc3Npb24KKwlGdW5kaW5nIHRoZSB3b3JrIGRvbmUgYnkgdGhlIFVuaXZlcnNpdHkgb2YgSGVsc2lua2kKKworU3lzS29ubmVjdAorICAgICAgICBMb2FuIG9mIEZEREkgYW5kIEdpZ2FiaXQgRXRoZXJuZXQgY2FyZHMKKworQVNVU1RlSworICAgICAgICBMb2FuIG9mIEkyTyBtb3RoZXJib2FyZCAKKworU1RBVFVTOgorCitvCVRoZSBjb3JlIHNldHVwIHdvcmtzIHdpdGhpbiBsaW1pdHMuCitvCVRoZSBzY3NpIGxheWVyIHNlZW1zIHRvIGFsbW9zdCB3b3JrLiAKKyAgICAgICAgICAgSSdtIHN0aWxsIGNoYXNpbmcgZG93biB0aGUgaGFuZyBidWcuCitvCVRoZSBibG9jayBPU00gaXMgbW9zdGx5IGZ1bmN0aW9uYWwKK28JTEFOIE9TTSB3b3JrcyB3aXRoIEZEREkgYW5kIEV0aGVybmV0IGNhcmRzLgorCitUTyBETzoKKworR2VuZXJhbDoKK28JUHJvdmlkZSBoaWRkZW4gYWRkcmVzcyBzcGFjZSBpZiBhc2tlZAorbwlMb25nIHRlcm0gbWVzc2FnZSBmbG93IGNvbnRyb2wKK28JUENJIElPUCdzIHdpdGhvdXQgaW50ZXJydXB0cyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQKK28JUHVzaCBGQUlMIGhhbmRsaW5nIGludG8gdGhlIGNvcmUKK28JRERNIGNvbnRyb2wgaW50ZXJmYWNlcyBmb3IgbW9kdWxlIGxvYWQgZXRjCitvICAgICAgIEFkZCBJMk8gMi4wIHN1cHBvcnQgKERlZmZlcmVkIHRvIDIuNSBrZXJuZWwpCisKK0Jsb2NrOgorbwlNdWx0aXBsZSBtYWpvciBudW1iZXJzCitvCVJlYWQgYWhlYWQgYW5kIGNhY2hlIGhhbmRsaW5nIHN0dWZmLiBUYWxrIHRvIEluZ28gYW5kIHBlb3BsZQorbwlQb3dlciBtYW5hZ2VtZW50CitvCUZpbmlzaCBNZWRpYSBjaGFuZ2VycworCitTQ1NJOgorbwlGaW5kIHRoZSByaWdodCB3YXkgdG8gYXNzb2NpYXRlIGRyaXZlcy9sdW5zL2J1c3NlcworCitMYW46CQorbwlQZXJmb3JtYW5jZSB0dW5pbmcKK28JVGVzdCBGaWJyZSBDaGFubmVsIGNvZGUKKworVGFwZToKK28JQW55b25lIHNlZW4gYW55dGhpbmcgaW1wbGVtZW50aW5nIHRoaXMgPworICAgICAgICAgICAoRC5TOiBXaWxsIGF0dGVtcHQgdG8gZG8gc28gaWYgc3BhcmUgY3ljbGVzIHBlcm1pdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vUkVBRE1FLmlvY3RsIGIvZHJpdmVycy9tZXNzYWdlL2kyby9SRUFETUUuaW9jdGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkZDA4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vUkVBRE1FLmlvY3RsCkBAIC0wLDAgKzEsMzk0IEBACisKK0xpbnV4IEkyTyBVc2VyIFNwYWNlIEludGVyZmFjZQorcmV2IDAuMyAtIDA0LzIwLzk5CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRGVlcGFrIFNheGVuYShkZWVwYWtAcGxleGl0eS5uZXQpCitDdXJyZW50bHkgbWFpbnRhaW5lZCBieSBEZWVwYWsgU2F4ZW5hKGRlZXBha0BwbGV4aXR5Lm5ldCkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0kuIEludHJvZHVjdGlvbgorCitUaGUgTGludXggSTJPIHN1YnN5c3RlbSBwcm92aWRlcyBhIHNldCBvZiBpb2N0bCgpIGNvbW1hbmRzIHRoYXQgY2FuIGJlCit1dGlsaXplZCBieSB1c2VyIHNwYWNlIGFwcGxpY2F0aW9ucyB0byBjb21tdW5pY2F0ZSB3aXRoIElPUHMgYW5kIGRldmljZXMKK29uIGluZGl2aWR1YWwgSU9Qcy4gVGhpcyBkb2N1bWVudCBkZWZpbmVzIHRoZSBzcGVjaWZpYyBpb2N0bCgpIGNvbW1hbmRzCit0aGF0IGFyZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgYW5kIHByb3ZpZGVzIGV4YW1wbGVzIG9mIHRoZWlyIHVzZXMuCisKK1RoaXMgZG9jdW1lbnQgYXNzdW1lcyB0aGUgcmVhZGVyIGlzIGZhbWlsaWFyIHdpdGggb3IgaGFzIGFjY2VzcyB0byB0aGUgCitJMk8gc3BlY2lmaWNhdGlvbiBhcyBubyBJMk8gbWVzc2FnZSBwYXJhbWV0ZXJzIGFyZSBvdXRsaW5lZC4gIEZvciBpbmZvcm1hdGlvbiAKK29uIHRoZSBzcGVjaWZpY2F0aW9uLCBzZWUgaHR0cDovL3d3dy5pMm9zaWcub3JnCisKK1RoaXMgZG9jdW1lbnQgYW5kIHRoZSBJMk8gdXNlciBzcGFjZSBpbnRlcmZhY2UgYXJlIGN1cnJlbnRseSBtYWludGFpbmVkCitieSBEZWVwYWsgU2F4ZW5hLiAgUGxlYXNlIHNlbmQgYWxsIGNvbW1lbnRzLCBlcnJhdGEsIGFuZCBidWcgZml4ZXMgdG8KK2RlZXBha0Bjc29jaWV0eS5wdXJkdWUuZWR1CisKK0lJLiBJT1AgQWNjZXNzCisKK0FjY2VzcyB0byB0aGUgSTJPIHN1YnN5c3RlbSBpcyBwcm92aWRlZCB0aHJvdWdoIHRoZSBkZXZpY2UgZmlsZSBuYW1lZCAKKy9kZXYvaTJvL2N0bC4gIFRoaXMgZmlsZSBpcyBhIGNoYXJhY3RlciBmaWxlIHdpdGggbWFqb3IgbnVtYmVyIDEwIGFuZCBtaW5vcgorbnVtYmVyIDE2Ni4gIEl0IGNhbiBiZSBjcmVhdGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorCisgICBta25vZCAvZGV2L2kyby9jdGwgYyAxMCAxNjYKKworSUlJLiBEZXRlcm1pbmluZyB0aGUgSU9QIENvdW50CisKKyAgIFNZTk9QU0lTIAorCisgICBpb2N0bChmZCwgSTJPR0VUSU9QUywgIGludCAqY291bnQpOworCisgICB1OCBjb3VudFtNQVhfSTJPX0NPTlRST0xMRVJTXTsKKworICAgREVTQ1JJUFRJT04KKworICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzeXN0ZW0ncyBhY3RpdmUgSU9QIHRhYmxlLiAgY291bnQgc2hvdWxkCisgICBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIE1BWF9JMk9fQ09OVFJPTExFUlMgZW50cmllcy4gIFVwb24gCisgICByZXR1cm5pbmcsIGVhY2ggZW50cnkgd2lsbCBjb250YWluIGEgbm9uLXplcm8gdmFsdWUgaWYgdGhlIGdpdmVuCisgICBJT1AgdW5pdCBpcyBhY3RpdmUsIGFuZCBOVUxMIGlmIGl0IGlzIGluYWN0aXZlIG9yIG5vbi1leGlzdGVudC4KKworICAgUkVUVVJOIFZBTFVFLgorCisgICBSZXR1cm5zIDAgaWYgbm8gZXJyb3JzIG9jY3VyLCBhbmQgLTEgb3RoZXJ3aXNlLiAgSWYgYW4gZXJyb3Igb2NjdXJzLAorICAgZXJybm8gaXMgc2V0IGFwcHJvcHJpYXRlbHk6CisKKyAgICAgRUZBVUxUICAgSW52YWxpZCB1c2VyIHNwYWNlIHBvaW50ZXIgd2FzIHBhc3NlZAorCitJVi4gR2V0dGluZyBIYXJkd2FyZSBSZXNvdXJjZSBUYWJsZQorCisgICBTWU5PUFNJUyAKKyAKKyAgIGlvY3RsKGZkLCBJMk9IUlRHRVQsIHN0cnVjdCBpMm9fY21kX2hydCAqaHJ0KTsKKworICAgICAgc3RydWN0IGkyb19jbWRfaHJ0bGN0CisgICAgICB7CisgICAgICAgICB1MzIgICBpb3A7ICAgICAgLyogSU9QIHVuaXQgbnVtYmVyICovCisgICAgICAgICB2b2lkICAqcmVzYnVmOyAgLyogQnVmZmVyIGZvciByZXN1bHQgKi8KKyAgICAgICAgIHUzMiAgICpyZXNsZW47ICAvKiBCdWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCisgICAgICB9OworCisgICBERVNDUklQVElPTgorCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIEhhcmR3YXJlIFJlc291cmNlIFRhYmxlIG9mIHRoZSBJT1Agc3BlY2lmaWVkIAorICAgYnkgaHJ0LT5pb3AgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGhydC0+cmVzYnVmLiBUaGUgYWN0dWFsIHNpemUgb2YgCisgICB0aGUgZGF0YSBpcyB3cml0dGVuIGludG8gKihocnQtPnJlc2xlbikuCisKKyAgIFJFVFVSTlMKKworICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgbm8gZXJyb3JzIG9jY3VyLiBJZiBhbiBlcnJvciBvY2N1cnMsIC0xIAorICAgaXMgcmV0dXJuZWQgYW5kIGVycm5vIGlzIHNldCBhcHByb3ByaWF0ZWx5OgorCisgICAgICBFRkFVTFQgICAgICBJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlciB3YXMgcGFzc2VkCisgICAgICBFTlhJTyAgICAgICBJbnZhbGlkIElPUCBudW1iZXIKKyAgICAgIEVOT0JVRlMgICAgIEJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoLiAgSWYgdGhpcyBvY2N1cnMsIHRoZSByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgYnVmZmVyIGxlbmd0aCBpcyB3cml0dGVuIGludG8gKihocnQtPnJlc2xlbikKKyAgCitWLiBHZXR0aW5nIExvZ2ljYWwgQ29uZmlndXJhdGlvbiBUYWJsZQorICAgCisgICBTWU5PUFNJUyAKKyAKKyAgIGlvY3RsKGZkLCBJMk9MQ1RHRVQsIHN0cnVjdCBpMm9fY21kX2xjdCAqbGN0KTsKKworICAgICAgc3RydWN0IGkyb19jbWRfaHJ0bGN0CisgICAgICB7CisgICAgICAgICB1MzIgICBpb3A7ICAgICAgLyogSU9QIHVuaXQgbnVtYmVyICovCisgICAgICAgICB2b2lkICAqcmVzYnVmOyAgLyogQnVmZmVyIGZvciByZXN1bHQgKi8KKyAgICAgICAgIHUzMiAgICpyZXNsZW47ICAvKiBCdWZmZXIgbGVuZ3RoIGluIGJ5dGVzICovCisgICAgICB9OworCisgICBERVNDUklQVElPTgorCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIExvZ2ljYWwgQ29uZmlndXJhdGlvbiBUYWJsZSBvZiB0aGUgSU9QIHNwZWNpZmllZAorICAgYnkgbGN0LT5pb3AgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGxjdC0+cmVzYnVmLiBUaGUgYWN0dWFsIHNpemUgb2YgCisgICB0aGUgZGF0YSBpcyB3cml0dGVuIGludG8gKihsY3QtPnJlc2xlbikuCisKKyAgIFJFVFVSTlMKKworICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgbm8gZXJyb3JzIG9jY3VyLiBJZiBhbiBlcnJvciBvY2N1cnMsIC0xIAorICAgaXMgcmV0dXJuZWQgYW5kIGVycm5vIGlzIHNldCBhcHByb3ByaWF0ZWx5OgorCisgICAgICBFRkFVTFQgICAgICBJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlciB3YXMgcGFzc2VkCisgICAgICBFTlhJTyAgICAgICBJbnZhbGlkIElPUCBudW1iZXIKKyAgICAgIEVOT0JVRlMgICAgIEJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoLiAgSWYgdGhpcyBvY2N1cnMsIHRoZSByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgYnVmZmVyIGxlbmd0aCBpcyB3cml0dGVuIGludG8gKihsY3QtPnJlc2xlbikKKworVkkuIFNldHR0aW5nIFBhcmFtZXRlcnMKKyAgIAorICAgU1lOT1BTSVMgCisgCisgICBpb2N0bChmZCwgSTJPUEFSTVNFVCwgc3RydWN0IGkyb19wYXJtX3NldGdldCAqb3BzKTsKKworICAgICAgc3RydWN0IGkyb19jbWRfcHNldGdldAorICAgICAgeworICAgICAgICAgdTMyICAgaW9wOyAgICAgIC8qIElPUCB1bml0IG51bWJlciAqLworICAgICAgICAgdTMyICAgdGlkOyAgICAgIC8qIFRhcmdldCBkZXZpY2UgVElEICovCisgICAgICAgICB2b2lkICAqb3BidWY7ICAgLyogT3BlcmF0aW9uIExpc3QgYnVmZmVyICovCisgICAgICAgICB1MzIgICBvcGxlbjsgICAgLyogT3BlcmF0aW9uIExpc3QgYnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworICAgICAgICAgdm9pZCAgKnJlc2J1ZjsgIC8qIFJlc3VsdCBMaXN0IGJ1ZmZlciAqLworICAgICAgICAgdTMyICAgKnJlc2xlbjsgIC8qIFJlc3VsdCBMaXN0IGJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgICAgIH07CisKKyAgIERFU0NSSVBUSU9OCisKKyAgIFRoaXMgZnVuY3Rpb24gcG9zdHMgYSBVdGlsUGFyYW1zU2V0IG1lc3NhZ2UgdG8gdGhlIGRldmljZSBpZGVudGlmaWVkCisgICBieSBvcHMtPmlvcCBhbmQgb3BzLT50aWQuICBUaGUgb3BlcmF0aW9uIGxpc3QgZm9yIHRoZSBtZXNzYWdlIGlzIAorICAgc2VudCB0aHJvdWdoIHRoZSBvcHMtPm9wYnVmIGJ1ZmZlciwgYW5kIHRoZSByZXN1bHQgbGlzdCBpcyB3cml0dGVuCisgICBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBvcHMtPnJlc2J1Zi4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgCisgICB3cml0dGVuIGlzIHBsYWNlZCBpbnRvICoob3BzLT5yZXNsZW4pLiAKKworICAgUkVUVVJOUworCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBkYXRhIHdyaXR0ZW4gaW50bworICAgb3BzLT5yZXNidWYgaWYgbm8gZXJyb3JzIG9jY3VyLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCAtMSBpcyByZXR1cm5lZCAKKyAgIGFuZCBlcnJubyBpcyBzZXQgYXBwcm9wcmlhdGx5OgorCisgICAgICBFRkFVTFQgICAgICBJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlciB3YXMgcGFzc2VkCisgICAgICBFTlhJTyAgICAgICBJbnZhbGlkIElPUCBudW1iZXIKKyAgICAgIEVOT0JVRlMgICAgIEJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoLiAgSWYgdGhpcyBvY2N1cnMsIHRoZSByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgYnVmZmVyIGxlbmd0aCBpcyB3cml0dGVuIGludG8gKihvcHMtPnJlc2xlbikKKyAgICAgIEVUSU1FRE9VVCAgIFRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkgbWVzc2FnZQorICAgICAgRU5PTUVNICAgICAgS2VybmVsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yCisKKyAgIEEgcmV0dXJuIHZhbHVlIG9mIDAgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSB2YWx1ZSB3YXMgYWN0dWFsbHkKKyAgIGNoYW5nZWQgcHJvcGVybHkgb24gdGhlIElPUC4gIFRoZSB1c2VyIHNob3VsZCBjaGVjayB0aGUgcmVzdWx0CisgICBsaXN0IHRvIGRldGVybWluZSB0aGUgc3BlY2lmaWMgc3RhdHVzIG9mIHRoZSB0cmFuc2FjdGlvbi4KKworVklJLiBHZXR0aW5nIFBhcmFtZXRlcnMKKyAgIAorICAgU1lOT1BTSVMgCisgCisgICBpb2N0bChmZCwgSTJPUEFSTUdFVCwgc3RydWN0IGkyb19wYXJtX3NldGdldCAqb3BzKTsKKworICAgICAgc3RydWN0IGkyb19wYXJtX3NldGdldAorICAgICAgeworICAgICAgICAgdTMyICAgaW9wOyAgICAgIC8qIElPUCB1bml0IG51bWJlciAqLworICAgICAgICAgdTMyICAgdGlkOyAgICAgIC8qIFRhcmdldCBkZXZpY2UgVElEICovCisgICAgICAgICB2b2lkICAqb3BidWY7ICAgLyogT3BlcmF0aW9uIExpc3QgYnVmZmVyICovCisgICAgICAgICB1MzIgICBvcGxlbjsgICAgLyogT3BlcmF0aW9uIExpc3QgYnVmZmVyIGxlbmd0aCBpbiBieXRlcyAqLworICAgICAgICAgdm9pZCAgKnJlc2J1ZjsgIC8qIFJlc3VsdCBMaXN0IGJ1ZmZlciAqLworICAgICAgICAgdTMyICAgKnJlc2xlbjsgIC8qIFJlc3VsdCBMaXN0IGJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMgKi8KKyAgICAgIH07CisKKyAgIERFU0NSSVBUSU9OCisKKyAgIFRoaXMgZnVuY3Rpb24gcG9zdHMgYSBVdGlsUGFyYW1zR2V0IG1lc3NhZ2UgdG8gdGhlIGRldmljZSBpZGVudGlmaWVkCisgICBieSBvcHMtPmlvcCBhbmQgb3BzLT50aWQuICBUaGUgb3BlcmF0aW9uIGxpc3QgZm9yIHRoZSBtZXNzYWdlIGlzIAorICAgc2VudCB0aHJvdWdoIHRoZSBvcHMtPm9wYnVmIGJ1ZmZlciwgYW5kIHRoZSByZXN1bHQgbGlzdCBpcyB3cml0dGVuCisgICBpbnRvIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBvcHMtPnJlc2J1Zi4gIFRoZSBhY3R1YWwgc2l6ZSBvZiBkYXRhCisgICB3cml0dGVuIGlzIHBsYWNlZCBpbnRvICoob3BzLT5yZXNsZW4pLgorCisgICBSRVRVUk5TCisKKyAgICAgIEVGQVVMVCAgICAgIEludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyIHdhcyBwYXNzZWQKKyAgICAgIEVOWElPICAgICAgIEludmFsaWQgSU9QIG51bWJlcgorICAgICAgRU5PQlVGUyAgICAgQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2guICBJZiB0aGlzIG9jY3VycywgdGhlIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICBidWZmZXIgbGVuZ3RoIGlzIHdyaXR0ZW4gaW50byAqKG9wcy0+cmVzbGVuKQorICAgICAgRVRJTUVET1VUICAgVGltZW91dCB3YWl0aW5nIGZvciByZXBseSBtZXNzYWdlCisgICAgICBFTk9NRU0gICAgICBLZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKKworICAgQSByZXR1cm4gdmFsdWUgb2YgMCBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHZhbHVlIHdhcyBhY3R1YWxseQorICAgcHJvcGVybHkgcmV0cmVpdmVkLiAgVGhlIHVzZXIgc2hvdWxkIGNoZWNrIHRoZSByZXN1bHQgbGlzdCAKKyAgIHRvIGRldGVybWluZSB0aGUgc3BlY2lmaWMgc3RhdHVzIG9mIHRoZSB0cmFuc2FjdGlvbi4KKworVklJSS4gRG93bmxvYWRpbmcgU29mdHdhcmUKKyAgIAorICAgU1lOT1BTSVMgCisgCisgICBpb2N0bChmZCwgSTJPU1dETCwgc3RydWN0IGkyb19zd194ZmVyICpzdyk7CisKKyAgICAgIHN0cnVjdCBpMm9fc3dfeGZlcgorICAgICAgeworICAgICAgICAgdTMyICAgaW9wOyAgICAgICAvKiBJT1AgdW5pdCBudW1iZXIgKi8KKyAgICAgICAgIHU4ICAgIGZsYWdzOyAgICAgLyogRG93bmxvYWRGbGFncyBmaWVsZCAqLworICAgICAgICAgdTggICAgc3dfdHlwZTsgICAvKiBTb2Z0d2FyZSB0eXBlICovCisgICAgICAgICB1MzIgICBzd19pZDsgICAgIC8qIFNvZnR3YXJlIElEICovCisgICAgICAgICB2b2lkICAqYnVmOyAgICAgIC8qIFBvaW50ZXIgdG8gc29mdHdhcmUgYnVmZmVyICovCisgICAgICAgICB1MzIgICAqc3dsZW47ICAgIC8qIExlbmd0aCBvZiBzb2Z0d2FyZSBidWZmZXIgKi8gICAgICAgIAorICAgICAgICAgdTMyICAgKm1heGZyYWc7ICAvKiBOdW1iZXIgb2YgZnJhZ21lbnRzICovCisgICAgICAgICB1MzIgICAqY3VyZnJhZzsgIC8qIEN1cnJlbnQgZnJhZ21lbnQgbnVtYmVyICovCisgICAgICB9OworCisgICBERVNDUklQVElPTgorCisgICBUaGlzIGZ1bmN0aW9uIGRvd25sb2FkcyBhIHNvZnR3YXJlIGZyYWdtZW50IHBvaW50ZWQgYnkgc3ctPmJ1ZgorICAgdG8gdGhlIGlvcCBpZGVudGlmaWVkIGJ5IHN3LT5pb3AuIFRoZSBEb3dubG9hZEZsYWdzLCBTd0lELCBTd1R5cGUKKyAgIGFuZCBTd1NpemUgZmllbGRzIG9mIHRoZSBFeGVjU3dEb3dubG9hZCBtZXNzYWdlIGFyZSBmaWxsZWQgaW4gd2l0aAorICAgdGhlIHZhbHVlcyBvZiBzdy0+ZmxhZ3MsIHN3LT5zd19pZCwgc3ctPnN3X3R5cGUgYW5kICooc3ctPnN3bGVuKS4KKworICAgVGhlIGZyYWdtZW50cyBfbXVzdF8gYmUgc2VudCBpbiBvcmRlciBhbmQgYmUgOEsgaW4gc2l6ZS4gVGhlIGxhc3QKKyAgIGZyYWdtZW50IF9tYXlfIGJlIHNob3J0ZXIsIGhvd2V2ZXIuIFRoZSBrZXJuZWwgd2lsbCBjb21wdXRlIGl0cworICAgc2l6ZSBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiB0aGUgc3ctPnN3bGVuIGZpZWxkLgorCisgICBQbGVhc2Ugbm90ZSB0aGF0IFNXIHRyYW5zZmVycyBjYW4gdGFrZSBhIGxvbmcgdGltZS4KKworICAgUkVUVVJOUworCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBubyBlcnJvcnMgb2NjdXIuIElmIGFuIGVycm9yIG9jY3VycywgLTEgCisgICBpcyByZXR1cm5lZCBhbmQgZXJybm8gaXMgc2V0IGFwcHJvcHJpYXRseToKKworICAgICAgRUZBVUxUICAgICAgSW52YWxpZCB1c2VyIHNwYWNlIHBvaW50ZXIgd2FzIHBhc3NlZAorICAgICAgRU5YSU8gICAgICAgSW52YWxpZCBJT1AgbnVtYmVyCisgICAgICBFVElNRURPVVQgICBUaW1lb3V0IHdhaXRpbmcgZm9yIHJlcGx5IG1lc3NhZ2UKKyAgICAgIEVOT01FTSAgICAgIEtlcm5lbCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvcgorCitJWC4gVXBsb2FkaW5nIFNvZnR3YXJlCisgICAKKyAgIFNZTk9QU0lTIAorCisgICBpb2N0bChmZCwgSTJPU1dVTCwgc3RydWN0IGkyb19zd194ZmVyICpzdyk7CisKKyAgICAgIHN0cnVjdCBpMm9fc3dfeGZlcgorICAgICAgeworICAgICAgICAgdTMyICAgaW9wOyAgICAgIC8qIElPUCB1bml0IG51bWJlciAqLworICAgICAgICAgdTggICAgZmxhZ3M7IAkgLyogVXBsb2FkRmxhZ3MgKi8KKyAgICAgICAgIHU4ICAgIHN3X3R5cGU7ICAvKiBTb2Z0d2FyZSB0eXBlICovCisgICAgICAgICB1MzIgICBzd19pZDsgICAgLyogU29mdHdhcmUgSUQgKi8KKyAgICAgICAgIHZvaWQgICpidWY7ICAgICAvKiBQb2ludGVyIHRvIHNvZnR3YXJlIGJ1ZmZlciAqLworICAgICAgICAgdTMyICAgKnN3bGVuOyAgIC8qIExlbmd0aCBvZiBzb2Z0d2FyZSBidWZmZXIgKi8gICAgICAgIAorICAgICAgICAgdTMyICAgKm1heGZyYWc7IC8qIE51bWJlciBvZiBmcmFnbWVudHMgKi8KKyAgICAgICAgIHUzMiAgICpjdXJmcmFnOyAvKiBDdXJyZW50IGZyYWdtZW50IG51bWJlciAqLworICAgICAgfTsKKworICAgREVTQ1JJUFRJT04KKworICAgVGhpcyBmdW5jdGlvbiB1cGxvYWRzIGEgc29mdHdhcmUgZnJhZ21lbnQgZnJvbSB0aGUgSU9QIGlkZW50aWZpZWQKKyAgIGJ5IHN3LT5pb3AsIHN3LT5zd190eXBlLCBzdy0+c3dfaWQgYW5kIG9wdGlvbmFsbHkgc3ctPnN3bGVuIGZpZWxkcy4KKyAgIFRoZSBVcGxvYWRGbGFncywgU3dJRCwgU3dUeXBlIGFuZCBTd1NpemUgZmllbGRzIG9mIHRoZSBFeGVjU3dVcGxvYWQKKyAgIG1lc3NhZ2UgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZXMgb2Ygc3ctPmZsYWdzLCBzdy0+c3dfaWQsCisgICBzdy0+c3dfdHlwZSBhbmQgKihzdy0+c3dsZW4pLgorCisgICBUaGUgZnJhZ21lbnRzIF9tdXN0XyBiZSByZXF1ZXN0ZWQgaW4gb3JkZXIgYW5kIGJlIDhLIGluIHNpemUuIFRoZQorICAgdXNlciBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyBtZW1vcnkgcG9pbnRlZCBieSBzdy0+YnVmLiBUaGUKKyAgIGxhc3QgZnJhZ21lbnQgX21heV8gYmUgc2hvcnRlci4KKworICAgUGxlYXNlIG5vdGUgdGhhdCBTVyB0cmFuc2ZlcnMgY2FuIHRha2UgYSBsb25nIHRpbWUuCisKKyAgIFJFVFVSTlMKKworICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgbm8gZXJyb3JzIG9jY3VyLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCAtMQorICAgaXMgcmV0dXJuZWQgYW5kIGVycm5vIGlzIHNldCBhcHByb3ByaWF0bHk6CisKKyAgICAgIEVGQVVMVCAgICAgIEludmFsaWQgdXNlciBzcGFjZSBwb2ludGVyIHdhcyBwYXNzZWQKKyAgICAgIEVOWElPICAgICAgIEludmFsaWQgSU9QIG51bWJlcgorICAgICAgRVRJTUVET1VUICAgVGltZW91dCB3YWl0aW5nIGZvciByZXBseSBtZXNzYWdlCisgICAgICBFTk9NRU0gICAgICBLZXJuZWwgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IKKyAgICAgICAgIAorWC4gUmVtb3ZpbmcgU29mdHdhcmUKKyAgIAorICAgU1lOT1BTSVMgCisgCisgICBpb2N0bChmZCwgSTJPU1dERUwsIHN0cnVjdCBpMm9fc3dfeGZlciAqc3cpOworCisgICAgICBzdHJ1Y3QgaTJvX3N3X3hmZXIKKyAgICAgIHsKKyAgICAgICAgIHUzMiAgIGlvcDsgICAgICAvKiBJT1AgdW5pdCBudW1iZXIgKi8KKyAgICAgICAgIHU4ICAgIGZsYWdzOyAJIC8qIFJlbW92ZUZsYWdzICovCisgICAgICAgICB1OCAgICBzd190eXBlOyAgLyogU29mdHdhcmUgdHlwZSAqLworICAgICAgICAgdTMyICAgc3dfaWQ7ICAgIC8qIFNvZnR3YXJlIElEICovCisgICAgICAgICB2b2lkICAqYnVmOyAgICAgLyogVW51c2VkICovCisgICAgICAgICB1MzIgICAqc3dsZW47ICAgLyogTGVuZ3RoIG9mIHRoZSBzb2Z0d2FyZSBkYXRhICovICAgICAgICAKKyAgICAgICAgIHUzMiAgICptYXhmcmFnOyAvKiBVbnVzZWQgKi8KKyAgICAgICAgIHUzMiAgICpjdXJmcmFnOyAvKiBVbnVzZWQgKi8KKyAgICAgIH07CisKKyAgIERFU0NSSVBUSU9OCisKKyAgIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBzb2Z0d2FyZSBmcm9tIHRoZSBJT1AgaWRlbnRpZmllZCBieSBzdy0+aW9wLgorICAgVGhlIFJlbW92ZUZsYWdzLCBTd0lELCBTd1R5cGUgYW5kIFN3U2l6ZSBmaWVsZHMgb2YgdGhlIEV4ZWNTd1JlbW92ZSBtZXNzYWdlIAorICAgYXJlIGZpbGxlZCBpbiB3aXRoIHRoZSB2YWx1ZXMgb2Ygc3ctPmZsYWdzLCBzdy0+c3dfaWQsIHN3LT5zd190eXBlIGFuZCAKKyAgICooc3ctPnN3bGVuKS4gR2l2ZSB6ZXJvIGluICooc3ctPmxlbikgaWYgdGhlIHZhbHVlIGlzIHVua25vd24uIElPUCB1c2VzIAorICAgKihzdy0+c3dsZW4pIHZhbHVlIHRvIHZlcmlmeSBjb3JyZWN0IGlkZW50aWNhdGlvbiBvZiB0aGUgbW9kdWxlIHRvIHJlbW92ZS4gCisgICBUaGUgYWN0dWFsIHNpemUgb2YgdGhlIG1vZHVsZSBpcyB3cml0dGVuIGludG8gKihzdy0+c3dsZW4pLgorCisgICBSRVRVUk5TCisKKyAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIG5vIGVycm9ycyBvY2N1ci4gIElmIGFuIGVycm9yIG9jY3VycywgLTEKKyAgIGlzIHJldHVybmVkIGFuZCBlcnJubyBpcyBzZXQgYXBwcm9wcmlhdGx5OgorCisgICAgICBFRkFVTFQgICAgICBJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlciB3YXMgcGFzc2VkCisgICAgICBFTlhJTyAgICAgICBJbnZhbGlkIElPUCBudW1iZXIKKyAgICAgIEVUSU1FRE9VVCAgIFRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkgbWVzc2FnZQorICAgICAgRU5PTUVNICAgICAgS2VybmVsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yCisKK1guIFZhbGlkYXRpbmcgQ29uZmlndXJhdGlvbgorCisgICBTWU5PUFNJUworCisgICBpb2N0bChmZCwgSTJPVkFMSURBVEUsIGludCAqaW9wKTsKKwl1MzIgaW9wOworCisgICBERVNDUklQVElPTgorCisgICBUaGlzIGZ1bmN0aW9uIHBvc3RzIGFuIEV4ZWNDb25maWdWYWxpZGF0ZSBtZXNzYWdlIHRvIHRoZSBjb250cm9sbGVyCisgICBpZGVudGlmaWVkIGJ5IGlvcC4gVGhpcyBtZXNzYWdlIGluZGljYXRlcyB0aGF0IHRoZSBjdXJyZW50CisgICBjb25maWd1cmF0aW9uIGlzIGFjY2VwdGVkLiBUaGUgaW9wIGNoYW5nZXMgdGhlIHN0YXR1cyBvZiBzdXNwZWN0IGRyaXZlcnMgCisgICB0byB2YWxpZCBhbmQgbWF5IGRlbGV0ZSBvbGQgZHJpdmVycyBmcm9tIGl0cyBzdG9yZS4KKworICAgUkVUVVJOUworCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgMCBpZiBubyBlcnJvIG9jY3VyLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCAtMSBpcworICAgcmV0dXJuZWQgYW5kIGVycm5vIGlzIHNldCBhcHByb3ByaWF0bHk6CisKKyAgICAgIEVUSU1FRE9VVCAgIFRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkgbWVzc2FnZQorICAgICAgRU5YSU8gICAgICAgSW52YWxpZCBJT1AgbnVtYmVyCisKK1hJLiBDb25maWd1cmF0aW9uIERpYWxvZworICAgCisgICBTWU5PUFNJUyAKKyAKKyAgIGlvY3RsKGZkLCBJMk9IVE1MLCBzdHJ1Y3QgaTJvX2h0bWwgKmh0cXVlcnkpOworICAgICAgc3RydWN0IGkyb19odG1sCisgICAgICB7CisgICAgICAgICB1MzIgICBpb3A7ICAgICAgLyogSU9QIHVuaXQgbnVtYmVyICovCisgICAgICAgICB1MzIgICB0aWQ7ICAgICAgLyogVGFyZ2V0IGRldmljZSBJRCAqLworICAgICAgICAgdTMyICAgcGFnZTsgICAgIC8qIEhUTUwgcGFnZSAqLworICAgICAgICAgdm9pZCAgKnJlc2J1ZjsgIC8qIEJ1ZmZlciBmb3IgcmVwbHkgSFRNTCBwYWdlICovCisgICAgICAgICB1MzIgICAqcmVzbGVuOyAgLyogTGVuZ3RoIGluIGJ5dGVzIG9mIHJlcGx5IGJ1ZmZlciAqLworICAgICAgICAgdm9pZCAgKnFidWY7ICAgIC8qIFBvaW50ZXIgdG8gSFRUUCBxdWVyeSBzdHJpbmcgKi8KKyAgICAgICAgIHUzMiAgIHFsZW47ICAgICAvKiBMZW5ndGggaW4gYnl0ZXMgb2YgcXVlcnkgc3RyaW5nIGJ1ZmZlciAqLyAgICAgICAgCisgICAgICB9OworCisgICBERVNDUklQVElPTgorCisgICBUaGlzIGZ1bmN0aW9uIHBvc3RzIGFuIFV0aWxDb25maWdEaWFsb2cgbWVzc2FnZSB0byB0aGUgZGV2aWNlIGlkZW50aWZpZWQKKyAgIGJ5IGh0cXVlcnktPmlvcCBhbmQgaHRxdWVyeS0+dGlkLiAgVGhlIHJlcXVlc3RlZCBIVE1MIHBhZ2UgbnVtYmVyIGlzIAorICAgcHJvdmlkZWQgYnkgdGhlIGh0cXVlcnktPnBhZ2UgZmllbGQsIGFuZCB0aGUgcmVzdWx0YW50IGRhdGEgaXMgc3RvcmVkIAorICAgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGh0cXVlcnktPnJlc2J1Zi4gIElmIHRoZXJlIGlzIGFuIEhUVFAgcXVlcnkgCisgICBzdHJpbmcgdGhhdCBpcyB0byBiZSBzZW50IHRvIHRoZSBkZXZpY2UsIGl0IHNob3VsZCBiZSBzZW50IGluIHRoZSBidWZmZXIKKyAgIHBvaW50ZWQgdG8gYnkgaHRxdWVyeS0+cWJ1Zi4gIElmIHRoZXJlIGlzIG5vIHF1ZXJ5IHN0cmluZywgdGhpcyBmaWVsZAorICAgc2hvdWxkIGJlIHNldCB0byBOVUxMLiBUaGUgYWN0dWFsIHNpemUgb2YgdGhlIHJlcGx5IHJlY2VpdmVkIGlzIHdyaXR0ZW4KKyAgIGludG8gKihodHF1ZXJ5LT5yZXNsZW4pLgorICAKKyAgIFJFVFVSTlMKKworICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgbm8gZXJyb3Igb2NjdXIuIElmIGFuIGVycm9yIG9jY3VycywgLTEKKyAgIGlzIHJldHVybmVkIGFuZCBlcnJubyBpcyBzZXQgYXBwcm9wcmlhdGx5OgorCisgICAgICBFRkFVTFQgICAgICBJbnZhbGlkIHVzZXIgc3BhY2UgcG9pbnRlciB3YXMgcGFzc2VkCisgICAgICBFTlhJTyAgICAgICBJbnZhbGlkIElPUCBudW1iZXIKKyAgICAgIEVOT0JVRlMgICAgIEJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoLiAgSWYgdGhpcyBvY2N1cnMsIHRoZSByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgYnVmZmVyIGxlbmd0aCBpcyB3cml0dGVuIGludG8gKihvcHMtPnJlc2xlbikKKyAgICAgIEVUSU1FRE9VVCAgIFRpbWVvdXQgd2FpdGluZyBmb3IgcmVwbHkgbWVzc2FnZQorICAgICAgRU5PTUVNICAgICAgS2VybmVsIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yCisKK1hJSS4gRXZlbnRzCisKKyAgICBJbiB0aGUgcHJvY2VzcyBvZiBkZXRlcm1pbmluZyB0aGlzLiAgQ3VycmVudCBpZGVhIGlzIHRvIGhhdmUgdXNlCisgICAgdGhlIHNlbGVjdCgpIGludGVyZmFjZSB0byBhbGxvdyB1c2VyIGFwcHMgdG8gcGVyaW9kaWNhbGx5IHBvbGwKKyAgICB0aGUgL2Rldi9pMm8vY3RsIGRldmljZSBmb3IgZXZlbnRzLiAgV2hlbiBzZWxlY3QoKSBub3RpZmllcyB0aGUgdXNlcgorICAgIHRoYXQgYW4gZXZlbnQgaXMgYXZhaWxhYmxlLCB0aGUgdXNlciB3b3VsZCBjYWxsIHJlYWQoKSB0byByZXRyaWV2ZQorICAgIGEgbGlzdCBvZiBhbGwgdGhlIGV2ZW50cyB0aGF0IGFyZSBwZW5kaW5nIGZvciB0aGUgc3BlY2lmaWMgZGV2aWNlLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUmV2aXNpb24gSGlzdG9yeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmV2IDAuMSAtIDA0LzAxLzk5CistIEluaXRpYWwgcmV2aXNpb24KKworUmV2IDAuMiAtIDA0LzA2Lzk5CistIENoYW5nZWQgcmV0dXJuIHZhbHVlcyB0byBtYXRjaCBVTklYIGlvY3RsKCkgc3RhbmRhcmQuICBPbmx5IHJldHVybiB2YWx1ZXMKKyAgYXJlIDAgYW5kIC0xLiAgQWxsIGVycm9ycyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCBlcnJuby4KKy0gQWRkZWQgc3VtbWFyeSBvZiBwcm9wb3NlZCBwb3NzaWJsZSBldmVudCBpbnRlcmZhY2VzCisKK1JldiAwLjMgLSAwNC8yMC85OQorLSBDaGFuZ2VkIGFsbCBpb2N0bHMoKSB0byB1c2UgcG9pbnRlcnMgdG8gdXNlciBkYXRhIGluc3RlYWQgb2YgYWN0dWFsIGRhdGEKKy0gVXBkYXRlZCBlcnJvciB2YWx1ZXMgdG8gbWF0Y2ggdGhlIGNvZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGVidWcuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTVkNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZWJ1Zy5jCkBAIC0wLDAgKzEsNDgxIEBACisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisKK2V4dGVybiBzdHJ1Y3QgaTJvX2RyaXZlciAqKmkyb19kcml2ZXJzOworZXh0ZXJuIHVuc2lnbmVkIGludCBpMm9fbWF4X2RyaXZlcnM7CitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X3V0aWxfY21kKHU4IGNtZCk7CitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2V4ZWNfY21kKHU4IGNtZCk7CitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2ZhaWxfc3RhdHVzKHU4IHJlcV9zdGF0dXMsIHUzMiAqIG1zZyk7CitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2NvbW1vbl9zdGF0dXModTggcmVxX3N0YXR1cyk7CitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2NvbW1vbl9kc2ModTE2IGRldGFpbGVkX3N0YXR1cyk7CisKKy8qCisgKiBVc2VkIGZvciBlcnJvciByZXBvcnRpbmcvZGVidWdnaW5nIHB1cnBvc2VzLgorICogUmVwb3J0IENtZCBuYW1lLCBSZXF1ZXN0IHN0YXR1cywgRGV0YWlsZWQgU3RhdHVzLgorICovCit2b2lkIGkyb19yZXBvcnRfc3RhdHVzKGNvbnN0IGNoYXIgKnNldmVyaXR5LCBjb25zdCBjaGFyICpzdHIsCisJCSAgICAgICBzdHJ1Y3QgaTJvX21lc3NhZ2UgKm0pCit7CisJdTMyICptc2cgPSAodTMyICopIG07CisJdTggY21kID0gKG1zZ1sxXSA+PiAyNCkgJiAweEZGOworCXU4IHJlcV9zdGF0dXMgPSAobXNnWzRdID4+IDI0KSAmIDB4RkY7CisJdTE2IGRldGFpbGVkX3N0YXR1cyA9IG1zZ1s0XSAmIDB4RkZGRjsKKwkvL3N0cnVjdCBpMm9fZHJpdmVyICpoID0gaTJvX2RyaXZlcnNbbXNnWzJdICYgKGkyb19tYXhfZHJpdmVycy0xKV07CisKKwlpZiAoY21kID09IEkyT19DTURfVVRJTF9FVlRfUkVHSVNURVIpCisJCXJldHVybjsJCS8vIE5vIHN0YXR1cyBpbiB0aGlzIHJlcGx5CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJXMlczogIiwgc2V2ZXJpdHksIHN0cik7CisKKwlpZiAoY21kIDwgMHgxRikJCS8vIFV0aWxpdHkgY21kCisJCWkyb19yZXBvcnRfdXRpbF9jbWQoY21kKTsKKworCWVsc2UgaWYgKGNtZCA+PSAweEEwICYmIGNtZCA8PSAweEVGKQkvLyBFeGVjdXRpdmUgY21kCisJCWkyb19yZXBvcnRfZXhlY19jbWQoY21kKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJDbWQgPSAlMCMyeCwgIiwgY21kKTsJLy8gT3RoZXIgY21kcworCisJaWYgKG1zZ1swXSAmIE1TR19GQUlMKSB7CisJCWkyb19yZXBvcnRfZmFpbF9zdGF0dXMocmVxX3N0YXR1cywgbXNnKTsKKwkJcmV0dXJuOworCX0KKworCWkyb19yZXBvcnRfY29tbW9uX3N0YXR1cyhyZXFfc3RhdHVzKTsKKworCWlmIChjbWQgPCAweDFGIHx8IChjbWQgPj0gMHhBMCAmJiBjbWQgPD0gMHhFRikpCisJCWkyb19yZXBvcnRfY29tbW9uX2RzYyhkZXRhaWxlZF9zdGF0dXMpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiAvIERldGFpbGVkU3RhdHVzID0gJTAjNHguXG4iLAorCQkgICAgICAgZGV0YWlsZWRfc3RhdHVzKTsKK30KKworLyogVXNlZCB0byBkdW1wIGEgbWVzc2FnZSB0byBzeXNsb2cgZHVyaW5nIGRlYnVnZ2luZyAqLwordm9pZCBpMm9fZHVtcF9tZXNzYWdlKHN0cnVjdCBpMm9fbWVzc2FnZSAqbSkKK3sKKyNpZmRlZiBERUJVRworCXUzMiAqbXNnID0gKHUzMiAqKSBtOworCWludCBpOworCXByaW50ayhLRVJOX0lORk8gIkR1bXBpbmcgSTJPIG1lc3NhZ2Ugc2l6ZSAlZCBAICVwXG4iLAorCSAgICAgICBtc2dbMF0gPj4gMTYgJiAweGZmZmYsIG1zZyk7CisJZm9yIChpID0gMDsgaSA8ICgobXNnWzBdID4+IDE2KSAmIDB4ZmZmZik7IGkrKykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICBtc2dbJWRdID0gJTAjMTB4XG4iLCBpLCBtc2dbaV0pOworI2VuZGlmCit9CisKKy8qCisgKiBVc2VkIGZvciBlcnJvciByZXBvcnRpbmcvZGVidWdnaW5nIHB1cnBvc2VzLgorICogRm9sbG93aW5nIGZhaWwgc3RhdHVzIGFyZSBjb21tb24gdG8gYWxsIGNsYXNzZXMuCisgKiBUaGUgcHJlc2VydmVkIG1lc3NhZ2UgbXVzdCBiZSBoYW5kbGVkIGluIHRoZSByZXBseSBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2ZhaWxfc3RhdHVzKHU4IHJlcV9zdGF0dXMsIHUzMiAqIG1zZykKK3sKKwlzdGF0aWMgY2hhciAqRkFJTF9TVEFUVVNbXSA9IHsKKwkJIjB4ODAiLAkJLyogbm90IHVzZWQgKi8KKwkJIlNFUlZJQ0VfU1VTUEVOREVEIiwJLyogMHg4MSAqLworCQkiU0VSVklDRV9URVJNSU5BVEVEIiwJLyogMHg4MiAqLworCQkiQ09OR0VTVElPTiIsCisJCSJGQUlMVVJFIiwKKwkJIlNUQVRFX0VSUk9SIiwKKwkJIlRJTUVfT1VUIiwKKwkJIlJPVVRJTkdfRkFJTFVSRSIsCisJCSJJTlZBTElEX1ZFUlNJT04iLAorCQkiSU5WQUxJRF9PRkZTRVQiLAorCQkiSU5WQUxJRF9NU0dfRkxBR1MiLAorCQkiRlJBTUVfVE9PX1NNQUxMIiwKKwkJIkZSQU1FX1RPT19MQVJHRSIsCisJCSJJTlZBTElEX1RBUkdFVF9JRCIsCisJCSJJTlZBTElEX0lOSVRJQVRPUl9JRCIsCisJCSJJTlZBTElEX0lOSVRJQVRPUl9DT05URVgiLAkvKiAweDhGICovCisJCSJVTktOT1dOX0ZBSUxVUkUiCS8qIDB4RkYgKi8KKwl9OworCisJaWYgKHJlcV9zdGF0dXMgPT0gSTJPX0ZTQ19UUkFOU1BPUlRfVU5LTk9XTl9GQUlMVVJFKQorCQlwcmludGsoS0VSTl9ERUJVRyAiVFJBTlNQT1JUX1VOS05PV05fRkFJTFVSRSAoJTAjMngpXG4uIiwKKwkJICAgICAgIHJlcV9zdGF0dXMpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlRSQU5TUE9SVF8lcy5cbiIsCisJCSAgICAgICBGQUlMX1NUQVRVU1tyZXFfc3RhdHVzICYgMHgwRl0pOworCisJLyogRHVtcCBzb21lIGRldGFpbHMgKi8KKworCXByaW50ayhLRVJOX0VSUiAiICBJbml0aWF0b3JJZCA9ICVkLCBUYXJnZXRJZCA9ICVkXG4iLAorCSAgICAgICAobXNnWzFdID4+IDEyKSAmIDB4RkZGLCBtc2dbMV0gJiAweEZGRik7CisJcHJpbnRrKEtFUk5fRVJSICIgIExvd2VzdFZlcnNpb24gPSAweCUwMlgsIEhpZ2hlc3RWZXJzaW9uID0gMHglMDJYXG4iLAorCSAgICAgICAobXNnWzRdID4+IDgpICYgMHhGRiwgbXNnWzRdICYgMHhGRik7CisJcHJpbnRrKEtFUk5fRVJSICIgIEZhaWxpbmdIb3N0VW5pdCA9IDB4JTA0WCwgIEZhaWxpbmdJT1AgPSAweCUwM1hcbiIsCisJICAgICAgIG1zZ1s1XSA+PiAxNiwgbXNnWzVdICYgMHhGRkYpOworCisJcHJpbnRrKEtFUk5fRVJSICIgIFNldmVyaXR5OiAgMHglMDJYICIsIChtc2dbNF0gPj4gMTYpICYgMHhGRik7CisJaWYgKG1zZ1s0XSAmICgxIDw8IDE2KSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIihGb3JtYXRFcnJvciksICIKKwkJICAgICAgICJ0aGlzIG1zZyBjYW4gbmV2ZXIgYmUgZGVsaXZlcmVkL3Byb2Nlc3NlZC5cbiIpOworCWlmIChtc2dbNF0gJiAoMSA8PCAxNykpCisJCXByaW50ayhLRVJOX0RFQlVHICIoUGF0aEVycm9yKSwgIgorCQkgICAgICAgInRoaXMgbXNnIGNhbiBubyBsb25nZXIgYmUgZGVsaXZlcmVkL3Byb2Nlc3NlZC5cbiIpOworCWlmIChtc2dbNF0gJiAoMSA8PCAxOCkpCisJCXByaW50ayhLRVJOX0RFQlVHICIoUGF0aFN0YXRlKSwgIgorCQkgICAgICAgInRoZSBzeXN0ZW0gc3RhdGUgZG9lcyBub3QgYWxsb3cgZGVsaXZlcnkuXG4iKTsKKwlpZiAobXNnWzRdICYgKDEgPDwgMTkpKQorCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIihDb25nZXN0aW9uKSwgcmVzb3VyY2VzIHRlbXBvcmFyaWx5IG5vdCBhdmFpbGFibGU7IgorCQkgICAgICAgImRvIG5vdCByZXRyeSBpbW1lZGlhdGVseS5cbiIpOworfQorCisvKgorICogVXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nL2RlYnVnZ2luZyBwdXJwb3Nlcy4KKyAqIEZvbGxvd2luZyByZXBseSBzdGF0dXMgYXJlIGNvbW1vbiB0byBhbGwgY2xhc3Nlcy4KKyAqLworc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9jb21tb25fc3RhdHVzKHU4IHJlcV9zdGF0dXMpCit7CisJc3RhdGljIGNoYXIgKlJFUExZX1NUQVRVU1tdID0geworCQkiU1VDQ0VTUyIsCisJCSJBQk9SVF9ESVJUWSIsCisJCSJBQk9SVF9OT19EQVRBX1RSQU5TRkVSIiwKKwkJIkFCT1JUX1BBUlRJQUxfVFJBTlNGRVIiLAorCQkiRVJST1JfRElSVFkiLAorCQkiRVJST1JfTk9fREFUQV9UUkFOU0ZFUiIsCisJCSJFUlJPUl9QQVJUSUFMX1RSQU5TRkVSIiwKKwkJIlBST0NFU1NfQUJPUlRfRElSVFkiLAorCQkiUFJPQ0VTU19BQk9SVF9OT19EQVRBX1RSQU5TRkVSIiwKKwkJIlBST0NFU1NfQUJPUlRfUEFSVElBTF9UUkFOU0ZFUiIsCisJCSJUUkFOU0FDVElPTl9FUlJPUiIsCisJCSJQUk9HUkVTU19SRVBPUlQiCisJfTsKKworCWlmIChyZXFfc3RhdHVzID49IEFSUkFZX1NJWkUoUkVQTFlfU1RBVFVTKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlJlcXVlc3RTdGF0dXMgPSAlMCMyeCIsIHJlcV9zdGF0dXMpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzIiwgUkVQTFlfU1RBVFVTW3JlcV9zdGF0dXNdKTsKK30KKworLyoKKyAqIFVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy9kZWJ1Z2dpbmcgcHVycG9zZXMuCisgKiBGb2xsb3dpbmcgZGV0YWlsZWQgc3RhdHVzIGFyZSB2YWxpZCAgZm9yIGV4ZWN1dGl2ZSBjbGFzcywKKyAqIHV0aWxpdHkgY2xhc3MsIERETSBjbGFzcyBhbmQgZm9yIHRyYW5zYWN0aW9uIGVycm9yIHJlcGxpZXMuCisgKi8KK3N0YXRpYyB2b2lkIGkyb19yZXBvcnRfY29tbW9uX2RzYyh1MTYgZGV0YWlsZWRfc3RhdHVzKQoreworCXN0YXRpYyBjaGFyICpDT01NT05fRFNDW10gPSB7CisJCSJTVUNDRVNTIiwKKwkJIjB4MDEiLAkJLy8gbm90IHVzZWQKKwkJIkJBRF9LRVkiLAorCQkiVENMX0VSUk9SIiwKKwkJIlJFUExZX0JVRkZFUl9GVUxMIiwKKwkJIk5PX1NVQ0hfUEFHRSIsCisJCSJJTlNVRkZJQ0lFTlRfUkVTT1VSQ0VfU09GVCIsCisJCSJJTlNVRkZJQ0lFTlRfUkVTT1VSQ0VfSEFSRCIsCisJCSIweDA4IiwJCS8vIG5vdCB1c2VkCisJCSJDSEFJTl9CVUZGRVJfVE9PX0xBUkdFIiwKKwkJIlVOU1VQUE9SVEVEX0ZVTkNUSU9OIiwKKwkJIkRFVklDRV9MT0NLRUQiLAorCQkiREVWSUNFX1JFU0VUIiwKKwkJIklOQVBQUk9QUklBVEVfRlVOQ1RJT04iLAorCQkiSU5WQUxJRF9JTklUSUFUT1JfQUREUkVTUyIsCisJCSJJTlZBTElEX01FU1NBR0VfRkxBR1MiLAorCQkiSU5WQUxJRF9PRkZTRVQiLAorCQkiSU5WQUxJRF9QQVJBTUVURVIiLAorCQkiSU5WQUxJRF9SRVFVRVNUIiwKKwkJIklOVkFMSURfVEFSR0VUX0FERFJFU1MiLAorCQkiTUVTU0FHRV9UT09fTEFSR0UiLAorCQkiTUVTU0FHRV9UT09fU01BTEwiLAorCQkiTUlTU0lOR19QQVJBTUVURVIiLAorCQkiVElNRU9VVCIsCisJCSJVTktOT1dOX0VSUk9SIiwKKwkJIlVOS05PV05fRlVOQ1RJT04iLAorCQkiVU5TVVBQT1JURURfVkVSU0lPTiIsCisJCSJERVZJQ0VfQlVTWSIsCisJCSJERVZJQ0VfTk9UX0FWQUlMQUJMRSIKKwl9OworCisJaWYgKGRldGFpbGVkX3N0YXR1cyA+IEkyT19EU0NfREVWSUNFX05PVF9BVkFJTEFCTEUpCisJCXByaW50ayhLRVJOX0RFQlVHICIgLyBEZXRhaWxlZFN0YXR1cyA9ICUwIzR4LlxuIiwKKwkJICAgICAgIGRldGFpbGVkX3N0YXR1cyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRyAiIC8gJXMuXG4iLCBDT01NT05fRFNDW2RldGFpbGVkX3N0YXR1c10pOworfQorCisvKgorICogVXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nL2RlYnVnZ2luZyBwdXJwb3NlcworICovCitzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X3V0aWxfY21kKHU4IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSTJPX0NNRF9VVElMX05PUDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfTk9QLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1VUSUxfQUJPUlQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0FCT1JULCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1VUSUxfQ0xBSU06CisJCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0NMQUlNLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1VUSUxfUkVMRUFTRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfQ0xBSU1fUkVMRUFTRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9VVElMX0NPTkZJR19ESUFMT0c6CisJCXByaW50ayhLRVJOX0RFQlVHICJVVElMX0NPTkZJR19ESUFMT0csICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9ERVZJQ0VfUkVTRVJWRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfREVWSUNFX1JFU0VSVkUsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9ERVZJQ0VfUkVMRUFTRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfREVWSUNFX1JFTEVBU0UsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9FVlRfQUNLOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9FVkVOVF9BQ0tOT1dMRURHRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUjoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfRVZFTlRfUkVHSVNURVIsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9MT0NLOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9MT0NLLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1VUSUxfTE9DS19SRUxFQVNFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9MT0NLX1JFTEVBU0UsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfVVRJTF9QQVJBTVNfR0VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiVVRJTF9QQVJBTVNfR0VULCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1VUSUxfUEFSQU1TX1NFVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfUEFSQU1TX1NFVCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9VVElMX1JFUExZX0ZBVUxUX05PVElGWToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVUSUxfUkVQTFlfRkFVTFRfTk9USUZZLCAiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkNtZCA9ICUwIzJ4LCAiLCBjbWQpOworCX0KK30KKworLyoKKyAqIFVzZWQgZm9yIGVycm9yIHJlcG9ydGluZy9kZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLworc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9leGVjX2NtZCh1OCBjbWQpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEkyT19DTURfQURBUFRFUl9BU1NJR046CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0FEQVBURVJfQVNTSUdOLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0FEQVBURVJfUkVBRDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQURBUFRFUl9SRUFELCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0FEQVBURVJfUkVMRUFTRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQURBUFRFUl9SRUxFQVNFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0JJT1NfSU5GT19TRVQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0JJT1NfSU5GT19TRVQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQk9PVF9ERVZJQ0VfU0VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19CT09UX0RFVklDRV9TRVQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQ09ORklHX1ZBTElEQVRFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19DT05GSUdfVkFMSURBVEUsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQ09OTl9TRVRVUDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfQ09OTl9TRVRVUCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9ERE1fREVTVFJPWToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX0RFU1RST1ksICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfRERNX0VOQUJMRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX0VOQUJMRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9ERE1fUVVJRVNDRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfRERNX1FVSUVTQ0UsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfRERNX1JFU0VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19ERE1fUkVTRVQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfRERNX1NVU1BFTkQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RETV9TVVNQRU5ELCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0RFVklDRV9BU1NJR046CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RFVklDRV9BU1NJR04sICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfREVWSUNFX1JFTEVBU0U6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0RFVklDRV9SRUxFQVNFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0hSVF9HRVQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0hSVF9HRVQsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQURBUFRFUl9DTEVBUjoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSU9QX0NMRUFSLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0FEQVBURVJfQ09OTkVDVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSU9QX0NPTk5FQ1QsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfQURBUFRFUl9SRVNFVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfSU9QX1JFU0VULCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX0xDVF9OT1RJRlk6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX0xDVF9OT1RJRlksICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfT1VUQk9VTkRfSU5JVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfT1VUQk9VTkRfSU5JVCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9QQVRIX0VOQUJMRToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfUEFUSF9FTkFCTEUsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfUEFUSF9RVUlFU0NFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19QQVRIX1FVSUVTQ0UsICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfUEFUSF9SRVNFVDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYRUNfUEFUSF9SRVNFVCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9TVEFUSUNfTUZfQ1JFQVRFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TVEFUSUNfTUZfQ1JFQVRFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NUQVRJQ19NRl9SRUxFQVNFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TVEFUSUNfTUZfUkVMRUFTRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9TVEFUVVNfR0VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TVEFUVVNfR0VULCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NXX0RPV05MT0FEOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TV19ET1dOTE9BRCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9TV19VUExPQUQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NXX1VQTE9BRCwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9TV19SRU1PVkU6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NXX1JFTU9WRSwgIik7CisJCWJyZWFrOworCWNhc2UgSTJPX0NNRF9TWVNfRU5BQkxFOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TWVNfRU5BQkxFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NZU19NT0RJRlk6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NZU19NT0RJRlksICIpOworCQlicmVhazsKKwljYXNlIEkyT19DTURfU1lTX1FVSUVTQ0U6CisJCXByaW50ayhLRVJOX0RFQlVHICJFWEVDX1NZU19RVUlFU0NFLCAiKTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ01EX1NZU19UQUJfU0VUOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhFQ19TWVNfVEFCX1NFVCwgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICJDbWQgPSAlIzAyeCwgIiwgY21kKTsKKwl9Cit9CisKK3ZvaWQgaTJvX2RlYnVnX3N0YXRlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlwcmludGsoS0VSTl9JTkZPICIlczogU3RhdGUgPSAiLCBjLT5uYW1lKTsKKwlzd2l0Y2ggKCgoaTJvX3N0YXR1c19ibG9jayAqKSBjLT5zdGF0dXNfYmxvY2sudmlydCktPmlvcF9zdGF0ZSkgeworCWNhc2UgMHgwMToKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklOSVRcbiIpOworCQlicmVhazsKKwljYXNlIDB4MDI6CisJCXByaW50ayhLRVJOX0RFQlVHICJSRVNFVFxuIik7CisJCWJyZWFrOworCWNhc2UgMHgwNDoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkhPTERcbiIpOworCQlicmVhazsKKwljYXNlIDB4MDU6CisJCXByaW50ayhLRVJOX0RFQlVHICJSRUFEWVxuIik7CisJCWJyZWFrOworCWNhc2UgMHgwODoKKwkJcHJpbnRrKEtFUk5fREVCVUcgIk9QRVJBVElPTkFMXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDEwOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRkFJTEVEXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDExOgorCQlwcmludGsoS0VSTl9ERUJVRyAiRkFVTFRFRFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0RFQlVHICIleCAodW5rbm93biAhISlcbiIsCisJCSAgICAgICAoKGkyb19zdGF0dXNfYmxvY2sgKikgYy0+c3RhdHVzX2Jsb2NrLnZpcnQpLT5pb3Bfc3RhdGUpOworCX0KK307CisKK3ZvaWQgaTJvX2R1bXBfaHJ0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwl1MzIgKnJvd3MgPSAodTMyICopIGMtPmhydC52aXJ0OworCXU4ICpwID0gKHU4ICopIGMtPmhydC52aXJ0OworCXU4ICpkOworCWludCBjb3VudDsKKwlpbnQgbGVuZ3RoOworCWludCBpOworCWludCBzdGF0ZTsKKworCWlmIChwWzNdICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiJXM6IEhSVCB0YWJsZSBmb3IgY29udHJvbGxlciBpcyB0b28gbmV3IGEgdmVyc2lvbi5cbiIsCisJCSAgICAgICBjLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWNvdW50ID0gcFswXSB8IChwWzFdIDw8IDgpOworCWxlbmd0aCA9IHBbMl07CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogSFJUIGhhcyAlZCBlbnRyaWVzIG9mICVkIGJ5dGVzIGVhY2guXG4iLAorCSAgICAgICBjLT5uYW1lLCBjb3VudCwgbGVuZ3RoIDw8IDIpOworCisJcm93cyArPSAyOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQWRhcHRlciAlMDhYOiAiLCByb3dzWzBdKTsKKwkJcCA9ICh1OCAqKSAocm93cyArIDEpOworCQlkID0gKHU4ICopIChyb3dzICsgMik7CisJCXN0YXRlID0gcFsxXSA8PCA4IHwgcFswXTsKKworCQlwcmludGsoS0VSTl9ERUJVRyAiVElEICUwNFg6WyIsIHN0YXRlICYgMHhGRkYpOworCQlzdGF0ZSA+Pj0gMTI7CisJCWlmIChzdGF0ZSAmICgxIDw8IDApKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIkgiKTsJLyogSGlkZGVuICovCisJCWlmIChzdGF0ZSAmICgxIDw8IDIpKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiUCIpOwkvKiBQcmVzZW50ICovCisJCQlpZiAoc3RhdGUgJiAoMSA8PCAxKSkKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiQyIpOwkvKiBDb250cm9sbGVkICovCisJCX0KKwkJaWYgKHN0YXRlID4gOSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICIqIik7CS8qIEhhcmQgKi8KKworCQlwcmludGsoS0VSTl9ERUJVRyAiXToiKTsKKworCQlzd2l0Y2ggKHBbM10gJiAweEZGRkYpIHsKKwkJY2FzZSAwOgorCQkJLyogQWRhcHRlciBwcml2YXRlIGJ1cyAtIGVhc3kgKi8KKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgIkxvY2FsIGJ1cyAlZDogSS9PIGF0IDB4JTA0WCBNZW0gMHglMDhYIiwgcFsyXSwKKwkJCSAgICAgICBkWzFdIDw8IDggfCBkWzBdLCAqKHUzMiAqKSAoZCArIDQpKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQkvKiBJU0EgYnVzICovCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJJU0EgJWQ6IENTTiAlZCBJL08gYXQgMHglMDRYIE1lbSAweCUwOFgiLCBwWzJdLAorCQkJICAgICAgIGRbMl0sIGRbMV0gPDwgOCB8IGRbMF0sICoodTMyICopIChkICsgNCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgkvKiBFSVNBIGJ1cyAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiRUlTQSAlZDogU2xvdCAlZCBJL08gYXQgMHglMDRYIE1lbSAweCUwOFgiLAorCQkJICAgICAgIHBbMl0sIGRbM10sIGRbMV0gPDwgOCB8IGRbMF0sICoodTMyICopIChkICsgNCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSAzOgkvKiBNQ0EgYnVzICovCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJNQ0EgJWQ6IFNsb3QgJWQgSS9PIGF0IDB4JTA0WCBNZW0gMHglMDhYIiwgcFsyXSwKKwkJCSAgICAgICBkWzNdLCBkWzFdIDw8IDggfCBkWzBdLCAqKHUzMiAqKSAoZCArIDQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgNDoJLyogUENJIGJ1cyAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiUENJICVkOiBCdXMgJWQgRGV2aWNlICVkIEZ1bmN0aW9uICVkIiwgcFsyXSwKKwkJCSAgICAgICBkWzJdLCBkWzFdLCBkWzBdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgMHg4MDoJLyogT3RoZXIgKi8KKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0RFQlVHICJVbnN1cHBvcnRlZCBidXMgdHlwZS4iKTsKKwkJCWJyZWFrOworCQl9CisJCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworCQlyb3dzICs9IGxlbmd0aDsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woaTJvX2R1bXBfbWVzc2FnZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2RldmljZS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjkwN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9kZXZpY2UuYwpAQCAtMCwwICsxLDYzNCBAQAorLyoKKyAqCUZ1bmN0aW9ucyB0byBoYW5kbGUgSTJPIGRldmljZXMKKyAqCisgKglDb3B5cmlnaHQgKEMpIDIwMDQJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICoJb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglGaXhlcy9hZGRpdGlvbnM6CisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+CisgKgkJCWluaXRpYWwgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyogRXhlYyBPU00gZnVuY3Rpb25zICovCitleHRlcm4gc3RydWN0IGJ1c190eXBlIGkyb19idXNfdHlwZTsKKworLyoqCisgKglpMm9fZGV2aWNlX2lzc3VlX2NsYWltIC0gY2xhaW0gb3IgcmVsZWFzZSBhIGRldmljZQorICoJQGRldjogSTJPIGRldmljZSB0byBjbGFpbSBvciByZWxlYXNlCisgKglAY21kOiBjbGFpbSBvciByZWxlYXNlIGNvbW1hbmQKKyAqCUB0eXBlOiB0eXBlIG9mIGNsYWltCisgKgorICoJSXNzdWUgSTJPIFVUSUxfQ0xBSU0gb3IgVVRJTF9SRUxFQVNFIG1lc3NhZ2VzLiBUaGUgbWVzc2FnZSB0byBiZSBzZW50CisgKglpcyBzZXQgYnkgY21kLiBkZXYgaXMgdGhlIEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIGNsYWltIG9yCisgKglyZWxlYXNlZCBhbmQgdGhlIHR5cGUgaXMgdGhlIGNsYWltIHR5cGUgKHNlZSB0aGUgSTJPIHNwZWMpLgorICoKKyAqCVJldHVycyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpMm9fZGV2aWNlX2lzc3VlX2NsYWltKHN0cnVjdCBpMm9fZGV2aWNlICpkZXYsIHUzMiBjbWQsCisJCQkJCSB1MzIgdHlwZSkKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoZGV2LT5pb3AsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEZJVkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoY21kIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBkZXYtPmxjdF9kYXRhLnRpZCwgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwodHlwZSwgJm1zZy0+Ym9keVswXSk7CisKKwlyZXR1cm4gaTJvX21zZ19wb3N0X3dhaXQoZGV2LT5pb3AsIG0sIDYwKTsKK307CisKKy8qKgorICogCWkyb19kZXZpY2VfY2xhaW0gLSBjbGFpbSBhIGRldmljZSBmb3IgdXNlIGJ5IGFuIE9TTQorICoJQGRldjogSTJPIGRldmljZSB0byBjbGFpbQorICoJQGRydjogSTJPIGRyaXZlciB3aGljaCB3YW50cyB0byBjbGFpbSB0aGUgZGV2aWNlCisgKgorICoJRG8gdGhlIGxlZyB3b3JrIHRvIGFzc2lnbiBhIGRldmljZSB0byBhIGdpdmVuIE9TTS4gSWYgdGhlIGNsYWltIHN1Y2NlZWQKKyAqCXRoZSBvd25lciBvZiB0aGUgcmltYXJ5LiBJZiB0aGUgYXR0ZW1wdCBmYWlscyBhIG5lZ2F0aXZlIGVycm5vIGNvZGUKKyAqCWlzIHJldHVybmVkLiBPbiBzdWNjZXNzIHplcm8gaXMgcmV0dXJuZWQuCisgKi8KK2ludCBpMm9fZGV2aWNlX2NsYWltKHN0cnVjdCBpMm9fZGV2aWNlICpkZXYpCit7CisJaW50IHJjID0gMDsKKworCWRvd24oJmRldi0+bG9jayk7CisKKwlyYyA9IGkyb19kZXZpY2VfaXNzdWVfY2xhaW0oZGV2LCBJMk9fQ01EX1VUSUxfQ0xBSU0sIEkyT19DTEFJTV9QUklNQVJZKTsKKwlpZiAoIXJjKQorCQlwcl9kZWJ1ZygiaTJvOiBjbGFpbSBvZiBkZXZpY2UgJWQgc3VjY2VkZWRcbiIsCisJCQkgZGV2LT5sY3RfZGF0YS50aWQpOworCWVsc2UKKwkJcHJfZGVidWcoImkybzogY2xhaW0gb2YgZGV2aWNlICVkIGZhaWxlZCAlZFxuIiwKKwkJCSBkZXYtPmxjdF9kYXRhLnRpZCwgcmMpOworCisJdXAoJmRldi0+bG9jayk7CisKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19kZXZpY2VfY2xhaW1fcmVsZWFzZSAtIHJlbGVhc2UgYSBkZXZpY2UgdGhhdCB0aGUgT1NNIGlzIHVzaW5nCisgKglAZGV2OiBkZXZpY2UgdG8gcmVsZWFzZQorICoJQGRydjogZHJpdmVyIHdoaWNoIGNsYWltZWQgdGhlIGRldmljZQorICoKKyAqCURyb3AgYSBjbGFpbSBieSBhbiBPU00gb24gYSBnaXZlbiBJMk8gZGV2aWNlLgorICoKKyAqCUFDIC0gc29tZSBkZXZpY2VzIHNlZW0gdG8gd2FudCB0byByZWZ1c2UgYW4gdW5jbGFpbSB1bnRpbCB0aGV5IGhhdmUKKyAqCWZpbmlzaGVkIGludGVybmFsIHByb2Nlc3NpbmcuIEl0IG1ha2VzIHNlbnNlIHNpbmNlIHlvdSBkb24ndCB3YW50IGEKKyAqCW5ldyBkZXZpY2UgdG8gZ28gcmVjb25maWd1cmluZyB0aGUgZW50aXJlIHN5c3RlbSB1bnRpbCB5b3UgYXJlIGRvbmUuCisgKglUaHVzIHdlIGFyZSBwcmVwYXJlZCB0byB3YWl0IGJyaWVmbHkuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlKHN0cnVjdCBpMm9fZGV2aWNlICpkZXYpCit7CisJaW50IHRyaWVzOworCWludCByYyA9IDA7CisKKwlkb3duKCZkZXYtPmxvY2spOworCisJLyoKKwkgKiAgICAgIElmIHRoZSBjb250cm9sbGVyIHRha2VzIGEgbm9uYmxvY2tpbmcgYXBwcm9hY2ggdG8KKwkgKiAgICAgIHJlbGVhc2VzIHdlIGhhdmUgdG8gc2xlZXAvcG9sbCBmb3IgYSBmZXcgdGltZXMuCisJICovCisJZm9yICh0cmllcyA9IDA7IHRyaWVzIDwgMTA7IHRyaWVzKyspIHsKKwkJcmMgPSBpMm9fZGV2aWNlX2lzc3VlX2NsYWltKGRldiwgSTJPX0NNRF9VVElMX1JFTEVBU0UsCisJCQkJCSAgICBJMk9fQ0xBSU1fUFJJTUFSWSk7CisJCWlmICghcmMpCisJCQlicmVhazsKKworCQlzc2xlZXAoMSk7CisJfQorCisJaWYgKCFyYykKKwkJcHJfZGVidWcoImkybzogY2xhaW0gcmVsZWFzZSBvZiBkZXZpY2UgJWQgc3VjY2VkZWRcbiIsCisJCQkgZGV2LT5sY3RfZGF0YS50aWQpOworCWVsc2UKKwkJcHJfZGVidWcoImkybzogY2xhaW0gcmVsZWFzZSBvZiBkZXZpY2UgJWQgZmFpbGVkICVkXG4iLAorCQkJIGRldi0+bGN0X2RhdGEudGlkLCByYyk7CisKKwl1cCgmZGV2LT5sb2NrKTsKKworCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2RldmljZV9yZWxlYXNlIC0gcmVsZWFzZSB0aGUgbWVtb3J5IGZvciBhIEkyTyBkZXZpY2UKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIHJlbGVhc2VkCisgKgorICoJUmVsZWFzZSB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaWYgcmVmY291bnQgb2YKKyAqCWRldmljZSByZWFjaGVzIDAgYXV0b21hdGljYWxseS4KKyAqLworc3RhdGljIHZvaWQgaTJvX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKKworCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyByZWxlYXNlZFxuIiwgZGV2LT5idXNfaWQpOworCisJa2ZyZWUoaTJvX2Rldik7Cit9OworCisvKioKKyAqCWkyb19kZXZpY2VfY2xhc3NfcmVsZWFzZSAtIFJlbW92ZSBJMk8gZGV2aWNlIGF0dHJpYnV0ZXMKKyAqCUBjZDogSTJPIGNsYXNzIGRldmljZSB3aGljaCBpcyBhZGRlZCB0byB0aGUgSTJPIGRldmljZSBjbGFzcworICoKKyAqCVJlbW92ZXMgYXR0cmlidXRlcyBmcm9tIHRoZSBJMk8gZGV2aWNlIGFnYWluLiBBbHNvIHNlYXJjaCBlYWNoIGRldmljZQorICoJb24gdGhlIGNvbnRyb2xsZXIgZm9yIEkyTyBkZXZpY2VzIHdoaWNoIHJlZmVydCB0byB0aGlzIGRldmljZSBhcyBwYXJlbnQKKyAqCW9yIHVzZXIgYW5kIHJlbW92ZSB0aGlzIGxpbmtzIGFsc28uCisgKi8KK3N0YXRpYyB2b2lkIGkyb19kZXZpY2VfY2xhc3NfcmVsZWFzZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCkKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiwgKnRtcDsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisKKwlpMm9fZGV2ID0gdG9faTJvX2RldmljZShjZC0+ZGV2KTsKKwljID0gaTJvX2Rldi0+aW9wOworCisJc3lzZnNfcmVtb3ZlX2xpbmsoJmkyb19kZXYtPmRldmljZS5rb2JqLCAicGFyZW50Iik7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJmkyb19kZXYtPmRldmljZS5rb2JqLCAidXNlciIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZjLT5kZXZpY2VzLCBsaXN0KSB7CisJCWlmICh0bXAtPmxjdF9kYXRhLnBhcmVudF90aWQgPT0gaTJvX2Rldi0+bGN0X2RhdGEudGlkKQorCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJnRtcC0+ZGV2aWNlLmtvYmosICJwYXJlbnQiKTsKKwkJaWYgKHRtcC0+bGN0X2RhdGEudXNlcl90aWQgPT0gaTJvX2Rldi0+bGN0X2RhdGEudGlkKQorCQkJc3lzZnNfcmVtb3ZlX2xpbmsoJnRtcC0+ZGV2aWNlLmtvYmosICJ1c2VyIik7CisJfQorfTsKKworLyogSTJPIGRldmljZSBjbGFzcyAqLworc3RhdGljIHN0cnVjdCBjbGFzcyBpMm9fZGV2aWNlX2NsYXNzID0geworCS5uYW1lID0gImkyb19kZXZpY2UiLAorCS5yZWxlYXNlID0gaTJvX2RldmljZV9jbGFzc19yZWxlYXNlCit9OworCisvKioKKyAqCWkyb19kZXZpY2VfYWxsb2MgLSBBbGxvY2F0ZSBhIEkyTyBkZXZpY2UgYW5kIGluaXRpYWxpemUgaXQKKyAqCisgKglBbGxvY2F0ZSB0aGUgbWVtb3J5IGZvciBhIEkyTyBkZXZpY2UgYW5kIGluaXRpYWxpemUgbG9ja3MgYW5kIGxpc3RzCisgKgorICoJUmV0dXJucyB0aGUgYWxsb2NhdGVkIEkyTyBkZXZpY2Ugb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBkZXZpY2UKKyAqCWNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldmljZV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkZXY7CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXYtPmxpc3QpOworCWluaXRfTVVURVgoJmRldi0+bG9jayk7CisKKwlkZXYtPmRldmljZS5idXMgPSAmaTJvX2J1c190eXBlOworCWRldi0+ZGV2aWNlLnJlbGVhc2UgPSAmaTJvX2RldmljZV9yZWxlYXNlOworCWRldi0+Y2xhc3NkZXYuY2xhc3MgPSAmaTJvX2RldmljZV9jbGFzczsKKwlkZXYtPmNsYXNzZGV2LmRldiA9ICZkZXYtPmRldmljZTsKKworCXJldHVybiBkZXY7Cit9OworCisvKioKKyAqCWkyb19kZXZpY2VfYWRkIC0gYWxsb2NhdGUgYSBuZXcgSTJPIGRldmljZSBhbmQgYWRkIGl0IHRvIHRoZSBJT1AKKyAqCUBpb3A6IEkyTyBjb250cm9sbGVyIHdoZXJlIHRoZSBkZXZpY2UgaXMgb24KKyAqCUBlbnRyeTogTENUIGVudHJ5IG9mIHRoZSBJMk8gZGV2aWNlCisgKgorICoJQWxsb2NhdGUgYSBuZXcgSTJPIGRldmljZSBhbmQgaW5pdGlhbGl6ZSBpdCB3aXRoIHRoZSBMQ1QgZW50cnkuIFRoZQorICoJZGV2aWNlIGlzIGFwcGVuZGVkIHRvIHRoZSBkZXZpY2UgbGlzdCBvZiB0aGUgY29udHJvbGxlci4KKyAqCisgKglSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgSTJPIGRldmljZSBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqCW9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldmljZV9hZGQoc3RydWN0IGkyb19jb250cm9sbGVyICpjLAorCQkJCQkgaTJvX2xjdF9lbnRyeSAqIGVudHJ5KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkZXY7CisKKwlkZXYgPSBpMm9fZGV2aWNlX2FsbG9jKCk7CisJaWYgKElTX0VSUihkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJvOiB1bmFibGUgdG8gYWxsb2NhdGUgaTJvIGRldmljZVxuIik7CisJCXJldHVybiBkZXY7CisJfQorCisJZGV2LT5sY3RfZGF0YSA9ICplbnRyeTsKKworCXNucHJpbnRmKGRldi0+ZGV2aWNlLmJ1c19pZCwgQlVTX0lEX1NJWkUsICIlZDolMDN4IiwgYy0+dW5pdCwKKwkJIGRldi0+bGN0X2RhdGEudGlkKTsKKworCXNucHJpbnRmKGRldi0+Y2xhc3NkZXYuY2xhc3NfaWQsIEJVU19JRF9TSVpFLCAiJWQ6JTAzeCIsIGMtPnVuaXQsCisJCSBkZXYtPmxjdF9kYXRhLnRpZCk7CisKKwlkZXYtPmlvcCA9IGM7CisJZGV2LT5kZXZpY2UucGFyZW50ID0gJmMtPmRldmljZTsKKworCWRldmljZV9yZWdpc3RlcigmZGV2LT5kZXZpY2UpOworCisJbGlzdF9hZGRfdGFpbCgmZGV2LT5saXN0LCAmYy0+ZGV2aWNlcyk7CisKKwljbGFzc19kZXZpY2VfcmVnaXN0ZXIoJmRldi0+Y2xhc3NkZXYpOworCisJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZF9hbGwoZGV2KTsKKworCXByX2RlYnVnKCJpMm86IGRldmljZSAlcyBhZGRlZFxuIiwgZGV2LT5kZXZpY2UuYnVzX2lkKTsKKworCXJldHVybiBkZXY7Cit9OworCisvKioKKyAqCWkyb19kZXZpY2VfcmVtb3ZlIC0gcmVtb3ZlIGFuIEkyTyBkZXZpY2UgZnJvbSB0aGUgSTJPIGNvcmUKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIHJlbGVhc2VkCisgKgorICoJSXMgdXNlZCBvbiBJMk8gY29udHJvbGxlciByZW1vdmFsIG9yIExDVCBtb2RpZmljYXRpb24sIHdoZW4gdGhlIGRldmljZQorICoJaXMgcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0uIE5vdGUgdGhhdCB0aGUgZGV2aWNlIGNvdWxkIHN0aWxsIGhhbmcKKyAqCWFyb3VuZCB1bnRpbCB0aGUgcmVmY291bnQgcmVhY2hlcyAwLgorICovCit2b2lkIGkyb19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2KQoreworCWkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9yZW1vdmVfYWxsKGkyb19kZXYpOworCWNsYXNzX2RldmljZV91bnJlZ2lzdGVyKCZpMm9fZGV2LT5jbGFzc2Rldik7CisJbGlzdF9kZWwoJmkyb19kZXYtPmxpc3QpOworCWRldmljZV91bnJlZ2lzdGVyKCZpMm9fZGV2LT5kZXZpY2UpOworfTsKKworLyoqCisgKglpMm9fZGV2aWNlX3BhcnNlX2xjdCAtIFBhcnNlIGEgcHJldmlvdXNseSBmZXRjaGVkIExDVCBhbmQgY3JlYXRlIGRldmljZXMKKyAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSBMQ1Qgc2hvdWxkIGJlIHBhcnNlZC4KKyAqCisgKglUaGUgTG9naWNhbCBDb25maWd1cmF0aW9uIFRhYmxlIHRlbGxzIHVzIHdoYXQgd2UgY2FuIHRhbGsgdG8gb24gdGhlCisgKglib2FyZC4gRm9yIGV2ZXJ5IGVudHJ5IHdlIGNyZWF0ZSBhbiBJMk8gZGV2aWNlLCB3aGljaCBpcyByZWdpc3RlcmVkIGluCisgKgl0aGUgSTJPIGNvcmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaTJvX2RldmljZV9wYXJzZV9sY3Qoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYsICp0bXA7CisJaTJvX2xjdCAqbGN0OworCWludCBpOworCWludCBtYXg7CisKKwlkb3duKCZjLT5sY3RfbG9jayk7CisKKwlpZiAoYy0+bGN0KQorCQlrZnJlZShjLT5sY3QpOworCisJbGN0ID0gYy0+ZGxjdC52aXJ0OworCisJYy0+bGN0ID0ga21hbGxvYyhsY3QtPnRhYmxlX3NpemUgKiA0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMtPmxjdCkgeworCQl1cCgmYy0+bGN0X2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobGN0LT50YWJsZV9zaXplICogNCA+IGMtPmRsY3QubGVuKSB7CisJCW1lbWNweV9mcm9taW8oYy0+bGN0LCBjLT5kbGN0LnZpcnQsIGMtPmRsY3QubGVuKTsKKwkJdXAoJmMtPmxjdF9sb2NrKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJbWVtY3B5X2Zyb21pbyhjLT5sY3QsIGMtPmRsY3QudmlydCwgbGN0LT50YWJsZV9zaXplICogNCk7CisKKwlsY3QgPSBjLT5sY3Q7CisKKwltYXggPSAobGN0LT50YWJsZV9zaXplIC0gMykgLyA5OworCisJcHJfZGVidWcoIiVzOiBMQ1QgaGFzICVkIGVudHJpZXMgKExDVCBzaXplOiAlZClcbiIsIGMtPm5hbWUsIG1heCwKKwkJIGxjdC0+dGFibGVfc2l6ZSk7CisKKwkvKiByZW1vdmUgZGV2aWNlcywgd2hpY2ggYXJlIG5vdCBpbiB0aGUgTENUIGFueW1vcmUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZjLT5kZXZpY2VzLCBsaXN0KSB7CisJCWludCBmb3VuZCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCQlpZiAobGN0LT5sY3RfZW50cnlbaV0udGlkID09IGRldi0+bGN0X2RhdGEudGlkKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFmb3VuZCkKKwkJCWkyb19kZXZpY2VfcmVtb3ZlKGRldik7CisJfQorCisJLyogYWRkIG5ldyBkZXZpY2VzLCB3aGljaCBhcmUgbmV3IGluIHRoZSBMQ1QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJaW50IGZvdW5kID0gMDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZjLT5kZXZpY2VzLCBsaXN0KSB7CisJCQlpZiAobGN0LT5sY3RfZW50cnlbaV0udGlkID09IGRldi0+bGN0X2RhdGEudGlkKSB7CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFmb3VuZCkKKwkJCWkyb19kZXZpY2VfYWRkKGMsICZsY3QtPmxjdF9lbnRyeVtpXSk7CisJfQorCXVwKCZjLT5sY3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX2RldmljZV9jbGFzc19zaG93X2NsYXNzX2lkIC0gRGlzcGxheXMgY2xhc3MgaWQgb2YgSTJPIGRldmljZQorICoJQGNkOiBjbGFzcyBkZXZpY2Ugb2Ygd2hpY2ggdGhlIGNsYXNzIGlkIHNob3VsZCBiZSBkaXNwbGF5ZWQKKyAqCUBidWY6IGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBjbGFzcyBpZCBzaG91bGQgYmUgcHJpbnRlZAorICoKKyAqCVJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3aGljaCBhcmUgcHJpbnRlZCBpbnRvIHRoZSBidWZmZXIuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGkyb19kZXZpY2VfY2xhc3Nfc2hvd19jbGFzc19pZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwKKwkJCQkJICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYgPSB0b19pMm9fZGV2aWNlKGNkLT5kZXYpOworCisJc3ByaW50ZihidWYsICIlMDN4XG4iLCBkZXYtPmxjdF9kYXRhLmNsYXNzX2lkKTsKKwlyZXR1cm4gc3RybGVuKGJ1ZikgKyAxOworfTsKKworLyoqCisgKglpMm9fZGV2aWNlX2NsYXNzX3Nob3dfdGlkIC0gRGlzcGxheXMgVElEIG9mIEkyTyBkZXZpY2UKKyAqCUBjZDogY2xhc3MgZGV2aWNlIG9mIHdoaWNoIHRoZSBUSUQgc2hvdWxkIGJlIGRpc3BsYXllZAorICoJQGJ1ZjogYnVmZmVyIGludG8gd2hpY2ggdGhlIGNsYXNzIGlkIHNob3VsZCBiZSBwcmludGVkCisgKgorICoJUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIGFyZSBwcmludGVkIGludG8gdGhlIGJ1ZmZlci4KKyAqLworc3RhdGljIHNzaXplX3QgaTJvX2RldmljZV9jbGFzc19zaG93X3RpZChzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkZXYgPSB0b19pMm9fZGV2aWNlKGNkLT5kZXYpOworCisJc3ByaW50ZihidWYsICIlMDN4XG4iLCBkZXYtPmxjdF9kYXRhLnRpZCk7CisJcmV0dXJuIHN0cmxlbihidWYpICsgMTsKK307CisKKy8qIEkyTyBkZXZpY2UgY2xhc3MgYXR0cmlidXRlcyAqLworc3RhdGljIENMQVNTX0RFVklDRV9BVFRSKGNsYXNzX2lkLCBTX0lSVUdPLCBpMm9fZGV2aWNlX2NsYXNzX3Nob3dfY2xhc3NfaWQsCisJCQkgTlVMTCk7CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIodGlkLCBTX0lSVUdPLCBpMm9fZGV2aWNlX2NsYXNzX3Nob3dfdGlkLCBOVUxMKTsKKworLyoqCisgKglpMm9fZGV2aWNlX2NsYXNzX2FkZCAtIEFkZHMgYXR0cmlidXRlcyB0byB0aGUgSTJPIGRldmljZQorICoJQGNkOiBJMk8gY2xhc3MgZGV2aWNlIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBJMk8gZGV2aWNlIGNsYXNzCisgKgorICoJVGhpcyBmdW5jdGlvbiBnZXQgY2FsbGVkIHdoZW4gYSBJMk8gZGV2aWNlIGlzIGFkZGVkIHRvIHRoZSBjbGFzcy4gSXQKKyAqCWNyZWF0ZXMgdGhlIGF0dHJpYnV0ZXMgZm9yIGVhY2ggZGV2aWNlIGFuZCBjcmVhdGVzIHVzZXIvcGFyZW50IHN5bWxpbmsKKyAqCWlmIG5lY2Vzc2FyeS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2RldmljZV9jbGFzc19hZGQoc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYsICp0bXA7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCisJaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoY2QtPmRldik7CisJYyA9IGkyb19kZXYtPmlvcDsKKworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjZCwgJmNsYXNzX2RldmljZV9hdHRyX2NsYXNzX2lkKTsKKwljbGFzc19kZXZpY2VfY3JlYXRlX2ZpbGUoY2QsICZjbGFzc19kZXZpY2VfYXR0cl90aWQpOworCisJLyogY3JlYXRlIHVzZXIgZW50cmllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKwl0bXAgPSBpMm9faW9wX2ZpbmRfZGV2aWNlKGkyb19kZXYtPmlvcCwgaTJvX2Rldi0+bGN0X2RhdGEudXNlcl90aWQpOworCWlmICh0bXApCisJCXN5c2ZzX2NyZWF0ZV9saW5rKCZpMm9fZGV2LT5kZXZpY2Uua29iaiwgJnRtcC0+ZGV2aWNlLmtvYmosCisJCQkJICAidXNlciIpOworCisJLyogY3JlYXRlIHVzZXIgZW50cmllcyByZWZlcmluZyB0byB0aGlzIGRldmljZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkgICAgaWYgKHRtcC0+bGN0X2RhdGEudXNlcl90aWQgPT0gaTJvX2Rldi0+bGN0X2RhdGEudGlkKQorCQlzeXNmc19jcmVhdGVfbGluaygmdG1wLT5kZXZpY2Uua29iaiwKKwkJCQkgICZpMm9fZGV2LT5kZXZpY2Uua29iaiwgInVzZXIiKTsKKworCS8qIGNyZWF0ZSBwYXJlbnQgZW50cmllcyBmb3IgdGhpcyBkZXZpY2UgKi8KKwl0bXAgPSBpMm9faW9wX2ZpbmRfZGV2aWNlKGkyb19kZXYtPmlvcCwgaTJvX2Rldi0+bGN0X2RhdGEucGFyZW50X3RpZCk7CisJaWYgKHRtcCkKKwkJc3lzZnNfY3JlYXRlX2xpbmsoJmkyb19kZXYtPmRldmljZS5rb2JqLCAmdG1wLT5kZXZpY2Uua29iaiwKKwkJCQkgICJwYXJlbnQiKTsKKworCS8qIGNyZWF0ZSBwYXJlbnQgZW50cmllcyByZWZlcmluZyB0byB0aGlzIGRldmljZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkgICAgaWYgKHRtcC0+bGN0X2RhdGEucGFyZW50X3RpZCA9PSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpCisJCXN5c2ZzX2NyZWF0ZV9saW5rKCZ0bXAtPmRldmljZS5rb2JqLAorCQkJCSAgJmkyb19kZXYtPmRldmljZS5rb2JqLCAicGFyZW50Iik7CisKKwlyZXR1cm4gMDsKK307CisKKy8qIEkyTyBkZXZpY2UgY2xhc3MgaW50ZXJmYWNlICovCitzdGF0aWMgc3RydWN0IGNsYXNzX2ludGVyZmFjZSBpMm9fZGV2aWNlX2NsYXNzX2ludGVyZmFjZSA9IHsKKwkuY2xhc3MgPSAmaTJvX2RldmljZV9jbGFzcywKKwkuYWRkID0gaTJvX2RldmljZV9jbGFzc19hZGQKK307CisKKy8qCisgKglSdW4gdGltZSBzdXBwb3J0IHJvdXRpbmVzCisgKi8KKworLyoJSXNzdWUgVVRJTF9QQVJBTVNfR0VUIG9yIFVUSUxfUEFSQU1TX1NFVAorICoKKyAqCVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgZm9yIGFsbCBVdGlsUGFyYW1zR2V0L1NldCBvcGVyYXRpb25zLgorICoJVGhlIE9wZXJhdGlvbkxpc3QgaXMgZ2l2ZW4gaW4gb3BsaXN0LWJ1ZmZlciwKKyAqCWFuZCByZXN1bHRzIGFyZSByZXR1cm5lZCBpbiByZXNsaXN0LWJ1ZmZlci4KKyAqCU5vdGUgdGhhdCB0aGUgbWluaW11bSBzaXplZCByZXNsaXN0IGlzIDggYnl0ZXMgYW5kIGNvbnRhaW5zCisgKglSZXN1bHRDb3VudCwgRXJyb3JJbmZvU2l6ZSwgQmxvY2tTdGF0dXMgYW5kIEJsb2NrU2l6ZS4KKyAqLworCitpbnQgaTJvX3Bhcm1faXNzdWUoc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYsIGludCBjbWQsIHZvaWQgKm9wbGlzdCwKKwkJICAgaW50IG9wbGVuLCB2b2lkICpyZXNsaXN0LCBpbnQgcmVzbGVuKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJdTMyICpyZXMzMiA9ICh1MzIgKikgcmVzbGlzdDsKKwl1MzIgKnJlc3RtcCA9ICh1MzIgKikgcmVzbGlzdDsKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSA9IDA7CisJaW50IHJjOworCXN0cnVjdCBpMm9fZG1hIHJlczsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBpMm9fZGV2LT5pb3A7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmMtPnBkZXYtPmRldjsKKworCXJlcy52aXJ0ID0gTlVMTDsKKworCWlmIChpMm9fZG1hX2FsbG9jKGRldiwgJnJlcywgcmVzbGVuLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKSB7CisJCWkyb19kbWFfZnJlZShkZXYsICZyZXMpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlpID0gMDsKKwl3cml0ZWwoY21kIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBpMm9fZGV2LT5sY3RfZGF0YS50aWQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKDAsICZtc2ctPmJvZHlbaSsrXSk7CisJd3JpdGVsKDB4NEMwMDAwMDAgfCBvcGxlbiwgJm1zZy0+Ym9keVtpKytdKTsJLyogT3BlcmF0aW9uTGlzdCAqLworCW1lbWNweV90b2lvKCZtc2ctPmJvZHlbaV0sIG9wbGlzdCwgb3BsZW4pOworCWkgKz0gKG9wbGVuIC8gNCArIChvcGxlbiAlIDQgPyAxIDogMCkpOworCXdyaXRlbCgweEQwMDAwMDAwIHwgcmVzLmxlbiwgJm1zZy0+Ym9keVtpKytdKTsJLyogUmVzdWx0TGlzdCAqLworCXdyaXRlbChyZXMucGh5cywgJm1zZy0+Ym9keVtpKytdKTsKKworCXdyaXRlbChJMk9fTUVTU0FHRV9TSVpFKGkgKyBzaXplb2Yoc3RydWN0IGkyb19tZXNzYWdlKSAvIDQpIHwKKwkgICAgICAgU0dMX09GRlNFVF81LCAmbXNnLT51LmhlYWRbMF0pOworCisJcmMgPSBpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0oYywgbSwgMTAsICZyZXMpOworCisJLyogVGhpcyBvbmx5IGxvb2tzIGxpa2UgYSBtZW1vcnkgbGVhayAtIGRvbid0ICJmaXgiIGl0LiAqLworCWlmIChyYyA9PSAtRVRJTUVET1VUKQorCQlyZXR1cm4gcmM7CisKKwltZW1jcHlfZnJvbWlvKHJlc2xpc3QsIHJlcy52aXJ0LCByZXMubGVuKTsKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmcmVzKTsKKworCS8qIFF1ZXJ5IGZhaWxlZCAqLworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCS8qCisJICogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyBvZiBSZXN1bHQgTElTVAorCSAqIFdlIG5lZWQgdG8gbG9vcCB0aHJvdWdoIGVhY2ggUmVzdWx0IEJMT0NLIGFuZCBncmFiIHRoZSBsZW5ndGgKKwkgKi8KKwlyZXN0bXAgPSByZXMzMiArIDE7CisJbGVuID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgKHJlczMyWzBdICYgMFgwMDAwRkZGRik7IGkrKykgeworCQlpZiAocmVzdG1wWzBdICYgMHgwMEZGMDAwMCkgewkvKiBCbG9ja1N0YXR1cyAhPSBTVUNDRVNTICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzIC0gRXJyb3I6XG4gIEVycm9ySW5mb1NpemUgPSAweCUwMngsICIKKwkJCSAgICAgICAiQmxvY2tTdGF0dXMgPSAweCUwMngsIEJsb2NrU2l6ZSA9IDB4JTA0eFxuIiwKKwkJCSAgICAgICAoY21kID09CisJCQkJSTJPX0NNRF9VVElMX1BBUkFNU19TRVQpID8gIlBBUkFNU19TRVQiIDoKKwkJCSAgICAgICAiUEFSQU1TX0dFVCIsIHJlczMyWzFdID4+IDI0LAorCQkJICAgICAgIChyZXMzMlsxXSA+PiAxNikgJiAweEZGLCByZXMzMlsxXSAmIDB4RkZGRik7CisKKwkJCS8qCisJCQkgKiAgICAgIElmIHRoaXMgaXMgdGhlIG9ubHkgcmVxdWVzdCx0aGFuIHdlIHJldHVybiBhbiBlcnJvcgorCQkJICovCisJCQlpZiAoKHJlczMyWzBdICYgMHgwMDAwRkZGRikgPT0gMSkgeworCQkJCXJldHVybiAtKChyZXMzMlsxXSA+PiAxNikgJiAweEZGKTsJLyogLUJsb2NrU3RhdHVzICovCisJCQl9CisJCX0KKwkJbGVuICs9IHJlc3RtcFswXSAmIDB4MDAwMEZGRkY7CS8qIExlbmd0aCBvZiByZXMgQkxPQ0sgKi8KKwkJcmVzdG1wICs9IHJlc3RtcFswXSAmIDB4MDAwMEZGRkY7CS8qIFNraXAgdG8gbmV4dCBCTE9DSyAqLworCX0KKwlyZXR1cm4gKGxlbiA8PCAyKTsJLyogYnl0ZXMgdXNlZCBieSByZXN1bHQgbGlzdCAqLworfQorCisvKgorICoJIFF1ZXJ5IG9uZSBmaWVsZCBncm91cCB2YWx1ZSBvciBhIHdob2xlIHNjYWxhciBncm91cC4KKyAqLworaW50IGkyb19wYXJtX2ZpZWxkX2dldChzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiwgaW50IGdyb3VwLCBpbnQgZmllbGQsCisJCSAgICAgICB2b2lkICpidWYsIGludCBidWZsZW4pCit7CisJdTE2IG9wYmxrW10gPSB7IDEsIDAsIEkyT19QQVJBTVNfRklFTERfR0VULCBncm91cCwgMSwgZmllbGQgfTsKKwl1OCByZXNibGtbOCArIGJ1Zmxlbl07CS8qIDggYnl0ZXMgZm9yIGhlYWRlciAqLworCWludCBzaXplOworCisJaWYgKGZpZWxkID09IC0xKQkvKiB3aG9sZSBncm91cCAqLworCQlvcGJsa1s0XSA9IC0xOworCisJc2l6ZSA9IGkyb19wYXJtX2lzc3VlKGkyb19kZXYsIEkyT19DTURfVVRJTF9QQVJBTVNfR0VULCBvcGJsaywKKwkJCSAgICAgIHNpemVvZihvcGJsayksIHJlc2Jsaywgc2l6ZW9mKHJlc2JsaykpOworCisJbWVtY3B5KGJ1ZiwgcmVzYmxrICsgOCwgYnVmbGVuKTsJLyogY3V0IG9mZiBoZWFkZXIgKi8KKworCWlmIChzaXplID4gYnVmbGVuKQorCQlyZXR1cm4gYnVmbGVuOworCisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiAJaWYgb3BlciA9PSBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgZ2V0IGZyb20gYWxsIHJvd3MKKyAqIAkJaWYgZmllbGRjb3VudCA9PSAtMSByZXR1cm4gYWxsIGZpZWxkcworICoJCQlpYnVmIGFuZCBpYnVmbGVuIGFyZSB1bnVzZWQgKHVzZSBOVUxMLCAwKQorICogCQllbHNlIHJldHVybiBzcGVjaWZpYyBmaWVsZHMKKyAqICAJCQlpYnVmIGNvbnRhaW5zIGZpZWxkaW5kZXhlcworICoKKyAqIAlpZiBvcGVyID09IEkyT19QQVJBTVNfTElTVF9HRVQsIGdldCBmcm9tIHNwZWNpZmljIHJvd3MKKyAqIAkJaWYgZmllbGRjb3VudCA9PSAtMSByZXR1cm4gYWxsIGZpZWxkcworICoJCQlpYnVmIGNvbnRhaW5zIHJvd2NvdW50LCBrZXl2YWx1ZXMKKyAqIAkJZWxzZSByZXR1cm4gc3BlY2lmaWMgZmllbGRzCisgKgkJCWZpZWxkY291bnQgaXMgIyBvZiBmaWVsZGluZGV4ZXMKKyAqICAJCQlpYnVmIGNvbnRhaW5zIGZpZWxkaW5kZXhlcywgcm93Y291bnQsIGtleXZhbHVlcworICoKKyAqCVlvdSBjb3VsZCBhbHNvIHVzZSBkaXJlY3RseSBmdW5jdGlvbiBpMm9faXNzdWVfcGFyYW1zKCkuCisgKi8KK2ludCBpMm9fcGFybV90YWJsZV9nZXQoc3RydWN0IGkyb19kZXZpY2UgKmRldiwgaW50IG9wZXIsIGludCBncm91cCwKKwkJICAgICAgIGludCBmaWVsZGNvdW50LCB2b2lkICppYnVmLCBpbnQgaWJ1Zmxlbiwgdm9pZCAqcmVzYmxrLAorCQkgICAgICAgaW50IHJlc2xlbikKK3sKKwl1MTYgKm9wYmxrOworCWludCBzaXplOworCisJc2l6ZSA9IDEwICsgaWJ1ZmxlbjsKKwlpZiAoc2l6ZSAlIDQpCisJCXNpemUgKz0gNCAtIHNpemUgJSA0OworCisJb3BibGsgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChvcGJsayA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJvOiBubyBtZW1vcnkgZm9yIHF1ZXJ5IGJ1ZmZlci5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlvcGJsa1swXSA9IDE7CQkvKiBvcGVyYXRpb24gY291bnQgKi8KKwlvcGJsa1sxXSA9IDA7CQkvKiBwYWQgKi8KKwlvcGJsa1syXSA9IG9wZXI7CisJb3BibGtbM10gPSBncm91cDsKKwlvcGJsa1s0XSA9IGZpZWxkY291bnQ7CisJbWVtY3B5KG9wYmxrICsgNSwgaWJ1ZiwgaWJ1Zmxlbik7CS8qIG90aGVyIHBhcmFtcyAqLworCisJc2l6ZSA9IGkyb19wYXJtX2lzc3VlKGRldiwgSTJPX0NNRF9VVElMX1BBUkFNU19HRVQsIG9wYmxrLAorCQkJICAgICAgc2l6ZSwgcmVzYmxrLCByZXNsZW4pOworCisJa2ZyZWUob3BibGspOworCWlmIChzaXplID4gcmVzbGVuKQorCQlyZXR1cm4gcmVzbGVuOworCisJcmV0dXJuIHNpemU7Cit9CisKKy8qKgorICoJaTJvX2RldmljZV9pbml0IC0gSW5pdGlhbGl6ZSBJMk8gZGV2aWNlcworICoKKyAqCVJlZ2lzdGVycyB0aGUgSTJPIGRldmljZSBjbGFzcy4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpMm9fZGV2aWNlX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGNsYXNzX3JlZ2lzdGVyKCZpMm9fZGV2aWNlX2NsYXNzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJldHVybiBjbGFzc19pbnRlcmZhY2VfcmVnaXN0ZXIoJmkyb19kZXZpY2VfY2xhc3NfaW50ZXJmYWNlKTsKK307CisKKy8qKgorICoJaTJvX2RldmljZV9leGl0IC0gSTJPIGRldmljZXMgZXhpdCBmdW5jdGlvbgorICoKKyAqCVVucmVnaXN0ZXJzIHRoZSBJMk8gZGV2aWNlIGNsYXNzLgorICovCit2b2lkIGkyb19kZXZpY2VfZXhpdCh2b2lkKQoreworCWNsYXNzX2ludGVyZmFjZV9yZWdpc3RlcigmaTJvX2RldmljZV9jbGFzc19pbnRlcmZhY2UpOworCWNsYXNzX3VucmVnaXN0ZXIoJmkyb19kZXZpY2VfY2xhc3MpOworfTsKKworRVhQT1JUX1NZTUJPTChpMm9fZGV2aWNlX2NsYWltKTsKK0VYUE9SVF9TWU1CT0woaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlKTsKK0VYUE9SVF9TWU1CT0woaTJvX3Bhcm1fZmllbGRfZ2V0KTsKK0VYUE9SVF9TWU1CT0woaTJvX3Bhcm1fdGFibGVfZ2V0KTsKK0VYUE9SVF9TWU1CT0woaTJvX3Bhcm1faXNzdWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9kcml2ZXIuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmNGVkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZHJpdmVyLmMKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKglGdW5jdGlvbnMgdG8gaGFuZGxlIEkyTyBkcml2ZXJzIChPU01zKSBhbmQgSTJPIGJ1cyB0eXBlIGZvciBzeXNmcworICoKKyAqCUNvcHlyaWdodCAoQykgMjAwNAlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKglvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT4KKyAqCQkJaW5pdGlhbCB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyby5oPgorCisvKiBtYXhfZHJpdmVycyAtIE1heGltdW0gSTJPIGRyaXZlcnMgKE9TTXMpIHdoaWNoIGNvdWxkIGJlIHJlZ2lzdGVyZWQgKi8KK3Vuc2lnbmVkIGludCBpMm9fbWF4X2RyaXZlcnMgPSBJMk9fTUFYX0RSSVZFUlM7Cittb2R1bGVfcGFyYW1fbmFtZWQobWF4X2RyaXZlcnMsIGkyb19tYXhfZHJpdmVycywgdWludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9kcml2ZXJzLCAibWF4aW11bSBudW1iZXIgb2YgT1NNJ3MgdG8gc3VwcG9ydCIpOworCisvKiBJMk8gZHJpdmVycyBsb2NrIGFuZCBhcnJheSAqLworc3RhdGljIHNwaW5sb2NrX3QgaTJvX2RyaXZlcnNfbG9jazsKK3N0YXRpYyBzdHJ1Y3QgaTJvX2RyaXZlciAqKmkyb19kcml2ZXJzOworCisvKioKKyAqCWkyb19idXNfbWF0Y2ggLSBUZWxsIGlmIGEgSTJPIGRldmljZSBjbGFzcyBpZCBtYXRjaCB0aGUgY2xhc3MgaWRzIG9mCisgKgkJCXRoZSBJMk8gZHJpdmVyIChPU00pCisgKgorICoJQGRldjogZGV2aWNlIHdoaWNoIHNob3VsZCBiZSB2ZXJpZmllZAorICoJQGRydjogdGhlIGRyaXZlciB0byBtYXRjaCBhZ2FpbnN0CisgKgorICoJVXNlZCBieSB0aGUgYnVzIHRvIGNoZWNrIGlmIHRoZSBkcml2ZXIgd2FudHMgdG8gaGFuZGxlIHRoZSBkZXZpY2UuCisgKgorICoJUmV0dXJucyAxIGlmIHRoZSBjbGFzcyBpZHMgb2YgdGhlIGRyaXZlciBtYXRjaCB0aGUgY2xhc3MgaWQgb2YgdGhlCisgKglkZXZpY2UsIG90aGVyd2lzZSAwLgorICovCitzdGF0aWMgaW50IGkyb19idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2ID0gdG9faTJvX2RldmljZShkZXYpOworCXN0cnVjdCBpMm9fZHJpdmVyICppMm9fZHJ2ID0gdG9faTJvX2RyaXZlcihkcnYpOworCXN0cnVjdCBpMm9fY2xhc3NfaWQgKmlkcyA9IGkyb19kcnYtPmNsYXNzZXM7CisKKwlpZiAoaWRzKQorCQl3aGlsZSAoaWRzLT5jbGFzc19pZCAhPSBJMk9fQ0xBU1NfRU5EKSB7CisJCQlpZiAoaWRzLT5jbGFzc19pZCA9PSBpMm9fZGV2LT5sY3RfZGF0YS5jbGFzc19pZCkKKwkJCQlyZXR1cm4gMTsKKwkJCWlkcysrOworCQl9CisJcmV0dXJuIDA7Cit9OworCisvKiBJMk8gYnVzIHR5cGUgKi8KK3N0cnVjdCBidXNfdHlwZSBpMm9fYnVzX3R5cGUgPSB7CisJLm5hbWUgPSAiaTJvIiwKKwkubWF0Y2ggPSBpMm9fYnVzX21hdGNoLAorfTsKKworLyoqCisgKglpMm9fZHJpdmVyX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgYSBJMk8gZHJpdmVyIChPU00pIGluIHRoZSBJMk8gY29yZQorICoJQGRydjogSTJPIGRyaXZlciB3aGljaCBzaG91bGQgYmUgcmVnaXN0ZXJlZAorICoKKyAqCVJlZ2lzdGVycyB0aGUgT1NNIGRydiBpbiB0aGUgSTJPIGNvcmUgYW5kIGNyZWF0ZXMgYW4gZXZlbnQgcXVldWVzIGlmCisgKgluZWNlc3NhcnkuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgaTJvX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgaTJvX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwlpbnQgaTsKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlwcl9kZWJ1ZygiaTJvOiBSZWdpc3RlciBkcml2ZXIgJXNcbiIsIGRydi0+bmFtZSk7CisKKwlpZiAoZHJ2LT5ldmVudCkgeworCQlkcnYtPmV2ZW50X3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZShkcnYtPm5hbWUpOworCQlpZiAoIWRydi0+ZXZlbnRfcXVldWUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaTJvOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBldmVudCBxdWV1ZSAiCisJCQkgICAgICAgImZvciBkcml2ZXIgJXNcbiIsIGRydi0+bmFtZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlwcl9kZWJ1ZygiaTJvOiBFdmVudCBxdWV1ZSBpbml0aWFsaXplZCBmb3IgZHJpdmVyICVzXG4iLAorCQkJIGRydi0+bmFtZSk7CisJfSBlbHNlCisJCWRydi0+ZXZlbnRfcXVldWUgPSBOVUxMOworCisJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKKwlkcnYtPmRyaXZlci5idXMgPSAmaTJvX2J1c190eXBlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyb19kcml2ZXJzX2xvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkyb19kcml2ZXJzW2ldOyBpKyspCisJCWlmIChpID49IGkyb19tYXhfZHJpdmVycykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJpMm86IHRvbyBtYW55IGRyaXZlcnMgcmVnaXN0ZXJlZCwgIgorCQkJICAgICAgICJpbmNyZWFzZSBtYXhfZHJpdmVyc1xuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMm9fZHJpdmVyc19sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJZHJ2LT5jb250ZXh0ID0gaTsKKwlpMm9fZHJpdmVyc1tpXSA9IGRydjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyb19kcml2ZXJzX2xvY2ssIGZsYWdzKTsKKworCXByX2RlYnVnKCJpMm86IGRyaXZlciAlcyBnZXRzIGNvbnRleHQgaWQgJWRcbiIsIGRydi0+bmFtZSwKKwkJIGRydi0+Y29udGV4dCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZpMm9fY29udHJvbGxlcnMsIGxpc3QpIHsKKwkJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXY7CisKKwkJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9hZGQoZHJ2LCBjKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpMm9fZGV2LCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkJCWkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9hZGQoZHJ2LCBpMm9fZGV2KTsKKwl9CisKKworCXJjID0gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJaWYgKHJjKQorCQlkZXN0cm95X3dvcmtxdWV1ZShkcnYtPmV2ZW50X3F1ZXVlKTsKKworCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2RyaXZlcl91bnJlZ2lzdGVyIC0gVW5yZWdpc3RlciBhIEkyTyBkcml2ZXIgKE9TTSkgZnJvbSB0aGUgSTJPIGNvcmUKKyAqCUBkcnY6IEkyTyBkcml2ZXIgd2hpY2ggc2hvdWxkIGJlIHVucmVnaXN0ZXJlZAorICoKKyAqCVVucmVnaXN0ZXJzIHRoZSBPU00gZHJ2IGZyb20gdGhlIEkyTyBjb3JlIGFuZCBjbGVhbnVwIGV2ZW50IHF1ZXVlcyBpZgorICoJbmVjZXNzYXJ5LgorICovCit2b2lkIGkyb19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaTJvX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcHJfZGVidWcoImkybzogdW5yZWdpc3RlciBkcml2ZXIgJXNcbiIsIGRydi0+bmFtZSk7CisKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KSB7CisJCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2OworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoaTJvX2RldiwgJmMtPmRldmljZXMsIGxpc3QpCisJCSAgICBpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfcmVtb3ZlKGRydiwgaTJvX2Rldik7CisKKwkJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9yZW1vdmUoZHJ2LCBjKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJvX2RyaXZlcnNfbG9jaywgZmxhZ3MpOworCWkyb19kcml2ZXJzW2Rydi0+Y29udGV4dF0gPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyb19kcml2ZXJzX2xvY2ssIGZsYWdzKTsKKworCWlmIChkcnYtPmV2ZW50X3F1ZXVlKSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKGRydi0+ZXZlbnRfcXVldWUpOworCQlkcnYtPmV2ZW50X3F1ZXVlID0gTlVMTDsKKwkJcHJfZGVidWcoImkybzogZXZlbnQgcXVldWUgcmVtb3ZlZCBmb3IgJXNcbiIsIGRydi0+bmFtZSk7CisJfQorfTsKKworLyoqCisgKglpMm9fZHJpdmVyX2Rpc3BhdGNoIC0gZGlzcGF0Y2ggYW4gSTJPIHJlcGx5IG1lc3NhZ2UKKyAqCUBjOiBJMk8gY29udHJvbGxlciBvZiB0aGUgbWVzc2FnZQorICoJQG06IEkyTyBtZXNzYWdlIG51bWJlcgorICoJQG1zZzogSTJPIG1lc3NhZ2UgdG8gYmUgZGVsaXZlcmVkCisgKgorICoJVGhlIHJlcGx5IGlzIGRlbGl2ZXJlZCB0byB0aGUgZHJpdmVyIGZyb20gd2hpY2ggdGhlIG9yaWdpbmFsIG1lc3NhZ2UKKyAqCXdhcy4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCB0aGUgbWVzc2FnZSBzaG91bGQgbm90IGJlIGZsdXNoZWQuIFJldHVybnMgPiAwCisgKglvbiBzdWNjZXNzIGFuZCBpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgZmx1c2hlZCBhZnRlcndvcmRzLiBSZXR1cm5zCisgKgluZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUgKHRoZSBtZXNzYWdlIHdpbGwgYmUgZmx1c2hlZCB0b28pLgorICovCitpbnQgaTJvX2RyaXZlcl9kaXNwYXRjaChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtLAorCQkJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZykKK3sKKwlzdHJ1Y3QgaTJvX2RyaXZlciAqZHJ2OworCXUzMiBjb250ZXh0ID0gcmVhZGwoJm1zZy0+dS5zLmljbnR4dCk7CisKKwlpZiAobGlrZWx5KGNvbnRleHQgPCBpMm9fbWF4X2RyaXZlcnMpKSB7CisJCXNwaW5fbG9jaygmaTJvX2RyaXZlcnNfbG9jayk7CisJCWRydiA9IGkyb19kcml2ZXJzW2NvbnRleHRdOworCQlzcGluX3VubG9jaygmaTJvX2RyaXZlcnNfbG9jayk7CisKKwkJaWYgKHVubGlrZWx5KCFkcnYpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU3B1cmlvdXMgcmVwbHkgdG8gdW5rbm93biAiCisJCQkgICAgICAgImRyaXZlciAlZFxuIiwgYy0+bmFtZSwgY29udGV4dCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmICgocmVhZGwoJm1zZy0+dS5oZWFkWzFdKSA+PiAyNCkgPT0gSTJPX0NNRF9VVElMX0VWVF9SRUdJU1RFUikgeworCQkJc3RydWN0IGkyb19kZXZpY2UgKmRldiwgKnRtcDsKKwkJCXN0cnVjdCBpMm9fZXZlbnQgKmV2dDsKKwkJCXUxNiBzaXplOworCQkJdTE2IHRpZDsKKworCQkJdGlkID0gcmVhZGwoJm1zZy0+dS5oZWFkWzFdKSAmIDB4MWZmZjsKKworCQkJcHJfZGVidWcoIiVzOiBldmVudCByZWNlaXZlZCBmcm9tIGRldmljZSAlZFxuIiwgYy0+bmFtZSwKKwkJCQkgdGlkKTsKKworCQkJLyogY3V0IG9mIGhlYWRlciBmcm9tIG1lc3NhZ2Ugc2l6ZSAoaW4gMzItYml0IHdvcmRzKSAqLworCQkJc2l6ZSA9IChyZWFkbCgmbXNnLT51LmhlYWRbMF0pID4+IDE2KSAtIDU7CisKKwkJCWV2dCA9IGttYWxsb2Moc2l6ZSAqIDQgKyBzaXplb2YoKmV2dCksIEdGUF9BVE9NSUMpOworCQkJaWYgKCFldnQpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQltZW1zZXQoZXZ0LCAwLCBzaXplICogNCArIHNpemVvZigqZXZ0KSk7CisKKwkJCWV2dC0+c2l6ZSA9IHNpemU7CisJCQltZW1jcHlfZnJvbWlvKCZldnQtPnRjbnR4dCwgJm1zZy0+dS5zLnRjbnR4dCwKKwkJCQkgICAgICAoc2l6ZSArIDIpICogNCk7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmMtPmRldmljZXMsIGxpc3QpCisJCQkgICAgaWYgKGRldi0+bGN0X2RhdGEudGlkID09IHRpZCkgeworCQkJCWV2dC0+aTJvX2RldiA9IGRldjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJSU5JVF9XT1JLKCZldnQtPndvcmssICh2b2lkICgqKSh2b2lkICopKWRydi0+ZXZlbnQsCisJCQkJICBldnQpOworCQkJcXVldWVfd29yayhkcnYtPmV2ZW50X3F1ZXVlLCAmZXZ0LT53b3JrKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJaWYgKGxpa2VseShkcnYtPnJlcGx5KSkKKwkJCXJldHVybiBkcnYtPnJlcGx5KGMsIG0sIG1zZyk7CisJCWVsc2UKKwkJCXByX2RlYnVnKCIlczogUmVwbHkgdG8gZHJpdmVyICVzLCBidXQgbm8gcmVwbHkgZnVuY3Rpb24iCisJCQkJICIgZGVmaW5lZCFcbiIsIGMtPm5hbWUsIGRydi0+bmFtZSk7CisJCXJldHVybiAtRUlPOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogU3B1cmlvdXMgcmVwbHkgdG8gdW5rbm93biBkcml2ZXIgIgorCQkgICAgICAgIiVkXG4iLCBjLT5uYW1lLCByZWFkbCgmbXNnLT51LnMuaWNudHh0KSk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qKgorICoJaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9hZGRfYWxsIC0gU2VuZCBub3RpZnkgb2YgYWRkZWQgY29udHJvbGxlcgorICoJCQkJCSAgICAgICB0byBhbGwgSTJPIGRyaXZlcnMKKyAqCisgKglTZW5kIG5vdGlmaWNhdGlvbnMgdG8gYWxsIHJlZ2lzdGVyZWQgZHJpdmVycyB0aGF0IGEgbmV3IGNvbnRyb2xsZXIgd2FzCisgKglhZGRlZC4KKyAqLwordm9pZCBpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX2FkZF9hbGwoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWludCBpOworCXN0cnVjdCBpMm9fZHJpdmVyICpkcnY7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTJPX01BWF9EUklWRVJTOyBpKyspIHsKKwkJZHJ2ID0gaTJvX2RyaXZlcnNbaV07CisKKwkJaWYgKGRydikKKwkJCWkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfYWRkKGRydiwgYyk7CisJfQorfQorCisvKioKKyAqCWkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlX2FsbCAtIFNlbmQgbm90aWZ5IG9mIHJlbW92ZWQKKyAqCQkJCQkJICBjb250cm9sbGVyIHRvIGFsbCBJMk8gZHJpdmVycworICoKKyAqCVNlbmQgbm90aWZpY2F0aW9ucyB0byBhbGwgcmVnaXN0ZXJlZCBkcml2ZXJzIHRoYXQgYSBjb250cm9sbGVyIHdhcworICoJcmVtb3ZlZC4KKyAqLwordm9pZCBpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZV9hbGwoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWludCBpOworCXN0cnVjdCBpMm9fZHJpdmVyICpkcnY7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTJPX01BWF9EUklWRVJTOyBpKyspIHsKKwkJZHJ2ID0gaTJvX2RyaXZlcnNbaV07CisKKwkJaWYgKGRydikKKwkJCWkyb19kcml2ZXJfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlKGRydiwgYyk7CisJfQorfQorCisvKioKKyAqCWkyb19kcml2ZXJfbm90aWZ5X2RldmljZV9hZGRfYWxsIC0gU2VuZCBub3RpZnkgb2YgYWRkZWQgZGV2aWNlIHRvIGFsbAorICoJCQkJCSAgIEkyTyBkcml2ZXJzCisgKgorICoJU2VuZCBub3RpZmljYXRpb25zIHRvIGFsbCByZWdpc3RlcmVkIGRyaXZlcnMgdGhhdCBhIGRldmljZSB3YXMgYWRkZWQuCisgKi8KK3ZvaWQgaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZF9hbGwoc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYpCit7CisJaW50IGk7CisJc3RydWN0IGkyb19kcml2ZXIgKmRydjsKKworCWZvciAoaSA9IDA7IGkgPCBJMk9fTUFYX0RSSVZFUlM7IGkrKykgeworCQlkcnYgPSBpMm9fZHJpdmVyc1tpXTsKKworCQlpZiAoZHJ2KQorCQkJaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZChkcnYsIGkyb19kZXYpOworCX0KK30KKworLyoqCisgKglpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfcmVtb3ZlX2FsbCAtIFNlbmQgbm90aWZ5IG9mIHJlbW92ZWQgZGV2aWNlIHRvCisgKgkJCQkJICAgICAgYWxsIEkyTyBkcml2ZXJzCisgKgorICoJU2VuZCBub3RpZmljYXRpb25zIHRvIGFsbCByZWdpc3RlcmVkIGRyaXZlcnMgdGhhdCBhIGRldmljZSB3YXMgcmVtb3ZlZC4KKyAqLwordm9pZCBpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfcmVtb3ZlX2FsbChzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTJvX2RyaXZlciAqZHJ2OworCisJZm9yIChpID0gMDsgaSA8IEkyT19NQVhfRFJJVkVSUzsgaSsrKSB7CisJCWRydiA9IGkyb19kcml2ZXJzW2ldOworCisJCWlmIChkcnYpCisJCQlpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfcmVtb3ZlKGRydiwgaTJvX2Rldik7CisJfQorfQorCisvKioKKyAqCWkyb19kcml2ZXJfaW5pdCAtIGluaXRpYWxpemUgSTJPIGRyaXZlcnMgKE9TTXMpCisgKgorICoJUmVnaXN0ZXJzIHRoZSBJMk8gYnVzIGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhcnJheSBvZiBPU01zLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IF9faW5pdCBpMm9fZHJpdmVyX2luaXQodm9pZCkKK3sKKwlpbnQgcmMgPSAwOworCisJc3Bpbl9sb2NrX2luaXQoJmkyb19kcml2ZXJzX2xvY2spOworCisJaWYgKChpMm9fbWF4X2RyaXZlcnMgPCAyKSB8fCAoaTJvX21heF9kcml2ZXJzID4gNjQpIHx8CisJICAgICgoaTJvX21heF9kcml2ZXJzIF4gKGkyb19tYXhfZHJpdmVycyAtIDEpKSAhPQorCSAgICAgKDIgKiBpMm9fbWF4X2RyaXZlcnMgLSAxKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJvOiBtYXhfZHJpdmVycyBzZXQgdG8gJWQsIGJ1dCBtdXN0IGJlICIKKwkJICAgICAgICI+PTIgYW5kIDw9IDY0IGFuZCBhIHBvd2VyIG9mIDJcbiIsIGkyb19tYXhfZHJpdmVycyk7CisJCWkyb19tYXhfZHJpdmVycyA9IEkyT19NQVhfRFJJVkVSUzsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiaTJvOiBtYXggZHJpdmVycyA9ICVkXG4iLCBpMm9fbWF4X2RyaXZlcnMpOworCisJaTJvX2RyaXZlcnMgPQorCSAgICBrbWFsbG9jKGkyb19tYXhfZHJpdmVycyAqIHNpemVvZigqaTJvX2RyaXZlcnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWkyb19kcml2ZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChpMm9fZHJpdmVycywgMCwgaTJvX21heF9kcml2ZXJzICogc2l6ZW9mKCppMm9fZHJpdmVycykpOworCisJcmMgPSBidXNfcmVnaXN0ZXIoJmkyb19idXNfdHlwZSk7CisKKwlpZiAocmMgPCAwKQorCQlrZnJlZShpMm9fZHJpdmVycyk7CisKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19kcml2ZXJfZXhpdCAtIGNsZWFuIHVwIEkyTyBkcml2ZXJzIChPU01zKQorICoKKyAqCVVucmVnaXN0ZXJzIHRoZSBJMk8gYnVzIGFuZCBmcmVlIGRyaXZlciBhcnJheS4KKyAqLwordm9pZCBfX2V4aXQgaTJvX2RyaXZlcl9leGl0KHZvaWQpCit7CisJYnVzX3VucmVnaXN0ZXIoJmkyb19idXNfdHlwZSk7CisJa2ZyZWUoaTJvX2RyaXZlcnMpOworfTsKKworRVhQT1JUX1NZTUJPTChpMm9fZHJpdmVyX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaTJvX2RyaXZlcl91bnJlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9hZGRfYWxsKTsKK0VYUE9SVF9TWU1CT0woaTJvX2RyaXZlcl9ub3RpZnlfY29udHJvbGxlcl9yZW1vdmVfYWxsKTsKK0VYUE9SVF9TWU1CT0woaTJvX2RyaXZlcl9ub3RpZnlfZGV2aWNlX2FkZF9hbGwpOworRVhQT1JUX1NZTUJPTChpMm9fZHJpdmVyX25vdGlmeV9kZXZpY2VfcmVtb3ZlX2FsbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2V4ZWMtb3NtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMWNiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vZXhlYy1vc20uYwpAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqCUV4ZWN1dGl2ZSBPU00KKyAqCisgKiAJQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIJUmVkIEhhdCBTb2Z0d2FyZQorICoKKyAqCVdyaXR0ZW4gYnkgQWxhbiBDb3gsIEJ1aWxkaW5nIE51bWJlciBUaHJlZSBMdGQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKglvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCUEgbG90IG9mIHRoZSBJMk8gbWVzc2FnZSBzaWRlIGNvZGUgZnJvbSB0aGlzIGlzIHRha2VuIGZyb20gdGhlIFJlZAorICoJQ3JlZWsgUkNQQ0k0NSBhZGFwdGVyIGRyaXZlciBieSBSZWQgQ3JlZWsgQ29tbXVuaWNhdGlvbnMKKyAqCisgKglGaXhlcy9hZGRpdGlvbnM6CisgKgkJUGhpbGlwcCBSdW1wZgorICoJCUp1aGEgU2llduRuZW4gPEp1aGEuU2lldmFuZW5AY3MuSGVsc2lua2kuRkk+CisgKgkJQXV2byBI5GtraW5lbiA8QXV2by5IYWtraW5lbkBjcy5IZWxzaW5raS5GST4KKyAqCQlEZWVwYWsgU2F4ZW5hIDxkZWVwYWtAcGxleGl0eS5uZXQ+CisgKgkJQm9qaSBUIEthbm5hbnRoYW5hbSA8Ym9qaS50Lmthbm5hbnRoYW5hbUBpbnRlbC5jb20+CisgKgkJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT46CisgKgkJCVBvcnRlZCB0byBMaW51eCAyLjUuCisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgorICoJCQlNaW5vciBmaXhlcyBmb3IgMi42LgorICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKKyAqCQkJU3VwcG9ydCBmb3Igc3lzZnMgaW5jbHVkZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUgT1NNX05BTUUgImV4ZWMtb3NtIgorCitzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fZXhlY19kcml2ZXI7CisKK3N0YXRpYyBpbnQgaTJvX2V4ZWNfbGN0X25vdGlmeShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBjaGFuZ2VfaW5kKTsKKworLyogTW9kdWxlIGludGVybmFsIGZ1bmN0aW9ucyBmcm9tIG90aGVyIHNvdXJjZXMgKi8KK2V4dGVybiBpbnQgaTJvX2RldmljZV9wYXJzZV9sY3Qoc3RydWN0IGkyb19jb250cm9sbGVyICopOworCisvKiBnbG9iYWwgd2FpdCBsaXN0IGZvciBQT1NUIFdBSVQgKi8KK3N0YXRpYyBMSVNUX0hFQUQoaTJvX2V4ZWNfd2FpdF9saXN0KTsKKworLyogV2FpdCBzdHJ1Y3QgbmVlZGVkIGZvciBQT1NUIFdBSVQgKi8KK3N0cnVjdCBpMm9fZXhlY193YWl0IHsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7CS8qIFBvaW50ZXIgdG8gV2FpdCBxdWV1ZSAqLworCXN0cnVjdCBpMm9fZG1hIGRtYTsJLyogRE1BIGJ1ZmZlcnMgdG8gZnJlZSBvbiBmYWlsdXJlICovCisJdTMyIHRjbnR4dDsJCS8qIHRyYW5zYWN0aW9uIGNvbnRleHQgZnJvbSByZXBseSAqLworCWludCBjb21wbGV0ZTsJCS8qIDEgaWYgcmVwbHkgcmVjZWl2ZWQgb3RoZXJ3aXNlIDAgKi8KKwl1MzIgbTsJCQkvKiBtZXNzYWdlIGlkICovCisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsJLyogcG9pbnRlciB0byB0aGUgcmVwbHkgbWVzc2FnZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogbm9kZSBpbiBnbG9iYWwgd2FpdCBsaXN0ICovCit9OworCisvKiBFeGVjIE9TTSBjbGFzcyBoYW5kbGluZyBkZWZpbml0aW9uICovCitzdGF0aWMgc3RydWN0IGkyb19jbGFzc19pZCBpMm9fZXhlY19jbGFzc19pZFtdID0geworCXtJMk9fQ0xBU1NfRVhFQ1VUSVZFfSwKKwl7STJPX0NMQVNTX0VORH0KK307CisKKy8qKgorICoJaTJvX2V4ZWNfd2FpdF9hbGxvYyAtIEFsbG9jYXRlIGEgaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QgYW4gaW5pdGlhbGl6ZSBpdAorICoKKyAqCUFsbG9jYXRlIHRoZSBpMm9fZXhlY193YWl0IHN0cnVjdCBhbmQgaW5pdGlhbGl6ZSB0aGUgd2FpdC4KKyAqCisgKglSZXR1cm5zIGkyb19leGVjX3dhaXQgcG9pbnRlciBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24KKyAqCWZhaWx1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2V4ZWNfd2FpdCAqaTJvX2V4ZWNfd2FpdF9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBpMm9fZXhlY193YWl0ICp3YWl0OworCisJd2FpdCA9IGttYWxsb2Moc2l6ZW9mKCp3YWl0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF3YWl0KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCW1lbXNldCh3YWl0LCAwLCBzaXplb2YoKndhaXQpKTsKKworCUlOSVRfTElTVF9IRUFEKCZ3YWl0LT5saXN0KTsKKworCXJldHVybiB3YWl0OworfTsKKworLyoqCisgKglpMm9fZXhlY193YWl0X2ZyZWUgLSBGcmVlIGEgaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QKKyAqCUBpMm9fZXhlY193YWl0OiBJMk8gd2FpdCBkYXRhIHdoaWNoIHNob3VsZCBiZSBjbGVhbmVkIHVwCisgKi8KK3N0YXRpYyB2b2lkIGkyb19leGVjX3dhaXRfZnJlZShzdHJ1Y3QgaTJvX2V4ZWNfd2FpdCAqd2FpdCkKK3sKKwlrZnJlZSh3YWl0KTsKK307CisKKy8qKgorICogCWkyb19tc2dfcG9zdF93YWl0X21lbSAtIFBvc3QgYW5kIHdhaXQgYSBtZXNzYWdlIHdpdGggRE1BIGJ1ZmZlcnMKKyAqCUBjOiBjb250cm9sbGVyCisgKglAbTogbWVzc2FnZSB0byBwb3N0CisgKglAdGltZW91dDogdGltZSBpbiBzZWNvbmRzIHRvIHdhaXQKKyAqCUBkbWE6IGkyb19kbWEgc3RydWN0IG9mIHRoZSBETUEgYnVmZmVyIHRvIGZyZWUgb24gZmFpbHVyZQorICoKKyAqIAlUaGlzIEFQSSBhbGxvd3MgYW4gT1NNIHRvIHBvc3QgYSBtZXNzYWdlIGFuZCB0aGVuIGJlIHRvbGQgd2hldGhlciBvcgorICoJbm90IHRoZSBzeXN0ZW0gcmVjZWl2ZWQgYSBzdWNjZXNzZnVsIHJlcGx5LiBJZiB0aGUgbWVzc2FnZSB0aW1lcyBvdXQKKyAqCXRoZW4gdGhlIHZhbHVlICctRVRJTUVET1VUJyBpcyByZXR1cm5lZC4gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZS4gSW4KKyAqCXRoaXMgc2l0dWF0aW9uIHRoZSBtZXNzYWdlIG1heSAoc2hvdWxkKSBjb21wbGV0ZSBhdCBhbiBpbmRlZmluaXRlIHRpbWUKKyAqCWluIHRoZSBmdXR1cmUuIFdoZW4gaXQgY29tcGxldGVzIGl0IHdpbGwgdXNlIHRoZSBtZW1vcnkgYnVmZmVyCisgKglhdHRhY2hlZCB0byB0aGUgcmVxdWVzdC4gSWYgLUVUSU1FRE9VVCBpcyByZXR1cm5lZCB0aGVuIHRoZSBtZW1vcnkKKyAqCWJ1ZmZlciBtdXN0IG5vdCBiZSBmcmVlZC4gSW5zdGVhZCB0aGUgZXZlbnQgY29tcGxldGlvbiB3aWxsIGZyZWUgdGhlbQorICoJZm9yIHlvdS4gSW4gYWxsIG90aGVyIGNhc2VzIHRoZSBidWZmZXIgYXJlIHlvdXIgcHJvYmxlbS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0oc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSwgdW5zaWduZWQgbG9uZworCQkJICB0aW1lb3V0LCBzdHJ1Y3QgaTJvX2RtYSAqZG1hKQoreworCURFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHdxKTsKKwlzdHJ1Y3QgaTJvX2V4ZWNfd2FpdCAqd2FpdDsKKwlzdGF0aWMgdTMyIHRjbnR4dCA9IDB4ODAwMDAwMDA7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZyA9IGMtPmluX3F1ZXVlLnZpcnQgKyBtOworCWludCByYyA9IDA7CisKKwl3YWl0ID0gaTJvX2V4ZWNfd2FpdF9hbGxvYygpOworCWlmICghd2FpdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodGNudHh0ID09IDB4ZmZmZmZmZmYpCisJCXRjbnR4dCA9IDB4ODAwMDAwMDA7CisKKwlpZiAoZG1hKQorCQl3YWl0LT5kbWEgPSAqZG1hOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBtZXNzYWdlIGluaXRpYXRvciBjb250ZXh0IGFuZCB0cmFuc2FjdGlvbiBjb250ZXh0LgorCSAqIFdlIHdpbGwgb25seSB1c2UgdHJhbnNhY3Rpb24gY29udGV4dHMgPj0gMHg4MDAwMDAwMCBmb3IgUE9TVCBXQUlULAorCSAqIHNvIHdlIGNvdWxkIGZpbmQgYSBQT1NUIFdBSVQgcmVwbHkgZWFzaWVyIGluIHRoZSByZXBseSBoYW5kbGVyLgorCSAqLworCXdyaXRlbChpMm9fZXhlY19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5zLmljbnR4dCk7CisJd2FpdC0+dGNudHh0ID0gdGNudHh0Kys7CisJd3JpdGVsKHdhaXQtPnRjbnR4dCwgJm1zZy0+dS5zLnRjbnR4dCk7CisKKwkvKgorCSAqIFBvc3QgdGhlIG1lc3NhZ2UgdG8gdGhlIGNvbnRyb2xsZXIuIEF0IHNvbWUgcG9pbnQgbGF0ZXIgaXQgd2lsbAorCSAqIHJldHVybi4gSWYgd2UgdGltZSBvdXQgYmVmb3JlIGl0IHJldHVybnMgdGhlbiBjb21wbGV0ZSB3aWxsIGJlIHplcm8uCisJICovCisJaTJvX21zZ19wb3N0KGMsIG0pOworCisJaWYgKCF3YWl0LT5jb21wbGV0ZSkgeworCQl3YWl0LT53cSA9ICZ3cTsKKwkJLyoKKwkJICogd2UgYWRkIGVsZW1lbnRzIGFkZCB0aGUgaGVhZCwgYmVjYXVzZSBpZiBhIGVudHJ5IGluIHRoZSBsaXN0CisJCSAqIHdpbGwgbmV2ZXIgYmUgcmVtb3ZlZCwgd2UgaGF2ZSB0byBpdGVyYXRlIG92ZXIgaXQgZXZlcnkgdGltZQorCQkgKi8KKwkJbGlzdF9hZGQoJndhaXQtPmxpc3QsICZpMm9fZXhlY193YWl0X2xpc3QpOworCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHdxLCB3YWl0LT5jb21wbGV0ZSwKKwkJCXRpbWVvdXQgKiBIWik7CisKKwkJd2FpdC0+d3EgPSBOVUxMOworCX0KKworCWJhcnJpZXIoKTsKKworCWlmICh3YWl0LT5jb21wbGV0ZSkgeworCQlpZiAocmVhZGwoJndhaXQtPm1zZy0+Ym9keVswXSkgPj4gMjQpCisJCQlyYyA9IHJlYWRsKCZ3YWl0LT5tc2ctPmJvZHlbMF0pICYgMHhmZjsKKwkJaTJvX2ZsdXNoX3JlcGx5KGMsIHdhaXQtPm0pOworCQlpMm9fZXhlY193YWl0X2ZyZWUod2FpdCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2UgY2Fubm90IHJlbW92ZSBpdCBub3cuIFRoaXMgaXMgaW1wb3J0YW50LiBXaGVuIGl0IGRvZXMKKwkJICogdGVybWluYXRlICh3aGljaCBpdCBtdXN0IGRvIGlmIHRoZSBjb250cm9sbGVyIGhhcyBub3QKKwkJICogZGllZC4uLikgdGhlbiBpdCB3aWxsIG90aGVyd2lzZSBzY3JpYmJsZSBvbiBzdHVmZi4KKwkJICoKKwkJICogRklYTUU6IHRyeSBhYm9ydCBtZXNzYWdlCisJCSAqLworCQlpZiAoZG1hKQorCQkJZG1hLT52aXJ0ID0gTlVMTDsKKworCQlyYyA9IC1FVElNRURPVVQ7CisJfQorCisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKglpMm9fbXNnX3Bvc3Rfd2FpdF9jb21wbGV0ZSAtIFJlcGx5IHRvIGEgaTJvX21zZ19wb3N0IHJlcXVlc3QgZnJvbSBJT1AKKyAqCUBjOiBJMk8gY29udHJvbGxlciB3aGljaCBhbnN3ZXJzCisgKglAbTogbWVzc2FnZSBpZAorICoJQG1zZzogcG9pbnRlciB0byB0aGUgSTJPIHJlcGx5IG1lc3NhZ2UKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBpbnRlcnJ1cHQgY29udGV4dCBvbmx5LiBJZiB0aGUgcmVwbHkgcmVhY2hlZAorICoJYmVmb3JlIHRoZSB0aW1lb3V0LCB0aGUgaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QgaXMgZmlsbGVkIHdpdGggdGhlIG1lc3NhZ2UKKyAqCWFuZCB0aGUgdGFzayB3aWxsIGJlIHdha2VkIHVwLiBUaGUgdGFzayBpcyBub3cgcmVzcG9uc2libGUgZm9yIHJldHVybmluZworICoJdGhlIG1lc3NhZ2UgbSBiYWNrIHRvIHRoZSBjb250cm9sbGVyISBJZiB0aGUgbWVzc2FnZSByZWFjaGVzIHVzIGFmdGVyCisgKgl0aGUgdGltZW91dCBjbGVhbiB1cCB0aGUgaTJvX2V4ZWNfd2FpdCBzdHJ1Y3QgKGluY2x1ZGluZyBhbGxvY2F0ZWQKKyAqCURNQSBidWZmZXIpLgorICoKKyAqCVJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSBtZXNzYWdlIG0gc2hvdWxkIG5vdCBiZSBnaXZlbiBiYWNrIHRvIHRoZQorICoJSTJPIGNvbnRyb2xsZXIsIG9yID4wIG9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBnaXZlbiBiYWNrCisgKglhZnRlcndvcmRzLiBSZXR1cm5zIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gSW4gdGhpcyBjYXNlIHRoZQorICoJbWVzc2FnZSBtdXN0IGFsc28gYmUgZ2l2ZW4gYmFjayB0byB0aGUgY29udHJvbGxlci4KKyAqLworc3RhdGljIGludCBpMm9fbXNnX3Bvc3Rfd2FpdF9jb21wbGV0ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtLAorCQkJCSAgICAgIHN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2cpCit7CisJc3RydWN0IGkyb19leGVjX3dhaXQgKndhaXQsICp0bXA7CisJc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKKwlpbnQgcmMgPSAxOworCXUzMiBjb250ZXh0OworCisJc3Bpbl9sb2NrX2luaXQoJmxvY2spOworCisJY29udGV4dCA9IHJlYWRsKCZtc2ctPnUucy50Y250eHQpOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIHNlYXJjaCB0aHJvdWdoIHRoZSBpMm9fZXhlY193YWl0X2xpc3QgdG8gc2VlIGlmIHRoZSBnaXZlbgorCSAqIG1lc3NhZ2UgaXMgc3RpbGwgb3V0c3RhbmRpbmcuIElmIG5vdCwgaXQgbWVhbnMgdGhhdCB0aGUgSU9QIHRvb2sKKwkgKiBsb25nZXIgdG8gcmVzcG9uZCB0byB0aGUgbWVzc2FnZSB0aGFuIHdlIGhhZCBhbGxvd2VkIGFuZCB0aW1lciBoYXMKKwkgKiBhbHJlYWR5IGV4cGlyZWQuIE5vdCBtdWNoIHdlIGNhbiBkbyBhYm91dCB0aGF0IGV4Y2VwdCBsb2cgaXQgZm9yCisJICogZGVidWcgcHVycG9zZXMsIGluY3JlYXNlIHRpbWVvdXQsIGFuZCByZWNvbXBpbGUuCisJICovCisJc3Bpbl9sb2NrKCZsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2FpdCwgdG1wLCAmaTJvX2V4ZWNfd2FpdF9saXN0LCBsaXN0KSB7CisJCWlmICh3YWl0LT50Y250eHQgPT0gY29udGV4dCkgeworCQkJbGlzdF9kZWwoJndhaXQtPmxpc3QpOworCisJCQl3YWl0LT5tID0gbTsKKwkJCXdhaXQtPm1zZyA9IG1zZzsKKwkJCXdhaXQtPmNvbXBsZXRlID0gMTsKKworCQkJYmFycmllcigpOworCisJCQlpZiAod2FpdC0+d3EpIHsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUod2FpdC0+d3EpOworCQkJCXJjID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGRldmljZSAqZGV2OworCisJCQkJZGV2ID0gJmMtPnBkZXYtPmRldjsKKworCQkJCXByX2RlYnVnKCIlczogdGltZWRvdXQgcmVwbHkgcmVjZWl2ZWQhXG4iLAorCQkJCQkgYy0+bmFtZSk7CisJCQkJaTJvX2RtYV9mcmVlKGRldiwgJndhaXQtPmRtYSk7CisJCQkJaTJvX2V4ZWNfd2FpdF9mcmVlKHdhaXQpOworCQkJCXJjID0gLTE7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZsb2NrKTsKKworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmxvY2spOworCisJcHJfZGVidWcoIiVzOiBCb2d1cyByZXBseSBpbiBQT1NUIFdBSVQgKHRyLWNvbnRleHQ6ICUwOHgpIVxuIiwgYy0+bmFtZSwKKwkJIGNvbnRleHQpOworCisJcmV0dXJuIC0xOworfTsKKworLyoqCisgKglpMm9fZXhlY19wcm9iZSAtIENhbGxlZCBpZiBhIG5ldyBJMk8gZGV2aWNlIChleGVjdXRpdmUgY2xhc3MpIGFwcGVhcnMKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIHByb2JlZAorICoKKyAqCVJlZ2lzdGVycyBldmVudCBub3RpZmljYXRpb24gZm9yIGV2ZXJ5IGV2ZW50IGZyb20gRXhlY3V0aXZlIGRldmljZS4gVGhlCisgKglyZXR1cm4gaXMgYWx3YXlzIDAsIGJlY2F1c2Ugd2Ugd2FudCBhbGwgZGV2aWNlcyBvZiBjbGFzcyBFeGVjdXRpdmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2V4ZWNfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2ID0gdG9faTJvX2RldmljZShkZXYpOworCisJaTJvX2V2ZW50X3JlZ2lzdGVyKGkyb19kZXYsICZpMm9fZXhlY19kcml2ZXIsIDAsIDB4ZmZmZmZmZmYpOworCisJaTJvX2Rldi0+aW9wLT5leGVjID0gaTJvX2RldjsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fZXhlY19yZW1vdmUgLSBDYWxsZWQgb24gSTJPIGRldmljZSByZW1vdmFsCisgKglAZGV2OiBJMk8gZGV2aWNlIHdoaWNoIHdhcyByZW1vdmVkCisgKgorICoJVW5yZWdpc3RlcnMgZXZlbnQgbm90aWZpY2F0aW9uIGZyb20gRXhlY3V0aXZlIEkyTyBkZXZpY2UuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2V4ZWNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpMm9fZXZlbnRfcmVnaXN0ZXIodG9faTJvX2RldmljZShkZXYpLCAmaTJvX2V4ZWNfZHJpdmVyLCAwLCAwKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fZXhlY19sY3RfbW9kaWZpZWQgLSBDYWxsZWQgb24gTENUIE5PVElGWSByZXBseQorICoJQGM6IEkyTyBjb250cm9sbGVyIG9uIHdoaWNoIHRoZSBMQ1QgaGFzIG1vZGlmaWVkCisgKgorICoJVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGFzeW5jaHJvbnVzIExDVCBOT1RJRlkgcmVwbGllcy4gSXQgcGFyc2VzIHRoZQorICoJbmV3IExDVCBhbmQgaWYgdGhlIGJ1ZmZlciBmb3IgdGhlIExDVCB3YXMgdG8gc21hbGwgc2VuZHMgYSBMQ1QgTk9USUZZCisgKglhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgaTJvX2V4ZWNfbGN0X21vZGlmaWVkKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlpZiAoaTJvX2RldmljZV9wYXJzZV9sY3QoYykgPT0gLUVBR0FJTikKKwkJaTJvX2V4ZWNfbGN0X25vdGlmeShjLCAwKTsKK307CisKKy8qKgorICoJaTJvX2V4ZWNfcmVwbHkgLSAgSTJPIEV4ZWN1dGl2ZSByZXBseSBoYW5kbGVyCisgKglAYzogSTJPIGNvbnRyb2xsZXIgZnJvbSB3aGljaCB0aGUgcmVwbHkgY29tZXMKKyAqCUBtOiBtZXNzYWdlIGlkCisgKglAbXNnOiBwb2ludGVyIHRvIHRoZSBJMk8gcmVwbHkgbWVzc2FnZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LiBJZiBhIFBPU1QgV0FJVAorICoJcmVwbHkgd2FzIHJlY2VpdmVkLCBwYXNzIGl0IHRvIHRoZSBjb21wbGV0ZSBmdW5jdGlvbi4gSWYgYSBMQ1QgTk9USUZZCisgKglyZXBseSB3YXMgcmVjZWl2ZWQsIGEgbmV3IGV2ZW50IGlzIGNyZWF0ZWQgdG8gaGFuZGxlIHRoZSB1cGRhdGUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSByZXBseSBzaG91bGQgbm90IGJlIGZsdXNoZWQgb3IgPiAwCisgKglvbiBzdWNjZXNzIGFuZCBpZiB0aGUgcmVwbHkgc2hvdWxkIGJlIGZsdXNoZWQuIFJldHVybnMgbmVnYXRpdmUgZXJyb3IKKyAqCWNvZGUgb24gZmFpbHVyZSBhbmQgaWYgdGhlIHJlcGx5IHNob3VsZCBiZSBmbHVzaGVkLgorICovCitzdGF0aWMgaW50IGkyb19leGVjX3JlcGx5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0sCisJCQkgIHN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnKQoreworCWlmIChsZTMyX3RvX2NwdShtc2ctPnUuaGVhZFswXSkgJiBNU0dfRkFJTCkgewkvLyBGYWlsIGJpdCBpcyBzZXQKKwkJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKnBtc2c7CS8qIHByZXNlcnZlZCBtZXNzYWdlICovCisJCXUzMiBwbTsKKworCQlwbSA9IGxlMzJfdG9fY3B1KG1zZy0+Ym9keVszXSk7CisKKwkJcG1zZyA9IGkyb19tc2dfaW5fdG9fdmlydChjLCBwbSk7CisKKwkJaTJvX3JlcG9ydF9zdGF0dXMoS0VSTl9JTkZPLCAiaTJvX2NvcmUiLCBtc2cpOworCisJCS8qIFJlbGVhc2UgdGhlIHByZXNlcnZlZCBtc2cgYnkgcmVzdWJtaXR0aW5nIGl0IGFzIGEgTk9QICovCisJCWkyb19tc2dfbm9wKGMsIHBtKTsKKworCQkvKiBJZiByZXBseSB0byBpMm9fcG9zdF93YWl0IGZhaWxlZCwgcmV0dXJuIGNhdXNlcyBhIHRpbWVvdXQgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChsZTMyX3RvX2NwdShtc2ctPnUucy50Y250eHQpICYgMHg4MDAwMDAwMCkKKwkJcmV0dXJuIGkyb19tc2dfcG9zdF93YWl0X2NvbXBsZXRlKGMsIG0sIG1zZyk7CisKKwlpZiAoKGxlMzJfdG9fY3B1KG1zZy0+dS5oZWFkWzFdKSA+PiAyNCkgPT0gSTJPX0NNRF9MQ1RfTk9USUZZKSB7CisJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yazsKKworCQlwcl9kZWJ1ZygiJXM6IExDVCBub3RpZnkgcmVjZWl2ZWRcbiIsIGMtPm5hbWUpOworCisJCXdvcmsgPSBrbWFsbG9jKHNpemVvZigqd29yayksIEdGUF9BVE9NSUMpOworCQlpZiAoIXdvcmspCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlJTklUX1dPUksod29yaywgKHZvaWQgKCopKHZvaWQgKikpaTJvX2V4ZWNfbGN0X21vZGlmaWVkLCBjKTsKKwkJcXVldWVfd29yayhpMm9fZXhlY19kcml2ZXIuZXZlbnRfcXVldWUsIHdvcmspOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaGFwcGVucywgd2Ugd2FudCB0byBkdW1wIHRoZSBtZXNzYWdlIHRvIHRoZSBzeXNsb2cgc28KKwkgKiBpdCBjYW4gYmUgc2VudCBiYWNrIHRvIHRoZSBjYXJkIG1hbnVmYWN0dXJlciBieSB0aGUgZW5kIHVzZXIKKwkgKiB0byBhaWQgaW4gZGVidWdnaW5nLgorCSAqCisJICovCisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFVuc29saWNpdGVkIG1lc3NhZ2UgcmVwbHkgc2VudCB0byBjb3JlISIKKwkgICAgICAgIk1lc3NhZ2UgZHVtcGVkIHRvIHN5c2xvZ1xuIiwgYy0+bmFtZSk7CisJaTJvX2R1bXBfbWVzc2FnZShtc2cpOworCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKKy8qKgorICoJaTJvX2V4ZWNfZXZlbnQgLSBFdmVudCBoYW5kbGluZyBmdW5jdGlvbgorICoJQGV2dDogRXZlbnQgd2hpY2ggb2NjdXJzCisgKgorICoJSGFuZGxlcyBldmVudHMgc2VuZCBieSB0aGUgRXhlY3V0aXZlIGRldmljZS4gQXQgdGhlIG1vbWVudCBkb2VzIG5vdCBkbworICoJYW55dGhpbmcgdXNlZnVsLgorICovCitzdGF0aWMgdm9pZCBpMm9fZXhlY19ldmVudChzdHJ1Y3QgaTJvX2V2ZW50ICpldnQpCit7CisJb3NtX2luZm8oIkV2ZW50IHJlY2VpdmVkIGZyb20gZGV2aWNlOiAlZFxuIiwKKwkJIGV2dC0+aTJvX2Rldi0+bGN0X2RhdGEudGlkKTsKKwlrZnJlZShldnQpOworfTsKKworLyoqCisgKglpMm9fZXhlY19sY3RfZ2V0IC0gR2V0IHRoZSBJT1AncyBMb2dpY2FsIENvbmZpZ3VyYXRpb24gVGFibGUKKyAqCUBjOiBJMk8gY29udHJvbGxlciBmcm9tIHdoaWNoIHRoZSBMQ1Qgc2hvdWxkIGJlIGZldGNoZWQKKyAqCisgKglTZW5kIGEgTENUIE5PVElGWSByZXF1ZXN0IHRvIHRoZSBjb250cm9sbGVyLCBhbmQgd2FpdAorICoJSTJPX1RJTUVPVVRfTENUX0dFVCBzZWNvbmRzIHVudGlsIGFycml2YWwgb2YgcmVzcG9uc2UuIElmIHRoZSBMQ1QgaXMKKyAqCXRvIGxhcmdlLCByZXRyeSBpdC4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpMm9fZXhlY19sY3RfZ2V0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCWludCBpID0gMDsKKwlpbnQgcmMgPSAtRUFHQUlOOworCisJZm9yIChpID0gMTsgaSA8PSBJMk9fTENUX0dFVF9UUklFUzsgaSsrKSB7CisJCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwkJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwkJd3JpdGVsKEVJR0hUX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzYsICZtc2ctPnUuaGVhZFswXSk7CisJCXdyaXRlbChJMk9fQ01EX0xDVF9OT1RJRlkgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCQkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwkJd3JpdGVsKDB4ZmZmZmZmZmYsICZtc2ctPmJvZHlbMF0pOworCQl3cml0ZWwoMHgwMDAwMDAwMCwgJm1zZy0+Ym9keVsxXSk7CisJCXdyaXRlbCgweGQwMDAwMDAwIHwgYy0+ZGxjdC5sZW4sICZtc2ctPmJvZHlbMl0pOworCQl3cml0ZWwoYy0+ZGxjdC5waHlzLCAmbXNnLT5ib2R5WzNdKTsKKworCQlyYyA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIEkyT19USU1FT1VUX0xDVF9HRVQpOworCQlpZiAocmMgPCAwKQorCQkJYnJlYWs7CisKKwkJcmMgPSBpMm9fZGV2aWNlX3BhcnNlX2xjdChjKTsKKwkJaWYgKHJjICE9IC1FQUdBSU4pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJaTJvX2V4ZWNfbGN0X25vdGlmeSAtIFNlbmQgYSBhc3luY2hyb251cyBMQ1QgTk9USUZZIHJlcXVlc3QKKyAqCUBjOiBJMk8gY29udHJvbGxlciB0byB3aGljaCB0aGUgcmVxdWVzdCBzaG91bGQgYmUgc2VuZAorICoJQGNoYW5nZV9pbmQ6IGNoYW5nZSBpbmRpY2F0b3IKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHNlbmRzIGEgTENUIE5PVElGWSByZXF1ZXN0IHRvIHRoZSBJMk8gY29udHJvbGxlciB3aXRoCisgKgl0aGUgY2hhbmdlIGluZGljYXRvciBjaGFuZ2VfaW5kLiBJZiB0aGUgY2hhbmdlX2luZCA9PSAwIHRoZSBjb250cm9sbGVyCisgKglyZXBsaWVzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSByZXF1ZXN0LiBJZiBjaGFuZ2VfaW5kID4gMCB0aGUgcmVwbHkgaXMKKyAqCXNlbmQgYWZ0ZXIgY2hhbmdlIGluZGljYXRvciBvZiB0aGUgTENUIGlzID4gY2hhbmdlX2luZC4KKyAqLworc3RhdGljIGludCBpMm9fZXhlY19sY3Rfbm90aWZ5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIGNoYW5nZV9pbmQpCit7CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKworCWRldiA9ICZjLT5wZGV2LT5kZXY7CisKKwlpZiAoaTJvX2RtYV9yZWFsbG9jKGRldiwgJmMtPmRsY3QsIHNiLT5leHBlY3RlZF9sY3Rfc2l6ZSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRUlHSFRfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNiwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9MQ1RfTk9USUZZIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoaTJvX2V4ZWNfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOworCXdyaXRlbCgwLCAmbXNnLT51LnMudGNudHh0KTsJLyogRklYTUUgKi8KKwl3cml0ZWwoMHhmZmZmZmZmZiwgJm1zZy0+Ym9keVswXSk7CisJd3JpdGVsKGNoYW5nZV9pbmQsICZtc2ctPmJvZHlbMV0pOworCXdyaXRlbCgweGQwMDAwMDAwIHwgYy0+ZGxjdC5sZW4sICZtc2ctPmJvZHlbMl0pOworCXdyaXRlbChjLT5kbGN0LnBoeXMsICZtc2ctPmJvZHlbM10pOworCisJaTJvX21zZ19wb3N0KGMsIG0pOworCisJcmV0dXJuIDA7Cit9OworCisvKiBFeGVjIE9TTSBkcml2ZXIgc3RydWN0ICovCitzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fZXhlY19kcml2ZXIgPSB7CisJLm5hbWUgPSBPU01fTkFNRSwKKwkucmVwbHkgPSBpMm9fZXhlY19yZXBseSwKKwkuZXZlbnQgPSBpMm9fZXhlY19ldmVudCwKKwkuY2xhc3NlcyA9IGkyb19leGVjX2NsYXNzX2lkLAorCS5kcml2ZXIgPSB7CisJCSAgIC5wcm9iZSA9IGkyb19leGVjX3Byb2JlLAorCQkgICAucmVtb3ZlID0gaTJvX2V4ZWNfcmVtb3ZlLAorCQkgICB9LAorfTsKKworLyoqCisgKglpMm9fZXhlY19pbml0IC0gUmVnaXN0ZXJzIHRoZSBFeGVjIE9TTQorICoKKyAqCVJlZ2lzdGVycyB0aGUgRXhlYyBPU00gaW4gdGhlIEkyTyBjb3JlLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IF9faW5pdCBpMm9fZXhlY19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyb19kcml2ZXJfcmVnaXN0ZXIoJmkyb19leGVjX2RyaXZlcik7Cit9OworCisvKioKKyAqCWkyb19leGVjX2V4aXQgLSBSZW1vdmVzIHRoZSBFeGVjIE9TTQorICoKKyAqCVVucmVnaXN0ZXJzIHRoZSBFeGVjIE9TTSBmcm9tIHRoZSBJMk8gY29yZS4KKyAqLwordm9pZCBfX2V4aXQgaTJvX2V4ZWNfZXhpdCh2b2lkKQoreworCWkyb19kcml2ZXJfdW5yZWdpc3RlcigmaTJvX2V4ZWNfZHJpdmVyKTsKK307CisKK0VYUE9SVF9TWU1CT0woaTJvX21zZ19wb3N0X3dhaXRfbWVtKTsKK0VYUE9SVF9TWU1CT0woaTJvX2V4ZWNfbGN0X2dldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjc0Yzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fYmxvY2suYwpAQCAtMCwwICsxLDEyNDcgQEAKKy8qCisgKglCbG9jayBPU00KKyAqCisgKiAJQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIJUmVkIEhhdCBTb2Z0d2FyZQorICoKKyAqCVdyaXR0ZW4gYnkgQWxhbiBDb3gsIEJ1aWxkaW5nIE51bWJlciBUaHJlZSBMdGQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKglvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqCVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKglHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJRm9yIHRoZSBwdXJwb3NlIG9mIGF2b2lkaW5nIGRvdWJ0IHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yaworICoJZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHNoYWxsIGJlIGEgc3RhbmRhcmRzIGNvbXBsaWFudCBmb3JtIHN1Y2gKKyAqCWd6aXBwZWQgdGFyIGFuZCBub3Qgb25lIHJlcXVpcmluZyBhIHByb3ByaWV0YXJ5IG9yIHBhdGVudCBlbmN1bWJlcmVkCisgKgl0b29sIHRvIHVucGFjay4KKyAqCisgKglGaXhlcy9hZGRpdGlvbnM6CisgKgkJU3RldmUgUmFsc3RvbjoKKyAqCQkJTXVsdGlwbGUgZGV2aWNlIGhhbmRsaW5nIGVycm9yIGZpeGVzLAorICoJCQlBZGRlZCBhIHF1ZXVlIGRlcHRoLgorICoJCUFsYW4gQ294OgorICoJCQlGQzkyMCBoYXMgYW4gcm13IGJ1Zy4gRG9udCBvciBpbiB0aGUgZW5kIG1hcmtlci4KKyAqCQkJUmVtb3ZlZCBxdWV1ZSB3YWxrLCBmaXhlZCBmb3IgNjRiaXRuZXNzLgorICoJCQlSZXdyb3RlIG11Y2ggb2YgdGhlIGNvZGUgb3ZlciB0aW1lCisgKgkJCUFkZGVkIGluZGlyZWN0IGJsb2NrIGxpc3RzCisgKgkJCUhhbmRsZSA2NEsgbGltaXRzIG9uIG1hbnkgY29udHJvbGxlcnMKKyAqCQkJRG9uJ3QgdXNlIGluZGlyZWN0cyBvbiB0aGUgUHJvbWlzZSAoYnJlYWtzKQorICoJCQlIZWF2aWx5IGNob3AgZG93biB0aGUgcXVldWUgZGVwdGhzCisgKgkJRGVlcGFrIFNheGVuYToKKyAqCQkJSW5kZXBlbmRlbnQgcXVldWVzIHBlciBJT1AKKyAqCQkJU3VwcG9ydCBmb3IgZHluYW1pYyBkZXZpY2UgY3JlYXRpb24vZGVsZXRpb24KKyAqCQkJQ29kZSBjbGVhbnVwCisgKgkgICAgCQlTdXBwb3J0IGZvciBsYXJnZXIgSS9PcyB0aHJvdWdoIG1lcmdlKiBmdW5jdGlvbnMKKyAqCQkJKHRha2VuIGZyb20gREFDOTYwIGRyaXZlcikKKyAqCQlCb2ppIFQgS2FubmFudGhhbmFtOgorICoJCQlTZXQgdGhlIEkyTyBCbG9jayBkZXZpY2VzIHRvIGJlIGRldGVjdGVkIGluIGluY3JlYXNpbmcKKyAqCQkJb3JkZXIgb2YgVElEcyBkdXJpbmcgYm9vdC4KKyAqCQkJU2VhcmNoIGFuZCBzZXQgdGhlIEkyTyBibG9jayBkZXZpY2UgdGhhdCB3ZSBib290IG9mZgorICoJCQlmcm9tIGFzIHRoZSBmaXJzdCBkZXZpY2UgdG8gYmUgY2xhaW1lZCAoYXMgL2Rldi9pMm8vaGRhKQorICoJCQlQcm9wZXJseSBhdHRhY2gvZGV0YWNoIEkyTyBnZW5kaXNrIHN0cnVjdHVyZSBmcm9tIHRoZQorICoJCQlzeXN0ZW0gZ2VuZGlzayBsaXN0LiBUaGUgSTJPIGJsb2NrIGRldmljZXMgbm93IGFwcGVhciBpbgorICoJCQkvcHJvYy9wYXJ0aXRpb25zLgorICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKKyAqCQkJTWlub3IgYnVnZml4ZXMgZm9yIDIuNi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisKKyNpbmNsdWRlIDxsaW51eC9nZW5oZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisKKyNpbmNsdWRlICJpMm9fYmxvY2suaCIKKworI2RlZmluZSBPU01fTkFNRQkiYmxvY2stb3NtIgorI2RlZmluZSBPU01fVkVSU0lPTgkiJFJldiQiCisjZGVmaW5lIE9TTV9ERVNDUklQVElPTgkiSTJPIEJsb2NrIERldmljZSBPU00iCisKK3N0YXRpYyBzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fYmxvY2tfZHJpdmVyOworCisvKiBnbG9iYWwgQmxvY2sgT1NNIHJlcXVlc3QgbWVtcG9vbCAqLworc3RhdGljIHN0cnVjdCBpMm9fYmxvY2tfbWVtcG9vbCBpMm9fYmxrX3JlcV9wb29sOworCisvKiBCbG9jayBPU00gY2xhc3MgaGFuZGxpbmcgZGVmaW5pdGlvbiAqLworc3RhdGljIHN0cnVjdCBpMm9fY2xhc3NfaWQgaTJvX2Jsb2NrX2NsYXNzX2lkW10gPSB7CisJe0kyT19DTEFTU19SQU5ET01fQkxPQ0tfU1RPUkFHRX0sCisJe0kyT19DTEFTU19FTkR9Cit9OworCisvKioKKyAqCWkyb19ibG9ja19kZXZpY2VfZnJlZSAtIGZyZWUgdGhlIG1lbW9yeSBvZiB0aGUgSTJPIEJsb2NrIGRldmljZQorICoJQGRldjogSTJPIEJsb2NrIGRldmljZSwgd2hpY2ggc2hvdWxkIGJlIGNsZWFuZWQgdXAKKyAqCisgKglGcmVlcyB0aGUgcmVxdWVzdCBxdWV1ZSwgZ2VuZGlzayBhbmQgdGhlIGkyb19ibG9ja19kZXZpY2Ugc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBpMm9fYmxvY2tfZGV2aWNlX2ZyZWUoc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmRldikKK3sKKwlibGtfY2xlYW51cF9xdWV1ZShkZXYtPmdkLT5xdWV1ZSk7CisKKwlwdXRfZGlzayhkZXYtPmdkKTsKKworCWtmcmVlKGRldik7Cit9OworCisvKioKKyAqCWkyb19ibG9ja19yZW1vdmUgLSByZW1vdmUgdGhlIEkyTyBCbG9jayBkZXZpY2UgZnJvbSB0aGUgc3lzdGVtIGFnYWluCisgKglAZGV2OiBJMk8gQmxvY2sgZGV2aWNlIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkCisgKgorICoJUmVtb3ZlIGdlbmRpc2sgZnJvbSBzeXN0ZW0gYW5kIGZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkuCisgKgorICoJQWx3YXlzIHJldHVybnMgMC4KKyAqLworc3RhdGljIGludCBpMm9fYmxvY2tfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsa19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCW9zbV9pbmZvKCJEZXZpY2UgcmVtb3ZlZCAlc1xuIiwgaTJvX2Jsa19kZXYtPmdkLT5kaXNrX25hbWUpOworCisJaTJvX2V2ZW50X3JlZ2lzdGVyKGkyb19kZXYsICZpMm9fYmxvY2tfZHJpdmVyLCAwLCAwKTsKKworCWRlbF9nZW5kaXNrKGkyb19ibGtfZGV2LT5nZCk7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCWkyb19kZXZpY2VfY2xhaW1fcmVsZWFzZShpMm9fZGV2KTsKKworCWkyb19ibG9ja19kZXZpY2VfZnJlZShpMm9fYmxrX2Rldik7CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2RldmljZSBmbHVzaCAtIEZsdXNoIGFsbCBkaXJ0eSBkYXRhIG9mIEkyTyBkZXZpY2UgZGV2CisgKglAZGV2OiBJMk8gZGV2aWNlIHdoaWNoIHNob3VsZCBiZSBmbHVzaGVkCisgKgorICoJRmx1c2hlcyBhbGwgZGlydHkgZGF0YSBvbiBkZXZpY2UgZGV2LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fYmxvY2tfZGV2aWNlX2ZsdXNoKHN0cnVjdCBpMm9fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGRldi0+aW9wLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXdyaXRlbChGSVZFX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfQkxPQ0tfQ0ZMVVNIIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBkZXYtPmxjdF9kYXRhLnRpZCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwoNjAgPDwgMTYsICZtc2ctPmJvZHlbMF0pOworCW9zbV9kZWJ1ZygiRmx1c2hpbmcuLi5cbiIpOworCisJcmV0dXJuIGkyb19tc2dfcG9zdF93YWl0KGRldi0+aW9wLCBtLCA2MCk7Cit9OworCisvKioKKyAqCWkyb19ibG9ja19kZXZpY2VfbW91bnQgLSBNb3VudCAobG9hZCkgdGhlIG1lZGlhIG9mIGRldmljZSBkZXYKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIG1vdW50IHJlcXVlc3QKKyAqCUBtZWRpYV9pZDogTWVkaWEgSWRlbnRpZmllcgorICoKKyAqCUxvYWQgYSBtZWRpYSBpbnRvIGRyaXZlLiBJZGVudGlmaWVyIHNob3VsZCBiZSBzZXQgdG8gLTEsIGJlY2F1c2UgdGhlCisgKglzcGVjIGRvZXMgbm90IHN1cHBvcnQgYW55IG90aGVyIHZhbHVlLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fYmxvY2tfZGV2aWNlX21vdW50KHN0cnVjdCBpMm9fZGV2aWNlICpkZXYsIHUzMiBtZWRpYV9pZCkKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoZGV2LT5pb3AsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEZJVkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9CTE9DS19NTU9VTlQgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGRldi0+bGN0X2RhdGEudGlkLAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbCgtMSwgJm1zZy0+Ym9keVswXSk7CisJd3JpdGVsKDAsICZtc2ctPmJvZHlbMV0pOworCW9zbV9kZWJ1ZygiTW91bnRpbmcuLi5cbiIpOworCisJcmV0dXJuIGkyb19tc2dfcG9zdF93YWl0KGRldi0+aW9wLCBtLCAyKTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2RldmljZV9sb2NrIC0gTG9ja3MgdGhlIG1lZGlhIG9mIGRldmljZSBkZXYKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIGxvY2sgcmVxdWVzdAorICoJQG1lZGlhX2lkOiBNZWRpYSBJZGVudGlmaWVyCisgKgorICoJTG9jayBtZWRpYSBvZiBkZXZpY2UgZGV2IHRvIHByZXZlbnQgcmVtb3ZhbC4gVGhlIG1lZGlhIGlkZW50aWZpZXIKKyAqCXNob3VsZCBiZSBzZXQgdG8gLTEsIGJlY2F1c2UgdGhlIHNwZWMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb3RoZXIgdmFsdWUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19kZXZpY2VfbG9jayhzdHJ1Y3QgaTJvX2RldmljZSAqZGV2LCB1MzIgbWVkaWFfaWQpCit7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGRldi0+aW9wLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXdyaXRlbChGSVZFX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfQkxPQ0tfTUxPQ0sgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGRldi0+bGN0X2RhdGEudGlkLAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbCgtMSwgJm1zZy0+Ym9keVswXSk7CisJb3NtX2RlYnVnKCJMb2NraW5nLi4uXG4iKTsKKworCXJldHVybiBpMm9fbXNnX3Bvc3Rfd2FpdChkZXYtPmlvcCwgbSwgMik7Cit9OworCisvKioKKyAqCWkyb19ibG9ja19kZXZpY2VfdW5sb2NrIC0gVW5sb2NrcyB0aGUgbWVkaWEgb2YgZGV2aWNlIGRldgorICoJQGRldjogSTJPIGRldmljZSB3aGljaCBzaG91bGQgcmVjZWl2ZSB0aGUgdW5sb2NrZWQgcmVxdWVzdAorICoJQG1lZGlhX2lkOiBNZWRpYSBJZGVudGlmaWVyCisgKgorICoJVW5sb2NrcyB0aGUgbWVkaWEgaW4gZGV2aWNlIGRldi4gVGhlIG1lZGlhIGlkZW50aWZpZXIgc2hvdWxkIGJlIHNldCB0bworICoJLTEsIGJlY2F1c2UgdGhlIHNwZWMgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb3RoZXIgdmFsdWUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19kZXZpY2VfdW5sb2NrKHN0cnVjdCBpMm9fZGV2aWNlICpkZXYsIHUzMiBtZWRpYV9pZCkKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoZGV2LT5pb3AsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEZJVkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9CTE9DS19NVU5MT0NLIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBkZXYtPmxjdF9kYXRhLnRpZCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwl3cml0ZWwobWVkaWFfaWQsICZtc2ctPmJvZHlbMF0pOworCW9zbV9kZWJ1ZygiVW5sb2NraW5nLi4uXG4iKTsKKworCXJldHVybiBpMm9fbXNnX3Bvc3Rfd2FpdChkZXYtPmlvcCwgbSwgMik7Cit9OworCisvKioKKyAqCWkyb19ibG9ja19kZXZpY2VfcG93ZXIgLSBQb3dlciBtYW5hZ2VtZW50IGZvciBkZXZpY2UgZGV2CisgKglAZGV2OiBJMk8gZGV2aWNlIHdoaWNoIHNob3VsZCByZWNlaXZlIHRoZSBwb3dlciBtYW5hZ2VtZW50IHJlcXVlc3QKKyAqCUBvcGVyYXRpb246IE9wZXJhdGlvbiB3aGljaCBzaG91bGQgYmUgc2VuZAorICoKKyAqCVNlbmQgYSBwb3dlciBtYW5hZ2VtZW50IHJlcXVlc3QgdG8gdGhlIGRldmljZSBkZXYuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19kZXZpY2VfcG93ZXIoc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmRldiwgdTggb3ApCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmkyb19kZXYgPSBkZXYtPmkyb19kZXY7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gaTJvX2Rldi0+aW9wOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJaW50IHJjOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRk9VUl9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX0JMT0NLX1BPV0VSIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBpMm9fZGV2LT5sY3RfZGF0YS4KKwkgICAgICAgdGlkLCAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbChvcCA8PCAyNCwgJm1zZy0+Ym9keVswXSk7CisJb3NtX2RlYnVnKCJQb3dlci4uLlxuIik7CisKKwlyYyA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDYwKTsKKwlpZiAoIXJjKQorCQlkZXYtPnBvd2VyID0gb3A7CisKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19ibG9ja19yZXF1ZXN0X2FsbG9jIC0gQWxsb2NhdGUgYW4gSTJPIGJsb2NrIHJlcXVlc3Qgc3RydWN0CisgKgorICoJQWxsb2NhdGVzIGFuIEkyTyBibG9jayByZXF1ZXN0IHN0cnVjdCBhbmQgaW5pdGlhbGl6ZSB0aGUgbGlzdC4KKyAqCisgKglSZXR1cm5zIGEgaTJvX2Jsb2NrX3JlcXVlc3QgcG9pbnRlciBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUKKyAqCW9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppMm9fYmxvY2tfcmVxdWVzdF9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcTsKKworCWlyZXEgPSBtZW1wb29sX2FsbG9jKGkyb19ibGtfcmVxX3Bvb2wucG9vbCwgR0ZQX0FUT01JQyk7CisJaWYgKCFpcmVxKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCUlOSVRfTElTVF9IRUFEKCZpcmVxLT5xdWV1ZSk7CisKKwlyZXR1cm4gaXJlcTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3JlcXVlc3RfZnJlZSAtIEZyZWVzIGEgSTJPIGJsb2NrIHJlcXVlc3QKKyAqCUBpcmVxOiBJMk8gYmxvY2sgcmVxdWVzdCB3aGljaCBzaG91bGQgYmUgZnJlZWQKKyAqCisgKglGcmVzIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IChnaXZlIGl0IGJhY2sgdG8gdGhlIHJlcXVlc3QgbWVtcG9vbCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpMm9fYmxvY2tfcmVxdWVzdF9mcmVlKHN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSkKK3sKKwltZW1wb29sX2ZyZWUoaXJlcSwgaTJvX2Jsa19yZXFfcG9vbC5wb29sKTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3NnbGlzdF9hbGxvYyAtIEFsbG9jYXRlIHRoZSBTRyBsaXN0IGFuZCBtYXAgaXQKKyAqCUBpcmVxOiBJMk8gYmxvY2sgcmVxdWVzdAorICoKKyAqCUJ1aWxkcyB0aGUgU0cgbGlzdCBhbmQgbWFwIGl0IGludG8gdG8gYmUgYWNjZXNzYWJsZSBieSB0aGUgY29udHJvbGxlci4KKyAqCisgKglSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIFNHIGxpc3Qgb3IgMCBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW5saW5lIGludCBpMm9fYmxvY2tfc2dsaXN0X2FsbG9jKHN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaXJlcS0+aTJvX2Jsa19kZXYtPmkyb19kZXYtPmlvcC0+cGRldi0+ZGV2OworCWludCBuZW50czsKKworCW5lbnRzID0gYmxrX3JxX21hcF9zZyhpcmVxLT5yZXEtPnEsIGlyZXEtPnJlcSwgaXJlcS0+c2dfdGFibGUpOworCisJaWYgKHJxX2RhdGFfZGlyKGlyZXEtPnJlcSkgPT0gUkVBRCkKKwkJaXJlcS0+c2dfZG1hX2RpcmVjdGlvbiA9IFBDSV9ETUFfRlJPTURFVklDRTsKKwllbHNlCisJCWlyZXEtPnNnX2RtYV9kaXJlY3Rpb24gPSBQQ0lfRE1BX1RPREVWSUNFOworCisJaXJlcS0+c2dfbmVudHMgPSBkbWFfbWFwX3NnKGRldiwgaXJlcS0+c2dfdGFibGUsIG5lbnRzLAorCQkJCSAgICBpcmVxLT5zZ19kbWFfZGlyZWN0aW9uKTsKKworCXJldHVybiBpcmVxLT5zZ19uZW50czsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3NnbGlzdF9mcmVlIC0gRnJlZXMgdGhlIFNHIGxpc3QKKyAqCUBpcmVxOiBJMk8gYmxvY2sgcmVxdWVzdCBmcm9tIHdoaWNoIHRoZSBTRyBzaG91bGQgYmUgZnJlZWQKKyAqCisgKglGcmVlcyB0aGUgU0cgbGlzdCBmcm9tIHRoZSBJMk8gYmxvY2sgcmVxdWVzdC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGkyb19ibG9ja19zZ2xpc3RfZnJlZShzdHJ1Y3QgaTJvX2Jsb2NrX3JlcXVlc3QgKmlyZXEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlyZXEtPmkyb19ibGtfZGV2LT5pMm9fZGV2LT5pb3AtPnBkZXYtPmRldjsKKworCWRtYV91bm1hcF9zZyhkZXYsIGlyZXEtPnNnX3RhYmxlLCBpcmVxLT5zZ19uZW50cywKKwkJICAgICBpcmVxLT5zZ19kbWFfZGlyZWN0aW9uKTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3ByZXBfcmVxX2ZuIC0gQWxsb2NhdGVzIEkyTyBibG9jayBkZXZpY2Ugc3BlY2lmaWMgc3RydWN0CisgKglAcTogcmVxdWVzdCBxdWV1ZSBmb3IgdGhlIHJlcXVlc3QKKyAqCUByZXE6IHRoZSByZXF1ZXN0IHRvIHByZXBhcmUKKyAqCisgKglBbGxvY2F0ZSB0aGUgbmVjZXNzYXJ5IGkyb19ibG9ja19yZXF1ZXN0IHN0cnVjdCBhbmQgY29ubmVjdCBpdCB0bworICoJdGhlIHJlcXVlc3QuIFRoaXMgaXMgbmVlZGVkIHRoYXQgd2Ugbm90IGxvb3NlIHRoZSBTRyBsaXN0IGxhdGVyIG9uLgorICoKKyAqCVJldHVybnMgQkxLUFJFUF9PSyBvbiBzdWNjZXNzIG9yIEJMS1BSRVBfREVGRVIgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fYmxvY2tfcHJlcF9yZXFfZm4oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmkyb19ibGtfZGV2ID0gcS0+cXVldWVkYXRhOworCXN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcTsKKworCS8qIHJlcXVlc3QgaXMgYWxyZWFkeSBwcm9jZXNzZWQgYnkgdXMsIHNvIHJldHVybiAqLworCWlmIChyZXEtPmZsYWdzICYgUkVRX1NQRUNJQUwpIHsKKwkJb3NtX2RlYnVnKCJSRVFfU1BFQ0lBTCBhbHJlYWR5IHNldCFcbiIpOworCQlyZXEtPmZsYWdzIHw9IFJFUV9ET05UUFJFUDsKKwkJcmV0dXJuIEJMS1BSRVBfT0s7CisJfQorCisJLyogY29ubmVjdCB0aGUgaTJvX2Jsb2NrX3JlcXVlc3QgdG8gdGhlIHJlcXVlc3QgKi8KKwlpZiAoIXJlcS0+c3BlY2lhbCkgeworCQlpcmVxID0gaTJvX2Jsb2NrX3JlcXVlc3RfYWxsb2MoKTsKKwkJaWYgKHVubGlrZWx5KElTX0VSUihpcmVxKSkpIHsKKwkJCW9zbV9kZWJ1ZygidW5hYmxlIHRvIGFsbG9jYXRlIGkyb19ibG9ja19yZXF1ZXN0IVxuIik7CisJCQlyZXR1cm4gQkxLUFJFUF9ERUZFUjsKKwkJfQorCisJCWlyZXEtPmkyb19ibGtfZGV2ID0gaTJvX2Jsa19kZXY7CisJCXJlcS0+c3BlY2lhbCA9IGlyZXE7CisJCWlyZXEtPnJlcSA9IHJlcTsKKwl9IGVsc2UKKwkJaXJlcSA9IHJlcS0+c3BlY2lhbDsKKworCS8qIGRvIG5vdCBjb21lIGJhY2sgaGVyZSAqLworCXJlcS0+ZmxhZ3MgfD0gUkVRX0RPTlRQUkVQIHwgUkVRX1NQRUNJQUw7CisKKwlyZXR1cm4gQkxLUFJFUF9PSzsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdF9mbiAtIGRlbGF5ZWQgcmVxdWVzdCBxdWV1ZSBmdW5jdGlvbgorICoJZGVsYXllZF9yZXF1ZXN0OiB0aGUgZGVsYXllZCByZXF1ZXN0IHdpdGggdGhlIHF1ZXVlIHRvIHN0YXJ0CisgKgorICoJSWYgdGhlIHJlcXVlc3QgcXVldWUgaXMgc3RvcHBlZCBmb3IgYSBkaXNrLCBhbmQgdGhlcmUgaXMgbm8gb3BlbgorICoJcmVxdWVzdCwgYSBuZXcgZXZlbnQgaXMgY3JlYXRlZCwgd2hpY2ggY2FsbHMgdGhpcyBmdW5jdGlvbiB0byBzdGFydAorICoJdGhlIHF1ZXVlIGFmdGVyIEkyT19CTE9DS19SRVFVRVNUX1RJTUUuIE90aGVyd2lzZSB0aGUgcXVldWUgd2lsbCBuZXZlcgorICoJYmUgc3RhcnRlZCBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdF9mbih2b2lkICpkZWxheWVkX3JlcXVlc3QpCit7CisJc3RydWN0IGkyb19ibG9ja19kZWxheWVkX3JlcXVlc3QgKmRyZXEgPSBkZWxheWVkX3JlcXVlc3Q7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkcmVxLT5xdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCWJsa19zdGFydF9xdWV1ZShxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlrZnJlZShkcmVxKTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX3JlcGx5IC0gQmxvY2sgT1NNIHJlcGx5IGhhbmRsZXIuCisgKglAYzogSTJPIGNvbnRyb2xsZXIgZnJvbSB3aGljaCB0aGUgbWVzc2FnZSBhcnJpdmVzCisgKglAbTogbWVzc2FnZSBpZCBvZiByZXBseQorICoJcW1zZzogdGhlIGFjdHVhbGwgSTJPIG1lc3NhZ2UgcmVwbHkKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGdldHMgYWxsIHRoZSBtZXNzYWdlIHJlcGxpZXMuCisgKgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19yZXBseShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUzMiBtLAorCQkJICAgc3RydWN0IGkyb19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0ICppcmVxOworCXN0cnVjdCByZXF1ZXN0ICpyZXE7CisJc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcTsKKwl1OCBzdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRkFJTGVkIG1lc3NhZ2UgKi8KKwlpZiAodW5saWtlbHkobGUzMl90b19jcHUobXNnLT51LmhlYWRbMF0pICYgKDEgPDwgMTMpKSkgeworCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgKnBtc2c7CisJCXUzMiBwbTsKKworCQkvKgorCQkgKiBGQUlMZWQgbWVzc2FnZSBmcm9tIGNvbnRyb2xsZXIKKwkJICogV2UgaW5jcmVtZW50IHRoZSBlcnJvciBjb3VudCBhbmQgYWJvcnQgaXQKKwkJICoKKwkJICogSW4gdGhlb3J5IHRoaXMgd2lsbCBuZXZlciBoYXBwZW4uICBUaGUgSTJPIGJsb2NrIGNsYXNzCisJCSAqIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgYmxvY2sgZGV2aWNlcyBuZXZlciByZXR1cm4KKwkJICogRkFJTHMgYnV0IGluc3RlYWQgdXNlIHRoZSBSRVEgc3RhdHVzIGZpZWxkLi4uYnV0CisJCSAqIGJldHRlciBiZSBvbiB0aGUgc2FmZSBzaWRlIHNpbmNlIG5vIG9uZSByZWFsbHkgZm9sbG93cworCQkgKiB0aGUgc3BlYyB0byB0aGUgYm9vayA6KQorCQkgKi8KKwkJcG0gPSBsZTMyX3RvX2NwdShtc2ctPmJvZHlbM10pOworCQlwbXNnID0gaTJvX21zZ19pbl90b192aXJ0KGMsIHBtKTsKKworCQlyZXEgPSBpMm9fY250eHRfbGlzdF9nZXQoYywgbGUzMl90b19jcHUocG1zZy0+dS5zLnRjbnR4dCkpOworCQlpZiAodW5saWtlbHkoIXJlcSkpIHsKKwkJCW9zbV9lcnIoIk5VTEwgcmVwbHkgcmVjZWl2ZWQhXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlyZXEgPSByZXEtPnNwZWNpYWw7CisJCWRldiA9IGlyZXEtPmkyb19ibGtfZGV2OworCQlxID0gZGV2LT5nZC0+cXVldWU7CisKKwkJcmVxLT5lcnJvcnMrKzsKKworCQlzcGluX2xvY2tfaXJxc2F2ZShxLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisKKwkJd2hpbGUgKGVuZF90aGF0X3JlcXVlc3RfY2h1bmsocmVxLCAhcmVxLT5lcnJvcnMsCisJCQkJCSAgICAgIGxlMzJfdG9fY3B1KHBtc2ctPmJvZHlbMV0pKSkgOworCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKKworCQlkZXYtPm9wZW5fcXVldWVfZGVwdGgtLTsKKwkJbGlzdF9kZWwoJmlyZXEtPnF1ZXVlKTsKKwkJYmxrX3N0YXJ0X3F1ZXVlKHEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJCS8qIE5vdyBmbHVzaCB0aGUgbWVzc2FnZSBieSBtYWtpbmcgaXQgYSBOT1AgKi8KKwkJaTJvX21zZ19ub3AoYywgcG0pOworCisJCXJldHVybiAtMTsKKwl9CisKKwlyZXEgPSBpMm9fY250eHRfbGlzdF9nZXQoYywgbGUzMl90b19jcHUobXNnLT51LnMudGNudHh0KSk7CisJaWYgKHVubGlrZWx5KCFyZXEpKSB7CisJCW9zbV9lcnIoIk5VTEwgcmVwbHkgcmVjZWl2ZWQhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlyZXEgPSByZXEtPnNwZWNpYWw7CisJZGV2ID0gaXJlcS0+aTJvX2Jsa19kZXY7CisJcSA9IGRldi0+Z2QtPnF1ZXVlOworCisJaWYgKHVubGlrZWx5KCFkZXYtPmkyb19kZXYpKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgSEFDSywgYnV0IEludGVsIEludGVncmF0ZWQgUkFJRCBhbGxvd3MgdXNlcgorCQkgKiB0byBkZWxldGUgYSB2b2x1bWUgdGhhdCBpcyBjbGFpbWVkLCBsb2NrZWQsIGFuZCBpbiB1c2UKKwkJICogYnkgdGhlIE9TLiBXZSBoYXZlIHRvIGNoZWNrIGZvciBhIHJlcGx5IGZyb20gYQorCQkgKiBub24tZXhpc3RlbnQgZGV2aWNlIGFuZCBmbGFnIGl0IGFzIGFuIGVycm9yIG9yIHRoZSBzeXN0ZW0KKwkJICogZ29lcyBrYXB1dC4uLgorCQkgKi8KKwkJcmVxLT5lcnJvcnMrKzsKKwkJb3NtX3dhcm4oIkRhdGEgdHJhbnNmZXIgdG8gZGVsZXRlZCBkZXZpY2UhXG4iKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQl3aGlsZSAoZW5kX3RoYXRfcmVxdWVzdF9jaHVuaworCQkgICAgICAgKHJlcSwgIXJlcS0+ZXJyb3JzLCBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMV0pKSkgOworCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKKworCQlkZXYtPm9wZW5fcXVldWVfZGVwdGgtLTsKKwkJbGlzdF9kZWwoJmlyZXEtPnF1ZXVlKTsKKwkJYmxrX3N0YXJ0X3F1ZXVlKHEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiAgICAgIExldHMgc2VlIHdoYXQgaXMgY29va2luZy4gV2Ugc3R1ZmZlZCB0aGUKKwkgKiAgICAgIHJlcXVlc3QgaW4gdGhlIGNvbnRleHQuCisJICovCisKKwlzdCA9IGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgPj4gMjQ7CisKKwlpZiAoc3QgIT0gMCkgeworCQlpbnQgZXJyOworCQljaGFyICpic2FfZXJyb3JzW10gPSB7CisJCQkiU3VjY2VzcyIsCisJCQkiTWVkaWEgRXJyb3IiLAorCQkJIkZhaWx1cmUgY29tbXVuaWNhdGluZyB0byBkZXZpY2UiLAorCQkJIkRldmljZSBGYWlsdXJlIiwKKwkJCSJEZXZpY2UgaXMgbm90IHJlYWR5IiwKKwkJCSJNZWRpYSBub3QgcHJlc2VudCIsCisJCQkiTWVkaWEgaXMgbG9ja2VkIGJ5IGFub3RoZXIgdXNlciIsCisJCQkiTWVkaWEgaGFzIGZhaWxlZCIsCisJCQkiRmFpbHVyZSBjb21tdW5pY2F0aW5nIHRvIGRldmljZSIsCisJCQkiRGV2aWNlIGJ1cyBmYWlsdXJlIiwKKwkJCSJEZXZpY2UgaXMgbG9ja2VkIGJ5IGFub3RoZXIgdXNlciIsCisJCQkiRGV2aWNlIGlzIHdyaXRlIHByb3RlY3RlZCIsCisJCQkiRGV2aWNlIGhhcyByZXNldCIsCisJCQkiVm9sdW1lIGhhcyBjaGFuZ2VkLCB3YWl0aW5nIGZvciBhY2tub3dsZWRnZW1lbnQiCisJCX07CisKKwkJZXJyID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzBdKSAmIDB4ZmZmZjsKKworCQkvKgorCQkgKiAgICAgIERldmljZSBub3QgcmVhZHkgbWVhbnMgdHdvIHRoaW5ncy4gT25lIGlzIHRoYXQgdGhlCisJCSAqICAgICAgdGhlIHRoaW5nIHdlbnQgb2ZmbGluZSAoYnV0IG5vdCBhIHJlbW92YWwgbWVkaWEpCisJCSAqCisJCSAqICAgICAgVGhlIHNlY29uZCBpcyB0aGF0IHlvdSBoYXZlIGEgU3VwZXJUcmFrIDEwMCBhbmQgdGhlCisJCSAqICAgICAgZmlybXdhcmUgZ290IGNvbnN0aXBhdGVkLiBVbmxpa2Ugc3RhbmRhcmQgaTJvIGNhcmQKKwkJICogICAgICBzZXR1cHMgdGhlIHN1cGVydHJhayByZXR1cm5zIGFuIGVycm9yIHJhdGhlciB0aGFuCisJCSAqICAgICAgYmxvY2tpbmcgZm9yIHRoZSB0aW1lb3V0IGluIHRoZXNlIGNhc2VzLgorCQkgKgorCQkgKiAgICAgIERvbid0IHN0aWNrIGEgc3VwZXJ0cmFrMTAwIGludG8gY2FjaGUgYWdncmVzc2l2ZSBtb2RlcworCQkgKi8KKworCQlvc21fZXJyKCJibG9jay1vc206IC9kZXYvJXMgZXJyb3I6ICVzIiwgZGV2LT5nZC0+ZGlza19uYW1lLAorCQkJYnNhX2Vycm9yc1tsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pICYgMHhmZmZmXSk7CisJCWlmIChsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pICYgMHgwMGZmMDAwMCkKKwkJCXByaW50ayhLRVJOX0VSUiAiIC0gRERNIGF0dGVtcHRlZCAlZCByZXRyaWVzIiwKKwkJCSAgICAgICAobGUzMl90b19jcHUobXNnLT5ib2R5WzBdKSA+PiAxNikgJiAweDAwZmYpOworCQlwcmludGsoS0VSTl9FUlIgIi5cbiIpOworCQlyZXEtPmVycm9ycysrOworCX0gZWxzZQorCQlyZXEtPmVycm9ycyA9IDA7CisKKwlpZiAoIWVuZF90aGF0X3JlcXVlc3RfY2h1bmsKKwkgICAgKHJlcSwgIXJlcS0+ZXJyb3JzLCBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMV0pKSkgeworCQlhZGRfZGlza19yYW5kb21uZXNzKHJlcS0+cnFfZGlzayk7CisJCXNwaW5fbG9ja19pcnFzYXZlKHEtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKworCQllbmRfdGhhdF9yZXF1ZXN0X2xhc3QocmVxKTsKKworCQlkZXYtPm9wZW5fcXVldWVfZGVwdGgtLTsKKwkJbGlzdF9kZWwoJmlyZXEtPnF1ZXVlKTsKKwkJYmxrX3N0YXJ0X3F1ZXVlKHEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocS0+cXVldWVfbG9jaywgZmxhZ3MpOworCisJCWkyb19ibG9ja19zZ2xpc3RfZnJlZShpcmVxKTsKKwkJaTJvX2Jsb2NrX3JlcXVlc3RfZnJlZShpcmVxKTsKKwl9IGVsc2UKKwkJb3NtX2Vycigic3RpbGwgcmVtYWluaW5nIGNodW5rc1xuIik7CisKKwlyZXR1cm4gMTsKK307CisKK3N0YXRpYyB2b2lkIGkyb19ibG9ja19ldmVudChzdHJ1Y3QgaTJvX2V2ZW50ICpldnQpCit7CisJb3NtX2luZm8oImJsb2NrLW9zbTogZXZlbnQgcmVjZWl2ZWRcbiIpOworfTsKKworLyoKKyAqCVNDU0ktQ0FNIGZvciBpb2N0bCBnZW9tZXRyeSBtYXBwaW5nCisgKglEdXBsaWNhdGVkIHdpdGggU0NTSSAtIHRoaXMgc2hvdWxkIGJlIG1vdmVkIGludG8gc29tZXdoZXJlIGNvbW1vbgorICoJcGVyaGFwcyBnZW5oZCA/CisgKgorICogTEJBIC0+IENIUyBtYXBwaW5nIHRhYmxlIHRha2VuIGZyb206CisgKgorICogIkluY29ycG9yYXRpbmcgdGhlIEkyTyBBcmNoaXRlY3R1cmUgaW50byBCSU9TIGZvciBJbnRlbCBBcmNoaXRlY3R1cmUKKyAqICBQbGF0Zm9ybXMiCisgKgorICogVGhpcyBpcyBhbiBJMk8gZG9jdW1lbnQgdGhhdCBpcyBvbmx5IGF2YWlsYWJsZSB0byBJMk8gbWVtYmVycywKKyAqIG5vdCBkZXZlbG9wZXJzLgorICoKKyAqIEZyb20gbXkgdW5kZXJzdGFuZGluZywgdGhpcyBpcyBob3cgYWxsIHRoZSBJMk8gY2FyZHMgZG8gdGhpcworICoKKyAqIERpc2sgU2l6ZSAgICAgIHwgU2VjdG9ycyB8IEhlYWRzIHwgQ3lsaW5kZXJzCisgKiAtLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLQorICogMSA8IFggPD0gNTI4TSAgfCA2MyAgICAgIHwgMTYgICAgfCBYLyg2MyAqIDE2ICogNTEyKQorICogNTI4TSA8IFggPD0gMUcgfCA2MyAgICAgIHwgMzIgICAgfCBYLyg2MyAqIDMyICogNTEyKQorICogMSA8IFggPDUyOE0gICAgfCA2MyAgICAgIHwgMTYgICAgfCBYLyg2MyAqIDE2ICogNTEyKQorICogMSA8IFggPDUyOE0gICAgfCA2MyAgICAgIHwgMTYgICAgfCBYLyg2MyAqIDE2ICogNTEyKQorICoKKyAqLworI2RlZmluZQlCTE9DS19TSVpFXzUyOE0JCTEwODEzNDQKKyNkZWZpbmUJQkxPQ0tfU0laRV8xRwkJMjA5NzE1MgorI2RlZmluZQlCTE9DS19TSVpFXzIxRwkJNDQwMzIwMAorI2RlZmluZQlCTE9DS19TSVpFXzQyRwkJODgwNjQwMAorI2RlZmluZQlCTE9DS19TSVpFXzg0RwkJMTc2MTI4MDAKKworc3RhdGljIHZvaWQgaTJvX2Jsb2NrX2Jpb3NwYXJhbSh1bnNpZ25lZCBsb25nIGNhcGFjaXR5LCB1bnNpZ25lZCBzaG9ydCAqY3lscywKKwkJCQl1bnNpZ25lZCBjaGFyICpoZHMsIHVuc2lnbmVkIGNoYXIgKnNlY3MpCit7CisJdW5zaWduZWQgbG9uZyBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzOworCisJc2VjdG9ycyA9IDYzTDsJCS8qIE1heGltaXplIHNlY3RvcnMgcGVyIHRyYWNrICovCisJaWYgKGNhcGFjaXR5IDw9IEJMT0NLX1NJWkVfNTI4TSkKKwkJaGVhZHMgPSAxNjsKKwllbHNlIGlmIChjYXBhY2l0eSA8PSBCTE9DS19TSVpFXzFHKQorCQloZWFkcyA9IDMyOworCWVsc2UgaWYgKGNhcGFjaXR5IDw9IEJMT0NLX1NJWkVfMjFHKQorCQloZWFkcyA9IDY0OworCWVsc2UgaWYgKGNhcGFjaXR5IDw9IEJMT0NLX1NJWkVfNDJHKQorCQloZWFkcyA9IDEyODsKKwllbHNlCisJCWhlYWRzID0gMjU1OworCisJY3lsaW5kZXJzID0gKHVuc2lnbmVkIGxvbmcpY2FwYWNpdHkgLyAoaGVhZHMgKiBzZWN0b3JzKTsKKworCSpjeWxzID0gKHVuc2lnbmVkIHNob3J0KWN5bGluZGVyczsJLyogU3R1ZmYgcmV0dXJuIHZhbHVlcyAqLworCSpzZWNzID0gKHVuc2lnbmVkIGNoYXIpc2VjdG9yczsKKwkqaGRzID0gKHVuc2lnbmVkIGNoYXIpaGVhZHM7Cit9CisKKy8qKgorICoJaTJvX2Jsb2NrX29wZW4gLSBPcGVuIHRoZSBibG9jayBkZXZpY2UKKyAqCisgKglQb3dlciB1cCB0aGUgZGV2aWNlLCBtb3VudCBhbmQgbG9jayB0aGUgbWVkaWEuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLAorICoJaWYgdGhlIGJsb2NrIGRldmljZSBpcyBvcGVuZWQgZm9yIGFjY2Vzcy4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmRldiA9IGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKKworCWlmICghZGV2LT5pMm9fZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChkZXYtPnBvd2VyID4gMHgxZikKKwkJaTJvX2Jsb2NrX2RldmljZV9wb3dlcihkZXYsIDB4MDIpOworCisJaTJvX2Jsb2NrX2RldmljZV9tb3VudChkZXYtPmkyb19kZXYsIC0xKTsKKworCWkyb19ibG9ja19kZXZpY2VfbG9jayhkZXYtPmkyb19kZXYsIC0xKTsKKworCW9zbV9kZWJ1ZygiUmVhZHkuXG4iKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fYmxvY2tfcmVsZWFzZSAtIFJlbGVhc2UgdGhlIEkyTyBibG9jayBkZXZpY2UKKyAqCisgKglVbmxvY2sgYW5kIHVubW91bnQgdGhlIG1lZGlhLCBhbmQgcG93ZXIgZG93biB0aGUgZGV2aWNlLiBHZXRzIGNhbGxlZCBpZgorICoJdGhlIGJsb2NrIGRldmljZSBpcyBjbG9zZWQuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCXU4IG9wZXJhdGlvbjsKKworCS8qCisJICogVGhpcyBpcyB0byBkZWFpbCB3aXRoIHRoZSBjYXNlIG9mIGFuIGFwcGxpY2F0aW9uCisJICogb3BlbmluZyBhIGRldmljZSBhbmQgdGhlbiB0aGUgZGV2aWNlIGRpc3NhcGVhcnMgd2hpbGUKKwkgKiBpdCdzIGluIHVzZSwgYW5kIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHRyaWVzIHRvIHJlbGVhc2UKKwkgKiBpdC4gIGV4OiBVbm1vdW50aW5nIGEgZGVsZXRlZCBSQUlEIHZvbHVtZSBhdCByZWJvb3QuCisJICogSWYgd2Ugc2VuZCBtZXNzYWdlcywgaXQgd2lsbCBqdXN0IGNhdXNlIEZBSUxzIHNpbmNlCisJICogdGhlIFRJRCBubyBsb25nZXIgZXhpc3RzLgorCSAqLworCWlmICghZGV2LT5pMm9fZGV2KQorCQlyZXR1cm4gMDsKKworCWkyb19ibG9ja19kZXZpY2VfZmx1c2goZGV2LT5pMm9fZGV2KTsKKworCWkyb19ibG9ja19kZXZpY2VfdW5sb2NrKGRldi0+aTJvX2RldiwgLTEpOworCisJaWYgKGRldi0+ZmxhZ3MgJiAoMSA8PCAzIHwgMSA8PCA0KSkJLyogUmVtb3ZhYmxlICovCisJCW9wZXJhdGlvbiA9IDB4MjE7CisJZWxzZQorCQlvcGVyYXRpb24gPSAweDI0OworCisJaTJvX2Jsb2NrX2RldmljZV9wb3dlcihkZXYsIG9wZXJhdGlvbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9fYmxvY2tfaW9jdGwgLSBJc3N1ZSBkZXZpY2Ugc3BlY2lmaWMgaW9jdGwgY2FsbHMuCisgKglAY21kOiBpb2N0bCBjb21tYW5kCisgKglAYXJnOiBhcmcKKyAqCisgKglIYW5kbGVzIGlvY3RsIHJlcXVlc3QgZm9yIHRoZSBibG9jayBkZXZpY2UuCisgKgorICoJUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19ibG9ja19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqZGV2ID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJLyogQW55b25lIGNhcGFibGUgb2YgdGhpcyBzeXNjYWxsIGNhbiBkbyAqcmVhbCBiYWQqIHRoaW5ncyAqLworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhESU9fR0VUR0VPOgorCQl7CisJCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZzsKKwkJCWkyb19ibG9ja19iaW9zcGFyYW0oZ2V0X2NhcGFjaXR5KGRpc2spLAorCQkJCQkgICAgJmcuY3lsaW5kZXJzLCAmZy5oZWFkcywgJmcuc2VjdG9ycyk7CisJCQlnLnN0YXJ0ID0gZ2V0X3N0YXJ0X3NlY3QoaW5vZGUtPmlfYmRldik7CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZnLCBzaXplb2YoZykpID8gLUVGQVVMVCA6IDA7CisJCX0KKworCWNhc2UgQkxLSTJPR1JTVFJBVDoKKwkJcmV0dXJuIHB1dF91c2VyKGRldi0+cmNhY2hlLCAoaW50IF9fdXNlciAqKWFyZyk7CisJY2FzZSBCTEtJMk9HV1NUUkFUOgorCQlyZXR1cm4gcHV0X3VzZXIoZGV2LT53Y2FjaGUsIChpbnQgX191c2VyICopYXJnKTsKKwljYXNlIEJMS0kyT1NSU1RSQVQ6CisJCWlmIChhcmcgPCAwIHx8IGFyZyA+IENBQ0hFX1NNQVJURkVUQ0gpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZGV2LT5yY2FjaGUgPSBhcmc7CisJCWJyZWFrOworCWNhc2UgQkxLSTJPU1dTVFJBVDoKKwkJaWYgKGFyZyAhPSAwCisJCSAgICAmJiAoYXJnIDwgQ0FDSEVfV1JJVEVUSFJPVUdIIHx8IGFyZyA+IENBQ0hFX1NNQVJUQkFDSykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZGV2LT53Y2FjaGUgPSBhcmc7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX21lZGlhX2NoYW5nZWQgLSBIYXZlIHdlIHNlZW4gYSBtZWRpYSBjaGFuZ2U/CisgKglAZGlzazogZ2VuZGlzayB3aGljaCBzaG91bGQgYmUgdmVyaWZpZWQKKyAqCisgKglWZXJpZmllcyBpZiB0aGUgbWVkaWEgaGFzIGNoYW5nZWQuCisgKgorICoJUmV0dXJucyAxIGlmIHRoZSBtZWRpYSB3YXMgY2hhbmdlZCBvciAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBpMm9fYmxvY2tfbWVkaWFfY2hhbmdlZChzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqcCA9IGRpc2stPnByaXZhdGVfZGF0YTsKKworCWlmIChwLT5tZWRpYV9jaGFuZ2VfZmxhZykgeworCQlwLT5tZWRpYV9jaGFuZ2VfZmxhZyA9IDA7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9fYmxvY2tfdHJhbnNmZXIgLSBUcmFuc2ZlciBhIHJlcXVlc3QgdG8vZnJvbSB0aGUgSTJPIGNvbnRyb2xsZXIKKyAqCUByZXE6IHRoZSByZXF1ZXN0IHdoaWNoIHNob3VsZCBiZSB0cmFuc2ZlcmVkCisgKgorICoJVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGUgcmVxdWVzdCBpbnRvIGEgSTJPIG1lc3NhZ2UuIFRoZSBuZWNlc3NhcnkKKyAqCURNQSBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgYW5kIGFmdGVyIGV2ZXJ5dGhpbmcgaXMgc2V0dXAgcG9zdCB0aGUgbWVzc2FnZQorICoJdG8gdGhlIEkyTyBjb250cm9sbGVyLiBObyBjbGVhbnVwIGlzIGRvbmUgYnkgdGhpcyBmdW5jdGlvbi4gSXQgaXMgZG9uZQorICoJb24gdGhlIGludGVycnVwdCBzaWRlIHdoZW4gdGhlIHJlcGx5IGFycml2ZXMuCisgKgorICoJUmV0dXJuIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX3RyYW5zZmVyKHN0cnVjdCByZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmRldiA9IHJlcS0+cnFfZGlzay0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IGRldi0+aTJvX2Rldi0+aW9wOworCWludCB0aWQgPSBkZXYtPmkyb19kZXYtPmxjdF9kYXRhLnRpZDsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXZvaWQgX19pb21lbSAqbXB0cjsKKwlzdHJ1Y3QgaTJvX2Jsb2NrX3JlcXVlc3QgKmlyZXEgPSByZXEtPnNwZWNpYWw7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgc2dudW07CisJaW50IGk7CisJdTMyIG07CisJdTMyIHRjbnR4dDsKKwl1MzIgc2dfZmxhZ3M7CisJaW50IHJjOworCisJbSA9IGkyb19tc2dfZ2V0KGMsICZtc2cpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkgeworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBleGl0OworCX0KKworCXRjbnR4dCA9IGkyb19jbnR4dF9saXN0X2FkZChjLCByZXEpOworCWlmICghdGNudHh0KSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBub3BfbXNnOworCX0KKworCWlmICgoc2dudW0gPSBpMm9fYmxvY2tfc2dsaXN0X2FsbG9jKGlyZXEpKSA8PSAwKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBjb250ZXh0X3JlbW92ZTsKKwl9CisKKwkvKiBCdWlsZCB0aGUgbWVzc2FnZSBiYXNlZCBvbiB0aGUgcmVxdWVzdC4gKi8KKwl3cml0ZWwoaTJvX2Jsb2NrX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3cml0ZWwodGNudHh0LCAmbXNnLT51LnMudGNudHh0KTsKKwl3cml0ZWwocmVxLT5ucl9zZWN0b3JzIDw8IDksICZtc2ctPmJvZHlbMV0pOworCisJd3JpdGVsKCgoKHU2NCkgcmVxLT5zZWN0b3IpIDw8IDkpICYgMHhmZmZmZmZmZiwgJm1zZy0+Ym9keVsyXSk7CisJd3JpdGVsKHJlcS0+c2VjdG9yID4+IDIzLCAmbXNnLT5ib2R5WzNdKTsKKworCW1wdHIgPSAmbXNnLT5ib2R5WzRdOworCisJc2cgPSBpcmVxLT5zZ190YWJsZTsKKworCWlmIChycV9kYXRhX2RpcihyZXEpID09IFJFQUQpIHsKKwkJd3JpdGVsKEkyT19DTURfQkxPQ0tfUkVBRCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgdGlkLAorCQkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwkJc2dfZmxhZ3MgPSAweDEwMDAwMDAwOworCQlzd2l0Y2ggKGRldi0+cmNhY2hlKSB7CisJCWNhc2UgQ0FDSEVfTlVMTDoKKwkJCXdyaXRlbCgwLCAmbXNnLT5ib2R5WzBdKTsKKwkJCWJyZWFrOworCQljYXNlIENBQ0hFX1BSRUZFVENIOgorCQkJd3JpdGVsKDB4MjAxRjAwMDgsICZtc2ctPmJvZHlbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfU01BUlRGRVRDSDoKKwkJCWlmIChyZXEtPm5yX3NlY3RvcnMgPiAxNikKKwkJCQl3cml0ZWwoMHgyMDFGMDAwOCwgJm1zZy0+Ym9keVswXSk7CisJCQllbHNlCisJCQkJd3JpdGVsKDB4MDAxRjAwMDAsICZtc2ctPmJvZHlbMF0pOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQl3cml0ZWwoSTJPX0NNRF9CTE9DS19XUklURSA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgdGlkLAorCQkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwkJc2dfZmxhZ3MgPSAweDE0MDAwMDAwOworCQlzd2l0Y2ggKGRldi0+d2NhY2hlKSB7CisJCWNhc2UgQ0FDSEVfTlVMTDoKKwkJCXdyaXRlbCgwLCAmbXNnLT5ib2R5WzBdKTsKKwkJCWJyZWFrOworCQljYXNlIENBQ0hFX1dSSVRFVEhST1VHSDoKKwkJCXdyaXRlbCgweDAwMUYwMDA4LCAmbXNnLT5ib2R5WzBdKTsKKwkJCWJyZWFrOworCQljYXNlIENBQ0hFX1dSSVRFQkFDSzoKKwkJCXdyaXRlbCgweDAwMUYwMDEwLCAmbXNnLT5ib2R5WzBdKTsKKwkJCWJyZWFrOworCQljYXNlIENBQ0hFX1NNQVJUQkFDSzoKKwkJCWlmIChyZXEtPm5yX3NlY3RvcnMgPiAxNikKKwkJCQl3cml0ZWwoMHgwMDFGMDAwNCwgJm1zZy0+Ym9keVswXSk7CisJCQllbHNlCisJCQkJd3JpdGVsKDB4MDAxRjAwMTAsICZtc2ctPmJvZHlbMF0pOworCQkJYnJlYWs7CisJCWNhc2UgQ0FDSEVfU01BUlRUSFJPVUdIOgorCQkJaWYgKHJlcS0+bnJfc2VjdG9ycyA+IDE2KQorCQkJCXdyaXRlbCgweDAwMUYwMDA0LCAmbXNnLT5ib2R5WzBdKTsKKwkJCWVsc2UKKwkJCQl3cml0ZWwoMHgwMDFGMDAxMCwgJm1zZy0+Ym9keVswXSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSBzZ251bTsgaSA+IDA7IGktLSkgeworCQlpZiAoaSA9PSAxKQorCQkJc2dfZmxhZ3MgfD0gMHg4MDAwMDAwMDsKKwkJd3JpdGVsKHNnX2ZsYWdzIHwgc2dfZG1hX2xlbihzZyksIG1wdHIpOworCQl3cml0ZWwoc2dfZG1hX2FkZHJlc3Moc2cpLCBtcHRyICsgNCk7CisJCW1wdHIgKz0gODsKKwkJc2crKzsKKwl9CisKKwl3cml0ZWwoSTJPX01FU1NBR0VfU0laRQorCSAgICAgICAoKCh1bnNpZ25lZCBsb25nKW1wdHIgLQorCQkgKHVuc2lnbmVkIGxvbmcpJm1zZy0+dS5oZWFkWzBdKSA+PiAyKSB8IFNHTF9PRkZTRVRfOCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzBdKTsKKworCWxpc3RfYWRkX3RhaWwoJmlyZXEtPnF1ZXVlLCAmZGV2LT5vcGVuX3F1ZXVlKTsKKwlkZXYtPm9wZW5fcXVldWVfZGVwdGgrKzsKKworCWkyb19tc2dfcG9zdChjLCBtKTsKKworCXJldHVybiAwOworCisgICAgICBjb250ZXh0X3JlbW92ZToKKwlpMm9fY250eHRfbGlzdF9yZW1vdmUoYywgcmVxKTsKKworICAgICAgbm9wX21zZzoKKwlpMm9fbXNnX25vcChjLCBtKTsKKworICAgICAgZXhpdDoKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19ibG9ja19yZXF1ZXN0X2ZuIC0gcmVxdWVzdCBxdWV1ZSBoYW5kbGluZyBmdW5jdGlvbgorICoJcTogcmVxdWVzdCBxdWV1ZSBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IGNvdWxkIGJlIGZldGNoZWQKKyAqCisgKglUYWtlcyB0aGUgbmV4dCByZXF1ZXN0IGZyb20gdGhlIHF1ZXVlLCB0cmFuc2ZlcnMgaXQgYW5kIGlmIG5vIGVycm9yCisgKglvY2N1cnMgZGVxdWV1ZSBpdCBmcm9tIHRoZSBxdWV1ZS4gT24gYXJyaXZhbCBvZiB0aGUgcmVwbHkgdGhlIG1lc3NhZ2UKKyAqCXdpbGwgYmUgcHJvY2Vzc2VkIGZ1cnRoZXIuIElmIGFuIGVycm9yIG9jY3VycyByZXF1ZXVlIHRoZSByZXF1ZXN0LgorICovCitzdGF0aWMgdm9pZCBpMm9fYmxvY2tfcmVxdWVzdF9mbihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOworCisJd2hpbGUgKCFibGtfcXVldWVfcGx1Z2dlZChxKSkgeworCQlyZXEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpOworCQlpZiAoIXJlcSkKKwkJCWJyZWFrOworCisJCWlmIChibGtfZnNfcmVxdWVzdChyZXEpKSB7CisJCQlzdHJ1Y3QgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdCAqZHJlcTsKKwkJCXN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCAqaXJlcSA9IHJlcS0+c3BlY2lhbDsKKwkJCXVuc2lnbmVkIGludCBxdWV1ZV9kZXB0aDsKKworCQkJcXVldWVfZGVwdGggPSBpcmVxLT5pMm9fYmxrX2Rldi0+b3Blbl9xdWV1ZV9kZXB0aDsKKworCQkJaWYgKHF1ZXVlX2RlcHRoIDwgSTJPX0JMT0NLX01BWF9PUEVOX1JFUVVFU1RTKQorCQkJCWlmICghaTJvX2Jsb2NrX3RyYW5zZmVyKHJlcSkpIHsKKwkJCQkJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChyZXEpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCWlmIChxdWV1ZV9kZXB0aCkKKwkJCQlicmVhazsKKworCQkJLyogc3RvcCB0aGUgcXVldWUgYW5kIHJldHJ5IGxhdGVyICovCisJCQlkcmVxID0ga21hbGxvYyhzaXplb2YoKmRyZXEpLCBHRlBfQVRPTUlDKTsKKwkJCWlmICghZHJlcSkKKwkJCQljb250aW51ZTsKKworCQkJZHJlcS0+cXVldWUgPSBxOworCQkJSU5JVF9XT1JLKCZkcmVxLT53b3JrLCBpMm9fYmxvY2tfZGVsYXllZF9yZXF1ZXN0X2ZuLAorCQkJCSAgZHJlcSk7CisKKwkJCW9zbV9pbmZvKCJ0cmFuc2ZlciBlcnJvclxuIik7CisJCQlpZiAoIXF1ZXVlX2RlbGF5ZWRfd29yayhpMm9fYmxvY2tfZHJpdmVyLmV2ZW50X3F1ZXVlLAorCQkJCQkJJmRyZXEtPndvcmssCisJCQkJCQlJMk9fQkxPQ0tfUkVUUllfVElNRSkpCisJCQkJa2ZyZWUoZHJlcSk7CisJCQllbHNlIHsKKwkJCQlibGtfc3RvcF9xdWV1ZShxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlCisJCQllbmRfcmVxdWVzdChyZXEsIDApOworCX0KK307CisKKy8qIEkyTyBCbG9jayBkZXZpY2Ugb3BlcmF0aW9ucyBkZWZpbml0aW9uICovCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGkyb19ibG9ja19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gaTJvX2Jsb2NrX29wZW4sCisJLnJlbGVhc2UgPSBpMm9fYmxvY2tfcmVsZWFzZSwKKwkuaW9jdGwgPSBpMm9fYmxvY2tfaW9jdGwsCisJLm1lZGlhX2NoYW5nZWQgPSBpMm9fYmxvY2tfbWVkaWFfY2hhbmdlZAorfTsKKworLyoqCisgKglpMm9fYmxvY2tfZGV2aWNlX2FsbG9jIC0gQWxsb2NhdGUgbWVtb3J5IGZvciBhIEkyTyBCbG9jayBkZXZpY2UKKyAqCisgKglBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBpMm9fYmxvY2tfZGV2aWNlIHN0cnVjdCwgZ2VuZGlzayBhbmQgcmVxdWVzdAorICoJcXVldWUgYW5kIGluaXRpYWxpemUgdGhlbSBhcyBmYXIgYXMgbm8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBuZWVkZWQuCisgKgorICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBJMk8gQmxvY2sgZGV2aWNlIG9uIHN1Y2NlcyBvciBhCisgKgluZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsb2NrX2RldmljZV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBpMm9fYmxvY2tfZGV2aWNlICpkZXY7CisJc3RydWN0IGdlbmRpc2sgKmdkOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKKwlpbnQgcmM7CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpIHsKKwkJb3NtX2VycigiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSBJMk8gQmxvY2sgZGlzay5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKKworCUlOSVRfTElTVF9IRUFEKCZkZXYtPm9wZW5fcXVldWUpOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOworCWRldi0+cmNhY2hlID0gQ0FDSEVfUFJFRkVUQ0g7CisJZGV2LT53Y2FjaGUgPSBDQUNIRV9XUklURUJBQ0s7CisKKwkvKiBhbGxvY2F0ZSBhIGdlbmRpc2sgd2l0aCAxNiBwYXJ0aXRpb25zICovCisJZ2QgPSBhbGxvY19kaXNrKDE2KTsKKwlpZiAoIWdkKSB7CisJCW9zbV9lcnIoIkluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgZ2VuZGlzay5cbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cF9kZXY7CisJfQorCisJLyogaW5pdGlhbGl6ZSB0aGUgcmVxdWVzdCBxdWV1ZSAqLworCXF1ZXVlID0gYmxrX2luaXRfcXVldWUoaTJvX2Jsb2NrX3JlcXVlc3RfZm4sICZkZXYtPmxvY2spOworCWlmICghcXVldWUpIHsKKwkJb3NtX2VycigiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBhbGxvY2F0ZSByZXF1ZXN0IHF1ZXVlLlxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwX3F1ZXVlOworCX0KKworCWJsa19xdWV1ZV9wcmVwX3JxKHF1ZXVlLCBpMm9fYmxvY2tfcHJlcF9yZXFfZm4pOworCisJZ2QtPm1ham9yID0gSTJPX01BSk9SOworCWdkLT5xdWV1ZSA9IHF1ZXVlOworCWdkLT5mb3BzID0gJmkyb19ibG9ja19mb3BzOworCWdkLT5wcml2YXRlX2RhdGEgPSBkZXY7CisKKwlkZXYtPmdkID0gZ2Q7CisKKwlyZXR1cm4gZGV2OworCisgICAgICBjbGVhbnVwX3F1ZXVlOgorCXB1dF9kaXNrKGdkKTsKKworICAgICAgY2xlYW51cF9kZXY6CisJa2ZyZWUoZGV2KTsKKworICAgICAgZXhpdDoKKwlyZXR1cm4gRVJSX1BUUihyYyk7Cit9OworCisvKioKKyAqCWkyb19ibG9ja19wcm9iZSAtIHZlcmlmeSBpZiBkZXYgaXMgYSBJMk8gQmxvY2sgZGV2aWNlIGFuZCBpbnN0YWxsIGl0CisgKglAZGV2OiBkZXZpY2UgdG8gdmVyaWZ5IGlmIGl0IGlzIGEgSTJPIEJsb2NrIGRldmljZQorICoKKyAqCVdlIG9ubHkgdmVyaWZ5IGlmIHRoZSB1c2VyX3RpZCBvZiB0aGUgZGV2aWNlIGlzIDB4ZmZmIGFuZCB0aGVuIGluc3RhbGwKKyAqCXRoZSBkZXZpY2UuIE90aGVyd2lzZSBpdCBpcyB1c2VkIGJ5IHNvbWUgb3RoZXIgZGV2aWNlIChlLiBnLiBSQUlEKS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2Jsb2NrX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaTJvX2Jsb2NrX2RldmljZSAqaTJvX2Jsa19kZXY7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gaTJvX2Rldi0+aW9wOworCXN0cnVjdCBnZW5kaXNrICpnZDsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWU7CisJc3RhdGljIGludCB1bml0ID0gMDsKKwlpbnQgcmM7CisJdTY0IHNpemU7CisJdTMyIGJsb2Nrc2l6ZTsKKwl1MTYgcG93ZXI7CisJdTMyIGZsYWdzLCBzdGF0dXM7CisJaW50IHNlZ21lbnRzOworCisJLyogc2tpcCBkZXZpY2VzIHdoaWNoIGFyZSB1c2VkIGJ5IElPUCAqLworCWlmIChpMm9fZGV2LT5sY3RfZGF0YS51c2VyX3RpZCAhPSAweGZmZikgeworCQlvc21fZGVidWcoInNraXBwaW5nIHVzZWQgZGV2aWNlICUwM3hcbiIsIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW9zbV9pbmZvKCJOZXcgZGV2aWNlIGRldGVjdGVkIChUSUQ6ICUwM3gpXG4iLCBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOworCisJaWYgKGkyb19kZXZpY2VfY2xhaW0oaTJvX2RldikpIHsKKwkJb3NtX3dhcm4oIlVuYWJsZSB0byBjbGFpbSBkZXZpY2UuIEluc3RhbGxhdGlvbiBhYm9ydGVkXG4iKTsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGV4aXQ7CisJfQorCisJaTJvX2Jsa19kZXYgPSBpMm9fYmxvY2tfZGV2aWNlX2FsbG9jKCk7CisJaWYgKElTX0VSUihpMm9fYmxrX2RldikpIHsKKwkJb3NtX2VycigiY291bGQgbm90IGFsbG9jIGEgbmV3IEkyTyBibG9jayBkZXZpY2UiKTsKKwkJcmMgPSBQVFJfRVJSKGkyb19ibGtfZGV2KTsKKwkJZ290byBjbGFpbV9yZWxlYXNlOworCX0KKworCWkyb19ibGtfZGV2LT5pMm9fZGV2ID0gaTJvX2RldjsKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBpMm9fYmxrX2Rldik7CisKKwkvKiBzZXR1cCBnZW5kaXNrICovCisJZ2QgPSBpMm9fYmxrX2Rldi0+Z2Q7CisJZ2QtPmZpcnN0X21pbm9yID0gdW5pdCA8PCA0OworCXNwcmludGYoZ2QtPmRpc2tfbmFtZSwgImkyby9oZCVjIiwgJ2EnICsgdW5pdCk7CisJc3ByaW50ZihnZC0+ZGV2ZnNfbmFtZSwgImkyby9oZCVjIiwgJ2EnICsgdW5pdCk7CisJZ2QtPmRyaXZlcmZzX2RldiA9ICZpMm9fZGV2LT5kZXZpY2U7CisKKwkvKiBzZXR1cCByZXF1ZXN0IHF1ZXVlICovCisJcXVldWUgPSBnZC0+cXVldWU7CisJcXVldWUtPnF1ZXVlZGF0YSA9IGkyb19ibGtfZGV2OworCisJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHF1ZXVlLCBJMk9fTUFYX1NFR01FTlRTKTsKKwlibGtfcXVldWVfbWF4X3NlY3RvcnMocXVldWUsIEkyT19NQVhfU0VDVE9SUyk7CisKKwlpZiAoYy0+c2hvcnRfcmVxKQorCQlzZWdtZW50cyA9IDg7CisJZWxzZSB7CisJCWkyb19zdGF0dXNfYmxvY2sgKnNiOworCisJCXNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CisKKwkJc2VnbWVudHMgPSAoc2ItPmluYm91bmRfZnJhbWVfc2l6ZSAtCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBpMm9fbWVzc2FnZSkgLyA0IC0gNCkgLyAyOworCX0KKworCWJsa19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocXVldWUsIHNlZ21lbnRzKTsKKworCW9zbV9kZWJ1ZygibWF4IHNlY3RvcnMgPSAlZFxuIiwgSTJPX01BWF9TRUNUT1JTKTsKKwlvc21fZGVidWcoInBoeXMgc2VnbWVudHMgPSAlZFxuIiwgSTJPX01BWF9TRUdNRU5UUyk7CisJb3NtX2RlYnVnKCJodyBzZWdtZW50cyA9ICVkXG4iLCBzZWdtZW50cyk7CisKKwkvKgorCSAqICAgICAgQXNrIGZvciB0aGUgY3VycmVudCBtZWRpYSBkYXRhLiBJZiB0aGF0IGlzbid0IHN1cHBvcnRlZAorCSAqICAgICAgdGhlbiB3ZSBhc2sgZm9yIHRoZSBkZXZpY2UgY2FwYWNpdHkgZGF0YQorCSAqLworCWlmIChpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMHgwMDA0LCAxLCAmYmxvY2tzaXplLCA0KSAhPSAwCisJICAgIHx8IGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDQsIDAsICZzaXplLCA4KSAhPSAwKSB7CisJCWkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDMsICZibG9ja3NpemUsIDQpOworCQlpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMHgwMDAwLCA0LCAmc2l6ZSwgOCk7CisJfQorCW9zbV9kZWJ1ZygiYmxvY2tzaXplID0gJWRcbiIsIGJsb2Nrc2l6ZSk7CisKKwlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgMiwgJnBvd2VyLCAyKSkKKwkJcG93ZXIgPSAwOworCWkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDUsICZmbGFncywgNCk7CisJaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDB4MDAwMCwgNiwgJnN0YXR1cywgNCk7CisKKwlzZXRfY2FwYWNpdHkoZ2QsIHNpemUgPj4gOSk7CisKKwlpMm9fZXZlbnRfcmVnaXN0ZXIoaTJvX2RldiwgJmkyb19ibG9ja19kcml2ZXIsIDAsIDB4ZmZmZmZmZmYpOworCisJYWRkX2Rpc2soZ2QpOworCisJdW5pdCsrOworCisJcmV0dXJuIDA7CisKKyAgICAgIGNsYWltX3JlbGVhc2U6CisJaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlKGkyb19kZXYpOworCisgICAgICBleGl0OgorCXJldHVybiByYzsKK307CisKKy8qIEJsb2NrIE9TTSBkcml2ZXIgc3RydWN0ICovCitzdGF0aWMgc3RydWN0IGkyb19kcml2ZXIgaTJvX2Jsb2NrX2RyaXZlciA9IHsKKwkubmFtZSA9IE9TTV9OQU1FLAorCS5ldmVudCA9IGkyb19ibG9ja19ldmVudCwKKwkucmVwbHkgPSBpMm9fYmxvY2tfcmVwbHksCisJLmNsYXNzZXMgPSBpMm9fYmxvY2tfY2xhc3NfaWQsCisJLmRyaXZlciA9IHsKKwkJICAgLnByb2JlID0gaTJvX2Jsb2NrX3Byb2JlLAorCQkgICAucmVtb3ZlID0gaTJvX2Jsb2NrX3JlbW92ZSwKKwkJICAgfSwKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2luaXQgLSBCbG9jayBPU00gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAqCisgKglBbGxvY2F0ZSB0aGUgc2xhYiBhbmQgbWVtcG9vbCBmb3IgcmVxdWVzdCBzdHJ1Y3RzLCByZWdpc3RlcnMgaTJvX2Jsb2NrCisgKglibG9jayBkZXZpY2UgYW5kIGZpbmFsbHkgcmVnaXN0ZXIgdGhlIEJsb2NrIE9TTSBpbiB0aGUgSTJPIGNvcmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBpMm9fYmxvY2tfaW5pdCh2b2lkKQoreworCWludCByYzsKKwlpbnQgc2l6ZTsKKworCXByaW50ayhLRVJOX0lORk8gT1NNX0RFU0NSSVBUSU9OICIgdiIgT1NNX1ZFUlNJT04gIlxuIik7CisKKwkvKiBBbGxvY2F0ZSByZXF1ZXN0IG1lbXBvb2wgYW5kIHNsYWIgKi8KKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBpMm9fYmxvY2tfcmVxdWVzdCk7CisJaTJvX2Jsa19yZXFfcG9vbC5zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImkyb19ibG9ja19yZXEiLCBzaXplLCAwLAorCQkJCQkJICBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsCisJCQkJCQkgIE5VTEwpOworCWlmICghaTJvX2Jsa19yZXFfcG9vbC5zbGFiKSB7CisJCW9zbV9lcnIoImNhbid0IGluaXQgcmVxdWVzdCBzbGFiXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJaTJvX2Jsa19yZXFfcG9vbC5wb29sID0gbWVtcG9vbF9jcmVhdGUoSTJPX1JFUV9NRU1QT09MX1NJWkUsCisJCQkJCSAgICAgICBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJCSAgICAgICBtZW1wb29sX2ZyZWVfc2xhYiwKKwkJCQkJICAgICAgIGkyb19ibGtfcmVxX3Bvb2wuc2xhYik7CisJaWYgKCFpMm9fYmxrX3JlcV9wb29sLnBvb2wpIHsKKwkJb3NtX2VycigiY2FuJ3QgaW5pdCByZXF1ZXN0IG1lbXBvb2xcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9zbGFiOworCX0KKworCS8qIFJlZ2lzdGVyIHRoZSBibG9jayBkZXZpY2UgaW50ZXJmYWNlcyAqLworCXJjID0gcmVnaXN0ZXJfYmxrZGV2KEkyT19NQUpPUiwgImkyb19ibG9jayIpOworCWlmIChyYykgeworCQlvc21fZXJyKCJ1bmFibGUgdG8gcmVnaXN0ZXIgYmxvY2sgZGV2aWNlXG4iKTsKKwkJZ290byBmcmVlX21lbXBvb2w7CisJfQorI2lmZGVmIE1PRFVMRQorCW9zbV9pbmZvKCJyZWdpc3RlcmVkIGRldmljZSBhdCBtYWpvciAlZFxuIiwgSTJPX01BSk9SKTsKKyNlbmRpZgorCisJLyogUmVnaXN0ZXIgQmxvY2sgT1NNIGludG8gSTJPIGNvcmUgKi8KKwlyYyA9IGkyb19kcml2ZXJfcmVnaXN0ZXIoJmkyb19ibG9ja19kcml2ZXIpOworCWlmIChyYykgeworCQlvc21fZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgQmxvY2sgZHJpdmVyXG4iKTsKKwkJZ290byB1bnJlZ2lzdGVyX2Jsa2RldjsKKwl9CisKKwlyZXR1cm4gMDsKKworICAgICAgdW5yZWdpc3Rlcl9ibGtkZXY6CisJdW5yZWdpc3Rlcl9ibGtkZXYoSTJPX01BSk9SLCAiaTJvX2Jsb2NrIik7CisKKyAgICAgIGZyZWVfbWVtcG9vbDoKKwltZW1wb29sX2Rlc3Ryb3koaTJvX2Jsa19yZXFfcG9vbC5wb29sKTsKKworICAgICAgZnJlZV9zbGFiOgorCWttZW1fY2FjaGVfZGVzdHJveShpMm9fYmxrX3JlcV9wb29sLnNsYWIpOworCisgICAgICBleGl0OgorCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2Jsb2NrX2V4aXQgLSBCbG9jayBPU00gZXhpdCBmdW5jdGlvbgorICoKKyAqCVVucmVnaXN0ZXJzIEJsb2NrIE9TTSBmcm9tIEkyTyBjb3JlLCB1bnJlZ2lzdGVycyBpMm9fYmxvY2sgYmxvY2sgZGV2aWNlCisgKglhbmQgZnJlZXMgdGhlIG1lbXBvb2wgYW5kIHNsYWIuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpMm9fYmxvY2tfZXhpdCh2b2lkKQoreworCS8qIFVucmVnaXN0ZXIgSTJPIEJsb2NrIE9TTSBmcm9tIEkyTyBjb3JlICovCisJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fYmxvY2tfZHJpdmVyKTsKKworCS8qIFVucmVnaXN0ZXIgYmxvY2sgZGV2aWNlICovCisJdW5yZWdpc3Rlcl9ibGtkZXYoSTJPX01BSk9SLCAiaTJvX2Jsb2NrIik7CisKKwkvKiBGcmVlIHJlcXVlc3QgbWVtcG9vbCBhbmQgc2xhYiAqLworCW1lbXBvb2xfZGVzdHJveShpMm9fYmxrX3JlcV9wb29sLnBvb2wpOworCWttZW1fY2FjaGVfZGVzdHJveShpMm9fYmxrX3JlcV9wb29sLnNsYWIpOworfTsKKworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKE9TTV9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihPU01fVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGkyb19ibG9ja19pbml0KTsKK21vZHVsZV9leGl0KGkyb19ibG9ja19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2Jsb2NrLmggYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDlhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19ibG9jay5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKglCbG9jayBPU00gc3RydWN0dXJlcy9BUEkKKyAqCisgKiAJQ29weXJpZ2h0IChDKSAxOTk5LTIwMDIJUmVkIEhhdCBTb2Z0d2FyZQorICoKKyAqCVdyaXR0ZW4gYnkgQWxhbiBDb3gsIEJ1aWxkaW5nIE51bWJlciBUaHJlZSBMdGQKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICoJdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKglGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKglvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqCVdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKglHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJRm9yIHRoZSBwdXJwb3NlIG9mIGF2b2lkaW5nIGRvdWJ0IHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yaworICoJZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHNoYWxsIGJlIGEgc3RhbmRhcmRzIGNvbXBsaWFudCBmb3JtIHN1Y2gKKyAqCWd6aXBwZWQgdGFyIGFuZCBub3Qgb25lIHJlcXVpcmluZyBhIHByb3ByaWV0YXJ5IG9yIHBhdGVudCBlbmN1bWJlcmVkCisgKgl0b29sIHRvIHVucGFjay4KKyAqCisgKglGaXhlcy9hZGRpdGlvbnM6CisgKgkJU3RldmUgUmFsc3RvbjoKKyAqCQkJTXVsdGlwbGUgZGV2aWNlIGhhbmRsaW5nIGVycm9yIGZpeGVzLAorICoJCQlBZGRlZCBhIHF1ZXVlIGRlcHRoLgorICoJCUFsYW4gQ294OgorICoJCQlGQzkyMCBoYXMgYW4gcm13IGJ1Zy4gRG9udCBvciBpbiB0aGUgZW5kIG1hcmtlci4KKyAqCQkJUmVtb3ZlZCBxdWV1ZSB3YWxrLCBmaXhlZCBmb3IgNjRiaXRuZXNzLgorICoJCQlSZXdyb3RlIG11Y2ggb2YgdGhlIGNvZGUgb3ZlciB0aW1lCisgKgkJCUFkZGVkIGluZGlyZWN0IGJsb2NrIGxpc3RzCisgKgkJCUhhbmRsZSA2NEsgbGltaXRzIG9uIG1hbnkgY29udHJvbGxlcnMKKyAqCQkJRG9uJ3QgdXNlIGluZGlyZWN0cyBvbiB0aGUgUHJvbWlzZSAoYnJlYWtzKQorICoJCQlIZWF2aWx5IGNob3AgZG93biB0aGUgcXVldWUgZGVwdGhzCisgKgkJRGVlcGFrIFNheGVuYToKKyAqCQkJSW5kZXBlbmRlbnQgcXVldWVzIHBlciBJT1AKKyAqCQkJU3VwcG9ydCBmb3IgZHluYW1pYyBkZXZpY2UgY3JlYXRpb24vZGVsZXRpb24KKyAqCQkJQ29kZSBjbGVhbnVwCisgKgkgICAgCQlTdXBwb3J0IGZvciBsYXJnZXIgSS9PcyB0aHJvdWdoIG1lcmdlKiBmdW5jdGlvbnMKKyAqCQkJKHRha2VuIGZyb20gREFDOTYwIGRyaXZlcikKKyAqCQlCb2ppIFQgS2FubmFudGhhbmFtOgorICoJCQlTZXQgdGhlIEkyTyBCbG9jayBkZXZpY2VzIHRvIGJlIGRldGVjdGVkIGluIGluY3JlYXNpbmcKKyAqCQkJb3JkZXIgb2YgVElEcyBkdXJpbmcgYm9vdC4KKyAqCQkJU2VhcmNoIGFuZCBzZXQgdGhlIEkyTyBibG9jayBkZXZpY2UgdGhhdCB3ZSBib290IG9mZgorICoJCQlmcm9tIGFzIHRoZSBmaXJzdCBkZXZpY2UgdG8gYmUgY2xhaW1lZCAoYXMgL2Rldi9pMm8vaGRhKQorICoJCQlQcm9wZXJseSBhdHRhY2gvZGV0YWNoIEkyTyBnZW5kaXNrIHN0cnVjdHVyZSBmcm9tIHRoZQorICoJCQlzeXN0ZW0gZ2VuZGlzayBsaXN0LiBUaGUgSTJPIGJsb2NrIGRldmljZXMgbm93IGFwcGVhciBpbgorICoJCQkvcHJvYy9wYXJ0aXRpb25zLgorICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPjoKKyAqCQkJTWlub3IgYnVnZml4ZXMgZm9yIDIuNi4KKyAqLworCisjaWZuZGVmIEkyT19CTE9DS19PU01fSAorI2RlZmluZSBJMk9fQkxPQ0tfT1NNX0gKKworI2RlZmluZSBJMk9fQkxPQ0tfUkVUUllfVElNRSBIWi80CisjZGVmaW5lIEkyT19CTE9DS19NQVhfT1BFTl9SRVFVRVNUUyA1MAorCisvKiBJMk8gQmxvY2sgT1NNIG1lbXBvb2wgc3RydWN0ICovCitzdHJ1Y3QgaTJvX2Jsb2NrX21lbXBvb2wgeworCWttZW1fY2FjaGVfdAkqc2xhYjsKKwltZW1wb29sX3QJKnBvb2w7Cit9OworCisvKiBJMk8gQmxvY2sgZGV2aWNlIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBpMm9fYmxvY2tfZGV2aWNlIHsKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldjsJLyogcG9pbnRlciB0byBJMk8gZGV2aWNlICovCisJc3RydWN0IGdlbmRpc2sgKmdkOworCXNwaW5sb2NrX3QgbG9jazsJCS8qIHF1ZXVlIGxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG9wZW5fcXVldWU7CS8qIGxpc3Qgb2YgdHJhbnNmZXJlZCwgYnV0IHVuZmluaXNoZWQKKwkJCQkJICAgcmVxdWVzdHMgKi8KKwl1bnNpZ25lZCBpbnQgb3Blbl9xdWV1ZV9kZXB0aDsJLyogbnVtYmVyIG9mIHJlcXVlc3RzIGluIHRoZSBxdWV1ZSAqLworCisJaW50IHJjYWNoZTsJCQkvKiByZWFkIGNhY2hlIGZsYWdzICovCisJaW50IHdjYWNoZTsJCQkvKiB3cml0ZSBjYWNoZSBmbGFncyAqLworCWludCBmbGFnczsKKwlpbnQgcG93ZXI7CQkJLyogcG93ZXIgc3RhdGUgKi8KKwlpbnQgbWVkaWFfY2hhbmdlX2ZsYWc7CQkvKiBtZWRpYSBjaGFuZ2VkIGZsYWcgKi8KK307CisKKy8qIEkyTyBCbG9jayBkZXZpY2UgcmVxdWVzdCAqLworc3RydWN0IGkyb19ibG9ja19yZXF1ZXN0Cit7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxOwkJLyogY29ycmVzcG9uZGluZyByZXF1ZXN0ICovCisJc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmkyb19ibGtfZGV2OwkvKiBJMk8gYmxvY2sgZGV2aWNlICovCisJaW50IHNnX2RtYV9kaXJlY3Rpb247CQkvKiBkaXJlY3Rpb24gb2YgRE1BIGJ1ZmZlciByZWFkL3dyaXRlICovCisJaW50IHNnX25lbnRzOwkJCS8qIG51bWJlciBvZiBTRyBlbGVtZW50cyAqLworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ190YWJsZVtJMk9fTUFYX1NFR01FTlRTXTsgLyogU0cgdGFibGUgKi8KK307CisKKy8qIEkyTyBCbG9jayBkZXZpY2UgZGVsYXllZCByZXF1ZXN0ICovCitzdHJ1Y3QgaTJvX2Jsb2NrX2RlbGF5ZWRfcmVxdWVzdAoreworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxdWV1ZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmM1MDA0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fY29uZmlnLmMKQEAgLTAsMCArMSwxMTYwIEBACisvKgorICogSTJPIENvbmZpZ3VyYXRpb24gSW50ZXJmYWNlIERyaXZlcgorICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5OS0yMDAyICBSZWQgSGF0CisgKgorICogV3JpdHRlbiBieSBBbGFuIENveCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZAorICoKKyAqIEZpeGVzL2FkZGl0aW9uczoKKyAqCURlZXBhayBTYXhlbmEgKDA0LzIwLzE5OTkpOgorICoJCUFkZGVkIGJhc2ljIGlvY3RsKCkgc3VwcG9ydAorICoJRGVlcGFrIFNheGVuYSAoMDYvMDcvMTk5OSk6CisgKgkJQWRkZWQgc29mdHdhcmUgZG93bmxvYWQgaW9jdGwgKHN0aWxsIHRlc3RpbmcpCisgKglBdXZvIEjka2tpbmVuICgwOS8xMC8xOTk5KToKKyAqCQlDaGFuZ2VzIHRvIGkyb19jZmdfcmVwbHkoKSwgaW9jdGxfcGFybXMoKQorICoJCUFkZGVkIGlvY3RfdmFsaWRhdGUoKQorICoJVGFuZWxpIFbkaORrYW5nYXMgKDA5LzMwLzE5OTkpOgorICoJCUZpeGVkIGlvY3RsX3N3ZGwoKQorICoJVGFuZWxpIFbkaORrYW5nYXMgKDEwLzA0LzE5OTkpOgorICoJCUNoYW5nZWQgaW9jdGxfc3dkbCgpLCBpbXBsZW1lbnRlZCBpb2N0bF9zd3VsKCkgYW5kIGlvY3RsX3N3ZGVsKCkKKyAqCURlZXBhayBTYXhlbmEgKDExLzE4LzE5OTkpOgorICoJCUFkZGVkIGV2ZW50IG1hbmFnbWVuZXQgc3VwcG9ydAorICoJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT46CisgKgkJMi40IHJld3JpdGUgcG9ydGVkIHRvIDIuNQorICoJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgorICoJCUFkZGVkIHBhc3MtdGhydSBzdXBwb3J0IGZvciBBZGFwdGVjJ3MgcmFpZHV0aWxzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNkZWZpbmUgT1NNX05BTUUJImNvbmZpZy1vc20iCisjZGVmaW5lIE9TTV9WRVJTSU9OCSIkUmV2JCIKKyNkZWZpbmUgT1NNX0RFU0NSSVBUSU9OCSJJMk8gQ29uZmlndXJhdGlvbiBPU00iCisKK2V4dGVybiBpbnQgaTJvX3Bhcm1faXNzdWUoc3RydWN0IGkyb19kZXZpY2UgKiwgaW50LCB2b2lkICosIGludCwgdm9pZCAqLCBpbnQpOworCitzdGF0aWMgc3BpbmxvY2tfdCBpMm9fY29uZmlnX2xvY2s7CisKKyNkZWZpbmUgTU9ESU5DKHgseSkgKCh4KSA9ICgoeCkgKyAxKSAlICh5KSkKKworc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50IHsKKwl1MzIgZmxhZ19jb3VudDsKKwl1MzIgYWRkcl9idXM7Cit9OworCitzdHJ1Y3QgaTJvX2NmZ19pbmZvIHsKKwlzdHJ1Y3QgZmlsZSAqZnA7CisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKmZhc3luYzsKKwlzdHJ1Y3QgaTJvX2V2dF9pbmZvIGV2ZW50X3FbSTJPX0VWVF9RX0xFTl07CisJdTE2IHFfaW47CQkvLyBRdWV1ZSBoZWFkIGluZGV4CisJdTE2IHFfb3V0OwkJLy8gUXVldWUgdGFpbCBpbmRleAorCXUxNiBxX2xlbjsJCS8vIFF1ZXVlIGxlbmd0aAorCXUxNiBxX2xvc3Q7CQkvLyBOdW1iZXIgb2YgbG9zdCBldmVudHMKKwl1bG9uZyBxX2lkOwkJLy8gRXZlbnQgcXVldWUgSUQuLi51c2VkIGFzIHR4X2NvbnRleHQKKwlzdHJ1Y3QgaTJvX2NmZ19pbmZvICpuZXh0OworfTsKK3N0YXRpYyBzdHJ1Y3QgaTJvX2NmZ19pbmZvICpvcGVuX2ZpbGVzID0gTlVMTDsKK3N0YXRpYyB1bG9uZyBpMm9fY2ZnX2luZm9faWQgPSAwOworCisvKgorICoJRWFjaCBvZiB0aGVzZSBkZXNjcmliZXMgYW4gaTJvIG1lc3NhZ2UgaGFuZGxlci4gVGhleSBhcmUKKyAqCW11bHRpcGxleGVkIGJ5IHRoZSBpMm9fY29yZSBjb2RlCisgKi8KKworc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19jb25maWdfZHJpdmVyID0geworCS5uYW1lID0gT1NNX05BTUUKK307CisKK3N0YXRpYyBpbnQgaTJvX2NmZ19nZXRpb3BzKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwl1OCBfX3VzZXIgKnVzZXJfaW9wX3RhYmxlID0gKHZvaWQgX191c2VyICopYXJnOworCXU4IHRtcFtNQVhfSTJPX0NPTlRST0xMRVJTXTsKKwlpbnQgcmV0ID0gMDsKKworCW1lbXNldCh0bXAsIDAsIE1BWF9JMk9fQ09OVFJPTExFUlMpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KQorCSAgICB0bXBbYy0+dW5pdF0gPSAxOworCisJaWYgKGNvcHlfdG9fdXNlcih1c2VyX2lvcF90YWJsZSwgdG1wLCBNQVhfSTJPX0NPTlRST0xMRVJTKSkKKwkJcmV0ID0gLUVGQVVMVDsKKworCXJldHVybiByZXQ7Cit9OworCitzdGF0aWMgaW50IGkyb19jZmdfZ2V0aHJ0KHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwlzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QgX191c2VyICpjbWQgPSAoc3RydWN0IGkyb19jbWRfaHJ0bGN0IF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgaTJvX2NtZF9ocnRsY3Qga2NtZDsKKwlpMm9faHJ0ICpocnQ7CisJaW50IGxlbjsKKwl1MzIgcmVzbGVuOworCWludCByZXQgPSAwOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZrY21kLCBjbWQsIHNpemVvZihzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIocmVzbGVuLCBrY21kLnJlc2xlbikgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChrY21kLnJlc2J1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWMgPSBpMm9fZmluZF9pb3Aoa2NtZC5pb3ApOworCWlmICghYykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWhydCA9IChpMm9faHJ0ICopIGMtPmhydC52aXJ0OworCisJbGVuID0gOCArICgoaHJ0LT5lbnRyeV9sZW4gKiBocnQtPm51bV9lbnRyaWVzKSA8PCAyKTsKKworCS8qIFdlIGRpZCBhIGdldCB1c2VyLi4uc28gYXNzdW1pbmcgbWVtIGlzIG9rLi4uaXMgdGhpcyBiYWQ/ICovCisJcHV0X3VzZXIobGVuLCBrY21kLnJlc2xlbik7CisJaWYgKGxlbiA+IHJlc2xlbikKKwkJcmV0ID0gLUVOT0JVRlM7CisJaWYgKGNvcHlfdG9fdXNlcihrY21kLnJlc2J1ZiwgKHZvaWQgKilocnQsIGxlbikpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlyZXR1cm4gcmV0OworfTsKKworc3RhdGljIGludCBpMm9fY2ZnX2dldGxjdCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisJc3RydWN0IGkyb19jbWRfaHJ0bGN0IF9fdXNlciAqY21kID0gKHN0cnVjdCBpMm9fY21kX2hydGxjdCBfX3VzZXIgKilhcmc7CisJc3RydWN0IGkyb19jbWRfaHJ0bGN0IGtjbWQ7CisJaTJvX2xjdCAqbGN0OworCWludCBsZW47CisJaW50IHJldCA9IDA7CisJdTMyIHJlc2xlbjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigma2NtZCwgY21kLCBzaXplb2Yoc3RydWN0IGkyb19jbWRfaHJ0bGN0KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKHJlc2xlbiwga2NtZC5yZXNsZW4pIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoa2NtZC5yZXNidWYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljID0gaTJvX2ZpbmRfaW9wKGtjbWQuaW9wKTsKKwlpZiAoIWMpCisJCXJldHVybiAtRU5YSU87CisKKwlsY3QgPSAoaTJvX2xjdCAqKSBjLT5sY3Q7CisKKwlsZW4gPSAodW5zaWduZWQgaW50KWxjdC0+dGFibGVfc2l6ZSA8PCAyOworCXB1dF91c2VyKGxlbiwga2NtZC5yZXNsZW4pOworCWlmIChsZW4gPiByZXNsZW4pCisJCXJldCA9IC1FTk9CVUZTOworCWVsc2UgaWYgKGNvcHlfdG9fdXNlcihrY21kLnJlc2J1ZiwgbGN0LCBsZW4pKQorCQlyZXQgPSAtRUZBVUxUOworCisJcmV0dXJuIHJldDsKK307CisKK3N0YXRpYyBpbnQgaTJvX2NmZ19wYXJtcyh1bnNpZ25lZCBsb25nIGFyZywgdW5zaWduZWQgaW50IHR5cGUpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCXN0cnVjdCBpMm9fZGV2aWNlICpkZXY7CisJc3RydWN0IGkyb19jbWRfcHNldGdldCBfX3VzZXIgKmNtZCA9CisJICAgIChzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0IF9fdXNlciAqKWFyZzsKKwlzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0IGtjbWQ7CisJdTMyIHJlc2xlbjsKKwl1OCAqb3BzOworCXU4ICpyZXM7CisJaW50IGxlbiA9IDA7CisKKwl1MzIgaTJvX2NtZCA9ICh0eXBlID09IEkyT1BBUk1HRVQgPworCQkgICAgICAgSTJPX0NNRF9VVElMX1BBUkFNU19HRVQgOiBJMk9fQ01EX1VUSUxfUEFSQU1TX1NFVCk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmtjbWQsIGNtZCwgc2l6ZW9mKHN0cnVjdCBpMm9fY21kX3BzZXRnZXQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIocmVzbGVuLCBrY21kLnJlc2xlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJYyA9IGkyb19maW5kX2lvcChrY21kLmlvcCk7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVOWElPOworCisJZGV2ID0gaTJvX2lvcF9maW5kX2RldmljZShjLCBrY21kLnRpZCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5YSU87CisKKwlvcHMgPSAodTggKikga21hbGxvYyhrY21kLm9wbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIob3BzLCBrY21kLm9wYnVmLCBrY21kLm9wbGVuKSkgeworCQlrZnJlZShvcHMpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkvKgorCSAqIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIF92ZXJ5XyBsYXJnZSB0YWJsZQorCSAqIGFuZCB0aGF0IHRoZSB1c2VyIGFza3MgZm9yIGFsbCBvZiBpdCBhdCBvbmNlLi4uCisJICovCisJcmVzID0gKHU4ICopIGttYWxsb2MoNjU1MzYsIEdGUF9LRVJORUwpOworCWlmICghcmVzKSB7CisJCWtmcmVlKG9wcyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxlbiA9IGkyb19wYXJtX2lzc3VlKGRldiwgaTJvX2NtZCwgb3BzLCBrY21kLm9wbGVuLCByZXMsIDY1NTM2KTsKKwlrZnJlZShvcHMpOworCisJaWYgKGxlbiA8IDApIHsKKwkJa2ZyZWUocmVzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJcHV0X3VzZXIobGVuLCBrY21kLnJlc2xlbik7CisJaWYgKGxlbiA+IHJlc2xlbikKKwkJcmV0ID0gLUVOT0JVRlM7CisJZWxzZSBpZiAoY29weV90b191c2VyKGtjbWQucmVzYnVmLCByZXMsIGxlbikpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlrZnJlZShyZXMpOworCisJcmV0dXJuIHJldDsKK307CisKK3N0YXRpYyBpbnQgaTJvX2NmZ19zd2RsKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMm9fc3dfeGZlciBreGZlcjsKKwlzdHJ1Y3QgaTJvX3N3X3hmZXIgX191c2VyICpweGZlciA9IChzdHJ1Y3QgaTJvX3N3X3hmZXIgX191c2VyICopYXJnOworCXVuc2lnbmVkIGNoYXIgbWF4ZnJhZyA9IDAsIGN1cmZyYWcgPSAxOworCXN0cnVjdCBpMm9fZG1hIGJ1ZmZlcjsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwLCBzd2xlbiA9IDAsIGZyYWdzaXplID0gODE5MjsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmt4ZmVyLCBweGZlciwgc2l6ZW9mKHN0cnVjdCBpMm9fc3dfeGZlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihzd2xlbiwga3hmZXIuc3dsZW4pIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIobWF4ZnJhZywga3hmZXIubWF4ZnJhZykgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihjdXJmcmFnLCBreGZlci5jdXJmcmFnKSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGN1cmZyYWcgPT0gbWF4ZnJhZykKKwkJZnJhZ3NpemUgPSBzd2xlbiAtIChtYXhmcmFnIC0gMSkgKiA4MTkyOworCisJaWYgKCFreGZlci5idWYgfHwgIWFjY2Vzc19vayhWRVJJRllfUkVBRCwga3hmZXIuYnVmLCBmcmFnc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJYyA9IGkyb19maW5kX2lvcChreGZlci5pb3ApOworCWlmICghYykKKwkJcmV0dXJuIC1FTlhJTzsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoaTJvX2RtYV9hbGxvYygmYy0+cGRldi0+ZGV2LCAmYnVmZmVyLCBmcmFnc2l6ZSwgR0ZQX0tFUk5FTCkpIHsKKwkJaTJvX21zZ19ub3AoYywgbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCV9fY29weV9mcm9tX3VzZXIoYnVmZmVyLnZpcnQsIGt4ZmVyLmJ1ZiwgZnJhZ3NpemUpOworCisJd3JpdGVsKE5JTkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNywgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9TV19ET1dOTE9BRCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUuaGVhZFsyXSk7CisJd3JpdGVsKDAsICZtc2ctPnUuaGVhZFszXSk7CisJd3JpdGVsKCgoKHUzMikga3hmZXIuZmxhZ3MpIDw8IDI0KSB8ICgoKHUzMikga3hmZXIuc3dfdHlwZSkgPDwgMTYpIHwKKwkgICAgICAgKCgodTMyKSBtYXhmcmFnKSA8PCA4KSB8ICgoKHUzMikgY3VyZnJhZykpLCAmbXNnLT5ib2R5WzBdKTsKKwl3cml0ZWwoc3dsZW4sICZtc2ctPmJvZHlbMV0pOworCXdyaXRlbChreGZlci5zd19pZCwgJm1zZy0+Ym9keVsyXSk7CisJd3JpdGVsKDB4RDAwMDAwMDAgfCBmcmFnc2l6ZSwgJm1zZy0+Ym9keVszXSk7CisJd3JpdGVsKGJ1ZmZlci5waHlzLCAmbXNnLT5ib2R5WzRdKTsKKworCW9zbV9kZWJ1Zygic3dkbCBmcmFnICVkLyVkIChzaXplICVkKVxuIiwgY3VyZnJhZywgbWF4ZnJhZywgZnJhZ3NpemUpOworCXN0YXR1cyA9IGkyb19tc2dfcG9zdF93YWl0X21lbShjLCBtLCA2MCwgJmJ1ZmZlcik7CisKKwlpZiAoc3RhdHVzICE9IC1FVElNRURPVVQpCisJCWkyb19kbWFfZnJlZSgmYy0+cGRldi0+ZGV2LCAmYnVmZmVyKTsKKworCWlmIChzdGF0dXMgIT0gSTJPX1BPU1RfV0FJVF9PSykgeworCQkvLyBpdCBmYWlscyBpZiB5b3UgdHJ5IGFuZCBzZW5kIGZyYWdzIG91dCBvZiBvcmRlcgorCQkvLyBhbmQgZm9yIHNvbWUgeWV0IHVua25vd24gcmVhc29ucyB0b28KKwkJb3NtX2luZm8oInN3ZGwgZmFpbGVkLCBEZXRhaWxlZFN0YXR1cyA9ICVkXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBpMm9fY2ZnX3N3dWwodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGkyb19zd194ZmVyIGt4ZmVyOworCXN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKnB4ZmVyID0gKHN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKilhcmc7CisJdW5zaWduZWQgY2hhciBtYXhmcmFnID0gMCwgY3VyZnJhZyA9IDE7CisJc3RydWN0IGkyb19kbWEgYnVmZmVyOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IDAsIHN3bGVuID0gMCwgZnJhZ3NpemUgPSA4MTkyOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigma3hmZXIsIHB4ZmVyLCBzaXplb2Yoc3RydWN0IGkyb19zd194ZmVyKSkpCisJCWdvdG8gcmV0dXJuX2ZhdWx0OworCisJaWYgKGdldF91c2VyKHN3bGVuLCBreGZlci5zd2xlbikgPCAwKQorCQlnb3RvIHJldHVybl9mYXVsdDsKKworCWlmIChnZXRfdXNlcihtYXhmcmFnLCBreGZlci5tYXhmcmFnKSA8IDApCisJCWdvdG8gcmV0dXJuX2ZhdWx0OworCisJaWYgKGdldF91c2VyKGN1cmZyYWcsIGt4ZmVyLmN1cmZyYWcpIDwgMCkKKwkJZ290byByZXR1cm5fZmF1bHQ7CisKKwlpZiAoY3VyZnJhZyA9PSBtYXhmcmFnKQorCQlmcmFnc2l6ZSA9IHN3bGVuIC0gKG1heGZyYWcgLSAxKSAqIDgxOTI7CisKKwlpZiAoIWt4ZmVyLmJ1ZikKKwkJZ290byByZXR1cm5fZmF1bHQ7CisKKwljID0gaTJvX2ZpbmRfaW9wKGt4ZmVyLmlvcCk7CisJaWYgKCFjKQorCQlyZXR1cm4gLUVOWElPOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChpMm9fZG1hX2FsbG9jKCZjLT5wZGV2LT5kZXYsICZidWZmZXIsIGZyYWdzaXplLCBHRlBfS0VSTkVMKSkgeworCQlpMm9fbXNnX25vcChjLCBtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd3JpdGVsKE5JTkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNywgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9TV19VUExPQUQgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbChpMm9fY29uZmlnX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LmhlYWRbMl0pOworCXdyaXRlbCgwLCAmbXNnLT51LmhlYWRbM10pOworCXdyaXRlbCgodTMyKSBreGZlci5mbGFncyA8PCAyNCB8ICh1MzIpIGt4ZmVyLgorCSAgICAgICBzd190eXBlIDw8IDE2IHwgKHUzMikgbWF4ZnJhZyA8PCA4IHwgKHUzMikgY3VyZnJhZywKKwkgICAgICAgJm1zZy0+Ym9keVswXSk7CisJd3JpdGVsKHN3bGVuLCAmbXNnLT5ib2R5WzFdKTsKKwl3cml0ZWwoa3hmZXIuc3dfaWQsICZtc2ctPmJvZHlbMl0pOworCXdyaXRlbCgweEQwMDAwMDAwIHwgZnJhZ3NpemUsICZtc2ctPmJvZHlbM10pOworCXdyaXRlbChidWZmZXIucGh5cywgJm1zZy0+Ym9keVs0XSk7CisKKwlvc21fZGVidWcoInN3dWwgZnJhZyAlZC8lZCAoc2l6ZSAlZClcbiIsIGN1cmZyYWcsIG1heGZyYWcsIGZyYWdzaXplKTsKKwlzdGF0dXMgPSBpMm9fbXNnX3Bvc3Rfd2FpdF9tZW0oYywgbSwgNjAsICZidWZmZXIpOworCisJaWYgKHN0YXR1cyAhPSBJMk9fUE9TVF9XQUlUX09LKSB7CisJCWlmIChzdGF0dXMgIT0gLUVUSU1FRE9VVCkKKwkJCWkyb19kbWFfZnJlZSgmYy0+cGRldi0+ZGV2LCAmYnVmZmVyKTsKKworCQlvc21faW5mbygic3d1bCBmYWlsZWQsIERldGFpbGVkU3RhdHVzID0gJWRcbiIsIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJaWYgKGNvcHlfdG9fdXNlcihreGZlci5idWYsIGJ1ZmZlci52aXJ0LCBmcmFnc2l6ZSkpCisJCXJldCA9IC1FRkFVTFQ7CisKKwlpMm9fZG1hX2ZyZWUoJmMtPnBkZXYtPmRldiwgJmJ1ZmZlcik7CisKK3JldHVybl9yZXQ6CisJcmV0dXJuIHJldDsKK3JldHVybl9mYXVsdDoKKwlyZXQgPSAtRUZBVUxUOworCWdvdG8gcmV0dXJuX3JldDsKK307CisKK3N0YXRpYyBpbnQgaTJvX2NmZ19zd2RlbCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisJc3RydWN0IGkyb19zd194ZmVyIGt4ZmVyOworCXN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKnB4ZmVyID0gKHN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKilhcmc7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwl1bnNpZ25lZCBpbnQgc3dsZW47CisJaW50IHRva2VuOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZreGZlciwgcHhmZXIsIHNpemVvZihzdHJ1Y3QgaTJvX3N3X3hmZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIoc3dsZW4sIGt4ZmVyLnN3bGVuKSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCisJYyA9IGkyb19maW5kX2lvcChreGZlci5pb3ApOworCWlmICghYykKKwkJcmV0dXJuIC1FTlhJTzsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRUJVU1k7CisKKwl3cml0ZWwoU0VWRU5fV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9TV19SRU1PVkUgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbChpMm9fY29uZmlnX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LmhlYWRbMl0pOworCXdyaXRlbCgwLCAmbXNnLT51LmhlYWRbM10pOworCXdyaXRlbCgodTMyKSBreGZlci5mbGFncyA8PCAyNCB8ICh1MzIpIGt4ZmVyLnN3X3R5cGUgPDwgMTYsCisJICAgICAgICZtc2ctPmJvZHlbMF0pOworCXdyaXRlbChzd2xlbiwgJm1zZy0+Ym9keVsxXSk7CisJd3JpdGVsKGt4ZmVyLnN3X2lkLCAmbXNnLT5ib2R5WzJdKTsKKworCXRva2VuID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgMTApOworCisJaWYgKHRva2VuICE9IEkyT19QT1NUX1dBSVRfT0spIHsKKwkJb3NtX2luZm8oInN3ZGVsIGZhaWxlZCwgRGV0YWlsZWRTdGF0dXMgPSAlZFxuIiwgdG9rZW4pOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBpbnQgaTJvX2NmZ192YWxpZGF0ZSh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgdG9rZW47CisJaW50IGlvcCA9IChpbnQpYXJnOworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCisJYyA9IGkyb19maW5kX2lvcChpb3ApOworCWlmICghYykKKwkJcmV0dXJuIC1FTlhJTzsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRUJVU1k7CisKKwl3cml0ZWwoRk9VUl9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX0NPTkZJR19WQUxJREFURSA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgaW9wLAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbChpMm9fY29uZmlnX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LmhlYWRbMl0pOworCXdyaXRlbCgwLCAmbXNnLT51LmhlYWRbM10pOworCisJdG9rZW4gPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCAxMCk7CisKKwlpZiAodG9rZW4gIT0gSTJPX1BPU1RfV0FJVF9PSykgeworCQlvc21faW5mbygiQ2FuJ3QgdmFsaWRhdGUgY29uZmlndXJhdGlvbiwgRXJyb3JTdGF0dXMgPSAlZFxuIiwKKwkJCSB0b2tlbik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfTsKKworc3RhdGljIGludCBpMm9fY2ZnX2V2dF9yZWcodW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmaWxlICpmcCkKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCXN0cnVjdCBpMm9fZXZ0X2lkIF9fdXNlciAqcGRlc2MgPSAoc3RydWN0IGkyb19ldnRfaWQgX191c2VyICopYXJnOworCXN0cnVjdCBpMm9fZXZ0X2lkIGtkZXNjOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigma2Rlc2MsIHBkZXNjLCBzaXplb2Yoc3RydWN0IGkyb19ldnRfaWQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBJT1AgZXhpc3RzPyAqLworCWMgPSBpMm9fZmluZF9pb3Aoa2Rlc2MuaW9wKTsKKwlpZiAoIWMpCisJCXJldHVybiAtRU5YSU87CisKKwkvKiBEZXZpY2UgZXhpc3RzPyAqLworCWQgPSBpMm9faW9wX2ZpbmRfZGV2aWNlKGMsIGtkZXNjLnRpZCk7CisJaWYgKCFkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRUJVU1k7CisKKwl3cml0ZWwoRk9VUl9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1VUSUxfRVZUX1JFR0lTVEVSIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBrZGVzYy50aWQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUuaGVhZFsyXSk7CisJd3JpdGVsKGkyb19jbnR4dF9saXN0X2FkZChjLCBmcC0+cHJpdmF0ZV9kYXRhKSwgJm1zZy0+dS5oZWFkWzNdKTsKKwl3cml0ZWwoa2Rlc2MuZXZ0X21hc2ssICZtc2ctPmJvZHlbMF0pOworCisJaTJvX21zZ19wb3N0KGMsIG0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJvX2NmZ19ldnRfZ2V0KHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZSAqZnApCit7CisJc3RydWN0IGkyb19jZmdfaW5mbyAqcCA9IE5VTEw7CisJc3RydWN0IGkyb19ldnRfZ2V0IF9fdXNlciAqdWdldCA9IChzdHJ1Y3QgaTJvX2V2dF9nZXQgX191c2VyICopYXJnOworCXN0cnVjdCBpMm9fZXZ0X2dldCBrZ2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmb3IgKHAgPSBvcGVuX2ZpbGVzOyBwOyBwID0gcC0+bmV4dCkKKwkJaWYgKHAtPnFfaWQgPT0gKHVsb25nKSBmcC0+cHJpdmF0ZV9kYXRhKQorCQkJYnJlYWs7CisKKwlpZiAoIXAtPnFfbGVuKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW1lbWNweSgma2dldC5pbmZvLCAmcC0+ZXZlbnRfcVtwLT5xX291dF0sIHNpemVvZihzdHJ1Y3QgaTJvX2V2dF9pbmZvKSk7CisJTU9ESU5DKHAtPnFfb3V0LCBJMk9fRVZUX1FfTEVOKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJvX2NvbmZpZ19sb2NrLCBmbGFncyk7CisJcC0+cV9sZW4tLTsKKwlrZ2V0LnBlbmRpbmcgPSBwLT5xX2xlbjsKKwlrZ2V0Lmxvc3QgPSBwLT5xX2xvc3Q7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJvX2NvbmZpZ19sb2NrLCBmbGFncyk7CisKKwlpZiAoY29weV90b191c2VyKHVnZXQsICZrZ2V0LCBzaXplb2Yoc3RydWN0IGkyb19ldnRfZ2V0KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0NPTVBBVAorc3RhdGljIGludCBpMm9fY2ZnX3Bhc3N0aHJ1MzIodW5zaWduZWQgZmQsIHVuc2lnbmVkIGNtbmQsIHVuc2lnbmVkIGxvbmcgYXJnLAorCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGkyb19jbWRfcGFzc3RocnUzMiBfX3VzZXIgKmNtZDsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisJdTMyIF9fdXNlciAqdXNlcl9tc2c7CisJdTMyICpyZXBseSA9IE5VTEw7CisJdTMyIF9fdXNlciAqdXNlcl9yZXBseSA9IE5VTEw7CisJdTMyIHNpemUgPSAwOworCXUzMiByZXBseV9zaXplID0gMDsKKwl1MzIgcmNvZGUgPSAwOworCXN0cnVjdCBpMm9fZG1hIHNnX2xpc3RbU0dfVEFCTEVTSVpFXTsKKwl1MzIgc2dfb2Zmc2V0ID0gMDsKKwl1MzIgc2dfY291bnQgPSAwOworCXUzMiBpID0gMDsKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZzsKKwl1MzIgbTsKKwl1bnNpZ25lZCBpbnQgaW9wOworCisJY21kID0gKHN0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1MzIgX191c2VyICopYXJnOworCisJaWYgKGdldF91c2VyKGlvcCwgJmNtZC0+aW9wKSB8fCBnZXRfdXNlcihpLCAmY21kLT5tc2cpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVzZXJfbXNnID0gY29tcGF0X3B0cihpKTsKKworCWMgPSBpMm9fZmluZF9pb3AoaW9wKTsKKwlpZiAoIWMpIHsKKwkJb3NtX2RlYnVnKCJjb250cm9sbGVyICVkIG5vdCBmb3VuZFxuIiwgaW9wKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisKKwlzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCisJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpIHsKKwkJb3NtX3dhcm4oInVuYWJsZSB0byBnZXQgc2l6ZSFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJc2l6ZSA9IHNpemUgPj4gMTY7CisKKwlpZiAoc2l6ZSA+IHNiLT5pbmJvdW5kX2ZyYW1lX3NpemUpIHsKKwkJb3NtX3dhcm4oInNpemUgb2YgbWVzc2FnZSA+IGluYm91bmRfZnJhbWVfc2l6ZSIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl1c2VyX3JlcGx5ID0gJnVzZXJfbXNnW3NpemVdOworCisJc2l6ZSA8PD0gMjsJCS8vIENvbnZlcnQgdG8gYnl0ZXMKKworCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLworCWlmIChjb3B5X2Zyb21fdXNlcihtc2csIHVzZXJfbXNnLCBzaXplKSkgeworCQlvc21fd2FybigidW5hYmxlIHRvIGNvcHkgdXNlciBtZXNzYWdlXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCWkyb19kdW1wX21lc3NhZ2UobXNnKTsKKworCWlmIChnZXRfdXNlcihyZXBseV9zaXplLCAmdXNlcl9yZXBseVswXSkgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJlcGx5X3NpemUgPj49IDE2OworCXJlcGx5X3NpemUgPDw9IDI7CisKKwlyZXBseSA9IGttYWxsb2MocmVwbHlfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXBseSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIHJlcGx5IGJ1ZmZlclxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KHJlcGx5LCAwLCByZXBseV9zaXplKTsKKworCXNnX29mZnNldCA9IChtc2ctPnUuaGVhZFswXSA+PiA0KSAmIDB4MGY7CisKKwl3cml0ZWwoaTJvX2NvbmZpZ19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5zLmljbnR4dCk7CisJd3JpdGVsKGkyb19jbnR4dF9saXN0X2FkZChjLCByZXBseSksICZtc2ctPnUucy50Y250eHQpOworCisJbWVtc2V0KHNnX2xpc3QsIDAsIHNpemVvZihzZ19saXN0WzBdKSAqIFNHX1RBQkxFU0laRSk7CisJaWYgKHNnX29mZnNldCkgeworCQlzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKnNnOworCisJCWlmIChzZ19vZmZzZXQgKiA0ID49IHNpemUpIHsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQkvLyBUT0RPIDY0Yml0IGZpeAorCQlzZyA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKikoKCZtc2ctPnUuaGVhZFswXSkgKworCQkJCQkJICBzZ19vZmZzZXQpOworCQlzZ19jb3VudCA9CisJCSAgICAoc2l6ZSAtIHNnX29mZnNldCAqIDQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CisJCWlmIChzZ19jb3VudCA+IFNHX1RBQkxFU0laRSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOklPQ1RMIFNHIExpc3QgdG9vIGxhcmdlICgldSlcbiIsCisJCQkgICAgICAgYy0+bmFtZSwgc2dfY291bnQpOworCQkJa2ZyZWUocmVwbHkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgc2dfY291bnQ7IGkrKykgeworCQkJaW50IHNnX3NpemU7CisJCQlzdHJ1Y3QgaTJvX2RtYSAqcDsKKworCQkJaWYgKCEoc2dbaV0uZmxhZ19jb3VudCAmIDB4MTAwMDAwMDAKKwkJCSAgICAgIC8qSTJPX1NHTF9GTEFHU19TSU1QTEVfQUREUkVTU19FTEVNRU5UICovICkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6QmFkIFNHIGVsZW1lbnQgJWQgLSBub3Qgc2ltcGxlICgleClcbiIsCisJCQkJICAgICAgIGMtPm5hbWUsIGksIHNnW2ldLmZsYWdfY291bnQpOworCQkJCXJjb2RlID0gLUVJTlZBTDsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlzZ19zaXplID0gc2dbaV0uZmxhZ19jb3VudCAmIDB4ZmZmZmZmOworCQkJcCA9ICYoc2dfbGlzdFtpXSk7CisJCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc2ZlciAqLworCQkJaWYgKGkyb19kbWFfYWxsb2MKKwkJCSAgICAoJmMtPnBkZXYtPmRldiwgcCwgc2dfc2l6ZSwKKwkJCSAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICIlczogQ291bGQgbm90IGFsbG9jYXRlIFNHIGJ1ZmZlciAtIHNpemUgPSAlZCBidWZmZXIgbnVtYmVyICVkIG9mICVkXG4iLAorCQkJCSAgICAgICBjLT5uYW1lLCBzZ19zaXplLCBpLCBzZ19jb3VudCk7CisJCQkJcmNvZGUgPSAtRU5PTUVNOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBTRyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisJCQlpZiAoc2dbaV0uCisJCQkgICAgZmxhZ19jb3VudCAmIDB4MDQwMDAwMDAgLypJMk9fU0dMX0ZMQUdTX0RJUiAqLyApIHsKKwkJCQkvLyBUT0RPIDY0Yml0IGZpeAorCQkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJCSAgICAocC0+dmlydCwgKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpc2dbaV0uYWRkcl9idXMsCisJCQkJICAgICBzZ19zaXplKSkgeworCQkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSBTRyBidWYgJWQgRlJPTSB1c2VyXG4iLAorCQkJCQkgICAgICAgYy0+bmFtZSwgaSk7CisJCQkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCX0KKwkJCX0KKwkJCS8vVE9ETyA2NGJpdCBmaXgKKwkJCXNnW2ldLmFkZHJfYnVzID0gKHUzMikgcC0+cGh5czsKKwkJfQorCX0KKworCXJjb2RlID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgNjApOworCWlmIChyY29kZSkKKwkJZ290byBjbGVhbnVwOworCisJaWYgKHNnX29mZnNldCkgeworCQl1MzIgbXNnWzEyOF07CisJCS8qIENvcHkgYmFjayB0aGUgU2NhdHRlciBHYXRoZXIgYnVmZmVycyBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KKwkJdTMyIGo7CisJCS8vIFRPRE8gNjRiaXQgZml4CisJCXN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqc2c7CisJCWludCBzZ19zaXplOworCisJCS8vIHJlLWFjcXVpcmUgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgdG8gaGFuZGxlIGNvcnJlY3RseSB0aGUgc2cgY29weSBvcGVyYXRpb24KKwkJbWVtc2V0KCZtc2csIDAsIE1TR19GUkFNRV9TSVpFICogNCk7CisJCS8vIGdldCB1c2VyIG1zZyBzaXplIGluIHUzMnMKKwkJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpIHsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlzaXplID0gc2l6ZSA+PiAxNjsKKwkJc2l6ZSAqPSA0OworCQkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CisJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJc2dfY291bnQgPQorCQkgICAgKHNpemUgLSBzZ19vZmZzZXQgKiA0KSAvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOworCisJCS8vIFRPRE8gNjRiaXQgZml4CisJCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKShtc2cgKyBzZ19vZmZzZXQpOworCQlmb3IgKGogPSAwOyBqIDwgc2dfY291bnQ7IGorKykgeworCQkJLyogQ29weSBvdXQgdGhlIFNHIGxpc3QgdG8gdXNlcidzIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KKwkJCWlmICghCisJCQkgICAgKHNnW2pdLgorCQkJICAgICBmbGFnX2NvdW50ICYgMHg0MDAwMDAwIC8qSTJPX1NHTF9GTEFHU19ESVIgKi8gKSkgeworCQkJCXNnX3NpemUgPSBzZ1tqXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7CisJCQkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgICgodm9pZCBfX3VzZXIgKikodTY0KSBzZ1tqXS5hZGRyX2J1cywKKwkJCQkgICAgIHNnX2xpc3Rbal0udmlydCwgc2dfc2l6ZSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSAlcCBUTyB1c2VyICV4XG4iLAorCQkJCQkgICAgICAgYy0+bmFtZSwgc2dfbGlzdFtqXS52aXJ0LAorCQkJCQkgICAgICAgc2dbal0uYWRkcl9idXMpOworCQkJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBDb3B5IGJhY2sgdGhlIHJlcGx5IHRvIHVzZXIgc3BhY2UgKi8KKwlpZiAocmVwbHlfc2l6ZSkgeworCQkvLyB3ZSB3cm90ZSBvdXIgb3duIHZhbHVlcyBmb3IgY29udGV4dCAtIG5vdyByZXN0b3JlIHRoZSB1c2VyIHN1cHBsaWVkIG9uZXMKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHJlcGx5ICsgMiwgdXNlcl9tc2cgKyAyLCBzaXplb2YodTMyKSAqIDIpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSBtZXNzYWdlIGNvbnRleHQgRlJPTSB1c2VyXG4iLAorCQkJICAgICAgIGMtPm5hbWUpOworCQkJcmNvZGUgPSAtRUZBVUxUOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9yZXBseSwgcmVwbHksIHJlcGx5X3NpemUpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSByZXBseSBUTyB1c2VyXG4iLCBjLT5uYW1lKTsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJfQorCX0KKworICAgICAgY2xlYW51cDoKKwlrZnJlZShyZXBseSk7CisJcmV0dXJuIHJjb2RlOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IGkyb19jZmdfcGFzc3RocnUodW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGkyb19jbWRfcGFzc3RocnUgX191c2VyICpjbWQgPQorCSAgICAoc3RydWN0IGkyb19jbWRfcGFzc3RocnUgX191c2VyICopYXJnOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwl1MzIgX191c2VyICp1c2VyX21zZzsKKwl1MzIgKnJlcGx5ID0gTlVMTDsKKwl1MzIgX191c2VyICp1c2VyX3JlcGx5ID0gTlVMTDsKKwl1MzIgc2l6ZSA9IDA7CisJdTMyIHJlcGx5X3NpemUgPSAwOworCXUzMiByY29kZSA9IDA7CisJdm9pZCAqc2dfbGlzdFtTR19UQUJMRVNJWkVdOworCXUzMiBzZ19vZmZzZXQgPSAwOworCXUzMiBzZ19jb3VudCA9IDA7CisJaW50IHNnX2luZGV4ID0gMDsKKwl1MzIgaSA9IDA7CisJdm9pZCAqcCA9IE5VTEw7CisJaTJvX3N0YXR1c19ibG9jayAqc2I7CisJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwl1MzIgbTsKKwl1bnNpZ25lZCBpbnQgaW9wOworCisJaWYgKGdldF91c2VyKGlvcCwgJmNtZC0+aW9wKSB8fCBnZXRfdXNlcih1c2VyX21zZywgJmNtZC0+bXNnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljID0gaTJvX2ZpbmRfaW9wKGlvcCk7CisJaWYgKCFjKSB7CisJCW9zbV93YXJuKCJjb250cm9sbGVyICVkIG5vdCBmb3VuZFxuIiwgaW9wKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisKKwlzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCisJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpCisJCXJldHVybiAtRUZBVUxUOworCXNpemUgPSBzaXplID4+IDE2OworCisJaWYgKHNpemUgPiBzYi0+aW5ib3VuZF9mcmFtZV9zaXplKSB7CisJCW9zbV93YXJuKCJzaXplIG9mIG1lc3NhZ2UgPiBpbmJvdW5kX2ZyYW1lX3NpemUiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdXNlcl9yZXBseSA9ICZ1c2VyX21zZ1tzaXplXTsKKworCXNpemUgPDw9IDI7CQkvLyBDb252ZXJ0IHRvIGJ5dGVzCisKKwkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KKwlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKHJlcGx5X3NpemUsICZ1c2VyX3JlcGx5WzBdKSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCisJcmVwbHlfc2l6ZSA+Pj0gMTY7CisJcmVwbHlfc2l6ZSA8PD0gMjsKKworCXJlcGx5ID0ga21hbGxvYyhyZXBseV9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcGx5KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgcmVwbHkgYnVmZmVyXG4iLAorCQkgICAgICAgYy0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocmVwbHksIDAsIHJlcGx5X3NpemUpOworCisJc2dfb2Zmc2V0ID0gKG1zZy0+dS5oZWFkWzBdID4+IDQpICYgMHgwZjsKKworCXdyaXRlbChpMm9fY29uZmlnX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3cml0ZWwoaTJvX2NudHh0X2xpc3RfYWRkKGMsIHJlcGx5KSwgJm1zZy0+dS5zLnRjbnR4dCk7CisKKwltZW1zZXQoc2dfbGlzdCwgMCwgc2l6ZW9mKHNnX2xpc3RbMF0pICogU0dfVEFCTEVTSVpFKTsKKwlpZiAoc2dfb2Zmc2V0KSB7CisJCXN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqc2c7CisKKwkJaWYgKHNnX29mZnNldCAqIDQgPj0gc2l6ZSkgeworCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCS8vIFRPRE8gNjRiaXQgZml4CisJCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKSgoJm1zZy0+dS5oZWFkWzBdKSArCisJCQkJCQkgIHNnX29mZnNldCk7CisJCXNnX2NvdW50ID0KKwkJICAgIChzaXplIC0gc2dfb2Zmc2V0ICogNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKKwkJaWYgKHNnX2NvdW50ID4gU0dfVEFCTEVTSVpFKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6SU9DVEwgU0cgTGlzdCB0b28gbGFyZ2UgKCV1KVxuIiwKKwkJCSAgICAgICBjLT5uYW1lLCBzZ19jb3VudCk7CisJCQlrZnJlZShyZXBseSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CisJCQlpbnQgc2dfc2l6ZTsKKworCQkJaWYgKCEoc2dbaV0uZmxhZ19jb3VudCAmIDB4MTAwMDAwMDAKKwkJCSAgICAgIC8qSTJPX1NHTF9GTEFHU19TSU1QTEVfQUREUkVTU19FTEVNRU5UICovICkpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiJXM6QmFkIFNHIGVsZW1lbnQgJWQgLSBub3Qgc2ltcGxlICgleClcbiIsCisJCQkJICAgICAgIGMtPm5hbWUsIGksIHNnW2ldLmZsYWdfY291bnQpOworCQkJCXJjb2RlID0gLUVJTlZBTDsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlzZ19zaXplID0gc2dbaV0uZmxhZ19jb3VudCAmIDB4ZmZmZmZmOworCQkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdHJhbnNmZXIgKi8KKwkJCXAgPSBrbWFsbG9jKHNnX3NpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKCFwKSB7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgU0cgYnVmZmVyIC0gc2l6ZSA9ICVkIGJ1ZmZlciBudW1iZXIgJWQgb2YgJWRcbiIsCisJCQkJICAgICAgIGMtPm5hbWUsIHNnX3NpemUsIGksIHNnX2NvdW50KTsKKwkJCQlyY29kZSA9IC1FTk9NRU07CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJc2dfbGlzdFtzZ19pbmRleCsrXSA9IHA7CS8vIHNnbGlzdCBpbmRleGVkIHdpdGggaW5wdXQgZnJhbWUsIG5vdCBvdXIgaW50ZXJuYWwgZnJhbWUuCisJCQkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgU0cgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYgKHNnW2ldLgorCQkJICAgIGZsYWdfY291bnQgJiAweDA0MDAwMDAwIC8qSTJPX1NHTF9GTEFHU19ESVIgKi8gKSB7CisJCQkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCQkgICAgKHAsICh2b2lkIF9fdXNlciAqKXNnW2ldLmFkZHJfYnVzLAorCQkJCSAgICAgc2dfc2l6ZSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgU0cgYnVmICVkIEZST00gdXNlclxuIiwKKwkJCQkJICAgICAgIGMtPm5hbWUsIGkpOworCQkJCQlyY29kZSA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQl9CisJCQkvL1RPRE8gNjRiaXQgZml4CisJCQlzZ1tpXS5hZGRyX2J1cyA9IHZpcnRfdG9fYnVzKHApOworCQl9CisJfQorCisJcmNvZGUgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCA2MCk7CisJaWYgKHJjb2RlKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoc2dfb2Zmc2V0KSB7CisJCXUzMiBtc2dbMTI4XTsKKwkJLyogQ29weSBiYWNrIHRoZSBTY2F0dGVyIEdhdGhlciBidWZmZXJzIGJhY2sgdG8gdXNlciBzcGFjZSAqLworCQl1MzIgajsKKwkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICpzZzsKKwkJaW50IHNnX3NpemU7CisKKwkJLy8gcmUtYWNxdWlyZSB0aGUgb3JpZ2luYWwgbWVzc2FnZSB0byBoYW5kbGUgY29ycmVjdGx5IHRoZSBzZyBjb3B5IG9wZXJhdGlvbgorCQltZW1zZXQoJm1zZywgMCwgTVNHX0ZSQU1FX1NJWkUgKiA0KTsKKwkJLy8gZ2V0IHVzZXIgbXNnIHNpemUgaW4gdTMycworCQlpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkgeworCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCXNpemUgPSBzaXplID4+IDE2OworCQlzaXplICo9IDQ7CisJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLworCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQlzZ19jb3VudCA9CisJCSAgICAoc2l6ZSAtIHNnX29mZnNldCAqIDQpIC8gc2l6ZW9mKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCk7CisKKwkJLy8gVE9ETyA2NGJpdCBmaXgKKwkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKG1zZyArIHNnX29mZnNldCk7CisJCWZvciAoaiA9IDA7IGogPCBzZ19jb3VudDsgaisrKSB7CisJCQkvKiBDb3B5IG91dCB0aGUgU0cgbGlzdCB0byB1c2VyJ3MgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworCQkJaWYgKCEKKwkJCSAgICAoc2dbal0uCisJCQkgICAgIGZsYWdfY291bnQgJiAweDQwMDAwMDAgLypJMk9fU0dMX0ZMQUdTX0RJUiAqLyApKSB7CisJCQkJc2dfc2l6ZSA9IHNnW2pdLmZsYWdfY291bnQgJiAweGZmZmZmZjsKKwkJCQkvLyBUT0RPIDY0Yml0IGZpeAorCQkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCQkgICAgKCh2b2lkIF9fdXNlciAqKXNnW2pdLmFkZHJfYnVzLCBzZ19saXN0W2pdLAorCQkJCSAgICAgc2dfc2l6ZSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSAlcCBUTyB1c2VyICV4XG4iLAorCQkJCQkgICAgICAgYy0+bmFtZSwgc2dfbGlzdFtqXSwKKwkJCQkJICAgICAgIHNnW2pdLmFkZHJfYnVzKTsKKwkJCQkJcmNvZGUgPSAtRUZBVUxUOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogQ29weSBiYWNrIHRoZSByZXBseSB0byB1c2VyIHNwYWNlICovCisJaWYgKHJlcGx5X3NpemUpIHsKKwkJLy8gd2Ugd3JvdGUgb3VyIG93biB2YWx1ZXMgZm9yIGNvbnRleHQgLSBub3cgcmVzdG9yZSB0aGUgdXNlciBzdXBwbGllZCBvbmVzCisJCWlmIChjb3B5X2Zyb21fdXNlcihyZXBseSArIDIsIHVzZXJfbXNnICsgMiwgc2l6ZW9mKHUzMikgKiAyKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgbWVzc2FnZSBjb250ZXh0IEZST00gdXNlclxuIiwKKwkJCSAgICAgICBjLT5uYW1lKTsKKwkJCXJjb2RlID0gLUVGQVVMVDsKKwkJfQorCQlpZiAoY29weV90b191c2VyKHVzZXJfcmVwbHksIHJlcGx5LCByZXBseV9zaXplKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgcmVwbHkgVE8gdXNlclxuIiwgYy0+bmFtZSk7CisJCQlyY29kZSA9IC1FRkFVTFQ7CisJCX0KKwl9CisKKyAgICAgIGNsZWFudXA6CisJa2ZyZWUocmVwbHkpOworCXJldHVybiByY29kZTsKK30KKyNlbmRpZgorCisvKgorICogSU9DVEwgSGFuZGxlcgorICovCitzdGF0aWMgaW50IGkyb19jZmdfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZwLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSTJPR0VUSU9QUzoKKwkJcmV0ID0gaTJvX2NmZ19nZXRpb3BzKGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBJMk9IUlRHRVQ6CisJCXJldCA9IGkyb19jZmdfZ2V0aHJ0KGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBJMk9MQ1RHRVQ6CisJCXJldCA9IGkyb19jZmdfZ2V0bGN0KGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBJMk9QQVJNU0VUOgorCQlyZXQgPSBpMm9fY2ZnX3Bhcm1zKGFyZywgSTJPUEFSTVNFVCk7CisJCWJyZWFrOworCisJY2FzZSBJMk9QQVJNR0VUOgorCQlyZXQgPSBpMm9fY2ZnX3Bhcm1zKGFyZywgSTJPUEFSTUdFVCk7CisJCWJyZWFrOworCisJY2FzZSBJMk9TV0RMOgorCQlyZXQgPSBpMm9fY2ZnX3N3ZGwoYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT1NXVUw6CisJCXJldCA9IGkyb19jZmdfc3d1bChhcmcpOworCQlicmVhazsKKworCWNhc2UgSTJPU1dERUw6CisJCXJldCA9IGkyb19jZmdfc3dkZWwoYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT1ZBTElEQVRFOgorCQlyZXQgPSBpMm9fY2ZnX3ZhbGlkYXRlKGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBJMk9FVlRSRUc6CisJCXJldCA9IGkyb19jZmdfZXZ0X3JlZyhhcmcsIGZwKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT0VWVEdFVDoKKwkJcmV0ID0gaTJvX2NmZ19ldnRfZ2V0KGFyZywgZnApOworCQlicmVhazsKKworI2lmbmRlZiBDT05GSUdfQ09NUEFUCisJY2FzZSBJMk9QQVNTVEhSVToKKwkJcmV0ID0gaTJvX2NmZ19wYXNzdGhydShhcmcpOworCQlicmVhazsKKyNlbmRpZgorCisJZGVmYXVsdDoKKwkJb3NtX2RlYnVnKCJ1bmtub3duIGlvY3RsIGNhbGxlZCFcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2ZnX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGkyb19jZmdfaW5mbyAqdG1wID0KKwkgICAgKHN0cnVjdCBpMm9fY2ZnX2luZm8gKilrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaTJvX2NmZ19pbmZvKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghdG1wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopKGkyb19jZmdfaW5mb19pZCsrKTsKKwl0bXAtPmZwID0gZmlsZTsKKwl0bXAtPmZhc3luYyA9IE5VTEw7CisJdG1wLT5xX2lkID0gKHVsb25nKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdG1wLT5xX2xlbiA9IDA7CisJdG1wLT5xX2luID0gMDsKKwl0bXAtPnFfb3V0ID0gMDsKKwl0bXAtPnFfbG9zdCA9IDA7CisJdG1wLT5uZXh0ID0gb3Blbl9maWxlczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpMm9fY29uZmlnX2xvY2ssIGZsYWdzKTsKKwlvcGVuX2ZpbGVzID0gdG1wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyb19jb25maWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2ZnX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmcCwgaW50IG9uKQoreworCXVsb25nIGlkID0gKHVsb25nKSBmcC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpMm9fY2ZnX2luZm8gKnA7CisKKwlmb3IgKHAgPSBvcGVuX2ZpbGVzOyBwOyBwID0gcC0+bmV4dCkKKwkJaWYgKHAtPnFfaWQgPT0gaWQpCisJCQlicmVhazsKKworCWlmICghcCkKKwkJcmV0dXJuIC1FQkFERjsKKworCXJldHVybiBmYXN5bmNfaGVscGVyKGZkLCBmcCwgb24sICZwLT5mYXN5bmMpOworfQorCitzdGF0aWMgaW50IGNmZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVsb25nIGlkID0gKHVsb25nKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGkyb19jZmdfaW5mbyAqcDEsICpwMjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9ja19rZXJuZWwoKTsKKwlwMSA9IHAyID0gTlVMTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpMm9fY29uZmlnX2xvY2ssIGZsYWdzKTsKKwlmb3IgKHAxID0gb3Blbl9maWxlczsgcDE7KSB7CisJCWlmIChwMS0+cV9pZCA9PSBpZCkgeworCisJCQlpZiAocDEtPmZhc3luYykKKwkJCQljZmdfZmFzeW5jKC0xLCBmaWxlLCAwKTsKKwkJCWlmIChwMikKKwkJCQlwMi0+bmV4dCA9IHAxLT5uZXh0OworCQkJZWxzZQorCQkJCW9wZW5fZmlsZXMgPSBwMS0+bmV4dDsKKworCQkJa2ZyZWUocDEpOworCQkJYnJlYWs7CisJCX0KKwkJcDIgPSBwMTsKKwkJcDEgPSBwMS0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJvX2NvbmZpZ19sb2NrLCBmbGFncyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvbmZpZ19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLmlvY3RsID0gaTJvX2NmZ19pb2N0bCwKKwkub3BlbiA9IGNmZ19vcGVuLAorCS5yZWxlYXNlID0gY2ZnX3JlbGVhc2UsCisJLmZhc3luYyA9IGNmZ19mYXN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaTJvX21pc2NkZXYgPSB7CisJSTJPX01JTk9SLAorCSJpMm9jdGwiLAorCSZjb25maWdfZm9wcworfTsKKworc3RhdGljIGludCBfX2luaXQgaTJvX2NvbmZpZ19pbml0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyBPU01fREVTQ1JJUFRJT04gIiB2IiBPU01fVkVSU0lPTiAiXG4iKTsKKworCXNwaW5fbG9ja19pbml0KCZpMm9fY29uZmlnX2xvY2spOworCisJaWYgKG1pc2NfcmVnaXN0ZXIoJmkyb19taXNjZGV2KSA8IDApIHsKKwkJb3NtX2VycigiY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCS8qCisJICogICAgICBJbnN0YWxsIG91ciBoYW5kbGVyCisJICovCisJaWYgKGkyb19kcml2ZXJfcmVnaXN0ZXIoJmkyb19jb25maWdfZHJpdmVyKSkgeworCQlvc21fZXJyKCJoYW5kbGVyIHJlZ2lzdGVyIGZhaWxlZC5cbiIpOworCQltaXNjX2RlcmVnaXN0ZXIoJmkyb19taXNjZGV2KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisjaWZkZWYgQ09ORklHX0NPTVBBVAorCXJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihJMk9QQVNTVEhSVTMyLCBpMm9fY2ZnX3Bhc3N0aHJ1MzIpOworCXJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbihJMk9HRVRJT1BTLCAodm9pZCAqKXN5c19pb2N0bCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaTJvX2NvbmZpZ19leGl0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0NPTVBBVAorCXVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKEkyT1BBU1NUSFJVMzIpOworCXVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKEkyT0dFVElPUFMpOworI2VuZGlmCisJbWlzY19kZXJlZ2lzdGVyKCZpMm9fbWlzY2Rldik7CisJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fY29uZmlnX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJlZCBIYXQgU29mdHdhcmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTihPU01fREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oT1NNX1ZFUlNJT04pOworCittb2R1bGVfaW5pdChpMm9fY29uZmlnX2luaXQpOworbW9kdWxlX2V4aXQoaTJvX2NvbmZpZ19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2xhbi5oIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fbGFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxZDYzMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX2xhbi5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogICAJaTJvX2xhbi5oCQkJSTJPIExBTiBDbGFzcyBkZWZpbml0aW9ucworICoKKyAqICAgICAgSTJPIExBTiBDTEFTUyBPU00gICAgICAgCU1heSAyNnRoIDIwMDAKKyAqCisgKiAgICAgIChDKSBDb3B5cmlnaHQgMTk5OSwgMjAwMAlVbml2ZXJzaXR5IG9mIEhlbHNpbmtpLAorICoJCQkJCURlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZQorICoKKyAqICAgICAgVGhpcyBjb2RlIGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IC8gdGVzdC4KKyAqCisgKglBdXRob3I6CQlBdXZvIEjka2tpbmVuIDxBdXZvLkhha2tpbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCQlKdWhhIFNpZXbkbmVuIDxKdWhhLlNpZXZhbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCQlUYW5lbGkgVuRo5GthbmdhcyA8VGFuZWxpLlZhaGFrYW5nYXNAY3MuSGVsc2lua2kuRkk+CisgKi8KKworI2lmbmRlZiBfSTJPX0xBTl9ICisjZGVmaW5lIF9JMk9fTEFOX0gKKworLyogRGVmYXVsdCB2YWx1ZXMgZm9yIHR1bmFibGUgcGFyYW1ldGVycyBmaXJzdCAqLworCisjZGVmaW5lIEkyT19MQU5fTUFYX0JVQ0tFVFNfT1VUIDk2CisjZGVmaW5lIEkyT19MQU5fQlVDS0VUX1RIUkVTSAkxOAkvKiA5IGJ1Y2tldHMgaW4gb25lIG1lc3NhZ2UgKi8KKyNkZWZpbmUgSTJPX0xBTl9SWF9DT1BZQlJFQUsJMjAwCisjZGVmaW5lIEkyT19MQU5fVFhfVElNRU9VVCAJKDEqSFopCisjZGVmaW5lIEkyT19MQU5fVFhfQkFUQ0hfTU9ERQkyCS8qIDI9YXV0b21hdGljLCAxPW9uLCAwPW9mZiAqLworI2RlZmluZSBJMk9fTEFOX0VWRU5UX01BU0sJMAkvKiAwPU5vbmUsIDB4RkZDMDAwMDI9QWxsICovCisKKy8qIExBTiB0eXBlcyAqLworI2RlZmluZSBJMk9fTEFOX0VUSEVSTkVUCTB4MDAzMAorI2RlZmluZSBJMk9fTEFOXzEwMFZHCQkweDAwNDAKKyNkZWZpbmUgSTJPX0xBTl9UUgkJMHgwMDUwCisjZGVmaW5lIEkyT19MQU5fRkRESQkJMHgwMDYwCisjZGVmaW5lIEkyT19MQU5fRklCUkVfQ0hBTk5FTAkweDAwNzAKKyNkZWZpbmUgSTJPX0xBTl9VTktOT1dOCQkweDAwMDAwMDAwCisKKy8qIENvbm5lY3RvciB0eXBlcyAqLworCisvKiBFdGhlcm5ldCAqLworI2RlZmluZSBJMk9fTEFOX0FVSQkJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDAxCisjZGVmaW5lIEkyT19MQU5fMTBCQVNFNQkJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDAyCisjZGVmaW5lIEkyT19MQU5fRklPUkwJCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwMworI2RlZmluZSBJMk9fTEFOXzEwQkFTRTIJCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwNAorI2RlZmluZSBJMk9fTEFOXzEwQlJPQUQzNgkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMDUKKyNkZWZpbmUgSTJPX0xBTl8xMEJBU0VfVAkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMDYKKyNkZWZpbmUgSTJPX0xBTl8xMEJBU0VfRlAJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDA3CisjZGVmaW5lIEkyT19MQU5fMTBCQVNFX0ZCCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwOAorI2RlZmluZSBJMk9fTEFOXzEwQkFTRV9GTAkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMDkKKyNkZWZpbmUgSTJPX0xBTl8xMDBCQVNFX1RYCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAwQQorI2RlZmluZSBJMk9fTEFOXzEwMEJBU0VfRlgJKEkyT19MQU5fRVRIRVJORVQgPDwgNCkgKyAweDAwMDAwMDBCCisjZGVmaW5lIEkyT19MQU5fMTAwQkFTRV9UNAkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMEMKKyNkZWZpbmUgSTJPX0xBTl8xMDAwQkFTRV9TWAkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMEQKKyNkZWZpbmUgSTJPX0xBTl8xMDAwQkFTRV9MWAkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMEUKKyNkZWZpbmUgSTJPX0xBTl8xMDAwQkFTRV9DWAkoSTJPX0xBTl9FVEhFUk5FVCA8PCA0KSArIDB4MDAwMDAwMEYKKyNkZWZpbmUgSTJPX0xBTl8xMDAwQkFTRV9UCShJMk9fTEFOX0VUSEVSTkVUIDw8IDQpICsgMHgwMDAwMDAxMAorCisvKiBBbnlMQU4gKi8KKyNkZWZpbmUgSTJPX0xBTl8xMDBWR19FVEhFUk5FVAkoSTJPX0xBTl8xMDBWRyA8PCA0KSArIDB4MDAwMDAwMDEKKyNkZWZpbmUgSTJPX0xBTl8xMDBWR19UUgkoSTJPX0xBTl8xMDBWRyA8PCA0KSArIDB4MDAwMDAwMDIKKworLyogVG9rZW4gUmluZyAqLworI2RlZmluZSBJMk9fTEFOXzRNQklUCQkoSTJPX0xBTl9UUiA8PCA0KSArIDB4MDAwMDAwMDEKKyNkZWZpbmUgSTJPX0xBTl8xNk1CSVQJCShJMk9fTEFOX1RSIDw8IDQpICsgMHgwMDAwMDAwMgorCisvKiBGRERJICovCisjZGVmaW5lIEkyT19MQU5fMTI1TUJBVUQJKEkyT19MQU5fRkRESSA8PCA0KSArIDB4MDAwMDAwMDEKKworLyogRmlicmUgQ2hhbm5lbCAqLworI2RlZmluZSBJMk9fTEFOX1BPSU5UX1BPSU5UCShJMk9fTEFOX0ZJQlJFX0NIQU5ORUwgPDwgNCkgKyAweDAwMDAwMDAxCisjZGVmaW5lIEkyT19MQU5fQVJCX0xPT1AJKEkyT19MQU5fRklCUkVfQ0hBTk5FTCA8PCA0KSArIDB4MDAwMDAwMDIKKyNkZWZpbmUgSTJPX0xBTl9QVUJMSUNfTE9PUAkoSTJPX0xBTl9GSUJSRV9DSEFOTkVMIDw8IDQpICsgMHgwMDAwMDAwMworI2RlZmluZSBJMk9fTEFOX0ZBQlJJQwkJKEkyT19MQU5fRklCUkVfQ0hBTk5FTCA8PCA0KSArIDB4MDAwMDAwMDQKKworI2RlZmluZSBJMk9fTEFOX0VNVUxBVElPTgkweDAwMDAwRjAwCisjZGVmaW5lIEkyT19MQU5fT1RIRVIJCTB4MDAwMDBGMDEKKyNkZWZpbmUgSTJPX0xBTl9ERUZBVUxUCQkweEZGRkZGRkZGCisKKy8qIExBTiBjbGFzcyBmdW5jdGlvbnMgKi8KKworI2RlZmluZSBMQU5fUEFDS0VUX1NFTkQJCTB4M0IKKyNkZWZpbmUgTEFOX1NEVV9TRU5ECQkweDNECisjZGVmaW5lIExBTl9SRUNFSVZFX1BPU1QJMHgzRQorI2RlZmluZSBMQU5fUkVTRVQJCTB4MzUKKyNkZWZpbmUgTEFOX1NVU1BFTkQJCTB4MzcKKworLyogTEFOIERldGFpbGVkU3RhdHVzQ29kZSBkZWZpbmVzICovCisjZGVmaW5lIEkyT19MQU5fRFNDX1NVQ0NFU1MJCQkweDAwCisjZGVmaW5lIEkyT19MQU5fRFNDX0RFVklDRV9GQUlMVVJFCQkweDAxCisjZGVmaW5lIEkyT19MQU5fRFNDX0RFU1RJTkFUSU9OX05PVF9GT1VORAkweDAyCisjZGVmaW5lCUkyT19MQU5fRFNDX1RSQU5TTUlUX0VSUk9SCQkweDAzCisjZGVmaW5lIEkyT19MQU5fRFNDX1RSQU5TTUlUX0FCT1JURUQJCTB4MDQKKyNkZWZpbmUgSTJPX0xBTl9EU0NfUkVDRUlWRV9FUlJPUgkJMHgwNQorI2RlZmluZSBJMk9fTEFOX0RTQ19SRUNFSVZFX0FCT1JURUQJCTB4MDYKKyNkZWZpbmUgSTJPX0xBTl9EU0NfRE1BX0VSUk9SCQkJMHgwNworI2RlZmluZSBJMk9fTEFOX0RTQ19CQURfUEFDS0VUX0RFVEVDVEVECQkweDA4CisjZGVmaW5lIEkyT19MQU5fRFNDX09VVF9PRl9NRU1PUlkJCTB4MDkKKyNkZWZpbmUgSTJPX0xBTl9EU0NfQlVDS0VUX09WRVJSVU4JCTB4MEEKKyNkZWZpbmUgSTJPX0xBTl9EU0NfSU9QX0lOVEVSTkFMX0VSUk9SCQkweDBCCisjZGVmaW5lIEkyT19MQU5fRFNDX0NBTkNFTEVECQkJMHgwQworI2RlZmluZSBJMk9fTEFOX0RTQ19JTlZBTElEX1RSQU5TQUNUSU9OX0NPTlRFWFQJMHgwRAorI2RlZmluZSBJMk9fTEFOX0RTQ19ERVNUX0FERFJFU1NfREVURUNURUQJMHgwRQorI2RlZmluZSBJMk9fTEFOX0RTQ19ERVNUX0FERFJFU1NfT01JVFRFRAkweDBGCisjZGVmaW5lIEkyT19MQU5fRFNDX1BBUlRJQUxfUEFDS0VUX1JFVFVSTkVECTB4MTAKKyNkZWZpbmUgSTJPX0xBTl9EU0NfU1VTUEVOREVECQkJMHgxMQorCitzdHJ1Y3QgaTJvX3BhY2tldF9pbmZvIHsKKwl1MzIgb2Zmc2V0IDogMjQ7CisJdTMyIGZsYWdzICA6IDg7CisJdTMyIGxlbiAgICA6IDI0OworCXUzMiBzdGF0dXMgOiA4OworfTsKKworc3RydWN0IGkyb19idWNrZXRfZGVzY3JpcHRvciB7CisJdTMyIGNvbnRleHQ7IAkJCS8qIEZJWE1FOiA2NGJpdCBzdXBwb3J0ICovCisJc3RydWN0IGkyb19wYWNrZXRfaW5mbyBwYWNrZXRfaW5mb1sxXTsKK307CisKKy8qIEV2ZW50IEluZGljYXRvciBNYXNrIEZsYWdzIGZvciBMQU4gT1NNICovCisKKyNkZWZpbmUgSTJPX0xBTl9FVlRfTElOS19ET1dOCQkweDAxCisjZGVmaW5lIEkyT19MQU5fRVZUX0xJTktfVVAJCTB4MDIKKyNkZWZpbmUgSTJPX0xBTl9FVlRfTUVESUFfQ0hBTkdFIAkweDA0CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mZGRpZGV2aWNlLmg+CisKK3N0cnVjdCBpMm9fbGFuX2xvY2FsIHsKKwl1OCB1bml0OworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2OworCisJc3RydWN0IGZkZGlfc3RhdGlzdGljcyBzdGF0czsgICAvKiBzZWUgYWxzbyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqLworCXVuc2lnbmVkIHNob3J0ICgqdHlwZV90cmFucykoc3RydWN0IHNrX2J1ZmYgKiwgc3RydWN0IG5ldF9kZXZpY2UgKik7CisJYXRvbWljX3QgYnVja2V0c19vdXQ7ICAJCS8qIG5iciBvZiB1bnVzZWQgYnVja2V0cyBvbiBERE0gKi8KKwlhdG9taWNfdCB0eF9vdXQ7CQkvKiBvdXRzdGFuZGluZyBUWGVzICovCisJdTggdHhfY291bnQ7ICAJCQkvKiBwYWNrZXRzIGluIG9uZSBUWCBtZXNzYWdlIGZyYW1lICovCisJdTE2IHR4X21heF9vdXQ7CSAgIAkJLyogRERNJ3MgVHggcXVldWUgbGVuICovCisJdTggc2dsX21heDsJCQkvKiBtYXggU0dMcyBpbiBvbmUgbWVzc2FnZSBmcmFtZSAqLworCXUzMiBtOwkJCQkvKiBJT1AgYWRkcmVzcyBvZiB0aGUgYmF0Y2ggbXNnIGZyYW1lICovCisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaTJvX2JhdGNoX3NlbmRfdGFzazsKKwlpbnQgc2VuZF9hY3RpdmU7CisJc3RydWN0IHNrX2J1ZmYgKippMm9fZmJsOwkvKiBGcmVlIGJ1Y2tldCBsaXN0ICh0byByZXVzZSBza2JzKSAqLworCWludCBpMm9fZmJsX3RhaWw7CisJc3BpbmxvY2tfdCBmYmxfbG9jazsKKworCXNwaW5sb2NrX3QgdHhfbG9jazsKKworCXUzMiBtYXhfc2l6ZV9tY190YWJsZTsJCS8qIG1heCBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyAqLworCisJLyogTEFOIE9TTSBjb25maWd1cmFibGUgcGFyYW1ldGVycyBhcmUgaGVyZTogKi8KKworCXUxNiBtYXhfYnVja2V0c19vdXQ7CQkvKiBtYXggbmJyIG9mIGJ1Y2tldHMgdG8gc2VuZCB0byBERE0gKi8KKwl1MTYgYnVja2V0X3RocmVzaDsJCS8qIHNlbmQgbW9yZSB3aGVuIHRoaXMgbWFueSB1c2VkICovCisJdTE2IHJ4X2NvcHlicmVhazsKKworCXU4ICB0eF9iYXRjaF9tb2RlOwkJLyogU2V0IHdoZW4gdXNpbmcgYmF0Y2ggbW9kZSBzZW5kcyAqLworCXUzMiBpMm9fZXZlbnRfbWFzazsJCS8qIFRvIHR1cm4gb24gaW50ZXJlc3RpbmcgZXZlbnQgZmxhZ3MgKi8KK307CisKKyNlbmRpZiAvKiBfSTJPX0xBTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMgYi9kcml2ZXJzL21lc3NhZ2UvaTJvL2kyb19wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3NmQwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Byb2MuYwpAQCAtMCwwICsxLDIxMTIgQEAKKy8qCisgKglwcm9jZnMgaGFuZGxlciBmb3IgTGludXggSTJPIHN1YnN5c3RlbQorICoKKyAqCShjKSBDb3B5cmlnaHQgMTk5OQlEZWVwYWsgU2F4ZW5hCisgKgorICoJT3JpZ2luYWxseSB3cml0dGVuIGJ5IERlZXBhayBTYXhlbmEoZGVlcGFrQHBsZXhpdHkubmV0KQorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBpcyBhbiBpbml0aWFsIHRlc3QgcmVsZWFzZS4gVGhlIGNvZGUgaXMgYmFzZWQgb24gdGhlIGRlc2lnbiBvZiB0aGUKKyAqCWlkZSBwcm9jZnMgc3lzdGVtIChkcml2ZXJzL2Jsb2NrL2lkZS1wcm9jLmMpLiBTb21lIGNvZGUgdGFrZW4gZnJvbQorICoJaTJvLWNvcmUgbW9kdWxlIGJ5IEFsYW4gQ294LgorICoKKyAqCURJU0NMQUlNRVI6IFRoaXMgY29kZSBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudC90ZXN0IGFuZCBtYXkgY2F1c2UKKyAqCXlvdXIgc3lzdGVtIHRvIGJlaGF2ZSB1bnByZWRpY3RhYmx5LiAgVXNlIGF0IHlvdXIgb3duIGRpc2NyZXRpb24uCisgKgorICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlKdWhhIFNpZXbkbmVuIChKdWhhLlNpZXZhbmVuQGNzLkhlbHNpbmtpLkZJKSwKKyAqCQlBdXZvIEjka2tpbmVuIChBdXZvLkhha2tpbmVuQGNzLkhlbHNpbmtpLkZJKQorICoJCVVuaXZlcnNpdHkgb2YgSGVsc2lua2ksIERlcGFydG1lbnQgb2YgQ29tcHV0ZXIgU2NpZW5jZQorICoJCQlMQU4gZW50cmllcworICoJCU1hcmt1cyBMaWRlbCA8TWFya3VzLkxpZGVsQHNoYWRvd2Nvbm5lY3QuY29tPgorICoJCQlDaGFuZ2VzIGZvciBuZXcgSTJPIEFQSQorICovCisKKyNkZWZpbmUgT1NNX05BTUUJInByb2Mtb3NtIgorI2RlZmluZSBPU01fVkVSU0lPTgkiJFJldiQiCisjZGVmaW5lIE9TTV9ERVNDUklQVElPTgkiSTJPIFByb2NGUyBPU00iCisKKyNkZWZpbmUgSTJPX01BWF9NT0RVTEVTIDQKKy8vIEZJWE1FIQorI2RlZmluZSBGTVRfVTY0X0hFWCAiMHglMDh4JTA4eCIKKyNkZWZpbmUgVTY0X1ZBTChwdTY0KSAqKCh1MzIqKShwdTY0KSsxKSwgKigodTMyKikocHU2NCkpCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyby5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworLyogU3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIC9wcm9jIGVudHJpZXMgKi8KK3R5cGVkZWYgc3RydWN0IF9pMm9fcHJvY19lbnRyeV90IHsKKwljaGFyICpuYW1lOwkJLyogZW50cnkgbmFtZSAqLworCW1vZGVfdCBtb2RlOwkJLyogbW9kZSAqLworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7CS8qIG9wZW4gZnVuY3Rpb24gKi8KK30gaTJvX3Byb2NfZW50cnk7CisKKy8qIGdsb2JhbCBJMk8gL3Byb2MvaTJvIGVudHJ5ICovCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICppMm9fcHJvY19kaXJfcm9vdDsKKworLyogcHJvYyBPU00gZHJpdmVyIHN0cnVjdCAqLworc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19wcm9jX2RyaXZlciA9IHsKKwkubmFtZSA9IE9TTV9OQU1FLAorfTsKKworc3RhdGljIGludCBwcmludF9zZXJpYWxfbnVtYmVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB1OCAqIHNlcmlhbG5vLCBpbnQgbWF4X2xlbikKK3sKKwlpbnQgaTsKKworCS8qIDE5OTkwNDE5IC1zcmFsc3RvbgorCSAqICAgICAgVGhlIEkyTyB2MS41IChhbmQgdjIuMCBzbyBmYXIpICJvZmZpY2lhbCBzcGVjaWZpY2F0aW9uIgorCSAqICAgICAgZ290IHNlcmlhbCBudW1iZXJzIFdST05HIQorCSAqICAgICAgQXBwYXJlbnRseSwgYW5kIGRlc3BpdGUgd2hhdCBTZWN0aW9uIDMuNC40IHNheXMgYW5kCisJICogICAgICBGaWd1cmUgMy0zNSBzaG93cyAocGcgMy0zOSBpbiB0aGUgcGRmIGRvYyksCisJICogICAgICB0aGUgY29udmVudGlvbiAvIGNvbnNlbnN1cyBzZWVtcyB0byBiZToKKwkgKiAgICAgICAgKyBGaXJzdCBieXRlIGlzIFNORm9ybWF0CisJICogICAgICAgICsgU2Vjb25kIGJ5dGUgaXMgU05MZW4gKGJ1dCBvbmx5IGlmIFNORm9ybWF0PT03ICg/KSkKKwkgKiAgICAgICAgKyAodjIuMCkgU0NTSStCUyBtYXkgdXNlIElFRUUgUmVnaXN0ZXJlZCAoNjQgb3IgMTI4IGJpdCkgZm9ybWF0CisJICovCisJc3dpdGNoIChzZXJpYWxub1swXSkgeworCWNhc2UgSTJPX1NORk9STUFUX0JJTkFSWToJLyogQmluYXJ5ICovCisJCXNlcV9wcmludGYoc2VxLCAiMHgiKTsKKwkJZm9yIChpID0gMDsgaSA8IHNlcmlhbG5vWzFdOyBpKyspIHsKKwkJCXNlcV9wcmludGYoc2VxLCAiJTAyWCIsIHNlcmlhbG5vWzIgKyBpXSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEkyT19TTkZPUk1BVF9BU0NJSToJLyogQVNDSUkgKi8KKwkJaWYgKHNlcmlhbG5vWzFdIDwgJyAnKSB7CS8qIHByaW50YWJsZSBvciBTTkxlbj8gKi8KKwkJCS8qIHNhbml0eSAqLworCQkJbWF4X2xlbiA9CisJCQkgICAgKG1heF9sZW4gPCBzZXJpYWxub1sxXSkgPyBtYXhfbGVuIDogc2VyaWFsbm9bMV07CisJCQlzZXJpYWxub1sxICsgbWF4X2xlbl0gPSAnXDAnOworCisJCQkvKiBqdXN0IHByaW50IGl0ICovCisJCQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgJnNlcmlhbG5vWzJdKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHByaW50IGNoYXJzIGZvciBzcGVjaWZpZWQgbGVuZ3RoICovCisJCQlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsbm9bMV07IGkrKykgeworCQkJCXNlcV9wcmludGYoc2VxLCAiJWMiLCBzZXJpYWxub1syICsgaV0pOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBJMk9fU05GT1JNQVRfVU5JQ09ERToJLyogVU5JQ09ERSAqLworCQlzZXFfcHJpbnRmKHNlcSwgIlVOSUNPREUgRm9ybWF0LiAgQ2FuJ3QgRGlzcGxheVxuIik7CisJCWJyZWFrOworCisJY2FzZSBJMk9fU05GT1JNQVRfTEFONDhfTUFDOgkvKiBMQU4tNDggTUFDIEFkZHJlc3MgKi8KKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiTEFOLTQ4IE1BQyBhZGRyZXNzIEAgJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAorCQkJICAgc2VyaWFsbm9bMl0sIHNlcmlhbG5vWzNdLAorCQkJICAgc2VyaWFsbm9bNF0sIHNlcmlhbG5vWzVdLCBzZXJpYWxub1s2XSwgc2VyaWFsbm9bN10pOworCQlicmVhazsKKworCWNhc2UgSTJPX1NORk9STUFUX1dBTjoJLyogV0FOIE1BQyBBZGRyZXNzICovCisJCS8qIEZJWE1FOiBGaWd1cmUgb3V0IHdoYXQgYSBXQU4gYWNjZXNzIGFkZHJlc3MgbG9va3MgbGlrZT8/ICovCisJCXNlcV9wcmludGYoc2VxLCAiV0FOIEFjY2VzcyBBZGRyZXNzIik7CisJCWJyZWFrOworCisvKiBwbHVzIG5ldyBpbiB2Mi4wICovCisJY2FzZSBJMk9fU05GT1JNQVRfTEFONjRfTUFDOgkvKiBMQU4tNjQgTUFDIEFkZHJlc3MgKi8KKwkJLyogRklYTUU6IEZpZ3VyZSBvdXQgd2hhdCBhIExBTi02NCBhZGRyZXNzIHJlYWxseSBsb29rcyBsaWtlPz8gKi8KKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiTEFOLTY0IE1BQyBhZGRyZXNzIEAgWz86JTAyWDolMDJYOj9dICUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKwkJCSAgIHNlcmlhbG5vWzhdLCBzZXJpYWxub1s5XSwKKwkJCSAgIHNlcmlhbG5vWzJdLCBzZXJpYWxub1szXSwKKwkJCSAgIHNlcmlhbG5vWzRdLCBzZXJpYWxub1s1XSwgc2VyaWFsbm9bNl0sIHNlcmlhbG5vWzddKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT19TTkZPUk1BVF9ERE06CS8qIEkyTyBERE0gKi8KKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiRERNOiBUaWQ9JTAzWGgsIFJzdmQ9JTA0WGgsIE9yZ0lkPSUwNFhoIiwKKwkJCSAgICoodTE2ICopICYgc2VyaWFsbm9bMl0sCisJCQkgICAqKHUxNiAqKSAmIHNlcmlhbG5vWzRdLCAqKHUxNiAqKSAmIHNlcmlhbG5vWzZdKTsKKwkJYnJlYWs7CisKKwljYXNlIEkyT19TTkZPUk1BVF9JRUVFX1JFRzY0OgkvKiBJRUVFIFJlZ2lzdGVyZWQgKDY0LWJpdCkgKi8KKwljYXNlIEkyT19TTkZPUk1BVF9JRUVFX1JFRzEyODoJLyogSUVFRSBSZWdpc3RlcmVkICgxMjgtYml0KSAqLworCQkvKiBGSVhNRTogRmlndXJlIGlmIHRoaXMgaXMgZXZlbiBjbG9zZT8/ICovCisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgIklFRUUgTm9kZU5hbWUoaGksbG8pPSglMDhYaDolMDhYaCksIFBvcnROYW1lKGhpLGxvKT0oJTA4WGg6JTA4WGgpXG4iLAorCQkJICAgKih1MzIgKikgJiBzZXJpYWxub1syXSwKKwkJCSAgICoodTMyICopICYgc2VyaWFsbm9bNl0sCisJCQkgICAqKHUzMiAqKSAmIHNlcmlhbG5vWzEwXSwgKih1MzIgKikgJiBzZXJpYWxub1sxNF0pOworCQlicmVhazsKKworCWNhc2UgSTJPX1NORk9STUFUX1VOS05PV046CS8qIFVua25vd24gMCAgICAqLworCWNhc2UgSTJPX1NORk9STUFUX1VOS05PV04yOgkvKiBVbmtub3duIDB4ZmYgKi8KKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKHNlcSwgIlVua25vd24gZGF0YSBmb3JtYXQgKDB4JTAyeCkiLCBzZXJpYWxub1swXSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqCWkyb19nZXRfY2xhc3NfbmFtZSAtIAlkbyBpMm8gY2xhc3MgbmFtZSBsb29rdXAKKyAqCUBjbGFzczogY2xhc3MgbnVtYmVyCisgKgorICoJUmV0dXJuIGEgZGVzY3JpcHRpdmUgc3RyaW5nIGZvciBhbiBpMm8gY2xhc3MKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmkyb19nZXRfY2xhc3NfbmFtZShpbnQgY2xhc3MpCit7CisJaW50IGlkeCA9IDE2OworCXN0YXRpYyBjaGFyICppMm9fY2xhc3NfbmFtZVtdID0geworCQkiRXhlY3V0aXZlIiwKKwkJIkRldmljZSBEcml2ZXIgTW9kdWxlIiwKKwkJIkJsb2NrIERldmljZSIsCisJCSJUYXBlIERldmljZSIsCisJCSJMQU4gSW50ZXJmYWNlIiwKKwkJIldBTiBJbnRlcmZhY2UiLAorCQkiRmlicmUgQ2hhbm5lbCBQb3J0IiwKKwkJIkZpYnJlIENoYW5uZWwgRGV2aWNlIiwKKwkJIlNDU0kgRGV2aWNlIiwKKwkJIkFURSBQb3J0IiwKKwkJIkFURSBEZXZpY2UiLAorCQkiRmxvcHB5IENvbnRyb2xsZXIiLAorCQkiRmxvcHB5IERldmljZSIsCisJCSJTZWNvbmRhcnkgQnVzIFBvcnQiLAorCQkiUGVlciBUcmFuc3BvcnQgQWdlbnQiLAorCQkiUGVlciBUcmFuc3BvcnQiLAorCQkiVW5rbm93biIKKwl9OworCisJc3dpdGNoIChjbGFzcyAmIDB4ZmZmKSB7CisJY2FzZSBJMk9fQ0xBU1NfRVhFQ1VUSVZFOgorCQlpZHggPSAwOworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19ERE06CisJCWlkeCA9IDE7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFOgorCQlpZHggPSAyOworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19TRVFVRU5USUFMX1NUT1JBR0U6CisJCWlkeCA9IDM7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0xBTjoKKwkJaWR4ID0gNDsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfV0FOOgorCQlpZHggPSA1OworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19GSUJSRV9DSEFOTkVMX1BPUlQ6CisJCWlkeCA9IDY7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0ZJQlJFX0NIQU5ORUxfUEVSSVBIRVJBTDoKKwkJaWR4ID0gNzsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfU0NTSV9QRVJJUEhFUkFMOgorCQlpZHggPSA4OworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19BVEVfUE9SVDoKKwkJaWR4ID0gOTsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfQVRFX1BFUklQSEVSQUw6CisJCWlkeCA9IDEwOworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19GTE9QUFlfQ09OVFJPTExFUjoKKwkJaWR4ID0gMTE7CisJCWJyZWFrOworCWNhc2UgSTJPX0NMQVNTX0ZMT1BQWV9ERVZJQ0U6CisJCWlkeCA9IDEyOworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19CVVNfQURBUFRFUl9QT1JUOgorCQlpZHggPSAxMzsKKwkJYnJlYWs7CisJY2FzZSBJMk9fQ0xBU1NfUEVFUl9UUkFOU1BPUlRfQUdFTlQ6CisJCWlkeCA9IDE0OworCQlicmVhazsKKwljYXNlIEkyT19DTEFTU19QRUVSX1RSQU5TUE9SVDoKKwkJaWR4ID0gMTU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBpMm9fY2xhc3NfbmFtZVtpZHhdOworfQorCisjZGVmaW5lIFNDU0lfVEFCTEVfU0laRQkxMworc3RhdGljIGNoYXIgKnNjc2lfZGV2aWNlc1tdID0geworCSJEaXJlY3QtQWNjZXNzIFJlYWQvV3JpdGUiLAorCSJTZXF1ZW50aWFsLUFjY2VzcyBTdG9yYWdlIiwKKwkiUHJpbnRlciIsCisJIlByb2Nlc3NvciIsCisJIldPUk0gRGV2aWNlIiwKKwkiQ0QtUk9NIERldmljZSIsCisJIlNjYW5uZXIgRGV2aWNlIiwKKwkiT3B0aWNhbCBNZW1vcnkgRGV2aWNlIiwKKwkiTWVkaXVtIENoYW5nZXIgRGV2aWNlIiwKKwkiQ29tbXVuaWNhdGlvbnMgRGV2aWNlIiwKKwkiR3JhcGhpY3MgQXJ0IFByZS1QcmVzcyBEZXZpY2UiLAorCSJHcmFwaGljcyBBcnQgUHJlLVByZXNzIERldmljZSIsCisJIkFycmF5IENvbnRyb2xsZXIgRGV2aWNlIgorfTsKKworc3RhdGljIGNoYXIgKmNodG9zdHIodTggKiBjaGFycywgaW50IG4pCit7CisJY2hhciB0bXBbMjU2XTsKKwl0bXBbMF0gPSAwOworCXJldHVybiBzdHJuY2F0KHRtcCwgKGNoYXIgKiljaGFycywgbik7Cit9CisKK3N0YXRpYyBpbnQgaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc3RydWN0IHNlcV9maWxlICpzZXEsIGludCBibG9ja19zdGF0dXMsCisJCQkJICAgY2hhciAqZ3JvdXApCit7CisJc3dpdGNoIChibG9ja19zdGF0dXMpIHsKKwljYXNlIC1FVElNRURPVVQ6CisJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIlRpbWVvdXQgcmVhZGluZyBncm91cCAlcy5cbiIsIGdyb3VwKTsKKwljYXNlIC1FTk9NRU06CisJCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIk5vIGZyZWUgbWVtb3J5IHRvIHJlYWQgdGhlIHRhYmxlLlxuIik7CisJY2FzZSAtSTJPX1BBUkFNU19TVEFUVVNfSU5WQUxJRF9HUk9VUF9JRDoKKwkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiR3JvdXAgJXMgbm90IHN1cHBvcnRlZC5cbiIsIGdyb3VwKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsCisJCQkJICAiRXJyb3IgcmVhZGluZyBncm91cCAlcy4gQmxvY2tTdGF0dXMgMHglMDJYXG4iLAorCQkJCSAgZ3JvdXAsIC1ibG9ja19zdGF0dXMpOworCX0KK30KKworc3RhdGljIGNoYXIgKmJ1c19zdHJpbmdzW10gPSB7CisJIkxvY2FsIEJ1cyIsCisJIklTQSIsCisJIkVJU0EiLAorCSJNQ0EiLAorCSJQQ0kiLAorCSJQQ01DSUEiLAorCSJOVUJVUyIsCisJIkNBUkRCVVMiCit9OworCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19ocnQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKKwlpMm9faHJ0ICpocnQgPSAoaTJvX2hydCAqKSBjLT5ocnQudmlydDsKKwl1MzIgYnVzOworCWludCBpOworCisJaWYgKGhydC0+aHJ0X3ZlcnNpb24pIHsKKwkJc2VxX3ByaW50ZihzZXEsCisJCQkgICAiSFJUIHRhYmxlIGZvciBjb250cm9sbGVyIGlzIHRvbyBuZXcgYSB2ZXJzaW9uLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiSFJUIGhhcyAlZCBlbnRyaWVzIG9mICVkIGJ5dGVzIGVhY2guXG4iLAorCQkgICBocnQtPm51bV9lbnRyaWVzLCBocnQtPmVudHJ5X2xlbiA8PCAyKTsKKworCWZvciAoaSA9IDA7IGkgPCBocnQtPm51bV9lbnRyaWVzOyBpKyspIHsKKwkJc2VxX3ByaW50ZihzZXEsICJFbnRyeSAlZDpcbiIsIGkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiAgIEFkYXB0ZXIgSUQ6ICUwIzEweFxuIiwKKwkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmFkYXB0ZXJfaWQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiAgIENvbnRyb2xsaW5nIHRpZDogJTAjNnhcbiIsCisJCQkgICBocnQtPmhydF9lbnRyeVtpXS5wYXJlbnRfdGlkKTsKKworCQlpZiAoaHJ0LT5ocnRfZW50cnlbaV0uYnVzX3R5cGUgIT0gMHg4MCkgeworCQkJYnVzID0gaHJ0LT5ocnRfZW50cnlbaV0uYnVzX3R5cGU7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICVzIEluZm9ybWF0aW9uXG4iLAorCQkJCSAgIGJ1c19zdHJpbmdzW2J1c10pOworCisJCQlzd2l0Y2ggKGJ1cykgeworCQkJY2FzZSBJMk9fQlVTX0xPQ0FMOgorCQkJCXNlcV9wcmludGYoc2VxLCAiICAgICBJT0Jhc2U6ICUwIzZ4LCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5sb2NhbF9idXMuCisJCQkJCSAgIExiQmFzZUlPUG9ydCk7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgTWVtb3J5QmFzZTogJTAjMTB4XG4iLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMubG9jYWxfYnVzLgorCQkJCQkgICBMYkJhc2VNZW1vcnlBZGRyZXNzKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJMk9fQlVTX0lTQToKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgSU9CYXNlOiAlMCM2eCwiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMuaXNhX2J1cy4KKwkJCQkJICAgSXNhQmFzZUlPUG9ydCk7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgTWVtb3J5QmFzZTogJTAjMTB4LCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5pc2FfYnVzLgorCQkJCQkgICBJc2FCYXNlTWVtb3J5QWRkcmVzcyk7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgQ1NOOiAlMCM0eCwiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMuaXNhX2J1cy5DU04pOworCQkJCWJyZWFrOworCisJCQljYXNlIEkyT19CVVNfRUlTQToKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICAgSU9CYXNlOiAlMCM2eCwiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMuZWlzYV9idXMuCisJCQkJCSAgIEVpc2FCYXNlSU9Qb3J0KTsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiBNZW1vcnlCYXNlOiAlMCMxMHgsIiwKKwkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLmVpc2FfYnVzLgorCQkJCQkgICBFaXNhQmFzZU1lbW9yeUFkZHJlc3MpOworCQkJCXNlcV9wcmludGYoc2VxLCAiIFNsb3Q6ICUwIzR4LCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5laXNhX2J1cy4KKwkJCQkJICAgRWlzYVNsb3ROdW1iZXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIEkyT19CVVNfTUNBOgorCQkJCXNlcV9wcmludGYoc2VxLCAiICAgICBJT0Jhc2U6ICUwIzZ4LCIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5tY2FfYnVzLgorCQkJCQkgICBNY2FCYXNlSU9Qb3J0KTsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiBNZW1vcnlCYXNlOiAlMCMxMHgsIiwKKwkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLm1jYV9idXMuCisJCQkJCSAgIE1jYUJhc2VNZW1vcnlBZGRyZXNzKTsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiBTbG90OiAlMCM0eCwiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMubWNhX2J1cy4KKwkJCQkJICAgTWNhU2xvdE51bWJlcik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSTJPX0JVU19QQ0k6CisJCQkJc2VxX3ByaW50ZihzZXEsICIgICAgIEJ1czogJTAjNHgiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMucGNpX2J1cy4KKwkJCQkJICAgUGNpQnVzTnVtYmVyKTsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiBEZXY6ICUwIzR4IiwKKwkJCQkJICAgaHJ0LT5ocnRfZW50cnlbaV0uYnVzLnBjaV9idXMuCisJCQkJCSAgIFBjaURldmljZU51bWJlcik7CisJCQkJc2VxX3ByaW50ZihzZXEsICIgRnVuYzogJTAjNHgiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMucGNpX2J1cy4KKwkJCQkJICAgUGNpRnVuY3Rpb25OdW1iZXIpOworCQkJCXNlcV9wcmludGYoc2VxLCAiIFZlbmRvcjogJTAjNngiLAorCQkJCQkgICBocnQtPmhydF9lbnRyeVtpXS5idXMucGNpX2J1cy4KKwkJCQkJICAgUGNpVmVuZG9ySUQpOworCQkJCXNlcV9wcmludGYoc2VxLCAiIERldmljZTogJTAjNnhcbiIsCisJCQkJCSAgIGhydC0+aHJ0X2VudHJ5W2ldLmJ1cy5wY2lfYnVzLgorCQkJCQkgICBQY2lEZXZpY2VJRCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJc2VxX3ByaW50ZihzZXEsICIgICAgICBVbnN1cHBvcnRlZCBCdXMgVHlwZVxuIik7CisJCQl9CisJCX0gZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICIgICBVbmtub3duIEJ1cyBUeXBlXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfbGN0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKilzZXEtPnByaXZhdGU7CisJaTJvX2xjdCAqbGN0ID0gKGkyb19sY3QgKikgYy0+bGN0OworCWludCBlbnRyaWVzOworCWludCBpOworCisjZGVmaW5lIEJVU19UQUJMRV9TSVpFIDMKKwlzdGF0aWMgY2hhciAqYnVzX3BvcnRzW10gPSB7CisJCSJHZW5lcmljIEJ1cyIsCisJCSJTQ1NJIEJ1cyIsCisJCSJGaWJyZSBDaGFubmVsIEJ1cyIKKwl9OworCisJZW50cmllcyA9IChsY3QtPnRhYmxlX3NpemUgLSAzKSAvIDk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIkxDVCBjb250YWlucyAlZCAlc1xuIiwgZW50cmllcywKKwkJICAgZW50cmllcyA9PSAxID8gImVudHJ5IiA6ICJlbnRyaWVzIik7CisJaWYgKGxjdC0+Ym9vdF90aWQpCisJCXNlcV9wcmludGYoc2VxLCAiQm9vdCBEZXZpY2UgQCBJRCAlZFxuIiwgbGN0LT5ib290X3RpZCk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIkN1cnJlbnQgQ2hhbmdlIEluZGljYXRvcjogJSMxMHhcbiIsIGxjdC0+Y2hhbmdlX2luZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXNlcV9wcmludGYoc2VxLCAiRW50cnkgJWRcbiIsIGkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiAgQ2xhc3MsIFN1YkNsYXNzICA6ICVzIiwKKwkJCSAgIGkyb19nZXRfY2xhc3NfbmFtZShsY3QtPmxjdF9lbnRyeVtpXS5jbGFzc19pZCkpOworCisJCS8qCisJCSAqICAgICAgQ2xhc3NlcyB3aGljaCB3ZSdsbCBwcmludCBzdWJjbGFzcyBpbmZvIGZvcgorCQkgKi8KKwkJc3dpdGNoIChsY3QtPmxjdF9lbnRyeVtpXS5jbGFzc19pZCAmIDB4RkZGKSB7CisJCWNhc2UgSTJPX0NMQVNTX1JBTkRPTV9CTE9DS19TVE9SQUdFOgorCQkJc3dpdGNoIChsY3QtPmxjdF9lbnRyeVtpXS5zdWJfY2xhc3MpIHsKKwkJCWNhc2UgMHgwMDoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgRGlyZWN0LUFjY2VzcyBSZWFkL1dyaXRlIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMHgwNDoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgV09STSBEcml2ZSIpOworCQkJCWJyZWFrOworCisJCQljYXNlIDB4MDU6CisJCQkJc2VxX3ByaW50ZihzZXEsICIsIENELVJPTSBEcml2ZSIpOworCQkJCWJyZWFrOworCisJCQljYXNlIDB4MDc6CisJCQkJc2VxX3ByaW50ZihzZXEsICIsIE9wdGljYWwgTWVtb3J5IERldmljZSIpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBVbmtub3duICgweCUwMngpIiwKKwkJCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uc3ViX2NsYXNzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgSTJPX0NMQVNTX0xBTjoKKwkJCXN3aXRjaCAobGN0LT5sY3RfZW50cnlbaV0uc3ViX2NsYXNzICYgMHhGRikgeworCQkJY2FzZSAweDMwOgorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBFdGhlcm5ldCIpOworCQkJCWJyZWFrOworCisJCQljYXNlIDB4NDA6CisJCQkJc2VxX3ByaW50ZihzZXEsICIsIDEwMGJhc2UgVkciKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAweDUwOgorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBJRUVFIDgwMi41L1Rva2VuLVJpbmciKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAweDYwOgorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBBTlNJIFgzVDkuNSBGRERJIik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMHg3MDoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgRmlicmUgQ2hhbm5lbCIpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXNlcV9wcmludGYoc2VxLCAiLCBVbmtub3duIFN1Yi1DbGFzcyAoMHglMDJ4KSIsCisJCQkJCSAgIGxjdC0+bGN0X2VudHJ5W2ldLnN1Yl9jbGFzcyAmIDB4RkYpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBJMk9fQ0xBU1NfU0NTSV9QRVJJUEhFUkFMOgorCQkJaWYgKGxjdC0+bGN0X2VudHJ5W2ldLnN1Yl9jbGFzcyA8IFNDU0lfVEFCTEVfU0laRSkKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgJXMiLAorCQkJCQkgICBzY3NpX2RldmljZXNbbGN0LT5sY3RfZW50cnlbaV0uCisJCQkJCQkJc3ViX2NsYXNzXSk7CisJCQllbHNlCisJCQkJc2VxX3ByaW50ZihzZXEsICIsIFVua25vd24gRGV2aWNlIFR5cGUiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQ6CisJCQlpZiAobGN0LT5sY3RfZW50cnlbaV0uc3ViX2NsYXNzIDwgQlVTX1RBQkxFX1NJWkUpCisJCQkJc2VxX3ByaW50ZihzZXEsICIsICVzIiwKKwkJCQkJICAgYnVzX3BvcnRzW2xjdC0+bGN0X2VudHJ5W2ldLgorCQkJCQkJICAgICBzdWJfY2xhc3NdKTsKKwkJCWVsc2UKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiwgVW5rbm93biBCdXMgVHlwZSIpOworCQkJYnJlYWs7CisJCX0KKwkJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCisJCXNlcV9wcmludGYoc2VxLCAiICBMb2NhbCBUSUQgICAgICAgIDogMHglMDN4XG4iLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0udGlkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIgIFVzZXIgVElEICAgICAgICAgOiAweCUwM3hcbiIsCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS51c2VyX3RpZCk7CisJCXNlcV9wcmludGYoc2VxLCAiICBQYXJlbnQgVElEICAgICAgIDogMHglMDN4XG4iLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0ucGFyZW50X3RpZCk7CisJCXNlcV9wcmludGYoc2VxLCAiICBJZGVudGl0eSBUYWcgICAgIDogMHgleCV4JXgleCV4JXgleCV4XG4iLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzBdLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzFdLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzJdLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzNdLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzRdLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzVdLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzZdLAorCQkJICAgbGN0LT5sY3RfZW50cnlbaV0uaWRlbnRpdHlfdGFnWzddKTsKKwkJc2VxX3ByaW50ZihzZXEsICIgIENoYW5nZSBJbmRpY2F0b3IgOiAlMCMxMHhcbiIsCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5jaGFuZ2VfaW5kKTsKKwkJc2VxX3ByaW50ZihzZXEsICIgIEV2ZW50IENhcGFiIE1hc2sgOiAlMCMxMHhcbiIsCisJCQkgICBsY3QtPmxjdF9lbnRyeVtpXS5kZXZpY2VfZmxhZ3MpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19zdGF0dXMoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKKwljaGFyIHByb2RzdHJbMjVdOworCWludCB2ZXJzaW9uOworCWkyb19zdGF0dXNfYmxvY2sgKnNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CisKKwlpMm9fc3RhdHVzX2dldChjKTsJLy8gcmVyZWFkIHRoZSBzdGF0dXMgYmxvY2sKKworCXNlcV9wcmludGYoc2VxLCAiT3JnYW5pemF0aW9uIElEICAgICAgICA6ICUwIzZ4XG4iLCBzYi0+b3JnX2lkKTsKKworCXZlcnNpb24gPSBzYi0+aTJvX3ZlcnNpb247CisKKy8qIEZJWE1FIGZvciBTcGVjIDIuMAorCWlmICh2ZXJzaW9uID09IDB4MDIpIHsKKwkJc2VxX3ByaW50ZihzZXEsICJMb3dlc3QgSTJPIHZlcnNpb24gc3VwcG9ydGVkOiAiKTsKKwkJc3dpdGNoKHdvcmtzcGFjZVsyXSkgeworCQkJY2FzZSAweDAwOgorCQkJCXNlcV9wcmludGYoc2VxLCAiMS4wXG4iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMToKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIjEuNVxuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDI6CisJCQkJc2VxX3ByaW50ZihzZXEsICIyLjBcbiIpOworCQkJCWJyZWFrOworCQl9CisKKwkJc2VxX3ByaW50ZihzZXEsICJIaWdoZXN0IEkyTyB2ZXJzaW9uIHN1cHBvcnRlZDogIik7CisJCXN3aXRjaCh3b3Jrc3BhY2VbM10pIHsKKwkJCWNhc2UgMHgwMDoKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIjEuMFxuIik7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDE6CisJCQkJc2VxX3ByaW50ZihzZXEsICIxLjVcbiIpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDAyOgorCQkJCXNlcV9wcmludGYoc2VxLCAiMi4wXG4iKTsKKwkJCQlicmVhazsKKwkJfQorCX0KKyovCisJc2VxX3ByaW50ZihzZXEsICJJT1AgSUQgICAgICAgICAgICAgICAgIDogJTAjNXhcbiIsIHNiLT5pb3BfaWQpOworCXNlcV9wcmludGYoc2VxLCAiSG9zdCBVbml0IElEICAgICAgICAgICA6ICUwIzZ4XG4iLCBzYi0+aG9zdF91bml0X2lkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNlZ21lbnQgTnVtYmVyICAgICAgICAgOiAlMCM1eFxuIiwgc2ItPnNlZ21lbnRfbnVtYmVyKTsKKworCXNlcV9wcmludGYoc2VxLCAiSTJPIHZlcnNpb24gICAgICAgICAgICA6ICIpOworCXN3aXRjaCAodmVyc2lvbikgeworCWNhc2UgMHgwMDoKKwkJc2VxX3ByaW50ZihzZXEsICIxLjBcbiIpOworCQlicmVhazsKKwljYXNlIDB4MDE6CisJCXNlcV9wcmludGYoc2VxLCAiMS41XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDAyOgorCQlzZXFfcHJpbnRmKHNlcSwgIjIuMFxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYoc2VxLCAiVW5rbm93biB2ZXJzaW9uXG4iKTsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIklPUCBTdGF0ZSAgICAgICAgICAgICAgOiAiKTsKKwlzd2l0Y2ggKHNiLT5pb3Bfc3RhdGUpIHsKKwljYXNlIDB4MDE6CisJCXNlcV9wcmludGYoc2VxLCAiSU5JVFxuIik7CisJCWJyZWFrOworCisJY2FzZSAweDAyOgorCQlzZXFfcHJpbnRmKHNlcSwgIlJFU0VUXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDQ6CisJCXNlcV9wcmludGYoc2VxLCAiSE9MRFxuIik7CisJCWJyZWFrOworCisJY2FzZSAweDA1OgorCQlzZXFfcHJpbnRmKHNlcSwgIlJFQURZXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDg6CisJCXNlcV9wcmludGYoc2VxLCAiT1BFUkFUSU9OQUxcbiIpOworCQlicmVhazsKKworCWNhc2UgMHgxMDoKKwkJc2VxX3ByaW50ZihzZXEsICJGQUlMRURcbiIpOworCQlicmVhazsKKworCWNhc2UgMHgxMToKKwkJc2VxX3ByaW50ZihzZXEsICJGQVVMVEVEXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKHNlcSwgIlVua25vd25cbiIpOworCQlicmVhazsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIk1lc3NlbmdlciBUeXBlICAgICAgICAgOiAiKTsKKwlzd2l0Y2ggKHNiLT5tc2dfdHlwZSkgeworCWNhc2UgMHgwMDoKKwkJc2VxX3ByaW50ZihzZXEsICJNZW1vcnkgbWFwcGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAweDAxOgorCQlzZXFfcHJpbnRmKHNlcSwgIk1lbW9yeSBtYXBwZWQgb25seVxuIik7CisJCWJyZWFrOworCWNhc2UgMHgwMjoKKwkJc2VxX3ByaW50ZihzZXEsICJSZW1vdGUgb25seVxuIik7CisJCWJyZWFrOworCWNhc2UgMHgwMzoKKwkJc2VxX3ByaW50ZihzZXEsICJNZW1vcnkgbWFwcGVkIGFuZCByZW1vdGVcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKHNlcSwgIlVua25vd25cbiIpOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiSW5ib3VuZCBGcmFtZSBTaXplICAgICA6ICVkIGJ5dGVzXG4iLAorCQkgICBzYi0+aW5ib3VuZF9mcmFtZV9zaXplIDw8IDIpOworCXNlcV9wcmludGYoc2VxLCAiTWF4IEluYm91bmQgRnJhbWVzICAgICA6ICVkXG4iLAorCQkgICBzYi0+bWF4X2luYm91bmRfZnJhbWVzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkN1cnJlbnQgSW5ib3VuZCBGcmFtZXMgOiAlZFxuIiwKKwkJICAgc2ItPmN1cl9pbmJvdW5kX2ZyYW1lcyk7CisJc2VxX3ByaW50ZihzZXEsICJNYXggT3V0Ym91bmQgRnJhbWVzICAgIDogJWRcbiIsCisJCSAgIHNiLT5tYXhfb3V0Ym91bmRfZnJhbWVzKTsKKworCS8qIFNwZWMgZG9lc24ndCBzYXkgaWYgTlVMTCB0ZXJtaW5hdGVkIG9yIG5vdC4uLiAqLworCW1lbWNweShwcm9kc3RyLCBzYi0+cHJvZHVjdF9pZCwgMjQpOworCXByb2RzdHJbMjRdID0gJ1wwJzsKKwlzZXFfcHJpbnRmKHNlcSwgIlByb2R1Y3QgSUQgICAgICAgICAgICAgOiAlc1xuIiwgcHJvZHN0cik7CisJc2VxX3ByaW50ZihzZXEsICJFeHBlY3RlZCBMQ1QgU2l6ZSAgICAgIDogJWQgYnl0ZXNcbiIsCisJCSAgIHNiLT5leHBlY3RlZF9sY3Rfc2l6ZSk7CisKKwlzZXFfcHJpbnRmKHNlcSwgIklPUCBDYXBhYmlsaXRpZXNcbiIpOworCXNlcV9wcmludGYoc2VxLCAiICAgIENvbnRleHQgRmllbGQgU2l6ZSBTdXBwb3J0IDogIik7CisJc3dpdGNoIChzYi0+aW9wX2NhcGFiaWxpdGllcyAmIDB4MDAwMDAwMykgeworCWNhc2UgMDoKKwkJc2VxX3ByaW50ZihzZXEsICJTdXBwb3J0cyBvbmx5IDMyLWJpdCBjb250ZXh0IGZpZWxkc1xuIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2VxX3ByaW50ZihzZXEsICJTdXBwb3J0cyBvbmx5IDY0LWJpdCBjb250ZXh0IGZpZWxkc1xuIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc2VxX3ByaW50ZihzZXEsICJTdXBwb3J0cyAzMi1iaXQgYW5kIDY0LWJpdCBjb250ZXh0IGZpZWxkcywgIgorCQkJICAgImJ1dCBub3QgY29uY3VycmVudGx5XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIDMyLWJpdCBhbmQgNjQtYml0IGNvbnRleHQgZmllbGRzICIKKwkJCSAgICJjb25jdXJyZW50bHlcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKHNlcSwgIjB4JTA4eFxuIiwgc2ItPmlvcF9jYXBhYmlsaXRpZXMpOworCX0KKwlzZXFfcHJpbnRmKHNlcSwgIiAgICBDdXJyZW50IENvbnRleHQgRmllbGQgU2l6ZSA6ICIpOworCXN3aXRjaCAoc2ItPmlvcF9jYXBhYmlsaXRpZXMgJiAweDAwMDAwMDBDKSB7CisJY2FzZSAwOgorCQlzZXFfcHJpbnRmKHNlcSwgIm5vdCBjb25maWd1cmVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIG9ubHkgMzItYml0IGNvbnRleHQgZmllbGRzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlzZXFfcHJpbnRmKHNlcSwgIlN1cHBvcnRzIG9ubHkgNjQtYml0IGNvbnRleHQgZmllbGRzXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJc2VxX3ByaW50ZihzZXEsICJTdXBwb3J0cyBib3RoIDMyLWJpdCBvciA2NC1iaXQgY29udGV4dCBmaWVsZHMgIgorCQkJICAgImNvbmN1cnJlbnRseVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwl9CisJc2VxX3ByaW50ZihzZXEsICIgICAgSW5ib3VuZCBQZWVyIFN1cHBvcnQgICAgICAgOiAlc1xuIiwKKwkJICAgKHNiLT4KKwkJICAgIGlvcF9jYXBhYmlsaXRpZXMgJiAweDAwMDAwMDEwKSA/ICJTdXBwb3J0ZWQiIDoKKwkJICAgIk5vdCBzdXBwb3J0ZWQiKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICBPdXRib3VuZCBQZWVyIFN1cHBvcnQgICAgICA6ICVzXG4iLAorCQkgICAoc2ItPgorCQkgICAgaW9wX2NhcGFiaWxpdGllcyAmIDB4MDAwMDAwMjApID8gIlN1cHBvcnRlZCIgOgorCQkgICAiTm90IHN1cHBvcnRlZCIpOworCXNlcV9wcmludGYoc2VxLCAiICAgIFBlZXIgdG8gUGVlciBTdXBwb3J0ICAgICAgIDogJXNcbiIsCisJCSAgIChzYi0+CisJCSAgICBpb3BfY2FwYWJpbGl0aWVzICYgMHgwMDAwMDA0MCkgPyAiU3VwcG9ydGVkIiA6CisJCSAgICJOb3Qgc3VwcG9ydGVkIik7CisKKwlzZXFfcHJpbnRmKHNlcSwgIkRlc2lyZWQgcHJpdmF0ZSBtZW1vcnkgc2l6ZSAgIDogJWQga0JcbiIsCisJCSAgIHNiLT5kZXNpcmVkX21lbV9zaXplID4+IDEwKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkFsbG9jYXRlZCBwcml2YXRlIG1lbW9yeSBzaXplIDogJWQga0JcbiIsCisJCSAgIHNiLT5jdXJyZW50X21lbV9zaXplID4+IDEwKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlByaXZhdGUgbWVtb3J5IGJhc2UgYWRkcmVzcyAgIDogJTAjMTB4XG4iLAorCQkgICBzYi0+Y3VycmVudF9tZW1fYmFzZSk7CisJc2VxX3ByaW50ZihzZXEsICJEZXNpcmVkIHByaXZhdGUgSS9PIHNpemUgICAgICA6ICVkIGtCXG4iLAorCQkgICBzYi0+ZGVzaXJlZF9pb19zaXplID4+IDEwKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkFsbG9jYXRlZCBwcml2YXRlIEkvTyBzaXplICAgIDogJWQga0JcbiIsCisJCSAgIHNiLT5jdXJyZW50X2lvX3NpemUgPj4gMTApOworCXNlcV9wcmludGYoc2VxLCAiUHJpdmF0ZSBJL08gYmFzZSBhZGRyZXNzICAgICAgOiAlMCMxMHhcbiIsCisJCSAgIHNiLT5jdXJyZW50X2lvX2Jhc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2h3KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKilzZXEtPnByaXZhdGU7CisJc3RhdGljIHUzMiB3b3JrMzJbNV07CisJc3RhdGljIHU4ICp3b3JrOCA9ICh1OCAqKSB3b3JrMzI7CisJc3RhdGljIHUxNiAqd29yazE2ID0gKHUxNiAqKSB3b3JrMzI7CisJaW50IHRva2VuOworCXUzMiBod2NhcDsKKworCXN0YXRpYyBjaGFyICpjcHVfdGFibGVbXSA9IHsKKwkJIkludGVsIDgwOTYwIHNlcmllcyIsCisJCSJBTUQyOTAwIHNlcmllcyIsCisJCSJNb3Rvcm9sYSA2ODAwMCBzZXJpZXMiLAorCQkiQVJNIHNlcmllcyIsCisJCSJNSVBTIHNlcmllcyIsCisJCSJTcGFyYyBzZXJpZXMiLAorCQkiUG93ZXJQQyBzZXJpZXMiLAorCQkiSW50ZWwgeDg2IHNlcmllcyIKKwl9OworCisJdG9rZW4gPQorCSAgICBpMm9fcGFybV9maWVsZF9nZXQoYy0+ZXhlYywgMHgwMDAwLCAtMSwgJndvcmszMiwgc2l6ZW9mKHdvcmszMikpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHgwMDAwIElPUCBIYXJkd2FyZSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIkkyTyBWZW5kb3IgSUQgICAgOiAlMCM2eFxuIiwgd29yazE2WzBdKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlByb2R1Y3QgSUQgICAgICAgOiAlMCM2eFxuIiwgd29yazE2WzFdKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkNQVSAgICAgICAgICAgICAgOiAiKTsKKwlpZiAod29yazhbMTZdID4gOCkKKwkJc2VxX3ByaW50ZihzZXEsICJVbmtub3duXG4iKTsKKwllbHNlCisJCXNlcV9wcmludGYoc2VxLCAiJXNcbiIsIGNwdV90YWJsZVt3b3JrOFsxNl1dKTsKKwkvKiBBbnlvbmUgdXNpbmcgUHJvY2Vzc29yVmVyc2lvbj8gKi8KKworCXNlcV9wcmludGYoc2VxLCAiUkFNICAgICAgICAgICAgICA6ICVka0JcbiIsIHdvcmszMlsxXSA+PiAxMCk7CisJc2VxX3ByaW50ZihzZXEsICJOb24tVm9sYXRpbGUgTWVtIDogJWRrQlxuIiwgd29yazMyWzJdID4+IDEwKTsKKworCWh3Y2FwID0gd29yazMyWzNdOworCXNlcV9wcmludGYoc2VxLCAiQ2FwYWJpbGl0aWVzIDogMHglMDh4XG4iLCBod2NhcCk7CisJc2VxX3ByaW50ZihzZXEsICIgICBbJXNdIFNlbGYgYm9vdGluZ1xuIiwKKwkJICAgKGh3Y2FwICYgMHgwMDAwMDAwMSkgPyAiKyIgOiAiLSIpOworCXNlcV9wcmludGYoc2VxLCAiICAgWyVzXSBVcGdyYWRhYmxlIElSVE9TXG4iLAorCQkgICAoaHdjYXAgJiAweDAwMDAwMDAyKSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsICIgICBbJXNdIFN1cHBvcnRzIGRvd25sb2FkaW5nIERETXNcbiIsCisJCSAgIChod2NhcCAmIDB4MDAwMDAwMDQpID8gIisiIDogIi0iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgIFslc10gU3VwcG9ydHMgaW5zdGFsbGluZyBERE1zXG4iLAorCQkgICAoaHdjYXAgJiAweDAwMDAwMDA4KSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsICIgICBbJXNdIEJhdHRlcnktYmFja2VkIFJBTVxuIiwKKwkJICAgKGh3Y2FwICYgMHgwMDAwMDAxMCkgPyAiKyIgOiAiLSIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEV4ZWN1dGl2ZSBncm91cCAwMDAzaCAtIEV4ZWN1dGluZyBERE0gTGlzdCAodGFibGUpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19kZG1fdGFibGUoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgdG9rZW47CisJaW50IGk7CisKKwl0eXBlZGVmIHN0cnVjdCBfaTJvX2V4ZWNfZXhlY3V0ZV9kZG1fdGFibGUgeworCQl1MTYgZGRtX3RpZDsKKwkJdTggbW9kdWxlX3R5cGU7CisJCXU4IHJlc2VydmVkOworCQl1MTYgaTJvX3ZlbmRvcl9pZDsKKwkJdTE2IG1vZHVsZV9pZDsKKwkJdTggbW9kdWxlX25hbWVfdmVyc2lvblsyOF07CisJCXUzMiBkYXRhX3NpemU7CisJCXUzMiBjb2RlX3NpemU7CisJfSBpMm9fZXhlY19leGVjdXRlX2RkbV90YWJsZTsKKworCXN0cnVjdCB7CisJCXUxNiByZXN1bHRfY291bnQ7CisJCXUxNiBwYWQ7CisJCXUxNiBibG9ja19zaXplOworCQl1OCBibG9ja19zdGF0dXM7CisJCXU4IGVycm9yX2luZm9fc2l6ZTsKKwkJdTE2IHJvd19jb3VudDsKKwkJdTE2IG1vcmVfZmxhZzsKKwkJaTJvX2V4ZWNfZXhlY3V0ZV9kZG1fdGFibGUgZGRtX3RhYmxlW0kyT19NQVhfTU9EVUxFU107CisJfSAqcmVzdWx0OworCisJaTJvX2V4ZWNfZXhlY3V0ZV9kZG1fdGFibGUgZGRtX3RhYmxlOworCisJcmVzdWx0ID0ga21hbGxvYyhzaXplb2YoKnJlc3VsdCksIEdGUF9LRVJORUwpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRva2VuID0gaTJvX3Bhcm1fdGFibGVfZ2V0KGMtPmV4ZWMsIEkyT19QQVJBTVNfVEFCTEVfR0VULCAweDAwMDMsIC0xLAorCQkJCSAgIE5VTEwsIDAsIHJlc3VsdCwgc2l6ZW9mKCpyZXN1bHQpKTsKKworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwKKwkJCQkJIjB4MDAwMyBFeGVjdXRpbmcgRERNIExpc3QiKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2VxX3ByaW50ZihzZXEsCisJCSAgICJUaWQgICBNb2R1bGVfdHlwZSAgICAgVmVuZG9yIE1vZF9pZCAgTW9kdWxlX25hbWUgICAgICAgICAgICAgVnJzICBEYXRhX3NpemUgQ29kZV9zaXplXG4iKTsKKwlkZG1fdGFibGUgPSByZXN1bHQtPmRkbV90YWJsZVswXTsKKworCWZvciAoaSA9IDA7IGkgPCByZXN1bHQtPnJvd19jb3VudDsgZGRtX3RhYmxlID0gcmVzdWx0LT5kZG1fdGFibGVbKytpXSkgeworCQlzZXFfcHJpbnRmKHNlcSwgIjB4JTAzeCAiLCBkZG1fdGFibGUuZGRtX3RpZCAmIDB4RkZGKTsKKworCQlzd2l0Y2ggKGRkbV90YWJsZS5tb2R1bGVfdHlwZSkgeworCQljYXNlIDB4MDE6CisJCQlzZXFfcHJpbnRmKHNlcSwgIkRvd25sb2FkZWQgRERNICAiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MjI6CisJCQlzZXFfcHJpbnRmKHNlcSwgIkVtYmVkZGVkIERETSAgICAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc2VxX3ByaW50ZihzZXEsICIgICAgICAgICAgICAgICAgIik7CisJCX0KKworCQlzZXFfcHJpbnRmKHNlcSwgIiUtIzd4IiwgZGRtX3RhYmxlLmkyb192ZW5kb3JfaWQpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtIzh4IiwgZGRtX3RhYmxlLm1vZHVsZV9pZCk7CisJCXNlcV9wcmludGYoc2VxLCAiJS0yOXMiLAorCQkJICAgY2h0b3N0cihkZG1fdGFibGUubW9kdWxlX25hbWVfdmVyc2lvbiwgMjgpKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlOWQgICIsIGRkbV90YWJsZS5kYXRhX3NpemUpOworCQlzZXFfcHJpbnRmKHNlcSwgIiU4ZCIsIGRkbV90YWJsZS5jb2RlX3NpemUpOworCisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKwl9CisgICAgICBvdXQ6CisJa2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworLyogRXhlY3V0aXZlIGdyb3VwIDAwMDRoIC0gRHJpdmVyIFN0b3JlIChzY2FsYXIpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19kcml2ZXJfc3RvcmUoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKKwl1MzIgd29yazMyWzhdOworCWludCB0b2tlbjsKKworCXRva2VuID0KKwkgICAgaTJvX3Bhcm1fZmllbGRfZ2V0KGMtPmV4ZWMsIDB4MDAwNCwgLTEsICZ3b3JrMzIsIHNpemVvZih3b3JrMzIpKTsKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sICIweDAwMDQgRHJpdmVyIFN0b3JlIik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiTW9kdWxlIGxpbWl0ICA6ICVkXG4iCisJCSAgICJNb2R1bGUgY291bnQgIDogJWRcbiIKKwkJICAgIkN1cnJlbnQgc3BhY2UgOiAlZCBrQlxuIgorCQkgICAiRnJlZSBzcGFjZSAgICA6ICVkIGtCXG4iLAorCQkgICB3b3JrMzJbMF0sIHdvcmszMlsxXSwgd29yazMyWzJdID4+IDEwLCB3b3JrMzJbM10gPj4gMTApOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEV4ZWN1dGl2ZSBncm91cCAwMDA1aCAtIERyaXZlciBTdG9yZSBUYWJsZSAodGFibGUpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19kcml2ZXJzX3N0b3JlZChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwl0eXBlZGVmIHN0cnVjdCBfaTJvX2RyaXZlcl9zdG9yZSB7CisJCXUxNiBzdG9yZWRfZGRtX2luZGV4OworCQl1OCBtb2R1bGVfdHlwZTsKKwkJdTggcmVzZXJ2ZWQ7CisJCXUxNiBpMm9fdmVuZG9yX2lkOworCQl1MTYgbW9kdWxlX2lkOworCQl1OCBtb2R1bGVfbmFtZV92ZXJzaW9uWzI4XTsKKwkJdTggZGF0ZVs4XTsKKwkJdTMyIG1vZHVsZV9zaXplOworCQl1MzIgbXBiX3NpemU7CisJCXUzMiBtb2R1bGVfZmxhZ3M7CisJfSBpMm9fZHJpdmVyX3N0b3JlX3RhYmxlOworCisJc3RydWN0IGkyb19jb250cm9sbGVyICpjID0gKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgdG9rZW47CisJaW50IGk7CisKKwl0eXBlZGVmIHN0cnVjdCB7CisJCXUxNiByZXN1bHRfY291bnQ7CisJCXUxNiBwYWQ7CisJCXUxNiBibG9ja19zaXplOworCQl1OCBibG9ja19zdGF0dXM7CisJCXU4IGVycm9yX2luZm9fc2l6ZTsKKwkJdTE2IHJvd19jb3VudDsKKwkJdTE2IG1vcmVfZmxhZzsKKwkJaTJvX2RyaXZlcl9zdG9yZV90YWJsZSBkc3RbSTJPX01BWF9NT0RVTEVTXTsKKwl9IGkyb19kcml2ZXJfcmVzdWx0X3RhYmxlOworCisJaTJvX2RyaXZlcl9yZXN1bHRfdGFibGUgKnJlc3VsdDsKKwlpMm9fZHJpdmVyX3N0b3JlX3RhYmxlICpkc3Q7CisKKwlyZXN1bHQgPSBrbWFsbG9jKHNpemVvZihpMm9fZHJpdmVyX3Jlc3VsdF90YWJsZSksIEdGUF9LRVJORUwpOworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChjLT5leGVjLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHgwMDA1LCAtMSwKKwkJCQkgICBOVUxMLCAwLCByZXN1bHQsIHNpemVvZigqcmVzdWx0KSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sCisJCQkJCSIweDAwMDUgRFJJVkVSIFNUT1JFIFRBQkxFIik7CisJCWtmcmVlKHJlc3VsdCk7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLAorCQkgICAiIyAgTW9kdWxlX3R5cGUgICAgIFZlbmRvciBNb2RfaWQgIE1vZHVsZV9uYW1lICAgICAgICAgICAgIFZycyIKKwkJICAgIkRhdGUgICAgIE1vZF9zaXplIFBhcl9zaXplIEZsYWdzXG4iKTsKKwlmb3IgKGkgPSAwLCBkc3QgPSAmcmVzdWx0LT5kc3RbMF07IGkgPCByZXN1bHQtPnJvd19jb3VudDsKKwkgICAgIGRzdCA9ICZyZXN1bHQtPmRzdFsrK2ldKSB7CisJCXNlcV9wcmludGYoc2VxLCAiJS0zZCIsIGRzdC0+c3RvcmVkX2RkbV9pbmRleCk7CisJCXN3aXRjaCAoZHN0LT5tb2R1bGVfdHlwZSkgeworCQljYXNlIDB4MDE6CisJCQlzZXFfcHJpbnRmKHNlcSwgIkRvd25sb2FkZWQgRERNICAiKTsKKwkJCWJyZWFrOworCQljYXNlIDB4MjI6CisJCQlzZXFfcHJpbnRmKHNlcSwgIkVtYmVkZGVkIERETSAgICAiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc2VxX3ByaW50ZihzZXEsICIgICAgICAgICAgICAgICAgIik7CisJCX0KKworCQlzZXFfcHJpbnRmKHNlcSwgIiUtIzd4IiwgZHN0LT5pMm9fdmVuZG9yX2lkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLSM4eCIsIGRzdC0+bW9kdWxlX2lkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTI5cyIsIGNodG9zdHIoZHN0LT5tb2R1bGVfbmFtZV92ZXJzaW9uLCAyOCkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUtOXMiLCBjaHRvc3RyKGRzdC0+ZGF0ZSwgOCkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiU4ZCAiLCBkc3QtPm1vZHVsZV9zaXplKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlOGQgIiwgZHN0LT5tcGJfc2l6ZSk7CisJCXNlcV9wcmludGYoc2VxLCAiMHglMDR4IiwgZHN0LT5tb2R1bGVfZmxhZ3MpOworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJfQorCisJa2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMDAwaCAtIFBhcmFtcyBEZXNjcmlwdG9yICh0YWJsZSkgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2dyb3VwcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgdG9rZW47CisJaW50IGk7CisJdTggcHJvcGVydGllczsKKworCXR5cGVkZWYgc3RydWN0IF9pMm9fZ3JvdXBfaW5mbyB7CisJCXUxNiBncm91cF9udW1iZXI7CisJCXUxNiBmaWVsZF9jb3VudDsKKwkJdTE2IHJvd19jb3VudDsKKwkJdTggcHJvcGVydGllczsKKwkJdTggcmVzZXJ2ZWQ7CisJfSBpMm9fZ3JvdXBfaW5mbzsKKworCXN0cnVjdCB7CisJCXUxNiByZXN1bHRfY291bnQ7CisJCXUxNiBwYWQ7CisJCXUxNiBibG9ja19zaXplOworCQl1OCBibG9ja19zdGF0dXM7CisJCXU4IGVycm9yX2luZm9fc2l6ZTsKKwkJdTE2IHJvd19jb3VudDsKKwkJdTE2IG1vcmVfZmxhZzsKKwkJaTJvX2dyb3VwX2luZm8gZ3JvdXBbMjU2XTsKKwl9ICpyZXN1bHQ7CisKKwlyZXN1bHQgPSBrbWFsbG9jKHNpemVvZigqcmVzdWx0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRU5PTUVNOworCisJdG9rZW4gPSBpMm9fcGFybV90YWJsZV9nZXQoZCwgSTJPX1BBUkFNU19UQUJMRV9HRVQsIDB4RjAwMCwgLTEsIE5VTEwsIDAsCisJCQkJICAgcmVzdWx0LCBzaXplb2YoKnJlc3VsdCkpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHhGMDAwIFBhcmFtcyBEZXNjcmlwdG9yIik7CisJCWdvdG8gb3V0OworCX0KKworCXNlcV9wcmludGYoc2VxLAorCQkgICAiIyAgR3JvdXAgICBGaWVsZENvdW50IFJvd0NvdW50IFR5cGUgICBBZGQgRGVsIENsZWFyXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXN1bHQtPnJvd19jb3VudDsgaSsrKSB7CisJCXNlcV9wcmludGYoc2VxLCAiJS0zZCIsIGkpOworCQlzZXFfcHJpbnRmKHNlcSwgIjB4JTA0WCAiLCByZXN1bHQtPmdyb3VwW2ldLmdyb3VwX251bWJlcik7CisJCXNlcV9wcmludGYoc2VxLCAiJTEwZCAiLCByZXN1bHQtPmdyb3VwW2ldLmZpZWxkX2NvdW50KTsKKwkJc2VxX3ByaW50ZihzZXEsICIlOGQgIiwgcmVzdWx0LT5ncm91cFtpXS5yb3dfY291bnQpOworCisJCXByb3BlcnRpZXMgPSByZXN1bHQtPmdyb3VwW2ldLnByb3BlcnRpZXM7CisJCWlmIChwcm9wZXJ0aWVzICYgMHgxKQorCQkJc2VxX3ByaW50ZihzZXEsICJUYWJsZSAgIik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiU2NhbGFyICIpOworCQlpZiAocHJvcGVydGllcyAmIDB4MikKKwkJCXNlcV9wcmludGYoc2VxLCAiICsgIik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiIC0gIik7CisJCWlmIChwcm9wZXJ0aWVzICYgMHg0KQorCQkJc2VxX3ByaW50ZihzZXEsICIgICsgIik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiICAtICIpOworCQlpZiAocHJvcGVydGllcyAmIDB4OCkKKwkJCXNlcV9wcmludGYoc2VxLCAiICArICIpOworCQllbHNlCisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgLSAiKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJfQorCisJaWYgKHJlc3VsdC0+bW9yZV9mbGFnKQorCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJlIGlzIG1vcmUuLi5cbiIpOworICAgICAgb3V0OgorCWtmcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgZ3JvdXAgRjAwMWggLSBQaHlzaWNhbCBEZXZpY2UgVGFibGUgKHRhYmxlKSAqLworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfcGh5c19kZXZpY2Uoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmQgPSAoc3RydWN0IGkyb19kZXZpY2UgKilzZXEtPnByaXZhdGU7CisJaW50IHRva2VuOworCWludCBpOworCisJc3RydWN0IHsKKwkJdTE2IHJlc3VsdF9jb3VudDsKKwkJdTE2IHBhZDsKKwkJdTE2IGJsb2NrX3NpemU7CisJCXU4IGJsb2NrX3N0YXR1czsKKwkJdTggZXJyb3JfaW5mb19zaXplOworCQl1MTYgcm93X2NvdW50OworCQl1MTYgbW9yZV9mbGFnOworCQl1MzIgYWRhcHRlcl9pZFs2NF07CisJfSByZXN1bHQ7CisKKwl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChkLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHhGMDAxLCAtMSwgTlVMTCwgMCwKKwkJCQkgICAmcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sCisJCQkJCSIweEYwMDEgUGh5c2ljYWwgRGV2aWNlIFRhYmxlIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXN1bHQucm93X2NvdW50KQorCQlzZXFfcHJpbnRmKHNlcSwgIiMgIEFkYXB0ZXJJZFxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LnJvd19jb3VudDsgaSsrKSB7CisJCXNlcV9wcmludGYoc2VxLCAiJS0yZCIsIGkpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUjN3hcbiIsIHJlc3VsdC5hZGFwdGVyX2lkW2ldKTsKKwl9CisKKwlpZiAocmVzdWx0Lm1vcmVfZmxhZykKKwkJc2VxX3ByaW50ZihzZXEsICJUaGVyZSBpcyBtb3JlLi4uXG4iKTsKKworCXJldHVybiAwOworfQorCisvKiBHZW5lcmljIGdyb3VwIEYwMDJoIC0gQ2xhaW1lZCBUYWJsZSAodGFibGUpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19jbGFpbWVkKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKwlpbnQgaTsKKworCXN0cnVjdCB7CisJCXUxNiByZXN1bHRfY291bnQ7CisJCXUxNiBwYWQ7CisJCXUxNiBibG9ja19zaXplOworCQl1OCBibG9ja19zdGF0dXM7CisJCXU4IGVycm9yX2luZm9fc2l6ZTsKKwkJdTE2IHJvd19jb3VudDsKKwkJdTE2IG1vcmVfZmxhZzsKKwkJdTE2IGNsYWltZWRfdGlkWzY0XTsKKwl9IHJlc3VsdDsKKworCXRva2VuID0gaTJvX3Bhcm1fdGFibGVfZ2V0KGQsIEkyT19QQVJBTVNfVEFCTEVfR0VULCAweEYwMDIsIC0xLCBOVUxMLCAwLAorCQkJCSAgICZyZXN1bHQsIHNpemVvZihyZXN1bHQpKTsKKworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwgIjB4RjAwMiBDbGFpbWVkIFRhYmxlIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChyZXN1bHQucm93X2NvdW50KQorCQlzZXFfcHJpbnRmKHNlcSwgIiMgIENsYWltZWRUaWRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHJlc3VsdC5yb3dfY291bnQ7IGkrKykgeworCQlzZXFfcHJpbnRmKHNlcSwgIiUtMmQiLCBpKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlIzd4XG4iLCByZXN1bHQuY2xhaW1lZF90aWRbaV0pOworCX0KKworCWlmIChyZXN1bHQubW9yZV9mbGFnKQorCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJlIGlzIG1vcmUuLi5cbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgZ3JvdXAgRjAwM2ggLSBVc2VyIFRhYmxlICh0YWJsZSkgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X3VzZXJzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKwlpbnQgaTsKKworCXR5cGVkZWYgc3RydWN0IF9pMm9fdXNlcl90YWJsZSB7CisJCXUxNiBpbnN0YW5jZTsKKwkJdTE2IHVzZXJfdGlkOworCQl1OCBjbGFpbV90eXBlOworCQl1OCByZXNlcnZlZDE7CisJCXUxNiByZXNlcnZlZDI7CisJfSBpMm9fdXNlcl90YWJsZTsKKworCXN0cnVjdCB7CisJCXUxNiByZXN1bHRfY291bnQ7CisJCXUxNiBwYWQ7CisJCXUxNiBibG9ja19zaXplOworCQl1OCBibG9ja19zdGF0dXM7CisJCXU4IGVycm9yX2luZm9fc2l6ZTsKKwkJdTE2IHJvd19jb3VudDsKKwkJdTE2IG1vcmVfZmxhZzsKKwkJaTJvX3VzZXJfdGFibGUgdXNlcls2NF07CisJfSAqcmVzdWx0OworCisJcmVzdWx0ID0ga21hbGxvYyhzaXplb2YoKnJlc3VsdCksIEdGUF9LRVJORUwpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRva2VuID0gaTJvX3Bhcm1fdGFibGVfZ2V0KGQsIEkyT19QQVJBTVNfVEFCTEVfR0VULCAweEYwMDMsIC0xLCBOVUxMLCAwLAorCQkJCSAgIHJlc3VsdCwgc2l6ZW9mKCpyZXN1bHQpKTsKKworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwgIjB4RjAwMyBVc2VyIFRhYmxlIik7CisJCWdvdG8gb3V0OworCX0KKworCXNlcV9wcmludGYoc2VxLCAiIyAgSW5zdGFuY2UgVXNlclRpZCBDbGFpbVR5cGVcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHJlc3VsdC0+cm93X2NvdW50OyBpKyspIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTNkIiwgaSk7CisJCXNlcV9wcmludGYoc2VxLCAiJSM4eCAiLCByZXN1bHQtPnVzZXJbaV0uaW5zdGFuY2UpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUjN3ggIiwgcmVzdWx0LT51c2VyW2ldLnVzZXJfdGlkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlIzl4XG4iLCByZXN1bHQtPnVzZXJbaV0uY2xhaW1fdHlwZSk7CisJfQorCisJaWYgKHJlc3VsdC0+bW9yZV9mbGFnKQorCQlzZXFfcHJpbnRmKHNlcSwgIlRoZXJlIGlzIG1vcmUuLi5cbiIpOworICAgICAgb3V0OgorCWtmcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgZ3JvdXAgRjAwNWggLSBQcml2YXRlIG1lc3NhZ2UgZXh0ZW5zaW9ucyAodGFibGUpIChvcHRpb25hbCkgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X3ByaXZfbXNncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgdG9rZW47CisJaW50IGk7CisKKwl0eXBlZGVmIHN0cnVjdCBfaTJvX3ByaXZhdGUgeworCQl1MTYgZXh0X2luc3RhbmNlOworCQl1MTYgb3JnYW5pemF0aW9uX2lkOworCQl1MTYgeF9mdW5jdGlvbl9jb2RlOworCX0gaTJvX3ByaXZhdGU7CisKKwlzdHJ1Y3QgeworCQl1MTYgcmVzdWx0X2NvdW50OworCQl1MTYgcGFkOworCQl1MTYgYmxvY2tfc2l6ZTsKKwkJdTggYmxvY2tfc3RhdHVzOworCQl1OCBlcnJvcl9pbmZvX3NpemU7CisJCXUxNiByb3dfY291bnQ7CisJCXUxNiBtb3JlX2ZsYWc7CisJCWkyb19wcml2YXRlIGV4dGVuc2lvbls2NF07CisJfSByZXN1bHQ7CisKKwl0b2tlbiA9IGkyb19wYXJtX3RhYmxlX2dldChkLCBJMk9fUEFSQU1TX1RBQkxFX0dFVCwgMHhGMDAwLCAtMSwgTlVMTCwgMCwKKwkJCQkgICAmcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sCisJCQkJCSIweEYwMDUgUHJpdmF0ZSBNZXNzYWdlIEV4dGVuc2lvbnMgKG9wdGlvbmFsKSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIkluc3RhbmNlIyAgT3JnSWQgIEZ1bmN0aW9uQ29kZVxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmVzdWx0LnJvd19jb3VudDsgaSsrKSB7CisJCXNlcV9wcmludGYoc2VxLCAiJTAjOXggIiwgcmVzdWx0LmV4dGVuc2lvbltpXS5leHRfaW5zdGFuY2UpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUwIzZ4ICIsIHJlc3VsdC5leHRlbnNpb25baV0ub3JnYW5pemF0aW9uX2lkKTsKKwkJc2VxX3ByaW50ZihzZXEsICIlMCM2eCIsIHJlc3VsdC5leHRlbnNpb25baV0ueF9mdW5jdGlvbl9jb2RlKTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7CisJfQorCisJaWYgKHJlc3VsdC5tb3JlX2ZsYWcpCisJCXNlcV9wcmludGYoc2VxLCAiVGhlcmUgaXMgbW9yZS4uLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMDA2aCAtIEF1dGhvcml6ZWQgVXNlciBUYWJsZSAodGFibGUpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19hdXRob3JpemVkX3VzZXJzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCWludCB0b2tlbjsKKwlpbnQgaTsKKworCXN0cnVjdCB7CisJCXUxNiByZXN1bHRfY291bnQ7CisJCXUxNiBwYWQ7CisJCXUxNiBibG9ja19zaXplOworCQl1OCBibG9ja19zdGF0dXM7CisJCXU4IGVycm9yX2luZm9fc2l6ZTsKKwkJdTE2IHJvd19jb3VudDsKKwkJdTE2IG1vcmVfZmxhZzsKKwkJdTMyIGFsdGVybmF0ZV90aWRbNjRdOworCX0gcmVzdWx0OworCisJdG9rZW4gPSBpMm9fcGFybV90YWJsZV9nZXQoZCwgSTJPX1BBUkFNU19UQUJMRV9HRVQsIDB4RjAwNiwgLTEsIE5VTEwsIDAsCisJCQkJICAgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLAorCQkJCQkiMHhGMDA2IEF1dG9ob3JpemVkIFVzZXIgVGFibGUiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJlc3VsdC5yb3dfY291bnQpCisJCXNlcV9wcmludGYoc2VxLCAiIyAgQWx0ZXJuYXRlVGlkXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCByZXN1bHQucm93X2NvdW50OyBpKyspIHsKKwkJc2VxX3ByaW50ZihzZXEsICIlLTJkIiwgaSk7CisJCXNlcV9wcmludGYoc2VxLCAiJSM3eCAiLCByZXN1bHQuYWx0ZXJuYXRlX3RpZFtpXSk7CisJfQorCisJaWYgKHJlc3VsdC5tb3JlX2ZsYWcpCisJCXNlcV9wcmludGYoc2VxLCAiVGhlcmUgaXMgbW9yZS4uLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyBncm91cCBGMTAwaCAtIERldmljZSBJZGVudGl0eSAoc2NhbGFyKSAqLworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfZGV2X2lkZW50aXR5KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICpkID0gKHN0cnVjdCBpMm9fZGV2aWNlICopc2VxLT5wcml2YXRlOworCXN0YXRpYyB1MzIgd29yazMyWzEyOF07CS8vIGFsbG93IGZvciAic3R1ZmYiICsgdXAgdG8gMjU2IGJ5dGUgKG1heCkgc2VyaWFsIG51bWJlcgorCS8vID09IChhbGxvdykgNTEyZCBieXRlcyAobWF4KQorCXN0YXRpYyB1MTYgKndvcmsxNiA9ICh1MTYgKikgd29yazMyOworCWludCB0b2tlbjsKKworCXRva2VuID0gaTJvX3Bhcm1fZmllbGRfZ2V0KGQsIDB4RjEwMCwgLTEsICZ3b3JrMzIsIHNpemVvZih3b3JrMzIpKTsKKworCWlmICh0b2tlbiA8IDApIHsKKwkJaTJvX3JlcG9ydF9xdWVyeV9zdGF0dXMoc2VxLCB0b2tlbiwgIjB4RjEwMCBEZXZpY2UgSWRlbnRpdHkiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJEZXZpY2UgQ2xhc3MgIDogJXNcbiIsIGkyb19nZXRfY2xhc3NfbmFtZSh3b3JrMTZbMF0pKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk93bmVyIFRJRCAgICAgOiAlMCM1eFxuIiwgd29yazE2WzJdKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlBhcmVudCBUSUQgICAgOiAlMCM1eFxuIiwgd29yazE2WzNdKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlZlbmRvciBpbmZvICAgOiAlc1xuIiwKKwkJICAgY2h0b3N0cigodTggKikgKHdvcmszMiArIDIpLCAxNikpOworCXNlcV9wcmludGYoc2VxLCAiUHJvZHVjdCBpbmZvICA6ICVzXG4iLAorCQkgICBjaHRvc3RyKCh1OCAqKSAod29yazMyICsgNiksIDE2KSk7CisJc2VxX3ByaW50ZihzZXEsICJEZXNjcmlwdGlvbiAgIDogJXNcbiIsCisJCSAgIGNodG9zdHIoKHU4ICopICh3b3JrMzIgKyAxMCksIDE2KSk7CisJc2VxX3ByaW50ZihzZXEsICJQcm9kdWN0IHJldi4gIDogJXNcbiIsCisJCSAgIGNodG9zdHIoKHU4ICopICh3b3JrMzIgKyAxNCksIDgpKTsKKworCXNlcV9wcmludGYoc2VxLCAiU2VyaWFsIG51bWJlciA6ICIpOworCXByaW50X3NlcmlhbF9udW1iZXIoc2VxLCAodTggKikgKHdvcmszMiArIDE2KSwKKwkJCSAgICAvKiBhbGxvdyBmb3IgU05MZW4gcGx1cworCQkJICAgICAqIHBvc3NpYmxlIHRyYWlsaW5nICdcMCcKKwkJCSAgICAgKi8KKwkJCSAgICBzaXplb2Yod29yazMyKSAtICgxNiAqIHNpemVvZih1MzIpKSAtIDIpOworCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd19kZXZfbmFtZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKworCXNlcV9wcmludGYoc2VxLCAiJXNcbiIsIGQtPmRldmljZS5idXNfaWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgZ3JvdXAgRjEwMWggLSBERE0gSWRlbnRpdHkgKHNjYWxhcikgKi8KK3N0YXRpYyBpbnQgaTJvX3NlcV9zaG93X2RkbV9pZGVudGl0eShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgdG9rZW47CisKKwlzdHJ1Y3QgeworCQl1MTYgZGRtX3RpZDsKKwkJdTggbW9kdWxlX25hbWVbMjRdOworCQl1OCBtb2R1bGVfcmV2WzhdOworCQl1OCBzbl9mb3JtYXQ7CisJCXU4IHNlcmlhbF9udW1iZXJbMTJdOworCQl1OCBwYWRbMjU2XTsJLy8gYWxsb3cgdXAgdG8gMjU2IGJ5dGUgKG1heCkgc2VyaWFsIG51bWJlcgorCX0gcmVzdWx0OworCisJdG9rZW4gPSBpMm9fcGFybV9maWVsZF9nZXQoZCwgMHhGMTAxLCAtMSwgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHhGMTAxIERETSBJZGVudGl0eSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIlJlZ2lzdGVyaW5nIERETSBUSUQgOiAweCUwM3hcbiIsIHJlc3VsdC5kZG1fdGlkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1vZHVsZSBuYW1lICAgICAgICAgOiAlc1xuIiwKKwkJICAgY2h0b3N0cihyZXN1bHQubW9kdWxlX25hbWUsIDI0KSk7CisJc2VxX3ByaW50ZihzZXEsICJNb2R1bGUgcmV2aXNpb24gICAgIDogJXNcbiIsCisJCSAgIGNodG9zdHIocmVzdWx0Lm1vZHVsZV9yZXYsIDgpKTsKKworCXNlcV9wcmludGYoc2VxLCAiU2VyaWFsIG51bWJlciAgICAgICA6ICIpOworCXByaW50X3NlcmlhbF9udW1iZXIoc2VxLCByZXN1bHQuc2VyaWFsX251bWJlciwgc2l6ZW9mKHJlc3VsdCkgLSAzNik7CisJLyogYWxsb3cgZm9yIFNOTGVuIHBsdXMgcG9zc2libGUgdHJhaWxpbmcgJ1wwJyAqLworCisJc2VxX3ByaW50ZihzZXEsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgZ3JvdXAgRjEwMmggLSBVc2VyIEluZm9ybWF0aW9uIChzY2FsYXIpICovCitzdGF0aWMgaW50IGkyb19zZXFfc2hvd191aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgdG9rZW47CisKKwlzdHJ1Y3QgeworCQl1OCBkZXZpY2VfbmFtZVs2NF07CisJCXU4IHNlcnZpY2VfbmFtZVs2NF07CisJCXU4IHBoeXNpY2FsX2xvY2F0aW9uWzY0XTsKKwkJdTggaW5zdGFuY2VfbnVtYmVyWzRdOworCX0gcmVzdWx0OworCisJdG9rZW4gPSBpMm9fcGFybV9maWVsZF9nZXQoZCwgMHhGMTAyLCAtMSwgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCkpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLCAiMHhGMTAyIFVzZXIgSW5mb3JtYXRpb24iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJEZXZpY2UgbmFtZSAgICAgOiAlc1xuIiwKKwkJICAgY2h0b3N0cihyZXN1bHQuZGV2aWNlX25hbWUsIDY0KSk7CisJc2VxX3ByaW50ZihzZXEsICJTZXJ2aWNlIG5hbWUgICAgOiAlc1xuIiwKKwkJICAgY2h0b3N0cihyZXN1bHQuc2VydmljZV9uYW1lLCA2NCkpOworCXNlcV9wcmludGYoc2VxLCAiUGh5c2ljYWwgbmFtZSAgIDogJXNcbiIsCisJCSAgIGNodG9zdHIocmVzdWx0LnBoeXNpY2FsX2xvY2F0aW9uLCA2NCkpOworCXNlcV9wcmludGYoc2VxLCAiSW5zdGFuY2UgbnVtYmVyIDogJXNcbiIsCisJCSAgIGNodG9zdHIocmVzdWx0Lmluc3RhbmNlX251bWJlciwgNCkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgZ3JvdXAgRjEwM2ggLSBTR0wgT3BlcmF0aW5nIExpbWl0cyAoc2NhbGFyKSAqLworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfc2dsX2xpbWl0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwlzdGF0aWMgdTMyIHdvcmszMlsxMl07CisJc3RhdGljIHUxNiAqd29yazE2ID0gKHUxNiAqKSB3b3JrMzI7CisJc3RhdGljIHU4ICp3b3JrOCA9ICh1OCAqKSB3b3JrMzI7CisJaW50IHRva2VuOworCisJdG9rZW4gPSBpMm9fcGFybV9maWVsZF9nZXQoZCwgMHhGMTAzLCAtMSwgJndvcmszMiwgc2l6ZW9mKHdvcmszMikpOworCisJaWYgKHRva2VuIDwgMCkgeworCQlpMm9fcmVwb3J0X3F1ZXJ5X3N0YXR1cyhzZXEsIHRva2VuLAorCQkJCQkiMHhGMTAzIFNHTCBPcGVyYXRpbmcgTGltaXRzIik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiU0dMIGNoYWluIHNpemUgICAgICAgIDogJWRcbiIsIHdvcmszMlswXSk7CisJc2VxX3ByaW50ZihzZXEsICJNYXggU0dMIGNoYWluIHNpemUgICAgOiAlZFxuIiwgd29yazMyWzFdKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNHTCBjaGFpbiBzaXplIHRhcmdldCA6ICVkXG4iLCB3b3JrMzJbMl0pOworCXNlcV9wcmludGYoc2VxLCAiU0dMIGZyYWcgY291bnQgICAgICAgIDogJWRcbiIsIHdvcmsxNls2XSk7CisJc2VxX3ByaW50ZihzZXEsICJNYXggU0dMIGZyYWcgY291bnQgICAgOiAlZFxuIiwgd29yazE2WzddKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNHTCBmcmFnIGNvdW50IHRhcmdldCA6ICVkXG4iLCB3b3JrMTZbOF0pOworCisvKiBGSVhNRQorCWlmIChkLT5pMm92ZXJzaW9uID09IDB4MDIpCisJeworKi8KKwlzZXFfcHJpbnRmKHNlcSwgIlNHTCBkYXRhIGFsaWdubWVudCAgICA6ICVkXG4iLCB3b3JrMTZbOF0pOworCXNlcV9wcmludGYoc2VxLCAiU0dMIGFkZHIgbGltaXQgICAgICAgIDogJWRcbiIsIHdvcms4WzIwXSk7CisJc2VxX3ByaW50ZihzZXEsICJTR0wgYWRkciBzaXplcyBzdXBwb3J0ZWQgOiAiKTsKKwlpZiAod29yazhbMjFdICYgMHgwMSkKKwkJc2VxX3ByaW50ZihzZXEsICIzMiBiaXQgIik7CisJaWYgKHdvcms4WzIxXSAmIDB4MDIpCisJCXNlcV9wcmludGYoc2VxLCAiNjQgYml0ICIpOworCWlmICh3b3JrOFsyMV0gJiAweDA0KQorCQlzZXFfcHJpbnRmKHNlcSwgIjk2IGJpdCAiKTsKKwlpZiAod29yazhbMjFdICYgMHgwOCkKKwkJc2VxX3ByaW50ZihzZXEsICIxMjggYml0ICIpOworCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKy8qCisJfQorKi8KKworCXJldHVybiAwOworfQorCisvKiBHZW5lcmljIGdyb3VwIEYyMDBoIC0gU2Vuc29ycyAoc2NhbGFyKSAqLworc3RhdGljIGludCBpMm9fc2VxX3Nob3dfc2Vuc29ycyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqZCA9IChzdHJ1Y3QgaTJvX2RldmljZSAqKXNlcS0+cHJpdmF0ZTsKKwlpbnQgdG9rZW47CisKKwlzdHJ1Y3QgeworCQl1MTYgc2Vuc29yX2luc3RhbmNlOworCQl1OCBjb21wb25lbnQ7CisJCXUxNiBjb21wb25lbnRfaW5zdGFuY2U7CisJCXU4IHNlbnNvcl9jbGFzczsKKwkJdTggc2Vuc29yX3R5cGU7CisJCXU4IHNjYWxpbmdfZXhwb25lbnQ7CisJCXUzMiBhY3R1YWxfcmVhZGluZzsKKwkJdTMyIG1pbmltdW1fcmVhZGluZzsKKwkJdTMyIGxvdzJsb3djYXRfdHJlc2hvbGQ7CisJCXUzMiBsb3djYXQybG93X3RyZXNob2xkOworCQl1MzIgbG93d2FybjJsb3dfdHJlc2hvbGQ7CisJCXUzMiBsb3cybG93d2Fybl90cmVzaG9sZDsKKwkJdTMyIG5vcm0ybG93d2Fybl90cmVzaG9sZDsKKwkJdTMyIGxvd3dhcm4ybm9ybV90cmVzaG9sZDsKKwkJdTMyIG5vbWluYWxfcmVhZGluZzsKKwkJdTMyIGhpd2FybjJub3JtX3RyZXNob2xkOworCQl1MzIgbm9ybTJoaXdhcm5fdHJlc2hvbGQ7CisJCXUzMiBoaWdoMmhpd2Fybl90cmVzaG9sZDsKKwkJdTMyIGhpd2FybjJoaWdoX3RyZXNob2xkOworCQl1MzIgaGljYXQyaGlnaF90cmVzaG9sZDsKKwkJdTMyIGhpMmhpY2F0X3RyZXNob2xkOworCQl1MzIgbWF4aW11bV9yZWFkaW5nOworCQl1OCBzZW5zb3Jfc3RhdGU7CisJCXUxNiBldmVudF9lbmFibGU7CisJfSByZXN1bHQ7CisKKwl0b2tlbiA9IGkyb19wYXJtX2ZpZWxkX2dldChkLCAweEYyMDAsIC0xLCAmcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7CisKKwlpZiAodG9rZW4gPCAwKSB7CisJCWkyb19yZXBvcnRfcXVlcnlfc3RhdHVzKHNlcSwgdG9rZW4sCisJCQkJCSIweEYyMDAgU2Vuc29ycyAob3B0aW9uYWwpIik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYoc2VxLCAiU2Vuc29yIGluc3RhbmNlICAgICAgIDogJWRcbiIsIHJlc3VsdC5zZW5zb3JfaW5zdGFuY2UpOworCisJc2VxX3ByaW50ZihzZXEsICJDb21wb25lbnQgICAgICAgICAgICAgOiAlZCA9ICIsIHJlc3VsdC5jb21wb25lbnQpOworCXN3aXRjaCAocmVzdWx0LmNvbXBvbmVudCkgeworCWNhc2UgMDoKKwkJc2VxX3ByaW50ZihzZXEsICJPdGhlciIpOworCQlicmVhazsKKwljYXNlIDE6CisJCXNlcV9wcmludGYoc2VxLCAiUGxhbmFyIGxvZ2ljIEJvYXJkIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJc2VxX3ByaW50ZihzZXEsICJDUFUiKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzZXFfcHJpbnRmKHNlcSwgIkNoYXNzaXMiKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlzZXFfcHJpbnRmKHNlcSwgIlBvd2VyIFN1cHBseSIpOworCQlicmVhazsKKwljYXNlIDU6CisJCXNlcV9wcmludGYoc2VxLCAiU3RvcmFnZSIpOworCQlicmVhazsKKwljYXNlIDY6CisJCXNlcV9wcmludGYoc2VxLCAiRXh0ZXJuYWwiKTsKKwkJYnJlYWs7CisJfQorCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKworCXNlcV9wcmludGYoc2VxLCAiQ29tcG9uZW50IGluc3RhbmNlICAgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5jb21wb25lbnRfaW5zdGFuY2UpOworCXNlcV9wcmludGYoc2VxLCAiU2Vuc29yIGNsYXNzICAgICAgICAgIDogJXNcbiIsCisJCSAgIHJlc3VsdC5zZW5zb3JfY2xhc3MgPyAiQW5hbG9nIiA6ICJEaWdpdGFsIik7CisKKwlzZXFfcHJpbnRmKHNlcSwgIlNlbnNvciB0eXBlICAgICAgICAgICA6ICVkID0gIiwgcmVzdWx0LnNlbnNvcl90eXBlKTsKKwlzd2l0Y2ggKHJlc3VsdC5zZW5zb3JfdHlwZSkgeworCWNhc2UgMDoKKwkJc2VxX3ByaW50ZihzZXEsICJPdGhlclxuIik7CisJCWJyZWFrOworCWNhc2UgMToKKwkJc2VxX3ByaW50ZihzZXEsICJUaGVybWFsXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzZXFfcHJpbnRmKHNlcSwgIkRDIHZvbHRhZ2UgKERDIHZvbHRzKVxuIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc2VxX3ByaW50ZihzZXEsICJBQyB2b2x0YWdlIChBQyB2b2x0cylcbiIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNlcV9wcmludGYoc2VxLCAiREMgY3VycmVudCAoREMgYW1wcylcbiIpOworCQlicmVhazsKKwljYXNlIDU6CisJCXNlcV9wcmludGYoc2VxLCAiQUMgY3VycmVudCAoQUMgdm9sdHMpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzZXFfcHJpbnRmKHNlcSwgIkRvb3Igb3BlblxuIik7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJc2VxX3ByaW50ZihzZXEsICJGYW4gb3BlcmF0aW9uYWxcbiIpOworCQlicmVhazsKKwl9CisKKwlzZXFfcHJpbnRmKHNlcSwgIlNjYWxpbmcgZXhwb25lbnQgICAgICA6ICVkXG4iLAorCQkgICByZXN1bHQuc2NhbGluZ19leHBvbmVudCk7CisJc2VxX3ByaW50ZihzZXEsICJBY3R1YWwgcmVhZGluZyAgICAgICAgOiAlZFxuIiwgcmVzdWx0LmFjdHVhbF9yZWFkaW5nKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk1pbmltdW0gcmVhZGluZyAgICAgICA6ICVkXG4iLCByZXN1bHQubWluaW11bV9yZWFkaW5nKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkxvdzJMb3dDYXQgdHJlc2hvbGQgICA6ICVkXG4iLAorCQkgICByZXN1bHQubG93Mmxvd2NhdF90cmVzaG9sZCk7CisJc2VxX3ByaW50ZihzZXEsICJMb3dDYXQyTG93IHRyZXNob2xkICAgOiAlZFxuIiwKKwkJICAgcmVzdWx0Lmxvd2NhdDJsb3dfdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiTG93V2FybjJMb3cgdHJlc2hvbGQgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5sb3d3YXJuMmxvd190cmVzaG9sZCk7CisJc2VxX3ByaW50ZihzZXEsICJMb3cyTG93V2FybiB0cmVzaG9sZCAgOiAlZFxuIiwKKwkJICAgcmVzdWx0LmxvdzJsb3d3YXJuX3RyZXNob2xkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk5vcm0yTG93V2FybiB0cmVzaG9sZCA6ICVkXG4iLAorCQkgICByZXN1bHQubm9ybTJsb3d3YXJuX3RyZXNob2xkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkxvd1dhcm4yTm9ybSB0cmVzaG9sZCA6ICVkXG4iLAorCQkgICByZXN1bHQubG93d2FybjJub3JtX3RyZXNob2xkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIk5vbWluYWwgcmVhZGluZyAgICAgICA6ICVkXG4iLCByZXN1bHQubm9taW5hbF9yZWFkaW5nKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkhpV2FybjJOb3JtIHRyZXNob2xkICA6ICVkXG4iLAorCQkgICByZXN1bHQuaGl3YXJuMm5vcm1fdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiTm9ybTJIaVdhcm4gdHJlc2hvbGQgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5ub3JtMmhpd2Fybl90cmVzaG9sZCk7CisJc2VxX3ByaW50ZihzZXEsICJIaWdoMkhpV2FybiB0cmVzaG9sZCAgOiAlZFxuIiwKKwkJICAgcmVzdWx0LmhpZ2gyaGl3YXJuX3RyZXNob2xkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkhpV2FybjJIaWdoIHRyZXNob2xkICA6ICVkXG4iLAorCQkgICByZXN1bHQuaGl3YXJuMmhpZ2hfdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiSGlDYXQySGlnaCB0cmVzaG9sZCAgIDogJWRcbiIsCisJCSAgIHJlc3VsdC5oaWNhdDJoaWdoX3RyZXNob2xkKTsKKwlzZXFfcHJpbnRmKHNlcSwgIkhpZ2gySGlDYXQgdHJlc2hvbGQgICA6ICVkXG4iLAorCQkgICByZXN1bHQuaGkyaGljYXRfdHJlc2hvbGQpOworCXNlcV9wcmludGYoc2VxLCAiTWF4aW11bSByZWFkaW5nICAgICAgIDogJWRcbiIsIHJlc3VsdC5tYXhpbXVtX3JlYWRpbmcpOworCisJc2VxX3ByaW50ZihzZXEsICJTZW5zb3Igc3RhdGUgICAgICAgICAgOiAlZCA9ICIsIHJlc3VsdC5zZW5zb3Jfc3RhdGUpOworCXN3aXRjaCAocmVzdWx0LnNlbnNvcl9zdGF0ZSkgeworCWNhc2UgMDoKKwkJc2VxX3ByaW50ZihzZXEsICJOb3JtYWxcbiIpOworCQlicmVhazsKKwljYXNlIDE6CisJCXNlcV9wcmludGYoc2VxLCAiQWJub3JtYWxcbiIpOworCQlicmVhazsKKwljYXNlIDI6CisJCXNlcV9wcmludGYoc2VxLCAiVW5rbm93blxuIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJc2VxX3ByaW50ZihzZXEsICJMb3cgQ2F0YXN0cm9waGljIChMb0NhdClcbiIpOworCQlicmVhazsKKwljYXNlIDQ6CisJCXNlcV9wcmludGYoc2VxLCAiTG93IChMb3cpXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQlzZXFfcHJpbnRmKHNlcSwgIkxvdyBXYXJuaW5nIChMb1dhcm4pXG4iKTsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQlzZXFfcHJpbnRmKHNlcSwgIkhpZ2ggV2FybmluZyAoSGlXYXJuKVxuIik7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJc2VxX3ByaW50ZihzZXEsICJIaWdoIChIaWdoKVxuIik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJc2VxX3ByaW50ZihzZXEsICJIaWdoIENhdGFzdHJvcGhpYyAoSGlDYXQpXG4iKTsKKwkJYnJlYWs7CisJfQorCisJc2VxX3ByaW50ZihzZXEsICJFdmVudF9lbmFibGUgOiAweCUwMlhcbiIsIHJlc3VsdC5ldmVudF9lbmFibGUpOworCXNlcV9wcmludGYoc2VxLCAiICAgIFslc10gT3BlcmF0aW9uYWwgc3RhdGUgY2hhbmdlLiBcbiIsCisJCSAgIChyZXN1bHQuZXZlbnRfZW5hYmxlICYgMHgwMSkgPyAiKyIgOiAiLSIpOworCXNlcV9wcmludGYoc2VxLCAiICAgIFslc10gTG93IGNhdGFzdHJvcGhpYy4gXG4iLAorCQkgICAocmVzdWx0LmV2ZW50X2VuYWJsZSAmIDB4MDIpID8gIisiIDogIi0iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiAgICBbJXNdIExvdyByZWFkaW5nLiBcbiIsCisJCSAgIChyZXN1bHQuZXZlbnRfZW5hYmxlICYgMHgwNCkgPyAiKyIgOiAiLSIpOworCXNlcV9wcmludGYoc2VxLCAiICAgIFslc10gTG93IHdhcm5pbmcuIFxuIiwKKwkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDA4KSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsCisJCSAgICIgICAgWyVzXSBDaGFuZ2UgYmFjayB0byBub3JtYWwgZnJvbSBvdXQgb2YgcmFuZ2Ugc3RhdGUuIFxuIiwKKwkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDEwKSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgWyVzXSBIaWdoIHdhcm5pbmcuIFxuIiwKKwkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDIwKSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgWyVzXSBIaWdoIHJlYWRpbmcuIFxuIiwKKwkJICAgKHJlc3VsdC5ldmVudF9lbmFibGUgJiAweDQwKSA/ICIrIiA6ICItIik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgWyVzXSBIaWdoIGNhdGFzdHJvcGhpYy4gXG4iLAorCQkgICAocmVzdWx0LmV2ZW50X2VuYWJsZSAmIDB4ODApID8gIisiIDogIi0iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9ocnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19ocnQsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fbGN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfbGN0LCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3N0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3N0YXR1cywgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9odyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2h3LCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2RkbV90YWJsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2RkbV90YWJsZSwgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9kcml2ZXJfc3RvcmUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19kcml2ZXJfc3RvcmUsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fZHJpdmVyc19zdG9yZWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19kcml2ZXJzX3N0b3JlZCwgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9ncm91cHMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19ncm91cHMsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fcGh5c19kZXZpY2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19waHlzX2RldmljZSwgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9jbGFpbWVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfY2xhaW1lZCwgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl91c2VycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3VzZXJzLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3ByaXZfbXNncyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3ByaXZfbXNncywgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl9hdXRob3JpemVkX3VzZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfYXV0aG9yaXplZF91c2VycywKKwkJCSAgIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIGludCBpMm9fc2VxX29wZW5fZGV2X2lkZW50aXR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfZGV2X2lkZW50aXR5LCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2RkbV9pZGVudGl0eShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X2RkbV9pZGVudGl0eSwgUERFKGlub2RlKS0+ZGF0YSk7Cit9OworCitzdGF0aWMgaW50IGkyb19zZXFfb3Blbl91aW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgaTJvX3NlcV9zaG93X3VpbmZvLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3NnbF9saW1pdHMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19zZ2xfbGltaXRzLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX3NlbnNvcnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGkyb19zZXFfc2hvd19zZW5zb3JzLCBQREUoaW5vZGUpLT5kYXRhKTsKK307CisKK3N0YXRpYyBpbnQgaTJvX3NlcV9vcGVuX2Rldl9uYW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBpMm9fc2VxX3Nob3dfZGV2X25hbWUsIFBERShpbm9kZSktPmRhdGEpOworfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2xjdCA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9sY3QsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfaHJ0ID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX2hydCwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19zdGF0dXMgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fc3RhdHVzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2h3ID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX2h3LAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2RkbV90YWJsZSA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9kZG1fdGFibGUsCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfZHJpdmVyX3N0b3JlID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX2RyaXZlcl9zdG9yZSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19kcml2ZXJzX3N0b3JlZCA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9kcml2ZXJzX3N0b3JlZCwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19ncm91cHMgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fZ3JvdXBzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX3BoeXNfZGV2aWNlID0geworCS5vcGVuID0gaTJvX3NlcV9vcGVuX3BoeXNfZGV2aWNlLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2NsYWltZWQgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fY2xhaW1lZCwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc191c2VycyA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl91c2VycywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19wcml2X21zZ3MgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fcHJpdl9tc2dzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2F1dGhvcml6ZWRfdXNlcnMgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fYXV0aG9yaXplZF91c2VycywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19kZXZfbmFtZSA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9kZXZfbmFtZSwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGkyb19zZXFfZm9wc19kZXZfaWRlbnRpdHkgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fZGV2X2lkZW50aXR5LAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX2RkbV9pZGVudGl0eSA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9kZG1faWRlbnRpdHksCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfdWluZm8gPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fdWluZm8sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpMm9fc2VxX2ZvcHNfc2dsX2xpbWl0cyA9IHsKKwkub3BlbiA9IGkyb19zZXFfb3Blbl9zZ2xfbGltaXRzLAorCS5yZWFkID0gc2VxX3JlYWQsCisJLmxsc2VlayA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaTJvX3NlcV9mb3BzX3NlbnNvcnMgPSB7CisJLm9wZW4gPSBpMm9fc2VxX29wZW5fc2Vuc29ycywKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKKy8qCisgKiBJT1Agc3BlY2lmaWMgZW50cmllcy4uLndyaXRlIGZpZWxkIGp1c3QgaW4gY2FzZSBzb21lb25lCisgKiBldmVyIHdhbnRzIG9uZS4KKyAqLworc3RhdGljIGkyb19wcm9jX2VudHJ5IGkyb19wcm9jX2dlbmVyaWNfaW9wX2VudHJpZXNbXSA9IHsKKwl7ImhydCIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2hydH0sCisJeyJsY3QiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19sY3R9LAorCXsic3RhdHVzIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfc3RhdHVzfSwKKwl7Imh3IiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfaHd9LAorCXsiZGRtX3RhYmxlIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZGRtX3RhYmxlfSwKKwl7ImRyaXZlcl9zdG9yZSIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2RyaXZlcl9zdG9yZX0sCisJeyJkcml2ZXJzX3N0b3JlZCIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2RyaXZlcnNfc3RvcmVkfSwKKwl7TlVMTCwgMCwgTlVMTH0KK307CisKKy8qCisgKiBEZXZpY2Ugc3BlY2lmaWMgZW50cmllcworICovCitzdGF0aWMgaTJvX3Byb2NfZW50cnkgZ2VuZXJpY19kZXZfZW50cmllc1tdID0geworCXsiZ3JvdXBzIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZ3JvdXBzfSwKKwl7InBoeXNfZGV2IiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfcGh5c19kZXZpY2V9LAorCXsiY2xhaW1lZCIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2NsYWltZWR9LAorCXsidXNlcnMiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc191c2Vyc30sCisJeyJwcml2X21zZ3MiLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc19wcml2X21zZ3N9LAorCXsiYXV0aG9yaXplZF91c2VycyIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2F1dGhvcml6ZWRfdXNlcnN9LAorCXsiZGV2X2lkZW50aXR5IiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZGV2X2lkZW50aXR5fSwKKwl7ImRkbV9pZGVudGl0eSIsIFNfSUZSRUcgfCBTX0lSVUdPLCAmaTJvX3NlcV9mb3BzX2RkbV9pZGVudGl0eX0sCisJeyJ1c2VyX2luZm8iLCBTX0lGUkVHIHwgU19JUlVHTywgJmkyb19zZXFfZm9wc191aW5mb30sCisJeyJzZ2xfbGltaXRzIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfc2dsX2xpbWl0c30sCisJeyJzZW5zb3JzIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfc2Vuc29yc30sCisJe05VTEwsIDAsIE5VTEx9Cit9OworCisvKgorICogIFN0b3JhZ2UgdW5pdCBzcGVjaWZpYyBlbnRyaWVzIChTQ1NJIFBlcmlwaCwgQlMpIHdpdGggZGV2aWNlIG5hbWVzCisgKi8KK3N0YXRpYyBpMm9fcHJvY19lbnRyeSByYnNfZGV2X2VudHJpZXNbXSA9IHsKKwl7ImRldl9uYW1lIiwgU19JRlJFRyB8IFNfSVJVR08sICZpMm9fc2VxX2ZvcHNfZGV2X25hbWV9LAorCXtOVUxMLCAwLCBOVUxMfQorfTsKKworLyoqCisgKglpMm9fcHJvY19jcmVhdGVfZW50cmllcyAtIENyZWF0ZXMgcHJvYyBkaXIgZW50cmllcworICoJQGRpcjogcHJvYyBkaXIgZW50cnkgdW5kZXIgd2hpY2ggdGhlIGVudHJpZXMgc2hvdWxkIGJlIHBsYWNlZAorICoJQGkyb19wZTogcG9pbnRlciB0byB0aGUgZW50cmllcyB3aGljaCBzaG91bGQgYmUgYWRkZWQKKyAqCUBkYXRhOiBwb2ludGVyIHRvIEkyTyBjb250cm9sbGVyIG9yIGRldmljZQorICoKKyAqCUNyZWF0ZSBwcm9jIGRpciBlbnRyaWVzIGZvciBhIEkyTyBjb250cm9sbGVyIG9yIEkyTyBkZXZpY2UuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19wcm9jX2NyZWF0ZV9lbnRyaWVzKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyLAorCQkJCSAgIGkyb19wcm9jX2VudHJ5ICogaTJvX3BlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqdG1wOworCisJd2hpbGUgKGkyb19wZS0+bmFtZSkgeworCQl0bXAgPSBjcmVhdGVfcHJvY19lbnRyeShpMm9fcGUtPm5hbWUsIGkyb19wZS0+bW9kZSwgZGlyKTsKKwkJaWYgKCF0bXApCisJCQlyZXR1cm4gLTE7CisKKwkJdG1wLT5kYXRhID0gZGF0YTsKKwkJdG1wLT5wcm9jX2ZvcHMgPSBpMm9fcGUtPmZvcHM7CisKKwkJaTJvX3BlKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaTJvX3Byb2Nfc3ViZGlyX3JlbW92ZSAtIFJlbW92ZSBjaGlsZCBlbnRyaWVzIGZyb20gYSBwcm9jIGVudHJ5CisgKglAZGlyOiBwcm9jIGRpciBlbnRyeSBmcm9tIHdoaWNoIHRoZSBjaGlsZHMgc2hvdWxkIGJlIHJlbW92ZWQKKyAqCisgKglJdGVyYXRlIG92ZXIgZWFjaCBpMm8gcHJvYyBlbnRyeSB1bmRlciBkaXIgYW5kIHJlbW92ZSBpdC4gSWYgdGhlIGNoaWxkCisgKglhbHNvIGhhcyBlbnRyaWVzLCByZW1vdmUgdGhlbSB0b28uCisgKi8KK3N0YXRpYyB2b2lkIGkyb19wcm9jX3N1YmRpcl9yZW1vdmUoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXIpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZSwgKnRtcDsKKwlwZSA9IGRpci0+c3ViZGlyOworCXdoaWxlIChwZSkgeworCQl0bXAgPSBwZS0+bmV4dDsKKwkJaTJvX3Byb2Nfc3ViZGlyX3JlbW92ZShwZSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHBlLT5uYW1lLCBkaXIpOworCQlwZSA9IHRtcDsKKwl9Cit9OworCisvKioKKyAqCWkyb19wcm9jX2RldmljZV9hZGQgLSBBZGQgYW4gSTJPIGRldmljZSB0byB0aGUgcHJvYyBkaXIKKyAqCUBkaXI6IHByb2MgZGlyIGVudHJ5IHRvIHdoaWNoIHRoZSBkZXZpY2Ugc2hvdWxkIGJlIGFkZGVkCisgKglAZGV2OiBJMk8gZGV2aWNlIHdoaWNoIHNob3VsZCBiZSBhZGRlZAorICoKKyAqCUFkZCBhbiBJMk8gZGV2aWNlIHRvIHRoZSBwcm9jIGRpciBlbnRyeSBkaXIgYW5kIGNyZWF0ZSB0aGUgZW50cmllcyBmb3IKKyAqCXRoZSBkZXZpY2UgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgSTJPIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgaTJvX3Byb2NfZGV2aWNlX2FkZChzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpciwKKwkJCQlzdHJ1Y3QgaTJvX2RldmljZSAqZGV2KQoreworCWNoYXIgYnVmZlsxMF07CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZXZkaXI7CisJaTJvX3Byb2NfZW50cnkgKmkyb19wZSA9IE5VTEw7CisKKwlzcHJpbnRmKGJ1ZmYsICIlMDN4IiwgZGV2LT5sY3RfZGF0YS50aWQpOworCisJb3NtX2RlYnVnKCJhZGRpbmcgZGV2aWNlIC9wcm9jL2kyby8lcy8lc1xuIiwgZGV2LT5pb3AtPm5hbWUsIGJ1ZmYpOworCisJZGV2ZGlyID0gcHJvY19ta2RpcihidWZmLCBkaXIpOworCWlmICghZGV2ZGlyKSB7CisJCW9zbV93YXJuKCJDb3VsZCBub3QgYWxsb2NhdGUgcHJvY2RpciFcbiIpOworCQlyZXR1cm47CisJfQorCisJZGV2ZGlyLT5kYXRhID0gZGV2OworCisJaTJvX3Byb2NfY3JlYXRlX2VudHJpZXMoZGV2ZGlyLCBnZW5lcmljX2Rldl9lbnRyaWVzLCBkZXYpOworCisJLyogSW5mb3JtIGNvcmUgdGhhdCB3ZSB3YW50IHVwZGF0ZXMgYWJvdXQgdGhpcyBkZXZpY2UncyBzdGF0dXMgKi8KKwlzd2l0Y2ggKGRldi0+bGN0X2RhdGEuY2xhc3NfaWQpIHsKKwljYXNlIEkyT19DTEFTU19TQ1NJX1BFUklQSEVSQUw6CisJY2FzZSBJMk9fQ0xBU1NfUkFORE9NX0JMT0NLX1NUT1JBR0U6CisJCWkyb19wZSA9IHJic19kZXZfZW50cmllczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChpMm9fcGUpCisJCWkyb19wcm9jX2NyZWF0ZV9lbnRyaWVzKGRldmRpciwgaTJvX3BlLCBkZXYpOworfQorCisvKioKKyAqCWkyb19wcm9jX2lvcF9hZGQgLSBBZGQgYW4gSTJPIGNvbnRyb2xsZXIgdG8gdGhlIGkybyBwcm9jIHRyZWUKKyAqCUBkaXI6IHBhcmVudCBwcm9jIGRpciBlbnRyeQorICoJQGM6IEkyTyBjb250cm9sbGVyIHdoaWNoIHNob3VsZCBiZSBhZGRlZAorICoKKyAqCUFkZCB0aGUgZW50cmllcyB0byB0aGUgcGFyZW50IHByb2MgZGlyIGVudHJ5LiBBbHNvIGVhY2ggZGV2aWNlIGlzIGFkZGVkCisgKgl0byB0aGUgY29udHJvbGxlcnMgcHJvYyBkaXIgZW50cnkuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19wcm9jX2lvcF9hZGQoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkaXIsCisJCQkgICAgc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaW9wZGlyOworCXN0cnVjdCBpMm9fZGV2aWNlICpkZXY7CisKKwlvc21fZGVidWcoImFkZGluZyBJT1AgL3Byb2MvaTJvLyVzXG4iLCBjLT5uYW1lKTsKKworCWlvcGRpciA9IHByb2NfbWtkaXIoYy0+bmFtZSwgZGlyKTsKKwlpZiAoIWlvcGRpcikKKwkJcmV0dXJuIC0xOworCisJaW9wZGlyLT5kYXRhID0gYzsKKworCWkyb19wcm9jX2NyZWF0ZV9lbnRyaWVzKGlvcGRpciwgaTJvX3Byb2NfZ2VuZXJpY19pb3BfZW50cmllcywgYyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmMtPmRldmljZXMsIGxpc3QpCisJICAgIGkyb19wcm9jX2RldmljZV9hZGQoaW9wZGlyLCBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaTJvX3Byb2NfaW9wX3JlbW92ZSAtIFJlbW92ZXMgYW4gSTJPIGNvbnRyb2xsZXIgZnJvbSB0aGUgaTJvIHByb2MgdHJlZQorICoJQGRpcjogcGFyZW50IHByb2MgZGlyIGVudHJ5CisgKglAYzogSTJPIGNvbnRyb2xsZXIgd2hpY2ggc2hvdWxkIGJlIHJlbW92ZWQKKyAqCisgKglJdGVyYXRlIG92ZXIgZWFjaCBpMm8gcHJvYyBlbnRyeSBhbmQgc2VhcmNoIGNvbnRyb2xsZXIgYy4gSWYgaXQgaXMgZm91bmQKKyAqCXJlbW92ZSBpdCBmcm9tIHRoZSB0cmVlLgorICovCitzdGF0aWMgdm9pZCBpMm9fcHJvY19pb3BfcmVtb3ZlKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGlyLAorCQkJCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBlLCAqdG1wOworCisJcGUgPSBkaXItPnN1YmRpcjsKKwl3aGlsZSAocGUpIHsKKwkJdG1wID0gcGUtPm5leHQ7CisJCWlmIChwZS0+ZGF0YSA9PSBjKSB7CisJCQlpMm9fcHJvY19zdWJkaXJfcmVtb3ZlKHBlKTsKKwkJCXJlbW92ZV9wcm9jX2VudHJ5KHBlLT5uYW1lLCBkaXIpOworCQl9CisJCW9zbV9kZWJ1ZygicmVtb3ZpbmcgSU9QIC9wcm9jL2kyby8lc1xuIiwgYy0+bmFtZSk7CisJCXBlID0gdG1wOworCX0KK30KKworLyoqCisgKglpMm9fcHJvY19mc19jcmVhdGUgLSBDcmVhdGUgdGhlIGkybyBwcm9jIGZzLgorICoKKyAqCUl0ZXJhdGUgb3ZlciBlYWNoIEkyTyBjb250cm9sbGVyIGFuZCBjcmVhdGUgdGhlIGVudHJpZXMgZm9yIGl0LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgaTJvX3Byb2NfZnNfY3JlYXRlKHZvaWQpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCisJaTJvX3Byb2NfZGlyX3Jvb3QgPSBwcm9jX21rZGlyKCJpMm8iLCBOVUxMKTsKKwlpZiAoIWkyb19wcm9jX2Rpcl9yb290KQorCQlyZXR1cm4gLTE7CisKKwlpMm9fcHJvY19kaXJfcm9vdC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmkyb19jb250cm9sbGVycywgbGlzdCkKKwkgICAgaTJvX3Byb2NfaW9wX2FkZChpMm9fcHJvY19kaXJfcm9vdCwgYyk7CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX3Byb2NfZnNfZGVzdHJveSAtIENsZWFudXAgdGhlIGFsbCBpMm8gcHJvYyBlbnRyaWVzCisgKgorICoJSXRlcmF0ZSBvdmVyIGVhY2ggSTJPIGNvbnRyb2xsZXIgYW5kIHJlbW92ZSB0aGUgZW50cmllcyBmb3IgaXQuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9fZXhpdCBpMm9fcHJvY19mc19kZXN0cm95KHZvaWQpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KQorCSAgICBpMm9fcHJvY19pb3BfcmVtb3ZlKGkyb19wcm9jX2Rpcl9yb290LCBjKTsKKworCXJlbW92ZV9wcm9jX2VudHJ5KCJpMm8iLCBOVUxMKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fcHJvY19pbml0IC0gSW5pdCBmdW5jdGlvbiBmb3IgcHJvY2ZzCisgKgorICoJUmVnaXN0ZXJzIFByb2MgT1NNIGFuZCBjcmVhdGVzIHByb2NmcyBlbnRyaWVzLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgaTJvX3Byb2NfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCXByaW50ayhLRVJOX0lORk8gT1NNX0RFU0NSSVBUSU9OICIgdiIgT1NNX1ZFUlNJT04gIlxuIik7CisKKwlyYyA9IGkyb19kcml2ZXJfcmVnaXN0ZXIoJmkyb19wcm9jX2RyaXZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGkyb19wcm9jX2ZzX2NyZWF0ZSgpOworCWlmIChyYykgeworCQlpMm9fZHJpdmVyX3VucmVnaXN0ZXIoJmkyb19wcm9jX2RyaXZlcik7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX3Byb2NfZXhpdCAtIEV4aXQgZnVuY3Rpb24gZm9yIHByb2NmcworICoKKyAqCVVucmVnaXN0ZXJzIFByb2MgT1NNIGFuZCByZW1vdmVzIHByb2NmcyBlbnRyaWVzLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgaTJvX3Byb2NfZXhpdCh2b2lkKQoreworCWkyb19kcml2ZXJfdW5yZWdpc3RlcigmaTJvX3Byb2NfZHJpdmVyKTsKKwlpMm9fcHJvY19mc19kZXN0cm95KCk7Cit9OworCitNT0RVTEVfQVVUSE9SKCJEZWVwYWsgU2F4ZW5hIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oT1NNX0RFU0NSSVBUSU9OKTsKK01PRFVMRV9WRVJTSU9OKE9TTV9WRVJTSU9OKTsKKworbW9kdWxlX2luaXQoaTJvX3Byb2NfaW5pdCk7Cittb2R1bGVfZXhpdChpMm9fcHJvY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYyBiL2RyaXZlcnMvbWVzc2FnZS9pMm8vaTJvX3Njc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2Y1ODc1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pMm9fc2NzaS5jCkBAIC0wLDAgKzEsODMwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIEZvciB0aGUgYXZvaWRhbmNlIG9mIGRvdWJ0IHRoZSAicHJlZmVycmVkIGZvcm0iIG9mIHRoaXMgY29kZSBpcyBvbmUgd2hpY2gKKyAqIGlzIGluIGFuIG9wZW4gbm9uIHBhdGVudCBlbmN1bWJlcmVkIGZvcm1hdC4gV2hlcmUgY3J5cHRvZ3JhcGhpYyBrZXkgc2lnbmluZworICogZm9ybXMgcGFydCBvZiB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhbiBleGVjdXRhYmxlIHRoZSBpbmZvcm1hdGlvbgorICogaW5jbHVkaW5nIGtleXMgbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnRseSBmdW5jdGlvbmFsIGV4ZWN1dGFibGUKKyAqIGFyZSBkZWVtZWQgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIGNvZGUuCisgKgorICogIENvbXBsaWNhdGlvbnMgZm9yIEkyTyBzY3NpCisgKgorICoJbwlFYWNoIChidXMsbHVuKSBpcyBhIGxvZ2ljYWwgZGV2aWNlIGluIEkyTy4gV2Uga2VlcCBhIG1hcAorICoJCXRhYmxlLiBXZSBzcG9vZiBmYWlsZWQgc2VsZWN0aW9uIGZvciB1bm1hcHBlZCB1bml0cworICoJbwlSZXF1ZXN0IHNlbnNlIGJ1ZmZlcnMgY2FuIGNvbWUgYmFjayBmb3IgZnJlZS4KKyAqCW8JU2NhdHRlciBnYXRoZXIgaXMgYSBiaXQgZHluYW1pYy4gV2UgaGF2ZSB0byBpbnZlc3RpZ2F0ZSBhdAorICoJCXNldHVwIHRpbWUuCisgKglvCVNvbWUgb2Ygb3VyIHJlc291cmNlcyBhcmUgZHluYW1pY2FsbHkgc2hhcmVkLiBUaGUgaTJvIGNvcmUKKyAqCQluZWVkcyBhIG1lc3NhZ2UgcmVzZXJ2YXRpb24gcHJvdG9jb2wgdG8gYXZvaWQgc3dhcCB2IG5ldAorICoJCWRlYWRsb2NraW5nLiBXZSBuZWVkIHRvIGJhY2sgb2ZmIHF1ZXVlIHJlcXVlc3RzLgorICoKKyAqCUluIGdlbmVyYWwgdGhlIGZpcm13YXJlIHdhbnRzIHRvIGhlbHAuIFdoZXJlIGl0cyBoZWxwIGlzbid0IHBlcmZvcm1hbmNlCisgKgl1c2VmdWwgd2UganVzdCBpZ25vcmUgdGhlIGFpZC4gSXRzIG5vdCB3b3J0aCB0aGUgY29kZSBpbiB0cnV0aC4KKyAqCisgKiBGaXhlcy9hZGRpdGlvbnM6CisgKglTdGV2ZSBSYWxzdG9uOgorICoJCVNjYXR0ZXIgZ2F0aGVyIG5vdyB3b3JrcworICoJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgorICoJCU1pbm9yIGZpeGVzIGZvciAyLjYuCisgKgorICogVG8gRG86CisgKgk2NGJpdCBjbGVhbnVwcworICoJRml4IHRoZSByZXNvdXJjZSBtYW5hZ2VtZW50IHByb2JsZW1zLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisKKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisKKyNkZWZpbmUgT1NNX05BTUUJInNjc2ktb3NtIgorI2RlZmluZSBPU01fVkVSU0lPTgkiJFJldiQiCisjZGVmaW5lIE9TTV9ERVNDUklQVElPTgkiSTJPIFNDU0kgUGVyaXBoZXJhbCBPU00iCisKK3N0YXRpYyBzdHJ1Y3QgaTJvX2RyaXZlciBpMm9fc2NzaV9kcml2ZXI7CisKK3N0YXRpYyBpbnQgaTJvX3Njc2lfbWF4X2lkID0gMTY7CitzdGF0aWMgaW50IGkyb19zY3NpX21heF9sdW4gPSA4OworCitzdHJ1Y3QgaTJvX3Njc2lfaG9zdCB7CisJc3RydWN0IFNjc2lfSG9zdCAqc2NzaV9ob3N0OwkvKiBwb2ludGVyIHRvIHRoZSBTQ1NJIGhvc3QgKi8KKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmlvcDsJLyogcG9pbnRlciB0byB0aGUgSTJPIGNvbnRyb2xsZXIgKi8KKwlzdHJ1Y3QgaTJvX2RldmljZSAqY2hhbm5lbFswXTsJLyogY2hhbm5lbC0+aTJvX2RldiBtYXBwaW5nIHRhYmxlICovCit9OworCitzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBpMm9fc2NzaV9ob3N0X3RlbXBsYXRlOworCisjZGVmaW5lIEkyT19TQ1NJX0NBTl9RVUVVRQk0CisKKy8qIFNDU0kgT1NNIGNsYXNzIGhhbmRsaW5nIGRlZmluaXRpb24gKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX2NsYXNzX2lkIGkyb19zY3NpX2NsYXNzX2lkW10gPSB7CisJe0kyT19DTEFTU19TQ1NJX1BFUklQSEVSQUx9LAorCXtJMk9fQ0xBU1NfRU5EfQorfTsKKworc3RhdGljIHN0cnVjdCBpMm9fc2NzaV9ob3N0ICppMm9fc2NzaV9ob3N0X2FsbG9jKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgaTJvX3Njc2lfaG9zdCAqaTJvX3Nob3N0OworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2OworCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lfaG9zdDsKKwlpbnQgbWF4X2NoYW5uZWwgPSAwOworCXU4IHR5cGU7CisJaW50IGk7CisJc2l6ZV90IHNpemU7CisJaTJvX3N0YXR1c19ibG9jayAqc2I7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGkyb19kZXYsICZjLT5kZXZpY2VzLCBsaXN0KQorCSAgICBpZiAoaTJvX2Rldi0+bGN0X2RhdGEuY2xhc3NfaWQgPT0gSTJPX0NMQVNTX0JVU19BREFQVEVSX1BPUlQpIHsKKwkJaWYgKGkyb19wYXJtX2ZpZWxkX2dldChpMm9fZGV2LCAweDAwMDAsIDAsICZ0eXBlLCAxKSB8fCAodHlwZSA9PSAxKSkJLyogU0NTSSBidXMgKi8KKwkJCW1heF9jaGFubmVsKys7CisJfQorCisJaWYgKCFtYXhfY2hhbm5lbCkgeworCQlvc21fd2Fybigibm8gY2hhbm5lbHMgZm91bmQgb24gJXNcbiIsIGMtPm5hbWUpOworCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwl9CisKKwlzaXplID0gbWF4X2NoYW5uZWwgKiBzaXplb2Yoc3RydWN0IGkyb19kZXZpY2UgKikKKwkgICAgKyBzaXplb2Yoc3RydWN0IGkyb19zY3NpX2hvc3QpOworCisJc2NzaV9ob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZpMm9fc2NzaV9ob3N0X3RlbXBsYXRlLCBzaXplKTsKKwlpZiAoIXNjc2lfaG9zdCkgeworCQlvc21fd2FybigiQ291bGQgbm90IGFsbG9jYXRlIFNDU0kgaG9zdFxuIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCXNjc2lfaG9zdC0+bWF4X2NoYW5uZWwgPSBtYXhfY2hhbm5lbCAtIDE7CisJc2NzaV9ob3N0LT5tYXhfaWQgPSBpMm9fc2NzaV9tYXhfaWQ7CisJc2NzaV9ob3N0LT5tYXhfbHVuID0gaTJvX3Njc2lfbWF4X2x1bjsKKwlzY3NpX2hvc3QtPnRoaXNfaWQgPSBjLT51bml0OworCisJc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKworCXNjc2lfaG9zdC0+c2dfdGFibGVzaXplID0gKHNiLT5pbmJvdW5kX2ZyYW1lX3NpemUgLQorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaTJvX21lc3NhZ2UpIC8gNCAtIDYpIC8gMjsKKworCWkyb19zaG9zdCA9IChzdHJ1Y3QgaTJvX3Njc2lfaG9zdCAqKXNjc2lfaG9zdC0+aG9zdGRhdGE7CisJaTJvX3Nob3N0LT5zY3NpX2hvc3QgPSBzY3NpX2hvc3Q7CisJaTJvX3Nob3N0LT5pb3AgPSBjOworCisJaSA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpMm9fZGV2LCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkgICAgaWYgKGkyb19kZXYtPmxjdF9kYXRhLmNsYXNzX2lkID09IEkyT19DTEFTU19CVVNfQURBUFRFUl9QT1JUKSB7CisJCWlmIChpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMHgwMDAwLCAwLCAmdHlwZSwgMSkgfHwgKHR5cGUgPT0gMSkpCS8qIG9ubHkgU0NTSSBidXMgKi8KKwkJCWkyb19zaG9zdC0+Y2hhbm5lbFtpKytdID0gaTJvX2RldjsKKworCQlpZiAoaSA+PSBtYXhfY2hhbm5lbCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBpMm9fc2hvc3Q7Cit9OworCisvKioKKyAqCWkyb19zY3NpX2dldF9ob3N0IC0gR2V0IGFuIEkyTyBTQ1NJIGhvc3QKKyAqCUBjOiBJMk8gY29udHJvbGxlciB0byBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBTQ1NJIGhvc3QKKyAqCisgKglJZiB0aGUgSTJPIGNvbnRyb2xsZXIgYWxyZWFkeSBleGlzdHMgYXMgU0NTSSBob3N0LCB0aGUgU0NTSSBob3N0CisgKglpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBJMk8gY29udHJvbGxlciBpcyBhZGRlZCB0byB0aGUgU0NTSQorICoJY29yZS4KKyAqCisgKglSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIEkyTyBTQ1NJIGhvc3Qgb24gc3VjY2VzcyBvciBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJvX3Njc2lfaG9zdCAqaTJvX3Njc2lfZ2V0X2hvc3Qoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXJldHVybiBjLT5kcml2ZXJfZGF0YVtpMm9fc2NzaV9kcml2ZXIuY29udGV4dF07Cit9OworCisvKioKKyAqCWkyb19zY3NpX3JlbW92ZSAtIFJlbW92ZSBJMk8gZGV2aWNlIGZyb20gU0NTSSBjb3JlCisgKglAZGV2OiBkZXZpY2Ugd2hpY2ggc2hvdWxkIGJlIHJlbW92ZWQKKyAqCisgKglSZW1vdmVzIHRoZSBJMk8gZGV2aWNlIGZyb20gdGhlIFNDU0kgY29yZSBhZ2Fpbi4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBpMm9fc2NzaV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2ID0gdG9faTJvX2RldmljZShkZXYpOworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYyA9IGkyb19kZXYtPmlvcDsKKwlzdHJ1Y3QgaTJvX3Njc2lfaG9zdCAqaTJvX3Nob3N0OworCXN0cnVjdCBzY3NpX2RldmljZSAqc2NzaV9kZXY7CisKKwlpMm9fc2hvc3QgPSBpMm9fc2NzaV9nZXRfaG9zdChjKTsKKworCXNob3N0X2Zvcl9lYWNoX2RldmljZShzY3NpX2RldiwgaTJvX3Nob3N0LT5zY3NpX2hvc3QpCisJICAgIGlmIChzY3NpX2Rldi0+aG9zdGRhdGEgPT0gaTJvX2RldikgeworCQlzY3NpX3JlbW92ZV9kZXZpY2Uoc2NzaV9kZXYpOworCQlzY3NpX2RldmljZV9wdXQoc2NzaV9kZXYpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX3Njc2lfcHJvYmUgLSB2ZXJpZnkgaWYgZGV2IGlzIGEgSTJPIFNDU0kgZGV2aWNlIGFuZCBpbnN0YWxsIGl0CisgKglAZGV2OiBkZXZpY2UgdG8gdmVyaWZ5IGlmIGl0IGlzIGEgSTJPIFNDU0kgZGV2aWNlCisgKgorICoJUmV0cmlldmUgY2hhbm5lbCwgaWQgYW5kIGx1biBmb3IgSTJPIGRldmljZS4gSWYgZXZlcnRoaW5nIGdvZXMgd2VsbAorICoJcmVnaXN0ZXIgdGhlIEkyTyBkZXZpY2UgYXMgU0NTSSBkZXZpY2Ugb24gdGhlIEkyTyBTQ1NJIGNvbnRyb2xsZXIuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19zY3NpX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBpMm9fZGV2LT5pb3A7CisJc3RydWN0IGkyb19zY3NpX2hvc3QgKmkyb19zaG9zdDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpX2hvc3Q7CisJc3RydWN0IGkyb19kZXZpY2UgKnBhcmVudDsKKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lfZGV2OworCXUzMiBpZDsKKwl1NjQgbHVuOworCWludCBjaGFubmVsID0gLTE7CisJaW50IGk7CisKKwlpMm9fc2hvc3QgPSBpMm9fc2NzaV9nZXRfaG9zdChjKTsKKwlpZiAoIWkyb19zaG9zdCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlzY3NpX2hvc3QgPSBpMm9fc2hvc3QtPnNjc2lfaG9zdDsKKworCWlmIChpMm9fcGFybV9maWVsZF9nZXQoaTJvX2RldiwgMCwgMywgJmlkLCA0KSA8IDApCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGlkID49IHNjc2lfaG9zdC0+bWF4X2lkKSB7CisJCW9zbV93YXJuKCJTQ1NJIGRldmljZSBpZCAoJWQpID49IG1heF9pZCBvZiBJMk8gaG9zdCAoJWQpIiwgaWQsCisJCQkgc2NzaV9ob3N0LT5tYXhfaWQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoaTJvX3Bhcm1fZmllbGRfZ2V0KGkyb19kZXYsIDAsIDQsICZsdW4sIDgpIDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGx1biA+PSBzY3NpX2hvc3QtPm1heF9sdW4pIHsKKwkJb3NtX3dhcm4oIlNDU0kgZGV2aWNlIGlkICglZCkgPj0gbWF4X2x1biBvZiBJMk8gaG9zdCAoJWQpIiwKKwkJCSAodW5zaWduZWQgaW50KWx1biwgc2NzaV9ob3N0LT5tYXhfbHVuKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJcGFyZW50ID0gaTJvX2lvcF9maW5kX2RldmljZShjLCBpMm9fZGV2LT5sY3RfZGF0YS5wYXJlbnRfdGlkKTsKKwlpZiAoIXBhcmVudCkgeworCQlvc21fd2FybigiY2FuIG5vdCBmaW5kIHBhcmVudCBvZiBkZXZpY2UgJTAzeFxuIiwKKwkJCSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IGkyb19zaG9zdC0+c2NzaV9ob3N0LT5tYXhfY2hhbm5lbDsgaSsrKQorCQlpZiAoaTJvX3Nob3N0LT5jaGFubmVsW2ldID09IHBhcmVudCkKKwkJCWNoYW5uZWwgPSBpOworCisJaWYgKGNoYW5uZWwgPT0gLTEpIHsKKwkJb3NtX3dhcm4oImNhbiBub3QgZmluZCBjaGFubmVsIG9mIGRldmljZSAlMDN4XG4iLAorCQkJIGkyb19kZXYtPmxjdF9kYXRhLnRpZCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXNjc2lfZGV2ID0KKwkgICAgX19zY3NpX2FkZF9kZXZpY2UoaTJvX3Nob3N0LT5zY3NpX2hvc3QsIGNoYW5uZWwsIGlkLCBsdW4sIGkyb19kZXYpOworCisJaWYgKCFzY3NpX2RldikgeworCQlvc21fd2FybigiY2FuIG5vdCBhZGQgU0NTSSBkZXZpY2UgJTAzeFxuIiwKKwkJCSBpMm9fZGV2LT5sY3RfZGF0YS50aWQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlvc21fZGVidWcoImFkZGVkIG5ldyBTQ1NJIGRldmljZSAlMDN4IChjYW5uZWw6ICVkLCBpZDogJWQsIGx1bjogJWQpXG4iLAorCQkgIGkyb19kZXYtPmxjdF9kYXRhLnRpZCwgY2hhbm5lbCwgaWQsICh1bnNpZ25lZCBpbnQpbHVuKTsKKworCXJldHVybiAwOworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmkyb19zY3NpX2luZm8oc3RydWN0IFNjc2lfSG9zdCAqU0Nob3N0KQoreworCXN0cnVjdCBpMm9fc2NzaV9ob3N0ICpob3N0ZGF0YTsKKwlob3N0ZGF0YSA9IChzdHJ1Y3QgaTJvX3Njc2lfaG9zdCAqKVNDaG9zdC0+aG9zdGRhdGE7CisJcmV0dXJuIGhvc3RkYXRhLT5pb3AtPm5hbWU7Cit9CisKKy8qKgorICoJaTJvX3Njc2lfcmVwbHkgLSBTQ1NJIE9TTSBtZXNzYWdlIHJlcGx5IGhhbmRsZXIKKyAqCUBjOiBjb250cm9sbGVyIGlzc3VpbmcgdGhlIHJlcGx5CisgKglAbTogbWVzc2FnZSBpZCBmb3IgZmx1c2hpbmcKKyAqCUBtc2c6IHRoZSBtZXNzYWdlIGZyb20gdGhlIGNvbnRyb2xsZXIKKyAqCisgKglQcm9jZXNzIHJlcGx5IG1lc3NhZ2VzIChpbnRlcnJ1cHRzIGluIG5vcm1hbCBzY3NpIGNvbnRyb2xsZXIgdGhpbmspLgorICoJV2UgY2FuIGdldCBhIHZhcmlldHkgb2YgbWVzc2FnZXMgdG8gcHJvY2Vzcy4gVGhlIG5vcm1hbCBwYXRoIGlzCisgKglzY3NpIGNvbW1hbmQgY29tcGxldGlvbnMuIFdlIG11c3QgYWxzbyBkZWFsIHdpdGggSU9QIGZhaWx1cmVzLAorICoJdGhlIHJlcGx5IHRvIGEgYnVzIHJlc2V0IGFuZCB0aGUgcmVwbHkgdG8gYSBMVU4gcXVlcnkuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGlmIHRoZSByZXBseSBzaG91bGQgbm90IGJlIGZsdXNoZWQgb3IgPiAwCisgKglvbiBzdWNjZXNzIGFuZCBpZiB0aGUgcmVwbHkgc2hvdWxkIGJlIGZsdXNoZWQuIFJldHVybnMgbmVnYXRpdmUgZXJyb3IKKyAqCWNvZGUgb24gZmFpbHVyZSBhbmQgaWYgdGhlIHJlcGx5IHNob3VsZCBiZSBmbHVzaGVkLgorICovCitzdGF0aWMgaW50IGkyb19zY3NpX3JlcGx5KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIG0sCisJCQkgIHN0cnVjdCBpMm9fbWVzc2FnZSAqbXNnKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdTggYXMsIGRzLCBzdDsKKworCWNtZCA9IGkyb19jbnR4dF9saXN0X2dldChjLCBsZTMyX3RvX2NwdShtc2ctPnUucy50Y250eHQpKTsKKworCWlmIChtc2ctPnUuaGVhZFswXSAmICgxIDw8IDEzKSkgeworCQlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqcG1zZzsJLyogcHJlc2VydmVkIG1lc3NhZ2UgKi8KKwkJdTMyIHBtOworCQlpbnQgZXJyID0gRElEX0VSUk9SOworCisJCXBtID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzNdKTsKKworCQlwbXNnID0gaTJvX21zZ19pbl90b192aXJ0KGMsIHBtKTsKKworCQlvc21fZXJyKCJJT1AgZmFpbC5cbiIpOworCQlvc21fZXJyKCJGcm9tICVkIFRvICVkIENtZCAlZC5cbiIsCisJCQkobXNnLT51LmhlYWRbMV0gPj4gMTIpICYgMHhGRkYsCisJCQltc2ctPnUuaGVhZFsxXSAmIDB4RkZGLCBtc2ctPnUuaGVhZFsxXSA+PiAyNCk7CisJCW9zbV9lcnIoIkZhaWx1cmUgQ29kZSAlZC5cbiIsIG1zZy0+Ym9keVswXSA+PiAyNCk7CisJCWlmIChtc2ctPmJvZHlbMF0gJiAoMSA8PCAxNikpCisJCQlvc21fZXJyKCJGb3JtYXQgZXJyb3IuXG4iKTsKKwkJaWYgKG1zZy0+Ym9keVswXSAmICgxIDw8IDE3KSkKKwkJCW9zbV9lcnIoIlBhdGggZXJyb3IuXG4iKTsKKwkJaWYgKG1zZy0+Ym9keVswXSAmICgxIDw8IDE4KSkKKwkJCW9zbV9lcnIoIlBhdGggU3RhdGUuXG4iKTsKKwkJaWYgKG1zZy0+Ym9keVswXSAmICgxIDw8IDE4KSkKKwkJeworCQkJb3NtX2VycigiQ29uZ2VzdGlvbi5cbiIpOworCQkJZXJyID0gRElEX0JVU19CVVNZOworCQl9CisKKwkJb3NtX2RlYnVnKCJGYWlsaW5nIG1lc3NhZ2UgaXMgJXAuXG4iLCBwbXNnKTsKKworCQljbWQgPSBpMm9fY250eHRfbGlzdF9nZXQoYywgcmVhZGwoJnBtc2ctPnUucy50Y250eHQpKTsKKwkJaWYgKCFjbWQpCisJCQlyZXR1cm4gMTsKKworCQljbWQtPnJlc3VsdCA9IGVyciA8PCAxNjsKKwkJY21kLT5zY3NpX2RvbmUoY21kKTsKKworCQkvKiBOb3cgZmx1c2ggdGhlIG1lc3NhZ2UgYnkgbWFraW5nIGl0IGEgTk9QICovCisJCWkyb19tc2dfbm9wKGMsIHBtKTsKKworCQlyZXR1cm4gMTsKKwl9CisKKwkvKgorCSAqICAgICAgTG93IGJ5dGUgaXMgZGV2aWNlIHN0YXR1cywgbmV4dCBpcyBhZGFwdGVyIHN0YXR1cywKKwkgKiAgICAgICh0aGVuIG9uZSBieXRlIHJlc2VydmVkKSwgdGhlbiByZXF1ZXN0IHN0YXR1cy4KKwkgKi8KKwlkcyA9ICh1OCkgbGUzMl90b19jcHUobXNnLT5ib2R5WzBdKTsKKwlhcyA9ICh1OCkgKGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSkgPj4gOCk7CisJc3QgPSAodTgpIChsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pID4+IDI0KTsKKworCS8qCisJICogICAgICBJcyB0aGlzIGEgY29udHJvbCByZXF1ZXN0IGNvbWluZyBiYWNrIC0gZWcgYW4gYWJvcnQgPworCSAqLworCisJaWYgKCFjbWQpIHsKKwkJaWYgKHN0KQorCQkJb3NtX3dhcm4oIlNDU0kgYWJvcnQ6ICUwOFgiLCBsZTMyX3RvX2NwdShtc2ctPmJvZHlbMF0pKTsKKwkJb3NtX2luZm8oIlNDU0kgYWJvcnQgY29tcGxldGVkLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCW9zbV9kZWJ1ZygiQ29tcGxldGVkICVsZFxuIiwgY21kLT5zZXJpYWxfbnVtYmVyKTsKKworCWlmIChzdCkgeworCQl1MzIgY291bnQsIGVycm9yOworCQkvKiBBbiBlcnJvciBoYXMgb2NjdXJyZWQgKi8KKworCQlzd2l0Y2ggKHN0KSB7CisJCWNhc2UgMHgwNjoKKwkJCWNvdW50ID0gbGUzMl90b19jcHUobXNnLT5ib2R5WzFdKTsKKwkJCWlmIChjb3VudCA8IGNtZC0+dW5kZXJmbG93KSB7CisJCQkJaW50IGk7CisKKwkJCQlvc21fZXJyKCJTQ1NJIHVuZGVyZmxvdyAweCUwOFggMHglMDhYXG4iLCBjb3VudCwKKwkJCQkJY21kLT51bmRlcmZsb3cpOworCQkJCW9zbV9kZWJ1ZygiQ21kOiAiKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykKKwkJCQkJcHJfZGVidWcoIiUwMlggIiwgY21kLT5jbW5kW2ldKTsKKwkJCQlwcl9kZWJ1ZygiLlxuIik7CisJCQkJY21kLT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQllcnJvciA9IGxlMzJfdG9fY3B1KG1zZy0+Ym9keVswXSk7CisKKwkJCW9zbV9lcnIoIlNDU0kgZXJyb3IgJTA4eFxuIiwgZXJyb3IpOworCisJCQlpZiAoKGVycm9yICYgMHhmZikgPT0gMHgwMiAvKkNIRUNLX0NPTkRJVElPTiAqLyApIHsKKwkJCQlpbnQgaTsKKwkJCQl1MzIgbGVuID0gc2l6ZW9mKGNtZC0+c2Vuc2VfYnVmZmVyKTsKKwkJCQlsZW4gPSAobGVuID4gNDApID8gNDAgOiBsZW47CisJCQkJLy8gQ29weSBvdmVyIHRoZSBzZW5zZSBkYXRhCisJCQkJbWVtY3B5KGNtZC0+c2Vuc2VfYnVmZmVyLCAodm9pZCAqKSZtc2ctPmJvZHlbM10sCisJCQkJICAgICAgIGxlbik7CisJCQkJZm9yIChpID0gMDsgaSA8PSBsZW47IGkrKykKKwkJCQkJb3NtX2luZm8oIiUwMnhcbiIsCisJCQkJCQkgY21kLT5zZW5zZV9idWZmZXJbaV0pOworCQkJCWlmIChjbWQtPnNlbnNlX2J1ZmZlclswXSA9PSAweDcwCisJCQkJICAgICYmIGNtZC0+c2Vuc2VfYnVmZmVyWzJdID09IERBVEFfUFJPVEVDVCkgeworCQkJCQkvKiBUaGlzIGlzIHRvIGhhbmRsZSBhbiBhcnJheSBmYWlsZWQgKi8KKwkJCQkJY21kLT5yZXN1bHQgPSAoRElEX1RJTUVfT1VUIDw8IDE2KTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFNDU0kgRGF0YSAiCisJCQkJCSAgICAgICAiUHJvdGVjdC1EZXZpY2UgKCVkLCVkLCVkKSAiCisJCQkJCSAgICAgICAiaGJhX3N0YXR1cz0weCV4LCBkZXZfc3RhdHVzPSIKKwkJCQkJICAgICAgICIweCV4LCBjbWQ9MHgleFxuIiwgYy0+bmFtZSwKKwkJCQkJICAgICAgICh1MzIpIGNtZC0+ZGV2aWNlLT5jaGFubmVsLAorCQkJCQkgICAgICAgKHUzMikgY21kLT5kZXZpY2UtPmlkLAorCQkJCQkgICAgICAgKHUzMikgY21kLT5kZXZpY2UtPmx1biwKKwkJCQkJICAgICAgIChlcnJvciA+PiA4KSAmIDB4ZmYsCisJCQkJCSAgICAgICBlcnJvciAmIDB4ZmYsIGNtZC0+Y21uZFswXSk7CisJCQkJfSBlbHNlCisJCQkJCWNtZC0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CisKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc3dpdGNoIChhcykgeworCQkJY2FzZSAweDBFOgorCQkJCS8qIFNDU0kgUmVzZXQgKi8KKwkJCQljbWQtPnJlc3VsdCA9IERJRF9SRVNFVCA8PCAxNjsKKwkJCQlicmVhazsKKworCQkJY2FzZSAweDBGOgorCQkJCWNtZC0+cmVzdWx0ID0gRElEX1BBUklUWSA8PCAxNjsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQljbWQtPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQljbWQtPnNjc2lfZG9uZShjbWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwljbWQtPnJlc3VsdCA9IERJRF9PSyA8PCAxNiB8IGRzOworCisJY21kLT5zY3NpX2RvbmUoY21kKTsKKworCWRldiA9ICZjLT5wZGV2LT5kZXY7CisJaWYgKGNtZC0+dXNlX3NnKQorCQlkbWFfdW5tYXBfc2coZGV2LCAoc3RydWN0IHNjYXR0ZXJsaXN0ICopY21kLT5idWZmZXIsCisJCQkgICAgIGNtZC0+dXNlX3NnLCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uKTsKKwllbHNlIGlmIChjbWQtPnJlcXVlc3RfYnVmZmxlbikKKwkJZG1hX3VubWFwX3NpbmdsZShkZXYsIChkbWFfYWRkcl90KSAoKGxvbmcpY21kLT5TQ3AucHRyKSwKKwkJCQkgY21kLT5yZXF1ZXN0X2J1ZmZsZW4sIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCisJcmV0dXJuIDE7Cit9OworCisvKioKKyAqCWkyb19zY3NpX25vdGlmeV9jb250cm9sbGVyX2FkZCAtIFJldHJpZXZlIG5vdGlmaWNhdGlvbnMgb2YgYWRkZWQKKyAqCQkJCQkgY29udHJvbGxlcnMKKyAqCUBjOiB0aGUgY29udHJvbGxlciB3aGljaCB3YXMgYWRkZWQKKyAqCisgKglJZiBhIEkyTyBjb250cm9sbGVyIGlzIGFkZGVkLCB3ZSBjYXRjaCB0aGUgbm90aWZpY2F0aW9uIHRvIGFkZCBhCisgKgljb3JyZXNwb25kaW5nIFNjc2lfSG9zdC4KKyAqLworc3RhdGljIHZvaWQgaTJvX3Njc2lfbm90aWZ5X2NvbnRyb2xsZXJfYWRkKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgaTJvX3Njc2lfaG9zdCAqaTJvX3Nob3N0OworCWludCByYzsKKworCWkyb19zaG9zdCA9IGkyb19zY3NpX2hvc3RfYWxsb2MoYyk7CisJaWYgKElTX0VSUihpMm9fc2hvc3QpKSB7CisJCW9zbV9lcnIoIkNvdWxkIG5vdCBpbml0aWFsaXplIFNDU0kgaG9zdFxuIik7CisJCXJldHVybjsKKwl9CisKKwlyYyA9IHNjc2lfYWRkX2hvc3QoaTJvX3Nob3N0LT5zY3NpX2hvc3QsICZjLT5kZXZpY2UpOworCWlmIChyYykgeworCQlvc21fZXJyKCJDb3VsZCBub3QgYWRkIFNDU0kgaG9zdFxuIik7CisJCXNjc2lfaG9zdF9wdXQoaTJvX3Nob3N0LT5zY3NpX2hvc3QpOworCQlyZXR1cm47CisJfQorCisJYy0+ZHJpdmVyX2RhdGFbaTJvX3Njc2lfZHJpdmVyLmNvbnRleHRdID0gaTJvX3Nob3N0OworCisJb3NtX2RlYnVnKCJuZXcgSTJPIFNDU0kgaG9zdCBhZGRlZFxuIik7Cit9OworCisvKioKKyAqCWkyb19zY3NpX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZSAtIFJldHJpZXZlIG5vdGlmaWNhdGlvbnMgb2YgcmVtb3ZlZAorICoJCQkJCSAgICBjb250cm9sbGVycworICoJQGM6IHRoZSBjb250cm9sbGVyIHdoaWNoIHdhcyByZW1vdmVkCisgKgorICoJSWYgYSBJMk8gY29udHJvbGxlciBpcyByZW1vdmVkLCB3ZSBjYXRjaCB0aGUgbm90aWZpY2F0aW9uIHRvIHJlbW92ZSB0aGUKKyAqCWNvcnJlc3BvbmRpbmcgU2NzaV9Ib3N0LgorICovCitzdGF0aWMgdm9pZCBpMm9fc2NzaV9ub3RpZnlfY29udHJvbGxlcl9yZW1vdmUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fc2NzaV9ob3N0ICppMm9fc2hvc3Q7CisJaTJvX3Nob3N0ID0gaTJvX3Njc2lfZ2V0X2hvc3QoYyk7CisJaWYgKCFpMm9fc2hvc3QpCisJCXJldHVybjsKKworCWMtPmRyaXZlcl9kYXRhW2kyb19zY3NpX2RyaXZlci5jb250ZXh0XSA9IE5VTEw7CisKKwlzY3NpX3JlbW92ZV9ob3N0KGkyb19zaG9zdC0+c2NzaV9ob3N0KTsKKwlzY3NpX2hvc3RfcHV0KGkyb19zaG9zdC0+c2NzaV9ob3N0KTsKKwlwcl9pbmZvKCJJMk8gU0NTSSBob3N0IHJlbW92ZWRcbiIpOworfTsKKworLyogU0NTSSBPU00gZHJpdmVyIHN0cnVjdCAqLworc3RhdGljIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19zY3NpX2RyaXZlciA9IHsKKwkubmFtZSA9IE9TTV9OQU1FLAorCS5yZXBseSA9IGkyb19zY3NpX3JlcGx5LAorCS5jbGFzc2VzID0gaTJvX3Njc2lfY2xhc3NfaWQsCisJLm5vdGlmeV9jb250cm9sbGVyX2FkZCA9IGkyb19zY3NpX25vdGlmeV9jb250cm9sbGVyX2FkZCwKKwkubm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlID0gaTJvX3Njc2lfbm90aWZ5X2NvbnRyb2xsZXJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCSAgIC5wcm9iZSA9IGkyb19zY3NpX3Byb2JlLAorCQkgICAucmVtb3ZlID0gaTJvX3Njc2lfcmVtb3ZlLAorCQkgICB9LAorfTsKKworLyoqCisgKglpMm9fc2NzaV9xdWV1ZWNvbW1hbmQgLSBxdWV1ZSBhIFNDU0kgY29tbWFuZAorICoJQFNDcG50OiBzY3NpIGNvbW1hbmQgcG9pbnRlcgorICoJQGRvbmU6IGNhbGxiYWNrIGZvciBjb21wbGV0aW9uCisgKgorICoJSXNzdWUgYSBzY3NpIGNvbW1hbmQgYXN5bmNocm9ub3VzbHkuIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgMSBpZgorICoJd2UgaGl0IGFuIGVycm9yIChub3JtYWxseSBtZXNzYWdlIHF1ZXVlIGNvbmdlc3Rpb24pLiBUaGUgb25seQorICoJbWlub3IgY29tcGxpY2F0aW9uIGhlcmUgaXMgdGhhdCBJMk8gZGVhbHMgd2l0aCB0aGUgZGV2aWNlIGFkZHJlc3NpbmcKKyAqCXNvIHdlIGhhdmUgdG8gbWFwIHRoZSBidXMvZGV2L2x1biBiYWNrIHRvIGFuIEkyTyBoYW5kbGUgYXMgd2VsbAorICoJYXMgZmFraW5nIGFic2VudCBkZXZpY2VzIG91cnNlbGYuCisgKgorICoJTG9ja3M6IHRha2VzIHRoZSBjb250cm9sbGVyIGxvY2sgb24gZXJyb3IgcGF0aCBvbmx5CisgKi8KKworc3RhdGljIGludCBpMm9fc2NzaV9xdWV1ZWNvbW1hbmQoc3RydWN0IHNjc2lfY21uZCAqU0NwbnQsCisJCQkJIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKKwlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHRpZDsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCXUzMiBzY3NpX2ZsYWdzLCBzZ19mbGFnczsKKwl1MzIgX19pb21lbSAqbXB0cjsKKwl1MzIgX19pb21lbSAqbGVucHRyOworCXUzMiBsZW4sIHJlcWxlbjsKKwlpbnQgaTsKKworCS8qCisJICogICAgICBEbyB0aGUgaW5jb21pbmcgcGFwZXJ3b3JrCisJICovCisKKwlpMm9fZGV2ID0gU0NwbnQtPmRldmljZS0+aG9zdGRhdGE7CisJaG9zdCA9IFNDcG50LT5kZXZpY2UtPmhvc3Q7CisJYyA9IGkyb19kZXYtPmlvcDsKKwlkZXYgPSAmYy0+cGRldi0+ZGV2OworCisJU0NwbnQtPnNjc2lfZG9uZSA9IGRvbmU7CisKKwlpZiAodW5saWtlbHkoIWkyb19kZXYpKSB7CisJCW9zbV93YXJuKCJubyBJMk8gZGV2aWNlIGluIHJlcXVlc3RcbiIpOworCQlTQ3BudC0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWRvbmUoU0NwbnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aWQgPSBpMm9fZGV2LT5sY3RfZGF0YS50aWQ7CisKKwlvc21fZGVidWcoInFjbWQ6IFRpZCA9ICUwM3hcbiIsIHRpZCk7CisJb3NtX2RlYnVnKCJSZWFsIHNjc2kgbWVzc2FnZXMuXG4iKTsKKworCS8qCisJICogICAgICBPYnRhaW4gYW4gSTJPIG1lc3NhZ2UuIElmIHRoZXJlIGFyZSBub25lIGZyZWUgdGhlbgorCSAqICAgICAgdGhyb3cgaXQgYmFjayB0byB0aGUgc2NzaSBsYXllcgorCSAqLworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisKKwkvKgorCSAqICAgICAgUHV0IHRvZ2V0aGVyIGEgc2NzaSBleGVjc2NiIG1lc3NhZ2UKKwkgKi8KKworCWxlbiA9IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW47CisKKwlzd2l0Y2ggKFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbikgeworCWNhc2UgUENJX0RNQV9OT05FOgorCQlzY3NpX2ZsYWdzID0gMHgwMDAwMDAwMDsJLy8gREFUQSBOTyBYRkVSCisJCXNnX2ZsYWdzID0gMHgwMDAwMDAwMDsKKwkJYnJlYWs7CisKKwljYXNlIFBDSV9ETUFfVE9ERVZJQ0U6CisJCXNjc2lfZmxhZ3MgPSAweDgwMDAwMDAwOwkvLyBEQVRBIE9VVCAoaW9wLS0+ZGV2KQorCQlzZ19mbGFncyA9IDB4MTQwMDAwMDA7CisJCWJyZWFrOworCisJY2FzZSBQQ0lfRE1BX0ZST01ERVZJQ0U6CisJCXNjc2lfZmxhZ3MgPSAweDQwMDAwMDAwOwkvLyBEQVRBIElOICAoaW9wPC0tZGV2KQorCQlzZ19mbGFncyA9IDB4MTAwMDAwMDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyogVW5rbm93biAtIGtpbGwgdGhlIGNvbW1hbmQgKi8KKwkJU0NwbnQtPnJlc3VsdCA9IERJRF9OT19DT05ORUNUIDw8IDE2OworCQlkb25lKFNDcG50KTsKKwkJcmV0dXJuIDA7CisJfQorCisJd3JpdGVsKEkyT19DTURfU0NTSV9FWEVDIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCB0aWQsICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19zY3NpX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKworCS8qIFdlIHdhbnQgdGhlIFNDU0kgY29udHJvbCBibG9jayBiYWNrICovCisJd3JpdGVsKGkyb19jbnR4dF9saXN0X2FkZChjLCBTQ3BudCksICZtc2ctPnUucy50Y250eHQpOworCisJLyogTFNJXzkyMF9QQ0lfUVVJUksKKwkgKgorCSAqICAgICAgSW50ZXJtaXR0YW50IG9ic2VydmF0aW9ucyBvZiBtc2cgZnJhbWUgd29yZCBkYXRhIGNvcnJ1cHRpb24KKwkgKiAgICAgIG9ic2VydmVkIG9uIG1zZ1s0XSBhZnRlcjoKKwkgKiAgICAgICAgV1JJVEUsIFJFQUQtTU9ESUZZLVdSSVRFCisJICogICAgICBvcGVyYXRpb25zLiAgMTk5OTA2MDYgLXNyYWxzdG9uCisJICoKKwkgKiAgICAgIChIZW5jZSB3ZSBidWlsZCB0aGlzIHdvcmQgdmlhIHRhZy4gSXRzIGdvb2QgcHJhY3RpY2UgYW55d2F5CisJICogICAgICAgd2UgZG9uJ3Qgd2FudCBmZXRjaGVzIG92ZXIgUENJIG5lZWRsZXNzbHkpCisJICovCisKKwkvKiBBdHRhY2ggdGFncyB0byB0aGUgZGV2aWNlcyAqLworCS8qCisJICAgaWYoU0NwbnQtPmRldmljZS0+dGFnZ2VkX3N1cHBvcnRlZCkgeworCSAgIGlmKFNDcG50LT50YWcgPT0gSEVBRF9PRl9RVUVVRV9UQUcpCisJICAgc2NzaV9mbGFncyB8PSAweDAxMDAwMDAwOworCSAgIGVsc2UgaWYoU0NwbnQtPnRhZyA9PSBPUkRFUkVEX1FVRVVFX1RBRykKKwkgICBzY3NpX2ZsYWdzIHw9IDB4MDE4MDAwMDA7CisJICAgfQorCSAqLworCisJLyogRGlyZWN0aW9uLCBkaXNjb25uZWN0IG9rLCB0YWcsIENEQkxlbiAqLworCXdyaXRlbChzY3NpX2ZsYWdzIHwgMHgyMDIwMDAwMCB8IFNDcG50LT5jbWRfbGVuLCAmbXNnLT5ib2R5WzBdKTsKKworCW1wdHIgPSAmbXNnLT5ib2R5WzFdOworCisJLyogV3JpdGUgU0NTSSBjb21tYW5kIGludG8gdGhlIG1lc3NhZ2UgLSBhbHdheXMgMTYgYnl0ZSBibG9jayAqLworCW1lbWNweV90b2lvKG1wdHIsIFNDcG50LT5jbW5kLCAxNik7CisJbXB0ciArPSA0OworCWxlbnB0ciA9IG1wdHIrKzsJLyogUmVtZW1iZXIgbWUgLSBmaWxsIGluIHdoZW4gd2Uga25vdyAqLworCisJcmVxbGVuID0gMTI7CQkvLyBTSU5HTEUgU0dFCisKKwkvKiBOb3cgZmlsbCBpbiB0aGUgU0dMaXN0IGFuZCBjb21tYW5kICovCisJaWYgKFNDcG50LT51c2Vfc2cpIHsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwkJaW50IHNnX2NvdW50OworCisJCXNnID0gU0NwbnQtPnJlcXVlc3RfYnVmZmVyOworCQlsZW4gPSAwOworCisJCXNnX2NvdW50ID0gZG1hX21hcF9zZyhkZXYsIHNnLCBTQ3BudC0+dXNlX3NnLAorCQkJCSAgICAgIFNDcG50LT5zY19kYXRhX2RpcmVjdGlvbik7CisKKwkJaWYgKHVubGlrZWx5KHNnX2NvdW50IDw9IDApKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZm9yIChpID0gU0NwbnQtPnVzZV9zZzsgaSA+IDA7IGktLSkgeworCQkJaWYgKGkgPT0gMSkKKwkJCQlzZ19mbGFncyB8PSAweEMwMDAwMDAwOworCQkJd3JpdGVsKHNnX2ZsYWdzIHwgc2dfZG1hX2xlbihzZyksIG1wdHIrKyk7CisJCQl3cml0ZWwoc2dfZG1hX2FkZHJlc3Moc2cpLCBtcHRyKyspOworCQkJbGVuICs9IHNnX2RtYV9sZW4oc2cpOworCQkJc2crKzsKKwkJfQorCisJCXJlcWxlbiA9IG1wdHIgLSAmbXNnLT51LmhlYWRbMF07CisJCXdyaXRlbChsZW4sIGxlbnB0cik7CisJfSBlbHNlIHsKKwkJbGVuID0gU0NwbnQtPnJlcXVlc3RfYnVmZmxlbjsKKworCQl3cml0ZWwobGVuLCBsZW5wdHIpOworCisJCWlmIChsZW4gPiAwKSB7CisJCQlkbWFfYWRkcl90IGRtYV9hZGRyOworCisJCQlkbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGRldiwgU0NwbnQtPnJlcXVlc3RfYnVmZmVyLAorCQkJCQkJICBTQ3BudC0+cmVxdWVzdF9idWZmbGVuLAorCQkJCQkJICBTQ3BudC0+c2NfZGF0YV9kaXJlY3Rpb24pOworCQkJaWYgKCFkbWFfYWRkcikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJU0NwbnQtPlNDcC5wdHIgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWRtYV9hZGRyOworCQkJc2dfZmxhZ3MgfD0gMHhDMDAwMDAwMDsKKwkJCXdyaXRlbChzZ19mbGFncyB8IFNDcG50LT5yZXF1ZXN0X2J1ZmZsZW4sIG1wdHIrKyk7CisJCQl3cml0ZWwoZG1hX2FkZHIsIG1wdHIrKyk7CisJCX0gZWxzZQorCQkJcmVxbGVuID0gOTsKKwl9CisKKwkvKiBTdGljayB0aGUgaGVhZGVycyBvbiAqLworCXdyaXRlbChyZXFsZW4gPDwgMTYgfCBTR0xfT0ZGU0VUXzEwLCAmbXNnLT51LmhlYWRbMF0pOworCisJLyogUXVldWUgdGhlIG1lc3NhZ2UgKi8KKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwlvc21fZGVidWcoIklzc3VlZCAlbGRcbiIsIFNDcG50LT5zZXJpYWxfbnVtYmVyKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fc2NzaV9hYm9ydCAtIGFib3J0IGEgcnVubmluZyBjb21tYW5kCisgKglAU0NwbnQ6IGNvbW1hbmQgdG8gYWJvcnQKKyAqCisgKglBc2sgdGhlIEkyTyBjb250cm9sbGVyIHRvIGFib3J0IGEgY29tbWFuZC4gVGhpcyBpcyBhbiBhc3luY2hybm91cworICoJcHJvY2VzcyBhbmQgb3VyIGNhbGxiYWNrIGhhbmRsZXIgd2lsbCBzZWUgdGhlIGNvbW1hbmQgY29tcGxldGUgd2l0aCBhbgorICoJYWJvcnRlZCBtZXNzYWdlIGlmIGl0IHN1Y2NlZWRzLgorICoKKyAqCVJldHVybnMgMCBpZiB0aGUgY29tbWFuZCBpcyBzdWNjZXNzZnVsbHkgYWJvcnRlZCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlCisgKglvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19zY3NpX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKlNDcG50KQoreworCXN0cnVjdCBpMm9fZGV2aWNlICppMm9fZGV2OworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCWludCB0aWQ7CisJaW50IHN0YXR1cyA9IEZBSUxFRDsKKworCW9zbV93YXJuKCJBYm9ydGluZyBjb21tYW5kIGJsb2NrLlxuIik7CisKKwlpMm9fZGV2ID0gU0NwbnQtPmRldmljZS0+aG9zdGRhdGE7CisJYyA9IGkyb19kZXYtPmlvcDsKKwl0aWQgPSBpMm9fZGV2LT5sY3RfZGF0YS50aWQ7CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKKworCXdyaXRlbChGSVZFX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfU0NTSV9BQk9SVCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgdGlkLAorCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOworCXdyaXRlbChpMm9fY250eHRfbGlzdF9nZXRfcHRyKGMsIFNDcG50KSwgJm1zZy0+Ym9keVswXSk7CisKKwlpZiAoaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgSTJPX1RJTUVPVVRfU0NTSV9TQ0JfQUJPUlQpKQorCQlzdGF0dXMgPSBTVUNDRVNTOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKglpMm9fc2NzaV9iaW9zX3BhcmFtCS0JSW52ZW50IGRpc2sgZ2VvbWV0cnkKKyAqCUBzZGV2OiBzY3NpIGRldmljZQorICoJQGRldjogYmxvY2sgbGF5ZXIgZGV2aWNlCisgKglAY2FwYWNpdHk6IHNpemUgaW4gc2VjdG9ycworICoJQGlwOiBnZW9tZXRyeSBhcnJheQorICoKKyAqCVRoaXMgaXMgYW55b25lcyBndWVzcyBxdWl0ZSBmcmFua2x5LiBXZSB1c2UgdGhlIHNhbWUgcnVsZXMgZXZlcnlvbmUKKyAqCWVsc2UgYXBwZWFycyB0byBhbmQgaG9wZS4gSXQgc2VlbXMgdG8gd29yay4KKyAqLworCitzdGF0aWMgaW50IGkyb19zY3NpX2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJICAgICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmRldiwgc2VjdG9yX3QgY2FwYWNpdHksCisJCQkgICAgICAgaW50ICppcCkKK3sKKwlpbnQgc2l6ZTsKKworCXNpemUgPSBjYXBhY2l0eTsKKwlpcFswXSA9IDY0OwkJLyogaGVhZHMgICAgICAgICAgICAgICAgICAgICAgICAqLworCWlwWzFdID0gMzI7CQkvKiBzZWN0b3JzICAgICAgICAgICAgICAgICAgICAgICovCisJaWYgKChpcFsyXSA9IHNpemUgPj4gMTEpID4gMTAyNCkgewkvKiBjeWxpbmRlcnMsIHRlc3QgZm9yIGJpZyBkaXNrICovCisJCWlwWzBdID0gMjU1OwkvKiBoZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICovCisJCWlwWzFdID0gNjM7CS8qIHNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaXBbMl0gPSBzaXplIC8gKDI1NSAqIDYzKTsJLyogY3lsaW5kZXJzICAgICAgICAgICAgICAgICAgICAqLworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgaTJvX3Njc2lfaG9zdF90ZW1wbGF0ZSA9IHsKKwkucHJvY19uYW1lID0gT1NNX05BTUUsCisJLm5hbWUgPSBPU01fREVTQ1JJUFRJT04sCisJLmluZm8gPSBpMm9fc2NzaV9pbmZvLAorCS5xdWV1ZWNvbW1hbmQgPSBpMm9fc2NzaV9xdWV1ZWNvbW1hbmQsCisJLmVoX2Fib3J0X2hhbmRsZXIgPSBpMm9fc2NzaV9hYm9ydCwKKwkuYmlvc19wYXJhbSA9IGkyb19zY3NpX2Jpb3NfcGFyYW0sCisJLmNhbl9xdWV1ZSA9IEkyT19TQ1NJX0NBTl9RVUVVRSwKKwkuc2dfdGFibGVzaXplID0gOCwKKwkuY21kX3Blcl9sdW4gPSA2LAorCS51c2VfY2x1c3RlcmluZyA9IEVOQUJMRV9DTFVTVEVSSU5HLAorfTsKKworLyoqCisgKglpMm9fc2NzaV9pbml0IC0gU0NTSSBPU00gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAqCisgKglSZWdpc3RlciBTQ1NJIE9TTSBpbnRvIEkyTyBjb3JlLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgaTJvX3Njc2lfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCXByaW50ayhLRVJOX0lORk8gT1NNX0RFU0NSSVBUSU9OICIgdiIgT1NNX1ZFUlNJT04gIlxuIik7CisKKwkvKiBSZWdpc3RlciBTQ1NJIE9TTSBpbnRvIEkyTyBjb3JlICovCisJcmMgPSBpMm9fZHJpdmVyX3JlZ2lzdGVyKCZpMm9fc2NzaV9kcml2ZXIpOworCWlmIChyYykgeworCQlvc21fZXJyKCJDb3VsZCBub3QgcmVnaXN0ZXIgU0NTSSBkcml2ZXJcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqCWkyb19zY3NpX2V4aXQgLSBTQ1NJIE9TTSBleGl0IGZ1bmN0aW9uCisgKgorICoJVW5yZWdpc3RlcnMgU0NTSSBPU00gZnJvbSBJMk8gY29yZS4KKyAqLworc3RhdGljIHZvaWQgX19leGl0IGkyb19zY3NpX2V4aXQodm9pZCkKK3sKKwkvKiBVbnJlZ2lzdGVyIEkyTyBTQ1NJIE9TTSBmcm9tIEkyTyBjb3JlICovCisJaTJvX2RyaXZlcl91bnJlZ2lzdGVyKCZpMm9fc2NzaV9kcml2ZXIpOworfTsKKworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBTb2Z0d2FyZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKE9TTV9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihPU01fVkVSU0lPTik7CisKK21vZHVsZV9pbml0KGkyb19zY3NpX2luaXQpOworbW9kdWxlX2V4aXQoaTJvX3Njc2lfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL2lvcC5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGM4Y2VkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9pb3AuYwpAQCAtMCwwICsxLDEzMjcgQEAKKy8qCisgKglGdW5jdGlvbnMgdG8gaGFuZGxlIEkyTyBjb250cm9sbGVycyBhbmQgSTJPIG1lc3NhZ2UgaGFuZGxpbmcKKyAqCisgKglDb3B5cmlnaHQgKEMpIDE5OTktMjAwMglSZWQgSGF0IFNvZnR3YXJlCisgKgorICoJV3JpdHRlbiBieSBBbGFuIENveCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJQSBsb3Qgb2YgdGhlIEkyTyBtZXNzYWdlIHNpZGUgY29kZSBmcm9tIHRoaXMgaXMgdGFrZW4gZnJvbSB0aGUKKyAqCVJlZCBDcmVlayBSQ1BDSTQ1IGFkYXB0ZXIgZHJpdmVyIGJ5IFJlZCBDcmVlayBDb21tdW5pY2F0aW9ucworICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlQaGlsaXBwIFJ1bXBmCisgKgkJSnVoYSBTaWV25G5lbiA8SnVoYS5TaWV2YW5lbkBjcy5IZWxzaW5raS5GST4KKyAqCQlBdXZvIEjka2tpbmVuIDxBdXZvLkhha2tpbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCURlZXBhayBTYXhlbmEgPGRlZXBha0BwbGV4aXR5Lm5ldD4KKyAqCQlCb2ppIFQgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT4KKyAqCQlBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPjoKKyAqCQkJUG9ydGVkIHRvIExpbnV4IDIuNS4KKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CisgKgkJCU1pbm9yIGZpeGVzIGZvciAyLjYuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNkZWZpbmUgT1NNX1ZFUlNJT04JIiRSZXYkIgorI2RlZmluZSBPU01fREVTQ1JJUFRJT04JIkkyTyBzdWJzeXN0ZW0iCisKKy8qIGdsb2JhbCBJMk8gY29udHJvbGxlciBsaXN0ICovCitMSVNUX0hFQUQoaTJvX2NvbnRyb2xsZXJzKTsKKworLyoKKyAqIGdsb2JhbCBJMk8gU3lzdGVtIFRhYmxlLiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhlIElPUHMgaW4gdGhlCisgKiBzeXN0ZW0uIFVzZWQgdG8gaW5mb3JtIElPUHMgYWJvdXQgZWFjaCBvdGhlcnMgZXhpc3RlbmNlLgorICovCitzdGF0aWMgc3RydWN0IGkyb19kbWEgaTJvX3N5c3RhYjsKKworc3RhdGljIGludCBpMm9faHJ0X2dldChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpOworCisvKiBNb2R1bGUgaW50ZXJuYWwgZnVuY3Rpb25zIGZyb20gb3RoZXIgc291cmNlcyAqLworZXh0ZXJuIHN0cnVjdCBpMm9fZHJpdmVyIGkyb19leGVjX2RyaXZlcjsKK2V4dGVybiBpbnQgaTJvX2V4ZWNfbGN0X2dldChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKik7CitleHRlcm4gdm9pZCBpMm9fZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaTJvX2RldmljZSAqKTsKKworZXh0ZXJuIGludCBfX2luaXQgaTJvX2RyaXZlcl9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IGkyb19kcml2ZXJfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgX19pbml0IGkyb19leGVjX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBfX2V4aXQgaTJvX2V4ZWNfZXhpdCh2b2lkKTsKK2V4dGVybiBpbnQgX19pbml0IGkyb19wY2lfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBpMm9fcGNpX2V4aXQodm9pZCk7CitleHRlcm4gaW50IGkyb19kZXZpY2VfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGkyb19kZXZpY2VfZXhpdCh2b2lkKTsKKworLyoqCisgKglpMm9fbXNnX25vcCAtIFJldHVybnMgYSBtZXNzYWdlIHdoaWNoIGlzIG5vdCB1c2VkCisgKglAYzogSTJPIGNvbnRyb2xsZXIgZnJvbSB3aGljaCB0aGUgbWVzc2FnZSB3YXMgY3JlYXRlZAorICoJQG06IG1lc3NhZ2Ugd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkCisgKgorICoJSWYgeW91IGZldGNoIGEgbWVzc2FnZSB2aWEgaTJvX21zZ19nZXQsIGFuZCBjYW4ndCB1c2UgaXQsIHlvdSBtdXN0CisgKglyZXR1cm4gdGhlIG1lc3NhZ2Ugd2l0aCB0aGlzIGZ1bmN0aW9uLiBPdGhlcndpc2UgdGhlIG1lc3NhZ2UgZnJhbWUKKyAqCWlzIGxvc3QuCisgKi8KK3ZvaWQgaTJvX21zZ19ub3Aoc3RydWN0IGkyb19jb250cm9sbGVyICpjLCB1MzIgbSkKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnID0gYy0+aW5fcXVldWUudmlydCArIG07CisKKwl3cml0ZWwoVEhSRUVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9VVElMX05PUCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKDAsICZtc2ctPnUuaGVhZFsyXSk7CisJd3JpdGVsKDAsICZtc2ctPnUuaGVhZFszXSk7CisJaTJvX21zZ19wb3N0KGMsIG0pOworfTsKKworLyoqCisgKglpMm9fbXNnX2dldF93YWl0IC0gb2J0YWluIGFuIEkyTyBtZXNzYWdlIGZyb20gdGhlIElPUAorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKglAbXNnOiBwb2ludGVyIHRvIGEgSTJPIG1lc3NhZ2UgcG9pbnRlcgorICoJQHdhaXQ6IGhvdyBsb25nIHRvIHdhaXQgdW50aWwgdGltZW91dAorICoKKyAqCVRoaXMgZnVuY3Rpb24gd2FpdHMgdXAgdG8gd2FpdCBzZWNvbmRzIGZvciBhIG1lc3NhZ2Ugc2xvdCB0byBiZQorICoJYXZhaWxhYmxlLgorICoKKyAqCU9uIGEgc3VjY2VzcyB0aGUgbWVzc2FnZSBpcyByZXR1cm5lZCBhbmQgdGhlIHBvaW50ZXIgdG8gdGhlIG1lc3NhZ2UgaXMKKyAqCXNldCBpbiBtc2cuIFRoZSByZXR1cm5lZCBtZXNzYWdlIGlzIHRoZSBwaHlzaWNhbCBwYWdlIGZyYW1lIG9mZnNldAorICoJYWRkcmVzcyBmcm9tIHRoZSByZWFkIHBvcnQgKHNlZSB0aGUgaTJvIHNwZWMpLiBJZiBubyBtZXNzYWdlIGlzCisgKglhdmFpbGFibGUgcmV0dXJucyBJMk9fUVVFVUVfRU1QVFkgYW5kIG1zZyBpcyBsZWF2ZWQgdW50b3VjaGVkLgorICovCit1MzIgaTJvX21zZ19nZXRfd2FpdChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICoqbXNnLAorCQkgICAgIGludCB3YWl0KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyB3YWl0ICogSFo7CisJdTMyIG07CisKKwl3aGlsZSAoKG0gPSBpMm9fbXNnX2dldChjLCBtc2cpKSA9PSBJMk9fUVVFVUVfRU1QVFkpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByX2RlYnVnKCIlczogVGltZW91dCB3YWl0aW5nIGZvciBtZXNzYWdlIGZyYW1lLlxuIiwKKwkJCQkgYy0+bmFtZSk7CisJCQlyZXR1cm4gSTJPX1FVRVVFX0VNUFRZOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKwl9CisKKwlyZXR1cm4gbTsKK307CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisvKioKKyAqICAgICAgaTJvX2NudHh0X2xpc3RfYWRkIC0gQXBwZW5kIGEgcG9pbnRlciB0byBjb250ZXh0IGxpc3QgYW5kIHJldHVybiBhIGlkCisgKglAYzogY29udHJvbGxlciB0byB3aGljaCB0aGUgY29udGV4dCBsaXN0IGJlbG9uZworICoJQHB0cjogcG9pbnRlciB0byBhZGQgdG8gdGhlIGNvbnRleHQgbGlzdAorICoKKyAqCUJlY2F1c2UgdGhlIGNvbnRleHQgZmllbGQgaW4gSTJPIGlzIG9ubHkgMzItYml0IGxhcmdlLCBvbiA2NC1iaXQgdGhlCisgKglwb2ludGVyIGlzIHRvIGxhcmdlIHRvIGZpdCBpbiB0aGUgY29udGV4dCBmaWVsZC4gVGhlIGkyb19jbnR4dF9saXN0CisgKglmdW5jdGlvbnMgdGhlcmVmb3JlIG1hcCBwb2ludGVycyB0byBjb250ZXh0IGZpZWxkcy4KKyAqCisgKglSZXR1cm5zIGNvbnRleHQgaWQgPiAwIG9uIHN1Y2Nlc3Mgb3IgMCBvbiBmYWlsdXJlLgorICovCit1MzIgaTJvX2NudHh0X2xpc3RfYWRkKHN0cnVjdCBpMm9fY29udHJvbGxlciAqIGMsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRleHRfbGlzdF9lbGVtZW50ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFwdHIpCisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNvdWxkbid0IGFkZCBOVUxMIHBvaW50ZXIgdG8gY29udGV4dCBsaXN0ISIKKwkJICAgICAgICJcbiIsIGMtPm5hbWUpOworCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWVudHJ5KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRleHQgIgorCQkgICAgICAgImxpc3QgZWxlbWVudFxuIiwgYy0+bmFtZSk7CisJCXJldHVybiAwOworCX0KKworCWVudHJ5LT5wdHIgPSBwdHI7CisJZW50cnktPnRpbWVzdGFtcCA9IGppZmZpZXM7CisJSU5JVF9MSVNUX0hFQUQoJmVudHJ5LT5saXN0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT5jb250ZXh0X2xpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KGF0b21pY19pbmNfYW5kX3Rlc3QoJmMtPmNvbnRleHRfbGlzdF9jb3VudGVyKSkpCisJCWF0b21pY19pbmMoJmMtPmNvbnRleHRfbGlzdF9jb3VudGVyKTsKKworCWVudHJ5LT5jb250ZXh0ID0gYXRvbWljX3JlYWQoJmMtPmNvbnRleHRfbGlzdF9jb3VudGVyKTsKKworCWxpc3RfYWRkKCZlbnRyeS0+bGlzdCwgJmMtPmNvbnRleHRfbGlzdCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5jb250ZXh0X2xpc3RfbG9jaywgZmxhZ3MpOworCisJcHJfZGVidWcoIiVzOiBBZGQgY29udGV4dCB0byBsaXN0ICVwIC0+ICVkXG4iLCBjLT5uYW1lLCBwdHIsIGNvbnRleHQpOworCisJcmV0dXJuIGVudHJ5LT5jb250ZXh0OworfTsKKworLyoqCisgKiAgICAgIGkyb19jbnR4dF9saXN0X3JlbW92ZSAtIFJlbW92ZSBhIHBvaW50ZXIgZnJvbSB0aGUgY29udGV4dCBsaXN0CisgKglAYzogY29udHJvbGxlciB0byB3aGljaCB0aGUgY29udGV4dCBsaXN0IGJlbG9uZworICoJQHB0cjogcG9pbnRlciB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb250ZXh0IGxpc3QKKyAqCisgKglSZW1vdmVzIGEgcHJldmlvdXNseSBhZGRlZCBwb2ludGVyIGZyb20gdGhlIGNvbnRleHQgbGlzdCBhbmQgcmV0dXJucworICoJdGhlIG1hdGNoaW5nIGNvbnRleHQgaWQuCisgKgorICoJUmV0dXJucyBjb250ZXh0IGlkIG9uIHN1Y2NlcyBvciAwIG9uIGZhaWx1cmUuCisgKi8KK3UzMiBpMm9fY250eHRfbGlzdF9yZW1vdmUoc3RydWN0IGkyb19jb250cm9sbGVyICogYywgdm9pZCAqcHRyKQoreworCXN0cnVjdCBpMm9fY29udGV4dF9saXN0X2VsZW1lbnQgKmVudHJ5OworCXUzMiBjb250ZXh0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmMtPmNvbnRleHRfbGlzdCwgbGlzdCkKKwkgICAgaWYgKGVudHJ5LT5wdHIgPT0gcHRyKSB7CisJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJCWNvbnRleHQgPSBlbnRyeS0+Y29udGV4dDsKKwkJa2ZyZWUoZW50cnkpOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+Y29udGV4dF9saXN0X2xvY2ssIGZsYWdzKTsKKworCWlmICghY29udGV4dCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCByZW1vdmUgbm9uZXhpc3RlbnQgcHRyICIKKwkJICAgICAgICIlcFxuIiwgYy0+bmFtZSwgcHRyKTsKKworCXByX2RlYnVnKCIlczogcmVtb3ZlIHB0ciBmcm9tIGNvbnRleHQgbGlzdCAlZCAtPiAlcFxuIiwgYy0+bmFtZSwKKwkJIGNvbnRleHQsIHB0cik7CisKKwlyZXR1cm4gY29udGV4dDsKK307CisKKy8qKgorICogICAgICBpMm9fY250eHRfbGlzdF9nZXQgLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIGNvbnRleHQgbGlzdCBhbmQgcmVtb3ZlIGl0CisgKglAYzogY29udHJvbGxlciB0byB3aGljaCB0aGUgY29udGV4dCBsaXN0IGJlbG9uZworICoJQGNvbnRleHQ6IGNvbnRleHQgaWQgdG8gd2hpY2ggdGhlIHBvaW50ZXIgYmVsb25nCisgKgorICoJUmV0dXJucyBwb2ludGVyIHRvIHRoZSBtYXRjaGluZyBjb250ZXh0IGlkIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBvbgorICoJZmFpbHVyZS4KKyAqLwordm9pZCAqaTJvX2NudHh0X2xpc3RfZ2V0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYywgdTMyIGNvbnRleHQpCit7CisJc3RydWN0IGkyb19jb250ZXh0X2xpc3RfZWxlbWVudCAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICpwdHIgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmMtPmNvbnRleHRfbGlzdCwgbGlzdCkKKwkgICAgaWYgKGVudHJ5LT5jb250ZXh0ID09IGNvbnRleHQpIHsKKwkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJcHRyID0gZW50cnktPnB0cjsKKwkJa2ZyZWUoZW50cnkpOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+Y29udGV4dF9saXN0X2xvY2ssIGZsYWdzKTsKKworCWlmICghcHRyKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY29udGV4dCBpZCAlZCBub3QgZm91bmRcbiIsIGMtPm5hbWUsCisJCSAgICAgICBjb250ZXh0KTsKKworCXByX2RlYnVnKCIlczogZ2V0IHB0ciBmcm9tIGNvbnRleHQgbGlzdCAlZCAtPiAlcFxuIiwgYy0+bmFtZSwgY29udGV4dCwKKwkJIHB0cik7CisKKwlyZXR1cm4gcHRyOworfTsKKworLyoqCisgKiAgICAgIGkyb19jbnR4dF9saXN0X2dldF9wdHIgLSBHZXQgYSBjb250ZXh0IGlkIGZyb20gdGhlIGNvbnRleHQgbGlzdAorICoJQGM6IGNvbnRyb2xsZXIgdG8gd2hpY2ggdGhlIGNvbnRleHQgbGlzdCBiZWxvbmcKKyAqCUBwdHI6IHBvaW50ZXIgdG8gd2hpY2ggdGhlIGNvbnRleHQgaWQgc2hvdWxkIGJlIGZldGNoZWQKKyAqCisgKglSZXR1cm5zIGNvbnRleHQgaWQgd2hpY2ggbWF0Y2hlcyB0byB0aGUgcG9pbnRlciBvbiBzdWNjZXMgb3IgMCBvbgorICoJZmFpbHVyZS4KKyAqLwordTMyIGkyb19jbnR4dF9saXN0X2dldF9wdHIoc3RydWN0IGkyb19jb250cm9sbGVyICogYywgdm9pZCAqcHRyKQoreworCXN0cnVjdCBpMm9fY29udGV4dF9saXN0X2VsZW1lbnQgKmVudHJ5OworCXUzMiBjb250ZXh0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmMtPmNvbnRleHRfbGlzdCwgbGlzdCkKKwkgICAgaWYgKGVudHJ5LT5wdHIgPT0gcHRyKSB7CisJCWNvbnRleHQgPSBlbnRyeS0+Y29udGV4dDsKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPmNvbnRleHRfbGlzdF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIWNvbnRleHQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgZmluZCBub25leGlzdGVudCBwdHIgIgorCQkgICAgICAgIiVwXG4iLCBjLT5uYW1lLCBwdHIpOworCisJcHJfZGVidWcoIiVzOiBnZXQgY29udGV4dCBpZCBmcm9tIGNvbnRleHQgbGlzdCAlcCAtPiAlZFxuIiwgYy0+bmFtZSwKKwkJIHB0ciwgY29udGV4dCk7CisKKwlyZXR1cm4gY29udGV4dDsKK307CisjZW5kaWYKKworLyoqCisgKglpMm9faW9wX2ZpbmQgLSBGaW5kIGFuIEkyTyBjb250cm9sbGVyIGJ5IGlkCisgKglAdW5pdDogdW5pdCBudW1iZXIgb2YgdGhlIEkyTyBjb250cm9sbGVyIHRvIHNlYXJjaCBmb3IKKyAqCisgKglMb29rdXAgdGhlIEkyTyBjb250cm9sbGVyIG9uIHRoZSBjb250cm9sbGVyIGxpc3QuCisgKgorICoJUmV0dXJucyBwb2ludGVyIHRvIHRoZSBJMk8gY29udHJvbGxlciBvbiBzdWNjZXNzIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICovCitzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmkyb19maW5kX2lvcChpbnQgdW5pdCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZpMm9fY29udHJvbGxlcnMsIGxpc3QpIHsKKwkJaWYgKGMtPnVuaXQgPT0gdW5pdCkKKwkJCXJldHVybiBjOworCX0KKworCXJldHVybiBOVUxMOworfTsKKworLyoqCisgKglpMm9faW9wX2ZpbmRfZGV2aWNlIC0gRmluZCBhIEkyTyBkZXZpY2Ugb24gYW4gSTJPIGNvbnRyb2xsZXIKKyAqCUBjOiBJMk8gY29udHJvbGxlciB3aGVyZSB0aGUgSTJPIGRldmljZSBoYW5ncyBvbgorICoJQHRpZDogVElEIG9mIHRoZSBJMk8gZGV2aWNlIHRvIHNlYXJjaCBmb3IKKyAqCisgKglTZWFyY2hlcyB0aGUgZGV2aWNlcyBvZiB0aGUgSTJPIGNvbnRyb2xsZXIgZm9yIGEgZGV2aWNlIHdpdGggVElEIHRpZCBhbmQKKyAqCXJldHVybnMgaXQuCisgKgorICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEkyTyBkZXZpY2UgaWYgZm91bmQsIG90aGVyd2lzZSBOVUxMLgorICovCitzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2lvcF9maW5kX2RldmljZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsIHUxNiB0aWQpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYy0+ZGV2aWNlcywgbGlzdCkKKwkgICAgaWYgKGRldi0+bGN0X2RhdGEudGlkID09IHRpZCkKKwkJcmV0dXJuIGRldjsKKworCXJldHVybiBOVUxMOworfTsKKworLyoqCisgKglpMm9fcXVpZXNjZV9jb250cm9sbGVyIC0gcXVpZXNjZSBjb250cm9sbGVyCisgKglAYzogY29udHJvbGxlcgorICoKKyAqCVF1aWVzY2UgYW4gSU9QLiBDYXVzZXMgSU9QIHRvIG1ha2UgZXh0ZXJuYWwgb3BlcmF0aW9uIHF1aWVzY2VudAorICoJKGkybyAnUkVBRFknIHN0YXRlKS4gSW50ZXJuYWwgb3BlcmF0aW9uIG9mIHRoZSBJT1AgY29udGludWVzIG5vcm1hbGx5LgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9faW9wX3F1aWVzY2Uoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKwlpbnQgcmM7CisKKwlpMm9fc3RhdHVzX2dldChjKTsKKworCS8qIFN5c1F1aWVzY2UgZGlzY2FyZGVkIGlmIElPUCBub3QgaW4gUkVBRFkgb3IgT1BFUkFUSU9OQUwgc3RhdGUgKi8KKwlpZiAoKHNiLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9SRUFEWSkgJiYKKwkgICAgKHNiLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9PUEVSQVRJT05BTCkpCisJCXJldHVybiAwOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRk9VUl9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1NZU19RVUlFU0NFIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKworCS8qIExvbmcgdGltZW91dCBuZWVkZWQgZm9yIHF1aWVzY2UgaWYgbG90cyBvZiBkZXZpY2VzICovCisJaWYgKChyYyA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDI0MCkpKQorCQlwcmludGsoS0VSTl9JTkZPICIlczogVW5hYmxlIHRvIHF1aWVzY2UgKHN0YXR1cz0lI3gpLlxuIiwKKwkJICAgICAgIGMtPm5hbWUsIC1yYyk7CisJZWxzZQorCQlwcl9kZWJ1ZygiJXM6IFF1aWVzY2VkLlxuIiwgYy0+bmFtZSk7CisKKwlpMm9fc3RhdHVzX2dldChjKTsJLy8gRW50ZXJlZCBSRUFEWSBzdGF0ZQorCisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKglpMm9faW9wX2VuYWJsZSAtIG1vdmUgY29udHJvbGxlciBmcm9tIHJlYWR5IHRvIE9QRVJBVElPTkFMCisgKglAYzogSTJPIGNvbnRyb2xsZXIKKyAqCisgKglFbmFibGUgSU9QLiBUaGlzIGFsbG93cyB0aGUgSU9QIHRvIHJlc3VtZSBleHRlcm5hbCBvcGVyYXRpb25zIGFuZAorICoJcmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiBhIHF1aWVzY2UuIFJldHVybnMgemVybyBvciBhbiBlcnJvciBjb2RlIGlmCisgKglhbiBlcnJvciBvY2N1cnMuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2lvcF9lbmFibGUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKwlpbnQgcmM7CisKKwlpMm9fc3RhdHVzX2dldChjKTsKKworCS8qIEVuYWJsZSBvbmx5IGFsbG93ZWQgb24gUkVBRFkgc3RhdGUgKi8KKwlpZiAoc2ItPmlvcF9zdGF0ZSAhPSBBREFQVEVSX1NUQVRFX1JFQURZKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEZPVVJfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKKwl3cml0ZWwoSTJPX0NNRF9TWVNfRU5BQkxFIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKworCS8qIEhvdyBsb25nIG9mIGEgdGltZW91dCBkbyB3ZSBuZWVkPyAqLworCWlmICgocmMgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCAyNDApKSkKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ291bGQgbm90IGVuYWJsZSAoc3RhdHVzPSUjeCkuXG4iLAorCQkgICAgICAgYy0+bmFtZSwgLXJjKTsKKwllbHNlCisJCXByX2RlYnVnKCIlczogRW5hYmxlZC5cbiIsIGMtPm5hbWUpOworCisJaTJvX3N0YXR1c19nZXQoYyk7CS8vIGVudGVyZWQgT1BFUkFUSU9OQUwgc3RhdGUKKworCXJldHVybiByYzsKK307CisKKy8qKgorICoJaTJvX2lvcF9xdWllc2NlX2FsbCAtIFF1aWVzY2UgYWxsIEkyTyBjb250cm9sbGVycyBvbiB0aGUgc3lzdGVtCisgKgorICoJUXVpZXNjZSBhbGwgSTJPIGNvbnRyb2xsZXJzIHdoaWNoIGFyZSBjb25uZWN0ZWQgdG8gdGhlIHN5c3RlbS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGkyb19pb3BfcXVpZXNjZV9hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgdG1wLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KSB7CisJCWlmICghYy0+bm9fcXVpZXNjZSkKKwkJCWkyb19pb3BfcXVpZXNjZShjKTsKKwl9Cit9OworCisvKioKKyAqCWkyb19pb3BfZW5hYmxlX2FsbCAtIEVuYWJsZXMgYWxsIGNvbnRyb2xsZXJzIG9uIHRoZSBzeXN0ZW0KKyAqCisgKglFbmFibGVzIGFsbCBJMk8gY29udHJvbGxlcnMgd2hpY2ggYXJlIGNvbm5lY3RlZCB0byB0aGUgc3lzdGVtLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaTJvX2lvcF9lbmFibGVfYWxsKHZvaWQpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIHRtcCwgJmkyb19jb250cm9sbGVycywgbGlzdCkKKwkgICAgaTJvX2lvcF9lbmFibGUoYyk7Cit9OworCisvKioKKyAqCWkyb19jbGVhcl9jb250cm9sbGVyIC0gQnJpbmcgSTJPIGNvbnRyb2xsZXIgaW50byBIT0xEIHN0YXRlCisgKglAYzogY29udHJvbGxlcgorICoKKyAqCUNsZWFyIGFuIElPUCB0byBIT0xEIHN0YXRlLCBpZS4gdGVybWluYXRlIGV4dGVybmFsIG9wZXJhdGlvbnMsIGNsZWFyIGFsbAorICoJaW5wdXQgcXVldWVzIGFuZCBwcmVwYXJlIGZvciBhIHN5c3RlbSByZXN0YXJ0LiBJT1AncyBpbnRlcm5hbCBvcGVyYXRpb24KKyAqCWNvbnRpbnVlcyBub3JtYWxseSBhbmQgdGhlIG91dGJvdW5kIHF1ZXVlIGlzIGFsaXZlLiBUaGUgSU9QIGlzIG5vdAorICoJZXhwZWN0ZWQgdG8gcmVidWlsZCBpdHMgTENULgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9faW9wX2NsZWFyKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCWludCByYzsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJLyogUXVpZXNjZSBhbGwgSU9QcyBmaXJzdCAqLworCWkyb19pb3BfcXVpZXNjZV9hbGwoKTsKKworCXdyaXRlbChGT1VSX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfQURBUFRFUl9DTEVBUiA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisKKwlpZiAoKHJjID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgMzApKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFVuYWJsZSB0byBjbGVhciAoc3RhdHVzPSUjeCkuXG4iLAorCQkgICAgICAgYy0+bmFtZSwgLXJjKTsKKwllbHNlCisJCXByX2RlYnVnKCIlczogQ2xlYXJlZC5cbiIsIGMtPm5hbWUpOworCisJLyogRW5hYmxlIGFsbCBJT1BzICovCisJaTJvX2lvcF9lbmFibGVfYWxsKCk7CisKKwlpMm9fc3RhdHVzX2dldChjKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKglpMm9faW9wX3Jlc2V0IC0gcmVzZXQgYW4gSTJPIGNvbnRyb2xsZXIKKyAqCUBjOiBjb250cm9sbGVyIHRvIHJlc2V0CisgKgorICoJUmVzZXQgdGhlIElPUCBpbnRvIElOSVQgc3RhdGUgYW5kIHdhaXQgdW50aWwgSU9QIGdldHMgaW50byBSRVNFVCBzdGF0ZS4KKyAqCVRlcm1pbmF0ZSBhbGwgZXh0ZXJuYWwgb3BlcmF0aW9ucywgY2xlYXIgSU9QJ3MgaW5ib3VuZCBhbmQgb3V0Ym91bmQKKyAqCXF1ZXVlcywgdGVybWluYXRlIGFsbCBERE1zLCBhbmQgcmVsb2FkIHRoZSBJT1AncyBvcGVyYXRpbmcgZW52aXJvbm1lbnQKKyAqCWFuZCBhbGwgbG9jYWwgRERNcy4gVGhlIElPUCByZWJ1aWxkcyBpdHMgTENULgorICovCitzdGF0aWMgaW50IGkyb19pb3BfcmVzZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXU4ICpzdGF0dXMgPSBjLT5zdGF0dXMudmlydDsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpMm9fc3RhdHVzX2Jsb2NrICpzYiA9IGMtPnN0YXR1c19ibG9jay52aXJ0OworCWludCByYyA9IDA7CisKKwlwcl9kZWJ1ZygiJXM6IFJlc2V0dGluZyBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJbWVtc2V0KHN0YXR1cywgMCwgOCk7CisKKwkvKiBRdWllc2NlIGFsbCBJT1BzIGZpcnN0ICovCisJaTJvX2lvcF9xdWllc2NlX2FsbCgpOworCisJd3JpdGVsKEVJR0hUX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfQURBUFRFUl9SRVNFVCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19leGVjX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3cml0ZWwoMCwgJm1zZy0+dS5zLnRjbnR4dCk7CS8vRklYTUU6IHVzZSByZWFzb25hYmxlIHRyYW5zYWN0aW9uIGNvbnRleHQKKwl3cml0ZWwoMCwgJm1zZy0+Ym9keVswXSk7CisJd3JpdGVsKDAsICZtc2ctPmJvZHlbMV0pOworCXdyaXRlbChpMm9fcHRyX2xvdygodm9pZCAqKWMtPnN0YXR1cy5waHlzKSwgJm1zZy0+Ym9keVsyXSk7CisJd3JpdGVsKGkyb19wdHJfaGlnaCgodm9pZCAqKWMtPnN0YXR1cy5waHlzKSwgJm1zZy0+Ym9keVszXSk7CisKKwlpMm9fbXNnX3Bvc3QoYywgbSk7CisKKwkvKiBXYWl0IGZvciBhIHJlcGx5ICovCisJdGltZW91dCA9IGppZmZpZXMgKyBJMk9fVElNRU9VVF9SRVNFVCAqIEhaOworCXdoaWxlICghKnN0YXR1cykgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSU9QIHJlc2V0IHRpbWVvdXQuXG4iLCBjLT5uYW1lKTsKKwkJCXJjID0gLUVUSU1FRE9VVDsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCS8qIFByb21pc2UgYnVnICovCisJCWlmIChzdGF0dXNbMV0gfHwgc3RhdHVzWzRdKSB7CisJCQkqc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCisJCXJtYigpOworCX0KKworCWlmICgqc3RhdHVzID09IEkyT19DTURfSU5fUFJPR1JFU1MpIHsKKwkJLyoKKwkJICogT25jZSB0aGUgcmVzZXQgaXMgc2VudCwgdGhlIElPUCBnb2VzIGludG8gdGhlIElOSVQgc3RhdGUKKwkJICogd2hpY2ggaXMgaW5kZXRlcm1pbmF0ZS4gIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgSU9QCisJCSAqIGhhcyByZWJvb3RlZCBiZWZvcmUgd2UgY2FuIGxldCB0aGUgc3lzdGVtIHRhbGsgdG8KKwkJICogaXQuIFdlIHJlYWQgdGhlIGluYm91bmQgRnJlZV9MaXN0IHVudGlsIGEgbWVzc2FnZSBpcworCQkgKiBhdmFpbGFibGUuIElmIHdlIGNhbid0IHJlYWQgb25lIGluIHRoZSBnaXZlbiBhbW1vdW50IG9mCisJCSAqIHRpbWUsIHdlIGFzc3VtZSB0aGUgSU9QIGNvdWxkIG5vdCByZWJvb3QgcHJvcGVybHkuCisJCSAqLworCQlwcl9kZWJ1ZygiJXM6IFJlc2V0IGluIHByb2dyZXNzLCB3YWl0aW5nIGZvciByZWJvb3QuLi5cbiIsCisJCQkgYy0+bmFtZSk7CisKKwkJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfUkVTRVQpOworCQl3aGlsZSAobSA9PSBJMk9fUVVFVUVfRU1QVFkpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogSU9QIHJlc2V0IHRpbWVvdXQuXG4iLAorCQkJCSAgICAgICBjLT5uYW1lKTsKKwkJCQlyYyA9IC1FVElNRURPVVQ7CisJCQkJZ290byBleGl0OworCQkJfQorCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKKworCQkJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfUkVTRVQpOworCQl9CisJCWkyb19tc2dfbm9wKGMsIG0pOworCX0KKworCS8qIGZyb20gaGVyZSBhbGwgcXVpZXNjZSBjb21tYW5kcyBhcmUgc2FmZSAqLworCWMtPm5vX3F1aWVzY2UgPSAwOworCisJLyogSWYgSW9wUmVzZXQgd2FzIHJlamVjdGVkIG9yIGRpZG4ndCBwZXJmb3JtIHJlc2V0LCB0cnkgSW9wQ2xlYXIgKi8KKwlpMm9fc3RhdHVzX2dldChjKTsKKwlpZiAoKnN0YXR1cyA9PSBJMk9fQ01EX1JFSkVDVEVEIHx8IHNiLT5pb3Bfc3RhdGUgIT0gQURBUFRFUl9TVEFURV9SRVNFVCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogUmVzZXQgcmVqZWN0ZWQsIHRyeWluZyB0byBjbGVhclxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCQlpMm9faW9wX2NsZWFyKGMpOworCX0gZWxzZQorCQlwcl9kZWJ1ZygiJXM6IFJlc2V0IGNvbXBsZXRlZC5cbiIsIGMtPm5hbWUpOworCisgICAgICBleGl0OgorCS8qIEVuYWJsZSBhbGwgSU9QcyAqLworCWkyb19pb3BfZW5hYmxlX2FsbCgpOworCisJcmV0dXJuIHJjOworfTsKKworLyoqCisgKglpMm9faW9wX2luaXRfb3V0Ym91bmRfcXVldWUgLSBzZXR1cCB0aGUgb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJQ2xlYXIgYW5kIChyZSlpbml0aWFsaXplIElPUCdzIG91dGJvdW5kIHF1ZXVlIGFuZCBwb3N0IHRoZSBtZXNzYWdlCisgKglmcmFtZXMgdG8gdGhlIElPUC4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9faW9wX2luaXRfb3V0Ym91bmRfcXVldWUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXU4ICpzdGF0dXMgPSBjLT5zdGF0dXMudmlydDsKKwl1MzIgbTsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXVsb25nIHRpbWVvdXQ7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiJXM6IEluaXRpYWxpemluZyBPdXRib3VuZCBRdWV1ZS4uLlxuIiwgYy0+bmFtZSk7CisKKwltZW1zZXQoc3RhdHVzLCAwLCA0KTsKKworCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKKwlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCXJldHVybiAtRVRJTUVET1VUOworCisJd3JpdGVsKEVJR0hUX1dPUkRfTVNHX1NJWkUgfCBUUkxfT0ZGU0VUXzYsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfT1VUQk9VTkRfSU5JVCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19leGVjX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3cml0ZWwoMHgwMTA2LCAmbXNnLT51LnMudGNudHh0KTsJLyogRklYTUU6IHdoeSAweDAxMDYsIG1heWJlIGluCisJCQkJCQkgICBTcGVjPyAqLworCXdyaXRlbChQQUdFX1NJWkUsICZtc2ctPmJvZHlbMF0pOworCXdyaXRlbChNU0dfRlJBTUVfU0laRSA8PCAxNiB8IDB4ODAsICZtc2ctPmJvZHlbMV0pOwkvKiBPdXRib3VuZCBtc2cgZnJhbWUKKwkJCQkJCQkJICAgc2l6ZSBpbiB3b3JkcyBhbmQgSW5pdGNvZGUgKi8KKwl3cml0ZWwoMHhkMDAwMDAwNCwgJm1zZy0+Ym9keVsyXSk7CisJd3JpdGVsKGkyb19wdHJfbG93KCh2b2lkICopYy0+c3RhdHVzLnBoeXMpLCAmbXNnLT5ib2R5WzNdKTsKKwl3cml0ZWwoaTJvX3B0cl9oaWdoKCh2b2lkICopYy0+c3RhdHVzLnBoeXMpLCAmbXNnLT5ib2R5WzRdKTsKKworCWkyb19tc2dfcG9zdChjLCBtKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgSTJPX1RJTUVPVVRfSU5JVF9PVVRCT1VORF9RVUVVRSAqIEhaOworCXdoaWxlICgqc3RhdHVzIDw9IEkyT19DTURfSU5fUFJPR1JFU1MpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBUaW1lb3V0IEluaXRpYWxpemluZ1xuIiwKKwkJCSAgICAgICBjLT5uYW1lKTsKKwkJCXJldHVybiAtRVRJTUVET1VUOworCQl9CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgxKTsKKworCQlybWIoKTsKKwl9CisKKwltID0gYy0+b3V0X3F1ZXVlLnBoeXM7CisKKwkvKiBQb3N0IGZyYW1lcyAqLworCWZvciAoaSA9IDA7IGkgPCBOTUJSX01TR19GUkFNRVM7IGkrKykgeworCQlpMm9fZmx1c2hfcmVwbHkoYywgbSk7CisJCXVkZWxheSgxKTsJLyogUHJvbWlzZSAqLworCQltICs9IE1TR19GUkFNRV9TSVpFICogNDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9faW9wX3NlbmRfbm9wIC0gc2VuZCBhIGNvcmUgTk9QIG1lc3NhZ2UKKyAqCUBjOiBjb250cm9sbGVyCisgKgorICoJU2VuZCBhIG5vLW9wZXJhdGlvbiBtZXNzYWdlIHdpdGggYSByZXBseSBzZXQgdG8gY2F1c2Ugbm8KKyAqCWFjdGlvbiBlaXRoZXIuIE5lZWRlZCBmb3IgYnJpbmdpbmcgdXAgcHJvbWlzZSBjb250cm9sbGVycy4KKyAqLworc3RhdGljIGludCBpMm9faW9wX3NlbmRfbm9wKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBIWik7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwlpMm9fbXNnX25vcChjLCBtKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglpMm9faW9wX2FjdGl2YXRlIC0gQnJpbmcgY29udHJvbGxlciB1cCB0byBIT0xECisgKglAYzogY29udHJvbGxlcgorICoKKyAqCVRoaXMgZnVuY3Rpb24gYnJpbmdzIGFuIEkyTyBjb250cm9sbGVyIGludG8gSE9MRCBzdGF0ZS4gVGhlIGFkYXB0ZXIKKyAqCWlzIHJlc2V0IGlmIG5lY2Vzc2FyeSBhbmQgdGhlbiB0aGUgcXVldWVzIGFuZCByZXNvdXJjZSB0YWJsZSBhcmUgcmVhZC4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2lvcF9hY3RpdmF0ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IHBjaV9kZXYgKmk5NjAgPSBOVUxMOworCWkyb19zdGF0dXNfYmxvY2sgKnNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CisJaW50IHJjOworCisJaWYgKGMtPnByb21pc2UpIHsKKwkJLyogQmVhdCB1cCB0aGUgaGFyZHdhcmUgZmlyc3Qgb2YgYWxsICovCisJCWk5NjAgPQorCQkgICAgcGNpX2ZpbmRfc2xvdChjLT5wZGV2LT5idXMtPm51bWJlciwKKwkJCQkgIFBDSV9ERVZGTihQQ0lfU0xPVChjLT5wZGV2LT5kZXZmbiksIDApKTsKKwkJaWYgKGk5NjApCisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaTk2MCwgMHg0MiwgMCk7CisKKwkJLyogRm9sbG93IHRoaXMgc2VxdWVuY2UgcHJlY2lzZWx5IG9yIHRoZSBjb250cm9sbGVyCisJCSAgIGNlYXNlcyB0byBwZXJmb3JtIHVzZWZ1bCBmdW5jdGlvbnMgdW50aWwgcmVib290ICovCisJCWlmICgocmMgPSBpMm9faW9wX3NlbmRfbm9wKGMpKSkKKwkJCXJldHVybiByYzsKKworCQlpZiAoKHJjID0gaTJvX2lvcF9yZXNldChjKSkpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogSW4gSU5JVCBzdGF0ZSwgV2FpdCBJbmJvdW5kIFEgdG8gaW5pdGlhbGl6ZSAoaW4gaTJvX3N0YXR1c19nZXQpICovCisJLyogSW4gUkVBRFkgc3RhdGUsIEdldCBzdGF0dXMgKi8KKworCXJjID0gaTJvX3N0YXR1c19nZXQoYyk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbmFibGUgdG8gb2J0YWluIHN0YXR1cywgIgorCQkgICAgICAgImF0dGVtcHRpbmcgYSByZXNldC5cbiIsIGMtPm5hbWUpOworCQlpZiAoaTJvX2lvcF9yZXNldChjKSkKKwkJCXJldHVybiByYzsKKwl9CisKKwlpZiAoc2ItPmkyb192ZXJzaW9uID4gSTJPVkVSMTUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogTm90IHJ1bm5pbmcgdmVyc2lvbiAxLjUgb2YgdGhlIEkyTyAiCisJCSAgICAgICAiU3BlY2lmaWNhdGlvbi5cbiIsIGMtPm5hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzd2l0Y2ggKHNiLT5pb3Bfc3RhdGUpIHsKKwljYXNlIEFEQVBURVJfU1RBVEVfRkFVTFRFRDoKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiJXM6IGhhcmR3YXJlIGZhdWx0XG4iLCBjLT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXNlIEFEQVBURVJfU1RBVEVfUkVBRFk6CisJY2FzZSBBREFQVEVSX1NUQVRFX09QRVJBVElPTkFMOgorCWNhc2UgQURBUFRFUl9TVEFURV9IT0xEOgorCWNhc2UgQURBUFRFUl9TVEFURV9GQUlMRUQ6CisJCXByX2RlYnVnKCIlczogYWxyZWFkeSBydW5uaW5nLCB0cnlpbmcgdG8gcmVzZXQuLi5cbiIsIGMtPm5hbWUpOworCQlpZiAoaTJvX2lvcF9yZXNldChjKSkKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXJjID0gaTJvX2lvcF9pbml0X291dGJvdW5kX3F1ZXVlKGMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKGMtPnByb21pc2UpIHsKKwkJaWYgKChyYyA9IGkyb19pb3Bfc2VuZF9ub3AoYykpKQorCQkJcmV0dXJuIHJjOworCisJCWlmICgocmMgPSBpMm9fc3RhdHVzX2dldChjKSkpCisJCQlyZXR1cm4gcmM7CisKKwkJaWYgKGk5NjApCisJCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaTk2MCwgMHg0MiwgMHgzRkYpOworCX0KKworCS8qIEluIEhPTEQgc3RhdGUgKi8KKworCXJjID0gaTJvX2hydF9nZXQoYyk7CisKKwlyZXR1cm4gcmM7Cit9OworCisvKioKKyAqCWkyb19pb3Bfc3lzdGFiX3NldCAtIFNldCB0aGUgSTJPIFN5c3RlbSBUYWJsZSBvZiB0aGUgc3BlY2lmaWVkIElPUAorICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBzeXN0ZW0gdGFibGUgc2hvdWxkIGJlIHNlbmQKKyAqCisgKglCZWZvcmUgdGhlIHN5c3RhYiBjb3VsZCBiZSBzZXQgaTJvX3N5c3RhYl9idWlsZCgpIG11c3QgYmUgY2FsbGVkLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9faW9wX3N5c3RhYl9zZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7CisJdTMyIG07CisJaTJvX3N0YXR1c19ibG9jayAqc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYy0+cGRldi0+ZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcm9vdDsKKwlpbnQgcmM7CisKKwlpZiAoc2ItPmN1cnJlbnRfbWVtX3NpemUgPCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZjLT5tZW1fcmVzb3VyY2U7CisJCXJlcy0+bmFtZSA9IGMtPnBkZXYtPmJ1cy0+bmFtZTsKKwkJcmVzLT5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCQlyZXMtPnN0YXJ0ID0gMDsKKwkJcmVzLT5lbmQgPSAwOworCQlwcmludGsoS0VSTl9JTkZPICIlczogcmVxdWlyZXMgcHJpdmF0ZSBtZW1vcnkgcmVzb3VyY2VzLlxuIiwKKwkJICAgICAgIGMtPm5hbWUpOworCQlyb290ID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGMtPnBkZXYsIHJlcyk7CisJCWlmIChyb290ID09IE5VTEwpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ2FuJ3QgZmluZCBwYXJlbnQgcmVzb3VyY2UhXG4iLAorCQkJICAgICAgIGMtPm5hbWUpOworCQlpZiAocm9vdCAmJiBhbGxvY2F0ZV9yZXNvdXJjZShyb290LCByZXMsIHNiLT5kZXNpcmVkX21lbV9zaXplLCBzYi0+ZGVzaXJlZF9tZW1fc2l6ZSwgc2ItPmRlc2lyZWRfbWVtX3NpemUsIDEgPDwgMjAsCS8qIFVuc3BlY2lmaWVkLCBzbyB1c2UgMU1iIGFuZCBwbGF5IHNhZmUgKi8KKwkJCQkJICAgICAgTlVMTCwgTlVMTCkgPj0gMCkgeworCQkJYy0+bWVtX2FsbG9jID0gMTsKKwkJCXNiLT5jdXJyZW50X21lbV9zaXplID0gMSArIHJlcy0+ZW5kIC0gcmVzLT5zdGFydDsKKwkJCXNiLT5jdXJyZW50X21lbV9iYXNlID0gcmVzLT5zdGFydDsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBhbGxvY2F0ZWQgJWxkIGJ5dGVzIG9mIFBDSSBtZW1vcnkiCisJCQkgICAgICAgIiBhdCAweCUwOGxYLlxuIiwgYy0+bmFtZSwKKwkJCSAgICAgICAxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0LCByZXMtPnN0YXJ0KTsKKwkJfQorCX0KKworCWlmIChzYi0+Y3VycmVudF9pb19zaXplIDwgc2ItPmRlc2lyZWRfaW9fc2l6ZSkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9ICZjLT5pb19yZXNvdXJjZTsKKwkJcmVzLT5uYW1lID0gYy0+cGRldi0+YnVzLT5uYW1lOworCQlyZXMtPmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKwkJcmVzLT5zdGFydCA9IDA7CisJCXJlcy0+ZW5kID0gMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJlcXVpcmVzIHByaXZhdGUgbWVtb3J5IHJlc291cmNlcy5cbiIsCisJCSAgICAgICBjLT5uYW1lKTsKKwkJcm9vdCA9IHBjaV9maW5kX3BhcmVudF9yZXNvdXJjZShjLT5wZGV2LCByZXMpOworCQlpZiAocm9vdCA9PSBOVUxMKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENhbid0IGZpbmQgcGFyZW50IHJlc291cmNlIVxuIiwKKwkJCSAgICAgICBjLT5uYW1lKTsKKwkJaWYgKHJvb3QgJiYgYWxsb2NhdGVfcmVzb3VyY2Uocm9vdCwgcmVzLCBzYi0+ZGVzaXJlZF9pb19zaXplLCBzYi0+ZGVzaXJlZF9pb19zaXplLCBzYi0+ZGVzaXJlZF9pb19zaXplLCAxIDw8IDIwLAkvKiBVbnNwZWNpZmllZCwgc28gdXNlIDFNYiBhbmQgcGxheSBzYWZlICovCisJCQkJCSAgICAgIE5VTEwsIE5VTEwpID49IDApIHsKKwkJCWMtPmlvX2FsbG9jID0gMTsKKwkJCXNiLT5jdXJyZW50X2lvX3NpemUgPSAxICsgcmVzLT5lbmQgLSByZXMtPnN0YXJ0OworCQkJc2ItPmN1cnJlbnRfbWVtX2Jhc2UgPSByZXMtPnN0YXJ0OworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGFsbG9jYXRlZCAlbGQgYnl0ZXMgb2YgUENJIEkvTyBhdCIKKwkJCSAgICAgICAiIDB4JTA4bFguXG4iLCBjLT5uYW1lLAorCQkJICAgICAgIDEgKyByZXMtPmVuZCAtIHJlcy0+c3RhcnQsIHJlcy0+c3RhcnQpOworCQl9CisJfQorCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpMm9fc3lzdGFiLnBoeXMgPSBkbWFfbWFwX3NpbmdsZShkZXYsIGkyb19zeXN0YWIudmlydCwgaTJvX3N5c3RhYi5sZW4sCisJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwlpZiAoIWkyb19zeXN0YWIucGh5cykgeworCQlpMm9fbXNnX25vcChjLCBtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd3JpdGVsKEkyT19NRVNTQUdFX1NJWkUoMTIpIHwgU0dMX09GRlNFVF82LCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1NZU19UQUJfU0VUIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKKwkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKworCS8qCisJICogUHJvdmlkZSB0aHJlZSBTR0wtZWxlbWVudHM6CisJICogU3lzdGVtIHRhYmxlIChTeXNUYWIpLCBQcml2YXRlIG1lbW9yeSBzcGFjZSBkZWNsYXJhdGlvbiBhbmQKKwkgKiBQcml2YXRlIGkvbyBzcGFjZSBkZWNsYXJhdGlvbgorCSAqCisJICogRklYTUU6IGlzIHRoaXMgc3RpbGwgdHJ1ZT8KKwkgKiBOYXN0eSBvbmUgaGVyZS4gV2UgY2FuJ3QgdXNlIGRtYV9hbGxvY19jb2hlcmVudCB0byBzZW5kIHRoZQorCSAqIHNhbWUgdGFibGUgdG8gZXZlcnlvbmUuIFdlIGhhdmUgdG8gZ28gcmVtYXAgaXQgZm9yIHRoZW0gYWxsCisJICovCisKKwl3cml0ZWwoYy0+dW5pdCArIDIsICZtc2ctPmJvZHlbMF0pOworCXdyaXRlbCgwLCAmbXNnLT5ib2R5WzFdKTsKKwl3cml0ZWwoMHg1NDAwMDAwMCB8IGkyb19zeXN0YWIubGVuLCAmbXNnLT5ib2R5WzJdKTsKKwl3cml0ZWwoaTJvX3N5c3RhYi5waHlzLCAmbXNnLT5ib2R5WzNdKTsKKwl3cml0ZWwoMHg1NDAwMDAwMCB8IHNiLT5jdXJyZW50X21lbV9zaXplLCAmbXNnLT5ib2R5WzRdKTsKKwl3cml0ZWwoc2ItPmN1cnJlbnRfbWVtX2Jhc2UsICZtc2ctPmJvZHlbNV0pOworCXdyaXRlbCgweGQ0MDAwMDAwIHwgc2ItPmN1cnJlbnRfaW9fc2l6ZSwgJm1zZy0+Ym9keVs2XSk7CisJd3JpdGVsKHNiLT5jdXJyZW50X2lvX2Jhc2UsICZtc2ctPmJvZHlbNl0pOworCisJcmMgPSBpMm9fbXNnX3Bvc3Rfd2FpdChjLCBtLCAxMjApOworCisJZG1hX3VubWFwX3NpbmdsZShkZXYsIGkyb19zeXN0YWIucGh5cywgaTJvX3N5c3RhYi5sZW4sCisJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwlpZiAocmMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIiVzOiBVbmFibGUgdG8gc2V0IFN5c1RhYiAoc3RhdHVzPSUjeCkuXG4iLAorCQkgICAgICAgYy0+bmFtZSwgLXJjKTsKKwllbHNlCisJCXByX2RlYnVnKCIlczogU3lzVGFiIHNldC5cbiIsIGMtPm5hbWUpOworCisJaTJvX3N0YXR1c19nZXQoYyk7CS8vIEVudGVyZWQgUkVBRFkgc3RhdGUKKworCXJldHVybiByYzsKK30KKworLyoqCisgKglpMm9faW9wX29ubGluZSAtIEJyaW5nIGEgY29udHJvbGxlciBvbmxpbmUgaW50byBPUEVSQVRJT05BTCBzdGF0ZS4KKyAqCUBjOiBJMk8gY29udHJvbGxlcgorICoKKyAqCVNlbmQgdGhlIHN5c3RlbSB0YWJsZSBhbmQgZW5hYmxlIHRoZSBJMk8gY29udHJvbGxlci4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZXIgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGkyb19pb3Bfb25saW5lKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGkyb19pb3Bfc3lzdGFiX3NldChjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIEluIFJFQURZIHN0YXRlICovCisJcHJfZGVidWcoIiVzOiBBdHRlbXB0aW5nIHRvIGVuYWJsZS4uLlxuIiwgYy0+bmFtZSk7CisJcmMgPSBpMm9faW9wX2VuYWJsZShjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9faW9wX3JlbW92ZSAtIFJlbW92ZSB0aGUgSTJPIGNvbnRyb2xsZXIgZnJvbSB0aGUgSTJPIGNvcmUKKyAqCUBjOiBJMk8gY29udHJvbGxlcgorICoKKyAqCVJlbW92ZSB0aGUgSTJPIGNvbnRyb2xsZXIgZnJvbSB0aGUgSTJPIGNvcmUuIElmIGRldmljZXMgYXJlIGF0dGFjaGVkIHRvCisgKgl0aGUgY29udHJvbGxlciByZW1vdmUgdGhlc2UgYWxzbyBhbmQgZmluYWxseSByZXNldCB0aGUgY29udHJvbGxlci4KKyAqLwordm9pZCBpMm9faW9wX3JlbW92ZShzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJc3RydWN0IGkyb19kZXZpY2UgKmRldiwgKnRtcDsKKworCXByX2RlYnVnKCIlczogZGVsZXRpbmcgY29udHJvbGxlclxuIiwgYy0+bmFtZSk7CisKKwlpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX3JlbW92ZV9hbGwoYyk7CisKKwlsaXN0X2RlbCgmYy0+bGlzdCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZjLT5kZXZpY2VzLCBsaXN0KQorCSAgICBpMm9fZGV2aWNlX3JlbW92ZShkZXYpOworCisJLyogQXNrIHRoZSBJT1AgdG8gc3dpdGNoIHRvIFJFU0VUIHN0YXRlICovCisJaTJvX2lvcF9yZXNldChjKTsKK30KKworLyoqCisgKglpMm9fc3lzdGFiX2J1aWxkIC0gQnVpbGQgc3lzdGVtIHRhYmxlCisgKgorICoJVGhlIHN5c3RlbSB0YWJsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhlIElPUHMgaW4gdGhlIHN5c3RlbQorICoJKGR1aCkgYW5kIGlzIHVzZWQgYnkgdGhlIEV4ZWN1dGl2ZXMgb24gdGhlIElPUHMgdG8gZXN0YWJsaXNoIHBlZXIycGVlcgorICoJY29ubmVjdGlvbnMuIFdlJ3JlIG5vdCBzdXBwb3J0aW5nIHBlZXIycGVlciBhdCB0aGUgbW9tZW50LCBidXQgdGhpcworICoJd2lsbCBiZSBuZWVkZWQgZG93biB0aGUgcm9hZCBmb3IgdGhpbmdzIGxpa2UgbGFuMmxhbiBmb3J3YXJkaW5nLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBpMm9fc3lzdGFiX2J1aWxkKHZvaWQpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjLCAqdG1wOworCWludCBudW1fY29udHJvbGxlcnMgPSAwOworCXUzMiBjaGFuZ2VfaW5kID0gMDsKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCBpMm9fc3lzX3RibCAqc3lzdGFiID0gaTJvX3N5c3RhYi52aXJ0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGMsIHRtcCwgJmkyb19jb250cm9sbGVycywgbGlzdCkKKwkgICAgbnVtX2NvbnRyb2xsZXJzKys7CisKKwlpZiAoc3lzdGFiKSB7CisJCWNoYW5nZV9pbmQgPSBzeXN0YWItPmNoYW5nZV9pbmQ7CisJCWtmcmVlKGkyb19zeXN0YWIudmlydCk7CisJfQorCisJLyogSGVhZGVyICsgSU9QcyAqLworCWkyb19zeXN0YWIubGVuID0gc2l6ZW9mKHN0cnVjdCBpMm9fc3lzX3RibCkgKyBudW1fY29udHJvbGxlcnMgKgorCSAgICBzaXplb2Yoc3RydWN0IGkyb19zeXNfdGJsX2VudHJ5KTsKKworCXN5c3RhYiA9IGkyb19zeXN0YWIudmlydCA9IGttYWxsb2MoaTJvX3N5c3RhYi5sZW4sIEdGUF9LRVJORUwpOworCWlmICghc3lzdGFiKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJvOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBTeXN0ZW0gIgorCQkgICAgICAgIlRhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzeXN0YWIsIDAsIGkyb19zeXN0YWIubGVuKTsKKworCXN5c3RhYi0+dmVyc2lvbiA9IEkyT1ZFUlNJT047CisJc3lzdGFiLT5jaGFuZ2VfaW5kID0gY2hhbmdlX2luZCArIDE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgdG1wLCAmaTJvX2NvbnRyb2xsZXJzLCBsaXN0KSB7CisJCWkyb19zdGF0dXNfYmxvY2sgKnNiOworCisJCWlmIChjb3VudCA+PSBudW1fY29udHJvbGxlcnMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaTJvOiBjb250cm9sbGVyIGFkZGVkIHdoaWxlIGJ1aWxkaW5nICIKKwkJCSAgICAgICAic3lzdGVtIHRhYmxlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKKworCQkvKgorCQkgKiBHZXQgdXBkYXRlZCBJT1Agc3RhdGUgc28gd2UgaGF2ZSB0aGUgbGF0ZXN0IGluZm9ybWF0aW9uCisJCSAqCisJCSAqIFdlIHNob3VsZCBkZWxldGUgdGhlIGNvbnRyb2xsZXIgYXQgdGhpcyBwb2ludCBpZiBpdAorCQkgKiBkb2Vzbid0IHJlc3BvbmQgc2luY2UgaWYgaXQncyBub3Qgb24gdGhlIHN5c3RlbSB0YWJsZQorCQkgKiBpdCBpcyB0ZWNobmluaWNhbGx5IG5vdCBwYXJ0IG9mIHRoZSBJMk8gc3Vic3lzdGVtLi4uCisJCSAqLworCQlpZiAodW5saWtlbHkoaTJvX3N0YXR1c19nZXQoYykpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBEZWxldGluZyBiL2MgY291bGQgbm90IGdldCBzdGF0dXMiCisJCQkgICAgICAgIiB3aGlsZSBhdHRlbXB0aW5nIHRvIGJ1aWxkIHN5c3RlbSB0YWJsZVxuIiwKKwkJCSAgICAgICBjLT5uYW1lKTsKKwkJCWkyb19pb3BfcmVtb3ZlKGMpOworCQkJY29udGludWU7CS8vIHRyeSB0aGUgbmV4dCBvbmUKKwkJfQorCisJCXN5c3RhYi0+aW9wc1tjb3VudF0ub3JnX2lkID0gc2ItPm9yZ19pZDsKKwkJc3lzdGFiLT5pb3BzW2NvdW50XS5pb3BfaWQgPSBjLT51bml0ICsgMjsKKwkJc3lzdGFiLT5pb3BzW2NvdW50XS5zZWdfbnVtID0gMDsKKwkJc3lzdGFiLT5pb3BzW2NvdW50XS5pMm9fdmVyc2lvbiA9IHNiLT5pMm9fdmVyc2lvbjsKKwkJc3lzdGFiLT5pb3BzW2NvdW50XS5pb3Bfc3RhdGUgPSBzYi0+aW9wX3N0YXRlOworCQlzeXN0YWItPmlvcHNbY291bnRdLm1zZ190eXBlID0gc2ItPm1zZ190eXBlOworCQlzeXN0YWItPmlvcHNbY291bnRdLmZyYW1lX3NpemUgPSBzYi0+aW5ib3VuZF9mcmFtZV9zaXplOworCQlzeXN0YWItPmlvcHNbY291bnRdLmxhc3RfY2hhbmdlZCA9IGNoYW5nZV9pbmQ7CisJCXN5c3RhYi0+aW9wc1tjb3VudF0uaW9wX2NhcGFiaWxpdGllcyA9IHNiLT5pb3BfY2FwYWJpbGl0aWVzOworCQlzeXN0YWItPmlvcHNbY291bnRdLmluYm91bmRfbG93ID0gaTJvX3B0cl9sb3coYy0+cG9zdF9wb3J0KTsKKwkJc3lzdGFiLT5pb3BzW2NvdW50XS5pbmJvdW5kX2hpZ2ggPSBpMm9fcHRyX2hpZ2goYy0+cG9zdF9wb3J0KTsKKworCQljb3VudCsrOworCX0KKworCXN5c3RhYi0+bnVtX2VudHJpZXMgPSBjb3VudDsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fcGFyc2VfaHJ0IC0gUGFyc2UgdGhlIGhhcmR3YXJlIHJlc291cmNlIHRhYmxlLgorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJV2UgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBpdCBleGNlcHQgZHVtcGluZyBpdCAoaW4gZGVidWcgbW9kZSkuCisgKgorICoJUmV0dXJucyAwLgorICovCitzdGF0aWMgaW50IGkyb19wYXJzZV9ocnQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWkyb19kdW1wX2hydChjKTsKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX3N0YXR1c19nZXQgLSBHZXQgdGhlIHN0YXR1cyBibG9jayBmcm9tIHRoZSBJMk8gY29udHJvbGxlcgorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJSXNzdWUgYSBzdGF0dXMgcXVlcnkgb24gdGhlIGNvbnRyb2xsZXIuIFRoaXMgdXBkYXRlcyB0aGUgYXR0YWNoZWQKKyAqCXN0YXR1cyBibG9jay4gVGhlIHN0YXR1cyBibG9jayBjb3VsZCB0aGVuIGJlIGFjY2Vzc2VkIHRocm91Z2gKKyAqCWMtPnN0YXR1c19ibG9jay4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19zdGF0dXNfZ2V0KHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCXU4ICpzdGF0dXNfYmxvY2s7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJc3RhdHVzX2Jsb2NrID0gKHU4ICopIGMtPnN0YXR1c19ibG9jay52aXJ0OworCW1lbXNldChzdGF0dXNfYmxvY2ssIDAsIHNpemVvZihpMm9fc3RhdHVzX2Jsb2NrKSk7CisKKwltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CisJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXdyaXRlbChOSU5FX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7CisJd3JpdGVsKEkyT19DTURfU1RBVFVTX0dFVCA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgQURBUFRFUl9USUQsCisJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGkyb19leGVjX2RyaXZlci5jb250ZXh0LCAmbXNnLT51LnMuaWNudHh0KTsKKwl3cml0ZWwoMCwgJm1zZy0+dS5zLnRjbnR4dCk7CS8vIEZJWE1FOiB1c2UgcmVzb25hYmxlIHRyYW5zYWN0aW9uIGNvbnRleHQKKwl3cml0ZWwoMCwgJm1zZy0+Ym9keVswXSk7CisJd3JpdGVsKDAsICZtc2ctPmJvZHlbMV0pOworCXdyaXRlbChpMm9fcHRyX2xvdygodm9pZCAqKWMtPnN0YXR1c19ibG9jay5waHlzKSwgJm1zZy0+Ym9keVsyXSk7CisJd3JpdGVsKGkyb19wdHJfaGlnaCgodm9pZCAqKWMtPnN0YXR1c19ibG9jay5waHlzKSwgJm1zZy0+Ym9keVszXSk7CisJd3JpdGVsKHNpemVvZihpMm9fc3RhdHVzX2Jsb2NrKSwgJm1zZy0+Ym9keVs0XSk7CS8qIGFsd2F5cyA4OCBieXRlcyAqLworCisJaTJvX21zZ19wb3N0KGMsIG0pOworCisJLyogV2FpdCBmb3IgYSByZXBseSAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgSTJPX1RJTUVPVVRfU1RBVFVTX0dFVCAqIEhaOworCXdoaWxlIChzdGF0dXNfYmxvY2tbODddICE9IDB4RkYpIHsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IEdldCBzdGF0dXMgdGltZW91dC5cbiIsIGMtPm5hbWUpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisKKwkJcm1iKCk7CisJfQorCisjaWZkZWYgREVCVUcKKwlpMm9fZGVidWdfc3RhdGUoYyk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisvKgorICoJaTJvX2hydF9nZXQgLSBHZXQgdGhlIEhhcmR3YXJlIFJlc291cmNlIFRhYmxlIGZyb20gdGhlIEkyTyBjb250cm9sbGVyCisgKglAYzogSTJPIGNvbnRyb2xsZXIgZnJvbSB3aGljaCB0aGUgSFJUIHNob3VsZCBiZSBmZXRjaGVkCisgKgorICoJVGhlIEhSVCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBoaWRkZW4gZGV2aWNlcyBidXQgaXMKKyAqCW1vc3RseSB1c2VsZXNzIHRvIHVzLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlciBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX2hydF9nZXQoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWludCByYzsKKwlpbnQgaTsKKwlpMm9faHJ0ICpocnQgPSBjLT5ocnQudmlydDsKKwl1MzIgc2l6ZSA9IHNpemVvZihpMm9faHJ0KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYy0+cGRldi0+ZGV2OworCisJZm9yIChpID0gMDsgaSA8IEkyT19IUlRfR0VUX1RSSUVTOyBpKyspIHsKKwkJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKKwkJdTMyIG07CisKKwkJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCQlpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCQl3cml0ZWwoU0lYX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzQsICZtc2ctPnUuaGVhZFswXSk7CisJCXdyaXRlbChJMk9fQ01EX0hSVF9HRVQgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAorCQkgICAgICAgJm1zZy0+dS5oZWFkWzFdKTsKKwkJd3JpdGVsKDB4ZDAwMDAwMDAgfCBjLT5ocnQubGVuLCAmbXNnLT5ib2R5WzBdKTsKKwkJd3JpdGVsKGMtPmhydC5waHlzLCAmbXNnLT5ib2R5WzFdKTsKKworCQlyYyA9IGkyb19tc2dfcG9zdF93YWl0X21lbShjLCBtLCAyMCwgJmMtPmhydCk7CisKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIGdldCBIUlQgKHN0YXR1cz0lI3gpXG4iLAorCQkJICAgICAgIGMtPm5hbWUsIC1yYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlzaXplID0gaHJ0LT5udW1fZW50cmllcyAqIGhydC0+ZW50cnlfbGVuIDw8IDI7CisJCWlmIChzaXplID4gYy0+aHJ0LmxlbikgeworCQkJaWYgKGkyb19kbWFfcmVhbGxvYyhkZXYsICZjLT5ocnQsIHNpemUsIEdGUF9LRVJORUwpKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJZWxzZQorCQkJCWhydCA9IGMtPmhydC52aXJ0OworCQl9IGVsc2UKKwkJCXJldHVybiBpMm9fcGFyc2VfaHJ0KGMpOworCX0KKworCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBnZXQgSFJUIGFmdGVyICVkIHRyaWVzLCBnaXZpbmcgdXBcbiIsCisJICAgICAgIGMtPm5hbWUsIEkyT19IUlRfR0VUX1RSSUVTKTsKKworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qKgorICoJaTJvX2lvcF9hbGxvYyAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgaTJvX2NvbnRyb2xsZXIgc3RydWN0CisgKgorICoJQWxsb2NhdGUgdGhlIG5lY2Vzc2FyeSBtZW1vcnkgZm9yIGEgaTJvX2NvbnRyb2xsZXIgc3RydWN0IGFuZAorICoJaW5pdGlhbGl6ZSB0aGUgbGlzdHMuCisgKgorICoJUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIEkyTyBjb250cm9sbGVyIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbgorICoJZmFpbHVyZS4KKyAqLworc3RydWN0IGkyb19jb250cm9sbGVyICppMm9faW9wX2FsbG9jKHZvaWQpCit7CisJc3RhdGljIGludCB1bml0ID0gMDsJLyogMCBhbmQgMSBhcmUgTlVMTCBJT1AgYW5kIExvY2FsIEhvc3QgKi8KKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CisKKwljID0ga21hbGxvYyhzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMm86IEluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgYSBJMk8gIgorCQkgICAgICAgImNvbnRyb2xsZXIuXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKworCUlOSVRfTElTVF9IRUFEKCZjLT5kZXZpY2VzKTsKKwlzcGluX2xvY2tfaW5pdCgmYy0+bG9jayk7CisJaW5pdF9NVVRFWCgmYy0+bGN0X2xvY2spOworCWMtPnVuaXQgPSB1bml0Kys7CisJc3ByaW50ZihjLT5uYW1lLCAiaW9wJWQiLCBjLT51bml0KTsKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwlzcGluX2xvY2tfaW5pdCgmYy0+Y29udGV4dF9saXN0X2xvY2spOworCWF0b21pY19zZXQoJmMtPmNvbnRleHRfbGlzdF9jb3VudGVyLCAwKTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+Y29udGV4dF9saXN0KTsKKyNlbmRpZgorCisJcmV0dXJuIGM7Cit9OworCisvKioKKyAqCWkyb19pb3BfZnJlZSAtIEZyZWUgdGhlIGkyb19jb250cm9sbGVyIHN0cnVjdAorICoJQGM6IEkyTyBjb250cm9sbGVyIHRvIGZyZWUKKyAqLwordm9pZCBpMm9faW9wX2ZyZWUoc3RydWN0IGkyb19jb250cm9sbGVyICpjKQoreworCWtmcmVlKGMpOworfTsKKworLyoqCisgKglpMm9faW9wX2FkZCAtIEluaXRpYWxpemUgdGhlIEkyTyBjb250cm9sbGVyIGFuZCBhZGQgaGltIHRvIHRoZSBJMk8gY29yZQorICoJQGM6IGNvbnRyb2xsZXIKKyAqCisgKglJbml0aWFsaXplIHRoZSBJMk8gY29udHJvbGxlciBhbmQgaWYgbm8gZXJyb3Igb2NjdXJzIGFkZCBoaW0gdG8gdGhlIEkyTworICoJY29yZS4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBpMm9faW9wX2FkZChzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMpCit7CisJaW50IHJjOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFjdGl2YXRpbmcgSTJPIGNvbnRyb2xsZXIuLi5cbiIsIGMtPm5hbWUpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiBUaGlzIG1heSB0YWtlIGEgZmV3IG1pbnV0ZXMgaWYgdGhlcmUgYXJlIG1hbnkgIgorCSAgICAgICAiZGV2aWNlc1xuIiwgYy0+bmFtZSk7CisKKwlpZiAoKHJjID0gaTJvX2lvcF9hY3RpdmF0ZShjKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogY291bGQgbm90IGFjdGl2YXRlIGNvbnRyb2xsZXJcbiIsCisJCSAgICAgICBjLT5uYW1lKTsKKwkJaTJvX2lvcF9yZXNldChjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXByX2RlYnVnKCIlczogYnVpbGRpbmcgc3lzIHRhYmxlLi4uXG4iLCBjLT5uYW1lKTsKKworCWlmICgocmMgPSBpMm9fc3lzdGFiX2J1aWxkKCkpKSB7CisJCWkyb19pb3BfcmVzZXQoYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlwcl9kZWJ1ZygiJXM6IG9ubGluZSBjb250cm9sbGVyLi4uXG4iLCBjLT5uYW1lKTsKKworCWlmICgocmMgPSBpMm9faW9wX29ubGluZShjKSkpIHsKKwkJaTJvX2lvcF9yZXNldChjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXByX2RlYnVnKCIlczogZ2V0dGluZyBMQ1QuLi5cbiIsIGMtPm5hbWUpOworCisJaWYgKChyYyA9IGkyb19leGVjX2xjdF9nZXQoYykpKSB7CisJCWkyb19pb3BfcmVzZXQoYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlsaXN0X2FkZCgmYy0+bGlzdCwgJmkyb19jb250cm9sbGVycyk7CisKKwlpMm9fZHJpdmVyX25vdGlmeV9jb250cm9sbGVyX2FkZF9hbGwoYyk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ29udHJvbGxlciBhZGRlZFxuIiwgYy0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK307CisKKy8qKgorICoJaTJvX2V2ZW50X3JlZ2lzdGVyIC0gVHVybiBvbi9vZmYgZXZlbnQgbm90aWZpY2F0aW9uIGZvciBhIEkyTyBkZXZpY2UKKyAqCUBkZXY6IEkyTyBkZXZpY2Ugd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIGV2ZW50IHJlZ2lzdHJhdGlvbiByZXF1ZXN0CisgKglAZHJ2OiBkcml2ZXIgd2hpY2ggd2FudCB0byBnZXQgbm90aWZpZWQKKyAqCUB0Y250eHQ6IHRyYW5zYWN0aW9uIGNvbnRleHQgdG8gdXNlIHdpdGggdGhpcyBub3RpZmllcgorICoJQGV2dF9tYXNrOiBtYXNrIG9mIGV2ZW50cworICoKKyAqCUNyZWF0ZSBhbmQgcG9zdHMgYW4gZXZlbnQgcmVnaXN0cmF0aW9uIG1lc3NhZ2UgdG8gdGhlIHRhc2suIE5vIHJlcGx5CisgKglpcyB3YWl0ZWQgZm9yLCBvciBleHBlY3RlZC4gSWYgeW91IGRvIG5vdCB3YW50IGZ1cnRoZXIgbm90aWZpY2F0aW9ucywKKyAqCWNhbGwgdGhlIGkyb19ldmVudF9yZWdpc3RlciBhZ2FpbiB3aXRoIGEgZXZ0X21hc2sgb2YgMC4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRVRJTUVET1VUIGlmIG5vIG1lc3NhZ2UgY291bGQgYmUgZmV0Y2hlZCBmb3IKKyAqCXNlbmRpbmcgdGhlIHJlcXVlc3QuCisgKi8KK2ludCBpMm9fZXZlbnRfcmVnaXN0ZXIoc3RydWN0IGkyb19kZXZpY2UgKmRldiwgc3RydWN0IGkyb19kcml2ZXIgKmRydiwKKwkJICAgICAgIGludCB0Y250eHQsIHUzMiBldnRfbWFzaykKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBkZXYtPmlvcDsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOworCXUzMiBtOworCisJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOworCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwl3cml0ZWwoRklWRV9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOworCXdyaXRlbChJMk9fQ01EX1VUSUxfRVZUX1JFR0lTVEVSIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBkZXYtPmxjdF9kYXRhLgorCSAgICAgICB0aWQsICZtc2ctPnUuaGVhZFsxXSk7CisJd3JpdGVsKGRydi0+Y29udGV4dCwgJm1zZy0+dS5zLmljbnR4dCk7CisJd3JpdGVsKHRjbnR4dCwgJm1zZy0+dS5zLnRjbnR4dCk7CisJd3JpdGVsKGV2dF9tYXNrLCAmbXNnLT5ib2R5WzBdKTsKKworCWkyb19tc2dfcG9zdChjLCBtKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9faW9wX2luaXQgLSBJMk8gbWFpbiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICoKKyAqCUluaXRpYWxpemUgdGhlIEkyTyBkcml2ZXJzIChPU00pIGZ1bmN0aW9ucywgcmVnaXN0ZXIgdGhlIEV4ZWN1dGl2ZSBPU00sCisgKglpbml0aWFsaXplIHRoZSBJMk8gUENJIHBhcnQgYW5kIGZpbmFsbHkgaW5pdGlhbGl6ZSBJMk8gZGV2aWNlIHN0dWZmLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgaTJvX2lvcF9pbml0KHZvaWQpCit7CisJaW50IHJjID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gT1NNX0RFU0NSSVBUSU9OICIgdiIgT1NNX1ZFUlNJT04gIlxuIik7CisKKwlyYyA9IGkyb19kZXZpY2VfaW5pdCgpOworCWlmIChyYykKKwkJZ290byBleGl0OworCisJcmMgPSBpMm9fZHJpdmVyX2luaXQoKTsKKwlpZiAocmMpCisJCWdvdG8gZGV2aWNlX2V4aXQ7CisKKwlyYyA9IGkyb19leGVjX2luaXQoKTsKKwlpZiAocmMpCisJCWdvdG8gZHJpdmVyX2V4aXQ7CisKKwlyYyA9IGkyb19wY2lfaW5pdCgpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXhlY19leGl0OworCisJcmV0dXJuIDA7CisKKyAgICAgIGV4ZWNfZXhpdDoKKwlpMm9fZXhlY19leGl0KCk7CisKKyAgICAgIGRyaXZlcl9leGl0OgorCWkyb19kcml2ZXJfZXhpdCgpOworCisgICAgICBkZXZpY2VfZXhpdDoKKwlpMm9fZGV2aWNlX2V4aXQoKTsKKworICAgICAgZXhpdDoKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJaTJvX2lvcF9leGl0IC0gSTJPIG1haW4gZXhpdCBmdW5jdGlvbgorICoKKyAqCVJlbW92ZXMgSTJPIGNvbnRyb2xsZXJzIGZyb20gUENJIHN1YnN5c3RlbSBhbmQgc2h1dCBkb3duIE9TTXMuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBpMm9faW9wX2V4aXQodm9pZCkKK3sKKwlpMm9fcGNpX2V4aXQoKTsKKwlpMm9fZXhlY19leGl0KCk7CisJaTJvX2RyaXZlcl9leGl0KCk7CisJaTJvX2RldmljZV9leGl0KCk7Cit9OworCittb2R1bGVfaW5pdChpMm9faW9wX2luaXQpOworbW9kdWxlX2V4aXQoaTJvX2lvcF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCBTb2Z0d2FyZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKE9TTV9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihPU01fVkVSU0lPTik7CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CitFWFBPUlRfU1lNQk9MKGkyb19jbnR4dF9saXN0X2FkZCk7CitFWFBPUlRfU1lNQk9MKGkyb19jbnR4dF9saXN0X2dldCk7CitFWFBPUlRfU1lNQk9MKGkyb19jbnR4dF9saXN0X3JlbW92ZSk7CitFWFBPUlRfU1lNQk9MKGkyb19jbnR4dF9saXN0X2dldF9wdHIpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGkyb19tc2dfZ2V0X3dhaXQpOworRVhQT1JUX1NZTUJPTChpMm9fbXNnX25vcCk7CitFWFBPUlRfU1lNQk9MKGkyb19maW5kX2lvcCk7CitFWFBPUlRfU1lNQk9MKGkyb19pb3BfZmluZF9kZXZpY2UpOworRVhQT1JUX1NZTUJPTChpMm9fZXZlbnRfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChpMm9fc3RhdHVzX2dldCk7CitFWFBPUlRfU1lNQk9MKGkyb19jb250cm9sbGVycyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lc3NhZ2UvaTJvL3BjaS5jIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzcyNzUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZXNzYWdlL2kyby9wY2kuYwpAQCAtMCwwICsxLDUyOCBAQAorLyoKKyAqCVBDSSBoYW5kbGluZyBvZiBJMk8gY29udHJvbGxlcgorICoKKyAqIAlDb3B5cmlnaHQgKEMpIDE5OTktMjAwMglSZWQgSGF0IFNvZnR3YXJlCisgKgorICoJV3JpdHRlbiBieSBBbGFuIENveCwgQnVpbGRpbmcgTnVtYmVyIFRocmVlIEx0ZAorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqCUZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqCW9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJQSBsb3Qgb2YgdGhlIEkyTyBtZXNzYWdlIHNpZGUgY29kZSBmcm9tIHRoaXMgaXMgdGFrZW4gZnJvbSB0aGUgUmVkCisgKglDcmVlayBSQ1BDSTQ1IGFkYXB0ZXIgZHJpdmVyIGJ5IFJlZCBDcmVlayBDb21tdW5pY2F0aW9ucworICoKKyAqCUZpeGVzL2FkZGl0aW9uczoKKyAqCQlQaGlsaXBwIFJ1bXBmCisgKgkJSnVoYSBTaWV25G5lbiA8SnVoYS5TaWV2YW5lbkBjcy5IZWxzaW5raS5GST4KKyAqCQlBdXZvIEjka2tpbmVuIDxBdXZvLkhha2tpbmVuQGNzLkhlbHNpbmtpLkZJPgorICoJCURlZXBhayBTYXhlbmEgPGRlZXBha0BwbGV4aXR5Lm5ldD4KKyAqCQlCb2ppIFQgS2FubmFudGhhbmFtIDxib2ppLnQua2FubmFudGhhbmFtQGludGVsLmNvbT4KKyAqCQlBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPjoKKyAqCQkJUG9ydGVkIHRvIExpbnV4IDIuNS4KKyAqCQlNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CisgKgkJCU1pbm9yIGZpeGVzIGZvciAyLjYuCisgKgkJTWFya3VzIExpZGVsIDxNYXJrdXMuTGlkZWxAc2hhZG93Y29ubmVjdC5jb20+OgorICoJCQlTdXBwb3J0IGZvciBzeXNmcyBpbmNsdWRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaTJvLmg+CisKKyNpZmRlZiBDT05GSUdfTVRSUgorI2luY2x1ZGUgPGFzbS9tdHJyLmg+CisjZW5kaWYJCQkJLy8gQ09ORklHX01UUlIKKworLyogTW9kdWxlIGludGVybmFsIGZ1bmN0aW9ucyBmcm9tIG90aGVyIHNvdXJjZXMgKi8KK2V4dGVybiBzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmkyb19pb3BfYWxsb2Modm9pZCk7CitleHRlcm4gdm9pZCBpMm9faW9wX2ZyZWUoc3RydWN0IGkyb19jb250cm9sbGVyICopOworCitleHRlcm4gaW50IGkyb19pb3BfYWRkKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKTsKK2V4dGVybiB2b2lkIGkyb19pb3BfcmVtb3ZlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqKTsKKworZXh0ZXJuIGludCBpMm9fZHJpdmVyX2Rpc3BhdGNoKHN0cnVjdCBpMm9fY29udHJvbGxlciAqLCB1MzIsCisJCQkgICAgICAgc3RydWN0IGkyb19tZXNzYWdlICopOworCisvKiBQQ0kgZGV2aWNlIGlkIHRhYmxlIGZvciBhbGwgSTJPIGNvbnRyb2xsZXJzICovCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19kZXZpbml0ZGF0YSBpMm9fcGNpX2lkc1tdID0geworCXtQQ0lfREVWSUNFX0NMQVNTKFBDSV9DTEFTU19JTlRFTExJR0VOVF9JMk8gPDwgOCwgMHhmZmZmMDApfSwKKwl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0RQVCwgMHhhNTExKX0sCisJezB9Cit9OworCisvKioKKyAqCWkyb19kbWFfcmVhbGxvYyAtIFJlYWxsb2MgRE1BIG1lbW9yeQorICoJQGRldjogc3RydWN0IGRldmljZSBwb2ludGVyIHRvIHRoZSBQQ0kgZGV2aWNlIG9mIHRoZSBJMk8gY29udHJvbGxlcgorICoJQGFkZHI6IHBvaW50ZXIgdG8gYSBpMm9fZG1hIHN0cnVjdCBETUEgYnVmZmVyCisgKglAbGVuOiBuZXcgbGVuZ3RoIG9mIG1lbW9yeQorICoJQGdmcF9tYXNrOiBHRlAgbWFzaworICoKKyAqCUlmIHRoZXJlIHdhcyBzb21ldGhpbmcgYWxsb2NhdGVkIGluIHRoZSBhZGRyLCBmcmVlIGl0IGZpcnN0LiBJZiBsZW4gPiAwCisgKgl0aGFuIHRyeSB0byBhbGxvY2F0ZSBpdCBhbmQgd3JpdGUgdGhlIGFkZHJlc3NlcyBiYWNrIHRvIHRoZSBhZGRyCisgKglzdHJ1Y3R1cmUuIElmIGxlbiA9PSAwIHNldCB0aGUgdmlydHVhbCBhZGRyZXNzIHRvIE5VTEwuCisgKgorICoJUmV0dXJucyB0aGUgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGkyb19kbWFfcmVhbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBpMm9fZG1hICphZGRyLCBzaXplX3QgbGVuLAorCQkgICAgdW5zaWduZWQgaW50IGdmcF9tYXNrKQoreworCWkyb19kbWFfZnJlZShkZXYsIGFkZHIpOworCisJaWYgKGxlbikKKwkJcmV0dXJuIGkyb19kbWFfYWxsb2MoZGV2LCBhZGRyLCBsZW4sIGdmcF9tYXNrKTsKKworCXJldHVybiAwOworfTsKKworLyoqCisgKglpMm9fcGNpX2ZyZWUgLSBGcmVlcyB0aGUgRE1BIG1lbW9yeSBmb3IgdGhlIEkyTyBjb250cm9sbGVyCisgKglAYzogSTJPIGNvbnRyb2xsZXIgdG8gZnJlZQorICoKKyAqCVJlbW92ZSBhbGwgYWxsb2NhdGVkIERNQSBtZW1vcnkgYW5kIHVubWFwIG1lbW9yeSBJTyByZWdpb25zLiBJZiBNVFJSCisgKglpcyBlbmFibGVkLCBhbHNvIHJlbW92ZSBpdCBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgaTJvX3BjaV9mcmVlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSAmYy0+cGRldi0+ZGV2OworCisJaTJvX2RtYV9mcmVlKGRldiwgJmMtPm91dF9xdWV1ZSk7CisJaTJvX2RtYV9mcmVlKGRldiwgJmMtPnN0YXR1c19ibG9jayk7CisJaWYgKGMtPmxjdCkKKwkJa2ZyZWUoYy0+bGN0KTsKKwlpMm9fZG1hX2ZyZWUoZGV2LCAmYy0+ZGxjdCk7CisJaTJvX2RtYV9mcmVlKGRldiwgJmMtPmhydCk7CisJaTJvX2RtYV9mcmVlKGRldiwgJmMtPnN0YXR1cyk7CisKKyNpZmRlZiBDT05GSUdfTVRSUgorCWlmIChjLT5tdHJyX3JlZzAgPj0gMCkKKwkJbXRycl9kZWwoYy0+bXRycl9yZWcwLCAwLCAwKTsKKwlpZiAoYy0+bXRycl9yZWcxID49IDApCisJCW10cnJfZGVsKGMtPm10cnJfcmVnMSwgMCwgMCk7CisjZW5kaWYKKworCWlmIChjLT5yYXB0b3IgJiYgYy0+aW5fcXVldWUudmlydCkKKwkJaW91bm1hcChjLT5pbl9xdWV1ZS52aXJ0KTsKKworCWlmIChjLT5iYXNlLnZpcnQpCisJCWlvdW5tYXAoYy0+YmFzZS52aXJ0KTsKK30KKworLyoqCisgKglpMm9fcGNpX2FsbG9jIC0gQWxsb2NhdGUgRE1BIG1lbW9yeSwgbWFwIElPIG1lbW9yeSBmb3IgSTJPIGNvbnRyb2xsZXIKKyAqCUBjOiBJMk8gY29udHJvbGxlcgorICoKKyAqCUFsbG9jYXRlIERNQSBtZW1vcnkgZm9yIGEgUENJIChvciBpbiB0aGVvcnkgQUdQKSBJMk8gY29udHJvbGxlci4gQWxsCisgKglJTyBtYXBwaW5ncyBhcmUgYWxzbyBkb25lIGhlcmUuIElmIE1UUlIgaXMgZW5hYmxlZCwgYWxzbyBkbyBhZGQgbWVtb3J5CisgKglyZWdpb25zIGhlcmUuCisgKgorICoJUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpMm9fcGNpX2FsbG9jKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGMtPnBkZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJLyogU2tpcCBJL08gc3BhY2VzICovCisJCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBpKSAmIElPUkVTT1VSQ0VfSU8pKSB7CisJCQlpZiAoIWMtPmJhc2UucGh5cykgeworCQkJCWMtPmJhc2UucGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBpKTsKKwkJCQljLT5iYXNlLmxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSk7CisKKwkJCQkvKgorCQkJCSAqIElmIHdlIGtub3cgd2hhdCBjYXJkIGl0IGlzLCBzZXQgdGhlIHNpemUKKwkJCQkgKiBjb3JyZWN0bHkuIENvZGUgaXMgdGFrZW4gZnJvbSBkcHRfaTJvLmMKKwkJCQkgKi8KKwkJCQlpZiAocGRldi0+ZGV2aWNlID09IDB4YTUwMSkgeworCQkJCQlpZiAocGRldi0+c3Vic3lzdGVtX2RldmljZSA+PSAweGMwMzIgJiYKKwkJCQkJICAgIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPD0gMHhjMDNiKSB7CisJCQkJCQlpZiAoYy0+YmFzZS5sZW4gPiAweDQwMDAwMCkKKwkJCQkJCQljLT5iYXNlLmxlbiA9IDB4NDAwMDAwOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGMtPmJhc2UubGVuID4gMHgxMDAwMDApCisJCQkJCQkJYy0+YmFzZS5sZW4gPSAweDEwMDAwMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoIWMtPnJhcHRvcikKKwkJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWMtPmluX3F1ZXVlLnBoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSk7CisJCQkJYy0+aW5fcXVldWUubGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCBpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChpID09IDYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSTJPIGNvbnRyb2xsZXIgaGFzIG5vIG1lbW9yeSByZWdpb25zIgorCQkgICAgICAgIiBkZWZpbmVkLlxuIiwgYy0+bmFtZSk7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTWFwIHRoZSBJMk8gY29udHJvbGxlciAqLworCWlmIChjLT5yYXB0b3IpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFBDSSBJMk8gY29udHJvbGxlclxuIiwgYy0+bmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICAgQkFSMCBhdCAweCUwOGxYIHNpemU9JWxkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYy0+YmFzZS5waHlzLCAodW5zaWduZWQgbG9uZyljLT5iYXNlLmxlbik7CisJCXByaW50ayhLRVJOX0lORk8gIiAgICAgQkFSMSBhdCAweCUwOGxYIHNpemU9JWxkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpYy0+aW5fcXVldWUucGh5cywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWMtPmluX3F1ZXVlLmxlbik7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQQ0kgSTJPIGNvbnRyb2xsZXIgYXQgJTA4bFggc2l6ZT0lbGRcbiIsCisJCSAgICAgICBjLT5uYW1lLCAodW5zaWduZWQgbG9uZyljLT5iYXNlLnBoeXMsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyljLT5iYXNlLmxlbik7CisKKwljLT5iYXNlLnZpcnQgPSBpb3JlbWFwKGMtPmJhc2UucGh5cywgYy0+YmFzZS5sZW4pOworCWlmICghYy0+YmFzZS52aXJ0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBtYXAgY29udHJvbGxlci5cbiIsIGMtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoYy0+cmFwdG9yKSB7CisJCWMtPmluX3F1ZXVlLnZpcnQgPSBpb3JlbWFwKGMtPmluX3F1ZXVlLnBoeXMsIGMtPmluX3F1ZXVlLmxlbik7CisJCWlmICghYy0+aW5fcXVldWUudmlydCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogVW5hYmxlIHRvIG1hcCBjb250cm9sbGVyLlxuIiwKKwkJCSAgICAgICBjLT5uYW1lKTsKKwkJCWkyb19wY2lfZnJlZShjKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlCisJCWMtPmluX3F1ZXVlID0gYy0+YmFzZTsKKworCWMtPmlycV9tYXNrID0gYy0+YmFzZS52aXJ0ICsgMHgzNDsKKwljLT5wb3N0X3BvcnQgPSBjLT5iYXNlLnZpcnQgKyAweDQwOworCWMtPnJlcGx5X3BvcnQgPSBjLT5iYXNlLnZpcnQgKyAweDQ0OworCisjaWZkZWYgQ09ORklHX01UUlIKKwkvKiBFbmFibGUgV3JpdGUgQ29tYmluaW5nIE1UUlIgZm9yIElPUCdzIG1lbW9yeSByZWdpb24gKi8KKwljLT5tdHJyX3JlZzAgPSBtdHJyX2FkZChjLT5pbl9xdWV1ZS5waHlzLCBjLT5pbl9xdWV1ZS5sZW4sCisJCQkJTVRSUl9UWVBFX1dSQ09NQiwgMSk7CisJYy0+bXRycl9yZWcxID0gLTE7CisKKwlpZiAoYy0+bXRycl9yZWcwIDwgMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBlbmFibGUgd3JpdGUgY29tYmluaW5nICIKKwkJICAgICAgICJNVFJSXG4iLCBjLT5uYW1lKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1c2luZyB3cml0ZSBjb21iaW5pbmcgTVRSUlxuIiwgYy0+bmFtZSk7CisKKwkvKgorCSAqIElmIGl0IGlzIGFuIElOVEVMIGk5NjAgSS9PIHByb2Nlc3NvciB0aGVuIHNldCB0aGUgZmlyc3QgNjRLIHRvCisJICogVW5jYWNoZWFibGUgc2luY2UgdGhlIHJlZ2lvbiBjb250YWlucyB0aGUgbWVzc2FnaW5nIHVuaXQgd2hpY2gKKwkgKiBzaG91bGRuJ3QgYmUgY2FjaGVkLgorCSAqLworCWlmICgocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfSU5URUwgfHwKKwkgICAgIHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RQVCkgJiYgIWMtPnJhcHRvcikgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogTVRSUiB3b3JrYXJvdW5kIGZvciBJbnRlbCBpOTYwIHByb2Nlc3NvciIKKwkJICAgICAgICJcbiIsIGMtPm5hbWUpOworCQljLT5tdHJyX3JlZzEgPSBtdHJyX2FkZChjLT5iYXNlLnBoeXMsIDB4MTAwMDAsCisJCQkJCU1UUlJfVFlQRV9VTkNBQ0hBQkxFLCAxKTsKKworCQlpZiAoYy0+bXRycl9yZWcxIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IEVycm9yIGluIHNldHRpbmcgIgorCQkJICAgICAgICJNVFJSX1RZUEVfVU5DQUNIQUJMRVxuIiwgYy0+bmFtZSk7CisJCQltdHJyX2RlbChjLT5tdHJyX3JlZzAsIGMtPmluX3F1ZXVlLnBoeXMsCisJCQkJIGMtPmluX3F1ZXVlLmxlbik7CisJCQljLT5tdHJyX3JlZzAgPSAtMTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+c3RhdHVzLCA4LCBHRlBfS0VSTkVMKSkgeworCQlpMm9fcGNpX2ZyZWUoYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChpMm9fZG1hX2FsbG9jKGRldiwgJmMtPmhydCwgc2l6ZW9mKGkyb19ocnQpLCBHRlBfS0VSTkVMKSkgeworCQlpMm9fcGNpX2ZyZWUoYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChpMm9fZG1hX2FsbG9jKGRldiwgJmMtPmRsY3QsIDgxOTIsIEdGUF9LRVJORUwpKSB7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+c3RhdHVzX2Jsb2NrLCBzaXplb2YoaTJvX3N0YXR1c19ibG9jayksCisJCQkgIEdGUF9LRVJORUwpKSB7CisJCWkyb19wY2lfZnJlZShjKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaWYgKGkyb19kbWFfYWxsb2MoZGV2LCAmYy0+b3V0X3F1ZXVlLCBNU0dfUE9PTF9TSVpFLCBHRlBfS0VSTkVMKSkgeworCQlpMm9fcGNpX2ZyZWUoYyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBjKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCWkyb19wY2lfaW50ZXJydXB0IC0gSW50ZXJydXB0IGhhbmRsZXIgZm9yIEkyTyBjb250cm9sbGVyCisgKglAaXJxOiBpbnRlcnJ1cHQgbGluZQorICoJQGRldl9pZDogcG9pbnRlciB0byB0aGUgSTJPIGNvbnRyb2xsZXIKKyAqCUByOiBwb2ludGVyIHRvIHJlZ2lzdGVycworICoKKyAqCUhhbmRsZSBhbiBpbnRlcnJ1cHQgZnJvbSBhIFBDSSBiYXNlZCBJMk8gY29udHJvbGxlci4gVGhpcyB0dXJucyBvdXQKKyAqCXRvIGJlIHJhdGhlciBzaW1wbGUuIFdlIGtlZXAgdGhlIGNvbnRyb2xsZXIgcG9pbnRlciBpbiB0aGUgY29va2llLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgaTJvX3BjaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcikKK3sKKwlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmMgPSBkZXZfaWQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmMtPnBkZXYtPmRldjsKKwlzdHJ1Y3QgaTJvX21lc3NhZ2UgKm07CisJdTMyIG12OworCisJLyoKKwkgKiBPbGQgOTYwIHN0ZXBwaW5ncyBoYWQgYSBidWcgaW4gdGhlIEkyTyB1bml0IHRoYXQgY2F1c2VkCisJICogdGhlIHF1ZXVlIHRvIGFwcGVhciBlbXB0eSB3aGVuIGl0IHdhc24ndC4KKwkgKi8KKwltdiA9IEkyT19SRVBMWV9SRUFEMzIoYyk7CisJaWYgKG12ID09IEkyT19RVUVVRV9FTVBUWSkgeworCQltdiA9IEkyT19SRVBMWV9SRUFEMzIoYyk7CisJCWlmICh1bmxpa2VseShtdiA9PSBJMk9fUVVFVUVfRU1QVFkpKSB7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0gZWxzZQorCQkJcHJfZGVidWcoIiVzOiA5NjAgYnVnIGRldGVjdGVkXG4iLCBjLT5uYW1lKTsKKwl9CisKKwl3aGlsZSAobXYgIT0gSTJPX1FVRVVFX0VNUFRZKSB7CisJCS8qCisJCSAqIE1hcCB0aGUgbWVzc2FnZSBmcm9tIHRoZSBwYWdlIGZyYW1lIG1hcCB0byBrZXJuZWwgdmlydHVhbC4KKwkJICogQmVjYXVzZSBidXNfdG9fdmlydCBpcyBkZXByZWNhdGVkLCB3ZSBoYXZlIGNhbGN1bGF0ZSB0aGUKKwkJICogbG9jYXRpb24gYnkgb3Vyc2VsZiEKKwkJICovCisJCW0gPSBpMm9fbXNnX291dF90b192aXJ0KGMsIG12KTsKKworCQkvKgorCQkgKiAgICAgIEVuc3VyZSB0aGlzIG1lc3NhZ2UgaXMgc2VlbiBjb2hlcmVudGx5IGJ1dCBjYWNoYWJseSBieQorCQkgKiAgICAgIHRoZSBwcm9jZXNzb3IKKwkJICovCisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRldiwgbXYsIE1TR19GUkFNRV9TSVpFICogNCwKKwkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQkvKiBkaXNwYXRjaCBpdCAqLworCQlpZiAoaTJvX2RyaXZlcl9kaXNwYXRjaChjLCBtdiwgbSkpCisJCQkvKiBmbHVzaCBpdCBpZiByZXN1bHQgIT0gMCAqLworCQkJaTJvX2ZsdXNoX3JlcGx5KGMsIG12KTsKKworCQkvKgorCQkgKiBUaGF0IDk2MCBidWcgYWdhaW4uLi4KKwkJICovCisJCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKKwkJaWYgKG12ID09IEkyT19RVUVVRV9FTVBUWSkKKwkJCW12ID0gSTJPX1JFUExZX1JFQUQzMihjKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqCWkyb19wY2lfaXJxX2VuYWJsZSAtIEFsbG9jYXRlIGludGVycnVwdCBmb3IgSTJPIGNvbnRyb2xsZXIKKyAqCisgKglBbGxvY2F0ZSBhbiBpbnRlcnJ1cHQgZm9yIHRoZSBJMk8gY29udHJvbGxlciwgYW5kIGFjdGl2YXRlIGludGVycnVwdHMKKyAqCW9uIHRoZSBJMk8gY29udHJvbGxlci4KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgaTJvX3BjaV9pcnFfZW5hYmxlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGMtPnBkZXY7CisJaW50IHJjOworCisJSTJPX0lSUV9XUklURTMyKGMsIDB4ZmZmZmZmZmYpOworCisJaWYgKHBkZXYtPmlycSkgeworCQlyYyA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaTJvX3BjaV9pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJCSBjLT5uYW1lLCBjKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGFsbG9jYXRlIGludGVycnVwdCAlZC4iCisJCQkgICAgICAgIlxuIiwgYy0+bmFtZSwgcGRldi0+aXJxKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCUkyT19JUlFfV1JJVEUzMihjLCAweDAwMDAwMDAwKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnN0YWxsZWQgYXQgSVJRICVkXG4iLCBjLT5uYW1lLCBwZGV2LT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJaTJvX3BjaV9pcnFfZGlzYWJsZSAtIEZyZWUgaW50ZXJydXB0IGZvciBJMk8gY29udHJvbGxlcgorICoJQGM6IEkyTyBjb250cm9sbGVyCisgKgorICoJRGlzYWJsZSBpbnRlcnJ1cHRzIGluIEkyTyBjb250cm9sbGVyIGFuZCB0aGVuIGZyZWUgaW50ZXJydXB0LgorICovCitzdGF0aWMgdm9pZCBpMm9fcGNpX2lycV9kaXNhYmxlKHN0cnVjdCBpMm9fY29udHJvbGxlciAqYykKK3sKKwlJMk9fSVJRX1dSSVRFMzIoYywgMHhmZmZmZmZmZik7CisKKwlpZiAoYy0+cGRldi0+aXJxID4gMCkKKwkJZnJlZV9pcnEoYy0+cGRldi0+aXJxLCBjKTsKK30KKworLyoqCisgKglpMm9fcGNpX3Byb2JlIC0gUHJvYmUgdGhlIFBDSSBkZXZpY2UgZm9yIGFuIEkyTyBjb250cm9sbGVyCisgKglAZGV2OiBQQ0kgZGV2aWNlIHRvIHRlc3QKKyAqCUBpZDogaWQgd2hpY2ggbWF0Y2hlZCB3aXRoIHRoZSBQQ0kgZGV2aWNlIGlkIHRhYmxlCisgKgorICoJUHJvYmUgdGhlIFBDSSBkZXZpY2UgZm9yIGFueSBkZXZpY2Ugd2hpY2ggaXMgYSBtZW1vcnkgb2YgdGhlCisgKglJbnRlbGxpZ2VudCwgSTJPIGNsYXNzIG9yIGFuIEFkYXB0ZWMgWmVybyBDaGFubmVsIENvbnRyb2xsZXIuIFdlCisgKglhdHRlbXB0IHRvIHNldCB1cCBlYWNoIHN1Y2ggZGV2aWNlIGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSBjb3JlLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgaTJvX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGkyb19jb250cm9sbGVyICpjOworCWludCByYzsKKworCXByaW50ayhLRVJOX0lORk8gImkybzogQ2hlY2tpbmcgZm9yIFBDSSBJMk8gY29udHJvbGxlcnMuLi5cbiIpOworCisJaWYgKChwZGV2LT5jbGFzcyAmIDB4ZmYpID4gMSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IEkyTyBjb250cm9sbGVyIGZvdW5kIGJ1dCBkb2VzIG5vdCAiCisJCSAgICAgICAic3VwcG9ydCBJMk8gMS41IChza2lwcGluZykuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKChyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IEkyTyBjb250cm9sbGVyIGZvdW5kIGJ1dCBjb3VsZCBub3QgYmUiCisJCSAgICAgICAiIGVuYWJsZWQuXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXByaW50ayhLRVJOX0lORk8gImkybzogSTJPIGNvbnRyb2xsZXIgZm91bmQgb24gYnVzICVkIGF0ICVkLlxuIiwKKwkgICAgICAgcGRldi0+YnVzLT5udW1iZXIsIHBkZXYtPmRldmZuKTsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpMm86IEkyTyBjb250cm9sbGVyIG9uIGJ1cyAlZCBhdCAlZDogTm8gIgorCQkgICAgICAgInN1aXRhYmxlIERNQSBhdmFpbGFibGUhXG4iLCBwZGV2LT5idXMtPm51bWJlciwKKwkJICAgICAgIHBkZXYtPmRldmZuKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGRpc2FibGU7CisJfQorCisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwljID0gaTJvX2lvcF9hbGxvYygpOworCWlmIChJU19FUlIoYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMm86IG1lbW9yeSBmb3IgSTJPIGNvbnRyb2xsZXIgY291bGQgbm90IGJlICIKKwkJICAgICAgICJhbGxvY2F0ZWRcbiIpOworCQlyYyA9IFBUUl9FUlIoYyk7CisJCWdvdG8gZGlzYWJsZTsKKwl9CisKKwljLT5wZGV2ID0gcGRldjsKKwljLT5kZXZpY2UgPSBwZGV2LT5kZXY7CisKKwkvKiBDYXJkcyB0aGF0IGZhbGwgYXBhcnQgaWYgeW91IGhpdCB0aGVtIHdpdGggbGFyZ2UgSS9PIGxvYWRzLi4uICovCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX05DUiAmJiBwZGV2LT5kZXZpY2UgPT0gMHgwNjMwKSB7CisJCWMtPnNob3J0X3JlcSA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBTeW1iaW9zIEZDOTIwIHdvcmthcm91bmRzIGFjdGl2YXRlZC5cbiIsCisJCSAgICAgICBjLT5uYW1lKTsKKwl9CisKKwlpZiAocGRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1BST01JU0UpIHsKKwkJYy0+cHJvbWlzZSA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBQcm9taXNlIHdvcmthcm91bmRzIGFjdGl2YXRlZC5cbiIsCisJCSAgICAgICBjLT5uYW1lKTsKKwl9CisKKwkvKiBDYXJkcyB0aGF0IGdvIGJhbmFuYXMgaWYgeW91IHF1aWVzY2UgdGhlbSBiZWZvcmUgeW91IHJlc2V0IHRoZW0uICovCisJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0RQVCkgeworCQljLT5ub19xdWllc2NlID0gMTsKKwkJaWYgKHBkZXYtPmRldmljZSA9PSAweGE1MTEpCisJCQljLT5yYXB0b3IgPSAxOworCX0KKworCWlmICgocmMgPSBpMm9fcGNpX2FsbG9jKGMpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUEgLyBJTyBhbGxvY2F0aW9uIGZvciBJMk8gY29udHJvbGxlciAiCisJCSAgICAgICAiIGZhaWxlZFxuIiwgYy0+bmFtZSk7CisJCWdvdG8gZnJlZV9jb250cm9sbGVyOworCX0KKworCWlmIChpMm9fcGNpX2lycV9lbmFibGUoYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5hYmxlIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIGZvciBJMk8gIgorCQkgICAgICAgImNvbnRyb2xsZXJcbiIsIGMtPm5hbWUpOworCQlnb3RvIGZyZWVfcGNpOworCX0KKworCWlmICgocmMgPSBpMm9faW9wX2FkZChjKSkpCisJCWdvdG8gdW5pbnN0YWxsOworCisJcmV0dXJuIDA7CisKKyAgICAgIHVuaW5zdGFsbDoKKwlpMm9fcGNpX2lycV9kaXNhYmxlKGMpOworCisgICAgICBmcmVlX3BjaToKKwlpMm9fcGNpX2ZyZWUoYyk7CisKKyAgICAgIGZyZWVfY29udHJvbGxlcjoKKwlpMm9faW9wX2ZyZWUoYyk7CisKKyAgICAgIGRpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWkyb19wY2lfcmVtb3ZlIC0gUmVtb3ZlcyBhIEkyTyBjb250cm9sbGVyIGZyb20gdGhlIHN5c3RlbQorICoJcGRldjogSTJPIGNvbnRyb2xsZXIgd2hpY2ggc2hvdWxkIGJlIHJlbW92ZWQKKyAqCisgKglSZXNldCB0aGUgSTJPIGNvbnRyb2xsZXIsIGRpc2FibGUgaW50ZXJydXB0cyBhbmQgcmVtb3ZlIGFsbCBhbGxvY2F0ZWQKKyAqCXJlc291cmNlcy4KKyAqLworc3RhdGljIHZvaWQgX19kZXZleGl0IGkyb19wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKKwljID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaTJvX2lvcF9yZW1vdmUoYyk7CisJaTJvX3BjaV9pcnFfZGlzYWJsZShjKTsKKwlpMm9fcGNpX2ZyZWUoYyk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogQ29udHJvbGxlciByZW1vdmVkLlxuIiwgYy0+bmFtZSk7CisKKwlpMm9faW9wX2ZyZWUoYyk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfTsKKworLyogUENJIGRyaXZlciBmb3IgSTJPIGNvbnRyb2xsZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpMm9fcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9ICJJMk8gY29udHJvbGxlciIsCisJLmlkX3RhYmxlID0gaTJvX3BjaV9pZHMsCisJLnByb2JlID0gaTJvX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoaTJvX3BjaV9yZW1vdmUpLAorfTsKKworLyoqCisgKglpMm9fcGNpX2luaXQgLSByZWdpc3RlcnMgSTJPIFBDSSBkcml2ZXIgaW4gUENJIHN1YnN5c3RlbQorICoKKyAqCVJldHVybnMgPiAwIG9uIHN1Y2Nlc3Mgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgX19pbml0IGkyb19wY2lfaW5pdCh2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpMm9fcGNpX2RyaXZlcik7Cit9OworCisvKioKKyAqCWkyb19wY2lfZXhpdCAtIHVucmVnaXN0ZXJzIEkyTyBQQ0kgZHJpdmVyIGZyb20gUENJIHN1YnN5c3RlbQorICovCit2b2lkIF9fZXhpdCBpMm9fcGNpX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmkyb19wY2lfZHJpdmVyKTsKK307CisKK0VYUE9SVF9TWU1CT0woaTJvX2RtYV9yZWFsbG9jKTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpMm9fcGNpX2lkcyk7Cg==